/* hoop.css — the ONE stylesheet of Hoop OS.
   Every app page links this file and carries zero inline styles: tokens, components
   and per-app sections all live here, so a visual change is a change in one place.
   Layout uses CSS LOGICAL properties throughout (inline-start/end, not left/right):
   that is what lets ar (RTL) flip the whole OS by flipping <html dir> alone.

   ═══ THE PAGE CODEX (V0.1.7 ② — law, not style) ═══════════════════════════════
   Every page declares ONE of three templates before it is built. No page may
   invent a fourth structure.
   T1 DOCUMENT   single 42rem column: h1.app + .lede + N × (.sect + .card);
                 inside cards only .kv/.opts/.row/.feed/form pieces.
                 (settings, vpn, memory, files, calendar, finance today)
   T2 WORKBENCH  sidebar + main working area, fixed header, 46rem reading column,
                 ≤900px the sidebar becomes a drawer. (chat, terminal, mail ④)
   T3 IMMERSIVE  a full-screen stage, ≤5 elements on it. (home / logged-out door)
   Codex articles: spacing only from the --sp-* scale; type only from the --fs-*
   scale (roles documented at the token block); ALL pictographs from icons.js —
   emoji are content, never interface; buttons ≤4 chars zh / ≤2 words en, long
   explanations go to .note; zh copy uses full-width punctuation, en half-width.

   ═══ CODEX ARTICLE 4 — THREE VOICES + THE WORDMARK (V0.2.0 ①) ═══════════════
   Serif = soul · Sans = body · Mono = machine. The body of the OS is Sans
   (--font-ui); Serif (--font-brand) is CLAIMED by role, never inherited; Mono
   (--mono) is for what a machine said. Serif ≤ 10–20% of any screen. The true
   HoopGram mark alone uses Marcellus (--font-wordmark): a seal, not a fourth
   content voice. Inline mentions of the name remain in their surrounding voice.
   ROLE TABLE (the only places Serif may appear):
     actual HoopGram wordmark ..................... Marcellus Regular  (.brand)
     the hoop sutra ............................... Serif Regular  (#hbrand)
     hero lines: home / public card / apex ........ Serif Regular, big, airy (.p-home)
     page title h1.app (T1), chat greeting .hi .... Serif Regular
     the PA's reply body, mail reading, the reader,
     researcher reports .rpt ...................... Serif Regular — the second voice
                                                    (.m.pa, .mw-body, .rd-col, .rpt)
   Everything else — nav, tabs, buttons, inputs, labels, captions, .sect, forms,
   card titles h3/h4, the OWNER's own messages — is Sans Regular/Medium(500).
   Numbers, money, timestamps, .tbl, addresses, hostnames, status, .steps —
   Mono or Sans tabular-nums.
   WEIGHT LAW: hierarchy = size + space + face + Regular/Medium, never a stair of
   bolds. 500 is the heaviest UI weight (buttons, small headings, active items);
   Serif headings are never bold; the only 600 is inline <strong> in prose.

   ═══ CODEX ARTICLE 5 — THE MATERIALS (V0.1.8 ②) ═════════════════════════════
   One grammar for every control, so they are visibly the work of one hand:
   PAPER  inputs, .btn-secondary, .chip, .opt, #cwrap: --surface + a half-strength
          line (--line-soft) + --shadow-1 — lifted 1mm off the page, never boxed.
          Focus = the --focus glow only; the border never thickens.
   KEY    .btn-primary (and #send): brand fill + --shadow-key (a 1px inner
          highlight on top, a 1px inner shade below) — the ONLY place that pair
          is written. Pressing = 1px down (translateY) + shadow gone. Hover =
          brightness +3%, never a new colour.
   GHOST  .btn-ghost, .hbtn, .cbtn, menu rows: nothing until hover (--lift).
   TONAL  .btn-tonal: --surface-2 fill, no line. DANGER: ghost red, red lift.
   LINES  --line is translucent ink (8% of --fg), so it melts into any theme;
          dividers are 1px var(--line) everywhere — never 2px, never a hex.
          --line-2 (16%) is the rail/track strength (blockquotes, switch track).
   CARDS  fill + 1px line, never fill + line + shadow.
   SHADOW two rungs only: --shadow-1 (paper) and --shadow-pop (floating layers);
          plus the two non-depth tokens --shadow-key (key material) and --focus.
          grep box-shadow → tokens only.
   SHAPE  (②b, owner's eye 2026-08-20 evening: "more curve, Apple's hand") standalone
          buttons, chips and options are CAPSULES (--r-pill); inputs --r-in 14px;
          cards --r-xl 24px; the composer, menus and sheets --r-2xl 28px; every icon
          button is a CIRCLE. Heights two rungs: --btn-h 34px, --btn-h-sm 28px.
          Sidebars share the page's --bg with at most a 1px --line at the edge.
   GLASS  (②b) floating layers — menus, modals, the palette, the capture, floats,
          the mobile dock, toasts — are .glass: --glass-bg + backdrop blur + the
          specular rim --glass-rim (light on top, a hair of shade below). Depth is
          rim + blur, never a border. prefers-reduced-transparency → solid.
   VOLUME (②b) --shadow-key now carries the key's own glow beneath it; --shadow-1
          carries a top-edge highlight, so paper reads as a slab, not a fill.

   ═══ CODEX ARTICLE 6 — THE NARROW LAW & THE PICK (V0.1.8 ⑥) ═══════════════════
   Born of three phone screenshots: a 15,883px settings page (two elements shared
   an id), a VPN table wider than the screen, a mail pane that stacked sideways.
   IDS     an id belongs to the script that targets it; anchors and groups use
           data-* attributes, never a second id. tools/lint-shell.mjs refuses a page
           with a duplicate id (update.sh runs it before every build).
   WIDTH   nothing is wider than its container. Tables and <pre> scroll INSIDE their
           own box (.tblw / .card pre / .p-vpn table); flex children carry min-width:0;
           ≤600px every form row is single-column and every input takes the row.
   CHOICE  ≤3 options with no hints may sit inline as .opt chips. Four or more, or
           any option that needs a hint, is a .pick: one row — label · current value
           · › — that opens the options as a .menu on desktop and as a bottom .sheet
           on a phone (HoopUI.pick). Never a wall of chips.
   POSTURE HoopUI.menu is the ONE popover; ≤720px it rises as a sheet by itself.
   AUDIT   after every deploy, the mobile audit (HANDOFF) loads every page in a 430px
           frame and reports any scrollWidth > viewport. Zero is the only pass.

   ═══ CODEX ARTICLE 7 — ONE DOOR, NO FLOOR (V0.1.9 ①②, owner's five screenshots) ═
   ONE DOOR   a setting or action has ONE landing place; everything else is an
              entrance to it. Settings = the settings surface (modal ≥900 / sheet on a
              phone / the page for deep links); the owner menu, the dock gear and every
              /settings link only open it. Never a second copy of a control.
   NO FLOOR   floating layers own no strip of page: the composer, the hoop button, the
              menus and sheets hover over content that flows beneath them (glass + blur).
              On a phone there is NO bottom bar: one hoop button → the App sheet.
   INPUTS     ≤720px every text input is 16px (iOS zooms the page on anything smaller);
              the chat frame follows the visual viewport (--vvh) so the composer rides
              on top of the keyboard.
   DENY       features of platforms (projects, libraries, plans, voice modes) are not
              organs of a Hoop. Ten apps, the dock, ⌘K — that is the whole body.

   ═══ CODEX ARTICLE 8 — LAYERS (V0.1.9 ④, the sheet that would not close) ═══════
   Every floating thing — menu, sheet, modal, palette, capture — is a LAYER on the one
   stack in hoop-ui.js (HoopUI.layerOpen). The stack owns the ways out: Esc and the
   phone's back gesture close the top layer; a scrim closes on CLICK, never on
   pointerdown (the tap that closes must be absorbed, or it lands on what was beneath
   — closing 语言 opened 主题); a scrimless popover closes on an outside press and
   swallows the click that follows; every sheet carries a × and a grabber; leaving a
   page goes through HoopUI.go(href), which unwinds the layers first. Pages never
   write their own pointerdown-to-close (tools/lint-shell.mjs forbids it outside
   hoop-ui.js / nav.js); tools/mobile-audit.js taps every scrim for real and expects
   zero layers afterwards.

   ═══ CODEX ARTICLE 9 — THE TOP BAR (V0.1.9 ⑤, the owner's phone) ═══════════════
   One bar on every page, one grammar: LEFT is where I came from (← on an app page,
   the sidebar toggle on chat), CENTRE the page's name (shown only once its own h1 has
   scrolled away — nothing is said twice), RIGHT at most two page actions as ghost
   circles. Glass, no floor: content flows beneath it. nav.js draws it (#hooptop) on
   every page but chat, where chat.html's own header wears the same class (.topbar).
   Also art. 6 tightened: a value with a finite set of choices is ALWAYS a .pick —
   long sets get a search box (timezone), never a text field with a save key.

   ═══ CODEX ARTICLE 10 — THE WINDOW CHROME (V0.2.3 C1, "a computer, not a website") ═
   Every window and every App page wears ONE .win-chrome, drawn by hoop-ui.js
   (windows) and nav.js (pages) — no App draws its own close, zoom or minimize.
   Three 12px lights, 8px apart, on the PHYSICAL LEFT in every locale, RTL included:
   this is the codex's single sanctioned non-logical position (macOS keeps them
   there in Arabic; muscle memory beats mirroring). Close = the layer stack's close;
   zoom = the page route ↔ the window; minimize = a capsule in the dock tray
   (#dock-tray) that restores on click. ≥900px up to four free windows (z-order by
   focus, drag by the title, resize at the end-bottom corner, positions kept per App
   in localStorage — interface state, never the owner's config); <900px one window;
   ≤800px the page; ≤720px the lights fold to a single × (art. 9's top bar).
   The lock screen (T3) owns the one display-size rung: --fs-display.

   ═══ CODEX ARTICLE 11 — ONE MATERIAL SOURCE (V0.2.4) ═══════════════════════
   Navigation surfaces — top bars, menu bars, dock sheets, drawers and window
   chrome — receive .bar-glass. That class is the single definition of their
   translucent material and lower hairline; pages and scripts may only attach it.
   A navigation selector must never paint background:var(--surface) for itself.

   ═══ CODEX ARTICLE 12 — ONE LANGUAGE, ONE TEXT (V0.2.4) ═════════════════════
   Public copy shows exactly the current HoopI18n language. Slogans, engravings
   and buttons have idiomatic zh-CN / en / ar strings; no English fallback is
   displayed beside a translation and no two language versions share a view.

   ═══ THE COMPONENT CONTRACT (V0.1.4) ══════════════════════════════════════════
   Pages may ONLY build UI from these pieces — never restyle them, never invent new
   one-off variants. If a page needs something new, it gets added HERE first.

   tokens     type scale --fs-*, space scale --sp-*, radius scale --r-*, shadows,
              colors: --brand/--brand-ink/--on-brand (amber), --accent (blue),
              --bg/--surface/--surface-2/--fg/--dim/--line/--lift/--ok/--bad/--warn.
              Rule: components reference tokens only; no magic hex, no magic px.
              Brand amber & blue are ACCENTS — never large filled areas.
   .btn       buttons. Variants: .btn-primary (amber CTA, max one per view),
              .btn-tonal (soft fill), .btn-secondary (outline), .btn-ghost (quiet),
              .btn-danger (outline red). Size: .btn-sm. Never style <button> ad hoc.
   inputs     input/select/textarea are styled GLOBALLY (border, radius, focus ring).
              Pages size them (width) but never re-skin them.
   .card      surface block; h3 title / h4 row-title / .meta / pre body.
   .sect      section label between cards (optional count badge .n).
   .tabs      underline tabs; active = .on (amber underline).
   .row       quiet link-action row under a card (a / a.primary / a.danger).
   .opt       choice chip (radio-like); active = .cur, staged = .stage.
   .onoff     toggle switch; on = .on.
   .chip      suggestion pill (chat hello).
   .perm      permission chip (label + level + adjust link).
   .empty     empty state (dashed box, .glyph icon line).
   icons      ALL UI pictographs come from icons.js (HoopIcons, nav.js-style 1.7px
              stroke SVG): <span data-icon="name"> fills itself. Emoji are content
              (chat, mail bodies) — NEVER interface. [data-icon] sizing lives here.
   .menu      floating context menu (a items, .danger).
   .tip       mac-style hover tooltip: the name floats in beside an icon. Never on
              touch. (nav.js's dock injects a token-riding copy of these rules so
              /trader — which has no hoop.css — keeps its tooltips too.)
   .modal     every modal window uses HoopUI.window + .ui-close. Confirm/prompt
              build on it; native confirm()/alert()/prompt() are banned.
   .toast     transient notice via HoopUI.toast().
   .kv        key/value grid. .feed/.evt audit stream. .list-box/.ent file rows.
   .tbl       data table (th dim labels, tabular-nums, .num end-aligned).
   .rpt       long-form report text (pre-wrap serif). .curve inline SVG sparkline.
   .capture   the ⌘J spark catcher: one input over a scrim, Enter saves, Esc goes.
   .timeline  journal timeline (.tl-day anchors, .tl-item time+text rows).
   .shelf     the library: .spine book cards. .player the record player bar.
   .reader    T3 immersive reading stage (epub/pdf/text), .night for lamplight.
   .skel      loading shimmer. .applybar password-confirm bar (the owner's pen).
   .float     (V0.1.8 ③) ANY floating control — scroll-to-latest, the record player,
              the compose card, progress — lives on the inline-END side in the dock's
              own column (--float-end keeps a 32px piece on the dock's axis; wide
              pieces hug the same edge). Never on the start side: one pillar, not two.
              ≤720px it drops to the centre above the bottom bar.
   .pick      (⑥) selector row: label (+ .pk-badge, .pk-n note) · value · ›. .picks
              stacks them with hairlines. Options open via HoopUI.pick → .menu/.sheet;
              rows inside are .mo (check · label · hint). .pk-v.staged = brand (pending).
   .sheet     (⑥) .menu's phone posture: bottom, full width, grabber, .sheet-scrim.
   .cdot      the conversation dot: rest = --line-2, busy = breathing brand, unread =
              solid brand. #owner the owner card at a sidebar's foot (avatar · name ·
              hoop name · status) → HoopUI.ownerMenu(). #mpick the model capsule.
   ══════════════════════════════════════════════════════════════════════════════ */

/* ── the HoopGram type identity (V0.1.5 serif + mono; V0.1.8 ① the sans body) ─
   Serif 思源宋体 + Source Serif 4 · Sans 思源黑体 + Inter + Noto Sans Arabic ·
   Mono Maple Mono — self-hosted slices, see fonts/README.md. The stacks keep full
   system fallbacks: offline or missing-slice never renders naked. @import must
   stay the first rule of this file. */
@import url("/fonts.css");
/* the metric-matched stand-in for Inter while its slice is still in flight:
   same x-height, so swap-in moves nothing (size-adjust, then overrides ÷ it) */
@font-face{font-family:"Inter Fallback"; src:local("Helvetica Neue"),local("Arial");
  size-adjust:105%; ascent-override:92.2%; descent-override:23%; line-gap-override:0%}

/* ── tokens: the three themes ───────────────────────────────────────────────
   1. default (no data-theme) = 系统黄蓝: warm light below, warm dark via media.
   2. <html data-theme="light"> = 白色为主: near-pure white, amber at minimum.
   3. <html data-theme="dark">  = 暗色为主: charcoal always, amber glows.
   EVERY color token is defined on bare :root; theme blocks only override. */
