/* 万家灯火 · app/base/base.css — owner: agent C (界面与课中). docs/DESIGN.md §5, §6, §11.5；ADDENDUM 7（少女风、紫藤月夜）.
   深色优先：颜色一律取宿主 :root 的 token（--paper --sheet --ink --ink-2 --ink-3 --line --rule --ctl --red --ok --moon
   --moon-core --lamp --lamp-glow --blueprint --cloud --sky-1 --sky-2 --haze --now --done …），这里只补世界自己的 --b-*。
   语义（ADDENDUM 6、7）：樱粉 --moon = 现在 / 今天 / 你在这里（只画环、引线、今天的路、营地月牙）；
   金色 --lamp = 亮窗、做过的证据、答对；淡紫 --blueprint = 图纸线、计划；淡紫 --cloud = 雾；珊瑚 --red = 待加固、错。
   形状（ADDENDUM 7）：紫藤月夜和樱花里圆角更大、按钮是胶囊形（--b-r-*）；作业本、跟随系统为浅和黑板保持原来的圆角。
   DOM 所有权（§11.5）：#bw #bw-* .bw-* .bc-* .kg-* .bset .bsync .brv（ui.js）、.bm-* .bf-*（manual.js）、#bd .bd-*（drill.js）。
   .bem-*（map.js 自己注入样式）与宿主的类都不在这里改。 */

