Files
roll20-character-sheets/LogicalFantasyGaming/sheet.css
T
2026-04-13 16:39:38 -04:00

10941 lines
216 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
Logical Fantasy Gaming (LFG)
Official Roll20 Character Sheet
Author: Daniel Brillat
System: Logical Fantasy Gaming (LFG)
Repository: https://github.com/LogicalFantasyGaming/lfg-roll20-character-sheet
*/
/* LFG Roll20 Sheet (Phase 1 - Manual Entry) */
/* v3: expanded Skills + Gear slots based on Hybrid v17 PDF form fields */
.lfg-sheet { font-family: Arial, sans-serif; position: relative;
}
/* Default fillable field tone (matches Core Stats fields) */
.lfg-sheet input[type="text"],
.lfg-sheet textarea{
background: #f2f2f2;
}
/* Placeholder styling: lighter than filled text */
.lfg-sheet input::placeholder,
.lfg-sheet textarea::placeholder{
color: rgba(0,0,0,0.45);
opacity: 1;
}
/* Hide tab state radios (still functional) */
.tabstate {
position: absolute;
left: -9999px;
}
/* Tabs */
.tabs {
display: flex;
gap: 8px;
margin-bottom: 10px;
}
.tabbtn {
border: 1px solid #333;
padding: 6px 10px;
border-radius: 6px;
cursor: pointer;
user-select: none;
background: #fff;
position: relative;
top: 1px;
}
/* Highlight active tab */
#tab-front:checked ~ .tabs label[for="tab-front"],
#tab-back:checked ~ .tabs label[for="tab-back"],
#tab-magic:checked ~ .tabs label[for="tab-magic"] {
background: #fff;
position: relative;
top: 1px;
}
/* Pages */
.page { display: none; }
#tab-front:checked ~ .page-front { display: block; }
#tab-back:checked ~ .page-back { display: block; }
#tab-magic:checked ~ .page-magic { display: block; }
.grid { display: grid; gap: 10px; }
.grid.two { grid-template-columns: 1fr 1fr; }
.grid.three { grid-template-columns: 1fr 1fr 1fr; }
/* Top row (Core Stats + Armor & Saves): stack by default, sit side-by-side when wide enough */
.grid.top-two{
display:flex;
flex-wrap:wrap;
gap: 20px;
justify-content:flex-start;
align-items:flex-start;
/* ensures we only wrap when there would be <10px space to the right */
padding-right:10px;
}
.grid.top-two > .card{
flex: 0 0 auto;
}
.card {
border: 1px solid #333;
border-radius: 8px;
padding: 10px;
}
.card-title { font-weight: bold; margin-bottom: 8px; }
.subcard {
border: 1px solid #777;
border-radius: 8px;
padding: 10px;
margin-top: 10px;
}
.subcard-title {
font-weight: bold;
margin-bottom: 6px;
font-size: 13px;
}
.row { margin-bottom: 8px; }
.row label { display: block; font-size: 12px; margin-bottom: 2px; }
.row.two { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.row.three { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 8px; }
input[type="text"], textarea {
width: 100%;
box-sizing: border-box;
border: 1px solid #666;
border-radius: 4px;
padding: 4px 6px;
}
textarea { min-height: 25px; resize: vertical; }
.stat small { display: block; font-size: 11px; margin-top: 4px; }
hr { border: none; border-top: 1px solid #999; margin: 10px 0; }
/* Skills */
.skill-header {
display: grid;
grid-template-columns: 0.7fr 2.2fr 0.9fr 0.8fr 0.8fr 0.7fr;
gap: 6px;
align-items: end;
font-size: 11px;
font-weight: bold;
margin-bottom: 6px;
}
.skill-row {
display: grid;
grid-template-columns: 0.7fr 2.2fr 0.9fr 0.8fr 0.8fr 0.7fr;
gap: 6px;
align-items: center;
margin-bottom: 6px;
}
.skill-name { font-size: 12px; }
/* Weapons */
.weapon-block { padding: 6px 0; }
/* Inventory grids */
.inv-grid {
display: grid;
gap: 6px;
}
.inv-cols-1 { grid-template-columns: 1fr; }
.inv-cols-2 { grid-template-columns: 1fr 1fr; }
.inv-row {
display: grid;
grid-template-columns: 28px 1fr 80px;
gap: 6px;
align-items: center;
}
.inv-label {
text-align: center;
font-size: 12px;
font-weight: bold;
border: 1px solid #999;
border-radius: 4px;
padding: 2px 0;
}
.inv-sheaths {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
}
/* Equipped */
.equip-grid {
display: grid;
grid-template-columns: 1fr;
gap: 6px;
}
.equip-row {
display: grid;
grid-template-columns: 120px 1fr 80px;
gap: 6px;
align-items: center;
}
.equip-label {
font-size: 12px;
font-weight: bold;
}
/* Repeating custom skills */
fieldset.repeating_customskills {
border: 0;
padding: 0;
margin: 0;
}
.skill-header-custom,
.skill-row-custom {
grid-template-columns: 0.7fr 2.2fr 0.9fr 0.8fr 0.8fr 0.7fr;
}
.skill-row-custom input[type="text"]{
width: 100%;
}
/* ===== Identity Strip (Front) ===== */
.identity-strip{
border: 1px solid #333;
border-radius: 0;
padding: 6px 8px;
margin-bottom: 10px;
}
.id-grid{
display: grid;
grid-template-columns: 1.5fr 1.1fr 0.7fr 0.7fr 0.7fr 0.7fr 0.8fr 140px;
gap: 6px 10px;
align-items: end;
}
/* labels */
.identity-strip label{
display: block;
font-size: 10px;
font-weight: bold;
color: #000;
text-transform: uppercase;
margin-bottom: 2px;
letter-spacing: 0.2px;
}
/* underline inputs */
.identity-strip input[type="text"]{
width: 100%;
box-sizing: border-box;
border: 0;
border-bottom: 1px solid #333;
border-radius: 0;
padding: 1px 2px;
height: 18px;
font-size: 11px;
background: transparent;
}
.identity-strip input[type="text"]:focus{
outline: none;
box-shadow: none;
}
/* XP compact box (4 digits) */
.id-xp{
justify-self: end;
width: 140px;
border: 2px solid #333;
padding: 4px 6px 6px 6px;
border-radius: 0;
}
.id-xp label{ text-align: center; font-size: 9px; margin-bottom: 3px; }
.id-xp .xp4{
border: 1px solid #333 !important;
border-radius: 0;
text-align: center;
font-size: 14px;
font-weight: bold;
height: 26px;
padding: 2px 4px;
}
/* Row layout matching paper sheet */
.id-name{ grid-column: 1 / 2; grid-row: 1; }
.id-class{ grid-column: 2 / 3; grid-row: 1; }
.id-level{ grid-column: 3 / 4; grid-row: 1; }
.id-xp{ grid-column: 4 / 5; grid-row: 1; align-self: start; }
/* second row across full width excluding XP */
.id-age{ grid-column: 1 / 2; grid-row: 2; }
.id-sex{ grid-column: 2 / 3; grid-row: 2; }
.id-height{ grid-column: 3 / 4; grid-row: 2; }
.id-weight{ grid-column: 1 / 2; grid-row: 3; }
.id-hair{ grid-column: 2 / 3; grid-row: 3; }
.id-eyes{ grid-column: 3 / 4; grid-row: 3; }
.id-race{ grid-column: 1 / 4; grid-row: 4; }
/* third row: morality + motivations */
.id-morality{ grid-column: 1 / 2; grid-row: 5; }
.id-motivation1{ grid-column: 2 / 3; grid-row: 5; }
.id-motivation2{ grid-column: 3 / 4; grid-row: 5; }
/* responsive */
@media (max-width: 900px){
.id-grid{ grid-template-columns: 1fr 1fr; }
.id-xp{ grid-column: 1 / 3; grid-row: auto; width: auto; }
.id-race, .id-motivation1, .id-motivation2{ grid-column: 1 / 3; }
}
/* Override placements to fit Age/Sex/Height/Weight/Hair/Eyes/Race on one line */
.id-name{ grid-column: 1 / 4; grid-row: 1; }
.id-class{ grid-column: 4 / 7; grid-row: 1; }
.id-level{ grid-column: 7 / 8; grid-row: 1; }
.id-xp{ grid-column: 8 / 9; grid-row: 1; align-self: start; }
/* Single line: Age, Sex, Height, Weight, Hair, Eyes, Race */
.id-age{ grid-column: 1 / 2; grid-row: 2; }
.id-sex{ grid-column: 2 / 3; grid-row: 2; }
.id-height{ grid-column: 3 / 4; grid-row: 2; }
.id-weight{ grid-column: 4 / 5; grid-row: 2; }
.id-hair{ grid-column: 5 / 6; grid-row: 2; }
.id-eyes{ grid-column: 6 / 7; grid-row: 2; }
.id-race{ grid-column: 7 / 8; grid-row: 2; }
/* Row 3: Morality + Motivations */
.id-morality{ grid-column: 1 / 3; grid-row: 3; }
.id-motivation1{ grid-column: 3 / 6; grid-row: 3; }
.id-motivation2{ grid-column: 6 / 8; grid-row: 3; }
/* ===== Collapsible Identity Strip ===== */
.id-toggle{
position: absolute;
left: -9999px;
}
/* Button */
.id-toggle-btn{
display: inline-block;
border: 1px solid #333;
border-radius: 6px;
padding: 4px 8px;
font-size: 11px;
font-weight: bold;
cursor: pointer;
user-select: none;
margin: 0 0 6px 0;
background: #fff;
position: relative;
top: 1px;
}
/* Show when checked */
.id-toggle:checked + .id-toggle-btn{
background: #fff;
position: relative;
top: 1px;
}
/* Collapse/expand: checkbox and label are directly before .identity-strip */
.id-toggle:not(:checked) + .id-toggle-btn + .identity-strip{
display: none;
}
/* ===== Core Stats Ability Block (paper style) ===== */
.ability-block{
margin-bottom: 8px;
}
.ability-header{
display: grid;
grid-template-columns: 70px 1fr 0.6fr;
gap: 8px;
align-items: end;
margin-bottom: 6px;
}
.ability-col-title{
font-family: Arial, sans-serif;
font-weight: bold;
font-size: 13px;
text-align: center;
padding: 0;
box-sizing: border-box;
}
.ability-row{
display: grid;
grid-template-columns: 70px 1fr 0.6fr;
gap: 8px;
align-items: center;
margin-bottom: 8px;
}
.ability-abbr{
font-weight: 900;
font-size: 28px;
letter-spacing: 1px;
line-height: 1;
}
.ability-box{
border: 2px solid #333 !important;
border-radius: 0 !important;
height: 44px !important;
font-size: 18px !important;
font-weight: bold;
text-align: center;
padding: 0;
box-sizing: border-box;
}
/* ===== Ability Score Size Reduction (Sheet16) ===== */
.ability-abbr{
font-size: 21px; /* ~25% reduction from 28px */
}
.ability-col-title{
font-size: 10px;
}
.ability-box{
width: 64px;
height: 32px !important;
font-size: 14px !important;
font-weight: bold;
text-align: center;
padding: 0;
box-sizing: border-box;
}
/* ===== Ability Block Fixes (Sheet17) ===== */
/* Make STR/DEX/etc smaller */
.ability-abbr{
font-size: 18px !important;
letter-spacing: 0.5px !important;
}
/* Column headers should be readable */
.ability-col-title{
font-size: 12px !important;
}
/* Force narrow numeric boxes (3 digits) */
.ability-header,
.ability-row{
grid-template-columns: 55px 72px 64px !important;
gap: 6px !important;
}
.ability-box{
width: 72px !important;
max-width: 72px !important;
min-width: 72px !important;
height: 30px !important;
font-size: 16px !important;
padding: 0 !important;
}
/* Ensure inputs don't stretch to 100% */
.ability-row input[type="text"]{
justify-self: center;
}
/* ===== Core Stats Card - Exact Layout (Sheet38) ===== */
.core-stats-card .card-title{
margin-bottom: 6px;
}
.hp-panel{
border: 2px solid #333;
border-radius: 0;
padding: 10px;
margin: 12px auto 14px auto;
display: inline-block;
width: fit-content;
max-width: 100%;
box-sizing: border-box;
}
.hp-panel-title{
text-align: center;
font-weight: 900;
font-size: 24px;
letter-spacing: 0.3px;
margin-bottom: 8px;
}
.hp-grid{
display: grid;
grid-template-columns: repeat(3, auto);
gap: 14px;
align-items: end;
justify-content: center;
margin-bottom: 6px;
}
.hp-label{
font-size: 15px;
font-weight: 700;
margin-bottom: 4px;
}
.hp-label-small{
font-size: 13px;
line-height: 1.05;
text-align: center;
padding: 0;
box-sizing: border-box;
}
.hp-box{
width: 64px;
box-sizing: border-box;
border: 2px solid #333 !important;
border-radius: 0 !important;
height: 34px !important;
font-size: 16px !important;
font-weight: 700;
text-align: center;
padding: 0 !important;
}
.hp-drgrid{
display: grid;
/* Match HP grid column geometry so the DR field can align with Injured Threshold */
grid-template-columns: repeat(3, 62px);
gap: 14px;
justify-content: center;
align-items: center;
margin-top: 2px;
}
.hp-drlabel{
grid-column: 1 / 3;
text-align: center;
font-size: 12px;
font-weight: 700;
white-space: nowrap;
}
.hp-drbox{
grid-column: 3;
justify-self: stretch;
width: 62px;
min-width: 62px;
max-width: 62px;
height: 24px !important;
border: 2px solid #333 !important;
border-radius: 0 !important;
font-size: 13px !important;
font-weight: 700;
text-align: center;
padding: 0 !important;
box-sizing: border-box;
}
.corestat-row{
display: grid;
grid-template-columns: 1fr 86px;
align-items: center;
gap: 10px;
margin: 18px 0;
}
.corestat-label{
font-size: 20px;
font-weight: 900;
letter-spacing: 0.2px;
}
.corestat-label-initiative{
color: #1e4db7;
}
.corestat-box{
border: 2px solid #333 !important;
border-radius: 0 !important;
height: 34px !important;
font-size: 16px !important;
font-weight: 700;
text-align: center;
padding: 0 !important;
width: 86px !important;
}
/* ===== Core Stats Fixed Box Width + Non-Drifting Spacing (Sheet39) ===== */
/* HP boxes: fixed width + fixed gaps (do not expand with window) */
.core-stats-card .hp-grid{
grid-template-columns: repeat(3, 62px) !important;
justify-content: center;
gap: 14px !important;
}
.core-stats-card .hp-cell{
width: 62px;
}
.core-stats-card .hp-box{
width: 50px !important;
min-width: 50px !important;
max-width: 50px !important;
}
/* Hit Rating / Initiative / Move Speed: keep input close to label (no drifting) */
.core-stats-card .corestat-row{
display: flex;
align-items: center;
justify-content: flex-start;
gap: 10px;
margin: 18px 0;
}
.core-stats-card .corestat-label{
flex: 0 0 auto;
}
.core-stats-card .corestat-box{
flex: 0 0 auto;
}
/* ===== Armor & Saves card (Sheet43) ===== */
.armor-saves-card { padding: 10px 12px 12px; }
.armor-saves-card .armor-box,
.armor-saves-card .save-box {
border: 2px solid #333;
border-radius: 0;
height: 34px;
font-weight: 700;
text-align: center;
background: #f2f2f2;
font-size: 14px;
}
/* All Saving Throw boxes are the same size */
.armor-saves-card input.save-box{
/* Reduce max width by 50% (84px -> 42px) */
width: 42px;
max-width: 42px;
/* Reduced by 15% from prior (43px -> ~37px) */
height: 37px;
}
/* Ensure all Saving Throw inputs (including Ability Mod) share the same size */
.armor-saves-card input.save-ability,
.armor-saves-card input.save-total{
width: 42px;
max-width: 42px;
height: 37px;
}
/* Ability Mod boxes (CON/DEX/WIS) are fillable with visible placeholders */
.armor-saves-card input.save-ability{
font-weight: 900;
}
.armor-saves-card input.save-ability::placeholder{
color: #888;
opacity: 1;
font-weight: 900;
}
.armor-saves-card input.armor-box,
.armor-saves-card input.save-box{
padding: 0 !important;
box-sizing: border-box;
}
.armor-saves-card .armor-top{
width: max-content;
display: grid;
/* Reduce Armor Class field widths by 25% (84px -> 63px) */
grid-template-columns: auto 63px auto;
align-items: start;
column-gap: 12px;
margin-top: 4px;
}
.armor-saves-card .armor-class-label{
font-size: 26px;
font-weight: 900;
color: #7a1f1f;
line-height: 1.05;
padding-top: 6px;
white-space: nowrap;
}
.armor-saves-card .armor-box-main{
width: 63px;
/* Increase height by 20% (44px -> ~53px) */
height: 64px;
font-size: 22px;
margin-top: 2px;
}
.armor-saves-card .temp-ac-block{
display: inline-flex;
flex-direction: column;
align-items: center;
gap: 5px;
justify-self: center;
}
.armor-saves-card .temp-ac-label{
font-size: 12px;
line-height: 1.05;
margin-top: 0px;
}
.armor-saves-card .armor-box-temp{
width: 32px;
/* Increase height by 20% (34px -> ~41px) */
height: 49px;
margin-top: 2px;
font-size: 16px;
}
.armor-saves-card .armor-lines{
margin-top: 10px;
display: grid;
grid-template-columns: auto 63px auto;
column-gap: 12px;
row-gap: 10px;
justify-content: start;
}
/* Small reference text under Touch AC (matches Temp AC label styling) */
.armor-saves-card .ac-formula{
font-size: 12px;
line-height: 1.05;
margin-top: 8px;
margin-left: 2px;
color: #333;
text-align: left;
}
.armor-saves-card .armor-line{
display: contents;
}
.armor-saves-card .armor-line-label{
grid-column: 1;
font-size: 18px;
font-weight: 900;
color: #333;
text-align: left;
letter-spacing: 0.5px;
}
.armor-saves-card .armor-box-small{
width: 63px;
height: 41px;
font-size: 16px;
grid-column: 2;
justify-self: center;
}
.armor-saves-card .conditions-panel{
border: 1px solid #333;
padding: 6px 8px 2px;
margin-top: 12px;
width: 300px;
max-width: 300px;
margin-left: auto;
margin-right: auto;
}
.armor-saves-card .conditions-label{
font-size: 16px;
color: #333;
margin-bottom: 6px;
}
.armor-saves-card .conditions-text{
width: 100%;
height: 48px;
border: 1px solid #333;
resize: none;
background: #f2f2f2;
}
.armor-saves-card .saving-title{
margin-top: 14px;
text-align: center;
font-size: 22px;
font-weight: 900;
color: #333;
}
.armor-saves-card .saving-header{
margin-top: 4px;
display: grid;
grid-template-columns: 81px 37px 29px 37px 4px 37px 4px 37px;
align-items: end;
column-gap: 6px;
justify-content: start;
}
.armor-saves-card .saving-header .sh{
font-size: 12px;
text-align: center;
line-height: 1.05;
color: #333;
justify-self: center;
}
.armor-saves-card .save-row{
margin-top: 6px;
display: grid;
grid-template-columns: 96px 37px 29px 37px 4px 37px 4px 37px;
align-items: center;
column-gap: 6px;
}
.armor-saves-card .save-name{
font-size: 20px;
font-weight: 900;
letter-spacing: 1px;
color: #333;
text-align: left;
}
.armor-saves-card .save-eq,
.armor-saves-card .save-plus{
text-align: center;
font-size: 22px;
font-weight: 900;
color: #333;
}
/* Ability mod boxes are now fillable inputs with placeholders */
.armor-saves-card input.save-ability::placeholder{
color: #888;
opacity: 1;
font-weight: 900;
}
.armor-saves-card input.save-ability{
font-weight: 900;
}
/* Total Save boxes: larger font to match Initiative */
.armor-saves-card .save-total{
font-size: 16px;
}
/* ===== Sheet52 adjustments ===== */
/* Conditions / Effects: left-align and lock position with its header text */
.armor-saves-card .conditions-panel{
margin-left: 0 !important;
margin-right: 0 !important;
/* keep fixed size; do not expand with window */
width: 300px !important;
max-width: 300px !important;
}
.armor-saves-card .conditions-label{
text-align: left !important;
}
/* Core Stats card max width: no more than HP panel + 40px (HP panel outer ~238px) */
.core-stats-card{
width: fit-content;
max-width: 278px;
}
/* Armor & Saves card max width: no more than Saving Throws grid + 40px (grid ~344px) */
.armor-saves-card{
width: fit-content;
max-width: 384px;
}
/* ===== Sheet61: Weapons table-style layout (Front) ===== */
.weapon-table{
border: 1px solid #333;
border-radius: 0;
display: grid;
grid-template-columns: 1.35fr 1fr 1fr 1.2fr;
grid-auto-rows: auto;
width: 100%;
box-sizing: border-box;
}
/* grid placement */
.weapon-table > *{
box-sizing: border-box;
}
.wt-left{
border-right: 1px solid #333;
padding: 8px 10px;
}
.wt-row1{ border-bottom: 1px solid #333; }
.wt-row2{ border-bottom: 1px solid #333; }
.wt-head{
border-right: 1px solid #333;
border-bottom: 1px solid #333;
text-align: center;
font-family: Arial, sans-serif;
font-size: 15px;
font-weight: 700;
padding: 10px 6px 12px;
line-height: 1.05;
}
.wt-head:last-child{ border-right: 0; }
.wt-cell{
border-right: 1px solid #333;
border-bottom: 1px solid #333;
padding: 10px 12px;
}
.wt-cell:last-child{ border-right: 0; }
/* left column typography */
.wt-weaponline{
display: grid;
grid-template-columns: 174px 1fr;
gap: 8px;
align-items: center;
margin-bottom: 6px;
}
.wt-weaponlabel{
font-size: 22px;
font-weight: 900;
letter-spacing: 0.5px;
}
.wt-weaponname{
border: 0 !important;
border-bottom: 1px solid #333 !important;
border-radius: 0 !important;
background: transparent !important;
height: 26px !important;
padding: 2px 4px !important;
font-size: 16px !important;
}
.wt-handline{
display: flex;
align-items: center;
gap: 10px; /* exactly 10px between label text and R/L box */
margin-bottom: 8px;
}
.wt-handlabel{
font-size: 14px;
font-weight: 400;
}
.wt-hand{
width: 72px !important;
height: 26px !important;
font-size: 14px !important;
text-align: center;
flex: 0 0 72px;
}
.wt-bigaction{
display: block;
}
.wt-biglabel{
font-size: 18px;
font-weight: 900;
}
.wt-bigbox{
height: 28px !important;
font-size: 14px !important;
}
/* Attack line */
.wt-attackline{
display: grid;
grid-template-columns: auto 1fr;
gap: 8px;
align-items: center;
}
.wt-attacklabel{
font-size: 22px;
font-weight: 900;
}
.wt-attackname{
border: 0 !important;
border-bottom: 1px solid #333 !important;
border-radius: 0 !important;
background: transparent !important;
height: 28px !important;
padding: 2px 4px !important;
font-size: 16px !important;
}
/* right column inputs */
.wt-box{
width: 100% !important;
height: 42px !important;
border: 2px solid #333 !important;
border-radius: 0 !important;
font-size: 18px !important;
font-weight: 700 !important;
text-align: center !important;
padding: 0 !important;
background: #f2f2f2 !important;
}
/* Other Info row spans full width */
.wt-otherinfo{
grid-column: 1 / 5;
padding: 10px 12px 12px;
}
.wt-otherlabel{
font-family: Arial, sans-serif;
font-size: 15px;
font-weight: 700;
margin-bottom: 6px;
}
/* Keep the weapon hr tight */
.repeating_weapons hr{
margin: 10px 0;
}
/* Repeating Feats/Abilities: keep consistent spacing */
fieldset.repeating_featsabilities{
border: 0;
padding: 0;
margin: 0;
}
/* ===== Sheet62: Weapons card full-width (Front) ===== */
.weapons-card-full{
grid-column: 1 / -1; /* span both columns in .grid.two */
width: 682px; /* Core Stats (278) + gap (20) + Armor&Saves (384) */
max-width: 100%;
box-sizing: border-box;
}
/* make the grid container not constrain the spanning card */
.page-front .grid.two{
grid-auto-flow: row;
}
/* WEAPON label textbox */
.wt-weaponlabelbox{
width: 174px !important; /* +5% from 165px */
height: 28px !important;
border: 2px solid #333 !important;
border-radius: 0 !important;
background: #f2f2f2 !important;
font-size: 15px !important;
font-weight: 700 !important;
text-align: left !important;
padding: 2px 6px !important;
box-sizing: border-box;
}
/* Update weaponline layout since label is now an input */
.wt-weaponline{
display: grid;
grid-template-columns: 150px 1fr;
gap: 8px;
align-items: center;
margin-bottom: 6px;
}
/* Other Attack single textbox */
.wt-otherattack{
width: 90% !important;
height: 29px !important;
border: 0.7px solid #888 !important; /* ~0.5pt */
border-radius: 0 !important;
background: #f2f2f2 !important;
font-size: 14px !important;
font-weight: 700 !important;
padding: 2px 8px !important;
box-sizing: border-box !important;
}
/* Sheet63: Big Action Attack label matches Attack Bonus style */
.wt-biglabel{
font-family: Arial, sans-serif;
font-size: 15px;
font-weight: 700;
}
/* Sheet71: Weapon Other Info textarea sizing (matches desired 1-line expandable behavior) */
.weapon-notes-text{
width: 100%;
height: 25px;
min-height: 25px;
border: 1px solid #333;
resize: vertical;
overflow: auto;
background: #f2f2f2;
}
/* Sheet72: Override Roll20 largedialog textarea height for weapon notes (initially compact but resizable) */
.charsheet textarea.weapon-notes-text{
height: 25px;
min-height: 25px;
resize: vertical;
overflow: auto;
}
/* Sheet73: header inputs under Attack Bonus / Critical / Damage */
.wt-head{
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: center;
}
.wt-headlabel{
width: 100%;
text-align: center;
}
.wt-box-top{
margin-top: 8px !important;
height: 42px !important; /* exact match to existing wt-box */
}
/* Sheet78: Secondary (second-row) weapon boxes */
.wt-row2 .wt-box{
font-size: 12px !important; /* already reduced */
height: 24px !important; /* -10% from 27px */
border: 0.7px solid #999 !important; /* ~0.5pt, lighter */
background: #f6f6f6 !important; /* subtle secondary feel */
}
/* Sheet76: Wider Initiative box */
input[name="attr_Initiative"].corestat-box{
width: 96px !important;
}
/* Sheet77: Expandable Feats & Class Abilities rows (initially compact) */
.charsheet textarea.feats-notes-text{
width: 100%;
height: 25px;
min-height: 25px;
border: 1px solid #333;
resize: vertical;
overflow: auto;
background: #f2f2f2;
box-sizing: border-box;
padding: 2px 4px;
}
/* Sheet78: Feats card row spacing consistency */
.feats-card .row{
margin-bottom: 6px;
}
.feats-card .row:last-child{
margin-bottom: 0;
}
.charsheet textarea.feats-notes-text{
margin: 0;
display: block;
}
/* Sheet81: Definitive styling for Atk Bonus 2 / Critical 2 / Damage 2 */
.charsheet input.wt-box.wt-box-secondary{
height: 36px !important; /* 15% shorter than 42px */
font-size: 12px !important; /* -2 points from 14px baseline */
border-width: 0.7px !important; /* ~0.5pt */
border-style: solid !important;
border-color: #bbb !important; /* visibly lighter */
background: #f7f7f7 !important; /* subtle secondary */
}
/* Sheet82: Confidence Tokens line under CHA in Core Stats */
.ability-tokenline{
display: flex;
align-items: center;
gap: 8px;
margin-top: 6px;
}
/* Sheet83: Confidence Tokens box narrower (-30%) */
.charsheet input.hp-drbox.ct-box{
width: 44px !important;
min-width: 44px !important;
max-width: 44px !important;
}
/* Sheet83: Prevent Identity & XP grid from stretching too wide on large windows */
.id-grid{
max-width: 760px;
}
/* Sheet84: Morality Points compact field (3 digits) */
.id-moralitypoints input.mp3{
width: 56px;
max-width: 56px;
min-width: 56px;
}
/* Sheet85: Vision & Senses / Languages row (even split) */
.id-row-vision{
grid-column: 1 / 8; /* stop before the 140px XP column (col 8) */
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px;
margin-top: 6px;
}
/* Sheet85: Morality Points compact field (3 digits) */
.id-moralitypoints input.mp3{
width: 56px;
max-width: 56px;
min-width: 56px;
}
/* Sheet87: Prevent Vision & Senses label wrapping */
.id-vision label{
white-space: nowrap;
}
/* Sheet88: Identity toggle chevron + clickable affordance */
.id-toggle-btn{
position: relative;
cursor: pointer;
user-select: none;
padding-right: 22px; /* room for arrow */
}
.id-toggle-btn::after{
content: "◀"; /* collapsed */
position: absolute;
right: 28px;
top: 50%;
transform: translateY(-50%);
color: #000;
font-size: 12px;
line-height: 1;
}
.id-toggle:checked + .id-toggle-btn::after{
content: "▼"; /* expanded */
color: #000;
}
.id-toggle-btn:hover{
filter: brightness(1.05);
}
/* Sheet88: Tabs look like real tabs */
.tabs{
display: flex;
gap: 6px;
margin-bottom: 0;
}
.tabbtn{
cursor: pointer;
font-weight: 700;
padding: 6px 12px;
border: 1px solid #777;
border-bottom: 1px solid #777;
background: #e9e9e9;
border-top-left-radius: 8px;
border-top-right-radius: 8px;
box-shadow: 0 1px 0 rgba(0,0,0,0.15);
user-select: none;
}
.tabbtn:hover{
background: #f2f2f2;
}
/* Active tab */
.tabstate:checked + input.tabstate + .tabs label[for="tab-front"]{
/* placeholder - overridden below */
}
#tab-front:checked ~ .tabs label[for="tab-front"],
#tab-back:checked ~ .tabs label[for="tab-back"]{
background: #eaeaea;
border-color: #333;
border-bottom: none; /* connected to content */
position: relative;
top: 1px; /* slight lift */
}
/* Sheet89: Right column stack under Armor & Saves */
.right-col{
display: flex;
flex-direction: column;
gap: 20px;
width: fit-content;
max-width: 384px;
}
/* Sheet89: Armor & Defenses card sizing */
.armor-defenses-card{
width: fit-content;
max-width: 308px;
}
/* ===== Sheet94: Armor & Defenses layout (paper-style) ===== */
.armor-defenses-card{
width: fit-content;
max-width: 308px;
padding: 10px 12px 12px;
}
.armor-defenses-card .ad-body{
display: flex;
flex-direction: column;
gap: 12px;
}
/* shared */
.armor-defenses-card .ad-label{
font-size: 12px;
font-weight: 700;
}
.armor-defenses-card .ad-label.red{
color: #7a1f1f;
font-size: 14px;
font-weight: 900;
}
.armor-defenses-card .ad-input{
background: transparent !important;
border: 0 !important;
border-bottom: 1px solid #333 !important;
border-radius: 0 !important;
padding: 2px 4px !important;
height: 22px !important;
font-size: 12px !important;
box-sizing: border-box !important;
}
.armor-defenses-card .ad-input:focus{
outline: none;
box-shadow: none;
}
/* block wrapper */
.armor-defenses-card .ad-block{
border: 1px solid #333;
border-radius: 0;
padding: 0;
overflow: hidden;
}
.armor-defenses-card .ad-block-title{
font-weight: 900;
font-size: 16px;
letter-spacing: 0.4px;
padding: 8px 10px;
border-bottom: 1px solid #333;
text-transform: uppercase;
}
/* armor block rows */
.armor-defenses-card .ad-armor{
padding-bottom: 8px;
}
.armor-defenses-card .ad-row{
padding: 6px 10px;
border-bottom: 1px solid #333;
}
.armor-defenses-card .ad-row:last-child{
border-bottom: 0;
}
.armor-defenses-card .ad-row-two{
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
}
.armor-defenses-card .ad-row-three{
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 10px;
}
.armor-defenses-card .ad-field{
display: grid;
grid-template-columns: auto 1fr;
align-items: center;
gap: 8px;
}
.armor-defenses-card .ad-field.ar-field{
gap: 4px;
}
.armor-defenses-card .ad-line{
width: 100%;
}
.armor-defenses-card input.ad-box{
width: 42px !important;
min-width: 42px !important;
max-width: 42px !important;
height: 26px !important;
border: 2px solid #333 !important;
border-radius: 0 !important;
background: #f2f2f2 !important;
text-align: center !important;
font-weight: 700 !important;
padding: 0 !important;
}
/* AR box: +20% size, +2pt font */
.armor-defenses-card input.ad-box.ad-box-ar{
width: 50px !important;
min-width: 50px !important;
max-width: 50px !important;
height: 31px !important;
font-size: 14px !important;
}
.armor-defenses-card input.ad-box.ad-box-secondary{
border-width: 0.7px !important;
border-style: solid !important;
border-color: #bbb !important;
background: #f7f7f7 !important;
font-size: 12px !important;
}
.armor-defenses-card .ad-divider{
height: 0;
border-top: 0;
margin: 0;
padding: 0;
}
.armor-defenses-card .ad-attackpen{
display: grid;
grid-template-columns: auto 1fr;
align-items: center;
gap: 8px;
}
.armor-defenses-card .ad-details{
display: grid;
grid-template-columns: 1fr auto;
gap: 8px;
align-items: center;
}
.armor-defenses-card .ad-check{
display: inline-flex;
align-items: center;
gap: 6px;
white-space: nowrap;
font-size: 11px;
font-style: italic;
}
.armor-defenses-card .ad-check input[type="checkbox"]{
width: 16px;
height: 16px;
}
/* Other Defenses table */
.armor-defenses-card .ad-table{
display: grid;
grid-template-columns: 1fr 82px;
border: 1px solid #333;
border-radius: 0;
}
.armor-defenses-card .ad-th{
padding: 8px 10px;
border-bottom: 1px solid #333;
font-weight: 900;
text-transform: uppercase;
letter-spacing: 0.3px;
}
.armor-defenses-card .ad-th-left{
border-right: 1px solid #333;
}
.armor-defenses-card .ad-th-right{
text-align: center;
}
.armor-defenses-card .ad-td{
padding: 3px 10px;
border-bottom: 1px solid #333;
}
.armor-defenses-card .ad-td-left{
border-right: 1px solid #333;
font-weight: 700;
}
.armor-defenses-card .ad-td-right{
display: flex;
align-items: center;
justify-content: center;
}
.armor-defenses-card input.ad-tablebox{
width: 50px !important;
min-width: 50px !important;
max-width: 50px !important;
height: 26px !important;
border: 2px solid #333 !important;
border-radius: 0 !important;
background: #f2f2f2 !important;
text-align: center !important;
font-weight: 700 !important;
padding: 0 !important;
}
/* Parry + Resistances spans full width */
.armor-defenses-card .ad-parry,
.armor-defenses-card .ad-resist{
grid-column: 1 / -1;
padding: 8px 10px;
border-bottom: 1px solid #333;
}
.armor-defenses-card .ad-parry{
display: grid;
grid-template-columns: auto 1fr;
align-items: center;
gap: 8px;
}
.armor-defenses-card .ad-parry-label{
font-weight: 900;
}
.armor-defenses-card .ad-parry-fixed{
font-weight: 700;
}
.armor-defenses-card .ad-parry-line{
width: 100%;
}
.armor-defenses-card .ad-resist{
border-bottom: 0;
}
.armor-defenses-card .ad-resist-label{
font-weight: 900;
margin-bottom: 6px;
}
.armor-defenses-card .ad-textarea{
width: 100%;
min-height: 28px !important;
border: 1px solid #333;
background: #f2f2f2;
resize: vertical;
box-sizing: border-box;
padding: 4px 6px;
font-size: 12px;
}
/* ===== Sheet95 tweaks ===== */
.armor-defenses-card .ad-block-title{
display: flex;
align-items: center;
gap: 10px;
}
.armor-defenses-card .ad-title-input{
flex: 1 1 auto;
min-width: 120px;
height: 22px !important;
font-size: 14px !important;
border-bottom: 1px solid #333 !important;
}
.armor-defenses-card .ad-armor-type{
display: grid;
grid-template-columns: auto 1fr;
align-items: center;
gap: 8px;
}
/* ===== Sheet96: Resistances textarea smaller by default ===== */
.armor-defenses-card .ad-textarea{
height: 28px !important;
min-height: 28px !important;
line-height: 14px !important;
resize: vertical;
}
/* ===== Sheet96: Other Defenses left column inputs ===== */
.armor-defenses-card input.ad-td-input{
width: 100% !important;
height: 22px !important;
border-bottom: 0 !important;
border: 0 !important;
padding: 0 2px !important;
background: transparent !important;
font-weight: 700 !important;
}
/* ===== Sheet97: Identity & XP tab width ===== */
.id-toggle-btn{
display: block !important;
width: 100% !important;
max-width: 384px !important;
box-sizing: border-box !important;
}
/* ===== Sheet97: Armor & Defenses card narrower ===== */
.armor-defenses-card{
max-width: 308px !important;
}
/* ===== Sheet97: Smaller MP / Max DEX / Attack Penalty boxes ===== */
.armor-defenses-card input.ad-box{
width: 42px !important;
min-width: 42px !important;
max-width: 42px !important;
}
/* ===== Sheet101: Parry & DR sizing + spacing ===== */
.armor-defenses-card .ad-parry{
display: grid;
grid-template-columns: auto auto;
justify-content: start;
align-items: center;
gap: 4px;
}
.armor-defenses-card .ad-parry .corestat-box{
width: 49px !important;
height: 27px !important;
}
.armor-defenses-card .ad-dr-row{
display: flex;
align-items: center;
gap: 8px;
}
.armor-defenses-card .ad-dr-row .ad-label{
white-space: nowrap;
}
.armor-defenses-card .ad-dr-row .corestat-box{
width: 69px !important;
height: 27px !important;
}
/* Sheet110: ARvC label forced to black */
.armor-defenses-card .arvc-black { color: #000; }
/* Sheet112: Lighter placeholder text across the entire sheet */
.lfg-sheet input::placeholder,
.lfg-sheet textarea::placeholder{
color: #b8b8b8 !important;
opacity: 1;
}
.lfg-sheet input::-webkit-input-placeholder,
.lfg-sheet textarea::-webkit-input-placeholder{
color: #b8b8b8 !important;
}
.lfg-sheet input:-ms-input-placeholder,
.lfg-sheet textarea:-ms-input-placeholder{
color: #b8b8b8 !important;
}
.lfg-sheet input::-ms-input-placeholder,
.lfg-sheet textarea::-ms-input-placeholder{
color: #b8b8b8 !important;
}
/* Sheet112: layout for Attack Penalty moved into Tattered row */
.armor-defenses-card .ad-row.ad-details{
display: flex;
align-items: center;
gap: 10px;
}
.armor-defenses-card .ad-attackpen-inline{
display: inline-flex;
align-items: center;
gap: 6px;
}
/* Sheet113: Prevent wrapping for specific Armor & Defenses labels */
.armor-defenses-card .nowrap{ white-space: nowrap; }
/* Sheet113: Increase AR input font size */
.armor-defenses-card input[name="attr_Armor_Rating"]{ font-size: 14px; }
/* Sheet115: Armor Type row becomes a single full-width input */
.armor-defenses-card .ad-row.ad-armor-type{
display: flex;
align-items: center;
}
.armor-defenses-card .ad-row.ad-armor-type .armor-type-full{
width: 100%;
flex: 1 1 auto;
}
/* Sheet118: Reduce Attack Penalty (Tattered/Attack Penalty) row height by 4px */
.armor-defenses-card .ad-row.ad-details{
padding-top: 4px;
padding-bottom: 4px;
}
/* Sheet119: Vertically center text in small inputs (Attack Penalty + Other Defenses) */
.armor-defenses-card .ad-otherdef input,
.armor-defenses-card .ad-attackpen-inline input{
line-height: 18px;
padding-top: 2px;
padding-bottom: 2px;
}
/* Sheet120: Vertically center text in Attack Penalty + Other Defenses inputs (override existing fixed-height styles) */
.armor-defenses-card .ad-attackpen-inline input{
padding-top: 0 !important;
padding-bottom: 0 !important;
line-height: 22px !important; /* matches the 22px fixed height used by ad-input */
}
.armor-defenses-card .ad-block.ad-otherdef input.ad-td-input{
padding-top: 0 !important;
padding-bottom: 0 !important;
line-height: 22px !important;
}
/* Sheet120: Make Other Defenses outline match Armor section (avoid double border by removing inner table border) */
.armor-defenses-card .ad-block.ad-otherdef .ad-table{
border: 0 !important;
}
/* Sheet122: Reduce effective width of Armor & Defenses card by 10px
(grid-controlled card; reduce horizontal padding instead) */
.armor-defenses-card{
padding-left: calc(var(--card-padding, 10px) - 5px);
padding-right: calc(var(--card-padding, 10px) - 5px);
}
/* Sheet127: Font size adjustments requested */
/* Armor Rating input +2 */
.armor-defenses-card .ad-box-ar{
font-size: 14px;
}
/* Attack Penalty input +2 */
.armor-defenses-card input[name="attr_Attack_Penalty"]{
font-size: 14px;
}
/* Reduce FORT / REF / WILL label size by 2 */
.save-name{
font-size: 10px;
}
/* Sheet128: Force font size changes (override ad-input !important base) */
.armor-defenses-card input.ad-input[name="attr_Armor_Rating"]{
font-size: 14px !important; /* +2 from 12px base */
}
.armor-defenses-card input.ad-input[name="attr_Attack_Penalty"]{
font-size: 14px !important; /* +2 from 12px base */
}
/* Sheet128: Reduce FORT/REF/WILL label size by 2 (scope to AC & Saves card) */
.armor-saves-card .save-name{
font-size: 18px !important; /* from 20px */
}
/* Sheet129: Increase AR input font size by +2 */
.armor-defenses-card input.ad-input[name="attr_Armor_Rating"]{
font-size: 16px !important;
}
/* Sheet129: Move Saving Throws boxes/labels 5px left by tightening first grid column */
.armor-saves-card .saving-header,
.armor-saves-card .save-row{
grid-template-columns: 61px 42px 18px 42px 18px 42px 18px 42px;
}
/* Sheet130: Collapsible Armor & Defenses card (Front tab only) */
.armor-defenses-card .ad-card-toggle{ display:none; }
.armor-defenses-card .card-title.ad-card-toggle-btn{
position: relative;
cursor: pointer;
user-select: none;
padding-right: 22px;
}
.armor-defenses-card .card-title.ad-card-toggle-btn::after{
content: "▼";
position: absolute;
right: 28px;
top: 50%;
transform: translateY(-50%);
color: #000;
font-size: 12px;
line-height: 1;
}
.armor-defenses-card .ad-card-toggle:not(:checked) + .card-title.ad-card-toggle-btn::after{
content: "▶";
}
.armor-defenses-card .ad-card-collapsible{ display:none; }
.armor-defenses-card .ad-card-toggle:checked + .card-title.ad-card-toggle-btn + .ad-card-collapsible{
display:block;
}
/* sheet139: Boot Sheath weight fields narrower */
.boot-sheath input[placeholder^="Wt"]{ width:50%; }
/* sheet139: separator before TOTAL EQUIPPED */
.equip-sep{
grid-column: 1 / -1;
border-top: 1px solid #000;
margin: 2px 0;
}
/* sheet141: ensure Boot Sheath item fields remain readable */
.boot-sheath input[placeholder^="Boot Sheath"]{
min-width: 100px;
}
/* sheet144: make Boot Sheath Wt column truly narrower without leaving right-side whitespace */
.boot-sheath .inv-row{
grid-template-columns: 28px 1fr 40px; /* 80px -> 40px (50%) */
}
.boot-sheath input[placeholder^="Wt"]{
width: 100%;
min-width: 0;
justify-self: stretch;
}
/* sheet145: Capacity & Encumbrance subcard */
.capacity-encumbrance .cap-block{
border: 1px solid #000;
margin-top: 6px;
padding: 4px;
}
.capacity-encumbrance .cap-header{
font-weight: 700;
text-transform: uppercase;
text-align: center;
border-bottom: 1px solid #000;
padding-bottom: 2px;
margin-bottom: 4px;
}
.capacity-encumbrance .cap-row{
display: grid;
grid-template-columns: 1fr 70px;
gap: 6px;
align-items: center;
margin-top: 2px;
}
.capacity-encumbrance .cap-label{
font-size: 0.9em;
}
.capacity-encumbrance .cap-row input{
width: 100%;
}
.capacity-encumbrance .cap-grid{
display: grid;
grid-template-columns: 1fr 80px 55px;
gap: 6px;
align-items: center;
}
.capacity-encumbrance .cap-grid-head{
font-weight: 700;
font-size: 0.85em;
}
.capacity-encumbrance .cap-grid-right{
grid-column: 3;
text-align: center;
}
.capacity-encumbrance .cap-grid-label{
font-size: 0.9em;
}
.capacity-encumbrance .cap-grid-input{
width: 100%;
}
.capacity-encumbrance .cap-grid-penalty{
text-align: center;
font-weight: 700;
}
/* sheet147: TOTAL EQUIPPED WEIGHT spans name+wt columns and aligns with Wt fields */
input[name="attr_TotalEquippedWeight"]{
grid-column: 2 / 4;
width: 100%;
min-width: 160px;
}
/* sheet149: Equip Slots weight column header */
.equip-weight-header{
font-size: 0.85em;
line-height: 1;
}
.equip-weight-header-text{
text-align: center;
font-weight: 700;
}
/* sheet150: Equip Slots column headers */
.equip-header-row{
margin-bottom: 2px;
}
.equip-header-row .equip-col-header{
text-align: center;
font-weight: 700;
font-size: 0.85em;
line-height: 1;
}
/* sheet151: tighten Gear & Equipment card width */
.gear-equipment{
padding-left: calc(var(--card-padding, 10px) - 5px);
padding-right: calc(var(--card-padding, 10px) - 5px);
}
/* sheet152: tighten Equip Slots row label column by 15px (moves fields closer to labels) */
.equip-slots .equip-row{
grid-template-columns: 105px 1fr 80px;
}
/* sheet152: TOTAL EQUIPPED WEIGHT slightly narrower but right-aligned with Weight column */
.equip-slots input[name="attr_TotalEquippedWeight"]{
width: calc(100% - 15px);
justify-self: end;
}
/* sheet153: Backpack repeating rows + total */
.backpack-card fieldset.repeating_backpack{
border: 0;
padding: 0;
margin: 0;
display: grid;
gap: 6px;
}
/* Number repeating rows starting at 6 (after fixed 15) */
.backpack-card{
counter-reset: backpackrep 5;
}
.backpack-card fieldset.repeating_backpack .repitem{
counter-increment: backpackrep;
}
.backpack-card fieldset.repeating_backpack .repitem .rep-index::before{
content: counter(backpackrep);
}
/* Separator line before total */
.backpack-card .inv-sep{
border-top: 1px solid #000;
margin-top: 2px;
}
/* Total backpack weight row: single field spanning name+weight columns, right-aligned */
.backpack-card .inv-total-row input[name="attr_TotalBackpackWeight"]{
grid-column: 2 / 4;
width: 100%;
justify-self: end;
min-width: 160px;
}
/* sheet154: Backpack remove numbered column + consistent spacing */
.backpack-card .inv-grid{
gap: 6px;
}
.backpack-card .inv-row{
grid-template-columns: 1fr 80px;
gap: 6px;
}
.backpack-card .inv-row input{
width: 100%;
}
/* Total backpack weight spans both columns */
.backpack-card .inv-total-row input[name="attr_TotalBackpackWeight"]{
grid-column: 1 / 3;
justify-self: end;
}
/* sheet154: Equip Slots label column 15px tighter */
.equip-slots .equip-row{
grid-template-columns: 90px 1fr 80px;
}
/* sheet154: Equipped Item inputs 10px narrower, keep right edge aligned (gap to Weight stays the same) */
.equip-slots input[placeholder$=" Equip"]{
width: calc(100% - 10px);
justify-self: end;
}
/* sheet155: Carried Item inputs match Equipped Item input width */
.equip-slots input[placeholder^="Carried Item"]{
width: calc(100% - 10px);
justify-self: end;
}
/* sheet155: Backpack repeating row spacing matches fixed rows */
.backpack-card fieldset.repeating_backpack{
display: block;
}
.backpack-card fieldset.repeating_backpack .repitem{
margin: 0;
}
.backpack-card fieldset.repeating_backpack .repitem + .repitem{
margin-top: 6px;
}
.backpack-card fieldset.repeating_backpack .repitem .inv-row{
margin: 0;
}
/* sheet170: Gear & Equipment - reduce all Wt fields by 25% (80px -> 60px) and keep spacing consistent */
.gear-equipment .inv-row{
grid-template-columns: 28px 1fr 60px;
gap: 6px;
}
.gear-equipment .equip-row{
grid-template-columns: 120px 1fr 60px;
gap: 6px;
}
/* Ensure all Wt inputs within Gear & Equipment fit the new column width */
.gear-equipment input[placeholder^="Wt"]{
width: 100%;
max-width: 60px;
box-sizing: border-box;
}
/* sheet171 Equip Slots: shift item + weight columns 20px left and narrow card by 20px */
/* Reduce right padding / width so card is 20px thinner */
.gear-equipment .equip-slots{
padding-right: 10px;
padding-left: 10px;
}
/* Shift Equipped Item + Weight columns left */
.gear-equipment .equip-row{
grid-template-columns: 120px calc(1fr - 20px) 60px;
column-gap: 6px;
}
/* Ensure inputs still fill their columns */
.gear-equipment .equip-row input{
width: 100%;
box-sizing: border-box;
}
/* sheet172 Equip Slots: shift item + weight columns 30px left and narrow card by 30px */
/* Make the Equip Slots card 30px thinner */
.gear-equipment .equip-slots{
padding-right: 5px;
padding-left: 5px;
}
/* Shift Equipped Item + Weight columns 30px closer to labels */
.gear-equipment .equip-row{
grid-template-columns: 120px calc(1fr - 30px) 60px;
column-gap: 6px;
}
/* Inputs fill their adjusted columns */
.gear-equipment .equip-row input{
width: 100%;
box-sizing: border-box;
}
/* sheet173 Fix Equip Slots shift: use valid grid sizing (no calc with fr) */
/* Make Equip Slots subcard 30px thinner by reducing its width (left edge stays put) */
.gear-equipment .equip-slots{
box-sizing: border-box;
width: calc(100% - 30px);
}
/* Shift Equipped Item + Weight columns 30px left by shrinking the label column */
.gear-equipment .equip-slots .equip-row{
grid-template-columns: 90px 1fr 60px;
gap: 6px;
}
/* sheet174 Backpack field widths match Equip Slots (Equipped Item + Weight columns) */
/* Match Backpack subcard overall width to Equip Slots subcard width */
.gear-equipment .backpack-card{
box-sizing: border-box;
width: calc(100% - 30px);
}
/* Use the same column sizing as Equip Slots: label-area 90px, item 1fr, weight 60px */
.gear-equipment .backpack-card .inv-row{
grid-template-columns: 90px 1fr 60px;
gap: 6px;
}
/* Keep the numbered squares at the right edge of the 90px label area */
.gear-equipment .backpack-card .inv-label{
justify-self: end;
}
/* Ensure Backpack Item + Wt inputs fill their columns (matching Equip Slots behavior) */
.gear-equipment .backpack-card .inv-row input{
width: 100%;
box-sizing: border-box;
}
/* TOTAL BACKPACK WEIGHT row uses the same grid sizing */
.gear-equipment .backpack-card .inv-total-row{
grid-template-columns: 90px 1fr 60px;
gap: 6px;
}
/* sheet176 Backpack: item column min/max widths + placeholder fix support */
.gear-equipment .backpack-card .inv-row{
grid-template-columns: 90px minmax(100px, 350px) 60px !important;
gap: 6px;
}
/* sheet177 Backpack: match Equip Slots right edge + responsive item field (100350px) */
/* Match Backpack subcard right edge to Equip Slots (which is 30px thinner) */
.gear-equipment .backpack-card{
box-sizing: border-box;
width: calc(100% - 30px);
}
/* Make Backpack rows use the same overall column geometry as Equip Slots:
label 90px, item flexible, wt 60px */
.gear-equipment .backpack-card .inv-row,
.gear-equipment .backpack-card .inv-total-row{
grid-template-columns: 90px minmax(100px, 1fr) 60px !important;
gap: 6px;
}
/* Backpack Item fields: shrink to 100px, grow with column, but cap at 350px */
.gear-equipment .backpack-card input[placeholder="Backpack Item"]{
min-width: 100px !important;
max-width: 350px !important;
width: 100%;
box-sizing: border-box;
}
/* Keep Wt fields sized to the 60px column */
.gear-equipment .backpack-card input[placeholder^="Wt"]{
width: 100%;
max-width: 60px;
box-sizing: border-box;
}
/* sheet178 Backpack: hug content (<=5px extra) and prevent Item/Wt overlap */
/* Make Backpack subcard size to its contents instead of stretching */
.gear-equipment .backpack-card{
box-sizing: border-box;
display: inline-block;
width: fit-content;
max-width: 100%;
padding-right: 5px; /* <=5px beyond contents */
}
/* Lock row geometry so item column cannot spill into Wt column */
.gear-equipment .backpack-card .inv-row,
.gear-equipment .backpack-card .inv-total-row{
grid-template-columns: 90px minmax(100px, 350px) 60px !important;
column-gap: 6px;
}
/* Critical: allow grid items to shrink within their column (prevents overlap in CSS grid) */
.gear-equipment .backpack-card .inv-row > *,
.gear-equipment .backpack-card .inv-total-row > *{
min-width: 0;
}
/* Inputs fill their own columns, never exceeding them */
.gear-equipment .backpack-card input[placeholder="Backpack Item"]{
width: 100%;
min-width: 100px !important;
max-width: 350px !important;
box-sizing: border-box;
}
.gear-equipment .backpack-card input[placeholder^="Wt"]{
width: 100%;
max-width: 60px;
box-sizing: border-box;
}
/* sheet179 Backpack: 10px gap between Item and Wt; right edge within 10px of Wt column */
/* Set the gap between Backpack Item and Wt columns to 10px (between col 2 and col 3) */
.gear-equipment .backpack-card .inv-row,
.gear-equipment .backpack-card .inv-total-row{
column-gap: 10px;
}
/* Keep Backpack card right padding to 10px so right edge is within 10px of Wt column */
.gear-equipment .backpack-card{
padding-right: 10px;
}
/* sheet181 Backpack Test: remove label column, hug content, keep inputs near left edge */
.gear-equipment .backpack-test{
box-sizing: border-box;
display: inline-block;
width: fit-content;
max-width: 100%;
padding-left: 5px;
padding-right: 5px;
}
.gear-equipment .backpack-test .equip-row{
grid-template-columns: 1fr 60px;
gap: 6px;
justify-content: start;
}
/* Ensure inputs shrink properly inside CSS grid (prevents overlap) */
.gear-equipment .backpack-test .equip-row > *{
min-width: 0;
}
.gear-equipment .backpack-test .equip-row input{
width: 100%;
box-sizing: border-box;
}
/* sheet183 Backpack Test: fix header row to 2 columns (no wrapped header labels) */
.gear-equipment .backpack-test .equip-row.equip-header-row{
grid-template-columns: 1fr 60px;
gap: 6px;
}
.gear-equipment .backpack-test .equip-row.equip-header-row .equip-col-header{
text-align: center;
}
/* sheet189 Backpack Test: total row spans full width (no extra columns) */
.gear-equipment .backpack-test .equip-row.backpack-total-row{
grid-template-columns: 1fr;
}
/* sheet197a Backpack: repeating rows without affecting card width/layout */
.gear-equipment .backpack-test fieldset.repeating_backpack{
margin: 0;
padding: 0;
border: 0;
}
.gear-equipment .backpack-test .repcontainer,
.gear-equipment .backpack-test .repitem{
margin: 0;
padding: 0;
}
/* Keep repeating row aligned with existing grid */
.gear-equipment .backpack-test fieldset.repeating_backpack .equip-row{
grid-template-columns: 1fr 60px;
gap: 6px;
}
/* sheet198a Gold & Money card uses existing equip-grid styling; keep it compact */
.card.gold-money .equip-grid{ margin: 0; }
/* sheet199b constrain Gold & Money card size and field widths */
.card.gold-money{
max-height: 60px;
padding-top: 4px;
padding-bottom: 4px;
}
.card.gold-money .card-title{
margin-bottom: 4px;
}
.card.gold-money .equip-grid{
gap: 4px;
}
.card.gold-money .equip-row{
grid-template-columns: 1.5fr 0.5fr;
}
.card.gold-money input[name="attr_Gold"]{
max-width: 50%;
}
.card.gold-money input[name="attr_GemsValuables"]{
width: 100%;
}
/* sheet200a Gold & Money moved inside Gear & Equipment as first subcard */
.gear-equipment .gold-money-subcard .equip-grid{
margin: 0;
}
.gear-equipment .gold-money-subcard .equip-row{
grid-template-columns: 1.5fr 0.5fr; /* Gems wider, Gold narrower */
gap: 6px;
}
.gear-equipment .gold-money-subcard{
padding-bottom: 6px;
}
.gear-equipment .gold-money-subcard .equip-sep{
margin: 2px 0;
}
/* sheet202b Make Gold & Money subcard width match Equip Slots at minimum size (scoped) */
.gear-equipment .gold-money-subcard{
box-sizing: border-box;
width: calc(100% - 30px);
padding-left: 5px;
padding-right: 5px;
}
/* sheet205 Gold & Money: resizable Gems & Valuables textarea (starts taller) */
.gear-equipment .gold-money-subcard textarea.gm-gems-text{
width: 100%;
min-height: 26px;
height: 26px;
resize: vertical;
box-sizing: border-box;
}
/* sheet205 Boot Sheath: remove number column */
.inv-sheaths .boot-sheath .inv-row{
grid-template-columns: 1fr 45px;
}
/* sheet206 Boot Sheath: delete numbered squares */
.inv-sheaths .boot-sheath .inv-label{
display: none;
}
.inv-sheaths .boot-sheath .inv-row{
grid-template-columns: 1fr 45px;
}
/* sheet207 Skills card: avoid grid row stretching and tighten height */
.skills-card{
align-self: start; /* stop CSS grid stretching this card to match neighbor height */
padding-bottom: 10px; /* keep ~10px below last content */
}
/* Total Skill Ranks box: 50% width, no impact on card width */
.skills-card input[name="attr_Total_Skill_Ranks"]{
width: 50%;
max-width: 50%;
min-width: 0;
}
/* sheet208 Skills: shift Total Skill Ranks label + field 20px right */
.skills-card .skills-totalranks{
margin-left: 20px;
}
/* sheet211: ensure Belt Pouches item fields remain readable */
.belt-pouches input[placeholder^="Pouch Item"]{
min-width: 100px;
}
/* sheet214: Belt Pouches total weight row */
.belt-pouches .pouch-total-row{
display: grid;
grid-template-columns: minmax(0, 1fr) 45px;
gap: 6px;
align-items: center;
}
.belt-pouches .pouch-total-row input{
width: 100%;
min-width: 0;
box-sizing: border-box;
}
/* sheet217: Total weight row (shared layout) */
.pouch-total-row{
display: grid;
grid-template-columns: 1fr;
}
.pouch-total-row input{
width: 100%;
min-width: 0;
box-sizing: border-box;
}
/* sheet217: ensure Sheaths & Bandoliers item fields remain readable (matches Boot/Belt behavior) */
.inv-sheaths .boot-sheath .inv-row input:first-child{
min-width: 100px;
}
/* sheet219: Capacity & Encumbrance header note */
.cap-grid-lefthead{
text-align: left;
}
.cap-grid-lefthead .cap-grid-note{
font-weight: normal;
font-style: italic;
font-size: 10px;
line-height: 1.2;
}
/* sheet223: Capacity & Encumbrance widen With/Without Backpack fields by 25px (grow left, keep right edge) */
.capacity-encumbrance .cap-row{
grid-template-columns: 1fr 95px; /* was 70px */
}
/* sheet223: Skills prevent Total column inputs from compressing below 25px */
.skill-row > input:first-child{
min-width: 25px;
box-sizing: border-box;
}
/* sheet224: enforce minimum width for Skills Total column */
.skill-row > input:first-child{
min-width: 35px !important;
width: auto;
box-sizing: border-box;
}
/* sheet225: Capacity & Encumbrance combined totals grid */
.capacity-encumbrance .cap-totals-grid{
display: grid;
grid-template-columns: 1fr 95px 95px;
gap: 6px;
align-items: center;
}
.capacity-encumbrance .cap-totals-head{
font-weight: 700;
font-size: 0.85em;
}
.capacity-encumbrance .cap-totals-left{
text-align: left;
}
.capacity-encumbrance .cap-totals-sep{
grid-column: 1 / -1;
border-top: 1px solid #000;
margin: 2px 0;
}
.capacity-encumbrance .cap-totals-label{
font-size: 0.9em;
}
.capacity-encumbrance .cap-totals-grid input{
width: 100%;
box-sizing: border-box;
}
/* sheet226: Capacity & Encumbrance evenly distribute totals columns (no width increase) */
.capacity-encumbrance .cap-totals-grid{
grid-template-columns: 1fr 1fr 1fr;
}
/* sheet226: make TOTALS header 2px larger */
.capacity-encumbrance .cap-totals-head.cap-totals-left{
font-size: calc(0.85em + 2px);
}
/* Skills card: physical-skill note (does not affect column sizing) */
.skills-card .skills-physnote{
font-size: 10px;
font-style: italic;
font-weight: normal;
margin: 4px 0 2px 0;
}
/* sheet231: place Total Skill Ranks input adjacent to label */
.skills-totalranks{
display: flex;
align-items: center;
gap: 6px;
}
.skills-totalranks label{
white-space: nowrap;
}
.skills-totalranks input{
width: auto;
}
/* sheet235: Align Backpack, Sheaths & Bandoliers, and Belt Pouches cards on the same row when space allows */
.inv-sheaths{
display: contents;
}
/* Shared sizing: match max width across the three cards */
.gear-equipment .backpack-test,
.inv-sheaths .boot-sheath,
.inv-sheaths .belt-pouches{
display: inline-block;
vertical-align: top;
width: 100%;
max-width: 340px;
box-sizing: border-box;
}
/* sheet236: third tab (Spells & Magic) */
#tab-magic:checked ~ .tabs label[for="tab-magic"]{
background: #fff;
position: relative;
top: 1px;
}
#tab-magic:checked ~ .page-magic{ display:block; }
/* Spells & Magic page styling */
.magic-card{
padding-top: 8px;
}
.magic-subtitle{
font-weight: 700;
margin-bottom: 10px;
}
.magic-row{
display: flex;
flex-wrap: wrap;
gap: 18px;
align-items: center;
margin-bottom: 10px;
}
.magic-label{
font-weight: 700;
font-variant: small-caps;
letter-spacing: 0.5px;
}
.magic-pair{
display: flex;
align-items: center;
gap: 8px;
}
.magic-pair.wide{
flex: 1 1 260px;
justify-content: flex-start;
}
.magic-group{
display: flex;
align-items: center;
gap: 10px;
}
.magic-inline{
display: flex;
align-items: center;
gap: 8px;
}
.magic-box{
background: #f2f2f2;
border: 2px solid #000;
height: 26px;
box-sizing: border-box;
}
.magic-box.small{ width: 46px; }
.magic-box.medium{ width: 90px; }
.magic-notes{
display: grid;
grid-template-columns: auto 1fr;
gap: 6px 10px;
align-items: start;
}
.magic-notes-label{
font-weight: 700;
padding-top: 4px;
white-space: nowrap;
}
.magic-notes-box{
grid-column: 2 / -1;
height: 26px;
border: none;
border-bottom: 2px solid #000;
background: transparent;
resize: none;
padding: 2px 4px;
box-sizing: border-box;
}
/* sheet238: Spells & Magic match card header font styling */
.page-magic .magic-card{
font-size: 13px;
}
.page-magic .magic-subtitle{
font-size: 13px;
font-weight: bold;
}
/* Match all text in the card to the header style (no small-caps treatment) */
.page-magic .magic-label{
font-weight: bold;
font-variant: normal;
letter-spacing: normal;
}
/* sheet238: remove bottom line from Spellcasting Notes boxes */
.page-magic .magic-notes-box{
border-bottom: none !important;
}
/* sheet239: Spells & Magic layout adjustments */
.page-magic .magic-row{
flex-wrap: nowrap;
gap: 12px;
}
/* Reduce CastingMod box width by ~35% (from 90px to 58px) */
.page-magic .magic-box.medium{ width: 58px; }
/* Let notes boxes span full card width now that label removed */
.page-magic .magic-notes{
grid-template-columns: 1fr;
}
.page-magic .magic-notes-box{
grid-column: 1 / -1;
}
/* sheet240: Spellcasting Notes single resizable box */
.page-magic .magic-notes-box{
height: 60px;
resize: vertical;
}
/* sheet241: responsive wrapping + minimum width for Spellcasting Information */
.page-magic .magic-card{
min-width: 350px;
}
.page-magic .magic-row{
flex-wrap: wrap;
}
/* sheet242: adjust Spellcasting Information card minimum width after label shortening */
.page-magic .magic-card{
min-width: 335px;
}
/* sheet243: Spell Level 0 (SL0) card (Arial only) */
.sl0-card{
position: relative;
border: 2px solid #000;
border-radius: 4px;
padding: 20px 14px 12px 14px;
box-sizing: border-box;
}
.sl0-title{
position: absolute;
top: -11px;
left: 10px;
background: #fff;
padding: 2px 10px;
border: 2px solid #000;
border-radius: 4px;
font-weight: 700;
font-size: 16px;
}
.sl0-toprow{
display: flex;
flex-wrap: wrap;
gap: 22px;
align-items: center;
margin-bottom: 12px;
}
.sl0-topitem{
font-weight: 700;
font-size: 18px;
display: flex;
align-items: center;
gap: 10px;
white-space: nowrap;
}
.sl0-box{
width: 58px;
height: 30px;
border: 2px solid #000;
background: #f2f2f2;
box-sizing: border-box;
}
.sl0-knownrow{
display: grid;
grid-template-columns: auto 1fr;
gap: 12px;
align-items: center;
margin-bottom: 10px;
}
.sl0-knownlabel{
font-weight: 700;
font-size: 16px;
white-space: nowrap;
}
.sl0-knownline{
width: 100%;
border: none;
border-bottom: 2px solid #000;
background: transparent;
height: 22px;
padding: 0 4px;
box-sizing: border-box;
}
.sl0-sep{
border-top: 2px solid #000;
margin: 8px 0 14px 0;
}
.sl0-spellbox{
border: 2px solid #000;
border-radius: 4px;
padding: 10px 10px 6px 10px;
box-sizing: border-box;
}
.sl0-spellrow{
display: grid;
grid-template-columns: auto 1fr;
gap: 10px;
align-items: center;
margin-bottom: 8px;
}
/* Spell Info: Spell Name row adds Casting Time on the same line */
.sl0-spellrow.sl0-spellrow-name{
grid-template-columns: auto 1fr auto 1fr;
}
.sl0-spelllabel{
font-weight: 700;
font-size: 18px;
white-space: nowrap;
}
.sl0-line{
width: 100%;
border: none;
border-bottom: 2px solid #000;
background: transparent;
height: 22px;
padding: 0 4px;
box-sizing: border-box;
}
.sl0-line.short{
max-width: 240px;
}
/* sheet244: SL0 card border thickness + layout fixes */
.sl0-card{
border: 1px solid #777; /* match other cards */
border-radius: 8px;
padding: 10px;
margin-top: 10px;
box-sizing: border-box;
position: static;
}
/* Remove the prior floating title styling if still present */
.sl0-title{ display: none; }
/* Force top row to stay on one line */
.sl0-toprow{
flex-wrap: nowrap;
justify-content: space-between;
gap: 12px;
}
/* Reduce the three small boxes by ~65% (58px -> ~20px) */
.sl0-box{
width: 20px;
height: 26px;
}
/* Resizable Spells Known box */
.sl0-knownarea{
width: 100%;
min-height: 28px;
border: 1px solid #777;
border-radius: 4px;
background: #fff;
padding: 4px 6px;
resize: vertical;
box-sizing: border-box;
font: inherit;
}
/* Resizable Spell Description box */
.sl0-descarea{
width: 100%;
min-height: 32px;
border: 1px solid #777;
border-radius: 4px;
background: #fff;
padding: 4px 6px;
resize: vertical;
box-sizing: border-box;
font: inherit;
}
/* Keep Spell Name line as underline but align nicely with textarea below */
.sl0-spellrow{
align-items: start;
}
/* sheet245: refine SL0 borders + field default heights + label sizing */
/* match normal thin borders for separator and spell entry box */
.sl0-sep{
border-top: 1px solid #777;
}
.sl0-spellbox{
border: 1px solid #777;
}
/* default (collapsed) heights before user expands */
.sl0-knownarea{
min-height: 25px;
height: 25px;
}
.sl0-descarea{
min-height: 20px;
height: 20px;
}
/* Spell Name / Spell Description label font size -2px */
.sl0-spelllabel{
font-size: 16px;
}
/* Adjust associated inputs to visually match the smaller labels */
.sl0-line{
height: 20px;
}
.sl0-line.short{
max-width: 210px;
}
/* sheet246: enforce max collapsed height for SL0 textareas */
.sl0-knownarea{
height: 20px;
min-height: 20px;
}
.sl0-descarea{
height: 20px;
min-height: 20px;
}
/* sheet248: allow user resize to change height (do NOT lock height with !important) */
.page-magic .sl0-card textarea.sl0-knownarea,
.page-magic .sl0-card textarea.sl0-descarea{
height: 20px; /* initial visible height */
min-padding: 0 4px !important;
line-height: 18px !important;
box-sizing: border-box !important;
resize: vertical !important;
}
/* sheet249: SL0 textareas start at 20px but remain user-resizable */
.page-magic .sl0-card textarea.sl0-knownarea,
.page-magic .sl0-card textarea.sl0-descarea{
height: 20px;
min-height: 20px;
resize: vertical;
overflow: auto;
box-sizing: border-box;
}
/* sheet250: restore tab selected (white/pressed) vs unselected (grey) styling */
.tabs{
gap: 8px !important;
margin-bottom: 10px !important;
}
.tabs .tabbtn{
border: 1px solid #333 !important;
padding: 6px 10px !important;
border-radius: 6px !important;
cursor: pointer !important;
user-select: none !important;
font-weight: 700 !important;
background: #e0e0e0 !important; /* unselected grey */
position: relative !important;
top: 0 !important;
}
/* Active tab: white + looks pressed */
#tab-front:checked ~ .tabs label[for="tab-front"],
#tab-back:checked ~ .tabs label[for="tab-back"],
#tab-magic:checked ~ .tabs label[for="tab-magic"]{
background: #fff !important;
top: 1px !important;
}
/* sheet251: Spellcasting Information - Spells Known min-height +5px */
.page-magic .magic-notes-box{
min-height: 65px; /* was 60px in sheet240 */
}
/* sheet251: SL0 card - Spells Known min-height +5px */
.page-magic .sl0-card textarea.sl0-knownarea{
min-height: 25px;
}
/* sheet251: match SL0 card min-width to Spellcasting Information card (magic-card) */
.page-magic .sl0-card{
min-width: 335px;
}
/* sheet251: prevent SL0 top-row small boxes from compressing under 25px */
.page-magic .sl0-box{
min-width: 25px;
}
/* sheet252: SL0 Spell Description height matches Spells Known */
.page-magic .sl0-card textarea.sl0-descarea{
min-height: 25px;
}
/* sheet258: Spell Info card (extracted from SL0 spell box) */
.page-magic .spellinfo-card{
min-width: 335px; /* match magic-card and sl0-card */
}
/* Match SL0 textarea initial height/resizing behavior inside Spell Info */
.page-magic .spellinfo-card textarea.sl0-descarea{
height: 20px;
min-height: 25px; /* match SL0 Spell Description min-height (sheet252) */
resize: vertical;
overflow: auto;
box-sizing: border-box;
}
/* sheet260: SL0 Spell Info repeating section (+Add) */
.page-magic .sl0-spellinfo-repeat-note{
margin-top: 6px;
margin-bottom: 6px;
font-size: 11px;
line-height: 1.2;
opacity: 0.9;
}
.page-magic .sl0-addhint{
font-weight: 700;
}
/* Slight separation between repeating Spell Info entries */
.page-magic .sl0-spellbox-repeat{
margin-top: 6px;
}
/* Spell Info minimum width for Spell Name and Casting Time */
.sl0-spellrow-name .sl0-line.short {
min-width: 60px;
}
/* =========================
Responsive containment fixes
Spell Level 0 + Spell Info
========================= */
/* Ensure all SL0 elements size within their containers */
.sl0-card, .sl0-card * {
box-sizing: border-box;
}
/* Prevent any child content from visually spilling out of the card */
.sl0-card {
overflow: hidden;
}
/* Allow top-row items to wrap inside the card instead of overflowing */
.sl0-toprow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: center;
}
/* Make each top item flexible and allow it to shrink within the card */
.sl0-topitem {
flex: 1 1 240px;
min-width: 0;
}
/* Keep the little number boxes from forcing overflow */
.sl0-topitem .sl0-box {
max-width: 100%;
}
/* Spells Known row: allow textarea to shrink/wrap within card */
.sl0-knownrow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: flex-start;
}
.sl0-knownlabel {
flex: 0 0 auto;
min-width: 0;
}
.sl0-knownarea {
flex: 1 1 260px;
min-width: 0;
max-width: 100%;
}
/* Spell Info rows: wrap on narrow screens, keep fields inside */
.sl0-spellrow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: center;
min-width: 0;
}
.sl0-spelllabel {
flex: 0 0 auto;
min-width: 0;
}
/* Inputs should be allowed to shrink instead of overflowing */
.sl0-spellrow input.sl0-line,
.sl0-spellrow textarea {
min-width: 0;
max-width: 100%;
}
/* Spell Name + Casting Time line: make inputs share space and wrap cleanly */
.sl0-spellrow-name input.sl0-line.short {
flex: 1 1 240px; /* grows, shrinks, wraps */
min-width: 60px; /* your requested minimum */
max-width: 100%;
}
/* Description textarea should always stay within the card */
.sl0-descarea {
flex: 1 1 100%;
min-width: 0;
max-width: 100%;
}
/* Repeat spell boxes should also clip/wrap properly */
.sl0-spellbox,
.sl0-spellbox-repeat {
max-width: 100%;
overflow: hidden;
}
/* Spell Info lock Name / Casting Time / Range on one row with proportional widths */
.sl0-spellrow-name {
display: flex;
flex-wrap: nowrap; /* stay on one row */
align-items: center;
}
.sl0-spellrow-name .sl0-line.name {
flex: 3 1 0; /* 50% wider */
min-width: 60px;
}
.sl0-spellrow-name .sl0-line.time,
.sl0-spellrow-name .sl0-line.range {
flex: 2 1 0;
min-width: 60px;
}
/* =========================
Spell Info containment (responsive)
Keeps content inside Spell Info card on narrow widths
========================= */
.sl0-card, .sl0-card * { box-sizing: border-box; }
.sl0-card,
.sl0-spellbox,
.sl0-spellbox-repeat {
max-width: 100%;
overflow: hidden; /* prevent spill outside card */
}
.sl0-spellrow,
.sl0-knownrow,
.sl0-toprow {
min-width: 0;
max-width: 100%;
}
.sl0-spellrow input,
.sl0-spellrow textarea,
.sl0-knownrow textarea,
.sl0-toprow input {
min-width: 0;
max-width: 100%;
}
/* Default: keep Name/Time/Range inputs on one row (your preferred layout) */
.sl0-spellrow-name { flex-wrap: nowrap; }
/* If the window becomes too narrow to honor min-widths + labels,
allow wrapping within the Spell Info row instead of overflowing. */
@media (max-width: 700px) {
.sl0-spellrow-name { flex-wrap: wrap; }
.sl0-spellrow-name .sl0-spelllabel { white-space: nowrap; }
}
/* Spell Info keep each label+field together as a unit */
.sl0-spellpair{
display:flex;
align-items:center;
gap: 6px;
white-space: nowrap; /* prevents label and its input from splitting lines */
min-width: 0;
}
/* Allow the row to wrap by pair when needed, without breaking pairs */
@media (max-width: 700px){
.sl0-spellrow-name{ flex-wrap: wrap; }
}
/* Ensure inputs inside pairs can still shrink within the card */
.sl0-spellpair .sl0-line{
min-width: 60px; /* your minimum */
max-width: 100%;
}
/* Spell Info keep each label with its field, and preserve 3:2:2 width distribution */
.sl0-spellrow-name{
display:flex;
gap: 6px 10px;
align-items:center;
max-width:100%;
min-width:0;
}
/* Each label+input pair stays together */
.sl0-spellpair{
display:flex;
align-items:center;
gap:6px;
white-space:nowrap;
min-width:0;
}
/* Proportional widths (Spell Name 50% wider than Time/Range) */
.sl0-spellpair.pair-name{ flex:3 1 0; }
.sl0-spellpair.pair-time{ flex:2 1 0; }
.sl0-spellpair.pair-range{ flex:2 1 0; }
/* Inputs shrink inside their pair; keep your minimum */
.sl0-spellpair .sl0-line{
flex:1 1 0;
min-width:60px;
max-width:100%;
}
/* Responsive: if too narrow, wrap by PAIR (never split label from field) */
@media (max-width: 700px){
.sl0-spellrow-name{ flex-wrap:wrap; }
}
/* Spell Info final overrides for pair classes used in HTML */
.sl0-spellrow-name{ flex-wrap: wrap; }
.sl0-spellpair.namepair{ flex: 3 1 0; }
.sl0-spellpair.timepair{ flex: 2 1 0; }
.sl0-spellpair.rangepair{ flex: 2 1 0; }
/* Spell Info wrap by label+field pair (Casting Time & Range may drop, but never split from their label) */
.sl0-spellrow-name{
display:flex;
flex-wrap: wrap; /* allow pairs to wrap to lower rows */
align-items: center;
gap: 6px 10px;
min-width: 0;
}
.sl0-spellpair{
display:flex;
align-items:center;
gap: 6px;
white-space: nowrap; /* label and its field stay on same line */
min-width: 0;
max-width: 100%;
}
/* Proportional widths by PAIR so the whole unit wraps together */
.sl0-spellpair-name{ flex: 3 1 0; }
.sl0-spellpair-time{ flex: 2 1 0; }
.sl0-spellpair-range{ flex: 2 1 0; }
/* Inputs inside pairs can shrink but respect your minimum */
.sl0-spellpair .sl0-line{
min-width: 60px;
max-width: 100%;
}
/* FIX: actually allow Casting Time / Range PAIRS to wrap when narrow */
.sl0-spellrow-name{
flex-wrap: wrap !important;
}
/* Prevent pairs from shrinking to avoid suppressing wrapping */
.sl0-spellpair{
flex-shrink: 0;
}
/* FIX v2: enforce wrapping by giving each label+field pair a real minimum width.
This makes Casting Time / Range drop to a new row when the window is narrow,
while keeping each label attached to its field. */
.sl0-spellrow-name{
width: 100%;
max-width: 100%;
}
/* Minimum widths are set to the pair (label+field), not just the input,
so pairs stop compressing and instead wrap. */
.sl0-spellpair-name{ min-width: 320px; }
.sl0-spellpair-time{ min-width: 220px; }
.sl0-spellpair-range{ min-width: 200px; }
/* Keep 50% wider intent while still permitting wrap by pair */
.sl0-spellpair-name{ flex: 3 0 auto; }
.sl0-spellpair-time,
.sl0-spellpair-range{ flex: 2 0 auto; }
/* Spell Info force Casting Time + Range pairs to drop to new rows on narrow widths */
@media (max-width: 620px){
.sl0-spellpair-time,
.sl0-spellpair-range{
flex-basis: 100% !important; /* each pair becomes a full row */
width: 100% !important;
}
}
/* ===== Spell Info wrap fix (authoritative) =====
Problem: earlier rules target non-existent classes (sl0-spellpair-time/range),
and older grid/flex rules conflict. These rules are appended LAST and use
high specificity/!important so the Spell Info row actually wraps by pair. */
/* Ensure the Spell Name row is flex (not grid) and can wrap */
.sl0-spellbox .sl0-spellrow.sl0-spellrow-name{
display: flex !important;
flex-wrap: wrap !important;
align-items: center;
gap: 6px 10px;
width: 100%;
max-width: 100%;
min-width: 0;
}
/* Keep each label+field together */
.sl0-spellbox .sl0-spellrow.sl0-spellrow-name .sl0-spellpair{
display: inline-flex;
align-items: center;
gap: 6px;
white-space: nowrap;
flex-shrink: 0; /* don't compress forever; wrap instead */
min-width: 0;
max-width: 100%;
}
/* Inputs still respect your minimum and stay within the card */
.sl0-spellbox .sl0-spellrow.sl0-spellrow-name .sl0-spellpair .sl0-line{
min-width: 60px;
max-width: 100%;
}
/* On narrow widths, force Casting Time + Range pairs onto their own rows */
@media (max-width: 700px){
.sl0-spellbox .sl0-spellrow.sl0-spellrow-name .timepair,
.sl0-spellbox .sl0-spellrow.sl0-spellrow-name .rangepair{
flex-basis: 100% !important;
width: 100% !important;
}
}
/* ===== Collapsible Spell Level 0 Card (SL0) ===== */
.sl0-toggle{
position: absolute;
left: -9999px;
}
/* Button styled like Identity & XP */
.sl0-toggle-btn{
display: inline-block;
border: 1px solid #333;
border-radius: 6px;
padding: 4px 8px;
font-size: 11px;
font-weight: bold;
cursor: pointer;
user-select: none;
margin: 0 0 6px 0;
background: #fff;
position: relative;
top: 1px;
padding-right: 22px; /* room for arrow */
}
.sl0-toggle-btn::after{
content: "◀"; /* collapsed */
position: absolute;
right: 28px;
top: 50%;
transform: translateY(-50%);
color: #000;
font-size: 12px;
line-height: 1;
}
.sl0-toggle:checked + .sl0-toggle-btn::after{
content: "▼"; /* expanded */
color: #000;
}
.sl0-toggle-btn:hover{
filter: brightness(1.05);
}
/* Collapse/expand: checkbox and label directly before .sl0-body */
.sl0-toggle:not(:checked) + .sl0-toggle-btn + .sl0-body{
display: none;
}
/* ===== Collapsible Spell Level 1 Card (SL1) ===== */
.sl1-toggle{
position: absolute;
left: -9999px;
}
.sl1-toggle-btn{
display: inline-block;
border: 1px solid #333;
border-radius: 6px;
padding: 4px 8px;
font-size: 11px;
font-weight: bold;
cursor: pointer;
user-select: none;
margin: 0 0 6px 0;
background: #fff;
position: relative;
top: 1px;
padding-right: 22px; /* room for arrow */
}
.sl1-toggle-btn::after{
content: "◀"; /* collapsed */
position: absolute;
right: 28px;
top: 50%;
transform: translateY(-50%);
color: #000;
font-size: 12px;
line-height: 1;
}
.sl1-toggle:checked + .sl1-toggle-btn::after{
content: "▼"; /* expanded */
color: #000;
}
.sl1-toggle-btn:hover{
filter: brightness(1.05);
}
.sl1-toggle:not(:checked) + .sl1-toggle-btn + .sl1-body{
display: none;
}
/* ===== SL1 structural style mirror (from SL0) ===== */
/* sheet243: Spell Level 0 (SL0) card (Arial only) */
.sl1-card{
position: relative;
border: 2px solid #000;
border-radius: 4px;
padding: 20px 14px 12px 14px;
box-sizing: border-box;
}
.sl1-title{
position: absolute;
top: -11px;
left: 10px;
background: #fff;
padding: 2px 10px;
border: 2px solid #000;
border-radius: 4px;
font-weight: 700;
font-size: 16px;
}
.sl1-toprow{
display: flex;
flex-wrap: wrap;
gap: 22px;
align-items: center;
margin-bottom: 12px;
}
.sl1-topitem{
font-weight: 700;
font-size: 18px;
display: flex;
align-items: center;
gap: 10px;
white-space: nowrap;
}
.sl1-box{
width: 58px;
height: 30px;
border: 2px solid #000;
background: #f2f2f2;
box-sizing: border-box;
}
.sl1-knownrow{
display: grid;
grid-template-columns: auto 1fr;
gap: 12px;
align-items: center;
margin-bottom: 10px;
}
.sl1-knownlabel{
font-weight: 700;
font-size: 16px;
white-space: nowrap;
}
.sl1-knownline{
width: 100%;
border: none;
border-bottom: 2px solid #000;
background: transparent;
height: 22px;
padding: 0 4px;
box-sizing: border-box;
}
.sl1-sep{
border-top: 2px solid #000;
margin: 8px 0 14px 0;
}
.sl1-spellbox{
border: 2px solid #000;
border-radius: 4px;
padding: 10px 10px 6px 10px;
box-sizing: border-box;
}
.sl1-spellrow{
display: grid;
grid-template-columns: auto 1fr;
gap: 10px;
align-items: center;
margin-bottom: 8px;
}
/* Spell Info: Spell Name row adds Casting Time on the same line */
.sl1-spellrow.sl1-spellrow-name{
grid-template-columns: auto 1fr auto 1fr;
}
.sl1-spelllabel{
font-weight: 700;
font-size: 18px;
white-space: nowrap;
}
.sl1-line{
width: 100%;
border: none;
border-bottom: 2px solid #000;
background: transparent;
height: 22px;
padding: 0 4px;
box-sizing: border-box;
}
.sl1-line.short{
max-width: 240px;
}
/* sheet244: SL0 card border thickness + layout fixes */
.sl1-card{
border: 1px solid #777; /* match other cards */
border-radius: 8px;
padding: 10px;
margin-top: 10px;
box-sizing: border-box;
position: static;
}
/* Remove the prior floating title styling if still present */
.sl1-title{ display: none; }
/* Force top row to stay on one line */
.sl1-toprow{
flex-wrap: nowrap;
justify-content: space-between;
gap: 12px;
}
/* Reduce the three small boxes by ~65% (58px -> ~20px) */
.sl1-box{
width: 20px;
height: 26px;
}
/* Resizable Spells Known box */
.sl1-knownarea{
width: 100%;
min-height: 28px;
border: 1px solid #777;
border-radius: 4px;
background: #fff;
padding: 4px 6px;
resize: vertical;
box-sizing: border-box;
font: inherit;
}
/* Resizable Spell Description box */
.sl1-descarea{
width: 100%;
min-height: 32px;
border: 1px solid #777;
border-radius: 4px;
background: #fff;
padding: 4px 6px;
resize: vertical;
box-sizing: border-box;
font: inherit;
}
/* Keep Spell Name line as underline but align nicely with textarea below */
.sl1-spellrow{
align-items: start;
}
/* sheet245: refine SL0 borders + field default heights + label sizing */
/* match normal thin borders for separator and spell entry box */
.sl1-sep{
border-top: 1px solid #777;
}
.sl1-spellbox{
border: 1px solid #777;
}
/* default (collapsed) heights before user expands */
.sl1-knownarea{
min-height: 25px;
height: 25px;
}
.sl1-descarea{
min-height: 20px;
height: 20px;
}
/* Spell Name / Spell Description label font size -2px */
.sl1-spelllabel{
font-size: 16px;
}
/* Adjust associated inputs to visually match the smaller labels */
.sl1-line{
height: 20px;
}
.sl1-line.short{
max-width: 210px;
}
/* sheet246: enforce max collapsed height for SL0 textareas */
.sl1-knownarea{
height: 20px;
min-height: 20px;
}
.sl1-descarea{
height: 20px;
min-height: 20px;
}
/* sheet248: allow user resize to change height (do NOT lock height with !important) */
.page-magic .sl1-card textarea.sl1-knownarea,
.page-magic .sl1-card textarea.sl1-descarea{
height: 20px; /* initial visible height */
min-padding: 0 4px !important;
line-height: 18px !important;
box-sizing: border-box !important;
resize: vertical !important;
}
/* sheet249: SL0 textareas start at 20px but remain user-resizable */
.page-magic .sl1-card textarea.sl1-knownarea,
.page-magic .sl1-card textarea.sl1-descarea{
height: 20px;
min-height: 20px;
resize: vertical;
overflow: auto;
box-sizing: border-box;
}
/* sheet251: SL0 card - Spells Known min-height +5px */
.page-magic .sl1-card textarea.sl1-knownarea{
min-height: 25px;
}
/* sheet251: match SL0 card min-width to Spellcasting Information card (magic-card) */
.page-magic .sl1-card{
min-width: 335px;
}
/* sheet251: prevent SL0 top-row small boxes from compressing under 25px */
.page-magic .sl1-box{
min-width: 25px;
}
/* sheet252: SL0 Spell Description height matches Spells Known */
.page-magic .sl1-card textarea.sl1-descarea{
min-height: 25px;
}
/* Match SL0 textarea initial height/resizing behavior inside Spell Info */
.page-magic .spellinfo-card textarea.sl1-descarea{
height: 20px;
min-height: 25px; /* match SL0 Spell Description min-height (sheet252) */
resize: vertical;
overflow: auto;
box-sizing: border-box;
}
/* sheet260: SL0 Spell Info repeating section (+Add) */
.page-magic .sl1-spellinfo-repeat-note{
margin-top: 6px;
margin-bottom: 6px;
font-size: 11px;
line-height: 1.2;
opacity: 0.9;
}
.page-magic .sl1-addhint{
font-weight: 700;
}
/* Slight separation between repeating Spell Info entries */
.page-magic .sl1-spellbox-repeat{
margin-top: 6px;
}
/* Spell Info minimum width for Spell Name and Casting Time */
.sl1-spellrow-name .sl1-line.short {
min-width: 60px;
}
/* =========================
Responsive containment fixes
Spell Level 0 + Spell Info
========================= */
/* Ensure all SL0 elements size within their containers */
.sl1-card, .sl1-card * {
box-sizing: border-box;
}
/* Prevent any child content from visually spilling out of the card */
.sl1-card {
overflow: hidden;
}
/* Allow top-row items to wrap inside the card instead of overflowing */
.sl1-toprow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: center;
}
/* Make each top item flexible and allow it to shrink within the card */
.sl1-topitem {
flex: 1 1 240px;
min-width: 0;
}
/* Keep the little number boxes from forcing overflow */
.sl1-topitem .sl1-box {
max-width: 100%;
}
/* Spells Known row: allow textarea to shrink/wrap within card */
.sl1-knownrow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: flex-start;
}
.sl1-knownlabel {
flex: 0 0 auto;
min-width: 0;
}
.sl1-knownarea {
flex: 1 1 260px;
min-width: 0;
max-width: 100%;
}
/* Spell Info rows: wrap on narrow screens, keep fields inside */
.sl1-spellrow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: center;
min-width: 0;
}
.sl1-spelllabel {
flex: 0 0 auto;
min-width: 0;
}
/* Inputs should be allowed to shrink instead of overflowing */
.sl1-spellrow input.sl1-line,
.sl1-spellrow textarea {
min-width: 0;
max-width: 100%;
}
/* Spell Name + Casting Time line: make inputs share space and wrap cleanly */
.sl1-spellrow-name input.sl1-line.short {
flex: 1 1 240px; /* grows, shrinks, wraps */
min-width: 60px; /* your requested minimum */
max-width: 100%;
}
/* Description textarea should always stay within the card */
.sl1-descarea {
flex: 1 1 100%;
min-width: 0;
max-width: 100%;
}
/* Repeat spell boxes should also clip/wrap properly */
.sl1-spellbox,
.sl1-spellbox-repeat {
max-width: 100%;
overflow: hidden;
}
/* Spell Info lock Name / Casting Time / Range on one row with proportional widths */
.sl1-spellrow-name {
display: flex;
flex-wrap: nowrap; /* stay on one row */
align-items: center;
}
.sl1-spellrow-name .sl1-line.name {
flex: 3 1 0; /* 50% wider */
min-width: 60px;
}
.sl1-spellrow-name .sl1-line.time,
.sl1-spellrow-name .sl1-line.range {
flex: 2 1 0;
min-width: 60px;
}
/* =========================
Spell Info containment (responsive)
Keeps content inside Spell Info card on narrow widths
========================= */
.sl1-card, .sl1-card * { box-sizing: border-box; }
.sl1-card,
.sl1-spellbox,
.sl1-spellbox-repeat {
max-width: 100%;
overflow: hidden; /* prevent spill outside card */
}
.sl1-spellrow,
.sl1-knownrow,
.sl1-toprow {
min-width: 0;
max-width: 100%;
}
.sl1-spellrow input,
.sl1-spellrow textarea,
.sl1-knownrow textarea,
.sl1-toprow input {
min-width: 0;
max-width: 100%;
}
/* Default: keep Name/Time/Range inputs on one row (your preferred layout) */
.sl1-spellrow-name { flex-wrap: nowrap; }
.sl1-spellrow-name .sl1-spelllabel { white-space: nowrap; }
/* Spell Info keep each label+field together as a unit */
.sl1-spellpair{
display:flex;
align-items:center;
gap: 6px;
white-space: nowrap; /* prevents label and its input from splitting lines */
min-width: 0;
}
/* Ensure inputs inside pairs can still shrink within the card */
.sl1-spellpair .sl1-line{
min-width: 60px; /* your minimum */
max-width: 100%;
}
/* Spell Info keep each label with its field, and preserve 3:2:2 width distribution */
.sl1-spellrow-name{
display:flex;
gap: 6px 10px;
align-items:center;
max-width:100%;
min-width:0;
}
/* Each label+input pair stays together */
.sl1-spellpair{
display:flex;
align-items:center;
gap:6px;
white-space:nowrap;
min-width:0;
}
/* Proportional widths (Spell Name 50% wider than Time/Range) */
.sl1-spellpair.pair-name{ flex:3 1 0; }
.sl1-spellpair.pair-time{ flex:2 1 0; }
.sl1-spellpair.pair-range{ flex:2 1 0; }
/* Inputs shrink inside their pair; keep your minimum */
.sl1-spellpair .sl1-line{
flex:1 1 0;
min-width:60px;
max-width:100%;
}
/* Spell Info final overrides for pair classes used in HTML */
.sl1-spellrow-name{ flex-wrap: wrap; }
.sl1-spellpair.namepair{ flex: 3 1 0; }
.sl1-spellpair.timepair{ flex: 2 1 0; }
.sl1-spellpair.rangepair{ flex: 2 1 0; }
/* Spell Info wrap by label+field pair (Casting Time & Range may drop, but never split from their label) */
.sl1-spellrow-name{
display:flex;
flex-wrap: wrap; /* allow pairs to wrap to lower rows */
align-items: center;
gap: 6px 10px;
min-width: 0;
}
.sl1-spellpair{
display:flex;
align-items:center;
gap: 6px;
white-space: nowrap; /* label and its field stay on same line */
min-width: 0;
max-width: 100%;
}
/* Proportional widths by PAIR so the whole unit wraps together */
.sl1-spellpair-name{ flex: 3 1 0; }
.sl1-spellpair-time{ flex: 2 1 0; }
.sl1-spellpair-range{ flex: 2 1 0; }
/* Inputs inside pairs can shrink but respect your minimum */
.sl1-spellpair .sl1-line{
min-width: 60px;
max-width: 100%;
}
/* FIX: actually allow Casting Time / Range PAIRS to wrap when narrow */
.sl1-spellrow-name{
flex-wrap: wrap !important;
}
/* Prevent pairs from shrinking to avoid suppressing wrapping */
.sl1-spellpair{
flex-shrink: 0;
}
/* FIX v2: enforce wrapping by giving each label+field pair a real minimum width.
This makes Casting Time / Range drop to a new row when the window is narrow,
while keeping each label attached to its field. */
.sl1-spellrow-name{
width: 100%;
max-width: 100%;
}
/* Minimum widths are set to the pair (label+field), not just the input,
so pairs stop compressing and instead wrap. */
.sl1-spellpair-name{ min-width: 320px; }
.sl1-spellpair-time{ min-width: 220px; }
.sl1-spellpair-range{ min-width: 200px; }
/* Keep 50% wider intent while still permitting wrap by pair */
.sl1-spellpair-name{ flex: 3 0 auto; }
.sl1-spellpair-time,
.sl1-spellpair-range{ flex: 2 0 auto; }
/* ===== Spell Info wrap fix (authoritative) =====
Problem: earlier rules target non-existent classes (sl0-spellpair-time/range),
and older grid/flex rules conflict. These rules are appended LAST and use
high specificity/!important so the Spell Info row actually wraps by pair. */
/* Ensure the Spell Name row is flex (not grid) and can wrap */
.sl1-spellbox .sl1-spellrow.sl1-spellrow-name{
display: flex !important;
flex-wrap: wrap !important;
align-items: center;
gap: 6px 10px;
width: 100%;
max-width: 100%;
min-width: 0;
}
/* Keep each label+field together */
.sl1-spellbox .sl1-spellrow.sl1-spellrow-name .sl1-spellpair{
display: inline-flex;
align-items: center;
gap: 6px;
white-space: nowrap;
flex-shrink: 0; /* don't compress forever; wrap instead */
min-width: 0;
max-width: 100%;
}
/* Inputs still respect your minimum and stay within the card */
.sl1-spellbox .sl1-spellrow.sl1-spellrow-name .sl1-spellpair .sl1-line{
min-width: 60px;
max-width: 100%;
}
/* ===== Bulk Spell Level Cards SL2-SL9 ===== */
/* ===== Collapsible Spell Level 2 Card (SL2) ===== */
.sl2-toggle{
position: absolute;
left: -9999px;
}
.sl2-toggle-btn{
display: inline-block;
border: 1px solid #333;
border-radius: 6px;
padding: 4px 8px;
font-size: 11px;
font-weight: bold;
cursor: pointer;
user-select: none;
margin: 0 0 6px 0;
background: #fff;
position: relative;
top: 1px;
padding-right: 22px;
}
.sl2-toggle-btn::after{
content: "◀";
position: absolute;
right: 28px;
top: 50%;
transform: translateY(-50%);
color: #000;
font-size: 12px;
line-height: 1;
}
.sl2-toggle:checked + .sl2-toggle-btn::after{
content: "▼";
color: #000;
}
.sl2-toggle-btn:hover{
filter: brightness(1.05);
}
.sl2-toggle:not(:checked) + .sl2-toggle-btn + .sl2-body{
display: none;
}
/* ===== SL2 structural style mirror (from SL0) ===== */
/* sheet243: Spell Level 0 (SL0) card (Arial only) */
.sl2-card{
position: relative;
border: 2px solid #000;
border-radius: 4px;
padding: 20px 14px 12px 14px;
box-sizing: border-box;
}
.sl2-title{
position: absolute;
top: -11px;
left: 10px;
background: #fff;
padding: 2px 10px;
border: 2px solid #000;
border-radius: 4px;
font-weight: 700;
font-size: 16px;
}
.sl2-toprow{
display: flex;
flex-wrap: wrap;
gap: 22px;
align-items: center;
margin-bottom: 12px;
}
.sl2-topitem{
font-weight: 700;
font-size: 18px;
display: flex;
align-items: center;
gap: 10px;
white-space: nowrap;
}
.sl2-box{
width: 58px;
height: 30px;
border: 2px solid #000;
background: #f2f2f2;
box-sizing: border-box;
}
.sl2-knownrow{
display: grid;
grid-template-columns: auto 1fr;
gap: 12px;
align-items: center;
margin-bottom: 10px;
}
.sl2-knownlabel{
font-weight: 700;
font-size: 16px;
white-space: nowrap;
}
.sl2-knownline{
width: 100%;
border: none;
border-bottom: 2px solid #000;
background: transparent;
height: 22px;
padding: 0 4px;
box-sizing: border-box;
}
.sl2-sep{
border-top: 2px solid #000;
margin: 8px 0 14px 0;
}
.sl2-spellbox{
border: 2px solid #000;
border-radius: 4px;
padding: 10px 10px 6px 10px;
box-sizing: border-box;
}
.sl2-spellrow{
display: grid;
grid-template-columns: auto 1fr;
gap: 10px;
align-items: center;
margin-bottom: 8px;
}
/* Spell Info: Spell Name row adds Casting Time on the same line */
.sl2-spellrow.sl2-spellrow-name{
grid-template-columns: auto 1fr auto 1fr;
}
.sl2-spelllabel{
font-weight: 700;
font-size: 18px;
white-space: nowrap;
}
.sl2-line{
width: 100%;
border: none;
border-bottom: 2px solid #000;
background: transparent;
height: 22px;
padding: 0 4px;
box-sizing: border-box;
}
.sl2-line.short{
max-width: 240px;
}
/* sheet244: SL0 card border thickness + layout fixes */
.sl2-card{
border: 1px solid #777; /* match other cards */
border-radius: 8px;
padding: 10px;
margin-top: 10px;
box-sizing: border-box;
position: static;
}
/* Remove the prior floating title styling if still present */
.sl2-title{ display: none; }
/* Force top row to stay on one line */
.sl2-toprow{
flex-wrap: nowrap;
justify-content: space-between;
gap: 12px;
}
/* Reduce the three small boxes by ~65% (58px -> ~20px) */
.sl2-box{
width: 20px;
height: 26px;
}
/* Resizable Spells Known box */
.sl2-knownarea{
width: 100%;
min-height: 28px;
border: 1px solid #777;
border-radius: 4px;
background: #fff;
padding: 4px 6px;
resize: vertical;
box-sizing: border-box;
font: inherit;
}
/* Resizable Spell Description box */
.sl2-descarea{
width: 100%;
min-height: 32px;
border: 1px solid #777;
border-radius: 4px;
background: #fff;
padding: 4px 6px;
resize: vertical;
box-sizing: border-box;
font: inherit;
}
/* Keep Spell Name line as underline but align nicely with textarea below */
.sl2-spellrow{
align-items: start;
}
/* sheet245: refine SL0 borders + field default heights + label sizing */
/* match normal thin borders for separator and spell entry box */
.sl2-sep{
border-top: 1px solid #777;
}
.sl2-spellbox{
border: 1px solid #777;
}
/* default (collapsed) heights before user expands */
.sl2-knownarea{
min-height: 25px;
height: 25px;
}
.sl2-descarea{
min-height: 20px;
height: 20px;
}
/* Spell Name / Spell Description label font size -2px */
.sl2-spelllabel{
font-size: 16px;
}
/* Adjust associated inputs to visually match the smaller labels */
.sl2-line{
height: 20px;
}
.sl2-line.short{
max-width: 210px;
}
/* sheet246: enforce max collapsed height for SL0 textareas */
.sl2-knownarea{
height: 20px;
min-height: 20px;
}
.sl2-descarea{
height: 20px;
min-height: 20px;
}
/* sheet248: allow user resize to change height (do NOT lock height with !important) */
.page-magic .sl2-card textarea.sl2-knownarea,
.page-magic .sl2-card textarea.sl2-descarea{
height: 20px; /* initial visible height */
min-padding: 0 4px !important;
line-height: 18px !important;
box-sizing: border-box !important;
resize: vertical !important;
}
/* sheet249: SL0 textareas start at 20px but remain user-resizable */
.page-magic .sl2-card textarea.sl2-knownarea,
.page-magic .sl2-card textarea.sl2-descarea{
height: 20px;
min-height: 20px;
resize: vertical;
overflow: auto;
box-sizing: border-box;
}
/* sheet251: SL0 card - Spells Known min-height +5px */
.page-magic .sl2-card textarea.sl2-knownarea{
min-height: 25px;
}
/* sheet251: match SL0 card min-width to Spellcasting Information card (magic-card) */
.page-magic .sl2-card{
min-width: 335px;
}
/* sheet251: prevent SL0 top-row small boxes from compressing under 25px */
.page-magic .sl2-box{
min-width: 25px;
}
/* sheet252: SL0 Spell Description height matches Spells Known */
.page-magic .sl2-card textarea.sl2-descarea{
min-height: 25px;
}
/* Match SL0 textarea initial height/resizing behavior inside Spell Info */
.page-magic .spellinfo-card textarea.sl2-descarea{
height: 20px;
min-height: 25px; /* match SL0 Spell Description min-height (sheet252) */
resize: vertical;
overflow: auto;
box-sizing: border-box;
}
/* sheet260: SL0 Spell Info repeating section (+Add) */
.page-magic .sl2-spellinfo-repeat-note{
margin-top: 6px;
margin-bottom: 6px;
font-size: 11px;
line-height: 1.2;
opacity: 0.9;
}
.page-magic .sl2-addhint{
font-weight: 700;
}
/* Slight separation between repeating Spell Info entries */
.page-magic .sl2-spellbox-repeat{
margin-top: 6px;
}
/* Spell Info minimum width for Spell Name and Casting Time */
.sl2-spellrow-name .sl2-line.short {
min-width: 60px;
}
/* =========================
Responsive containment fixes
Spell Level 0 + Spell Info
========================= */
/* Ensure all SL0 elements size within their containers */
.sl2-card, .sl2-card * {
box-sizing: border-box;
}
/* Prevent any child content from visually spilling out of the card */
.sl2-card {
overflow: hidden;
}
/* Allow top-row items to wrap inside the card instead of overflowing */
.sl2-toprow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: center;
}
/* Make each top item flexible and allow it to shrink within the card */
.sl2-topitem {
flex: 1 1 240px;
min-width: 0;
}
/* Keep the little number boxes from forcing overflow */
.sl2-topitem .sl2-box {
max-width: 100%;
}
/* Spells Known row: allow textarea to shrink/wrap within card */
.sl2-knownrow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: flex-start;
}
.sl2-knownlabel {
flex: 0 0 auto;
min-width: 0;
}
.sl2-knownarea {
flex: 1 1 260px;
min-width: 0;
max-width: 100%;
}
/* Spell Info rows: wrap on narrow screens, keep fields inside */
.sl2-spellrow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: center;
min-width: 0;
}
.sl2-spelllabel {
flex: 0 0 auto;
min-width: 0;
}
/* Inputs should be allowed to shrink instead of overflowing */
.sl2-spellrow input.sl2-line,
.sl2-spellrow textarea {
min-width: 0;
max-width: 100%;
}
/* Spell Name + Casting Time line: make inputs share space and wrap cleanly */
.sl2-spellrow-name input.sl2-line.short {
flex: 1 1 240px; /* grows, shrinks, wraps */
min-width: 60px; /* your requested minimum */
max-width: 100%;
}
/* Description textarea should always stay within the card */
.sl2-descarea {
flex: 1 1 100%;
min-width: 0;
max-width: 100%;
}
/* Repeat spell boxes should also clip/wrap properly */
.sl2-spellbox,
.sl2-spellbox-repeat {
max-width: 100%;
overflow: hidden;
}
/* Spell Info lock Name / Casting Time / Range on one row with proportional widths */
.sl2-spellrow-name {
display: flex;
flex-wrap: nowrap; /* stay on one row */
align-items: center;
}
.sl2-spellrow-name .sl2-line.name {
flex: 3 1 0; /* 50% wider */
min-width: 60px;
}
.sl2-spellrow-name .sl2-line.time,
.sl2-spellrow-name .sl2-line.range {
flex: 2 1 0;
min-width: 60px;
}
/* =========================
Spell Info containment (responsive)
Keeps content inside Spell Info card on narrow widths
========================= */
.sl2-card, .sl2-card * { box-sizing: border-box; }
.sl2-card,
.sl2-spellbox,
.sl2-spellbox-repeat {
max-width: 100%;
overflow: hidden; /* prevent spill outside card */
}
.sl2-spellrow,
.sl2-knownrow,
.sl2-toprow {
min-width: 0;
max-width: 100%;
}
.sl2-spellrow input,
.sl2-spellrow textarea,
.sl2-knownrow textarea,
.sl2-toprow input {
min-width: 0;
max-width: 100%;
}
/* Default: keep Name/Time/Range inputs on one row (your preferred layout) */
.sl2-spellrow-name { flex-wrap: nowrap; }
.sl2-spellrow-name .sl2-spelllabel { white-space: nowrap; }
/* Spell Info keep each label+field together as a unit */
.sl2-spellpair{
display:flex;
align-items:center;
gap: 6px;
white-space: nowrap; /* prevents label and its input from splitting lines */
min-width: 0;
}
/* Ensure inputs inside pairs can still shrink within the card */
.sl2-spellpair .sl2-line{
min-width: 60px; /* your minimum */
max-width: 100%;
}
/* Spell Info keep each label with its field, and preserve 3:2:2 width distribution */
.sl2-spellrow-name{
display:flex;
gap: 6px 10px;
align-items:center;
max-width:100%;
min-width:0;
}
/* Each label+input pair stays together */
.sl2-spellpair{
display:flex;
align-items:center;
gap:6px;
white-space:nowrap;
min-width:0;
}
/* Proportional widths (Spell Name 50% wider than Time/Range) */
.sl2-spellpair.pair-name{ flex:3 1 0; }
.sl2-spellpair.pair-time{ flex:2 1 0; }
.sl2-spellpair.pair-range{ flex:2 1 0; }
/* Inputs shrink inside their pair; keep your minimum */
.sl2-spellpair .sl2-line{
flex:1 1 0;
min-width:60px;
max-width:100%;
}
/* Spell Info final overrides for pair classes used in HTML */
.sl2-spellrow-name{ flex-wrap: wrap; }
.sl2-spellpair.namepair{ flex: 3 1 0; }
.sl2-spellpair.timepair{ flex: 2 1 0; }
.sl2-spellpair.rangepair{ flex: 2 1 0; }
/* Spell Info wrap by label+field pair (Casting Time & Range may drop, but never split from their label) */
.sl2-spellrow-name{
display:flex;
flex-wrap: wrap; /* allow pairs to wrap to lower rows */
align-items: center;
gap: 6px 10px;
min-width: 0;
}
.sl2-spellpair{
display:flex;
align-items:center;
gap: 6px;
white-space: nowrap; /* label and its field stay on same line */
min-width: 0;
max-width: 100%;
}
/* Proportional widths by PAIR so the whole unit wraps together */
.sl2-spellpair-name{ flex: 3 1 0; }
.sl2-spellpair-time{ flex: 2 1 0; }
.sl2-spellpair-range{ flex: 2 1 0; }
/* Inputs inside pairs can shrink but respect your minimum */
.sl2-spellpair .sl2-line{
min-width: 60px;
max-width: 100%;
}
/* FIX: actually allow Casting Time / Range PAIRS to wrap when narrow */
.sl2-spellrow-name{
flex-wrap: wrap !important;
}
/* Prevent pairs from shrinking to avoid suppressing wrapping */
.sl2-spellpair{
flex-shrink: 0;
}
/* FIX v2: enforce wrapping by giving each label+field pair a real minimum width.
This makes Casting Time / Range drop to a new row when the window is narrow,
while keeping each label attached to its field. */
.sl2-spellrow-name{
width: 100%;
max-width: 100%;
}
/* Minimum widths are set to the pair (label+field), not just the input,
so pairs stop compressing and instead wrap. */
.sl2-spellpair-name{ min-width: 320px; }
.sl2-spellpair-time{ min-width: 220px; }
.sl2-spellpair-range{ min-width: 200px; }
/* Keep 50% wider intent while still permitting wrap by pair */
.sl2-spellpair-name{ flex: 3 0 auto; }
.sl2-spellpair-time,
.sl2-spellpair-range{ flex: 2 0 auto; }
/* ===== Spell Info wrap fix (authoritative) =====
Problem: earlier rules target non-existent classes (sl0-spellpair-time/range),
and older grid/flex rules conflict. These rules are appended LAST and use
high specificity/!important so the Spell Info row actually wraps by pair. */
/* Ensure the Spell Name row is flex (not grid) and can wrap */
.sl2-spellbox .sl2-spellrow.sl2-spellrow-name{
display: flex !important;
flex-wrap: wrap !important;
align-items: center;
gap: 6px 10px;
width: 100%;
max-width: 100%;
min-width: 0;
}
/* Keep each label+field together */
.sl2-spellbox .sl2-spellrow.sl2-spellrow-name .sl2-spellpair{
display: inline-flex;
align-items: center;
gap: 6px;
white-space: nowrap;
flex-shrink: 0; /* don't compress forever; wrap instead */
min-width: 0;
max-width: 100%;
}
/* Inputs still respect your minimum and stay within the card */
.sl2-spellbox .sl2-spellrow.sl2-spellrow-name .sl2-spellpair .sl2-line{
min-width: 60px;
max-width: 100%;
}
/* ===== Collapsible Spell Level 3 Card (SL3) ===== */
.sl3-toggle{
position: absolute;
left: -9999px;
}
.sl3-toggle-btn{
display: inline-block;
border: 1px solid #333;
border-radius: 6px;
padding: 4px 8px;
font-size: 11px;
font-weight: bold;
cursor: pointer;
user-select: none;
margin: 0 0 6px 0;
background: #fff;
position: relative;
top: 1px;
padding-right: 22px;
}
.sl3-toggle-btn::after{
content: "◀";
position: absolute;
right: 28px;
top: 50%;
transform: translateY(-50%);
color: #000;
font-size: 12px;
line-height: 1;
}
.sl3-toggle:checked + .sl3-toggle-btn::after{
content: "▼";
color: #000;
}
.sl3-toggle-btn:hover{
filter: brightness(1.05);
}
.sl3-toggle:not(:checked) + .sl3-toggle-btn + .sl3-body{
display: none;
}
/* ===== SL3 structural style mirror (from SL0) ===== */
/* sheet243: Spell Level 0 (SL0) card (Arial only) */
.sl3-card{
position: relative;
border: 2px solid #000;
border-radius: 4px;
padding: 20px 14px 12px 14px;
box-sizing: border-box;
}
.sl3-title{
position: absolute;
top: -11px;
left: 10px;
background: #fff;
padding: 2px 10px;
border: 2px solid #000;
border-radius: 4px;
font-weight: 700;
font-size: 16px;
}
.sl3-toprow{
display: flex;
flex-wrap: wrap;
gap: 22px;
align-items: center;
margin-bottom: 12px;
}
.sl3-topitem{
font-weight: 700;
font-size: 18px;
display: flex;
align-items: center;
gap: 10px;
white-space: nowrap;
}
.sl3-box{
width: 58px;
height: 30px;
border: 2px solid #000;
background: #f2f2f2;
box-sizing: border-box;
}
.sl3-knownrow{
display: grid;
grid-template-columns: auto 1fr;
gap: 12px;
align-items: center;
margin-bottom: 10px;
}
.sl3-knownlabel{
font-weight: 700;
font-size: 16px;
white-space: nowrap;
}
.sl3-knownline{
width: 100%;
border: none;
border-bottom: 2px solid #000;
background: transparent;
height: 22px;
padding: 0 4px;
box-sizing: border-box;
}
.sl3-sep{
border-top: 2px solid #000;
margin: 8px 0 14px 0;
}
.sl3-spellbox{
border: 2px solid #000;
border-radius: 4px;
padding: 10px 10px 6px 10px;
box-sizing: border-box;
}
.sl3-spellrow{
display: grid;
grid-template-columns: auto 1fr;
gap: 10px;
align-items: center;
margin-bottom: 8px;
}
/* Spell Info: Spell Name row adds Casting Time on the same line */
.sl3-spellrow.sl3-spellrow-name{
grid-template-columns: auto 1fr auto 1fr;
}
.sl3-spelllabel{
font-weight: 700;
font-size: 18px;
white-space: nowrap;
}
.sl3-line{
width: 100%;
border: none;
border-bottom: 2px solid #000;
background: transparent;
height: 22px;
padding: 0 4px;
box-sizing: border-box;
}
.sl3-line.short{
max-width: 240px;
}
/* sheet244: SL0 card border thickness + layout fixes */
.sl3-card{
border: 1px solid #777; /* match other cards */
border-radius: 8px;
padding: 10px;
margin-top: 10px;
box-sizing: border-box;
position: static;
}
/* Remove the prior floating title styling if still present */
.sl3-title{ display: none; }
/* Force top row to stay on one line */
.sl3-toprow{
flex-wrap: nowrap;
justify-content: space-between;
gap: 12px;
}
/* Reduce the three small boxes by ~65% (58px -> ~20px) */
.sl3-box{
width: 20px;
height: 26px;
}
/* Resizable Spells Known box */
.sl3-knownarea{
width: 100%;
min-height: 28px;
border: 1px solid #777;
border-radius: 4px;
background: #fff;
padding: 4px 6px;
resize: vertical;
box-sizing: border-box;
font: inherit;
}
/* Resizable Spell Description box */
.sl3-descarea{
width: 100%;
min-height: 32px;
border: 1px solid #777;
border-radius: 4px;
background: #fff;
padding: 4px 6px;
resize: vertical;
box-sizing: border-box;
font: inherit;
}
/* Keep Spell Name line as underline but align nicely with textarea below */
.sl3-spellrow{
align-items: start;
}
/* sheet245: refine SL0 borders + field default heights + label sizing */
/* match normal thin borders for separator and spell entry box */
.sl3-sep{
border-top: 1px solid #777;
}
.sl3-spellbox{
border: 1px solid #777;
}
/* default (collapsed) heights before user expands */
.sl3-knownarea{
min-height: 25px;
height: 25px;
}
.sl3-descarea{
min-height: 20px;
height: 20px;
}
/* Spell Name / Spell Description label font size -2px */
.sl3-spelllabel{
font-size: 16px;
}
/* Adjust associated inputs to visually match the smaller labels */
.sl3-line{
height: 20px;
}
.sl3-line.short{
max-width: 210px;
}
/* sheet246: enforce max collapsed height for SL0 textareas */
.sl3-knownarea{
height: 20px;
min-height: 20px;
}
.sl3-descarea{
height: 20px;
min-height: 20px;
}
/* sheet248: allow user resize to change height (do NOT lock height with !important) */
.page-magic .sl3-card textarea.sl3-knownarea,
.page-magic .sl3-card textarea.sl3-descarea{
height: 20px; /* initial visible height */
min-padding: 0 4px !important;
line-height: 18px !important;
box-sizing: border-box !important;
resize: vertical !important;
}
/* sheet249: SL0 textareas start at 20px but remain user-resizable */
.page-magic .sl3-card textarea.sl3-knownarea,
.page-magic .sl3-card textarea.sl3-descarea{
height: 20px;
min-height: 20px;
resize: vertical;
overflow: auto;
box-sizing: border-box;
}
/* sheet251: SL0 card - Spells Known min-height +5px */
.page-magic .sl3-card textarea.sl3-knownarea{
min-height: 25px;
}
/* sheet251: match SL0 card min-width to Spellcasting Information card (magic-card) */
.page-magic .sl3-card{
min-width: 335px;
}
/* sheet251: prevent SL0 top-row small boxes from compressing under 25px */
.page-magic .sl3-box{
min-width: 25px;
}
/* sheet252: SL0 Spell Description height matches Spells Known */
.page-magic .sl3-card textarea.sl3-descarea{
min-height: 25px;
}
/* Match SL0 textarea initial height/resizing behavior inside Spell Info */
.page-magic .spellinfo-card textarea.sl3-descarea{
height: 20px;
min-height: 25px; /* match SL0 Spell Description min-height (sheet252) */
resize: vertical;
overflow: auto;
box-sizing: border-box;
}
/* sheet260: SL0 Spell Info repeating section (+Add) */
.page-magic .sl3-spellinfo-repeat-note{
margin-top: 6px;
margin-bottom: 6px;
font-size: 11px;
line-height: 1.2;
opacity: 0.9;
}
.page-magic .sl3-addhint{
font-weight: 700;
}
/* Slight separation between repeating Spell Info entries */
.page-magic .sl3-spellbox-repeat{
margin-top: 6px;
}
/* Spell Info minimum width for Spell Name and Casting Time */
.sl3-spellrow-name .sl3-line.short {
min-width: 60px;
}
/* =========================
Responsive containment fixes
Spell Level 0 + Spell Info
========================= */
/* Ensure all SL0 elements size within their containers */
.sl3-card, .sl3-card * {
box-sizing: border-box;
}
/* Prevent any child content from visually spilling out of the card */
.sl3-card {
overflow: hidden;
}
/* Allow top-row items to wrap inside the card instead of overflowing */
.sl3-toprow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: center;
}
/* Make each top item flexible and allow it to shrink within the card */
.sl3-topitem {
flex: 1 1 240px;
min-width: 0;
}
/* Keep the little number boxes from forcing overflow */
.sl3-topitem .sl3-box {
max-width: 100%;
}
/* Spells Known row: allow textarea to shrink/wrap within card */
.sl3-knownrow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: flex-start;
}
.sl3-knownlabel {
flex: 0 0 auto;
min-width: 0;
}
.sl3-knownarea {
flex: 1 1 260px;
min-width: 0;
max-width: 100%;
}
/* Spell Info rows: wrap on narrow screens, keep fields inside */
.sl3-spellrow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: center;
min-width: 0;
}
.sl3-spelllabel {
flex: 0 0 auto;
min-width: 0;
}
/* Inputs should be allowed to shrink instead of overflowing */
.sl3-spellrow input.sl3-line,
.sl3-spellrow textarea {
min-width: 0;
max-width: 100%;
}
/* Spell Name + Casting Time line: make inputs share space and wrap cleanly */
.sl3-spellrow-name input.sl3-line.short {
flex: 1 1 240px; /* grows, shrinks, wraps */
min-width: 60px; /* your requested minimum */
max-width: 100%;
}
/* Description textarea should always stay within the card */
.sl3-descarea {
flex: 1 1 100%;
min-width: 0;
max-width: 100%;
}
/* Repeat spell boxes should also clip/wrap properly */
.sl3-spellbox,
.sl3-spellbox-repeat {
max-width: 100%;
overflow: hidden;
}
/* Spell Info lock Name / Casting Time / Range on one row with proportional widths */
.sl3-spellrow-name {
display: flex;
flex-wrap: nowrap; /* stay on one row */
align-items: center;
}
.sl3-spellrow-name .sl3-line.name {
flex: 3 1 0; /* 50% wider */
min-width: 60px;
}
.sl3-spellrow-name .sl3-line.time,
.sl3-spellrow-name .sl3-line.range {
flex: 2 1 0;
min-width: 60px;
}
/* =========================
Spell Info containment (responsive)
Keeps content inside Spell Info card on narrow widths
========================= */
.sl3-card, .sl3-card * { box-sizing: border-box; }
.sl3-card,
.sl3-spellbox,
.sl3-spellbox-repeat {
max-width: 100%;
overflow: hidden; /* prevent spill outside card */
}
.sl3-spellrow,
.sl3-knownrow,
.sl3-toprow {
min-width: 0;
max-width: 100%;
}
.sl3-spellrow input,
.sl3-spellrow textarea,
.sl3-knownrow textarea,
.sl3-toprow input {
min-width: 0;
max-width: 100%;
}
/* Default: keep Name/Time/Range inputs on one row (your preferred layout) */
.sl3-spellrow-name { flex-wrap: nowrap; }
.sl3-spellrow-name .sl3-spelllabel { white-space: nowrap; }
/* Spell Info keep each label+field together as a unit */
.sl3-spellpair{
display:flex;
align-items:center;
gap: 6px;
white-space: nowrap; /* prevents label and its input from splitting lines */
min-width: 0;
}
/* Ensure inputs inside pairs can still shrink within the card */
.sl3-spellpair .sl3-line{
min-width: 60px; /* your minimum */
max-width: 100%;
}
/* Spell Info keep each label with its field, and preserve 3:2:2 width distribution */
.sl3-spellrow-name{
display:flex;
gap: 6px 10px;
align-items:center;
max-width:100%;
min-width:0;
}
/* Each label+input pair stays together */
.sl3-spellpair{
display:flex;
align-items:center;
gap:6px;
white-space:nowrap;
min-width:0;
}
/* Proportional widths (Spell Name 50% wider than Time/Range) */
.sl3-spellpair.pair-name{ flex:3 1 0; }
.sl3-spellpair.pair-time{ flex:2 1 0; }
.sl3-spellpair.pair-range{ flex:2 1 0; }
/* Inputs shrink inside their pair; keep your minimum */
.sl3-spellpair .sl3-line{
flex:1 1 0;
min-width:60px;
max-width:100%;
}
/* Spell Info final overrides for pair classes used in HTML */
.sl3-spellrow-name{ flex-wrap: wrap; }
.sl3-spellpair.namepair{ flex: 3 1 0; }
.sl3-spellpair.timepair{ flex: 2 1 0; }
.sl3-spellpair.rangepair{ flex: 2 1 0; }
/* Spell Info wrap by label+field pair (Casting Time & Range may drop, but never split from their label) */
.sl3-spellrow-name{
display:flex;
flex-wrap: wrap; /* allow pairs to wrap to lower rows */
align-items: center;
gap: 6px 10px;
min-width: 0;
}
.sl3-spellpair{
display:flex;
align-items:center;
gap: 6px;
white-space: nowrap; /* label and its field stay on same line */
min-width: 0;
max-width: 100%;
}
/* Proportional widths by PAIR so the whole unit wraps together */
.sl3-spellpair-name{ flex: 3 1 0; }
.sl3-spellpair-time{ flex: 2 1 0; }
.sl3-spellpair-range{ flex: 2 1 0; }
/* Inputs inside pairs can shrink but respect your minimum */
.sl3-spellpair .sl3-line{
min-width: 60px;
max-width: 100%;
}
/* FIX: actually allow Casting Time / Range PAIRS to wrap when narrow */
.sl3-spellrow-name{
flex-wrap: wrap !important;
}
/* Prevent pairs from shrinking to avoid suppressing wrapping */
.sl3-spellpair{
flex-shrink: 0;
}
/* FIX v2: enforce wrapping by giving each label+field pair a real minimum width.
This makes Casting Time / Range drop to a new row when the window is narrow,
while keeping each label attached to its field. */
.sl3-spellrow-name{
width: 100%;
max-width: 100%;
}
/* Minimum widths are set to the pair (label+field), not just the input,
so pairs stop compressing and instead wrap. */
.sl3-spellpair-name{ min-width: 320px; }
.sl3-spellpair-time{ min-width: 220px; }
.sl3-spellpair-range{ min-width: 200px; }
/* Keep 50% wider intent while still permitting wrap by pair */
.sl3-spellpair-name{ flex: 3 0 auto; }
.sl3-spellpair-time,
.sl3-spellpair-range{ flex: 2 0 auto; }
/* ===== Spell Info wrap fix (authoritative) =====
Problem: earlier rules target non-existent classes (sl0-spellpair-time/range),
and older grid/flex rules conflict. These rules are appended LAST and use
high specificity/!important so the Spell Info row actually wraps by pair. */
/* Ensure the Spell Name row is flex (not grid) and can wrap */
.sl3-spellbox .sl3-spellrow.sl3-spellrow-name{
display: flex !important;
flex-wrap: wrap !important;
align-items: center;
gap: 6px 10px;
width: 100%;
max-width: 100%;
min-width: 0;
}
/* Keep each label+field together */
.sl3-spellbox .sl3-spellrow.sl3-spellrow-name .sl3-spellpair{
display: inline-flex;
align-items: center;
gap: 6px;
white-space: nowrap;
flex-shrink: 0; /* don't compress forever; wrap instead */
min-width: 0;
max-width: 100%;
}
/* Inputs still respect your minimum and stay within the card */
.sl3-spellbox .sl3-spellrow.sl3-spellrow-name .sl3-spellpair .sl3-line{
min-width: 60px;
max-width: 100%;
}
/* ===== Collapsible Spell Level 4 Card (SL4) ===== */
.sl4-toggle{
position: absolute;
left: -9999px;
}
.sl4-toggle-btn{
display: inline-block;
border: 1px solid #333;
border-radius: 6px;
padding: 4px 8px;
font-size: 11px;
font-weight: bold;
cursor: pointer;
user-select: none;
margin: 0 0 6px 0;
background: #fff;
position: relative;
top: 1px;
padding-right: 22px;
}
.sl4-toggle-btn::after{
content: "◀";
position: absolute;
right: 28px;
top: 50%;
transform: translateY(-50%);
color: #000;
font-size: 12px;
line-height: 1;
}
.sl4-toggle:checked + .sl4-toggle-btn::after{
content: "▼";
color: #000;
}
.sl4-toggle-btn:hover{
filter: brightness(1.05);
}
.sl4-toggle:not(:checked) + .sl4-toggle-btn + .sl4-body{
display: none;
}
/* ===== SL4 structural style mirror (from SL0) ===== */
/* sheet243: Spell Level 0 (SL0) card (Arial only) */
.sl4-card{
position: relative;
border: 2px solid #000;
border-radius: 4px;
padding: 20px 14px 12px 14px;
box-sizing: border-box;
}
.sl4-title{
position: absolute;
top: -11px;
left: 10px;
background: #fff;
padding: 2px 10px;
border: 2px solid #000;
border-radius: 4px;
font-weight: 700;
font-size: 16px;
}
.sl4-toprow{
display: flex;
flex-wrap: wrap;
gap: 22px;
align-items: center;
margin-bottom: 12px;
}
.sl4-topitem{
font-weight: 700;
font-size: 18px;
display: flex;
align-items: center;
gap: 10px;
white-space: nowrap;
}
.sl4-box{
width: 58px;
height: 30px;
border: 2px solid #000;
background: #f2f2f2;
box-sizing: border-box;
}
.sl4-knownrow{
display: grid;
grid-template-columns: auto 1fr;
gap: 12px;
align-items: center;
margin-bottom: 10px;
}
.sl4-knownlabel{
font-weight: 700;
font-size: 16px;
white-space: nowrap;
}
.sl4-knownline{
width: 100%;
border: none;
border-bottom: 2px solid #000;
background: transparent;
height: 22px;
padding: 0 4px;
box-sizing: border-box;
}
.sl4-sep{
border-top: 2px solid #000;
margin: 8px 0 14px 0;
}
.sl4-spellbox{
border: 2px solid #000;
border-radius: 4px;
padding: 10px 10px 6px 10px;
box-sizing: border-box;
}
.sl4-spellrow{
display: grid;
grid-template-columns: auto 1fr;
gap: 10px;
align-items: center;
margin-bottom: 8px;
}
/* Spell Info: Spell Name row adds Casting Time on the same line */
.sl4-spellrow.sl4-spellrow-name{
grid-template-columns: auto 1fr auto 1fr;
}
.sl4-spelllabel{
font-weight: 700;
font-size: 18px;
white-space: nowrap;
}
.sl4-line{
width: 100%;
border: none;
border-bottom: 2px solid #000;
background: transparent;
height: 22px;
padding: 0 4px;
box-sizing: border-box;
}
.sl4-line.short{
max-width: 240px;
}
/* sheet244: SL0 card border thickness + layout fixes */
.sl4-card{
border: 1px solid #777; /* match other cards */
border-radius: 8px;
padding: 10px;
margin-top: 10px;
box-sizing: border-box;
position: static;
}
/* Remove the prior floating title styling if still present */
.sl4-title{ display: none; }
/* Force top row to stay on one line */
.sl4-toprow{
flex-wrap: nowrap;
justify-content: space-between;
gap: 12px;
}
/* Reduce the three small boxes by ~65% (58px -> ~20px) */
.sl4-box{
width: 20px;
height: 26px;
}
/* Resizable Spells Known box */
.sl4-knownarea{
width: 100%;
min-height: 28px;
border: 1px solid #777;
border-radius: 4px;
background: #fff;
padding: 4px 6px;
resize: vertical;
box-sizing: border-box;
font: inherit;
}
/* Resizable Spell Description box */
.sl4-descarea{
width: 100%;
min-height: 32px;
border: 1px solid #777;
border-radius: 4px;
background: #fff;
padding: 4px 6px;
resize: vertical;
box-sizing: border-box;
font: inherit;
}
/* Keep Spell Name line as underline but align nicely with textarea below */
.sl4-spellrow{
align-items: start;
}
/* sheet245: refine SL0 borders + field default heights + label sizing */
/* match normal thin borders for separator and spell entry box */
.sl4-sep{
border-top: 1px solid #777;
}
.sl4-spellbox{
border: 1px solid #777;
}
/* default (collapsed) heights before user expands */
.sl4-knownarea{
min-height: 25px;
height: 25px;
}
.sl4-descarea{
min-height: 20px;
height: 20px;
}
/* Spell Name / Spell Description label font size -2px */
.sl4-spelllabel{
font-size: 16px;
}
/* Adjust associated inputs to visually match the smaller labels */
.sl4-line{
height: 20px;
}
.sl4-line.short{
max-width: 210px;
}
/* sheet246: enforce max collapsed height for SL0 textareas */
.sl4-knownarea{
height: 20px;
min-height: 20px;
}
.sl4-descarea{
height: 20px;
min-height: 20px;
}
/* sheet248: allow user resize to change height (do NOT lock height with !important) */
.page-magic .sl4-card textarea.sl4-knownarea,
.page-magic .sl4-card textarea.sl4-descarea{
height: 20px; /* initial visible height */
min-padding: 0 4px !important;
line-height: 18px !important;
box-sizing: border-box !important;
resize: vertical !important;
}
/* sheet249: SL0 textareas start at 20px but remain user-resizable */
.page-magic .sl4-card textarea.sl4-knownarea,
.page-magic .sl4-card textarea.sl4-descarea{
height: 20px;
min-height: 20px;
resize: vertical;
overflow: auto;
box-sizing: border-box;
}
/* sheet251: SL0 card - Spells Known min-height +5px */
.page-magic .sl4-card textarea.sl4-knownarea{
min-height: 25px;
}
/* sheet251: match SL0 card min-width to Spellcasting Information card (magic-card) */
.page-magic .sl4-card{
min-width: 335px;
}
/* sheet251: prevent SL0 top-row small boxes from compressing under 25px */
.page-magic .sl4-box{
min-width: 25px;
}
/* sheet252: SL0 Spell Description height matches Spells Known */
.page-magic .sl4-card textarea.sl4-descarea{
min-height: 25px;
}
/* Match SL0 textarea initial height/resizing behavior inside Spell Info */
.page-magic .spellinfo-card textarea.sl4-descarea{
height: 20px;
min-height: 25px; /* match SL0 Spell Description min-height (sheet252) */
resize: vertical;
overflow: auto;
box-sizing: border-box;
}
/* sheet260: SL0 Spell Info repeating section (+Add) */
.page-magic .sl4-spellinfo-repeat-note{
margin-top: 6px;
margin-bottom: 6px;
font-size: 11px;
line-height: 1.2;
opacity: 0.9;
}
.page-magic .sl4-addhint{
font-weight: 700;
}
/* Slight separation between repeating Spell Info entries */
.page-magic .sl4-spellbox-repeat{
margin-top: 6px;
}
/* Spell Info minimum width for Spell Name and Casting Time */
.sl4-spellrow-name .sl4-line.short {
min-width: 60px;
}
/* =========================
Responsive containment fixes
Spell Level 0 + Spell Info
========================= */
/* Ensure all SL0 elements size within their containers */
.sl4-card, .sl4-card * {
box-sizing: border-box;
}
/* Prevent any child content from visually spilling out of the card */
.sl4-card {
overflow: hidden;
}
/* Allow top-row items to wrap inside the card instead of overflowing */
.sl4-toprow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: center;
}
/* Make each top item flexible and allow it to shrink within the card */
.sl4-topitem {
flex: 1 1 240px;
min-width: 0;
}
/* Keep the little number boxes from forcing overflow */
.sl4-topitem .sl4-box {
max-width: 100%;
}
/* Spells Known row: allow textarea to shrink/wrap within card */
.sl4-knownrow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: flex-start;
}
.sl4-knownlabel {
flex: 0 0 auto;
min-width: 0;
}
.sl4-knownarea {
flex: 1 1 260px;
min-width: 0;
max-width: 100%;
}
/* Spell Info rows: wrap on narrow screens, keep fields inside */
.sl4-spellrow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: center;
min-width: 0;
}
.sl4-spelllabel {
flex: 0 0 auto;
min-width: 0;
}
/* Inputs should be allowed to shrink instead of overflowing */
.sl4-spellrow input.sl4-line,
.sl4-spellrow textarea {
min-width: 0;
max-width: 100%;
}
/* Spell Name + Casting Time line: make inputs share space and wrap cleanly */
.sl4-spellrow-name input.sl4-line.short {
flex: 1 1 240px; /* grows, shrinks, wraps */
min-width: 60px; /* your requested minimum */
max-width: 100%;
}
/* Description textarea should always stay within the card */
.sl4-descarea {
flex: 1 1 100%;
min-width: 0;
max-width: 100%;
}
/* Repeat spell boxes should also clip/wrap properly */
.sl4-spellbox,
.sl4-spellbox-repeat {
max-width: 100%;
overflow: hidden;
}
/* Spell Info lock Name / Casting Time / Range on one row with proportional widths */
.sl4-spellrow-name {
display: flex;
flex-wrap: nowrap; /* stay on one row */
align-items: center;
}
.sl4-spellrow-name .sl4-line.name {
flex: 3 1 0; /* 50% wider */
min-width: 60px;
}
.sl4-spellrow-name .sl4-line.time,
.sl4-spellrow-name .sl4-line.range {
flex: 2 1 0;
min-width: 60px;
}
/* =========================
Spell Info containment (responsive)
Keeps content inside Spell Info card on narrow widths
========================= */
.sl4-card, .sl4-card * { box-sizing: border-box; }
.sl4-card,
.sl4-spellbox,
.sl4-spellbox-repeat {
max-width: 100%;
overflow: hidden; /* prevent spill outside card */
}
.sl4-spellrow,
.sl4-knownrow,
.sl4-toprow {
min-width: 0;
max-width: 100%;
}
.sl4-spellrow input,
.sl4-spellrow textarea,
.sl4-knownrow textarea,
.sl4-toprow input {
min-width: 0;
max-width: 100%;
}
/* Default: keep Name/Time/Range inputs on one row (your preferred layout) */
.sl4-spellrow-name { flex-wrap: nowrap; }
.sl4-spellrow-name .sl4-spelllabel { white-space: nowrap; }
/* Spell Info keep each label+field together as a unit */
.sl4-spellpair{
display:flex;
align-items:center;
gap: 6px;
white-space: nowrap; /* prevents label and its input from splitting lines */
min-width: 0;
}
/* Ensure inputs inside pairs can still shrink within the card */
.sl4-spellpair .sl4-line{
min-width: 60px; /* your minimum */
max-width: 100%;
}
/* Spell Info keep each label with its field, and preserve 3:2:2 width distribution */
.sl4-spellrow-name{
display:flex;
gap: 6px 10px;
align-items:center;
max-width:100%;
min-width:0;
}
/* Each label+input pair stays together */
.sl4-spellpair{
display:flex;
align-items:center;
gap:6px;
white-space:nowrap;
min-width:0;
}
/* Proportional widths (Spell Name 50% wider than Time/Range) */
.sl4-spellpair.pair-name{ flex:3 1 0; }
.sl4-spellpair.pair-time{ flex:2 1 0; }
.sl4-spellpair.pair-range{ flex:2 1 0; }
/* Inputs shrink inside their pair; keep your minimum */
.sl4-spellpair .sl4-line{
flex:1 1 0;
min-width:60px;
max-width:100%;
}
/* Spell Info final overrides for pair classes used in HTML */
.sl4-spellrow-name{ flex-wrap: wrap; }
.sl4-spellpair.namepair{ flex: 3 1 0; }
.sl4-spellpair.timepair{ flex: 2 1 0; }
.sl4-spellpair.rangepair{ flex: 2 1 0; }
/* Spell Info wrap by label+field pair (Casting Time & Range may drop, but never split from their label) */
.sl4-spellrow-name{
display:flex;
flex-wrap: wrap; /* allow pairs to wrap to lower rows */
align-items: center;
gap: 6px 10px;
min-width: 0;
}
.sl4-spellpair{
display:flex;
align-items:center;
gap: 6px;
white-space: nowrap; /* label and its field stay on same line */
min-width: 0;
max-width: 100%;
}
/* Proportional widths by PAIR so the whole unit wraps together */
.sl4-spellpair-name{ flex: 3 1 0; }
.sl4-spellpair-time{ flex: 2 1 0; }
.sl4-spellpair-range{ flex: 2 1 0; }
/* Inputs inside pairs can shrink but respect your minimum */
.sl4-spellpair .sl4-line{
min-width: 60px;
max-width: 100%;
}
/* FIX: actually allow Casting Time / Range PAIRS to wrap when narrow */
.sl4-spellrow-name{
flex-wrap: wrap !important;
}
/* Prevent pairs from shrinking to avoid suppressing wrapping */
.sl4-spellpair{
flex-shrink: 0;
}
/* FIX v2: enforce wrapping by giving each label+field pair a real minimum width.
This makes Casting Time / Range drop to a new row when the window is narrow,
while keeping each label attached to its field. */
.sl4-spellrow-name{
width: 100%;
max-width: 100%;
}
/* Minimum widths are set to the pair (label+field), not just the input,
so pairs stop compressing and instead wrap. */
.sl4-spellpair-name{ min-width: 320px; }
.sl4-spellpair-time{ min-width: 220px; }
.sl4-spellpair-range{ min-width: 200px; }
/* Keep 50% wider intent while still permitting wrap by pair */
.sl4-spellpair-name{ flex: 3 0 auto; }
.sl4-spellpair-time,
.sl4-spellpair-range{ flex: 2 0 auto; }
/* ===== Spell Info wrap fix (authoritative) =====
Problem: earlier rules target non-existent classes (sl0-spellpair-time/range),
and older grid/flex rules conflict. These rules are appended LAST and use
high specificity/!important so the Spell Info row actually wraps by pair. */
/* Ensure the Spell Name row is flex (not grid) and can wrap */
.sl4-spellbox .sl4-spellrow.sl4-spellrow-name{
display: flex !important;
flex-wrap: wrap !important;
align-items: center;
gap: 6px 10px;
width: 100%;
max-width: 100%;
min-width: 0;
}
/* Keep each label+field together */
.sl4-spellbox .sl4-spellrow.sl4-spellrow-name .sl4-spellpair{
display: inline-flex;
align-items: center;
gap: 6px;
white-space: nowrap;
flex-shrink: 0; /* don't compress forever; wrap instead */
min-width: 0;
max-width: 100%;
}
/* Inputs still respect your minimum and stay within the card */
.sl4-spellbox .sl4-spellrow.sl4-spellrow-name .sl4-spellpair .sl4-line{
min-width: 60px;
max-width: 100%;
}
/* ===== Collapsible Spell Level 5 Card (SL5) ===== */
.sl5-toggle{
position: absolute;
left: -9999px;
}
.sl5-toggle-btn{
display: inline-block;
border: 1px solid #333;
border-radius: 6px;
padding: 4px 8px;
font-size: 11px;
font-weight: bold;
cursor: pointer;
user-select: none;
margin: 0 0 6px 0;
background: #fff;
position: relative;
top: 1px;
padding-right: 22px;
}
.sl5-toggle-btn::after{
content: "◀";
position: absolute;
right: 28px;
top: 50%;
transform: translateY(-50%);
color: #000;
font-size: 12px;
line-height: 1;
}
.sl5-toggle:checked + .sl5-toggle-btn::after{
content: "▼";
color: #000;
}
.sl5-toggle-btn:hover{
filter: brightness(1.05);
}
.sl5-toggle:not(:checked) + .sl5-toggle-btn + .sl5-body{
display: none;
}
/* ===== SL5 structural style mirror (from SL0) ===== */
/* sheet243: Spell Level 0 (SL0) card (Arial only) */
.sl5-card{
position: relative;
border: 2px solid #000;
border-radius: 4px;
padding: 20px 14px 12px 14px;
box-sizing: border-box;
}
.sl5-title{
position: absolute;
top: -11px;
left: 10px;
background: #fff;
padding: 2px 10px;
border: 2px solid #000;
border-radius: 4px;
font-weight: 700;
font-size: 16px;
}
.sl5-toprow{
display: flex;
flex-wrap: wrap;
gap: 22px;
align-items: center;
margin-bottom: 12px;
}
.sl5-topitem{
font-weight: 700;
font-size: 18px;
display: flex;
align-items: center;
gap: 10px;
white-space: nowrap;
}
.sl5-box{
width: 58px;
height: 30px;
border: 2px solid #000;
background: #f2f2f2;
box-sizing: border-box;
}
.sl5-knownrow{
display: grid;
grid-template-columns: auto 1fr;
gap: 12px;
align-items: center;
margin-bottom: 10px;
}
.sl5-knownlabel{
font-weight: 700;
font-size: 16px;
white-space: nowrap;
}
.sl5-knownline{
width: 100%;
border: none;
border-bottom: 2px solid #000;
background: transparent;
height: 22px;
padding: 0 4px;
box-sizing: border-box;
}
.sl5-sep{
border-top: 2px solid #000;
margin: 8px 0 14px 0;
}
.sl5-spellbox{
border: 2px solid #000;
border-radius: 4px;
padding: 10px 10px 6px 10px;
box-sizing: border-box;
}
.sl5-spellrow{
display: grid;
grid-template-columns: auto 1fr;
gap: 10px;
align-items: center;
margin-bottom: 8px;
}
/* Spell Info: Spell Name row adds Casting Time on the same line */
.sl5-spellrow.sl5-spellrow-name{
grid-template-columns: auto 1fr auto 1fr;
}
.sl5-spelllabel{
font-weight: 700;
font-size: 18px;
white-space: nowrap;
}
.sl5-line{
width: 100%;
border: none;
border-bottom: 2px solid #000;
background: transparent;
height: 22px;
padding: 0 4px;
box-sizing: border-box;
}
.sl5-line.short{
max-width: 240px;
}
/* sheet244: SL0 card border thickness + layout fixes */
.sl5-card{
border: 1px solid #777; /* match other cards */
border-radius: 8px;
padding: 10px;
margin-top: 10px;
box-sizing: border-box;
position: static;
}
/* Remove the prior floating title styling if still present */
.sl5-title{ display: none; }
/* Force top row to stay on one line */
.sl5-toprow{
flex-wrap: nowrap;
justify-content: space-between;
gap: 12px;
}
/* Reduce the three small boxes by ~65% (58px -> ~20px) */
.sl5-box{
width: 20px;
height: 26px;
}
/* Resizable Spells Known box */
.sl5-knownarea{
width: 100%;
min-height: 28px;
border: 1px solid #777;
border-radius: 4px;
background: #fff;
padding: 4px 6px;
resize: vertical;
box-sizing: border-box;
font: inherit;
}
/* Resizable Spell Description box */
.sl5-descarea{
width: 100%;
min-height: 32px;
border: 1px solid #777;
border-radius: 4px;
background: #fff;
padding: 4px 6px;
resize: vertical;
box-sizing: border-box;
font: inherit;
}
/* Keep Spell Name line as underline but align nicely with textarea below */
.sl5-spellrow{
align-items: start;
}
/* sheet245: refine SL0 borders + field default heights + label sizing */
/* match normal thin borders for separator and spell entry box */
.sl5-sep{
border-top: 1px solid #777;
}
.sl5-spellbox{
border: 1px solid #777;
}
/* default (collapsed) heights before user expands */
.sl5-knownarea{
min-height: 25px;
height: 25px;
}
.sl5-descarea{
min-height: 20px;
height: 20px;
}
/* Spell Name / Spell Description label font size -2px */
.sl5-spelllabel{
font-size: 16px;
}
/* Adjust associated inputs to visually match the smaller labels */
.sl5-line{
height: 20px;
}
.sl5-line.short{
max-width: 210px;
}
/* sheet246: enforce max collapsed height for SL0 textareas */
.sl5-knownarea{
height: 20px;
min-height: 20px;
}
.sl5-descarea{
height: 20px;
min-height: 20px;
}
/* sheet248: allow user resize to change height (do NOT lock height with !important) */
.page-magic .sl5-card textarea.sl5-knownarea,
.page-magic .sl5-card textarea.sl5-descarea{
height: 20px; /* initial visible height */
min-padding: 0 4px !important;
line-height: 18px !important;
box-sizing: border-box !important;
resize: vertical !important;
}
/* sheet249: SL0 textareas start at 20px but remain user-resizable */
.page-magic .sl5-card textarea.sl5-knownarea,
.page-magic .sl5-card textarea.sl5-descarea{
height: 20px;
min-height: 20px;
resize: vertical;
overflow: auto;
box-sizing: border-box;
}
/* sheet251: SL0 card - Spells Known min-height +5px */
.page-magic .sl5-card textarea.sl5-knownarea{
min-height: 25px;
}
/* sheet251: match SL0 card min-width to Spellcasting Information card (magic-card) */
.page-magic .sl5-card{
min-width: 335px;
}
/* sheet251: prevent SL0 top-row small boxes from compressing under 25px */
.page-magic .sl5-box{
min-width: 25px;
}
/* sheet252: SL0 Spell Description height matches Spells Known */
.page-magic .sl5-card textarea.sl5-descarea{
min-height: 25px;
}
/* Match SL0 textarea initial height/resizing behavior inside Spell Info */
.page-magic .spellinfo-card textarea.sl5-descarea{
height: 20px;
min-height: 25px; /* match SL0 Spell Description min-height (sheet252) */
resize: vertical;
overflow: auto;
box-sizing: border-box;
}
/* sheet260: SL0 Spell Info repeating section (+Add) */
.page-magic .sl5-spellinfo-repeat-note{
margin-top: 6px;
margin-bottom: 6px;
font-size: 11px;
line-height: 1.2;
opacity: 0.9;
}
.page-magic .sl5-addhint{
font-weight: 700;
}
/* Slight separation between repeating Spell Info entries */
.page-magic .sl5-spellbox-repeat{
margin-top: 6px;
}
/* Spell Info minimum width for Spell Name and Casting Time */
.sl5-spellrow-name .sl5-line.short {
min-width: 60px;
}
/* =========================
Responsive containment fixes
Spell Level 0 + Spell Info
========================= */
/* Ensure all SL0 elements size within their containers */
.sl5-card, .sl5-card * {
box-sizing: border-box;
}
/* Prevent any child content from visually spilling out of the card */
.sl5-card {
overflow: hidden;
}
/* Allow top-row items to wrap inside the card instead of overflowing */
.sl5-toprow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: center;
}
/* Make each top item flexible and allow it to shrink within the card */
.sl5-topitem {
flex: 1 1 240px;
min-width: 0;
}
/* Keep the little number boxes from forcing overflow */
.sl5-topitem .sl5-box {
max-width: 100%;
}
/* Spells Known row: allow textarea to shrink/wrap within card */
.sl5-knownrow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: flex-start;
}
.sl5-knownlabel {
flex: 0 0 auto;
min-width: 0;
}
.sl5-knownarea {
flex: 1 1 260px;
min-width: 0;
max-width: 100%;
}
/* Spell Info rows: wrap on narrow screens, keep fields inside */
.sl5-spellrow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: center;
min-width: 0;
}
.sl5-spelllabel {
flex: 0 0 auto;
min-width: 0;
}
/* Inputs should be allowed to shrink instead of overflowing */
.sl5-spellrow input.sl5-line,
.sl5-spellrow textarea {
min-width: 0;
max-width: 100%;
}
/* Spell Name + Casting Time line: make inputs share space and wrap cleanly */
.sl5-spellrow-name input.sl5-line.short {
flex: 1 1 240px; /* grows, shrinks, wraps */
min-width: 60px; /* your requested minimum */
max-width: 100%;
}
/* Description textarea should always stay within the card */
.sl5-descarea {
flex: 1 1 100%;
min-width: 0;
max-width: 100%;
}
/* Repeat spell boxes should also clip/wrap properly */
.sl5-spellbox,
.sl5-spellbox-repeat {
max-width: 100%;
overflow: hidden;
}
/* Spell Info lock Name / Casting Time / Range on one row with proportional widths */
.sl5-spellrow-name {
display: flex;
flex-wrap: nowrap; /* stay on one row */
align-items: center;
}
.sl5-spellrow-name .sl5-line.name {
flex: 3 1 0; /* 50% wider */
min-width: 60px;
}
.sl5-spellrow-name .sl5-line.time,
.sl5-spellrow-name .sl5-line.range {
flex: 2 1 0;
min-width: 60px;
}
/* =========================
Spell Info containment (responsive)
Keeps content inside Spell Info card on narrow widths
========================= */
.sl5-card, .sl5-card * { box-sizing: border-box; }
.sl5-card,
.sl5-spellbox,
.sl5-spellbox-repeat {
max-width: 100%;
overflow: hidden; /* prevent spill outside card */
}
.sl5-spellrow,
.sl5-knownrow,
.sl5-toprow {
min-width: 0;
max-width: 100%;
}
.sl5-spellrow input,
.sl5-spellrow textarea,
.sl5-knownrow textarea,
.sl5-toprow input {
min-width: 0;
max-width: 100%;
}
/* Default: keep Name/Time/Range inputs on one row (your preferred layout) */
.sl5-spellrow-name { flex-wrap: nowrap; }
.sl5-spellrow-name .sl5-spelllabel { white-space: nowrap; }
/* Spell Info keep each label+field together as a unit */
.sl5-spellpair{
display:flex;
align-items:center;
gap: 6px;
white-space: nowrap; /* prevents label and its input from splitting lines */
min-width: 0;
}
/* Ensure inputs inside pairs can still shrink within the card */
.sl5-spellpair .sl5-line{
min-width: 60px; /* your minimum */
max-width: 100%;
}
/* Spell Info keep each label with its field, and preserve 3:2:2 width distribution */
.sl5-spellrow-name{
display:flex;
gap: 6px 10px;
align-items:center;
max-width:100%;
min-width:0;
}
/* Each label+input pair stays together */
.sl5-spellpair{
display:flex;
align-items:center;
gap:6px;
white-space:nowrap;
min-width:0;
}
/* Proportional widths (Spell Name 50% wider than Time/Range) */
.sl5-spellpair.pair-name{ flex:3 1 0; }
.sl5-spellpair.pair-time{ flex:2 1 0; }
.sl5-spellpair.pair-range{ flex:2 1 0; }
/* Inputs shrink inside their pair; keep your minimum */
.sl5-spellpair .sl5-line{
flex:1 1 0;
min-width:60px;
max-width:100%;
}
/* Spell Info final overrides for pair classes used in HTML */
.sl5-spellrow-name{ flex-wrap: wrap; }
.sl5-spellpair.namepair{ flex: 3 1 0; }
.sl5-spellpair.timepair{ flex: 2 1 0; }
.sl5-spellpair.rangepair{ flex: 2 1 0; }
/* Spell Info wrap by label+field pair (Casting Time & Range may drop, but never split from their label) */
.sl5-spellrow-name{
display:flex;
flex-wrap: wrap; /* allow pairs to wrap to lower rows */
align-items: center;
gap: 6px 10px;
min-width: 0;
}
.sl5-spellpair{
display:flex;
align-items:center;
gap: 6px;
white-space: nowrap; /* label and its field stay on same line */
min-width: 0;
max-width: 100%;
}
/* Proportional widths by PAIR so the whole unit wraps together */
.sl5-spellpair-name{ flex: 3 1 0; }
.sl5-spellpair-time{ flex: 2 1 0; }
.sl5-spellpair-range{ flex: 2 1 0; }
/* Inputs inside pairs can shrink but respect your minimum */
.sl5-spellpair .sl5-line{
min-width: 60px;
max-width: 100%;
}
/* FIX: actually allow Casting Time / Range PAIRS to wrap when narrow */
.sl5-spellrow-name{
flex-wrap: wrap !important;
}
/* Prevent pairs from shrinking to avoid suppressing wrapping */
.sl5-spellpair{
flex-shrink: 0;
}
/* FIX v2: enforce wrapping by giving each label+field pair a real minimum width.
This makes Casting Time / Range drop to a new row when the window is narrow,
while keeping each label attached to its field. */
.sl5-spellrow-name{
width: 100%;
max-width: 100%;
}
/* Minimum widths are set to the pair (label+field), not just the input,
so pairs stop compressing and instead wrap. */
.sl5-spellpair-name{ min-width: 320px; }
.sl5-spellpair-time{ min-width: 220px; }
.sl5-spellpair-range{ min-width: 200px; }
/* Keep 50% wider intent while still permitting wrap by pair */
.sl5-spellpair-name{ flex: 3 0 auto; }
.sl5-spellpair-time,
.sl5-spellpair-range{ flex: 2 0 auto; }
/* ===== Spell Info wrap fix (authoritative) =====
Problem: earlier rules target non-existent classes (sl0-spellpair-time/range),
and older grid/flex rules conflict. These rules are appended LAST and use
high specificity/!important so the Spell Info row actually wraps by pair. */
/* Ensure the Spell Name row is flex (not grid) and can wrap */
.sl5-spellbox .sl5-spellrow.sl5-spellrow-name{
display: flex !important;
flex-wrap: wrap !important;
align-items: center;
gap: 6px 10px;
width: 100%;
max-width: 100%;
min-width: 0;
}
/* Keep each label+field together */
.sl5-spellbox .sl5-spellrow.sl5-spellrow-name .sl5-spellpair{
display: inline-flex;
align-items: center;
gap: 6px;
white-space: nowrap;
flex-shrink: 0; /* don't compress forever; wrap instead */
min-width: 0;
max-width: 100%;
}
/* Inputs still respect your minimum and stay within the card */
.sl5-spellbox .sl5-spellrow.sl5-spellrow-name .sl5-spellpair .sl5-line{
min-width: 60px;
max-width: 100%;
}
/* ===== Collapsible Spell Level 6 Card (SL6) ===== */
.sl6-toggle{
position: absolute;
left: -9999px;
}
.sl6-toggle-btn{
display: inline-block;
border: 1px solid #333;
border-radius: 6px;
padding: 4px 8px;
font-size: 11px;
font-weight: bold;
cursor: pointer;
user-select: none;
margin: 0 0 6px 0;
background: #fff;
position: relative;
top: 1px;
padding-right: 22px;
}
.sl6-toggle-btn::after{
content: "◀";
position: absolute;
right: 28px;
top: 50%;
transform: translateY(-50%);
color: #000;
font-size: 12px;
line-height: 1;
}
.sl6-toggle:checked + .sl6-toggle-btn::after{
content: "▼";
color: #000;
}
.sl6-toggle-btn:hover{
filter: brightness(1.05);
}
.sl6-toggle:not(:checked) + .sl6-toggle-btn + .sl6-body{
display: none;
}
/* ===== SL6 structural style mirror (from SL0) ===== */
/* sheet243: Spell Level 0 (SL0) card (Arial only) */
.sl6-card{
position: relative;
border: 2px solid #000;
border-radius: 4px;
padding: 20px 14px 12px 14px;
box-sizing: border-box;
}
.sl6-title{
position: absolute;
top: -11px;
left: 10px;
background: #fff;
padding: 2px 10px;
border: 2px solid #000;
border-radius: 4px;
font-weight: 700;
font-size: 16px;
}
.sl6-toprow{
display: flex;
flex-wrap: wrap;
gap: 22px;
align-items: center;
margin-bottom: 12px;
}
.sl6-topitem{
font-weight: 700;
font-size: 18px;
display: flex;
align-items: center;
gap: 10px;
white-space: nowrap;
}
.sl6-box{
width: 58px;
height: 30px;
border: 2px solid #000;
background: #f2f2f2;
box-sizing: border-box;
}
.sl6-knownrow{
display: grid;
grid-template-columns: auto 1fr;
gap: 12px;
align-items: center;
margin-bottom: 10px;
}
.sl6-knownlabel{
font-weight: 700;
font-size: 16px;
white-space: nowrap;
}
.sl6-knownline{
width: 100%;
border: none;
border-bottom: 2px solid #000;
background: transparent;
height: 22px;
padding: 0 4px;
box-sizing: border-box;
}
.sl6-sep{
border-top: 2px solid #000;
margin: 8px 0 14px 0;
}
.sl6-spellbox{
border: 2px solid #000;
border-radius: 4px;
padding: 10px 10px 6px 10px;
box-sizing: border-box;
}
.sl6-spellrow{
display: grid;
grid-template-columns: auto 1fr;
gap: 10px;
align-items: center;
margin-bottom: 8px;
}
/* Spell Info: Spell Name row adds Casting Time on the same line */
.sl6-spellrow.sl6-spellrow-name{
grid-template-columns: auto 1fr auto 1fr;
}
.sl6-spelllabel{
font-weight: 700;
font-size: 18px;
white-space: nowrap;
}
.sl6-line{
width: 100%;
border: none;
border-bottom: 2px solid #000;
background: transparent;
height: 22px;
padding: 0 4px;
box-sizing: border-box;
}
.sl6-line.short{
max-width: 240px;
}
/* sheet244: SL0 card border thickness + layout fixes */
.sl6-card{
border: 1px solid #777; /* match other cards */
border-radius: 8px;
padding: 10px;
margin-top: 10px;
box-sizing: border-box;
position: static;
}
/* Remove the prior floating title styling if still present */
.sl6-title{ display: none; }
/* Force top row to stay on one line */
.sl6-toprow{
flex-wrap: nowrap;
justify-content: space-between;
gap: 12px;
}
/* Reduce the three small boxes by ~65% (58px -> ~20px) */
.sl6-box{
width: 20px;
height: 26px;
}
/* Resizable Spells Known box */
.sl6-knownarea{
width: 100%;
min-height: 28px;
border: 1px solid #777;
border-radius: 4px;
background: #fff;
padding: 4px 6px;
resize: vertical;
box-sizing: border-box;
font: inherit;
}
/* Resizable Spell Description box */
.sl6-descarea{
width: 100%;
min-height: 32px;
border: 1px solid #777;
border-radius: 4px;
background: #fff;
padding: 4px 6px;
resize: vertical;
box-sizing: border-box;
font: inherit;
}
/* Keep Spell Name line as underline but align nicely with textarea below */
.sl6-spellrow{
align-items: start;
}
/* sheet245: refine SL0 borders + field default heights + label sizing */
/* match normal thin borders for separator and spell entry box */
.sl6-sep{
border-top: 1px solid #777;
}
.sl6-spellbox{
border: 1px solid #777;
}
/* default (collapsed) heights before user expands */
.sl6-knownarea{
min-height: 25px;
height: 25px;
}
.sl6-descarea{
min-height: 20px;
height: 20px;
}
/* Spell Name / Spell Description label font size -2px */
.sl6-spelllabel{
font-size: 16px;
}
/* Adjust associated inputs to visually match the smaller labels */
.sl6-line{
height: 20px;
}
.sl6-line.short{
max-width: 210px;
}
/* sheet246: enforce max collapsed height for SL0 textareas */
.sl6-knownarea{
height: 20px;
min-height: 20px;
}
.sl6-descarea{
height: 20px;
min-height: 20px;
}
/* sheet248: allow user resize to change height (do NOT lock height with !important) */
.page-magic .sl6-card textarea.sl6-knownarea,
.page-magic .sl6-card textarea.sl6-descarea{
height: 20px; /* initial visible height */
min-padding: 0 4px !important;
line-height: 18px !important;
box-sizing: border-box !important;
resize: vertical !important;
}
/* sheet249: SL0 textareas start at 20px but remain user-resizable */
.page-magic .sl6-card textarea.sl6-knownarea,
.page-magic .sl6-card textarea.sl6-descarea{
height: 20px;
min-height: 20px;
resize: vertical;
overflow: auto;
box-sizing: border-box;
}
/* sheet251: SL0 card - Spells Known min-height +5px */
.page-magic .sl6-card textarea.sl6-knownarea{
min-height: 25px;
}
/* sheet251: match SL0 card min-width to Spellcasting Information card (magic-card) */
.page-magic .sl6-card{
min-width: 335px;
}
/* sheet251: prevent SL0 top-row small boxes from compressing under 25px */
.page-magic .sl6-box{
min-width: 25px;
}
/* sheet252: SL0 Spell Description height matches Spells Known */
.page-magic .sl6-card textarea.sl6-descarea{
min-height: 25px;
}
/* Match SL0 textarea initial height/resizing behavior inside Spell Info */
.page-magic .spellinfo-card textarea.sl6-descarea{
height: 20px;
min-height: 25px; /* match SL0 Spell Description min-height (sheet252) */
resize: vertical;
overflow: auto;
box-sizing: border-box;
}
/* sheet260: SL0 Spell Info repeating section (+Add) */
.page-magic .sl6-spellinfo-repeat-note{
margin-top: 6px;
margin-bottom: 6px;
font-size: 11px;
line-height: 1.2;
opacity: 0.9;
}
.page-magic .sl6-addhint{
font-weight: 700;
}
/* Slight separation between repeating Spell Info entries */
.page-magic .sl6-spellbox-repeat{
margin-top: 6px;
}
/* Spell Info minimum width for Spell Name and Casting Time */
.sl6-spellrow-name .sl6-line.short {
min-width: 60px;
}
/* =========================
Responsive containment fixes
Spell Level 0 + Spell Info
========================= */
/* Ensure all SL0 elements size within their containers */
.sl6-card, .sl6-card * {
box-sizing: border-box;
}
/* Prevent any child content from visually spilling out of the card */
.sl6-card {
overflow: hidden;
}
/* Allow top-row items to wrap inside the card instead of overflowing */
.sl6-toprow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: center;
}
/* Make each top item flexible and allow it to shrink within the card */
.sl6-topitem {
flex: 1 1 240px;
min-width: 0;
}
/* Keep the little number boxes from forcing overflow */
.sl6-topitem .sl6-box {
max-width: 100%;
}
/* Spells Known row: allow textarea to shrink/wrap within card */
.sl6-knownrow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: flex-start;
}
.sl6-knownlabel {
flex: 0 0 auto;
min-width: 0;
}
.sl6-knownarea {
flex: 1 1 260px;
min-width: 0;
max-width: 100%;
}
/* Spell Info rows: wrap on narrow screens, keep fields inside */
.sl6-spellrow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: center;
min-width: 0;
}
.sl6-spelllabel {
flex: 0 0 auto;
min-width: 0;
}
/* Inputs should be allowed to shrink instead of overflowing */
.sl6-spellrow input.sl6-line,
.sl6-spellrow textarea {
min-width: 0;
max-width: 100%;
}
/* Spell Name + Casting Time line: make inputs share space and wrap cleanly */
.sl6-spellrow-name input.sl6-line.short {
flex: 1 1 240px; /* grows, shrinks, wraps */
min-width: 60px; /* your requested minimum */
max-width: 100%;
}
/* Description textarea should always stay within the card */
.sl6-descarea {
flex: 1 1 100%;
min-width: 0;
max-width: 100%;
}
/* Repeat spell boxes should also clip/wrap properly */
.sl6-spellbox,
.sl6-spellbox-repeat {
max-width: 100%;
overflow: hidden;
}
/* Spell Info lock Name / Casting Time / Range on one row with proportional widths */
.sl6-spellrow-name {
display: flex;
flex-wrap: nowrap; /* stay on one row */
align-items: center;
}
.sl6-spellrow-name .sl6-line.name {
flex: 3 1 0; /* 50% wider */
min-width: 60px;
}
.sl6-spellrow-name .sl6-line.time,
.sl6-spellrow-name .sl6-line.range {
flex: 2 1 0;
min-width: 60px;
}
/* =========================
Spell Info containment (responsive)
Keeps content inside Spell Info card on narrow widths
========================= */
.sl6-card, .sl6-card * { box-sizing: border-box; }
.sl6-card,
.sl6-spellbox,
.sl6-spellbox-repeat {
max-width: 100%;
overflow: hidden; /* prevent spill outside card */
}
.sl6-spellrow,
.sl6-knownrow,
.sl6-toprow {
min-width: 0;
max-width: 100%;
}
.sl6-spellrow input,
.sl6-spellrow textarea,
.sl6-knownrow textarea,
.sl6-toprow input {
min-width: 0;
max-width: 100%;
}
/* Default: keep Name/Time/Range inputs on one row (your preferred layout) */
.sl6-spellrow-name { flex-wrap: nowrap; }
.sl6-spellrow-name .sl6-spelllabel { white-space: nowrap; }
/* Spell Info keep each label+field together as a unit */
.sl6-spellpair{
display:flex;
align-items:center;
gap: 6px;
white-space: nowrap; /* prevents label and its input from splitting lines */
min-width: 0;
}
/* Ensure inputs inside pairs can still shrink within the card */
.sl6-spellpair .sl6-line{
min-width: 60px; /* your minimum */
max-width: 100%;
}
/* Spell Info keep each label with its field, and preserve 3:2:2 width distribution */
.sl6-spellrow-name{
display:flex;
gap: 6px 10px;
align-items:center;
max-width:100%;
min-width:0;
}
/* Each label+input pair stays together */
.sl6-spellpair{
display:flex;
align-items:center;
gap:6px;
white-space:nowrap;
min-width:0;
}
/* Proportional widths (Spell Name 50% wider than Time/Range) */
.sl6-spellpair.pair-name{ flex:3 1 0; }
.sl6-spellpair.pair-time{ flex:2 1 0; }
.sl6-spellpair.pair-range{ flex:2 1 0; }
/* Inputs shrink inside their pair; keep your minimum */
.sl6-spellpair .sl6-line{
flex:1 1 0;
min-width:60px;
max-width:100%;
}
/* Spell Info final overrides for pair classes used in HTML */
.sl6-spellrow-name{ flex-wrap: wrap; }
.sl6-spellpair.namepair{ flex: 3 1 0; }
.sl6-spellpair.timepair{ flex: 2 1 0; }
.sl6-spellpair.rangepair{ flex: 2 1 0; }
/* Spell Info wrap by label+field pair (Casting Time & Range may drop, but never split from their label) */
.sl6-spellrow-name{
display:flex;
flex-wrap: wrap; /* allow pairs to wrap to lower rows */
align-items: center;
gap: 6px 10px;
min-width: 0;
}
.sl6-spellpair{
display:flex;
align-items:center;
gap: 6px;
white-space: nowrap; /* label and its field stay on same line */
min-width: 0;
max-width: 100%;
}
/* Proportional widths by PAIR so the whole unit wraps together */
.sl6-spellpair-name{ flex: 3 1 0; }
.sl6-spellpair-time{ flex: 2 1 0; }
.sl6-spellpair-range{ flex: 2 1 0; }
/* Inputs inside pairs can shrink but respect your minimum */
.sl6-spellpair .sl6-line{
min-width: 60px;
max-width: 100%;
}
/* FIX: actually allow Casting Time / Range PAIRS to wrap when narrow */
.sl6-spellrow-name{
flex-wrap: wrap !important;
}
/* Prevent pairs from shrinking to avoid suppressing wrapping */
.sl6-spellpair{
flex-shrink: 0;
}
/* FIX v2: enforce wrapping by giving each label+field pair a real minimum width.
This makes Casting Time / Range drop to a new row when the window is narrow,
while keeping each label attached to its field. */
.sl6-spellrow-name{
width: 100%;
max-width: 100%;
}
/* Minimum widths are set to the pair (label+field), not just the input,
so pairs stop compressing and instead wrap. */
.sl6-spellpair-name{ min-width: 320px; }
.sl6-spellpair-time{ min-width: 220px; }
.sl6-spellpair-range{ min-width: 200px; }
/* Keep 50% wider intent while still permitting wrap by pair */
.sl6-spellpair-name{ flex: 3 0 auto; }
.sl6-spellpair-time,
.sl6-spellpair-range{ flex: 2 0 auto; }
/* ===== Spell Info wrap fix (authoritative) =====
Problem: earlier rules target non-existent classes (sl0-spellpair-time/range),
and older grid/flex rules conflict. These rules are appended LAST and use
high specificity/!important so the Spell Info row actually wraps by pair. */
/* Ensure the Spell Name row is flex (not grid) and can wrap */
.sl6-spellbox .sl6-spellrow.sl6-spellrow-name{
display: flex !important;
flex-wrap: wrap !important;
align-items: center;
gap: 6px 10px;
width: 100%;
max-width: 100%;
min-width: 0;
}
/* Keep each label+field together */
.sl6-spellbox .sl6-spellrow.sl6-spellrow-name .sl6-spellpair{
display: inline-flex;
align-items: center;
gap: 6px;
white-space: nowrap;
flex-shrink: 0; /* don't compress forever; wrap instead */
min-width: 0;
max-width: 100%;
}
/* Inputs still respect your minimum and stay within the card */
.sl6-spellbox .sl6-spellrow.sl6-spellrow-name .sl6-spellpair .sl6-line{
min-width: 60px;
max-width: 100%;
}
/* ===== Collapsible Spell Level 7 Card (SL7) ===== */
.sl7-toggle{
position: absolute;
left: -9999px;
}
.sl7-toggle-btn{
display: inline-block;
border: 1px solid #333;
border-radius: 6px;
padding: 4px 8px;
font-size: 11px;
font-weight: bold;
cursor: pointer;
user-select: none;
margin: 0 0 6px 0;
background: #fff;
position: relative;
top: 1px;
padding-right: 22px;
}
.sl7-toggle-btn::after{
content: "◀";
position: absolute;
right: 28px;
top: 50%;
transform: translateY(-50%);
color: #000;
font-size: 12px;
line-height: 1;
}
.sl7-toggle:checked + .sl7-toggle-btn::after{
content: "▼";
color: #000;
}
.sl7-toggle-btn:hover{
filter: brightness(1.05);
}
.sl7-toggle:not(:checked) + .sl7-toggle-btn + .sl7-body{
display: none;
}
/* ===== SL7 structural style mirror (from SL0) ===== */
/* sheet243: Spell Level 0 (SL0) card (Arial only) */
.sl7-card{
position: relative;
border: 2px solid #000;
border-radius: 4px;
padding: 20px 14px 12px 14px;
box-sizing: border-box;
}
.sl7-title{
position: absolute;
top: -11px;
left: 10px;
background: #fff;
padding: 2px 10px;
border: 2px solid #000;
border-radius: 4px;
font-weight: 700;
font-size: 16px;
}
.sl7-toprow{
display: flex;
flex-wrap: wrap;
gap: 22px;
align-items: center;
margin-bottom: 12px;
}
.sl7-topitem{
font-weight: 700;
font-size: 18px;
display: flex;
align-items: center;
gap: 10px;
white-space: nowrap;
}
.sl7-box{
width: 58px;
height: 30px;
border: 2px solid #000;
background: #f2f2f2;
box-sizing: border-box;
}
.sl7-knownrow{
display: grid;
grid-template-columns: auto 1fr;
gap: 12px;
align-items: center;
margin-bottom: 10px;
}
.sl7-knownlabel{
font-weight: 700;
font-size: 16px;
white-space: nowrap;
}
.sl7-knownline{
width: 100%;
border: none;
border-bottom: 2px solid #000;
background: transparent;
height: 22px;
padding: 0 4px;
box-sizing: border-box;
}
.sl7-sep{
border-top: 2px solid #000;
margin: 8px 0 14px 0;
}
.sl7-spellbox{
border: 2px solid #000;
border-radius: 4px;
padding: 10px 10px 6px 10px;
box-sizing: border-box;
}
.sl7-spellrow{
display: grid;
grid-template-columns: auto 1fr;
gap: 10px;
align-items: center;
margin-bottom: 8px;
}
/* Spell Info: Spell Name row adds Casting Time on the same line */
.sl7-spellrow.sl7-spellrow-name{
grid-template-columns: auto 1fr auto 1fr;
}
.sl7-spelllabel{
font-weight: 700;
font-size: 18px;
white-space: nowrap;
}
.sl7-line{
width: 100%;
border: none;
border-bottom: 2px solid #000;
background: transparent;
height: 22px;
padding: 0 4px;
box-sizing: border-box;
}
.sl7-line.short{
max-width: 240px;
}
/* sheet244: SL0 card border thickness + layout fixes */
.sl7-card{
border: 1px solid #777; /* match other cards */
border-radius: 8px;
padding: 10px;
margin-top: 10px;
box-sizing: border-box;
position: static;
}
/* Remove the prior floating title styling if still present */
.sl7-title{ display: none; }
/* Force top row to stay on one line */
.sl7-toprow{
flex-wrap: nowrap;
justify-content: space-between;
gap: 12px;
}
/* Reduce the three small boxes by ~65% (58px -> ~20px) */
.sl7-box{
width: 20px;
height: 26px;
}
/* Resizable Spells Known box */
.sl7-knownarea{
width: 100%;
min-height: 28px;
border: 1px solid #777;
border-radius: 4px;
background: #fff;
padding: 4px 6px;
resize: vertical;
box-sizing: border-box;
font: inherit;
}
/* Resizable Spell Description box */
.sl7-descarea{
width: 100%;
min-height: 32px;
border: 1px solid #777;
border-radius: 4px;
background: #fff;
padding: 4px 6px;
resize: vertical;
box-sizing: border-box;
font: inherit;
}
/* Keep Spell Name line as underline but align nicely with textarea below */
.sl7-spellrow{
align-items: start;
}
/* sheet245: refine SL0 borders + field default heights + label sizing */
/* match normal thin borders for separator and spell entry box */
.sl7-sep{
border-top: 1px solid #777;
}
.sl7-spellbox{
border: 1px solid #777;
}
/* default (collapsed) heights before user expands */
.sl7-knownarea{
min-height: 25px;
height: 25px;
}
.sl7-descarea{
min-height: 20px;
height: 20px;
}
/* Spell Name / Spell Description label font size -2px */
.sl7-spelllabel{
font-size: 16px;
}
/* Adjust associated inputs to visually match the smaller labels */
.sl7-line{
height: 20px;
}
.sl7-line.short{
max-width: 210px;
}
/* sheet246: enforce max collapsed height for SL0 textareas */
.sl7-knownarea{
height: 20px;
min-height: 20px;
}
.sl7-descarea{
height: 20px;
min-height: 20px;
}
/* sheet248: allow user resize to change height (do NOT lock height with !important) */
.page-magic .sl7-card textarea.sl7-knownarea,
.page-magic .sl7-card textarea.sl7-descarea{
height: 20px; /* initial visible height */
min-padding: 0 4px !important;
line-height: 18px !important;
box-sizing: border-box !important;
resize: vertical !important;
}
/* sheet249: SL0 textareas start at 20px but remain user-resizable */
.page-magic .sl7-card textarea.sl7-knownarea,
.page-magic .sl7-card textarea.sl7-descarea{
height: 20px;
min-height: 20px;
resize: vertical;
overflow: auto;
box-sizing: border-box;
}
/* sheet251: SL0 card - Spells Known min-height +5px */
.page-magic .sl7-card textarea.sl7-knownarea{
min-height: 25px;
}
/* sheet251: match SL0 card min-width to Spellcasting Information card (magic-card) */
.page-magic .sl7-card{
min-width: 335px;
}
/* sheet251: prevent SL0 top-row small boxes from compressing under 25px */
.page-magic .sl7-box{
min-width: 25px;
}
/* sheet252: SL0 Spell Description height matches Spells Known */
.page-magic .sl7-card textarea.sl7-descarea{
min-height: 25px;
}
/* Match SL0 textarea initial height/resizing behavior inside Spell Info */
.page-magic .spellinfo-card textarea.sl7-descarea{
height: 20px;
min-height: 25px; /* match SL0 Spell Description min-height (sheet252) */
resize: vertical;
overflow: auto;
box-sizing: border-box;
}
/* sheet260: SL0 Spell Info repeating section (+Add) */
.page-magic .sl7-spellinfo-repeat-note{
margin-top: 6px;
margin-bottom: 6px;
font-size: 11px;
line-height: 1.2;
opacity: 0.9;
}
.page-magic .sl7-addhint{
font-weight: 700;
}
/* Slight separation between repeating Spell Info entries */
.page-magic .sl7-spellbox-repeat{
margin-top: 6px;
}
/* Spell Info minimum width for Spell Name and Casting Time */
.sl7-spellrow-name .sl7-line.short {
min-width: 60px;
}
/* =========================
Responsive containment fixes
Spell Level 0 + Spell Info
========================= */
/* Ensure all SL0 elements size within their containers */
.sl7-card, .sl7-card * {
box-sizing: border-box;
}
/* Prevent any child content from visually spilling out of the card */
.sl7-card {
overflow: hidden;
}
/* Allow top-row items to wrap inside the card instead of overflowing */
.sl7-toprow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: center;
}
/* Make each top item flexible and allow it to shrink within the card */
.sl7-topitem {
flex: 1 1 240px;
min-width: 0;
}
/* Keep the little number boxes from forcing overflow */
.sl7-topitem .sl7-box {
max-width: 100%;
}
/* Spells Known row: allow textarea to shrink/wrap within card */
.sl7-knownrow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: flex-start;
}
.sl7-knownlabel {
flex: 0 0 auto;
min-width: 0;
}
.sl7-knownarea {
flex: 1 1 260px;
min-width: 0;
max-width: 100%;
}
/* Spell Info rows: wrap on narrow screens, keep fields inside */
.sl7-spellrow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: center;
min-width: 0;
}
.sl7-spelllabel {
flex: 0 0 auto;
min-width: 0;
}
/* Inputs should be allowed to shrink instead of overflowing */
.sl7-spellrow input.sl7-line,
.sl7-spellrow textarea {
min-width: 0;
max-width: 100%;
}
/* Spell Name + Casting Time line: make inputs share space and wrap cleanly */
.sl7-spellrow-name input.sl7-line.short {
flex: 1 1 240px; /* grows, shrinks, wraps */
min-width: 60px; /* your requested minimum */
max-width: 100%;
}
/* Description textarea should always stay within the card */
.sl7-descarea {
flex: 1 1 100%;
min-width: 0;
max-width: 100%;
}
/* Repeat spell boxes should also clip/wrap properly */
.sl7-spellbox,
.sl7-spellbox-repeat {
max-width: 100%;
overflow: hidden;
}
/* Spell Info lock Name / Casting Time / Range on one row with proportional widths */
.sl7-spellrow-name {
display: flex;
flex-wrap: nowrap; /* stay on one row */
align-items: center;
}
.sl7-spellrow-name .sl7-line.name {
flex: 3 1 0; /* 50% wider */
min-width: 60px;
}
.sl7-spellrow-name .sl7-line.time,
.sl7-spellrow-name .sl7-line.range {
flex: 2 1 0;
min-width: 60px;
}
/* =========================
Spell Info containment (responsive)
Keeps content inside Spell Info card on narrow widths
========================= */
.sl7-card, .sl7-card * { box-sizing: border-box; }
.sl7-card,
.sl7-spellbox,
.sl7-spellbox-repeat {
max-width: 100%;
overflow: hidden; /* prevent spill outside card */
}
.sl7-spellrow,
.sl7-knownrow,
.sl7-toprow {
min-width: 0;
max-width: 100%;
}
.sl7-spellrow input,
.sl7-spellrow textarea,
.sl7-knownrow textarea,
.sl7-toprow input {
min-width: 0;
max-width: 100%;
}
/* Default: keep Name/Time/Range inputs on one row (your preferred layout) */
.sl7-spellrow-name { flex-wrap: nowrap; }
.sl7-spellrow-name .sl7-spelllabel { white-space: nowrap; }
/* Spell Info keep each label+field together as a unit */
.sl7-spellpair{
display:flex;
align-items:center;
gap: 6px;
white-space: nowrap; /* prevents label and its input from splitting lines */
min-width: 0;
}
/* Ensure inputs inside pairs can still shrink within the card */
.sl7-spellpair .sl7-line{
min-width: 60px; /* your minimum */
max-width: 100%;
}
/* Spell Info keep each label with its field, and preserve 3:2:2 width distribution */
.sl7-spellrow-name{
display:flex;
gap: 6px 10px;
align-items:center;
max-width:100%;
min-width:0;
}
/* Each label+input pair stays together */
.sl7-spellpair{
display:flex;
align-items:center;
gap:6px;
white-space:nowrap;
min-width:0;
}
/* Proportional widths (Spell Name 50% wider than Time/Range) */
.sl7-spellpair.pair-name{ flex:3 1 0; }
.sl7-spellpair.pair-time{ flex:2 1 0; }
.sl7-spellpair.pair-range{ flex:2 1 0; }
/* Inputs shrink inside their pair; keep your minimum */
.sl7-spellpair .sl7-line{
flex:1 1 0;
min-width:60px;
max-width:100%;
}
/* Spell Info final overrides for pair classes used in HTML */
.sl7-spellrow-name{ flex-wrap: wrap; }
.sl7-spellpair.namepair{ flex: 3 1 0; }
.sl7-spellpair.timepair{ flex: 2 1 0; }
.sl7-spellpair.rangepair{ flex: 2 1 0; }
/* Spell Info wrap by label+field pair (Casting Time & Range may drop, but never split from their label) */
.sl7-spellrow-name{
display:flex;
flex-wrap: wrap; /* allow pairs to wrap to lower rows */
align-items: center;
gap: 6px 10px;
min-width: 0;
}
.sl7-spellpair{
display:flex;
align-items:center;
gap: 6px;
white-space: nowrap; /* label and its field stay on same line */
min-width: 0;
max-width: 100%;
}
/* Proportional widths by PAIR so the whole unit wraps together */
.sl7-spellpair-name{ flex: 3 1 0; }
.sl7-spellpair-time{ flex: 2 1 0; }
.sl7-spellpair-range{ flex: 2 1 0; }
/* Inputs inside pairs can shrink but respect your minimum */
.sl7-spellpair .sl7-line{
min-width: 60px;
max-width: 100%;
}
/* FIX: actually allow Casting Time / Range PAIRS to wrap when narrow */
.sl7-spellrow-name{
flex-wrap: wrap !important;
}
/* Prevent pairs from shrinking to avoid suppressing wrapping */
.sl7-spellpair{
flex-shrink: 0;
}
/* FIX v2: enforce wrapping by giving each label+field pair a real minimum width.
This makes Casting Time / Range drop to a new row when the window is narrow,
while keeping each label attached to its field. */
.sl7-spellrow-name{
width: 100%;
max-width: 100%;
}
/* Minimum widths are set to the pair (label+field), not just the input,
so pairs stop compressing and instead wrap. */
.sl7-spellpair-name{ min-width: 320px; }
.sl7-spellpair-time{ min-width: 220px; }
.sl7-spellpair-range{ min-width: 200px; }
/* Keep 50% wider intent while still permitting wrap by pair */
.sl7-spellpair-name{ flex: 3 0 auto; }
.sl7-spellpair-time,
.sl7-spellpair-range{ flex: 2 0 auto; }
/* ===== Spell Info wrap fix (authoritative) =====
Problem: earlier rules target non-existent classes (sl0-spellpair-time/range),
and older grid/flex rules conflict. These rules are appended LAST and use
high specificity/!important so the Spell Info row actually wraps by pair. */
/* Ensure the Spell Name row is flex (not grid) and can wrap */
.sl7-spellbox .sl7-spellrow.sl7-spellrow-name{
display: flex !important;
flex-wrap: wrap !important;
align-items: center;
gap: 6px 10px;
width: 100%;
max-width: 100%;
min-width: 0;
}
/* Keep each label+field together */
.sl7-spellbox .sl7-spellrow.sl7-spellrow-name .sl7-spellpair{
display: inline-flex;
align-items: center;
gap: 6px;
white-space: nowrap;
flex-shrink: 0; /* don't compress forever; wrap instead */
min-width: 0;
max-width: 100%;
}
/* Inputs still respect your minimum and stay within the card */
.sl7-spellbox .sl7-spellrow.sl7-spellrow-name .sl7-spellpair .sl7-line{
min-width: 60px;
max-width: 100%;
}
/* ===== Collapsible Spell Level 8 Card (SL8) ===== */
.sl8-toggle{
position: absolute;
left: -9999px;
}
.sl8-toggle-btn{
display: inline-block;
border: 1px solid #333;
border-radius: 6px;
padding: 4px 8px;
font-size: 11px;
font-weight: bold;
cursor: pointer;
user-select: none;
margin: 0 0 6px 0;
background: #fff;
position: relative;
top: 1px;
padding-right: 22px;
}
.sl8-toggle-btn::after{
content: "◀";
position: absolute;
right: 28px;
top: 50%;
transform: translateY(-50%);
color: #000;
font-size: 12px;
line-height: 1;
}
.sl8-toggle:checked + .sl8-toggle-btn::after{
content: "▼";
color: #000;
}
.sl8-toggle-btn:hover{
filter: brightness(1.05);
}
.sl8-toggle:not(:checked) + .sl8-toggle-btn + .sl8-body{
display: none;
}
/* ===== SL8 structural style mirror (from SL0) ===== */
/* sheet243: Spell Level 0 (SL0) card (Arial only) */
.sl8-card{
position: relative;
border: 2px solid #000;
border-radius: 4px;
padding: 20px 14px 12px 14px;
box-sizing: border-box;
}
.sl8-title{
position: absolute;
top: -11px;
left: 10px;
background: #fff;
padding: 2px 10px;
border: 2px solid #000;
border-radius: 4px;
font-weight: 700;
font-size: 16px;
}
.sl8-toprow{
display: flex;
flex-wrap: wrap;
gap: 22px;
align-items: center;
margin-bottom: 12px;
}
.sl8-topitem{
font-weight: 700;
font-size: 18px;
display: flex;
align-items: center;
gap: 10px;
white-space: nowrap;
}
.sl8-box{
width: 58px;
height: 30px;
border: 2px solid #000;
background: #f2f2f2;
box-sizing: border-box;
}
.sl8-knownrow{
display: grid;
grid-template-columns: auto 1fr;
gap: 12px;
align-items: center;
margin-bottom: 10px;
}
.sl8-knownlabel{
font-weight: 700;
font-size: 16px;
white-space: nowrap;
}
.sl8-knownline{
width: 100%;
border: none;
border-bottom: 2px solid #000;
background: transparent;
height: 22px;
padding: 0 4px;
box-sizing: border-box;
}
.sl8-sep{
border-top: 2px solid #000;
margin: 8px 0 14px 0;
}
.sl8-spellbox{
border: 2px solid #000;
border-radius: 4px;
padding: 10px 10px 6px 10px;
box-sizing: border-box;
}
.sl8-spellrow{
display: grid;
grid-template-columns: auto 1fr;
gap: 10px;
align-items: center;
margin-bottom: 8px;
}
/* Spell Info: Spell Name row adds Casting Time on the same line */
.sl8-spellrow.sl8-spellrow-name{
grid-template-columns: auto 1fr auto 1fr;
}
.sl8-spelllabel{
font-weight: 700;
font-size: 18px;
white-space: nowrap;
}
.sl8-line{
width: 100%;
border: none;
border-bottom: 2px solid #000;
background: transparent;
height: 22px;
padding: 0 4px;
box-sizing: border-box;
}
.sl8-line.short{
max-width: 240px;
}
/* sheet244: SL0 card border thickness + layout fixes */
.sl8-card{
border: 1px solid #777; /* match other cards */
border-radius: 8px;
padding: 10px;
margin-top: 10px;
box-sizing: border-box;
position: static;
}
/* Remove the prior floating title styling if still present */
.sl8-title{ display: none; }
/* Force top row to stay on one line */
.sl8-toprow{
flex-wrap: nowrap;
justify-content: space-between;
gap: 12px;
}
/* Reduce the three small boxes by ~65% (58px -> ~20px) */
.sl8-box{
width: 20px;
height: 26px;
}
/* Resizable Spells Known box */
.sl8-knownarea{
width: 100%;
min-height: 28px;
border: 1px solid #777;
border-radius: 4px;
background: #fff;
padding: 4px 6px;
resize: vertical;
box-sizing: border-box;
font: inherit;
}
/* Resizable Spell Description box */
.sl8-descarea{
width: 100%;
min-height: 32px;
border: 1px solid #777;
border-radius: 4px;
background: #fff;
padding: 4px 6px;
resize: vertical;
box-sizing: border-box;
font: inherit;
}
/* Keep Spell Name line as underline but align nicely with textarea below */
.sl8-spellrow{
align-items: start;
}
/* sheet245: refine SL0 borders + field default heights + label sizing */
/* match normal thin borders for separator and spell entry box */
.sl8-sep{
border-top: 1px solid #777;
}
.sl8-spellbox{
border: 1px solid #777;
}
/* default (collapsed) heights before user expands */
.sl8-knownarea{
min-height: 25px;
height: 25px;
}
.sl8-descarea{
min-height: 20px;
height: 20px;
}
/* Spell Name / Spell Description label font size -2px */
.sl8-spelllabel{
font-size: 16px;
}
/* Adjust associated inputs to visually match the smaller labels */
.sl8-line{
height: 20px;
}
.sl8-line.short{
max-width: 210px;
}
/* sheet246: enforce max collapsed height for SL0 textareas */
.sl8-knownarea{
height: 20px;
min-height: 20px;
}
.sl8-descarea{
height: 20px;
min-height: 20px;
}
/* sheet248: allow user resize to change height (do NOT lock height with !important) */
.page-magic .sl8-card textarea.sl8-knownarea,
.page-magic .sl8-card textarea.sl8-descarea{
height: 20px; /* initial visible height */
min-padding: 0 4px !important;
line-height: 18px !important;
box-sizing: border-box !important;
resize: vertical !important;
}
/* sheet249: SL0 textareas start at 20px but remain user-resizable */
.page-magic .sl8-card textarea.sl8-knownarea,
.page-magic .sl8-card textarea.sl8-descarea{
height: 20px;
min-height: 20px;
resize: vertical;
overflow: auto;
box-sizing: border-box;
}
/* sheet251: SL0 card - Spells Known min-height +5px */
.page-magic .sl8-card textarea.sl8-knownarea{
min-height: 25px;
}
/* sheet251: match SL0 card min-width to Spellcasting Information card (magic-card) */
.page-magic .sl8-card{
min-width: 335px;
}
/* sheet251: prevent SL0 top-row small boxes from compressing under 25px */
.page-magic .sl8-box{
min-width: 25px;
}
/* sheet252: SL0 Spell Description height matches Spells Known */
.page-magic .sl8-card textarea.sl8-descarea{
min-height: 25px;
}
/* Match SL0 textarea initial height/resizing behavior inside Spell Info */
.page-magic .spellinfo-card textarea.sl8-descarea{
height: 20px;
min-height: 25px; /* match SL0 Spell Description min-height (sheet252) */
resize: vertical;
overflow: auto;
box-sizing: border-box;
}
/* sheet260: SL0 Spell Info repeating section (+Add) */
.page-magic .sl8-spellinfo-repeat-note{
margin-top: 6px;
margin-bottom: 6px;
font-size: 11px;
line-height: 1.2;
opacity: 0.9;
}
.page-magic .sl8-addhint{
font-weight: 700;
}
/* Slight separation between repeating Spell Info entries */
.page-magic .sl8-spellbox-repeat{
margin-top: 6px;
}
/* Spell Info minimum width for Spell Name and Casting Time */
.sl8-spellrow-name .sl8-line.short {
min-width: 60px;
}
/* =========================
Responsive containment fixes
Spell Level 0 + Spell Info
========================= */
/* Ensure all SL0 elements size within their containers */
.sl8-card, .sl8-card * {
box-sizing: border-box;
}
/* Prevent any child content from visually spilling out of the card */
.sl8-card {
overflow: hidden;
}
/* Allow top-row items to wrap inside the card instead of overflowing */
.sl8-toprow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: center;
}
/* Make each top item flexible and allow it to shrink within the card */
.sl8-topitem {
flex: 1 1 240px;
min-width: 0;
}
/* Keep the little number boxes from forcing overflow */
.sl8-topitem .sl8-box {
max-width: 100%;
}
/* Spells Known row: allow textarea to shrink/wrap within card */
.sl8-knownrow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: flex-start;
}
.sl8-knownlabel {
flex: 0 0 auto;
min-width: 0;
}
.sl8-knownarea {
flex: 1 1 260px;
min-width: 0;
max-width: 100%;
}
/* Spell Info rows: wrap on narrow screens, keep fields inside */
.sl8-spellrow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: center;
min-width: 0;
}
.sl8-spelllabel {
flex: 0 0 auto;
min-width: 0;
}
/* Inputs should be allowed to shrink instead of overflowing */
.sl8-spellrow input.sl8-line,
.sl8-spellrow textarea {
min-width: 0;
max-width: 100%;
}
/* Spell Name + Casting Time line: make inputs share space and wrap cleanly */
.sl8-spellrow-name input.sl8-line.short {
flex: 1 1 240px; /* grows, shrinks, wraps */
min-width: 60px; /* your requested minimum */
max-width: 100%;
}
/* Description textarea should always stay within the card */
.sl8-descarea {
flex: 1 1 100%;
min-width: 0;
max-width: 100%;
}
/* Repeat spell boxes should also clip/wrap properly */
.sl8-spellbox,
.sl8-spellbox-repeat {
max-width: 100%;
overflow: hidden;
}
/* Spell Info lock Name / Casting Time / Range on one row with proportional widths */
.sl8-spellrow-name {
display: flex;
flex-wrap: nowrap; /* stay on one row */
align-items: center;
}
.sl8-spellrow-name .sl8-line.name {
flex: 3 1 0; /* 50% wider */
min-width: 60px;
}
.sl8-spellrow-name .sl8-line.time,
.sl8-spellrow-name .sl8-line.range {
flex: 2 1 0;
min-width: 60px;
}
/* =========================
Spell Info containment (responsive)
Keeps content inside Spell Info card on narrow widths
========================= */
.sl8-card, .sl8-card * { box-sizing: border-box; }
.sl8-card,
.sl8-spellbox,
.sl8-spellbox-repeat {
max-width: 100%;
overflow: hidden; /* prevent spill outside card */
}
.sl8-spellrow,
.sl8-knownrow,
.sl8-toprow {
min-width: 0;
max-width: 100%;
}
.sl8-spellrow input,
.sl8-spellrow textarea,
.sl8-knownrow textarea,
.sl8-toprow input {
min-width: 0;
max-width: 100%;
}
/* Default: keep Name/Time/Range inputs on one row (your preferred layout) */
.sl8-spellrow-name { flex-wrap: nowrap; }
.sl8-spellrow-name .sl8-spelllabel { white-space: nowrap; }
/* Spell Info keep each label+field together as a unit */
.sl8-spellpair{
display:flex;
align-items:center;
gap: 6px;
white-space: nowrap; /* prevents label and its input from splitting lines */
min-width: 0;
}
/* Ensure inputs inside pairs can still shrink within the card */
.sl8-spellpair .sl8-line{
min-width: 60px; /* your minimum */
max-width: 100%;
}
/* Spell Info keep each label with its field, and preserve 3:2:2 width distribution */
.sl8-spellrow-name{
display:flex;
gap: 6px 10px;
align-items:center;
max-width:100%;
min-width:0;
}
/* Each label+input pair stays together */
.sl8-spellpair{
display:flex;
align-items:center;
gap:6px;
white-space:nowrap;
min-width:0;
}
/* Proportional widths (Spell Name 50% wider than Time/Range) */
.sl8-spellpair.pair-name{ flex:3 1 0; }
.sl8-spellpair.pair-time{ flex:2 1 0; }
.sl8-spellpair.pair-range{ flex:2 1 0; }
/* Inputs shrink inside their pair; keep your minimum */
.sl8-spellpair .sl8-line{
flex:1 1 0;
min-width:60px;
max-width:100%;
}
/* Spell Info final overrides for pair classes used in HTML */
.sl8-spellrow-name{ flex-wrap: wrap; }
.sl8-spellpair.namepair{ flex: 3 1 0; }
.sl8-spellpair.timepair{ flex: 2 1 0; }
.sl8-spellpair.rangepair{ flex: 2 1 0; }
/* Spell Info wrap by label+field pair (Casting Time & Range may drop, but never split from their label) */
.sl8-spellrow-name{
display:flex;
flex-wrap: wrap; /* allow pairs to wrap to lower rows */
align-items: center;
gap: 6px 10px;
min-width: 0;
}
.sl8-spellpair{
display:flex;
align-items:center;
gap: 6px;
white-space: nowrap; /* label and its field stay on same line */
min-width: 0;
max-width: 100%;
}
/* Proportional widths by PAIR so the whole unit wraps together */
.sl8-spellpair-name{ flex: 3 1 0; }
.sl8-spellpair-time{ flex: 2 1 0; }
.sl8-spellpair-range{ flex: 2 1 0; }
/* Inputs inside pairs can shrink but respect your minimum */
.sl8-spellpair .sl8-line{
min-width: 60px;
max-width: 100%;
}
/* FIX: actually allow Casting Time / Range PAIRS to wrap when narrow */
.sl8-spellrow-name{
flex-wrap: wrap !important;
}
/* Prevent pairs from shrinking to avoid suppressing wrapping */
.sl8-spellpair{
flex-shrink: 0;
}
/* FIX v2: enforce wrapping by giving each label+field pair a real minimum width.
This makes Casting Time / Range drop to a new row when the window is narrow,
while keeping each label attached to its field. */
.sl8-spellrow-name{
width: 100%;
max-width: 100%;
}
/* Minimum widths are set to the pair (label+field), not just the input,
so pairs stop compressing and instead wrap. */
.sl8-spellpair-name{ min-width: 320px; }
.sl8-spellpair-time{ min-width: 220px; }
.sl8-spellpair-range{ min-width: 200px; }
/* Keep 50% wider intent while still permitting wrap by pair */
.sl8-spellpair-name{ flex: 3 0 auto; }
.sl8-spellpair-time,
.sl8-spellpair-range{ flex: 2 0 auto; }
/* ===== Spell Info wrap fix (authoritative) =====
Problem: earlier rules target non-existent classes (sl0-spellpair-time/range),
and older grid/flex rules conflict. These rules are appended LAST and use
high specificity/!important so the Spell Info row actually wraps by pair. */
/* Ensure the Spell Name row is flex (not grid) and can wrap */
.sl8-spellbox .sl8-spellrow.sl8-spellrow-name{
display: flex !important;
flex-wrap: wrap !important;
align-items: center;
gap: 6px 10px;
width: 100%;
max-width: 100%;
min-width: 0;
}
/* Keep each label+field together */
.sl8-spellbox .sl8-spellrow.sl8-spellrow-name .sl8-spellpair{
display: inline-flex;
align-items: center;
gap: 6px;
white-space: nowrap;
flex-shrink: 0; /* don't compress forever; wrap instead */
min-width: 0;
max-width: 100%;
}
/* Inputs still respect your minimum and stay within the card */
.sl8-spellbox .sl8-spellrow.sl8-spellrow-name .sl8-spellpair .sl8-line{
min-width: 60px;
max-width: 100%;
}
/* ===== Collapsible Spell Level 9 Card (SL9) ===== */
.sl9-toggle{
position: absolute;
left: -9999px;
}
.sl9-toggle-btn{
display: inline-block;
border: 1px solid #333;
border-radius: 6px;
padding: 4px 8px;
font-size: 11px;
font-weight: bold;
cursor: pointer;
user-select: none;
margin: 0 0 6px 0;
background: #fff;
position: relative;
top: 1px;
padding-right: 22px;
}
.sl9-toggle-btn::after{
content: "◀";
position: absolute;
right: 28px;
top: 50%;
transform: translateY(-50%);
color: #000;
font-size: 12px;
line-height: 1;
}
.sl9-toggle:checked + .sl9-toggle-btn::after{
content: "▼";
color: #000;
}
.sl9-toggle-btn:hover{
filter: brightness(1.05);
}
.sl9-toggle:not(:checked) + .sl9-toggle-btn + .sl9-body{
display: none;
}
/* ===== SL9 structural style mirror (from SL0) ===== */
/* sheet243: Spell Level 0 (SL0) card (Arial only) */
.sl9-card{
position: relative;
border: 2px solid #000;
border-radius: 4px;
padding: 20px 14px 12px 14px;
box-sizing: border-box;
}
.sl9-title{
position: absolute;
top: -11px;
left: 10px;
background: #fff;
padding: 2px 10px;
border: 2px solid #000;
border-radius: 4px;
font-weight: 700;
font-size: 16px;
}
.sl9-toprow{
display: flex;
flex-wrap: wrap;
gap: 22px;
align-items: center;
margin-bottom: 12px;
}
.sl9-topitem{
font-weight: 700;
font-size: 18px;
display: flex;
align-items: center;
gap: 10px;
white-space: nowrap;
}
.sl9-box{
width: 58px;
height: 30px;
border: 2px solid #000;
background: #f2f2f2;
box-sizing: border-box;
}
.sl9-knownrow{
display: grid;
grid-template-columns: auto 1fr;
gap: 12px;
align-items: center;
margin-bottom: 10px;
}
.sl9-knownlabel{
font-weight: 700;
font-size: 16px;
white-space: nowrap;
}
.sl9-knownline{
width: 100%;
border: none;
border-bottom: 2px solid #000;
background: transparent;
height: 22px;
padding: 0 4px;
box-sizing: border-box;
}
.sl9-sep{
border-top: 2px solid #000;
margin: 8px 0 14px 0;
}
.sl9-spellbox{
border: 2px solid #000;
border-radius: 4px;
padding: 10px 10px 6px 10px;
box-sizing: border-box;
}
.sl9-spellrow{
display: grid;
grid-template-columns: auto 1fr;
gap: 10px;
align-items: center;
margin-bottom: 8px;
}
/* Spell Info: Spell Name row adds Casting Time on the same line */
.sl9-spellrow.sl9-spellrow-name{
grid-template-columns: auto 1fr auto 1fr;
}
.sl9-spelllabel{
font-weight: 700;
font-size: 18px;
white-space: nowrap;
}
.sl9-line{
width: 100%;
border: none;
border-bottom: 2px solid #000;
background: transparent;
height: 22px;
padding: 0 4px;
box-sizing: border-box;
}
.sl9-line.short{
max-width: 240px;
}
/* sheet244: SL0 card border thickness + layout fixes */
.sl9-card{
border: 1px solid #777; /* match other cards */
border-radius: 8px;
padding: 10px;
margin-top: 10px;
box-sizing: border-box;
position: static;
}
/* Remove the prior floating title styling if still present */
.sl9-title{ display: none; }
/* Force top row to stay on one line */
.sl9-toprow{
flex-wrap: nowrap;
justify-content: space-between;
gap: 12px;
}
/* Reduce the three small boxes by ~65% (58px -> ~20px) */
.sl9-box{
width: 20px;
height: 26px;
}
/* Resizable Spells Known box */
.sl9-knownarea{
width: 100%;
min-height: 28px;
border: 1px solid #777;
border-radius: 4px;
background: #fff;
padding: 4px 6px;
resize: vertical;
box-sizing: border-box;
font: inherit;
}
/* Resizable Spell Description box */
.sl9-descarea{
width: 100%;
min-height: 32px;
border: 1px solid #777;
border-radius: 4px;
background: #fff;
padding: 4px 6px;
resize: vertical;
box-sizing: border-box;
font: inherit;
}
/* Keep Spell Name line as underline but align nicely with textarea below */
.sl9-spellrow{
align-items: start;
}
/* sheet245: refine SL0 borders + field default heights + label sizing */
/* match normal thin borders for separator and spell entry box */
.sl9-sep{
border-top: 1px solid #777;
}
.sl9-spellbox{
border: 1px solid #777;
}
/* default (collapsed) heights before user expands */
.sl9-knownarea{
min-height: 25px;
height: 25px;
}
.sl9-descarea{
min-height: 20px;
height: 20px;
}
/* Spell Name / Spell Description label font size -2px */
.sl9-spelllabel{
font-size: 16px;
}
/* Adjust associated inputs to visually match the smaller labels */
.sl9-line{
height: 20px;
}
.sl9-line.short{
max-width: 210px;
}
/* sheet246: enforce max collapsed height for SL0 textareas */
.sl9-knownarea{
height: 20px;
min-height: 20px;
}
.sl9-descarea{
height: 20px;
min-height: 20px;
}
/* sheet248: allow user resize to change height (do NOT lock height with !important) */
.page-magic .sl9-card textarea.sl9-knownarea,
.page-magic .sl9-card textarea.sl9-descarea{
height: 20px; /* initial visible height */
min-padding: 0 4px !important;
line-height: 18px !important;
box-sizing: border-box !important;
resize: vertical !important;
}
/* sheet249: SL0 textareas start at 20px but remain user-resizable */
.page-magic .sl9-card textarea.sl9-knownarea,
.page-magic .sl9-card textarea.sl9-descarea{
height: 20px;
min-height: 20px;
resize: vertical;
overflow: auto;
box-sizing: border-box;
}
/* sheet251: SL0 card - Spells Known min-height +5px */
.page-magic .sl9-card textarea.sl9-knownarea{
min-height: 25px;
}
/* sheet251: match SL0 card min-width to Spellcasting Information card (magic-card) */
.page-magic .sl9-card{
min-width: 335px;
}
/* sheet251: prevent SL0 top-row small boxes from compressing under 25px */
.page-magic .sl9-box{
min-width: 25px;
}
/* sheet252: SL0 Spell Description height matches Spells Known */
.page-magic .sl9-card textarea.sl9-descarea{
min-height: 25px;
}
/* Match SL0 textarea initial height/resizing behavior inside Spell Info */
.page-magic .spellinfo-card textarea.sl9-descarea{
height: 20px;
min-height: 25px; /* match SL0 Spell Description min-height (sheet252) */
resize: vertical;
overflow: auto;
box-sizing: border-box;
}
/* sheet260: SL0 Spell Info repeating section (+Add) */
.page-magic .sl9-spellinfo-repeat-note{
margin-top: 6px;
margin-bottom: 6px;
font-size: 11px;
line-height: 1.2;
opacity: 0.9;
}
.page-magic .sl9-addhint{
font-weight: 700;
}
/* Slight separation between repeating Spell Info entries */
.page-magic .sl9-spellbox-repeat{
margin-top: 6px;
}
/* Spell Info minimum width for Spell Name and Casting Time */
.sl9-spellrow-name .sl9-line.short {
min-width: 60px;
}
/* =========================
Responsive containment fixes
Spell Level 0 + Spell Info
========================= */
/* Ensure all SL0 elements size within their containers */
.sl9-card, .sl9-card * {
box-sizing: border-box;
}
/* Prevent any child content from visually spilling out of the card */
.sl9-card {
overflow: hidden;
}
/* Allow top-row items to wrap inside the card instead of overflowing */
.sl9-toprow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: center;
}
/* Make each top item flexible and allow it to shrink within the card */
.sl9-topitem {
flex: 1 1 240px;
min-width: 0;
}
/* Keep the little number boxes from forcing overflow */
.sl9-topitem .sl9-box {
max-width: 100%;
}
/* Spells Known row: allow textarea to shrink/wrap within card */
.sl9-knownrow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: flex-start;
}
.sl9-knownlabel {
flex: 0 0 auto;
min-width: 0;
}
.sl9-knownarea {
flex: 1 1 260px;
min-width: 0;
max-width: 100%;
}
/* Spell Info rows: wrap on narrow screens, keep fields inside */
.sl9-spellrow {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: center;
min-width: 0;
}
.sl9-spelllabel {
flex: 0 0 auto;
min-width: 0;
}
/* Inputs should be allowed to shrink instead of overflowing */
.sl9-spellrow input.sl9-line,
.sl9-spellrow textarea {
min-width: 0;
max-width: 100%;
}
/* Spell Name + Casting Time line: make inputs share space and wrap cleanly */
.sl9-spellrow-name input.sl9-line.short {
flex: 1 1 240px; /* grows, shrinks, wraps */
min-width: 60px; /* your requested minimum */
max-width: 100%;
}
/* Description textarea should always stay within the card */
.sl9-descarea {
flex: 1 1 100%;
min-width: 0;
max-width: 100%;
}
/* Repeat spell boxes should also clip/wrap properly */
.sl9-spellbox,
.sl9-spellbox-repeat {
max-width: 100%;
overflow: hidden;
}
/* Spell Info lock Name / Casting Time / Range on one row with proportional widths */
.sl9-spellrow-name {
display: flex;
flex-wrap: nowrap; /* stay on one row */
align-items: center;
}
.sl9-spellrow-name .sl9-line.name {
flex: 3 1 0; /* 50% wider */
min-width: 60px;
}
.sl9-spellrow-name .sl9-line.time,
.sl9-spellrow-name .sl9-line.range {
flex: 2 1 0;
min-width: 60px;
}
/* =========================
Spell Info containment (responsive)
Keeps content inside Spell Info card on narrow widths
========================= */
.sl9-card, .sl9-card * { box-sizing: border-box; }
.sl9-card,
.sl9-spellbox,
.sl9-spellbox-repeat {
max-width: 100%;
overflow: hidden; /* prevent spill outside card */
}
.sl9-spellrow,
.sl9-knownrow,
.sl9-toprow {
min-width: 0;
max-width: 100%;
}
.sl9-spellrow input,
.sl9-spellrow textarea,
.sl9-knownrow textarea,
.sl9-toprow input {
min-width: 0;
max-width: 100%;
}
/* Default: keep Name/Time/Range inputs on one row (your preferred layout) */
.sl9-spellrow-name { flex-wrap: nowrap; }
.sl9-spellrow-name .sl9-spelllabel { white-space: nowrap; }
/* Spell Info keep each label+field together as a unit */
.sl9-spellpair{
display:flex;
align-items:center;
gap: 6px;
white-space: nowrap; /* prevents label and its input from splitting lines */
min-width: 0;
}
/* Ensure inputs inside pairs can still shrink within the card */
.sl9-spellpair .sl9-line{
min-width: 60px; /* your minimum */
max-width: 100%;
}
/* Spell Info keep each label with its field, and preserve 3:2:2 width distribution */
.sl9-spellrow-name{
display:flex;
gap: 6px 10px;
align-items:center;
max-width:100%;
min-width:0;
}
/* Each label+input pair stays together */
.sl9-spellpair{
display:flex;
align-items:center;
gap:6px;
white-space:nowrap;
min-width:0;
}
/* Proportional widths (Spell Name 50% wider than Time/Range) */
.sl9-spellpair.pair-name{ flex:3 1 0; }
.sl9-spellpair.pair-time{ flex:2 1 0; }
.sl9-spellpair.pair-range{ flex:2 1 0; }
/* Inputs shrink inside their pair; keep your minimum */
.sl9-spellpair .sl9-line{
flex:1 1 0;
min-width:60px;
max-width:100%;
}
/* Spell Info final overrides for pair classes used in HTML */
.sl9-spellrow-name{ flex-wrap: wrap; }
.sl9-spellpair.namepair{ flex: 3 1 0; }
.sl9-spellpair.timepair{ flex: 2 1 0; }
.sl9-spellpair.rangepair{ flex: 2 1 0; }
/* Spell Info wrap by label+field pair (Casting Time & Range may drop, but never split from their label) */
.sl9-spellrow-name{
display:flex;
flex-wrap: wrap; /* allow pairs to wrap to lower rows */
align-items: center;
gap: 6px 10px;
min-width: 0;
}
.sl9-spellpair{
display:flex;
align-items:center;
gap: 6px;
white-space: nowrap; /* label and its field stay on same line */
min-width: 0;
max-width: 100%;
}
/* Proportional widths by PAIR so the whole unit wraps together */
.sl9-spellpair-name{ flex: 3 1 0; }
.sl9-spellpair-time{ flex: 2 1 0; }
.sl9-spellpair-range{ flex: 2 1 0; }
/* Inputs inside pairs can shrink but respect your minimum */
.sl9-spellpair .sl9-line{
min-width: 60px;
max-width: 100%;
}
/* FIX: actually allow Casting Time / Range PAIRS to wrap when narrow */
.sl9-spellrow-name{
flex-wrap: wrap !important;
}
/* Prevent pairs from shrinking to avoid suppressing wrapping */
.sl9-spellpair{
flex-shrink: 0;
}
/* FIX v2: enforce wrapping by giving each label+field pair a real minimum width.
This makes Casting Time / Range drop to a new row when the window is narrow,
while keeping each label attached to its field. */
.sl9-spellrow-name{
width: 100%;
max-width: 100%;
}
/* Minimum widths are set to the pair (label+field), not just the input,
so pairs stop compressing and instead wrap. */
.sl9-spellpair-name{ min-width: 320px; }
.sl9-spellpair-time{ min-width: 220px; }
.sl9-spellpair-range{ min-width: 200px; }
/* Keep 50% wider intent while still permitting wrap by pair */
.sl9-spellpair-name{ flex: 3 0 auto; }
.sl9-spellpair-time,
.sl9-spellpair-range{ flex: 2 0 auto; }
/* ===== Spell Info wrap fix (authoritative) =====
Problem: earlier rules target non-existent classes (sl0-spellpair-time/range),
and older grid/flex rules conflict. These rules are appended LAST and use
high specificity/!important so the Spell Info row actually wraps by pair. */
/* Ensure the Spell Name row is flex (not grid) and can wrap */
.sl9-spellbox .sl9-spellrow.sl9-spellrow-name{
display: flex !important;
flex-wrap: wrap !important;
align-items: center;
gap: 6px 10px;
width: 100%;
max-width: 100%;
min-width: 0;
}
/* Keep each label+field together */
.sl9-spellbox .sl9-spellrow.sl9-spellrow-name .sl9-spellpair{
display: inline-flex;
align-items: center;
gap: 6px;
white-space: nowrap;
flex-shrink: 0; /* don't compress forever; wrap instead */
min-width: 0;
max-width: 100%;
}
/* Inputs still respect your minimum and stay within the card */
.sl9-spellbox .sl9-spellrow.sl9-spellrow-name .sl9-spellpair .sl9-line{
min-width: 60px;
max-width: 100%;
}
/* === Sheet280: Calculated vs User-Entered Field Coloring === */
/* Calculated / auto-filled fields (readonly) */
.sheet-roll20 input[readonly],
.sheet-roll20 textarea[readonly] {
color: #4a4a4a; /* dark grey */
}
/* User-entered fields */
.sheet-roll20 input:not([readonly]),
.sheet-roll20 textarea:not([readonly]) {
color: #0b1f3a; /* dark navy blue */
}
/* === Sheet281: Correct selector for this sheet (.lfg-sheet) === */
/* Calculated / auto-filled fields (readonly) */
.lfg-sheet input[readonly],
.lfg-sheet textarea[readonly] {
color: #4a4a4a !important; /* dark grey */
}
/* User-entered fields */
.lfg-sheet input:not([readonly]),
.lfg-sheet textarea:not([readonly]) {
color: #0b1f3a !important; /* dark navy blue */
}
/* === Sheet292: Weapons & Attacks - Attack Roll button === */
.weapons-card-full .wt-head.wt-attackbonus {
position: relative;
}
/* Place the button inside the same square under the Attack Bonus field without resizing the cell */
.weapons-card-full .wt-attackroll-btn {
position: absolute;
left: 4px;
right: 4px;
bottom: 3px;
height: 16px;
line-height: 14px;
font-size: 10px;
padding: 0;
border-radius: 3px;
}
/* remove d20 icon / normalize save roll button */
/* Clean save button styling that RETAINS the Roll20 dice icon */
.save-roll-btn{
border: 1px solid rgba(0,0,0,0.55);
border-radius: 3px;
padding: 0 4px 0 18px;
margin-left: -10px;
display: inline-block;
height: 16px;
line-height: 14px;
font-size: 10px;
font-weight: 700;
position: relative;
left: -10px;
white-space: nowrap;
box-sizing: border-box;
min-width: 54px;
/* keep Roll20 dice icon */
background-size: 14px 14px;
background-position: 3px center;
background-repeat: no-repeat;
}
.save-roll-btn:hover{
opacity: 0.92;
}
/* Slightly tighten separator spacing in Saves */
.save-plus,
.save-eq{
margin-left: 2px;
margin-right: 2px;
}
/* === Sheet307: Save buttons positioned to card edge and widened === */
/* Shift the entire Saves header + rows left so labels sit ~3px from the card edge
(armor-saves-card has 12px left padding, so -9px => 3px effective inset) */
.saving-header,
.save-row{
margin-left: -9px;
}
/* Keep dice icon, make the button fit its widened first column */
.save-roll-btn{
height: 24px;
line-height: 22px;
font-size: 11px;
font-weight: 700;
/* keep Roll20 dice icon */
background-size: 14px 14px;
background-position: 3px center;
padding-left: 20px;
padding-right: 6px;
border: 1px solid rgba(0,0,0,0.7);
border-radius: 3px;
box-sizing: border-box;
width: 100%;
white-space: nowrap;
display: flex;
align-items: center;
justify-content: flex-start;
}
/* === Sheet308: Saving Throws grid shifted & save buttons widened === */
/* Shift the entire Saving Throws header and rows left so first column is 3px from card edge */
.saving-header,
.save-row {
margin-left: -9px; /* 12px card padding minus 3px desired inset */
}
/* Expand Save buttons by 15px */
.save-roll-btn {
width: calc(100% + 15px);
}
/* === Sheet309: Save button + column refinements === */
/* 1) Increase Save button width by additional 5px (total +20px from base) */
.save-roll-btn {
width: calc(100% + 20px);
}
/* 2) Move Total Save column 15px to the right WITHOUT expanding card width
Achieved by shifting the Total Save column itself */
.save-row .save-total,
.saving-header .save-total {
margin-left: 15px;
}
/* 3) Reduce width of each save fillable field by 3px
and shift right by the same amount to preserve spacing */
.save-row input[type="text"],
.save-row input[type="number"] {
width: calc(100% - 3px);
margin-left: 3px;
}
/* === Sheet310: Compress AC & Saves field spacing by 20% === */
/* Compress spacing between save-related columns evenly */
.saving-header,
.save-row {
column-gap: 8px; /* was effectively ~10px, now ~20% tighter */
}
/* Slightly reduce internal padding of save input fields */
.save-row input[type="text"],
.save-row input[type="number"] {
padding-left: 3px;
padding-right: 3px;
}
/* Ensure columns distribute evenly after compression */
.saving-header,
.save-row {
justify-content: space-between;
}
/* === Sheet311: Compressed save field spacing (separators and gaps) === */
/* === Sheet312: Total Save column shifted right 15px, width redistributed === */
/* === Sheet313: Saving Throws columns compressed 50%, Total Save shifted right === */
/* The sheet had multiple .save-row blocks; this scoped rule ensures the intended layout wins in Roll20. */
.armor-saves-card .saving-header {
grid-template-columns: 96px 37px 15px 37px 2px 37px 2px 40px !important;
column-gap: 3px !important; /* ~50% tighter than prior 6px */
}
.armor-saves-card .save-row {
grid-template-columns: 111px 37px 15px 37px 2px 37px 2px 40px !important; /* Total Save shifted right by widening button col */
column-gap: 3px !important; /* ~50% tighter */
}
/* === Sheet315: Fix Save button size + even symbol spacing (no card width increase) === */
/* Scoped overrides so they win over earlier duplicate .save-row rules */
.armor-saves-card .saving-header {
/* Button col widened (+15) to push Total Save right; other value cols reduced (-5 each) to keep total width stable */
grid-template-columns: 96px 37px 12px 32px 12px 32px 12px 32px !important;
column-gap: 3px !important;
align-items: center !important;
}
.armor-saves-card .save-row {
grid-template-columns: 111px 37px 12px 32px 12px 32px 12px 32px !important;
column-gap: 3px !important;
align-items: center !important;
}
/* Keep FORT/REF/WILL buttons compact (dont stretch to fill widened column) */
.armor-saves-card .save-roll-btn {
width: 58px !important; /* fits FORT/REF/WILL + icon */
max-width: 58px !important;
box-sizing: border-box !important;
margin: 0 !important;
justify-self: start !important;
}
/* Center the + and = symbols evenly in their spacer columns */
.armor-saves-card .save-plus,
.armor-saves-card .save-eq {
display: flex !important;
align-items: center !important;
justify-content: center !important;
}
/* === Sheet316: Wider Save buttons (+25px) and header/row realignment === */
/* Header and rows MUST share identical grid math */
.armor-saves-card .saving-header,
.armor-saves-card .save-row {
grid-template-columns: 121px 36px 12px 36px 12px 36px 12px 36px !important;
column-gap: 3px !important;
align-items: center !important;
}
/* Save buttons widened by +25px, but do not stretch */
.armor-saves-card .save-roll-btn {
width: 83px !important;
max-width: 83px !important;
box-sizing: border-box !important;
justify-self: start !important;
}
/* Center + and = symbols perfectly */
.armor-saves-card .save-plus,
.armor-saves-card .save-eq {
display: flex !important;
align-items: center !important;
justify-content: center !important;
}\n\n
/* === Sheet317: Fine positional tweaks for Saving Throws === */
/* Shift all save input fields 3px to the left */
.armor-saves-card .save-row input[type="text"],
.armor-saves-card .save-row input[type="number"] {
margin-left: -3px !important;
}
/* Move the three save buttons 10px to the right */
.armor-saves-card .save-roll-btn {
margin-left: 10px !important;
}
/* === Sheet318: Core Stats field width adjustments === */
/* Hit Rating field: reduce width by ~55% and keep centered */
.core-stats-card .hit-rating input[type="text"],
.core-stats-card .hit-rating input[type="number"] {
width: 45% !important; /* 100% - 55% */
margin-left: auto !important;
margin-right: auto !important;
display: block;
}
/* Ability Mod fields: reduce width by ~40% and keep centered under header */
.core-stats-card .ability-mod input[type="text"],
.core-stats-card .ability-mod input[type="number"] {
width: 60% !important; /* 100% - 40% */
margin-left: auto !important;
margin-right: auto !important;
display: block;
}
/* === Sheet319: Core Stats width tweaks (Hit Rating + Ability Mod) === */
.core-stats-card .corestat-row.hr-row {
grid-template-columns: 1fr 39px;
}
.core-stats-card .corestat-row.hr-row .corestat-box {
width: 39px !important;
}
/* === Sheet320: Core Stats Ability Mod fields width -40% and centered === */
/* Force header+rows to keep the Ability Mod column aligned */
.core-stats-card .ability-header,
.core-stats-card .ability-row{
grid-template-columns: 70px 1fr 1fr !important; /* keep column structure stable */
}
/* Reduce ONLY the Ability Mod input boxes by 40% (i.e., to 60% width) and center them */
.core-stats-card .ability-row input.ability-box[readonly]{
width: 60% !important;
justify-self: center !important;
}
/* === Sheet321: Core Stats Ability Mod boxes truly -40% width and centered === */
/* Target ONLY the Ability Mod (readonly) boxes in the ability grid and override fixed width rules */
.core-stats-card .ability-row input.ability-box[readonly]{
width: 43px !important;
min-width: 43px !important;
max-width: 43px !important;
justify-self: center !important;
display: block !important;
margin-left: auto !important;
margin-right: auto !important;
}
/* === Sheet322: AC & Saves Total Save fields +5px width, centered === */
/* Increase only the Total Save calculated fields without changing grid or card width */
.armor-saves-card .save-row input.total-save,
.armor-saves-card .save-row input[name^="attr_TotalSave"]{
width: calc(100% + 5px) !important;
max-width: calc(100% + 5px) !important;
justify-self: center !important;
}
/* === Sheet323: AC & Saves Total Save column +5px, redistributed (no card width change) === */
/* Strong, scoped overrides to avoid collisions with earlier .save-row blocks */
.armor-saves-card .saving-header {
grid-template-columns: 81px 42px 29px 35px 4px 35px 4px 36px !important;
align-items: center !important;
}
.armor-saves-card .save-row {
grid-template-columns: 96px 42px 29px 35px 4px 35px 4px 36px !important;
align-items: center !important;
}
/* Ensure Total Save input stays centered under its header */
.armor-saves-card .save-cell {
display: flex !important;
justify-content: center !important;
align-items: center !important;
}
.armor-saves-card input.save-box.save-total {
width: 100% !important;
}
/* === Sheet324: Re-align Saving Throws headers above their columns (no field movement) === */
/* Match header grid math to the save-row grid so labels sit directly above inputs. */
.armor-saves-card .saving-header {
grid-template-columns: 96px 37px 29px 37px 4px 37px 4px 37px !important;
column-gap: 6px !important;
align-items: center !important;
}
/* === Sheet325: Nudge Saving Throws input fields 3px left (no card width change) === */
/* Apply only to inputs, not headers or grid */
.armor-saves-card .save-row input[type="text"],
.armor-saves-card .save-row input[type="number"] {
position: relative !important;
left: -3px !important;
}
/* === Sheet328: Equip Slots TOTAL EQUIPPED WEIGHT width -20% and right-aligned (no layout changes) === */
.equip-slots input.equip-total-weight{
width: 64px !important; /* 80px * 0.8 */
min-width: 64px !important;
max-width: 64px !important;
display: block !important;
margin-left: auto !important; /* right align inside its grid cell */
margin-right: 0 !important;
}
/* === Sheet330: Keep TOTAL EQUIPPED WEIGHT on one horizontal line === */
.equip-slots .equip-row.equip-total-row .equip-label{
white-space: nowrap !important;
}
/* === Sheet331: TOTAL EQUIPPED WEIGHT label spans row to prevent stacking === */
.equip-slots .equip-row.equip-total-row .equip-label{
white-space: nowrap !important;
grid-column: 1 / span 2 !important;
}
.equip-slots .equip-row.equip-total-row .equip-total-weight{
grid-column: 3 !important;
}
/* === Sheet333: TOTAL EQUIPPED WEIGHT label and field on same row === */
/* Let the label span columns 1-2, and force the weight field into column 3 */
.equip-slots .equip-row.equip-total-row .equip-label{
white-space: nowrap !important;
grid-column: 1 / 3 !important; /* span label across label+item columns */
}
.equip-slots .equip-row.equip-total-row input.equip-total-weight{
grid-column: 3 !important; /* keep aligned with Weight column */
margin-left: auto !important; /* right-align within the weight cell */
}
/* === Sheet335: Center-align specified fields (Back tab Weights, Skills card, Gold GP) === */
/* Back tab: center-align ALL Weight-related fields (Wt column + totals) */
.page-back input[placeholder="Wt"],
.page-back input[placeholder*="WEIGHT"],
.page-back input.equip-total-weight,
.page-back input.backpack-total-weight{
text-align: center !important;
}
/* Skills card: center-align all fillable fields */
.skills-card input[type="text"],
.skills-card input[type="number"]{
text-align: center !important;
}
/* Gold (GP) field */
input[name="attr_Gold"]{
text-align: center !important;
}
/* === Sheet337: Center-align Sheaths & Bandoliers weight fields === */
.subcard.sheaths-bandoliers input[placeholder^="Wt"]{
text-align: center !important;
}
.repeating_sheathsbandoliers input[placeholder^="Wt"]{
text-align: center !important;
}
/* === Sheet338: Center-align Belt Pouches weight fields === */
.subcard.belt-pouches input[placeholder^="Wt"]{
text-align: center !important;
}
.repeating_beltpouches input[placeholder^="Wt"]{
text-align: center !important;
}
/* === Sheet339: Standardize total weight field widths + center totals (no card size changes) === */
/* Baseline is Total Equipped Weight width: 64px */
/* Match total weight fields to baseline width and keep right-aligned in their weight column */
.page-back input.backpack-total-weight,
.page-back input.sheath-total-weight,
.page-back input.pouch-total-weight{
width: 64px !important;
min-width: 64px !important;
max-width: 64px !important;
display: block !important;
margin-left: auto !important;
margin-right: 0 !important;
}
/* Center-align the numeric value inside total fields (Sheaths & Belt Pouches) */
.page-back input.sheath-total-weight,
.page-back input.pouch-total-weight{
text-align: center !important;
}
/* === Sheet343: Backpack TOTAL BACKPACK WEIGHT visible label on same row (no card size changes) === */
.backpack-total-row{
display: grid !important;
grid-template-columns: 1fr auto !important;
align-items: center !important;
column-gap: 6px !important;
}
.backpack-total-row .backpack-total-label{
white-space: nowrap !important;
}
/* keep the total field aligned with the weight column/right edge */
.backpack-total-row input.backpack-total-weight{
justify-self: end !important;
}
.sheath-total-label{
font-weight: bold;
font-size: 0.8em;
padding-right: 6px;
}
/* sheet345: Sheaths & Bandoliers total row label + field on same line without impacting other cards */
.sheath-total-row{
display: grid;
grid-template-columns: auto 1fr;
align-items: center;
}
.sheath-total-row input{
width: 100%;
min-width: 0;
box-sizing: border-box;
}
/* sheet345: Belt Pouches total row label (keeps total field aligned under weight column) */
.pouch-total-label{
font-weight: bold;
font-size: 0.8em;
text-align: right;
padding-right: 6px;
white-space: nowrap;
}
/* sheet346: Belt Pouches total row label (aligns with Pouch Item fields) */
.belt-pouches .pouch-total-label{
font-weight: bold;
font-size: 0.8em;
text-align: left;
white-space: nowrap;
justify-self: start;
padding-right: 0;
}
/* sheet346 override: ensure left alignment wins */
.belt-pouches .pouch-total-label{ text-align: left; padding-right: 0; justify-self: start; }
/* sheet347: ensure label aligns with Pouch Item fields */
.belt-pouches .pouch-total-label{
text-align: left;
justify-self: start;
white-space: nowrap;
}
/* sheet348: tighten visual alignment of TOTAL POUCH WEIGHT with Pouch Item fields */
.belt-pouches .pouch-total-label{
padding-left: 0;
}
/* sheet349: Belt Pouches - right-align Total Pouch Weight field with Wt inputs */
.belt-pouches .pouch-total-row input.pouch-total-weight{
width: 45px;
min-width: 45px;
box-sizing: border-box;
justify-self: end;
}
/* sheet350: Belt Pouches - make Total Pouch Weight field match Wt input width & alignment */
.page-back .belt-pouches input.pouch-total-weight{
width: 45px !important;
min-width: 45px !important;
max-width: 45px !important;
margin-left: 0 !important;
margin-right: 0 !important;
justify-self: stretch;
}
/* sheet357: Modified Light Load label styling */
.cap-grid-label.mod-light{
font-size: 0.85em;
font-style: italic;
}
/* sheet359: header line title + logo (inline, no layout disruption) */
.lfg-sheet-titlebar{
display: flex;
align-items: center;
gap: 10px;
margin: 0 0 6px 0;
padding: 0;
}
.lfg-sheet-title{
font-size: 12px;
font-weight: 600;
line-height: 1.2;
}
.lfg-sheet-logo{
height: 18px;
width: auto;
opacity: 0.9;
pointer-events: none;
display: block;
}
/* sheet362: header logo size adjustment */
.lfg-sheet-logo{
width: 300px;
height: auto;
}
/* sheet363: align logo under main title and remove duplicate title */
.lfg-sheet-titlebar{
justify-content: flex-start;
}
/* sheet364: Option B - logo only (remove header text) */
.lfg-sheet-title{ display: none !important; }
.lfg-sheet-titlebar{ justify-content: flex-start; }
/* sheet370: Initiative card (Front tab) */
.initiative-card{
padding-top: 5px;
padding-bottom: 5px;
}
/* Anchor for absolute-positioned toggle button without shifting existing elements */
.initiative-card .initiative-row{
position: relative;
}
.initiative-card .init-ready-toggle{
position: absolute;
left: -9999px;
}
.initiative-card .init-ready-btn{
position: absolute;
right: 5px;
top: 0;
width: 95px;
height: 22px;
border: 1px solid #999;
border-radius: 4px;
background: #fff;
cursor: pointer;
user-select: none;
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
box-sizing: border-box;
white-space: nowrap;
}
.initiative-card .init-ready-btn::after{
content: "I'M READY";
color: #1a8f2a;
}
.initiative-card .init-ready-toggle:checked + .init-ready-btn::after{
content: "I'M DONE";
color: #b11a1a;
}
/* sheet371: Initiative button without moving label/input styles */
.initiative-card .initiative-row{
display: flex;
align-items: flex-start; /* align to top of initiative field */
flex-wrap: nowrap;
gap: 8px;
}
/* hide checkbox but keep it functional */
.initiative-card .init-ready-toggle{
position: absolute;
left: -9999px;
}
/* button sits immediately to the right of the initiative field (no overlap) */
.initiative-card .init-ready-btn{
width: 110px;
height: 22px;
border: 1px solid #999;
border-radius: 4px;
background: #fff;
cursor: pointer;
user-select: none;
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
box-sizing: border-box;
white-space: nowrap; /* always one line */
line-height: 22px;
}
/* Default state */
.initiative-card .init-ready-btn::after{
content: "I'M READY";
color: #1a8f2a;
}
/* Toggled state */
.initiative-card .init-ready-toggle:checked + .init-ready-btn::after{
content: "I'M DONE";
color: #b11a1a;
}
/* sheet372: nudge initiative formula down to avoid overlap */
.initiative-card .initiative-formula{
margin-top: 7px;
}
/* sheet379: Initiative reactions line (absolute, no layout impact) */
.initiative-card{
position: relative;
}
.initiative-card .initiative-reactions{
position: absolute;
right: 0;
top: 32px;
display: flex;
align-items: center;
font-size: 11px;
}
.initiative-card .initiative-reactions-label{
margin-right: 4px;
}
.initiative-card .initiative-reactions-box{
width: 14px;
border: none;
border-bottom: 1px solid #000;
text-align: center;
font-size: 11px;
background: transparent;
}
/* sheet381 regen: Reactions styling + alignment tweaks */
.initiative-card .initiative-reactions{
font-size: 13px;
}
.initiative-card .initiative-reactions-label{
color: #000;
font-size: 13px;
}
.initiative-card .initiative-reactions-box{
width: 22px;
font-size: 13px;
}
/* sheet391: Balance Core Stats bottom spacing (HP -> Hit Rating -> Move Speed -> card bottom) */
.core-stats-card .hp-panel{
margin-bottom: 5px;
}
.core-stats-card .corestat-row.hr-row{
margin-top: 0px;
margin-bottom: 5px;
}
.core-stats-card .corestat-row{
margin-top: 0px;
}
.core-stats-card{
padding-bottom: 5px;
}
.core-stats-card .corestat-row.hr-row {
margin-top: 5px;
}
.core-stats-card .corestat-row.movespeed-row {
margin-top: 5px;
}
/* sheet393: move ONLY Move Speed down 5px */
.core-stats-card .corestat-row.movespeed-row {
margin-top: 5px;
}
/* sheet395: Core Stats spacing adjustments (from sheet393 baseline)
- Increase gap between Hit Rating and Move Speed by 5px (without moving Hit Rating closer to Hit Points)
- Reduce overall Core Stats card height by 5px
*/
.core-stats-card .corestat-row.hr-row{
margin-bottom: 23px; /* 18px default + 5px */
}
.core-stats-card .corestat-row.movespeed-row{
margin-top: 18px; /* keep default top spacing */
margin-bottom: 8px; /* 18px default - 10px => net card height -5px after HR +5 */
}
/* sheet396: Hit Rating color + spacing */
/* sheet397: exact Initiative-blue for Hit Rating */
.core-stats-card .corestat-row.hr-row .corestat-label{
color: #1e4db7;
}
/* sheet410: test roll button styling for Acrobatics skill label */
.skill-roll-btn{
background: transparent !important;
border: 0 !important;
padding: 0 !important;
margin: 0 !important;
width: auto !important;
min-width: 0 !important;
text-align: left !important;
font: inherit !important;
color: inherit !important;
cursor: pointer;
}
.skill-roll-btn:hover{
text-decoration: underline;
}
/* sheet411: remove Roll20 d20 icon from skill roll buttons to save horizontal space */
button[type="roll"].skill-roll-btn::before{
display: none;
}