:root{
  /* brand: amber leads, blue assists — both as accents only */
  --brand:#F5B301; --brand-600:#E0A200; --on-brand:#221A00;
  --brand-ink:#9C7500;                      /* brand as readable text/icon on bg */
  --brand-soft:rgba(245,179,1,.13);         /* brand as a whisper (active tints) */
  --accent:#2A78D6; --ring:rgba(42,120,214,.4);
  /* surfaces: warm paper */
  --bg:#FCFBF6; --surface:#FFFFFF; --surface-2:#F5F3EB;
  --fg:#1C1A14; --dim:#8B877A;
  /* lines are translucent ink: they take the colour of whatever they sit on */
  --line:color-mix(in oklab, var(--fg) 9%, transparent);
  --line-soft:color-mix(in oklab, var(--fg) 5.5%, transparent);
  --line-2:color-mix(in oklab, var(--fg) 16%, transparent);
  --paper:var(--surface);   /* what inputs/keys are cut from; lifted a shade in the dark */
  --code:#F4F2E9; --own:#F6F0DE; --lift:rgba(28,26,20,.05);
  --ok:#3F9E58; --bad:#D03B3B; --warn:#C77B28;
  --hl-key:#a626a4; --hl-str:#50771c; --hl-num:#b25d0e; --hl-com:#9c9b96; --hl-fn:#2a63c9;
  --scrim:rgba(20,18,10,.4);
  /* motion: one place to tune the OS's sense of life (V0.1.4: calm, orderly) */
  --dur-1:.15s; --dur-2:.22s; --dur-3:.45s;
  --ease:cubic-bezier(.2,.7,.3,1);
  --rise:rise var(--dur-2) var(--ease);
  /* shape & depth: one radius ladder; controls sit on the tighter --r-btn */
  --r-btn:var(--r-pill); --r-in:14px; --r-sm:10px; --r-md:14px; --r-lg:18px; --r-xl:24px;
  --r-2xl:28px; --r-pill:999px;
  --btn-h:34px; --btn-h-sm:28px;
  /* glass (②b): what floats is translucent, blurred, and rimmed with light */
  --glass-bg:color-mix(in oklab, var(--surface) 76%, transparent);
  --glass-blur:blur(22px) saturate(1.6);
  --glass-rim:inset 0 1px 0 rgba(255,255,255,.55), inset 0 -1px 0 rgba(0,0,0,.04),
    0 0 0 1px color-mix(in oklab, var(--fg) 7%, transparent);
  /* the dock's column (nav.js pads body by --dock-w; its 44px icons sit 10px off the
     edge, so their axis is 32px in). A 32px float at --float-end shares that axis. */
  --dock-w:64px; --float-end:16px;
  --shadow-1:inset 0 1px 0 rgba(255,255,255,.6), 0 1px 2px rgba(0,0,0,.035), 0 2px 10px rgba(0,0,0,.04);
  --shadow-pop:0 10px 36px rgba(0,0,0,.14), 0 2px 8px rgba(0,0,0,.05);
  --shadow-key:inset 0 1px 0 rgba(255,255,255,.38), inset 0 -1px 0 rgba(0,0,0,.10),
    0 1px 0 color-mix(in oklab, var(--brand-600) 45%, transparent),
    0 4px 12px -6px color-mix(in oklab, var(--brand) 55%, transparent);
  --focus:0 0 0 3px var(--ring);
  /* type & space ladders */
  /* the type ladder (V0.1.7 ② codex): every font-size in this file is a rung.
     2xs badges/fineprint · xs meta labels · sm action links · md secondary text
     · ui controls · h card headings · rd chat reading · base document body
     · lg inputs/emphasis · xl page titles · 2xl hero */
  --fs-2xs:11px; --fs-xs:12px; --fs-sm:12.5px; --fs-md:13px; --fs-ui:13.5px;
  --fs-h:14px; --fs-rd:15px; --fs-base:15px; --fs-lg:15.5px;
  --fs-xl:20px; --fs-2xl:24px;
  /* (V0.1.8: the UI rungs stepped down ½px — a sans face sits visually larger than
     the serif did at the same size; the reading rungs rd/xl/2xl, which Serif
     still owns, did not move.) */
  --sp-1:4px; --sp-2:8px; --sp-3:12px; --sp-4:16px; --sp-5:24px; --sp-6:32px;
  /* Three content voices + one sealed wordmark (codex art. 4). --font stays as an
     alias of the body voice so token-riding pieces outside this file follow. */
  --font-ui:"Inter","Source Han Sans SC","Noto Sans Arabic","Inter Fallback",system-ui,
    -apple-system,"PingFang SC","Segoe UI",sans-serif;
  --font-brand:"Source Serif 4","Source Han Serif SC",Georgia,"Songti SC","Noto Naskh Arabic",serif;
  --font-wordmark:"HoopGram Wordmark","Marcellus","Source Serif 4",Georgia,serif;
  --font:var(--font-ui);
  --mono:"Maple Mono",ui-monospace,SFMono-Regular,Menlo,monospace;
}
/* 系统黄蓝, the dark half (only when no explicit theme is forced) */
@media (prefers-color-scheme: dark){ :root:not([data-theme]){
  --brand:#F5B301; --brand-600:#FFC426; --on-brand:#221A00;
  --brand-ink:#F5B301; --brand-soft:rgba(245,179,1,.15);
  --accent:#5B9BEF; --ring:rgba(91,155,239,.45);
  --bg:#141410; --surface:#1C1B15; --surface-2:#191812;
  --fg:#E8E6DD; --dim:#8F8B7E;
  --line:color-mix(in oklab, var(--fg) 11%, transparent);
  --line-soft:color-mix(in oklab, var(--fg) 7%, transparent);
  --line-2:color-mix(in oklab, var(--fg) 20%, transparent);
  --paper:#24231C;
  --code:#1E1D16; --own:#262317; --lift:rgba(255,255,255,.05);
  --ok:#6fbf85; --bad:#e66767; --warn:#d99a55;
  --hl-key:#cf8fe8; --hl-str:#9cbf6f; --hl-num:#dba064; --hl-com:#6e6d68; --hl-fn:#7fb2f5;
  --scrim:rgba(0,0,0,.5);
  --shadow-1:inset 0 1px 0 rgba(255,255,255,.07), 0 1px 2px rgba(0,0,0,.25), 0 2px 10px rgba(0,0,0,.22);
  --shadow-pop:0 10px 36px rgba(0,0,0,.5), 0 2px 8px rgba(0,0,0,.3);
  --shadow-key:inset 0 1px 0 rgba(255,255,255,.28), inset 0 -1px 0 rgba(0,0,0,.25),
    0 4px 14px -6px color-mix(in oklab, var(--brand) 40%, transparent);
  --glass-bg:color-mix(in oklab, var(--surface) 55%, transparent);
  --glass-rim:inset 0 1px 0 rgba(255,255,255,.12), inset 0 -1px 0 rgba(0,0,0,.35),
    0 0 0 1px rgba(255,255,255,.06);
}}
/* 白色为主: forced light, whiter and cooler, amber at its quietest */
:root[data-theme="light"]{
  --brand:#F5B301; --brand-600:#E0A200; --on-brand:#221A00;
  --brand-ink:#96700A; --brand-soft:rgba(245,179,1,.11);
  --accent:#2A78D6; --ring:rgba(42,120,214,.4);
  --bg:#FDFDFC; --surface:#FFFFFF; --surface-2:#F6F6F4;
  --fg:#171614; --dim:#8A8880;
  --line:color-mix(in oklab, var(--fg) 8%, transparent);
  --line-soft:color-mix(in oklab, var(--fg) 5%, transparent);
  --line-2:color-mix(in oklab, var(--fg) 15%, transparent);
  --code:#F5F4F0; --own:#F3F1EA; --lift:rgba(23,22,20,.05);
  --ok:#3F9E58; --bad:#D03B3B; --warn:#C77B28;
  --hl-key:#a626a4; --hl-str:#50771c; --hl-num:#b25d0e; --hl-com:#9c9b96; --hl-fn:#2a63c9;
  --scrim:rgba(20,18,10,.4);
}
/* 暗色为主: forced charcoal, amber at its boldest */
:root[data-theme="dark"]{
  --brand:#F5B301; --brand-600:#FFC426; --on-brand:#221A00;
  --brand-ink:#F5B301; --brand-soft:rgba(245,179,1,.15);
  --accent:#5B9BEF; --ring:rgba(91,155,239,.45);
  --bg:#141410; --surface:#1C1B15; --surface-2:#191812;
  --fg:#E8E6DD; --dim:#8F8B7E;
  --line:color-mix(in oklab, var(--fg) 11%, transparent);
  --line-soft:color-mix(in oklab, var(--fg) 7%, transparent);
  --line-2:color-mix(in oklab, var(--fg) 20%, transparent);
  --paper:#24231C;
  --code:#1E1D16; --own:#262317; --lift:rgba(255,255,255,.05);
  --ok:#6fbf85; --bad:#e66767; --warn:#d99a55;
  --hl-key:#cf8fe8; --hl-str:#9cbf6f; --hl-num:#dba064; --hl-com:#6e6d68; --hl-fn:#7fb2f5;
  --scrim:rgba(0,0,0,.5);
  --shadow-1:inset 0 1px 0 rgba(255,255,255,.07), 0 1px 2px rgba(0,0,0,.25), 0 2px 10px rgba(0,0,0,.22);
  --shadow-pop:0 10px 36px rgba(0,0,0,.5), 0 2px 8px rgba(0,0,0,.3);
  --shadow-key:inset 0 1px 0 rgba(255,255,255,.28), inset 0 -1px 0 rgba(0,0,0,.25),
    0 4px 14px -6px color-mix(in oklab, var(--brand) 40%, transparent);
  --glass-bg:color-mix(in oklab, var(--surface) 55%, transparent);
  --glass-rim:inset 0 1px 0 rgba(255,255,255,.12), inset 0 -1px 0 rgba(0,0,0,.35),
    0 0 0 1px rgba(255,255,255,.06);
}

/* ── V0.1.7 ①: cross-document view transitions — the shell never redraws ──
   MPA page loads become one soft cross-fade; the dock (view-transition-name:
   hoop-dock, set in nav.js) is matched across documents and stays motionless. */
@view-transition{navigation:auto}
::view-transition-group(hoop-dock){animation-duration:0s}
::view-transition-old(root), ::view-transition-new(root){animation-duration:.18s}
@media (prefers-reduced-motion:reduce){
  ::view-transition-group(*), ::view-transition-old(*), ::view-transition-new(*){
    animation:none!important}
}

/* ── .glass: the floating material (②b) ─────────────────────────────────── */
.glass{background:var(--glass-bg); -webkit-backdrop-filter:var(--glass-blur);
  backdrop-filter:var(--glass-blur); box-shadow:var(--glass-rim), var(--shadow-pop); border:0}
.bar-glass{background:var(--glass-bg); -webkit-backdrop-filter:var(--glass-blur);
  backdrop-filter:var(--glass-blur); border-bottom:1px solid var(--line-soft)}
@media (prefers-reduced-transparency:reduce){
  .glass,.bar-glass{background:var(--surface); -webkit-backdrop-filter:none; backdrop-filter:none}
}

/* ── base ───────────────────────────────────────────────────────────────── */
*{box-sizing:border-box; -webkit-tap-highlight-color:transparent}
html.hoop-lock, html.hoop-lock body{overflow:hidden; overscroll-behavior:none}
[hidden]{display:none!important}
.foot{margin-top:3rem}
.dim{color:var(--dim)}
body{margin:0; background:var(--bg); color:var(--fg); min-height:100dvh;
  font:var(--fs-base)/1.7 var(--font)}
::selection{background:rgba(245,179,1,.28)}
button{font:inherit; color:inherit}
a{color:var(--accent)}
@keyframes rise{from{opacity:0; transform:translateY(4px)}}
@keyframes fade{from{opacity:0}}
@keyframes breathe{50%{opacity:.25}}
@keyframes shimmer{to{background-position-x:-200%}}
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms!important; transition-duration:.01ms!important}
}

/* ── the standard app page frame ────────────────────────────────────────── */
.page{padding:26px 18px 60px; padding-top:calc(26px + env(safe-area-inset-top))}
.page main{max-width:42rem; margin:0 auto}
h1.app{font-size:var(--fs-xl); font-weight:400; font-family:var(--font-brand); letter-spacing:-.01em; margin:0;
  display:flex; align-items:baseline; gap:10px; flex-wrap:wrap}
h1.app .sub{color:var(--dim); font-size:.82rem; font-weight:400}
.lede{color:var(--dim); font-size:var(--fs-md); margin:8px 0 0}
.sect{margin:28px 0 10px; color:var(--dim); font-size:var(--fs-sm); letter-spacing:.1em;
  font-weight:500; display:flex; align-items:center; gap:10px}
.sect .n{background:var(--code); border-radius:var(--r-pill); padding:1px 8px;
  font-size:var(--fs-2xs); letter-spacing:0}

/* ── cards: quiet surfaces, one rhythm everywhere ───────────────────────── */
.card{background:var(--surface); border:1px solid var(--line);
  border-radius:var(--r-lg); padding:14px 16px; margin-bottom:10px;
  animation:var(--rise)}
.card.off{opacity:.55}
.card h3{margin:0 0 10px; font-size:var(--fs-h); font-weight:500}
.card h4{margin:0 0 3px; font-size:var(--fs-h); font-weight:500; display:flex;
  align-items:center; gap:9px; flex-wrap:wrap}
.card .meta{color:var(--dim); font-size:var(--fs-sm); word-break:break-all}
.card pre{white-space:pre-wrap; word-break:break-word; margin:10px 0 0;
  font:var(--fs-md)/1.65 var(--mono); color:var(--fg)}

/* ── rows of quiet link-actions under a card ────────────────────────────── */
.row{display:flex; gap:16px; margin-top:10px; align-items:center; flex-wrap:wrap}
.row a{color:var(--dim); font-size:var(--fs-sm); text-decoration:none; cursor:pointer;
  padding:4px 0; transition:color var(--dur-1)}
.row a:hover{color:var(--fg)}
.row a.primary{color:var(--accent)}
.row a.danger:hover{color:var(--bad)}
.row .fine{color:var(--dim); font-size:var(--fs-sm)}

/* ── .btn: THE button. Variants only, no ad-hoc buttons anywhere ────────── */
.btn{display:inline-flex; align-items:center; justify-content:center; gap:7px;
  border:1px solid transparent; border-radius:var(--r-btn); cursor:pointer;
  padding:0 14px; min-height:var(--btn-h); font:inherit; font-size:var(--fs-ui);
  font-weight:500; text-decoration:none; color:var(--fg); background:none;
  user-select:none; white-space:nowrap; line-height:1.2;
  transition:background var(--dur-1), border-color var(--dur-1), filter var(--dur-1),
    color var(--dur-1), transform var(--dur-1), box-shadow var(--dur-1), opacity var(--dur-1)}
.btn:hover:not(:disabled){filter:brightness(1.03)}
.btn:active:not(:disabled){transform:translateY(1px); box-shadow:none}
.btn:disabled{opacity:.5; cursor:default; transform:none}
.btn:focus-visible{outline:none; box-shadow:var(--focus)}
/* KEY: the brand fill with the one inner highlight/shade pair */
.btn-primary{color:var(--on-brand); border-color:transparent; box-shadow:var(--shadow-key);
  background:linear-gradient(180deg, color-mix(in oklab, var(--brand) 86%, white) 0%, var(--brand) 45%, var(--brand-600) 100%)}
/* PAPER: a key cut from the same sheet as the inputs */
.btn-secondary{background:var(--paper); border-color:var(--line-soft); box-shadow:var(--shadow-1)}
.btn-secondary:hover:not(:disabled){border-color:var(--line-2)}
.btn-tonal{background:var(--surface-2)}
.btn-ghost{color:var(--dim)}
.btn-ghost:hover:not(:disabled){color:var(--fg); background:var(--lift); filter:none}
.btn-danger{color:var(--bad)}
.btn-danger:hover:not(:disabled){background:color-mix(in oklab, var(--bad) 9%, transparent); filter:none}
.btn-sm{padding:0 10px; min-height:var(--btn-h-sm); font-size:var(--fs-sm)}
.btn.big{margin:16px 0 20px}
.btns{display:flex; gap:10px; flex-wrap:wrap}
.saved{color:var(--ok); font-size:var(--fs-sm)}
.sent-ok{color:var(--ok); font-size:var(--fs-sm)}

/* ── inputs: styled globally, identical on every page ───────────────────── */
input, select, textarea{
  border:1px solid var(--line-soft); border-radius:var(--r-in); background:var(--paper);
  color:var(--fg); padding:7px 13px; min-height:var(--btn-h); outline:none; font:inherit;
  font-size:var(--fs-ui); box-shadow:var(--shadow-1);
  transition:border-color var(--dur-1), box-shadow var(--dur-1)}
input:focus, select:focus, textarea:focus{border-color:var(--line-soft);
  box-shadow:var(--focus), var(--shadow-1)}
input::placeholder, textarea::placeholder{color:var(--dim); opacity:.8}
input:disabled, select:disabled, textarea:disabled{opacity:.6}
input[type="checkbox"], input[type="radio"], input[type="file"]{border:0; box-shadow:none;
  background:none; padding:0}