/* ───────────────────────── tokens · 紫藤月夜（默认，:root 就是深色） ───────────────────────── */
:root{
  /* 界面 */
  --b-raised:#372A5F;--b-glass:rgba(43,32,80,.88);--b-glass-2:rgba(30,22,56,.74);--b-glass-line:rgba(214,190,255,.18);
  --b-well:rgba(14,6,34,.32);--b-press:rgba(214,190,255,.12);--b-scrim:rgba(16,8,36,.7);
  --b-ease:cubic-bezier(.2,.7,.2,1);--b-ease-cam:cubic-bezier(.65,0,.35,1);--b-peek:124px;
  --b-f-num:"Iowan Old Style",Palatino,Georgia,"Songti SC",serif;--b-f-mono:ui-monospace,"SF Mono",Menlo,Consolas,monospace;
  /* 形状：按钮、分段和大按钮是胶囊形，卡片和对话框的圆角更大（浅色、黑板里是原来的值） */
  --b-r-sm:999px;--b-r-btn:999px;--b-r-seg:999px;--b-r-cta:999px;--b-r-bar:999px;--b-r-cap:999px;
  --b-r-md:14px;--b-r-lg:18px;--b-r-xl:20px;--b-r-2xl:22px;--b-r-3xl:26px;
  /* 点缀的底色（rgb 三元组，用法 rgba(var(--b-…-rgb),α)）：樱粉 = 当前；淡紫 = 计划、图纸；月光 = 月亮的柔光；
     云 / 雾 = 淡紫的云；地平线的紫雾；阴影 = 梅紫的黑（没有纯黑）。浅色、黑板里是原来的值。 */
  --b-now-rgb:255,166,201;--b-plan-rgb:201,184,255;--b-glow-rgb:255,214,230;--b-cloud-rgb:150,118,210;--b-mist-rgb:196,168,240;
  --b-haze-rgb:90,66,144;--b-shadow-rgb:14,6,34;--b-curve:var(--blueprint);
  /* 引擎读的调色（§6.2）；同一角色能用宿主 token 的就用宿主的。梅紫的夜：樱粉的月亮、淡紫的云和图纸线、金色的窗灯。
     map.js 在紫藤月夜里只读这些"语义"项（天空、月亮、路、灯、云、图钉……），读到的值盖过它自己 moonlit 调色板里的同名项，
     所以天空和地平线这几项取的就是 map.js 为开放世界调好的值（天空 #231A48、近地平线 #4A3578、远处的紫雾 #6E54A0） */
  --b-sky:#231A48;--b-sky-horizon:#4A3578;--b-star:#FFF3FA;
  --b-moon-core:var(--moon-core);--b-moon-rim:var(--moon);--b-moon-dark:#2E2352;--b-moon-lit:var(--moon-core);--b-moon-line:var(--moon);
  --b-slab:#33285F;--b-slab-deep:#120B2A;--b-strata:rgba(201,184,255,.18);
  --b-sea:#1A1541;--b-sea-deep:#130F2F;
  /* 平滑晕渲的高程色阶：低地是安静的深梅紫，往上是被月光照着的淡紫、山顶淡丁香（像露营车视频里的地形，只是换成夜里）。
     与 terrain.js 的 moonlit 色阶（PAL_SRC）一致；紫藤月夜里地图用引擎自己的色阶，这几项给别的读者和以后的调色用 */
  --b-l0:#2C2356;--b-l1:#31275D;--b-l2:#372C64;--b-l3:#3E316D;--b-l4:#473877;--b-l5:#524182;--b-l6:#5F4B8E;--b-l7:#705A9D;--b-l8:#8B78B8;--b-l9:#B6A7DC;
  --b-hi:rgba(220,207,255,.4);--b-shade:#140E2E;--b-contour:rgba(244,238,250,.07);--b-contour-i:rgba(244,238,250,.13);
  --b-river:#A493E6;--b-coast:#BCA9F0;
  --b-route:#FFD48A;--b-route-glow:rgba(255,164,90,.35);--b-route-wet:rgba(255,246,230,.2);--b-route-next:rgba(201,184,255,.62);
  --b-now:var(--moon);--b-sheet:var(--sheet);--b-grid:rgba(201,184,255,.08);--b-grid-5:rgba(201,184,255,.14);
  --b-sketch:var(--blueprint);--b-mass-t:#463A7E;--b-mass-l:#3A2F6C;--b-mass-r:#30265C;--b-detail:rgba(201,184,255,.8);
  --b-plaster:#AE9CCC #9886B8 #7A6A9E;--b-brick:#8E80B8 #7A6DA5 #605489;--b-timber:#C8907A #AE7A66 #8A5E52;--b-tile:#5C4E9A #4E4188 #413574;--b-stone:#9C92C4 #877DAF #6C6293;
  --b-window-off:var(--sheet);--b-window-frame:rgba(201,184,255,.6);
  --b-lamp-1:rgba(255,190,110,.55);--b-lamp-2:rgba(255,197,107,.82);--b-lamp-3:var(--lamp);--b-lamp-glow:var(--lamp-glow);--b-lantern:#D86A8C;
  --b-lampbg-1:radial-gradient(90% 75% at 50% 64%,rgba(255,179,71,.7),rgba(245,150,45,.52) 78%);--b-lampbg-2:radial-gradient(90% 80% at 50% 60%,#FFE2A8,rgba(255,179,71,.72) 70%,rgba(255,159,67,.45));
  --b-repair:var(--red);--b-seam:#FFE9C2;--b-seam-ink:var(--b-seam);--b-halo:var(--paper);--b-seal:var(--red);
  --b-mist:rgba(150,118,210,.35);--b-cloud-1:rgba(142,120,206,.3);--b-cloud-2:rgba(231,214,255,.22);--b-haze:#6E54A0;
  --b-pin:var(--sheet);--b-pin-ring:var(--blueprint);--b-pin-ink:var(--ink);--b-patrol:var(--ink);--b-patrol-ink:var(--paper);
  --b-grain:.03;
  /* 开工单里的计划条：淡紫从半透明亮到满（浅色、黑板里是原来的淡紫 .58） */
  --b-plan-fill:linear-gradient(90deg,rgba(201,184,255,.6),#C9B8FF);--b-plan-a:1;
}
/* 浅色（作业本、跟随系统为浅）：白模画法（§6.3） */
:root[data-theme="light"]{
  --b-raised:#F7F9FA;--b-glass:rgba(255,255,255,.88);--b-glass-2:rgba(242,245,246,.84);--b-glass-line:rgba(27,37,64,.12);
  --b-well:rgba(27,37,64,.05);--b-press:rgba(27,37,64,.07);--b-scrim:rgba(20,20,30,.4);
  --b-moon-dark:#E6E0D6;--b-moon-lit:var(--moon);--b-moon-line:var(--ink-3);--b-slab:#D5D2CA;--b-slab-deep:#BDB9AF;--b-strata:rgba(28,40,44,.18);
  --b-sea:#C9D7DD;--b-sea-deep:#B7C9D1;
  --b-l0:#ECEBE2;--b-l1:#E6E6DA;--b-l2:#E1E2D2;--b-l3:#D8DCC8;--b-l4:#D2D8C2;--b-l5:#BFC8AB;--b-l6:#AAB293;--b-l7:#B9BBA6;--b-l8:#C9C9BD;--b-l9:#EEEDE8;
  --b-hi:rgba(255,255,255,.4);--b-shade:#6E7A81;--b-contour:rgba(28,40,44,.1);--b-contour-i:rgba(28,40,44,.18);
  --b-river:#7FA2B8;--b-coast:#5E8196;--b-route:#1C282C;--b-route-glow:rgba(224,149,46,.25);--b-route-wet:rgba(28,40,44,.08);--b-route-next:rgba(28,40,44,.55);
  --b-sheet:#E8E5DD;--b-grid:rgba(28,40,44,.07);--b-grid-5:rgba(28,40,44,.13);--b-sketch:#59625E;
  --b-mass-t:#F7F6F2;--b-mass-l:#E6E3DC;--b-mass-r:#D3CFC6;--b-detail:rgba(28,40,44,.6);
  --b-plaster:#F4F1EA #E6E1D6 #D2CCBF;--b-brick:#8A959B #6E7A81 #5C676D;--b-timber:#B98A6A #A2765A #86604A;--b-tile:#5E666C #474F55 #3A4146;--b-stone:#CFCBC0 #BDB8AC #A6A195;
  --b-window-off:#DCD8CF;--b-window-frame:rgba(28,40,44,.5);
  --b-lamp-1:rgba(224,149,46,.5);--b-lamp-2:rgba(224,149,46,.78);--b-lamp-3:#E0952E;--b-lampbg-1:radial-gradient(90% 75% at 50% 64%,rgba(224,149,46,.4),rgba(224,149,46,.26) 78%);--b-lampbg-2:radial-gradient(90% 80% at 50% 60%,rgba(224,149,46,.7),rgba(224,149,46,.52) 78%);--b-lantern:#B8503E;
  --b-repair:#C7382D;--b-seam:#F0D58A;--b-seam-ink:#8A6A12;--b-halo:#FFFFFF;--b-seal:#C7382D;
  --b-mist:rgba(233,231,225,.72);--b-cloud-1:rgba(179,168,218,.28);--b-cloud-2:rgba(214,206,236,.3);
  --b-pin:#1C282C;--b-pin-ring:#1C282C;--b-pin-ink:#FFFFFF;--b-patrol:#1C282C;--b-patrol-ink:#FFFFFF;--b-grain:0;
  --b-r-sm:8px;--b-r-btn:9px;--b-r-seg:10px;--b-r-cta:12px;--b-r-bar:3px;--b-r-cap:14px;--b-r-md:10px;--b-r-lg:12px;--b-r-xl:14px;--b-r-2xl:16px;--b-r-3xl:18px;
  --b-now-rgb:246,185,168;--b-plan-rgb:169,184,255;--b-glow-rgb:255,227,211;--b-cloud-rgb:108,95,168;--b-mist-rgb:156,138,208;--b-haze-rgb:58,52,112;--b-shadow-rgb:5,6,20;--b-curve:#A9B8FF;
  --b-sky:var(--sky-1);--b-sky-horizon:var(--haze);--b-star:var(--ink);--b-haze:var(--haze);
  --b-plan-fill:var(--blueprint);--b-plan-a:.58;
}
@media (prefers-color-scheme:light){
  :root[data-theme="auto"]{
    --b-raised:#F7F9FA;--b-glass:rgba(255,255,255,.88);--b-glass-2:rgba(242,245,246,.84);--b-glass-line:rgba(27,37,64,.12);
    --b-well:rgba(27,37,64,.05);--b-press:rgba(27,37,64,.07);--b-scrim:rgba(20,20,30,.4);
    --b-moon-dark:#E6E0D6;--b-moon-lit:var(--moon);--b-moon-line:var(--ink-3);--b-slab:#D5D2CA;--b-slab-deep:#BDB9AF;--b-strata:rgba(28,40,44,.18);
    --b-sea:#C9D7DD;--b-sea-deep:#B7C9D1;
    --b-l0:#ECEBE2;--b-l1:#E6E6DA;--b-l2:#E1E2D2;--b-l3:#D8DCC8;--b-l4:#D2D8C2;--b-l5:#BFC8AB;--b-l6:#AAB293;--b-l7:#B9BBA6;--b-l8:#C9C9BD;--b-l9:#EEEDE8;
    --b-hi:rgba(255,255,255,.4);--b-shade:#6E7A81;--b-contour:rgba(28,40,44,.1);--b-contour-i:rgba(28,40,44,.18);
    --b-river:#7FA2B8;--b-coast:#5E8196;--b-route:#1C282C;--b-route-glow:rgba(224,149,46,.25);--b-route-wet:rgba(28,40,44,.08);--b-route-next:rgba(28,40,44,.55);
    --b-sheet:#E8E5DD;--b-grid:rgba(28,40,44,.07);--b-grid-5:rgba(28,40,44,.13);--b-sketch:#59625E;
    --b-mass-t:#F7F6F2;--b-mass-l:#E6E3DC;--b-mass-r:#D3CFC6;--b-detail:rgba(28,40,44,.6);
    --b-plaster:#F4F1EA #E6E1D6 #D2CCBF;--b-brick:#8A959B #6E7A81 #5C676D;--b-timber:#B98A6A #A2765A #86604A;--b-tile:#5E666C #474F55 #3A4146;--b-stone:#CFCBC0 #BDB8AC #A6A195;
    --b-window-off:#DCD8CF;--b-window-frame:rgba(28,40,44,.5);
    --b-lamp-1:rgba(224,149,46,.5);--b-lamp-2:rgba(224,149,46,.78);--b-lamp-3:#E0952E;--b-lampbg-1:radial-gradient(90% 75% at 50% 64%,rgba(224,149,46,.4),rgba(224,149,46,.26) 78%);--b-lampbg-2:radial-gradient(90% 80% at 50% 60%,rgba(224,149,46,.7),rgba(224,149,46,.52) 78%);--b-lantern:#B8503E;
    --b-repair:#C7382D;--b-seam:#F0D58A;--b-seam-ink:#8A6A12;--b-halo:#FFFFFF;--b-seal:#C7382D;
    --b-mist:rgba(233,231,225,.72);--b-cloud-1:rgba(179,168,218,.28);--b-cloud-2:rgba(214,206,236,.3);
    --b-pin:#1C282C;--b-pin-ring:#1C282C;--b-pin-ink:#FFFFFF;--b-patrol:#1C282C;--b-patrol-ink:#FFFFFF;--b-grain:0;
    --b-r-sm:8px;--b-r-btn:9px;--b-r-seg:10px;--b-r-cta:12px;--b-r-bar:3px;--b-r-cap:14px;--b-r-md:10px;--b-r-lg:12px;--b-r-xl:14px;--b-r-2xl:16px;--b-r-3xl:18px;
    --b-now-rgb:246,185,168;--b-plan-rgb:169,184,255;--b-glow-rgb:255,227,211;--b-cloud-rgb:108,95,168;--b-mist-rgb:156,138,208;--b-haze-rgb:58,52,112;--b-shadow-rgb:5,6,20;--b-curve:#A9B8FF;
    --b-sky:var(--sky-1);--b-sky-horizon:var(--haze);--b-star:var(--ink);--b-haze:var(--haze);
    --b-plan-fill:var(--blueprint);--b-plan-a:.58;
  }
}
/* 樱花：同浅色的白模画法，换朱印与抬起面；形状与点缀跟紫藤月夜一样（少女风的浅色版） */
:root[data-theme="sakura"]{
  --b-raised:#FFF9FA;--b-glass:rgba(255,255,255,.9);--b-glass-2:rgba(255,244,246,.86);--b-glass-line:rgba(58,42,51,.12);
  --b-well:rgba(58,42,51,.05);--b-press:rgba(58,42,51,.07);--b-scrim:rgba(40,20,30,.38);
  --b-moon-dark:#F1E6E8;--b-moon-lit:var(--moon);--b-moon-line:var(--ink-3);--b-slab:#E8DCD9;--b-slab-deep:#D2C2BF;--b-strata:rgba(58,42,51,.16);
  --b-sea:#D5DCE4;--b-sea-deep:#C4CDD8;
  --b-l0:#F4EEEA;--b-l1:#EFE9E1;--b-l2:#EAE5D8;--b-l3:#E0E0CC;--b-l4:#D7DAC4;--b-l5:#C6CDB0;--b-l6:#B2B899;--b-l7:#C2BFAE;--b-l8:#D2CCC6;--b-l9:#F4F0EE;
  --b-hi:rgba(255,255,255,.42);--b-shade:#7C6772;--b-contour:rgba(58,42,51,.1);--b-contour-i:rgba(58,42,51,.17);
  --b-river:#8AA3BE;--b-coast:#6A84A0;--b-route:#3A2A33;--b-route-glow:rgba(224,149,46,.24);--b-route-wet:rgba(58,42,51,.08);--b-route-next:rgba(58,42,51,.5);
  --b-sheet:#F2E9E6;--b-grid:rgba(58,42,51,.07);--b-grid-5:rgba(58,42,51,.12);--b-sketch:#6E5C66;
  --b-mass-t:#FBF7F6;--b-mass-l:#EDE5E3;--b-mass-r:#DCD1CF;--b-detail:rgba(58,42,51,.55);
  --b-plaster:#F8F1EE #EBE0DC #D8CBC6;--b-brick:#9A8E96 #847880 #6C6168;--b-timber:#BF8C70 #A6775E #8A624D;--b-tile:#6A5E66 #554A52 #463D44;--b-stone:#D6CCC8 #C3B8B3 #ACA19C;
  --b-window-off:#E6DCD9;--b-window-frame:rgba(58,42,51,.45);
  --b-lamp-1:rgba(224,149,46,.5);--b-lamp-2:rgba(224,149,46,.78);--b-lamp-3:#E0952E;--b-lampbg-1:radial-gradient(90% 75% at 50% 64%,rgba(224,149,46,.4),rgba(224,149,46,.26) 78%);--b-lampbg-2:radial-gradient(90% 80% at 50% 60%,rgba(224,149,46,.7),rgba(224,149,46,.52) 78%);--b-lantern:#C24E5E;
  --b-repair:#BE3A5E;--b-seam:#F0D58A;--b-seam-ink:#8A6A12;--b-halo:#FFFFFF;--b-seal:#D6456C;
  --b-mist:rgba(240,232,234,.72);--b-cloud-1:rgba(214,180,206,.28);--b-cloud-2:rgba(236,214,227,.3);
  --b-pin:#3A2A33;--b-pin-ring:#3A2A33;--b-pin-ink:#FFFFFF;--b-patrol:#3A2A33;--b-patrol-ink:#FFFFFF;--b-grain:0;
  /* 樱花是紫藤月夜的浅色版：圆润的形状沿用 :root，点缀的底色换成樱粉和紫藤，阴影是柔和的藕紫 */
  --b-now-rgb:255,166,201;--b-plan-rgb:176,150,235;--b-glow-rgb:255,214,230;--b-cloud-rgb:190,150,200;--b-mist-rgb:214,180,206;--b-haze-rgb:239,214,227;--b-shadow-rgb:58,30,60;--b-curve:var(--blueprint);
  --b-sky:var(--sky-1);--b-sky-horizon:var(--haze);--b-star:var(--ink);--b-haze:var(--haze);
  --b-plan-fill:var(--blueprint);--b-plan-a:.58;
}
/* 黑板（墨绿，可选）：引擎用原型的 forest 调色；这里只给界面几项 */
:root[data-theme="board"]{
  --b-raised:#1C2924;--b-glass:rgba(28,41,36,.82);--b-glass-2:rgba(22,33,29,.76);--b-glass-line:rgba(228,234,226,.14);
  --b-well:rgba(7,16,13,.32);--b-press:rgba(228,234,226,.1);--b-scrim:rgba(7,12,10,.66);
  --b-moon-dark:#1C2924;--b-slab:#23362F;--b-slab-deep:#07100D;--b-strata:rgba(228,234,226,.14);
  --b-sea:#16303A;--b-sea-deep:#0C1C22;--b-sheet:#1C2924;--b-sketch:#9DB3A8;--b-grid:rgba(228,234,226,.07);--b-grid-5:rgba(228,234,226,.12);
  --b-mist:rgba(43,59,52,.4);--b-cloud-1:rgba(60,81,72,.34);--b-cloud-2:rgba(94,122,109,.24);
  /* 界面里用到、黑板自己没有定义的几项：钉住紫藤月夜之前的值（引擎在黑板里不读 token，用原型的 forest 调色） */
  --b-mass-t:#3A4178;--b-mass-l:#2E3463;--b-mass-r:#262B52;--b-window-frame:rgba(169,184,255,.6);
  --b-r-sm:8px;--b-r-btn:9px;--b-r-seg:10px;--b-r-cta:12px;--b-r-bar:3px;--b-r-cap:14px;--b-r-md:10px;--b-r-lg:12px;--b-r-xl:14px;--b-r-2xl:16px;--b-r-3xl:18px;
  --b-now-rgb:246,185,168;--b-plan-rgb:169,184,255;--b-glow-rgb:255,227,211;--b-cloud-rgb:108,95,168;--b-mist-rgb:156,138,208;--b-haze-rgb:58,52,112;--b-shadow-rgb:5,6,20;--b-curve:#A9B8FF;
  --b-sky:var(--sky-1);--b-sky-horizon:var(--haze);--b-star:var(--ink);--b-haze:var(--haze);
  --b-plan-fill:var(--blueprint);--b-plan-a:.58;
}

/* ───────────────────────── 视图外壳（H9：宿主设 body[data-page]，另用 :has 兜底） ───────────────────────── */
/* 天光的手机 Dock 在底部、iPad 的目录在左边：沙盘从屏幕顶上开始。App 和主屏幕图标里页面铺到状态栏下面（viewport-fit=cover），
   所以顶上的标题、按钮、列表和开场的「跳过」都让开 env(safe-area-inset-top)（tests/app-mode-e2e.mjs） */
body[data-page="base"]{overscroll-behavior:none}
body[data-page="base"] .main,.main:has(>.view>#bw){padding:0}
body[data-page="base"] .view,.view:has(>#bw){max-width:none}
.bw{--bw-top:0px;--bw-side:360px;position:relative;display:grid;grid-template-columns:minmax(0,1fr) var(--bw-side);grid-template-rows:minmax(0,1fr);
  height:100vh;height:100dvh;min-height:420px;background:var(--paper);color:var(--ink);overflow:hidden;overflow:clip;isolation:isolate;contain:layout}
.bw[data-list="1"]{grid-template-columns:minmax(0,1fr)}
.bw[data-list="1"] .bw-stage,.bw[data-list="1"] .bw-sheet{display:none}
/* first-run cinematic: only the map, the caption and 「跳过」. The tools are hidden, not only faded: visibility takes them
   out of the Tab order and the screen reader (it switches after the fade, and back at once when they return) */
.bw-tools,.bw-ctl,.bw-zoom,.bw-scale{transition:opacity .3s,visibility 0s}
.bw.intro .bw-tools,.bw.intro .bw-ctl,.bw.intro .bw-zoom,.bw.intro .bw-scale{opacity:0;visibility:hidden;pointer-events:none;transition:opacity .3s,visibility 0s .3s}
.bw-stage{position:relative;min-width:0;min-height:0;overflow:hidden;overflow:clip;background:radial-gradient(120% 90% at 78% -10%,var(--sky-2),var(--sky-1) 58%),var(--sky-1)}
.bw-map{position:absolute;inset:0;outline:none}
.bw-map:focus-visible{box-shadow:inset 0 0 0 2px var(--now)}
/* 星点只在最外层夜空（静态，非常淡）；浅色主题里 --stars 为 none */
.bw-stage::before{content:"";position:absolute;inset:0;background:var(--stars);background-repeat:no-repeat;opacity:.9;pointer-events:none}
.bw-map>*{position:relative}
.bw-sr,.bw .sr{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}

/* 载入中 / 画不出来 */
.bw-veil{position:absolute;inset:0;display:grid;place-items:center;pointer-events:none;z-index:2}
.bw-veil p{margin:0;padding:8px 16px;border-radius:999px;background:var(--b-glass-2);border:1px solid var(--b-glass-line);color:var(--ink-2);font-size:13.5px;letter-spacing:.04em}
.bw-veil[hidden]{display:none}

/* ───────────────────────── 玻璃面板（HUD、镜头档、缩放、比例尺） ───────────────────────── */
.bw-glass{background:var(--b-glass);border:1px solid var(--b-glass-line);border-radius:var(--b-r-xl);box-shadow:0 10px 28px rgba(var(--b-shadow-rgb),.36);
  -webkit-backdrop-filter:blur(12px) saturate(1.15);backdrop-filter:blur(12px) saturate(1.15)}
.bw-hud{position:absolute;z-index:4;top:calc(12px + env(safe-area-inset-top,0px));left:12px;right:12px;display:flex;align-items:flex-start;gap:10px;pointer-events:none}
.bw-hud>*{pointer-events:auto}
.bw-title{display:grid;gap:2px;padding:9px 14px 10px;min-width:0;max-width:min(560px,100%)}
.bw-title h1{margin:0;font-family:var(--f-serif);font-size:17px;font-weight:700;letter-spacing:.06em;line-height:1.3;display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.bw-title h1 .bw-wk{font-family:var(--f-sans);font-size:13.5px;font-weight:500;letter-spacing:0;color:var(--ink-2)}
.bw-meta{display:flex;flex-wrap:wrap;align-items:center;gap:4px 14px;font-size:12.5px;color:var(--ink-2);line-height:1.5;font-variant-numeric:tabular-nums}
.bw-meta b{color:var(--ink);font-weight:600}
.bw-tools{margin-left:auto;display:flex;gap:6px;flex-wrap:wrap;justify-content:flex-end;align-items:center;padding:5px}
.bw-seg{display:inline-flex;border-radius:var(--b-r-seg);background:var(--b-well);padding:2px;gap:2px}
.bw-btn{appearance:none;-webkit-appearance:none;font:inherit;font-size:13px;font-weight:500;color:var(--ink-2);background:transparent;border:0;border-radius:var(--b-r-btn);
  min-height:36px;min-width:36px;padding:0 11px;cursor:pointer;white-space:nowrap;display:inline-flex;align-items:center;justify-content:center;gap:6px;
  -webkit-tap-highlight-color:transparent;touch-action:manipulation;transition:background .16s,color .16s,transform .12s}
.bw-btn:hover{color:var(--ink);background:var(--b-press)}
.bw-btn:active{transform:scale(.96)}
.bw-btn[aria-pressed="true"],.bw-btn[aria-current="true"]{color:var(--ink);background:var(--b-raised);box-shadow:inset 0 0 0 1px var(--b-glass-line)}
.bw-btn:focus-visible{outline:2px solid var(--now);outline-offset:1px}
.bw-btn svg{width:16px;height:16px;flex:none}
.bw-btn .n{font-variant-numeric:tabular-nums;color:var(--ink-3);font-size:12px}

/* 月相（数据：本周完成的节 / 有步骤的节）与亮窗计数 */
.bw-moon{display:inline-block;width:22px;height:22px;flex:none;vertical-align:middle;overflow:visible}
/* night: a pale peach crescent on an indigo disc; paper themes: the unlit side is paper (like the paper map's moon) and
   the lit part is drawn in the moon's ink, so the phase still reads at 22px */
.bw-moon .md{fill:var(--b-moon-dark)}
.bw-moon .mr{fill:none;stroke:var(--b-moon-line);stroke-opacity:.62;stroke-width:1}
.bw-moon .ml{fill:var(--b-moon-lit)}
.bw-moon .mh{fill:var(--moon);opacity:.16}
.bw-moon.big{width:44px;height:44px}
.bw-lampct{display:inline-flex;align-items:center;gap:6px}
.bw-win{display:inline-grid;grid-template-columns:repeat(3,4px);gap:1.5px;padding:2px;border-radius:2px;background:var(--b-well)}
.bw-win i{width:4px;height:5px;border-radius:.6px;background:var(--b-window-off);box-shadow:inset 0 0 0 .6px var(--b-window-frame)}
.bw-win i.on{background:var(--lamp);box-shadow:0 0 5px var(--lamp-glow)}

/* 同步小旗（§5.12） */
.bsync{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--ink-2);white-space:nowrap;line-height:1.3}
.bsync::before{content:"";width:7px;height:7px;border-radius:50%;flex:none;background:var(--lamp);box-shadow:0 0 6px var(--lamp-glow)}
.bsync.local::before{background:var(--ink);box-shadow:none}
.bsync.busy::before,.bsync.off::before{background:transparent;box-shadow:inset 0 0 0 1.4px var(--ink-2)}
.bsync.err{color:var(--red)}
.bsync.err::before{background:var(--red);box-shadow:none;border-radius:2px;transform:rotate(45deg)}

/* 镜头档、筛选、缩放、比例尺 */
.bw-ctl{position:absolute;z-index:4;left:12px;bottom:calc(12px + env(safe-area-inset-bottom,0px));right:76px;display:flex;flex-wrap:wrap;gap:8px;align-items:flex-end;pointer-events:none}
.bw-ctl>*{pointer-events:auto}
.bw-ctl .bw-glass{padding:4px;display:flex;gap:2px;flex-wrap:wrap;border-radius:var(--b-r-cap)}
.bw-zoom{position:absolute;z-index:4;right:12px;bottom:calc(12px + env(safe-area-inset-bottom,0px));display:flex;flex-direction:column;padding:3px;gap:2px;border-radius:var(--b-r-cap)}
.bw-zoom .bw-btn{width:44px;height:44px;padding:0;font-size:20px;line-height:1}
.bw-scale{position:absolute;z-index:3;right:12px;bottom:calc(118px + env(safe-area-inset-bottom,0px));display:flex;align-items:center;gap:6px;font-size:11.5px;color:var(--ink-2);font-family:var(--b-f-mono);pointer-events:none;text-shadow:0 1px 2px var(--paper)}
.bw-scale i{display:block;height:6px;border:1.5px solid var(--ink-2);border-top:0;min-width:24px}
.bw-chip{font-size:12.5px;min-height:32px;padding:0 11px}
.bw-flt .bw-chip[aria-pressed="true"]{box-shadow:inset 0 0 0 1.5px var(--now)}
.bw-chip .pt{display:inline-grid;place-items:center;width:18px;height:18px;border-radius:50%;background:var(--b-patrol);color:var(--b-patrol-ink);font-size:11px;font-weight:700}

/* ───────────────────────── 抽屉 / 侧栏（桌面常驻 360px；手机底部三档） ───────────────────────── */
.bw-sheet{position:relative;z-index:5;min-width:0;min-height:0;display:flex;flex-direction:column;background:var(--sheet);border-left:1px solid var(--line);overflow:hidden;overflow:clip}
.bw-sheet-bar{display:none}
.bw-sheet-body{flex:1;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;padding:16px 16px 28px;scrollbar-width:thin;scrollbar-color:var(--rule) transparent}
.bw-sheet-body:focus{outline:none}

/* ───────────────────────── 卡片 .bc-* ───────────────────────── */
.bc{display:grid;gap:10px;animation:bc-in .28s var(--b-ease) both}
.bc+.bc{margin-top:18px;padding-top:16px;border-top:1px solid var(--line)}
@keyframes bc-in{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
.bc-head{display:flex;align-items:flex-start;gap:10px}
.bc-head h2{flex:1;margin:0;font-family:var(--f-serif);font-size:17px;line-height:1.4;letter-spacing:.02em;min-width:0}
.bc-head h2 small{display:block;font-family:var(--f-sans);font-size:12.5px;font-weight:500;color:var(--ink-2);letter-spacing:0;margin-top:1px}
.bc-x{flex:none;width:44px;height:44px;margin:-10px -10px -8px 0;border-radius:var(--b-r-cta);font-size:20px;color:var(--ink-2)}
.bc-back{flex:none;margin:-6px 0 -6px -8px}
.bc p{margin:0}
.bc-meta{font-size:13px;color:var(--ink-2);line-height:1.65}
.bc-meta b{color:var(--ink);font-weight:600;font-variant-numeric:tabular-nums}
.bc-line{font-size:13.5px;line-height:1.65}
.bc-now{color:var(--ink)}
.bc-sight{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--ink-2)}
.bc-sight::before{content:"";width:14px;height:8px;border-radius:4px;flex:none;background:linear-gradient(90deg,transparent,var(--cloud) 45%,transparent);opacity:.25}
.bc-sight[data-s="blur"]::before{opacity:.55}
.bc-sight[data-s="fog"]::before{opacity:.95}
.bc-why{margin:0;padding:8px 12px;border-radius:var(--b-r-md);background:var(--fill);font-size:13px;line-height:1.7;color:var(--ink-2)}
.bc-why b{color:var(--ink);font-weight:600}
.bc-note{margin:0;padding:8px 12px 8px 12px;border-left:2px solid var(--rule);font-size:13px;line-height:1.7;color:var(--ink-2)}
.bc-quote{margin:0;padding:10px 12px;border-radius:var(--b-r-md);background:linear-gradient(135deg,rgba(255,197,107,.09),transparent 70%),var(--fill);font-size:13.5px;line-height:1.75;color:var(--ink)}
.bc-quote::before{content:"「";color:var(--lamp)}
.bc-quote::after{content:"」";color:var(--lamp)}
.bc-acts{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.bc-acts .grow{flex:1 1 auto}
.bc-dec{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px}
.bc-dec .bw-btn{min-height:44px;background:var(--b-well);color:var(--ink-2);font-size:13.5px}
.bc-dec .bw-btn[aria-pressed="true"]{background:var(--b-raised);color:var(--ink);box-shadow:inset 0 0 0 1.5px var(--now)}
.bc-go{width:100%;min-height:46px;font-size:15px;font-weight:600;border-radius:var(--b-r-cta)}
.bc-sub{margin:4px 0 0;font-size:12px;color:var(--ink-3);letter-spacing:.08em}
.bc-stats{display:flex;flex-wrap:wrap;gap:6px}
.bc-stat{display:inline-flex;align-items:center;gap:5px;padding:2px 9px;border-radius:999px;background:var(--b-well);font-size:12.5px;color:var(--ink-2);line-height:22px;font-variant-numeric:tabular-nums}
.bc-stat b{color:var(--ink);font-weight:600}
.bc-stat.lit b{color:var(--lamp-ink,var(--lamp))}
.bc-stat.rep b{color:var(--red)}
.bc-sess{display:grid;gap:4px;font-size:13px;line-height:1.6}
.bc-sess>div{display:grid;grid-template-columns:42px minmax(0,1fr);gap:8px}
.bc-sess .k{color:var(--ink-3);font-weight:600}
.bc-sess .k .fl{width:14px;height:14px;margin-left:2px}
.bc-sess .v{color:var(--ink-2)}
.bc-sess .v b{color:var(--ink);font-weight:500}

.bc-peek{appearance:none;width:100%;display:flex;align-items:center;gap:10px;min-height:48px;padding:6px 12px;border-radius:var(--b-r-cta);border:1px solid var(--b-glass-line);
  background:linear-gradient(90deg,rgba(var(--b-now-rgb),.07),transparent 70%),var(--b-well);color:var(--ink);font:inherit;font-size:14px;text-align:left;cursor:pointer}
.bc-peek .t{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bc-peek.quiet{cursor:default;color:var(--ink-2);background:var(--b-well);margin:0}
.bc-pt,.bc-peek .pt{flex:none;display:inline-grid;place-items:center;width:22px;height:22px;border-radius:50%;background:var(--b-patrol);color:var(--b-patrol-ink);font-size:12px;font-weight:700;font-family:var(--f-sans);vertical-align:1px}
.bc-lampgrid{display:grid;gap:4px;padding-bottom:12px}
.bc-lampgrid .nm{color:var(--ink-2);font-size:12.5px}
.kg.in-sheet{padding:12px;border-radius:var(--b-r-xl);background:var(--b-well);max-width:none}
.kg.in-sheet .kg-grid{grid-template-columns:1fr}
.kg.in-sheet .kg-go{grid-template-columns:1fr}
.kg.line.in-sheet{grid-template-columns:auto minmax(0,1fr);background:var(--b-well)}
.kg.line.in-sheet .acts{grid-column:1/-1;justify-content:flex-start}
.bc-peek.kg-mini{display:none;cursor:default;padding:6px 6px 6px 12px;margin-bottom:12px}
.bc-peek.kg-mini .t{white-space:normal;font-size:13.5px;line-height:1.45}
.bc-peek.kg-mini .btn{flex:none;min-height:40px;border-radius:var(--b-r-seg)}

/* 阶段徽章 01–04 与标记（颜色之外都另有形状 / 文字） */
.b-st{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--ink-2);white-space:nowrap;font-variant-numeric:tabular-nums}
.b-st i{font-family:var(--b-f-num);font-style:italic;font-size:13px;color:var(--ink)}
.b-st::before{content:"";width:10px;height:10px;border-radius:2px;flex:none;border:1px solid var(--blueprint);opacity:.85}
.b-st[data-s="2"]::before{background:var(--b-mass-l);border-color:var(--blueprint)}
.b-st[data-s="3"]::before{background:linear-gradient(135deg,transparent 45%,var(--blueprint) 46% 54%,transparent 55%),var(--b-mass-t)}
.b-st[data-s="4"]::before{background:var(--lamp);border-color:var(--lamp);box-shadow:0 0 6px var(--lamp-glow)}
.b-mk{display:inline-flex;align-items:center;gap:4px;font-size:12px;white-space:nowrap}
.b-mk.rep{color:var(--red)}
.b-mk.rep::before{content:"";width:12px;height:0;border-top:1.5px dashed var(--red)}
/* 金缝: the label and its zigzag read in the seam's ink (pale gold at night, a deep gold ≥ 4.5:1 on paper); the house
   engines keep drawing the seam itself with --b-seam */
.b-mk.seam{color:var(--b-seam-ink)}
.b-mk.seam::before{content:"";width:12px;height:6px;background:linear-gradient(135deg,transparent 40%,var(--b-seam-ink) 41% 55%,transparent 56%) 0 0/6px 6px repeat-x}
.b-mk.trial{color:var(--red)}
.b-mk.inf{color:var(--ink-3);font-style:italic}
.b-mk.fog{color:var(--ink-3)}

/* 灯窗条：一步一格，亮度三级（§6.5）；点亮时闪两下后稳住 */
.bc-lamps{display:flex;flex-wrap:wrap;gap:4px;align-items:center}
/* a small window with a mullion: dark indigo when unlit (never grey); three brightness steps when lit */
.bc-lamp{width:13px;height:16px;border-radius:2px 2px 1px 1px;background:var(--b-window-off);box-shadow:inset 0 0 0 1px var(--b-window-frame);position:relative;display:inline-block}
.bc-lamp::after{content:"";position:absolute;left:50%;top:1px;bottom:1px;width:1px;margin-left:-.5px;background:var(--b-window-frame);opacity:.55}
/* level 1 is a dim lamp of the same amber hue (§6.2 --b-lamp-1 #FFB347 α .55 on average), not a pale cream over indigo:
   ≈ rgb(159,109,59), 46% saturation, 2.05:1 darker than level 2 */
.bc-lamp[data-lit="1"]{background:var(--b-lampbg-1),var(--b-window-off);box-shadow:inset 0 0 0 1px rgba(255,197,107,.5)}
.bc-lamp[data-lit="2"]{background:var(--b-lampbg-2),var(--b-window-off);box-shadow:inset 0 0 0 1px rgba(255,214,150,.7),0 0 7px rgba(255,159,67,.3)}
.bc-lamp[data-lit="3"]{background:radial-gradient(90% 80% at 50% 58%,#FFF1D0,var(--lamp) 62%,#FFB347);box-shadow:inset 0 0 0 1px #FFE6B0,0 0 10px var(--lamp-glow),0 5px 12px -3px var(--lamp-glow)}
.bc-lamp[data-lit="1"]::after,.bc-lamp[data-lit="2"]::after,.bc-lamp[data-lit="3"]::after{background:rgba(58,37,8,.5)}
.bc-lamp.now{outline:1.5px solid var(--now);outline-offset:2px}
.bc-lamp.ign{animation:b-ign .6s ease-out both;animation-delay:calc(var(--i,0) * 90ms)}
@keyframes b-ign{0%{filter:brightness(.25)}18%{filter:brightness(1.35)}32%{filter:brightness(.45)}52%{filter:brightness(1.25)}70%{filter:brightness(.8)}100%{filter:none}}
.bc-lamps-row{display:grid;grid-template-columns:62px minmax(0,1fr);gap:8px;align-items:center;font-size:12.5px;color:var(--ink-2)}
.bc-lamps-row .nm{white-space:nowrap}
.bc-lamps-row.cur .nm{color:var(--ink);font-weight:600}
.bc-lamps-row.cur .nm::after{content:" ☾";color:var(--now)}
/* 湿路倒影：窗灯在地面拉出的竖向淡影（静态） */
.b-wet{position:relative}
.b-wet::after{content:"";position:absolute;left:4%;right:4%;top:100%;height:12px;pointer-events:none;
  background:repeating-linear-gradient(90deg,transparent 0 5px,rgba(255,214,150,.13) 5px 6px,transparent 6px 13px,rgba(var(--b-plan-rgb),.1) 13px 14px,transparent 14px 23px);
  -webkit-mask-image:linear-gradient(180deg,rgba(0,0,0,.8),transparent);mask-image:linear-gradient(180deg,rgba(0,0,0,.8),transparent);filter:blur(.4px)}

/* 构件组抽屉的零件行（也是列表视图与读屏的路径）：每行 ≥44pt */
.bc-rows{list-style:none;margin:0;padding:0;display:grid}
.bc-row{display:grid;grid-template-columns:44px minmax(0,1fr) auto;align-items:center;gap:4px 8px;min-height:48px;border-top:1px solid var(--line);padding:2px 0}
.bc-row:first-child{border-top:0}
.bc-row .say-b{width:40px;height:40px;border-radius:50%;background:var(--b-well);color:var(--ink-2);padding:0}
.bc-row .say-b:hover{color:var(--ink)}
.bc-row .nm{min-width:0;text-align:left;background:none;border:0;padding:8px 0;font:inherit;font-size:14px;color:var(--ink);cursor:pointer;line-height:1.35}
.bc-row .nm small{display:block;font-size:12px;color:var(--ink-3);font-family:var(--f-ipa)}
.bc-row .st{display:flex;flex-direction:column;align-items:flex-end;gap:2px}
.bc-row.hl{background:linear-gradient(90deg,rgba(var(--b-now-rgb),.12),transparent 70%);box-shadow:inset 2px 0 0 var(--now)}
.bc-group{display:grid;gap:4px}
.bc-row.gr{grid-template-columns:24px minmax(0,1fr) 20px}
.bc-row.gr .b-st{justify-content:center}
.bc-row.gr .nm small{font-family:var(--f-sans);color:var(--ink-2);font-size:12.5px;margin-top:2px}
.bc-row.gr .nm small.t2{color:var(--ink-3);font-size:12px;margin-top:0}
.bc-row.gr .st{color:var(--ink-3);font-size:18px}
.bc-note details{margin-top:4px}
.bc-note summary{cursor:pointer;color:var(--ink-3);font-size:12.5px;min-height:28px;display:flex;align-items:center}
.bc-note ul{margin:4px 0 0;padding-left:1.2em;display:grid;gap:4px}
.bc-sess .k .fl{width:15px;height:15px;vertical-align:-2px}
.bc-group>h3{margin:6px 0 0;font-size:13px;font-weight:600;color:var(--ink-2);display:flex;align-items:center;gap:8px}
.bc-group>h3 .ct{font-weight:400;color:var(--ink-3);font-variant-numeric:tabular-nums}

/* 零件卡在它那一行下面展开（构件组的行仍在眼前） */
.bc-inl{list-style:none;padding:2px 0 12px}
.bc-part-in{gap:8px;padding:12px 12px 12px 14px;border-radius:var(--b-r-lg);background:var(--b-well);border:1px solid var(--b-glass-line);box-shadow:inset 2px 0 0 var(--now);animation:none}
.bc-part-in .bc-head h3{flex:1;margin:0;font-family:var(--f-serif);font-size:15.5px;line-height:1.4;min-width:0}
.bc-part-in .bc-head h3 small{display:block;font-family:var(--f-ipa);font-size:12.5px;font-weight:500;color:var(--ink-2)}
.bc-part-in .bc-head h3:focus{outline:none}
.bc-part-in .bc-x{width:40px;height:40px;margin:-8px -8px -6px 0}

/* 记忆剖面（估计）：纵轴只写三档词 */
.bc-curve{display:grid;grid-template-columns:34px minmax(0,1fr);gap:4px 6px;align-items:stretch;font-size:11.5px;color:var(--ink-3)}
.bc-curve .ax{display:flex;flex-direction:column;justify-content:space-between;text-align:right;padding:2px 0 16px}
.bc-curve svg{width:100%;height:112px;overflow:visible;display:block}
.bc-curve .band{fill:var(--cloud);opacity:.07}
.bc-curve .grid{stroke:var(--line);stroke-width:1}
.bc-curve .past{fill:none;stroke:var(--blueprint);stroke-width:1.8;stroke-linejoin:round;stroke-linecap:round}
.bc-curve .area{fill:url(#bc-curve-g)}
/* the area under the curve: ui.js writes the stops in the old moonlight blue; the plan colour of the theme wins (浅色、黑板仍是原来的蓝) */
.bc-curve stop{stop-color:var(--b-curve,#A9B8FF)}
.bc-curve .next{fill:none;stroke:var(--lamp);stroke-width:1.6;stroke-dasharray:4 4}
.bc-curve .dot{fill:var(--now);stroke:var(--paper);stroke-width:2}
.bc-curve .tick{fill:var(--ink-3);font-size:10px;font-family:var(--f-sans)}
.bc-curve .tick.now{fill:var(--now)}
.bc-curve-head{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--ink-2)}
.bc-play{width:40px;height:40px;border-radius:50%;background:var(--b-raised);color:var(--ink);padding:0;font-size:13px}

/* ───────────────────────── 开工单 .kg-*（今日顶部） ───────────────────────── */
#wb-today-top:empty{display:none}
#wb-today-top{margin:0 0 22px}
.kg{position:relative;overflow:hidden;background:radial-gradient(90% 140% at 100% 0%,rgba(var(--b-now-rgb),.08),transparent 55%),var(--sheen,none),var(--sheet);
  border:1px solid var(--line);border-radius:var(--b-r-2xl);padding:16px 18px 16px;display:grid;gap:12px;max-width:1080px;box-shadow:var(--card-hl,none)}
.kg::before{content:"";position:absolute;right:-40px;top:-60px;width:200px;height:200px;border-radius:50%;pointer-events:none;
  background:radial-gradient(circle,rgba(var(--b-glow-rgb),.06),transparent 65%)}
.kg-head{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px}
.kg-head h2{margin:0;font-family:var(--f-serif);font-size:18px;letter-spacing:.04em;display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.kg-head h2 small{font-family:var(--f-sans);font-size:13px;font-weight:500;color:var(--ink-2);letter-spacing:0}
.kg-head .bsync{margin-left:auto}
.kg-moonbtn{appearance:none;border:0;background:none;padding:0;cursor:pointer;display:inline-flex;align-items:center;gap:6px;color:var(--ink-2);font-size:12.5px;min-height:32px;border-radius:var(--b-r-sm)}
.kg-moonbtn:focus-visible{outline:2px solid var(--now);outline-offset:2px}
.kg-course{margin:-6px 0 0;font-size:14px;color:var(--ink);font-weight:500}
.kg-grid{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);gap:14px 22px;align-items:start}
.kg-bars{display:grid;gap:10px;padding-bottom:14px}
.kg-bar{display:grid;grid-template-columns:30px minmax(56px,1fr) auto minmax(0,auto);align-items:center;gap:4px 10px;font-size:13px}
.kg-bar .nm{color:var(--ink-2);font-weight:600}
.kg-bar.cur .nm{color:var(--ink)}
.kg-bar .tr{position:relative;height:10px;border-radius:var(--b-r-bar);background:var(--b-well);box-shadow:inset 0 0 0 1px var(--b-grid-5);overflow:hidden}
.kg-bar .tr i{position:absolute;top:0;bottom:0;border-radius:0}
.kg-bar .tr .c{left:0;background:var(--b-plan-fill);opacity:var(--b-plan-a)}
.kg-bar .tr .p{background:repeating-linear-gradient(135deg,var(--ink) 0 2px,transparent 2px 4.5px);opacity:.9}
.kg-bar .tr .over{background:var(--red)}
.kg-bar .tr .nw{width:2px;background:var(--now);box-shadow:0 0 6px var(--now);z-index:1}
.kg-bar .v{font-variant-numeric:tabular-nums;color:var(--ink-2);white-space:nowrap;text-align:right}
.kg-bar .v b{color:var(--ink);font-weight:600}
.kg-bar .fin{font-size:12px;color:var(--ink-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.kg-bar.done .tr .c{background:var(--lamp);opacity:.7}
.kg-bars.b-wet::after{top:auto;bottom:0}
.kg-pt{display:grid;gap:8px;align-content:start}
.kg-pt h3{margin:0;font-size:12.5px;font-weight:600;color:var(--ink-3);letter-spacing:.06em;display:flex;align-items:center;gap:8px}
.kg-pt h3::after{content:"";flex:1;border-top:1px dashed var(--rule)}
.kg-pt .ttl{margin:0;font-size:15px;font-weight:600;display:flex;align-items:flex-start;gap:8px;line-height:1.45}
.kg-pt .ttl .pt{flex:none;display:inline-grid;place-items:center;width:22px;height:22px;border-radius:50%;background:var(--b-patrol);color:var(--b-patrol-ink);font-size:12px;font-weight:700;margin-top:1px}
.kg-pt .sub{margin:0;font-size:13px;color:var(--ink-2);line-height:1.6}
.kg-dec{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.kg-dec .bw-btn{min-height:40px;background:var(--b-well);font-size:13.5px}
.kg-dec .bw-btn[aria-pressed="true"]{background:var(--b-raised);color:var(--ink);box-shadow:inset 0 0 0 1.5px var(--now)}
.kg-dec .kg-next{margin-left:auto;color:var(--ink-2)}
.kg-go{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px 16px;align-items:center}
.kg-go .btn{min-height:46px;font-size:15px;font-weight:600;border-radius:var(--b-r-cta)}
.kg-go .late{margin:0;font-size:12.5px;color:var(--ink-2);line-height:1.5}
.kg-go .late b{color:var(--ink);font-variant-numeric:tabular-nums}
.kg-wait{margin:0;padding:8px 12px;border-radius:var(--b-r-md);background:var(--fill);font-size:13.5px;display:flex;flex-wrap:wrap;align-items:center;gap:8px}
.kg-none{margin:0;font-size:13.5px;color:var(--ink-2)}
/* 收起成一行 */
.kg.line{grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:10px 14px;padding:10px 12px 10px 16px}
.kg.line .kg-ok{font-size:14px;line-height:1.5;min-width:0}
.kg.line .kg-ok b{font-weight:600}
.kg.line .kg-ok small{display:block;color:var(--ink-3);font-size:12px}
/* 「定」: a small vermilion seal (朱印), stamped once when she accepts the plan */
.kg-seal{width:28px;height:28px;border-radius:5px;display:grid;place-items:center;color:var(--b-seal);border:1.5px solid var(--b-seal);background:rgba(255,143,133,.08);
  font-size:15px;font-weight:700;font-family:var(--f-serif);transform:rotate(-5deg)}
.kg.line .acts{display:flex;gap:8px;align-items:center;flex-wrap:wrap;justify-content:flex-end}
.kg.fresh .kg-seal{animation:kg-stamp .5s cubic-bezier(.2,1.4,.4,1) both}
@keyframes kg-stamp{from{transform:scale(1.7) rotate(-14deg);opacity:0}70%{transform:scale(.94) rotate(-4deg);opacity:1}to{transform:rotate(-5deg);opacity:1}}
.kg-invite{display:grid;grid-template-columns:auto minmax(0,1fr) auto auto;align-items:center;gap:10px 12px;padding:12px 14px 12px 16px;border-radius:var(--b-r-xl);border:1px dashed var(--rule);
  background:radial-gradient(60% 120% at 0% 50%,rgba(var(--b-now-rgb),.07),transparent 70%),var(--sheet)}
.kg-invite p{margin:0;font-size:14px;line-height:1.5}
.kg-invite .bw-moon{width:28px;height:28px}
@media (max-width:560px){.kg-invite{display:flex;flex-wrap:wrap}.kg-invite p{flex:1 1 calc(100% - 44px)}.kg-invite .btn:first-of-type{margin-left:40px}}
@media (max-width:860px){
  .kg-grid{grid-template-columns:1fr}
  .kg{padding:14px 14px 14px}
}
@media (max-width:560px){
  .kg-go{grid-template-columns:1fr}
  .kg.line{grid-template-columns:auto minmax(0,1fr)}
  .kg.line .acts{grid-column:1/-1;justify-content:stretch}
  .kg.line .acts .btn{flex:1}
}

/* 复盘页那一行（H22） */
.brv{margin:0 0 10px;padding:8px 10px 8px 12px;border-radius:var(--b-r-md);background:var(--fill);font-size:13.5px;display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.brv .btn{margin-left:auto}
/* 设置里的「沙盘」段 */
.bset{display:grid;gap:10px}
.bset .row{display:flex;flex-wrap:wrap;gap:8px 16px;align-items:center}

/* ───────────────────────── 课中施工图 .bm-*（#wb-lesson-head） ───────────────────────── */
#wb-lesson-head:empty{display:none}
#wb-lesson-head{margin:0 0 12px}
.bm{position:relative;border:1px solid var(--line);border-radius:var(--b-r-lg);background:linear-gradient(90deg,rgba(var(--b-plan-rgb),.05),transparent 60%),var(--sheet);overflow:hidden}
.bm-line{display:flex;align-items:center;gap:10px;min-height:40px;padding:4px 6px 4px 12px;font-size:13px;color:var(--ink-2)}
.bm-line .no{flex:none;display:inline-grid;place-items:center;min-width:20px;height:20px;padding:0 5px;border-radius:10px;border:1.5px solid var(--now);color:var(--now);font-size:11.5px;font-weight:700;font-variant-numeric:tabular-nums}
.bm-line .tx{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bm-line .tx b{color:var(--ink);font-weight:600}
.bm-line .tx .hint{color:var(--blueprint)}
.bm.tall .bm-line{min-height:56px}
.bm-toggle{flex:none;min-height:40px}
.bm-plan{flex:none;display:grid;grid-template-columns:repeat(3,6px);grid-auto-rows:6px;gap:2px;padding:4px;border-radius:5px;background:var(--b-well)}
.bm-plan i{border-radius:1px;background:var(--b-mass-r);box-shadow:inset 0 0 0 .6px var(--b-window-frame)}
.bm-plan i.st{background:var(--b-mass-t)}
.bm-plan i.now{background:var(--now);box-shadow:0 0 4px var(--now)}
.bm-scene{position:relative;height:180px;border-top:1px dashed var(--b-grid-5);background:
  linear-gradient(var(--b-grid) 1px,transparent 1px) 0 0/16px 16px,linear-gradient(90deg,var(--b-grid) 1px,transparent 1px) 0 0/16px 16px,var(--b-sheet)}
.bm-canvas{position:absolute;inset:0}
.bm-scale{position:absolute;left:10px;bottom:8px;font-size:11px;color:var(--ink-3);font-family:var(--b-f-mono);display:flex;align-items:center;gap:5px}
.bm-scale i{display:block;width:28px;height:5px;border:1.2px solid var(--ink-3);border-top:0}
.bm-tray{display:flex;gap:6px;overflow-x:auto;padding:8px 10px 10px;border-top:1px solid var(--line);scrollbar-width:none}
.bm-tray::-webkit-scrollbar{display:none}
.bm-tray button{flex:none;font-size:13px;min-height:36px;padding:0 12px;border-radius:999px;background:var(--b-well);color:var(--ink)}
.bm-tray button.rep{box-shadow:inset 0 0 0 1px var(--red)}
.bm-tray .lbl{flex:none;align-self:center;font-size:12px;color:var(--ink-3);padding-right:4px}
.bm-first{padding:0 12px 10px;font-size:12.5px;color:var(--ink-2)}
.bm-first summary{cursor:pointer;min-height:32px;display:flex;align-items:center;gap:6px;list-style:none}
.bm-first summary::-webkit-details-marker{display:none}
.bm-first summary::before{content:"▸";color:var(--ink-3);transition:transform .18s}
.bm-first[open] summary::before{transform:rotate(90deg)}
.bm-first ol{margin:4px 0 0;padding-left:1.4em;display:grid;gap:3px}
.bm-offer{display:flex;align-items:center;gap:8px;padding:0 12px 8px;font-size:12.5px;color:var(--ink-2)}
.bm-offer::before{content:"";width:12px;height:12px;flex:none;border:1px solid var(--blueprint);border-radius:2px;background:linear-gradient(var(--blueprint),var(--blueprint)) 50% 0/1px 100% no-repeat,linear-gradient(var(--blueprint),var(--blueprint)) 0 50%/100% 1px no-repeat;opacity:.8}

/* ───────────────────────── 小红花卡片里的一块 .bf-*（一节完成） ───────────────────────── */
/* the host's 小红花 card grows with this block: let the overlay scroll instead of pushing 「好耶」 off screen */
.celebrate:has(.bf){overflow-y:auto;overscroll-behavior:contain;place-items:start center;padding-top:max(20px,env(safe-area-inset-top,0px));padding-bottom:max(20px,env(safe-area-inset-bottom,0px))}
.cele-card:has(.bf){max-width:420px;margin:auto 0}
@media (max-width:560px){.cele-card:has(.bf){padding:20px 18px 18px;--cp-x:18px;--cp-b:18px}.cele-card:has(.bf) .fl.big{width:64px;height:64px}.bf-scene{height:150px}}
.bf{margin:0 0 16px;text-align:left;display:grid;gap:10px}
.bf-scene{position:relative;height:176px;border-radius:var(--b-r-lg);overflow:hidden;border:1px solid var(--line);
  background:radial-gradient(80% 90% at 70% 0%,var(--sky-2),transparent 70%),
  linear-gradient(var(--b-grid) 1px,transparent 1px) 0 0/14px 14px,linear-gradient(90deg,var(--b-grid) 1px,transparent 1px) 0 0/14px 14px,var(--b-sheet)}
.bf-canvas{position:absolute;inset:0}
.bf-cap{margin:-2px 0 0;font-size:12.5px;color:var(--ink-2);line-height:1.6}
.bf-lamps{position:absolute;right:10px;top:10px;display:flex;gap:3px;padding:4px 5px;border-radius:6px;background:var(--b-glass-2)}
.bf-lamps .bc-lamp{width:9px;height:12px}
.bf-moon{margin:0;display:flex;align-items:center;gap:10px;font-size:13.5px;color:var(--ink)}
.bf-moon .bw-moon{width:28px;height:28px}
.bf-wait{display:grid;gap:6px;padding:10px 12px;border-radius:var(--b-r-lg);background:var(--fill)}
.bf-wait h4{margin:0;font-family:var(--f-serif);font-size:14px;display:flex;align-items:center;gap:8px}
.bf-wait h4::after{content:"";flex:1;border-top:1px dashed var(--rule)}
.bf-wait p{margin:0;font-size:12.5px;color:var(--ink-2);line-height:1.6}
.bf-wait ol{list-style:none;margin:0;padding:0;display:grid;gap:4px}
.bf-wait li{display:grid;grid-template-columns:86px minmax(0,1fr);gap:8px;font-size:13px;line-height:1.5}
.bf-wait li .d{color:var(--ink-2);font-variant-numeric:tabular-nums;white-space:nowrap}
.bf-wait .if{font-size:12px;color:var(--ink-3)}
.bf-pt{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:8px 10px;border-radius:var(--b-r-lg);border:1px solid var(--b-glass-line);font-size:13px}
.bf-pt .t{flex:1 1 180px}
.bf-seal{display:flex;justify-content:center}
.bf-seal .btn{min-height:44px}

/* ───────────────────────── 巡查覆盖层 #bd（全屏，一次一题；做题时画面不动） ───────────────────────── */
#bd{position:fixed;inset:0;z-index:80;display:flex;flex-direction:column;color:var(--ink);
  background:radial-gradient(70% 55% at 85% -8%,rgba(var(--b-glow-rgb),.07),transparent 60%),radial-gradient(90% 60% at 10% 110%,rgba(var(--b-cloud-rgb),.12),transparent 70%),var(--stars),var(--paper);
  padding:env(safe-area-inset-top,0px) env(safe-area-inset-right,0px) env(safe-area-inset-bottom,0px) env(safe-area-inset-left,0px)}
#bd[hidden]{display:none}
.bd-top{display:flex;align-items:center;gap:10px;padding:10px 12px 8px 16px;border-bottom:1px solid var(--line)}
.bd-top h2{flex:1;margin:0;font-family:var(--f-serif);font-size:16px;min-width:0;line-height:1.35}
.bd-top h2 small{font-family:var(--f-sans);font-weight:500;font-size:12.5px;color:var(--ink-2);margin-left:6px;font-variant-numeric:tabular-nums}
.bd-stop{min-height:44px}
.bd-prog{display:flex;gap:3px;padding:0 16px;margin-top:10px}
.bd-prog i{flex:1;height:4px;border-radius:2px;background:var(--b-well);box-shadow:inset 0 0 0 1px var(--b-grid-5)}
.bd-prog i.ok{background:var(--lamp);box-shadow:0 0 6px var(--lamp-glow)}
.bd-prog i.no{background:var(--red);opacity:.75}
.bd-prog i.cur{background:var(--now)}
.bd-body{flex:1;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}
.bd-main{max-width:640px;margin:0 auto;padding:22px 18px 28px;display:grid;gap:16px}
@media (min-width:861px){
  .bd-body{padding:28px 20px 40px}
  .bd-main{background:linear-gradient(180deg,rgba(var(--b-plan-rgb),.05),transparent 140px),var(--sheet);border:1px solid var(--line);border-radius:var(--b-r-3xl);padding:28px 30px 30px;box-shadow:var(--shadow-1)}
  .bd-top{max-width:700px;width:100%;margin:0 auto;border-bottom:0;padding-top:18px}
  .bd-prog{max-width:668px;width:100%;margin:6px auto 0;padding:0}
}
.bd-q{margin:0;text-align:center;display:grid;gap:6px}
.bd-q .zh{font-size:26px;font-weight:700;color:var(--ink);line-height:1.3}
.bd-q .en{font-size:20px;font-weight:600;line-height:1.45}
.bd-q .hint{font-size:13px;color:var(--ink-2)}
.bd-q .mask{font-family:var(--b-f-mono);font-size:17px;letter-spacing:.06em;color:var(--ink-2);word-spacing:.3em;line-height:1.8}
.bd-play{display:flex;justify-content:center;gap:8px;flex-wrap:wrap}
.bd-play .btn{min-height:44px}
.bd-in{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px}
.bd-in input,.bd-in textarea{font-size:18px;min-height:48px;padding:10px 14px;border-radius:var(--b-r-lg);font-family:var(--f-sans)}
.bd-in textarea{min-height:88px;grid-column:1/-1}
.bd-in .btn{min-height:48px;border-radius:var(--b-r-cta);font-size:15px}
.bd-in .btn:disabled{opacity:1;background:transparent;color:var(--ink-3);border:1px solid var(--line);box-shadow:none}
.bd-res{display:grid;gap:8px;padding:12px 14px;border-radius:var(--b-r-lg);background:var(--sheet);border:1px solid var(--line)}
/* right = the theme's --ok (amber in 月夜, like a lit lamp), wrong = --red; half strength where color-mix exists */
.bd-res[data-ok="1"]{border-color:var(--ok)}
.bd-res[data-ok="0"]{border-color:var(--red)}
@supports (color:color-mix(in srgb,red 50%,transparent)){
  .bd-res[data-ok="1"]{border-color:color-mix(in srgb,var(--ok) 50%,transparent)}
  .bd-res[data-ok="0"]{border-color:color-mix(in srgb,var(--red) 45%,transparent)}
}
.bd-res p{margin:0;font-size:14px;line-height:1.7}
.bd-res .verdict{font-weight:700;font-size:15px}
.bd-res[data-ok="1"] .verdict{color:var(--ok)}
/* 答对：说明前亮一颗小星芒（宿主的 --spk，只在紫藤月夜和樱花里有） */
.bd-res[data-ok="1"] .verdict::before{content:"";display:var(--spk-di,none);width:12px;height:12px;margin-right:6px;vertical-align:-1px;background:var(--spk,none);filter:var(--spk-f,none)}
.bd-res[data-ok="0"] .verdict{color:var(--red)}
.bd-row{display:grid;grid-template-columns:44px minmax(0,1fr);gap:8px;align-items:baseline;font-size:14px}
.bd-row .k{color:var(--ink-3);font-size:12.5px}
.bd-letters{font-family:var(--b-f-mono);font-size:19px;letter-spacing:.1em;line-height:1.6;overflow-wrap:anywhere}
.bd-letters span{display:inline-block;padding:0 1px;border-radius:3px;white-space:pre}
.bd-letters .add{color:var(--red);text-decoration:line-through;text-decoration-thickness:1.5px}
.bd-letters .miss{color:var(--paper);background:var(--ok)}
.bd-letters .sub{color:var(--red);text-decoration:underline wavy;text-underline-offset:4px}
.bd-toks{font-size:17px;line-height:2;display:flex;flex-wrap:wrap;gap:2px 8px}
.bd-toks span{white-space:nowrap}
.bd-toks .ok{color:var(--ink)}
.bd-toks .ok::after{content:" ✓";color:var(--ok);font-size:12px}
.bd-toks .no{color:var(--red);text-decoration:underline wavy;text-decoration-color:var(--red);text-underline-offset:5px}
.bd-toks .no::after{content:" ✗";font-size:12px}
.bd-cause{font-size:13.5px;color:var(--ink-2)}
.bd-cause b{color:var(--ink)}
.bd-opts{display:grid;gap:8px}
.bd-opt{position:var(--spk-pos,static);appearance:none;text-align:left;font:inherit;font-size:16px;min-height:52px;padding:10px 16px;border-radius:var(--b-r-lg);border:1px solid var(--ctl);background:var(--sheet);color:var(--ink);cursor:pointer;display:grid;gap:2px}
.bd-opt small{font-size:12.5px;color:var(--ink-2)}
.bd-opt:hover:not(:disabled){border-color:var(--ink-3)}
.bd-opt:disabled{cursor:default}
.bd-opt.right{border-color:var(--ok);background:var(--ok-soft);box-shadow:var(--glow-ok,none)}
.bd-opt.right::after{content:"";display:var(--spk-d,none);position:absolute;right:-6px;top:-7px;width:15px;height:15px;background:var(--spk,none);filter:var(--spk-f,none);pointer-events:none;animation:spk-in .5s cubic-bezier(.2,1.4,.4,1) both}
.bd-opt.wrong{border-color:var(--red);background:var(--red-soft)}
.bd-pairs{display:flex;gap:12px;justify-content:center;flex-wrap:wrap}
.bd-pairs .bd-opt{min-width:130px;text-align:center;font-size:22px;font-weight:700;justify-items:center}
.bd-passage{padding:12px 14px;border-radius:var(--b-r-lg);background:var(--fill);font-size:15px;line-height:1.85}
.bd-passage p{margin:0}
.bd-passage .zh{margin-top:6px;font-size:13.5px;color:var(--ink-2)}
.bd-passage details summary{cursor:pointer;color:var(--ink-2);font-size:13px;min-height:32px;display:flex;align-items:center}
#bd-res{display:grid;gap:14px}
#bd-res:empty{display:none}
.bd-next{display:flex;justify-content:center}
.bd-next .btn{min-width:min(100%,320px);min-height:48px;border-radius:var(--b-r-cta);font-size:15px}
.bd-self{display:flex;justify-content:flex-start}
.bd-q:focus{outline:none}
.bd-pairs .bd-opt small{font-size:13px;font-weight:500}
/* 结束页：那一间上空的薄雾被一道斜刃劈开 */
.bd-end{max-width:560px;margin:0 auto;padding:28px 18px;display:grid;gap:16px;text-align:center}
.bd-end h3{margin:0;font-family:var(--f-serif);font-size:22px}
.bd-end p{margin:0;color:var(--ink-2);font-size:14.5px;line-height:1.7}
.bd-end .big{font-size:15px;color:var(--ink)}
.bd-cleave{position:relative;height:150px;border-radius:var(--b-r-xl);overflow:hidden;border:1px solid var(--line);
  background:radial-gradient(60% 80% at 50% 100%,rgba(255,159,67,.14),transparent 70%),linear-gradient(180deg,var(--sky-2),var(--sky-1))}
.bd-cleave .room{position:absolute;left:50%;bottom:22px;width:150px;height:74px;transform:translateX(-50%);background:var(--b-mass-l);border:1px solid var(--b-window-frame);border-radius:3px 3px 0 0;display:flex;align-items:center;justify-content:center;gap:10px;padding:0 12px}
.bd-cleave .room::before{content:"";position:absolute;left:-14px;right:-14px;top:-26px;height:28px;background:var(--b-mass-t);clip-path:polygon(10% 100%,90% 100%,100% 70%,50% 0,0 70%);border-bottom:1px solid var(--b-window-frame)}
.bd-cleave .room i{width:16px;height:20px;border-radius:2px;background:var(--b-window-off);box-shadow:inset 0 0 0 1px var(--b-window-frame)}
.bd-cleave .room i.on{background:var(--lamp);box-shadow:0 0 12px var(--lamp-glow)}
.bd-cleave .ground{position:absolute;left:0;right:0;bottom:0;height:22px;background:linear-gradient(180deg,rgba(255,197,107,.12),transparent),var(--b-well)}
/* the mist thins to the room's sight after the patrol (data-s from Derived: 清楚 clears, 有点模糊 / 起雾了 keep a veil) */
.bd-cleave{--mist-end:0}
.bd-cleave[data-s="blur"]{--mist-end:.4}
.bd-cleave[data-s="fog"]{--mist-end:.66}
.bd-cleave .mist{position:absolute;inset:0;background:radial-gradient(60% 55% at 50% 70%,rgba(var(--b-mist-rgb),.72),rgba(var(--b-cloud-rgb),.4) 60%,transparent 80%);
  transition:opacity .65s .25s cubic-bezier(.3,0,.2,1),transform .65s .25s cubic-bezier(.3,0,.2,1)}
.bd-cleave.go .mist,.bd-cleave.done .mist{opacity:var(--mist-end);transform:translateY(-8px) scale(1.04)}
.bd-cleave .blade{position:absolute;top:-20%;bottom:-20%;width:3px;left:-10%;background:linear-gradient(180deg,transparent,rgba(var(--b-glow-rgb),.9),transparent);transform:rotate(25deg);opacity:0;box-shadow:0 0 14px rgba(var(--b-glow-rgb),.7)}
.bd-cleave.go .blade{animation:bd-blade .65s .25s cubic-bezier(.3,0,.2,1) forwards}
@keyframes bd-blade{0%{left:-10%;opacity:0}15%{opacity:1}85%{opacity:1}100%{left:110%;opacity:0}}
.bd-end .bd-sight{justify-self:center;display:inline-flex;align-items:center;gap:8px;margin:-6px 0 0;padding:3px 12px;border-radius:999px;background:var(--b-well);font-size:13.5px;line-height:1.6;color:var(--ink-2)}
.bd-end .bd-sight::before{content:"";width:16px;height:8px;border-radius:4px;flex:none;background:linear-gradient(90deg,transparent,var(--cloud) 45%,transparent);opacity:.25}
.bd-end .bd-sight[data-s="blur"]::before{opacity:.55}
.bd-end .bd-sight[data-s="fog"]::before{opacity:.95}
.bd-sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}
.bd-end .acts{display:flex;gap:10px;justify-content:center;flex-wrap:wrap}
.bd-end .acts .btn{min-height:46px;min-width:120px;border-radius:var(--b-r-cta)}

/* ───────────────────────── 落成礼 #bw-seal（全屏） ───────────────────────── */
#bw-seal{position:fixed;inset:0;z-index:70;display:grid;place-items:center;background:var(--b-scrim);padding:max(16px,env(safe-area-inset-top,0px)) 16px max(16px,env(safe-area-inset-bottom,0px));overflow:auto}
#bw-seal[hidden]{display:none}
.bw-seal-card{position:relative;width:min(560px,100%);display:grid;gap:14px;padding:18px;border-radius:var(--b-r-3xl);background:var(--sheet);border:1px solid var(--line);box-shadow:var(--shadow-2)}
.bw-seal-scene{position:relative;height:240px;border-radius:var(--b-r-lg);overflow:hidden;background:var(--stars),radial-gradient(80% 90% at 78% 0%,var(--sky-2),var(--sky-1) 70%);background-repeat:no-repeat}
.bw-seal-scene canvas{position:absolute;inset:0;width:100%;height:100%}
.bw-seal-sky{position:absolute;right:18px;top:14px;pointer-events:none}
/* the ground under the floating courtyard: violet haze, and where windows are lit a small warm pool of lamplight */
.bw-seal-scene::before{content:"";position:absolute;left:12%;right:12%;bottom:4%;height:46%;border-radius:50%;pointer-events:none;
  background:radial-gradient(closest-side,rgba(var(--b-haze-rgb),.55),rgba(var(--b-haze-rgb),.18) 70%,transparent)}
.bw-seal-scene.lit::before{background:radial-gradient(closest-side,rgba(255,159,67,.13),rgba(var(--b-haze-rgb),.4) 55%,rgba(var(--b-haze-rgb),.12) 80%,transparent)}
.bw-seal-sky .bw-moon{width:58px;height:58px;filter:drop-shadow(0 0 16px rgba(var(--b-glow-rgb),.35))}
.bw-seal-cap{position:absolute;left:12px;right:12px;bottom:10px;margin:0;font-size:12.5px;color:var(--ink-2);text-shadow:0 1px 3px var(--paper);min-height:1.5em}
.bw-seal-skip{position:absolute;left:10px;top:10px;min-height:32px;background:var(--b-glass-2)}
.bw-tb h3 small{display:block;font-family:var(--f-sans);font-size:12.5px;font-weight:500;color:var(--ink-2);letter-spacing:0;margin-top:2px}
.bw-stamp-hint{font-size:11.5px;color:var(--ink-3);letter-spacing:.04em}
.bw-stamp.still{cursor:default;pointer-events:none;opacity:.9}
.bw-stamp.sealed .ring{display:none}
@media (max-width:560px){
  #bw-seal .bw-tb{grid-template-columns:1fr}
  #bw-seal .bw-tb .stamp{border-left:0;border-top:1.5px solid var(--blueprint);grid-auto-flow:column;justify-content:center;align-items:center;gap:14px;padding:12px}
  #bw-seal .bw-stamp{width:76px;height:76px;font-size:15px}
}
.bw-tb{display:grid;grid-template-columns:minmax(0,1fr) auto;border:1.5px solid var(--blueprint);border-radius:4px;font-size:13px}
.bw-tb>div{padding:8px 12px;display:grid;gap:4px;line-height:1.55}
.bw-tb h3{margin:0;font-family:var(--f-serif);font-size:16px;letter-spacing:.04em}
.bw-tb .num{font-family:var(--b-f-num);font-style:italic;font-size:15px;color:var(--ink)}
.bw-tb .stamp{border-left:1.5px solid var(--blueprint);display:grid;place-items:center;gap:6px;padding:10px 14px}
.bw-stamp{position:relative;width:88px;height:88px;border-radius:10px;border:2px dashed var(--b-seal);color:var(--b-seal);display:grid;place-items:center;
  font-family:var(--f-serif);font-weight:700;font-size:17px;line-height:1.25;text-align:center;letter-spacing:.2em;cursor:pointer;background:transparent;touch-action:none;user-select:none;-webkit-user-select:none}
.bw-stamp .ring{position:absolute;inset:-7px;border-radius:14px;pointer-events:none}
.bw-stamp .ring svg{width:100%;height:100%;overflow:visible}
.bw-stamp .ring rect{fill:none;stroke:var(--now);stroke-width:2.5;stroke-dasharray:var(--len,400);stroke-dashoffset:var(--len,400)}
.bw-stamp.holding .ring rect{transition:stroke-dashoffset .6s linear;stroke-dashoffset:0}
.bw-stamp.sealed{border-style:solid;background:var(--b-seal);color:var(--paper);animation:bw-seal-in .5s cubic-bezier(.2,1.2,.4,1) both;box-shadow:0 0 0 6px rgba(255,143,133,.12)}
@keyframes bw-seal-in{0%{transform:scale(1.15)}60%{transform:scale(.97)}100%{transform:none}}
.bw-seal-line{margin:0;text-align:center;font-family:var(--f-serif);font-size:15.5px;line-height:1.7}
.bw-seal-acts{display:flex;gap:10px;justify-content:space-between;flex-wrap:wrap}
.bw-seal-acts .btn{min-height:44px}

/* ───────────────────────── 首跑开场 #bw-intro ───────────────────────── */
#bw-intro{position:absolute;inset:0;z-index:7;pointer-events:none}
#bw-intro[hidden]{display:none}
.bw-intro-skip{position:absolute;top:calc(12px + env(safe-area-inset-top,0px));right:12px;pointer-events:auto}
.bw-intro-cap{position:absolute;left:50%;bottom:calc(var(--b-peek) + 22px);transform:translateX(-50%);max-width:min(520px,calc(100% - 24px));padding:10px 16px;
  border-radius:var(--b-r-lg);text-align:center;font-size:14px;line-height:1.6;pointer-events:none}
.bw-intro-cap b{color:var(--lamp);font-weight:600}
.bw-intro-end{position:absolute;left:50%;bottom:74px;transform:translateX(-50%);max-height:calc(100% - 150px);overflow-y:auto;width:min(440px,calc(100% - 24px));padding:18px;display:grid;gap:12px;pointer-events:auto;border-radius:var(--b-r-3xl);background:var(--sheet);box-shadow:var(--shadow-2),0 0 0 1px var(--b-glass-line)}
.bw-intro-end h2{margin:0;font-family:var(--f-serif);font-size:18px;display:flex;align-items:center;gap:12px;line-height:1.35}
.bw-intro-end h2 .bw-moon{width:34px;height:34px}
.bw-intro-end h2 small{display:block;font-family:var(--f-sans);font-size:12.5px;font-weight:500;color:var(--ink-2)}
.bw-intro-end ul{margin:0;padding:0;list-style:none;display:grid;gap:6px;font-size:13.5px;line-height:1.6}
.bw-intro-end li{display:grid;grid-template-columns:18px minmax(0,1fr);gap:8px}
.bw-legend{display:flex;flex-wrap:wrap;gap:6px 14px;font-size:12.5px;color:var(--ink-2);padding-top:10px;border-top:1px solid var(--line)}
.bw-legend span{display:inline-flex;align-items:center;gap:6px}
.bw-legend .ln{width:18px;height:0;border-top:1.5px solid var(--blueprint)}
.bw-legend .lt{width:8px;height:10px;border-radius:1.5px;background:var(--lamp);box-shadow:0 0 6px var(--lamp-glow)}
.bw-legend .nw{width:10px;height:10px;border-radius:50%;border:2px solid var(--now)}

/* 回放条：按真实日期，拖动即跳；01–04 标出真正到达的日期 */
.bw-replay{position:absolute;left:50%;bottom:calc(var(--b-peek) + 18px + env(safe-area-inset-bottom,0px));transform:translateX(-50%);width:min(520px,calc(100% - 24px));padding:8px 10px 10px;display:grid;gap:4px;pointer-events:auto;border-radius:var(--b-r-xl)}
.bw-replay-row{display:grid;grid-template-columns:40px minmax(0,1fr) 40px;align-items:center;gap:8px}
.bw-replay-row .bc-x{margin:0;width:40px;height:40px}
.bw-replay-r{width:100%;accent-color:var(--now);height:28px}
.bw-replay-cap{margin:0 4px;font-size:13px;line-height:1.55;color:var(--ink-2);min-height:1.55em}
.bw-replay-cap b{color:var(--ink);font-weight:600}
.bw-replay-marks{margin:0 4px;display:flex;flex-wrap:wrap;gap:4px 14px;font-size:12px;color:var(--ink-2);font-variant-numeric:tabular-nums}
.bw-replay-marks i{font-family:var(--b-f-num);font-style:italic;color:var(--ink)}
.bw-replay-marks .no{color:var(--ink-3)}
@media (min-width:861px){.bw-replay{bottom:calc(74px + env(safe-area-inset-bottom,0px))}}

/* ───────────────────────── 列表视图 #bw-list（可访问的兜底） ───────────────────────── */
.bw-list{grid-column:1/-1;overflow-y:auto;padding:calc(18px + env(safe-area-inset-top,0px)) clamp(16px,4vw,40px) calc(60px + env(safe-area-inset-bottom,0px));background:var(--paper)}
.bw-list[hidden]{display:none}
.bw-list-in{max-width:880px;display:grid;gap:18px}
.bw-list h1{margin:0;font-family:var(--f-serif);font-size:22px;display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.bw-list h1 .bw-btn{margin-left:auto}
.bw-lw{border:1px solid var(--line);border-radius:var(--b-r-xl);background:var(--sheet);overflow:hidden}
.bw-lw>header{padding:12px 16px;display:grid;gap:4px;border-bottom:1px solid var(--line)}
.bw-lw>header h2{margin:0;font-family:var(--f-serif);font-size:17px}
.bw-lw.veiled{border-style:dashed;background:transparent}
.bw-list-card{padding:14px 16px;border-color:var(--now)}
.bw-lw.veiled>header{border-bottom:0}
.bw-ld{border-top:1px solid var(--line)}
.bw-ld:first-of-type{border-top:0}
.bw-ld>summary{list-style:none;cursor:pointer;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:4px 12px;align-items:center;padding:10px 16px;min-height:52px}
.bw-ld>summary::-webkit-details-marker{display:none}
.bw-ld>summary .t{font-weight:600;font-size:14.5px}
.bw-ld>summary .m{grid-column:1/2;font-size:12.5px;color:var(--ink-2)}
.bw-ld>summary .a{grid-row:1/3;grid-column:2;display:flex;gap:6px;flex-wrap:wrap;justify-content:flex-end}
.bw-ld>div{padding:0 16px 14px;display:grid;gap:12px}
.bw-ld .bc-lamps{margin-top:2px}

/* ───────────────────────── 图纸架（三张图纸、两个槽） ───────────────────────── */
.bc-bp{display:grid;grid-template-columns:44px minmax(0,1fr);gap:4px 12px;align-items:start;padding:12px;border-radius:var(--b-r-lg);border:1px solid var(--b-glass-line);
  background:linear-gradient(var(--b-grid) 1px,transparent 1px) 0 0/12px 12px,linear-gradient(90deg,var(--b-grid) 1px,transparent 1px) 0 0/12px 12px,var(--sheet)}
.bc-bp .bd{display:grid;gap:6px;min-width:0}
.bc-bp-g{width:44px;height:44px;fill:none;stroke:var(--blueprint);stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round;opacity:.9}
.bc-bp-g .f{stroke-width:.7;opacity:.55}
.bc-bp h3{margin:0;font-size:14.5px;display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px}
.bc-bp h3 .lv{font-size:12px;color:var(--blueprint);border:1px solid var(--blueprint);border-radius:4px;padding:0 5px;font-weight:500}
.bc-bp p{font-size:13px;color:var(--ink-2);line-height:1.6}
.bc-bp p.num b{color:var(--ink);font-variant-numeric:tabular-nums;font-weight:600}
.bc-bp p.fx{font-size:12.5px;color:var(--ink-3)}
.bc-bp.on{border-color:var(--blueprint);box-shadow:inset 3px 0 0 var(--blueprint)}
.bc-bp.on .bc-bp-g{filter:drop-shadow(0 0 4px rgba(var(--b-plan-rgb),.45))}
.bc-bp.offer{border-style:dashed;border-color:var(--blueprint)}
.bc-bp.empty{border-style:dashed;color:var(--ink-3);font-size:13px;background:transparent;align-items:center;min-height:68px}
.bc-bp.empty .bc-bp-g{opacity:.3}
.bc-bp .bc-dec{margin-top:2px}

/* ───────────────────────── 桌面 / 手机布局 ───────────────────────── */
@media (min-width:861px){
  .bw-sheet-body{padding:calc(18px + env(safe-area-inset-top,0px)) 18px calc(32px + env(safe-area-inset-bottom,0px))}
}
@media (max-width:1100px) and (min-width:861px){.bw{--bw-side:330px}}
@media (max-width:860px){
  /* 手机：顶栏以下铺满；卡片在底部抽屉，三档 124px / 52% / 92% */
  .bw{grid-template-columns:minmax(0,1fr);height:calc(100vh - var(--bw-top));height:calc(100dvh - var(--bw-top));min-height:360px}
  .bw-stage{grid-column:1;grid-row:1}
  .bw-sheet{position:absolute;left:0;right:0;bottom:0;z-index:6;height:92%;border-left:0;border-top:1px solid var(--b-glass-line);border-radius:var(--b-r-3xl) var(--b-r-3xl) 0 0;
    background:var(--sheet);box-shadow:0 -12px 32px rgba(var(--b-shadow-rgb),.42);transform:translateY(calc(100% - var(--b-peek) - env(safe-area-inset-bottom,0px)));
    transition:transform .28s var(--b-ease);will-change:transform;touch-action:pan-y}
  .bw[data-sheet="half"] .bw-sheet{transform:translateY(calc(100% - 52% / .92))}
  .bw[data-sheet="full"] .bw-sheet{transform:none}
  .bw.drag .bw-sheet{transition:none}
  .bw-sheet-bar{display:flex;align-items:center;justify-content:flex-end;gap:0;height:34px;padding:0 6px;touch-action:none;cursor:grab;position:relative}
  .bw-sheet-bar::before{content:"";position:absolute;top:9px;left:50%;width:40px;height:4px;margin-left:-20px;border-radius:2px;background:var(--rule)}
  .bw-sheet-bar .bw-btn{min-height:34px;min-width:40px;padding:0 8px;color:var(--ink-3);font-size:10px;background:none;box-shadow:none}
  .bw-sheet-bar .bw-btn[aria-expanded="true"]{color:var(--now);opacity:1}
  /* 浅色主题的 --now 是亮琥珀（#F5B544），10px 的「▼」在纸色上只有 2.87:1：字用它的深色版 --now-ink（life.css） */
  :root[data-theme="light"] .bw-sheet-bar .bw-btn[aria-expanded="true"]{color:var(--now-ink,var(--now))}
  .bw-sheet-body{padding:6px 16px calc(28px + env(safe-area-inset-bottom,0px))}
  .bw-hud{top:calc(10px + env(safe-area-inset-top,0px));left:10px;right:10px;flex-wrap:wrap}
  .bw-title{flex:1 1 100%;padding:8px 12px 9px}
  .bw-title h1{font-size:15.5px;gap:8px}
  .bw-tools{position:absolute;right:4px;top:4px;padding:0;background:none;border:0;box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none}
  .bw-tools .bw-btn{min-height:34px;padding:0 9px;font-size:12.5px}
  .bw-title h1{min-height:30px}
  .bw-title h1 .bw-wk{flex-basis:100%}
  .bc-peek.kg-mini{display:flex}
  .bw-ctl{left:10px;bottom:calc(var(--b-peek) + 12px + env(safe-area-inset-bottom,0px))}
  .bw-zoom{right:10px;bottom:calc(var(--b-peek) + 12px + env(safe-area-inset-bottom,0px))}
  .bw-scale{right:10px;bottom:calc(var(--b-peek) + 118px + env(safe-area-inset-bottom,0px))}
  /* under a half / full drawer the camera and zoom controls are hidden, not only faded (no invisible Tab stops) */
  .bw-ctl,.bw-zoom,.bw-scale{transition:opacity .2s,visibility 0s}
  .bw[data-sheet="half"] .bw-ctl,.bw[data-sheet="half"] .bw-zoom,.bw[data-sheet="half"] .bw-scale,
  .bw[data-sheet="full"] .bw-ctl,.bw[data-sheet="full"] .bw-zoom,.bw[data-sheet="full"] .bw-scale{opacity:0;visibility:hidden;pointer-events:none;transition:opacity .2s,visibility 0s .2s}
  /* at peek the drawer shows one row: its body does not scroll inside that window, and a swipe on it is the drawer's
     (ui.js drags the whole sheet at peek) */
  .bw[data-sheet="peek"] .bw-sheet{touch-action:none}
  .bw[data-sheet="peek"] .bw-sheet-body{overflow:hidden}
  .bw-list{grid-row:1}
  .bw-seal-card{padding:14px}
  .bw-intro-end{top:auto;bottom:calc(10px + env(safe-area-inset-bottom,0px));transform:translateX(-50%);max-height:calc(100% - 20px);overflow-y:auto;padding:16px}
  .bw-intro-cap{bottom:calc(var(--b-peek) + 76px)}
  .bw-seal-scene{height:170px}
}
@media (max-width:400px){
  .bw-ctl .bw-btn{padding:0 8px;font-size:12.5px}
  .bw-title h1 .bw-wk{flex-basis:100%}
}
/* small host buttons inside Base surfaces: ≥ 36px with a mouse, 44pt on touch (§11.8 热区) */
.bw .btn.sm,.kg .btn.sm,.kg-invite .btn.sm,.bf .btn.sm,.brv .btn.sm,.bset .btn.sm,#bw-seal .btn.sm,#bd .btn.sm{min-height:36px}
/* the room names in the week card's lamp rows: a quiet left-aligned button (the other lamp rows' labels are plain text) */
.bc-lamps-row button.nm{justify-content:flex-start;padding:0 4px;min-height:32px}
@media (pointer:coarse){
  /* every Base control is ≥ 44 × 44 on touch (§11.8). The later, more specific rules below beat the compact phone
     rules above (drawer bar, HUD tools, 开工单 decisions, the moon line, card and replay buttons). */
  .bw-btn{min-height:44px}
  .bw-ctl .bw-btn,.bw-zoom .bw-btn{min-height:44px;min-width:44px}
  .bw .btn.sm,.kg .btn.sm,.kg-invite .btn.sm,.bf .btn.sm,.brv .btn.sm,.bset .btn.sm,#bw-seal .btn.sm,#bd .btn.sm,.bw .btn,.kg .btn,.bc-peek.kg-mini .btn{min-height:44px}
  .bw-sheet-bar .bw-btn,.kg-dec .bw-btn,.kg-moonbtn,.bc-back,.bc-play,.bc-row .say-b,.bc-part-in .bc-x,.bw-replay-row .bw-btn,
  .bm-toggle,.bm-tray button,.bw-list h1 .bw-btn,.bc-lamps-row button.nm,.bw-seal-skip,.bw-intro-skip{min-height:44px;min-width:44px}
  .bc-lamps-row button.nm{height:44px}
  .bc-part-in .bc-x{width:44px;height:44px;margin:-10px -10px -8px 0}
  .bc-row .say-b,.bc-play{width:44px;height:44px}
  .bw-replay-row{grid-template-columns:44px minmax(0,1fr) 44px}
  .bw-replay-row .bc-x{width:44px;height:44px}
  .bw-replay-r{height:44px}
  .bc-note summary,.bm-first summary,.bd-passage details summary{min-height:44px}
  /* the drawer's bar (its drag handle and the three height buttons) is 44px tall on touch */
  .bw-sheet-bar{height:44px}
  .bw-sheet-bar::before{top:8px}
  /* the HUD tools keep their compact 34px look; each gets an invisible 44px-tall hit area */
  .bw-tools .bw-btn{position:relative;min-width:44px}
  .bw-tools .bw-btn::after{content:"";position:absolute;left:0;right:0;top:-5px;bottom:-5px}
}
/* ───────────────────────── 动效（app/fx.js，ADDENDUM 9）：巡查的答题反馈、小红花卡片里的飞入 ─────────────────────────
   只动 transform / opacity。巡查里的选项和按钮按下缩到 0.97、松手弹回；答对、答错的金光和珊瑚光由 fx.js 的子元素做（只动 opacity）。
   小红花卡片按 fx.js 的编排出场时（.celebrate.fx），飞入那一块镶一道淡淡的月光边：它是这张卡片编排里的一幕。 */
.bd-opt,.bd-play .btn,.bd-next .btn,.bd-in .btn{transition:transform .45s cubic-bezier(.2,1.6,.4,1),box-shadow .2s}
.bd-opt:active:not(:disabled),.bd-play .btn:active,.bd-next .btn:active,.bd-in .btn:active:not(:disabled){transform:scale(.97);transition-duration:.08s}
.bd-toks span{display:inline-block}
.celebrate.fx .bf-scene{box-shadow:0 0 0 1px rgba(var(--b-plan-rgb),.14),0 14px 32px -20px rgba(var(--b-shadow-rgb),.9),inset 0 1px 0 rgba(var(--b-glow-rgb),.08)}
@media (prefers-reduced-motion:reduce){
  .bw-sheet,.bc,.bc-lamp.ign,.kg.fresh .kg-seal,.bd-cleave .mist,.bd-cleave .blade,.bw-stamp.sealed{transition:none!important;animation:none!important}
  .bd-opt,.bd-play .btn,.bd-next .btn,.bd-in .btn{transition:none!important}
}
@media print{.bw,#bd,#bw-seal{display:none!important}}
