diff --git a/Esper_Genesis_5E/EG Sheet Roll20.png b/Esper_Genesis_5E/EG Sheet Roll20.png
index 955a5622e3..f51b3f50ff 100644
Binary files a/Esper_Genesis_5E/EG Sheet Roll20.png and b/Esper_Genesis_5E/EG Sheet Roll20.png differ
diff --git a/Esper_Genesis_5E/EG_Sheet.css b/Esper_Genesis_5E/EG_Sheet.css
index 3a49f6c43c..8df809c807 100644
--- a/Esper_Genesis_5E/EG_Sheet.css
+++ b/Esper_Genesis_5E/EG_Sheet.css
@@ -1,4 +1,8 @@
+@import url('https://fonts.googleapis.com/css2?family=Oxanium:wght@400;700&family=Noto+Sans:wght@400;700&display=swap');
+@import url('https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&icon_names=arrow_upload_ready,expand_more,settings,star_shine');
+
/* Esper Genesis Character Sheet */
+
.sheet-pc, .sheet-npc {
display: none;
}
@@ -8,7 +12,7 @@
}
.sheet-container {
- width: 750px;
+ width: 860px;
background-color: white;
position: relative;
}
@@ -16,24 +20,34 @@
input[type=radio].sheet-tab-button {
opacity: 0;
position: absolute;
- top: 92px;
+ top: 290px;
right: 0px;
width: 18px;
height: 18px;
z-index: 2;
}
+/* All page/type tab inputs — hidden; CSS ~ combinator still reaches sibling elements */
+input[type=radio].sheet-tab-button.sheet-core,
+input[type=radio].sheet-tab-button.sheet-bio,
+input[type=radio].sheet-tab-button.sheet-spells,
+input[type=radio].sheet-tab-button.sheet-type-pc,
+input[type=radio].sheet-tab-button.sheet-type-starship {
+ display: none;
+}
input[type=radio].sheet-tab-button + span {
position: absolute;
- top: 92px;
+ top: 290px;
right: 0px;
width: 17px;
- height: 17px;
+ height: 18px;
border: 1px solid black;
border-radius: 5px;
background-color: #E8E8E8;
color: black;
text-align: center;
font-weight: bold;
+ font-family: 'Noto Sans', sans-serif;
+ padding: 0.5px;
}
input[type=radio].sheet-npc-button {
opacity: 0;
@@ -49,97 +63,62 @@ input[type=radio].sheet-npc-button + span {
top: 5px;
right: 0px;
width: 17px;
- height: 17px;
+ height: 18px;
border: 1px solid black;
border-radius: 5px;
background-color: #E8E8E8;
color: black;
text-align: center;
font-weight: bold;
+ font-family: 'Noto Sans', sans-serif;
+ padding: 0.5px;
}
+/* Advantage / Whisper toggle groups — flex row of label buttons */
.sheet-advantagetoggle {
position: absolute;
- top: 92px;
- left: 440px;
- z-index: 1;
+ top: 3px;
+ left: 160px;
+ display: none;
+ align-items: center;
+ gap: 3px;
+ z-index: 3;
}
+.sheet-whispertoggle {
+ left: 5px;
+}
+/* Radio inputs hidden — labels handle appearance and clicks via for= */
.sheet-advantagetoggle input[type=radio] {
- opacity: 0;
- position: absolute;
- top: 0px;
- right: 0px;
- width: 18px;
- height: 18px;
- z-index: 2;
+ display: none;
}
-.sheet-advantagetoggle input[type=radio] + span {
- position: absolute;
- top: 0px;
- right: 0px;
- width: 17px;
- height: 17px;
- border: 1px solid black;
+/* Toggle button labels */
+.sheet-advantagetoggle input[type=radio] + label {
+ border: 1px solid #ab8b57;
border-radius: 5px;
- background-color: #E8E8E8;
- color: black;
+ background-color: #e8e8e8;
+ color: #333;
text-align: center;
font-weight: bold;
+ font-family: 'Oxanium', sans-serif;
+ font-size: 11px;
+ padding: 2px 10px;
+ cursor: pointer;
+ white-space: nowrap;
+ line-height: 18px;
+ display: inline-block;
}
-.sheet-advantagetoggle input[type=radio]:checked + span {
+/* Active button — gold */
+.sheet-advantagetoggle input[type=radio]:checked + label {
+ color: #fff;
+ background-color: #ab8b57;
+ border-color: #ab8b57;
+}
+/* NPC button keeps green */
+input[type=radio].sheet-npc-button:checked + span {
color: #FFFFFF;
background-color: #00ba73;
}
-
-input[type=radio].sheet-tab-button:checked + span, .sheet-advantagetoggle input[type=radio]:checked + span, input[type=radio].sheet-npc-button:checked + span {
- color: #FFFFFF;
- background-color: #00ba73;
-}
-
-.sheet-advantagetoggle input.sheet-toggle-left {
- right: 181px;
- width: 90px;
-}
-.sheet-advantagetoggle input.sheet-toggle-left + span {
- right: 181px;
- width: 90px;
-}
-.sheet-advantagetoggle input.sheet-toggle-center {
- right: 113px;
- width: 65px;
-}
-.sheet-advantagetoggle input.sheet-toggle-center + span {
- right: 113px;
- width: 65px;
-}
-.sheet-advantagetoggle input.sheet-toggle-right {
- right: 0px;
- width: 110px;
-}
-.sheet-advantagetoggle input.sheet-toggle-right + span {
- right: 0px;
- width: 110px;
-}
-
-.sheet-whispertoggle {
- left: 150px;
-}
-
-.sheet-advantagetoggle.sheet-whispertoggle input.sheet-toggle-right {
- width: 50px;
-}
-.sheet-advantagetoggle.sheet-whispertoggle input.sheet-toggle-right + span {
- width: 50px;
-}
-.sheet-advantagetoggle.sheet-whispertoggle input.sheet-toggle-left {
- right: 54px;
- width: 55px;
-}
-.sheet-advantagetoggle.sheet-whispertoggle input.sheet-toggle-left + span {
- right: 54px;
- width: 55px;
-}
-
+/* NPC mode: reposition toggles */
.sheet-npc_toggle[value="1"] ~ .sheet-advantagetoggle {
top: -10px;
left: 390px;
@@ -148,13 +127,10 @@ input[type=radio].sheet-tab-button:checked + span, .sheet-advantagetoggle input[
top: -10px;
left: 120px;
}
-
-.sheet-advantagetoggle {
- display: none;
-}
-
-.sheet-toggleflag[value*=advantagetoggle] + .sheet-advantagetoggle, .sheet-toggleflag[value*=whispertoggle] + .sheet-whispertoggle {
- display: block;
+/* Show toggle groups when enabled in sheet settings */
+.sheet-toggleflag[value*=advantagetoggle] + .sheet-advantagetoggle,
+.sheet-toggleflag[value*=whispertoggle] + .sheet-whispertoggle {
+ display: flex;
}
.sheet-toggleflag[value="1"] + .sheet-hidden, .sheet-toggleflag[value="1"] + .sheet-row.sheet-hidden {
display: block;
@@ -179,37 +155,38 @@ input[type=radio].sheet-tab-button:checked + span, .sheet-advantagetoggle input[
margin: 0px;
padding: 0px;
}
-.sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc .sheet-page.sheet-core, .sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc .sheet-page.sheet-bio, .sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc .sheet-page.sheet-options {
+.sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc .sheet-page.sheet-core, .sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc .sheet-page.sheet-bio {
display: none;
}
.sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc .sheet-page.sheet-spells .sheet-body {
visibility: visible;
}
-.sheet-hidden, .sheet-options .sheet-row.sheet-hidden {
+.sheet-hidden, .sheet-options .sheet-row.sheet-hidden, .sheet-settings-modal-body .sheet-row.sheet-hidden {
display: none;
}
-.sheet-npc_toggle[value="1"] ~ .sheet-advantagetoggle input[type=radio] + span {
+.sheet-npc_toggle[value="1"] ~ .sheet-advantagetoggle input[type=radio] + label {
text-transform: lowercase;
font-variant: small-caps;
font-weight: normal;
background: transparent;
border: none;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
-.sheet-npc_toggle[value="1"] ~ .sheet-advantagetoggle input[type=radio] + span:first-letter, .sheet-npc_toggle[value="1"] ~ .sheet-advantagetoggle input[type=radio] + span > span.togm {
+.sheet-npc_toggle[value="1"] ~ .sheet-advantagetoggle input[type=radio] + label:first-letter,
+.sheet-npc_toggle[value="1"] ~ .sheet-advantagetoggle input[type=radio] + label .sheet-togm {
text-transform: uppercase;
}
-.sheet-npc_toggle[value="1"] ~ .sheet-advantagetoggle input[type=radio]:checked + span {
+.sheet-npc_toggle[value="1"] ~ .sheet-advantagetoggle input[type=radio]:checked + label {
font-weight: bold;
color: #245485;
+ background: transparent;
}
.sheet-page {
display: none;
}
-input[type=radio].sheet-tab-button.sheet-core:checked ~ .sheet-page.sheet-core, input[type=radio].sheet-tab-button.sheet-bio:checked ~ .sheet-page.sheet-bio, input[type=radio].sheet-tab-button.sheet-spells:checked ~ .sheet-page.sheet-spells, input[type=radio].sheet-tab-button.sheet-options:checked ~ .sheet-page.sheet-options {
+input[type=radio].sheet-tab-button.sheet-core:checked ~ .sheet-page.sheet-core, input[type=radio].sheet-tab-button.sheet-bio:checked ~ .sheet-page.sheet-bio, input[type=radio].sheet-tab-button.sheet-spells:checked ~ .sheet-page.sheet-spells {
display: block;
}
@@ -220,51 +197,235 @@ input[type=radio].sheet-tab-button.sheet-core:checked ~ .sheet-page.sheet-core,
input[type=radio].sheet-npc-button.sheet-npcs:checked ~ .sheet-page.sheet-npcs, input[type=radio].sheet-npc-button.sheet-ships:checked ~ .sheet-page.sheet-ships {
display: block;
}
-input[type=radio].sheet-tab-button.sheet-core {
- right: 245px;
- width: 45px;
+/* Bio tab — Personality/Ideals/Bonds/Flaws 2×2 grid */
+.sheet-page.sheet-bio .sheet-bio-background {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 4px;
+ margin-bottom: 4px;
}
-input[type=radio].sheet-tab-button.sheet-core + span {
- right: 245px;
- width: 45px;
+/* Tab row — in document flow, sits between abilities bar and body */
+.sheet-tab-row {
+ position: relative;
+ display: flex;
+ flex-direction: row;
+ padding: 2px 0 0;
+ align-items: flex-end;
+ min-height: 28px;
+ margin-top: -4.5px;
+ margin-bottom: 12px;
+ z-index: 1;
}
-input[type=radio].sheet-tab-button.sheet-bio {
- right: 210px;
- width: 30px;
+/* Shared label style for both groups */
+.sheet-tab-row .sheet-tab-label,
+.sheet-ship-tab-row .sheet-tab-label {
+ border: 1px solid #bbb;
+ border-radius: 0 0 6px 6px;
+ background-color: #e8e8e8;
+ color: #555;
+ text-align: center;
+ font-weight: bold;
+ font-family: 'Oxanium', sans-serif;
+ font-size: 13px;
+ padding: 3px 12px;
+ cursor: pointer;
+ white-space: nowrap;
}
-input[type=radio].sheet-tab-button.sheet-bio + span {
- right: 210px;
- width: 30px;
+/* Main group: CORE / GEAR & BIO / POWERS — absolutely centered on the row */
+.sheet-tab-main-group {
+ position: absolute;
+ left: 50%;
+ transform: translateX(-50%);
+ bottom: 0;
+ display: flex;
+ gap: 4px;
}
-input[type=radio].sheet-tab-button.sheet-spells {
- right: 145px;
- width: 60px;
+.sheet-tab-main-group .sheet-tab-label {
+ min-width: 100px;
}
-input[type=radio].sheet-tab-button.sheet-spells + span {
- right: 145px;
- width: 60px;
+/* Type group: PC / STARSHIP — right-aligned */
+.sheet-tab-type-group {
+ margin-left: auto;
+ display: flex;
+ gap: 4px;
}
-input[type=radio].sheet-tab-button.sheet-options {
- right: 120px;
- width: 20px;
+/* Ship sheet tab row */
+.sheet-ship-tab-row {
+ display: flex;
+ justify-content: flex-end;
+ gap: 4px;
+ margin-top: -20px;
+ margin-bottom: 12px;
}
-input[type=radio].sheet-tab-button.sheet-options + span {
- right: 120px;
- width: 20px;
+.sheet-ship-tab-row .sheet-tab-label {
+ flex: 0 0 auto;
+ width: auto;
}
-input[type=radio].sheet-tab-button.sheet-type-pc {
- right: 77px;
- width: 25px;
+/* Active tab — gold */
+input[type=radio].sheet-tab-button.sheet-core:checked ~ .sheet-page.sheet-core .sheet-tab-row .sheet-tab-label.sheet-core,
+input[type=radio].sheet-tab-button.sheet-bio:checked ~ .sheet-page.sheet-bio .sheet-tab-row .sheet-tab-label.sheet-bio,
+input[type=radio].sheet-tab-button.sheet-spells:checked ~ .sheet-page.sheet-spells .sheet-tab-row .sheet-tab-label.sheet-spells {
+ color: #fff;
+ background-color: #ab8b57;
+ border-color: #ab8b57;
}
-input[type=radio].sheet-tab-button.sheet-type-pc + span {
- right: 77px;
- width: 25px;
+/* PC label gold by default — since PC is the initial state and attr_pc_sheet_type
+ may be unset on existing characters, we highlight PC unless STARSHIP is checked */
+.sheet-tab-row .sheet-tab-label.sheet-type-pc,
+.sheet-ship-tab-row .sheet-tab-label.sheet-type-pc {
+ color: #fff;
+ background-color: #ab8b57;
+ border-color: #ab8b57;
}
-input[type=radio].sheet-tab-button.sheet-type-starship {
- width: 72px;
+/* When STARSHIP is explicitly checked: un-highlight PC, highlight STARSHIP */
+input[type=radio].sheet-tab-button.sheet-type-starship:checked ~ .sheet-page.sheet-core .sheet-tab-row .sheet-tab-label.sheet-type-pc,
+input[type=radio].sheet-tab-button.sheet-type-starship:checked ~ .sheet-page.sheet-bio .sheet-tab-row .sheet-tab-label.sheet-type-pc,
+input[type=radio].sheet-tab-button.sheet-type-starship:checked ~ .sheet-page.sheet-spells .sheet-tab-row .sheet-tab-label.sheet-type-pc {
+ color: #555;
+ background-color: #e8e8e8;
+ border-color: #bbb;
}
-input[type=radio].sheet-tab-button.sheet-type-starship + span {
- width: 72px;
+input[type=radio].sheet-tab-button.sheet-type-starship:checked ~ .sheet-page.sheet-core .sheet-tab-row .sheet-tab-label.sheet-type-starship,
+input[type=radio].sheet-tab-button.sheet-type-starship:checked ~ .sheet-page.sheet-bio .sheet-tab-row .sheet-tab-label.sheet-type-starship,
+input[type=radio].sheet-tab-button.sheet-type-starship:checked ~ .sheet-page.sheet-spells .sheet-tab-row .sheet-tab-label.sheet-type-starship {
+ color: #fff;
+ background-color: #ab8b57;
+ border-color: #ab8b57;
+}
+/* Ship tab-row: PC highlighted by default, STARSHIP overrides */
+input[type=radio].sheet-tab-button.sheet-type-starship:checked ~ .sheet-ship-tab-row .sheet-tab-label.sheet-type-pc {
+ color: #555;
+ background-color: #e8e8e8;
+ border-color: #bbb;
+}
+input[type=radio].sheet-tab-button.sheet-type-starship:checked ~ .sheet-ship-tab-row .sheet-tab-label.sheet-type-starship {
+ color: #fff;
+ background-color: #ab8b57;
+ border-color: #ab8b57;
+}
+/* Hover — gold highlight on inactive tabs */
+.sheet-tab-row .sheet-tab-label:hover,
+.sheet-ship-tab-row .sheet-tab-label:hover {
+ background-color: #ab8b57;
+ border-color: #ab8b57;
+ color: #fff;
+}
+/* Sheet Settings — Modal */
+input[type=checkbox].sheet-settings-modal-toggle {
+ display: none;
+}
+input[type=checkbox].sheet-settings-modal-toggle:checked ~ .sheet-settings-modal-overlay {
+ display: block;
+}
+label.sheet-settings-modal-btn {
+ position: absolute;
+ right: 5px;
+ top: 3px;
+ width: 130px;
+ height: 24px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ text-align: center !important;
+ padding: 0 !important;
+ font-family: 'Oxanium', sans-serif;
+ font-size: 10px;
+ letter-spacing: 0.5px;
+ text-transform: uppercase;
+ border: 1px solid #ab8b57;
+ border-radius: 3px;
+ color: #245485;
+ background-color: #fff;
+ cursor: pointer;
+ z-index: 3;
+ box-sizing: border-box;
+}
+label.sheet-settings-modal-btn:hover {
+ background-color: #245485;
+ color: #fff;
+ border-color: #245485;
+}
+/* Hide Sheet Settings button when NPC/Ship mode is active */
+.sheet-npc-mode-mirror:checked ~ label.sheet-settings-modal-btn {
+ display: none;
+}
+.sheet-npc-mode-mirror {
+ display: none;
+}
+.sheet-settings-modal-overlay {
+ display: none;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: 200;
+}
+.sheet-settings-modal-overlay > label.sheet-settings-modal-backdrop {
+ display: block;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: rgba(0, 0, 0, 0.5);
+ cursor: pointer;
+}
+.sheet-settings-modal-panel {
+ position: absolute;
+ top: 30px;
+ left: 10px;
+ right: 10px;
+ max-height: calc(100% - 40px);
+ background: #fff;
+ border: 2px solid #ab8b57;
+ border-radius: 8px;
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+ z-index: 201;
+}
+.sheet-settings-modal-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 6px 12px;
+ background: #245485;
+ flex-shrink: 0;
+}
+.sheet-settings-modal-title {
+ font-family: 'Oxanium', sans-serif;
+ font-size: 12px;
+ font-weight: bold;
+ font-variant: small-caps;
+ letter-spacing: 1px;
+ color: #fff;
+}
+label.sheet-settings-modal-close {
+ width: 22px;
+ height: 22px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 50%;
+ background: rgba(255, 255, 255, 0.2);
+ color: #fff;
+ font-size: 13px;
+ cursor: pointer;
+ line-height: 1;
+}
+label.sheet-settings-modal-close:hover {
+ background: rgba(255, 255, 255, 0.4);
+}
+.sheet-settings-modal-body {
+ overflow-y: auto;
+ overflow-x: hidden;
+ padding: 10px;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: flex-start;
+ gap: 8px;
+ flex: 1;
}
input[type=radio].sheet-npc-button.sheet-npcs {
right: 65px;
@@ -354,24 +515,1394 @@ input[type=radio].sheet-npc-button.sheet-ships + span {
margin-top: 0;
}
-.sheet-name-container {
- width: 250px;
- display: inline-block;
- vertical-align: top;
-}
-.sheet-name-container input {
- font-size: 20px;
- margin-top: -9px;
+/* Push ALL PC page content below the top bar */
+.sheet-pc {
+ padding-top: 32px;
}
+/* Header two-panel flex layout */
+.sheet-header {
+ display: flex;
+ align-items: stretch;
+ gap: 8px;
+}
+
+/* ── LEFT PANEL: character info ── */
+.sheet-header-left {
+ flex: 1;
+ min-width: 0;
+ border: 1px solid #ab8b57;
+ border-radius: 8px;
+ padding: 5px 7px;
+ box-sizing: border-box;
+ position: relative;
+}
+
+/* name-container = portrait (left) + char-info-right (flex column) */
+.sheet-name-container {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ flex-direction: row;
+ align-items: stretch;
+ gap: 8px;
+}
+.sheet-name-container .sheet-token-frame {
+ width: 100px;
+ height: 100px;
+ flex-shrink: 0;
+ border: 3px solid #ab8b57;
+ border-radius: 8px;
+ overflow: hidden;
+ background: #fff;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+.sheet-name-container .sheet-char-avatar {
+ width: 100%;
+ height: 100%;
+ object-fit: contain;
+ display: block;
+}
+
+/* Right column: name row + toggle + edit/display panels */
+.sheet-char-info-right {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+ min-width: 0;
+ position: relative;
+}
+.sheet-char-info-right .sheet-name-fields {
+ display: flex;
+ flex-direction: column;
+}
+.sheet-char-info-right .sheet-name-fields input {
+ font-size: 16px !important;
+ font-weight: bold !important;
+ color: #245485 !important;
+ border: none !important;
+ border-bottom: 1px solid #ddd !important;
+ background: none !important;
+ padding: 0 !important;
+ width: 100% !important;
+ box-shadow: none !important;
+}
+.sheet-char-info-right .sheet-name-fields .sheet-label {
+ font-size: 8px !important;
+ color: #999 !important;
+ text-align: left !important;
+ font-weight: normal !important;
+ line-height: 1.2 !important;
+ display: block !important;
+}
+
+/* Edit/display panels — no border, fills right column */
.sheet-header-info {
- width: 482px;
- margin-left: -2px;
- display: inline-block;
- border: 3px double #ab8b57;
- border-radius: 10px;
- padding: 5px;
- max-height: 74px;
+ width: 100%;
+ margin-left: 0;
+ display: block;
+ border: none;
+ border-radius: 0;
+ padding: 1px 0 0 0;
+ max-height: none;
+}
+.sheet-header-info.sheet-options input,
+.sheet-header-info.sheet-options select {
+ width: 70px;
+ font-size: 10px;
+}
+
+/* ── RIGHT PANEL: HP + death saves ── */
+.sheet-header-right {
+ flex: 1;
+ border: 1px solid #ab8b57;
+ border-radius: 6px;
+ padding: 4px 8px;
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+ box-sizing: border-box;
+}
+
+/* HP title */
+.sheet-hp-panel-label {
+ font-family: 'Oxanium', sans-serif;
+ font-size: 9px !important;
+ font-weight: bold;
+ color: #ab8b57;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+ line-height: 1.2 !important;
+ display: block !important;
+}
+
+/* Main row: [hp-left-cluster] [dmg/heal] [death saves] */
+.sheet-hp-main-row {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+ flex: 1;
+}
+.sheet-hp-left-cluster {
+ display: flex;
+ align-items: flex-start;
+ gap: 6px;
+ flex-shrink: 0;
+}
+
+/* Current/Max group — curmax-box has border with bar at bottom */
+.sheet-hp-curmax-group {
+ display: flex;
+ flex-direction: column;
+ align-items: stretch;
+ flex-shrink: 0;
+}
+.sheet-hp-curmax-box {
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+ height: 42px;
+}
+.sheet-hp-curmax-box .sheet-hp-cm-inputs {
+ flex: 1;
+ display: flex;
+ align-items: center;
+ padding: 0 4px;
+ gap: 2px;
+}
+.sheet-hp-curmax-box .sheet-hp-cm-inputs input[type=number],
+.sheet-hp-curmax-box .sheet-hp-cm-inputs input[type=text] {
+ width: 44px !important;
+ font-size: 20px !important;
+ font-weight: bold !important;
+ text-align: center !important;
+ background: none !important;
+ border: none !important;
+ border-radius: 0 !important;
+ box-shadow: none !important;
+ color: #000 !important;
+ padding: 0 !important;
+ margin: 0 !important;
+}
+.sheet-hp-sep {
+ font-size: 16px !important;
+ color: #aaa;
+ line-height: 1 !important;
+ flex-shrink: 0;
+ display: inline-block !important;
+}
+.sheet-hp-bar-track {
+ width: 100%;
+ height: 6px;
+ background: #ddd;
+ border-radius: 0;
+ overflow: hidden;
+ margin: 0;
+ flex-shrink: 0;
+}
+.sheet-hp-bar-fill {
+ width: 100%;
+ height: 100%;
+ background: #27ae60;
+}
+.sheet-hp-cm-labels {
+ display: flex;
+ justify-content: space-between;
+ width: 100%;
+ margin-top: 2px;
+}
+.sheet-hp-cm-labels span {
+ font-size: 8px !important;
+ color: #888;
+ font-family: 'Oxanium', sans-serif;
+ text-transform: uppercase;
+ letter-spacing: 0.3px;
+ line-height: 1 !important;
+ display: inline-block !important;
+}
+
+/* Temp HP — same height as curmax-box */
+.sheet-hp-temp-group {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 2px;
+ flex-shrink: 0;
+}
+.sheet-hp-temp-group input[type=number] {
+ width: 44px !important;
+ height: 42px !important;
+ font-size: 20px !important;
+ font-weight: bold !important;
+ text-align: center !important;
+ background: none !important;
+ border: 1px solid #ccc !important;
+ border-radius: 4px !important;
+ box-shadow: none !important;
+ color: #555 !important;
+ padding: 0 !important;
+ margin: 0 !important;
+ box-sizing: border-box !important;
+}
+.sheet-hp-temp-group > span {
+ font-size: 8px !important;
+ color: #888;
+ font-family: 'Oxanium', sans-serif;
+ text-transform: uppercase;
+ letter-spacing: 0.3px;
+ line-height: 1 !important;
+ display: block !important;
+}
+
+/* Damage / Heal — change input same size as HP boxes */
+.sheet-hp-dmgheal-group {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 2px;
+ flex-shrink: 0;
+}
+.sheet-hp-dmgheal-controls {
+ display: flex;
+ align-items: center;
+ gap: 3px;
+}
+.sheet-hp-dmg-btn,
+.sheet-hp-heal-btn {
+ width: 26px !important;
+ height: 26px !important;
+ border-radius: 50% !important;
+ border: none !important;
+ font-size: 18px !important;
+ font-weight: bold !important;
+ line-height: 1 !important;
+ cursor: pointer !important;
+ box-shadow: none !important;
+ text-shadow: none !important;
+ padding: 0 !important;
+ flex-shrink: 0;
+ display: flex !important;
+ align-items: center !important;
+ justify-content: center !important;
+}
+.sheet-hp-dmg-btn {
+ background: #c0392b !important;
+ color: white !important;
+}
+.sheet-hp-heal-btn {
+ background: #27ae60 !important;
+ color: white !important;
+}
+.sheet-hp-change-input {
+ width: 44px !important;
+ height: 42px !important;
+ font-size: 20px !important;
+ font-weight: bold !important;
+ text-align: center !important;
+ background: none !important;
+ border: 1px solid #ccc !important;
+ border-radius: 4px !important;
+ box-shadow: none !important;
+ color: #000 !important;
+ padding: 0 !important;
+ margin: 0 !important;
+ box-sizing: border-box !important;
+}
+.sheet-hp-dmgheal-labels {
+ display: flex;
+ width: 100%;
+ justify-content: space-between;
+}
+.sheet-hp-dmgheal-labels span {
+ font-size: 8px !important;
+ color: #888;
+ font-family: 'Oxanium', sans-serif;
+ text-transform: uppercase;
+ letter-spacing: 0.3px;
+ line-height: 1 !important;
+ display: inline-block !important;
+}
+
+/* Death Saves */
+.sheet-death-saves-group {
+ display: flex;
+ flex-direction: column;
+ gap: 3px;
+ flex-shrink: 0;
+ justify-content: center;
+}
+/* DEATH SAVES roll button (replaces plain title) */
+.sheet-ds-roll-btn {
+ font-family: 'Oxanium', sans-serif !important;
+ font-size: 8px !important;
+ font-weight: bold !important;
+ color: #245485 !important;
+ background: transparent !important;
+ border: none !important;
+ box-shadow: none !important;
+ text-shadow: none !important;
+ text-transform: uppercase !important;
+ letter-spacing: 0.5px !important;
+ padding: 0 !important;
+ cursor: pointer !important;
+ text-align: left !important;
+ line-height: 1 !important;
+ display: block !important;
+ width: 100% !important;
+}
+.sheet-ds-roll-btn::before {
+ content: "" !important;
+}
+/* Pip box with light gray background */
+.sheet-ds-pip-box {
+ background: #f0f0f0;
+ border-radius: 4px;
+ padding: 4px 6px;
+ display: flex;
+ flex-direction: column;
+ gap: 5px;
+}
+.sheet-ds-row {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+}
+.sheet-ds-label {
+ font-size: 8px !important;
+ color: #888;
+ width: 52px;
+ flex-shrink: 0;
+ display: inline-block !important;
+ line-height: 1.2 !important;
+}
+.sheet-ds-pip {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ width: 13px !important;
+ height: 13px !important;
+ border-radius: 50% !important;
+ border: 2px solid !important;
+ cursor: pointer !important;
+ margin: 0 !important;
+ padding: 0 !important;
+ flex-shrink: 0;
+ box-shadow: none !important;
+ background: transparent !important;
+}
+.sheet-ds-success {
+ border-color: #27ae60 !important;
+}
+.sheet-ds-success:checked {
+ background: #27ae60 !important;
+}
+.sheet-ds-failure {
+ border-color: #c0392b !important;
+}
+.sheet-ds-failure:checked {
+ background: #c0392b !important;
+}
+
+/* Hit Dice row */
+.sheet-hp-hitdice-row {
+ display: flex;
+ align-items: stretch;
+ gap: 4px;
+ border-top: 1px solid #ececec;
+ padding-top: 3px;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+}
+.sheet-hd-mc1-flag, .sheet-hd-mc2-flag, .sheet-hd-mc3-flag { display: none; }
+.sheet-hd-group-mc1, .sheet-hd-group-mc2, .sheet-hd-group-mc3 { display: none !important; }
+.sheet-hd-mc1-flag:checked ~ .sheet-hd-group-mc1 { display: flex !important; }
+.sheet-hd-mc2-flag:checked ~ .sheet-hd-group-mc2 { display: flex !important; }
+.sheet-hd-mc3-flag:checked ~ .sheet-hd-group-mc3 { display: flex !important; }
+.sheet-hd-label {
+ font-family: 'Oxanium', sans-serif;
+ font-size: 8px !important;
+ font-weight: bold;
+ color: #245485;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ flex-shrink: 0;
+ align-self: center;
+ display: inline-block !important;
+ line-height: 1 !important;
+}
+.sheet-hd-count-input {
+ width: 26px !important;
+ font-size: 14px !important;
+ font-weight: bold !important;
+ text-align: center !important;
+ background: none !important;
+ border: none !important;
+ box-shadow: none !important;
+ color: #000 !important;
+ padding: 0 !important;
+ margin: 0 !important;
+}
+.sheet-hd-sep {
+ font-size: 12px !important;
+ color: #aaa;
+ flex-shrink: 0;
+ display: inline-block !important;
+ line-height: 1 !important;
+}
+.sheet-hd-max-input {
+ width: 26px !important;
+ font-size: 14px !important;
+ text-align: center !important;
+ background: none !important;
+ border: none !important;
+ box-shadow: none !important;
+ color: #555 !important;
+ padding: 0 !important;
+ margin: 0 !important;
+}
+.sheet-hd-group {
+ display: flex;
+ align-items: stretch;
+ gap: 0;
+}
+.sheet-hd-type-btn {
+ font-family: 'Oxanium', sans-serif !important;
+ font-size: 11px !important;
+ font-weight: bold !important;
+ color: #000 !important;
+ background: #f0f0f0 !important;
+ border: 1px solid #ab8b57 !important;
+ border-radius: 4px 0 0 4px !important;
+ box-shadow: none !important;
+ text-shadow: none !important;
+ text-transform: none !important;
+ font-variant: normal !important;
+ letter-spacing: 0.3px !important;
+ padding: 3px 8px !important;
+ cursor: pointer !important;
+ flex-shrink: 0;
+ white-space: nowrap;
+ display: inline-flex !important;
+ flex-direction: row !important;
+ align-items: center !important;
+ gap: 0 !important;
+ margin: 0 !important;
+}
+.charsheet .sheet-hd-type-btn:hover,
+.charsheet .sheet-hd-type-btn:hover .sheet-hd-btn-label,
+.charsheet .sheet-hd-type-btn:hover .sheet-hd-btn-label span {
+ background: #066dce !important;
+ color: #fff !important;
+}
+.sheet-hd-type-btn::before {
+ content: "" !important;
+}
+.sheet-hd-btn-label {
+ font-size: 11px !important;
+ font-weight: bold !important;
+ text-transform: none !important;
+ font-variant: normal !important;
+ display: inline !important;
+ color: inherit !important;
+}
+.sheet-hd-btn-label span {
+ text-transform: none !important;
+ font-variant: normal !important;
+ display: inline !important;
+ font-size: 11px !important;
+ color: inherit !important;
+}
+.sheet-hd-count-box {
+ display: flex;
+ align-items: center;
+ border: 1px solid #ab8b57;
+ border-left: none;
+ border-radius: 0 4px 4px 0;
+ background: #fff;
+ padding: 2px 6px;
+ gap: 2px;
+}
+
+/* The base .sheet-spells span rule applies width:100%, margin-top:5px, text-align:center,
+ font-weight:bold to ALL spans in the spells page. Reset width/margin/text-align for the
+ header (font-weight is left alone so bold labels stay bold). Abilities-bar spans are
+ handled separately below with explicit margin-top:0 / margin-top:6px rules. */
+.charsheet .sheet-pc .sheet-page.sheet-spells .sheet-header span {
+ width: auto !important;
+ margin-top: 0 !important;
+ text-align: inherit !important;
+}
+/* DS label needs explicit width so pips stay on the same flex row */
+.charsheet .sheet-pc .sheet-page.sheet-spells .sheet-header .sheet-ds-label {
+ width: 52px !important;
+ font-weight: normal !important;
+}
+/* .sheet-spells span sets font-weight:bold — reset to normal for labels that should be light */
+.charsheet .sheet-pc .sheet-page.sheet-spells .sheet-header .sheet-hp-cm-labels span,
+.charsheet .sheet-pc .sheet-page.sheet-spells .sheet-header .sheet-hp-temp-group > span,
+.charsheet .sheet-pc .sheet-page.sheet-spells .sheet-header .sheet-hp-dmgheal-labels span {
+ font-weight: normal !important;
+}
+
+/* Bio tab — description fields (generic fallback, mostly overridden by scoped rule below) */
+.sheet-bio-description-row {
+ margin-bottom: 8px;
+}
+.sheet-bio-description-row .sheet-hlabel-container {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+}
+
+/* ============================================================
+ Gear & Bio Tab — Two-Column Layout (2026-05-18)
+ Left: Gear column (375px fixed) | Right: Bio column (flex 1)
+ ============================================================ */
+
+/* Body: two-column flex row */
+.sheet-page.sheet-bio .sheet-body {
+ display: flex;
+ flex-direction: row;
+ gap: 14px;
+ align-items: flex-start;
+ padding: 4px 0;
+}
+
+/* Left / Gear column */
+.sheet-page.sheet-bio .sheet-gear-col {
+ flex: 0 0 375px;
+ min-width: 0;
+}
+
+/* Right / Bio column */
+.sheet-page.sheet-bio .sheet-bio-col {
+ flex: 1;
+ min-width: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+/* --- Equipment section in Gear column --- */
+
+/* Gear column: explicit width to beat .sheet-col { width: 32.97% } */
+.sheet-page.sheet-bio .sheet-gear-col {
+ width: 375px !important;
+}
+
+/* Override global equipment size / position defaults */
+.sheet-page.sheet-bio .sheet-equipment {
+ min-height: unset;
+ padding-bottom: 6px;
+}
+
+/* .sheet-complex has width: 160px by default — expand to fill the column */
+.sheet-page.sheet-bio .sheet-equipment .sheet-complex {
+ width: 100% !important;
+ display: block !important;
+ vertical-align: initial;
+ padding-top: 0 !important;
+ margin-bottom: 0 !important;
+ box-sizing: border-box;
+}
+
+/* Section label: static at top instead of absolute at bottom */
+.sheet-page.sheet-bio .sheet-equipment > span.sheet-label {
+ position: static !important;
+ display: block !important;
+ bottom: auto !important;
+ margin-top: 0 !important;
+ text-align: center;
+ font-family: 'Oxanium', sans-serif;
+ font-weight: bold;
+ font-size: 11px;
+ color: #245485;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+ padding: 6px 8px 5px;
+ border-bottom: 1px solid rgba(171,139,87,0.5);
+ border-radius: 4px 4px 0 0;
+ width: 100%;
+ box-sizing: border-box;
+}
+
+/* Money row: layout properties (no display here — toggle rules control visibility) */
+.sheet-page.sheet-bio .sheet-money {
+ flex-direction: row;
+ width: 100%;
+ gap: 5px;
+ padding: 6px 8px;
+ border-bottom: 1px solid rgba(171,139,87,0.2);
+ box-sizing: border-box;
+}
+/* EG currency: shown by default as flex (0,3,0 specificity beats 0,2,0 default) */
+.sheet-page.sheet-bio .sheet-gear-col .sheet-eg-currency {
+ display: flex;
+}
+/* 5e currency: shown as flex in 5e mode (overrides inline-block from existing toggle rule) */
+.sheet-page.sheet-bio input[name="attr_currency_mode"][value="5e"] ~ .sheet-fivee-currency {
+ display: flex;
+}
+
+/* Coin box: stacked value-over-label */
+.sheet-page.sheet-bio .sheet-coin {
+ flex: 1;
+ display: flex !important;
+ flex-direction: column !important;
+ align-items: center;
+ justify-content: center;
+ padding: 5px 3px;
+ margin-top: 0 !important;
+ left: 0 !important;
+ position: static !important;
+ border: 1px solid #ab8b57;
+ border-radius: 5px;
+ gap: 2px;
+}
+.sheet-page.sheet-bio .sheet-coin span.sheet-label {
+ display: block !important;
+ font-family: 'Oxanium', sans-serif;
+ font-weight: bold;
+ font-size: 9px;
+ color: #245485;
+ text-transform: uppercase;
+ width: auto !important;
+ margin: 0 !important;
+ letter-spacing: 0.5px;
+ text-align: center;
+}
+.sheet-page.sheet-bio .sheet-coin input {
+ width: 100% !important;
+ text-align: center;
+ font-size: 13px;
+ font-weight: bold;
+ border: none !important;
+ background: transparent !important;
+ padding: 0 !important;
+ box-shadow: none !important;
+}
+
+/* Inventory column header — same padding/gap as item rows for pixel alignment */
+.sheet-page.sheet-bio .sheet-inv-header {
+ display: flex;
+ align-items: center;
+ padding: 4px 8px;
+ gap: 4px;
+ border-bottom: 1px solid rgba(171,139,87,0.4);
+ background: rgba(36,84,133,0.04);
+}
+.sheet-page.sheet-bio .sheet-inv-col-count,
+.sheet-page.sheet-bio .sheet-inv-col-weight {
+ width: 32px;
+ flex-shrink: 0;
+ font-size: 9px;
+ font-weight: bold;
+ color: #888;
+ text-transform: uppercase;
+ text-align: center;
+ font-family: 'Oxanium', sans-serif;
+ letter-spacing: 0.5px;
+}
+.sheet-page.sheet-bio .sheet-inv-col-name {
+ flex: 1;
+ font-size: 9px;
+ font-weight: bold;
+ color: #888;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ font-family: 'Oxanium', sans-serif;
+}
+
+/* Inventory rows: taller, more breathing room, wrap for subitem */
+.sheet-page.sheet-bio .sheet-equipment .sheet-item {
+ display: flex !important;
+ align-items: center;
+ flex-wrap: wrap;
+ min-height: 34px;
+ margin-bottom: 0 !important;
+ padding: 3px 30px 3px 8px;
+ border-bottom: 1px solid rgba(171,139,87,0.12);
+ gap: 4px;
+ position: relative;
+}
+.sheet-page.sheet-bio .sheet-equipment .sheet-item:nth-child(even) {
+ background: rgba(36,84,133,0.03);
+}
+.sheet-page.sheet-bio .sheet-equipment .sheet-item input.sheet-name {
+ flex: 1 !important;
+ width: auto !important;
+ font-size: 13px;
+ font-weight: bold;
+ border: none !important;
+ background: transparent !important;
+ padding: 2px 4px !important;
+ box-shadow: none !important;
+ text-align: left !important;
+}
+.sheet-page.sheet-bio .sheet-equipment .sheet-item input[type=text].sheet-weight {
+ width: 32px !important;
+ flex-shrink: 0;
+ text-align: center;
+ font-size: 12px;
+}
+
+/* span i (expand toggle): absolutely positioned at right edge, out of flex flow */
+.sheet-page.sheet-bio .sheet-equipment .sheet-inventorysubflag + span {
+ position: absolute !important;
+ right: 4px;
+ top: 50%;
+ transform: translateY(-50%);
+ width: 22px;
+ height: 22px;
+ display: flex !important;
+ align-items: center;
+ justify-content: center;
+ font-size: 11px;
+ color: #ab8b57;
+ opacity: 0.65;
+ cursor: pointer;
+ z-index: 1;
+ left: auto !important;
+ background: transparent !important;
+ font-family: 'Noto Sans', sans-serif !important;
+}
+/* Invisible click-target checkbox: small, same position, stays transparent */
+.sheet-page.sheet-bio .sheet-equipment .sheet-inventorysubflag {
+ left: auto !important;
+ right: 4px !important;
+ top: 50% !important;
+ transform: translateY(-50%);
+ width: 22px !important;
+ height: 22px !important;
+ opacity: 0 !important;
+ cursor: pointer;
+}
+/* Active state: blue toggle */
+.sheet-page.sheet-bio .sheet-equipment .sheet-inventorysubflag:checked + span {
+ color: #066dce !important;
+ opacity: 1;
+}
+
+/* Subitem panel: wraps to full-width row below the item fields */
+.sheet-page.sheet-bio .sheet-equipment .sheet-item .sheet-subitem {
+ flex: 0 0 100%;
+ width: 100%;
+ box-sizing: border-box;
+ border-top: 1px dashed rgba(171,139,87,0.4);
+ padding: 8px;
+ background: rgba(255,255,255,0.6);
+}
+.sheet-page.sheet-bio .sheet-equipment .sheet-inventorysubflag:checked ~ .sheet-subitem {
+ display: flex !important;
+ flex-wrap: wrap;
+ gap: 6px 10px;
+ align-items: center;
+}
+
+/* Weighttotal: two-column layout */
+.sheet-page.sheet-bio .sheet-equipment .sheet-weighttotal {
+ position: static !important;
+ display: flex !important;
+ align-items: stretch;
+ gap: 0;
+ padding: 0;
+ border-top: 1px solid rgba(171,139,87,0.3);
+ margin-top: 4px;
+ width: auto !important;
+ flex-wrap: wrap;
+}
+.sheet-page.sheet-bio .sheet-equipment .sheet-weighttotal .sheet-weight-col {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ padding: 5px 8px;
+ gap: 2px;
+}
+.sheet-page.sheet-bio .sheet-equipment .sheet-weighttotal .sheet-weight-col + .sheet-weight-col {
+ border-left: 1px solid rgba(171,139,87,0.3);
+}
+.sheet-page.sheet-bio .sheet-equipment .sheet-weighttotal input {
+ width: 60px !important;
+ text-align: center;
+ font-weight: bold;
+ font-size: 16px;
+ pointer-events: auto;
+ border: none !important;
+ background: transparent !important;
+ box-shadow: none !important;
+}
+.sheet-page.sheet-bio .sheet-equipment .sheet-weighttotal input[name="attr_carrying_capacity"] {
+ pointer-events: none;
+ color: #555;
+}
+.sheet-page.sheet-bio .sheet-equipment .sheet-weighttotal span.sheet-label {
+ font-size: 9px;
+ font-weight: bold;
+ color: #888;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+.sheet-page.sheet-bio .sheet-equipment .sheet-weighttotal .sheet-encumb {
+ flex: 0 0 100%;
+ text-align: center;
+}
+
+/* Enhanced Item Affinity textarea */
+.sheet-page.sheet-bio .sheet-item-affinity {
+ margin-top: 6px;
+}
+.sheet-page.sheet-bio .sheet-item-affinity textarea {
+ min-height: 70px;
+ height: 70px;
+ width: 100%;
+ box-sizing: border-box;
+}
+
+/* --- Bio column layout --- */
+
+/* Description row (Age/Size/Height/Weight/Alignment) — scoped to bio-col */
+.sheet-page.sheet-bio .sheet-bio-col .sheet-bio-description-row {
+ position: relative;
+ border: 1px solid rgba(171,139,87,0.6);
+ border-radius: 6px;
+ background: transparent !important;
+ padding: 0 !important;
+ margin-bottom: 8px;
+ display: block !important;
+}
+/* Header bar */
+.sheet-page.sheet-bio .sheet-bio-col .sheet-bio-desc-header {
+ position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: flex-end;
+ padding: 4px 8px;
+ border-bottom: 1px solid rgba(171,139,87,0.4);
+}
+.sheet-page.sheet-bio .sheet-bio-col .sheet-bio-desc-title {
+ position: absolute;
+ left: 0;
+ right: 0;
+ font-family: 'Oxanium', sans-serif;
+ font-weight: bold;
+ font-size: 10px;
+ color: #245485;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+ white-space: nowrap;
+ pointer-events: none;
+ display: block !important;
+ text-align: center !important;
+ width: auto !important;
+}
+/* Gear icon toggle */
+.sheet-page.sheet-bio .sheet-bio-col .sheet-bio-desc-gear-toggle {
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ flex-shrink: 0;
+ margin-left: 6px;
+}
+.sheet-page.sheet-bio .sheet-bio-col .sheet-bio-desc-gear-toggle input[type=checkbox] {
+ display: none;
+}
+.sheet-page.sheet-bio .sheet-bio-col .sheet-bio-desc-gear-icon {
+ font-family: 'Material Symbols Outlined';
+ font-size: 14px;
+ color: #ab8b57;
+ opacity: 0.6;
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;
+ display: inline-block !important;
+ line-height: 1;
+ user-select: none;
+ transition: opacity 0.2s, color 0.2s;
+ text-transform: none !important;
+ font-variant: normal !important;
+}
+.sheet-page.sheet-bio .sheet-bio-col .sheet-bio-desc-gear-toggle:hover .sheet-bio-desc-gear-icon {
+ opacity: 1;
+}
+.sheet-page.sheet-bio .sheet-bio-col .sheet-bio-description-row:has(.sheet-bio-desc-cb:checked) .sheet-bio-desc-gear-icon {
+ color: #066dce;
+ opacity: 1;
+ font-variation-settings: 'FILL' 1, 'wght' 400, 'GRAD' 0, 'opsz' 24;
+}
+/* Display area — read-only value + label */
+.sheet-page.sheet-bio .sheet-bio-col .sheet-bio-desc-display {
+ display: flex !important;
+ flex-wrap: nowrap;
+ padding: 4px 8px;
+ justify-content: space-between;
+ align-items: stretch;
+}
+.sheet-page.sheet-bio .sheet-bio-col .sheet-bio-field {
+ flex: 1 1 0;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 1px;
+ padding: 2px 2px;
+ position: relative;
+}
+/* Vertical dividers between fields */
+.sheet-page.sheet-bio .sheet-bio-col .sheet-bio-field::after {
+ content: '';
+ position: absolute;
+ right: 0;
+ top: 15%;
+ bottom: 15%;
+ width: 1px;
+ background: rgba(171,139,87,0.4);
+}
+.sheet-page.sheet-bio .sheet-bio-col .sheet-bio-field:last-child::after {
+ display: none;
+}
+/* Em-dash placeholder for empty attribute spans */
+.sheet-page.sheet-bio .sheet-bio-col .sheet-bio-val:empty::before {
+ content: '—';
+ color: #aaa;
+ font-weight: normal;
+ font-size: 14px;
+}
+.sheet-page.sheet-bio .sheet-bio-col .sheet-bio-val {
+ font-size: 14px;
+ font-weight: bold;
+ color: #245485;
+ min-height: 18px;
+ min-width: 30px;
+ display: inline-block !important;
+ text-align: center !important;
+ width: auto !important;
+}
+.sheet-page.sheet-bio .sheet-bio-col .sheet-bio-label {
+ font-family: 'Oxanium', sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+ color: #888;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ display: block !important;
+ text-align: center !important;
+ width: auto !important;
+}
+/* Edit panel — shown when gear is clicked */
+.sheet-page.sheet-bio .sheet-bio-col .sheet-bio-desc-edit {
+ display: none;
+ flex-wrap: wrap;
+ gap: 6px 12px;
+ padding: 6px 10px;
+ background: rgba(36,84,133,0.04);
+ border-top: 1px solid rgba(171,139,87,0.3);
+}
+.sheet-page.sheet-bio .sheet-bio-col .sheet-bio-description-row:has(.sheet-bio-desc-cb:checked) .sheet-bio-desc-edit {
+ display: flex;
+}
+
+/* Character Appearance: shorter textarea */
+.sheet-page.sheet-bio .sheet-appearance-box textarea {
+ min-height: 60px;
+ height: 60px;
+}
+
+/* Background traits grid: inherit 1fr 1fr from .sheet-bio-background rule */
+
+/* Character History: generous textarea */
+.sheet-page.sheet-bio .sheet-history-box textarea {
+ min-height: 200px;
+ height: 200px;
+}
+
+/* Bio col textbox labels — Oxanium blue styling */
+.sheet-page.sheet-bio .sheet-bio-col .sheet-textbox span.sheet-label,
+.sheet-page.sheet-bio .sheet-bio-col .sheet-bio-background .sheet-textbox span.sheet-label {
+ font-family: 'Oxanium', sans-serif !important;
+ font-weight: bold !important;
+ font-size: 9px !important;
+ color: #245485 !important;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+}
+/* Enhanced Item Affinity label — gear col */
+.sheet-page.sheet-bio .sheet-gear-col .sheet-item-affinity span.sheet-label {
+ font-family: 'Oxanium', sans-serif !important;
+ font-weight: bold !important;
+ font-size: 9px !important;
+ color: #245485 !important;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+}
+
+/* Powers tab — power settings row */
+.sheet-powers-info-row {
+ position: relative;
+ border: 1px solid rgba(171,139,87,0.6);
+ border-radius: 6px;
+ background: transparent !important;
+ padding: 0 !important;
+ margin-bottom: 8px;
+ display: block !important;
+}
+/* Header bar */
+.charsheet .sheet-powers-info-row .sheet-powers-info-header {
+ display: flex !important;
+ align-items: center !important;
+ padding: 4px 8px !important;
+ border-bottom: 1px solid rgba(171,139,87,0.4) !important;
+ min-height: 28px !important;
+ height: auto !important;
+ visibility: visible !important;
+ overflow: visible !important;
+}
+/* Left spacer — mirrors gear icon width to keep title visually centred */
+.charsheet .sheet-powers-info-row .sheet-powers-info-spacer {
+ width: 20px !important;
+ flex-shrink: 0 !important;
+ display: block !important;
+ visibility: visible !important;
+}
+.charsheet .sheet-powers-info-row .sheet-powers-info-title {
+ flex: 1 !important;
+ font-family: 'Oxanium', sans-serif !important;
+ font-weight: bold !important;
+ font-size: 12px !important;
+ color: #245485 !important;
+ text-transform: uppercase !important;
+ letter-spacing: 1px !important;
+ white-space: nowrap !important;
+ display: block !important;
+ text-align: center !important;
+ width: auto !important;
+ visibility: visible !important;
+}
+/* Gear icon toggle — right end */
+.sheet-powers-info-gear-toggle {
+ width: 20px;
+ flex-shrink: 0;
+ cursor: pointer;
+ display: flex !important;
+ align-items: center;
+ justify-content: flex-end;
+}
+.sheet-powers-info-gear-toggle input[type=checkbox] {
+ display: none;
+}
+.sheet-powers-info-gear-icon {
+ font-family: 'Material Symbols Outlined';
+ font-size: 14px;
+ color: #ab8b57;
+ opacity: 0.6;
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;
+ display: inline-block !important;
+ line-height: 1;
+ user-select: none;
+ transition: opacity 0.2s, color 0.2s;
+ text-transform: none !important;
+ font-variant: normal !important;
+}
+.sheet-powers-info-gear-toggle:hover .sheet-powers-info-gear-icon { opacity: 1; }
+.sheet-powers-info-row:has(.sheet-powers-info-cb:checked) .sheet-powers-info-gear-icon {
+ color: #066dce;
+ opacity: 1;
+ font-variation-settings: 'FILL' 1, 'wght' 400, 'GRAD' 0, 'opsz' 24;
+}
+/* Display area */
+.sheet-powers-info-display {
+ display: flex !important;
+ flex-wrap: nowrap;
+ padding: 4px 8px;
+ justify-content: space-between;
+ align-items: stretch;
+}
+.sheet-powers-info-field {
+ flex: 1 1 0;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 1px;
+ padding: 2px 2px;
+ position: relative;
+}
+/* Vertical dividers */
+.sheet-powers-info-field::after {
+ content: '';
+ position: absolute;
+ right: 0;
+ top: 15%;
+ bottom: 15%;
+ width: 1px;
+ background: rgba(171,139,87,0.4);
+}
+.sheet-powers-info-field:last-child::after { display: none; }
+/* Value spans and select in display mode */
+.charsheet .sheet-powers-info-field .sheet-display,
+.charsheet .sheet-powers-info-field select {
+ font-size: 14px;
+ font-weight: bold;
+ color: #245485;
+ height: 22px;
+ line-height: 22px;
+ display: inline-block !important;
+ text-align: center !important;
+ width: auto !important;
+}
+.sheet-powers-info-field select {
+ -webkit-appearance: none;
+ appearance: none;
+ background: transparent !important;
+ border: none !important;
+ box-shadow: none !important;
+ pointer-events: none;
+ cursor: default;
+ padding: 0 !important;
+ margin: 4px 0 0 0 !important;
+ max-width: 100%;
+ height: 22px !important;
+ line-height: 22px !important;
+ vertical-align: middle;
+}
+/* Select becomes interactive when gear is open */
+.sheet-powers-info-row:has(.sheet-powers-info-cb:checked) .sheet-powers-info-field select {
+ -webkit-appearance: auto;
+ appearance: auto;
+ background: #fff !important;
+ border: 1px solid rgba(171,139,87,0.6) !important;
+ border-radius: 4px;
+ pointer-events: auto;
+ cursor: pointer;
+ padding: 2px 4px;
+ font-size: 12px;
+ color: #111;
+ font-weight: normal;
+}
+/* Em-dash for empty calculated spans */
+.sheet-powers-info-field .sheet-display:empty::before {
+ content: '—';
+ color: #aaa;
+ font-weight: normal;
+}
+/* Labels */
+.sheet-powers-info-label {
+ font-family: 'Oxanium', sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+ color: #888;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ display: block !important;
+ text-align: center !important;
+ width: auto !important;
+}
+
+/* ── Powers tab: Talent Points / Talent Slots / Esper Mastery section headers ── */
+
+/* Three-column stats row — flex container spanning full width */
+.sheet-powers-stats-row {
+ display: flex !important;
+ flex-direction: row !important;
+ gap: 8px;
+ width: 100%;
+ margin-bottom: 8px;
+}
+.sheet-powers-stats-row .sheet-col {
+ flex: 1 !important;
+ width: auto !important;
+ margin-bottom: 0 !important;
+ padding: 0 !important;
+}
+.sheet-powers-stats-row .sheet-tp,
+.sheet-powers-stats-row .sheet-talent-slots-block,
+.sheet-powers-stats-row .sheet-class_options {
+ margin: 0 !important;
+ width: 100% !important;
+ height: 100%;
+ box-sizing: border-box;
+}
+
+/* Shared header bar — same pattern as Power Settings */
+.charsheet .sheet-tp .sheet-tp-section-header,
+.charsheet .sheet-talent-slots-block .sheet-ts-section-header,
+.charsheet .sheet-esper-mastery .sheet-em-section-header {
+ display: flex !important;
+ align-items: center !important;
+ padding: 4px 8px !important;
+ border-bottom: 1px solid rgba(171,139,87,0.4) !important;
+ min-height: 26px !important;
+ height: auto !important;
+ visibility: visible !important;
+}
+/* Shared title span */
+.charsheet .sheet-tp-section-title,
+.charsheet .sheet-ts-section-title,
+.charsheet .sheet-em-section-title {
+ flex: 1 !important;
+ font-family: 'Oxanium', sans-serif !important;
+ font-weight: bold !important;
+ font-size: 10px !important;
+ color: #245485 !important;
+ text-transform: uppercase !important;
+ letter-spacing: 1px !important;
+ display: block !important;
+ text-align: center !important;
+ visibility: visible !important;
+}
+/* Body padding */
+.sheet-tp-section-body {
+ padding: 4px 4px 6px;
+}
+/* TP Remaining label — Oxanium gray, matches Power Settings label style */
+.sheet-tp-section-body span.sheet-label {
+ display: block !important;
+ text-align: center !important;
+ font-family: 'Oxanium', sans-serif !important;
+ font-size: 9px !important;
+ font-weight: bold !important;
+ color: #888 !important;
+ text-transform: uppercase !important;
+ letter-spacing: 0.5px !important;
+ margin-top: 2px !important;
+}
+/* Talent Slots wrapper — outer gold border to unify the two subcontainers */
+.sheet-talent-slots-block {
+ width: 100%;
+ border: 1px solid #ab8b57;
+ border-radius: 5px;
+ box-sizing: border-box;
+ margin-bottom: 10px;
+}
+/* hdice-dsaves-container inside talent-slots: flex row, centered */
+.sheet-talent-slots-block .sheet-hdice-dsaves-container {
+ display: flex !important;
+ flex-direction: row !important;
+ justify-content: space-around !important;
+ align-items: flex-start !important;
+ width: 100% !important;
+ padding: 4px 0 6px !important;
+}
+/* Remove double-border on subcontainers nested inside the new wrapper */
+.sheet-talent-slots-block .sheet-subcontainer {
+ border: none !important;
+ border-radius: 0 !important;
+ float: none !important;
+ display: flex !important;
+ flex-direction: column !important;
+ align-items: center !important;
+ flex: 1;
+}
+/* Add a right divider between the two subcontainers instead */
+.sheet-talent-slots-block .sheet-subcontainer:not(:last-child) {
+ border-right: 1px solid rgba(171,139,87,0.4) !important;
+}
+/* Center .top row (Rank label + input) */
+.sheet-talent-slots-block .sheet-top {
+ display: flex !important;
+ flex-direction: column !important;
+ align-items: center !important;
+ width: 100% !important;
+}
+.sheet-talent-slots-block .sheet-top span {
+ text-align: center !important;
+ margin-left: 0 !important;
+}
+/* Center .speed wrapper */
+.sheet-talent-slots-block .sheet-speed {
+ display: flex !important;
+ flex-direction: column !important;
+ align-items: center !important;
+ width: 100% !important;
+}
+/* Center numbers and labels */
+.sheet-talent-slots-block input[type=number],
+.sheet-talent-slots-block input[type=text] {
+ text-align: center !important;
+ margin: 0 auto !important;
+}
+.sheet-talent-slots-block span.sheet-label {
+ text-align: center !important;
+ display: block !important;
+ margin: 2px 0 0 !important;
+ font-family: 'Oxanium', sans-serif !important;
+ font-size: 9px !important;
+ font-weight: bold !important;
+ color: #888 !important;
+ text-transform: uppercase !important;
+ letter-spacing: 0.5px !important;
+}
+/* Esper Mastery — remove old bottom-label margin hacks */
+.sheet-em-section-body {
+ padding: 4px 0 6px;
+}
+/* Remove stale margin-top from .tp now that header handles spacing */
+.sheet-page.sheet-powers .sheet-tp {
+ margin-top: 0 !important;
+}
+.sheet-page.sheet-powers .sheet-class_options.sheet-esper-mastery {
+ margin-top: 0 !important;
+}
+
+/* Character name — Oxanium small-caps bold */
+.sheet-char-info-right .sheet-name-fields input {
+ font-family: 'Oxanium', sans-serif !important;
+ font-variant: small-caps !important;
+ font-size: 20px !important;
+ font-weight: bold !important;
+ color: #245485 !important;
+ border: none !important;
+ border-bottom: none !important;
+ background: none !important;
+ padding: 0 !important;
+ width: 100% !important;
+ box-shadow: none !important;
+}
+.sheet-char-info-right .sheet-name-fields .sheet-label {
+ display: none !important;
+}
+
+/* Info display: stacked column layout */
+.sheet-header-info.sheet-display .sheet-hlabel-container {
+ display: flex !important;
+ flex-direction: column !important;
+ width: 100% !important;
+ min-width: 0 !important;
+ margin-left: 0 !important;
+}
+/* Info display fields — small, bold, no underlines, no labels */
+.sheet-header-info.sheet-display input {
+ width: 100% !important;
+ font-size: 10px !important;
+ font-weight: bold !important;
+ border: none !important;
+ background: none !important;
+ box-shadow: none !important;
+ padding: 0 !important;
+ box-sizing: border-box !important;
+}
+.sheet-header-info.sheet-display .sheet-label {
+ display: none !important;
+}
+/* XP row — full width, left-aligned with "Exp:" prefix */
+.sheet-header-info.sheet-display .sheet-xp-row {
+ display: flex !important;
+ flex-direction: row !important;
+ align-items: baseline !important;
+ gap: 3px !important;
+ margin-top: 1px !important;
+}
+.sheet-header-info.sheet-display .sheet-xp-row .sheet-xp-prefix {
+ font-size: 10px !important;
+ font-weight: bold !important;
+ color: inherit !important;
+ white-space: nowrap !important;
+ display: inline !important;
+}
+.sheet-header-info.sheet-display .sheet-xp-row input {
+ width: auto !important;
+ flex: 1 !important;
}
.sheet-hlabel-container {
@@ -386,12 +1917,55 @@ input[type=radio].sheet-npc-button.sheet-ships + span {
}
.sheet-body {
- width: 750px;
- margin-top: 22px;
+ width: 860px;
+ margin-top: 40px;
+}
+
+.sheet-page.sheet-core .sheet-body {
+ display: flex;
+ align-items: flex-start;
+ gap: 10px;
+}
+.sheet-page.sheet-core .sheet-body .sheet-col2 {
+ flex: 1.30;
+}
+.sheet-page.sheet-core .sheet-body .sheet-col1,
+.sheet-page.sheet-core .sheet-body .sheet-col3 {
+ flex: 0.85;
+}
+
+/* Powers page body: flex layout with gap between spell columns only */
+.sheet-page.sheet-spells .sheet-body {
+ display: flex;
+ flex-wrap: wrap;
+ column-gap: 12px;
+ align-items: flex-start;
+}
+/* Full-width rows (Power Settings, ESPER POWERS header) stay full-width.
+ display:block !important overrides Roll20's inline-block on .sheet-col.
+ !important on flex beats the .sheet-col rule (same specificity, later cascade). */
+.sheet-page.sheet-spells .sheet-body > .sheet-col-full {
+ flex: 0 0 100% !important;
+ width: 100% !important;
+ display: block !important;
+}
+/* powers-stats-row also spans full width but must stay display:flex
+ so Talent Points / Talent Slots / Esper Mastery remain in a flex row. */
+.sheet-page.sheet-spells .sheet-body > .sheet-powers-stats-row {
+ flex: 0 0 100% !important;
+ width: 100% !important;
+}
+/* Spell columns share available width equally; override Roll20 inline-block */
+.sheet-page.sheet-spells .sheet-body > .sheet-col {
+ flex: 1;
+ width: auto !important;
+ display: block !important;
+ vertical-align: unset;
}
.sheet-col {
width: 32.97%;
+ flex: 1;
}
.sheet-col-full {
@@ -436,7 +2010,7 @@ input[type=radio].sheet-npc-button.sheet-ships + span {
font-weight: bold;
}
-.sheet-saving-throw button[type=roll], .sheet-skill button[type=roll], .sheet-ac-init-speed-container button[type=roll], .sheet-subcontainer button[type=roll], .sheet-npc button[type=roll] {
+.sheet-saving-throw button[type=roll], .sheet-skill button[type=roll], .sheet-subcontainer button[type=roll], .sheet-npc button[type=roll] {
background-color: transparent;
color: black;
border: none;
@@ -451,7 +2025,7 @@ input[type=radio].sheet-npc-button.sheet-ships + span {
font-weight: bold;
}
-.sheet-attr-container button[type=roll]::before, .sheet-saving-throw button[type=roll]::before, .sheet-skill button[type=roll]::before, .sheet-ac-init-speed-container button[type=roll]::before, .sheet-subcontainer button[type=roll]::before, .sheet-npc button[type=roll]::before {
+.sheet-attr-container button[type=roll]::before, .sheet-saving-throw button[type=roll]::before, .sheet-skill button[type=roll]::before, .sheet-subcontainer button[type=roll]::before, .sheet-npc button[type=roll]::before {
content: "" !important;
}
@@ -460,14 +2034,14 @@ input[type=radio].sheet-npc-button.sheet-ships + span {
}
button[type=roll]:hover {
- color: #00ba73;
+ color: #066dce;
}
button[type=roll]:hover * {
- color: #00ba73;
+ color: #066dce;
}
.sheet-spell button[type=roll]:hover input[type=text], .sheet-action .sheet-display button[type=roll]:hover * {
- color: #00ba73;
+ color: #066dce;
}
button[type=roll] * {
@@ -530,10 +2104,8 @@ button[type=roll] * {
}
.sheet-skills-saves-container {
- width: 163px;
- margin-right: 5px;
- display: inline-block;
- vertical-align: top;
+ width: 100%;
+ display: block;
}
.sheet-insp-prof-container {
@@ -607,7 +2179,244 @@ button[type=roll] * {
color: black;
}
-.sheet-saving-throw input[type=text], .sheet-skill input[type=text], .sheet-ac-init-speed-container input, .sheet-hp input, .sheet-tp input, .sheet-exhaustion input {
+/* Passive Wisdom (Perception) — restyled to match Proficiency Bonus display */
+.sheet-passive-wis-display {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 4px 8px;
+ border: 1px solid #ab8b57;
+ border-radius: 6px;
+ margin-bottom: 4px;
+ box-sizing: border-box;
+}
+.sheet-passive-wis-display .sheet-value {
+ display: flex;
+ align-items: center;
+ width: auto;
+ height: auto;
+ border: none;
+ background: transparent;
+ border-radius: 0;
+ position: static;
+ flex-shrink: 0;
+ order: 2;
+}
+.sheet-passive-wis-display .sheet-value span {
+ font-family: 'Oxanium', sans-serif;
+ font-size: 16px !important;
+ font-weight: bold;
+ color: #ab8b57 !important;
+ line-height: 1.2 !important;
+ width: auto;
+ text-align: right;
+}
+.sheet-passive-wis-display .sheet-label {
+ flex: 1;
+ width: auto;
+ height: auto;
+ margin-left: 0;
+ margin-top: 0;
+ border: none;
+ background: transparent;
+ vertical-align: baseline;
+ display: flex;
+ align-items: center;
+ order: 1;
+}
+.sheet-passive-wis-display .sheet-label span {
+ font-family: 'Oxanium', sans-serif;
+ font-size: 9px !important;
+ font-weight: bold;
+ color: #888 !important;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+ line-height: 1.2 !important;
+ width: auto;
+ text-align: left;
+}
+/* ---- Inspiration + Initiative row ---- */
+.sheet-insp-init-row {
+ display: flex;
+ gap: 6px;
+ margin-bottom: 8px;
+ align-items: stretch;
+}
+
+/* Inspiration toggle button */
+.sheet-insp-button {
+ flex: 1 1 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 7px;
+ background: #e8e8e8;
+ border: 1px solid #ab8b57;
+ border-radius: 6px;
+ padding: 8px 12px;
+ cursor: pointer;
+ transition: background 0.2s, border-color 0.2s;
+ user-select: none;
+ min-height: 34px;
+ box-sizing: border-box;
+}
+.sheet-insp-button input[type=checkbox] {
+ display: none;
+}
+/* Material Symbols icon — default gold, hollow (FILL=0) */
+.sheet-eg-icon {
+ font-family: 'Material Symbols Outlined';
+ font-size: 22px;
+ flex-shrink: 0;
+ color: #ab8b57;
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;
+ display: inline-block !important;
+ vertical-align: middle;
+ line-height: 1;
+ user-select: none;
+}
+/* Inspiration label text */
+.sheet-insp-text {
+ font-family: 'Oxanium', sans-serif;
+ font-size: 14px;
+ font-weight: bold;
+ color: #ab8b57;
+ font-variant: small-caps;
+ letter-spacing: 1px;
+ display: inline !important;
+ line-height: 1;
+}
+/* CHECKED STATE — gold background, white text + white icon */
+.sheet-insp-button:has(input[type=checkbox]:checked) {
+ background: #ab8b57;
+ border-color: #ab8b57;
+}
+.sheet-insp-button input[type=checkbox]:checked ~ .sheet-insp-text {
+ color: #fff;
+}
+.sheet-insp-button input[type=checkbox]:checked ~ .sheet-eg-icon {
+ color: #fff;
+ font-variation-settings: 'FILL' 1, 'wght' 400, 'GRAD' 0, 'opsz' 24;
+}
+
+/* Initiative roll button */
+.sheet-init-button {
+ flex: 1 1 0;
+ background: #066dce !important;
+ border: none !important;
+ border-radius: 6px;
+ color: #fff !important;
+ font-family: 'Oxanium', sans-serif;
+ font-size: 14px !important;
+ font-weight: bold;
+ padding: 8px 4px !important;
+ cursor: pointer;
+ font-variant: small-caps;
+ letter-spacing: 1px;
+ display: flex !important;
+ align-items: center;
+ justify-content: center;
+ gap: 3px;
+ box-shadow: none !important;
+ text-shadow: none !important;
+ min-height: 34px;
+ box-sizing: border-box;
+ white-space: nowrap;
+}
+.sheet-init-button::before {
+ content: "" !important;
+}
+.sheet-init-button span {
+ display: inline !important;
+ font-size: 14px !important;
+ color: #fff !important;
+ font-weight: bold;
+}
+.sheet-init-button:hover {
+ background: #0558b0 !important;
+}
+
+/* PB + Level Up row */
+.sheet-pb-levelup-row {
+ display: flex;
+ gap: 6px;
+ margin-bottom: 8px;
+ align-items: stretch;
+}
+/* Proficiency Bonus compact display */
+.sheet-pb-display {
+ flex: 1 1 0;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 4px 8px;
+ border: 1px solid #ab8b57;
+ border-radius: 6px;
+}
+.sheet-pb-value {
+ font-family: 'Oxanium', sans-serif;
+ font-size: 16px !important;
+ font-weight: bold;
+ color: #ab8b57 !important;
+ display: inline-block !important;
+ line-height: 1.2;
+}
+.sheet-pb-label {
+ font-family: 'Oxanium', sans-serif;
+ font-size: 9px !important;
+ font-weight: bold;
+ color: #888 !important;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+ display: inline !important;
+ line-height: 1.2;
+}
+/* Level Up button */
+.sheet-levelup-button {
+ flex: 1 1 0;
+ display: flex !important;
+ align-items: center;
+ justify-content: center;
+ background: #e8e8e8;
+ border: 1px solid #066dce;
+ border-radius: 6px;
+ padding: 4px 8px;
+ cursor: pointer;
+ font-family: 'Oxanium', sans-serif;
+ font-size: 14px;
+ font-weight: bold;
+ color: #066dce;
+ font-variant: small-caps;
+ letter-spacing: 1px;
+ transition: background 0.2s, color 0.2s, box-shadow 0.2s;
+ box-sizing: border-box;
+ box-shadow: none !important;
+ text-shadow: none !important;
+}
+.sheet-levelup-button::before {
+ content: "" !important;
+}
+.sheet-levelup-button:hover {
+ background: #066dce !important;
+ color: #fff !important;
+ border-color: #066dce !important;
+ box-shadow: 0 0 8px rgba(6, 109, 206, 0.6) !important;
+}
+.sheet-levelup-icon {
+ font-family: 'Material Symbols Outlined' !important;
+ font-size: 22px !important;
+ font-weight: 300 !important;
+ font-style: normal !important;
+ line-height: 1 !important;
+ vertical-align: middle !important;
+ margin-left: 4px !important;
+ font-variation-settings: 'FILL' 0, 'wght' 300, 'GRAD' 0, 'opsz' 20 !important;
+ text-transform: none !important;
+ font-variant: normal !important;
+ letter-spacing: normal !important;
+}
+
+.sheet-saving-throw input[type=text], .sheet-skill input[type=text], .sheet-hp input, .sheet-tp input, .sheet-exhaustion input {
width: 100%;
text-align: center;
font-size: 20px;
@@ -633,7 +2442,7 @@ button[type=roll] * {
color: black;
}
-.sheet-attacks input, .sheet-equipment input, .sheet-tool input, .sheet-proficiencies input, .sheet-pc .sheet-traits input, .sheet-spell input, .sheet-options .sheet-body input {
+.sheet-attacks input, .sheet-equipment input, .sheet-tool input, .sheet-proficiencies input, .sheet-pc .sheet-traits input, .sheet-spell input, .sheet-options .sheet-body input, .sheet-settings-modal-body input {
width: 100%;
text-align: center;
font-size: 20px;
@@ -667,7 +2476,8 @@ button[type=roll] * {
}
.sheet-saving-throw-container, .sheet-skills-container {
- width: 165px;
+ width: 100%;
+ box-sizing: border-box;
border: 1px solid #ab8b57;
border-radius: 5px;
margin-bottom: 10px;
@@ -675,7 +2485,7 @@ button[type=roll] * {
}
.sheet-saving-throw, .sheet-skill {
- width: 165px;
+ width: 100%;
height: 18px;
}
@@ -704,7 +2514,7 @@ button[type=roll] * {
text-align: left;
}
-.sheet-saving-throw-container .sheet-label span, .sheet-skills-container .sheet-label span, .sheet-textbox-container .sheet-label span, .sheet-ac-init-speed-container span.sheet-label, .sheet-hp span, .sheet-tp span, .sheet-exhaustion span.sheet-label, .sheet-hdice-dsaves-container span, .sheet-attacks span, .sheet-globalattack span, .sheet-equipment span, .sheet-textbox span, .sheet-tool_proficiencies span, .sheet-proficiencies span, .sheet-traits span, .sheet-spells span, .sheet-options .sheet-body span {
+.sheet-saving-throw-container .sheet-label span, .sheet-skills-container .sheet-label span, .sheet-textbox-container .sheet-label span, .sheet-ac-init-speed-container span.sheet-label, .sheet-hp span, .sheet-tp span, .sheet-exhaustion span.sheet-label, .sheet-hdice-dsaves-container span, .sheet-attacks span, .sheet-globalattack span, .sheet-equipment span, .sheet-textbox span, .sheet-tool_proficiencies span, .sheet-proficiencies span, .sheet-traits span, .sheet-spells span, .sheet-options .sheet-body span, .sheet-settings-modal-body span {
display: block;
font-size: 9px;
line-height: 12px;
@@ -732,34 +2542,61 @@ button[type=roll] * {
width: 3.5em;
}
-.sheet-exhaustion div span.sheet-ex-description {
- font-size: 9px;
- line-height: 9px;
- text-align: left;
- width: 116px;
- display: block;
+/* ---- Exhaustion Level section redesign ---- */
+.sheet-exhaustion {
+ display: flex;
+ align-items: flex-start;
+ gap: 10px;
+ padding: 8px 12px 10px 12px;
+ padding-top: 32px;
}
.sheet-exhaustion span.sheet-label {
- width: 100%;
- display: inline-block;
+ position: absolute !important;
+ top: 0 !important;
+ bottom: auto !important;
+ left: 0;
+ right: 0;
+ display: block !important;
text-align: center;
+ border-bottom: 1px solid rgba(171,139,87,0.5);
+ border-radius: 4px 4px 0 0;
+ padding: 5px 0;
+ box-sizing: border-box;
+ font-family: 'Oxanium', sans-serif !important;
+ font-size: 10px !important;
+ font-weight: bold !important;
+ color: #245485 !important;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+ width: auto !important;
+ margin-top: 0 !important;
+}
+.sheet-exhaustion input[type=number] {
+ flex: 0 0 80px;
+ width: 80px;
+ display: block;
+ vertical-align: unset;
+ font-size: 28px;
+ font-weight: bold;
}
.sheet-exhaustion div.sheet-ex-descriptions {
- display: inline-block;
- padding-top: 5px;
+ flex: 1;
+ display: block;
+ padding-top: 3px;
+}
+.sheet-exhaustion div span.sheet-ex-description {
+ width: 100% !important;
+ font-size: 10px;
+ line-height: 13px;
+ text-align: left;
+ display: block;
}
.sheet-exhaustion-toggle[value="0"] ~ .sheet-exhaustion {
display: none;
}
-.sheet-exhaustion input[type=number] {
- width: 116px;
- display: inline-block;
- vertical-align: top;
-}
-
-.sheet-skill button span, .sheet-options .sheet-body .sheet-skill span span, .sheet-rolltemplate-spell .sheet-grey {
+.sheet-skill button span, .sheet-options .sheet-body .sheet-skill span span, .sheet-settings-modal-body .sheet-skill span span, .sheet-rolltemplate-spell .sheet-grey {
color: #A0A0A0;
font-weight: normal;
}
@@ -767,14 +2604,161 @@ button[type=roll] * {
.sheet-textbox-container {
border: 1px solid #ab8b57;
border-radius: 5px;
- width: 243px;
+ width: 100%;
+ box-sizing: border-box;
}
.sheet-tool_proficiencies {
border: 1px solid #ab8b57;
border-radius: 5px;
- width: 243px;
+ width: 100%;
+ box-sizing: border-box;
padding-bottom: 10px;
+ padding-top: 28px;
+}
+/* ---- Tool Proficiencies section redesign ---- */
+/* Section title — repositioned to top, styled like Attacks label */
+.sheet-tool_proficiencies > .sheet-label {
+ top: 0 !important;
+ bottom: auto !important;
+ left: 0;
+ right: 0;
+ border-bottom: 1px solid rgba(171,139,87,0.5);
+ border-radius: 4px 4px 0 0;
+ padding: 5px 0;
+ box-sizing: border-box;
+}
+.sheet-tool_proficiencies > .sheet-label span {
+ display: inline !important;
+ font-family: 'Oxanium', sans-serif;
+ font-size: 10px !important;
+ font-weight: bold !important;
+ color: #245485 !important;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+ width: auto !important;
+ margin-top: 0 !important;
+}
+/* Column header row (TOOL / PRO / ATTRIBUTE) — flex, left-aligned with data */
+.sheet-tool_proficiencies .sheet-top {
+ display: flex !important;
+ align-items: center;
+ background: transparent;
+ padding: 7px 6px 3px 6px;
+ border-bottom: 1px solid rgba(171,139,87,0.2);
+ box-sizing: border-box;
+}
+.sheet-tool_proficiencies .sheet-top span[data-i18n="tool-u"] {
+ display: inline-block !important;
+ flex: 1 !important;
+ width: auto !important;
+ font-size: 9px !important;
+ color: #888 !important;
+ font-weight: normal !important;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ text-align: left !important;
+ margin-top: 0 !important;
+ line-height: normal !important;
+}
+.sheet-tool_proficiencies .sheet-top span[data-i18n="pro-u"] {
+ display: inline-block !important;
+ width: 44px !important;
+ flex-shrink: 0;
+ font-size: 9px !important;
+ color: #888 !important;
+ font-weight: normal !important;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ text-align: center !important;
+ margin-top: 0 !important;
+ line-height: normal !important;
+}
+.sheet-tool_proficiencies .sheet-top span[data-i18n="attr-u"] {
+ display: inline-block !important;
+ width: 80px !important;
+ flex-shrink: 0;
+ font-size: 9px !important;
+ color: #888 !important;
+ font-weight: normal !important;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ text-align: center !important;
+ margin-top: 0 !important;
+ line-height: normal !important;
+}
+/* Roll button — flex row layout + clear Roll20 green */
+.charsheet .sheet-tool_proficiencies .sheet-tool .sheet-display button[type=roll] {
+ display: flex !important;
+ align-items: center !important;
+ background-color: transparent !important;
+ background-image: none !important;
+ border: none !important;
+ box-shadow: none !important;
+ color: #111 !important;
+ padding: 3px 6px !important;
+ width: 100% !important;
+ box-sizing: border-box !important;
+}
+/* Kill green mouseover highlight */
+.charsheet .sheet-tool_proficiencies .sheet-tool .sheet-display button[type=roll]:hover {
+ color: #111 !important;
+ background: transparent !important;
+ background-color: transparent !important;
+}
+.charsheet .sheet-tool_proficiencies .sheet-tool .sheet-display button[type=roll]:hover * {
+ color: inherit !important;
+ background: transparent !important;
+}
+/* Tool name span — expands to fill remaining width */
+.sheet-tool_proficiencies .sheet-tool .sheet-display button span {
+ flex: 1 !important;
+ width: auto !important;
+ font-size: 12px !important;
+ font-weight: bold !important;
+ text-align: left;
+ background: transparent !important;
+}
+/* Bonus display (first text input) — 44px, centered */
+.sheet-tool_proficiencies .sheet-tool .sheet-display button input[type=text]:first-of-type {
+ width: 44px !important;
+ flex-shrink: 0;
+ text-align: center !important;
+ font-size: 12px !important;
+ font-weight: normal !important;
+ background: transparent !important;
+ border: none !important;
+}
+/* Attribute input (last text input) — 80px, centered */
+.sheet-tool_proficiencies .sheet-tool .sheet-display button input[type=text]:last-of-type {
+ width: 80px !important;
+ flex-shrink: 0;
+ text-align: center !important;
+ font-size: 12px !important;
+ font-weight: normal !important;
+ background: transparent !important;
+ border: none !important;
+}
+/* Subtle blue row-hover tint */
+.sheet-tool_proficiencies .sheet-tool:hover .sheet-display {
+ background: rgba(36, 84, 133, 0.04) !important;
+}
+/* Gear icon — Material Symbols gold gear */
+.sheet-tool_proficiencies .sheet-tool .sheet-options-flag + span {
+ font-family: 'Material Symbols Outlined' !important;
+ font-size: 14px !important;
+ color: #ab8b57 !important;
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24 !important;
+ text-transform: none !important;
+ font-variant: normal !important;
+ line-height: 1;
+ user-select: none;
+ opacity: 0.6;
+ align-items: center;
+ justify-content: center;
+}
+.sheet-tool_proficiencies .sheet-tool:hover .sheet-options-flag + span {
+ opacity: 1;
}
.sheet-attacks {
@@ -788,23 +2772,135 @@ button[type=roll] * {
}
.sheet-ac-init-speed-container, .sheet-hp, .sheet-tp, .sheet-exhaustion, .sheet-hdice-dsaves-container, .sheet-attacks, .sheet-equipment {
- width: 240px;
+ width: 100%;
+ box-sizing: border-box;
margin-bottom: 10px;
}
-.sheet-ac-init-speed-container div {
- width: calc(31%);
- height: 100%;
+/* === AC / Speed — two independent boxes === */
+.sheet-ac-init-speed-container {
+ display: flex;
+ gap: 6px;
+}
+.sheet-ac-box, .sheet-speed-box {
+ flex: 1 1 0;
border: 1px solid #ab8b57;
- border-radius: 5px;
- display: inline-block;
- vertical-align: top;
+ border-radius: 6px;
+ padding: 4px 8px 6px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 2px;
+ box-sizing: border-box;
}
-.sheet-ac-init-speed-container span.sheet-label {
- margin-top: 0px;
+.sheet-ac-box-header, .sheet-speed-box-header {
+ display: flex;
+ align-items: center;
+ width: 100%;
}
-.sheet-ac-init-speed-container button[type=roll] {
- display: block;
+.sheet-ac-box-header::before, .sheet-speed-box-header::before {
+ content: '';
+ width: 16px;
+ flex-shrink: 0;
+}
+.sheet-ac-box-label, .sheet-speed-box-label {
+ flex: 1;
+ font-family: 'Oxanium', sans-serif;
+ font-size: 9px;
+ font-weight: bold;
+ color: #245485;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+ text-align: center;
+}
+/* Gear toggle — right end */
+.sheet-ac-gear-toggle, .sheet-speed-gear-toggle {
+ width: 16px;
+ flex-shrink: 0;
+ display: flex;
+ justify-content: flex-end;
+ align-items: center;
+ cursor: pointer;
+}
+.sheet-ac-gear-toggle input[type=checkbox],
+.sheet-speed-gear-toggle input[type=checkbox] { display: none; }
+.sheet-ac-gear-icon, .sheet-speed-gear-icon {
+ font-family: 'Material Symbols Outlined';
+ font-size: 14px;
+ color: #ab8b57;
+ opacity: 0.6;
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;
+ display: inline-block !important;
+ line-height: 1;
+ user-select: none;
+ transition: opacity 0.2s, color 0.2s;
+}
+.sheet-ac-gear-toggle:hover .sheet-ac-gear-icon,
+.sheet-speed-gear-toggle:hover .sheet-speed-gear-icon { opacity: 1; }
+.sheet-ac-box:has(.sheet-ac-expand-cb:checked) .sheet-ac-gear-icon,
+.sheet-speed-box:has(.sheet-speed-expand-cb:checked) .sheet-speed-gear-icon {
+ color: #066dce;
+ opacity: 1;
+ font-variation-settings: 'FILL' 1, 'wght' 400, 'GRAD' 0, 'opsz' 24;
+}
+/* Main value */
+.sheet-ac-box > input[type=text],
+.sheet-speed-box > input[type=text] {
+ font-size: 28px !important;
+ font-weight: bold;
+ color: #000 !important;
+ background: none !important;
+ border: none !important;
+ box-shadow: none !important;
+ text-align: center;
+ width: 100% !important;
+ padding: 0;
+ line-height: 1.1;
+}
+/* Details panel */
+.sheet-ac-details, .sheet-speed-details {
+ display: none;
+ flex-direction: row;
+ gap: 4px;
+ width: 100%;
+ padding-top: 6px;
+ border-top: 1px solid rgba(171,139,87,0.3);
+}
+.sheet-ac-box:has(.sheet-ac-expand-cb:checked) .sheet-ac-details { display: flex; }
+.sheet-speed-box:has(.sheet-speed-expand-cb:checked) .sheet-speed-details { display: flex; }
+/* Detail items */
+.sheet-detail-item {
+ flex: 1 1 0;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ background: rgba(171,139,87,0.08);
+ border-radius: 4px;
+ padding: 4px 2px;
+ gap: 2px;
+}
+.sheet-detail-item input[type=text], .sheet-detail-value {
+ font-family: 'Oxanium', sans-serif;
+ font-size: 12px !important;
+ font-weight: bold;
+ color: #333 !important;
+ background: none !important;
+ border: none !important;
+ box-shadow: none !important;
+ text-align: center;
+ width: 100% !important;
+ padding: 0;
+ line-height: 1.2;
+ display: block !important;
+}
+.sheet-detail-label {
+ font-size: 8px !important;
+ color: #888 !important;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ display: block !important;
+ text-align: center;
+ line-height: 1;
}
.sheet-hp, .sheet-tp, .sheet-exhaustion, .sheet-subcontainer, .sheet-attacks, .sheet-equipment {
@@ -883,13 +2979,19 @@ button[type=roll] * {
vertical-align: top;
height: 64px;
}
-.sheet-subcontainer input[type=text].sheet-label {
+.sheet-subcontainer input[type=text].sheet-label,
+.sheet-subcontainer span.sheet-label {
display: block;
font-size: 9px;
line-height: 12px;
width: 100%;
text-align: center;
font-weight: bold;
+ font-variant: small-caps;
+ text-transform: uppercase;
+}
+.sheet-subcontainer span.sheet-label {
+ margin-top: 4px;
}
.sheet-hdice-dsaves-container .sheet-row-container {
@@ -984,6 +3086,154 @@ button[type=roll] * {
.sheet-attacks {
min-height: 150px;
margin-bottom: 10px;
+ overflow: hidden;
+}
+
+/* ---- Attacks section redesign ---- */
+.sheet-attacks .sheet-global-dmg > span.sheet-label,
+.sheet-attacks > span.sheet-label {
+ font-family: 'Oxanium', sans-serif;
+ color: #245485;
+ letter-spacing: 1px;
+ position: static;
+ text-align: left;
+ font-size: 11px;
+ font-weight: bold;
+ text-transform: uppercase;
+ padding: 4px 8px 2px;
+ border-bottom: 1px solid rgba(171,139,87,0.3);
+ margin-top: 0;
+}
+.sheet-attacks .sheet-attack {
+ position: relative !important;
+}
+.sheet-attacks .sheet-top.sheet-atk-header {
+ display: flex;
+ align-items: center;
+ width: calc(100% + 10px);
+ padding: 5px 4px 5px 8px;
+ border-bottom: 1px solid rgba(171,139,87,0.5);
+ box-sizing: border-box;
+}
+.sheet-attacks .sheet-atk-col-name {
+ flex: 1;
+ font-family: 'Oxanium', sans-serif;
+ font-size: 9px;
+ font-weight: bold;
+ color: #888;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ display: block !important;
+ width: auto !important;
+}
+.sheet-attacks .sheet-atk-col-range,
+.sheet-attacks .sheet-atk-col-hit,
+.sheet-attacks .sheet-atk-col-dmg {
+ flex-shrink: 0;
+ text-align: center;
+ font-size: 9px;
+ font-weight: bold;
+ color: #888;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ width: 60px !important;
+}
+.sheet-attacks .sheet-atk-col-dmg { width: 96px !important; }
+.sheet-attacks .sheet-attack + .sheet-attack .sheet-display {
+ border-top: 1px solid rgba(171,139,87,0.2);
+}
+.sheet-attacks .sheet-attack:nth-child(even) .sheet-display {
+ background: rgba(0,0,0,0.02);
+}
+.sheet-attacks .repitem:nth-child(even) {
+ background-color: #f4fafd;
+}
+.sheet-attacks .sheet-display {
+ position: relative;
+}
+.sheet-attacks .sheet-display button[type=roll] {
+ display: inline-flex !important;
+ flex-direction: row !important;
+ align-items: center !important;
+ width: calc(100% - 22px) !important;
+ padding: 4px 4px 4px 8px !important;
+ min-height: 32px;
+}
+.sheet-attacks .sheet-display .sheet-atk-name-cell,
+.sheet-attacks .sheet-display .sheet-atk-range-cell,
+.sheet-attacks .sheet-display .sheet-atk-bonus-cell,
+.sheet-attacks .sheet-display .sheet-atk-dmg-cell {
+ background: none !important;
+ border-radius: 0 !important;
+ padding: 0 !important;
+ margin: 0 !important;
+ min-height: 0 !important;
+ vertical-align: middle !important;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ border: none !important;
+ box-shadow: none !important;
+}
+.sheet-attacks .sheet-display .sheet-atk-name-cell {
+ flex: 1;
+ text-align: left;
+ font-size: 12px !important;
+ font-weight: bold !important;
+ color: #111;
+}
+.sheet-attacks .sheet-display .sheet-atk-range-cell {
+ width: 60px;
+ flex-shrink: 0;
+ text-align: center;
+ font-size: 11px !important;
+ font-weight: normal !important;
+ color: #555;
+}
+.sheet-attacks .sheet-display .sheet-atk-bonus-cell {
+ width: 60px;
+ flex-shrink: 0;
+ text-align: center;
+ font-size: 11px !important;
+ font-weight: bold !important;
+ color: #066dce;
+}
+.sheet-attacks .sheet-display .sheet-atk-dmg-cell {
+ width: 96px;
+ flex-shrink: 0;
+ text-align: center;
+ font-size: 11px !important;
+ color: #333;
+}
+.sheet-attacks .sheet-options-flag {
+ right: 0 !important;
+ width: 22px !important;
+ height: 32px !important;
+}
+.sheet-attacks .sheet-options-flag + span {
+ right: 0 !important;
+ width: 22px !important;
+ height: 32px !important;
+ display: none;
+ align-items: center;
+ justify-content: center;
+ font-family: 'Material Symbols Outlined' !important;
+ font-size: 14px !important;
+ color: #ab8b57 !important;
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24 !important;
+ text-transform: none !important;
+ font-variant: normal !important;
+ line-height: 1;
+ user-select: none;
+}
+.sheet-attacks .sheet-attack:hover .sheet-display {
+ background: rgba(36, 84, 133, 0.06) !important;
+}
+.sheet-attacks .sheet-display button[type=roll]:hover * {
+ color: inherit !important;
+}
+.sheet-attacks .sheet-display button[type=roll]:hover input[type=text] {
+ color: inherit !important;
}
.sheet-equipment.sheet-hidden {
@@ -1048,6 +3298,34 @@ button[type=roll] * {
display: inline;
}
+/* ---- Features & Traits section — header to top ---- */
+.sheet-textbox.sheet-traits {
+ position: relative;
+ padding-top: 28px;
+ padding-bottom: 10px;
+}
+.sheet-textbox.sheet-traits > span.sheet-label {
+ position: absolute !important;
+ top: 0 !important;
+ bottom: auto !important;
+ left: 0;
+ right: 0;
+ display: block !important;
+ text-align: center;
+ border-bottom: 1px solid rgba(171,139,87,0.5);
+ border-radius: 4px 4px 0 0;
+ padding: 5px 0;
+ box-sizing: border-box;
+ font-family: 'Oxanium', sans-serif !important;
+ font-size: 10px !important;
+ font-weight: bold !important;
+ color: #245485 !important;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+ width: auto !important;
+ margin-top: 0 !important;
+}
+
.sheet-spell .sheet-details-flag, .sheet-attacks .sheet-options-flag, .sheet-spell .sheet-options-flag, .sheet-tool .sheet-options-flag, .sheet-npc .sheet-npc_options-flag, .sheet-npcs .sheet-npc_options-flag, .sheet-ships .sheet-npc_options-flag {
opacity: 0;
position: absolute;
@@ -1098,7 +3376,12 @@ button[type=roll] * {
color: #000000;
}
-.sheet-pc .sheet-global-mod .sheet-options-flag:not(:checked) ~ .sheet-display, .sheet-pc .sheet-global-mod .sheet-options-flag:checked ~ .sheet-options {
+.sheet-pc .sheet-global-mod .sheet-options-flag:not(:checked) ~ .sheet-display {
+ width: 80%;
+ display: inline-flex;
+ align-items: center;
+}
+.sheet-pc .sheet-global-mod .sheet-options-flag:checked ~ .sheet-options {
width: 80%;
display: inline-block;
}
@@ -1118,6 +3401,33 @@ button[type=roll] * {
.sheet-pc .sheet-trait:hover .sheet-output {
display: flex;
+ color: #245485 !important;
+}
+.sheet-pc .sheet-trait:hover .sheet-output:hover {
+ color: #1a3d64 !important;
+}
+/* Gear icon — Material Symbols outlined gold gear (span text is "y"/pictos, hidden via font-size:0;
+ ::before injects the "settings" ligature in Material Symbols Outlined) */
+.sheet-pc .sheet-trait .sheet-options-flag + span {
+ font-family: 'Material Symbols Outlined' !important;
+ font-size: 0 !important;
+ color: #ab8b57 !important;
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24 !important;
+ text-transform: none !important;
+ font-variant: normal !important;
+ opacity: 0.6;
+}
+.sheet-pc .sheet-trait .sheet-options-flag + span::before {
+ content: 'settings';
+ font-size: 14px;
+ line-height: 18px;
+}
+.sheet-pc .sheet-trait:hover .sheet-options-flag + span {
+ color: #ab8b57 !important;
+ opacity: 1;
+}
+.sheet-pc .sheet-trait:hover .sheet-options-flag:hover + span {
+ color: #8a6d3e !important;
}
.sheet-pc .sheet-header:hover .sheet-options-flag + span {
display: flex;
@@ -1221,9 +3531,16 @@ button[type=roll] * {
.sheet-header-info.sheet-options span {
display: inline-block;
font-weight: bold;
+ font-size: 9px;
}
-.sheet-header-info.sheet-options input {
- width: 170px;
+.sheet-header-info.sheet-options input,
+.sheet-header-info.sheet-options select {
+ width: 70px;
+ font-size: 10px;
+}
+.sheet-header-info.sheet-options .sheet-row {
+ line-height: 1.4;
+ margin-bottom: 2px;
}
.sheet-level {
@@ -1283,6 +3600,10 @@ button[type=roll] * {
.sheet-spell-labels {
color: #A0A0A0;
+ display: none;
+}
+.sheet-slot_type[value="tech"] ~ .sheet-body .sheet-spell-labels {
+ display: block;
}
.sheet-spell-labels span {
display: inline;
@@ -1446,6 +3767,7 @@ button[type=roll] * {
font-size: 16px;
text-transform: capitalize;
font-variant: small-caps;
+ font-weight: bold;
color: #245485;
}
.sheet-spell .sheet-details input[name=attr_spellcomp_materials][value=""] + span, .sheet-spell .sheet-details input[name=attr_spellathigherlevels][value=""] + div {
@@ -1650,13 +3972,18 @@ span.sheet-spellritual, span.sheet-spellconcentration {
padding-left: 5px;
}
-.sheet-tool .sheet-options span, .sheet-attack .sheet-options span, .sheet-spell .sheet-options span, .sheet-options .sheet-body span, .sheet-proficiencies .sheet-options span, .sheet-traits .sheet-options span, .sheet-global-mod .sheet-options span {
+.sheet-tool .sheet-options span, .sheet-attack .sheet-options span, .sheet-spell .sheet-options span, .sheet-options .sheet-body span, .sheet-settings-modal-body span, .sheet-proficiencies .sheet-options span, .sheet-traits .sheet-options span, .sheet-global-mod .sheet-options span {
width: initial;
display: inline-block;
text-align: left;
}
+.sheet-settings-modal-body .sheet-row.sheet-title span {
+ display: block;
+ text-align: center;
+ width: 100%;
+}
-.sheet-tool .sheet-options input, .sheet-attack .sheet-options input[type=text], .sheet-spell .sheet-options input[type=text], .sheet-options .sheet-body input[type=text], .sheet-proficiencies .sheet-options input[type=text], .sheet-traits .sheet-options input[type=text], .sheet-global-mod .sheet-options input[type=text] {
+.sheet-tool .sheet-options input, .sheet-attack .sheet-options input[type=text], .sheet-spell .sheet-options input[type=text], .sheet-options .sheet-body input[type=text], .sheet-settings-modal-body input[type=text], .sheet-proficiencies .sheet-options input[type=text], .sheet-traits .sheet-options input[type=text], .sheet-global-mod .sheet-options input[type=text] {
display: inline-block;
text-align: left;
font-size: 12px;
@@ -1665,7 +3992,7 @@ span.sheet-spellritual, span.sheet-spellconcentration {
width: initial;
}
-.sheet-tool .sheet-options select, .sheet-attack .sheet-options select, .sheet-spell .sheet-options select, .sheet-options .sheet-body select, .sheet-proficiencies .sheet-options select, .sheet-traits .sheet-options select {
+.sheet-tool .sheet-options select, .sheet-attack .sheet-options select, .sheet-spell .sheet-options select, .sheet-options .sheet-body select, .sheet-settings-modal-body select, .sheet-proficiencies .sheet-options select, .sheet-traits .sheet-options select {
border-bottom: 1px solid #D3D3D3;
border-top: 0px;
border-left: 0px;
@@ -1685,14 +4012,14 @@ span.sheet-spellritual, span.sheet-spellconcentration {
height: 18px;
}
-.sheet-tool .sheet-options input[type=checkbox], .sheet-attack .sheet-options input[type=checkbox], .sheet-spell .sheet-options input[type=checkbox], .sheet-options .sheet-body input[type=checkbox], .sheet-npc .sheet-npc_options input[type=checkbox], .sheet-proficiencies .sheet-options input[type=checkbox], .sheet-traits .sheet-options input[type=checkbox], .sheet-global-mod .sheet-options input[type=checkbox] {
+.sheet-tool .sheet-options input[type=checkbox], .sheet-attack .sheet-options input[type=checkbox], .sheet-spell .sheet-options input[type=checkbox], .sheet-options .sheet-body input[type=checkbox], .sheet-settings-modal-body input[type=checkbox], .sheet-npc .sheet-npc_options input[type=checkbox], .sheet-proficiencies .sheet-options input[type=checkbox], .sheet-traits .sheet-options input[type=checkbox], .sheet-global-mod .sheet-options input[type=checkbox] {
width: 13px;
font-size: initial;
-webkit-appearance: checkbox;
-moz-appearance: checkbox;
}
-.sheet-attack .sheet-options input[type=text].sheet-num, .sheet-options input[type=text].sheet-num {
+.sheet-attack .sheet-options input[type=text].sheet-num, .sheet-options input[type=text].sheet-num, .sheet-settings-modal-body input[type=text].sheet-num {
width: 15px;
text-align: center;
}
@@ -1880,6 +4207,7 @@ span.sheet-spellritual, span.sheet-spellconcentration {
font-size: 16px;
text-transform: capitalize;
font-variant: small-caps;
+ font-weight: bold;
color: #245485;
}
.sheet-spell .sheet-details input[name=attr_spellcomp_materials][value=""] + span, .sheet-spell .sheet-details input[name=attr_spellathigherlevels][value=""] + div {
@@ -1964,49 +4292,6 @@ span.sheet-spellritual, span.sheet-spellconcentration {
border-bottom-right-radius: 0.8em;
}
-/* Obsolete Template */
-.sheet-rolltemplate-simple .sheet-containerold, .sheet-rolltemplate-atk .sheet-containerold, .sheet-rolltemplate-atkdmg .sheet-container.sheet-atkold {
- background-repeat: no-repeat;
- background-size: 14em 100%;
- color: black;
- width: 81%;
-}
-
-.sheet-rolltemplate-dmg .sheet-atkold, .sheet-rolltemplate-dmg .sheet-containerold {
- background-repeat: no-repeat;
- background-size: 14em 100%;
- color: black;
- width: 81%;
-}
-
-.sheet-rolltemplate-atkdmg .sheet-container.sheet-damagetemplateold {
- background-repeat: no-repeat;
- background-size: 14em 100%;
- color: black;
- width: 81%;
-}
-
-/* Obsolete Template */
-.sheet-rolltemplate-simple .sheet-containerold {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/53WSdhx.png") top left;
-}
-
-/* Obsolete Template */
-.sheet-rolltemplate-atk .sheet-containerold, .sheet-rolltemplate-atkdmg .sheet-container.sheet-atkold {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/4RCRsAd.png") top left;
-}
-
-.sheet-rolltemplate-dmg .sheet-atkold {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/4RCRsAd.png") top left;
-}
-.sheet-rolltemplate-dmg .sheet-containerold {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/gw9HTsq.png") top left;
-}
-
-/* Obsolete Template */
-.sheet-rolltemplate-atkdmg .sheet-container.sheet-damagetemplateold {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/gw9HTsq.png") top left;
-}
.sheet-rolltemplate-atkdmg .sheet-damagetemplate .sheet-result {
min-height: 45px;
}
@@ -2312,18 +4597,6 @@ span.sheet-spellritual, span.sheet-spellconcentration {
min-height: 17px;
}
-/* Obsolete Template */
-.sheet-rolltemplate-atk .sheet-descold, .sheet-rolltemplate-atkdmg .sheet-descold, .sheet-rolltemplate-dmg .sheet-descold {
- background-repeat: no-repeat;
- background-size: 14em 100%;
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/4988JS0.png") top left;
- color: black;
- padding-bottom: 5px;
- padding-top: 5px;
- text-align: center;
- width: 189px;
-}
-
.sheet-rolltemplate-atk .sheet-desc, .sheet-rolltemplate-atkdmg .sheet-desc, .sheet-rolltemplate-dmg .sheet-desc, .sheet-rolltemplate-desc .sheet-desc {
background-color: white;
border: 1px solid black;
@@ -2531,6 +4804,7 @@ span.sheet-spellritual, span.sheet-spellconcentration {
line-height: 12px;
text-align: left;
font-weight: bold;
+ margin-right: 6px;
}
.sheet-npc .sheet-npc_options .sheet-title span {
text-align: center;
@@ -2593,6 +4867,7 @@ span.sheet-spellritual, span.sheet-spellconcentration {
.sheet-npc .sheet-display .sheet-num3 {
width: 27px;
text-align: center;
+ margin-right: 4px;
}
.sheet-npc .sheet-display .sheet-actype + .sheet-parens {
display: none;
@@ -2601,10 +4876,12 @@ span.sheet-spellritual, span.sheet-spellconcentration {
display: inline;
}
.sheet-npc .sheet-display .sheet-parens {
- margin-left: -2px;
+ margin-left: 0px;
+ font-size: 13px;
+ font-weight: normal;
}
.sheet-npc .sheet-display .sheet-parens:before {
- content: "(";
+ content: " (";
}
.sheet-npc .sheet-display .sheet-parens.sheet-xp:before {
content: " (";
@@ -2714,10 +4991,10 @@ span.sheet-spellritual, span.sheet-spellconcentration {
}
.sheet-negativeflag[value="1"] + .sheet-npcattr::before {
- content: "(";
+ content: " (";
}
.sheet-negativeflag[value="0"] + .sheet-npcattr::before {
- content: "(+";
+ content: " (+";
}
.sheet-npcattr::after {
@@ -2935,6 +5212,7 @@ span.sheet-spellritual, span.sheet-spellconcentration {
text-align: left;
font-family: "Source Sans Pro", "Varta", arial, sans-serif;
font-variant: small-caps;
+ font-weight: bold;
}
.sheet-rolltemplate-traits .sheet-header {
@@ -3076,6 +5354,127 @@ span.sheet-spellritual, span.sheet-spellconcentration {
margin-bottom: 15px;
}
+/* ---- Other Proficiencies & Languages section redesign ---- */
+.sheet-textbox-container.sheet-proficiencies {
+ padding-top: 28px;
+ padding-bottom: 10px;
+ position: relative;
+}
+.sheet-textbox-container.sheet-proficiencies > .sheet-label {
+ position: absolute !important;
+ top: 0 !important;
+ bottom: auto !important;
+ left: 0;
+ right: 0;
+ text-align: center;
+ border-bottom: 1px solid rgba(171,139,87,0.5);
+ border-radius: 4px 4px 0 0;
+ padding: 5px 0;
+ box-sizing: border-box;
+}
+.sheet-textbox-container.sheet-proficiencies > .sheet-label span {
+ display: inline !important;
+ font-family: 'Oxanium', sans-serif;
+ font-size: 10px !important;
+ font-weight: bold !important;
+ color: #245485 !important;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+ width: auto !important;
+ margin-top: 0 !important;
+}
+.sheet-proficiencies .sheet-complex {
+ width: 100% !important;
+ padding-top: 0 !important;
+ margin-bottom: 0 !important;
+}
+.sheet-proficiencies .sheet-complex .sheet-top {
+ display: flex !important;
+ align-items: center;
+ background: transparent;
+ padding: 7px 6px 3px 6px;
+ border-bottom: 1px solid rgba(171,139,87,0.2);
+ box-sizing: border-box;
+}
+.sheet-proficiencies .sheet-complex .sheet-top span {
+ display: inline-block !important;
+ font-size: 9px !important;
+ color: #888 !important;
+ font-weight: normal !important;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ margin-top: 0 !important;
+ line-height: normal !important;
+}
+.sheet-proficiencies .sheet-complex .sheet-top span[data-i18n="type-u"] {
+ width: 78px !important;
+ flex-shrink: 0;
+ text-align: left !important;
+}
+.sheet-proficiencies .sheet-complex .sheet-top span[data-i18n="proficency-u"] {
+ flex: 1 !important;
+ width: auto !important;
+ text-align: left !important;
+}
+.charsheet .sheet-proficiencies .sheet-proficiency .sheet-display button[type=roll] {
+ display: flex !important;
+ align-items: center !important;
+ background-color: transparent !important;
+ background-image: none !important;
+ border: none !important;
+ box-shadow: none !important;
+ color: #111 !important;
+ padding: 3px 6px !important;
+ width: 100% !important;
+ box-sizing: border-box !important;
+}
+.charsheet .sheet-proficiencies .sheet-proficiency .sheet-display button[type=roll]:hover {
+ color: #111 !important;
+ background: transparent !important;
+ background-color: transparent !important;
+}
+.charsheet .sheet-proficiencies .sheet-proficiency .sheet-display button[type=roll]:hover * {
+ color: inherit !important;
+ background: transparent !important;
+}
+.sheet-proficiencies .sheet-proficiency .sheet-display button span[name="attr_prof_type"] {
+ width: 78px !important;
+ flex-shrink: 0;
+ font-size: 11px !important;
+ font-weight: bold !important;
+ text-align: left !important;
+ background: transparent !important;
+}
+.sheet-proficiencies .sheet-proficiency .sheet-display button span[name="attr_name"] {
+ flex: 1 !important;
+ width: auto !important;
+ font-size: 12px !important;
+ font-weight: bold !important;
+ text-align: left !important;
+ background: transparent !important;
+}
+.sheet-proficiencies .sheet-proficiency:hover .sheet-display {
+ background: rgba(36, 84, 133, 0.04) !important;
+}
+.sheet-proficiencies .sheet-proficiency .sheet-options-flag + span {
+ font-family: 'Material Symbols Outlined' !important;
+ font-size: 0 !important;
+ color: #ab8b57 !important;
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24 !important;
+ text-transform: none !important;
+ font-variant: normal !important;
+ user-select: none;
+ opacity: 0.6;
+}
+.sheet-proficiencies .sheet-proficiency .sheet-options-flag + span::before {
+ content: 'settings';
+ font-size: 14px;
+ line-height: 18px;
+}
+.sheet-proficiencies .sheet-proficiency:hover .sheet-options-flag + span {
+ opacity: 1;
+}
+
.sheet-pictos {
font-family: pictos;
}
@@ -3207,7 +5606,7 @@ span.sheet-spellritual, span.sheet-spellconcentration {
font-size: 0.25em;
}
-.charsheet .sheet-options .sheet-body .sheet-version input[type=text] {
+.charsheet .sheet-options .sheet-body .sheet-version input[type=text], .charsheet .sheet-settings-modal-body .sheet-version input[type=text] {
border-bottom: none;
width: 20px;
}
@@ -3251,7 +5650,7 @@ span.sheet-spellritual, span.sheet-spellconcentration {
}
.sheet-hlabel-container [name=attr_race_display] {
- width: 200px;
+ width: 160px;
}
.sheet-hlabel-container [name=attr_alignment] {
width: 180px;
@@ -3296,10 +5695,10 @@ span.sheet-spellritual, span.sheet-spellconcentration {
display: inline-block;
}
-.sheet-options .sheet-body input[type=text].sheet-pb_custom {
+.sheet-options .sheet-body input[type=text].sheet-pb_custom, .sheet-settings-modal-body input[type=text].sheet-pb_custom {
display: none;
}
-.sheet-options .sheet-body input[value=custom] + input[type=text].sheet-pb_custom {
+.sheet-options .sheet-body input[value=custom] + input[type=text].sheet-pb_custom, .sheet-settings-modal-body input[value=custom] + input[type=text].sheet-pb_custom {
display: inline-block;
}
@@ -3370,6 +5769,27 @@ span.sheet-spellritual, span.sheet-spellconcentration {
text-align: center;
font-weight: bold;
}
+/* "Gained?" checkboxes — circular blue pip with dotted border, filled when checked */
+.sheet-esper-mastery .sheet-sub-button input[type=checkbox] {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ display: block !important;
+ width: 14px !important;
+ height: 14px !important;
+ border-radius: 50% !important;
+ border: 1.5px dashed #066dce !important;
+ background: transparent !important;
+ cursor: pointer !important;
+ margin: 2px auto !important;
+ padding: 0 !important;
+ box-shadow: none !important;
+}
+.sheet-esper-mastery .sheet-sub-button input[type=checkbox]:checked {
+ background: #066dce !important;
+ border-color: #066dce !important;
+ border-style: solid !important;
+}
.sheet-licensecontainer.active-drop-target.dropping, .sheet-monster_confirm_flag[value="1"] ~ .sheet-licensecontainer, .sheet-mancer_confirm_flag[value="1"] ~ .sheet-licensecontainer {
opacity: 0.5;
@@ -3459,7 +5879,7 @@ span.sheet-spellritual, span.sheet-spellconcentration {
}
.sheet-header .sheet-display .sheet-class-display {
- width: 298px;
+ width: 180px; /* overridden to 100% in new header-info.sheet-display block */
text-transform: capitalize;
overflow: hidden;
word-wrap: break-word;
@@ -3640,38 +6060,7 @@ span.sheet-spellritual, span.sheet-spellconcentration {
right: 50px;
width: 91px;
}
-.lang-es input[type=radio].sheet-tab-button.sheet-core {
- right: 137px;
- width: 76px;
-}
-.lang-es input[type=radio].sheet-tab-button.sheet-core + span {
- right: 137px;
- width: 76px;
-}
-.lang-es input[type=radio].sheet-tab-button.sheet-bio {
- right: 103px;
- width: 30px;
-}
-.lang-es input[type=radio].sheet-tab-button.sheet-bio + span {
- right: 103px;
- width: 30px;
-}
-.lang-es input[type=radio].sheet-tab-button.sheet-spells {
- right: 21px;
- width: 78px;
-}
-.lang-es input[type=radio].sheet-tab-button.sheet-spells + span {
- right: 21px;
- width: 78px;
-}
-
/* Czech */
-.charsheet.lang-cs input[type=radio].sheet-tab-button.sheet-core {
- width: 53px;
-}
-.charsheet.lang-cs input[type=radio].sheet-tab-button.sheet-core + span {
- width: 53px;
-}
.charsheet.lang-cs select[name=attr_cust_spellslots] {
font-size: 9px;
}
@@ -3699,30 +6088,6 @@ span.sheet-spellritual, span.sheet-spellconcentration {
.charsheet.lang-cs .sheet-hlabel-container input.sheet-class-level {
width: 28px;
}
-.charsheet.lang-it input[type=radio].sheet-tab-button.sheet-core {
- right: 146px;
- width: 60px;
-}
-.charsheet.lang-it input[type=radio].sheet-tab-button.sheet-core + span {
- right: 146px;
- width: 60px;
-}
-.charsheet.lang-it input[type=radio].sheet-tab-button.sheet-bio {
- right: 113px;
- width: 30px;
-}
-.charsheet.lang-it input[type=radio].sheet-tab-button.sheet-bio + span {
- right: 113px;
- width: 30px;
-}
-.charsheet.lang-it input[type=radio].sheet-tab-button.sheet-spells {
- right: 20px;
- width: 90px;
-}
-.charsheet.lang-it input[type=radio].sheet-tab-button.sheet-spells + span {
- right: 20px;
- width: 90px;
-}
.charsheet.lang-it div.sheet-licensecontainer .sheet-container.sheet-pc .sheet-spells .sheet-header .sheet-header-info .sheet-part {
width: 23%;
}
@@ -4808,9 +7173,13 @@ body:not(:-moz-handler-blocked) .sheet-charmancer .sheet-bottombar {
display: inline;
margin-left: 25px;
}
+.sheet-pc div.sheet-global-dmg .sheet-global-mod {
+ display: flex;
+ align-items: center;
+}
.sheet-pc div.sheet-global-dmg div.sheet-display {
- margin-bottom: 2px;
- width: 90% !important;
+ flex: 1;
+ min-width: 0;
}
.sheet-pc div.sheet-global-dmg div.sheet-display span.sheet-title {
padding-right: 0px;
@@ -4848,36 +7217,43 @@ div.sheet-globaldisplay span {
}
.sheet-pc .sheet-global-mod .sheet-options-flag:not(:checked) ~ .sheet-display .sheet-title {
- background-color: #EFEFEF;
- border-bottom-right-radius: 5px;
- border-top-left-radius: 5px;
- display: inline-block;
- font-size: 9px;
+ background-color: transparent;
+ flex: 1;
+ min-width: 0;
+ font-size: 12px;
font-weight: bold;
- line-height: 16px;
- padding-bottom: 3px;
- padding-left: 4px;
- padding-right: 4px;
- padding-top: 3px;
+ color: #111;
+ padding: 0;
text-align: left;
}
.sheet-pc .sheet-global-mod .sheet-options-flag:not(:checked) ~ .sheet-display .sheet-subheader {
- background-color: #EFEFEF;
- border-bottom-right-radius: 5px;
- border-top-left-radius: 5px;
- display: inline-block;
- font-size: 9px;
- font-weight: bold;
- height: 16px;
- padding-bottom: 3px;
- padding-left: 4px;
- padding-right: 4px;
- padding-top: 3px;
- text-align: left;
+ background-color: transparent !important;
+ display: flex !important;
+ flex-shrink: 0;
+ align-items: center;
+ padding: 0 !important;
+ height: auto !important;
+ width: auto !important;
+}
+.sheet-pc .sheet-global-mod .sheet-options-flag:not(:checked) ~ .sheet-display .sheet-subheader span {
+ background: transparent !important;
+ width: 60px !important;
+ text-align: center !important;
+ display: block !important;
+ flex-shrink: 0;
+ font-size: 11px !important;
+ font-weight: normal !important;
+ color: #555 !important;
+ padding: 0 !important;
+ margin: 0 !important;
+}
+.sheet-pc .sheet-global-mod .sheet-options-flag:not(:checked) ~ .sheet-display .sheet-subheader span:last-child {
+ width: 96px !important;
}
.sheet-pc .sheet-global-mod .sheet-active-flag {
- position: relative;
- top: -5px;
+ flex-shrink: 0;
+ align-self: center;
+ margin-right: 6px;
}
.sheet-pc .sheet-global-mod .sheet-options-flag:checked ~ .sheet-active-flag {
margin-bottom: 50px;
@@ -4885,6 +7261,24 @@ div.sheet-globaldisplay span {
.sheet-pc .sheet-global-mod .sheet-options-flag:checked ~ .sheet-display {
display: none;
}
+/* Gear icon — global-mod rows */
+.sheet-pc .sheet-global-mod .sheet-options-flag + span {
+ font-family: 'Material Symbols Outlined' !important;
+ font-size: 0 !important;
+ color: #ab8b57 !important;
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24 !important;
+ text-transform: none !important;
+ font-variant: normal !important;
+ opacity: 0.6;
+}
+.sheet-pc .sheet-global-mod .sheet-options-flag + span::before {
+ content: 'settings';
+ font-size: 14px;
+ line-height: 18px;
+}
+.sheet-pc .sheet-global-mod:hover .sheet-options-flag + span {
+ opacity: 1;
+}
/* Level HP Bar */
.sheet-charmancer .sheet-levels-hp-row {
@@ -5092,874 +7486,10 @@ div.sheet-globaldisplay span {
padding-right: 0.2em;
}
-/* styling the featured slide's spell selection */
-/* DnD5E OFFICIAL CONTENT CSS */
-/* LICENSED SHEET */
-div.sheet-licensecontainer.sheet-licensedsheet, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer {
- /* NPC & MONSTER TEMPLATE */
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-page > div.sheet-header, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-page > div.sheet-header {
- margin-left: -50px;
- width: 850px;
- height: 140px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-advantagetoggle, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-advantagetoggle {
- top: 140px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-page.sheet-core > div.sheet-header, div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-page.sheet-options > div.sheet-header {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/CharScroll.svg?sanitize=true");
- background-repeat: no-repeat;
- background-size: cover;
- background-position: 2px center;
-}
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-page.sheet-core > div.sheet-header, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-page.sheet-options > div.sheet-header {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/CharScroll.svg?sanitize=true");
- background-repeat: no-repeat;
- background-size: cover;
- background-position: 2px center;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-page.sheet-bio > div.sheet-header, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-page.sheet-bio > div.sheet-header {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/BioScroll.svg?sanitize=true");
- background-repeat: no-repeat;
- background-size: cover;
- background-position: 2px center;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-page.sheet-spells > div.sheet-header, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-page.sheet-spells > div.sheet-header {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/SpellScroll.svg?sanitize=true");
- background-repeat: no-repeat;
- background-size: cover;
- background-position: 2px center;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-page > div.sheet-header::after, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-page > div.sheet-header::after {
- content: "";
- width: 30px;
- height: 162px;
- position: absolute;
- right: -60px;
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/ScrollRight.svg?sanitize=true");
- background-repeat: no-repeat;
- background-position: right center;
- background-size: 100% 100%;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-page div.sheet-header div.sheet-name-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-page div.sheet-header div.sheet-name-container {
- width: 250px;
- display: inline-block;
- margin-left: 60px;
- margin-top: 72px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-page div.sheet-header div.sheet-name-container img, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-page div.sheet-header div.sheet-name-container img {
- display: none;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-page div.sheet-header div.sheet-name-container span, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-page div.sheet-header div.sheet-name-container span {
- margin-top: 16px;
- margin-left: 35px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header-info, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header-info {
- border: none;
- margin-left: 54px;
- width: 440px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_background], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_background] {
- width: 138px !important;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_race], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_race] {
- width: 180px !important;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_alignment], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_alignment] {
- width: 140px !important;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_experience], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_experience] {
- width: 98px !important;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_age], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_age], div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_height], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_height], div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_weight], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_weight] {
- width: 100px !important;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_eyes], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_eyes], div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_skin], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_skin], div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_hair], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_hair] {
- width: 140px !important;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-spells div.sheet-header-info div.sheet-part, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-spells div.sheet-header-info div.sheet-part {
- width: 144px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-spells div.sheet-header-info div.sheet-part select, div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-spells div.sheet-header-info div.sheet-part input {
- border: none;
-}
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-spells div.sheet-header-info div.sheet-part select, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-spells div.sheet-header-info div.sheet-part input {
- border: none;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-spells div.sheet-header-info div.sheet-part select[name=attr_spellcasting_ability], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-spells div.sheet-header-info div.sheet-part select[name=attr_spellcasting_ability] {
- text-align-last: center;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header div.sheet-part span.sheet-display, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header div.sheet-part span.sheet-display {
- border: none;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-footer, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-footer {
- display: none;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) input[type=radio].sheet-tab-button, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) input[type=radio].sheet-tab-button {
- top: 140px;
-}
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) input[type=radio].sheet-tab-button + span, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) input[type=radio].sheet-tab-button + span {
- top: 140px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-advantagetoggle, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-advantagetoggle {
- top: 140px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet div.sheet-npc div.sheet-triangle, div.sheet-licensecontainer.sheet-licensedsheet div.sheet-triangle {
- border: none;
- border-top: 3px solid transparent;
- border-bottom: 3px solid transparent;
- border-left: 360px solid #245485;
- margin-top: 5px;
- margin-bottom: 5px;
-}
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer div.sheet-npc div.sheet-triangle, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer div.sheet-triangle {
- border: none;
- border-top: 3px solid transparent;
- border-bottom: 3px solid transparent;
- border-left: 360px solid #245485;
- margin-top: 5px;
- margin-bottom: 5px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container.sheet-pc .sheet-header .sheet-options-flag, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container.sheet-pc .sheet-header .sheet-options-flag, div.sheet-licensecontainer.sheet-licensedsheet .sheet-container.sheet-pc .sheet-header .sheet-options-flag + span, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container.sheet-pc .sheet-header .sheet-options-flag + span {
- top: 45px;
- right: -15px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container.sheet-pc .sheet-header .sheet-header-info, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container.sheet-pc .sheet-header .sheet-header-info {
- margin-top: 30px;
- margin-left: 51px;
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/CharBox.svg?sanitize=true");
- background-position: 0;
- padding: 14px;
- background-size: cover;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container.sheet-pc .sheet-spells .sheet-header .sheet-header-info, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container.sheet-pc .sheet-spells .sheet-header .sheet-header-info {
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/SpellBox.svg?sanitize=true");
- display: inline-flex;
- justify-content: space-around;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container.sheet-pc .sheet-spells .sheet-header .sheet-header-info .sheet-part, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container.sheet-pc .sheet-spells .sheet-header .sheet-header-info .sheet-part {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/SpellHeadBlock.svg?sanitize=true");
- background-position: top center;
- background-size: contain;
- background-repeat: no-repeat;
- width: 30%;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attributes-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attributes-container {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/ability-back.svg?sanitize=true");
- margin: 0 !important;
- background-repeat: no-repeat;
- background-size: cover;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container {
- width: auto;
- border: 0;
- margin: 0 !important;
- margin-top: 20px !important;
- background-position: top center !important;
- background-repeat: no-repeat !important;
- background-size: contain !important;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/ability-STR.svg?sanitize=true");
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container ~ .sheet-attr-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container ~ .sheet-attr-container {
- margin-top: 8px !important;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container + .sheet-attr-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container + .sheet-attr-container {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/ability-DEX.svg?sanitize=true");
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container + .sheet-attr-container + .sheet-attr-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container + .sheet-attr-container + .sheet-attr-container {
- /* constitution is abbrivated CNS instead of CON
- * * because windows has that term reserved */
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/ability-CNS.svg?sanitize=true");
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/ability-INT.svg?sanitize=true");
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/ability-WIS.svg?sanitize=true");
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/ability-CHA.svg?sanitize=true");
- margin-bottom: 20px !important;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container button, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container button {
- font-size: 6.5px !important;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container .sheet-attr, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container .sheet-attr {
- font-size: 35px;
- font-weight: bold;
- position: relative;
- top: -5px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container .sheet-attr-mod, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container .sheet-attr-mod {
- border: none;
- background: transparent;
- margin-top: -10px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container .sheet-attr-mod .sheet-baseattr, div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container .sheet-attr-mod .sheet-attr-flag, div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container .sheet-attr-mod .sheet-finalattr {
- font-size: 18px !important;
-}
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container .sheet-attr-mod .sheet-baseattr, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container .sheet-attr-mod .sheet-attr-flag, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container .sheet-attr-mod .sheet-finalattr {
- font-size: 18px !important;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-insp-prof-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-insp-prof-container {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/inspiration.svg?sanitize=true");
- background-repeat: no-repeat;
- background-size: cover;
- height: 40px;
- margin-bottom: 2px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-insp-prof-container + .sheet-insp-prof-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-insp-prof-container + .sheet-insp-prof-container {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/proficency-bonus.svg?sanitize=true");
- background-repeat: no-repeat;
- background-size: cover;
- height: 50px;
- margin-bottom: 2px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-insp-prof-container .sheet-value, div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-insp-prof-container .sheet-label {
- border: none;
- background: transparent;
-}
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-insp-prof-container .sheet-value, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-insp-prof-container .sheet-label {
- border: none;
- background: transparent;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-insp-prof-container .sheet-value, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-insp-prof-container .sheet-value {
- margin-top: 2px;
- margin-left: 3px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-insp-prof-container .sheet-label, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-insp-prof-container .sheet-label {
- width: calc(100% - 42px);
- margin-left: 0;
- margin-top: 5px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-insp-prof-container + .sheet-insp-prof-container .sheet-value, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-insp-prof-container + .sheet-insp-prof-container .sheet-value {
- margin-top: 8px;
- margin-left: 6px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-insp-prof-container + .sheet-insp-prof-container .sheet-label, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-insp-prof-container + .sheet-insp-prof-container .sheet-label {
- width: calc(100% - 42px);
- margin-left: -3px;
- margin-top: 10px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-saving-throw-container, div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-skills-container {
- position: relative;
- box-sizing: border-box;
- padding: 5px 5px 15px;
- border: 10px solid black;
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/saves.svg?sanitize=true");
- border-image-slice: 65 10;
- border-image-width: auto;
- border-image-repeat: round;
-}
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-saving-throw-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-skills-container {
- position: relative;
- box-sizing: border-box;
- padding: 5px 5px 15px;
- border: 10px solid black;
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/saves.svg?sanitize=true");
- border-image-slice: 65 10;
- border-image-width: auto;
- border-image-repeat: round;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-saving-throw-container .sheet-label, div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-skills-container .sheet-label {
- position: absolute;
- width: 100%;
- bottom: -5px;
- margin: 0 calc(-5px);
-}
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-saving-throw-container .sheet-label, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-skills-container .sheet-label {
- position: absolute;
- width: 100%;
- bottom: -5px;
- margin: 0 calc(-5px);
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-core .sheet-col2, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-core .sheet-col2 {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/vitals.svg?sanitize=true");
- background-repeat: no-repeat;
- background-position: top center;
- background-size: contain;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container, div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-hdice-dsaves-container {
- width: 100% !important;
- margin: 0;
- padding: 10px 8px 0;
- box-sizing: border-box;
- display: flex;
- justify-content: space-between;
-}
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-hdice-dsaves-container {
- width: 100% !important;
- margin: 0;
- padding: 10px 8px 0;
- box-sizing: border-box;
- display: flex;
- justify-content: space-between;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-hdice-dsaves-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-hdice-dsaves-container {
- padding: 0 8px 10px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-resources .sheet-hdice-dsaves-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-resources .sheet-hdice-dsaves-container {
- padding: 0 0 10px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-ac, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-ac {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/AC.svg?sanitize=true");
- background-repeat: no-repeat;
- background-position: center center;
- background-size: contain;
- min-height: 75px !important;
- border: 0 !important;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-ac input, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-ac input {
- margin-top: 10px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-ac .sheet-pc-ac, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-ac .sheet-pc-ac {
- width: 50% !important;
- margin: 0 auto;
- line-height: 8px !important;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-init, div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-speed {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/vital-box.svg?sanitize=true");
- background-repeat: no-repeat;
- background-position: center center;
- background-size: contain;
- border: 0 !important;
- min-height: 75px !important;
- position: relative;
-}
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-init, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-speed {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/vital-box.svg?sanitize=true");
- background-repeat: no-repeat;
- background-position: center center;
- background-size: contain;
- border: 0 !important;
- min-height: 75px !important;
- position: relative;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-init button, div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-speed .sheet-label {
- position: absolute;
- bottom: 5px;
-}
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-hp .sheet-label {
- position: absolute;
- bottom: 5px;
-}
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-init button, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-speed .sheet-label {
- position: absolute;
- bottom: 5px;
-}
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-hp .sheet-label {
- position: absolute;
- bottom: 5px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-init span, div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-speed input {
- display: inline-block;
- margin-top: 15px;
-}
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-init span, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-speed input {
- display: inline-block;
- margin-top: 15px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-hp, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-hp {
- position: relative;
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/vital-top.svg?sanitize=true");
- background-repeat: no-repeat;
- background-position: center center;
- background-size: contain;
- border: 0 !important;
- width: calc(100% - 16px);
- height: 95px;
- margin: 5px 8px 0;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-hp .sheet-top, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-hp .sheet-top {
- padding-top: 3px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-hp .sheet-top span, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-hp .sheet-top span {
- margin-left: 10px !important;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-hp .sheet-top input, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-hp .sheet-top input {
- width: 132px !important;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-hp + .sheet-hp, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-hp + .sheet-hp {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/vital-bottom.svg?sanitize=true");
- background-repeat: no-repeat;
- background-position: center center;
- background-size: contain;
- min-height: 70px;
- margin: 0 8px 5px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-subcontainer, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-subcontainer {
- --topNotchSize:7px;
- --bottomNotchSize:6px;
- box-sizing: border-box;
- margin-top: 5px;
- width: 49%;
- background: #fff;
- border: 5px solid black;
- border-top-width: 2px;
- border-bottom-width: 2px;
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/vital-box.svg?sanitize=true");
- border-image-slice: 15 15;
- border-image-width: auto;
- border-image-repeat: round;
- -webkit-clip-path: polygon(0% var(--topNotchSize), var(--topNotchSize) 0%, calc(100% - var(--topNotchSize)) 0%, 100% var(--topNotchSize), 100% calc(100% - var(--bottomNotchSize)), calc(100% - var(--bottomNotchSize)) 100%, var(--bottomNotchSize) 100%, 0% calc(100% - var(--bottomNotchSize)));
- clip-path: polygon(0% var(--topNotchSize), var(--topNotchSize) 0%, calc(100% - var(--topNotchSize)) 0%, 100% var(--topNotchSize), 100% calc(100% - var(--bottomNotchSize)), calc(100% - var(--bottomNotchSize)) 100%, var(--bottomNotchSize) 100%, 0% calc(100% - var(--bottomNotchSize)));
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-subcontainer .sheet-row-container input[type=checkbox], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-subcontainer .sheet-row-container input[type=checkbox] {
- margin: 0px -2px;
- border-radius: 50%;
- border: 2px solid #000 !important;
- width: 1em;
- height: 1em;
- background-color: white;
- vertical-align: middle;
- -webkit-appearance: none;
- outline: none;
- cursor: pointer;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-subcontainer .sheet-row-container input[type=checkbox]:checked, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-subcontainer .sheet-row-container input[type=checkbox]:checked {
- background-color: #00ba73;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-subcontainer .sheet-top input, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-subcontainer .sheet-top input {
- width: 60px !important;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attacks, div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-proficiencies, div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-traits, div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-equipment, div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-exhaustion {
- box-sizing: border-box;
- width: 100%;
- margin-top: 10px;
- border: 5px solid black;
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/5eBorder.svg?sanitize=true");
- border-image-slice: 6% 8% 12% 8%;
- border-image-width: 16px 19px 32px 19px;
- border-image-repeat: round;
-}
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attacks, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-proficiencies, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-traits, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-equipment, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-exhaustion {
- box-sizing: border-box;
- width: 100%;
- margin-top: 10px;
- border: 5px solid black;
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/5eBorder.svg?sanitize=true");
- border-image-slice: 6% 8% 12% 8%;
- border-image-width: 16px 19px 32px 19px;
- border-image-repeat: round;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-display button *, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-display button * {
- min-width: 15%;
- max-width: 33%;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-col1 > .sheet-insp-prof-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-col1 > .sheet-insp-prof-container {
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/perception.svg?sanitize=true");
- background-position: center center;
- background-repeat: no-repeat;
- background-size: contain;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-col1 > .sheet-insp-prof-container .sheet-value, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-col1 > .sheet-insp-prof-container .sheet-value {
- margin-top: 3px;
- margin-left: 5px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-col1 > .sheet-insp-prof-container .sheet-label, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-col1 > .sheet-insp-prof-container .sheet-label {
- position: absolute;
- width: calc(33% - 42px) !important;
- margin-left: 0;
- margin-top: 5px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-tool_proficiencies, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-tool_proficiencies {
- box-sizing: border-box;
- width: 100%;
- margin-top: 5px;
- border: 5px solid black;
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/proficiency-block.svg?sanitize=true");
- border-image-slice: 5 10;
- border-image-width: 15px;
- border-image-repeat: round;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-proficiencies .sheet-display button *, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-proficiencies .sheet-display button * {
- min-width: 33%;
- max-width: 50%;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-pibf, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-pibf {
- position: relative;
- box-sizing: border-box;
- width: 100%;
- min-height: 6em;
- margin-top: 5px;
- border: 15px solid black;
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/vital-top.svg?sanitize=true");
- border-image-slice: 35 15;
- border-image-width: auto;
- border-image-repeat: round;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-pibf + .sheet-pibf, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-pibf + .sheet-pibf {
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/vital-mid.svg?sanitize=true");
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-pibf + .sheet-pibf + .sheet-pibf + .sheet-pibf, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-pibf + .sheet-pibf + .sheet-pibf + .sheet-pibf {
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/vital-bottom.svg?sanitize=true");
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-pibf .sheet-display, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-pibf .sheet-display {
- padding: 0;
- position: relative;
- top: -5px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-pibf .sheet-options-flag, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-pibf .sheet-options-flag {
- top: -5px;
- right: -10px;
-}
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-pibf .sheet-options-flag ~ span, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-pibf .sheet-options-flag ~ span {
- top: -5px;
- right: -10px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-pibf .sheet-label, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-pibf .sheet-label {
- position: absolute;
- top: unset !important;
- right: unset !important;
- bottom: -10px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-coin, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-coin {
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/copper.svg?sanitize=true");
- background-position: center center;
- background-repeat: no-repeat;
- background-size: contain;
- border: none;
- border-radius: 0;
- margin: 5px 0;
- background-color: transparent;
- position: relative;
- left: -9px;
- height: 30px;
- width: 75px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-coin .sheet-label, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-coin .sheet-label {
- position: relative;
- margin: 0;
- top: 5px;
- left: 22px;
- width: 15px;
- height: 20px;
- text-indent: -40px;
- font-size: 6px;
- line-height: 20px;
- vertical-align: middle;
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/copper.png");
- background-position: center center;
- background-repeat: no-repeat;
- background-size: contain;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-coin input, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-coin input {
- position: relative;
- top: 5px;
- left: 17px;
- width: 35px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin {
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/silver.svg?sanitize=true");
- margin-top: 0;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin .sheet-label, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin .sheet-label {
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/silver.png");
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin {
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/electrum.svg?sanitize=true");
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin .sheet-label, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin .sheet-label {
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/electrum.png");
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin {
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/gold.svg?sanitize=true");
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin .sheet-label, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin .sheet-label {
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/gold.png");
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin {
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/platnum.svg?sanitize=true");
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin .sheet-label, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin .sheet-label {
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/platnum.png");
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-equipment .sheet-weighttotal, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-equipment .sheet-weighttotal {
- left: 4px;
- top: 185px;
- width: 68px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-bio .sheet-textbox, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-bio .sheet-textbox {
- box-sizing: border-box;
- width: 100%;
- margin-top: 10px;
- border: 5px solid black;
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/5eBorder.svg?sanitize=true");
- border-image-slice: 32 25;
- border-image-width: auto;
- border-image-repeat: round;
- text-align: center;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-bio .sheet-col1 .sheet-textbox + .sheet-textbox textarea, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-bio .sheet-col1 .sheet-textbox + .sheet-textbox textarea {
- min-height: 640px !important;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-bio .sheet-textbox textarea, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-bio .sheet-textbox textarea {
- margin: 0 auto;
- text-align: left;
- width: calc(100% - 20px);
- background: transparent;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-spell-level, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-spell-level {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/SpellLevel.svg?sanitize=true");
- background-repeat: no-repeat;
- background-position: center center;
- background-size: cover;
- height: 50px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-col1 .sheet-spell-level:nth-child(1), input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-col1 .sheet-spell-level:nth-child(1) {
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/Cantrip.svg?sanitize=true");
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-spell-level .sheet-level {
- border: 0;
- background: transparent;
- position: relative;
- top: 11px;
-}
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-spell-level .sheet-level::before, div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-spell-level .sheet-level::after {
- border: 0;
- background: transparent;
- position: relative;
- top: 11px;
-}
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-spell-level .sheet-total, div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-spell-level .sheet-expended, div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-spell-level .sheet-primes {
- border: 0;
- background: transparent;
- position: relative;
- top: 11px;
-}
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-spell-level .sheet-level {
- border: 0;
- background: transparent;
- position: relative;
- top: 11px;
-}
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-spell-level .sheet-level::before, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-spell-level .sheet-level::after {
- border: 0;
- background: transparent;
- position: relative;
- top: 11px;
-}
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-spell-level .sheet-total, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-spell-level .sheet-expended, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-spell-level .sheet-primes {
- border: 0;
- background: transparent;
- position: relative;
- top: 11px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-spell-level .sheet-level span, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-spell-level .sheet-level span {
- left: 7px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) textarea[name=attr_global_save_rollstring], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) textarea[name=attr_global_save_rollstring] {
- width: 100px !important;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-npc_toggle[value="1"] ~ .sheet-npc .sheet-npc_options-flag:checked ~ .sheet-npc_options, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-npc_toggle[value="1"] ~ .sheet-npc .sheet-npc_options-flag:checked ~ .sheet-npc_options {
- display: block;
- width: 100%;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-npc_toggle[value="1"] ~ .sheet-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-npc_toggle[value="1"] ~ .sheet-container {
- width: unset;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-npc_toggle[value="1"] ~ .sheet-npc, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-npc_toggle[value="1"] ~ .sheet-npc {
- align-items: flex-start;
- box-sizing: border-box;
- display: inline-flex;
- flex-flow: wrap;
- margin-bottom: 2%;
- min-width: 100%;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc .sheet-page.sheet-spells .sheet-spell-labels [data-i18n=slots_total-u], div.sheet-licensecontainer.sheet-licensedsheet .sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc .sheet-page.sheet-spells .sheet-spell-labels [data-i18n=slots_remaining-u] {
- display: none;
-}
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc .sheet-page.sheet-spells .sheet-header {
- display: none;
-}
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc .sheet-page.sheet-spells .sheet-spell-labels [data-i18n=slots_total-u], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc .sheet-page.sheet-spells .sheet-spell-labels [data-i18n=slots_remaining-u] {
- display: none;
-}
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc .sheet-page.sheet-spells .sheet-header {
- display: none;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc {
- top: unset;
- width: 100%;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc .sheet-page.sheet-spells .sheet-body, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc .sheet-page.sheet-spells .sheet-body {
- display: inline-flex;
- flex-flow: wrap;
- margin-top: 0px;
- max-width: 95%;
- width: -webkit-fit-content;
- width: -moz-fit-content;
- width: fit-content;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc .sheet-page.sheet-spells .sheet-body .sheet-col, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc .sheet-page.sheet-spells .sheet-body .sheet-col {
- background: #fff;
- box-sizing: border-box;
- display: inline-block;
- margin-right: 0.5em;
- max-width: 32%;
- min-width: 250px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-npc_toggle[value="1"] ~ .sheet-npc .sheet-actions, div.sheet-licensecontainer.sheet-licensedsheet .sheet-npc_toggle[value="1"] ~ .sheet-npc .sheet-stat-block {
- background: #fff;
- box-sizing: border-box;
- margin-right: 2em;
- max-width: 30%;
- min-width: 385px;
-}
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-npc_toggle[value="1"] ~ .sheet-npc .sheet-actions, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-npc_toggle[value="1"] ~ .sheet-npc .sheet-stat-block {
- background: #fff;
- box-sizing: border-box;
- margin-right: 2em;
- max-width: 30%;
- min-width: 385px;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-npc_toggle[value="1"] ~ .sheet-npc .sheet-actions button[type=roll], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-npc_toggle[value="1"] ~ .sheet-npc .sheet-actions button[type=roll] {
- white-space: normal;
-}
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-npc_toggle[value="1"] ~ .sheet-npc .sheet-actions, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-npc_toggle[value="1"] ~ .sheet-npc .sheet-actions {
- margin-top: 2em;
-}
-
/* CHARACTERMANCER */
div.sheet-charmancer div.sheet-licensedsheet-flag {
display: none;
}
-div.sheet-charmancer.sheet-licensedsheet .sheet-logos {
- display: flex;
- width: 100%;
- text-align: center;
- flex-flow: column;
- margin-bottom: 1em;
-}
div.sheet-charmancer .sheet-logos, div.sheet-charmancer .sheet-logos {
display: flex;
width: 100%;
@@ -5969,7 +7499,7 @@ div.sheet-charmancer .sheet-logos, div.sheet-charmancer .sheet-logos {
}
div.sheet-charmancer .sheet-charmancer-logo {
margin: 0 auto;
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/charactermancer-1.png");
+ background: url("https://files.d20.io/images/175804954/NpVwmiRV0kYn9jOSipyXyA/med.png?1604618290");
background-position: center;
background-size: contain;
background-repeat: no-repeat;
@@ -5977,26 +7507,6 @@ div.sheet-charmancer .sheet-charmancer-logo {
width: 70%;
height: 5em;
}
-div.sheet-charmancer .sheet-charmancer-logo, div.sheet-charmancer .sheet-charmancer-logo {
- margin: 0 auto;
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/charactermancer-1.png");
- background-position: center;
- background-size: contain;
- background-repeat: no-repeat;
- display: flex;
- width: 70%;
- height: 5em;
-}
-div.sheet-charmancer.sheet-licensedsheet .sheet-compendium-logo {
- margin: 0 auto;
- background: url("https://raw.githubusercontent.com/skydawn1/esper_genesis/master/EG_Logo.png");
- background-position: center;
- background-size: contain;
- background-repeat: no-repeat;
- display: flex;
- width: 50%;
- height: 3em;
-}
div.sheet-charmancer .sheet-compendium-logo, div.sheet-charmancer .sheet-compendium-logo {
margin: 0 auto;
background: url("https://raw.githubusercontent.com/skydawn1/esper_genesis/master/EG_Logo.png");
@@ -6007,169 +7517,6 @@ div.sheet-charmancer .sheet-compendium-logo, div.sheet-charmancer .sheet-compend
width: 50%;
height: 3em;
}
-div.sheet-charmancer.sheet-licensedsheet .sheet-expansions {
- display: flex;
- width: 100%;
- margin: 1em 0;
- padding: 1em;
- background: #eee;
- border-radius: 0.5em;
-}
-div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-expansions, div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ .sheet-expansions {
- display: flex;
- width: 100%;
- margin: 1em 0;
- padding: 1em;
- background: #eee;
- border-radius: 0.5em;
-}
-div.sheet-charmancer.sheet-licensedsheet .sheet-expansions p {
- display: flex;
- width: 100%;
-}
-div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-expansions p, div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ .sheet-expansions p {
- display: flex;
- width: 100%;
-}
-div.sheet-charmancer.sheet-licensedsheet .sheet-meta-info-container, div.sheet-charmancer.sheet-licensedsheet .sheet-summary-container {
- box-sizing: border-box;
- width: 100% !important;
- padding: 0.5em;
- border: 10px solid black !important;
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-border.png") !important;
- border-image-slice: 20 32 !important;
- border-image-width: auto !important;
- border-image-repeat: round !important;
-}
-div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-meta-info-container, div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary-container {
- box-sizing: border-box;
- width: 100% !important;
- padding: 0.5em;
- border: 10px solid black !important;
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-border.png") !important;
- border-image-slice: 20 32 !important;
- border-image-width: auto !important;
- border-image-repeat: round !important;
-}
-div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ .sheet-meta-info-container, div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ .sheet-summary-container {
- box-sizing: border-box;
- width: 100% !important;
- padding: 0.5em;
- border: 10px solid black !important;
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-border.png") !important;
- border-image-slice: 20 32 !important;
- border-image-width: auto !important;
- border-image-repeat: round !important;
-}
-div.sheet-charmancer.sheet-licensedsheet .sheet-info .sheet-compendium-page {
- box-sizing: border-box;
- border: 10px solid black;
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-border.png");
- border-image-slice: 20 32;
- border-image-width: auto;
- border-image-repeat: round;
-}
-div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-info .sheet-compendium-page, div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ .sheet-info .sheet-compendium-page {
- box-sizing: border-box;
- border: 10px solid black;
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-border.png");
- border-image-slice: 20 32;
- border-image-width: auto;
- border-image-repeat: round;
-}
-div.sheet-charmancer.sheet-licensedsheet .sheet-row {
- border: 0 !important;
-}
-div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-row, div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ .sheet-row {
- border: 0 !important;
-}
-div.sheet-charmancer.sheet-licensedsheet .sheet-row + .sheet-row::before, div.sheet-charmancer.sheet-licensedsheet .sheet-holder .sheet-row::before {
- content: "";
- margin-bottom: 1em;
- display: block;
- border: none;
- border-top: 3px solid transparent;
- border-bottom: 3px solid transparent;
- border-left: 300px solid #245485;
-}
-div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-row + .sheet-row::before, div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-holder .sheet-row::before {
- content: "";
- margin-bottom: 1em;
- display: block;
- border: none;
- border-top: 3px solid transparent;
- border-bottom: 3px solid transparent;
- border-left: 300px solid #245485;
-}
-div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ .sheet-row + .sheet-row::before, div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ .sheet-holder .sheet-row::before {
- content: "";
- margin-bottom: 1em;
- display: block;
- border: none;
- border-top: 3px solid transparent;
- border-bottom: 3px solid transparent;
- border-left: 300px solid #245485;
-}
-div.sheet-charmancer.sheet-licensedsheet .sheet-row .sheet-row::before {
- border: 0;
- margin: 0;
-}
-div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-row .sheet-row::before, div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ .sheet-row .sheet-row::before {
- border: 0;
- margin: 0;
-}
-div.sheet-charmancer.sheet-licensedsheet .sheet-row div.sheet-row {
- padding: 0.1em 1.5em 0.1em 0;
- margin-left: 0;
-}
-div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-row div.sheet-row, div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ .sheet-row div.sheet-row {
- padding: 0.1em 1.5em 0.1em 0;
- margin-left: 0;
-}
-div.sheet-charmancer.sheet-licensedsheet .sheet-topbar {
- display: flex;
- flex-flow: column;
- justify-content: space-between;
-}
-div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-topbar, div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ .sheet-topbar {
- display: flex;
- flex-flow: column;
- justify-content: space-between;
-}
-div.sheet-charmancer.sheet-licensedsheet .sheet-topbar .sheet-topbar-container {
- width: 100%;
- border: 0;
- display: flex;
- justify-content: space-between;
-}
-div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-topbar .sheet-topbar-container, div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ .sheet-topbar .sheet-topbar-container {
- width: 100%;
- border: 0;
- display: flex;
- justify-content: space-between;
-}
-div.sheet-charmancer.sheet-licensedsheet .sheet-attr-container {
- flex-flow: column-reverse;
- min-width: 15%;
- display: inline-flex !important;
- align-content: space-evenly;
-}
-div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-attr-container, div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ .sheet-attr-container {
- flex-flow: column-reverse;
- min-width: 15%;
- display: inline-flex !important;
- align-content: space-evenly;
-}
-div.sheet-charmancer.sheet-licensedsheet .sheet-summary:nth-child(even) {
- background: #eee;
- margin: 0 -0.8em 0.8em;
- padding: 0.5em 0.8em;
-}
-div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary:nth-child(even), div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ .sheet-summary:nth-child(even) {
- background: #eee;
- margin: 0 -0.8em 0.8em;
- padding: 0.5em 0.8em;
-}
/* ROLL TEMPLATE */
.sheet-rolltemplate-simple div[class|=sheet-licensedsheet-flag], .sheet-rolltemplate-atk div[class|=sheet-licensedsheet-flag], .sheet-rolltemplate-dmg div[class|=sheet-licensedsheet-flag], .sheet-rolltemplate-atkdmg div[class|=sheet-licensedsheet-flag], .sheet-rolltemplate-desc div[class|=sheet-licensedsheet-flag], .sheet-rolltemplate-spell div[class|=sheet-licensedsheet-flag], .sheet-rolltemplate-traits div[class|=sheet-licensedsheet-flag], .sheet-rolltemplate-npc div[class|=sheet-licensedsheet-flag], .sheet-rolltemplate-npcatk div[class|=sheet-licensedsheet-flag], .sheet-rolltemplate-npcdmg div[class|=sheet-licensedsheet-flag], .sheet-rolltemplate-npcaction div[class|=sheet-licensedsheet-flag], .sheet-rolltemplate-mancerroll div[class|=sheet-licensedsheet-flag], .sheet-rolltemplate-mancerhproll div[class|=sheet-licensedsheet-flag] {
@@ -6180,129 +7527,6 @@ div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary
image-rendering: -webkit-optimize-contrast;
}
-.sheet-rolltemplate-simple div.sheet-licensedsheet-flag-1 ~ div.sheet-container {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-Rolltemplate-Simple.png") top left;
-}
-
-.sheet-rolltemplate-atk div.sheet-licensedsheet-flag-1 ~ div.sheet-container, .sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-container.sheet-atk {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-Rolltemplate-Attack.png") top left;
- background-color: inherit;
-}
-
-.sheet-rolltemplate-dmg div.sheet-licensedsheet-flag-1 ~ div.sheet-atk {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-Rolltemplate-Attack.png") top left;
- background-color: inherit;
-}
-.sheet-rolltemplate-dmg div.sheet-licensedsheet-flag-1 ~ div.sheet-container {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-Rolltemplate-Damage.png") top left;
- background-color: inherit;
-}
-
-.sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-container.sheet-damagetemplate {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-Rolltemplate-Damage.png") top left;
- background-color: inherit;
-}
-
-.sheet-rolltemplate-atk div.sheet-licensedsheet-flag-1 ~ div.sheet-desc, .sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc, .sheet-rolltemplate-dmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc, .sheet-rolltemplate-desc div.sheet-licensedsheet-flag-1 ~ div.sheet-desc {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-Rolltemplate-Desc.png") top left;
- background-color: inherit;
- padding-bottom: 0.35em;
- padding-top: 0.35em;
-}
-
-.sheet-rolltemplate-simple div.sheet-licensedsheet-flag-1 ~ div.sheet-container, .sheet-rolltemplate-atk div.sheet-licensedsheet-flag-1 ~ div.sheet-container, .sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-container.sheet-atk {
- background-repeat: no-repeat;
- background-size: 13.8em 100%;
- border: none;
- width: 100%;
-}
-
-.sheet-rolltemplate-dmg div.sheet-licensedsheet-flag-1 ~ div.sheet-atk, .sheet-rolltemplate-dmg div.sheet-licensedsheet-flag-1 ~ div.sheet-container {
- background-repeat: no-repeat;
- background-size: 13.8em 100%;
- border: none;
- width: 100%;
-}
-
-.sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-container.sheet-damagetemplate, .sheet-rolltemplate-atk div.sheet-licensedsheet-flag-1 ~ div.sheet-desc, .sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc, .sheet-rolltemplate-dmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc, .sheet-rolltemplate-desc div.sheet-licensedsheet-flag-1 ~ div.sheet-desc {
- background-repeat: no-repeat;
- background-size: 13.8em 100%;
- border: none;
- width: 100%;
-}
-
-.sheet-rolltemplate-atk div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info, .sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info, .sheet-rolltemplate-dmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info, .sheet-rolltemplate-desc div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info {
- background: none;
- width: 100%;
-}
-
-.sheet-rolltemplate-atk div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info > span, .sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info > span, .sheet-rolltemplate-dmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info > span, .sheet-rolltemplate-desc div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info > span {
- padding: 0px;
-}
-
-.sheet-rolltemplate-atk div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-bottom, .sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-bottom, .sheet-rolltemplate-dmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-bottom, .sheet-rolltemplate-desc div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-bottom {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-Rolltemplate-Info-Bottom.png") top left;
- height: 1.1em;
- background-size: 100% 100%;
- margin-bottom: -0.3em;
-}
-
-.sheet-rolltemplate-atk div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-top, .sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-top, .sheet-rolltemplate-dmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-top, .sheet-rolltemplate-desc div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-top {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-Rolltemplate-Info-Top.png") top left;
- height: 1.1em;
- background-size: 100% 100%;
- margin-top: -0.3em;
-}
-
-.sheet-rolltemplate-atk div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-middle, .sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-middle, .sheet-rolltemplate-dmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-middle, .sheet-rolltemplate-desc div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-middle {
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-Rolltemplate-Info-Middle.png") top left;
- background-size: 100% 100%;
-}
-
-.sheet-rolltemplate-npc div.sheet-licensedsheet-flag-1 ~ div.sheet-arrow-right, .sheet-rolltemplate-npcaction div.sheet-licensedsheet-flag-1 ~ div.sheet-arrow-right, .sheet-rolltemplate-npcatk div.sheet-licensedsheet-flag-1 ~ div.sheet-arrow-right, .sheet-rolltemplate-npcdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-arrow-right {
- border: none;
- border-top: 0.25em solid transparent;
- border-bottom: 0.25em solid transparent;
- border-left: 14em solid #245485;
-}
-
-.sheet-rolltemplate-atk div.sheet-licensedsheet-flag-1 ~ div.sheet-advspacer, .sheet-rolltemplate-dmg div.sheet-licensedsheet-flag-1 ~ div.sheet-advspacer, .sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-advspacer {
- margin-top: 1px;
-}
-
-/* DIALOGUE PROMPT */
-.charsheet input.sheet-licensedsheet[value="1"] ~ .sheet-monster_confirm span:not(.sheet-yes), .charsheet input.sheet-licensedsheet[value="1"] ~ .sheet-mancer_confirm span:not(.sheet-yes) {
- font-size: 1.68em;
- font-weight: bold;
-}
-.charsheet input.sheet-licensedsheet[value="1"] ~ .sheet-compendium_warning, .charsheet input.sheet-licensedsheet[value="1"] ~ .sheet-monster_confirm, .charsheet input.sheet-licensedsheet[value="1"] ~ .sheet-mancer_confirm {
- position: absolute !important;
- padding: 2em 0 !important;
- min-height: -webkit-max-content;
- min-height: max-content;
- box-shadow: 0 0 50px #000;
- border: 2px solid #000 !important;
- border-radius: 0.5em;
-}
-.charsheet input.sheet-licensedsheet[value="1"] ~ .sheet-monster_confirm span:not(.sheet-yes), .charsheet input.sheet-licensedsheet[value="1"] ~ .sheet-mancer_confirm span:not(.sheet-yes) {
- font-weight: bold;
- font-size: 18px;
-}
-.charsheet input.sheet-licensedsheet[value="1"] ~ .sheet-monster_confirm .sheet-yes, .charsheet input.sheet-licensedsheet[value="1"] ~ .sheet-mancer_confirm .sheet-yes {
- color: #000;
- background-color: #eee;
-}
-.charsheet input.sheet-licensedsheet[value="1"] ~ .sheet-monster_confirm .sheet-yes:hover, .charsheet input.sheet-licensedsheet[value="1"] ~ .sheet-mancer_confirm .sheet-yes:hover {
- color: #fff;
- background-color: #00ba73;
- cursor: pointer;
-}
-.charsheet input.sheet-licensedsheet[value="1"] ~ .sheet-monster_confirm .sheet-yes:hover + .sheet-yes, .charsheet input.sheet-licensedsheet[value="1"] ~ .sheet-mancer_confirm .sheet-yes:hover + .sheet-yes {
- color: #fff;
- background-color: #00ba73;
- cursor: pointer;
-}
-
/* Licensed Styling Start */
.charsheet .sheet-pc {
/* PC Ship */
@@ -6352,6 +7576,209 @@ div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary
.charsheet .sheet-pc .sheet-attributes-container .sheet-attr-container:before {
top: -5px;
}
+/* Abilities Bar — horizontal row above body (all three main tabs) */
+.charsheet .sheet-pc-default .sheet-abilities-bar {
+ display: flex;
+ width: 860px;
+ border: 1.5px solid #ab8b57;
+ border-radius: 5px;
+ background: transparent;
+ margin-top: 6px;
+ margin-bottom: 0;
+ position: relative;
+ padding: 26px 0 4px;
+}
+/* Hide the duplicate final-score span next to the score input */
+.charsheet .sheet-pc .sheet-abilities-bar .sheet-finalattr {
+ display: none;
+}
+.charsheet .sheet-pc-default .sheet-abilities-bar .sheet-ability-col {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ padding: 6px 4px 4px;
+ position: relative;
+}
+.charsheet .sheet-pc-default .sheet-abilities-bar .sheet-ability-col:not(:last-of-type)::after {
+ content: '';
+ position: absolute;
+ right: 0;
+ top: 6px;
+ bottom: 4px;
+ width: 1px;
+ background: #3a2e14;
+}
+.charsheet .sheet-pc-default .sheet-abilities-bar .sheet-ability-header {
+ display: flex;
+ align-items: center;
+ gap: 5px;
+ margin-bottom: 5px;
+}
+.charsheet .sheet-pc-default .sheet-abilities-bar .sheet-ability-header button[type=roll] {
+ color: #245485;
+ font-weight: bold;
+ font-size: 14px;
+ line-height: 1;
+ background: transparent;
+ border: none;
+ padding: 0;
+ text-shadow: none;
+ box-shadow: none;
+ background-image: none;
+ min-width: 28px;
+ text-align: center;
+}
+.charsheet .sheet-pc-default .sheet-abilities-bar .sheet-ability-header button[type=roll]:before {
+ content: "" !important;
+}
+.charsheet .sheet-pc-default .sheet-abilities-bar .sheet-ability-header .sheet-baseattr {
+ width: 30px;
+ text-align: center;
+ border: 1px solid #ab8b57;
+ border-radius: 3px;
+ font-size: 13px;
+ font-weight: bold;
+ color: #000 !important;
+ background: #f0f0f0 !important;
+ box-shadow: none !important;
+ -webkit-appearance: none;
+ padding: 1px 2px;
+ margin-top: 0;
+}
+.charsheet .sheet-pc-default .sheet-abilities-bar .sheet-ability-modifiers {
+ display: flex;
+ gap: 3px;
+ width: 100%;
+ justify-content: center;
+}
+/* Mod/Save outer blocks — flex column containers only, no background */
+.charsheet .sheet-pc-default .sheet-abilities-bar .sheet-ability-mod-block,
+.charsheet .sheet-pc-default .sheet-abilities-bar .sheet-ability-save-block {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 4px;
+ min-width: 46px;
+ text-align: center;
+}
+/* Inner framed value box — light gray with gold border, centered content */
+.charsheet .sheet-pc-default .sheet-abilities-bar .sheet-ability-val-box {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ background: #f0f0f0;
+ border: 1px solid #ab8b57;
+ border-radius: 4px;
+ padding: 4px 5px;
+ width: 46px;
+ min-height: 46px;
+ box-sizing: border-box;
+}
+/* Value spans inside val-box */
+.charsheet .sheet-pc-default .sheet-abilities-bar .sheet-ability-val-box .sheet-attr,
+.charsheet .sheet-pc-default .sheet-abilities-bar .sheet-ability-val-box .sheet-save-val {
+ font-size: 20px;
+ line-height: 24px;
+ color: #000;
+ font-weight: bold;
+ display: block;
+ margin-top: 0 !important;
+}
+/* Roll buttons inside val-box — transparent, no chrome */
+.charsheet .sheet-pc-default .sheet-abilities-bar .sheet-ability-val-box button[type=roll] {
+ background: transparent;
+ border: none;
+ text-shadow: none;
+ box-shadow: none;
+ background-image: none;
+ padding: 0;
+ display: block;
+ cursor: pointer;
+ color: #000;
+ font-size: 20px;
+ line-height: 24px;
+ font-weight: bold;
+}
+.charsheet .sheet-pc-default .sheet-abilities-bar .sheet-ability-val-box button[type=roll]:before {
+ content: "" !important;
+}
+/* + prefix for positive modifiers */
+.charsheet .sheet-pc .sheet-abilities-bar .sheet-ability-mod-block input[type=hidden]:not([value^="-"]):not([value="0"]) + button .sheet-attr:before {
+ content: "+";
+}
+/* + prefix for positive save values */
+.charsheet .sheet-pc .sheet-abilities-bar .sheet-ability-save-block input[type=hidden]:not([value^="-"]):not([value="0"]) + button .sheet-save-val:before {
+ content: "+";
+}
+/* Proficiency checkbox — overlaps the bottom edge of the val-box */
+/* Saving throw proficiency — styled as circular pip (blue when checked) */
+.charsheet .sheet-pc-default .sheet-abilities-bar .sheet-ability-save-block > input[type=checkbox] {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ display: block !important;
+ width: 12px !important;
+ height: 12px !important;
+ border-radius: 50% !important;
+ border: 1.5px dashed #066dce !important;
+ background: transparent !important;
+ cursor: pointer !important;
+ margin: -10px auto 0 !important;
+ padding: 0 !important;
+ box-shadow: none !important;
+ flex-shrink: 0;
+}
+.charsheet .sheet-pc-default .sheet-abilities-bar .sheet-ability-save-block > input[type=checkbox]:checked {
+ background: #066dce !important;
+ border-color: #066dce !important;
+ border-style: solid !important;
+}
+/* Label below the val-box */
+.charsheet .sheet-pc-default .sheet-abilities-bar .sheet-ab-label {
+ font-size: 8px;
+ color: #888;
+ text-transform: uppercase;
+ font-weight: bold;
+ display: block;
+ text-align: center;
+ line-height: 1.2;
+ margin-top: 0 !important;
+}
+/* Push the Mod label down to align with Save label (which sits below the checkbox) */
+.charsheet .sheet-pc-default .sheet-abilities-bar .sheet-ability-mod-block .sheet-ab-label {
+ margin-top: 6px !important;
+}
+/* Section label — Oxanium blue small-caps header at top-left of bar */
+.charsheet .sheet-pc-default .sheet-abilities-bar .sheet-ab-section-label {
+ position: absolute;
+ top: 2px;
+ left: 8px;
+ background: transparent;
+ padding: 8px;
+ line-height: 1;
+}
+.charsheet .sheet-pc-default .sheet-abilities-bar .sheet-ab-section-label span {
+ font-family: 'Oxanium', sans-serif;
+ font-size: 16px;
+ font-weight: bold;
+ color: #245485;
+ font-variant: small-caps;
+ text-transform: none;
+ letter-spacing: normal;
+ margin-top: 0 !important;
+}
+/* Reduce body top margin since abilities bar provides spacing above */
+.charsheet .sheet-pc .sheet-page.sheet-bio .sheet-body,
+.charsheet .sheet-pc .sheet-page.sheet-spells .sheet-body,
+.charsheet .sheet-pc .sheet-page.sheet-core .sheet-body {
+ margin-top: 6px;
+}
+/* Hide abilities bar when Starship sheet type is active */
+.sheet-pc-default:has(input[value="starship"]:checked) .sheet-abilities-bar {
+ display: none !important;
+}
.charsheet .sheet-pc .sheet-skills-list {
overflow: hidden;
padding-top: 0;
@@ -6372,15 +7799,112 @@ div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary
border-radius: 5px;
position: relative;
padding: 7px;
+ display: flex;
+ flex-wrap: nowrap;
+ align-items: center;
+ gap: 8px;
}
.charsheet .sheet-pc .sheet-spell-level > *:not(.sheet-rank):not(.sheet-tp) {
display: none;
}
-.charsheet .sheet-pc .sheet-spell-level .sheet-rank {
+/* Orphaned OGL column-header row — replaced by inline per-bar labels */
+.charsheet .sheet-pc .sheet-spell-labels {
+ display: none !important;
+}
+/* Hide slot counters for TP-only classes (Melder/Adept) and Talent Slot classes (Cybermancer) */
+.charsheet .sheet-pc .sheet-page.sheet-spells .sheet-uses-power-slots-flag:not([value="1"]) ~ .sheet-body .sheet-spell-level .sheet-total,
+.charsheet .sheet-pc .sheet-page.sheet-spells .sheet-uses-power-slots-flag:not([value="1"]) ~ .sheet-body .sheet-spell-level .sheet-expended {
+ display: none !important;
+}
+/* ---- Esper Powers: Slot Total / Remaining counters ---- */
+.charsheet .sheet-pc .sheet-spell-level .sheet-total {
+ display: flex !important;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ order: 2;
+ flex: 0 0 auto;
+ width: auto;
+ height: auto;
+ border: none;
+ background: transparent;
+ margin-left: 0;
+ border-radius: 0;
+}
+.charsheet .sheet-pc .sheet-spell-level .sheet-total span {
+ font-size: 16px;
+ font-weight: bold;
+ color: #245485;
+ position: static;
+ top: 0;
display: block;
+ text-align: center;
+ width: auto;
+ min-width: 16px;
+ line-height: 1;
+ margin-top: 0;
+}
+.charsheet .sheet-pc .sheet-spell-level .sheet-total::after {
+ content: "TOTAL";
+ font-family: Oxanium, sans-serif;
+ font-size: 8px;
+ font-weight: bold;
+ color: rgba(0,0,0,0.45);
+ text-transform: uppercase;
+ letter-spacing: 0.3px;
+ display: block;
+ text-align: center;
+ margin-top: 2px;
+}
+.charsheet .sheet-pc .sheet-spell-level .sheet-expended {
+ display: flex !important;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ order: 3;
+ flex: 0 0 auto;
+ width: auto;
+ height: auto;
+ border: none;
+ background: transparent;
+ margin-left: 0;
+ border-radius: 0;
+}
+.charsheet .sheet-pc .sheet-spell-level .sheet-expended input[type=number] {
+ font-size: 14px;
+ font-weight: bold;
+ color: #245485;
+ width: 36px;
+ height: 22px;
+ text-align: center;
+ background: rgba(255,255,255,0.6);
+ border: 1px solid rgba(103,89,61,0.6) !important;
+ border-radius: 3px;
+ padding: 0;
+ margin: 0;
+ box-shadow: none !important;
+ -webkit-appearance: none;
+ -moz-appearance: textfield;
+}
+.charsheet .sheet-pc .sheet-spell-level .sheet-expended::after {
+ content: "REMAINING";
+ font-family: Oxanium, sans-serif;
+ font-size: 8px;
+ font-weight: bold;
+ color: rgba(0,0,0,0.45);
+ text-transform: uppercase;
+ letter-spacing: 0.3px;
+ display: block;
+ text-align: center;
+ margin-top: 2px;
+}
+.charsheet .sheet-pc .sheet-spell-level .sheet-rank {
+ display: inline-block;
font-size: 12px;
margin: 0;
- width: 100%;
+ flex: 1 1 auto;
+ width: auto;
+ order: 1;
}
.charsheet .sheet-pc .sheet-spell-level .sheet-rank span {
display: inline;
@@ -6399,11 +7923,10 @@ div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary
font-size: 12px;
font-weight: bold;
margin: 0;
- position: absolute;
- right: 7px;
+ flex: 0 0 auto;
text-transform: uppercase;
- top: 7px;
width: auto;
+ order: 4;
}
.charsheet .sheet-pc .sheet-spell-level .sheet-tp:before {
content: "tp:";
@@ -6411,15 +7934,7 @@ div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary
.charsheet .sheet-pc .sheet-equipment .sheet-weighttotal {
top: 70px;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-tab-button {
- top: 0px;
-}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-tab-button + span {
- font-size: 13px;
- font-weight: bold;
- line-height: 1.42857143;
- top: 0px;
-}
+
.charsheet .sheet-pc .sheet-pc-ship input {
width: 100%;
}
@@ -6449,24 +7964,46 @@ div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary
border-radius: 0;
}
.charsheet .sheet-pc .sheet-pc-ship .sheet-top {
- margin-bottom: 40px;
- padding-top: 30px;
+ margin-bottom: 20px;
+ padding-top: 10px;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-top .sheet-logo h2 {
- line-height: normal;
- text-align: left;
-}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-top .sheet-logo h2 span {
- font-size: 32px;
- -webkit-text-stroke: 1px #e2c285;
- text-stroke: 1px #e2c285;
-}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-top .sheet-logo div {
- flex-grow: 1;
+.charsheet .sheet-pc .sheet-pc-ship .sheet-ship-logo-footer {
text-align: right;
+ padding: 12px 10px 8px 0;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-top .sheet-logo div img {
- width: 355px;
+.charsheet .sheet-pc .sheet-pc-ship .sheet-ship-logo-footer .sheet-ship-logo-img {
+ width: 266px;
+ opacity: 0.85;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-ship-top-layout {
+ display: flex;
+ flex-direction: row;
+ align-items: stretch;
+ gap: 12px;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-token-frame {
+ width: 90px;
+ flex-shrink: 0;
+ border: 3px solid #ab8b57;
+ border-radius: 8px;
+ overflow: hidden;
+ background: #fff;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-char-avatar {
+ width: 100%;
+ height: 100%;
+ object-fit: contain;
+ display: block;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-ship-info {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ gap: 4px;
}
.charsheet .sheet-pc .sheet-pc-ship .sheet-top .sheet-flex-container {
align-items: flex-end;
@@ -6480,14 +8017,63 @@ div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary
line-height: normal;
white-space: nowrap;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-top input {
+.charsheet .sheet-pc .sheet-pc-ship .sheet-top input[type=text] {
+ -webkit-appearance: none;
+ appearance: none;
+ background: transparent;
border: none;
- border-bottom: 1px solid black;
+ border-bottom: 1px solid #D3D3D3;
border-radius: 0;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-top input:not(:last-child) {
+.charsheet .sheet-pc .sheet-pc-ship .sheet-top input[type=text]:not(:last-child) {
margin-right: 5px;
}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-top input.sheet-ship-compact {
+ max-width: 90px;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-crew-roles {
+ border: 1px solid #e2c285;
+ border-radius: 6px;
+ margin-bottom: 20px;
+ padding: 12px;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-crew-roles .sheet-flex-container {
+ gap: 10px;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-crew-roles .sheet-crew-field {
+ display: flex;
+ flex-direction: column;
+ flex: 1;
+ min-width: 0;
+ width: auto;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-crew-roles .sheet-crew-field input[type=text] {
+ background: transparent;
+ border: none;
+ border-bottom: 1px solid #D3D3D3;
+ border-radius: 0;
+ width: 100%;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-crew-roles .sheet-crew-field span {
+ color: #000;
+ font-size: 10px;
+ font-weight: bold;
+ letter-spacing: 1px;
+ margin-top: 4px;
+ text-transform: uppercase;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-piloting-maneuver-check h3 button {
+ background: none;
+ border: none;
+ color: inherit;
+ cursor: pointer;
+ font-family: inherit;
+ font-size: inherit;
+ font-weight: inherit;
+ padding: 0;
+ text-decoration: underline;
+ text-decoration-style: dotted;
+}
.charsheet .sheet-pc .sheet-pc-ship .sheet-middle {
grid-column-gap: 40px;
grid-template-areas: "left left left left left left center center center center center right right right right right right";
@@ -6567,6 +8153,8 @@ div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary
}
.charsheet .sheet-pc .sheet-pc-ship .sheet-middle .sheet-col-left .sheet-abilities .sheet-ability input {
border-radius: 24px;
+ font-size: 18px;
+ font-weight: bold;
height: 48px;
outline: none;
text-align: center;
@@ -6585,7 +8173,11 @@ div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary
grid-gap: 10px;
}
.charsheet .sheet-pc .sheet-pc-ship .sheet-middle .sheet-col-left .sheet-sensors-and-initiative .sheet-initiative label input {
+ background: white;
+ border: 2px solid black;
border-radius: 24px;
+ font-size: 20px;
+ font-weight: bold;
height: 48px;
outline: none;
text-align: center;
@@ -6595,6 +8187,7 @@ div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary
align-items: center;
display: flex;
font-size: 11px;
+ font-weight: normal;
}
.charsheet .sheet-pc .sheet-pc-ship .sheet-middle .sheet-col-center {
-ms-grid-row: 1;
@@ -6604,9 +8197,15 @@ div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary
max-width: 180px;
min-width: 180px;
}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-middle .sheet-col-center .sheet-piloting-maneuver-check h3 {
+ margin-bottom: 10px;
+}
.charsheet .sheet-pc .sheet-pc-ship .sheet-middle .sheet-col-center .sheet-piloting-maneuver-check h3 span {
text-align: center;
}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-piloting-maneuver-check h3 button span {
+ margin-left: 4px;
+}
.charsheet .sheet-pc .sheet-pc-ship .sheet-middle .sheet-col-center .sheet-piloting-maneuver-check img {
width: 100%;
}
@@ -6625,6 +8224,10 @@ div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary
margin-top: 20px;
padding: 10px;
}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-middle .sheet-col-center .sheet-command-dice h3 {
+ margin-bottom: 8px;
+ text-align: center;
+}
.charsheet .sheet-pc .sheet-pc-ship .sheet-middle .sheet-col-center .sheet-command-dice > label {
text-align: center;
}
@@ -6697,14 +8300,19 @@ div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary
.charsheet .sheet-pc .sheet-pc-ship .sheet-middle .sheet-col-right .sheet-maneuver-save .sheet-grid-container > div:last-child label span {
font-size: 11px;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-middle .sheet-col-right .sheet-special-features {
+.charsheet .sheet-pc .sheet-pc-ship .sheet-bottom .sheet-features-cargo-row {
+ grid-template-columns: 1fr 1fr;
margin-top: 20px;
+ padding-bottom: 20px;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-middle .sheet-col-right .sheet-special-features .repcontainer .repitem {
+.charsheet .sheet-pc .sheet-pc-ship .sheet-bottom .sheet-features-cargo-row .sheet-special-features h3 {
+ border-bottom: 1px solid black;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-bottom .sheet-features-cargo-row .sheet-special-features .repcontainer .repitem {
position: relative;
border-bottom: 1px solid black;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-middle .sheet-col-right .sheet-special-features .repcontainer .repitem textarea {
+.charsheet .sheet-pc .sheet-pc-ship .sheet-bottom .sheet-features-cargo-row .sheet-special-features .repcontainer .repitem textarea {
left: 0;
height: 100%;
min-height: 30px;
@@ -6713,31 +8321,28 @@ div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary
top: 0;
width: 100%;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-middle .sheet-col-right .sheet-special-features .repcontainer .repitem span {
+.charsheet .sheet-pc .sheet-pc-ship .sheet-bottom .sheet-features-cargo-row .sheet-special-features .repcontainer .repitem span {
display: inline-block;
line-height: 30px;
min-height: 25px;
width: 100%;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-middle .sheet-col-right .sheet-special-features .repcontainer .repitem textarea:focus {
+.charsheet .sheet-pc .sheet-pc-ship .sheet-bottom .sheet-features-cargo-row .sheet-special-features .repcontainer .repitem textarea:focus {
opacity: 1;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-middle .sheet-col-right .sheet-special-features .repcontainer .repitem textarea:focus + span {
+.charsheet .sheet-pc .sheet-pc-ship .sheet-bottom .sheet-features-cargo-row .sheet-special-features .repcontainer .repitem textarea:focus + span {
opacity: 0;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-middle .sheet-col-right .sheet-ship-cargo {
- margin-top: 20px;
-}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-middle .sheet-col-right .sheet-ship-cargo .repcontainer {
+.charsheet .sheet-pc .sheet-pc-ship .sheet-bottom .sheet-features-cargo-row .sheet-ship-cargo .repcontainer {
border: 1px solid black;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-middle .sheet-col-right .sheet-ship-cargo .repcontainer .repitem:not(:first-child) {
+.charsheet .sheet-pc .sheet-pc-ship .sheet-bottom .sheet-features-cargo-row .sheet-ship-cargo .repcontainer .repitem:not(:first-child) {
border-top: 1px solid black;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-middle .sheet-col-right .sheet-ship-cargo .repcontainer .repitem .sheet-grid-container {
+.charsheet .sheet-pc .sheet-pc-ship .sheet-bottom .sheet-features-cargo-row .sheet-ship-cargo .repcontainer .repitem .sheet-grid-container {
grid-template-columns: 1fr 85px;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-middle .sheet-col-right .sheet-ship-cargo .repcontainer .repitem .sheet-grid-container input {
+.charsheet .sheet-pc .sheet-pc-ship .sheet-bottom .sheet-features-cargo-row .sheet-ship-cargo .repcontainer .repitem .sheet-grid-container input {
border: none;
border-radius: 0;
line-height: 22px;
@@ -6766,7 +8371,7 @@ div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary
text-align: center;
}
.charsheet .sheet-pc .sheet-pc-ship .sheet-bottom .sheet-grid-container > div:first-child .sheet-grid-container .sheet-armor-class > .sheet-grid-container, .charsheet .sheet-pc .sheet-pc-ship .sheet-bottom .sheet-grid-container > div:first-child .sheet-grid-container .sheet-maneuver-defense > .sheet-grid-container {
- grid-template-columns: 115px 1fr;
+ grid-template-columns: 98px 1fr;
grid-gap: 10px;
}
.charsheet .sheet-pc .sheet-pc-ship .sheet-bottom .sheet-grid-container > div:first-child .sheet-grid-container .sheet-armor-class > .sheet-grid-container > div:first-child, .charsheet .sheet-pc .sheet-pc-ship .sheet-bottom .sheet-grid-container > div:first-child .sheet-grid-container .sheet-maneuver-defense > .sheet-grid-container > div:first-child {
@@ -6778,6 +8383,18 @@ div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary
grid-template-columns: 30px 1fr;
grid-gap: 5px;
}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-bottom .sheet-grid-container > div:first-child .sheet-grid-container .sheet-armor-class > .sheet-grid-container .sheet-grid-container input, .charsheet .sheet-pc .sheet-pc-ship .sheet-bottom .sheet-grid-container > div:first-child .sheet-grid-container .sheet-maneuver-defense > .sheet-grid-container .sheet-grid-container input {
+ text-align: center;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-bottom .sheet-grid-container > div:first-child .sheet-grid-container .sheet-maneuver-defense .sheet-static-num {
+ display: block;
+ width: 100%;
+ text-align: center;
+ border: 1px solid #ccc;
+ background: #fff;
+ font-size: 14px;
+ line-height: 22px;
+}
.charsheet .sheet-pc .sheet-pc-ship .sheet-bottom .sheet-grid-container > div:first-child .sheet-grid-container .sheet-armor-class > .sheet-grid-container .sheet-grid-container label, .charsheet .sheet-pc .sheet-pc-ship .sheet-bottom .sheet-grid-container > div:first-child .sheet-grid-container .sheet-maneuver-defense > .sheet-grid-container .sheet-grid-container label {
align-items: center;
display: flex;
@@ -6839,101 +8456,141 @@ div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary
transform: translate(-50%, -50%);
width: 100%;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-table-header {
- grid-template-columns: 45px 1fr 60px 30px 50px 70px;
- grid-gap: 2px;
- max-width: calc(50% - 30px);
-}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-table-header span {
- font-size: 11px;
-}
.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .repcontainer {
column-gap: 20px;
display: grid;
- grid-template-columns: repeat(2, 1fr);
+ grid-template-columns: 1fr;
}
.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .repcontainer .repitem {
border-top: 2px solid #e2c285;
- margin-right: 20px;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .repcontainer .repitem button[type=roll] {
- position: absolute;
- top: 4px;
- right: -20px;
- background: none;
- border: none;
- color: black;
- box-shadow: none;
+.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-weapon-action {
+ position: relative;
+ padding-right: 22px;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-weapon-flag {
+ cursor: pointer;
+ height: 18px;
margin: 0;
- padding: 0;
- font-weight: bold;
+ opacity: 0;
+ position: absolute;
+ right: 2px;
+ top: 4px;
+ width: 18px;
+ z-index: 2;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .repcontainer .repitem button[type=roll]:hover {
- color: #00ba73;
-}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .repcontainer .repitem .sheet-table-body {
- grid-template-columns: 45px 1fr 60px 30px 50px 70px;
- grid-gap: 2px;
-}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .repcontainer .repitem .sheet-table-body input[type=text] {
- border: 1px solid black;
- border-radius: 0;
- outline: none;
-}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .repcontainer .repitem .sheet-table-meta {
- grid-template-columns: 1fr 92px 122px;
- grid-gap: 2px;
-}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .repcontainer .repitem .sheet-table-meta input[type=text] {
- border: none;
- border-radius: 0;
- outline: none;
-}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .repcontainer .repitem .sheet-table-meta label {
+.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-weapon-flag + span {
align-items: center;
+ color: #A0A0A0;
+ cursor: pointer;
+ display: none;
+ font-family: pictos;
+ font-size: 18px;
+ height: 18px;
+ justify-content: center;
+ position: absolute;
+ right: 2px;
+ top: 4px;
+ width: 18px;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-weapon-flag:checked + span {
+ color: #000;
display: flex;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .repcontainer .repitem .sheet-table-meta label > *:not(:last-child) {
- margin-right: 5px;
+.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-weapon-action:hover .sheet-weapon-flag + span {
+ display: flex;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .repcontainer .repitem .sheet-table-meta span {
+.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-weapon-flag:checked ~ .sheet-weapon-options {
+ display: block;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-weapon-flag:not(:checked) ~ .sheet-weapon-options {
+ display: none;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-weapon-flag:checked ~ .sheet-weapon-display {
+ display: none;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-weapon-flag:not(:checked) ~ .sheet-weapon-display {
+ display: block;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-weapon-options {
+ padding: 4px 0;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-weapon-options .sheet-weapon-row {
+ align-items: center;
+ display: flex;
+ gap: 6px;
+ margin-bottom: 4px;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-weapon-options .sheet-weapon-row > span {
font-size: 11px;
+ font-weight: bold;
+ white-space: nowrap;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .repcontainer .repitem .sheet-table-meta .sheet-recharge input {
+.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-weapon-options .sheet-weapon-row > span:first-child {
+ min-width: 60px;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-weapon-options .sheet-weapon-row input[type=text] {
+ border: none;
+ border-bottom: 1px solid black;
+ flex: 1;
+ font-size: 12px;
+ min-width: 0;
+ padding: 1px 2px;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-weapon-options .sheet-weapon-row input[type=checkbox] {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
border: 1px solid black;
- height: 16px;
+ flex: none;
+ height: 14px;
outline: none;
+ width: 14px;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-weapon-options .sheet-weapon-row input[type=checkbox]:checked {
+ background: black;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-weapon-display button[type=roll] {
+ align-items: center;
+ background: none;
+ border: none;
+ box-shadow: none;
+ color: inherit;
+ cursor: pointer;
+ display: flex;
+ flex-wrap: wrap;
+ column-gap: 6px;
+ row-gap: 0;
+ padding: 4px 0;
+ text-align: left;
+ width: 100%;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-weapon-display button[type=roll] img {
+ height: 16px;
width: 16px;
+ flex: 0 0 auto;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .repcontainer .repitem .sheet-table-meta .sheet-recharge input:nth-child(2) {
- order: 4;
+.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-weapon-display button[type=roll]:hover {
+ color: #066dce;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .repcontainer .repitem .sheet-table-meta .sheet-recharge input:nth-child(2):checked + input, .charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .repcontainer .repitem .sheet-table-meta .sheet-recharge input:nth-child(2):checked + input + input {
- background: black;
+.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-weapon-display button[type=roll] .sheet-weapon-name {
+ flex: 0 0 auto;
+ font-size: 13px;
+ font-weight: bold;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .repcontainer .repitem .sheet-table-meta .sheet-recharge input:nth-child(3) {
- order: 3;
+.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-weapon-display button[type=roll] .sheet-weapon-meta {
+ color: #555;
+ flex: 0 0 100%;
+ font-size: 11px;
+ font-style: italic;
+ padding-left: 22px;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .repcontainer .repitem .sheet-table-meta .sheet-recharge input:nth-child(3):checked + input {
- background: black;
-}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .repcontainer .repitem .sheet-table-meta .sheet-recharge input:nth-child(4) {
- order: 2;
- margin-right: 5px;
-}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .repcontainer .repitem .sheet-table-meta .sheet-recharge input:checked {
- background: black;
-}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems > div:last-child {
- margin-top: -23px;
- padding: 0 40px;
+.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-weapon-systems-info {
+ margin-top: 2px;
pointer-events: none;
text-align: center;
}
-.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems > div:last-child span {
+.charsheet .sheet-pc .sheet-pc-ship .sheet-weapon-systems .sheet-weapon-systems-info span {
background: #f4fafd;
border: 1px solid black;
display: inline-block;
@@ -6952,7 +8609,7 @@ div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary
text-align: center;
}
.charsheet .sheet-pc .sheet-pc-ship .sheet-hull-points .sheet-fancy-input img {
- min-width: 170px;
+ min-width: 153px;
}
.charsheet .sheet-pc .sheet-pc-ship .sheet-resistances {
margin-top: 20px;
@@ -7012,6 +8669,9 @@ div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary
.charsheet .sheet-pc .sheet-pc-ship .sheet-patch-repair label span {
font-size: 11px;
}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-patch-repair label input {
+ text-align: center;
+}
.charsheet .sheet-pc .sheet-pc-ship .sheet-patch-repair .sheet-grid-container {
align-items: end;
grid-template-columns: repeat(3, 1fr);
@@ -7064,16 +8724,22 @@ div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary
font-size: 11px;
}
.charsheet .sheet-pc .sheet-pc-ship .sheet-structural-integrity .sheet-grid-container {
- grid-template-columns: 110px 1fr;
+ align-items: stretch;
+ grid-template-columns: 94px 1fr;
grid-gap: 10px;
}
.charsheet .sheet-pc .sheet-pc-ship .sheet-structural-integrity .sheet-grid-container > label {
background: white;
border: 1px solid black;
+ display: flex;
+ flex-direction: column;
+}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-structural-integrity .sheet-fancy-input input {
+ font-size: 26px;
}
.charsheet .sheet-pc .sheet-pc-ship .sheet-structural-integrity .sheet-grid-container > label input {
border: 0;
- min-height: calc(100% - 18px);
+ flex: 1;
}
.charsheet .sheet-pc .sheet-pc-ship .sheet-structural-integrity .sheet-grid-container > label span {
display: inline-block;
@@ -7081,6 +8747,12 @@ div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary
text-align: center;
width: 100%;
}
+.charsheet .sheet-pc .sheet-pc-ship .sheet-structural-integrity > span {
+ display: block;
+ font-size: 11px;
+ margin-top: 6px;
+ text-align: center;
+}
.charsheet .sheet-pc .sheet-pc-ship .sheet-max-weapon-payload {
align-items: center;
grid-template-columns: 1fr 34px !important;
@@ -7115,11 +8787,391 @@ div.sheet-charmancer div.sheet-licensedsheet-flag:not(:empty) ~ * .sheet-summary
.sheet-pc-type[value=starship] ~ .sheet-pc .sheet-pc-ship {
display: block;
}
-.sheet-pc-type[value=starship] ~ .sheet-pc .sheet-pc-ship .sheet-tab-button.sheet-type-pc + span {
- background-color: #E8E8E8;
- color: black;
+
+
+/* ---- Feature: Short/Long Rest Buttons ---- */
+.sheet-resources .sheet-rest {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 10px;
+ margin: 10px 0 -5px 0;
+}
+.sheet-resources .sheet-rest button {
+ width: 100%;
+ margin: 0;
+ box-sizing: border-box;
+ background: #e8e8e8;
+ border: 1px solid #ab8b57;
+ border-radius: 6px;
+ padding: 8px 12px;
+ min-height: 34px;
+ cursor: pointer;
+ transition: background 0.2s, color 0.2s, border-color 0.2s;
+}
+.sheet-resources .sheet-rest button:hover {
+ background: #ab8b57 !important;
+ border-color: #ab8b57 !important;
+}
+.sheet-resources .sheet-rest button:hover span {
+ color: #fff !important;
+}
+.sheet-resources .sheet-rest button span {
+ font-family: 'Oxanium', sans-serif !important;
+ font-size: 12px !important;
+ font-weight: bold !important;
+ color: #ab8b57 !important;
+ font-variant: small-caps !important;
+ letter-spacing: 1px !important;
+}
+input[name="attr_use_rest_buttons"]:not([value="1"]) + .sheet-resources .sheet-rest {
+ display: none !important;
+}
+input[name="attr_show_tp_resource"]:not([value="1"]) + .sheet-hdice-dsaves-container .sheet-tp-resource-slot {
+ display: none !important;
+}
+/* Make the TP + Other Resource container a flex row so:
+ - both visible: TP on left, Other Resource on right (space-between)
+ - TP hidden: Other Resource sits on the left with no gap
+ Flex also ignores the float:right inline style on Other Resource and prevents height collapse. */
+input[name="attr_show_tp_resource"] + .sheet-hdice-dsaves-container {
+ display: flex !important;
+ justify-content: space-between;
+ align-items: flex-start;
+}
+
+/* ---- Feature: Hero Points ---- */
+.sheet-hero-points {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: stretch;
+ width: 100%;
+ margin-top: 8px;
+ border: 1px solid rgba(171,139,87,0.5);
+ border-radius: 6px;
+ overflow: hidden;
+}
+/* Header bar via pseudo-element — spans full flex row width */
+.sheet-hero-points::before {
+ content: 'HERO POINTS';
+ flex: 0 0 100%;
+ display: block;
+ font-family: 'Oxanium', sans-serif;
+ font-size: 9px;
+ font-weight: bold;
+ color: #245485;
+ text-align: center;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ border-bottom: 1px solid rgba(171,139,87,0.5);
+ padding: 3px 0;
+}
+/* Value column — the editable count */
+.sheet-hero-points .sheet-value {
+ flex: 0 0 48px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 4px;
+ border-right: 1px solid rgba(171,139,87,0.4);
+}
+.sheet-hero-points .sheet-value input {
+ font-size: 22px;
+ font-weight: bold;
+ color: #245485;
+ border: none;
+ background: transparent;
+ width: 40px;
+ height: auto;
+ text-align: center;
+ padding: 0;
+ box-shadow: none;
+}
+/* Label column — the roll button */
+.sheet-hero-points .sheet-label {
+ flex: 1;
+ position: relative;
+ display: flex;
+}
+.sheet-hero-points .sheet-label button {
+ flex: 1;
+ background: transparent;
+ background-image: none;
+ border: none;
+ box-shadow: none;
+ text-shadow: none;
+ padding: 4px 6px;
+ min-height: 38px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ border-radius: 0;
+ margin: 0 !important;
+ transition: background 0.2s;
+}
+.sheet-hero-points .sheet-label button::before {
+ content: none;
+}
+/* The header already says HERO POINTS — hide the redundant inner span */
+.sheet-hero-points .sheet-label button > span:first-child > span[data-i18n] {
+ display: none;
+}
+/* Style the outer span; the "(1D6)" text node inherits from it */
+.sheet-hero-points .sheet-label button > span:first-child {
+ font-family: 'Oxanium', sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+ color: #245485;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ line-height: 1;
+}
+/* "NONE LEFT" — hidden by default, shown in red when count reaches 0 */
+.sheet-hero-points .sheet-label button > span:last-of-type {
+ display: none;
+ font-family: 'Oxanium', sans-serif;
+ font-size: 8px;
+ font-weight: bold;
+ color: #c0392b;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ margin-top: 3px;
+}
+/* Hidden checkbox — triggers consumed_hero_points sheetworker on click */
+.sheet-hero-points .sheet-label button input {
+ position: absolute;
+ top: 0;
+ left: 0;
+ opacity: 0;
+ pointer-events: all;
+ width: 100% !important;
+ height: 100% !important;
+}
+/* Hover: gold tint with blue text */
+.charsheet .sheet-hero-points .sheet-label button:hover {
+ background: rgba(171,139,87,0.12) !important;
+}
+.charsheet .sheet-hero-points .sheet-label button:hover > span:first-child {
+ color: #066dce !important;
+}
+/* When hero_points = 0: disable button and reveal NONE LEFT */
+.sheet-hero-points input[name="attr_hero_points"][value="0"] ~ .sheet-label button {
+ pointer-events: none !important;
+}
+.sheet-hero-points input[name="attr_hero_points"][value="0"] ~ .sheet-label button > span:first-child {
+ opacity: 0.35;
+}
+.sheet-hero-points input[name="attr_hero_points"][value="0"] ~ .sheet-label button > span:last-of-type {
+ display: block;
+}
+/* Hide entire section when the setting is off */
+input[name="attr_use_hero_points"]:not([value="1"]) + .sheet-hero-points {
+ display: none;
+}
+
+/* ---- Feature 9: Skill Toggle (Show 5E Skills?) ---- */
+/* Hide the controlling checkbox inputs in the sheet flow */
+.sheet-show-5e-toggle,
+.sheet-show-5e-settings-toggle {
+ display: none;
+}
+/* Default: hide 5E separator (separator has no conflict with redesign) */
+.sheet-skills-container .sheet-fivee-separator {
+ display: none;
+ border-top: 1px solid #ccc;
+ margin: 2px 0;
+}
+/* When checked: reveal separator */
+input[name="attr_show_5e_skills"]:checked ~ .sheet-skills-container .sheet-fivee-separator {
+ display: block;
+}
+/* NOTE: fivee-skill hide/show rules are at the END of this file — they must
+ appear after the skill redesign block to win the cascade. */
+
+/* ---- Typography: Oxanium headers ---- */
+.charsheet h3,
+.charsheet h3 span,
+.charsheet .sheet-traits .sheet-display .sheet-title,
+.charsheet .sheet-spell .sheet-details span[name=attr_spellname],
+.charsheet .sheet-col-full .sheet-spell-header > span,
+.charsheet .sheet-npc .sheet-display .sheet-title span,
+.sheet-rolltemplate-npc .sheet-header,
+.sheet-rolltemplate-npcaction .sheet-header,
+.sheet-rolltemplate-npcatk .sheet-header,
+.sheet-rolltemplate-npcdmg .sheet-header,
+.sheet-rolltemplate-traits .sheet-header,
+.sheet-rolltemplate-spell .sheet-title,
+.charsheet .sheet-charmancer .sheet-compendium-class-name {
+ font-family: 'Oxanium', sans-serif;
+}
+
+/* ---- Feature 10: Currency Toggle (EG ↔ 5e) ---- */
+.sheet-equipment .sheet-fivee-currency {
+ display: none;
+}
+input[name="attr_currency_mode"][value="5e"] ~ .sheet-fivee-currency {
+ display: inline-block;
+}
+input[name="attr_currency_mode"][value="5e"] ~ .sheet-eg-currency {
+ display: none;
+}
+
+/* ---- Skills Section Redesign ---- */
+
+/* Container: flex column so label reorders to top */
+.charsheet .sheet-pc .sheet-page.sheet-core .sheet-skills-container {
+ display: flex;
+ flex-direction: column;
+ padding-top: 0;
+ overflow: hidden;
+}
+
+/* "SKILLS" label — moved to top, blue Oxanium header */
+.charsheet .sheet-pc .sheet-page.sheet-core .sheet-skills-container > .sheet-label {
+ order: -1;
+ padding: 6px 8px 4px;
+ border-bottom: 1px solid #ab8b57;
+}
+.charsheet .sheet-pc .sheet-page.sheet-core .sheet-skills-container > .sheet-label span {
+ font-family: 'Oxanium', sans-serif;
+ font-size: 11px;
+ font-weight: bold;
+ color: #245485;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+ text-align: left;
+ display: inline-block;
+ width: auto;
+ margin: 0;
+}
+
+/* Each skill row: flex, vertically centered */
+.charsheet .sheet-pc .sheet-page.sheet-core .sheet-skills-list .sheet-skill {
+ display: flex;
+ align-items: center;
+ height: auto !important;
+ min-height: 26px;
+ padding: 2px 6px;
+ gap: 5px;
+ box-sizing: border-box;
+ width: 100%;
+}
+
+/* Alternating rows */
+.charsheet .sheet-pc .sheet-page.sheet-core .sheet-skills-list .sheet-skill:nth-child(odd) {
+ background: transparent;
+ border-bottom: 1px solid rgba(171, 139, 87, 0.2);
+ border-top: none;
+}
+.charsheet .sheet-pc .sheet-page.sheet-core .sheet-skills-list .sheet-skill:nth-child(even) {
+ background: rgba(0, 0, 0, 0.03);
+ border-bottom: 1px solid rgba(171, 139, 87, 0.2);
+ border-top: none;
+}
+
+/* Roll button — skill name, left, flex-grow */
+.charsheet .sheet-pc .sheet-page.sheet-core .sheet-skills-list .sheet-skill button[type=roll] {
+ order: 1;
+ flex: 1;
+ display: flex;
+ align-items: center;
+ gap: 5px;
+ font-size: 12px;
+ font-weight: bold;
+ text-align: left;
+ background: transparent !important;
+ background-image: none !important;
+ border: none;
+ box-shadow: none;
+ text-shadow: none;
+ padding: 0;
+ width: auto;
+ overflow: visible;
+ white-space: nowrap;
+ color: inherit;
+}
+.charsheet .sheet-pc .sheet-page.sheet-core .sheet-skills-list .sheet-skill button[type=roll]::before {
+ content: "" !important;
+}
+
+/* Stat abbreviation inside the roll button — muted, small-caps */
+.charsheet .sheet-pc .sheet-page.sheet-core .sheet-skills-list .sheet-skill button[type=roll] span {
+ color: #888;
+ font-size: 9px;
+ font-weight: bold;
+ font-variant: small-caps;
+ text-transform: uppercase;
+ display: inline;
+ margin: 0;
+}
+
+/* Bonus badge — dark background, white text */
+.charsheet .sheet-pc .sheet-page.sheet-core .sheet-skills-list .sheet-skill > span {
+ order: 2;
+ background: #2c2c2c;
+ color: #fff;
+ font-size: 11px;
+ font-weight: bold;
+ min-width: 32px;
+ padding: 2px 5px;
+ border-radius: 3px;
+ text-align: center;
+ display: inline-block;
+ flex-shrink: 0;
+ box-sizing: border-box;
+}
+
+/* "+" prefix for non-negative, non-zero bonuses */
+.charsheet .sheet-pc .sheet-page.sheet-core .sheet-skills-list .sheet-skill input[type=hidden] + span::before {
+ content: "+";
+}
+.charsheet .sheet-pc .sheet-page.sheet-core .sheet-skills-list .sheet-skill input[type=hidden][value^="-"] + span::before,
+.charsheet .sheet-pc .sheet-page.sheet-core .sheet-skills-list .sheet-skill input[type=hidden][value="0"] + span::before {
+ content: "";
+}
+
+/* Proficiency pip — circular, gold border → blue fill when checked */
+.charsheet .sheet-pc .sheet-page.sheet-core .sheet-skills-list .sheet-skill input[type=checkbox] {
+ order: 3;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ width: 14px;
+ height: 14px;
+ border: 2px solid #ab8b57;
+ border-radius: 50%;
+ background: transparent;
+ cursor: pointer;
+ flex-shrink: 0;
+ margin: 0;
+}
+.charsheet .sheet-pc .sheet-page.sheet-core .sheet-skills-list .sheet-skill input[type=checkbox]:checked {
+ background: #066dce;
+ border-color: #066dce;
+}
+
+/* Proficient: bonus badge gets deeper blue */
+.charsheet .sheet-pc .sheet-page.sheet-core .sheet-skills-list .sheet-skill input[type=checkbox]:checked ~ span {
+ background: #066dce;
+}
+
+/* 5E skill row toggle — MUST be last: overrides redesign's display:flex (specificity 0,5,0) via
+ equal specificity + later cascade position (hide), and !important (show). */
+.charsheet .sheet-pc .sheet-page.sheet-core .sheet-skills-list .sheet-fivee-skill {
+ display: none;
+}
+input[name="attr_show_5e_skills"]:checked ~ .sheet-skills-container .sheet-fivee-skill {
+ display: flex !important;
+}
+
+/* ---- EG Logo footer — bottom-right of PC sheet, visible on all tabs ---- */
+.sheet-pc-logo-footer {
+ text-align: right;
+ padding: 12px 10px 8px 0;
+}
+.sheet-pc-logo-footer .sheet-pc-logo-img {
+ width: 266px;
+ opacity: 0.85;
}
-.sheet-pc-type[value=starship] ~ .sheet-pc .sheet-pc-ship .sheet-tab-button.sheet-type-starship + span {
- color: #FFFFFF;
- background-color: #00ba73;
-}
\ No newline at end of file
diff --git a/Esper_Genesis_5E/EG_Sheet.html b/Esper_Genesis_5E/EG_Sheet.html
index c0b009f59e..f05e57b8b2 100644
--- a/Esper_Genesis_5E/EG_Sheet.html
+++ b/Esper_Genesis_5E/EG_Sheet.html
@@ -1,4610 +1,45 @@
-
-
-
-
-
-
-
-
-
-
-
-
- ADVANTAGE
- NORMAL
- DISADVANTAGE
-
-
-
- PUBLIC
- TOGM
-
-
-
NPC
-
SHIP
-
-
y
-
-
-
-
-
-
-
-
Armor Class
-
- t INIT
-
-
Hit Points
-
-
-
Speed
-
-
-
- STR
-
-
-
-
- DEX
-
-
-
-
- CON
-
-
-
-
- INT
-
-
-
-
- WIS
-
-
-
-
- CHA
-
-
-
-
-
-
-
Saving Throws
-
- Str
-
- Dex
-
- Con
-
- Int
-
- Wis
-
- Cha
-
-
-
Skills
-
- Acrobatics
-
- Astrophysics
-
- Athletics
-
- Computers
-
- Deception
-
- Insight
-
- Intimidation
-
- Investigation
-
- Lore
-
- Mechanics
-
- Medicine
-
- Perception
-
- Performance
-
- Persuasion
-
- Sleight of Hand
-
- Stealth
-
- Survival
-
- Xenobiology
-
-
Damage Vulnerabilities
-
-
Damage Resistances
-
-
Damage Immunities
-
-
Condition Immunities
-
Senses
-
Languages
-
Challenge
-
-
-
-
-
-
-
Actions
-
-
-
y
-
-
-
-
-
- Weapon Attack:
- Hit:
-
-
-
-
-
-
-
-
-
-
-
Reactions
-
-
-
-
-
-
-
-
-
-
Legendary Actions
-
-
-
-
y
-
-
-
-
-
-
-
Weapon Attack:
-
Hit:
-
-
-
-
-
-
-
-
-
-
-
-
y
-
-
SHIP OPTIONS
-
NAME
-
-
-
SHIP TYPE
-
-
-
ARMOR CLASS
-
-
-
MANEUVER DEFENSE
-
-
-
MANEUVER SAVE DC
-
-
-
HULL POINTS
- FORMULA
-
-
-
STRUCTURAL INTEGRITY
-
-
-
SPEED
-
-
-
PILOTING BONUS
-
-
-
-
ATTRIBUTES (PILOT/CREW)
-
P-DEX
- P-WIS
- T-INT
- T-WIS
- G-DEX
- G-WIS
-
-
-
-
SAVES
-
DEX
- INT
- WIS
-
-
-
-
-
-
-
-
-
-
-
-
-
SKILLS
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
DAMAGE VULNERABILITIES
-
-
-
DAMAGE RESISTANCES
-
-
-
DAMAGE IMMUNITIES
-
-
-
CONDITION IMMUNITIES
-
-
-
SENSOR RANGE
-
-
-
TOKEN SIZE
-
-
-
-
ESPER NPC
-
ESPER ABILITY
-
- NONE
- STRENGTH
- DEXTERITY
- CONSTITUTION
- INTELLIGENCE
- WISDOM
- CHARISMA
-
-
-
-
-
- HAS REACTIONS
-
-
GENERAL OPTIONS
-
- NPC/SHIP
-
-
ROLL QUERIES:
-
- Advantage Toggle
- Always Roll Advantage
- Query Advantage
- Never Roll Advantage
-
-
-
WHISPER ROLLS TO GM:
-
- Never Whisper Rolls
- Whisper Toggle
- Query Whisper
- Always Whisper Rolls
-
-
-
AUTO DAMAGE ROLL:
-
- Auto Roll Damage & Crit
- Don't Auto Roll Damage
-
-
-
SHIP NAME IN ROLLS:
-
- Show
- Hide
-
-
-
- ADD DEX TIEBREAKER TO INITIATIVE
-
-
-
-
-
-
-
-
-
Armor Class
-
- t INIT
-
-
Maneuver Defense
-
Hull Points
-
-
-
Structural Integrity
-
Speed
-
-
-
- P-DEX
-
-
-
-
- P-WIS
-
-
-
-
- T-INT
-
-
-
-
- T-WIS
-
-
-
-
- G-DEX
-
-
-
-
- G-WIS
-
-
-
-
-
-
Piloting Bonus
-
-
-
-
-
t PILOT
-
Maneuver Save DC
-
Saving Throws
-
- Str
-
- Dex
-
- Con
-
- Int
-
- Wis
-
- Cha
-
-
-
Skills
-
- Astrophysics
-
- Athletics
-
- Computers
-
- Deception
-
- Insight
-
- Intimidation
-
- Investigation
-
- Lore
-
- Mechanics
-
- Medicine
-
- Perception
-
- Performance
-
- Persuasion
-
- Sleight of Hand
-
- Stealth
-
- Survival
-
- Xenobiology
-
-
Damage Vulnerabilities
-
-
Damage Resistances
-
-
Damage Immunities
-
-
Condition Immunities
-
Sensor Range
-
-
-
-
-
-
-
Actions
-
-
-
y
-
-
-
-
-
- Weapon Attack:
- Hit:
-
-
-
-
-
-
-
-
-
-
-
Reactions
-
-
-
-
-
-
-
-
-
-
-
-
CORE
-
BIO
-
POWERS
-
y
-
PC
-
STARSHIP
-
-
-
-
-
-
-
STRENGTH
-
0
-
-
-
-
-
-
-
-
DEXTERITY
-
0
-
-
-
-
-
-
-
-
CONSTITUTION
-
0
-
-
-
-
-
-
-
-
INTELLIGENCE
-
0
-
-
-
-
-
-
-
-
-
CHARISMA
-
0
-
-
-
-
-
-
-
-
-
-
-
-
- 0
- Strength
-
-
- 0
- Dexterity
-
-
- 0
- Constitution
-
-
- 0
- Intelligence
-
-
- 0
- Wisdom
-
-
- 0
- Charisma
-
-
-
GLOBAL SAVE MODIFIER
-
-
-
-
-
SAVING THROWS
-
-
-
-
-
-
-
-
PASSIVE WISDOM (PERCEPTION)
-
-
-
-
-
-
-
TYPE PROFICIENCY
-
-
-
y
-
-
TYPE:
-
- LANGUAGE
- WEAPON
- ARMOR
- OTHER
-
-
-
PROFICIENCY :
-
-
-
-
-
-
-
-
-
-
OTHER PROFICIENCIES & LANGUAGES
-
-
-
-
-
- ARMOR CLASS
-
-
- INITIATIVE
-
-
- SPEED
-
-
-
-
- TEMPORARY HIT POINTS
-
-
-
-
-
-
-
NAME ATK DAMAGE/TYPE
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
GLOBAL ATTACK MODIFIER
-
-
-
-
-
-
GLOBAL DAMAGE MODIFIER
-
-
-
-
ATTACKS & POWERS
-
-
-
-
-
-
-
-
-
-
-
- *
- WARNING - MULTIPLE SETS OF ARMOR OR SHIELDS HAVE BEEN ADDED AND AC IS NOT CORRECTLY CALCULATED. UNEQUIP THE ARMOR PIECE FROM THE ITEM DETAILS.
-
-
-
- *
- ATTENTION - YOUR CUSTOM AC CALCULATION IS NOT BEING USED AS YOU HAVE ARMOR EQUIPPED. IF YOU WANT TO USE YOUR CUSTOM AC, UNEQUIP THE ARMOR PIECE FROM THE ITEM DETAILS.
-
-
-
-
-
-
TOTAL WEIGHT
-
- IMMOBILE HEAVILY ENCUMBERED ENCUMBERED OVER CARRYING CAPACITY
-
-
EQUIPMENT
-
-
-
-
-
y
-
-
-
-
PERSONALITY TRAITS
-
-
-
-
-
-
-
-
-
-
-
-
w
-
y
-
-
-
NAME:
-
-
-
SOURCE:
-
- Species
- Class
- Feat
- Background
- Other
-
-
-
SOURCE TYPE:
-
-
-
-
-
-
-
-
-
-
FEATURES & TRAITS
-
-
-
Looking for missing data? Your data is in the simple version that can be re-enabled from the Settings tab of the character sheet. Under GENERAL OPTIONS and then FEATS & TRAITS. Set the section to be 'Simple'.
-
-
-
-
-
-
-
-
- CHARACTER APPEARANCE
-
-
- CHARACTER BACKSTORY
-
-
-
-
- ALLIES & ORGANIZATIONS
-
-
- ADDITIONAL FEATURES & TRAITS
-
-
- LOOT
-
-
-
-
-
-
-
-
-
-
TALENT SLOTS (Cybermancer)
-
-
-
-
-
Gained? Used
-
-
-
-
ESPER MASTERY
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- R C
-
-
i
-
-
y
-
-
NAME:
-
-
-
DOMAIN:
-
- Alteration
- Clairsentient
- Elemental
- Kinesis
- Metaphase
- Psychogenic
- Technique
-
- CONVENTIONAL
-
-
ACTIVATION TIME:
-
-
-
RANGE:
-
-
-
-
-
POINT COST:
-
- CONCENTRATION
-
-
DURATION:
-
-
-
ESPER ABILITY
-
- NONE
- POWER
- STRENGTH
- DEXTERITY
- CONSTITUTION
- INTELLIGENCE
- WISDOM
- CHARISMA
-
-
-
INNATE:
-
-
-
OUTPUT:
-
- POWERCARD
- ATTACK
-
-
-
-
-
DESCRIPTION:
-
-
-
-
AT HIGHER RANKS:
-
-
-
-
CLASS:
-
-
-
TYPE:
-
-
-
-
-
- Done
-
-
-
-
-
- (conventional )
-
-
Activation Time:
-
Point Cost:
-
Range:
-
-
Duration:
- Concentration
-
-
Description:
-
-
-
At Higher Ranks
-
-
-
-
-
SLOTS TOTAL SLOTS REMAINING
-
-
-
-
-
-
-
-
-
-
-
- (C) C
-
-
i
-
-
y
-
-
NAME:
-
-
-
DOMAIN:
-
- Alteration
- Clairsentient
- Elemental
- Kinesis
- Metaphase
- Psychogenic
- Technique
-
- CONVENTIONAL
-
-
ACTIVATION TIME:
-
-
-
RANGE:
-
-
-
-
-
POINT COST:
-
- CONCENTRATION
-
-
DURATION:
-
-
-
ESPER ABILITY
-
- NONE
- SPELL
- STRENGTH
- DEXTERITY
- CONSTITUTION
- INTELLIGENCE
- WISDOM
- CHARISMA
-
-
-
INNATE:
-
-
-
OUTPUT:
-
- POWERCARD
- ATTACK
-
-
-
-
-
DESCRIPTION:
-
-
-
-
AT HIGHER RANKS:
-
-
-
-
CLASS:
-
-
-
TYPE:
-
-
-
-
-
- Done
-
-
-
-
-
Rank
- (ritual )
-
-
Activation Time:
-
Point Cost:
-
Range:
-
-
Duration:
- Concentration
-
-
Description:
-
-
-
At Higher Ranks
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- R C
-
-
i
-
-
y
-
-
NAME:
-
-
-
DOMAIN:
-
- Alteration
- Clairsentient
- Elemental
- Kinesis
- Metaphase
- Psychogenic
- Technique
-
- CONVENTIONAL
-
-
ACTIVATION TIME:
-
-
-
RANGE:
-
-
-
-
-
POINT COST:
-
- CONCENTRATION
-
-
DURATION:
-
-
-
ESPER ABILITY
-
- NONE
- SPELL
- STRENGTH
- DEXTERITY
- CONSTITUTION
- INTELLIGENCE
- WISDOM
- CHARISMA
-
-
-
INNATE:
-
-
-
OUTPUT:
-
- POWERCARD
- ATTACK
-
-
-
-
-
DESCRIPTION:
-
-
-
-
AT HIGHER RANKS:
-
-
-
-
CLASS:
-
-
-
TYPE:
-
-
-
-
-
- Done
-
-
-
-
-
Rank
- (ritual )
-
-
Activation Time:
-
Point Cost:
-
Range:
-
-
Duration:
- Concentration
-
-
Description:
-
-
-
At Higher Ranks
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- R C
-
-
i
-
-
y
-
-
NAME:
-
-
-
DOMAIN:
-
- Alteration
- Clairsentient
- Elemental
- Kinesis
- Metaphase
- Psychogenic
- Technique
-
- CONVENTIONAL
-
-
ACTIVATION TIME:
-
-
-
RANGE:
-
-
-
-
-
POINT COST:
-
- CONCENTRATION
-
-
DURATION:
-
-
-
ESPER ABILITY
-
- NONE
- SPELL
- STRENGTH
- DEXTERITY
- CONSTITUTION
- INTELLIGENCE
- WISDOM
- CHARISMA
-
-
-
INNATE:
-
-
-
OUTPUT:
-
- POWERCARD
- ATTACK
-
-
-
-
-
DESCRIPTION:
-
-
-
-
AT HIGHER RANKS:
-
-
-
-
CLASS:
-
-
-
TYPE:
-
-
-
-
-
- Done
-
-
-
-
-
-
Rank
- (ritual )
-
-
Activation Time:
-
Point Cost:
-
Range:
-
-
Duration:
- Concentration
-
-
Description:
-
-
-
At Higher Ranks
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- R C
-
-
i
-
-
y
-
-
NAME:
-
-
-
DOMAIN:
-
- Alteration
- Clairsentient
- Elemental
- Kinesis
- Metaphase
- Psychogenic
- Technique
-
- CONVENTIONAL
-
-
ACTIVATION TIME:
-
-
-
RANGE:
-
-
-
-
-
POINT COST:
-
- CONCENTRATION
-
-
DURATION:
-
-
-
ESPER ABILITY
-
- NONE
- SPELL
- STRENGTH
- DEXTERITY
- CONSTITUTION
- INTELLIGENCE
- WISDOM
- CHARISMA
-
-
-
INNATE:
-
-
-
OUTPUT:
-
- POWERCARD
- ATTACK
-
-
-
-
-
DESCRIPTION:
-
-
-
-
AT HIGHER RANKS:
-
-
-
-
CLASS:
-
-
-
TYPE:
-
-
-
-
-
- Done
-
-
-
-
-
Rank
- (ritual )
-
-
Activation Time:
-
Point Cost:
-
Range:
-
-
Duration:
- Concentration
-
-
Description:
-
-
-
At Higher Ranks
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- R C
-
-
i
-
-
y
-
-
NAME:
-
-
-
DOMAIN:
-
- Alteration
- Clairsentient
- Elemental
- Kinesis
- Metaphase
- Psychogenic
- Technique
-
- CONVENTIONAL
-
-
ACTIVATION TIME:
-
-
-
RANGE:
-
-
-
-
-
POINT COST:
-
- CONCENTRATION
-
-
DURATION:
-
-
-
ESPER ABILITY
-
- NONE
- SPELL
- STRENGTH
- DEXTERITY
- CONSTITUTION
- INTELLIGENCE
- WISDOM
- CHARISMA
-
-
-
INNATE:
-
-
-
OUTPUT:
-
- POWERCARD
- ATTACK
-
-
-
-
-
DESCRIPTION:
-
-
-
-
AT HIGHER RANKS:
-
-
-
-
CLASS:
-
-
-
TYPE:
-
-
-
-
-
- Done
-
-
-
-
-
Rank
- (ritual )
-
-
Activation Time:
-
Point Cost:
-
Range:
-
-
Duration:
- Concentration
-
-
Description:
-
-
-
At Higher Ranks
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- R C
-
-
i
-
-
y
-
-
NAME:
-
-
-
DOMAIN:
-
- Alteration
- Clairsentient
- Elemental
- Kinesis
- Metaphase
- Psychogenic
- Technique
-
- CONVENTIONAL
-
-
ACTIVATION TIME:
-
-
-
RANGE:
-
-
-
-
-
POINT COST:
-
- CONCENTRATION
-
-
DURATION:
-
-
-
ESPER ABILITY
-
- NONE
- SPELL
- STRENGTH
- DEXTERITY
- CONSTITUTION
- INTELLIGENCE
- WISDOM
- CHARISMA
-
-
-
INNATE:
-
-
-
OUTPUT:
-
- POWERCARD
- ATTACK
-
-
-
-
-
DESCRIPTION:
-
-
-
-
AT HIGHER RANKS:
-
-
-
-
CLASS:
-
-
-
TYPE:
-
-
-
-
-
- Done
-
-
-
-
-
Rank
- (ritual )
-
-
Activation Time:
-
Point Cost:
-
Range:
-
-
Duration:
- Concentration
-
-
Description:
-
-
-
At Higher Ranks
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- R C
-
-
i
-
-
y
-
-
NAME:
-
-
-
DOMAIN:
-
- Alteration
- Clairsentient
- Elemental
- Kinesis
- Metaphase
- Psychogenic
- Technique
-
- CONVENTIONAL
-
-
ACTIVATION TIME:
-
-
-
RANGE:
-
-
-
-
-
POINT COST:
-
- CONCENTRATION
-
-
DURATION:
-
-
-
ESPER ABILITY
-
- NONE
- SPELL
- STRENGTH
- DEXTERITY
- CONSTITUTION
- INTELLIGENCE
- WISDOM
- CHARISMA
-
-
-
INNATE:
-
-
-
OUTPUT:
-
- POWERCARD
- ATTACK
-
-
-
-
-
DESCRIPTION:
-
-
-
-
AT HIGHER RANKS:
-
-
-
-
CLASS:
-
-
-
TYPE:
-
-
-
-
-
- Done
-
-
-
-
-
Rank
- (ritual )
-
-
Activation Time:
-
Point Cost:
-
Range:
-
-
Duration:
- Concentration
-
-
Description:
-
-
-
At Higher Ranks
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- R C
-
-
i
-
-
y
-
-
NAME:
-
-
-
DOMAIN:
-
- Alteration
- Clairsentient
- Elemental
- Kinesis
- Metaphase
- Psychogenic
- Technique
-
- CONVENTIONAL
-
-
ACTIVATION TIME:
-
-
-
RANGE:
-
-
-
-
-
POINT COST:
-
- CONCENTRATION
-
-
DURATION:
-
-
-
ESPER ABILITY
-
- NONE
- SPELL
- STRENGTH
- DEXTERITY
- CONSTITUTION
- INTELLIGENCE
- WISDOM
- CHARISMA
-
-
-
INNATE:
-
-
-
OUTPUT:
-
- POWERCARD
- ATTACK
-
-
-
-
-
DESCRIPTION:
-
-
-
-
AT HIGHER RANKS:
-
-
-
-
CLASS:
-
-
-
TYPE:
-
-
-
-
-
- Done
-
-
-
-
-
Rank
- (ritual )
-
-
Activation Time:
-
Point Cost:
-
Range:
-
-
Duration:
- Concentration
-
-
Description:
-
-
-
At Higher Ranks
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- R C
-
-
i
-
-
y
-
-
NAME:
-
-
-
DOMAIN:
-
- Alteration
- Clairsentient
- Elemental
- Kinesis
- Metaphase
- Psychogenic
- Technique
-
- CONVENTIONAL
-
-
ACTIVATION TIME:
-
-
-
RANGE:
-
-
-
-
-
POINT COST:
-
- CONCENTRATION
-
-
DURATION:
-
-
-
ESPER ABILITY
-
- NONE
- SPELL
- STRENGTH
- DEXTERITY
- CONSTITUTION
- INTELLIGENCE
- WISDOM
- CHARISMA
-
-
-
INNATE:
-
-
-
OUTPUT:
-
- POWERCARD
- ATTACK
-
-
-
-
-
DESCRIPTION:
-
-
-
-
AT HIGHER RANKS:
-
-
-
-
CLASS:
-
-
-
TYPE:
-
-
-
-
-
- Done
-
-
-
-
-
Rank
- (ritual )
-
-
Activation Time:
-
Point Cost:
-
Range:
-
-
Duration:
- Concentration
-
-
Description:
-
-
-
At Higher Ranks
-
-
-
-
-
-
-
-
-
-
-
-
-
-
HIT DIE:
-
- D4
- D6
- D8
- D10
- D12
-
-
-
CARRYING CAPACITY MODIFIER:
-
-
-
GLOBAL POWER ATTACK MODIFIER:
-
-
-
CHANNELER / FORGER LEVEL:
-
-
-
POWER SAVE DC MOD:
-
-
-
POWER ICONS:
-
- Show All
- None
-
-
-
- JUSTICAR (WARRIOR)
-
-
- ARTIFICE (SPECIALIST)
-
-
CLASS OPTIONS ( )
-
-
-
-
- USE CUSTOM CLASS
-
-
CLASS NAME:
-
-
-
HIT DIE:
-
- D4
- D6
- D8
- D10
- D12
-
-
-
ESPER ABILITY:
-
- NONE
- STRENGTH
- DEXTERITY
- CONSTITUTION
- INTELLIGENCE
- WISDOM
- CHARISMA
-
-
-
POWER SLOTS:
-
- NONE
- FULL (Adept, Engineer, Melder)
- HALF (Hunter, Sentinel)
- THIRD (Artifice, Justicar)
-
-
-
SAVES
-
- Strength
-
-
- Dexterity
-
-
- Constitution
-
-
- Intelligence
-
-
- Wisdom
-
-
- Charisma
-
-
CUSTOM CLASS OPTIONS
-
-
-
-
-
-
TECH SLOT MODIFIERS
-
-
-
-
-
-
-
-
- JACK OF ALL TRADES
-
-
PASSIVE PERCEPTION MODIFIER:
-
-
-
SKILL OPTIONS
-
-
-
-
-
v
-
- NPC/SHIP
-
-
ROLL QUERIES:
-
- Advantage Toggle
- Always Roll Advantage
- Query Advantage
- Never Roll Advantage
-
-
-
WHISPER ROLLS TO GM:
-
- Never Whisper Rolls
- Whisper Toggle
- Query Whisper
- Always Whisper Rolls
-
-
-
AUTO DAMAGE ROLL:
-
- Auto Roll Damage & Crit
- Don't Auto Roll Damage
-
-
-
CORE DIE ROLL:
-
-
-
PROFICIENCY BONUS:
-
- By Level (Default)
- Proficency Die (DMG)
- Custom
-
-
-
-
-
- SHOW GLOBAL SAVE MODIFIER FIELD
-
-
- SHOW GLOBAL SKILL MODIFIER FIELD
-
-
- SHOW GLOBAL ATTACK MODIFIER FIELD
-
-
- SHOW GLOBAL DAMAGE MODIFIER FIELD
-
-
- SHOW GLOBAL AC MODIFIER FIELD
-
-
ADD CHARACTER NAME TO TEMPLATES:
-
- On
- Off
-
-
-
LEVEL CALCULATIONS:
-
- On
- Off
-
-
-
ENCUMBRANCE:
-
- Simple
- Variant (Core M. p160)
- Off
-
-
-
INVENTORY:
-
- Simple
- Compendium Compatible
-
-
-
FEATURES AND TRAITS :
-
- Simple
- Compendium Compatible
-
-
-
PROFICENCIES AND LANGUAGES :
-
- Simple
- Compendium Compatible
-
-
-
AMMO TRACKING:
-
- On
- Off
- (API REQUIRED)
-
-
SHOW EXHAUSTION TRACKING:
-
- On
- Off
-
-
-
GENERAL OPTIONS
-
-
-
-
-
-
-
-
-
PC
-
STARSHIP
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-ACCEPTING DROP FROM COMPENDIUM
-Are you sure you want to turn this character into a ?
-
-
-How do you want to create this character?
-
-
+
NPC SHIP y
Armor Class t INIT
Hit Points
Speed
Saving Throws Str Dex Con Int Wis Cha
Skills Acrobatics Astrophysics Athletics Computers Deception Insight Intimidation Investigation Lore Mechanics Medicine Perception Performance Persuasion Sleight of Hand Stealth Survival Xenobiology
Damage Vulnerabilities
Damage Resistances
Damage Immunities
Condition Immunities
Senses
Languages
Challenge
y
Armor Class t INIT
Maneuver Defense
Hull Points
Structural Integrity
Speed
P-DEX
P-WIS
T-INT
T-WIS
G-DEX
G-WIS
Piloting Bonus
t PILOT Maneuver Save DC
Saving Throws Str Dex Con Int Wis Cha
Skills Astrophysics Athletics Computers Deception Insight Intimidation Investigation Lore Mechanics Medicine Perception Performance Persuasion Sleight of Hand Stealth Survival Xenobiology
Damage Vulnerabilities
Damage Resistances
Damage Immunities
Condition Immunities
Sensor Range
CORE GEAR & BIO POWERS
PC STARSHIP
PASSIVE WISDOM (PERCEPTION)
OTHER PROFICIENCIES & LANGUAGES
Looking for missing data? Your data is in the simple version that can be re-enabled from the Settings tab of the character sheet. Under GENERAL OPTIONS and then FEATS & TRAITS. Set the section to be 'Simple'.
CORE GEAR & BIO POWERS
PC STARSHIP
AGE
SIZE
HEIGHT
WEIGHT
ALIGNMENT
CHARACTER APPEARANCE
PERSONALITY TRAITS
IDEALS
BONDS
FLAWS
CHARACTER HISTORY
CORE GEAR & BIO POWERS
PC STARSHIP
NONE STRENGTH DEXTERITY CONSTITUTION INTELLIGENCE WISDOM CHARISMA ESPER ABILITY
POWER SAVE DC
POWER ATTACK BONUS
SLOTS TOTAL SLOTS REMAINING ACCEPTING DROP FROM COMPENDIUM
Are you sure you want to turn this character into a ? How do you want to create this character?
@@ -5736,84 +1171,650 @@
{{/r20}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/Esper_Genesis_5E/EG_Sheet.pug b/Esper_Genesis_5E/EG_Sheet.pug
index cffbe6421b..9bd9afc417 100644
--- a/Esper_Genesis_5E/EG_Sheet.pug
+++ b/Esper_Genesis_5E/EG_Sheet.pug
@@ -13,7 +13,7 @@
include src/mixins/mixins.pug
-input(name='attr_version' type='hidden' value!='3.0')
+input(name='attr_version' type='hidden' value!='4.2')
input.monster_confirm_flag(name='attr_monster_confirm_flag' type='hidden')
input.mancer_confirm_flag(name='attr_mancer_confirm_flag' type='hidden')
input.licensedsheet(name='attr_licensedsheet' type='hidden')
@@ -23,22 +23,23 @@ input.licensedsheet(name='attr_licensedsheet' type='hidden')
input.npcspellcastingflag(name='attr_npcspellcastingflag' type='hidden' value!='0')
input.sheet-pc-type(name='attr_pc_sheet_type' type='hidden' value='pc')
input.npcspellcastingflag(name='attr_npcspellcastingflag' type='hidden')
- input.toggleflag(name='attr_rtype' type='hidden')
- .advantagetoggle
- input.toggle-left(type='radio' name='attr_advantagetoggle' value!='{{query=1}} {{advantage=1}} {{r2=[[@{d20}')
- span(data-i18n='adv-u') ADVANTAGE
- input.toggle-center(type='radio' name='attr_advantagetoggle' value!='{{query=1}} {{normal=1}} {{r2=[[0d20' checked='checked')
- span(data-i18n='norm-u') NORMAL
- input.toggle-right(type='radio' name='attr_advantagetoggle' value!='{{query=1}} {{disadvantage=1}} {{r2=[[@{d20}')
- span(data-i18n='disadv-u') DISADVANTAGE
- input.toggleflag(name='attr_wtype' type='hidden')
- .advantagetoggle.whispertoggle
- input.toggle-left(name='attr_whispertoggle' type='radio' value!='' checked='checked')
- span(data-i18n='public:-u') PUBLIC
- input.toggle-right(name='attr_whispertoggle' type='radio' value!='/w gm ')
- span(data-i18n='to-gm:-u')
- | TO
- span.togm GM
+ .top-bar
+ input.toggleflag(name='attr_rtype' type='hidden')
+ .advantagetoggle
+ input.toggle-left(type='radio' id='adv-toggle-adv' name='attr_advantagetoggle' value!='{{query=1}} {{advantage=1}} {{r2=[[@{d20}')
+ label(for='adv-toggle-adv' data-i18n='adv-u') ADVANTAGE
+ input.toggle-center(type='radio' id='adv-toggle-norm' name='attr_advantagetoggle' value!='{{query=1}} {{normal=1}} {{r2=[[0d20' checked='checked')
+ label(for='adv-toggle-norm' data-i18n='norm-u') NORMAL
+ input.toggle-right(type='radio' id='adv-toggle-disadv' name='attr_advantagetoggle' value!='{{query=1}} {{disadvantage=1}} {{r2=[[@{d20}')
+ label(for='adv-toggle-disadv' data-i18n='disadv-u') DISADVANTAGE
+ input.toggleflag(name='attr_wtype' type='hidden')
+ .advantagetoggle.whispertoggle
+ input.toggle-left(id='whisper-toggle-pub' name='attr_whispertoggle' type='radio' value!='' checked='checked')
+ label(for='whisper-toggle-pub' data-i18n='public:-u') PUBLIC
+ input.toggle-right(id='whisper-toggle-gm' name='attr_whispertoggle' type='radio' value!='/w gm ')
+ label(for='whisper-toggle-gm' data-i18n='to-gm:-u') WHISPER
+ input.npc-mode-mirror(type='checkbox' name='attr_npc' value='1')
+ label.settings-modal-btn(for='settings-modal-toggle') ⚙ SHEET SETTINGS
include src/npc/npc.pug
.container.pc
@@ -69,10 +70,9 @@ input.licensedsheet(name='attr_licensedsheet' type='hidden')
.mancer_confirm
span(style='line-height: 25px' data-i18n='do_you_want_mancer') How do you want to create this character?
div(style='margin-top: 20px;')
- //
- div(style='position: relative; display: inline-block; width:130px;')
- input.yes(type='checkbox' style='width:130px;' name='attr_mancer_confirm')
- span.yes(style='width:130px;' data-i18n='mancer-confirm-yes') Use the Charactermancer
+ div(style='position: relative; display: inline-block; width:130px;')
+ input.yes(type='checkbox' style='width:130px;' name='attr_mancer_confirm')
+ span.yes(style='width:130px;' data-i18n='mancer-confirm-yes') Use the Charactermancer
div(style='position: relative; display: inline-block; width:80px;')
input.yes(style='width:80px;' type='checkbox' name='attr_mancer_npc')
span.yes(style='width:80px;' data-i18n='npc-new') Create an NPC
@@ -84,13 +84,13 @@ input.licensedsheet(name='attr_licensedsheet' type='hidden')
include src/rolltemplates/rolltemplates.html
//- CHARACTERMANCER REPEATING SECTIONS
- include src/charactermancer/repeating/repeatingsections.html
+include src/charactermancer/repeating/repeatingsections.html
//- CHARACTERMANCER LEVEL 1
- include src/charactermancer/l1/l1.pug
+include src/charactermancer/l1/l1.pug
//- CHARACTERMANCER LEVEL UP
- include src/charactermancer/lp/lp.pug
+include src/charactermancer/lp/lp.pug
//- HIDDEN INPUTS
include src/hiddeninputs/hiddeninputs.pug
diff --git a/Esper_Genesis_5E/EG_Sheet.sass b/Esper_Genesis_5E/EG_Sheet.sass
index 6ac492692a..14dc3036c6 100644
--- a/Esper_Genesis_5E/EG_Sheet.sass
+++ b/Esper_Genesis_5E/EG_Sheet.sass
@@ -1,3 +1,6 @@
+@import url('https://fonts.googleapis.com/css2?family=Oxanium:wght@400;700&family=Noto+Sans:wght@400;700&display=swap')
+@import url('https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&icon_names=arrow_upload_ready,expand_more,settings,star_shine')
+
/* Esper Genesis Character Sheet
.sheet-pc, .sheet-npc
@@ -8,15 +11,23 @@
display: block
.sheet-container
- width: 750px
+ width: 860px
background-color: white
position: relative
+// All page/type tab inputs — hidden; CSS ~ combinator still reaches sibling elements
+input[type=radio].sheet-tab-button.sheet-core,
+input[type=radio].sheet-tab-button.sheet-bio,
+input[type=radio].sheet-tab-button.sheet-spells,
+input[type=radio].sheet-tab-button.sheet-type-pc,
+input[type=radio].sheet-tab-button.sheet-type-starship
+ display: none
+
input[type=radio]
&.sheet-tab-button
opacity: 0
position: absolute
- top: 92px
+ top: 290px
right: 0px
width: 18px
height: 18px
@@ -24,16 +35,18 @@ input[type=radio]
+ span
position: absolute
- top: 92px
+ top: 290px
right: 0px
width: 17px
- height: 17px
+ height: 18px
border: 1px solid black
border-radius: 5px
background-color: #E8E8E8
color: black
text-align: center
font-weight: bold
+ font-family: 'Noto Sans', sans-serif
+ padding: 0.5px
&.sheet-npc-button
opacity: 0
@@ -49,112 +62,92 @@ input[type=radio]
top: 5px
right: 0px
width: 17px
- height: 17px
+ height: 18px
border: 1px solid black
border-radius: 5px
background-color: #E8E8E8
color: black
text-align: center
font-weight: bold
+ font-family: 'Noto Sans', sans-serif
+ padding: 0.5px
+// Top bar — document-flow row for toggle groups + settings button
+.sheet-top-bar
+ display: flex
+ align-items: center
+ width: 860px
+ min-height: 28px
+ padding: 3px 5px
+ box-sizing: border-box
+ gap: 8px
+
+// Toggle groups — hidden by default, shown as flex row when enabled in settings
.sheet-advantagetoggle
position: absolute
- top: 92px
- left: 440px
- z-index: 1
-
- input[type=radio]
- opacity: 0
- position: absolute
- top: 0px
- right: 0px
- width: 18px
- height: 18px
- z-index: 2
-
- + span
- position: absolute
- top: 0px
- right: 0px
- width: 17px
- height: 17px
- border: 1px solid black
- border-radius: 5px
- background-color: #E8E8E8
- color: black
- text-align: center
- font-weight: bold
-
- &:checked + span
- color: #FFFFFF
- background-color: #00ba73
-
-input[type=radio].sheet-tab-button:checked + span, .sheet-advantagetoggle input[type=radio]:checked + span, input[type=radio].sheet-npc-button:checked + span
- color: #FFFFFF
- background-color: #00ba73
-
-.sheet-advantagetoggle input
- &.sheet-toggle-left
- right: 181px
- width: 90px
-
- + span
- right: 181px
- width: 90px
-
- &.sheet-toggle-center
- right: 113px
- width: 65px
-
- + span
- right: 113px
- width: 65px
-
- &.sheet-toggle-right
- right: 0px
- width: 110px
-
- + span
- right: 0px
- width: 110px
+ top: 3px
+ left: 160px
+ display: none
+ align-items: center
+ gap: 3px
+ z-index: 3
.sheet-whispertoggle
- left: 150px
-
-.sheet-advantagetoggle.sheet-whispertoggle input
- &.sheet-toggle-right
- width: 50px
-
- + span
- width: 50px
-
- &.sheet-toggle-left
- right: 54px
- width: 55px
-
- + span
- right: 54px
- width: 55px
-
-.sheet-npc_toggle[value="1"] ~ .sheet-advantagetoggle
- top: -10px
- left: 390px
-
- &.sheet-whispertoggle
- top: -10px
- left: 120px
-
-.sheet-advantagetoggle
- display: none
+ left: 5px
.sheet-toggleflag
&[value*="advantagetoggle"] + .sheet-advantagetoggle, &[value*="whispertoggle"] + .sheet-whispertoggle
- display: block
+ display: flex
&[value="1"] +
.sheet-hidden, .sheet-row.sheet-hidden
display: block
+// Radio inputs hidden — label handles clicks
+.sheet-advantagetoggle input[type=radio]
+ display: none
+
+// Toggle button labels
+.sheet-advantagetoggle input[type=radio] + label
+ border: 1px solid #ab8b57
+ border-radius: 5px
+ background-color: #e8e8e8
+ color: #333
+ text-align: center
+ font-weight: bold
+ font-size: 11px
+ padding: 3px 10px
+ cursor: pointer
+ white-space: nowrap
+
+// Active toggle button
+.sheet-advantagetoggle input[type=radio]:checked + label
+ color: #fff
+ background-color: #ab8b57
+ border-color: #ab8b57
+
+// Keep npc-button active style
+input[type=radio].sheet-npc-button:checked + span
+ color: #FFFFFF
+ background-color: #00ba73
+
+// NPC mode — restyle toggle labels to text-only nav
+.sheet-npc_toggle[value="1"] ~ .sheet-top-bar .sheet-advantagetoggle input[type=radio] + label
+ text-transform: lowercase
+ font-variant: small-caps
+ font-weight: normal
+ background: transparent
+ border: none
+
+.sheet-npc_toggle[value="1"] ~ .sheet-top-bar .sheet-advantagetoggle input[type=radio] + label:first-letter,
+.sheet-npc_toggle[value="1"] ~ .sheet-top-bar .sheet-advantagetoggle input[type=radio] + label .sheet-togm
+ text-transform: uppercase
+
+.sheet-npc_toggle[value="1"] ~ .sheet-top-bar .sheet-advantagetoggle input[type=radio]:checked + label
+ font-weight: bold
+ color: #245485
+ background: transparent
+
.sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc
display: block
visibility: hidden
@@ -175,7 +168,7 @@ input[type=radio].sheet-tab-button:checked + span, .sheet-advantagetoggle input[
display: block
- &.sheet-core, &.sheet-bio, &.sheet-options
+ &.sheet-core, &.sheet-bio
display: none
&.sheet-spells .sheet-body
@@ -184,30 +177,15 @@ input[type=radio].sheet-tab-button:checked + span, .sheet-advantagetoggle input[
.sheet-col
//display: block
-.sheet-hidden, .sheet-options .sheet-row.sheet-hidden
+.sheet-hidden, .sheet-options .sheet-row.sheet-hidden, .sheet-settings-modal-body .sheet-row.sheet-hidden
display: none
-.sheet-npc_toggle[value="1"] ~ .sheet-advantagetoggle input[type=radio]
- + span
- text-transform: lowercase
- font-variant: small-caps
- font-weight: normal
- background: transparent
- border: none
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif
-
- &:first-letter, > span.togm
- text-transform: uppercase
-
- &:checked + span
- font-weight: bold
- color: #245485
.sheet-page
display: none
input[type=radio].sheet-tab-button
- &.sheet-core:checked ~ .sheet-page.sheet-core, &.sheet-bio:checked ~ .sheet-page.sheet-bio, &.sheet-spells:checked ~ .sheet-page.sheet-spells, &.sheet-options:checked ~ .sheet-page.sheet-options
+ &.sheet-core:checked ~ .sheet-page.sheet-core, &.sheet-bio:checked ~ .sheet-page.sheet-bio, &.sheet-spells:checked ~ .sheet-page.sheet-spells
display: block
.sheet-page
@@ -219,53 +197,233 @@ input[type=radio]
&.sheet-npcs:checked ~ .sheet-page.sheet-npcs, &.sheet-ships:checked ~ .sheet-page.sheet-ships
display: block
- &.sheet-tab-button
- &.sheet-core
- right: 245px
- width: 45px
+// Tab row — in document flow, sits between abilities bar and body
+.sheet-tab-row
+ position: relative
+ display: flex
+ flex-direction: row
+ padding: 2px 0 0
+ align-items: flex-end
+ min-height: 28px
+ margin-top: -4.5px
+ margin-bottom: 12px
+ z-index: 1
- + span
- right: 245px
- width: 45px
+// Shared label style for both groups
+.sheet-tab-row .sheet-tab-label,
+.sheet-ship-tab-row .sheet-tab-label
+ border: 1px solid #bbb
+ border-radius: 0 0 6px 6px
+ background-color: #e8e8e8
+ color: #555
+ text-align: center
+ font-weight: bold
+ font-family: 'Oxanium', sans-serif
+ font-size: 13px
+ padding: 3px 12px
+ cursor: pointer
+ white-space: nowrap
- &.sheet-bio
- right: 210px
- width: 30px
+// Main group: CORE / GEAR & BIO / POWERS — absolutely centered on the row
+.sheet-tab-main-group
+ position: absolute
+ left: 50%
+ transform: translateX(-50%)
+ bottom: 0
+ display: flex
+ gap: 4px
- + span
- right: 210px
- width: 30px
+ .sheet-tab-label
+ min-width: 100px
- &.sheet-spells
- right: 145px
- width: 60px
+// Type group: PC / STARSHIP — right-aligned
+.sheet-tab-type-group
+ margin-left: auto
+ display: flex
+ gap: 4px
- + span
- right: 145px
- width: 60px
+// Ship sheet tab row
+.sheet-ship-tab-row
+ display: flex
+ justify-content: flex-end
+ gap: 4px
+ margin-top: -20px
+ margin-bottom: 12px
+
+ .sheet-tab-label
+ flex: 0 0 auto
+ width: auto
+
+// Active tab — gold
+input[type=radio].sheet-tab-button
+ &.sheet-core:checked ~ .sheet-page.sheet-core .sheet-tab-row .sheet-tab-label.sheet-core,
+ &.sheet-bio:checked ~ .sheet-page.sheet-bio .sheet-tab-row .sheet-tab-label.sheet-bio,
+ &.sheet-spells:checked ~ .sheet-page.sheet-spells .sheet-tab-row .sheet-tab-label.sheet-spells
+ color: #fff
+ background-color: #ab8b57
+ border-color: #ab8b57
+
+// PC label gold by default; STARSHIP checked state overrides
+.sheet-tab-row .sheet-tab-label.sheet-type-pc,
+.sheet-ship-tab-row .sheet-tab-label.sheet-type-pc
+ color: #fff
+ background-color: #ab8b57
+ border-color: #ab8b57
+
+// When STARSHIP is explicitly checked: un-highlight PC, highlight STARSHIP
+input[type=radio].sheet-tab-button.sheet-type-starship:checked ~ .sheet-page.sheet-core .sheet-tab-row .sheet-tab-label.sheet-type-pc,
+input[type=radio].sheet-tab-button.sheet-type-starship:checked ~ .sheet-page.sheet-bio .sheet-tab-row .sheet-tab-label.sheet-type-pc,
+input[type=radio].sheet-tab-button.sheet-type-starship:checked ~ .sheet-page.sheet-spells .sheet-tab-row .sheet-tab-label.sheet-type-pc
+ color: #555
+ background-color: #e8e8e8
+ border-color: #bbb
+
+input[type=radio].sheet-tab-button.sheet-type-starship:checked ~ .sheet-page.sheet-core .sheet-tab-row .sheet-tab-label.sheet-type-starship,
+input[type=radio].sheet-tab-button.sheet-type-starship:checked ~ .sheet-page.sheet-bio .sheet-tab-row .sheet-tab-label.sheet-type-starship,
+input[type=radio].sheet-tab-button.sheet-type-starship:checked ~ .sheet-page.sheet-spells .sheet-tab-row .sheet-tab-label.sheet-type-starship
+ color: #fff
+ background-color: #ab8b57
+ border-color: #ab8b57
+
+// Ship tab-row: PC highlighted by default, STARSHIP overrides
+input[type=radio].sheet-tab-button.sheet-type-starship:checked ~ .sheet-ship-tab-row .sheet-tab-label.sheet-type-pc
+ color: #555
+ background-color: #e8e8e8
+ border-color: #bbb
+
+input[type=radio].sheet-tab-button.sheet-type-starship:checked ~ .sheet-ship-tab-row .sheet-tab-label.sheet-type-starship
+ color: #fff
+ background-color: #ab8b57
+ border-color: #ab8b57
+
+// Hover — gold highlight on inactive tabs
+.sheet-tab-row .sheet-tab-label:hover,
+.sheet-ship-tab-row .sheet-tab-label:hover
+ background-color: #ab8b57
+ border-color: #ab8b57
+ color: #fff
+
+ // Sheet Settings — Modal (replaces tab button)
+
+// Settings modal toggle checkbox — hidden, drives :checked ~ overlay
+input[type=checkbox].sheet-settings-modal-toggle
+ display: none
+
+ &:checked ~ .sheet-settings-modal-overlay
+ display: block
+
+// Settings modal open button (replaces the old tab radio + span)
+label.sheet-settings-modal-btn
+ margin-left: auto
+ display: flex
+ align-items: center
+ justify-content: center
+ text-align: center !important
+ padding: 0 !important
+ width: 130px
+ height: 24px
+ white-space: nowrap
+ font-family: 'Oxanium', sans-serif
+ font-size: 10px
+ letter-spacing: 0.5px
+ text-transform: uppercase
+ border: 1px solid #ab8b57
+ border-radius: 3px
+ color: #245485
+ background-color: #fff
+ cursor: pointer
+ box-sizing: border-box
+
+ &:hover
+ background-color: #245485
+ color: #fff
+ border-color: #245485
+
+// Hide Sheet Settings button when NPC/Ship mode is active
+.sheet-npc-mode-mirror
+ display: none
+ &:checked ~ label.sheet-settings-modal-btn
+ display: none
+
+// Settings modal overlay
+.sheet-settings-modal-overlay
+ display: none
+ position: absolute
+ top: 0
+ left: 0
+ width: 100%
+ height: 100%
+ z-index: 200
+
+ > label.sheet-settings-modal-backdrop
+ display: block
+ position: absolute
+ top: 0
+ left: 0
+ width: 100%
+ height: 100%
+ background: rgba(0, 0, 0, 0.5)
+ cursor: pointer
+
+// Settings modal panel
+.sheet-settings-modal-panel
+ position: absolute
+ top: 30px
+ left: 10px
+ right: 10px
+ max-height: calc(100% - 40px)
+ background: #fff
+ border: 2px solid #ab8b57
+ border-radius: 8px
+ overflow: hidden
+ display: flex
+ flex-direction: column
+ z-index: 201
+
+// Settings modal header bar
+.sheet-settings-modal-header
+ display: flex
+ align-items: center
+ justify-content: space-between
+ padding: 6px 12px
+ background: #245485
+ flex-shrink: 0
+
+.sheet-settings-modal-title
+ font-family: 'Oxanium', sans-serif
+ font-size: 12px
+ font-weight: bold
+ font-variant: small-caps
+ letter-spacing: 1px
+ color: #fff
+
+label.sheet-settings-modal-close
+ width: 22px
+ height: 22px
+ display: flex
+ align-items: center
+ justify-content: center
+ border-radius: 50%
+ background: rgba(255, 255, 255, 0.2)
+ color: #fff
+ font-size: 13px
+ cursor: pointer
+ line-height: 1
+
+ &:hover
+ background: rgba(255, 255, 255, 0.4)
+
+// Settings modal scrollable body
+.sheet-settings-modal-body
+ overflow-y: auto
+ overflow-x: hidden
+ padding: 10px
+ display: flex
+ flex-wrap: wrap
+ align-items: flex-start
+ gap: 8px
+ flex: 1
- &.sheet-options
- right: 120px
- width: 20px
-
- + span
- right: 120px
- width: 20px
-
- &.sheet-type-pc
- right: 77px
- width: 25px
-
- + span
- right: 77px
- width: 25px
-
- &.sheet-type-starship
- width: 72px
-
- + span
- width: 72px
-
&.sheet-npc-button
&.sheet-npcs
right: 65px
@@ -283,6 +441,13 @@ input[type=radio]
right: 20px
width: 40px
+/* Bio tab — Personality/Ideals/Bonds/Flaws 2×2 grid */
+.sheet-page.sheet-bio .sheet-bio-background
+ display: grid
+ grid-template-columns: 1fr 1fr
+ gap: 4px
+ margin-bottom: 4px
+
.sheet-header
.sheet-top
height: 42px
@@ -358,23 +523,1307 @@ input[type=radio]
font-weight: normal
margin-top: 0
+// Push ALL PC page content below the top bar
+.sheet-pc
+ padding-top: 0
+
+// Header two-panel flex layout
+.sheet-header
+ display: flex
+ align-items: stretch
+ gap: 8px
+
+// ── LEFT PANEL: character info ──
+.sheet-header-left
+ flex: 1
+ min-width: 0
+ border: 1px solid #ab8b57
+ border-radius: 8px
+ padding: 5px 7px
+ box-sizing: border-box
+ position: relative
+
+// name-container = portrait (left) + char-info-right (flex column)
.sheet-name-container
- width: 250px
- display: inline-block
- vertical-align: top
+ width: 100%
+ height: 100%
+ display: flex
+ flex-direction: row
+ align-items: stretch
+ gap: 8px
- input
- font-size: 20px
- margin-top: -9px
+ .sheet-token-frame
+ width: 100px
+ height: 100px
+ flex-shrink: 0
+ border: 3px solid #ab8b57
+ border-radius: 8px
+ overflow: hidden
+ background: #fff
+ display: flex
+ align-items: center
+ justify-content: center
+ position: relative
+ &::before
+ content: 'person'
+ font-family: 'Material Symbols Outlined'
+ font-size: 56px
+ color: #ccc
+ position: absolute
+ top: 50%
+ left: 50%
+ transform: translate(-50%, -50%)
+ pointer-events: none
+ text-transform: none
+ font-variant: normal
+ .sheet-char-avatar
+ width: 100%
+ height: 100%
+ object-fit: contain
+ display: block
+ position: relative
+ z-index: 1
+ .sheet-char-avatar:not([src]),
+ .sheet-char-avatar[src='']
+ display: none
+// Right column: name row + toggle + edit/display panels
+.sheet-char-info-right
+ flex: 1
+ display: flex
+ flex-direction: column
+ gap: 2px
+ min-width: 0
+ position: relative
+
+ .sheet-name-fields
+ display: flex
+ flex-direction: column
+
+ input
+ font-size: 16px !important
+ font-weight: bold !important
+ color: #245485 !important
+ border: none !important
+ border-bottom: 1px solid #ddd !important
+ background: none !important
+ padding: 0 !important
+ width: 100% !important
+ box-shadow: none !important
+
+ .sheet-label
+ font-size: 8px !important
+ color: #999 !important
+ text-align: left !important
+ font-weight: normal !important
+ line-height: 1.2 !important
+ display: block !important
+
+// Edit/display panels — no border, fills right column
.sheet-header-info
- width: 482px
- margin-left: -2px
- display: inline-block
- border: 3px double #ab8b57
- border-radius: 10px
- padding: 5px
- max-height: 74px
+ width: 100%
+ margin-left: 0
+ display: block
+ border: none
+ border-radius: 0
+ padding: 1px 0 0 0
+ max-height: none
+
+ &.sheet-options
+ input
+ width: 100px
+
+// ── RIGHT PANEL: HP + death saves ──
+.sheet-header-right
+ flex: 1
+ border: 1px solid #ab8b57
+ border-radius: 6px
+ padding: 4px 8px
+ display: flex
+ flex-direction: column
+ gap: 2px
+ box-sizing: border-box
+
+// HP title
+.sheet-hp-panel-label
+ font-family: 'Oxanium', sans-serif
+ font-size: 9px !important
+ font-weight: bold
+ color: #ab8b57
+ text-transform: uppercase
+ letter-spacing: 1px
+ line-height: 1.2 !important
+ display: block !important
+
+// Main row
+.sheet-hp-main-row
+ display: flex
+ align-items: flex-start
+ justify-content: space-between
+ flex: 1
+
+.sheet-hp-left-cluster
+ display: flex
+ align-items: flex-start
+ gap: 6px
+ flex-shrink: 0
+
+// Current/Max group — curmax-box has border with bar at bottom
+.sheet-hp-curmax-group
+ display: flex
+ flex-direction: column
+ align-items: stretch
+ flex-shrink: 0
+
+.sheet-hp-curmax-box
+ border: 1px solid #ccc
+ border-radius: 4px
+ overflow: hidden
+ display: flex
+ flex-direction: column
+ height: 42px
+
+ .sheet-hp-cm-inputs
+ flex: 1
+ display: flex
+ align-items: center
+ padding: 0 4px
+ gap: 2px
+
+ input[type=number],
+ input[type=text]
+ width: 44px !important
+ font-size: 20px !important
+ font-weight: bold !important
+ text-align: center !important
+ background: none !important
+ border: none !important
+ border-radius: 0 !important
+ box-shadow: none !important
+ color: #000 !important
+ padding: 0 !important
+ margin: 0 !important
+
+ .sheet-hp-bar-track
+ height: 6px
+ border-radius: 0
+ margin: 0
+ flex-shrink: 0
+
+.sheet-hp-sep
+ font-size: 16px !important
+ color: #aaa
+ line-height: 1 !important
+ flex-shrink: 0
+ display: inline-block !important
+
+.sheet-hp-bar-track
+ width: 100%
+ height: 6px
+ background: #ddd
+ border-radius: 0
+ overflow: hidden
+ margin: 0
+
+.sheet-hp-bar-fill
+ width: 100%
+ height: 100%
+ background: #27ae60
+
+.sheet-hp-cm-labels
+ display: flex
+ justify-content: space-between
+ width: 100%
+ margin-top: 2px
+
+ span
+ font-size: 8px !important
+ color: #888
+ font-family: 'Oxanium', sans-serif
+ text-transform: uppercase
+ letter-spacing: 0.3px
+ line-height: 1 !important
+ display: inline-block !important
+
+// Temp HP — same height as curmax-box
+.sheet-hp-temp-group
+ display: flex
+ flex-direction: column
+ align-items: center
+ gap: 2px
+ flex-shrink: 0
+
+ input[type=number]
+ width: 44px !important
+ height: 42px !important
+ font-size: 20px !important
+ font-weight: bold !important
+ text-align: center !important
+ background: none !important
+ border: 1px solid #ccc !important
+ border-radius: 4px !important
+ box-shadow: none !important
+ color: #555 !important
+ padding: 0 !important
+ margin: 0 !important
+ box-sizing: border-box !important
+
+ > span
+ font-size: 8px !important
+ color: #888
+ font-family: 'Oxanium', sans-serif
+ text-transform: uppercase
+ letter-spacing: 0.3px
+ line-height: 1 !important
+ display: block !important
+
+// Damage / Heal — change input same size as HP boxes
+.sheet-hp-dmgheal-group
+ display: flex
+ flex-direction: column
+ align-items: center
+ gap: 2px
+ flex-shrink: 0
+
+.sheet-hp-dmgheal-controls
+ display: flex
+ align-items: center
+ gap: 3px
+
+.sheet-hp-dmg-btn,
+.sheet-hp-heal-btn
+ width: 26px !important
+ height: 26px !important
+ border-radius: 50% !important
+ border: none !important
+ font-size: 18px !important
+ font-weight: bold !important
+ line-height: 1 !important
+ cursor: pointer !important
+ box-shadow: none !important
+ text-shadow: none !important
+ padding: 0 !important
+ flex-shrink: 0
+ display: flex !important
+ align-items: center !important
+ justify-content: center !important
+
+.sheet-hp-dmg-btn
+ background: #c0392b !important
+ color: white !important
+
+.sheet-hp-heal-btn
+ background: #27ae60 !important
+ color: white !important
+
+.sheet-hp-change-input
+ width: 44px !important
+ height: 42px !important
+ font-size: 20px !important
+ font-weight: bold !important
+ text-align: center !important
+ background: none !important
+ border: 1px solid #ccc !important
+ border-radius: 4px !important
+ box-shadow: none !important
+ color: #000 !important
+ padding: 0 !important
+ margin: 0 !important
+ box-sizing: border-box !important
+
+.sheet-hp-dmgheal-labels
+ display: flex
+ width: 100%
+ justify-content: space-between
+
+ span
+ font-size: 8px !important
+ color: #888
+ font-family: 'Oxanium', sans-serif
+ text-transform: uppercase
+ letter-spacing: 0.3px
+ line-height: 1 !important
+ display: inline-block !important
+
+// Death Saves
+.sheet-death-saves-group
+ display: flex
+ flex-direction: column
+ gap: 3px
+ justify-content: center
+ flex-shrink: 0
+
+// DEATH SAVES roll button (replaces plain title)
+.sheet-ds-roll-btn
+ font-family: 'Oxanium', sans-serif !important
+ font-size: 8px !important
+ font-weight: bold !important
+ color: #245485 !important
+ background: transparent !important
+ border: none !important
+ box-shadow: none !important
+ text-shadow: none !important
+ text-transform: uppercase !important
+ letter-spacing: 0.5px !important
+ padding: 0 !important
+ cursor: pointer !important
+ text-align: left !important
+ line-height: 1 !important
+ display: block !important
+ width: 100% !important
+ &::before
+ content: "" !important
+
+// Pip box with light gray background
+.sheet-ds-pip-box
+ background: #f0f0f0
+ border-radius: 4px
+ padding: 4px 6px
+ display: flex
+ flex-direction: column
+ gap: 5px
+
+.sheet-ds-row
+ display: flex
+ align-items: center
+ gap: 4px
+
+.sheet-ds-label
+ font-size: 8px !important
+ color: #888
+ width: 52px
+ flex-shrink: 0
+ display: inline-block !important
+ line-height: 1.2 !important
+
+.sheet-ds-pip
+ -webkit-appearance: none
+ -moz-appearance: none
+ appearance: none
+ width: 13px !important
+ height: 13px !important
+ border-radius: 50% !important
+ border: 2px solid !important
+ cursor: pointer !important
+ margin: 0 !important
+ padding: 0 !important
+ flex-shrink: 0
+ box-shadow: none !important
+ background: transparent !important
+
+.sheet-ds-success
+ border-color: #27ae60 !important
+ &:checked
+ background: #27ae60 !important
+
+.sheet-ds-failure
+ border-color: #c0392b !important
+ &:checked
+ background: #c0392b !important
+
+// Hit Dice row
+.sheet-hp-hitdice-row
+ display: flex
+ align-items: stretch
+ gap: 4px
+ border-top: 1px solid #ececec
+ padding-top: 3px
+ flex-shrink: 0
+ flex-wrap: wrap
+.sheet-hd-mc1-flag, .sheet-hd-mc2-flag, .sheet-hd-mc3-flag
+ display: none
+.sheet-hd-group-mc1, .sheet-hd-group-mc2, .sheet-hd-group-mc3
+ display: none !important
+.sheet-hd-mc1-flag:checked ~ .sheet-hd-group-mc1
+ display: flex !important
+.sheet-hd-mc2-flag:checked ~ .sheet-hd-group-mc2
+ display: flex !important
+.sheet-hd-mc3-flag:checked ~ .sheet-hd-group-mc3
+ display: flex !important
+
+.sheet-hd-label
+ font-family: 'Oxanium', sans-serif
+ font-size: 8px !important
+ font-weight: bold
+ color: #245485
+ text-transform: uppercase
+ letter-spacing: 0.5px
+ flex-shrink: 0
+ align-self: center
+ display: inline-block !important
+ line-height: 1 !important
+
+.sheet-hd-count-input
+ width: 26px !important
+ font-size: 14px !important
+ font-weight: bold !important
+ text-align: center !important
+ background: none !important
+ border: none !important
+ box-shadow: none !important
+ color: #000 !important
+ padding: 0 !important
+ margin: 0 !important
+
+.sheet-hd-sep
+ font-size: 12px !important
+ color: #aaa
+ flex-shrink: 0
+ display: inline-block !important
+ line-height: 1 !important
+
+.sheet-hd-max-input
+ width: 26px !important
+ font-size: 14px !important
+ text-align: center !important
+ background: none !important
+ border: none !important
+ box-shadow: none !important
+ color: #555 !important
+ padding: 0 !important
+ margin: 0 !important
+
+.sheet-hd-group
+ display: flex
+ align-items: stretch
+ gap: 0
+
+.sheet-hd-type-btn
+ font-family: 'Oxanium', sans-serif !important
+ font-size: 11px !important
+ font-weight: bold !important
+ color: #000 !important
+ background: #f0f0f0 !important
+ border: 1px solid #ab8b57 !important
+ border-radius: 4px 0 0 4px !important
+ box-shadow: none !important
+ text-shadow: none !important
+ text-transform: none !important
+ font-variant: normal !important
+ letter-spacing: 0.3px !important
+ padding: 3px 8px !important
+ cursor: pointer !important
+ flex-shrink: 0
+ white-space: nowrap
+ display: inline-flex !important
+ flex-direction: row !important
+ align-items: center !important
+ gap: 0 !important
+ margin: 0 !important
+ &::before
+ content: "" !important
+
+.charsheet .sheet-hd-type-btn:hover,
+.charsheet .sheet-hd-type-btn:hover .sheet-hd-btn-label,
+.charsheet .sheet-hd-type-btn:hover .sheet-hd-btn-label span
+ background: #066dce !important
+ color: #fff !important
+
+.sheet-hd-btn-label
+ font-size: 11px !important
+ font-weight: bold !important
+ text-transform: none !important
+ font-variant: normal !important
+ display: inline !important
+ color: inherit !important
+ span
+ text-transform: none !important
+ font-variant: normal !important
+ display: inline !important
+ font-size: 11px !important
+ color: inherit !important
+
+.sheet-hd-count-box
+ display: flex
+ align-items: center
+ border: 1px solid #ab8b57
+ border-left: none
+ border-radius: 0 4px 4px 0
+ background: #fff
+ padding: 2px 6px
+ gap: 2px
+
+// The base .sheet-spells span rule applies width:100%, margin-top:5px etc. to ALL spans
+// in the spells page — reset those for the header to protect the HP panel layout.
+// Abilities-bar spans are already protected by higher-specificity rules.
+.charsheet .sheet-pc .sheet-page.sheet-spells .sheet-header span
+ width: auto !important
+ margin-top: 0 !important
+ text-align: inherit !important
+// DS label needs explicit width so pips don't wrap after the auto reset
+.charsheet .sheet-pc .sheet-page.sheet-spells .sheet-header .sheet-ds-label
+ width: 52px !important
+ font-weight: normal !important
+// .sheet-spells span sets font-weight:bold — reset to normal for labels that should be light
+.charsheet .sheet-pc .sheet-page.sheet-spells .sheet-header .sheet-hp-cm-labels span,
+.charsheet .sheet-pc .sheet-page.sheet-spells .sheet-header .sheet-hp-temp-group > span,
+.charsheet .sheet-pc .sheet-page.sheet-spells .sheet-header .sheet-hp-dmgheal-labels span
+ font-weight: normal !important
+
+// Bio tab — description fields (generic fallback, mostly overridden by scoped rule below)
+.sheet-bio-description-row
+ margin-bottom: 8px
+ .sheet-hlabel-container
+ display: flex
+ flex-direction: column
+ align-items: flex-start
+
+// ============================================================
+// Gear & Bio Tab — Two-Column Layout (2026-05-18)
+// Left: Gear column (375px fixed) | Right: Bio column (flex 1)
+// ============================================================
+
+// Body: two-column flex row
+.sheet-page.sheet-bio .sheet-body
+ display: flex
+ flex-direction: row
+ gap: 14px
+ align-items: flex-start
+ padding: 4px 0
+
+// Left / Gear column
+.sheet-page.sheet-bio .sheet-gear-col
+ flex: 0 0 375px
+ min-width: 0
+
+// Right / Bio column
+.sheet-page.sheet-bio .sheet-bio-col
+ flex: 1
+ min-width: 0
+ display: flex
+ flex-direction: column
+ gap: 8px
+
+// --- Equipment section in Gear column ---
+
+// Gear column: explicit width to beat .sheet-col { width: 32.97% }
+.sheet-page.sheet-bio .sheet-gear-col
+ width: 375px !important
+
+// Override global equipment size / position defaults
+.sheet-page.sheet-bio .sheet-equipment
+ min-height: unset
+ padding-bottom: 6px
+
+// .sheet-complex has width: 160px by default — expand to fill the column
+.sheet-page.sheet-bio .sheet-equipment .sheet-complex
+ width: 100% !important
+ display: block !important
+ vertical-align: initial
+ padding-top: 0 !important
+ margin-bottom: 0 !important
+ box-sizing: border-box
+
+// Section label: static at top instead of absolute at bottom
+.sheet-page.sheet-bio .sheet-equipment > span.sheet-label
+ position: static !important
+ display: block !important
+ bottom: auto !important
+ margin-top: 0 !important
+ text-align: center
+ font-family: 'Oxanium', sans-serif
+ font-weight: bold
+ font-size: 11px
+ color: #245485
+ text-transform: uppercase
+ letter-spacing: 1px
+ padding: 6px 8px 5px
+ border-bottom: 1px solid rgba(171,139,87,0.5)
+ border-radius: 4px 4px 0 0
+ width: 100%
+ box-sizing: border-box
+
+// Money row: layout properties (no display — toggle rules control visibility)
+.sheet-page.sheet-bio .sheet-money
+ flex-direction: row
+ width: 100%
+ gap: 5px
+ padding: 6px 8px
+ border-bottom: 1px solid rgba(171,139,87,0.2)
+ box-sizing: border-box
+// EG currency: shown by default as flex (0,3,0 beats 0,2,0 default hide)
+.sheet-page.sheet-bio .sheet-gear-col .sheet-eg-currency
+ display: flex
+// 5e currency: shown as flex in 5e mode (overrides inline-block from toggle rule)
+.sheet-page.sheet-bio input[name="attr_currency_mode"][value="5e"] ~ .sheet-fivee-currency
+ display: flex
+
+// Coin box: stacked value-over-label
+.sheet-page.sheet-bio .sheet-coin
+ flex: 1
+ display: flex !important
+ flex-direction: column !important
+ align-items: center
+ justify-content: center
+ padding: 5px 3px
+ margin-top: 0 !important
+ left: 0 !important
+ position: static !important
+ border: 1px solid #ab8b57
+ border-radius: 5px
+ gap: 2px
+ span.sheet-label
+ display: block !important
+ font-family: 'Oxanium', sans-serif
+ font-weight: bold
+ font-size: 9px
+ color: #245485
+ text-transform: uppercase
+ width: auto !important
+ margin: 0 !important
+ letter-spacing: 0.5px
+ text-align: center
+ input
+ width: 100% !important
+ text-align: center
+ font-size: 13px
+ font-weight: bold
+ border: none !important
+ background: transparent !important
+ padding: 0 !important
+ box-shadow: none !important
+
+// Inventory column header — same padding/gap as item rows for pixel alignment
+.sheet-page.sheet-bio .sheet-inv-header
+ display: flex
+ align-items: center
+ padding: 4px 8px
+ gap: 4px
+ border-bottom: 1px solid rgba(171,139,87,0.4)
+ background: rgba(36,84,133,0.04)
+.sheet-page.sheet-bio .sheet-inv-col-count,
+.sheet-page.sheet-bio .sheet-inv-col-weight
+ width: 32px
+ flex-shrink: 0
+ font-size: 9px
+ font-weight: bold
+ color: #888
+ text-transform: uppercase
+ text-align: center
+ font-family: 'Oxanium', sans-serif
+ letter-spacing: 0.5px
+.sheet-page.sheet-bio .sheet-inv-col-name
+ flex: 1
+ font-size: 9px
+ font-weight: bold
+ color: #888
+ text-transform: uppercase
+ letter-spacing: 0.5px
+ font-family: 'Oxanium', sans-serif
+
+// Inventory rows: taller, more breathing room, wrap for subitem
+.sheet-page.sheet-bio .sheet-equipment .sheet-item
+ display: flex !important
+ align-items: center
+ flex-wrap: wrap
+ min-height: 34px
+ margin-bottom: 0 !important
+ padding: 3px 30px 3px 8px
+ border-bottom: 1px solid rgba(171,139,87,0.12)
+ gap: 4px
+ position: relative
+ &:nth-child(even)
+ background: rgba(36,84,133,0.03)
+ input.sheet-name
+ flex: 1 !important
+ width: auto !important
+ font-size: 13px
+ font-weight: bold
+ border: none !important
+ background: transparent !important
+ padding: 2px 4px !important
+ box-shadow: none !important
+ text-align: left !important
+ input[type=text].sheet-weight
+ width: 32px !important
+ flex-shrink: 0
+ text-align: center
+ font-size: 12px
+
+// span i (expand toggle): absolutely positioned at right edge, out of flex flow
+.sheet-page.sheet-bio .sheet-equipment .sheet-inventorysubflag + span
+ position: absolute !important
+ right: 4px
+ top: 50%
+ transform: translateY(-50%)
+ width: 22px
+ height: 22px
+ display: flex !important
+ align-items: center
+ justify-content: center
+ font-size: 11px
+ color: #ab8b57
+ opacity: 0.65
+ cursor: pointer
+ z-index: 1
+ left: auto !important
+ background: transparent !important
+ font-family: 'Noto Sans', sans-serif !important
+// Invisible click-target checkbox: small, same position, stays transparent
+.sheet-page.sheet-bio .sheet-equipment .sheet-inventorysubflag
+ left: auto !important
+ right: 4px !important
+ top: 50% !important
+ transform: translateY(-50%)
+ width: 22px !important
+ height: 22px !important
+ opacity: 0 !important
+ cursor: pointer
+// Active state: blue toggle
+.sheet-page.sheet-bio .sheet-equipment .sheet-inventorysubflag:checked + span
+ color: #066dce !important
+ opacity: 1
+
+// Subitem panel: wraps to full-width row below the item fields
+.sheet-page.sheet-bio .sheet-equipment .sheet-item .sheet-subitem
+ flex: 0 0 100%
+ width: 100%
+ box-sizing: border-box
+ border-top: 1px dashed rgba(171,139,87,0.4)
+ padding: 8px
+ background: rgba(255,255,255,0.6)
+.sheet-page.sheet-bio .sheet-equipment .sheet-inventorysubflag:checked ~ .sheet-subitem
+ display: flex !important
+ flex-wrap: wrap
+ gap: 6px 10px
+ align-items: center
+
+// Weighttotal: two-column layout
+.sheet-page.sheet-bio .sheet-equipment .sheet-weighttotal
+ position: static !important
+ display: flex !important
+ align-items: stretch
+ gap: 0
+ padding: 0
+ border-top: 1px solid rgba(171,139,87,0.3)
+ margin-top: 4px
+ width: auto !important
+ flex-wrap: wrap
+ .sheet-weight-col
+ flex: 1
+ display: flex
+ flex-direction: column
+ align-items: center
+ padding: 5px 8px
+ gap: 2px
+ & + .sheet-weight-col
+ border-left: 1px solid rgba(171,139,87,0.3)
+ input
+ width: 60px !important
+ text-align: center
+ font-weight: bold
+ font-size: 16px
+ pointer-events: auto
+ border: none !important
+ background: transparent !important
+ box-shadow: none !important
+ input[name="attr_carrying_capacity"]
+ pointer-events: none
+ color: #555
+ span.sheet-label
+ font-size: 9px
+ font-weight: bold
+ color: #888
+ text-transform: uppercase
+ letter-spacing: 0.5px
+ .sheet-encumb
+ flex: 0 0 100%
+ text-align: center
+
+// Enhanced Item Affinity textarea
+.sheet-page.sheet-bio .sheet-item-affinity
+ margin-top: 6px
+ textarea
+ min-height: 70px
+ height: 70px
+ width: 100%
+ box-sizing: border-box
+
+// --- Bio column layout ---
+
+// Description row — scoped to bio-col (overrides the generic rule above)
+.sheet-page.sheet-bio .sheet-bio-col .sheet-bio-description-row
+ position: relative
+ border: 1px solid rgba(171,139,87,0.6)
+ border-radius: 6px
+ background: transparent !important
+ padding: 0 !important
+ margin-bottom: 8px
+ display: block !important
+ // Header bar
+ .sheet-bio-desc-header
+ position: relative
+ display: flex
+ align-items: center
+ justify-content: flex-end
+ padding: 4px 8px
+ border-bottom: 1px solid rgba(171,139,87,0.4)
+ .sheet-bio-desc-title
+ position: absolute
+ left: 0
+ right: 0
+ font-family: 'Oxanium', sans-serif
+ font-weight: bold
+ font-size: 10px
+ color: #245485
+ text-transform: uppercase
+ letter-spacing: 1px
+ white-space: nowrap
+ pointer-events: none
+ display: block !important
+ text-align: center !important
+ width: auto !important
+ // Gear toggle
+ .sheet-bio-desc-gear-toggle
+ cursor: pointer
+ display: flex
+ align-items: center
+ flex-shrink: 0
+ margin-left: 6px
+ input[type=checkbox]
+ display: none
+ .sheet-bio-desc-gear-icon
+ font-family: 'Material Symbols Outlined'
+ font-size: 14px
+ color: #ab8b57
+ opacity: 0.6
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24
+ display: inline-block !important
+ line-height: 1
+ user-select: none
+ transition: opacity 0.2s, color 0.2s
+ text-transform: none !important
+ font-variant: normal !important
+ .sheet-bio-desc-gear-toggle:hover .sheet-bio-desc-gear-icon
+ opacity: 1
+ &:has(.sheet-bio-desc-cb:checked) .sheet-bio-desc-gear-icon
+ color: #066dce
+ opacity: 1
+ font-variation-settings: 'FILL' 1, 'wght' 400, 'GRAD' 0, 'opsz' 24
+ // Display area
+ .sheet-bio-desc-display
+ display: flex !important
+ flex-wrap: nowrap
+ padding: 4px 8px
+ justify-content: space-between
+ align-items: stretch
+ .sheet-bio-field
+ flex: 1 1 0
+ display: flex
+ flex-direction: column
+ align-items: center
+ gap: 1px
+ padding: 2px 2px
+ position: relative
+ // Vertical divider
+ &::after
+ content: ''
+ position: absolute
+ right: 0
+ top: 15%
+ bottom: 15%
+ width: 1px
+ background: rgba(171,139,87,0.4)
+ &:last-child::after
+ display: none
+ // Em-dash placeholder for empty spans
+ .sheet-bio-val:empty::before
+ content: '—'
+ color: #aaa
+ font-weight: normal
+ font-size: 14px
+ .sheet-bio-val
+ font-size: 14px
+ font-weight: bold
+ color: #245485
+ min-height: 18px
+ min-width: 30px
+ display: inline-block !important
+ text-align: center !important
+ width: auto !important
+ .sheet-bio-label
+ font-family: 'Oxanium', sans-serif
+ font-size: 10px
+ font-weight: bold
+ color: #888
+ text-transform: uppercase
+ letter-spacing: 0.5px
+ display: block !important
+ text-align: center !important
+ width: auto !important
+ // Edit panel
+ .sheet-bio-desc-edit
+ display: none
+ flex-wrap: wrap
+ gap: 6px 12px
+ padding: 6px 10px
+ background: rgba(36,84,133,0.04)
+ border-top: 1px solid rgba(171,139,87,0.3)
+ &:has(.sheet-bio-desc-cb:checked) .sheet-bio-desc-edit
+ display: flex
+
+// Character Appearance: shorter textarea
+.sheet-page.sheet-bio .sheet-appearance-box textarea
+ min-height: 60px
+ height: 60px
+
+// Character History: generous textarea
+.sheet-page.sheet-bio .sheet-history-box textarea
+ min-height: 200px
+ height: 200px
+
+// Bio col textbox labels — Oxanium blue styling
+.sheet-page.sheet-bio .sheet-bio-col .sheet-textbox span.sheet-label,
+.sheet-page.sheet-bio .sheet-bio-col .sheet-bio-background .sheet-textbox span.sheet-label
+ font-family: 'Oxanium', sans-serif !important
+ font-weight: bold !important
+ font-size: 9px !important
+ color: #245485 !important
+ text-transform: uppercase
+ letter-spacing: 1px
+
+// Enhanced Item Affinity label — gear col
+.sheet-page.sheet-bio .sheet-gear-col .sheet-item-affinity span.sheet-label
+ font-family: 'Oxanium', sans-serif !important
+ font-weight: bold !important
+ font-size: 9px !important
+ color: #245485 !important
+ text-transform: uppercase
+ letter-spacing: 1px
+
+// Powers tab — power settings row
+.sheet-powers-info-row
+ position: relative
+ border: 1px solid rgba(171,139,87,0.6)
+ border-radius: 6px
+ background: transparent !important
+ padding: 0 !important
+ margin-bottom: 8px
+ display: block !important
+ // Header bar — full specificity to beat Roll20 overrides
+ .charsheet &
+ .sheet-powers-info-header
+ display: flex !important
+ align-items: center !important
+ padding: 4px 8px !important
+ border-bottom: 1px solid rgba(171,139,87,0.4) !important
+ min-height: 28px !important
+ height: auto !important
+ visibility: visible !important
+ overflow: visible !important
+ // Left spacer
+ .sheet-powers-info-spacer
+ width: 20px !important
+ flex-shrink: 0 !important
+ display: block !important
+ visibility: visible !important
+ .sheet-powers-info-title
+ flex: 1 !important
+ font-family: 'Oxanium', sans-serif !important
+ font-weight: bold !important
+ font-size: 12px !important
+ color: #245485 !important
+ text-transform: uppercase !important
+ letter-spacing: 1px !important
+ white-space: nowrap !important
+ display: block !important
+ text-align: center !important
+ width: auto !important
+ visibility: visible !important
+ // Gear toggle — right end
+ .sheet-powers-info-gear-toggle
+ width: 20px
+ flex-shrink: 0
+ cursor: pointer
+ display: flex !important
+ align-items: center
+ justify-content: flex-end
+ input[type=checkbox]
+ display: none
+ .sheet-powers-info-gear-icon
+ font-family: 'Material Symbols Outlined'
+ font-size: 14px
+ color: #ab8b57
+ opacity: 0.6
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24
+ display: inline-block !important
+ line-height: 1
+ user-select: none
+ transition: opacity 0.2s, color 0.2s
+ text-transform: none !important
+ font-variant: normal !important
+ .sheet-powers-info-gear-toggle:hover .sheet-powers-info-gear-icon
+ opacity: 1
+ &:has(.sheet-powers-info-cb:checked) .sheet-powers-info-gear-icon
+ color: #066dce
+ opacity: 1
+ font-variation-settings: 'FILL' 1, 'wght' 400, 'GRAD' 0, 'opsz' 24
+ // Display area
+ .sheet-powers-info-display
+ display: flex !important
+ flex-wrap: nowrap
+ padding: 4px 8px
+ justify-content: space-between
+ align-items: stretch
+ .sheet-powers-info-field
+ flex: 1 1 0
+ display: flex
+ flex-direction: column
+ align-items: center
+ gap: 1px
+ padding: 2px 2px
+ position: relative
+ // Vertical divider
+ &::after
+ content: ''
+ position: absolute
+ right: 0
+ top: 15%
+ bottom: 15%
+ width: 1px
+ background: rgba(171,139,87,0.4)
+ &:last-child::after
+ display: none
+ // Value spans and select in display mode
+ .charsheet &
+ .sheet-powers-info-field .sheet-display,
+ .sheet-powers-info-field select
+ font-size: 14px
+ font-weight: bold
+ color: #245485
+ height: 22px
+ line-height: 22px
+ display: inline-block !important
+ text-align: center !important
+ width: auto !important
+ .sheet-powers-info-field select
+ -webkit-appearance: none
+ appearance: none
+ background: transparent !important
+ border: none !important
+ box-shadow: none !important
+ pointer-events: none
+ cursor: default
+ padding: 0 !important
+ margin: 4px 0 0 0 !important
+ max-width: 100%
+ height: 22px !important
+ line-height: 22px !important
+ vertical-align: middle
+ // Select becomes interactive when gear is open
+ &:has(.sheet-powers-info-cb:checked) .sheet-powers-info-field select
+ -webkit-appearance: auto
+ appearance: auto
+ background: #fff !important
+ border: 1px solid rgba(171,139,87,0.6) !important
+ border-radius: 4px
+ pointer-events: auto
+ cursor: pointer
+ padding: 2px 4px
+ font-size: 12px
+ color: #111
+ font-weight: normal
+ // Em-dash for empty calculated spans
+ .sheet-powers-info-field .sheet-display:empty::before
+ content: '—'
+ color: #aaa
+ font-weight: normal
+ // Labels
+ .sheet-powers-info-label
+ font-family: 'Oxanium', sans-serif
+ font-size: 10px
+ font-weight: bold
+ color: #888
+ text-transform: uppercase
+ letter-spacing: 0.5px
+ display: block !important
+ text-align: center !important
+ width: auto !important
+
+// ── Powers tab: TP / Talent Slots / Esper Mastery section headers ──
+
+// Three-column stats row
+.sheet-powers-stats-row
+ display: flex !important
+ flex-direction: row !important
+ gap: 8px
+ width: 100%
+ margin-bottom: 8px
+ .sheet-col
+ flex: 1 !important
+ width: auto !important
+ margin-bottom: 0 !important
+ padding: 0 !important
+ .sheet-tp,
+ .sheet-talent-slots-block,
+ .sheet-class_options
+ margin: 0 !important
+ width: 100% !important
+ height: 100%
+ box-sizing: border-box
+
+// Shared header bar
+.charsheet
+ .sheet-tp .sheet-tp-section-header,
+ .sheet-talent-slots-block .sheet-ts-section-header,
+ .sheet-esper-mastery .sheet-em-section-header
+ display: flex !important
+ align-items: center !important
+ padding: 4px 8px !important
+ border-bottom: 1px solid rgba(171,139,87,0.4) !important
+ min-height: 26px !important
+ height: auto !important
+ visibility: visible !important
+
+// Shared title
+.charsheet
+ .sheet-tp-section-title,
+ .sheet-ts-section-title,
+ .sheet-em-section-title
+ flex: 1 !important
+ font-family: 'Oxanium', sans-serif !important
+ font-weight: bold !important
+ font-size: 10px !important
+ color: #245485 !important
+ text-transform: uppercase !important
+ letter-spacing: 1px !important
+ display: block !important
+ text-align: center !important
+ visibility: visible !important
+
+.sheet-tp-section-body
+ padding: 4px 4px 6px
+ span.sheet-label
+ display: block !important
+ text-align: center !important
+ font-family: 'Oxanium', sans-serif !important
+ font-size: 9px !important
+ font-weight: bold !important
+ color: #888 !important
+ text-transform: uppercase !important
+ letter-spacing: 0.5px !important
+ margin-top: 2px !important
+
+.sheet-talent-slots-block
+ width: 100%
+ border: 1px solid #ab8b57
+ border-radius: 5px
+ box-sizing: border-box
+ margin-bottom: 10px
+ .sheet-hdice-dsaves-container
+ display: flex !important
+ flex-direction: row !important
+ justify-content: space-around !important
+ align-items: flex-start !important
+ width: 100% !important
+ padding: 4px 0 6px !important
+ .sheet-subcontainer
+ border: none !important
+ border-radius: 0 !important
+ float: none !important
+ display: flex !important
+ flex-direction: column !important
+ align-items: center !important
+ flex: 1
+ &:not(:last-child)
+ border-right: 1px solid rgba(171,139,87,0.4) !important
+ .sheet-top
+ display: flex !important
+ flex-direction: column !important
+ align-items: center !important
+ width: 100% !important
+ span
+ text-align: center !important
+ margin-left: 0 !important
+ .sheet-speed
+ display: flex !important
+ flex-direction: column !important
+ align-items: center !important
+ width: 100% !important
+ input[type=number],
+ input[type=text]
+ text-align: center !important
+ margin: 0 auto !important
+ span.sheet-label
+ text-align: center !important
+ display: block !important
+ margin: 2px 0 0 !important
+ font-family: 'Oxanium', sans-serif !important
+ font-size: 9px !important
+ font-weight: bold !important
+ color: #888 !important
+ text-transform: uppercase !important
+ letter-spacing: 0.5px !important
+
+.sheet-em-section-body
+ padding: 4px 0 6px
+
+.sheet-page.sheet-powers
+ .sheet-tp
+ margin-top: 0 !important
+ .sheet-class_options.sheet-esper-mastery
+ margin-top: 0 !important
+
+// Character name — Oxanium small-caps bold
+.sheet-char-info-right
+ .sheet-name-fields
+ input
+ font-family: 'Oxanium', sans-serif !important
+ font-variant: small-caps !important
+ font-size: 20px !important
+ font-weight: bold !important
+ color: #245485 !important
+ border: none !important
+ border-bottom: none !important
+ background: none !important
+ padding: 0 !important
+ width: 100% !important
+ box-shadow: none !important
+
+ .sheet-label
+ display: none !important
+
+// Info display: stacked column layout
+.sheet-header-info.sheet-display
+ .sheet-hlabel-container
+ display: flex !important
+ flex-direction: column !important
+ width: 100% !important
+ min-width: 0 !important
+ margin-left: 0 !important
+
+ // Info display fields — small, bold, no underlines, no labels
+ input
+ width: 100% !important
+ font-size: 10px !important
+ font-weight: bold !important
+ border: none !important
+ background: none !important
+ box-shadow: none !important
+ padding: 0 !important
+ box-sizing: border-box !important
+
+ .sheet-label
+ display: none !important
+
+ // XP row — full width, left-aligned with "Exp:" prefix
+ .sheet-xp-row
+ display: flex !important
+ flex-direction: row !important
+ align-items: baseline !important
+ gap: 3px !important
+ margin-top: 1px !important
+
+ .sheet-xp-prefix
+ font-size: 10px !important
+ font-weight: bold !important
+ color: inherit !important
+ white-space: nowrap !important
+ display: inline !important
+
+ input
+ width: auto !important
+ flex: 1 !important
.sheet-hlabel-container
display: inline-block
@@ -387,11 +1836,44 @@ input[type=radio]
margin-left: 0px
.sheet-body
- width: 750px
- margin-top: 22px
+ width: 860px
+ margin-top: 40px
+
+.sheet-page.sheet-core .sheet-body
+ display: flex
+ align-items: flex-start
+ gap: 10px
+.sheet-page.sheet-core .sheet-body .sheet-col2
+ flex: 1.30
+.sheet-page.sheet-core .sheet-body .sheet-col1,
+.sheet-page.sheet-core .sheet-body .sheet-col3
+ flex: 0.85
+
+// Powers page body: flex layout with gap between spell columns only
+.sheet-page.sheet-spells .sheet-body
+ display: flex
+ flex-wrap: wrap
+ column-gap: 12px
+ align-items: flex-start
+// col-full (Power Settings, ESPER POWERS header): full-width + override Roll20 inline-block
+.sheet-page.sheet-spells .sheet-body > .sheet-col-full
+ flex: 0 0 100% !important
+ width: 100% !important
+ display: block !important
+// powers-stats-row: full-width but keeps display:flex so TP/Slots/Mastery stay in a row
+.sheet-page.sheet-spells .sheet-body > .sheet-powers-stats-row
+ flex: 0 0 100% !important
+ width: 100% !important
+// Spell columns share width equally; override Roll20 inline-block
+.sheet-page.sheet-spells .sheet-body > .sheet-col
+ flex: 1
+ width: auto !important
+ display: block !important
+ vertical-align: unset
.sheet-col
width: 32.97%
+ flex: 1
.sheet-col-full
width: 100%
@@ -432,7 +1914,7 @@ input[type=radio]
width: 100%
font-weight: bold
-.sheet-saving-throw button[type=roll], .sheet-skill button[type=roll], .sheet-ac-init-speed-container button[type=roll], .sheet-subcontainer button[type=roll], .sheet-npc button[type=roll]
+.sheet-saving-throw button[type=roll], .sheet-skill button[type=roll], .sheet-subcontainer button[type=roll], .sheet-npc button[type=roll]
background-color: transparent
color: black
border: none
@@ -447,20 +1929,20 @@ input[type=radio]
width: 100%
font-weight: bold
-.sheet-attr-container button[type=roll]::before, .sheet-saving-throw button[type=roll]::before, .sheet-skill button[type=roll]::before, .sheet-ac-init-speed-container button[type=roll]::before, .sheet-subcontainer button[type=roll]::before, .sheet-npc button[type=roll]::before
+.sheet-attr-container button[type=roll]::before, .sheet-saving-throw button[type=roll]::before, .sheet-skill button[type=roll]::before, .sheet-subcontainer button[type=roll]::before, .sheet-npc button[type=roll]::before
content: "" !important
.sheet-attr-container button[type=roll]
overflow: hidden
button[type=roll]:hover
- color: #00ba73
+ color: #066dce
*
- color: #00ba73
+ color: #066dce
.sheet-spell button[type=roll]:hover input[type=text], .sheet-action .sheet-display button[type=roll]:hover *
- color: #00ba73
+ color: #066dce
button[type=roll] *
pointer-events: none
@@ -519,10 +2001,8 @@ button[type=roll] *
line-height: 22px
.sheet-skills-saves-container
- width: 163px
- margin-right: 5px
- display: inline-block
- vertical-align: top
+ width: 100%
+ display: block
.sheet-insp-prof-container
margin-bottom: 10px
@@ -596,7 +2076,232 @@ button[type=roll] *
border-radius: 0px
color: black
-.sheet-saving-throw input[type=text], .sheet-skill input[type=text], .sheet-ac-init-speed-container input, .sheet-hp input, .sheet-tp input, .sheet-exhaustion input
+// Passive Wisdom (Perception) — restyled to match Proficiency Bonus display
+.sheet-passive-wis-display
+ display: flex
+ align-items: center
+ gap: 8px
+ padding: 4px 8px
+ border: 1px solid #ab8b57
+ border-radius: 6px
+ margin-bottom: 4px
+ box-sizing: border-box
+
+ .sheet-value
+ display: flex
+ align-items: center
+ width: auto
+ height: auto
+ border: none
+ background: transparent
+ border-radius: 0
+ position: static
+ flex-shrink: 0
+ order: 2
+
+ .sheet-value span
+ font-family: 'Oxanium', sans-serif
+ font-size: 16px !important
+ font-weight: bold
+ color: #ab8b57 !important
+ line-height: 1.2 !important
+ width: auto
+ text-align: right
+
+ .sheet-label
+ flex: 1
+ width: auto
+ height: auto
+ margin-left: 0
+ margin-top: 0
+ border: none
+ background: transparent
+ vertical-align: baseline
+ display: flex
+ align-items: center
+ order: 1
+
+ .sheet-label span
+ font-family: 'Oxanium', sans-serif
+ font-size: 9px !important
+ font-weight: bold
+ color: #888 !important
+ text-transform: uppercase
+ letter-spacing: 1px
+ line-height: 1.2 !important
+ width: auto
+ text-align: left
+
+// ---- Inspiration + Initiative row ----
+.sheet-insp-init-row
+ display: flex
+ gap: 6px
+ margin-bottom: 8px
+ align-items: stretch
+
+.sheet-insp-button
+ flex: 1 1 0
+ display: flex
+ align-items: center
+ justify-content: center
+ gap: 7px
+ background: #e8e8e8
+ border: 1px solid #ab8b57
+ border-radius: 6px
+ padding: 8px 12px
+ cursor: pointer
+ transition: background 0.2s, border-color 0.2s
+ user-select: none
+ min-height: 34px
+ box-sizing: border-box
+ input[type=checkbox]
+ display: none
+
+// Material Symbols icon — default gold, hollow (FILL=0)
+.sheet-eg-icon
+ font-family: 'Material Symbols Outlined'
+ font-size: 22px
+ flex-shrink: 0
+ color: #ab8b57
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24
+ display: inline-block !important
+ vertical-align: middle
+ line-height: 1
+ user-select: none
+
+.sheet-insp-text
+ font-family: 'Oxanium', sans-serif
+ font-size: 14px
+ font-weight: bold
+ color: #ab8b57
+ font-variant: small-caps
+ letter-spacing: 1px
+ display: inline !important
+ line-height: 1
+
+// Checked state — gold background, white text + white icon
+.sheet-insp-button:has(input[type=checkbox]:checked)
+ background: #ab8b57
+ border-color: #ab8b57
+
+.sheet-insp-button input[type=checkbox]:checked ~ .sheet-insp-text
+ color: #fff
+
+.sheet-insp-button input[type=checkbox]:checked ~ .sheet-eg-icon
+ color: #fff
+ font-variation-settings: 'FILL' 1, 'wght' 400, 'GRAD' 0, 'opsz' 24
+
+// Initiative roll button
+.sheet-init-button
+ flex: 1 1 0
+ background: #066dce !important
+ border: none !important
+ border-radius: 6px
+ color: #fff !important
+ font-family: 'Oxanium', sans-serif
+ font-size: 14px !important
+ font-weight: bold
+ padding: 8px 4px !important
+ cursor: pointer
+ font-variant: small-caps
+ letter-spacing: 1px
+ display: flex !important
+ align-items: center
+ justify-content: center
+ gap: 3px
+ box-shadow: none !important
+ text-shadow: none !important
+ min-height: 34px
+ box-sizing: border-box
+ white-space: nowrap
+ &::before
+ content: "" !important
+ span
+ display: inline !important
+ font-size: 14px !important
+ color: #fff !important
+ font-weight: bold
+ &:hover
+ background: #0558b0 !important
+
+// PB + Level Up row
+.sheet-pb-levelup-row
+ display: flex
+ gap: 6px
+ margin-bottom: 8px
+ align-items: stretch
+
+// Proficiency Bonus compact display
+.sheet-pb-display
+ flex: 1 1 0
+ display: flex
+ align-items: center
+ gap: 8px
+ padding: 4px 8px
+ border: 1px solid #ab8b57
+ border-radius: 6px
+
+.sheet-pb-value
+ font-family: 'Oxanium', sans-serif
+ font-size: 16px !important
+ font-weight: bold
+ color: #ab8b57 !important
+ display: inline-block !important
+ line-height: 1.2
+
+.sheet-pb-label
+ font-family: 'Oxanium', sans-serif
+ font-size: 9px !important
+ font-weight: bold
+ color: #888 !important
+ text-transform: uppercase
+ letter-spacing: 1px
+ display: inline !important
+ line-height: 1.2
+
+// Level Up button
+.sheet-levelup-button
+ flex: 1 1 0
+ display: flex !important
+ align-items: center
+ justify-content: center
+ background: #e8e8e8
+ border: 1px solid #066dce
+ border-radius: 6px
+ padding: 4px 8px
+ cursor: pointer
+ font-family: 'Oxanium', sans-serif
+ font-size: 14px
+ font-weight: bold
+ color: #066dce
+ font-variant: small-caps
+ letter-spacing: 1px
+ transition: background 0.2s, color 0.2s, box-shadow 0.2s
+ box-sizing: border-box
+ box-shadow: none !important
+ text-shadow: none !important
+ &::before
+ content: "" !important
+ &:hover
+ background: #066dce !important
+ color: #fff !important
+ border-color: #066dce !important
+ box-shadow: 0 0 8px rgba(6, 109, 206, 0.6) !important
+
+.sheet-levelup-icon
+ font-family: 'Material Symbols Outlined' !important
+ font-size: 22px !important
+ font-weight: 300 !important
+ font-style: normal !important
+ line-height: 1 !important
+ vertical-align: middle !important
+ margin-left: 4px !important
+ font-variation-settings: 'FILL' 0, 'wght' 300, 'GRAD' 0, 'opsz' 20 !important
+ text-transform: none !important
+ font-variant: normal !important
+ letter-spacing: normal !important
+
+.sheet-saving-throw input[type=text], .sheet-skill input[type=text], .sheet-hp input, .sheet-tp input, .sheet-exhaustion input
width: 100%
text-align: center
font-size: 20px
@@ -625,7 +2330,7 @@ button[type=roll] *
border-radius: 0px
color: black
-.sheet-attacks input, .sheet-equipment input, .sheet-tool input, .sheet-proficiencies input, .sheet-pc .sheet-traits input, .sheet-spell input, .sheet-options .sheet-body input
+.sheet-attacks input, .sheet-equipment input, .sheet-tool input, .sheet-proficiencies input, .sheet-pc .sheet-traits input, .sheet-spell input, .sheet-options .sheet-body input, .sheet-settings-modal-body input
width: 100%
text-align: center
font-size: 20px
@@ -660,14 +2365,15 @@ button[type=roll] *
padding-left: 10px
.sheet-saving-throw-container, .sheet-skills-container
- width: 165px
+ width: 100%
+ box-sizing: border-box
border: 1px solid #ab8b57
border-radius: 5px
margin-bottom: 10px
padding-top: 5px
.sheet-saving-throw, .sheet-skill
- width: 165px
+ width: 100%
height: 18px
.sheet-saving-throw input[type=checkbox], .sheet-skill input[type=checkbox]
@@ -693,7 +2399,53 @@ button[type=roll] *
text-overflow: ellipsis
text-align: left
-.sheet-saving-throw-container .sheet-label span, .sheet-skills-container .sheet-label span, .sheet-textbox-container .sheet-label span, .sheet-ac-init-speed-container span.sheet-label, .sheet-hp span, .sheet-tp span, .sheet-exhaustion span.sheet-label, .sheet-hdice-dsaves-container span, .sheet-attacks span, .sheet-globalattack span, .sheet-equipment span, .sheet-textbox span, .sheet-tool_proficiencies span, .sheet-proficiencies span, .sheet-traits span, .sheet-spells span, .sheet-options .sheet-body span
+// ---- Feature 9: Skill Toggle (Show 5E Skills?) ----
+// Hide the controlling checkbox inputs in the sheet flow
+.sheet-show-5e-toggle,
+.sheet-show-5e-settings-toggle
+ display: none
+
+// Default: hide 5E separator (no redesign conflict)
+.sheet-skills-container .sheet-fivee-separator
+ display: none
+ border-top: 1px solid #ccc
+ margin: 2px 0
+
+// When checked: reveal separator
+input[name="attr_show_5e_skills"]:checked ~ .sheet-skills-container .sheet-fivee-separator
+ display: block
+
+// NOTE: fivee-skill hide/show rules are at END of file — must follow skill redesign block
+
+// ---- Typography: Oxanium headers ----
+.charsheet h3,
+.charsheet h3 span,
+.charsheet .sheet-traits .sheet-display .sheet-title,
+.charsheet .sheet-spell .sheet-details span[name=attr_spellname],
+.charsheet .sheet-col-full .sheet-spell-header > span,
+.charsheet .sheet-npc .sheet-display .sheet-title span,
+.sheet-rolltemplate-npc .sheet-header,
+.sheet-rolltemplate-npcaction .sheet-header,
+.sheet-rolltemplate-npcatk .sheet-header,
+.sheet-rolltemplate-npcdmg .sheet-header,
+.sheet-rolltemplate-traits .sheet-header,
+.sheet-rolltemplate-spell .sheet-title,
+.charsheet .sheet-charmancer .sheet-compendium-class-name
+ font-family: 'Oxanium', sans-serif
+
+// ---- Feature 10: Currency Toggle (EG ↔ 5e) ----
+// Default (EG mode): hide 5e currency block
+.sheet-equipment .sheet-fivee-currency
+ display: none
+
+// 5e mode: show 5e currency, hide EG currency
+input[name="attr_currency_mode"][value="5e"] ~ .sheet-fivee-currency
+ display: inline-block
+
+input[name="attr_currency_mode"][value="5e"] ~ .sheet-eg-currency
+ display: none
+
+.sheet-saving-throw-container .sheet-label span, .sheet-skills-container .sheet-label span, .sheet-textbox-container .sheet-label span, .sheet-ac-init-speed-container span.sheet-label, .sheet-hp span, .sheet-tp span, .sheet-exhaustion span.sheet-label, .sheet-hdice-dsaves-container span, .sheet-attacks span, .sheet-globalattack span, .sheet-equipment span, .sheet-textbox span, .sheet-tool_proficiencies span, .sheet-proficiencies span, .sheet-traits span, .sheet-spells span, .sheet-options .sheet-body span, .sheet-settings-modal-body span
display: block
font-size: 9px
line-height: 12px
@@ -721,45 +2473,220 @@ button[type=roll] *
&[type="number"]
width: 3.5em
+// ---- Exhaustion Level section redesign ----
.sheet-exhaustion
- div span.sheet-ex-description
- font-size: 9px
- line-height: 9px
- text-align: left
- width: 116px
- display: block
+ display: flex
+ align-items: flex-start
+ gap: 10px
+ padding: 8px 12px 10px 12px
+ padding-top: 32px
span.sheet-label
- width: 100%
- display: inline-block
+ position: absolute !important
+ top: 0 !important
+ bottom: auto !important
+ left: 0
+ right: 0
+ display: block !important
text-align: center
+ border-bottom: 1px solid rgba(171,139,87,0.5)
+ border-radius: 4px 4px 0 0
+ padding: 5px 0
+ box-sizing: border-box
+ font-family: 'Oxanium', sans-serif !important
+ font-size: 10px !important
+ font-weight: bold !important
+ color: #245485 !important
+ text-transform: uppercase
+ letter-spacing: 1px
+ width: auto !important
+ margin-top: 0 !important
+
+ input[type="number"]
+ flex: 0 0 80px
+ width: 80px
+ display: block
+ vertical-align: unset
+ font-size: 28px
+ font-weight: bold
div.sheet-ex-descriptions
- display: inline-block
- padding-top: 5px
+ flex: 1
+ display: block
+ padding-top: 3px
+
+ div span.sheet-ex-description
+ width: 100% !important
+ font-size: 10px
+ line-height: 13px
+ text-align: left
+ display: block
.sheet-exhaustion-toggle[value="0"] ~ .sheet-exhaustion
display: none
-.sheet-exhaustion input[type="number"]
- width: 116px
- display: inline-block
- vertical-align: top
-
-.sheet-skill button span, .sheet-options .sheet-body .sheet-skill span span, .sheet-rolltemplate-spell .sheet-grey
+.sheet-skill button span, .sheet-options .sheet-body .sheet-skill span span, .sheet-settings-modal-body .sheet-skill span span, .sheet-rolltemplate-spell .sheet-grey
color: #A0A0A0
font-weight: normal
.sheet-textbox-container
border: 1px solid #ab8b57
border-radius: 5px
- width: 243px
+ width: 100%
+ box-sizing: border-box
+
.sheet-tool_proficiencies
border: 1px solid #ab8b57
border-radius: 5px
- width: 243px
+ width: 100%
+ box-sizing: border-box
padding-bottom: 10px
+ padding-top: 28px // headroom for the absolute section title
+
+// ---- Tool Proficiencies section redesign ----
+// Section title — repositioned to top, styled like Attacks label
+.sheet-tool_proficiencies > .sheet-label
+ top: 0 !important
+ bottom: auto !important
+ left: 0
+ right: 0
+ border-bottom: 1px solid rgba(171,139,87,0.5)
+ border-radius: 4px 4px 0 0
+ padding: 5px 0
+ box-sizing: border-box
+
+.sheet-tool_proficiencies > .sheet-label span
+ display: inline !important
+ font-family: 'Oxanium', sans-serif
+ font-size: 11px !important
+ font-weight: bold !important
+ color: #245485 !important
+ text-transform: uppercase
+ letter-spacing: 1px
+ width: auto !important
+ margin-top: 0 !important
+
+// Column header row — flex, left-aligned with data
+.sheet-tool_proficiencies .sheet-top
+ display: flex !important
+ align-items: center
+ background: transparent
+ padding: 7px 6px 3px 6px // gear icon is right-side, no extra left offset
+ border-bottom: 1px solid rgba(171,139,87,0.2)
+ box-sizing: border-box
+
+.sheet-tool_proficiencies .sheet-top span[data-i18n="tool-u"]
+ display: inline-block !important
+ flex: 1 !important
+ width: auto !important
+ font-size: 9px !important
+ color: #888 !important
+ font-weight: normal !important
+ text-transform: uppercase
+ letter-spacing: 0.5px
+ text-align: left !important
+ margin-top: 0 !important
+ line-height: normal !important
+
+.sheet-tool_proficiencies .sheet-top span[data-i18n="pro-u"]
+ display: inline-block !important
+ width: 44px !important
+ flex-shrink: 0
+ font-size: 9px !important
+ color: #888 !important
+ font-weight: normal !important
+ text-transform: uppercase
+ letter-spacing: 0.5px
+ text-align: center !important
+ margin-top: 0 !important
+ line-height: normal !important
+
+.sheet-tool_proficiencies .sheet-top span[data-i18n="attr-u"]
+ display: inline-block !important
+ width: 80px !important
+ flex-shrink: 0
+ font-size: 9px !important
+ color: #888 !important
+ font-weight: normal !important
+ text-transform: uppercase
+ letter-spacing: 0.5px
+ text-align: center !important
+ margin-top: 0 !important
+ line-height: normal !important
+
+// Roll button — flex row layout + clear Roll20 green
+.charsheet .sheet-tool_proficiencies .sheet-tool .sheet-display button[type=roll]
+ display: flex !important
+ align-items: center !important
+ background-color: transparent !important
+ background-image: none !important
+ border: none !important
+ box-shadow: none !important
+ color: #111 !important
+ padding: 3px 6px !important
+ width: 100% !important
+ box-sizing: border-box !important
+
+// Kill green mouseover highlight
+.charsheet .sheet-tool_proficiencies .sheet-tool .sheet-display button[type=roll]:hover
+ color: #111 !important
+ background: transparent !important
+ background-color: transparent !important
+
+.charsheet .sheet-tool_proficiencies .sheet-tool .sheet-display button[type=roll]:hover *
+ color: inherit !important
+ background: transparent !important
+
+// Tool name span — expands to fill remaining width, bold
+.sheet-tool_proficiencies .sheet-tool .sheet-display button span
+ flex: 1 !important
+ width: auto !important
+ font-size: 12px !important
+ font-weight: bold !important
+ text-align: left
+ background: transparent !important
+
+// Bonus display (first text input) — 44px, centered, normal weight
+.sheet-tool_proficiencies .sheet-tool .sheet-display button input[type=text]:first-of-type
+ width: 44px !important
+ flex-shrink: 0
+ text-align: center !important
+ font-size: 12px !important
+ font-weight: normal !important
+ background: transparent !important
+ border: none !important
+
+// Attribute input (last text input) — 80px, center-aligned, normal weight
+.sheet-tool_proficiencies .sheet-tool .sheet-display button input[type=text]:last-of-type
+ width: 80px !important
+ flex-shrink: 0
+ text-align: center !important
+ font-size: 12px !important
+ font-weight: normal !important
+ background: transparent !important
+ border: none !important
+
+// Subtle blue row-hover tint
+.sheet-tool_proficiencies .sheet-tool:hover .sheet-display
+ background: rgba(36, 84, 133, 0.04) !important
+
+// Gear icon — Material Symbols gold gear matching AC/Speed style
+.sheet-tool_proficiencies .sheet-tool .sheet-options-flag + span
+ font-family: 'Material Symbols Outlined' !important
+ font-size: 14px !important
+ color: #ab8b57 !important
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24 !important
+ text-transform: none !important
+ font-variant: normal !important
+ line-height: 1
+ user-select: none
+ opacity: 0.6
+ align-items: center
+ justify-content: center
+
+.sheet-tool_proficiencies .sheet-tool:hover .sheet-options-flag + span
+ opacity: 1
.sheet-attacks
padding-bottom: 10px
@@ -770,23 +2697,139 @@ button[type=roll] *
border: none
.sheet-ac-init-speed-container, .sheet-hp, .sheet-tp, .sheet-exhaustion, .sheet-hdice-dsaves-container, .sheet-attacks, .sheet-equipment
- width: 240px
+ width: 100%
+ box-sizing: border-box
margin-bottom: 10px
+// === AC / Speed — two independent boxes ===
.sheet-ac-init-speed-container
- div
- width: calc(31%)
- height: 100%
- border: 1px solid #ab8b57
- border-radius: 5px
- display: inline-block
- vertical-align: top
+ display: flex
+ gap: 6px
- span.sheet-label
- margin-top: 0px
+.sheet-ac-box, .sheet-speed-box
+ flex: 1 1 0
+ border: 1px solid #ab8b57
+ border-radius: 6px
+ padding: 4px 8px 6px
+ display: flex
+ flex-direction: column
+ align-items: center
+ gap: 2px
+ box-sizing: border-box
- button[type=roll]
- display: block
+.sheet-ac-box-header, .sheet-speed-box-header
+ display: flex
+ align-items: center
+ width: 100%
+ &::before
+ content: ''
+ width: 16px
+ flex-shrink: 0
+
+.sheet-ac-box-label, .sheet-speed-box-label
+ flex: 1
+ font-family: 'Oxanium', sans-serif
+ font-size: 9px
+ font-weight: bold
+ color: #245485
+ text-transform: uppercase
+ letter-spacing: 1px
+ text-align: center
+
+// Gear toggle — right end
+.sheet-ac-gear-toggle, .sheet-speed-gear-toggle
+ width: 16px
+ flex-shrink: 0
+ display: flex
+ justify-content: flex-end
+ align-items: center
+ cursor: pointer
+ input[type=checkbox]
+ display: none
+
+.sheet-ac-gear-icon, .sheet-speed-gear-icon
+ font-family: 'Material Symbols Outlined'
+ font-size: 14px
+ color: #ab8b57
+ opacity: 0.6
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24
+ display: inline-block !important
+ line-height: 1
+ user-select: none
+ transition: opacity 0.2s, color 0.2s
+
+.sheet-ac-gear-toggle:hover .sheet-ac-gear-icon,
+.sheet-speed-gear-toggle:hover .sheet-speed-gear-icon
+ opacity: 1
+
+.sheet-ac-box:has(.sheet-ac-expand-cb:checked) .sheet-ac-gear-icon,
+.sheet-speed-box:has(.sheet-speed-expand-cb:checked) .sheet-speed-gear-icon
+ color: #066dce
+ opacity: 1
+ font-variation-settings: 'FILL' 1, 'wght' 400, 'GRAD' 0, 'opsz' 24
+
+// Main value
+.sheet-ac-box > input[type=text],
+.sheet-speed-box > input[type=text]
+ font-size: 28px !important
+ font-weight: bold
+ color: #000 !important
+ background: none !important
+ border: none !important
+ box-shadow: none !important
+ text-align: center
+ width: 100% !important
+ padding: 0
+ line-height: 1.1
+
+// Details panel
+.sheet-ac-details, .sheet-speed-details
+ display: none
+ flex-direction: row
+ gap: 4px
+ width: 100%
+ padding-top: 6px
+ border-top: 1px solid rgba(171,139,87,0.3)
+
+.sheet-ac-box:has(.sheet-ac-expand-cb:checked) .sheet-ac-details
+ display: flex
+
+.sheet-speed-box:has(.sheet-speed-expand-cb:checked) .sheet-speed-details
+ display: flex
+
+// Detail items
+.sheet-detail-item
+ flex: 1 1 0
+ display: flex
+ flex-direction: column
+ align-items: center
+ background: rgba(171,139,87,0.08)
+ border-radius: 4px
+ padding: 4px 2px
+ gap: 2px
+
+.sheet-detail-item input[type=text], .sheet-detail-value
+ font-family: 'Oxanium', sans-serif
+ font-size: 12px !important
+ font-weight: bold
+ color: #333 !important
+ background: none !important
+ border: none !important
+ box-shadow: none !important
+ text-align: center
+ width: 100% !important
+ padding: 0
+ line-height: 1.2
+ display: block !important
+
+.sheet-detail-label
+ font-size: 8px !important
+ color: #888 !important
+ text-transform: uppercase
+ letter-spacing: 0.5px
+ display: block !important
+ text-align: center
+ line-height: 1
.sheet-hp, .sheet-tp, .sheet-exhaustion, .sheet-subcontainer, .sheet-attacks, .sheet-equipment
border: 1px solid #ab8b57
@@ -859,13 +2902,18 @@ button[type=roll] *
vertical-align: top
height: 64px
- input[type=text].sheet-label
+ input[type=text].sheet-label,
+ span.sheet-label
display: block
font-size: 9px
line-height: 12px
width: 100%
text-align: center
font-weight: bold
+ font-variant: small-caps
+ text-transform: uppercase
+ span.sheet-label
+ margin-top: 4px
.sheet-hdice-dsaves-container .sheet-row-container
float: right
@@ -954,6 +3002,120 @@ button[type=roll] *
.sheet-attacks
min-height: 150px
margin-bottom: 10px
+ overflow: hidden
+
+// ---- Attacks section redesign ----
+.sheet-attacks .sheet-attack
+ position: relative !important
+.sheet-attacks .sheet-top.sheet-atk-header
+ display: flex
+ align-items: center
+ width: calc(100% + 10px)
+ padding: 5px 4px 5px 8px
+ border-bottom: 1px solid rgba(171,139,87,0.5)
+ box-sizing: border-box
+.sheet-attacks .sheet-atk-col-name
+ flex: 1
+ font-family: 'Oxanium', sans-serif
+ font-size: 9px
+ font-weight: bold
+ color: #888
+ text-transform: uppercase
+ letter-spacing: 0.5px
+ display: block !important
+ width: auto !important
+.sheet-attacks .sheet-atk-col-range,
+.sheet-attacks .sheet-atk-col-hit,
+.sheet-attacks .sheet-atk-col-dmg
+ flex-shrink: 0
+ text-align: center
+ font-size: 9px
+ font-weight: bold
+ color: #888
+ text-transform: uppercase
+ letter-spacing: 0.5px
+ width: 60px !important
+.sheet-attacks .sheet-atk-col-dmg
+ width: 96px !important
+.sheet-attacks .sheet-attack + .sheet-attack .sheet-display
+ border-top: 1px solid rgba(171,139,87,0.2)
+.sheet-attacks .sheet-attack:nth-child(even) .sheet-display
+ background: rgba(0,0,0,0.02)
+.sheet-attacks .sheet-display
+ position: relative
+.sheet-attacks .sheet-display button[type=roll]
+ display: inline-flex !important
+ flex-direction: row !important
+ align-items: center !important
+ width: calc(100% - 22px) !important
+ padding: 4px 4px 4px 8px !important
+ min-height: 32px
+.sheet-attacks .sheet-display .sheet-atk-name-cell,
+.sheet-attacks .sheet-display .sheet-atk-range-cell,
+.sheet-attacks .sheet-display .sheet-atk-bonus-cell,
+.sheet-attacks .sheet-display .sheet-atk-dmg-cell
+ background: none !important
+ border-radius: 0 !important
+ padding: 0 !important
+ margin: 0 !important
+ min-height: 0 !important
+ vertical-align: middle !important
+ white-space: nowrap
+ overflow: hidden
+ text-overflow: ellipsis
+ border: none !important
+ box-shadow: none !important
+.sheet-attacks .sheet-display .sheet-atk-name-cell
+ flex: 1
+ text-align: left
+ font-size: 12px !important
+ font-weight: bold !important
+ color: #111
+.sheet-attacks .sheet-display .sheet-atk-range-cell
+ width: 60px
+ flex-shrink: 0
+ text-align: center
+ font-size: 11px !important
+ font-weight: normal !important
+ color: #555
+.sheet-attacks .sheet-display .sheet-atk-bonus-cell
+ width: 60px
+ flex-shrink: 0
+ text-align: center
+ font-size: 11px !important
+ font-weight: bold !important
+ color: #066dce
+.sheet-attacks .sheet-display .sheet-atk-dmg-cell
+ width: 96px
+ flex-shrink: 0
+ text-align: center
+ font-size: 11px !important
+ color: #333
+.sheet-attacks .sheet-options-flag
+ right: 0 !important
+ width: 22px !important
+ height: 32px !important
+.sheet-attacks .sheet-options-flag + span
+ right: 0 !important
+ width: 22px !important
+ height: 32px !important
+ display: none
+ align-items: center
+ justify-content: center
+ font-family: 'Material Symbols Outlined' !important
+ font-size: 14px !important
+ color: #ab8b57 !important
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24 !important
+ text-transform: none !important
+ font-variant: normal !important
+ line-height: 1
+ user-select: none
+.sheet-attacks .sheet-attack:hover .sheet-display
+ background: rgba(36, 84, 133, 0.06) !important
+.sheet-attacks .sheet-display button[type=roll]:hover *
+ color: inherit !important
+.sheet-attacks .sheet-display button[type=roll]:hover input[type=text]
+ color: inherit !important
.sheet-equipment.sheet-hidden
min-height: 50px
@@ -1014,6 +3176,32 @@ button[type=roll] *
font-size: 10px
display: inline
+// ---- Features & Traits section — header to top ----
+.sheet-textbox.sheet-traits
+ position: relative
+ padding-top: 28px
+ padding-bottom: 10px
+ > span.sheet-label
+ position: absolute !important
+ top: 0 !important
+ bottom: auto !important
+ left: 0
+ right: 0
+ display: block !important
+ text-align: center
+ border-bottom: 1px solid rgba(171,139,87,0.5)
+ border-radius: 4px 4px 0 0
+ padding: 5px 0
+ box-sizing: border-box
+ font-family: 'Oxanium', sans-serif !important
+ font-size: 10px !important
+ font-weight: bold !important
+ color: #245485 !important
+ text-transform: uppercase
+ letter-spacing: 1px
+ width: auto !important
+ margin-top: 0 !important
+
.sheet-spell .sheet-details-flag, .sheet-attacks .sheet-options-flag, .sheet-spell .sheet-options-flag, .sheet-tool .sheet-options-flag, .sheet-npc .sheet-npc_options-flag, .sheet-npcs .sheet-npc_options-flag, .sheet-ships .sheet-npc_options-flag
opacity: 0
position: absolute
@@ -1089,6 +3277,27 @@ button[type=roll] *
display: -webkit-box
display: -ms-flexbox
display: flex
+ color: #245485 !important
+ .sheet-trait:hover .sheet-output:hover
+ color: #1a3d64 !important
+ // Gear icon — Material Symbols outlined gold (span has "y"/pictos text; hide via font-size:0, inject "settings" ligature via ::before)
+ .sheet-trait .sheet-options-flag + span
+ font-family: 'Material Symbols Outlined' !important
+ font-size: 0 !important
+ color: #ab8b57 !important
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24 !important
+ text-transform: none !important
+ font-variant: normal !important
+ opacity: 0.6
+ &::before
+ content: 'settings'
+ font-size: 14px
+ line-height: 18px
+ .sheet-trait:hover .sheet-options-flag + span
+ color: #ab8b57 !important
+ opacity: 1
+ .sheet-trait:hover .sheet-options-flag:hover + span
+ color: #8a6d3e !important
.sheet-header
&:hover .sheet-options-flag + span
@@ -1187,9 +3396,15 @@ button[type=roll] *
span
display: inline-block
font-weight: bold
+ font-size: 9px
- input
- width: 170px
+ input, select
+ width: 70px
+ font-size: 10px
+
+ .sheet-row
+ line-height: 1.4
+ margin-bottom: 2px
.sheet-level
width: 20px
@@ -1412,6 +3627,7 @@ button[type=roll] *
font-size: 16px
text-transform: capitalize
font-variant: small-caps
+ font-weight: bold
color: #245485
input
@@ -1614,12 +3830,16 @@ span
.sheet-tool .sheet-options, .sheet-attack .sheet-options, .sheet-spell .sheet-options, .sheet-proficiencies .sheet-options, .sheet-traits .sheet-options, .sheet-global-mod .sheet-options
padding-left: 5px
-.sheet-tool .sheet-options span, .sheet-attack .sheet-options span, .sheet-spell .sheet-options span, .sheet-options .sheet-body span, .sheet-proficiencies .sheet-options span, .sheet-traits .sheet-options span, .sheet-global-mod .sheet-options span
+.sheet-tool .sheet-options span, .sheet-attack .sheet-options span, .sheet-spell .sheet-options span, .sheet-options .sheet-body span, .sheet-settings-modal-body span, .sheet-proficiencies .sheet-options span, .sheet-traits .sheet-options span, .sheet-global-mod .sheet-options span
width: initial
display: inline-block
text-align: left
+.sheet-settings-modal-body .sheet-row.sheet-title span
+ display: block
+ text-align: center
+ width: 100%
-.sheet-tool .sheet-options input, .sheet-attack .sheet-options input[type=text], .sheet-spell .sheet-options input[type=text], .sheet-options .sheet-body input[type=text], .sheet-proficiencies .sheet-options input[type=text], .sheet-traits .sheet-options input[type=text], .sheet-global-mod .sheet-options input[type=text]
+.sheet-tool .sheet-options input, .sheet-attack .sheet-options input[type=text], .sheet-spell .sheet-options input[type=text], .sheet-options .sheet-body input[type=text], .sheet-settings-modal-body input[type=text], .sheet-proficiencies .sheet-options input[type=text], .sheet-traits .sheet-options input[type=text], .sheet-global-mod .sheet-options input[type=text]
display: inline-block
text-align: left
font-size: 12px
@@ -1627,7 +3847,7 @@ span
padding: 0px
width: initial
-.sheet-tool .sheet-options select, .sheet-attack .sheet-options select, .sheet-spell .sheet-options select, .sheet-options .sheet-body select, .sheet-proficiencies .sheet-options select, .sheet-traits .sheet-options select
+.sheet-tool .sheet-options select, .sheet-attack .sheet-options select, .sheet-spell .sheet-options select, .sheet-options .sheet-body select, .sheet-settings-modal-body select, .sheet-proficiencies .sheet-options select, .sheet-traits .sheet-options select
border-bottom: 1px solid #D3D3D3
border-top: 0px
border-left: 0px
@@ -1648,13 +3868,13 @@ span
line-height: 18px
height: 18px
-.sheet-tool .sheet-options input[type=checkbox], .sheet-attack .sheet-options input[type=checkbox], .sheet-spell .sheet-options input[type=checkbox], .sheet-options .sheet-body input[type=checkbox], .sheet-npc .sheet-npc_options input[type=checkbox], .sheet-proficiencies .sheet-options input[type=checkbox], .sheet-traits .sheet-options input[type=checkbox], .sheet-global-mod .sheet-options input[type=checkbox]
+.sheet-tool .sheet-options input[type=checkbox], .sheet-attack .sheet-options input[type=checkbox], .sheet-spell .sheet-options input[type=checkbox], .sheet-options .sheet-body input[type=checkbox], .sheet-settings-modal-body input[type=checkbox], .sheet-npc .sheet-npc_options input[type=checkbox], .sheet-proficiencies .sheet-options input[type=checkbox], .sheet-traits .sheet-options input[type=checkbox], .sheet-global-mod .sheet-options input[type=checkbox]
width: 13px
font-size: initial
-webkit-appearance: checkbox
-moz-appearance: checkbox
-.sheet-attack .sheet-options input[type=text].sheet-num, .sheet-options input[type=text].sheet-num
+.sheet-attack .sheet-options input[type=text].sheet-num, .sheet-options input[type=text].sheet-num, .sheet-settings-modal-body input[type=text].sheet-num
width: 15px
text-align: center
@@ -1844,6 +4064,7 @@ span
font-size: 16px
text-transform: capitalize
font-variant: small-caps
+ font-weight: bold
color: #245485
input
@@ -1920,50 +4141,7 @@ span
border-bottom-left-radius: 0.8em
border-bottom-right-radius: 0.8em
-/* Obsolete Template
-
-.sheet-rolltemplate-simple .sheet-containerold, .sheet-rolltemplate-atk .sheet-containerold, .sheet-rolltemplate-atkdmg .sheet-container.sheet-atkold
- background-repeat: no-repeat
- background-size: 14em 100%
- color: black
- width: 81%
-
-.sheet-rolltemplate-dmg
- .sheet-atkold, .sheet-containerold
- background-repeat: no-repeat
- background-size: 14em 100%
- color: black
- width: 81%
-
-.sheet-rolltemplate-atkdmg .sheet-container.sheet-damagetemplateold
- background-repeat: no-repeat
- background-size: 14em 100%
- color: black
- width: 81%
-
-/* Obsolete Template
-
-.sheet-rolltemplate-simple .sheet-containerold
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/53WSdhx.png") top left
-
-/* Obsolete Template
-
-.sheet-rolltemplate-atk .sheet-containerold, .sheet-rolltemplate-atkdmg .sheet-container.sheet-atkold
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/4RCRsAd.png") top left
-
-.sheet-rolltemplate-dmg
- .sheet-atkold
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/4RCRsAd.png") top left
-
- .sheet-containerold
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/gw9HTsq.png") top left
-
-/* Obsolete Template
-
.sheet-rolltemplate-atkdmg
- .sheet-container.sheet-damagetemplateold
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/gw9HTsq.png") top left
-
.sheet-damagetemplate .sheet-result
min-height: 45px
@@ -2249,18 +4427,6 @@ span
margin-top: -2px
min-height: 17px
-/* Obsolete Template
-
-.sheet-rolltemplate-atk .sheet-descold, .sheet-rolltemplate-atkdmg .sheet-descold, .sheet-rolltemplate-dmg .sheet-descold
- background-repeat: no-repeat
- background-size: 14em 100%
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/4988JS0.png") top left
- color: black
- padding-bottom: 5px
- padding-top: 5px
- text-align: center
- width: 189px
-
.sheet-rolltemplate-atk .sheet-desc, .sheet-rolltemplate-atkdmg .sheet-desc, .sheet-rolltemplate-dmg .sheet-desc, .sheet-rolltemplate-desc .sheet-desc
background-color: white
border: 1px solid black
@@ -2446,6 +4612,7 @@ span
line-height: 12px
text-align: left
font-weight: bold
+ margin-right: 6px
.sheet-title span
text-align: center
@@ -2515,6 +4682,7 @@ span
.sheet-num3
width: 27px
text-align: center
+ margin-right: 4px
.sheet-actype
+ .sheet-parens
@@ -2524,11 +4692,13 @@ span
display: inline
.sheet-parens
- margin-left: -2px
+ margin-left: 0px
+ font-size: 13px
+ font-weight: normal
&:before
- content: "("
-
+ content: " ("
+
&.sheet-xp:before
content: " ("
@@ -2646,10 +4816,10 @@ span
.sheet-negativeflag
&[value="1"] + .sheet-npcattr::before
- content: "("
+ content: " ("
&[value="0"] + .sheet-npcattr::before
- content: "(+"
+ content: " (+"
.sheet-npcattr::after
content: ")"
@@ -2863,6 +5033,7 @@ span
text-align: left
font-family: "Source Sans Pro", "Varta", arial, sans-serif
font-variant: small-caps
+ font-weight: bold
.sheet-rolltemplate-traits .sheet-header
font-family: "Source Sans Pro", "Varta", arial, sans-serif
@@ -2991,6 +5162,111 @@ span
padding-top: 5px
margin-bottom: 15px
+// ---- Other Proficiencies & Languages section redesign ----
+.sheet-textbox-container.sheet-proficiencies
+ padding-top: 28px
+ padding-bottom: 10px
+ position: relative
+ > .sheet-label
+ position: absolute !important
+ top: 0 !important
+ bottom: auto !important
+ left: 0
+ right: 0
+ text-align: center
+ border-bottom: 1px solid rgba(171,139,87,0.5)
+ border-radius: 4px 4px 0 0
+ padding: 5px 0
+ box-sizing: border-box
+ span
+ display: inline !important
+ font-family: 'Oxanium', sans-serif
+ font-size: 10px !important
+ font-weight: bold !important
+ color: #245485 !important
+ text-transform: uppercase
+ letter-spacing: 1px
+ width: auto !important
+ margin-top: 0 !important
+.sheet-proficiencies .sheet-complex
+ width: 100% !important
+ padding-top: 0 !important
+ margin-bottom: 0 !important
+ .sheet-top
+ display: flex !important
+ align-items: center
+ background: transparent
+ padding: 7px 6px 3px 6px
+ border-bottom: 1px solid rgba(171,139,87,0.2)
+ box-sizing: border-box
+ span
+ display: inline-block !important
+ font-size: 9px !important
+ color: #888 !important
+ font-weight: normal !important
+ text-transform: uppercase
+ letter-spacing: 0.5px
+ margin-top: 0 !important
+ line-height: normal !important
+ span[data-i18n="type-u"]
+ width: 78px !important
+ flex-shrink: 0
+ text-align: left !important
+ span[data-i18n="proficency-u"]
+ flex: 1 !important
+ width: auto !important
+ text-align: left !important
+.charsheet .sheet-proficiencies .sheet-proficiency .sheet-display button[type=roll]
+ display: flex !important
+ align-items: center !important
+ background-color: transparent !important
+ background-image: none !important
+ border: none !important
+ box-shadow: none !important
+ color: #111 !important
+ padding: 3px 6px !important
+ width: 100% !important
+ box-sizing: border-box !important
+ &:hover
+ color: #111 !important
+ background: transparent !important
+ background-color: transparent !important
+ &:hover *
+ color: inherit !important
+ background: transparent !important
+.sheet-proficiencies .sheet-proficiency .sheet-display button
+ span[name="attr_prof_type"]
+ width: 78px !important
+ flex-shrink: 0
+ font-size: 11px !important
+ font-weight: bold !important
+ text-align: left !important
+ background: transparent !important
+ span[name="attr_name"]
+ flex: 1 !important
+ width: auto !important
+ font-size: 12px !important
+ font-weight: bold !important
+ text-align: left !important
+ background: transparent !important
+.sheet-proficiencies .sheet-proficiency:hover .sheet-display
+ background: rgba(36, 84, 133, 0.04) !important
+.sheet-proficiencies .sheet-proficiency .sheet-options-flag + span
+ font-family: 'Material Symbols Outlined' !important
+ font-size: 0 !important
+ color: #ab8b57 !important
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24 !important
+ text-transform: none !important
+ font-variant: normal !important
+ user-select: none
+ opacity: 0.6
+.sheet-proficiencies .sheet-proficiency .sheet-options-flag + span::before
+ content: 'settings'
+ font-size: 14px
+ line-height: 18px
+.sheet-proficiencies .sheet-proficiency:hover .sheet-options-flag + span
+ opacity: 1
+
.sheet-pictos
font-family: pictos
@@ -3110,7 +5386,7 @@ span
pointer-events: none
font-size: 0.25em
-.charsheet .sheet-options .sheet-body .sheet-version input[type="text"]
+.charsheet .sheet-options .sheet-body .sheet-version input[type="text"], .charsheet .sheet-settings-modal-body .sheet-version input[type="text"]
border-bottom: none
width: 20px
@@ -3148,7 +5424,7 @@ span
.sheet-hlabel-container
[name="attr_race_display"]
- width: 200px
+ width: 160px
[name="attr_alignment"]
width: 180px
@@ -3192,7 +5468,7 @@ span
.sheet-savedc .sheet-rolltemplate-inline, .sheet-label .sheet-rolltemplate-inline
display: inline-block
-.sheet-options .sheet-body input
+.sheet-options .sheet-body input, .sheet-settings-modal-body input
&[type=text].sheet-pb_custom
display: none
@@ -3265,6 +5541,27 @@ span
text-align: center
font-weight: bold
+ // "Gained?" checkboxes — circular blue pip, dotted border → filled when checked
+ .sheet-sub-button input[type=checkbox]
+ -webkit-appearance: none
+ -moz-appearance: none
+ appearance: none
+ display: block !important
+ width: 14px !important
+ height: 14px !important
+ border-radius: 50% !important
+ border: 1.5px dashed #066dce !important
+ background: transparent !important
+ cursor: pointer !important
+ margin: 2px auto !important
+ padding: 0 !important
+ box-shadow: none !important
+
+ &:checked
+ background: #066dce !important
+ border-color: #066dce !important
+ border-style: solid !important
+
.sheet-licensecontainer.active-drop-target.dropping, .sheet-monster_confirm_flag[value="1"] ~ .sheet-licensecontainer, .sheet-mancer_confirm_flag[value="1"] ~ .sheet-licensecontainer
opacity: 0.5
-o-transition: opacity .15s ease-in-out
@@ -3341,7 +5638,7 @@ span
margin-left: 19px
.sheet-header .sheet-display .sheet-class-display
- width: 298px
+ width: 180px
text-transform: capitalize
overflow: hidden
word-wrap: break-word
@@ -3517,40 +5814,10 @@ span
right: 50px
width: 91px
- input[type=radio].sheet-tab-button
- &.sheet-core
- right: 137px
- width: 76px
-
- + span
- right: 137px
- width: 76px
-
- &.sheet-bio
- right: 103px
- width: 30px
-
- + span
- right: 103px
- width: 30px
-
- &.sheet-spells
- right: 21px
- width: 78px
-
- + span
- right: 21px
- width: 78px
-
/* Czech
.charsheet
&.lang-cs
- input[type=radio].sheet-tab-button.sheet-core
- width: 53px
-
- + span
- width: 53px
select[name=attr_cust_spellslots]
font-size: 9px
@@ -3583,30 +5850,6 @@ span
width: 28px
&.lang-it
- input[type=radio].sheet-tab-button
- &.sheet-core
- right: 146px
- width: 60px
-
- + span
- right: 146px
- width: 60px
-
- &.sheet-bio
- right: 113px
- width: 30px
-
- + span
- right: 113px
- width: 30px
-
- &.sheet-spells
- right: 20px
- width: 90px
-
- + span
- right: 20px
- width: 90px
div.sheet-licensecontainer .sheet-container
&.sheet-pc .sheet-spells .sheet-header .sheet-header-info .sheet-part
@@ -4730,39 +6973,32 @@ body:not(:-moz-handler-blocked) .sheet-charmancer
display: inline
margin-left: 25px
+ &.sheet-global-dmg .sheet-global-mod
+ display: flex
+ align-items: center
+
&.sheet-global-dmg div.sheet-display
- margin-bottom: 2px
- width: 90% !important
-
- span
- &.sheet-title
- padding-right: 0px
- width: 40%
-
- &.sheet-subheader
- display: inline
- padding-right: 0px
- width: 50%
-
- span
- display: inline
- padding: 4px 0px
+ flex: 1
+ min-width: 0
/* Customizations for the PC's global damage area
+// Section header labels inside the attacks box — match AC/Speed/Skills style
+.sheet-attacks .sheet-global-dmg > span.sheet-label,
+.sheet-attacks > span.sheet-label
+ font-family: 'Oxanium', sans-serif
+ color: #245485
+ letter-spacing: 1px
+ position: static
+
div.sheet-globaldisplay
width: 80%
- background-color: #EFEFEF
- border-bottom-right-radius: 5px
- border-top-left-radius: 5px
+ background-color: transparent
display: inline-block
font-size: 9px
- font-weight: bold
+ font-weight: normal
line-height: 16px
- padding-bottom: 3px
- padding-left: 4px
- padding-right: 4px
- padding-top: 3px
+ padding: 3px 4px
text-align: left
-o-text-overflow: ellipsis
text-overflow: ellipsis
@@ -4773,36 +7009,49 @@ div.sheet-globaldisplay
.sheet-pc .sheet-global-mod
.sheet-options-flag:not(:checked) ~ .sheet-display
.sheet-title
- background-color: #EFEFEF
- border-bottom-right-radius: 5px
- border-top-left-radius: 5px
- display: inline-block
- font-size: 9px
+ background-color: transparent
+ flex: 1
+ min-width: 0
+ font-size: 12px
font-weight: bold
+ color: #111
line-height: 16px
- padding-bottom: 3px
- padding-left: 4px
- padding-right: 4px
- padding-top: 3px
+ padding: 3px 4px
text-align: left
.sheet-subheader
- background-color: #EFEFEF
- border-bottom-right-radius: 5px
- border-top-left-radius: 5px
- display: inline-block
- font-size: 9px
- font-weight: bold
- height: 16px
- padding-bottom: 3px
- padding-left: 4px
- padding-right: 4px
- padding-top: 3px
- text-align: left
+ background-color: transparent !important
+ display: flex !important
+ flex-shrink: 0
+ align-items: center
+ padding: 0 !important
+ height: auto !important
+ width: auto !important
+
+// Alternating row shading in attacks section
+.sheet-attacks .repitem:nth-child(even)
+ background-color: #f4fafd
+
+// Global damage display — column-aligned values matching Range cell style (11px, normal, #555)
+.sheet-pc .sheet-global-mod .sheet-options-flag:not(:checked) ~ .sheet-display .sheet-subheader span
+ background: transparent !important
+ width: 60px !important
+ text-align: center !important
+ display: block !important
+ flex-shrink: 0
+ font-size: 11px !important
+ font-weight: normal !important
+ color: #555 !important
+ padding: 0 !important
+ margin: 0 !important
+
+.sheet-pc .sheet-global-mod .sheet-options-flag:not(:checked) ~ .sheet-display .sheet-subheader span:last-child
+ width: 96px !important
.sheet-active-flag
- position: relative
- top: -5px
+ flex-shrink: 0
+ align-self: center
+ margin-right: 6px
.sheet-options-flag:checked ~
.sheet-active-flag
@@ -4811,6 +7060,22 @@ div.sheet-globaldisplay
.sheet-display
display: none
+// Gear icon — global-mod rows
+.sheet-pc .sheet-global-mod .sheet-options-flag + span
+ font-family: 'Material Symbols Outlined' !important
+ font-size: 0 !important
+ color: #ab8b57 !important
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24 !important
+ text-transform: none !important
+ font-variant: normal !important
+ opacity: 0.6
+.sheet-pc .sheet-global-mod .sheet-options-flag + span::before
+ content: 'settings'
+ font-size: 14px
+ line-height: 18px
+.sheet-pc .sheet-global-mod:hover .sheet-options-flag + span
+ opacity: 1
+
/* Level HP Bar
.sheet-charmancer
@@ -5041,822 +7306,12 @@ div.sheet-globaldisplay
color: red
margin-top: -.5em
-/* styling the featured slide's spell selection
-
-/* DnD5E OFFICIAL CONTENT CSS
-/* LICENSED SHEET
-
-div.sheet-licensecontainer.sheet-licensedsheet, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer
- /* NPC & MONSTER TEMPLATE
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-page > div.sheet-header, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-page > div.sheet-header
- margin-left: -50px
- width: 850px
- height: 140px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-advantagetoggle, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-advantagetoggle
- top: 140px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-page
- &.sheet-core > div.sheet-header, &.sheet-options > div.sheet-header
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/CharScroll.svg?sanitize=true")
- background-repeat: no-repeat
- background-size: cover
- background-position: 2px center
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-page
- &.sheet-core > div.sheet-header, &.sheet-options > div.sheet-header
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/CharScroll.svg?sanitize=true")
- background-repeat: no-repeat
- background-size: cover
- background-position: 2px center
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-page.sheet-bio > div.sheet-header, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-page.sheet-bio > div.sheet-header
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/BioScroll.svg?sanitize=true")
- background-repeat: no-repeat
- background-size: cover
- background-position: 2px center
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-page.sheet-spells > div.sheet-header, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-page.sheet-spells > div.sheet-header
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/SpellScroll.svg?sanitize=true")
- background-repeat: no-repeat
- background-size: cover
- background-position: 2px center
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-page > div.sheet-header::after, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-page > div.sheet-header::after
- content: ""
- width: 30px
- height: 162px
- position: absolute
- right: -60px
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/ScrollRight.svg?sanitize=true")
- background-repeat: no-repeat
- background-position: right center
- background-size: 100% 100%
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-page div.sheet-header div.sheet-name-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-page div.sheet-header div.sheet-name-container
- width: 250px
- display: inline-block
- margin-left: 60px
- margin-top: 72px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-page div.sheet-header div.sheet-name-container img, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-page div.sheet-header div.sheet-name-container img
- display: none
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-page div.sheet-header div.sheet-name-container span, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-page div.sheet-header div.sheet-name-container span
- margin-top: 16px
- margin-left: 35px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header-info, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header-info
- border: none
- margin-left: 54px
- width: 440px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_background], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_background]
- width: 138px !important
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_race], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_race]
- width: 180px !important
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_alignment], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_alignment]
- width: 140px !important
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_experience], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_experience]
- width: 98px !important
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_age], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_age], div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_height], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_height], div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_weight], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_weight]
- width: 100px !important
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_eyes], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_eyes], div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_skin], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_skin], div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_hair], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header-info div.sheet-hlabel-container input[name=attr_hair]
- width: 140px !important
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-spells div.sheet-header-info div.sheet-part, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-spells div.sheet-header-info div.sheet-part
- width: 144px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-spells div.sheet-header-info div.sheet-part
- select, input
- border: none
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-spells div.sheet-header-info div.sheet-part
- select, input
- border: none
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-spells div.sheet-header-info div.sheet-part select[name=attr_spellcasting_ability], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-spells div.sheet-header-info div.sheet-part select[name=attr_spellcasting_ability]
- text-align-last: center
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-header div.sheet-part span.sheet-display, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-header div.sheet-part span.sheet-display
- border: none
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-footer, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-footer
- display: none
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) input[type=radio].sheet-tab-button, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) input[type=radio].sheet-tab-button
- top: 140px
-
- + span
- top: 140px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) div.sheet-advantagetoggle, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) div.sheet-advantagetoggle
- top: 140px
-
-div.sheet-licensecontainer.sheet-licensedsheet div
- &.sheet-npc div.sheet-triangle, &.sheet-triangle
- border: none
- border-top: 3px solid transparent
- border-bottom: 3px solid transparent
- border-left: 360px solid #245485
- margin-top: 5px
- margin-bottom: 5px
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer div
- &.sheet-npc div.sheet-triangle, &.sheet-triangle
- border: none
- border-top: 3px solid transparent
- border-bottom: 3px solid transparent
- border-left: 360px solid #245485
- margin-top: 5px
- margin-bottom: 5px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container.sheet-pc .sheet-header .sheet-options-flag, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container.sheet-pc .sheet-header .sheet-options-flag, div.sheet-licensecontainer.sheet-licensedsheet .sheet-container.sheet-pc .sheet-header .sheet-options-flag + span, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container.sheet-pc .sheet-header .sheet-options-flag + span
- top: 45px
- right: -15px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container.sheet-pc .sheet-header .sheet-header-info, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container.sheet-pc .sheet-header .sheet-header-info
- margin-top: 30px
- margin-left: 51px
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/CharBox.svg?sanitize=true")
- background-position: 0
- padding: 14px
- background-size: cover
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container.sheet-pc .sheet-spells .sheet-header .sheet-header-info, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container.sheet-pc .sheet-spells .sheet-header .sheet-header-info
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/SpellBox.svg?sanitize=true")
- display: -webkit-inline-box
- display: -ms-inline-flexbox
- display: inline-flex
- -ms-flex-pack: distribute
- justify-content: space-around
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container.sheet-pc .sheet-spells .sheet-header .sheet-header-info .sheet-part, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container.sheet-pc .sheet-spells .sheet-header .sheet-header-info .sheet-part
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/SpellHeadBlock.svg?sanitize=true")
- background-position: top center
- background-size: contain
- background-repeat: no-repeat
- width: 30%
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attributes-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attributes-container
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/ability-back.svg?sanitize=true")
- margin: 0 !important
- background-repeat: no-repeat
- background-size: cover
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container
- width: auto
- border: 0
- margin: 0 !important
- margin-top: 20px !important
- background-position: top center !important
- background-repeat: no-repeat !important
- background-size: contain !important
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/ability-STR.svg?sanitize=true")
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container ~ .sheet-attr-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container ~ .sheet-attr-container
- margin-top: 8px !important
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container + .sheet-attr-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container + .sheet-attr-container
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/ability-DEX.svg?sanitize=true")
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container + .sheet-attr-container + .sheet-attr-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container + .sheet-attr-container + .sheet-attr-container
- /* constitution is abbrivated CNS instead of CON
- * because windows has that term reserved
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/ability-CNS.svg?sanitize=true")
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/ability-INT.svg?sanitize=true")
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/ability-WIS.svg?sanitize=true")
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container + .sheet-attr-container
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/ability-CHA.svg?sanitize=true")
- margin-bottom: 20px !important
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container button, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container button
- font-size: 6.5px !important
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container .sheet-attr, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container .sheet-attr
- font-size: 35px
- font-weight: bold
- position: relative
- top: -5px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container .sheet-attr-mod, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container .sheet-attr-mod
- border: none
- background: transparent
- margin-top: -10px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-attr-container .sheet-attr-mod
- .sheet-baseattr, .sheet-attr-flag, .sheet-finalattr
- font-size: 18px !important
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-attr-container .sheet-attr-mod
- .sheet-baseattr, .sheet-attr-flag, .sheet-finalattr
- font-size: 18px !important
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-insp-prof-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-insp-prof-container
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/inspiration.svg?sanitize=true")
- background-repeat: no-repeat
- background-size: cover
- height: 40px
- margin-bottom: 2px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-insp-prof-container + .sheet-insp-prof-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-insp-prof-container + .sheet-insp-prof-container
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/proficency-bonus.svg?sanitize=true")
- background-repeat: no-repeat
- background-size: cover
- height: 50px
- margin-bottom: 2px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-insp-prof-container
- .sheet-value, .sheet-label
- border: none
- background: transparent
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-insp-prof-container
- .sheet-value, .sheet-label
- border: none
- background: transparent
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-insp-prof-container .sheet-value, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-insp-prof-container .sheet-value
- margin-top: 2px
- margin-left: 3px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-insp-prof-container .sheet-label, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-insp-prof-container .sheet-label
- width: calc(100% - 42px)
- margin-left: 0
- margin-top: 5px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-insp-prof-container + .sheet-insp-prof-container .sheet-value, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-insp-prof-container + .sheet-insp-prof-container .sheet-value
- margin-top: 8px
- margin-left: 6px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-insp-prof-container + .sheet-insp-prof-container .sheet-label, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-insp-prof-container + .sheet-insp-prof-container .sheet-label
- width: calc(100% - 42px)
- margin-left: -3px
- margin-top: 10px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc)
- .sheet-saving-throw-container, .sheet-skills-container
- position: relative
- -webkit-box-sizing: border-box
- box-sizing: border-box
- padding: 5px 5px 15px
- border: 10px solid black
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/saves.svg?sanitize=true")
- border-image-slice: 65 10
- border-image-width: auto
- border-image-repeat: round
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc)
- .sheet-saving-throw-container, .sheet-skills-container
- position: relative
- -webkit-box-sizing: border-box
- box-sizing: border-box
- padding: 5px 5px 15px
- border: 10px solid black
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/saves.svg?sanitize=true")
- border-image-slice: 65 10
- border-image-width: auto
- border-image-repeat: round
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc)
- .sheet-saving-throw-container .sheet-label, .sheet-skills-container .sheet-label
- position: absolute
- width: 100%
- bottom: -5px
- margin: 0 calc(-5px)
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc)
- .sheet-saving-throw-container .sheet-label, .sheet-skills-container .sheet-label
- position: absolute
- width: 100%
- bottom: -5px
- margin: 0 calc(-5px)
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-core .sheet-col2, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-core .sheet-col2
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/vitals.svg?sanitize=true")
- background-repeat: no-repeat
- background-position: top center
- background-size: contain
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc)
- .sheet-ac-init-speed-container, .sheet-hdice-dsaves-container
- width: 100% !important
- margin: 0
- padding: 10px 8px 0
- -webkit-box-sizing: border-box
- box-sizing: border-box
- display: -webkit-box
- display: -ms-flexbox
- display: flex
- -webkit-box-pack: justify
- -ms-flex-pack: justify
- justify-content: space-between
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc)
- .sheet-ac-init-speed-container, .sheet-hdice-dsaves-container
- width: 100% !important
- margin: 0
- padding: 10px 8px 0
- -webkit-box-sizing: border-box
- box-sizing: border-box
- display: -webkit-box
- display: -ms-flexbox
- display: flex
- -webkit-box-pack: justify
- -ms-flex-pack: justify
- justify-content: space-between
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-hdice-dsaves-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-hdice-dsaves-container
- padding: 0 8px 10px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-resources .sheet-hdice-dsaves-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-resources .sheet-hdice-dsaves-container
- padding: 0 0 10px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-ac, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-ac
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/AC.svg?sanitize=true")
- background-repeat: no-repeat
- background-position: center center
- background-size: contain
- min-height: 75px !important
- border: 0 !important
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-ac input, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-ac input
- margin-top: 10px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-ac .sheet-pc-ac, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container .sheet-ac .sheet-pc-ac
- width: 50% !important
- margin: 0 auto
- line-height: 8px !important
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container
- .sheet-init, .sheet-speed
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/vital-box.svg?sanitize=true")
- background-repeat: no-repeat
- background-position: center center
- background-size: contain
- border: 0 !important
- min-height: 75px !important
- position: relative
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container
- .sheet-init, .sheet-speed
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/vital-box.svg?sanitize=true")
- background-repeat: no-repeat
- background-position: center center
- background-size: contain
- border: 0 !important
- min-height: 75px !important
- position: relative
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc)
- .sheet-ac-init-speed-container
- .sheet-init button, .sheet-speed .sheet-label
- position: absolute
- bottom: 5px
-
- .sheet-hp .sheet-label
- position: absolute
- bottom: 5px
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc)
- .sheet-ac-init-speed-container
- .sheet-init button, .sheet-speed .sheet-label
- position: absolute
- bottom: 5px
-
- .sheet-hp .sheet-label
- position: absolute
- bottom: 5px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container
- .sheet-init span, .sheet-speed input
- display: inline-block
- margin-top: 15px
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-ac-init-speed-container
- .sheet-init span, .sheet-speed input
- display: inline-block
- margin-top: 15px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-hp, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-hp
- position: relative
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/vital-top.svg?sanitize=true")
- background-repeat: no-repeat
- background-position: center center
- background-size: contain
- border: 0 !important
- width: calc(100% - 16px)
- height: 95px
- margin: 5px 8px 0
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-hp .sheet-top, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-hp .sheet-top
- padding-top: 3px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-hp .sheet-top span, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-hp .sheet-top span
- margin-left: 10px !important
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-hp .sheet-top input, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-hp .sheet-top input
- width: 132px !important
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-hp + .sheet-hp, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-hp + .sheet-hp
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/vital-bottom.svg?sanitize=true")
- background-repeat: no-repeat
- background-position: center center
- background-size: contain
- min-height: 70px
- margin: 0 8px 5px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-subcontainer, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-subcontainer
- --topNotchSize:7px
- --bottomNotchSize:6px
- -webkit-box-sizing: border-box
- box-sizing: border-box
- margin-top: 5px
- width: 49%
- background: #fff
- border: 5px solid black
- border-top-width: 2px
- border-bottom-width: 2px
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/vital-box.svg?sanitize=true")
- border-image-slice: 15 15
- border-image-width: auto
- border-image-repeat: round
- -webkit-clip-path: polygon(0% var(--topNotchSize), var(--topNotchSize) 0%, calc(100% - var(--topNotchSize)) 0%, 100% var(--topNotchSize), 100% calc(100% - var(--bottomNotchSize)), calc(100% - var(--bottomNotchSize)) 100%, var(--bottomNotchSize) 100%, 0% calc(100% - var(--bottomNotchSize)))
- clip-path: polygon(0% var(--topNotchSize), var(--topNotchSize) 0%, calc(100% - var(--topNotchSize)) 0%, 100% var(--topNotchSize), 100% calc(100% - var(--bottomNotchSize)), calc(100% - var(--bottomNotchSize)) 100%, var(--bottomNotchSize) 100%, 0% calc(100% - var(--bottomNotchSize)))
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-subcontainer .sheet-row-container input[type="checkbox"], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-subcontainer .sheet-row-container input[type="checkbox"]
- margin: 0px -2px
- border-radius: 50%
- border: 2px solid #000 !important
- width: 1em
- height: 1em
- background-color: white
- vertical-align: middle
- -webkit-appearance: none
- outline: none
- cursor: pointer
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-subcontainer .sheet-row-container input[type="checkbox"]:checked, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-subcontainer .sheet-row-container input[type="checkbox"]:checked
- background-color: #00ba73
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-subcontainer .sheet-top input, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-subcontainer .sheet-top input
- width: 60px !important
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc)
- .sheet-attacks, .sheet-proficiencies, .sheet-traits, .sheet-equipment, .sheet-exhaustion
- -webkit-box-sizing: border-box
- box-sizing: border-box
- width: 100%
- margin-top: 10px
- border: 5px solid black
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/5eBorder.svg?sanitize=true")
- border-image-slice: 6% 8% 12% 8%
- border-image-width: 16px 19px 32px 19px
- border-image-repeat: round
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc)
- .sheet-attacks, .sheet-proficiencies, .sheet-traits, .sheet-equipment, .sheet-exhaustion
- -webkit-box-sizing: border-box
- box-sizing: border-box
- width: 100%
- margin-top: 10px
- border: 5px solid black
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/5eBorder.svg?sanitize=true")
- border-image-slice: 6% 8% 12% 8%
- border-image-width: 16px 19px 32px 19px
- border-image-repeat: round
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-display button *, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-display button *
- min-width: 15%
- max-width: 33%
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-col1 > .sheet-insp-prof-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-col1 > .sheet-insp-prof-container
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/perception.svg?sanitize=true")
- background-position: center center
- background-repeat: no-repeat
- background-size: contain
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-col1 > .sheet-insp-prof-container .sheet-value, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-col1 > .sheet-insp-prof-container .sheet-value
- margin-top: 3px
- margin-left: 5px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-col1 > .sheet-insp-prof-container .sheet-label, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-col1 > .sheet-insp-prof-container .sheet-label
- position: absolute
- width: calc(33% - 42px) !important
- margin-left: 0
- margin-top: 5px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-tool_proficiencies, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-tool_proficiencies
- -webkit-box-sizing: border-box
- box-sizing: border-box
- width: 100%
- margin-top: 5px
- border: 5px solid black
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/proficiency-block.svg?sanitize=true")
- border-image-slice: 5 10
- border-image-width: 15px
- border-image-repeat: round
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-proficiencies .sheet-display button *, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-proficiencies .sheet-display button *
- min-width: 33%
- max-width: 50%
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-pibf, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-pibf
- position: relative
- -webkit-box-sizing: border-box
- box-sizing: border-box
- width: 100%
- min-height: 6em
- margin-top: 5px
- border: 15px solid black
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/vital-top.svg?sanitize=true")
- border-image-slice: 35 15
- border-image-width: auto
- border-image-repeat: round
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-pibf + .sheet-pibf, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-pibf + .sheet-pibf
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/vital-mid.svg?sanitize=true")
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-pibf + .sheet-pibf + .sheet-pibf + .sheet-pibf, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-pibf + .sheet-pibf + .sheet-pibf + .sheet-pibf
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/vital-bottom.svg?sanitize=true")
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-pibf .sheet-display, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-pibf .sheet-display
- padding: 0
- position: relative
- top: -5px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-pibf .sheet-options-flag, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-pibf .sheet-options-flag
- top: -5px
- right: -10px
-
- ~ span
- top: -5px
- right: -10px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-pibf .sheet-label, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-pibf .sheet-label
- position: absolute
- top: unset !important
- right: unset !important
- bottom: -10px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-coin, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-coin
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/copper.svg?sanitize=true")
- background-position: center center
- background-repeat: no-repeat
- background-size: contain
- border: none
- border-radius: 0
- margin: 5px 0
- background-color: transparent
- position: relative
- left: -9px
- height: 30px
- width: 75px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-coin .sheet-label, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-coin .sheet-label
- position: relative
- margin: 0
- top: 5px
- left: 22px
- width: 15px
- height: 20px
- text-indent: -40px
- font-size: 6px
- line-height: 20px
- vertical-align: middle
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/copper.png")
- background-position: center center
- background-repeat: no-repeat
- background-size: contain
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-coin input, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-coin input
- position: relative
- top: 5px
- left: 17px
- width: 35px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/silver.svg?sanitize=true")
- margin-top: 0
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin .sheet-label, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin .sheet-label
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/silver.png")
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/electrum.svg?sanitize=true")
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin .sheet-label, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin .sheet-label
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/electrum.png")
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/gold.svg?sanitize=true")
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin .sheet-label, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin .sheet-label
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/gold.png")
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/platnum.svg?sanitize=true")
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin .sheet-label, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin + .sheet-coin .sheet-label
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/platnum.png")
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-equipment .sheet-weighttotal, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-equipment .sheet-weighttotal
- left: 4px
- top: 185px
- width: 68px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-bio .sheet-textbox, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-bio .sheet-textbox
- -webkit-box-sizing: border-box
- box-sizing: border-box
- width: 100%
- margin-top: 10px
- border: 5px solid black
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/5eBorder.svg?sanitize=true")
- border-image-slice: 32 25
- border-image-width: auto
- border-image-repeat: round
- text-align: center
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-bio .sheet-col1 .sheet-textbox + .sheet-textbox textarea, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-bio .sheet-col1 .sheet-textbox + .sheet-textbox textarea
- min-height: 640px !important
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-bio .sheet-textbox textarea, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-bio .sheet-textbox textarea
- margin: 0 auto
- text-align: left
- width: calc(100% - 20px)
- background: transparent
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-spell-level, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-spell-level
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/SpellLevel.svg?sanitize=true")
- background-repeat: no-repeat
- background-position: center center
- background-size: cover
- height: 50px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-col1 .sheet-spell-level:nth-child(1), input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-col1 .sheet-spell-level:nth-child(1)
- background-image: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/Cantrip.svg?sanitize=true")
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-spell-level
- .sheet-level
- border: 0
- background: transparent
- position: relative
- top: 11px
-
- &::before, &::after
- border: 0
- background: transparent
- position: relative
- top: 11px
-
- .sheet-total, .sheet-expended, .sheet-primes
- border: 0
- background: transparent
- position: relative
- top: 11px
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-spell-level
- .sheet-level
- border: 0
- background: transparent
- position: relative
- top: 11px
-
- &::before, &::after
- border: 0
- background: transparent
- position: relative
- top: 11px
-
- .sheet-total, .sheet-expended, .sheet-primes
- border: 0
- background: transparent
- position: relative
- top: 11px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) .sheet-spell-level .sheet-level span, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) .sheet-spell-level .sheet-level span
- left: 7px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-container:not(.sheet-npc) textarea[name="attr_global_save_rollstring"], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-container:not(.sheet-npc) textarea[name="attr_global_save_rollstring"]
- width: 100px !important
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-npc_toggle[value="1"] ~ .sheet-npc .sheet-npc_options-flag:checked ~ .sheet-npc_options, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-npc_toggle[value="1"] ~ .sheet-npc .sheet-npc_options-flag:checked ~ .sheet-npc_options
- display: block
- width: 100%
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-npc_toggle[value="1"] ~ .sheet-container, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-npc_toggle[value="1"] ~ .sheet-container
- width: unset
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-npc_toggle[value="1"] ~ .sheet-npc, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-npc_toggle[value="1"] ~ .sheet-npc
- -webkit-box-align: start
- -ms-flex-align: start
- align-items: flex-start
- -webkit-box-sizing: border-box
- box-sizing: border-box
- display: -webkit-inline-box
- display: -ms-inline-flexbox
- display: inline-flex
- -ms-flex-flow: wrap
- flex-flow: wrap
- margin-bottom: 2%
- min-width: 100%
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc .sheet-page.sheet-spells
- .sheet-spell-labels
- [data-i18n="slots_total-u"], [data-i18n="slots_remaining-u"]
- display: none
-
- .sheet-header
- display: none
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc .sheet-page.sheet-spells
- .sheet-spell-labels
- [data-i18n="slots_total-u"], [data-i18n="slots_remaining-u"]
- display: none
-
- .sheet-header
- display: none
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc
- top: unset
- width: 100%
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc .sheet-page.sheet-spells .sheet-body, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc .sheet-page.sheet-spells .sheet-body
- display: -webkit-inline-box
- display: -ms-inline-flexbox
- display: inline-flex
- -ms-flex-flow: wrap
- flex-flow: wrap
- margin-top: 0px
- max-width: 95%
- width: -webkit-fit-content
- width: -moz-fit-content
- width: fit-content
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc .sheet-page.sheet-spells .sheet-body .sheet-col, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-npc_toggle[value="1"] + .sheet-npcspellcastingflag[value="1"] ~ .sheet-pc .sheet-page.sheet-spells .sheet-body .sheet-col
- background: #fff
- -webkit-box-sizing: border-box
- box-sizing: border-box
- display: inline-block
- margin-right: 0.5em
- max-width: 32%
- min-width: 250px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-npc_toggle[value="1"] ~ .sheet-npc
- .sheet-actions, .sheet-stat-block
- background: #fff
- -webkit-box-sizing: border-box
- box-sizing: border-box
- margin-right: 2em
- max-width: 30%
- min-width: 385px
-
-input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-npc_toggle[value="1"] ~ .sheet-npc
- .sheet-actions, .sheet-stat-block
- background: #fff
- -webkit-box-sizing: border-box
- box-sizing: border-box
- margin-right: 2em
- max-width: 30%
- min-width: 385px
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-npc_toggle[value="1"] ~ .sheet-npc .sheet-actions button[type="roll"], input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-npc_toggle[value="1"] ~ .sheet-npc .sheet-actions button[type="roll"]
- white-space: normal
-
-div.sheet-licensecontainer.sheet-licensedsheet .sheet-npc_toggle[value="1"] ~ .sheet-npc .sheet-actions, input.sheet-licensedsheet[value="1"] + div.sheet-licensecontainer .sheet-npc_toggle[value="1"] ~ .sheet-npc .sheet-actions
- margin-top: 2em
-
/* CHARACTERMANCER
div.sheet-charmancer
div.sheet-licensedsheet-flag
display: none
- &.sheet-licensedsheet .sheet-logos
- display: -webkit-box
- display: -ms-flexbox
- display: flex
- width: 100%
- text-align: center
- -webkit-box-orient: vertical
- -webkit-box-direction: normal
- -ms-flex-flow: column
- flex-flow: column
- margin-bottom: 1em
-
.sheet-logos, .sheet-logos
display: -webkit-box
display: -ms-flexbox
@@ -5871,40 +7326,14 @@ div.sheet-charmancer
.sheet-charmancer-logo
margin: 0 auto
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/charactermancer-1.png")
+ background: url("https://files.d20.io/images/175804954/NpVwmiRV0kYn9jOSipyXyA/med.png?1604618290")
background-position: center
background-size: contain
background-repeat: no-repeat
- display: -webkit-box
- display: -ms-flexbox
display: flex
width: 70%
height: 5em
- .sheet-charmancer-logo, .sheet-charmancer-logo
- margin: 0 auto
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/charactermancer-1.png")
- background-position: center
- background-size: contain
- background-repeat: no-repeat
- display: -webkit-box
- display: -ms-flexbox
- display: flex
- width: 70%
- height: 5em
-
- &.sheet-licensedsheet .sheet-compendium-logo
- margin: 0 auto
- background: url("https://raw.githubusercontent.com/skydawn1/esper_genesis/master/EG_Logo.png")
- background-position: center
- background-size: contain
- background-repeat: no-repeat
- display: -webkit-box
- display: -ms-flexbox
- display: flex
- width: 50%
- height: 3em
-
.sheet-compendium-logo, .sheet-compendium-logo
margin: 0 auto
background: url("https://raw.githubusercontent.com/skydawn1/esper_genesis/master/EG_Logo.png")
@@ -5917,232 +7346,6 @@ div.sheet-charmancer
width: 50%
height: 3em
- &.sheet-licensedsheet .sheet-expansions
- display: -webkit-box
- display: -ms-flexbox
- display: flex
- width: 100%
- margin: 1em 0
- padding: 1em
- background: #eee
- border-radius: .5em
-
- div.sheet-licensedsheet-flag:not(:empty) ~
- * .sheet-expansions, .sheet-expansions
- display: -webkit-box
- display: -ms-flexbox
- display: flex
- width: 100%
- margin: 1em 0
- padding: 1em
- background: #eee
- border-radius: .5em
-
- &.sheet-licensedsheet .sheet-expansions p
- display: -webkit-box
- display: -ms-flexbox
- display: flex
- width: 100%
-
- div.sheet-licensedsheet-flag:not(:empty) ~
- * .sheet-expansions p, .sheet-expansions p
- display: -webkit-box
- display: -ms-flexbox
- display: flex
- width: 100%
-
- &.sheet-licensedsheet
- .sheet-meta-info-container, .sheet-summary-container
- -webkit-box-sizing: border-box
- box-sizing: border-box
- width: 100% !important
- padding: .5em
- border: 10px solid black !important
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-border.png") !important
- border-image-slice: 20 32 !important
- border-image-width: auto !important
- border-image-repeat: round !important
-
- div.sheet-licensedsheet-flag:not(:empty) ~
- *
- .sheet-meta-info-container, .sheet-summary-container
- -webkit-box-sizing: border-box
- box-sizing: border-box
- width: 100% !important
- padding: .5em
- border: 10px solid black !important
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-border.png") !important
- border-image-slice: 20 32 !important
- border-image-width: auto !important
- border-image-repeat: round !important
-
- .sheet-meta-info-container, .sheet-summary-container
- -webkit-box-sizing: border-box
- box-sizing: border-box
- width: 100% !important
- padding: .5em
- border: 10px solid black !important
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-border.png") !important
- border-image-slice: 20 32 !important
- border-image-width: auto !important
- border-image-repeat: round !important
-
- &.sheet-licensedsheet .sheet-info .sheet-compendium-page
- -webkit-box-sizing: border-box
- box-sizing: border-box
- border: 10px solid black
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-border.png")
- border-image-slice: 20 32
- border-image-width: auto
- border-image-repeat: round
-
- div.sheet-licensedsheet-flag:not(:empty) ~
- * .sheet-info .sheet-compendium-page, .sheet-info .sheet-compendium-page
- -webkit-box-sizing: border-box
- box-sizing: border-box
- border: 10px solid black
- border-image-source: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-border.png")
- border-image-slice: 20 32
- border-image-width: auto
- border-image-repeat: round
-
- &.sheet-licensedsheet .sheet-row
- border: 0 !important
-
- div.sheet-licensedsheet-flag:not(:empty) ~
- * .sheet-row, .sheet-row
- border: 0 !important
-
- &.sheet-licensedsheet
- .sheet-row + .sheet-row::before, .sheet-holder .sheet-row::before
- content: ""
- margin-bottom: 1em
- display: block
- border: none
- border-top: 3px solid transparent
- border-bottom: 3px solid transparent
- border-left: 300px solid #245485
-
- div.sheet-licensedsheet-flag:not(:empty) ~
- *
- .sheet-row + .sheet-row::before, .sheet-holder .sheet-row::before
- content: ""
- margin-bottom: 1em
- display: block
- border: none
- border-top: 3px solid transparent
- border-bottom: 3px solid transparent
- border-left: 300px solid #245485
-
- .sheet-row + .sheet-row::before, .sheet-holder .sheet-row::before
- content: ""
- margin-bottom: 1em
- display: block
- border: none
- border-top: 3px solid transparent
- border-bottom: 3px solid transparent
- border-left: 300px solid #245485
-
- &.sheet-licensedsheet .sheet-row .sheet-row::before
- border: 0
- margin: 0
-
- div.sheet-licensedsheet-flag:not(:empty) ~
- * .sheet-row .sheet-row::before, .sheet-row .sheet-row::before
- border: 0
- margin: 0
-
- &.sheet-licensedsheet .sheet-row div.sheet-row
- padding: 0.1em 1.5em 0.1em 0
- margin-left: 0
-
- div.sheet-licensedsheet-flag:not(:empty) ~
- * .sheet-row div.sheet-row, .sheet-row div.sheet-row
- padding: 0.1em 1.5em 0.1em 0
- margin-left: 0
-
- &.sheet-licensedsheet .sheet-topbar
- display: -webkit-box
- display: -ms-flexbox
- display: flex
- -webkit-box-orient: vertical
- -webkit-box-direction: normal
- -ms-flex-flow: column
- flex-flow: column
- -webkit-box-pack: justify
- -ms-flex-pack: justify
- justify-content: space-between
-
- div.sheet-licensedsheet-flag:not(:empty) ~
- * .sheet-topbar, .sheet-topbar
- display: -webkit-box
- display: -ms-flexbox
- display: flex
- -webkit-box-orient: vertical
- -webkit-box-direction: normal
- -ms-flex-flow: column
- flex-flow: column
- -webkit-box-pack: justify
- -ms-flex-pack: justify
- justify-content: space-between
-
- &.sheet-licensedsheet .sheet-topbar .sheet-topbar-container
- width: 100%
- border: 0
- display: -webkit-box
- display: -ms-flexbox
- display: flex
- -webkit-box-pack: justify
- -ms-flex-pack: justify
- justify-content: space-between
-
- div.sheet-licensedsheet-flag:not(:empty) ~
- * .sheet-topbar .sheet-topbar-container, .sheet-topbar .sheet-topbar-container
- width: 100%
- border: 0
- display: -webkit-box
- display: -ms-flexbox
- display: flex
- -webkit-box-pack: justify
- -ms-flex-pack: justify
- justify-content: space-between
-
- &.sheet-licensedsheet .sheet-attr-container
- -webkit-box-orient: vertical
- -webkit-box-direction: reverse
- -ms-flex-flow: column-reverse
- flex-flow: column-reverse
- min-width: 15%
- display: -webkit-inline-box !important
- display: -ms-inline-flexbox !important
- display: inline-flex !important
- -ms-flex-line-pack: space-evenly
- align-content: space-evenly
-
- div.sheet-licensedsheet-flag:not(:empty) ~
- * .sheet-attr-container, .sheet-attr-container
- -webkit-box-orient: vertical
- -webkit-box-direction: reverse
- -ms-flex-flow: column-reverse
- flex-flow: column-reverse
- min-width: 15%
- display: -webkit-inline-box !important
- display: -ms-inline-flexbox !important
- display: inline-flex !important
- -ms-flex-line-pack: space-evenly
- align-content: space-evenly
-
- &.sheet-licensedsheet .sheet-summary:nth-child(even)
- background: #eee
- margin: 0 -.8em .8em
- padding: .5em .8em
-
- div.sheet-licensedsheet-flag:not(:empty) ~
- * .sheet-summary:nth-child(even), .sheet-summary:nth-child(even)
- background: #eee
- margin: 0 -.8em .8em
- padding: .5em .8em
-
/* ROLL TEMPLATE
.sheet-rolltemplate-simple div[class|="sheet-licensedsheet-flag"], .sheet-rolltemplate-atk div[class|="sheet-licensedsheet-flag"], .sheet-rolltemplate-dmg div[class|="sheet-licensedsheet-flag"], .sheet-rolltemplate-atkdmg div[class|="sheet-licensedsheet-flag"], .sheet-rolltemplate-desc div[class|="sheet-licensedsheet-flag"], .sheet-rolltemplate-spell div[class|="sheet-licensedsheet-flag"], .sheet-rolltemplate-traits div[class|="sheet-licensedsheet-flag"], .sheet-rolltemplate-npc div[class|="sheet-licensedsheet-flag"], .sheet-rolltemplate-npcatk div[class|="sheet-licensedsheet-flag"], .sheet-rolltemplate-npcdmg div[class|="sheet-licensedsheet-flag"], .sheet-rolltemplate-npcaction div[class|="sheet-licensedsheet-flag"], .sheet-rolltemplate-mancerroll div[class|="sheet-licensedsheet-flag"], .sheet-rolltemplate-mancerhproll div[class|="sheet-licensedsheet-flag"]
@@ -6151,118 +7354,6 @@ div.sheet-charmancer
.sheet-rolltemplate-simple, .sheet-rolltemplate-atk, .sheet-rolltemplate-atkdmg, .sheet-rolltemplate-dmg, .sheet-rolltemplate-desc
image-rendering: -webkit-optimize-contrast
-.sheet-rolltemplate-simple div.sheet-licensedsheet-flag-1 ~ div.sheet-container
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-Rolltemplate-Simple.png") top left
-
-.sheet-rolltemplate-atk div.sheet-licensedsheet-flag-1 ~ div.sheet-container, .sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-container.sheet-atk
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-Rolltemplate-Attack.png") top left
- background-color: inherit
-
-.sheet-rolltemplate-dmg div.sheet-licensedsheet-flag-1 ~ div
- &.sheet-atk
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-Rolltemplate-Attack.png") top left
- background-color: inherit
-
- &.sheet-container
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-Rolltemplate-Damage.png") top left
- background-color: inherit
-
-.sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-container.sheet-damagetemplate
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-Rolltemplate-Damage.png") top left
- background-color: inherit
-
-.sheet-rolltemplate-atk div.sheet-licensedsheet-flag-1 ~ div.sheet-desc, .sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc, .sheet-rolltemplate-dmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc, .sheet-rolltemplate-desc div.sheet-licensedsheet-flag-1 ~ div.sheet-desc
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-Rolltemplate-Desc.png") top left
- background-color: inherit
- padding-bottom: 0.35em
- padding-top: 0.35em
-
-.sheet-rolltemplate-simple div.sheet-licensedsheet-flag-1 ~ div.sheet-container, .sheet-rolltemplate-atk div.sheet-licensedsheet-flag-1 ~ div.sheet-container, .sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-container.sheet-atk
- background-repeat: no-repeat
- background-size: 13.8em 100%
- border: none
- width: 100%
-
-.sheet-rolltemplate-dmg div.sheet-licensedsheet-flag-1 ~ div
- &.sheet-atk, &.sheet-container
- background-repeat: no-repeat
- background-size: 13.8em 100%
- border: none
- width: 100%
-
-.sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-container.sheet-damagetemplate, .sheet-rolltemplate-atk div.sheet-licensedsheet-flag-1 ~ div.sheet-desc, .sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc, .sheet-rolltemplate-dmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc, .sheet-rolltemplate-desc div.sheet-licensedsheet-flag-1 ~ div.sheet-desc
- background-repeat: no-repeat
- background-size: 13.8em 100%
- border: none
- width: 100%
-
-.sheet-rolltemplate-atk div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info, .sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info, .sheet-rolltemplate-dmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info, .sheet-rolltemplate-desc div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info
- background: none
- width: 100%
-
-.sheet-rolltemplate-atk div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info > span, .sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info > span, .sheet-rolltemplate-dmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info > span, .sheet-rolltemplate-desc div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info > span
- padding: 0px
-
-.sheet-rolltemplate-atk div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-bottom, .sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-bottom, .sheet-rolltemplate-dmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-bottom, .sheet-rolltemplate-desc div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-bottom
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-Rolltemplate-Info-Bottom.png") top left
- height: 1.1em
- background-size: 100% 100%
- margin-bottom: -0.3em
-
-.sheet-rolltemplate-atk div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-top, .sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-top, .sheet-rolltemplate-dmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-top, .sheet-rolltemplate-desc div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-top
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-Rolltemplate-Info-Top.png") top left
- height: 1.1em
- background-size: 100% 100%
- margin-top: -0.3em
-
-.sheet-rolltemplate-atk div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-middle, .sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-middle, .sheet-rolltemplate-dmg div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-middle, .sheet-rolltemplate-desc div.sheet-licensedsheet-flag-1 ~ div.sheet-desc.sheet-info .sheet-middle
- background: url("https://raw.githubusercontent.com/mperes/Images-for-Roll20-5E-images/master/licensedsheet/DnD-Rolltemplate-Info-Middle.png") top left
- background-size: 100% 100%
-
-.sheet-rolltemplate-npc div.sheet-licensedsheet-flag-1 ~ div.sheet-arrow-right, .sheet-rolltemplate-npcaction div.sheet-licensedsheet-flag-1 ~ div.sheet-arrow-right, .sheet-rolltemplate-npcatk div.sheet-licensedsheet-flag-1 ~ div.sheet-arrow-right, .sheet-rolltemplate-npcdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-arrow-right
- border: none
- border-top: 0.25em solid transparent
- border-bottom: 0.25em solid transparent
- border-left: 14em solid #245485
-
-.sheet-rolltemplate-atk div.sheet-licensedsheet-flag-1 ~ div.sheet-advspacer, .sheet-rolltemplate-dmg div.sheet-licensedsheet-flag-1 ~ div.sheet-advspacer, .sheet-rolltemplate-atkdmg div.sheet-licensedsheet-flag-1 ~ div.sheet-advspacer
- margin-top: 1px
-
-/* DIALOGUE PROMPT
-.charsheet input.sheet-licensedsheet[value="1"] ~
- .sheet-monster_confirm span:not(.sheet-yes), .sheet-mancer_confirm span:not(.sheet-yes)
- font-size: 1.68em
- font-weight: bold
-
- .sheet-compendium_warning, .sheet-monster_confirm, .sheet-mancer_confirm
- position: absolute !important
- padding: 2em 0 !important
- min-height: -webkit-max-content
- min-height: -moz-max-content
- min-height: max-content
- -webkit-box-shadow: 0 0 50px #000
- box-shadow: 0 0 50px #000
- border: 2px solid #000 !important
- border-radius: .5em
-
- .sheet-monster_confirm span:not(.sheet-yes), .sheet-mancer_confirm span:not(.sheet-yes)
- font-weight: bold
- font-size: 18px
-
- .sheet-monster_confirm .sheet-yes, .sheet-mancer_confirm .sheet-yes
- color: #000
- background-color: #eee
-
- .sheet-monster_confirm .sheet-yes:hover, .sheet-mancer_confirm .sheet-yes:hover
- + .sheet-yes
- color: #fff
- background-color: #00ba73
- cursor: pointer
-
- color: #fff
- background-color: #00ba73
- cursor: pointer
-
/* Licensed Styling Start */
.charsheet .sheet-pc
@@ -6311,6 +7402,207 @@ div.sheet-charmancer
&:before
top: -5px
+ // Abilities Bar — horizontal row above body (all three main tabs)
+ .sheet-pc-default .sheet-abilities-bar
+ display: flex
+ width: 860px
+ border: 1.5px solid #ab8b57
+ border-radius: 5px
+ background: transparent
+ margin-top: 6px
+ margin-bottom: 0
+ position: relative
+ padding: 26px 0 4px
+
+ // Hide the duplicate final-score span next to the score input
+ .sheet-abilities-bar .sheet-finalattr
+ display: none
+
+ .sheet-pc-default .sheet-abilities-bar .sheet-ability-col
+ flex: 1
+ display: flex
+ flex-direction: column
+ align-items: center
+ padding: 6px 4px 4px
+ position: relative
+ &:not(:last-of-type)::after
+ content: ''
+ position: absolute
+ right: 0
+ top: 6px
+ bottom: 4px
+ width: 1px
+ background: #3a2e14
+
+ .sheet-pc-default .sheet-abilities-bar .sheet-ability-header
+ display: flex
+ align-items: center
+ gap: 5px
+ margin-bottom: 5px
+ button[type=roll]
+ color: #245485
+ font-weight: bold
+ font-size: 14px
+ line-height: 1
+ background: transparent
+ border: none
+ padding: 0
+ text-shadow: none
+ box-shadow: none
+ background-image: none
+ min-width: 28px
+ text-align: center
+ &:before
+ content: '' !important
+ .sheet-baseattr
+ width: 30px
+ text-align: center
+ border: 1px solid #ab8b57
+ border-radius: 3px
+ font-size: 13px
+ font-weight: bold
+ color: #000 !important
+ background: #f0f0f0 !important
+ box-shadow: none !important
+ -webkit-appearance: none
+ padding: 1px 2px
+ margin-top: 0
+
+ .sheet-pc-default .sheet-abilities-bar .sheet-ability-modifiers
+ display: flex
+ gap: 3px
+ width: 100%
+ justify-content: center
+
+ // Mod/Save outer blocks — flex column containers only, no background
+ .sheet-pc-default .sheet-abilities-bar .sheet-ability-mod-block,
+ .sheet-pc-default .sheet-abilities-bar .sheet-ability-save-block
+ display: flex
+ flex-direction: column
+ align-items: center
+ gap: 4px
+ min-width: 46px
+ text-align: center
+
+ // Inner framed value box — light gray with gold border, centered content
+ .sheet-pc-default .sheet-abilities-bar .sheet-ability-val-box
+ display: flex
+ flex-direction: column
+ align-items: center
+ justify-content: center
+ background: #f0f0f0
+ border: 1px solid #ab8b57
+ border-radius: 4px
+ padding: 4px 5px
+ width: 46px
+ min-height: 46px
+ box-sizing: border-box
+
+ // Value spans inside val-box
+ .sheet-pc-default .sheet-abilities-bar .sheet-ability-val-box
+ .sheet-attr,
+ .sheet-save-val
+ font-size: 20px
+ line-height: 24px
+ color: #000
+ font-weight: bold
+ display: block
+ margin-top: 0 !important
+
+ // Roll buttons inside val-box — transparent, no chrome
+ .sheet-pc-default .sheet-abilities-bar .sheet-ability-val-box
+ button[type=roll]
+ background: transparent
+ border: none
+ text-shadow: none
+ box-shadow: none
+ background-image: none
+ padding: 0
+ display: block
+ cursor: pointer
+ color: #000
+ font-size: 20px
+ line-height: 24px
+ font-weight: bold
+ &:before
+ content: '' !important
+
+ // + prefix for positive modifiers
+ .sheet-abilities-bar .sheet-ability-mod-block
+ input[type=hidden]:not([value^="-"]):not([value="0"]) + button .sheet-attr
+ &:before
+ content: '+'
+
+ // + prefix for positive save values
+ .sheet-abilities-bar .sheet-ability-save-block
+ input[type=hidden]:not([value^="-"]):not([value="0"]) + button .sheet-save-val
+ &:before
+ content: '+'
+
+ // Saving throw proficiency — styled as circular pip (blue when checked)
+ .sheet-pc-default .sheet-abilities-bar .sheet-ability-save-block > input[type=checkbox]
+ -webkit-appearance: none
+ -moz-appearance: none
+ appearance: none
+ display: block !important
+ width: 12px !important
+ height: 12px !important
+ border-radius: 50% !important
+ border: 1.5px dashed #066dce !important
+ background: transparent !important
+ cursor: pointer !important
+ margin: -10px auto 0 !important
+ padding: 0 !important
+ box-shadow: none !important
+ flex-shrink: 0
+ &:checked
+ background: #066dce !important
+ border-color: #066dce !important
+ border-style: solid !important
+
+ // Label below the val-box
+ .sheet-pc-default .sheet-abilities-bar .sheet-ab-label
+ font-size: 8px
+ color: #888
+ text-transform: uppercase
+ font-weight: bold
+ display: block
+ text-align: center
+ line-height: 1.2
+ margin-top: 0 !important
+
+ // Push the Mod label down to align with Save label (which sits below the checkbox)
+ .sheet-pc-default .sheet-abilities-bar .sheet-ability-mod-block .sheet-ab-label
+ margin-top: 6px !important
+
+ // Section label — Oxanium blue small-caps header at top-left of bar
+ .sheet-pc-default .sheet-abilities-bar .sheet-ab-section-label
+ position: absolute
+ top: 2px
+ left: 8px
+ background: transparent
+ padding: 8px
+ line-height: 1
+ span
+ font-family: 'Oxanium', sans-serif
+ font-size: 16px
+ font-weight: bold
+ color: #245485
+ font-variant: small-caps
+ text-transform: none
+ letter-spacing: normal
+ margin-top: 0 !important
+
+ // Reduce body top margin since abilities bar provides spacing
+ .sheet-page.sheet-core .sheet-body,
+ .sheet-page.sheet-bio .sheet-body,
+ .sheet-page.sheet-spells .sheet-body
+ margin-top: 6px
+
+ // Hide abilities bar when Starship sheet type is active
+ .sheet-pc-default:has(input[value="starship"]:checked) .sheet-abilities-bar
+ display: none !important
+
.sheet-skills-list
overflow: hidden
padding-top: 0
@@ -6325,21 +7617,116 @@ div.sheet-charmancer
border-bottom: 1px solid white
border-top-color: 1px solid white
+ // Orphaned OGL column-header row — replaced by inline per-bar labels
+ .sheet-spell-labels
+ display: none !important
+
+ // Hide slot counters for TP-only (Melder/Adept) and Talent Slot (Cybermancer) classes
+ .sheet-page.sheet-spells
+ .sheet-uses-power-slots-flag:not([value="1"]) ~ .sheet-body .sheet-spell-level .sheet-total,
+ .sheet-uses-power-slots-flag:not([value="1"]) ~ .sheet-body .sheet-spell-level .sheet-expended
+ display: none !important
+
.sheet-spell-level
background: #e2c285
border: 1px solid #68593d
border-radius: 5px
position: relative
padding: 7px
+ display: flex
+ flex-wrap: nowrap
+ align-items: center
+ gap: 8px
> *:not(.sheet-rank):not(.sheet-tp)
display: none
+ // Slot Total counter (auto-calculated)
+ .sheet-total
+ display: flex !important
+ flex-direction: column
+ align-items: center
+ justify-content: center
+ order: 2
+ flex: 0 0 auto
+ width: auto
+ height: auto
+ border: none
+ background: transparent
+ margin-left: 0
+ border-radius: 0
+ span
+ font-size: 16px
+ font-weight: bold
+ color: #245485
+ position: static
+ top: 0
+ display: block
+ text-align: center
+ width: auto
+ min-width: 16px
+ line-height: 1
+ margin-top: 0
+ &::after
+ content: 'TOTAL'
+ font-family: Oxanium, sans-serif
+ font-size: 8px
+ font-weight: bold
+ color: rgba(0,0,0,0.45)
+ text-transform: uppercase
+ letter-spacing: 0.3px
+ display: block
+ text-align: center
+ margin-top: 2px
+
+ // Slot Remaining counter (player-editable)
+ .sheet-expended
+ display: flex !important
+ flex-direction: column
+ align-items: center
+ justify-content: center
+ order: 3
+ flex: 0 0 auto
+ width: auto
+ height: auto
+ border: none
+ background: transparent
+ margin-left: 0
+ border-radius: 0
+ input[type=number]
+ font-size: 14px
+ font-weight: bold
+ color: #245485
+ width: 36px
+ height: 22px
+ text-align: center
+ background: rgba(255,255,255,0.6)
+ border: 1px solid rgba(103,89,61,0.6) !important
+ border-radius: 3px
+ padding: 0
+ margin: 0
+ box-shadow: none !important
+ -webkit-appearance: none
+ -moz-appearance: textfield
+ &::after
+ content: 'REMAINING'
+ font-family: Oxanium, sans-serif
+ font-size: 8px
+ font-weight: bold
+ color: rgba(0,0,0,0.45)
+ text-transform: uppercase
+ letter-spacing: 0.3px
+ display: block
+ text-align: center
+ margin-top: 2px
+
.sheet-rank
- display: block
+ display: inline-block
font-size: 12px
margin: 0
- width: 100%
+ flex: 1 1 auto
+ width: auto
+ order: 1
span
display: inline
font-size: 12px
@@ -6349,18 +7736,17 @@ div.sheet-charmancer
width: auto
&:last-child
margin-left: 5px
-
+
.sheet-tp
border: 0
color: #394876
font-size: 12px
font-weight: bold
margin: 0
- position: absolute
- right: 7px
+ flex: 0 0 auto
text-transform: uppercase
- top: 7px
width: auto
+ order: 4
&:before
content: 'tp:'
@@ -6370,14 +7756,6 @@ div.sheet-charmancer
/* PC Ship */
.sheet-pc-ship
- .sheet-tab-button
- top: 0px
- &+span
- font-size: 13px
- font-weight: bold
- line-height: 1.42857143
- top: 0px
-
input
width: 100%
@@ -6407,23 +7785,46 @@ div.sheet-charmancer
border: 1px solid black
border-radius: 0
- .sheet-top
- margin-bottom: 40px
- padding-top: 30px
+ .sheet-ship-logo-footer
+ text-align: right
+ padding: 12px 10px 8px 0
+ .sheet-ship-logo-img
+ width: 266px
+ opacity: 0.85
- .sheet-logo
- h2
- line-height: normal
- text-align: left
- span
- font-size: 32px
- -webkit-text-stroke: 1px #e2c285
- text-stroke: 1px #e2c285
- div
- flex-grow: 1
- text-align: right
- img
- width: 355px
+ .sheet-ship-top-layout
+ display: flex
+ flex-direction: row
+ align-items: stretch
+ gap: 12px
+
+ .sheet-token-frame
+ width: 90px
+ flex-shrink: 0
+ border: 3px solid #ab8b57
+ border-radius: 8px
+ overflow: hidden
+ background: #fff
+ display: flex
+ align-items: center
+ justify-content: center
+
+ .sheet-char-avatar
+ width: 100%
+ height: 100%
+ object-fit: contain
+ display: block
+
+ .sheet-ship-info
+ flex: 1
+ display: flex
+ flex-direction: column
+ justify-content: center
+ gap: 4px
+
+ .sheet-top
+ margin-bottom: 20px
+ padding-top: 10px
.sheet-flex-container
align-items: flex-end
@@ -6435,14 +7836,67 @@ div.sheet-charmancer
font-size: 13px
line-height: normal
white-space: nowrap
-
- input
+
+ input[type=text]
+ -webkit-appearance: none
+ appearance: none
+ background: transparent
border: none
- border-bottom: 1px solid black
+ border-bottom: 1px solid #D3D3D3
border-radius: 0
&:not(:last-child)
margin-right: 5px
-
+
+ input.sheet-ship-compact
+ max-width: 90px
+
+ .sheet-crew-roles
+ border: 1px solid #e2c285
+ border-radius: 6px
+ margin-bottom: 20px
+ padding: 12px
+
+ .sheet-flex-container
+ gap: 10px
+
+ .sheet-crew-field
+ display: flex
+ flex-direction: column
+ flex: 1
+ min-width: 0
+ width: auto
+
+ input[type=text]
+ background: transparent
+ border: none
+ border-bottom: 1px solid #D3D3D3
+ border-radius: 0
+ width: 100%
+
+ span
+ color: #000
+ font-size: 10px
+ font-weight: bold
+ letter-spacing: 1px
+ margin-top: 4px
+ text-transform: uppercase
+
+ .sheet-piloting-maneuver-check
+ h3
+ button
+ span
+ margin-left: 4px
+ background: none
+ border: none
+ color: inherit
+ cursor: pointer
+ font-family: inherit
+ font-size: inherit
+ font-weight: inherit
+ padding: 0
+ text-decoration: underline
+ text-decoration-style: dotted
+
.sheet-middle
grid-column-gap: 40px
grid-template-areas: "left left left left left left center center center center center right right right right right right"
@@ -6506,11 +7960,13 @@ div.sheet-charmancer
input
border-radius: 24px
+ font-size: 18px
+ font-weight: bold
height: 48px
outline: none
text-align: center
width: 48px
-
+
.sheet-sensors-and-initiative
grid-template-columns: repeat(2, 1fr)
grid-gap: 20px
@@ -6526,18 +7982,23 @@ div.sheet-charmancer
label
grid-template-columns: 48px 1fr
grid-gap: 10px
-
+
input
+ background: white
+ border: 2px solid black
border-radius: 24px
+ font-size: 20px
+ font-weight: bold
height: 48px
outline: none
text-align: center
width: 48px
-
+
span
align-items: center
display: flex
font-size: 11px
+ font-weight: normal
.sheet-col-center
@@ -6547,6 +8008,7 @@ div.sheet-charmancer
.sheet-piloting-maneuver-check
h3
+ margin-bottom: 10px
span
text-align: center
@@ -6567,7 +8029,11 @@ div.sheet-charmancer
background: #f4fafd
margin-top: 20px
padding: 10px
-
+
+ h3
+ margin-bottom: 8px
+ text-align: center
+
> label
text-align: center
@@ -6644,8 +8110,17 @@ div.sheet-charmancer
font-size: 11px
+
+ .sheet-bottom
+ .sheet-features-cargo-row
+ grid-template-columns: 1fr 1fr
+ margin-top: 20px
+ padding-bottom: 20px
+
.sheet-special-features
- margin-top: 20px
+ h3
+ border-bottom: 1px solid black
+
.repcontainer
.repitem
position: relative
@@ -6672,7 +8147,6 @@ div.sheet-charmancer
opacity: 0
.sheet-ship-cargo
- margin-top: 20px
.repcontainer
border: 1px solid black
@@ -6682,7 +8156,7 @@ div.sheet-charmancer
.sheet-grid-container
grid-template-columns: 1fr 85px
-
+
input
border: none
border-radius: 0
@@ -6690,14 +8164,6 @@ div.sheet-charmancer
outline: none
width: 100%
- div:first-child
- input
- border-right: 1px solid black
-
- div:last-child
- input
- text-align: right
-
.sheet-bottom
margin-top: 40px
.sheet-grid-container
@@ -6715,7 +8181,7 @@ div.sheet-charmancer
text-align: center
> .sheet-grid-container
- grid-template-columns: 115px 1fr
+ grid-template-columns: 98px 1fr
grid-gap: 10px
> div:first-child
@@ -6726,7 +8192,19 @@ div.sheet-charmancer
grid-template-rows: repeat(4, 1fr)
grid-template-columns: 30px 1fr
grid-gap: 5px
-
+
+ input
+ text-align: center
+
+ .sheet-static-num
+ display: block
+ width: 100%
+ text-align: center
+ border: 1px solid #ccc
+ background: #fff
+ font-size: 14px
+ line-height: 22px
+
label
align-items: center
display: flex
@@ -6792,101 +8270,150 @@ div.sheet-charmancer
width: 100%
.sheet-weapon-systems
- .sheet-table-header
- grid-template-columns: 45px 1fr 60px 30px 50px 70px
- grid-gap: 2px
- max-width: calc(50% - 30px)
- span
- font-size: 11px
-
.repcontainer
column-gap: 20px
display: grid
- grid-template-columns: repeat(2, 1fr)
+ grid-template-columns: 1fr
.repitem
border-top: 2px solid #e2c285
- margin-right: 20px
- button[type='roll']
- position: absolute
- top: 4px
- right: -20px
- background: none
- border: none
- color: black
- box-shadow: none
- margin: 0
- padding: 0
- font-weight: bold
- &:hover
- color: #00ba73
+ .sheet-weapon-action
+ position: relative
+ padding-right: 22px
- .sheet-table-body
- grid-template-columns: 45px 1fr 60px 30px 50px 70px
- grid-gap: 2px
+ .sheet-weapon-flag
+ cursor: pointer
+ height: 18px
+ margin: 0
+ opacity: 0
+ position: absolute
+ right: 2px
+ top: 4px
+ width: 18px
+ z-index: 2
- input[type="text"]
- border: 1px solid black
- border-radius: 0
- outline: none
-
- .sheet-table-meta
- grid-template-columns: 1fr 92px 122px
- grid-gap: 2px
+ .sheet-weapon-flag + span
+ align-items: center
+ color: #A0A0A0
+ cursor: pointer
+ display: none
+ font-family: pictos
+ font-size: 18px
+ height: 18px
+ justify-content: center
+ position: absolute
+ right: 2px
+ top: 4px
+ width: 18px
- input[type="text"]
- border: none
- border-radius: 0
- outline: none
-
- label
- align-items: center
- display: flex
- > *:not(:last-child)
- margin-right: 5px
+ .sheet-weapon-flag:checked + span
+ color: #000
+ display: flex
- span
- font-size: 11px
-
- .sheet-recharge input
- appearance: none
- border: 1px solid black
- height: 16px
- outline: none
- width: 16px
+ .sheet-weapon-action:hover .sheet-weapon-flag + span
+ display: flex
- &:nth-child(2)
- order: 4
- &:checked + input,
- &:checked + input + input
- background: black
+ .sheet-weapon-flag:checked ~ .sheet-weapon-options
+ display: block
- &:nth-child(3)
- order: 3
- &:checked + input
- background: black
+ .sheet-weapon-flag:not(:checked) ~ .sheet-weapon-options
+ display: none
- &:nth-child(4)
- order: 2
- margin-right: 5px
+ .sheet-weapon-flag:checked ~ .sheet-weapon-display
+ display: none
- &:checked
- background: black
+ .sheet-weapon-flag:not(:checked) ~ .sheet-weapon-display
+ display: block
- > div:last-child
- margin-top: -23px
- padding: 0 40px
- pointer-events: none
- text-align: center
- span
- background: #f4fafd
- border: 1px solid black
- display: inline-block
+ .sheet-weapon-options
+ padding: 4px 0
+
+ .sheet-weapon-row
+ align-items: center
+ display: flex
+ gap: 6px
+ margin-bottom: 4px
+
+ > span
font-size: 11px
- line-height: normal
- margin: 0 auto
- padding: 2px
+ font-weight: bold
+ white-space: nowrap
+
+ > span:first-child
+ min-width: 60px
+
+ input[type=text]
+ border: none
+ border-bottom: 1px solid black
+ flex: 1
+ font-size: 12px
+ min-width: 0
+ padding: 1px 2px
+
+ input[type=checkbox]
+ appearance: none
+ border: 1px solid black
+ flex: none
+ height: 14px
+ outline: none
+ width: 14px
+
+ &:checked
+ background: black
+
+ .sheet-weapon-display
+ button[type=roll]
+ align-items: center
+ background: none
+ border: none
+ box-shadow: none
+ color: inherit
+ cursor: pointer
+ display: flex
+ flex-wrap: wrap
+ column-gap: 6px
+ row-gap: 0
+ padding: 4px 0
+ text-align: left
+ width: 100%
+ &:hover
+ color: #066dce
+
+ img
+ height: 16px
+ width: 16px
+ flex: 0 0 auto
+
+ &:hover
+ color: #00ba73
+
+ .sheet-weapon-name
+ flex: 0 0 auto
+ font-size: 13px
+ font-weight: bold
+
+ .sheet-weapon-meta
+ color: #555
+ flex: 0 0 100%
+ font-size: 11px
+ font-style: italic
+ padding-left: 22px
+ &:checked
+ background: black
+
+ .sheet-weapon-systems-info
+ margin-top: 2px
+ pointer-events: none
+ text-align: center
+ span
+ background: #f4fafd
+ border: 1px solid black
+ display: inline-block
+ font-size: 11px
+ line-height: normal
+ margin: 0 auto
+ padding: 2px
.sheet-hull-points
h3
@@ -6898,7 +8425,7 @@ div.sheet-charmancer
text-align: center
img
- min-width: 170px
+ min-width: 153px
.sheet-resistances
margin-top: 20px
@@ -6955,12 +8482,14 @@ div.sheet-charmancer
line-height: 11px
span
font-size: 11px
+ input
+ text-align: center
.sheet-grid-container
align-items: end
grid-template-columns: repeat(3, 1fr)
- grid-gap: 20px
-
+ grid-gap: 20px
+
span[data-i18n="patch-repair-info"]
display: block
font-size: 9px
@@ -7009,25 +8538,36 @@ div.sheet-charmancer
font-size: 11px
.sheet-grid-container
- grid-template-columns: 110px 1fr
+ align-items: stretch
+ grid-template-columns: 94px 1fr
grid-gap: 10px
+
> div
.sheet-fancy-input
img
input
-
+ font-size: 26px
+
> label
background: white
border: 1px solid black
+ display: flex
+ flex-direction: column
input
border: 0
- min-height: calc(100% - 18px)
+ flex: 1
span
display: inline-block
font-size: 11px
text-align: center
width: 100%
+ > span
+ display: block
+ font-size: 11px
+ margin-top: 6px
+ text-align: center
+
.sheet-max-weapon-payload
align-items: center
grid-template-columns: 1fr 34px!important
@@ -7044,14 +8584,167 @@ div.sheet-charmancer
text-align: center
width: 34px
+.sheet-pc-logo-footer
+ text-align: right
+ padding: 12px 10px 8px 0
+ .sheet-pc-logo-img
+ width: 266px
+ opacity: 0.85
+
.sheet-pc
.sheet-pc-ship
display: none
-
+
.sheet-pc-default
- .sheet-tab-button.sheet-type-pc + span
- color: #FFFFFF
- background-color: #00ba73
+
+// ---- Feature: Hero Points ----
+.sheet-hero-points
+ display: flex
+ flex-wrap: wrap
+ align-items: stretch
+ width: 100%
+ margin-top: 8px
+ border: 1px solid rgba(171,139,87,0.5)
+ border-radius: 6px
+ overflow: hidden
+ &::before
+ content: 'HERO POINTS'
+ flex: 0 0 100%
+ display: block
+ font-family: 'Oxanium', sans-serif
+ font-size: 9px
+ font-weight: bold
+ color: #245485
+ text-align: center
+ text-transform: uppercase
+ letter-spacing: 0.5px
+ border-bottom: 1px solid rgba(171,139,87,0.5)
+ padding: 3px 0
+ .sheet-value
+ flex: 0 0 48px
+ display: flex
+ align-items: center
+ justify-content: center
+ padding: 4px
+ border-right: 1px solid rgba(171,139,87,0.4)
+ input
+ font-size: 22px
+ font-weight: bold
+ color: #245485
+ border: none
+ background: transparent
+ width: 40px
+ height: auto
+ text-align: center
+ padding: 0
+ box-shadow: none
+ .sheet-label
+ flex: 1
+ position: relative
+ display: flex
+ button
+ flex: 1
+ background: transparent
+ background-image: none
+ border: none
+ box-shadow: none
+ text-shadow: none
+ padding: 4px 6px
+ min-height: 38px
+ display: flex
+ flex-direction: column
+ align-items: center
+ justify-content: center
+ cursor: pointer
+ border-radius: 0
+ margin: 0 !important
+ transition: background 0.2s
+ &::before
+ content: none
+ > span:first-child
+ font-family: 'Oxanium', sans-serif
+ font-size: 13px
+ font-weight: bold
+ color: #245485
+ display: flex
+ align-items: center
+ justify-content: center
+ line-height: 1
+ > span[data-i18n]
+ display: none
+ > span:last-of-type
+ display: none
+ font-family: 'Oxanium', sans-serif
+ font-size: 8px
+ font-weight: bold
+ color: #c0392b
+ text-transform: uppercase
+ letter-spacing: 0.5px
+ margin-top: 3px
+ input
+ position: absolute
+ top: 0
+ left: 0
+ opacity: 0
+ pointer-events: all
+ width: 100% !important
+ height: 100% !important
+ input[name="attr_hero_points"][value="0"] ~ .sheet-label button
+ pointer-events: none !important
+ > span:first-child
+ opacity: 0.35
+ > span:last-of-type
+ display: block
+
+.charsheet .sheet-hero-points .sheet-label button:hover
+ background: rgba(171,139,87,0.12) !important
+ > span:first-child
+ color: #066dce !important
+
+input[name="attr_use_hero_points"]:not([value="1"]) + .sheet-hero-points
+ display: none
+
+// ---- Feature: Short/Long Rest Buttons ----
+.sheet-resources .sheet-rest
+ display: grid
+ grid-template-columns: 1fr 1fr
+ gap: 10px
+ margin: 10px 0 -5px 0
+ button
+ width: 100%
+ margin: 0
+ box-sizing: border-box
+ background: #e8e8e8
+ border: 1px solid #ab8b57
+ border-radius: 6px
+ padding: 8px 12px
+ min-height: 34px
+ cursor: pointer
+ transition: background 0.2s, color 0.2s, border-color 0.2s
+ &:hover
+ background: #ab8b57 !important
+ border-color: #ab8b57 !important
+ span
+ color: #fff !important
+ span
+ font-family: 'Oxanium', sans-serif !important
+ font-size: 12px !important
+ font-weight: bold !important
+ color: #ab8b57 !important
+ font-variant: small-caps !important
+ letter-spacing: 1px !important
+
+input[name="attr_use_rest_buttons"]:not([value="1"]) + .sheet-resources .sheet-rest
+ display: none !important
+input[name="attr_show_tp_resource"]:not([value="1"]) + .sheet-hdice-dsaves-container .sheet-tp-resource-slot
+ display: none !important
+// Flex row: TP left / Other Resource right when both visible.
+// When TP is hidden, Other Resource sits on the left with no gap.
+// Flex also ignores float:right on Other Resource and prevents height collapse.
+input[name="attr_show_tp_resource"] + .sheet-hdice-dsaves-container
+ display: flex !important
+ justify-content: space-between
+ align-items: flex-start
.sheet-pc-type[value="starship"] ~ .sheet-pc
width: 100%
@@ -7061,12 +8754,136 @@ div.sheet-charmancer
.sheet-pc-ship
display: block
- .sheet-tab-button.sheet-type-pc + span
- background-color: #E8E8E8
- color: black
- .sheet-tab-button.sheet-type-starship + span
- color: #FFFFFF
- background-color: #00ba73
+
-
\ No newline at end of file
+
+/* ---- Skills Section Redesign ---- */
+
+.charsheet .sheet-pc .sheet-page.sheet-core
+
+ .sheet-skills-container
+ display: flex
+ flex-direction: column
+ padding-top: 0
+ overflow: hidden
+
+ > .sheet-label
+ order: -1
+ padding: 6px 8px 4px
+ border-bottom: 1px solid #ab8b57
+
+ span
+ font-family: 'Oxanium', sans-serif
+ font-size: 11px
+ font-weight: bold
+ color: #245485
+ text-transform: uppercase
+ letter-spacing: 0.05em
+ text-align: left
+ display: inline-block
+ width: auto
+ margin: 0
+
+ .sheet-skills-list .sheet-skill
+ display: flex
+ align-items: center
+ height: auto !important
+ min-height: 26px
+ padding: 2px 6px
+ gap: 5px
+ box-sizing: border-box
+ width: 100%
+
+ &:nth-child(odd)
+ background: transparent
+ border-bottom: 1px solid rgba(171, 139, 87, 0.2)
+ border-top: none
+
+ &:nth-child(even)
+ background: rgba(0, 0, 0, 0.03)
+ border-bottom: 1px solid rgba(171, 139, 87, 0.2)
+ border-top: none
+
+ button[type=roll]
+ order: 1
+ flex: 1
+ display: flex
+ align-items: center
+ gap: 5px
+ font-size: 12px
+ font-weight: bold
+ text-align: left
+ background: transparent !important
+ background-image: none !important
+ border: none
+ box-shadow: none
+ text-shadow: none
+ padding: 0
+ width: auto
+ overflow: visible
+ white-space: nowrap
+ color: inherit
+
+ &::before
+ content: "" !important
+
+ span
+ color: #888
+ font-size: 9px
+ font-weight: bold
+ font-variant: small-caps
+ text-transform: uppercase
+ display: inline
+ margin: 0
+
+ > span
+ order: 2
+ background: #2c2c2c
+ color: #fff
+ font-size: 11px
+ font-weight: bold
+ min-width: 32px
+ padding: 2px 5px
+ border-radius: 3px
+ text-align: center
+ display: inline-block
+ flex-shrink: 0
+ box-sizing: border-box
+
+ input[type=hidden] + span::before
+ content: "+"
+
+ input[type=hidden][value^="-"] + span::before,
+ input[type=hidden][value="0"] + span::before
+ content: ""
+
+ input[type=checkbox]
+ order: 3
+ -webkit-appearance: none
+ -moz-appearance: none
+ appearance: none
+ width: 14px
+ height: 14px
+ border: 2px solid #ab8b57
+ border-radius: 50%
+ background: transparent
+ cursor: pointer
+ flex-shrink: 0
+ margin: 0
+
+ &:checked
+ background: #066dce
+ border-color: #066dce
+
+ &:checked ~ span
+ background: #066dce
+
+// 5E skill row toggle — MUST be last in file
+// Hide: same specificity as redesign's display:flex (0,5,0), later cascade position wins
+.charsheet .sheet-pc .sheet-page.sheet-core .sheet-skills-list .sheet-fivee-skill
+ display: none
+
+// Show: !important overrides the hide rule above when toggle is checked
+input[name="attr_show_5e_skills"]:checked ~ .sheet-skills-container .sheet-fivee-skill
+ display: flex !important
diff --git a/Esper_Genesis_5E/Preview/EG Sheet Roll20.png b/Esper_Genesis_5E/Preview/EG Sheet Roll20.png
index 955a5622e3..f51b3f50ff 100644
Binary files a/Esper_Genesis_5E/Preview/EG Sheet Roll20.png and b/Esper_Genesis_5E/Preview/EG Sheet Roll20.png differ
diff --git a/Esper_Genesis_5E/sheet.json b/Esper_Genesis_5E/sheet.json
index 2c8857debe..5d73fc2e98 100644
--- a/Esper_Genesis_5E/sheet.json
+++ b/Esper_Genesis_5E/sheet.json
@@ -1,10 +1,10 @@
{
"html": "EG_Sheet.html",
"css": "EG_Sheet.css",
- "authors": "Rich Lescouflair (original sheet by Steve K. and Phil B.)",
+ "authors": "Skydawn Game Studios",
"roll20userid": "1471558",
"preview": "EG Sheet Roll20.png",
- "compendium": "espergenesis",
+ "compendium": "dnd5e",
"instructions": "This sheet is for use with the Esper Genesis 5E RPG. It is adapted from The D&D 5th Edition Legacy sheet.",
"useroptions": [
{
@@ -261,6 +261,83 @@
"description": "Character OTHER PROFICIENCIES & LANGUAGES section defaults to the complex style that is compatible with the Roll20 5E Compendium. The Simple option provides a text field for players who want more manual control over the sheet.",
"descriptiontranslationkey": "simple-proficiencies-info"
},
+ {
+ "attribute": "use_hero_points",
+ "displayname": "HERO POINTS",
+ "displaytranslationkey": "hero-points-u",
+ "type": "select",
+ "options": [
+ "Off|0",
+ "On|1"
+ ],
+ "optiontranslationkeys": [
+ "off",
+ "on"
+ ],
+ "default": "0",
+ "description": "When enabled, shows a Hero Points section on the character sheet. Characters start with 5 Hero Points + half their level (rounded down), up to 15 at level 20. Spend a Hero Point to roll 1D6 and add the result to any ability check, attack roll, or saving throw after seeing the roll.",
+ "descriptiontranslationkey": "hero-points-info"
+ },
+ {
+ "attribute": "use_rest_buttons",
+ "displayname": "SHORT/LONG REST BUTTONS",
+ "displaytranslationkey": "rest-buttons-u",
+ "type": "select",
+ "options": [
+ "On|1",
+ "Off|0"
+ ],
+ "optiontranslationkeys": [
+ "on",
+ "off"
+ ],
+ "default": "1",
+ "description": "Adds Short Rest and Long Rest buttons to the Resources section. Short rest clears death saves and resets short-rest resources. Long rest fully restores HP, hit dice (half level), talent points, and all resources.",
+ "descriptiontranslationkey": "rest-buttons-info"
+ },
+ {
+ "attribute": "reliable_talent",
+ "displayname": "RELIABLE TALENT:",
+ "displaytranslationkey": "reliable-talent:-u",
+ "type": "select",
+ "options": [
+ "Off|0",
+ "On|10"
+ ],
+ "optiontranslationkeys": [
+ "off",
+ "on"
+ ],
+ "default": "0",
+ "description": "When enabled, any skill check roll for a skill this character is proficient in will treat a d20 result lower than 10 as a 10. Represents the Specialist class feature of the same name (level 11).",
+ "descriptiontranslationkey": "reliable-talent-info"
+ },
+ {
+ "attribute": "powerful_build",
+ "displayname": "POWERFUL BUILD",
+ "displaytranslationkey": "powerful_build-u",
+ "type": "checkbox",
+ "value": "1",
+ "description": "When checked, doubles the character's carrying capacity by applying a x2 multiplier to the size-based weight limit. Represents the racial trait of the same name.",
+ "descriptiontranslationkey": "powerful-build-info"
+ },
+ {
+ "attribute": "currency_mode",
+ "displayname": "CURRENCY:",
+ "displaytranslationkey": "currency:-u",
+ "type": "select",
+ "options": [
+ "EG Currency|eg",
+ "5e Currency|5e"
+ ],
+ "optiontranslationkeys": [
+ "eg-currency",
+ "5e-currency"
+ ],
+ "default": "eg",
+ "description": "Toggle between EG currency (Cubil CU, Cubil Coin CN, Cusara CS, Orim OM) and standard 5e currency (CP, SP, EP, GP, PP). EG is the default; 5e mode is provided for GMs running hybrid games.",
+ "descriptiontranslationkey": "currency-mode-info"
+ },
{
"attribute": "npc_name_flag",
"displayname": "NPC NAME IN ROLLS:",
diff --git a/Esper_Genesis_5E/sheetworkers.js b/Esper_Genesis_5E/sheetworkers.js
index b44ad9d450..0229ddec9c 100644
--- a/Esper_Genesis_5E/sheetworkers.js
+++ b/Esper_Genesis_5E/sheetworkers.js
@@ -225,10 +225,10 @@ on("sheet:compendium-drop", function() {
update_initiative();
break;
case "intelligence":
- update_skills(["astrophysics", "lore", "investigation", "xenobiology", "computers"]);
+ update_skills(["astrophysics", "lore", "investigation", "xenobiology", "computers", "arcana", "history", "nature", "religion"]);
break;
case "wisdom":
- update_skills(["mechanics", "insight", "medicine", "perception", "survival"]);
+ update_skills(["mechanics", "insight", "medicine", "perception", "survival", "animal_handling"]);
break;
case "charisma":
update_skills(["deception", "intimidation", "performance", "persuasion"]);
@@ -256,8 +256,9 @@ on("change:death_save_mod", function(eventinfo) {
update_save("death");
});
-['acrobatics','astrophysics','athletics','computers','deception','insight','intimidation','investigation','lore',
-'mechanics','medicine','perception','performance','persuasion','piloting','sleight_of_hand','stealth','survival','xenobiology'].forEach(attr => {
+['acrobatics','animal_handling','arcana','astrophysics','athletics','computers','deception','history','insight',
+'intimidation','investigation','lore','mechanics','medicine','nature','perception','performance','persuasion',
+'piloting','religion','sleight_of_hand','stealth','survival','xenobiology'].forEach(attr => {
on(`change:${attr}_prof change:${attr}_type change:${attr}_flat`, function(eventinfo) {
if(eventinfo.sourceType === "sheetworker") {return;};
update_skills([`${attr}`]);
@@ -413,7 +414,7 @@ on("change:repeating_inventory:itemname change:repeating_inventory:itempropertie
});
});
-on("change:repeating_inventory:itemweight change:repeating_inventory:itemcount change:cp change:sp change:ep change:cu change:cn change:encumberance_setting change:size change:carrying_capacity_mod", function() {
+on("change:repeating_inventory:itemweight change:repeating_inventory:itemcount change:cp change:sp change:ep change:cu change:cn change:encumberance_setting change:size change:carrying_capacity_mod change:powerful_build", function() {
update_weight();
});
@@ -519,6 +520,29 @@ on("change:base_level change:multiclass1_flag change:multiclass1 change:multicla
set_level();
});
+// Cybermancer Talent Slot auto-calculation.
+// Fires when class or level changes; sets slots_max, slot_rank_max, and slots_used
+// from the Cybermancer level progression table (analogous to Warlock pact slots).
+var cybermancerSlotTable = [
+ // [slots, rank] index = level - 1
+ [1,1],[2,1],[2,2],[2,2],[2,3],[2,3],[2,4],[2,4],[2,5],[2,5],
+ [3,5],[3,5],[3,5],[3,5],[3,5],[3,5],[4,5],[4,5],[4,5],[4,5]
+];
+var update_cybermancer_slots = function() {
+ getAttrs(["class", "base_level"], function(values) {
+ var className = (values["class"] || "").toLowerCase().trim();
+ if(className !== "cybermancer") return;
+ var level = parseInt(values["base_level"], 10) || 1;
+ level = Math.min(Math.max(level, 1), 20);
+ var entry = cybermancerSlotTable[level - 1];
+ setAttrs({ slots_max: entry[0], slot_rank_max: entry[1], slots_used: entry[0] });
+ });
+};
+on("change:class change:base_level", function(eventinfo) {
+ if(eventinfo.sourceType && eventinfo.sourceType === "sheetworker") return;
+ update_cybermancer_slots();
+});
+
on("change:level_calculations change:caster_level change:lvl1_slots_mod change:lvl2_slots_mod change:lvl3_slots_mod change:lvl4_slots_mod change:lvl5_slots_mod change:lvl6_slots_mod change:lvl7_slots_mod change:lvl8_slots_mod change:lvl9_slots_mod", function(eventinfo) {
if(eventinfo.sourceType && eventinfo.sourceType === "sheetworker") {
return;
@@ -554,6 +578,13 @@ on("change:dtype", function(eventinfo) {
update_npc_action("all");
});
+on("change:default_critical_range", function(eventinfo) {
+ if(eventinfo.sourceType && eventinfo.sourceType === "sheetworker") {
+ return;
+ }
+ update_attacks("all");
+});
+
on("change:jack_of_all_trades", function(eventinfo) {
if(eventinfo.sourceType && eventinfo.sourceType === "sheetworker") {
return;
@@ -562,6 +593,40 @@ on("change:jack_of_all_trades", function(eventinfo) {
update_all_ability_checks();
});
+on("change:reliable_talent", function(eventinfo) {
+ if(eventinfo.sourceType && eventinfo.sourceType === "sheetworker") {
+ return;
+ }
+ update_skills(["athletics","acrobatics","sleight_of_hand","stealth","astrophysics","lore","investigation","xenobiology","computers","mechanics","insight","medicine","perception","survival","deception","intimidation","performance","persuasion","animal_handling","arcana","history","nature","religion"]);
+});
+
+on("change:show_5e_skills", function(eventinfo) {
+ if(eventinfo.sourceType && eventinfo.sourceType === "sheetworker") {return;}
+ update_skills(["animal_handling","arcana","history","nature","religion"]);
+});
+
+// ---- Feature: Hero Points ----
+var updateHeroPoints = function(level) {
+ getAttrs(["use_hero_points", "level"], values => {
+ if (!values["use_hero_points"] || values["use_hero_points"] != "1") return;
+ const lvl = level !== undefined ? parseInt(level) : (parseInt(values["level"]) || 0);
+ setAttrs({ hero_points: Math.floor(lvl / 2) + 5 }, { silent: true });
+ });
+};
+on("change:consumed_hero_points", () => {
+ getAttrs(["hero_points"], values => {
+ const hp = values["hero_points"] ? parseInt(values["hero_points"]) : 0;
+ setAttrs({ hero_points: Math.max(hp - 1, 0) }, { silent: true });
+ });
+});
+on("change:hero_points", eventInfo => {
+ const hp = eventInfo.newValue ? Math.max(parseInt(eventInfo.newValue), 0) : 0;
+ setAttrs({ hero_points: hp }, { silent: true });
+});
+on("change:use_hero_points", eventInfo => {
+ if (eventInfo.newValue && eventInfo.newValue == "1") updateHeroPoints();
+});
+
on("change:initmod change:init_tiebreaker", function(eventinfo) {
if(eventinfo.sourceType && eventinfo.sourceType === "sheetworker") {
return;
@@ -914,12 +979,13 @@ var update_all_saves = function() {
var update_all_ability_checks = function(){
update_initiative();
- update_skills(["athletics", "acrobatics", "sleight_of_hand", "stealth", "astrophysics", "lore", "investigation", "xenobiology", "computers", "mechanics", "insight", "medicine", "perception", "survival", "deception", "intimidation", "performance", "persuasion", "piloting"]);
+ update_skills(["athletics", "acrobatics", "sleight_of_hand", "stealth", "astrophysics", "lore", "investigation", "xenobiology", "computers", "mechanics", "insight", "medicine", "perception", "survival", "deception", "intimidation", "performance", "persuasion", "piloting", "animal_handling", "arcana", "history", "nature", "religion"]);
};
var update_skills = function (skills_array) {
- var skill_parent = {athletics: "strength", acrobatics: "dexterity", sleight_of_hand: "dexterity", stealth: "dexterity", astrophysics: "intelligence", lore: "intelligence", investigation: "intelligence", xenobiology: "intelligence", computers: "intelligence", mechanics: "wisdom", insight: "wisdom", medicine: "wisdom", perception: "wisdom", survival: "wisdom", deception: "charisma", intimidation: "charisma", performance: "charisma", persuasion: "charisma", piloting: "dexterity"};
- var attrs_to_get = ["pb","pb_type","jack_of_all_trades","jack"];
+ var skill_parent = {athletics: "strength", acrobatics: "dexterity", sleight_of_hand: "dexterity", stealth: "dexterity", astrophysics: "intelligence", lore: "intelligence", investigation: "intelligence", xenobiology: "intelligence", computers: "intelligence", mechanics: "wisdom", insight: "wisdom", medicine: "wisdom", perception: "wisdom", survival: "wisdom", deception: "charisma", intimidation: "charisma", performance: "charisma", persuasion: "charisma", piloting: "dexterity",
+ animal_handling: "wisdom", arcana: "intelligence", history: "intelligence", nature: "intelligence", religion: "intelligence"};
+ var attrs_to_get = ["pb","pb_type","jack_of_all_trades","jack","reliable_talent"];
var update = {};
var callbacks = [];
@@ -989,6 +1055,10 @@ var update_skills = function (skills_array) {
};
update[s + "_bonus"] = total;
+ // Reliable Talent: floor skill die at 10 for proficient skills (Specialist class feature)
+ const isProficient = v[s + "_prof"] && v[s + "_prof"] != 0;
+ const hasReliableTalent = v["reliable_talent"] && parseInt(v["reliable_talent"]) === 10;
+ update[s + "_d20"] = (isProficient && hasReliableTalent) ? "{@{d20},0d20+10}k1" : "@{d20}";
});
setAttrs(update, {silent: true}, function() {callbacks.forEach(function(callback) {callback(); })} );
@@ -1573,7 +1643,7 @@ const update_attacks = (update_id, source) => {
};
const do_update_attack = (attack_array, source) => {
- let attack_attribs = ["level","d20","pb","pb_type","pbd_safe","dtype","globalmagicmod","strength_mod","dexterity_mod","constitution_mod","intelligence_mod","wisdom_mod","charisma_mod","spellcasting_ability","spell_save_dc","spell_attack_mod", "spell_dc_mod", "global_damage_mod_roll", "global_damage_mod_crit"];
+ let attack_attribs = ["level","d20","pb","pb_type","pbd_safe","dtype","globalmagicmod","strength_mod","dexterity_mod","constitution_mod","intelligence_mod","wisdom_mod","charisma_mod","spellcasting_ability","spell_save_dc","spell_attack_mod", "spell_dc_mod", "global_damage_mod_roll", "global_damage_mod_crit", "default_critical_range"];
_.each(attack_array, (attackid) => {
["atkflag","atkname","atkattr_base","atkmod","atkprofflag","atkmagic","dmgflag","dmgbase","dmgattr","dmgmod","dmgtype","dmg2flag","dmg2base","dmg2attr","dmg2mod","dmg2type","dmgcustcrit","dmg2custcrit","saveflag","savedc","saveeffect","saveflat","hldmg","spellid","spelllevel","atkrange","itemid","ammo",].forEach((attr) => {
attack_attribs.push(`repeating_attack_${attackid}_${attr}`)
@@ -1787,10 +1857,17 @@ const do_update_attack = (attack_array, source) => {
let globaldamagecrit = `[[${v.global_damage_mod_crit || 0}]]`;
//Assamble Roll Templates
+ // Use default_critical_range if set and lower than the per-attack range (e.g. Warrior subclass expanded crit)
+ const criticalrange =
+ v[`${repeating_attack}_atkcritrange`] &&
+ v["default_critical_range"] &&
+ parseInt(v["default_critical_range"]) < parseInt(v[`${repeating_attack}_atkcritrange`])
+ ? "@{default_critical_range}"
+ : "@{atkcritrange}";
if (v.dtype === "full") {
- rollbase = `@{wtype}&{template:atkdmg} {{mod=@{atkbonus}}} {{rname=@{atkname}}} {{r1=[[${r1}cs>@{atkcritrange}${hbonus}]]}} ${r2}cs>@{atkcritrange}${hbonus}]]}} @{atkflag} {{range=@{atkrange}}} @{dmgflag} {{dmg1=[[${hdmg1}]]}} {{dmg1type=${dmgtype}}} @{dmg2flag} {{dmg2=[[${hdmg2}]]}} {{dmg2type=${dmg2type}}} {{crit1=[[${crit1}[CRIT]]]}} {{crit2=[[${crit2}[CRIT]]]}} @{saveflag} {{desc=@{atk_desc}}} @{hldmg} ${hldmgcrit} {{spelllevel=@{spelllevel}}} {{innate=@{spell_innate}}} {{globalattack=@{global_attack_mod}}} {{globaldamage=${globaldamage}}} {{globaldamagecrit=${globaldamagecrit}}} {{globaldamagetype=@{global_damage_mod_type}}} ammo=@{ammo} @{charname_output} {{licensedsheet=@{licensedsheet}}}`;
+ rollbase = `@{wtype}&{template:atkdmg} {{mod=@{atkbonus}}} {{rname=@{atkname}}} {{r1=[[${r1}cs>${criticalrange}${hbonus}]]}} ${r2}cs>${criticalrange}${hbonus}]]}} @{atkflag} {{range=@{atkrange}}} @{dmgflag} {{dmg1=[[${hdmg1}]]}} {{dmg1type=${dmgtype}}} @{dmg2flag} {{dmg2=[[${hdmg2}]]}} {{dmg2type=${dmg2type}}} {{crit1=[[${crit1}[CRIT]]]}} {{crit2=[[${crit2}[CRIT]]]}} @{saveflag} {{desc=@{atk_desc}}} @{hldmg} ${hldmgcrit} {{spelllevel=@{spelllevel}}} {{innate=@{spell_innate}}} {{globalattack=@{global_attack_mod}}} {{globaldamage=${globaldamage}}} {{globaldamagecrit=${globaldamagecrit}}} {{globaldamagetype=@{global_damage_mod_type}}} ammo=@{ammo} @{charname_output} {{licensedsheet=@{licensedsheet}}}`;
} else if (atkflag != 0) {
- rollbase = `@{wtype}&{template:atk} {{mod=@{atkbonus}}} {{rname=[@{atkname}](~repeating_attack_attack_dmg)}} {{rnamec=[@{atkname}](~repeating_attack_attack_crit)}} {{r1=[[${r1}cs>@{atkcritrange}${hbonus}]]}} ${r2}cs>@{atkcritrange}${hbonus}]]}} {{range=@{atkrange}}} {{desc=@{atk_desc}}} {{spelllevel=@{spelllevel}}} {{innate=@{spell_innate}}} {{globalattack=@{global_attack_mod}}} ammo=@{ammo} @{charname_output} {{licensedsheet=@{licensedsheet}}}`;
+ rollbase = `@{wtype}&{template:atk} {{mod=@{atkbonus}}} {{rname=[@{atkname}](~repeating_attack_attack_dmg)}} {{rnamec=[@{atkname}](~repeating_attack_attack_crit)}} {{r1=[[${r1}cs>${criticalrange}${hbonus}]]}} ${r2}cs>${criticalrange}${hbonus}]]}} {{range=@{atkrange}}} {{desc=@{atk_desc}}} {{spelllevel=@{spelllevel}}} {{innate=@{spell_innate}}} {{globalattack=@{global_attack_mod}}} ammo=@{ammo} @{charname_output} {{licensedsheet=@{licensedsheet}}}`;
} else if (dmgflag1 != 0) {
rollbase = `@{wtype}&{template:dmg} {{rname=@{atkname}}} @{atkflag} {{range=@{atkrange}}} @{dmgflag} {{dmg1=[[${hdmg1}]]}} {{dmg1type=${dmgtype}}} @{dmg2flag} {{dmg2=[[${hdmg2}]]}} {{dmg2type=${dmg2type}}} @{saveflag} {{desc=@{atk_desc}}} @{hldmg} {{spelllevel=@{spelllevel}}} {{innate=@{spell_innate}}} {{globaldamage=${globaldamage}}} {{globaldamagetype=@{global_damage_mod_type}}} ammo=@{ammo} @{charname_output} {{licensedsheet=@{licensedsheet}}}`;
} else {
@@ -2066,7 +2143,7 @@ const remove_resource = (id) => {
const update_weight = function() {
let update = {};
let wtotal = 0;
- let weight_attrs = ["cp","sp","ep","cu","cn","encumberance_setting","strength","size","carrying_capacity_mod"];
+ let weight_attrs = ["cp","sp","ep","cu","cn","encumberance_setting","strength","size","carrying_capacity_mod","powerful_build"];
getSectionIDs("repeating_inventory", (idarray) => {
_.each(idarray, (currentID, i) => {
weight_attrs.push(`repeating_inventory_${currentID}_itemweight`);
@@ -2095,6 +2172,7 @@ const update_weight = function() {
size_multiplier =
(size === "tiny") ? .5 : (size === "large") ? 2 : (size === "huge") ? 4 : (size === "gargantuan") ? 8 : size_multiplier;
};
+ if (v["powerful_build"] && v["powerful_build"] == 1) { size_multiplier *= 2; }
let str = str_base*size_multiplier;
// Parse the carrying capacitiy modificator if any
if (v.carrying_capacity_mod) {
@@ -2356,10 +2434,16 @@ const set_level = function() {
let hitdie_final = (multiclass) ? `?{Hit Die Class|${charclass},@{hitdietype}` : "@{hitdietype}";
const subclass = (v[`subclass`]) ? v[`subclass`] + " " : "";
let class_display = `${subclass}${charclass} ${finallevel}`;
+ const baselevel = finallevel;
// This nested array is used to determine the overall spellcasting level for the character.
var classes = [ [finalclass.toLowerCase(), v[`base_level`]] ];
+ // Reset all multiclass HD slots; active ones will be populated in the forEach below.
+ update["multiclass1_hitdietype"] = ""; update["multiclass1_hit_dice_max"] = "0";
+ update["multiclass2_hitdietype"] = ""; update["multiclass2_hit_dice_max"] = "0";
+ update["multiclass3_hitdietype"] = ""; update["multiclass3_hit_dice_max"] = "0";
+
["multiclass1", "multiclass2", "multiclass3"].forEach((multiclass) => {
if (v[`${multiclass}_flag`] && v[`${multiclass}_flag`] === "1") {
const multiclasslevel = (v[`${multiclass}_lvl`] && v[`${multiclass}_lvl`] > 0) ? parseInt(v[`${multiclass}_lvl`], 10) : 1;
@@ -2368,6 +2452,8 @@ const set_level = function() {
hitdie_final = `${hitdie_final}|` + v[`${multiclass}`].charAt(0).toUpperCase() + v[`${multiclass}`].slice(1) + "," + checkHitDie(v[`${multiclass}`]);
classes.push([ v[`${multiclass}`], multiclasslevel ]);
class_display = `${class_display}, ${subclass}` + v[`${multiclass}`] + ` ${multiclasslevel}`;
+ update[`${multiclass}_hitdietype`] = checkHitDie(v[`${multiclass}`]);
+ update[`${multiclass}_hit_dice_max`] = multiclasslevel;
};
});
@@ -2376,14 +2462,31 @@ const set_level = function() {
update["hitdie_final"] = (multiclass) ? `${hitdie_final}}` : hitdie_final;
update["level"] = finallevel;
update["caster_level"] = casterlevel;
+ // Set flag: does this class use power slots (not TP-only or Talent Slot system)?
+ var slotClasses = ["engineer","full","hunter","sentinel","half","third"];
+ var usesSlots = classes.some(function(c) {
+ var cn = c[0].toLowerCase();
+ return slotClasses.indexOf(cn) !== -1
+ || (cn === "fighter" && v["arcane_fighter"] === "1")
+ || (cn === "rogue" && v["arcane_rogue"] === "1")
+ || (cn === "warrior" && v["arcane_fighter"] === "1")
+ || (cn === "specialist" && v["arcane_rogue"] === "1");
+ });
+ update["uses_power_slots"] = usesSlots ? "1" : "0";
update["class_display"] = class_display;
if(!v["level_calculations"] || v["level_calculations"] === "on") {
- update["hit_dice_max"] = finallevel;
+ update["hit_dice_max"] = baselevel;
callbacks.push(() => {update_spell_slots();} );
}
callbacks.push(() => {update_pb();} );
callbacks.push(() => {update_leveler_display();} );
+ callbacks.push(() => {updateHeroPoints(finallevel);} );
+ callbacks.push(() => {
+ getAttrs(["use_spell_points"], v => {
+ if (v["use_spell_points"] && v["use_spell_points"] == "1") setSpellPoints();
+ });
+ });
setAttrs(update, {silent: true},() => {callbacks.forEach((callback) => {callback(); })} );
});
};
@@ -2403,7 +2506,8 @@ var isMultiCaster = function(classes, arcane_fighter, arcane_rogue) {
};
var getCasterType = function(class_string, levels, arcane_fighter, arcane_rogue) {
- var full = ["adept","cybermancer","engineer","melder","full"];
+ // Full slot casters: Engineer only (Melder/Adept use TP; Cybermancer uses Talent Slots)
+ var full = ["engineer","full"];
var half = ["hunter","sentinel","half"];
class_string = class_string.toLowerCase();
if(full.indexOf(class_string) != -1) {
@@ -2411,7 +2515,12 @@ var getCasterType = function(class_string, levels, arcane_fighter, arcane_rogue)
} else if(half.indexOf(class_string) != -1) {
if(class_string === "artificer" && levels == 1) return 1;
return (levels == 1) ? 0 : (1/2);
- } else if(class_string === "third" || (class_string === "fighter" && arcane_fighter === "1") || (class_string === "rogue" && arcane_rogue === "1")) {
+ } else if(class_string === "third"
+ || (class_string === "fighter" && arcane_fighter === "1")
+ || (class_string === "rogue" && arcane_rogue === "1")
+ || (class_string === "warrior" && arcane_fighter === "1")
+ || (class_string === "specialist" && arcane_rogue === "1")
+ ) {
return (levels == 1 || levels == 2) ? 0 : (1/3);
} else {
return 0;
@@ -2465,8 +2574,13 @@ var update_leveler_display = function () {
};
var update_spell_slots = function() {
- getAttrs(["lvl1_slots_mod","lvl2_slots_mod","lvl3_slots_mod","lvl4_slots_mod","lvl5_slots_mod","lvl6_slots_mod","lvl7_slots_mod","lvl8_slots_mod","lvl9_slots_mod","caster_level"], function(v) {
+ getAttrs(["use_spell_points","lvl1_slots_mod","lvl2_slots_mod","lvl3_slots_mod","lvl4_slots_mod","lvl5_slots_mod","lvl6_slots_mod","lvl7_slots_mod","lvl8_slots_mod","lvl9_slots_mod","caster_level"], function(v) {
var update = {};
+ if (v["use_spell_points"] && v["use_spell_points"] == "1") {
+ for (var i = 1; i <= 9; i++) update[`lvl${i}_slots_total`] = 0;
+ setAttrs(update, {silent: true});
+ return;
+ }
var lvl = v["caster_level"] && !isNaN(parseInt(v["caster_level"], 10)) ? parseInt(v["caster_level"], 10) : 0;
var l1 = v["lvl1_slots_mod"] && !isNaN(parseInt(v["lvl1_slots_mod"], 10)) ? parseInt(v["lvl1_slots_mod"], 10) : 0;
var l2 = v["lvl2_slots_mod"] && !isNaN(parseInt(v["lvl2_slots_mod"], 10)) ? parseInt(v["lvl2_slots_mod"], 10) : 0;
@@ -2531,7 +2645,7 @@ var update_pb = function() {
callbacks.push( function() {update_initiative();} );
callbacks.push( function() {update_tool("all");} );
callbacks.push( function() {update_all_saves();} );
- callbacks.push( function() {update_skills(["athletics", "acrobatics", "sleight_of_hand", "stealth", "astrophysics", "lore", "investigation", "xenobiology", "computers", "mechanics", "insight", "medicine", "perception", "survival", "deception", "intimidation", "performance", "persuasion", "piloting"]);} );
+ callbacks.push( function() {update_skills(["athletics", "acrobatics", "sleight_of_hand", "stealth", "astrophysics", "lore", "investigation", "xenobiology", "computers", "mechanics", "insight", "medicine", "perception", "survival", "deception", "intimidation", "performance", "persuasion", "piloting", "animal_handling", "arcana", "history", "nature", "religion"]);} );
setAttrs(update, {silent: true}, function() {callbacks.forEach(function(callback) {callback(); })} );
});
@@ -3216,7 +3330,7 @@ var upgrade_to_2_0 = function(doneupdating) {
update_mod("wisdom");
update_mod("charisma");
update_all_saves();
- update_skills(["athletics", "acrobatics", "sleight_of_hand", "stealth", "astrophysics", "lore", "investigation", "xenobiology", "computers", "mechanics", "insight", "medicine", "perception", "survival", "deception", "intimidation", "performance", "persuasion", "piloting"]);
+ update_skills(["athletics", "acrobatics", "sleight_of_hand", "stealth", "astrophysics", "lore", "investigation", "xenobiology", "computers", "mechanics", "insight", "medicine", "perception", "survival", "deception", "intimidation", "performance", "persuasion", "piloting", "animal_handling", "arcana", "history", "nature", "religion"]);
update_tool("all")
update_attacks("all");
update_pb();
@@ -3679,8 +3793,8 @@ on("change:repeating_weapon-systems", eventinfo => {
if(values[`${pre}_damage`]) {
const damage = addShipDamageType(values[`${pre}_damage`], values[`${pre}_dmgtype`]);
const damagec = addShipDamageType(calcShipAtkdmgc(values[`${pre}_damage`]), values[`${pre}_dmgtype`]);
- const atkdmg = `@{wtype}&{template:dmg} {{rname=@{weapon}}} {{attack=1}} {{range=@{range}}} {{damage=1}} {{dmg1flag=1}} {{dmg1=[[${damage}]]}} {{dmg1type=${values[`${pre}_dmgtype`]}}} {{desc=@{special}}} @{pc_ship_name} {{licensedsheet=@{licensedsheet}}}`;
- const atkdmgc = `@{wtype}&{template:dmg} {{rname=@{weapon}}} {{attack=1}} {{range=@{range}}} {{damage=1}} {{dmg1flag=1}} {{dmg1=[[${damagec}]]}} {{dmg1type=${values[`${pre}_dmgtype`]}}} {{desc=@{special}}} @{pc_ship_name} {{licensedsheet=@{licensedsheet}}}`;
+ const atkdmg = `@{wtype}&{template:dmg} {{rname=@{weapon}}} {{attack=1}} {{range=@{range}}} {{damage=1}} {{dmg1flag=1}} {{dmg1=[[${damage}]]}} {{dmg1type=${values[`${pre}_dmgtype`]}}} {{desc=@{special}}} @{character_name} {{licensedsheet=@{licensedsheet}}}`;
+ const atkdmgc = `@{wtype}&{template:dmg} {{rname=@{weapon}}} {{attack=1}} {{range=@{range}}} {{damage=1}} {{dmg1flag=1}} {{dmg1=[[${damagec}]]}} {{dmg1type=${values[`${pre}_dmgtype`]}}} {{desc=@{special}}} @{character_name} {{licensedsheet=@{licensedsheet}}}`;
const update = {
[`${pre}_atkdmg`]: atkdmg,
[`${pre}_atkdmgc`]: atkdmgc,
@@ -3691,4 +3805,344 @@ on("change:repeating_weapon-systems", eventinfo => {
});
+// ---- Feature: Spell Points Variant ----
+const createResource = function(name, max, current) {
+ getAttrs(["other_resource_name"], v => {
+ if (!v.other_resource_name || v.other_resource_name === "" || v.other_resource_name === name) {
+ setAttrs({ other_resource_name: name, other_resource_max: max, other_resource: current });
+ } else {
+ getSectionIDs("repeating_resource", ids => {
+ if (ids.length === 0) {
+ const newid = generateRowID();
+ setAttrs({
+ [`repeating_resource_${newid}_resource_left_name`]: name,
+ [`repeating_resource_${newid}_resource_left_max`]: max,
+ [`repeating_resource_${newid}_resource_left`]: current
+ });
+ return;
+ }
+ const nameAttrs = ids.map(id => `repeating_resource_${id}_resource_left_name`)
+ .concat(ids.map(id => `repeating_resource_${id}_resource_right_name`));
+ getAttrs(nameAttrs, nv => {
+ const existingKey = Object.keys(nv).find(k => nv[k] === name);
+ const side = existingKey && existingKey.includes("_right_") ? "right" : "left";
+ const existingID = existingKey
+ ? existingKey.replace("repeating_resource_", "").split("_resource_")[0]
+ : generateRowID();
+ setAttrs({
+ [`repeating_resource_${existingID}_resource_${side}_name`]: name,
+ [`repeating_resource_${existingID}_resource_${side}_max`]: max,
+ [`repeating_resource_${existingID}_resource_${side}`]: current
+ });
+ });
+ });
+ }
+ });
+};
+const formatPrintedTools = () => {
+ getSectionIDs("tool", (ids) => {
+ const attrs = [
+ ...ids.map((id) => `repeating_tool_${id}_toolbonus_base`),
+ ...ids.map((id) => `repeating_tool_${id}_toolname`),
+ ];
+ getAttrs(attrs, (values) => {
+ const tools = [];
+ ids.forEach((id) => {
+ const expert = values[`repeating_tool_${id}_toolbonus_base`] && values[`repeating_tool_${id}_toolbonus_base`] == "(@{pb}*2)" ? "⁺" : "";
+ const name = values[`repeating_tool_${id}_toolname`];
+ if (name) tools.push(name + expert);
+ });
+ setAttrs({ other_tool: tools.sort().join(", ") });
+ });
+ });
+};
+
+const formatPrintedSkills = () => {
+ getSectionIDs("proficiencies", (ids) => {
+ const attrs = [
+ ...ids.map((id) => `repeating_proficiencies_${id}_prof_type`),
+ ...ids.map((id) => `repeating_proficiencies_${id}_name`),
+ ];
+ getAttrs(attrs, (values) => {
+ const otherSkills = { language: [], weapon: [], armor: [], other: [] };
+ ids.forEach((id) => {
+ const type = values[`repeating_proficiencies_${id}_prof_type`];
+ const name = values[`repeating_proficiencies_${id}_name`];
+ if (type && name) otherSkills[type.toLowerCase()].push(name);
+ });
+ setAttrs({
+ other_languages: otherSkills.language.sort().join(", "),
+ other_armor: otherSkills.armor.sort().join(", "),
+ other_weapon: otherSkills.weapon.sort().join(", "),
+ other_other: otherSkills.other.sort().join(", "),
+ });
+ });
+ });
+};
+
+const deleteResource = function(name) {
+ getAttrs(["other_resource_name"], v => {
+ if (v.other_resource_name === name) {
+ setAttrs({ other_resource_name: "", other_resource_max: "", other_resource: "" });
+ } else {
+ getSectionIDs("repeating_resource", ids => {
+ if (ids.length === 0) return;
+ const nameAttrs = ids.map(id => `repeating_resource_${id}_resource_left_name`)
+ .concat(ids.map(id => `repeating_resource_${id}_resource_right_name`));
+ getAttrs(nameAttrs, nv => {
+ const existingKey = Object.keys(nv).find(k => nv[k] === name);
+ if (!existingKey) return;
+ const existingID = existingKey.replace("repeating_resource_", "").split("_resource_")[0];
+ const side = existingKey.includes("_right_") ? "right" : "left";
+ const otherSide = side === "left" ? "right" : "left";
+ if (!nv[`repeating_resource_${existingID}_resource_${otherSide}_name`]) {
+ removeRepeatingRow(`repeating_resource_${existingID}`);
+ } else {
+ setAttrs({
+ [`repeating_resource_${existingID}_resource_${side}_name`]: "",
+ [`repeating_resource_${existingID}_resource_${side}_max`]: "",
+ [`repeating_resource_${existingID}_resource_${side}`]: ""
+ });
+ }
+ });
+ });
+ }
+ });
+};
+const getSpellPoints = function(callback) {
+ const classAttrs = ["base_level","class","multiclass1_flag","multiclass1","multiclass1_lvl",
+ "multiclass2_flag","multiclass2","multiclass2_lvl","multiclass3_flag","multiclass3","multiclass3_lvl",
+ "arcane_fighter","arcane_rogue"];
+ const pointsPerLevel = [0,4,6,14,17,27,32,38,44,57,64,73,78,83,88,94,100,107,114,123,133];
+ getAttrs(classAttrs, v => {
+ const classes = [[v["class"] || "", v["base_level"] || 0]].concat(
+ [1,2,3].filter(i => v[`multiclass${i}_flag`] === "1")
+ .map(i => [v[`multiclass${i}`] || "", v[`multiclass${i}_lvl`] || 0])
+ );
+ const multicaster = isMultiCaster(classes, v["arcane_fighter"], v["arcane_rogue"]);
+ let totalCasterLevel = 0;
+ classes.forEach(function([cls, lvl]) {
+ const lvlInt = parseInt(lvl) || 0;
+ const fraction = getCasterType(cls, lvlInt, v["arcane_fighter"], v["arcane_rogue"]);
+ const contribution = lvlInt * fraction;
+ totalCasterLevel += multicaster ? Math.floor(contribution) : Math.ceil(contribution);
+ });
+ const level = Math.min(Math.max(Math.round(totalCasterLevel), 0), 20);
+ callback(pointsPerLevel[level] || 0);
+ });
+};
+const setSpellPoints = function() {
+ getSpellPoints(points => {
+ if (points > 0) createResource("Spell Points", points, points);
+ });
+};
+on("change:use_spell_points", eventInfo => {
+ if (eventInfo.newValue && eventInfo.newValue == "1") {
+ setSpellPoints();
+ } else {
+ deleteResource("Spell Points");
+ }
+ update_spell_slots();
+});
+
+// ---- Feature: Short/Long Rest Buttons ----
+class Rest {
+ static resetResources(types) {
+ if (!types.includes("long")) return;
+ getSectionIDs("resource", ids => {
+ const attributes = [
+ "class_resource_max", "class_resource_use_pb",
+ "other_resource_max", "other_resource_use_pb",
+ "pb"
+ ];
+ ids.forEach(id => {
+ attributes.push(`repeating_resource_${id}_resource_left_max`);
+ attributes.push(`repeating_resource_${id}_resource_left_use_pb`);
+ attributes.push(`repeating_resource_${id}_resource_right_max`);
+ attributes.push(`repeating_resource_${id}_resource_right_use_pb`);
+ });
+ getAttrs(attributes, values => {
+ const update = {};
+ const pb = parseInt(values["pb"]) || 0;
+ const resetOne = (currentKey, maxKey, pbKey) => {
+ const usePB = values[pbKey] === "1";
+ const max = usePB ? pb : parseInt(values[maxKey]);
+ if (!isNaN(max) && max > 0) update[currentKey] = max;
+ };
+ resetOne("class_resource", "class_resource_max", "class_resource_use_pb");
+ resetOne("other_resource", "other_resource_max", "other_resource_use_pb");
+ ids.forEach(id => {
+ resetOne(`repeating_resource_${id}_resource_left`, `repeating_resource_${id}_resource_left_max`, `repeating_resource_${id}_resource_left_use_pb`);
+ resetOne(`repeating_resource_${id}_resource_right`, `repeating_resource_${id}_resource_right_max`, `repeating_resource_${id}_resource_right_use_pb`);
+ });
+ setAttrs(update);
+ });
+ });
+ }
+ static resetHP() {
+ getAttrs(["hp_max"], values => {
+ if(!isNaN(values["hp_max"])) setAttrs({hp: values["hp_max"]});
+ });
+ }
+ static resetHitDice() {
+ getAttrs(["level", "hit_dice", "hit_dice_max"], values => {
+ const update = {};
+ const level = parseInt(values["level"]) || 0;
+ const maxHitDice = Math.max(Math.floor(level / 2), 1);
+ if(!isNaN(values["hit_dice_max"])) {
+ if(!isNaN(values["hit_dice"])) {
+ update["hit_dice"] = String(Math.min(parseInt(values["hit_dice"]) + maxHitDice, parseInt(values["hit_dice_max"])));
+ } else {
+ update["hit_dice"] = String(maxHitDice);
+ }
+ }
+ setAttrs(update);
+ });
+ }
+ // Restores the Talent Points pool (tp). Used by Adept, Cybermancer, Melder on long rest.
+ static resetTalentPoints() {
+ getAttrs(["tp_max"], values => {
+ if(!isNaN(values["tp_max"])) setAttrs({tp: values["tp_max"]});
+ });
+ }
+ // Restores Cybermancer Talent Slots (slots_used = remaining slots) to max.
+ // Cybermancer is EG's Warlock equivalent: talent slots recover on both short and long rest.
+ static resetCybermancerSlots() {
+ get_class_level("cybermancer", cybermancerLvl => {
+ if(cybermancerLvl === 0 || cybermancerLvl === "0") return;
+ getAttrs(["slots_max"], values => {
+ if(!isNaN(values["slots_max"])) setAttrs({slots_used: values["slots_max"]});
+ });
+ });
+ }
+ // Restores power slots (lvl1–9) to their calculated totals on long rest.
+ static resetPowerSlots() {
+ const attributes = [
+ "lvl1_slots_total", "lvl2_slots_total", "lvl3_slots_total",
+ "lvl4_slots_total", "lvl5_slots_total", "lvl6_slots_total",
+ "lvl7_slots_total", "lvl8_slots_total", "lvl9_slots_total"
+ ];
+ getAttrs(attributes, values => {
+ const update = {};
+ Object.keys(values).filter(key => !isNaN(values[key])).forEach(key => {
+ update[key.replace("_total", "_expended")] = values[key];
+ });
+ setAttrs(update);
+ });
+ }
+ // Clears Esper Mastery used-flags on long rest.
+ static resetEsperMastery() {
+ setAttrs({
+ mastery_6th_used: "",
+ mastery_7th_used: "",
+ mastery_8th_used: "",
+ mastery_9th_used: ""
+ });
+ }
+ static resetDeathSave() {
+ const update = {};
+ for(let i = 1; i <= 3; i++) {
+ update[`deathsave_succ${i}`] = "";
+ update[`deathsave_fail${i}`] = "";
+ }
+ setAttrs(update);
+ }
+ static decreaseExhaustionLevels() {
+ getAttrs(["exhaustion_toggle", "exhaustion_level"], values => {
+ if(!values["exhaustion_toggle"] || values["exhaustion_toggle"] !== "1") return;
+ const level = isNaN(values["exhaustion_level"])
+ ? 0
+ : Math.max(parseInt(values["exhaustion_level"]) - 1, 0);
+ setAttrs({exhaustion_level: level});
+ });
+ }
+ static long() {
+ Rest.resetResources(["short", "long"]);
+ Rest.resetHP();
+ Rest.resetHitDice();
+ Rest.resetTalentPoints();
+ Rest.resetCybermancerSlots();
+ Rest.resetPowerSlots();
+ Rest.resetEsperMastery();
+ Rest.decreaseExhaustionLevels();
+ Rest.resetDeathSave();
+ }
+ static short() {
+ Rest.resetResources(["short"]);
+ Rest.resetCybermancerSlots();
+ Rest.resetDeathSave();
+ }
+}
+
+on("clicked:short_rest", () => {
+ console.log("Taking a short rest...");
+ Rest.short();
+});
+on("clicked:long_rest", () => {
+ console.log("Taking a long rest...");
+ Rest.long();
+});
+
+const sanitizeShipNum = (val) => {
+ const raw = (val || "").trim().replace(/^\+/, "");
+ const n = parseInt(raw, 10);
+ return isNaN(n) ? 0 : n;
+};
+
+on("change:pc_ship_piloting_maneuver_check", () => {
+ getAttrs(["pc_ship_piloting_maneuver_check"], function(v) {
+ setAttrs({ pc_ship_piloting_num: sanitizeShipNum(v["pc_ship_piloting_maneuver_check"]) }, { silent: true });
+ });
+});
+
+const update_pc_ship_ac = () => {
+ getAttrs(["pc_ship_base_armor_class", "pc_ship_maneuver_bonus", "pc_ship_pilot_dex_modifier", "pc_ship_misc_mod_bonus"], function(v) {
+ const ac = sanitizeShipNum(v["pc_ship_base_armor_class"])
+ + sanitizeShipNum(v["pc_ship_maneuver_bonus"])
+ + sanitizeShipNum(v["pc_ship_pilot_dex_modifier"])
+ + sanitizeShipNum(v["pc_ship_misc_mod_bonus"]);
+ setAttrs({ pc_ship_armor_class: ac }, { silent: true });
+ });
+};
+
+const update_pc_ship_md = () => {
+ getAttrs(["pc_ship_proficiency_bonus", "pc_ship_pilot_wis_modifier", "pc_ship_captain_cha_modifier"], function(v) {
+ const md = 8
+ + sanitizeShipNum(v["pc_ship_proficiency_bonus"])
+ + sanitizeShipNum(v["pc_ship_pilot_wis_modifier"])
+ + sanitizeShipNum(v["pc_ship_captain_cha_modifier"]);
+ setAttrs({ pc_ship_base_maneuver_defense: 8, pc_ship_maneuver_defense_bonus: md }, { silent: true });
+ });
+};
+
+on("change:pc_ship_base_armor_class change:pc_ship_maneuver_bonus change:pc_ship_pilot_dex_modifier change:pc_ship_misc_mod_bonus", update_pc_ship_ac);
+on("change:pc_ship_proficiency_bonus change:pc_ship_pilot_wis_modifier change:pc_ship_captain_cha_modifier", update_pc_ship_md);
+
+on("sheet:opened", () => {
+ update_pc_ship_ac();
+ update_pc_ship_md();
+});
+
+// ── Damage / Heal buttons ──────────────────────────────────────────────────
+// Minus (−): subtract hp_change from current HP, floor at 0
+on("clicked:damage", function() {
+ getAttrs(["hp", "hp_change"], function(v) {
+ const current = parseInt(v.hp) || 0;
+ const change = parseInt(v.hp_change) || 0;
+ const newHp = Math.max(0, current - change);
+ setAttrs({ hp: newHp });
+ });
+});
+
+// Plus (+): add hp_change to current HP, ceiling at hp_max
+on("clicked:heal", function() {
+ getAttrs(["hp", "hp_max", "hp_change"], function(v) {
+ const current = parseInt(v.hp) || 0;
+ const max = parseInt(v.hp_max) || 0;
+ const change = parseInt(v.hp_change) || 0;
+ const newHp = Math.min(max, current + change);
+ setAttrs({ hp: newHp });
+ });
+});
+
//# sourceURL=espergenesis.js
diff --git a/Esper_Genesis_5E/src/charactermancer/l1/class.html b/Esper_Genesis_5E/src/charactermancer/l1/class.html
index 1e61e4916a..571f3fb965 100644
--- a/Esper_Genesis_5E/src/charactermancer/l1/class.html
+++ b/Esper_Genesis_5E/src/charactermancer/l1/class.html
@@ -146,7 +146,7 @@
Back
diff --git a/Esper_Genesis_5E/src/charactermancer/l1/l1.html b/Esper_Genesis_5E/src/charactermancer/l1/l1.html
index 9e8aa76784..7dbc694552 100644
--- a/Esper_Genesis_5E/src/charactermancer/l1/l1.html
+++ b/Esper_Genesis_5E/src/charactermancer/l1/l1.html
@@ -41,7 +41,7 @@
Choose a race:
Choose
- Custom
+ Custom
i
@@ -165,7 +165,7 @@
Subrace:
Choose
- Custom
+ Custom
i
@@ -292,7 +292,7 @@
Back
@@ -454,7 +454,7 @@
Back
@@ -621,7 +621,7 @@
Choose a Background :
Choose
- Custom
+ Custom
@@ -699,7 +699,7 @@
Back
@@ -861,7 +861,7 @@
Back
@@ -890,7 +890,7 @@
Back
@@ -1087,7 +1087,7 @@
Back
@@ -1151,7 +1151,7 @@
Back
@@ -1223,12 +1223,12 @@
-
Spells
-
+
Powers
+
Return to:
- SPELLS
+ POWERS
diff --git a/Esper_Genesis_5E/src/charactermancer/l1/l1.js b/Esper_Genesis_5E/src/charactermancer/l1/l1.js
index ccc374ce66..28a0f19692 100644
--- a/Esper_Genesis_5E/src/charactermancer/l1/l1.js
+++ b/Esper_Genesis_5E/src/charactermancer/l1/l1.js
@@ -107,7 +107,7 @@
});
}
});
- if(mancerdata["l1-race"] && mancerdata["l1-race"].values.race == "Rules:Races") {
+ if(mancerdata["l1-race"] && mancerdata["l1-race"].values.race == "Rules:Species") {
_.each(abilityList, function(ability){
var custom = mancerdata["l1-race"].values["race_custom_" + ability.toLowerCase()] || false;
if(custom) {
@@ -115,7 +115,7 @@
}
});
}
- if(mancerdata["l1-race"] && mancerdata["l1-race"].values.subrace == "Rules:Races") {
+ if(mancerdata["l1-race"] && mancerdata["l1-race"].values.subrace == "Rules:Species") {
_.each(abilityList, function(ability){
var custom = mancerdata["l1-race"].values["subrace_custom_" + ability.toLowerCase()] || false;
if(custom) {
@@ -356,15 +356,15 @@
var additionalList = {};
var blobs = getRelevantBlobs(mancerdata, "1", "l1");
- //First look through all Blobs for any blob.Powers
+ //First look through all Blobs for any blob.Spells or blob.Powers
_.each(blobs.all, function(blob) {
- if(blob.Powers) {
- var spells = JSON.parse(blob.Powers);
+ if(blob.Spells || blob.Powers) {
+ var spells = JSON.parse(blob.Spells || blob.Powers);
//Examine each spell to determine if it is "Extended List". "Extended List" adds to the classes spell list.
//Ravnica Guilds backgrounds such as Dimir Operative are examples of this
_.each(spells, function(spell) {
if(spell["Expanded List"]) {
- expandedList[spell.Level] = expandedList[spell.Level] ? expandedList[spell.Level].concat(spell["Expanded List"]) : spell["Expanded List"];
+ expandedList[spell.Level || spell.Rank] = expandedList[spell.Level || spell.Rank] ? expandedList[spell.Level || spell.Rank].concat(spell["Expanded List"]) : spell["Expanded List"];
}
});
}
@@ -388,12 +388,12 @@
//Looks through the blobs for Spells attribute
//class.Powers contains the information for how many spells are choosen at each level & Prepared spells to be selected based on ability modifer + 1
//[subclass, background, race}.Powers will contain KNOWN, CHOSEN, or EXPANDED LIST for extra spells granted by these sections
- if(blob.Powers) {
- var spells = JSON.parse(blob.Powers);
+ if(blob.Spells || blob.Powers) {
+ var spells = JSON.parse(blob.Spells || blob.Powers);
allSpells[parentsection] = allSpells[parentsection] || {known: [], choices: []}
_.each(spells, function(spell) {
var numSpells = 0;
- expandedList[spell.Level] = expandedList[spell.Level] || [];
+ expandedList[spell.Level || spell.Rank] = expandedList[spell.Level || spell.Rank] || [];
//class.Powers will contain Prepared and Choose.
//These are used to populate the number of selects needed for each spell lists on the Spells slide
if(spell.Prepared) {
@@ -405,17 +405,17 @@
//If Spells are to be Chosen or Prepared add them to a class list, expand the list, and set the Ability modifier & Level
if(numSpells > 0) {
_.times(numSpells, function(n) {
- var thisspell = {Level: parseInt(spell.Level)};
+ var thisspell = {Level: parseInt(spell.Level || spell.Rank)};
thisspell.List = spell.List ? spell.List : classname;
thisspell.AddList = additionalList[parentsection];
thisspell.Ability = spell.Ability ? spell.Ability : classAbility;
- if(parentsection == "class") thisspell["Expanded List"] = expandedList[spell.Level];
+ if(parentsection == "class") thisspell["Expanded List"] = expandedList[spell.Level || spell.Rank];
allSpells[parentsection].choices.push(thisspell);
});
}
//Add any spells that are already known from sections such as Forge Domain Cleric starts with identify & searing smite
_.each(spell.Known, function(known) {
- var thisspell = {Name: known, Level: parseInt(spell.Level)};
+ var thisspell = {Name: known, Level: parseInt(spell.Level || spell.Rank)};
thisspell.Ability = spell.Ability ? spell.Ability : classAbility;
thisspell.Source = parentsection;
allSpells[parentsection].known.push(thisspell);
@@ -1250,21 +1250,12 @@
};
var isTashaEnabled = data => {
- data = data || getCharmancerData();
- let enabled = false;
- const customizeOrigin = (SheetUtils.checkPath(data, "['l1-race']['values']['customize_origin']") && data['l1-race']['values']['customize_origin'] == 1)
- if(SheetUtils.checkPath(data, "['l1-welcome']['values']['has_tasha']") && data['l1-welcome']['values']['has_tasha'] == 1 && customizeOrigin) enabled = true;
- //return enabled;
- return false;
+ return false; // Tasha's Cauldron rules not used in Esper Genesis
};
var hasTasha = callback => {
- getCompendiumPage('Customizing Your Origin', eventInfo => {
- let enabled = false;
- if(eventInfo.expansion && SheetUtils.checkPath(eventInfo, "['data']['Category']") && eventInfo['data']['Category'] === 'Rules') enabled = true;
- //callback(enabled);
- return false;
- });
+ // Tasha's Cauldron rules not used in Esper Genesis
+ return false;
};
var clearTasha = (eventinfo, subraceOnly, callback) => {
@@ -1317,7 +1308,7 @@
clearRepeatingSections("subrace_holder");
}
- if(eventinfo.newValue === "Rules:Races") {
+ if(eventinfo.newValue === "Rules:Species") {
//Clears saved data for this field
getCompendiumPage("");
setAttrs(reset, function() {
@@ -1420,7 +1411,7 @@
clearRepeatingSections("subrace_holder");
}
- if(eventinfo.newValue === "Rules:Races") {
+ if(eventinfo.newValue === "Rules:Species") {
//Clears saved data for this field
getCompendiumPage("");
setAttrs(reset, function() {
@@ -2244,7 +2235,7 @@
var mancerdata = getCharmancerData();
var known = knownSpells().known;
_.each(mancerdata["l1-spells"].repeating, function(id) {
- disableCharmancerOptions(id + "_choice", known, {category: "Powers"});
+ disableCharmancerOptions(id + "_choice", known, {category: "Spells"});
});
});
@@ -2310,7 +2301,7 @@
if(_.last(eventinfo.sourceSection.split("_")) == "spellrow") {
spell_name = data["l1-spells"].values[eventinfo.sourceAttribute];
} else {
- spell_name = data["l1-spells"].values[eventinfo.sourceSection + "_choice"] ? data["l1-spells"].values[eventinfo.sourceSection + "_choice"] : "Rules:Spells";
+ spell_name = data["l1-spells"].values[eventinfo.sourceSection + "_choice"] ? data["l1-spells"].values[eventinfo.sourceSection + "_choice"] : "Rules:Esper Powers";
card = data["l1-spells"].values[eventinfo.sourceSection + "_choice"] ? card : "";
}
changeCompendiumPage("sheet-spells-info", spell_name, card);
@@ -2572,7 +2563,7 @@
var thisSpell = spell;
thisSpell += "
i ";
thisSpell += "
";
- toset[rowid + "_known" + index] = "Powers:" + spell;
+ toset[rowid + "_known" + index] = "Spells:" + spell;
knownspells.push(thisSpell);
});
repupdate[rowid + " label p"] = knownspells.join(", ");
@@ -2584,8 +2575,8 @@
var toset = {};
var lists = [spell.List];
if(spell.AddList) lists = lists.concat(spell.AddList);
- var choices = "Category:Powers Classes:*" + lists.join("|*") + " Rank:" + spell.Level;
- var settings = {category: "Powers", disable: spellData.known};
+ var choices = "Category:Spells Classes:*" + lists.join("|*") + " Level:" + spell.Level;
+ var settings = {category: "Spells", disable: spellData.known};
toset[id + "_info"] = spell.Ability;
if(section != "class") toset[id + "_custom"] = section;
repids.push(id);
@@ -2741,7 +2732,7 @@
for(let i=0; i
Your weight is ' + mancerdata["l1-bio"].values.weight + '.';};
- if(mancerdata["l1-bio"].values.eyes) {
- set["bio_info"] += 'Your eye color is ' + mancerdata["l1-bio"].values.eyes + '.
';};
-
- if(mancerdata["l1-bio"].values.hair) {
- set["bio_info"] += 'Your hair is ' + mancerdata["l1-bio"].values.hair + '.
';};
-
- if(mancerdata["l1-bio"].values.skin) {
- set["bio_info"] += 'Your skin is ' + mancerdata["l1-bio"].values.skin + '.
';};
+ if(mancerdata["l1-bio"].values.character_appearance) {
+ set["bio_info"] += '' + mancerdata["l1-bio"].values.character_appearance + '
';};
if (mancerdata["l1-bio"].values.previous_race != racename) {
setCharmancerText({
- race_warning: 'Each race has unique look and different names. You might want to adjust your choices to reflect your race.
'
+ race_warning: 'Each species has a unique look and different names. You might want to adjust your choices to reflect your species.
'
});
};
};
};
if(mancerdata["l1-race"] && racename) {
- set["race_info"] = 'Your race is ' + racename + '
';
+ set["race_info"] = 'Your species is ' + racename + '
';
if(!mancerdata["l1-race"].values.alignment) set["race_info"] += 'You haven\'t chosen your alignment.
';
set["race_info"] += handleMissing("race");
if(mancerdata["l1-race"].values["has_subrace"] == "true") {
if(subracename) {
- set["race_info"] += 'Your subrace is ' + subracename + '
';
+ set["race_info"] += 'Your archetype is ' + subracename + '
';
set["race_info"] += handleMissing("subrace");
} else {
- if(mancerdata["l1-race"].values.subrace == "Rules:Races" && !mancerdata["l1-race"].values.subrace_name) {
- set["race_info"] = 'You need to pick a name for your custom subrace!
';
+ if(mancerdata["l1-race"].values.subrace == "Rules:Species" && !mancerdata["l1-race"].values.subrace_name) {
+ set["race_info"] = 'You need to pick a name for your custom archetype!
';
} else {
- set["race_info"] += 'You have not selected a subrace!
';
+ set["race_info"] += 'You have not selected an archetype!
';
}
ready = false;
showChoices(["race_button"]);
@@ -2956,15 +2941,15 @@
console.log("Unknown race spell error: " + error);
}
});
- if(mancerdata["l1-race"].values.race == "Rules:Races") {
- if(!mancerdata["l1-race"].values.size) set["race_info"] += 'You have not selected a size for your custom race!
';
- if(!mancerdata["l1-race"].values.speed) set["race_info"] += 'You have not selected a walking speed for your custom race!
';
+ if(mancerdata["l1-race"].values.race == "Rules:Species") {
+ if(!mancerdata["l1-race"].values.size) set["race_info"] += 'You have not selected a size for your custom species!
';
+ if(!mancerdata["l1-race"].values.speed) set["race_info"] += 'You have not selected a walking speed for your custom species!
';
}
} else {
- if(mancerdata["l1-race"] && mancerdata["l1-race"].values.race == "Rules:Races" && !mancerdata["l1-race"].values.race_name) {
- set["race_info"] = 'You need to pick a name for your custom race!
';
+ if(mancerdata["l1-race"] && mancerdata["l1-race"].values.race == "Rules:Species" && !mancerdata["l1-race"].values.race_name) {
+ set["race_info"] = 'You need to pick a name for your custom species!
';
} else {
- set["race_info"] = 'You have not selected a race!
';
+ set["race_info"] = 'You have not selected a species!
';
}
ready = false;
showChoices(["race_button"]);
@@ -3131,7 +3116,7 @@
currentClass = getName("class", mancerdata, true) + getName("subclass", mancerdata, true);
set["spells_info"] = "";
if((raceSpells + classSpells) == 0) {
- set["spells_info"] += 'The arcane is a mystery to you.
';
+ set["spells_info"] += 'Cosmic forces are a mystery to you.
';
deleteCharmancerData(["l1-spells"]);
spellsready = false;
} else if(prevRace != currentRace || prevClass != currentClass || mancerdata["l1-spells"].values.race_number != raceSpells || mancerdata["l1-spells"].values.class_number != classSpells) {
@@ -3141,7 +3126,7 @@
toDelete.push("race_level1_choice" + x);
}
if(raceSpells > 0 && mancerdata["l1-spells"].values.race_number > 0) {
- set["spells_info"] += 'Your racial spells were reset because your options have changed.
';
+ set["spells_info"] += 'Your species powers were reset because your options have changed.
';
}
}
if(prevClass != currentClass || mancerdata["l1-spells"].values.class_number > classSpells) {
@@ -3159,7 +3144,7 @@
spellsready = false;
showChoices(["spells_button"]);
} else {
- set["spells_info"] = 'The arcane is a mystery to you.
';
+ set["spells_info"] = 'Cosmic forces are a mystery to you.
';
spellsready = false
}
@@ -3223,7 +3208,7 @@
/* Info Button Listeners */
on("clicked:info_race", function(eventinfo) {
var data = getCharmancerData();
- var race = data["l1-race"] && data["l1-race"].values.race ? data["l1-race"].values.race : "Rules:Races";
+ var race = data["l1-race"] && data["l1-race"].values.race ? data["l1-race"].values.race : "Rules:Species";
changeCompendiumPage("sheet-race-info", race);
});
@@ -3337,7 +3322,7 @@
page.name = page.name.replace(/@@!!@@/g,""); // Hacky bugfix to prevent custom names from matching unavailable content
nextGet = nextGet.concat(getOtherDrops(page.data));
if(page.data["data-Starting Gold"] && !noEquipmentDrop) {
- set["gp"] += parseInt(page.data["data-Starting Gold"]);
+ set["cu"] += parseInt(page.data["data-Starting Gold"]);
}
allPageData.push(page);
});
@@ -3410,15 +3395,15 @@
var silentattrs = ["class_resource_name", "class_resource", "class_resource_max", "other_resource_name", "other_resource", "other_resource_max", "other_resource_itemid", "class", "class_display", "subclass", "hitdietype", "hitdie_final", "race", "subrace", "race_display", "custom_class", "cust_classname"];
var clearset = {};
const globalModifiers = ["global_damage_mod_flag", "global_ac_mod_flag", "global_attack_mod_flag", "global_save_mod_flag", "global_skill_mod_flag"];
- var clearattrs = ["hp", "hp_max", "size", "speed", "gp", "alignment", "spellcasting_ability", "cust_hitdietype", "cust_spellslots", "cust_spellcasting_ability", "ac", "jack_bonus", "jack_attr", "death_save_bonus", "weighttotal", "initiative_bonus", "hit_dice", "hit_dice_max", "pb", "jack", "caster_level", "spell_attack_mod", "spell_attack_bonus", "spell_save_dc", "passive_wisdom", "custom_ac_base", "custom_ac_part1", "custom_ac_part2", "custom_ac_shield", "background"].concat(globalModifiers);
+ var clearattrs = ["hp", "hp_max", "size", "speed", "cu", "gp", "alignment", "spellcasting_ability", "cust_hitdietype", "cust_spellslots", "cust_spellcasting_ability", "ac", "jack_bonus", "jack_attr", "death_save_bonus", "weighttotal", "initiative_bonus", "hit_dice", "hit_dice_max", "pb", "jack", "caster_level", "spell_attack_mod", "spell_attack_bonus", "spell_save_dc", "passive_wisdom", "custom_ac_base", "custom_ac_part1", "custom_ac_part2", "custom_ac_shield", "background"].concat(globalModifiers);
var classname = "";
- var set = {gp: 0};
+ var set = {cu: 0};
var allDrops = [];
var currentDrop = 0;
var totalDrops = 1;
var allSkills = ["athletics", "acrobatics", "sleight_of_hand", "stealth", "arcana", "history", "investigation", "nature", "religion", "animal_handling", "insight", "medicine", "perception", "survival","deception", "intimidation", "performance", "persuasion"];
var allAbilities = SheetUtils.toLowerCase(abilityList);
- var eraseSections = ["attack", "inventory", "traits", "resource", "proficiencies", "tool", "damagemod", "spell-cantrip", "hpmod", "acmod", "tohitmod", "savemod", "skillmod"];
+ var eraseSections = ["attack", "inventory", "traits", "resource", "proficiencies", "tool", "damagemod", "spell-prime", "hpmod", "acmod", "tohitmod", "savemod", "skillmod"];
for(var x=1; x<=9; x++) {
eraseSections.push("spell-" + x);
}
@@ -3667,10 +3652,10 @@
//Next, add spell drops
_.each(spells.all, function(spell) {
- var spelldata = {name: "Powers:" + spell.Name};
+ var spelldata = {name: "Spells:" + spell.Name};
spelldata.data = {"spellcasting_ability": spell.Ability};
if(spell.Source == "race") {
- spelldata.data.spellclass = "Racial";
+ spelldata.data.spellclass = "Species";
} else {
spelldata.data.spellclass = classname;
};
@@ -3707,13 +3692,13 @@
}
});
- set["gp"] = parseInt(data["l1-equipment"].values["background_starting_gold"]) || 0;
+ set["cu"] = parseInt(data["l1-equipment"].values["background_starting_gold"]) || 0;
} else if(data["l1-equipment"].values["equipment_type"] == "gold" && data["l1-equipment"].values["starting_gold"]) {
- set["gp"] = parseInt(data["l1-equipment"].values["starting_gold"]);
+ set["cu"] = parseInt(data["l1-equipment"].values["starting_gold"]);
}
//Add the bio info
if(data["l1-bio"]) {
- _.each(["character_name", "age", "height", "weight", "eyes", "hair", "skin"], function(type) {
+ _.each(["character_name", "age", "height", "weight", "character_appearance"], function(type) {
if(data["l1-bio"].values[type]) {
set[type] = data["l1-bio"].values[type] || "";
}
@@ -3771,15 +3756,12 @@
getAllPages(allDrops, function() {
setCharmancerText({"mancer_progress" :'
'});
doAllDrops(allPageData, function() {
- console.log("DOING THE FINAL SET!!");
setAttrs(set, function() {
setCharmancerText({"mancer_progress" :'
'});
update_class();
organize_section_proficiencies();
update_skills(allSkills);
update_attacks("all");
- var endTime = Date.now();
- console.log(`Elapsed time: ${(endTime-startTime)/1000}`);
finishCharactermancer();
});
});
diff --git a/Esper_Genesis_5E/src/charactermancer/l1/l1.pug b/Esper_Genesis_5E/src/charactermancer/l1/l1.pug
index 2596cdf2c9..8b276f0731 100644
--- a/Esper_Genesis_5E/src/charactermancer/l1/l1.pug
+++ b/Esper_Genesis_5E/src/charactermancer/l1/l1.pug
@@ -73,7 +73,7 @@ charmancer.sheet-charmancer-l1-race
span(data-i18n='charmancer-choose-race')
select(accept='Category:Races' name='comp_race' required)
option(data-i18n='choose' value='')
- option.custom(data-i18n='custom' value='Rules:Races')
+ option.custom(data-i18n='custom' value='Rules:Species')
+buttonMancerInfo('race')
.choice.custom_race
label.hilite(data-i18n='charmancer-custom-race-name')
@@ -145,7 +145,7 @@ charmancer.sheet-charmancer-l1-race
span(data-i18n='subrace')
select.choose_subrace(name='comp_subrace' required)
option(data-i18n='choose' value='')
- option.custom(data-i18n='custom' value='Rules:Races')
+ option.custom(data-i18n='custom' value='Rules:Species')
+buttonMancerInfo('subrace')
.choice.custom_subrace
label.hilite
@@ -211,7 +211,7 @@ charmancer.sheet-charmancer-l1-race
span(data-i18n='spell-list')
select(name='comp_custom_race_spell_list')
+classOptions()
- +infoDiv('race','Rules:Races')
+ +infoDiv('race','Rules:Species')
+bottomBar('welcome', 'class')
+cancelPrompt('race')
input(name='comp_has_subrace' type='hidden')
@@ -409,7 +409,7 @@ charmancer.sheet-charmancer-l1-equipment
select.choice.background_possible(class=`background_equipment_choice${backEquipInt}` name=`comp_background_equipment_choice${backEquipInt}`)
option(data-i18n='choose' value='')
- backEquipInt++
- +infoDiv('background','Rules:Equipment')
+ +infoDiv('background','Rules:Gear and Equipment')
+bottomBar('background', 'spells')
+cancelPrompt('equipment')
@@ -526,7 +526,7 @@ charmancer.sheet-charmancer-l1-feat
select.feat_possible.other_options_and_features_choice1(name='comp_other_options_and_features_choice2')
option(data-i18n='choose' value='')
.info.feat-info-container.choice.yes_feat
- .sheet-compendium-page.sheet-feat-info(accept='Rules:Feats')
+ .sheet-compendium-page.sheet-feat-info(accept='Rules:Feats (EG)')
+bottomBar('spells', 'bio')
+cancelPrompt('feat')
@@ -537,14 +537,18 @@ charmancer.sheet-charmancer-l1-bio
.topbar-holder
.choices
input(name='comp_previous_race' type='hidden' value='')
- each val in ['Name', 'Age', 'Height', 'Weight', 'Eyes', 'Hair', 'Skin']
+ each val in ['Name', 'Age', 'Height', 'Weight']
- const attributeName = val === 'Name' ? 'character_name' : val.toLowerCase();
- - const datai18n = val === 'Name' ? 'char-name-u' : val === 'Eyes' ? `eye-u` : `${val.toLowerCase()}-u`;
+ - const datai18n = val === 'Name' ? 'char-name-u' : `${val.toLowerCase()}-u`;
.row
label
div(data-i18n=datai18n)
input(name=`comp_${attributeName}` type='text')
- +infoDiv('race','Rules:Races')
+ .row
+ label
+ div(data-i18n='char-appearance-u')
+ textarea(name='comp_character_appearance' style='width:100%; min-height:80px; resize:vertical;')
+ +infoDiv('race','Rules:Species')
+bottomBar('feat', 'summary')
+cancelPrompt('bio')
diff --git a/Esper_Genesis_5E/src/charactermancer/lp/lp.html b/Esper_Genesis_5E/src/charactermancer/lp/lp.html
index 74c7b78792..9769eb5d2d 100644
--- a/Esper_Genesis_5E/src/charactermancer/lp/lp.html
+++ b/Esper_Genesis_5E/src/charactermancer/lp/lp.html
@@ -289,7 +289,7 @@
Back
@@ -347,7 +347,7 @@
Back
@@ -427,7 +427,7 @@
diff --git a/Esper_Genesis_5E/src/charactermancer/lp/lp.js b/Esper_Genesis_5E/src/charactermancer/lp/lp.js
index c432f5eb38..bb4cf7f0fd 100644
--- a/Esper_Genesis_5E/src/charactermancer/lp/lp.js
+++ b/Esper_Genesis_5E/src/charactermancer/lp/lp.js
@@ -3,6 +3,13 @@
/****** LEVEL UP MANCER WORKERS ******/
/*********************************************************************/
+ // Safe JSON parse — replaces bare JSON.parse() calls throughout LP workers.
+ // Returns fallback (default: null) on invalid input instead of throwing.
+ var safeParseJSON = function(str, fallback) {
+ if (typeof str !== "string" || str === "") return fallback !== undefined ? fallback : null;
+ try { return JSON.parse(str); } catch(e) { return fallback !== undefined ? fallback : null; }
+ };
+
//Helper function to update the text in the top bar
var recalcLpData = function(blobs) {
var mancerdata = getCharmancerData();
@@ -81,7 +88,7 @@
var leveldata = getLevelingData(mancerdata);
var abilities = abilities || getAbilityTotals(mancerdata, blobs);
var previous = mancerdata["lp-welcome"].values["previous_attributes"] ? JSON.parse(mancerdata["lp-welcome"].values["previous_attributes"]) : {};
- var prev_repeat = JSON.parse(mancerdata["lp-welcome"].values["previous_repeating"]), hpmod = prev_repeat["hpmod"];
+ var prev_repeat = safeParseJSON(mancerdata["lp-welcome"].values["previous_repeating"], {}), hpmod = prev_repeat["hpmod"];
var newhp = 0;
var additionalhp = 0;
var totalpreviouslevel = parseInt(previous["base_level"]);
@@ -166,7 +173,7 @@
return x[0].toUpperCase() + x.substr(1, x.length);
}).join(" ");
};
- var spellSections = ["spell-cantrip"];
+ var spellSections = ["spell-prime"];
var allSkills = ["athletics", "acrobatics", "sleight_of_hand", "stealth", "arcana", "history", "investigation", "nature", "religion", "animal_handling", "insight", "medicine", "perception", "survival","deception", "intimidation", "performance", "persuasion"];
var skillget = [];
for(var x=1; x<=9; x++) {
@@ -853,7 +860,9 @@
}
_.each(thisclass.class.blobs, function(blob) {
if(blob["Spell Slots"] && parseInt(blob.Level) <= (thisclass.currentlevel + thisclass.addlevel)) {
- _.each(JSON.parse(blob["Spell Slots"]), function(slots, name) {
+ var rawSlots = blob["Spell Slots"];
+ var parsedSlots = (typeof rawSlots === "string") ? safeParseJSON(rawSlots, {}) : (rawSlots || {});
+ _.each(parsedSlots, function(slots, name) {
if(parseInt(_.last(name.split(" "))) > maxspell) maxspell = parseInt(_.last(name.split(" ")));
});
}
@@ -1081,7 +1090,6 @@
});
const restorePreviousASI = function(prevData, callback) {
- console.log('Restoring previous state...');
if(!SheetUtils.checkPath(prevData, "['lp-asi']['values']")) {
callback();
return;
@@ -1153,7 +1161,7 @@
_.each(previousspells, function(spell) {
spelldata[spell.spellname] = {level: spell.spelllevel};
if(spell.spellclass) spelldata[spell.spellname].spellclass = spell.spellclass;
- if(spell.spellclass && spell.spellclass.toLowerCase() == "racial") spelldata[spell.spellname].known = "Racial";
+ if(spell.spellclass && spell.spellclass.toLowerCase() == "racial") spelldata[spell.spellname].known = "Species";
if(spell.spellsource) spelldata[spell.spellname].known = spell.spellsource;
});
_.each(leveldata, function(level) {
@@ -1182,8 +1190,8 @@
}
_.each(data.blobs, function(blob, blobname) {
if(blob.Multiclass != "no" && ((parseInt(blob.Level) <= thislevel || blob.Level == "all") && !blob.Group) || choices.includes(blobname)) {
- if(blob.Powers) {
- var blobspells = JSON.parse(blob.Powers);
+ if(blob.Spells || blob.Powers) {
+ var blobspells = safeParseJSON(blob.Spells || blob.Powers, []);
_.each(blobspells, function(blobspell) {
if(blobspell.Known) {
_.each(blobspell.Known, function(spell) {
@@ -1191,8 +1199,8 @@
spelldata[spell].known = blobspell.Source || data.Category.substring(0, data.Category.length - 2);
spelldata[spell].spellclass = thisclass.classname;
if(dataname.substring(0,5) != "class") {
- spelldata[spell].known = data.Category.substring(0, data.Category.length - 1);
- spelldata[spell].spellclass = data.Category == "Races" ? "Racial" : data.Category.substring(0, data.Category.length - 1);
+ spelldata[spell].known = data.Category == "Races" ? "Species" : data.Category.substring(0, data.Category.length - 1);
+ spelldata[spell].spellclass = data.Category == "Races" ? "Species" : data.Category.substring(0, data.Category.length - 1);
}
if(blobspell.Ability) {
spelldata[spell].ability = blobspell.Ability;
@@ -1211,7 +1219,7 @@
//Gater spells from class features
_.each(page.values, function(value, name) {
if(name.substr(-18) === "_utilityrow_powers") {
- spelldata = _.extend(spelldata, JSON.parse(value));
+ spelldata = _.extend(spelldata, safeParseJSON(value, {}));
}
});
}
@@ -1220,6 +1228,88 @@
return spelldata;
};
+ // ---- Feature 7: LP Spell List Helpers (ported from 5e OGL) ----
+ // Returns the known spells as a flat array with name merged in.
+ var getKnownLPSpellList = function() {
+ var list = [];
+ var known = getKnownLpSpells();
+ Object.keys(known).forEach(function(spell) {
+ var newSpell = _.extend({name: spell}, known[spell]);
+ if (newSpell.level && String(newSpell.level).toLowerCase() === "cantrip") newSpell.level = 0;
+ list.push(newSpell);
+ });
+ return list;
+ };
+
+ // Returns true if a spell with the given name and level exists in the known list.
+ var isExistingSpell = function(name, level) {
+ var known = getKnownLPSpellList().filter(function(spell) {
+ return spell.hasOwnProperty("name") && spell.name == name &&
+ spell.hasOwnProperty("level") && spell.level == level;
+ });
+ return known.length > 0;
+ };
+
+ // Returns spells the player has checked/selected on the lp-spells page.
+ // Adapted for EG's repeating section pattern (not 5e OGL's key-based pattern).
+ var getSelectedSpells = function(filters) {
+ var spells = [];
+ var spellpage = getCharmancerData()["lp-spells"];
+ if (!spellpage || !spellpage.repeating) return spells;
+ _.each(spellpage.repeating, function(repid) {
+ if (spellpage.values[repid + "_checked"]) {
+ spells.push({
+ name: spellpage.values[repid + "_name"],
+ level: spellpage.values[repid + "_level"],
+ ability: spellpage.values[repid + "_ability"],
+ source: spellpage.values[repid + "_source"],
+ spellclass: spellpage.values[repid + "_class"],
+ existing: spellpage.values[repid + "_existing"] || false
+ });
+ }
+ });
+ if (typeof filters === "object") {
+ Object.keys(filters).forEach(function(filterBy) {
+ spells = spells.filter(function(spell) {
+ return spell.hasOwnProperty(filterBy) && spell[filterBy] == filters[filterBy];
+ });
+ });
+ }
+ return spells;
+ };
+
+ // Groups selected spells by level. Pass an optional filter object.
+ var getSelectedSpellsByLevel = function(filter) {
+ var byLevel = {};
+ var selectedSpells = getSelectedSpells(filter);
+ selectedSpells.forEach(function(spell) {
+ if (!byLevel[spell.level]) byLevel[spell.level] = [];
+ byLevel[spell.level].push(spell);
+ });
+ return byLevel;
+ };
+
+ // Returns known spells annotated with whether they were removed (unchecked) on the spells page.
+ var getKnownLPSpellListWithRemoved = function() {
+ var list = [];
+ var selectedSpells = getSelectedSpells();
+ var knownSpells = getKnownLPSpellList();
+ knownSpells.forEach(function(known) {
+ var filtered = selectedSpells.filter(function(selected) {
+ return selected.name == known.name && selected.level == known.level;
+ });
+ if (filtered.length === 0) list.push(_.extend({removed: true}, known));
+ else list.push(_.extend({removed: false}, known));
+ });
+ return list;
+ };
+
+ // Returns a stable, CSS-safe attribute key for a spell name + level combination.
+ var getSanitizedSpellName = function(name, level) {
+ return "spell_" + level + "_" + name.toLowerCase().replace(/[^a-z]/g, "");
+ };
+ // ---- End Feature 7 helpers ----
+
var getNewSpells = function(mancerdata, leveldata, blobs) {
mancerdata = mancerdata || getCharmancerData();
leveldata = leveldata || getCharmancerData();
@@ -1237,16 +1327,15 @@
thisclass.newspells = 0;
_.each(["class", "subclass"], function(section) {
if(level[section]) {
+ var currCantripBlobLevel = 0;
+ var prevCantripBlobLevel = 0;
_.each(level[section].blobs, function(blob) {
+ var blobLvl = parseInt(blob.Level);
if(blob.Level == thislevel) {
if(blob["Talents Known"]) {
currentknown = parseInt(blob["Talents Known"]);
if(level.class["data-Spell Replace"]) result = true;
}
- if(blob.Cantrips) {
- thisclass.cantrips = true;
- currentcantrips = parseInt(blob.Cantrips);
- }
if(blob["Spells Prepared"]) {
result = true;
}
@@ -1256,10 +1345,17 @@
prevknown = prevlevel === 0 ? 0 : parseInt(blob["Talents Known"]);
if(prevlevel === 0) thisclass.newspells = parseInt(blob["Talents Known"]);
}
- if(blob.Cantrips) {
- thisclass.cantrips = true;
- prevcantrips = prevlevel === 0 ? 0 : parseInt(blob.Cantrips);
- }
+ }
+ // Carry-forward: current Cantrips
+ if(!isNaN(blobLvl) && blobLvl <= thislevel && blobLvl > currCantripBlobLevel && blob.Cantrips) {
+ currCantripBlobLevel = blobLvl;
+ thisclass.cantrips = true;
+ currentcantrips = parseInt(blob.Cantrips);
+ }
+ // Carry-forward: prev Cantrips
+ if(prevlevel > 0 && !isNaN(blobLvl) && blobLvl <= prevlevel && blobLvl > prevCantripBlobLevel && blob.Cantrips) {
+ prevCantripBlobLevel = blobLvl;
+ prevcantrips = parseInt(blob.Cantrips);
}
if(level[section]["data-Spell Add"]) {
spelladd = parseInt(level[section]["data-Spell Add"]);
@@ -1277,7 +1373,7 @@
if(blobs.sorted[`class${level.classnumber}${section}`]) {
_.each(blobs.sorted[`class${level.classnumber}${section}`], function(blob) {
if(blob.Spells) {
- let spells = JSON.parse(blob.Spells);
+ let spells = safeParseJSON(blob.Spells, []);
_.each(spells, function(spell) {
if(spell.Choose) {
result = true;
@@ -1329,26 +1425,24 @@
var currentcantrips = 0;
var spelladd = 0;
thisclass.list = [thisclass.class];
+ thisclass.hasSpellReplace = !!level.class["data-Spell Replace"];
totallevel += thislevel;
thisclass.newspells = 0;
_.each(["class", "subclass"], function(section) {
if(level[section]) {
if(level[section]["data-Spell List"]) thisclass.list = [level[section]["data-Spell List"]];
if(level[section]["Spellcasting Ability"]) thisclass.ability = level[section]["Spellcasting Ability"];
+ // Carry-forward trackers for sparse class tables (EG compendium only
+ // lists a field when its value changes, not at every level).
+ var maxRankBlobLevel = 0; // highest blob level seen with "Maximum Talent Rank" ≤ thislevel
+ var currCantripBlobLevel = 0; // highest blob level seen with "Cantrips" ≤ thislevel
+ var prevCantripBlobLevel = 0; // highest blob level seen with "Cantrips" ≤ prevlevel
_.each(level[section].blobs, function(blob) {
+ var blobLvl = parseInt(blob.Level);
if(blob.Level == thislevel) {
- if(blob["Talents Known"]) {
- var maxRank = JSON.parse(blob["Maximum Talent Rank"]);
- thisclass.maxlevel = parseInt(maxRank);
- spellmaxlevel = Math.max(thisclass.maxlevel, spellmaxlevel);
- }
if(blob["Talents Known"]) {
currentknown = parseInt(blob["Talents Known"]);
}
- if(blob.Cantrips) {
- thisclass.cantrips = true;
- currentcantrips = parseInt(blob.Cantrips);
- }
if(blob["Spells Prepared"]) {
var splitted = blob["Spells Prepared"].split("+").map((x) => {return x.trim()});
thisclass.prepared = 0;
@@ -1367,11 +1461,46 @@
prevknown = prevlevel === 0 ? 0 : parseInt(blob["Talents Known"]);
if(prevlevel === 0) thisclass.newspells = parseInt(blob["Talents Known"]);
}
- if(blob.Cantrips) {
- thisclass.cantrips = true;
- prevcantrips = prevlevel === 0 ? 0 : parseInt(blob.Cantrips);
- if(knowncantrips < prevcantrips) prevcantrips = knowncantrips;
+ }
+ // Carry-forward: max available power rank.
+ // Primary path (5e compendium standard): derive from "Spell Slots" JSON —
+ // find the highest slot level key (e.g. "Level 2" → 2).
+ // Override path (EG custom field): "Maximum Talent Rank" takes precedence
+ // if present, allowing the compendium to explicitly set the value.
+ // Both use carry-forward so sparse tables work correctly.
+ // Defensive parse: blob fields may arrive as JSON strings or pre-parsed objects.
+ if(!isNaN(blobLvl) && blobLvl <= thislevel && blobLvl > maxRankBlobLevel) {
+ if(blob["Spell Slots"]) {
+ maxRankBlobLevel = blobLvl;
+ var rawSlots = blob["Spell Slots"];
+ var slots = (typeof rawSlots === "string") ? safeParseJSON(rawSlots, {}) : (rawSlots || {});
+ var slotKeys = _.keys(slots).sort();
+ if(slotKeys.length > 0) {
+ var derivedRank = parseInt(_.last(_.last(slotKeys).split(" ")));
+ if(!isNaN(derivedRank)) {
+ thisclass.maxlevel = derivedRank;
+ spellmaxlevel = Math.max(thisclass.maxlevel, spellmaxlevel);
+ }
+ }
}
+ if(blob["Maximum Talent Rank"]) {
+ maxRankBlobLevel = blobLvl;
+ var rawRank = blob["Maximum Talent Rank"];
+ thisclass.maxlevel = parseInt((typeof rawRank === "string") ? safeParseJSON(rawRank, rawRank) : rawRank);
+ spellmaxlevel = Math.max(thisclass.maxlevel, spellmaxlevel);
+ }
+ }
+ // Carry-forward: current Cantrips — most recent entry at or below thislevel
+ if(!isNaN(blobLvl) && blobLvl <= thislevel && blobLvl > currCantripBlobLevel && blob.Cantrips) {
+ currCantripBlobLevel = blobLvl;
+ thisclass.cantrips = true;
+ currentcantrips = parseInt(blob.Cantrips);
+ }
+ // Carry-forward: prev Cantrips — most recent entry at or below prevlevel
+ if(prevlevel > 0 && !isNaN(blobLvl) && blobLvl <= prevlevel && blobLvl > prevCantripBlobLevel && blob.Cantrips) {
+ prevCantripBlobLevel = blobLvl;
+ prevcantrips = parseInt(blob.Cantrips);
+ if(knowncantrips < prevcantrips) prevcantrips = knowncantrips;
}
if(blob.Level == "every" || blob.Level == thislevel) {
if(blob["Additional Spell List"]) thisclass.list.push(blob["Additional Spell List"]);
@@ -1380,6 +1509,12 @@
spelladd = parseInt(level[section]["data-Spell Add"]);
}
});
+ // Fallback: if carry-forward didn't set maxlevel (e.g. no Spell Slots field found
+ // in blobs), use the pre-computed maxspell from getLevelingData.
+ if(!thisclass.maxlevel && level.maxspell > 0) {
+ thisclass.maxlevel = level.maxspell;
+ spellmaxlevel = Math.max(thisclass.maxlevel, spellmaxlevel);
+ }
}
});
if(spelladd) {
@@ -1394,9 +1529,9 @@
if(blobs.sorted[`class${level.classnumber}${section}`]) {
_.each(blobs.sorted[`class${level.classnumber}${section}`], function(blob) {
if(blob.Spells) {
- let spells = JSON.parse(blob.Spells);
+ let spells = safeParseJSON(blob.Spells, []);
_.each(spells, function(spell) {
- if(spell.Choose && spell.Level === "0") {
+ if(spell.Choose && (spell.Level || spell.Rank) === "0") {
thisclass.newcantrips += parseInt(spell.Choose);
}
});
@@ -1423,7 +1558,7 @@
_.each(data.blobs, function(blob, blobname) {
if((parseInt(blob.Level) <= thislevel || blob.Level == "every") && blob.Multiclass != "no") {
if(blob.Spells) {
- var blobspells = JSON.parse(blob.Spells);
+ var blobspells = safeParseJSON(blob.Spells, []);
_.each(blobspells, function(thisspell) {
if(parseInt(thisspell.Level) <= spellmaxlevel) {
if(thisspell["Expanded List"]) {
@@ -1438,15 +1573,15 @@
}
});
if(knownlist) {
- queries.push("Category:Powers Name:" + knownlist.join("|"));
+ queries.push("Category:Spells Name:" + knownlist.join("|"));
}
_.each(classes, function(thisclass) {
if(thisclass.maxlevel || thisclass.newcantrips) {
newcantrips += thisclass.newcantrips || 0;
newspells += thisclass.newspells;
replace += thisclass.replace;
- if(!thisclass.prepared) prepared = false;
- thisquery = "Category:Powers Classes:*" + _.uniq(thisclass.list).join("|*") + " Rank:";
+ if(!thisclass.prepared || !thisclass.hasSpellReplace) prepared = false;
+ thisquery = "Category:Spells Classes:*" + _.uniq(thisclass.list).join("|*") + " Level:";
if(thisclass.cantrips) thisquery += "0|"
for(var x = 1; x <= thisclass.maxlevel; x++) {
thisquery += x;
@@ -1571,7 +1706,7 @@
}
});
} else {
- update[levelrow + " .sheet-spellstext .sheet-summary"] = "
You can add " + newspells + " new spells.
";
+ update[levelrow + " .sheet-spellstext .sheet-summary"] = "
You can add " + newspells + " new powers.
";
}
}
if(replace > 0) {
@@ -1631,7 +1766,7 @@
toSet[spellid + "_checked"] = "1";
toSet[spellid + "_existing"] = "1";
toSet[spellid + "_source"] = thisspell.known;
- update[spellid + " .sheet-classes"] = "
" + thisspell.known + " Spell ";
+ update[spellid + " .sheet-classes"] = "
" + thisspell.known + " Power ";
update[spellid + " .sheet-hardlock"] = "locked";
}
if(thisspell.spellclass) toSet[spellid + "_class"] = thisspell.spellclass;
@@ -1735,16 +1870,16 @@
update[cantripsection + " label .sheet-number"] = (known + newspells) + " / " + (known + allowed);
} else {
if(thispage != "lp-spellchoice") {
- update[cantripsection + " .sheet-spellstext .sheet-total"] = newspells + " / " + (allowed + replaced) + " spells chosen.";
+ update[cantripsection + " .sheet-spellstext .sheet-total"] = newspells + " / " + (allowed + replaced) + " powers chosen.";
if(replaced > 0) {
update[cantripsection + " .sheet-spellstext .sheet-total"] += "
(" + allowed + " new, " + replaced + " replaced)";
}
if(allowedreplace > 0) {
- update[cantripsection + " .sheet-replacetext .sheet-total"] = replaced + " / " + allowedreplace + " spells replaced.";
+ update[cantripsection + " .sheet-replacetext .sheet-total"] = replaced + " / " + allowedreplace + " powers replaced.";
}
}
_.each(perlevel, function(info, level) {
- if(thispage != "lp-spellchoice") update[cantripsection + " .sheet-spellstext .sheet-levels"] += "
" + info.number + " Level " + level + " spells added.
";
+ if(thispage != "lp-spellchoice") update[cantripsection + " .sheet-spellstext .sheet-levels"] += "
" + info.number + " Level " + level + " powers added.
";
update[info.section + " label .sheet-number"] = "";
if(info.number > 0) update[info.section + " label .sheet-number"] = "+" + info.number;
if(info.replaced) {
@@ -1829,14 +1964,14 @@
const id = SheetUtils.getUID(eventinfo.sourceSection);
if(showFeats) {
if(eventinfo.sourceType && eventinfo.sourceType === 'player') resetASI(id, ()=> {recalcLpData();});
- changeCompendiumPage("sheet-class-info", 'Rules:Feats');
+ changeCompendiumPage("sheet-class-info", 'Rules:Feats (EG)');
setAttrs({[`repeating_${id}_asi-row_switch`]:'feat'}, {silent: true});
} else {
if(eventinfo.sourceType && eventinfo.sourceType === 'player') resetFeats(id, ()=> {recalcLpData();});
changeCompendiumPage("sheet-class-info", 'Rules:Ability Scores');
setAttrs({[`repeating_${id}_asi-row_switch`]:'asi'}, {silent: true});
}
- } else if(trigger === 'feat' && eventinfo.sourceType === 'woker') {
+ } else if(trigger === 'feat' && eventinfo.sourceType === 'worker') {
} else if(globalAttributesByCategory.abilitiesWithAllOptionals.indexOf(trigger) > -1) {
updateAbilityLock(eventinfo.sourceSection);
@@ -1973,7 +2108,7 @@
for(let i=0; i
0) ? `You've selected ${feats.join(', ')}` : noFeatsMsg;
//Spells
let selectedSpells = getGainedSpells();
- update["spell_info"] = "
You haven't gained any spells
";
- if(selectedSpells.length > 0) update["spell_info"] = 'You have learnt these spells: '+ selectedSpells.sort().join(", ") +'
';
+ update["spell_info"] = "You haven't gained any powers
";
+ if(selectedSpells.length > 0) update["spell_info"] = 'You have learnt these powers: '+ selectedSpells.sort().join(", ") +'
';
let gainedFeatures = getGainedFeatures();
update["feature_info"] = (gainedFeatures.length > 0) ? 'You have gained these class features: '+ gainedFeatures.sort().join(", ") +'
' :
@@ -2232,13 +2367,13 @@
if(!querysettings.Level || (querysettings.Level && querysettings.Level == spell.level)) spellnames.push(spellname);
});
if(spellnames.length > 0) {
- query = "Category:Powers Name:" + spellnames.join("|");
+ query = "Category:Spells Name:" + spellnames.join("|");
} else {
update[`${eventinfo.sourceSection} .sheet-warning`] = `You do not currently know any level ${querysettings.Level} spells.`;
setCharmancerText(update);
}
} else {
- query = "Category:Powers";
+ query = "Category:Spells";
if(querysettings.Level) {
let levels = [querysettings.Level];
if(querysettings.Level == "max") {
@@ -2359,13 +2494,13 @@
if(!querysettings.Level || (querysettings.Level && querysettings.Level == spell.level)) spellnames.push(spellname);
});
if(spellnames.length > 0) {
- query = "Category:Powers Name:" + spellnames.join("|");
+ query = "Category:Spells Name:" + spellnames.join("|");
} else {
update[`${eventinfo.sourceSection} .sheet-warning`] = `You do not currently know any level ${querysettings.Level} spells.`;
setCharmancerText(update);
}
} else {
- query = "Category:Powers";
+ query = "Category:Spells";
if(querysettings.Level) {
let levels = [querysettings.Level];
if(querysettings.Level == "max") {
@@ -2468,7 +2603,7 @@
let newspells = false;
let spellsettings = {};
if(mancerdata["lp-choices"].values[`${source}_info`]) {
- spellsettings = JSON.parse(mancerdata["lp-choices"].values[`${source}_info`]);
+ spellsettings = safeParseJSON(mancerdata["lp-choices"].values[`${source}_info`], {});
}
_.each(mancerdata["lp-spellchoice"].repeating, function(repid) {
if(mancerdata["lp-spellchoice"].values[`${repid}_checked`] && !mancerdata["lp-spellchoice"].values[`${repid}_existing`]) result.push(mancerdata["lp-spellchoice"].values[`${repid}_name`]);
@@ -2498,9 +2633,6 @@
});
on("mancerfinish:lp-mancer", function(eventinfo) {
- console.log("****************************************");
- console.log("****** STARTING FINISH FUNCTION ******");
- console.log("****************************************");
var doAllDrops = function(dropArray, callback) {
getAttrs(["character_id"], function(v) {
_.each(allAbilities, function(ability) {
@@ -2832,7 +2964,7 @@
//Set up spell drops
if(data["lp-spells"] && data["lp-spells"].repeating) {
_.each(data["lp-spells"].repeating, function(repid) {
- if(data["lp-spells"].values[repid + "_checked"]) {
+ if(data["lp-spells"].values[repid + "_checked"] && !data["lp-spells"].values[repid + "_existing"]) {
var spelldata = {name: "Spells:" + data["lp-spells"].values[repid + "_name"], data: {}};
if(data["lp-spells"].values[repid + "_ability"]) spelldata.data["spellcasting_ability"] = data["lp-spells"].values[repid + "_ability"];
if(data["lp-spells"].values[repid + "_class"]) spelldata.data["spellclass"] = data["lp-spells"].values[repid + "_class"];
@@ -2856,12 +2988,12 @@
_.each(blobs.sorted, function(section, name) {
_.each(section, function(blob) {
if(blob.Spells) {
- spells = JSON.parse(blob.Spells);
+ spells = safeParseJSON(blob.Spells, []);
_.each(spells, function(spell) {
if(spell.Known) {
_.each(spell.Known, function(spellname) {
var thisspell = {name: "Spells:" + spellname, data: {}};
- var thisclass = name.substring(0,5) === "class" ? _.last(data["lp-levels"].values[name.split("_")[0]].split(":")) : "Racial";
+ var thisclass = name.substring(0,5) === "class" ? _.last(data["lp-levels"].values[name.split("_")[0]].split(":")) : "Species";
if(spell.Ability) thisspell.data["spellcasting_ability"] = spell.Ability;
if(spell.Source) thisspell.data["spellsource"] = spell.Source;
thisspell.data["spellclass"] = thisclass;
@@ -2913,8 +3045,6 @@
update_attacks("all");
deleteCharmancerData(["lp-welcome", "lp-levels", "lp-choices", "lp-asi", "lp-spells","lp-summary"]);
var endTime = Date.now();
- //console.log("Elapsed time: ");
- //console.log((endTime-startTime)/1000);
finishCharactermancer();
});
});
@@ -2955,4 +3085,4 @@
});
}
});
- //# sourceURL=dnd5e.js
\ No newline at end of file
+ //# sourceURL=EGSheet-lp.js
\ No newline at end of file
diff --git a/Esper_Genesis_5E/src/charactermancer/lp/lp.pug b/Esper_Genesis_5E/src/charactermancer/lp/lp.pug
index 0e501859ec..7e9260f40d 100644
--- a/Esper_Genesis_5E/src/charactermancer/lp/lp.pug
+++ b/Esper_Genesis_5E/src/charactermancer/lp/lp.pug
@@ -159,7 +159,7 @@ charmancer.sheet-charmancer-lp-choices
+lpSteps()
.choices
.info
- .sheet-compendium-page.sheet-class-info(accept='Rules:Classes')
+ .sheet-compendium-page.sheet-class-info(accept='Rules:Esper Classes')
+bottomBar({back: {type:'back', value: 'lp-levels'}, next: {action: true, name: 'act_lp-choices_next'}})
+cancelPrompt()
@@ -180,7 +180,7 @@ charmancer.sheet-charmancer-lp-spells
span.pagelock(style='display: none')
.choices.spellslide
p.instructions(data-i18n='charmancer-leveler-spells-info')
- | Listed here are the current spells your character already knows. If you gained access to more spells during your advancement you will be able to select them below. Check next to the spells you wish to learn. The Charactermancer will help you pick the right number of spells and from the correct list. If your class has the option to swap out spells, you can do so by unselecting currently known spells which will allow you to select new ones in their place.
+ | Listed here are the current powers your character already knows. If you gained access to more powers during your advancement you will be able to select them below. Check next to the powers you wish to learn. The Charactermancer will help you pick the right number of powers and from the correct list. If your class has the option to swap out powers, you can do so by unselecting currently known powers which will allow you to select new ones in their place.
p.spells-summary
.cantripinfo
.info.spellslide
diff --git a/Esper_Genesis_5E/src/classes/DropClasses/DropClasses.js b/Esper_Genesis_5E/src/classes/DropClasses/DropClasses.js
index c237cbb0ab..99d1f47cb1 100644
--- a/Esper_Genesis_5E/src/classes/DropClasses/DropClasses.js
+++ b/Esper_Genesis_5E/src/classes/DropClasses/DropClasses.js
@@ -233,7 +233,7 @@ class Trait extends RepeatingFieldset {
break;
case "Races":
case "Subraces":
- return "Racial"
+ return "Species"
break;
case "Classes":
case "Subclasses":
diff --git a/Esper_Genesis_5E/src/dragndrop/DragAndDrop.js b/Esper_Genesis_5E/src/dragndrop/DragAndDrop.js
index 7f6655214d..388451e3fb 100644
--- a/Esper_Genesis_5E/src/dragndrop/DragAndDrop.js
+++ b/Esper_Genesis_5E/src/dragndrop/DragAndDrop.js
@@ -30,7 +30,6 @@ var handle_drop = function(category, eventinfo) {
return;
} else {
setTimeout(() => {
- console.log("cleaning last ID");
lastDropID = "";
}, 2000);
};
@@ -219,7 +218,8 @@ var processDrop = function(page, currentData, repeating, looped) {
const processSpells = () => {
try {
if(page.name) {
- const spellLevel = page.data["Rank"] && page.data["Rank"] > 0 ? page.data["Rank"] : "prime";
+ const rankOrLevel = page.data["Rank"] !== undefined ? page.data["Rank"] : (page.data["Level"] !== undefined ? parseInt(page.data["Level"]) : 0);
+ const spellLevel = rankOrLevel > 0 ? rankOrLevel : "prime";
const section = `spell-${spellLevel}`
let existing = {id: false};
@@ -234,7 +234,7 @@ var processDrop = function(page, currentData, repeating, looped) {
const dropSheetAssocitation = {
spelldescription: page.data['data-description'],
- spellschool: page.data['Domain'].toLowerCase(),
+ spellschool: page.data['Domain'] ? page.data['Domain'].toLowerCase() : undefined,
spellclass: page.data['spellclass'],
spellsource: page.data['spellsource'],
spellritual: page.data['Ritual'],
@@ -382,8 +382,7 @@ var processDrop = function(page, currentData, repeating, looped) {
if (page.data["data-MAdesc"]) {
newObject.attributes.npc_mythic_actions_desc = page.data["data-MAdesc"];
} else {
- //TODO UC1098
- newObject.attributes.npc_legendary_actions_desc = ``;
+ newObject.attributes.npc_mythic_actions_desc = ``;
}
}
@@ -673,9 +672,7 @@ var processDrop = function(page, currentData, repeating, looped) {
if (page.data.multiclass) {
update[`${page.data.multiclass}_subclass`] = page.name;
classlevel = parseInt(currentData[`${page.data.multiclass}_lvl`]);
- if (page.data["Spellcasting Ability"] && (lowercaseClass === 'fighter' || lowercaseClass === 'rogue')) {
- update[`"arcane_${lowercaseClass}`] = "1";
- }
+
} else {
let newObject = new Subclass(page.name);
const spellcastingAbility = page.data["Spellcasting Ability"] ? page.data["Spellcasting Ability"].toLowerCase() : false;
@@ -760,6 +757,7 @@ var processDrop = function(page, currentData, repeating, looped) {
processProficiencies();
break;
case "Powers":
+ case "Spells":
processSpells();
break;
case "Subclasses":
@@ -1003,7 +1001,6 @@ var processDrop = function(page, currentData, repeating, looped) {
}
}
- //Testing this funtion to find an empty resource
const findEmptyResource = () => {
if (currentData["class_resource_name"].length === 0) {
return "class_resource"
diff --git a/Esper_Genesis_5E/src/hiddeninputs/hiddeninputs.pug b/Esper_Genesis_5E/src/hiddeninputs/hiddeninputs.pug
index f213df04c6..b893d21835 100644
--- a/Esper_Genesis_5E/src/hiddeninputs/hiddeninputs.pug
+++ b/Esper_Genesis_5E/src/hiddeninputs/hiddeninputs.pug
@@ -7,6 +7,9 @@ input(type='hidden' name='attr_jack_attr' value!='')
input(type='hidden' name='attr_jack_bonus' value!='')
input(type='hidden' name='attr_passive_wisdom' value!='10')
input(type='hidden' name='attr_hitdie_final' value!='')
+input(type='hidden' name='attr_multiclass1_hitdietype' value!='')
+input(type='hidden' name='attr_multiclass2_hitdietype' value!='')
+input(type='hidden' name='attr_multiclass3_hitdietype' value!='')
input(type='hidden' name='attr_globalsavingthrowbonus' value!='')
input(type='hidden' name='attr_death_save_bonus' value!='0')
input(type='hidden' name='attr_initiative_bonus' value!='0')
@@ -62,6 +65,11 @@ input(type='hidden' name='attr_sleight_of_hand_bonus' value!='0')
input(type='hidden' name='attr_stealth_bonus' value!='0')
input(type='hidden' name='attr_survival_bonus' value!='0')
input(type='hidden' name='attr_xenobiology_bonus' value!='0')
+input(type='hidden' name='attr_animal_handling_bonus' value!='0')
+input(type='hidden' name='attr_arcana_bonus' value!='0')
+input(type='hidden' name='attr_history_bonus' value!='0')
+input(type='hidden' name='attr_nature_bonus' value!='0')
+input(type='hidden' name='attr_religion_bonus' value!='0')
input(type='hidden' name='attr_lvl1_slots_total' value!='0')
input(type='hidden' name='attr_lvl2_slots_total' value!='0')
input(type='hidden' name='attr_lvl3_slots_total' value!='0')
diff --git a/Esper_Genesis_5E/src/mixins/mixins.pug b/Esper_Genesis_5E/src/mixins/mixins.pug
index 20df79aaba..04abae04b5 100644
--- a/Esper_Genesis_5E/src/mixins/mixins.pug
+++ b/Esper_Genesis_5E/src/mixins/mixins.pug
@@ -16,6 +16,40 @@ mixin abilityList()
each ability in ABILTIES
+ability(ability)
+mixin abilityBarCol(name, abbr)
+ .ability-col
+ .ability-header
+ button(type='roll' name=`roll_${name}` value!=`@{wtype}&{template:simple} {{rname=^{${name}-u}}} {{mod=@{${name}_mod}@{jack_bonus}}} {{r1=[[@{d20}+@{${name}_mod}@{jack_attr}[${abbr}]]]}} @{rtype}+@{${name}_mod}@{jack_attr}[${abbr}]]]}} @{charname_output} {{licensedsheet=@{licensedsheet}}}` data-i18n=`${abbr.toLowerCase()}-u`)= abbr
+ input.baseattr(type='text' name=`attr_${name}_base` title=`@{${name}}` value!='10')
+ input(type='hidden' name=`attr_${name}` value!='10')
+ input.attr-flag(type='hidden' name=`attr_${name}_flag` value!='0')
+ span.finalattr(name=`attr_${name}`)
+ .ability-modifiers
+ .ability-mod-block
+ .ability-val-box
+ input(type='hidden' name=`attr_${name}_mod` value='0')
+ button(type='roll' name=`roll_${name}` value!=`@{wtype}&{template:simple} {{rname=^{${name}-u}}} {{mod=@{${name}_mod}@{jack_bonus}}} {{r1=[[@{d20}+@{${name}_mod}@{jack_attr}[${abbr}]]]}} @{rtype}+@{${name}_mod}@{jack_attr}[${abbr}]]]}} @{charname_output} {{licensedsheet=@{licensedsheet}}}`)
+ span.attr(name=`attr_${name}_mod` title=`@{${name}_mod}`) 0
+ span.ab-label Mod
+ .ability-save-block
+ .ability-val-box
+ input(type='hidden' name=`attr_${name}_save_bonus` value='0')
+ button(type='roll' name=`roll_${name}_save` value!=`@{wtype}&{template:simple} {{rname=^{${name}-save-u}}} {{mod=@{${name}_save_bonus}}} {{r1=[[@{d20}+@{${name}_save_bonus}@{pbd_safe}]]}} @{rtype}+@{${name}_save_bonus}@{pbd_safe}]]}} {{global=@{global_save_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}`)
+ span.save-val(name=`attr_${name}_save_bonus` title=`@{${name}_save_bonus}`) 0
+ input(type='checkbox' name=`attr_${name}_save_prof` title=`@{${name}_save_prof}` value!='(@{pb})')
+ span.ab-label Save
+
+mixin abilitiesBar()
+ .abilities-bar
+ +abilityBarCol('strength', 'STR')
+ +abilityBarCol('dexterity', 'DEX')
+ +abilityBarCol('constitution', 'CON')
+ +abilityBarCol('intelligence', 'INT')
+ +abilityBarCol('wisdom', 'WIS')
+ +abilityBarCol('charisma', 'CHA')
+ .ab-section-label
+ span(data-i18n='abilities-u') ABILITIES
+
mixin powerHeader(rank, tp)
span.rank
span(data-i18n='max-rank-u')
diff --git a/Esper_Genesis_5E/src/npc/npc.pug b/Esper_Genesis_5E/src/npc/npc.pug
index cd768485c4..04740a9f85 100644
--- a/Esper_Genesis_5E/src/npc/npc.pug
+++ b/Esper_Genesis_5E/src/npc/npc.pug
@@ -252,7 +252,7 @@
span.bold(data-i18n='hp') Hit Points
span.num3(name='attr_hp_max')
button(type='roll' name='roll_npc_hpformula' value!='@{wtype}&{template:npc} {{type=Hit Points}} {{normal=1}} @{npc_name_flag} {{rname=^{hp}}} {{mod=@{npc_hpformula}}} {{r1=[[@{npc_hpformula}]]}} charname=@{character_name}')
- span.parens(name='attr_npc_hpformula' style='font-size: 12px; font-weight: normal;')
+ span.parens(name='attr_npc_hpformula')
.row.red
span.bold(data-i18n='speed') Speed
span(name='attr_npc_speed')
@@ -624,17 +624,20 @@
input.num(type='text' name='attr_npc_piloting_base' placeholder='0')
.spacer
.row
- span(data-i18n='ship-attributes-u') ATTRIBUTES (PILOT/CREW)
+ span(data-i18n='ship-attributes-u') ATTRIBUTES (P=PILOT T=TECHNICIAN G=GUNNER)
.row
- span(data-i18n='ship-dex-u') DEX—[PILOT]
+ span(data-i18n='ship-dex-u') P-DEX
input.num(type='text' name='attr_dexterity_base' value!='10')
- span(data-i18n='ship-int-u') INT—[TECH]
+ span(data-i18n='ship-cha-u') P-WIS
+ input.num(type='text' name='attr_charisma_base' value!='10')
+ span(data-i18n='ship-int-u') T-INT
input.num(type='text' name='attr_intelligence_base' value!='10')
- span(data-i18n='ship-wis-u') WIS—[TECH]
+ span(data-i18n='ship-wis-u') T-WIS
input.num(type='text' name='attr_wisdom_base' value!='10')
- input(type='hidden' name='attr_strength_base' value!='0')
- input(type='hidden' name='attr_constitution_base' value!='0')
- input(type='hidden' name='attr_charisma_base' value!='0')
+ span(data-i18n='ship-str-u') G-DEX
+ input.num(type='text' name='attr_strength_base' value!='10')
+ span(data-i18n='ship-con-u') G-WIS
+ input.num(type='text' name='attr_constitution_base' value!='10')
.spacer
.row
span(data-i18n='saves-u') SAVES
@@ -805,7 +808,7 @@
span.bold(data-i18n='hlp') Hull Points
span.num3(name='attr_hp_max')
button(type='roll' name='roll_npc_hpformula' value!='@{wtype}&{template:npc} {{type=Hit Points}} {{normal=1}} @{npc_name_flag} {{rname=^{hp}}} {{mod=@{npc_hpformula}}} {{r1=[[@{npc_hpformula}]]}} charname=@{character_name}')
- span.parens(name='attr_npc_hpformula' style='font-size: 12px; font-weight: normal;')
+ span.parens(name='attr_npc_hpformula')
.row.red
span.bold(data-i18n='structural-integrity') Structural Integrity
span(name='attr_ship_si')
@@ -815,41 +818,41 @@
.triangle
.row.red
.attr-container
- button(type='roll' name='roll_npc_str' value!='@{wtype}&{template:npc} @{npc_name_flag} {{rname=^{strength}}} {{mod=[[[[@{strength_mod}]][STR]]]}} {{r1=[[@{d20}+[[@{strength_mod}]][STR]]]}} @{rtype}+[[@{strength_mod}]][STR]]]}} {{type=Ability}}')
- span.bold(data-i18n='str-u') STR
- span(name='attr_strength')
- input.negativeflag(type='hidden' name='attr_npc_str_negative' value!='0')
- span.npcattr(name='attr_strength_mod')
- .attr-container
- button(type='roll' name='roll_npc_dex' value!='@{wtype}&{template:npc} @{npc_name_flag} {{rname=^{dexterity}}} {{mod=[[[[@{dexterity_mod}]][DEX]]]}} {{r1=[[@{d20}+[[@{dexterity_mod}]][DEX]]]}} @{rtype}+[[@{dexterity_mod}]][DEX]]]}} {{type=Ability}}')
- span.bold(data-i18n='dex-u') DEX
+ button(type='roll' name='roll_npc_dex' value!='@{wtype}&{template:npc} @{npc_name_flag} {{rname=^{npc-ship-dex}}} {{mod=[[[[@{dexterity_mod}]][P-DEX]]]}} {{r1=[[@{d20}+[[@{dexterity_mod}]][P-DEX]]]}} @{rtype}+[[@{dexterity_mod}]][P-DEX]]]}} {{type=Ability}}')
+ span.bold(data-i18n='ship-dex-u') P-DEX
span(name='attr_dexterity')
input.negativeflag(type='hidden' name='attr_npc_dex_negative' value!='0')
span.npcattr(name='attr_dexterity_mod')
.attr-container
- button(type='roll' name='roll_npc_con' value!='@{wtype}&{template:npc} @{npc_name_flag} {{rname=^{constitution}}} {{mod=[[[[@{constitution_mod}]][CON]]]}} {{r1=[[@{d20}+[[@{constitution_mod}]][CON]]]}} @{rtype}+[[@{constitution_mod}]][CON]]]}} {{type=Ability}}')
- span.bold(data-i18n='con-u') CON
- span(name='attr_constitution')
- input.negativeflag(type='hidden' name='attr_npc_con_negative' value!='0')
- span.npcattr(name='attr_constitution_mod')
+ button(type='roll' name='roll_npc_cha' value!='@{wtype}&{template:npc} @{npc_name_flag} {{rname=^{npc-ship-cha}}} {{mod=[[[[@{charisma_mod}]][P-WIS]]]}} {{r1=[[@{d20}+[[@{charisma_mod}]][P-WIS]]]}} @{rtype}+[[@{charisma_mod}]][P-WIS]]]}} {{type=Ability}}')
+ span.bold(data-i18n='ship-cha-u') P-WIS
+ span(name='attr_charisma')
+ input.negativeflag(type='hidden' name='attr_npc_cha_negative' value!='0')
+ span.npcattr(name='attr_charisma_mod')
.attr-container
- button(type='roll' name='roll_npc_int' value!='@{wtype}&{template:npc} @{npc_name_flag} {{rname=^{intelligence}}} {{mod=[[[[@{intelligence_mod}]][INT]]]}} {{r1=[[@{d20}+[[@{intelligence_mod}]][INT]]]}} @{rtype}+[[@{intelligence_mod}]][INT]]]}} {{type=Ability}}')
- span.bold(data-i18n='int-u') INT
+ button(type='roll' name='roll_npc_int' value!='@{wtype}&{template:npc} @{npc_name_flag} {{rname=^{npc-ship-int}}} {{mod=[[[[@{intelligence_mod}]][T-INT]]]}} {{r1=[[@{d20}+[[@{intelligence_mod}]][T-INT]]]}} @{rtype}+[[@{intelligence_mod}]][T-INT]]]}} {{type=Ability}}')
+ span.bold(data-i18n='ship-int-u') T-INT
span(name='attr_intelligence')
input.negativeflag(type='hidden' name='attr_npc_int_negative' value!='0')
span.npcattr(name='attr_intelligence_mod')
.attr-container
- button(type='roll' name='roll_npc_wis' value!='@{wtype}&{template:npc} @{npc_name_flag} {{rname=^{wisdom}}} {{mod=[[[[@{wisdom_mod}]][WIS]]]}} {{r1=[[@{d20}+[[@{wisdom_mod}]][WIS]]]}} @{rtype}+[[@{wisdom_mod}]][WIS]]]}} {{type=Ability}}')
- span.bold(data-i18n='wis-u') WIS
+ button(type='roll' name='roll_npc_wis' value!='@{wtype}&{template:npc} @{npc_name_flag} {{rname=^{npc-ship-wis}}} {{mod=[[[[@{wisdom_mod}]][T-WIS]]]}} {{r1=[[@{d20}+[[@{wisdom_mod}]][T-WIS]]]}} @{rtype}+[[@{wisdom_mod}]][T-WIS]]]}} {{type=Ability}}')
+ span.bold(data-i18n='ship-wis-u') T-WIS
span(name='attr_wisdom')
input.negativeflag(type='hidden' name='attr_npc_wis_negative' value!='0')
span.npcattr(name='attr_wisdom_mod')
.attr-container
- button(type='roll' name='roll_npc_cha' value!='@{wtype}&{template:npc} @{npc_name_flag} {{rname=^{charisma}}} {{mod=[[[[@{charisma_mod}]][CHA]]]}} {{r1=[[@{d20}+[[@{charisma_mod}]][CHA]]]}} @{rtype}+[[@{charisma_mod}]][CHA]]]}} {{type=Ability}}')
- span.bold(data-i18n='cha-u') CHA
- span(name='attr_charisma')
- input.negativeflag(type='hidden' name='attr_npc_cha_negative' value!='0')
- span.npcattr(name='attr_charisma_mod')
+ button(type='roll' name='roll_npc_str' value!='@{wtype}&{template:npc} @{npc_name_flag} {{rname=^{npc-ship-str}}} {{mod=[[[[@{strength_mod}]][G-DEX]]]}} {{r1=[[@{d20}+[[@{strength_mod}]][G-DEX]]]}} @{rtype}+[[@{strength_mod}]][G-DEX]]]}} {{type=Ability}}')
+ span.bold(data-i18n='ship-str-u') G-DEX
+ span(name='attr_strength')
+ input.negativeflag(type='hidden' name='attr_npc_str_negative' value!='0')
+ span.npcattr(name='attr_strength_mod')
+ .attr-container
+ button(type='roll' name='roll_npc_con' value!='@{wtype}&{template:npc} @{npc_name_flag} {{rname=^{npc-ship-con}}} {{mod=[[[[@{constitution_mod}]][G-WIS]]]}} {{r1=[[@{d20}+[[@{constitution_mod}]][G-WIS]]]}} @{rtype}+[[@{constitution_mod}]][G-WIS]]]}} {{type=Ability}}')
+ span.bold(data-i18n='ship-con-u') G-WIS
+ span(name='attr_constitution')
+ input.negativeflag(type='hidden' name='attr_npc_con_negative' value!='0')
+ span.npcattr(name='attr_constitution_mod')
.triangle
.row.skills.red(style='position:relative;')
span.bold(data-i18n='piloting') Piloting Bonus
diff --git a/Esper_Genesis_5E/src/pc/pc.pug b/Esper_Genesis_5E/src/pc/pc.pug
index 623d37e242..73aff5b3c6 100644
--- a/Esper_Genesis_5E/src/pc/pc.pug
+++ b/Esper_Genesis_5E/src/pc/pc.pug
@@ -1,243 +1,371 @@
-input.tab-button.core(name='attr_tab' type='radio' value!='core' checked='checked')
-span(data-i18n='core-u') CORE
-input.tab-button.bio(name='attr_tab' type='radio' value!='bio')
-span(data-i18n='bio-u') BIO
-input.tab-button.spells(name='attr_tab' type='radio' value!='spells')
-span(data-i18n='spells-u') POWERS
-input.tab-button.options(name='attr_tab' type='radio' value!='options')
-span(style='font-family: pictos') y
+input(type='checkbox' class='settings-modal-toggle' id='settings-modal-toggle')
+input.tab-button.core(id='tab-core' name='attr_tab' type='radio' value!='core' checked='checked')
+input.tab-button.bio(id='tab-bio' name='attr_tab' type='radio' value!='bio')
+input.tab-button.spells(id='tab-spells' name='attr_tab' type='radio' value!='spells')
+
+input.tab-button.type-pc(id='tab-type-pc' name='attr_pc_sheet_type' type='radio' value!='pc' checked='checked')
+input.tab-button.type-starship(id='tab-type-starship' name='attr_pc_sheet_type' type='radio' value!='starship')
-input.tab-button.type-pc(name='attr_pc_sheet_type' type='radio' value!='pc' checked='checked')
-span(data-i18n='pc-u') PC
-input.tab-button.type-starship(name='attr_pc_sheet_type' type='radio' value!='starship')
-span(data-i18n='starship-u') STARSHIP
.page.core
.header
- .name-container
- img(src='https://raw.githubusercontent.com/skydawn1/esper_genesis/master/EG_Logo.png' alt='Esper Genesis 5E' style='padding-bottom: 15px; margin-top: -5px;')
- input(type='text' name='attr_character_name' style='width: 100%;')
- span.label(data-i18n='char-name-u') CHARACTER NAME
- input.options-flag(type='checkbox' name='attr_options-class-selection' checked='checked')
- span y
- .header-info.sheet-options
- .sheet-row(style='border-top: 2px dashed gold;')
- span(data-i18n='class:-u') CLASS:
- input.sheet-flag(type='hidden' name='attr_custom_class')
- select.hiding.class(name='attr_class')
- option(value!='' data-i18n='choose') Choose
- option(value!='Adept' data-i18n='adept') Adept
- option(value!='Cybermancer' data-i18n='cybermancer') Cybermancer
- option(value!='Engineer' data-i18n='engineer') Engineer
- option(value!='Hunter' data-i18n='hunter') Hunter
- option(value!='Melder' data-i18n='melder') Melder
- option(value!='Sentinel' data-i18n='sentinel') Sentinel
- option(value!='Specialist' data-i18n='specialist') Specialist
- option(value!='Warrior' data-i18n='warrior') Warrior
- input.showing(type='text' name='attr_cust_classname' style='width: 90px;')
- span(data-i18n='subclass:-u') SUBCLASS:
- input(type='text' name='attr_subclass')
- span(data-i18n='lvl:-u') LEVEL:
- input.class-level(type='number' style='width: 40px' name='attr_base_level' value!='1')
- .sheet-row
- span(data-i18n='race:-u') RACE:
- input(type='text' name='attr_race')
- span(data-i18n='subrace:-u') SUBRACE:
- input(type='text' name='attr_subrace')
- .header-info.sheet-display
- .top
- .hlabel-container
- input.sheet-class-display.sheet-no_events(type='text' name='attr_class_display')
- span.label(data-i18n='class-level-u') CLASS & LEVEL
- .hlabel-container
- input(type='text' name='attr_background' style='width: 182px;')
- span.label(data-i18n='background-u') BACKGROUND
- .bottom
- .hlabel-container
- input.sheet-no_events(type='text' name='attr_race_display')
- span.label(data-i18n='race-u') RACE
- .hlabel-container
- input(type='text' name='attr_alignment')
- span.label(data-i18n='alignment-u') ALIGNMENT
- .hlabel-container(style='position: relative;')
- input(type='text' name='attr_experience')
- span.label(data-i18n='exp-pts-u') EXPERIENCE POINTS
+ .header-left
+ .name-container
+ .token-frame(title='To change your avatar, open Edit Character in the Journal sidebar')
+ img.char-avatar(name='attr_character_avatar' alt='Character Token')
+ .char-info-right
+ .name-fields
+ input(type='text' name='attr_character_name' style='width: 100%;')
+ span.label(data-i18n='char-name-u') CHARACTER NAME
+ input.options-flag(type='checkbox' name='attr_options-class-selection' checked='checked')
+ span y
+ .header-info.sheet-options
+ .sheet-row(style='border-top: 2px dashed gold;')
+ span(data-i18n='class:-u') CLASS:
+ input.sheet-flag(type='hidden' name='attr_custom_class')
+ select.hiding.class(name='attr_class')
+ option(value!='' data-i18n='choose') Choose
+ option(value!='Adept' data-i18n='adept') Adept
+ option(value!='Cybermancer' data-i18n='cybermancer') Cybermancer
+ option(value!='Engineer' data-i18n='engineer') Engineer
+ option(value!='Hunter' data-i18n='hunter') Hunter
+ option(value!='Melder' data-i18n='melder') Melder
+ option(value!='Sentinel' data-i18n='sentinel') Sentinel
+ option(value!='Specialist' data-i18n='specialist') Specialist
+ option(value!='Warrior' data-i18n='warrior') Warrior
+ input.showing(type='text' name='attr_cust_classname' style='width: 90px;')
+ span(data-i18n='subclass:-u') SUBCLASS:
+ input(type='text' name='attr_subclass')
+ span(data-i18n='lvl:-u') LEVEL:
+ input.class-level(type='number' style='width: 40px' name='attr_base_level' value!='1')
+ .sheet-row
+ span(data-i18n='race:-u') RACE:
+ input(type='text' name='attr_race')
+ span(data-i18n='subrace:-u') SUBRACE:
+ input(type='text' name='attr_subrace')
+ .header-info.sheet-display
+ .hlabel-container
+ input.sheet-class-display.sheet-no_events(type='text' name='attr_class_display')
+ span.label(data-i18n='class-level-u') CLASS & LEVEL
+ .hlabel-container
+ input.sheet-no_events(type='text' name='attr_race_display')
+ span.label(data-i18n='race-u') RACE
+ .hlabel-container
+ input(type='text' name='attr_background')
+ span.label(data-i18n='background-u') BACKGROUND
+ .xp-row
+ span.xp-prefix Exp:
+ input(type='text' name='attr_experience')
+ .header-right
+ span.hp-panel-label HIT POINTS
+ .hp-main-row
+ .hp-left-cluster
+ .hp-curmax-group
+ .hp-curmax-box
+ .hp-cm-inputs
+ input(type='number' name='attr_hp' title='@{hp}')
+ span.hp-sep /
+ input(type='text' name='attr_hp_max' title='@{hp_max}')
+ .hp-bar-track
+ .hp-bar-fill
+ .hp-cm-labels
+ span Current
+ span Max
+ .hp-temp-group
+ input(type='number' name='attr_hp_temp' title='@{hp_temp}')
+ span Temp
+ .hp-dmgheal-group
+ .hp-dmgheal-controls
+ button.hp-dmg-btn(type='action' name='act_damage') −
+ input.hp-change-input(type='number' name='attr_hp_change' value='0')
+ button.hp-heal-btn(type='action' name='act_heal') +
+ .hp-dmgheal-labels
+ span Damage
+ span Heal
+ .death-saves-group
+ button.ds-roll-btn(type='roll' name='roll_death_save' value='@{wtype}&{template:simple} {{rname=^{death-save-u}}} {{mod=@{death_save_bonus}}} {{r1=[[@{d20}+@{death_save_bonus}[MOD]@{globalsavingthrowbonus}]]}} {{normal=1}} {{global=@{global_save_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}') DEATH SAVES
+ .ds-pip-box
+ .ds-row
+ span.ds-label(data-i18n='successes-u') Success
+ input.ds-pip.ds-success(type='checkbox' name='attr_deathsave_succ1')
+ input.ds-pip.ds-success(type='checkbox' name='attr_deathsave_succ2')
+ input.ds-pip.ds-success(type='checkbox' name='attr_deathsave_succ3')
+ .ds-row
+ span.ds-label(data-i18n='failures-u') Failure
+ input.ds-pip.ds-failure(type='checkbox' name='attr_deathsave_fail1')
+ input.ds-pip.ds-failure(type='checkbox' name='attr_deathsave_fail2')
+ input.ds-pip.ds-failure(type='checkbox' name='attr_deathsave_fail3')
+ .hp-hitdice-row
+ span.hd-label HIT DICE
+ input.hd-mc1-flag(type='checkbox' name='attr_multiclass1_flag' value='1')
+ input.hd-mc2-flag(type='checkbox' name='attr_multiclass2_flag' value='1')
+ input.hd-mc3-flag(type='checkbox' name='attr_multiclass3_flag' value='1')
+ .hd-group.hd-group-primary
+ button.hd-type-btn(type='roll' name='roll_hit_dice' value='@{wtype}&{template:simple} {{rname=^{hit-dice-u}}} {{mod=D@{hitdietype}+[[@{constitution_mod}[CON]]]}} {{r1=[[1d@{hitdietype}+[[@{constitution_mod}]][CON]]]}} {{normal=1}} @{charname_output} {{licensedsheet=@{licensedsheet}}}')
+ span.hd-btn-label
+ | d
+ span(name='attr_hitdietype')
+ | (
+ span(name='attr_class')
+ | )
+ .hd-count-box
+ input.hd-count-input(type='number' name='attr_hit_dice' title='@{hit_dice}')
+ span.hd-sep /
+ input.hd-max-input(type='text' name='attr_hit_dice_max' title='@{hit_dice_max}')
+ .hd-group.hd-group-mc1
+ button.hd-type-btn(type='roll' name='roll_hit_dice_mc1' value='@{wtype}&{template:simple} {{rname=^{hit-dice-u}}} {{mod=D@{multiclass1_hitdietype}+[[@{constitution_mod}[CON]]]}} {{r1=[[1d@{multiclass1_hitdietype}+[[@{constitution_mod}]][CON]]]}} {{normal=1}} @{charname_output} {{licensedsheet=@{licensedsheet}}}')
+ span.hd-btn-label
+ | d
+ span(name='attr_multiclass1_hitdietype')
+ | (
+ span(name='attr_multiclass1')
+ | )
+ .hd-count-box
+ input.hd-count-input(type='number' name='attr_multiclass1_hit_dice')
+ span.hd-sep /
+ input.hd-max-input(type='text' name='attr_multiclass1_hit_dice_max')
+ .hd-group.hd-group-mc2
+ button.hd-type-btn(type='roll' name='roll_hit_dice_mc2' value='@{wtype}&{template:simple} {{rname=^{hit-dice-u}}} {{mod=D@{multiclass2_hitdietype}+[[@{constitution_mod}[CON]]]}} {{r1=[[1d@{multiclass2_hitdietype}+[[@{constitution_mod}]][CON]]]}} {{normal=1}} @{charname_output} {{licensedsheet=@{licensedsheet}}}')
+ span.hd-btn-label
+ | d
+ span(name='attr_multiclass2_hitdietype')
+ | (
+ span(name='attr_multiclass2')
+ | )
+ .hd-count-box
+ input.hd-count-input(type='number' name='attr_multiclass2_hit_dice')
+ span.hd-sep /
+ input.hd-max-input(type='text' name='attr_multiclass2_hit_dice_max')
+ .hd-group.hd-group-mc3
+ button.hd-type-btn(type='roll' name='roll_hit_dice_mc3' value='@{wtype}&{template:simple} {{rname=^{hit-dice-u}}} {{mod=D@{multiclass3_hitdietype}+[[@{constitution_mod}[CON]]]}} {{r1=[[1d@{multiclass3_hitdietype}+[[@{constitution_mod}]][CON]]]}} {{normal=1}} @{charname_output} {{licensedsheet=@{licensedsheet}}}')
+ span.hd-btn-label
+ | d
+ span(name='attr_multiclass3_hitdietype')
+ | (
+ span(name='attr_multiclass3')
+ | )
+ .hd-count-box
+ input.hd-count-input(type='number' name='attr_multiclass3_hit_dice')
+ span.hd-sep /
+ input.hd-max-input(type='text' name='attr_multiclass3_hit_dice_max')
+ +abilitiesBar()
+ .tab-row
+ .tab-main-group
+ label.tab-label.core(for='tab-core') CORE
+ label.tab-label.bio(for='tab-bio') GEAR & BIO
+ label.tab-label.spells(for='tab-spells') POWERS
+ .tab-type-group
+ label.tab-label.type-pc(for='tab-type-pc') PC
+ label.tab-label.type-starship(for='tab-type-starship') STARSHIP
.body
.col.col1
- +abilityList()
.skills-saves-container
- .insp-prof-container
- .value
+ .insp-init-row
+ label.insp-button
input(type='checkbox' name='attr_inspiration')
- span
- .label
- span(data-i18n='inspiration-u') INSPIRATION
- .insp-prof-container
- .value
- span(name='attr_pb' title='@{pb}')
- .label
- span(data-i18n='prof-bonus-u') PROFICIENCY BONUS
- .saving-throw-container
- .saving-throw
- input(type='checkbox' name='attr_strength_save_prof' title='@{strength_save_prof}' value!='(@{pb})')
- span(name='attr_strength_save_bonus' title='@{strength_save_bonus}') 0
- button(type='roll' name='roll_strength_save' value!='@{wtype}&{template:simple} {{rname=^{strength-save-u}}} {{mod=@{strength_save_bonus}}} {{r1=[[@{d20}+@{strength_save_bonus}@{pbd_safe}]]}} @{rtype}+@{strength_save_bonus}@{pbd_safe}]]}} {{global=@{global_save_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='strength') Strength
- .saving-throw
- input(type='checkbox' name='attr_dexterity_save_prof' title='@{dexterity_save_prof}' value!='(@{pb})')
- span(name='attr_dexterity_save_bonus' title='@{dexterity_save_bonus}') 0
- button(type='roll' name='roll_dexterity_save' value!='@{wtype}&{template:simple} {{rname=^{dexterity-save-u}}} {{mod=@{dexterity_save_bonus}}} {{r1=[[@{d20}+@{dexterity_save_bonus}@{pbd_safe}]]}} @{rtype}+@{dexterity_save_bonus}@{pbd_safe}]]}} {{global=@{global_save_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='dexterity') Dexterity
- .saving-throw
- input(type='checkbox' name='attr_constitution_save_prof' title='@{constitution_save_prof}' value!='(@{pb})')
- span(name='attr_constitution_save_bonus' title='@{constitution_save_bonus}') 0
- button(type='roll' name='roll_constitution_save' value!='@{wtype}&{template:simple} {{rname=^{constitution-save-u}}} {{mod=@{constitution_save_bonus}}} {{r1=[[@{d20}+@{constitution_save_bonus}@{pbd_safe}]]}} @{rtype}+@{constitution_save_bonus}@{pbd_safe}]]}} {{global=@{global_save_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='constitution') Constitution
- .saving-throw
- input(type='checkbox' name='attr_intelligence_save_prof' title='@{intelligence_save_prof}' value!='(@{pb})')
- span(name='attr_intelligence_save_bonus' title='@{intelligence_save_bonus}') 0
- button(type='roll' name='roll_intelligence_save' value!='@{wtype}&{template:simple} {{rname=^{intelligence-save-u}}} {{mod=@{intelligence_save_bonus}}} {{r1=[[@{d20}+@{intelligence_save_bonus}@{pbd_safe}]]}} @{rtype}+@{intelligence_save_bonus}@{pbd_safe}]]}} {{global=@{global_save_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='intelligence') Intelligence
- .saving-throw
- input(type='checkbox' name='attr_wisdom_save_prof' title='@{wisdom_save_prof}' value!='(@{pb})')
- span(name='attr_wisdom_save_bonus' title='@{wisdom_save_bonus}') 0
- button(type='roll' name='roll_wisdom_save' value!='@{wtype}&{template:simple} {{rname=^{wisdom-save-u}}} {{mod=@{wisdom_save_bonus}}} {{r1=[[@{d20}+@{wisdom_save_bonus}@{pbd_safe}]]}} @{rtype}+@{wisdom_save_bonus}@{pbd_safe}]]}} {{global=@{global_save_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='wisdom') Wisdom
- .saving-throw
- input(type='checkbox' name='attr_charisma_save_prof' title='@{charisma_save_prof}' value!='(@{pb})')
- span(name='attr_charisma_save_bonus' title='@{charisma_save_bonus}') 0
- button(type='roll' name='roll_charisma_save' value!='@{wtype}&{template:simple} {{rname=^{charisma-save-u}}} {{mod=@{charisma_save_bonus}}} {{r1=[[@{d20}+@{charisma_save_bonus}@{pbd_safe}]]}} @{rtype}+@{charisma_save_bonus}@{pbd_safe}]]}} {{global=@{global_save_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='charisma') Charisma
- input.toggleflag(type='hidden' name='attr_global_save_mod_flag')
- .hidden.textarea.globalattack
- span.label(data-i18n='global-save-u' style='position: relative; padding-bottom: 5px;') GLOBAL SAVE MODIFIER
- fieldset.repeating_savemod
- .global-mod
- input.options-flag(type='checkbox' name='attr_options-flag' checked='checked' style='top: -15px;')
- span y
- input.active-flag(type='checkbox' name='attr_global_save_active_flag' value!='1')
- .options
- .row
- span(data-i18n='name:-u') NAME:
- input(type='text' name='attr_global_save_name' value!='' placeholder='Sensory Boost' style='width:75px')
- .row
- span(data-i18n='roll:-u') ROLL:
- input(type='text' name='attr_global_save_roll' value!='' placeholder='1d4' style='width:75px')
- .globaldisplay(style='width: 75%')
- span(name='attr_global_save_roll')
- | [
- span(name='attr_global_save_name')
- | ]
- .label
- span(data-i18n='saving-throws-u') SAVING THROWS
+ span.material-symbols-outlined.eg-icon star_shine
+ span.insp-text Inspiration
+ button.init-button(type='roll' name='roll_initiative' value!='@{wtype}&{template:simple} {{rname=^{init-u}}} {{mod=@{initiative_bonus}}} {{r1=[[@{initiative_style}+@{initiative_bonus}@{pbd_safe}[INIT] &{tracker}]]}} {{normal=1}} @{charname_output} {{licensedsheet=@{licensedsheet}}}')
+ | Initiative
+ span(name='attr_initiative_bonus_label' title='@{initiative_bonus}')
+ .pb-levelup-row
+ .pb-display
+ span.pb-value
+ | +
+ span(name='attr_pb' title='@{pb}')
+ span.pb-label PROFICIENCY BONUS
+ button.levelup-button(type='action' name='act_launch_lvl+mancer')
+ | Level Up
+ span.material-symbols-outlined.levelup-icon arrow_upload_ready
+ input(type='checkbox' class='show-5e-toggle' name='attr_show_5e_skills' value='1')
+ input.toggleflag(type='hidden' name='attr_global_save_mod_flag')
+ .hidden.textarea.globalattack
+ span.label(data-i18n='global-save-u' style='position: relative; padding-bottom: 5px;') GLOBAL SAVE MODIFIER
+ fieldset.repeating_savemod
+ .global-mod
+ input.options-flag(type='checkbox' name='attr_options-flag' checked='checked' style='top: -15px;')
+ span y
+ input.active-flag(type='checkbox' name='attr_global_save_active_flag' value!='1')
+ .options
+ .row
+ span(data-i18n='name:-u') NAME:
+ input(type='text' name='attr_global_save_name' value!='' placeholder='Sensory Boost' style='width:75px')
+ .row
+ span(data-i18n='roll:-u') ROLL:
+ input(type='text' name='attr_global_save_roll' value!='' placeholder='1d4' style='width:75px')
+ .globaldisplay(style='width: 75%')
+ span(name='attr_global_save_roll')
+ | [
+ span(name='attr_global_save_name')
+ | ]
.skills-container.skills-list
div(data-i18n-list='skills-list')
.skill(data-i18n-list-item='acrobatics')
input(type='checkbox' name='attr_acrobatics_prof' title='@{acrobatics_prof}' value!='(@{pb}*@{acrobatics_type})')
+ input(type='hidden' name='attr_acrobatics_bonus' value='0')
span(name='attr_acrobatics_bonus' title='@{acrobatics_bonus}') 0
- button(type='roll' name='roll_acrobatics' value!='@{wtype}&{template:simple} {{rname=^{acrobatics-u}}} {{mod=@{acrobatics_bonus}}} {{r1=[[@{d20}+@{acrobatics_bonus}@{pbd_safe}]]}} @{rtype}+@{acrobatics_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='acrobatics-core')
- | Acrobatics
+ button(type='roll' name='roll_acrobatics' value!='@{wtype}&{template:simple} {{rname=^{acrobatics-u}}} {{mod=@{acrobatics_bonus}}} {{r1=[[@{acrobatics_d20}+@{acrobatics_bonus}@{pbd_safe}]]}} @{rtype}+@{acrobatics_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='acrobatics-core')
+ | Acrobatics
span (Dex)
- .skill(data-i18n-list-item='astrophysics')
+ .skill.eg-skill(data-i18n-list-item='astrophysics')
input(type='checkbox' name='attr_astrophysics_prof' title='@{astrophysics_prof}' value!='(@{pb}*@{astrophysics_type})')
+ input(type='hidden' name='attr_astrophysics_bonus' value='0')
span(name='attr_astrophysics_bonus' title='@{astrophysics_bonus}') 0
- button(type='roll' name='roll_astrophysics' value!='@{wtype}&{template:simple} {{rname=^{astrophysics-u}}} {{mod=@{astrophysics_bonus}}} {{r1=[[@{d20}+@{astrophysics_bonus}@{pbd_safe}]]}} @{rtype}+@{astrophysics_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='astrophysics-core')
- | Astrophysics
+ button(type='roll' name='roll_astrophysics' value!='@{wtype}&{template:simple} {{rname=^{astrophysics-u}}} {{mod=@{astrophysics_bonus}}} {{r1=[[@{astrophysics_d20}+@{astrophysics_bonus}@{pbd_safe}]]}} @{rtype}+@{astrophysics_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='astrophysics-core')
+ | Astrophysics
span (Int)
.skill(data-i18n-list-item='athletics')
input(type='checkbox' name='attr_athletics_prof' title='@{athletics_prof}' value!='(@{pb}*@{athletics_type})')
+ input(type='hidden' name='attr_athletics_bonus' value='0')
span(name='attr_athletics_bonus' title='@{athletics_bonus}') 0
- button(type='roll' name='roll_athletics' value!='@{wtype}&{template:simple} {{rname=^{athletics-u}}} {{mod=@{athletics_bonus}}} {{r1=[[@{d20}+@{athletics_bonus}@{pbd_safe}]]}} @{rtype}+@{athletics_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='athletics-core')
- | Athletics
+ button(type='roll' name='roll_athletics' value!='@{wtype}&{template:simple} {{rname=^{athletics-u}}} {{mod=@{athletics_bonus}}} {{r1=[[@{athletics_d20}+@{athletics_bonus}@{pbd_safe}]]}} @{rtype}+@{athletics_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='athletics-core')
+ | Athletics
span (Str)
- .skill(data-i18n-list-item='computers')
+ .skill.eg-skill(data-i18n-list-item='computers')
input(type='checkbox' name='attr_computers_prof' title='@{computers_prof}' value!='(@{pb}*@{computers_type})')
+ input(type='hidden' name='attr_computers_bonus' value='0')
span(name='attr_computers_bonus' title='@{computers_bonus}') 0
- button(type='roll' name='roll_computers' value!='@{wtype}&{template:simple} {{rname=^{computers-u}}} {{mod=@{computers_bonus}}} {{r1=[[@{d20}+@{computers_bonus}@{pbd_safe}]]}} @{rtype}+@{computers_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='computers-core')
- | Computers
+ button(type='roll' name='roll_computers' value!='@{wtype}&{template:simple} {{rname=^{computers-u}}} {{mod=@{computers_bonus}}} {{r1=[[@{computers_d20}+@{computers_bonus}@{pbd_safe}]]}} @{rtype}+@{computers_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='computers-core')
+ | Computers
span (Int)
.skill(data-i18n-list-item='deception')
input(type='checkbox' name='attr_deception_prof' title='@{deception_prof}' value!='(@{pb}*@{deception_type})')
+ input(type='hidden' name='attr_deception_bonus' value='0')
span(name='attr_deception_bonus' title='@{deception_bonus}') 0
- button(type='roll' name='roll_deception' value!='@{wtype}&{template:simple} {{rname=^{deception-u}}} {{mod=@{deception_bonus}}} {{r1=[[@{d20}+@{deception_bonus}@{pbd_safe}]]}} @{rtype}+@{deception_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='deception-core')
- | Deception
+ button(type='roll' name='roll_deception' value!='@{wtype}&{template:simple} {{rname=^{deception-u}}} {{mod=@{deception_bonus}}} {{r1=[[@{deception_d20}+@{deception_bonus}@{pbd_safe}]]}} @{rtype}+@{deception_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='deception-core')
+ | Deception
span (Cha)
.skill(data-i18n-list-item='insight')
input(type='checkbox' name='attr_insight_prof' title='@{insight_prof}' value!='(@{pb}*@{insight_type})')
+ input(type='hidden' name='attr_insight_bonus' value='0')
span(name='attr_insight_bonus' title='@{insight_bonus}') 0
- button(type='roll' name='roll_insight' value!='@{wtype}&{template:simple} {{rname=^{insight-u}}} {{mod=@{insight_bonus}}} {{r1=[[@{d20}+@{insight_bonus}@{pbd_safe}]]}} @{rtype}+@{insight_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='insight-core')
- | Insight
+ button(type='roll' name='roll_insight' value!='@{wtype}&{template:simple} {{rname=^{insight-u}}} {{mod=@{insight_bonus}}} {{r1=[[@{insight_d20}+@{insight_bonus}@{pbd_safe}]]}} @{rtype}+@{insight_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='insight-core')
+ | Insight
span (Wis)
.skill(data-i18n-list-item='intimidation')
input(type='checkbox' name='attr_intimidation_prof' title='@{intimidation_prof}' value!='(@{pb}*@{intimidation_type})')
+ input(type='hidden' name='attr_intimidation_bonus' value='0')
span(name='attr_intimidation_bonus' title='@{intimidation_bonus}') 0
- button(type='roll' name='roll_intimidation' value!='@{wtype}&{template:simple} {{rname=^{intimidation-u}}} {{mod=@{intimidation_bonus}}} {{r1=[[@{d20}+@{intimidation_bonus}@{pbd_safe}]]}} @{rtype}+@{intimidation_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='intimidation-core')
- | Intimidation
+ button(type='roll' name='roll_intimidation' value!='@{wtype}&{template:simple} {{rname=^{intimidation-u}}} {{mod=@{intimidation_bonus}}} {{r1=[[@{intimidation_d20}+@{intimidation_bonus}@{pbd_safe}]]}} @{rtype}+@{intimidation_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='intimidation-core')
+ | Intimidation
span (Cha)
.skill(data-i18n-list-item='investigation')
input(type='checkbox' name='attr_investigation_prof' title='@{investigation_prof}' value!='(@{pb}*@{investigation_type})')
+ input(type='hidden' name='attr_investigation_bonus' value='0')
span(name='attr_investigation_bonus' title='@{investigation_bonus}') 0
- button(type='roll' name='roll_investigation' value!='@{wtype}&{template:simple} {{rname=^{investigation-u}}} {{mod=@{investigation_bonus}}} {{r1=[[@{d20}+@{investigation_bonus}@{pbd_safe}]]}} @{rtype}+@{investigation_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='investigation-core')
- | Investigation
+ button(type='roll' name='roll_investigation' value!='@{wtype}&{template:simple} {{rname=^{investigation-u}}} {{mod=@{investigation_bonus}}} {{r1=[[@{investigation_d20}+@{investigation_bonus}@{pbd_safe}]]}} @{rtype}+@{investigation_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='investigation-core')
+ | Investigation
span (Int)
- .skill(data-i18n-list-item='lore')
+ .skill.eg-skill(data-i18n-list-item='lore')
input(type='checkbox' name='attr_lore_prof' title='@{lore_prof}' value!='(@{pb}*@{lore_type})')
+ input(type='hidden' name='attr_lore_bonus' value='0')
span(name='attr_lore_bonus' title='@{lore_bonus}') 0
- button(type='roll' name='roll_lore' value!='@{wtype}&{template:simple} {{rname=^{lore-u}}} {{mod=@{lore_bonus}}} {{r1=[[@{d20}+@{lore_bonus}@{pbd_safe}]]}} @{rtype}+@{lore_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='lore-core')
- | Lore
+ button(type='roll' name='roll_lore' value!='@{wtype}&{template:simple} {{rname=^{lore-u}}} {{mod=@{lore_bonus}}} {{r1=[[@{lore_d20}+@{lore_bonus}@{pbd_safe}]]}} @{rtype}+@{lore_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='lore-core')
+ | Lore
span (Int)
- .skill(data-i18n-list-item='mechanics')
+ .skill.eg-skill(data-i18n-list-item='mechanics')
input(type='checkbox' name='attr_mechanics_prof' title='@{mechanics_prof}' value!='(@{pb}*@{mechanics_type})')
+ input(type='hidden' name='attr_mechanics_bonus' value='0')
span(name='attr_mechanics_bonus' title='@{mechanics_bonus}') 0
- button(type='roll' name='roll_mechanics' value!='@{wtype}&{template:simple} {{rname=^{mechanics-u}}} {{mod=@{mechanics_bonus}}} {{r1=[[@{d20}+@{mechanics_bonus}@{pbd_safe}]]}} @{rtype}+@{mechanics_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='mechanics-core')
- | Mechanics
+ button(type='roll' name='roll_mechanics' value!='@{wtype}&{template:simple} {{rname=^{mechanics-u}}} {{mod=@{mechanics_bonus}}} {{r1=[[@{mechanics_d20}+@{mechanics_bonus}@{pbd_safe}]]}} @{rtype}+@{mechanics_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='mechanics-core')
+ | Mechanics
span (Wis)
.skill(data-i18n-list-item='medicine')
input(type='checkbox' name='attr_medicine_prof' title='@{medicine_prof}' value!='(@{pb}*@{medicine_type})')
+ input(type='hidden' name='attr_medicine_bonus' value='0')
span(name='attr_medicine_bonus' title='@{medicine_bonus}') 0
- button(type='roll' name='roll_medicine' value!='@{wtype}&{template:simple} {{rname=^{medicine-u}}} {{mod=@{medicine_bonus}}} {{r1=[[@{d20}+@{medicine_bonus}@{pbd_safe}]]}} @{rtype}+@{medicine_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='medicine-core')
- | Medicine
+ button(type='roll' name='roll_medicine' value!='@{wtype}&{template:simple} {{rname=^{medicine-u}}} {{mod=@{medicine_bonus}}} {{r1=[[@{medicine_d20}+@{medicine_bonus}@{pbd_safe}]]}} @{rtype}+@{medicine_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='medicine-core')
+ | Medicine
span (Wis)
.skill(data-i18n-list-item='perception')
input(type='checkbox' name='attr_perception_prof' title='@{perception_prof}' value!='(@{pb}*@{perception_type})')
+ input(type='hidden' name='attr_perception_bonus' value='0')
span(name='attr_perception_bonus' title='@{perception_bonus}') 0
- button(type='roll' name='roll_perception' value!='@{wtype}&{template:simple} {{rname=^{perception-u}}} {{mod=@{perception_bonus}}} {{r1=[[@{d20}+@{perception_bonus}@{pbd_safe}]]}} @{rtype}+@{perception_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='perception-core')
- | Perception
+ button(type='roll' name='roll_perception' value!='@{wtype}&{template:simple} {{rname=^{perception-u}}} {{mod=@{perception_bonus}}} {{r1=[[@{perception_d20}+@{perception_bonus}@{pbd_safe}]]}} @{rtype}+@{perception_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='perception-core')
+ | Perception
span (Wis)
.skill(data-i18n-list-item='performance')
input(type='checkbox' name='attr_performance_prof' title='@{performance_prof}' value!='(@{pb}*@{performance_type})')
+ input(type='hidden' name='attr_performance_bonus' value='0')
span(name='attr_performance_bonus' title='@{performance_bonus}') 0
- button(type='roll' name='roll_performance' value!='@{wtype}&{template:simple} {{rname=^{performance-u}}} {{mod=@{performance_bonus}}} {{r1=[[@{d20}+@{performance_bonus}@{pbd_safe}]]}} @{rtype}+@{performance_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='performance-core')
- | Performance
+ button(type='roll' name='roll_performance' value!='@{wtype}&{template:simple} {{rname=^{performance-u}}} {{mod=@{performance_bonus}}} {{r1=[[@{performance_d20}+@{performance_bonus}@{pbd_safe}]]}} @{rtype}+@{performance_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='performance-core')
+ | Performance
span (Cha)
.skill(data-i18n-list-item='persuasion')
input(type='checkbox' name='attr_persuasion_prof' title='@{persuasion_prof}' value!='(@{pb}*@{persuasion_type})')
+ input(type='hidden' name='attr_persuasion_bonus' value='0')
span(name='attr_persuasion_bonus' title='@{persuasion_bonus}') 0
- button(type='roll' name='roll_persuasion' value!='@{wtype}&{template:simple} {{rname=^{persuasion-u}}} {{mod=@{persuasion_bonus}}} {{r1=[[@{d20}+@{persuasion_bonus}@{pbd_safe}]]}} @{rtype}+@{persuasion_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='persuasion-core')
- | Persuasion
+ button(type='roll' name='roll_persuasion' value!='@{wtype}&{template:simple} {{rname=^{persuasion-u}}} {{mod=@{persuasion_bonus}}} {{r1=[[@{persuasion_d20}+@{persuasion_bonus}@{pbd_safe}]]}} @{rtype}+@{persuasion_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='persuasion-core')
+ | Persuasion
span (Wis)
.skill(data-i18n-list-item='sleight_of_hand')
input(type='checkbox' name='attr_sleight_of_hand_prof' title='@{sleight_of_hand_prof}' value!='(@{pb}*@{sleight_of_hand_type})')
+ input(type='hidden' name='attr_sleight_of_hand_bonus' value='0')
span(name='attr_sleight_of_hand_bonus' title='@{sleight_of_hand_bonus}') 0
- button(type='roll' name='roll_sleight_of_hand' value!='@{wtype}&{template:simple} {{rname=^{sleight_of_hand-u}}} {{mod=@{sleight_of_hand_bonus}}} {{r1=[[@{d20}+@{sleight_of_hand_bonus}@{pbd_safe}]]}} @{rtype}+@{sleight_of_hand_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='sleight_of_hand-core')
- | Sleight of Hand
+ button(type='roll' name='roll_sleight_of_hand' value!='@{wtype}&{template:simple} {{rname=^{sleight_of_hand-u}}} {{mod=@{sleight_of_hand_bonus}}} {{r1=[[@{sleight_of_hand_d20}+@{sleight_of_hand_bonus}@{pbd_safe}]]}} @{rtype}+@{sleight_of_hand_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='sleight_of_hand-core')
+ | Sleight of Hand
span (Dex)
.skill(data-i18n-list-item='stealth')
input(type='checkbox' name='attr_stealth_prof' title='@{stealth_prof}' value!='(@{pb}*@{stealth_type})')
+ input(type='hidden' name='attr_stealth_bonus' value='0')
span(name='attr_stealth_bonus' title='@{stealth_bonus}') 0
- button(type='roll' name='roll_stealth' value!='@{wtype}&{template:simple} {{rname=^{stealth-u}}} {{mod=@{stealth_bonus}}} {{r1=[[@{d20}+@{stealth_bonus}@{pbd_safe}]]}} @{rtype}+@{stealth_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='stealth-core')
- | Stealth
+ button(type='roll' name='roll_stealth' value!='@{wtype}&{template:simple} {{rname=^{stealth-u}}} {{mod=@{stealth_bonus}}} {{r1=[[@{stealth_d20}+@{stealth_bonus}@{pbd_safe}]]}} @{rtype}+@{stealth_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='stealth-core')
+ | Stealth
span (Dex)
.skill(data-i18n-list-item='survival')
input(type='checkbox' name='attr_survival_prof' title='@{survival_prof}' value!='(@{pb}*@{survival_type})')
+ input(type='hidden' name='attr_survival_bonus' value='0')
span(name='attr_survival_bonus' title='@{survival_bonus}') 0
- button(type='roll' name='roll_survival' value!='@{wtype}&{template:simple} {{rname=^{survival-u}}} {{mod=@{survival_bonus}}} {{r1=[[@{d20}+@{survival_bonus}@{pbd_safe}]]}} @{rtype}+@{survival_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='survival-core')
- | Survival
+ button(type='roll' name='roll_survival' value!='@{wtype}&{template:simple} {{rname=^{survival-u}}} {{mod=@{survival_bonus}}} {{r1=[[@{survival_d20}+@{survival_bonus}@{pbd_safe}]]}} @{rtype}+@{survival_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='survival-core')
+ | Survival
span (Wis)
- .skill(data-i18n-list-item='xenobiology')
+ .skill.eg-skill(data-i18n-list-item='xenobiology')
input(type='checkbox' name='attr_xenobiology_prof' title='@{xenobiology_prof}' value!='(@{pb}*@{xenobiology_type})')
+ input(type='hidden' name='attr_xenobiology_bonus' value='0')
span(name='attr_xenobiology_bonus' title='@{xenobiology_bonus}') 0
- button(type='roll' name='roll_xenobiology' value!='@{wtype}&{template:simple} {{rname=^{xenobiology-u}}} {{mod=@{xenobiology_bonus}}} {{r1=[[@{d20}+@{xenobiology_bonus}@{pbd_safe}]]}} @{rtype}+@{xenobiology_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='xenobiology-core')
- | Xenobiology
+ button(type='roll' name='roll_xenobiology' value!='@{wtype}&{template:simple} {{rname=^{xenobiology-u}}} {{mod=@{xenobiology_bonus}}} {{r1=[[@{xenobiology_d20}+@{xenobiology_bonus}@{pbd_safe}]]}} @{rtype}+@{xenobiology_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='xenobiology-core')
+ | Xenobiology
+ span (Int)
+ .fivee-separator
+ .skill.fivee-skill(data-i18n-list-item='animal_handling')
+ input(type='checkbox' name='attr_animal_handling_prof' title='@{animal_handling_prof}' value!='(@{pb}*@{animal_handling_type})')
+ input(type='hidden' name='attr_animal_handling_bonus' value='0')
+ span(name='attr_animal_handling_bonus' title='@{animal_handling_bonus}') 0
+ button(type='roll' name='roll_animal_handling' value!='@{wtype}&{template:simple} {{rname=^{animal_handling-u}}} {{mod=@{animal_handling_bonus}}} {{r1=[[@{animal_handling_d20}+@{animal_handling_bonus}@{pbd_safe}]]}} @{rtype}+@{animal_handling_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='animal_handling-core')
+ | Animal Handling
+ span (Wis)
+ .skill.fivee-skill(data-i18n-list-item='arcana')
+ input(type='checkbox' name='attr_arcana_prof' title='@{arcana_prof}' value!='(@{pb}*@{arcana_type})')
+ input(type='hidden' name='attr_arcana_bonus' value='0')
+ span(name='attr_arcana_bonus' title='@{arcana_bonus}') 0
+ button(type='roll' name='roll_arcana' value!='@{wtype}&{template:simple} {{rname=^{arcana-u}}} {{mod=@{arcana_bonus}}} {{r1=[[@{arcana_d20}+@{arcana_bonus}@{pbd_safe}]]}} @{rtype}+@{arcana_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='arcana-core')
+ | Arcana
+ span (Int)
+ .skill.fivee-skill(data-i18n-list-item='history')
+ input(type='checkbox' name='attr_history_prof' title='@{history_prof}' value!='(@{pb}*@{history_type})')
+ input(type='hidden' name='attr_history_bonus' value='0')
+ span(name='attr_history_bonus' title='@{history_bonus}') 0
+ button(type='roll' name='roll_history' value!='@{wtype}&{template:simple} {{rname=^{history-u}}} {{mod=@{history_bonus}}} {{r1=[[@{history_d20}+@{history_bonus}@{pbd_safe}]]}} @{rtype}+@{history_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='history-core')
+ | History
+ span (Int)
+ .skill.fivee-skill(data-i18n-list-item='nature')
+ input(type='checkbox' name='attr_nature_prof' title='@{nature_prof}' value!='(@{pb}*@{nature_type})')
+ input(type='hidden' name='attr_nature_bonus' value='0')
+ span(name='attr_nature_bonus' title='@{nature_bonus}') 0
+ button(type='roll' name='roll_nature' value!='@{wtype}&{template:simple} {{rname=^{nature-u}}} {{mod=@{nature_bonus}}} {{r1=[[@{nature_d20}+@{nature_bonus}@{pbd_safe}]]}} @{rtype}+@{nature_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='nature-core')
+ | Nature
+ span (Int)
+ .skill.fivee-skill(data-i18n-list-item='religion')
+ input(type='checkbox' name='attr_religion_prof' title='@{religion_prof}' value!='(@{pb}*@{religion_type})')
+ input(type='hidden' name='attr_religion_bonus' value='0')
+ span(name='attr_religion_bonus' title='@{religion_bonus}') 0
+ button(type='roll' name='roll_religion' value!='@{wtype}&{template:simple} {{rname=^{religion-u}}} {{mod=@{religion_bonus}}} {{r1=[[@{religion_d20}+@{religion_bonus}@{pbd_safe}]]}} @{rtype}+@{religion_bonus}@{pbd_safe}]]}} {{global=@{global_skill_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='religion-core')
+ | Religion
span (Int)
.label
span(data-i18n='skills-u') SKILLS
- .insp-prof-container(style='width: 100%; margin-top: 2px;')
+ .insp-prof-container.passive-wis-display(style='width: 100%; margin-top: 2px;')
.value
//
span(name='attr_passive_wisdom')
@@ -251,7 +379,7 @@ span(data-i18n='starship-u') STARSHIP
fieldset.repeating_tool
.tool
input.options-flag(type='checkbox' name='attr_options-flag' checked='checked')
- span y
+ span settings
.options
.row
span(data-i18n='name:-u') NAME:
@@ -305,7 +433,7 @@ span(data-i18n='starship-u') STARSHIP
span(style='display: inline;') &
span(data-i18n='custom-skills-u' style='display: inline;') CUSTOM SKILLS
.textbox-container.proficiencies
- input.inventoryflag(type='hidden' name='attr_simpleproficencies' value!='complex')
+ input.inventoryflag(type='hidden' name='attr_simpleproficencies' value='complex')
textarea.sheet-simple(name='attr_other_proficiencies_and_languages' style='min-height: 91px; height: 91px;')
.complex
.top
@@ -335,43 +463,37 @@ span(data-i18n='starship-u') STARSHIP
span(style='margin-top: -10px;' data-i18n='other-prof-langs-u') OTHER PROFICIENCIES & LANGUAGES
.col.col2
.ac-init-speed-container
- .ac
+ .ac-box
+ .ac-box-header
+ span.ac-box-label Armor Class
+ label.ac-gear-toggle
+ input(type='checkbox' class='ac-expand-cb')
+ span.material-symbols-outlined.ac-gear-icon settings
input(type='text' name='attr_ac' title='@{ac}')
- span.label.pc-ac(data-i18n='armor-class-u') ARMOR CLASS
- .init
- span(name='attr_initiative_bonus' title='@{initiative_bonus}')
- button(type='roll' name='roll_initiative' value!='@{wtype}&{template:simple} {{rname=^{init-u}}} {{mod=@{initiative_bonus}}} {{r1=[[@{initiative_style}+@{initiative_bonus}@{pbd_safe}[INIT] &{tracker}]]}} {{normal=1}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='init-u') INITIATIVE
- .speed
+ .ac-details
+ .detail-item
+ input(type='text' name='attr_custom_ac_base' placeholder='10' value='10')
+ span.detail-label Armor
+ .detail-item
+ span.detail-value(name='attr_dexterity_mod') 0
+ span.detail-label Dex Mod
+ .speed-box
+ .speed-box-header
+ span.speed-box-label Speed
+ label.speed-gear-toggle
+ input(type='checkbox' class='speed-expand-cb')
+ span.material-symbols-outlined.speed-gear-icon settings
input(type='text' name='attr_speed' title='@{speed}')
- span.label(data-i18n='speed-u') SPEED
- .hp
- .top
- span(data-i18n='hp-max-u') Hit Point Maximum
- input(type='text' name='attr_hp_max' title='@{hp_max}')
- input(type='number' name='attr_hp' title='@{hp}')
- span.label(data-i18n='hp-current-u') CURRENT HIT POINTS
- .hp(style='height: 56px;')
- input(type='number' name='attr_hp_temp' title='@{hp_temp}')
- span.label(data-i18n='hp-temp-u') TEMPORARY HIT POINTS
- .hdice-dsaves-container(style='width: 242px;')
- .subcontainer
- .top
- span(data-i18n='total') Total
- input(type='text' name='attr_hit_dice_max' title='@{hit_dice_max}')
- input(type='number' name='attr_hit_dice' title='@{hit_dice}' style='margin-bottom: -6px;')
- button(type='roll' name='roll_hit_dice' value!='@{wtype}&{template:simple} {{rname=^{hit-dice-u}}} {{mod=D@{hitdie_final}+[[@{constitution_mod}[CON]]]}} {{r1=[[1d@{hitdie_final}+[[@{constitution_mod}]][CON]]]}} {{normal=1}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='hit-dice-u') HIT DICE
- .subcontainer(style='float: right;')
- .row-container
- span.label(data-i18n='successes-u') SUCCESSES
- input(type='checkbox' name='attr_deathsave_succ1')
- input(type='checkbox' name='attr_deathsave_succ2')
- input(type='checkbox' name='attr_deathsave_succ3')
- .row-container
- span.label(data-i18n='failures-u') FAILURES
- input(type='checkbox' name='attr_deathsave_fail1')
- input(type='checkbox' name='attr_deathsave_fail2')
- input(type='checkbox' name='attr_deathsave_fail3')
- button(type='roll' name='roll_death_save' style='margin-top: 6px;' value!='@{wtype}&{template:simple} {{rname=^{death-save-u}}} {{mod=@{death_save_bonus}}} {{r1=[[@{d20}+@{death_save_bonus}[MOD]@{globalsavingthrowbonus}]]}} {{normal=1}} {{global=@{global_save_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}' data-i18n='death-saves-u') DEATH SAVES
+ .speed-details
+ .detail-item
+ input(type='text' name='attr_speed_fly' placeholder='—')
+ span.detail-label Fly
+ .detail-item
+ input(type='text' name='attr_speed_swim' placeholder='—')
+ span.detail-label Swim
+ .detail-item
+ input(type='text' name='attr_speed_climb' placeholder='—')
+ span.detail-label Climb
input.exhaustion-toggle(type='hidden' name='attr_exhaustion_toggle' value!='0')
.exhaustion(style='position: relative;')
input(type='number' name='attr_exhaustion_level' step='1' min='0' max='6')
@@ -384,15 +506,17 @@ span(data-i18n='starship-u') STARSHIP
span.ex-description(name='attr_exhaustion_6')
span.label(data-i18n='exhaustion-u') EXHAUSTION LEVEL
input.ammoflag(type='hidden' name='attr_ammotracking')
- .attacks(style='position: relative;')
- .top
- span.label(style='width: 95px;' data-i18n='name-u') NAME
- span.label(style='width: 35px;' data-i18n='atk-u') ATK
- span.label(style='width: 65px;' data-i18n='dmg-type-u') DAMAGE/TYPE
+ .attacks
+ span.label(data-i18n='atk-spellcasting-u') ATTACKS & ESPER POWERS
+ .top.atk-header
+ span.atk-col-name NAME
+ span.atk-col-range RANGE
+ span.atk-col-hit HIT / DC
+ span.atk-col-dmg DAMAGE
fieldset.repeating_attack
.attack
input.options-flag(type='checkbox' name='attr_options-flag' checked='checked')
- span y
+ span settings
.options
.row
span(data-i18n='name:-u') NAME:
@@ -497,9 +621,11 @@ span(data-i18n='starship-u') STARSHIP
textarea(name='attr_atk_desc' placeholder='Up to 2 creatures within 5 feet' data-i18n-placeholder='description-place')
.display
button(type='roll' name='roll_attack' value!='@{rollbase}')
- span(name='attr_atkname' style='width: 85px;')
- input(type='text' name='attr_atkbonus' style='width: 40px; text-align: center;' value!='')
- input(type='text' name='attr_atkdmgtype' style='width: 90px;' value!='')
+ span.atk-name-cell(name='attr_atkname')
+ span.atk-range-cell(name='attr_atkrange')
+ input.atk-bonus-cell(type='text' name='attr_atkbonus' value!='')
+ input.atk-dmg-cell(type='text' name='attr_atkdmgtype' value!='')
+
input(type='hidden' name='attr_rollbase')
input(type='hidden' name='attr_rollbase_dmg')
input(type='hidden' name='attr_rollbase_crit')
@@ -554,7 +680,6 @@ span(data-i18n='starship-u') STARSHIP
span.subheader
span(name='attr_global_damage_damage')
span(name='attr_global_damage_type')
- span.label(style='margin-top: 0px; position: absolute; bottom: 0px;' data-i18n='atk-spellcasting-u') ATTACKS & POWERS
input.toggleflag(type='hidden' name='attr_global_ac_mod_flag')
.equipment.hidden
.textarea.globalattack.acmod
@@ -577,110 +702,34 @@ span(data-i18n='starship-u') STARSHIP
span(name='attr_global_ac_name')
| ]
span.label(data-i18n='global-ac-u') GLOBAL AC MODIFIER
- .equipment
- .money
- .coin
- span.label(data-i18n='cubil-cred-u') CUBIL
- input(type='text' name='attr_gp' title='@{cu}')
- .coin
- span.label(data-i18n='cubil-coin-u') COINS
- input(type='text' name='attr_pp' title='@{cn}')
- input.inventoryflag(type='hidden' name='attr_simpleinventory' value!='complex')
- textarea.simple(name='attr_equipment')
- .complex
- input.warningflag(type='hidden' name='attr_armorwarningflag')
- .warning
- span
- label
- input(type='checkbox' name='attr_armorwarningflag' value!='hide')
- | *
- span(data-i18n='warning-armor-sets-u')
- | WARNING - MULTIPLE SETS OF ARMOR OR SHIELDS HAVE BEEN ADDED AND AC IS NOT CORRECTLY CALCULATED. UNEQUIP THE ARMOR PIECE FROM THE ITEM DETAILS.
- input.warningflag(type='hidden' name='attr_customacwarningflag')
- .warning
- span
- label
- input(type='checkbox' name='attr_customacwarningflag' value!='hide')
- | *
- span(data-i18n='warning-customac-u')
- | ATTENTION - YOUR CUSTOM AC CALCULATION IS NOT BEING USED AS YOU HAVE ARMOR EQUIPPED. IF YOU WANT TO USE YOUR CUSTOM AC, UNEQUIP THE ARMOR PIECE FROM THE ITEM DETAILS.
- .header(style='height: auto;')
- span.pictos(style='width: 25px; font-size: 15px;') *
- span(style='width: 100px; text-align: left;' data-i18n='item-name-u') ITEM NAME
- span(style='width: 25px;')
- img(src='https://raw.githubusercontent.com/skydawn1/esper_genesis/master/EG_Inv_weight.png' style='width: 15px; margin-bottom: -3px;' alt='Weight symbol')
- fieldset.repeating_inventory
- input.equippedflag(type='hidden' name='attr_equipped')
- .item
- input.weight(type='text' name='attr_itemcount' value!='1')
- input.name(type='text' name='attr_itemname')
- input.weight(type='text' name='attr_itemweight')
- input.inventorysubflag(type='checkbox' name='attr_inventorysubflag')
- span i
- .subitem
- input.equipped(type='checkbox' name='attr_equipped' value!='1' checked='checked')
- span.equippedlabel(data-i18n='equipped-u') EQUIPPED
- input.equipped(type='checkbox' name='attr_useasresource' value!='1')
- span.equippedlabel(data-i18n='use-as-resource-u') USE AS A RESOURCE
- input.equipped(type='checkbox' name='attr_hasattack' value!='1')
- span.equippedlabel(data-i18n='has-attack-u') HAS AN ATTACK
- span.label(data-i18n='prop:-u') PROP:
- input.subfield(type='text' name='attr_itemproperties')
- span.label(data-i18n='mods:-u') MODS:
- input.subfield(type='text' name='attr_itemmodifiers')
- textarea.subtextarea(name='attr_itemcontent')
- input(type='hidden' name='attr_itemattackid')
- input(type='hidden' name='attr_itemresourceid')
- .weighttotal
- span.label(data-i18n='total-weight-u') TOTAL WEIGHT
- input(type='text' name='attr_weighttotal' value!='0')
- input.encumberance(type='hidden' name='attr_encumberance')
- span.encumb.immobile(data-i18n='immobile-u') IMMOBILE
- span.encumb.heavily(data-i18n='heavily-encumbered-u') HEAVILY ENCUMBERED
- span.encumb.encumbered(data-i18n='encumbered-u') ENCUMBERED
- span.encumb.over(data-i18n='over-carrying-cap-u') OVER CARRYING CAPACITY
- span.label(style='margin-top: 0px; position: absolute; bottom: 0px;' data-i18n='equipment-u') EQUIPMENT
.col.col3
- .textbox.pibf
- input.options-flag(type='checkbox' name='attr_options-flag-personality' checked='checked')
- span y
- .options
- textarea(name='attr_personality_traits' style='min-height: 50px; height: 50px;')
- .display
- span(name='attr_personality_traits')
- span.label(data-i18n='personality-traits-u') PERSONALITY TRAITS
- .textbox.pibf
- input.options-flag(type='checkbox' name='attr_options-flag-ideals' checked='checked')
- span y
- .options
- textarea(name='attr_ideals')
- .display
- span(name='attr_ideals')
- span.label(data-i18n='ideals-u') IDEALS
- .textbox.pibf
- input.options-flag(type='checkbox' name='attr_options-flag-bonds' checked='checked')
- span y
- .options
- textarea(name='attr_bonds')
- .display
- span(name='attr_bonds')
- span.label(data-i18n='bonds-u') BONDS
- .textbox.pibf
- input.options-flag(type='checkbox' name='attr_options-flag-flaws' checked='checked')
- span y
- .options
- textarea(name='attr_flaws' style='min-height: 46px; height: 46px;')
- .display
- span(name='attr_flaws')
- span.label(data-i18n='flaws-u') FLAWS
+ input(type='hidden' name='attr_use_hero_points' value!='0')
+ .hero-points
+ input(type='hidden' name='attr_hero_points')
+ .value
+ input(type='text' name='attr_hero_points' value!='0')
+ .label
+ button.roll-hd.btn.ui-draggable(type='roll' name='roll_hero_points' value!='@{wtype}&{template:simple} {{rname=^{hero-points-u}}} {{r1=[[d6]]}} {{normal=1}} {{r2=[[0d20]]}} @{charname_output}' title='Roll Hero Points')
+ span
+ span(data-i18n='hero-points-u') HERO POINTS
+ | (1D6)
+ span(data-i18n='none-left-u') NONE LEFT
+ input(type='checkbox' name='attr_consumed_hero_points' value!='1')
+ input(type='hidden' name='attr_use_rest_buttons' value!='1')
.resources
+ .rest
+ button(type='action' name='act_short_rest')
+ span(data-i18n='short-rest') SHORT REST
+ button(type='action' name='act_long_rest')
+ span(data-i18n='long-rest') LONG REST
+ input(type='hidden' name='attr_show_tp_resource')
.hdice-dsaves-container(style='width: 246px; margin-top: 10px;')
- .subcontainer(style='height: 64px; width: 119px;')
+ .subcontainer.tp-resource-slot(style='height: 64px; width: 119px;')
.top
span(data-i18n='total') Total
- input(type='text' name='attr_class_resource_max' title='@{class_resource_max}')
- input(type='number' name='attr_class_resource' title='@{class_resource}' style='margin-bottom: -6px;')
- input.label(type='text' name='attr_class_resource_name' title='@{class_resource_name}' placeholder='CLASS RESOURCE' data-i18n-placeholder='class-resource-u')
+ input(type='text' name='attr_tp_max' title='@{tp_max}')
+ input(type='number' name='attr_tp' title='@{tp}' style='margin-bottom: -6px;')
+ span.label TP REMAINING
.subcontainer(style='height: 64px; width: 119px; float: right;')
.top
span(data-i18n='total') Total
@@ -748,124 +797,538 @@ span(data-i18n='starship-u') STARSHIP
| Your data is in the simple version that can be re-enabled from the Settings tab of the character sheet. Under GENERAL OPTIONS and then FEATS & TRAITS. Set the section to be 'Simple'.
.page.bio
.header
- .name-container
- img(src='https://raw.githubusercontent.com/skydawn1/esper_genesis/master/EG_Logo.png' style='padding-bottom: 15px; margin-top: -5px;' alt='Esper Genesis 5E')
- input(type='text' name='attr_character_name' style='width: 100%;')
- span.label(data-i18n='char-name-u') CHARACTER NAME
- .header-info
- .top(style='position: relative; top: 10px;')
- .hlabel-container
- input(type='text' name='attr_age' style='width: 120px;')
- span.label(data-i18n='age-u') AGE
- .hlabel-container
- input(type='text' name='attr_size' style='width: 120px;')
- span.label(data-i18n='size-u') SIZE
- .hlabel-container
- input(type='text' name='attr_height' style='width: 120px;')
- span.label(data-i18n='height-u') HEIGHT
- .hlabel-container
- input(type='text' name='attr_weight' style='width: 120px;')
- span.label(data-i18n='weight-u') WEIGHT
- .bottom
- .hlabel-container
- input(type='text' name='attr_eyes' style='width: 160px;')
- span.label(data-i18n='eye-u') EYES
- .hlabel-container
- input(type='text' name='attr_skin' style='width: 160px;')
- span.label(data-i18n='skin-u') SKIN
- .hlabel-container
- input(type='text' name='attr_hair' style='width: 160px;')
- span.label(data-i18n='hair-u') HAIR
- .body
- .col.col1
- .textbox
- textarea(name='attr_character_appearance' style='min-height: 300px; height: 300px;')
+ .header-left
+ .name-container
+ .token-frame(title='To change your avatar, open Edit Character in the Journal sidebar')
+ img.char-avatar(name='attr_character_avatar' alt='Character Token')
+ .char-info-right
+ .name-fields
+ input(type='text' name='attr_character_name' style='width: 100%;')
+ span.label(data-i18n='char-name-u') CHARACTER NAME
+ input.options-flag(type='checkbox' name='attr_options-class-selection' checked='checked')
+ span y
+ .header-info.sheet-options
+ .sheet-row(style='border-top: 2px dashed gold;')
+ span(data-i18n='class:-u') CLASS:
+ input.sheet-flag(type='hidden' name='attr_custom_class')
+ select.hiding.class(name='attr_class')
+ option(value!='' data-i18n='choose') Choose
+ option(value!='Adept' data-i18n='adept') Adept
+ option(value!='Cybermancer' data-i18n='cybermancer') Cybermancer
+ option(value!='Engineer' data-i18n='engineer') Engineer
+ option(value!='Hunter' data-i18n='hunter') Hunter
+ option(value!='Melder' data-i18n='melder') Melder
+ option(value!='Sentinel' data-i18n='sentinel') Sentinel
+ option(value!='Specialist' data-i18n='specialist') Specialist
+ option(value!='Warrior' data-i18n='warrior') Warrior
+ input.showing(type='text' name='attr_cust_classname' style='width: 90px;')
+ span(data-i18n='subclass:-u') SUBCLASS:
+ input(type='text' name='attr_subclass')
+ span(data-i18n='lvl:-u') LEVEL:
+ input.class-level(type='number' style='width: 40px' name='attr_base_level' value!='1')
+ .sheet-row
+ span(data-i18n='race:-u') RACE:
+ input(type='text' name='attr_race')
+ span(data-i18n='subrace:-u') SUBRACE:
+ input(type='text' name='attr_subrace')
+ .header-info.sheet-display
+ .hlabel-container
+ input.sheet-class-display.sheet-no_events(type='text' name='attr_class_display')
+ span.label(data-i18n='class-level-u') CLASS & LEVEL
+ .hlabel-container
+ input.sheet-no_events(type='text' name='attr_race_display')
+ span.label(data-i18n='race-u') RACE
+ .hlabel-container
+ input(type='text' name='attr_background')
+ span.label(data-i18n='background-u') BACKGROUND
+ .xp-row
+ span.xp-prefix Exp:
+ input(type='text' name='attr_experience')
+ .header-right
+ span.hp-panel-label HIT POINTS
+ .hp-main-row
+ .hp-left-cluster
+ .hp-curmax-group
+ .hp-curmax-box
+ .hp-cm-inputs
+ input(type='number' name='attr_hp' title='@{hp}')
+ span.hp-sep /
+ input(type='text' name='attr_hp_max' title='@{hp_max}')
+ .hp-bar-track
+ .hp-bar-fill
+ .hp-cm-labels
+ span Current
+ span Max
+ .hp-temp-group
+ input(type='number' name='attr_hp_temp' title='@{hp_temp}')
+ span Temp
+ .hp-dmgheal-group
+ .hp-dmgheal-controls
+ button.hp-dmg-btn(type='action' name='act_damage') −
+ input.hp-change-input(type='number' name='attr_hp_change' value='0')
+ button.hp-heal-btn(type='action' name='act_heal') +
+ .hp-dmgheal-labels
+ span Damage
+ span Heal
+ .death-saves-group
+ button.ds-roll-btn(type='roll' name='roll_death_save' value='@{wtype}&{template:simple} {{rname=^{death-save-u}}} {{mod=@{death_save_bonus}}} {{r1=[[@{d20}+@{death_save_bonus}[MOD]@{globalsavingthrowbonus}]]}} {{normal=1}} {{global=@{global_save_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}') DEATH SAVES
+ .ds-pip-box
+ .ds-row
+ span.ds-label(data-i18n='successes-u') Success
+ input.ds-pip.ds-success(type='checkbox' name='attr_deathsave_succ1')
+ input.ds-pip.ds-success(type='checkbox' name='attr_deathsave_succ2')
+ input.ds-pip.ds-success(type='checkbox' name='attr_deathsave_succ3')
+ .ds-row
+ span.ds-label(data-i18n='failures-u') Failure
+ input.ds-pip.ds-failure(type='checkbox' name='attr_deathsave_fail1')
+ input.ds-pip.ds-failure(type='checkbox' name='attr_deathsave_fail2')
+ input.ds-pip.ds-failure(type='checkbox' name='attr_deathsave_fail3')
+ .hp-hitdice-row
+ span.hd-label HIT DICE
+ input.hd-mc1-flag(type='checkbox' name='attr_multiclass1_flag' value='1')
+ input.hd-mc2-flag(type='checkbox' name='attr_multiclass2_flag' value='1')
+ input.hd-mc3-flag(type='checkbox' name='attr_multiclass3_flag' value='1')
+ .hd-group.hd-group-primary
+ button.hd-type-btn(type='roll' name='roll_hit_dice' value='@{wtype}&{template:simple} {{rname=^{hit-dice-u}}} {{mod=D@{hitdietype}+[[@{constitution_mod}[CON]]]}} {{r1=[[1d@{hitdietype}+[[@{constitution_mod}]][CON]]]}} {{normal=1}} @{charname_output} {{licensedsheet=@{licensedsheet}}}')
+ span.hd-btn-label
+ | d
+ span(name='attr_hitdietype')
+ | (
+ span(name='attr_class')
+ | )
+ .hd-count-box
+ input.hd-count-input(type='number' name='attr_hit_dice' title='@{hit_dice}')
+ span.hd-sep /
+ input.hd-max-input(type='text' name='attr_hit_dice_max' title='@{hit_dice_max}')
+ .hd-group.hd-group-mc1
+ button.hd-type-btn(type='roll' name='roll_hit_dice_mc1' value='@{wtype}&{template:simple} {{rname=^{hit-dice-u}}} {{mod=D@{multiclass1_hitdietype}+[[@{constitution_mod}[CON]]]}} {{r1=[[1d@{multiclass1_hitdietype}+[[@{constitution_mod}]][CON]]]}} {{normal=1}} @{charname_output} {{licensedsheet=@{licensedsheet}}}')
+ span.hd-btn-label
+ | d
+ span(name='attr_multiclass1_hitdietype')
+ | (
+ span(name='attr_multiclass1')
+ | )
+ .hd-count-box
+ input.hd-count-input(type='number' name='attr_multiclass1_hit_dice')
+ span.hd-sep /
+ input.hd-max-input(type='text' name='attr_multiclass1_hit_dice_max')
+ .hd-group.hd-group-mc2
+ button.hd-type-btn(type='roll' name='roll_hit_dice_mc2' value='@{wtype}&{template:simple} {{rname=^{hit-dice-u}}} {{mod=D@{multiclass2_hitdietype}+[[@{constitution_mod}[CON]]]}} {{r1=[[1d@{multiclass2_hitdietype}+[[@{constitution_mod}]][CON]]]}} {{normal=1}} @{charname_output} {{licensedsheet=@{licensedsheet}}}')
+ span.hd-btn-label
+ | d
+ span(name='attr_multiclass2_hitdietype')
+ | (
+ span(name='attr_multiclass2')
+ | )
+ .hd-count-box
+ input.hd-count-input(type='number' name='attr_multiclass2_hit_dice')
+ span.hd-sep /
+ input.hd-max-input(type='text' name='attr_multiclass2_hit_dice_max')
+ .hd-group.hd-group-mc3
+ button.hd-type-btn(type='roll' name='roll_hit_dice_mc3' value='@{wtype}&{template:simple} {{rname=^{hit-dice-u}}} {{mod=D@{multiclass3_hitdietype}+[[@{constitution_mod}[CON]]]}} {{r1=[[1d@{multiclass3_hitdietype}+[[@{constitution_mod}]][CON]]]}} {{normal=1}} @{charname_output} {{licensedsheet=@{licensedsheet}}}')
+ span.hd-btn-label
+ | d
+ span(name='attr_multiclass3_hitdietype')
+ | (
+ span(name='attr_multiclass3')
+ | )
+ .hd-count-box
+ input.hd-count-input(type='number' name='attr_multiclass3_hit_dice')
+ span.hd-sep /
+ input.hd-max-input(type='text' name='attr_multiclass3_hit_dice_max')
+ +abilitiesBar()
+ .tab-row
+ .tab-main-group
+ label.tab-label.core(for='tab-core') CORE
+ label.tab-label.bio(for='tab-bio') GEAR & BIO
+ label.tab-label.spells(for='tab-spells') POWERS
+ .tab-type-group
+ label.tab-label.type-pc(for='tab-type-pc') PC
+ label.tab-label.type-starship(for='tab-type-starship') STARSHIP
+ .body.bio-body
+ .col.gear-col
+ .equipment
+ input(type='hidden' name='attr_currency_mode')
+ span.label(data-i18n='equipment-u') EQUIPMENT
+ .money.eg-currency
+ .coin
+ input(type='text' name='attr_cu')
+ span.label(data-i18n='cu-u') CU
+ .coin
+ input(type='text' name='attr_cn')
+ span.label(data-i18n='cn-u') CN
+ .coin
+ input(type='text' name='attr_cs')
+ span.label(data-i18n='cs-u') CS
+ .coin
+ input(type='text' name='attr_om')
+ span.label(data-i18n='om-u') OM
+ .money.fivee-currency
+ .coin
+ input(type='text' name='attr_cp')
+ span.label(data-i18n='cp-u') CP
+ .coin
+ input(type='text' name='attr_sp')
+ span.label(data-i18n='sp-u') SP
+ .coin
+ input(type='text' name='attr_ep')
+ span.label(data-i18n='ep-u') EP
+ .coin
+ input(type='text' name='attr_gp')
+ span.label(data-i18n='gp-u') GP
+ .coin
+ input(type='text' name='attr_pp')
+ span.label(data-i18n='pp-u') PP
+ input.inventoryflag(type='hidden' name='attr_simpleinventory' value!='complex')
+ textarea.simple(name='attr_equipment')
+ .complex
+ input.warningflag(type='hidden' name='attr_armorwarningflag')
+ .warning
+ span
+ label
+ input(type='checkbox' name='attr_armorwarningflag' value!='hide')
+ | *
+ span(data-i18n='warning-armor-sets-u')
+ | WARNING - MULTIPLE SETS OF ARMOR OR SHIELDS HAVE BEEN ADDED AND AC IS NOT CORRECTLY CALCULATED. UNEQUIP THE ARMOR PIECE FROM THE ITEM DETAILS.
+ input.warningflag(type='hidden' name='attr_customacwarningflag')
+ .warning
+ span
+ label
+ input(type='checkbox' name='attr_customacwarningflag' value!='hide')
+ | *
+ span(data-i18n='warning-customac-u')
+ | ATTENTION - YOUR CUSTOM AC CALCULATION IS NOT BEING USED AS YOU HAVE ARMOR EQUIPPED. IF YOU WANT TO USE YOUR CUSTOM AC, UNEQUIP THE ARMOR PIECE FROM THE ITEM DETAILS.
+ .inv-header
+ span.inv-col-count #
+ span.inv-col-name ITEM NAME
+ span.inv-col-weight WT
+ fieldset.repeating_inventory
+ input.equippedflag(type='hidden' name='attr_equipped')
+ .item
+ input.weight(type='text' name='attr_itemcount' value!='1')
+ input.name(type='text' name='attr_itemname')
+ input.weight(type='text' name='attr_itemweight')
+ input.inventorysubflag(type='checkbox' name='attr_inventorysubflag')
+ span i
+ .subitem
+ input.equipped(type='checkbox' name='attr_equipped' value!='1' checked='checked')
+ span.equippedlabel(data-i18n='equipped-u') EQUIPPED
+ input.equipped(type='checkbox' name='attr_useasresource' value!='1')
+ span.equippedlabel(data-i18n='use-as-resource-u') USE AS A RESOURCE
+ input.equipped(type='checkbox' name='attr_hasattack' value!='1')
+ span.equippedlabel(data-i18n='has-attack-u') HAS AN ATTACK
+ span.label(data-i18n='prop:-u') PROP:
+ input.subfield(type='text' name='attr_itemproperties')
+ span.label(data-i18n='mods:-u') MODS:
+ input.subfield(type='text' name='attr_itemmodifiers')
+ textarea.subtextarea(name='attr_itemcontent')
+ input(type='hidden' name='attr_itemattackid')
+ input(type='hidden' name='attr_itemresourceid')
+ .weighttotal
+ .weight-col
+ span.label(data-i18n='total-weight-u') TOTAL WEIGHT
+ input(type='text' name='attr_weighttotal' value!='0')
+ .weight-col
+ span.label MAX CARRY
+ input(type='text' name='attr_carrying_capacity' value!='0')
+ input.encumberance(type='hidden' name='attr_encumberance')
+ span.encumb.immobile(data-i18n='immobile-u') IMMOBILE
+ span.encumb.heavily(data-i18n='heavily-encumbered-u') HEAVILY ENCUMBERED
+ span.encumb.encumbered(data-i18n='encumbered-u') ENCUMBERED
+ span.encumb.over(data-i18n='over-carrying-cap-u') OVER CARRYING CAPACITY
+ .textbox.item-affinity
+ textarea(name='attr_item_affinity')
+ span.label ENHANCED ITEM AFFINITY
+ .col.bio-col
+ .bio-description-row
+ .bio-desc-header
+ span.bio-desc-title(data-i18n='general-information-u') GENERAL INFORMATION
+ label.bio-desc-gear-toggle
+ input.bio-desc-cb(type='checkbox')
+ span.bio-desc-gear-icon settings
+ .bio-desc-display
+ .bio-field
+ span.bio-val(name='attr_age')
+ span.bio-label(data-i18n='age-u') AGE
+ .bio-field
+ span.bio-val(name='attr_size')
+ span.bio-label(data-i18n='size-u') SIZE
+ .bio-field
+ span.bio-val(name='attr_height')
+ span.bio-label(data-i18n='height-u') HEIGHT
+ .bio-field
+ span.bio-val(name='attr_weight')
+ span.bio-label(data-i18n='weight-u') WEIGHT
+ .bio-field
+ span.bio-val(name='attr_alignment')
+ span.bio-label(data-i18n='alignment-u') ALIGNMENT
+ .bio-desc-edit
+ .hlabel-container
+ input(type='text' name='attr_age')
+ span.label(data-i18n='age-u') AGE
+ .hlabel-container
+ input(type='text' name='attr_size')
+ span.label(data-i18n='size-u') SIZE
+ .hlabel-container
+ input(type='text' name='attr_height')
+ span.label(data-i18n='height-u') HEIGHT
+ .hlabel-container
+ input(type='text' name='attr_weight')
+ span.label(data-i18n='weight-u') WEIGHT
+ .hlabel-container
+ input(type='text' name='attr_alignment')
+ span.label(data-i18n='alignment-u') ALIGNMENT
+ .textbox.appearance-box
+ textarea(name='attr_character_appearance' style='min-height: 80px; height: 80px;')
span.label(data-i18n='char-appearance-u') CHARACTER APPEARANCE
- .textbox
- textarea(name='attr_character_backstory' style='min-height: 623px; height: 623px;')
- span.label(data-i18n='char-backstory-u') CHARACTER BACKSTORY
- .col2-3
- .textbox
- textarea(name='attr_allies_and_organizations' style='min-height: 288px; height: 300px;')
- span.label(data-i18n='allies-orgs-u') ALLIES & ORGANIZATIONS
- .textbox
- textarea(name='attr_additional_feature_and_traits' style='min-height: 289px; height: 300px;')
- span.label(data-i18n='add-feats-traits-u') ADDITIONAL FEATURES & TRAITS
- .textbox
- textarea(name='attr_treasure' style='min-height: 300px; height: 300px;')
- span.label(data-i18n='treasure-u') LOOT
+ .bio-background
+ .textbox
+ textarea(name='attr_personality_traits' style='min-height: 80px; height: 80px;')
+ span.label(data-i18n='personality-traits-u') PERSONALITY TRAITS
+ .textbox
+ textarea(name='attr_ideals' style='min-height: 80px; height: 80px;')
+ span.label(data-i18n='ideals-u') IDEALS
+ .textbox
+ textarea(name='attr_bonds' style='min-height: 80px; height: 80px;')
+ span.label(data-i18n='bonds-u') BONDS
+ .textbox
+ textarea(name='attr_flaws' style='min-height: 80px; height: 80px;')
+ span.label(data-i18n='flaws-u') FLAWS
+ .textbox.history-box
+ textarea(name='attr_character_backstory' style='min-height: 200px; height: 200px;')
+ span.label(data-i18n='char-backstory-u') CHARACTER HISTORY
.page.spells
.header
- .name-container
- img(src='https://raw.githubusercontent.com/skydawn1/esper_genesis/master/EG_Logo.png' style='padding-bottom: 15px; margin-top: -5px;' alt='Esper Genesis 5E')
- input(type='text' name='attr_character_name' style='width: 100%;')
- span.label(data-i18n='char-name-u') CHARACTER NAME
- .header-info
- .part
- select(name='attr_spellcasting_ability')
- option(value!='0*' data-i18n='none-u') NONE
- option(value!='@{strength_mod}+' data-i18n='strength-u') STRENGTH
- option(value!='@{dexterity_mod}+' data-i18n='dexterity-u') DEXTERITY
- option(value!='@{constitution_mod}+' data-i18n='constitution-u') CONSTITUTION
- option(value!='@{intelligence_mod}+' data-i18n='intelligence-u') INTELLIGENCE
- option(value!='@{wisdom_mod}+' data-i18n='wisdom-u') WISDOM
- option(value!='@{charisma_mod}+' data-i18n='charisma-u') CHARISMA
- span.label(data-i18n='spell-ability-u') ESPER ABILITY
- .part
- span.display(name='attr_spell_save_dc')
- span.label(data-i18n='spell-save-dc-u') POWER SAVE DC
- .part
- span.display(name='attr_spell_attack_bonus')
- span.label(data-i18n='spell-atk-bonus-u') POWER ATTACK BONUS
+ .header-left
+ .name-container
+ .token-frame(title='To change your avatar, open Edit Character in the Journal sidebar')
+ img.char-avatar(name='attr_character_avatar' alt='Character Token')
+ .char-info-right
+ .name-fields
+ input(type='text' name='attr_character_name' style='width: 100%;')
+ span.label(data-i18n='char-name-u') CHARACTER NAME
+ input.options-flag(type='checkbox' name='attr_options-class-selection' checked='checked')
+ span y
+ .header-info.sheet-options
+ .sheet-row(style='border-top: 2px dashed gold;')
+ span(data-i18n='class:-u') CLASS:
+ input.sheet-flag(type='hidden' name='attr_custom_class')
+ select.hiding.class(name='attr_class')
+ option(value!='' data-i18n='choose') Choose
+ option(value!='Adept' data-i18n='adept') Adept
+ option(value!='Cybermancer' data-i18n='cybermancer') Cybermancer
+ option(value!='Engineer' data-i18n='engineer') Engineer
+ option(value!='Hunter' data-i18n='hunter') Hunter
+ option(value!='Melder' data-i18n='melder') Melder
+ option(value!='Sentinel' data-i18n='sentinel') Sentinel
+ option(value!='Specialist' data-i18n='specialist') Specialist
+ option(value!='Warrior' data-i18n='warrior') Warrior
+ input.showing(type='text' name='attr_cust_classname' style='width: 90px;')
+ span(data-i18n='subclass:-u') SUBCLASS:
+ input(type='text' name='attr_subclass')
+ span(data-i18n='lvl:-u') LEVEL:
+ input.class-level(type='number' style='width: 40px' name='attr_base_level' value!='1')
+ .sheet-row
+ span(data-i18n='race:-u') RACE:
+ input(type='text' name='attr_race')
+ span(data-i18n='subrace:-u') SUBRACE:
+ input(type='text' name='attr_subrace')
+ .header-info.sheet-display
+ .hlabel-container
+ input.sheet-class-display.sheet-no_events(type='text' name='attr_class_display')
+ span.label(data-i18n='class-level-u') CLASS & LEVEL
+ .hlabel-container
+ input.sheet-no_events(type='text' name='attr_race_display')
+ span.label(data-i18n='race-u') RACE
+ .hlabel-container
+ input(type='text' name='attr_background')
+ span.label(data-i18n='background-u') BACKGROUND
+ .xp-row
+ span.xp-prefix Exp:
+ input(type='text' name='attr_experience')
+ .header-right
+ span.hp-panel-label HIT POINTS
+ .hp-main-row
+ .hp-left-cluster
+ .hp-curmax-group
+ .hp-curmax-box
+ .hp-cm-inputs
+ input(type='number' name='attr_hp' title='@{hp}')
+ span.hp-sep /
+ input(type='text' name='attr_hp_max' title='@{hp_max}')
+ .hp-bar-track
+ .hp-bar-fill
+ .hp-cm-labels
+ span Current
+ span Max
+ .hp-temp-group
+ input(type='number' name='attr_hp_temp' title='@{hp_temp}')
+ span Temp
+ .hp-dmgheal-group
+ .hp-dmgheal-controls
+ button.hp-dmg-btn(type='action' name='act_damage') −
+ input.hp-change-input(type='number' name='attr_hp_change' value='0')
+ button.hp-heal-btn(type='action' name='act_heal') +
+ .hp-dmgheal-labels
+ span Damage
+ span Heal
+ .death-saves-group
+ button.ds-roll-btn(type='roll' name='roll_death_save' value='@{wtype}&{template:simple} {{rname=^{death-save-u}}} {{mod=@{death_save_bonus}}} {{r1=[[@{d20}+@{death_save_bonus}[MOD]@{globalsavingthrowbonus}]]}} {{normal=1}} {{global=@{global_save_mod}}} @{charname_output} {{licensedsheet=@{licensedsheet}}}') DEATH SAVES
+ .ds-pip-box
+ .ds-row
+ span.ds-label(data-i18n='successes-u') Success
+ input.ds-pip.ds-success(type='checkbox' name='attr_deathsave_succ1')
+ input.ds-pip.ds-success(type='checkbox' name='attr_deathsave_succ2')
+ input.ds-pip.ds-success(type='checkbox' name='attr_deathsave_succ3')
+ .ds-row
+ span.ds-label(data-i18n='failures-u') Failure
+ input.ds-pip.ds-failure(type='checkbox' name='attr_deathsave_fail1')
+ input.ds-pip.ds-failure(type='checkbox' name='attr_deathsave_fail2')
+ input.ds-pip.ds-failure(type='checkbox' name='attr_deathsave_fail3')
+ .hp-hitdice-row
+ span.hd-label HIT DICE
+ input.hd-mc1-flag(type='checkbox' name='attr_multiclass1_flag' value='1')
+ input.hd-mc2-flag(type='checkbox' name='attr_multiclass2_flag' value='1')
+ input.hd-mc3-flag(type='checkbox' name='attr_multiclass3_flag' value='1')
+ .hd-group.hd-group-primary
+ button.hd-type-btn(type='roll' name='roll_hit_dice' value='@{wtype}&{template:simple} {{rname=^{hit-dice-u}}} {{mod=D@{hitdietype}+[[@{constitution_mod}[CON]]]}} {{r1=[[1d@{hitdietype}+[[@{constitution_mod}]][CON]]]}} {{normal=1}} @{charname_output} {{licensedsheet=@{licensedsheet}}}')
+ span.hd-btn-label
+ | d
+ span(name='attr_hitdietype')
+ | (
+ span(name='attr_class')
+ | )
+ .hd-count-box
+ input.hd-count-input(type='number' name='attr_hit_dice' title='@{hit_dice}')
+ span.hd-sep /
+ input.hd-max-input(type='text' name='attr_hit_dice_max' title='@{hit_dice_max}')
+ .hd-group.hd-group-mc1
+ button.hd-type-btn(type='roll' name='roll_hit_dice_mc1' value='@{wtype}&{template:simple} {{rname=^{hit-dice-u}}} {{mod=D@{multiclass1_hitdietype}+[[@{constitution_mod}[CON]]]}} {{r1=[[1d@{multiclass1_hitdietype}+[[@{constitution_mod}]][CON]]]}} {{normal=1}} @{charname_output} {{licensedsheet=@{licensedsheet}}}')
+ span.hd-btn-label
+ | d
+ span(name='attr_multiclass1_hitdietype')
+ | (
+ span(name='attr_multiclass1')
+ | )
+ .hd-count-box
+ input.hd-count-input(type='number' name='attr_multiclass1_hit_dice')
+ span.hd-sep /
+ input.hd-max-input(type='text' name='attr_multiclass1_hit_dice_max')
+ .hd-group.hd-group-mc2
+ button.hd-type-btn(type='roll' name='roll_hit_dice_mc2' value='@{wtype}&{template:simple} {{rname=^{hit-dice-u}}} {{mod=D@{multiclass2_hitdietype}+[[@{constitution_mod}[CON]]]}} {{r1=[[1d@{multiclass2_hitdietype}+[[@{constitution_mod}]][CON]]]}} {{normal=1}} @{charname_output} {{licensedsheet=@{licensedsheet}}}')
+ span.hd-btn-label
+ | d
+ span(name='attr_multiclass2_hitdietype')
+ | (
+ span(name='attr_multiclass2')
+ | )
+ .hd-count-box
+ input.hd-count-input(type='number' name='attr_multiclass2_hit_dice')
+ span.hd-sep /
+ input.hd-max-input(type='text' name='attr_multiclass2_hit_dice_max')
+ .hd-group.hd-group-mc3
+ button.hd-type-btn(type='roll' name='roll_hit_dice_mc3' value='@{wtype}&{template:simple} {{rname=^{hit-dice-u}}} {{mod=D@{multiclass3_hitdietype}+[[@{constitution_mod}[CON]]]}} {{r1=[[1d@{multiclass3_hitdietype}+[[@{constitution_mod}]][CON]]]}} {{normal=1}} @{charname_output} {{licensedsheet=@{licensedsheet}}}')
+ span.hd-btn-label
+ | d
+ span(name='attr_multiclass3_hitdietype')
+ | (
+ span(name='attr_multiclass3')
+ | )
+ .hd-count-box
+ input.hd-count-input(type='number' name='attr_multiclass3_hit_dice')
+ span.hd-sep /
+ input.hd-max-input(type='text' name='attr_multiclass3_hit_dice_max')
input.spellicon_flag(type='hidden' name='attr_spellicon_flag' value!='all')
+ +abilitiesBar()
+ .tab-row
+ .tab-main-group
+ label.tab-label.core(for='tab-core') CORE
+ label.tab-label.bio(for='tab-bio') GEAR & BIO
+ label.tab-label.spells(for='tab-spells') POWERS
+ .tab-type-group
+ label.tab-label.type-pc(for='tab-type-pc') PC
+ label.tab-label.type-starship(for='tab-type-starship') STARSHIP
.body
- .col.col2
- .tp(style='margin-top: 10px;')
- .top
- span(data-i18n='tp-max-u') Talent Point Maximum
- input(type='text' name='attr_tp_max' title='@{tp_max}')
- input(type='number' name='attr_tp' title='@{tp}')
- span.label(data-i18n='tp-current-u' style='margin-top: 5px;') TALENT POINTS REMAINING
- .col.col2
- span.label(data-i18n='talent-slots-label' style='margin-bottom: 3px; margin-top: 10px;') TALENT SLOTS (Cybermancer)
- .hdice-dsaves-container(style='width: 242px;')
- .subcontainer
- .top
- span(data-i18n='max-rank-u') Rank
- input(type='text' name='attr_slot_rank_max' title='@{slot_rank_max}')
- input(type='number' name='attr_slots_max' title='@{talent_slots}' style='margin-bottom: -6px;')
- span.label(data-i18n='talent-slots-u' style='margin-top: 6px;') Max Talent Slots
- .subcontainer
- .speed
- input(type='number' name='attr_slots_used' title='@{slots_used}' style='margin-top: 20px;')
- span.label(data-i18n='used-talent-slots' style='margin-top: 2px;') Slots Remaining
- .col.col3
- .class_options.esper-mastery(style='margin-top: 10px;')
- .column
- span.em_blank
- span(data-i18n='em_available') Gained?
- span(data-i18n='em_used') Used
- .column
- span(data='em_rank') 6th
- .sub-button
- input(type='checkbox' name='attr_mastery_6th' value!='1')
- input(type='checkbox' name='attr_mastery_6th_used' value!='1')
- .column
- span(data='em_rank') 7th
- .sub-button
- input(type='checkbox' name='attr_mastery_7th' value!='1')
- input(type='checkbox' name='attr_mastery_7th_used' value!='1')
- .column
- span(data='em_rank') 8th
- .sub-button
- input(type='checkbox' name='attr_mastery_8th' value!='1')
- input(type='checkbox' name='attr_mastery_8th_used' value!='1')
- .column
- span(data='em_rank') 9th
- .sub-button
- input(type='checkbox' name='attr_mastery_9th' value!='1')
- input(type='checkbox' name='attr_mastery_9th_used' value!='1')
- span.label(style='margin-top: 8px; margin-bottom: -3px;' data-i18n='esper-mastery-u') ESPER MASTERY
+ .col.col-full
+ .powers-info-row
+ .powers-info-header
+ span.powers-info-spacer
+ span.powers-info-title(data-i18n='power-settings-u') POWER SETTINGS
+ label.powers-info-gear-toggle
+ input.powers-info-cb(type='checkbox')
+ span.powers-info-gear-icon settings
+ .powers-info-display
+ .powers-info-field
+ select(name='attr_spellcasting_ability')
+ option(value!='0*' data-i18n='none-u') NONE
+ option(value!='@{strength_mod}+' data-i18n='strength-u') STRENGTH
+ option(value!='@{dexterity_mod}+' data-i18n='dexterity-u') DEXTERITY
+ option(value!='@{constitution_mod}+' data-i18n='constitution-u') CONSTITUTION
+ option(value!='@{intelligence_mod}+' data-i18n='intelligence-u') INTELLIGENCE
+ option(value!='@{wisdom_mod}+' data-i18n='wisdom-u') WISDOM
+ option(value!='@{charisma_mod}+' data-i18n='charisma-u') CHARISMA
+ span.powers-info-label(data-i18n='spell-ability-u') ESPER ABILITY
+ .powers-info-field
+ span.display(name='attr_spell_save_dc')
+ span.powers-info-label(data-i18n='spell-save-dc-u') POWER SAVE DC
+ .powers-info-field
+ span.display(name='attr_spell_attack_bonus')
+ span.powers-info-label(data-i18n='spell-atk-bonus-u') POWER ATTACK BONUS
+ .powers-stats-row
+ .col.col2
+ .tp
+ .tp-section-header
+ span.tp-section-title(data-i18n='tp-u') TALENT POINTS
+ .tp-section-body
+ .top
+ span(data-i18n='tp-max-u') Talent Point Maximum
+ input(type='text' name='attr_tp_max' title='@{tp_max}')
+ input(type='number' name='attr_tp' title='@{tp}')
+ span.label(data-i18n='tp-current-u') TALENT POINTS REMAINING
+ .col.col2
+ .talent-slots-block
+ .ts-section-header
+ span.ts-section-title(data-i18n='talent-slots-label') TALENT SLOTS (Cybermancer)
+ .hdice-dsaves-container
+ .subcontainer
+ .top
+ span(data-i18n='max-rank-u') Rank
+ input(type='text' name='attr_slot_rank_max' title='@{slot_rank_max}')
+ input(type='number' name='attr_slots_max' title='@{talent_slots}')
+ span.label(data-i18n='talent-slots-u') MAX TALENT SLOTS
+ .subcontainer
+ .speed
+ input(type='number' name='attr_slots_used' title='@{slots_used}')
+ span.label(data-i18n='used-talent-slots') SLOTS REMAINING
+ .col.col3
+ .class_options.esper-mastery
+ .em-section-header
+ span.em-section-title(data-i18n='esper-mastery-u') ESPER MASTERY
+ .em-section-body
+ .column
+ span.em_blank
+ span(data-i18n='em_available') Gained?
+ span(data-i18n='em_used') Used
+ .column
+ span(data='em_rank') 6th
+ .sub-button
+ input(type='checkbox' name='attr_mastery_6th' value!='1')
+ input(type='checkbox' name='attr_mastery_6th_used' value!='1')
+ .column
+ span(data='em_rank') 7th
+ .sub-button
+ input(type='checkbox' name='attr_mastery_7th' value!='1')
+ input(type='checkbox' name='attr_mastery_7th_used' value!='1')
+ .column
+ span(data='em_rank') 8th
+ .sub-button
+ input(type='checkbox' name='attr_mastery_8th' value!='1')
+ input(type='checkbox' name='attr_mastery_8th_used' value!='1')
+ .column
+ span(data='em_rank') 9th
+ .sub-button
+ input(type='checkbox' name='attr_mastery_9th' value!='1')
+ input(type='checkbox' name='attr_mastery_9th_used' value!='1')
.col.col-full
.spell-header
span(data-i18n='esper-powers-u') =ESPER POWERS
@@ -2853,57 +3316,16 @@ span(data-i18n='starship-u') STARSHIP
.row
span.bold.italics(data-i18n='at-higher-lvl') At Higher Ranks
span(name='attr_spellathigherlevels')
-.page.options
- .header
- .name-container
- img(src='https://raw.githubusercontent.com/skydawn1/esper_genesis/master/EG_Logo.png' style='padding-bottom: 15px; margin-top: -5px;' alt='Esper Genesis 5E')
- input(type='text' name='attr_character_name' style='width: 100%;')
- span.label(data-i18n='char-name-u') CHARACTER NAME
- input.options-flag(type='checkbox' name='attr_options-class-selection' checked='checked')
- span y
- .header-info.sheet-options
- .sheet-row(style='border-top: 2px dashed gold;')
- span(data-i18n='class:-u') CLASS:
- input.sheet-flag(type='hidden' name='attr_custom_class')
- select.hiding.class(name='attr_class')
- option(value!='' data-i18n='choose') Choose
- option(value!='Adept' data-i18n='adept') Adept
- option(value!='Cybermancer' data-i18n='cybermancer') Cybermancer
- option(value!='Engineer' data-i18n='engineer') Engineer
- option(value!='Hunter' data-i18n='hunter') Hunter
- option(value!='Melder' data-i18n='melder') Melder
- option(value!='Sentinel' data-i18n='sentinel') Sentinel
- option(value!='Specialist' data-i18n='specialist') Specialist
- option(value!='Warrior' data-i18n='warrior') Warrior
- input.showing(type='text' name='attr_cust_classname' style='width: 90px;')
- span(data-i18n='subclass:-u') SUBCLASS:
- input(type='text' name='attr_subclass')
- span(data-i18n='lvl:-u') LEVEL:
- input.class-level(type='number' style='width: 40px' name='attr_base_level' value!='1')
- .sheet-row
- span(data-i18n='race:-u') RACE:
- input(type='text' name='attr_race')
- span(data-i18n='subrace:-u') SUBRACE:
- input(type='text' name='attr_subrace')
- .header-info.sheet-display
- .top
- .hlabel-container
- input.sheet-class-display.sheet-no_events(type='text' name='attr_class_display')
- span.label(data-i18n='class-level-u') CLASS & LEVEL
- .hlabel-container
- input(type='text' name='attr_background' style='width: 182px;')
- span.label(data-i18n='background-u') BACKGROUND
- .bottom
- .hlabel-container
- input.sheet-no_events(type='text' name='attr_race_display')
- span.label(data-i18n='race-u') RACE
- .hlabel-container
- input(type='text' name='attr_alignment')
- span.label(data-i18n='alignment-u') ALIGNMENT
- .hlabel-container(style='position: relative;')
- input(type='text' name='attr_experience')
- span.label(data-i18n='exp-pts-u') EXPERIENCE POINTS
- .body
+.pc-logo-footer
+ img.pc-logo-img(src='https://raw.githubusercontent.com/skydawn1/esper_genesis/master/EG_Logo.png' alt='Esper Genesis Logo')
+.settings-modal-overlay
+ label.settings-modal-backdrop(for='settings-modal-toggle')
+ .settings-modal-panel
+ .settings-modal-header
+ span.settings-modal-title ⚙ SHEET SETTINGS
+ label.settings-modal-close(for='settings-modal-toggle') ✕
+ //- .settings-modal-body contains col1 and col2 settings content (see EG_Sheet.html)
+ .settings-modal-body
.col.col1
.class_options
.row
@@ -3210,6 +3632,7 @@ span(data-i18n='starship-u') STARSHIP
input.num(type='text' name='attr_globalsavemod' placeholder='0' value!='0')
.row.title
span(data-i18n='save-opts-u') SAVE OPTIONS
+ input(type='checkbox' class='show-5e-settings-toggle' name='attr_show_5e_skills' value='1')
.skill_options(style='width: 234px;')
div(data-i18n-list='skills-list')
.row.skill(data-i18n-list-item='acrobatics')
@@ -3370,23 +3793,68 @@ span(data-i18n='starship-u') STARSHIP
option(value!='1' selected='selected' data-i18n='normal') Normal
option(value!='2' data-i18n='expirtise') Expertise
span(data-i18n='xenobiology-core')
- | Xenobiology
+ | Xenobiology
span (Int)
span +
input.num(type='text' name='attr_xenobiology_flat' value!='0' placeholder='0' title='@{xenobiology_flat}')
+ .row.skill(data-i18n-list-item='animal_handling')
+ select(name='attr_animal_handling_type')
+ option(value!='1' selected='selected' data-i18n='normal') Normal
+ option(value!='2' data-i18n='expirtise') Expertise
+ span(data-i18n='animal_handling-core')
+ | Animal Handling
+ span (Wis)
+ span +
+ input.num(type='text' name='attr_animal_handling_flat' value!='0' placeholder='0' title='@{animal_handling_flat}')
+ .row.skill(data-i18n-list-item='arcana')
+ select(name='attr_arcana_type')
+ option(value!='1' selected='selected' data-i18n='normal') Normal
+ option(value!='2' data-i18n='expirtise') Expertise
+ span(data-i18n='arcana-core')
+ | Arcana
+ span (Int)
+ span +
+ input.num(type='text' name='attr_arcana_flat' value!='0' placeholder='0' title='@{arcana_flat}')
+ .row.skill(data-i18n-list-item='history')
+ select(name='attr_history_type')
+ option(value!='1' selected='selected' data-i18n='normal') Normal
+ option(value!='2' data-i18n='expirtise') Expertise
+ span(data-i18n='history-core')
+ | History
+ span (Int)
+ span +
+ input.num(type='text' name='attr_history_flat' value!='0' placeholder='0' title='@{history_flat}')
+ .row.skill(data-i18n-list-item='nature')
+ select(name='attr_nature_type')
+ option(value!='1' selected='selected' data-i18n='normal') Normal
+ option(value!='2' data-i18n='expirtise') Expertise
+ span(data-i18n='nature-core')
+ | Nature
+ span (Int)
+ span +
+ input.num(type='text' name='attr_nature_flat' value!='0' placeholder='0' title='@{nature_flat}')
+ .row.skill(data-i18n-list-item='religion')
+ select(name='attr_religion_type')
+ option(value!='1' selected='selected' data-i18n='normal') Normal
+ option(value!='2' data-i18n='expirtise') Expertise
+ span(data-i18n='religion-core')
+ | Religion
+ span (Int)
+ span +
+ input.num(type='text' name='attr_religion_flat' value!='0' placeholder='0' title='@{religion_flat}')
.row(style='margin-top:10px;')
input(type='checkbox' name='attr_jack_of_all_trades' value!='@{jack}')
span(data-i18n='jack-of-all-u') JACK OF ALL TRADES
.row
span(data-i18n='pass-perc-mod:-u') PASSIVE PERCEPTION MODIFIER:
input.num(type='text' name='attr_passiveperceptionmod' placeholder='0' value!='0')
+ .row
+ input(type='checkbox' name='attr_show_5e_skills' value!='1')
+ span(data-i18n='show-5e-skills-u') SHOW 5E SKILLS?
.row.title
span(data-i18n='skill-opts-u') SKILL OPTIONS
.col.col3
.general_options
- .version
- span(data-i18n='version') v
- span(name='attr_version')
.row
input(type='checkbox' name='attr_npc' value!='1')
span(data-i18n='npc-u') NPC/SHIP
@@ -3412,6 +3880,17 @@ span(data-i18n='starship-u') STARSHIP
.row
span(data-i18n='core-die-roll:-u') CORE DIE ROLL:
input(type='text' name='attr_core_die' value!='1d20' placeholder='1d20' title='@{core_die}')
+ .row
+ span(data-i18n='default-critical-range:-u') CRITICAL RANGE:
+ input(type='number' name='attr_default_critical_range' value!='20' placeholder='20')
+ .row
+ span(data-i18n='reliable-talent:-u') RELIABLE TALENT:
+ select(name='attr_reliable_talent')
+ option(value='0' data-i18n='off') Off
+ option(value='10' data-i18n='on') On
+ .row
+ span(data-i18n='powerful_build-u') POWERFUL BUILD
+ input(type='checkbox' name='attr_powerful_build' value='1')
.row
span(data-i18n='prof-bonus:-u') PROFICIENCY BONUS:
select.dtype(name='attr_pb_type')
@@ -3479,29 +3958,38 @@ span(data-i18n='starship-u') STARSHIP
select(name='attr_exhaustion_toggle')
option(value!='1' data-i18n='on') On
option(value!='0' data-i18n='off' selected='selected') Off
+ .row
+ span(data-i18n='hero-points-u') HERO POINTS:
+ select(name='attr_use_hero_points')
+ option(value!='0' data-i18n='off' selected='selected') Off
+ option(value!='1' data-i18n='on') On
+ .row
+ span(data-i18n='rest-buttons-u') SHORT/LONG REST BUTTONS:
+ select(name='attr_use_rest_buttons')
+ option(value!='1' data-i18n='on' selected='selected') On
+ option(value!='0' data-i18n='off') Off
.row.title
span(data-i18n='general-opts-u') GENERAL OPTIONS
- //
- .general_options.charactermancer_options
- input.warningflag(type='hidden' name='attr_leveler_warningflag')
- .warning
- span
- label
- input(type='checkbox' name='attr_leveler_warningflag' value='hide')
- | *
- span(data-i18n='warning-leveler_start-u')
- | ATTENTION - YOU CANNOT LAUNCH THE CHARACTERMANCER LEVEL UP UNTIL YOU HAVE A CLASS, LEVEL, AND HP SET FOR LEVEL ONE. PLEASE RUN THE CHARACTERMANCER CREATOR FIRST. THE LEVEL UP TOOL DOESN'T WORK WITH CUSTOM CLASSES OR IF THE MULTICLASS OPTIONS ARE SET UP INCORRECTLY.
- .row
- button(type='action' name='act_relaunch_lvl1mancer' style='padding: 0px;')
- img(src='https://s3.amazonaws.com/files.d20.io/images/175804938/qmVmtNHONHhHcd9cxCxm7w/med.png?1604618286' style='height: 32px; width: 32px' alt='Wand & Hammer of Charactermancer')
- span(style='width: 180px; margin-left: 10px; display: inline-block;' data-i18n='relaunch-lvl1mancer-u') LAUNCH LEVEL 1 CHARACTERMANCER (CANNOT BE UNDONE)
- .row
- button(type='action' name='act_launch_lvl+mancer' style='padding: 0px;')
- img(src='https://s3.amazonaws.com/files.d20.io/images/175804938/qmVmtNHONHhHcd9cxCxm7w/med.png?1604618286' style='height: 32px; width: 32px' alt='Wand & Hammer of Charactermancer')
- span(style='width: 180px; margin-left: 10px; display: inline-block;') LAUNCH LEVEL+ CHARACTERMANCER
- .row.title
- span(data-i18n='mancer-opts-u') CHARACTERMANCER OPTIONS
+ .general_options.charactermancer_options
+ input.warningflag(type='hidden' name='attr_leveler_warningflag')
+ .warning
+ span
+ label
+ input(type='checkbox' name='attr_leveler_warningflag' value='hide')
+ | *
+ span(data-i18n='warning-leveler_start-u')
+ | ATTENTION - YOU CANNOT LAUNCH THE CHARACTERMANCER LEVEL UP UNTIL YOU HAVE A CLASS, LEVEL, AND HP SET FOR LEVEL ONE. PLEASE RUN THE CHARACTERMANCER CREATOR FIRST. THE LEVEL UP TOOL DOESN'T WORK WITH CUSTOM CLASSES OR IF THE MULTICLASS OPTIONS ARE SET UP INCORRECTLY.
+ .row
+ button(type='action' name='act_relaunch_lvl1mancer' style='padding: 0px;')
+ img(src='https://s3.amazonaws.com/files.d20.io/images/175804938/qmVmtNHONHhHcd9cxCxm7w/med.png?1604618286' style='height: 32px; width: 32px' alt='Wand & Hammer of Charactermancer')
+ span(style='width: 180px; margin-left: 10px; display: inline-block;' data-i18n='relaunch-lvl1mancer-u') LAUNCH LEVEL 1 CHARACTERMANCER (CANNOT BE UNDONE)
+ .row
+ button(type='action' name='act_launch_lvl+mancer' style='padding: 0px;')
+ img(src='https://s3.amazonaws.com/files.d20.io/images/175804938/qmVmtNHONHhHcd9cxCxm7w/med.png?1604618286' style='height: 32px; width: 32px' alt='Wand & Hammer of Charactermancer')
+ span(style='width: 180px; margin-left: 10px; display: inline-block;') LAUNCH LEVEL+ CHARACTERMANCER
+ .row.title
+ span(data-i18n='mancer-opts-u') CHARACTERMANCER OPTIONS
.footer
div(style='margin-right: 50px; margin-left: 10px;')
span(data-i18n='portions-sheet-utilize')
diff --git a/Esper_Genesis_5E/src/pc/ship.pug b/Esper_Genesis_5E/src/pc/ship.pug
index 40bdd093a3..c386f7d6cd 100644
--- a/Esper_Genesis_5E/src/pc/ship.pug
+++ b/Esper_Genesis_5E/src/pc/ship.pug
@@ -27,31 +27,53 @@ mixin armorClassOrManeuverEntry(name)
span(data-i18n=`${name.replace(/_/g,'-')}`)
.sheet-pc-ship
- input.tab-button.type-pc(name='attr_pc_sheet_type' type='radio' value!='pc' checked='checked')
- span(data-i18n='pc-u') PC
- input.tab-button.type-starship(name='attr_pc_sheet_type' type='radio' value!='starship')
- span(data-i18n='starship-u') STARSHIP
+ input.tab-button.type-pc(id='tab-type-pc-ship' name='attr_pc_sheet_type' type='radio' value!='pc' checked='checked')
+ input.tab-button.type-starship(id='tab-type-starship-ship' name='attr_pc_sheet_type' type='radio' value!='starship')
.sheet-top
- .sheet-flex-container.sheet-logo
- h2
- span(data-i18n='starship-statistics')
- div
- img(src='https://raw.githubusercontent.com/skydawn1/esper_genesis/master/EG_Logo.png' alt='Esper Genesis Logo')
+ .sheet-ship-top-layout
+ .sheet-token-frame
+ img.sheet-char-avatar(name='attr_character_avatar')
+ .sheet-ship-info
+ .sheet-flex-container
+ label(for='attr_character_name')
+ span(data-i18n='pc_ship_name')
+ input(type='text' name='attr_character_name')
+ +headerEntry('owner')
+ .sheet-flex-container
+ +headerEntry('size_category')
+ label(for='attr_pc_ship_weight')
+ span(data-i18n='pc_ship_weight')
+ input.sheet-ship-compact(type='text' name='attr_pc_ship_weight')
+ label(for='attr_pc_ship_hull_type')
+ span(data-i18n='pc_ship_hull_type')
+ input.sheet-ship-compact(type='text' name='attr_pc_ship_hull_type')
+ +headerEntry('crew_capacity')
+ +headerEntry('cargo_capacity')
+ .sheet-crew-roles
+ h3
+ span(data-i18n='crewmember-roles') Crewmember Roles
.sheet-flex-container
- +headerEntry('name')
- +headerEntry('owner')
- .sheet-flex-container
- +headerEntry('size_category')
- +headerEntry('weight')
- +headerEntry('hull_type')
- .sheet-flex-container
- +headerEntry('crew_capacity')
- +headerEntry('cargo_capacity')
- +headerEntry('length')
- +headerEntry('width')
- +headerEntry('height')
+ label.sheet-crew-field
+ input(type='text' name='attr_pc_ship_crew_pilot_name')
+ span PILOT
+ label.sheet-crew-field
+ input(type='text' name='attr_pc_ship_crew_tech1_name')
+ span TECHNICIAN 1
+ label.sheet-crew-field
+ input(type='text' name='attr_pc_ship_crew_tech2_name')
+ span TECHNICIAN 2
+ label.sheet-crew-field
+ input(type='text' name='attr_pc_ship_crew_copilot_name')
+ span CO-PILOT
+ label.sheet-crew-field
+ input(type='text' name='attr_pc_ship_crew_captain_name')
+ span CAPTAIN
+
+ .ship-tab-row
+ label.tab-label.type-pc(for='tab-type-pc-ship') PC
+ label.tab-label.type-starship(for='tab-type-starship-ship') STARSHIP
.sheet-middle.sheet-grid-container
.sheet-col-left
@@ -86,23 +108,27 @@ mixin armorClassOrManeuverEntry(name)
.sheet-col-center
.sheet-piloting-maneuver-check
- +subtitle('piloting-maneuver-check')
+ h3
+ button(type='roll' name='roll_pc_ship_piloting' value!="@{wtype}&{template:npc} {{name=@{character_name}}} {{rname=^{piloting-check}}} {{mod=[[0+@{pc_ship_piloting_num}]]}} {{r1=[[@{d20}+@{pc_ship_piloting_num}]]}} @{rtype}+@{pc_ship_piloting_num}]]}} {{type=Vehicle}}")
+ span(data-i18n='piloting-maneuver-check')
.sheet-fancy-input
img(src=`${imagePath}/piloting_maneuver_check.png` alt='Piloting maneuver Check')
+ input(type='hidden' name='attr_pc_ship_piloting_num' value='0')
input(type='text' name='attr_pc_ship_piloting_maneuver_check')
p
span(data-i18n='piloting-maneuver-check-info')
.sheet-command-dice
+ h3
+ span(data-i18n='command-dice')
label(for='attr_pc_ship_command_dice')
span(data-i18n='type-u')
select(name='attr_pc_ship_command_dice')
- options(value='d4') d4
- options(value='d6') d6
- options(value='d4') d8
- options(value='d6') d12
- options(value='d6') d20
+ option(value='') None
+ option(value='d6') d6
+ option(value='d8') d8
+ option(value='d10') d10
.sheet-grid-container
label(for='attr_pc_ship_total_dice')
@@ -140,20 +166,65 @@ mixin armorClassOrManeuverEntry(name)
span(data-i18n='maneuver-save-dc-info')
- .sheet-special-features
- +subtitle('special-features-and-options')
- +repeatingSection('ship-features')
- textarea(name='attr_feature' placeholder='Enter feature description...' required)
- span(name='attr_feature')
+ .sheet-weapon-systems
+ .sheet-grid-container.sheet-max-weapon-payload
+ label(for='attr_pc_ship_max_weapon_payload')
+ span(data-i18n='max-weapon-payload')
+ div
+ input(type='text' name='attr_pc_ship_max_weapon_payload')
- .sheet-ship-cargo
- +subtitle('ship-cargo')
- +repeatingSection('ship-cargo')
- .sheet-grid-container
- div
- input(type='text' name='attr_name')
- div
- input(type='text' name='attr_weight')
+ +subtitle('weapon-systems')
+ +repeatingSection('weapon-systems')
+ input(type='hidden' name='attr_rollbase' value!='@{wtype}&{template:atkdmg} {{attack=1}} {{damage=1}} {{dmg1flag=1}} {{mod=[[0@{tohit}]]}} {{rname=@{weapon}}} {{r1=[[@{d20}@{tohit}]]}} {{normal=1}} {{r2=[[0d20]]}} {{range=@{range}}} {{dmg1=[[@{damage}+0]]}} {{dmg1type=@{dmgtype}}} {{desc=@{special}}} ammo=@{ammo} {{licensedsheet=@{licensedsheet}}}')
+ input(type='hidden' name='attr_atkdmg' value!='')
+ input(type='hidden' name='attr_atkdmgc' value!='')
+ .sheet-weapon-action
+ input.sheet-weapon-flag(type='checkbox' name='attr_weapon_options_flag' checked='checked')
+ span y
+ .sheet-weapon-options
+ .sheet-weapon-row
+ span WEAPON:
+ input(type='text' name='attr_weapon')
+ span GUNNER NAME:
+ input(type='text' name='attr_gunner')
+ .sheet-weapon-row
+ span RANGE:
+ input(type='text' name='attr_range')
+ span TO HIT:
+ input(type='text' name='attr_tohit')
+ .sheet-weapon-row
+ span ON HIT:
+ input(type='text' name='attr_damage')
+ input(type='text' name='attr_dmgtype' placeholder='damage type')
+ .sheet-weapon-row
+ span SPECIAL:
+ input(type='text' name='attr_special')
+ .sheet-weapon-row
+ span AMMO:
+ input(type='text' name='attr_ammo')
+ span RECHARGE:
+ input(type='checkbox' name='attr_recharge' value='3')
+ input(type='checkbox' name='attr_recharge' value='2')
+ input(type='checkbox' name='attr_recharge' value='1')
+ .sheet-weapon-display
+ button.pick(type='roll' value!='@{rollbase}' name='roll_attack')
+ span.sheet-weapon-name(name='attr_weapon')
+ .sheet-weapon-meta
+ span Gunner:
+ span(name='attr_gunner')
+ span | Range:
+ span(name='attr_range')
+ span | To Hit:
+ span(name='attr_tohit')
+ span | Hit:
+ span(name='attr_damage')
+ span
+ span(name='attr_dmgtype')
+ button.hidden(type='roll' value!='@{atkdmg}' name='roll_atkdmg')
+ button.hidden(type='roll' value!='@{atkdmgc}' name='roll_atkdmgc')
+
+ .sheet-weapon-systems-info
+ span(data-i18n='weapon-systems-info')
.sheet-bottom
@@ -183,7 +254,10 @@ mixin armorClassOrManeuverEntry(name)
input(type='text' name='attr_pc_ship_maneuver_defense_bonus')
.sheet-grid-container
- +armorClassOrManeuverEntry('base_maneuver_defense')
+ div
+ span.sheet-static-num 8
+ label
+ span(data-i18n='base-maneuver-defense')
+armorClassOrManeuverEntry('proficiency_bonus')
+armorClassOrManeuverEntry('pilot_wis_modifier')
+armorClassOrManeuverEntry('captain_cha_modifier')
@@ -247,66 +321,26 @@ mixin armorClassOrManeuverEntry(name)
.sheet-fancy-input
img(src=`${imagePath}/structural_integrity.png` alt='Structural Integrity')
input(type='text' name='attr_pc_ship_structural_integrity')
- span(data-i18n='structural-integrity-info')
-
label
input(type='text' name='attr_pc_remaining_si')
span(data-i18n='remaining-si')
+ span(data-i18n='structural-integrity-info')
- .sheet-weapon-systems
- .sheet-grid-container.sheet-max-weapon-payload
- label(for='attr_pc_ship_max_weapon_payload')
- span(data-i18n='max-weapon-payload')
- div
- input(type='text' name='attr_pc_ship_max_weapon_payload')
-
- +subtitle('weapon-systems')
- .sheet-grid-container.table-header
- .sheet-gunner
- span(data-i18n='pc-ship-gunner')
- .sheet-weapon
- span(data-i18n='pc-ship-weapon')
- .sheet-range
- span(data-i18n='pc-ship-range')
- .sheet-to-hit
- span(data-i18n='pc-ship-to-hit')
- .sheet-damage
- span(data-i18n='pc-ship-damage')
- .sheet-damage-type
- span(data-i18n='pc-ship-damage-type')
+ .sheet-grid-container.sheet-features-cargo-row
+ .sheet-special-features
+ +subtitle('special-features-and-options')
+ +repeatingSection('ship-features')
+ textarea(name='attr_feature' placeholder='Enter feature description...' required)
+ span(name='attr_feature')
- +repeatingSection('weapon-systems')
- input(type='hidden' name='attr_rollbase' value!='@{wtype}&{template:atk} {{mod=@{tohit}}} {{rname=[@{weapon}](~repeating_weapon-systems_atkdmg)}} {{rnamec=[@{weapon}](~repeating_weapon-systems_atkdmgc)}} {{r1=[[@{d20} + @{tohit}]]}} {{normal=1}} {{r2=[[0d20]]}} {{range=@{range}}} {{desc=@{special}}} ammo=@{ammo} @{pc_ship_name} {{licensedsheet=@{licensedsheet}}}')
- input(type='hidden' name='attr_atkdmg' value!='')
- input(type='hidden' name='attr_atkdmgc' value!='')
- .sheet-grid-container.table-body
- .sheet-gunner
- input(type='text' name='attr_gunner')
- .sheet-weapon
- input(type='text' name='attr_weapon')
- .sheet-range
- input(type='text' name='attr_range')
- .sheet-to-hit
- input(type='text' name='attr_tohit')
- .sheet-damage
- input(type='text' name='attr_damage')
- .sheet-damage-type
- input(type='text' name='attr_dmgtype')
- .sheet-grid-container.table-meta
- label.sheet-special
- span(data-i18n='pc-ship-special')
- input(type='text' name='attr_special')
- label.sheet-ammo
- span(data-i18n='pc-ship-ammo')
- input(type='text' name='attr_ammo')
- label.sheet-recharge
- span(data-i18n='pc-ship-recharge')
- input(type='checkbox' name='attr_recharge' value='3')
- input(type='checkbox' name='attr_recharge' value='2')
- input(type='checkbox' name='attr_recharge' value='1')
- button.hidden(type='roll' value!='@{atkdmg}' name='roll_atkdmg')
- button.hidden(type='roll' value!='@{atkdmgc}' name='roll_atkdmgc')
- button(type='roll' value!='@{rollbase}' name='roll_attack')
-
- div
- span(data-i18n='weapon-systems-info')
\ No newline at end of file
+ .sheet-ship-cargo
+ +subtitle('ship-cargo')
+ +repeatingSection('ship-cargo')
+ .sheet-grid-container
+ div
+ input(type='text' name='attr_name')
+ div
+ input(type='text' name='attr_weight')
+
+ .sheet-ship-logo-footer
+ img.sheet-ship-logo-img(src='https://raw.githubusercontent.com/skydawn1/esper_genesis/master/EG_Logo.png' alt='Esper Genesis Logo')
\ No newline at end of file
diff --git a/Esper_Genesis_5E/src/versioning/versioning.js b/Esper_Genesis_5E/src/versioning/versioning.js
index f36dc15e58..94d611f061 100644
--- a/Esper_Genesis_5E/src/versioning/versioning.js
+++ b/Esper_Genesis_5E/src/versioning/versioning.js
@@ -221,9 +221,9 @@ const dndUpdates = [
};
// Set all spells without a given modifier to 'spell'
var spgetList = [];
- getSectionIDs("spell-cantrip", function(secIds0) {
+ getSectionIDs("spell-prime", function(secIds0) {
_.each(secIds0, function(x) {
- spgetList.push("repeating_spell-cantrip_" + x + "_spell_ability");
+ spgetList.push("repeating_spell-prime_" + x + "_spell_ability");
});
getSectionIDs("spell-1", function(secIds1) {
_.each(secIds1, function(x) {
@@ -935,4 +935,136 @@ const dndUpdates = [
}
),
+ // --- Updates added from OGL v4.2 base sheet ---
+
+ new SheetUpdate(
+ 'fix_spellpoints',
+ (resolve, reject) => {
+ getAttrs(["npc"], function(values) {
+ if(values["npc"] && values["npc"] == "1") {
+ reject('This update is only valid for pcs sheets');
+ } else {
+ getAttrs(['use_spell_points'], v => {
+ if(v['use_spell_points'] && v['use_spell_points'] == 1) {
+ setSpellPoints();
+ } else {
+ deleteResource('Spell Points');
+ }
+ resolve();
+ });
+ }
+ });
+ }
+ ),
+
+ new SheetUpdate(
+ 'fix_advantage_query',
+ (resolve, reject) => {
+ getAttrs(['rtype'], function(values) {
+ const queryadvantage = '{{query=1}} ?{Advantage?|Normal Roll,{{normal=1}} {{r2=[[0d20|Advantage,{{advantage=1}} {{r2=[[@{d20}|Disadvantage,{{disadvantage=1}} {{r2=[[@{d20}}';
+ setAttrs({queryadvantage: queryadvantage}, () => {
+ if(values.rtype.includes('?{Advantage')) {
+ const always = '{{always=1}} {{r2=[[@{d20}';
+ const query = '@{queryadvantage}';
+ setAttrs({rtype: always}, () => {
+ setAttrs({rtype: query}, () => {
+ resolve();
+ });
+ });
+ } else {
+ resolve();
+ }
+ });
+ });
+ }
+ ),
+
+ new SheetUpdate(
+ 'fix_attacks_spelllink',
+ (resolve, reject) => {
+ getAttrs(["npc"], function(values) {
+ if(values["npc"] && values["npc"] == "1") {
+ reject('This update is only valid for pcs sheets');
+ } else {
+ update_attacks("spells");
+ resolve();
+ }
+ });
+ }
+ ),
+
+ new SheetUpdate(
+ 'fix_pc_skills_when_jack_and_odd_prof',
+ (resolve, reject) => {
+ getAttrs(["npc"], function(values) {
+ if(values["npc"] && values["npc"] == "1") {
+ reject('This update is only valid for pcs sheets');
+ } else {
+ // EG uses update_skills in place of OGL updateSkillRolls
+ update_skills(["acrobatics", "astrophysics", "athletics", "computers", "deception",
+ "insight", "intimidation", "investigation", "lore", "mechanics",
+ "medicine", "perception", "performance", "persuasion",
+ "sleight_of_hand", "stealth", "survival", "xenobiology"]);
+ resolve();
+ }
+ });
+ }
+ ),
+
+ new SheetUpdate(
+ 'fix_armor_stealth_penalty',
+ (resolve, reject) => {
+ getAttrs(["npc"], function(values) {
+ if(values["npc"] && values["npc"] == "1") {
+ reject('This update is only valid for pcs sheets');
+ } else {
+ const armorsWithStealthDisadvantage = [
+ "chain mail", "half plate", "plate", "ring mail",
+ "scale mail", "spiked armor", "splint"
+ ];
+ const update = {};
+ const attrs_to_get = [];
+ getSectionIDs("repeating_inventory", function(idarray) {
+ _.each(idarray, function(currentID) {
+ attrs_to_get.push("repeating_inventory_" + currentID + "_itemname");
+ attrs_to_get.push("repeating_inventory_" + currentID + "_itemmodifiers");
+ });
+ getAttrs(attrs_to_get, function(v) {
+ Object.keys(v).filter(entry => entry.includes("itemname")).forEach(key => {
+ if(armorsWithStealthDisadvantage.indexOf(v[key].toLowerCase()) > 1) {
+ const modifiersKey = key.replace("_itemname", "_itemmodifiers");
+ let modifiers = v[modifiersKey] || false;
+ if(!modifiers) {
+ update[modifiersKey] = "Stealth:Disadvantage";
+ } else if(!modifiers.includes("Stealth:Disadvantage")) {
+ update[modifiersKey] = modifiers + ", Stealth:Disadvantage";
+ }
+ }
+ });
+ setAttrs(update, () => {
+ update_skills(["stealth"]);
+ resolve();
+ });
+ });
+ });
+ }
+ });
+ }
+ ),
+
+ new SheetUpdate(
+ 'fix_pc_printedskills',
+ (resolve, reject) => {
+ getAttrs(["npc"], function(values) {
+ if(values["npc"] && values["npc"] == "1") {
+ reject('This update is only valid for pcs sheets');
+ } else {
+ formatPrintedTools();
+ formatPrintedSkills();
+ resolve();
+ }
+ });
+ }
+ ),
+
];
diff --git a/Esper_Genesis_5E/translation.json b/Esper_Genesis_5E/translation.json
index d8fe5c3d65..8072fa0ecc 100644
--- a/Esper_Genesis_5E/translation.json
+++ b/Esper_Genesis_5E/translation.json
@@ -43,6 +43,7 @@
"npc-ship-wis": "Wisdom (Tech)",
"npc-ship-str": "Dexterity (Gunner)",
"npc-ship-con": "Wisdom (Gunner)",
+ "crewmember-roles": "Crewmember Roles",
"sensor-u": "SENSOR RANGE",
"structural-integrity-u": "STRUCTURAL INTEGRITY",
"saves-u": "SAVES",
@@ -263,7 +264,7 @@
"class-level-u": "CLASS & LEVEL",
"background-u": "BACKGROUND",
"background": "Background",
- "race-u": "RACE",
+ "race-u": "SPECIES",
"alignment-u": "ALIGNMENT",
"alignment": "Alignment:",
"exp-pts-u": "EXPERIENCE POINTS",
@@ -365,6 +366,16 @@
"cubil-cred-u": "CU",
"cubil-cusara-u": "CS",
"cubil-orim-u": "OM",
+ "cu-u": "CU",
+ "cn-u": "CN",
+ "cs-u": "CS",
+ "om-u": "OM",
+ "cp-u": "CP",
+ "sp-u": "SP",
+ "ep-u": "EP",
+ "gp-u": "GP",
+ "pp-u": "PP",
+ "starting-gold:": "Starting Money",
"warning-armor-sets-u": " WARNING - AC IS NOT INCORRECT. UNEQUIP EXTRA ARMOR OR SHIELD FROM ITEM DETAILS.",
"item-name-u": "ITEM NAME",
"equipped-u": "EQUIPPED",
@@ -372,6 +383,8 @@
"prop:-u": "PROP:",
"mods:-u": "MODS:",
"total-weight-u": "TOTAL WEIGHT",
+ "general-information-u": "GENERAL INFORMATION",
+ "power-settings-u": "ESPER POWER FEATURES",
"immobile-u": "IMMOBILE",
"heavily-encumbered-u": "HEAVILY ENCUMBERED",
"encumbered-u": "ENCUMBERED",
@@ -392,12 +405,9 @@
"eye-u": "EYES",
"skin-u": "SKIN",
"hair-u": "HAIR",
- "char-appearance-u": "CHARACTER APPEARANCE",
- "char-backstory-u": "CHARACTER BACKSTORY",
- "allies-orgs-u": "ALLIES & ORGANIZATIONS",
- "add-feats-traits-u": "ADDITIONAL FEATURES & TRAITS",
+ "char-appearance-u": "CHARACTER DESCRIPTION",
+ "char-backstory-u": "CHARACTER HISTORY",
"feat-u": "FEAT",
- "treasure-u": "TREASURE",
"spell-save-dc-u": "POWER SAVE DC",
"primes-u": "PRIME POWERS",
"ritual-u": "CONVENTIONAL",
@@ -412,17 +422,18 @@
"glob-atk-mod:-u": "GLOBAL POWER ATTACK MODIFIER:",
"pass-perc-mod:-u": "PASSIVE PERCEPTION MODIFIER:",
"death-save-mod:-u": "DEATH SAVE MODIFIER:",
- "magic-caster-lvl:-u": "CHANNELER/FORGER LEVEL:",
+ "magic-caster-lvl:-u": "ESPER LEVEL:",
"halfling-luck-u": "HALFLING LUCK",
"arcane-fighter-u": "JUSTICAR",
"arcane-rogue-u": "ARTIFICE",
"class-options-u": "CLASS OPTIONS ( )",
"class:-u": "CLASS:",
"subclass:-u": "SUBCLASS:",
- "race:-u": "RACE:",
- "subrace:-u": "SUBRACE:",
- "subrace": "Subrace:",
- "subrace-ability-increase": "Subrace Ability Score Increase:",
+ "race:-u": "SPECIES:",
+ "subrace:-u": "ARCHETYPE:",
+ "subrace": "Species Archetype:",
+ "subrace-ability-increase": "Species Ability Score Increase:",
+ "subrace-speed:": "Species Speed:",
"2nd-class:-u": "2ND CLASS:",
"lvl:-u": "LEVEL:",
"3rd-class:-u": "3RD CLASS:",
@@ -437,8 +448,10 @@
"spell-third-u": "THIRD (Artifice, Justicar)",
"tech-slots-u": "TECH SLOTS",
"esper-powers-u": "ESPER POWERS",
+ "powers": "Powers",
+ "tp-u": "TALENT POINTS",
"tp-max-u": "Talent Point Maximum",
- "tp-current-u": "TALENT POINTS REMAINING",
+ "tp-current-u": "TP REMAINING",
"talent-slots-label": "TALENT SLOTS (Cybermancer)",
"talent-slots-u": "Max Talent Slots",
"used-talent-slots": "Slots Remaining",
@@ -450,6 +463,7 @@
"normal": "Normal",
"expirtise": "Expertise",
"skill-opts-u": "SKILL OPTIONS",
+ "show-5e-skills-u": "SHOW 5E SKILLS?",
"version": "v",
"always-roll-adv": "Always Roll Advantage",
"toggle-roll-adv": "Advantage Toggle",
@@ -469,13 +483,8 @@
"encumbrance:-u": "ENCUMBRANCE:",
"ammo-tracking:-u": "AMMO TRACKING:",
"general-opts-u": "GENERAL OPTIONS",
- "transition-text": "Clicking one of the images below will reformat the data from your current sheet to this sheet. These changes are permanent and cannot be undone.",
"transition-text-highlight": "Please make a copy of your game before you use this tool.",
- "choose-sheet-transfer": "CHOOSE THE SHEET YOU ARE TRANSFERING FROM",
- "community-sheet-u": "COMMUNITY SHEET",
- "shaped-sheet-u": "SHAPED SHEET",
- "transition-opts-u": "TRANSITION OPTIONS",
- "portions-sheet-utilize": "Portions of this sheet utilize content from the System Reference Document 5.0 under the OGL License. View OGL License and Copyright Notice. https://wiki.roll20.net/SRD_5.0_OGL_License",
+ "portions-sheet-utilize": "Portions of this sheet utilize content from the System Reference Document 5.x under the Creative Commons Attribution 4.0 License.",
"api-required-title": "Try it now with easy one click API installation available with your Pro subscription.",
"api-required-u": "(API REQUIRED)",
"spell_dc_mod:-u": "POWER SAVE DC MOD:",
@@ -489,7 +498,6 @@
"inventory-info": "Character Inventories default to the complex style that is compatible with the Roll20 5E Compendium. This includes granular item amounts/weights, weight and encumbrance tracking, sorting, AC calculations, automatic attack generation, and more. The Simple option provides a text field for item lists for players who want more manual control over the sheet.",
"encumbrance-info": "The sheet uses the variant encumbrance rules on page 160 of the Core Manual. The Off option disables the variant rules and only uses a basic over-limit inventory weight check.",
"ammo-tracking-info": "Provides automatic ammo tracking with the 5th Edition OGL by Roll20 Companion API Script .",
- "dungeons-and-dragons-styling": "DUNGEONS AND DRAGONS STYLING",
"dungeons-and-dragons-styling-info": "Turns on Dungeons and Dragons styling for both the character sheet and roll templates. This setting is automatically applied to all character sheets and cannot be selectively used.",
"cd-bar1-value:-u": "BAR 1 VALUE:",
"cd-bar1-max:-u": "BAR 1 MAX:",
@@ -516,7 +524,7 @@
"npc-name-in-rolls-desc:-u": "In NPC roll results, show or hide the name of the NPC in the roll result card.",
"ship-name-in-rolls-desc:-u": "In SHIP roll results, show or hide the name of the SHIP in the roll result card.",
"public:-u": "PUBLIC",
- "to-gm:-u": "TO GM ",
+ "to-gm:-u": "WHISPER",
"toggle-roll-whisper": "Whisper Toggle",
"attribute-opts-u": "ATTRIBUTE OPTIONS",
"save-opts-u": "SAVE OPTIONS",
@@ -573,12 +581,12 @@
"global-skill-info": "Creates a custom global skill modifier field, underneath the SKILLS section of the character sheet. Anything put there will be applied to any save roll. Perfect for regular but not permanent bonuses like the Amplify Ability power.",
"global-attack-info": "Creates a custom global attack modifier field, underneath the ATTACKS AND ESPER POWERS section of the character sheet. Anything put there will be applied to any attack to-hit roll. Perfect for regular but not permanent bonuses to attack like the Sensory Boost power.",
"global-damage-info": "Creates a custom global damage modifier field, underneath the ATTACKS AND ESPER POWERS section of the character sheet. Anything put there will be applied to any attack damage roll. Perfect for regular but not permanent bonuses to damage like the Deft Strike ability.",
- "auto-level-calc-info": "By default changing character levels will automatically set spell slots and hit dice. Changing this setting to off prevents this behavior.",
+ "auto-level-calc-info": "By default changing character levels will automatically set power slots and hit dice. Changing this setting to off prevents this behavior.",
"simple-traits-info": "Character FEATURES AND TRAITS section defaults to the complex style that is compatible with the Roll20 5E Compendium. The Simple option provides a text field for players who want more manual control over the sheet.",
"simple-proficiencies-info": "Character OTHER PROFICIENCIES & LANGUAGES section defaults to the complex style that is compatible with the Roll20 5E Compendium. The Simple option provides a text field for players who want more manual control over the sheet.",
"init-tiebreaker-info": "Adds the character's dexterity score as a decimal to the end of the initiative bonus for purposes of breaking ties.",
"b-custom-info": "When the Proficiency Bonus type is set to Custom, the character sheet will use this value for the character's Proficiency Bonus.",
- "footer-wiki-link": "This sheet was created from the 5th Edition OGL character sheet by Roll20. For game information, visit http://espergenesis.com",
+ "footer-wiki-link": "This sheet was adapted from the 5th Edition OGL character sheet by Roll20. For game information, visit http://espergenesis.com",
"accepting-drop-u": "ACCEPTING DROP FROM COMPENDIUM",
"are_you_sure": "Are you sure you want to turn this character into a ",
"yes": "Yes",
@@ -594,15 +602,16 @@
"get-started": "Get started by clicking Next.",
"opt-out-u": "OPT OUT",
"charmancer-compendium": "Your Compendium Awaits.",
- "charmancer-compendium-detail": "The Charactermancer currently supports the Esper Genesis SRD. You can add the Core Manual to your compendium in the Marketplace, or the game owner can share their compendium with everyone in the game.",
- "charmancer-choose-race": "Choose a Race:",
- "charmancer-custom-race-name": "Custom Race Name:",
- "charmancer-custom-subclass-name:": "Custom sublass Name:",
+ "charmancer-compendium-detail": "The Charactermancer currently supports the Esper Genesis RPG. You can add the Core Manual to your compendium in the Marketplace, or the game owner can share their compendium with everyone in the game.",
+ "charmancer-choose-race": "Choose a Species:",
+ "charmancer-custom-race-name": "Custom Species Name:",
+ "charmancer-custom-subclass-name:": "Custom Subclass Name:",
"charmancer-additional-primes": "Additional Cantrips",
- "charmancer-additional-lvl-1-spells": "Additional Level 1 Spells",
+ "charmancer-additional-lvl-1-spells": "Additional Level 1 Powers",
"suggested-abilities": "Suggested Abilities: ",
- "class-spellcasting": "Class Spellcasting Ability: ",
+ "class-spellcasting": "Class Esper Ability: ",
"ability-score-increase": "Ability Score Increase:",
+ "ability-score-increase:": "Ability Score Increase:",
"lawful-good": "Lawful Good",
"neutral-good": "Neutral Good",
"chaotic-good": "Chaotic Good",
@@ -624,7 +633,7 @@
"equipment-from-class": "Equipment from Class",
"class-equipment": "Class Equipment",
"starting-wealth": "Starting Wealth (Core)",
- "starting-cubil:": "Starting Cubil:",
+ "starting-cubil:": "Starting Money:",
"no_class_warning-u": "NO CLASS HAS BEEN SELECTED OR SELECTED CLASS DOES NOT HAVE STANDARD EQUIPMENT. CLASS EQUIPMENT CANNOT BE CHOSEN AT THIS TIME.",
"standard-array": "Standard Array",
"roll-for-stats": "Roll for Stats",
@@ -661,7 +670,7 @@
"charmancer-leveler-what-is": "The Charactermancer is a step-by-step process that makes leveling up a character simple and streamlined. Changes are saved as you progress, but the character sheet is only updated when the Charactermancer has been completed.",
"charmancer-leveler-level-info1": "Your existing class levels have been pre-populated for you. By default your primary class has been set to be increased by one level. You can change how many levels to increase below, as well as adding a new multiclass.",
"charmancer-leveler-level-info2": "In each class section you'll have the option to take the average number of hit points or to roll randomly, choose class features for the levels you're advancing, and choose your subclass if appropriate.",
- "charmancer-leveler-spells-info": "Listed here are the current spells your character already knows. If you gained access to more spells during your advancement you will be able to select them below. Check next to the spells you wish to learn. The Charactermancer will help you pick the right number of spells and from the correct list. If your class has the option to swap out spells, you can do so by unselecting currently known spells which will allow you to select new ones in their place.",
+ "charmancer-leveler-spells-info": "Listed here are the current powers your character already knows. If you gained access to more powers during your advancement you will be able to select them below. Check next to the powers you wish to learn. The Charactermancer will help you pick the right number of powers and from the correct list. If your class has the option to swap out powers, you can do so by unselecting currently known powers which will allow you to select new ones in their place.",
"total-level-u": "TOTAL LEVEL",
"main-class-level-u": "MAIN CLASS LEVEL",
"class-2-level-u": "CLASS 2 LEVEL",
@@ -672,7 +681,7 @@
"charmancer-leveler-custom-class-warning": "The Level Up tool does not support custom classes at this time.",
"charmancer-welcome-lp": "Welcome to Charactermancer Level Up!",
"charmancer-leveler-what-is-lp": "Look at you, with all that experience. Now it's time to claim your reward. You'll walk through the step-by-step process to make a few decisions, and your character will be at the next level in no time. Changes are saved as you move through the process, but if you change your mind, you'll need to revisit the steps and choices that come after.",
- "charmancer-compendium-detail-lp": "The Charactermancer currently supports the Esper Genesis SRD. You can add the Core Manual to your compendium in the Marketplace, or the game owner can share their compendium with everyone in the game.",
+ "charmancer-compendium-detail-lp": "The Charactermancer currently supports the Esper Genesis RPG. You can add the Core Manual to your compendium in the Marketplace, or the game owner can share their compendium with everyone in the game.",
"roll:-u": "ROLL:",
"roll": "Roll",
"prerequisite:": "Prerequisite:",
@@ -697,25 +706,26 @@
"innate-spellcasting:": "Innate Powers:",
"spellcasting-ability": "Esper Ability:",
"number-of-primes": "Number of Primes:",
- "number-of-lvl-1-spells": "Number of Level 1 Spells:",
+ "number-of-lvl-1-spells": "Number of Rank 1 Powers:",
"spell-list": "Powers List:",
"done": "Done",
"ability-score-method": "Ability Score Method:",
"select-your-choices": "Select Your Choices:",
"input-your-scores": "Input Your Scores:",
"choose-background": "Choose a Background:",
+ "choose-a-feat:": "Choose a Feat:",
"personality-traits": "Personality Traits",
"ideal": "Ideal",
"bond": "Bond",
"flaw": "Flaw",
- "you-have-chosen-starting-cubil": "You have chosen starting cubil and do not get equipment from your background.",
+ "you-have-chosen-starting-gold": "You have chosen starting money and do not get equipment from your background.",
"you-have-created-custom-class": "You have created a custom class; you can add equipment to the character sheet after you have finished the Charactermancer.",
"arcane-is-mystery": "Cosmic forces are a mystery to you.",
"your-character-dont-have-spells-this-lvl": "Your character doesn't have powers at this level. Click “Next” to review your character!",
"charmancer-a-feat-represents": "A feat represents accomplishment, grit, determination, and expertise. It is the reward for hard work.",
"you-really-havent-done": "You really haven't done that much yet",
"review-your-choices": "Review your choices:",
- "race": "Race",
+ "race": "Species",
"abilities": "Abilities",
"bio": "Bio",
"name-background": "Name:",
@@ -729,7 +739,7 @@
"you-can-increase-two-abilites": "You can increase two of your abilities by 1, or one of your abilities by 2",
"before-leveling": "Before Leveling",
"after-leveling": "After Leveling",
- "charmancer-removed-spells-marked-pt1": "Removed spells will be marked with a r symbol so you can find it easily if you change your mind.",
+ "charmancer-removed-spells-marked-pt1": "Removed powers will be marked with a r symbol so you can find it easily if you change your mind.",
"pc_ship_name": "Ship/Station Name",
"pc_ship_owner": "Owner",
"pc_ship_size_category": "Size Category",
@@ -758,9 +768,9 @@
"intercept-speed": "Intercept Speed",
"startdrive": "Stardrive",
"pc_ship_sensors": "Sensors",
- "pc_ship_sensors_info": "Short / Extended Range",
- "pc_ship_initiative": "Initiative Bonus",
- "pc_ship_initiative_info": "= Pilot's DEX modifier or Captain's WIS modifier",
+ "pc_ship_sensors_info": "Short / Extended",
+ "pc_ship_initiative": "Initiative",
+ "pc_ship_initiative_info": "= Pilot's DEX mod or Captain's WIS mod",
"maneuver-save-dc": "Maneuver Save DC",
"maneuver-save-dc-info": "= 8 + Pilot's Proficiency Bonus + Pilot's Dex Modifier + Captain's CHA Modifier",
"special-features-and-options": "Special Features and Options",
@@ -792,32 +802,58 @@
"patch-repair-info": "(Max of two HD per repair)",
"die-type": "Die Type",
"int-mod": "Int Mod",
- "used": "Used#",
+ "used": "# Used",
"damage-threshold": "Damage Threshold",
"temp-hp": "Temp HP",
"damage": "Damage",
"remaining-si": "Remaining SI",
- "structural-integrity-info": "Max SI - Base SI + Technician’s WIS Mod",
+ "structural-integrity-info": "Max SI = Base SI + Technician’s WIS Mod",
"pc-u": "PC",
"starship-u": "STARSHIP",
"sheet-type-u": "SHEET TYPE:",
"starship-statistics": "Starship Statistics",
"max-weapon-payload": "Max Weapon Payload",
"weapon-systems-info": "To Hit = (Gunner’s Proficiency Bonus + Gunner’s DEX modifier + Captain’s WIS modifier)",
- "honor-u": "HONOR",
- "honor-save-u": "HONOR SAVE",
- "honor": "Honor",
- "honor-info": "Enables the optional Honor Attribute.",
- "honor-save": "Honor Save",
- "honor-setting-u": "HONOR SCORE:",
- "sanity-u": "SANITY",
- "sanity-save-u": "SANITY SAVE",
- "sanity": "Sanity",
- "sanity-info": "Enables the optional Sanity Attribute.",
- "sanity-save": "Sanity Save",
- "sanity-setting-u": "SANITY SCORE:",
"customize-your-origin": "Customize Your Origin",
"customize-your-origin-info": "If you’d like your character to follow their own path, you may ignore your Ability Score Increase trait and assign ability score increases tailored to your character.",
"ability-score-increase-tasha": "Ability Score increase",
- "ship-trait-desc-place": "Ship trait description"
-}
\ No newline at end of file
+ "ship-trait-desc-place": "Ship trait description",
+ "short-rest": "SHORT REST",
+ "long-rest": "LONG REST",
+ "rest-buttons-u": "SHORT/LONG REST BUTTONS",
+ "rest-buttons-info": "Adds Short Rest and Long Rest buttons to the Resources section. Short rest clears death saves and resets short-rest resources. Long rest fully restores HP, hit dice (half level), talent points, and all resources.",
+ "default-critical-range:-u": "CRITICAL RANGE:",
+ "reliable-talent:-u": "RELIABLE TALENT:",
+ "reliable-talent-info": "When enabled, any skill check roll for a skill this character is proficient in will treat a d20 result lower than 10 as a 10. Represents the Specialist class feature of the same name (level 11).",
+ "powerful_build-u": "POWERFUL BUILD",
+ "powerful-build-info": "When checked, doubles the character's carrying capacity by applying a x2 multiplier to the size-based weight limit. Represents the species trait of the same name.",
+ "hero-points-u": "HERO POINTS",
+ "hero-points-info": "Enables the Hero Points panel in the character sheet. When enabled, hero points are automatically calculated as (level / 2) + 5 and can be spent by clicking the button to roll 1d6.",
+ "none-left-u": "NONE LEFT",
+ "spell-points-variant:-u": "SPELL POINTS VARIANT",
+ "spell-points-info": "Enables the Spell Points variant rule (DMG p.288). When enabled, power slots are hidden and replaced with a Spell Points resource automatically calculated from caster level. Points replenish on long rest.",
+ "animal_handling-u": "ANIMAL HANDLING",
+ "animal_handling-core": "Animal Handling (Wis) ",
+ "animal_handling": "Animal Handling",
+ "arcana-u": "ARCANA",
+ "arcana-core": "Arcana (Int) ",
+ "arcana": "Arcana",
+ "history-u": "HISTORY",
+ "history-core": "History (Int) ",
+ "history": "History",
+ "nature-u": "NATURE",
+ "nature-core": "Nature (Int) ",
+ "nature": "Nature",
+ "religion-u": "RELIGION",
+ "religion-core": "Religion (Int) ",
+ "religion": "Religion",
+ "skill-set:-u": "SKILL SET:",
+ "eg-skills": "EG Skills",
+ "5e-skills": "5e Skills",
+ "all-skills": "All Skills",
+ "skill-mode-info": "Toggle between Esper Genesis skills (Astrophysics, Computers, Lore, Mechanics, Xenobiology), standard 5e skills (Animal Handling, Arcana, History, Nature, Religion), or All Skills (both sets visible simultaneously for hybrid games).",
+ "currency:-u": "CURRENCY:",
+ "eg-currency": "EG Currency",
+ "5e-currency": "5e Currency",
+ "currency-mode-info": "Toggle between EG currency (CU Cubil digital, CN Cubil coin, CS Cusara = 100 CU, OM Orim = 1000 CU) and standard 5e currency (CP, SP, EP, GP, PP). EG Currency is the default. Use 5e Currency for hybrid games or when running 5e modules."
+}