select{appearance:none; -webkit-appearance:none; padding-inline-end:30px;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23888478' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat; background-position:right 10px center}
textarea{min-height:0}
[dir="rtl"] select{background-position:left 10px center}
textarea{resize:vertical}

/* ── legacy form scaffolding (.f inline form, .compose) on the new base ─── */
.f{display:none}
.f.on{display:block}
.f .line{display:flex; gap:8px; margin-top:8px; flex-wrap:wrap; align-items:center}
.f .line input[type="time"]{width:8.5rem}
.f .line input[type="date"]{width:11rem}
.f .line input[type="number"]{width:6.5rem}
.f .line select{min-width:8rem}
.f input.wide{width:100%; margin-top:8px}
.f textarea{width:100%; min-height:7rem; margin-top:8px; font-size:var(--fs-md)}
.f .lbl{color:var(--dim); font-size:var(--fs-sm)}
.f .line .grow{flex:1; min-width:9rem}
.f textarea.short{min-height:4rem}
.compose{display:none; margin-top:14px}
.compose.on{display:block; animation:var(--rise)}
.compose input, .compose textarea{width:100%; margin-bottom:8px}
.compose textarea{min-height:9rem}
.compose .duo{display:flex; gap:8px}
.compose .duo input{flex:1; min-width:0}
.note{color:var(--dim); font-size:var(--fs-sm); margin-top:8px}
.note code, .hint code{background:var(--code); border-radius:5px; padding:.1em .4em;
  font:12px var(--mono); user-select:all}
.hint{color:var(--dim); font-size:var(--fs-sm); margin-top:14px}

/* ── password confirm bar (the owner's pen) ─────────────────────────────── */
.applybar{display:none; margin-top:12px; gap:8px; flex-wrap:wrap; align-items:center}
.applybar.on{display:flex; animation:var(--rise)}
.applybar input{width:12rem}

/* ── tabs ───────────────────────────────────────────────────────────────── */
.tabs{display:flex; gap:6px; margin-top:16px; border-bottom:1px solid var(--line);
  overflow-x:auto; overflow-y:hidden; scrollbar-width:none}
.tabs button{border:0; background:none; color:var(--dim); cursor:pointer; font:inherit;
  font-size:var(--fs-ui); padding:10px 14px; border-bottom:2px solid transparent;
  margin-bottom:-1px; white-space:nowrap; min-height:44px; border-radius:0;
  transition:color var(--dur-1), border-color var(--dur-1)}
.tabs button.on{color:var(--fg); font-weight:500; border-bottom-color:var(--brand)}

/* ── empty states: quiet, alive, honest ─────────────────────────────────── */
.empty{color:var(--dim); text-align:center; padding:2.2rem 1rem; font-size:var(--fs-md);
  line-height:2; border:1px dashed var(--line); border-radius:var(--r-lg);
  margin-top:12px; animation:fade var(--dur-3) var(--ease)}
.empty .glyph{display:block; line-height:1.6; opacity:.8}
.empty .glyph svg{width:26px; height:26px}

/* ── icons (icons.js): one hand, one size discipline ────────────────────── */
[data-icon]{display:inline-flex; align-items:center; vertical-align:-.18em}
[data-icon] svg{width:1.15em; height:1.15em}
.btn [data-icon] svg{width:1.05em; height:1.05em}
.ent .ic svg{width:18px; height:18px; color:var(--dim)}
.steps .st .g{align-self:center; display:inline-flex}
.steps .st .g svg{width:13px; height:13px}

/* ── toast ──────────────────────────────────────────────────────────────── */
.toast{position:fixed; inset-inline-start:50%; transform:translateX(-50%); bottom:92px;
  background:color-mix(in oklab, var(--fg) 88%, transparent); color:var(--bg);
  -webkit-backdrop-filter:var(--glass-blur); backdrop-filter:var(--glass-blur);
  border-radius:var(--r-pill); padding:9px 18px; box-shadow:var(--shadow-pop);
  font-size:var(--fs-md); z-index:99; animation:var(--rise); max-width:88vw}
[dir="rtl"] .toast{transform:translateX(50%)}

/* ── modal: the ONE confirm/prompt dialog (HoopUI.confirm / HoopUI.prompt) ─ */
.modal-scrim{position:fixed; inset:0; background:var(--scrim); z-index:9998;
  display:flex; align-items:center; justify-content:center; padding:20px;
  -webkit-backdrop-filter:blur(10px); backdrop-filter:blur(10px);
  animation:fade var(--dur-1) ease-out}
.modal{position:relative; background:var(--glass-bg); border:0; border-radius:var(--r-2xl);
  -webkit-backdrop-filter:var(--glass-blur); backdrop-filter:var(--glass-blur);
  box-shadow:var(--glass-rim), var(--shadow-pop); width:100%; max-width:24rem; padding:22px 22px 18px;
  animation:var(--rise)}
.modal:focus{outline:none}
@media (prefers-reduced-transparency:reduce){
  .modal, .menu, .cmenu, .pal-box, .cap-box, .player, .mw-compose, .toast, .float.fbtn{
    background:var(--surface); -webkit-backdrop-filter:none; backdrop-filter:none}
  .modal-scrim, .palette, .capture{-webkit-backdrop-filter:none; backdrop-filter:none}
}
.modal h3{margin:0 0 6px; font-size:var(--fs-lg); font-weight:500}
.modal > h3{padding-inline-end:36px}
.ui-close:focus-visible{outline:none; box-shadow:var(--focus)}
.window-close,.modal-x{position:absolute; top:14px; inset-inline-end:14px; z-index:3}
.modal .m-body{color:var(--dim); font-size:var(--fs-ui); line-height:1.65;
  word-break:break-word}
.modal .m-body b{color:var(--fg)}
.modal input{width:100%; margin-top:12px}
.modal .m-acts .btn{min-width:5.5rem}
.modal .m-acts{display:flex; gap:10px; justify-content:flex-end; margin-top:18px}

/* ── skeleton loading ───────────────────────────────────────────────────── */
.skel{border-radius:var(--r-sm); min-height:1em; color:transparent!important;
  background:linear-gradient(90deg,var(--code) 8%,var(--lift) 18%,var(--code) 33%);
  background-size:200% 100%; animation:shimmer 1.4s linear infinite}

/* ── on/off switch ──────────────────────────────────────────────────────── */
.onoff{width:34px; height:20px; border-radius:var(--r-pill); background:var(--line-2);
  position:relative; cursor:pointer; flex:none; transition:background var(--dur-2)}
.onoff::after{content:""; position:absolute; top:2px; inset-inline-start:2px; width:16px;
  height:16px; border-radius:50%; background:var(--surface);
  transition:inset-inline-start var(--dur-2) var(--ease); box-shadow:var(--shadow-1)}
.onoff.on{background:var(--brand)}
.onoff.on::after{inset-inline-start:16px}

/* ── permission chip ────────────────────────────────────────────────────── */
.perm{display:inline-flex; align-items:center; gap:6px; margin-top:14px;
  border:1px solid var(--line-soft); border-radius:var(--r-btn); padding:5px 11px;
  font-size:var(--fs-sm); color:var(--dim); background:var(--surface)}
.perm b{color:var(--fg); font-weight:500}
.perm a{color:var(--accent); text-decoration:none}

/* ── tooltip: the floating name beside an icon (mac Dock style) ─────────── */
.tip{position:absolute; inset-inline-start:calc(100% + 12px); top:50%;
  transform:translateY(-50%) scale(.94); transform-origin:0 50%;
  background:var(--fg); color:var(--bg); font-size:var(--fs-xs); line-height:1;
  padding:6px 11px; border-radius:8px; white-space:nowrap; pointer-events:none;
  opacity:0; transition:opacity var(--dur-1) ease-out, transform var(--dur-1) ease-out;
  z-index:2}
[dir="rtl"] .tip{transform-origin:100% 50%}
@media (hover:hover){
  :hover > .tip, :focus-visible > .tip{opacity:1; transform:translateY(-50%) scale(1);
    transition-delay:.1s}
}
@media (hover:none){ .tip{display:none} }

/* ── floating context menu ──────────────────────────────────────────────── */
.menu{position:fixed; z-index:9999; background:var(--glass-bg); border:0;
  -webkit-backdrop-filter:var(--glass-blur); backdrop-filter:var(--glass-blur);
  border-radius:var(--r-lg); box-shadow:var(--glass-rim), var(--shadow-pop); min-width:11rem; overflow:hidden;
  animation:var(--rise)}
.menu a{display:flex; align-items:center; gap:10px; padding:9px 14px; font-size:var(--fs-md);
  cursor:pointer; color:var(--fg); text-decoration:none; border-radius:var(--r-md)}
.menu a:hover{background:var(--lift)}
.menu a [data-icon]{color:var(--dim)}
.menu a.on{color:var(--brand-ink)}
.menu a.on [data-icon]{color:var(--brand-ink)}
.menu a .fine{margin-inline-start:auto; padding-inline-start:14px; color:var(--dim);
  font-size:var(--fs-2xs); font-variant-numeric:tabular-nums}
.menu{padding:6px}
.menu hr{border:0; border-top:1px solid var(--line); margin:4px 0}
.menu .mh{padding:8px 14px 4px; font-size:var(--fs-2xs); color:var(--dim); letter-spacing:.06em;
  user-select:none}
.menu .mh.who{font:var(--fs-xs) var(--mono); letter-spacing:0; padding:10px 14px 8px; border-bottom:1px solid var(--line);
  margin-bottom:4px; color:var(--dim)}
.menu a.danger{color:var(--bad)}

/* ── .pick: the selector row (codex art. 6) — one row, tap, choose ──────── */
.picks{display:flex; flex-direction:column; margin:0 -4px}
.picks + .note{margin-top:10px}
.pick{display:flex; align-items:center; gap:12px; width:100%; min-height:46px; padding:8px 10px;
  border:0; background:none; border-radius:var(--r-md); cursor:pointer; text-align:start;
  font:inherit; color:var(--fg); transition:background var(--dur-1)}
.pick + .pick{border-top:1px solid var(--line)}
.pick:hover{background:var(--lift)}
.pick.on{background:var(--brand-soft)}
.pick:disabled{cursor:default; opacity:.6}
.pk-l{flex:1; min-width:0; display:flex; flex-direction:column; gap:1px}
.pk-t{font-size:var(--fs-ui); display:flex; align-items:center; gap:8px; flex-wrap:wrap}
.pk-n{font-size:var(--fs-xs); color:var(--dim); line-height:1.4}
.pk-badge{font-size:var(--fs-2xs); color:var(--dim); border:1px solid var(--line-2); border-radius:var(--r-pill);
  padding:0 8px; line-height:1.6}
.pk-badge.hard{color:var(--ok); border-color:var(--ok)}
.pk-v{flex:none; max-width:50%; color:var(--dim); font-size:var(--fs-md); white-space:nowrap; overflow:hidden;
  text-overflow:ellipsis; font-variant-numeric:tabular-nums}
.pk-v.staged{color:var(--brand-ink); font-weight:500}
.pk-c{flex:none; color:var(--dim); display:inline-flex}
.pk-c svg{width:14px; height:14px}
/* the search box of a long pick (timezones) */
.menu .mo-q{width:100%; min-height:34px; margin:4px 0 6px; font-size:var(--fs-md)}
.menu .mo-list{max-height:min(52vh, 420px); overflow-y:auto; overscroll-behavior:contain}
.menu.sheet .mo-list{max-height:52vh}
/* option rows inside a menu/sheet */
.menu .mo{display:flex; align-items:center; gap:10px; padding:9px 12px; border-radius:var(--r-md); cursor:pointer;
  color:var(--fg); font-size:var(--fs-md)}
.menu .mo:hover{background:var(--lift)}
.menu .mo-ck{width:16px; flex:none; color:var(--brand-ink); opacity:0}
.menu .mo.on .mo-ck{opacity:1}
.menu .mo-b{display:flex; flex-direction:column; min-width:0}
.menu .mo-h{font-size:var(--fs-xs); color:var(--dim)}
.menu .mo.on .mo-l{color:var(--brand-ink); font-weight:500}
/* .sheet: the menu's phone posture */
.sheet-scrim{position:fixed; inset:0; z-index:9998; background:var(--scrim);
  -webkit-backdrop-filter:blur(8px); backdrop-filter:blur(8px); animation:fade var(--dur-1) var(--ease)}
.menu.sheet{position:fixed; inset-inline:0; bottom:0; top:auto; left:0; right:0; z-index:9999; min-width:0;
  background:color-mix(in oklab, var(--surface) 92%, transparent);   /* dense text: nearly solid */
  border-radius:var(--r-2xl) var(--r-2xl) 0 0; padding:6px 12px calc(14px + env(safe-area-inset-bottom));
  max-height:72vh; overflow-y:auto; animation:sheetup var(--dur-2) var(--ease)}
.menu.sheet .grab{width:38px; height:5px; border-radius:var(--r-pill); background:var(--line-2); margin:4px auto 8px;
  cursor:pointer; padding:0; box-sizing:content-box; border-block:8px solid transparent; background-clip:padding-box}
.menu.sheet .sheet-x{position:absolute; top:10px; inset-inline-end:10px; width:32px; height:32px}
.menu.sheet .mh.big{padding-inline-end:48px}
.menu.sheet .mh.big{font-size:var(--fs-h); color:var(--fg); letter-spacing:0; padding:4px 12px 8px}
.menu.sheet a, .menu.sheet .mo{min-height:48px; font-size:var(--fs-ui)}
.menu.sheet .mrow .opt{min-height:34px; font-size:var(--fs-sm)}
@keyframes sheetup{from{transform:translateY(24px); opacity:0}}

/* ═══ home (p-home) ═════════════════════════════════════════════════════ */
.p-home{min-height:100dvh; overflow-x:hidden}
.p-home.home-pending{visibility:hidden}
.p-home .public-card{min-height:100dvh; display:flex; flex-direction:column; align-items:center;
  justify-content:center; text-align:center; padding:40px 24px; animation:rise var(--dur-3) var(--ease)}
.p-home .name{font-size:clamp(2.6rem,9vw,5rem); font-weight:400; font-family:var(--font-brand);
  letter-spacing:-.02em;
  display:flex; align-items:baseline; justify-content:center; gap:.18em}
.p-home .name .dot{width:.5em; height:.5em; align-self:center; display:block;
  animation:breathe 2.6s ease-in-out infinite}   /* the golden hoop mark, breathing */
.p-home .tag{color:var(--dim); margin-top:14px; font-size:clamp(.95rem,2.6vw,1.1rem);
  font-family:var(--font-brand)}
.p-home .go{display:inline-block; margin-top:38px; text-decoration:none;
  color:var(--on-brand); background:var(--brand); border:1px solid var(--brand);
  border-radius:var(--r-btn); padding:12px 30px; font-size:var(--fs-base); font-weight:500;
  box-shadow:var(--shadow-key); transition:filter var(--dur-2), transform var(--dur-1)}
.p-home .go:hover{filter:brightness(1.03)}
.p-home .go:active{transform:translateY(1px); box-shadow:none}
.p-home .hint{color:var(--dim); font-size:var(--fs-sm); margin-top:20px; opacity:0;
  transition:opacity .6s}
.p-home .hint.on{opacity:.8}
/* the public card (⑥): the logged-out face — quiet, serif, one column */
.p-home .bio{max-width:32rem; margin:22px auto 0; text-align:start;
  font-size:var(--fs-rd); line-height:1.85; font-family:var(--font-brand)}
.p-home .bio p{margin-top:10px}
.p-home .go.quiet{background:var(--paper); border:1px solid var(--line-soft); color:var(--dim);
  font-size:var(--fs-sm); padding:8px 22px; box-shadow:var(--shadow-1)}
.p-home .go.quiet:hover{color:var(--fg); border-color:var(--line-2)}
.p-home .hoopnote{color:var(--dim); font-size:var(--fs-xs); margin-top:26px;
  letter-spacing:.06em}
#pub-fields input,#pub-fields textarea{width:100%; margin-top:8px}
#pub-fields textarea{min-height:7rem}
/* V0.2.4 F4: Home is the owner's desktop/new-tab surface. Desktop and phone share
   one DOM; breakpoints only change grid columns and spacing. */
.sr-only{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}
.p-home:not(.home-pending){background:radial-gradient(100% 80% at 20% 0%,color-mix(in oklab,var(--brand) 16%,transparent),transparent 62%),var(--bg);background-attachment:fixed}
html[data-wall="plain"] .p-home:not(.home-pending){background:var(--bg)}
html[data-wall="ink"] .p-home:not(.home-pending){background:radial-gradient(100% 80% at 20% 0%,color-mix(in oklab,var(--fg) 13%,transparent),transparent 62%),var(--bg)}
html[data-wall="custom"] .p-home:not(.home-pending){background-image:linear-gradient(color-mix(in oklab,var(--bg) 18%,transparent),color-mix(in oklab,var(--bg) 18%,transparent)),var(--home-wallpaper);background-size:cover;background-position:center;background-attachment:fixed}
.p-home .pa-home{width:min(82rem,calc(100% - 64px));min-height:100dvh;margin:0 auto;padding:clamp(48px,7vw,88px) 0 72px;animation:rise var(--dur-3) var(--ease)}
.p-home .home-shortcuts{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:var(--sp-2)}
.p-home .home-shortcut{position:relative;min-width:0;border:0;background:none;color:var(--fg);font:inherit;text-align:center;border-radius:var(--r-lg)}
.p-home .home-shortcut-open,.p-home button.home-shortcut-add{width:100%;min-width:0;display:flex;flex-direction:column;align-items:center;gap:7px;border:0;background:none;color:var(--fg);font:inherit;font-size:var(--fs-xs);cursor:pointer;padding:8px 2px;border-radius:var(--r-lg)}
.p-home .home-shortcut-open>[data-icon],.p-home button.home-shortcut-add>[data-icon]{width:48px;height:48px;padding:12px;border-radius:var(--r-lg);color:var(--brand-ink);background:var(--glass-bg);box-shadow:var(--glass-rim);-webkit-backdrop-filter:blur(var(--glass-blur)) saturate(1.2);backdrop-filter:blur(var(--glass-blur)) saturate(1.2)}
.p-home .home-shortcut-open:hover,.p-home button.home-shortcut-add:hover{background:var(--lift)}
.p-home .home-shortcut-label,.p-home button.home-shortcut-add>span:last-child{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.p-home .home-shortcut-remove{position:absolute;inset-block-start:2px;inset-inline-end:2px;width:22px;height:22px;display:grid;place-items:center;border:0;border-radius:50%;background:var(--surface);color:var(--dim);box-shadow:var(--shadow-1);opacity:0;cursor:pointer}
.p-home .home-shortcut:hover .home-shortcut-remove,.p-home .home-shortcut:focus-within .home-shortcut-remove{opacity:1}
.p-home .home-shortcut-remove [data-icon]{width:12px;height:12px}.p-home .home-shortcut.dragging{opacity:.45}
.p-home .home-command{position:relative;width:min(46rem,100%);margin:clamp(60px,9vw,120px) auto clamp(52px,7vw,92px)}
.p-home .home-owner{display:flex;justify-content:center;align-items:center;gap:10px;margin-bottom:14px}
.p-home .pa-owner-avatar{width:64px; height:64px; display:grid; place-items:center; overflow:hidden;
  border-radius:50%; background:var(--brand-soft); color:var(--brand-ink); font:400 1.6rem var(--font-brand)}
.p-home .pa-owner-avatar img{width:100%; height:100%; object-fit:cover}
.p-home .home-owner .pa-owner-avatar{width:36px;height:36px;font-size:var(--fs-md)}
.p-home .pa-eyebrow{margin:0;color:var(--brand-ink);font-size:var(--fs-xs);letter-spacing:.08em;text-transform:uppercase}
.p-home .home-owner h2{margin:1px 0 0;font:400 var(--fs-md)/1.2 var(--font-brand)}
.p-home .home-ask{height:62px;display:grid;grid-template-columns:24px minmax(0,1fr) 38px;align-items:center;gap:12px;padding:0 12px 0 20px;border-radius:var(--r-2xl);box-shadow:var(--glass-rim),var(--shadow-pop)}
.p-home .home-ask>[data-icon]{width:21px;height:21px;color:var(--dim)}
.p-home .home-ask input{width:100%;height:100%;border:0;background:none;box-shadow:none;padding:0;font-size:var(--fs-lg);color:var(--fg)}
.p-home .home-ask input:focus{box-shadow:none;outline:0}
.p-home .home-ask button{width:38px;height:38px;display:grid;place-items:center;border:0;border-radius:50%;background:var(--brand);color:var(--on-brand);box-shadow:var(--shadow-key);cursor:pointer}
.p-home .home-ask button [data-icon]{width:18px;height:18px}.p-home .home-ask button:disabled{opacity:.5}
.p-home .home-ask-results{position:absolute;inset-inline:0;top:calc(100% + 8px);z-index:20;padding:6px;border-radius:var(--r-xl);box-shadow:var(--glass-rim),var(--shadow-pop);max-height:21rem;overflow:auto}
.p-home .home-result{width:100%;display:grid;grid-template-columns:22px minmax(0,1fr) minmax(0,1fr);align-items:center;gap:10px;border:0;background:none;color:var(--fg);font:inherit;text-align:start;padding:10px 12px;border-radius:var(--r-md);cursor:pointer}
.p-home .home-result:hover{background:var(--lift)}.p-home .home-result>[data-icon]{width:18px;height:18px;color:var(--brand-ink)}
.p-home .home-result .lb,.p-home .home-result .sub{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.p-home .home-result .sub{color:var(--dim);font-size:var(--fs-xs);text-align:end}
.p-home .home-cards{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-4);align-items:start}
.p-home .home-section{min-width:0;padding:var(--sp-5);border-radius:var(--r-xl);box-shadow:var(--glass-rim)}
.p-home .home-section h2{font:500 var(--fs-h)/1.3 var(--font); margin:0 0 var(--sp-4)}
.p-home .home-status{display:grid;grid-template-columns:1fr;gap:var(--sp-2)}
.p-home .home-status-item{display:flex; align-items:center; gap:10px; min-height:54px; padding:12px 14px;
  border:1px solid var(--line-soft); border-radius:var(--r-lg); color:var(--dim); background:color-mix(in oklab,var(--surface) 62%,transparent);
  font:inherit; font-size:var(--fs-sm); text-align:start}
.p-home button.home-status-item{cursor:pointer}
.p-home button.home-status-item:hover{border-color:var(--line-2); color:var(--fg)}
.p-home .home-status-item > [data-icon]{width:18px; height:18px; flex:none}
.p-home .home-status-item.ok > [data-icon]{color:var(--ok)}
.p-home .home-status-item.live > [data-icon]{color:var(--accent)}
.p-home .home-status-item.warn > [data-icon]{color:var(--brand-ink)}
.p-home .home-actions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-2)}
.p-home .home-action{display:grid; grid-template-columns:28px minmax(0,1fr); grid-template-rows:auto auto;
  column-gap:var(--sp-2); row-gap:4px; min-height:82px; padding:var(--sp-3); text-align:start;
  color:var(--fg); background:color-mix(in oklab,var(--surface) 62%,transparent); border:1px solid var(--line-soft); border-radius:var(--r-lg);
  text-decoration:none; font:inherit; cursor:pointer}
.p-home .home-action:hover{border-color:var(--line-2); background:var(--lift)}
.p-home .home-action > [data-icon]{grid-row:1/3; width:24px; height:24px; color:var(--brand-ink)}
.p-home .home-action b{font-size:var(--fs-base); font-weight:500}
.p-home .home-action small{font-size:var(--fs-sm); color:var(--dim); line-height:1.45}
.p-home .home-section-head{display:flex; align-items:center; justify-content:space-between; gap:var(--sp-4)}
.p-home .home-guide-link{min-height:32px;padding-inline:8px;border:0;background:none;color:var(--dim);font:inherit;font-size:var(--fs-sm);cursor:pointer}
.p-home .home-guide-link:hover{color:var(--fg)}
.p-home .home-recents{display:grid; gap:8px}
.p-home .home-recent{display:flex; align-items:center; justify-content:space-between; gap:var(--sp-4);
  width:100%; padding:13px 0; border:0; border-bottom:1px solid var(--line-soft); background:none;
  color:var(--fg); font:inherit; text-align:start; cursor:pointer}
