:root{color-scheme:light;--ink:#202c29;--muted:#53615a;--paper:#f3f0e6;--brass:#8b6d36;--line:#d6cdbb;--wood:#202926;--wax:#8d392e;--green:#275b44;--nav-height:64px;font-family:system-ui,-apple-system,"Segoe UI",sans-serif;font-size:16px;line-height:1.5;background:var(--wood);color:var(--ink)}
*{box-sizing:border-box}body{margin:0}button,a,input{touch-action:manipulation}button{font:inherit;cursor:pointer;border:1px solid var(--brass);border-radius:3px;background:#2d473c;color:#fff;padding:10px 14px;min-height:44px;font-weight:650;line-height:1.3}button:hover:not(:disabled){background:#3e604e}button:disabled{cursor:not-allowed;background:#e4ded0;color:#5b6058;border-color:#b5ad99}a{color:var(--green);text-underline-offset:3px}button:focus-visible,a:focus-visible,summary:focus-visible{outline:3px solid #bf6b1e;outline-offset:3px}h1,h2,h3,p{margin:0 0 12px}h1,h2,h3{line-height:1.18}h1,h2{font-family:Georgia,"Times New Roman",serif;font-weight:500}h1{font-size:clamp(1.9rem,4vw,2.9rem)}h2{font-size:1.65rem}h3{font-size:1.02rem}small,.small{font-size:.82rem;line-height:1.45;color:var(--muted)}hr{border:0;border-top:1px solid var(--line);margin:24px 0}dl,dd{margin:0}dt{color:var(--muted)}strong{font-weight:700}.app-shell{max-width:1180px;margin:auto;min-height:100dvh;background:var(--paper);box-shadow:0 0 70px #0005}.skip{position:fixed;top:-100px;left:12px;z-index:20;background:white;padding:12px}.skip:focus{top:4px}.topbar{display:flex;align-items:center;justify-content:space-between;padding:12px 32px;background:var(--wood);color:#f4eddc;gap:12px}.brand{border:0;background:none!important;padding:0;display:flex;align-items:center;gap:12px;text-align:left;font-size:1rem;letter-spacing:.2em;min-height:44px}.brand small{display:block;color:#c8bea9;font-size:.62rem;letter-spacing:.14em;text-transform:uppercase}.brand-mark{font-family:Georgia,serif;font-size:1.7rem;border:1px solid #c0a56b;color:#dec78d;padding:0 8px}.save-utility{font-size:.8rem;background:transparent;border-color:#586156;color:#e6dcc7;padding:8px 10px}.prototype-strip{padding:5px 32px;font-size:.7rem;letter-spacing:.025em;background:#e1dac8;color:#4b554d;border-bottom:1px solid var(--line)}.sandbox-strip{background:#ffe3a0;color:#593500;font-weight:750}.resource-strip{display:flex;justify-content:flex-end;gap:28px;padding:12px 32px;background:#eee8da;border-bottom:1px solid var(--line);font-size:.85rem}.resource-strip strong{margin-left:6px}.primary-nav{display:flex;padding:0 24px;border-bottom:1px solid var(--line);background:#f6f2e8;gap:12px}.primary-nav button{color:var(--muted);border:0;background:none;border-bottom:3px solid transparent;border-radius:0;min-height:52px;padding:10px 16px}.primary-nav button:hover{color:var(--ink);background:#e8e2d5}.primary-nav [aria-current]{color:var(--ink);border-bottom-color:var(--wax)}main{padding:28px 32px 32px;outline:none}.eyebrow{font-size:.68rem;font-weight:750;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin-bottom:8px}.page-heading{margin:8px 0 24px}.page-heading p:last-child{max-width:660px}.scene{height:230px;background:linear-gradient(0deg,#18282188,transparent 70%),url('./assets/lower-quay.webp') center 56%/cover;margin:-28px -32px 24px;display:flex;align-items:end;padding:20px 32px;color:white}.scene span{font-size:.75rem;letter-spacing:.12em;text-transform:uppercase;border-left:2px solid #d1b16a;padding-left:12px}.room-scene{height:200px;background-position:25% 38%}.home-layout{display:grid;grid-template-columns:1.2fr 1fr;gap:48px}.return-block h2{font-size:1.8rem}.npc{display:flex;gap:12px;align-items:center;margin:12px 0 20px}.npc small{display:block}.seal{display:inline-flex;align-items:center;justify-content:center;flex:none;width:46px;height:46px;transform:rotate(-4deg);border:3px double #ca8372;border-radius:50%;background:var(--wax);color:#fff0d5;font:600 .8rem Georgia,serif;box-shadow:2px 3px 0 #5b271c25}.return-summary{padding:12px 0;border-top:1px solid var(--line);color:var(--muted);font-size:.9rem}.next-step{padding:16px 20px;background:#e8e3d7;border-left:3px solid var(--brass);margin:20px 0}.next-step p{margin-bottom:6px}.link-button{border:0;background:transparent!important;color:var(--green);text-decoration:underline;text-underline-offset:4px;font-weight:600;padding:8px 0;min-height:44px;text-align:left}.visit-facts{display:flex;flex-wrap:wrap;gap:20px;font-size:.8rem}.visit-facts dd{font-weight:750;font-size:1.1rem}.goal-paper{border:1px solid #cfc2a5;border-top:3px solid var(--brass);padding:24px;background:#faf7ed;box-shadow:4px 6px 0 #cac0a525}.goal-paper h3{margin-top:8px}.segmented{display:flex;gap:8px;margin:16px 0}.segmented .action-wrap{flex:1}.segmented button{width:100%;background:transparent;color:var(--ink);font-size:.8rem;font-weight:500}.segmented .selected{background:var(--ink);color:#fff}.cost-list{margin:16px 0;border-top:1px solid var(--line)}.cost-list div{display:flex;justify-content:space-between;gap:10px;padding:8px 0;border-bottom:1px solid var(--line);font-size:.85rem}.cost-list dd{text-align:right;font-weight:650}.success{color:var(--green);font-weight:650}.action-wrap{display:flex;flex-direction:column;align-items:flex-start;gap:4px}.requirement{display:block;max-width:260px}.journal{margin-top:28px;padding:12px 0;border-top:1px solid var(--line)}summary{cursor:pointer;min-height:44px;padding:10px 0;font-weight:650}.journal li{margin:12px 0;font-size:.87rem}.city-intro{max-width:770px;margin-bottom:30px}.section-links{display:flex;flex-wrap:wrap;gap:8px 20px}.section-links a{min-height:44px;display:flex;align-items:center}.institution{padding:30px 0;border-top:1px solid var(--line);scroll-margin-top:12px}.institution-heading{display:flex;justify-content:space-between;align-items:center}.institution-heading .npc{margin-top:0}.location-number{color:#b6a581;font:2.6rem Georgia,serif}.training-row,.choice-row,.shop-row{display:grid;grid-template-columns:1fr auto;gap:20px;align-items:center;padding:16px 0;border-bottom:1px solid var(--line)}.training-row p,.choice-row p,.shop-row p{font-size:.9rem;margin-bottom:6px;max-width:640px}.stat-number{font-size:1.4rem;color:var(--brass);margin-left:12px}.terms{color:var(--muted);font-size:.8rem!important}.contract-row{display:grid;grid-template-columns:48px 1fr auto;gap:20px;padding:22px 0;align-items:center;border-bottom:1px solid var(--line)}.contract-row p{font-size:.9rem;margin-bottom:8px}.contract-stamp{border:2px solid var(--brass);color:var(--brass);font:1.1rem Georgia,serif;text-align:center;padding:14px 4px;transform:rotate(-3deg)}.icon{width:24px;height:24px;vertical-align:middle}.character-summary{border-block:1px solid var(--line);padding:20px 0;margin-bottom:32px}.character-summary dl{display:flex;flex-wrap:wrap;gap:24px}.character-summary dd{font:1.75rem Georgia,serif}.stat-strip{display:flex;flex-wrap:wrap;gap:10px 24px;margin:20px 0;font-size:.9rem}.equipment-layout{display:grid;grid-template-columns:1fr 1.4fr;gap:40px}.slot-row{display:grid;grid-template-columns:90px 1fr;gap:4px 12px;padding:12px 0;border-bottom:1px solid var(--line);font-size:.84rem}.slot-row small{grid-column:2}.slot-name{color:var(--muted)}.gear-row{display:grid;grid-template-columns:30px 1fr auto;gap:12px;padding:16px 0 16px 12px;border-bottom:1px solid var(--line);border-left:3px solid #a2947d;margin:12px 0}.gear-row.uncommon{border-left-color:#2f6a55;background:#eaf0e7}.rarity{font-size:.68rem;letter-spacing:.08em;text-transform:uppercase;color:#476552}.gear-row p{font-size:.82rem;margin-bottom:6px}.gear-row h3{margin:5px 0 8px}.gear-symbol{padding-top:18px}.comparison{font-weight:650;color:var(--green)}.worn{font-size:.65rem;padding:3px 5px;background:#d8e2d4;white-space:nowrap}.count{font:1rem system-ui;color:var(--muted)}.supplies{margin-top:30px;border-top:1px solid var(--line);padding:24px 0}.supplies dl{display:grid;grid-template-columns:repeat(3,1fr);gap:24px}.supplies dd{font-size:1.6rem;font-weight:650}.result-strip{padding:16px 32px;background:#e5e9dd;border-block:1px solid #c4cfbc;font-size:.9rem}.result-strip p{margin:0;max-width:950px}.result-error{background:#f3ddd0}.footer-note{font-size:.7rem;color:var(--muted);padding:16px 32px;display:flex;justify-content:space-between;align-items:center;gap:12px}.footer-note button{font-size:.72rem}.activity-banner{display:flex;align-items:center;justify-content:center;gap:16px;background:#dfe6d9;padding:4px 16px;font-size:.85rem}.deferred{max-width:580px;padding:24px 0}.deferred .seal{margin-bottom:20px;width:70px;height:70px}.combat-screen{max-width:600px;margin:auto}.fight-heading{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:14px}.fight-heading h1{font-size:1.7rem;margin-bottom:0}.fight-heading .eyebrow{margin-bottom:4px}.health-row{display:grid;grid-template-columns:1fr 1fr;gap:20px}.health-row label{display:flex;justify-content:space-between;font-size:.8rem}.health-row meter{display:block;width:100%;height:14px;accent-color:var(--green)}.intent{padding:12px;background:#e6dfcd;border-left:3px solid var(--wax);margin:14px 0}.intent p{font-size:.85rem;margin-bottom:4px}.intent .eyebrow{display:block;font-size:.6rem;margin:0}.move-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}.move-grid button{width:100%;min-height:76px;text-align:left;padding:10px 12px;background:#294339}.move-grid strong{display:block;font-size:.93rem}.move-grid small{display:block;color:#e1e9d9;font-size:.74rem;font-weight:450;margin-top:5px}.turn-feedback{font-size:.82rem;padding:12px 0;margin-bottom:0;min-height:60px}.fight-utilities{display:flex;justify-content:space-between;gap:20px}.fight-utilities button{font-size:.8rem}.mine-scene{height:250px;overflow:hidden;position:relative;background:radial-gradient(ellipse at 38% 45%,#c9964240,transparent 48%),repeating-linear-gradient(155deg,#202824 0,#202824 40px,#344036 42px,#151c19 48px);border:12px solid #554432;border-bottom:22px solid #332b23;box-shadow:inset 0 0 70px #000}.mine-scene::before,.mine-scene::after{content:'';position:absolute;width:28px;height:110%;background:repeating-linear-gradient(90deg,#473827 0,#65513b 8px,#423525 12px);transform:rotate(6deg);left:14%;top:-5%;box-shadow:4px 4px 8px #0007}.mine-scene::after{left:auto;right:14%;transform:rotate(-6deg)}.mine-lantern{position:absolute;width:26px;height:38px;background:#eccb6a;border:5px solid #2a2420;border-radius:4px;left:34%;top:30%;box-shadow:0 0 70px 25px #cd91382f;z-index:1}.mine-vein{position:absolute;width:120px;height:90px;left:55%;top:35%;border-top:6px solid #9ba492;border-right:9px solid #819583;transform:rotate(-20deg);filter:drop-shadow(4px 4px 0 #465144)}.mine-rail{position:absolute;width:50%;height:70%;border-inline:6px solid #9d8660;background:repeating-linear-gradient(0deg,transparent 0,transparent 25px,#61523c 26px,#61523c 31px);bottom:-30%;left:25%;transform:perspective(160px) rotateX(35deg)}.expedition-paper{max-width:650px;margin:auto;padding:24px 0}.expedition-paper progress{width:100%;height:12px;accent-color:var(--green);margin:0 0 18px}.expedition-paper>.link-button{display:block}dialog{max-width:min(600px,calc(100% - 28px));border:1px solid var(--brass);background:var(--paper);color:var(--ink);padding:24px;max-height:85dvh;border-radius:4px}dialog::backdrop{background:#14201dc9}dialog h2{font-size:1.6rem}dialog li{margin:10px 0}.dialog-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:20px}code{overflow-wrap:anywhere;font-size:.8rem}.blocked{max-width:700px;padding:40px}.blocked button{margin:8px}
@media(min-width:761px){.focused-fight main{padding-block:20px}.focused-fight .footer-note{display:none}}
@media(max-width:760px){:root{--nav-height:60px}.app-shell{padding-bottom:calc(var(--nav-height) + env(safe-area-inset-bottom))}.topbar{padding:8px 16px}.brand{font-size:.8rem;gap:8px;letter-spacing:.12em}.brand-mark{font-size:1.4rem}.save-utility{font-size:.7rem;min-height:44px}.prototype-strip{padding:4px 16px;font-size:.65rem}.resource-strip{gap:8px;justify-content:space-between;padding:10px 16px;font-size:.68rem}.resource-strip span{display:flex;flex-direction:column;gap:2px}.resource-strip strong{margin:0;font-size:.84rem}.primary-nav{position:fixed;z-index:10;bottom:0;left:0;right:0;justify-content:space-around;gap:0;padding:0 6px env(safe-area-inset-bottom);box-shadow:0 -4px 20px #19251e15;border-top:1px solid #bbb39f}.primary-nav button{padding:10px 7px;font-size:.75rem;min-height:var(--nav-height);min-width:44px;border-bottom:0;border-top:3px solid transparent}.primary-nav [aria-current]{border-top-color:var(--wax)}main{padding:20px 16px 24px}.scene{height:170px;margin:-20px -16px 20px;padding:16px;background-position:50% 50%}.scene span{font-size:.65rem}.page-heading{margin-bottom:22px}.home-layout,.equipment-layout{grid-template-columns:1fr;gap:28px}.goal-paper{padding:18px}.return-block h2{font-size:1.6rem}.training-row,.choice-row,.shop-row{grid-template-columns:1fr;gap:8px;padding:18px 0}.training-row .action-wrap,.choice-row .action-wrap,.shop-row .action-wrap{align-items:stretch}.contract-row{grid-template-columns:32px 1fr;gap:12px}.contract-stamp{padding:10px 2px;font-size:.8rem}.contract-row .action-wrap{grid-column:2;align-items:stretch}.institution{padding:24px 0}.gear-row{grid-template-columns:24px 1fr;gap:8px}.gear-row .action-wrap{grid-column:2;align-items:stretch}.slot-row{grid-template-columns:82px 1fr}.supplies dl{grid-template-columns:1fr;gap:14px}.supplies dl div{display:grid;grid-template-columns:1fr auto}.supplies small{grid-column:1/-1}.result-strip{padding:14px 16px;font-size:.82rem}.footer-note{padding:12px 16px}.activity-banner{flex-wrap:wrap;gap:0 12px;padding:5px 16px;justify-content:flex-start;font-size:.75rem}.mine-scene{height:180px}.blocked{padding:20px 0}.focused-fight .topbar{padding:2px 12px}.focused-fight .brand small,.focused-fight .brand-mark{display:none}.focused-fight .prototype-strip{padding:2px 12px;font-size:.6rem}.focused-fight main{padding:12px 12px 8px}.focused-fight .footer-note{display:none}.fight-heading{margin-bottom:10px}.fight-heading h1{font-size:1.2rem}.fight-heading .eyebrow{font-size:.57rem}.enemy-seal{width:34px;height:34px;font-size:.65rem}.health-row{gap:12px}.health-row label{font-size:.72rem}.intent{margin:10px 0;padding:8px 10px}.intent p{font-size:.75rem}.move-grid{gap:8px}.move-grid button{min-height:72px;padding:8px}.move-grid strong{font-size:.8rem}.move-grid small{font-size:.68rem;line-height:1.3;margin-top:3px}.turn-feedback{font-size:.73rem;min-height:48px;padding:10px 0;line-height:1.4}.fight-utilities button{font-size:.7rem;min-height:44px}.segmented button{min-height:50px}.visit-facts{gap:12px}.section-links{gap:0 16px}}
@media(prefers-reduced-motion:reduce){*{scroll-behavior:auto!important;transition:none!important;animation:none!important}}
/* Required decisions retain the same readable type on desktop and phone.
   Enlarged user text grows the layout and can scroll; there is no fit clamp. */
.move-grid strong{font-size:1rem}.move-grid small{font-size:.82rem;line-height:1.3}
.intent p{font-size:.9rem}.health-row label{font-size:.85rem}
.turn-feedback{font-size:.85rem}.fight-utilities button{font-size:.8rem}

/* A single blade fills the row; sidearm adds one clear second weapon control. */
.move-grid .action-wrap:only-child{grid-column:1/-1}.move-grid .icon{float:left;margin:0 10px 6px 0;width:30px;height:30px;background:#eadfc4;border-radius:3px;padding:2px}
/* Illustrated duel: art yields space before readable controls and feedback. */
.combat-screen,.contract-result{max-width:660px;margin-inline:auto}
.duel-stage{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:12px;padding:10px 8px 6px;border:1px solid #786d4c;background:radial-gradient(ellipse at 50% 90%,#4c5d43,#22382e 60%,#172720);color:#f6efdc;border-radius:4px}
.duelist{min-width:0;text-align:center;--art-height:min(30dvh,300px)}
.figure-art{height:var(--art-height);width:calc(var(--art-height)*2/3);max-width:100%;position:relative;margin:auto}
.figure-art img{display:block;width:100%;height:100%;object-fit:contain}
.fighter-caption{display:flex;flex-wrap:wrap;justify-content:space-between;gap:2px 6px;font-size:.85rem;line-height:1.3;margin-top:4px;text-align:left}
.fighter-caption strong,.fighter-caption span{display:block;overflow-wrap:anywhere}
.fighter-caption span{color:#e3d4aa;font-size:.82rem}
.fighter-caption meter{display:block;flex-basis:100%;width:100%;height:12px;accent-color:#83a86e;margin-top:3px}

.hit-marker{position:absolute;pointer-events:none;width:0;height:0;z-index:1}
.hit-marker.generic{left:50%;top:38%}
.hit-number{position:absolute;left:0;bottom:12px;transform:translateX(-50%);display:block;color:#fff2c9;background:#24372eed;border:1px solid #cfac5d;border-radius:3px;padding:3px 5px;white-space:nowrap;font-weight:800;font-size:1rem;line-height:1.2;text-shadow:0 1px 1px #000}
.impact-ring{position:absolute;left:0;top:0;width:22px;height:22px;border:2px solid #e8c878;border-radius:50%;transform:translate(-50%,-50%);box-shadow:0 0 9px #c1a25880}
.landed .impact-ring::after{content:'';position:absolute;left:9px;top:-6px;width:2px;height:30px;background:#e8c878;transform:rotate(40deg)}
.blocked .impact-ring{border-radius:3px;border-color:#a6c9bb}
.evaded .hit-number{color:#c6ded0;border-color:#769d89}
.animate-impact .hit-number{animation:hit-float 850ms ease-out both}
.animate-impact .impact-ring{animation:impact-pulse 550ms ease-out both}
.animate-impact:has(.evaded) img{animation:evade-step 450ms ease-out both}
.reply.animate-impact .hit-number,.reply.animate-impact .impact-ring,.reply.animate-impact:has(.evaded) img{animation-delay:180ms}
@keyframes hit-float{0%{opacity:0;transform:translate(-50%,4px)}20%{opacity:1}100%{opacity:1;transform:translate(-50%,-14px)}}
@keyframes impact-pulse{0%{opacity:0;scale:.65}30%{opacity:1;scale:1.3}100%{opacity:.6;scale:1}}
@keyframes evade-step{50%{transform:translateX(-6px)}100%{transform:none}}
.combat-screen .intent{margin:8px 0;padding:6px 10px}
.combat-screen .intent p{margin:0}
.focused-fight main{padding-top:max(10px,env(safe-area-inset-top))}
@media(max-width:760px){.duelist{--art-height:min(20dvh,200px)}.duel-stage{padding:6px;gap:8px}.fight-heading{margin-bottom:6px}.fighter-caption{font-size:.82rem}.combat-screen .turn-feedback{padding:8px 0}.contract-result h1{font-size:1.5rem}}
@media(max-width:760px) and (max-height:680px){.duelist{--art-height:17dvh}}
@media(prefers-reduced-motion:reduce){.animate-impact .hit-number,.animate-impact .impact-ring,.animate-impact:has(.evaded) img{animation:none}.animate-impact .hit-number{transform:translateX(-50%)}}
/* Body anchors use external CSS to respect the static server CSP. */
.hit-marker.zone-head{left:50%;top:10%}.hit-marker.zone-torso{left:50%;top:35%}.hit-marker.zone-arm{left:76%;top:43%}.hit-marker.zone-leg{left:65%;top:73%}
[data-art=player] .zone-head,[data-art=player] .zone-torso{left:51%}
[data-art=collector] .zone-arm{left:23%}
[data-art=bridge] .zone-head{left:54%;top:9%}
[data-art=bridge] .zone-torso{left:51%;top:36%}
[data-art=bridge] .zone-arm{left:80%;top:44%}
[data-art=bridge] .zone-leg{left:70%;top:73%}
[data-art=boss] .zone-head{left:55%;top:9%}
[data-art=boss] .zone-torso{left:51%;top:35%}
[data-art=boss] .zone-arm{left:73%;top:44%}
[data-art=boss] .zone-leg{left:68%;top:77%}
.chapter-note{margin:24px 0;padding:18px 0;border-block:1px solid var(--line)}
.chapter-note ol{padding-left:24px;font-size:.88rem;line-height:1.6}
.segmented{flex-wrap:wrap}.segmented .action-wrap{min-width:90px}
@media(prefers-reduced-motion:reduce){.animate-impact .impact-ring{transform:translate(-50%,-50%)}}

.zone-head .hit-number{bottom:auto;top:12px}

.combat-screen .duel-stage{margin-bottom:8px}
.move-grid .icon{width:22px;height:22px;margin:0 6px 0 0}

.focused-fight .prototype-strip:not(.sandbox-strip){display:none}
@media(max-width:760px){.focused-fight .topbar{padding-top:max(2px,env(safe-area-inset-top))}}
.adventure-card{margin:24px 0;border:1px solid var(--line);background:#faf6e9}.adventure-card>div{padding:20px}.adventure-scene{display:block;width:100%;height:auto;max-height:260px;object-fit:cover}.adventure-card ol{padding-left:22px}.route-choice{padding:18px 0;border-top:1px solid var(--line)}.route-choice .action-wrap{margin-bottom:12px}.gathering-card{padding:20px 0;border-bottom:1px solid var(--line)}.skill-row{padding:14px 0;border-bottom:1px solid var(--line)}.clock-note{padding:12px;background:#e6e0ce;font-size:.9rem}.gear-art{width:72px;height:72px;object-fit:contain;vertical-align:middle}.gear-row:has(.gear-art){grid-template-columns:72px 1fr auto}.loot-source{padding:12px;border-left:3px solid #98866c;margin:12px 0}.rare{border-left-color:#466ead!important;background:#e8ecf5}.epic{border-left-color:#8655a0!important;background:#eee7f4}.archetype-note{font-size:.75rem;margin:5px 0 10px;color:var(--muted)}.trade-tabs [aria-current]{font-weight:800}.run-camp{max-width:660px;margin:auto}.run-camp>.action-wrap{margin:16px 0}.selected{border:2px solid #ba8733!important}.prototype-strip{font-size:.8rem}.focused-fight .prototype-strip:not(.sandbox-strip){display:block;font-size:.72rem}
@media(max-width:760px){.gear-row:has(.gear-art){grid-template-columns:52px 1fr}.gear-row .gear-art{width:52px;height:64px}.adventure-card>div{padding:16px}.adventure-scene{max-height:180px}.archetype-note{font-size:.75rem}.fight-heading .eyebrow{font-size:.7rem}.fighter-caption{font-size:.9rem}.fighter-caption span{font-size:.88rem}.combat-screen .turn-feedback{font-size:.9rem}.move-grid strong{font-size:1rem}.move-grid small{font-size:.82rem}}
[data-art=warden] .zone-head{top:10%;left:45%}[data-art=warden] .zone-torso{top:35%;left:48%}[data-art=warden] .zone-arm{top:43%;left:28%}[data-art=warden] .zone-leg{top:76%;left:62%}

/* City Ledger: the same paper, ink, borders and controls in every district. */
:root{--paper:#eeeade;--ink:#263b32;--muted:#58645b;--line:#d2ccbb;--wood:#223a30;--green:#315941;--brass:#917849}
.menu-icon{width:22px;height:22px;flex:none;vertical-align:middle}.primary-nav button{display:flex;align-items:center;gap:12px}.app-shell{max-width:1380px}.topbar{padding-block:16px}.brand-mark{border:3px double #b6a174;border-radius:3px;transform:rotate(-3deg)}.prototype-strip{font-size:.75rem;background:#e5e0d3}.resource-strip{background:#faf8f0;justify-content:space-around}.resource-strip span{font-variant-numeric:tabular-nums}.scene{height:140px}.room-scene{height:120px}.scene span{background:#1c332ddb;padding:7px 12px;border-left:3px solid #c4aa73}.page-heading h1{font-size:clamp(1.7rem,3vw,2.4rem)}
.section-tabs{display:flex;flex-wrap:wrap;gap:8px;margin:20px 0 24px}.section-tabs button{display:flex;align-items:center;gap:8px;color:var(--muted);background:#f9f7ee;border:1px solid var(--line);font-weight:550;padding:10px 12px;min-height:46px}.section-tabs button:hover:not(:disabled){background:#e3e7dc;color:var(--ink)}.section-tabs [aria-current]{background:var(--wood);border-color:var(--wood);color:#fff9e6}.section-tabs [aria-current]:hover:not(:disabled){background:var(--wood);color:#fff9e6}.section-tabs .menu-icon{width:19px;height:19px}.city-intro{max-width:none;margin-bottom:0}.institution{padding:24px;background:#faf8ef;border:1px solid var(--line);border-top:3px solid #a58d5d;border-radius:5px;margin-bottom:24px}.institution-heading .location-number{font-size:1.7rem}.character-summary{background:#faf8ef;border:1px solid var(--line);border-radius:5px;padding:20px;margin-bottom:20px}.character-summary dl{justify-content:space-between}.character-summary>.small{max-width:78ch}.character-summary .stat-strip{border-top:1px solid var(--line);padding-top:12px;margin-bottom:0}.home-layout{gap:24px}.return-block,.goal-paper{background:#faf8ef;border:1px solid var(--line);border-top:3px solid var(--brass);border-radius:5px;padding:24px;box-shadow:none}.goal-paper .cost-list{margin-block:20px}.next-step{background:#e3e9dc;border-left-color:var(--green);padding:18px}.chapter-note{border:1px solid var(--line);border-radius:5px;padding:12px 20px;background:#faf8ef}.chapter-note>summary{font-family:Georgia,serif;font-size:1.2rem}.chapter-note ol{margin-block:14px}.section-tabs~.npc{margin-block:16px}.project-trail{margin-top:24px;padding:20px;border:1px solid var(--line);background:#faf8ef;border-radius:5px}.project-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}.project-grid article{padding:16px;border:1px solid var(--line);border-top:3px solid var(--brass);border-radius:4px}.project-grid p{font-size:.85rem}.level-track{width:100%;height:10px;accent-color:var(--green);margin:6px 0 12px}.goal-options{display:flex;flex-wrap:wrap;gap:8px}.goal-options .action-wrap{flex:1;min-width:110px}.goal-options button{width:100%;font-size:.85rem}.goal-options .selected{background:var(--wood);color:white}
.city-sections:not([data-section=all])>.institution{display:none}.city-sections[data-section=contracts]>#contracts,.city-sections[data-section=training]>#training,.city-sections[data-section=crime]>#crime,.city-sections[data-section=gathering]>#gathering,.city-sections[data-section=errands]>#errands,.city-sections[data-section=adventures]>#adventures,.city-sections[data-section=adventures]>#party{display:block}.city-sections[data-section=gathering]>#mining{display:none}.character-sections:not([data-section=all])>section,.character-sections:not([data-section=all])>.equipment-layout{display:none}.character-sections[data-section=equipment]>.equipment-layout{display:grid}.character-sections[data-section=skills]>#skills,.character-sections[data-section=party]>#party,.character-sections[data-section=supplies]>#supplies{display:block}
.equipment-layout{gap:24px}.equipment-layout>section{min-width:0}.gear-row{padding:16px;grid-template-columns:64px minmax(0,1fr) auto;align-items:center}.gear-row:has(.gear-art){grid-template-columns:64px minmax(0,1fr) auto}.gear-symbol{padding:0}.gear-symbol .icon,.reward-item>.icon{width:64px;height:64px;padding:12px;border:1px solid var(--rarity-edge);border-radius:5px;background:#ffffff75}.gear-art{width:64px;height:64px;border-radius:5px;border:1px solid var(--rarity-edge);background:#182a20;object-fit:contain}.comparison{color:var(--ink);font-weight:550}.gear-values{font-weight:700}.rarity-card{--rarity-edge:#91836c;--rarity-bg:#f6f3e9;--rarity-ink:#655a46;position:relative;background:var(--rarity-bg);border:1px solid var(--line);border-left:4px solid var(--rarity-edge);border-radius:5px;box-shadow:0 2px 0 #263b3208}.rarity-card.uncommon{--rarity-edge:#427b48;--rarity-bg:#ecf3e6;--rarity-ink:#315f37;background:var(--rarity-bg)}.rarity-card.rare{--rarity-edge:#426da1;--rarity-bg:#eaf0fa;--rarity-ink:#31527f;background:var(--rarity-bg);border-top:1px solid #7b9dbf}.rarity-card.epic{--rarity-edge:#875597;--rarity-bg:#f2eaf8;--rarity-ink:#693b78;background:var(--rarity-bg);border-top:3px double #a381ab;box-shadow:0 3px 0 #87559718}.rarity-card::after{content:'';position:absolute;right:8px;top:8px;width:7px;height:7px;border:1px solid var(--rarity-edge);transform:rotate(45deg);pointer-events:none}.rarity-card.rare::after,.rarity-card.epic::after{background:var(--rarity-edge)}.rarity-card .rarity{color:var(--rarity-ink);font-weight:750}.worn{background:#dbe5d4;border:1px solid #bbcbb0;color:#36553b}.slot-list{background:#faf8ef;border:1px solid var(--line);border-radius:5px;padding:4px 14px}.slot-row:last-child{border-bottom:0}.supplies{margin:0;padding:20px;border:1px solid var(--line);border-radius:5px;background:#faf8ef}.supplies dl{gap:12px}.supplies dl>div{padding:16px}.supplies dt .rarity{display:block}.shop-row,.choice-row,.training-row{gap:16px}.shop-row .gear-art{margin-right:10px}.shop-row:has(.gear-art) h3{display:flex;align-items:center}.shop-row .action-wrap button{min-width:110px}.loot-source{border:1px solid var(--line);border-left:4px solid #958261;border-radius:4px}.adventure-card{border-radius:5px;overflow:hidden}.adventure-card h3{font:1.4rem Georgia,serif}.route-choice{background:#eeeee2;border:1px solid var(--line);padding:16px;margin:12px 0;border-radius:4px}.route-choice .action-wrap{margin-bottom:0}.skill-row{background:#f3f1e7;padding:16px;margin:12px 0;border:1px solid var(--line);border-radius:4px}
dialog{width:min(660px,calc(100% - 24px));max-width:none;border-radius:7px;border-top:4px solid var(--brass);background:#faf8ef;box-shadow:0 16px 80px #15281e55;padding:24px}dialog .dialog-actions{padding-top:16px;border-top:1px solid var(--line)}.reward-gear{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:12px;margin-bottom:20px}.reward-item{padding:20px;text-align:center}.reward-item>.gear-art,.reward-item>.icon{display:block;width:100px;height:100px;margin:4px auto 16px}.reward-item h3{font:1.3rem Georgia,serif;margin-top:10px}.reward-item p{font-size:.82rem}.reward-item>.link-button{text-align:center}.reward-milestone{font:1.35rem Georgia,serif;color:var(--green);padding:12px;border-block:1px solid var(--line)}.reward-materials,.reward-numbers{list-style:none;padding:0;display:flex;flex-wrap:wrap;gap:8px;margin:16px 0}.reward-materials li{padding:10px 14px}.reward-materials .rarity{display:block}.reward-numbers li{padding:8px 12px;background:#e6eddc;border:1px solid #ccd8c0;border-radius:4px;font-size:.9rem}.reward-next{padding:16px;background:#eeeadf;border-radius:4px;margin-top:16px}.reward-next p{font-size:.87rem;margin:6px 0}.dialog-actions button{flex:1}
@media(min-width:1000px){.app-shell{display:grid;grid-template-columns:190px minmax(0,1fr);align-content:start}.topbar,.prototype-strip,.resource-strip,.activity-banner{grid-column:1/-1}.primary-nav{grid-column:1;grid-row:4/span 3;display:flex;flex-direction:column;background:var(--wood);padding:24px 12px;gap:8px;align-self:stretch;border:0}.primary-nav button{color:#dcdacb;text-align:left;border:0;border-radius:4px;padding:14px;min-height:52px}.primary-nav button:hover{background:#355444;color:white}.primary-nav [aria-current]{background:#48624a;color:#fff9e7;border-left:3px solid #c9b582}.app-shell>main,.result-strip,.footer-note{grid-column:2}.app-shell>main{min-width:0;grid-row:4}.app-shell>.result-strip{grid-row:5}.app-shell>.footer-note{grid-row:6}.app-shell:has(.activity-banner) .primary-nav{grid-row:5/span 3}.app-shell:has(.activity-banner)>main{grid-row:5}.app-shell:has(.activity-banner)>.result-strip{grid-row:6}.app-shell:has(.activity-banner)>.footer-note{grid-row:7}}
@media(max-width:760px){.menu-icon{width:21px;height:21px}.primary-nav button{flex-direction:column;gap:3px;font-size:.72rem;justify-content:center;padding:6px 5px}.primary-nav button span{line-height:1.2}.primary-nav{background:#faf8ef}.scene{height:110px}.room-scene{height:95px}.institution{padding:18px 14px}.home-layout{gap:16px}.return-block,.goal-paper{padding:18px}.section-tabs{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;margin:16px 0 20px}.section-tabs button{font-size:.87rem;padding:10px;min-width:0;min-height:46px;text-align:left}.section-tabs .menu-icon{width:18px;height:18px}.character-summary{padding:16px}.character-summary dl{gap:12px}.character-summary dd{font-size:1.3rem}.gear-row,.gear-row:has(.gear-art){grid-template-columns:52px minmax(0,1fr);padding:14px;gap:12px}.gear-row .action-wrap{grid-column:1/-1}.gear-symbol .icon,.gear-row .gear-art{width:52px;height:64px}.gear-symbol .icon{padding:8px}.project-grid{grid-template-columns:1fr}.project-trail{padding:16px}.reward-item{padding:16px}.reward-item>.gear-art,.reward-item>.icon{width:88px;height:88px}.supplies{padding:14px}.supplies dl{grid-template-columns:1fr}.slot-row{grid-template-columns:80px minmax(0,1fr)}dialog{padding:20px;max-height:calc(100dvh - 32px - env(safe-area-inset-top) - env(safe-area-inset-bottom))}
/* The active fight owns the phone viewport; all navigation remains available via Leave fight screen. Content may grow for enlarged user text. */
.in-combat .app-shell{display:block;padding:0;min-height:100dvh}.in-combat .topbar,.in-combat .prototype-strip,.in-combat .primary-nav,.in-combat .footer-note{display:none}.in-combat main{display:flex;padding:calc(10px + env(safe-area-inset-top)) 12px calc(8px + env(safe-area-inset-bottom));min-height:100dvh}.in-combat .combat-screen{display:flex;flex-direction:column;gap:8px;width:100%;min-height:calc(100dvh - 18px - env(safe-area-inset-top) - env(safe-area-inset-bottom))}.in-combat .fight-heading{margin:0}.in-combat .fight-heading h1{font-size:1.3rem}.in-combat .fight-heading .eyebrow{font-size:.72rem}.in-combat .duel-stage{flex:1;align-content:center;margin:0;padding:8px}.in-combat .duelist{--art-height:min(28dvh,220px)}.in-combat .move-grid button{min-height:64px}.in-combat .move-grid small{font-size:.78rem}.in-combat .turn-feedback{padding:0;font-size:.85rem;min-height:0;line-height:1.4}.in-combat .fight-utilities{gap:12px;margin:0;justify-content:space-between;flex-wrap:wrap}.in-combat .fight-utilities button{font-size:.75rem;min-height:44px}.in-combat .fighter-caption{font-size:.85rem}.in-combat .fighter-caption span{font-size:.83rem}.in-combat .intent{margin:0}.in-combat .prototype-strip.sandbox-strip{display:block;padding:4px 12px;font-size:.7rem}.in-combat .app-shell:has(.sandbox-strip) main{min-height:calc(100dvh - 32px)}.in-combat .app-shell:has(.sandbox-strip) .combat-screen{min-height:calc(100dvh - 50px - env(safe-area-inset-top) - env(safe-area-inset-bottom))}}
@media(max-width:760px) and (max-height:500px){.in-combat .duelist{--art-height:12dvh}.in-combat .combat-screen{gap:4px}.in-combat .fight-heading h1{font-size:1.1rem}.in-combat .move-grid button{min-height:54px}.in-combat .move-grid small{display:none}}
/* Account City Ledger: email access to the separate private testing world. */
.account-main{min-height:calc(100dvh - 80px);padding:clamp(20px,5vw,64px);background:var(--paper)}
.account-card{max-width:580px;margin:0 auto;padding:clamp(20px,4vw,36px);background:#faf7ed;border:1px solid var(--line);border-top:5px solid var(--brass);box-shadow:0 10px 28px #15271d18}
.account-card h1{font-size:clamp(1.7rem,5vw,2.4rem);line-height:1.15;margin:8px 0 24px}
.account-tabs{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:24px}
.account-tabs button{background:transparent;color:var(--ink);flex:1}
.account-tabs button[aria-current=page]{background:var(--green);color:#fff}
.account-card form{display:grid;gap:16px}
.account-card label{display:grid;gap:6px;font-weight:650}
.account-card input:not([type=checkbox]){width:100%;min-width:0;font:inherit;padding:11px 12px;border:1px solid var(--brass);border-radius:3px;background:white;color:var(--ink);min-height:44px}
.account-card .account-age{display:flex;align-items:flex-start;gap:10px;line-height:1.5;font-weight:400}
.account-age input{width:22px;height:22px;margin-top:2px;flex-shrink:0;accent-color:var(--green)}
.account-card form p{margin:0;color:var(--muted);font-size:.9rem}
.account-card>p{overflow-wrap:anywhere}.account-card>[data-account-command]{margin:12px 8px 0 0}
.account-card [role=status]:empty{display:none}.account-card [role=status]{padding:12px;border-left:3px solid var(--brass);background:#eee6d4}
.pending-action{border:2px solid var(--brass);background:#f5e9cd;padding:16px;margin-bottom:20px}
[aria-busy=true] button{cursor:progress}
@media(max-width:480px){.account-main{padding:16px}.account-card{padding:20px 16px}.account-tabs button{flex-basis:100%}}
/* Compact City Ledger sections and public wiki help. */
.section-heading{display:flex;align-items:baseline;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:12px}.section-heading h2{margin:0}
.wiki-help{display:inline-flex;align-items:center;min-height:44px;padding:8px 0;color:var(--green);font-size:.85rem;font-weight:650;text-underline-offset:3px;white-space:nowrap}
.wiki-help:focus-visible{outline:3px solid var(--brass);outline-offset:4px}.compact-facts{color:var(--muted);font-size:.88rem;line-height:1.5;margin:8px 0}.risk-note{font-size:.88rem;color:var(--wax);margin:8px 0}
.compact-actions{display:flex;flex-wrap:wrap;gap:8px;margin:14px 0}.compact-actions .action-wrap{flex:1 1 145px}
.recipe-row{display:grid;grid-template-columns:144px minmax(0,1fr) 140px;gap:20px;align-items:center;padding:22px 0;border-bottom:1px solid var(--line)}.recipe-row h3{margin:0 0 5px}.recipe-row p{margin:5px 0;font-size:.88rem}.recipe-row .recipe-status{color:var(--brass);font-size:.78rem;font-weight:700}.recipe-row .recipe-ingredients{color:var(--ink);font-weight:600}.recipe-row small{font-size:.78rem;color:var(--muted)}
.goal-paper>.recipe-art{float:right;margin:0 0 12px 16px}.goal-paper .segmented{clear:both}.supplies dl div{grid-template-columns:1fr auto;align-items:center}.account-card>.wiki-help{margin-top:8px}.fight-utilities{flex-wrap:wrap}.fight-utilities .wiki-help{font-size:.8rem}
@media(max-width:650px){.recipe-row{grid-template-columns:100px minmax(0,1fr);gap:12px;padding:18px 0}.recipe-row>.action-wrap{grid-column:2}.goal-paper>.recipe-art{width:100px;height:100px}.section-heading{gap:4px}.section-heading .wiki-help{font-size:.8rem}}
/* Generated crafting atlas: distinct painted outputs, one compressed shared asset. */
.recipe-art{display:block;width:min(100%,144px);max-width:100%;aspect-ratio:1;flex:0 0 auto;background-image:url('assets/crafting/recipe-atlas-v1.webp');background-size:400% 400%;background-repeat:no-repeat;background-color:#17261c;border-radius:5px;border:1px solid #78613c;box-shadow:inset 0 0 0 1px #ffffff14}
.recipe-art--signalRing{background-position:0% 0%}
.recipe-art--sabre{background-position:33.333333333333336% 0%}
.recipe-art--bandage{background-position:66.66666666666667% 0%}
.recipe-art--ironPick{background-position:100% 0%}
.recipe-art--ironHatchet{background-position:0% 33.333333333333336%}
.recipe-art--fletchingBow{background-position:33.333333333333336% 33.333333333333336%}
.recipe-art--ward{background-position:66.66666666666667% 33.333333333333336%}
.recipe-art--breakwater{background-position:100% 33.333333333333336%}
.recipe-art--dockKnife{background-position:0% 66.66666666666667%}
.recipe-art--spanBow{background-position:33.333333333333336% 66.66666666666667%}
.recipe-art--bellMaul{background-position:66.66666666666667% 66.66666666666667%}
.recipe-art--ironMantle{background-position:100% 66.66666666666667%}
.recipe-art--poultice{background-position:0% 100%}
.recipe-art--fieldKit{background-position:33.333333333333336% 100%}
.recipe-art--dressing{background-position:66.66666666666667% 100%}
.recipe-art--home{background-position:100% 100%}
@media(max-width:650px){.recipe-art{width:100px}}


/* Illustrated starter equipment; named tiles also serve reward and shop cards. */
.starter-gear{display:inline-block;vertical-align:middle;flex-shrink:0;background-image:url('assets/gear/starter-gear-atlas-v1.webp');background-size:300% 200%;background-repeat:no-repeat}
.starter-gear--loanSword{background-position:0% 0%}
.starter-gear--quayBlade{background-position:50% 0%}
.starter-gear--watchHelm{background-position:100% 0%}
.starter-gear--ropeGloves{background-position:0% 100%}
.starter-gear--bridgeCoat{background-position:50% 100%}
.starter-gear--signalSabre{background-position:100% 100%}
@media(max-width:760px){.gear-row .starter-gear{height:52px}}

.contract-row:has(.contract-reward-art){grid-template-columns:64px minmax(0,1fr) auto}.contract-reward-art>.gear-art{width:64px;height:64px}
@media(max-width:760px){.contract-row:has(.contract-reward-art){grid-template-columns:48px minmax(0,1fr)}.contract-reward-art>.gear-art{width:48px;height:48px}}

/* Gear routes stay separate from the inventory and use concise illustrated cards. */
.target-gear{display:inline-block;vertical-align:middle;flex-shrink:0;background-image:url('assets/gear/target-gear-atlas-v1.webp');background-size:300% 200%;background-repeat:no-repeat}
.target-gear--spanShield{background-position:0% 0%}
.target-gear--saltMitts{background-position:50% 0%}
.target-gear--heartTorque{background-position:100% 0%}
.target-gear--floodHood{background-position:0% 100%}
.target-gear--chainGrips{background-position:50% 100%}
.target-gear--ironMantle{background-position:100% 100%}
.character-sections[data-section=targets]>#targets{display:block}.target-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,245px),1fr));gap:16px;margin:16px 0}.gear-target{padding:18px;min-width:0}.target-item{display:flex;gap:12px;align-items:center;margin-bottom:12px}.target-item>.gear-art{width:80px;height:80px}.target-item>.icon{width:64px;height:64px}.target-item>div{min-width:0}.target-item h3{margin:6px 0}.target-item p,.target-route,.target-comparison,.target-blocker{font-size:.82rem;line-height:1.5;overflow-wrap:anywhere}.target-status{font-size:.76rem;font-weight:750;color:var(--green)}.target-comparison{color:var(--muted)}.target-blocker{padding-left:10px;border-left:2px solid var(--brass)}.gear-target progress{width:100%;height:10px;accent-color:var(--green);margin-bottom:8px}.target-more{border-top:1px solid var(--line);margin:16px 0}.target-alternatives summary{font-size:.8rem}.target-alternatives p{font-size:.82rem}.target-alternatives .link-button{font-size:.82rem}.target-more>summary{font-size:.9rem}
@media(max-width:760px){.gear-row .target-gear{height:52px}.target-grid{grid-template-columns:1fr}.target-item>.gear-art{width:72px;height:72px}}

/* Preparation stays readable beside gear routes and collapses on adventure cards. */
.raid-preparation{margin:16px 0;border:1px solid var(--line);padding:16px;border-radius:4px;min-width:0}
.raid-preparation summary{cursor:pointer;font-weight:650}
.raid-prep-list{list-style:none;margin:12px 0;padding:0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 16px}
.raid-prep-list li{display:grid;grid-template-columns:minmax(0,1fr) auto;column-gap:10px;padding:8px 0;border-bottom:1px solid var(--line);font-size:.82rem;line-height:1.5}
.raid-prep-list li>span{grid-column:1;overflow-wrap:anywhere;color:var(--muted)}
.raid-prep-list li>b{grid-column:2;grid-row:1/3;align-self:center;font-size:.75rem;color:var(--green)}
.raid-preparation .link-button{margin-right:12px}
@media(max-width:650px){.raid-prep-list{grid-template-columns:1fr}.raid-preparation{padding:12px}}
