/* Presentation bridge for independently maintained tools. Never styles print routes. */
body.fj-app{--bg:var(--g-bg);--paper:var(--g-bg);--paper-2:var(--g-card);--paper-3:var(--g-panel);--ink:var(--g-ink);--text:var(--g-ink);--fg:var(--g-ink);--soft:var(--g-soft);--sub:var(--g-soft);--muted:var(--g-soft);--line:var(--g-line);--border:var(--g-line);--card:var(--g-card);--panel:var(--g-panel);--accent:var(--g-accent);--acc:var(--g-accent);--font:'Archive Grotesk','Microsoft YaHei','PingFang SC',sans-serif;--ui:var(--font);font-family:var(--font);-webkit-font-smoothing:antialiased}
/* Explicit values prevent local token aliases from forming cycles. */
body.fj-app{--g-bg:#f0f1ed;--g-ink:#20231f;--g-soft:#60665d;--g-line:#c9cec4;--g-card:#f8f9f5;--g-panel:#e5e8e0;--g-accent:#bd301f;background-color:var(--g-bg);color:var(--g-ink);background-image:none}
html[data-theme=dark] body.fj-app,html.dark body.fj-app{--g-bg:#171a17;--g-ink:#eff2e9;--g-soft:#acb3a6;--g-line:#3c453a;--g-card:#20261f;--g-panel:#2b3329;--g-accent:#ff8874}
body.fj-app h1,body.fj-app h2,body.fj-app h3,body.fj-app button,body.fj-app input,body.fj-app select{font-family:var(--font)}
body.fj-app button{transition:background-color .18s,color .18s,transform .18s}
body.fj-app button:active{transform:scale(.98)}
body.fj-app :focus-visible{outline:2px solid var(--g-accent);outline-offset:3px}
body.fj-app input,body.fj-app select,body.fj-app textarea{accent-color:var(--g-accent)}
body.fj-app .card,body.fj-app .panel{box-shadow:none}
body.fj-app{--txt:var(--g-ink);--dim:var(--g-soft);--faint:var(--g-soft);--mid:var(--g-soft);--text2:var(--g-soft);--ink2:var(--g-soft);--panel-2:var(--g-card);--paper-ink:var(--g-ink);--red:var(--g-accent);--wine:var(--g-accent);--gold:var(--g-accent);--accent-deep:var(--g-accent);--accent-soft:var(--g-panel);--line-soft:var(--g-line);--hair:var(--g-line)}
/* JoKi: an open reference desk, with content relationships kept intact. */
body.fj-joki #top{background:var(--g-bg);border-bottom:1px solid var(--g-line);padding:18px clamp(20px,4vw,60px);gap:16px}
body.fj-joki #top .logo{font:700 26px var(--font);background:none;color:var(--g-ink);padding:0;letter-spacing:-.04em}
body.fj-joki #top .logo span{background:none;color:var(--g-accent);font-size:15px;border-radius:0;padding:0}
body.fj-joki #top .tbtn{background:none;color:var(--g-ink);border:1px solid var(--g-line);border-radius:0;min-height:42px}
body.fj-joki #top .tbtn:hover{background:var(--g-panel);color:var(--g-accent)}
body.fj-joki #search input{border:1px solid var(--g-line);background:var(--g-card);color:var(--g-ink);border-radius:0;min-height:42px;font:14px var(--font)}
body.fj-joki #main{padding:60px 32px 80px}
body.fj-joki #main .wrap{max-width:1100px}
body.fj-joki h1.pt{font:500 clamp(36px,5vw,66px)/1.3 var(--font);letter-spacing:-.04em;border:0;margin-bottom:35px}
body.fj-joki h2{font:500 26px/1.5 var(--font);border:0;padding:0;margin-top:45px}
body.fj-joki a{color:var(--g-ink);border-color:var(--g-line)}
body.fj-joki a:hover{background:var(--g-panel);color:var(--g-accent)}
body.fj-joki .cardgrid{gap:0;margin-bottom:44px}
body.fj-joki .card{border:0;border-top:1px solid var(--g-line);border-bottom:1px solid var(--g-line);border-radius:0;background:none;padding:22px}
body.fj-joki .card+.card{border-left:1px solid var(--g-line)}
body.fj-joki .card .n{font:500 40px var(--font);color:var(--g-accent)}
body.fj-joki .card .l,body.fj-joki .lead{color:var(--g-soft)}
body.fj-joki .chbox,body.fj-joki .chapbox,body.fj-joki .catbox,body.fj-joki .toc,body.fj-joki .infobox,body.fj-joki .qaitem,body.fj-joki .checkin{background:var(--g-card);border:1px solid var(--g-line);border-radius:0}
body.fj-joki .qaitem{border-left:2px solid var(--g-accent)}
body.fj-joki .qa-a{color:var(--g-ink)}
/* Music: calm listening room; classification colors retain their meaning. */
body.fj-music{--pink:var(--g-accent);--purple:var(--g-accent);--cyan:var(--g-accent);--hover:var(--g-panel);--mono:var(--font);--serif:var(--font)}
body.fj-music::before,body.fj-music::after,body.fj-music .vhs-scan,body.fj-music .grid-floor,body.fj-music .sun,body.fj-music .star{display:none}
body.fj-music .wrap{max-width:1200px;padding-inline:clamp(22px,5vw,64px)}
body.fj-music header{padding-top:55px}
body.fj-music h1.glitch{font:500 clamp(36px,5vw,66px)/1.2 var(--font);letter-spacing:-.05em}
body.fj-music h1.glitch>span{background:none;color:var(--g-ink);filter:none}
body.fj-music h1.glitch::before,body.fj-music h1.glitch::after,body.fj-music .sys-line::before{display:none}
body.fj-music .sys-line{color:var(--g-soft);letter-spacing:.05em}
body.fj-music h2{font:500 22px/1.5 var(--font);letter-spacing:0;margin-top:35px;color:var(--g-ink)}
body.fj-music h2::before,body.fj-music h2::after{display:none}
body.fj-music .chip,body.fj-music .tab,body.fj-music .btn.ghost{background:transparent;border:1px solid var(--g-line);border-radius:0;color:var(--g-ink);box-shadow:none}
body.fj-music .chip.on,body.fj-music .tab.on,body.fj-music .btn.primary{background:var(--g-accent);color:var(--g-bg);border-color:var(--g-accent);box-shadow:none;border-radius:0}
body.fj-music .chip:hover,body.fj-music .tab:hover,body.fj-music .btn:hover{box-shadow:none}
body.fj-music .daily-date{text-shadow:none;color:var(--g-ink);font:500 18px var(--font)}
body.fj-music .daily-batch{border-color:var(--g-line);background:var(--g-panel);color:var(--g-soft);border-radius:0}
body.fj-music .song,body.fj-music .song-card,body.fj-music .track,body.fj-music .modal{background:var(--g-card);border:1px solid var(--g-line);border-radius:0;box-shadow:none;color:var(--g-ink)}
body.fj-music .card{background:var(--g-card);border:0;border-bottom:1px solid var(--g-line);border-radius:0;padding:20px 18px;box-shadow:none}
body.fj-music .card:hover{background:var(--g-panel);transform:none;box-shadow:none}
body.fj-music .card .cov{width:72px;height:72px;flex-basis:72px;border-radius:0;box-shadow:none;background:var(--g-panel)}
body.fj-music .card .info .n{font-size:17px;font-weight:500}
body.fj-music .card .info .meta .tg{background:var(--g-panel);color:var(--g-soft);border:0;border-radius:0}
body.fj-music .card .info .meta .tg.red,body.fj-music .card .info .meta .tg.new{color:var(--g-accent);background:var(--g-panel);border:0}
body.fj-music .card a.play,body.fj-music .pick-btn{background:none;color:var(--g-accent);border:1px solid var(--g-line);border-radius:0;box-shadow:none}
body.fj-music .reason,body.fj-music .hitem,body.fj-music .empty{background:var(--g-panel);border:1px solid var(--g-line);border-radius:0;box-shadow:none;color:var(--g-ink)}
body.fj-music .reason b{text-shadow:none;color:var(--g-accent)}
body.fj-music .foot-mark{color:var(--g-soft)}
/* Conversation game: red selection, legible surfaces, generous touch controls. */
body.fj-jiuju{--gold:var(--g-accent);--gold-soft:var(--g-soft);--wine:var(--g-accent);--wine-soft:var(--g-accent);--bottle:#45664d;--bottle-soft:#2d4735}
body.fj-jiuju .app{max-width:620px;padding-top:20px}
body.fj-jiuju .setup .hero{text-align:left;padding:28px 0}
body.fj-jiuju .setup .hero h1{font:500 clamp(32px,5vw,48px)/1.3 var(--font);letter-spacing:-.04em;color:var(--g-ink)}
body.fj-jiuju .panel{border-radius:0;background:var(--g-card);padding:20px;border-color:var(--g-line)}
body.fj-jiuju .scene-card,body.fj-jiuju .pill,body.fj-jiuju .opt,body.fj-jiuju .chip,body.fj-jiuju .seg button{background:var(--g-bg);border-color:var(--g-line);color:var(--g-ink);border-radius:0}
body.fj-jiuju .scene-card.on,body.fj-jiuju .pill.on,body.fj-jiuju .opt.on,body.fj-jiuju .chip.on,body.fj-jiuju .seg button.on{background:var(--g-accent);color:var(--g-bg);border-color:var(--g-accent)}
body.fj-jiuju .scene-card .s-name,body.fj-jiuju .scene-card .s-desc{color:inherit}
body.fj-jiuju .btn{border-radius:0;box-shadow:none}
body.fj-jiuju .btn-primary{background:var(--g-accent);color:var(--g-bg)}
body.fj-jiuju .setup-hint{background:var(--g-panel);color:var(--g-soft);border-color:var(--g-line);border-radius:0}
/* Resource catalogue uses a restrained high-contrast terminal palette. */
body.fj-baipiao{--g-bg:#171a17;--g-ink:#eff2e9;--g-soft:#b0b9a9;--g-line:#3c453a;--g-card:#20261f;--g-panel:#293126;--g-accent:#c5d3a7;--green:#c5d3a7;--red:#ff8874;--yellow:#e5c67c}
body.fj-baipiao h1{font:500 clamp(32px,5vw,60px)/1.2 var(--font);color:var(--g-ink);letter-spacing:-.04em}
body.fj-baipiao a{color:var(--g-ink)}
body.fj-baipiao .card .n,body.fj-baipiao .cmd .ps1{text-shadow:none}
body.fj-baipiao .cursor{animation:none}
body.fj-baipiao .wrap{padding-top:24px}
body.fj-baipiao .card{padding:22px 18px;border-radius:0}
body.fj-baipiao input,body.fj-baipiao select{color:var(--g-ink)}
/* Food book retains its functional page-turner, replaces ornamental frame. */
body.fj-cooking{--cooking-primary:var(--g-accent);--cooking-background:var(--g-bg);--cooking-background-soft:var(--g-panel);--cooking-card:var(--g-card);--cooking-card-foreground:var(--g-ink);--cooking-foreground:var(--g-ink);--cooking-border:var(--g-line);--cooking-muted:var(--g-soft);--cooking-muted-foreground:var(--g-soft);--cooking-input:var(--g-panel);--cooking-gold:var(--g-accent);--font-display:var(--font);--font-serif:var(--font)}
body.fj-cooking .page{border-radius:0;border:1px solid var(--g-line);box-shadow:0 15px 45px #17201515;background:var(--g-card)}
body.fj-cooking .cover-page{background:var(--g-card)}
body.fj-cooking .cover-page::before,body.fj-cooking .cover-page::after,body.fj-cooking .cover-decoration{display:none}
body.fj-cooking .cover-page h1{font:500 clamp(32px,4.5vw,62px)/1.35 var(--font);letter-spacing:-.05em;color:var(--g-ink)}
body.fj-cooking .cover-page h1::after{display:none}
body.fj-cooking .cover-dish-tag{border-radius:0;background:var(--g-panel);color:var(--g-ink);border-color:var(--g-line);padding:9px 12px}
body.fj-cooking .cover-dish-tag:nth-child(odd){background:var(--g-panel);color:var(--g-ink)}
/* Personal tools retain status colors and task structure. */
body.fj-daka .desk{border:0;box-shadow:none;background:var(--g-bg)}
body.fj-daka .desk::before,body.fj-daka .desk::after{display:none}
body.fj-daka .sheet,body.fj-daka .paper{background:var(--g-bg);box-shadow:none}
body.fj-ledger .masthead{padding-top:38px}
body.fj-ledger .masthead h1{font:500 clamp(36px,5vw,65px)/1.2 var(--font);letter-spacing:-.04em}
body.fj-yangsheng .page{max-width:1240px}
body.fj-yangsheng h1{font-family:var(--font);letter-spacing:-.04em}
body.fj-wanxiang h1{font-weight:500;letter-spacing:-.04em}
body.fj-wanxiang .system-card,body.fj-wanxiang .card{background:var(--g-card);border-color:var(--g-line)}
body.fj-tiku{--blue:var(--g-ink);--blue-dark:var(--g-ink);--blue-light:var(--g-panel);--red:var(--g-accent)}
@media(max-width:640px){body.fj-joki #top{flex-wrap:wrap;padding:14px 18px;gap:10px}body.fj-joki #search{order:5;flex-basis:100%;max-width:none}body.fj-joki #main{padding:35px 20px}body.fj-joki .cardgrid{grid-template-columns:repeat(2,minmax(0,1fr))}body.fj-joki .card{padding:16px}body.fj-joki .card .n{font-size:30px}body.fj-jiuju .app{padding:12px 18px 25px}body.fj-jiuju .panel{padding:16px}body.fj-music h1.glitch{font-size:36px}body.fj-music .tabs{flex-wrap:wrap}}
body.fj-app .fj-global-rail{display:flex;align-items:center;justify-content:space-between;gap:20px;padding:12px clamp(18px,4vw,60px);min-height:50px;border-bottom:1px solid var(--g-line);background:var(--g-bg);color:var(--g-ink);font:12px/1.5 var(--font);position:relative;z-index:2;width:100%;box-sizing:border-box}
.fj-global-rail a{color:inherit!important;text-decoration:none!important;min-height:28px;display:inline-flex;align-items:center}
.fj-global-rail>a:first-child{font-weight:700;letter-spacing:-.05em;font-size:19px}
.fj-global-rail nav{display:flex;gap:20px}
.fj-global-rail a:hover{color:var(--g-accent)!important}
body.fj-skills .wrap{max-width:1420px;padding-inline:clamp(22px,5vw,72px)}
body.fj-skills header.top{padding-block:64px 36px;border-color:var(--g-line)}
body.fj-skills h1{font-size:clamp(48px,8vw,105px);letter-spacing:-.06em;line-height:1.15;font-weight:500}
body.fj-skills .toolbar{background:var(--g-bg);padding-block:18px;border-color:var(--g-line)}
body.fj-skills .chip{letter-spacing:0;border-color:var(--g-line);min-height:42px}
body.fj-skills .search{background:var(--g-card);border-color:var(--g-line);font-size:15px;min-height:42px}
body.fj-skills .grp{padding-top:54px}
body.fj-skills .grp-no{letter-spacing:0}
body.fj-skills .grp-head h2{font-weight:500;font-size:30px;letter-spacing:-.03em}
body.fj-skills .grid{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:0 28px}
body.fj-skills .card{padding:26px 0;background:none;border:0;border-top:1px solid var(--g-line)}
body.fj-reading .wrap{max-width:850px;padding:60px 30px 80px}
body.fj-reading header.masthead{padding-bottom:35px;margin-bottom:44px;border-color:var(--g-line)}
body.fj-reading header.masthead h1{font-size:clamp(32px,6vw,58px);line-height:1.25;letter-spacing:-.04em;font-weight:500}
body.fj-reading a{color:var(--g-accent)}
body.fj-reading h4.sec{color:var(--g-accent);border-color:var(--g-line);font:500 13px var(--font);letter-spacing:.04em}
body.fj-reading .article{margin-top:64px}
body.fj-reading .article h3{font-size:27px;font-weight:500;letter-spacing:-.025em}
body.fj-reading .kicker,body.fj-reading .meta,body.fj-reading .subtitle,body.fj-reading .note{color:var(--g-soft)}
body.fj-reading blockquote{border-color:var(--g-accent);background:var(--g-panel)}
body.fj-news{font-family:var(--font);line-height:1.9}
body.fj-news h1{font-size:clamp(36px,6vw,70px);letter-spacing:-.04em}
body.fj-news h2{font-size:26px;letter-spacing:-.03em}
body.fj-news a{color:var(--g-accent)}
@media(max-width:600px){body.fj-app .fj-global-rail{padding-inline:18px}.fj-global-rail nav{gap:16px}body.fj-skills header.top{padding-top:40px}body.fj-skills .toolbar{position:relative}body.fj-skills .search{width:100%;margin-left:0}body.fj-skills .grp-head{flex-wrap:wrap;gap:10px}body.fj-reading .wrap{padding:36px 22px 60px}body.fj-reading .article h3{font-size:24px}}
@media(prefers-reduced-motion:reduce){body.fj-app button{transition:none}body.fj-app button:active{transform:none}}
@media print{body.fj-app .fj-global-rail{display:none!important}}
/* Second visual pass: readable table viewports and selected states. */
body.fj-reading table,body.fj-baipiao table{display:block;max-width:100%;overflow-x:auto;overscroll-behavior-x:contain}
body.fj-jiuju .wiz-note{background:var(--g-panel);color:var(--g-ink);border-color:var(--g-line);border-radius:0}
body.fj-music .sys-line{opacity:1;font-size:11px}
body.fj-music .card .pick{border:1px solid var(--g-line);background:var(--g-panel);border-radius:0;color:var(--g-accent);box-shadow:none}
body.fj-music .card.picked{background:var(--g-panel);border-color:var(--g-accent);box-shadow:inset 3px 0 var(--g-accent)}
body.fj-music .card.picked .pick{background:var(--g-accent);color:var(--g-bg);box-shadow:none}
body.fj-music .pickbar{background:var(--g-card);border:1px solid var(--g-line);border-radius:0;box-shadow:none}
body.fj-jiuju .chip.on .c-cup,body.fj-jiuju .chip.on .c-sex{color:var(--g-bg)}
body.fj-jiuju .chip.on .c-cup svg{stroke:currentColor}
body.fj-jiuju .card{background:var(--g-card);border:1px solid var(--g-line);border-radius:0;box-shadow:none}
body.fj-jiuju .card-q,body.fj-jiuju .empty .big,body.fj-jiuju .head .title{font-family:var(--font)}
body.fj-jiuju .card-no,body.fj-jiuju .card-foot{color:var(--g-soft)}
body.fj-jiuju .tab,body.fj-jiuju .empty,body.fj-jiuju .modal{border-radius:0}
body.fj-jiuju .toast{background:var(--g-ink);color:var(--g-bg)}
body.fj-joki .sec.rig,body.fj-joki .sec.plain,body.fj-joki .sec.mem{border-color:var(--g-accent);background:transparent}
body.fj-joki .hook{border-color:var(--g-line);border-left-color:var(--g-accent);background:var(--g-panel);border-radius:0}
body.fj-joki .checkin button{background:var(--g-accent);border-color:var(--g-accent);color:var(--g-bg);border-radius:0}
body.fj-joki .checkin .st b{color:var(--g-accent)}
body.fj-yangsheng .punch,body.fj-yangsheng .cursor{display:none}
body.fj-yangsheng header{padding-block:48px 28px;border-bottom:1px solid var(--g-line)}
body.fj-yangsheng .logo{font-size:clamp(28px,4vw,52px);font-weight:500;letter-spacing:-.04em;line-height:1.15}
body.fj-yangsheng .page>nav{margin-block:0 32px;padding-top:12px;border-color:var(--g-line)}
body.fj-yangsheng .tab{letter-spacing:0;padding:14px 20px;font-weight:500}
body.fj-yangsheng .fj-global-rail nav{border:0;margin:0}
body.fj-yangsheng h2{font-size:24px;font-weight:500;letter-spacing:-.02em;border-color:var(--g-line);padding-bottom:18px}
body.fj-yangsheng .fbtn,body.fj-yangsheng .filters select,body.fj-yangsheng .filters input{min-height:36px;border-color:var(--g-line)}
body.fj-yangsheng td{border-bottom:1px solid var(--g-line);padding-block:12px}
body.fj-yangsheng th{border-color:var(--g-line);font-weight:500;padding-block:12px}
body.fj-billiards{--surface:var(--g-card);--surface2:var(--g-panel);--surface3:var(--g-panel);--bg2:var(--g-bg);--accent-ink:var(--g-bg);--accent-dim:var(--g-panel);--line-strong:var(--g-accent);--shadow:none;--glow:none}
@media(max-width:640px){body.fj-yangsheng header{padding-block:30px 22px}body.fj-yangsheng .tab{padding:12px 9px;font-size:13px}body.fj-yangsheng td{padding-block:9px}}
body.fj-dianping{--color-primary:var(--g-accent);--color-primary-hover:var(--g-accent);--color-primary-light:var(--g-panel);--color-primary-tint-90:var(--g-card);--color-primary-tint-80:var(--g-panel);--bg-primary:var(--g-bg);--bg-secondary:var(--g-card);--bg-tertiary:var(--g-panel);--bg-inset:var(--g-panel);--text-primary:var(--g-ink);--text-secondary:var(--g-soft);--text-tertiary:var(--g-soft);--text-inverse:var(--g-bg);--text-link:var(--g-accent);--border-default:var(--g-line);--border-light:var(--g-line);--border-focus:var(--g-accent);--font-sans:var(--font);--radius-lg:0px;--radius-xl:0px;--shadow-sm:none;--shadow-md:none}