.p-home .home-recent b{font-weight:450; overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
.p-home .home-recent span{color:var(--dim); font-size:var(--fs-xs); white-space:nowrap}
.p-home .home-recent.empty{color:var(--dim); justify-content:flex-start}
@media (max-width:800px){
  .p-home .pa-home{width:calc(100% - 32px);padding:28px 0 92px}
  .p-home .home-shortcuts{grid-template-columns:repeat(6,minmax(0,1fr))}
  .p-home .home-cards{grid-template-columns:1fr}
}
@media (max-width:430px){
  .p-home .home-shortcuts{grid-template-columns:repeat(4,minmax(0,1fr))}
  .p-home .home-command{margin:48px auto 44px}.p-home .home-ask{height:56px}.p-home .home-ask input{font-size:16px}
  .p-home .home-actions{grid-template-columns:1fr}.p-home .home-action{min-height:76px}
  .p-home .home-recent{align-items:flex-start; flex-direction:column; gap:4px}
}

/* V0.2.1 onboarding uses the same surface and one short Hoop-light motion language. */
.p-home .onb{width:min(58rem, 100% - 48px); margin:0 auto; text-align:center;
  animation:rise var(--dur-3) var(--ease)}
.p-home.onb-on .wrap{display:none}
.p-home .onb-hi{font-family:var(--font-brand); font-weight:400; font-size:clamp(1.4rem,4vw,2rem);
  line-height:1.4; margin:0 0 var(--sp-6); letter-spacing:-.01em}
.p-home .onb-cards{display:grid; grid-template-columns:repeat(auto-fit, minmax(14rem, 1fr)); gap:var(--sp-4)}
.p-home .onb-card{position:relative; display:flex; flex-direction:column; align-items:flex-start; gap:var(--sp-2);
  padding:var(--sp-5); text-align:start; background:var(--surface); border:1px solid var(--line);
  border-radius:var(--r-xl); color:var(--fg); font:inherit; cursor:pointer; min-height:11rem;
  transition:border-color var(--dur-2), transform var(--dur-1)}
.p-home .onb-card:hover{border-color:var(--line-2)}
.p-home .onb-card:active{transform:translateY(1px)}
.p-home .onb-card > span[data-icon]{color:var(--brand-ink); width:24px; height:24px}
.p-home .onb-card b{font-weight:500; font-size:var(--fs-h)}
.p-home .onb-card small{color:var(--dim); font-size:var(--fs-sm); line-height:1.5}
.p-home .onb-card .onb-ck{position:absolute; inset-inline-end:var(--sp-4); inset-block-start:var(--sp-4);
  width:18px; height:18px; color:var(--line-2)}
.p-home .onb-card.done{border-color:var(--brand)}
.p-home .onb-card.done .onb-ck{color:var(--brand-ink)}
.p-home .onb-card.busy{opacity:.7; cursor:progress}
.p-home .onb-skip{margin-top:var(--sp-6); color:var(--dim)}
@media (max-width:600px){ .p-home .onb{width:calc(100% - 32px)} .p-home .onb-card{min-height:0} }
@media (prefers-reduced-motion:reduce){.p-home .pa-home,.p-home .public-card{animation:none}.p-home .pa-mark,.p-home .name .dot{animation:none}}

/* AppWindow: one shared route shell on top of HoopUI.window. */
.modal-appwindow{width:min(70rem,calc(100vw - 72px)); height:min(48rem,calc(100dvh - 72px));
  max-width:none; padding:0; overflow:hidden; display:flex; flex-direction:column}
.appwindow-frame{width:100%; min-height:0; flex:1; border:0; background:var(--bg)}
html.hoop-embedded{background:var(--bg)}
@media (max-width:800px){.modal-appwindow{width:100vw;height:100dvh;border-radius:0}}

.guide-card{display:flex; align-items:center; justify-content:space-between; gap:var(--sp-5)}
.guide-card h3{margin:0 0 5px}
.guide-card .btn{flex:none}
.modal-onboarding{width:min(42rem,calc(100vw - 40px)); max-width:none; max-height:min(48rem,calc(100dvh - 40px));
  overflow:auto; padding:0}
.onb-window-head{position:sticky; top:0; z-index:1; display:grid; grid-template-columns:34px minmax(0,1fr) auto;
  align-items:center; gap:12px; padding:16px 52px 14px 20px; border-bottom:1px solid var(--line-soft);
  background:var(--surface)}
.onb-window-head h1{margin:0; font-size:var(--fs-base); font-weight:550}
.onb-light{width:30px; height:30px; animation:onb-light 1.8s ease-in-out infinite}
.onb-progress{display:flex; gap:5px}
.onb-progress i{display:block; width:7px; height:7px; border-radius:50%; background:var(--line-2)}
.onb-progress i.done{background:var(--ok)}
.onb-progress i.skipped{background:var(--dim)}
.onb-progress i.current{outline:2px solid var(--brand); outline-offset:2px}
.onb-body{padding:clamp(22px,5vw,40px)}
.onb-step-kicker{margin:0 0 8px; color:var(--brand-ink); font-size:var(--fs-xs); letter-spacing:.08em}
.onb-body h2{margin:0; font:400 clamp(1.5rem,4vw,2.2rem)/1.2 var(--font-brand)}
.onb-step-note{color:var(--dim); line-height:1.65; margin:10px 0 var(--sp-5)}
.onb-field{display:grid; gap:6px; margin-top:12px; color:var(--dim); font-size:var(--fs-sm)}
.onb-field input,.onb-field textarea{width:100%; color:var(--fg)}
.onb-real-state,.onb-contact{padding:14px; margin:12px 0; border-radius:var(--r-lg); background:var(--surface-2);
  color:var(--dim); line-height:1.5}
.onb-page-link{display:inline-block; margin:4px 0 10px; font-size:var(--fs-sm)}
.onb-actions{display:flex; justify-content:flex-end; gap:8px; margin-top:var(--sp-6); flex-wrap:wrap}
.onb-actions .btn:first-child{margin-inline-end:auto}
.onb-message{min-height:1.5em; margin-top:12px; color:var(--dim); font-size:var(--fs-sm)}
.onb-message.bad{color:var(--bad)}
.onb-task-choices{display:grid; gap:10px}.onb-task-choices .btn{text-align:start; justify-content:flex-start}
@keyframes onb-light{0%,100%{opacity:.68;transform:scale(.96)}50%{opacity:1;transform:scale(1.05)}}
@media (max-width:600px){.guide-card{align-items:flex-start;flex-direction:column}.modal-onboarding{width:100vw;height:100dvh;max-height:none;border-radius:0}.onb-window-head{padding-top:calc(16px + env(safe-area-inset-top))}.onb-body{padding-bottom:calc(30px + env(safe-area-inset-bottom))}}
@media (prefers-reduced-motion:reduce){.onb-light{animation:none}.modal-onboarding{scroll-behavior:auto}}

/* ═══ chat (p-chat) ═════════════════════════════════════════════════════ */
.p-chat{font-size:var(--fs-rd); line-height:1.75; display:flex; height:var(--vvh, 100dvh); overflow:hidden}
/* the shell: the sidebar is the same sheet of paper as the page — one faint line */
.p-chat #side{width:264px; flex:none; display:flex; flex-direction:column;
  background:var(--bg); border-inline-end:1px solid var(--line);
  transition:margin-inline-start var(--dur-2) var(--ease)}
/* collapsed = a 64px rail: the open-sidebar glyph, new, temporary and search as
   icons, the owner's letter at the foot; the list is gone */
@media (min-width:901px){
  body.noside #side{width:64px}
  body.noside #side-head{padding:14px 10px 6px; padding-top:calc(14px + env(safe-area-inset-top))}
  body.noside .brand{justify-content:center; padding:2px 0 14px}
  body.noside .brand > span, body.noside .brand .sp{display:none}
  body.noside .brand #side-open{opacity:1; pointer-events:auto}
  body.noside #newconv, body.noside #tempconv, body.noside #csearch{width:44px; height:44px; min-height:0; padding:0;
    justify-content:center; margin:2px auto; border-radius:var(--r-md); gap:0}
  body.noside #newconv{background:none; border:0; box-shadow:none; color:var(--dim)}
  body.noside #newconv:hover, body.noside #tempconv:hover, body.noside #csearch:hover{background:var(--lift); color:var(--fg)}
  body.noside #newconv span, body.noside #tempconv span, body.noside #csearch span:not([data-icon]), body.noside #csearch kbd{display:none}
  body.noside #convlist{display:none}
  body.noside #owner{padding:8px 6px calc(10px + env(safe-area-inset-bottom))}
  body.noside #owner-btn{justify-content:center; padding:6px 0}
  body.noside #owner-btn .obody, body.noside #owner-btn > svg{display:none}
  body.noside #side-tg{display:none}
}
@media (max-width:900px){ body.noside #side{margin-inline-start:0} }
/* the rail's permanent open-sidebar glyph; the expanded wordmark keeps it hidden */
#side-open{position:absolute; inset-inline-start:50%; top:50%; transform:translate(-50%,-50%); opacity:0;
  pointer-events:none; transition:opacity var(--dur-1)}
[dir="rtl"] #side-open{transform:translate(50%,-50%)}
.brand{position:relative}
/* the search row under 临时对话 (ChatGPT's "Search chats") */
#csearch{display:flex; align-items:center; gap:8px; width:100%; padding:0 14px; min-height:var(--btn-h-sm);
  margin-top:2px; border:0; border-radius:var(--r-pill); background:none; cursor:pointer; font-size:var(--fs-md);
  color:var(--dim); transition:background var(--dur-1), color var(--dur-1); text-align:start; font:inherit; font-size:var(--fs-md)}
#csearch:hover{color:var(--fg); background:var(--lift)}
#csearch [data-icon] svg{width:15px; height:15px}
#csearch kbd{margin-inline-start:auto; font:var(--fs-2xs) var(--mono); color:var(--dim); opacity:.7}
#side-head{padding:14px 12px 8px; padding-top:calc(14px + env(safe-area-inset-top)); flex:none}
.brand{display:flex; align-items:center; gap:8px; font-weight:400; font-size:var(--fs-xl);
  font-family:var(--font-wordmark); font-synthesis:none; font-kerning:normal;
  letter-spacing:.01em; padding:2px 14px 12px; user-select:none}
.brand .sp{flex:1}
#newconv{display:flex; align-items:center; gap:8px; width:100%; padding:0 14px;
  min-height:36px; border:1px solid var(--line-soft); border-radius:var(--r-pill);
  background:var(--paper); box-shadow:var(--shadow-1);
  cursor:pointer; font-size:var(--fs-md); font-weight:500;
  transition:background var(--dur-1), border-color var(--dur-1)}
#newconv:hover{border-color:var(--line-2)}
#newconv:active{transform:translateY(1px); box-shadow:none}
#newconv svg{width:15px;height:15px;flex:none}
#tempconv{display:flex; align-items:center; gap:8px; width:100%; padding:0 14px;
  min-height:var(--btn-h-sm); margin-top:6px; border:0; border-radius:var(--r-pill); background:none; cursor:pointer;
  font-size:var(--fs-md); color:var(--dim);
  transition:background var(--dur-1), color var(--dur-1)}
#tempconv:hover{color:var(--fg); background:var(--lift)}
#tempconv svg{width:15px;height:15px;flex:none}
#convlist{flex:1; overflow-y:auto; padding:4px 8px 20px; overscroll-behavior:contain}
/* the owner card: who this Hoop belongs to, at the foot of the sidebar */
#owner{flex:none; padding:8px 8px calc(10px + env(safe-area-inset-bottom)); border-top:1px solid var(--line)}
#owner-btn{display:flex; align-items:center; gap:10px; width:100%; padding:6px 8px; border:0;
  background:none; border-radius:var(--r-md); cursor:pointer; text-align:start; font:inherit;
  color:var(--fg); min-height:44px}
#owner-btn:hover, #owner-btn.on{background:var(--lift)}
.oava{width:28px; height:28px; border-radius:50%; flex:none; display:grid; place-items:center;
  border:1.5px solid var(--brand); color:var(--brand-ink); font-size:var(--fs-sm); font-weight:500;
  text-transform:uppercase; overflow:hidden}
.oava img{width:100%; height:100%; object-fit:cover}
.obody{flex:1; min-width:0; display:flex; flex-direction:column; line-height:1.3}
.oname{font-size:var(--fs-md); font-weight:500; display:flex; align-items:baseline; gap:7px;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis}
.oname .ohoop{font:var(--fs-2xs) var(--mono); color:var(--dim); font-weight:400}
.ostat{font-size:var(--fs-2xs); color:var(--dim); white-space:nowrap; overflow:hidden;
  text-overflow:ellipsis; font-variant-numeric:tabular-nums}
#owner-btn > svg{width:14px; height:14px; color:var(--dim); flex:none}
.menu .mrow{display:flex; gap:4px; padding:4px 10px 6px}
.menu .mrow .opt{min-height:26px; padding:0 9px; font-size:var(--fs-xs); box-shadow:none}
.cgroup{color:var(--dim); font-size:var(--fs-2xs); letter-spacing:.06em; padding:14px 8px 4px;
  user-select:none}
.citem{display:flex; align-items:center; gap:8px; padding:8px 8px; padding-inline-start:11px;
  border-radius:var(--r-md); cursor:pointer; font-size:var(--fs-md); position:relative;
  color:var(--fg)}
/* the dot: a quiet hint at rest, the brand breathing while that conversation works,
   solid when a reply arrived while you were elsewhere (it goes out when you look) */
.cdot{width:6px; height:6px; border-radius:50%; background:var(--line-2); flex:none;
  transition:background var(--dur-2)}
.cdot.busy{background:var(--brand); animation:breathe 1.6s ease-in-out infinite}
.cdot.unread{background:var(--brand)}
@media (prefers-reduced-motion:reduce){ .cdot.busy{animation:none} }
.citem:hover{background:var(--lift)}
.citem.on{background:var(--brand-soft); font-weight:500}
.citem .ct{flex:1; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; min-width:0}
.citem .ct input{width:100%; border-radius:6px; padding:1px 5px; font:inherit}
.citem .cm{flex:none; border:0; background:none; color:var(--dim); cursor:pointer;
  padding:2px 5px; border-radius:6px; opacity:0; line-height:1; font-size:var(--fs-ui)}
.citem:hover .cm,.citem.menuon .cm{opacity:1}
.citem .cm:hover{color:var(--fg); background:var(--lift)}
@media (hover:none){ .citem .cm{opacity:.6} }
.cmenu{position:absolute; inset-inline-end:4px; top:calc(100% - 4px); z-index:30; min-width:110px;
  background:var(--glass-bg); -webkit-backdrop-filter:var(--glass-blur); backdrop-filter:var(--glass-blur);
  border:0; border-radius:var(--r-md); overflow:hidden; box-shadow:var(--glass-rim), var(--shadow-pop); padding:5px}
.cmenu button{display:block; width:100%; text-align:start; border:0; background:none;
  padding:7px 11px; font-size:var(--fs-sm); cursor:pointer; border-radius:var(--r-sm)}
.cmenu button:hover{background:var(--lift)}
.cmenu button.danger{color:var(--bad)}
#scrim{display:none}
.p-chat #main{flex:1; min-width:0; display:flex; flex-direction:column; height:var(--vvh, 100dvh);
  background:var(--bg); position:relative}
.p-chat header{display:flex; align-items:center; gap:6px; padding:8px 12px;
  padding-top:calc(8px + env(safe-area-inset-top)); min-height:calc(50px + env(safe-area-inset-top));
  position:absolute; top:0; inset-inline:0; z-index:4;
  background:transparent; transition:background var(--dur-2)}
/* the bar itself stays fully transparent (the owner: nothing may veil the conversation);
   once the stream scrolls under it, each button carries its own small glass disc */
.p-chat header.scrolled .hbtn{background:var(--glass-bg); -webkit-backdrop-filter:var(--glass-blur);
  backdrop-filter:var(--glass-blur); box-shadow:var(--glass-rim)}
.p-chat header #ctitle{display:none}
.hbtn.on{color:var(--brand-ink); background:var(--brand-soft)}
/* GHOST icon button: 32px square, nothing until hover */
.hbtn{border:0; background:none; color:var(--dim); cursor:pointer; padding:0;
  border-radius:50%; line-height:0; flex:none; position:relative;
  width:32px; height:32px; display:inline-grid; place-items:center}
.hbtn:hover{color:var(--fg); background:var(--lift)}
.hbtn svg{width:18px;height:18px}
#ctitle{font-weight:500; font-size:var(--fs-h); padding:4px 9px; border-radius:var(--r-sm);
  cursor:pointer; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; min-width:0}
#ctitle:hover{background:var(--lift)}
#ctitle input{border-radius:6px; padding:2px 6px; font:inherit; font-weight:500; width:14em}
#tempbadge{display:none; align-items:center; gap:6px; color:var(--dim);
  font-size:var(--fs-sm); border:1px dashed var(--line-2); border-radius:var(--r-btn);
  padding:3px 10px; white-space:nowrap}
body.tempmode #tempbadge{display:inline-flex}
body.tempmode #ctitle{display:none}
.p-chat header .sp{flex:1}
#nb{position:absolute; top:5px; inset-inline-end:5px; width:5px; height:5px; border-radius:50%;
  background:var(--accent); display:none}
#msgs{flex:1; overflow-y:auto; padding:calc(58px + env(safe-area-inset-top)) 18px calc(var(--composer-h, 96px) + 12px);
  overscroll-behavior:contain}
.m{max-width:46rem; margin:0 auto 16px; word-break:break-word; position:relative;
  animation:rise .18s ease-out}
/* the owner's bubble stays INSIDE the centered reading column, aligned to its end —
   one shared visual midline with the PA (the ChatGPT harmony), never glued to the edge */
.m.own{background:var(--own); border-radius:var(--r-xl); border-end-end-radius:6px;
  padding:9px 15px; margin-inline-start:auto;
  margin-inline-end:max(0px, calc((100% - 46rem) / 2));
  max-width:34rem; width:fit-content; white-space:pre-wrap; margin-bottom:30px}
.m.own .ownimgs{display:flex; gap:6px; flex-wrap:wrap; margin:2px 0 6px}
.m.own .ownimgs img{max-width:150px; max-height:150px; min-width:40px; min-height:40px;
  object-fit:cover; background:var(--code); border-radius:10px; display:block}
.m.own .ownimgs:last-child{margin-bottom:2px}
.m.pa{white-space:normal; font-family:var(--font-brand)}   /* the second voice */
.m.pa strong, .m.pa b{font-weight:600}
.m.sys{color:var(--dim); text-align:center; font-size:var(--fs-xs); letter-spacing:.04em;
  margin-bottom:18px}
.m.day{color:var(--dim); text-align:center; font-size:var(--fs-xs); margin:26px auto 18px}
.mdbody > :first-child{margin-top:.2em}
.m p{margin:.45em 0}
.m h1{font-size:1.25em; font-weight:500; margin:1.2em 0 .35em}
.m h2{font-size:1.15em; font-weight:500; margin:1.2em 0 .3em}
.m h3,.m h4{font-size:1.05em; font-weight:500; margin:1.1em 0 .25em}
.m ul,.m ol{margin:.35em 0; padding-inline-start:1.5em}
.m li{margin:.18em 0}
.m li > ul,.m li > ol{margin:.1em 0}
.m li.task{list-style:none; margin-inline-start:-1.35em}
.m li.task input{margin-inline-end:.5em; accent-color:var(--accent); vertical-align:-.12em}
.m blockquote{margin:.6em 0; padding:.1em 0; padding-inline-start:1em;
  border-inline-start:1px solid var(--line-2); color:var(--dim)}
