dsh-pixel-ui 1.0.0 → 1.8.0

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.
Files changed (44) hide show
  1. package/LICENSE +29 -21
  2. package/README.md +257 -158
  3. package/assets/complete-ui/hologram/ATTRIBUTION.md +17 -0
  4. package/assets/complete-ui/hologram/LICENSE.txt +20 -0
  5. package/assets/complete-ui/hologram/button-primary-lock.png +0 -0
  6. package/assets/complete-ui/hologram/button-primary-press.png +0 -0
  7. package/assets/complete-ui/hologram/button-primary.png +0 -0
  8. package/assets/complete-ui/hologram/icon-button.png +0 -0
  9. package/assets/complete-ui/hologram/input.png +0 -0
  10. package/assets/complete-ui/hologram/panel.png +0 -0
  11. package/assets/complete-ui/hologram/scroll-handle.png +0 -0
  12. package/assets/complete-ui/hologram/select-bar.png +0 -0
  13. package/assets/complete-ui/papernote/ATTRIBUTION.md +28 -0
  14. package/assets/complete-ui/papernote/LICENSE.txt +20 -0
  15. package/assets/complete-ui/papernote/button-hover.png +0 -0
  16. package/assets/complete-ui/papernote/button.png +0 -0
  17. package/assets/complete-ui/papernote/cursor.png +0 -0
  18. package/assets/complete-ui/papernote/icon-button.png +0 -0
  19. package/assets/complete-ui/papernote/input.png +0 -0
  20. package/assets/complete-ui/papernote/panel.png +0 -0
  21. package/assets/complete-ui/papernote/popover.png +0 -0
  22. package/assets/complete-ui/pumpkin/ATTRIBUTION.md +29 -0
  23. package/assets/complete-ui/pumpkin/LICENSE.txt +20 -0
  24. package/assets/complete-ui/pumpkin/button-hover.png +0 -0
  25. package/assets/complete-ui/pumpkin/button-press.png +0 -0
  26. package/assets/complete-ui/pumpkin/button.png +0 -0
  27. package/assets/complete-ui/pumpkin/icon-button.png +0 -0
  28. package/assets/complete-ui/pumpkin/input.png +0 -0
  29. package/assets/complete-ui/pumpkin/panel.png +0 -0
  30. package/assets/complete-ui/pumpkin/popover.png +0 -0
  31. package/assets/complete-ui/pumpkin/select.png +0 -0
  32. package/assets/cover.jpg +0 -0
  33. package/assets/screenshot-paper.png +0 -0
  34. package/assets/screenshot-retro.png +0 -0
  35. package/assets/screenshot-warm.png +0 -0
  36. package/assets/screenshot-wood.png +0 -0
  37. package/lib/client.js +1522 -363
  38. package/lib/client.js.map +3 -3
  39. package/lib/index.js +172 -52
  40. package/package.json +81 -42
  41. package/assets/screenshot-paper-chat.png +0 -0
  42. package/assets/screenshot-retro-chat.png +0 -0
  43. package/assets/screenshot-warm-chat.png +0 -0
  44. package/assets/screenshot-wood-chat.png +0 -0
