+ {{#if editable}}
+ {{#if (not collaborative)}}
+
+ {{ rc-i18n "RipCrypt.Apps.RichEditor-no-collaborative" }}
+
+ {{/if}}
+
+ {{{ enriched }}}
+
+ {{else}}
+ {{{ enriched }}}
+ {{/if}}
+
diff --git a/templates/Apps/RichEditor/style.css b/templates/Apps/RichEditor/style.css
new file mode 100644
index 0000000..70f6270
--- /dev/null
+++ b/templates/Apps/RichEditor/style.css
@@ -0,0 +1,19 @@
+.ripcrypt--RichEditor {
+ width: 500px;
+ height: 600px;
+
+ > .window-content {
+ padding: 4px;
+ background: var(--base-background);
+ height: 100%;
+ }
+
+ prose-mirror {
+ height: 100%;
+
+ .editor-content {
+ color: var(--input-text);
+ background: var(--input-background);
+ }
+ }
+}
diff --git a/templates/Apps/SkillsCardV1/content.hbs b/templates/Apps/SkillsCardV1/content.hbs
new file mode 100644
index 0000000..2f170d2
--- /dev/null
+++ b/templates/Apps/SkillsCardV1/content.hbs
@@ -0,0 +1,202 @@
+
+
+
+ {{#each skills.grit as | skill |}}
+ {{#if skill}}
+ -
+ {{ skill.name }}
+
+
+ {{else}}
+
+ {{/if}}
+ {{/each}}
+
+
+
+
+ {{#each skills.gait as | skill |}}
+ {{#if skill}}
+ -
+ {{ skill.name }}
+
+
+ {{else}}
+
+ {{/if}}
+ {{/each}}
+
+
+
+
+ {{#each skills.grip as | skill |}}
+ {{#if skill}}
+ -
+ {{ skill.name }}
+
+
+ {{else}}
+
+ {{/if}}
+ {{/each}}
+
+
+
+
+ {{#each skills.glim as | skill |}}
+ {{#if skill}}
+ -
+ {{ skill.name }}
+
+
+ {{else}}
+
+ {{/if}}
+ {{/each}}
+
+
+
+
+ {{#each gear as | itemInSlot |}}
+ -
+ {{itemInSlot.name}}
+
+ {{/each}}
+
+
+ {{!-- * Currencies --}}
+
+
+ {{!-- * Ammo Summary & Stars --}}
+
+
+ {{!-- * Aura Size --}}
+ {{#if aura}}
+
+
{{rc-i18n "RipCrypt.common.aura"}}
+
+ {{aura.normal}}
+
+ {{aura.heavy}}
+
+
+ {{/if}}
+
diff --git a/templates/Apps/SkillsCardV1/style.css b/templates/Apps/SkillsCardV1/style.css
new file mode 100644
index 0000000..a25718b
--- /dev/null
+++ b/templates/Apps/SkillsCardV1/style.css
@@ -0,0 +1,182 @@
+.ripcrypt .SkillsCardV1 {
+
+ /* Foundry Variable Tweaks */
+ --input-height: 1rem;
+ --col-gap: 8px;
+
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ grid-template-rows: repeat(14, minmax(0, 1fr));
+ column-gap: var(--col-gap);
+ row-gap: var(--row-gap);
+
+ background: var(--base-background);
+ color: var(--base-text);
+
+ .col-header {
+ background: var(--section-header-background);
+ color: var(--section-header-text);
+ }
+ .row-alt {
+ background: var(--alt-row-background);
+ color: var(--alt-row-text);
+ }
+
+ label, .label {
+ box-sizing: border-box;
+ padding: 2px 4px;
+ text-transform: uppercase;
+ font-size: var(--font-size-14);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ font-weight: bold;
+ }
+
+ .list-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ border-radius: 999px;
+ }
+ .skill-list {
+ display: grid;
+ grid-template-rows: subgrid;
+
+ & > li {
+ padding: 0 4px;
+ .name {
+ flex-grow: 1;
+ }
+ }
+
+ &.even > :nth-child(even),
+ &.odd > :nth-child(odd) {
+ background: var(--alt-row-background);
+ color: var(--alt-row-text);
+ }
+ }
+
+ .grit-skills {
+ grid-column: 1 / span 1;
+ grid-row: 2 / span 4;
+ }
+
+ .gait-skills {
+ grid-column: 2 / span 1;
+ grid-row: 2 / span 4;
+ }
+
+ .grip-skills-header {
+ grid-column: 1 / span 1;
+ grid-row: 7 / span 1;
+ }
+ .grip-skills {
+ grid-column: 1 / span 1;
+ grid-row: 8 / span 4;
+ }
+
+ .glim-skills-header {
+ grid-column: 2 / span 1;
+ grid-row: 7 / span 1;
+ }
+ .glim-skills {
+ grid-column: 2 / span 1;
+ grid-row: 8 / span 4;
+ }
+
+ .gear-list {
+ grid-row: span 12;
+ display: grid;
+ grid-template-rows: subgrid;
+ list-style-type: none;
+
+ > li {
+ padding: 0 4px;
+ }
+
+ > :nth-child(even) {
+ background: var(--alt-row-background);
+ color: var(--alt-row-text);
+ }
+ }
+
+ .ammo-list {
+ grid-column: 1 / span 2;
+ grid-row: 13 / span 2;
+ display: grid;
+ grid-template-columns: subgrid;
+ grid-template-rows: subgrid;
+ list-style-type: none;
+ padding: 0;
+ }
+
+ .currencies {
+ grid-column: 1 / span 2;
+ grid-row: 12 / span 1;
+ display: grid;
+ column-gap: var(--col-gap);
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ }
+
+ .aura-size {
+ grid-column: 3;
+ grid-row: 14;
+ }
+
+ .pill {
+ display: grid;
+ grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr);
+ align-items: center;
+ background: var(--section-header-background);
+ border-radius: 999px;
+ color: var(--section-header-text);
+ padding: 2px 0 2px 4px;
+ --input-background: var(--base-background);
+ --input-text: var(--base-text);
+
+ &.with-icon {
+ grid-template-columns: min-content minmax(0, 1.5fr) minmax(0, 1fr);
+ gap: 4px;
+ }
+
+ label, .label {
+ padding: 0;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+
+ input, .input {
+ margin: 0 2px 0 0;
+ border-radius: 999px;
+ text-align: center;
+ }
+ }
+
+ .dual-pill {
+ border-radius: 999px;
+ background: var(--accent-1);
+ display: grid;
+ grid-template-columns: 2fr 1fr;
+ gap: 0.25rem;
+ align-items: center;
+ padding-left: 8px;
+
+ .values {
+ border-radius: 999px;
+ margin: 2px;
+ background: var(--base-background);
+ color: var(--base-text);
+ padding: 0.125rem 0.5rem;
+ display: flex;
+ flex-direction: row;
+ justify-content: space-evenly;
+ gap: 0.5rem;
+ --slash-color: var(--accent-1);
+ }
+
+ .value {
+ flex-grow: 1;
+ text-align: center;
+ }
+ }
+}
diff --git a/templates/Apps/StatsCardV1/content.hbs b/templates/Apps/StatsCardV1/content.hbs
new file mode 100644
index 0000000..99e3c74
--- /dev/null
+++ b/templates/Apps/StatsCardV1/content.hbs
@@ -0,0 +1,368 @@
+
+ {{!-- * Header --}}
+
+
+
+ {{!-- * Armour --}}
+
+
+
+ {{#if (eq actor.type "hero")}}
+
+ {{else}}
+
+ {{/if}}
+ {{#each armours as | slot |}}
+
+
+
+ {{ slot.defense }}
+
+ {{#if slot.shielded}}
+
+ {{/if}}
+
+
{{ rc-i18n (concat "RipCrypt.common.anatomy." @key) }}
+
+ {{/each}}
+
+
+ -
+ {{ rc-i18n "RipCrypt.common.anatomy.head" }}
+ {{ armours.head.name }}
+
+ -
+ {{ rc-i18n "RipCrypt.common.anatomy.body" }}
+ {{ armours.body.name }}
+
+ -
+ {{ rc-i18n "RipCrypt.common.anatomy.arms" }}
+ {{ armours.arms.name }}
+
+ -
+ {{ rc-i18n "RipCrypt.common.anatomy.legs" }}
+ {{ armours.legs.name }}
+
+ -
+ {{ rc-i18n "RipCrypt.common.shield" }}
+ {{ shield.name }}
+
+
+
+
+ {{!-- * Fate & Advancement --}}
+
+
+
+
+ {{#if meta.editable}}
+
+
+ {{else}}
+
+
+ {{ level.glory }}
+
+ {{/if}}
+ {{#if meta.editable}}
+
+
+ {{else}}
+
+
+ {{ level.step }}
+
+ {{/if}}
+
+ <{{{ifThen meta.editable "label" "div"}}}
+ id="{{meta.idp}}-rank-label"
+ for="{{meta.idp}}-rank"
+ class="rank-label label col-header right-pill"
+ >
+ {{ rc-i18n "RipCrypt.common.rank" }}
+ {{{ifThen meta.editable "label" "div"}}}>
+ {{#if meta.editable}}
+
+ {{else}}
+
+ {{ level.rank.selected }}
+
+ {{/if}}
+
+ {{!-- * Weapons --}}
+
+
+
+
+
+
+
+
+
+
+ {{#each weapons as | slot |}}
+ {{#if slot.empty}}
+
+ | {{ rc-i18n "RipCrypt.common.empty" }} |
+ |
+ |
+ |
+
+ {{else}}
+
+ |
+ {{!-- ? NOTE: Disabled for now to see what user feedback spawns
+ --}}
+
+ {{ slot.data.quantifiedName }}
+
+ |
+
+ {{#if slot.data.system.traitString}}
+ {{ slot.data.system.traitString }}
+ {{/if}}
+ {{#if slot.data.system.rangeString}}
+ {{ slot.data.system.rangeString }}
+ {{/if}}
+ |
+
+ {{ slot.data.system.wear.value }} / {{ slot.data.system.wear.max }}
+ |
+
+ {{ slot.data.system.damage }}
+ |
+
+ {{/if}}
+ {{/each}}
+
+
+
+ {{!-- * Abilities --}}
+
+ {{!-- Actual Abilities --}}
+ {{#each abilities as | ability |}}
+
+
+ {{#unless ability.readonly}}
+
+ {{else}}
+ {{ability.value}}
+ {{/unless}}
+ {{#if @root.meta.editable}}
+
+ {{/if}}
+
+ {{#unless ability.readonly}}
+
+ {{else}}
+
+ {{/unless}}
+
+ {{/each}}
+
+ {{!-- Health --}}
+
+
+ {{#if meta.editable}}
+
+ {{else}}
+
+ {{ guts.value }}
+
+ {{/if}}
+
+ {{ guts.max }}
+
+
+ {{#if meta.editable}}
+
+ {{else}}
+
+ {{/if}}
+
+
+ {{!-- Move & Run --}}
+
+
+ {{speed.move}}
+ {{speed.run}}
+
+
+
+
+
+ {{!-- * Equipment --}}
+
diff --git a/templates/Apps/StatsCardV1/style.css b/templates/Apps/StatsCardV1/style.css
new file mode 100644
index 0000000..e33246e
--- /dev/null
+++ b/templates/Apps/StatsCardV1/style.css
@@ -0,0 +1,274 @@
+.ripcrypt .StatsCardV1 {
+
+ /* Foundry Variable Tweaks */
+ --input-height: 1rem;
+
+ display: grid;
+ grid-template-columns: minmax(0, 3fr) minmax(0, 2fr) minmax(0, 2fr) minmax(0, 1.25fr) minmax(0, 2.5fr);
+ grid-template-rows: repeat(15, minmax(0, 1fr));
+ column-gap: var(--col-gap);
+
+ background: var(--base-background);
+ color: var(--base-text);
+
+ .col-header {
+ background: var(--section-header-background);
+ color: var(--section-header-text);
+ }
+ .row-alt {
+ background: var(--alt-row-background);
+ color: var(--alt-row-text);
+ }
+
+ label, .label {
+ box-sizing: border-box;
+ padding: 2px 4px;
+ text-transform: uppercase;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ font-weight: bold;
+ }
+
+ .header {
+ grid-row: span 2;
+ grid-column: span 1;
+ display: grid;
+ grid-template-rows: subgrid;
+ grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
+
+ .image {
+ grid-row: span 2;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+ }
+
+ .hero_name {
+ grid-column: span 3;
+ margin-left: calc(var(--col-gap) * -1);
+ padding-left: var(--col-gap);
+ }
+
+ .glory-label {
+ grid-column: 2 / span 1;
+ grid-row: 4 / span 1;
+ }
+ .glory {
+ grid-column: 2 / span 1;
+ grid-row: 5 / span 1;
+ }
+
+ .step-label {
+ grid-column: 3 / span 1;
+ grid-row: 4 / span 1;
+ }
+ .step {
+ grid-column: 3 / span 1;
+ grid-row: 5 / span 1;
+ }
+
+ .rank-label {
+ grid-column: 4 / span 1;
+ grid-row: 4 / span 1;
+ }
+ .rank {
+ grid-column: 4 / span 1;
+ grid-row: 5 / span 1;
+ }
+
+ .fate {
+ grid-column: 1 / span 1;
+ grid-row: 4 / span 2;
+ display: grid;
+ grid-template-rows: subgrid;
+ }
+ .fate-value {
+ padding-left: 2px;
+ }
+
+ .weapons {
+ grid-column: 1 / span 4;
+ grid-row: 7 / span 5;
+ display: grid;
+ grid-template-columns: subgrid;
+ grid-template-rows: subgrid;
+
+ thead,
+ tbody,
+ tr {
+ display: contents;
+ }
+ td {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: 4px;
+ }
+ .row-alt > * {
+ background: inherit;
+ }
+ }
+
+ .abilities {
+ grid-column: 1 / span 4;
+ grid-row: 12 / span 4;
+ display: grid;
+ /* grid-template-rows: minmax(0, 3fr) minmax(0, 1fr); */
+ grid-template-columns: repeat(6, minmax(0, 1fr));
+
+ }
+
+ .ability {
+ display: grid;
+ grid-template-rows: minmax(0, 3fr) minmax(0, 1fr);
+ justify-items: center;
+ align-items: center;
+ position: relative;
+
+ label, .label {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+ }
+
+ .compass {
+ --size: 45px;
+ width: var(--size);
+ height: var(--size);
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ border: 2px solid var(--accent-1);
+ border-radius: 50%;
+ font-size: 1.5rem;
+ position: relative;
+ background: var(--base-background);
+
+ > .value {
+ background: none;
+ width: 70%;
+ text-align: center;
+ padding: 0;
+ }
+
+ > .roll {
+ --distance: -15%;
+ position: absolute;
+ top: var(--distance);
+ right: var(--distance);
+ z-index: 2;
+ }
+
+ &.small {
+ --size: 35px;
+ font-size: 1.1rem;
+ }
+
+ &.dual {
+ font-size: var(--font-size-14);
+ --distance-from-edge: 4px;
+
+ &::after {
+ display: block;
+ content: "";
+ width: 69%;
+ height: 2px;
+ background: var(--accent-1);
+ transform: rotate(-45deg);
+ }
+
+ > .value,
+ > .max {
+ width: 50%;
+ position: absolute;
+ text-align: center;
+ /* border-bottom: none; */
+ }
+
+ > .value {
+ top: var(--distance-from-edge);
+ left: var(--distance-from-edge);
+ clip-path: polygon(100% 0, 100% 60%, 60% 100%, 0 100%, 0 0);
+ }
+ > .max {
+ bottom: var(--distance-from-edge);
+ right: var(--distance-from-edge);
+ }
+ }
+ }
+
+ .armour {
+ grid-column: -2 / span 1;
+ grid-row: 1 / -1;
+ display: grid;
+ grid-template-rows: subgrid;
+
+ .section-header {
+ text-align: right;
+ }
+
+ .person {
+ grid-row: 2 / span 9;
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ grid-template-rows: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1.2fr);
+ justify-items: center;
+ align-items: center;
+ position: relative;
+
+ > div {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ z-index: 1;
+ }
+
+ > rc-svg {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 58%;
+ }
+ }
+
+ /* Positioning */
+ .head, .body, .legs { grid-column: 1; }
+ .arms { grid-column: 2; }
+ .head { grid-row: 1; }
+ .body, .arms { grid-row: 2; }
+ .legs { grid-row: 3; }
+
+ .shield {
+ --distance: -7px;
+ position: absolute;
+ top: var(--distance);
+ right: var(--distance);
+ }
+
+ .armour-items {
+ display: contents;
+
+ > li {
+ display: flex;
+ flex-direction: row-reverse;
+ justify-content: space-between;
+ align-items: center;
+ flex-wrap: nowrap;
+ padding: 0 4px;
+ gap: 4px;
+ min-width: 0;
+ }
+
+ .label {
+ text-overflow: initial;
+ flex-shrink: 0;
+ }
+ }
+ }
+}
diff --git a/templates/Apps/apps.css b/templates/Apps/apps.css
new file mode 100644
index 0000000..30af300
--- /dev/null
+++ b/templates/Apps/apps.css
@@ -0,0 +1,29 @@
+@import url("./AllItemSheetV1/style.css");
+@import url("./CombinedHeroSheet/style.css");
+@import url("./DelveDiceHUD/style.css");
+@import url("./DicePool/style.css");
+@import url("./CraftCardV1/style.css");
+@import url("./StatsCardV1/style.css");
+@import url("./SkillsCardV1/style.css");
+@import url("./RichEditor/style.css");
+
+@import url("./popover.css");
+@import url("./popovers/AmmoTracker/style.css");
+
+.ripcrypt {
+ .window-content {
+ flex: initial;
+ padding: 0;
+ margin: 0;
+ }
+
+ .StatsCardV1,
+ .SkillsCardV1,
+ .CraftCardV1 {
+ padding: 8px;
+ /* height: 270px; */
+ width: 680px;
+ --col-gap: 2px;
+ --row-gap: 4px;
+ }
+}
diff --git a/templates/Apps/popover.css b/templates/Apps/popover.css
new file mode 100644
index 0000000..73cfe4a
--- /dev/null
+++ b/templates/Apps/popover.css
@@ -0,0 +1,17 @@
+.ripcrypt.popover {
+ box-sizing: border-box;
+
+ &.frameless {
+ border-width: 2px;
+ border-style: solid;
+ border-color: transparent;
+ border-radius: 4px;
+ position: absolute;
+ z-index: calc(var(--z-index-tooltip) - 5);
+ transform-origin: top left;
+
+ &.locked {
+ border-color: var(--accent-3);
+ }
+ }
+}
diff --git a/templates/Apps/popovers/AmmoTracker/ammoList.hbs b/templates/Apps/popovers/AmmoTracker/ammoList.hbs
new file mode 100644
index 0000000..de799b2
--- /dev/null
+++ b/templates/Apps/popovers/AmmoTracker/ammoList.hbs
@@ -0,0 +1,52 @@
+