.m hr{border:0; border-top:1px solid var(--line); margin:1.2em 0}
.m code{background:var(--code); border-radius:5px; padding:.12em .38em; font-size:.88em;
  font-family:var(--mono)}
.m a{color:var(--accent); text-decoration:none}
.m a:hover{text-decoration:underline}
.m del{color:var(--dim)}
.m img{max-width:100%; border-radius:var(--r-sm)}
.tblw{overflow-x:auto; margin:.7em 0; border:1px solid var(--line); border-radius:var(--r-md)}
.m table{border-collapse:collapse; width:max-content; min-width:100%; font-size:.93em;
  font-family:var(--font-ui); font-variant-numeric:tabular-nums}
.m th,.m td{padding:7px 13px; border-bottom:1px solid var(--line); text-align:start}
.m th{font-weight:500; background:var(--code); white-space:nowrap; font-family:var(--font-ui)}
.m tr:last-child td{border-bottom:0}
.cb{margin:.7em 0; border:1px solid var(--line); border-radius:var(--r-md); overflow:hidden;
  background:var(--code)}
.cb-h{display:flex; align-items:center; padding:5px 7px; padding-inline-start:13px;
  font-size:var(--fs-2xs); color:var(--dim); border-bottom:1px solid var(--line);
  font-family:var(--mono); letter-spacing:.03em}
.cb-h .sp{flex:1}
.cb-h button{border:0; background:none; color:var(--dim); cursor:pointer; font-size:var(--fs-2xs);
  padding:3px 8px; border-radius:6px; font-family:inherit}
.cb-h button:hover{color:var(--fg); background:var(--lift)}
.cb pre{margin:0; padding:11px 14px; overflow-x:auto; font:13px/1.6 var(--mono)}
.cb pre code{background:none; padding:0; font-size:1em; border-radius:0}
.hljs-keyword,.hljs-selector-tag,.hljs-literal,.hljs-doctag{color:var(--hl-key)}
.hljs-string,.hljs-regexp,.hljs-addition{color:var(--hl-str)}
.hljs-number,.hljs-symbol,.hljs-bullet,.hljs-attr,.hljs-attribute,.hljs-meta{color:var(--hl-num)}
.hljs-comment,.hljs-quote,.hljs-deletion{color:var(--hl-com); font-style:italic}
.hljs-title,.hljs-name,.hljs-section,.hljs-built_in,.hljs-type,.hljs-selector-class,.hljs-selector-id{color:var(--hl-fn)}
.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:500}
.acts{display:flex; gap:2px; margin-top:2px; opacity:0; transition:opacity var(--dur-1); height:26px}
.m:hover .acts,.acts:focus-within{opacity:1}
@media (hover:none){ .acts{opacity:.55} }
.m.own .acts{justify-content:flex-end; position:absolute; inset-inline-end:2px; bottom:-28px; margin:0}
.acts button{border:0; background:none; color:var(--dim); cursor:pointer; font-size:var(--fs-xs);
  padding:3px 8px; border-radius:7px; display:flex; align-items:center; gap:4px}
.acts button:hover{color:var(--fg); background:var(--lift)}
.acts svg{width:13px;height:13px}
.working{display:flex; align-items:center; gap:9px; color:var(--dim); font-size:var(--fs-ui)}
.working .orb{width:9px; height:9px; border-radius:50%; background:var(--brand);
  animation:orbit 1.1s ease-in-out infinite}
@keyframes orbit{0%,100%{transform:scale(.7);opacity:.4}50%{transform:scale(1);opacity:1}}
.m.typing > .mdbody > :last-child::after{content:"▍"; color:var(--brand); animation:breathe 1s infinite}
.steps{margin:0 0 8px; font-size:var(--fs-xs); color:var(--dim); font-family:var(--mono)}
.steps .stwrap{border-inline-start:1px solid var(--line-2); padding-inline-start:11px;
  margin-inline-start:2px; overflow:hidden}
.steps.folded .stwrap{display:none}
.steps .st{display:flex; align-items:baseline; gap:8px; padding:2.5px 0;
  animation:rise .12s ease-out; white-space:nowrap; overflow:hidden; text-overflow:ellipsis}
.steps .st .g{color:var(--brand-ink); flex:none}
.steps .st .nm{color:var(--fg); opacity:.75; flex:none}
.steps .fold{cursor:pointer; padding:2.5px 0; user-select:none; display:inline-block}
.steps .fold:hover{color:var(--fg)}
#older{display:block; margin:4px auto 14px; border:0; background:none; color:var(--dim);
  font-size:var(--fs-sm); cursor:pointer; padding:5px 12px; border-radius:var(--r-pill)}
#older:hover{color:var(--fg); background:var(--lift)}
#hello{max-width:46rem; margin:16vh auto 0; text-align:center; padding:0 8px}
#hello .hi{font-size:var(--fs-2xl); font-weight:400; font-family:var(--font-brand);
  letter-spacing:-.01em}
#hello .sub{color:var(--dim); margin-top:8px; font-size:var(--fs-h)}
#chips{display:flex; flex-wrap:wrap; gap:9px; justify-content:center; margin-top:26px}
.chip{border:1px solid var(--line-soft); border-radius:var(--r-btn); padding:0 13px;
  font-size:var(--fs-md); color:var(--dim); cursor:pointer; background:var(--paper);
  min-height:var(--btn-h); box-shadow:var(--shadow-1); display:inline-flex; align-items:center;
  transition:color var(--dur-1), border-color var(--dur-1)}
.chip:hover{color:var(--fg); border-color:var(--line-2)}
.chip:active{transform:translateY(1px); box-shadow:none}
/* .float — the end-side column every floating control lives in (codex art. 5) */
.float{position:fixed; inset-inline-end:var(--float-end); z-index:50}
.float.fbtn{width:36px; height:36px; border-radius:50%; border:0;
  background:var(--glass-bg); -webkit-backdrop-filter:var(--glass-blur); backdrop-filter:var(--glass-blur);
  color:var(--dim); box-shadow:var(--glass-rim), var(--shadow-pop); cursor:pointer;
  display:grid; place-items:center; padding:0}
.float.fbtn:hover{color:var(--fg)}
.float.fbtn svg{width:16px; height:16px}
#tolatest{bottom:calc(var(--composer-h, 96px) + 18px + env(safe-area-inset-bottom)); display:none}
@media (max-width:720px){
  /* no bottom bar on a phone: the hoop button and scroll-to-latest stack in the end
     column above the composer (--float-base is written by gram-mind.js) */
  .p-chat #composer{padding:6px 12px calc(10px + env(safe-area-inset-bottom))}
  #tolatest{bottom:calc(var(--float-base, 16px) + 56px + env(safe-area-inset-bottom)); width:40px; height:40px}
  .float.fbtn{width:40px; height:40px}
}
/* the composer floats over the stream: no floor, the text flows beneath the glass card */
#composer{position:absolute; inset-inline:0; bottom:0; z-index:3; pointer-events:none;
  padding:8px 18px calc(14px + env(safe-area-inset-bottom))}
#composer > *{pointer-events:auto}
#upname{max-width:46rem; margin:0 auto 6px; font-size:var(--fs-sm); color:var(--dim); display:none}
/* image tray: thumbnails of images about to be sent, each deletable */
#imgtray{max-width:46rem; margin:0 auto 8px; display:none; gap:8px; flex-wrap:wrap}
#imgtray.on{display:flex}
.imgchip{position:relative; width:64px; height:64px; border-radius:var(--r-sm);
  overflow:hidden; animation:var(--rise); background:var(--code); box-shadow:var(--shadow-1)}
.imgchip img{width:100%; height:100%; object-fit:cover; display:block}
.imgchip .del{position:absolute; top:3px; inset-inline-end:3px; width:20px; height:20px;
  border:0; border-radius:50%; background:rgba(0,0,0,.55); color:#fff; cursor:pointer;
  font-size:var(--fs-xs); line-height:1; display:grid; place-items:center; padding:0}
.imgchip .del:hover{background:rgba(0,0,0,.75)}
.imgchip.pending::after{content:""; position:absolute; inset:0;
  background:linear-gradient(90deg,transparent 8%,rgba(255,255,255,.25) 18%,transparent 33%);
  background-size:200% 100%; animation:shimmer 1.4s linear infinite}
#cwrap{max-width:46rem; margin:0 auto; display:flex; flex-direction:column; gap:4px;
  border:1px solid var(--line-soft); border-radius:var(--r-2xl); padding:12px 10px 8px 18px;
  background:var(--glass-bg); -webkit-backdrop-filter:var(--glass-blur); backdrop-filter:var(--glass-blur);
  box-shadow:var(--glass-rim), var(--shadow-pop);
  transition:border-color var(--dur-2), box-shadow var(--dur-2); position:relative}
#cwrap:focus-within{box-shadow:var(--focus), var(--shadow-1)}
#cwrap.dragover{border-color:var(--brand); box-shadow:var(--focus), var(--shadow-1)}
/* the composer's bottom rail: tools at the start, model + send at the end */
#crail{display:flex; align-items:center; gap:2px; min-height:32px}
#crail .sp{flex:1}
#inp{flex:none; width:100%; border:0; outline:0; background:none; color:var(--fg); resize:none;
  font:inherit; font-size:var(--fs-lg); line-height:1.6; letter-spacing:.01em; max-height:40vh;
  min-height:0; padding:4px 4px 4px 0; overflow-y:hidden; box-shadow:none; border-radius:0}
#inp:focus{box-shadow:none}
#inp::placeholder{color:var(--dim); opacity:.7}
#charn{position:absolute; inset-inline-end:14px; bottom:-19px; font-size:var(--fs-2xs); color:var(--dim);
  opacity:.8; display:none}
.cbtn{border:0; background:none; color:var(--dim); cursor:pointer;
  padding:0; border-radius:50%; line-height:0; flex:none; width:32px; height:32px;
  display:grid; place-items:center; transition:color var(--dur-1), background var(--dur-1)}
.cbtn:hover{color:var(--fg); background:var(--lift)}
.cbtn svg{width:18px; height:18px}
#send{color:var(--on-brand); box-shadow:var(--shadow-key); opacity:.4;
  background:linear-gradient(180deg, color-mix(in oklab, var(--brand) 86%, white) 0%, var(--brand) 45%, var(--brand-600) 100%);
  margin-inline-start:4px; transition:opacity var(--dur-1), transform var(--dur-1)}
#send.ready{opacity:1}
#send:active{transform:translateY(1px); box-shadow:none}
#send.stop{opacity:1; background:var(--fg); color:var(--bg); box-shadow:none}
#send:disabled, #send:not(.ready):not(.stop){filter:saturate(.6)}
#file{display:none}
#mic.rec{color:#fff; background:var(--bad); animation:breathe 1.2s ease-in-out infinite}
#attach svg{width:20px; height:20px}
.menu a .mo-sub{color:var(--dim); font-size:var(--fs-xs); margin-inline-start:auto; padding-inline-start:14px}
/* the model · thinking capsule on the rail (V0.1.8 ③): quiet sans, opens a .menu */
#mpick{border:0; background:none; color:var(--dim); cursor:pointer; font:inherit;
  font-size:var(--fs-xs); padding:0 10px; height:28px; border-radius:var(--r-pill);
  display:inline-flex; align-items:center; gap:5px; white-space:nowrap; max-width:14rem;
  overflow:hidden; text-overflow:ellipsis}
#mpick:hover{color:var(--fg); background:var(--lift)}
#mpick svg{width:12px; height:12px; flex:none; opacity:.8}
/* empty conversation: greeting + composer sit together at the page's center
   (the ChatGPT "ready when you are" posture); once a message exists the composer
   returns to its bottom dock. Toggled by body.emptyconv from gram-mind.js. */
body.emptyconv #msgs{flex:0 1 auto; margin-block-start:auto; overflow-y:visible; padding-bottom:8px; padding-top:8px}
body.emptyconv #composer{position:static; margin-block-end:auto}
body.emptyconv #hello{margin:0 auto 26px}
#panel{position:fixed; inset:0; background:var(--bg); display:none;
  flex-direction:column; z-index:40; animation:fade var(--dur-1) ease-out}
#panel.on{display:flex}
#phead{display:flex; align-items:center; gap:10px; padding:12px 18px;
  padding-top:calc(12px + env(safe-area-inset-top)); border-bottom:1px solid var(--line)}
#ptitle{font-weight:500}
#phead .sp{flex:1}
#phead a{color:var(--dim); text-decoration:none; font-size:var(--fs-md); padding:6px 10px;
  border-radius:var(--r-sm)}
#phead a:hover{color:var(--fg); background:var(--lift)}
#pbody{flex:1; overflow-y:auto; padding:16px 18px 40px}
#pbody .card{max-width:46rem; margin:0 auto 12px}
@media (max-width:900px){
  .p-chat #side{position:fixed; inset-inline-start:0; top:0; bottom:0; z-index:9996; width:280px;
    transform:translateX(-102%); transition:transform var(--dur-2) var(--ease); margin:0!important;
    background:var(--bg); border-radius:0; border-inline-end:0; box-shadow:none}
  [dir="rtl"] .p-chat #side{transform:translateX(102%)}
  body.sideopen #side{transform:none!important}
  .p-chat #main{transform-origin:left center; transition:transform var(--dur-2) var(--ease),border-radius var(--dur-2),box-shadow var(--dur-2); z-index:9997}
  [dir="rtl"] .p-chat #main{transform-origin:right center}
  body.sideopen #main{transform:translateX(252px) scale(.98); border-radius:var(--r-xl); box-shadow:var(--shadow-pop); overflow:hidden}
  [dir="rtl"] body.sideopen #main{transform:translateX(-252px) scale(.98)}
  #scrim{position:fixed; inset-block:0; inset-inline-start:280px; inset-inline-end:0; background:var(--scrim); z-index:9998; opacity:0;
    pointer-events:none; transition:opacity var(--dur-2)}
  body.sideopen #scrim{display:block; opacity:1; pointer-events:auto}
  .m.own{max-width:88%}
}

/* ═══ settings (p-set) ══════════════════════════════════════════════════ */
.form-grid{display:flex; flex-direction:column}
.form-row{display:grid; grid-template-columns:10rem minmax(0,1fr); gap:18px; align-items:center;
  padding:11px 0; color:var(--fg); text-decoration:none}
.form-row + .form-row{border-top:1px solid var(--line)}
.form-label{font-size:var(--fs-ui); min-width:0}
.form-label small{display:block; color:var(--dim); font-size:var(--fs-xs); line-height:1.5;
  margin-top:3px; font-weight:400}
.form-control{display:flex; align-items:center; justify-content:flex-end; gap:9px; min-width:0}
.form-control input,.form-control textarea{width:100%; margin:0}
.form-control textarea{min-height:8.5rem; line-height:1.55}
.profile-instructions-row{align-items:start}
.profile-avatar{width:48px; height:48px; position:relative; display:grid; place-items:center;
  border:1px solid var(--line-soft); border-radius:50%; overflow:hidden; padding:0; cursor:pointer;
  color:var(--fg); background:var(--surface-2); box-shadow:var(--shadow-1); font-weight:500}
.profile-avatar img{width:100%; height:100%; object-fit:cover}
.profile-avatar .avatar-edit{position:absolute; inset:0; display:grid; place-items:center;
  color:transparent; background:transparent; transition:color var(--dur-1),background var(--dur-1)}
.profile-avatar:hover .avatar-edit,.profile-avatar:focus-visible .avatar-edit{
  color:var(--surface); background:color-mix(in oklab,var(--fg) 56%,transparent)}
.profile-avatar:focus-visible{outline:none; box-shadow:var(--focus),var(--shadow-1)}
.avatar-control{justify-content:flex-start}
.profile-actions{display:flex; justify-content:flex-end; min-height:20px; margin-top:2px}
.profile-actions .fine{font-size:var(--fs-xs); color:var(--dim)}
.kv{display:grid; grid-template-columns:6.5rem 1fr; gap:6px 14px; font-size:var(--fs-ui)}
.card h3.kvh{margin-top:20px}
.kv .k{color:var(--dim)}
.kv .v{word-break:break-all; font-variant-numeric:tabular-nums}
.kv .v.na{color:var(--dim)}
.org{padding:10px 0; border-bottom:1px solid var(--line)}
.org:last-of-type{border-bottom:0}
.org .head{display:flex; align-items:baseline; gap:10px; margin-bottom:7px; flex-wrap:wrap}
.org .head b{font-size:var(--fs-ui)}
.org .head .enf{font-size:var(--fs-2xs); color:var(--dim); border:1px solid var(--line-2);
  border-radius:var(--r-pill); padding:1px 9px}
.org .head .enf.hard{color:var(--ok); border-color:var(--ok)}
.opts{display:flex; gap:8px; flex-wrap:wrap}
.opt{border:1px solid var(--line-soft); border-radius:var(--r-btn); padding:0 12px;
  font-size:var(--fs-sm); cursor:pointer; color:var(--dim); user-select:none; min-height:var(--btn-h-sm);
  display:inline-flex; align-items:center; gap:4px; background:var(--paper); box-shadow:var(--shadow-1);
  transition:border-color var(--dur-1), color var(--dur-1), background var(--dur-1)}
.opt:hover{border-color:var(--line-2); color:var(--fg)}
.opt:active{transform:translateY(1px); box-shadow:none}
.opt.cur{background:var(--brand-soft); color:var(--fg); border-color:color-mix(in oklab, var(--brand) 45%, transparent);
  font-weight:500}
.opt.stage{color:var(--on-brand); background:var(--brand); border-color:transparent;
  box-shadow:var(--shadow-key); font-weight:500}
.opt .hint{font-weight:400; opacity:.75; margin:0; font-size:inherit; color:inherit}
.opt.reserved{opacity:.45; cursor:default}
.opt.reserved:hover{border-color:var(--line-soft); color:var(--dim)}
.feed{max-height:24rem; overflow:auto; margin:0 -6px}
.evt{display:flex; gap:10px; padding:7px 6px; font-size:var(--fs-sm); border-bottom:1px solid var(--line);
  align-items:baseline}
.evt:last-child{border-bottom:0}
.evt .t{color:var(--dim); font-size:var(--fs-xs); flex:none; width:7.2rem;
  font-variant-numeric:tabular-nums}
.evt .k{flex:none; font-size:var(--fs-xs); border-radius:6px; padding:0 7px;
  background:var(--code); color:var(--dim)}
.evt .k.security{color:var(--warn)}
.evt .k.money{color:var(--ok)}
.evt .x{flex:1; min-width:0; word-break:break-word}
.svc{display:grid; grid-template-columns:1fr 1fr; gap:5px 18px}
.svc .s{display:flex; align-items:center; gap:8px; font-size:var(--fs-md)}
.svc .d{width:8px; height:8px; border-radius:50%; background:var(--line-2); flex:none;
  transition:background var(--dur-3)}
