dsh-skin-mistblue 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/client.js +92 -108
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -11,7 +11,7 @@ window.__ModuleLoader__.load({
|
|
|
11
11
|
var useState = React.useState
|
|
12
12
|
var useEffect = React.useEffect
|
|
13
13
|
|
|
14
|
-
var CSS = "\n/* ===== 00-foundation.css ===== */\n/* ============================================================================\n dsh-skin-mistblue · 00 foundation + glass engine\n DeepSeek-web visual language on top of the DSH `--dsw-*` token system.\n\n Glass engine ported from wallpaper-engine's 5-layer recipe (see\n docs/GLASS-SPEC.md):\n ① fill (token) ② top specular sheen ③ backdrop-filter frost\n ④ inset bevel + hairline ⑤ soft outer elevation\n Fill maths (color-mix, premultiplied):\n effAlpha = floor + a * (1 - floor) floor = theme readability floor\n\n Tiers:\n L1 content surfaces · light fill, small frost\n L2 cards / bubbles · medium fill + frost (readability uplift)\n L3 popups / details · strong fill + strong frost (readability uplift)\n ========================================================================== */\n\nhtml[data-dsg='on'] {\n /* ---- engine sources (shared) ------------------------------------------ */\n --dsg-sat: 1.3;\n --dsg-bright: 1.04;\n --dsg-contrast: 1.01;\n --dsg-fidelity: 0.55;\n --dsg-floor-base-light: 0.45;\n --dsg-floor-base-dark: 0.59;\n --dsg-floor: calc(var(--dsg-floor-base-light) * var(--dsg-fidelity));\n\n --dsg-a1: 0.06;\n --dsg-a2: 0.20;\n --dsg-a3: 0.72;\n\n /* blur ladder: wallpaper-engine's 8px anchor, then readability uplift for\n cards and popups (user requirement: more frost on cards/popups/details). */\n --dsg-blur-l1: calc(6px * var(--dsg-blur, 1));\n --dsg-blur-l2: calc(16px * var(--dsg-blur, 1));\n --dsg-blur-l3: calc(24px * var(--dsg-blur, 1));\n /* Large-area surfaces: dialogs/settings are expensive to re-blur; menus are\n small but read better with a slightly softer frost. */\n --dsg-blur-dialog: calc(12px * var(--dsg-blur, 1));\n --dsg-blur-l3-dialog: var(--dsg-blur-dialog);\n --dsg-blur-menu: calc(20px * var(--dsg-blur, 1));\n\n --dsg-motion: 1;\n\n --dsg-radius-card: 20px;\n --dsg-radius-modal: 24px;\n --dsg-radius-composer: 28px;\n --dsg-motion-dur: calc(180ms * var(--dsg-motion));\n --dsg-ease: cubic-bezier(0.22, 0.61, 0.36, 1);\n\n --dsg-blue: #4d6bfe;\n --dsg-blue-strong: #3556f0;\n --dsg-blue-soft: rgba(77, 107, 254, 0.12);\n --dsg-blue-ring: rgba(77, 107, 254, 0.45);\n\n /* document preview paper: fully opaque, never lets chat text show through */\n --dsg-doc-paper: #ffffff;\n}\n\n/* ---- atmosphere ---------------------------------------------------------- */\n/* Static layered mist from docs/DESIGN-SPEC §6.1 (measured from deepseek.com),\n plus three very faint drifting light pools for depth. */\nhtml[data-dsg='on'] body {\n background-color: transparent !important;\n}\nhtml[data-dsg='on'] .dsg-atmosphere {\n position: fixed;\n inset: 0;\n z-index: -1;\n pointer-events: none;\n overflow: hidden;\n background-color: #f4f7fc;\n background-image:\n radial-gradient(120% 62% at 50% -14%, rgba(255, 255, 255, 0.97) 0%, rgba(255, 255, 255, 0.55) 42%, rgba(255, 255, 255, 0) 68%),\n radial-gradient(46% 40% at 71% 1%, rgba(120, 152, 219, 0.58) 0%, rgba(120, 152, 219, 0.2) 55%, rgba(120, 152, 219, 0) 78%),\n radial-gradient(40% 42% at 28% 50%, rgba(146, 178, 230, 0.55) 0%, rgba(146, 178, 230, 0.22) 58%, rgba(146, 178, 230, 0) 82%),\n radial-gradient(52% 46% at 100% 62%, rgba(196, 213, 238, 0.4) 0%, rgba(196, 213, 238, 0) 72%),\n radial-gradient(100% 46% at 50% 112%, rgba(248, 247, 248, 0.98) 0%, rgba(248, 247, 248, 0.7) 40%, rgba(248, 247, 248, 0) 70%),\n linear-gradient(178deg, #fbfcfe 0%, #eef4fb 24%, #e3ecf7 46%, #dfe9f6 58%, #e9eff7 74%, #f4f4f5 90%, #f8f7f8 100%);\n background-repeat: no-repeat;\n}\nhtml[data-dsg='on'] .dsg-atmosphere .dsg-aurora {\n position: absolute;\n display: block;\n border-radius: 50%;\n filter: blur(90px);\n opacity: 0.5;\n will-change: transform;\n animation: dsg-drift 34s ease-in-out infinite alternate;\n}\nhtml[data-dsg='on'] .dsg-atmosphere .dsg-aurora-a {\n width: 46vw; height: 38vw; left: -10vw; top: -12vw;\n background: radial-gradient(circle at 40% 40%, rgba(255, 255, 255, 0.7), rgba(255, 255, 255, 0) 70%);\n}\nhtml[data-dsg='on'] .dsg-atmosphere .dsg-aurora-b {\n width: 40vw; height: 34vw; right: -10vw; top: 6vh;\n background: radial-gradient(circle at 50% 50%, rgba(255, 255, 255, 0.45), rgba(255, 255, 255, 0) 72%);\n animation-delay: -12s; animation-duration: 42s;\n}\nhtml[data-dsg='on'] .dsg-atmosphere .dsg-aurora-c {\n width: 56vw; height: 30vw; left: 22vw; bottom: -18vw;\n background: radial-gradient(circle at 50% 50%, rgba(255, 255, 255, 0.5), rgba(255, 255, 255, 0) 72%);\n animation-delay: -20s; animation-duration: 48s;\n}\nhtml[data-dsg='on'] .dsg-atmosphere .dsg-grid {\n position: absolute; inset: 0;\n background-image:\n linear-gradient(to right, rgba(59, 91, 148, 0.045) 1px, transparent 1px),\n linear-gradient(to bottom, rgba(59, 91, 148, 0.045) 1px, transparent 1px);\n background-size: 75px 75px;\n background-position: 56px 56px;\n -webkit-mask-image: radial-gradient(120% 95% at 50% 32%, #000 30%, transparent 82%);\n mask-image: radial-gradient(120% 95% at 50% 32%, #000 30%, transparent 82%);\n}\nhtml[data-dsg='on'] .dsg-atmosphere .dsg-grain {\n position: absolute; inset: 0; opacity: 0.12; mix-blend-mode: soft-light;\n background-image: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/><feColorMatrix type='saturate' values='0'/></filter><rect width='100%25' height='100%25' filter='url(%23n)' opacity='0.5'/></svg>\");\n}\n@keyframes dsg-drift {\n from { transform: translate3d(0, 0, 0) scale(1); }\n to { transform: translate3d(1.4vw, -1vh, 0) scale(1.03); }\n}\nhtml[data-dsg-atmosphere='mist'] .dsg-atmosphere .dsg-aurora { opacity: 0.25; }\nhtml[data-dsg-atmosphere='off'] .dsg-atmosphere { display: none; }\n\n/* Dark palette atmosphere */\nhtml[data-dsg='on'] body[data-ds-dark-theme] .dsg-atmosphere {\n background-color: #0a1020;\n background-image:\n radial-gradient(120% 64% at 50% -14%, rgba(88, 122, 200, 0.34) 0%, rgba(10, 14, 26, 0) 64%),\n radial-gradient(46% 40% at 72% 2%, rgba(77, 107, 254, 0.28) 0%, rgba(77, 107, 254, 0) 76%),\n radial-gradient(42% 44% at 24% 54%, rgba(90, 130, 255, 0.16) 0%, rgba(90, 130, 255, 0) 78%),\n radial-gradient(52% 46% at 100% 62%, rgba(120, 90, 255, 0.12) 0%, rgba(120, 90, 255, 0) 74%),\n linear-gradient(178deg, #0c1322 0%, #0b1426 34%, #0a111f 62%, #0c1524 100%);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] .dsg-atmosphere .dsg-aurora { opacity: 0.22; }\nhtml[data-dsg='on'] body[data-ds-dark-theme] .dsg-atmosphere .dsg-aurora-a {\n background: radial-gradient(circle at 40% 40%, rgba(77, 107, 254, 0.45), rgba(77, 107, 254, 0) 68%);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] .dsg-atmosphere .dsg-aurora-b {\n background: radial-gradient(circle at 50% 50%, rgba(90, 130, 255, 0.3), rgba(90, 130, 255, 0) 70%);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] .dsg-atmosphere .dsg-aurora-c {\n background: radial-gradient(circle at 50% 50%, rgba(120, 90, 255, 0.24), rgba(120, 90, 255, 0) 72%);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] .dsg-atmosphere .dsg-grid {\n background-image:\n linear-gradient(to right, rgba(150, 180, 255, 0.045) 1px, transparent 1px),\n linear-gradient(to bottom, rgba(150, 180, 255, 0.045) 1px, transparent 1px);\n}\n\n/* ---- glass engine · light ------------------------------------------------ */\nhtml[data-dsg='on'] body {\n --dsg-tint: #ffffff;\n --dsg-tint-rgb: 255 255 255;\n\n /* three tier fills: effAlpha = floor + a * (1 - floor) */\n --dsg-fill-l1: color-mix(in srgb,\n var(--dsg-tint) calc(var(--dsg-floor) * 100%),\n color-mix(in srgb, var(--dsg-tint) calc(var(--dsg-a1) * 100%), transparent) calc((1 - var(--dsg-floor)) * 100%));\n --dsg-fill-l2: color-mix(in srgb,\n var(--dsg-tint) calc(var(--dsg-floor) * 100%),\n color-mix(in srgb, var(--dsg-tint) calc(var(--dsg-a2) * 100%), transparent) calc((1 - var(--dsg-floor)) * 100%));\n --dsg-fill-l3: color-mix(in srgb,\n var(--dsg-tint) calc(var(--dsg-floor-base-light) * 100%),\n color-mix(in srgb, var(--dsg-tint) calc(var(--dsg-a3) * 100%), transparent) calc((1 - var(--dsg-floor-base-light)) * 100%));\n\n /* frost */\n --dsg-backdrop-l1: blur(var(--dsg-blur-l1)) saturate(var(--dsg-sat)) brightness(var(--dsg-bright)) contrast(var(--dsg-contrast));\n --dsg-backdrop-l2: blur(var(--dsg-blur-l2)) saturate(var(--dsg-sat)) brightness(var(--dsg-bright)) contrast(var(--dsg-contrast));\n --dsg-backdrop-l3: blur(var(--dsg-blur-l3)) saturate(var(--dsg-sat)) brightness(var(--dsg-bright)) contrast(var(--dsg-contrast));\n --dsg-backdrop-l3-dialog: blur(var(--dsg-blur-dialog)) saturate(var(--dsg-sat)) brightness(var(--dsg-bright)) contrast(var(--dsg-contrast));\n --dsg-backdrop-dialog: blur(var(--dsg-blur-dialog)) saturate(var(--dsg-sat)) brightness(var(--dsg-bright)) contrast(var(--dsg-contrast));\n --dsg-backdrop-menu: blur(var(--dsg-blur-menu)) saturate(1.4);\n --dsg-backdrop-panel: blur(calc(10px * var(--dsg-blur, 1))) saturate(1.2) brightness(var(--dsg-bright));\n\n /* specular sheen */\n --dsg-sheen-l1: linear-gradient(180deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.03) 38%, rgba(255, 255, 255, 0.02));\n --dsg-sheen-l2: linear-gradient(180deg, rgba(255, 255, 255, 0.18), rgba(255, 255, 255, 0.05) 38%, rgba(255, 255, 255, 0.02));\n --dsg-sheen-l3: linear-gradient(180deg, rgba(255, 255, 255, 0.14), rgba(255, 255, 255, 0.05) 38%, rgba(255, 255, 255, 0.03));\n\n /* bevel + elevation */\n --dsg-bevel-l1:\n inset 0 1px 0 rgba(255, 255, 255, 0.45),\n inset 0 -1px 0 rgba(255, 255, 255, 0.08),\n inset 0 0 0 0.5px rgba(255, 255, 255, 0.16),\n 0 8px 26px rgba(44, 74, 140, 0.08);\n --dsg-bevel-l2:\n inset 0 1px 0 rgba(255, 255, 255, 0.6),\n inset 0 -1px 0 rgba(255, 255, 255, 0.1),\n inset 0 0 0 0.5px rgba(255, 255, 255, 0.22),\n 0 14px 44px rgba(44, 74, 140, 0.12);\n --dsg-bevel-l3:\n inset 0 1px 0 rgba(255, 255, 255, 0.7),\n inset 0 0 0 1px rgba(255, 255, 255, 0.28),\n 0 24px 80px rgba(23, 48, 108, 0.2);\n\n --dsg-border-hair: rgba(56, 88, 158, 0.14);\n\n /* ---- consume engine into DSH tokens ---------------------------------- */\n --dsw-alias-bg-base: transparent;\n --dsw-alias-bg-layer-1: var(--dsg-fill-l1);\n --dsw-alias-bg-layer-2: var(--dsg-fill-l2);\n --dsw-alias-bg-layer-3: var(--dsg-fill-l3);\n --dsw-alias-bg-overlay: var(--dsg-fill-l3);\n --dsw-alias-bg-module-platform: var(--dsg-fill-l1);\n --dsw-alias-bg-multi-select: var(--dsg-fill-l1);\n /* document preview / pdf paper: host uses this for the preview page body —\n opaque so dense text never blends with the conversation behind it. */\n --dsw-alias-bg-document-preview: var(--dsg-doc-paper);\n\n --dsw-specific-sidebar-fill: var(--dsg-fill-l1);\n --dsw-specific-input-major: var(--dsg-fill-l2);\n --dsw-specific-bubble: var(--dsg-fill-l2);\n --dsw-specific-menu: color-mix(in srgb, #ffffff 82%, transparent);\n --dsw-menu-surface-fill: color-mix(in srgb, #ffffff 82%, transparent);\n --dsw-alias-menu-group-header-fill: rgba(250, 252, 255, 0.94);\n --dsw-specific-selector: var(--dsg-fill-l2);\n --dsw-specific-tip: var(--dsg-fill-l2);\n --dsw-specific-sidebar-nav-item-active: var(--dsg-fill-l2);\n --dsw-specific-sidebar-nav-item-hover: rgba(77, 107, 254, 0.07);\n --dsw-specific-sidebar-nav-item-active-accent: var(--dsg-blue-soft);\n\n /* borders: blue-grey hairlines */\n --dsw-alias-border-l1: rgba(56, 88, 158, 0.1);\n --dsw-alias-border-l2: rgba(56, 88, 158, 0.16);\n --dsw-alias-border-l3: rgba(56, 88, 158, 0.2);\n --dsw-alias-border-l4: rgba(56, 88, 158, 0.26);\n --dsw-elevation-stroke-color: rgba(56, 88, 158, 0.18);\n\n /* DeepSeek blue interaction states */\n --dsw-alias-state-business-primary: var(--dsg-blue);\n --dsw-alias-link: var(--dsg-blue);\n --dsw-alias-brand-primary-new-colorprimary-new-color: var(--dsg-blue);\n --dsw-alias-interactive-bg-hover: rgba(77, 107, 254, 0.07);\n --dsw-alias-interactive-bg-active: rgba(77, 107, 254, 0.12);\n --dsw-alias-interactive-bg-hover-accent: var(--dsg-blue-soft);\n --dsw-alias-state-business-tertiary: rgba(77, 107, 254, 0.1);\n\n /* content surfaces */\n --dsw-alias-markdown-code-block: var(--dsg-fill-l1);\n --dsw-alias-markdown-code-block-banner: var(--dsg-fill-l2);\n --dsw-alias-markdown-inline-code: rgba(77, 107, 254, 0.08);\n --dsw-alias-markdown-citation: var(--dsg-fill-l1);\n --dsw-alias-markdown-tag: rgba(77, 107, 254, 0.08);\n --dsw-alias-turn-trigger-bg: var(--dsg-fill-l1);\n --dsw-alias-turn-trigger-bg-hover: var(--dsg-fill-l2);\n --dsw-alias-settings-card-fill: var(--dsg-fill-l2);\n --dsw-alias-settings-card-stroke: rgba(56, 88, 158, 0.16);\n\n /* host frosted channels */\n --dsw-menu-backdrop-filter: blur(calc(24px * var(--dsg-blur, 1))) saturate(1.4);\n --dsw-mask-blur: blur(calc(14px * var(--dsg-blur, 1))) saturate(1.2);\n\n /* elevation: diffuse blue-tinted daylight */\n --dsw-shadow-lv1: 0 2px 6px rgba(44, 74, 140, 0.06);\n --dsw-shadow-lv2: 0 6px 18px rgba(44, 74, 140, 0.08);\n --dsw-shadow-lv3: 0 18px 48px rgba(44, 74, 140, 0.12);\n --dsw-elevation-panel: var(--dsw-elevation-stroke), 0 6px 20px rgba(44, 74, 140, 0.08), 0 0 24px rgba(44, 74, 140, 0.04);\n --dsw-elevation-prominent: var(--dsw-elevation-stroke), 0 10px 34px rgba(44, 74, 140, 0.12), 0 0 30px rgba(44, 74, 140, 0.06);\n --dsw-elevation-soft: var(--dsw-elevation-stroke), 0 8px 28px rgba(44, 74, 140, 0.08), 0 0 28px rgba(44, 74, 140, 0.05);\n\n /* ink: deeper ramp for readable text over glass (≥4.9:1) */\n --dsw-alias-label-primary: #101728;\n --dsw-alias-label-secondary: #333c4d;\n --dsw-alias-label-tertiary: #5c6472;\n --dsw-alias-label-caption: #626a78;\n}\n\n/* ---- glass engine · dark ------------------------------------------------- */\nhtml[data-dsg='on'] body[data-ds-dark-theme] {\n --dsg-tint: #0d1524;\n --dsg-tint-rgb: 13 21 36;\n --dsg-floor: calc(var(--dsg-floor-base-dark) * var(--dsg-fidelity));\n --dsg-a1: 0.08;\n --dsg-a2: 0.34;\n --dsg-a3: 0.66;\n\n --dsg-fill-l1: color-mix(in srgb,\n var(--dsg-tint) calc(var(--dsg-floor) * 100%),\n color-mix(in srgb, var(--dsg-tint) calc(var(--dsg-a1) * 100%), transparent) calc((1 - var(--dsg-floor)) * 100%));\n --dsg-fill-l2: color-mix(in srgb,\n var(--dsg-tint) calc(var(--dsg-floor) * 100%),\n color-mix(in srgb, var(--dsg-tint) calc(var(--dsg-a2) * 100%), transparent) calc((1 - var(--dsg-floor)) * 100%));\n --dsg-fill-l3: color-mix(in srgb,\n var(--dsg-tint) calc(var(--dsg-floor-base-dark) * 100%),\n color-mix(in srgb, var(--dsg-tint) calc(var(--dsg-a3) * 100%), transparent) calc((1 - var(--dsg-floor-base-dark)) * 100%));\n\n /* document preview paper: fully opaque, never lets chat text show through */\n --dsg-doc-paper: #0c1322;\n\n --dsg-sheen-l1: linear-gradient(180deg, rgba(255, 255, 255, 0.07), rgba(255, 255, 255, 0.02) 38%, rgba(255, 255, 255, 0.01));\n --dsg-sheen-l2: linear-gradient(180deg, rgba(255, 255, 255, 0.11), rgba(255, 255, 255, 0.03) 38%, rgba(255, 255, 255, 0.01));\n --dsg-sheen-l3: linear-gradient(180deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.02) 38%, rgba(255, 255, 255, 0.03));\n\n --dsg-bevel-l1:\n inset 0 1px 0 rgba(255, 255, 255, 0.14),\n inset 0 -1px 0 rgba(255, 255, 255, 0.05),\n inset 0 0 0 0.5px rgba(255, 255, 255, 0.08),\n 0 8px 26px rgba(0, 0, 0, 0.22);\n --dsg-bevel-l2:\n inset 0 1px 0 rgba(255, 255, 255, 0.16),\n inset 0 -1px 0 rgba(255, 255, 255, 0.06),\n inset 0 0 0 0.5px rgba(255, 255, 255, 0.1),\n 0 14px 44px rgba(0, 0, 0, 0.32);\n --dsg-bevel-l3:\n inset 0 1px 0 rgba(255, 255, 255, 0.16),\n inset 0 0 0 1px rgba(255, 255, 255, 0.08),\n 0 24px 80px rgba(0, 0, 0, 0.48);\n\n --dsg-border-hair: rgba(150, 180, 255, 0.14);\n\n --dsw-specific-menu: color-mix(in srgb, #0d1524 86%, transparent);\n --dsw-menu-surface-fill: color-mix(in srgb, #0d1524 84%, transparent);\n --dsw-alias-menu-group-header-fill: rgba(13, 21, 36, 0.95);\n --dsw-specific-sidebar-nav-item-hover: rgba(255, 255, 255, 0.05);\n --dsw-specific-sidebar-nav-item-active-accent: rgba(77, 107, 254, 0.22);\n\n --dsw-alias-border-l1: rgba(150, 180, 255, 0.1);\n --dsw-alias-border-l2: rgba(150, 180, 255, 0.16);\n --dsw-alias-border-l3: rgba(150, 180, 255, 0.22);\n --dsw-alias-border-l4: rgba(150, 180, 255, 0.28);\n --dsw-elevation-stroke-color: rgba(150, 180, 255, 0.2);\n\n --dsw-alias-markdown-inline-code: rgba(120, 150, 255, 0.14);\n --dsw-alias-markdown-tag: rgba(120, 150, 255, 0.14);\n --dsw-alias-turn-trigger-bg-hover: var(--dsg-fill-l2);\n --dsw-alias-settings-card-fill: var(--dsg-fill-l2);\n --dsw-alias-settings-card-stroke: rgba(150, 180, 255, 0.18);\n\n --dsw-alias-label-primary: #eef3ff;\n --dsw-alias-label-secondary: #b9c6df;\n --dsw-alias-label-tertiary: #93a3c0;\n --dsw-alias-label-caption: #7d8da9;\n}\n\n/* ---- global texture: selection, focus, scrollbar ------------------------- */\nhtml[data-dsg='on'] ::selection {\n background: rgba(77, 107, 254, 0.22);\n}\nhtml[data-dsg='on'] body :focus-visible:not(:read-write) {\n outline-color: var(--dsg-blue-ring) !important;\n}\nhtml[data-dsg='on'] * {\n scrollbar-color: rgba(77, 107, 254, 0.28) transparent;\n}\nhtml[data-dsg='on'] ::-webkit-scrollbar-thumb {\n background: rgba(77, 107, 254, 0.24) !important;\n border-radius: 999px;\n}\nhtml[data-dsg='on'] ::-webkit-scrollbar-thumb:hover {\n background: rgba(77, 107, 254, 0.38) !important;\n}\n\n/* ---- runtime fallback: software rasteriser (syntax OK, frost missing) ---- */\nhtml[data-dsg='on'] body[data-dsg-fallback] {\n --dsg-fill-l1: rgba(250, 252, 255, 0.92);\n --dsg-fill-l2: rgba(252, 253, 255, 0.95);\n --dsg-fill-l3: rgba(255, 255, 255, 0.97);\n --dsg-backdrop-l1: none;\n --dsg-backdrop-l2: none;\n --dsg-backdrop-l3: none;\n --dsg-backdrop-panel: none;\n --dsw-menu-backdrop-filter: none;\n --dsw-mask-blur: none;\n --dsg-sheen-l1: none;\n --dsg-sheen-l2: none;\n --dsg-sheen-l3: none;\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme][data-dsg-fallback] {\n --dsg-fill-l1: rgba(13, 21, 36, 0.93);\n --dsg-fill-l2: rgba(16, 26, 44, 0.96);\n --dsg-fill-l3: rgba(18, 29, 49, 0.98);\n}\n\n/* ---- reduced motion ------------------------------------------------------- */\n@media (prefers-reduced-motion: reduce) {\n html[data-dsg='on'] .dsg-atmosphere .dsg-aurora {\n animation: none !important;\n }\n html[data-dsg='on'] * {\n transition-duration: 1ms !important;\n animation-duration: 1ms !important;\n }\n}\n\n@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {\n html[data-dsg='on'] body {\n --dsg-fill-l1: rgba(250, 252, 255, 0.9);\n --dsg-fill-l2: rgba(252, 253, 255, 0.94);\n --dsg-fill-l3: rgba(255, 255, 255, 0.97);\n --dsw-specific-menu: #fafcff;\n --dsw-menu-surface-fill: #fafcff;\n }\n html[data-dsg='on'] body[data-ds-dark-theme] {\n --dsg-fill-l1: rgba(13, 21, 36, 0.92);\n --dsg-fill-l2: rgba(16, 26, 44, 0.95);\n --dsg-fill-l3: rgba(18, 29, 49, 0.97);\n --dsw-specific-menu: #0f1728;\n --dsw-menu-surface-fill: #0f1728;\n }\n}\n\n/* ---- resize guard:拖动分栏时卸掉高成本材质 ---------------------------------\n client 半部在 pointerdown(cursor 为 *-resize 的手柄)时给 <html> 打\n data-dsg-resizing,松手立即移除。拖动期间每帧都会重排/重绘:\n · 任何 backdrop-filter 都会让 Chromium 重新采样整块背景 → 卡顿主因;\n · 沿移动边缘的超大外投影会逐帧重新栅格化。\n 这些玻璃背后的衬底是平滑的氛围层,去掉霜与远投影在拖动过程中几乎看不出;\n 静止态(含松手后的每一帧)与原来完全一致,不改变最终观感。 */\nhtml[data-dsg='on'][data-dsg-resizing] :is(\n [class*='_bubble']:not([role='tooltip']),\n [data-turn-trigger]\n ) {\n -webkit-backdrop-filter: none !important;\n backdrop-filter: none !important;\n /* 只保留内侧顶光/发丝边,去掉逐帧重栅格化的 44px 外投影 */\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.55),\n inset 0 -1px 0 rgba(255, 255, 255, 0.1),\n inset 0 0 0 0.5px rgba(255, 255, 255, 0.22) !important;\n}\nhtml[data-dsg='on'][data-dsg-resizing] body[data-ds-dark-theme] :is(\n [class*='_bubble']:not([role='tooltip']),\n [data-turn-trigger]\n ) {\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.14),\n inset 0 0 0 0.5px rgba(255, 255, 255, 0.1) !important;\n}\nhtml[data-dsg='on'][data-dsg-resizing] :is(\n [data-composer-card],\n [data-goal-bar] [class*='_bar'],\n [data-sidebar-right-panel]:not([aria-hidden='true']),\n [data-slot='conversation.header'] > header,\n div:has(> [data-slot='sidebar'])\n )::before {\n -webkit-backdrop-filter: none !important;\n backdrop-filter: none !important;\n}\n/* 侧栏/header 的外投影在拖动时收紧(移动边缘的大半径阴影最贵) */\nhtml[data-dsg='on'][data-dsg-resizing] [data-sidebar-right-panel] {\n box-shadow: -6px 0 16px rgba(44, 74, 140, 0.07) !important;\n}\nhtml[data-dsg='on'][data-dsg-resizing] [data-slot='conversation.header'] > header {\n box-shadow: 0 8px 20px -18px rgba(44, 74, 140, 0.4) !important;\n}\n\n/* ===== 10-shell.css ===== */\n/* ============================================================================\r\n dsh-skin-mistblue · 10 shell — 主壳 / 三栏 / Windows 标题栏 / 会话 header / 右栏外壳\r\n Owner: shell-dev. Consumes the glass engine in 00-foundation.css only.\r\n\r\n 规则来源:docs/UI-CONTRACT.md §3/§4、docs/GLASS-SPEC.md §1/§5、\r\n docs/DESIGN-SPEC.md §8.1/§8.2/§8.4、docs/SURFACE-MAP.md §2/§4/§6/§8。\r\n\r\n 硬约束(本文件逐步遵守):\r\n · Windows 标题栏是 frame 的 ::before(宿主壳层),模糊另起 ::after —— 伪元素没有\r\n 后代,永不成为 fixed 包含块(左栏 fixed 收起按钮安全)。\r\n · 会话 header 的霜只能挂 ::before;header 设 z-index:0 建普通层叠上下文(不是\r\n isolation —— isolation 会建 backdrop root,霜会失效)。\r\n · 右栏面板必须带 open 守卫(收起态 aria-hidden=true 仍挂载在布局里)。\r\n · 不在 frame / centerCol / rightbarCol 这些 fixed 祖先上挂 backdrop-filter。\r\n ========================================================================== */\r\n\r\n/* ---- shared shell vars (my own layer, foundation keeps the engine) -------- */\r\nhtml[data-dsg='on'] {\r\n --dsg-capsule: rgba(255, 255, 255, 0.55);\r\n --dsg-capsule-hover: rgba(255, 255, 255, 0.74);\r\n --dsg-row-hover: rgba(31, 58, 110, 0.055);\r\n --dsg-row-active: rgba(77, 107, 254, 0.12);\r\n --dsg-row-active-ink: #2f49d9;\r\n --dsg-hairline-soft: rgba(56, 88, 158, 0.1);\r\n --dsg-sheen-top: inset 0 1px 0 rgba(255, 255, 255, 0.55);\r\n --dsg-header-h: 57px;\r\n --dsg-shell-radius: 20px;\r\n /* 会话 header:悬浮玻璃条(比 L2 更透,好让顶部的雾蓝衬光透出来) */\r\n --dsg-header-radius: 18px;\r\n --dsg-header-fill: color-mix(in srgb, #ffffff 17%, transparent);\r\n --dsg-header-backdrop: blur(calc(24px * var(--dsg-blur, 1))) saturate(1.65) brightness(1.02);\r\n --dsg-header-sweep: linear-gradient(\r\n 112deg,\r\n rgba(255, 255, 255, 0.22) 0%,\r\n rgba(255, 255, 255, 0.05) 34%,\r\n rgba(255, 255, 255, 0) 58%\r\n );\r\n /* 右侧栏面板:只留一层玻璃。dockkit 各层容器与内容自带半透明底,必须清零,\r\n 否则层层叠加会把整块面板洗成不透明白(旧版就是这个问题)。 */\r\n --dsg-panel-fill: color-mix(in srgb, #ffffff 18%, transparent);\r\n --dsg-panel-backdrop: blur(calc(22px * var(--dsg-blur, 1))) saturate(1.55) brightness(1.02);\r\n}\r\nhtml[data-dsg='on'] body[data-ds-dark-theme] {\r\n --dsg-capsule: rgba(255, 255, 255, 0.08);\r\n --dsg-capsule-hover: rgba(255, 255, 255, 0.13);\r\n --dsg-row-hover: rgba(255, 255, 255, 0.06);\r\n --dsg-row-active: rgba(123, 147, 255, 0.18);\r\n --dsg-row-active-ink: #9fb4ff;\r\n --dsg-hairline-soft: rgba(150, 180, 255, 0.12);\r\n --dsg-sheen-top: inset 0 1px 0 rgba(255, 255, 255, 0.14);\r\n --dsg-header-fill: color-mix(in srgb, #0d1524 47%, transparent);\r\n --dsg-header-backdrop: blur(calc(24px * var(--dsg-blur, 1))) saturate(1.4) brightness(1.05);\r\n --dsg-header-sweep: linear-gradient(\r\n 112deg,\r\n rgba(255, 255, 255, 0.08) 0%,\r\n rgba(255, 255, 255, 0.02) 34%,\r\n rgba(255, 255, 255, 0) 58%\r\n );\r\n --dsg-panel-fill: color-mix(in srgb, #0d1524 46%, transparent);\r\n --dsg-panel-backdrop: blur(calc(22px * var(--dsg-blur, 1))) saturate(1.35) brightness(1.04);\r\n}\r\n\r\n/* ============================================================\r\n 1. 页面底 / 主壳\r\n ============================================================ */\r\n/* 整窗彻底透明:氛围层是唯一背衬。结构锚点:root slot 的直接子 div = frame;\r\n 不写整串哈希类名([class*=\"_frame\"] 太宽,只作为结构选择器的组合项)。 */\r\nhtml[data-dsg='on'] [data-slot='root'] > [class*='_frame'] {\r\n background: transparent !important;\r\n}\r\nhtml[data-dsg='on'] [data-slot='main'] {\r\n background: transparent !important;\r\n}\r\n/* 底部槽 / 浮层挂载点:不铺底 */\r\nhtml[data-dsg='on'] [data-shell-bottom] {\r\n background: transparent !important;\r\n}\r\nhtml[data-dsg='on'] [data-shell-overlay] {\r\n background: transparent;\r\n}\r\n/* 中列:不铺整块地板(大滚动容器禁止挂霜)。只留顶部一段很淡的雾蓝衬光,\r\n 让氛围层是画布本身、玻璃面浮在雾上 —— 这是「空气感」的来源,也是悬浮\r\n header 玻璃条背后能“看出模糊”的衬底。 */\r\nhtml[data-dsg='on'] div:has(> [data-slot='main']) {\r\n background:\r\n radial-gradient(78% 240px at 18% 0, rgba(120, 152, 219, 0.3) 0%, rgba(120, 152, 219, 0) 72%),\r\n radial-gradient(64% 250px at 82% 0, rgba(146, 178, 230, 0.26) 0%, rgba(146, 178, 230, 0) 76%),\r\n linear-gradient(\r\n 180deg,\r\n rgba(255, 255, 255, 0.16) 0,\r\n rgba(255, 255, 255, 0.04) 200px,\r\n rgba(255, 255, 255, 0) 440px\r\n );\r\n border-radius: var(--dsg-shell-radius) var(--dsg-shell-radius) 0 0;\r\n box-shadow: inset -0.5px 0 0 var(--dsg-hairline-soft);\r\n}\r\nhtml[data-dsg='on'] body[data-ds-dark-theme] div:has(> [data-slot='main']) {\r\n background:\r\n radial-gradient(78% 240px at 18% 0, rgba(64, 96, 168, 0.34) 0%, rgba(64, 96, 168, 0) 72%),\r\n radial-gradient(64% 250px at 82% 0, rgba(77, 107, 254, 0.22) 0%, rgba(77, 107, 254, 0) 76%),\r\n linear-gradient(\r\n 180deg,\r\n rgba(255, 255, 255, 0.05) 0,\r\n rgba(255, 255, 255, 0.015) 200px,\r\n rgba(255, 255, 255, 0) 440px\r\n );\r\n}\r\n/* 右栏 track 本身透明;面板在下面单独画 */\r\nhtml[data-dsg='on'] [data-rightbar-col] {\r\n background: transparent !important;\r\n}\r\n\r\n/* ============================================================\r\n 2. Windows 原生窗口标题栏(frame 的 ::before 是它唯一底色)\r\n ============================================================ */\r\n/* 底色 + 恒定白釉(不能用三段渐变:40px 与 1111px 的盒子会算出不同釉光) */\r\nhtml[data-dsg='on'][data-windows-titlebar] [data-slot='root'] > [class*='_frame']::before {\r\n background-color: var(--dsg-fill-l1) !important;\r\n background-image: linear-gradient(180deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.1)) !important;\r\n border-bottom: 0.5px solid var(--dsg-border-hair);\r\n}\r\nhtml[data-dsg='on'][data-windows-titlebar] body[data-ds-dark-theme] [data-slot='root'] > [class*='_frame']::before {\r\n background-image: linear-gradient(180deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.04)) !important;\r\n}\r\nhtml[data-dsg='on'][data-windows-titlebar] [data-slot='root'] > [class*='_frame']::after {\r\n content: '';\r\n position: absolute;\r\n inset: 0 0 auto;\r\n height: var(--dsh-windows-titlebar-height, 40px);\r\n pointer-events: none;\r\n -webkit-backdrop-filter: var(--dsg-backdrop-l1);\r\n backdrop-filter: var(--dsg-backdrop-l1);\r\n}\r\n\r\n/* ============================================================\r\n 3. 会话 header:悬浮 L2 玻璃条 + DeepSeek tab 语言(高度 ~57px)\r\n ============================================================ */\r\n/* 外槽内缩:玻璃条与列边缘之间露出氛围层 —— 和 composer 同一套「浮在雾上」的\r\n 语言,也是“透明”能被看见的前提(背后不再是同一块白板)。 */\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] {\r\n padding: 9px 12px 8px;\r\n background: transparent !important;\r\n}\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header {\r\n position: relative;\r\n z-index: 0; /* 普通层叠上下文,让 ::before 的负 z-index 有落脚点 */\r\n padding: 3px 20px 2px !important;\r\n min-height: var(--dsg-header-h);\r\n border: 0 !important;\r\n border-radius: var(--dsg-header-radius);\r\n background: transparent !important;\r\n /* 外投影只放在本体的外圈;内釉光/发丝边交给 ::before(它在负 z-index 上,\r\n 比本体的 box-shadow 后绘制,否则会被填充层盖掉)。 */\r\n box-shadow:\r\n 0 20px 46px -30px rgba(44, 74, 140, 0.55),\r\n 0 2px 10px rgba(44, 74, 140, 0.06);\r\n transition: box-shadow var(--dsg-motion-dur) var(--dsg-ease);\r\n}\r\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-slot='conversation.header'] > header {\r\n box-shadow:\r\n 0 20px 46px -30px rgba(0, 0, 0, 0.66),\r\n 0 2px 10px rgba(0, 0, 0, 0.26);\r\n}\r\n/* 霜 + 填充 + 釉光:唯一载体(伪元素无后代,永不成为 fixed 包含块) */\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header::before {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n z-index: -1;\r\n pointer-events: none;\r\n border-radius: inherit;\r\n background-color: var(--dsg-header-fill);\r\n background-image: var(--dsg-header-sweep), var(--dsg-sheen-l2);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.72),\r\n inset 0 0 0 0.5px rgba(255, 255, 255, 0.4),\r\n inset 0 -16px 24px -22px rgba(58, 92, 158, 0.3);\r\n -webkit-backdrop-filter: var(--dsg-header-backdrop);\r\n backdrop-filter: var(--dsg-header-backdrop);\r\n}\r\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-slot='conversation.header'] > header::before {\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.16),\r\n inset 0 0 0 0.5px rgba(255, 255, 255, 0.12),\r\n inset 0 -16px 24px -22px rgba(0, 0, 0, 0.4);\r\n}\r\n/* 窄窗:贴边、圆角收小,别把内容挤扁 */\r\n@media (max-width: 760px) {\r\n html[data-dsg='on'] [data-slot='conversation.header'] {\r\n padding: 8px 8px 6px;\r\n }\r\n html[data-dsg='on'] [data-slot='conversation.header'] > header {\r\n padding: 2px 14px 2px !important;\r\n border-radius: 14px;\r\n }\r\n}\r\n/* 回退:无霜 / 软件光栅化时保持近不透明,几何与布局不变 */\r\n@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {\r\n html[data-dsg='on'] body {\r\n --dsg-header-fill: rgba(250, 252, 255, 0.94);\r\n }\r\n html[data-dsg='on'] body[data-ds-dark-theme] {\r\n --dsg-header-fill: rgba(15, 24, 40, 0.95);\r\n }\r\n}\r\nhtml[data-dsg='on'] body[data-dsg-fallback] {\r\n --dsg-header-fill: rgba(251, 253, 255, 0.94);\r\n --dsg-header-backdrop: none;\r\n}\r\nhtml[data-dsg='on'] body[data-ds-dark-theme][data-dsg-fallback] {\r\n --dsg-header-fill: rgba(15, 24, 40, 0.95);\r\n}\r\n/* 标题行更紧凑:52–57px 的 DeepSeek 观感,而不是 76px 的宿主默认 */\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header [class*='_titleRow'] {\r\n min-height: 24px;\r\n align-items: center;\r\n}\r\n/* header 里的动作簇统一压到 26px,避免把标题行撑高 */\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header :is(\r\n [data-slot='conversation.session.header.actions'],\r\n [data-slot='conversation.session.header.utilities'],\r\n [data-slot='conversation.session.header.corner']\r\n ) button {\r\n height: 26px;\r\n min-height: 26px;\r\n font-size: 12.5px;\r\n}\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header [class*='_crumb'] {\r\n color: var(--dsw-alias-label-tertiary);\r\n border-radius: 8px;\r\n font-size: 13px;\r\n line-height: 20px;\r\n padding: 2px 8px;\r\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease);\r\n}\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header button[class*='_crumb']:hover {\r\n background: var(--dsg-row-hover);\r\n color: var(--dsw-alias-label-primary);\r\n}\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header [class*='_crumbCurrent'] {\r\n color: var(--dsw-alias-label-primary);\r\n font-size: 15px;\r\n font-weight: 600;\r\n letter-spacing: 0.01em;\r\n padding-left: 4px;\r\n}\r\n/* 顶部动作区:一律胶囊化,hover 玻璃反馈 */\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header :is(\r\n [data-slot='conversation.session.header.actions'],\r\n [data-slot='conversation.session.header.utilities'],\r\n [data-slot='conversation.session.header.corner']\r\n ) button {\r\n border-radius: 999px;\r\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease);\r\n}\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header :is(\r\n [data-slot='conversation.session.header.actions'],\r\n [data-slot='conversation.session.header.utilities'],\r\n [data-slot='conversation.session.header.corner']\r\n ) button:hover {\r\n background: var(--dsg-row-hover);\r\n}\r\n/* header 里的「打开方式」拆分按钮:整组做成胶囊 */\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header [data-slot='conversation.session.header.utilities'] [class*='_split'] {\r\n border-radius: 999px;\r\n border: 0.5px solid var(--dsg-hairline-soft);\r\n background: var(--dsg-capsule);\r\n overflow: hidden;\r\n transition: background-color 140ms var(--dsg-ease), border-color 140ms var(--dsg-ease);\r\n}\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header [data-slot='conversation.session.header.utilities'] [class*='_split']:hover {\r\n background: var(--dsg-capsule-hover);\r\n border-color: rgba(77, 107, 254, 0.2);\r\n}\r\n/* tabs:DeepSeek 风格——未选中弱化、选中蓝字 + 圆角下划线 */\r\nhtml[data-dsg='on'] [data-conversation-tabs] {\r\n gap: 28px;\r\n margin-top: 0;\r\n padding-left: 6px;\r\n}\r\nhtml[data-dsg='on'] [data-conversation-tabs] [role='tab'] {\r\n color: var(--dsw-alias-label-tertiary);\r\n font-size: 13px;\r\n font-weight: 500;\r\n line-height: 16px;\r\n padding: 2px 1px 7px;\r\n border-radius: 8px 8px 0 0;\r\n transition: color 140ms var(--dsg-ease), background-color 140ms var(--dsg-ease);\r\n}\r\nhtml[data-dsg='on'] [data-conversation-tabs] [role='tab']::after {\r\n height: 2.5px;\r\n border-radius: 999px;\r\n background: transparent;\r\n transition: background-color 160ms var(--dsg-ease), box-shadow 160ms var(--dsg-ease);\r\n}\r\nhtml[data-dsg='on'] [data-conversation-tabs] [role='tab']:hover {\r\n color: var(--dsw-alias-label-primary);\r\n}\r\nhtml[data-dsg='on'] [data-conversation-tabs] [role='tab']:hover::after {\r\n background: rgba(77, 107, 254, 0.22);\r\n}\r\nhtml[data-dsg='on'] [data-conversation-tabs] [role='tab'][aria-selected='true'] {\r\n color: var(--dsg-blue);\r\n font-weight: 600;\r\n}\r\nhtml[data-dsg='on'] [data-conversation-tabs] [role='tab'][aria-selected='true']::after {\r\n background: var(--dsg-blue);\r\n box-shadow: 0 2px 8px rgba(77, 107, 254, 0.35);\r\n}\r\n/* header 里的其它小控件(会话层级 lineage / 团队标签)弱化 */\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header [class*='_label'] {\r\n color: var(--dsw-alias-label-tertiary);\r\n}\r\n\r\n/* ============================================================\r\n 4. 右栏面板(外壳一层;内容卡片归 60-settings.css)\r\n ============================================================ */\r\nhtml[data-dsg='on'] [data-rightbar-col] [data-sidebar-right-panel]:not([aria-hidden='true']) {\r\n z-index: var(--dsh-dockkit-dock-layer, 10);\r\n border-radius: var(--dsg-shell-radius) 0 0 var(--dsg-shell-radius);\r\n}\r\nhtml[data-dsg='on'] [data-rightbar-col] [data-sidebar-right-panel]:not([aria-hidden='true'])::before {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n z-index: -1;\r\n pointer-events: none;\r\n border-radius: inherit;\r\n background-color: var(--dsg-panel-fill);\r\n background-image: var(--dsg-sheen-l2);\r\n box-shadow: inset 0.5px 0 0 var(--dsg-hairline-soft), inset 1px 0 0 rgba(255, 255, 255, 0.42);\r\n -webkit-backdrop-filter: var(--dsg-panel-backdrop);\r\n backdrop-filter: var(--dsg-panel-backdrop);\r\n}\r\n/* 收起态显式清干净(容器仍在布局里) */\r\nhtml[data-dsg='on'] [data-rightbar-col] [data-sidebar-right-panel][aria-hidden='true']::before {\r\n content: none;\r\n}\r\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-rightbar-col] [data-sidebar-right-panel]:not([aria-hidden='true'])::before {\r\n box-shadow: inset 0.5px 0 0 rgba(255, 255, 255, 0.08);\r\n}\r\n/* dockkit tab strip:胶囊 tab */\r\nhtml[data-dsg='on'] [data-dockkit-strip] {\r\n padding: 0 6px;\r\n}\r\nhtml[data-dsg='on'] [data-dockkit-strip] [data-dockkit-tab] {\r\n border-radius: 9px;\r\n color: var(--dsw-alias-label-tertiary);\r\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease);\r\n}\r\nhtml[data-dsg='on'] [data-dockkit-strip] [data-dockkit-tab]:hover {\r\n background: var(--dsg-row-hover);\r\n color: var(--dsw-alias-label-secondary);\r\n}\r\nhtml[data-dsg='on'] [data-dockkit-strip] [data-dockkit-tab][aria-selected='true'] {\r\n background: var(--dsg-row-active);\r\n color: var(--dsg-row-active-ink);\r\n}\r\n/* dockkit 分栏把手 / 内容区不铺底 */\r\nhtml[data-dsg='on'] [data-dockkit-pane],\r\nhtml[data-dsg='on'] [data-dockkit-content] {\r\n background: transparent !important;\r\n}\r\n\r\n/* ============================================================\r\n 5. 滚动条:宿主局部覆盖回本色(foundation 给的是全局细蓝条)\r\n ============================================================ */\r\nhtml[data-dsg='on'] [data-conversation-scroll],\r\nhtml[data-dsg='on'] [data-sidebar-right-panel] [data-dockkit-pane] {\r\n --dsh-scrollbar-thumb: rgba(77, 107, 254, 0.22);\r\n --dsh-scrollbar-thumb-hover: rgba(77, 107, 254, 0.36);\r\n}\n\n/* ===== 12-windows-titlebar.css ===== */\n/* ============================================================================\r\n 12 windows titlebar — 修复 Windows 原生标题栏(菜单条 + 窗口控制按钮)色差\r\n ----------------------------------------------------------------------------\r\n 背景:DSH Desktop 的 preload 注入一个 Shadow DOM 菜单条 div[data-windows-menu],\r\n 并用一个隐藏探针 span(background-color: var(--dsw-specific-sidebar-fill))\r\n 通过 canvas 取色后 IPC 给主进程 setTitleBarOverlay(color, symbolColor)。\r\n 我们把这些 token 改成了半透明玻璃后,Electron 的 titleBarOverlay 把 alpha\r\n 合成到黑色背衬上 → 顶部出现一条深色/突兀的带;浅色模式同样存在。\r\n\r\n 修法(全部为 CSS,不改宿主):\r\n 1. 探针改成不透明主题色 → 主进程收到不透明 rgba,原生窗口控件区与主题一致。\r\n 2. 网页侧标题栏底色用同一实体色 → 菜单区/控件区/网页区三者同色,不再三层色差。\r\n 3. 给菜单条左侧补上 DSH 官方鲸标(从 primitives 提取的 path,mask 着色)。\r\n ========================================================================== */\r\n\r\nhtml[data-dsg='on'][data-windows-titlebar] {\r\n --dsg-titlebar-solid: #eaf1fb;\r\n --dsg-titlebar-ink: #101728;\r\n}\r\nhtml[data-dsg='on'][data-windows-titlebar] body[data-ds-dark-theme] {\r\n --dsg-titlebar-solid: #0b1322;\r\n --dsg-titlebar-ink: #eef3ff;\r\n}\r\n\r\n/* 1) 探针:让主进程拿到不透明标题栏色(样式表 !important 胜过 inline 非 important) */\r\nhtml[data-dsg='on'] body > span[style*='--dsw-specific-sidebar-fill'] {\r\n background-color: var(--dsg-titlebar-solid) !important;\r\n}\r\nhtml[data-dsg='on'] body[data-ds-dark-theme] > span[style*='--dsw-specific-sidebar-fill'] {\r\n background-color: #0b1322 !important;\r\n}\r\n\r\n/* 2) 网页侧标题栏:与原生 overlay 同色;实体色避免透明叠黑 */\r\nhtml[data-dsg='on'][data-windows-titlebar] [data-slot='root'] > [class*='_frame']::before {\r\n background-color: var(--dsg-titlebar-solid) !important;\r\n background-image: linear-gradient(180deg, rgba(255, 255, 255, 0.16), rgba(255, 255, 255, 0) 60%) !important;\r\n border-bottom: 0.5px solid var(--dsg-border-hair, rgba(56, 88, 158, 0.14)) !important;\r\n -webkit-backdrop-filter: none !important;\r\n backdrop-filter: none !important;\r\n}\r\n/* 原生条上不再挂霜(大面 blur 无收益,且会与 native overlay 抢层) */\r\nhtml[data-dsg='on'][data-windows-titlebar] [data-slot='root'] > [class*='_frame']::after {\r\n content: none !important;\r\n -webkit-backdrop-filter: none !important;\r\n backdrop-filter: none !important;\r\n}\r\n\r\n/* 3) 菜单条:\r\n · 宿主 div[data-windows-menu] 保持完全透明,与标题栏背景同色;\r\n · 不再自绘左侧图标 —— 标题栏左侧 12px 处是 DSH 自带的「侧栏收起/展开」按钮\r\n (collapsed 时 48px 处还有「新会话」按钮),自绘图标会与之重叠;\r\n · 菜单起点只在「侧栏展开」时右移到 54px(给 native toggle 留位);\r\n 收起时交回 DSH 的 84px,避开左侧两个 28px 按钮。 */\r\nhtml[data-dsg='on'][data-windows-titlebar]:not(:has([data-sidebar-collapsed='true'])) {\r\n --dsh-windows-menu-start: 54px;\r\n}\r\nhtml[data-dsg='on'][data-windows-titlebar] div[data-windows-menu] {\r\n background: transparent !important;\r\n background-color: transparent !important;\r\n box-shadow: none !important;\r\n color: var(--dsw-alias-label-secondary);\r\n}\n\n/* ===== 20-sidebar.css ===== */\n/* ============================================================================\n dsh-skin-mistblue · 20 sidebar — 左栏(品牌 / 新会话 / 面板列表 / 工作区会话树 / footer)\n Owner: shell-dev.\n\n 玻璃策略(GLASS-SPEC §5 #131 / SURFACE-MAP §8):\n · 左栏列 = `div:has(> [data-slot=\"sidebar\"])`;模糊挂列的 ::before,列自身\n `position:relative; z-index:0`。宿主在 Windows 下把「收起/展开」与「收起态新会话」\n 两个按钮写成 position:fixed,挂列上会让它们改锚、被裁掉。\n · 列 = L2 玻璃(fill-l2 + backdrop-l2 + sheen + 右缘发丝/内阴影)。\n · 内层 [data-slot=\"sidebar\"] 是 display:contents 锚点(不生成盒子),真正的内容根\n `._2H3hWW_root` 自带 sidebar-fill 实底 —— 必须清掉,否则列上叠两层地板。\n · 行级只做 hover/selected 的柔光,不单独挂霜(“one blur per shell”)。\n ========================================================================== */\n\n/* ---- 1. 左栏列:L2 玻璃 ------------------------------------------------ */\nhtml[data-dsg='on'] div:has(> [data-slot='sidebar']) {\n position: relative;\n z-index: 0;\n background: transparent !important;\n /* 玻璃边界:发丝线画在元素边框上(::before 的 inset:0 不会盖住 border) */\n border-right: 0.5px solid var(--dsg-border-hair) !important;\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] div:has(> [data-slot='sidebar']) {\n border-right-color: rgba(150, 180, 255, 0.14) !important;\n}\nhtml[data-dsg='on'] div:has(> [data-slot='sidebar'])::before {\n content: '';\n position: absolute;\n inset: 0;\n z-index: -1;\n pointer-events: none;\n background-color: var(--dsg-fill-l2);\n background-image: var(--dsg-sheen-l2);\n /* 内侧白光 + 柔和内投影:挂在 ::before 上才会画在填充层之上 */\n box-shadow:\n inset -1px 0 0 rgba(255, 255, 255, 0.5),\n inset -26px 0 30px -30px rgba(44, 74, 140, 0.32);\n -webkit-backdrop-filter: var(--dsg-backdrop-l2);\n backdrop-filter: var(--dsg-backdrop-l2);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] div:has(> [data-slot='sidebar'])::before {\n box-shadow:\n inset -1px 0 0 rgba(255, 255, 255, 0.08),\n inset -26px 0 30px -30px rgba(0, 0, 0, 0.5);\n}\n/* 右侧玻璃厚度:一条很窄的纵向高光,让左栏从背景里“立”起来 */\nhtml[data-dsg='on'] div:has(> [data-slot='sidebar'])::after {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n width: 14px;\n z-index: -1;\n pointer-events: none;\n background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.28) 100%);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] div:has(> [data-slot='sidebar'])::after {\n background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.06) 100%);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-slot='sidebar'] [class*='_searchExpanded'] {\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1) !important;\n}\n/* 内容根:清掉宿主的 sidebar-fill,避免二次铺底 */\nhtml[data-dsg='on'] [data-slot='sidebar'] > [class*='_root'] {\n background: transparent !important;\n color: var(--dsw-alias-label-primary);\n --dsh-sidebar-inline-padding: 12px;\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] > [class*='_root']::before,\nhtml[data-dsg='on'] [data-slot='sidebar'] > [class*='_root']::after {\n background: transparent !important;\n}\n\n/* ---- 2. 品牌行 ---------------------------------------------------------- */\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_logoRow'] {\n gap: 6px;\n padding-left: 6px;\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_brand'] {\n border-radius: 10px;\n transition: opacity 160ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_brand']:hover {\n opacity: 0.85;\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_brandName'] {\n letter-spacing: 0.05em;\n font-weight: 600;\n font-size: 17px;\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_iconButton'] {\n border-radius: 9px;\n color: var(--dsw-alias-label-tertiary);\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_iconButton']:hover {\n background: var(--dsg-row-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n/* ---- 3. 新会话:DeepSeek 白釉胶囊(蓝色 + 号 + hover 抬升)---------------- */\nhtml[data-dsg='on'] [data-slot='sidebar'] button[class*='_newSession'] {\n height: 38px;\n margin: 0 2px 12px;\n border-radius: 12px;\n border: 0.5px solid var(--dsg-hairline-soft);\n background: var(--dsg-capsule) !important;\n color: var(--dsw-alias-label-primary);\n font-size: 13.5px;\n font-weight: 500;\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.55),\n 0 1px 2px rgba(23, 42, 84, 0.06);\n transition:\n background-color 160ms var(--dsg-ease),\n box-shadow 160ms var(--dsg-ease),\n transform 160ms var(--dsg-ease),\n border-color 160ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] button[class*='_newSession']:hover {\n background: var(--dsg-capsule-hover) !important;\n border-color: rgba(77, 107, 254, 0.22);\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.6),\n 0 4px 12px -2px rgba(23, 42, 84, 0.14),\n 0 1px 2px rgba(23, 42, 84, 0.06);\n transform: translateY(-1px);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] button[class*='_newSession']:active {\n transform: translateY(0) scale(0.99);\n}\n/* + 号用品牌蓝,文字保持墨色 */\nhtml[data-dsg='on'] [data-slot='sidebar'] button[class*='_newSession'] [class*='_newSessionContent'] > svg {\n color: var(--dsg-blue);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] button[class*='_newSession'] [class*='_newSessionShortcut'] {\n color: var(--dsw-alias-label-caption);\n opacity: 0.8;\n}\n\n/* ---- 4. 全局面板列表(上下文洞察 / 插件 / 自动化 / 技能 / MCP)------------ */\nhtml[data-dsg='on'] [data-slot='sidebar'] nav[class*='_panelList'] {\n gap: 2px;\n margin-bottom: 10px;\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] nav[class*='_panelList'] button {\n min-height: 36px;\n height: 36px;\n padding: 0 10px;\n gap: 10px;\n border-radius: 10px;\n color: var(--dsw-alias-label-secondary);\n font-size: 13.5px;\n font-weight: 500;\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease),\n box-shadow 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] nav[class*='_panelList'] button [class*='_panelGlyph'] {\n color: var(--dsw-alias-label-tertiary);\n transition: color 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] nav[class*='_panelList'] button:hover {\n background: var(--dsg-row-hover);\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] nav[class*='_panelList'] button:hover [class*='_panelGlyph'] {\n color: var(--dsg-blue);\n}\n/* 选中:蓝色柔光胶囊(不是实心块) */\nhtml[data-dsg='on'] [data-slot='sidebar'] nav[class*='_panelList'] button[class*='_panelActive'] {\n background: var(--dsg-row-active);\n color: var(--dsg-row-active-ink);\n box-shadow: inset 0 0 0 0.5px rgba(77, 107, 254, 0.16);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] nav[class*='_panelList'] button[class*='_panelActive'] [class*='_panelGlyph'] {\n color: var(--dsg-blue);\n}\n\n/* ---- 5. 工作区 / 会话树 ------------------------------------------------- */\n/* section header:工作区标签 + 搜索 + 视图按钮 */\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_sectionHeader'] {\n height: 34px;\n margin-top: 6px;\n margin-bottom: 2px;\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_sectionLabel'] {\n color: var(--dsw-alias-label-tertiary);\n font-size: 12px;\n font-weight: 600;\n letter-spacing: 0.04em;\n}\n/* 搜索:默认只是一枚图标;展开后是胶囊玻璃 + 蓝色 focus ring */\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_search'] {\n border-radius: 10px;\n transition: background-color 160ms var(--dsg-ease), box-shadow 160ms var(--dsg-ease),\n border-color 160ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_searchExpanded'] {\n background: var(--dsg-capsule) !important;\n border: 0.5px solid var(--dsg-hairline-soft) !important;\n border-radius: 10px;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.4);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_searchExpanded']:focus-within {\n border-color: rgba(77, 107, 254, 0.55) !important;\n box-shadow: 0 0 0 2px var(--dsg-blue-ring);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_searchInput'] {\n font-size: 12.5px;\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_searchInput']::placeholder {\n color: var(--dsw-alias-label-caption);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_searchButton']:hover,\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_clearButton']:hover {\n background: var(--dsg-row-hover);\n border-radius: 8px;\n}\n/* 行:圆角柔光,不铺底 */\nhtml[data-dsg='on'] [data-slot='sidebar'] [role='treeitem'] {\n border-radius: 10px;\n color: var(--dsw-alias-label-secondary);\n transition: background-color 130ms var(--dsg-ease), color 130ms var(--dsg-ease),\n box-shadow 130ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [role='treeitem']:hover {\n background: var(--dsg-row-hover) !important;\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [role='treeitem'][aria-selected='true'] {\n background: var(--dsg-row-active) !important;\n color: var(--dsw-alias-label-primary);\n box-shadow: inset 0 0 0 0.5px rgba(77, 107, 254, 0.14);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [role='treeitem'] [class*='_title'] {\n font-size: 13.5px;\n line-height: 20px;\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [role='treeitem'] [class*='_time'] {\n color: var(--dsw-alias-label-caption);\n font-size: 10.5px;\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_projectRow'] {\n height: 32px;\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_projectText'] [class*='_title'] {\n font-weight: 500;\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_folderActive'] {\n color: var(--dsg-blue);\n}\n/* hover 才出现的行内操作按钮 */\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_rowActions'] [class*='_iconButton'] {\n border-radius: 7px;\n color: var(--dsw-alias-label-tertiary);\n transition: background-color 120ms var(--dsg-ease), color 120ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_rowActions'] [class*='_iconButton']:hover {\n background: rgba(77, 107, 254, 0.1);\n color: var(--dsg-blue);\n}\n/* 列表底部渐隐:跟随 L2 玻璃色(宿主的 sidebar-fill 现在是 L1,会对不上) */\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_fade'] {\n background: linear-gradient(to bottom, transparent, var(--dsg-fill-l2)) !important;\n}\n/* 会话溢出行(+N 更多) */\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_sessionOverflowButton'] {\n border-radius: 8px;\n color: var(--dsw-alias-label-tertiary);\n transition: color 120ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_sessionOverflowButton']:hover {\n color: var(--dsg-blue);\n}\n\n/* ---- 6. footer:设置入口 / 用户区 / 新版本 ------------------------------- */\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_footArea'] {\n gap: 2px;\n margin-top: 6px;\n padding-top: 8px;\n padding-bottom: 4px;\n border-top: 0.5px solid var(--dsg-hairline-soft);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_footArea'] button {\n border-radius: 10px;\n color: var(--dsw-alias-label-secondary);\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_footArea'] button:hover {\n background: var(--dsg-row-hover);\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [data-slot='sidebar.settings'] button {\n min-height: 38px;\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_footArea'] [class*='_avatar'] {\n border-radius: 999px;\n box-shadow: inset 0 0 0 0.5px var(--dsg-hairline-soft);\n}\n/* 「新版本」小胶囊:品牌蓝弱底 */\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_indicator'] {\n height: 26px;\n border-radius: 999px;\n border: 0.5px solid rgba(77, 107, 254, 0.22);\n background: var(--dsg-blue-soft);\n color: var(--dsg-blue);\n font-size: 11.5px;\n font-weight: 500;\n transition: background-color 140ms var(--dsg-ease), transform 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_indicator']:hover {\n background: rgba(77, 107, 254, 0.18);\n transform: translateY(-1px);\n}\n\n/* ---- 7. 收起态(56px rail):不要胶囊化,也不叠底 ---------------------- */\n/* 收起态两个 28×28 的标题栏按钮(展开/折叠 + 新建会话)由宿主用 position:fixed\n 钉在原生标题栏里;这里必须把几何完全交回宿主(28×28、无 margin/内边距),\n 只统一“材质”—— 否则基础规则的 38px 高/12px 圆角/品牌蓝图标会把 + 号顶歪。*/\nhtml[data-dsg='on'] [data-sidebar-collapsed] [data-slot='sidebar'] button[class*='_newSession'] {\n width: 28px !important;\n height: 28px !important;\n min-width: 28px !important;\n min-height: 28px !important;\n margin: 0 !important;\n padding: 0 !important;\n border: none !important;\n border-radius: 8px !important;\n background: transparent !important;\n box-shadow: none !important;\n transform: none !important;\n color: var(--dsw-alias-label-secondary) !important;\n}\nhtml[data-dsg='on'] [data-sidebar-collapsed] [data-slot='sidebar'] button[class*='_newSession'] [class*='_newSessionContent'] {\n padding: 0 !important;\n gap: 0 !important;\n justify-content: center !important;\n}\n/* 收起态的 + 号回到中性墨色(品牌蓝只留给展开态的主 CTA),并与 panel 图标同尺寸 */\nhtml[data-dsg='on'] [data-sidebar-collapsed] [data-slot='sidebar'] button[class*='_newSession'] [class*='_newSessionContent'] > svg {\n color: var(--dsw-alias-label-secondary) !important;\n width: 16px !important;\n height: 16px !important;\n}\nhtml[data-dsg='on'] [data-sidebar-collapsed] [data-slot='sidebar'] button[class*='_newSession']:hover {\n background: var(--dsg-row-hover) !important;\n color: var(--dsw-alias-label-primary) !important;\n}\nhtml[data-dsg='on'] [data-sidebar-collapsed] [data-slot='sidebar'] button[class*='_newSession']:hover [class*='_newSessionContent'] > svg {\n color: var(--dsw-alias-label-primary) !important;\n}\n/* 收起按钮右上角是「桌面更新」徽标(6px 品牌蓝圆点);收起态只需要一个干净的\n panel 图标 —— 更新提示仍保留在展开态 footer 的「新版本」胶囊里。 */\nhtml[data-dsg='on'] [data-sidebar-collapsed] [data-slot='sidebar'] button[class*='_toggle'] [class*='_badge'] {\n display: none !important;\n}\nhtml[data-dsg='on'] [data-sidebar-collapsed] [data-slot='sidebar'] [class*='_panelList'] {\n gap: 8px;\n}\nhtml[data-dsg='on'] [data-sidebar-collapsed] [data-slot='sidebar'] [class*='_panelRow'] {\n border-radius: 12px;\n background: transparent;\n}\nhtml[data-dsg='on'] [data-sidebar-collapsed] [data-slot='sidebar'] [class*='_panelRow']:hover {\n background: var(--dsg-row-hover);\n}\nhtml[data-dsg='on'] [data-sidebar-collapsed] [data-slot='sidebar'] [class*='_footArea'] {\n border-top: none;\n}\n\n/* ---- 8. 深色:蓝色柔光再压一档,避免发灰 -------------------------------- */\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-slot='sidebar'] nav[class*='_panelList'] button[class*='_panelActive'] {\n box-shadow: inset 0 0 0 0.5px rgba(123, 147, 255, 0.22);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-slot='sidebar'] button[class*='_newSession'] {\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.14),\n 0 1px 2px rgba(0, 0, 0, 0.35);\n}\n\n/* ===== 21-collapsed-titlebar.css ===== */\n/* 收起态(标题栏里的 rail 按钮)的 tooltip 修复 ---------------------------------\n Windows 标题栏里「展开/折叠」与「新建会话」两个按钮在收起态是 position:fixed、\n 位于侧栏列内;它们的 tooltip 因此落在侧栏列的层叠上下文里。悬浮 header 现在是\n 一条带霜的玻璃条,会盖住 tooltip 并把它染成一块灰黑\"阴影\"(用户看到的\"黑色阴影\")。\n 这里只在 tooltip 真的挂载时把 rail 提到 header 之上,让 tooltip 正常浮在下拉层,\n 不影响静止态层次。 */\nhtml[data-dsg='on'][data-windows-titlebar] div:has(> [data-slot='sidebar']):has([role='tooltip']) {\n z-index: 120;\n}\n\n/* ===== 22-drag-smooth.css ===== */\n/* ============================================================================\n dsh-skin-mistblue · 22 drag smooth (v1.12)\n ----------------------------------------------------------------------------\n Splitter drags drive pane width with a React state update per pointermove; the\n dockkit shell also keeps `transition: transform var(--ds-transition-duration-slow)`\n armed while open. That combination is what makes panes feel heavy and land\n early/late. Instead of fighting the host's pointer stream we keep the pointer\n behaviour untouched and simply:\n · start the expensive-material fallback on pointerdown (see client guard),\n · replace the shell's slow transform transition with a short *linear width\n chase* — the split follows the cursor through a 90ms linear interpolation,\n so a fast flick can never teleport the layout in one frame, while slow\n drags still feel 1:1,\n · drop scroll anchoring so reflow never scroll-compensates mid-drag.\n ========================================================================== */\n\nhtml[data-dsg='on'][data-dsg-resizing] [data-dockkit-host],\nhtml[data-dsg='on'][data-dsg-resizing] [data-dockkit-empty],\nhtml[data-dsg='on'][data-dsg-resizing] [data-dockkit-divider],\nhtml[data-dsg='on'][data-dsg-resizing] [data-dockkit-split],\nhtml[data-dsg='on'][data-dsg-resizing] [data-dockkit-cell],\nhtml[data-dsg='on'][data-dsg-resizing] [data-dockkit-pane],\nhtml[data-dsg='on'][data-dsg-resizing] [data-dockkit-surface] {\n transition: none !important;\n animation: none !important;\n}\n\n/* the moving edges chase the pointer with a bounded, linear follow */\nhtml[data-dsg='on'][data-dsg-resizing] [data-sidebar-right-panel],\nhtml[data-dsg='on'][data-dsg-resizing] div:has(> [data-slot='sidebar']),\nhtml[data-dsg='on'][data-dsg-resizing] [data-slot='sidebar'] {\n transition: width 90ms linear, transform 90ms linear !important;\n will-change: width;\n}\n\nhtml[data-dsg='on'][data-dsg-resizing] [data-conversation-region='chat'],\nhtml[data-dsg='on'][data-dsg-resizing] [data-chat-flow] {\n overflow-anchor: none;\n scroll-behavior: auto;\n}\n\nhtml[data-dsg='on'][data-dsg-resizing] [data-dockkit-divider] {\n cursor: col-resize;\n touch-action: none;\n}\n\n/* ===== 23-panel-reorder.css ===== */\n/* ============================================================================\n dsh-skin-mistblue · 23 panel reorder (v1.13)\n ----------------------------------------------------------------------------\n Client half (`initSidebarEnhancer`) adds two behaviours to the left sidebar\n panel list (插件 / 上下文洞察 / MCP 连接器 …):\n · drag a row up/down to reorder it (per-row CSS `order`, persisted);\n · click the already-open row again to return to the previous view.\n The host owns the DOM, so reordering is done with `style.order` on the flex\n column (no node moves → React keys and hit areas stay intact).\n ========================================================================== */\n\nhtml[data-dsg='on'] nav[class*='_panelList'] > button[class*='_panelRow'] {\n cursor: grab;\n transition:\n transform 120ms var(--dsg-ease),\n box-shadow 120ms var(--dsg-ease),\n background-color 120ms var(--dsg-ease);\n}\n\nhtml[data-dsg='on'][data-dsg-panel-drag] body {\n user-select: none;\n cursor: grabbing;\n}\n\nhtml[data-dsg='on'] nav[class*='_panelList'] > button[class*='_panelRow'].dsg-panel-row-drag {\n position: relative;\n z-index: 3;\n cursor: grabbing;\n opacity: 0.94;\n transform: scale(1.015);\n background-color: var(--dsg-row-hover) !important;\n box-shadow:\n 0 10px 24px -10px rgba(23, 48, 108, 0.38),\n inset 0 1px 0 rgba(255, 255, 255, 0.42);\n}\n\nhtml[data-dsg='on'] body[data-ds-dark-theme]\n nav[class*='_panelList'] > button[class*='_panelRow'].dsg-panel-row-drag {\n box-shadow:\n 0 12px 26px -12px rgba(0, 0, 0, 0.6),\n inset 0 1px 0 rgba(255, 255, 255, 0.12);\n}\n\n/* ===== 30-composer.css ===== */\n/* ============================================================================\n dsh-skin-mistblue · 30 composer — 输入座位 / 输入卡 / 工具行 / 发送键 / dock 胶囊 / goal bar\n Owner: shell-dev.\n\n 硬约束(UI-CONTRACT §3 / GLASS-SPEC §5 #89):\n · [data-composer-seat] 不铺底、不挂霜(内部有外部插件塞进来的 position:fixed 座位)。\n · [data-composer-card] 本体 backdrop-filter:none;霜只挂 ::before(伪元素无后代,\n 永不成为 fixed 包含块)。\n · 卡片自身的 background / sheen / bevel 画在本体上 —— 它比 ::before 的负 z-index\n 后绘制,所以霜在“填充层之下”,高光是锐的。\n ========================================================================== */\n\n/* ---- 1. 座位:纯容器,不铺底不挂霜 -------------------------------------- */\nhtml[data-dsg='on'] [data-composer-seat],\nhtml[data-dsg='on'] [data-conversation-region='composer'] {\n background: none !important;\n -webkit-backdrop-filter: none !important;\n backdrop-filter: none !important;\n box-shadow: none;\n}\n/* composer 区域宽度:DeepSeek 参考图口径 732–760,不跟 chat 列一起收窄;\n dock / goal bar 读同一个变量,保持左右对齐(Lead 口径 min(760px, 100% - 48px))。 */\nhtml[data-dsg='on'] [data-conversation-region='chat'] {\n --dsh-composer-card-max-width: min(calc(100% - 48px), 760px);\n}\nhtml[data-dsg='on'] [data-goal-bar] [class*='_bar'] {\n max-width: var(--dsh-composer-card-max-width) !important;\n}\n\n/* ---- 2. 输入卡:L2 玻璃,radius 28 ------------------------------------- */\nhtml[data-dsg='on'] [data-composer-card] {\n border-radius: var(--dsg-radius-composer) !important;\n border: 0 !important;\n background: var(--dsg-fill-l2) !important;\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.55),\n inset 0 -1px 0 rgba(255, 255, 255, 0.1),\n inset 0 0 0 0.5px rgba(255, 255, 255, 0.22),\n 0 18px 44px -18px rgba(44, 74, 140, 0.28),\n 0 2px 8px rgba(44, 74, 140, 0.06);\n -webkit-backdrop-filter: none !important;\n backdrop-filter: none !important;\n transition: box-shadow 200ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-composer-card] {\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.14),\n inset 0 -1px 0 rgba(255, 255, 255, 0.05),\n inset 0 0 0 0.5px rgba(255, 255, 255, 0.1),\n 0 18px 44px -18px rgba(0, 0, 0, 0.55),\n 0 2px 8px rgba(0, 0, 0, 0.25);\n}\n/* 霜:唯一载体 */\nhtml[data-dsg='on'] [data-composer-card]::before {\n content: '';\n position: absolute;\n inset: 0;\n z-index: -1;\n border-radius: inherit;\n pointer-events: none;\n -webkit-backdrop-filter: var(--dsg-backdrop-l2);\n backdrop-filter: var(--dsg-backdrop-l2);\n}\n/* focus:不要过亮,只加一圈品牌蓝柔光 */\nhtml[data-dsg='on'] [data-composer-card]:focus-within {\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.6),\n inset 0 -1px 0 rgba(255, 255, 255, 0.1),\n inset 0 0 0 0.5px rgba(255, 255, 255, 0.24),\n 0 0 0 2px rgba(77, 107, 254, 0.28),\n 0 18px 48px -18px rgba(44, 74, 140, 0.3);\n}\n\n/* ---- 3. 输入文字 / placeholder ----------------------------------------- */\nhtml[data-dsg='on'] [data-composer-card] [class*='_input'] {\n font-size: 15px !important;\n line-height: 25px !important;\n min-height: 40px;\n padding: 6px 10px 0 14px !important;\n color: var(--dsw-alias-label-primary);\n caret-color: var(--dsg-blue);\n}\nhtml[data-dsg='on'] [data-composer-card] [class*='_placeholder'] {\n top: 6px !important;\n left: 14px !important;\n right: 10px !important;\n font-size: 15px !important;\n line-height: 25px;\n color: var(--dsw-alias-label-caption) !important;\n}\nhtml[data-dsg='on'] [data-composer-card] [class*='_row'] {\n gap: 10px;\n padding: 2px 8px 7px !important;\n}\n\n/* ---- 4. 工具行:+ / 权限 / 模型 胶囊化 ---------------------------------- */\n/* + 号:白釉圆钮 */\nhtml[data-dsg='on'] [data-composer-card] button[class*='_add'] {\n width: 30px;\n height: 30px;\n border-radius: 999px;\n border: 0.5px solid var(--dsg-hairline-soft);\n background: var(--dsg-capsule) !important;\n color: var(--dsw-alias-label-secondary);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.4), 0 1px 2px rgba(23, 42, 84, 0.05);\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease),\n transform 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-composer-card] button[class*='_add']:hover:not(:disabled) {\n background: var(--dsg-capsule-hover) !important;\n color: var(--dsw-alias-label-primary);\n transform: translateY(-1px);\n}\n/* 权限选择器 */\nhtml[data-dsg='on'] [data-slot='conversation.input.permission'] button {\n height: 28px;\n padding: 0 9px 0 8px;\n gap: 5px;\n border-radius: 999px;\n color: var(--dsw-alias-label-secondary);\n font-size: 12.5px;\n font-weight: 500;\n background: var(--dsg-capsule);\n border: 0.5px solid var(--dsg-hairline-soft);\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease),\n border-color 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='conversation.input.permission'] button:hover:not(:disabled) {\n background: var(--dsg-capsule-hover);\n border-color: rgba(77, 107, 254, 0.2);\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-slot='conversation.input.permission'] button [class*='_triggerIcon'] {\n color: var(--dsw-alias-label-tertiary);\n}\n/* 模型选择器:胶囊 + 1017 蓝标 + High 弱化 */\nhtml[data-dsg='on'] [data-slot='conversation.input.model'] button {\n height: 28px;\n padding: 0 10px 0 9px;\n gap: 5px;\n border-radius: 999px;\n background: var(--dsg-capsule);\n border: 0.5px solid var(--dsg-hairline-soft);\n color: var(--dsw-alias-label-secondary);\n font-size: 12.5px;\n font-weight: 500;\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease),\n border-color 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='conversation.input.model'] button:hover:not(:disabled),\nhtml[data-dsg='on'] [data-slot='conversation.input.model'] button[aria-expanded='true'] {\n background: var(--dsg-capsule-hover);\n border-color: rgba(77, 107, 254, 0.2);\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-slot='conversation.input.model'] [data-tone='info'] {\n height: 16px;\n padding: 0 5px;\n border-radius: 5px;\n background: var(--dsg-blue-soft);\n color: var(--dsg-blue);\n font-size: 10px;\n font-weight: 600;\n line-height: 16px;\n}\nhtml[data-dsg='on'] [data-slot='conversation.input.model'] [class*='_triggerEffort'] {\n color: var(--dsw-alias-label-caption);\n font-weight: 400;\n}\nhtml[data-dsg='on'] [data-slot='conversation.input.model'] [class*='_chevron'] {\n color: var(--dsw-alias-label-caption);\n}\n\n/* ---- 5. 发送 / 停止:DeepSeek 蓝圆钮 ----------------------------------- */\nhtml[data-dsg='on'] [data-composer-card] button[class*='_primary'] {\n width: 34px;\n height: 34px;\n border-radius: 999px;\n background: var(--dsg-blue) !important;\n color: #fff;\n border: none;\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.26),\n 0 6px 18px -6px rgba(77, 107, 254, 0.55);\n transform: translateY(-1px);\n transition: background-color 140ms var(--dsg-ease), transform 140ms var(--dsg-ease),\n box-shadow 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-composer-card] button[class*='_primary']:hover:not(:disabled) {\n background: var(--dsg-blue-strong) !important;\n transform: translateY(-2px);\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.3),\n 0 10px 22px -6px rgba(77, 107, 254, 0.6);\n}\nhtml[data-dsg='on'] [data-composer-card] button[class*='_primary']:active:not(:disabled) {\n transform: translateY(0) scale(0.94);\n}\nhtml[data-dsg='on'] [data-composer-card] button[class*='_primary']:disabled {\n opacity: 1 !important;\n cursor: default;\n background: rgba(77, 107, 254, 0.3) !important;\n box-shadow: none;\n transform: none;\n color: rgba(255, 255, 255, 0.85);\n}\nhtml[data-dsg='on'] [data-composer-card] button[class*='_primary'] svg {\n width: 18px;\n height: 18px;\n}\n\n/* ---- 6. composer dock:统计 / 上下文占用 = 小胶囊 ----------------------- */\nhtml[data-dsg='on'] [data-composer-dock] {\n gap: 6px;\n padding-top: 4px;\n}\nhtml[data-dsg='on'] [data-composer-dock] [class*='_pill'],\nhtml[data-dsg='on'] [data-composer-dock] [class*='_trigger'] {\n height: 24px;\n padding: 0 9px;\n border-radius: 999px;\n background: var(--dsg-capsule);\n border: 0.5px solid var(--dsg-hairline-soft);\n color: var(--dsw-alias-label-tertiary);\n font-size: 11.5px;\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease),\n border-color 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-composer-dock] [class*='_pill']:hover,\nhtml[data-dsg='on'] [data-composer-dock] [class*='_trigger']:hover,\nhtml[data-dsg='on'] [data-composer-dock] [class*='_pill'][aria-expanded='true'],\nhtml[data-dsg='on'] [data-composer-dock] [class*='_trigger'][aria-expanded='true'] {\n background: var(--dsg-capsule-hover);\n border-color: var(--dsg-hairline-soft);\n color: var(--dsw-alias-label-secondary);\n}\nhtml[data-dsg='on'] [data-composer-dock] [class*='_pill'] svg,\nhtml[data-dsg='on'] [data-composer-dock] [class*='_trigger'] svg {\n width: 13px;\n height: 13px;\n}\n\n/* ---- 7. goal bar:L2 + 蓝色强调 ---------------------------------------- */\nhtml[data-dsg='on'] [data-goal-bar] [class*='_bar'] {\n border-radius: 999px !important;\n height: 34px;\n isolation: auto; /* 宿主 isolate 会建 backdrop root,霜失效 */\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.45), 0 6px 18px rgba(44, 74, 140, 0.08);\n}\nhtml[data-dsg='on'] [data-goal-bar] [class*='_bar']::before {\n background: var(--dsg-fill-l2);\n -webkit-backdrop-filter: var(--dsg-backdrop-l1);\n backdrop-filter: var(--dsg-backdrop-l1);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-goal-bar] [class*='_bar'] {\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08), 0 6px 18px rgba(0, 0, 0, 0.3);\n}\nhtml[data-dsg='on'] [data-goal-bar] [class*='_goalGlyph'] {\n color: var(--dsg-blue);\n}\nhtml[data-dsg='on'] [data-goal-bar] [class*='_label'] {\n color: var(--dsw-alias-label-primary);\n font-weight: 600;\n}\nhtml[data-dsg='on'] [data-goal-bar] [class*='_objective'] {\n color: var(--dsw-alias-label-secondary);\n}\nhtml[data-dsg='on'] [data-goal-bar] [class*='_iconBtn'] {\n border-radius: 999px;\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-goal-bar] [class*='_iconBtn']:hover {\n background: var(--dsg-row-hover);\n color: var(--dsw-alias-label-secondary);\n}\n/* ---- 8. 无霜降级:fill 已由 foundation 抬到近不透明,保持布局不变 -------- */\n@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {\n html[data-dsg='on'] [data-composer-card] {\n background: rgba(252, 253, 255, 0.94) !important;\n }\n html[data-dsg='on'] body[data-ds-dark-theme] [data-composer-card] {\n background: rgba(16, 26, 44, 0.96) !important;\n }\n}\n\n/* ===== 35-hero.css ===== */\n/* ============================================================================\n dsh-skin-mistblue · 35 hero — 空会话 Hero(品牌标记 / 大标题 / lede 位 / workspace 控件 / 输入卡)\n Owner: shell-dev.\n\n Hero 的真实结构(conversation 包 ConversationContent,phase=hero):\n [data-phase=\"hero\"] .Dc7zOa_composerHero\n ├ HeroShell.root (Hqq-bq_root) → stack → headline(fish + titleGroup + previewBadge)\n ├ heroWorkspaceRow(workspace / agentPreset 控件)\n ├ dock 槽(goal / todo,空则 display:none)\n └ inputBar([data-composer-card],hero 变体)\n 宿主在 hero 态把 [data-conversation-scroll] 设成 justify-content:center,\n 所以整组天然垂直居中;这里只做排版、字距、间距与控件胶囊化,不铺任何底板\n (SURFACE-MAP §4.2:Hero 不铺底,避免与输入卡重复加雾)。\n ========================================================================== */\n\n/* ---- 1. 组内节奏:标题 → 控件 → 输入卡 --------------------------------- */\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_composerHero'] {\n gap: 14px;\n padding-bottom: 34px;\n}\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_composerHero'] > :first-child {\n margin-bottom: 6px;\n}\n\n/* ---- 2. Hero 标题:48px / 600 / 0.1em,东方气质的粗黑体 ---------------- */\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_headline'] {\n font-size: clamp(38px, 4.4vw, 48px);\n line-height: 1.22;\n font-weight: 600;\n letter-spacing: 0.1em;\n color: var(--dsw-alias-label-primary);\n text-wrap: balance;\n justify-content: center;\n gap: 12px;\n}\n/* 字距是给正文标题的;品牌标记与「预览版」角标不吃字距 */\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_titleGroup'] {\n gap: 0.28em;\n justify-content: center;\n}\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_fishHitbox'],\nhtml[data-dsg='on'] [data-phase='hero'] [data-slot='conversation.hero.brand.mark'] {\n color: var(--dsg-blue);\n margin-right: 0.1em;\n}\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_fishHitbox'] svg,\nhtml[data-dsg='on'] [data-phase='hero'] [data-slot='conversation.hero.brand.mark'] svg {\n width: 42px;\n height: 42px;\n color: var(--dsg-blue);\n}\n/* 「预览版」角标:品牌蓝弱底小胶囊 */\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_previewBadge'] {\n padding: 1px 8px;\n margin-top: 8px;\n border-radius: 999px;\n border: 0.5px solid rgba(77, 107, 254, 0.2);\n background: var(--dsg-blue-soft);\n color: var(--dsg-blue);\n font-family: var(--dsw-font-family);\n font-size: 11px;\n font-weight: 500;\n line-height: 18px;\n letter-spacing: 0.02em;\n align-self: center;\n}\n\n/* ---- 3. workspace / preset 控件:居中胶囊 ------------------------------- */\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_heroWorkspaceRow'] {\n justify-content: center;\n padding: 0 8px;\n margin-top: 0;\n gap: 8px;\n}\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_heroWorkspaceRow'] button,\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_heroOptions'] button,\nhtml[data-dsg='on'] [data-phase='hero'] [data-slot='conversation.hero.workspace'] button,\nhtml[data-dsg='on'] [data-phase='hero'] [data-slot='conversation.hero.agentPreset'] button {\n height: 30px;\n padding: 0 11px;\n gap: 6px;\n border-radius: 999px;\n border: 0.5px solid var(--dsg-hairline-soft);\n background: var(--dsg-capsule);\n color: var(--dsw-alias-label-secondary);\n font-size: 12.5px;\n font-weight: 500;\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease),\n transform 140ms var(--dsg-ease), border-color 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_heroWorkspaceRow'] button:hover,\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_heroOptions'] button:hover,\nhtml[data-dsg='on'] [data-phase='hero'] [data-slot='conversation.hero.workspace'] button:hover,\nhtml[data-dsg='on'] [data-phase='hero'] [data-slot='conversation.hero.agentPreset'] button:hover {\n background: var(--dsg-capsule-hover);\n border-color: rgba(77, 107, 254, 0.2);\n color: var(--dsw-alias-label-primary);\n transform: translateY(-1px);\n}\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_heroWorkspaceRow'] svg {\n color: var(--dsw-alias-label-tertiary);\n}\n\n/* ---- 4. Hero 里的输入卡:更高的呼吸感(宽度固定 760,不被 hero 变体的双层 padding 吃掉)--- */\n/* hero 结构是 composerHero(+32 clearance) → RlGAzG_root(padding 16×2) → card,\n 若继续用 `calc(100% - 48px)` 会算出 760−48=712;这里用绝对 760(max-width 不强制宽度,\n 窄窗仍按 100% 收缩)。 */\nhtml[data-dsg='on'] [data-phase='hero'] {\n --dsh-composer-card-max-width: 760px;\n}\nhtml[data-dsg='on'] [data-phase='hero'] [data-composer-card] {\n border-radius: 28px;\n}\nhtml[data-dsg='on'] [data-phase='hero'] [data-composer-card] [class*='_input'] {\n min-height: 54px;\n padding-top: 10px !important;\n font-size: 15.5px !important;\n line-height: 26px !important;\n}\nhtml[data-dsg='on'] [data-phase='hero'] [data-composer-card] [class*='_placeholder'] {\n top: 10px !important;\n font-size: 15.5px !important;\n line-height: 26px;\n}\n/* hero 态 dock 为空时不留缝 */\nhtml[data-dsg='on'] [data-phase='hero'] [data-composer-dock]:empty {\n display: none;\n}\n\n/* ---- 5. 入场:轻微上浮(240ms,reduced-motion 由 foundation 收掉) ------ */\n@keyframes dsg-hero-rise {\n from {\n opacity: 0;\n transform: translateY(8px);\n }\n to {\n opacity: 1;\n transform: none;\n }\n}\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_composerHero'] > * {\n animation: dsg-hero-rise 260ms var(--dsg-ease) both;\n}\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_composerHero'] > :nth-child(2) {\n animation-delay: 60ms;\n}\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_composerHero'] > :nth-child(3) {\n animation-delay: 110ms;\n}\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_composerHero'] > :nth-child(4) {\n animation-delay: 150ms;\n}\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_headline'] {\n animation: dsg-hero-rise 300ms var(--dsg-ease) both;\n}\n\n/* ---- 6. 深色:品牌蓝标记提亮 ------------------------------------------- */\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-phase='hero'] [class*='_fishHitbox'] svg,\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-phase='hero'] [data-slot='conversation.hero.brand.mark'] svg {\n color: #9fb4ff;\n}\n\n/* ===== 40-content.css ===== */\n/* ============================================================================\n dsh-skin-mistblue · 40 content surfaces (conversation, cards, code, tools)\n ----------------------------------------------------------------------------\n Tier map (docs/DESIGN-SPEC §7.4 + UI-CONTRACT §3):\n L1 content canvas / long tool output plates → fill-l1, no canvas blur\n L2 user bubbles, think trigger, tool rows, deliverable/plan cards\n L3 (owned by 50-overlays.css) dialogs, menus, question/plan/approval\n Hard rules honoured here:\n · every [class*=\"_bubble\"] rule carries :not([role=\"tooltip\"])\n · no backdrop-filter on scroll containers ([data-conversation-scroll])\n · code / logs / terminal / inline code keep a near-opaque plate\n · sticky carriers (code banner, reasoning header) are re-painted, because\n foundation made --dsw-alias-bg-base transparent\n ========================================================================== */\n\n/* ---- local high-opacity plates (readability floor for code/logs) --------- */\nhtml[data-dsg='on'] body {\n --dsg-code-solid: rgba(255, 255, 255, 0.86);\n --dsg-code-banner: rgba(255, 255, 255, 0.95);\n --dsg-code-inline: rgba(255, 255, 255, 0.88);\n --dsg-tool-plate: rgba(255, 255, 255, 0.8);\n --dsg-tool-plate-strong: rgba(255, 255, 255, 0.9);\n --dsg-row-capsule: color-mix(in srgb, var(--dsg-blue) 4%, var(--dsg-fill-l2));\n --dsg-row-capsule-hover: color-mix(in srgb, var(--dsg-blue) 8%, var(--dsg-fill-l2));\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] {\n --dsg-code-solid: rgba(18, 27, 45, 0.9);\n --dsg-code-banner: rgba(22, 32, 52, 0.96);\n --dsg-code-inline: rgba(24, 35, 56, 0.92);\n --dsg-tool-plate: rgba(17, 26, 43, 0.86);\n --dsg-tool-plate-strong: rgba(20, 30, 49, 0.94);\n --dsg-row-capsule: color-mix(in srgb, var(--dsg-blue) 12%, var(--dsg-fill-l2));\n --dsg-row-capsule-hover: color-mix(in srgb, var(--dsg-blue) 18%, var(--dsg-fill-l2));\n}\n\n/* ============================================================================\n 1. conversation flow rhythm\n ========================================================================== */\nhtml[data-dsg='on'] [data-chat-flow] {\n --dsh-chat-flow-gap: 10px;\n}\n/* slight breathing room after a user turn / before tool groups */\nhtml[data-dsg='on'] [data-chat-flow] > [data-chat-flow-kind='user'] {\n margin-bottom: 4px;\n}\nhtml[data-dsg='on'] [data-chat-flow] > [data-chat-flow-kind='turn-process'] {\n margin-top: 6px;\n}\n\n/* ============================================================================\n 2. user bubbles — L2 glass (soft blue-white), readable ink\n ========================================================================== */\nhtml[data-dsg='on'] [class*='_bubble']:not([role='tooltip']) {\n position: relative;\n background-color: color-mix(in srgb, var(--dsg-blue) 9%, var(--dsg-fill-l2));\n background-image: var(--dsg-sheen-l2);\n -webkit-backdrop-filter: var(--dsg-backdrop-l2);\n backdrop-filter: var(--dsg-backdrop-l2);\n border-radius: var(--dsg-radius-card);\n box-shadow:\n var(--dsg-bevel-l2),\n 0 0 0 0.5px rgba(77, 107, 254, 0.14);\n color: var(--dsw-alias-label-primary);\n line-height: 1.62;\n transition:\n box-shadow var(--dsg-motion-dur) var(--dsg-ease),\n background-color var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [class*='_bubble']:not([role='tooltip']):hover {\n box-shadow:\n var(--dsg-bevel-l2),\n 0 0 0 0.5px rgba(77, 107, 254, 0.16);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] [class*='_bubble']:not([role='tooltip']) {\n background-color: color-mix(in srgb, var(--dsg-blue) 12%, var(--dsg-fill-l2));\n box-shadow:\n var(--dsg-bevel-l2),\n 0 0 0 0.5px rgba(120, 150, 255, 0.16);\n}\n/* the assistant text column has no plate — it sits on the L1 canvas */\nhtml[data-dsg='on'] [data-chat-flow] [class*='_userStack'] {\n gap: 8px;\n}\n\n/* ============================================================================\n 3. disclosure capsules — think trigger rows + tool call rows (L2)\n ========================================================================== */\nhtml[data-dsg='on'] [data-chat-flow] [data-disclosure-header] {\n box-sizing: border-box;\n border-radius: 12px;\n background-color: var(--dsg-fill-l1);\n background-image: var(--dsg-sheen-l1);\n box-shadow: inset 0 0 0 0.5px rgba(255, 255, 255, 0.32);\n padding: 1px 8px;\n transition:\n background-color var(--dsg-motion-dur) var(--dsg-ease),\n box-shadow var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-chat-flow] :is([data-variant='think'], [data-tool]) [data-disclosure-header] {\n background-color: var(--dsg-row-capsule);\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.45),\n inset 0 0 0 0.5px rgba(56, 88, 158, 0.12);\n}\nhtml[data-dsg='on'] [data-chat-flow] [data-disclosure-header]:hover,\nhtml[data-dsg='on'] [data-chat-flow] [data-disclosure-header]:has(> [data-disclosure-row][aria-expanded='true']) {\n background-color: var(--dsg-row-capsule-hover);\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.55),\n inset 0 0 0 0.5px rgba(56, 88, 158, 0.16),\n 0 6px 18px -12px rgba(44, 74, 140, 0.45);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-chat-flow] :is([data-variant='think'], [data-tool]) [data-disclosure-header] {\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.12),\n inset 0 0 0 0.5px rgba(150, 180, 255, 0.14);\n}\n\n/* turn trigger strip (recorded trigger above a turn) — L2 glass card */\nhtml[data-dsg='on'] [data-turn-trigger] {\n background-color: color-mix(in srgb, var(--dsg-blue) 4%, var(--dsg-fill-l2));\n background-image: var(--dsg-sheen-l2);\n -webkit-backdrop-filter: var(--dsg-backdrop-l2);\n backdrop-filter: var(--dsg-backdrop-l2);\n border: 0;\n border-radius: var(--dsg-radius-card);\n box-shadow: var(--dsg-bevel-l2);\n transition: box-shadow var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-turn-trigger]:hover {\n background-color: color-mix(in srgb, var(--dsg-blue) 7%, var(--dsg-fill-l2));\n background-image: var(--dsg-sheen-l2);\n box-shadow:\n var(--dsg-bevel-l2),\n 0 0 0 0.5px rgba(77, 107, 254, 0.14);\n}\nhtml[data-dsg='on'] [data-turn-trigger] [class*='_header'] {\n border-radius: inherit;\n}\nhtml[data-dsg='on'] [data-turn-trigger] [class*='_header']:hover {\n background-color: transparent;\n}\n\n/* ============================================================================\n 4. reasoning (think) — expanded body stays transparent, sticky header painted\n ========================================================================== */\nhtml[data-dsg='on'] [data-variant='think'] [class*='_thinkBody'] {\n color: var(--dsw-alias-label-secondary);\n line-height: 1.66;\n}\nhtml[data-dsg='on'] [data-variant='think'] [data-open] [data-disclosure-header] {\n background-color: var(--dsg-code-banner);\n background-image: none;\n border-radius: 10px;\n box-shadow: 0 1px 0 var(--dsg-border-hair);\n}\n/* compaction / context fold sticky header (was --dsw-alias-bg-base = transparent) */\nhtml[data-dsg='on'] [class*='_compactionRow']:has([class*='_compactionBody']) [class*='_compactionButton'] {\n background-color: var(--dsg-code-banner);\n box-shadow: 0 1px 0 var(--dsg-border-hair);\n}\n\n/* ============================================================================\n 5. tool results — flat L1 plates, near opaque (code / logs / diffs)\n ========================================================================== */\nhtml[data-dsg='on'] [data-slot='tool.call.toolview'] [data-inspect],\nhtml[data-dsg='on'] [data-chat-flow-kind='context'] [data-context-injection-body],\nhtml[data-dsg='on'] [data-terminal],\nhtml[data-dsg='on'] [data-tool='read'] [data-read],\nhtml[data-dsg='on'] [data-tool='grep'] [data-search='matches'],\nhtml[data-dsg='on'] [data-tool='glob'] [data-search='paths'],\nhtml[data-dsg='on'] [data-tool='write'] [data-diff],\nhtml[data-dsg='on'] [data-variant='others'] [class*='_ioCard'] {\n background-color: var(--dsg-tool-plate);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 12px;\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.35),\n 0 10px 28px -22px rgba(44, 74, 140, 0.4);\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-slot='tool.call.toolview'] [data-inspect],\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-terminal],\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-tool='read'] [data-read],\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-tool='grep'] [data-search='matches'],\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-tool='glob'] [data-search='paths'],\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-tool='write'] [data-diff] {\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.08),\n 0 10px 28px -22px rgba(0, 0, 0, 0.6);\n}\n/* long scroll bodies keep their own plate; never add blur here */\nhtml[data-dsg='on'] [data-slot='tool.call.toolview'] [class*='_bodyScroll'],\nhtml[data-dsg='on'] [data-slot='tool.call.toolview'] [class*='_list'] {\n scrollbar-gutter: stable;\n}\n/* diff semantic colours stay untouched (host tokens) but need a solid floor */\nhtml[data-dsg='on'] [data-tool='write'] [data-diff] [data-diff-line],\nhtml[data-dsg='on'] [data-review-view] [class*='_line'],\nhtml[data-dsg='on'] [data-review-view] [class*='_splitLine'] {\n box-shadow: none;\n}\n\n/* ============================================================================\n 6. code blocks — near-opaque plate + painted sticky banner\n ========================================================================== */\nhtml[data-dsg='on'] .md-code-block {\n --dsl-code-block-background: transparent;\n --dsl-code-block-banner-background-color: var(--dsg-code-banner);\n background-color: var(--dsg-code-solid);\n background-image: var(--dsg-sheen-l1);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 14px;\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.45),\n 0 14px 34px -26px rgba(44, 74, 140, 0.5);\n /* no overflow:hidden here — it would kill the banner's position:sticky */\n}\nhtml[data-dsg='on'] .md-code-block :where(pre) {\n padding: 13px 16px;\n border-radius: 0 0 14px 14px;\n}\nhtml[data-dsg='on'] .md-code-block [class*='_bannerWrap'] {\n background-color: var(--dsg-code-banner);\n border-radius: 14px 14px 0 0;\n box-shadow: 0 1px 0 var(--dsg-border-hair);\n}\nhtml[data-dsg='on'] .md-code-block [class*='_banner'] {\n background: transparent;\n padding: 7px 12px;\n}\nhtml[data-dsg='on'] .md-code-block [class*='_infostring'] {\n color: var(--dsw-alias-label-secondary);\n letter-spacing: 0.02em;\n}\nhtml[data-dsg='on'] .md-code-block [class*='_copyButton'] {\n border-radius: 8px;\n padding: 2px 8px;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-secondary);\n background-color: color-mix(in srgb, var(--dsg-blue) 6%, transparent);\n transition:\n background-color var(--dsg-motion-dur) var(--dsg-ease),\n color var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] .md-code-block [class*='_copyButton']:hover {\n background-color: var(--dsg-blue-soft);\n color: var(--dsg-blue-strong);\n}\nhtml[data-dsg='on'] .md-code-block [class*='_lineNumber'],\nhtml[data-dsg='on'] .md-code-block [class*='_numbered'] :where(pre) code > .line::before {\n color: var(--dsw-alias-label-caption);\n}\n\n/* inline code: opaque chip, never a backdrop-filter (inline boxes smear rows) */\nhtml[data-dsg='on'] [data-chat-flow] :not(pre) > code,\nhtml[data-dsg='on'] [class*='_markdown'] :not(pre) > code {\n background-color: color-mix(in srgb, var(--dsg-blue) 6%, var(--dsg-code-inline));\n border-color: rgba(77, 107, 254, 0.16);\n border-radius: 6px;\n color: var(--dsw-alias-label-primary);\n}\n\n/* ============================================================================\n 7. deliverables / plan cards / trajectory panes — L2 cards\n ========================================================================== */\nhtml[data-dsg='on'] [data-presented-file],\nhtml[data-dsg='on'] [data-changed-files],\nhtml[data-dsg='on'] [data-plan-card],\nhtml[data-dsg='on'] [data-plan-artifacts] > * {\n background-color: var(--dsg-fill-l2);\n background-image: var(--dsg-sheen-l2);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 14px;\n box-shadow: var(--dsg-bevel-l1);\n transition:\n box-shadow var(--dsg-motion-dur) var(--dsg-ease),\n background-color var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-presented-file]:hover,\nhtml[data-dsg='on'] [data-changed-files]:hover,\nhtml[data-dsg='on'] [data-plan-card]:hover {\n background-color: color-mix(in srgb, var(--dsg-blue) 4%, var(--dsg-fill-l2));\n box-shadow: var(--dsg-bevel-l2);\n}\n/* the plan card is a 60px row — give it a calmer inner surface */\nhtml[data-dsg='on'] [data-plan-card] {\n height: 60px;\n padding: 8px 12px;\n}\nhtml[data-dsg='on'] [data-plan-card] [class*='_cardIcon'] {\n background: color-mix(in srgb, var(--dsg-blue) 7%, rgba(255, 255, 255, 0.6));\n border: 0.5px solid rgba(77, 107, 254, 0.14);\n border-radius: 10px;\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-plan-card] [class*='_cardIcon'] {\n background: color-mix(in srgb, var(--dsg-blue) 16%, rgba(255, 255, 255, 0.04));\n}\n\n/* trajectory: big scrollable table pane → flat L2 wash, no backdrop-filter */\nhtml[data-dsg='on'] [class*='_tablePane'],\nhtml[data-dsg='on'] [class*='_overviewPreview'],\nhtml[data-dsg='on'] [class*='_programPanel'] {\n background-color: var(--dsg-fill-l2);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 14px;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.35);\n}\nhtml[data-dsg='on'] [class*='_tablePane']:has([data-trajectory-scroll]),\nhtml[data-dsg='on'] [class*='_overviewPreview'] {\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n}\n\n/* ============================================================================\n 8. message meta / actions — quiet hover, blue focus only\n ========================================================================== */\nhtml[data-dsg='on'] [data-chat-flow] [class*='_actions'] [class*='_action'] {\n border-radius: 8px;\n color: var(--dsw-alias-label-tertiary);\n transition: background-color var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-chat-flow] [class*='_actions'] [class*='_action']:hover {\n background-color: rgba(77, 107, 254, 0.08);\n color: var(--dsw-alias-label-secondary);\n}\n\n/* ============================================================================\n 9. fallback legs — no backdrop-filter support / software rasteriser\n ========================================================================== */\n@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {\n html[data-dsg='on'] [class*='_bubble']:not([role='tooltip']),\n html[data-dsg='on'] [data-turn-trigger] {\n background-color: var(--dsg-code-solid);\n background-image: none;\n }\n}\nhtml[data-dsg='on'] body[data-dsg-fallback] [class*='_bubble']:not([role='tooltip']),\nhtml[data-dsg='on'] body[data-dsg-fallback] [data-turn-trigger] {\n background-color: var(--dsg-code-solid);\n background-image: none;\n -webkit-backdrop-filter: none;\n backdrop-filter: none;\n}\n\n/* ===== 50-overlays.css ===== */\n/* ============================================================================\r\n dsh-skin-mistblue · 50 overlays (dialog / menu / toast / tooltip / prompts)\r\n ----------------------------------------------------------------------------\r\n Tier map:\r\n L3 dialogs, question / plan-review / approval cards, lightbox chrome\r\n token channel menus (--dsw-specific-menu / --dsw-menu-backdrop-filter)\r\n glass tip tooltips + chart hover tips (v1.9 — L2 frost, see §5)\r\n exempt hovercard (host preview card), native <select>, [data-windows-menu]\r\n Hard rules honoured here:\r\n · [class*=\"_bubble\"] rules always carry :not([role=\"tooltip\"])\r\n · menus are NOT re-painted (host already draws a material layer); only\r\n tokens + radius/rows are tuned — no double board\r\n · mask keeps using --dsw-mask-blur (tuned lighter here so the dialog's\r\n own frost is not stacked on top of a second large blur)\r\n · tooltips are glass with a legible high fill; hovercards / native menus\r\n keep the host material (frosted image previews would lose legibility)\r\n ========================================================================== */\r\n\r\n/* mask channel: the dialog owns the strong frost (L3); keep the backdrop\r\n scrim cheap so we never pay for two large blurs at once (GLASS-SPEC §5.9). */\r\n@supports ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {\r\n html[data-dsg='on'] body {\r\n --dsw-mask-blur: blur(calc(10px * var(--dsg-blur, 1))) saturate(1.18);\r\n }\r\n}\r\nhtml[data-dsg='on'] body[data-dsg-fallback] {\r\n --dsw-mask-blur: none;\r\n}\r\n\r\n/* ============================================================================\r\n 1. dialogs — L3 glass face\r\n ========================================================================== */\r\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true']:is(\r\n [class*='_dialog'],\r\n [class*='_panel'],\r\n [class*='_confirmation'],\r\n [class*='_installDialog'],\r\n [class*='_guideDialog']\r\n ) {\r\n background-color: var(--dsg-fill-l3);\r\n background-image: var(--dsg-sheen-l3);\r\n -webkit-backdrop-filter: var(--dsg-backdrop-l3);\r\n backdrop-filter: var(--dsg-backdrop-l3);\r\n border: 0;\r\n border-radius: var(--dsg-radius-modal);\r\n box-shadow: var(--dsg-bevel-l3);\r\n overflow: hidden;\r\n}\r\nhtml[data-dsg='on'] body[data-ds-dark-theme] [role='dialog'][aria-modal='true']:is(\r\n [class*='_dialog'],\r\n [class*='_panel'],\r\n [class*='_confirmation']\r\n ) {\r\n box-shadow:\r\n var(--dsg-bevel-l3),\r\n inset 0 0 0 0.5px rgba(150, 180, 255, 0.12);\r\n}\r\n\r\n/* dialog chrome: title / close / footer */\r\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true'] [class*='_title'] {\r\n font-weight: 600;\r\n letter-spacing: 0.005em;\r\n color: var(--dsw-alias-label-primary);\r\n}\r\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true'] [class*='_description'] {\r\n color: var(--dsw-alias-label-secondary);\r\n line-height: 1.62;\r\n}\r\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true'] [class*='_close'] {\r\n border-radius: 10px;\r\n color: var(--dsw-alias-label-secondary);\r\n background-color: transparent;\r\n transition:\r\n background-color var(--dsg-motion-dur) var(--dsg-ease),\r\n color var(--dsg-motion-dur) var(--dsg-ease);\r\n}\r\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true'] [class*='_close']:hover {\r\n background-color: var(--dsg-blue-soft);\r\n color: var(--dsg-blue-strong);\r\n}\r\n/* dialog fields stay opaque (readability on top of the frosted face) */\r\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true']\r\n :is(input, textarea, select):not([type='range']):not([type='checkbox']):not([type='radio']) {\r\n background-color: var(--dsg-code-solid);\r\n border-color: var(--dsg-border-hair);\r\n color: var(--dsw-alias-label-primary);\r\n}\r\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true'] [class*='_footer'] [class*='_button']:not([disabled]) {\r\n transition:\r\n background-color var(--dsg-motion-dur) var(--dsg-ease),\r\n box-shadow var(--dsg-motion-dur) var(--dsg-ease);\r\n}\r\n\r\n/* ============================================================================\r\n 2. question / plan-review / approval cards — L3 reading cards\r\n (they live in the composer seat, not in a portal: no fixed descendants)\r\n ========================================================================== */\r\nhtml[data-dsg='on'] [data-question-key] [class*='_card'],\r\nhtml[data-dsg='on'] [data-plan-review-key] [class*='_card'],\r\nhtml[data-dsg='on'] [data-approval-key] [class*='_card'] {\r\n --dsw-elevation-stroke-color: transparent;\r\n background-color: var(--dsg-fill-l3);\r\n background-image: var(--dsg-sheen-l3);\r\n -webkit-backdrop-filter: var(--dsg-backdrop-l3);\r\n backdrop-filter: var(--dsg-backdrop-l3);\r\n border: 0;\r\n border-radius: var(--dsg-radius-modal);\r\n box-shadow: var(--dsg-bevel-l3);\r\n color: var(--dsw-alias-label-primary);\r\n}\r\nhtml[data-dsg='on'] [data-question-key] [class*='_strip'],\r\nhtml[data-dsg='on'] [data-plan-review-key] [class*='_strip'],\r\nhtml[data-dsg='on'] [data-approval-key] [class*='_strip'] {\r\n border-bottom: 0.5px solid rgba(150, 110, 20, 0.14);\r\n font-weight: 500;\r\n}\r\n/* the action row must stay crisp above the frost */\r\nhtml[data-dsg='on'] [data-question-key] [class*='_footer']:not([class*='_footerActions']),\r\nhtml[data-dsg='on'] [data-plan-review-key] [class*='_footer']:not([class*='_footerActions']),\r\nhtml[data-dsg='on'] [data-approval-key] [class*='_actionRow'],\r\nhtml[data-dsg='on'] [data-approval-key] [class*='_footer']:not([class*='_footerActions']) {\r\n background-color: color-mix(in srgb, var(--dsg-tint) 24%, transparent);\r\n border-top: 0.5px solid var(--dsg-border-hair);\r\n}\r\n/* option rows inside a question card: opaque enough to read, hover in blue */\r\nhtml[data-dsg='on'] [data-question-key] :is(button, label)[class*='_option'],\r\nhtml[data-dsg='on'] [data-plan-review-key] :is(button, label)[class*='_option'] {\r\n background-color: color-mix(in srgb, var(--dsg-tint) 34%, transparent);\r\n border: 0.5px solid var(--dsg-border-hair);\r\n border-radius: 12px;\r\n transition:\r\n background-color var(--dsg-motion-dur) var(--dsg-ease),\r\n border-color var(--dsg-motion-dur) var(--dsg-ease);\r\n}\r\nhtml[data-dsg='on'] [data-question-key] :is(button, label)[class*='_option']:hover:not(:disabled),\r\nhtml[data-dsg='on'] [data-plan-review-key] :is(button, label)[class*='_option']:hover:not(:disabled) {\r\n background-color: color-mix(in srgb, var(--dsg-blue) 6%, var(--dsg-fill-l2));\r\n border-color: rgba(77, 107, 254, 0.24);\r\n}\r\nhtml[data-dsg='on'] [data-question-key] :is(button, label)[class*='_optionSelected'],\r\nhtml[data-dsg='on'] [data-plan-review-key] :is(button, label)[class*='_optionSelected'] {\r\n background-color: color-mix(in srgb, var(--dsg-blue) 9%, var(--dsg-fill-l2));\r\n border-color: rgba(77, 107, 254, 0.34);\r\n}\r\n\r\n/* ============================================================================\r\n 3. menus — token channel only (host draws the material layer)\r\n ========================================================================== */\r\nhtml[data-dsg='on'] [data-menu-material] {\r\n border-radius: 12px;\r\n}\r\nhtml[data-dsg='on'] [data-menu-material] > [class*='_material'] {\r\n border-radius: inherit;\r\n background: var(--dsw-menu-surface-fill);\r\n -webkit-backdrop-filter: var(--dsw-menu-backdrop-filter);\r\n backdrop-filter: var(--dsw-menu-backdrop-filter);\r\n box-shadow: inset 0 0 0 0.5px rgba(255, 255, 255, 0.28);\r\n}\r\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-menu-material] > [class*='_material'] {\r\n box-shadow: inset 0 0 0 0.5px rgba(150, 180, 255, 0.12);\r\n}\r\nhtml[data-dsg='on'] [data-menu-backing] {\r\n background-color: color-mix(in srgb, var(--dsg-tint) 86%, transparent);\r\n}\r\n/* rows / group headers / shortcuts (host radii kept, ink tuned) */\r\nhtml[data-dsg='on'] [data-menu-material] [role='menuitem'],\r\nhtml[data-dsg='on'] [data-menu-material] [role='menuitemcheckbox'],\r\nhtml[data-dsg='on'] [data-menu-material] [role='menuitemradio'],\r\nhtml[data-dsg='on'] [data-menu-material] button[class*='_item'] {\r\n border-radius: 9px;\r\n color: var(--dsw-alias-label-primary);\r\n}\r\nhtml[data-dsg='on'] [data-menu-material] [role='menuitem']:hover,\r\nhtml[data-dsg='on'] [data-menu-material] [role='menuitemcheckbox']:hover,\r\nhtml[data-dsg='on'] [data-menu-material] [role='menuitemradio']:hover,\r\nhtml[data-dsg='on'] [data-menu-material] button[class*='_item']:hover:not(:disabled) {\r\n background-color: var(--dsg-blue-soft);\r\n}\r\nhtml[data-dsg='on'] [data-menu-material] [class*='_label'] {\r\n color: var(--dsw-alias-label-tertiary);\r\n letter-spacing: 0.02em;\r\n}\r\nhtml[data-dsg='on'] [data-menu-material] [class*='_separator'] {\r\n background-color: var(--dsg-border-hair);\r\n}\r\nhtml[data-dsg='on'] [data-menu-material] [class*='_shortcut'] {\r\n color: var(--dsw-alias-label-caption);\r\n}\r\n\r\n/* ============================================================================\r\n 4. hovercard / popover previews — host already paints an opaque dark card\r\n (--dsw-hovercard-bg: #2C2C2E, white ink). We only soften its edge; never\r\n add glass here, a frosted hovercard drops contrast to ~1.1:1.\r\n ========================================================================== */\r\nhtml[data-dsg='on'] [class*='_preview']:has(> [class*='_previewPrompt']) {\r\n border-radius: 14px;\r\n box-shadow: var(--dsg-bevel-l3);\r\n}\r\n\r\n/* ============================================================================\r\n 5. tooltips — near-opaque glass plate (v1.10)\r\n ----------------------------------------------------------------------------\r\n Every hover-only tooltip shares one recipe:\r\n · DSH primitive tooltips → [role='tooltip']\r\n · dsh-context chart hover tips → .lc-tip / .lc-chart-tip\r\n · other plugin chart tips → [class*='chart-tip'] / [class*='chartTip']\r\n User feedback (v1.10): make them almost opaque — readable text wins, the plate\r\n keeps only ~4% translucency plus the 16px frost, sheen and hairline so it still\r\n reads as glass instead of a flat white box. Chart tips sit on the densest\r\n surface, so they are 96% instead of 94%.\r\n ========================================================================== */\r\nhtml[data-dsg='on'] {\r\n --dsg-tip-fill: color-mix(in srgb, #ffffff 94%, transparent);\r\n --dsg-tip-fill-chart: color-mix(in srgb, #ffffff 96%, transparent);\r\n --dsg-tip-border: rgba(255, 255, 255, 0.72);\r\n --dsg-tip-ink: var(--dsw-alias-label-primary);\r\n --dsg-tip-shadow:\r\n 0 12px 30px -14px rgba(23, 48, 108, 0.38),\r\n 0 2px 6px rgba(23, 48, 108, 0.09);\r\n}\r\nhtml[data-dsg='on'] body[data-ds-dark-theme] {\r\n --dsg-tip-fill: color-mix(in srgb, #0d1524 94%, transparent);\r\n --dsg-tip-fill-chart: color-mix(in srgb, #0d1524 96%, transparent);\r\n --dsg-tip-border: rgba(255, 255, 255, 0.18);\r\n --dsg-tip-shadow:\r\n 0 14px 34px -16px rgba(0, 0, 0, 0.6),\r\n 0 2px 8px rgba(0, 0, 0, 0.32);\r\n}\r\n\r\nhtml[data-dsg='on']\r\n :is(\r\n [role='tooltip'],\r\n .lc-tip,\r\n .lc-chart-tip,\r\n [class*='_chart-tip'],\r\n [class*='_chartTip']\r\n ) {\r\n background-color: var(--dsg-tip-fill) !important;\r\n background-image: var(--dsg-sheen-l2) !important;\r\n -webkit-backdrop-filter: var(--dsg-blur-l2) saturate(1.45) brightness(1.02);\r\n backdrop-filter: var(--dsg-blur-l2) saturate(1.45) brightness(1.02);\r\n border: 0.5px solid var(--dsg-tip-border) !important;\r\n border-radius: 10px;\r\n color: var(--dsg-tip-ink) !important;\r\n box-shadow: var(--dsg-tip-shadow);\r\n text-shadow: none;\r\n}\r\n\r\n/* DSH primitive tooltip: tiny plate + shortcut pills */\r\nhtml[data-dsg='on'] [role='tooltip'] {\r\n padding: 5px 9px;\r\n font-size: 12px;\r\n line-height: 18px;\r\n font-weight: 400;\r\n border-radius: 9px;\r\n}\r\nhtml[data-dsg='on'] [role='tooltip'] :is(kbd, [class*='_key']) {\r\n background-color: color-mix(in srgb, var(--dsg-tip-ink) 9%, transparent);\r\n border: 0.5px solid color-mix(in srgb, var(--dsg-tip-ink) 13%, transparent);\r\n border-radius: 4px;\r\n color: var(--dsg-tip-ink);\r\n}\r\nhtml[data-dsg='on'] [role='tooltip'] [class*='_shortcut'],\r\nhtml[data-dsg='on'] [role='tooltip'] [class*='_label'] {\r\n color: var(--dsg-tip-ink);\r\n}\r\n\r\n/* chart hover tips: denser fill + softer edge, always above the plot marks */\r\nhtml[data-dsg='on'] :is(.lc-tip, .lc-chart-tip, [class*='_chart-tip'], [class*='_chartTip']) {\r\n background-color: var(--dsg-tip-fill-chart) !important;\r\n -webkit-backdrop-filter: calc(var(--dsg-blur-l2) * 1.1) saturate(1.5) brightness(1.02);\r\n backdrop-filter: calc(var(--dsg-blur-l2) * 1.1) saturate(1.5) brightness(1.02);\r\n border-radius: 10px;\r\n padding: 6px 10px;\r\n color: var(--dsg-tip-ink) !important;\r\n z-index: 40;\r\n}\r\nhtml[data-dsg='on'] :is(.lc-chart-tip, [class*='_chart-tip'], [class*='_chartTip']) span + span {\r\n color: var(--dsw-alias-label-secondary);\r\n}\r\n\r\n/* no backdrop-filter: fill is already near-opaque, just push the last percents */\r\n@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {\r\n html[data-dsg='on']\r\n :is([role='tooltip'], .lc-tip, .lc-chart-tip, [class*='_chart-tip'], [class*='_chartTip']) {\r\n background-color: color-mix(in srgb, #ffffff 98%, transparent) !important;\r\n }\r\n html[data-dsg='on'] body[data-ds-dark-theme]\r\n :is([role='tooltip'], .lc-tip, .lc-chart-tip, [class*='_chart-tip'], [class*='_chartTip']) {\r\n background-color: color-mix(in srgb, #0d1524 98%, transparent) !important;\r\n }\r\n}\r\n\r\n/* ============================================================================\r\n 6. toast — L3 shape, opaque deep plate (contrast first)\r\n ========================================================================== */\r\nhtml[data-dsg='on'] [class*='_toast'] {\r\n border-radius: 14px;\r\n padding: 12px 16px;\r\n font-size: 13px;\r\n line-height: 20px;\r\n box-shadow:\r\n 0 18px 48px rgba(23, 48, 108, 0.24),\r\n inset 0 1px 0 rgba(255, 255, 255, 0.12);\r\n -webkit-backdrop-filter: none;\r\n backdrop-filter: none;\r\n}\r\nhtml[data-dsg='on'] [class*='_toast'] [class*='_action'] {\r\n color: var(--dsw-static-deepseek-400);\r\n}\r\n\r\n/* ============================================================================\r\n 7. image lightbox — chrome only, the image itself stays opaque (L0)\r\n ========================================================================== */\r\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true']:has(> [class*='_stage']) {\r\n background: none;\r\n box-shadow: none;\r\n -webkit-backdrop-filter: none;\r\n backdrop-filter: none;\r\n}\r\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true'] [class*='_image'] {\r\n background-color: var(--dsg-code-solid);\r\n border-radius: 16px;\r\n box-shadow: var(--dsg-bevel-l3);\r\n}\r\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true'] [class*='_close'] {\r\n -webkit-backdrop-filter: var(--dsg-backdrop-l2);\r\n backdrop-filter: var(--dsg-backdrop-l2);\r\n background-color: color-mix(in srgb, var(--dsg-tint) 64%, transparent);\r\n box-shadow: var(--dsg-bevel-l2);\r\n}\r\n\r\n/* ============================================================================\r\n 8. native surfaces — stay opaque (Windows menu, <select> popup rows)\r\n ========================================================================== */\r\nhtml[data-dsg='on'] [data-windows-menu] {\r\n background-color: var(--dsw-alias-bg-layer-3);\r\n -webkit-backdrop-filter: none;\r\n backdrop-filter: none;\r\n}\r\nhtml[data-dsg='on'] select,\r\nhtml[data-dsg='on'] option {\r\n background-color: var(--dsg-tint);\r\n color: var(--dsw-alias-label-primary);\r\n}\n\n/* ===== 60-settings.css ===== */\n/* ============================================================================\n dsh-skin-mistblue · 60 settings / plugin pages / right sidebar / preview\n ----------------------------------------------------------------------------\n Tier map:\n L3 settings window, fullscreen right panel, document preview paper\n L2 settings cards, plugin list/detail cards, right-panel shell, tabs\n L1 pane bodies, page canvases\n Hard rules honoured here:\n · settings window fill L3 + own frost ≤12px (never a 24px full-window blur)\n · inner scrollers (settings options / right pane body) never get blur\n · right panel needs the dockkit z-index lift once backdrop-filter is on\n · text / code / pdf / office preview keep an opaque paper plate\n ========================================================================== */\n\n/* ============================================================================\n 1. settings window — L3 face, capped frost\n ========================================================================== */\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true'][data-shortcut-modal='settings'],\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true']:has([data-slot='settings.section']) {\n background-color: var(--dsg-fill-l3);\n background-image: var(--dsg-sheen-l3);\n /* foundation's dialog channel: 12px, never a 24px full-window blur */\n -webkit-backdrop-filter: var(--dsg-backdrop-dialog);\n backdrop-filter: var(--dsg-backdrop-dialog);\n border-radius: var(--dsg-radius-modal);\n box-shadow: var(--dsg-bevel-l3);\n /* blue primary CTAs + white ink on them, scoped to this window */\n --dsw-alias-brand-primary: var(--dsg-blue);\n --dsw-alias-button-primary-fill: var(--dsg-blue);\n --dsw-alias-button-primary-hover: var(--dsg-blue-strong);\n --dsw-alias-label-primary-foreground: #ffffff;\n}\nhtml[data-dsg='on'] body[data-dsg-fallback] [role='dialog'][aria-modal='true'][data-shortcut-modal='settings'],\nhtml[data-dsg='on'] body[data-dsg-fallback] [role='dialog'][aria-modal='true']:has([data-slot='settings.section']) {\n -webkit-backdrop-filter: none;\n backdrop-filter: none;\n}\n/* the scrim behind the settings window keeps the shared mask channel */\nhtml[data-dsg='on']\n [role='presentation']:has(> [role='dialog'][data-shortcut-modal='settings'])\n > [class*='_mask'] {\n background-color: rgba(16, 24, 40, 0.28);\n -webkit-backdrop-filter: var(--dsw-mask-blur);\n backdrop-filter: var(--dsw-mask-blur);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme]\n [role='presentation']:has(> [role='dialog'][data-shortcut-modal='settings'])\n > [class*='_mask'] {\n background-color: rgba(0, 0, 0, 0.46);\n}\n\n/* left navigation — pill rows with a blue active state */\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] nav {\n border-right: 0.5px solid var(--dsg-border-hair);\n gap: 14px;\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_navTitle'] {\n font-size: 16px;\n font-weight: 600;\n letter-spacing: 0.01em;\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_navCell'] {\n height: 38px;\n border-radius: 10px;\n color: var(--dsw-alias-label-secondary);\n transition:\n background-color var(--dsg-motion-dur) var(--dsg-ease),\n color var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_navCell']:hover {\n background-color: rgba(77, 107, 254, 0.07);\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_navCell'][aria-current='true'] {\n background-color: rgba(77, 107, 254, 0.11);\n color: var(--dsg-blue-strong);\n font-weight: 500;\n box-shadow: inset 0 0 0 0.5px rgba(77, 107, 254, 0.16);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_navLabel'] {\n color: inherit;\n}\n\n/* content chrome */\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_header'] {\n background-color: transparent;\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_content'] {\n min-width: 0;\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_options'] {\n padding: 0 28px 28px;\n /* a scroller: never frost it (per-frame backdrop recompute) */\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] :is(h2, h3) {\n letter-spacing: 0.005em;\n}\n\n/* ============================================================================\n 2. settings cards / rows / controls\n ========================================================================== */\n/* card items only: direct children of a card list/grid (avoids _cardMainRow,\n _cardContent, _cardTitle … being painted as cards) */\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_cards'] > *,\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_rowCard'] {\n background-color: color-mix(in srgb, var(--dsg-blue) 2.5%, var(--dsg-fill-l2));\n background-image: var(--dsg-sheen-l2);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 16px;\n box-shadow: var(--dsg-bevel-l1);\n transition:\n background-color var(--dsg-motion-dur) var(--dsg-ease),\n box-shadow var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_cards'] > *:hover,\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_rowCard']:hover {\n background-color: color-mix(in srgb, var(--dsg-blue) 4%, var(--dsg-fill-l2));\n box-shadow: var(--dsg-bevel-l2);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_cards'] > *[data-open='true'] {\n background-color: color-mix(in srgb, var(--dsg-blue) 4%, var(--dsg-fill-l2));\n border-color: rgba(77, 107, 254, 0.2);\n}\n/* single cards that are not inside a card list (account / balance rows) */\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_balanceCard'] {\n background-color: color-mix(in srgb, var(--dsg-blue) 2.5%, var(--dsg-fill-l2));\n background-image: var(--dsg-sheen-l2);\n border-radius: 16px;\n box-shadow: var(--dsg-bevel-l1);\n}\n/* card head / tags */\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_cards'] [class*='_cardTitle'] {\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_cards'] [class*='_cardDesc'],\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_intro'] {\n color: var(--dsw-alias-label-secondary);\n line-height: 1.6;\n}\n/* setting rows: comfortable height, blue hover (form fields + inventory rows) */\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_field'] {\n border-radius: 10px;\n transition: background-color var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_field']:hover,\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_cardMainRow']:hover {\n background-color: rgba(77, 107, 254, 0.045);\n}\n/* form fields stay opaque on the frosted face */\nhtml[data-dsg='on'] [data-shortcut-modal='settings']\n :is(input, textarea, select):not([type='range']):not([type='checkbox']):not([type='radio']) {\n background-color: var(--dsg-code-solid);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 10px;\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings']\n :is(input, textarea, select):not([type='range']):focus-visible {\n border-color: rgba(77, 107, 254, 0.42);\n box-shadow: 0 0 0 2px rgba(77, 107, 254, 0.16);\n outline: none;\n}\n/* switches / sliders / checkboxes: DeepSeek blue accent */\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] :is(input[type='checkbox'], input[type='radio'], input[type='range']) {\n accent-color: var(--dsg-blue);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_switch'][aria-checked='true'] {\n background: var(--dsg-blue);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_switch']:hover {\n filter: brightness(1.05);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_segmented'],\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_control']:has(> [class*='_indicator']) {\n background-color: color-mix(in srgb, var(--dsg-tint) 30%, transparent);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 10px;\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_control'] > [class*='_indicator'] {\n border-radius: 8px;\n background: var(--dsg-fill-l2);\n box-shadow: var(--dsg-bevel-l1);\n}\n\n/* ============================================================================\n 3. plugin manager page (main panel) — L1 page, L2 cards\n ========================================================================== */\nhtml[data-dsg='on'] [data-plugin-panel] {\n --dsw-alias-brand-primary: var(--dsg-blue);\n --dsw-alias-button-primary-fill: var(--dsg-blue);\n --dsw-alias-button-primary-hover: var(--dsg-blue-strong);\n --dsw-alias-label-primary-foreground: #ffffff;\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-plugin-panel] [class*='_pageTitle'] {\n font-weight: 600;\n letter-spacing: 0.005em;\n}\nhtml[data-dsg='on'] [data-plugin-panel] [class*='_pageIntro'] {\n color: var(--dsw-alias-label-secondary);\n}\nhtml[data-dsg='on'] [data-plugin-group] {\n border-radius: 18px;\n}\nhtml[data-dsg='on'] [data-plugin-group] [class*='_groupTitle'] {\n font-size: 12px;\n font-weight: 600;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--dsw-alias-label-tertiary);\n}\n/* list rows / cards */\nhtml[data-dsg='on'] [data-plugin-item],\nhtml[data-dsg='on'] [data-plugin-package] {\n background-color: var(--dsg-fill-l2);\n background-image: var(--dsg-sheen-l2);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 16px;\n box-shadow: var(--dsg-bevel-l1);\n transition:\n background-color var(--dsg-motion-dur) var(--dsg-ease),\n box-shadow var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-plugin-item]:hover,\nhtml[data-dsg='on'] [data-plugin-package]:hover {\n background-color: color-mix(in srgb, var(--dsg-blue) 4%, var(--dsg-fill-l2));\n box-shadow: var(--dsg-bevel-l2);\n}\nhtml[data-dsg='on'] [data-plugin-item] [class*='_cardIcon'],\nhtml[data-dsg='on'] [data-plugin-package] [class*='_cardIcon'] {\n background: color-mix(in srgb, var(--dsg-blue) 6%, rgba(255, 255, 255, 0.6));\n border-color: rgba(77, 107, 254, 0.14);\n}\nhtml[data-dsg='on'] [data-plugin-item] [class*='_cardTitle'],\nhtml[data-dsg='on'] [data-plugin-package] [class*='_cardTitle'] {\n font-weight: 600;\n}\nhtml[data-dsg='on'] [data-plugin-item] [class*='_cardDesc'],\nhtml[data-dsg='on'] [data-plugin-package] [class*='_cardDesc'] {\n color: var(--dsw-alias-label-secondary);\n}\n/* status tags / badges */\nhtml[data-dsg='on'] [data-plugin-status] [class*='_statusTag'],\nhtml[data-dsg='on'] [data-plugin-panel] [class*='_statusTag'],\nhtml[data-dsg='on'] [data-plugin-panel] [class*='_badge'] {\n border-radius: 999px;\n background-color: rgba(77, 107, 254, 0.1);\n color: var(--dsg-blue-strong);\n border: 0.5px solid rgba(77, 107, 254, 0.16);\n font-weight: 500;\n}\n\n/* detail page (same surface, just a view) */\nhtml[data-dsg='on'] [data-plugin-detail] {\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-plugin-detail] [class*='_crumb'] {\n border-radius: 10px;\n color: var(--dsw-alias-label-secondary);\n}\nhtml[data-dsg='on'] [data-plugin-detail] [class*='_crumb']:hover {\n background-color: rgba(77, 107, 254, 0.07);\n color: var(--dsg-blue-strong);\n}\nhtml[data-dsg='on'] [data-plugin-rows] {\n background-color: color-mix(in srgb, var(--dsg-tint) 18%, transparent);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 16px;\n padding: 4px;\n}\nhtml[data-dsg='on'] [data-plugin-row] {\n border-radius: 12px;\n min-height: 44px;\n transition: background-color var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-plugin-row]:hover {\n background-color: rgba(77, 107, 254, 0.05);\n}\nhtml[data-dsg='on'] [data-plugin-row][data-state='failed'] {\n box-shadow: inset 2px 0 0 rgba(239, 68, 68, 0.6);\n}\nhtml[data-dsg='on'] [data-plugin-detail] [class*='_detailSection'] {\n background-color: var(--dsg-fill-l2);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 16px;\n padding: 12px 14px;\n}\n/* plugin market */\nhtml[data-dsg='on'] [data-market-entry] {\n background-color: var(--dsg-fill-l2);\n background-image: var(--dsg-sheen-l2);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 16px;\n box-shadow: var(--dsg-bevel-l1);\n transition:\n background-color var(--dsg-motion-dur) var(--dsg-ease),\n box-shadow var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-market-entry]:hover {\n background-color: color-mix(in srgb, var(--dsg-blue) 4%, var(--dsg-fill-l2));\n box-shadow: var(--dsg-bevel-l2);\n}\nhtml[data-dsg='on'] [data-market-detail] {\n --dsw-alias-brand-primary: var(--dsg-blue);\n --dsw-alias-button-primary-fill: var(--dsg-blue);\n --dsw-alias-button-primary-hover: var(--dsg-blue-strong);\n --dsw-alias-label-primary-foreground: #ffffff;\n}\nhtml[data-dsg='on'] [data-market-detail] [class*='_detailSection'] {\n background-color: var(--dsg-fill-l2);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 16px;\n padding: 12px 14px;\n}\n/* install dialog keeps the generic dialog face but gets the blue CTA */\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true']:has([data-install-phase]),\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true'] [class*='_installDialog'] {\n --dsw-alias-brand-primary: var(--dsg-blue);\n --dsw-alias-button-primary-fill: var(--dsg-blue);\n --dsw-alias-button-primary-hover: var(--dsg-blue-strong);\n --dsw-alias-label-primary-foreground: #ffffff;\n}\n\n/* ============================================================================\n 4. right sidebar (dockkit) — 单层玻璃壳 + L1 pane bodies + L3 fullscreen\n ============================================================================\n 玻璃只在 ::before(10-shell §4)画一次;本体保持透明。之前本体也铺了 fill-l2,\n 再叠上 dockkit 各层的半透明底,整块面板被洗成不透明白 —— 面板与对话区不再共享\n 背景。这里把本体与所有中间容器清零,只留一层霜。*/\nhtml[data-dsg='on'] [data-rightbar-col] [data-sidebar-right-panel]:not([aria-hidden='true']),\nhtml[data-dsg='on'] [data-sidebar-right-panel][data-sidebar-right-open] {\n background-color: transparent;\n background-image: none;\n -webkit-backdrop-filter: none;\n backdrop-filter: none;\n border-left: 0.5px solid var(--dsg-border-hair);\n border-radius: 18px 0 0 18px;\n box-shadow: -14px 0 44px rgba(44, 74, 140, 0.1);\n z-index: var(--dsh-dockkit-dock-layer, 10);\n}\n/* closed state must be explicitly clean (container stays mounted) */\nhtml[data-dsg='on'] [data-rightbar-col] [data-sidebar-right-panel][aria-hidden='true'] {\n background: none;\n background-image: none;\n border-left: none;\n box-shadow: none;\n -webkit-backdrop-filter: none;\n backdrop-filter: none;\n}\n/* fullscreen right panel = detail surface → L3(只换 ::before 的两个变量) */\nhtml[data-dsg='on'] [data-sidebar-right-panel][data-sidebar-right-mode='fullscreen'] {\n --dsg-panel-fill: var(--dsg-fill-l3);\n --dsg-panel-backdrop: var(--dsg-backdrop-l3);\n}\n/* dockkit 中间层全部透明:surface / host / pane / paneBody / panelBody / tabHost…\n 这些容器原本各带 --dsw-alias-bg-base 或 bg-layer 层,叠在玻璃壳上会发白。 */\nhtml[data-dsg='on'] [data-sidebar-right-panel] :is(\n [data-dockkit-surface],\n [data-dockkit-host],\n [data-dockkit-pane],\n [data-dockkit-content],\n [class*='_panelBody'],\n [class*='_tabLayout'],\n [class*='_tabCell'],\n [class*='_tabHost'],\n [class*='_paneBody']\n ) {\n background-color: transparent !important;\n background-image: none !important;\n}\nhtml[data-dsg='on'] [data-sidebar-right-panel] [data-dockkit-pane] {\n border-radius: 14px;\n overflow: hidden;\n}\n/* tab strip: capsule tabs */\nhtml[data-dsg='on'] [data-sidebar-right-panel] [data-dockkit-strip] {\n background-color: transparent;\n padding-bottom: 4px;\n}\nhtml[data-dsg='on'] [data-sidebar-right-panel] [data-dockkit-tab] {\n border-radius: 9px;\n color: var(--dsw-alias-label-secondary);\n transition:\n background-color var(--dsg-motion-dur) var(--dsg-ease),\n color var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-sidebar-right-panel] [data-dockkit-tab]:hover {\n background-color: rgba(77, 107, 254, 0.07);\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-sidebar-right-panel] [data-dockkit-tab][data-dockkit-tab-active],\nhtml[data-dsg='on'] [data-sidebar-right-panel] [data-dockkit-tab][aria-selected='true'] {\n background-color: rgba(77, 107, 254, 0.1);\n color: var(--dsg-blue-strong);\n font-weight: 500;\n}\nhtml[data-dsg='on'] [data-sidebar-right-panel] [data-dockkit-divider] {\n background: var(--dsg-border-hair);\n}\n/* right-panel guide entries */\nhtml[data-dsg='on'] [data-sidebar-right-panel] [data-sidebar-right-guide-entry],\nhtml[data-dsg='on'] [data-sidebar-right-panel] :is(button, a)[class*='_entry'] {\n background-color: var(--dsg-fill-l2);\n background-image: var(--dsg-sheen-l2);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 16px;\n box-shadow: var(--dsg-bevel-l1);\n}\nhtml[data-dsg='on'] [data-sidebar-right-panel] :is(button, a)[class*='_entry']:hover {\n background-color: color-mix(in srgb, var(--dsg-blue) 4%, var(--dsg-fill-l2));\n}\n\n/* ============================================================================\n 5. document preview — opaque paper plate (readability first)\n ----------------------------------------------------------------------------\n 文档预览 / 文本预览 / PDF 页是“读字”的 L3 面:背景必须完全不透明,否则对话区\n 的高对比文字会透上来,和预览内容叠成“双行字”(用户反馈)。宿主 token\n --dsw-alias-bg-document-preview 也已映射到同一张纸(00-foundation)。\n ========================================================================== */\nhtml[data-dsg='on'] [data-document-preview],\nhtml[data-dsg='on'] [data-textpreview-state],\nhtml[data-dsg='on'] [data-textpreview-wrap],\nhtml[data-dsg='on'] [data-code-preview],\nhtml[data-dsg='on'] [data-pdf-preview],\nhtml[data-dsg='on'] [data-html-preview],\nhtml[data-dsg='on'] [data-document-markdown],\nhtml[data-dsg='on'] [data-plan-preview] [class*='_document'] {\n background-color: var(--dsg-doc-paper) !important;\n background-image: none !important;\n -webkit-backdrop-filter: none !important;\n backdrop-filter: none !important;\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 14px;\n box-shadow: var(--dsg-bevel-l1);\n color: var(--dsw-alias-label-primary);\n}\n/* 预览所在的整个面板 / dockkit 容器也一起做实:预览通常铺满 tab,\n 只把纸面做实、父容器仍透,文字照样会从纸外的边角透上来。 */\nhtml[data-dsg='on'] [data-sidebar-right-panel]:has([data-document-preview]),\nhtml[data-dsg='on'] [data-dockkit-pane]:has([data-document-preview]),\nhtml[data-dsg='on'] [data-dockkit-content]:has([data-document-preview]),\nhtml[data-dsg='on'] [data-dockkit-surface]:has([data-document-preview]),\nhtml[data-dsg='on'] [data-dockkit-host]:has([data-document-preview]),\nhtml[data-dsg='on'] [data-slot='sidebar-right']:has([data-document-preview]),\nhtml[data-dsg='on'] [role='dialog']:has([data-document-preview]),\nhtml[data-dsg='on'] [data-shell-overlay] :has(> [data-document-preview]),\nhtml[data-dsg='on'] [data-slot='sidebar-documentpreview'] {\n --dsg-panel-fill: var(--dsg-doc-paper);\n --dsg-panel-backdrop: none;\n background-color: var(--dsg-doc-paper) !important;\n background-image: none !important;\n -webkit-backdrop-filter: none !important;\n backdrop-filter: none !important;\n}\nhtml[data-dsg='on'] [data-document-preview] [class*='_header'],\nhtml[data-dsg='on'] [data-textpreview-wrap] [class*='_header'] {\n background-color: color-mix(in srgb, var(--dsg-tint) 62%, transparent);\n border-bottom: 0.5px solid var(--dsg-border-hair);\n border-radius: 14px 14px 0 0;\n}\nhtml[data-dsg='on'] [data-document-preview] [class*='_page'],\nhtml[data-dsg='on'] [data-document-preview] [class*='_body'],\nhtml[data-dsg='on'] [data-textpreview-wrap] [class*='_body'] {\n background-color: transparent;\n}\nhtml[data-dsg='on'] [data-document-preview] [class*='_frontmatter'] {\n background-color: var(--dsg-fill-l1);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 10px;\n}\n/* plan preview inside the right panel */\nhtml[data-dsg='on'] [data-plan-preview] {\n background-color: var(--dsg-fill-l3);\n background-image: var(--dsg-sheen-l3);\n border-radius: var(--dsg-radius-modal);\n box-shadow: var(--dsg-bevel-l2);\n}\n\n/* ===== 95-settings-panel.css ===== */\n/* ============================================================================\n 95 plugin settings panel (rendered inside Settings → settings.section)\n Uses its own .dsg-* vocabulary so it never collides with shipped UI.\n ========================================================================== */\nhtml[data-dsg='on'] .dsg-settings {\n display: flex;\n flex-direction: column;\n gap: 18px;\n max-width: 760px;\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] .dsg-settings-head {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\nhtml[data-dsg='on'] .dsg-settings-title {\n font-size: 15px;\n font-weight: 600;\n letter-spacing: 0.01em;\n}\nhtml[data-dsg='on'] .dsg-settings-sub {\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-tertiary);\n}\nhtml[data-dsg='on'] .dsg-settings-body {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 8px 18px;\n border-radius: var(--dsg-radius-card);\n background: rgba(255, 255, 255, calc(0.5 * var(--dsg-glass, 1)));\n border: 1px solid var(--dsw-alias-border-l2);\n -webkit-backdrop-filter: blur(var(--dsg-card-blur)) saturate(var(--dsg-sat));\n backdrop-filter: blur(var(--dsg-card-blur)) saturate(var(--dsg-sat));\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.55),\n 0 10px 30px rgba(44, 74, 140, 0.08);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] .dsg-settings-body {\n background: rgba(22, 33, 58, calc(0.6 * var(--dsg-glass, 1)));\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.08),\n 0 14px 36px rgba(0, 0, 0, 0.32);\n}\nhtml[data-dsg='on'] .dsg-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 20px;\n padding: 14px 0;\n border-bottom: 1px solid var(--dsw-alias-border-l1);\n}\nhtml[data-dsg='on'] .dsg-row:last-child {\n border-bottom: 0;\n}\nhtml[data-dsg='on'] .dsg-row-text {\n min-width: 0;\n}\nhtml[data-dsg='on'] .dsg-row-label {\n font-size: 13px;\n font-weight: 500;\n}\nhtml[data-dsg='on'] .dsg-row-hint {\n margin-top: 3px;\n font-size: 11px;\n color: var(--dsw-alias-label-tertiary);\n}\nhtml[data-dsg='on'] .dsg-row-control {\n display: flex;\n align-items: center;\n gap: 10px;\n flex: 0 0 auto;\n}\nhtml[data-dsg='on'] .dsg-slider {\n display: flex;\n align-items: center;\n gap: 10px;\n}\nhtml[data-dsg='on'] .dsg-slider input[type='range'] {\n width: 148px;\n accent-color: var(--dsg-blue);\n}\nhtml[data-dsg='on'] .dsg-slider-value {\n width: 40px;\n font-size: 12px;\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-secondary);\n text-align: right;\n}\nhtml[data-dsg='on'] .dsg-seg {\n display: inline-flex;\n padding: 3px;\n gap: 2px;\n border-radius: 999px;\n background: rgba(77, 107, 254, 0.07);\n border: 1px solid var(--dsw-alias-border-l1);\n}\nhtml[data-dsg='on'] .dsg-seg-btn {\n border: 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n line-height: 1;\n padding: 7px 13px;\n border-radius: 999px;\n cursor: pointer;\n transition: background var(--dsg-motion-dur) var(--dsg-ease), color var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] .dsg-seg-btn:hover {\n color: var(--dsw-alias-label-primary);\n background: rgba(255, 255, 255, 0.5);\n}\nhtml[data-dsg='on'] .dsg-seg-btn.is-on {\n color: var(--dsg-blue);\n background: #fff;\n box-shadow: 0 2px 8px rgba(44, 74, 140, 0.12);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] .dsg-seg-btn.is-on {\n background: rgba(77, 107, 254, 0.28);\n color: #dce6ff;\n}\nhtml[data-dsg='on'] .dsg-switch {\n position: relative;\n width: 44px;\n height: 26px;\n padding: 0;\n border-radius: 999px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: rgba(120, 140, 180, 0.22);\n cursor: pointer;\n transition: background var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] .dsg-switch .dsg-switch-thumb {\n position: absolute;\n top: 3px;\n left: 3px;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n background: #fff;\n box-shadow: 0 1px 4px rgba(20, 40, 90, 0.24);\n transition: transform var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] .dsg-switch.is-on {\n background: var(--dsg-blue);\n border-color: transparent;\n}\nhtml[data-dsg='on'] .dsg-switch.is-on .dsg-switch-thumb {\n transform: translateX(18px);\n}\nhtml[data-dsg='on'] .dsg-settings-foot {\n display: flex;\n justify-content: flex-end;\n padding: 12px 0 10px;\n}\nhtml[data-dsg='on'] .dsg-btn {\n border: 1px solid var(--dsw-alias-border-l2);\n background: rgba(255, 255, 255, 0.6);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n padding: 8px 16px;\n border-radius: 999px;\n cursor: pointer;\n transition: all var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] .dsg-btn:hover {\n color: var(--dsg-blue);\n border-color: var(--dsg-blue-ring);\n background: #fff;\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] .dsg-btn {\n background: rgba(255, 255, 255, 0.06);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] .dsg-btn:hover {\n background: rgba(77, 107, 254, 0.22);\n color: #dce6ff;\n}\n"
|
|
14
|
+
var CSS = "\n/* ===== 00-foundation.css ===== */\n/* ============================================================================\n dsh-skin-mistblue · 00 foundation + glass engine\n DeepSeek-web visual language on top of the DSH `--dsw-*` token system.\n\n Glass engine ported from wallpaper-engine's 5-layer recipe (see\n docs/GLASS-SPEC.md):\n ① fill (token) ② top specular sheen ③ backdrop-filter frost\n ④ inset bevel + hairline ⑤ soft outer elevation\n Fill maths (color-mix, premultiplied):\n effAlpha = floor + a * (1 - floor) floor = theme readability floor\n\n Tiers:\n L1 content surfaces · light fill, small frost\n L2 cards / bubbles · medium fill + frost (readability uplift)\n L3 popups / details · strong fill + strong frost (readability uplift)\n ========================================================================== */\n\nhtml[data-dsg='on'] {\n /* ---- engine sources (shared) ------------------------------------------ */\n --dsg-sat: 1.3;\n --dsg-bright: 1.04;\n --dsg-contrast: 1.01;\n --dsg-fidelity: 0.55;\n --dsg-floor-base-light: 0.45;\n --dsg-floor-base-dark: 0.59;\n --dsg-floor: calc(var(--dsg-floor-base-light) * var(--dsg-fidelity));\n\n --dsg-a1: 0.06;\n --dsg-a2: 0.20;\n --dsg-a3: 0.72;\n\n /* blur ladder: wallpaper-engine's 8px anchor, then readability uplift for\n cards and popups (user requirement: more frost on cards/popups/details). */\n --dsg-blur-l1: calc(6px * var(--dsg-blur, 1));\n --dsg-blur-l2: calc(16px * var(--dsg-blur, 1));\n --dsg-blur-l3: calc(24px * var(--dsg-blur, 1));\n /* Large-area surfaces: dialogs/settings are expensive to re-blur; menus are\n small but read better with a slightly softer frost. */\n --dsg-blur-dialog: calc(12px * var(--dsg-blur, 1));\n --dsg-blur-l3-dialog: var(--dsg-blur-dialog);\n --dsg-blur-menu: calc(20px * var(--dsg-blur, 1));\n\n --dsg-motion: 1;\n\n --dsg-radius-card: 20px;\n --dsg-radius-modal: 24px;\n --dsg-radius-composer: 28px;\n --dsg-motion-dur: calc(180ms * var(--dsg-motion));\n --dsg-ease: cubic-bezier(0.22, 0.61, 0.36, 1);\n\n --dsg-blue: #4d6bfe;\n --dsg-blue-strong: #3556f0;\n --dsg-blue-soft: rgba(77, 107, 254, 0.12);\n --dsg-blue-ring: rgba(77, 107, 254, 0.45);\n\n /* document preview paper: fully opaque, never lets chat text show through */\n --dsg-doc-paper: #ffffff;\n}\n\n/* ---- atmosphere ---------------------------------------------------------- */\n/* Static layered mist from docs/DESIGN-SPEC §6.1 (measured from deepseek.com),\n plus three very faint drifting light pools for depth. */\nhtml[data-dsg='on'] body {\n background-color: transparent !important;\n}\nhtml[data-dsg='on'] .dsg-atmosphere {\n position: fixed;\n inset: 0;\n z-index: -1;\n pointer-events: none;\n overflow: hidden;\n background-color: #f4f7fc;\n background-image:\n radial-gradient(120% 62% at 50% -14%, rgba(255, 255, 255, 0.97) 0%, rgba(255, 255, 255, 0.55) 42%, rgba(255, 255, 255, 0) 68%),\n radial-gradient(46% 40% at 71% 1%, rgba(120, 152, 219, 0.58) 0%, rgba(120, 152, 219, 0.2) 55%, rgba(120, 152, 219, 0) 78%),\n radial-gradient(40% 42% at 28% 50%, rgba(146, 178, 230, 0.55) 0%, rgba(146, 178, 230, 0.22) 58%, rgba(146, 178, 230, 0) 82%),\n radial-gradient(52% 46% at 100% 62%, rgba(196, 213, 238, 0.4) 0%, rgba(196, 213, 238, 0) 72%),\n radial-gradient(100% 46% at 50% 112%, rgba(248, 247, 248, 0.98) 0%, rgba(248, 247, 248, 0.7) 40%, rgba(248, 247, 248, 0) 70%),\n linear-gradient(178deg, #fbfcfe 0%, #eef4fb 24%, #e3ecf7 46%, #dfe9f6 58%, #e9eff7 74%, #f4f4f5 90%, #f8f7f8 100%);\n background-repeat: no-repeat;\n}\nhtml[data-dsg='on'] .dsg-atmosphere .dsg-aurora {\n position: absolute;\n display: block;\n border-radius: 50%;\n filter: blur(90px);\n opacity: 0.5;\n will-change: transform;\n animation: dsg-drift 34s ease-in-out infinite alternate;\n}\nhtml[data-dsg='on'] .dsg-atmosphere .dsg-aurora-a {\n width: 46vw; height: 38vw; left: -10vw; top: -12vw;\n background: radial-gradient(circle at 40% 40%, rgba(255, 255, 255, 0.7), rgba(255, 255, 255, 0) 70%);\n}\nhtml[data-dsg='on'] .dsg-atmosphere .dsg-aurora-b {\n width: 40vw; height: 34vw; right: -10vw; top: 6vh;\n background: radial-gradient(circle at 50% 50%, rgba(255, 255, 255, 0.45), rgba(255, 255, 255, 0) 72%);\n animation-delay: -12s; animation-duration: 42s;\n}\nhtml[data-dsg='on'] .dsg-atmosphere .dsg-aurora-c {\n width: 56vw; height: 30vw; left: 22vw; bottom: -18vw;\n background: radial-gradient(circle at 50% 50%, rgba(255, 255, 255, 0.5), rgba(255, 255, 255, 0) 72%);\n animation-delay: -20s; animation-duration: 48s;\n}\nhtml[data-dsg='on'] .dsg-atmosphere .dsg-grid {\n position: absolute; inset: 0;\n background-image:\n linear-gradient(to right, rgba(59, 91, 148, 0.045) 1px, transparent 1px),\n linear-gradient(to bottom, rgba(59, 91, 148, 0.045) 1px, transparent 1px);\n background-size: 75px 75px;\n background-position: 56px 56px;\n -webkit-mask-image: radial-gradient(120% 95% at 50% 32%, #000 30%, transparent 82%);\n mask-image: radial-gradient(120% 95% at 50% 32%, #000 30%, transparent 82%);\n}\nhtml[data-dsg='on'] .dsg-atmosphere .dsg-grain {\n position: absolute; inset: 0; opacity: 0.12; mix-blend-mode: soft-light;\n background-image: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/><feColorMatrix type='saturate' values='0'/></filter><rect width='100%25' height='100%25' filter='url(%23n)' opacity='0.5'/></svg>\");\n}\n@keyframes dsg-drift {\n from { transform: translate3d(0, 0, 0) scale(1); }\n to { transform: translate3d(1.4vw, -1vh, 0) scale(1.03); }\n}\nhtml[data-dsg-atmosphere='mist'] .dsg-atmosphere .dsg-aurora { opacity: 0.25; }\nhtml[data-dsg-atmosphere='off'] .dsg-atmosphere { display: none; }\n\n/* Dark palette atmosphere */\nhtml[data-dsg='on'] body[data-ds-dark-theme] .dsg-atmosphere {\n background-color: #0a1020;\n background-image:\n radial-gradient(120% 64% at 50% -14%, rgba(88, 122, 200, 0.34) 0%, rgba(10, 14, 26, 0) 64%),\n radial-gradient(46% 40% at 72% 2%, rgba(77, 107, 254, 0.28) 0%, rgba(77, 107, 254, 0) 76%),\n radial-gradient(42% 44% at 24% 54%, rgba(90, 130, 255, 0.16) 0%, rgba(90, 130, 255, 0) 78%),\n radial-gradient(52% 46% at 100% 62%, rgba(120, 90, 255, 0.12) 0%, rgba(120, 90, 255, 0) 74%),\n linear-gradient(178deg, #0c1322 0%, #0b1426 34%, #0a111f 62%, #0c1524 100%);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] .dsg-atmosphere .dsg-aurora { opacity: 0.22; }\nhtml[data-dsg='on'] body[data-ds-dark-theme] .dsg-atmosphere .dsg-aurora-a {\n background: radial-gradient(circle at 40% 40%, rgba(77, 107, 254, 0.45), rgba(77, 107, 254, 0) 68%);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] .dsg-atmosphere .dsg-aurora-b {\n background: radial-gradient(circle at 50% 50%, rgba(90, 130, 255, 0.3), rgba(90, 130, 255, 0) 70%);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] .dsg-atmosphere .dsg-aurora-c {\n background: radial-gradient(circle at 50% 50%, rgba(120, 90, 255, 0.24), rgba(120, 90, 255, 0) 72%);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] .dsg-atmosphere .dsg-grid {\n background-image:\n linear-gradient(to right, rgba(150, 180, 255, 0.045) 1px, transparent 1px),\n linear-gradient(to bottom, rgba(150, 180, 255, 0.045) 1px, transparent 1px);\n}\n\n/* ---- glass engine · light ------------------------------------------------ */\nhtml[data-dsg='on'] body {\n --dsg-tint: #ffffff;\n --dsg-tint-rgb: 255 255 255;\n\n /* three tier fills: effAlpha = floor + a * (1 - floor) */\n --dsg-fill-l1: color-mix(in srgb,\n var(--dsg-tint) calc(var(--dsg-floor) * 100%),\n color-mix(in srgb, var(--dsg-tint) calc(var(--dsg-a1) * 100%), transparent) calc((1 - var(--dsg-floor)) * 100%));\n --dsg-fill-l2: color-mix(in srgb,\n var(--dsg-tint) calc(var(--dsg-floor) * 100%),\n color-mix(in srgb, var(--dsg-tint) calc(var(--dsg-a2) * 100%), transparent) calc((1 - var(--dsg-floor)) * 100%));\n --dsg-fill-l3: color-mix(in srgb,\n var(--dsg-tint) calc(var(--dsg-floor-base-light) * 100%),\n color-mix(in srgb, var(--dsg-tint) calc(var(--dsg-a3) * 100%), transparent) calc((1 - var(--dsg-floor-base-light)) * 100%));\n\n /* frost */\n --dsg-backdrop-l1: blur(var(--dsg-blur-l1)) saturate(var(--dsg-sat)) brightness(var(--dsg-bright)) contrast(var(--dsg-contrast));\n --dsg-backdrop-l2: blur(var(--dsg-blur-l2)) saturate(var(--dsg-sat)) brightness(var(--dsg-bright)) contrast(var(--dsg-contrast));\n --dsg-backdrop-l3: blur(var(--dsg-blur-l3)) saturate(var(--dsg-sat)) brightness(var(--dsg-bright)) contrast(var(--dsg-contrast));\n --dsg-backdrop-l3-dialog: blur(var(--dsg-blur-dialog)) saturate(var(--dsg-sat)) brightness(var(--dsg-bright)) contrast(var(--dsg-contrast));\n --dsg-backdrop-dialog: blur(var(--dsg-blur-dialog)) saturate(var(--dsg-sat)) brightness(var(--dsg-bright)) contrast(var(--dsg-contrast));\n --dsg-backdrop-menu: blur(var(--dsg-blur-menu)) saturate(1.4);\n --dsg-backdrop-panel: blur(calc(10px * var(--dsg-blur, 1))) saturate(1.2) brightness(var(--dsg-bright));\n\n /* specular sheen */\n --dsg-sheen-l1: linear-gradient(180deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.03) 38%, rgba(255, 255, 255, 0.02));\n --dsg-sheen-l2: linear-gradient(180deg, rgba(255, 255, 255, 0.18), rgba(255, 255, 255, 0.05) 38%, rgba(255, 255, 255, 0.02));\n --dsg-sheen-l3: linear-gradient(180deg, rgba(255, 255, 255, 0.14), rgba(255, 255, 255, 0.05) 38%, rgba(255, 255, 255, 0.03));\n\n /* bevel + elevation */\n --dsg-bevel-l1:\n inset 0 1px 0 rgba(255, 255, 255, 0.45),\n inset 0 -1px 0 rgba(255, 255, 255, 0.08),\n inset 0 0 0 0.5px rgba(255, 255, 255, 0.16),\n 0 8px 26px rgba(44, 74, 140, 0.08);\n --dsg-bevel-l2:\n inset 0 1px 0 rgba(255, 255, 255, 0.6),\n inset 0 -1px 0 rgba(255, 255, 255, 0.1),\n inset 0 0 0 0.5px rgba(255, 255, 255, 0.22),\n 0 14px 44px rgba(44, 74, 140, 0.12);\n --dsg-bevel-l3:\n inset 0 1px 0 rgba(255, 255, 255, 0.7),\n inset 0 0 0 1px rgba(255, 255, 255, 0.28),\n 0 24px 80px rgba(23, 48, 108, 0.2);\n\n --dsg-border-hair: rgba(56, 88, 158, 0.14);\n\n /* ---- consume engine into DSH tokens ---------------------------------- */\n --dsw-alias-bg-base: transparent;\n --dsw-alias-bg-layer-1: var(--dsg-fill-l1);\n --dsw-alias-bg-layer-2: var(--dsg-fill-l2);\n --dsw-alias-bg-layer-3: var(--dsg-fill-l3);\n --dsw-alias-bg-overlay: var(--dsg-fill-l3);\n --dsw-alias-bg-module-platform: var(--dsg-fill-l1);\n --dsw-alias-bg-multi-select: var(--dsg-fill-l1);\n /* document preview / pdf paper: host uses this for the preview page body —\n opaque so dense text never blends with the conversation behind it. */\n --dsw-alias-bg-document-preview: var(--dsg-doc-paper);\n\n --dsw-specific-sidebar-fill: var(--dsg-fill-l1);\n --dsw-specific-input-major: var(--dsg-fill-l2);\n --dsw-specific-bubble: var(--dsg-fill-l2);\n --dsw-specific-menu: color-mix(in srgb, #ffffff 82%, transparent);\n --dsw-menu-surface-fill: color-mix(in srgb, #ffffff 82%, transparent);\n --dsw-alias-menu-group-header-fill: rgba(250, 252, 255, 0.94);\n --dsw-specific-selector: var(--dsg-fill-l2);\n --dsw-specific-tip: var(--dsg-fill-l2);\n --dsw-specific-sidebar-nav-item-active: var(--dsg-fill-l2);\n --dsw-specific-sidebar-nav-item-hover: rgba(77, 107, 254, 0.07);\n --dsw-specific-sidebar-nav-item-active-accent: var(--dsg-blue-soft);\n\n /* borders: blue-grey hairlines */\n --dsw-alias-border-l1: rgba(56, 88, 158, 0.1);\n --dsw-alias-border-l2: rgba(56, 88, 158, 0.16);\n --dsw-alias-border-l3: rgba(56, 88, 158, 0.2);\n --dsw-alias-border-l4: rgba(56, 88, 158, 0.26);\n --dsw-elevation-stroke-color: rgba(56, 88, 158, 0.18);\n\n /* DeepSeek blue interaction states */\n --dsw-alias-state-business-primary: var(--dsg-blue);\n --dsw-alias-link: var(--dsg-blue);\n --dsw-alias-brand-primary-new-colorprimary-new-color: var(--dsg-blue);\n --dsw-alias-interactive-bg-hover: rgba(77, 107, 254, 0.07);\n --dsw-alias-interactive-bg-active: rgba(77, 107, 254, 0.12);\n --dsw-alias-interactive-bg-hover-accent: var(--dsg-blue-soft);\n --dsw-alias-state-business-tertiary: rgba(77, 107, 254, 0.1);\n\n /* content surfaces */\n --dsw-alias-markdown-code-block: var(--dsg-fill-l1);\n --dsw-alias-markdown-code-block-banner: var(--dsg-fill-l2);\n --dsw-alias-markdown-inline-code: rgba(77, 107, 254, 0.08);\n --dsw-alias-markdown-citation: var(--dsg-fill-l1);\n --dsw-alias-markdown-tag: rgba(77, 107, 254, 0.08);\n --dsw-alias-turn-trigger-bg: var(--dsg-fill-l1);\n --dsw-alias-turn-trigger-bg-hover: var(--dsg-fill-l2);\n --dsw-alias-settings-card-fill: var(--dsg-fill-l2);\n --dsw-alias-settings-card-stroke: rgba(56, 88, 158, 0.16);\n\n /* host frosted channels */\n --dsw-menu-backdrop-filter: blur(calc(24px * var(--dsg-blur, 1))) saturate(1.4);\n --dsw-mask-blur: blur(calc(14px * var(--dsg-blur, 1))) saturate(1.2);\n\n /* elevation: diffuse blue-tinted daylight */\n --dsw-shadow-lv1: 0 2px 6px rgba(44, 74, 140, 0.06);\n --dsw-shadow-lv2: 0 6px 18px rgba(44, 74, 140, 0.08);\n --dsw-shadow-lv3: 0 18px 48px rgba(44, 74, 140, 0.12);\n --dsw-elevation-panel: var(--dsw-elevation-stroke), 0 6px 20px rgba(44, 74, 140, 0.08), 0 0 24px rgba(44, 74, 140, 0.04);\n --dsw-elevation-prominent: var(--dsw-elevation-stroke), 0 10px 34px rgba(44, 74, 140, 0.12), 0 0 30px rgba(44, 74, 140, 0.06);\n --dsw-elevation-soft: var(--dsw-elevation-stroke), 0 8px 28px rgba(44, 74, 140, 0.08), 0 0 28px rgba(44, 74, 140, 0.05);\n\n /* ink: deeper ramp for readable text over glass (≥4.9:1) */\n --dsw-alias-label-primary: #101728;\n --dsw-alias-label-secondary: #333c4d;\n --dsw-alias-label-tertiary: #5c6472;\n --dsw-alias-label-caption: #626a78;\n}\n\n/* ---- glass engine · dark ------------------------------------------------- */\nhtml[data-dsg='on'] body[data-ds-dark-theme] {\n --dsg-tint: #0d1524;\n --dsg-tint-rgb: 13 21 36;\n --dsg-floor: calc(var(--dsg-floor-base-dark) * var(--dsg-fidelity));\n --dsg-a1: 0.08;\n --dsg-a2: 0.34;\n --dsg-a3: 0.66;\n\n --dsg-fill-l1: color-mix(in srgb,\n var(--dsg-tint) calc(var(--dsg-floor) * 100%),\n color-mix(in srgb, var(--dsg-tint) calc(var(--dsg-a1) * 100%), transparent) calc((1 - var(--dsg-floor)) * 100%));\n --dsg-fill-l2: color-mix(in srgb,\n var(--dsg-tint) calc(var(--dsg-floor) * 100%),\n color-mix(in srgb, var(--dsg-tint) calc(var(--dsg-a2) * 100%), transparent) calc((1 - var(--dsg-floor)) * 100%));\n --dsg-fill-l3: color-mix(in srgb,\n var(--dsg-tint) calc(var(--dsg-floor-base-dark) * 100%),\n color-mix(in srgb, var(--dsg-tint) calc(var(--dsg-a3) * 100%), transparent) calc((1 - var(--dsg-floor-base-dark)) * 100%));\n\n /* document preview paper: fully opaque, never lets chat text show through */\n --dsg-doc-paper: #0c1322;\n\n --dsg-sheen-l1: linear-gradient(180deg, rgba(255, 255, 255, 0.07), rgba(255, 255, 255, 0.02) 38%, rgba(255, 255, 255, 0.01));\n --dsg-sheen-l2: linear-gradient(180deg, rgba(255, 255, 255, 0.11), rgba(255, 255, 255, 0.03) 38%, rgba(255, 255, 255, 0.01));\n --dsg-sheen-l3: linear-gradient(180deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.02) 38%, rgba(255, 255, 255, 0.03));\n\n --dsg-bevel-l1:\n inset 0 1px 0 rgba(255, 255, 255, 0.14),\n inset 0 -1px 0 rgba(255, 255, 255, 0.05),\n inset 0 0 0 0.5px rgba(255, 255, 255, 0.08),\n 0 8px 26px rgba(0, 0, 0, 0.22);\n --dsg-bevel-l2:\n inset 0 1px 0 rgba(255, 255, 255, 0.16),\n inset 0 -1px 0 rgba(255, 255, 255, 0.06),\n inset 0 0 0 0.5px rgba(255, 255, 255, 0.1),\n 0 14px 44px rgba(0, 0, 0, 0.32);\n --dsg-bevel-l3:\n inset 0 1px 0 rgba(255, 255, 255, 0.16),\n inset 0 0 0 1px rgba(255, 255, 255, 0.08),\n 0 24px 80px rgba(0, 0, 0, 0.48);\n\n --dsg-border-hair: rgba(150, 180, 255, 0.14);\n\n --dsw-specific-menu: color-mix(in srgb, #0d1524 86%, transparent);\n --dsw-menu-surface-fill: color-mix(in srgb, #0d1524 84%, transparent);\n --dsw-alias-menu-group-header-fill: rgba(13, 21, 36, 0.95);\n --dsw-specific-sidebar-nav-item-hover: rgba(255, 255, 255, 0.05);\n --dsw-specific-sidebar-nav-item-active-accent: rgba(77, 107, 254, 0.22);\n\n --dsw-alias-border-l1: rgba(150, 180, 255, 0.1);\n --dsw-alias-border-l2: rgba(150, 180, 255, 0.16);\n --dsw-alias-border-l3: rgba(150, 180, 255, 0.22);\n --dsw-alias-border-l4: rgba(150, 180, 255, 0.28);\n --dsw-elevation-stroke-color: rgba(150, 180, 255, 0.2);\n\n --dsw-alias-markdown-inline-code: rgba(120, 150, 255, 0.14);\n --dsw-alias-markdown-tag: rgba(120, 150, 255, 0.14);\n --dsw-alias-turn-trigger-bg-hover: var(--dsg-fill-l2);\n --dsw-alias-settings-card-fill: var(--dsg-fill-l2);\n --dsw-alias-settings-card-stroke: rgba(150, 180, 255, 0.18);\n\n --dsw-alias-label-primary: #eef3ff;\n --dsw-alias-label-secondary: #b9c6df;\n --dsw-alias-label-tertiary: #93a3c0;\n --dsw-alias-label-caption: #7d8da9;\n}\n\n/* ---- global texture: selection, focus, scrollbar ------------------------- */\nhtml[data-dsg='on'] ::selection {\n background: rgba(77, 107, 254, 0.22);\n}\nhtml[data-dsg='on'] body :focus-visible:not(:read-write) {\n outline-color: var(--dsg-blue-ring) !important;\n}\nhtml[data-dsg='on'] * {\n scrollbar-color: rgba(77, 107, 254, 0.28) transparent;\n}\nhtml[data-dsg='on'] ::-webkit-scrollbar-thumb {\n background: rgba(77, 107, 254, 0.24) !important;\n border-radius: 999px;\n}\nhtml[data-dsg='on'] ::-webkit-scrollbar-thumb:hover {\n background: rgba(77, 107, 254, 0.38) !important;\n}\n\n/* ---- runtime fallback: software rasteriser (syntax OK, frost missing) ---- */\nhtml[data-dsg='on'] body[data-dsg-fallback] {\n --dsg-fill-l1: rgba(250, 252, 255, 0.92);\n --dsg-fill-l2: rgba(252, 253, 255, 0.95);\n --dsg-fill-l3: rgba(255, 255, 255, 0.97);\n --dsg-backdrop-l1: none;\n --dsg-backdrop-l2: none;\n --dsg-backdrop-l3: none;\n --dsg-backdrop-panel: none;\n --dsw-menu-backdrop-filter: none;\n --dsw-mask-blur: none;\n --dsg-sheen-l1: none;\n --dsg-sheen-l2: none;\n --dsg-sheen-l3: none;\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme][data-dsg-fallback] {\n --dsg-fill-l1: rgba(13, 21, 36, 0.93);\n --dsg-fill-l2: rgba(16, 26, 44, 0.96);\n --dsg-fill-l3: rgba(18, 29, 49, 0.98);\n}\n\n/* ---- reduced motion ------------------------------------------------------- */\n@media (prefers-reduced-motion: reduce) {\n html[data-dsg='on'] .dsg-atmosphere .dsg-aurora {\n animation: none !important;\n }\n html[data-dsg='on'] * {\n transition-duration: 1ms !important;\n animation-duration: 1ms !important;\n }\n}\n\n@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {\n html[data-dsg='on'] body {\n --dsg-fill-l1: rgba(250, 252, 255, 0.9);\n --dsg-fill-l2: rgba(252, 253, 255, 0.94);\n --dsg-fill-l3: rgba(255, 255, 255, 0.97);\n --dsw-specific-menu: #fafcff;\n --dsw-menu-surface-fill: #fafcff;\n }\n html[data-dsg='on'] body[data-ds-dark-theme] {\n --dsg-fill-l1: rgba(13, 21, 36, 0.92);\n --dsg-fill-l2: rgba(16, 26, 44, 0.95);\n --dsg-fill-l3: rgba(18, 29, 49, 0.97);\n --dsw-specific-menu: #0f1728;\n --dsw-menu-surface-fill: #0f1728;\n }\n}\n\n/* ---- resize guard:拖动分栏时卸掉高成本材质 ---------------------------------\n client 半部在 pointerdown(cursor 为 *-resize 的手柄)时给 <html> 打\n data-dsg-resizing,松手立即移除。拖动期间每帧都会重排/重绘:\n · 任何 backdrop-filter 都会让 Chromium 重新采样整块背景 → 卡顿主因;\n · 沿移动边缘的超大外投影会逐帧重新栅格化。\n 这些玻璃背后的衬底是平滑的氛围层,去掉霜与远投影在拖动过程中几乎看不出;\n 静止态(含松手后的每一帧)与原来完全一致,不改变最终观感。 */\nhtml[data-dsg='on'][data-dsg-resizing] :is(\n [class*='_bubble']:not([role='tooltip']),\n [data-turn-trigger]\n ) {\n -webkit-backdrop-filter: none !important;\n backdrop-filter: none !important;\n /* 只保留内侧顶光/发丝边,去掉逐帧重栅格化的 44px 外投影 */\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.55),\n inset 0 -1px 0 rgba(255, 255, 255, 0.1),\n inset 0 0 0 0.5px rgba(255, 255, 255, 0.22) !important;\n}\nhtml[data-dsg='on'][data-dsg-resizing] body[data-ds-dark-theme] :is(\n [class*='_bubble']:not([role='tooltip']),\n [data-turn-trigger]\n ) {\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.14),\n inset 0 0 0 0.5px rgba(255, 255, 255, 0.1) !important;\n}\nhtml[data-dsg='on'][data-dsg-resizing] :is(\n [data-composer-card],\n [data-goal-bar] [class*='_bar'],\n [data-sidebar-right-panel]:not([aria-hidden='true']),\n [data-slot='conversation.header'] > header,\n div:has(> [data-slot='sidebar'])\n )::before {\n -webkit-backdrop-filter: none !important;\n backdrop-filter: none !important;\n}\n/* 侧栏/header 的外投影在拖动时收紧(移动边缘的大半径阴影最贵) */\nhtml[data-dsg='on'][data-dsg-resizing] [data-sidebar-right-panel] {\n box-shadow: -6px 0 16px rgba(44, 74, 140, 0.07) !important;\n}\nhtml[data-dsg='on'][data-dsg-resizing] [data-slot='conversation.header'] > header {\n box-shadow: 0 8px 20px -18px rgba(44, 74, 140, 0.4) !important;\n}\n\n/* ===== 10-shell.css ===== */\n/* ============================================================================\r\n dsh-skin-mistblue · 10 shell — 主壳 / 三栏 / Windows 标题栏 / 会话 header / 右栏外壳\r\n Owner: shell-dev. Consumes the glass engine in 00-foundation.css only.\r\n\r\n 规则来源:docs/UI-CONTRACT.md §3/§4、docs/GLASS-SPEC.md §1/§5、\r\n docs/DESIGN-SPEC.md §8.1/§8.2/§8.4、docs/SURFACE-MAP.md §2/§4/§6/§8。\r\n\r\n 硬约束(本文件逐步遵守):\r\n · Windows 标题栏是 frame 的 ::before(宿主壳层),模糊另起 ::after —— 伪元素没有\r\n 后代,永不成为 fixed 包含块(左栏 fixed 收起按钮安全)。\r\n · 会话 header 的霜只能挂 ::before;header 设 z-index:0 建普通层叠上下文(不是\r\n isolation —— isolation 会建 backdrop root,霜会失效)。\r\n · 右栏面板必须带 open 守卫(收起态 aria-hidden=true 仍挂载在布局里)。\r\n · 不在 frame / centerCol / rightbarCol 这些 fixed 祖先上挂 backdrop-filter。\r\n ========================================================================== */\r\n\r\n/* ---- shared shell vars (my own layer, foundation keeps the engine) -------- */\r\nhtml[data-dsg='on'] {\r\n --dsg-capsule: rgba(255, 255, 255, 0.55);\r\n --dsg-capsule-hover: rgba(255, 255, 255, 0.74);\r\n --dsg-row-hover: rgba(31, 58, 110, 0.055);\r\n --dsg-row-active: rgba(77, 107, 254, 0.12);\r\n --dsg-row-active-ink: #2f49d9;\r\n --dsg-hairline-soft: rgba(56, 88, 158, 0.1);\r\n --dsg-sheen-top: inset 0 1px 0 rgba(255, 255, 255, 0.55);\r\n --dsg-header-h: 57px;\r\n --dsg-shell-radius: 20px;\r\n /* 会话 header:悬浮玻璃条(比 L2 更透,好让顶部的雾蓝衬光透出来) */\r\n --dsg-header-radius: 18px;\r\n --dsg-header-fill: color-mix(in srgb, #ffffff 17%, transparent);\r\n --dsg-header-backdrop: blur(calc(24px * var(--dsg-blur, 1))) saturate(1.65) brightness(1.02);\r\n --dsg-header-sweep: linear-gradient(\r\n 112deg,\r\n rgba(255, 255, 255, 0.22) 0%,\r\n rgba(255, 255, 255, 0.05) 34%,\r\n rgba(255, 255, 255, 0) 58%\r\n );\r\n /* 右侧栏面板:只留一层玻璃。dockkit 各层容器与内容自带半透明底,必须清零,\r\n 否则层层叠加会把整块面板洗成不透明白(旧版就是这个问题)。 */\r\n --dsg-panel-fill: color-mix(in srgb, #ffffff 18%, transparent);\r\n --dsg-panel-backdrop: blur(calc(22px * var(--dsg-blur, 1))) saturate(1.55) brightness(1.02);\r\n}\r\nhtml[data-dsg='on'] body[data-ds-dark-theme] {\r\n --dsg-capsule: rgba(255, 255, 255, 0.08);\r\n --dsg-capsule-hover: rgba(255, 255, 255, 0.13);\r\n --dsg-row-hover: rgba(255, 255, 255, 0.06);\r\n --dsg-row-active: rgba(123, 147, 255, 0.18);\r\n --dsg-row-active-ink: #9fb4ff;\r\n --dsg-hairline-soft: rgba(150, 180, 255, 0.12);\r\n --dsg-sheen-top: inset 0 1px 0 rgba(255, 255, 255, 0.14);\r\n --dsg-header-fill: color-mix(in srgb, #0d1524 47%, transparent);\r\n --dsg-header-backdrop: blur(calc(24px * var(--dsg-blur, 1))) saturate(1.4) brightness(1.05);\r\n --dsg-header-sweep: linear-gradient(\r\n 112deg,\r\n rgba(255, 255, 255, 0.08) 0%,\r\n rgba(255, 255, 255, 0.02) 34%,\r\n rgba(255, 255, 255, 0) 58%\r\n );\r\n --dsg-panel-fill: color-mix(in srgb, #0d1524 46%, transparent);\r\n --dsg-panel-backdrop: blur(calc(22px * var(--dsg-blur, 1))) saturate(1.35) brightness(1.04);\r\n}\r\n\r\n/* ============================================================\r\n 1. 页面底 / 主壳\r\n ============================================================ */\r\n/* 整窗彻底透明:氛围层是唯一背衬。结构锚点:root slot 的直接子 div = frame;\r\n 不写整串哈希类名([class*=\"_frame\"] 太宽,只作为结构选择器的组合项)。 */\r\nhtml[data-dsg='on'] [data-slot='root'] > [class*='_frame'] {\r\n background: transparent !important;\r\n}\r\nhtml[data-dsg='on'] [data-slot='main'] {\r\n background: transparent !important;\r\n}\r\n/* 底部槽 / 浮层挂载点:不铺底 */\r\nhtml[data-dsg='on'] [data-shell-bottom] {\r\n background: transparent !important;\r\n}\r\nhtml[data-dsg='on'] [data-shell-overlay] {\r\n background: transparent;\r\n}\r\n/* 中列:不铺整块地板(大滚动容器禁止挂霜)。只留顶部一段很淡的雾蓝衬光,\r\n 让氛围层是画布本身、玻璃面浮在雾上 —— 这是「空气感」的来源,也是悬浮\r\n header 玻璃条背后能“看出模糊”的衬底。 */\r\nhtml[data-dsg='on'] div:has(> [data-slot='main']) {\r\n background:\r\n radial-gradient(78% 240px at 18% 0, rgba(120, 152, 219, 0.3) 0%, rgba(120, 152, 219, 0) 72%),\r\n radial-gradient(64% 250px at 82% 0, rgba(146, 178, 230, 0.26) 0%, rgba(146, 178, 230, 0) 76%),\r\n linear-gradient(\r\n 180deg,\r\n rgba(255, 255, 255, 0.16) 0,\r\n rgba(255, 255, 255, 0.04) 200px,\r\n rgba(255, 255, 255, 0) 440px\r\n );\r\n border-radius: var(--dsg-shell-radius) var(--dsg-shell-radius) 0 0;\r\n box-shadow: inset -0.5px 0 0 var(--dsg-hairline-soft);\r\n}\r\nhtml[data-dsg='on'] body[data-ds-dark-theme] div:has(> [data-slot='main']) {\r\n background:\r\n radial-gradient(78% 240px at 18% 0, rgba(64, 96, 168, 0.34) 0%, rgba(64, 96, 168, 0) 72%),\r\n radial-gradient(64% 250px at 82% 0, rgba(77, 107, 254, 0.22) 0%, rgba(77, 107, 254, 0) 76%),\r\n linear-gradient(\r\n 180deg,\r\n rgba(255, 255, 255, 0.05) 0,\r\n rgba(255, 255, 255, 0.015) 200px,\r\n rgba(255, 255, 255, 0) 440px\r\n );\r\n}\r\n/* 右栏 track 本身透明;面板在下面单独画 */\r\nhtml[data-dsg='on'] [data-rightbar-col] {\r\n background: transparent !important;\r\n}\r\n\r\n/* ============================================================\r\n 2. Windows 原生窗口标题栏(frame 的 ::before 是它唯一底色)\r\n ============================================================ */\r\n/* 底色 + 恒定白釉(不能用三段渐变:40px 与 1111px 的盒子会算出不同釉光) */\r\nhtml[data-dsg='on'][data-windows-titlebar] [data-slot='root'] > [class*='_frame']::before {\r\n background-color: var(--dsg-fill-l1) !important;\r\n background-image: linear-gradient(180deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.1)) !important;\r\n border-bottom: 0.5px solid var(--dsg-border-hair);\r\n}\r\nhtml[data-dsg='on'][data-windows-titlebar] body[data-ds-dark-theme] [data-slot='root'] > [class*='_frame']::before {\r\n background-image: linear-gradient(180deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.04)) !important;\r\n}\r\nhtml[data-dsg='on'][data-windows-titlebar] [data-slot='root'] > [class*='_frame']::after {\r\n content: '';\r\n position: absolute;\r\n inset: 0 0 auto;\r\n height: var(--dsh-windows-titlebar-height, 40px);\r\n pointer-events: none;\r\n -webkit-backdrop-filter: var(--dsg-backdrop-l1);\r\n backdrop-filter: var(--dsg-backdrop-l1);\r\n}\r\n\r\n/* ============================================================\r\n 3. 会话 header:悬浮 L2 玻璃条 + DeepSeek tab 语言(高度 ~57px)\r\n ============================================================ */\r\n/* 外槽内缩:玻璃条与列边缘之间露出氛围层 —— 和 composer 同一套「浮在雾上」的\r\n 语言,也是“透明”能被看见的前提(背后不再是同一块白板)。 */\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] {\r\n padding: 9px 12px 8px;\r\n background: transparent !important;\r\n}\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header {\r\n position: relative;\r\n z-index: 0; /* 普通层叠上下文,让 ::before 的负 z-index 有落脚点 */\r\n padding: 3px 20px 2px !important;\r\n min-height: var(--dsg-header-h);\r\n border: 0 !important;\r\n border-radius: var(--dsg-header-radius);\r\n background: transparent !important;\r\n /* 外投影只放在本体的外圈;内釉光/发丝边交给 ::before(它在负 z-index 上,\r\n 比本体的 box-shadow 后绘制,否则会被填充层盖掉)。 */\r\n box-shadow:\r\n 0 20px 46px -30px rgba(44, 74, 140, 0.55),\r\n 0 2px 10px rgba(44, 74, 140, 0.06);\r\n transition: box-shadow var(--dsg-motion-dur) var(--dsg-ease);\r\n}\r\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-slot='conversation.header'] > header {\r\n box-shadow:\r\n 0 20px 46px -30px rgba(0, 0, 0, 0.66),\r\n 0 2px 10px rgba(0, 0, 0, 0.26);\r\n}\r\n/* 霜 + 填充 + 釉光:唯一载体(伪元素无后代,永不成为 fixed 包含块) */\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header::before {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n z-index: -1;\r\n pointer-events: none;\r\n border-radius: inherit;\r\n background-color: var(--dsg-header-fill);\r\n background-image: var(--dsg-header-sweep), var(--dsg-sheen-l2);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.72),\r\n inset 0 0 0 0.5px rgba(255, 255, 255, 0.4),\r\n inset 0 -16px 24px -22px rgba(58, 92, 158, 0.3);\r\n -webkit-backdrop-filter: var(--dsg-header-backdrop);\r\n backdrop-filter: var(--dsg-header-backdrop);\r\n}\r\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-slot='conversation.header'] > header::before {\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.16),\r\n inset 0 0 0 0.5px rgba(255, 255, 255, 0.12),\r\n inset 0 -16px 24px -22px rgba(0, 0, 0, 0.4);\r\n}\r\n/* 窄窗:贴边、圆角收小,别把内容挤扁 */\r\n@media (max-width: 760px) {\r\n html[data-dsg='on'] [data-slot='conversation.header'] {\r\n padding: 8px 8px 6px;\r\n }\r\n html[data-dsg='on'] [data-slot='conversation.header'] > header {\r\n padding: 2px 14px 2px !important;\r\n border-radius: 14px;\r\n }\r\n}\r\n/* 回退:无霜 / 软件光栅化时保持近不透明,几何与布局不变 */\r\n@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {\r\n html[data-dsg='on'] body {\r\n --dsg-header-fill: rgba(250, 252, 255, 0.94);\r\n }\r\n html[data-dsg='on'] body[data-ds-dark-theme] {\r\n --dsg-header-fill: rgba(15, 24, 40, 0.95);\r\n }\r\n}\r\nhtml[data-dsg='on'] body[data-dsg-fallback] {\r\n --dsg-header-fill: rgba(251, 253, 255, 0.94);\r\n --dsg-header-backdrop: none;\r\n}\r\nhtml[data-dsg='on'] body[data-ds-dark-theme][data-dsg-fallback] {\r\n --dsg-header-fill: rgba(15, 24, 40, 0.95);\r\n}\r\n/* 标题行更紧凑:52–57px 的 DeepSeek 观感,而不是 76px 的宿主默认 */\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header [class*='_titleRow'] {\r\n min-height: 24px;\r\n align-items: center;\r\n}\r\n/* header 里的动作簇统一压到 26px,避免把标题行撑高 */\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header :is(\r\n [data-slot='conversation.session.header.actions'],\r\n [data-slot='conversation.session.header.utilities'],\r\n [data-slot='conversation.session.header.corner']\r\n ) button {\r\n height: 26px;\r\n min-height: 26px;\r\n font-size: 12.5px;\r\n}\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header [class*='_crumb'] {\r\n color: var(--dsw-alias-label-tertiary);\r\n border-radius: 8px;\r\n font-size: 13px;\r\n line-height: 20px;\r\n padding: 2px 8px;\r\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease);\r\n}\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header button[class*='_crumb']:hover {\r\n background: var(--dsg-row-hover);\r\n color: var(--dsw-alias-label-primary);\r\n}\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header [class*='_crumbCurrent'] {\r\n color: var(--dsw-alias-label-primary);\r\n font-size: 15px;\r\n font-weight: 600;\r\n letter-spacing: 0.01em;\r\n padding-left: 4px;\r\n}\r\n/* 顶部动作区:一律胶囊化,hover 玻璃反馈 */\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header :is(\r\n [data-slot='conversation.session.header.actions'],\r\n [data-slot='conversation.session.header.utilities'],\r\n [data-slot='conversation.session.header.corner']\r\n ) button {\r\n border-radius: 999px;\r\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease);\r\n}\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header :is(\r\n [data-slot='conversation.session.header.actions'],\r\n [data-slot='conversation.session.header.utilities'],\r\n [data-slot='conversation.session.header.corner']\r\n ) button:hover {\r\n background: var(--dsg-row-hover);\r\n}\r\n/* header 里的「打开方式」拆分按钮:整组做成胶囊 */\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header [data-slot='conversation.session.header.utilities'] [class*='_split'] {\r\n border-radius: 999px;\r\n border: 0.5px solid var(--dsg-hairline-soft);\r\n background: var(--dsg-capsule);\r\n overflow: hidden;\r\n transition: background-color 140ms var(--dsg-ease), border-color 140ms var(--dsg-ease);\r\n}\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header [data-slot='conversation.session.header.utilities'] [class*='_split']:hover {\r\n background: var(--dsg-capsule-hover);\r\n border-color: rgba(77, 107, 254, 0.2);\r\n}\r\n/* tabs:DeepSeek 风格——未选中弱化、选中蓝字 + 圆角下划线 */\r\nhtml[data-dsg='on'] [data-conversation-tabs] {\r\n gap: 28px;\r\n margin-top: 0;\r\n padding-left: 6px;\r\n}\r\nhtml[data-dsg='on'] [data-conversation-tabs] [role='tab'] {\r\n color: var(--dsw-alias-label-tertiary);\r\n font-size: 13px;\r\n font-weight: 500;\r\n line-height: 16px;\r\n padding: 2px 1px 7px;\r\n border-radius: 8px 8px 0 0;\r\n transition: color 140ms var(--dsg-ease), background-color 140ms var(--dsg-ease);\r\n}\r\nhtml[data-dsg='on'] [data-conversation-tabs] [role='tab']::after {\r\n height: 2.5px;\r\n border-radius: 999px;\r\n background: transparent;\r\n transition: background-color 160ms var(--dsg-ease), box-shadow 160ms var(--dsg-ease);\r\n}\r\nhtml[data-dsg='on'] [data-conversation-tabs] [role='tab']:hover {\r\n color: var(--dsw-alias-label-primary);\r\n}\r\nhtml[data-dsg='on'] [data-conversation-tabs] [role='tab']:hover::after {\r\n background: rgba(77, 107, 254, 0.22);\r\n}\r\nhtml[data-dsg='on'] [data-conversation-tabs] [role='tab'][aria-selected='true'] {\r\n color: var(--dsg-blue);\r\n font-weight: 600;\r\n}\r\nhtml[data-dsg='on'] [data-conversation-tabs] [role='tab'][aria-selected='true']::after {\r\n background: var(--dsg-blue);\r\n box-shadow: 0 2px 8px rgba(77, 107, 254, 0.35);\r\n}\r\n/* header 里的其它小控件(会话层级 lineage / 团队标签)弱化 */\r\nhtml[data-dsg='on'] [data-slot='conversation.header'] > header [class*='_label'] {\r\n color: var(--dsw-alias-label-tertiary);\r\n}\r\n\r\n/* ============================================================\r\n 4. 右栏面板(外壳一层;内容卡片归 60-settings.css)\r\n ============================================================ */\r\nhtml[data-dsg='on'] [data-rightbar-col] [data-sidebar-right-panel]:not([aria-hidden='true']) {\r\n z-index: var(--dsh-dockkit-dock-layer, 10);\r\n border-radius: var(--dsg-shell-radius) 0 0 var(--dsg-shell-radius);\r\n}\r\nhtml[data-dsg='on'] [data-rightbar-col] [data-sidebar-right-panel]:not([aria-hidden='true'])::before {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n z-index: -1;\r\n pointer-events: none;\r\n border-radius: inherit;\r\n background-color: var(--dsg-panel-fill);\r\n background-image: var(--dsg-sheen-l2);\r\n box-shadow: inset 0.5px 0 0 var(--dsg-hairline-soft), inset 1px 0 0 rgba(255, 255, 255, 0.42);\r\n -webkit-backdrop-filter: var(--dsg-panel-backdrop);\r\n backdrop-filter: var(--dsg-panel-backdrop);\r\n}\r\n/* 收起态显式清干净(容器仍在布局里) */\r\nhtml[data-dsg='on'] [data-rightbar-col] [data-sidebar-right-panel][aria-hidden='true']::before {\r\n content: none;\r\n}\r\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-rightbar-col] [data-sidebar-right-panel]:not([aria-hidden='true'])::before {\r\n box-shadow: inset 0.5px 0 0 rgba(255, 255, 255, 0.08);\r\n}\r\n/* dockkit tab strip:胶囊 tab */\r\nhtml[data-dsg='on'] [data-dockkit-strip] {\r\n padding: 0 6px;\r\n}\r\nhtml[data-dsg='on'] [data-dockkit-strip] [data-dockkit-tab] {\r\n border-radius: 9px;\r\n color: var(--dsw-alias-label-tertiary);\r\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease);\r\n}\r\nhtml[data-dsg='on'] [data-dockkit-strip] [data-dockkit-tab]:hover {\r\n background: var(--dsg-row-hover);\r\n color: var(--dsw-alias-label-secondary);\r\n}\r\nhtml[data-dsg='on'] [data-dockkit-strip] [data-dockkit-tab][aria-selected='true'] {\r\n background: var(--dsg-row-active);\r\n color: var(--dsg-row-active-ink);\r\n}\r\n/* dockkit 分栏把手 / 内容区不铺底 */\r\nhtml[data-dsg='on'] [data-dockkit-pane],\r\nhtml[data-dsg='on'] [data-dockkit-content] {\r\n background: transparent !important;\r\n}\r\n\r\n/* ============================================================\r\n 5. 滚动条:宿主局部覆盖回本色(foundation 给的是全局细蓝条)\r\n ============================================================ */\r\nhtml[data-dsg='on'] [data-conversation-scroll],\r\nhtml[data-dsg='on'] [data-sidebar-right-panel] [data-dockkit-pane] {\r\n --dsh-scrollbar-thumb: rgba(77, 107, 254, 0.22);\r\n --dsh-scrollbar-thumb-hover: rgba(77, 107, 254, 0.36);\r\n}\n\n/* ===== 12-windows-titlebar.css ===== */\n/* ============================================================================\r\n 12 windows titlebar — 修复 Windows 原生标题栏(菜单条 + 窗口控制按钮)色差\r\n ----------------------------------------------------------------------------\r\n 背景:DSH Desktop 的 preload 注入一个 Shadow DOM 菜单条 div[data-windows-menu],\r\n 并用一个隐藏探针 span(background-color: var(--dsw-specific-sidebar-fill))\r\n 通过 canvas 取色后 IPC 给主进程 setTitleBarOverlay(color, symbolColor)。\r\n 我们把这些 token 改成了半透明玻璃后,Electron 的 titleBarOverlay 把 alpha\r\n 合成到黑色背衬上 → 顶部出现一条深色/突兀的带;浅色模式同样存在。\r\n\r\n 修法(全部为 CSS,不改宿主):\r\n 1. 探针改成不透明主题色 → 主进程收到不透明 rgba,原生窗口控件区与主题一致。\r\n 2. 网页侧标题栏底色用同一实体色 → 菜单区/控件区/网页区三者同色,不再三层色差。\r\n 3. 给菜单条左侧补上 DSH 官方鲸标(从 primitives 提取的 path,mask 着色)。\r\n ========================================================================== */\r\n\r\nhtml[data-dsg='on'][data-windows-titlebar] {\r\n --dsg-titlebar-solid: #eaf1fb;\r\n --dsg-titlebar-ink: #101728;\r\n}\r\nhtml[data-dsg='on'][data-windows-titlebar] body[data-ds-dark-theme] {\r\n --dsg-titlebar-solid: #0b1322;\r\n --dsg-titlebar-ink: #eef3ff;\r\n}\r\n\r\n/* 1) 探针:让主进程拿到不透明标题栏色(样式表 !important 胜过 inline 非 important) */\r\nhtml[data-dsg='on'] body > span[style*='--dsw-specific-sidebar-fill'] {\r\n background-color: var(--dsg-titlebar-solid) !important;\r\n}\r\nhtml[data-dsg='on'] body[data-ds-dark-theme] > span[style*='--dsw-specific-sidebar-fill'] {\r\n background-color: #0b1322 !important;\r\n}\r\n\r\n/* 2) 网页侧标题栏:与原生 overlay 同色;实体色避免透明叠黑 */\r\nhtml[data-dsg='on'][data-windows-titlebar] [data-slot='root'] > [class*='_frame']::before {\r\n background-color: var(--dsg-titlebar-solid) !important;\r\n background-image: linear-gradient(180deg, rgba(255, 255, 255, 0.16), rgba(255, 255, 255, 0) 60%) !important;\r\n border-bottom: 0.5px solid var(--dsg-border-hair, rgba(56, 88, 158, 0.14)) !important;\r\n -webkit-backdrop-filter: none !important;\r\n backdrop-filter: none !important;\r\n}\r\n/* 原生条上不再挂霜(大面 blur 无收益,且会与 native overlay 抢层) */\r\nhtml[data-dsg='on'][data-windows-titlebar] [data-slot='root'] > [class*='_frame']::after {\r\n content: none !important;\r\n -webkit-backdrop-filter: none !important;\r\n backdrop-filter: none !important;\r\n}\r\n\r\n/* 3) 菜单条:\r\n · 宿主 div[data-windows-menu] 保持完全透明,与标题栏背景同色;\r\n · 不再自绘左侧图标 —— 标题栏左侧 12px 处是 DSH 自带的「侧栏收起/展开」按钮\r\n (collapsed 时 48px 处还有「新会话」按钮),自绘图标会与之重叠;\r\n · 菜单起点只在「侧栏展开」时右移到 54px(给 native toggle 留位);\r\n 收起时交回 DSH 的 84px,避开左侧两个 28px 按钮。 */\r\nhtml[data-dsg='on'][data-windows-titlebar]:not(:has([data-sidebar-collapsed='true'])) {\r\n --dsh-windows-menu-start: 54px;\r\n}\r\nhtml[data-dsg='on'][data-windows-titlebar] div[data-windows-menu] {\r\n background: transparent !important;\r\n background-color: transparent !important;\r\n box-shadow: none !important;\r\n color: var(--dsw-alias-label-secondary);\r\n}\n\n/* ===== 20-sidebar.css ===== */\n/* ============================================================================\n dsh-skin-mistblue · 20 sidebar — 左栏(品牌 / 新会话 / 面板列表 / 工作区会话树 / footer)\n Owner: shell-dev.\n\n 玻璃策略(GLASS-SPEC §5 #131 / SURFACE-MAP §8):\n · 左栏列 = `div:has(> [data-slot=\"sidebar\"])`;模糊挂列的 ::before,列自身\n `position:relative; z-index:0`。宿主在 Windows 下把「收起/展开」与「收起态新会话」\n 两个按钮写成 position:fixed,挂列上会让它们改锚、被裁掉。\n · 列 = L2 玻璃(fill-l2 + backdrop-l2 + sheen + 右缘发丝/内阴影)。\n · 内层 [data-slot=\"sidebar\"] 是 display:contents 锚点(不生成盒子),真正的内容根\n `._2H3hWW_root` 自带 sidebar-fill 实底 —— 必须清掉,否则列上叠两层地板。\n · 行级只做 hover/selected 的柔光,不单独挂霜(“one blur per shell”)。\n ========================================================================== */\n\n/* ---- 1. 左栏列:L2 玻璃 ------------------------------------------------ */\nhtml[data-dsg='on'] div:has(> [data-slot='sidebar']) {\n position: relative;\n z-index: 0;\n background: transparent !important;\n /* 玻璃边界:发丝线画在元素边框上(::before 的 inset:0 不会盖住 border) */\n border-right: 0.5px solid var(--dsg-border-hair) !important;\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] div:has(> [data-slot='sidebar']) {\n border-right-color: rgba(150, 180, 255, 0.14) !important;\n}\nhtml[data-dsg='on'] div:has(> [data-slot='sidebar'])::before {\n content: '';\n position: absolute;\n inset: 0;\n z-index: -1;\n pointer-events: none;\n background-color: var(--dsg-fill-l2);\n background-image: var(--dsg-sheen-l2);\n /* 内侧白光 + 柔和内投影:挂在 ::before 上才会画在填充层之上 */\n box-shadow:\n inset -1px 0 0 rgba(255, 255, 255, 0.5),\n inset -26px 0 30px -30px rgba(44, 74, 140, 0.32);\n -webkit-backdrop-filter: var(--dsg-backdrop-l2);\n backdrop-filter: var(--dsg-backdrop-l2);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] div:has(> [data-slot='sidebar'])::before {\n box-shadow:\n inset -1px 0 0 rgba(255, 255, 255, 0.08),\n inset -26px 0 30px -30px rgba(0, 0, 0, 0.5);\n}\n/* 右侧玻璃厚度:一条很窄的纵向高光,让左栏从背景里“立”起来 */\nhtml[data-dsg='on'] div:has(> [data-slot='sidebar'])::after {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n width: 14px;\n z-index: -1;\n pointer-events: none;\n background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.28) 100%);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] div:has(> [data-slot='sidebar'])::after {\n background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.06) 100%);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-slot='sidebar'] [class*='_searchExpanded'] {\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1) !important;\n}\n/* 内容根:清掉宿主的 sidebar-fill,避免二次铺底 */\nhtml[data-dsg='on'] [data-slot='sidebar'] > [class*='_root'] {\n background: transparent !important;\n color: var(--dsw-alias-label-primary);\n --dsh-sidebar-inline-padding: 12px;\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] > [class*='_root']::before,\nhtml[data-dsg='on'] [data-slot='sidebar'] > [class*='_root']::after {\n background: transparent !important;\n}\n\n/* ---- 2. 品牌行 ---------------------------------------------------------- */\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_logoRow'] {\n gap: 6px;\n padding-left: 6px;\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_brand'] {\n border-radius: 10px;\n transition: opacity 160ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_brand']:hover {\n opacity: 0.85;\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_brandName'] {\n letter-spacing: 0.05em;\n font-weight: 600;\n font-size: 17px;\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_iconButton'] {\n border-radius: 9px;\n color: var(--dsw-alias-label-tertiary);\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_iconButton']:hover {\n background: var(--dsg-row-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n/* ---- 3. 新会话:DeepSeek 白釉胶囊(蓝色 + 号 + hover 抬升)---------------- */\nhtml[data-dsg='on'] [data-slot='sidebar'] button[class*='_newSession'] {\n height: 38px;\n margin: 0 2px 12px;\n border-radius: 12px;\n border: 0.5px solid var(--dsg-hairline-soft);\n background: var(--dsg-capsule) !important;\n color: var(--dsw-alias-label-primary);\n font-size: 13.5px;\n font-weight: 500;\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.55),\n 0 1px 2px rgba(23, 42, 84, 0.06);\n transition:\n background-color 160ms var(--dsg-ease),\n box-shadow 160ms var(--dsg-ease),\n transform 160ms var(--dsg-ease),\n border-color 160ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] button[class*='_newSession']:hover {\n background: var(--dsg-capsule-hover) !important;\n border-color: rgba(77, 107, 254, 0.22);\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.6),\n 0 4px 12px -2px rgba(23, 42, 84, 0.14),\n 0 1px 2px rgba(23, 42, 84, 0.06);\n transform: translateY(-1px);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] button[class*='_newSession']:active {\n transform: translateY(0) scale(0.99);\n}\n/* + 号用品牌蓝,文字保持墨色 */\nhtml[data-dsg='on'] [data-slot='sidebar'] button[class*='_newSession'] [class*='_newSessionContent'] > svg {\n color: var(--dsg-blue);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] button[class*='_newSession'] [class*='_newSessionShortcut'] {\n color: var(--dsw-alias-label-caption);\n opacity: 0.8;\n}\n\n/* ---- 4. 全局面板列表(上下文洞察 / 插件 / 自动化 / 技能 / MCP)------------ */\nhtml[data-dsg='on'] [data-slot='sidebar'] nav[class*='_panelList'] {\n gap: 2px;\n margin-bottom: 10px;\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] nav[class*='_panelList'] button {\n min-height: 36px;\n height: 36px;\n padding: 0 10px;\n gap: 10px;\n border-radius: 10px;\n color: var(--dsw-alias-label-secondary);\n font-size: 13.5px;\n font-weight: 500;\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease),\n box-shadow 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] nav[class*='_panelList'] button [class*='_panelGlyph'] {\n color: var(--dsw-alias-label-tertiary);\n transition: color 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] nav[class*='_panelList'] button:hover {\n background: var(--dsg-row-hover);\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] nav[class*='_panelList'] button:hover [class*='_panelGlyph'] {\n color: var(--dsg-blue);\n}\n/* 选中:蓝色柔光胶囊(不是实心块) */\nhtml[data-dsg='on'] [data-slot='sidebar'] nav[class*='_panelList'] button[class*='_panelActive'] {\n background: var(--dsg-row-active);\n color: var(--dsg-row-active-ink);\n box-shadow: inset 0 0 0 0.5px rgba(77, 107, 254, 0.16);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] nav[class*='_panelList'] button[class*='_panelActive'] [class*='_panelGlyph'] {\n color: var(--dsg-blue);\n}\n\n/* ---- 5. 工作区 / 会话树 ------------------------------------------------- */\n/* section header:工作区标签 + 搜索 + 视图按钮 */\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_sectionHeader'] {\n height: 34px;\n margin-top: 6px;\n margin-bottom: 2px;\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_sectionLabel'] {\n color: var(--dsw-alias-label-tertiary);\n font-size: 12px;\n font-weight: 600;\n letter-spacing: 0.04em;\n}\n/* 搜索:默认只是一枚图标;展开后是胶囊玻璃 + 蓝色 focus ring */\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_search'] {\n border-radius: 10px;\n transition: background-color 160ms var(--dsg-ease), box-shadow 160ms var(--dsg-ease),\n border-color 160ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_searchExpanded'] {\n background: var(--dsg-capsule) !important;\n border: 0.5px solid var(--dsg-hairline-soft) !important;\n border-radius: 10px;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.4);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_searchExpanded']:focus-within {\n border-color: rgba(77, 107, 254, 0.55) !important;\n box-shadow: 0 0 0 2px var(--dsg-blue-ring);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_searchInput'] {\n font-size: 12.5px;\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_searchInput']::placeholder {\n color: var(--dsw-alias-label-caption);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_searchButton']:hover,\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_clearButton']:hover {\n background: var(--dsg-row-hover);\n border-radius: 8px;\n}\n/* 行:圆角柔光,不铺底 */\nhtml[data-dsg='on'] [data-slot='sidebar'] [role='treeitem'] {\n border-radius: 10px;\n color: var(--dsw-alias-label-secondary);\n transition: background-color 130ms var(--dsg-ease), color 130ms var(--dsg-ease),\n box-shadow 130ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [role='treeitem']:hover {\n background: var(--dsg-row-hover) !important;\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [role='treeitem'][aria-selected='true'] {\n background: var(--dsg-row-active) !important;\n color: var(--dsw-alias-label-primary);\n box-shadow: inset 0 0 0 0.5px rgba(77, 107, 254, 0.14);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [role='treeitem'] [class*='_title'] {\n font-size: 13.5px;\n line-height: 20px;\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [role='treeitem'] [class*='_time'] {\n color: var(--dsw-alias-label-caption);\n font-size: 10.5px;\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_projectRow'] {\n height: 32px;\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_projectText'] [class*='_title'] {\n font-weight: 500;\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_folderActive'] {\n color: var(--dsg-blue);\n}\n/* hover 才出现的行内操作按钮 */\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_rowActions'] [class*='_iconButton'] {\n border-radius: 7px;\n color: var(--dsw-alias-label-tertiary);\n transition: background-color 120ms var(--dsg-ease), color 120ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_rowActions'] [class*='_iconButton']:hover {\n background: rgba(77, 107, 254, 0.1);\n color: var(--dsg-blue);\n}\n/* 列表底部渐隐:跟随 L2 玻璃色(宿主的 sidebar-fill 现在是 L1,会对不上) */\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_fade'] {\n background: linear-gradient(to bottom, transparent, var(--dsg-fill-l2)) !important;\n}\n/* 会话溢出行(+N 更多) */\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_sessionOverflowButton'] {\n border-radius: 8px;\n color: var(--dsw-alias-label-tertiary);\n transition: color 120ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_sessionOverflowButton']:hover {\n color: var(--dsg-blue);\n}\n\n/* ---- 6. footer:设置入口 / 用户区 / 新版本 ------------------------------- */\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_footArea'] {\n gap: 2px;\n margin-top: 6px;\n padding-top: 8px;\n padding-bottom: 4px;\n border-top: 0.5px solid var(--dsg-hairline-soft);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_footArea'] button {\n border-radius: 10px;\n color: var(--dsw-alias-label-secondary);\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_footArea'] button:hover {\n background: var(--dsg-row-hover);\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [data-slot='sidebar.settings'] button {\n min-height: 38px;\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_footArea'] [class*='_avatar'] {\n border-radius: 999px;\n box-shadow: inset 0 0 0 0.5px var(--dsg-hairline-soft);\n}\n/* 「新版本」小胶囊:品牌蓝弱底 */\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_indicator'] {\n height: 26px;\n border-radius: 999px;\n border: 0.5px solid rgba(77, 107, 254, 0.22);\n background: var(--dsg-blue-soft);\n color: var(--dsg-blue);\n font-size: 11.5px;\n font-weight: 500;\n transition: background-color 140ms var(--dsg-ease), transform 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='sidebar'] [class*='_indicator']:hover {\n background: rgba(77, 107, 254, 0.18);\n transform: translateY(-1px);\n}\n\n/* ---- 7. 收起态(56px rail):不要胶囊化,也不叠底 ---------------------- */\n/* 收起态两个 28×28 的标题栏按钮(展开/折叠 + 新建会话)由宿主用 position:fixed\n 钉在原生标题栏里;这里必须把几何完全交回宿主(28×28、无 margin/内边距),\n 只统一“材质”—— 否则基础规则的 38px 高/12px 圆角/品牌蓝图标会把 + 号顶歪。*/\nhtml[data-dsg='on'] [data-sidebar-collapsed] [data-slot='sidebar'] button[class*='_newSession'] {\n width: 28px !important;\n height: 28px !important;\n min-width: 28px !important;\n min-height: 28px !important;\n margin: 0 !important;\n padding: 0 !important;\n border: none !important;\n border-radius: 8px !important;\n background: transparent !important;\n box-shadow: none !important;\n transform: none !important;\n color: var(--dsw-alias-label-secondary) !important;\n}\nhtml[data-dsg='on'] [data-sidebar-collapsed] [data-slot='sidebar'] button[class*='_newSession'] [class*='_newSessionContent'] {\n padding: 0 !important;\n gap: 0 !important;\n justify-content: center !important;\n}\n/* 收起态的 + 号回到中性墨色(品牌蓝只留给展开态的主 CTA),并与 panel 图标同尺寸 */\nhtml[data-dsg='on'] [data-sidebar-collapsed] [data-slot='sidebar'] button[class*='_newSession'] [class*='_newSessionContent'] > svg {\n color: var(--dsw-alias-label-secondary) !important;\n width: 16px !important;\n height: 16px !important;\n}\nhtml[data-dsg='on'] [data-sidebar-collapsed] [data-slot='sidebar'] button[class*='_newSession']:hover {\n background: var(--dsg-row-hover) !important;\n color: var(--dsw-alias-label-primary) !important;\n}\nhtml[data-dsg='on'] [data-sidebar-collapsed] [data-slot='sidebar'] button[class*='_newSession']:hover [class*='_newSessionContent'] > svg {\n color: var(--dsw-alias-label-primary) !important;\n}\n/* 收起按钮右上角是「桌面更新」徽标(6px 品牌蓝圆点);收起态只需要一个干净的\n panel 图标 —— 更新提示仍保留在展开态 footer 的「新版本」胶囊里。 */\nhtml[data-dsg='on'] [data-sidebar-collapsed] [data-slot='sidebar'] button[class*='_toggle'] [class*='_badge'] {\n display: none !important;\n}\nhtml[data-dsg='on'] [data-sidebar-collapsed] [data-slot='sidebar'] [class*='_panelList'] {\n gap: 8px;\n}\nhtml[data-dsg='on'] [data-sidebar-collapsed] [data-slot='sidebar'] [class*='_panelRow'] {\n border-radius: 12px;\n background: transparent;\n}\nhtml[data-dsg='on'] [data-sidebar-collapsed] [data-slot='sidebar'] [class*='_panelRow']:hover {\n background: var(--dsg-row-hover);\n}\nhtml[data-dsg='on'] [data-sidebar-collapsed] [data-slot='sidebar'] [class*='_footArea'] {\n border-top: none;\n}\n\n/* ---- 8. 深色:蓝色柔光再压一档,避免发灰 -------------------------------- */\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-slot='sidebar'] nav[class*='_panelList'] button[class*='_panelActive'] {\n box-shadow: inset 0 0 0 0.5px rgba(123, 147, 255, 0.22);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-slot='sidebar'] button[class*='_newSession'] {\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.14),\n 0 1px 2px rgba(0, 0, 0, 0.35);\n}\n\n/* ===== 21-collapsed-titlebar.css ===== */\n/* 收起态(标题栏里的 rail 按钮)的 tooltip 修复 ---------------------------------\n Windows 标题栏里「展开/折叠」与「新建会话」两个按钮在收起态是 position:fixed、\n 位于侧栏列内;它们的 tooltip 因此落在侧栏列的层叠上下文里。悬浮 header 现在是\n 一条带霜的玻璃条,会盖住 tooltip 并把它染成一块灰黑\"阴影\"(用户看到的\"黑色阴影\")。\n 这里只在 tooltip 真的挂载时把 rail 提到 header 之上,让 tooltip 正常浮在下拉层,\n 不影响静止态层次。 */\nhtml[data-dsg='on'][data-windows-titlebar] div:has(> [data-slot='sidebar']):has([role='tooltip']) {\n z-index: 120;\n}\n\n/* ===== 22-drag-smooth.css ===== */\n/* ============================================================================\n dsh-skin-mistblue · 22 drag smooth (v1.12)\n ----------------------------------------------------------------------------\n Splitter drags drive pane width with a React state update per pointermove; the\n dockkit shell also keeps `transition: transform var(--ds-transition-duration-slow)`\n armed while open. That combination is what makes panes feel heavy and land\n early/late. Instead of fighting the host's pointer stream we keep the pointer\n behaviour untouched and simply:\n · start the expensive-material fallback on pointerdown (see client guard),\n · replace the shell's slow transform transition with a short *linear width\n chase* — the split follows the cursor through a 90ms linear interpolation,\n so a fast flick can never teleport the layout in one frame, while slow\n drags still feel 1:1,\n · drop scroll anchoring so reflow never scroll-compensates mid-drag.\n ========================================================================== */\n\nhtml[data-dsg='on'][data-dsg-resizing] [data-dockkit-host],\nhtml[data-dsg='on'][data-dsg-resizing] [data-dockkit-empty],\nhtml[data-dsg='on'][data-dsg-resizing] [data-dockkit-divider],\nhtml[data-dsg='on'][data-dsg-resizing] [data-dockkit-split],\nhtml[data-dsg='on'][data-dsg-resizing] [data-dockkit-cell],\nhtml[data-dsg='on'][data-dsg-resizing] [data-dockkit-pane],\nhtml[data-dsg='on'][data-dsg-resizing] [data-dockkit-surface] {\n transition: none !important;\n animation: none !important;\n}\n\n/* the moving edges chase the pointer with a bounded, linear follow */\nhtml[data-dsg='on'][data-dsg-resizing] [data-sidebar-right-panel],\nhtml[data-dsg='on'][data-dsg-resizing] div:has(> [data-slot='sidebar']),\nhtml[data-dsg='on'][data-dsg-resizing] [data-slot='sidebar'] {\n transition: width 90ms linear, transform 90ms linear !important;\n will-change: width;\n}\n\nhtml[data-dsg='on'][data-dsg-resizing] [data-conversation-region='chat'],\nhtml[data-dsg='on'][data-dsg-resizing] [data-chat-flow] {\n overflow-anchor: none;\n scroll-behavior: auto;\n}\n\nhtml[data-dsg='on'][data-dsg-resizing] [data-dockkit-divider] {\n cursor: col-resize;\n touch-action: none;\n}\n\n/* ===== 23-panel-reorder.css ===== */\n/* ============================================================================\n dsh-skin-mistblue · 23 panel reorder (v1.14)\n ----------------------------------------------------------------------------\n Left sidebar panel list (插件 / 上下文洞察 / MCP 连接器 …) gets two behaviours\n from `initSidebarEnhancer`:\n · HTML5 drag & drop to reorder — rows become draggable, drop writes per-row\n CSS `order` (no DOM moves) and persists the label order in localStorage;\n · clicking the already-open row returns to the Conversation via the layout\n service (`layout.selectPanel(null)`).\n Native DnD is used on purpose: pointer-event heuristics conflict with the\n host tooltip/click handlers, while dragstart/dragover/drop never fire a click.\n ========================================================================== */\n\nhtml[data-dsg='on'] nav[class*='_panelList'] > button[class*='_panelRow'] {\n cursor: grab;\n -webkit-user-drag: element;\n}\n\nhtml[data-dsg='on'] nav[class*='_panelList'] {\n user-select: none;\n -webkit-user-select: none;\n}\n\nhtml[data-dsg='on'] nav[class*='_panelList'] > button[class*='_panelRow']:active {\n cursor: grabbing;\n}\n\nhtml[data-dsg='on'] nav[class*='_panelList'] > button[class*='_panelRow'].dsg-panel-row-drag {\n opacity: 0.55;\n}\n\nhtml[data-dsg='on'] nav[class*='_panelList'] > button[class*='_panelRow'].dsg-panel-row-drop {\n background-color: var(--dsg-row-hover) !important;\n box-shadow:\n inset 0 0 0 1.5px rgba(77, 107, 254, 0.5),\n 0 6px 18px -10px rgba(23, 48, 108, 0.35);\n}\n\nhtml[data-dsg='on'] body[data-ds-dark-theme]\n nav[class*='_panelList'] > button[class*='_panelRow'].dsg-panel-row-drop {\n box-shadow:\n inset 0 0 0 1.5px rgba(123, 147, 255, 0.55),\n 0 8px 20px -12px rgba(0, 0, 0, 0.6);\n}\n\n/* ===== 30-composer.css ===== */\n/* ============================================================================\n dsh-skin-mistblue · 30 composer — 输入座位 / 输入卡 / 工具行 / 发送键 / dock 胶囊 / goal bar\n Owner: shell-dev.\n\n 硬约束(UI-CONTRACT §3 / GLASS-SPEC §5 #89):\n · [data-composer-seat] 不铺底、不挂霜(内部有外部插件塞进来的 position:fixed 座位)。\n · [data-composer-card] 本体 backdrop-filter:none;霜只挂 ::before(伪元素无后代,\n 永不成为 fixed 包含块)。\n · 卡片自身的 background / sheen / bevel 画在本体上 —— 它比 ::before 的负 z-index\n 后绘制,所以霜在“填充层之下”,高光是锐的。\n ========================================================================== */\n\n/* ---- 1. 座位:纯容器,不铺底不挂霜 -------------------------------------- */\nhtml[data-dsg='on'] [data-composer-seat],\nhtml[data-dsg='on'] [data-conversation-region='composer'] {\n background: none !important;\n -webkit-backdrop-filter: none !important;\n backdrop-filter: none !important;\n box-shadow: none;\n}\n/* composer 区域宽度:DeepSeek 参考图口径 732–760,不跟 chat 列一起收窄;\n dock / goal bar 读同一个变量,保持左右对齐(Lead 口径 min(760px, 100% - 48px))。 */\nhtml[data-dsg='on'] [data-conversation-region='chat'] {\n --dsh-composer-card-max-width: min(calc(100% - 48px), 760px);\n}\nhtml[data-dsg='on'] [data-goal-bar] [class*='_bar'] {\n max-width: var(--dsh-composer-card-max-width) !important;\n}\n\n/* ---- 2. 输入卡:L2 玻璃,radius 28 ------------------------------------- */\nhtml[data-dsg='on'] [data-composer-card] {\n border-radius: var(--dsg-radius-composer) !important;\n border: 0 !important;\n background: var(--dsg-fill-l2) !important;\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.55),\n inset 0 -1px 0 rgba(255, 255, 255, 0.1),\n inset 0 0 0 0.5px rgba(255, 255, 255, 0.22),\n 0 18px 44px -18px rgba(44, 74, 140, 0.28),\n 0 2px 8px rgba(44, 74, 140, 0.06);\n -webkit-backdrop-filter: none !important;\n backdrop-filter: none !important;\n transition: box-shadow 200ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-composer-card] {\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.14),\n inset 0 -1px 0 rgba(255, 255, 255, 0.05),\n inset 0 0 0 0.5px rgba(255, 255, 255, 0.1),\n 0 18px 44px -18px rgba(0, 0, 0, 0.55),\n 0 2px 8px rgba(0, 0, 0, 0.25);\n}\n/* 霜:唯一载体 */\nhtml[data-dsg='on'] [data-composer-card]::before {\n content: '';\n position: absolute;\n inset: 0;\n z-index: -1;\n border-radius: inherit;\n pointer-events: none;\n -webkit-backdrop-filter: var(--dsg-backdrop-l2);\n backdrop-filter: var(--dsg-backdrop-l2);\n}\n/* focus:不要过亮,只加一圈品牌蓝柔光 */\nhtml[data-dsg='on'] [data-composer-card]:focus-within {\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.6),\n inset 0 -1px 0 rgba(255, 255, 255, 0.1),\n inset 0 0 0 0.5px rgba(255, 255, 255, 0.24),\n 0 0 0 2px rgba(77, 107, 254, 0.28),\n 0 18px 48px -18px rgba(44, 74, 140, 0.3);\n}\n\n/* ---- 3. 输入文字 / placeholder ----------------------------------------- */\nhtml[data-dsg='on'] [data-composer-card] [class*='_input'] {\n font-size: 15px !important;\n line-height: 25px !important;\n min-height: 40px;\n padding: 6px 10px 0 14px !important;\n color: var(--dsw-alias-label-primary);\n caret-color: var(--dsg-blue);\n}\nhtml[data-dsg='on'] [data-composer-card] [class*='_placeholder'] {\n top: 6px !important;\n left: 14px !important;\n right: 10px !important;\n font-size: 15px !important;\n line-height: 25px;\n color: var(--dsw-alias-label-caption) !important;\n}\nhtml[data-dsg='on'] [data-composer-card] [class*='_row'] {\n gap: 10px;\n padding: 2px 8px 7px !important;\n}\n\n/* ---- 4. 工具行:+ / 权限 / 模型 胶囊化 ---------------------------------- */\n/* + 号:白釉圆钮 */\nhtml[data-dsg='on'] [data-composer-card] button[class*='_add'] {\n width: 30px;\n height: 30px;\n border-radius: 999px;\n border: 0.5px solid var(--dsg-hairline-soft);\n background: var(--dsg-capsule) !important;\n color: var(--dsw-alias-label-secondary);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.4), 0 1px 2px rgba(23, 42, 84, 0.05);\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease),\n transform 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-composer-card] button[class*='_add']:hover:not(:disabled) {\n background: var(--dsg-capsule-hover) !important;\n color: var(--dsw-alias-label-primary);\n transform: translateY(-1px);\n}\n/* 权限选择器 */\nhtml[data-dsg='on'] [data-slot='conversation.input.permission'] button {\n height: 28px;\n padding: 0 9px 0 8px;\n gap: 5px;\n border-radius: 999px;\n color: var(--dsw-alias-label-secondary);\n font-size: 12.5px;\n font-weight: 500;\n background: var(--dsg-capsule);\n border: 0.5px solid var(--dsg-hairline-soft);\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease),\n border-color 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='conversation.input.permission'] button:hover:not(:disabled) {\n background: var(--dsg-capsule-hover);\n border-color: rgba(77, 107, 254, 0.2);\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-slot='conversation.input.permission'] button [class*='_triggerIcon'] {\n color: var(--dsw-alias-label-tertiary);\n}\n/* 模型选择器:胶囊 + 1017 蓝标 + High 弱化 */\nhtml[data-dsg='on'] [data-slot='conversation.input.model'] button {\n height: 28px;\n padding: 0 10px 0 9px;\n gap: 5px;\n border-radius: 999px;\n background: var(--dsg-capsule);\n border: 0.5px solid var(--dsg-hairline-soft);\n color: var(--dsw-alias-label-secondary);\n font-size: 12.5px;\n font-weight: 500;\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease),\n border-color 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-slot='conversation.input.model'] button:hover:not(:disabled),\nhtml[data-dsg='on'] [data-slot='conversation.input.model'] button[aria-expanded='true'] {\n background: var(--dsg-capsule-hover);\n border-color: rgba(77, 107, 254, 0.2);\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-slot='conversation.input.model'] [data-tone='info'] {\n height: 16px;\n padding: 0 5px;\n border-radius: 5px;\n background: var(--dsg-blue-soft);\n color: var(--dsg-blue);\n font-size: 10px;\n font-weight: 600;\n line-height: 16px;\n}\nhtml[data-dsg='on'] [data-slot='conversation.input.model'] [class*='_triggerEffort'] {\n color: var(--dsw-alias-label-caption);\n font-weight: 400;\n}\nhtml[data-dsg='on'] [data-slot='conversation.input.model'] [class*='_chevron'] {\n color: var(--dsw-alias-label-caption);\n}\n\n/* ---- 5. 发送 / 停止:DeepSeek 蓝圆钮 ----------------------------------- */\nhtml[data-dsg='on'] [data-composer-card] button[class*='_primary'] {\n width: 34px;\n height: 34px;\n border-radius: 999px;\n background: var(--dsg-blue) !important;\n color: #fff;\n border: none;\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.26),\n 0 6px 18px -6px rgba(77, 107, 254, 0.55);\n transform: translateY(-1px);\n transition: background-color 140ms var(--dsg-ease), transform 140ms var(--dsg-ease),\n box-shadow 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-composer-card] button[class*='_primary']:hover:not(:disabled) {\n background: var(--dsg-blue-strong) !important;\n transform: translateY(-2px);\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.3),\n 0 10px 22px -6px rgba(77, 107, 254, 0.6);\n}\nhtml[data-dsg='on'] [data-composer-card] button[class*='_primary']:active:not(:disabled) {\n transform: translateY(0) scale(0.94);\n}\nhtml[data-dsg='on'] [data-composer-card] button[class*='_primary']:disabled {\n opacity: 1 !important;\n cursor: default;\n background: rgba(77, 107, 254, 0.3) !important;\n box-shadow: none;\n transform: none;\n color: rgba(255, 255, 255, 0.85);\n}\nhtml[data-dsg='on'] [data-composer-card] button[class*='_primary'] svg {\n width: 18px;\n height: 18px;\n}\n\n/* ---- 6. composer dock:统计 / 上下文占用 = 小胶囊 ----------------------- */\nhtml[data-dsg='on'] [data-composer-dock] {\n gap: 6px;\n padding-top: 4px;\n}\nhtml[data-dsg='on'] [data-composer-dock] [class*='_pill'],\nhtml[data-dsg='on'] [data-composer-dock] [class*='_trigger'] {\n height: 24px;\n padding: 0 9px;\n border-radius: 999px;\n background: var(--dsg-capsule);\n border: 0.5px solid var(--dsg-hairline-soft);\n color: var(--dsw-alias-label-tertiary);\n font-size: 11.5px;\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease),\n border-color 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-composer-dock] [class*='_pill']:hover,\nhtml[data-dsg='on'] [data-composer-dock] [class*='_trigger']:hover,\nhtml[data-dsg='on'] [data-composer-dock] [class*='_pill'][aria-expanded='true'],\nhtml[data-dsg='on'] [data-composer-dock] [class*='_trigger'][aria-expanded='true'] {\n background: var(--dsg-capsule-hover);\n border-color: var(--dsg-hairline-soft);\n color: var(--dsw-alias-label-secondary);\n}\nhtml[data-dsg='on'] [data-composer-dock] [class*='_pill'] svg,\nhtml[data-dsg='on'] [data-composer-dock] [class*='_trigger'] svg {\n width: 13px;\n height: 13px;\n}\n\n/* ---- 7. goal bar:L2 + 蓝色强调 ---------------------------------------- */\nhtml[data-dsg='on'] [data-goal-bar] [class*='_bar'] {\n border-radius: 999px !important;\n height: 34px;\n isolation: auto; /* 宿主 isolate 会建 backdrop root,霜失效 */\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.45), 0 6px 18px rgba(44, 74, 140, 0.08);\n}\nhtml[data-dsg='on'] [data-goal-bar] [class*='_bar']::before {\n background: var(--dsg-fill-l2);\n -webkit-backdrop-filter: var(--dsg-backdrop-l1);\n backdrop-filter: var(--dsg-backdrop-l1);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-goal-bar] [class*='_bar'] {\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08), 0 6px 18px rgba(0, 0, 0, 0.3);\n}\nhtml[data-dsg='on'] [data-goal-bar] [class*='_goalGlyph'] {\n color: var(--dsg-blue);\n}\nhtml[data-dsg='on'] [data-goal-bar] [class*='_label'] {\n color: var(--dsw-alias-label-primary);\n font-weight: 600;\n}\nhtml[data-dsg='on'] [data-goal-bar] [class*='_objective'] {\n color: var(--dsw-alias-label-secondary);\n}\nhtml[data-dsg='on'] [data-goal-bar] [class*='_iconBtn'] {\n border-radius: 999px;\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-goal-bar] [class*='_iconBtn']:hover {\n background: var(--dsg-row-hover);\n color: var(--dsw-alias-label-secondary);\n}\n/* ---- 8. 无霜降级:fill 已由 foundation 抬到近不透明,保持布局不变 -------- */\n@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {\n html[data-dsg='on'] [data-composer-card] {\n background: rgba(252, 253, 255, 0.94) !important;\n }\n html[data-dsg='on'] body[data-ds-dark-theme] [data-composer-card] {\n background: rgba(16, 26, 44, 0.96) !important;\n }\n}\n\n/* ===== 35-hero.css ===== */\n/* ============================================================================\n dsh-skin-mistblue · 35 hero — 空会话 Hero(品牌标记 / 大标题 / lede 位 / workspace 控件 / 输入卡)\n Owner: shell-dev.\n\n Hero 的真实结构(conversation 包 ConversationContent,phase=hero):\n [data-phase=\"hero\"] .Dc7zOa_composerHero\n ├ HeroShell.root (Hqq-bq_root) → stack → headline(fish + titleGroup + previewBadge)\n ├ heroWorkspaceRow(workspace / agentPreset 控件)\n ├ dock 槽(goal / todo,空则 display:none)\n └ inputBar([data-composer-card],hero 变体)\n 宿主在 hero 态把 [data-conversation-scroll] 设成 justify-content:center,\n 所以整组天然垂直居中;这里只做排版、字距、间距与控件胶囊化,不铺任何底板\n (SURFACE-MAP §4.2:Hero 不铺底,避免与输入卡重复加雾)。\n ========================================================================== */\n\n/* ---- 1. 组内节奏:标题 → 控件 → 输入卡 --------------------------------- */\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_composerHero'] {\n gap: 14px;\n padding-bottom: 34px;\n}\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_composerHero'] > :first-child {\n margin-bottom: 6px;\n}\n\n/* ---- 2. Hero 标题:48px / 600 / 0.1em,东方气质的粗黑体 ---------------- */\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_headline'] {\n font-size: clamp(38px, 4.4vw, 48px);\n line-height: 1.22;\n font-weight: 600;\n letter-spacing: 0.1em;\n color: var(--dsw-alias-label-primary);\n text-wrap: balance;\n justify-content: center;\n gap: 12px;\n}\n/* 字距是给正文标题的;品牌标记与「预览版」角标不吃字距 */\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_titleGroup'] {\n gap: 0.28em;\n justify-content: center;\n}\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_fishHitbox'],\nhtml[data-dsg='on'] [data-phase='hero'] [data-slot='conversation.hero.brand.mark'] {\n color: var(--dsg-blue);\n margin-right: 0.1em;\n}\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_fishHitbox'] svg,\nhtml[data-dsg='on'] [data-phase='hero'] [data-slot='conversation.hero.brand.mark'] svg {\n width: 42px;\n height: 42px;\n color: var(--dsg-blue);\n}\n/* 「预览版」角标:品牌蓝弱底小胶囊 */\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_previewBadge'] {\n padding: 1px 8px;\n margin-top: 8px;\n border-radius: 999px;\n border: 0.5px solid rgba(77, 107, 254, 0.2);\n background: var(--dsg-blue-soft);\n color: var(--dsg-blue);\n font-family: var(--dsw-font-family);\n font-size: 11px;\n font-weight: 500;\n line-height: 18px;\n letter-spacing: 0.02em;\n align-self: center;\n}\n\n/* ---- 3. workspace / preset 控件:居中胶囊 ------------------------------- */\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_heroWorkspaceRow'] {\n justify-content: center;\n padding: 0 8px;\n margin-top: 0;\n gap: 8px;\n}\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_heroWorkspaceRow'] button,\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_heroOptions'] button,\nhtml[data-dsg='on'] [data-phase='hero'] [data-slot='conversation.hero.workspace'] button,\nhtml[data-dsg='on'] [data-phase='hero'] [data-slot='conversation.hero.agentPreset'] button {\n height: 30px;\n padding: 0 11px;\n gap: 6px;\n border-radius: 999px;\n border: 0.5px solid var(--dsg-hairline-soft);\n background: var(--dsg-capsule);\n color: var(--dsw-alias-label-secondary);\n font-size: 12.5px;\n font-weight: 500;\n transition: background-color 140ms var(--dsg-ease), color 140ms var(--dsg-ease),\n transform 140ms var(--dsg-ease), border-color 140ms var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_heroWorkspaceRow'] button:hover,\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_heroOptions'] button:hover,\nhtml[data-dsg='on'] [data-phase='hero'] [data-slot='conversation.hero.workspace'] button:hover,\nhtml[data-dsg='on'] [data-phase='hero'] [data-slot='conversation.hero.agentPreset'] button:hover {\n background: var(--dsg-capsule-hover);\n border-color: rgba(77, 107, 254, 0.2);\n color: var(--dsw-alias-label-primary);\n transform: translateY(-1px);\n}\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_heroWorkspaceRow'] svg {\n color: var(--dsw-alias-label-tertiary);\n}\n\n/* ---- 4. Hero 里的输入卡:更高的呼吸感(宽度固定 760,不被 hero 变体的双层 padding 吃掉)--- */\n/* hero 结构是 composerHero(+32 clearance) → RlGAzG_root(padding 16×2) → card,\n 若继续用 `calc(100% - 48px)` 会算出 760−48=712;这里用绝对 760(max-width 不强制宽度,\n 窄窗仍按 100% 收缩)。 */\nhtml[data-dsg='on'] [data-phase='hero'] {\n --dsh-composer-card-max-width: 760px;\n}\nhtml[data-dsg='on'] [data-phase='hero'] [data-composer-card] {\n border-radius: 28px;\n}\nhtml[data-dsg='on'] [data-phase='hero'] [data-composer-card] [class*='_input'] {\n min-height: 54px;\n padding-top: 10px !important;\n font-size: 15.5px !important;\n line-height: 26px !important;\n}\nhtml[data-dsg='on'] [data-phase='hero'] [data-composer-card] [class*='_placeholder'] {\n top: 10px !important;\n font-size: 15.5px !important;\n line-height: 26px;\n}\n/* hero 态 dock 为空时不留缝 */\nhtml[data-dsg='on'] [data-phase='hero'] [data-composer-dock]:empty {\n display: none;\n}\n\n/* ---- 5. 入场:轻微上浮(240ms,reduced-motion 由 foundation 收掉) ------ */\n@keyframes dsg-hero-rise {\n from {\n opacity: 0;\n transform: translateY(8px);\n }\n to {\n opacity: 1;\n transform: none;\n }\n}\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_composerHero'] > * {\n animation: dsg-hero-rise 260ms var(--dsg-ease) both;\n}\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_composerHero'] > :nth-child(2) {\n animation-delay: 60ms;\n}\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_composerHero'] > :nth-child(3) {\n animation-delay: 110ms;\n}\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_composerHero'] > :nth-child(4) {\n animation-delay: 150ms;\n}\nhtml[data-dsg='on'] [data-phase='hero'] [class*='_headline'] {\n animation: dsg-hero-rise 300ms var(--dsg-ease) both;\n}\n\n/* ---- 6. 深色:品牌蓝标记提亮 ------------------------------------------- */\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-phase='hero'] [class*='_fishHitbox'] svg,\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-phase='hero'] [data-slot='conversation.hero.brand.mark'] svg {\n color: #9fb4ff;\n}\n\n/* ===== 40-content.css ===== */\n/* ============================================================================\n dsh-skin-mistblue · 40 content surfaces (conversation, cards, code, tools)\n ----------------------------------------------------------------------------\n Tier map (docs/DESIGN-SPEC §7.4 + UI-CONTRACT §3):\n L1 content canvas / long tool output plates → fill-l1, no canvas blur\n L2 user bubbles, think trigger, tool rows, deliverable/plan cards\n L3 (owned by 50-overlays.css) dialogs, menus, question/plan/approval\n Hard rules honoured here:\n · every [class*=\"_bubble\"] rule carries :not([role=\"tooltip\"])\n · no backdrop-filter on scroll containers ([data-conversation-scroll])\n · code / logs / terminal / inline code keep a near-opaque plate\n · sticky carriers (code banner, reasoning header) are re-painted, because\n foundation made --dsw-alias-bg-base transparent\n ========================================================================== */\n\n/* ---- local high-opacity plates (readability floor for code/logs) --------- */\nhtml[data-dsg='on'] body {\n --dsg-code-solid: rgba(255, 255, 255, 0.86);\n --dsg-code-banner: rgba(255, 255, 255, 0.95);\n --dsg-code-inline: rgba(255, 255, 255, 0.88);\n --dsg-tool-plate: rgba(255, 255, 255, 0.8);\n --dsg-tool-plate-strong: rgba(255, 255, 255, 0.9);\n --dsg-row-capsule: color-mix(in srgb, var(--dsg-blue) 4%, var(--dsg-fill-l2));\n --dsg-row-capsule-hover: color-mix(in srgb, var(--dsg-blue) 8%, var(--dsg-fill-l2));\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] {\n --dsg-code-solid: rgba(18, 27, 45, 0.9);\n --dsg-code-banner: rgba(22, 32, 52, 0.96);\n --dsg-code-inline: rgba(24, 35, 56, 0.92);\n --dsg-tool-plate: rgba(17, 26, 43, 0.86);\n --dsg-tool-plate-strong: rgba(20, 30, 49, 0.94);\n --dsg-row-capsule: color-mix(in srgb, var(--dsg-blue) 12%, var(--dsg-fill-l2));\n --dsg-row-capsule-hover: color-mix(in srgb, var(--dsg-blue) 18%, var(--dsg-fill-l2));\n}\n\n/* ============================================================================\n 1. conversation flow rhythm\n ========================================================================== */\nhtml[data-dsg='on'] [data-chat-flow] {\n --dsh-chat-flow-gap: 10px;\n}\n/* slight breathing room after a user turn / before tool groups */\nhtml[data-dsg='on'] [data-chat-flow] > [data-chat-flow-kind='user'] {\n margin-bottom: 4px;\n}\nhtml[data-dsg='on'] [data-chat-flow] > [data-chat-flow-kind='turn-process'] {\n margin-top: 6px;\n}\n\n/* ============================================================================\n 2. user bubbles — L2 glass (soft blue-white), readable ink\n ========================================================================== */\nhtml[data-dsg='on'] [class*='_bubble']:not([role='tooltip']) {\n position: relative;\n background-color: color-mix(in srgb, var(--dsg-blue) 9%, var(--dsg-fill-l2));\n background-image: var(--dsg-sheen-l2);\n -webkit-backdrop-filter: var(--dsg-backdrop-l2);\n backdrop-filter: var(--dsg-backdrop-l2);\n border-radius: var(--dsg-radius-card);\n box-shadow:\n var(--dsg-bevel-l2),\n 0 0 0 0.5px rgba(77, 107, 254, 0.14);\n color: var(--dsw-alias-label-primary);\n line-height: 1.62;\n transition:\n box-shadow var(--dsg-motion-dur) var(--dsg-ease),\n background-color var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [class*='_bubble']:not([role='tooltip']):hover {\n box-shadow:\n var(--dsg-bevel-l2),\n 0 0 0 0.5px rgba(77, 107, 254, 0.16);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] [class*='_bubble']:not([role='tooltip']) {\n background-color: color-mix(in srgb, var(--dsg-blue) 12%, var(--dsg-fill-l2));\n box-shadow:\n var(--dsg-bevel-l2),\n 0 0 0 0.5px rgba(120, 150, 255, 0.16);\n}\n/* the assistant text column has no plate — it sits on the L1 canvas */\nhtml[data-dsg='on'] [data-chat-flow] [class*='_userStack'] {\n gap: 8px;\n}\n\n/* ============================================================================\n 3. disclosure capsules — think trigger rows + tool call rows (L2)\n ========================================================================== */\nhtml[data-dsg='on'] [data-chat-flow] [data-disclosure-header] {\n box-sizing: border-box;\n border-radius: 12px;\n background-color: var(--dsg-fill-l1);\n background-image: var(--dsg-sheen-l1);\n box-shadow: inset 0 0 0 0.5px rgba(255, 255, 255, 0.32);\n padding: 1px 8px;\n transition:\n background-color var(--dsg-motion-dur) var(--dsg-ease),\n box-shadow var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-chat-flow] :is([data-variant='think'], [data-tool]) [data-disclosure-header] {\n background-color: var(--dsg-row-capsule);\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.45),\n inset 0 0 0 0.5px rgba(56, 88, 158, 0.12);\n}\nhtml[data-dsg='on'] [data-chat-flow] [data-disclosure-header]:hover,\nhtml[data-dsg='on'] [data-chat-flow] [data-disclosure-header]:has(> [data-disclosure-row][aria-expanded='true']) {\n background-color: var(--dsg-row-capsule-hover);\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.55),\n inset 0 0 0 0.5px rgba(56, 88, 158, 0.16),\n 0 6px 18px -12px rgba(44, 74, 140, 0.45);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-chat-flow] :is([data-variant='think'], [data-tool]) [data-disclosure-header] {\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.12),\n inset 0 0 0 0.5px rgba(150, 180, 255, 0.14);\n}\n\n/* turn trigger strip (recorded trigger above a turn) — L2 glass card */\nhtml[data-dsg='on'] [data-turn-trigger] {\n background-color: color-mix(in srgb, var(--dsg-blue) 4%, var(--dsg-fill-l2));\n background-image: var(--dsg-sheen-l2);\n -webkit-backdrop-filter: var(--dsg-backdrop-l2);\n backdrop-filter: var(--dsg-backdrop-l2);\n border: 0;\n border-radius: var(--dsg-radius-card);\n box-shadow: var(--dsg-bevel-l2);\n transition: box-shadow var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-turn-trigger]:hover {\n background-color: color-mix(in srgb, var(--dsg-blue) 7%, var(--dsg-fill-l2));\n background-image: var(--dsg-sheen-l2);\n box-shadow:\n var(--dsg-bevel-l2),\n 0 0 0 0.5px rgba(77, 107, 254, 0.14);\n}\nhtml[data-dsg='on'] [data-turn-trigger] [class*='_header'] {\n border-radius: inherit;\n}\nhtml[data-dsg='on'] [data-turn-trigger] [class*='_header']:hover {\n background-color: transparent;\n}\n\n/* ============================================================================\n 4. reasoning (think) — expanded body stays transparent, sticky header painted\n ========================================================================== */\nhtml[data-dsg='on'] [data-variant='think'] [class*='_thinkBody'] {\n color: var(--dsw-alias-label-secondary);\n line-height: 1.66;\n}\nhtml[data-dsg='on'] [data-variant='think'] [data-open] [data-disclosure-header] {\n background-color: var(--dsg-code-banner);\n background-image: none;\n border-radius: 10px;\n box-shadow: 0 1px 0 var(--dsg-border-hair);\n}\n/* compaction / context fold sticky header (was --dsw-alias-bg-base = transparent) */\nhtml[data-dsg='on'] [class*='_compactionRow']:has([class*='_compactionBody']) [class*='_compactionButton'] {\n background-color: var(--dsg-code-banner);\n box-shadow: 0 1px 0 var(--dsg-border-hair);\n}\n\n/* ============================================================================\n 5. tool results — flat L1 plates, near opaque (code / logs / diffs)\n ========================================================================== */\nhtml[data-dsg='on'] [data-slot='tool.call.toolview'] [data-inspect],\nhtml[data-dsg='on'] [data-chat-flow-kind='context'] [data-context-injection-body],\nhtml[data-dsg='on'] [data-terminal],\nhtml[data-dsg='on'] [data-tool='read'] [data-read],\nhtml[data-dsg='on'] [data-tool='grep'] [data-search='matches'],\nhtml[data-dsg='on'] [data-tool='glob'] [data-search='paths'],\nhtml[data-dsg='on'] [data-tool='write'] [data-diff],\nhtml[data-dsg='on'] [data-variant='others'] [class*='_ioCard'] {\n background-color: var(--dsg-tool-plate);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 12px;\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.35),\n 0 10px 28px -22px rgba(44, 74, 140, 0.4);\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-slot='tool.call.toolview'] [data-inspect],\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-terminal],\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-tool='read'] [data-read],\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-tool='grep'] [data-search='matches'],\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-tool='glob'] [data-search='paths'],\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-tool='write'] [data-diff] {\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.08),\n 0 10px 28px -22px rgba(0, 0, 0, 0.6);\n}\n/* long scroll bodies keep their own plate; never add blur here */\nhtml[data-dsg='on'] [data-slot='tool.call.toolview'] [class*='_bodyScroll'],\nhtml[data-dsg='on'] [data-slot='tool.call.toolview'] [class*='_list'] {\n scrollbar-gutter: stable;\n}\n/* diff semantic colours stay untouched (host tokens) but need a solid floor */\nhtml[data-dsg='on'] [data-tool='write'] [data-diff] [data-diff-line],\nhtml[data-dsg='on'] [data-review-view] [class*='_line'],\nhtml[data-dsg='on'] [data-review-view] [class*='_splitLine'] {\n box-shadow: none;\n}\n\n/* ============================================================================\n 6. code blocks — near-opaque plate + painted sticky banner\n ========================================================================== */\nhtml[data-dsg='on'] .md-code-block {\n --dsl-code-block-background: transparent;\n --dsl-code-block-banner-background-color: var(--dsg-code-banner);\n background-color: var(--dsg-code-solid);\n background-image: var(--dsg-sheen-l1);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 14px;\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.45),\n 0 14px 34px -26px rgba(44, 74, 140, 0.5);\n /* no overflow:hidden here — it would kill the banner's position:sticky */\n}\nhtml[data-dsg='on'] .md-code-block :where(pre) {\n padding: 13px 16px;\n border-radius: 0 0 14px 14px;\n}\nhtml[data-dsg='on'] .md-code-block [class*='_bannerWrap'] {\n background-color: var(--dsg-code-banner);\n border-radius: 14px 14px 0 0;\n box-shadow: 0 1px 0 var(--dsg-border-hair);\n}\nhtml[data-dsg='on'] .md-code-block [class*='_banner'] {\n background: transparent;\n padding: 7px 12px;\n}\nhtml[data-dsg='on'] .md-code-block [class*='_infostring'] {\n color: var(--dsw-alias-label-secondary);\n letter-spacing: 0.02em;\n}\nhtml[data-dsg='on'] .md-code-block [class*='_copyButton'] {\n border-radius: 8px;\n padding: 2px 8px;\n font-size: 11px;\n line-height: 16px;\n color: var(--dsw-alias-label-secondary);\n background-color: color-mix(in srgb, var(--dsg-blue) 6%, transparent);\n transition:\n background-color var(--dsg-motion-dur) var(--dsg-ease),\n color var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] .md-code-block [class*='_copyButton']:hover {\n background-color: var(--dsg-blue-soft);\n color: var(--dsg-blue-strong);\n}\nhtml[data-dsg='on'] .md-code-block [class*='_lineNumber'],\nhtml[data-dsg='on'] .md-code-block [class*='_numbered'] :where(pre) code > .line::before {\n color: var(--dsw-alias-label-caption);\n}\n\n/* inline code: opaque chip, never a backdrop-filter (inline boxes smear rows) */\nhtml[data-dsg='on'] [data-chat-flow] :not(pre) > code,\nhtml[data-dsg='on'] [class*='_markdown'] :not(pre) > code {\n background-color: color-mix(in srgb, var(--dsg-blue) 6%, var(--dsg-code-inline));\n border-color: rgba(77, 107, 254, 0.16);\n border-radius: 6px;\n color: var(--dsw-alias-label-primary);\n}\n\n/* ============================================================================\n 7. deliverables / plan cards / trajectory panes — L2 cards\n ========================================================================== */\nhtml[data-dsg='on'] [data-presented-file],\nhtml[data-dsg='on'] [data-changed-files],\nhtml[data-dsg='on'] [data-plan-card],\nhtml[data-dsg='on'] [data-plan-artifacts] > * {\n background-color: var(--dsg-fill-l2);\n background-image: var(--dsg-sheen-l2);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 14px;\n box-shadow: var(--dsg-bevel-l1);\n transition:\n box-shadow var(--dsg-motion-dur) var(--dsg-ease),\n background-color var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-presented-file]:hover,\nhtml[data-dsg='on'] [data-changed-files]:hover,\nhtml[data-dsg='on'] [data-plan-card]:hover {\n background-color: color-mix(in srgb, var(--dsg-blue) 4%, var(--dsg-fill-l2));\n box-shadow: var(--dsg-bevel-l2);\n}\n/* the plan card is a 60px row — give it a calmer inner surface */\nhtml[data-dsg='on'] [data-plan-card] {\n height: 60px;\n padding: 8px 12px;\n}\nhtml[data-dsg='on'] [data-plan-card] [class*='_cardIcon'] {\n background: color-mix(in srgb, var(--dsg-blue) 7%, rgba(255, 255, 255, 0.6));\n border: 0.5px solid rgba(77, 107, 254, 0.14);\n border-radius: 10px;\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-plan-card] [class*='_cardIcon'] {\n background: color-mix(in srgb, var(--dsg-blue) 16%, rgba(255, 255, 255, 0.04));\n}\n\n/* trajectory: big scrollable table pane → flat L2 wash, no backdrop-filter */\nhtml[data-dsg='on'] [class*='_tablePane'],\nhtml[data-dsg='on'] [class*='_overviewPreview'],\nhtml[data-dsg='on'] [class*='_programPanel'] {\n background-color: var(--dsg-fill-l2);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 14px;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.35);\n}\nhtml[data-dsg='on'] [class*='_tablePane']:has([data-trajectory-scroll]),\nhtml[data-dsg='on'] [class*='_overviewPreview'] {\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n}\n\n/* ============================================================================\n 8. message meta / actions — quiet hover, blue focus only\n ========================================================================== */\nhtml[data-dsg='on'] [data-chat-flow] [class*='_actions'] [class*='_action'] {\n border-radius: 8px;\n color: var(--dsw-alias-label-tertiary);\n transition: background-color var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-chat-flow] [class*='_actions'] [class*='_action']:hover {\n background-color: rgba(77, 107, 254, 0.08);\n color: var(--dsw-alias-label-secondary);\n}\n\n/* ============================================================================\n 9. fallback legs — no backdrop-filter support / software rasteriser\n ========================================================================== */\n@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {\n html[data-dsg='on'] [class*='_bubble']:not([role='tooltip']),\n html[data-dsg='on'] [data-turn-trigger] {\n background-color: var(--dsg-code-solid);\n background-image: none;\n }\n}\nhtml[data-dsg='on'] body[data-dsg-fallback] [class*='_bubble']:not([role='tooltip']),\nhtml[data-dsg='on'] body[data-dsg-fallback] [data-turn-trigger] {\n background-color: var(--dsg-code-solid);\n background-image: none;\n -webkit-backdrop-filter: none;\n backdrop-filter: none;\n}\n\n/* ===== 50-overlays.css ===== */\n/* ============================================================================\r\n dsh-skin-mistblue · 50 overlays (dialog / menu / toast / tooltip / prompts)\r\n ----------------------------------------------------------------------------\r\n Tier map:\r\n L3 dialogs, question / plan-review / approval cards, lightbox chrome\r\n token channel menus (--dsw-specific-menu / --dsw-menu-backdrop-filter)\r\n glass tip tooltips + chart hover tips (v1.9 — L2 frost, see §5)\r\n exempt hovercard (host preview card), native <select>, [data-windows-menu]\r\n Hard rules honoured here:\r\n · [class*=\"_bubble\"] rules always carry :not([role=\"tooltip\"])\r\n · menus are NOT re-painted (host already draws a material layer); only\r\n tokens + radius/rows are tuned — no double board\r\n · mask keeps using --dsw-mask-blur (tuned lighter here so the dialog's\r\n own frost is not stacked on top of a second large blur)\r\n · tooltips are glass with a legible high fill; hovercards / native menus\r\n keep the host material (frosted image previews would lose legibility)\r\n ========================================================================== */\r\n\r\n/* mask channel: the dialog owns the strong frost (L3); keep the backdrop\r\n scrim cheap so we never pay for two large blurs at once (GLASS-SPEC §5.9). */\r\n@supports ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {\r\n html[data-dsg='on'] body {\r\n --dsw-mask-blur: blur(calc(10px * var(--dsg-blur, 1))) saturate(1.18);\r\n }\r\n}\r\nhtml[data-dsg='on'] body[data-dsg-fallback] {\r\n --dsw-mask-blur: none;\r\n}\r\n\r\n/* ============================================================================\r\n 1. dialogs — L3 glass face\r\n ========================================================================== */\r\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true']:is(\r\n [class*='_dialog'],\r\n [class*='_panel'],\r\n [class*='_confirmation'],\r\n [class*='_installDialog'],\r\n [class*='_guideDialog']\r\n ) {\r\n background-color: var(--dsg-fill-l3);\r\n background-image: var(--dsg-sheen-l3);\r\n -webkit-backdrop-filter: var(--dsg-backdrop-l3);\r\n backdrop-filter: var(--dsg-backdrop-l3);\r\n border: 0;\r\n border-radius: var(--dsg-radius-modal);\r\n box-shadow: var(--dsg-bevel-l3);\r\n overflow: hidden;\r\n}\r\nhtml[data-dsg='on'] body[data-ds-dark-theme] [role='dialog'][aria-modal='true']:is(\r\n [class*='_dialog'],\r\n [class*='_panel'],\r\n [class*='_confirmation']\r\n ) {\r\n box-shadow:\r\n var(--dsg-bevel-l3),\r\n inset 0 0 0 0.5px rgba(150, 180, 255, 0.12);\r\n}\r\n\r\n/* dialog chrome: title / close / footer */\r\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true'] [class*='_title'] {\r\n font-weight: 600;\r\n letter-spacing: 0.005em;\r\n color: var(--dsw-alias-label-primary);\r\n}\r\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true'] [class*='_description'] {\r\n color: var(--dsw-alias-label-secondary);\r\n line-height: 1.62;\r\n}\r\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true'] [class*='_close'] {\r\n border-radius: 10px;\r\n color: var(--dsw-alias-label-secondary);\r\n background-color: transparent;\r\n transition:\r\n background-color var(--dsg-motion-dur) var(--dsg-ease),\r\n color var(--dsg-motion-dur) var(--dsg-ease);\r\n}\r\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true'] [class*='_close']:hover {\r\n background-color: var(--dsg-blue-soft);\r\n color: var(--dsg-blue-strong);\r\n}\r\n/* dialog fields stay opaque (readability on top of the frosted face) */\r\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true']\r\n :is(input, textarea, select):not([type='range']):not([type='checkbox']):not([type='radio']) {\r\n background-color: var(--dsg-code-solid);\r\n border-color: var(--dsg-border-hair);\r\n color: var(--dsw-alias-label-primary);\r\n}\r\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true'] [class*='_footer'] [class*='_button']:not([disabled]) {\r\n transition:\r\n background-color var(--dsg-motion-dur) var(--dsg-ease),\r\n box-shadow var(--dsg-motion-dur) var(--dsg-ease);\r\n}\r\n\r\n/* ============================================================================\r\n 2. question / plan-review / approval cards — L3 reading cards\r\n (they live in the composer seat, not in a portal: no fixed descendants)\r\n ========================================================================== */\r\nhtml[data-dsg='on'] [data-question-key] [class*='_card'],\r\nhtml[data-dsg='on'] [data-plan-review-key] [class*='_card'],\r\nhtml[data-dsg='on'] [data-approval-key] [class*='_card'] {\r\n --dsw-elevation-stroke-color: transparent;\r\n background-color: var(--dsg-fill-l3);\r\n background-image: var(--dsg-sheen-l3);\r\n -webkit-backdrop-filter: var(--dsg-backdrop-l3);\r\n backdrop-filter: var(--dsg-backdrop-l3);\r\n border: 0;\r\n border-radius: var(--dsg-radius-modal);\r\n box-shadow: var(--dsg-bevel-l3);\r\n color: var(--dsw-alias-label-primary);\r\n}\r\nhtml[data-dsg='on'] [data-question-key] [class*='_strip'],\r\nhtml[data-dsg='on'] [data-plan-review-key] [class*='_strip'],\r\nhtml[data-dsg='on'] [data-approval-key] [class*='_strip'] {\r\n border-bottom: 0.5px solid rgba(150, 110, 20, 0.14);\r\n font-weight: 500;\r\n}\r\n/* the action row must stay crisp above the frost */\r\nhtml[data-dsg='on'] [data-question-key] [class*='_footer']:not([class*='_footerActions']),\r\nhtml[data-dsg='on'] [data-plan-review-key] [class*='_footer']:not([class*='_footerActions']),\r\nhtml[data-dsg='on'] [data-approval-key] [class*='_actionRow'],\r\nhtml[data-dsg='on'] [data-approval-key] [class*='_footer']:not([class*='_footerActions']) {\r\n background-color: color-mix(in srgb, var(--dsg-tint) 24%, transparent);\r\n border-top: 0.5px solid var(--dsg-border-hair);\r\n}\r\n/* option rows inside a question card: opaque enough to read, hover in blue */\r\nhtml[data-dsg='on'] [data-question-key] :is(button, label)[class*='_option'],\r\nhtml[data-dsg='on'] [data-plan-review-key] :is(button, label)[class*='_option'] {\r\n background-color: color-mix(in srgb, var(--dsg-tint) 34%, transparent);\r\n border: 0.5px solid var(--dsg-border-hair);\r\n border-radius: 12px;\r\n transition:\r\n background-color var(--dsg-motion-dur) var(--dsg-ease),\r\n border-color var(--dsg-motion-dur) var(--dsg-ease);\r\n}\r\nhtml[data-dsg='on'] [data-question-key] :is(button, label)[class*='_option']:hover:not(:disabled),\r\nhtml[data-dsg='on'] [data-plan-review-key] :is(button, label)[class*='_option']:hover:not(:disabled) {\r\n background-color: color-mix(in srgb, var(--dsg-blue) 6%, var(--dsg-fill-l2));\r\n border-color: rgba(77, 107, 254, 0.24);\r\n}\r\nhtml[data-dsg='on'] [data-question-key] :is(button, label)[class*='_optionSelected'],\r\nhtml[data-dsg='on'] [data-plan-review-key] :is(button, label)[class*='_optionSelected'] {\r\n background-color: color-mix(in srgb, var(--dsg-blue) 9%, var(--dsg-fill-l2));\r\n border-color: rgba(77, 107, 254, 0.34);\r\n}\r\n\r\n/* ============================================================================\r\n 3. menus — token channel only (host draws the material layer)\r\n ========================================================================== */\r\nhtml[data-dsg='on'] [data-menu-material] {\r\n border-radius: 12px;\r\n}\r\nhtml[data-dsg='on'] [data-menu-material] > [class*='_material'] {\r\n border-radius: inherit;\r\n background: var(--dsw-menu-surface-fill);\r\n -webkit-backdrop-filter: var(--dsw-menu-backdrop-filter);\r\n backdrop-filter: var(--dsw-menu-backdrop-filter);\r\n box-shadow: inset 0 0 0 0.5px rgba(255, 255, 255, 0.28);\r\n}\r\nhtml[data-dsg='on'] body[data-ds-dark-theme] [data-menu-material] > [class*='_material'] {\r\n box-shadow: inset 0 0 0 0.5px rgba(150, 180, 255, 0.12);\r\n}\r\nhtml[data-dsg='on'] [data-menu-backing] {\r\n background-color: color-mix(in srgb, var(--dsg-tint) 86%, transparent);\r\n}\r\n/* rows / group headers / shortcuts (host radii kept, ink tuned) */\r\nhtml[data-dsg='on'] [data-menu-material] [role='menuitem'],\r\nhtml[data-dsg='on'] [data-menu-material] [role='menuitemcheckbox'],\r\nhtml[data-dsg='on'] [data-menu-material] [role='menuitemradio'],\r\nhtml[data-dsg='on'] [data-menu-material] button[class*='_item'] {\r\n border-radius: 9px;\r\n color: var(--dsw-alias-label-primary);\r\n}\r\nhtml[data-dsg='on'] [data-menu-material] [role='menuitem']:hover,\r\nhtml[data-dsg='on'] [data-menu-material] [role='menuitemcheckbox']:hover,\r\nhtml[data-dsg='on'] [data-menu-material] [role='menuitemradio']:hover,\r\nhtml[data-dsg='on'] [data-menu-material] button[class*='_item']:hover:not(:disabled) {\r\n background-color: var(--dsg-blue-soft);\r\n}\r\nhtml[data-dsg='on'] [data-menu-material] [class*='_label'] {\r\n color: var(--dsw-alias-label-tertiary);\r\n letter-spacing: 0.02em;\r\n}\r\nhtml[data-dsg='on'] [data-menu-material] [class*='_separator'] {\r\n background-color: var(--dsg-border-hair);\r\n}\r\nhtml[data-dsg='on'] [data-menu-material] [class*='_shortcut'] {\r\n color: var(--dsw-alias-label-caption);\r\n}\r\n\r\n/* ============================================================================\r\n 4. hovercard / popover previews — host already paints an opaque dark card\r\n (--dsw-hovercard-bg: #2C2C2E, white ink). We only soften its edge; never\r\n add glass here, a frosted hovercard drops contrast to ~1.1:1.\r\n ========================================================================== */\r\nhtml[data-dsg='on'] [class*='_preview']:has(> [class*='_previewPrompt']) {\r\n border-radius: 14px;\r\n box-shadow: var(--dsg-bevel-l3);\r\n}\r\n\r\n/* ============================================================================\r\n 5. tooltips — near-opaque glass plate (v1.10)\r\n ----------------------------------------------------------------------------\r\n Every hover-only tooltip shares one recipe:\r\n · DSH primitive tooltips → [role='tooltip']\r\n · dsh-context chart hover tips → .lc-tip / .lc-chart-tip\r\n · other plugin chart tips → [class*='chart-tip'] / [class*='chartTip']\r\n User feedback (v1.10): make them almost opaque — readable text wins, the plate\r\n keeps only ~4% translucency plus the 16px frost, sheen and hairline so it still\r\n reads as glass instead of a flat white box. Chart tips sit on the densest\r\n surface, so they are 96% instead of 94%.\r\n ========================================================================== */\r\nhtml[data-dsg='on'] {\r\n --dsg-tip-fill: color-mix(in srgb, #ffffff 94%, transparent);\r\n --dsg-tip-fill-chart: color-mix(in srgb, #ffffff 96%, transparent);\r\n --dsg-tip-border: rgba(255, 255, 255, 0.72);\r\n --dsg-tip-ink: var(--dsw-alias-label-primary);\r\n --dsg-tip-shadow:\r\n 0 12px 30px -14px rgba(23, 48, 108, 0.38),\r\n 0 2px 6px rgba(23, 48, 108, 0.09);\r\n}\r\nhtml[data-dsg='on'] body[data-ds-dark-theme] {\r\n --dsg-tip-fill: color-mix(in srgb, #0d1524 94%, transparent);\r\n --dsg-tip-fill-chart: color-mix(in srgb, #0d1524 96%, transparent);\r\n --dsg-tip-border: rgba(255, 255, 255, 0.18);\r\n --dsg-tip-shadow:\r\n 0 14px 34px -16px rgba(0, 0, 0, 0.6),\r\n 0 2px 8px rgba(0, 0, 0, 0.32);\r\n}\r\n\r\nhtml[data-dsg='on']\r\n :is(\r\n [role='tooltip'],\r\n .lc-tip,\r\n .lc-chart-tip,\r\n [class*='_chart-tip'],\r\n [class*='_chartTip']\r\n ) {\r\n background-color: var(--dsg-tip-fill) !important;\r\n background-image: var(--dsg-sheen-l2) !important;\r\n -webkit-backdrop-filter: var(--dsg-blur-l2) saturate(1.45) brightness(1.02);\r\n backdrop-filter: var(--dsg-blur-l2) saturate(1.45) brightness(1.02);\r\n border: 0.5px solid var(--dsg-tip-border) !important;\r\n border-radius: 10px;\r\n color: var(--dsg-tip-ink) !important;\r\n box-shadow: var(--dsg-tip-shadow);\r\n text-shadow: none;\r\n}\r\n\r\n/* DSH primitive tooltip: tiny plate + shortcut pills */\r\nhtml[data-dsg='on'] [role='tooltip'] {\r\n padding: 5px 9px;\r\n font-size: 12px;\r\n line-height: 18px;\r\n font-weight: 400;\r\n border-radius: 9px;\r\n}\r\nhtml[data-dsg='on'] [role='tooltip'] :is(kbd, [class*='_key']) {\r\n background-color: color-mix(in srgb, var(--dsg-tip-ink) 9%, transparent);\r\n border: 0.5px solid color-mix(in srgb, var(--dsg-tip-ink) 13%, transparent);\r\n border-radius: 4px;\r\n color: var(--dsg-tip-ink);\r\n}\r\nhtml[data-dsg='on'] [role='tooltip'] [class*='_shortcut'],\r\nhtml[data-dsg='on'] [role='tooltip'] [class*='_label'] {\r\n color: var(--dsg-tip-ink);\r\n}\r\n\r\n/* chart hover tips: denser fill + softer edge, always above the plot marks */\r\nhtml[data-dsg='on'] :is(.lc-tip, .lc-chart-tip, [class*='_chart-tip'], [class*='_chartTip']) {\r\n background-color: var(--dsg-tip-fill-chart) !important;\r\n -webkit-backdrop-filter: calc(var(--dsg-blur-l2) * 1.1) saturate(1.5) brightness(1.02);\r\n backdrop-filter: calc(var(--dsg-blur-l2) * 1.1) saturate(1.5) brightness(1.02);\r\n border-radius: 10px;\r\n padding: 6px 10px;\r\n color: var(--dsg-tip-ink) !important;\r\n z-index: 40;\r\n}\r\nhtml[data-dsg='on'] :is(.lc-chart-tip, [class*='_chart-tip'], [class*='_chartTip']) span + span {\r\n color: var(--dsw-alias-label-secondary);\r\n}\r\n\r\n/* no backdrop-filter: fill is already near-opaque, just push the last percents */\r\n@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {\r\n html[data-dsg='on']\r\n :is([role='tooltip'], .lc-tip, .lc-chart-tip, [class*='_chart-tip'], [class*='_chartTip']) {\r\n background-color: color-mix(in srgb, #ffffff 98%, transparent) !important;\r\n }\r\n html[data-dsg='on'] body[data-ds-dark-theme]\r\n :is([role='tooltip'], .lc-tip, .lc-chart-tip, [class*='_chart-tip'], [class*='_chartTip']) {\r\n background-color: color-mix(in srgb, #0d1524 98%, transparent) !important;\r\n }\r\n}\r\n\r\n/* ============================================================================\r\n 6. toast — L3 shape, opaque deep plate (contrast first)\r\n ========================================================================== */\r\nhtml[data-dsg='on'] [class*='_toast'] {\r\n border-radius: 14px;\r\n padding: 12px 16px;\r\n font-size: 13px;\r\n line-height: 20px;\r\n box-shadow:\r\n 0 18px 48px rgba(23, 48, 108, 0.24),\r\n inset 0 1px 0 rgba(255, 255, 255, 0.12);\r\n -webkit-backdrop-filter: none;\r\n backdrop-filter: none;\r\n}\r\nhtml[data-dsg='on'] [class*='_toast'] [class*='_action'] {\r\n color: var(--dsw-static-deepseek-400);\r\n}\r\n\r\n/* ============================================================================\r\n 7. image lightbox — chrome only, the image itself stays opaque (L0)\r\n ========================================================================== */\r\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true']:has(> [class*='_stage']) {\r\n background: none;\r\n box-shadow: none;\r\n -webkit-backdrop-filter: none;\r\n backdrop-filter: none;\r\n}\r\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true'] [class*='_image'] {\r\n background-color: var(--dsg-code-solid);\r\n border-radius: 16px;\r\n box-shadow: var(--dsg-bevel-l3);\r\n}\r\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true'] [class*='_close'] {\r\n -webkit-backdrop-filter: var(--dsg-backdrop-l2);\r\n backdrop-filter: var(--dsg-backdrop-l2);\r\n background-color: color-mix(in srgb, var(--dsg-tint) 64%, transparent);\r\n box-shadow: var(--dsg-bevel-l2);\r\n}\r\n\r\n/* ============================================================================\r\n 8. native surfaces — stay opaque (Windows menu, <select> popup rows)\r\n ========================================================================== */\r\nhtml[data-dsg='on'] [data-windows-menu] {\r\n background-color: var(--dsw-alias-bg-layer-3);\r\n -webkit-backdrop-filter: none;\r\n backdrop-filter: none;\r\n}\r\nhtml[data-dsg='on'] select,\r\nhtml[data-dsg='on'] option {\r\n background-color: var(--dsg-tint);\r\n color: var(--dsw-alias-label-primary);\r\n}\n\n/* ===== 60-settings.css ===== */\n/* ============================================================================\n dsh-skin-mistblue · 60 settings / plugin pages / right sidebar / preview\n ----------------------------------------------------------------------------\n Tier map:\n L3 settings window, fullscreen right panel, document preview paper\n L2 settings cards, plugin list/detail cards, right-panel shell, tabs\n L1 pane bodies, page canvases\n Hard rules honoured here:\n · settings window fill L3 + own frost ≤12px (never a 24px full-window blur)\n · inner scrollers (settings options / right pane body) never get blur\n · right panel needs the dockkit z-index lift once backdrop-filter is on\n · text / code / pdf / office preview keep an opaque paper plate\n ========================================================================== */\n\n/* ============================================================================\n 1. settings window — L3 face, capped frost\n ========================================================================== */\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true'][data-shortcut-modal='settings'],\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true']:has([data-slot='settings.section']) {\n background-color: var(--dsg-fill-l3);\n background-image: var(--dsg-sheen-l3);\n /* foundation's dialog channel: 12px, never a 24px full-window blur */\n -webkit-backdrop-filter: var(--dsg-backdrop-dialog);\n backdrop-filter: var(--dsg-backdrop-dialog);\n border-radius: var(--dsg-radius-modal);\n box-shadow: var(--dsg-bevel-l3);\n /* blue primary CTAs + white ink on them, scoped to this window */\n --dsw-alias-brand-primary: var(--dsg-blue);\n --dsw-alias-button-primary-fill: var(--dsg-blue);\n --dsw-alias-button-primary-hover: var(--dsg-blue-strong);\n --dsw-alias-label-primary-foreground: #ffffff;\n}\nhtml[data-dsg='on'] body[data-dsg-fallback] [role='dialog'][aria-modal='true'][data-shortcut-modal='settings'],\nhtml[data-dsg='on'] body[data-dsg-fallback] [role='dialog'][aria-modal='true']:has([data-slot='settings.section']) {\n -webkit-backdrop-filter: none;\n backdrop-filter: none;\n}\n/* the scrim behind the settings window keeps the shared mask channel */\nhtml[data-dsg='on']\n [role='presentation']:has(> [role='dialog'][data-shortcut-modal='settings'])\n > [class*='_mask'] {\n background-color: rgba(16, 24, 40, 0.28);\n -webkit-backdrop-filter: var(--dsw-mask-blur);\n backdrop-filter: var(--dsw-mask-blur);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme]\n [role='presentation']:has(> [role='dialog'][data-shortcut-modal='settings'])\n > [class*='_mask'] {\n background-color: rgba(0, 0, 0, 0.46);\n}\n\n/* left navigation — pill rows with a blue active state */\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] nav {\n border-right: 0.5px solid var(--dsg-border-hair);\n gap: 14px;\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_navTitle'] {\n font-size: 16px;\n font-weight: 600;\n letter-spacing: 0.01em;\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_navCell'] {\n height: 38px;\n border-radius: 10px;\n color: var(--dsw-alias-label-secondary);\n transition:\n background-color var(--dsg-motion-dur) var(--dsg-ease),\n color var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_navCell']:hover {\n background-color: rgba(77, 107, 254, 0.07);\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_navCell'][aria-current='true'] {\n background-color: rgba(77, 107, 254, 0.11);\n color: var(--dsg-blue-strong);\n font-weight: 500;\n box-shadow: inset 0 0 0 0.5px rgba(77, 107, 254, 0.16);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_navLabel'] {\n color: inherit;\n}\n\n/* content chrome */\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_header'] {\n background-color: transparent;\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_content'] {\n min-width: 0;\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_options'] {\n padding: 0 28px 28px;\n /* a scroller: never frost it (per-frame backdrop recompute) */\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] :is(h2, h3) {\n letter-spacing: 0.005em;\n}\n\n/* ============================================================================\n 2. settings cards / rows / controls\n ========================================================================== */\n/* card items only: direct children of a card list/grid (avoids _cardMainRow,\n _cardContent, _cardTitle … being painted as cards) */\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_cards'] > *,\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_rowCard'] {\n background-color: color-mix(in srgb, var(--dsg-blue) 2.5%, var(--dsg-fill-l2));\n background-image: var(--dsg-sheen-l2);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 16px;\n box-shadow: var(--dsg-bevel-l1);\n transition:\n background-color var(--dsg-motion-dur) var(--dsg-ease),\n box-shadow var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_cards'] > *:hover,\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_rowCard']:hover {\n background-color: color-mix(in srgb, var(--dsg-blue) 4%, var(--dsg-fill-l2));\n box-shadow: var(--dsg-bevel-l2);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_cards'] > *[data-open='true'] {\n background-color: color-mix(in srgb, var(--dsg-blue) 4%, var(--dsg-fill-l2));\n border-color: rgba(77, 107, 254, 0.2);\n}\n/* single cards that are not inside a card list (account / balance rows) */\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_balanceCard'] {\n background-color: color-mix(in srgb, var(--dsg-blue) 2.5%, var(--dsg-fill-l2));\n background-image: var(--dsg-sheen-l2);\n border-radius: 16px;\n box-shadow: var(--dsg-bevel-l1);\n}\n/* card head / tags */\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_cards'] [class*='_cardTitle'] {\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_cards'] [class*='_cardDesc'],\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_intro'] {\n color: var(--dsw-alias-label-secondary);\n line-height: 1.6;\n}\n/* setting rows: comfortable height, blue hover (form fields + inventory rows) */\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_field'] {\n border-radius: 10px;\n transition: background-color var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_field']:hover,\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_cardMainRow']:hover {\n background-color: rgba(77, 107, 254, 0.045);\n}\n/* form fields stay opaque on the frosted face */\nhtml[data-dsg='on'] [data-shortcut-modal='settings']\n :is(input, textarea, select):not([type='range']):not([type='checkbox']):not([type='radio']) {\n background-color: var(--dsg-code-solid);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 10px;\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings']\n :is(input, textarea, select):not([type='range']):focus-visible {\n border-color: rgba(77, 107, 254, 0.42);\n box-shadow: 0 0 0 2px rgba(77, 107, 254, 0.16);\n outline: none;\n}\n/* switches / sliders / checkboxes: DeepSeek blue accent */\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] :is(input[type='checkbox'], input[type='radio'], input[type='range']) {\n accent-color: var(--dsg-blue);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_switch'][aria-checked='true'] {\n background: var(--dsg-blue);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_switch']:hover {\n filter: brightness(1.05);\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_segmented'],\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_control']:has(> [class*='_indicator']) {\n background-color: color-mix(in srgb, var(--dsg-tint) 30%, transparent);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 10px;\n}\nhtml[data-dsg='on'] [data-shortcut-modal='settings'] [class*='_control'] > [class*='_indicator'] {\n border-radius: 8px;\n background: var(--dsg-fill-l2);\n box-shadow: var(--dsg-bevel-l1);\n}\n\n/* ============================================================================\n 3. plugin manager page (main panel) — L1 page, L2 cards\n ========================================================================== */\nhtml[data-dsg='on'] [data-plugin-panel] {\n --dsw-alias-brand-primary: var(--dsg-blue);\n --dsw-alias-button-primary-fill: var(--dsg-blue);\n --dsw-alias-button-primary-hover: var(--dsg-blue-strong);\n --dsw-alias-label-primary-foreground: #ffffff;\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-plugin-panel] [class*='_pageTitle'] {\n font-weight: 600;\n letter-spacing: 0.005em;\n}\nhtml[data-dsg='on'] [data-plugin-panel] [class*='_pageIntro'] {\n color: var(--dsw-alias-label-secondary);\n}\nhtml[data-dsg='on'] [data-plugin-group] {\n border-radius: 18px;\n}\nhtml[data-dsg='on'] [data-plugin-group] [class*='_groupTitle'] {\n font-size: 12px;\n font-weight: 600;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--dsw-alias-label-tertiary);\n}\n/* list rows / cards */\nhtml[data-dsg='on'] [data-plugin-item],\nhtml[data-dsg='on'] [data-plugin-package] {\n background-color: var(--dsg-fill-l2);\n background-image: var(--dsg-sheen-l2);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 16px;\n box-shadow: var(--dsg-bevel-l1);\n transition:\n background-color var(--dsg-motion-dur) var(--dsg-ease),\n box-shadow var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-plugin-item]:hover,\nhtml[data-dsg='on'] [data-plugin-package]:hover {\n background-color: color-mix(in srgb, var(--dsg-blue) 4%, var(--dsg-fill-l2));\n box-shadow: var(--dsg-bevel-l2);\n}\nhtml[data-dsg='on'] [data-plugin-item] [class*='_cardIcon'],\nhtml[data-dsg='on'] [data-plugin-package] [class*='_cardIcon'] {\n background: color-mix(in srgb, var(--dsg-blue) 6%, rgba(255, 255, 255, 0.6));\n border-color: rgba(77, 107, 254, 0.14);\n}\nhtml[data-dsg='on'] [data-plugin-item] [class*='_cardTitle'],\nhtml[data-dsg='on'] [data-plugin-package] [class*='_cardTitle'] {\n font-weight: 600;\n}\nhtml[data-dsg='on'] [data-plugin-item] [class*='_cardDesc'],\nhtml[data-dsg='on'] [data-plugin-package] [class*='_cardDesc'] {\n color: var(--dsw-alias-label-secondary);\n}\n/* status tags / badges */\nhtml[data-dsg='on'] [data-plugin-status] [class*='_statusTag'],\nhtml[data-dsg='on'] [data-plugin-panel] [class*='_statusTag'],\nhtml[data-dsg='on'] [data-plugin-panel] [class*='_badge'] {\n border-radius: 999px;\n background-color: rgba(77, 107, 254, 0.1);\n color: var(--dsg-blue-strong);\n border: 0.5px solid rgba(77, 107, 254, 0.16);\n font-weight: 500;\n}\n\n/* detail page (same surface, just a view) */\nhtml[data-dsg='on'] [data-plugin-detail] {\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-plugin-detail] [class*='_crumb'] {\n border-radius: 10px;\n color: var(--dsw-alias-label-secondary);\n}\nhtml[data-dsg='on'] [data-plugin-detail] [class*='_crumb']:hover {\n background-color: rgba(77, 107, 254, 0.07);\n color: var(--dsg-blue-strong);\n}\nhtml[data-dsg='on'] [data-plugin-rows] {\n background-color: color-mix(in srgb, var(--dsg-tint) 18%, transparent);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 16px;\n padding: 4px;\n}\nhtml[data-dsg='on'] [data-plugin-row] {\n border-radius: 12px;\n min-height: 44px;\n transition: background-color var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-plugin-row]:hover {\n background-color: rgba(77, 107, 254, 0.05);\n}\nhtml[data-dsg='on'] [data-plugin-row][data-state='failed'] {\n box-shadow: inset 2px 0 0 rgba(239, 68, 68, 0.6);\n}\nhtml[data-dsg='on'] [data-plugin-detail] [class*='_detailSection'] {\n background-color: var(--dsg-fill-l2);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 16px;\n padding: 12px 14px;\n}\n/* plugin market */\nhtml[data-dsg='on'] [data-market-entry] {\n background-color: var(--dsg-fill-l2);\n background-image: var(--dsg-sheen-l2);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 16px;\n box-shadow: var(--dsg-bevel-l1);\n transition:\n background-color var(--dsg-motion-dur) var(--dsg-ease),\n box-shadow var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-market-entry]:hover {\n background-color: color-mix(in srgb, var(--dsg-blue) 4%, var(--dsg-fill-l2));\n box-shadow: var(--dsg-bevel-l2);\n}\nhtml[data-dsg='on'] [data-market-detail] {\n --dsw-alias-brand-primary: var(--dsg-blue);\n --dsw-alias-button-primary-fill: var(--dsg-blue);\n --dsw-alias-button-primary-hover: var(--dsg-blue-strong);\n --dsw-alias-label-primary-foreground: #ffffff;\n}\nhtml[data-dsg='on'] [data-market-detail] [class*='_detailSection'] {\n background-color: var(--dsg-fill-l2);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 16px;\n padding: 12px 14px;\n}\n/* install dialog keeps the generic dialog face but gets the blue CTA */\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true']:has([data-install-phase]),\nhtml[data-dsg='on'] [role='dialog'][aria-modal='true'] [class*='_installDialog'] {\n --dsw-alias-brand-primary: var(--dsg-blue);\n --dsw-alias-button-primary-fill: var(--dsg-blue);\n --dsw-alias-button-primary-hover: var(--dsg-blue-strong);\n --dsw-alias-label-primary-foreground: #ffffff;\n}\n\n/* ============================================================================\n 4. right sidebar (dockkit) — 单层玻璃壳 + L1 pane bodies + L3 fullscreen\n ============================================================================\n 玻璃只在 ::before(10-shell §4)画一次;本体保持透明。之前本体也铺了 fill-l2,\n 再叠上 dockkit 各层的半透明底,整块面板被洗成不透明白 —— 面板与对话区不再共享\n 背景。这里把本体与所有中间容器清零,只留一层霜。*/\nhtml[data-dsg='on'] [data-rightbar-col] [data-sidebar-right-panel]:not([aria-hidden='true']),\nhtml[data-dsg='on'] [data-sidebar-right-panel][data-sidebar-right-open] {\n background-color: transparent;\n background-image: none;\n -webkit-backdrop-filter: none;\n backdrop-filter: none;\n border-left: 0.5px solid var(--dsg-border-hair);\n border-radius: 18px 0 0 18px;\n box-shadow: -14px 0 44px rgba(44, 74, 140, 0.1);\n z-index: var(--dsh-dockkit-dock-layer, 10);\n}\n/* closed state must be explicitly clean (container stays mounted) */\nhtml[data-dsg='on'] [data-rightbar-col] [data-sidebar-right-panel][aria-hidden='true'] {\n background: none;\n background-image: none;\n border-left: none;\n box-shadow: none;\n -webkit-backdrop-filter: none;\n backdrop-filter: none;\n}\n/* fullscreen right panel = detail surface → L3(只换 ::before 的两个变量) */\nhtml[data-dsg='on'] [data-sidebar-right-panel][data-sidebar-right-mode='fullscreen'] {\n --dsg-panel-fill: var(--dsg-fill-l3);\n --dsg-panel-backdrop: var(--dsg-backdrop-l3);\n}\n/* dockkit 中间层全部透明:surface / host / pane / paneBody / panelBody / tabHost…\n 这些容器原本各带 --dsw-alias-bg-base 或 bg-layer 层,叠在玻璃壳上会发白。 */\nhtml[data-dsg='on'] [data-sidebar-right-panel] :is(\n [data-dockkit-surface],\n [data-dockkit-host],\n [data-dockkit-pane],\n [data-dockkit-content],\n [class*='_panelBody'],\n [class*='_tabLayout'],\n [class*='_tabCell'],\n [class*='_tabHost'],\n [class*='_paneBody']\n ) {\n background-color: transparent !important;\n background-image: none !important;\n}\nhtml[data-dsg='on'] [data-sidebar-right-panel] [data-dockkit-pane] {\n border-radius: 14px;\n overflow: hidden;\n}\n/* tab strip: capsule tabs */\nhtml[data-dsg='on'] [data-sidebar-right-panel] [data-dockkit-strip] {\n background-color: transparent;\n padding-bottom: 4px;\n}\nhtml[data-dsg='on'] [data-sidebar-right-panel] [data-dockkit-tab] {\n border-radius: 9px;\n color: var(--dsw-alias-label-secondary);\n transition:\n background-color var(--dsg-motion-dur) var(--dsg-ease),\n color var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] [data-sidebar-right-panel] [data-dockkit-tab]:hover {\n background-color: rgba(77, 107, 254, 0.07);\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] [data-sidebar-right-panel] [data-dockkit-tab][data-dockkit-tab-active],\nhtml[data-dsg='on'] [data-sidebar-right-panel] [data-dockkit-tab][aria-selected='true'] {\n background-color: rgba(77, 107, 254, 0.1);\n color: var(--dsg-blue-strong);\n font-weight: 500;\n}\nhtml[data-dsg='on'] [data-sidebar-right-panel] [data-dockkit-divider] {\n background: var(--dsg-border-hair);\n}\n/* right-panel guide entries */\nhtml[data-dsg='on'] [data-sidebar-right-panel] [data-sidebar-right-guide-entry],\nhtml[data-dsg='on'] [data-sidebar-right-panel] :is(button, a)[class*='_entry'] {\n background-color: var(--dsg-fill-l2);\n background-image: var(--dsg-sheen-l2);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 16px;\n box-shadow: var(--dsg-bevel-l1);\n}\nhtml[data-dsg='on'] [data-sidebar-right-panel] :is(button, a)[class*='_entry']:hover {\n background-color: color-mix(in srgb, var(--dsg-blue) 4%, var(--dsg-fill-l2));\n}\n\n/* ============================================================================\n 5. document preview — opaque paper plate (readability first)\n ----------------------------------------------------------------------------\n 文档预览 / 文本预览 / PDF 页是“读字”的 L3 面:背景必须完全不透明,否则对话区\n 的高对比文字会透上来,和预览内容叠成“双行字”(用户反馈)。宿主 token\n --dsw-alias-bg-document-preview 也已映射到同一张纸(00-foundation)。\n ========================================================================== */\nhtml[data-dsg='on'] [data-document-preview],\nhtml[data-dsg='on'] [data-textpreview-state],\nhtml[data-dsg='on'] [data-textpreview-wrap],\nhtml[data-dsg='on'] [data-code-preview],\nhtml[data-dsg='on'] [data-pdf-preview],\nhtml[data-dsg='on'] [data-html-preview],\nhtml[data-dsg='on'] [data-document-markdown],\nhtml[data-dsg='on'] [data-plan-preview] [class*='_document'] {\n background-color: var(--dsg-doc-paper) !important;\n background-image: none !important;\n -webkit-backdrop-filter: none !important;\n backdrop-filter: none !important;\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 14px;\n box-shadow: var(--dsg-bevel-l1);\n color: var(--dsw-alias-label-primary);\n}\n/* 预览所在的整个面板 / dockkit 容器也一起做实:预览通常铺满 tab,\n 只把纸面做实、父容器仍透,文字照样会从纸外的边角透上来。 */\nhtml[data-dsg='on'] [data-sidebar-right-panel]:has([data-document-preview]),\nhtml[data-dsg='on'] [data-dockkit-pane]:has([data-document-preview]),\nhtml[data-dsg='on'] [data-dockkit-content]:has([data-document-preview]),\nhtml[data-dsg='on'] [data-dockkit-surface]:has([data-document-preview]),\nhtml[data-dsg='on'] [data-dockkit-host]:has([data-document-preview]),\nhtml[data-dsg='on'] [data-slot='sidebar-right']:has([data-document-preview]),\nhtml[data-dsg='on'] [role='dialog']:has([data-document-preview]),\nhtml[data-dsg='on'] [data-shell-overlay] :has(> [data-document-preview]),\nhtml[data-dsg='on'] [data-slot='sidebar-documentpreview'] {\n --dsg-panel-fill: var(--dsg-doc-paper);\n --dsg-panel-backdrop: none;\n background-color: var(--dsg-doc-paper) !important;\n background-image: none !important;\n -webkit-backdrop-filter: none !important;\n backdrop-filter: none !important;\n}\nhtml[data-dsg='on'] [data-document-preview] [class*='_header'],\nhtml[data-dsg='on'] [data-textpreview-wrap] [class*='_header'] {\n background-color: color-mix(in srgb, var(--dsg-tint) 62%, transparent);\n border-bottom: 0.5px solid var(--dsg-border-hair);\n border-radius: 14px 14px 0 0;\n}\nhtml[data-dsg='on'] [data-document-preview] [class*='_page'],\nhtml[data-dsg='on'] [data-document-preview] [class*='_body'],\nhtml[data-dsg='on'] [data-textpreview-wrap] [class*='_body'] {\n background-color: transparent;\n}\nhtml[data-dsg='on'] [data-document-preview] [class*='_frontmatter'] {\n background-color: var(--dsg-fill-l1);\n border: 0.5px solid var(--dsg-border-hair);\n border-radius: 10px;\n}\n/* plan preview inside the right panel */\nhtml[data-dsg='on'] [data-plan-preview] {\n background-color: var(--dsg-fill-l3);\n background-image: var(--dsg-sheen-l3);\n border-radius: var(--dsg-radius-modal);\n box-shadow: var(--dsg-bevel-l2);\n}\n\n/* ===== 95-settings-panel.css ===== */\n/* ============================================================================\n 95 plugin settings panel (rendered inside Settings → settings.section)\n Uses its own .dsg-* vocabulary so it never collides with shipped UI.\n ========================================================================== */\nhtml[data-dsg='on'] .dsg-settings {\n display: flex;\n flex-direction: column;\n gap: 18px;\n max-width: 760px;\n color: var(--dsw-alias-label-primary);\n}\nhtml[data-dsg='on'] .dsg-settings-head {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\nhtml[data-dsg='on'] .dsg-settings-title {\n font-size: 15px;\n font-weight: 600;\n letter-spacing: 0.01em;\n}\nhtml[data-dsg='on'] .dsg-settings-sub {\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-tertiary);\n}\nhtml[data-dsg='on'] .dsg-settings-body {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 8px 18px;\n border-radius: var(--dsg-radius-card);\n background: rgba(255, 255, 255, calc(0.5 * var(--dsg-glass, 1)));\n border: 1px solid var(--dsw-alias-border-l2);\n -webkit-backdrop-filter: blur(var(--dsg-card-blur)) saturate(var(--dsg-sat));\n backdrop-filter: blur(var(--dsg-card-blur)) saturate(var(--dsg-sat));\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.55),\n 0 10px 30px rgba(44, 74, 140, 0.08);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] .dsg-settings-body {\n background: rgba(22, 33, 58, calc(0.6 * var(--dsg-glass, 1)));\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.08),\n 0 14px 36px rgba(0, 0, 0, 0.32);\n}\nhtml[data-dsg='on'] .dsg-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 20px;\n padding: 14px 0;\n border-bottom: 1px solid var(--dsw-alias-border-l1);\n}\nhtml[data-dsg='on'] .dsg-row:last-child {\n border-bottom: 0;\n}\nhtml[data-dsg='on'] .dsg-row-text {\n min-width: 0;\n}\nhtml[data-dsg='on'] .dsg-row-label {\n font-size: 13px;\n font-weight: 500;\n}\nhtml[data-dsg='on'] .dsg-row-hint {\n margin-top: 3px;\n font-size: 11px;\n color: var(--dsw-alias-label-tertiary);\n}\nhtml[data-dsg='on'] .dsg-row-control {\n display: flex;\n align-items: center;\n gap: 10px;\n flex: 0 0 auto;\n}\nhtml[data-dsg='on'] .dsg-slider {\n display: flex;\n align-items: center;\n gap: 10px;\n}\nhtml[data-dsg='on'] .dsg-slider input[type='range'] {\n width: 148px;\n accent-color: var(--dsg-blue);\n}\nhtml[data-dsg='on'] .dsg-slider-value {\n width: 40px;\n font-size: 12px;\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-secondary);\n text-align: right;\n}\nhtml[data-dsg='on'] .dsg-seg {\n display: inline-flex;\n padding: 3px;\n gap: 2px;\n border-radius: 999px;\n background: rgba(77, 107, 254, 0.07);\n border: 1px solid var(--dsw-alias-border-l1);\n}\nhtml[data-dsg='on'] .dsg-seg-btn {\n border: 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n line-height: 1;\n padding: 7px 13px;\n border-radius: 999px;\n cursor: pointer;\n transition: background var(--dsg-motion-dur) var(--dsg-ease), color var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] .dsg-seg-btn:hover {\n color: var(--dsw-alias-label-primary);\n background: rgba(255, 255, 255, 0.5);\n}\nhtml[data-dsg='on'] .dsg-seg-btn.is-on {\n color: var(--dsg-blue);\n background: #fff;\n box-shadow: 0 2px 8px rgba(44, 74, 140, 0.12);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] .dsg-seg-btn.is-on {\n background: rgba(77, 107, 254, 0.28);\n color: #dce6ff;\n}\nhtml[data-dsg='on'] .dsg-switch {\n position: relative;\n width: 44px;\n height: 26px;\n padding: 0;\n border-radius: 999px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: rgba(120, 140, 180, 0.22);\n cursor: pointer;\n transition: background var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] .dsg-switch .dsg-switch-thumb {\n position: absolute;\n top: 3px;\n left: 3px;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n background: #fff;\n box-shadow: 0 1px 4px rgba(20, 40, 90, 0.24);\n transition: transform var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] .dsg-switch.is-on {\n background: var(--dsg-blue);\n border-color: transparent;\n}\nhtml[data-dsg='on'] .dsg-switch.is-on .dsg-switch-thumb {\n transform: translateX(18px);\n}\nhtml[data-dsg='on'] .dsg-settings-foot {\n display: flex;\n justify-content: flex-end;\n padding: 12px 0 10px;\n}\nhtml[data-dsg='on'] .dsg-btn {\n border: 1px solid var(--dsw-alias-border-l2);\n background: rgba(255, 255, 255, 0.6);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n padding: 8px 16px;\n border-radius: 999px;\n cursor: pointer;\n transition: all var(--dsg-motion-dur) var(--dsg-ease);\n}\nhtml[data-dsg='on'] .dsg-btn:hover {\n color: var(--dsg-blue);\n border-color: var(--dsg-blue-ring);\n background: #fff;\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] .dsg-btn {\n background: rgba(255, 255, 255, 0.06);\n}\nhtml[data-dsg='on'] body[data-ds-dark-theme] .dsg-btn:hover {\n background: rgba(77, 107, 254, 0.22);\n color: #dce6ff;\n}\n"
|
|
15
15
|
|
|
16
16
|
// 旧包名(v1.0–v1.6)的配置键:读新键失败时回退到旧键,避免改名丢设置。
|
|
17
17
|
var STORAGE_KEY = 'dsh-skin-mistblue/config'
|
|
@@ -381,12 +381,15 @@ window.__ModuleLoader__.load({
|
|
|
381
381
|
var ROW_SEL = 'button[class*="_panelRow"]'
|
|
382
382
|
var NAV_SEL = 'nav[class*="_panelList"]'
|
|
383
383
|
var TAB_SEL = '[data-conversation-tabs] [role="tab"]'
|
|
384
|
-
var
|
|
385
|
-
var suppressClick = false
|
|
386
|
-
var lastView = null
|
|
384
|
+
var ORDER_KEY = 'dsh-skin-mistblue/panel-order'
|
|
387
385
|
var nav = null
|
|
386
|
+
var lastView = null
|
|
388
387
|
var lastSig = ''
|
|
389
388
|
var schedule = false
|
|
389
|
+
var dragRow = null
|
|
390
|
+
var dropRow = null
|
|
391
|
+
var dropAfter = false
|
|
392
|
+
var suppressClick = false
|
|
390
393
|
|
|
391
394
|
function rowOf(node) {
|
|
392
395
|
if (!node || node.nodeType !== 1 || !node.closest) return null
|
|
@@ -400,8 +403,7 @@ window.__ModuleLoader__.load({
|
|
|
400
403
|
return row.getAttribute('aria-label') || (row.textContent || '').trim()
|
|
401
404
|
}
|
|
402
405
|
function activeRow() {
|
|
403
|
-
|
|
404
|
-
return nav.querySelector(ROW_SEL + '[aria-current="page"]')
|
|
406
|
+
return nav ? nav.querySelector(ROW_SEL + '[aria-current="page"]') : null
|
|
405
407
|
}
|
|
406
408
|
function activeTab() {
|
|
407
409
|
var tabs = document.querySelectorAll(TAB_SEL)
|
|
@@ -425,46 +427,43 @@ window.__ModuleLoader__.load({
|
|
|
425
427
|
function selectPanel(id) {
|
|
426
428
|
var layout = layoutService()
|
|
427
429
|
if (!layout || typeof layout.selectPanel !== 'function') return false
|
|
428
|
-
try {
|
|
429
|
-
layout.selectPanel(id)
|
|
430
|
-
return true
|
|
431
|
-
} catch (e) { return false }
|
|
430
|
+
try { layout.selectPanel(id); return true } catch (e) { return false }
|
|
432
431
|
}
|
|
433
432
|
function readOrder() {
|
|
434
433
|
try {
|
|
435
|
-
var raw = readItem(
|
|
436
|
-
|
|
434
|
+
var raw = readItem(ORDER_KEY)
|
|
435
|
+
var list = raw ? JSON.parse(raw) : []
|
|
436
|
+
return Array.isArray(list) ? list : []
|
|
437
437
|
} catch (e) { return [] }
|
|
438
438
|
}
|
|
439
439
|
function saveOrder() {
|
|
440
|
-
var labels =
|
|
441
|
-
|
|
442
|
-
.sort(function (a, b) { return (parseInt(a.style.order, 10) || 0) - (parseInt(b.style.order, 10) || 0) })
|
|
443
|
-
.map(labelOf)
|
|
444
|
-
try { localStorage.setItem(PANEL_ORDER_KEY, JSON.stringify(labels)) } catch (e) { /* non-fatal */ }
|
|
440
|
+
var labels = visualRows().map(labelOf)
|
|
441
|
+
try { localStorage.setItem(ORDER_KEY, JSON.stringify(labels)) } catch (e) { /* non-fatal */ }
|
|
445
442
|
}
|
|
446
443
|
function visualRows() {
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
444
|
+
var rows = rowsOf()
|
|
445
|
+
var indexed = rows.map(function (r, i) { return { r: r, i: i } })
|
|
446
|
+
indexed.sort(function (a, b) {
|
|
447
|
+
var ao = a.r.style.order === '' ? 9999 : parseInt(a.r.style.order, 10)
|
|
448
|
+
var bo = b.r.style.order === '' ? 9999 : parseInt(b.r.style.order, 10)
|
|
449
|
+
return ao !== bo ? ao - bo : a.i - b.i
|
|
452
450
|
})
|
|
451
|
+
return indexed.map(function (x) { return x.r })
|
|
453
452
|
}
|
|
454
453
|
function applyOrder() {
|
|
455
|
-
if (!nav
|
|
454
|
+
if (!nav) return
|
|
456
455
|
var rows = rowsOf()
|
|
457
456
|
if (!rows.length) return
|
|
458
457
|
var sig = rows.map(labelOf).join('|')
|
|
459
|
-
var missing = rows.some(function (r) { return r.
|
|
458
|
+
var missing = rows.some(function (r) { return r.getAttribute('draggable') !== 'true' })
|
|
460
459
|
if (sig === lastSig && !missing) return
|
|
461
460
|
lastSig = sig
|
|
462
461
|
var saved = readOrder()
|
|
463
462
|
rows.forEach(function (r, i) {
|
|
463
|
+
if (r.getAttribute('draggable') !== 'true') r.setAttribute('draggable', 'true')
|
|
464
464
|
var pos = saved.indexOf(labelOf(r))
|
|
465
465
|
r.style.order = String(pos >= 0 ? pos : saved.length + i)
|
|
466
466
|
})
|
|
467
|
-
// saved labels that no longer exist shouldn't stretch the order gaps
|
|
468
467
|
visualRows().forEach(function (r, i) { r.style.order = String(i) })
|
|
469
468
|
}
|
|
470
469
|
function scheduleApply() {
|
|
@@ -477,94 +476,77 @@ window.__ModuleLoader__.load({
|
|
|
477
476
|
})
|
|
478
477
|
}
|
|
479
478
|
function setNav(next) {
|
|
480
|
-
if (nav === next) return
|
|
481
479
|
nav = next
|
|
482
480
|
lastSig = ''
|
|
483
|
-
if (
|
|
484
|
-
applyOrder()
|
|
481
|
+
if (nav) applyOrder()
|
|
485
482
|
}
|
|
486
483
|
function findNav() {
|
|
487
484
|
var found = document.querySelector(NAV_SEL)
|
|
488
485
|
if (found) setNav(found)
|
|
489
486
|
}
|
|
490
|
-
function
|
|
491
|
-
if (
|
|
492
|
-
|
|
493
|
-
// over the tooltip layer or outside the nav while dragging fast.
|
|
494
|
-
var list = visualRows()
|
|
495
|
-
var over = null
|
|
496
|
-
var nearest = null
|
|
497
|
-
var nearestDist = Infinity
|
|
498
|
-
for (var i = 0; i < list.length; i++) {
|
|
499
|
-
var r = list[i]
|
|
500
|
-
if (r === drag.row) continue
|
|
501
|
-
var rect = r.getBoundingClientRect()
|
|
502
|
-
if (y >= rect.top && y <= rect.bottom) { over = r; break }
|
|
503
|
-
var mid = rect.top + rect.height / 2
|
|
504
|
-
var d = Math.abs(y - mid)
|
|
505
|
-
if (d < nearestDist) { nearestDist = d; nearest = r }
|
|
506
|
-
}
|
|
507
|
-
var target = over || nearest
|
|
508
|
-
if (!target || target === drag.row) return
|
|
509
|
-
var tr = target.getBoundingClientRect()
|
|
510
|
-
var after = !over || y > tr.top + tr.height / 2
|
|
511
|
-
var without = list.filter(function (r) { return r !== drag.row })
|
|
512
|
-
var targetIdx = without.indexOf(target)
|
|
513
|
-
if (targetIdx < 0) return
|
|
514
|
-
without.splice(after ? targetIdx + 1 : targetIdx, 0, drag.row)
|
|
515
|
-
without.forEach(function (r, idx) { r.style.order = String(idx) })
|
|
516
|
-
}
|
|
517
|
-
function cleanupDrag() {
|
|
518
|
-
if (!drag) return
|
|
519
|
-
drag.row.classList.remove('dsg-panel-row-drag')
|
|
520
|
-
document.documentElement.removeAttribute('data-dsg-panel-drag')
|
|
521
|
-
document.body.style.cursor = ''
|
|
522
|
-
if (drag.moved) saveOrder()
|
|
523
|
-
var wasMoved = drag.moved
|
|
524
|
-
drag = null
|
|
525
|
-
// A plain click also ends the drag gesture; only a real drag must swallow
|
|
526
|
-
// the following click, otherwise panel rows would never open.
|
|
527
|
-
if (wasMoved) {
|
|
528
|
-
suppressClick = true
|
|
529
|
-
window.setTimeout(function () { suppressClick = false }, 400)
|
|
530
|
-
}
|
|
531
|
-
document.removeEventListener('pointermove', onPointerMove, true)
|
|
532
|
-
document.removeEventListener('pointerup', onPointerUp, true)
|
|
533
|
-
document.removeEventListener('pointercancel', onPointerUp, true)
|
|
534
|
-
}
|
|
535
|
-
function onPointerMove(e) {
|
|
536
|
-
if (!drag || e.pointerId !== drag.pointerId) return
|
|
537
|
-
if (!drag.moved) {
|
|
538
|
-
var dx = e.clientX - drag.x
|
|
539
|
-
var dy = e.clientY - drag.y
|
|
540
|
-
if (dx * dx + dy * dy < 36) return
|
|
541
|
-
drag.moved = true
|
|
542
|
-
document.documentElement.setAttribute('data-dsg-panel-drag', '')
|
|
543
|
-
document.body.style.cursor = 'grabbing'
|
|
544
|
-
drag.row.classList.add('dsg-panel-row-drag')
|
|
545
|
-
}
|
|
546
|
-
e.preventDefault()
|
|
547
|
-
reorderTo(e.clientX, e.clientY)
|
|
487
|
+
function clearDrop() {
|
|
488
|
+
if (dropRow) dropRow.classList.remove('dsg-panel-row-drop')
|
|
489
|
+
dropRow = null
|
|
548
490
|
}
|
|
549
|
-
function
|
|
550
|
-
|
|
551
|
-
|
|
491
|
+
function moveRow(dragged, target, after) {
|
|
492
|
+
var list = visualRows().filter(function (r) { return r !== dragged })
|
|
493
|
+
var idx = list.indexOf(target)
|
|
494
|
+
if (idx < 0) return
|
|
495
|
+
list.splice(after ? idx + 1 : idx, 0, dragged)
|
|
496
|
+
list.forEach(function (r, i) { r.style.order = String(i) })
|
|
552
497
|
}
|
|
553
|
-
function
|
|
554
|
-
if (
|
|
498
|
+
function endDrag() {
|
|
499
|
+
if (dragRow) dragRow.classList.remove('dsg-panel-row-drag')
|
|
500
|
+
dragRow = null
|
|
501
|
+
clearDrop()
|
|
502
|
+
saveOrder()
|
|
503
|
+
}
|
|
504
|
+
function onDragStart(e) {
|
|
555
505
|
var row = rowOf(e.target)
|
|
556
|
-
if (!row) return
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
506
|
+
if (!row || !nav || !nav.contains(row)) return
|
|
507
|
+
dragRow = row
|
|
508
|
+
row.classList.add('dsg-panel-row-drag')
|
|
509
|
+
try {
|
|
510
|
+
e.dataTransfer.effectAllowed = 'move'
|
|
511
|
+
e.dataTransfer.setData('text/plain', labelOf(row))
|
|
512
|
+
} catch (err) { /* non-fatal */ }
|
|
513
|
+
}
|
|
514
|
+
function onDragOver(e) {
|
|
515
|
+
if (!dragRow) return
|
|
516
|
+
e.preventDefault()
|
|
517
|
+
try { e.dataTransfer.dropEffect = 'move' } catch (err) { /* non-fatal */ }
|
|
518
|
+
var target = rowOf(e.target)
|
|
519
|
+
if (!target || target === dragRow) return
|
|
520
|
+
if (dropRow !== target) {
|
|
521
|
+
clearDrop()
|
|
522
|
+
dropRow = target
|
|
523
|
+
target.classList.add('dsg-panel-row-drop')
|
|
524
|
+
}
|
|
525
|
+
var r = target.getBoundingClientRect()
|
|
526
|
+
dropAfter = e.clientY > r.top + r.height / 2
|
|
527
|
+
}
|
|
528
|
+
function onDrop(e) {
|
|
529
|
+
if (!dragRow) return
|
|
530
|
+
e.preventDefault()
|
|
531
|
+
var target = dropRow || rowOf(e.target)
|
|
532
|
+
var after = dropRow ? dropAfter : false
|
|
533
|
+
var dragged = dragRow
|
|
534
|
+
if (target && target !== dragged) {
|
|
535
|
+
moveRow(dragged, target, after)
|
|
560
536
|
}
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
537
|
+
dragRow.classList.remove('dsg-panel-row-drag')
|
|
538
|
+
clearDrop()
|
|
539
|
+
suppressClick = true
|
|
540
|
+
window.setTimeout(function () { suppressClick = false }, 120)
|
|
541
|
+
dragRow = null
|
|
542
|
+
saveOrder()
|
|
543
|
+
}
|
|
544
|
+
function onDragEnd() {
|
|
545
|
+
suppressClick = true
|
|
546
|
+
window.setTimeout(function () { suppressClick = false }, 120)
|
|
547
|
+
endDrag()
|
|
565
548
|
}
|
|
566
549
|
function navigateBack(view) {
|
|
567
|
-
// authoritative path: layout.selectPanel(null) returns to the Conversation
|
|
568
550
|
if (selectPanel(null)) return true
|
|
569
551
|
if (!view) {
|
|
570
552
|
var tab = document.querySelector(TAB_SEL)
|
|
@@ -590,19 +572,15 @@ window.__ModuleLoader__.load({
|
|
|
590
572
|
if (suppressClick) {
|
|
591
573
|
e.preventDefault()
|
|
592
574
|
e.stopImmediatePropagation()
|
|
593
|
-
suppressClick = false
|
|
594
575
|
return
|
|
595
576
|
}
|
|
596
577
|
var pid = panelId()
|
|
597
|
-
|
|
598
|
-
if (pid !== null && pid !== undefined && active === row) {
|
|
599
|
-
// second click on the already-open panel: return to the previous view
|
|
578
|
+
if (pid !== null && pid !== undefined && activeRow() === row) {
|
|
600
579
|
e.preventDefault()
|
|
601
580
|
e.stopImmediatePropagation()
|
|
602
581
|
navigateBack(lastView)
|
|
603
582
|
return
|
|
604
583
|
}
|
|
605
|
-
// opening a panel: remember where we came from
|
|
606
584
|
var prev = activeRow()
|
|
607
585
|
if (prev && prev !== row) {
|
|
608
586
|
lastView = { type: 'panel', label: labelOf(prev) }
|
|
@@ -614,7 +592,10 @@ window.__ModuleLoader__.load({
|
|
|
614
592
|
function start() {
|
|
615
593
|
findNav()
|
|
616
594
|
if (!nav) return false
|
|
617
|
-
document.addEventListener('
|
|
595
|
+
document.addEventListener('dragstart', onDragStart, true)
|
|
596
|
+
document.addEventListener('dragover', onDragOver, true)
|
|
597
|
+
document.addEventListener('drop', onDrop, true)
|
|
598
|
+
document.addEventListener('dragend', onDragEnd, true)
|
|
618
599
|
document.addEventListener('click', onClick, true)
|
|
619
600
|
try {
|
|
620
601
|
var mo = new MutationObserver(scheduleApply)
|
|
@@ -622,9 +603,12 @@ window.__ModuleLoader__.load({
|
|
|
622
603
|
ctx.effect(function () {
|
|
623
604
|
return function () {
|
|
624
605
|
mo.disconnect()
|
|
625
|
-
document.removeEventListener('
|
|
606
|
+
document.removeEventListener('dragstart', onDragStart, true)
|
|
607
|
+
document.removeEventListener('dragover', onDragOver, true)
|
|
608
|
+
document.removeEventListener('drop', onDrop, true)
|
|
609
|
+
document.removeEventListener('dragend', onDragEnd, true)
|
|
626
610
|
document.removeEventListener('click', onClick, true)
|
|
627
|
-
|
|
611
|
+
endDrag()
|
|
628
612
|
nav = null
|
|
629
613
|
window.__dsgSidebarEnhancer = false
|
|
630
614
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-skin-mistblue",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Mistblue (雾蓝) — a DeepSeek-web inspired translucent glass skin for DeepSeek Harness: airy ambient background, liquid-glass surfaces, readability-tiered blur for cards, popups and detail panels.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|