/* Cinematic Admiralty skin — behavior stays in app.js */
:root{--ink:#03090e;--navy:#07141d;--glass:rgba(8,21,29,.78);--glass-heavy:rgba(5,15,22,.94);--brass:#d6b36a;--brass-hi:#f0d99a;--ice:#eaf3f6;--mist:#8fa4ad;--line:rgba(214,179,106,.24);--danger:#b74e4e;--success:#387a5d}
html{background:var(--ink)}body{min-height:100dvh;background:#03090e;color:var(--ice);font-family:Inter,ui-sans-serif,system-ui,-apple-system,"Segoe UI",sans-serif;overflow-x:hidden}
body:before{content:"";position:fixed;inset:0;z-index:-5;background:radial-gradient(ellipse at 50% 18%,rgba(66,104,121,.22),transparent 42%),linear-gradient(180deg,#071119,#02070b 74%)}
.ambient-bg{position:fixed;inset:-28px;z-index:-4;background-size:cover;background-position:center;filter:blur(24px) saturate(.72) brightness(.3);opacity:.78;transform:scale(1.08);transition:opacity .45s ease}
.ambient-bg:after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,rgba(1,6,10,.28),#03090edb 64%,#03090e 90%)}
.sea-haze{position:fixed;inset:42% -20% -10%;z-index:-3;pointer-events:none;opacity:.42;background:repeating-radial-gradient(ellipse at 50% 100%,transparent 0 26px,rgba(154,190,199,.08) 28px 30px,transparent 33px 55px);filter:blur(2px);animation:haze 16s ease-in-out infinite alternate}
header{height:78px;max-width:760px;padding:env(safe-area-inset-top) 20px 0;margin:auto;border-bottom:1px solid rgba(214,179,106,.16);position:relative;z-index:5}.mark{display:grid;place-items:center;line-height:1;width:38px;height:38px;border:1px solid var(--line);color:var(--brass-hi);font-size:18px;clip-path:polygon(12% 0,88% 0,100% 50%,88% 100%,12% 100%,0 50%)}.brand{flex:1}.brand small,.dialog-head small,.report-kicker{display:block;color:var(--brass);font-size:9px;font-weight:800;letter-spacing:.22em}.brand h1{margin:2px 0 0;font-family:Georgia,"Times New Roman",serif;font-size:20px;font-weight:500;letter-spacing:.025em}.icon{width:42px;height:42px;display:grid;place-items:center;line-height:1;letter-spacing:0;padding:0;border:1px solid transparent!important;border-radius:2px!important;color:#d9e4e8}.icon:hover,.icon:focus-visible{border-color:var(--line)!important;background:rgba(214,179,106,.08)}
main{max-width:760px;padding:clamp(12px,3vh,28px) 16px 42px}.card{position:relative;min-height:min(720px,calc(100dvh - 120px));overflow:hidden;border:1px solid rgba(229,203,147,.24);border-radius:5px;background:rgba(2,8,13,.82);box-shadow:0 35px 90px #000b,0 0 0 1px #000 inset;isolation:isolate;touch-action:pan-y;will-change:transform}.card:before,.result-panel:before{content:"";position:absolute;inset:7px;z-index:3;border:1px solid rgba(214,179,106,.13);pointer-events:none}.image-wrap{isolation:isolate;contain:paint;position:absolute;inset:0;background:radial-gradient(ellipse at 50% 32%,#173747 0,#081923 42%,#030b10 78%);aspect-ratio:auto;touch-action:pan-y}.image-wrap img{width:100%;height:100%;object-fit:contain;object-position:center 22%;filter:saturate(.92) contrast(1.04);transform:none;transition:filter .4s ease}.card:not(.swiping):hover .image-wrap img{filter:saturate(1.02) contrast(1.06)}.vignette{position:absolute;inset:0;z-index:2;background:linear-gradient(180deg,rgba(0,6,10,.08) 18%,rgba(2,8,13,.24) 42%,rgba(2,8,13,.55) 71%,rgba(2,8,13,.72) 94%),linear-gradient(90deg,rgba(1,6,9,.26),transparent 35% 70%,rgba(1,6,9,.2));pointer-events:none}.source{top:20px;right:20px;border:1px solid var(--line);border-radius:2px;background:rgba(2,9,14,.82);color:#c7d4d8;text-transform:uppercase;letter-spacing:.13em;font-size:9px}.drag-hint{position:absolute;top:50%;left:50%;translate:-50% -50%;opacity:.36;color:white;font-size:9px;letter-spacing:.22em;text-shadow:0 2px 12px #000;pointer-events:none}.ship-copy{position:relative;z-index:2;margin-top:min(48dvh,390px);padding:22px 26px 8px}.eyebrow{display:inline-flex;align-items:center;min-height:28px;border-block:1px solid var(--line);color:var(--brass-hi);font-size:10px;font-weight:750;letter-spacing:.19em}.ship-copy h2{margin:12px 0 13px;font:400 clamp(42px,12vw,72px)/.92 Georgia,"Times New Roman",serif;letter-spacing:-.035em;text-shadow:0 4px 28px #000}.ship-copy p{max-width:600px;min-height:48px;margin:0;color:#c5d1d5;font-size:14px;line-height:1.5}.actions{position:relative;z-index:2;padding:15px 26px 25px;gap:9px}.actions button,button{border-radius:2px;border-color:rgba(214,179,106,.24)!important;background:rgba(12,31,43,.92)!important;color:var(--ice)!important;font-size:11px;font-weight:700;letter-spacing:.16em;text-transform:uppercase;min-height:50px}.primary{background:linear-gradient(135deg,#e3c179,#b89247)!important;border-color:#f5dc9f!important;color:#040d14!important}.quiet{background:transparent!important;border-color:transparent!important;color:var(--mist)!important}.danger-soft{background:linear-gradient(135deg,#7d4549,#563137)!important;border-color:#a9656b!important;color:#f7e3e5!important}#another{background:linear-gradient(135deg,#41677b,#2b4859)!important;border-color:#64899b!important}#quickWin,#saveResult,#saveSnapshot{background:linear-gradient(135deg,#46755f,#2d5342)!important;border-color:#67927d!important}#quickLoss{background:linear-gradient(135deg,#85494f,#5b3036)!important;border-color:#aa6870!important}#settingsBtn{background:linear-gradient(135deg,#526978,#344956)!important;border-color:#6d8390!important}#manualBtn{background:linear-gradient(135deg,#385f75,#294759)!important;border-color:#5b8195!important}#play{background:linear-gradient(135deg,#e8c56f,#b98b38)!important;border-color:#f4d98f!important;color:#111820!important;box-shadow:0 7px 20px rgba(214,179,106,.2)}#another{background:linear-gradient(135deg,#527f98,#355d73)!important;border-color:#76a0b5!important;color:#f3f9fb!important}#unowned{background:linear-gradient(135deg,#98565d,#6e3940)!important;border-color:#bd737b!important;color:#fff2f3!important}#skipResult{background:linear-gradient(135deg,#4c6575,#324956)!important;border:1px solid #718793!important;color:#edf5f7!important}button:disabled{filter:saturate(.35);opacity:.55}button:focus-visible{outline:2px solid #f0d99a;outline-offset:2px}.card.swiping{transition:none}.card.swipe-reset{transition:transform .25s cubic-bezier(.2,.9,.3,1.2)}.card.swipe-exit-left{transform:translateX(-130vw) rotate(-18deg)!important;transition:transform .23s ease-in}.card.swipe-exit-right{transform:translateX(130vw) rotate(18deg)!important;transition:transform .23s ease-in}.swipe-stamp{position:absolute;z-index:4;top:22px;padding:7px 10px;border:3px solid;border-radius:9px;font-weight:900;letter-spacing:.08em;opacity:0;pointer-events:none;text-shadow:0 2px 5px #000}.swipe-left{right:18px;color:#e4b961;border-color:#e4b961;transform:rotate(8deg);opacity:var(--left-opacity,0)}.swipe-right{left:18px;color:#ff776d;border-color:#ff776d;transform:rotate(-8deg);opacity:var(--right-opacity,0)}.fx-layer{position:fixed;inset:0;z-index:9999;pointer-events:none;overflow:hidden}.fx-layer.flash{animation:fx-flash .35s ease-out}.fx-ring,.fx-spark,.fx-smoke{position:absolute;display:block;pointer-events:none}.fx-ring{width:16px;height:16px;border:4px solid #ffc45b;border-radius:50%;transform:translate(-50%,-50%);animation:fx-ring .65s ease-out forwards}.fx-spark{width:7px;height:3px;border-radius:5px;background:#ffd56d;box-shadow:0 0 10px #ff8c25;transform:translate(-50%,-50%);animation:fx-spark .7s var(--delay) cubic-bezier(.2,.8,.2,1) forwards}.fx-smoke{width:38px;height:38px;border-radius:50%;background:radial-gradient(circle,#c7d0d5aa,#4f5b6277 45%,transparent 72%);transform:translate(-50%,-50%);animation:fx-smoke .95s var(--delay) ease-out forwards}.fx-layer.victory .fx-ring{border-color:#ffd35d}.fx-layer.victory .fx-spark{background:#fff2a6;box-shadow:0 0 14px #ffb21c}.fx-layer.defeat .fx-ring{border-color:#ff665b}.fx-layer.defeat .fx-spark{background:#ff8a67;box-shadow:0 0 14px #e52d20}
.recent-form{margin:14px 0 0;padding:14px 16px;border:1px solid rgba(214,179,106,.2);border-radius:3px;background:linear-gradient(145deg,rgba(17,40,52,.9),rgba(6,20,28,.94));box-shadow:0 12px 35px #0006}.form-head{display:flex;align-items:center;justify-content:space-between;gap:12px;color:var(--brass);font-size:9px;font-weight:800;letter-spacing:.16em}.form-head strong{font-size:13px;letter-spacing:0}.form-head strong.positive{color:#7ed7a8}.form-head strong.negative{color:#e38a91}.form-metrics{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-top:10px}.impact-counter{min-width:0;padding:10px 6px 8px;text-align:center;border:1px solid;background:rgba(3,14,21,.56);box-shadow:inset 0 1px rgba(255,255,255,.03)}.impact-counter strong{display:block;font:500 clamp(24px,7vw,37px)/1 Georgia,"Times New Roman",serif;letter-spacing:-.035em;text-shadow:0 2px 14px currentColor}.impact-counter span{display:block;margin-top:5px;font-size:8px;font-weight:800;letter-spacing:.15em;color:var(--mist)}.impact-counter small{display:block;margin-top:3px!important;font-size:9px!important;color:inherit!important}.impact-counter.gold{color:#f2cc73;border-color:rgba(232,197,111,.55);box-shadow:0 0 20px rgba(214,179,82,.12),inset 0 0 18px rgba(214,179,82,.06)}.impact-counter.silver{color:#c8d3d8;border-color:rgba(184,202,210,.38);box-shadow:0 0 18px rgba(173,198,210,.08),inset 0 0 16px rgba(173,198,210,.04)}.impact-counter.red{color:#e47b82;border-color:rgba(207,91,101,.5);box-shadow:0 0 18px rgba(180,57,67,.1),inset 0 0 16px rgba(180,57,67,.05)}.recent-form>small{display:block;margin-top:8px;color:var(--mist);font-size:10px}.loading{min-height:66dvh}.loading p{font-size:10px;letter-spacing:.18em;text-transform:uppercase}.radar{width:90px;height:90px;border-color:rgba(214,179,106,.18);border-top-color:var(--brass);box-shadow:0 0 40px rgba(214,179,106,.1)}
.result-panel{position:relative;overflow:hidden;border-radius:5px;border:1px solid var(--line);background:linear-gradient(155deg,rgba(11,30,41,.96),rgba(3,12,18,.98));box-shadow:0 35px 90px #000a;padding:32px}.report-kicker{margin-bottom:18px}.outcome-choice>p,.outcome-details>p,.entry-method>p{color:var(--mist);font-size:13px;line-height:1.5}.outcome-details{margin:14px 0;padding:18px;border:1px solid rgba(214,179,106,.2);background:rgba(8,25,35,.72)}.outcome-details h3,.entry-method h3{margin:0 0 7px;font:400 22px/1.2 Georgia,serif}.detail-options{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:18px 0}.detail-check{display:flex;align-items:center;gap:10px;min-height:52px;padding:10px;border:1px solid var(--line);background:rgba(15,42,56,.7)}.detail-check input{width:22px;height:22px;accent-color:var(--brass)}.outcome-actions{display:grid;grid-template-columns:1fr auto;gap:9px}.outcome-actions .primary{grid-column:auto}.outcome-actions .loss{background:linear-gradient(135deg,#85494f,#5b3036)!important;border-color:#aa6870!important;color:#fff!important}.entry-method-buttons{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:16px}.result-actions{margin-top:30px;padding-top:18px;border-top:1px solid rgba(214,179,106,.14)}.entry-method-buttons button{min-height:58px;background:linear-gradient(135deg,#385f75,#294759)!important;border-color:#5b8195!important}.entry-method{margin-top:16px;padding:18px;border:1px solid rgba(214,179,106,.2);background:rgba(8,25,35,.72)}.entry-actions{display:grid;grid-template-columns:1fr auto;gap:9px;margin-top:14px}.entry-actions .quiet{min-width:100px}#latestOutcomeRow{display:grid;gap:8px;margin:15px 0;color:var(--mist);font-size:13px}#latestOutcome{min-height:48px;padding:10px;border:1px solid var(--line);border-radius:2px;background:rgba(4,18,27,.82);color:var(--ice)}.realign-method{margin-top:16px}.result-head strong{font:400 clamp(37px,10vw,60px)/1 Georgia,serif}.favorite-inline{border-block:1px solid rgba(214,179,106,.13);padding:11px 0}.match-flags{padding:10px 0}.top3-select select,.counters input,.tools input{border-radius:2px;background:rgba(4,18,27,.82);border-color:rgba(171,199,210,.2)}.quick-results button{border-radius:2px;min-height:64px;letter-spacing:.16em}.quick-results .win{background:linear-gradient(135deg,#3f8564,#24543f)}.quick-results .loss{background:linear-gradient(135deg,#8d454c,#5c2930)}.advanced-result{border-color:var(--line)}
dialog{border-radius:5px;border-color:var(--line);background:var(--glass-heavy);backdrop-filter:blur(24px) saturate(.8);box-shadow:0 35px 100px #000d}.dialog-head{border-color:var(--line);padding:18px 20px}dialog#settings{overflow-y:auto}.sticky-head{position:sticky;top:0;z-index:12;background:rgba(3,12,18,.98);backdrop-filter:blur(20px);padding-top:max(18px,env(safe-area-inset-top))}.sticky-tools{position:sticky;top:79px;z-index:11;background:rgba(3,12,18,.96);backdrop-filter:blur(20px);border-bottom:1px solid var(--line)}.sticky-head .icon{min-width:44px;min-height:44px}.dialog-head h2{margin:3px 0 0!important;font:400 27px/1 Georgia,serif}.dialog-head small{margin-bottom:3px}.period-tabs{background:rgba(3,12,18,.96);border-color:var(--line)}.period-tabs button{border-radius:2px;background:transparent}.period-tabs button.on{background:linear-gradient(135deg,var(--brass-hi),var(--brass))!important;border-color:#f3d893!important;color:#07131a!important;box-shadow:0 0 16px rgba(214,179,106,.24)}.kpi,.trend-card,.stats-section{border-radius:2px;border-color:rgba(214,179,106,.17);background:linear-gradient(145deg,rgba(17,40,52,.82),rgba(6,20,28,.9));box-shadow:none}.kpi{position:relative;overflow:hidden}.kpi:after{content:"";position:absolute;inset:auto 0 0;height:2px;background:linear-gradient(90deg,var(--brass),transparent)}.kpi strong{font:400 29px Georgia,serif}.kpi span,.rank-meta,.sample-note{color:var(--mist)}.stats-section h3{color:#eaf1f3;font-weight:400}.rank-fill,.day-bar{background:linear-gradient(var(--brass-hi),#86672f)}.ship-row{border-color:rgba(214,179,106,.12)}.favorite-toggle{display:grid;place-items:center;width:48px;min-width:48px!important;height:48px;min-height:48px!important;padding:0!important;border:1px solid #66727a!important;background:linear-gradient(135deg,#3b454c,#252d33)!important;color:#b7c0c5!important;font-size:24px!important;line-height:1!important;letter-spacing:0!important;box-shadow:inset 0 0 0 1px rgba(255,255,255,.03)}.favorite-toggle.on{border-color:#f2d384!important;background:linear-gradient(135deg,#e8c56f,#a97928)!important;color:#16130b!important;box-shadow:0 0 18px rgba(222,179,82,.28),inset 0 1px 0 rgba(255,255,255,.25)}.dialog-head .head-title{flex:1;min-width:0}.lang-toggle{display:inline-flex;margin-right:10px;border:1px solid var(--line);border-radius:2px;overflow:hidden}.lang-toggle button{display:inline-flex;align-items:center;justify-content:center;line-height:1;min-width:38px;min-height:36px;padding:0 10px!important;border:0!important;border-radius:0!important;background:transparent!important;color:var(--mist)!important;font-size:11px;letter-spacing:0}.lang-toggle button.on{background:var(--brass)!important;color:#07131a!important}
.daily-chart{height:170px;align-items:stretch;padding-top:24px}.day-column{position:relative;display:flex;flex:1;min-width:0;flex-direction:column;justify-content:flex-end;align-items:stretch;height:100%}.day-rate{text-align:center;color:var(--brass-hi);font-size:10px;font-weight:800;white-space:nowrap}.day-column .day-bar{flex:none;width:100%;min-height:2px}.day-label{text-align:center;color:var(--mist);font-size:9px;margin-top:4px}.history-dialog{overflow-y:auto;max-width:640px}.history-list{display:flex;flex-direction:column;gap:10px;padding:16px 20px 24px}.history-row{display:grid;grid-template-columns:1fr auto;gap:10px 12px;padding:14px;border:1px solid rgba(214,179,106,.16);border-radius:2px;background:linear-gradient(145deg,rgba(17,40,52,.82),rgba(6,20,28,.9))}.history-info strong{display:block;font:400 18px Georgia,serif;color:var(--ice)}.history-info small{display:block;margin-top:3px;color:var(--mist);font-size:12px}.history-tags{display:flex;flex-wrap:wrap;gap:6px;align-items:center}.history-outcome{font-size:11px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;padding:4px 9px;border-radius:2px}.history-outcome.win{background:linear-gradient(135deg,#3f8564,#24543f);color:#eafaf1}.history-outcome.loss{background:linear-gradient(135deg,#8d454c,#5c2930);color:#ffeef0}.history-flags{color:var(--mist);font-size:12px}.history-actions{display:flex;gap:8px;justify-content:flex-end;grid-column:1/-1}.history-actions button{min-height:44px;padding:0 14px}.history-edit{background:linear-gradient(135deg,#385f75,#294759)!important;border-color:#5b8195!important}.history-delete{background:linear-gradient(135deg,#7d4549,#563137)!important;border-color:#a9656b!important;color:#f7e3e5!important}.history-edit-form{display:grid;gap:12px;grid-column:1/-1}.history-edit-form select{min-height:48px;padding:10px;border:1px solid var(--line);border-radius:2px;background:rgba(4,18,27,.82);color:var(--ice)}.history-edit-actions{display:flex;gap:9px}.history-edit-actions button{flex:1;min-height:46px}
@keyframes haze{to{transform:translate3d(4%,1%,0) scale(1.04)}}
@media(max-width:520px){header{height:68px;padding-inline:14px}.brand small{font-size:8px}.card{min-height:calc(100dvh - 98px)}.ship-copy{margin-top:48dvh;padding:18px 20px 6px}.ship-copy h2{font-size:clamp(39px,13vw,58px)}.ship-copy p{font-size:13px}.actions{padding:13px 20px 20px}.drag-hint{top:46%;opacity:.52}.result-panel{padding:26px 20px}.match-flags{grid-template-columns:1fr}.top3-select{margin-bottom:2px}.division-check{min-height:46px}.quick-results{grid-template-columns:1fr 1fr}.quick-results button{min-height:60px}.detail-options{grid-template-columns:1fr}.outcome-actions,.entry-actions{grid-template-columns:1fr}.entry-method-buttons{grid-template-columns:1fr 1fr}.kpi-grid{grid-template-columns:repeat(2,1fr)}}
@media(max-height:720px){.card{min-height:610px}.ship-copy{margin-top:320px}.image-wrap{aspect-ratio:auto}}
@media(prefers-reduced-motion:reduce){.sea-haze{animation:none}.image-wrap img,.ambient-bg{transition:none}.card:hover .image-wrap img{transform:none}}
.onboarding{min-height:100dvh;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:18px;padding:32px 20px;text-align:center;position:relative}
.onb-lang{position:absolute;top:max(14px,env(safe-area-inset-top));right:14px;margin:0}
.onb-brand .mark{font-size:30px;color:var(--gold)}.onb-brand small{display:block;color:var(--gold);font-size:11px;letter-spacing:.2em;margin-top:6px}.onb-brand h1{font:700 30px Georgia,serif;margin:4px 0 0}
.onb-panel{width:min(94vw,420px);display:flex;flex-direction:column;gap:12px}
.onb-tagline{margin:10px 0 0;font:italic 14px/1.4 Georgia,serif;color:var(--brass)}
.onb-intro,.onb-warn{color:var(--muted);font-size:14px;line-height:1.5;margin:0}.onb-warn{color:#ffcb83}
.onb-panel .primary,.onb-panel .secondary,.onb-panel .quiet{width:100%}
.secondary{border:1px solid var(--line);border-radius:2px;background:transparent;color:var(--brass);padding:13px;font-weight:650}
.onb-panel input[type=text]{background:#102c3e;border:1px solid var(--line);border-radius:2px;padding:14px;color:#fff;text-align:center;font-family:ui-monospace,SFMono-Regular,monospace;letter-spacing:.12em}
.code-display{font-family:ui-monospace,SFMono-Regular,monospace;font-size:clamp(15px,4.6vw,21px);letter-spacing:.1em;background:#081722;border:1px solid var(--line);border-radius:2px;padding:18px 12px;color:var(--gold);word-break:break-all;line-height:1.6}
.nickname-field{display:flex;flex-direction:column;gap:7px;text-align:left;color:var(--muted);font-size:13px}
.nickname-field input{text-align:left;letter-spacing:0;font-family:inherit}
.onb-panel .error{text-align:center}
.settings-footer{display:flex;flex-wrap:wrap;gap:8px;padding:14px 20px;border-top:1px solid var(--line);position:sticky;bottom:0;background:rgba(3,12,18,.98)}
.settings-footer button{flex:1;min-width:110px}

/* menu (burger): flat squared list, matches the brass/line theme */
.menu-list{display:flex;flex-direction:column;gap:10px;padding:16px 20px 0}
.menu-list-last{padding-bottom:20px}
.menu-row{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;padding:15px 16px;background:rgba(255,255,255,.03)!important;border:1px solid var(--line)!important;border-radius:2px!important;color:var(--ice)!important;font:inherit;font-size:.78rem;letter-spacing:.12em;text-transform:uppercase;text-align:left;cursor:pointer;min-width:0}
.menu-row:active{background:rgba(214,179,106,.12)!important}
.menu-row .chev{color:var(--brass);font-style:normal;font-size:1.05rem;line-height:1}
.menu-row.danger{color:var(--danger)!important;border-color:rgba(183,78,78,.45)!important}
.menu-lang{cursor:default}
.menu-lang .lang-toggle{margin:0}
.menu-divider{margin:20px 20px 0;padding-bottom:2px;font-size:.62rem;letter-spacing:.2em;text-transform:uppercase;color:var(--mist);border-bottom:1px solid var(--line)}
.back{display:inline-flex;align-items:center;gap:6px;flex:0 0 auto;margin-right:14px;background:transparent!important;border:1px solid var(--line)!important;border-radius:2px!important;color:var(--brass)!important;padding:9px 12px!important;font-size:.68rem;letter-spacing:.12em;text-transform:uppercase;min-width:auto!important;line-height:1;white-space:nowrap}
.dialog-head{gap:12px}
/* onboarding wizard */
.onb-features{list-style:none;padding:0;margin:0 0 18px;display:grid;gap:14px;text-align:left}
.onb-features li{display:flex;gap:12px;align-items:flex-start}
.onb-features span{font-size:1.35rem;line-height:1.2}
.onb-features strong{display:block;margin-bottom:2px}
.onb-features small{opacity:.72;line-height:1.35}
.onb-dots{display:flex;gap:8px;justify-content:center;margin:16px 0 0}
.onb-dots i{width:8px;height:8px;border-radius:50%;background:rgba(255,255,255,.22)}
.onb-dots i.on{background:var(--brass)}
.install-steps{display:grid;gap:8px;text-align:left;margin:0 0 16px;opacity:.9;line-height:1.4}
.onb-saved{margin:14px 0 4px;justify-content:center}
.onb-panel button:disabled{opacity:.45;pointer-events:none}
/* pending reports queue */
.queue-btn{width:100%;margin-top:12px;border:1px dashed var(--line)!important;border-radius:2px!important;background:rgba(214,179,106,.06)!important;color:var(--brass)!important;padding:12px 14px;font-size:.7rem;letter-spacing:.08em;text-transform:uppercase;line-height:1.5}
.queued-list{display:flex;flex-direction:column}
.queued-row{display:flex;align-items:center;gap:10px;padding:10px 0;border-bottom:1px solid var(--line)}
.queued-row:last-child{border-bottom:none}
.queued-info{flex:1;min-width:0;display:flex;flex-direction:column}
.queued-info small{color:var(--mist)}
.queued-record{border:1px solid var(--line)!important;border-radius:2px!important;background:rgba(214,179,106,.1)!important;color:var(--brass)!important;padding:8px 12px;font-size:.68rem;letter-spacing:.08em;text-transform:uppercase;min-width:auto!important}
.queued-discard{min-width:auto!important;padding:8px 10px;font-size:.68rem;letter-spacing:.06em;text-transform:uppercase}
.result-name{display:flex;align-items:center;justify-content:space-between;gap:14px;margin-top:2px}
.result-name strong{min-width:0;overflow-wrap:anywhere}
.onb-note{margin:0 0 18px;padding:12px 14px;border:1px solid var(--line);border-left:3px solid var(--brass);border-radius:2px;background:rgba(214,179,106,.06);text-align:left;font-size:.82rem;line-height:1.45;color:var(--ice)}
.app-modal{width:min(90vw,380px);height:fit-content;min-height:0;max-height:80dvh;margin:auto;padding:22px;border-radius:2px;text-align:center}
.app-modal::backdrop{background:rgba(2,8,13,.72);backdrop-filter:blur(3px)}
.app-modal p{margin:0 0 18px;white-space:pre-line;line-height:1.5;font-size:.92rem}
.modal-actions{display:flex;gap:10px;justify-content:center}
.modal-actions button{min-width:110px}
/* swipe everywhere on the card: the image must not hijack pointer/drag */
.image-wrap img{pointer-events:none;-webkit-user-drag:none;user-select:none}
.card{cursor:grab}
.card.swiping{cursor:grabbing}
.card button{cursor:pointer}
/* quiet = ghost button: still secondary, but it LOOKS tappable */
.quiet{background:transparent!important;border:1px solid var(--line)!important;border-radius:2px!important;color:#b9c7cd!important;padding:12px 16px!important;min-height:46px}
.quiet:active{background:rgba(214,179,106,.1)!important}
/* copy-code feedback */
@keyframes copy-pop{0%{transform:scale(1)}30%{transform:scale(.96)}65%{transform:scale(1.03);box-shadow:0 0 0 7px rgba(214,179,106,.16)}100%{transform:scale(1);box-shadow:0 0 0 0 rgba(214,179,106,0)}}
.copy-pop{animation:copy-pop .55s ease;border-color:var(--brass)!important;color:var(--brass-hi)!important}
@keyframes copy-glow{0%{border-color:var(--line)}40%{border-color:var(--brass-hi);box-shadow:0 0 22px rgba(214,179,106,.25)}100%{border-color:var(--line);box-shadow:none}}
.copy-glow{animation:copy-glow 1.2s ease}
@media (prefers-reduced-motion:reduce){.copy-pop,.copy-glow{animation:none}}
.section-help{margin:6px 20px 8px;font-size:.78rem;line-height:1.45;color:var(--mist)}
/* section titles inside dialogs (was unstyled after the menu redesign) */
.menu-section{margin:18px 20px 0;font-size:.72rem;letter-spacing:.16em;text-transform:uppercase;color:var(--mist);text-align:left}
.stats-empty.compact{min-height:0;padding:10px 20px 24px}
.show-more{margin-top:2px}
/* brand mark: the real app icon (same file as favicon and installed icon),
   not the ⚓ emoji, which every OS drew differently */
img.mark{width:38px;height:38px;border:none!important;clip-path:none;border-radius:4px;object-fit:contain;padding:0}
.onb-brand img.mark{width:60px;height:60px;margin:0 auto;border-radius:8px}
/* taste preferences */
.pref-groups{display:flex;flex-direction:column;gap:18px;padding:16px 20px 4px;text-align:left}
.pref-group h3{margin:0 0 9px;font-size:.68rem;letter-spacing:.16em;text-transform:uppercase;color:var(--brass)}
.pref-chips{display:flex;flex-wrap:wrap;gap:8px}
.pref-chip{min-height:40px!important;padding:9px 13px!important;min-width:auto!important;border:1px solid var(--line)!important;border-radius:2px!important;background:rgba(255,255,255,.03)!important;color:#c3ced3!important;font-size:.7rem;letter-spacing:.06em;text-transform:uppercase}
.pref-chip.on{background:linear-gradient(135deg,var(--brass-hi),var(--brass))!important;border-color:var(--brass-hi)!important;color:#08131a!important;font-weight:750}
#onbPrefChips{padding:0 0 6px}
/* undo bar: sits under the header, clear of the card's action buttons */
.undo-bar{position:fixed;top:calc(78px + env(safe-area-inset-top) + 8px);left:50%;transform:translateX(-50%);z-index:60;display:flex;align-items:center;gap:10px;width:max-content;max-width:min(90vw,420px);padding:8px 10px;overflow:hidden;border:1px solid var(--line);border-radius:2px;background:var(--glass-heavy);backdrop-filter:blur(14px);box-shadow:0 14px 34px #000a;animation:undo-in .2s ease-out}
.undo-bar.hidden{display:none}
.undo-bar span{flex:1;min-width:0;font-size:.72rem;line-height:1.25;color:var(--ice);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.undo-bar button{min-height:32px!important;min-width:auto!important;padding:6px 11px!important;border:1px solid var(--brass)!important;border-radius:2px!important;background:rgba(214,179,106,.14)!important;color:var(--brass-hi)!important;font-size:.62rem;letter-spacing:.1em}
.undo-progress{position:absolute;left:0;bottom:0;height:2px;width:100%;transform-origin:left center;background:var(--brass);opacity:.75}
.undo-progress.draining{animation:undo-drain linear forwards}
@keyframes undo-drain{from{transform:scaleX(1)}to{transform:scaleX(0)}}
@keyframes undo-in{from{opacity:0;transform:translate(-50%,-8px)}to{opacity:1;transform:translate(-50%,0)}}
@media (prefers-reduced-motion:reduce){.undo-bar{animation:none}}

/* ============ collectible card: tilt, back, rarity ============
   No wrapper around the content: the tilt applies to #card itself and the back
   is an absolute overlay, so the front's layout is untouched. Wrapping the
   front once broke it badly — see docs/card-effects.md. */
.card.tilting:not(.swiping):not(.swipe-exit-left):not(.swipe-exit-right){transform:perspective(1400px) rotateX(var(--tilt-x,0deg)) rotateY(var(--tilt-y,0deg));transition:transform .2s cubic-bezier(.22,.75,.3,1)}
.flip-hint{position:absolute;bottom:9px;left:50%;translate:-50% 0;z-index:4;opacity:.4;font-size:8px;letter-spacing:.2em;color:#fff;text-shadow:0 2px 10px #000;pointer-events:none}
.card.showing-back .flip-hint,.card.showing-back .drag-hint{display:none}
/* card back: a full-card overlay that rotates in, so it reads as a real flip */
.card-back{position:absolute;inset:0;z-index:6;overflow-y:auto;transform-origin:center;background:radial-gradient(ellipse at 50% 0,rgba(23,55,71,.55),transparent 60%),var(--glass-heavy)}
.card-back.hidden{display:none}
.back-inner{display:flex;flex-direction:column;gap:14px;padding:clamp(26px,7vw,44px) clamp(22px,6vw,34px)}
.back-inner h2{margin:0;font:400 clamp(30px,8vw,46px)/1 Georgia,"Times New Roman",serif;letter-spacing:-.02em}
.back-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(126px,1fr));gap:10px;margin-top:6px}
.stat-tile{display:flex;flex-direction:column;gap:3px;padding:14px;border:1px solid var(--line);border-radius:2px;background:rgba(255,255,255,.03)}
.stat-tile strong{font:400 26px/1 Georgia,serif;color:var(--ice)}
.stat-tile span{font-size:.6rem;letter-spacing:.16em;text-transform:uppercase;color:var(--mist)}
.stat-tile small{color:#a9b8bf;font-size:.72rem}
.stat-tile.gold strong{color:var(--brass-hi)}.stat-tile.red strong{color:#e08b8b}.stat-tile.silver strong{color:#cfdade}
.back-empty{margin:0;color:var(--mist);line-height:1.5;font-size:.86rem}
/* rarity: pulling a Legendary should feel like pulling a foil card */
.card.rarity-elite{border-color:rgba(240,217,154,.5)!important;box-shadow:0 35px 90px #000b,0 0 0 1px rgba(240,217,154,.22) inset}
.card.rarity-legendary{border-color:rgba(240,217,154,.85)!important;box-shadow:0 35px 100px #000c,0 0 26px rgba(240,217,154,.18),0 0 0 1px rgba(127,208,200,.35) inset}
@media (prefers-reduced-motion:reduce){.card.tilting{transform:none!important}.card-back{animation:none}}
/* real flip: the card itself turns, border included. Faces are swapped at 90°,
   where the card is edge-on and the swap cannot be seen. */
.card.flip-out{transition:transform .26s ease-in!important;transform:perspective(1400px) rotateY(var(--flip-a,90deg))!important}
.card.flip-half{transition:none!important;transform:perspective(1400px) rotateY(var(--flip-b,-90deg))!important}
.card.flip-in{transition:transform .26s ease-out!important;transform:perspective(1400px) rotateY(0deg)!important}
.card.showing-back .image-wrap,.card.showing-back .ship-copy,.card.showing-back .actions{visibility:hidden}
@media (prefers-reduced-motion:reduce){.card.flip-out,.card.flip-half,.card.flip-in{transition:none!important;transform:none!important}}
.menu-state{color:var(--brass);font-size:.62rem;letter-spacing:.14em;text-transform:uppercase}
/* the replacement card sails in from the side the previous one left towards */
@keyframes card-in-right{from{opacity:0;transform:translateX(42%) rotate(7deg) scale(.94)}to{opacity:1;transform:none}}
@keyframes card-in-left{from{opacity:0;transform:translateX(-42%) rotate(-7deg) scale(.94)}to{opacity:1;transform:none}}
@keyframes card-in{from{opacity:0;transform:translateY(16px) scale(.975)}to{opacity:1;transform:none}}
.card.entering-right{animation:card-in-right .36s cubic-bezier(.2,.82,.25,1)}
.card.entering-left{animation:card-in-left .36s cubic-bezier(.2,.82,.25,1)}
.card.entering{animation:card-in .3s ease-out}
@media (prefers-reduced-motion:reduce){.card.entering,.card.entering-left,.card.entering-right{animation:none}}
/* ============ glass ============
   Frosted panel over the ship image plus a glass rim on the card. No animated
   gradients: on Android those caused repaint artefacts. */
.card{box-shadow:0 35px 90px #000b,inset 0 1px 0 rgba(255,255,255,.16),0 0 0 1px #000 inset}
/* specular gloss, concentrated on the image half so it never washes the text */

/* the frosted panel: light tint (glass), heavy blur, lit top edge, dark base */
/* the panel starts almost transparent: solid white at the top created a
   visible tonal step against the artwork above */
.ship-copy,.actions{background:linear-gradient(180deg,rgba(255,255,255,.03) 0,rgba(6,18,26,.28) 26%,rgba(4,13,19,.5))}
/* The glass edge used to be a hard 1px line, which read as a drawn divider.
   It is now a highlight that glows at the centre and fades at the sides. */
.ship-copy{position:relative;box-shadow:inset 0 -30px 40px -30px rgba(0,0,0,.5)}
.ship-copy:before{content:"";position:absolute;top:0;left:6%;right:6%;height:1px;pointer-events:none;
  background:linear-gradient(90deg,transparent,rgba(255,255,255,.22) 22%,rgba(255,255,255,.28) 50%,rgba(255,255,255,.22) 78%,transparent)}
.actions{box-shadow:inset 0 -1px 0 rgba(255,255,255,.07)}
.ship-copy p{text-shadow:0 1px 12px rgba(0,0,0,.75)}
.eyebrow{text-shadow:0 1px 8px rgba(0,0,0,.6)}
/* the LLM sometimes overshoots the requested length: clamp so a long reason can
   never push the action buttons past the card's clipped edge */
.ship-copy p{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}

/* On wide screens the contained image grows tall enough to slide behind the
   frosted panel. Bound its height to the panel's offset so the whole ship shows. */
@media (min-width:700px){
  .image-wrap img{height:calc(min(48dvh,390px) - 10px);object-position:center 46%}
}

/* ============ glass: refraction ============
   No pool of light painted on the surface. Thick glass reads through REFRACTION:
   the planes move at different speeds, which is what conveys thickness. */


/* refraction: the ship slides a few pixels, the glass stays put → thickness */
.image-wrap:before{content:"";position:absolute;inset:-6%;z-index:0;pointer-events:none;
  background:radial-gradient(ellipse at 50% 34%,#1b3f52 0,#0a1d28 44%,#030b10 78%);
  transition:transform .2s ease-out}
.card.tilting .image-wrap:before{transform:translate3d(var(--far-x,0px),var(--far-y,0px),0)}
.image-wrap img{position:relative;z-index:1}
.card.tilting .image-wrap img{transform:translate3d(var(--par-x,0px),var(--par-y,0px),0)!important;
  filter:saturate(.95) contrast(1.05) drop-shadow(0 14px 18px rgba(0,0,0,.5));
  transition:transform .18s ease-out}

@media (prefers-reduced-motion:reduce){
  .card.tilting .image-wrap img{transform:none!important}
  }

/* ============ hull shimmer (Legendary only) ============
   The image carries an alpha channel, so we use it as a MASK: the light wave
   travels along the hull, not across the card rectangle. The mask geometry
   mirrors the image's (contain + same position). See docs/card-effects.md. */
.ship-shimmer{position:absolute;inset:0;z-index:3;pointer-events:none;display:none;overflow:hidden;
  -webkit-mask-image:var(--ship-mask);mask-image:var(--ship-mask);
  -webkit-mask-size:contain;mask-size:contain;
  -webkit-mask-position:center 22%;mask-position:center 22%;
  -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;
  mix-blend-mode:screen}
.ship-band{position:absolute;top:-12%;bottom:-12%;left:0;width:52%;opacity:.8;
  background:linear-gradient(112deg,transparent 0,rgba(255,255,255,.34) 42%,rgba(198,244,255,.26) 55%,rgba(255,236,190,.18) 68%,transparent 100%)}
.card.rarity-legendary .ship-shimmer{display:block}
/* the hull moves with the refraction: the mask has to move with it */
.card.tilting .ship-shimmer{transform:translate3d(var(--par-x,0px),var(--par-y,0px),0);transition:transform .18s ease-out}
.card.rarity-legendary .ship-band{animation:ship-wave 4s ease-in-out infinite,ship-breathe 2.6s ease-in-out infinite;will-change:transform,opacity}
@keyframes ship-wave{0%{transform:translate3d(-120%,0,0)}72%{transform:translate3d(320%,0,0)}100%{transform:translate3d(320%,0,0)}}
@keyframes ship-breathe{0%,100%{opacity:.72}50%{opacity:1}}
@media (min-width:700px){.ship-shimmer{height:calc(min(48dvh,390px) - 10px);-webkit-mask-position:center 46%;mask-position:center 46%}}
@media (prefers-reduced-motion:reduce){.card.rarity-legendary .ship-band{animation:none;opacity:.5}}

/* ============ holographic foil: iridescence that travels ============
   Like a foil card: the spectrum is not painted in one spot, it MOVES with the
   tilt, and stays invisible on black the way real holography does.
   The sequence is thin-film interference (cyan → violet → magenta → gold →
   aqua), the same as soap films, CDs and actual foil — which is why the eye
   reads it as a reflection instead of applied colour. Gold and silver stay
   where they belong: the frame.
   Blend: 'color-dodge' is the one with character — 'overlay' cancels the effect
   on a dark card (below 50% it acts like multiply) and 'screen' reads flat.
   The opacity is FIXED: the foldable flicker came from animating it on a
   blended layer (Chromium 41184759), not from the blend itself. */
/* One opacity, NEVER animated: see Chromium 41184759 — transitioning opacity
   on a mix-blend-mode layer glitches. */
:root{--holo:.15}
.card.rarity-elite{--holo:.075}
/* Confined to the ARTWORK: over the text panel the foil hurt legibility, and
   real cards carry foil on the art, not on the data box. Less blended area is
   also less GPU work. */
.card.rarity-legendary .image-wrap:after,.card.rarity-elite .image-wrap:after{content:"";position:absolute;inset:0 0 auto 0;height:min(48dvh,390px);z-index:4;
  pointer-events:none;mix-blend-mode:color-dodge;opacity:var(--holo);
  transform:translateZ(0);backface-visibility:hidden;
  background-image:
    url(/grain.svg),
    repeating-linear-gradient(102deg,transparent 0 8px,rgba(255,255,255,.05) 8px 10px),
    linear-gradient(102deg,#a9e9ff 0,#d9c2ff 18%,#ffc0ec 34%,#fff0b8 52%,#c2f2e0 68%,#b7d4ff 84%,#a9e9ff 100%);
  background-size:150px 150px,760px 760px,1080px 1080px;
  background-position:0 0,var(--holo-x,40%) var(--holo-y,50%),var(--holo-x,40%) var(--holo-y,50%);
  /* fade out downwards: cutting it off at the panel edge left a visible seam
     between the brightened artwork and the data box */
  -webkit-mask-image:linear-gradient(to bottom,#000 0,#000 56%,rgba(0,0,0,.35) 84%,transparent 100%);
  mask-image:linear-gradient(to bottom,#000 0,#000 56%,rgba(0,0,0,.35) 84%,transparent 100%)}
@media (prefers-reduced-motion:reduce){.card.rarity-legendary .image-wrap:after,.card.rarity-elite .image-wrap:after{--holo:.1}}



/* ============ frosted panel without backdrop-filter ============
   backdrop-filter samples the LIVE backdrop every frame: inside a card that
   rotates in 3D that means re-blurring continuously (this was the foldable
   stutter). Instead: a copy of the ship, pre-blurred by downscaling it into a
   small canvas ONCE, aligned to the main image. Rotating the card then just
   transforms a ready texture. See docs/card-effects.md. */
.frost{position:absolute;left:0;right:0;top:min(48dvh,390px);bottom:0;z-index:1;overflow:hidden;pointer-events:none}
.frost img{position:absolute;left:0;width:100%;height:min(720px,calc(100dvh - 120px));
  top:calc(-1 * min(48dvh,390px));object-fit:contain;object-position:center 22%;
  transform:scale(1.14)}   /* no filter: the blur is already baked into the bitmap */
@media (min-width:700px){
  .card.rarity-legendary .image-wrap:after,.card.rarity-elite .image-wrap:after{height:calc(min(48dvh,390px) - 10px)}
  .frost{top:min(48dvh,390px)}
  .frost img{height:calc(min(48dvh,390px) - 10px);object-position:center 46%}
}
@media (max-height:720px){.frost{top:320px}.frost img{top:-320px;height:610px}
  .card.rarity-legendary .image-wrap:after,.card.rarity-elite .image-wrap:after{height:320px}}