.svc .d.ok{background:var(--ok)}
.svc .d.bad{background:var(--bad)}
.svc .who{color:var(--dim); font-size:var(--fs-xs); margin-inline-start:auto}
.app-versions{display:grid; gap:0}
.app-version-row{display:flex; align-items:center; justify-content:space-between; gap:var(--sp-3); padding:10px 0; border-bottom:1px solid var(--line-soft)}
.app-version-row:last-child{border-bottom:0}
.app-version-name{font-size:var(--fs-sm); color:var(--fg)}
.app-version-meta{font-family:var(--mono); font-size:var(--fs-xs); color:var(--dim); text-align:end}
.update-panel{display:grid; gap:var(--sp-3); margin-top:var(--sp-3)}
.update-state{font-size:var(--fs-md); color:var(--fg)}
.update-detail{white-space:pre-line; font-size:var(--fs-sm); color:var(--dim); line-height:1.65}
.update-history{display:grid; gap:8px}
.update-history-row{display:grid; grid-template-columns:minmax(8rem,1fr) auto; gap:var(--sp-3); padding:8px 0; border-bottom:1px solid var(--line-soft); font-size:var(--fs-sm)}
.update-history-row:last-child{border-bottom:0}
.update-history-row span:last-child{font-family:var(--mono); color:var(--dim); text-align:end}
.facts{display:flex; gap:20px; flex-wrap:wrap; margin-top:12px; padding-top:10px;
  border-top:1px solid var(--line); color:var(--dim); font-size:var(--fs-sm)}
.facts b{color:var(--fg); font-weight:500}
.tzline{display:flex; gap:10px; align-items:center; flex-wrap:wrap; margin-top:12px}
.tzline .k{color:var(--dim); font-size:var(--fs-ui)}
.tzline input{width:13rem}
.langline{display:flex; gap:8px; flex-wrap:wrap; margin-top:12px; align-items:center}
.langline .k{color:var(--dim); font-size:var(--fs-ui)}
@media (max-width:600px){
  .form-row{grid-template-columns:1fr; gap:7px; padding:13px 0}
  .profile-avatar-row{grid-template-columns:minmax(0,1fr) auto}
  .profile-avatar-row .avatar-control{justify-content:flex-end}
}
@media (max-width:480px){ .svc{grid-template-columns:1fr} .kv{grid-template-columns:5.5rem 1fr} }

/* ═══ budget grid (finance + settings summary) ══════════════════════════ */
.bud{display:grid; grid-template-columns:1fr 6rem 6rem; gap:6px 12px; font-size:var(--fs-ui);
  align-items:center; font-variant-numeric:tabular-nums}
.bud .h{color:var(--dim); font-size:var(--fs-xs)}
.bud input{border-radius:var(--r-btn); padding:0 9px; min-height:var(--btn-h-sm); font-size:var(--fs-md); width:100%;
  text-align:end}
.bud input:disabled{border-color:transparent; background:none; color:var(--fg);
  opacity:1; box-shadow:none; padding-inline-start:0}
.citem .ct input, #ctitle input{min-height:0; box-shadow:none; padding:1px 5px}
.bud .nm{font-weight:500}
.bud .over{color:var(--bad); font-weight:500}
.budline{display:flex; gap:14px; flex-wrap:wrap; margin-top:12px; padding-top:10px;
  border-top:1px solid var(--line); color:var(--dim); font-size:var(--fs-sm);
  align-items:baseline}
.budline b{color:var(--fg)}
@media (max-width:390px){ .bud{grid-template-columns:1fr 4.6rem 4.6rem} }

/* ═══ mail / comms (p-mail) ═════════════════════════════════════════════ */
.unread{color:var(--accent); font-size:var(--fs-2xs); margin-inline-start:8px; vertical-align:2px}
.numline{display:flex; align-items:baseline; gap:10px; flex-wrap:wrap; margin-top:16px;
  font-size:var(--fs-ui)}
.numline b{font-size:1.05rem; letter-spacing:.02em; font-variant-numeric:tabular-nums}
.numline .off{color:var(--dim)}
.chan{display:inline-flex; align-items:center; gap:5px; margin:2px 0;
  margin-inline-end:10px; color:var(--dim); font-size:var(--fs-sm)}
.chan a{color:var(--accent); text-decoration:none; cursor:pointer}

/* ── the mail workbench (V0.1.7 ④: T2 — folders · thread list · reading) ── */
.p-mail main{max-width:78rem}
.mailwb{display:grid; grid-template-columns:11rem 21rem 1fr; margin-top:14px;
  border:1px solid var(--line); border-radius:var(--r-lg); overflow:hidden;
  background:var(--surface); height:calc(100dvh - 16rem); min-height:28rem}
.mw-side{border-inline-end:1px solid var(--line); padding:12px 10px; overflow-y:auto;
  display:flex; flex-direction:column; gap:2px}
.mw-side > .btn{margin-bottom:10px; flex:none}
.mw-owner{margin-top:auto; padding:8px 0 0; border-top:1px solid var(--line)}
.mw-owner #owner-btn{padding:4px 6px; min-height:40px}
.mw-box{display:flex; align-items:center; gap:8px; padding:7px 10px;
  border-radius:var(--r-sm); cursor:pointer; color:var(--fg); font-size:var(--fs-sm);
  border:0; background:none; font:inherit; text-align:start; width:100%}
.mw-box:hover{background:var(--lift)}
.mw-box.on{background:var(--brand-soft); color:var(--brand-ink); font-weight:500}
.mw-box.quiet{color:var(--dim)}
.mw-box .n{margin-inline-start:auto; color:var(--dim); font-size:var(--fs-2xs)}
.mw-box.on .n{color:var(--brand-ink)}
.mw-list{border-inline-end:1px solid var(--line); overflow-y:auto; min-width:0}
.mw-tools{padding:10px; border-bottom:1px solid var(--line); position:sticky; top:0;
  background:var(--surface); z-index:1}
.mw-tools input{width:100%}
.mw-row{padding:10px 12px; border-bottom:1px solid var(--line); cursor:pointer; min-width:0}
.mw-row:hover{background:var(--lift)}
.mw-row.sel{background:var(--brand-soft)}
.mw-row .l1{display:flex; gap:8px; align-items:baseline; min-width:0}
.mw-row .who{font-size:var(--fs-sm); color:var(--dim); overflow:hidden;
  text-overflow:ellipsis; white-space:nowrap; flex:1; min-width:0}
.mw-row .when,.mw-row .nthr{color:var(--dim); font-size:var(--fs-2xs); flex:none}
.mw-row .subj{font-size:var(--fs-sm); overflow:hidden; text-overflow:ellipsis;
  white-space:nowrap; flex:1; min-width:0}
.mw-row.unseen .who,.mw-row.unseen .subj{color:var(--fg); font-weight:500}
.mw-row .prev{color:var(--dim); font-size:var(--fs-xs); overflow:hidden;
  text-overflow:ellipsis; white-space:nowrap}
.mw-read{overflow-y:auto; min-width:0; padding:14px 20px}
.mw-rtools{display:flex; gap:2px; align-items:center; flex-wrap:wrap;
  padding-bottom:8px; border-bottom:1px solid var(--line); margin-bottom:10px}
.mw-rtools .mw-move{margin-inline-start:auto; max-width:9rem}
.mw-backbtn{display:none}
.mw-msg{border-bottom:1px solid var(--line); padding:12px 0}
.mw-msg:last-child{border-bottom:0}
.mw-msg .mhead{display:flex; gap:10px; align-items:center}
.mw-msg .mcol{min-width:0; display:flex; flex-direction:column}
.mw-ava{flex:none; width:34px; height:34px; border-radius:50%;
  border:1px solid var(--brand); color:var(--brand-ink); display:grid;
  place-items:center; font-weight:500; font-size:var(--fs-ui)}
.mw-msg .mfrom{font-weight:500; font-size:var(--fs-sm)}
.mw-msg .mmeta{color:var(--dim); font-size:var(--fs-xs); overflow:hidden;
  text-overflow:ellipsis; white-space:nowrap}
.mw-body{margin-top:10px; font-size:var(--fs-rd); line-height:1.75;
  overflow-wrap:break-word; font-family:var(--font-brand)}   /* reading = serif */
.mw-body img{max-width:100%}
.mw-body blockquote{border-inline-start:1px solid var(--line-2); margin:8px 0;
  padding-inline-start:12px; color:var(--dim)}
.mw-att{display:inline-flex; align-items:center; gap:7px; border:1px solid var(--line-soft);
  border-radius:var(--r-btn); padding:5px 10px; margin:6px 6px 0 0; background:var(--paper);
  font-size:var(--fs-xs); color:var(--fg); text-decoration:none}
.mw-att:hover{background:var(--lift)}
.mw-att .rm{cursor:pointer; color:var(--dim)}
.mw-quick{margin-top:14px}
.mw-quick textarea{width:100%; min-height:5rem; margin-bottom:8px}
/* the floating compose card */
.mw-compose{position:fixed; inset-inline-end:var(--float-end); bottom:16px;
  width:min(34rem, calc(100vw - var(--dock-w) - 32px)); background:var(--glass-bg);
  -webkit-backdrop-filter:var(--glass-blur); backdrop-filter:var(--glass-blur);
  border:0; border-radius:var(--r-2xl);
  box-shadow:var(--glass-rim), var(--shadow-pop); padding:16px; z-index:9000}
.mw-compose input,.mw-compose textarea{width:100%; margin-bottom:8px}
.mw-compose textarea{min-height:9rem}
.mw-compose .duo{display:flex; gap:8px}
.mw-compose .duo input{flex:1; min-width:0}
.mwc-head{display:flex; justify-content:space-between; align-items:center;
  margin-bottom:8px}
.mwc-x{border:0; background:none; color:var(--dim); cursor:pointer;
  font-size:var(--fs-ui); padding:2px 6px}
@media (max-width:900px){
  .mailwb{grid-template-columns:1fr; height:auto; min-height:60dvh}
  .mw-owner{display:none}
  .mw-boxes{display:flex; gap:4px; overflow-x:auto; flex:1; min-width:0; scrollbar-width:none}
  .mw-boxes .mw-box{flex:none}
  .mw-side > .btn{padding:0 12px; min-height:30px; font-size:var(--fs-sm)}
  .mw-side{flex-direction:row; overflow-x:auto; border-inline-end:0;
    border-bottom:1px solid var(--line); align-items:center}
  .mw-side > .btn{margin:0 8px 0 0}
  .mw-box{width:auto; white-space:nowrap}
  .mw-list{border-inline-end:0}
  .mailwb.reading .mw-list,.mailwb.reading .mw-side{display:none}
  .mailwb:not(.reading) .mw-read{display:none}
  .mw-backbtn{display:inline-flex}
  .mw-compose{inset-inline:10px; width:auto; bottom:calc(72px + env(safe-area-inset-bottom))}
}

/* ═══ calendar / time (p-cal) ═══════════════════════════════════════════ */
.card pre.clamp{max-height:5.2em; overflow:hidden; cursor:pointer; color:var(--dim);
  font-size:var(--fs-sm)}
.card pre.clamp.open{max-height:none; color:var(--fg)}
.when{color:var(--dim); font-size:var(--fs-sm); margin-top:2px}
.day{margin:22px 0 8px; color:var(--dim); font-size:var(--fs-sm); letter-spacing:.05em;
  display:flex; align-items:baseline; gap:8px}
.day b{color:var(--fg); font-weight:500; font-size:var(--fs-md); letter-spacing:0}
.day.today b{color:var(--brand-ink)}
.ev{display:flex; gap:12px; background:var(--surface); border:1px solid var(--line);
  border-radius:var(--r-lg); padding:11px 15px; margin-bottom:8px; align-items:baseline;
  animation:var(--rise); flex-wrap:wrap}
.ev.past{opacity:.5}
.ev .tm{flex:none; font:13px var(--mono); color:var(--brand-ink); width:6.8rem}
.ev .bd{flex:1; min-width:0}
.ev .bd b{font-size:var(--fs-h); font-weight:500}
.ev .bd .meta{color:var(--dim); font-size:var(--fs-sm); word-break:break-word}
.ev .ops{flex:none; display:flex; gap:10px}
.ev .ops a{color:var(--dim); font-size:var(--fs-sm); cursor:pointer; padding:4px 0}
.ev .ops a:hover{color:var(--fg)}
.ev .ops a.danger:hover{color:var(--bad)}
.pastbar{color:var(--dim); font-size:var(--fs-sm); cursor:pointer; margin:18px 0 4px;
  user-select:none}
.pastbar:hover{color:var(--fg)}

/* ═══ files (p-files) ═══════════════════════════════════════════════════ */
.crumbs{display:flex; align-items:center; gap:4px; flex-wrap:wrap; font-size:var(--fs-md);
  margin:14px 0 10px; min-height:28px}
.crumbs a{color:var(--accent); text-decoration:none; cursor:pointer; padding:4px 6px;
  border-radius:var(--r-sm)}
.crumbs a:hover{background:var(--lift)}
.crumbs .sep{color:var(--dim)}
.crumbs .here{font-weight:500; padding:4px 6px}

/* V0.2.3 C3 — the Finder: T2 workbench (sidebar · toolbar · content · info). In a window
   (html.hoop-embedded) it fills the frame; as a page it sits in the 78rem column. */
.p-files main{max-width:78rem}
.fd{display:grid; grid-template-columns:12rem 1fr; margin-top:14px; border:1px solid var(--line); border-radius:var(--r-lg);
  overflow:hidden; background:var(--surface); height:calc(100dvh - 12rem); min-height:26rem}
.fd.with-info{grid-template-columns:12rem 1fr 17rem}
html.hoop-embedded .p-files main{max-width:none; padding:0}
html.hoop-embedded .p-files h1.app{display:none}
html.hoop-embedded .fd{margin:0; border:0; border-radius:0; height:100dvh}
.fd-side{border-inline-end:1px solid var(--line); padding:12px 8px; overflow-y:auto; background:var(--bg)}
.fd-sect{color:var(--dim); font-size:var(--fs-2xs); letter-spacing:.08em; text-transform:uppercase; padding:8px 10px 4px}
.fd-place{display:flex; align-items:center; gap:8px; width:100%; padding:6px 10px; border:0; background:none; font:inherit;
  font-size:var(--fs-sm); color:var(--fg); border-radius:var(--r-sm); cursor:pointer; text-align:start; min-height:30px}
.fd-place:hover{background:var(--lift)} .fd-place.on{background:var(--brand-soft); color:var(--brand-ink); font-weight:500}
.fd-place [data-icon]{width:16px; height:16px; color:var(--dim); flex:none} .fd-place.on [data-icon]{color:var(--brand-ink)}
.fd-place.drop{outline:2px solid var(--accent); outline-offset:-2px}
.fd-main{display:flex; flex-direction:column; min-width:0; position:relative}
.fd-tools{display:flex; align-items:center; gap:2px; padding:6px 8px; flex:none; min-height:46px}
.fd-tools .hbtn{position:static; flex:none} .fd-tools .hbtn:disabled{opacity:.35; cursor:default}
.fd-sidebtn, #fd-sidebtn{display:none}
.fd-crumbs{margin:0 6px; min-width:0; flex-wrap:nowrap; overflow:hidden; white-space:nowrap}
.fd-sp{flex:1}
.fd-q{width:11rem; min-height:30px; font-size:var(--fs-sm); margin:0 6px}
@media (max-width:720px){.fd-q{font-size:16px}}   /* art. 7: no iOS zoom */
.fd-body{flex:1; overflow:auto; outline:none; padding:6px; position:relative}
.fd-body:focus-visible{outline:2px solid var(--ring); outline-offset:-2px}
.fd-body.grid{display:grid; grid-template-columns:repeat(auto-fill, minmax(112px, 1fr)); gap:4px; align-content:start}
.fd-body.rows{display:flex; flex-direction:column}
.fd-head{display:grid; grid-template-columns:minmax(0,1fr) 10rem 6rem 9rem; gap:12px; padding:4px 10px; position:sticky; top:-6px; z-index:1;
  background:var(--surface); border-bottom:1px solid var(--line)}
.fd-col{border:0; background:none; font:inherit; font-size:var(--fs-2xs); color:var(--dim); text-align:start; padding:4px 0; cursor:pointer; letter-spacing:.04em}
.fd-col.on{color:var(--fg); font-weight:500}
.fd-item{display:flex; align-items:center; gap:10px; padding:6px 10px; border-radius:var(--r-sm); cursor:default; user-select:none; min-width:0}
.fd-body.rows .fd-item{display:grid; grid-template-columns:minmax(0,1fr) 10rem 6rem 9rem; gap:12px; min-height:32px}
.fd-body.rows .fd-item > :first-child{display:contents}
.fd-body.rows .fd-ic{display:inline-flex; width:18px; height:18px; vertical-align:middle; margin-inline-end:8px}
.fd-body.rows .fd-nm{display:inline; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-size:var(--fs-md)}
.fd-body.grid .fd-item{flex-direction:column; gap:6px; padding:12px 6px 10px; text-align:center}
.fd-body.grid .fd-ic{width:48px; height:48px; display:grid; place-items:center}
.fd-body.grid .fd-ic svg{width:40px; height:40px; color:var(--dim)}
.fd-body.grid .fd-nm{font-size:var(--fs-sm); line-height:1.3; max-width:100%; overflow:hidden; text-overflow:ellipsis; display:-webkit-box;
  -webkit-line-clamp:2; -webkit-box-orient:vertical; word-break:break-word}
.fd-ic.thumb img{width:100%; height:100%; object-fit:cover; border-radius:6px}
.fd-body.rows .fd-ic.thumb img{width:18px; height:18px; border-radius:3px}
.fd-ic svg{width:18px; height:18px; color:var(--dim)}
.fd-item:hover{background:var(--lift)}
.fd-item.sel{background:var(--brand-soft)} .fd-item.sel .fd-nm{color:var(--brand-ink)}
.fd-item.drop{outline:2px solid var(--accent); outline-offset:-2px}
.fd-meta{color:var(--dim); font-size:var(--fs-xs); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-variant-numeric:tabular-nums}
.fd-meta.num{text-align:end}
.fd-status{flex:none; padding:4px 12px; border-top:1px solid var(--line); color:var(--dim); font-size:var(--fs-2xs); text-align:center}
.fd-drop{position:absolute; inset:46px 0 0 0; z-index:2; display:grid; place-items:center; pointer-events:none; color:var(--accent);
  font-size:var(--fs-lg); background:color-mix(in oklab, var(--accent) 8%, transparent); outline:2px dashed var(--accent); outline-offset:-8px}