package/lib/client.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/client/index.js", "../src/client/pixel.css"],
4
- "sourcesContent": ["/**\n * dsh-pixel-ui — browser half (the pixel skin).\n *\n * Registers four Agent-Xi-style pixel themes on the ThemeService seam\n * (`ctx.theme.register` with --dsw-alias-* token overrides): wood (dark),\n * paper (light), warm (dark), retro-green (dark). The stylesheet carries\n * the pixel borders, fonts, CRT overlay, and component tweaks that alias\n * tokens alone cannot express, scoped to `html[data-pixel-ui]` with a\n * `data-pixel-theme` variant attribute for the four palettes.\n *\n * The host settings scope persists only the built-in preferences\n * (light/dark/system), so this plugin persists the last choice itself\n * (localStorage) and restores it on load; the first run activates the\n * default wood skin. A settings row in the General section switches\n * between the four skins and back to the modern default (`system`).\n *\n * @module dsh-pixel-ui/client\n */\nimport { createElement as h } from 'react'\nimport { defineStore } from '@deepseek-ai/dsh-client-runtime/client'\nimport cssText from './pixel.css'\n\n/** Plugin name; also the patch row id. */\nexport const name = 'dsh-pixel-ui'\n\n/** Required services: the theme runtime and the settings item slot. */\nexport const inject = ['slots', 'theme']\n\n/** localStorage key carrying the last theme choice across loads. */\nconst THEME_STORAGE_KEY = 'dsh-pixel-ui:theme'\n\n/** The four pixel themes (Agent Xi palettes) registered on the ThemeService. */\nconst THEMES = [\n {\n id: 'pixel-wood',\n colorScheme: 'dark',\n tokens: {\n '--dsw-alias-bg-base': '#1A0F06',\n '--dsw-alias-bg-layer-1': '#2C1A0C',\n '--dsw-alias-bg-layer-2': '#3A2515',\n '--dsw-alias-bg-overlay': '#241408',\n '--dsw-alias-border-l1': '#4A3020',\n '--dsw-alias-border-l2': '#8B6B45',\n '--dsw-alias-brand-primary': '#F4D03F',\n '--dsw-alias-label-primary': '#F5E6C8',\n '--dsw-alias-label-secondary': '#9B7B5B',\n '--dsw-alias-state-error-primary': '#E74C3C',\n '--dsw-alias-state-success-primary': '#7DCE82',\n '--dsw-alias-state-warn-primary': '#F39C12',\n '--dsw-specific-sidebar-fill': '#241408',\n },\n },\n {\n id: 'pixel-paper',\n colorScheme: 'light',\n tokens: {\n '--dsw-alias-bg-base': '#F0E8D8',\n '--dsw-alias-bg-layer-1': '#E8DCC8',\n '--dsw-alias-bg-layer-2': '#DDD0B8',\n '--dsw-alias-bg-overlay': '#E2D6BE',\n '--dsw-alias-border-l1': '#D4C4A8',\n '--dsw-alias-border-l2': '#9B8B6B',\n '--dsw-alias-brand-primary': '#C8960C',\n '--dsw-alias-label-primary': '#3A2A10',\n '--dsw-alias-label-secondary': '#6B5020',\n '--dsw-alias-state-error-primary': '#8B2020',\n '--dsw-alias-state-success-primary': '#3A7A40',\n '--dsw-alias-state-warn-primary': '#805000',\n '--dsw-specific-sidebar-fill': '#E8DCC8',\n },\n },\n {\n id: 'pixel-warm',\n colorScheme: 'dark',\n tokens: {\n '--dsw-alias-bg-base': '#1E0E04',\n '--dsw-alias-bg-layer-1': '#34180A',\n '--dsw-alias-bg-layer-2': '#4A2210',\n '--dsw-alias-bg-overlay': '#2A1308',\n '--dsw-alias-border-l1': '#5C2E16',\n '--dsw-alias-border-l2': '#A86B40',\n '--dsw-alias-brand-primary': '#FF8C42',\n '--dsw-alias-label-primary': '#F0C8A0',\n '--dsw-alias-label-secondary': '#A86B40',\n '--dsw-alias-state-error-primary': '#D93B3B',\n '--dsw-alias-state-success-primary': '#6DBF6D',\n '--dsw-alias-state-warn-primary': '#FF8C42',\n '--dsw-specific-sidebar-fill': '#2A1308',\n },\n },\n {\n id: 'pixel-retro',\n colorScheme: 'dark',\n tokens: {\n '--dsw-alias-bg-base': '#0A0E0A',\n '--dsw-alias-bg-layer-1': '#0E140E',\n '--dsw-alias-bg-layer-2': '#121A12',\n '--dsw-alias-bg-overlay': '#0C100C',\n '--dsw-alias-border-l1': '#2A402A',\n '--dsw-alias-border-l2': '#3A5A3A',\n '--dsw-alias-brand-primary': '#33FF33',\n '--dsw-alias-label-primary': '#33FF33',\n '--dsw-alias-label-secondary': '#118811',\n '--dsw-alias-state-error-primary': '#FF3333',\n '--dsw-alias-state-success-primary': '#33FF33',\n '--dsw-alias-state-warn-primary': '#FFCC33',\n '--dsw-specific-sidebar-fill': '#0C100C',\n },\n },\n]\n\nconst PIXEL_IDS = THEMES.map((theme) => theme.id)\n\n/** Built-in preference ids; together with the pixel ids they are restorable. */\nconst RESTORABLE_IDS = new Set(['light', 'dark', 'system', ...PIXEL_IDS])\n\n/** Settings row choices: the four skins plus the modern default escape. */\nconst THEME_CHOICES = [\n { id: 'pixel-wood', label: '像素·木屋', swatch: '#F4D03F' },\n { id: 'pixel-paper', label: '像素·羊皮纸', swatch: '#F5E6C8' },\n { id: 'pixel-warm', label: '像素·暖阳', swatch: '#FF8C42' },\n { id: 'pixel-retro', label: '像素·终端绿', swatch: '#33FF33' },\n { id: 'system', label: '现代默认', swatch: '#7A7A7A' },\n]\n\n/**\n * Declares the theme row slot store: a mirror of the theme service\n * preference, written only by the plugin's apply-world change listener\n * (same shape as the ui-theme Appearance row store).\n * @returns the store handle.\n */\nfunction createThemeRowStore() {\n return defineStore({\n init: () => ({ preference: null, revision: -1 }),\n actions: {\n sync: (draft, preference, revision) => {\n if (revision <= draft.revision) return\n draft.preference = preference\n draft.revision = revision\n },\n },\n })\n}\n\n/**\n * General-section row: switch between the four pixel skins and back to the\n * modern default. Reads selection state through props.useStore and writes\n * through the injected setTheme callback.\n * @param props - slot shares (useStore + injected face).\n * @returns the row element tree.\n */\nfunction ThemeRow(props) {\n const preference = props.useStore((state) => state.preference)\n return h('div', { className: 'px-theme-row' },\n h('div', { className: 'px-theme-row-title' }, '像素主题'),\n h('div', { className: 'px-theme-row-cubes' },\n THEME_CHOICES.map((choice) => h('button', {\n key: choice.id,\n type: 'button',\n className: 'px-theme-btn' + (preference === choice.id ? ' px-theme-btn-active' : ''),\n onClick: () => { props.setTheme(choice.id) },\n },\n h('span', { className: 'px-theme-swatch', style: { background: choice.swatch } }),\n choice.label,\n )),\n ),\n )\n}\n\n/** Client plugin body: register the four themes, restore/persist the choice, inject CSS and the settings row. */\nexport function apply(ctx) {\n // Scope attributes mirror the active theme, so the stylesheet only shades\n // while a pixel theme is selected and the variant rules can pick the palette.\n const syncScope = () => {\n const active = ctx.theme.getTheme().active\n const on = PIXEL_IDS.includes(active.id)\n document.documentElement.toggleAttribute('data-pixel-ui', on)\n if (on) document.documentElement.setAttribute('data-pixel-theme', active.id)\n else document.documentElement.removeAttribute('data-pixel-theme')\n }\n\n // Custom theme ids do not survive the host settings scope, so carry the\n // latest preference here; built-in choices ride along too.\n const persist = (snapshot) => {\n try {\n localStorage.setItem(THEME_STORAGE_KEY, snapshot.preference)\n } catch {\n // Storage unavailable (private mode / quota): persistence is best-effort.\n }\n }\n ctx.on('theme/change', (snapshot) => { syncScope(); persist(snapshot) })\n\n ctx.effect(() => {\n const disposers = THEMES.map((definition) => ctx.theme.register(definition))\n return () => { for (const dispose of disposers) dispose() }\n }, 'dsh-pixel-ui: theme registration')\n\n // Restore the last choice; the first run wears the default wood skin.\n let saved = null\n try { saved = localStorage.getItem(THEME_STORAGE_KEY) } catch { /* storage unavailable */ }\n const target = saved !== null && RESTORABLE_IDS.has(saved) ? saved : 'pixel-wood'\n try { ctx.theme.setTheme(target) } catch { /* unknown id from an older version: keep current */ }\n syncScope()\n\n // Pixel theme row in the General settings section (alongside Appearance).\n const rowStore = createThemeRowStore()\n let bound = undefined\n const syncRow = (snapshot) => { bound?.sync(snapshot.preference, snapshot.revision) }\n ctx.on('theme/change', syncRow)\n ctx.slots.inject('settings.general.item', () => ctx.slots.register({\n name: 'settings.general.item',\n id: 'pixel-theme',\n order: 20,\n store: rowStore,\n inject: (actions) => {\n bound = actions\n // Re-sync from the getter so no event is lost between registration and\n // first render (the store's revision guard drops stale duplicates).\n syncRow(ctx.theme.getTheme())\n return { setTheme: (id) => { ctx.theme.setTheme(id) } }\n },\n }, ThemeRow))\n\n ctx.effect(() => {\n const style = document.createElement('style')\n style.dataset.plugin = 'dsh-pixel-ui'\n style.textContent = cssText\n document.head.appendChild(style)\n return () => {\n style.remove()\n document.documentElement.removeAttribute('data-pixel-ui')\n document.documentElement.removeAttribute('data-pixel-theme')\n }\n }, 'dsh-pixel-ui: stylesheet')\n}\n", "/* dsh-pixel-ui — 星露谷风像素皮肤(木屋/羊皮纸/暖阳/终端绿四主题)\r\n * 全面对标 Agent Xi 前端像素语言(web/src/styles/main.css):\r\n * - 木色/金色/羊皮纸三系色板 + 阶梯硬阴影 + 内凹/凸起 bevel\r\n * - 像素字体做界面装饰(标题/页签/按钮/徽章/输入框),正文与代码走 mono\r\n * - 木纹条纹纹理、CRT 扫描线 + 暗角 + 微闪烁、像素光标、像素按压动效\r\n * 作用域 html[data-pixel-ui]:任一像素主题激活时生效,\r\n * data-pixel-theme 区分四种配色。切回 现代默认/浅色/深色 即整体退出。\r\n * 原则:颜色尽量交给主题 token,本表负责 token 表达不了的像素质感。 */\r\n\r\n@font-face {\r\n font-family: 'Fusion Pixel 12';\r\n src: url('/dsh-pixel-ui/fonts/fusion-pixel-12px.woff2') format('woff2');\r\n font-weight: 400;\r\n font-style: normal;\r\n font-display: swap;\r\n}\r\n@font-face {\r\n font-family: 'Press Start 2P';\r\n src: url('/dsh-pixel-ui/fonts/PressStart2P-Regular.ttf') format('truetype');\r\n font-weight: 400;\r\n font-style: normal;\r\n font-display: swap;\r\n}\r\n\r\nhtml[data-pixel-ui] {\r\n /* ── Xi 同款色板 ─────────────────────────────────────── */\r\n --px-wood-darkest: #1A0F06;\r\n --px-wood-dark: #2C1A0C;\r\n --px-wood-mid: #3A2515;\r\n --px-wood-warm: #4A3020;\r\n --px-wood-light: #6B4C2E;\r\n --px-wood-pale: #8B6B45;\r\n --px-gold: #F4D03F;\r\n --px-gold-bright: #FFE066;\r\n --px-gold-dark: #C99A00;\r\n --px-gold-deep: #8B6B00;\r\n --px-parchment: #F5E6C8;\r\n --px-text-on-dark: #E8D5B0;\r\n --px-text-light: #9B7B5B;\r\n\r\n /* 输入框专用色(各主题单独覆盖,保证任何底色下文字可见) */\r\n --px-input-bg: #1A0F06;\r\n --px-input-text: #FFFDF5;\r\n --px-input-caret: #F4D03F;\r\n --px-input-ph: #9B7B5B;\r\n\r\n /* 文字阴影强度:暗色主题用 2px 像素硬阴影,浅色主题收敛防重影 */\r\n --px-ts-chrome: 2px 2px 0 rgba(26, 15, 6, 0.6), -1px -1px 0 rgba(26, 15, 6, 0.4);\r\n --px-ts-btn: 1px 1px 0 rgba(0, 0, 0, 0.4);\r\n\r\n /* 像素字体栈:中文/全角走 fusion-pixel(12px 原生),英文数字兜底 Press Start 2P */\r\n --px-font: 'Fusion Pixel 12', 'Press Start 2P', monospace;\r\n --px-mono: 'Cascadia Code', 'Consolas', 'Courier New', monospace;\r\n}\r\n\r\n/* ── 四主题色板(Agent Xi 同款)────────────────────────── */\r\nhtml[data-pixel-theme='pixel-paper'] {\r\n --px-wood-darkest: #F0E8D8;\r\n --px-wood-dark: #E8DCC8;\r\n --px-wood-mid: #DDD0B8;\r\n --px-wood-warm: #D4C4A8;\r\n --px-wood-light: #B8A080;\r\n --px-wood-pale: #9B8B6B;\r\n --px-gold: #C8960C;\r\n --px-gold-bright: #E0A800;\r\n --px-gold-dark: #A07000;\r\n --px-gold-deep: #805000;\r\n --px-parchment: #FFFDF5;\r\n --px-text-on-dark: #3A2A10;\r\n --px-text-light: #8B7040;\r\n --px-input-bg: #FFFDF5;\r\n --px-input-text: #3A2A10;\r\n --px-input-caret: #C8960C;\r\n --px-input-ph: #8B7040;\r\n /* 浅色底上 2px 硬阴影会变重影:去掉文字阴影,靠字体本身 */\r\n --px-ts-chrome: none;\r\n --px-ts-btn: none;\r\n}\r\nhtml[data-pixel-theme='pixel-warm'] {\r\n --px-wood-darkest: #1E0E04;\r\n --px-wood-dark: #34180A;\r\n --px-wood-mid: #4A2210;\r\n --px-wood-warm: #5C2E16;\r\n --px-wood-light: #8B4A28;\r\n --px-wood-pale: #A86B40;\r\n --px-gold: #FF8C42;\r\n --px-gold-bright: #FFA64D;\r\n --px-gold-dark: #D96E30;\r\n --px-gold-deep: #A05020;\r\n --px-parchment: #FFF0E0;\r\n --px-text-on-dark: #F0C8A0;\r\n --px-text-light: #A86B40;\r\n --px-input-bg: #1E0E04;\r\n --px-input-text: #FFFBF5;\r\n --px-input-caret: #FF8C42;\r\n --px-input-ph: #A86B40;\r\n}\r\nhtml[data-pixel-theme='pixel-retro'] {\r\n --px-wood-darkest: #0A0E0A;\r\n --px-wood-dark: #0E140E;\r\n --px-wood-mid: #121A12;\r\n --px-wood-warm: #162016;\r\n --px-wood-light: #2A402A;\r\n --px-wood-pale: #3A5A3A;\r\n --px-gold: #33FF33;\r\n --px-gold-bright: #66FF66;\r\n --px-gold-dark: #00CC00;\r\n --px-gold-deep: #009900;\r\n --px-parchment: #0A1A0A;\r\n --px-text-on-dark: #33FF33;\r\n --px-text-light: #118811;\r\n --px-input-bg: #0A0E0A;\r\n --px-input-text: #33FF33;\r\n --px-input-caret: #33FF33;\r\n --px-input-ph: #118811;\r\n}\r\n\r\n/* ── 全局质感:禁次像素平滑(像素字体的灵魂)、位图三件套、方形化 ── */\r\nhtml[data-pixel-ui] body {\r\n -webkit-font-smoothing: none;\r\n -moz-osx-font-smoothing: grayscale;\r\n text-rendering: geometricPrecision;\r\n font-family: var(--px-font) !important;\r\n letter-spacing: 0.01em;\r\n}\r\n\r\nhtml[data-pixel-ui] img,\r\nhtml[data-pixel-ui] canvas,\r\nhtml[data-pixel-ui] video {\r\n image-rendering: -moz-crisp-edges;\r\n image-rendering: crisp-edges;\r\n image-rendering: pixelated;\r\n}\r\n\r\n/* 一切皆方角(像素风第一原则) */\r\nhtml[data-pixel-ui] * {\r\n border-radius: 0 !important;\r\n}\r\n\r\nhtml[data-pixel-ui] ::selection {\r\n background: var(--px-gold);\r\n color: var(--px-wood-darkest);\r\n}\r\n\r\nhtml[data-pixel-ui] :focus-visible {\r\n outline: 2px solid var(--px-gold) !important;\r\n outline-offset: 1px;\r\n}\r\n\r\n/* ── 像素滚动条:方形、木色 ────────────────────────────── */\r\nhtml[data-pixel-ui] ::-webkit-scrollbar { width: 10px; height: 10px; }\r\nhtml[data-pixel-ui] ::-webkit-scrollbar-track {\r\n background: var(--px-wood-darkest);\r\n border-left: 2px solid var(--px-wood-dark);\r\n}\r\nhtml[data-pixel-ui] ::-webkit-scrollbar-thumb {\r\n background: var(--px-wood-light);\r\n border: 2px solid var(--px-wood-darkest);\r\n}\r\nhtml[data-pixel-ui] ::-webkit-scrollbar-thumb:hover { background: var(--px-wood-pale); }\r\n\r\n/* ── 排版:装饰性 UI 用像素字体,正文/代码用 mono(Xi 的信息分层) ── */\r\nhtml[data-pixel-ui] h1,\r\nhtml[data-pixel-ui] h2,\r\nhtml[data-pixel-ui] h3,\r\nhtml[data-pixel-ui] [class*='title'],\r\nhtml[data-pixel-ui] [class*='label'],\r\nhtml[data-pixel-ui] [class*='tab'],\r\nhtml[data-pixel-ui] [class*='badge'],\r\nhtml[data-pixel-ui] [class*='chip'],\r\nhtml[data-pixel-ui] [class*='Tag'],\r\nhtml[data-pixel-ui] [class*='pill'] {\r\n font-family: var(--px-font) !important;\r\n text-shadow: var(--px-ts-chrome);\r\n}\r\n\r\n/* 标题/页签取金色(Xi .panel-title 语义) */\r\nhtml[data-pixel-ui] h1,\r\nhtml[data-pixel-ui] h2,\r\nhtml[data-pixel-ui] h3,\r\nhtml[data-pixel-ui] [class*='title'] {\r\n color: var(--px-gold-bright) !important;\r\n letter-spacing: 0.02em;\r\n}\r\n\r\n/* 页签:选中态金色下划线 */\r\nhtml[data-pixel-ui] [class*='tab'],\r\nhtml[data-pixel-ui] [aria-selected='true'] {\r\n font-size: 12px;\r\n}\r\nhtml[data-pixel-ui] [class*='tab'][class*='active'],\r\nhtml[data-pixel-ui] [aria-selected='true'] {\r\n box-shadow: inset 0 -3px 0 var(--px-gold) !important;\r\n}\r\n\r\n/* 徽章/小标签:切角 + 内凹高光(小元素才有资格切角,避免大块裁阴影) */\r\nhtml[data-pixel-ui] [class*='badge'],\r\nhtml[data-pixel-ui] [class*='chip'],\r\nhtml[data-pixel-ui] [class*='Tag'],\r\nhtml[data-pixel-ui] [class*='pill'] {\r\n font-size: 11px;\r\n line-height: 1.5;\r\n border: 1px solid #000 !important;\r\n box-shadow: inset 1px 1px 0 rgba(255, 255, 255, 0.3) !important;\r\n clip-path: polygon(\r\n 0 2px, 2px 2px, 2px 0,\r\n calc(100% - 2px) 0, calc(100% - 2px) 2px, 100% 2px,\r\n 100% calc(100% - 2px), calc(100% - 2px) calc(100% - 2px), calc(100% - 2px) 100%,\r\n 2px 100%, 2px calc(100% - 2px), 0 calc(100% - 2px)\r\n );\r\n}\r\n\r\n/* ── 正文/消息/代码:mono 内容层(Xi log 区用 Fira Code 的忠实移植) ── */\r\nhtml[data-pixel-ui] [class*='message'],\r\nhtml[data-pixel-ui] [class*='bubble'],\r\nhtml[data-pixel-ui] [class*='markdown'],\r\nhtml[data-pixel-ui] [class*='content'],\r\nhtml[data-pixel-ui] pre,\r\nhtml[data-pixel-ui] code,\r\nhtml[data-pixel-ui] [class*='code'] {\r\n font-family: var(--px-mono) !important;\r\n letter-spacing: 0;\r\n text-shadow: none;\r\n}\r\n\r\n/* 消息行:左侧木色竖条(Xi .log-row 色带,统一木色) */\r\nhtml[data-pixel-ui] [class*='message'],\r\nhtml[data-pixel-ui] [class*='bubble'] {\r\n border-left: 3px solid var(--px-wood-warm) !important;\r\n}\r\n\r\n/* 代码块:黑底木边(Xi .log-code-wrap) */\r\nhtml[data-pixel-ui] pre,\r\nhtml[data-pixel-ui] [class*='code'] {\r\n background: var(--px-wood-darkest) !important;\r\n color: var(--px-text-on-dark) !important;\r\n border: 2px solid var(--px-wood-light) !important;\r\n box-shadow: inset 2px 2px 0 rgba(0, 0, 0, 0.4) !important;\r\n}\r\n/* 行内代码:暗底金字 */\r\nhtml[data-pixel-ui] code {\r\n background: rgba(0, 0, 0, 0.4) !important;\r\n color: var(--px-gold-bright) !important;\r\n border: 1px solid rgba(0, 0, 0, 0.12) !important;\r\n padding: 0 4px;\r\n}\r\nhtml[data-pixel-ui] pre code {\r\n background: transparent !important;\r\n color: inherit !important;\r\n border: none !important;\r\n padding: 0;\r\n}\r\n\r\n/* ── 按钮:8-bit 凸起 + 阶梯硬阴影 + 悬停抬升 + 按压沉底 ── */\r\nhtml[data-pixel-ui] button,\r\nhtml[data-pixel-ui] [role='button'],\r\nhtml[data-pixel-ui] [class*='btn'],\r\nhtml[data-pixel-ui] [class*='Button'] {\r\n font-family: var(--px-font) !important;\r\n font-size: 12px;\r\n letter-spacing: 0.02em;\r\n border: 2px solid #000 !important;\r\n box-shadow:\r\n inset 2px 2px 0 rgba(255, 248, 231, 0.22),\r\n inset -2px -2px 0 rgba(0, 0, 0, 0.5),\r\n 2px 2px 0 #000,\r\n 3px 3px 0 rgba(0, 0, 0, 0.6) !important;\r\n text-shadow: var(--px-ts-btn);\r\n transition: transform 0.08s steps(2), box-shadow 0.08s steps(2), filter 0.08s steps(2);\r\n}\r\nhtml[data-pixel-ui] button:hover,\r\nhtml[data-pixel-ui] [role='button']:hover,\r\nhtml[data-pixel-ui] [class*='btn']:hover,\r\nhtml[data-pixel-ui] [class*='Button']:hover {\r\n filter: brightness(1.1);\r\n transform: translate(-2px, -2px);\r\n box-shadow:\r\n inset 2px 2px 0 rgba(255, 248, 231, 0.25),\r\n inset -2px -2px 0 rgba(0, 0, 0, 0.4),\r\n 4px 4px 0 #000,\r\n 5px 5px 0 rgba(0, 0, 0, 0.6) !important;\r\n}\r\nhtml[data-pixel-ui] button:active,\r\nhtml[data-pixel-ui] [role='button']:active,\r\nhtml[data-pixel-ui] [class*='btn']:active,\r\nhtml[data-pixel-ui] [class*='Button']:active {\r\n transform: translate(2px, 2px);\r\n box-shadow:\r\n inset 2px 2px 0 rgba(0, 0, 0, 0.5),\r\n inset -2px -2px 0 rgba(255, 248, 231, 0.1) !important;\r\n}\r\n\r\n/* 主按钮(品牌色)金边 */\r\nhtml[data-pixel-ui] button[class*='primary'],\r\nhtml[data-pixel-ui] [class*='btn-primary'] {\r\n border-color: var(--px-gold-deep) !important;\r\n box-shadow:\r\n inset 2px 2px 0 rgba(255, 224, 102, 0.5),\r\n inset -2px -2px 0 rgba(0, 0, 0, 0.5),\r\n 2px 2px 0 #000,\r\n 3px 3px 0 rgba(0, 0, 0, 0.6) !important;\r\n}\r\n\r\n/* ── 输入框:黑木底 + 羊皮纸文字 + 金色光标(修复文字不可见) ──\r\n * 关键:必须显式给文字颜色。Xi #command-input:cream 字 / wood-darkest 底 /\r\n * gold-deep 边 / 3px 内凹,聚焦金边光环。 */\r\nhtml[data-pixel-ui] input,\r\nhtml[data-pixel-ui] textarea,\r\nhtml[data-pixel-ui] select,\r\nhtml[data-pixel-ui] [contenteditable='true'] {\r\n font-family: var(--px-font) !important;\r\n font-size: 12px;\r\n letter-spacing: 0;\r\n color: var(--px-input-text) !important;\r\n -webkit-text-fill-color: var(--px-input-text) !important;\r\n caret-color: var(--px-input-caret) !important;\r\n background-color: var(--px-input-bg) !important;\r\n border: 2px solid var(--px-gold-deep) !important;\r\n box-shadow:\r\n inset 3px 3px 0 rgba(0, 0, 0, 0.6),\r\n inset -1px -1px 0 rgba(244, 208, 63, 0.1),\r\n 0 0 0 1px #000 !important;\r\n}\r\nhtml[data-pixel-ui] input:focus,\r\nhtml[data-pixel-ui] textarea:focus,\r\nhtml[data-pixel-ui] select:focus,\r\nhtml[data-pixel-ui] [contenteditable='true']:focus {\r\n border-color: var(--px-gold) !important;\r\n box-shadow:\r\n inset 3px 3px 0 rgba(0, 0, 0, 0.6),\r\n 0 0 0 2px var(--px-gold),\r\n 0 0 8px rgba(244, 208, 63, 0.4) !important;\r\n}\r\nhtml[data-pixel-ui] input::placeholder,\r\nhtml[data-pixel-ui] textarea::placeholder {\r\n color: var(--px-input-ph) !important;\r\n -webkit-text-fill-color: var(--px-input-ph) !important;\r\n opacity: 1;\r\n}\r\n/* 输入框容器只做边框质感,不压背景(避免把容器文字也染黑) */\r\nhtml[data-pixel-ui] [class*='input'] {\r\n border-color: var(--px-gold-deep) !important;\r\n}\r\n\r\n/* ── 面板/卡片/弹层:双框 + 阶梯硬阴影 + 木纹竖条 ────────── */\r\nhtml[data-pixel-ui] [class*='panel'],\r\nhtml[data-pixel-ui] [class*='card'],\r\nhtml[data-pixel-ui] [class*='Card'],\r\nhtml[data-pixel-ui] dialog,\r\nhtml[data-pixel-ui] [role='dialog'],\r\nhtml[data-pixel-ui] [class*='modal'],\r\nhtml[data-pixel-ui] [class*='popover'],\r\nhtml[data-pixel-ui] [class*='menu'],\r\nhtml[data-pixel-ui] [class*='dropdown'],\r\nhtml[data-pixel-ui] [class*='popup'] {\r\n border: 2px solid var(--px-wood-warm) !important;\r\n outline: 2px solid #000;\r\n outline-offset: -2px;\r\n box-shadow:\r\n inset 1px 1px 0 rgba(255, 255, 255, 0.08),\r\n inset -1px -1px 0 rgba(0, 0, 0, 0.4),\r\n 2px 2px 0 #000,\r\n 3px 3px 0 rgba(0, 0, 0, 0.6) !important;\r\n /* Xi 木纹:每 10px 一条 1px 暗竖纹 */\r\n background-image:\r\n repeating-linear-gradient(\r\n 90deg,\r\n transparent 0px,\r\n transparent 10px,\r\n rgba(0, 0, 0, 0.06) 10px,\r\n rgba(0, 0, 0, 0.06) 11px\r\n ) !important;\r\n}\r\n\r\n/* 卡片悬停:抬升 + 阴影加厚(Xi hover 位移) */\r\nhtml[data-pixel-ui] [class*='card']:hover,\r\nhtml[data-pixel-ui] [class*='Card']:hover {\r\n transform: translate(-2px, -2px);\r\n box-shadow:\r\n inset 1px 1px 0 rgba(255, 255, 255, 0.1),\r\n inset -1px -1px 0 rgba(0, 0, 0, 0.4),\r\n 4px 4px 0 #000,\r\n 5px 5px 0 rgba(0, 0, 0, 0.6) !important;\r\n}\r\n\r\n/* ── 顶栏/侧栏:木纹渐变 + 黑底边 + 金色发丝 ─────────────── */\r\nhtml[data-pixel-ui] [class*='header'],\r\nhtml[data-pixel-ui] [class*='topbar'],\r\nhtml[data-pixel-ui] [class*='titlebar'],\r\nhtml[data-pixel-ui] [class*='sidebar'],\r\nhtml[data-pixel-ui] [class*='Sidebar'] {\r\n background-image: linear-gradient(180deg, var(--px-wood-warm) 0%, var(--px-wood-dark) 100%) !important;\r\n border-bottom: 3px solid #000 !important;\r\n box-shadow:\r\n inset 0 2px 0 rgba(244, 208, 63, 0.1),\r\n inset 0 -2px 0 rgba(0, 0, 0, 0.5) !important;\r\n}\r\nhtml[data-pixel-ui] [class*='sidebar'],\r\nhtml[data-pixel-ui] [class*='Sidebar'] {\r\n border-right: 3px solid #000 !important;\r\n box-shadow:\r\n inset -3px 0 0 rgba(0, 0, 0, 0.4),\r\n inset 2px 0 0 rgba(255, 255, 255, 0.05) !important;\r\n}\r\n\r\n/* ── 链接:金色下划线 ──────────────────────────────────── */\r\nhtml[data-pixel-ui] a {\r\n color: var(--px-gold-bright) !important;\r\n text-decoration-thickness: 2px;\r\n text-underline-offset: 3px;\r\n}\r\n\r\n/* ── 进度条:刻度纹理 + 硬框(Xi .quest-progress) ──────── */\r\nhtml[data-pixel-ui] [class*='progress'] {\r\n border: 2px solid #000 !important;\r\n box-shadow: inset 2px 2px 0 rgba(0, 0, 0, 0.6) !important;\r\n background-image: repeating-linear-gradient(\r\n 90deg,\r\n transparent 0px,\r\n transparent 4px,\r\n rgba(0, 0, 0, 0.35) 4px,\r\n rgba(0, 0, 0, 0.35) 5px\r\n ) !important;\r\n}\r\n\r\n/* ── 像素光标(SVG data-URI 阶梯箭头,Xi 同款造型) ─────── */\r\nhtml[data-pixel-ui] body {\r\n cursor: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' shape-rendering='crispEdges'%3E%3Cpath d='M2 2v17h3v-3h3v-3h3v-3h3v-3h3V2z' fill='%23FFFDF5' stroke='%231A0F06' stroke-width='2'/%3E%3C/svg%3E\") 2 2, auto;\r\n}\r\nhtml[data-pixel-ui] button,\r\nhtml[data-pixel-ui] [role='button'],\r\nhtml[data-pixel-ui] a,\r\nhtml[data-pixel-ui] [class*='card'],\r\nhtml[data-pixel-ui] [class*='tab'],\r\nhtml[data-pixel-ui] [class*='menu'],\r\nhtml[data-pixel-ui] [class*='dropdown'],\r\nhtml[data-pixel-ui] select,\r\nhtml[data-pixel-ui] label[for] {\r\n cursor: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' shape-rendering='crispEdges'%3E%3Cpath d='M2 2v17h3v-3h3v-3h3v-3h3v-3h3V2z' fill='%23F4D03F' stroke='%231A0F06' stroke-width='2'/%3E%3C/svg%3E\") 2 2, pointer;\r\n}\r\nhtml[data-pixel-ui] input,\r\nhtml[data-pixel-ui] textarea,\r\nhtml[data-pixel-ui] [contenteditable='true'] {\r\n cursor: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' shape-rendering='crispEdges'%3E%3Cpath d='M5 3h4v2h2v2h2v2h2v2h2v2h2v6h-2v2h-4v2H5z' fill='%23FFFDF5' stroke='%231A0F06' stroke-width='2'/%3E%3C/svg%3E\") 4 3, text;\r\n}\r\n\r\n/* ── CRT 覆盖层:扫描线 + 暗角 + 微闪烁(Xi v3 滤镜) ────\r\n * 盖在最顶层但不拦截任何事件;尊重系统“减少动态效果”偏好。 */\r\nhtml[data-pixel-ui] body::after {\r\n content: \"\";\r\n position: fixed;\r\n inset: 0;\r\n z-index: 2147483647;\r\n pointer-events: none;\r\n background:\r\n repeating-linear-gradient(\r\n 0deg,\r\n rgba(0, 0, 0, 0.1) 0px,\r\n rgba(0, 0, 0, 0.1) 1px,\r\n transparent 1px,\r\n transparent 3px\r\n ),\r\n radial-gradient(ellipse at center, transparent 62%, rgba(0, 0, 0, 0.22) 100%);\r\n animation: px-crt-flicker 4s steps(60) infinite;\r\n}\r\n@keyframes px-crt-flicker {\r\n 0%, 100% { opacity: 1; }\r\n 50% { opacity: 0.96; }\r\n}\r\n@media (prefers-reduced-motion: reduce) {\r\n html[data-pixel-ui] body::after { animation: none; }\r\n html[data-pixel-ui] button,\r\n html[data-pixel-ui] [class*='btn'],\r\n html[data-pixel-ui] [class*='Button'],\r\n html[data-pixel-ui] [class*='card'] {\r\n transition: none;\r\n }\r\n}\r\n\r\n/* ── 设置页「像素主题」行(不跟随皮肤作用域:现代模式下也保持可点) ── */\r\n.px-theme-row {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n padding: 12px 0;\r\n border-top: 1px solid rgba(139, 107, 69, 0.35);\r\n}\r\n.px-theme-row-title {\r\n font-family: 'Fusion Pixel 12', 'Press Start 2P', monospace;\r\n font-size: 12px;\r\n color: #F4D03F;\r\n text-shadow: var(--px-ts-chrome, 2px 2px 0 rgba(26, 15, 6, 0.6));\r\n letter-spacing: 0.05em;\r\n}\r\n.px-theme-row-cubes {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 8px;\r\n}\r\n.px-theme-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 5px 10px;\r\n font-family: 'Fusion Pixel 12', 'Press Start 2P', monospace;\r\n font-size: 11px;\r\n color: #E8D5B0;\r\n background: #2C1A0C;\r\n border: 2px solid #1A0F06;\r\n border-radius: 0 !important;\r\n cursor: pointer;\r\n box-shadow:\r\n inset 1px 1px 0 rgba(255, 248, 231, 0.15),\r\n inset -1px -1px 0 rgba(0, 0, 0, 0.4),\r\n 2px 2px 0 rgba(0, 0, 0, 0.5);\r\n}\r\n.px-theme-btn:hover {\r\n filter: brightness(1.12);\r\n transform: translate(-1px, -1px);\r\n}\r\n.px-theme-btn:active {\r\n transform: translate(1px, 1px);\r\n box-shadow: inset 2px 2px 0 rgba(0, 0, 0, 0.4);\r\n}\r\n.px-theme-btn-active {\r\n color: #1A0F06;\r\n background: #F4D03F;\r\n border-color: #8B6B00;\r\n box-shadow:\r\n inset 1px 1px 0 #FFE066,\r\n inset -1px -1px 0 #8B6B00,\r\n 2px 2px 0 rgba(0, 0, 0, 0.5);\r\n}\r\n.px-theme-swatch {\r\n width: 10px;\r\n height: 10px;\r\n border: 1px solid #000;\r\n box-shadow: inset 1px 1px 0 rgba(255, 255, 255, 0.4);\r\n}\r\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA,mBAAmC;AACnC,oBAA4B;;;ACnB5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ADuBO,IAAM,OAAO;AAGb,IAAM,SAAS,CAAC,SAAS,OAAO;AAGvC,IAAM,oBAAoB;AAG1B,IAAM,SAAS;AAAA,EACb;AAAA,IACE,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,uBAAuB;AAAA,MACvB,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,yBAAyB;AAAA,MACzB,yBAAyB;AAAA,MACzB,6BAA6B;AAAA,MAC7B,6BAA6B;AAAA,MAC7B,+BAA+B;AAAA,MAC/B,mCAAmC;AAAA,MACnC,qCAAqC;AAAA,MACrC,kCAAkC;AAAA,MAClC,+BAA+B;AAAA,IACjC;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,uBAAuB;AAAA,MACvB,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,yBAAyB;AAAA,MACzB,yBAAyB;AAAA,MACzB,6BAA6B;AAAA,MAC7B,6BAA6B;AAAA,MAC7B,+BAA+B;AAAA,MAC/B,mCAAmC;AAAA,MACnC,qCAAqC;AAAA,MACrC,kCAAkC;AAAA,MAClC,+BAA+B;AAAA,IACjC;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,uBAAuB;AAAA,MACvB,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,yBAAyB;AAAA,MACzB,yBAAyB;AAAA,MACzB,6BAA6B;AAAA,MAC7B,6BAA6B;AAAA,MAC7B,+BAA+B;AAAA,MAC/B,mCAAmC;AAAA,MACnC,qCAAqC;AAAA,MACrC,kCAAkC;AAAA,MAClC,+BAA+B;AAAA,IACjC;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,uBAAuB;AAAA,MACvB,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,yBAAyB;AAAA,MACzB,yBAAyB;AAAA,MACzB,6BAA6B;AAAA,MAC7B,6BAA6B;AAAA,MAC7B,+BAA+B;AAAA,MAC/B,mCAAmC;AAAA,MACnC,qCAAqC;AAAA,MACrC,kCAAkC;AAAA,MAClC,+BAA+B;AAAA,IACjC;AAAA,EACF;AACF;AAEA,IAAM,YAAY,OAAO,IAAI,CAAC,UAAU,MAAM,EAAE;AAGhD,IAAM,iBAAiB,oBAAI,IAAI,CAAC,SAAS,QAAQ,UAAU,GAAG,SAAS,CAAC;AAGxE,IAAM,gBAAgB;AAAA,EACpB,EAAE,IAAI,cAAc,OAAO,SAAS,QAAQ,UAAU;AAAA,EACtD,EAAE,IAAI,eAAe,OAAO,UAAU,QAAQ,UAAU;AAAA,EACxD,EAAE,IAAI,cAAc,OAAO,SAAS,QAAQ,UAAU;AAAA,EACtD,EAAE,IAAI,eAAe,OAAO,UAAU,QAAQ,UAAU;AAAA,EACxD,EAAE,IAAI,UAAU,OAAO,QAAQ,QAAQ,UAAU;AACnD;AAQA,SAAS,sBAAsB;AAC7B,aAAO,2BAAY;AAAA,IACjB,MAAM,OAAO,EAAE,YAAY,MAAM,UAAU,GAAG;AAAA,IAC9C,SAAS;AAAA,MACP,MAAM,CAAC,OAAO,YAAY,aAAa;AACrC,YAAI,YAAY,MAAM,SAAU;AAChC,cAAM,aAAa;AACnB,cAAM,WAAW;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAC;AACH;AASA,SAAS,SAAS,OAAO;AACvB,QAAM,aAAa,MAAM,SAAS,CAAC,UAAU,MAAM,UAAU;AAC7D,aAAO,aAAAA;AAAA,IAAE;AAAA,IAAO,EAAE,WAAW,eAAe;AAAA,QAC1C,aAAAA,eAAE,OAAO,EAAE,WAAW,qBAAqB,GAAG,MAAM;AAAA,QACpD,aAAAA;AAAA,MAAE;AAAA,MAAO,EAAE,WAAW,qBAAqB;AAAA,MACzC,cAAc,IAAI,CAAC,eAAW,aAAAA;AAAA,QAAE;AAAA,QAAU;AAAA,UACxC,KAAK,OAAO;AAAA,UACZ,MAAM;AAAA,UACN,WAAW,kBAAkB,eAAe,OAAO,KAAK,yBAAyB;AAAA,UACjF,SAAS,MAAM;AAAE,kBAAM,SAAS,OAAO,EAAE;AAAA,UAAE;AAAA,QAC7C;AAAA,YACE,aAAAA,eAAE,QAAQ,EAAE,WAAW,mBAAmB,OAAO,EAAE,YAAY,OAAO,OAAO,EAAE,CAAC;AAAA,QAChF,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAGO,SAAS,MAAM,KAAK;AAGzB,QAAM,YAAY,MAAM;AACtB,UAAM,SAAS,IAAI,MAAM,SAAS,EAAE;AACpC,UAAM,KAAK,UAAU,SAAS,OAAO,EAAE;AACvC,aAAS,gBAAgB,gBAAgB,iBAAiB,EAAE;AAC5D,QAAI,GAAI,UAAS,gBAAgB,aAAa,oBAAoB,OAAO,EAAE;AAAA,QACtE,UAAS,gBAAgB,gBAAgB,kBAAkB;AAAA,EAClE;AAIA,QAAM,UAAU,CAAC,aAAa;AAC5B,QAAI;AACF,mBAAa,QAAQ,mBAAmB,SAAS,UAAU;AAAA,IAC7D,QAAQ;AAAA,IAER;AAAA,EACF;AACA,MAAI,GAAG,gBAAgB,CAAC,aAAa;AAAE,cAAU;AAAG,YAAQ,QAAQ;AAAA,EAAE,CAAC;AAEvE,MAAI,OAAO,MAAM;AACf,UAAM,YAAY,OAAO,IAAI,CAAC,eAAe,IAAI,MAAM,SAAS,UAAU,CAAC;AAC3E,WAAO,MAAM;AAAE,iBAAW,WAAW,UAAW,SAAQ;AAAA,IAAE;AAAA,EAC5D,GAAG,kCAAkC;AAGrC,MAAI,QAAQ;AACZ,MAAI;AAAE,YAAQ,aAAa,QAAQ,iBAAiB;AAAA,EAAE,QAAQ;AAAA,EAA4B;AAC1F,QAAM,SAAS,UAAU,QAAQ,eAAe,IAAI,KAAK,IAAI,QAAQ;AACrE,MAAI;AAAE,QAAI,MAAM,SAAS,MAAM;AAAA,EAAE,QAAQ;AAAA,EAAuD;AAChG,YAAU;AAGV,QAAM,WAAW,oBAAoB;AACrC,MAAI,QAAQ;AACZ,QAAM,UAAU,CAAC,aAAa;AAAE,WAAO,KAAK,SAAS,YAAY,SAAS,QAAQ;AAAA,EAAE;AACpF,MAAI,GAAG,gBAAgB,OAAO;AAC9B,MAAI,MAAM,OAAO,yBAAyB,MAAM,IAAI,MAAM,SAAS;AAAA,IACjE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ,CAAC,YAAY;AACnB,cAAQ;AAGR,cAAQ,IAAI,MAAM,SAAS,CAAC;AAC5B,aAAO,EAAE,UAAU,CAAC,OAAO;AAAE,YAAI,MAAM,SAAS,EAAE;AAAA,MAAE,EAAE;AAAA,IACxD;AAAA,EACF,GAAG,QAAQ,CAAC;AAEZ,MAAI,OAAO,MAAM;AACf,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,QAAQ,SAAS;AACvB,UAAM,cAAc;AACpB,aAAS,KAAK,YAAY,KAAK;AAC/B,WAAO,MAAM;AACX,YAAM,OAAO;AACb,eAAS,gBAAgB,gBAAgB,eAAe;AACxD,eAAS,gBAAgB,gBAAgB,kBAAkB;AAAA,IAC7D;AAAA,EACF,GAAG,0BAA0B;AAC/B;",
6
- "names": ["h"]
4
+ "sourcesContent": ["/**\r\n * dsh-pixel-ui — browser half (the pixel skin).\r\n *\r\n * Registers seven pixel themes on the ThemeService seam\r\n * (`ctx.theme.register` with --dsw-alias-* token overrides): wood (dark),\r\n * paper (light), warm (dark), retro-green (dark), hologram / pumpkin /\r\n * papernote (real 9-slice sprites, all dark except papernote). The stylesheet\r\n * carries the pixel borders, fonts, cursors, and the asset-theme 9-slice\r\n * layer that alias tokens alone cannot express, scoped to `html[data-pixel-ui]`\r\n * with a `data-pixel-theme` variant attribute, plus `data-pixel-asset` while\r\n * one of the sprite themes is active.\r\n *\r\n * Theme-choice memory is two-layered on purpose:\r\n * 1. the browser `localStorage` mirror (instant, per-origin);\r\n * 2. the host-side durable preference (`/dsh-pixel-ui/preference`,\r\n * stored under $DSH_HOME) which survives DSH Desktop's per-launch\r\n * random local port — the origin (port included) changes on every\r\n * restart, so the mirror alone forgets the choice.\r\n * The host file is authoritative whenever the mirror is absent (new port);\r\n * explicit user picks are written to both layers at once.\r\n *\r\n * The host settings scope persists only the built-in preferences\r\n * (light/dark/system), so switching model / reasoning-effort re-applies that\r\n * built-in and would visibly drop the skin. We keep the user's intended\r\n * theme and re-assert a pixel theme whenever a built-in arrives without an\r\n * explicit choice in the settings row below (restore must be a user action,\r\n * not an app-forced re-init).\r\n *\r\n * @module dsh-pixel-ui/client\r\n */\r\nimport { createElement as h } from 'react'\r\nimport { defineStore } from '@deepseek-ai/dsh-client-store'\r\nimport cssText from './pixel.css'\r\n\r\n/** Plugin name; also the patch row id. */\r\nexport const name = 'dsh-pixel-ui'\r\n\r\n/** Required services: the theme runtime, the settings item slot, the locale. */\r\nexport const inject = ['slots', 'theme', 'locale']\r\n\r\n/** localStorage key carrying the per-origin theme mirror. */\r\nconst THEME_STORAGE_KEY = 'dsh-pixel-ui:theme'\r\n\r\n/** Host-backed durable preference route (registered by the node half). */\r\nconst PREFERENCE_URL = '/dsh-pixel-ui/preference'\r\n\r\n/**\r\n * Page-bootstrap global written by the node half's index injection. DSH\r\n * Desktop renders from `dsh-app://app/`, where the relative fetch above can\r\n * never reach the loopback route, so the injection is the transport that\r\n * exists on both deployments.\r\n */\r\nconst BOOTSTRAP_GLOBAL = '__DSH_PIXEL_UI__'\r\n\r\n/** Default skin for a first run (no mirror, no durable preference). */\r\nconst DEFAULT_SKIN = 'pixel-wood'\r\n\r\n/**\r\n * The seven pixel themes (Agent Xi palettes + three sprite palettes).\r\n *\r\n * Every theme declares the same 23 tokens: the 17 --dsw-alias-* palette\r\n * tokens used by the flat skin, plus six --dsw-specific-* surfaces that the\r\n * Host paints itself (user bubble, composer input, menu surface, selection\r\n * button, tip). Theming those through tokens keeps host-native surfaces in\r\n * palette without a single class-name selector.\r\n */\r\nconst THEMES = [\r\n {\r\n id: 'pixel-wood',\r\n colorScheme: 'dark',\r\n tokens: {\r\n '--dsw-alias-bg-base': '#1A0F06',\r\n '--dsw-alias-bg-layer-1': '#2C1A0C',\r\n '--dsw-alias-bg-layer-2': '#3A2515',\r\n '--dsw-alias-bg-overlay': '#241408',\r\n '--dsw-alias-border-l1': '#4A3020',\r\n '--dsw-alias-border-l2': '#8B6B45',\r\n '--dsw-alias-brand-primary': '#F4D03F',\r\n '--dsw-alias-label-primary': '#F5E6C8',\r\n '--dsw-alias-label-secondary': '#AC8A63',\r\n '--dsw-alias-state-error-primary': '#E74C3C',\r\n '--dsw-alias-state-success-primary': '#7DCE82',\r\n '--dsw-alias-state-warn-primary': '#F39C12',\r\n '--dsw-alias-state-idle-primary': '#7A5C3E',\r\n '--dsw-specific-sidebar-fill': '#241408',\r\n '--dsw-alias-button-primary-fill': '#F4D03F',\r\n '--dsw-alias-button-primary-hover': '#FFE066',\r\n '--dsw-alias-label-primary-foreground': '#1A0F06',\r\n '--dsw-specific-bubble': '#3A2515',\r\n '--dsw-specific-bubble-highlight': '#4A3020',\r\n '--dsw-specific-menu': '#241408',\r\n '--dsw-specific-input-major': '#1A0F06',\r\n '--dsw-specific-selector': '#4A3020',\r\n '--dsw-specific-tip': '#3A2515',\r\n },\r\n },\r\n {\r\n id: 'pixel-paper',\r\n colorScheme: 'light',\r\n tokens: {\r\n '--dsw-alias-bg-base': '#F0E8D8',\r\n '--dsw-alias-bg-layer-1': '#E8DCC8',\r\n '--dsw-alias-bg-layer-2': '#DDD0B8',\r\n '--dsw-alias-bg-overlay': '#E2D6BE',\r\n '--dsw-alias-border-l1': '#D4C4A8',\r\n '--dsw-alias-border-l2': '#7A6A4A',\r\n '--dsw-alias-brand-primary': '#8A6400',\r\n '--dsw-alias-label-primary': '#3A2A10',\r\n '--dsw-alias-label-secondary': '#6B5020',\r\n '--dsw-alias-state-error-primary': '#8B2020',\r\n '--dsw-alias-state-success-primary': '#3A7A40',\r\n '--dsw-alias-state-warn-primary': '#805000',\r\n '--dsw-alias-state-idle-primary': '#847458',\r\n '--dsw-specific-sidebar-fill': '#E8DCC8',\r\n '--dsw-alias-button-primary-fill': '#7A5A00',\r\n '--dsw-alias-button-primary-hover': '#5C4400',\r\n '--dsw-alias-label-primary-foreground': '#FFFDF5',\r\n '--dsw-specific-bubble': '#E3D4B8',\r\n '--dsw-specific-bubble-highlight': '#D8C7A6',\r\n '--dsw-specific-menu': '#FFFDF5',\r\n '--dsw-specific-input-major': '#FFFDF5',\r\n '--dsw-specific-selector': '#D4C4A8',\r\n '--dsw-specific-tip': '#D4C4A8',\r\n },\r\n },\r\n {\r\n id: 'pixel-warm',\r\n colorScheme: 'dark',\r\n tokens: {\r\n '--dsw-alias-bg-base': '#1E0E04',\r\n '--dsw-alias-bg-layer-1': '#34180A',\r\n '--dsw-alias-bg-layer-2': '#4A2210',\r\n '--dsw-alias-bg-overlay': '#2A1308',\r\n '--dsw-alias-border-l1': '#5C2E16',\r\n '--dsw-alias-border-l2': '#A86B40',\r\n '--dsw-alias-brand-primary': '#FF8C42',\r\n '--dsw-alias-label-primary': '#F0C8A0',\r\n '--dsw-alias-label-secondary': '#C08A5C',\r\n '--dsw-alias-state-error-primary': '#D93B3B',\r\n '--dsw-alias-state-success-primary': '#6DBF6D',\r\n '--dsw-alias-state-warn-primary': '#FF8C42',\r\n '--dsw-alias-state-idle-primary': '#8A5A38',\r\n '--dsw-specific-sidebar-fill': '#2A1308',\r\n '--dsw-alias-button-primary-fill': '#FF8C42',\r\n '--dsw-alias-button-primary-hover': '#FFA64D',\r\n '--dsw-alias-label-primary-foreground': '#1E0E04',\r\n '--dsw-specific-bubble': '#4A2210',\r\n '--dsw-specific-bubble-highlight': '#5C2E16',\r\n '--dsw-specific-menu': '#2A1308',\r\n '--dsw-specific-input-major': '#1E0E04',\r\n '--dsw-specific-selector': '#5C2E16',\r\n '--dsw-specific-tip': '#4A2210',\r\n },\r\n },\r\n {\r\n id: 'pixel-retro',\r\n colorScheme: 'dark',\r\n tokens: {\r\n '--dsw-alias-bg-base': '#0A0E0A',\r\n '--dsw-alias-bg-layer-1': '#0E140E',\r\n '--dsw-alias-bg-layer-2': '#121A12',\r\n '--dsw-alias-bg-overlay': '#0C100C',\r\n '--dsw-alias-border-l1': '#2A402A',\r\n '--dsw-alias-border-l2': '#4A7A4A',\r\n '--dsw-alias-brand-primary': '#33FF33',\r\n '--dsw-alias-label-primary': '#33FF33',\r\n '--dsw-alias-label-secondary': '#22AA22',\r\n '--dsw-alias-state-error-primary': '#FF3333',\r\n '--dsw-alias-state-success-primary': '#33FF33',\r\n '--dsw-alias-state-warn-primary': '#FFCC33',\r\n '--dsw-alias-state-idle-primary': '#359035',\r\n '--dsw-specific-sidebar-fill': '#0C100C',\r\n '--dsw-alias-button-primary-fill': '#33FF33',\r\n '--dsw-alias-button-primary-hover': '#66FF66',\r\n '--dsw-alias-label-primary-foreground': '#0A0E0A',\r\n '--dsw-specific-bubble': '#101A10',\r\n '--dsw-specific-bubble-highlight': '#162016',\r\n '--dsw-specific-menu': '#0C100C',\r\n '--dsw-specific-input-major': '#0A0E0A',\r\n '--dsw-specific-selector': '#2A402A',\r\n '--dsw-specific-tip': '#162016',\r\n },\r\n },\r\n {\r\n id: 'pixel-hologram',\r\n colorScheme: 'dark',\r\n tokens: {\r\n '--dsw-alias-bg-base': '#071426',\r\n '--dsw-alias-bg-layer-1': '#10233B',\r\n '--dsw-alias-bg-layer-2': '#1A2E4A',\r\n '--dsw-alias-bg-overlay': '#0A1A2E',\r\n '--dsw-alias-border-l1': '#244A6A',\r\n '--dsw-alias-border-l2': '#3E8FB0',\r\n '--dsw-alias-brand-primary': '#14DCEE',\r\n '--dsw-alias-label-primary': '#E8F7FF',\r\n '--dsw-alias-label-secondary': '#9BC4D4',\r\n '--dsw-alias-state-error-primary': '#FF6B7A',\r\n '--dsw-alias-state-success-primary': '#6FE3C1',\r\n '--dsw-alias-state-warn-primary': '#FFD166',\r\n '--dsw-alias-state-idle-primary': '#52748C',\r\n '--dsw-specific-sidebar-fill': '#081624',\r\n '--dsw-alias-button-primary-fill': '#2C416D',\r\n '--dsw-alias-button-primary-hover': '#385586',\r\n '--dsw-alias-label-primary-foreground': '#E8F7FF',\r\n '--dsw-specific-bubble': '#12314F',\r\n '--dsw-specific-bubble-highlight': '#1A3E60',\r\n '--dsw-specific-menu': '#0A1A2E',\r\n '--dsw-specific-input-major': '#10233B',\r\n '--dsw-specific-selector': '#244A6A',\r\n '--dsw-specific-tip': '#0A1A2E',\r\n },\r\n },\r\n {\r\n id: 'pixel-pumpkin',\r\n colorScheme: 'dark',\r\n tokens: {\r\n '--dsw-alias-bg-base': '#170D06',\r\n '--dsw-alias-bg-layer-1': '#241409',\r\n '--dsw-alias-bg-layer-2': '#2F1B0C',\r\n '--dsw-alias-bg-overlay': '#1C0F07',\r\n '--dsw-alias-border-l1': '#4A2A12',\r\n '--dsw-alias-border-l2': '#C4741F',\r\n '--dsw-alias-brand-primary': '#FF9E2C',\r\n '--dsw-alias-label-primary': '#FFE9C9',\r\n '--dsw-alias-label-secondary': '#D8A76F',\r\n '--dsw-alias-state-error-primary': '#FF7A66',\r\n '--dsw-alias-state-success-primary': '#9BD57A',\r\n '--dsw-alias-state-warn-primary': '#FFC24B',\r\n '--dsw-alias-state-idle-primary': '#A06A3E',\r\n '--dsw-specific-sidebar-fill': '#1B0F07',\r\n '--dsw-alias-button-primary-fill': '#8A3E0C',\r\n '--dsw-alias-button-primary-hover': '#A64E10',\r\n '--dsw-alias-label-primary-foreground': '#FFF6E6',\r\n '--dsw-specific-bubble': '#5A2E10',\r\n '--dsw-specific-bubble-highlight': '#6E3A14',\r\n '--dsw-specific-menu': '#241409',\r\n '--dsw-specific-input-major': '#2A170A',\r\n '--dsw-specific-selector': '#4A2A12',\r\n '--dsw-specific-tip': '#3A2210',\r\n },\r\n },\r\n {\r\n id: 'pixel-papernote',\r\n colorScheme: 'light',\r\n tokens: {\r\n '--dsw-alias-bg-base': '#F2E6D2',\r\n '--dsw-alias-bg-layer-1': '#F6ECD9',\r\n '--dsw-alias-bg-layer-2': '#EEE1C9',\r\n '--dsw-alias-bg-overlay': '#FFFAF2',\r\n '--dsw-alias-border-l1': '#E2D1B4',\r\n '--dsw-alias-border-l2': '#8C5A2C',\r\n '--dsw-alias-brand-primary': '#9A5518',\r\n '--dsw-alias-label-primary': '#3A2412',\r\n '--dsw-alias-label-secondary': '#6E4E2E',\r\n '--dsw-alias-state-error-primary': '#A33225',\r\n '--dsw-alias-state-success-primary': '#3F7A3A',\r\n '--dsw-alias-state-warn-primary': '#8A5A00',\r\n '--dsw-alias-state-idle-primary': '#94795C',\r\n '--dsw-specific-sidebar-fill': '#F6ECD9',\r\n '--dsw-alias-button-primary-fill': '#A3551B',\r\n '--dsw-alias-button-primary-hover': '#8C4713',\r\n '--dsw-alias-label-primary-foreground': '#FFF9F1',\r\n '--dsw-specific-bubble': '#F3DCBC',\r\n '--dsw-specific-bubble-highlight': '#EBC9A0',\r\n '--dsw-specific-menu': '#FFFAF2',\r\n '--dsw-specific-input-major': '#FFF9F1',\r\n '--dsw-specific-selector': '#DCC7A4',\r\n '--dsw-specific-tip': '#E6D7BC',\r\n },\r\n },\r\n]\r\n\r\nconst PIXEL_IDS = THEMES.map((theme) => theme.id)\r\n\r\n/** Themes whose surfaces come from 9-slice sprites (not just flat colors). */\r\nconst ASSET_IDS = new Set(['pixel-hologram', 'pixel-pumpkin', 'pixel-papernote'])\r\n\r\n/** Built-in preference ids; together with the pixel ids they are restorable. */\r\nconst RESTORABLE_IDS = new Set(['light', 'dark', 'system', ...PIXEL_IDS])\r\n\r\n/** Settings-row copy (zh is the key-set source of truth; en mirrors it). */\r\nconst LOCALE_NS = 'settings.pixel-ui'\r\nconst MESSAGES = {\r\n zh: {\r\n 'row.title': '像素主题',\r\n 'row.desc': '选择后立即生效并跨重启记忆;「现代默认」回到宿主外观',\r\n 'theme.pixel-wood': '像素·木屋',\r\n 'theme.pixel-paper': '像素·羊皮纸',\r\n 'theme.pixel-warm': '像素·暖阳',\r\n 'theme.pixel-retro': '像素·终端绿',\r\n 'theme.pixel-hologram': '像素·全息',\r\n 'theme.pixel-pumpkin': '像素·南瓜灯',\r\n 'theme.pixel-papernote': '像素·便签本',\r\n 'theme.system': '现代默认',\r\n },\r\n en: {\r\n 'row.title': 'Pixel theme',\r\n 'row.desc': 'Applies instantly and persists across restarts; “Modern default” returns to the host appearance',\r\n 'theme.pixel-wood': 'Pixel · Wood',\r\n 'theme.pixel-paper': 'Pixel · Paper',\r\n 'theme.pixel-warm': 'Pixel · Warm',\r\n 'theme.pixel-retro': 'Pixel · Terminal Green',\r\n 'theme.pixel-hologram': 'Pixel · Hologram',\r\n 'theme.pixel-pumpkin': 'Pixel · Pumpkin',\r\n 'theme.pixel-papernote': 'Pixel · Papernote',\r\n 'theme.system': 'Modern default',\r\n },\r\n}\r\n\r\n/** Settings row choices: the seven skins plus the modern default escape. */\r\nconst THEME_CHOICES = [\r\n { id: 'pixel-wood', swatch: '#F4D03F' },\r\n { id: 'pixel-paper', swatch: '#FFFDF5' },\r\n { id: 'pixel-warm', swatch: '#FF8C42' },\r\n { id: 'pixel-retro', swatch: '#33FF33' },\r\n { id: 'pixel-hologram', swatch: '#14DCEE' },\r\n { id: 'pixel-pumpkin', swatch: '#FF9E2C' },\r\n { id: 'pixel-papernote', swatch: '#F3DCBC' },\r\n { id: 'system', swatch: '#7A7A7A' },\r\n]\r\n\r\n/** Fallback translator for environments where the slot props carry no `t`. */\r\nconst fallbackT = (key) => key\r\n\r\n/**\r\n * Declares the theme row slot store: a mirror of the theme service\r\n * preference, written only by the plugin's apply-world change listener\r\n * (same shape as the ui-theme Appearance row store).\r\n * @returns the store handle.\r\n */\r\nfunction createThemeRowStore() {\r\n return defineStore({\r\n init: () => ({ preference: null, revision: -1 }),\r\n actions: {\r\n sync: (draft, preference, revision) => {\r\n if (revision <= draft.revision) return\r\n draft.preference = preference\r\n draft.revision = revision\r\n },\r\n },\r\n })\r\n}\r\n\r\n/**\r\n * General-section row: switch between the seven pixel skins and back to the\r\n * modern default. Reads selection state through props.useStore, localized\r\n * copy through props.t, and writes through the injected setTheme callback.\r\n * Each button carries aria-pressed so the current pick is announced, and the\r\n * swatch is decorative (the visible label names the theme).\r\n * @param props - slot shares (useStore, t + injected face).\r\n * @returns the row element tree.\r\n */\r\nfunction ThemeRow(props) {\r\n const preference = props.useStore((state) => state.preference)\r\n const t = typeof props.t === 'function' ? props.t : fallbackT\r\n return h('div', { className: 'px-theme-row', role: 'group', 'aria-label': t('row.title') },\r\n h('div', { className: 'px-theme-row-title' }, t('row.title')),\r\n h('div', { className: 'px-theme-row-desc' }, t('row.desc')),\r\n h('div', { className: 'px-theme-row-cubes' },\r\n THEME_CHOICES.map((choice) => h('button', {\r\n key: choice.id,\r\n type: 'button',\r\n className: 'px-theme-btn' + (preference === choice.id ? ' px-theme-btn-active' : ''),\r\n 'aria-pressed': preference === choice.id,\r\n onClick: () => { props.setTheme(choice.id) },\r\n },\r\n h('span', { className: 'px-theme-swatch', 'aria-hidden': 'true', style: { background: choice.swatch } }),\r\n t(`theme.${choice.id}`),\r\n )),\r\n ),\r\n )\r\n}\r\n\r\n/**\r\n * Read the per-origin mirror; storage failures read as unset. Values outside\r\n * the restorable set (stale ids from an older install, corrupt data) read as\r\n * unset so a first run can still reach the default skin.\r\n * @returns the stored restorable id or null.\r\n */\r\nfunction readLocalTheme() {\r\n try {\r\n const value = localStorage.getItem(THEME_STORAGE_KEY)\r\n return RESTORABLE_IDS.has(value) ? value : null\r\n } catch { return null }\r\n}\r\n\r\n/**\r\n * Write the per-origin mirror; storage failures are non-fatal.\r\n * @param id - theme id to mirror.\r\n */\r\nfunction writeLocalTheme(id) {\r\n try { localStorage.setItem(THEME_STORAGE_KEY, id) } catch { /* best-effort */ }\r\n}\r\n\r\n/**\r\n * Read the host-side durable preference from the index-injection bootstrap\r\n * (desktop transport). Values outside the restorable set read as unset.\r\n * @returns the restorable id or null.\r\n */\r\nfunction readBootTheme() {\r\n try {\r\n const theme = globalThis[BOOTSTRAP_GLOBAL]?.theme\r\n return typeof theme === 'string' && RESTORABLE_IDS.has(theme) ? theme : null\r\n } catch { return null }\r\n}\r\n\r\n/**\r\n * Read the host-side durable preference over the HTTP route (Web transport).\r\n * Any failure (desktop `dsh-app://` origin, old host without the route,\r\n * offline, non-JSON) reads as unset so the local mirror stays usable.\r\n * @returns the restorable id or null.\r\n */\r\nasync function readHostTheme() {\r\n const injected = readBootTheme()\r\n if (injected !== null) return injected\r\n try {\r\n const res = await fetch(PREFERENCE_URL, { headers: { accept: 'application/json' } })\r\n if (!res.ok) return null\r\n const body = await res.json()\r\n const theme = body?.theme\r\n return typeof theme === 'string' && RESTORABLE_IDS.has(theme) ? theme : null\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Write the host-side durable preference (fire-and-forget): a failed PUT\r\n * only costs the cross-port memory, never the current session.\r\n * @param id - theme id to persist.\r\n */\r\nfunction writeHostTheme(id) {\r\n try {\r\n fetch(PREFERENCE_URL, {\r\n method: 'PUT',\r\n headers: { 'content-type': 'application/json' },\r\n body: JSON.stringify({ theme: id }),\r\n }).catch(() => { /* host unavailable: local mirror still holds */ })\r\n } catch { /* fetch missing: ignore */ }\r\n}\r\n\r\n/** Client plugin body: register the seven themes, restore/persist the choice, inject CSS, locale and the settings row. */\r\nexport function apply(ctx) {\r\n // Scope attributes mirror the active theme, so the stylesheet only shades\r\n // while a pixel theme is selected and the variant rules can pick the palette.\r\n // `data-pixel-asset` marks the sprite themes so the shared 9-slice layer runs\r\n // only for them (flat themes stay flat).\r\n const syncScope = () => {\r\n const active = ctx.theme.getTheme().active\r\n const on = PIXEL_IDS.includes(active.id)\r\n document.documentElement.toggleAttribute('data-pixel-ui', on)\r\n if (on) {\r\n document.documentElement.setAttribute('data-pixel-theme', active.id)\r\n document.documentElement.toggleAttribute('data-pixel-asset', ASSET_IDS.has(active.id))\r\n } else {\r\n document.documentElement.removeAttribute('data-pixel-theme')\r\n document.documentElement.removeAttribute('data-pixel-asset')\r\n }\r\n return on\r\n }\r\n\r\n // True only for the moment the user picks a theme in the settings row below.\r\n let explicit = false\r\n // True from `apply` until the restore below has written the intended skin.\r\n // While it is up, a built-in preference arriving is the Host's own initial\r\n // state (settings scope load, theme registration publish) and must not win\r\n // over the skin the user actually chose.\r\n let restoring = true\r\n\r\n ctx.on('theme/change', (snapshot) => {\r\n syncScope()\r\n const pref = snapshot.preference\r\n if (explicit) {\r\n explicit = false\r\n writeLocalTheme(pref)\r\n writeHostTheme(pref)\r\n return\r\n }\r\n if (PIXEL_IDS.includes(pref)) {\r\n writeLocalTheme(pref)\r\n writeHostTheme(pref)\r\n return\r\n }\r\n const want = readLocalTheme()\r\n if (want !== null && PIXEL_IDS.includes(want)) {\r\n // Host reapplied a built-in (model / reasoning switch, or its own\r\n // startup preference): re-assert the skin the user chose.\r\n try { ctx.theme.setTheme(want) } catch { /* ignore */ }\r\n return\r\n }\r\n if (restoring || want === null) {\r\n // No recorded choice yet: the built-in arriving is the Host's own\r\n // initial state. Recording it here would poison the restore below into\r\n // modern UI, so skip (the restore writes the intended skin itself).\r\n return\r\n }\r\n // A genuine built-in choice (e.g. user clicked Modern default): adopt it.\r\n writeLocalTheme(pref)\r\n writeHostTheme(pref)\r\n })\r\n\r\n ctx.effect(() => {\r\n const disposers = THEMES.map((definition) => ctx.theme.register(definition))\r\n return () => { for (const dispose of disposers) dispose() }\r\n }, 'dsh-pixel-ui: theme registration')\r\n\r\n // Restore the last choice. The per-origin mirror paints instantly; when it\r\n // is absent the injected / routed durable preference is the memory, so the\r\n // first setTheme waits for it instead of flashing the default skin.\r\n const applyTarget = (target) => {\r\n try { ctx.theme.setTheme(target) } catch { /* unknown id: keep current */ }\r\n syncScope()\r\n writeLocalTheme(target)\r\n return ctx.theme.getTheme().active.id === target\r\n }\r\n\r\n const restore = async () => {\r\n const local = readLocalTheme()\r\n if (local !== null) {\r\n applyTarget(local)\r\n const host = await readHostTheme()\r\n if (host !== null && host !== ctx.theme.getTheme().preference) applyTarget(host)\r\n return\r\n }\r\n const host = await readHostTheme()\r\n // A fresh install has no memory anywhere: pick the default skin, and retry\r\n // once because a Host that applies its own preference late would otherwise\r\n // leave the page in modern UI until the next interaction.\r\n if (!applyTarget(host ?? DEFAULT_SKIN)) {\r\n await new Promise((resolve) => { setTimeout(resolve, 120) })\r\n applyTarget(host ?? DEFAULT_SKIN)\r\n }\r\n }\r\n\r\n // `restoring` must drop the moment the intended skin is applied — not when\r\n // the durable read settles. A Host preference landing inside that window\r\n // (settings scope load, theme registration publish) would otherwise be\r\n // adopted as a \"real\" choice and silently drop the skin.\r\n const settle = () => { restoring = false }\r\n void restore().then(settle, settle)\r\n\r\n ctx.effect(() => ctx.locale.register(LOCALE_NS, MESSAGES), 'dsh-pixel-ui: settings row dictionaries')\r\n\r\n // Pixel theme row in the General settings section (alongside Appearance).\r\n const rowStore = createThemeRowStore()\r\n let bound = undefined\r\n const syncRow = (snapshot) => { bound?.sync(snapshot.preference, snapshot.revision) }\r\n ctx.on('theme/change', syncRow)\r\n ctx.slots.inject('settings.general.item', () => ctx.slots.register({\r\n name: 'settings.general.item',\r\n id: 'pixel-theme',\r\n order: 20,\r\n store: rowStore,\r\n locale: LOCALE_NS,\r\n inject: (actions) => {\r\n bound = actions\r\n // Re-sync from the getter so no event is lost between registration and\r\n // first render (the store's revision guard drops stale duplicates).\r\n syncRow(ctx.theme.getTheme())\r\n return { setTheme: (id) => { explicit = true; ctx.theme.setTheme(id) } }\r\n },\r\n }, ThemeRow))\r\n\r\n ctx.effect(() => {\r\n const style = document.createElement('style')\r\n style.dataset.plugin = 'dsh-pixel-ui'\r\n style.textContent = cssText\r\n document.head.appendChild(style)\r\n return () => {\r\n style.remove()\r\n document.documentElement.removeAttribute('data-pixel-ui')\r\n document.documentElement.removeAttribute('data-pixel-theme')\r\n }\r\n }, 'dsh-pixel-ui: stylesheet')\r\n}\r\n", "/* dsh-pixel-ui — 星露谷风像素皮肤(木屋/羊皮纸/暖阳/终端绿/全息/南瓜灯/便签本)\r\n *\r\n * 设计原则(v1.5.0 重写,依据是桌面端实测):\r\n *\r\n * 1. **完全平面(flat)**。用户 2026-10-01 的决定:不要立体效果。\r\n * 所以本表里**没有任何 box-shadow / text-shadow**——凸起、凹陷、浮雕、\r\n * 文字投影全部取消。像素的层次改由三样东西表达:\r\n * ① 整像素描边(2px,内容层 1px);\r\n * ② 平涂色块之间的一档明度差(主题色板自带);\r\n * ③ 2px 棋盘抖动(--px-dither)与手绘 SVG 像素图形。\r\n * 历史上用半透明 inset/outset 做 bevel,在 1.25 DPR 上会渲染成亚像素\r\n * 灰阶毛边,那正是用户最早报的「伪像素」。\r\n *\r\n * 2. **只做 token 表达不了的事**。颜色、背景、文字色交给主题 token;本表负责\r\n * 方角、2px 整像素描边、像素字体、位图缩放、像素光标、像素滚动条。\r\n *\r\n * 3. **选择器必须是「确定的类型」,不许再用 `[class*='card']` 这种子串扫射**。\r\n * v1.4 的 `[class*=...]` 规则命中了宿主大量它没打算命中的元素(`.xz4KEq_*`、\r\n * `.Dc7zOa_*`、`.Hqq-bq_*`、图标类…),结果整个界面被盖上一层厚重黑框,\r\n * 读起来像「处处凹陷的印章」——用户报的「伪像素 / 凹陷」就是它。\r\n * 这里只保留三类选择器:\r\n * a) 真正的 HTML 语义(button/input/table/pre/hr/…);\r\n * b) 稳定的 ARIA 与 data 属性([role=tab]、[aria-selected]、[data-theme]);\r\n * c) 本插件自己的类名(.px-*)与宿主主题 token(--dsw-*)。\r\n *\r\n * 4. **1px 细线只在内容层出现**(表格内线),装饰框一律 2px 起:\r\n * 像素风里 1px 装饰线在非整数缩放下必然糊成灰线。\r\n *\r\n * 5. **动效是像素动效(v1.6.0)**:只用 `steps()` 阶梯、逐帧闪烁和 sprite\r\n * 位移;不做平滑插值、不做 width/height 动画、不移动布局。所有动画都在\r\n * `prefers-reduced-motion: reduce` 下关掉。动效只表达「状态正在变化」\r\n * (思考中/运行中/选中/按下/提示进入),不拿来做装饰。\r\n *\r\n * 作用域 html[data-pixel-ui]:任一像素主题激活时生效,data-pixel-theme 区分配色;\r\n * data-pixel-asset 只在三套真素材主题(全息/南瓜灯/便签本)出现,驱动共用\r\n * 9-slice 层。前四套仍是零素材、零阴影的纯平面皮肤。\r\n */\r\n\r\n@font-face {\r\n font-family: 'Fusion Pixel 12';\r\n src: url('/dsh-pixel-ui/fonts/fusion-pixel-12px.woff2') format('woff2');\r\n font-weight: 400;\r\n font-style: normal;\r\n font-display: swap;\r\n}\r\n@font-face {\r\n font-family: 'Press Start 2P';\r\n src: url('/dsh-pixel-ui/fonts/PressStart2P-Regular.ttf') format('truetype');\r\n font-weight: 400;\r\n font-style: normal;\r\n font-display: swap;\r\n}\r\n\r\n/* ── 基础令牌(木屋=暗色基准,其余主题覆盖配色) ─────────────────── */\r\nhtml[data-pixel-ui] {\r\n /* 木色阶 */\r\n --px-wood-darkest: #1A0F06;\r\n --px-wood-dark: #2C1A0C;\r\n --px-wood-mid: #3A2515;\r\n --px-wood-warm: #4A3020;\r\n --px-wood-light: #6B4C2E;\r\n --px-wood-pale: #8B6B45;\r\n /* 金色阶 */\r\n --px-gold: #F4D03F;\r\n --px-gold-bright: #FFE066;\r\n --px-gold-dark: #C99A00;\r\n --px-gold-deep: #8B6B00;\r\n --px-parchment: #F5E6C8;\r\n --px-text-on-dark: #E8D5B0;\r\n --px-text-light: #AC8A63;\r\n /* 输入件 */\r\n --px-input-bg: #1A0F06;\r\n --px-input-text: #FFFDF5;\r\n --px-input-caret: #F4D03F;\r\n --px-input-ph: #B08A5E;\r\n /* 勾/点:暗色主题用深木色;纸面/便签本用预置的纸白版本(--px-*-light) */\r\n --px-check: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' shape-rendering='crispEdges'%3E%3Cg fill='%231A0F06'%3E%3Crect x='0' y='4' width='2' height='2'/%3E%3Crect x='0' y='6' width='2' height='2'/%3E%3Crect x='2' y='6' width='2' height='2'/%3E%3Crect x='2' y='8' width='2' height='2'/%3E%3Crect x='4' y='4' width='2' height='2'/%3E%3Crect x='4' y='6' width='2' height='2'/%3E%3Crect x='4' y='8' width='2' height='2'/%3E%3Crect x='4' y='10' width='2' height='2'/%3E%3Crect x='6' y='2' width='2' height='2'/%3E%3Crect x='6' y='4' width='2' height='2'/%3E%3Crect x='6' y='6' width='2' height='2'/%3E%3Crect x='6' y='8' width='2' height='2'/%3E%3Crect x='8' y='0' width='2' height='2'/%3E%3Crect x='8' y='2' width='2' height='2'/%3E%3Crect x='8' y='4' width='2' height='2'/%3E%3Crect x='8' y='6' width='2' height='2'/%3E%3Crect x='10' y='0' width='2' height='2'/%3E%3Crect x='10' y='2' width='2' height='2'/%3E%3Crect x='10' y='4' width='2' height='2'/%3E%3C/g%3E%3C/svg%3E\");\r\n --px-radio: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' shape-rendering='crispEdges'%3E%3Crect x='0' y='0' width='8' height='8' fill='%231A0F06'/%3E%3C/svg%3E\");\r\n --px-check-light: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' shape-rendering='crispEdges'%3E%3Cg fill='%23FFFDF5'%3E%3Crect x='0' y='4' width='2' height='2'/%3E%3Crect x='0' y='6' width='2' height='2'/%3E%3Crect x='2' y='6' width='2' height='2'/%3E%3Crect x='2' y='8' width='2' height='2'/%3E%3Crect x='4' y='4' width='2' height='2'/%3E%3Crect x='4' y='6' width='2' height='2'/%3E%3Crect x='4' y='8' width='2' height='2'/%3E%3Crect x='4' y='10' width='2' height='2'/%3E%3Crect x='6' y='2' width='2' height='2'/%3E%3Crect x='6' y='4' width='2' height='2'/%3E%3Crect x='6' y='6' width='2' height='2'/%3E%3Crect x='6' y='8' width='2' height='2'/%3E%3Crect x='8' y='0' width='2' height='2'/%3E%3Crect x='8' y='2' width='2' height='2'/%3E%3Crect x='8' y='4' width='2' height='2'/%3E%3Crect x='8' y='6' width='2' height='2'/%3E%3Crect x='10' y='0' width='2' height='2'/%3E%3Crect x='10' y='2' width='2' height='2'/%3E%3Crect x='10' y='4' width='2' height='2'/%3E%3C/g%3E%3C/svg%3E\");\r\n --px-radio-light: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' shape-rendering='crispEdges'%3E%3Crect x='0' y='0' width='8' height='8' fill='%23FFFDF5'/%3E%3C/svg%3E\");\r\n /* 代码 */\r\n --px-code-bg: #241408;\r\n --px-code-ink: #FFE066;\r\n /* 提示框 */\r\n --px-tooltip-bg: #1A0F06;\r\n /* 强调面 */\r\n --px-accent-bg: #F4D03F;\r\n --px-accent-ink: #1A0F06;\r\n --px-ink-on-mid: #F5E6C8;\r\n /* 描边色:平面皮肤唯一的「线」色,2px 整像素 */\r\n --px-line: #140B04;\r\n /* 纹理:2px 棋盘抖动 */\r\n --px-dither: #241408;\r\n /* 暗角(CRT 只保留暗角,扫描线在非整数 DPR 上必糊) */\r\n --px-vignette: rgba(0, 0, 0, 0.2);\r\n /* 内容列宽:宿主把 --dsh-conversation-column-width 写死成 0,\r\n * clamp(680px, 0 * .64, 920px) 恒取 680px 下限 → 宽屏上正文只占中间一条\r\n * (踩坑 #7)。这里补上那个变量应有的值:正文随视口撑开。 */\r\n --px-chat-width: clamp(680px, calc(64vw - 140px), 1200px);\r\n /* 侧栏 / 顶栏底 */\r\n --px-sidebar-fill: #241408;\r\n --px-topbar-fill: #2C1A0C;\r\n /* 字体栈 */\r\n --px-font: 'Fusion Pixel 12', 'Press Start 2P', monospace;\r\n --px-mono: 'Cascadia Code', 'Consolas', 'Courier New', monospace;\r\n /* 动效:像素动画只走阶梯,不使用平滑曲线(v1.6.0) */\r\n --px-t-fast: 80ms;\r\n --px-t-mid: 140ms;\r\n --px-t-slow: 220ms;\r\n --px-step-2: steps(2, end);\r\n --px-step-4: steps(4, end);\r\n --px-step-8: steps(8, end);\r\n /* 主按钮悬停底色;与 --px-accent-bg / --px-accent-ink 配对做对比度审计 */\r\n --px-accent-hover: #FFE066;\r\n}\r\n\r\n/* ── 四主题配色(Agent Xi 同款) ─────────────────────────────────── */\r\nhtml[data-pixel-theme='pixel-paper'] {\r\n --px-wood-darkest: #F0E8D8;\r\n --px-wood-dark: #E8DCC8;\r\n --px-wood-mid: #DDD0B8;\r\n --px-wood-warm: #D4C4A8;\r\n --px-wood-light: #B8A080;\r\n --px-wood-pale: #9B8B6B;\r\n --px-gold: #A07000;\r\n --px-gold-bright: #6B4F00;\r\n --px-gold-dark: #8A6400;\r\n --px-gold-deep: #7A5A00;\r\n --px-parchment: #FFFDF5;\r\n --px-text-on-dark: #3A2A10;\r\n --px-text-light: #6B5020;\r\n --px-input-bg: #FFFDF5;\r\n --px-input-text: #3A2A10;\r\n --px-input-caret: #8A6400;\r\n --px-input-ph: #8B7040;\r\n /* 深金底上的深木色勾看不清,纸面主题改成纸白勾/点 */\r\n --px-check: var(--px-check-light);\r\n --px-radio: var(--px-radio-light);\r\n --px-code-bg: #E0D4BC;\r\n --px-code-ink: #5C4400;\r\n --px-tooltip-bg: #2A1B08;\r\n --px-accent-bg: #7A5A00;\r\n --px-accent-ink: #FFFDF5;\r\n --px-ink-on-mid: #3A2A10;\r\n --px-line: #8B7040;\r\n --px-dither: #D8C9AC;\r\n --px-vignette: rgba(0, 0, 0, 0.07);\r\n --px-sidebar-fill: #E8DCC8;\r\n --px-topbar-fill: #E8DCC8;\r\n --px-accent-hover: #5C4400;\r\n}\r\nhtml[data-pixel-theme='pixel-warm'] {\r\n --px-wood-darkest: #1E0E04;\r\n --px-wood-dark: #34180A;\r\n --px-wood-mid: #4A2210;\r\n --px-wood-warm: #5C2E16;\r\n --px-wood-light: #8B4A28;\r\n --px-wood-pale: #A86B40;\r\n --px-gold: #FF8C42;\r\n --px-gold-bright: #FFA64D;\r\n --px-gold-dark: #D96E30;\r\n --px-gold-deep: #A05020;\r\n --px-parchment: #FFF0E0;\r\n --px-text-on-dark: #F0C8A0;\r\n --px-text-light: #C08A5C;\r\n --px-input-bg: #1E0E04;\r\n --px-input-text: #FFFBF5;\r\n --px-input-caret: #FF8C42;\r\n --px-input-ph: #C08A5C;\r\n --px-code-bg: #2A1308;\r\n --px-code-ink: #FFA64D;\r\n --px-tooltip-bg: #1E0E04;\r\n --px-accent-bg: #FF8C42;\r\n --px-accent-ink: #1E0E04;\r\n --px-ink-on-mid: #FFF0E0;\r\n --px-line: #150801;\r\n --px-dither: #2A1308;\r\n --px-sidebar-fill: #2A1308;\r\n --px-topbar-fill: #34180A;\r\n --px-accent-hover: #FFA64D;\r\n}\r\nhtml[data-pixel-theme='pixel-retro'] {\r\n --px-wood-darkest: #0A0E0A;\r\n --px-wood-dark: #0E140E;\r\n --px-wood-mid: #121A12;\r\n --px-wood-warm: #162016;\r\n --px-wood-light: #2A402A;\r\n --px-wood-pale: #3A5A3A;\r\n --px-gold: #33FF33;\r\n --px-gold-bright: #66FF66;\r\n --px-gold-dark: #00CC00;\r\n --px-gold-deep: #009900;\r\n --px-parchment: #B8F0B8;\r\n --px-text-on-dark: #33FF33;\r\n --px-text-light: #22AA22;\r\n --px-input-bg: #0A0E0A;\r\n --px-input-text: #33FF33;\r\n --px-input-caret: #33FF33;\r\n --px-input-ph: #22AA22;\r\n --px-code-bg: #0E140E;\r\n --px-code-ink: #66FF66;\r\n --px-tooltip-bg: #0A0E0A;\r\n --px-accent-bg: #33FF33;\r\n --px-accent-ink: #0A0E0A;\r\n --px-ink-on-mid: #B8F0B8;\r\n --px-line: #040704;\r\n --px-dither: #101A10;\r\n --px-sidebar-fill: #0C100C;\r\n --px-topbar-fill: #0E140E;\r\n --px-accent-hover: #66FF66;\r\n}\r\n\r\n/* ── 内容列宽(桌面端「一半一半」的修正,踩坑 #7) ──────────────────\r\n * 宿主只在样式表里声明 `--dsh-chat-content-width: var(--dsh-chat-user-width,\r\n * clamp(680px, calc(var(--dsh-conversation-column-width, 0px) * .64), 920px))`,\r\n * 而 `--dsh-conversation-column-width` 全仓无人赋值 → clamp 恒取 680px。\r\n * 在根作用域用 !important 把两个变量补上(宿主会把 user-width 以内联样式写在\r\n * 容器上,只有 !important 能压过内联)。 */\r\nhtml[data-pixel-ui] {\r\n --dsh-conversation-column-width: calc(100vw - 280px) !important;\r\n --dsh-chat-user-width: var(--px-chat-width) !important;\r\n --dsh-chat-content-width: var(--px-chat-width) !important;\r\n}\r\n/* 兜底:万一宿主把列宽写死在自己的样式层,这里同权重覆盖。 */\r\nhtml[data-pixel-ui] [class*='xz4KEq_column'] {\r\n max-width: var(--px-chat-width);\r\n}\r\n\r\n/* ── 全局:方角、禁次像素平滑、位图缩放 ─────────────────────────── */\r\nhtml[data-pixel-ui] * {\r\n border-radius: 0 !important;\r\n}\r\nhtml[data-pixel-ui] body {\r\n -webkit-font-smoothing: none;\r\n -moz-osx-font-smoothing: grayscale;\r\n text-rendering: geometricPrecision;\r\n font-family: var(--px-font) !important;\r\n /* 0.01em 会把字形推到半像素 → 灰边;像素字体必须整像素落位 */\r\n letter-spacing: 0;\r\n}\r\nhtml[data-pixel-ui] img,\r\nhtml[data-pixel-ui] canvas,\r\nhtml[data-pixel-ui] video {\r\n image-rendering: pixelated;\r\n}\r\nhtml[data-pixel-ui] ::selection {\r\n background: var(--px-accent-bg);\r\n color: var(--px-accent-ink);\r\n}\r\nhtml[data-pixel-ui] :focus-visible {\r\n outline: 2px solid var(--px-gold) !important;\r\n outline-offset: 1px;\r\n}\r\nhtml[data-pixel-ui] {\r\n accent-color: var(--px-gold);\r\n}\r\n\r\n/* 像素动效:闪烁 / 思考条 / 提示进入 / 运行中。全部走 steps 或离散帧。 */\r\n@keyframes px-blink {\r\n 0%, 55% { opacity: 1; }\r\n 56%, 100% { opacity: 0.35; }\r\n}\r\n@keyframes px-toast-in {\r\n from { opacity: 0; transform: translateY(8px); }\r\n to { opacity: 1; transform: translateY(0); }\r\n}\r\n@keyframes px-toast-out {\r\n from { opacity: 1; transform: translateY(0); }\r\n to { opacity: 0; transform: translateY(4px); }\r\n}\r\n@keyframes px-running {\r\n 0%, 100% { border-left-color: var(--px-gold); }\r\n 50% { border-left-color: var(--px-wood-light); }\r\n}\r\n\r\n/* 暗角:只保留径向暗角(扫描线在 1.25 DPR 上必糊成灰膜)。 */\r\nhtml[data-pixel-ui] body::after {\r\n content: \"\";\r\n position: fixed;\r\n inset: 0;\r\n z-index: 2147483647;\r\n pointer-events: none;\r\n background: radial-gradient(ellipse at center, transparent 70%, var(--px-vignette) 100%);\r\n}\r\n@media (prefers-reduced-motion: reduce) {\r\n html[data-pixel-ui] * {\r\n transition: none !important;\r\n animation: none !important;\r\n }\r\n html[data-pixel-ui] *::before,\r\n html[data-pixel-ui] *::after {\r\n transition: none !important;\r\n animation: none !important;\r\n }\r\n}\r\n\r\n/* ── 像素滚动条:方、10px、木色 ─────────────────────────────────── */\r\nhtml[data-pixel-ui] {\r\n scrollbar-color: var(--px-wood-light) var(--px-wood-darkest);\r\n}\r\nhtml[data-pixel-ui] ::-webkit-scrollbar {\r\n width: 8px;\r\n height: 8px;\r\n}\r\nhtml[data-pixel-ui] ::-webkit-scrollbar-track {\r\n background: var(--px-wood-darkest);\r\n border-left: 2px solid var(--px-wood-dark);\r\n}\r\nhtml[data-pixel-ui] ::-webkit-scrollbar-thumb {\r\n background-color: var(--px-wood-light);\r\n border: 2px solid var(--px-wood-darkest);\r\n /* 4×2 的握把,比整条渐变更像像素滚动条 */\r\n background-image: linear-gradient(var(--px-wood-pale), var(--px-wood-pale));\r\n background-size: 4px 2px;\r\n background-position: center;\r\n background-repeat: no-repeat;\r\n}\r\nhtml[data-pixel-ui] ::-webkit-scrollbar-thumb:hover {\r\n background-color: var(--px-wood-pale);\r\n}\r\nhtml[data-pixel-ui] ::-webkit-scrollbar-thumb:active {\r\n background-color: var(--px-gold-dark);\r\n}\r\nhtml[data-pixel-ui] ::-webkit-scrollbar-corner {\r\n background: var(--px-wood-darkest);\r\n}\r\n\r\n/* ── 排版:装饰性文字走像素字体;正文/代码走 mono ────────────────── */\r\nhtml[data-pixel-ui] h1,\r\nhtml[data-pixel-ui] h2,\r\nhtml[data-pixel-ui] h3,\r\nhtml[data-pixel-ui] h4,\r\nhtml[data-pixel-ui] summary,\r\nhtml[data-pixel-ui] button,\r\nhtml[data-pixel-ui] label,\r\nhtml[data-pixel-ui] legend,\r\nhtml[data-pixel-ui] [role='tab'],\r\nhtml[data-pixel-ui] [role='menuitem'],\r\nhtml[data-pixel-ui] [role='tooltip'],\r\nhtml[data-pixel-ui] [role='switch'] {\r\n font-family: var(--px-font) !important;\r\n font-variant-ligatures: none;\r\n}\r\nhtml[data-pixel-ui] h1,\r\nhtml[data-pixel-ui] h2,\r\nhtml[data-pixel-ui] h3 {\r\n color: var(--px-gold-bright) !important;\r\n}\r\n/* 正文/代码层:mono、不加字阴影、长 token 允许断行(像素字体更宽) */\r\nhtml[data-pixel-ui] pre,\r\nhtml[data-pixel-ui] code,\r\nhtml[data-pixel-ui] kbd,\r\nhtml[data-pixel-ui] textarea,\r\nhtml[data-pixel-ui] input,\r\nhtml[data-pixel-ui] p,\r\nhtml[data-pixel-ui] li,\r\nhtml[data-pixel-ui] td,\r\nhtml[data-pixel-ui] th {\r\n font-family: var(--px-mono) !important;\r\n}\r\nhtml[data-pixel-ui] p,\r\nhtml[data-pixel-ui] li {\r\n overflow-wrap: anywhere;\r\n}\r\nhtml[data-pixel-ui] li::marker {\r\n color: var(--px-gold);\r\n}\r\nhtml[data-pixel-ui] kbd {\r\n color: var(--px-text-light) !important;\r\n font-family: var(--px-font) !important;\r\n font-size: 11px;\r\n font-variant-ligatures: none;\r\n}\r\nhtml[data-pixel-ui] mark {\r\n background: var(--px-gold) !important;\r\n color: var(--px-accent-ink) !important;\r\n}\r\n\r\n/* ── 按钮:默认只继承宿主的底与形(宿主大量图标按钮本来就是透明的),\r\n * 只把方角、像素字与「按下去掉一档」的反馈补齐;实心块只在悬停/选中时出现。\r\n * v1.4 给**所有** button 套 2px 黑框 + 内阴影,图标按钮全变成厚盒子,\r\n * 这是用户报「处处凹陷」的主因之一。 ─────────────────────────────── */\r\nhtml[data-pixel-ui] button {\r\n font-size: 12px;\r\n letter-spacing: 0;\r\n border: none !important;\r\n font-variant-ligatures: none;\r\n transition:\r\n background-color var(--px-t-fast) var(--px-step-2),\r\n color var(--px-t-fast) var(--px-step-2),\r\n transform var(--px-t-fast) var(--px-step-2);\r\n}\r\n/* 主按钮/危险按钮的底色由宿主 token 负责,这里不能再把它们刷成木色,\r\n * 否则 hover 时深字落在深底上(v1.5.0 的 generic hover 就踩过这个)。\r\n * 只给「普通按钮」用木色 hover。用 wood-mid 而不是 wood-dark:\r\n * 纸面主题的 wood-dark 和 sidebar 同色,hover 会完全看不见。 */\r\nhtml[data-pixel-ui] button:not(:disabled):not([class*='primary']):not([class*='Primary']):not([class*='danger']):not([class*='Danger']):hover {\r\n background-color: var(--px-wood-mid) !important;\r\n}\r\n/* 主按钮:实心块 + 2px 描边;hover 由 --dsw-alias-button-primary-hover 控制,\r\n * dither 是叠加的 2px 棋盘(不改变底色)。 */\r\nhtml[data-pixel-ui] button[class*='primary']:hover:not(:disabled),\r\nhtml[data-pixel-ui] button[class*='Primary']:hover:not(:disabled) {\r\n background-image: repeating-conic-gradient(\r\n color-mix(in srgb, var(--px-accent-ink) 10%, transparent) 0 25%,\r\n transparent 0 50%\r\n ) !important;\r\n background-size: 4px 4px !important;\r\n}\r\n/* 按下去只做 1px 的整像素位移,不改布局尺寸;松开即回。 */\r\nhtml[data-pixel-ui] button:not(:disabled):active {\r\n transform: translate(1px, 1px);\r\n transition-duration: 0s;\r\n}\r\n/* 已经按下的切换按钮用木色底 + 金色字,和普通 hover 区分开。\r\n * 设置页的像素主题按钮自己管理选中态,不能被这条刷掉。 */\r\nhtml[data-pixel-ui] button[aria-pressed='true']:not(.px-theme-btn) {\r\n background-color: var(--px-wood-mid) !important;\r\n color: var(--px-gold-bright) !important;\r\n}\r\n/* 宿主的 primary token 已能上色;这里再兜一层,保证 token 缺失/第三方按钮\r\n * 也跟随主题,不把宿主默认蓝带进木屋/羊皮纸。 */\r\nhtml[data-pixel-ui] button[class*='primary'],\r\nhtml[data-pixel-ui] button[class*='Primary'] {\r\n background-color: var(--px-accent-bg) !important;\r\n background-image: none !important;\r\n color: var(--px-accent-ink) !important;\r\n border: 2px solid var(--px-line) !important;\r\n}\r\nhtml[data-pixel-ui] button[class*='primary']:hover:not(:disabled),\r\nhtml[data-pixel-ui] button[class*='Primary']:hover:not(:disabled) {\r\n background-color: var(--px-accent-hover) !important;\r\n}\r\nhtml[data-pixel-ui] button[class*='danger'],\r\nhtml[data-pixel-ui] button[class*='Danger'] {\r\n border: 2px solid var(--px-line) !important;\r\n}\r\nhtml[data-pixel-ui] button:disabled {\r\n opacity: 0.55;\r\n cursor: not-allowed;\r\n}\r\n\r\n/* ── 页签(对话/轨迹/记忆):文字 + 金下沿,**不加边框**\r\n * v1.4 给页签套了 2px 黑框,整条读起来像凹陷的输入框(用户报「凹陷了」)。\r\n * 平面皮肤里「选中」只用颜色 + 一条整像素下边线表达,不做凹凸。 */\r\nhtml[data-pixel-ui] [role='tab'] {\r\n position: relative;\r\n font-size: 13px;\r\n font-variant-ligatures: none;\r\n border: none !important;\r\n border-bottom: 3px solid transparent !important;\r\n background-color: transparent !important;\r\n color: var(--px-text-light) !important;\r\n transition: color var(--px-t-fast) var(--px-step-2);\r\n}\r\nhtml[data-pixel-ui] [role='tab']::after {\r\n content: \"\";\r\n position: absolute;\r\n left: 0;\r\n right: 0;\r\n bottom: -3px;\r\n height: 2px;\r\n background: var(--px-gold);\r\n pointer-events: none;\r\n transform: scaleX(0);\r\n transform-origin: left center;\r\n transition:\r\n transform var(--px-t-mid) var(--px-step-4),\r\n height var(--px-t-fast) var(--px-step-2);\r\n}\r\nhtml[data-pixel-ui] [role='tab']:hover {\r\n color: var(--px-text-on-dark) !important;\r\n}\r\nhtml[data-pixel-ui] [role='tab']:hover::after {\r\n transform: scaleX(1);\r\n}\r\nhtml[data-pixel-ui] [role='tab'][aria-selected='true'] {\r\n color: var(--px-gold-bright) !important;\r\n background-color: transparent !important;\r\n border-bottom-color: transparent !important;\r\n}\r\nhtml[data-pixel-ui] [role='tab'][aria-selected='true']::after {\r\n height: 3px;\r\n transform: scaleX(1);\r\n}\r\n\r\n/* ── 输入件:黑木底 + 羊皮纸字 + 金框,聚焦金环 ───────────────────\r\n * 只给「真正的输入面」上底和框,`select` 与只读输入保留宿主的形,\r\n * 否则设置页里成排的选择器全变成黑盒子。 */\r\nhtml[data-pixel-ui] input:not([type='checkbox']):not([type='radio']),\r\nhtml[data-pixel-ui] textarea,\r\nhtml[data-pixel-ui] [contenteditable='true'] {\r\n font-size: 12px;\r\n letter-spacing: 0;\r\n font-variant-ligatures: none;\r\n color: var(--px-input-text) !important;\r\n -webkit-text-fill-color: var(--px-input-text) !important;\r\n caret-color: var(--px-input-caret) !important;\r\n caret-shape: block;\r\n background-color: var(--px-input-bg) !important;\r\n border: 2px solid var(--px-gold-deep) !important;\r\n transition: border-color var(--px-t-fast) var(--px-step-2);\r\n}\r\nhtml[data-pixel-ui] input:not([type='checkbox']):not([type='radio']):hover:not(:focus),\r\nhtml[data-pixel-ui] textarea:hover:not(:focus),\r\nhtml[data-pixel-ui] [contenteditable='true']:hover:not(:focus) {\r\n border-color: var(--px-gold-dark) !important;\r\n}\r\nhtml[data-pixel-ui] input:focus,\r\nhtml[data-pixel-ui] textarea:focus,\r\nhtml[data-pixel-ui] [contenteditable='true']:focus {\r\n border-color: var(--px-gold) !important;\r\n outline: none !important;\r\n}\r\nhtml[data-pixel-ui] select {\r\n color: var(--px-input-text) !important;\r\n background-color: transparent !important;\r\n border: 2px solid var(--px-gold-deep) !important;\r\n transition: border-color var(--px-t-fast) var(--px-step-2);\r\n}\r\nhtml[data-pixel-ui] select:hover:not(:focus) {\r\n border-color: var(--px-gold-dark) !important;\r\n}\r\nhtml[data-pixel-ui] select:focus {\r\n border-color: var(--px-gold) !important;\r\n outline: none !important;\r\n}\r\nhtml[data-pixel-ui] input::placeholder,\r\nhtml[data-pixel-ui] textarea::placeholder {\r\n color: var(--px-input-ph) !important;\r\n -webkit-text-fill-color: var(--px-input-ph) !important;\r\n opacity: 1;\r\n}\r\nhtml[data-pixel-ui] [contenteditable='true']:empty::before {\r\n color: var(--px-input-ph) !important;\r\n -webkit-text-fill-color: var(--px-input-ph) !important;\r\n}\r\n\r\n/* ── 选择件:复选框 / 单选 / 开关 / 滑块 ───────────────────────── */\r\nhtml[data-pixel-ui] input[type='checkbox'],\r\nhtml[data-pixel-ui] input[type='radio'] {\r\n appearance: none;\r\n -webkit-appearance: none;\r\n width: 14px;\r\n height: 14px;\r\n padding: 0;\r\n flex-shrink: 0;\r\n background-color: var(--px-input-bg) !important;\r\n border: 2px solid var(--px-line) !important;\r\n transition:\r\n background-color var(--px-t-fast) var(--px-step-2),\r\n border-color var(--px-t-fast) var(--px-step-2);\r\n}\r\nhtml[data-pixel-ui] input[type='checkbox']:not(:checked):hover,\r\nhtml[data-pixel-ui] input[type='radio']:not(:checked):hover {\r\n border-color: var(--px-gold-dark) !important;\r\n}\r\nhtml[data-pixel-ui] input[type='checkbox']:checked {\r\n background-color: var(--px-gold) !important;\r\n /* 12×12 手绘像素对勾(2px 阶梯),颜色由 --px-check 按主题切换 */\r\n background-image: var(--px-check) !important;\r\n background-repeat: no-repeat !important;\r\n background-position: 3px 1px !important;\r\n border: 2px solid var(--px-line) !important;\r\n}\r\nhtml[data-pixel-ui] input[type='radio']:checked {\r\n background-color: var(--px-gold) !important;\r\n /* 平色时代没有 inset 灰阶可用:8×8 手绘像素方点,颜色由 --px-radio 切换 */\r\n background-image: var(--px-radio) !important;\r\n background-size: 6px 6px !important;\r\n background-position: 2px 2px !important;\r\n background-repeat: no-repeat !important;\r\n}\r\nhtml[data-pixel-ui] select {\r\n appearance: none;\r\n -webkit-appearance: none;\r\n padding-right: 28px !important;\r\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8' shape-rendering='crispEdges'%3E%3Crect x='0' y='0' width='8' height='2'/%3E%3Crect x='1' y='2' width='6' height='2'/%3E%3Crect x='2' y='4' width='4' height='2'/%3E%3Crect x='3' y='6' width='2' height='2'/%3E%3C/svg%3E\") !important;\r\n background-repeat: no-repeat !important;\r\n background-position: right 8px center !important;\r\n}\r\nhtml[data-pixel-ui] select option {\r\n background-color: var(--px-input-bg);\r\n color: var(--px-input-text);\r\n}\r\nhtml[data-pixel-ui] [role='switch'] {\r\n border: 2px solid var(--px-line) !important;\r\n background-color: var(--px-wood-dark) !important;\r\n transition: border-color var(--px-t-fast) var(--px-step-2), background-color var(--px-t-fast) var(--px-step-2);\r\n}\r\nhtml[data-pixel-ui] [role='switch']:hover {\r\n border-color: var(--px-gold-dark) !important;\r\n}\r\nhtml[data-pixel-ui] input[type='range'] {\r\n appearance: none;\r\n -webkit-appearance: none;\r\n height: 14px;\r\n padding: 0;\r\n border: none !important;\r\n background: transparent !important;\r\n}\r\nhtml[data-pixel-ui] input[type='range']::-webkit-slider-runnable-track {\r\n height: 8px;\r\n border: 2px solid var(--px-line);\r\n background-color: var(--px-wood-mid);\r\n}\r\nhtml[data-pixel-ui] input[type='range']::-webkit-slider-thumb {\r\n -webkit-appearance: none;\r\n width: 12px;\r\n height: 14px;\r\n margin-top: -5px;\r\n background-color: var(--px-gold);\r\n border: 2px solid var(--px-line);\r\n transition: background-color var(--px-t-fast) var(--px-step-2);\r\n}\r\nhtml[data-pixel-ui] input[type='range']::-webkit-slider-thumb:hover {\r\n background-color: var(--px-gold-bright);\r\n}\r\nhtml[data-pixel-ui] input[type='range']::-moz-range-track {\r\n height: 8px;\r\n border: 2px solid var(--px-line);\r\n background: var(--px-wood-mid);\r\n}\r\nhtml[data-pixel-ui] input[type='range']::-moz-range-thumb {\r\n width: 12px;\r\n height: 14px;\r\n background-color: var(--px-gold);\r\n border: 2px solid var(--px-line);\r\n border-radius: 0;\r\n}\r\n\r\n/* ── 内容层:代码块 / 行内代码 / 引用 / 表格 / 分隔线 ─────────────── */\r\nhtml[data-pixel-ui] pre {\r\n background: var(--px-code-bg) !important;\r\n color: var(--px-text-on-dark) !important;\r\n border: 2px solid var(--px-wood-light) !important;\r\n border-left: 4px solid var(--px-gold-deep) !important;\r\n}\r\n/* 代码块顶栏:像终端窗口的 title bar,2px 底线 + 左侧金色方块。 */\r\nhtml[data-pixel-ui] [data-code-block-banner] {\r\n background-color: var(--px-wood-mid) !important;\r\n color: var(--px-text-light) !important;\r\n border-bottom: 2px solid var(--px-line) !important;\r\n border-left: 4px solid var(--px-gold) !important;\r\n font-family: var(--px-font) !important;\r\n font-size: 11px;\r\n letter-spacing: 0;\r\n font-variant-ligatures: none;\r\n}\r\nhtml[data-pixel-ui] [data-code-block-banner] button {\r\n background: transparent !important;\r\n color: var(--px-text-on-dark) !important;\r\n border: none !important;\r\n padding: 0 4px;\r\n}\r\nhtml[data-pixel-ui] code {\r\n background: var(--px-code-bg) !important;\r\n color: var(--px-code-ink) !important;\r\n border: none !important;\r\n padding: 0 3px;\r\n}\r\nhtml[data-pixel-ui] pre code {\r\n background: transparent !important;\r\n color: inherit !important;\r\n padding: 0;\r\n}\r\nhtml[data-pixel-ui] blockquote {\r\n border: 2px solid var(--px-wood-light) !important;\r\n border-left: 4px solid var(--px-gold) !important;\r\n background-color: var(--px-wood-dark) !important;\r\n background-image: repeating-conic-gradient(\r\n color-mix(in srgb, var(--px-gold) 5%, transparent) 0 25%,\r\n transparent 0 50%\r\n ) !important;\r\n background-size: 4px 4px !important;\r\n color: var(--px-text-on-dark) !important;\r\n padding: 6px 10px;\r\n}\r\nhtml[data-pixel-ui] hr {\r\n border: none !important;\r\n height: 2px;\r\n background: repeating-linear-gradient(\r\n 90deg,\r\n var(--px-wood-light) 0 2px,\r\n transparent 2px 4px\r\n ) !important;\r\n}\r\nhtml[data-pixel-ui] table {\r\n border: 2px solid var(--px-wood-warm) !important;\r\n border-collapse: collapse;\r\n}\r\nhtml[data-pixel-ui] tbody tr:nth-child(even) td {\r\n background-color: color-mix(in srgb, var(--px-wood-mid) 32%, transparent) !important;\r\n}\r\nhtml[data-pixel-ui] tbody tr:hover td {\r\n background-color: var(--px-wood-mid) !important;\r\n}\r\nhtml[data-pixel-ui] th {\r\n background-color: var(--px-wood-warm) !important;\r\n color: var(--px-ink-on-mid) !important;\r\n font-family: var(--px-font) !important;\r\n font-size: 12px;\r\n border: 1px solid var(--px-wood-light) !important;\r\n}\r\nhtml[data-pixel-ui] td {\r\n border: 1px solid var(--px-wood-light) !important;\r\n}\r\nhtml[data-pixel-ui] a {\r\n color: var(--px-gold-bright) !important;\r\n text-decoration-color: var(--px-gold-dark);\r\n text-decoration-thickness: 2px;\r\n text-underline-offset: 3px;\r\n transition: color var(--px-t-fast) var(--px-step-2);\r\n}\r\nhtml[data-pixel-ui] a:hover {\r\n color: var(--px-gold) !important;\r\n}\r\nhtml[data-pixel-ui] summary {\r\n cursor: pointer;\r\n color: var(--px-gold-bright) !important;\r\n transition: color var(--px-t-fast) var(--px-step-2);\r\n}\r\nhtml[data-pixel-ui] summary:hover {\r\n color: var(--px-gold) !important;\r\n}\r\n\r\n/* ── 工具提示 / 菜单 / 状态条 ──────────────────────────────────── */\r\nhtml[data-pixel-ui] [role='tooltip'] {\r\n font-size: 11px;\r\n line-height: 1.6;\r\n color: var(--px-parchment) !important;\r\n background: var(--px-tooltip-bg) !important;\r\n border: 2px solid var(--px-gold-deep) !important;\r\n background-image:\r\n linear-gradient(var(--px-gold), var(--px-gold)),\r\n linear-gradient(var(--px-gold), var(--px-gold)) !important;\r\n background-size: 6px 2px, 2px 6px !important;\r\n background-position: 0 0, 0 0 !important;\r\n background-repeat: no-repeat !important;\r\n}\r\nhtml[data-pixel-ui] [data-menu-material],\r\nhtml[data-pixel-ui] [role='menu'] {\r\n border: 2px solid var(--px-line) !important;\r\n /* 2px 描边不能再把固定宽度的菜单撑出 4px 横向滚动条 */\r\n box-sizing: border-box !important;\r\n overflow-x: hidden !important;\r\n}\r\n/* 菜单的滚动容器在 role=menu 的内部(宿主 _viewport_),只给外层\r\n * overflow-x:hidden 拦不住内部那一条;菜单不需要横向滚动,一律 clip。 */\r\nhtml[data-pixel-ui] [role='menu'] *,\r\nhtml[data-pixel-ui] [data-menu-material] * {\r\n overflow-x: clip !important;\r\n}\r\nhtml[data-pixel-ui] [role='dialog'] {\r\n /* dialog 默认 content-box 时,2px 边框同样会撑出内部横向滚动条 */\r\n box-sizing: border-box !important;\r\n}\r\nhtml[data-pixel-ui] [role='dialog'] nav,\r\nhtml[data-pixel-ui] [role='dialog'] [role='tablist'] {\r\n overflow-x: hidden !important;\r\n}\r\n/* 设置页左侧导航是“列 flex + 按钮”的结构:按钮的 min-width:auto 会把\r\n * 像素字体的 min-content 宽度顶出去,navList 就会出现横向滚动条。 */\r\nhtml[data-pixel-ui] [role='dialog'] button {\r\n min-width: 0;\r\n}\r\n/* 设置对话框的底色正好是 wood-mid;通用 hover 也是 wood-mid,等于没变。\r\n * 对话框内普通按钮改用 wood-warm,至少和面板底色差一档明度。 */\r\nhtml[data-pixel-ui] [role='dialog'] button:not(:disabled):not([class*='primary']):not([class*='Primary']):not([class*='danger']):not([class*='Danger']):hover {\r\n background-color: var(--px-wood-warm) !important;\r\n}\r\n/* 设置页左导航是 div.navList(直接子级全是 button,其中一个是 aria-current),\r\n * overflow-y:auto 会把 overflow-x 也算成 auto;内容只要宽 1px 就冒横向滚动条。 */\r\nhtml[data-pixel-ui] [role='dialog'] div:has(> button[aria-current]) {\r\n overflow-x: hidden !important;\r\n}\r\nhtml[data-pixel-ui] [role='menuitem']:hover,\r\nhtml[data-pixel-ui] [role='option']:hover,\r\nhtml[data-pixel-ui] [role='treeitem']:hover {\r\n background-color: var(--px-wood-mid) !important;\r\n}\r\n/* 菜单项即使不在 [role=menu] 外壳里(宿主 portal/自定义菜单)也要有\r\n * 可见的文字色变化 + 金色左条,不能只赌底色和菜单面不同。 */\r\nhtml[data-pixel-ui] [role='menuitem']:hover {\r\n color: var(--px-gold-bright) !important;\r\n background-image:\r\n linear-gradient(var(--px-gold), var(--px-gold)),\r\n repeating-conic-gradient(\r\n color-mix(in srgb, var(--px-gold) 8%, transparent) 0 25%,\r\n transparent 0 50%\r\n ) !important;\r\n background-size: 3px 100%, 4px 4px !important;\r\n background-position: 0 0, 0 0 !important;\r\n background-repeat: no-repeat, repeat !important;\r\n}\r\nhtml[data-pixel-ui] [role='option']:hover {\r\n color: var(--px-gold-bright) !important;\r\n}\r\n/* 菜单项(设置/意见反馈/退出登录…)在宿主里是 button[role=menuitem],\r\n * 菜单表面本身可能是 wood-mid 或宿主灰;只换底色仍然可能看不见。\r\n * 这里固定叠 3px 金色左条 + 2px dither,并把文字提到 gold-bright。 */\r\nhtml[data-pixel-ui] [role='menu'] [role='menuitem']:hover,\r\nhtml[data-pixel-ui] [data-menu-material] [role='menuitem']:hover,\r\nhtml[data-pixel-ui] [role='menu'] button:hover,\r\nhtml[data-pixel-ui] [data-menu-material] button:hover {\r\n background-color: var(--px-wood-mid) !important;\r\n color: var(--px-gold-bright) !important;\r\n background-image:\r\n linear-gradient(var(--px-gold), var(--px-gold)),\r\n repeating-conic-gradient(\r\n color-mix(in srgb, var(--px-gold) 8%, transparent) 0 25%,\r\n transparent 0 50%\r\n ) !important;\r\n background-size: 3px 100%, 4px 4px !important;\r\n background-position: 0 0, 0 0 !important;\r\n background-repeat: no-repeat, repeat !important;\r\n}\r\nhtml[data-pixel-ui] [role='menuitem'] {\r\n transition:\r\n background-color var(--px-t-fast) var(--px-step-2),\r\n color var(--px-t-fast) var(--px-step-2);\r\n}\r\n/* 危险菜单项(退出登录等)保留红色语义,不跟着菜单 hover 变金。 */\r\nhtml[data-pixel-ui] button[role='menuitem'][class*='danger']:hover {\r\n color: var(--px-state-error, var(--dsw-alias-state-error-primary, #E74C3C)) !important;\r\n background-image: linear-gradient(\r\n var(--px-state-error, var(--dsw-alias-state-error-primary, #E74C3C)),\r\n var(--px-state-error, var(--dsw-alias-state-error-primary, #E74C3C))\r\n ) !important;\r\n background-size: 3px 100% !important;\r\n background-repeat: no-repeat !important;\r\n}\r\nhtml[data-pixel-ui] [role='treeitem'][aria-selected='true'] {\r\n background-color: var(--px-wood-dark) !important;\r\n background-image: linear-gradient(var(--px-gold), var(--px-gold));\r\n background-repeat: no-repeat;\r\n background-position: 0 0;\r\n background-size: 2px 100%;\r\n color: var(--px-gold-bright) !important;\r\n}\r\n/* 已选中的会话行也要有 hover 反馈:宿主把 selected 和 hover 写成同一个背景,\r\n * 我们的 selected 规则又在 hover 之后,不补这一条就会出现「悬停完全没反应」。 */\r\nhtml[data-pixel-ui] [role='treeitem'][aria-selected='true']:hover {\r\n background-color: var(--px-wood-mid) !important;\r\n}\r\n/* 未选中的会话/项目行:hover 时补 2px 金色左侧条,别只靠一档底色。 */\r\nhtml[data-pixel-ui] [role='treeitem']:hover:not([aria-selected='true']) {\r\n background-image: linear-gradient(var(--px-gold-deep), var(--px-gold-deep));\r\n background-repeat: no-repeat;\r\n background-position: 0 0;\r\n background-size: 2px 100%;\r\n color: var(--px-parchment) !important;\r\n}\r\nhtml[data-pixel-ui] [role='menuitem'][aria-current='page'] {\r\n background-color: var(--px-wood-dark) !important;\r\n background-image: linear-gradient(var(--px-gold), var(--px-gold));\r\n background-repeat: no-repeat;\r\n background-position: 0 0;\r\n background-size: 3px 100%;\r\n color: var(--px-gold-bright) !important;\r\n}\r\n/* 侧栏/列表的当前项:3px 金色左条,不占布局。 */\r\nhtml[data-pixel-ui] [aria-current='page'] {\r\n background-color: var(--px-wood-mid) !important;\r\n color: var(--px-gold-bright) !important;\r\n background-image: linear-gradient(var(--px-gold), var(--px-gold));\r\n background-repeat: no-repeat;\r\n background-position: 0 0;\r\n background-size: 3px 100%;\r\n}\r\nhtml[data-pixel-ui] [aria-current='page']:hover {\r\n background-color: var(--px-wood-mid) !important;\r\n background-image:\r\n linear-gradient(var(--px-gold), var(--px-gold)),\r\n repeating-conic-gradient(\r\n color-mix(in srgb, var(--px-gold) 8%, transparent) 0 25%,\r\n transparent 0 50%\r\n ) !important;\r\n background-size: 3px 100%, 4px 4px !important;\r\n background-position: 0 0, 0 0 !important;\r\n background-repeat: no-repeat, repeat !important;\r\n}\r\n/* 吸顶分组标题:粘住时补 2px 底线,和滚动内容分开。 */\r\nhtml[data-pixel-ui] [data-stuck] {\r\n border-bottom: 2px solid var(--px-wood-light) !important;\r\n background-image: repeating-conic-gradient(\r\n color-mix(in srgb, var(--px-gold) 5%, transparent) 0 25%,\r\n transparent 0 50%\r\n ) !important;\r\n background-size: 4px 4px !important;\r\n}\r\n/* 终端块 / diff 卡片:左侧运行条 + 代码块同款描边。 */\r\nhtml[data-pixel-ui] [data-terminal] {\r\n border: 2px solid var(--px-wood-light) !important;\r\n}\r\nhtml[data-pixel-ui] [data-terminal][data-running] {\r\n border-left: 3px solid var(--px-gold) !important;\r\n animation: px-running 1.1s steps(2, end) infinite;\r\n}\r\nhtml[data-pixel-ui] [data-diff] {\r\n border-left: 4px solid var(--px-gold-deep) !important;\r\n}\r\n/* 标签:左侧 2px 色条代替圆角/渐变;色条落在原有 8px 内边距里,不改宽。 */\r\nhtml[data-pixel-ui] [data-tone] {\r\n border-radius: 0 !important;\r\n background-image: linear-gradient(currentColor, currentColor);\r\n background-repeat: no-repeat;\r\n background-position: 0 center;\r\n background-size: 2px calc(100% - 4px);\r\n}\r\n\r\n/* ── 反馈层:toast / dialog / 思考中 / 状态点 ───────────────────── */\r\nhtml[data-pixel-ui] [role='alert'] {\r\n border: 2px solid var(--px-line) !important;\r\n border-left: 4px solid var(--px-gold) !important;\r\n background-color: var(--px-tooltip-bg) !important;\r\n color: var(--px-parchment) !important;\r\n animation: px-toast-in var(--px-t-slow) steps(3, end) both;\r\n}\r\nhtml[data-pixel-ui] [role='alert'][data-closing] {\r\n animation: px-toast-out 120ms steps(2, end) both;\r\n}\r\nhtml[data-pixel-ui] [role='dialog'] {\r\n border: 2px solid var(--px-line) !important;\r\n background-image:\r\n linear-gradient(var(--px-gold), var(--px-gold)),\r\n linear-gradient(var(--px-gold), var(--px-gold)),\r\n linear-gradient(var(--px-gold), var(--px-gold)),\r\n linear-gradient(var(--px-gold), var(--px-gold)) !important;\r\n background-size: 10px 2px, 2px 10px, 10px 2px, 2px 10px !important;\r\n background-position: 0 0, 0 0, 100% 100%, 100% 100% !important;\r\n background-repeat: no-repeat !important;\r\n}\r\n/* 思考中的行:保留宿主文字,但把 1.5s 的平滑扫光改成 4 帧阶梯,\r\n * 并在左侧补一条 2px 的闪烁光标(位置由宿主 decoration 承担,不加布局)。 */\r\nhtml[data-pixel-ui] [data-shimmer] {\r\n position: relative;\r\n}\r\nhtml[data-pixel-ui] [data-shimmer] > [aria-hidden='true'] {\r\n background-image: linear-gradient(var(--px-gold), var(--px-gold));\r\n background-size: 2px 100%;\r\n background-position: 0 0;\r\n background-repeat: no-repeat;\r\n animation: px-blink 1.2s steps(1, end) infinite;\r\n}\r\nhtml[data-pixel-ui] [data-shimmer] > [aria-hidden='true'] * {\r\n color: var(--px-gold) !important;\r\n animation-duration: 1.2s !important;\r\n animation-timing-function: steps(4, end) !important;\r\n}\r\nhtml[data-pixel-ui] span[data-state='ongoing'] {\r\n animation: px-blink 1.1s steps(1, end) infinite;\r\n}\r\nhtml[data-pixel-ui] [data-state='ongoing'] * {\r\n animation-timing-function: steps(8, end) !important;\r\n}\r\n\r\n/* ── 像素光标(SVG data-URI 阶梯箭头) ──────────────────────────── */\r\nhtml[data-pixel-ui] body {\r\n cursor: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' shape-rendering='crispEdges'%3E%3Cpath d='M2 2v17h3v-3h3v-3h3v-3h3v-3h3V2z' fill='%23FFFDF5' stroke='%231A0F06' stroke-width='2'/%3E%3C/svg%3E\") 2 2, auto;\r\n}\r\n/* 浅色纸面:白填充的箭头会和纸面糊在一起,换成深棕填充 + 纸白描边。 */\r\nhtml[data-pixel-theme='pixel-paper'] body {\r\n cursor: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' shape-rendering='crispEdges'%3E%3Cpath d='M2 2v17h3v-3h3v-3h3v-3h3v-3h3V2z' fill='%233A2A10' stroke='%23FFFDF5' stroke-width='2'/%3E%3C/svg%3E\") 2 2, auto;\r\n}\r\nhtml[data-pixel-ui] button,\r\nhtml[data-pixel-ui] a,\r\nhtml[data-pixel-ui] select,\r\nhtml[data-pixel-ui] [role='tab'],\r\nhtml[data-pixel-ui] [role='menuitem'],\r\nhtml[data-pixel-ui] [role='switch'],\r\nhtml[data-pixel-ui] [role='treeitem'],\r\nhtml[data-pixel-ui] [role='option'],\r\nhtml[data-pixel-ui] [role='button'],\r\nhtml[data-pixel-ui] [role='link'],\r\nhtml[data-pixel-ui] [aria-selected],\r\nhtml[data-pixel-ui] [aria-current] {\r\n cursor: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' shape-rendering='crispEdges'%3E%3Cpath d='M2 2v17h3v-3h3v-3h3v-3h3v-3h3V2z' fill='%23F4D03F' stroke='%231A0F06' stroke-width='2'/%3E%3C/svg%3E\") 2 2, pointer;\r\n}\r\n/* 宿主的 .sessionRow / .projectRow 只在行上写 cursor:pointer;子 span 若被\r\n * 宿主另写 cursor 会导致箭头/默认小手混用。让可交互行内的非文本子元素继承\r\n * 同一个像素手,输入框和 contenteditable 保持像素 I-beam。 */\r\nhtml[data-pixel-ui] :is(button, a, select, [role='tab'], [role='menuitem'], [role='switch'], [role='treeitem'], [role='option'], [role='button'], [role='link']) *:not(input):not(textarea):not([contenteditable='true']) {\r\n cursor: inherit !important;\r\n}\r\nhtml[data-pixel-ui] input,\r\nhtml[data-pixel-ui] textarea,\r\nhtml[data-pixel-ui] [contenteditable='true'] {\r\n cursor: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' shape-rendering='crispEdges'%3E%3Cpath d='M5 3h4v2h2v2h2v2h2v2h2v2h2v6h-2v2h-4v2H5z' fill='%23FFFDF5' stroke='%231A0F06' stroke-width='2'/%3E%3C/svg%3E\") 4 3, text;\r\n}\r\n\r\n/* ── 设置页「像素主题」行 ─────────────────────────────────────────\r\n * 这一段**不跟随皮肤作用域**:像素主题激活时用 --px-* 值,\r\n * 现代默认(浅色/深色/跟随系统)回落到 --dsw-alias-* 宿主 token,\r\n * 保证行在任何外观下都清晰可点、对比度达标。\r\n * 触摸目标 ≥32px(WCAG 2.2 web 目标 24px 之上留手感余量)。 */\r\n.px-theme-row {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n padding: 12px 0;\r\n border-top: 2px solid var(--px-wood-pale, var(--dsw-alias-border-l2, #6b5a3a));\r\n}\r\n.px-theme-row-title {\r\n font-family: var(--px-font, inherit);\r\n font-size: 12px;\r\n font-variant-ligatures: none;\r\n color: var(--px-gold-bright, var(--dsw-alias-label-primary));\r\n}\r\n.px-theme-row-desc {\r\n font-size: 11px;\r\n line-height: 1.6;\r\n color: var(--px-text-light, var(--dsw-alias-label-secondary));\r\n}\r\n.px-theme-row-cubes {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 8px;\r\n}\r\n.px-theme-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 6px;\r\n min-height: 32px;\r\n padding: 6px 12px;\r\n font-family: var(--px-font, inherit);\r\n font-size: 11px;\r\n font-variant-ligatures: none;\r\n color: var(--px-text-on-dark, var(--dsw-alias-label-primary));\r\n background-color: var(--px-wood-dark, var(--dsw-alias-bg-layer-1));\r\n border: 2px solid var(--px-wood-darkest, var(--dsw-alias-border-l1));\r\n border-radius: 0 !important;\r\n cursor: pointer;\r\n transition:\r\n transform var(--px-t-fast, 80ms) steps(2, end),\r\n background-color var(--px-t-fast, 80ms) steps(2, end),\r\n background-image var(--px-t-fast, 80ms) steps(2, end);\r\n}\r\n.px-theme-btn:hover {\r\n background-color: var(--px-wood-mid, var(--dsw-alias-bg-layer-2));\r\n background-image: repeating-conic-gradient(\r\n color-mix(in srgb, var(--px-gold, #F4D03F) 7%, transparent) 0 25%,\r\n transparent 0 50%\r\n );\r\n background-size: 4px 4px;\r\n}\r\n.px-theme-btn:active {\r\n transform: translate(1px, 1px);\r\n transition-duration: 0s;\r\n}\r\n.px-theme-btn:focus-visible {\r\n outline: 2px solid var(--px-gold, var(--dsw-alias-state-business-primary, currentColor));\r\n outline-offset: 2px;\r\n}\r\n.px-theme-btn-active {\r\n color: var(--px-accent-ink, var(--dsw-alias-label-on-accent, #fff));\r\n background-color: var(--px-accent-bg, var(--dsw-alias-brand-primary));\r\n background-image: repeating-conic-gradient(\r\n color-mix(in srgb, var(--px-accent-ink, #1A0F06) 8%, transparent) 0 25%,\r\n transparent 0 50%\r\n );\r\n background-size: 4px 4px;\r\n border-color: var(--px-gold-deep, var(--dsw-alias-border-l2));\r\n}\r\n.px-theme-btn-active:hover {\r\n background-color: var(--px-accent-hover, var(--dsw-alias-button-primary-hover, var(--px-accent-bg)));\r\n}\r\n.px-theme-swatch {\r\n width: 10px;\r\n height: 10px;\r\n border: 2px solid #000;\r\n flex-shrink: 0;\r\n}\r\n\r\n/* ── 真 PNG 9-slice 素材层:全息 / 南瓜灯 / 便签本 ───────────────────\r\n * 三套素材主题共用下面这一层规则,差异全部收敛到 --pxa-* 变量\r\n * (图片、切片、边框宽度、重复方式、文字色)。素材在构建时由\r\n * scripts/asset-inline.mjs 转成 data URI:浏览器端不再依赖宿主素材路由,\r\n * 换素材只需要重新 build + 刷新页面,不必重启 DSH Desktop。\r\n * 素材:Complete UI Essential Pack v2.4 © Crusenho Agus Hennihuno,\r\n * CC BY 4.0;每套的源文件映射与署名见 assets/complete-ui/<theme>/ATTRIBUTION.md。\r\n *\r\n * v1.7 留下的两条硬规则:\r\n * ① Tooltip / Toast 不套大面板图,只换成 2px 主题色边(木刻版翻车点);\r\n * ② 横条主按钮和方形图标按钮用不同素材,绝不把 96×32 塞进方块。\r\n */\r\n\r\n/* 全息:深蓝 + 青。96×96 面板、96×32 主按钮、32×32 图标框。 */\r\nhtml[data-pixel-theme='pixel-hologram'] {\r\n --px-wood-darkest: #071426;\r\n --px-wood-dark: #10233B;\r\n --px-wood-mid: #1A2E4A;\r\n --px-wood-warm: #244A6A;\r\n --px-wood-light: #3E8FB0;\r\n --px-wood-pale: #9BC4D4;\r\n --px-text-on-dark: #E8F7FF;\r\n --px-text-light: #9BC4D4;\r\n --px-parchment: #E8F7FF;\r\n --px-gold: #14DCEE;\r\n --px-gold-bright: #7DF3FF;\r\n --px-gold-dark: #0FA8B8;\r\n --px-gold-deep: #0B6F7A;\r\n --px-sidebar-fill: #081624;\r\n --px-line: #1B5A6A;\r\n --px-accent-bg: #2C416D;\r\n --px-accent-hover: #385586;\r\n --px-accent-ink: #E8F7FF;\r\n --px-input-bg: #1A2E4A;\r\n --px-input-text: #E8F7FF;\r\n --px-input-ph: #8FB6C9;\r\n --px-input-caret: #14DCEE;\r\n --px-tooltip-bg: #0A1A2E;\r\n --px-code-bg: #071426;\r\n --px-code-ink: #7DF3FF;\r\n --px-code-meta: #9BC4D4;\r\n --px-ink-on-mid: #E8F7FF;\r\n --px-topbar-fill: #10233B;\r\n --px-dither: #0C1E33;\r\n --pxa-panel: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAABARJREFUeJztnUtugzAQhocIVekiioQ4ArfobbroojlPu8git+ktOAJCqrJIVUWhi9bEARv8GBii/p9UNbUpM5nBeLDHOCEDeVk3pvIhqiJL8rJuur+HjvGV4apD97Opfi6qIkuG6nuVeVk3249y8KSfT8XoiX1xkTuVLqGyXRjTLzUpst4fjpfzqXfwKn2ky/lEW9pt6O9K5lBSyX14fzua5NlYpY9E9LyhyKvaJNtV/pCdiGjUVm2hbgSXE3+/7jafT8Xol3Mh1gDfr7tNjHyTbB/5Y+XKViYnJET9K9DnxAPfyxluA0jXm8ptTkhtzd8F/X+GlB2t8xV8h6z3h6O6XepOWEkq9d94eH87bj/KmygTDpiZrhPaKOg3orjS/XusXKJuyfWmclWm345aB+j3aJ/ORapuyfWmcuux1rN7MqSo1Dmn0ImbWfqApRpiCQ6+6054qY71QdwBSzbiVLrpowjRUdCSDTgnLvZbpY/09fLcPhHnnFHQf2fMfpNHQSAMOECQqsgSOECQvKwbOEAYOECYqDAUEdEV1zBUpyqyBGEoEyFhaNsHfD4VbNOLwJ02CqqKLIET5gdRkDB4DlgAK+4MN+DOzWCcQoVKGA31R7eNLQzV54OJiFbdZFVl0Mv51PsxlYMrY3ZSn1VmBBGehMVBHyAMWoAwvT4AzEvavQW5RkHogHkIjoIAD70WAMIIGY4m6ixRAuEEZ0WgE5YFYagwKyL7KkUwPSnR7yrF9f5wpJHBJFM5IqI4MCcsDKIgRlyGo4moTdAlQifMistwtJ4dTQQHiAMHCAMHCIPURGEQhgqCvCBhjGkpIBzX54CbMiIk53Lh8hzQBcm5wrS3oKrIEirrZku7zXp/OPq8BQQdcxg3CzS6IAqanrysGyRmCYMwVBiEocwM5VWZFulhUp4Z3zDUmheEzLjpycu6sbYAZMZND8aChEEYKgw64QWA5FwmQpNz0QKYcFnMaHpXhPVBDFOS82C9BWEwbh5wCxIGzwEz0319fesApKjPh75SPiWC8TnxGQ0l0tYHwPg8XM4nrzViwZlxiIZ4QGacMIiChIEDhIEDhMGkPBPRryrA+oA4Ql9VgChIGNE+YGyXunuREQOLA6S+pLRxOeRP3gKkjTTEEnRbdBgqaaC5ZLPtprrU3VJj5Mec2zsMjYmClrpb6pS6DR2DfcTuCDhAGDhAALWZZ1VkSUJ0nZL8fbU6P18vz1GrL6fSS4Lu62ranCB9XpizE9a3bg3FNmVqkzvlcltdD1976Fe+KrMuU+VQ1iQwiD+9XOatORw+hKseXWy26BlGtQQOWIz/h6tenDJj9Ohi08uo6NTZckqRvKwbtbGxKtfL9OO45drKptLBdlH8AItA04fuFeYIAAAAAElFTkSuQmCC\");\r\n --pxa-panel-slice: 24 fill;\r\n --pxa-panel-width: 24px;\r\n --pxa-panel-repeat: stretch;\r\n --pxa-menu: var(--pxa-panel);\r\n --pxa-menu-slice: 20 fill;\r\n --pxa-menu-width: 10px;\r\n --pxa-button: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAAAgCAYAAADtwH1UAAAAAXNSR0IArs4c6QAAANhJREFUaIHt2LENgzAQheGHlQkiCgbIasyBPIdXYwAXESuQJkY2MkqDzlL8fxUCitM72zpZAgAAAMwNVx/GddstC+lVtQHjuu3TvFjX0p0YvB7nl3n4MXhN86IYvHlx/+acY8q42AG18HG/fGEfDSB8ezF4OYnwreVHkSP8tlx6IPw2jgYQfhvFDoA99/sX3C0/bWhAA8UU1LCOLp2HHRpgKA8/Bq/36zkwBRmphS8xBZm4Cl9SeRuamsAN6D1SjlfhS9LA3b+NWvjStwEtCupNLXwAAIB+fQDKgHLEoJpwFQAAAABJRU5ErkJggg==\");\r\n --pxa-button-hover: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAAAgCAYAAADtwH1UAAAAAXNSR0IArs4c6QAAAKtJREFUaIHt2TEOwyAQRNEB5YQ+gg+2R8gV141JEMJKk2UL/qssews0IyiwBAAAACxXnj4c7r5yIbuaFnC4+7l6JRsySa/xJeHHse65ZVz7AcKPdeobfPM5ggh/PdO9Awg/TyX8XPX3CCJRQDIKSEYBySggGQUko4AkJuldSqGABC18qdsB9jiOf+rDl4YjyEQRkcbwpe46muuIWLPwJanw52uNWfgAAAD7ugDNuSljuyndMAAAAABJRU5ErkJggg==\");\r\n --pxa-button-active: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAAAgCAYAAADtwH1UAAAAAXNSR0IArs4c6QAAAL1JREFUaIHt2bENwyAUhOEDZYLIhQfwap7DYg5W8wAUkVdwisgOQkSp4BX8X2XZFOhOUDxLAAAAQHfu14dpP86eGxlVtYBpP8553XrvZTgpBj3Kl4TfTorhfr4y9vkCwm9rXjeV+d5XEOH3l2L4nADCt+MJ35b/vwQtUYAxCjBGAcYowBgFGKMAIykGvZanowADV/hSdgLyQRHaycOXiisoxUARDZXhS/qOoxlHtFULX5Icf776qIUPAAAwrje7uT3lHa4XNQAAAABJRU5ErkJggg==\");\r\n --pxa-button-slice: 8 20 fill;\r\n --pxa-button-width: 6px 10px;\r\n --pxa-button-ink: #E8F7FF;\r\n --pxa-button-hover-ink: #E8F7FF;\r\n --pxa-icon: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAMNJREFUWIXtl00KwkAMhd88quBCBOkRegtvpOfRG3mLHkEK4kKwJXU1/lRMC9pJF8lyXpL3QSBMAgDkZdXCIE7FOoRovjqWSc3PmwIAEPKyaqP5/LC/pDC/bXfLCMH4mMq860UtEQBIPeVnffIAgtmoevZBRILkWyGzhdpkiE7UEBGIiA7wTGoexdJc1eZDdPmmq+gJwgEcwBzA94D5CBzAAcwBfA+Yj6D/U4p6ZL0nujP7tz4dgHgupYhXL/vjFLA9z+878Ykw7yfaGgAAAABJRU5ErkJggg==\");\r\n --pxa-icon-slice: 8 fill;\r\n --pxa-icon-width: 5px;\r\n --pxa-input: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAFhJREFUWIXtziEZgDAUAOEbHxg0Yt3QmJUgBIEogSQBYoICUGB6z9wVuB+CSwDLXT+AvO1d59d5pKHrsZEAAQIECBAgQIAAAQIECAgHjABzWQF4nykUE9IPGr4I7mcYsWgAAAAASUVORK5CYII=\");\r\n --pxa-input-slice: 10 fill;\r\n --pxa-input-width: 8px;\r\n --pxa-input-ink: #E8F7FF;\r\n --pxa-placeholder: #9BC4D4;\r\n --pxa-caret: #14DCEE;\r\n --pxa-select: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAE9JREFUWIXt1KERACEMRNENcxUwCAqgNeq4RimBoQVQKHxi/lNx+1UkAAhm9yhjbc/h2bJJ0nfHa/8996Wx9mzZku/qiwACCCAg/BUDAMIdSUQP3t7ChOIAAAAASUVORK5CYII=\");\r\n --pxa-select-slice: 10 fill;\r\n --pxa-select-width: 8px;\r\n --pxa-ink: #E8F7FF;\r\n --pxa-accent: #14DCEE;\r\n --pxa-accent-bright: #7DF3FF;\r\n --pxa-hover-wash: rgba(20, 220, 238, 0.1);\r\n --pxa-tooltip-bg: #0A1A2E;\r\n --pxa-tooltip-ink: #E8F7FF;\r\n}\r\nhtml[data-pixel-theme='pixel-hologram'] body {\r\n background-color: var(--px-wood-darkest);\r\n background-image:\r\n linear-gradient(rgba(20, 220, 238, 0.045) 1px, transparent 1px),\r\n linear-gradient(90deg, rgba(20, 220, 238, 0.045) 1px, transparent 1px);\r\n background-size: 24px 24px;\r\n}\r\nhtml[data-pixel-theme='pixel-hologram'] ::-webkit-scrollbar-thumb {\r\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAFlJREFUWIXt0rENgDAMBdGDERAjsP9EjBCxAvQ0KPbvuFdGSs5SDJKkv1s6l/fzut9n49im3lyT8YrSAKl4aYBkHCZ34Cs++//Q2IFEPDZANR4ZoBOXJAngAWGqFA9rfCGtAAAAAElFTkSuQmCC\") center / 100% 100% no-repeat !important;\r\n border: 2px solid var(--px-wood-darkest) !important;\r\n}\r\nhtml[data-pixel-theme='pixel-hologram'] ::-webkit-scrollbar-track {\r\n background: var(--px-wood-dark);\r\n border-left: 2px solid var(--px-line);\r\n}\r\n\r\n/* 南瓜灯:暖橙藤蔓包边。frame_full 30px 只给对话框;菜单用 frame_simple,\r\n * 避免小块浮层被厚藤蔓包成“门板”。 */\r\nhtml[data-pixel-theme='pixel-pumpkin'] {\r\n --px-wood-darkest: #170D06;\r\n --px-wood-dark: #241409;\r\n --px-wood-mid: #2F1B0C;\r\n --px-wood-warm: #3A2210;\r\n --px-wood-light: #8A4A18;\r\n --px-wood-pale: #D89A5A;\r\n --px-text-on-dark: #FFE9C9;\r\n --px-text-light: #D8A76F;\r\n --px-parchment: #FFE9C9;\r\n --px-gold: #FF9E2C;\r\n --px-gold-bright: #FFC85E;\r\n --px-gold-dark: #D97706;\r\n --px-gold-deep: #8A4A18;\r\n --px-sidebar-fill: #1B0F07;\r\n --px-line: #0E0703;\r\n --px-accent-bg: #FF9E2C;\r\n --px-accent-hover: #FFB45C;\r\n --px-accent-ink: #2A1206;\r\n --px-input-bg: #3A2210;\r\n --px-input-text: #FFF6E6;\r\n --px-input-ph: #F2C795;\r\n --px-input-caret: #FFC85E;\r\n --px-tooltip-bg: #1C0F07;\r\n --px-code-bg: #120A05;\r\n --px-code-ink: #FFC85E;\r\n --px-code-meta: #D8A76F;\r\n --px-ink-on-mid: #FFE9C9;\r\n --px-topbar-fill: #241409;\r\n --px-dither: #20120A;\r\n --pxa-panel: url(\"data:image/png;base64,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\");\r\n --pxa-panel-slice: 30 fill;\r\n --pxa-panel-width: 30px;\r\n --pxa-panel-repeat: round;\r\n --pxa-menu: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAuFJREFUWIXFl79LG2EYxz93Go4EL3j+INqKFdriVMRJRAu6lNJi6NKpi4vUf0Chm10Vd8HFpS3tKLRbm4B1SJcgWYQOlaCYGJvTi01NSr0O+sZE7707k0C/S+7u836f5z3yPO/7Hlzo5asB+/3bxzYSufFGvKq4SB+pfElty2K48ka8iriwv47ZT97s099+xsrT2+dwfNMXb8SrigFsmfS3n5E+Upn9uAdb5vlzD96IF0AVAwrJECt9ofNZ9oUoJEOXA2UcqNt7wdXCWqnmP1nKddXcu/FGvIKr8ZROIRlirvuQD0Z/7YBkCMGd5MaqvW6xW97t7bweDQwufDYs8laOR8UQ5UygkmDDymAfdzIQKVeei9+dA42dA82RVXtlsaOJmOJaqfMzebKmScQweBjuufaWG1YGQMqEd3G1A1kXVNqILZPZ3SLpI7VSLAwZNZO4qqxpAkiZSC6LrYxvKkp1perDRWZ3i5VK1YeLNZO4qn3LAqA3HL7GqpO7xW4trJXQhy+NS7ku6CtW7qsrWSSUTURITMhPbF9dUK+a1gVZ05S+vZNOSiUU2+an+rc5XXCT5NXqDYc9u8B1L1hc7SBiGI5FdpPkDe0F9UzianJfe4EoFK/1/CbyE7vSBU6HhmZ1gVtsNZqIKfGUzqcXvaSPVOa6D2HIQJ/W6u6Cfcsia5psWBncYkcTMUUFmFouOxbK1HK57rcX8op9oyKUFeJVVlcRCsmKMGIYjt0gkjkxP7FbRgODC7fObOa6Dyneucv9H0W03j+UMwHKmQDxlE66dIL17Ddjz+9hfTtf5XRNQ9c0IoZxjQG0BYPYx514xfa1FAN87zkjb+XQtgO0BYO0BYP8Oj2lLRh0ZFnTbN5SLFtO52fyAFLWtAOJ26ECkDIvr+8DiZRPa54HDi/+34/lrfGUzgTOEsuljDfiFVwBWB+ZtCceFBwTRBMxxY0D1Out6YL1kclrn8/RRMwXb8T7D0nQvI83eiFSAAAAAElFTkSuQmCC\");\r\n --pxa-menu-slice: 12 fill;\r\n --pxa-menu-width: 12px;\r\n --pxa-button: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAAAgCAYAAADtwH1UAAAAAXNSR0IArs4c6QAAAdtJREFUaIHtmr9rwkAUx78XnAIRXNq5Q5aCFEHoYAMKnTNJ/wL/iNLOLf0HuvkXlE7OBQPaQRCCZHTo3C6CAdfrkB89zV3aUM1BfJ8ped57Hu/L5S55j0GATzscEtjVO9u1rQdtbrU2wEUjMtiOzBVYTrZiVN1PJBMjRhybXvDPW54EIw6M7YCdPjEgFoCSr4FYBKZ67BDlUNs1vNwtdczjaLh5tLfuGX8+58kmISb/5KzUeVWer4+f61SExQpG6JuZwZT8/SPLaeibMOrDeeb4RJRDfThnhu5JHDsGnYL0wacdTitAM4byFZs4PLYDWgGaIQE0QwJohgTQDAmgGRJAMySAZgwqxGhkOaEVoBsDi1XGKH67JvaDNKeLFdh60ObWw3Va3aeK2GFJizG2g/D+jYry2oiL8rQHaCaqCQNA34VyFci+mBZdMUmMqvuJ5OXzdQQA8R7Q2kQ/9F15EMlGjYuGulssL0bV/URUMeLkh74ZCQAAqQhEKSTNEDUvsNBthgh9UymCrHOiqGBJjKr7ifyWTy+wolPQ6LLHu82w0B8S/8MLLLizMUtbUvJE8AIrYysqWBKj6n4iefl0Z2MGCK2J7mzMRuhJOySSwSKqsSqSGFX3E/lLPr8Bg9wAHp0LUGYAAAAASUVORK5CYII=\");\r\n --pxa-button-hover: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAAAgCAYAAADtwH1UAAAAAXNSR0IArs4c6QAAAZdJREFUaIHt2jFLw0AUB/B3hzgUUnDR2SGLiwiFDjVDwbUd/QT9Bi6ic8XF0a2fwLFdBQutQ6FQQscMzroEGnBwOYcm8ZpcSoUmD5L/b0qOu9fjPdKmeSECAICqEvqJmraUcdLlu0iOrXoNZV18E50frQdsx/wJ3mQjRtnX6VIxQvrc+EB93qooGOTMdkicPAqisABIPoOwCCLraweKcZAceLnzOPZRGdcP9sa5UM9nKvqR0JN/fFrovkrv6+PvOC6C65MMFrXUZCR//0w5DRY1kvXBPHX7BMWoD+ZCcm+i6iTugvioaUvhCmAmM/9iQ/5sh3AFMEMBmKEAzFAAZigAMxSAGQrATKIRw8ib4ArgJsn1U4P6s2vYD2NOXZ/EqtdQVv8q7u6jI5avuBljOxTcv6ZbksmWGeRLjpcW9x4qa7y01q+lDJtt1Rk2KfOOyPTE9L93T1GMsq/TbcnnqDuj7uxNxO3IuAiGIKObw9Rw5+kn+22xLTHKvk6XFSNKPlHi1cRhs23sjkWTd5mbJYpR9nW6XfL5C+ygxLhF60T2AAAAAElFTkSuQmCC\");\r\n --pxa-button-active: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAAAgCAYAAADtwH1UAAAAAXNSR0IArs4c6QAAAatJREFUaIHt2r9Lw0AUB/B3hyAUUnDR2SGLICIUHGrAgnNHZ4f+EWJnxX/ArYOzY+dCC61DoFBKxw7OuhQaEJzOob147d0FhaYP0u9nSo671/Ae+dG8EAEAsBHmjhpUlXPS5ZtYH5s3Kio4/yI6O1gMhJH7F6b9lRhFX2eyYiyZc9MN9XGndDDIWRiROHoSRMsCIPkMlkUQvssObMfe+sDr/ZTjOHbGzWO4si/U84nSNwkz+YfHWz2uwvt8/91OizCekUxGJWsykr95rpwmoxLJcmtoPT7BdpRbQyG5D2LXSTwF8VGDqsIZwEx6/2JD/sKIcAYwQwGYoQDMUABmKAAzFIAZCsBMohHDaNrHGcBN0nhmDZrvrmEznDkdz0jMGxUVPFyn3X10xPKVNmPCiJJmx25JrrfMIF+4BzAT7YuaujpNyLwMWVxvTP/79KRjFH2dKSOfSbNDvUmw+C5opQiOIMnLtzUc3O77vxbLiFH0dSZfDJ38etwVaT9YF8GlNwmsMd9cHx2j6OtMWfmsx11BZHwXVI+7ok01Z3tSTzb55vroGEVfZ/pLPn8APFXe+1RXkcQAAAAASUVORK5CYII=\");\r\n --pxa-button-slice: 6 8 12 8 fill;\r\n --pxa-button-width: 6px 8px 10px 8px;\r\n --pxa-button-ink: #FFF6E6;\r\n --pxa-button-hover-ink: #FFF6E6;\r\n --pxa-icon: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAXdJREFUWIXtlzFKxEAUhv8ZthrIwjZaW0wjyCIIFmtgvcBW4gn0DuIBxAvY7QnEai9gIGshLAwhZQprbQIO2I5FnNnsmMwSlky2yFcl897L//PIJG8ISqjlRMGCXLwRAPi+OVPB6Q8wHhUBHtqpBVnsrivFAMBcqM87pYtbh4cgh4/EGPAqbpkgVW33ycBeeL7PWhW8fuAb9xRJ7k38n0aSYyAFQzBerx0ctWvg62N9LQUDHc5XZie0LW5rDOcrQtuXdEO73AVqOVHdd6D2k+oDHmIPOtAb6A30BnwPImWyeB86UJoHvJPkoFIwM+FOb/mWit0xGjyEFKz7obTzd4Cop+NiHriaobIL+m/ZtEOuOh4CL4vCgDm5aBM2f4kYj+pPQzZZDPNyO54pBSsMAIAx4QkpGACARmmwsVCVWBfbJuB6JgBEaVDsgsX5pZqeyMYiuxClAWbvr8SM5HUmdIeaGnTVaXGgdDrWJuxknVgVc+Gq0zEA+AVN0Zgm2m+SswAAAABJRU5ErkJggg==\");\r\n --pxa-icon-slice: 4 4 10 4 fill;\r\n --pxa-icon-width: 4px 4px 6px 4px;\r\n --pxa-input: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAPVJREFUWIXtl6EKwlAYhc9/MQkOBNFsFUSEocEFfYEl0Rew+QI+gi9gW7Jp1AdQ0AVlIBaLwawMhAnWa5BdhxOT/iv3pMtfvi/ccA4hEnkeSDCECkNSbwVfN1jgCmy5pATkqMQKBwBUsiDLJUoEHpFIvd+mEx8AkC/+ntes5WI3wQUHgOXW/y6QRAT1DzQfF/jJbRtkuSQAoFm+8QscVwAAEfRMmane+QX2V8h1Qyb/B7SAFtACWkALaAHD8XQf0H1ApdN91ubL6T+wT7U8tgtCCa4Iw/HotkuzQsOQ5ZIap0HPZJ1ohuO9xmmYWb3FImFvFor7AGwxRw9r77CvAAAAAElFTkSuQmCC\");\r\n --pxa-input-slice: 6 fill;\r\n --pxa-input-width: 6px;\r\n --pxa-input-ink: #FFF6E6;\r\n --pxa-placeholder: #F2C795;\r\n --pxa-caret: #FFC85E;\r\n --pxa-select: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAU9JREFUWIXtlzFKA0EYhb9/DRZCAlsFD2AjyCIELLJCvEAqj5AuB9AmVRo9gN1WHkEPoGC2EBYkCGk8gVUgASthLLKzyc5O2Gp3LeY1M/zvzf8/2Fl4I+xAfd8qvZfunZi1XWjedtams/UGyDZq1s83OLncrF9vtr5bXqNMZ/ASxpIZUA+nRfeBv1nnS3tjzWuU6Uw+8JEwFrEOrwuBj9fY8BQtszC6+QXg+PCgkoHTae7u4sl4Ic+P3VqGA0wm6Re/HiJhLB7A4Gxd2cC9SP8KbzXqqfb5T/0G5kvUrK8av4TOgDPgDDgDzoAz4Ax4nSjJElGt+C+JSMxEVGsoDfxiKo7uC6VK0fglFABbMF1/HAGwL7BqXqNMZ+NlvJAWQCdKZDXq5Z5or59tAAZ7nGteo0xn8p0o2T5ONZ4urjITw/cXMWu70LztrE1n6w3wBwNidr7sF3ekAAAAAElFTkSuQmCC\");\r\n --pxa-select-slice: 6 fill;\r\n --pxa-select-width: 6px;\r\n --pxa-ink: #FFE9C9;\r\n --pxa-accent: #FF9E2C;\r\n --pxa-accent-bright: #FFC85E;\r\n --pxa-hover-wash: rgba(255, 158, 44, 0.12);\r\n --pxa-tooltip-bg: #1C0F07;\r\n --pxa-tooltip-ink: #FFE9C9;\r\n}\r\nhtml[data-pixel-theme='pixel-pumpkin'] body {\r\n background-color: var(--px-wood-darkest);\r\n background-image: repeating-conic-gradient(rgba(255, 158, 44, 0.045) 0 25%, transparent 0 50%);\r\n background-size: 4px 4px;\r\n}\r\n\r\n/* 便签本:撕角活页纸 + 铅笔光标。panel 的左边 18px 是活页孔,\r\n * 用 repeat round 让孔按比例排布,而不是被拉成长椭圆。 */\r\nhtml[data-pixel-theme='pixel-papernote'] {\r\n --px-wood-darkest: #F2E6D2;\r\n --px-wood-dark: #F6ECD9;\r\n --px-wood-mid: #EFE3CE;\r\n --px-wood-warm: #E6D7BC;\r\n --px-wood-light: #C9AF8A;\r\n --px-wood-pale: #A8895F;\r\n --px-text-on-dark: #3A2412;\r\n --px-text-light: #6E4E2E;\r\n --px-parchment: #FFFAF2;\r\n --px-gold: #6E3A10;\r\n --px-gold-bright: #8C4A16;\r\n --px-gold-dark: #5A2E0C;\r\n --px-gold-deep: #4A2408;\r\n --px-sidebar-fill: #F6ECD9;\r\n --px-line: #8C5A2C;\r\n --px-accent-bg: #A3551B;\r\n --px-accent-hover: #8C4713;\r\n --px-accent-ink: #FFF9F1;\r\n --px-input-bg: #FFF9F1;\r\n --px-input-text: #3A2412;\r\n --px-input-ph: #7A5A38;\r\n --px-input-caret: #8C4A16;\r\n --px-tooltip-bg: #2E1C0C;\r\n --px-code-bg: #F0E2CC;\r\n --px-code-ink: #6E3A10;\r\n --px-code-meta: #7A5A38;\r\n --px-ink-on-mid: #3A2412;\r\n --px-topbar-fill: #F6ECD9;\r\n --px-dither: #E9DAC0;\r\n --px-check: var(--px-check-light);\r\n --px-radio: var(--px-radio-light);\r\n --pxa-panel: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAAXNSR0IArs4c6QAABCVJREFUeJztnT2S8jAMhgVDT0XHQej3BtRwOrbmBvQcJB3VniBbEIMsSw6ByM5m32fmm4+JZcc/a8eWJXtx2FBLDnzfaBF+y3d832jh9d6a8DITxeWWYYEVEdHpeh4/N7t9Gyo6SX+3T5/NAVZmIlGvXZiMolfQ9kt/QXOJZZrL838Zt7nQcbe/Z0KmF+JZ6WpyXMaSCzJa2jKdV98jy9vzbrXMLEw2QtwALNJxu378PjU/aYa0SswVPBd3jDBN5hV5Kx7R+3nkcUW6shHUHiCFDhtq1UboY0gFzAWrzKxn8fpdEKUfSaL0I/pWAwAd1hOWRPfKtr7SwIHtF52uZzpsqF3xv/7HX3lzIdrt0+fgc8QQFU9DQ2DXQsABMWtcJYHab+DGiug5d+VTT6L70COfvRL2jtwU6cs7H5qtugsyIfzU/DzXCpRZBwBnupnQUj4Ezog6XhpiwAvxEV7mAoETbKiPVsLWRwXrgJFhyrkVEVM7bNe6/nq7hipiLMQIs5rjxsikERpXdUPmuNuXzdQ/Rl0Jn65n6II8MVURAeiCfGGzzbgB+G4OVsV+mOsAIlR8YdKFGChK2gOwEvZFbMikyjj0Al+6+o32hGUgcKZ3GkrQBbnBKv+woTZqAF7p0AWNjPi2nq7nuzLu+0aLsOqdq9HsJDBMMSO7INVOFIwPN0vR7IKgCyqHbp4OXZAfmmGWGogpqQ/ZPWFQHDRAZWAVUQNTFyQCgT+wjKtMtBKGXVAhpDIOdkEFkXZBRLqPGHBCOmhYXpLAEdMqoguELsiZXhcl6IL8EJ71aQ9gjnrAAVGv2JSvgXTUBoVoLs9DTLrvKuyCStBVfIB7pKqzIDAyynE9YaYJu6AamDtiDOiCyvDwlCfqKlo5VAi6oJHhCzFZ0TXy86+AMq4yWWUc9+CDLqgI8BGrQdZHDHZBRcFKuAZw0psOWAmXJusjFgSAH9gPmBbmqYnQBZVB3ZKELqgckTIugGOMneHT0OAflrvxAoxIThn3uHgAuiA/XlLGQRdUDHNHDNNRR1gvgH9AZaCKKE326GL0AH963VTRCEVJhyAMQ/7ALqgyfUPQcbsmvkL+qzdgTJbsmXGgKKoyDjhjWsbRUy+k3i8GPqfPMi66zA2MT68yDj5i/pi6oBAIigEfsRqY6wCM+2XQVsLadYbaVX5DriaU1/hNlaFl0mTlc63sXAZXGdaEXWOFIagGcgjiK2Gr6wAfkpVw8BODYZYjzPhtXj5iU7dtFUP8YUPtMnyE+b+hCb0cNpRP38Nl+uSHvMuS7XsH0zCEeh5+YFNfZrRj2o2j2814OTktTf5cnMcTpS/jchmr52j5kOlzty7+/oxc2HOZ1ZH1/KrwKcONn23DrD/Go1C7fRtupyBSToavSMgTn+DM5sYMzbh4ajeCaFbnv8g+yu7Ryv7IAAAAAElFTkSuQmCC\");\r\n --pxa-panel-slice: 12 8 12 18 fill;\r\n --pxa-panel-width: 12px 8px 12px 18px;\r\n --pxa-panel-repeat: stretch round;\r\n --pxa-menu: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAMZJREFUWIXtl7ENwyAQRR8WPZU7BqHPBtRmOlx7g/QexB2VJyBFbEKX7i5S+B0I6R+n/3RglpmKktaCsQB538A/ZN2PJ4RYp34veUfyTrQO25uvBQOAdzUfp0wBa8EQoloO7DJTWwa8qwBStwcwmhTAlQEtClKIDAoGBbZfSBrfmr4fESxAhYI+hBoUTC2ESmohzMc5KFCRPgW9+ZgFf0nBDz3JgBQiINSJ60k2ZsFnFuwbdyfyvr3/bpIFNGNhGQAtEtaCeQEYeX/dSgetuAAAAABJRU5ErkJggg==\");\r\n --pxa-menu-slice: 6 fill;\r\n --pxa-menu-width: 6px;\r\n --pxa-button: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAAAgCAYAAADtwH1UAAAAAXNSR0IArs4c6QAAASlJREFUaIHt2iEOgzAUBuC/BI/C4Uk4AZ4boOnpiuYGeE6wZB6H2gk6scHagtvKS8b/qdEgXt5fuoQHQEQkRoULXQ4rUchV9Ivf89S96HJYc79BlxXMNJxb2Z/TdQtzvwFlZd0QtgDW5nuK5rwK/9k8bj/DELwnQJfVyZVdi9vfLoftFygvAB478Rz2tm5tCgR/vDx2fu+op+9jKelyWO58OQkA7npBiXQBV8cAhDEAYQxAGAMQxgCEMQBhDEAYAxDGAIQxAGHpbsUZHmz4rigafyBTt7sb+Kb0x4INnq6LZn5AFxncsSQnZHG4G/3zBMwjzDS8BvLhbPjoWKKv9QuUcqdhZhqAooEuMsm6LmEdyivgM5LkeR+Xrtvdd0HbBT/Iii9sPhGRsCcxOlS7B3jCOgAAAABJRU5ErkJggg==\");\r\n --pxa-button-hover: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAAAXNSR0IArs4c6QAAAR1JREFUaIHtmTEOgzAMRX+q7Ezd2CtxAnZuwNycLszcoDsnQGJnY+IEdAjQJKLq1Fhy/CbiLPbHGNkGhLxRV8bnHVtqR1LRLWHM58EP2g59Sp+SYeoWQCiCBlzwduiBsoEpC3dTNgQu/pH5BQCw0wg8qu0Q4UbqFBF2Gs+M14fxSA/umEd1Pj/v2LR/aYeetRBxbTN1i0AAdt+9TxzbXhNuZwHMFFcEOb/5H2T5F/ARAagdoEYEoHaAGhGA2gFqRABqB6gRAYLT3iDkhOsG5xfsvH6mQbsNAPs+IcgAO68AXJ/MeS7go2PD10xgirqcB/jDUcZ0C5SKdwDHdJgjpizgT7+7BUp3y54F0/gZGDJO+3g3cLkY4Uq8FRIEAW9z5lUxZXlYggAAAABJRU5ErkJggg==\");\r\n --pxa-button-active: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAAAgCAYAAADtwH1UAAAAAXNSR0IArs4c6QAAASlJREFUaIHt2iEOgzAUBuC/BI/C4Uk4AZ4boOnpiuYGeE6wZB6H2gk6scHagtvKS8b/qdEgXt5fuoQHQEQkRoULXQ4rUchV9Ivf89S96HJYc79BlxXMNJxb2Z/TdQtzvwFlZd0QtgDW5nuK5rwK/9k8bj/DELwnQJfVyZVdi9vfLoftFygvAB478Rz2tm5tCgR/vDx2fu+op+9jKelyWO58OQkA7npBiXQBV8cAhDEAYQxAGAMQxgCEMQBhDEAYAxDGAIQxAGHpbsUZHmz4rigafyBTt7sb+Kb0x4INnq6LZn5AFxncsSQnZHG4G/3zBMwjzDS8BvLhbPjoWKKv9QuUcqdhZhqAooEuMsm6LmEdyivgM5LkeR+Xrtvdd0HbBT/Iii9sPhGRsCcxOlS7B3jCOgAAAABJRU5ErkJggg==\");\r\n --pxa-button-slice: 8 6 10 6 fill;\r\n --pxa-button-width: 6px 5px 8px 6px;\r\n --pxa-button-ink: #3A2412;\r\n --pxa-button-hover-ink: #6E3A10;\r\n --pxa-icon: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAMZJREFUWIXtl7ENwyAQRR8WPZU7BqHPBtRmOlx7g/QexB2VJyBFbEKX7i5S+B0I6R+n/3RglpmKktaCsQB538A/ZN2PJ4RYp34veUfyTrQO25uvBQOAdzUfp0wBa8EQoloO7DJTWwa8qwBStwcwmhTAlQEtClKIDAoGBbZfSBrfmr4fESxAhYI+hBoUTC2ESmohzMc5KFCRPgW9+ZgFf0nBDz3JgBQiINSJ60k2ZsFnFuwbdyfyvr3/bpIFNGNhGQAtEtaCeQEYeX/dSgetuAAAAABJRU5ErkJggg==\");\r\n --pxa-icon-slice: 6 fill;\r\n --pxa-icon-width: 6px;\r\n --pxa-input: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAAAXNSR0IArs4c6QAAAOVJREFUaIHtmbERhSAQRBeHFswshNwOiLU6je3g5xZiZhH8BJABYnYG7oWSrO84gjsFzzbDoXPOFyr/poDv54/7ap2pGbuxAEoJuqj8srZL1YrnB8AX2FiXStDxYBByCVM8WdY+q1/huK/Y9podpiXhHQhsM9wwAmptvhs7yA2otbZ/GKfyZCxEADsAGxHADsBGBLADsBEB7ABsRAA7ABsRwA7ARgSwA7ARAewAbEQAOwCbbyboZ2SRQUbkGijHxV0vSrJCF5uhXEaPpHtCfb5QMNYVVc9bojPCaiwuCUdYjwfS5egfS5w8Vq4TIVoAAAAASUVORK5CYII=\");\r\n --pxa-input-slice: 4 4 6 4 fill;\r\n --pxa-input-width: 4px 4px 5px 4px;\r\n --pxa-input-ink: #3A2412;\r\n --pxa-placeholder: #7A5A38;\r\n --pxa-caret: #8C4A16;\r\n --pxa-select: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAMZJREFUWIXtl7ENwyAQRR8WPZU7BqHPBtRmOlx7g/QexB2VJyBFbEKX7i5S+B0I6R+n/3RglpmKktaCsQB538A/ZN2PJ4RYp34veUfyTrQO25uvBQOAdzUfp0wBa8EQoloO7DJTWwa8qwBStwcwmhTAlQEtClKIDAoGBbZfSBrfmr4fESxAhYI+hBoUTC2ESmohzMc5KFCRPgW9+ZgFf0nBDz3JgBQiINSJ60k2ZsFnFuwbdyfyvr3/bpIFNGNhGQAtEtaCeQEYeX/dSgetuAAAAABJRU5ErkJggg==\");\r\n --pxa-select-slice: 6 fill;\r\n --pxa-select-width: 6px;\r\n --pxa-ink: #3A2412;\r\n --pxa-accent: #8C5A2C;\r\n --pxa-accent-bright: #6E3A10;\r\n --pxa-hover-wash: rgba(140, 90, 44, 0.14);\r\n --pxa-tooltip-bg: #2E1C0C;\r\n --pxa-tooltip-ink: #FFFAF2;\r\n --pxa-outline: #8C5A2C;\r\n}\r\nhtml[data-pixel-theme='pixel-papernote'] body {\r\n background-color: var(--px-wood-darkest);\r\n background-image: repeating-conic-gradient(rgba(140, 90, 44, 0.04) 0 25%, transparent 0 50%);\r\n background-size: 4px 4px;\r\n}\r\n/* 便签本:铅笔光标覆盖一切——按钮/链接/输入框/正文都不再退回像素手或\r\n * I-beam,否则一块纸面上会同时出现三种指针。热区在笔尖 (4,4):素材是\r\n * 左上笔尖、右下橡皮,之前写成 26 26 等于点在橡皮上。 */\r\nhtml[data-pixel-theme='pixel-papernote'] body,\r\nhtml[data-pixel-theme='pixel-papernote'] body * {\r\n cursor: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAWNJREFUWIVjYBgFIx0wogvEiDL8x6V4yWtM9ZQCFmyCX6wD4Oz19cEICbfY/9R2BBM+SWTLY91iGRZPCMIbQlR1wGRfHQzLGRgYqO4IrA6Y7KvDIGOkzvDk3E0Uy2GAmo7AGQJPzt1kqKxoYWgONcYqTy1H4HQAzHIFa3mGB0cf0swRWFN0jCjDf2SfwxyhYC2P1ZDYgnVkZ1GcmujlCLwa6OEIgopp7QiiFNLSEUS7lFaOICm+aOEIklMtsY64YdTKwMDAwNBqp4nXEWTlXUKOgFmuERrKwMDAwBD78gpOR5BdteJyxI/cJSiWwwAuR+CtjvGBJa8ZGGtXn4XzYZbfuXMHw3J8gGwHoDviimcDw507dxh8KisZnrz5Qx8HoDvCILWU4cmbPwwyIixEO4JqzasYUYb/7cwacD7METIiLHgTIVVBjCjD/8cSGnD8X0fnP6HqmuquQreQLj4fBaOAEgAArfrJfFZraPoAAAAASUVORK5CYII=\") 4 4, auto !important;\r\n}\r\n\r\n/* ── 共用 9-slice 规则:只在素材主题生效 ─────────────────────────── */\r\n/* 便签的纸面几乎与页面同色,补 2px 墨线把「纸」钉出来;其他素材主题的\r\n * 边缘本身对比足够,--pxa-outline 不设即透明。 */\r\nhtml[data-pixel-asset] [role='dialog'],\r\nhtml[data-pixel-asset] [data-menu-material] {\r\n outline: 2px solid var(--pxa-outline, transparent);\r\n outline-offset: -2px;\r\n}\r\nhtml[data-pixel-asset] [role='dialog'] {\r\n border: var(--pxa-panel-width, 24px) solid transparent !important;\r\n border-image: var(--pxa-panel) var(--pxa-panel-slice, 24 fill) / var(--pxa-panel-width, 24px) / 0 var(--pxa-panel-repeat, stretch) !important;\r\n background: transparent !important;\r\n color: var(--pxa-ink) !important;\r\n box-sizing: border-box !important;\r\n}\r\nhtml[data-pixel-asset] [data-menu-material] {\r\n border: var(--pxa-menu-width, 10px) solid transparent !important;\r\n border-image: var(--pxa-menu) var(--pxa-menu-slice, 10 fill) / var(--pxa-menu-width, 10px) / 0 stretch !important;\r\n background: transparent !important;\r\n box-sizing: border-box !important;\r\n overflow-x: hidden !important;\r\n}\r\nhtml[data-pixel-asset] [role='menu']:not([data-menu-material]) {\r\n border: 0 !important;\r\n border-image: none !important;\r\n background: transparent !important;\r\n}\r\nhtml[data-pixel-asset] [role='menuitem'] {\r\n color: var(--pxa-ink) !important;\r\n background: transparent !important;\r\n background-image: none !important;\r\n}\r\nhtml[data-pixel-asset] [role='menuitem']:hover {\r\n color: var(--pxa-accent-bright) !important;\r\n background-color: var(--pxa-hover-wash) !important;\r\n background-image: none !important;\r\n}\r\nhtml[data-pixel-asset] button[class*='primary'],\r\nhtml[data-pixel-asset] button[class*='Primary'] {\r\n border: var(--pxa-button-width) solid transparent !important;\r\n border-image: var(--pxa-button) var(--pxa-button-slice) / var(--pxa-button-width) / 0 stretch !important;\r\n background: transparent !important;\r\n color: var(--pxa-button-ink) !important;\r\n min-height: 32px;\r\n}\r\nhtml[data-pixel-asset] button[class*='primary']:hover,\r\nhtml[data-pixel-asset] button[class*='Primary']:hover {\r\n border-image-source: var(--pxa-button-hover) !important;\r\n color: var(--pxa-button-hover-ink, var(--pxa-button-ink)) !important;\r\n background: transparent !important;\r\n background-image: none !important;\r\n}\r\nhtml[data-pixel-asset] button[class*='primary']:active,\r\nhtml[data-pixel-asset] button[class*='Primary']:active {\r\n border-image-source: var(--pxa-button-active, var(--pxa-button)) !important;\r\n transform: translate(1px, 1px) !important;\r\n transition-duration: 0s !important;\r\n}\r\n/* 图标主按钮(发送/关闭):用方形图标框,绝不把横条按钮塞进方块。 */\r\nhtml[data-pixel-asset] button[class*='primary']:has(> svg:only-child),\r\nhtml[data-pixel-asset] button[class*='Primary']:has(> svg:only-child) {\r\n border: var(--pxa-icon-width) solid transparent !important;\r\n border-image: var(--pxa-icon) var(--pxa-icon-slice) / var(--pxa-icon-width) / 0 stretch !important;\r\n background: transparent !important;\r\n color: var(--pxa-button-ink) !important;\r\n min-height: 0;\r\n}\r\nhtml[data-pixel-asset] button[class*='primary']:has(> svg:only-child):hover,\r\nhtml[data-pixel-asset] button[class*='Primary']:has(> svg:only-child):hover {\r\n border-image-source: var(--pxa-icon) !important;\r\n color: var(--pxa-accent-bright) !important;\r\n}\r\nhtml[data-pixel-asset] input:not([type='checkbox']):not([type='radio']):not([type='range']),\r\nhtml[data-pixel-asset] textarea,\r\nhtml[data-pixel-asset] [contenteditable='true'] {\r\n border: var(--pxa-input-width, 8px) solid transparent !important;\r\n border-image: var(--pxa-input) var(--pxa-input-slice, 10 fill) / var(--pxa-input-width, 8px) / 0 stretch !important;\r\n background: transparent !important;\r\n color: var(--pxa-input-ink) !important;\r\n caret-color: var(--pxa-caret) !important;\r\n box-sizing: border-box !important;\r\n}\r\nhtml[data-pixel-asset] input::placeholder,\r\nhtml[data-pixel-asset] textarea::placeholder {\r\n color: var(--pxa-placeholder) !important;\r\n -webkit-text-fill-color: var(--pxa-placeholder) !important;\r\n opacity: 1;\r\n}\r\nhtml[data-pixel-asset] [contenteditable='true']:empty::before {\r\n color: var(--pxa-placeholder) !important;\r\n -webkit-text-fill-color: var(--pxa-placeholder) !important;\r\n}\r\nhtml[data-pixel-asset] [role='menuitem'][aria-current='page'],\r\nhtml[data-pixel-asset] [role='treeitem'][aria-selected='true'] {\r\n border: var(--pxa-select-width, 8px) solid transparent !important;\r\n border-image: var(--pxa-select) var(--pxa-select-slice, 10 fill) / var(--pxa-select-width, 8px) / 0 stretch !important;\r\n background: transparent !important;\r\n background-image: none !important;\r\n color: var(--pxa-ink) !important;\r\n box-sizing: border-box !important;\r\n}\r\n/* 浮层只换颜色:2px 主题色边 + 实色底,不套面板图。 */\r\nhtml[data-pixel-asset] [role='tooltip'] {\r\n border: 2px solid var(--pxa-accent) !important;\r\n border-image: none !important;\r\n background-color: var(--pxa-tooltip-bg) !important;\r\n color: var(--pxa-tooltip-ink) !important;\r\n}\r\nhtml[data-pixel-asset] [role='alert'] {\r\n border: 2px solid var(--pxa-accent) !important;\r\n border-left: 4px solid var(--pxa-accent) !important;\r\n border-image: none !important;\r\n background-color: var(--pxa-tooltip-bg) !important;\r\n color: var(--pxa-tooltip-ink) !important;\r\n}\r\nhtml[data-pixel-asset] [role='dialog'] button:not(:disabled):not([class*='primary']):not([class*='Primary']):hover {\r\n background-color: var(--pxa-hover-wash) !important;\r\n}\r\nhtml[data-pixel-asset] [role='tab']::after {\r\n background: var(--pxa-accent) !important;\r\n}\r\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BA,mBAAmC;AACnC,8BAA4B;;;AC/B5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ADmCO,IAAM,OAAO;AAGb,IAAM,SAAS,CAAC,SAAS,SAAS,QAAQ;AAGjD,IAAM,oBAAoB;AAG1B,IAAM,iBAAiB;AAQvB,IAAM,mBAAmB;AAGzB,IAAM,eAAe;AAWrB,IAAM,SAAS;AAAA,EACb;AAAA,IACE,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,uBAAuB;AAAA,MACvB,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,yBAAyB;AAAA,MACzB,yBAAyB;AAAA,MACzB,6BAA6B;AAAA,MAC7B,6BAA6B;AAAA,MAC7B,+BAA+B;AAAA,MAC/B,mCAAmC;AAAA,MACnC,qCAAqC;AAAA,MACrC,kCAAkC;AAAA,MAClC,kCAAkC;AAAA,MAClC,+BAA+B;AAAA,MAC/B,mCAAmC;AAAA,MACnC,oCAAoC;AAAA,MACpC,wCAAwC;AAAA,MACxC,yBAAyB;AAAA,MACzB,mCAAmC;AAAA,MACnC,uBAAuB;AAAA,MACvB,8BAA8B;AAAA,MAC9B,2BAA2B;AAAA,MAC3B,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,uBAAuB;AAAA,MACvB,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,yBAAyB;AAAA,MACzB,yBAAyB;AAAA,MACzB,6BAA6B;AAAA,MAC7B,6BAA6B;AAAA,MAC7B,+BAA+B;AAAA,MAC/B,mCAAmC;AAAA,MACnC,qCAAqC;AAAA,MACrC,kCAAkC;AAAA,MAClC,kCAAkC;AAAA,MAClC,+BAA+B;AAAA,MAC/B,mCAAmC;AAAA,MACnC,oCAAoC;AAAA,MACpC,wCAAwC;AAAA,MACxC,yBAAyB;AAAA,MACzB,mCAAmC;AAAA,MACnC,uBAAuB;AAAA,MACvB,8BAA8B;AAAA,MAC9B,2BAA2B;AAAA,MAC3B,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,uBAAuB;AAAA,MACvB,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,yBAAyB;AAAA,MACzB,yBAAyB;AAAA,MACzB,6BAA6B;AAAA,MAC7B,6BAA6B;AAAA,MAC7B,+BAA+B;AAAA,MAC/B,mCAAmC;AAAA,MACnC,qCAAqC;AAAA,MACrC,kCAAkC;AAAA,MAClC,kCAAkC;AAAA,MAClC,+BAA+B;AAAA,MAC/B,mCAAmC;AAAA,MACnC,oCAAoC;AAAA,MACpC,wCAAwC;AAAA,MACxC,yBAAyB;AAAA,MACzB,mCAAmC;AAAA,MACnC,uBAAuB;AAAA,MACvB,8BAA8B;AAAA,MAC9B,2BAA2B;AAAA,MAC3B,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,uBAAuB;AAAA,MACvB,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,yBAAyB;AAAA,MACzB,yBAAyB;AAAA,MACzB,6BAA6B;AAAA,MAC7B,6BAA6B;AAAA,MAC7B,+BAA+B;AAAA,MAC/B,mCAAmC;AAAA,MACnC,qCAAqC;AAAA,MACrC,kCAAkC;AAAA,MAClC,kCAAkC;AAAA,MAClC,+BAA+B;AAAA,MAC/B,mCAAmC;AAAA,MACnC,oCAAoC;AAAA,MACpC,wCAAwC;AAAA,MACxC,yBAAyB;AAAA,MACzB,mCAAmC;AAAA,MACnC,uBAAuB;AAAA,MACvB,8BAA8B;AAAA,MAC9B,2BAA2B;AAAA,MAC3B,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,uBAAuB;AAAA,MACvB,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,yBAAyB;AAAA,MACzB,yBAAyB;AAAA,MACzB,6BAA6B;AAAA,MAC7B,6BAA6B;AAAA,MAC7B,+BAA+B;AAAA,MAC/B,mCAAmC;AAAA,MACnC,qCAAqC;AAAA,MACrC,kCAAkC;AAAA,MAClC,kCAAkC;AAAA,MAClC,+BAA+B;AAAA,MAC/B,mCAAmC;AAAA,MACnC,oCAAoC;AAAA,MACpC,wCAAwC;AAAA,MACxC,yBAAyB;AAAA,MACzB,mCAAmC;AAAA,MACnC,uBAAuB;AAAA,MACvB,8BAA8B;AAAA,MAC9B,2BAA2B;AAAA,MAC3B,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,uBAAuB;AAAA,MACvB,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,yBAAyB;AAAA,MACzB,yBAAyB;AAAA,MACzB,6BAA6B;AAAA,MAC7B,6BAA6B;AAAA,MAC7B,+BAA+B;AAAA,MAC/B,mCAAmC;AAAA,MACnC,qCAAqC;AAAA,MACrC,kCAAkC;AAAA,MAClC,kCAAkC;AAAA,MAClC,+BAA+B;AAAA,MAC/B,mCAAmC;AAAA,MACnC,oCAAoC;AAAA,MACpC,wCAAwC;AAAA,MACxC,yBAAyB;AAAA,MACzB,mCAAmC;AAAA,MACnC,uBAAuB;AAAA,MACvB,8BAA8B;AAAA,MAC9B,2BAA2B;AAAA,MAC3B,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,uBAAuB;AAAA,MACvB,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,yBAAyB;AAAA,MACzB,yBAAyB;AAAA,MACzB,6BAA6B;AAAA,MAC7B,6BAA6B;AAAA,MAC7B,+BAA+B;AAAA,MAC/B,mCAAmC;AAAA,MACnC,qCAAqC;AAAA,MACrC,kCAAkC;AAAA,MAClC,kCAAkC;AAAA,MAClC,+BAA+B;AAAA,MAC/B,mCAAmC;AAAA,MACnC,oCAAoC;AAAA,MACpC,wCAAwC;AAAA,MACxC,yBAAyB;AAAA,MACzB,mCAAmC;AAAA,MACnC,uBAAuB;AAAA,MACvB,8BAA8B;AAAA,MAC9B,2BAA2B;AAAA,MAC3B,sBAAsB;AAAA,IACxB;AAAA,EACF;AACF;AAEA,IAAM,YAAY,OAAO,IAAI,CAAC,UAAU,MAAM,EAAE;AAGhD,IAAM,YAAY,oBAAI,IAAI,CAAC,kBAAkB,iBAAiB,iBAAiB,CAAC;AAGhF,IAAM,iBAAiB,oBAAI,IAAI,CAAC,SAAS,QAAQ,UAAU,GAAG,SAAS,CAAC;AAGxE,IAAM,YAAY;AAClB,IAAM,WAAW;AAAA,EACf,IAAI;AAAA,IACF,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,wBAAwB;AAAA,IACxB,uBAAuB;AAAA,IACvB,yBAAyB;AAAA,IACzB,gBAAgB;AAAA,EAClB;AAAA,EACA,IAAI;AAAA,IACF,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,wBAAwB;AAAA,IACxB,uBAAuB;AAAA,IACvB,yBAAyB;AAAA,IACzB,gBAAgB;AAAA,EAClB;AACF;AAGA,IAAM,gBAAgB;AAAA,EACpB,EAAE,IAAI,cAAc,QAAQ,UAAU;AAAA,EACtC,EAAE,IAAI,eAAe,QAAQ,UAAU;AAAA,EACvC,EAAE,IAAI,cAAc,QAAQ,UAAU;AAAA,EACtC,EAAE,IAAI,eAAe,QAAQ,UAAU;AAAA,EACvC,EAAE,IAAI,kBAAkB,QAAQ,UAAU;AAAA,EAC1C,EAAE,IAAI,iBAAiB,QAAQ,UAAU;AAAA,EACzC,EAAE,IAAI,mBAAmB,QAAQ,UAAU;AAAA,EAC3C,EAAE,IAAI,UAAU,QAAQ,UAAU;AACpC;AAGA,IAAM,YAAY,CAAC,QAAQ;AAQ3B,SAAS,sBAAsB;AAC7B,aAAO,qCAAY;AAAA,IACjB,MAAM,OAAO,EAAE,YAAY,MAAM,UAAU,GAAG;AAAA,IAC9C,SAAS;AAAA,MACP,MAAM,CAAC,OAAO,YAAY,aAAa;AACrC,YAAI,YAAY,MAAM,SAAU;AAChC,cAAM,aAAa;AACnB,cAAM,WAAW;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAWA,SAAS,SAAS,OAAO;AACvB,QAAM,aAAa,MAAM,SAAS,CAAC,UAAU,MAAM,UAAU;AAC7D,QAAM,IAAI,OAAO,MAAM,MAAM,aAAa,MAAM,IAAI;AACpD,aAAO,aAAAA;AAAA,IAAE;AAAA,IAAO,EAAE,WAAW,gBAAgB,MAAM,SAAS,cAAc,EAAE,WAAW,EAAE;AAAA,QACvF,aAAAA,eAAE,OAAO,EAAE,WAAW,qBAAqB,GAAG,EAAE,WAAW,CAAC;AAAA,QAC5D,aAAAA,eAAE,OAAO,EAAE,WAAW,oBAAoB,GAAG,EAAE,UAAU,CAAC;AAAA,QAC1D,aAAAA;AAAA,MAAE;AAAA,MAAO,EAAE,WAAW,qBAAqB;AAAA,MACzC,cAAc,IAAI,CAAC,eAAW,aAAAA;AAAA,QAAE;AAAA,QAAU;AAAA,UACxC,KAAK,OAAO;AAAA,UACZ,MAAM;AAAA,UACN,WAAW,kBAAkB,eAAe,OAAO,KAAK,yBAAyB;AAAA,UACjF,gBAAgB,eAAe,OAAO;AAAA,UACtC,SAAS,MAAM;AAAE,kBAAM,SAAS,OAAO,EAAE;AAAA,UAAE;AAAA,QAC7C;AAAA,YACE,aAAAA,eAAE,QAAQ,EAAE,WAAW,mBAAmB,eAAe,QAAQ,OAAO,EAAE,YAAY,OAAO,OAAO,EAAE,CAAC;AAAA,QACvG,EAAE,SAAS,OAAO,EAAE,EAAE;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAQA,SAAS,iBAAiB;AACxB,MAAI;AACF,UAAM,QAAQ,aAAa,QAAQ,iBAAiB;AACpD,WAAO,eAAe,IAAI,KAAK,IAAI,QAAQ;AAAA,EAC7C,QAAQ;AAAE,WAAO;AAAA,EAAK;AACxB;AAMA,SAAS,gBAAgB,IAAI;AAC3B,MAAI;AAAE,iBAAa,QAAQ,mBAAmB,EAAE;AAAA,EAAE,QAAQ;AAAA,EAAoB;AAChF;AAOA,SAAS,gBAAgB;AACvB,MAAI;AACF,UAAM,QAAQ,WAAW,gBAAgB,GAAG;AAC5C,WAAO,OAAO,UAAU,YAAY,eAAe,IAAI,KAAK,IAAI,QAAQ;AAAA,EAC1E,QAAQ;AAAE,WAAO;AAAA,EAAK;AACxB;AAQA,eAAe,gBAAgB;AAC7B,QAAM,WAAW,cAAc;AAC/B,MAAI,aAAa,KAAM,QAAO;AAC9B,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,gBAAgB,EAAE,SAAS,EAAE,QAAQ,mBAAmB,EAAE,CAAC;AACnF,QAAI,CAAC,IAAI,GAAI,QAAO;AACpB,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAM,QAAQ,MAAM;AACpB,WAAO,OAAO,UAAU,YAAY,eAAe,IAAI,KAAK,IAAI,QAAQ;AAAA,EAC1E,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOA,SAAS,eAAe,IAAI;AAC1B,MAAI;AACF,UAAM,gBAAgB;AAAA,MACpB,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,OAAO,GAAG,CAAC;AAAA,IACpC,CAAC,EAAE,MAAM,MAAM;AAAA,IAAmD,CAAC;AAAA,EACrE,QAAQ;AAAA,EAA8B;AACxC;AAGO,SAAS,MAAM,KAAK;AAKzB,QAAM,YAAY,MAAM;AACtB,UAAM,SAAS,IAAI,MAAM,SAAS,EAAE;AACpC,UAAM,KAAK,UAAU,SAAS,OAAO,EAAE;AACvC,aAAS,gBAAgB,gBAAgB,iBAAiB,EAAE;AAC5D,QAAI,IAAI;AACN,eAAS,gBAAgB,aAAa,oBAAoB,OAAO,EAAE;AACnE,eAAS,gBAAgB,gBAAgB,oBAAoB,UAAU,IAAI,OAAO,EAAE,CAAC;AAAA,IACvF,OAAO;AACL,eAAS,gBAAgB,gBAAgB,kBAAkB;AAC3D,eAAS,gBAAgB,gBAAgB,kBAAkB;AAAA,IAC7D;AACA,WAAO;AAAA,EACT;AAGA,MAAI,WAAW;AAKf,MAAI,YAAY;AAEhB,MAAI,GAAG,gBAAgB,CAAC,aAAa;AACnC,cAAU;AACV,UAAM,OAAO,SAAS;AACtB,QAAI,UAAU;AACZ,iBAAW;AACX,sBAAgB,IAAI;AACpB,qBAAe,IAAI;AACnB;AAAA,IACF;AACA,QAAI,UAAU,SAAS,IAAI,GAAG;AAC5B,sBAAgB,IAAI;AACpB,qBAAe,IAAI;AACnB;AAAA,IACF;AACA,UAAM,OAAO,eAAe;AAC5B,QAAI,SAAS,QAAQ,UAAU,SAAS,IAAI,GAAG;AAG7C,UAAI;AAAE,YAAI,MAAM,SAAS,IAAI;AAAA,MAAE,QAAQ;AAAA,MAAe;AACtD;AAAA,IACF;AACA,QAAI,aAAa,SAAS,MAAM;AAI9B;AAAA,IACF;AAEA,oBAAgB,IAAI;AACpB,mBAAe,IAAI;AAAA,EACrB,CAAC;AAED,MAAI,OAAO,MAAM;AACf,UAAM,YAAY,OAAO,IAAI,CAAC,eAAe,IAAI,MAAM,SAAS,UAAU,CAAC;AAC3E,WAAO,MAAM;AAAE,iBAAW,WAAW,UAAW,SAAQ;AAAA,IAAE;AAAA,EAC5D,GAAG,kCAAkC;AAKrC,QAAM,cAAc,CAAC,WAAW;AAC9B,QAAI;AAAE,UAAI,MAAM,SAAS,MAAM;AAAA,IAAE,QAAQ;AAAA,IAAiC;AAC1E,cAAU;AACV,oBAAgB,MAAM;AACtB,WAAO,IAAI,MAAM,SAAS,EAAE,OAAO,OAAO;AAAA,EAC5C;AAEA,QAAM,UAAU,YAAY;AAC1B,UAAM,QAAQ,eAAe;AAC7B,QAAI,UAAU,MAAM;AAClB,kBAAY,KAAK;AACjB,YAAMC,QAAO,MAAM,cAAc;AACjC,UAAIA,UAAS,QAAQA,UAAS,IAAI,MAAM,SAAS,EAAE,WAAY,aAAYA,KAAI;AAC/E;AAAA,IACF;AACA,UAAM,OAAO,MAAM,cAAc;AAIjC,QAAI,CAAC,YAAY,QAAQ,YAAY,GAAG;AACtC,YAAM,IAAI,QAAQ,CAAC,YAAY;AAAE,mBAAW,SAAS,GAAG;AAAA,MAAE,CAAC;AAC3D,kBAAY,QAAQ,YAAY;AAAA,IAClC;AAAA,EACF;AAMA,QAAM,SAAS,MAAM;AAAE,gBAAY;AAAA,EAAM;AACzC,OAAK,QAAQ,EAAE,KAAK,QAAQ,MAAM;AAElC,MAAI,OAAO,MAAM,IAAI,OAAO,SAAS,WAAW,QAAQ,GAAG,yCAAyC;AAGpG,QAAM,WAAW,oBAAoB;AACrC,MAAI,QAAQ;AACZ,QAAM,UAAU,CAAC,aAAa;AAAE,WAAO,KAAK,SAAS,YAAY,SAAS,QAAQ;AAAA,EAAE;AACpF,MAAI,GAAG,gBAAgB,OAAO;AAC9B,MAAI,MAAM,OAAO,yBAAyB,MAAM,IAAI,MAAM,SAAS;AAAA,IACjE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ,CAAC,YAAY;AACnB,cAAQ;AAGR,cAAQ,IAAI,MAAM,SAAS,CAAC;AAC5B,aAAO,EAAE,UAAU,CAAC,OAAO;AAAE,mBAAW;AAAM,YAAI,MAAM,SAAS,EAAE;AAAA,MAAE,EAAE;AAAA,IACzE;AAAA,EACF,GAAG,QAAQ,CAAC;AAEZ,MAAI,OAAO,MAAM;AACf,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,QAAQ,SAAS;AACvB,UAAM,cAAc;AACpB,aAAS,KAAK,YAAY,KAAK;AAC/B,WAAO,MAAM;AACX,YAAM,OAAO;AACb,eAAS,gBAAgB,gBAAgB,eAAe;AACxD,eAAS,gBAAgB,gBAAgB,kBAAkB;AAAA,IAC7D;AAAA,EACF,GAAG,0BAA0B;AAC/B;",
6
+ "names": ["h", "host"]
7
7
  }