.fd-marquee{position:fixed; z-index:9; border:1px solid var(--accent); background:color-mix(in oklab, var(--accent) 12%, transparent); pointer-events:none}
.fd-info{border-inline-start:1px solid var(--line); padding:14px; overflow-y:auto; background:var(--bg)}
.fd-info h3{margin:0 0 10px; font-size:var(--fs-h); font-weight:500}
.fd-info-ic{width:64px; height:64px; margin:6px auto} .fd-info-ic svg{width:64px; height:64px; color:var(--dim)}
.fd-info-name{text-align:center; font-size:var(--fs-md); font-weight:500; margin-bottom:12px; word-break:break-word}
.fd-info .kv{font-size:var(--fs-sm)}
/* quick look: a glass stage over everything, Esc / × / click-out */
.ql{position:fixed; inset:0; z-index:9997; background:var(--scrim); display:flex; flex-direction:column; align-items:center; justify-content:center; padding:24px;
  -webkit-backdrop-filter:blur(10px); backdrop-filter:blur(10px); animation:fade var(--dur-1) ease-out}
.ql-head{width:min(64rem,100%); display:flex; align-items:center; gap:6px; color:var(--bg); padding:0 4px 8px}
.ql-head b{flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-weight:500; color:#fff}
.ql-head .hbtn, .ql-head .ql-x{position:static; color:#fff}
.ql-body{width:min(64rem,100%); height:min(80dvh,100%); background:var(--surface); border-radius:var(--r-xl); overflow:auto; display:grid; place-items:center; box-shadow:var(--shadow-pop)}
.ql-body img, .ql-body video{max-width:100%; max-height:80dvh; object-fit:contain}
.ql-body iframe{width:100%; height:80dvh; border:0}
.ql-body pre{align-self:start; justify-self:stretch; margin:0; padding:18px 22px; white-space:pre-wrap; word-break:break-word; font:var(--fs-md)/1.6 var(--mono)}
.ql-body .ql-md{align-self:start; justify-self:stretch; padding:22px 28px; max-width:46rem; margin:0 auto; font-family:var(--font-brand); font-size:var(--fs-rd); line-height:1.75}
.toast.undo{display:flex; align-items:center; gap:12px; padding-inline-end:6px}
@media (max-width:900px){
  .fd{grid-template-columns:1fr; height:calc(100dvh - 9rem)}
  .fd.with-info{grid-template-columns:1fr}
  .fd-side{position:absolute; inset-inline-start:0; top:0; bottom:0; z-index:3; width:13rem; transform:translateX(-102%); transition:transform var(--dur-2) var(--ease); box-shadow:var(--shadow-pop)}
  [dir="rtl"] .fd-side{transform:translateX(102%)}
  .fd.side-open .fd-side{transform:none}
  #fd-sidebtn{display:inline-grid}
  .fd-info{position:absolute; inset-inline-end:0; top:46px; bottom:0; z-index:3; width:min(17rem,80vw); box-shadow:var(--shadow-pop)}
  .fd-main{position:relative}
}
@media (max-width:720px){
  .fd{margin-top:8px; height:calc(100dvh - 7rem); border-radius:var(--r-md)}
  .fd-q{width:7rem}
  .fd-head, .fd-body.rows .fd-item{grid-template-columns:minmax(0,1fr) 6rem}
  .fd-head .fd-col:nth-child(3), .fd-head .fd-col:nth-child(4), .fd-body.rows .fd-meta:nth-child(3), .fd-body.rows .fd-meta:nth-child(4){display:none}
  .fd-body.rows .fd-item{min-height:40px}
  #fd-sort, #fd-infobtn{display:none}
}
/* ═══ games — same AppWindow route, native game streamed only through owner auth ═══ */
.p-games main{max-width:72rem}
.game-stage{width:100%;aspect-ratio:4/3;max-height:calc(100dvh - 13rem);overflow:hidden;
  border-radius:var(--r-card);background:#101010;box-shadow:var(--shadow-1)}
.game-frame{display:block;width:100%;height:100%;border:0;background:#101010}
.game-note{margin-top:var(--sp-3)}
@media (max-width:720px){.p-games main{padding-inline:0}.p-games h1,.p-games .lede,.game-note{margin-inline:var(--sp-4)}
  .game-stage{border-radius:0;max-height:calc(100dvh - 10rem)}}
.list-box .empty{border:0; margin:0}
.up{color:var(--dim); font-size:var(--fs-sm); margin-top:10px}

/* ═══ memory (p-mem) ════════════════════════════════════════════════════ */
.p-mem .card textarea, .p-mem .card input{width:100%; margin-top:8px}
.p-mem .card textarea{min-height:9rem; background:var(--code);
  font:var(--fs-md)/1.65 var(--mono)}
.p-mem #newcard{display:none}
.p-mem #newcard.on{display:block}

/* ═══ vpn (p-vpn) ═══════════════════════════════════════════════════════ */
.p-vpn{font:15px/1.7 var(--mono)}
.p-vpn h2{font-size:.95rem; margin-top:2.6rem; border-bottom:1px solid var(--line);
  padding-bottom:.4rem; font-weight:500}
.p-vpn .dim{color:var(--dim)}
.p-vpn .ok{color:var(--ok)}
.p-vpn table{border-collapse:collapse; width:100%; margin:.6rem 0}
.p-vpn td{padding:.25rem 0; padding-inline-end:.8rem; vertical-align:top}
/* V0.1.9 ② the connect card: QR + links + a breathing badge that turns brand once the probe says "via_hoop" */
.p-vpn .vcard{font-family:var(--font-ui); font-size:var(--fs-ui); line-height:1.55}
.p-vpn .vcard h3{margin-bottom:var(--sp-2)}
.p-vpn .vgrid{display:grid; grid-template-columns:auto 1fr; gap:var(--sp-5); align-items:start; margin-top:var(--sp-4)}
.p-vpn .vqr{text-align:center}
.p-vpn .vqr img{display:block; width:168px; height:168px; border-radius:var(--r-md); background:#fff; padding:6px}
.p-vpn .vqr .fine{color:var(--dim); font-size:var(--fs-xs); margin-top:var(--sp-2)}
.p-vpn .vbadge{display:inline-flex; align-items:center; gap:var(--sp-2); color:var(--dim); font-size:var(--fs-sm);
  padding:4px 12px; border:1px solid var(--line); border-radius:var(--r-pill); margin-bottom:var(--sp-3)}
.p-vpn .vbadge .cdot{background:var(--line-2)}
.p-vpn .vbadge.on{color:var(--brand-ink); border-color:var(--brand)}
.p-vpn .vbadge.on .cdot{background:var(--brand); animation:breathe 2.6s ease-in-out infinite}
.p-vpn .vclients{margin-top:var(--sp-4); font-size:var(--fs-sm)}
.p-vpn .vclients > div{display:flex; justify-content:space-between; gap:var(--sp-3); padding:6px 0; border-top:1px solid var(--line)}
.p-vpn .vclients a{color:var(--fg)}
@media (max-width:600px){ .p-vpn .vgrid{grid-template-columns:1fr} .p-vpn .vqr img{margin:0 auto} }
.p-vpn td:first-child{color:var(--dim); white-space:nowrap; width:11rem}
.p-vpn code, .p-vpn pre{background:var(--code); border:1px solid var(--line);
  border-radius:6px}
.p-vpn code{padding:.1rem .4rem}
.p-vpn pre{padding:.9rem 1rem; overflow-x:auto; position:relative; white-space:pre-wrap;
  word-break:break-all}
.p-vpn button.copy{position:absolute; top:.5rem; inset-inline-end:.5rem;
  background:var(--surface); color:var(--dim); border:1px solid var(--line-soft);
  border-radius:var(--r-btn); font:12px inherit; padding:.3rem .7rem; cursor:pointer;
  box-shadow:var(--shadow-1)}
.p-vpn button.copy:hover{color:var(--fg)}
.p-vpn ol{padding-inline-start:1.3rem} .p-vpn li{margin:.35rem 0}
.p-vpn .locked{color:var(--dim); font-style:italic}
.p-vpn a{color:var(--accent)}

/* ═══ finance (p-fin) ═══════════════════════════════════════════════════ */
.wallet-head{display:flex; gap:18px; align-items:center; flex-wrap:wrap}
.wallet-head .qr{flex:none; width:132px; height:132px; border:1px solid var(--line);
  border-radius:var(--r-md); padding:8px; background:#fff; display:grid; place-items:center}
.wallet-head .qr canvas, .wallet-head .qr img{width:100%; height:100%; image-rendering:pixelated}
.wallet-bal{flex:1; min-width:12rem}
.wallet-bal .amt{font-size:1.9rem; font-weight:500; letter-spacing:-.01em;
  font-variant-numeric:tabular-nums;
  transition:opacity var(--dur-3)}
.wallet-bal .amt .cur{font-size:.9rem; color:var(--dim); font-weight:400;
  margin-inline-start:6px}
.wallet-bal .sub{color:var(--dim); font-size:var(--fs-sm); margin-top:2px}

/* ── .tbl / .rpt / .curve: the trading workbench's honest surfaces (V0.1.7 ③) ─ */
.tbl{width:100%; border-collapse:collapse; font-size:var(--fs-sm);
  font-variant-numeric:tabular-nums}
.tbl th{text-align:start; color:var(--dim); font-size:var(--fs-xs); font-weight:500;
  padding:3px 8px; border-bottom:1px solid var(--line)}
.tbl td{padding:6px 8px; border-bottom:1px solid var(--line)}
.tbl tr:last-child td{border-bottom:0}
.tbl .num{text-align:end}
.tbl .up{color:var(--ok)} .tbl .down{color:var(--bad)}
.rpt{white-space:pre-wrap; font-size:var(--fs-rd); line-height:1.85;
  word-break:break-word; font-family:var(--font-brand)}   /* the researcher's voice */
.curve{display:block; width:100%; height:110px; margin-top:12px}
.curve polyline{fill:none; stroke:var(--brand-ink); stroke-width:1.6}
.curve line.base{stroke:var(--line); stroke-width:1; stroke-dasharray:4 4}
.addr-line{display:flex; align-items:center; gap:8px; margin-top:10px; flex-wrap:wrap}
.addr-line code{background:var(--code); border-radius:7px; padding:5px 10px;
  font:12.5px var(--mono); word-break:break-all; user-select:all}
.netline{display:flex; gap:8px; align-items:center; flex-wrap:wrap; margin-top:14px;
  color:var(--dim); font-size:var(--fs-sm)}
.netline .opt{padding:0 10px; min-height:24px; font-size:var(--fs-xs)}
.pend{border-color:var(--warn)}
.pend .amt{font-weight:500}
.ritual{border-color:var(--brand)}
.ritual .words{display:grid; grid-template-columns:repeat(3,1fr); gap:6px 12px; margin:14px 0;
  font:14px/1.5 var(--mono); counter-reset:w}
.ritual .words span{counter-increment:w; padding:4px 8px; background:var(--code);
  border-radius:7px}
.ritual .words span::before{content:counter(w) " "; color:var(--dim); font-size:var(--fs-2xs)}
.ritual .keyhex{font:12.5px var(--mono); background:var(--code); border-radius:7px;
  padding:8px 10px; word-break:break-all; user-select:all; margin-top:8px}
@media (max-width:480px){ .ritual .words{grid-template-columns:repeat(2,1fr)} }

/* ═══ the narrow law (codex art. 6): ≤600px nothing is wider than its box ═ */
.card pre, .p-vpn pre{overflow-x:auto; max-width:100%}
.p-vpn table{display:block; width:100%; overflow-x:auto; max-width:100%}
.p-vpn td{word-break:break-word}
.card > table{display:block; overflow-x:auto; max-width:100%}
.row, .btns, .f .line, .tzline, .langline, .applybar, .wallet-head, .addr-line, .netline{min-width:0}
.row > *, .f .line > *, .tzline > *, .applybar > *{min-width:0}
@media (max-width:600px){
  .page{padding-inline:14px}
  .card{padding:12px 14px}
  .ev .tm{width:auto}
  .evt .t{width:5.6rem}
  .modal .m-acts{flex-direction:column-reverse}
  .modal .m-acts .btn{width:100%}
  .tzline input, .applybar input, .f .line input:not([type=time]):not([type=date]):not([type=number]){flex:1 1 10rem; width:auto}
  .p-vpn td:first-child{white-space:normal; width:auto}
  .kv{grid-template-columns:5.5rem 1fr}
  .pk-v{max-width:42%}
}

/* ═══ 书房 + 随手记 (V0.1.7 ⑤) ══════════════════════════════════════════ */
/* .capture — the ⌘J spark catcher: milliseconds to appear, Enter to keep */
.capture{position:fixed; inset:0; z-index:9500; background:var(--scrim);
  -webkit-backdrop-filter:blur(10px); backdrop-filter:blur(10px);
  display:grid; place-items:start center; padding-block-start:18vh;
  animation:fade var(--dur-1) var(--ease)}
.cap-box{width:min(34rem, calc(100vw - 32px)); background:var(--glass-bg); border:0;
  -webkit-backdrop-filter:var(--glass-blur); backdrop-filter:var(--glass-blur);
  border-radius:var(--r-2xl); box-shadow:var(--glass-rim), var(--shadow-pop); padding:16px 18px}
.cap-box textarea{width:100%; font:inherit; font-size:var(--fs-lg); line-height:1.6;
  border:0; outline:none; resize:none; background:none; color:var(--fg); padding:0;
  box-shadow:none; min-height:0}
.cap-box textarea:focus{box-shadow:none}
.cap-foot{display:flex; justify-content:space-between; color:var(--dim);
  font-size:var(--fs-xs); margin-top:6px}

/* ── .palette — ⌘K, the .capture's sibling (V0.1.8 ⑤) ───────────────────── */
.palette{position:fixed; inset:0; z-index:9600; background:var(--scrim);
  -webkit-backdrop-filter:blur(10px); backdrop-filter:blur(10px);
  display:grid; place-items:start center; padding-block-start:14vh;
  animation:fade var(--dur-1) var(--ease)}
.pal-box{width:min(38rem, calc(100vw - 32px)); background:var(--glass-bg); border:0;
  -webkit-backdrop-filter:var(--glass-blur); backdrop-filter:var(--glass-blur);
  border-radius:var(--r-2xl); box-shadow:var(--glass-rim), var(--shadow-pop);
  overflow:hidden; display:flex; flex-direction:column; max-height:72vh}
.pal-in{display:flex; align-items:center; gap:10px; padding:10px 14px; border-bottom:1px solid var(--line);
  color:var(--dim)}
.pal-in input{flex:1; border:0; background:none; box-shadow:none; padding:4px 0; min-height:0;
  font-size:var(--fs-lg); color:var(--fg)}
.pal-in input:focus{box-shadow:none}
.pal-res{overflow-y:auto; padding:6px; flex:1; min-height:3rem}
.pal-g{padding:10px 10px 3px; font-size:var(--fs-2xs); color:var(--dim); letter-spacing:.06em; user-select:none}
.pal-it{display:flex; align-items:center; gap:10px; padding:7px 12px; border-radius:var(--r-md);
  cursor:pointer; font-size:var(--fs-md); min-height:34px}
.pal-it [data-icon]{color:var(--dim); flex:none}
.pal-it .lb{white-space:nowrap; overflow:hidden; text-overflow:ellipsis; flex:none; max-width:60%}
.pal-it .sub{color:var(--dim); font-size:var(--fs-xs); margin-inline-start:auto; overflow:hidden;
  text-overflow:ellipsis; white-space:nowrap; min-width:0}
.pal-it.sel{background:var(--brand-soft)}
.pal-it.sel [data-icon]{color:var(--brand-ink)}
.pal-more{padding:4px 10px 8px; font-size:var(--fs-xs); color:var(--accent); cursor:pointer}
.pal-empty{padding:24px; text-align:center; color:var(--dim); font-size:var(--fs-md)}
.pal-foot{display:flex; justify-content:space-between; padding:7px 14px; border-top:1px solid var(--line);
  color:var(--dim); font-size:var(--fs-2xs)}

/* ── .modal-settings — one aligned settings window, desktop and phone ───── */
.modal.modal-settings{max-width:960px; width:calc(100vw - 40px); height:min(84vh, 740px); padding:0;
  display:grid; grid-template-columns:14rem minmax(0,1fr); overflow:hidden; border-radius:var(--r-2xl)}
.ms-nav{border-inline-end:1px solid var(--line); padding:14px 10px; display:flex; flex-direction:column;
  gap:2px; background:none; min-height:0}
.ms-search{padding:0 2px; margin-bottom:10px}
.ms-search input,.ms-phone-search input{width:100%; min-width:0; min-height:32px; margin:0; padding:4px 10px;
  font-size:var(--fs-sm)}
.ms-g{display:grid; grid-template-columns:20px minmax(0,1fr) auto; align-items:center; gap:9px;
  min-height:38px; padding:7px 12px; border-radius:var(--r-md); cursor:pointer;
  font-size:var(--fs-md); color:var(--fg); border:0; background:none; text-align:start; font:inherit; width:100%}
.ms-g:hover{background:var(--lift)}
.ms-g.on{background:var(--brand-soft); color:var(--brand-ink); font-weight:500}
.ms-g.dim{opacity:.45}
.ms-g[data-tier="2"]{color:var(--dim)}
.ms-g[data-tier="2"].on{color:var(--brand-ink)}
.ms-g.tier-start{margin-top:8px; padding-top:12px; border-top:1px solid var(--line); border-radius:0 0 var(--r-sm) var(--r-sm)}
.ms-g [data-icon]{color:var(--dim); width:20px; display:grid; place-items:center}
.ms-g [data-icon] svg{width:17px; height:17px}
.ms-g.on [data-icon]{color:var(--brand-ink)}
.ms-g .n{margin-inline-start:auto; font-size:var(--fs-2xs); color:var(--brand-ink);
  background:var(--brand-soft); border-radius:var(--r-pill); padding:0 7px}
.ms-page{margin-top:auto; color:var(--dim); font-size:var(--fs-xs); text-decoration:none; padding:8px 10px}
.ms-page:hover{color:var(--fg)}
.ms-close{position:absolute; top:14px; inset-inline-end:14px; z-index:4}
.ms-body{overflow-y:auto; padding:20px 58px 32px 24px; padding-inline-start:24px;
  padding-inline-end:58px; min-width:0; background:color-mix(in oklab, var(--surface) 55%, transparent)}
.ms-body h2{font-size:var(--fs-lg); font-weight:500; margin:0 0 14px; min-height:32px;
  display:flex; align-items:center}
.ms-body .card{animation:none; border-color:var(--line)}
.ms-body .sect{margin-top:18px}
.ms-body .feed{max-height:none}
.modal-settings input{margin-top:0}
/* the phone posture of settings: a full-height sheet, every group stacked (V0.1.9 ①) */
.modal-scrim.ms-sheet{align-items:flex-end; padding:0}
.modal.modal-settings.ms-phone{width:100%; max-width:none; height:calc(100dvh - 24px - env(safe-area-inset-top));
  border-radius:var(--r-2xl) var(--r-2xl) 0 0; grid-template-columns:1fr; grid-template-rows:auto 1fr;
  animation:sheetup var(--dur-2) var(--ease); background:color-mix(in oklab, var(--surface) 94%, transparent)}
.ms-phone .ms-nav{display:none}
.ms-head{padding:6px 16px 12px; padding-top:calc(6px + env(safe-area-inset-top))}
.ms-head .grab{width:38px; height:5px; border-radius:var(--r-pill); background:var(--line-2); margin:4px auto 10px}
.ms-phone-title{min-height:36px; display:flex; align-items:center; padding-inline-end:44px}
.ms-head b{font-size:var(--fs-h); font-weight:500}
.ms-phone-search{margin-top:8px}
.ms-phone .ms-close{top:calc(17px + env(safe-area-inset-top)); inset-inline-end:16px}
.ms-phone .ms-body{padding:12px 16px calc(28px + env(safe-area-inset-bottom)); background:none}
.ms-phone .ms-body .sect{margin-top:20px}
.hit{box-shadow:var(--focus); border-radius:var(--r-sm)}
.sect.hit{box-shadow:none; color:var(--brand-ink)}

/* the journal timeline */
.jbar{display:flex; gap:8px; margin-top:14px}
.jbar input{flex:1; min-width:0}
.timeline{margin-top:10px}
.tl-day{color:var(--dim); font-size:var(--fs-xs); letter-spacing:.08em;
  margin:22px 0 6px; font-variant-numeric:tabular-nums}
.tl-item{display:flex; gap:12px; padding:8px 0; border-inline-start:1px solid var(--line-2);
  padding-inline-start:14px; margin-inline-start:4px}
.tl-t{flex:none; color:var(--dim); font-size:var(--fs-xs); width:2.8rem;
  font-variant-numeric:tabular-nums; padding-top:2px}
.tl-body{flex:1; min-width:0}
.tl-text{font-size:var(--fs-rd); line-height:1.75; white-space:pre-wrap;
  overflow-wrap:break-word}
.tl-meta{display:flex; gap:12px; margin-top:2px; font-size:var(--fs-xs); color:var(--dim)}
.tl-meta a{cursor:pointer; color:var(--dim)}
.tl-meta a:hover{color:var(--fg)}
.tl-meta a.danger:hover{color:var(--bad)}

/* the library shelf */
.shelf{display:grid; grid-template-columns:repeat(auto-fill, minmax(9rem, 1fr));
  gap:14px; margin-top:16px}
.spine{border:0; background:none; font:inherit; cursor:pointer; text-align:start;
  padding:0; color:var(--fg)}
.sp-cover{display:grid; place-items:center; position:relative; aspect-ratio:5/7;
  border-radius:var(--r-sm); background:linear-gradient(160deg, var(--surface-2), var(--code));
  box-shadow:var(--shadow-1); overflow:hidden;
  transition:transform var(--dur-1)}
.spine:hover .sp-cover{transform:translateY(-3px)}
.sp-cover img{position:absolute; inset:0; width:100%; height:100%; object-fit:cover}
.sp-title{padding:12px; font-size:var(--fs-h); font-weight:500; line-height:1.5;
  text-align:center; word-break:break-word}
.sp-title.over{position:absolute; inset-inline:0; bottom:0; background:var(--scrim);
  color:#fff; font-size:var(--fs-xs); padding:6px 8px; text-align:start}
.sp-meta{display:block; color:var(--dim); font-size:var(--fs-xs); margin-top:6px}

/* the record player bar */
.player{position:fixed; inset-inline-end:var(--float-end); bottom:16px; z-index:8900;
  display:flex; align-items:center; gap:10px;
  background:var(--glass-bg); -webkit-backdrop-filter:var(--glass-blur); backdrop-filter:var(--glass-blur);
  border:0; border-radius:var(--r-pill);
  box-shadow:var(--glass-rim), var(--shadow-pop); padding:8px 14px;
  width:min(36rem, calc(100vw - var(--dock-w) - 32px))}
/* a folded dock parks its unfold button in the end corner: wide floats step above it */
html.hoop-folded .player, html.hoop-folded .mw-compose{bottom:68px}
.pl-name{flex:none; max-width:10rem; overflow:hidden; text-overflow:ellipsis;
  white-space:nowrap; font-size:var(--fs-sm)}
.player input[type=range]{flex:1; min-width:3rem; accent-color:var(--brand)}
.player #pl-vol{flex:none; width:4.5rem}
.ent.playing{background:var(--brand-soft)}
.ent.playing .ic{color:var(--brand-ink)}

/* the reader: a T3 stage over the OS; .night = lamplight */
.reader{position:fixed; inset:0; z-index:9400; background:#FBF7EC; color:#1C1A14;
  display:flex; flex-direction:column}
.reader.night{background:#15140F; color:#D9D6CB}
.rd-head,.rd-foot{flex:none; display:flex; align-items:center; gap:10px;
  padding:10px 16px}
.rd-head b{flex:1; text-align:center; overflow:hidden; text-overflow:ellipsis;
  white-space:nowrap; font-size:var(--fs-h)}
.rd-tools{display:flex; gap:2px}
.rd-foot{justify-content:center}
.reader .btn{color:inherit; opacity:.75}
.reader .btn:hover{opacity:1}
#rd-stage{flex:1; min-height:0; overflow-y:auto; position:relative}
.rd-pdf{border:0; width:100%; height:100%}
.rd-col{max-width:34rem; margin:0 auto; padding:24px 18px 12vh; line-height:1.9;
  font-size:17px; font-family:var(--font-brand)}
html.hoop-reading #hooprail{display:none}
@media (max-width:720px){
  .player{width:calc(100vw - 76px); inset-inline-end:12px; bottom:calc(16px + env(safe-area-inset-bottom))}
  .player #pl-vol{display:none}
}

/* ═══ codex art. 7, last word: on a phone every text input is 16px (iOS zooms on less) ═ */
@media (max-width:720px){
  input, select, textarea, #inp, .cap-box textarea, .pal-in input, #ms-q, .citem .ct input, #ctitle input,
  .bud input, .f textarea, .modal input{font-size:16px}
}
@media (hover:none){ .citem .cm{min-width:30px; min-height:30px; opacity:.6} }

/* ═══ V0.2.3 C1 — THE WINDOW CHROME (codex art. 10) ═══════════════════════════
   One .win-chrome for every window and every App page, drawn by hoop-ui.js /
   nav.js only. The three lights sit on the PHYSICAL left in every locale — the
   single sanctioned non-logical position in this file (macOS keeps them there in
   Arabic too; muscle memory beats mirroring). Everything else stays logical. */
:root{--tl-close:#FF5F57; --tl-min:#FEBC2E; --tl-max:#28C840;
  --tl-idle:color-mix(in oklab, var(--fg) 18%, transparent); --tl-ink:rgba(0,0,0,.55);
  --shadow-tl:inset 0 0 0 .5px rgba(0,0,0,.12);
  --shadow-win-focus:0 0 0 1px color-mix(in oklab, var(--brand) 35%, transparent);
  --win-h:44px}
.win-chrome{height:var(--win-h); flex:none; display:flex; align-items:center; gap:8px; padding:0 10px;
  position:relative; user-select:none;
  touch-action:none}
.win-chrome .tl{position:absolute; left:12px; top:50%; transform:translateY(-50%); display:flex; gap:8px;
  direction:ltr}  /* art. 10: physical left, always */
.win-chrome .tl-b{width:12px; height:12px; border-radius:50%; border:0; padding:0; cursor:pointer; display:grid;
  place-items:center; color:var(--tl-ink); box-shadow:var(--shadow-tl); transition:filter var(--dur-1)}
.win-chrome .tl-close{background:var(--tl-close)} .win-chrome .tl-min{background:var(--tl-min)} .win-chrome .tl-zoom{background:var(--tl-max)}
.win-chrome .tl-b:disabled{background:var(--tl-idle); cursor:default}
.win-chrome .tl-b svg{width:8px; height:8px; opacity:0; stroke-width:2.2; transition:opacity var(--dur-1)}
.win-chrome .tl:hover .tl-b:not(:disabled) svg, .win-chrome .tl-b:focus-visible svg{opacity:1}
.win-chrome .tl-b:focus-visible{outline:none; box-shadow:var(--focus)}
.win-chrome .tl-b:active{filter:brightness(.85)}
.win.idle .win-chrome .tl-b, .win:not(.focused) .win-chrome .tl-b{background:var(--tl-idle)}
.win-chrome .wc-c{margin:0 auto; display:flex; align-items:center; gap:7px; min-width:0; padding:0 76px}
.win-chrome .wc-i{width:17px; height:17px; color:var(--brand-ink); flex:none}
.win-chrome .wc-t{flex:0 1 auto; min-width:0; margin:0; padding:0; border:0; font-size:var(--fs-sm); font-weight:500; color:var(--fg);
  font-family:var(--font-ui); line-height:1.2; overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
.win-chrome .wc-t[role="button"]{cursor:pointer}
.win-chrome .wc-r{position:absolute; inset-inline-end:10px; top:50%; transform:translateY(-50%); display:flex; gap:2px}
.win-chrome .wc-r .hbtn{position:static; width:30px; height:30px}
/* the page posture: the same bar, glass, pinned on top, content flows beneath (art. 7) */
.win-chrome.page{position:fixed; top:0; inset-inline:0; z-index:40}
html.hoop-chrome body{padding-top:var(--win-h)}
html.hoop-chrome.hoop-rail body{padding-top:var(--win-h)}
@media (max-width:720px){.win-chrome .tl-min, .win-chrome .tl-zoom{display:none} .win-chrome.page{display:none} html.hoop-chrome body{padding-top:0}}

/* free windows (≥900px): a layer of .win boxes, no scrim, z-order by focus */
#hoop-windows{position:fixed; inset:0; inset-inline-end:var(--dock-w); z-index:900; pointer-events:none}
.win{position:absolute; pointer-events:auto; display:flex; flex-direction:column; overflow:hidden;
  background:var(--surface); border-radius:var(--r-lg); box-shadow:var(--glass-rim), var(--shadow-pop);
  min-width:320px; min-height:220px; outline:none; animation:var(--rise)}
.win.focused{box-shadow:var(--glass-rim), var(--shadow-win-focus), var(--shadow-pop)}
.win.min{display:none}
.win.dragging iframe{pointer-events:none}
.win .win-body{flex:1; min-height:0; width:100%; border:0; background:var(--bg)}
.win-resize{position:absolute; inset-inline-end:0; bottom:0; width:18px; height:18px; cursor:nwse-resize; touch-action:none}
[dir="rtl"] .win-resize{cursor:nesw-resize}
.modal-appwindow .win-chrome{cursor:default}
/* the tray: minimized windows wait as capsules at the foot of the dock column */
#dock-tray{position:fixed; inset-inline-end:10px; bottom:60px; z-index:9989; display:flex; flex-direction:column; gap:4px;
  padding:6px; border-radius:var(--r-lg); box-shadow:var(--glass-rim), var(--shadow-pop); max-width:13rem}
.tray-cap{display:flex; align-items:center; gap:8px; border:0; background:none; color:var(--fg); font:inherit;
  font-size:var(--fs-sm); padding:6px 10px 6px 8px; border-radius:var(--r-pill); cursor:pointer; max-width:100%; min-height:30px}
.tray-cap:hover{background:var(--lift)}
.tray-cap [data-icon]{width:16px; height:16px; color:var(--brand-ink); flex:none}
.tray-t{overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
@media (max-width:720px){#dock-tray{inset-inline-end:auto; left:50%; transform:translateX(-50%); bottom:calc(80px + env(safe-area-inset-bottom)); flex-direction:row; max-width:calc(100vw - 32px)}}

/* ═══ V0.2.3 C2 — THE LOCK SCREEN (T3: clock · date · name · hint · card) ═════ */
:root{--fs-display:clamp(4.5rem, 14vw, 9rem)}
.p-home .lock{min-height:100dvh; display:flex; flex-direction:column; align-items:center; justify-content:center;
  text-align:center; padding:40px 24px; cursor:default; position:relative; overflow:hidden;
  background:radial-gradient(120% 80% at 50% 0%, color-mix(in oklab, var(--brand) 10%, var(--bg)) 0%, var(--bg) 55%)}
.p-home .lock-clock{font-family:var(--font-brand); font-size:var(--fs-display); font-weight:400; line-height:1; letter-spacing:-.03em;
  font-variant-numeric:tabular-nums; color:var(--fg)}
.p-home .lock-date{margin-top:10px; font-size:var(--fs-lg); color:var(--dim)}
.p-home .lock-name{margin-top:28px; display:flex; align-items:center; gap:10px; font-family:var(--font-brand); font-size:var(--fs-xl); color:var(--fg)}
.p-home .lock-name img{width:.55em; height:.55em; animation:breathe 3.2s ease-in-out infinite}
.p-home .lock-ava{width:64px; height:64px; border-radius:50%; overflow:hidden; background:var(--surface-2); display:grid; place-items:center;
  font-family:var(--font-brand); font-size:var(--fs-2xl); color:var(--brand-ink); margin-top:28px}
.p-home .lock-ava img{width:100%; height:100%; object-fit:cover}
.p-home .lock-hint{position:absolute; bottom:40px; inset-inline:0; color:var(--dim); font-size:var(--fs-sm); opacity:.8; animation:lockhint 4s ease-in-out infinite}
@keyframes lockhint{0%,100%{opacity:.35}50%{opacity:.85}}
.p-home .lock.ready .lock-hint{display:none}
.p-home .lock-card{position:absolute; inset:0; display:flex; align-items:flex-end; justify-content:center; padding:20px 20px 12vh;
  background:color-mix(in oklab, var(--bg) 25%, transparent); -webkit-backdrop-filter:blur(6px); backdrop-filter:blur(6px);
  animation:fade var(--dur-2) ease-out}
.p-home .lock.ready .lock-clock{font-size:calc(var(--fs-display) * .6)}
.p-home .lock.ready .lock-clock, .p-home .lock.ready .lock-date, .p-home .lock.ready .lock-name{transform:translateY(-16vh)}
.p-home .lock-clock, .p-home .lock-date, .p-home .lock-name{transition:transform var(--dur-3) var(--ease), font-size var(--dur-3) var(--ease)}
.p-home .lock-name img{min-width:22px; min-height:22px}
.p-home .lock-card form{width:min(22rem, 100%); padding:26px 24px 20px; border-radius:var(--r-2xl); display:flex; flex-direction:column; gap:10px;
  box-shadow:var(--glass-rim), var(--shadow-pop); animation:var(--rise)}
.p-home .lock-card h2{margin:0 0 6px; font-size:var(--fs-lg); font-weight:500; text-align:center}
.p-home .lock-card input{width:100%}
.p-home .lock-card .btn{margin-top:6px}
.p-home .lock-err{min-height:1.2em; color:var(--bad); font-size:var(--fs-sm); text-align:center}
.p-home .lock-card .fine{color:var(--dim); font-size:var(--fs-xs); text-align:center; margin-top:4px}
@media (prefers-reduced-transparency:reduce){.p-home .lock-card{-webkit-backdrop-filter:none; backdrop-filter:none; background:var(--bg)}}
@media (prefers-reduced-motion:reduce){.p-home .lock-name img, .p-home .lock-hint, .p-home .lock-card, .p-home .lock-card form{animation:none}}
html.hoop-idle .p-home .lock-name img{animation-play-state:paused}

/* ═══ V0.2.3 C5 — THE DESKTOP (Home ≥900px): menu bar on top, widgets below ═══ */
.p-home .menubar{position:fixed; top:0; inset-inline:0; height:30px; z-index:950; display:none; align-items:center; gap:6px;
  padding:0 12px; font-size:var(--fs-sm); color:var(--fg)}
@media (min-width:900px){.p-home.desktop .menubar{display:flex} .p-home.desktop .pa-home{padding-top:clamp(56px,7vw,88px)}}
.p-home .mb-b{border:0; background:none; font:inherit; font-size:var(--fs-sm); color:var(--fg); padding:3px 9px; border-radius:var(--r-sm);
  cursor:pointer; display:inline-flex; align-items:center; gap:6px; min-height:24px}
.p-home .mb-b:hover, .p-home .mb-b.on{background:var(--lift)}
.p-home .mb-brand{font-family:var(--font-wordmark); font-size:var(--fs-md); letter-spacing:.01em}
.p-home .mb-app{font-weight:500}
.p-home .mb-sp{flex:1}
.p-home .mb-s{display:inline-flex; align-items:center; gap:5px; color:var(--dim); padding:3px 7px; border-radius:var(--r-sm); cursor:default}
.p-home .mb-s [data-icon]{width:15px; height:15px}
.p-home .mb-s.ok{color:var(--fg)} .p-home .mb-s.warn{color:var(--warn)}
.p-home .mb-clock{font-variant-numeric:tabular-nums; color:var(--fg); padding:3px 4px 3px 8px}

/* ═══ V0.2.3 C4 — SYSTEM SETTINGS additions ═══════════════════════════════════ */
html.hoop-reduce-motion *, html.hoop-reduce-motion *::before, html.hoop-reduce-motion *::after{animation:none!important; transition:none!important}
html.hoop-reduce-transparency .glass, html.hoop-reduce-transparency .bar-glass, html.hoop-reduce-transparency .modal, html.hoop-reduce-transparency .menu,
html.hoop-reduce-transparency .toast, html.hoop-reduce-transparency #dock-tray{
  background:var(--surface); -webkit-backdrop-filter:none; backdrop-filter:none}
.about-mark{display:flex; align-items:center; gap:14px; margin-bottom:12px}
.about-mark img{width:44px; height:44px}
.about-mark b{display:block; font-weight:500; font-size:var(--fs-lg); font-family:var(--font-brand)}
.kv .k.kbd{font-family:var(--mono); font-size:var(--fs-sm)}
.wall-upload{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:12px 0 4px}.wall-upload .btn{display:inline-flex;align-items:center;gap:7px}.wall-upload [data-icon]{width:17px;height:17px}
html[data-wall="plain"] .p-home .lock{background:var(--bg)}
html[data-wall="ink"] .p-home .lock{background:radial-gradient(120% 80% at 50% 0%, color-mix(in oklab, var(--fg) 12%, var(--bg)) 0%, var(--bg) 60%)}

/* ═══ V0.2.3 D — the Linux pod App (p-linux) ══════════════════════════════════ */
.p-linux main{max-width:78rem}
.lx-bar{display:flex; align-items:center; gap:8px; margin:12px 0 10px}
.lx-sp{flex:1}
.lx-state{display:inline-flex; align-items:center; gap:8px; color:var(--dim); font-size:var(--fs-sm)}
.lx-dot{width:8px; height:8px; border-radius:50%; background:var(--line-2)}
.lx-state.on .lx-dot{background:var(--ok)} .lx-state.busy .lx-dot{background:var(--brand); animation:breathe 1.6s ease-in-out infinite}
.lx-stage{position:relative; min-height:24rem}
.lx-empty{position:absolute; inset:0; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:10px; color:var(--dim); text-align:center; padding:24px}
.lx-empty [data-icon]{width:40px; height:40px}
.lx-empty p{max-width:30rem; margin:0; font-size:var(--fs-md)}
.lx-apps{display:flex; flex-wrap:wrap; gap:6px}
.lx-row{display:flex; align-items:center; gap:10px; padding:8px 0; border-bottom:1px solid var(--line)}
.lx-row:last-child{border-bottom:0}
.lx-row b{flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-weight:500; font-size:var(--fs-md)}
html.hoop-embedded .p-linux main{max-width:none; padding:10px 12px}
html.hoop-embedded .p-linux h1.app, html.hoop-embedded .p-linux .lede{display:none}
