dsh-background-by-model 0.4.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["BG_MODES","clamp","clamp","Component","useState","createPortal","useRef","memo","useRef","useState","useCallback","useState","useRef","toHex","useRef","useState","useCallback","useState","useRef","useCallback","useState","useRef","useRef","useState","useRef"],"sources":["../src/client/runtime.ts","../src/client/i18n.ts","../src/schema.ts","../src/client/state.ts","../src/client/rpc.ts","../src/client/utils/color.ts","../src/client/wallpaper.ts","../src/client/modelbg.ts","../src/client/components/ui.css.ts","../src/client/components/icons.tsx","../src/client/components/ErrorBoundary.tsx","../src/client/components/Portal.tsx","../src/client/components/LiveSlider.tsx","../src/client/components/pages/InterfacePage.tsx","../src/client/utils/image.ts","../src/client/components/ColorWheel.tsx","../src/client/components/ColorInputs.tsx","../src/client/components/ColorPicker.tsx","../src/client/components/BgEditor.tsx","../src/client/components/pages/ModelBgPage.tsx","../src/client/components/pages/ProfilePage.tsx","../src/client/components/ThemeSection.tsx","../src/client/index.tsx"],"sourcesContent":["/**\r\n * Harness-version-agnostic access to the client runtime.\r\n *\r\n * Before dsh 0.1.2 the store primitive lived on the composite package\r\n * `@deepseek-ai/dsh-client-runtime` (the `/client` subpath). The new harness\r\n * split it into `@deepseek-ai/dsh-client-store`. Both specifiers are kept\r\n * external so they resolve against the host client-module table; a missing\r\n * table entry on one side throws (the \"missed the module table\" error) and is\r\n * caught, falling through to the other package. This lets one bundle load on\r\n * both the old npm release and the new source.\r\n *\r\n * The host's synchronous `require` is injected by the loader into the bundle\r\n * factory; tsdown keeps these two bare specifiers as external CJS requires so\r\n * they bind to that factory `require`.\r\n */\r\n\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\ninterface StoreModule {\r\n defineStore: any\r\n}\r\n\r\nfunction resolveStore(): StoreModule {\r\n try {\r\n // New harness (dsh >= 0.1.2): dedicated store package after the runtime\r\n // was split. Missing here means the loader table has no such row → throw.\r\n return require('@deepseek-ai/dsh-client-store') as StoreModule\r\n } catch {\r\n /* fall through to the legacy composite runtime below */\r\n }\r\n // Legacy harness (npm release): composite runtime, /client subpath.\r\n return require('@deepseek-ai/dsh-client-runtime/client') as StoreModule\r\n}\r\n\r\nexport const defineStore: any = resolveStore().defineStore","export const NS = 'settings.anyBg'\r\n\r\nexport const zh: Record<string, string> = {\r\n nav: '模型背景', brandTag: '按模型换背景', close: '关闭',\r\n pageInterface: '界面', pageModelBg: '模型背景', pageProfile: '配置',\r\n descInterface: '为主界面的各个区域单独调节透明度与模糊,营造空间层次感。这里的设置对所有模型生效',\r\n descModelBg: '每条规则 = 一个匹配串 + 一套背景外观。切换模型时,从上往下找第一条匹配串出现在模型名里的规则;都没中就使用第 1 条',\r\n descProfile: '把当前全部规则连同图片导出备份,或从文件一键恢复',\r\n\r\n uiTitle: '主界面',\r\n uiOpacity: '透明度', uiBlur: '模糊度',\r\n uiOpacityBg: '主背景', uiOpacitySide: '左侧栏', uiOpacityCard: '卡片与菜单面板', uiOpacityInput: '输入框与控件',\r\n uiSop: '设置界面透明度', uiChatRegion: '对话文本框', uiTrajectory: '轨迹页',\r\n uiPreview: '右侧栏',\r\n\r\n // Only the diagnostics survive: the model/rule readout they used to sit under\r\n // is gone (the match tester at the top of the page answers the same question).\r\n statusUnknownHint: '检测不到时一律使用第 1 条可用规则;切换一次模型或稍等片刻会自动重试',\r\n statusSourceDefaultHint: '只读到宿主默认模型,它不是本会话当前选择的模型;本会话的模型选择可用后会自动纠正',\r\n statusNoteNoService: '仍未拿到会话服务(会话控制器晚于本插件加载),正在自动重试',\r\n statusNoteNoSession: '会话服务已就绪,但还没有当前会话 id',\r\n statusNoteNoProjection: '拿不到本会话的模型选择投影(binding / projections 不可用)',\r\n statusNoteEmptySelection: '本会话的模型选择投影还没有值(切一次模型即可写入)',\r\n\r\n rulesTitle: '规则列表',\r\n rulesHint: '从上到下即为优先级。规则 1 同时兼任兜底:所有匹配串都没命中时使用它',\r\n tryoutTitle: '匹配试跑',\r\n tryoutPlaceholder: '输入模型名,如 deepseek-flash',\r\n tryoutUseCurrent: '填入当前模型',\r\n tryoutHit: '命中规则',\r\n tryoutFallback: '无匹配 · 走兜底规则',\r\n tryoutNone: '没有可用规则(规则需要启用并有图片)',\r\n tryoutEmpty: '输入模型名即可试跑',\r\n autoExtract: '选图后自动取主题色',\r\n autoExtractHint: '只在规则还没有颜色时自动取色,绝不覆盖你手动选的颜色',\r\n ruleAdd: '新增规则',\r\n ruleFallbackBadge: '兜底',\r\n ruleMatchLabel: '匹配串',\r\n ruleMatchPlaceholder: '如 flash / glm(忽略大小写,留空则不参与匹配)',\r\n ruleEnabled: '启用',\r\n ruleUp: '上移', ruleDown: '下移', ruleRemove: '删除规则',\r\n ruleNoImage: '尚未选择图片',\r\n rulePickImage: '选择图片', ruleChangeImage: '更换图片',\r\n ruleFromUrl: '从网址', ruleUrlPlaceholder: '粘贴图片网址 https://…',\r\n ruleUrlApply: '应用', ruleUrlCancel: '取消', ruleUrlApplying: '加载中…',\r\n ruleUrlBadHttp: '仅支持 http/https 图片网址', ruleUrlFail: '获取图片失败',\r\n ruleImageRemove: '移除图片',\r\n ruleEmptyHint: '这条规则还没有图片,不会被匹配到,也不会作为兜底',\r\n ruleColor: '主题色',\r\n ruleColorNone: '系统主题',\r\n ruleColorNoneHint: '未设颜色时跟随系统主题',\r\n ruleColorExtract: '从本图提取',\r\n ruleLayout: '布局模式',\r\n ruleFraming: '取景',\r\n ruleFramingEdit: '编辑位置',\r\n ruleFramingLocked: '仅「适应」模式可编辑位置',\r\n ruleOpacity: '背景透明度',\r\n ruleBlur: '背景模糊',\r\n ruleBlurHint: '背景模糊作用于壁纸层;界面页里的模糊作用于界面各区域,两者互不影响',\r\n\r\n colorHint: '在色轮外圈选择色相,在内部方形中调整饱和度和明度;双击滑块可恢复默认值',\r\n swatchTitle: '灵感色板',\r\n hexCaption: '当前颜色',\r\n\r\n bgModeFit: '适应', bgModeFill: '填充', bgModeStretch: '拉伸', bgModeTile: '平铺', bgModeCenter: '居中',\r\n editorTitle: '背景编辑器', editorHint: '拖动移动画面,滚轮缩放大小',\r\n editorCommit: '确认', editorCancel: '取消', editorReset: '重置',\r\n\r\n extractColor: '从图片提取主题色', extracting: '取色中…',\r\n extractNoWp: '请先为该规则选择图片',\r\n extractDone: '已应用图片配色',\r\n extractFail: '未在这张图里找到鲜明的颜色,请换一张',\r\n eyedropper: '从图片取色',\r\n pickerTitle: '从图片取色',\r\n pickerHint: '移动鼠标预览颜色,点击图片选取为主题色',\r\n pickerClose: '关闭',\r\n\r\n crashTitle: '界面渲染出错',\r\n crashDesc: '设置面板遇到问题,点击下方按钮重置后重试',\r\n crashReset: '重置面板',\r\n\r\n exportTheme: '导出配置', importTheme: '导入配置',\r\n exportCardTitle: '导出配置',\r\n exportCardDesc: '把全部规则、每条规则的颜色/布局/透明度/模糊与图片打包为 dsh-background-by-model-theme.json',\r\n importCardTitle: '导入配置',\r\n importCardDesc: '从之前导出的 JSON 文件一键恢复全部规则(会覆盖当前规则与图片)',\r\n toastExportDone: '配置文件已开始下载',\r\n importDone: '已导入配置',\r\n importFail: '导入失败,文件格式不正确',\r\n footerTag: '按模型换背景插件',\r\n}\r\n\r\nexport const en: Record<string, string> = {\r\n nav: 'Model background', brandTag: 'Per-model wallpaper', close: 'Close',\r\n pageInterface: 'Interface', pageModelBg: 'Model background', pageProfile: 'Profile',\r\n descInterface: 'Tune opacity and blur per surface to build depth. These settings are global and apply to every model',\r\n descModelBg: 'Each rule is a match string plus one look. On a model switch the list is scanned top-down for the first match string contained in the model name; if nothing hits, rule 1 is used',\r\n descProfile: 'Back up every rule together with its image, or restore one from a file',\r\n\r\n uiTitle: 'Interface',\r\n uiOpacity: 'Opacity', uiBlur: 'Blur',\r\n uiOpacityBg: 'Main background', uiOpacitySide: 'Left panel', uiOpacityCard: 'Cards & menus', uiOpacityInput: 'Input & controls',\r\n uiSop: 'Settings interface opacity', uiChatRegion: 'Conversation text frame', uiTrajectory: 'Trajectory view',\r\n uiPreview: 'Right panel',\r\n\r\n // Only the diagnostics survive: the model/rule readout they used to sit under\r\n // is gone (the match tester at the top of the page answers the same question).\r\n statusUnknownHint: 'Without a detected model rule 1 is always used; switching the model once or waiting a moment retries automatically',\r\n statusSourceDefaultHint: 'Only the host-wide default model could be read — that is not necessarily this session\\'s selection. It self-corrects once this session\\'s model selection is available.',\r\n statusNoteNoService: 'The sessions service is not available yet (the session controller loads after this plugin); retrying automatically',\r\n statusNoteNoSession: 'The sessions service is up but reports no current session yet',\r\n statusNoteNoProjection: 'This session\\'s model-selection projection is unreachable (no binding / projections)',\r\n statusNoteEmptySelection: 'The model-selection projection exists but carries no value yet (selecting a model once writes it)',\r\n\r\n rulesTitle: 'Rules',\r\n rulesHint: 'Top to bottom is the priority. Rule 1 doubles as the fallback — it is used when no match string hits',\r\n tryoutTitle: 'Match test',\r\n tryoutPlaceholder: 'Type a model name, e.g. deepseek-flash',\r\n tryoutUseCurrent: 'Use current model',\r\n tryoutHit: 'matches rule',\r\n tryoutFallback: 'no match · fallback rule',\r\n tryoutNone: 'No usable rule (a rule needs to be enabled and have an image)',\r\n tryoutEmpty: 'Type a model name to test the list',\r\n autoExtract: 'Extract the theme color when an image is chosen',\r\n autoExtractHint: 'Only fills a rule that has no color yet — a color you picked is never overwritten',\r\n ruleAdd: 'Add rule',\r\n ruleFallbackBadge: 'fallback',\r\n ruleMatchLabel: 'Match',\r\n ruleMatchPlaceholder: 'e.g. flash / glm (case-insensitive, empty never matches)',\r\n ruleEnabled: 'Enabled',\r\n ruleUp: 'Move up', ruleDown: 'Move down', ruleRemove: 'Remove rule',\r\n ruleNoImage: 'No image yet',\r\n rulePickImage: 'Choose image', ruleChangeImage: 'Replace image',\r\n ruleFromUrl: 'From URL', ruleUrlPlaceholder: 'Paste an image URL https://…',\r\n ruleUrlApply: 'Apply', ruleUrlCancel: 'Cancel', ruleUrlApplying: 'Loading…',\r\n ruleUrlBadHttp: 'Only http/https image URLs are supported', ruleUrlFail: 'Could not fetch the image',\r\n ruleImageRemove: 'Remove image',\r\n ruleEmptyHint: 'This rule has no image — it can neither match nor serve as the fallback',\r\n ruleColor: 'Theme color',\r\n ruleColorNone: 'System theme',\r\n ruleColorNoneHint: 'Without a color this rule follows the system theme',\r\n ruleColorExtract: 'Extract from image',\r\n ruleLayout: 'Layout mode',\r\n ruleFraming: 'Framing',\r\n ruleFramingEdit: 'Edit position',\r\n ruleFramingLocked: 'Position editing is only available in Fit mode',\r\n ruleOpacity: 'Background opacity',\r\n ruleBlur: 'Background blur',\r\n ruleBlurHint: 'Background blur affects the wallpaper layer; the blur on the Interface page affects interface surfaces — they are independent',\r\n\r\n colorHint: 'Pick hue on the outer ring, adjust saturation & lightness in the square; double-click a slider to reset',\r\n swatchTitle: 'Quick swatches',\r\n hexCaption: 'Current color',\r\n\r\n bgModeFit: 'Fit', bgModeFill: 'Fill', bgModeStretch: 'Stretch', bgModeTile: 'Tile', bgModeCenter: 'Center',\r\n editorTitle: 'Background editor', editorHint: 'Drag to move, scroll to zoom',\r\n editorCommit: 'Confirm', editorCancel: 'Cancel', editorReset: 'Reset',\r\n\r\n extractColor: 'Extract from image', extracting: 'Extracting…',\r\n extractNoWp: 'Choose an image for this rule first',\r\n extractDone: 'Image colors applied',\r\n extractFail: 'No vivid color found in this image, try another',\r\n eyedropper: 'Eyedropper',\r\n pickerTitle: 'Pick from image',\r\n pickerHint: 'Hover to preview, click to pick as the theme color',\r\n pickerClose: 'Close',\r\n\r\n crashTitle: 'Section crashed',\r\n crashDesc: 'The panel hit an error. Reset below to recover.',\r\n crashReset: 'Reset panel',\r\n\r\n exportTheme: 'Export', importTheme: 'Import',\r\n exportCardTitle: 'Export profile',\r\n exportCardDesc: 'Bundle every rule — color, layout, opacity, blur — and its image into dsh-background-by-model-theme.json',\r\n importCardTitle: 'Import profile',\r\n importCardDesc: 'Restore every rule and image from a previously exported JSON file (replaces the current set)',\r\n toastExportDone: 'Export started',\r\n importDone: 'Profile imported',\r\n importFail: 'Import failed — invalid file',\r\n footerTag: 'Per-model wallpaper plugin',\r\n}\r\n","/**\n * The persisted configuration shape — declared exactly ONCE, for both halves.\n *\n * This shape used to be written out twice: the node half owns persistence and\n * sanitizes every write, the browser half owns the UI and its own reading of the\n * same file. A field added to only one side was silently dropped by the other\n * side's sanitizer — the matching slider stayed live in memory, `writeConfig`\n * wrote a config without it, and the next load fell back to the default.\n * `blurs.rightbar` / `rightbarOpacity` in 0.3.2 was exactly that bug, and the key\n * lists were duplicated 6 times across the two halves, so it was due to happen.\n *\n * The types, the key lists, the defaults and the pure normalizers therefore live\n * here and both halves import them: adding a field means editing this file, and\n * the two halves cannot disagree about the shape. The host additionally logs one\n * warning per unknown key while sanitizing a write (see `warnUnknownConfigKeys`\n * in `src/index.ts`), so a field that reaches the node half without being\n * declared here shows up in the host log instead of quietly disappearing.\n *\n * Nothing in this module may touch the DOM, Node or the Cordis context: it is\n * imported by the browser bundle and by the node half alike.\n */\n\n/** Placement state of one background image (zoom + fractional center + intrinsic size). */\nexport interface BgState { zoom: number; x: number; y: number; iw: number; ih: number }\n\nexport const DEFAULT_BG_STATE: BgState = { zoom: 1, x: 0, y: 0, iw: 0, ih: 0 }\n\n/** Adaptive placement of a background image. */\nexport type BgMode = 'fit' | 'fill' | 'stretch' | 'tile' | 'center'\n\n/** Every accepted `bgMode`, in UI order. */\nexport const BG_MODES: readonly BgMode[] = ['fit', 'fill', 'stretch', 'tile', 'center']\n\n/**\n * Main interface opacities (0..1), global (Interface page):\n * `bg` main background (`--dsw-alias-bg-base`)\n * `sidebar` sidebar (`--dsw-specific-sidebar-fill`)\n * `card` cards/panels (`--dsw-alias-bg-layer-1/2/3`, `--dsw-specific-menu`\n * and its 0.1.7 alias `--dsw-menu-surface-fill`)\n * `input` input/control surfaces (`--dsw-specific-input-major`)\n */\nexport const PART_OPACITY_KEYS = ['bg', 'sidebar', 'card', 'input'] as const\n\n/** Per-part main interface opacities (0..1), keyed BY the list above. */\nexport type PartOpacities = Record<(typeof PART_OPACITY_KEYS)[number], number>\n\nexport const DEFAULT_PART_OPACITIES: PartOpacities = { bg: 0.85, sidebar: 0.93, card: 1, input: 1 }\n\n/**\n * Interface blur (px, 0..60), global (Interface page):\n * `bg` main background (AppFrame grid)\n * `sidebar` sidebar column\n * `card` cards/panels (center + details columns, dialog option panels)\n * `settings` settings panel\n * `chat` conversation text region (message column of the chat view)\n * `trajectory` trajectory view surface\n * `rightbar` file-preview panel — the right sidebar a file click opens\n * `input` input/control surfaces ([data-composer-card], [data-cordis-panel])\n */\nexport const PART_BLUR_KEYS = ['bg', 'sidebar', 'card', 'settings', 'chat', 'trajectory', 'rightbar', 'input'] as const\n\n/** Per-part interface blur (px, 0..60), keyed BY the list above. */\nexport type PartBlurs = Record<(typeof PART_BLUR_KEYS)[number], number>\n\nexport const DEFAULT_PART_BLURS: PartBlurs = {\n bg: 0, sidebar: 0, card: 0, settings: 0, chat: 0, trajectory: 0, rightbar: 0, input: 0,\n}\n\n/**\n * One model rule: a match string plus everything the background needs while it\n * is the active rule. Every appearance field lives HERE rather than globally —\n * the settings UI edits a rule, and the render layer follows whichever rule the\n * current model selected.\n */\nexport interface BgRule {\n /** Stable id; also the render key. */\n id: string\n /**\n * Case-insensitive substring tested against the current model text (provider,\n * model id and display name joined with spaces). An EMPTY string never matches\n * on its own — that rule then only ever serves as the fallback.\n */\n match: string\n /** Image slot; the bytes live in `modelbg-<slot>` under the data dir. */\n slot: string\n /** Disabled rules are skipped by matching AND by the fallback pick. */\n enabled: boolean\n /** Saved HSL theme color of this rule; null = use the system theme. */\n color: [number, number, number] | null\n bgMode: BgMode\n /** Wallpaper layer opacity (0..1). */\n wallpaperOpacity: number\n /** Wallpaper layer blur (px, 0..60) — NOT the interface part blur. */\n blur: number\n /** Image framing (zoom + fractional center + intrinsic size). */\n bgState: BgState\n}\n\n/** The persisted plugin configuration. */\nexport interface ThemeConfig {\n /** Ordered rules: matching runs top→bottom, rule 1 doubles as the fallback. */\n rules: BgRule[]\n /** Global per-part opacities (Interface page). */\n opacities: PartOpacities\n /** Global per-part blur (Interface page). */\n blurs: PartBlurs\n /** Settings-panel opacity (0..1). */\n settingsOpacity: number\n /** Translucent tint over the conversation text region (0 = none, 1 = solid). */\n chatTextOpacity: number\n /** Translucent tint over the trajectory view surface (0 = none, 1 = solid). */\n trajectoryOpacity: number\n /**\n * Surface opacity of the file-preview panel (0..1). `null` = never touched, so\n * the panel keeps following `opacities.bg`: the panel's only surface IS\n * `--dsw-alias-bg-base`, which the main-background slider already re-emits, so\n * an untouched card must stay indistinguishable from the interface behind it.\n */\n rightbarOpacity: number | null\n /**\n * Extract a rule's theme color from its own image when the rule has none yet.\n * Only ever FILLS an empty color — a color the user picked or that an earlier\n * extraction produced is never overwritten, so this cannot fight the user.\n */\n autoExtract: boolean\n}\n\n/** 100% = untouched host surface; zero would blank the page by default. */\nexport const DEFAULT_SETTINGS_OPACITY = 1\nexport const DEFAULT_CHAT_TEXT_OPACITY = 0\n/** 100% = untouched host surface; zero would blank the page by default. */\nexport const DEFAULT_TRAJECTORY_OPACITY = 1\n/** `null` = the file-preview panel still follows the main background. */\nexport const DEFAULT_RIGHTBAR_OPACITY: number | null = null\n/** Picking an image should just work; the toggle is there for people who don't want it. */\nexport const DEFAULT_AUTO_EXTRACT = true\n\n/** A default config with independent nested objects (never hand out the shared ones). */\nexport function freshThemeConfig(): ThemeConfig {\n return {\n rules: [],\n opacities: { ...DEFAULT_PART_OPACITIES },\n blurs: { ...DEFAULT_PART_BLURS },\n settingsOpacity: DEFAULT_SETTINGS_OPACITY,\n chatTextOpacity: DEFAULT_CHAT_TEXT_OPACITY,\n trajectoryOpacity: DEFAULT_TRAJECTORY_OPACITY,\n rightbarOpacity: DEFAULT_RIGHTBAR_OPACITY,\n autoExtract: DEFAULT_AUTO_EXTRACT,\n }\n}\n\n// ── Sanitizers ─────────────────────────────────────────────────────────────\n// Pure coercions from a possibly-old / possibly-hand-edited JSON value into the\n// shape above. Both halves run THESE, so a clamp can never differ between what\n// the UI shows and what lands on disk.\n\n/** Slot names reach the filesystem, so they are strictly whitelisted. */\nexport const SLOT_RE = /^[A-Za-z0-9_-]{1,32}$/\n\nexport function clamp(n: unknown, lo: number, hi: number, def: number): number {\n return typeof n === 'number' && isFinite(n) ? Math.min(hi, Math.max(lo, n)) : def\n}\n\nexport const clamp01 = (n: unknown, def: number): number => clamp(n, 0, 1, def)\n\nexport function normalizeBgState(s: Partial<BgState> | undefined): BgState {\n const v = s ?? {}\n return {\n zoom: clamp(v.zoom, 0.1, 10, 1),\n x: typeof v.x === 'number' && isFinite(v.x) ? v.x : 0,\n y: typeof v.y === 'number' && isFinite(v.y) ? v.y : 0,\n iw: typeof v.iw === 'number' && v.iw > 0 ? v.iw : 0,\n ih: typeof v.ih === 'number' && v.ih > 0 ? v.ih : 0,\n }\n}\n\n/** One `[h, s, l]` triple, or null when the value is not a complete finite triple. */\nexport function normalizeHsl(raw: unknown): [number, number, number] | null {\n if (!Array.isArray(raw) || raw.length !== 3) return null\n if (!raw.every(n => typeof n === 'number' && isFinite(n))) return null\n return [clamp(raw[0], 0, 360, 220), clamp(raw[1], 0, 1, 0.55), clamp(raw[2], 0, 1, 0.25)]\n}\n\n/** Coerce one persisted rule, or null when it lacks a usable id/slot. */\nexport function normalizeRule(raw: unknown): BgRule | null {\n const r = (raw ?? {}) as Partial<BgRule>\n const id = typeof r.id === 'string' && r.id !== '' ? r.id : null\n const slot = typeof r.slot === 'string' && SLOT_RE.test(r.slot) ? r.slot : null\n if (id === null || slot === null) return null\n const mode: BgMode = BG_MODES.includes(r.bgMode as BgMode) ? (r.bgMode as BgMode) : 'fit'\n return {\n id,\n slot,\n match: typeof r.match === 'string' ? r.match : '',\n enabled: r.enabled !== false,\n color: normalizeHsl(r.color),\n bgMode: mode,\n wallpaperOpacity: clamp01(r.wallpaperOpacity, 1),\n blur: clamp(r.blur, 0, 60, 0),\n bgState: normalizeBgState(r.bgState as Partial<BgState> | undefined),\n }\n}\n\n/** Coerce an unknown persisted value into a valid ThemeConfig, falling back per-field. */\nexport function normalizeConfig(raw: unknown): ThemeConfig {\n const r = (raw ?? {}) as Partial<ThemeConfig>\n const rules = Array.isArray(r.rules)\n ? r.rules.map(normalizeRule).filter((x): x is BgRule => x !== null)\n : []\n const ops = (r.opacities ?? {}) as Partial<PartOpacities>\n const bl = (r.blurs ?? {}) as Partial<PartBlurs>\n const blurs = {} as PartBlurs\n for (const k of PART_BLUR_KEYS) {\n blurs[k] = clamp(bl[k], 0, 60, DEFAULT_PART_BLURS[k])\n }\n const opacities = {} as PartOpacities\n for (const k of PART_OPACITY_KEYS) {\n opacities[k] = clamp01(ops[k], DEFAULT_PART_OPACITIES[k])\n }\n return {\n rules,\n opacities,\n blurs,\n settingsOpacity: clamp01(r.settingsOpacity, DEFAULT_SETTINGS_OPACITY),\n chatTextOpacity: clamp01(r.chatTextOpacity, DEFAULT_CHAT_TEXT_OPACITY),\n trajectoryOpacity: clamp01(r.trajectoryOpacity, DEFAULT_TRAJECTORY_OPACITY),\n // Anything but a real number means \"not owned yet\" — including the absent\n // field of a config written before this option existed.\n rightbarOpacity: typeof r.rightbarOpacity === 'number' && isFinite(r.rightbarOpacity)\n ? clamp01(r.rightbarOpacity, 1)\n : DEFAULT_RIGHTBAR_OPACITY,\n // Only an explicit `false` turns it off, so a config written before this\n // option existed starts with the helpful default.\n autoExtract: r.autoExtract !== false,\n }\n}\n","import type { BgRule, BgState, BgMode, ThemeConfig, PartOpacities, PartBlurs } from './types'\n// The persisted shape, its key lists, its defaults and its sanitizers all live in\n// ../schema, shared verbatim with the node half — a field declared on one side\n// only used to be silently dropped by the other side's sanitizer.\nimport {\n DEFAULT_BG_STATE, DEFAULT_CHAT_TEXT_OPACITY, DEFAULT_PART_BLURS, DEFAULT_PART_OPACITIES,\n DEFAULT_SETTINGS_OPACITY, DEFAULT_TRAJECTORY_OPACITY, PART_BLUR_KEYS, PART_OPACITY_KEYS,\n clamp, clamp01, freshThemeConfig, normalizeConfig, normalizeRule,\n} from '../schema'\n\nexport { DEFAULT_BG_STATE, normalizeRule }\n\nconst PALETTE: Array<[number, number, number]> = [\n [356, 0.72, 0.55], [24, 0.78, 0.55], [44, 0.8, 0.55], [152, 0.62, 0.5],\n [174, 0.68, 0.48], [208, 0.72, 0.55], [252, 0.68, 0.6], [300, 0.64, 0.58],\n]\nexport { PALETTE }\n\n/** The defaults every accessor falls back to; the shape itself lives in ../schema. */\nexport const DEFAULT_CONFIG: ThemeConfig = freshThemeConfig()\n\n// In-memory mirror of the file-backed store; the UI reads and mutates this and\n// it is synced to disk via the RPC layer.\nexport let cfg: ThemeConfig = freshThemeConfig()\n\n// ── Image cache (slot → data URL) ──────────────────────────────────────────\n// Rule images are fetched lazily per slot; only the active rule's bytes are\n// needed to paint, the rest are loaded when their card is expanded.\n//\n// Two URLs are kept per slot: the DATA URL is what gets persisted and embedded\n// in an export, while the DISPLAY URL is an object URL derived from it. Painting\n// goes through the display URL because `background-image: url(data:…)` is\n// re-decoded on every assignment — a visible stall on every model switch for a\n// multi-megabyte wallpaper — whereas a blob URL is served from the browser's\n// memory cache after the first load.\nconst images = new Map<string, string>()\nconst displayUrls = new Map<string, string>()\n\nfunction revokeDisplay(slot: string): void {\n const url = displayUrls.get(slot)\n if (url === undefined) return\n displayUrls.delete(slot)\n // Deferred on purpose: the wallpaper layer may still be painting this URL\n // while the replacement fades in over it, and revoking it mid-fade would blank\n // the wallpaper behind the incoming image for a frame.\n window.setTimeout(() => {\n try { URL.revokeObjectURL(url) } catch { /* not a live object URL (e.g. fallback) */ }\n }, 2000)\n}\n\nexport function setImage(slot: string, url: string | null): void {\n revokeDisplay(slot)\n if (url === null) images.delete(slot)\n else images.set(slot, url)\n}\n/** Persisted data URL (RPC / export). Use `displayImageOf` to paint it. */\nexport function imageOf(slot: string): string | null { return images.get(slot) ?? null }\n\n/** Paintable URL for one slot, created on first use and cached; falls back to\n * the data URL when no object URL can be built. */\nexport function displayImageOf(slot: string): string | null {\n const cached = displayUrls.get(slot)\n if (cached !== undefined) return cached\n const data = images.get(slot)\n if (data === undefined) return null\n const made = toObjectUrl(data)\n if (made === null) return data\n displayUrls.set(slot, made)\n return made\n}\n\nfunction toObjectUrl(dataUrl: string): string | null {\n try {\n if (typeof URL === 'undefined' || typeof URL.createObjectURL !== 'function') return null\n const comma = dataUrl.indexOf(',')\n if (comma < 0) return null\n const meta = dataUrl.slice(0, comma)\n if (!/;base64$/i.test(meta)) return null\n const mime = meta.slice(5, -7) || 'image/jpeg'\n const bin = atob(dataUrl.slice(comma + 1))\n const bytes = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i)\n return URL.createObjectURL(new Blob([bytes], { type: mime }))\n } catch {\n return null\n }\n}\n\nexport function clearImages(): void {\n for (const slot of Array.from(displayUrls.keys())) revokeDisplay(slot)\n images.clear()\n}\n\n// ── Active rule (what the render layer follows) ────────────────────────────\nexport let activeRuleId: string | null = null\nexport let activeMatched = false\nexport let modelLabel = ''\n\nexport function setActive(ruleId: string | null, matched: boolean): void {\n activeRuleId = ruleId\n activeMatched = matched\n}\nexport function setModelLabel(label: string): void { modelLabel = label }\n\nexport function ruleById(id: string): BgRule | null {\n return cfg.rules.find(r => r.id === id) ?? null\n}\nexport function activeRule(): BgRule | null {\n return activeRuleId === null ? null : ruleById(activeRuleId)\n}\n\n// ── Rule factories / allocation ────────────────────────────────────────────\nexport function newRule(id: string, slot: string): BgRule {\n return {\n id, slot, match: '', enabled: true, color: null,\n bgMode: 'fit', wallpaperOpacity: 1, blur: 0,\n bgState: { ...DEFAULT_BG_STATE },\n }\n}\n\n/** First free image slot (`m1`, `m2`, …). */\nexport function nextSlot(): string {\n const taken = new Set(cfg.rules.map(r => r.slot))\n for (let i = 1; i < 1000; i++) {\n const slot = `m${i}`\n if (!taken.has(slot)) return slot\n }\n return `m${Date.now()}`\n}\n\n/** Unique rule id (independent from the slot so removals never renumber). */\nexport function nextRuleId(): string {\n const taken = new Set(cfg.rules.map(r => r.id))\n for (let i = 1; i < 10000; i++) {\n const id = `r${i}`\n if (!taken.has(id)) return id\n }\n return `r${Date.now()}`\n}\n\n// ── Accessors used by the render layer (they follow the ACTIVE rule) ───────\nexport function rHasColor(): boolean { return activeRule()?.color !== null && activeRule() !== null }\nexport function rColor(): [number, number, number] { return activeRule()?.color ?? [220, 0.55, 0.25] }\nexport function rBgMode(): BgMode { return activeRule()?.bgMode ?? 'fit' }\nexport function rWop(): number { return clamp01(activeRule()?.wallpaperOpacity, 1) }\nexport function rBl(): number { return clamp(activeRule()?.blur, 0, 60, 0) }\nexport function rBgState(): BgState { return activeRule()?.bgState ?? DEFAULT_BG_STATE }\n/** Paintable URL of the active rule's image, or null when it has none. */\nexport function rWp(): string | null {\n const rule = activeRule()\n return rule === null ? null : displayImageOf(rule.slot)\n}\nexport function rOps(): PartOpacities {\n const o = cfg.opacities ?? {}\n const out = {} as PartOpacities\n for (const k of PART_OPACITY_KEYS) {\n out[k] = clamp01(o[k], DEFAULT_PART_OPACITIES[k])\n }\n return out\n}\nexport function rBlurs(): PartBlurs {\n const b = cfg.blurs ?? {}\n const out = {} as PartBlurs\n for (const k of PART_BLUR_KEYS) {\n out[k] = clamp(b[k], 0, 60, DEFAULT_PART_BLURS[k])\n }\n return out\n}\nexport function rSop(): number { return clamp01(cfg.settingsOpacity, DEFAULT_SETTINGS_OPACITY) }\nexport function rChatTextOpacity(): number { return clamp01(cfg.chatTextOpacity, DEFAULT_CHAT_TEXT_OPACITY) }\nexport function rTrajectoryOpacity(): number { return clamp01(cfg.trajectoryOpacity, DEFAULT_TRAJECTORY_OPACITY) }\n/** Own opacity of the file-preview panel; while unowned it IS the main background's. */\nexport function rRightbarOpacity(): number {\n const own = cfg.rightbarOpacity\n return typeof own === 'number' && isFinite(own) ? clamp01(own, 1) : rOps().bg\n}\n\n// ── Normalization ──────────────────────────────────────────────────────────\n// The sanitizers are the shared ones from ../schema (the same code the node half\n// runs before writing to disk), so what the UI shows and what is persisted can\n// never be clamped differently.\n\n/** Move a possibly-absent partial config into the shape the UI reads. */\nexport function adoptConfig(raw: unknown): void {\n cfg = normalizeConfig(raw)\n // A rule that vanished (import/removal) must not stay active.\n if (activeRuleId !== null && !cfg.rules.some(r => r.id === activeRuleId)) {\n activeRuleId = null\n activeMatched = false\n }\n}\n\nexport function resetConfig(): void {\n cfg = freshThemeConfig()\n clearImages()\n activeRuleId = null\n activeMatched = false\n modelLabel = ''\n}\n","import type { FetchResult, RpcResultLike } from './types'\nimport { cfg } from './state'\n\nexport const RPC_CHANNEL = '/dsh-background-by-model'\nconst RPC_NS = 'dshBackgroundByModel'\nconst rpcEndpoint = (method: string): string => `${RPC_NS}/${method}`\n\nlet rpcCallFn: ((endpoint: string, payload: unknown) => Promise<RpcResultLike | undefined>) | null = null\n\nexport function initRpc(call: (endpoint: string, payload: unknown) => Promise<RpcResultLike | undefined>): void {\n rpcCallFn = call\n}\n\nasync function rpcCall(method: string, payload: unknown): Promise<unknown> {\n if (!rpcCallFn) return undefined\n try {\n const res = await rpcCallFn(rpcEndpoint(method), payload)\n if (res && res.ok === true) return res.value\n console.warn(`dsh-background-by-model: rpc \"${method}\" failed`, res?.error)\n return undefined\n } catch (e) {\n console.warn(`dsh-background-by-model: rpc \"${method}\" threw`, e)\n return undefined\n }\n}\n\n/** Raw call for the few places that need the host's error message. */\nasync function rpcRaw(method: string, payload: unknown): Promise<RpcResultLike | undefined> {\n if (!rpcCallFn) return undefined\n try {\n return await rpcCallFn(rpcEndpoint(method), payload)\n } catch {\n return undefined\n }\n}\n\n// Slider drags fire dozens of events per second; coalesce writes to a trailing\n// debounce and flush the last pending write on pagehide so a quick close never\n// loses it.\nconst SAVE_DEBOUNCE_MS = 250\nlet saveTimer: number | undefined\n\nexport function saveConfig(): void {\n if (saveTimer !== undefined) window.clearTimeout(saveTimer)\n saveTimer = window.setTimeout(() => {\n saveTimer = undefined\n void rpcCall('writeConfig', { config: cfg })\n }, SAVE_DEBOUNCE_MS)\n}\n\nexport function flushSave(): void {\n if (saveTimer === undefined) return\n window.clearTimeout(saveTimer)\n saveTimer = undefined\n void rpcCall('writeConfig', { config: cfg })\n}\n\n/** Persist the current config immediately (no debounce). */\nexport function persistConfig(): void {\n void rpcCall('writeConfig', { config: cfg })\n}\n\nexport interface Persisted { config: unknown; slots: string[] }\n\n/** Load the persisted config plus the list of stored image slots. */\nexport async function loadPersisted(): Promise<Persisted | null> {\n const data = await rpcCall('read', {})\n if (data === null || typeof data !== 'object') return null\n const d = data as { config?: unknown; slots?: unknown }\n const slots = Array.isArray(d.slots) ? d.slots.filter((s): s is string => typeof s === 'string') : []\n return { config: d.config, slots }\n}\n\n/** Read one rule image as a data URL (null when the slot is empty). */\nexport async function readImage(slot: string): Promise<string | null> {\n const data = await rpcCall('readImage', { slot })\n if (data === null || typeof data !== 'object') return null\n const url = (data as { dataUrl?: unknown }).dataUrl\n return typeof url === 'string' ? url : null\n}\n\n/** Persist (or clear) one rule image; one-shot, no debounce. */\nexport async function writeImage(slot: string, dataUrl: string | null): Promise<boolean> {\n const res = await rpcCall('writeImage', { slot, dataUrl })\n return res === true\n}\n\n/** Remove one rule image from disk. */\nexport async function deleteImage(slot: string): Promise<boolean> {\n const res = await rpcCall('deleteImage', { slot })\n return res === true\n}\n\n/** Download an image from a network URL into one slot, replacing its bytes. */\nexport async function fetchImageUrl(slot: string, url: string): Promise<FetchResult> {\n const res = await rpcRaw('fetchImageUrl', { slot, url })\n if (!res) return { ok: false, error: 'no response' }\n if (res.ok !== true) {\n const err = (res as { error?: { message?: string } }).error\n return { ok: false, error: err?.message ?? 'request failed' }\n }\n const v = res.value as FetchResult | undefined\n return v?.ok === true\n ? { ok: true, dataUrl: v.dataUrl ?? null }\n : { ok: false, error: v?.error ?? 'failed' }\n}\n\n/** Host default model — used only when the per-session services are absent. */\nexport async function readDefaultModel(): Promise<string | null> {\n const data = await rpcCall('defaultModel', {})\n if (data === null || typeof data !== 'object') return null\n const d = data as { provider?: unknown; model?: unknown }\n const parts = [d.provider, d.model].filter((s): s is string => typeof s === 'string' && s !== '')\n return parts.length > 0 ? parts.join(' ') : null\n}\n","import type { BgState, ColorPalette } from '../types'\r\n\r\n// The wheel works in HSV end to end; storage and genTokens expect HSL, so\r\n// setColor converts HSV → HSL at the boundary and sectionInject converts the\r\n// stored HSL → HSV for the initial wheel props. Conversions never stack.\r\n\r\nexport function hsvToHsl(h: number, s: number, v: number): [number, number, number] {\r\n const l = v * (1 - s / 2)\r\n const sl = l === 0 || l === 1 ? 0 : (v - l) / Math.min(l, 1 - l)\r\n return [h, sl, l]\r\n}\r\n\r\nexport function hslToHsv(h: number, s: number, l: number): [number, number, number] {\r\n const v = l + s * Math.min(l, 1 - l)\r\n const sv = v === 0 ? 0 : 2 * (1 - l / v)\r\n return [h, sv, v]\r\n}\r\n\r\nlet tokensCacheKey = ''\r\nlet tokensCache: { colorScheme: 'light' | 'dark'; tokens: Record<string, string> } | null = null\r\n\r\n/**\r\n * Memoized token generation: the same (hue, sat, lit) input always yields the\r\n * same token set, and applyWp / applyCustomTokens / applySettingsOverrides call\r\n * this repeatedly (slider drags, viewport re-applies), so cache the last result\r\n * and skip the 30+ hsl() string builds when nothing changed.\r\n */\r\nexport function genTokens(hue: number, sat: number, lit: number): { colorScheme: 'light' | 'dark'; tokens: Record<string, string> } {\r\n const key = `${hue}|${sat}|${lit}`\r\n if (tokensCacheKey === key && tokensCache) return tokensCache\r\n tokensCacheKey = key\r\n tokensCache = buildTokens(hue, sat, lit)\r\n return tokensCache\r\n}\r\n\r\nfunction buildTokens(hue: number, sat: number, lit: number): { colorScheme: 'light' | 'dark'; tokens: Record<string, string> } {\r\n const dark = lit < 0.55\r\n const h = (d: number) => ((hue + d) % 360 + 360) % 360\r\n const s = (d: number) => Math.max(0, Math.min(1, sat + d))\r\n const l = (d: number) => Math.max(0, Math.min(1, lit + d))\r\n const hsl = (hh: number, ss: number, ll: number) => `hsl(${Math.round(hh)},${Math.round(ss * 100)}%,${Math.round(ll * 100)}%)`\r\n const rgba = (hh: number, ss: number, ll: number, a: number) =>\r\n `hsla(${Math.round(hh)},${Math.round(ss * 100)}%,${Math.round(ll * 100)}%,${a})`\r\n\r\n if (dark) {\r\n // dsh 0.1.7 splits the menu surface in two: the shared MenuSurface material\r\n // paints `--dsw-menu-surface-fill`, and every other overlay paints\r\n // `--dsw-specific-menu`, which the host aliases to the former\r\n // (`--dsw-specific-menu: var(--dsw-menu-surface-fill)`). Both are generated\r\n // from this one expression so the plugin's override of either can never let\r\n // the pair drift apart — see OPACITY_VARS in wallpaper.ts.\r\n const menuFill = hsl(h(0), s(0), l(0.08))\r\n return {\r\n colorScheme: 'dark',\r\n tokens: {\r\n '--dsw-alias-bg-base': hsl(h(0), s(0), l(-0.04)),\r\n '--dsw-alias-bg-layer-1': hsl(h(0), s(0), l(0.02)),\r\n '--dsw-alias-bg-layer-2': hsl(h(0), s(0), l(0.07)),\r\n '--dsw-alias-bg-layer-3': hsl(h(0), s(-0.05), l(0.12)),\r\n '--dsw-alias-bg-overlay': hsl(h(0), s(-0.05), l(0.12)),\r\n '--dsw-alias-bg-module-platform': hsl(h(0), s(0), l(0.05)),\r\n '--dsw-alias-bg-multi-select': hsl(h(0), s(0), l(0.1)),\r\n '--dsw-alias-bg-skeleton': 'rgba(255,255,255,0.08)',\r\n '--dsw-alias-border-l1': rgba(h(0), s(-0.1), l(0.18), 0.12),\r\n '--dsw-alias-border-l2': rgba(h(0), s(-0.1), l(0.22), 0.22),\r\n '--dsw-alias-border-l3': 'rgba(255,255,255,0.16)',\r\n '--dsw-alias-border-l4': 'rgba(255,255,255,0.2)',\r\n '--dsw-alias-border-inverted': 'rgba(255,255,255,0.06)',\r\n '--dsw-alias-label-primary': hsl(0, 0, 1),\r\n '--dsw-alias-label-secondary': 'rgba(255,255,255,0.85)',\r\n '--dsw-alias-label-tertiary': 'rgba(255,255,255,0.7)',\r\n // Placeholder/dim hint — deliberately weaker than the text tiers so a\r\n // placeholder reads as a hint, never as real input.\r\n '--dsw-alias-label-caption': 'rgba(255,255,255,0.5)',\r\n '--dsw-alias-label-dimmed': 'rgba(255,255,255,0.35)',\r\n '--dsw-alias-label-quaternary': 'rgba(255,255,255,0.25)',\r\n '--dsw-alias-label-primary-dimmed': 'rgba(255,255,255,0.92)',\r\n '--dsw-alias-label-primary-foreground': hsl(0, 0, 1),\r\n // Inverted label sits on a light brand/contrast/badge surface in dark\r\n // mode, so it must be dark ink, not white.\r\n '--dsw-alias-label-primary-inverted': hsl(h(0), s(0.08), Math.min(l(0.06), 0.16)),\r\n '--dsw-alias-label-primary-bluish': hsl(0, 0, 1),\r\n '--dsw-alias-brand-primary': hsl(h(0), s(0.1), Math.max(l(0.2), 0.5)),\r\n '--dsw-alias-brand-text': l(0.2) > 0.6 ? '#000' : '#fff',\r\n '--dsw-alias-button-primary-fill': hsl(h(0), s(0.1), Math.max(l(0.2), 0.5)),\r\n '--dsw-alias-button-primary-hover': hsl(h(0), s(0.1), Math.max(l(0.28), 0.58)),\r\n '--dsw-alias-button-primary-dimmed': hsl(h(0), s(0), l(0.07)),\r\n '--dsw-alias-button-elevated-fill': hsl(h(0), s(0), l(0.04)),\r\n '--dsw-alias-button-floating-fill': hsl(h(0), s(0), l(0.02)),\r\n '--dsw-alias-button-floating-hover': hsl(h(0), s(0), l(0.1)),\r\n '--dsw-alias-button-tool-bar-fill': 'rgba(255,255,255,0.08)',\r\n '--dsw-alias-button-tool-bar-hover': 'rgba(255,255,255,0.12)',\r\n '--dsw-alias-button-ghost-active-fill': hsl(h(0), s(0), l(0.06)),\r\n '--dsw-alias-button-ghost-active-border': 'rgba(255,255,255,0.16)',\r\n '--dsw-alias-button-ghost-active-hover': hsl(h(0), s(0), l(0.09)),\r\n '--dsw-alias-button-info-fill': '#679efe',\r\n '--dsw-alias-button-info-hover': '#4176e6',\r\n '--dsw-alias-button-contrast-fill': hsl(0, 0, 1),\r\n '--dsw-alias-interactive-bg-hover': rgba(h(0), s(0), Math.max(l(0.15), 0.4), 0.12),\r\n '--dsw-alias-interactive-bg-hover-solid': rgba(h(0), s(0), Math.max(l(0.15), 0.4), 0.16),\r\n '--dsw-alias-interactive-bg-hover-accent': 'rgba(255,255,255,0.24)',\r\n '--dsw-alias-interactive-bg-hover-danger': 'rgba(242,90,90,0.15)',\r\n '--dsw-alias-interactive-bg-active': rgba(h(0), s(0), Math.max(l(0.15), 0.4), 0.2),\r\n '--dsw-alias-markdown-code-block': hsl(h(0), s(0), l(-0.06)),\r\n '--dsw-alias-markdown-code-block-banner': hsl(h(0), s(0), l(-0.02)),\r\n '--dsw-alias-markdown-inline-code': hsl(h(0), s(0), l(0.04)),\r\n '--dsw-alias-markdown-placeholder': hsl(h(0), s(0), l(-0.02)),\r\n '--dsw-alias-markdown-tag': hsl(h(0), s(0), l(0.05)),\r\n '--dsw-alias-markdown-citation': hsl(h(0), s(0), l(0.06)),\r\n '--dsw-alias-markdown-code-segment-selected': hsl(h(0), s(0), l(0.05)),\r\n '--dsw-alias-markdown-code-segment-unselected': hsl(h(0), s(0), l(-0.05)),\r\n '--dsw-alias-state-error-primary': '#ff5c72',\r\n '--dsw-alias-state-error-secondary': '#ff8aa0',\r\n '--dsw-alias-state-success-primary': '#3ddc84',\r\n '--dsw-alias-state-success-secondary': '#69eea4',\r\n // Badge tertiary tokens are the static dark surfaces the UI draws\r\n // over (trajectory tool/context badges, connection pill, plan chip):\r\n // aligning them with the native dark 800/900 steps keeps light fix label\r\n // text readable instead of tint-same-as-background (issue #9).\r\n '--dsw-alias-state-success-tertiary': '#233c2c',\r\n '--dsw-alias-state-warn-primary': '#ffb347',\r\n '--dsw-alias-state-warn-secondary': '#ffc980',\r\n '--dsw-alias-state-warn-tertiary': '#27241f',\r\n '--dsw-alias-state-warn-label': '#dd8629',\r\n '--dsw-alias-state-business-primary': '#679efe',\r\n '--dsw-alias-state-business-tertiary': '#34415b',\r\n '--dsw-specific-sidebar-fill': hsl(h(0), s(0), l(-0.06)),\r\n '--dsw-specific-sidebar-nav-item-active': hsl(h(0), s(0), l(0.04)),\r\n '--dsw-specific-sidebar-nav-item-hover': hsl(h(0), s(0), l(0)),\r\n '--dsw-specific-input-major': hsl(h(0), s(0), l(0.02)),\r\n '--dsw-specific-menu': menuFill,\r\n '--dsw-menu-surface-fill': menuFill,\r\n '--dsw-specific-bubble': hsl(h(0), s(0), l(0.03)),\r\n '--dsw-specific-bubble-highlight': hsl(h(0), s(0), l(0.08)),\r\n '--dsw-specific-selector': hsl(h(0), s(0), l(0.05)),\r\n '--dsw-specific-login-input': hsl(h(0), s(0), l(0.03)),\r\n '--dsw-specific-tip': hsl(h(0), s(0), l(0.05)),\r\n '--dsw-alias-toast-bg': hsl(h(0), s(0), l(0.08)),\r\n '--dsw-alias-tooltip-bg': hsl(h(0), s(0), l(0.08)),\r\n '--dsw-alias-scrollbar-bg-l1': hsl(h(0), s(-0.05), l(0.12)),\r\n '--dsw-alias-scrollbar-bg-l2': hsl(h(0), s(-0.05), l(0.16)),\r\n '--dsw-alias-scrollbar-hover-l1': hsl(h(0), s(-0.05), l(0.22)),\r\n '--dsw-alias-scrollbar-hover-l2': hsl(h(0), s(-0.05), l(0.22)),\r\n },\r\n }\r\n }\r\n // Same one-expression contract as the dark branch above.\r\n const menuFill = hsl(h(0), s(-0.12), l(0.15))\r\n return {\r\n colorScheme: 'light',\r\n tokens: {\r\n '--dsw-alias-bg-base': hsl(h(0), s(-0.08), l(0.03)),\r\n '--dsw-alias-bg-layer-1': hsl(h(0), s(-0.12), l(0.07)),\r\n '--dsw-alias-bg-layer-2': hsl(h(0), s(-0.1), l(-0.03)),\r\n '--dsw-alias-bg-layer-3': hsl(h(0), s(-0.08), l(-0.09)),\r\n '--dsw-alias-bg-overlay': hsl(h(0), s(-0.12), l(0.08)),\r\n '--dsw-alias-border-l1': rgba(h(0), s(-0.15), l(-0.35), 0.18),\r\n '--dsw-alias-border-l2': rgba(h(0), s(-0.15), l(-0.35), 0.3),\r\n '--dsw-alias-label-primary': hsl(0, 0, 0),\r\n '--dsw-alias-label-secondary': 'rgba(0,0,0,0.85)',\r\n '--dsw-alias-label-tertiary': 'rgba(0,0,0,0.7)',\r\n // Placeholder/dim hint — deliberately weaker than the text tiers so a\r\n // placeholder reads as a hint, never as real input.\r\n '--dsw-alias-label-caption': 'rgba(0,0,0,0.5)',\r\n '--dsw-alias-label-dimmed': 'rgba(0,0,0,0.35)',\r\n '--dsw-alias-label-quaternary': 'rgba(0,0,0,0.25)',\r\n '--dsw-alias-brand-primary': hsl(h(0), s(0.05), Math.min(l(-0.18), 0.45)),\r\n '--dsw-alias-brand-text': '#fff',\r\n '--dsw-alias-button-primary-hover': hsl(h(0), s(0.05), Math.min(l(-0.12), 0.5)),\r\n '--dsw-alias-button-primary-dimmed': hsl(h(0), s(-0.1), l(-0.03)),\r\n '--dsw-alias-button-elevated-fill': hsl(h(0), s(-0.1), l(0.1)),\r\n '--dsw-alias-button-floating-hover': hsl(h(0), s(-0.1), l(0.16)),\r\n '--dsw-alias-interactive-bg-hover': rgba(h(0), s(0), l(-0.3), 0.08),\r\n '--dsw-alias-interactive-bg-active': rgba(h(0), s(0), l(-0.3), 0.14),\r\n '--dsw-alias-markdown-code-block': hsl(h(0), s(-0.1), l(-0.03)),\r\n '--dsw-alias-markdown-inline-code': hsl(h(0), s(-0.08), l(0.04)),\r\n '--dsw-specific-sidebar-fill': hsl(h(0), s(-0.1), l(-0.03)),\r\n '--dsw-specific-sidebar-nav-item-active': hsl(h(0), s(-0.08), l(0.05)),\r\n '--dsw-specific-sidebar-nav-item-hover': hsl(h(0), s(-0.12), l(0)),\r\n '--dsw-specific-input-major': hsl(h(0), s(-0.12), l(0.1)),\r\n '--dsw-specific-menu': menuFill,\r\n '--dsw-menu-surface-fill': menuFill,\r\n '--dsw-alias-scrollbar-bg-l1': hsl(h(0), s(-0.1), l(-0.08)),\r\n '--dsw-alias-scrollbar-bg-l2': hsl(h(0), s(-0.08), l(-0.12)),\r\n '--dsw-alias-scrollbar-hover-l1': hsl(h(0), s(-0.08), l(-0.16)),\r\n '--dsw-alias-scrollbar-hover-l2': hsl(h(0), s(-0.08), l(-0.16)),\r\n },\r\n }\r\n}\r\n\r\nexport function toRgba(c: string, a: number): string {\r\n const hx = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(c.trim())\r\n if (hx) { let d = hx[1]!; if (d.length === 3) d = d.split('').map(x => x + x).join(''); const n = parseInt(d, 16); return `rgba(${(n >> 16) & 255},${(n >> 8) & 255},${n & 255},${a})` }\r\n const rgb = /^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+))?\\s*\\)$/i.exec(c.trim())\r\n if (rgb) return `rgba(${rgb[1]},${rgb[2]},${rgb[3]},${a})`\r\n const hsl = /^hsla?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%/i.exec(c.trim())\r\n if (hsl) return `hsla(${hsl[1]},${hsl[2]}%,${hsl[3]}%,${a})`\r\n return c.trim()\r\n}\r\n\r\nexport function rgbToHsl(r: number, g: number, b: number): [number, number, number] {\r\n const rn = r / 255, gn = g / 255, bn = b / 255\r\n const max = Math.max(rn, gn, bn), min = Math.min(rn, gn, bn)\r\n const l = (max + min) / 2\r\n if (max === min) return [0, 0, l]\r\n const d = max - min\r\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\r\n let h: number\r\n if (max === rn) h = ((gn - bn) / d) % 6\r\n else if (max === gn) h = (bn - rn) / d + 2\r\n else h = (rn - gn) / d + 4\r\n h *= 60\r\n if (h < 0) h += 360\r\n return [h, s, l]\r\n}\r\n\r\n// Wallpaper color extraction: decode the cached data URL → crop the visible\r\n// (framed) region → downsample to a 64×64 canvas → quantize pixels into 4-bit\r\n// RGB buckets → discard near-gray / near-black / near-white pixels → pick the\r\n// most populous vivid bucket (count × saturation bias) → average its members →\r\n// RGB→HSL → clamp lightness into a band that keeps the light/dark scheme\r\n// decision unambiguous. Purely client-side and memory-bounded.\r\n\r\nconst EXTRACT_SIDE = 64\r\n\r\ninterface Bucket { count: number; r: number; g: number; b: number; s: number }\r\n\r\nfunction bucketsToHsl(b: Bucket): [number, number, number] {\r\n return rgbToHsl(b.r / b.count, b.g / b.count, b.b / b.count)\r\n}\r\n\r\nfunction extractWallpaperPalette(dataUrl: string, bgState: BgState): Promise<ColorPalette | null> {\r\n return new Promise(resolve => {\r\n const img = new Image()\r\n img.onerror = () => resolve(null)\r\n img.onload = () => {\r\n try {\r\n const iw = img.naturalWidth || img.width\r\n const ih = img.naturalHeight || img.height\r\n const bg = bgState\r\n let sx = 0, sy = 0, sw = iw, sh = ih\r\n if (bg.iw === iw && bg.ih === ih && bg.iw > 0) {\r\n const fit = Math.min(window.innerWidth / iw, window.innerHeight / ih)\r\n const w = iw * fit * bg.zoom\r\n const h = ih * fit * bg.zoom\r\n sx = Math.max(0, bg.x * window.innerWidth - w / 2)\r\n sy = Math.max(0, bg.y * window.innerHeight - h / 2)\r\n sw = Math.min(iw - sx, w)\r\n sh = Math.min(ih - sy, h)\r\n if (sw <= 0 || sh <= 0) { sx = 0; sy = 0; sw = iw; sh = ih }\r\n }\r\n const c = document.createElement('canvas')\r\n c.width = EXTRACT_SIDE; c.height = EXTRACT_SIDE\r\n const g = c.getContext('2d', { willReadFrequently: true })!\r\n g.drawImage(img, sx, sy, sw, sh, 0, 0, EXTRACT_SIDE, EXTRACT_SIDE)\r\n const px = g.getImageData(0, 0, EXTRACT_SIDE, EXTRACT_SIDE).data\r\n const counts = new Uint32Array(4096)\r\n const sums = new Float64Array(4096 * 3)\r\n let totalLum = 0\r\n let sampled = 0\r\n for (let i = 0; i < px.length; i += 4) {\r\n const r = px[i], gg = px[i + 1], b = px[i + 2]\r\n const max = Math.max(r, gg, b), min = Math.min(r, gg, b)\r\n const v = max / 255\r\n const s = max === 0 ? 0 : (max - min) / max\r\n // Include all non-extreme pixels in luminance; only vivid pixels in\r\n // palette buckets so we don't theme around gray/black/white.\r\n // Rec.709 luma — the measure a display reads as brightness, and the one\r\n // the light/dark band below is decided with. The HSV value used here\r\n // before counts every saturated pixel as bright (pure blue: v = 1.0,\r\n // luma = 0.072), which pushed dark saturated wallpapers into the light\r\n // band and built a light palette over a dark picture.\r\n totalLum += (0.2126 * r + 0.7152 * gg + 0.0722 * b) / 255\r\n sampled++\r\n if (s < 0.08 || v < 0.12 || v > 0.97) continue\r\n const key = ((r >> 4) << 8) | ((gg >> 4) << 4) | (b >> 4)\r\n counts[key]++\r\n sums[key * 3] += r; sums[key * 3 + 1] += gg; sums[key * 3 + 2] += b\r\n }\r\n const buckets: Bucket[] = []\r\n for (let k = 0; k < 4096; k++) {\r\n if (counts[k] === 0) continue\r\n buckets.push({\r\n count: counts[k],\r\n r: sums[k * 3],\r\n g: sums[k * 3 + 1],\r\n b: sums[k * 3 + 2],\r\n s: (Math.max(sums[k * 3], sums[k * 3 + 1], sums[k * 3 + 2]) - Math.min(sums[k * 3], sums[k * 3 + 1], sums[k * 3 + 2])) / Math.max(sums[k * 3], sums[k * 3 + 1], sums[k * 3 + 2]) || 0,\r\n })\r\n }\r\n if (buckets.length === 0) { resolve(null); return }\r\n // Sort by vivid-weighted count.\r\n buckets.sort((a, b) => b.count * (0.5 + b.s) - a.count * (0.5 + a.s))\r\n const primary = bucketsToHsl(buckets[0]!)\r\n const primaryHue = primary[0]\r\n // Secondary: next bucket that is reasonably separated from primary.\r\n let secondary = primary\r\n for (const b of buckets.slice(1)) {\r\n const [h] = bucketsToHsl(b)\r\n const sep = Math.abs(((h - primaryHue + 540) % 360) - 180)\r\n if (sep > 30) { secondary = bucketsToHsl(b); break }\r\n }\r\n // Tertiary: complementary-ish hue based on primary if no good secondary.\r\n let tertiary: [number, number, number] = [((primaryHue + 180) % 360), Math.min(0.7, primary[1]), Math.min(0.7, primary[2])]\r\n for (const b of buckets.slice(1)) {\r\n const [h] = bucketsToHsl(b)\r\n const sep = Math.abs(((h - primaryHue + 540) % 360) - 180)\r\n if (sep > 90 && sep < 150) { tertiary = bucketsToHsl(b); break }\r\n }\r\n // Surface: neutralized primary (very low saturation).\r\n const surface: [number, number, number] = [primaryHue, Math.min(0.06, primary[1] * 0.3), primary[2]]\r\n // Auto light/dark: use the average luminance of the whole image so a\r\n // bright wallpaper naturally drives a light scheme and vice-versa.\r\n const luminance = sampled > 0 ? totalLum / sampled : primary[2]\r\n // Snap primary lightness out of the ambiguous middle band.\r\n const autoDark = luminance < 0.5\r\n const lc = autoDark ? Math.min(0.44, Math.max(0.2, primary[2])) : Math.max(0.6, Math.min(0.82, primary[2]))\r\n primary[2] = lc\r\n resolve({\r\n primary: [primary[0], Math.min(0.9, Math.max(0.15, primary[1])), primary[2]],\r\n secondary: [secondary[0], Math.min(0.85, Math.max(0.2, secondary[1])), Math.min(0.75, Math.max(0.35, secondary[2]))],\r\n tertiary: [tertiary[0], Math.min(0.8, Math.max(0.2, tertiary[1])), Math.min(0.7, Math.max(0.35, tertiary[2]))],\r\n surface,\r\n luminance,\r\n })\r\n } catch {\r\n resolve(null)\r\n }\r\n }\r\n img.src = dataUrl\r\n })\r\n}\r\n\r\n/** Backward-compatible single-color extraction: returns the primary HSL. */\r\nexport async function extractWallpaperColor(dataUrl: string, bgState: BgState): Promise<[number, number, number] | null> {\r\n const palette = await extractWallpaperPalette(dataUrl, bgState)\r\n return palette ? palette.primary : null\r\n}\r\n\r\n// One-shot frame brightness analysis: called only when a generated background\r\n// is switched (from its captured snapshot), never from the animation loop.\r\n// Decode the frame, downsample to a 32×32 canvas, average Rec.709 luma.\r\n// Dark frame → light fonts, light frame → dark fonts.\r\n\r\nconst ANALYZE_SIDE = 32\r\n\r\n/** Analyze a captured frame's average luminance. Resolves true when the frame\r\n * reads dark (use white fonts), false when light (use black fonts), or null\r\n * when the frame cannot be decoded. */\r\nexport function analyzeFrameDark(dataUrl: string): Promise<boolean | null> {\r\n return new Promise(resolve => {\r\n const img = new Image()\r\n img.onerror = () => resolve(null)\r\n img.onload = () => {\r\n try {\r\n const c = document.createElement('canvas')\r\n c.width = ANALYZE_SIDE; c.height = ANALYZE_SIDE\r\n const g = c.getContext('2d', { willReadFrequently: true })!\r\n g.drawImage(img, 0, 0, ANALYZE_SIDE, ANALYZE_SIDE)\r\n const px = g.getImageData(0, 0, ANALYZE_SIDE, ANALYZE_SIDE).data\r\n let lum = 0\r\n const count = px.length / 4\r\n for (let i = 0; i < px.length; i += 4) {\r\n lum += 0.2126 * px[i]! + 0.7152 * px[i + 1]! + 0.0722 * px[i + 2]!\r\n }\r\n resolve(lum / count / 255 < 0.5)\r\n } catch {\r\n resolve(null)\r\n }\r\n }\r\n img.src = dataUrl\r\n })\r\n}\r\n\r\n/** HSL (h 0-360, s/l 0-1) → RGB (0-255 integers). */\r\nexport function hslToRgb(h: number, s: number, l: number): [number, number, number] {\r\n const c = (1 - Math.abs(2 * l - 1)) * s\r\n const hp = h / 60\r\n const x = c * (1 - Math.abs((hp % 2) - 1))\r\n let r = 0, g = 0, b = 0\r\n if (hp < 1) { r = c; g = x }\r\n else if (hp < 2) { r = x; g = c }\r\n else if (hp < 3) { g = c; b = x }\r\n else if (hp < 4) { g = x; b = c }\r\n else if (hp < 5) { r = x; b = c }\r\n else { r = c; b = x }\r\n const m = l - c / 2\r\n return [Math.round((r + m) * 255), Math.round((g + m) * 255), Math.round((b + m) * 255)]\r\n}\r\n","import { rWp, rBgState, rBl, rWop, rOps, rSop, rColor, rHasColor, rBlurs, rBgMode, rChatTextOpacity, rTrajectoryOpacity, rRightbarOpacity } from './state'\r\nimport type { PartOpacities, PartBlurs } from './types'\r\nimport { genTokens, toRgba } from './utils/color'\r\n\r\nlet wpEl: HTMLDivElement | null = null\r\nlet appliedTokenNames: string[] = []\r\nlet tokenStyleEl: HTMLStyleElement | null = null\r\n\r\nfunction ensureTokenStyle(): HTMLStyleElement {\r\n if (tokenStyleEl?.isConnected) return tokenStyleEl\r\n tokenStyleEl = document.createElement('style')\r\n tokenStyleEl.dataset.plugin = 'dsh-background-by-model-tokens'\r\n document.head.appendChild(tokenStyleEl)\r\n return tokenStyleEl\r\n}\r\n\r\nfunction clearCustomTokens(): void {\r\n if (tokenStyleEl) tokenStyleEl.textContent = ''\r\n for (const name of appliedTokenNames) document.body.style.removeProperty(name)\r\n appliedTokenNames = []\r\n}\r\n\r\n// Solid surface tokens grouped by which interface-opacity slider owns them.\r\n// Every member is re-emitted with per-part alpha so surfaces over the wallpaper\r\n// (composer input, elevated buttons, menu panels) can go translucent — not just\r\n// the layered bg/sidebar tokens. The two menu fills are owned by the card slider\r\n// and must always travel together: --dsw-specific-menu is what overlays paint\r\n// (dropdowns, slash-trigger menu, popovers around the dialog) and\r\n// --dsw-menu-surface-fill is what the shared MenuSurface material paints, which\r\n// dsh 0.1.7 aliases the former to. Re-emitting only one of them leaves a menu\r\n// panel on one fill and its sticky group headings on the other — the solid band\r\n// across the model selector's provider rows. The Cordis panel shares\r\n// --dsw-specific-menu but is re-scoped to the input slider via INPUT_BLUR_RULE.\r\nconst OPACITY_TOKEN_GROUPS: Array<{ part: keyof PartOpacities; names: string[] }> = [\r\n { part: 'bg', names: ['--dsw-alias-bg-base'] },\r\n { part: 'sidebar', names: ['--dsw-specific-sidebar-fill'] },\r\n { part: 'card', names: ['--dsw-alias-bg-layer-1', '--dsw-alias-bg-layer-2', '--dsw-alias-bg-layer-3', '--dsw-specific-menu', '--dsw-menu-surface-fill'] },\r\n { part: 'input', names: ['--dsw-specific-input-major'] },\r\n]\r\n\r\n// Plugin-owned variables the opacity-bearing tokens read from. They live as\r\n// inline custom props on <html>, so a slider drag rewrites only those few values\r\n// instead of re-parsing/re-matching the whole body token rule on every tick —\r\n// the difference is critical when a large wallpaper sits under the interface.\r\nconst OPACITY_VARS: Record<string, string> = {\r\n '--dsw-alias-bg-base': '--dsh-any-op-bg',\r\n '--dsw-specific-sidebar-fill': '--dsh-any-op-sidebar',\r\n '--dsw-alias-bg-layer-1': '--dsh-any-op-card-1',\r\n '--dsw-alias-bg-layer-2': '--dsh-any-op-card-2',\r\n '--dsw-alias-bg-layer-3': '--dsh-any-op-card-3',\r\n '--dsw-specific-input-major': '--dsh-any-op-input',\r\n // The MenuSurface material under a menu panel and the overlay fill its sticky\r\n // headings paint are the same value on a 0.1.7 host, so they read the same\r\n // plugin-owned variable — one slider, one alpha, no seam between them.\r\n '--dsw-specific-menu': '--dsh-any-op-menu',\r\n '--dsw-menu-surface-fill': '--dsh-any-op-menu',\r\n}\r\n\r\n// Fingerprint of the non-alpha token base (color pick + scheme verdict).\r\n// The static body rule is only rebuilt when it changes; a drag never touches it.\r\nlet baseTokenKey = ''\r\n\r\n// Coalesce slider-driven token updates to one rAF: a single drag fires several\r\n// input events per frame, and every full re-apply repaints expensive regions\r\n// over a large wallpaper. Batching keeps at most one update per frame.\r\nlet pendingOps: PartOpacities | null = null\r\nlet tokensRaf: number | null = null\r\n\r\nexport function applyCustomTokens(ops: PartOpacities): void {\r\n pendingOps = ops\r\n if (tokensRaf !== null) return\r\n tokensRaf = requestAnimationFrame(() => {\r\n tokensRaf = null\r\n if (pendingOps === null) return\r\n const o = pendingOps\r\n pendingOps = null\r\n applyCustomTokensNow(o)\r\n })\r\n}\r\n\r\n// Only the main-bg slider retints the center/details columns; keys on\r\n// baseTokenKey + ops.bg so a sidebar/card/input drag never rewrites them.\r\nlet lastBgKey = ''\r\n\r\nfunction applyCustomTokensNow(ops: PartOpacities): void {\r\n const [h, s, l] = rColor()\r\n const { tokens } = genTokens(h, s, l)\r\n try {\r\n const forceDark = l < 0.55\r\n if (`${h}|${s}|${l}` !== baseTokenKey) {\r\n baseTokenKey = `${h}|${s}|${l}`\r\n // Drive the base-palette switch with a plugin-specific value so the\r\n // gradient rule never matches a host dark-mode flag; color-scheme makes\r\n // native controls (select popups) follow the forced palette. Both ride the\r\n // stylesheet (not inline styles) so the host presenter clearing body\r\n // inline styles on boot can't drop them, and the !important rule survives\r\n // that clearing too.\r\n if (forceDark) document.body.setAttribute('data-ds-dark-theme', 'dsh-background-by-model')\r\n else document.body.removeAttribute('data-ds-dark-theme')\r\n const decls: string[] = [`color-scheme:${forceDark ? 'dark' : 'light'}`]\r\n for (const [name, value] of Object.entries(tokens)) {\r\n const opVar = OPACITY_VARS[name]\r\n decls.push(`${name}:${opVar !== undefined ? `var(${opVar})` : value}!important`)\r\n }\r\n ensureTokenStyle().textContent = `body{${decls.join(';')}}`\r\n // Drop inline tokens left by earlier builds so the stylesheet is the single source of truth.\r\n for (const name of appliedTokenNames) document.body.style.removeProperty(name)\r\n appliedTokenNames = Object.keys(tokens)\r\n }\r\n // Cheap per-drag update: only the surface alpha vars move on <html>.\r\n const root = document.documentElement\r\n for (const g of OPACITY_TOKEN_GROUPS) {\r\n for (const name of g.names) {\r\n root.style.setProperty(OPACITY_VARS[name], toRgba(tokens[name] ?? '#000', ops[g.part]))\r\n }\r\n }\r\n // The Cordis panel keeps its own input-slider alpha (see INPUT_BLUR_RULE).\r\n root.style.setProperty('--dsh-any-op-menu-cordis', toRgba(tokens['--dsw-specific-menu'] ?? '#000', ops.input))\r\n const bgKey = `${baseTokenKey}|${ops.bg}`\r\n if (bgKey !== lastBgKey) { lastBgKey = bgKey; applyPartOpacities(ops) }\r\n } catch {\r\n // ignore\r\n }\r\n}\r\n\r\n// ── Settings panel opacity ─────────────────────────────────────────────────────\r\n// The settings modal is the only aria-modal dialog identifying itself with\r\n// aria-labelledby, so this selector scopes translucency to the settings panel.\r\n// The surface (--dsw-alias-bg-layer-2) is re-emitted with an alpha through a\r\n// plugin-owned variable so the panel keeps its color while fading.\r\n\r\nconst SETTINGS_PANEL_SEL = '[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby]'\r\nexport const SETTINGS_STYLE_RULE =\r\n `${SETTINGS_PANEL_SEL}{` +\r\n `background:var(--dsh-any-bg-settings-surface,var(--dsw-alias-bg-layer-2));` +\r\n `backdrop-filter:var(--dsh-any-blur-settings,none);` +\r\n // Re-scope the dialog's layer tokens to plugin-owned variables so every\r\n // surface inside the dialog follows the settings opacity slider only.\r\n `--dsw-alias-bg-layer-1:var(--dsh-any-bg-settings-layer-1);` +\r\n `--dsw-alias-bg-layer-2:var(--dsh-any-bg-settings-layer-2);` +\r\n `--dsw-alias-bg-layer-3:var(--dsh-any-bg-settings-layer-3)}` +\r\n // Option-panel blur inside the dialog, owned by the card blur slider.\r\n `${SETTINGS_PANEL_SEL} .dab-card{backdrop-filter:var(--dsh-any-blur-card-panels,none);-webkit-backdrop-filter:var(--dsh-any-blur-card-panels,none)}`\r\n\r\n// Input/control surface blur. The composer card and the Cordis panel expose\r\n// stable host data attributes ([data-composer-card], [data-cordis-panel]), so\r\n// the backdrop is attached via a stylesheet rule rather than element discovery.\r\n// The Cordis panel shares the --dsw-specific-menu token with the dialog's\r\n// option boxes, but it stays owned by the input slider — the re-scope below\r\n// keeps it there now that the menu token itself follows the card slider. Note\r\n// the input slider must NOT drive the button-elevated-fill /\r\n// button-floating-hover tokens: the settings panel's own controls (slider\r\n// thumbs, .dab-btn, segmented thumb) are painted from those same tokens, so\r\n// tinting them would bleach the panel's own UI.\r\nexport const INPUT_BLUR_RULE =\r\n '[data-composer-card],[data-cordis-panel]{' +\r\n '-webkit-backdrop-filter:var(--dsh-any-input-blur,none);' +\r\n 'backdrop-filter:var(--dsh-any-input-blur,none)}' +\r\n '[data-cordis-panel]{--dsw-specific-menu:var(--dsh-any-op-menu-cordis)!important}'\r\n\r\nfunction applyInputBlur(px: number): void {\r\n if (px > 0) document.documentElement.style.setProperty('--dsh-any-input-blur', `blur(${px}px)`)\r\n else document.documentElement.style.removeProperty('--dsh-any-input-blur')\r\n}\r\n\r\n// Placeholder/hint text inside the composer and the plugin's own input\r\n// surfaces: rendered with the weak caption token (distinct from real input)\r\n// plus italic, so an empty box is never mistaken for typed content.\r\nexport const PLACEHOLDER_RULE =\r\n '[data-composer-card] textarea::placeholder,' +\r\n '[data-composer-card] input::placeholder,' +\r\n '[data-composer-card] [contenteditable]::placeholder,' +\r\n '[data-cordis-panel] input::placeholder,' +\r\n '[data-cordis-panel] textarea::placeholder,' +\r\n '.dab-input::placeholder,' +\r\n '.dab-input textarea::placeholder,' +\r\n '.dab-input input::placeholder' +\r\n '{color:var(--dsh-any-placeholder,var(--dsw-alias-label-caption,#8a8f98))!important;font-style:italic;opacity:.85}'\r\n\r\nexport function applySettingsOverrides(op: number): void {\r\n // Always written explicitly (including 100%) — removing them would make\r\n // SETTINGS_STYLE_RULE fall back to the body layer tokens that\r\n // applyCustomTokens rewrites with the homepage card alpha.\r\n const [h, s, l] = rColor()\r\n const tokens = genTokens(h, s, l).tokens\r\n const layer1 = tokens['--dsw-alias-bg-layer-1']\r\n const layer2 = tokens['--dsw-alias-bg-layer-2']\r\n const layer3 = tokens['--dsw-alias-bg-layer-3']\r\n if (layer2 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-bg-settings-surface', toRgba(layer2, op))\r\n }\r\n // Dialog-scoped layer overrides consumed by SETTINGS_STYLE_RULE; opacity\r\n // follows the settings slider only (the card slider reaches panels via blur).\r\n if (layer1 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-bg-settings-layer-1', toRgba(layer1, op))\r\n }\r\n if (layer2 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-bg-settings-layer-2', toRgba(layer2, op))\r\n }\r\n if (layer3 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-bg-settings-layer-3', toRgba(layer3, op))\r\n }\r\n}\r\n\r\n// ── Trajectory view opacity ──────────────────────────────────────────────\r\n// The trajectory view's own panels fully cover the root, so retinting only the\r\n// root background is invisible. Re-scope the view root's layer tokens to\r\n// plugin-owned variables so every surface follows the trajectory slider.\r\nexport const TRAJECTORY_STYLE_RULE =\r\n '[data-conversation-composer-overlay]{' +\r\n // No fallback inside var(): a self-referential fallback would be a cycle.\r\n '--dsw-alias-bg-layer-1:var(--dsh-any-traj-layer-1);' +\r\n '--dsw-alias-bg-layer-2:var(--dsh-any-traj-layer-2);' +\r\n '--dsw-alias-bg-layer-3:var(--dsh-any-traj-layer-3)}'\r\n\r\nexport function applyTrajectoryOverrides(op: number): void {\r\n // Always written explicitly so the view stays owned by this slider at 100%.\r\n const [h, s, l] = rColor()\r\n const tokens = genTokens(h, s, l).tokens\r\n const layer1 = tokens['--dsw-alias-bg-layer-1']\r\n const layer2 = tokens['--dsw-alias-bg-layer-2']\r\n const layer3 = tokens['--dsw-alias-bg-layer-3']\r\n if (layer1 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-traj-layer-1', toRgba(layer1, op))\r\n }\r\n if (layer2 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-traj-layer-2', toRgba(layer2, op))\r\n }\r\n if (layer3 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-traj-layer-3', toRgba(layer3, op))\r\n }\r\n}\r\n\r\n// ── File-preview panel (right sidebar) ────────────────────────────────────\r\n// Clicking a file opens the host's right panel, whose visible surface is painted\r\n// from `background: var(--dsw-alias-bg-base)` — the exact token the\r\n// main-background slider re-emits with its own alpha. The panel was therefore a\r\n// second, unnamed copy of the main background with no control of its own; this\r\n// card takes it over, on whichever element the host paints that surface.\r\n//\r\n// dsh 0.1.7 moved the paint off the panel: the container lost its background and\r\n// became the slide / fullscreen viewport, and it stays mounted at its full width\r\n// for the whole session — collapsing it only slides the dock out (`transform` +\r\n// `visibility`, never `display`). A surface (plus a backdrop-filter) written on\r\n// that container therefore covers the empty right half of the frame even with\r\n// the panel closed, which is the permanent frosted plate 0.1.7 shows. The dock's\r\n// own tab hosts are what the host paints now, so the card follows them:\r\n//\r\n// 0.1.7+ the dock's tab hosts — `[data-dockkit-content]` (and the\r\n// `[data-dockkit-empty]` seat of an empty pane), painted by the host\r\n// from the same token and hidden with `visibility`, so the card rides\r\n// the host's own open/close and slide transitions for free. Floating\r\n// panes are excluded exactly as the host excludes them.\r\n// older the panel itself, which used to carry that background on its hashed\r\n// class. `:has()` keeps the two apart, so the alpha is never painted\r\n// twice over on a 0.1.7 host.\r\n//\r\n// The selectors use data attributes (not the hashed CSS-module classes) and\r\n// `!important` outranks the host's class rule. The `var()` fallback keeps the\r\n// host's own value until a rule with a color supplies one, so a color-less rule\r\n// changes nothing here.\r\n//\r\n// backdrop-filter stays on the container — that is where this card has always\r\n// put it, and it keeps the panel to a single filter pass — but only while the\r\n// panel is open: an always-on filter is what turned the collapsed panel into a\r\n// plate.\r\nexport const RIGHTBAR_STYLE_RULE =\r\n 'div[data-sidebar-right-panel]:not(:has([data-dockkit-content],[data-dockkit-empty]))[data-sidebar-right-open],' +\r\n 'div[data-sidebar-right-panel] [data-dockkit-content]:not([data-dockkit-float]),' +\r\n 'div[data-sidebar-right-panel] [data-dockkit-empty]{' +\r\n 'background:var(--dsh-any-bg-rightbar,var(--dsw-alias-bg-base))!important}' +\r\n 'div[data-sidebar-right-panel][data-sidebar-right-open]{' +\r\n '-webkit-backdrop-filter:var(--dsh-any-blur-rightbar,none);' +\r\n 'backdrop-filter:var(--dsh-any-blur-rightbar,none)}'\r\n\r\n/** Paint the file-preview panel's surface from its own slider. */\r\nexport function applyRightbarOverrides(op: number): void {\r\n const root = document.documentElement\r\n // With no rule color the plugin owns no palette at all, so the panel must fall\r\n // back to the host's own --dsw-alias-bg-base rather than to ours.\r\n if (!rHasColor()) { root.style.removeProperty('--dsh-any-bg-rightbar'); return }\r\n const [h, s, l] = rColor()\r\n const base = genTokens(h, s, l).tokens['--dsw-alias-bg-base']\r\n if (base !== undefined) root.style.setProperty('--dsh-any-bg-rightbar', toRgba(base, op))\r\n}\r\n\r\n/** Extra backdrop frost for the file-preview panel (0 = no frost of its own). */\r\nfunction applyRightbarBlur(px: number): void {\r\n if (px > 0) document.documentElement.style.setProperty('--dsh-any-blur-rightbar', `blur(${px}px)`)\r\n else document.documentElement.style.removeProperty('--dsh-any-blur-rightbar')\r\n}\r\n\r\n// ── Per-part interface blur ───────────────────────────────────────────────────\r\n// The AppFrame columns use hashed CSS-module classes, so parts are located\r\n// structurally: the shell overlay carries a stable data attribute and the\r\n// sidebar/center/details columns are its three preceding siblings.\r\n//\r\n// backdrop-filter must NEVER go directly on a host part: it turns the element\r\n// into a containing block for fixed-positioned descendants, which would trap\r\n// the host's settings dialog inside the column. Each blurred part carries an\r\n// isolated ::before underlay holding the backdrop-filter instead.\r\nlet frameEl: HTMLElement | null = null\r\nlet sidebarEl: HTMLElement | null = null\r\nlet centerEl: HTMLElement | null = null\r\nlet detailsEl: HTMLElement | null = null\r\n\r\nconst PART_BLUR_CLASS = 'dab-part-blur'\r\nconst PART_UNDERLAY_CLASS = 'dab-part-underlay'\r\nconst PART_BLUR_RULE =\r\n `${PART_BLUR_CLASS}{isolation:isolate}` +\r\n `.${PART_UNDERLAY_CLASS}{position:absolute;inset:0;z-index:-1;pointer-events:none;border-radius:inherit;` +\r\n `backdrop-filter:var(--dsh-any-part-blur,none);-webkit-backdrop-filter:var(--dsh-any-part-blur,none)}`\r\n\r\nlet partBlurStyleEl: HTMLStyleElement | null = null\r\n\r\nfunction ensurePartBlurStyle(): void {\r\n if (partBlurStyleEl?.isConnected) return\r\n partBlurStyleEl = document.createElement('style')\r\n partBlurStyleEl.dataset.plugin = 'dsh-background-by-model-parts'\r\n partBlurStyleEl.textContent = PART_BLUR_RULE\r\n document.head.appendChild(partBlurStyleEl)\r\n}\r\n\r\nfunction discoverParts(): void {\r\n const overlay = document.querySelector<HTMLElement>('[data-shell-overlay]')\r\n if (overlay === null) return\r\n const frame = overlay.parentElement\r\n if (frame === null) return\r\n frameEl = frame\r\n const idx = Array.from(frame.children).indexOf(overlay)\r\n sidebarEl = (frame.children[idx - 3] as HTMLElement | undefined) ?? null\r\n centerEl = (frame.children[idx - 2] as HTMLElement | undefined) ?? null\r\n detailsEl = (frame.children[idx - 1] as HTMLElement | undefined) ?? null\r\n}\r\n\r\nfunction setBlur(el: HTMLElement | null, px: number): void {\r\n if (el === null) return\r\n const underlay = el.querySelector<HTMLDivElement>(`:scope > .${PART_UNDERLAY_CLASS}`)\r\n if (px > 0) {\r\n ensurePartBlurStyle()\r\n // The underlay is position:absolute and needs a positioned host: static\r\n // columns get relative (a layout no-op for flex items) that is restored on\r\n // clear; parts the host already positions keep their own scheme.\r\n if (!el.classList.contains(PART_BLUR_CLASS) && getComputedStyle(el).position === 'static') {\r\n el.style.position = 'relative'\r\n el.setAttribute('data-dab-pos-patched', '1')\r\n }\r\n el.classList.add(PART_BLUR_CLASS)\r\n if (underlay === null) {\r\n const node = document.createElement('div')\r\n node.className = PART_UNDERLAY_CLASS\r\n el.prepend(node)\r\n }\r\n el.style.setProperty('--dsh-any-part-blur', `blur(${px}px)`)\r\n } else {\r\n el.classList.remove(PART_BLUR_CLASS)\r\n el.style.removeProperty('--dsh-any-part-blur')\r\n underlay?.remove()\r\n if (el.getAttribute('data-dab-pos-patched') === '1') {\r\n el.style.removeProperty('position')\r\n el.removeAttribute('data-dab-pos-patched')\r\n }\r\n }\r\n}\r\n\r\nfunction applySettingsBlur(px: number): void {\r\n if (px > 0) document.documentElement.style.setProperty('--dsh-any-blur-settings', `blur(${px}px)`)\r\n else document.documentElement.style.removeProperty('--dsh-any-blur-settings')\r\n}\r\n\r\n/** Apply the main-background opacity to the center/details columns instead of\r\n * the frame. The frame's translucent bg-base sits UNDER the sidebar, so\r\n * reducing the main-bg opacity stacked a second alpha onto the sidebar; moving\r\n * the alpha onto the columns keeps the sidebar owned by its own slider. */\r\nfunction applyPartOpacities(ops: PartOpacities): void {\r\n if (!rHasColor()) return\r\n discoverParts()\r\n if (frameEl === null) return\r\n const [h, s, l] = rColor()\r\n const base = genTokens(h, s, l).tokens['--dsw-alias-bg-base']\r\n frameEl.style.background = 'transparent'\r\n if (centerEl !== null) centerEl.style.background = base !== undefined ? toRgba(base, ops.bg) : 'transparent'\r\n if (detailsEl !== null) detailsEl.style.background = base !== undefined ? toRgba(base, ops.bg) : 'transparent'\r\n}\r\n\r\n/** Blur of the option panels inside the settings dialog (.dab-card), owned by\r\n * the \"dialog option panel\" (card) blur slider. Written as a plugin-owned\r\n * variable consumed by SETTINGS_STYLE_RULE — deliberately NOT applied to the\r\n * homepage center/details columns, which this slider must never touch. */\r\nfunction applyCardPanelsBlur(px: number): void {\r\n if (px > 0) document.documentElement.style.setProperty('--dsh-any-blur-card-panels', `blur(${px}px)`)\r\n else document.documentElement.style.removeProperty('--dsh-any-blur-card-panels')\r\n}\r\n\r\n/** Apply per-part interface blur to the AppFrame columns + settings panel. */\r\nexport function applyPartBlurs(blurs: PartBlurs): void {\r\n discoverParts()\r\n // The bg blur frosts the wallpaper behind the main content columns (center +\r\n // details); the frame itself stays unblurred so the sidebar is never\r\n // double-frosted by both the bg and sidebar sliders.\r\n setBlur(frameEl, 0)\r\n setBlur(sidebarEl, blurs.sidebar)\r\n setBlur(centerEl, blurs.bg)\r\n setBlur(detailsEl, blurs.bg)\r\n applyCardPanelsBlur(blurs.card)\r\n applySettingsBlur(blurs.settings)\r\n applyInputBlur(blurs.input)\r\n applyRightbarBlur(blurs.rightbar)\r\n applyViewCards()\r\n}\r\n\r\n/** Live per-part blur update during slider drag (no full re-apply). */\r\nexport function setPartBlur(part: keyof PartBlurs, v: number): void {\r\n if (part === 'settings') { applySettingsBlur(v); return }\r\n if (part === 'card') { applyCardPanelsBlur(v); return }\r\n if (part === 'input') { applyInputBlur(v); return }\r\n if (part === 'rightbar') { applyRightbarBlur(v); return }\r\n if (part === 'chat' || part === 'trajectory') { applyViewCards(); return }\r\n discoverParts()\r\n if (part === 'bg') { setBlur(centerEl, v); setBlur(detailsEl, v) }\r\n else setBlur(sidebarEl, v)\r\n}\r\n\r\n// ── Conversation view treatments ────────────────────────────────────\r\n// The chat message column is styled as a real card (layer-1 surface + border +\r\n// 16px radius + 18px padding); the trajectory view gets NO card decoration —\r\n// its own panels fully cover the view root, so its opacity slider re-scopes the\r\n// layer tokens inside the view and its blur frosts the backdrop through the\r\n// standard root underlay.\r\n//\r\n// Host structure (deepseek-harness ui-conversation / ui-trajectory):\r\n// ConversationRoot\r\n// header — title + tabs, OUTSIDE the scrollport\r\n// [data-conversation-scroll] — the single scrollport\r\n// [data-chat-flow] ← chat column (flow content, NOT scrollable)\r\n// [data-conversation-composer-overlay] ← trajectory view root\r\n// [data-composer-seat] — sticky composer, a sibling\r\n// Cards are ALWAYS styled once their host exists — sliders at zero only turn\r\n// surface/border transparent, so the layout never reflows and the view cannot\r\n// jump when a slider leaves zero. Removal happens only at plugin teardown.\r\ninterface ViewCardSpec {\r\n sel: string\r\n mark: string\r\n /** Dataset key prefix holding the stashed pre-card inline values. */\r\n prev: string\r\n opacity: () => number\r\n blur: () => number\r\n /** Generic heuristic fallback (chat card only, hosts without the marker). */\r\n fallback?: boolean\r\n /** No card decoration — surfaces follow scoped layer tokens; only the blur\r\n * underlay is attached to the host element. */\r\n plain?: boolean\r\n}\r\n\r\nconst VIEW_CARDS: ViewCardSpec[] = [\r\n { sel: '[data-chat-flow]', mark: 'data-dab-chat-card', prev: 'dabChatPrev', opacity: rChatTextOpacity, blur: () => rBlurs().chat, fallback: true },\r\n { sel: '[data-conversation-composer-overlay]', mark: 'data-dab-traj-card', prev: 'dabTrajPrev', opacity: rTrajectoryOpacity, blur: () => rBlurs().trajectory, plain: true },\r\n]\r\n\r\nconst viewTargets: Array<HTMLElement | null> = VIEW_CARDS.map(() => null)\r\n\r\nfunction isScrollableY(el: HTMLElement): boolean {\r\n const oy = getComputedStyle(el).overflowY\r\n // 'overlay' covers Chromium's non-standard overflow value.\r\n return oy === 'auto' || oy === 'scroll' || oy === 'overlay'\r\n}\r\n\r\n/** Whether the subtree hosts the chat input (textarea / contenteditable /\r\n * textbox role) — used to keep the card off the input row. */\r\nfunction containsChatEditor(el: HTMLElement): boolean {\r\n return el.querySelector('textarea,[contenteditable=\"true\"],[contenteditable=\"\"],[contenteditable=\"plaintext-only\"],[role=\"textbox\"]') !== null\r\n}\r\n\r\n/** Walk down from a coarse candidate toward the actual message column. */\r\nfunction refineMessageColumn(start: HTMLElement): HTMLElement {\r\n let cur = start\r\n for (let depth = 0; depth < 10; depth++) {\r\n if (isScrollableY(cur)) break\r\n const kids = Array.from(cur.children).filter((k): k is HTMLElement => k instanceof HTMLElement)\r\n if (kids.length === 0) break\r\n const tallest = kids.reduce((a, b) => (b.clientHeight > a.clientHeight ? b : a))\r\n if (containsChatEditor(cur)) {\r\n const candidates = kids.filter(k => !containsChatEditor(k) && k.clientHeight >= cur.clientHeight * 0.4)\r\n if (candidates.length === 0) break\r\n cur = candidates.reduce((a, b) => (b.clientHeight > a.clientHeight ? b : a))\r\n continue\r\n }\r\n if (kids.length > 1 && tallest.clientHeight >= cur.clientHeight * 0.85) { cur = tallest; continue }\r\n break\r\n }\r\n return cur\r\n}\r\n\r\nfunction discoverViewTarget(idx: number, spec: ViewCardSpec): HTMLElement | null {\r\n if (centerEl === null || !document.body.contains(centerEl)) { viewTargets[idx] = null; return null }\r\n // The host marker always wins over a cached fallback (the view may not be\r\n // mounted yet when the plugin applies early).\r\n const marked = centerEl.querySelector<HTMLElement>(spec.sel)\r\n const cached = viewTargets[idx]\r\n if (marked !== null) {\r\n if (cached !== null && cached !== marked) { setBlur(cached, 0); restoreCardHost(cached, spec.mark, spec.prev, spec.plain === true) }\r\n viewTargets[idx] = marked\r\n return marked\r\n }\r\n if (cached !== null && centerEl.contains(cached)) return cached\r\n viewTargets[idx] = null\r\n if (spec.fallback !== true) return null\r\n // On the harness, an absent [data-chat-flow] just means the chat view is not\r\n // mounted (hero phase, trajectory tab) — settling on the whole scrollport\r\n // there would wrap the entire page in the card.\r\n if (centerEl.querySelector('[data-conversation-scroll]') !== null) return null\r\n // Marker-less hosts keep their layout until a slider moves.\r\n if (spec.opacity() <= 0 && spec.blur() <= 0) return null\r\n let best: HTMLElement | null = null\r\n let bestArea = 0\r\n for (const el of Array.from(centerEl.querySelectorAll<HTMLElement>('*'))) {\r\n if (!isScrollableY(el)) continue\r\n if (el.clientHeight < centerEl.clientHeight * 0.35) continue\r\n const area = el.clientWidth * el.clientHeight\r\n if (area > bestArea) { bestArea = area; best = el }\r\n }\r\n if (best === null) {\r\n for (const el of Array.from(centerEl.children)) {\r\n if (!(el instanceof HTMLElement)) continue\r\n if (el.clientHeight < centerEl.clientHeight * 0.5) continue\r\n if (el.clientHeight > (best?.clientHeight ?? 0)) best = el\r\n }\r\n }\r\n const refined = best !== null ? refineMessageColumn(best) : null\r\n viewTargets[idx] = refined\r\n return refined\r\n}\r\n\r\n/** Stash the host's own inline values so teardown restores them exactly. */\r\nfunction stashCardPrev(el: HTMLElement, prev: string, plain: boolean): void {\r\n const ds = el.dataset as Record<string, string | undefined>\r\n ds[prev + 'Bg'] = el.style.getPropertyValue('background')\r\n if (plain) return\r\n ds[prev + 'Border'] = el.style.getPropertyValue('border')\r\n ds[prev + 'Radius'] = el.style.getPropertyValue('border-radius')\r\n ds[prev + 'Padding'] = el.style.getPropertyValue('padding')\r\n}\r\n\r\n/** Undo the inline styling, restoring the host's previous inline values. */\r\nfunction restoreCardHost(el: HTMLElement, mark: string, prev: string, plain: boolean): void {\r\n if (!el.hasAttribute(mark)) return\r\n const ds = el.dataset as Record<string, string | undefined>\r\n const restore = (prop: string, v: string | undefined): void => {\r\n if (v !== undefined && v !== '') el.style.setProperty(prop, v)\r\n else el.style.removeProperty(prop)\r\n }\r\n restore('background', ds[prev + 'Bg'])\r\n if (!plain) {\r\n restore('border', ds[prev + 'Border'])\r\n restore('border-radius', ds[prev + 'Radius'])\r\n restore('padding', ds[prev + 'Padding'])\r\n delete ds[prev + 'Border']; delete ds[prev + 'Radius']; delete ds[prev + 'Padding']\r\n }\r\n delete ds[prev + 'Bg']\r\n el.removeAttribute(mark)\r\n}\r\n\r\n/** Teardown only: strip every view treatment and hand the hosts back untouched. */\r\nfunction removeViewCards(): void {\r\n VIEW_CARDS.forEach((spec, i) => {\r\n const el = viewTargets[i]\r\n if (el !== null) { setBlur(el, 0); restoreCardHost(el, spec.mark, spec.prev, spec.plain === true) }\r\n viewTargets[i] = null\r\n })\r\n}\r\n\r\n// ── Wide markdown tables ──────────────────────────────────────────────────────\r\n// DSH intentionally lets `.md-table-wide` bleed outside the text column. That\r\n// bleed only becomes visible once the chat surface gains a visible border, i.e.\r\n// when the chat region opacity or blur is non-zero. Under that same condition,\r\n// pull the table back inside the column and let it scroll horizontally.\r\nconst TABLE_FIX_RULE = [\r\n '.md-table-wide {',\r\n ' --dsh-table-spare: 0px !important;',\r\n ' --dsh-table-lead: 0px !important;',\r\n ' box-sizing: border-box !important;',\r\n ' width: 100% !important;',\r\n ' max-width: 100% !important;',\r\n ' margin-left: 0 !important;',\r\n ' padding-left: 0 !important;',\r\n ' padding-bottom: 0 !important;',\r\n ' overflow-x: auto !important;',\r\n '}',\r\n].join('\\n')\r\nlet tableFixStyleEl: HTMLStyleElement | null = null\r\n\r\n/** Toggle the wide-table clamp according to the chat region's opacity & blur. */\r\nfunction syncTableFix(): void {\r\n const needed = rChatTextOpacity() > 0 || rBlurs().chat > 0\r\n if (!needed) {\r\n if (tableFixStyleEl !== null) { tableFixStyleEl.remove(); tableFixStyleEl = null }\r\n return\r\n }\r\n if (tableFixStyleEl === null) {\r\n tableFixStyleEl = document.createElement('style')\r\n tableFixStyleEl.dataset.plugin = 'dsh-background-by-model-table-fix'\r\n tableFixStyleEl.textContent = TABLE_FIX_RULE\r\n }\r\n if (!tableFixStyleEl.isConnected) document.head.appendChild(tableFixStyleEl)\r\n}\r\n\r\n/** Re-derive the conversation view cards from the current config. */\r\nexport function applyViewCards(): void {\r\n discoverParts()\r\n if (centerEl === null) return\r\n const [h, s, l] = rColor()\r\n const surface = genTokens(h, s, l).tokens['--dsw-alias-bg-layer-1']\r\n VIEW_CARDS.forEach((spec, i) => {\r\n const target = discoverViewTarget(i, spec)\r\n if (target === null) return\r\n const plain = spec.plain === true\r\n const opacity = spec.opacity()\r\n const blurPx = spec.blur()\r\n if (!plain) {\r\n if (!target.hasAttribute(spec.mark)) stashCardPrev(target, spec.prev, false)\r\n // Mirrors .dab-card (layer-1 background, border, 16px radius, 18px\r\n // padding), written inline so it wins over host stylesheets; the opacity\r\n // slider drives surface alpha and fades the border with it.\r\n const borderAlpha = opacity > 0 ? Math.min(1, opacity * 1.5) : (blurPx > 0 ? 0.35 : 0)\r\n target.style.background = surface !== undefined ? toRgba(surface, opacity) : 'transparent'\r\n target.style.border = surface !== undefined ? `1px solid ${toRgba(surface, borderAlpha)}` : '1px solid transparent'\r\n target.style.borderRadius = '16px'\r\n target.style.padding = '18px'\r\n }\r\n // Plain views write no inline styles — only the blur underlay is hosted here.\r\n target.setAttribute(spec.mark, '1')\r\n setBlur(target, blurPx)\r\n })\r\n syncTableFix()\r\n}\r\n\r\nlet partsObserver: MutationObserver | null = null\r\n\r\n/** Watch for the AppFrame mounting so persisted blurs land even when the shell\r\n * renders after this plugin's apply. */\r\nexport function watchParts(): void {\r\n if (partsObserver !== null || typeof MutationObserver === 'undefined') return\r\n partsObserver = new MutationObserver(() => {\r\n if (frameEl !== null && sidebarEl !== null && centerEl !== null && detailsEl !== null && document.body.contains(frameEl)\r\n // Keep re-applying while any card host is absent or was swapped by the host.\r\n && viewTargets.every(el => el !== null && document.body.contains(el))) return\r\n applyPartBlurs(rBlurs())\r\n applyPartOpacities(rOps())\r\n })\r\n partsObserver.observe(document.body, { childList: true, subtree: true })\r\n}\r\n\r\nexport function stopWatchingParts(): void {\r\n partsObserver?.disconnect()\r\n partsObserver = null\r\n}\r\n\r\n// ── Theme-reset watchdog ──────────────────────────────────────────────────\r\n// The host re-asserts its own :root/body scheme rules on mount, on settings\r\n// adoption and after the plugin's startup assertion, toggling the\r\n// `data-ds-dark-theme` attribute off / to a host value — which would paint a\r\n// frame of light surfaces. Watch that flag and, whenever the plugin's own\r\n// value disappears, re-set it and re-emit the token stylesheet within the same\r\n// frame.\r\nlet themeObserver: MutationObserver | null = null\r\nlet themeRaf = 0\r\n\r\nfunction reassertScheme(): void {\r\n const [, , l] = rColor()\r\n if (l < 0.55) document.body.setAttribute('data-ds-dark-theme', 'dsh-background-by-model')\r\n else document.body.removeAttribute('data-ds-dark-theme')\r\n applyCustomTokens(rOps())\r\n}\r\n\r\n/** Re-assert the plugin's forced scheme whenever the host strips it, so a\r\n * refresh / cold-load / set-change never flashes a light frame. */\r\nexport function watchThemeResets(): () => void {\r\n if (themeObserver !== null || typeof MutationObserver === 'undefined') return () => undefined\r\n themeObserver = new MutationObserver(() => {\r\n if (document.body.getAttribute('data-ds-dark-theme') === 'dsh-background-by-model') return\r\n if (!rHasColor()) return\r\n if (themeRaf !== 0) return\r\n themeRaf = requestAnimationFrame(() => {\r\n themeRaf = 0\r\n if (document.body.getAttribute('data-ds-dark-theme') === 'dsh-background-by-model') return\r\n reassertScheme()\r\n })\r\n })\r\n themeObserver.observe(document.body, { attributes: true, attributeFilter: ['data-ds-dark-theme'] })\r\n themeObserver.observe(document.documentElement, { attributes: true, attributeFilter: ['data-ds-dark-theme'] })\r\n return () => {\r\n themeObserver?.disconnect()\r\n themeObserver = null\r\n }\r\n}\r\n\r\n// ── Wallpaper layer: two stacked layers, cross-faded on a rule switch ───────\r\n// The incoming image fades in ON TOP of the outgoing one at full opacity.\r\n// Fading the old one out at the same time would drop the composite below full\r\n// alpha at the midpoint — both images half transparent — and the interface\r\n// behind would flash through.\r\n//\r\n// A layer addresses its image by OBJECT URL (see displayImageOf in state):\r\n// assigning a `url(data:…)` background re-decodes the photo on every switch,\r\n// which is where a large wallpaper's stall comes from, while a blob URL is\r\n// served from the browser's memory cache after the first load.\r\nconst FADE_MS = 320\r\n\r\ninterface WpLayer {\r\n el: HTMLDivElement\r\n /** Display URL of the image painted on this layer; null when empty. */\r\n url: string | null\r\n}\r\n\r\nlet layers: [WpLayer, WpLayer] | null = null\r\n/** Index of the layer the user is looking at. */\r\nlet front = 0\r\n/** Index of the layer fading in right now, if any. */\r\nlet pending: 0 | 1 | null = null\r\nlet fadeTimer: number | null = null\r\n\r\nfunction createLayer(): WpLayer {\r\n const el = document.createElement('div')\r\n el.dataset.dabWpLayer = ''\r\n el.style.cssText = 'position:absolute;inset:0;opacity:0;background-repeat:no-repeat;background-position:center;'\r\n return { el, url: null }\r\n}\r\n\r\nfunction ensureWpContainer(): void {\r\n if (wpEl !== null && layers !== null && document.body.contains(wpEl)) return\r\n if (fadeTimer !== null) { window.clearTimeout(fadeTimer); fadeTimer = null }\r\n const a = createLayer()\r\n const b = createLayer()\r\n wpEl = document.createElement('div')\r\n wpEl.dataset.dabWp = ''\r\n wpEl.style.cssText = 'position:fixed;inset:0;z-index:-1;pointer-events:none;overflow:hidden;'\r\n wpEl.append(a.el, b.el)\r\n layers = [a, b]\r\n front = 0\r\n pending = null\r\n document.body.prepend(wpEl)\r\n}\r\n\r\n/** Drop the whole wallpaper layer (no rule carries an image). */\r\nfunction dropWpContainer(): void {\r\n if (fadeTimer !== null) { window.clearTimeout(fadeTimer); fadeTimer = null }\r\n pending = null\r\n front = 0\r\n layers = null\r\n wpEl?.remove()\r\n wpEl = null\r\n}\r\n\r\n/** Release one layer's image — the layer is fully covered when this is called. */\r\nfunction clearLayer(l: WpLayer): void {\r\n if (l.url === null) return\r\n l.url = null\r\n l.el.style.backgroundImage = ''\r\n l.el.style.backgroundSize = ''\r\n l.el.style.backgroundPosition = ''\r\n}\r\n\r\n/** Intrinsic-size cache for the center mode (native pixels of the current image). */\r\nlet imgNat: { url: string; w: number; h: number } | null = null\r\nfunction imageNatSize(url: string, cb: (w: number, h: number) => void): void {\r\n if (imgNat !== null && imgNat.url === url) { cb(imgNat.w, imgNat.h); return }\r\n const img = new Image()\r\n img.onload = () => {\r\n imgNat = { url, w: img.naturalWidth, h: img.naturalHeight }\r\n cb(img.naturalWidth, img.naturalHeight)\r\n }\r\n img.onerror = () => cb(0, 0)\r\n img.src = url\r\n}\r\n\r\n/** Paint one layer's image and its placement. The placement always follows the\r\n * ACTIVE rule: the incoming layer is painted right after a switch, and a\r\n * repaint of the same URL (framing edit, viewport resize) must use the rule's\r\n * current framing. */\r\nfunction paintLayer(l: WpLayer, url: string): void {\r\n const el = l.el\r\n l.url = url\r\n const bg = rBgState()\r\n const mode = rBgMode()\r\n const next = `url(\"${url}\")`\r\n // Skip re-setting the same URL — a redundant assignment can flash the layer\r\n // blank for a frame while it is re-resolved.\r\n if (el.style.backgroundImage !== next) {\r\n el.style.backgroundImage = next\r\n }\r\n if (mode === 'fit') {\r\n el.style.backgroundRepeat = 'no-repeat'\r\n if (bg.iw > 0) {\r\n // Contain-fit at zoom with the image center pinned to the committed\r\n // fractional viewport point, so the framed region survives viewport changes.\r\n const fit = Math.min(window.innerWidth / bg.iw, window.innerHeight / bg.ih)\r\n const w = bg.iw * fit * bg.zoom\r\n const h = bg.ih * fit * bg.zoom\r\n el.style.backgroundSize = `${w}px ${h}px`\r\n el.style.backgroundPosition = `${bg.x * window.innerWidth - w / 2}px ${bg.y * window.innerHeight - h / 2}px`\r\n } else {\r\n // Fresh image: match the editor's initial centered contain view.\r\n el.style.backgroundSize = 'contain'\r\n el.style.backgroundPosition = 'center'\r\n }\r\n } else if (mode === 'fill') {\r\n el.style.backgroundRepeat = 'no-repeat'\r\n el.style.backgroundSize = 'cover'\r\n el.style.backgroundPosition = 'center'\r\n } else if (mode === 'stretch') {\r\n el.style.backgroundRepeat = 'no-repeat'\r\n el.style.backgroundSize = '100% 100%'\r\n el.style.backgroundPosition = 'center'\r\n } else if (mode === 'tile') {\r\n el.style.backgroundRepeat = 'repeat'\r\n // background-size:auto resolves the intrinsic size per tile.\r\n el.style.backgroundSize = 'auto'\r\n el.style.backgroundPosition = '0px 0px'\r\n } else {\r\n // Center: native size, centered. The intrinsic size needs an async decode;\r\n // 'contain' keeps a sensible frame until it lands.\r\n el.style.backgroundRepeat = 'no-repeat'\r\n el.style.backgroundSize = 'contain'\r\n el.style.backgroundPosition = 'center'\r\n imageNatSize(url, (w, h) => {\r\n if (l.url !== url || el.style.backgroundImage !== next || rBgMode() !== 'center') return\r\n if (w > 0 && h > 0) {\r\n el.style.backgroundSize = `${w}px ${h}px`\r\n el.style.backgroundPosition = 'center'\r\n }\r\n })\r\n }\r\n}\r\n\r\n/** Whether a switch should animate: nothing to fade from, an invisible\r\n * wallpaper and a reduced-motion preference all switch instantly. */\r\nfunction canFade(from: WpLayer): boolean {\r\n if (from.url === null) return false\r\n if (rWop() <= 0.01) return false\r\n const mm = typeof window.matchMedia === 'function' ? window.matchMedia('(prefers-reduced-motion: reduce)') : null\r\n return mm === null || !mm.matches\r\n}\r\n\r\n/** End an in-flight fade: promote the incoming layer, free the one under it. */\r\nfunction finishFade(idx: 0 | 1): void {\r\n if (layers === null || pending !== idx) return\r\n if (fadeTimer !== null) { window.clearTimeout(fadeTimer); fadeTimer = null }\r\n pending = null\r\n front = idx\r\n const el = layers[idx].el\r\n // Re-asserted so a fade whose frames never ran (background tab) still ends on\r\n // the visible image.\r\n el.style.opacity = '1'\r\n el.style.willChange = ''\r\n // Covered from here on: drop its bytes so a second full-resolution image is\r\n // never left decoded behind the visible one.\r\n clearLayer(layers[idx === 0 ? 1 : 0])\r\n}\r\n\r\n/** Land an in-flight fade on its end state at once (another switch arrived). */\r\nfunction settleFade(): void {\r\n if (layers === null || pending === null) return\r\n const idx = pending\r\n if (fadeTimer !== null) { window.clearTimeout(fadeTimer); fadeTimer = null }\r\n pending = null\r\n front = idx\r\n const el = layers[idx].el\r\n el.style.transition = 'none'\r\n el.style.opacity = '1'\r\n el.style.willChange = ''\r\n clearLayer(layers[idx === 0 ? 1 : 0])\r\n}\r\n\r\n/** Abandon an in-flight fade: the layer it was leaving holds the wanted image. */\r\nfunction cancelFade(): void {\r\n if (layers === null || pending === null) return\r\n const idx = pending\r\n if (fadeTimer !== null) { window.clearTimeout(fadeTimer); fadeTimer = null }\r\n pending = null\r\n const el = layers[idx].el\r\n el.style.transition = 'none'\r\n el.style.opacity = '0'\r\n el.style.willChange = ''\r\n clearLayer(layers[idx])\r\n}\r\n\r\n/** Show `url` on the wallpaper layer, cross-fading from what it paints now. */\r\nfunction applyImageWp(url: string): void {\r\n ensureWpContainer()\r\n const ls = layers!\r\n if (pending !== null) {\r\n // A → B → A inside one fade: keep whichever layer already paints the wanted\r\n // image instead of queueing a third one.\r\n if (ls[pending].url === url) { paintLayer(ls[pending], url); applyWpEffects(); return }\r\n if (ls[front].url === url) { cancelFade(); paintLayer(ls[front], url); applyWpEffects(); return }\r\n settleFade()\r\n }\r\n if (ls[front].url === url) { paintLayer(ls[front], url); applyWpEffects(); return }\r\n const from = ls[front]\r\n const idx: 0 | 1 = front === 0 ? 1 : 0\r\n const target = ls[idx]\r\n const el = target.el\r\n // Rewind the incoming layer before its bytes land, so a stale image from an\r\n // earlier switch can never flash through while the new one rasterizes.\r\n el.style.transition = 'none'\r\n el.style.opacity = '0'\r\n el.style.zIndex = '1'\r\n from.el.style.zIndex = '0'\r\n paintLayer(target, url)\r\n applyWpEffects()\r\n if (!canFade(from)) {\r\n el.style.opacity = '1'\r\n front = idx\r\n clearLayer(from)\r\n return\r\n }\r\n // will-change promotes the layer in this frame, so the fade itself is a pure\r\n // compositor animation that survives the main-thread work a switch triggers\r\n // (theme re-registration, token rewrite, settings-panel re-render).\r\n el.style.willChange = 'opacity'\r\n pending = idx\r\n requestAnimationFrame(() => {\r\n if (pending !== idx || layers === null) return\r\n el.style.transition = `opacity ${FADE_MS}ms ease`\r\n el.style.opacity = '1'\r\n })\r\n fadeTimer = window.setTimeout(() => finishFade(idx), FADE_MS + 160)\r\n}\r\n\r\nfunction applyWpEffects(): void {\r\n if (wpEl === null || layers === null) return\r\n wpEl.style.opacity = String(rWop())\r\n // The blur sits on each LAYER rather than on the container: with the filter on\r\n // the parent, every frame of an opacity fade would re-run a full-screen blur\r\n // instead of just re-compositing the blurred surface.\r\n const blur = rBl()\r\n const filter = blur > 0 ? `blur(${blur}px)` : ''\r\n layers[0].el.style.filter = filter\r\n layers[1].el.style.filter = filter\r\n}\r\n\r\n/** Repaint the wallpaper layer, the token palette and every interface part from\r\n * the ACTIVE rule. This is the single entry point a rule switch goes through. */\r\nexport function applyWp(): void {\r\n const url = rWp()\r\n if (url) {\r\n applyImageWp(url)\r\n } else if (wpEl !== null) {\r\n // No background: tear down the layer but keep tokens/blur intact.\r\n dropWpContainer()\r\n }\r\n if (rHasColor()) {\r\n applyCustomTokens(rOps())\r\n applySettingsOverrides(rSop())\r\n applyTrajectoryOverrides(rTrajectoryOpacity())\r\n } else {\r\n // A rule without a saved color means \"use the system theme\" — drop the\r\n // plugin's overrides so the host palette shows through.\r\n clearCustomTokens()\r\n document.body.removeAttribute('data-ds-dark-theme')\r\n baseTokenKey = ''\r\n lastBgKey = ''\r\n }\r\n // Self-guarding: writes the panel's own surface only while a color rule is\r\n // active, and hands the panel back to the host token otherwise.\r\n applyRightbarOverrides(rRightbarOpacity())\r\n applyPartBlurs(rBlurs())\r\n}\r\n\r\nexport function teardownWp(): void {\r\n dropWpContainer()\r\n clearCustomTokens()\r\n tokenStyleEl?.remove(); tokenStyleEl = null\r\n removeViewCards()\r\n document.body.removeAttribute('data-ds-dark-theme')\r\n document.body.style.removeProperty('color-scheme')\r\n document.documentElement.style.removeProperty('--dsh-any-bg-settings-surface')\r\n document.documentElement.style.removeProperty('--dsh-any-bg-settings-layer-1')\r\n document.documentElement.style.removeProperty('--dsh-any-bg-settings-layer-2')\r\n document.documentElement.style.removeProperty('--dsh-any-bg-settings-layer-3')\r\n document.documentElement.style.removeProperty('--dsh-any-traj-layer-1')\r\n document.documentElement.style.removeProperty('--dsh-any-traj-layer-2')\r\n document.documentElement.style.removeProperty('--dsh-any-traj-layer-3')\r\n document.documentElement.style.removeProperty('--dsh-any-blur-settings')\r\n document.documentElement.style.removeProperty('--dsh-any-blur-card-panels')\r\n document.documentElement.style.removeProperty('--dsh-any-input-blur')\r\n document.documentElement.style.removeProperty('--dsh-any-bg-rightbar')\r\n document.documentElement.style.removeProperty('--dsh-any-blur-rightbar')\r\n for (const v of Object.values(OPACITY_VARS)) document.documentElement.style.removeProperty(v)\r\n baseTokenKey = ''\r\n lastBgKey = ''\r\n if (tokensRaf !== null) { cancelAnimationFrame(tokensRaf); tokensRaf = null }\r\n pendingOps = null\r\n tableFixStyleEl?.remove(); tableFixStyleEl = null\r\n setBlur(frameEl, 0); setBlur(sidebarEl, 0); setBlur(centerEl, 0); setBlur(detailsEl, 0)\r\n if (frameEl !== null) frameEl.style.removeProperty('background')\r\n if (centerEl !== null) centerEl.style.removeProperty('background')\r\n if (detailsEl !== null) detailsEl.style.removeProperty('background')\r\n stopWatchingParts()\r\n}\r\n\r\n/** Live wallpaper-opacity updates during slider drag (no full re-apply). */\r\nexport function setWpOpacity(v: number): void {\r\n if (wpEl) wpEl.style.opacity = String(v)\r\n}\r\n\r\n/** Live wallpaper-blur updates during slider drag (no full re-apply). */\r\nexport function setWpBlur(v: number): void {\r\n if (layers === null) return\r\n const filter = v > 0 ? `blur(${v}px)` : ''\r\n layers[0].el.style.filter = filter\r\n layers[1].el.style.filter = filter\r\n}\r\n","/**\n * Model → rule resolution.\n *\n * Two halves:\n * 1. `matchRule` — a pure function over the ordered rule list.\n * 2. `watchModel` — reports the current model whenever the session's durable\n * model selection changes.\n *\n * Sources, in the order they are consulted:\n *\n * a. **Which session is current** (`resolveMainSessionId` below) — the model is\n * read per session, so this hop answers before any other can. 0.1.7 moved it:\n * `sessions.list` stopped carrying a single `current` id, and the main view's\n * session is published by the `uiSession` service and marked by the list row\n * retained by `mainView`.\n * b. **The session's own durable model selection** —\n * `ctx.sessions.binding(id).session.projections.faceOf('modelSelection')`,\n * the same `{ lastUsed, next }` value the composer model seat and the\n * /model popup read. This is the authoritative per-session answer.\n * c. **`ctx.modelDirectories`** — the shared per-session directory\n * (ui-model-selection). It adds the provider-group catalog, so it is the\n * only source that can supply a display name, but it lives in that plugin's\n * own scope on some builds and is then invisible from here, hence optional.\n * d. **The host default model** — resolved by the CALLER as a last resort\n * (see index.tsx). It is a global default, NOT this session's selection, so\n * it is reported as `default` and the settings page says so.\n *\n * TIMING is load-bearing. `sessions` is published by the api-session-controller\n * client plugin, which this deployment loads AFTER this plugin's client bundle,\n * so `ctx.get('sessions')` is normally still undefined when `apply()` runs.\n * Giving up there — returning a no-op disposer — left the model pinned to the\n * host default for the whole session with nothing to retry it. The service is\n * now polled for until it appears, and `uiSession` (which can mount even later)\n * is picked up by the same poll because the session id is re-resolved on every\n * tick. Every hop reports a `note` when it cannot answer, so the settings page\n * can name the failing one instead of silently showing a value that is not this\n * session's model.\n */\nimport type {\n BgRule, Ctx, ModelDirectoryLike, ModelDirectoryResolverLike, ModelSelectionProjectionLike,\n ObservableFaceLike, SessionListSnapshotLike, SessionsServiceLike, UiSessionLike,\n} from './types'\n\n/** Rules that can actually paint: enabled and carrying an image slot. */\nfunction usable(rules: readonly BgRule[]): BgRule[] {\n return rules.filter(r => r.enabled && r.slot !== '')\n}\n\n/**\n * Resolve the rule for one model text.\n *\n * Top→bottom, first case-insensitive substring hit wins; an empty `match` never\n * hits on its own. When nothing hits, the FIRST usable rule is the fallback\n * (rule 1 deliberately doubles as both a matcher and the fallback).\n */\nexport function matchRule(\n rules: readonly BgRule[],\n modelText: string,\n): { rule: BgRule | null; matched: boolean } {\n const list = usable(rules)\n if (list.length === 0) return { rule: null, matched: false }\n const hay = modelText.toLowerCase()\n if (hay.trim() !== '') {\n for (const rule of list) {\n const needle = rule.match.trim().toLowerCase()\n if (needle === '') continue\n if (hay.includes(needle)) return { rule, matched: true }\n }\n }\n return { rule: list[0]!, matched: false }\n}\n\n/** Human-readable label of the model text an active rule matched against. */\nexport function modelLabelOf(text: string): string {\n const parts = text.split(/\\s+/).filter(p => p !== '')\n // The display name (last token, when the catalog provided one) reads best.\n return parts.length > 0 ? parts[parts.length - 1]! : ''\n}\n\n/** Look the current model's display name up in the shared catalog. */\nfunction displayNameOf(state: {\n groups?: ReadonlyArray<{ id?: string; models?: ReadonlyArray<{ id?: string; name?: string }> }>\n} | undefined, provider: string, model: string): string {\n if (model === '' || !Array.isArray(state?.groups)) return ''\n for (const group of state!.groups!) {\n if (group.id !== provider) continue\n for (const entry of group.models ?? []) {\n if (entry.id === model) return typeof entry.name === 'string' ? entry.name : ''\n }\n }\n return ''\n}\n\n/** Where the reported model text came from. */\nexport type ModelSource = 'session' | 'default'\n\n/**\n * Which hop could not answer when no per-session model was found. Surfaced in\n * the settings readout: without it, a broken hop is indistinguishable from\n * \"this session really is on the host default\".\n */\nexport type ModelNote = '' | 'no-service' | 'no-session' | 'no-projection' | 'empty-selection'\n\n/** How often to look for the sessions service that mounts after this plugin. */\nconst ATTACH_RETRY_MS = 400\n/** Stop looking after this many tries (~2 minutes). */\nconst ATTACH_RETRY_LIMIT = 300\n/** Safety re-read of every source, so a missed notification cannot pin a stale model. */\nconst POLL_MS = 1500\n\n/** One selection out of a `modelSelection` projection value. */\nfunction selectionOf(value: ModelSelectionProjectionLike | undefined): { provider: string; model: string } | null {\n const pick = value?.next ?? value?.lastUsed ?? null\n if (pick === null || typeof pick !== 'object') return null\n const provider = typeof pick.provider === 'string' ? pick.provider : ''\n const model = typeof pick.model === 'string' ? pick.model : ''\n if (provider === '' && model === '') return null\n return { provider, model }\n}\n\n/** A non-empty string id, or null. */\nfunction asId(value: unknown): string | null {\n return typeof value === 'string' && value !== '' ? value : null\n}\n\n/**\n * The id of the session the main view is showing.\n *\n * The model is read per session, so this hop has to answer before any of the\n * others can. 0.1.7 moved the answer: `sessions.list` stopped publishing a single\n * `current` id in favour of a row table (`ids` / `byId` / `phase`), and the main\n * view's session is now whatever holds a `mainView` retention — the same row the\n * host's own `uiSession.current` binding source is built from. Reading only\n * `list.current` therefore finds nothing on 0.1.7, and a plugin with no session\n * id can only ever fall back to rule 1: the background stops following the model.\n *\n * The hops are tried in order of authority and every one is optional, so this\n * answers on both host generations — and while `uiSession` is still mounting.\n */\nexport function resolveMainSessionId(\n uiCurrent: { key?: string } | undefined,\n snapshot: SessionListSnapshotLike | undefined,\n): string | null {\n // 0.1.7: the host's own answer, already resolved from list + retention.\n const fromUiSession = asId(uiCurrent?.key)\n if (fromUiSession !== null) return fromUiSession\n // ≤0.1.6: the list published the current id directly.\n const legacy = asId(snapshot?.current)\n if (legacy !== null) return legacy\n // 0.1.7 without `uiSession` yet: derive it from the retention the host uses.\n const byId = snapshot?.byId\n if (byId !== undefined && byId !== null) {\n for (const row of Object.values(byId)) {\n if ((row?.retainedBy?.mainView ?? 0) > 0) {\n const id = asId(row?.id)\n if (id !== null) return id\n }\n }\n }\n return null\n}\n\n/** Read `uiSession.current` (if that service is on this host) and resolve. */\nfunction mainSessionId(ctx: Ctx, list: ObservableFaceLike<SessionListSnapshotLike> | null): string | null {\n let uiCurrent: { key?: string } | undefined\n try {\n const ui = ctx.get('uiSession') as UiSessionLike | undefined\n uiCurrent = ui?.current?.getSnapshot?.()\n } catch {\n // Service absent (or not mounted yet) — the list retention below still answers.\n }\n return resolveMainSessionId(uiCurrent, list?.getSnapshot())\n}\n\n/**\n * Watch the current session's model selection.\n *\n * @param ctx - client root context.\n * @param onChange - called with the match text (provider + id + display name),\n * the best available label, which source answered, and — when nothing could be\n * read — the hop that failed.\n * @returns disposer.\n */\nexport function watchModel(\n ctx: Ctx,\n onChange: (text: string, label: string, source: ModelSource, note: ModelNote) => void,\n): () => void {\n let service: SessionsServiceLike | null = null\n let list: ObservableFaceLike<SessionListSnapshotLike> | null = null\n let offList: (() => void) | null = null\n let sessionId: string | null = null\n let directory: ModelDirectoryLike | null = null\n let offDirectory: (() => void) | null = null\n /** The session's own `modelSelection` projection face. */\n let projected: ObservableFaceLike<ModelSelectionProjectionLike> | null = null\n let offProjected: (() => void) | null = null\n let lastKey = '\\u0000'\n let poll: number | null = null\n let retry: number | null = null\n let retries = 0\n\n const release = (): void => {\n if (offDirectory !== null) { offDirectory(); offDirectory = null }\n if (offProjected !== null) { offProjected(); offProjected = null }\n directory = null\n projected = null\n }\n\n /** Bind the session's own durable model selection (the authoritative source). */\n const bindProjection = (id: string): void => {\n const svc = service\n if (svc === null) return\n try {\n let binding = typeof svc.binding === 'function' ? svc.binding(id) : undefined\n if (binding === undefined && typeof svc.scope === 'function') {\n // Materialize the scope, then resolve again: a session that is merely\n // listed has no binding yet.\n svc.scope(id)\n binding = typeof svc.binding === 'function' ? svc.binding(id) : undefined\n }\n const face = binding?.session?.projections?.faceOf?.('modelSelection')\n if (face === undefined || typeof face.subscribe !== 'function' || typeof face.getSnapshot !== 'function') return\n projected = face\n offProjected = face.subscribe(() => { emit(false) })\n } catch {\n projected = null\n offProjected = null\n }\n }\n\n const note = (): ModelNote => {\n if (service === null) return 'no-service'\n if (sessionId === null) return 'no-session'\n if (projected === null && directory === null) return 'no-projection'\n return 'empty-selection'\n }\n\n const emit = (force: boolean): void => {\n const state = directory?.store.getSnapshot()\n const fromDirectory = state?.current ?? null\n const sel = fromDirectory !== null\n ? { provider: fromDirectory.provider ?? '', model: fromDirectory.model ?? '' }\n : (() => {\n try { return selectionOf(projected?.getSnapshot()) } catch { return null }\n })()\n const provider = sel?.provider ?? ''\n const model = sel?.model ?? ''\n const name = displayNameOf(state, provider, model)\n const text = [provider, model, name].filter(p => p !== '').join(' ').trim()\n const noteValue: ModelNote = text === '' ? note() : ''\n const key = `${text}\\u0001${name}\\u0001${noteValue}`\n if (!force && key === lastKey) return\n lastKey = key\n onChange(text, name !== '' ? name : (model !== '' ? model : provider), 'session', noteValue)\n }\n\n const bind = (): void => {\n const id = mainSessionId(ctx, list)\n // Already bound to this session and holding at least one live source: only\n // refresh the value. A missing source keeps retrying on the poll below.\n if (id === sessionId && (directory !== null || projected !== null)) { emit(false); return }\n release()\n sessionId = id\n if (id !== null) {\n bindProjection(id)\n if (directory === null) {\n const directories = ctx.get('modelDirectories') as ModelDirectoryResolverLike | undefined\n if (directories !== undefined && typeof directories.directoryFor === 'function') {\n try {\n directory = directories.directoryFor(id)\n offDirectory = directory.store.subscribe(() => { emit(false) })\n // The advisory catalog (display names) loads lazily; a failure only\n // costs us the pretty name, never the match.\n const pending = directory.load?.()\n if (pending !== undefined && pending !== null && typeof (pending as Promise<unknown>).catch === 'function') {\n void (pending as Promise<unknown>).catch(() => undefined)\n }\n } catch {\n directory = null\n offDirectory = null\n }\n }\n }\n }\n // Forced: the sources may have appeared without the text changing (the host\n // default was showing and the session now agrees with it), and the settings\n // page must be able to correct its badge and its note.\n emit(true)\n }\n\n const stopRetry = (): void => {\n if (retry === null) return\n window.clearInterval(retry)\n retry = null\n }\n\n const tick = (): void => {\n if (list === null) return\n if (mainSessionId(ctx, list) !== sessionId || (directory === null && projected === null)) bind()\n else emit(false)\n }\n\n /**\n * Look the sessions service up. It arrives after this plugin's bundle on this\n * deployment, so the first attempt usually fails — which is exactly why this\n * is a retry loop rather than a one-shot lookup.\n */\n const attach = (): boolean => {\n const svc = ctx.get('sessions') as SessionsServiceLike | undefined\n if (svc === undefined || svc === null) return false\n const face = svc.list\n if (face === undefined || typeof face.subscribe !== 'function' || typeof face.getSnapshot !== 'function') return false\n service = svc\n list = face\n offList = face.subscribe(bind)\n if (poll === null) poll = window.setInterval(tick, POLL_MS)\n bind()\n return true\n }\n\n if (!attach()) {\n retry = window.setInterval(() => {\n retries++\n if (attach() || retries >= ATTACH_RETRY_LIMIT) stopRetry()\n }, ATTACH_RETRY_MS)\n }\n\n return () => {\n stopRetry()\n if (poll !== null) { window.clearInterval(poll); poll = null }\n if (offList !== null) { offList(); offList = null }\n service = null\n list = null\n release()\n }\n}\n","/**\r\n * dsh-background-by-model — settings UI design system.\r\n *\r\n * The section is styled entirely through these scoped classes instead of the\r\n * host's inline-style approach: animations (page transitions, staggered\r\n * reveals, the rotating orb ring) and pseudo-element effects cannot be\r\n * expressed as React inline styles. Every color reads the host's\r\n * --dsw-alias-* tokens so the panel follows the user's custom theme color and\r\n * light/dark scheme automatically; `color-mix` tints carry a plain-token\r\n * fallback first for older engines.\r\n */\r\nexport const NAV_ITEM_H = 38\r\nexport const NAV_GAP = 4\r\n\r\nexport const UI_CSS = `\r\n/* The section is rendered INLINE inside the host settings dialog's content\r\n * column: the host provides the modal chrome (backdrop, centering, closing).\r\n * These classes style only the embedded shell; transient fixed layers (toast,\r\n * color picker, background editor) escape through Portals on <html>. */\r\n.dab-root{position:relative;color:var(--dsw-alias-label-primary);animation:dab-fade-in .35s ease both;container-type:inline-size;display:flex;flex-direction:column;align-items:center;width:100%;min-width:0;--dab-mono:ui-monospace,\"Cascadia Mono\",\"SF Mono\",Consolas,\"Courier New\",monospace}\r\n.dab-root *,.dab-root *::before,.dab-root *::after{box-sizing:border-box}\r\n.dab-root button{font-family:inherit}\r\n\r\n/* ── shell: nav rail + page body ─────────────────────────────────────────── */\r\n.dab-shell{display:grid;grid-template-columns:158px minmax(0,1fr);gap:26px;align-items:start;padding-bottom:8px;width:100%;max-width:980px;margin:0 auto}\r\n.dab-nav{position:sticky;top:0;display:flex;flex-direction:column;gap:18px}\r\n.dab-brand{display:flex;align-items:center;gap:10px;padding:2px 6px}\r\n.dab-brand-tile{width:30px;height:30px;flex:none;border-radius:9px;display:grid;place-items:center;color:var(--dsw-alias-brand-text);background:var(--dsw-alias-brand-primary);box-shadow:0 4px 14px -4px var(--dsw-alias-brand-primary)}\r\n.dab-brand-name{font-size:13px;font-weight:650;letter-spacing:.01em;line-height:1.25}\r\n.dab-brand-tag{font-size:9px;letter-spacing:.16em;font-weight:600;color:var(--dsw-alias-label-quaternary,var(--dsw-alias-label-tertiary));text-transform:uppercase}\r\n.dab-nav-list{position:relative;display:flex;flex-direction:column;gap:${NAV_GAP}px}\r\n.dab-nav-ind{position:absolute;left:0;right:0;top:0;height:${NAV_ITEM_H}px;border-radius:11px;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);background:color-mix(in srgb,var(--dsw-alias-brand-primary) 13%,transparent);border-color:color-mix(in srgb,var(--dsw-alias-brand-primary) 25%,transparent);transition:transform .38s cubic-bezier(.22,1,.36,1)}\r\n.dab-nav-item{position:relative;z-index:1;display:flex;align-items:center;gap:10px;height:${NAV_ITEM_H}px;padding:0 12px;border:0;background:none;border-radius:11px;color:var(--dsw-alias-label-tertiary);font-size:13px;cursor:pointer;text-align:left;transition:color .22s ease}\r\n.dab-nav-item:hover{color:var(--dsw-alias-label-primary)}\r\n.dab-nav-item.is-active{color:var(--dsw-alias-brand-primary);font-weight:600}\r\n.dab-nav-item svg{flex:none;transition:transform .3s cubic-bezier(.34,1.56,.64,1)}\r\n.dab-nav-item:hover svg{transform:scale(1.14) rotate(-5deg)}\r\n\r\n/* ── page chrome ─────────────────────────────────────────────────────────── */\r\n.dab-page{animation:dab-page-in .4s cubic-bezier(.22,1,.36,1) both;min-width:0;display:flex;flex-direction:column;gap:13px}\r\n.dab-head{margin:2px 0 5px}\r\n.dab-overline{font-size:10.5px;font-weight:700;letter-spacing:.18em;text-transform:uppercase;color:var(--dsw-alias-brand-primary);opacity:.9}\r\n.dab-h1{margin:4px 0 0;font-size:21px;font-weight:700;letter-spacing:-.01em}\r\n.dab-desc{margin:6px 0 0;font-size:12.5px;line-height:1.55;color:var(--dsw-alias-label-tertiary);max-width:56ch}\r\n.dab-card{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);border-radius:16px;padding:18px}\r\n.dab-card-hover{transition:transform .28s ease,box-shadow .28s ease,border-color .28s ease}\r\n.dab-card-hover:hover{transform:translateY(-2px);box-shadow:0 10px 28px -12px rgba(0,0,0,.28)}\r\n.dab-rise{animation:dab-rise-in .55s cubic-bezier(.22,1,.36,1) both;animation-delay:calc(var(--d,0) * 62ms)}\r\n\r\n/* ── accent hero (color orb) ─────────────────────────────────────────────── */\r\n.dab-hero-accent{display:flex;align-items:center;gap:24px;flex-wrap:wrap}\r\n.dab-orb-wrap{position:relative;width:118px;height:118px;flex:none}\r\n.dab-orb{position:absolute;inset:11px;border-radius:50%;background:radial-gradient(circle at 32% 28%,rgba(255,255,255,.5),rgba(255,255,255,0) 44%),var(--c,#888);box-shadow:0 16px 36px -10px var(--c-soft,transparent),inset 0 -10px 20px rgba(0,0,0,.16);animation:dab-orb-in .7s cubic-bezier(.22,1,.36,1) both}\r\n.dab-orb-ring{position:absolute;inset:0;border-radius:50%;background:conic-gradient(from 0deg,transparent 0 30%,var(--c,#888) 46%,transparent 62%,transparent 76%,var(--c,#888) 90%,transparent 100%);-webkit-mask:radial-gradient(farthest-side,transparent calc(100% - 3.5px),#000 calc(100% - 2.5px));mask:radial-gradient(farthest-side,transparent calc(100% - 3.5px),#000 calc(100% - 2.5px));animation:dab-spin 7s linear infinite;opacity:.9}\r\n.dab-hex-caption{font-size:11px;color:var(--dsw-alias-label-tertiary);letter-spacing:.04em}\r\n.dab-hex{font-family:var(--dab-mono);font-size:24px;font-weight:600;letter-spacing:.02em;line-height:1.2;margin-top:2px}\r\n.dab-hsl-row{display:flex;gap:16px;margin-top:7px;font-family:var(--dab-mono);font-size:11px;color:var(--dsw-alias-label-tertiary)}\r\n.dab-hsl-row b{font-weight:600;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\r\n\r\n/* ── swatches ────────────────────────────────────────────────────────────── */\r\n.dab-swatch-title{font-size:12px;font-weight:600;margin-bottom:10px;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\r\n.dab-swatches{display:flex;flex-wrap:wrap;gap:9px}\r\n.dab-swatch{width:25px;height:25px;border-radius:50%;border:0;padding:0;cursor:pointer;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);transition:transform .22s cubic-bezier(.34,1.56,.64,1),box-shadow .22s ease}\r\n.dab-swatch:hover{transform:scale(1.2)}\r\n.dab-swatch.is-on{box-shadow:0 0 0 2px var(--dsw-alias-bg-layer-1),0 0 0 4px var(--dsw-alias-brand-primary)}\r\n\r\n/* ── wheel card ──────────────────────────────────────────────────────────── */\r\n.dab-wheel-card{position:relative;display:flex;align-items:center;justify-content:center;gap:28px;flex-wrap:wrap;padding:24px 18px}\r\n.dab-wheel-glow{position:absolute;width:230px;height:230px;border-radius:50%;filter:blur(48px);opacity:.2;background:var(--c,#888);pointer-events:none;transition:background .4s ease}\r\n.dab-wheel{position:relative;cursor:crosshair;border-radius:50%;box-shadow:0 12px 32px -14px rgba(0,0,0,.4)}\r\n.dab-hint{font-size:11.5px;line-height:1.55;color:var(--dsw-alias-label-tertiary);padding:0 4px}\r\n\r\n/* ── precise color inputs ────────────────────────────────────────────────── */\r\n.dab-inputs{display:flex;flex-direction:column;gap:10px;min-width:172px}\r\n.dab-field{display:flex;align-items:center;gap:8px}\r\n.dab-field-label{width:14px;text-align:center;font-family:var(--dab-mono);font-size:11px;font-weight:600;color:var(--dsw-alias-label-tertiary)}\r\n.dab-num{flex:1;min-width:0;height:30px;padding:0 10px;border-radius:9px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font-family:var(--dab-mono);font-size:12px;outline:none;transition:border-color .2s,box-shadow .2s}\r\n.dab-num:focus{border-color:var(--dsw-alias-brand-primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--dsw-alias-brand-primary) 18%,transparent)}\r\n.dab-num::-webkit-outer-spin-button,.dab-num::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}\r\n.dab-num{-moz-appearance:textfield;appearance:textfield}\r\n.dab-urlinput{flex:1;min-width:180px;height:34px;padding:0 12px;border-radius:10px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font-size:12.5px;outline:none;transition:border-color .2s}\r\n.dab-urlinput::placeholder{color:var(--dsw-alias-label-quaternary)}\r\n.dab-urlinput:focus{border-color:var(--dsw-alias-brand-primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--dsw-alias-brand-primary) 18%,transparent)}\r\n.dab-swatch-lg{height:38px;border-radius:10px;border:1px solid var(--dsw-alias-border-l2);box-shadow:inset 0 0 14px rgba(0,0,0,.1);transition:transform .3s ease}\r\n.dab-swatch-lg:hover{transform:scale(1.02)}\r\n\r\n/* ── buttons & chips ─────────────────────────────────────────────────────── */\r\n.dab-btn{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:34px;padding:0 14px;border-radius:10px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-elevated-fill);color:var(--dsw-alias-label-primary);font-size:12.5px;font-weight:550;cursor:pointer;transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease,opacity .18s ease,background .18s ease}\r\n.dab-btn:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 5px 14px -6px rgba(0,0,0,.32)}\r\n.dab-btn:active:not(:disabled){transform:translateY(0) scale(.97);box-shadow:none}\r\n.dab-btn:disabled{opacity:.5;cursor:not-allowed}\r\n.dab-btn-primary{background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-text);border-color:transparent}\r\n.dab-btn-danger{color:var(--dsw-alias-state-error-primary)}\r\n.dab-btn-ghost{background:transparent;border-color:transparent;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\r\n.dab-btn-ghost:hover:not(:disabled){background:var(--dsw-alias-bg-layer-2);box-shadow:none}\r\n.dab-btn:focus-visible,.dab-nav-item:focus-visible,.dab-seg-item:focus-visible,.dab-swatch:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}\r\n.dab-chip-row{display:flex;flex-wrap:wrap;gap:8px}\r\n.dab-chip{height:30px;padding:0 14px;border-radius:99px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary));font-size:12px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;transition:all .22s ease}\r\n.dab-chip:hover{border-color:var(--dsw-alias-brand-primary);color:var(--dsw-alias-label-primary)}\r\n.dab-chip.is-active{background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-text);border-color:transparent}\r\n\r\n/* ── sliders ─────────────────────────────────────────────────────────────── */\r\n.dab-slider-block{display:flex;flex-direction:column;gap:6px}\r\n.dab-slider-block + .dab-slider-block{margin-top:13px}\r\n.dab-slider-label{font-size:12px;font-weight:550;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\r\n.dab-slider-val{font-family:var(--dab-mono);font-size:11px;color:var(--dsw-alias-label-tertiary);min-width:44px;text-align:right}\r\n.dab-slider{-webkit-appearance:none;appearance:none;flex:1;min-width:0;height:4px;border-radius:99px;outline:none;cursor:pointer;margin:5px 0;background:linear-gradient(to right,var(--dsw-alias-brand-primary) calc(var(--pct,50) * 1%),var(--dsw-alias-border-l2) calc(var(--pct,50) * 1%));transition:height .15s ease}\r\n.dab-slider:hover{height:5px}\r\n.dab-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:15px;height:15px;border-radius:50%;background:var(--dsw-alias-button-elevated-fill,#fff);border:2px solid var(--dsw-alias-brand-primary);box-shadow:0 1px 5px rgba(0,0,0,.28);transition:transform .16s cubic-bezier(.34,1.56,.64,1)}\r\n.dab-slider:hover::-webkit-slider-thumb,.dab-slider:focus-visible::-webkit-slider-thumb{transform:scale(1.22)}\r\n.dab-slider:active::-webkit-slider-thumb{transform:scale(1.34)}\r\n.dab-slider::-moz-range-thumb{width:13px;height:13px;border-radius:50%;background:var(--dsw-alias-button-elevated-fill,#fff);border:2px solid var(--dsw-alias-brand-primary)}\r\n\r\n/* ── interface part cards ────────────────────────────────────────────────── */\r\n.dab-grid-parts{display:grid;grid-template-columns:repeat(auto-fill,minmax(256px,1fr));gap:13px}\r\n.dab-part-head{display:flex;align-items:center;gap:11px;margin-bottom:14px}\r\n.dab-part-ico{width:32px;height:32px;flex:none;border-radius:10px;display:grid;place-items:center;color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-bg-layer-2);background:color-mix(in srgb,var(--dsw-alias-brand-primary) 12%,transparent)}\r\n.dab-part-name{font-size:13.5px;font-weight:600}\r\n.dab-part-badge{margin-left:auto;font-family:var(--dab-mono);font-size:11px;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2);border-radius:99px;padding:3px 9px}\r\n\r\n/* ── segmented control ───────────────────────────────────────────────────── */\r\n.dab-seg{position:relative;display:inline-flex;padding:3px;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:11px}\r\n.dab-seg-thumb{position:absolute;top:3px;bottom:3px;left:3px;width:var(--w,96px);border-radius:8px;background:var(--dsw-alias-button-elevated-fill);box-shadow:0 2px 8px -2px rgba(0,0,0,.28);transition:transform .32s cubic-bezier(.22,1,.36,1)}\r\n.dab-seg-item{position:relative;z-index:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;width:var(--w,96px);height:30px;border:0;background:none;border-radius:8px;color:var(--dsw-alias-label-tertiary);font-size:12.5px;cursor:pointer;transition:color .25s ease}\r\n.dab-seg-item.is-active{color:var(--dsw-alias-label-primary);font-weight:600}\r\n\r\n/* ── toggle switch ───────────────────────────────────────────────────────── */\r\n.dab-toggle{position:relative;width:42px;height:24px;flex:none;border-radius:99px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);cursor:pointer;padding:0;transition:background .28s ease,border-color .28s ease}\r\n.dab-toggle-knob{position:absolute;top:2.5px;left:2.5px;width:17px;height:17px;border-radius:50%;background:var(--dsw-alias-label-secondary,#999);box-shadow:0 1px 3px rgba(0,0,0,.3);transition:transform .28s cubic-bezier(.22,1,.36,1),background .28s ease}\r\n.dab-toggle.is-on{background:var(--dsw-alias-brand-primary);border-color:var(--dsw-alias-brand-primary)}\r\n.dab-toggle.is-on .dab-toggle-knob{transform:translateX(18px);background:#fff}\r\n\r\n/* ── background preview hero ─────────────────────────────────────────────── */\r\n.dab-hero{position:relative;border-radius:16px;overflow:hidden;aspect-ratio:16/9;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2)}\r\n.dab-hero-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;transition:transform .5s cubic-bezier(.22,1,.36,1)}\r\n.dab-hero:hover .dab-hero-img{transform:scale(1.03)}\r\n.dab-hero-empty{position:absolute;inset:6px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;color:var(--dsw-alias-label-tertiary);font-size:12.5px;border:1.5px dashed var(--dsw-alias-border-l2);border-radius:12px;cursor:pointer;background:transparent;transition:border-color .25s,color .25s,background .25s;width:auto;height:auto}\r\n.dab-hero-empty:hover{border-color:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-primary)}\r\n.dab-hero-empty.is-over{border-color:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-primary);background:color-mix(in srgb,var(--dsw-alias-brand-primary) 8%,transparent)}\r\n.dab-hero-badge{position:absolute;top:10px;left:10px;display:inline-flex;align-items:center;gap:5px;height:24px;padding:0 11px;border-radius:99px;background:rgba(0,0,0,.45);color:#fff;font-size:11px;backdrop-filter:blur(6px);pointer-events:none}\r\n.dab-hero-veil{position:absolute;left:0;right:0;bottom:0;padding:34px 12px 12px;display:flex;align-items:flex-end;justify-content:flex-end;gap:8px;background:linear-gradient(to top,rgba(0,0,0,.55),rgba(0,0,0,0));opacity:0;transform:translateY(6px);transition:opacity .3s ease,transform .3s ease}\r\n.dab-hero:hover .dab-hero-veil{opacity:1;transform:none}\r\n.dab-hero-veil .dab-btn{background:rgba(255,255,255,.94);color:#14161a;border-color:transparent;height:30px;font-size:12px}\r\n.dab-hero-veil .dab-btn-danger{color:#dc2626}\r\n\r\n/* ── profile page ────────────────────────────────────────────────────────── */\r\n.dab-profile-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(238px,1fr));gap:13px}\r\n.dab-profile-ico{width:38px;height:38px;border-radius:11px;display:grid;place-items:center;margin-bottom:13px;color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-bg-layer-2);background:color-mix(in srgb,var(--dsw-alias-brand-primary) 12%,transparent)}\r\n.dab-profile-title{font-size:14px;font-weight:650}\r\n.dab-profile-desc{font-size:12px;color:var(--dsw-alias-label-tertiary);line-height:1.55;margin:5px 0 15px}\r\n.dab-footer{margin-top:6px;padding:14px 4px 0;border-top:1px solid var(--dsw-alias-border-l2);display:flex;align-items:center;justify-content:space-between;font-size:11px;color:var(--dsw-alias-label-tertiary)}\r\n.dab-footer-mono{font-family:var(--dab-mono);letter-spacing:.02em}\r\n\r\n/* ── toast ───────────────────────────────────────────────────────────────── */\r\n.dab-toast{position:fixed;left:50%;bottom:30px;transform:translateX(-50%);display:flex;align-items:center;gap:8px;height:38px;padding:0 16px;border-radius:99px;background:var(--dsw-alias-bg-layer-3,var(--dsw-alias-bg-layer-2));border:1px solid var(--dsw-alias-border-l2);box-shadow:0 10px 30px -8px rgba(0,0,0,.38);font-size:12.5px;z-index:10001;animation:dab-toast-in .32s cubic-bezier(.22,1,.36,1) both}\r\n.dab-toast-ok{color:var(--dsw-alias-brand-primary);display:grid;place-items:center}\r\n.dab-toast-err{color:var(--dsw-alias-state-error-primary);display:grid;place-items:center}\r\n\r\n/* ── modals (editor / eyedropper / crash) ────────────────────────────────── */\r\n/* Pin to the viewport explicitly with vw/vh so ancestor padding/margins on\r\n * body cannot shift or clip the overlay; keep it above host sidebar chrome.\r\n * pointer-events:auto re-enables interaction: these overlays render inside a\r\n * Portal root that is pointer-events:none so it never blocks the page alone. */\r\n.dab-overlay{position:fixed;left:0;top:0;width:100vw;height:100vh;z-index:999999;background:rgba(8,10,14,.62);backdrop-filter:blur(8px);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;animation:dab-fade-in .25s ease both;pointer-events:auto}\r\n.dab-overlay-title{color:#fff;font-size:15px;font-weight:600}\r\n.dab-overlay-hint{color:rgba(255,255,255,.62);font-size:12px}\r\n.dab-modal-card{animation:dab-zoom-in .3s cubic-bezier(.22,1,.36,1) both;max-width:calc(100vw - 40px);max-height:calc(100vh - 120px);overflow:auto}\r\n.dab-overlay .dab-btn{background:rgba(255,255,255,.94);color:#14161a;border-color:transparent}\r\n.dab-overlay .dab-btn-primary{background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-text)}\r\n.dab-crash{display:flex;flex-direction:column;gap:10px;align-items:center;padding:28px 18px;border:1px solid var(--dsw-alias-border-l2);border-radius:16px}\r\n.dab-crash-title{font-size:15px;font-weight:650}\r\n.dab-crash-desc{font-size:12px;color:var(--dsw-alias-label-tertiary);text-align:center;line-height:1.5}\r\n\r\n/* ── model rules ─────────────────────────────────────────────────────────── */\r\n.dab-rules{display:flex;flex-direction:column;gap:12px}\r\n.dab-rule{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);border-radius:16px;padding:14px;transition:border-color .25s,box-shadow .25s,opacity .25s}\r\n.dab-rule.is-active{border-color:var(--dsw-alias-brand-primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--dsw-alias-brand-primary) 16%,transparent)}\r\n.dab-rule.is-off{opacity:.55}\r\n.dab-rule-head{display:flex;align-items:center;gap:9px;flex-wrap:wrap}\r\n.dab-rule-num{font-family:var(--dab-mono);font-size:11px;font-weight:700;color:var(--dsw-alias-label-tertiary);min-width:16px}\r\n.dab-rule-badge{font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dsw-alias-brand-primary);background:color-mix(in srgb,var(--dsw-alias-brand-primary) 14%,transparent);border-radius:99px;padding:2px 8px}\r\n.dab-rule-match{flex:1;min-width:150px;height:32px;padding:0 11px;border-radius:9px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font-family:var(--dab-mono);font-size:12.5px;outline:none;transition:border-color .2s,box-shadow .2s}\r\n.dab-rule-match::placeholder{color:var(--dsw-alias-label-quaternary)}\r\n.dab-rule-match:focus{border-color:var(--dsw-alias-brand-primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--dsw-alias-brand-primary) 18%,transparent)}\r\n.dab-icon-btn{width:28px;height:28px;flex:none;display:grid;place-items:center;border-radius:8px;border:1px solid var(--dsw-alias-border-l2);background:transparent;color:var(--dsw-alias-label-tertiary);cursor:pointer;transition:color .2s,border-color .2s,background .2s}\r\n.dab-icon-btn:hover:not(:disabled){color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-brand-primary)}\r\n.dab-icon-btn:disabled{opacity:.35;cursor:not-allowed}\r\n.dab-icon-btn-danger:hover:not(:disabled){color:var(--dsw-alias-state-error-primary);border-color:var(--dsw-alias-state-error-primary)}\r\n.dab-rule-body{margin-top:13px;display:flex;flex-direction:column;gap:13px}\r\n.dab-rule-thumb{position:relative;border-radius:12px;overflow:hidden;aspect-ratio:16/9;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);cursor:pointer}\r\n.dab-rule-thumb img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}\r\n.dab-rule-thumb-empty{position:absolute;inset:5px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;border:1.5px dashed var(--dsw-alias-border-l2);border-radius:9px;color:var(--dsw-alias-label-tertiary);font-size:12px;text-align:center;padding:0 10px}\r\n.dab-rule-thumb.is-over .dab-rule-thumb-empty{border-color:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-primary)}\r\n.dab-rule-cols{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);gap:18px;align-items:start}\r\n.dab-rule-section-title{font-size:12px;font-weight:600;margin-bottom:9px;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\r\n@container (max-width:760px){.dab-rule-cols{grid-template-columns:1fr}}\r\n\r\n/* ── keyframes ───────────────────────────────────────────────────────────── */\r\n@keyframes dab-fade-in{from{opacity:0}to{opacity:1}}\r\n@keyframes dab-page-in{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}\r\n@keyframes dab-rise-in{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}\r\n@keyframes dab-orb-in{from{opacity:0;transform:scale(.82)}to{opacity:1;transform:none}}\r\n@keyframes dab-spin{to{transform:rotate(360deg)}}\r\n@keyframes dab-rotate{to{transform:rotate(360deg)}}\r\n@keyframes dab-toast-in{from{opacity:0;transform:translate(-50%,10px)}to{opacity:1;transform:translate(-50%,0)}}\r\n@keyframes dab-zoom-in{from{opacity:0;transform:scale(.94) translateY(8px)}to{opacity:1;transform:none}}\r\n@keyframes dab-flow{to{background-position:300% 50%}}\r\n\r\n/* ── responsive & motion preferences ─────────────────────────────────────── */\r\n@container (max-width:620px){\r\n .dab-shell{grid-template-columns:1fr;gap:14px}\r\n .dab-nav{position:static;flex-direction:row;align-items:center;justify-content:space-between;gap:10px}\r\n .dab-nav-list{flex-direction:row;overflow-x:auto;scrollbar-width:none}\r\n .dab-nav-list::-webkit-scrollbar{display:none}\r\n .dab-nav-ind{display:none}\r\n .dab-nav-item{flex:none;padding:0 10px}\r\n .dab-nav-item.is-active{background:var(--dsw-alias-bg-layer-2)}\r\n .dab-types{grid-template-columns:1fr}\r\n}\r\n@container (min-width:621px){\r\n .dab-shell{grid-template-columns:158px minmax(0,1fr);gap:26px}\r\n}\r\n@media (prefers-reduced-motion:reduce){\r\n .dab-root *,.dab-root *::before,.dab-root *::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}\r\n}\r\n`\r\n\r\nconst CSS_ID = 'dab-ui-css'\r\n\r\n/** Inject the design-system stylesheet once per document (HMR-safe). */\r\nexport function ensureUiCss(): void {\r\n if (typeof document === 'undefined') return\r\n let el = document.getElementById(CSS_ID) as HTMLStyleElement | null\r\n if (!el) {\r\n el = document.createElement('style')\r\n el.id = CSS_ID\r\n document.head.appendChild(el)\r\n }\r\n if (el.textContent !== UI_CSS) el.textContent = UI_CSS\r\n}\r\n","import type { ReactNode } from 'react'\r\n\r\n/** Sun glyph, migrated from @deepseek-ai/dsh-client-ui-primitives IconLightOutline16. */\r\nexport const SUN_PATHS = '<path d=\"M11.3496 8C11.3496 6.14985 9.85015 4.65039 8 4.65039C6.14985 4.65039 4.65039 6.14985 4.65039 8C4.65039 9.85015 6.14985 11.3496 8 11.3496C9.85015 11.3496 11.3496 9.85015 11.3496 8ZM12.6504 8C12.6504 10.5681 10.5681 12.6504 8 12.6504C5.43188 12.6504 3.34961 10.5681 3.34961 8C3.34961 5.43188 5.43188 3.34961 8 3.34961C10.5681 3.34961 12.6504 5.43188 12.6504 8Z\" fill=\"currentColor\"/><path d=\"M8.65039 0.5V2.5H7.34961V0.5H8.65039Z\" fill=\"currentColor\"/><path d=\"M8.65039 13.5V15.5H7.34961V13.5H8.65039Z\" fill=\"currentColor\"/><path d=\"M3.15808 2.24035L4.57229 3.65456L3.6525 4.57435L2.23829 3.16014L3.15808 2.24035Z\" fill=\"currentColor\"/><path d=\"M12.3505 11.4327L13.7647 12.8469L12.8449 13.7667L11.4307 12.3525L12.3505 11.4327Z\" fill=\"currentColor\"/><path d=\"M2.24537 12.8469L3.65958 11.4327L4.57937 12.3525L3.16516 13.7667L2.24537 12.8469Z\" fill=\"currentColor\"/><path d=\"M11.4377 3.65455L12.852 2.24033L13.7718 3.16012L12.3575 4.57434L11.4377 3.65455Z\" fill=\"currentColor\"/><path d=\"M0.5 7.35461H2.5V8.6554H0.5L0.5 7.35461Z\" fill=\"currentColor\"/><path d=\"M13.5 7.35461H15.5V8.6554H13.5V8.6554Z\" fill=\"currentColor\"/>'\r\n\r\nexport function SunIcon({ size = 16, className }: { size?: number; className?: string }) {\r\n return (\r\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" dangerouslySetInnerHTML={{ __html: SUN_PATHS }} />\r\n )\r\n}\r\n\r\nfunction Glyph({ children, size = 16, className }: { children: ReactNode; size?: number; className?: string }) {\r\n return (\r\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\r\n {children}\r\n </svg>\r\n )\r\n}\r\n\r\nexport const DropletIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M8 1.9c2.4 2.8 4.3 5 4.3 7.1a4.3 4.3 0 1 1-8.6 0C3.7 6.9 5.6 4.7 8 1.9z\" /></Glyph>\r\n)\r\n\r\nexport const LayersIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M8 2.2 13.2 5 8 7.8 2.8 5 8 2.2z\" /><path d=\"M2.8 8.2 8 11l5.2-2.8\" /><path d=\"M2.8 11.2 8 14l5.2-2.8\" /></Glyph>\r\n)\r\n\r\nexport const PhotoIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"2\" y=\"3.2\" width=\"12\" height=\"9.6\" rx=\"2\" /><circle cx=\"5.7\" cy=\"6.3\" r=\"0.9\" /><path d=\"M14 10.4l-2.8-2.8-4.8 4.8\" /></Glyph>\r\n)\r\n\r\nexport const VideoIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"1.5\" y=\"4.2\" width=\"8.8\" height=\"7.6\" rx=\"2\" /><path d=\"M10.3 6.9l4.2-2.4v7l-4.2-2.4\" /></Glyph>\r\n)\r\n\r\nexport const TextIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M3 4.2h10M3 8h10M3 11.8h6.5\" /></Glyph>\r\n)\r\n\r\nexport const TrajectoryIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M2.5 3.2h11M2.5 6.6h11M2.5 10h11\" /><circle cx=\"4.4\" cy=\"3.2\" r=\"1.1\" /><circle cx=\"8\" cy=\"6.6\" r=\"1.1\" /><circle cx=\"11.4\" cy=\"10\" r=\"1.1\" /></Glyph>\r\n)\r\n\r\nexport const SlidersIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M2.5 4.5h4.9M11.6 4.5h1.9M2.5 11.5h1.9M8.6 11.5h4.9\" /><circle cx=\"9.5\" cy=\"4.5\" r=\"1.7\" /><circle cx=\"5.5\" cy=\"11.5\" r=\"1.7\" /></Glyph>\r\n)\r\n\r\nexport const SparkleIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M7.2 1.8l1.2 3.1 3.1 1.2-3.1 1.2-1.2 3.1-1.2-3.1L2.9 6.1 6 4.9l1.2-3.1z\" /><path d=\"M12 10.5l.5 1.2 1.2.5-1.2.5-.5 1.2-.5-1.2-1.2-.5 1.2-.5.5-1.2z\" /></Glyph>\r\n)\r\n\r\nexport const RefreshIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M13.2 8A5.2 5.2 0 1 1 11.5 4.2\" /><path d=\"M13.4 1.8v2.9h-2.9\" /></Glyph>\r\n)\r\n\r\nexport const DownloadIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M8 2.2v8\" /><path d=\"M4.6 7l3.4 3.4L11.4 7\" /><path d=\"M2.8 13.8h10.4\" /></Glyph>\r\n)\r\n\r\nexport const UploadIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M8 10.4V2.6\" /><path d=\"M4.6 5.8L8 2.4l3.4 3.4\" /><path d=\"M2.8 13.8h10.4\" /></Glyph>\r\n)\r\n\r\nexport const LinkIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M6.6 9.4 9.4 6.6\" /><path d=\"M5.9 11.1l-1.4 1.4a2.6 2.6 0 0 1-3.7-3.7L3.5 6.8\" /><path d=\"M10.1 4.9l1.4-1.4a2.6 2.6 0 0 1 3.7 3.7l-2.1 2.1\" /></Glyph>\r\n)\r\n\r\nexport const LockIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"3.6\" y=\"7.2\" width=\"8.8\" height=\"6\" rx=\"1.4\" /><path d=\"M5.6 7.2V5.4a2.4 2.4 0 0 1 4.8 0v1.8\" /></Glyph>\r\n)\r\n\r\nexport const TrashIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M2.8 4.4h10.4\" /><path d=\"M6.4 4.4V2.9h3.2v1.5\" /><path d=\"M4.4 4.4l.5 8.6h6.2l.5-8.6\" /></Glyph>\r\n)\r\n\r\nexport const EditIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M9.5 4l2.5 2.5\" /><path d=\"M3 13l.8-3L10 3.8 12.2 6 6 12.2 3 13z\" /></Glyph>\r\n)\r\n\r\nexport const PipetteIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><circle cx=\"8\" cy=\"8\" r=\"4.2\" /><path d=\"M8 1.6v2.6M8 11.8v2.6M1.6 8h2.6M11.8 8h2.6\" /></Glyph>\r\n)\r\n\r\nexport const CheckIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M3.2 8.6l3 3L12.8 5\" /></Glyph>\r\n)\r\n\r\nexport const AlertIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M8 2.6l5.4 9.8H2.6L8 2.6z\" /><path d=\"M8 6.8v2.4M8 11.4v.01\" /></Glyph>\r\n)\r\n\r\nexport const CanvasIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"2.2\" y=\"2.2\" width=\"11.6\" height=\"11.6\" rx=\"2\" /></Glyph>\r\n)\r\n\r\nexport const SidebarIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"2.2\" y=\"2.2\" width=\"11.6\" height=\"11.6\" rx=\"2\" /><path d=\"M6.6 2.2v11.6\" /></Glyph>\r\n)\r\n\r\n/** Mirror of SidebarIcon: the file-preview panel docked to the right edge. */\r\nexport const PreviewIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"2.2\" y=\"2.2\" width=\"11.6\" height=\"11.6\" rx=\"2\" /><path d=\"M9.4 2.2v11.6\" /><path d=\"M11 5.6h1.2M11 8h1.2\" /></Glyph>\r\n)\r\n\r\nexport const ChatIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M13.4 4.4v4.4a2 2 0 0 1-2 2H6.2l-3.6 3V4.4a2 2 0 0 1 2-2h6.8a2 2 0 0 1 2 2z\" /></Glyph>\r\n)\r\n\r\nexport const GearIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><circle cx=\"8\" cy=\"8\" r=\"2.1\" /><path d=\"M8 1.7v1.8M8 12.5v1.8M1.7 8h1.8M12.5 8h1.8M3.6 3.6l1.3 1.3M11.1 11.1l1.3 1.3M12.4 3.6l-1.3 1.3M4.9 11.1l-1.3 1.3\" /></Glyph>\r\n)\r\n\r\nexport const InputIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"2.2\" y=\"4\" width=\"11.6\" height=\"8\" rx=\"2\" /><path d=\"M8 6.6v2M7 8h2\" /></Glyph>\r\n)\r\n\r\n","import { Component, type ReactNode } from 'react'\r\n\r\ninterface Props {\r\n t: (key: string) => string\r\n onReset?: () => void\r\n children: ReactNode\r\n}\r\n\r\ninterface State {\r\n error: Error | null\r\n}\r\n\r\n/**\r\n * Catches render errors from the theme section subtree (wheel, sliders, editor)\r\n * so a single bad state can never take down the whole settings panel. Shows a\r\n * compact fallback with a reset button; the reset re-renders the section with\r\n * the current saved config, which is enough to recover from most transient\r\n * failures (corrupt transient UI state, stale image decode, etc.).\r\n */\r\nexport class ErrorBoundary extends Component<Props, State> {\r\n override state: State = { error: null }\r\n\r\n static getDerivedStateFromError(error: Error): State {\r\n return { error }\r\n }\r\n\r\n override componentDidCatch(error: Error, info: { componentStack?: string | null }): void {\r\n console.error('dsh-background-by-model: section render crashed', error, info.componentStack)\r\n }\r\n\r\n private reset = (): void => {\r\n this.setState({ error: null })\r\n this.props.onReset?.()\r\n }\r\n\r\n override render() {\r\n if (this.state.error) {\r\n return (\r\n <div className=\"dab-crash\">\r\n <div className=\"dab-crash-title\">{this.props.t('crashTitle')}</div>\r\n <div className=\"dab-crash-desc\">{this.props.t('crashDesc')}</div>\r\n <button type=\"button\" className=\"dab-btn\" onClick={this.reset}>{this.props.t('crashReset')}</button>\r\n </div>\r\n )\r\n }\r\n return this.props.children\r\n }\r\n}\r\n","import { useEffect, useState } from 'react'\r\nimport type { ReactNode } from 'react'\r\nimport { createPortal } from 'react-dom'\r\n\r\n/**\r\n * Render children into a fixed root attached to document.documentElement.\r\n *\r\n * The host's sidebar is often implemented by translating the body or a wrapper\r\n * (margin-left / transform). A fixed element portaled to body would still be\r\n * captured by that transformed ancestor and shift with the sidebar. Attaching\r\n * the portal root directly to <html> escapes body-level transforms so the\r\n * overlay is always painted relative to the viewport and centered correctly.\r\n */\r\nexport function Portal({ children }: { children: ReactNode }) {\r\n const [target, setTarget] = useState<HTMLElement | null>(null)\r\n useEffect(() => {\r\n const el = document.createElement('div')\r\n el.dataset.dabPortal = '1'\r\n el.style.cssText = 'position:fixed;inset:0;pointer-events:none;z-index:999999'\r\n document.documentElement.appendChild(el)\r\n setTarget(el)\r\n return () => { el.remove() }\r\n }, [])\r\n return target ? createPortal(children, target) : null\r\n}\r\n","import { useEffect, useRef } from 'react'\r\nimport type { CSSProperties } from 'react'\r\n\r\n/**\r\n * Zero-lag slider: the thumb and value label update through DOM refs while\r\n * dragging (onInput) so the caller can mutate the live UI directly without a\r\n * React re-render; onChange commits the settled value. Double-click resets to\r\n * the canonical default. The track fill is a gradient driven by the --pct\r\n * custom property, updated imperatively alongside the thumb.\r\n */\r\nexport function LiveSlider({ min, max, step, def, fmt, label, onInput, onChange }: {\r\n min: number; max: number; step: number; def: number\r\n fmt: (v: number) => string; label?: string; onInput?: (v: number) => void; onChange: (v: number) => void\r\n}) {\r\n const inputRef = useRef<HTMLInputElement>(null)\r\n const valRef = useRef<HTMLSpanElement>(null)\r\n\r\n const paint = (el: HTMLInputElement, v: number): void => {\r\n el.style.setProperty('--pct', String(((v - min) / (max - min)) * 100))\r\n }\r\n\r\n // Controlled sync: keep the knob and label aligned with the canonical prop\r\n // so external updates (presets, regeneration, imports) never leave it stale.\r\n useEffect(() => {\r\n if (inputRef.current) {\r\n inputRef.current.value = String(def)\r\n paint(inputRef.current, def)\r\n }\r\n if (valRef.current) valRef.current.textContent = fmt(def)\r\n }, [def, fmt, min, max])\r\n\r\n const apply = (v: number): void => {\r\n if (inputRef.current) {\r\n inputRef.current.value = String(v)\r\n paint(inputRef.current, v)\r\n }\r\n if (valRef.current) valRef.current.textContent = fmt(v)\r\n onInput?.(v)\r\n onChange(v)\r\n }\r\n\r\n return (\r\n <div className=\"dab-slider-block\">\r\n {label ? <span className=\"dab-slider-label\">{label}</span> : null}\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>\r\n <input\r\n ref={inputRef} type=\"range\" className=\"dab-slider\"\r\n style={{ '--pct': ((def - min) / (max - min)) * 100 } as CSSProperties}\r\n min={min} max={max} step={step} defaultValue={def}\r\n title={label ? `${label} · ${fmt(def)}` : fmt(def)}\r\n onDoubleClick={() => apply(def)}\r\n onInput={e => {\r\n const el = e.target as HTMLInputElement\r\n const v = Number(el.value)\r\n paint(el, v)\r\n onInput?.(v)\r\n if (valRef.current) valRef.current.textContent = fmt(v)\r\n }}\r\n onChange={e => onChange(Number((e.target as HTMLInputElement).value))} />\r\n <span ref={valRef} className=\"dab-slider-val\">{fmt(def)}</span>\r\n </div>\r\n </div>\r\n )\r\n}\r\n","import type { CSSProperties, ComponentType } from 'react'\r\nimport type { ThemeSectionProps, PartOpacities, PartBlurs } from '../../types'\r\nimport { cfg, rOps, rSop, rBlurs, rChatTextOpacity, rTrajectoryOpacity, rRightbarOpacity } from '../../state'\r\nimport { saveConfig } from '../../rpc'\r\nimport { applyCustomTokens, applySettingsOverrides, setPartBlur, applyViewCards, applyTrajectoryOverrides, applyRightbarOverrides } from '../../wallpaper'\r\nimport { LiveSlider } from '../LiveSlider'\r\nimport { CanvasIcon, SidebarIcon, ChatIcon, GearIcon, TextIcon, TrajectoryIcon, PreviewIcon, InputIcon } from '../icons'\r\n\r\ninterface PartDef {\r\n labelKey: string\r\n Icon: ComponentType<{ size?: number }>\r\n /** Homepage part key; absent for the settings-panel part. */\r\n opKey?: keyof PartOpacities\r\n isSettings?: boolean\r\n /** Conversation text region: tint opacity + blur over the message column. */\r\n isChat?: boolean\r\n /** Trajectory view: tint opacity + blur over the whole view surface. */\r\n isTrajectory?: boolean\r\n /** File-preview panel: the right sidebar a file click opens. */\r\n isRightbar?: boolean\r\n}\r\n\r\nconst PARTS: PartDef[] = [\r\n { opKey: 'bg', labelKey: 'uiOpacityBg', Icon: CanvasIcon },\r\n { opKey: 'sidebar', labelKey: 'uiOpacitySide', Icon: SidebarIcon },\r\n { isRightbar: true, labelKey: 'uiPreview', Icon: PreviewIcon },\r\n { opKey: 'card', labelKey: 'uiOpacityCard', Icon: ChatIcon },\r\n { opKey: 'input', labelKey: 'uiOpacityInput', Icon: InputIcon },\r\n { isSettings: true, labelKey: 'uiSop', Icon: GearIcon },\r\n { isChat: true, labelKey: 'uiChatRegion', Icon: TextIcon },\r\n { isTrajectory: true, labelKey: 'uiTrajectory', Icon: TrajectoryIcon },\r\n]\r\n\r\nexport function InterfacePage({ p }: { p: ThemeSectionProps }) {\r\n const { t, setOps, setBlurs, setSop, setRightbarOpacity } = p\r\n\r\n return (\r\n <>\r\n <header className=\"dab-head dab-rise\" style={{ '--d': 0 } as CSSProperties}>\r\n <div className=\"dab-overline\">Surfaces</div>\r\n <h2 className=\"dab-h1\">{t('uiTitle')}</h2>\r\n <p className=\"dab-desc\">{t('descInterface')}</p>\r\n </header>\r\n\r\n <div className=\"dab-grid-parts\">\r\n {PARTS.map((part, i) => {\r\n const { labelKey, Icon, isSettings, isChat, isTrajectory, isRightbar } = part\r\n const opKey = part.opKey\r\n // Homepage parts (bg/sidebar/card/input) bind to their own part only;\r\n // the settings panel (isSettings) binds exclusively to the 'settings'\r\n // part (--dsh-any-blur-settings / --dsh-any-bg-settings-surface) and\r\n // must never fall back to a homepage part key — otherwise the dialog\r\n // panel would track the homepage center/card blur and the home-page\r\n // opacities. The chat region (isChat) and the trajectory view\r\n // (isTrajectory) own their own blur keys plus their own tint\r\n // opacities, and the file-preview panel (isRightbar) owns the right\r\n // column's backdrop through the same deal. Every homepage opKey is\r\n // also a PartBlurs key (input included), so the shared blur slider\r\n // dereferences it directly.\r\n const blurKey: keyof PartBlurs = isChat\r\n ? 'chat'\r\n : isTrajectory\r\n ? 'trajectory'\r\n : isRightbar\r\n ? 'rightbar'\r\n : isSettings ? 'settings' : opKey!\r\n const opacity = isChat\r\n ? rChatTextOpacity()\r\n : isTrajectory\r\n ? rTrajectoryOpacity()\r\n : isRightbar ? rRightbarOpacity() : isSettings ? rSop() : rOps()[opKey!]\r\n return (\r\n <section key={blurKey} className=\"dab-card dab-card-hover dab-rise\" style={{ '--d': i + 1 } as CSSProperties}>\r\n <div className=\"dab-part-head\">\r\n <div className=\"dab-part-ico\"><Icon size={16} /></div>\r\n <div className=\"dab-part-name\">{t(labelKey)}</div>\r\n <span className=\"dab-part-badge\">{Math.round(opacity * 100)}%</span>\r\n </div>\r\n\r\n <LiveSlider label={t('uiOpacity')} min={0} max={100} step={1} def={Math.round(opacity * 100)}\r\n fmt={v => `${v}%`}\r\n onInput={v => {\r\n const op = v / 100\r\n if (isChat) {\r\n cfg.chatTextOpacity = op\r\n applyViewCards()\r\n } else if (isTrajectory) {\r\n cfg.trajectoryOpacity = op\r\n applyTrajectoryOverrides(op)\r\n } else if (isRightbar) {\r\n // First drag is what detaches the panel from the main\r\n // background; from then on the card owns it.\r\n cfg.rightbarOpacity = op\r\n applyRightbarOverrides(op)\r\n } else if (isSettings) {\r\n cfg.settingsOpacity = op\r\n applySettingsOverrides(op)\r\n } else {\r\n const ops = { ...rOps() }\r\n ops[opKey!] = op\r\n cfg.opacities = ops\r\n applyCustomTokens(ops)\r\n }\r\n saveConfig()\r\n }}\r\n onChange={v => {\r\n const op = v / 100\r\n if (isChat) {\r\n cfg.chatTextOpacity = op\r\n applyViewCards()\r\n saveConfig()\r\n } else if (isTrajectory) {\r\n cfg.trajectoryOpacity = op\r\n applyTrajectoryOverrides(op)\r\n saveConfig()\r\n } else if (isRightbar) {\r\n setRightbarOpacity(op)\r\n } else if (isSettings) {\r\n setSop(op)\r\n } else {\r\n const ops = { ...rOps() }\r\n ops[opKey!] = op\r\n setOps(ops)\r\n }\r\n }} />\r\n\r\n <LiveSlider label={t('uiBlur')} min={0} max={60} step={1} def={rBlurs()[blurKey]}\r\n fmt={v => `${v}px`}\r\n onInput={v => {\r\n const blurs = { ...rBlurs() }\r\n blurs[blurKey] = v\r\n cfg.blurs = blurs\r\n setPartBlur(blurKey, v)\r\n saveConfig()\r\n }}\r\n onChange={v => {\r\n const blurs = { ...rBlurs() }\r\n blurs[blurKey] = v\r\n setBlurs(blurs)\r\n }} />\r\n </section>\r\n )\r\n })}\r\n </div>\r\n </>\r\n )\r\n}\r\n","/**\r\n * Read a chosen image file as a data URL WITHOUT re-encoding: the original\r\n * pixels are kept as-is (no canvas downscale / JPEG re-compression), so the\r\n * wallpaper is stored and displayed at full fidelity. The tradeoff is a larger\r\n * payload over the RPC channel and on disk for big images.\r\n */\r\nexport function readImg(file: File, cb: (url: string | null) => void): void {\r\n const r = new FileReader()\r\n r.onerror = () => cb(null)\r\n r.onload = () => cb(r.result as string)\r\n r.readAsDataURL(file)\r\n}\r\n","import { useRef, useState, useEffect, useCallback, memo } from 'react'\r\n\r\nconst WHEEL_SIZE = 220\r\nconst CX = WHEEL_SIZE / 2\r\nconst RING_OUTER = 106\r\nconst RING_INNER = 82\r\n// Square inscribed in the ring's inner circle: half-side = RING_INNER / √2,\r\n// so the four corners sit exactly on the inner edge of the hue ring. The\r\n// exact (un-rounded) value keeps the corners tangent to the ring — a rounded\r\n// half-side would push the diagonals past the ring's inner boundary.\r\nconst SQ_HALF = RING_INNER / Math.SQRT2\r\n\r\n/** Static hue ring cached once across all wheels. */\r\nlet ringCache: HTMLCanvasElement | null = null\r\nfunction getRingCache(): HTMLCanvasElement {\r\n if (ringCache) return ringCache\r\n const cvs = document.createElement('canvas')\r\n cvs.width = WHEEL_SIZE; cvs.height = WHEEL_SIZE\r\n const c = cvs.getContext('2d')!\r\n // Instead of 360 separate arc paths, use a single conic gradient clipped to\r\n // the ring. This removes per-frame path overhead and anti-aliasing gaps.\r\n const g = c.createConicGradient(0, CX, CX)\r\n for (let i = 0; i <= 360; i++) g.addColorStop(i / 360, `hsl(${i},100%,50%)`)\r\n c.beginPath()\r\n c.arc(CX, CX, RING_OUTER, 0, Math.PI * 2)\r\n c.arc(CX, CX, RING_INNER, 0, Math.PI * 2, true)\r\n c.fillStyle = g\r\n c.fill()\r\n ringCache = cvs\r\n return ringCache\r\n}\r\n\r\nfunction drawMarkers(ctx: CanvasRenderingContext2D, hue: number, sat: number, lit: number): void {\r\n // Hue marker on ring. Canvas math angles (0 = +x / \"3 o'clock\", positive =\r\n // toward +y) directly match the conic-gradient hue distribution drawn in\r\n // getRingCache (colorStop i/360 → hsl(i)), so NO extra ±90° shift is applied.\r\n // A shift would rotate the picker's indication 90° away from the rendered\r\n // gradient (e.g. picking the top of the wheel would report red while the\r\n // pixels there are blue). hue 0 sits at the right edge, +90° at the bottom.\r\n const hRad = hue * Math.PI / 180\r\n const hR = (RING_OUTER + RING_INNER) / 2\r\n const hmx = CX + Math.cos(hRad) * hR\r\n const hmy = CX + Math.sin(hRad) * hR\r\n ctx.beginPath(); ctx.arc(hmx, hmy, 8, 0, Math.PI * 2)\r\n ctx.fillStyle = 'rgba(0,0,0,0.25)'; ctx.fill()\r\n ctx.beginPath(); ctx.arc(hmx, hmy, 6.5, 0, Math.PI * 2)\r\n ctx.strokeStyle = '#fff'; ctx.lineWidth = 2; ctx.stroke()\r\n\r\n // SL marker (HSV coordinates)\r\n const gx = CX - SQ_HALF, gy = CX - SQ_HALF, sz = SQ_HALF * 2\r\n const smx = gx + sat * sz\r\n const smy = gy + (1 - lit) * sz\r\n ctx.beginPath(); ctx.arc(smx, smy, 7, 0, Math.PI * 2)\r\n ctx.fillStyle = 'rgba(0,0,0,0.25)'; ctx.fill()\r\n ctx.beginPath(); ctx.arc(smx, smy, 5.5, 0, Math.PI * 2)\r\n ctx.strokeStyle = '#fff'; ctx.lineWidth = 2; ctx.stroke()\r\n ctx.beginPath(); ctx.arc(smx, smy, 3.5, 0, Math.PI * 2)\r\n ctx.strokeStyle = '#000'; ctx.lineWidth = 1; ctx.stroke()\r\n}\r\n\r\nfunction drawSquare(c: CanvasRenderingContext2D, hue: number): void {\r\n const gx = CX - SQ_HALF, gy = CX - SQ_HALF, sz = SQ_HALF * 2\r\n c.clearRect(gx - 1, gy - 1, sz + 2, sz + 2)\r\n c.fillStyle = '#fff'; c.fillRect(gx, gy, sz, sz)\r\n const gh = c.createLinearGradient(gx, 0, gx + sz, 0)\r\n gh.addColorStop(0, 'rgba(255,255,255,1)'); gh.addColorStop(1, `hsl(${hue},100%,50%)`)\r\n c.fillStyle = gh; c.fillRect(gx, gy, sz, sz)\r\n const gv = c.createLinearGradient(0, gy, 0, gy + sz)\r\n gv.addColorStop(0, 'rgba(0,0,0,0)'); gv.addColorStop(1, 'rgba(0,0,0,1)')\r\n c.fillStyle = gv; c.fillRect(gx, gy, sz, sz)\r\n}\r\n\r\nfunction hitTest(x: number, y: number): 'ring' | 'square' | null {\r\n if (Math.abs(x - CX) <= SQ_HALF && Math.abs(y - CX) <= SQ_HALF) return 'square'\r\n const dx = x - CX, dy = y - CX\r\n const dist = Math.sqrt(dx * dx + dy * dy)\r\n if (dist >= RING_INNER - 4 && dist <= RING_OUTER + 4) return 'ring'\r\n return null\r\n}\r\n\r\nfunction pickHue(x: number, y: number): number {\r\n // Inverse of drawMarkers: no ±90° shift, matching the conic gradient exactly.\r\n let angle = Math.atan2(y - CX, x - CX) * 180 / Math.PI\r\n if (angle < 0) angle += 360\r\n return angle\r\n}\r\n\r\nfunction pickSL(x: number, y: number): [number, number] {\r\n const gx = CX - SQ_HALF, gy = CX - SQ_HALF, sz = SQ_HALF * 2\r\n return [\r\n Math.max(0, Math.min(1, (x - gx) / sz)),\r\n Math.max(0.02, Math.min(0.98, 1 - (y - gy) / sz)),\r\n ]\r\n}\r\n\r\nexport const ColorWheel = memo(function ColorWheel({ hue, sat, lit, onChange }: {\r\n hue: number; sat: number; lit: number\r\n onChange: (h: number, s: number, l: number) => void\r\n}) {\r\n const cvsRef = useRef<HTMLCanvasElement>(null)\r\n const [col, setCol] = useState({ hue, sat, lit })\r\n const colRef = useRef(col)\r\n colRef.current = col\r\n\r\n // Adopt external changes (e.g. section remount after theme restore).\r\n useEffect(() => {\r\n setCol(c => (c.hue === hue && c.sat === sat && c.lit === lit ? c : { hue, sat, lit }))\r\n }, [hue, sat, lit])\r\n\r\n // Redraw only what changed. The static ring is copied from cache; the square\r\n // only redraws when hue changes; markers redraw on every value change.\r\n useEffect(() => {\r\n const cvs = cvsRef.current\r\n if (!cvs) return\r\n const ctx = cvs.getContext('2d')!\r\n ctx.clearRect(0, 0, WHEEL_SIZE, WHEEL_SIZE)\r\n // Draw the square first, then the ring on top: the ring's opaque pixels\r\n // cover the square's four corners (which are tangent to the ring's inner\r\n // edge), so the corners no longer visually overlap the hue ring.\r\n drawSquare(ctx, col.hue)\r\n ctx.drawImage(getRingCache(), 0, 0)\r\n drawMarkers(ctx, col.hue, col.sat, col.lit)\r\n }, [col])\r\n\r\n // Batch pointer updates in a single rAF so rapid mousemove events do not\r\n // trigger a React state flush + onChange on every pixel.\r\n const pendingRef = useRef<{ h: number; s: number; l: number } | null>(null)\r\n const rafRef = useRef<number | null>(null)\r\n const flushPending = useCallback(() => {\r\n rafRef.current = null\r\n const p = pendingRef.current\r\n if (!p) return\r\n pendingRef.current = null\r\n setCol({ hue: p.h, sat: p.s, lit: p.l })\r\n onChange(p.h, p.s, p.l)\r\n }, [onChange])\r\n\r\n const schedule = useCallback((h: number, s: number, l: number) => {\r\n pendingRef.current = { h, s, l }\r\n if (rafRef.current === null) rafRef.current = requestAnimationFrame(flushPending)\r\n }, [flushPending])\r\n\r\n const onDown = useCallback((e: React.MouseEvent<HTMLCanvasElement>) => {\r\n const r = cvsRef.current!.getBoundingClientRect()\r\n const x = e.clientX - r.left, y = e.clientY - r.top\r\n const region = hitTest(x, y)\r\n if (!region) return\r\n if (region === 'ring') {\r\n schedule(pickHue(x, y), colRef.current.sat, colRef.current.lit)\r\n } else {\r\n const [s, l] = pickSL(x, y)\r\n schedule(colRef.current.hue, s, l)\r\n }\r\n const onMove = (ev: MouseEvent) => {\r\n const rr = cvsRef.current!.getBoundingClientRect()\r\n const mx = ev.clientX - rr.left, my = ev.clientY - rr.top\r\n if (region === 'ring') {\r\n const d = Math.sqrt((mx - CX) ** 2 + (my - CX) ** 2)\r\n if (d >= RING_INNER - 10 && d <= RING_OUTER + 10) schedule(pickHue(mx, my), colRef.current.sat, colRef.current.lit)\r\n } else {\r\n const [s, l] = pickSL(mx, my)\r\n schedule(colRef.current.hue, s, l)\r\n }\r\n }\r\n const onUp = () => { document.removeEventListener('mousemove', onMove); document.removeEventListener('mouseup', onUp) }\r\n document.addEventListener('mousemove', onMove); document.addEventListener('mouseup', onUp)\r\n }, [schedule])\r\n\r\n return <canvas ref={cvsRef} width={WHEEL_SIZE} height={WHEEL_SIZE} className=\"dab-wheel\" onMouseDown={onDown} />\r\n})\r\n","import { useState, useEffect, useRef } from 'react'\r\nimport type { CSSProperties } from 'react'\r\nimport { hsvToHsl, hslToRgb, rgbToHsl, hslToHsv } from '../utils/color'\r\n\r\ntype Mode = 'hsl' | 'rgb'\r\n\r\nconst SEG_W = 66\r\n\r\nfunction clamp(v: number, min: number, max: number): number {\r\n return Math.min(max, Math.max(min, v))\r\n}\r\n\r\n/**\r\n * A single numeric field that edits one color channel. Keeps its own text\r\n * while focused so typing never gets clobbered by the parent re-rendering the\r\n * canonical value; commits every valid keystroke live and re-normalizes on\r\n * blur. The value prop only pushes back in when the field is not focused\r\n * (wheel drags, wallpaper extraction, mode switches).\r\n */\r\nfunction NumField({ label, value, min, max, step, onChange }: {\r\n label: string; value: number; min: number; max: number; step: number\r\n onChange: (v: number) => void\r\n}) {\r\n const [text, setText] = useState(String(value))\r\n const focused = useRef(false)\r\n\r\n useEffect(() => {\r\n if (!focused.current) setText(String(value))\r\n }, [value])\r\n\r\n return (\r\n <label className=\"dab-field\">\r\n <span className=\"dab-field-label\">{label}</span>\r\n <input\r\n type=\"number\"\r\n min={min} max={max} step={step}\r\n value={text}\r\n className=\"dab-num\"\r\n onFocus={() => { focused.current = true }}\r\n onBlur={() => { focused.current = false; setText(String(value)) }}\r\n onChange={e => {\r\n setText(e.target.value)\r\n const v = Number(e.target.value)\r\n if (Number.isFinite(v)) onChange(clamp(v, min, max))\r\n }}\r\n />\r\n </label>\r\n )\r\n}\r\n\r\n/**\r\n * Precise color entry next to the wheel: a HSL/RGB segmented toggle plus three\r\n * numeric channel fields and a live swatch. The wheel is HSV end-to-end, so\r\n * this panel converts at the boundary — HSL fields map straight onto the\r\n * stored HSL, RGB fields round-trip through rgbToHsl — and both emit HSV via\r\n * the same onChange the wheel uses, keeping one canonical color.\r\n */\r\nexport function ColorInputs({ hue, sat, lit, onChange }: {\r\n hue: number; sat: number; lit: number\r\n onChange: (h: number, s: number, l: number) => void\r\n}) {\r\n const [mode, setMode] = useState<Mode>('hsl')\r\n const [h, s, l] = hsvToHsl(hue, sat, lit)\r\n const [r, g, b] = hslToRgb(h, s, l)\r\n\r\n const setHsl = (nh: number, ns: number, nl: number) => onChange(...hslToHsv(nh, ns, nl))\r\n const setRgb = (nr: number, ng: number, nb: number) => {\r\n const [nh, ns, nl] = rgbToHsl(nr, ng, nb)\r\n onChange(...hslToHsv(nh, ns, nl))\r\n }\r\n\r\n return (\r\n <div className=\"dab-inputs\">\r\n <div className=\"dab-seg\" style={{ '--w': `${SEG_W}px` } as CSSProperties}>\r\n <div className=\"dab-seg-thumb\" style={{ transform: `translateX(${mode === 'hsl' ? 0 : SEG_W}px)` }} />\r\n <button type=\"button\" className={`dab-seg-item${mode === 'hsl' ? ' is-active' : ''}`} onClick={() => setMode('hsl')}>HSL</button>\r\n <button type=\"button\" className={`dab-seg-item${mode === 'rgb' ? ' is-active' : ''}`} onClick={() => setMode('rgb')}>RGB</button>\r\n </div>\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 7 }}>\r\n {mode === 'hsl' ? (\r\n <>\r\n <NumField label=\"H\" value={Math.round(h)} min={0} max={360} step={1} onChange={v => setHsl(v, s, l)} />\r\n <NumField label=\"S\" value={Math.round(s * 100)} min={0} max={100} step={1} onChange={v => setHsl(h, v / 100, l)} />\r\n <NumField label=\"L\" value={Math.round(l * 100)} min={0} max={100} step={1} onChange={v => setHsl(h, s, v / 100)} />\r\n </>\r\n ) : (\r\n <>\r\n <NumField label=\"R\" value={r} min={0} max={255} step={1} onChange={v => setRgb(v, g, b)} />\r\n <NumField label=\"G\" value={g} min={0} max={255} step={1} onChange={v => setRgb(r, v, b)} />\r\n <NumField label=\"B\" value={b} min={0} max={255} step={1} onChange={v => setRgb(r, g, v)} />\r\n </>\r\n )}\r\n </div>\r\n <div className=\"dab-swatch-lg\" style={{ background: `hsl(${Math.round(h)} ${Math.round(s * 100)}% ${Math.round(l * 100)}%)` }} />\r\n </div>\r\n )\r\n}\r\n","import { useRef, useState, useEffect, useCallback } from 'react'\r\nimport { rgbToHsl, hslToHsv } from '../utils/color'\r\nimport { Portal } from './Portal'\r\n\r\nconst MAG_SIZE = 96\r\nconst MAG_ZOOM = 8\r\n\r\nfunction toHex(rgb: [number, number, number]): string {\r\n return '#' + rgb.map(v => v.toString(16).padStart(2, '0')).join('')\r\n}\r\n\r\n/**\r\n * Eyedropper modal: shows the wallpaper full-bleed (no drag/zoom) and lets the\r\n * user click any pixel to adopt it as the theme color. A magnifier circle\r\n * follows the cursor so small details can be picked precisely. The wallpaper\r\n * is a data URL, so sampling is CORS-free: draw it once to an offscreen-sized\r\n * canvas and read pixels via getImageData.\r\n */\r\nexport function ColorPicker({ url, t, onPick, onClose }: {\r\n url: string\r\n t: (key: string) => string\r\n onPick: (hsv: [number, number, number]) => void\r\n onClose: () => void\r\n}) {\r\n const canvasRef = useRef<HTMLCanvasElement>(null)\r\n const magRef = useRef<HTMLCanvasElement>(null)\r\n const imgRef = useRef<HTMLImageElement | null>(null)\r\n const [ready, setReady] = useState(false)\r\n const [hover, setHover] = useState<{ rgb: [number, number, number] } | null>(null)\r\n const [mag, setMag] = useState<{ x: number; y: number } | null>(null)\r\n\r\n useEffect(() => {\r\n const img = new Image()\r\n img.onload = () => { imgRef.current = img; setReady(true) }\r\n img.src = url\r\n }, [url])\r\n\r\n useEffect(() => {\r\n if (!ready || !canvasRef.current || !imgRef.current) return\r\n const canvas = canvasRef.current\r\n canvas.width = imgRef.current.naturalWidth\r\n canvas.height = imgRef.current.naturalHeight\r\n const ctx = canvas.getContext('2d')\r\n if (ctx) ctx.drawImage(imgRef.current, 0, 0)\r\n }, [ready])\r\n\r\n const sampleAt = useCallback((clientX: number, clientY: number) => {\r\n const canvas = canvasRef.current\r\n if (!canvas) return null\r\n const rect = canvas.getBoundingClientRect()\r\n if (rect.width === 0 || rect.height === 0) return null\r\n const ctx = canvas.getContext('2d')\r\n if (!ctx) return null\r\n const sx = Math.round((clientX - rect.left) * (canvas.width / rect.width))\r\n const sy = Math.round((clientY - rect.top) * (canvas.height / rect.height))\r\n if (sx < 0 || sy < 0 || sx >= canvas.width || sy >= canvas.height) return null\r\n const d = ctx.getImageData(sx, sy, 1, 1).data\r\n return { sx, sy, rgb: [d[0], d[1], d[2]] as [number, number, number] }\r\n }, [])\r\n\r\n const drawMagnifier = useCallback((sx: number, sy: number) => {\r\n const mag = magRef.current\r\n const src = canvasRef.current\r\n if (!mag || !src) return\r\n const ctx = mag.getContext('2d')\r\n if (!ctx) return\r\n const half = MAG_SIZE / MAG_ZOOM / 2\r\n ctx.clearRect(0, 0, MAG_SIZE, MAG_SIZE)\r\n ctx.drawImage(src, sx - half, sy - half, half * 2, half * 2, 0, 0, MAG_SIZE, MAG_SIZE)\r\n ctx.strokeStyle = 'rgba(255,255,255,0.85)'\r\n ctx.lineWidth = 1\r\n ctx.beginPath()\r\n ctx.moveTo(MAG_SIZE / 2, 0); ctx.lineTo(MAG_SIZE / 2, MAG_SIZE)\r\n ctx.moveTo(0, MAG_SIZE / 2); ctx.lineTo(MAG_SIZE, MAG_SIZE / 2)\r\n ctx.stroke()\r\n }, [])\r\n\r\n const onMove = (e: React.MouseEvent) => {\r\n const s = sampleAt(e.clientX, e.clientY)\r\n if (!s) { setHover(null); setMag(null); return }\r\n setHover({ rgb: s.rgb })\r\n drawMagnifier(s.sx, s.sy)\r\n const off = 28\r\n let x = e.clientX + off\r\n let y = e.clientY + off\r\n if (x + MAG_SIZE > window.innerWidth) x = e.clientX - off - MAG_SIZE\r\n if (y + MAG_SIZE > window.innerHeight) y = e.clientY - off - MAG_SIZE\r\n setMag({ x, y })\r\n }\r\n\r\n const onClick = (e: React.MouseEvent) => {\r\n const s = sampleAt(e.clientX, e.clientY)\r\n if (!s) return\r\n const [h, sl, l] = rgbToHsl(s.rgb[0], s.rgb[1], s.rgb[2])\r\n onPick(hslToHsv(h, sl, l))\r\n }\r\n\r\n return (\r\n <Portal>\r\n <div className=\"dab-overlay\">\r\n <div className=\"dab-overlay-title\">{t('pickerTitle')}</div>\r\n <div className=\"dab-overlay-hint\">{t('pickerHint')}</div>\r\n <div className=\"dab-modal-card\" style={{\r\n maxWidth: 'min(90vw, 720px)', maxHeight: '60vh', overflow: 'hidden',\r\n borderRadius: 12, border: '2px solid rgba(255,255,255,0.3)', background: '#000', cursor: 'crosshair',\r\n }}>\r\n <canvas ref={canvasRef} style={{ display: 'block', maxWidth: '100%', maxHeight: '60vh', objectFit: 'contain' }}\r\n onMouseMove={onMove}\r\n onMouseLeave={() => { setHover(null); setMag(null) }}\r\n onClick={onClick} />\r\n </div>\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, minWidth: 260 }}>\r\n <div style={{ width: 28, height: 28, borderRadius: 8, border: '1px solid rgba(255,255,255,0.4)', background: hover ? toHex(hover.rgb) : 'transparent' }} />\r\n <div style={{ color: '#fff', fontSize: 13, fontFamily: 'var(--dab-mono, monospace)' }}>{hover ? `${toHex(hover.rgb)} · rgb(${hover.rgb.join(', ')})` : '—'}</div>\r\n </div>\r\n <div style={{ display: 'flex', gap: 10 }}>\r\n <button type=\"button\" className=\"dab-btn\" onClick={onClose}>{t('pickerClose')}</button>\r\n </div>\r\n <canvas ref={magRef} width={MAG_SIZE} height={MAG_SIZE}\r\n style={{\r\n position: 'fixed', width: MAG_SIZE, height: MAG_SIZE, borderRadius: '50%',\r\n border: '2px solid rgba(255,255,255,0.7)', boxShadow: '0 4px 16px rgba(0,0,0,0.5)',\r\n zIndex: 10000, background: '#000', pointerEvents: 'none', transition: 'opacity 0.08s',\r\n left: mag?.x ?? 0, top: mag?.y ?? 0, opacity: mag ? 1 : 0,\r\n }} />\r\n </div>\r\n </Portal>\r\n )\r\n}\r\n","import { useRef, useState, useEffect, useCallback } from 'react'\nimport type { BgState } from '../types'\nimport { Portal } from './Portal'\n\n/**\n * Framing editor for one rule's image.\n *\n * The placement state is passed IN rather than read from a global slot: every\n * rule owns its own framing, and editing rule B must never touch rule A.\n */\nexport function BgEditor({ url, state, t, onClose, onCommit }: {\n url: string\n /** The rule's own framing. */\n state: BgState\n t: (key: string) => string; onClose: () => void\n onCommit: (zoom: number, x: number, y: number, iw: number, ih: number) => void\n}) {\n const pw = Math.min(window.innerWidth * 0.75, 860)\n const ph = Math.round(pw * window.innerHeight / window.innerWidth)\n const saved = state\n const [zoom, setZoom] = useState(saved.iw > 0 ? saved.zoom : 1)\n const [pos, setPos] = useState(saved.iw > 0 ? { x: saved.x * pw, y: saved.y * ph } : { x: 0, y: 0 })\n const [imgSize, setImgSize] = useState({ w: 0, h: 0 })\n const containerRef = useRef<HTMLDivElement>(null)\n const imgRef = useRef<HTMLImageElement>(null)\n const dragRef = useRef({ active: false, sx: 0, sy: 0, spx: 0, spy: 0 })\n\n useEffect(() => {\n const img = new Image()\n img.onload = () => {\n const scale = Math.min(pw / img.width, ph / img.height)\n const w = img.width * scale, h = img.height * scale\n setImgSize({ w, h })\n const s = state\n if (s.iw > 0 && s.iw === img.width && s.ih === img.height) {\n setZoom(s.zoom)\n // Saved x, y are CENTER fractions of the preview: the image center\n // lands at (x·pw, y·ph), so the top-left comes from subtracting half\n // the displayed (zoom-scaled) image size.\n setPos({ x: s.x * pw - w * s.zoom / 2, y: s.y * ph - h * s.zoom / 2 })\n } else {\n setZoom(1)\n setPos({ x: (pw - w) / 2, y: (ph - h) / 2 })\n }\n }\n img.src = url\n }, [url, state, pw, ph])\n\n const onDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault()\n dragRef.current = { active: true, sx: e.clientX, sy: e.clientY, spx: pos.x, spy: pos.y }\n const onMove = (ev: MouseEvent) => {\n if (!dragRef.current.active) return\n setPos({ x: dragRef.current.spx + ev.clientX - dragRef.current.sx, y: dragRef.current.spy + ev.clientY - dragRef.current.sy })\n }\n const onUp = () => { dragRef.current.active = false; document.removeEventListener('mousemove', onMove); document.removeEventListener('mouseup', onUp) }\n document.addEventListener('mousemove', onMove); document.addEventListener('mouseup', onUp)\n }, [pos])\n\n const onWheelCb = useCallback((e: WheelEvent) => {\n e.preventDefault()\n const el = containerRef.current\n if (!el) return\n const rect = el.getBoundingClientRect()\n // Anchor the zoom at the preview center so the mouse position never\n // steers where the image grows/shrinks — the current view stays centered.\n const mx = rect.width / 2, my = rect.height / 2\n // 3% per wheel step (0.97 zoom-out / 1.03 zoom-in).\n const factor = e.deltaY > 0 ? 0.97 : 1.03\n const nz = Math.max(0.1, Math.min(10, zoom * factor))\n const nx = mx - (mx - pos.x) * (nz / zoom)\n const ny = my - (my - pos.y) * (nz / zoom)\n setZoom(nz); setPos({ x: nx, y: ny })\n }, [zoom, pos])\n\n useEffect(() => {\n const el = containerRef.current\n if (!el) return\n el.addEventListener('wheel', onWheelCb, { passive: false })\n return () => el.removeEventListener('wheel', onWheelCb)\n }, [onWheelCb])\n\n const resetView = useCallback(() => {\n if (imgSize.w === 0) return\n setZoom(1); setPos({ x: (pw - imgSize.w) / 2, y: (ph - imgSize.h) / 2 })\n }, [pw, ph, imgSize])\n\n return (\n <Portal>\n <div className=\"dab-overlay\" onClick={e => { if (e.target === e.currentTarget) onClose() }}>\n <div className=\"dab-overlay-title\">{t('editorTitle')}</div>\n <div ref={containerRef} className=\"dab-modal-card\" style={{\n position: 'relative', overflow: 'hidden', border: '2px solid rgba(255,255,255,0.3)',\n borderRadius: 12, background: '#000', cursor: 'grab', width: pw, height: ph,\n }} onMouseDown={onDown}>\n <img ref={imgRef} src={url} alt=\"\" draggable={false} style={{\n position: 'absolute', transformOrigin: '0 0', pointerEvents: 'none',\n width: imgSize.w, height: imgSize.h,\n transform: `translate(${pos.x}px,${pos.y}px) scale(${zoom})`,\n }} />\n </div>\n <div className=\"dab-overlay-hint\">{t('editorHint')}</div>\n <div style={{ display: 'flex', gap: 10 }}>\n <button type=\"button\" className=\"dab-btn\" onClick={resetView}>{t('editorReset')}</button>\n <button type=\"button\" className=\"dab-btn\" onClick={onClose}>{t('editorCancel')}</button>\n <button type=\"button\" className=\"dab-btn\" onClick={() => onCommit(zoom, (pos.x + imgSize.w * zoom / 2) / pw, (pos.y + imgSize.h * zoom / 2) / ph, imgRef.current?.naturalWidth ?? 0, imgRef.current?.naturalHeight ?? 0)}>{t('editorCommit')}</button>\n </div>\n </div>\n </Portal>\n )\n}\n","import { useEffect, useRef, useState } from 'react'\nimport type { CSSProperties } from 'react'\nimport type { BgMode, BgRule, ThemeSectionProps, ThemeStoreState } from '../../types'\nimport { cfg, PALETTE } from '../../state'\nimport { matchRule } from '../../modelbg'\nimport { readImg } from '../../utils/image'\nimport { hslToHsv, hsvToHsl, hslToRgb } from '../../utils/color'\nimport { ColorWheel } from '../ColorWheel'\nimport { ColorInputs } from '../ColorInputs'\nimport { ColorPicker } from '../ColorPicker'\nimport { BgEditor } from '../BgEditor'\nimport { LiveSlider } from '../LiveSlider'\nimport { DropletIcon, EditIcon, LinkIcon, PipetteIcon, SparkleIcon, TrashIcon, UploadIcon } from '../icons'\n\nconst BG_MODES: Array<{ mode: BgMode; key: string }> = [\n { mode: 'fit', key: 'bgModeFit' },\n { mode: 'fill', key: 'bgModeFill' },\n { mode: 'stretch', key: 'bgModeStretch' },\n { mode: 'tile', key: 'bgModeTile' },\n { mode: 'center', key: 'bgModeCenter' },\n]\n\n/** Seed color a rule starts from when the user picks one for the first time. */\nconst SEED_COLOR: [number, number, number] = [220, 0.55, 0.25]\n\n/**\n * Failing-hop codes the model watcher can report, mapped to their copy. Only\n * these are rendered: `waiting` and `fallback` already have their own hints.\n */\nconst MODEL_NOTE_KEYS: Record<string, string | undefined> = {\n 'no-service': 'statusNoteNoService',\n 'no-session': 'statusNoteNoSession',\n 'no-projection': 'statusNoteNoProjection',\n 'empty-selection': 'statusNoteEmptySelection',\n}\n\nfunction toHex(rgb: [number, number, number]): string {\n return '#' + rgb.map(v => Math.round(v).toString(16).padStart(2, '0')).join('')\n}\n\nexport function ModelBgPage({ p, notify }: { p: ThemeSectionProps; notify: (msg: string, ok?: boolean) => void }) {\n const { t, useStore } = p\n const store = useStore((s: ThemeStoreState) => s)\n const rules = cfg.rules\n\n // Match tester: the field follows the detected model until the user types\n // their own text, so the card is useful the moment it is looked at and never\n // fights the watcher once it is not. It replaced the old \"active now\" readout —\n // the same question (\"what does this model resolve to?\") one step earlier, and\n // it does not go stale between switches.\n const [text, setText] = useState('')\n const [touched, setTouched] = useState(false)\n useEffect(() => { if (!touched) setText(store.model) }, [store.model, touched])\n const probe = text.trim()\n const result = ((): string | null => {\n if (probe === '') return null\n const hit = matchRule(rules, probe)\n const rule = hit.rule\n if (rule === null) return null\n const n = rules.findIndex(r => r.id === rule.id) + 1\n return `${hit.matched ? t('tryoutHit') : t('tryoutFallback')} ${n}`\n })()\n\n return (\n <>\n <header className=\"dab-head dab-rise\" style={{ '--d': 0 } as CSSProperties}>\n <div className=\"dab-overline\">Rules</div>\n <h2 className=\"dab-h1\">{t('pageModelBg')}</h2>\n <p className=\"dab-desc\">{t('descModelBg')}</p>\n </header>\n\n <section className=\"dab-card dab-rise\" style={{ '--d': 1 } as CSSProperties}>\n <div className=\"dab-swatch-title\">{t('tryoutTitle')}</div>\n <div style={{ marginTop: 10, display: 'flex', flexWrap: 'wrap', gap: 8, alignItems: 'center' }}>\n <input\n type=\"text\" className=\"dab-urlinput\" value={text}\n placeholder={t('tryoutPlaceholder')}\n onChange={e => { setTouched(true); setText(e.target.value) }} />\n {store.model !== '' ? (\n <button type=\"button\" className=\"dab-btn\" onClick={() => { setTouched(true); setText(store.model) }}>\n {t('tryoutUseCurrent')}\n </button>\n ) : null}\n </div>\n <p className=\"dab-hint\" style={{ marginTop: 9 }}>\n {probe === '' ? t('tryoutEmpty') : result === null ? t('tryoutNone') : result}\n </p>\n {/* Why the pre-filled value is what it is: without these, a host default\n passed off as this session's model, or a sessions service that simply\n is not up yet, is indistinguishable from a correct read. */}\n {store.model === '' ? <p className=\"dab-hint\" style={{ marginTop: 6 }}>{t('statusUnknownHint')}</p> : null}\n {store.model !== '' && store.modelSource === 'default'\n ? <p className=\"dab-hint\" style={{ marginTop: 6 }}>{t('statusSourceDefaultHint')}</p>\n : null}\n {MODEL_NOTE_KEYS[store.modelNote] !== undefined\n ? <p className=\"dab-hint\" style={{ marginTop: 6 }}>{t(MODEL_NOTE_KEYS[store.modelNote]!)}</p>\n : null}\n </section>\n\n <section className=\"dab-rise\" style={{ '--d': 2 } as CSSProperties}>\n <div className=\"dab-swatch-title\">{t('rulesTitle')}</div>\n <p className=\"dab-hint\" style={{ marginBottom: 11 }}>{t('rulesHint')}</p>\n\n {/* Picking an image should just theme the rule; this is the off switch\n for people who want the color to be their own choice every time. */}\n <div className=\"dab-chip-row\" style={{ marginBottom: 12, alignItems: 'center' }}>\n <button type=\"button\" className={`dab-toggle${cfg.autoExtract ? ' is-on' : ''}`}\n role=\"switch\" aria-checked={cfg.autoExtract} title={t('autoExtract')}\n onClick={() => p.setAutoExtract(!cfg.autoExtract)}>\n <span className=\"dab-toggle-knob\" />\n </button>\n <span className=\"dab-hint\">{t('autoExtract')}</span>\n </div>\n <p className=\"dab-hint\" style={{ marginBottom: 11 }}>{t('autoExtractHint')}</p>\n\n <div className=\"dab-rules\">\n {rules.map((rule, i) => (\n <RuleCard\n key={rule.id} p={p} rule={rule} index={i} total={rules.length}\n active={rule.id === store.activeRuleId} notify={notify} />\n ))}\n </div>\n\n <button type=\"button\" className=\"dab-btn dab-btn-primary\" style={{ marginTop: 12 }} onClick={() => { p.addRule() }}>\n + {t('ruleAdd')}\n </button>\n </section>\n </>\n )\n}\n\nfunction RuleCard({ p, rule, index, total, active, notify }: {\n p: ThemeSectionProps\n rule: BgRule\n index: number\n total: number\n active: boolean\n notify: (msg: string, ok?: boolean) => void\n}) {\n const { t } = p\n // The active rule opens by default so the panel shows the live one first.\n const [open, setOpen] = useState(active)\n const [dragOver, setDragOver] = useState(false)\n const [urlOpen, setUrlOpen] = useState(false)\n const [urlVal, setUrlVal] = useState('')\n const [urlBusy, setUrlBusy] = useState(false)\n const [urlErr, setUrlErr] = useState<string | null>(null)\n const [editorOpen, setEditorOpen] = useState(false)\n const [pickerOpen, setPickerOpen] = useState(false)\n const [extracting, setExtracting] = useState(false)\n const fileRef = useRef<HTMLInputElement>(null)\n\n const url = p.imageOf(rule.slot)\n const [h, s, l] = rule.color ?? SEED_COLOR\n const wheel = hslToHsv(h, s, l)\n\n const onColor = (nh: number, ns: number, nl: number): void => {\n const [sh, ss, sl] = hsvToHsl(nh, ns, nl)\n p.setRule(rule.id, { color: [sh, ss, sl] })\n }\n\n const onFile = (f: File): void => {\n readImg(f, d => { if (d !== null) p.setRuleImage(rule.id, d) })\n }\n\n const onDrop = (e: React.DragEvent): void => {\n e.preventDefault()\n setDragOver(false)\n const f = e.dataTransfer.files?.[0]\n if (f && f.type.startsWith('image/')) onFile(f)\n }\n\n const applyUrl = async (): Promise<void> => {\n const u = urlVal.trim()\n if (!/^https?:\\/\\//i.test(u)) { setUrlErr(t('ruleUrlBadHttp')); return }\n setUrlBusy(true)\n setUrlErr(null)\n const res = await p.setRuleImageFromUrl(rule.id, u)\n setUrlBusy(false)\n if (res.ok) {\n setUrlOpen(false)\n setUrlVal('')\n } else {\n setUrlErr(res.error === 'invalid url' || res.error === 'unsupported scheme'\n ? t('ruleUrlBadHttp')\n : (res.error ?? t('ruleUrlFail')))\n }\n }\n\n const onExtract = async (): Promise<void> => {\n if (url === null || extracting) return\n setExtracting(true)\n try {\n const ok = await p.extractColor(rule.id)\n notify(ok ? t('extractDone') : t('extractFail'), ok)\n } catch {\n notify(t('extractFail'), false)\n } finally {\n setExtracting(false)\n }\n }\n\n const cls = `dab-rule${active ? ' is-active' : ''}${rule.enabled ? '' : ' is-off'}`\n\n return (\n <section className={cls}>\n <div className=\"dab-rule-head\">\n <button type=\"button\" className=\"dab-icon-btn\" onClick={() => setOpen(o => !o)}\n title={open ? 'Collapse' : 'Expand'} aria-expanded={open}>\n {open ? '▾' : '▸'}\n </button>\n <span className=\"dab-rule-num\">{index + 1}</span>\n {index === 0 ? <span className=\"dab-rule-badge\">{t('ruleFallbackBadge')}</span> : null}\n <input\n className=\"dab-rule-match\" value={rule.match}\n placeholder={t('ruleMatchPlaceholder')}\n onChange={e => p.setRule(rule.id, { match: e.target.value })} />\n <button type=\"button\" className={`dab-toggle${rule.enabled ? ' is-on' : ''}`}\n role=\"switch\" aria-checked={rule.enabled} title={t('ruleEnabled')}\n onClick={() => p.setRule(rule.id, { enabled: !rule.enabled })}>\n <span className=\"dab-toggle-knob\" />\n </button>\n <button type=\"button\" className=\"dab-icon-btn\" disabled={index === 0}\n title={t('ruleUp')} onClick={() => p.moveRule(rule.id, -1)}>↑</button>\n <button type=\"button\" className=\"dab-icon-btn\" disabled={index === total - 1}\n title={t('ruleDown')} onClick={() => p.moveRule(rule.id, 1)}>↓</button>\n <button type=\"button\" className=\"dab-icon-btn dab-icon-btn-danger\"\n title={t('ruleRemove')} onClick={() => p.removeRule(rule.id)}>\n <TrashIcon size={13} />\n </button>\n </div>\n\n {open ? (\n <div className=\"dab-rule-body\">\n <div className=\"dab-rule-cols\">\n {/* ── image + layout ─────────────────────────────────────────── */}\n <div>\n <div\n className={`dab-rule-thumb${dragOver ? ' is-over' : ''}`}\n onClick={() => fileRef.current?.click()}\n onDragOver={e => { e.preventDefault(); setDragOver(true) }}\n onDragLeave={() => setDragOver(false)}\n onDrop={onDrop}>\n {url !== null\n ? <img src={url} alt=\"\" draggable={false} />\n : (\n <div className=\"dab-rule-thumb-empty\">\n <UploadIcon size={18} />\n <span>{t('ruleNoImage')}</span>\n </div>\n )}\n </div>\n\n <div className=\"dab-chip-row\" style={{ marginTop: 10 }}>\n <button type=\"button\" className=\"dab-btn\" onClick={() => fileRef.current?.click()}>\n <UploadIcon size={13} />{url === null ? t('rulePickImage') : t('ruleChangeImage')}\n </button>\n <button type=\"button\" className=\"dab-btn dab-btn-ghost\" onClick={() => setUrlOpen(o => !o)}>\n <LinkIcon size={13} />{t('ruleFromUrl')}\n </button>\n {url !== null && rule.bgMode === 'fit' ? (\n <button type=\"button\" className=\"dab-btn\" onClick={() => setEditorOpen(true)}>\n <EditIcon size={13} />{t('ruleFramingEdit')}\n </button>\n ) : null}\n {url !== null ? (\n <button type=\"button\" className=\"dab-btn dab-btn-ghost dab-btn-danger\"\n onClick={() => p.setRuleImage(rule.id, null)}>\n <TrashIcon size={13} />{t('ruleImageRemove')}\n </button>\n ) : null}\n </div>\n\n {urlOpen ? (\n <div style={{ marginTop: 10, display: 'flex', flexWrap: 'wrap', gap: 8, alignItems: 'center' }}>\n <input\n type=\"text\" className=\"dab-urlinput\" value={urlVal}\n placeholder={t('ruleUrlPlaceholder')} autoFocus\n onChange={e => setUrlVal(e.target.value)}\n onKeyDown={e => { if (e.key === 'Enter') { e.preventDefault(); void applyUrl() } }} />\n <button type=\"button\" className=\"dab-btn dab-btn-primary\" disabled={urlBusy} onClick={() => void applyUrl()}>\n {urlBusy ? t('ruleUrlApplying') : t('ruleUrlApply')}\n </button>\n <button type=\"button\" className=\"dab-btn\"\n onClick={() => { setUrlOpen(false); setUrlVal(''); setUrlErr(null) }}>\n {t('ruleUrlCancel')}\n </button>\n </div>\n ) : null}\n {urlErr !== null ? (\n <p style={{ marginTop: 8, color: 'var(--dsw-alias-state-error-primary)', fontSize: 12 }}>{urlErr}</p>\n ) : null}\n {url === null ? <p className=\"dab-hint\" style={{ marginTop: 8 }}>{t('ruleEmptyHint')}</p> : null}\n\n <div style={{ marginTop: 14 }}>\n <div className=\"dab-rule-section-title\">{t('ruleLayout')}</div>\n <div className=\"dab-chip-row\">\n {BG_MODES.map(m => (\n <button key={m.mode} type=\"button\"\n className={`dab-chip${rule.bgMode === m.mode ? ' is-active' : ''}`}\n onClick={() => p.setRule(rule.id, { bgMode: m.mode })}>\n {t(m.key)}\n </button>\n ))}\n </div>\n </div>\n </div>\n\n {/* ── color + wallpaper effects ──────────────────────────────── */}\n <div>\n <div className=\"dab-rule-section-title\">{t('ruleColor')}</div>\n {rule.color === null ? (\n <>\n <div className=\"dab-chip-row\">\n <button type=\"button\" className=\"dab-btn\" onClick={() => p.setRule(rule.id, { color: SEED_COLOR })}>\n <DropletIcon size={14} />{t('ruleColorNone')}\n </button>\n <button type=\"button\" className=\"dab-btn\" disabled={url === null || extracting} onClick={() => void onExtract()}>\n <SparkleIcon size={14} />{extracting ? t('extracting') : t('ruleColorExtract')}\n </button>\n </div>\n <p className=\"dab-hint\" style={{ marginTop: 8 }}>{t('ruleColorNoneHint')}</p>\n </>\n ) : (\n <>\n <div style={{ display: 'flex', gap: 16, alignItems: 'center', flexWrap: 'wrap' }}>\n <ColorWheel hue={wheel[0]} sat={wheel[1]} lit={wheel[2]} onChange={onColor} />\n <div className=\"dab-inputs\">\n <div className=\"dab-hex-caption\">{toHex(hslToRgb(h, s, l)).toUpperCase()}</div>\n <ColorInputs hue={wheel[0]} sat={wheel[1]} lit={wheel[2]} onChange={onColor} />\n </div>\n </div>\n <div className=\"dab-chip-row\" style={{ marginTop: 12 }}>\n <button type=\"button\" className=\"dab-btn\" disabled={url === null || extracting} onClick={() => void onExtract()}>\n <SparkleIcon size={13} />{extracting ? t('extracting') : t('ruleColorExtract')}\n </button>\n <button type=\"button\" className=\"dab-btn\" disabled={url === null} onClick={() => setPickerOpen(true)}>\n <PipetteIcon size={13} />{t('eyedropper')}\n </button>\n <button type=\"button\" className=\"dab-btn dab-btn-ghost\" onClick={() => p.setRule(rule.id, { color: null })}>\n {t('ruleColorNone')}\n </button>\n </div>\n <div className=\"dab-swatches\" style={{ marginTop: 12 }}>\n {PALETTE.map(([sh, ss, sl], i) => (\n <button\n key={i} type=\"button\" className=\"dab-swatch\"\n style={{ background: `hsl(${sh} ${Math.round(ss * 100)}% ${Math.round(sl * 100)}%)` }}\n title={toHex(hslToRgb(sh, ss, sl)).toUpperCase()}\n onClick={() => p.setRule(rule.id, { color: [sh, ss, sl] })} />\n ))}\n </div>\n </>\n )}\n\n <div style={{ marginTop: 16 }}>\n <LiveSlider\n label={t('ruleOpacity')} min={0} max={100} step={1}\n def={Math.round(rule.wallpaperOpacity * 100)} fmt={v => `${v}%`}\n onChange={v => p.setRule(rule.id, { wallpaperOpacity: v / 100 })} />\n <LiveSlider\n label={t('ruleBlur')} min={0} max={60} step={1}\n def={rule.blur} fmt={v => `${v}px`}\n onChange={v => p.setRule(rule.id, { blur: v })} />\n <p className=\"dab-hint\" style={{ marginTop: 10 }}>{t('ruleBlurHint')}</p>\n </div>\n </div>\n </div>\n </div>\n ) : null}\n\n <input ref={fileRef} type=\"file\" accept=\"image/*\" style={{ display: 'none' }} onChange={e => {\n const f = e.target.files?.[0]\n if (!f) return\n onFile(f)\n e.target.value = ''\n }} />\n\n {editorOpen && url !== null ? (\n <BgEditor\n url={url} state={rule.bgState} t={t} onClose={() => setEditorOpen(false)}\n onCommit={(z, x, y, iw, ih) => {\n p.setRule(rule.id, { bgState: { zoom: z, x, y, iw, ih } })\n setEditorOpen(false)\n }} />\n ) : null}\n\n {pickerOpen && url !== null ? (\n <ColorPicker url={url} t={t} onClose={() => setPickerOpen(false)}\n onPick={hsv => { onColor(hsv[0], hsv[1], hsv[2]); setPickerOpen(false) }} />\n ) : null}\n </section>\n )\n}\n","import { useRef } from 'react'\r\nimport type { CSSProperties } from 'react'\r\nimport type { ThemeSectionProps } from '../../types'\r\nimport { DownloadIcon, UploadIcon } from '../icons'\r\n\r\nexport function ProfilePage({ p, notify }: { p: ThemeSectionProps; notify: (msg: string, ok?: boolean) => void }) {\r\n const { t, exportTheme, importTheme } = p\r\n const importRef = useRef<HTMLInputElement>(null)\r\n\r\n const onImport = async (file: File) => {\r\n try {\r\n const ok = await importTheme(file)\r\n notify(ok ? t('importDone') : t('importFail'), ok)\r\n } catch {\r\n notify(t('importFail'), false)\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n <header className=\"dab-head dab-rise\" style={{ '--d': 0 } as CSSProperties}>\r\n <div className=\"dab-overline\">Profile</div>\r\n <h2 className=\"dab-h1\">{t('pageProfile')}</h2>\r\n <p className=\"dab-desc\">{t('descProfile')}</p>\r\n </header>\r\n\r\n <div className=\"dab-profile-grid\">\r\n <section className=\"dab-card dab-card-hover dab-rise\" style={{ '--d': 1 } as CSSProperties}>\r\n <div className=\"dab-profile-ico\"><DownloadIcon size={17} /></div>\r\n <div className=\"dab-profile-title\">{t('exportCardTitle')}</div>\r\n <div className=\"dab-profile-desc\">{t('exportCardDesc')}</div>\r\n <button type=\"button\" className=\"dab-btn dab-btn-primary\" onClick={() => { exportTheme(); notify(t('toastExportDone')) }}>\r\n <DownloadIcon size={14} />{t('exportTheme')}\r\n </button>\r\n </section>\r\n\r\n <section className=\"dab-card dab-card-hover dab-rise\" style={{ '--d': 2 } as CSSProperties}>\r\n <div className=\"dab-profile-ico\"><UploadIcon size={17} /></div>\r\n <div className=\"dab-profile-title\">{t('importCardTitle')}</div>\r\n <div className=\"dab-profile-desc\">{t('importCardDesc')}</div>\r\n <button type=\"button\" className=\"dab-btn\" onClick={() => importRef.current?.click()}>\r\n <UploadIcon size={14} />{t('importTheme')}\r\n </button>\r\n <input ref={importRef} type=\"file\" accept=\"application/json,.json\" style={{ display: 'none' }} onChange={e => {\r\n const f = e.target.files?.[0]; if (!f) return\r\n void onImport(f); e.target.value = ''\r\n }} />\r\n </section>\r\n </div>\r\n\r\n <footer className=\"dab-footer dab-rise\" style={{ '--d': 3 } as CSSProperties}>\r\n <span className=\"dab-footer-mono\">dsh-background-by-model</span>\r\n <span>{t('footerTag')}</span>\r\n </footer>\r\n </>\r\n )\r\n}\r\n","/**\n * dsh-background-by-model — settings section shell.\n *\n * The host renders this section only while the settings dialog is open and the\n * section is the active nav entry, so mounting IS being visible. The section is\n * rendered INLINE inside the host settings dialog's content column (the host\n * provides the modal chrome); the shell is a left nav rail + page body. Only\n * the transient toast escapes through a Portal (the shell's container-type\n * containment would otherwise capture its fixed positioning).\n */\nimport { useEffect, useRef, useState } from 'react'\nimport type { ThemeSectionProps } from '../types'\nimport { ensureUiCss, NAV_ITEM_H, NAV_GAP } from './ui.css'\nimport { SunIcon, LayersIcon, PhotoIcon, SlidersIcon, CheckIcon, AlertIcon } from './icons'\nimport { ErrorBoundary } from './ErrorBoundary'\nimport { Portal } from './Portal'\nimport { InterfacePage } from './pages/InterfacePage'\nimport { ModelBgPage } from './pages/ModelBgPage'\nimport { ProfilePage } from './pages/ProfilePage'\n\nexport function ThemeSection(props: ThemeSectionProps) {\n ensureUiCss()\n const { t } = props\n const [page, setPage] = useState(0)\n const [toast, setToast] = useState<{ msg: string; ok: boolean } | null>(null)\n const toastTimer = useRef<number | undefined>(undefined)\n\n useEffect(() => () => window.clearTimeout(toastTimer.current), [])\n\n const notify = (msg: string, ok = true): void => {\n setToast({ msg, ok })\n window.clearTimeout(toastTimer.current)\n toastTimer.current = window.setTimeout(() => setToast(null), 2600)\n }\n\n const pages = [\n { label: t('pageInterface'), Icon: LayersIcon, node: <InterfacePage p={props} /> },\n { label: t('pageModelBg'), Icon: PhotoIcon, node: <ModelBgPage p={props} notify={notify} /> },\n { label: t('pageProfile'), Icon: SlidersIcon, node: <ProfilePage p={props} notify={notify} /> },\n ]\n\n return (\n <ErrorBoundary t={t}>\n <div className=\"dab-root\">\n <div className=\"dab-shell\">\n <nav className=\"dab-nav\">\n <div className=\"dab-brand\">\n <div className=\"dab-brand-tile\"><SunIcon size={15} /></div>\n <div>\n <div className=\"dab-brand-name\">{t('nav')}</div>\n <div className=\"dab-brand-tag\">{t('brandTag')}</div>\n </div>\n </div>\n <div className=\"dab-nav-list\">\n <div className=\"dab-nav-ind\" style={{ transform: `translateY(${page * (NAV_ITEM_H + NAV_GAP)}px)` }} />\n {pages.map((pg, i) => (\n <button\n key={pg.label} type=\"button\"\n className={`dab-nav-item${i === page ? ' is-active' : ''}`}\n onClick={() => setPage(i)}>\n <pg.Icon size={16} />\n <span>{pg.label}</span>\n </button>\n ))}\n </div>\n </nav>\n\n <div className=\"dab-page\" key={page}>\n {pages[page].node}\n </div>\n </div>\n </div>\n\n {toast ? (\n <Portal>\n <div className=\"dab-toast\" role=\"status\">\n <span className={toast.ok ? 'dab-toast-ok' : 'dab-toast-err'}>\n {toast.ok ? <CheckIcon size={14} /> : <AlertIcon size={14} />}\n </span>\n <span>{toast.msg}</span>\n </div>\n </Portal>\n ) : null}\n </ErrorBoundary>\n )\n}\n","/**\n * dsh-background-by-model — browser half entry.\n *\n * Wires the plugin lifecycle: rule resolution against the current model,\n * wallpaper layer, theme skin, viewport watch, i18n, settings-section injection,\n * boot restore and watchdogs. The heavy lifting lives in the sibling modules\n * (state / modelbg / rpc / wallpaper / components).\n */\nimport { defineStore } from './runtime'\nimport type {\n Ctx, RpcResultLike, ThemeSectionProps, PartOpacities, PartBlurs, BgRule, FetchResult,\n} from './types'\nimport { NS, zh, en } from './i18n'\nimport {\n cfg, adoptConfig, imageOf, displayImageOf, setImage, newRule, nextSlot, nextRuleId, ruleById,\n normalizeRule, setActive, setModelLabel, activeRuleId, activeMatched, modelLabel, rWp, rRightbarOpacity,\n} from './state'\nimport {\n RPC_CHANNEL, initRpc, saveConfig, flushSave, persistConfig, loadPersisted,\n readImage, writeImage, deleteImage, fetchImageUrl, readDefaultModel,\n} from './rpc'\nimport {\n applyWp, teardownWp, applySettingsOverrides, applyRightbarOverrides, SETTINGS_STYLE_RULE, TRAJECTORY_STYLE_RULE,\n RIGHTBAR_STYLE_RULE, INPUT_BLUR_RULE, PLACEHOLDER_RULE, watchParts, watchThemeResets,\n} from './wallpaper'\nimport { genTokens, extractWallpaperColor } from './utils/color'\nimport { matchRule, watchModel } from './modelbg'\nimport { ThemeSection } from './components/ThemeSection'\nimport { SUN_PATHS } from './components/icons'\n\nexport const name = 'dsh-background-by-model'\nexport const inject = ['slots', 'locale', 'theme', 'connection']\n\nconst CUSTOM_ID = 'custom-color'\n\nexport function apply(ctx: Ctx): void {\n // Bind the dedicated `/dsh-background-by-model` RPC caller so the persistence\n // module can reach the node half's file-backed store.\n initRpc((endpoint, payload) =>\n ctx.connection.rpc.call(RPC_CHANNEL, endpoint, payload).then((res: any) => res as RpcResultLike | undefined)\n )\n\n // ── 1. Custom theme skin, driven by the ACTIVE rule's color ────────────────\n let customDispose: (() => void) | null = null\n // Trailing debounce for the theme-skin switch (see applyActive): a color drag\n // would otherwise dispose + re-register + re-activate the host theme on every\n // pointer move.\n let skinTimer: number | null = null\n const registerCustom = (h: number, s: number, l: number): void => {\n customDispose?.()\n try {\n const { colorScheme, tokens } = genTokens(h, s, l)\n customDispose = ctx.theme.register({ id: CUSTOM_ID, colorScheme, tokens })\n } catch {\n // A live registration from an earlier HMR apply pass cannot be torn down\n // here; keep it and activate it below. Without this the duplicate-id\n // throw would abort apply and skip the wallpaper/opacity restore.\n customDispose = null\n }\n // Only activate the custom theme if it is actually registered.\n if (ctx.theme.getTheme().themes.some(t => t.id === CUSTOM_ID)) {\n ctx.theme.setTheme(CUSTOM_ID)\n }\n }\n /** A rule without a saved color means \"follow the system theme\". */\n const dropCustom = (): void => {\n customDispose?.()\n customDispose = null\n try {\n if (ctx.theme.getTheme().preference === CUSTOM_ID) ctx.theme.setTheme('system')\n } catch {\n // A host build without a `system` preference keeps its own choice.\n }\n }\n ctx.effect(() => () => {\n if (skinTimer !== null) window.clearTimeout(skinTimer)\n customDispose?.()\n }, 'dsh-background-by-model: skin dispose')\n\n // ── 2. Gradient CSS (for custom dark themes) + static rules ────────────────\n const styleEl = document.createElement('style')\n styleEl.dataset.plugin = 'dsh-background-by-model'\n // The gradient only applies while applyCustomTokens marks the body with the\n // plugin's own dark-mode value, avoiding matches against the host's attribute.\n styleEl.textContent = `body[data-ds-dark-theme=\"dsh-background-by-model\"]::before{content:'';position:fixed;inset:0;z-index:-1;pointer-events:none;background:radial-gradient(ellipse 80% 60% at 50% 0%,rgba(255,255,255,0.03) 0%,transparent 60%)}${SETTINGS_STYLE_RULE}${TRAJECTORY_STYLE_RULE}${RIGHTBAR_STYLE_RULE}${INPUT_BLUR_RULE}` + PLACEHOLDER_RULE\n document.head.appendChild(styleEl)\n ctx.effect(() => () => { styleEl?.parentNode?.removeChild(styleEl) }, 'dsh-background-by-model: gradient')\n\n // ── 3. State store ────────────────────────────────────────────────────────\n let rev = 0\n let rulesRev = 0\n let modelText = ''\n let modelSource: 'session' | 'default' = 'default'\n // Why no per-session model is available yet ('waiting' until the sessions\n // service mounts, then the failing hop, then 'fallback'). Shown by the status\n // readout so a dead hop is never mistaken for a real model.\n let modelNote = 'waiting'\n // Text + source last acted on, so the watch's forced re-emits (and the 1.5 s\n // safety poll) cannot re-run the whole apply while nothing changed.\n let modelKey = '\\u0000'\n const store = defineStore({\n init: () => ({\n url: null as string | null,\n rev: -1,\n rulesRev: -1,\n model: '',\n modelSource: 'session' as 'session' | 'default',\n modelNote: 'waiting',\n activeRuleId: null as string | null,\n matched: false,\n }),\n actions: {\n sync: (d: any, url: string | null, r: number, rr: number, model: string, source: 'session' | 'default', note: string, id: string | null, matched: boolean) => {\n if (r > d.rev) { d.url = url; d.rev = r }\n if (rr > d.rulesRev) d.rulesRev = rr\n d.model = model\n d.modelSource = source\n d.modelNote = note\n d.activeRuleId = id\n d.matched = matched\n },\n },\n })\n let bound: { sync: (...a: any[]) => void } | null = null\n const sync = (): void => {\n rev++\n bound?.sync(rWp(), rev, rulesRev, modelLabel !== '' ? modelLabel : modelText, modelSource, modelNote, activeRuleId, activeMatched)\n }\n\n /** Resolve the active rule for the current model and repaint everything. */\n const applyActive = (): void => {\n const { rule, matched } = matchRule(cfg.rules, modelText)\n setActive(rule === null ? null : rule.id, matched)\n const color = rule === null ? null : rule.color\n // The skin is a host-visible switch (dispose + register + activate) and is\n // batched; the wallpaper and tokens below land immediately either way.\n if (skinTimer !== null) window.clearTimeout(skinTimer)\n skinTimer = window.setTimeout(() => {\n skinTimer = null\n if (color === null) dropCustom()\n else registerCustom(color[0], color[1], color[2])\n }, 60)\n applyWp()\n sync()\n }\n\n // ── 4. First paint + the AppFrame watch ───────────────────────────────────\n applyWp()\n sync()\n watchParts()\n\n // ── 5. Model watch ────────────────────────────────────────────────────────\n // The session's own durable model selection is the authority; the host default\n // is only a last resort, and the settings page labels it as such.\n const offModel = watchModel(ctx, (text, label, source, note) => {\n const key = `${text}\\u0001${source}\\u0001${note}`\n if (key === modelKey) return\n const textChanged = text !== modelText\n modelKey = key\n modelText = text\n modelSource = source\n modelNote = note\n setModelLabel(label !== '' ? label : text)\n // A note-only change (e.g. still waiting for the sessions service) must\n // refresh the readout without repainting the whole interface.\n if (textChanged) applyActive()\n else sync()\n })\n ctx.effect(() => () => offModel(), 'dsh-background-by-model: model watch')\n // A trimmed client (or one whose session is not materialized yet) leaves the\n // per-session sources empty; the host's default model is a coarse but honest\n // stand-in, tagged so the UI never claims it is this session's selection.\n void (async () => {\n if (modelText !== '') return\n const fallback = await readDefaultModel()\n if (fallback !== null && modelText === '') {\n modelKey = `${fallback}\\u0001default\\u0001fallback`\n modelText = fallback\n modelSource = 'default'\n modelNote = 'fallback'\n setModelLabel(fallback)\n applyActive()\n }\n })()\n\n // ── 6. Boot restore ───────────────────────────────────────────────────────\n void (async () => {\n const persisted = await loadPersisted()\n if (persisted !== null) {\n adoptConfig(persisted.config)\n const slots = Array.from(new Set([...persisted.slots, ...cfg.rules.map(r => r.slot)]))\n // The active rule's bytes paint first; the remaining slots stream in after\n // so a large multi-rule setup never delays the first frame.\n const priority = matchRule(cfg.rules, modelText).rule\n const first = priority === null ? null : priority.slot\n const order = first === null ? slots : [first, ...slots.filter(s => s !== first)]\n for (const slot of order) {\n if (imageOf(slot) !== null) continue\n const url = await readImage(slot)\n if (url !== null) setImage(slot, url)\n if (slot === first) applyActive()\n }\n }\n applyActive()\n })()\n\n ctx.effect(() => () => { teardownWp() }, 'dsh-background-by-model: wp cleanup')\n\n ctx.effect(() => ctx.on('theme/change', () => {\n // The custom theme's preference lives in memory, so a host adoption can\n // silently reset it; re-assert it while the active rule has a color. Guard\n // on registry presence — registerCustom disposes the old skin first, so\n // during that transient the registry lacks CUSTOM_ID.\n if (activeRuleColor() !== null) {\n const snapshot = ctx.theme.getTheme()\n if (snapshot.preference !== CUSTOM_ID && snapshot.themes.some(t => t.id === CUSTOM_ID)) {\n ctx.theme.setTheme(CUSTOM_ID)\n }\n }\n applyWp()\n }), 'dsh-background-by-model: theme change')\n\n // Wallpaper placement is computed in absolute viewport pixels, so watch the\n // viewport itself: a fixed inset:0 sentinel's box always equals the viewport,\n // so a ResizeObserver on it catches any viewport change (window resize,\n // monitor moves, panel splitters, zoom); a resolution media query catches\n // DPI-only moves. Re-applies are coalesced to one per animation frame.\n let frame = 0\n const applySoon = (): void => {\n if (frame !== 0) return\n frame = requestAnimationFrame(() => { frame = 0; applyWp() })\n }\n const sentinel = document.createElement('div')\n sentinel.style.cssText = 'position:fixed;inset:0;pointer-events:none;visibility:hidden'\n document.body.append(sentinel)\n const viewportObserver = new ResizeObserver(applySoon)\n viewportObserver.observe(sentinel)\n const dprQuery = window.matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`)\n dprQuery.addEventListener('change', applySoon)\n ctx.effect(() => () => {\n viewportObserver.disconnect()\n dprQuery.removeEventListener('change', applySoon)\n sentinel.remove()\n }, 'dsh-background-by-model: viewport watch')\n\n // ── 7. Locale ─────────────────────────────────────────────────────────────\n ctx.effect(() => ctx.locale.register(NS, { zh, en }) as any, 'dsh-background-by-model: i18n')\n\n /**\n * The automatic half of \"extract from image\": fill a rule's theme color from\n * the picture it just received, but only while the rule has no color at all —\n * a color the user picked (or a previous extraction produced) is never\n * overwritten, so this cannot fight a deliberate choice.\n *\n * The decode is asynchronous, so the \"still empty?\" question is asked AGAIN on\n * arrival: a color chosen while it ran must win over the one being computed.\n */\n const maybeAutoExtract = async (id: string): Promise<void> => {\n if (!cfg.autoExtract) return\n const rule = ruleById(id)\n if (rule === null || rule.color !== null) return\n const url = displayImageOf(rule.slot)\n if (url === null) return\n let hsl: [number, number, number] | null = null\n try { hsl = await extractWallpaperColor(url, rule.bgState) } catch { hsl = null }\n if (hsl === null) return\n const current = ruleById(id)\n if (current === null || current.color !== null) return\n current.color = hsl\n rulesRev++\n saveConfig()\n if (id === activeRuleId) applyActive()\n else sync()\n }\n\n // ── 8. Section injection ──────────────────────────────────────────────────\n const sectionInject = (actions: { sync: (...a: any[]) => void }): Omit<ThemeSectionProps, 'useStore'> => {\n bound = actions\n sync()\n return {\n t: ctx.locale.bind(NS),\n imageOf: (slot: string) => displayImageOf(slot),\n addRule: (): string => {\n const rule = newRule(nextRuleId(), nextSlot())\n cfg.rules.push(rule)\n rulesRev++\n persistConfig()\n applyActive()\n return rule.id\n },\n removeRule: (id: string): void => {\n const idx = cfg.rules.findIndex(r => r.id === id)\n if (idx < 0) return\n const [rule] = cfg.rules.splice(idx, 1)\n if (rule !== undefined && !cfg.rules.some(r => r.slot === rule.slot)) {\n setImage(rule.slot, null)\n void deleteImage(rule.slot)\n }\n rulesRev++\n persistConfig()\n applyActive()\n },\n moveRule: (id: string, dir: -1 | 1): void => {\n const idx = cfg.rules.findIndex(r => r.id === id)\n const to = idx + dir\n if (idx < 0 || to < 0 || to >= cfg.rules.length) return\n const [rule] = cfg.rules.splice(idx, 1)\n cfg.rules.splice(to, 0, rule!)\n rulesRev++\n persistConfig()\n applyActive()\n },\n setRule: (id: string, patch: Partial<BgRule>): void => {\n const rule = ruleById(id)\n if (rule === null) return\n Object.assign(rule, patch)\n const normalized = normalizeRule(rule)\n if (normalized !== null) Object.assign(rule, normalized)\n rulesRev++\n // Text/color/slider edits arrive per keystroke and per pointer move, so\n // the write is coalesced; structural edits below stay immediate.\n saveConfig()\n if (id === activeRuleId) applyActive()\n else sync()\n },\n setRuleImage: (id: string, dataUrl: string | null): void => {\n const rule = ruleById(id)\n if (rule === null) return\n setImage(rule.slot, dataUrl)\n void (dataUrl === null ? deleteImage(rule.slot) : writeImage(rule.slot, dataUrl))\n if (id === activeRuleId) applyActive()\n else sync()\n // A rule that has never been themed should simply come out themed; an\n // explicit color (or a cleared one the user set on purpose) is left be.\n if (dataUrl !== null) void maybeAutoExtract(id)\n },\n setRuleImageFromUrl: async (id: string, url: string): Promise<FetchResult> => {\n const rule = ruleById(id)\n if (rule === null) return { ok: false, error: 'unknown rule' }\n const res = await fetchImageUrl(rule.slot, url)\n if (res.ok) {\n setImage(rule.slot, res.dataUrl ?? null)\n if (id === activeRuleId) applyActive()\n else sync()\n void maybeAutoExtract(id)\n }\n return res\n },\n extractColor: async (id: string): Promise<boolean> => {\n const rule = ruleById(id)\n if (rule === null) return false\n const url = displayImageOf(rule.slot)\n if (url === null) return false\n const hsl = await extractWallpaperColor(url, rule.bgState)\n if (hsl === null) return false\n rule.color = hsl\n rulesRev++\n saveConfig()\n if (id === activeRuleId) applyActive()\n else sync()\n return true\n },\n setOps: (ops: PartOpacities): void => { cfg.opacities = ops; applyWp(); sync(); saveConfig() },\n setBlurs: (blurs: PartBlurs): void => { cfg.blurs = blurs; applyWp(); sync(); saveConfig() },\n setSop: (v: number): void => { cfg.settingsOpacity = v; applySettingsOverrides(v); saveConfig() },\n // The file-preview panel owns its surface from the first drag on; a null\n // hands it back to the main-background slider.\n setRightbarOpacity: (v: number | null): void => {\n cfg.rightbarOpacity = v\n applyRightbarOverrides(rRightbarOpacity())\n saveConfig()\n },\n setAutoExtract: (v: boolean): void => { cfg.autoExtract = v; saveConfig(); sync() },\n // Download every rule plus its image as one JSON file.\n exportTheme: (): void => {\n const images: Record<string, string> = {}\n for (const rule of cfg.rules) {\n const url = imageOf(rule.slot)\n if (url !== null) images[rule.slot] = url\n }\n const payload = {\n version: 3,\n exportedAt: new Date().toISOString(),\n config: cfg,\n images,\n }\n const blob = new Blob([JSON.stringify(payload, null, 2)], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = 'dsh-background-by-model-theme.json'\n a.click()\n URL.revokeObjectURL(url)\n },\n // Import: replaces the whole rule set and every rule image.\n importTheme: async (file: File): Promise<boolean> => {\n try {\n const data: unknown = JSON.parse(await file.text())\n if (!data || typeof data !== 'object') return false\n const d = data as { version?: number; config?: unknown; images?: unknown }\n if (typeof d.config !== 'object' || d.config === null) return false\n adoptConfig(d.config)\n const incoming = (d.images ?? {}) as Record<string, unknown>\n const keep = new Set<string>()\n for (const rule of cfg.rules) {\n keep.add(rule.slot)\n const raw = incoming[rule.slot]\n if (typeof raw === 'string' && /^data:image\\//.test(raw)) {\n setImage(rule.slot, raw)\n void writeImage(rule.slot, raw)\n } else {\n setImage(rule.slot, null)\n void deleteImage(rule.slot)\n }\n }\n // Slots the imported config no longer references are released.\n for (const slot of Object.keys(incoming)) {\n if (!keep.has(slot) && /^[A-Za-z0-9_-]{1,32}$/.test(slot)) void deleteImage(slot)\n }\n persistConfig()\n applyActive()\n return true\n } catch {\n return false\n }\n },\n }\n }\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section', id: 'dsh-background-by-model', order: 35,\n label: () => ctx.locale.bind(NS)('nav'),\n locale: NS, store, inject: sectionInject,\n }, ThemeSection as any))\n\n // ── 9. Settings-nav icon ──────────────────────────────────────────────────\n // The harness derives the nav glyph from the section id (unknown ids fall back\n // to the settings gear) with no plugin hook, so patch the mounted nav cell in\n // place — find the cell whose label matches this section's nav text and swap\n // its svg for the sun glyph.\n const navLabel = (): string => ctx.locale.bind(NS)('nav')\n const applyNavIcon = (): void => {\n const panel = document.querySelector<HTMLElement>('[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby]')\n const nav = panel?.querySelector('nav')\n if (!nav) return\n const target = navLabel()\n for (const cell of Array.from(nav.querySelectorAll('button'))) {\n const label = cell.querySelector('span')\n if (label && label.textContent?.trim() === target) {\n const svg = cell.querySelector('svg')\n if (svg && svg.dataset.dshAnyIcon !== '1') {\n const sun = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n sun.setAttribute('width', '16')\n sun.setAttribute('height', '16')\n sun.setAttribute('viewBox', '0 0 16 16')\n sun.setAttribute('fill', 'none')\n sun.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\n sun.dataset.dshAnyIcon = '1'\n sun.innerHTML = SUN_PATHS\n svg.replaceWith(sun)\n }\n return\n }\n }\n }\n let navIconObserver: MutationObserver | null = null\n const watchNavIcon = (): void => {\n if (navIconObserver !== null || typeof MutationObserver === 'undefined') return\n navIconObserver = new MutationObserver(records => {\n // React only when the settings panel (or its nav) is (re)created, so\n // chat-content mutations don't trigger a scan.\n const relevant = records.some(r => {\n for (const n of r.addedNodes) {\n if (n.nodeType !== 1) continue\n const el = n as Element\n if (el.matches?.('[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby]') || el.querySelector?.('[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby]')) return true\n }\n return false\n })\n if (relevant) applyNavIcon()\n })\n navIconObserver.observe(document.body, { childList: true, subtree: true })\n applyNavIcon()\n }\n watchNavIcon()\n ctx.effect(() => () => { navIconObserver?.disconnect(); navIconObserver = null }, 'dsh-background-by-model: nav icon watch')\n\n // ── 10. Deferred boot restore ─────────────────────────────────────────────\n // The theme service and the host settings scope settle asynchronously after\n // this apply, so the synchronous restore can be observed mid-flight — a late\n // host adoption resets the preference, or the presenter re-applies over our\n // overrides. Re-running the restore a few ticks later guarantees the saved\n // records land.\n const restoreSaved = (): void => {\n const color = activeRuleColor()\n if (color !== null) {\n const snapshot = ctx.theme.getTheme()\n if (!snapshot.themes.some(t => t.id === CUSTOM_ID)) {\n // Theme missing (host adoption dropped it): re-register + activate.\n registerCustom(color[0], color[1], color[2])\n } else if (snapshot.preference !== CUSTOM_ID) {\n // Theme present but inactive: just re-assert the preference. Calling\n // registerCustom here would dispose + re-create the skin, flashing the\n // interface back to the system theme for a frame on every boot.\n ctx.theme.setTheme(CUSTOM_ID)\n }\n }\n applyWp()\n }\n const restoreTimers = [300, 1500].map(delay => window.setTimeout(restoreSaved, delay))\n ctx.effect(() => () => { restoreTimers.forEach(id => window.clearTimeout(id)) }, 'dsh-background-by-model: boot restore')\n\n // ── 11. Theme watchdog ────────────────────────────────────────────────────\n // The theme service keeps only built-in preferences in memory, so ANY\n // host-scope adoption can silently drop the custom theme — reverting the label\n // colors and the inner surfaces to the system palette. While the active rule\n // carries a color, re-register and re-assert on a slow interval.\n const watchdogId = window.setInterval(() => {\n const color = activeRuleColor()\n if (color === null) return\n const snapshot = ctx.theme.getTheme()\n let changed = false\n if (!snapshot.themes.some(t => t.id === CUSTOM_ID)) {\n registerCustom(color[0], color[1], color[2])\n changed = true\n } else if (snapshot.preference !== CUSTOM_ID) {\n ctx.theme.setTheme(CUSTOM_ID)\n changed = true\n }\n if (changed) applyWp()\n }, 1000)\n ctx.effect(() => () => { window.clearInterval(watchdogId) }, 'dsh-background-by-model: theme watchdog')\n\n // ── 12. Theme-reset watchdog ──────────────────────────────────────────────\n const disposeThemeResets = watchThemeResets()\n ctx.effect(() => () => { disposeThemeResets() }, 'dsh-background-by-model: theme resets watch')\n\n // ── 13. Flush pending writes on page hide ─────────────────────────────────\n const onPageHide = (): void => flushSave()\n window.addEventListener('pagehide', onPageHide)\n ctx.effect(() => () => window.removeEventListener('pagehide', onPageHide), 'dsh-background-by-model: pagehide flush')\n}\n\n/** Color of the currently active rule, or null when it uses the system theme. */\nfunction activeRuleColor(): [number, number, number] | null {\n if (activeRuleId === null) return null\n const rule = ruleById(activeRuleId)\n return rule === null ? null : rule.color\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["BG_MODES","clamp","clamp","never","Component","useState","createPortal","useRef","memo","useRef","useState","useCallback","useState","useRef","toHex","useRef","useState","useCallback","useState","useRef","useCallback","useState","useRef","useRef","useState","useCallback","useState","useRef"],"sources":["../src/client/runtime.ts","../src/client/i18n.ts","../src/schema.ts","../src/client/state.ts","../src/client/rpc.ts","../src/client/utils/color.ts","../src/client/wallpaper.ts","../src/client/modelbg.ts","../src/host-contracts.ts","../src/client/judge.ts","../src/client/build-info.ts","../src/client/components/ui.css.ts","../src/client/components/icons.tsx","../src/client/components/ErrorBoundary.tsx","../src/client/components/Portal.tsx","../src/client/components/LiveSlider.tsx","../src/client/components/pages/InterfacePage.tsx","../src/client/utils/image.ts","../src/client/components/ColorWheel.tsx","../src/client/components/ColorInputs.tsx","../src/client/components/ColorPicker.tsx","../src/client/components/BgEditor.tsx","../src/client/components/pages/ModelBgPage.tsx","../src/client/components/pages/ProfilePage.tsx","../src/client/components/pages/HostPage.tsx","../src/client/components/ThemeSection.tsx","../src/client/index.tsx"],"sourcesContent":["/**\r\n * Harness-version-agnostic access to the client runtime.\r\n *\r\n * Before dsh 0.1.2 the store primitive lived on the composite package\r\n * `@deepseek-ai/dsh-client-runtime` (the `/client` subpath). The new harness\r\n * split it into `@deepseek-ai/dsh-client-store`. Both specifiers are kept\r\n * external so they resolve against the host client-module table; a missing\r\n * table entry on one side throws (the \"missed the module table\" error) and is\r\n * caught, falling through to the other package. This lets one bundle load on\r\n * both the old npm release and the new source.\r\n *\r\n * The host's synchronous `require` is injected by the loader into the bundle\r\n * factory; tsdown keeps these two bare specifiers as external CJS requires so\r\n * they bind to that factory `require`.\r\n */\r\n\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\ninterface StoreModule {\r\n defineStore: any\r\n}\r\n\r\nfunction resolveStore(): StoreModule {\r\n try {\r\n // New harness (dsh >= 0.1.2): dedicated store package after the runtime\r\n // was split. Missing here means the loader table has no such row → throw.\r\n return require('@deepseek-ai/dsh-client-store') as StoreModule\r\n } catch {\r\n /* fall through to the legacy composite runtime below */\r\n }\r\n // Legacy harness (npm release): composite runtime, /client subpath.\r\n return require('@deepseek-ai/dsh-client-runtime/client') as StoreModule\r\n}\r\n\r\nexport const defineStore: any = resolveStore().defineStore","export const NS = 'settings.anyBg'\r\n\r\nexport const zh: Record<string, string> = {\r\n nav: '模型背景', brandTag: '按模型换背景', close: '关闭',\r\n pageInterface: '界面', pageModelBg: '模型背景', pageProfile: '配置', pageHostCheck: '宿主自检',\r\n descInterface: '为主界面的各个区域单独调节透明度与模糊,营造空间层次感。这里的设置对所有模型生效',\r\n descModelBg: '每条规则 = 一个匹配串 + 一套背景外观。切换模型时,从上往下找第一条匹配串出现在模型名里的规则;都没中就使用第 1 条',\r\n descProfile: '把当前全部规则连同图片导出备份,或从文件一键恢复',\r\n descHostCheck: '逐条检查本插件依赖的宿主接口在这个 dsh 版本上是否还在:会话与模型服务、它着色的界面元素、以及被重新发出的设计令牌。红色那一行就是坏掉的地方',\r\n\r\n uiTitle: '主界面',\r\n uiOpacity: '透明度', uiBlur: '模糊度',\r\n uiOpacityBg: '主背景', uiOpacitySide: '左侧栏', uiOpacityCard: '卡片与菜单面板', uiOpacityInput: '输入框与控件',\r\n uiSop: '设置界面透明度', uiChatRegion: '对话文本框', uiTrajectory: '轨迹页',\r\n uiPreview: '右侧栏',\r\n\r\n // Only the diagnostics survive: the model/rule readout they used to sit under\r\n // is gone (the match tester at the top of the page answers the same question).\r\n statusUnknownHint: '检测不到时一律使用第 1 条可用规则;切换一次模型或稍等片刻会自动重试',\r\n statusSourceDefaultHint: '只读到宿主默认模型,它不是本会话当前选择的模型;本会话的模型选择可用后会自动纠正',\r\n statusNoteNoService: '仍未拿到会话服务(会话控制器晚于本插件加载),正在自动重试',\r\n statusNoteNoSession: '会话服务已就绪,但还没有当前会话 id',\r\n statusNoteNoProjection: '拿不到本会话的模型选择投影(binding / projections 不可用)',\r\n statusNoteEmptySelection: '本会话的模型选择投影还没有值(切一次模型即可写入)',\r\n\r\n rulesTitle: '规则列表',\r\n rulesHint: '从上到下即为优先级。规则 1 同时兼任兜底:所有匹配串都没命中时使用它',\r\n tryoutTitle: '匹配试跑',\r\n tryoutPlaceholder: '输入模型名,如 deepseek-flash',\r\n tryoutUseCurrent: '填入当前模型',\r\n tryoutHit: '命中规则',\r\n tryoutFallback: '无匹配 · 走兜底规则',\r\n tryoutNone: '没有可用规则(规则需要启用并有图片)',\r\n tryoutEmpty: '输入模型名即可试跑',\r\n autoExtract: '选图后自动取主题色',\r\n autoExtractHint: '只在规则还没有颜色时自动取色,绝不覆盖你手动选的颜色',\r\n ruleAdd: '新增规则',\r\n ruleFallbackBadge: '兜底',\r\n ruleMatchLabel: '匹配串',\r\n ruleMatchPlaceholder: '如 flash / glm(忽略大小写,留空则不参与匹配)',\r\n ruleEnabled: '启用',\r\n ruleUp: '上移', ruleDown: '下移', ruleRemove: '删除规则',\r\n ruleNoImage: '尚未选择图片',\r\n rulePickImage: '选择图片', ruleChangeImage: '更换图片',\r\n ruleFromUrl: '从网址', ruleUrlPlaceholder: '粘贴图片网址 https://…',\r\n ruleUrlApply: '应用', ruleUrlCancel: '取消', ruleUrlApplying: '加载中…',\r\n ruleUrlBadHttp: '仅支持 http/https 图片网址', ruleUrlFail: '获取图片失败',\r\n ruleImageRemove: '移除图片',\r\n ruleEmptyHint: '这条规则还没有图片,不会被匹配到,也不会作为兜底',\r\n ruleColor: '主题色',\r\n ruleColorNone: '系统主题',\r\n ruleColorNoneHint: '未设颜色时跟随系统主题',\r\n ruleColorExtract: '从本图提取',\r\n ruleLayout: '布局模式',\r\n ruleFraming: '取景',\r\n ruleFramingEdit: '编辑位置',\r\n ruleFramingLocked: '仅「适应」模式可编辑位置',\r\n ruleOpacity: '背景透明度',\r\n ruleBlur: '背景模糊',\r\n ruleBlurHint: '背景模糊作用于壁纸层;界面页里的模糊作用于界面各区域,两者互不影响',\r\n\r\n colorHint: '在色轮外圈选择色相,在内部方形中调整饱和度和明度;双击滑块可恢复默认值',\r\n swatchTitle: '灵感色板',\r\n hexCaption: '当前颜色',\r\n\r\n bgModeFit: '适应', bgModeFill: '填充', bgModeStretch: '拉伸', bgModeTile: '平铺', bgModeCenter: '居中',\r\n editorTitle: '背景编辑器', editorHint: '拖动移动画面,滚轮缩放大小',\r\n editorCommit: '确认', editorCancel: '取消', editorReset: '重置',\r\n\r\n extractColor: '从图片提取主题色', extracting: '取色中…',\r\n extractNoWp: '请先为该规则选择图片',\r\n extractDone: '已应用图片配色',\r\n extractFail: '未在这张图里找到鲜明的颜色,请换一张',\r\n eyedropper: '从图片取色',\r\n pickerTitle: '从图片取色',\r\n pickerHint: '移动鼠标预览颜色,点击图片选取为主题色',\r\n pickerClose: '关闭',\r\n\r\n crashTitle: '界面渲染出错',\r\n crashDesc: '设置面板遇到问题,点击下方按钮重置后重试',\r\n crashReset: '重置面板',\r\n\r\n exportTheme: '导出配置', importTheme: '导入配置',\r\n exportCardTitle: '导出配置',\r\n exportCardDesc: '把全部规则、每条规则的颜色/布局/透明度/模糊与图片打包为 dsh-background-by-model-theme.json',\r\n importCardTitle: '导入配置',\r\n importCardDesc: '从之前导出的 JSON 文件一键恢复全部规则(会覆盖当前规则与图片)',\r\n toastExportDone: '配置文件已开始下载',\r\n importDone: '已导入配置',\r\n importFail: '导入失败,文件格式不正确',\r\n footerTag: '按模型换背景插件',\r\n\r\n // ── 宿主自检 ──────────────────────────────────────────────────────────────\r\n hostAllOk: '这个 dsh 版本上一切正常',\r\n hostPartial: '有东西坏掉了',\r\n hostBroken: '插件依赖的接口全都不见了',\r\n hostUnknown: '还读不到结果',\r\n hostSummary: '{pass} 项正常 · {fail} 项失效 · {skip} 项当前无法观察',\r\n hostRunning: '检查中…',\r\n hostRerun: '重新检查',\r\n hostCopy: '复制诊断报告',\r\n hostCopied: '诊断报告已复制',\r\n hostCopyFail: '复制失败,浏览器拒绝了剪贴板访问',\r\n hostPass: '正常',\r\n hostFail: '失效',\r\n hostNa: '未观察',\r\n hostInfo: '仅记录',\r\n hostPlugin: '插件',\r\n hostPluginFloor: '要求 dsh',\r\n hostDiskScan: '安装文件',\r\n hostUnreadable: '未读到',\r\n hostModel: '当前模型',\r\n hostModelNone: '未检测到',\r\n hostExpectedIn: '应该还在',\r\n hostUsedBy: '本插件读取处',\r\n hostBelowFloor: '当前 dsh 版本低于本插件声明的下限,宿主可能已经拒绝加载它。升级 dsh,或用 dsh plugin allow-version 明确放行。',\r\n hostDiskFailures: '有 {n} 条契约在安装目录里已经找不到对应的宿主代码 —— 说明它们被改名或删掉了,而不是这次没观察到。',\r\n hostHint: '灰色的「未观察」不是故障:设置弹窗打开时看不到对话页,没开过文件时右侧栏也不在 DOM 里。想让它变绿,把对应界面打开再看一次。',\r\n}\r\n\r\nexport const en: Record<string, string> = {\r\n nav: 'Model background', brandTag: 'Per-model wallpaper', close: 'Close',\r\n pageInterface: 'Interface', pageModelBg: 'Model background', pageProfile: 'Profile', pageHostCheck: 'Host check',\r\n descInterface: 'Tune opacity and blur per surface to build depth. These settings are global and apply to every model',\r\n descModelBg: 'Each rule is a match string plus one look. On a model switch the list is scanned top-down for the first match string contained in the model name; if nothing hits, rule 1 is used',\r\n descProfile: 'Back up every rule together with its image, or restore one from a file',\r\n descHostCheck: 'Checks every host interface this plugin depends on against the dsh build you are running: the session and model services, the elements it paints, and the design tokens it re-emits. The red line is what broke',\r\n\r\n uiTitle: 'Interface',\r\n uiOpacity: 'Opacity', uiBlur: 'Blur',\r\n uiOpacityBg: 'Main background', uiOpacitySide: 'Left panel', uiOpacityCard: 'Cards & menus', uiOpacityInput: 'Input & controls',\r\n uiSop: 'Settings interface opacity', uiChatRegion: 'Conversation text frame', uiTrajectory: 'Trajectory view',\r\n uiPreview: 'Right panel',\r\n\r\n // Only the diagnostics survive: the model/rule readout they used to sit under\r\n // is gone (the match tester at the top of the page answers the same question).\r\n statusUnknownHint: 'Without a detected model rule 1 is always used; switching the model once or waiting a moment retries automatically',\r\n statusSourceDefaultHint: 'Only the host-wide default model could be read — that is not necessarily this session\\'s selection. It self-corrects once this session\\'s model selection is available.',\r\n statusNoteNoService: 'The sessions service is not available yet (the session controller loads after this plugin); retrying automatically',\r\n statusNoteNoSession: 'The sessions service is up but reports no current session yet',\r\n statusNoteNoProjection: 'This session\\'s model-selection projection is unreachable (no binding / projections)',\r\n statusNoteEmptySelection: 'The model-selection projection exists but carries no value yet (selecting a model once writes it)',\r\n\r\n rulesTitle: 'Rules',\r\n rulesHint: 'Top to bottom is the priority. Rule 1 doubles as the fallback — it is used when no match string hits',\r\n tryoutTitle: 'Match test',\r\n tryoutPlaceholder: 'Type a model name, e.g. deepseek-flash',\r\n tryoutUseCurrent: 'Use current model',\r\n tryoutHit: 'matches rule',\r\n tryoutFallback: 'no match · fallback rule',\r\n tryoutNone: 'No usable rule (a rule needs to be enabled and have an image)',\r\n tryoutEmpty: 'Type a model name to test the list',\r\n autoExtract: 'Extract the theme color when an image is chosen',\r\n autoExtractHint: 'Only fills a rule that has no color yet — a color you picked is never overwritten',\r\n ruleAdd: 'Add rule',\r\n ruleFallbackBadge: 'fallback',\r\n ruleMatchLabel: 'Match',\r\n ruleMatchPlaceholder: 'e.g. flash / glm (case-insensitive, empty never matches)',\r\n ruleEnabled: 'Enabled',\r\n ruleUp: 'Move up', ruleDown: 'Move down', ruleRemove: 'Remove rule',\r\n ruleNoImage: 'No image yet',\r\n rulePickImage: 'Choose image', ruleChangeImage: 'Replace image',\r\n ruleFromUrl: 'From URL', ruleUrlPlaceholder: 'Paste an image URL https://…',\r\n ruleUrlApply: 'Apply', ruleUrlCancel: 'Cancel', ruleUrlApplying: 'Loading…',\r\n ruleUrlBadHttp: 'Only http/https image URLs are supported', ruleUrlFail: 'Could not fetch the image',\r\n ruleImageRemove: 'Remove image',\r\n ruleEmptyHint: 'This rule has no image — it can neither match nor serve as the fallback',\r\n ruleColor: 'Theme color',\r\n ruleColorNone: 'System theme',\r\n ruleColorNoneHint: 'Without a color this rule follows the system theme',\r\n ruleColorExtract: 'Extract from image',\r\n ruleLayout: 'Layout mode',\r\n ruleFraming: 'Framing',\r\n ruleFramingEdit: 'Edit position',\r\n ruleFramingLocked: 'Position editing is only available in Fit mode',\r\n ruleOpacity: 'Background opacity',\r\n ruleBlur: 'Background blur',\r\n ruleBlurHint: 'Background blur affects the wallpaper layer; the blur on the Interface page affects interface surfaces — they are independent',\r\n\r\n colorHint: 'Pick hue on the outer ring, adjust saturation & lightness in the square; double-click a slider to reset',\r\n swatchTitle: 'Quick swatches',\r\n hexCaption: 'Current color',\r\n\r\n bgModeFit: 'Fit', bgModeFill: 'Fill', bgModeStretch: 'Stretch', bgModeTile: 'Tile', bgModeCenter: 'Center',\r\n editorTitle: 'Background editor', editorHint: 'Drag to move, scroll to zoom',\r\n editorCommit: 'Confirm', editorCancel: 'Cancel', editorReset: 'Reset',\r\n\r\n extractColor: 'Extract from image', extracting: 'Extracting…',\r\n extractNoWp: 'Choose an image for this rule first',\r\n extractDone: 'Image colors applied',\r\n extractFail: 'No vivid color found in this image, try another',\r\n eyedropper: 'Eyedropper',\r\n pickerTitle: 'Pick from image',\r\n pickerHint: 'Hover to preview, click to pick as the theme color',\r\n pickerClose: 'Close',\r\n\r\n crashTitle: 'Section crashed',\r\n crashDesc: 'The panel hit an error. Reset below to recover.',\r\n crashReset: 'Reset panel',\r\n\r\n exportTheme: 'Export', importTheme: 'Import',\r\n exportCardTitle: 'Export profile',\r\n exportCardDesc: 'Bundle every rule — color, layout, opacity, blur — and its image into dsh-background-by-model-theme.json',\r\n importCardTitle: 'Import profile',\r\n importCardDesc: 'Restore every rule and image from a previously exported JSON file (replaces the current set)',\r\n toastExportDone: 'Export started',\r\n importDone: 'Profile imported',\r\n importFail: 'Import failed — invalid file',\r\n footerTag: 'Per-model wallpaper plugin',\r\n\r\n // ── host self-check ───────────────────────────────────────────────────────\r\n hostAllOk: 'Everything holds on this dsh build',\r\n hostPartial: 'Something broke',\r\n hostBroken: 'None of the interfaces this plugin needs are there',\r\n hostUnknown: 'No result yet',\r\n hostSummary: '{pass} ok · {fail} broken · {skip} not observable right now',\r\n hostRunning: 'Checking…',\r\n hostRerun: 'Check again',\r\n hostCopy: 'Copy diagnostics',\r\n hostCopied: 'Diagnostics copied',\r\n hostCopyFail: 'Copy failed — the browser denied clipboard access',\r\n hostPass: 'ok',\r\n hostFail: 'broken',\r\n hostNa: 'n/a',\r\n hostInfo: 'note',\r\n hostPlugin: 'Plugin',\r\n hostPluginFloor: 'needs dsh',\r\n hostDiskScan: 'Installed files',\r\n hostUnreadable: 'unreadable',\r\n hostModel: 'Current model',\r\n hostModelNone: 'not detected',\r\n hostExpectedIn: 'Should still be in',\r\n hostUsedBy: 'Read by',\r\n hostBelowFloor: 'This dsh is older than the floor this plugin declares, so the host may already refuse to load it. Update dsh, or grant it explicitly with dsh plugin allow-version.',\r\n hostDiskFailures: '{n} contract(s) can no longer be found in the installed host code — they were renamed or removed, this is not just \"not observable right now\".',\r\n hostHint: 'A grey \"n/a\" is not a failure: the conversation view is off screen while the settings dialog is open, and the right panel is not in the DOM until a file has been opened. Open that surface and check again to turn it green.',\r\n}\r\n","/**\n * The persisted configuration shape — declared exactly ONCE, for both halves.\n *\n * This shape used to be written out twice: the node half owns persistence and\n * sanitizes every write, the browser half owns the UI and its own reading of the\n * same file. A field added to only one side was silently dropped by the other\n * side's sanitizer — the matching slider stayed live in memory, `writeConfig`\n * wrote a config without it, and the next load fell back to the default.\n * `blurs.rightbar` / `rightbarOpacity` in 0.3.2 was exactly that bug, and the key\n * lists were duplicated 6 times across the two halves, so it was due to happen.\n *\n * The types, the key lists, the defaults and the pure normalizers therefore live\n * here and both halves import them: adding a field means editing this file, and\n * the two halves cannot disagree about the shape. The host additionally logs one\n * warning per unknown key while sanitizing a write (see `warnUnknownConfigKeys`\n * in `src/index.ts`), so a field that reaches the node half without being\n * declared here shows up in the host log instead of quietly disappearing.\n *\n * Nothing in this module may touch the DOM, Node or the Cordis context: it is\n * imported by the browser bundle and by the node half alike.\n */\n\n/** Placement state of one background image (zoom + fractional center + intrinsic size). */\nexport interface BgState { zoom: number; x: number; y: number; iw: number; ih: number }\n\nexport const DEFAULT_BG_STATE: BgState = { zoom: 1, x: 0, y: 0, iw: 0, ih: 0 }\n\n/** Adaptive placement of a background image. */\nexport type BgMode = 'fit' | 'fill' | 'stretch' | 'tile' | 'center'\n\n/** Every accepted `bgMode`, in UI order. */\nexport const BG_MODES: readonly BgMode[] = ['fit', 'fill', 'stretch', 'tile', 'center']\n\n/**\n * Main interface opacities (0..1), global (Interface page):\n * `bg` main background (`--dsw-alias-bg-base`)\n * `sidebar` sidebar (`--dsw-specific-sidebar-fill`)\n * `card` cards/panels (`--dsw-alias-bg-layer-1/2/3`, `--dsw-specific-menu`\n * and its 0.1.7 alias `--dsw-menu-surface-fill`)\n * `input` input/control surfaces (`--dsw-specific-input-major`)\n */\nexport const PART_OPACITY_KEYS = ['bg', 'sidebar', 'card', 'input'] as const\n\n/** Per-part main interface opacities (0..1), keyed BY the list above. */\nexport type PartOpacities = Record<(typeof PART_OPACITY_KEYS)[number], number>\n\nexport const DEFAULT_PART_OPACITIES: PartOpacities = { bg: 0.85, sidebar: 0.93, card: 1, input: 1 }\n\n/**\n * Interface blur (px, 0..60), global (Interface page):\n * `bg` main background (AppFrame grid)\n * `sidebar` sidebar column\n * `card` cards/panels (center + details columns, dialog option panels)\n * `settings` settings panel\n * `chat` conversation text region (message column of the chat view)\n * `trajectory` trajectory view surface\n * `rightbar` file-preview panel — the right sidebar a file click opens\n * `input` input/control surfaces ([data-composer-card], [data-cordis-panel])\n */\nexport const PART_BLUR_KEYS = ['bg', 'sidebar', 'card', 'settings', 'chat', 'trajectory', 'rightbar', 'input'] as const\n\n/** Per-part interface blur (px, 0..60), keyed BY the list above. */\nexport type PartBlurs = Record<(typeof PART_BLUR_KEYS)[number], number>\n\nexport const DEFAULT_PART_BLURS: PartBlurs = {\n bg: 0, sidebar: 0, card: 0, settings: 0, chat: 0, trajectory: 0, rightbar: 0, input: 0,\n}\n\n/**\n * One model rule: a match string plus everything the background needs while it\n * is the active rule. Every appearance field lives HERE rather than globally —\n * the settings UI edits a rule, and the render layer follows whichever rule the\n * current model selected.\n */\nexport interface BgRule {\n /** Stable id; also the render key. */\n id: string\n /**\n * Case-insensitive substring tested against the current model text (provider,\n * model id and display name joined with spaces). An EMPTY string never matches\n * on its own — that rule then only ever serves as the fallback.\n */\n match: string\n /** Image slot; the bytes live in `modelbg-<slot>` under the data dir. */\n slot: string\n /** Disabled rules are skipped by matching AND by the fallback pick. */\n enabled: boolean\n /** Saved HSL theme color of this rule; null = use the system theme. */\n color: [number, number, number] | null\n bgMode: BgMode\n /** Wallpaper layer opacity (0..1). */\n wallpaperOpacity: number\n /** Wallpaper layer blur (px, 0..60) — NOT the interface part blur. */\n blur: number\n /** Image framing (zoom + fractional center + intrinsic size). */\n bgState: BgState\n}\n\n/** The persisted plugin configuration. */\nexport interface ThemeConfig {\n /** Ordered rules: matching runs top→bottom, rule 1 doubles as the fallback. */\n rules: BgRule[]\n /** Global per-part opacities (Interface page). */\n opacities: PartOpacities\n /** Global per-part blur (Interface page). */\n blurs: PartBlurs\n /** Settings-panel opacity (0..1). */\n settingsOpacity: number\n /** Translucent tint over the conversation text region (0 = none, 1 = solid). */\n chatTextOpacity: number\n /** Translucent tint over the trajectory view surface (0 = none, 1 = solid). */\n trajectoryOpacity: number\n /**\n * Surface opacity of the file-preview panel (0..1). `null` = never touched, so\n * the panel keeps following `opacities.bg`: the panel's only surface IS\n * `--dsw-alias-bg-base`, which the main-background slider already re-emits, so\n * an untouched card must stay indistinguishable from the interface behind it.\n */\n rightbarOpacity: number | null\n /**\n * Extract a rule's theme color from its own image when the rule has none yet.\n * Only ever FILLS an empty color — a color the user picked or that an earlier\n * extraction produced is never overwritten, so this cannot fight the user.\n */\n autoExtract: boolean\n}\n\n/** 100% = untouched host surface; zero would blank the page by default. */\nexport const DEFAULT_SETTINGS_OPACITY = 1\nexport const DEFAULT_CHAT_TEXT_OPACITY = 0\n/** 100% = untouched host surface; zero would blank the page by default. */\nexport const DEFAULT_TRAJECTORY_OPACITY = 1\n/** `null` = the file-preview panel still follows the main background. */\nexport const DEFAULT_RIGHTBAR_OPACITY: number | null = null\n/** Picking an image should just work; the toggle is there for people who don't want it. */\nexport const DEFAULT_AUTO_EXTRACT = true\n\n/** A default config with independent nested objects (never hand out the shared ones). */\nexport function freshThemeConfig(): ThemeConfig {\n return {\n rules: [],\n opacities: { ...DEFAULT_PART_OPACITIES },\n blurs: { ...DEFAULT_PART_BLURS },\n settingsOpacity: DEFAULT_SETTINGS_OPACITY,\n chatTextOpacity: DEFAULT_CHAT_TEXT_OPACITY,\n trajectoryOpacity: DEFAULT_TRAJECTORY_OPACITY,\n rightbarOpacity: DEFAULT_RIGHTBAR_OPACITY,\n autoExtract: DEFAULT_AUTO_EXTRACT,\n }\n}\n\n// ── Sanitizers ─────────────────────────────────────────────────────────────\n// Pure coercions from a possibly-old / possibly-hand-edited JSON value into the\n// shape above. Both halves run THESE, so a clamp can never differ between what\n// the UI shows and what lands on disk.\n\n/** Slot names reach the filesystem, so they are strictly whitelisted. */\nexport const SLOT_RE = /^[A-Za-z0-9_-]{1,32}$/\n\nexport function clamp(n: unknown, lo: number, hi: number, def: number): number {\n return typeof n === 'number' && isFinite(n) ? Math.min(hi, Math.max(lo, n)) : def\n}\n\nexport const clamp01 = (n: unknown, def: number): number => clamp(n, 0, 1, def)\n\nexport function normalizeBgState(s: Partial<BgState> | undefined): BgState {\n const v = s ?? {}\n return {\n zoom: clamp(v.zoom, 0.1, 10, 1),\n x: typeof v.x === 'number' && isFinite(v.x) ? v.x : 0,\n y: typeof v.y === 'number' && isFinite(v.y) ? v.y : 0,\n iw: typeof v.iw === 'number' && v.iw > 0 ? v.iw : 0,\n ih: typeof v.ih === 'number' && v.ih > 0 ? v.ih : 0,\n }\n}\n\n/** One `[h, s, l]` triple, or null when the value is not a complete finite triple. */\nexport function normalizeHsl(raw: unknown): [number, number, number] | null {\n if (!Array.isArray(raw) || raw.length !== 3) return null\n if (!raw.every(n => typeof n === 'number' && isFinite(n))) return null\n return [clamp(raw[0], 0, 360, 220), clamp(raw[1], 0, 1, 0.55), clamp(raw[2], 0, 1, 0.25)]\n}\n\n/** Coerce one persisted rule, or null when it lacks a usable id/slot. */\nexport function normalizeRule(raw: unknown): BgRule | null {\n const r = (raw ?? {}) as Partial<BgRule>\n const id = typeof r.id === 'string' && r.id !== '' ? r.id : null\n const slot = typeof r.slot === 'string' && SLOT_RE.test(r.slot) ? r.slot : null\n if (id === null || slot === null) return null\n const mode: BgMode = BG_MODES.includes(r.bgMode as BgMode) ? (r.bgMode as BgMode) : 'fit'\n return {\n id,\n slot,\n match: typeof r.match === 'string' ? r.match : '',\n enabled: r.enabled !== false,\n color: normalizeHsl(r.color),\n bgMode: mode,\n wallpaperOpacity: clamp01(r.wallpaperOpacity, 1),\n blur: clamp(r.blur, 0, 60, 0),\n bgState: normalizeBgState(r.bgState as Partial<BgState> | undefined),\n }\n}\n\n/** Coerce an unknown persisted value into a valid ThemeConfig, falling back per-field. */\nexport function normalizeConfig(raw: unknown): ThemeConfig {\n const r = (raw ?? {}) as Partial<ThemeConfig>\n const rules = Array.isArray(r.rules)\n ? r.rules.map(normalizeRule).filter((x): x is BgRule => x !== null)\n : []\n const ops = (r.opacities ?? {}) as Partial<PartOpacities>\n const bl = (r.blurs ?? {}) as Partial<PartBlurs>\n const blurs = {} as PartBlurs\n for (const k of PART_BLUR_KEYS) {\n blurs[k] = clamp(bl[k], 0, 60, DEFAULT_PART_BLURS[k])\n }\n const opacities = {} as PartOpacities\n for (const k of PART_OPACITY_KEYS) {\n opacities[k] = clamp01(ops[k], DEFAULT_PART_OPACITIES[k])\n }\n return {\n rules,\n opacities,\n blurs,\n settingsOpacity: clamp01(r.settingsOpacity, DEFAULT_SETTINGS_OPACITY),\n chatTextOpacity: clamp01(r.chatTextOpacity, DEFAULT_CHAT_TEXT_OPACITY),\n trajectoryOpacity: clamp01(r.trajectoryOpacity, DEFAULT_TRAJECTORY_OPACITY),\n // Anything but a real number means \"not owned yet\" — including the absent\n // field of a config written before this option existed.\n rightbarOpacity: typeof r.rightbarOpacity === 'number' && isFinite(r.rightbarOpacity)\n ? clamp01(r.rightbarOpacity, 1)\n : DEFAULT_RIGHTBAR_OPACITY,\n // Only an explicit `false` turns it off, so a config written before this\n // option existed starts with the helpful default.\n autoExtract: r.autoExtract !== false,\n }\n}\n","import type { BgRule, BgState, BgMode, ThemeConfig, PartOpacities, PartBlurs } from './types'\n// The persisted shape, its key lists, its defaults and its sanitizers all live in\n// ../schema, shared verbatim with the node half — a field declared on one side\n// only used to be silently dropped by the other side's sanitizer.\nimport {\n DEFAULT_BG_STATE, DEFAULT_CHAT_TEXT_OPACITY, DEFAULT_PART_BLURS, DEFAULT_PART_OPACITIES,\n DEFAULT_SETTINGS_OPACITY, DEFAULT_TRAJECTORY_OPACITY, PART_BLUR_KEYS, PART_OPACITY_KEYS,\n clamp, clamp01, freshThemeConfig, normalizeConfig, normalizeRule,\n} from '../schema'\n\nexport { DEFAULT_BG_STATE, normalizeRule }\n\nconst PALETTE: Array<[number, number, number]> = [\n [356, 0.72, 0.55], [24, 0.78, 0.55], [44, 0.8, 0.55], [152, 0.62, 0.5],\n [174, 0.68, 0.48], [208, 0.72, 0.55], [252, 0.68, 0.6], [300, 0.64, 0.58],\n]\nexport { PALETTE }\n\n/** The defaults every accessor falls back to; the shape itself lives in ../schema. */\nexport const DEFAULT_CONFIG: ThemeConfig = freshThemeConfig()\n\n// In-memory mirror of the file-backed store; the UI reads and mutates this and\n// it is synced to disk via the RPC layer.\nexport let cfg: ThemeConfig = freshThemeConfig()\n\n// ── Image cache (slot → data URL) ──────────────────────────────────────────\n// Rule images are fetched lazily per slot; only the active rule's bytes are\n// needed to paint, the rest are loaded when their card is expanded.\n//\n// Two URLs are kept per slot: the DATA URL is what gets persisted and embedded\n// in an export, while the DISPLAY URL is an object URL derived from it. Painting\n// goes through the display URL because `background-image: url(data:…)` is\n// re-decoded on every assignment — a visible stall on every model switch for a\n// multi-megabyte wallpaper — whereas a blob URL is served from the browser's\n// memory cache after the first load.\nconst images = new Map<string, string>()\nconst displayUrls = new Map<string, string>()\n\nfunction revokeDisplay(slot: string): void {\n const url = displayUrls.get(slot)\n if (url === undefined) return\n displayUrls.delete(slot)\n // Deferred on purpose: the wallpaper layer may still be painting this URL\n // while the replacement fades in over it, and revoking it mid-fade would blank\n // the wallpaper behind the incoming image for a frame.\n window.setTimeout(() => {\n try { URL.revokeObjectURL(url) } catch { /* not a live object URL (e.g. fallback) */ }\n }, 2000)\n}\n\nexport function setImage(slot: string, url: string | null): void {\n revokeDisplay(slot)\n if (url === null) images.delete(slot)\n else images.set(slot, url)\n}\n/** Persisted data URL (RPC / export). Use `displayImageOf` to paint it. */\nexport function imageOf(slot: string): string | null { return images.get(slot) ?? null }\n\n/** Paintable URL for one slot, created on first use and cached; falls back to\n * the data URL when no object URL can be built. */\nexport function displayImageOf(slot: string): string | null {\n const cached = displayUrls.get(slot)\n if (cached !== undefined) return cached\n const data = images.get(slot)\n if (data === undefined) return null\n const made = toObjectUrl(data)\n if (made === null) return data\n displayUrls.set(slot, made)\n return made\n}\n\nfunction toObjectUrl(dataUrl: string): string | null {\n try {\n if (typeof URL === 'undefined' || typeof URL.createObjectURL !== 'function') return null\n const comma = dataUrl.indexOf(',')\n if (comma < 0) return null\n const meta = dataUrl.slice(0, comma)\n if (!/;base64$/i.test(meta)) return null\n const mime = meta.slice(5, -7) || 'image/jpeg'\n const bin = atob(dataUrl.slice(comma + 1))\n const bytes = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i)\n return URL.createObjectURL(new Blob([bytes], { type: mime }))\n } catch {\n return null\n }\n}\n\nexport function clearImages(): void {\n for (const slot of Array.from(displayUrls.keys())) revokeDisplay(slot)\n images.clear()\n}\n\n// ── Active rule (what the render layer follows) ────────────────────────────\nexport let activeRuleId: string | null = null\nexport let activeMatched = false\nexport let modelLabel = ''\n\nexport function setActive(ruleId: string | null, matched: boolean): void {\n activeRuleId = ruleId\n activeMatched = matched\n}\nexport function setModelLabel(label: string): void { modelLabel = label }\n\nexport function ruleById(id: string): BgRule | null {\n return cfg.rules.find(r => r.id === id) ?? null\n}\nexport function activeRule(): BgRule | null {\n return activeRuleId === null ? null : ruleById(activeRuleId)\n}\n\n// ── Rule factories / allocation ────────────────────────────────────────────\nexport function newRule(id: string, slot: string): BgRule {\n return {\n id, slot, match: '', enabled: true, color: null,\n bgMode: 'fit', wallpaperOpacity: 1, blur: 0,\n bgState: { ...DEFAULT_BG_STATE },\n }\n}\n\n/** First free image slot (`m1`, `m2`, …). */\nexport function nextSlot(): string {\n const taken = new Set(cfg.rules.map(r => r.slot))\n for (let i = 1; i < 1000; i++) {\n const slot = `m${i}`\n if (!taken.has(slot)) return slot\n }\n return `m${Date.now()}`\n}\n\n/** Unique rule id (independent from the slot so removals never renumber). */\nexport function nextRuleId(): string {\n const taken = new Set(cfg.rules.map(r => r.id))\n for (let i = 1; i < 10000; i++) {\n const id = `r${i}`\n if (!taken.has(id)) return id\n }\n return `r${Date.now()}`\n}\n\n// ── Accessors used by the render layer (they follow the ACTIVE rule) ───────\nexport function rHasColor(): boolean { return activeRule()?.color !== null && activeRule() !== null }\nexport function rColor(): [number, number, number] { return activeRule()?.color ?? [220, 0.55, 0.25] }\nexport function rBgMode(): BgMode { return activeRule()?.bgMode ?? 'fit' }\nexport function rWop(): number { return clamp01(activeRule()?.wallpaperOpacity, 1) }\nexport function rBl(): number { return clamp(activeRule()?.blur, 0, 60, 0) }\nexport function rBgState(): BgState { return activeRule()?.bgState ?? DEFAULT_BG_STATE }\n/** Paintable URL of the active rule's image, or null when it has none. */\nexport function rWp(): string | null {\n const rule = activeRule()\n return rule === null ? null : displayImageOf(rule.slot)\n}\nexport function rOps(): PartOpacities {\n const o = cfg.opacities ?? {}\n const out = {} as PartOpacities\n for (const k of PART_OPACITY_KEYS) {\n out[k] = clamp01(o[k], DEFAULT_PART_OPACITIES[k])\n }\n return out\n}\nexport function rBlurs(): PartBlurs {\n const b = cfg.blurs ?? {}\n const out = {} as PartBlurs\n for (const k of PART_BLUR_KEYS) {\n out[k] = clamp(b[k], 0, 60, DEFAULT_PART_BLURS[k])\n }\n return out\n}\nexport function rSop(): number { return clamp01(cfg.settingsOpacity, DEFAULT_SETTINGS_OPACITY) }\nexport function rChatTextOpacity(): number { return clamp01(cfg.chatTextOpacity, DEFAULT_CHAT_TEXT_OPACITY) }\nexport function rTrajectoryOpacity(): number { return clamp01(cfg.trajectoryOpacity, DEFAULT_TRAJECTORY_OPACITY) }\n/** Own opacity of the file-preview panel; while unowned it IS the main background's. */\nexport function rRightbarOpacity(): number {\n const own = cfg.rightbarOpacity\n return typeof own === 'number' && isFinite(own) ? clamp01(own, 1) : rOps().bg\n}\n\n// ── Normalization ──────────────────────────────────────────────────────────\n// The sanitizers are the shared ones from ../schema (the same code the node half\n// runs before writing to disk), so what the UI shows and what is persisted can\n// never be clamped differently.\n\n/** Move a possibly-absent partial config into the shape the UI reads. */\nexport function adoptConfig(raw: unknown): void {\n cfg = normalizeConfig(raw)\n // A rule that vanished (import/removal) must not stay active.\n if (activeRuleId !== null && !cfg.rules.some(r => r.id === activeRuleId)) {\n activeRuleId = null\n activeMatched = false\n }\n}\n\nexport function resetConfig(): void {\n cfg = freshThemeConfig()\n clearImages()\n activeRuleId = null\n activeMatched = false\n modelLabel = ''\n}\n","import type { FetchResult, RpcResultLike } from './types'\nimport type { HostReport } from '../host-contracts'\nimport { cfg } from './state'\n\nexport const RPC_CHANNEL = '/dsh-background-by-model'\nconst RPC_NS = 'dshBackgroundByModel'\nconst rpcEndpoint = (method: string): string => `${RPC_NS}/${method}`\n\nlet rpcCallFn: ((endpoint: string, payload: unknown) => Promise<RpcResultLike | undefined>) | null = null\n\nexport function initRpc(call: (endpoint: string, payload: unknown) => Promise<RpcResultLike | undefined>): void {\n rpcCallFn = call\n}\n\nasync function rpcCall(method: string, payload: unknown): Promise<unknown> {\n if (!rpcCallFn) return undefined\n try {\n const res = await rpcCallFn(rpcEndpoint(method), payload)\n if (res && res.ok === true) return res.value\n console.warn(`dsh-background-by-model: rpc \"${method}\" failed`, res?.error)\n return undefined\n } catch (e) {\n console.warn(`dsh-background-by-model: rpc \"${method}\" threw`, e)\n return undefined\n }\n}\n\n/** Raw call for the few places that need the host's error message. */\nasync function rpcRaw(method: string, payload: unknown): Promise<RpcResultLike | undefined> {\n if (!rpcCallFn) return undefined\n try {\n return await rpcCallFn(rpcEndpoint(method), payload)\n } catch {\n return undefined\n }\n}\n\n// Slider drags fire dozens of events per second; coalesce writes to a trailing\n// debounce and flush the last pending write on pagehide so a quick close never\n// loses it.\nconst SAVE_DEBOUNCE_MS = 250\nlet saveTimer: number | undefined\n\nexport function saveConfig(): void {\n if (saveTimer !== undefined) window.clearTimeout(saveTimer)\n saveTimer = window.setTimeout(() => {\n saveTimer = undefined\n void rpcCall('writeConfig', { config: cfg })\n }, SAVE_DEBOUNCE_MS)\n}\n\nexport function flushSave(): void {\n if (saveTimer === undefined) return\n window.clearTimeout(saveTimer)\n saveTimer = undefined\n void rpcCall('writeConfig', { config: cfg })\n}\n\n/** Persist the current config immediately (no debounce). */\nexport function persistConfig(): void {\n void rpcCall('writeConfig', { config: cfg })\n}\n\nexport interface Persisted { config: unknown; slots: string[] }\n\n/** Load the persisted config plus the list of stored image slots. */\nexport async function loadPersisted(): Promise<Persisted | null> {\n const data = await rpcCall('read', {})\n if (data === null || typeof data !== 'object') return null\n const d = data as { config?: unknown; slots?: unknown }\n const slots = Array.isArray(d.slots) ? d.slots.filter((s): s is string => typeof s === 'string') : []\n return { config: d.config, slots }\n}\n\n/** Read one rule image as a data URL (null when the slot is empty). */\nexport async function readImage(slot: string): Promise<string | null> {\n const data = await rpcCall('readImage', { slot })\n if (data === null || typeof data !== 'object') return null\n const url = (data as { dataUrl?: unknown }).dataUrl\n return typeof url === 'string' ? url : null\n}\n\n/** Persist (or clear) one rule image; one-shot, no debounce. */\nexport async function writeImage(slot: string, dataUrl: string | null): Promise<boolean> {\n const res = await rpcCall('writeImage', { slot, dataUrl })\n return res === true\n}\n\n/** Remove one rule image from disk. */\nexport async function deleteImage(slot: string): Promise<boolean> {\n const res = await rpcCall('deleteImage', { slot })\n return res === true\n}\n\n/** Download an image from a network URL into one slot, replacing its bytes. */\nexport async function fetchImageUrl(slot: string, url: string): Promise<FetchResult> {\n const res = await rpcRaw('fetchImageUrl', { slot, url })\n if (!res) return { ok: false, error: 'no response' }\n if (res.ok !== true) {\n const err = (res as { error?: { message?: string } }).error\n return { ok: false, error: err?.message ?? 'request failed' }\n }\n const v = res.value as FetchResult | undefined\n return v?.ok === true\n ? { ok: true, dataUrl: v.dataUrl ?? null }\n : { ok: false, error: v?.error ?? 'failed' }\n}\n\n/** Host default model — used only when the per-session services are absent. */\nexport async function readDefaultModel(): Promise<string | null> {\n const data = await rpcCall('defaultModel', {})\n if (data === null || typeof data !== 'object') return null\n const d = data as { provider?: unknown; model?: unknown }\n const parts = [d.provider, d.model].filter((s): s is string => typeof s === 'string' && s !== '')\n return parts.length > 0 ? parts.join(' ') : null\n}\n\n/**\n * The installed-host half of the self-check: the host version and whether the\n * packages on disk still contain every literal the plugin depends on.\n *\n * Returns null when the node half does not answer (an older build of this plugin\n * still mounted, a host without the RPC channel); the panel then shows the live\n * probe alone rather than claiming the disk scan passed.\n */\nexport async function readHostScan(lang: 'zh' | 'en'): Promise<HostReport | null> {\n const data = await rpcCall('hostCheck', { lang })\n if (data === null || typeof data !== 'object') return null\n const d = data as Partial<HostReport>\n if (!Array.isArray(d.results)) return null\n return data as HostReport\n}\n","import type { BgState, ColorPalette } from '../types'\r\n\r\n// The wheel works in HSV end to end; storage and genTokens expect HSL, so\r\n// setColor converts HSV → HSL at the boundary and sectionInject converts the\r\n// stored HSL → HSV for the initial wheel props. Conversions never stack.\r\n\r\nexport function hsvToHsl(h: number, s: number, v: number): [number, number, number] {\r\n const l = v * (1 - s / 2)\r\n const sl = l === 0 || l === 1 ? 0 : (v - l) / Math.min(l, 1 - l)\r\n return [h, sl, l]\r\n}\r\n\r\nexport function hslToHsv(h: number, s: number, l: number): [number, number, number] {\r\n const v = l + s * Math.min(l, 1 - l)\r\n const sv = v === 0 ? 0 : 2 * (1 - l / v)\r\n return [h, sv, v]\r\n}\r\n\r\nlet tokensCacheKey = ''\r\nlet tokensCache: { colorScheme: 'light' | 'dark'; tokens: Record<string, string> } | null = null\r\n\r\n/**\r\n * Memoized token generation: the same (hue, sat, lit) input always yields the\r\n * same token set, and applyWp / applyCustomTokens / applySettingsOverrides call\r\n * this repeatedly (slider drags, viewport re-applies), so cache the last result\r\n * and skip the 30+ hsl() string builds when nothing changed.\r\n */\r\nexport function genTokens(hue: number, sat: number, lit: number): { colorScheme: 'light' | 'dark'; tokens: Record<string, string> } {\r\n const key = `${hue}|${sat}|${lit}`\r\n if (tokensCacheKey === key && tokensCache) return tokensCache\r\n tokensCacheKey = key\r\n tokensCache = buildTokens(hue, sat, lit)\r\n return tokensCache\r\n}\r\n\r\nfunction buildTokens(hue: number, sat: number, lit: number): { colorScheme: 'light' | 'dark'; tokens: Record<string, string> } {\r\n const dark = lit < 0.55\r\n const h = (d: number) => ((hue + d) % 360 + 360) % 360\r\n const s = (d: number) => Math.max(0, Math.min(1, sat + d))\r\n const l = (d: number) => Math.max(0, Math.min(1, lit + d))\r\n const hsl = (hh: number, ss: number, ll: number) => `hsl(${Math.round(hh)},${Math.round(ss * 100)}%,${Math.round(ll * 100)}%)`\r\n const rgba = (hh: number, ss: number, ll: number, a: number) =>\r\n `hsla(${Math.round(hh)},${Math.round(ss * 100)}%,${Math.round(ll * 100)}%,${a})`\r\n\r\n if (dark) {\r\n // dsh 0.1.7 splits the menu surface in two: the shared MenuSurface material\r\n // paints `--dsw-menu-surface-fill`, and every other overlay paints\r\n // `--dsw-specific-menu`, which the host aliases to the former\r\n // (`--dsw-specific-menu: var(--dsw-menu-surface-fill)`). Both are generated\r\n // from this one expression so the plugin's override of either can never let\r\n // the pair drift apart — see OPACITY_VARS in wallpaper.ts.\r\n const menuFill = hsl(h(0), s(0), l(0.08))\r\n return {\r\n colorScheme: 'dark',\r\n tokens: {\r\n '--dsw-alias-bg-base': hsl(h(0), s(0), l(-0.04)),\r\n '--dsw-alias-bg-layer-1': hsl(h(0), s(0), l(0.02)),\r\n '--dsw-alias-bg-layer-2': hsl(h(0), s(0), l(0.07)),\r\n '--dsw-alias-bg-layer-3': hsl(h(0), s(-0.05), l(0.12)),\r\n '--dsw-alias-bg-overlay': hsl(h(0), s(-0.05), l(0.12)),\r\n '--dsw-alias-bg-module-platform': hsl(h(0), s(0), l(0.05)),\r\n '--dsw-alias-bg-multi-select': hsl(h(0), s(0), l(0.1)),\r\n '--dsw-alias-bg-skeleton': 'rgba(255,255,255,0.08)',\r\n '--dsw-alias-border-l1': rgba(h(0), s(-0.1), l(0.18), 0.12),\r\n '--dsw-alias-border-l2': rgba(h(0), s(-0.1), l(0.22), 0.22),\r\n '--dsw-alias-border-l3': 'rgba(255,255,255,0.16)',\r\n '--dsw-alias-border-l4': 'rgba(255,255,255,0.2)',\r\n '--dsw-alias-border-inverted': 'rgba(255,255,255,0.06)',\r\n '--dsw-alias-label-primary': hsl(0, 0, 1),\r\n '--dsw-alias-label-secondary': 'rgba(255,255,255,0.85)',\r\n '--dsw-alias-label-tertiary': 'rgba(255,255,255,0.7)',\r\n // Placeholder/dim hint — deliberately weaker than the text tiers so a\r\n // placeholder reads as a hint, never as real input.\r\n '--dsw-alias-label-caption': 'rgba(255,255,255,0.5)',\r\n '--dsw-alias-label-dimmed': 'rgba(255,255,255,0.35)',\r\n '--dsw-alias-label-quaternary': 'rgba(255,255,255,0.25)',\r\n '--dsw-alias-label-primary-dimmed': 'rgba(255,255,255,0.92)',\r\n '--dsw-alias-label-primary-foreground': hsl(0, 0, 1),\r\n // Inverted label sits on a light brand/contrast/badge surface in dark\r\n // mode, so it must be dark ink, not white.\r\n '--dsw-alias-label-primary-inverted': hsl(h(0), s(0.08), Math.min(l(0.06), 0.16)),\r\n '--dsw-alias-label-primary-bluish': hsl(0, 0, 1),\r\n '--dsw-alias-brand-primary': hsl(h(0), s(0.1), Math.max(l(0.2), 0.5)),\r\n '--dsw-alias-brand-text': l(0.2) > 0.6 ? '#000' : '#fff',\r\n '--dsw-alias-button-primary-fill': hsl(h(0), s(0.1), Math.max(l(0.2), 0.5)),\r\n '--dsw-alias-button-primary-hover': hsl(h(0), s(0.1), Math.max(l(0.28), 0.58)),\r\n '--dsw-alias-button-primary-dimmed': hsl(h(0), s(0), l(0.07)),\r\n '--dsw-alias-button-elevated-fill': hsl(h(0), s(0), l(0.04)),\r\n '--dsw-alias-button-floating-fill': hsl(h(0), s(0), l(0.02)),\r\n '--dsw-alias-button-floating-hover': hsl(h(0), s(0), l(0.1)),\r\n '--dsw-alias-button-tool-bar-fill': 'rgba(255,255,255,0.08)',\r\n '--dsw-alias-button-tool-bar-hover': 'rgba(255,255,255,0.12)',\r\n '--dsw-alias-button-ghost-active-fill': hsl(h(0), s(0), l(0.06)),\r\n '--dsw-alias-button-ghost-active-border': 'rgba(255,255,255,0.16)',\r\n '--dsw-alias-button-ghost-active-hover': hsl(h(0), s(0), l(0.09)),\r\n '--dsw-alias-button-info-fill': '#679efe',\r\n '--dsw-alias-button-info-hover': '#4176e6',\r\n '--dsw-alias-button-contrast-fill': hsl(0, 0, 1),\r\n '--dsw-alias-interactive-bg-hover': rgba(h(0), s(0), Math.max(l(0.15), 0.4), 0.12),\r\n '--dsw-alias-interactive-bg-hover-solid': rgba(h(0), s(0), Math.max(l(0.15), 0.4), 0.16),\r\n '--dsw-alias-interactive-bg-hover-accent': 'rgba(255,255,255,0.24)',\r\n '--dsw-alias-interactive-bg-hover-danger': 'rgba(242,90,90,0.15)',\r\n '--dsw-alias-interactive-bg-active': rgba(h(0), s(0), Math.max(l(0.15), 0.4), 0.2),\r\n '--dsw-alias-markdown-code-block': hsl(h(0), s(0), l(-0.06)),\r\n '--dsw-alias-markdown-code-block-banner': hsl(h(0), s(0), l(-0.02)),\r\n '--dsw-alias-markdown-inline-code': hsl(h(0), s(0), l(0.04)),\r\n '--dsw-alias-markdown-placeholder': hsl(h(0), s(0), l(-0.02)),\r\n '--dsw-alias-markdown-tag': hsl(h(0), s(0), l(0.05)),\r\n '--dsw-alias-markdown-citation': hsl(h(0), s(0), l(0.06)),\r\n '--dsw-alias-markdown-code-segment-selected': hsl(h(0), s(0), l(0.05)),\r\n '--dsw-alias-markdown-code-segment-unselected': hsl(h(0), s(0), l(-0.05)),\r\n '--dsw-alias-state-error-primary': '#ff5c72',\r\n '--dsw-alias-state-error-secondary': '#ff8aa0',\r\n '--dsw-alias-state-success-primary': '#3ddc84',\r\n '--dsw-alias-state-success-secondary': '#69eea4',\r\n // Badge tertiary tokens are the static dark surfaces the UI draws\r\n // over (trajectory tool/context badges, connection pill, plan chip):\r\n // aligning them with the native dark 800/900 steps keeps light fix label\r\n // text readable instead of tint-same-as-background (issue #9).\r\n '--dsw-alias-state-success-tertiary': '#233c2c',\r\n '--dsw-alias-state-warn-primary': '#ffb347',\r\n '--dsw-alias-state-warn-secondary': '#ffc980',\r\n '--dsw-alias-state-warn-tertiary': '#27241f',\r\n '--dsw-alias-state-warn-label': '#dd8629',\r\n '--dsw-alias-state-business-primary': '#679efe',\r\n '--dsw-alias-state-business-tertiary': '#34415b',\r\n '--dsw-specific-sidebar-fill': hsl(h(0), s(0), l(-0.06)),\r\n '--dsw-specific-sidebar-nav-item-active': hsl(h(0), s(0), l(0.04)),\r\n '--dsw-specific-sidebar-nav-item-hover': hsl(h(0), s(0), l(0)),\r\n '--dsw-specific-input-major': hsl(h(0), s(0), l(0.02)),\r\n '--dsw-specific-menu': menuFill,\r\n '--dsw-menu-surface-fill': menuFill,\r\n '--dsw-specific-bubble': hsl(h(0), s(0), l(0.03)),\r\n '--dsw-specific-bubble-highlight': hsl(h(0), s(0), l(0.08)),\r\n '--dsw-specific-selector': hsl(h(0), s(0), l(0.05)),\r\n '--dsw-specific-login-input': hsl(h(0), s(0), l(0.03)),\r\n '--dsw-specific-tip': hsl(h(0), s(0), l(0.05)),\r\n '--dsw-alias-toast-bg': hsl(h(0), s(0), l(0.08)),\r\n '--dsw-alias-tooltip-bg': hsl(h(0), s(0), l(0.08)),\r\n '--dsw-alias-scrollbar-bg-l1': hsl(h(0), s(-0.05), l(0.12)),\r\n '--dsw-alias-scrollbar-bg-l2': hsl(h(0), s(-0.05), l(0.16)),\r\n '--dsw-alias-scrollbar-hover-l1': hsl(h(0), s(-0.05), l(0.22)),\r\n '--dsw-alias-scrollbar-hover-l2': hsl(h(0), s(-0.05), l(0.22)),\r\n },\r\n }\r\n }\r\n // Same one-expression contract as the dark branch above.\r\n const menuFill = hsl(h(0), s(-0.12), l(0.15))\r\n return {\r\n colorScheme: 'light',\r\n tokens: {\r\n '--dsw-alias-bg-base': hsl(h(0), s(-0.08), l(0.03)),\r\n '--dsw-alias-bg-layer-1': hsl(h(0), s(-0.12), l(0.07)),\r\n '--dsw-alias-bg-layer-2': hsl(h(0), s(-0.1), l(-0.03)),\r\n '--dsw-alias-bg-layer-3': hsl(h(0), s(-0.08), l(-0.09)),\r\n '--dsw-alias-bg-overlay': hsl(h(0), s(-0.12), l(0.08)),\r\n '--dsw-alias-border-l1': rgba(h(0), s(-0.15), l(-0.35), 0.18),\r\n '--dsw-alias-border-l2': rgba(h(0), s(-0.15), l(-0.35), 0.3),\r\n '--dsw-alias-label-primary': hsl(0, 0, 0),\r\n '--dsw-alias-label-secondary': 'rgba(0,0,0,0.85)',\r\n '--dsw-alias-label-tertiary': 'rgba(0,0,0,0.7)',\r\n // Placeholder/dim hint — deliberately weaker than the text tiers so a\r\n // placeholder reads as a hint, never as real input.\r\n '--dsw-alias-label-caption': 'rgba(0,0,0,0.5)',\r\n '--dsw-alias-label-dimmed': 'rgba(0,0,0,0.35)',\r\n '--dsw-alias-label-quaternary': 'rgba(0,0,0,0.25)',\r\n '--dsw-alias-brand-primary': hsl(h(0), s(0.05), Math.min(l(-0.18), 0.45)),\r\n '--dsw-alias-brand-text': '#fff',\r\n '--dsw-alias-button-primary-hover': hsl(h(0), s(0.05), Math.min(l(-0.12), 0.5)),\r\n '--dsw-alias-button-primary-dimmed': hsl(h(0), s(-0.1), l(-0.03)),\r\n '--dsw-alias-button-elevated-fill': hsl(h(0), s(-0.1), l(0.1)),\r\n '--dsw-alias-button-floating-hover': hsl(h(0), s(-0.1), l(0.16)),\r\n '--dsw-alias-interactive-bg-hover': rgba(h(0), s(0), l(-0.3), 0.08),\r\n '--dsw-alias-interactive-bg-active': rgba(h(0), s(0), l(-0.3), 0.14),\r\n '--dsw-alias-markdown-code-block': hsl(h(0), s(-0.1), l(-0.03)),\r\n '--dsw-alias-markdown-inline-code': hsl(h(0), s(-0.08), l(0.04)),\r\n '--dsw-specific-sidebar-fill': hsl(h(0), s(-0.1), l(-0.03)),\r\n '--dsw-specific-sidebar-nav-item-active': hsl(h(0), s(-0.08), l(0.05)),\r\n '--dsw-specific-sidebar-nav-item-hover': hsl(h(0), s(-0.12), l(0)),\r\n '--dsw-specific-input-major': hsl(h(0), s(-0.12), l(0.1)),\r\n '--dsw-specific-menu': menuFill,\r\n '--dsw-menu-surface-fill': menuFill,\r\n '--dsw-alias-scrollbar-bg-l1': hsl(h(0), s(-0.1), l(-0.08)),\r\n '--dsw-alias-scrollbar-bg-l2': hsl(h(0), s(-0.08), l(-0.12)),\r\n '--dsw-alias-scrollbar-hover-l1': hsl(h(0), s(-0.08), l(-0.16)),\r\n '--dsw-alias-scrollbar-hover-l2': hsl(h(0), s(-0.08), l(-0.16)),\r\n },\r\n }\r\n}\r\n\r\nexport function toRgba(c: string, a: number): string {\r\n const hx = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(c.trim())\r\n if (hx) { let d = hx[1]!; if (d.length === 3) d = d.split('').map(x => x + x).join(''); const n = parseInt(d, 16); return `rgba(${(n >> 16) & 255},${(n >> 8) & 255},${n & 255},${a})` }\r\n const rgb = /^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+))?\\s*\\)$/i.exec(c.trim())\r\n if (rgb) return `rgba(${rgb[1]},${rgb[2]},${rgb[3]},${a})`\r\n const hsl = /^hsla?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%/i.exec(c.trim())\r\n if (hsl) return `hsla(${hsl[1]},${hsl[2]}%,${hsl[3]}%,${a})`\r\n return c.trim()\r\n}\r\n\r\nexport function rgbToHsl(r: number, g: number, b: number): [number, number, number] {\r\n const rn = r / 255, gn = g / 255, bn = b / 255\r\n const max = Math.max(rn, gn, bn), min = Math.min(rn, gn, bn)\r\n const l = (max + min) / 2\r\n if (max === min) return [0, 0, l]\r\n const d = max - min\r\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\r\n let h: number\r\n if (max === rn) h = ((gn - bn) / d) % 6\r\n else if (max === gn) h = (bn - rn) / d + 2\r\n else h = (rn - gn) / d + 4\r\n h *= 60\r\n if (h < 0) h += 360\r\n return [h, s, l]\r\n}\r\n\r\n// Wallpaper color extraction: decode the cached data URL → crop the visible\r\n// (framed) region → downsample to a 64×64 canvas → quantize pixels into 4-bit\r\n// RGB buckets → discard near-gray / near-black / near-white pixels → pick the\r\n// most populous vivid bucket (count × saturation bias) → average its members →\r\n// RGB→HSL → clamp lightness into a band that keeps the light/dark scheme\r\n// decision unambiguous. Purely client-side and memory-bounded.\r\n\r\nconst EXTRACT_SIDE = 64\r\n\r\ninterface Bucket { count: number; r: number; g: number; b: number; s: number }\r\n\r\nfunction bucketsToHsl(b: Bucket): [number, number, number] {\r\n return rgbToHsl(b.r / b.count, b.g / b.count, b.b / b.count)\r\n}\r\n\r\nfunction extractWallpaperPalette(dataUrl: string, bgState: BgState): Promise<ColorPalette | null> {\r\n return new Promise(resolve => {\r\n const img = new Image()\r\n img.onerror = () => resolve(null)\r\n img.onload = () => {\r\n try {\r\n const iw = img.naturalWidth || img.width\r\n const ih = img.naturalHeight || img.height\r\n const bg = bgState\r\n let sx = 0, sy = 0, sw = iw, sh = ih\r\n if (bg.iw === iw && bg.ih === ih && bg.iw > 0) {\r\n const fit = Math.min(window.innerWidth / iw, window.innerHeight / ih)\r\n const w = iw * fit * bg.zoom\r\n const h = ih * fit * bg.zoom\r\n sx = Math.max(0, bg.x * window.innerWidth - w / 2)\r\n sy = Math.max(0, bg.y * window.innerHeight - h / 2)\r\n sw = Math.min(iw - sx, w)\r\n sh = Math.min(ih - sy, h)\r\n if (sw <= 0 || sh <= 0) { sx = 0; sy = 0; sw = iw; sh = ih }\r\n }\r\n const c = document.createElement('canvas')\r\n c.width = EXTRACT_SIDE; c.height = EXTRACT_SIDE\r\n const g = c.getContext('2d', { willReadFrequently: true })!\r\n g.drawImage(img, sx, sy, sw, sh, 0, 0, EXTRACT_SIDE, EXTRACT_SIDE)\r\n const px = g.getImageData(0, 0, EXTRACT_SIDE, EXTRACT_SIDE).data\r\n const counts = new Uint32Array(4096)\r\n const sums = new Float64Array(4096 * 3)\r\n let totalLum = 0\r\n let sampled = 0\r\n for (let i = 0; i < px.length; i += 4) {\r\n const r = px[i], gg = px[i + 1], b = px[i + 2]\r\n const max = Math.max(r, gg, b), min = Math.min(r, gg, b)\r\n const v = max / 255\r\n const s = max === 0 ? 0 : (max - min) / max\r\n // Include all non-extreme pixels in luminance; only vivid pixels in\r\n // palette buckets so we don't theme around gray/black/white.\r\n // Rec.709 luma — the measure a display reads as brightness, and the one\r\n // the light/dark band below is decided with. The HSV value used here\r\n // before counts every saturated pixel as bright (pure blue: v = 1.0,\r\n // luma = 0.072), which pushed dark saturated wallpapers into the light\r\n // band and built a light palette over a dark picture.\r\n totalLum += (0.2126 * r + 0.7152 * gg + 0.0722 * b) / 255\r\n sampled++\r\n if (s < 0.08 || v < 0.12 || v > 0.97) continue\r\n const key = ((r >> 4) << 8) | ((gg >> 4) << 4) | (b >> 4)\r\n counts[key]++\r\n sums[key * 3] += r; sums[key * 3 + 1] += gg; sums[key * 3 + 2] += b\r\n }\r\n const buckets: Bucket[] = []\r\n for (let k = 0; k < 4096; k++) {\r\n if (counts[k] === 0) continue\r\n buckets.push({\r\n count: counts[k],\r\n r: sums[k * 3],\r\n g: sums[k * 3 + 1],\r\n b: sums[k * 3 + 2],\r\n s: (Math.max(sums[k * 3], sums[k * 3 + 1], sums[k * 3 + 2]) - Math.min(sums[k * 3], sums[k * 3 + 1], sums[k * 3 + 2])) / Math.max(sums[k * 3], sums[k * 3 + 1], sums[k * 3 + 2]) || 0,\r\n })\r\n }\r\n if (buckets.length === 0) { resolve(null); return }\r\n // Sort by vivid-weighted count.\r\n buckets.sort((a, b) => b.count * (0.5 + b.s) - a.count * (0.5 + a.s))\r\n const primary = bucketsToHsl(buckets[0]!)\r\n const primaryHue = primary[0]\r\n // Secondary: next bucket that is reasonably separated from primary.\r\n let secondary = primary\r\n for (const b of buckets.slice(1)) {\r\n const [h] = bucketsToHsl(b)\r\n const sep = Math.abs(((h - primaryHue + 540) % 360) - 180)\r\n if (sep > 30) { secondary = bucketsToHsl(b); break }\r\n }\r\n // Tertiary: complementary-ish hue based on primary if no good secondary.\r\n let tertiary: [number, number, number] = [((primaryHue + 180) % 360), Math.min(0.7, primary[1]), Math.min(0.7, primary[2])]\r\n for (const b of buckets.slice(1)) {\r\n const [h] = bucketsToHsl(b)\r\n const sep = Math.abs(((h - primaryHue + 540) % 360) - 180)\r\n if (sep > 90 && sep < 150) { tertiary = bucketsToHsl(b); break }\r\n }\r\n // Surface: neutralized primary (very low saturation).\r\n const surface: [number, number, number] = [primaryHue, Math.min(0.06, primary[1] * 0.3), primary[2]]\r\n // Auto light/dark: use the average luminance of the whole image so a\r\n // bright wallpaper naturally drives a light scheme and vice-versa.\r\n const luminance = sampled > 0 ? totalLum / sampled : primary[2]\r\n // Snap primary lightness out of the ambiguous middle band.\r\n const autoDark = luminance < 0.5\r\n const lc = autoDark ? Math.min(0.44, Math.max(0.2, primary[2])) : Math.max(0.6, Math.min(0.82, primary[2]))\r\n primary[2] = lc\r\n resolve({\r\n primary: [primary[0], Math.min(0.9, Math.max(0.15, primary[1])), primary[2]],\r\n secondary: [secondary[0], Math.min(0.85, Math.max(0.2, secondary[1])), Math.min(0.75, Math.max(0.35, secondary[2]))],\r\n tertiary: [tertiary[0], Math.min(0.8, Math.max(0.2, tertiary[1])), Math.min(0.7, Math.max(0.35, tertiary[2]))],\r\n surface,\r\n luminance,\r\n })\r\n } catch {\r\n resolve(null)\r\n }\r\n }\r\n img.src = dataUrl\r\n })\r\n}\r\n\r\n/** Backward-compatible single-color extraction: returns the primary HSL. */\r\nexport async function extractWallpaperColor(dataUrl: string, bgState: BgState): Promise<[number, number, number] | null> {\r\n const palette = await extractWallpaperPalette(dataUrl, bgState)\r\n return palette ? palette.primary : null\r\n}\r\n\r\n// One-shot frame brightness analysis: called only when a generated background\r\n// is switched (from its captured snapshot), never from the animation loop.\r\n// Decode the frame, downsample to a 32×32 canvas, average Rec.709 luma.\r\n// Dark frame → light fonts, light frame → dark fonts.\r\n\r\nconst ANALYZE_SIDE = 32\r\n\r\n/** Analyze a captured frame's average luminance. Resolves true when the frame\r\n * reads dark (use white fonts), false when light (use black fonts), or null\r\n * when the frame cannot be decoded. */\r\nexport function analyzeFrameDark(dataUrl: string): Promise<boolean | null> {\r\n return new Promise(resolve => {\r\n const img = new Image()\r\n img.onerror = () => resolve(null)\r\n img.onload = () => {\r\n try {\r\n const c = document.createElement('canvas')\r\n c.width = ANALYZE_SIDE; c.height = ANALYZE_SIDE\r\n const g = c.getContext('2d', { willReadFrequently: true })!\r\n g.drawImage(img, 0, 0, ANALYZE_SIDE, ANALYZE_SIDE)\r\n const px = g.getImageData(0, 0, ANALYZE_SIDE, ANALYZE_SIDE).data\r\n let lum = 0\r\n const count = px.length / 4\r\n for (let i = 0; i < px.length; i += 4) {\r\n lum += 0.2126 * px[i]! + 0.7152 * px[i + 1]! + 0.0722 * px[i + 2]!\r\n }\r\n resolve(lum / count / 255 < 0.5)\r\n } catch {\r\n resolve(null)\r\n }\r\n }\r\n img.src = dataUrl\r\n })\r\n}\r\n\r\n/** HSL (h 0-360, s/l 0-1) → RGB (0-255 integers). */\r\nexport function hslToRgb(h: number, s: number, l: number): [number, number, number] {\r\n const c = (1 - Math.abs(2 * l - 1)) * s\r\n const hp = h / 60\r\n const x = c * (1 - Math.abs((hp % 2) - 1))\r\n let r = 0, g = 0, b = 0\r\n if (hp < 1) { r = c; g = x }\r\n else if (hp < 2) { r = x; g = c }\r\n else if (hp < 3) { g = c; b = x }\r\n else if (hp < 4) { g = x; b = c }\r\n else if (hp < 5) { r = x; b = c }\r\n else { r = c; b = x }\r\n const m = l - c / 2\r\n return [Math.round((r + m) * 255), Math.round((g + m) * 255), Math.round((b + m) * 255)]\r\n}\r\n","import { rWp, rBgState, rBl, rWop, rOps, rSop, rColor, rHasColor, rBlurs, rBgMode, rChatTextOpacity, rTrajectoryOpacity, rRightbarOpacity } from './state'\r\nimport type { PartOpacities, PartBlurs } from './types'\r\nimport { genTokens, toRgba } from './utils/color'\r\n\r\nlet wpEl: HTMLDivElement | null = null\r\nlet appliedTokenNames: string[] = []\r\nlet tokenStyleEl: HTMLStyleElement | null = null\r\n\r\nfunction ensureTokenStyle(): HTMLStyleElement {\r\n if (tokenStyleEl?.isConnected) return tokenStyleEl\r\n tokenStyleEl = document.createElement('style')\r\n tokenStyleEl.dataset.plugin = 'dsh-background-by-model-tokens'\r\n document.head.appendChild(tokenStyleEl)\r\n return tokenStyleEl\r\n}\r\n\r\nfunction clearCustomTokens(): void {\r\n if (tokenStyleEl) tokenStyleEl.textContent = ''\r\n for (const name of appliedTokenNames) document.body.style.removeProperty(name)\r\n appliedTokenNames = []\r\n}\r\n\r\n// Solid surface tokens grouped by which interface-opacity slider owns them.\r\n// Every member is re-emitted with per-part alpha so surfaces over the wallpaper\r\n// (composer input, elevated buttons, menu panels) can go translucent — not just\r\n// the layered bg/sidebar tokens. The two menu fills are owned by the card slider\r\n// and must always travel together: --dsw-specific-menu is what overlays paint\r\n// (dropdowns, slash-trigger menu, popovers around the dialog) and\r\n// --dsw-menu-surface-fill is what the shared MenuSurface material paints, which\r\n// dsh 0.1.7 aliases the former to. Re-emitting only one of them leaves a menu\r\n// panel on one fill and its sticky group headings on the other — the solid band\r\n// across the model selector's provider rows. The Cordis panel shares\r\n// --dsw-specific-menu but is re-scoped to the input slider via INPUT_BLUR_RULE.\r\nconst OPACITY_TOKEN_GROUPS: Array<{ part: keyof PartOpacities; names: string[] }> = [\r\n { part: 'bg', names: ['--dsw-alias-bg-base'] },\r\n { part: 'sidebar', names: ['--dsw-specific-sidebar-fill'] },\r\n { part: 'card', names: ['--dsw-alias-bg-layer-1', '--dsw-alias-bg-layer-2', '--dsw-alias-bg-layer-3', '--dsw-specific-menu', '--dsw-menu-surface-fill'] },\r\n { part: 'input', names: ['--dsw-specific-input-major'] },\r\n]\r\n\r\n// Plugin-owned variables the opacity-bearing tokens read from. They live as\r\n// inline custom props on <html>, so a slider drag rewrites only those few values\r\n// instead of re-parsing/re-matching the whole body token rule on every tick —\r\n// the difference is critical when a large wallpaper sits under the interface.\r\nconst OPACITY_VARS: Record<string, string> = {\r\n '--dsw-alias-bg-base': '--dsh-any-op-bg',\r\n '--dsw-specific-sidebar-fill': '--dsh-any-op-sidebar',\r\n '--dsw-alias-bg-layer-1': '--dsh-any-op-card-1',\r\n '--dsw-alias-bg-layer-2': '--dsh-any-op-card-2',\r\n '--dsw-alias-bg-layer-3': '--dsh-any-op-card-3',\r\n '--dsw-specific-input-major': '--dsh-any-op-input',\r\n // The MenuSurface material under a menu panel and the overlay fill its sticky\r\n // headings paint are the same value on a 0.1.7 host, so they read the same\r\n // plugin-owned variable — one slider, one alpha, no seam between them.\r\n '--dsw-specific-menu': '--dsh-any-op-menu',\r\n '--dsw-menu-surface-fill': '--dsh-any-op-menu',\r\n}\r\n\r\n// Fingerprint of the non-alpha token base (color pick + scheme verdict).\r\n// The static body rule is only rebuilt when it changes; a drag never touches it.\r\nlet baseTokenKey = ''\r\n\r\n// Coalesce slider-driven token updates to one rAF: a single drag fires several\r\n// input events per frame, and every full re-apply repaints expensive regions\r\n// over a large wallpaper. Batching keeps at most one update per frame.\r\nlet pendingOps: PartOpacities | null = null\r\nlet tokensRaf: number | null = null\r\n\r\nexport function applyCustomTokens(ops: PartOpacities): void {\r\n pendingOps = ops\r\n if (tokensRaf !== null) return\r\n tokensRaf = requestAnimationFrame(() => {\r\n tokensRaf = null\r\n if (pendingOps === null) return\r\n const o = pendingOps\r\n pendingOps = null\r\n applyCustomTokensNow(o)\r\n })\r\n}\r\n\r\n// Only the main-bg slider retints the center/details columns; keys on\r\n// baseTokenKey + ops.bg so a sidebar/card/input drag never rewrites them.\r\nlet lastBgKey = ''\r\n\r\nfunction applyCustomTokensNow(ops: PartOpacities): void {\r\n const [h, s, l] = rColor()\r\n const { tokens } = genTokens(h, s, l)\r\n try {\r\n const forceDark = l < 0.55\r\n if (`${h}|${s}|${l}` !== baseTokenKey) {\r\n baseTokenKey = `${h}|${s}|${l}`\r\n // Drive the base-palette switch with a plugin-specific value so the\r\n // gradient rule never matches a host dark-mode flag; color-scheme makes\r\n // native controls (select popups) follow the forced palette. Both ride the\r\n // stylesheet (not inline styles) so the host presenter clearing body\r\n // inline styles on boot can't drop them, and the !important rule survives\r\n // that clearing too.\r\n if (forceDark) document.body.setAttribute('data-ds-dark-theme', 'dsh-background-by-model')\r\n else document.body.removeAttribute('data-ds-dark-theme')\r\n const decls: string[] = [`color-scheme:${forceDark ? 'dark' : 'light'}`]\r\n for (const [name, value] of Object.entries(tokens)) {\r\n const opVar = OPACITY_VARS[name]\r\n decls.push(`${name}:${opVar !== undefined ? `var(${opVar})` : value}!important`)\r\n }\r\n ensureTokenStyle().textContent = `body{${decls.join(';')}}`\r\n // Drop inline tokens left by earlier builds so the stylesheet is the single source of truth.\r\n for (const name of appliedTokenNames) document.body.style.removeProperty(name)\r\n appliedTokenNames = Object.keys(tokens)\r\n }\r\n // Cheap per-drag update: only the surface alpha vars move on <html>.\r\n const root = document.documentElement\r\n for (const g of OPACITY_TOKEN_GROUPS) {\r\n for (const name of g.names) {\r\n root.style.setProperty(OPACITY_VARS[name], toRgba(tokens[name] ?? '#000', ops[g.part]))\r\n }\r\n }\r\n // The Cordis panel keeps its own input-slider alpha (see INPUT_BLUR_RULE).\r\n root.style.setProperty('--dsh-any-op-menu-cordis', toRgba(tokens['--dsw-specific-menu'] ?? '#000', ops.input))\r\n const bgKey = `${baseTokenKey}|${ops.bg}`\r\n if (bgKey !== lastBgKey) { lastBgKey = bgKey; applyPartOpacities(ops) }\r\n } catch {\r\n // ignore\r\n }\r\n}\r\n\r\n// ── Settings panel opacity ─────────────────────────────────────────────────────\r\n// The settings modal is the only aria-modal dialog identifying itself with\r\n// aria-labelledby, so this selector scopes translucency to the settings panel.\r\n// The surface (--dsw-alias-bg-layer-2) is re-emitted with an alpha through a\r\n// plugin-owned variable so the panel keeps its color while fading.\r\n\r\nconst SETTINGS_PANEL_SEL = '[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby]'\r\nexport const SETTINGS_STYLE_RULE =\r\n `${SETTINGS_PANEL_SEL}{` +\r\n `background:var(--dsh-any-bg-settings-surface,var(--dsw-alias-bg-layer-2));` +\r\n `backdrop-filter:var(--dsh-any-blur-settings,none);` +\r\n // Re-scope the dialog's layer tokens to plugin-owned variables so every\r\n // surface inside the dialog follows the settings opacity slider only.\r\n `--dsw-alias-bg-layer-1:var(--dsh-any-bg-settings-layer-1);` +\r\n `--dsw-alias-bg-layer-2:var(--dsh-any-bg-settings-layer-2);` +\r\n `--dsw-alias-bg-layer-3:var(--dsh-any-bg-settings-layer-3)}` +\r\n // Option-panel blur inside the dialog, owned by the card blur slider.\r\n `${SETTINGS_PANEL_SEL} .dab-card{backdrop-filter:var(--dsh-any-blur-card-panels,none);-webkit-backdrop-filter:var(--dsh-any-blur-card-panels,none)}`\r\n\r\n// Input/control surface blur. The composer card and the Cordis panel expose\r\n// stable host data attributes ([data-composer-card], [data-cordis-panel]), so\r\n// the backdrop is attached via a stylesheet rule rather than element discovery.\r\n// The Cordis panel shares the --dsw-specific-menu token with the dialog's\r\n// option boxes, but it stays owned by the input slider — the re-scope below\r\n// keeps it there now that the menu token itself follows the card slider. Note\r\n// the input slider must NOT drive the button-elevated-fill /\r\n// button-floating-hover tokens: the settings panel's own controls (slider\r\n// thumbs, .dab-btn, segmented thumb) are painted from those same tokens, so\r\n// tinting them would bleach the panel's own UI.\r\nexport const INPUT_BLUR_RULE =\r\n '[data-composer-card],[data-cordis-panel]{' +\r\n '-webkit-backdrop-filter:var(--dsh-any-input-blur,none);' +\r\n 'backdrop-filter:var(--dsh-any-input-blur,none)}' +\r\n '[data-cordis-panel]{--dsw-specific-menu:var(--dsh-any-op-menu-cordis)!important}'\r\n\r\nfunction applyInputBlur(px: number): void {\r\n if (px > 0) document.documentElement.style.setProperty('--dsh-any-input-blur', `blur(${px}px)`)\r\n else document.documentElement.style.removeProperty('--dsh-any-input-blur')\r\n}\r\n\r\n// Placeholder/hint text inside the composer and the plugin's own input\r\n// surfaces: rendered with the weak caption token (distinct from real input)\r\n// plus italic, so an empty box is never mistaken for typed content.\r\nexport const PLACEHOLDER_RULE =\r\n '[data-composer-card] textarea::placeholder,' +\r\n '[data-composer-card] input::placeholder,' +\r\n '[data-composer-card] [contenteditable]::placeholder,' +\r\n '[data-cordis-panel] input::placeholder,' +\r\n '[data-cordis-panel] textarea::placeholder,' +\r\n '.dab-input::placeholder,' +\r\n '.dab-input textarea::placeholder,' +\r\n '.dab-input input::placeholder' +\r\n '{color:var(--dsh-any-placeholder,var(--dsw-alias-label-caption,#8a8f98))!important;font-style:italic;opacity:.85}'\r\n\r\nexport function applySettingsOverrides(op: number): void {\r\n // Always written explicitly (including 100%) — removing them would make\r\n // SETTINGS_STYLE_RULE fall back to the body layer tokens that\r\n // applyCustomTokens rewrites with the homepage card alpha.\r\n const [h, s, l] = rColor()\r\n const tokens = genTokens(h, s, l).tokens\r\n const layer1 = tokens['--dsw-alias-bg-layer-1']\r\n const layer2 = tokens['--dsw-alias-bg-layer-2']\r\n const layer3 = tokens['--dsw-alias-bg-layer-3']\r\n if (layer2 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-bg-settings-surface', toRgba(layer2, op))\r\n }\r\n // Dialog-scoped layer overrides consumed by SETTINGS_STYLE_RULE; opacity\r\n // follows the settings slider only (the card slider reaches panels via blur).\r\n if (layer1 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-bg-settings-layer-1', toRgba(layer1, op))\r\n }\r\n if (layer2 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-bg-settings-layer-2', toRgba(layer2, op))\r\n }\r\n if (layer3 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-bg-settings-layer-3', toRgba(layer3, op))\r\n }\r\n}\r\n\r\n// ── Trajectory view opacity ──────────────────────────────────────────────\r\n// The trajectory view's own panels fully cover the root, so retinting only the\r\n// root background is invisible. Re-scope the view root's layer tokens to\r\n// plugin-owned variables so every surface follows the trajectory slider.\r\nexport const TRAJECTORY_STYLE_RULE =\r\n '[data-conversation-composer-overlay]{' +\r\n // No fallback inside var(): a self-referential fallback would be a cycle.\r\n '--dsw-alias-bg-layer-1:var(--dsh-any-traj-layer-1);' +\r\n '--dsw-alias-bg-layer-2:var(--dsh-any-traj-layer-2);' +\r\n '--dsw-alias-bg-layer-3:var(--dsh-any-traj-layer-3)}'\r\n\r\nexport function applyTrajectoryOverrides(op: number): void {\r\n // Always written explicitly so the view stays owned by this slider at 100%.\r\n const [h, s, l] = rColor()\r\n const tokens = genTokens(h, s, l).tokens\r\n const layer1 = tokens['--dsw-alias-bg-layer-1']\r\n const layer2 = tokens['--dsw-alias-bg-layer-2']\r\n const layer3 = tokens['--dsw-alias-bg-layer-3']\r\n if (layer1 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-traj-layer-1', toRgba(layer1, op))\r\n }\r\n if (layer2 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-traj-layer-2', toRgba(layer2, op))\r\n }\r\n if (layer3 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-traj-layer-3', toRgba(layer3, op))\r\n }\r\n}\r\n\r\n// ── File-preview panel (right sidebar) ────────────────────────────────────\r\n// Clicking a file opens the host's right panel, whose visible surface is painted\r\n// from `background: var(--dsw-alias-bg-base)` — the exact token the\r\n// main-background slider re-emits with its own alpha. The panel was therefore a\r\n// second, unnamed copy of the main background with no control of its own; this\r\n// card takes it over, on whichever element the host paints that surface.\r\n//\r\n// dsh 0.1.7 moved the paint off the panel: the container lost its background and\r\n// became the slide / fullscreen viewport, and it stays mounted at its full width\r\n// for the whole session — collapsing it only slides the dock out (`transform` +\r\n// `visibility`, never `display`). A surface (plus a backdrop-filter) written on\r\n// that container therefore covers the empty right half of the frame even with\r\n// the panel closed, which is the permanent frosted plate 0.1.7 shows. The dock's\r\n// own tab hosts are what the host paints now, so the card follows them:\r\n//\r\n// 0.1.7+ the dock's tab hosts — `[data-dockkit-content]` (and the\r\n// `[data-dockkit-empty]` seat of an empty pane), painted by the host\r\n// from the same token and hidden with `visibility`, so the card rides\r\n// the host's own open/close and slide transitions for free. Floating\r\n// panes are excluded exactly as the host excludes them.\r\n// older the panel itself, which used to carry that background on its hashed\r\n// class. `:has()` keeps the two apart, so the alpha is never painted\r\n// twice over on a 0.1.7 host.\r\n//\r\n// The selectors use data attributes (not the hashed CSS-module classes) and\r\n// `!important` outranks the host's class rule. The `var()` fallback keeps the\r\n// host's own value until a rule with a color supplies one, so a color-less rule\r\n// changes nothing here.\r\n//\r\n// backdrop-filter stays on the container — that is where this card has always\r\n// put it, and it keeps the panel to a single filter pass — but only while the\r\n// panel is open: an always-on filter is what turned the collapsed panel into a\r\n// plate.\r\nexport const RIGHTBAR_STYLE_RULE =\r\n 'div[data-sidebar-right-panel]:not(:has([data-dockkit-content],[data-dockkit-empty]))[data-sidebar-right-open],' +\r\n 'div[data-sidebar-right-panel] [data-dockkit-content]:not([data-dockkit-float]),' +\r\n 'div[data-sidebar-right-panel] [data-dockkit-empty]{' +\r\n 'background:var(--dsh-any-bg-rightbar,var(--dsw-alias-bg-base))!important}' +\r\n 'div[data-sidebar-right-panel][data-sidebar-right-open]{' +\r\n '-webkit-backdrop-filter:var(--dsh-any-blur-rightbar,none);' +\r\n 'backdrop-filter:var(--dsh-any-blur-rightbar,none)}'\r\n\r\n/** Paint the file-preview panel's surface from its own slider. */\r\nexport function applyRightbarOverrides(op: number): void {\r\n const root = document.documentElement\r\n // With no rule color the plugin owns no palette at all, so the panel must fall\r\n // back to the host's own --dsw-alias-bg-base rather than to ours.\r\n if (!rHasColor()) { root.style.removeProperty('--dsh-any-bg-rightbar'); return }\r\n const [h, s, l] = rColor()\r\n const base = genTokens(h, s, l).tokens['--dsw-alias-bg-base']\r\n if (base !== undefined) root.style.setProperty('--dsh-any-bg-rightbar', toRgba(base, op))\r\n}\r\n\r\n/** Extra backdrop frost for the file-preview panel (0 = no frost of its own). */\r\nfunction applyRightbarBlur(px: number): void {\r\n if (px > 0) document.documentElement.style.setProperty('--dsh-any-blur-rightbar', `blur(${px}px)`)\r\n else document.documentElement.style.removeProperty('--dsh-any-blur-rightbar')\r\n}\r\n\r\n// ── Per-part interface blur ───────────────────────────────────────────────────\r\n// The AppFrame columns use hashed CSS-module classes, so parts are located\r\n// structurally: the shell overlay carries a stable data attribute and the\r\n// sidebar/center/details columns are its three preceding siblings.\r\n//\r\n// backdrop-filter must NEVER go directly on a host part: it turns the element\r\n// into a containing block for fixed-positioned descendants, which would trap\r\n// the host's settings dialog inside the column. Each blurred part carries an\r\n// isolated ::before underlay holding the backdrop-filter instead.\r\nlet frameEl: HTMLElement | null = null\r\nlet sidebarEl: HTMLElement | null = null\r\nlet centerEl: HTMLElement | null = null\r\nlet detailsEl: HTMLElement | null = null\r\n\r\nconst PART_BLUR_CLASS = 'dab-part-blur'\r\nconst PART_UNDERLAY_CLASS = 'dab-part-underlay'\r\nconst PART_BLUR_RULE =\r\n `${PART_BLUR_CLASS}{isolation:isolate}` +\r\n `.${PART_UNDERLAY_CLASS}{position:absolute;inset:0;z-index:-1;pointer-events:none;border-radius:inherit;` +\r\n `backdrop-filter:var(--dsh-any-part-blur,none);-webkit-backdrop-filter:var(--dsh-any-part-blur,none)}`\r\n\r\nlet partBlurStyleEl: HTMLStyleElement | null = null\r\n\r\nfunction ensurePartBlurStyle(): void {\r\n if (partBlurStyleEl?.isConnected) return\r\n partBlurStyleEl = document.createElement('style')\r\n partBlurStyleEl.dataset.plugin = 'dsh-background-by-model-parts'\r\n partBlurStyleEl.textContent = PART_BLUR_RULE\r\n document.head.appendChild(partBlurStyleEl)\r\n}\r\n\r\nfunction discoverParts(): void {\r\n const overlay = document.querySelector<HTMLElement>('[data-shell-overlay]')\r\n if (overlay === null) return\r\n const frame = overlay.parentElement\r\n if (frame === null) return\r\n frameEl = frame\r\n const idx = Array.from(frame.children).indexOf(overlay)\r\n sidebarEl = (frame.children[idx - 3] as HTMLElement | undefined) ?? null\r\n centerEl = (frame.children[idx - 2] as HTMLElement | undefined) ?? null\r\n detailsEl = (frame.children[idx - 1] as HTMLElement | undefined) ?? null\r\n}\r\n\r\nfunction setBlur(el: HTMLElement | null, px: number): void {\r\n if (el === null) return\r\n const underlay = el.querySelector<HTMLDivElement>(`:scope > .${PART_UNDERLAY_CLASS}`)\r\n if (px > 0) {\r\n ensurePartBlurStyle()\r\n // The underlay is position:absolute and needs a positioned host: static\r\n // columns get relative (a layout no-op for flex items) that is restored on\r\n // clear; parts the host already positions keep their own scheme.\r\n if (!el.classList.contains(PART_BLUR_CLASS) && getComputedStyle(el).position === 'static') {\r\n el.style.position = 'relative'\r\n el.setAttribute('data-dab-pos-patched', '1')\r\n }\r\n el.classList.add(PART_BLUR_CLASS)\r\n if (underlay === null) {\r\n const node = document.createElement('div')\r\n node.className = PART_UNDERLAY_CLASS\r\n el.prepend(node)\r\n }\r\n el.style.setProperty('--dsh-any-part-blur', `blur(${px}px)`)\r\n } else {\r\n el.classList.remove(PART_BLUR_CLASS)\r\n el.style.removeProperty('--dsh-any-part-blur')\r\n underlay?.remove()\r\n if (el.getAttribute('data-dab-pos-patched') === '1') {\r\n el.style.removeProperty('position')\r\n el.removeAttribute('data-dab-pos-patched')\r\n }\r\n }\r\n}\r\n\r\nfunction applySettingsBlur(px: number): void {\r\n if (px > 0) document.documentElement.style.setProperty('--dsh-any-blur-settings', `blur(${px}px)`)\r\n else document.documentElement.style.removeProperty('--dsh-any-blur-settings')\r\n}\r\n\r\n/** Apply the main-background opacity to the center/details columns instead of\r\n * the frame. The frame's translucent bg-base sits UNDER the sidebar, so\r\n * reducing the main-bg opacity stacked a second alpha onto the sidebar; moving\r\n * the alpha onto the columns keeps the sidebar owned by its own slider. */\r\nfunction applyPartOpacities(ops: PartOpacities): void {\r\n if (!rHasColor()) return\r\n discoverParts()\r\n if (frameEl === null) return\r\n const [h, s, l] = rColor()\r\n const base = genTokens(h, s, l).tokens['--dsw-alias-bg-base']\r\n frameEl.style.background = 'transparent'\r\n if (centerEl !== null) centerEl.style.background = base !== undefined ? toRgba(base, ops.bg) : 'transparent'\r\n if (detailsEl !== null) detailsEl.style.background = base !== undefined ? toRgba(base, ops.bg) : 'transparent'\r\n}\r\n\r\n/** Blur of the option panels inside the settings dialog (.dab-card), owned by\r\n * the \"dialog option panel\" (card) blur slider. Written as a plugin-owned\r\n * variable consumed by SETTINGS_STYLE_RULE — deliberately NOT applied to the\r\n * homepage center/details columns, which this slider must never touch. */\r\nfunction applyCardPanelsBlur(px: number): void {\r\n if (px > 0) document.documentElement.style.setProperty('--dsh-any-blur-card-panels', `blur(${px}px)`)\r\n else document.documentElement.style.removeProperty('--dsh-any-blur-card-panels')\r\n}\r\n\r\n/** Apply per-part interface blur to the AppFrame columns + settings panel. */\r\nexport function applyPartBlurs(blurs: PartBlurs): void {\r\n discoverParts()\r\n // The bg blur frosts the wallpaper behind the main content columns (center +\r\n // details); the frame itself stays unblurred so the sidebar is never\r\n // double-frosted by both the bg and sidebar sliders.\r\n setBlur(frameEl, 0)\r\n setBlur(sidebarEl, blurs.sidebar)\r\n setBlur(centerEl, blurs.bg)\r\n setBlur(detailsEl, blurs.bg)\r\n applyCardPanelsBlur(blurs.card)\r\n applySettingsBlur(blurs.settings)\r\n applyInputBlur(blurs.input)\r\n applyRightbarBlur(blurs.rightbar)\r\n applyViewCards()\r\n}\r\n\r\n/** Live per-part blur update during slider drag (no full re-apply). */\r\nexport function setPartBlur(part: keyof PartBlurs, v: number): void {\r\n if (part === 'settings') { applySettingsBlur(v); return }\r\n if (part === 'card') { applyCardPanelsBlur(v); return }\r\n if (part === 'input') { applyInputBlur(v); return }\r\n if (part === 'rightbar') { applyRightbarBlur(v); return }\r\n if (part === 'chat' || part === 'trajectory') { applyViewCards(); return }\r\n discoverParts()\r\n if (part === 'bg') { setBlur(centerEl, v); setBlur(detailsEl, v) }\r\n else setBlur(sidebarEl, v)\r\n}\r\n\r\n// ── Conversation view treatments ────────────────────────────────────\r\n// The chat message column is styled as a real card (layer-1 surface + border +\r\n// 16px radius + 18px padding); the trajectory view gets NO card decoration —\r\n// its own panels fully cover the view root, so its opacity slider re-scopes the\r\n// layer tokens inside the view and its blur frosts the backdrop through the\r\n// standard root underlay.\r\n//\r\n// Host structure (deepseek-harness ui-conversation / ui-trajectory):\r\n// ConversationRoot\r\n// header — title + tabs, OUTSIDE the scrollport\r\n// [data-conversation-scroll] — the single scrollport\r\n// [data-chat-flow] ← chat column (flow content, NOT scrollable)\r\n// [data-conversation-composer-overlay] ← trajectory view root\r\n// [data-composer-seat] — sticky composer, a sibling\r\n// Cards are ALWAYS styled once their host exists — sliders at zero only turn\r\n// surface/border transparent, so the layout never reflows and the view cannot\r\n// jump when a slider leaves zero. Removal happens only at plugin teardown.\r\ninterface ViewCardSpec {\r\n sel: string\r\n mark: string\r\n /** Dataset key prefix holding the stashed pre-card inline values. */\r\n prev: string\r\n opacity: () => number\r\n blur: () => number\r\n /** Generic heuristic fallback (chat card only, hosts without the marker). */\r\n fallback?: boolean\r\n /** No card decoration — surfaces follow scoped layer tokens; only the blur\r\n * underlay is attached to the host element. */\r\n plain?: boolean\r\n}\r\n\r\nconst VIEW_CARDS: ViewCardSpec[] = [\r\n { sel: '[data-chat-flow]', mark: 'data-dab-chat-card', prev: 'dabChatPrev', opacity: rChatTextOpacity, blur: () => rBlurs().chat, fallback: true },\r\n { sel: '[data-conversation-composer-overlay]', mark: 'data-dab-traj-card', prev: 'dabTrajPrev', opacity: rTrajectoryOpacity, blur: () => rBlurs().trajectory, plain: true },\r\n]\r\n\r\nconst viewTargets: Array<HTMLElement | null> = VIEW_CARDS.map(() => null)\r\n\r\nfunction isScrollableY(el: HTMLElement): boolean {\r\n const oy = getComputedStyle(el).overflowY\r\n // 'overlay' covers Chromium's non-standard overflow value.\r\n return oy === 'auto' || oy === 'scroll' || oy === 'overlay'\r\n}\r\n\r\n/** Whether the subtree hosts the chat input (textarea / contenteditable /\r\n * textbox role) — used to keep the card off the input row. */\r\nfunction containsChatEditor(el: HTMLElement): boolean {\r\n return el.querySelector('textarea,[contenteditable=\"true\"],[contenteditable=\"\"],[contenteditable=\"plaintext-only\"],[role=\"textbox\"]') !== null\r\n}\r\n\r\n/** Walk down from a coarse candidate toward the actual message column. */\r\nfunction refineMessageColumn(start: HTMLElement): HTMLElement {\r\n let cur = start\r\n for (let depth = 0; depth < 10; depth++) {\r\n if (isScrollableY(cur)) break\r\n const kids = Array.from(cur.children).filter((k): k is HTMLElement => k instanceof HTMLElement)\r\n if (kids.length === 0) break\r\n const tallest = kids.reduce((a, b) => (b.clientHeight > a.clientHeight ? b : a))\r\n if (containsChatEditor(cur)) {\r\n const candidates = kids.filter(k => !containsChatEditor(k) && k.clientHeight >= cur.clientHeight * 0.4)\r\n if (candidates.length === 0) break\r\n cur = candidates.reduce((a, b) => (b.clientHeight > a.clientHeight ? b : a))\r\n continue\r\n }\r\n if (kids.length > 1 && tallest.clientHeight >= cur.clientHeight * 0.85) { cur = tallest; continue }\r\n break\r\n }\r\n return cur\r\n}\r\n\r\nfunction discoverViewTarget(idx: number, spec: ViewCardSpec): HTMLElement | null {\r\n if (centerEl === null || !document.body.contains(centerEl)) { viewTargets[idx] = null; return null }\r\n // The host marker always wins over a cached fallback (the view may not be\r\n // mounted yet when the plugin applies early).\r\n const marked = centerEl.querySelector<HTMLElement>(spec.sel)\r\n const cached = viewTargets[idx]\r\n if (marked !== null) {\r\n if (cached !== null && cached !== marked) { setBlur(cached, 0); restoreCardHost(cached, spec.mark, spec.prev, spec.plain === true) }\r\n viewTargets[idx] = marked\r\n return marked\r\n }\r\n if (cached !== null && centerEl.contains(cached)) return cached\r\n viewTargets[idx] = null\r\n if (spec.fallback !== true) return null\r\n // On the harness, an absent [data-chat-flow] just means the chat view is not\r\n // mounted (hero phase, trajectory tab) — settling on the whole scrollport\r\n // there would wrap the entire page in the card.\r\n if (centerEl.querySelector('[data-conversation-scroll]') !== null) return null\r\n // Marker-less hosts keep their layout until a slider moves.\r\n if (spec.opacity() <= 0 && spec.blur() <= 0) return null\r\n let best: HTMLElement | null = null\r\n let bestArea = 0\r\n for (const el of Array.from(centerEl.querySelectorAll<HTMLElement>('*'))) {\r\n if (!isScrollableY(el)) continue\r\n if (el.clientHeight < centerEl.clientHeight * 0.35) continue\r\n const area = el.clientWidth * el.clientHeight\r\n if (area > bestArea) { bestArea = area; best = el }\r\n }\r\n if (best === null) {\r\n for (const el of Array.from(centerEl.children)) {\r\n if (!(el instanceof HTMLElement)) continue\r\n if (el.clientHeight < centerEl.clientHeight * 0.5) continue\r\n if (el.clientHeight > (best?.clientHeight ?? 0)) best = el\r\n }\r\n }\r\n const refined = best !== null ? refineMessageColumn(best) : null\r\n viewTargets[idx] = refined\r\n return refined\r\n}\r\n\r\n/** Stash the host's own inline values so teardown restores them exactly. */\r\nfunction stashCardPrev(el: HTMLElement, prev: string, plain: boolean): void {\r\n const ds = el.dataset as Record<string, string | undefined>\r\n ds[prev + 'Bg'] = el.style.getPropertyValue('background')\r\n if (plain) return\r\n ds[prev + 'Border'] = el.style.getPropertyValue('border')\r\n ds[prev + 'Radius'] = el.style.getPropertyValue('border-radius')\r\n ds[prev + 'Padding'] = el.style.getPropertyValue('padding')\r\n}\r\n\r\n/** Undo the inline styling, restoring the host's previous inline values. */\r\nfunction restoreCardHost(el: HTMLElement, mark: string, prev: string, plain: boolean): void {\r\n if (!el.hasAttribute(mark)) return\r\n const ds = el.dataset as Record<string, string | undefined>\r\n const restore = (prop: string, v: string | undefined): void => {\r\n if (v !== undefined && v !== '') el.style.setProperty(prop, v)\r\n else el.style.removeProperty(prop)\r\n }\r\n restore('background', ds[prev + 'Bg'])\r\n if (!plain) {\r\n restore('border', ds[prev + 'Border'])\r\n restore('border-radius', ds[prev + 'Radius'])\r\n restore('padding', ds[prev + 'Padding'])\r\n delete ds[prev + 'Border']; delete ds[prev + 'Radius']; delete ds[prev + 'Padding']\r\n }\r\n delete ds[prev + 'Bg']\r\n el.removeAttribute(mark)\r\n}\r\n\r\n/** Teardown only: strip every view treatment and hand the hosts back untouched. */\r\nfunction removeViewCards(): void {\r\n VIEW_CARDS.forEach((spec, i) => {\r\n const el = viewTargets[i]\r\n if (el !== null) { setBlur(el, 0); restoreCardHost(el, spec.mark, spec.prev, spec.plain === true) }\r\n viewTargets[i] = null\r\n })\r\n}\r\n\r\n// ── Wide markdown tables ──────────────────────────────────────────────────────\r\n// DSH intentionally lets `.md-table-wide` bleed outside the text column. That\r\n// bleed only becomes visible once the chat surface gains a visible border, i.e.\r\n// when the chat region opacity or blur is non-zero. Under that same condition,\r\n// pull the table back inside the column and let it scroll horizontally.\r\nconst TABLE_FIX_RULE = [\r\n '.md-table-wide {',\r\n ' --dsh-table-spare: 0px !important;',\r\n ' --dsh-table-lead: 0px !important;',\r\n ' box-sizing: border-box !important;',\r\n ' width: 100% !important;',\r\n ' max-width: 100% !important;',\r\n ' margin-left: 0 !important;',\r\n ' padding-left: 0 !important;',\r\n ' padding-bottom: 0 !important;',\r\n ' overflow-x: auto !important;',\r\n '}',\r\n].join('\\n')\r\nlet tableFixStyleEl: HTMLStyleElement | null = null\r\n\r\n/** Toggle the wide-table clamp according to the chat region's opacity & blur. */\r\nfunction syncTableFix(): void {\r\n const needed = rChatTextOpacity() > 0 || rBlurs().chat > 0\r\n if (!needed) {\r\n if (tableFixStyleEl !== null) { tableFixStyleEl.remove(); tableFixStyleEl = null }\r\n return\r\n }\r\n if (tableFixStyleEl === null) {\r\n tableFixStyleEl = document.createElement('style')\r\n tableFixStyleEl.dataset.plugin = 'dsh-background-by-model-table-fix'\r\n tableFixStyleEl.textContent = TABLE_FIX_RULE\r\n }\r\n if (!tableFixStyleEl.isConnected) document.head.appendChild(tableFixStyleEl)\r\n}\r\n\r\n/** Re-derive the conversation view cards from the current config. */\r\nexport function applyViewCards(): void {\r\n discoverParts()\r\n if (centerEl === null) return\r\n const [h, s, l] = rColor()\r\n const surface = genTokens(h, s, l).tokens['--dsw-alias-bg-layer-1']\r\n VIEW_CARDS.forEach((spec, i) => {\r\n const target = discoverViewTarget(i, spec)\r\n if (target === null) return\r\n const plain = spec.plain === true\r\n const opacity = spec.opacity()\r\n const blurPx = spec.blur()\r\n if (!plain) {\r\n if (!target.hasAttribute(spec.mark)) stashCardPrev(target, spec.prev, false)\r\n // Mirrors .dab-card (layer-1 background, border, 16px radius, 18px\r\n // padding), written inline so it wins over host stylesheets; the opacity\r\n // slider drives surface alpha and fades the border with it.\r\n const borderAlpha = opacity > 0 ? Math.min(1, opacity * 1.5) : (blurPx > 0 ? 0.35 : 0)\r\n target.style.background = surface !== undefined ? toRgba(surface, opacity) : 'transparent'\r\n target.style.border = surface !== undefined ? `1px solid ${toRgba(surface, borderAlpha)}` : '1px solid transparent'\r\n target.style.borderRadius = '16px'\r\n target.style.padding = '18px'\r\n }\r\n // Plain views write no inline styles — only the blur underlay is hosted here.\r\n target.setAttribute(spec.mark, '1')\r\n setBlur(target, blurPx)\r\n })\r\n syncTableFix()\r\n}\r\n\r\nlet partsObserver: MutationObserver | null = null\r\n\r\n/** Watch for the AppFrame mounting so persisted blurs land even when the shell\r\n * renders after this plugin's apply. */\r\nexport function watchParts(): void {\r\n if (partsObserver !== null || typeof MutationObserver === 'undefined') return\r\n partsObserver = new MutationObserver(() => {\r\n if (frameEl !== null && sidebarEl !== null && centerEl !== null && detailsEl !== null && document.body.contains(frameEl)\r\n // Keep re-applying while any card host is absent or was swapped by the host.\r\n && viewTargets.every(el => el !== null && document.body.contains(el))) return\r\n applyPartBlurs(rBlurs())\r\n applyPartOpacities(rOps())\r\n })\r\n partsObserver.observe(document.body, { childList: true, subtree: true })\r\n}\r\n\r\nexport function stopWatchingParts(): void {\r\n partsObserver?.disconnect()\r\n partsObserver = null\r\n}\r\n\r\n// ── Theme-reset watchdog ──────────────────────────────────────────────────\r\n// The host re-asserts its own :root/body scheme rules on mount, on settings\r\n// adoption and after the plugin's startup assertion, toggling the\r\n// `data-ds-dark-theme` attribute off / to a host value — which would paint a\r\n// frame of light surfaces. Watch that flag and, whenever the plugin's own\r\n// value disappears, re-set it and re-emit the token stylesheet within the same\r\n// frame.\r\nlet themeObserver: MutationObserver | null = null\r\nlet themeRaf = 0\r\n\r\nfunction reassertScheme(): void {\r\n const [, , l] = rColor()\r\n if (l < 0.55) document.body.setAttribute('data-ds-dark-theme', 'dsh-background-by-model')\r\n else document.body.removeAttribute('data-ds-dark-theme')\r\n applyCustomTokens(rOps())\r\n}\r\n\r\n/** Re-assert the plugin's forced scheme whenever the host strips it, so a\r\n * refresh / cold-load / set-change never flashes a light frame. */\r\nexport function watchThemeResets(): () => void {\r\n if (themeObserver !== null || typeof MutationObserver === 'undefined') return () => undefined\r\n themeObserver = new MutationObserver(() => {\r\n if (document.body.getAttribute('data-ds-dark-theme') === 'dsh-background-by-model') return\r\n if (!rHasColor()) return\r\n if (themeRaf !== 0) return\r\n themeRaf = requestAnimationFrame(() => {\r\n themeRaf = 0\r\n if (document.body.getAttribute('data-ds-dark-theme') === 'dsh-background-by-model') return\r\n reassertScheme()\r\n })\r\n })\r\n themeObserver.observe(document.body, { attributes: true, attributeFilter: ['data-ds-dark-theme'] })\r\n themeObserver.observe(document.documentElement, { attributes: true, attributeFilter: ['data-ds-dark-theme'] })\r\n return () => {\r\n themeObserver?.disconnect()\r\n themeObserver = null\r\n }\r\n}\r\n\r\n// ── Wallpaper layer: two stacked layers, cross-faded on a rule switch ───────\r\n// The incoming image fades in ON TOP of the outgoing one at full opacity.\r\n// Fading the old one out at the same time would drop the composite below full\r\n// alpha at the midpoint — both images half transparent — and the interface\r\n// behind would flash through.\r\n//\r\n// A layer addresses its image by OBJECT URL (see displayImageOf in state):\r\n// assigning a `url(data:…)` background re-decodes the photo on every switch,\r\n// which is where a large wallpaper's stall comes from, while a blob URL is\r\n// served from the browser's memory cache after the first load.\r\nconst FADE_MS = 320\r\n\r\ninterface WpLayer {\r\n el: HTMLDivElement\r\n /** Display URL of the image painted on this layer; null when empty. */\r\n url: string | null\r\n}\r\n\r\nlet layers: [WpLayer, WpLayer] | null = null\r\n/** Index of the layer the user is looking at. */\r\nlet front = 0\r\n/** Index of the layer fading in right now, if any. */\r\nlet pending: 0 | 1 | null = null\r\nlet fadeTimer: number | null = null\r\n\r\nfunction createLayer(): WpLayer {\r\n const el = document.createElement('div')\r\n el.dataset.dabWpLayer = ''\r\n el.style.cssText = 'position:absolute;inset:0;opacity:0;background-repeat:no-repeat;background-position:center;'\r\n return { el, url: null }\r\n}\r\n\r\nfunction ensureWpContainer(): void {\r\n if (wpEl !== null && layers !== null && document.body.contains(wpEl)) return\r\n if (fadeTimer !== null) { window.clearTimeout(fadeTimer); fadeTimer = null }\r\n const a = createLayer()\r\n const b = createLayer()\r\n wpEl = document.createElement('div')\r\n wpEl.dataset.dabWp = ''\r\n wpEl.style.cssText = 'position:fixed;inset:0;z-index:-1;pointer-events:none;overflow:hidden;'\r\n wpEl.append(a.el, b.el)\r\n layers = [a, b]\r\n front = 0\r\n pending = null\r\n document.body.prepend(wpEl)\r\n}\r\n\r\n/** Drop the whole wallpaper layer (no rule carries an image). */\r\nfunction dropWpContainer(): void {\r\n if (fadeTimer !== null) { window.clearTimeout(fadeTimer); fadeTimer = null }\r\n pending = null\r\n front = 0\r\n layers = null\r\n wpEl?.remove()\r\n wpEl = null\r\n}\r\n\r\n/** Release one layer's image — the layer is fully covered when this is called. */\r\nfunction clearLayer(l: WpLayer): void {\r\n if (l.url === null) return\r\n l.url = null\r\n l.el.style.backgroundImage = ''\r\n l.el.style.backgroundSize = ''\r\n l.el.style.backgroundPosition = ''\r\n}\r\n\r\n/** Intrinsic-size cache for the center mode (native pixels of the current image). */\r\nlet imgNat: { url: string; w: number; h: number } | null = null\r\nfunction imageNatSize(url: string, cb: (w: number, h: number) => void): void {\r\n if (imgNat !== null && imgNat.url === url) { cb(imgNat.w, imgNat.h); return }\r\n const img = new Image()\r\n img.onload = () => {\r\n imgNat = { url, w: img.naturalWidth, h: img.naturalHeight }\r\n cb(img.naturalWidth, img.naturalHeight)\r\n }\r\n img.onerror = () => cb(0, 0)\r\n img.src = url\r\n}\r\n\r\n/** Paint one layer's image and its placement. The placement always follows the\r\n * ACTIVE rule: the incoming layer is painted right after a switch, and a\r\n * repaint of the same URL (framing edit, viewport resize) must use the rule's\r\n * current framing. */\r\nfunction paintLayer(l: WpLayer, url: string): void {\r\n const el = l.el\r\n l.url = url\r\n const bg = rBgState()\r\n const mode = rBgMode()\r\n const next = `url(\"${url}\")`\r\n // Skip re-setting the same URL — a redundant assignment can flash the layer\r\n // blank for a frame while it is re-resolved.\r\n if (el.style.backgroundImage !== next) {\r\n el.style.backgroundImage = next\r\n }\r\n if (mode === 'fit') {\r\n el.style.backgroundRepeat = 'no-repeat'\r\n if (bg.iw > 0) {\r\n // Contain-fit at zoom with the image center pinned to the committed\r\n // fractional viewport point, so the framed region survives viewport changes.\r\n const fit = Math.min(window.innerWidth / bg.iw, window.innerHeight / bg.ih)\r\n const w = bg.iw * fit * bg.zoom\r\n const h = bg.ih * fit * bg.zoom\r\n el.style.backgroundSize = `${w}px ${h}px`\r\n el.style.backgroundPosition = `${bg.x * window.innerWidth - w / 2}px ${bg.y * window.innerHeight - h / 2}px`\r\n } else {\r\n // Fresh image: match the editor's initial centered contain view.\r\n el.style.backgroundSize = 'contain'\r\n el.style.backgroundPosition = 'center'\r\n }\r\n } else if (mode === 'fill') {\r\n el.style.backgroundRepeat = 'no-repeat'\r\n el.style.backgroundSize = 'cover'\r\n el.style.backgroundPosition = 'center'\r\n } else if (mode === 'stretch') {\r\n el.style.backgroundRepeat = 'no-repeat'\r\n el.style.backgroundSize = '100% 100%'\r\n el.style.backgroundPosition = 'center'\r\n } else if (mode === 'tile') {\r\n el.style.backgroundRepeat = 'repeat'\r\n // background-size:auto resolves the intrinsic size per tile.\r\n el.style.backgroundSize = 'auto'\r\n el.style.backgroundPosition = '0px 0px'\r\n } else {\r\n // Center: native size, centered. The intrinsic size needs an async decode;\r\n // 'contain' keeps a sensible frame until it lands.\r\n el.style.backgroundRepeat = 'no-repeat'\r\n el.style.backgroundSize = 'contain'\r\n el.style.backgroundPosition = 'center'\r\n imageNatSize(url, (w, h) => {\r\n if (l.url !== url || el.style.backgroundImage !== next || rBgMode() !== 'center') return\r\n if (w > 0 && h > 0) {\r\n el.style.backgroundSize = `${w}px ${h}px`\r\n el.style.backgroundPosition = 'center'\r\n }\r\n })\r\n }\r\n}\r\n\r\n/** Whether a switch should animate: nothing to fade from, an invisible\r\n * wallpaper and a reduced-motion preference all switch instantly. */\r\nfunction canFade(from: WpLayer): boolean {\r\n if (from.url === null) return false\r\n if (rWop() <= 0.01) return false\r\n const mm = typeof window.matchMedia === 'function' ? window.matchMedia('(prefers-reduced-motion: reduce)') : null\r\n return mm === null || !mm.matches\r\n}\r\n\r\n/** End an in-flight fade: promote the incoming layer, free the one under it. */\r\nfunction finishFade(idx: 0 | 1): void {\r\n if (layers === null || pending !== idx) return\r\n if (fadeTimer !== null) { window.clearTimeout(fadeTimer); fadeTimer = null }\r\n pending = null\r\n front = idx\r\n const el = layers[idx].el\r\n // Re-asserted so a fade whose frames never ran (background tab) still ends on\r\n // the visible image.\r\n el.style.opacity = '1'\r\n el.style.willChange = ''\r\n // Covered from here on: drop its bytes so a second full-resolution image is\r\n // never left decoded behind the visible one.\r\n clearLayer(layers[idx === 0 ? 1 : 0])\r\n}\r\n\r\n/** Land an in-flight fade on its end state at once (another switch arrived). */\r\nfunction settleFade(): void {\r\n if (layers === null || pending === null) return\r\n const idx = pending\r\n if (fadeTimer !== null) { window.clearTimeout(fadeTimer); fadeTimer = null }\r\n pending = null\r\n front = idx\r\n const el = layers[idx].el\r\n el.style.transition = 'none'\r\n el.style.opacity = '1'\r\n el.style.willChange = ''\r\n clearLayer(layers[idx === 0 ? 1 : 0])\r\n}\r\n\r\n/** Abandon an in-flight fade: the layer it was leaving holds the wanted image. */\r\nfunction cancelFade(): void {\r\n if (layers === null || pending === null) return\r\n const idx = pending\r\n if (fadeTimer !== null) { window.clearTimeout(fadeTimer); fadeTimer = null }\r\n pending = null\r\n const el = layers[idx].el\r\n el.style.transition = 'none'\r\n el.style.opacity = '0'\r\n el.style.willChange = ''\r\n clearLayer(layers[idx])\r\n}\r\n\r\n/** Show `url` on the wallpaper layer, cross-fading from what it paints now. */\r\nfunction applyImageWp(url: string): void {\r\n ensureWpContainer()\r\n const ls = layers!\r\n if (pending !== null) {\r\n // A → B → A inside one fade: keep whichever layer already paints the wanted\r\n // image instead of queueing a third one.\r\n if (ls[pending].url === url) { paintLayer(ls[pending], url); applyWpEffects(); return }\r\n if (ls[front].url === url) { cancelFade(); paintLayer(ls[front], url); applyWpEffects(); return }\r\n settleFade()\r\n }\r\n if (ls[front].url === url) { paintLayer(ls[front], url); applyWpEffects(); return }\r\n const from = ls[front]\r\n const idx: 0 | 1 = front === 0 ? 1 : 0\r\n const target = ls[idx]\r\n const el = target.el\r\n // Rewind the incoming layer before its bytes land, so a stale image from an\r\n // earlier switch can never flash through while the new one rasterizes.\r\n el.style.transition = 'none'\r\n el.style.opacity = '0'\r\n el.style.zIndex = '1'\r\n from.el.style.zIndex = '0'\r\n paintLayer(target, url)\r\n applyWpEffects()\r\n if (!canFade(from)) {\r\n el.style.opacity = '1'\r\n front = idx\r\n clearLayer(from)\r\n return\r\n }\r\n // will-change promotes the layer in this frame, so the fade itself is a pure\r\n // compositor animation that survives the main-thread work a switch triggers\r\n // (theme re-registration, token rewrite, settings-panel re-render).\r\n el.style.willChange = 'opacity'\r\n pending = idx\r\n requestAnimationFrame(() => {\r\n if (pending !== idx || layers === null) return\r\n el.style.transition = `opacity ${FADE_MS}ms ease`\r\n el.style.opacity = '1'\r\n })\r\n fadeTimer = window.setTimeout(() => finishFade(idx), FADE_MS + 160)\r\n}\r\n\r\nfunction applyWpEffects(): void {\r\n if (wpEl === null || layers === null) return\r\n wpEl.style.opacity = String(rWop())\r\n // The blur sits on each LAYER rather than on the container: with the filter on\r\n // the parent, every frame of an opacity fade would re-run a full-screen blur\r\n // instead of just re-compositing the blurred surface.\r\n const blur = rBl()\r\n const filter = blur > 0 ? `blur(${blur}px)` : ''\r\n layers[0].el.style.filter = filter\r\n layers[1].el.style.filter = filter\r\n}\r\n\r\n/** Repaint the wallpaper layer, the token palette and every interface part from\r\n * the ACTIVE rule. This is the single entry point a rule switch goes through. */\r\nexport function applyWp(): void {\r\n const url = rWp()\r\n if (url) {\r\n applyImageWp(url)\r\n } else if (wpEl !== null) {\r\n // No background: tear down the layer but keep tokens/blur intact.\r\n dropWpContainer()\r\n }\r\n if (rHasColor()) {\r\n applyCustomTokens(rOps())\r\n applySettingsOverrides(rSop())\r\n applyTrajectoryOverrides(rTrajectoryOpacity())\r\n } else {\r\n // A rule without a saved color means \"use the system theme\" — drop the\r\n // plugin's overrides so the host palette shows through.\r\n clearCustomTokens()\r\n document.body.removeAttribute('data-ds-dark-theme')\r\n baseTokenKey = ''\r\n lastBgKey = ''\r\n }\r\n // Self-guarding: writes the panel's own surface only while a color rule is\r\n // active, and hands the panel back to the host token otherwise.\r\n applyRightbarOverrides(rRightbarOpacity())\r\n applyPartBlurs(rBlurs())\r\n}\r\n\r\nexport function teardownWp(): void {\r\n dropWpContainer()\r\n clearCustomTokens()\r\n tokenStyleEl?.remove(); tokenStyleEl = null\r\n removeViewCards()\r\n document.body.removeAttribute('data-ds-dark-theme')\r\n document.body.style.removeProperty('color-scheme')\r\n document.documentElement.style.removeProperty('--dsh-any-bg-settings-surface')\r\n document.documentElement.style.removeProperty('--dsh-any-bg-settings-layer-1')\r\n document.documentElement.style.removeProperty('--dsh-any-bg-settings-layer-2')\r\n document.documentElement.style.removeProperty('--dsh-any-bg-settings-layer-3')\r\n document.documentElement.style.removeProperty('--dsh-any-traj-layer-1')\r\n document.documentElement.style.removeProperty('--dsh-any-traj-layer-2')\r\n document.documentElement.style.removeProperty('--dsh-any-traj-layer-3')\r\n document.documentElement.style.removeProperty('--dsh-any-blur-settings')\r\n document.documentElement.style.removeProperty('--dsh-any-blur-card-panels')\r\n document.documentElement.style.removeProperty('--dsh-any-input-blur')\r\n document.documentElement.style.removeProperty('--dsh-any-bg-rightbar')\r\n document.documentElement.style.removeProperty('--dsh-any-blur-rightbar')\r\n for (const v of Object.values(OPACITY_VARS)) document.documentElement.style.removeProperty(v)\r\n baseTokenKey = ''\r\n lastBgKey = ''\r\n if (tokensRaf !== null) { cancelAnimationFrame(tokensRaf); tokensRaf = null }\r\n pendingOps = null\r\n tableFixStyleEl?.remove(); tableFixStyleEl = null\r\n setBlur(frameEl, 0); setBlur(sidebarEl, 0); setBlur(centerEl, 0); setBlur(detailsEl, 0)\r\n if (frameEl !== null) frameEl.style.removeProperty('background')\r\n if (centerEl !== null) centerEl.style.removeProperty('background')\r\n if (detailsEl !== null) detailsEl.style.removeProperty('background')\r\n stopWatchingParts()\r\n}\r\n\r\n/** Live wallpaper-opacity updates during slider drag (no full re-apply). */\r\nexport function setWpOpacity(v: number): void {\r\n if (wpEl) wpEl.style.opacity = String(v)\r\n}\r\n\r\n/** Live wallpaper-blur updates during slider drag (no full re-apply). */\r\nexport function setWpBlur(v: number): void {\r\n if (layers === null) return\r\n const filter = v > 0 ? `blur(${v}px)` : ''\r\n layers[0].el.style.filter = filter\r\n layers[1].el.style.filter = filter\r\n}\r\n","/**\n * Model → rule resolution.\n *\n * Two halves:\n * 1. `matchRule` — a pure function over the ordered rule list.\n * 2. `watchModel` — reports the current model whenever the session's durable\n * model selection changes.\n *\n * Sources, in the order they are consulted:\n *\n * a. **Which session is current** (`resolveMainSessionId` below) — the model is\n * read per session, so this hop answers before any other can. 0.1.7 moved it:\n * `sessions.list` stopped carrying a single `current` id, and the main view's\n * session is published by the `uiSession` service and marked by the list row\n * retained by `mainView`.\n * b. **The session's own durable model selection** —\n * `ctx.sessions.binding(id).session.projections.faceOf('modelSelection')`,\n * the same `{ lastUsed, next }` value the composer model seat and the\n * /model popup read. This is the authoritative per-session answer.\n * c. **`ctx.modelDirectories`** — the shared per-session directory\n * (ui-model-selection). It adds the provider-group catalog, so it is the\n * only source that can supply a display name, but it lives in that plugin's\n * own scope on some builds and is then invisible from here, hence optional.\n * d. **The host default model** — resolved by the CALLER as a last resort\n * (see index.tsx). It is a global default, NOT this session's selection, so\n * it is reported as `default` and the settings page says so.\n *\n * TIMING is load-bearing. `sessions` is published by the api-session-controller\n * client plugin, which this deployment loads AFTER this plugin's client bundle,\n * so `ctx.get('sessions')` is normally still undefined when `apply()` runs.\n * Giving up there — returning a no-op disposer — left the model pinned to the\n * host default for the whole session with nothing to retry it. The service is\n * now polled for until it appears, and `uiSession` (which can mount even later)\n * is picked up by the same poll because the session id is re-resolved on every\n * tick. Every hop reports a `note` when it cannot answer, so the settings page\n * can name the failing one instead of silently showing a value that is not this\n * session's model.\n */\nimport type {\n BgRule, Ctx, ModelDirectoryLike, ModelDirectoryResolverLike, ModelSelectionProjectionLike,\n ObservableFaceLike, SessionListSnapshotLike, SessionsServiceLike, UiSessionLike,\n} from './types'\n\n/** Rules that can actually paint: enabled and carrying an image slot. */\nfunction usable(rules: readonly BgRule[]): BgRule[] {\n return rules.filter(r => r.enabled && r.slot !== '')\n}\n\n/**\n * Resolve the rule for one model text.\n *\n * Top→bottom, first case-insensitive substring hit wins; an empty `match` never\n * hits on its own. When nothing hits, the FIRST usable rule is the fallback\n * (rule 1 deliberately doubles as both a matcher and the fallback).\n */\nexport function matchRule(\n rules: readonly BgRule[],\n modelText: string,\n): { rule: BgRule | null; matched: boolean } {\n const list = usable(rules)\n if (list.length === 0) return { rule: null, matched: false }\n const hay = modelText.toLowerCase()\n if (hay.trim() !== '') {\n for (const rule of list) {\n const needle = rule.match.trim().toLowerCase()\n if (needle === '') continue\n if (hay.includes(needle)) return { rule, matched: true }\n }\n }\n return { rule: list[0]!, matched: false }\n}\n\n/** Human-readable label of the model text an active rule matched against. */\nexport function modelLabelOf(text: string): string {\n const parts = text.split(/\\s+/).filter(p => p !== '')\n // The display name (last token, when the catalog provided one) reads best.\n return parts.length > 0 ? parts[parts.length - 1]! : ''\n}\n\n/** Look the current model's display name up in the shared catalog. */\nfunction displayNameOf(state: {\n groups?: ReadonlyArray<{ id?: string; models?: ReadonlyArray<{ id?: string; name?: string }> }>\n} | undefined, provider: string, model: string): string {\n if (model === '' || !Array.isArray(state?.groups)) return ''\n for (const group of state!.groups!) {\n if (group.id !== provider) continue\n for (const entry of group.models ?? []) {\n if (entry.id === model) return typeof entry.name === 'string' ? entry.name : ''\n }\n }\n return ''\n}\n\n/** Where the reported model text came from. */\nexport type ModelSource = 'session' | 'default'\n\n/**\n * Which hop could not answer when no per-session model was found. Surfaced in\n * the settings readout: without it, a broken hop is indistinguishable from\n * \"this session really is on the host default\".\n */\nexport type ModelNote = '' | 'no-service' | 'no-session' | 'no-projection' | 'empty-selection'\n\n/** How often to look for the sessions service that mounts after this plugin. */\nconst ATTACH_RETRY_MS = 400\n/** Stop looking after this many tries (~2 minutes). */\nconst ATTACH_RETRY_LIMIT = 300\n/** Safety re-read of every source, so a missed notification cannot pin a stale model. */\nconst POLL_MS = 1500\n\n/** One selection out of a `modelSelection` projection value. */\nfunction selectionOf(value: ModelSelectionProjectionLike | undefined): { provider: string; model: string } | null {\n const pick = value?.next ?? value?.lastUsed ?? null\n if (pick === null || typeof pick !== 'object') return null\n const provider = typeof pick.provider === 'string' ? pick.provider : ''\n const model = typeof pick.model === 'string' ? pick.model : ''\n if (provider === '' && model === '') return null\n return { provider, model }\n}\n\n/** A non-empty string id, or null. */\nfunction asId(value: unknown): string | null {\n return typeof value === 'string' && value !== '' ? value : null\n}\n\n/**\n * The id of the session the main view is showing.\n *\n * The model is read per session, so this hop has to answer before any of the\n * others can. 0.1.7 moved the answer: `sessions.list` stopped publishing a single\n * `current` id in favour of a row table (`ids` / `byId` / `phase`), and the main\n * view's session is now whatever holds a `mainView` retention — the same row the\n * host's own `uiSession.current` binding source is built from. Reading only\n * `list.current` therefore finds nothing on 0.1.7, and a plugin with no session\n * id can only ever fall back to rule 1: the background stops following the model.\n *\n * The hops are tried in order of authority and every one is optional, so this\n * answers on both host generations — and while `uiSession` is still mounting.\n */\nexport function resolveMainSessionId(\n uiCurrent: { key?: string } | undefined,\n snapshot: SessionListSnapshotLike | undefined,\n): string | null {\n // 0.1.7: the host's own answer, already resolved from list + retention.\n const fromUiSession = asId(uiCurrent?.key)\n if (fromUiSession !== null) return fromUiSession\n // ≤0.1.6: the list published the current id directly.\n const legacy = asId(snapshot?.current)\n if (legacy !== null) return legacy\n // 0.1.7 without `uiSession` yet: derive it from the retention the host uses.\n const byId = snapshot?.byId\n if (byId !== undefined && byId !== null) {\n for (const row of Object.values(byId)) {\n if ((row?.retainedBy?.mainView ?? 0) > 0) {\n const id = asId(row?.id)\n if (id !== null) return id\n }\n }\n }\n return null\n}\n\n/** Read `uiSession.current` (if that service is on this host) and resolve. */\nfunction mainSessionId(ctx: Ctx, list: ObservableFaceLike<SessionListSnapshotLike> | null): string | null {\n let uiCurrent: { key?: string } | undefined\n try {\n const ui = ctx.get('uiSession') as UiSessionLike | undefined\n uiCurrent = ui?.current?.getSnapshot?.()\n } catch {\n // Service absent (or not mounted yet) — the list retention below still answers.\n }\n return resolveMainSessionId(uiCurrent, list?.getSnapshot())\n}\n\n/**\n * Watch the current session's model selection.\n *\n * @param ctx - client root context.\n * @param onChange - called with the match text (provider + id + display name),\n * the best available label, which source answered, and — when nothing could be\n * read — the hop that failed.\n * @returns disposer.\n */\nexport function watchModel(\n ctx: Ctx,\n onChange: (text: string, label: string, source: ModelSource, note: ModelNote) => void,\n): () => void {\n let service: SessionsServiceLike | null = null\n let list: ObservableFaceLike<SessionListSnapshotLike> | null = null\n let offList: (() => void) | null = null\n let sessionId: string | null = null\n let directory: ModelDirectoryLike | null = null\n let offDirectory: (() => void) | null = null\n /** The session's own `modelSelection` projection face. */\n let projected: ObservableFaceLike<ModelSelectionProjectionLike> | null = null\n let offProjected: (() => void) | null = null\n let lastKey = '\\u0000'\n let poll: number | null = null\n let retry: number | null = null\n let retries = 0\n\n const release = (): void => {\n if (offDirectory !== null) { offDirectory(); offDirectory = null }\n if (offProjected !== null) { offProjected(); offProjected = null }\n directory = null\n projected = null\n }\n\n /** Bind the session's own durable model selection (the authoritative source). */\n const bindProjection = (id: string): void => {\n const svc = service\n if (svc === null) return\n try {\n let binding = typeof svc.binding === 'function' ? svc.binding(id) : undefined\n if (binding === undefined && typeof svc.scope === 'function') {\n // Materialize the scope, then resolve again: a session that is merely\n // listed has no binding yet.\n svc.scope(id)\n binding = typeof svc.binding === 'function' ? svc.binding(id) : undefined\n }\n const face = binding?.session?.projections?.faceOf?.('modelSelection')\n if (face === undefined || typeof face.subscribe !== 'function' || typeof face.getSnapshot !== 'function') return\n projected = face\n offProjected = face.subscribe(() => { emit(false) })\n } catch {\n projected = null\n offProjected = null\n }\n }\n\n const note = (): ModelNote => {\n if (service === null) return 'no-service'\n if (sessionId === null) return 'no-session'\n if (projected === null && directory === null) return 'no-projection'\n return 'empty-selection'\n }\n\n const emit = (force: boolean): void => {\n const state = directory?.store.getSnapshot()\n const fromDirectory = state?.current ?? null\n const sel = fromDirectory !== null\n ? { provider: fromDirectory.provider ?? '', model: fromDirectory.model ?? '' }\n : (() => {\n try { return selectionOf(projected?.getSnapshot()) } catch { return null }\n })()\n const provider = sel?.provider ?? ''\n const model = sel?.model ?? ''\n const name = displayNameOf(state, provider, model)\n const text = [provider, model, name].filter(p => p !== '').join(' ').trim()\n const noteValue: ModelNote = text === '' ? note() : ''\n const key = `${text}\\u0001${name}\\u0001${noteValue}`\n if (!force && key === lastKey) return\n lastKey = key\n onChange(text, name !== '' ? name : (model !== '' ? model : provider), 'session', noteValue)\n }\n\n const bind = (): void => {\n const id = mainSessionId(ctx, list)\n // Already bound to this session and holding at least one live source: only\n // refresh the value. A missing source keeps retrying on the poll below.\n if (id === sessionId && (directory !== null || projected !== null)) { emit(false); return }\n release()\n sessionId = id\n if (id !== null) {\n bindProjection(id)\n if (directory === null) {\n const directories = ctx.get('modelDirectories') as ModelDirectoryResolverLike | undefined\n if (directories !== undefined && typeof directories.directoryFor === 'function') {\n try {\n directory = directories.directoryFor(id)\n offDirectory = directory.store.subscribe(() => { emit(false) })\n // The advisory catalog (display names) loads lazily; a failure only\n // costs us the pretty name, never the match.\n const pending = directory.load?.()\n if (pending !== undefined && pending !== null && typeof (pending as Promise<unknown>).catch === 'function') {\n void (pending as Promise<unknown>).catch(() => undefined)\n }\n } catch {\n directory = null\n offDirectory = null\n }\n }\n }\n }\n // Forced: the sources may have appeared without the text changing (the host\n // default was showing and the session now agrees with it), and the settings\n // page must be able to correct its badge and its note.\n emit(true)\n }\n\n const stopRetry = (): void => {\n if (retry === null) return\n window.clearInterval(retry)\n retry = null\n }\n\n const tick = (): void => {\n if (list === null) return\n if (mainSessionId(ctx, list) !== sessionId || (directory === null && projected === null)) bind()\n else emit(false)\n }\n\n /**\n * Look the sessions service up. It arrives after this plugin's bundle on this\n * deployment, so the first attempt usually fails — which is exactly why this\n * is a retry loop rather than a one-shot lookup.\n */\n const attach = (): boolean => {\n const svc = ctx.get('sessions') as SessionsServiceLike | undefined\n if (svc === undefined || svc === null) return false\n const face = svc.list\n if (face === undefined || typeof face.subscribe !== 'function' || typeof face.getSnapshot !== 'function') return false\n service = svc\n list = face\n offList = face.subscribe(bind)\n if (poll === null) poll = window.setInterval(tick, POLL_MS)\n bind()\n return true\n }\n\n if (!attach()) {\n retry = window.setInterval(() => {\n retries++\n if (attach() || retries >= ATTACH_RETRY_LIMIT) stopRetry()\n }, ATTACH_RETRY_MS)\n }\n\n return () => {\n stopRetry()\n if (poll !== null) { window.clearInterval(poll); poll = null }\n if (offList !== null) { offList(); offList = null }\n service = null\n list = null\n release()\n }\n}\n","/**\n * The host contract this plugin depends on — declared exactly ONCE.\n *\n * This plugin does not own any of the surfaces it styles: it re-emits the host's\n * design tokens, hangs backdrop filters on the host's structural elements and\n * reads the host's session/model services. Every one of those touch points is a\n * *contract* with a dsh build, and dsh changes them between releases. Three real\n * bugs came out of exactly that, all of them silent (nothing threw — the\n * interface just stopped following the settings):\n *\n * --dsw-menu-surface-fill 0.1.7 split the menu fill in two: `--dsw-specific-menu`\n * stayed the overlay fill while the new\n * `--dsw-menu-surface-fill` became what the shared\n * MenuSurface material paints, with the former aliased\n * to the latter. Re-emitting only the old name left the\n * model picker's sticky provider rows on the host fill\n * and its panel on ours — the solid white band.\n * sessions.list.current 0.1.7 stopped publishing the current session id; the\n * main view's session moved to the `uiSession` service\n * and the row retained by `mainView`. Reading only\n * `current` finds nothing, so the background silently\n * stayed on rule 1 and never followed the model.\n * [data-dockkit-content] the right panel's surface moved off the panel\n * container (which now stays mounted at full width) and\n * onto the dock's tab hosts — the same rule then painted\n * a permanent frosted plate over the empty right half.\n *\n * The declarations below are that contract, written down so three consumers can\n * share them: the browser probe behind the \"Host check\" settings page, the node\n * half's support report, and the offline scan in `.dsh-debug/contract-scan.mjs`\n * that fails when a contract target disappears from the installed dsh packages.\n *\n * THIS MODULE MUST STAY ENVIRONMENT-FREE: no DOM, no Node, no Cordis. It is\n * imported by the browser bundle, by the node half and by a plain `node --test`.\n */\n\n/** Which generation of dsh a contract point first required. */\nexport type ContractSince = '<=0.1.6' | '0.1.7'\n\n/**\n * How much of the plugin dies with the contract.\n *\n * core the plugin cannot do its job at all (no model ⇒ no per-model rule)\n * looks the wallpaper/theme still work, a surface stops following the sliders\n * label only a nicer value is lost (a display name, a legacy alias)\n */\nexport type ContractCriticality = 'core' | 'looks' | 'label'\n\n/** What kind of host value a contract point names. */\nexport type ContractKind =\n | 'host-service'\n | 'dom-selector'\n | 'host-token'\n | 'host-attr'\n | 'host-style'\n | 'plugin-var'\n\n/** One check, evaluated in order against the live browser or the installed host. */\nexport type ContractCheck =\n /** A Cordis service resolves through `ctx.get(id)`. */\n | { kind: 'service'; id: string }\n /** A dotted path off that service resolves. */\n | { kind: 'path'; service: string; path: string; expect: 'function' | 'observable' | 'any' }\n /** `document.querySelector(selector)` finds (or must not find) an element. */\n | { kind: 'selector'; selector: string; optionalWhen?: string }\n /** An element carrying the attribute exists. */\n | { kind: 'attr'; attr: string; optionalWhen?: string }\n /** A custom property resolves to a non-empty computed value. */\n | { kind: 'computed'; token: string; on?: string }\n /** A style rule mentioning the token/attribute exists in a host stylesheet. */\n | { kind: 'rule'; match: string; hint?: string }\n\n/** A literal string plus the host file that must still contain it. */\nexport interface ContractSource {\n /**\n * Relative to `root`: a `dsh-client-ui-…/lib/client.js` path under the packages\n * scope, an asset filename under the served frontend's `dist/assets`, or a\n * `src/…` path of this plugin (the one contract whose other half is our own\n * stylesheet).\n *\n * `.` names the root directory itself: the literal is then searched across the\n * files in it, for targets whose FILE name is not stable (a hash-stamped\n * frontend bundle asset).\n */\n path: string\n /** `frontend` = the served `dsh-web-frontend/dist/assets`; default = the packages scope. */\n root?: 'frontend'\n /** The literal the host file must still contain. */\n literal: string\n}\n\n/** What user-visible behaviour breaks when the contract is gone. */\nexport interface ContractSymptom {\n /** The consequence, in one sentence. */\n en: string\n zh: string\n}\n\n/** One touch point with a dsh build. */\nexport interface HostContract {\n /** Stable id, used by the UI, the report and the scan. */\n id: string\n /** Grouping in the panel. */\n group: 'model' | 'surface' | 'token' | 'region'\n kind: ContractKind\n criticality: ContractCriticality\n since: ContractSince\n /** What it is, shown in the panel. */\n label: { en: string; zh: string }\n /** What breaks without it — shown when the check fails. */\n symptom: ContractSymptom\n /** The literal contract value (selector, token name, service id, attribute). */\n target: string\n /** Ordered checks; the first failure is the reported reason. */\n checks: ContractCheck[]\n /** Where the host defines it — absence from disk means it moved or was renamed. */\n sources: ContractSource[]\n /** `src/...` of this plugin that reads it, for the report. */\n usedBy: string\n}\n\n/**\n * The plugin's own CSS variables (never a host contract) — declared here so the\n * report can show which side of the interface each host token is driven from,\n * and so a token can never be read and written under two spellings.\n */\nexport const PLUGIN_TOKENS = [\n '--dsh-any-op-bg',\n '--dsh-any-op-sidebar',\n '--dsh-any-op-card-1',\n '--dsh-any-op-card-2',\n '--dsh-any-op-card-3',\n '--dsh-any-op-input',\n '--dsh-any-op-menu',\n '--dsh-any-op-menu-cordis',\n] as const\n\nconst SIDEBAR_RIGHT = 'dsh-client-ui-sidebar-right'\n\n/**\n * The contract table.\n *\n * Ordered by group and then by how visible a break is: the model hop first (the\n * plugin's whole purpose), then the surfaces it paints, then the tokens it\n * re-emits, then the regions it decorates.\n */\nexport const HOST_CONTRACTS: readonly HostContract[] = [\n // ── model: how this session's model is read ───────────────────────────────\n {\n id: 'sessions.list',\n group: 'model',\n kind: 'host-service',\n criticality: 'core',\n since: '0.1.7',\n label: { en: 'Session list service', zh: '会话列表服务' },\n symptom: {\n en: 'no session id can be read, so the background is stuck on rule 1 and never follows the model',\n zh: '读不到会话 id,背景会一直停在规则 1,不再跟着模型切换',\n },\n target: 'sessions.list',\n checks: [\n { kind: 'service', id: 'sessions' },\n { kind: 'path', service: 'sessions', path: 'list', expect: 'observable' },\n // The rows the resolver walks. `getSnapshot` is the only way to reach them,\n // and its VALUE is a runtime fact, not a contract — what is asserted here is\n // that the list is still readable.\n { kind: 'path', service: 'sessions', path: 'list.getSnapshot', expect: 'function' },\n ],\n sources: [{ path: 'dsh-api-session-controller/lib/client.js', literal: 'retainedBy' }],\n usedBy: 'src/client/modelbg.ts',\n },\n {\n id: 'sessions.list.current',\n group: 'model',\n kind: 'host-service',\n criticality: 'label',\n since: '<=0.1.6',\n label: {\n en: 'Session list: legacy current id',\n zh: '会话列表:旧版 current 字段',\n },\n symptom: {\n en: 'harmless on its own — the 0.1.7 hops below take over',\n zh: '本身无害 —— 0.1.7 上由下面的兜底路径接管',\n },\n target: 'list.current',\n checks: [],\n sources: [{ path: 'dsh-api-session-controller/lib/client.js', literal: 'retainedBy' }],\n usedBy: 'src/client/modelbg.ts',\n },\n {\n id: 'sessions.retainedBy.mainView',\n group: 'model',\n kind: 'host-service',\n criticality: 'label',\n since: '0.1.7',\n label: { en: 'Main-view retention on the session row', zh: '会话行的主视图占用标记' },\n symptom: {\n en: 'while uiSession is not mounted yet, no session id can be derived',\n zh: 'uiSession 尚未挂载时推导不出会话 id',\n },\n target: 'byId[].retainedBy.mainView',\n // No runtime check: whether a row currently carries the retention is a fact\n // about the open sessions, not about the build. What the plugin depends on is\n // that the list face can be read at all (`sessions.list`), and that the rows\n // carry `retainedBy` (checked offline against the session controller).\n checks: [],\n sources: [{ path: 'dsh-api-session-controller/lib/client.js', literal: 'retainedBy' }],\n usedBy: 'src/client/modelbg.ts',\n },\n {\n id: 'uiSession.current',\n group: 'model',\n kind: 'host-service',\n criticality: 'core',\n since: '0.1.7',\n label: { en: 'uiSession service (main view session)', zh: 'uiSession 服务(主视图会话)' },\n symptom: {\n en: 'the session id can only be guessed from the list retention',\n zh: '会话 id 只能退回用列表占用标记去猜',\n },\n target: 'uiSession.current',\n checks: [{ kind: 'path', service: 'uiSession', path: 'current', expect: 'observable' }],\n sources: [{ path: 'dsh-client-ui-session/lib/client.js', literal: 'uiSession' }],\n usedBy: 'src/client/modelbg.ts',\n },\n {\n id: 'sessions.binding.projections',\n group: 'model',\n kind: 'host-service',\n criticality: 'core',\n since: '<=0.1.6',\n label: { en: 'Session binding + projections', zh: '会话 binding 与 projections' },\n symptom: {\n en: 'this session\\'s own model selection is unreadable — only the host default is left',\n zh: '读不到本会话自己的模型选择,只剩宿主默认模型可用',\n },\n target: 'binding(id).session.projections.faceOf(\"modelSelection\")',\n checks: [\n { kind: 'path', service: 'sessions', path: 'binding', expect: 'function' },\n ],\n sources: [{ path: 'dsh-api-session-controller/lib/client.js', literal: 'faceOf' }],\n usedBy: 'src/client/modelbg.ts',\n },\n {\n id: 'modelDirectories.directoryFor',\n group: 'model',\n kind: 'host-service',\n criticality: 'label',\n since: '<=0.1.6',\n label: { en: 'Model directory (display names)', zh: '模型目录(显示名)' },\n symptom: {\n en: 'the model is shown as provider/model id instead of its display name',\n zh: '模型只会显示 provider/模型 id,读不到显示名',\n },\n target: 'modelDirectories.directoryFor(id)',\n checks: [{ kind: 'path', service: 'modelDirectories', path: 'directoryFor', expect: 'function' }],\n sources: [{ path: 'dsh-client-ui-model-selection/lib/client.js', literal: 'modelSelection' }],\n usedBy: 'src/client/modelbg.ts',\n },\n\n // ── surface: the elements the plugin paints ───────────────────────────────\n {\n id: 'shell.overlay',\n group: 'surface',\n kind: 'host-attr',\n criticality: 'looks',\n since: '<=0.1.6',\n label: { en: 'AppFrame overlay + its three columns', zh: '主框架浮层与三列' },\n symptom: {\n en: 'per-part blur and the main-background opacity cannot find the columns at all',\n zh: '分区域模糊与主背景透明度完全找不到那几列',\n },\n target: '[data-shell-overlay]',\n checks: [{ kind: 'attr', attr: 'data-shell-overlay' }],\n sources: [{ path: 'dsh-client-ui-layout/lib/client.js', literal: 'data-shell-overlay' }],\n usedBy: 'src/client/wallpaper.ts',\n },\n {\n id: 'settings.dialog',\n group: 'surface',\n kind: 'dom-selector',\n criticality: 'looks',\n since: '<=0.1.6',\n label: { en: 'Settings dialog (aria-modal)', zh: '设置弹窗(aria-modal)' },\n symptom: {\n en: 'the settings panel opacity and blur sliders stop having any effect',\n zh: '设置界面透明度与模糊失效',\n },\n target: '[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby]',\n checks: [\n { kind: 'selector', selector: 'div[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby]', optionalWhen: 'settingsClosed' },\n ], sources: [\n { path: 'dsh-client-ui-primitives/lib/index.js', literal: 'aria-modal' },\n // `.dab-card` is this plugin's own class for the dialog's option panels —\n // the one contract whose \"host side\" is a stylesheet of ours.\n { path: 'src/client/components/ui.css.ts', literal: '.dab-card' },\n ],\n usedBy: 'src/client/wallpaper.ts',\n },\n {\n id: 'settings.card',\n group: 'surface',\n kind: 'host-style',\n criticality: 'looks',\n since: '<=0.1.6',\n label: { en: 'Option card inside the dialog (.dab-card)', zh: '弹窗内的选项卡(.dab-card)' },\n symptom: {\n en: 'the dialog option-panel blur has nothing to attach to',\n zh: '弹窗内选项卡的模糊没有附着对象',\n },\n target: '.dab-card',\n checks: [{ kind: 'rule', match: '.dab-card', hint: 'settings dialog card class' }],\n sources: [{ path: 'src/client/components/ui.css.ts', literal: '.dab-card' }],\n usedBy: 'src/client/wallpaper.ts',\n },\n {\n id: 'composer.card',\n group: 'surface',\n kind: 'host-attr',\n criticality: 'looks',\n since: '<=0.1.6',\n label: { en: 'Composer card', zh: '输入框卡片' },\n symptom: {\n en: 'the composer loses its backdrop — the input blur slider does nothing',\n zh: '输入框失去毛玻璃背板,输入区模糊滑块失效',\n },\n target: '[data-composer-card]',\n // The composer only exists inside a mounted conversation view, so its absence\n // while the chat view itself is absent is \"not observable\", not a rename.\n checks: [{ kind: 'attr', attr: 'data-composer-card', optionalWhen: 'chatNotMounted' }],\n sources: [{ path: 'dsh-client-ui-conversation/lib/client.js', literal: 'data-composer-card' }],\n usedBy: 'src/client/wallpaper.ts',\n },\n {\n id: 'cordis.panel',\n group: 'surface',\n kind: 'host-attr',\n criticality: 'label',\n since: '<=0.1.6',\n label: { en: 'Cordis panel', zh: 'Cordis 面板' },\n symptom: {\n en: 'the Cordis panel keeps the host surface instead of the input slider\\'s alpha',\n zh: 'Cordis 面板拿不到输入区滑块的透明度,仍是宿主表面',\n },\n target: '[data-cordis-panel]',\n checks: [{ kind: 'attr', attr: 'data-cordis-panel', optionalWhen: 'cordisClosed' }],\n sources: [{ path: 'dsh-client-ui-cordis/lib/client.js', literal: 'data-cordis-panel' }],\n usedBy: 'src/client/wallpaper.ts',\n },\n {\n id: 'rightbar.panel',\n group: 'surface',\n kind: 'host-attr',\n criticality: 'looks',\n since: '0.1.7',\n label: { en: 'File-preview panel host', zh: '文件预览面板宿主' },\n symptom: {\n en: 'the right panel loses its own opacity/blur card and falls back to the main background',\n zh: '右侧栏失去自己的透明度/模糊控制,退回跟随主背景',\n },\n target: '[data-sidebar-right-panel]',\n checks: [\n // Absent until a file is opened; `[data-dockkit-strip]` is the dock chrome\n // that exists in the same panel even while the panel is closed, so it\n // tells \"the panel is not mounted\" apart from \"the attribute was renamed\".\n { kind: 'selector', selector: 'div[data-sidebar-right-panel]', optionalWhen: 'noRightPanel' },\n ],\n sources: [{ path: `${SIDEBAR_RIGHT}/lib/client.js`, literal: 'data-sidebar-right-panel' }],\n usedBy: 'src/client/wallpaper.ts',\n },\n {\n id: 'rightbar.openFlag',\n group: 'surface',\n kind: 'host-attr',\n criticality: 'looks',\n since: '0.1.7',\n label: { en: 'Right panel open/closed flag', zh: '右侧栏开合标记' },\n symptom: {\n en: 'the panel\\'s backdrop cannot tell open from closed — a frosted plate covers the empty half',\n zh: '分不清右侧栏开着还是关着,空白的右半屏会出现磨砂板',\n },\n target: '[data-sidebar-right-open]',\n checks: [{ kind: 'rule', match: '[data-sidebar-right-open]', hint: 'right panel open flag' }],\n sources: [{ path: `${SIDEBAR_RIGHT}/lib/client.js`, literal: 'data-sidebar-right-open' }],\n usedBy: 'src/client/wallpaper.ts',\n },\n {\n id: 'dockkit.content',\n group: 'surface',\n kind: 'host-attr',\n criticality: 'core',\n since: '0.1.7',\n label: { en: 'Dock tab host (the panel\\'s painted surface)', zh: '停靠页宿主(面板真正的表面)' },\n symptom: {\n en: 'nothing carries the panel surface any more — the right-panel card is painted on a container that is always full width',\n zh: '面板表面不再落在任何元素上,右面板卡片会被画在一个恒定满宽的容器上',\n },\n target: '[data-dockkit-content]',\n checks: [{ kind: 'rule', match: '[data-dockkit-content]', hint: 'dock tab host' }],\n // Directory source: the dockkit component lives in the shell bundle, whose\n // filename is hash-stamped on every dsh release.\n sources: [{ path: '.', literal: 'dockkit-content', root: 'frontend' }],\n usedBy: 'src/client/wallpaper.ts',\n },\n {\n id: 'dockkit.empty',\n group: 'surface',\n kind: 'host-attr',\n criticality: 'looks',\n since: '0.1.7',\n label: { en: 'Dock empty seat', zh: '停靠空位' },\n symptom: {\n en: 'an empty preview pane paints the host surface over the wallpaper',\n zh: '空的预览格会用宿主表面盖住壁纸',\n },\n target: '[data-dockkit-empty]',\n checks: [{ kind: 'rule', match: '[data-dockkit-empty]', hint: 'dock empty seat' }],\n sources: [{ path: `${SIDEBAR_RIGHT}/lib/client.js`, literal: 'data-dockkit-empty' }],\n usedBy: 'src/client/wallpaper.ts',\n },\n {\n id: 'dockkit.float',\n group: 'surface',\n kind: 'host-attr',\n criticality: 'label',\n since: '0.1.7',\n label: { en: 'Floating dock pane flag', zh: '浮动停靠面板标记' },\n symptom: {\n en: 'floating panes would be painted like docked ones, frosting a panel that should stay the host\\'s',\n zh: '浮动面板会被当作停靠面板上色,本该保持宿主样式的面板被磨砂',\n },\n target: '[data-dockkit-float]',\n checks: [{ kind: 'rule', match: '[data-dockkit-float]', hint: 'floating pane flag' }],\n sources: [{ path: `${SIDEBAR_RIGHT}/lib/client.js`, literal: 'data-dockkit-float' }],\n usedBy: 'src/client/wallpaper.ts',\n },\n\n // ── region: the conversation views ────────────────────────────────────────\n {\n id: 'chat.flow',\n group: 'region',\n kind: 'dom-selector',\n criticality: 'looks',\n since: '<=0.1.6',\n label: { en: 'Chat message column', zh: '对话消息列' },\n symptom: {\n en: 'the conversation card (and its opacity/blur) cannot find the message column',\n zh: '对话卡片(及其透明度/模糊)找不到消息列',\n },\n target: '[data-chat-flow]',\n checks: [\n { kind: 'selector', selector: '[data-chat-flow]', optionalWhen: 'chatNotMounted' },\n ],\n sources: [{ path: 'dsh-client-ui-chat/lib/client.js', literal: 'data-chat-flow' }],\n usedBy: 'src/client/wallpaper.ts',\n },\n {\n id: 'conversation.scroll',\n group: 'region',\n kind: 'dom-selector',\n criticality: 'looks',\n since: '<=0.1.6',\n label: { en: 'Conversation scrollport', zh: '对话滚动区' },\n symptom: {\n en: 'the marker-less fallback would wrap the whole scrollport in the conversation card',\n zh: '标记缺失时的兜底会把整个滚动区套上对话卡片',\n },\n target: '[data-conversation-scroll]',\n checks: [\n { kind: 'selector', selector: '[data-conversation-scroll]', optionalWhen: 'chatNotMounted' },\n ],\n sources: [{ path: 'dsh-client-ui-conversation/lib/client.js', literal: 'data-conversation-scroll' }],\n usedBy: 'src/client/wallpaper.ts',\n },\n {\n id: 'trajectory.root',\n group: 'region',\n kind: 'dom-selector',\n criticality: 'looks',\n since: '<=0.1.6',\n label: { en: 'Trajectory view root', zh: '轨迹页根节点' },\n symptom: {\n en: 'the trajectory opacity/blur sliders stop reaching the trajectory page',\n zh: '轨迹页的透明度与模糊滑块失效',\n },\n target: '[data-conversation-composer-overlay]',\n checks: [\n { kind: 'selector', selector: '[data-conversation-composer-overlay]', optionalWhen: 'trajectoryNotMounted' },\n ],\n sources: [{ path: 'dsh-client-ui-trajectory/lib/client.js', literal: 'data-conversation-composer-overlay' }],\n usedBy: 'src/client/wallpaper.ts',\n },\n {\n id: 'markdown.wideTable',\n group: 'region',\n kind: 'host-style',\n criticality: 'label',\n since: '<=0.1.6',\n label: { en: 'Wide markdown table clamp', zh: '宽表格收拢样式' },\n symptom: {\n en: 'a wide table bleeds outside the conversation card instead of scrolling inside it',\n zh: '宽表格会溢出到对话卡片外,而不是在卡片内横向滚动',\n },\n target: '.md-table-wide',\n checks: [{ kind: 'rule', match: '.md-table-wide', hint: 'markdown table class' }],\n sources: [{ path: 'dsh-client-ui-chat/lib/client.js', literal: 'md-table-wide' }],\n usedBy: 'src/client/wallpaper.ts',\n },\n\n // ── token: the design tokens the plugin re-emits ──────────────────────────\n {\n id: 'token.bgBase',\n group: 'token',\n kind: 'host-token',\n criticality: 'looks',\n since: '<=0.1.6',\n label: { en: 'Main background surface', zh: '主背景表面' },\n symptom: {\n en: 'the main-background slider and the right-panel card lose their surface',\n zh: '主背景透明度与右侧栏卡片失去表面色',\n },\n target: '--dsw-alias-bg-base',\n checks: [{ kind: 'computed', token: '--dsw-alias-bg-base' }],\n sources: [{ path: 'dsh-client-ui-theme/lib/client.js', literal: '--dsw-alias-bg-base' }],\n usedBy: 'src/client/wallpaper.ts',\n },\n {\n id: 'token.layers',\n group: 'token',\n kind: 'host-token',\n criticality: 'looks',\n since: '<=0.1.6',\n label: { en: 'Layered surfaces (cards)', zh: '层次表面(卡片)' },\n symptom: {\n en: 'the card slider, the conversation card and the trajectory slider go blank',\n zh: '卡片滑块、对话卡片与轨迹滑块失去颜色',\n },\n target: '--dsw-alias-bg-layer-1/2/3',\n checks: [\n { kind: 'computed', token: '--dsw-alias-bg-layer-1' },\n { kind: 'computed', token: '--dsw-alias-bg-layer-2' },\n { kind: 'computed', token: '--dsw-alias-bg-layer-3' },\n ],\n sources: [{ path: 'dsh-client-ui-theme/lib/client.js', literal: '--dsw-alias-bg-layer-1' }],\n usedBy: 'src/client/wallpaper.ts',\n },\n {\n id: 'token.menuSurface',\n group: 'token',\n kind: 'host-token',\n criticality: 'core',\n since: '0.1.7',\n label: { en: 'Menu material fill (0.1.7 split)', zh: '菜单材质填充(0.1.7 拆分)' },\n symptom: {\n en: 'the menu panel and its sticky group headings take two different fills — the solid band across the model picker',\n zh: '菜单面板与吸顶分组标题用了两种填充 —— 模型选择器上那道白道',\n },\n target: '--dsw-menu-surface-fill',\n checks: [\n { kind: 'rule', match: '--dsw-menu-surface-fill', hint: 'MenuSurface material fill' },\n { kind: 'computed', token: '--dsw-menu-surface-fill', on: '.dab-root' },\n ],\n sources: [\n { path: 'dsh-client-ui-theme/lib/client.js', literal: '--dsw-menu-surface-fill' },\n { path: 'dsh-client-ui-primitives/lib/MenuSurface.module.css', literal: 'var(--dsw-menu-surface-fill)' },\n ],\n usedBy: 'src/client/utils/color.ts, src/client/wallpaper.ts',\n },\n {\n id: 'token.menuAlias',\n group: 'token',\n kind: 'host-token',\n criticality: 'looks',\n since: '<=0.1.6',\n label: { en: 'Menu overlay fill', zh: '菜单浮层填充' },\n symptom: {\n en: 'dropdowns, the slash menu and popovers keep the host fill while the panel follows the plugin',\n zh: '下拉、斜杠菜单与浮层保持宿主填充,而面板跟随插件,两边不一致',\n },\n target: '--dsw-specific-menu',\n checks: [\n { kind: 'rule', match: '--dsw-specific-menu', hint: 'menu overlay fill' },\n { kind: 'computed', token: '--dsw-specific-menu', on: '.dab-root' },\n ],\n sources: [\n { path: 'dsh-client-ui-theme/lib/client.js', literal: '--dsw-specific-menu' },\n { path: 'dsh-client-ui-chat/lib/client.js', literal: '--dsw-specific-menu' },\n ],\n usedBy: 'src/client/utils/color.ts, src/client/wallpaper.ts',\n },\n {\n id: 'token.sidebarFill',\n group: 'token',\n kind: 'host-token',\n criticality: 'looks',\n since: '<=0.1.6',\n label: { en: 'Sidebar fill', zh: '左侧栏填充' },\n symptom: {\n en: 'the sidebar opacity slider stops tinting the sidebar',\n zh: '左侧栏透明度滑块失效',\n },\n target: '--dsw-specific-sidebar-fill',\n checks: [{ kind: 'computed', token: '--dsw-specific-sidebar-fill' }],\n sources: [{ path: 'dsh-client-ui-theme/lib/client.js', literal: '--dsw-specific-sidebar-fill' }],\n usedBy: 'src/client/utils/color.ts, src/client/wallpaper.ts',\n },\n {\n id: 'token.inputFill',\n group: 'token',\n kind: 'host-token',\n criticality: 'looks',\n since: '<=0.1.6',\n label: { en: 'Input/control surface', zh: '输入与控件表面' },\n symptom: {\n en: 'the input slider stops tinting the composer and the controls',\n zh: '输入区透明度滑块失效',\n },\n target: '--dsw-specific-input-major',\n checks: [{ kind: 'computed', token: '--dsw-specific-input-major' }],\n sources: [{ path: 'dsh-client-ui-theme/lib/client.js', literal: '--dsw-specific-input-major' }],\n usedBy: 'src/client/utils/color.ts, src/client/wallpaper.ts',\n },\n {\n id: 'token.schemeFlag',\n group: 'token',\n kind: 'host-attr',\n criticality: 'core',\n since: '<=0.1.6',\n label: { en: 'Dark-scheme flag on <body>', zh: '<body> 上的深色标记' },\n symptom: {\n en: 'a dark rule can no longer force the dark palette — light surfaces flash through',\n zh: '深色规则无法强制深色调色板,会闪出浅色表面',\n },\n target: 'body[data-ds-dark-theme]',\n checks: [{ kind: 'rule', match: 'data-ds-dark-theme', hint: 'dark scheme attribute' }],\n sources: [\n { path: 'dsh-client-ui-theme/lib/client.js', literal: 'data-ds-dark-theme' },\n // Directory source: the served frontend's asset files carry content hashes\n // in their names (`index-<hash>.css`), so naming one would rot on every dsh\n // release for no reason. The whole assets directory is searched instead.\n { path: '.', literal: 'data-ds-dark-theme', root: 'frontend' },\n ],\n usedBy: 'src/client/wallpaper.ts',\n },\n {\n id: 'token.labelCaption',\n group: 'token',\n kind: 'host-token',\n criticality: 'label',\n since: '<=0.1.6',\n label: { en: 'Caption label token', zh: '弱化文字令牌' },\n symptom: {\n en: 'placeholder text falls back to a hard-coded grey instead of the theme\\'s caption colour',\n zh: '占位文字退回固定灰色,不再跟随主题的弱化色',\n },\n target: '--dsw-alias-label-caption',\n checks: [{ kind: 'computed', token: '--dsw-alias-label-caption' }],\n sources: [{ path: 'dsh-client-ui-theme/lib/client.js', literal: '--dsw-alias-label-caption' }],\n usedBy: 'src/client/wallpaper.ts',\n },\n]\n\n/** The plugin's own copy of the host floor — kept next to the contracts it guards. */\nexport const DSH_FLOOR = '0.1.7-rc.2'\n\n/** Localized label lookup for a contract. */\nexport function labelOf(c: HostContract, lang: Lang): string {\n return lang === 'zh' ? c.label.zh : c.label.en\n}\n\n/** Localized symptom lookup for a contract. */\nexport function symptomOf(c: HostContract, lang: Lang): string {\n return lang === 'zh' ? c.symptom.zh : c.symptom.en\n}\n\n/** The two UI languages this plugin ships. */\nexport type Lang = 'zh' | 'en'\n\n/** Groups the panel renders, in order. */\nexport const CONTRACT_GROUPS: ReadonlyArray<{ id: HostContract['group']; label: { en: string; zh: string } }> = [\n { id: 'model', label: { en: 'Model → rule resolution', zh: '模型 → 规则匹配' } },\n { id: 'surface', label: { en: 'Surfaces the plugin paints', zh: '插件着色的界面区域' } },\n { id: 'token', label: { en: 'Design tokens re-emitted', zh: '被重新发出的设计令牌' } },\n { id: 'region', label: { en: 'Conversation views', zh: '对话视图' } },\n]\n\n// ── The report shape ────────────────────────────────────────────────────────\n// Declared here rather than in either half: the browser probe and the on-disk\n// scan both produce it, the panel renders both, and the node half must not have\n// to import a client module to describe its own answer.\n\nexport type CheckStatus = 'pass' | 'fail' | 'skip' | 'info'\n\n/** What one contract point looks like on a given host. */\nexport interface ContractResult {\n id: string\n /** Localized label of the contract point. */\n label: string\n /** Localized consequence of the contract being gone. */\n symptom: string\n status: CheckStatus\n /** Technical one-liner: what ran, and what came back. */\n detail: string\n /** Human-readable reason when the status is `fail`. */\n reason?: string\n /** The literal contract value, for the report. */\n target: string\n /** Where the host defines it. */\n sources: readonly ContractSource[]\n /** This plugin's file that reads it. */\n usedBy: string\n /** Every check that ran, with its own verdict (for the report). */\n checks: string[]\n}\n\n/** The model-resolution facts the panel shows next to the contracts. */\nexport interface ModelFacts {\n /** The match text the active rule was chosen by. */\n text: string\n /** Which source answered: this session's own selection, or the host default. */\n source: 'session' | 'default'\n /** The failing hop when nothing per-session could be read. */\n note: string\n /** Label of the rule the model resolved to ('' when there is none). */\n rule: string\n /** Whether that rule was a real match or the fallback. */\n matched: boolean\n}\n\n/** One self-check run: `client` = live DOM probe, `node` = installed files. */\nexport interface HostReport {\n phase: 'client' | 'node'\n at: string\n plugin: { version: string; floor: string }\n host: {\n version: string\n /** Whether the host satisfies this plugin's declared floor (null = unknown). */\n compatible: boolean | null\n node: string\n /** Where the host packages were found (node half only). */\n root: string\n /** Why no version could be read, when that happened. */\n note: string\n model?: ModelFacts\n }\n results: ContractResult[]\n summary: { pass: number; fail: number; skip: number; total: number }\n}\n\n/** Overall verdict of a report, for the panel's headline. */\nexport function verdictOf(report: HostReport): 'ok' | 'partial' | 'broken' | 'unknown' {\n if (report.results.length === 0) return 'unknown'\n if (report.summary.fail > 0) return report.summary.pass > 0 ? 'partial' : 'broken'\n return report.summary.pass > 0 ? 'ok' : 'unknown'\n}\n\n/** Markdown rendering of a report — the thing a user pastes into an issue. */\nexport function reportToMarkdown(report: HostReport, lang: Lang): string {\n const zh = lang === 'zh'\n const lines: string[] = []\n lines.push(zh ? '## dsh-background-by-model 宿主自检' : '## dsh-background-by-model host check')\n lines.push('')\n lines.push(`- ${zh ? '阶段' : 'phase'}: ${report.phase}`)\n if (report.plugin.version !== '') lines.push(`- ${zh ? '插件' : 'plugin'}: ${report.plugin.version} (dsh >=${report.plugin.floor})`)\n lines.push(`- dsh: ${report.host.version !== '' ? report.host.version : (zh ? '未读到' : 'unreadable')}${report.host.compatible === false ? (zh ? '(低于插件下限)' : ' (below the plugin floor)') : ''}`)\n if (report.host.node !== '') lines.push(`- node: ${report.host.node}`)\n if (report.host.root !== '') lines.push(`- host root: ${report.host.root}`)\n if (report.host.note !== '') lines.push(`- note: ${report.host.note}`)\n if (report.host.model !== undefined) {\n const m = report.host.model\n lines.push(`- ${zh ? '模型' : 'model'}: \\`${m.text !== '' ? m.text : '(none)'}\\` · ${m.source}${m.note !== '' ? ` · ${m.note}` : ''} · ${zh ? '规则' : 'rule'} ${m.rule !== '' ? m.rule : '-'}${m.matched ? '' : zh ? '(兜底)' : ' (fallback)'}`)\n }\n lines.push('')\n lines.push(`### ${zh ? '结论' : 'Summary'}: ${report.summary.pass} pass / ${report.summary.fail} fail / ${report.summary.skip} n/a`)\n lines.push('')\n for (const r of report.results) {\n const mark = r.status === 'pass' ? 'PASS' : r.status === 'fail' ? '**FAIL**' : r.status === 'skip' ? 'n/a' : 'info'\n lines.push(`- ${mark} \\`${r.id}\\` — ${r.label} · \\`${r.target}\\``)\n if (r.status === 'fail') {\n lines.push(` - ${zh ? '现象' : 'symptom'}: ${r.symptom}`)\n lines.push(` - ${zh ? '原因' : 'reason'}: ${r.reason ?? r.detail}`)\n lines.push(` - ${zh ? '期望位置' : 'expected in'}: ${r.sources.map(s => s.path).join(', ')}`)\n } else if (r.detail !== '') {\n lines.push(` - ${r.detail}`)\n }\n }\n return lines.join('\\n')\n}\n\n","/**\n * The host-contract probe behind the settings page's \"Host check\" tab.\n *\n * Every declaration in ./host-contracts is evaluated against the RUNNING dsh —\n * the live DOM, the host's own stylesheets and the Cordis services — so the\n * answer is about this build, not about what the sources say. The results are\n * the difference between a user reporting \"背景不动了\" and reporting which hop\n * died:\n *\n * green the host still provides it\n * grey it cannot be observed from here right now (the settings dialog is the\n * only thing mounted, no file has been opened, the chat view is not in\n * the tree) — NOT a failure, and never reported as one\n * red the host stopped providing it while the feature that reads it is on\n * screen: this is the line to paste into an issue\n *\n * The probe is read-only: it queries the DOM and reads computed styles. It never\n * writes a style, never mutates the host tree and never touches the config.\n */\nimport type {\n CheckStatus, ContractCheck, ContractResult, HostContract, HostReport, ModelFacts,\n} from '../host-contracts'\nimport { HOST_CONTRACTS, labelOf, symptomOf } from '../host-contracts'\nimport type { Ctx } from './types'\n\n// The report shape lives with the contracts (../host-contracts) so the node\n// half's on-disk scan can build the same report without importing a client\n// module — and so \"what a result is\" cannot drift between the two halves.\nexport type { CheckStatus, ContractResult, HostReport, ModelFacts } from '../host-contracts'\nexport { verdictOf, reportToMarkdown } from '../host-contracts'\n\n/** Everything the probe needs from the running client. */\nexport interface ProbeInput {\n ctx: Ctx\n lang: 'zh' | 'en'\n pluginVersion: string\n floor: string\n model?: ModelFacts\n}\n\n// ── the probe's environment ──────────────────────────────────────────────────\n// The probe reads exactly four things from the browser: the document (selector\n// and computed-token checks), the stylesheets (token/attribute checks), the\n// context (service checks) and the window (nothing — kept out on purpose). They\n// are declared as a narrow interface so `node --test` can drive the whole probe\n// against a fixture written in the shape of a host DOM, with no browser at all —\n// and so a check can never quietly start reading something else.\n\n/** A CSS rule as the probe reads it (its text is what matters). */\nexport interface StyleRuleLike {\n cssText: string\n cssRules?: ArrayLike<StyleRuleLike> | undefined\n}\n\n/** One stylesheet the probe may read. */\nexport interface StyleSheetLike {\n cssRules: ArrayLike<StyleRuleLike> | null\n /** Set by this plugin on its own <style> elements; those are not host rules. */\n ownerNode?: { dataset?: Record<string, string | undefined> } | null\n}\n\nexport interface ProbeEnv {\n /** `null` when the selector matches nothing — the shape of querySelector. */\n querySelector(selector: string): { style?: unknown } | null\n /** Computed value of one custom property, already trimmed by the caller. */\n computedValue(token: string, on: { style?: unknown } | null): string\n /** Every stylesheet the probe may read (cross-origin ones throw on access). */\n styleSheets(): Iterable<StyleSheetLike>\n ctx: Ctx\n}\n\n/** The real browser environment. */\nexport function browserEnv(ctx: Ctx): ProbeEnv {\n return {\n querySelector: selector => document.querySelector(selector) as { style?: unknown } | null,\n // `on === null` means \"not scoped to an element\": the token is read off the\n // document root, which is where the host publishes its design tokens. The\n // `typeof` guard keeps the module importable outside a browser (the node test\n // imports the probe to drive it against a fixture).\n computedValue: (token, on) => {\n if (typeof document === 'undefined') return ''\n const host = (on ?? document.documentElement) as unknown as HTMLElement\n return getComputedStyle(host).getPropertyValue(token).trim()\n },\n styleSheets: () => (typeof document === 'undefined'\n ? []\n : Array.from(document.styleSheets) as unknown as StyleSheetLike[]),\n ctx,\n }\n}\n\n// ── presence anchors ─────────────────────────────────────────────────────────\n// A check marked `optionalWhen: X` is only a failure while X's mount anchor is in\n// the DOM. Every anchor below is a data attribute the host itself uses to build\n// the surface we are checking, so they move together: if the anchor is gone, the\n// feature is not on screen and there is nothing to fail.\n\nconst ANCHORS: Record<string, string> = {\n settingsClosed: 'div[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby]',\n chatNotMounted: '[data-chat-flow],[data-conversation-scroll]',\n trajectoryNotMounted: '[data-conversation-composer-overlay]',\n noRightPanel: 'div[data-sidebar-right-panel],[data-dockkit-strip],[data-dockkit-pane]',\n cordisClosed: '[data-cordis-panel]',\n}\n\nfunction mounted(env: ProbeEnv, anchorId: string): boolean {\n const sel = ANCHORS[anchorId]\n if (sel === undefined) return true\n try {\n return env.querySelector(sel) !== null\n } catch {\n return false\n }\n}\n\n// ── check evaluation ─────────────────────────────────────────────────────────\n\ninterface CheckOutcome {\n status: CheckStatus\n /** Human name of the check, for the report. */\n name: string\n /** What was observed. */\n detail: string\n /** Why it failed, in user terms. */\n reason?: string\n}\n\n/** Walk a dotted path off a root object, tolerating a missing first hop. */\nfunction walkPath(root: unknown, path: string): unknown {\n let cur: unknown = root\n for (const key of path.split('.')) {\n if (cur === null || cur === undefined) return undefined\n cur = (cur as Record<string, unknown>)[key]\n }\n return cur\n}\n\nfunction looksObservable(v: unknown): boolean {\n return typeof v === 'object' && v !== null\n && typeof (v as { subscribe?: unknown }).subscribe === 'function'\n && typeof (v as { getSnapshot?: unknown }).getSnapshot === 'function'\n}\n\n/**\n * A stylesheet mention of a literal.\n *\n * The host's rules are the only place a renamed token still answers honestly:\n * a token can be *declared* by this plugin while the host's rule that consumed\n * it is gone. Cross-origin sheets (none on a local dsh, but the probe must not\n * throw if one ever appears) are skipped.\n */\nfunction ruleMentioned(env: ProbeEnv, literal: string): boolean {\n for (const sheet of env.styleSheets()) {\n // The plugin's OWN stylesheets are skipped: they declare the tokens this\n // plugin re-emits, so counting them would make every token check pass by\n // construction — the exact blindness this probe exists to remove.\n if (sheet.ownerNode?.dataset?.plugin !== undefined) continue\n let rules: ArrayLike<StyleRuleLike> | null = null\n try {\n rules = sheet.cssRules\n } catch {\n continue\n }\n if (rules === null) continue\n for (const rule of Array.from(rules)) {\n const text = rule.cssText\n if (typeof text === 'string' && text.includes(literal)) return true\n // One level of grouping covers the host's @media / @layer / @container\n // blocks, which is where the scheme rules live.\n const inner = rule.cssRules\n if (inner === undefined || inner === null) continue\n for (const child of Array.from(inner)) {\n const childText = child.cssText\n if (typeof childText === 'string' && childText.includes(literal)) return true\n }\n }\n }\n return false\n}\n\n/** Whether any reachable host stylesheet could be read (false ⇒ the check is blind). */\nfunction stylesReadable(env: ProbeEnv): boolean {\n for (const sheet of env.styleSheets()) {\n try {\n if (sheet.cssRules !== null) return true\n } catch {\n // cross-origin sheet — keep looking\n }\n }\n return false\n}\n\nfunction evaluate(env: ProbeEnv, check: ContractCheck): CheckOutcome {\n switch (check.kind) {\n case 'service': {\n let svc: unknown\n try { svc = env.ctx.get(check.id) } catch { svc = undefined }\n return svc === undefined || svc === null\n ? { status: 'fail', name: `ctx.get('${check.id}')`, detail: 'service not published', reason: `the host does not publish the \"${check.id}\" service` }\n : { status: 'pass', name: `ctx.get('${check.id}')`, detail: 'service present' }\n }\n case 'path': {\n let svc: unknown\n try { svc = env.ctx.get(check.service) } catch { svc = undefined }\n if (svc === undefined || svc === null) {\n return { status: 'skip', name: `${check.service}.${check.path}`, detail: 'service not published yet' }\n }\n const value = walkPath(svc, check.path)\n const name = `${check.service}.${check.path}`\n if (check.expect === 'function') {\n return typeof value === 'function'\n ? { status: 'pass', name, detail: 'is a function' }\n : { status: 'fail', name, detail: `expected a function, got ${typeof value}`, reason: `\"${name}\" is not a function on this host` }\n }\n if (check.expect === 'observable') {\n return looksObservable(value)\n ? { status: 'pass', name, detail: 'is an observable face' }\n : { status: 'fail', name, detail: 'not an observable face', reason: `\"${name}\" no longer exposes subscribe()/getSnapshot()` }\n }\n return value === undefined\n ? { status: 'fail', name, detail: 'undefined', reason: `\"${name}\" is gone` }\n : { status: 'pass', name, detail: typeof value }\n }\n case 'selector': {\n const present = env.querySelector(check.selector) !== null\n const name = `querySelector(${JSON.stringify(check.selector)})`\n if (present) return { status: 'pass', name, detail: 'element found' }\n if (check.optionalWhen !== undefined && !mounted(env, check.optionalWhen)) {\n return { status: 'skip', name, detail: 'not on screen right now' }\n }\n return {\n status: 'fail', name, detail: 'no element matches',\n reason: `no element matches ${check.selector} while its surface is on screen`,\n }\n }\n case 'attr': {\n const present = env.querySelector(`[${check.attr}]`) !== null\n const name = `querySelector([${check.attr}])`\n if (present) return { status: 'pass', name, detail: 'attribute found' }\n if (check.optionalWhen !== undefined && !mounted(env, check.optionalWhen)) {\n return { status: 'skip', name, detail: 'not on screen right now' }\n }\n return {\n status: 'fail', name, detail: 'no element carries it',\n reason: `nothing in the DOM carries ${check.attr} while its surface is on screen`,\n }\n }\n case 'computed': {\n const host = check.on !== undefined ? env.querySelector(check.on) : null\n const name = `computed(${check.token}${check.on !== undefined ? ` on ${check.on}` : ''})`\n if (check.on !== undefined && host === null) {\n return { status: 'skip', name, detail: `${check.on} not mounted` }\n }\n const value = env.computedValue(check.token, host)\n return value !== ''\n ? { status: 'pass', name, detail: value }\n : { status: 'fail', name, detail: 'resolves to nothing', reason: `${check.token} resolves to an empty value` }\n }\n case 'rule': {\n const name = `stylesheet includes ${JSON.stringify(check.match)}`\n if (!stylesReadable(env)) return { status: 'skip', name, detail: 'no stylesheet is readable' }\n return ruleMentioned(env, check.match)\n ? { status: 'pass', name, detail: 'declared by a host rule' }\n : { status: 'fail', name, detail: 'no rule mentions it', reason: `no stylesheet declares ${check.match}` }\n }\n default: {\n // Exhaustiveness: a new check kind must be handled here, not silently pass.\n const never: never = check\n return { status: 'fail', name: 'unknown check', detail: String(never) }\n }\n }\n}\n\n/** A contract with no checks is documentation only (a legacy alias we still accept). */\nfunction noChecks(c: HostContract, lang: 'zh' | 'en'): ContractResult {\n return {\n id: c.id,\n label: labelOf(c, lang),\n symptom: symptomOf(c, lang),\n status: 'info',\n detail: lang === 'zh' ? '无需运行时检查 —— 仅记录兼容用法' : 'no runtime check — accepted for compatibility',\n target: c.target,\n sources: c.sources,\n usedBy: c.usedBy,\n checks: [],\n }\n}\n\n/**\n * Run every contract against a probe environment.\n *\n * Only the FIRST failing check of a contract is reported: the later ones usually\n * depend on it (no service ⇒ no methods on it), so listing them all would turn\n * one rename into five red lines.\n */\nexport function probeContracts(env: ProbeEnv, lang: 'zh' | 'en'): ContractResult[] {\n return HOST_CONTRACTS.map(c => {\n const result: ContractResult = {\n id: c.id,\n label: labelOf(c, lang),\n symptom: symptomOf(c, lang),\n status: 'pass',\n detail: '',\n target: c.target,\n sources: c.sources,\n usedBy: c.usedBy,\n checks: [],\n }\n if (c.checks.length === 0) return noChecks(c, lang)\n const outcomes: CheckOutcome[] = []\n let firstFail: CheckOutcome | undefined\n for (const check of c.checks) {\n let outcome: CheckOutcome\n try {\n outcome = evaluate(env, check)\n } catch (e) {\n outcome = { status: 'fail', name: check.kind, detail: String(e), reason: `${check.kind} check threw` }\n }\n outcomes.push(outcome)\n if (outcome.status === 'fail' && firstFail === undefined) firstFail = outcome\n }\n result.checks = outcomes.map(o => `${o.status} · ${o.name} — ${o.detail}`)\n if (firstFail !== undefined) {\n result.status = 'fail'\n result.detail = `${firstFail.name} — ${firstFail.detail}`\n result.reason = firstFail.reason\n return result\n }\n const ran = outcomes.filter(o => o.status !== 'skip')\n if (ran.length === 0) {\n result.status = 'skip'\n result.detail = outcomes.map(o => `${o.name} — ${o.detail}`).join('; ')\n return result\n }\n result.status = ran.some(o => o.status === 'info') && ran.every(o => o.status === 'info') ? 'info' : 'pass'\n const last = ran[ran.length - 1]!\n result.detail = `${last.name} — ${last.detail}`\n return result\n })\n}\n\n/** Assemble the panel's report around a set of probe results. */\nexport function buildClientReport(input: ProbeInput, host: { version: string; compatible: boolean | null; note: string }): HostReport {\n const results = probeContracts(browserEnv(input.ctx), input.lang)\n const pass = results.filter(r => r.status === 'pass').length\n const fail = results.filter(r => r.status === 'fail').length\n const skip = results.filter(r => r.status === 'skip' || r.status === 'info').length\n return {\n phase: 'client',\n at: new Date().toISOString(),\n plugin: { version: input.pluginVersion, floor: input.floor },\n host: {\n version: host.version,\n compatible: host.compatible,\n node: '',\n root: '',\n note: host.note,\n model: input.model,\n },\n results,\n summary: { pass, fail, skip, total: results.length },\n }\n}\n\n","/**\n * Build-time facts about this plugin, for the host self-check report.\n *\n * `tsdown` replaces `__DAB_VERSION__` / `__DAB_DSH_FLOOR__` with literals read\n * from `package.json` (see tsdown.config.ts), so the client bundle can name the\n * running plugin version and the dsh floor it was built against without a runtime\n * lookup. The `typeof` guards keep the module importable by a plain Node test,\n * where nothing has replaced the identifiers.\n */\n\ndeclare const __DAB_VERSION__: string | undefined\ndeclare const __DAB_DSH_FLOOR__: string | undefined\n\n/** This plugin's version at build time ('0.0.0' when built unbundled). */\nexport const PLUGIN_VERSION: string =\n typeof __DAB_VERSION__ === 'string' ? __DAB_VERSION__ : '0.0.0'\n\n/** The dsh floor this build declares, straight from `engines.dsh`. */\nexport const DSH_FLOOR: string =\n typeof __DAB_DSH_FLOOR__ === 'string' ? __DAB_DSH_FLOOR__ : '0.1.7-rc.2'\n","/**\r\n * dsh-background-by-model — settings UI design system.\r\n *\r\n * The section is styled entirely through these scoped classes instead of the\r\n * host's inline-style approach: animations (page transitions, staggered\r\n * reveals, the rotating orb ring) and pseudo-element effects cannot be\r\n * expressed as React inline styles. Every color reads the host's\r\n * --dsw-alias-* tokens so the panel follows the user's custom theme color and\r\n * light/dark scheme automatically; `color-mix` tints carry a plain-token\r\n * fallback first for older engines.\r\n */\r\nexport const NAV_ITEM_H = 38\r\nexport const NAV_GAP = 4\r\n\r\nexport const UI_CSS = `\r\n/* The section is rendered INLINE inside the host settings dialog's content\r\n * column: the host provides the modal chrome (backdrop, centering, closing).\r\n * These classes style only the embedded shell; transient fixed layers (toast,\r\n * color picker, background editor) escape through Portals on <html>. */\r\n.dab-root{position:relative;color:var(--dsw-alias-label-primary);animation:dab-fade-in .35s ease both;container-type:inline-size;display:flex;flex-direction:column;align-items:center;width:100%;min-width:0;--dab-mono:ui-monospace,\"Cascadia Mono\",\"SF Mono\",Consolas,\"Courier New\",monospace}\r\n.dab-root *,.dab-root *::before,.dab-root *::after{box-sizing:border-box}\r\n.dab-root button{font-family:inherit}\r\n\r\n/* ── shell: nav rail + page body ─────────────────────────────────────────── */\r\n.dab-shell{display:grid;grid-template-columns:158px minmax(0,1fr);gap:26px;align-items:start;padding-bottom:8px;width:100%;max-width:980px;margin:0 auto}\r\n.dab-nav{position:sticky;top:0;display:flex;flex-direction:column;gap:18px}\r\n.dab-brand{display:flex;align-items:center;gap:10px;padding:2px 6px}\r\n.dab-brand-tile{width:30px;height:30px;flex:none;border-radius:9px;display:grid;place-items:center;color:var(--dsw-alias-brand-text);background:var(--dsw-alias-brand-primary);box-shadow:0 4px 14px -4px var(--dsw-alias-brand-primary)}\r\n.dab-brand-name{font-size:13px;font-weight:650;letter-spacing:.01em;line-height:1.25}\r\n.dab-brand-tag{font-size:9px;letter-spacing:.16em;font-weight:600;color:var(--dsw-alias-label-quaternary,var(--dsw-alias-label-tertiary));text-transform:uppercase}\r\n.dab-nav-list{position:relative;display:flex;flex-direction:column;gap:${NAV_GAP}px}\r\n.dab-nav-ind{position:absolute;left:0;right:0;top:0;height:${NAV_ITEM_H}px;border-radius:11px;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);background:color-mix(in srgb,var(--dsw-alias-brand-primary) 13%,transparent);border-color:color-mix(in srgb,var(--dsw-alias-brand-primary) 25%,transparent);transition:transform .38s cubic-bezier(.22,1,.36,1)}\r\n.dab-nav-item{position:relative;z-index:1;display:flex;align-items:center;gap:10px;height:${NAV_ITEM_H}px;padding:0 12px;border:0;background:none;border-radius:11px;color:var(--dsw-alias-label-tertiary);font-size:13px;cursor:pointer;text-align:left;transition:color .22s ease}\r\n.dab-nav-item:hover{color:var(--dsw-alias-label-primary)}\r\n.dab-nav-item.is-active{color:var(--dsw-alias-brand-primary);font-weight:600}\r\n.dab-nav-item svg{flex:none;transition:transform .3s cubic-bezier(.34,1.56,.64,1)}\r\n.dab-nav-item:hover svg{transform:scale(1.14) rotate(-5deg)}\r\n\r\n/* ── page chrome ─────────────────────────────────────────────────────────── */\r\n.dab-page{animation:dab-page-in .4s cubic-bezier(.22,1,.36,1) both;min-width:0;display:flex;flex-direction:column;gap:13px}\r\n.dab-head{margin:2px 0 5px}\r\n.dab-overline{font-size:10.5px;font-weight:700;letter-spacing:.18em;text-transform:uppercase;color:var(--dsw-alias-brand-primary);opacity:.9}\r\n.dab-h1{margin:4px 0 0;font-size:21px;font-weight:700;letter-spacing:-.01em}\r\n.dab-desc{margin:6px 0 0;font-size:12.5px;line-height:1.55;color:var(--dsw-alias-label-tertiary);max-width:56ch}\r\n.dab-card{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);border-radius:16px;padding:18px}\r\n.dab-card-hover{transition:transform .28s ease,box-shadow .28s ease,border-color .28s ease}\r\n.dab-card-hover:hover{transform:translateY(-2px);box-shadow:0 10px 28px -12px rgba(0,0,0,.28)}\r\n.dab-rise{animation:dab-rise-in .55s cubic-bezier(.22,1,.36,1) both;animation-delay:calc(var(--d,0) * 62ms)}\r\n\r\n/* ── accent hero (color orb) ─────────────────────────────────────────────── */\r\n.dab-hero-accent{display:flex;align-items:center;gap:24px;flex-wrap:wrap}\r\n.dab-orb-wrap{position:relative;width:118px;height:118px;flex:none}\r\n.dab-orb{position:absolute;inset:11px;border-radius:50%;background:radial-gradient(circle at 32% 28%,rgba(255,255,255,.5),rgba(255,255,255,0) 44%),var(--c,#888);box-shadow:0 16px 36px -10px var(--c-soft,transparent),inset 0 -10px 20px rgba(0,0,0,.16);animation:dab-orb-in .7s cubic-bezier(.22,1,.36,1) both}\r\n.dab-orb-ring{position:absolute;inset:0;border-radius:50%;background:conic-gradient(from 0deg,transparent 0 30%,var(--c,#888) 46%,transparent 62%,transparent 76%,var(--c,#888) 90%,transparent 100%);-webkit-mask:radial-gradient(farthest-side,transparent calc(100% - 3.5px),#000 calc(100% - 2.5px));mask:radial-gradient(farthest-side,transparent calc(100% - 3.5px),#000 calc(100% - 2.5px));animation:dab-spin 7s linear infinite;opacity:.9}\r\n.dab-hex-caption{font-size:11px;color:var(--dsw-alias-label-tertiary);letter-spacing:.04em}\r\n.dab-hex{font-family:var(--dab-mono);font-size:24px;font-weight:600;letter-spacing:.02em;line-height:1.2;margin-top:2px}\r\n.dab-hsl-row{display:flex;gap:16px;margin-top:7px;font-family:var(--dab-mono);font-size:11px;color:var(--dsw-alias-label-tertiary)}\r\n.dab-hsl-row b{font-weight:600;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\r\n\r\n/* ── swatches ────────────────────────────────────────────────────────────── */\r\n.dab-swatch-title{font-size:12px;font-weight:600;margin-bottom:10px;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\r\n.dab-swatches{display:flex;flex-wrap:wrap;gap:9px}\r\n.dab-swatch{width:25px;height:25px;border-radius:50%;border:0;padding:0;cursor:pointer;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);transition:transform .22s cubic-bezier(.34,1.56,.64,1),box-shadow .22s ease}\r\n.dab-swatch:hover{transform:scale(1.2)}\r\n.dab-swatch.is-on{box-shadow:0 0 0 2px var(--dsw-alias-bg-layer-1),0 0 0 4px var(--dsw-alias-brand-primary)}\r\n\r\n/* ── wheel card ──────────────────────────────────────────────────────────── */\r\n.dab-wheel-card{position:relative;display:flex;align-items:center;justify-content:center;gap:28px;flex-wrap:wrap;padding:24px 18px}\r\n.dab-wheel-glow{position:absolute;width:230px;height:230px;border-radius:50%;filter:blur(48px);opacity:.2;background:var(--c,#888);pointer-events:none;transition:background .4s ease}\r\n.dab-wheel{position:relative;cursor:crosshair;border-radius:50%;box-shadow:0 12px 32px -14px rgba(0,0,0,.4)}\r\n.dab-hint{font-size:11.5px;line-height:1.55;color:var(--dsw-alias-label-tertiary);padding:0 4px}\r\n\r\n/* ── precise color inputs ────────────────────────────────────────────────── */\r\n.dab-inputs{display:flex;flex-direction:column;gap:10px;min-width:172px}\r\n.dab-field{display:flex;align-items:center;gap:8px}\r\n.dab-field-label{width:14px;text-align:center;font-family:var(--dab-mono);font-size:11px;font-weight:600;color:var(--dsw-alias-label-tertiary)}\r\n.dab-num{flex:1;min-width:0;height:30px;padding:0 10px;border-radius:9px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font-family:var(--dab-mono);font-size:12px;outline:none;transition:border-color .2s,box-shadow .2s}\r\n.dab-num:focus{border-color:var(--dsw-alias-brand-primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--dsw-alias-brand-primary) 18%,transparent)}\r\n.dab-num::-webkit-outer-spin-button,.dab-num::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}\r\n.dab-num{-moz-appearance:textfield;appearance:textfield}\r\n.dab-urlinput{flex:1;min-width:180px;height:34px;padding:0 12px;border-radius:10px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font-size:12.5px;outline:none;transition:border-color .2s}\r\n.dab-urlinput::placeholder{color:var(--dsw-alias-label-quaternary)}\r\n.dab-urlinput:focus{border-color:var(--dsw-alias-brand-primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--dsw-alias-brand-primary) 18%,transparent)}\r\n.dab-swatch-lg{height:38px;border-radius:10px;border:1px solid var(--dsw-alias-border-l2);box-shadow:inset 0 0 14px rgba(0,0,0,.1);transition:transform .3s ease}\r\n.dab-swatch-lg:hover{transform:scale(1.02)}\r\n\r\n/* ── buttons & chips ─────────────────────────────────────────────────────── */\r\n.dab-btn{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:34px;padding:0 14px;border-radius:10px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-elevated-fill);color:var(--dsw-alias-label-primary);font-size:12.5px;font-weight:550;cursor:pointer;transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease,opacity .18s ease,background .18s ease}\r\n.dab-btn:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 5px 14px -6px rgba(0,0,0,.32)}\r\n.dab-btn:active:not(:disabled){transform:translateY(0) scale(.97);box-shadow:none}\r\n.dab-btn:disabled{opacity:.5;cursor:not-allowed}\r\n.dab-btn-primary{background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-text);border-color:transparent}\r\n.dab-btn-danger{color:var(--dsw-alias-state-error-primary)}\r\n.dab-btn-ghost{background:transparent;border-color:transparent;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\r\n.dab-btn-ghost:hover:not(:disabled){background:var(--dsw-alias-bg-layer-2);box-shadow:none}\r\n.dab-btn:focus-visible,.dab-nav-item:focus-visible,.dab-seg-item:focus-visible,.dab-swatch:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}\r\n.dab-chip-row{display:flex;flex-wrap:wrap;gap:8px}\r\n.dab-chip{height:30px;padding:0 14px;border-radius:99px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary));font-size:12px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;transition:all .22s ease}\r\n.dab-chip:hover{border-color:var(--dsw-alias-brand-primary);color:var(--dsw-alias-label-primary)}\r\n.dab-chip.is-active{background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-text);border-color:transparent}\r\n\r\n/* ── sliders ─────────────────────────────────────────────────────────────── */\r\n.dab-slider-block{display:flex;flex-direction:column;gap:6px}\r\n.dab-slider-block + .dab-slider-block{margin-top:13px}\r\n.dab-slider-label{font-size:12px;font-weight:550;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\r\n.dab-slider-val{font-family:var(--dab-mono);font-size:11px;color:var(--dsw-alias-label-tertiary);min-width:44px;text-align:right}\r\n.dab-slider{-webkit-appearance:none;appearance:none;flex:1;min-width:0;height:4px;border-radius:99px;outline:none;cursor:pointer;margin:5px 0;background:linear-gradient(to right,var(--dsw-alias-brand-primary) calc(var(--pct,50) * 1%),var(--dsw-alias-border-l2) calc(var(--pct,50) * 1%));transition:height .15s ease}\r\n.dab-slider:hover{height:5px}\r\n.dab-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:15px;height:15px;border-radius:50%;background:var(--dsw-alias-button-elevated-fill,#fff);border:2px solid var(--dsw-alias-brand-primary);box-shadow:0 1px 5px rgba(0,0,0,.28);transition:transform .16s cubic-bezier(.34,1.56,.64,1)}\r\n.dab-slider:hover::-webkit-slider-thumb,.dab-slider:focus-visible::-webkit-slider-thumb{transform:scale(1.22)}\r\n.dab-slider:active::-webkit-slider-thumb{transform:scale(1.34)}\r\n.dab-slider::-moz-range-thumb{width:13px;height:13px;border-radius:50%;background:var(--dsw-alias-button-elevated-fill,#fff);border:2px solid var(--dsw-alias-brand-primary)}\r\n\r\n/* ── interface part cards ────────────────────────────────────────────────── */\r\n.dab-grid-parts{display:grid;grid-template-columns:repeat(auto-fill,minmax(256px,1fr));gap:13px}\r\n.dab-part-head{display:flex;align-items:center;gap:11px;margin-bottom:14px}\r\n.dab-part-ico{width:32px;height:32px;flex:none;border-radius:10px;display:grid;place-items:center;color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-bg-layer-2);background:color-mix(in srgb,var(--dsw-alias-brand-primary) 12%,transparent)}\r\n.dab-part-name{font-size:13.5px;font-weight:600}\r\n.dab-part-badge{margin-left:auto;font-family:var(--dab-mono);font-size:11px;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2);border-radius:99px;padding:3px 9px}\r\n\r\n/* ── segmented control ───────────────────────────────────────────────────── */\r\n.dab-seg{position:relative;display:inline-flex;padding:3px;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:11px}\r\n.dab-seg-thumb{position:absolute;top:3px;bottom:3px;left:3px;width:var(--w,96px);border-radius:8px;background:var(--dsw-alias-button-elevated-fill);box-shadow:0 2px 8px -2px rgba(0,0,0,.28);transition:transform .32s cubic-bezier(.22,1,.36,1)}\r\n.dab-seg-item{position:relative;z-index:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;width:var(--w,96px);height:30px;border:0;background:none;border-radius:8px;color:var(--dsw-alias-label-tertiary);font-size:12.5px;cursor:pointer;transition:color .25s ease}\r\n.dab-seg-item.is-active{color:var(--dsw-alias-label-primary);font-weight:600}\r\n\r\n/* ── toggle switch ───────────────────────────────────────────────────────── */\r\n.dab-toggle{position:relative;width:42px;height:24px;flex:none;border-radius:99px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);cursor:pointer;padding:0;transition:background .28s ease,border-color .28s ease}\r\n.dab-toggle-knob{position:absolute;top:2.5px;left:2.5px;width:17px;height:17px;border-radius:50%;background:var(--dsw-alias-label-secondary,#999);box-shadow:0 1px 3px rgba(0,0,0,.3);transition:transform .28s cubic-bezier(.22,1,.36,1),background .28s ease}\r\n.dab-toggle.is-on{background:var(--dsw-alias-brand-primary);border-color:var(--dsw-alias-brand-primary)}\r\n.dab-toggle.is-on .dab-toggle-knob{transform:translateX(18px);background:#fff}\r\n\r\n/* ── background preview hero ─────────────────────────────────────────────── */\r\n.dab-hero{position:relative;border-radius:16px;overflow:hidden;aspect-ratio:16/9;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2)}\r\n.dab-hero-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;transition:transform .5s cubic-bezier(.22,1,.36,1)}\r\n.dab-hero:hover .dab-hero-img{transform:scale(1.03)}\r\n.dab-hero-empty{position:absolute;inset:6px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;color:var(--dsw-alias-label-tertiary);font-size:12.5px;border:1.5px dashed var(--dsw-alias-border-l2);border-radius:12px;cursor:pointer;background:transparent;transition:border-color .25s,color .25s,background .25s;width:auto;height:auto}\r\n.dab-hero-empty:hover{border-color:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-primary)}\r\n.dab-hero-empty.is-over{border-color:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-primary);background:color-mix(in srgb,var(--dsw-alias-brand-primary) 8%,transparent)}\r\n.dab-hero-badge{position:absolute;top:10px;left:10px;display:inline-flex;align-items:center;gap:5px;height:24px;padding:0 11px;border-radius:99px;background:rgba(0,0,0,.45);color:#fff;font-size:11px;backdrop-filter:blur(6px);pointer-events:none}\r\n.dab-hero-veil{position:absolute;left:0;right:0;bottom:0;padding:34px 12px 12px;display:flex;align-items:flex-end;justify-content:flex-end;gap:8px;background:linear-gradient(to top,rgba(0,0,0,.55),rgba(0,0,0,0));opacity:0;transform:translateY(6px);transition:opacity .3s ease,transform .3s ease}\r\n.dab-hero:hover .dab-hero-veil{opacity:1;transform:none}\r\n.dab-hero-veil .dab-btn{background:rgba(255,255,255,.94);color:#14161a;border-color:transparent;height:30px;font-size:12px}\r\n.dab-hero-veil .dab-btn-danger{color:#dc2626}\r\n\r\n/* ── profile page ────────────────────────────────────────────────────────── */\r\n.dab-profile-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(238px,1fr));gap:13px}\r\n.dab-profile-ico{width:38px;height:38px;border-radius:11px;display:grid;place-items:center;margin-bottom:13px;color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-bg-layer-2);background:color-mix(in srgb,var(--dsw-alias-brand-primary) 12%,transparent)}\r\n.dab-profile-title{font-size:14px;font-weight:650}\r\n.dab-profile-desc{font-size:12px;color:var(--dsw-alias-label-tertiary);line-height:1.55;margin:5px 0 15px}\r\n.dab-footer{margin-top:6px;padding:14px 4px 0;border-top:1px solid var(--dsw-alias-border-l2);display:flex;align-items:center;justify-content:space-between;font-size:11px;color:var(--dsw-alias-label-tertiary)}\r\n.dab-footer-mono{font-family:var(--dab-mono);letter-spacing:.02em}\r\n\r\n/* ── toast ───────────────────────────────────────────────────────────────── */\r\n.dab-toast{position:fixed;left:50%;bottom:30px;transform:translateX(-50%);display:flex;align-items:center;gap:8px;height:38px;padding:0 16px;border-radius:99px;background:var(--dsw-alias-bg-layer-3,var(--dsw-alias-bg-layer-2));border:1px solid var(--dsw-alias-border-l2);box-shadow:0 10px 30px -8px rgba(0,0,0,.38);font-size:12.5px;z-index:10001;animation:dab-toast-in .32s cubic-bezier(.22,1,.36,1) both}\r\n.dab-toast-ok{color:var(--dsw-alias-brand-primary);display:grid;place-items:center}\r\n.dab-toast-err{color:var(--dsw-alias-state-error-primary);display:grid;place-items:center}\r\n\r\n/* ── modals (editor / eyedropper / crash) ────────────────────────────────── */\r\n/* Pin to the viewport explicitly with vw/vh so ancestor padding/margins on\r\n * body cannot shift or clip the overlay; keep it above host sidebar chrome.\r\n * pointer-events:auto re-enables interaction: these overlays render inside a\r\n * Portal root that is pointer-events:none so it never blocks the page alone. */\r\n.dab-overlay{position:fixed;left:0;top:0;width:100vw;height:100vh;z-index:999999;background:rgba(8,10,14,.62);backdrop-filter:blur(8px);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;animation:dab-fade-in .25s ease both;pointer-events:auto}\r\n.dab-overlay-title{color:#fff;font-size:15px;font-weight:600}\r\n.dab-overlay-hint{color:rgba(255,255,255,.62);font-size:12px}\r\n.dab-modal-card{animation:dab-zoom-in .3s cubic-bezier(.22,1,.36,1) both;max-width:calc(100vw - 40px);max-height:calc(100vh - 120px);overflow:auto}\r\n.dab-overlay .dab-btn{background:rgba(255,255,255,.94);color:#14161a;border-color:transparent}\r\n.dab-overlay .dab-btn-primary{background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-text)}\r\n.dab-crash{display:flex;flex-direction:column;gap:10px;align-items:center;padding:28px 18px;border:1px solid var(--dsw-alias-border-l2);border-radius:16px}\r\n.dab-crash-title{font-size:15px;font-weight:650}\r\n.dab-crash-desc{font-size:12px;color:var(--dsw-alias-label-tertiary);text-align:center;line-height:1.5}\r\n\r\n/* ── model rules ─────────────────────────────────────────────────────────── */\r\n.dab-rules{display:flex;flex-direction:column;gap:12px}\r\n.dab-rule{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);border-radius:16px;padding:14px;transition:border-color .25s,box-shadow .25s,opacity .25s}\r\n.dab-rule.is-active{border-color:var(--dsw-alias-brand-primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--dsw-alias-brand-primary) 16%,transparent)}\r\n.dab-rule.is-off{opacity:.55}\r\n.dab-rule-head{display:flex;align-items:center;gap:9px;flex-wrap:wrap}\r\n.dab-rule-num{font-family:var(--dab-mono);font-size:11px;font-weight:700;color:var(--dsw-alias-label-tertiary);min-width:16px}\r\n.dab-rule-badge{font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dsw-alias-brand-primary);background:color-mix(in srgb,var(--dsw-alias-brand-primary) 14%,transparent);border-radius:99px;padding:2px 8px}\r\n.dab-rule-match{flex:1;min-width:150px;height:32px;padding:0 11px;border-radius:9px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font-family:var(--dab-mono);font-size:12.5px;outline:none;transition:border-color .2s,box-shadow .2s}\r\n.dab-rule-match::placeholder{color:var(--dsw-alias-label-quaternary)}\r\n.dab-rule-match:focus{border-color:var(--dsw-alias-brand-primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--dsw-alias-brand-primary) 18%,transparent)}\r\n.dab-icon-btn{width:28px;height:28px;flex:none;display:grid;place-items:center;border-radius:8px;border:1px solid var(--dsw-alias-border-l2);background:transparent;color:var(--dsw-alias-label-tertiary);cursor:pointer;transition:color .2s,border-color .2s,background .2s}\r\n.dab-icon-btn:hover:not(:disabled){color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-brand-primary)}\r\n.dab-icon-btn:disabled{opacity:.35;cursor:not-allowed}\r\n.dab-icon-btn-danger:hover:not(:disabled){color:var(--dsw-alias-state-error-primary);border-color:var(--dsw-alias-state-error-primary)}\r\n.dab-rule-body{margin-top:13px;display:flex;flex-direction:column;gap:13px}\r\n.dab-rule-thumb{position:relative;border-radius:12px;overflow:hidden;aspect-ratio:16/9;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);cursor:pointer}\r\n.dab-rule-thumb img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}\r\n.dab-rule-thumb-empty{position:absolute;inset:5px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;border:1.5px dashed var(--dsw-alias-border-l2);border-radius:9px;color:var(--dsw-alias-label-tertiary);font-size:12px;text-align:center;padding:0 10px}\r\n.dab-rule-thumb.is-over .dab-rule-thumb-empty{border-color:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-primary)}\r\n.dab-rule-cols{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);gap:18px;align-items:start}\r\n.dab-rule-section-title{font-size:12px;font-weight:600;margin-bottom:9px;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\r\n@container (max-width:760px){.dab-rule-cols{grid-template-columns:1fr}}\r\n\r\n/* ── host self-check ─────────────────────────────────────────────────────── */\r\n.dab-verdict{display:flex;flex-direction:column;gap:14px;position:relative;overflow:hidden}\r\n.dab-verdict::after{content:'';position:absolute;inset:0;pointer-events:none;opacity:.5;background:linear-gradient(120deg,transparent 55%,color-mix(in srgb,var(--dab-verdict-tone,transparent) 26%,transparent))}\r\n.dab-verdict-ok{--dab-verdict-tone:var(--dsw-alias-state-success-primary,var(--dsw-alias-brand-primary));border-color:color-mix(in srgb,var(--dsw-alias-state-success-primary,var(--dsw-alias-brand-primary)) 38%,var(--dsw-alias-border-l2))}\r\n.dab-verdict-partial,.dab-verdict-broken{--dab-verdict-tone:var(--dsw-alias-state-error-primary);border-color:color-mix(in srgb,var(--dsw-alias-state-error-primary) 40%,var(--dsw-alias-border-l2))}\r\n.dab-verdict-unknown{--dab-verdict-tone:var(--dsw-alias-label-tertiary)}\r\n.dab-verdict-head{display:flex;align-items:center;gap:13px;flex-wrap:wrap}\r\n.dab-verdict-ico{width:34px;height:34px;flex:none;border-radius:11px;display:grid;place-items:center;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2)}\r\n.dab-verdict-ico-ok{color:var(--dsw-alias-state-success-primary,var(--dsw-alias-brand-primary));background:color-mix(in srgb,var(--dsw-alias-state-success-primary,var(--dsw-alias-brand-primary)) 14%,transparent)}\r\n.dab-verdict-ico-partial,.dab-verdict-ico-broken{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 14%,transparent)}\r\n.dab-verdict-text{flex:1;min-width:170px}\r\n.dab-verdict-title{font-size:14.5px;font-weight:650}\r\n.dab-verdict-sub{margin-top:4px;font-size:12px;color:var(--dsw-alias-label-tertiary)}\r\n.dab-verdict-actions{display:flex;gap:8px;flex-wrap:wrap;margin-left:auto}\r\n.dab-facts{display:flex;flex-wrap:wrap;gap:8px;position:relative;z-index:1}\r\n.dab-fact{display:inline-flex;align-items:center;gap:7px;height:27px;padding:0 11px;border-radius:99px;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);max-width:100%}\r\n.dab-fact.is-bad{border-color:color-mix(in srgb,var(--dsw-alias-state-error-primary) 45%,transparent);background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 10%,transparent)}\r\n.dab-fact-k{font-size:10.5px;font-weight:650;letter-spacing:.06em;text-transform:uppercase;color:var(--dsw-alias-label-tertiary);white-space:nowrap}\r\n.dab-fact-v{font-family:var(--dab-mono);font-size:11.5px;color:var(--dsw-alias-label-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:32ch}\r\n.dab-check-group-title{display:flex;align-items:center;gap:9px;font-size:12.5px;font-weight:650;margin-bottom:11px}\r\n.dab-check-group-count{margin-left:auto;font-family:var(--dab-mono);font-size:11px;font-weight:500;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2);border-radius:99px;padding:3px 9px}\r\n.dab-checks{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px}\r\n.dab-check{display:flex;gap:10px;padding:9px 10px;border-radius:11px;transition:background .2s ease}\r\n.dab-check:hover{background:var(--dsw-alias-bg-layer-2)}\r\n.dab-check-ico{width:19px;height:19px;flex:none;margin-top:1px;border-radius:50%;display:grid;place-items:center;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2)}\r\n.dab-check-ico-pass{color:var(--dsw-alias-state-success-primary,var(--dsw-alias-brand-primary));background:color-mix(in srgb,var(--dsw-alias-state-success-primary,var(--dsw-alias-brand-primary)) 15%,transparent)}\r\n.dab-check-ico-fail{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 15%,transparent)}\r\n.dab-check-dot{width:5px;height:5px;border-radius:50%;background:currentColor;opacity:.65}\r\n.dab-check-body{min-width:0;flex:1;display:flex;flex-direction:column;gap:3px}\r\n.dab-check-head{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}\r\n.dab-check-label{font-size:12.5px;font-weight:600}\r\n.dab-check-status{font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;padding:1px 7px;border-radius:99px;background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-tertiary)}\r\n.dab-check-status-pass{color:var(--dsw-alias-state-success-primary,var(--dsw-alias-brand-primary));background:color-mix(in srgb,var(--dsw-alias-state-success-primary,var(--dsw-alias-brand-primary)) 14%,transparent)}\r\n.dab-check-status-fail{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 14%,transparent)}\r\n.dab-check-target{font-family:var(--dab-mono);font-size:10.5px;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2);border-radius:6px;padding:1px 6px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\r\n.dab-check-detail{font-family:var(--dab-mono);font-size:11px;color:var(--dsw-alias-label-tertiary);line-height:1.5;overflow-wrap:anywhere}\r\n.dab-check-reason{display:flex;flex-direction:column;gap:5px;font-size:12px;line-height:1.55;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\r\n.dab-check-symptom{color:var(--dsw-alias-state-error-primary)}\r\n.dab-check-where{display:flex;gap:7px;align-items:baseline;flex-wrap:wrap;font-size:11px;color:var(--dsw-alias-label-tertiary)}\r\n.dab-check-where code{font-family:var(--dab-mono);font-size:10.5px;overflow-wrap:anywhere}\r\n.dab-check-note{margin:12px 0 0;font-size:11.5px;line-height:1.55;color:var(--dsw-alias-label-tertiary);position:relative;z-index:1}\r\n\r\n/* ── keyframes ───────────────────────────────────────────────────────────── */\r\n@keyframes dab-fade-in{from{opacity:0}to{opacity:1}}\r\n@keyframes dab-page-in{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}\r\n@keyframes dab-rise-in{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}\r\n@keyframes dab-orb-in{from{opacity:0;transform:scale(.82)}to{opacity:1;transform:none}}\r\n@keyframes dab-spin{to{transform:rotate(360deg)}}\r\n@keyframes dab-rotate{to{transform:rotate(360deg)}}\r\n@keyframes dab-toast-in{from{opacity:0;transform:translate(-50%,10px)}to{opacity:1;transform:translate(-50%,0)}}\r\n@keyframes dab-zoom-in{from{opacity:0;transform:scale(.94) translateY(8px)}to{opacity:1;transform:none}}\r\n@keyframes dab-flow{to{background-position:300% 50%}}\r\n\r\n/* ── responsive & motion preferences ─────────────────────────────────────── */\r\n@container (max-width:620px){\r\n .dab-shell{grid-template-columns:1fr;gap:14px}\r\n .dab-nav{position:static;flex-direction:row;align-items:center;justify-content:space-between;gap:10px}\r\n .dab-nav-list{flex-direction:row;overflow-x:auto;scrollbar-width:none}\r\n .dab-nav-list::-webkit-scrollbar{display:none}\r\n .dab-nav-ind{display:none}\r\n .dab-nav-item{flex:none;padding:0 10px}\r\n .dab-nav-item.is-active{background:var(--dsw-alias-bg-layer-2)}\r\n .dab-types{grid-template-columns:1fr}\r\n .dab-verdict-actions{margin-left:0;width:100%}\r\n .dab-verdict-actions .dab-btn{flex:1}\r\n}\r\n@container (min-width:621px){\r\n .dab-shell{grid-template-columns:158px minmax(0,1fr);gap:26px}\r\n}\r\n@media (prefers-reduced-motion:reduce){\r\n .dab-root *,.dab-root *::before,.dab-root *::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}\r\n}\r\n`\r\n\r\nconst CSS_ID = 'dab-ui-css'\r\n\r\n/** Inject the design-system stylesheet once per document (HMR-safe). */\r\nexport function ensureUiCss(): void {\r\n if (typeof document === 'undefined') return\r\n let el = document.getElementById(CSS_ID) as HTMLStyleElement | null\r\n if (!el) {\r\n el = document.createElement('style')\r\n el.id = CSS_ID\r\n document.head.appendChild(el)\r\n }\r\n if (el.textContent !== UI_CSS) el.textContent = UI_CSS\r\n}\r\n","import type { ReactNode } from 'react'\r\n\r\n/** Sun glyph, migrated from @deepseek-ai/dsh-client-ui-primitives IconLightOutline16. */\r\nexport const SUN_PATHS = '<path d=\"M11.3496 8C11.3496 6.14985 9.85015 4.65039 8 4.65039C6.14985 4.65039 4.65039 6.14985 4.65039 8C4.65039 9.85015 6.14985 11.3496 8 11.3496C9.85015 11.3496 11.3496 9.85015 11.3496 8ZM12.6504 8C12.6504 10.5681 10.5681 12.6504 8 12.6504C5.43188 12.6504 3.34961 10.5681 3.34961 8C3.34961 5.43188 5.43188 3.34961 8 3.34961C10.5681 3.34961 12.6504 5.43188 12.6504 8Z\" fill=\"currentColor\"/><path d=\"M8.65039 0.5V2.5H7.34961V0.5H8.65039Z\" fill=\"currentColor\"/><path d=\"M8.65039 13.5V15.5H7.34961V13.5H8.65039Z\" fill=\"currentColor\"/><path d=\"M3.15808 2.24035L4.57229 3.65456L3.6525 4.57435L2.23829 3.16014L3.15808 2.24035Z\" fill=\"currentColor\"/><path d=\"M12.3505 11.4327L13.7647 12.8469L12.8449 13.7667L11.4307 12.3525L12.3505 11.4327Z\" fill=\"currentColor\"/><path d=\"M2.24537 12.8469L3.65958 11.4327L4.57937 12.3525L3.16516 13.7667L2.24537 12.8469Z\" fill=\"currentColor\"/><path d=\"M11.4377 3.65455L12.852 2.24033L13.7718 3.16012L12.3575 4.57434L11.4377 3.65455Z\" fill=\"currentColor\"/><path d=\"M0.5 7.35461H2.5V8.6554H0.5L0.5 7.35461Z\" fill=\"currentColor\"/><path d=\"M13.5 7.35461H15.5V8.6554H13.5V8.6554Z\" fill=\"currentColor\"/>'\r\n\r\nexport function SunIcon({ size = 16, className }: { size?: number; className?: string }) {\r\n return (\r\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" dangerouslySetInnerHTML={{ __html: SUN_PATHS }} />\r\n )\r\n}\r\n\r\nfunction Glyph({ children, size = 16, className }: { children: ReactNode; size?: number; className?: string }) {\r\n return (\r\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\r\n {children}\r\n </svg>\r\n )\r\n}\r\n\r\nexport const DropletIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M8 1.9c2.4 2.8 4.3 5 4.3 7.1a4.3 4.3 0 1 1-8.6 0C3.7 6.9 5.6 4.7 8 1.9z\" /></Glyph>\r\n)\r\n\r\nexport const LayersIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M8 2.2 13.2 5 8 7.8 2.8 5 8 2.2z\" /><path d=\"M2.8 8.2 8 11l5.2-2.8\" /><path d=\"M2.8 11.2 8 14l5.2-2.8\" /></Glyph>\r\n)\r\n\r\nexport const PhotoIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"2\" y=\"3.2\" width=\"12\" height=\"9.6\" rx=\"2\" /><circle cx=\"5.7\" cy=\"6.3\" r=\"0.9\" /><path d=\"M14 10.4l-2.8-2.8-4.8 4.8\" /></Glyph>\r\n)\r\n\r\nexport const VideoIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"1.5\" y=\"4.2\" width=\"8.8\" height=\"7.6\" rx=\"2\" /><path d=\"M10.3 6.9l4.2-2.4v7l-4.2-2.4\" /></Glyph>\r\n)\r\n\r\nexport const TextIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M3 4.2h10M3 8h10M3 11.8h6.5\" /></Glyph>\r\n)\r\n\r\nexport const TrajectoryIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M2.5 3.2h11M2.5 6.6h11M2.5 10h11\" /><circle cx=\"4.4\" cy=\"3.2\" r=\"1.1\" /><circle cx=\"8\" cy=\"6.6\" r=\"1.1\" /><circle cx=\"11.4\" cy=\"10\" r=\"1.1\" /></Glyph>\r\n)\r\n\r\nexport const SlidersIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M2.5 4.5h4.9M11.6 4.5h1.9M2.5 11.5h1.9M8.6 11.5h4.9\" /><circle cx=\"9.5\" cy=\"4.5\" r=\"1.7\" /><circle cx=\"5.5\" cy=\"11.5\" r=\"1.7\" /></Glyph>\r\n)\r\n\r\nexport const SparkleIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M7.2 1.8l1.2 3.1 3.1 1.2-3.1 1.2-1.2 3.1-1.2-3.1L2.9 6.1 6 4.9l1.2-3.1z\" /><path d=\"M12 10.5l.5 1.2 1.2.5-1.2.5-.5 1.2-.5-1.2-1.2-.5 1.2-.5.5-1.2z\" /></Glyph>\r\n)\r\n\r\nexport const RefreshIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M13.2 8A5.2 5.2 0 1 1 11.5 4.2\" /><path d=\"M13.4 1.8v2.9h-2.9\" /></Glyph>\r\n)\r\n\r\nexport const DownloadIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M8 2.2v8\" /><path d=\"M4.6 7l3.4 3.4L11.4 7\" /><path d=\"M2.8 13.8h10.4\" /></Glyph>\r\n)\r\n\r\nexport const UploadIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M8 10.4V2.6\" /><path d=\"M4.6 5.8L8 2.4l3.4 3.4\" /><path d=\"M2.8 13.8h10.4\" /></Glyph>\r\n)\r\n\r\nexport const LinkIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M6.6 9.4 9.4 6.6\" /><path d=\"M5.9 11.1l-1.4 1.4a2.6 2.6 0 0 1-3.7-3.7L3.5 6.8\" /><path d=\"M10.1 4.9l1.4-1.4a2.6 2.6 0 0 1 3.7 3.7l-2.1 2.1\" /></Glyph>\r\n)\r\n\r\nexport const LockIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"3.6\" y=\"7.2\" width=\"8.8\" height=\"6\" rx=\"1.4\" /><path d=\"M5.6 7.2V5.4a2.4 2.4 0 0 1 4.8 0v1.8\" /></Glyph>\r\n)\r\n\r\nexport const TrashIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M2.8 4.4h10.4\" /><path d=\"M6.4 4.4V2.9h3.2v1.5\" /><path d=\"M4.4 4.4l.5 8.6h6.2l.5-8.6\" /></Glyph>\r\n)\r\n\r\nexport const EditIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M9.5 4l2.5 2.5\" /><path d=\"M3 13l.8-3L10 3.8 12.2 6 6 12.2 3 13z\" /></Glyph>\r\n)\r\n\r\nexport const PipetteIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><circle cx=\"8\" cy=\"8\" r=\"4.2\" /><path d=\"M8 1.6v2.6M8 11.8v2.6M1.6 8h2.6M11.8 8h2.6\" /></Glyph>\r\n)\r\n\r\nexport const CheckIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M3.2 8.6l3 3L12.8 5\" /></Glyph>\r\n)\r\n\r\nexport const AlertIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M8 2.6l5.4 9.8H2.6L8 2.6z\" /><path d=\"M8 6.8v2.4M8 11.4v.01\" /></Glyph>\r\n)\r\n\r\nexport const CopyIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"5.4\" y=\"5.4\" width=\"7.6\" height=\"7.6\" rx=\"1.6\" /><path d=\"M10.6 5.4V4.2a1.6 1.6 0 0 0-1.6-1.6H4.2a1.6 1.6 0 0 0-1.6 1.6v4.8a1.6 1.6 0 0 0 1.6 1.6h1.2\" /></Glyph>\r\n)\r\n\r\nexport const CanvasIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"2.2\" y=\"2.2\" width=\"11.6\" height=\"11.6\" rx=\"2\" /></Glyph>\r\n)\r\n\r\nexport const SidebarIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"2.2\" y=\"2.2\" width=\"11.6\" height=\"11.6\" rx=\"2\" /><path d=\"M6.6 2.2v11.6\" /></Glyph>\r\n)\r\n\r\n/** Mirror of SidebarIcon: the file-preview panel docked to the right edge. */\r\nexport const PreviewIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"2.2\" y=\"2.2\" width=\"11.6\" height=\"11.6\" rx=\"2\" /><path d=\"M9.4 2.2v11.6\" /><path d=\"M11 5.6h1.2M11 8h1.2\" /></Glyph>\r\n)\r\n\r\nexport const ChatIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M13.4 4.4v4.4a2 2 0 0 1-2 2H6.2l-3.6 3V4.4a2 2 0 0 1 2-2h6.8a2 2 0 0 1 2 2z\" /></Glyph>\r\n)\r\n\r\nexport const GearIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><circle cx=\"8\" cy=\"8\" r=\"2.1\" /><path d=\"M8 1.7v1.8M8 12.5v1.8M1.7 8h1.8M12.5 8h1.8M3.6 3.6l1.3 1.3M11.1 11.1l1.3 1.3M12.4 3.6l-1.3 1.3M4.9 11.1l-1.3 1.3\" /></Glyph>\r\n)\r\n\r\nexport const InputIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"2.2\" y=\"4\" width=\"11.6\" height=\"8\" rx=\"2\" /><path d=\"M8 6.6v2M7 8h2\" /></Glyph>\r\n)\r\n\r\n","import { Component, type ReactNode } from 'react'\r\n\r\ninterface Props {\r\n t: (key: string) => string\r\n onReset?: () => void\r\n children: ReactNode\r\n}\r\n\r\ninterface State {\r\n error: Error | null\r\n}\r\n\r\n/**\r\n * Catches render errors from the theme section subtree (wheel, sliders, editor)\r\n * so a single bad state can never take down the whole settings panel. Shows a\r\n * compact fallback with a reset button; the reset re-renders the section with\r\n * the current saved config, which is enough to recover from most transient\r\n * failures (corrupt transient UI state, stale image decode, etc.).\r\n */\r\nexport class ErrorBoundary extends Component<Props, State> {\r\n override state: State = { error: null }\r\n\r\n static getDerivedStateFromError(error: Error): State {\r\n return { error }\r\n }\r\n\r\n override componentDidCatch(error: Error, info: { componentStack?: string | null }): void {\r\n console.error('dsh-background-by-model: section render crashed', error, info.componentStack)\r\n }\r\n\r\n private reset = (): void => {\r\n this.setState({ error: null })\r\n this.props.onReset?.()\r\n }\r\n\r\n override render() {\r\n if (this.state.error) {\r\n return (\r\n <div className=\"dab-crash\">\r\n <div className=\"dab-crash-title\">{this.props.t('crashTitle')}</div>\r\n <div className=\"dab-crash-desc\">{this.props.t('crashDesc')}</div>\r\n <button type=\"button\" className=\"dab-btn\" onClick={this.reset}>{this.props.t('crashReset')}</button>\r\n </div>\r\n )\r\n }\r\n return this.props.children\r\n }\r\n}\r\n","import { useEffect, useState } from 'react'\r\nimport type { ReactNode } from 'react'\r\nimport { createPortal } from 'react-dom'\r\n\r\n/**\r\n * Render children into a fixed root attached to document.documentElement.\r\n *\r\n * The host's sidebar is often implemented by translating the body or a wrapper\r\n * (margin-left / transform). A fixed element portaled to body would still be\r\n * captured by that transformed ancestor and shift with the sidebar. Attaching\r\n * the portal root directly to <html> escapes body-level transforms so the\r\n * overlay is always painted relative to the viewport and centered correctly.\r\n */\r\nexport function Portal({ children }: { children: ReactNode }) {\r\n const [target, setTarget] = useState<HTMLElement | null>(null)\r\n useEffect(() => {\r\n const el = document.createElement('div')\r\n el.dataset.dabPortal = '1'\r\n el.style.cssText = 'position:fixed;inset:0;pointer-events:none;z-index:999999'\r\n document.documentElement.appendChild(el)\r\n setTarget(el)\r\n return () => { el.remove() }\r\n }, [])\r\n return target ? createPortal(children, target) : null\r\n}\r\n","import { useEffect, useRef } from 'react'\r\nimport type { CSSProperties } from 'react'\r\n\r\n/**\r\n * Zero-lag slider: the thumb and value label update through DOM refs while\r\n * dragging (onInput) so the caller can mutate the live UI directly without a\r\n * React re-render; onChange commits the settled value. Double-click resets to\r\n * the canonical default. The track fill is a gradient driven by the --pct\r\n * custom property, updated imperatively alongside the thumb.\r\n */\r\nexport function LiveSlider({ min, max, step, def, fmt, label, onInput, onChange }: {\r\n min: number; max: number; step: number; def: number\r\n fmt: (v: number) => string; label?: string; onInput?: (v: number) => void; onChange: (v: number) => void\r\n}) {\r\n const inputRef = useRef<HTMLInputElement>(null)\r\n const valRef = useRef<HTMLSpanElement>(null)\r\n\r\n const paint = (el: HTMLInputElement, v: number): void => {\r\n el.style.setProperty('--pct', String(((v - min) / (max - min)) * 100))\r\n }\r\n\r\n // Controlled sync: keep the knob and label aligned with the canonical prop\r\n // so external updates (presets, regeneration, imports) never leave it stale.\r\n useEffect(() => {\r\n if (inputRef.current) {\r\n inputRef.current.value = String(def)\r\n paint(inputRef.current, def)\r\n }\r\n if (valRef.current) valRef.current.textContent = fmt(def)\r\n }, [def, fmt, min, max])\r\n\r\n const apply = (v: number): void => {\r\n if (inputRef.current) {\r\n inputRef.current.value = String(v)\r\n paint(inputRef.current, v)\r\n }\r\n if (valRef.current) valRef.current.textContent = fmt(v)\r\n onInput?.(v)\r\n onChange(v)\r\n }\r\n\r\n return (\r\n <div className=\"dab-slider-block\">\r\n {label ? <span className=\"dab-slider-label\">{label}</span> : null}\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>\r\n <input\r\n ref={inputRef} type=\"range\" className=\"dab-slider\"\r\n style={{ '--pct': ((def - min) / (max - min)) * 100 } as CSSProperties}\r\n min={min} max={max} step={step} defaultValue={def}\r\n title={label ? `${label} · ${fmt(def)}` : fmt(def)}\r\n onDoubleClick={() => apply(def)}\r\n onInput={e => {\r\n const el = e.target as HTMLInputElement\r\n const v = Number(el.value)\r\n paint(el, v)\r\n onInput?.(v)\r\n if (valRef.current) valRef.current.textContent = fmt(v)\r\n }}\r\n onChange={e => onChange(Number((e.target as HTMLInputElement).value))} />\r\n <span ref={valRef} className=\"dab-slider-val\">{fmt(def)}</span>\r\n </div>\r\n </div>\r\n )\r\n}\r\n","import type { CSSProperties, ComponentType } from 'react'\r\nimport type { ThemeSectionProps, PartOpacities, PartBlurs } from '../../types'\r\nimport { cfg, rOps, rSop, rBlurs, rChatTextOpacity, rTrajectoryOpacity, rRightbarOpacity } from '../../state'\r\nimport { saveConfig } from '../../rpc'\r\nimport { applyCustomTokens, applySettingsOverrides, setPartBlur, applyViewCards, applyTrajectoryOverrides, applyRightbarOverrides } from '../../wallpaper'\r\nimport { LiveSlider } from '../LiveSlider'\r\nimport { CanvasIcon, SidebarIcon, ChatIcon, GearIcon, TextIcon, TrajectoryIcon, PreviewIcon, InputIcon } from '../icons'\r\n\r\ninterface PartDef {\r\n labelKey: string\r\n Icon: ComponentType<{ size?: number }>\r\n /** Homepage part key; absent for the settings-panel part. */\r\n opKey?: keyof PartOpacities\r\n isSettings?: boolean\r\n /** Conversation text region: tint opacity + blur over the message column. */\r\n isChat?: boolean\r\n /** Trajectory view: tint opacity + blur over the whole view surface. */\r\n isTrajectory?: boolean\r\n /** File-preview panel: the right sidebar a file click opens. */\r\n isRightbar?: boolean\r\n}\r\n\r\nconst PARTS: PartDef[] = [\r\n { opKey: 'bg', labelKey: 'uiOpacityBg', Icon: CanvasIcon },\r\n { opKey: 'sidebar', labelKey: 'uiOpacitySide', Icon: SidebarIcon },\r\n { isRightbar: true, labelKey: 'uiPreview', Icon: PreviewIcon },\r\n { opKey: 'card', labelKey: 'uiOpacityCard', Icon: ChatIcon },\r\n { opKey: 'input', labelKey: 'uiOpacityInput', Icon: InputIcon },\r\n { isSettings: true, labelKey: 'uiSop', Icon: GearIcon },\r\n { isChat: true, labelKey: 'uiChatRegion', Icon: TextIcon },\r\n { isTrajectory: true, labelKey: 'uiTrajectory', Icon: TrajectoryIcon },\r\n]\r\n\r\nexport function InterfacePage({ p }: { p: ThemeSectionProps }) {\r\n const { t, setOps, setBlurs, setSop, setRightbarOpacity } = p\r\n\r\n return (\r\n <>\r\n <header className=\"dab-head dab-rise\" style={{ '--d': 0 } as CSSProperties}>\r\n <div className=\"dab-overline\">Surfaces</div>\r\n <h2 className=\"dab-h1\">{t('uiTitle')}</h2>\r\n <p className=\"dab-desc\">{t('descInterface')}</p>\r\n </header>\r\n\r\n <div className=\"dab-grid-parts\">\r\n {PARTS.map((part, i) => {\r\n const { labelKey, Icon, isSettings, isChat, isTrajectory, isRightbar } = part\r\n const opKey = part.opKey\r\n // Homepage parts (bg/sidebar/card/input) bind to their own part only;\r\n // the settings panel (isSettings) binds exclusively to the 'settings'\r\n // part (--dsh-any-blur-settings / --dsh-any-bg-settings-surface) and\r\n // must never fall back to a homepage part key — otherwise the dialog\r\n // panel would track the homepage center/card blur and the home-page\r\n // opacities. The chat region (isChat) and the trajectory view\r\n // (isTrajectory) own their own blur keys plus their own tint\r\n // opacities, and the file-preview panel (isRightbar) owns the right\r\n // column's backdrop through the same deal. Every homepage opKey is\r\n // also a PartBlurs key (input included), so the shared blur slider\r\n // dereferences it directly.\r\n const blurKey: keyof PartBlurs = isChat\r\n ? 'chat'\r\n : isTrajectory\r\n ? 'trajectory'\r\n : isRightbar\r\n ? 'rightbar'\r\n : isSettings ? 'settings' : opKey!\r\n const opacity = isChat\r\n ? rChatTextOpacity()\r\n : isTrajectory\r\n ? rTrajectoryOpacity()\r\n : isRightbar ? rRightbarOpacity() : isSettings ? rSop() : rOps()[opKey!]\r\n return (\r\n <section key={blurKey} className=\"dab-card dab-card-hover dab-rise\" style={{ '--d': i + 1 } as CSSProperties}>\r\n <div className=\"dab-part-head\">\r\n <div className=\"dab-part-ico\"><Icon size={16} /></div>\r\n <div className=\"dab-part-name\">{t(labelKey)}</div>\r\n <span className=\"dab-part-badge\">{Math.round(opacity * 100)}%</span>\r\n </div>\r\n\r\n <LiveSlider label={t('uiOpacity')} min={0} max={100} step={1} def={Math.round(opacity * 100)}\r\n fmt={v => `${v}%`}\r\n onInput={v => {\r\n const op = v / 100\r\n if (isChat) {\r\n cfg.chatTextOpacity = op\r\n applyViewCards()\r\n } else if (isTrajectory) {\r\n cfg.trajectoryOpacity = op\r\n applyTrajectoryOverrides(op)\r\n } else if (isRightbar) {\r\n // First drag is what detaches the panel from the main\r\n // background; from then on the card owns it.\r\n cfg.rightbarOpacity = op\r\n applyRightbarOverrides(op)\r\n } else if (isSettings) {\r\n cfg.settingsOpacity = op\r\n applySettingsOverrides(op)\r\n } else {\r\n const ops = { ...rOps() }\r\n ops[opKey!] = op\r\n cfg.opacities = ops\r\n applyCustomTokens(ops)\r\n }\r\n saveConfig()\r\n }}\r\n onChange={v => {\r\n const op = v / 100\r\n if (isChat) {\r\n cfg.chatTextOpacity = op\r\n applyViewCards()\r\n saveConfig()\r\n } else if (isTrajectory) {\r\n cfg.trajectoryOpacity = op\r\n applyTrajectoryOverrides(op)\r\n saveConfig()\r\n } else if (isRightbar) {\r\n setRightbarOpacity(op)\r\n } else if (isSettings) {\r\n setSop(op)\r\n } else {\r\n const ops = { ...rOps() }\r\n ops[opKey!] = op\r\n setOps(ops)\r\n }\r\n }} />\r\n\r\n <LiveSlider label={t('uiBlur')} min={0} max={60} step={1} def={rBlurs()[blurKey]}\r\n fmt={v => `${v}px`}\r\n onInput={v => {\r\n const blurs = { ...rBlurs() }\r\n blurs[blurKey] = v\r\n cfg.blurs = blurs\r\n setPartBlur(blurKey, v)\r\n saveConfig()\r\n }}\r\n onChange={v => {\r\n const blurs = { ...rBlurs() }\r\n blurs[blurKey] = v\r\n setBlurs(blurs)\r\n }} />\r\n </section>\r\n )\r\n })}\r\n </div>\r\n </>\r\n )\r\n}\r\n","/**\r\n * Read a chosen image file as a data URL WITHOUT re-encoding: the original\r\n * pixels are kept as-is (no canvas downscale / JPEG re-compression), so the\r\n * wallpaper is stored and displayed at full fidelity. The tradeoff is a larger\r\n * payload over the RPC channel and on disk for big images.\r\n */\r\nexport function readImg(file: File, cb: (url: string | null) => void): void {\r\n const r = new FileReader()\r\n r.onerror = () => cb(null)\r\n r.onload = () => cb(r.result as string)\r\n r.readAsDataURL(file)\r\n}\r\n","import { useRef, useState, useEffect, useCallback, memo } from 'react'\r\n\r\nconst WHEEL_SIZE = 220\r\nconst CX = WHEEL_SIZE / 2\r\nconst RING_OUTER = 106\r\nconst RING_INNER = 82\r\n// Square inscribed in the ring's inner circle: half-side = RING_INNER / √2,\r\n// so the four corners sit exactly on the inner edge of the hue ring. The\r\n// exact (un-rounded) value keeps the corners tangent to the ring — a rounded\r\n// half-side would push the diagonals past the ring's inner boundary.\r\nconst SQ_HALF = RING_INNER / Math.SQRT2\r\n\r\n/** Static hue ring cached once across all wheels. */\r\nlet ringCache: HTMLCanvasElement | null = null\r\nfunction getRingCache(): HTMLCanvasElement {\r\n if (ringCache) return ringCache\r\n const cvs = document.createElement('canvas')\r\n cvs.width = WHEEL_SIZE; cvs.height = WHEEL_SIZE\r\n const c = cvs.getContext('2d')!\r\n // Instead of 360 separate arc paths, use a single conic gradient clipped to\r\n // the ring. This removes per-frame path overhead and anti-aliasing gaps.\r\n const g = c.createConicGradient(0, CX, CX)\r\n for (let i = 0; i <= 360; i++) g.addColorStop(i / 360, `hsl(${i},100%,50%)`)\r\n c.beginPath()\r\n c.arc(CX, CX, RING_OUTER, 0, Math.PI * 2)\r\n c.arc(CX, CX, RING_INNER, 0, Math.PI * 2, true)\r\n c.fillStyle = g\r\n c.fill()\r\n ringCache = cvs\r\n return ringCache\r\n}\r\n\r\nfunction drawMarkers(ctx: CanvasRenderingContext2D, hue: number, sat: number, lit: number): void {\r\n // Hue marker on ring. Canvas math angles (0 = +x / \"3 o'clock\", positive =\r\n // toward +y) directly match the conic-gradient hue distribution drawn in\r\n // getRingCache (colorStop i/360 → hsl(i)), so NO extra ±90° shift is applied.\r\n // A shift would rotate the picker's indication 90° away from the rendered\r\n // gradient (e.g. picking the top of the wheel would report red while the\r\n // pixels there are blue). hue 0 sits at the right edge, +90° at the bottom.\r\n const hRad = hue * Math.PI / 180\r\n const hR = (RING_OUTER + RING_INNER) / 2\r\n const hmx = CX + Math.cos(hRad) * hR\r\n const hmy = CX + Math.sin(hRad) * hR\r\n ctx.beginPath(); ctx.arc(hmx, hmy, 8, 0, Math.PI * 2)\r\n ctx.fillStyle = 'rgba(0,0,0,0.25)'; ctx.fill()\r\n ctx.beginPath(); ctx.arc(hmx, hmy, 6.5, 0, Math.PI * 2)\r\n ctx.strokeStyle = '#fff'; ctx.lineWidth = 2; ctx.stroke()\r\n\r\n // SL marker (HSV coordinates)\r\n const gx = CX - SQ_HALF, gy = CX - SQ_HALF, sz = SQ_HALF * 2\r\n const smx = gx + sat * sz\r\n const smy = gy + (1 - lit) * sz\r\n ctx.beginPath(); ctx.arc(smx, smy, 7, 0, Math.PI * 2)\r\n ctx.fillStyle = 'rgba(0,0,0,0.25)'; ctx.fill()\r\n ctx.beginPath(); ctx.arc(smx, smy, 5.5, 0, Math.PI * 2)\r\n ctx.strokeStyle = '#fff'; ctx.lineWidth = 2; ctx.stroke()\r\n ctx.beginPath(); ctx.arc(smx, smy, 3.5, 0, Math.PI * 2)\r\n ctx.strokeStyle = '#000'; ctx.lineWidth = 1; ctx.stroke()\r\n}\r\n\r\nfunction drawSquare(c: CanvasRenderingContext2D, hue: number): void {\r\n const gx = CX - SQ_HALF, gy = CX - SQ_HALF, sz = SQ_HALF * 2\r\n c.clearRect(gx - 1, gy - 1, sz + 2, sz + 2)\r\n c.fillStyle = '#fff'; c.fillRect(gx, gy, sz, sz)\r\n const gh = c.createLinearGradient(gx, 0, gx + sz, 0)\r\n gh.addColorStop(0, 'rgba(255,255,255,1)'); gh.addColorStop(1, `hsl(${hue},100%,50%)`)\r\n c.fillStyle = gh; c.fillRect(gx, gy, sz, sz)\r\n const gv = c.createLinearGradient(0, gy, 0, gy + sz)\r\n gv.addColorStop(0, 'rgba(0,0,0,0)'); gv.addColorStop(1, 'rgba(0,0,0,1)')\r\n c.fillStyle = gv; c.fillRect(gx, gy, sz, sz)\r\n}\r\n\r\nfunction hitTest(x: number, y: number): 'ring' | 'square' | null {\r\n if (Math.abs(x - CX) <= SQ_HALF && Math.abs(y - CX) <= SQ_HALF) return 'square'\r\n const dx = x - CX, dy = y - CX\r\n const dist = Math.sqrt(dx * dx + dy * dy)\r\n if (dist >= RING_INNER - 4 && dist <= RING_OUTER + 4) return 'ring'\r\n return null\r\n}\r\n\r\nfunction pickHue(x: number, y: number): number {\r\n // Inverse of drawMarkers: no ±90° shift, matching the conic gradient exactly.\r\n let angle = Math.atan2(y - CX, x - CX) * 180 / Math.PI\r\n if (angle < 0) angle += 360\r\n return angle\r\n}\r\n\r\nfunction pickSL(x: number, y: number): [number, number] {\r\n const gx = CX - SQ_HALF, gy = CX - SQ_HALF, sz = SQ_HALF * 2\r\n return [\r\n Math.max(0, Math.min(1, (x - gx) / sz)),\r\n Math.max(0.02, Math.min(0.98, 1 - (y - gy) / sz)),\r\n ]\r\n}\r\n\r\nexport const ColorWheel = memo(function ColorWheel({ hue, sat, lit, onChange }: {\r\n hue: number; sat: number; lit: number\r\n onChange: (h: number, s: number, l: number) => void\r\n}) {\r\n const cvsRef = useRef<HTMLCanvasElement>(null)\r\n const [col, setCol] = useState({ hue, sat, lit })\r\n const colRef = useRef(col)\r\n colRef.current = col\r\n\r\n // Adopt external changes (e.g. section remount after theme restore).\r\n useEffect(() => {\r\n setCol(c => (c.hue === hue && c.sat === sat && c.lit === lit ? c : { hue, sat, lit }))\r\n }, [hue, sat, lit])\r\n\r\n // Redraw only what changed. The static ring is copied from cache; the square\r\n // only redraws when hue changes; markers redraw on every value change.\r\n useEffect(() => {\r\n const cvs = cvsRef.current\r\n if (!cvs) return\r\n const ctx = cvs.getContext('2d')!\r\n ctx.clearRect(0, 0, WHEEL_SIZE, WHEEL_SIZE)\r\n // Draw the square first, then the ring on top: the ring's opaque pixels\r\n // cover the square's four corners (which are tangent to the ring's inner\r\n // edge), so the corners no longer visually overlap the hue ring.\r\n drawSquare(ctx, col.hue)\r\n ctx.drawImage(getRingCache(), 0, 0)\r\n drawMarkers(ctx, col.hue, col.sat, col.lit)\r\n }, [col])\r\n\r\n // Batch pointer updates in a single rAF so rapid mousemove events do not\r\n // trigger a React state flush + onChange on every pixel.\r\n const pendingRef = useRef<{ h: number; s: number; l: number } | null>(null)\r\n const rafRef = useRef<number | null>(null)\r\n const flushPending = useCallback(() => {\r\n rafRef.current = null\r\n const p = pendingRef.current\r\n if (!p) return\r\n pendingRef.current = null\r\n setCol({ hue: p.h, sat: p.s, lit: p.l })\r\n onChange(p.h, p.s, p.l)\r\n }, [onChange])\r\n\r\n const schedule = useCallback((h: number, s: number, l: number) => {\r\n pendingRef.current = { h, s, l }\r\n if (rafRef.current === null) rafRef.current = requestAnimationFrame(flushPending)\r\n }, [flushPending])\r\n\r\n const onDown = useCallback((e: React.MouseEvent<HTMLCanvasElement>) => {\r\n const r = cvsRef.current!.getBoundingClientRect()\r\n const x = e.clientX - r.left, y = e.clientY - r.top\r\n const region = hitTest(x, y)\r\n if (!region) return\r\n if (region === 'ring') {\r\n schedule(pickHue(x, y), colRef.current.sat, colRef.current.lit)\r\n } else {\r\n const [s, l] = pickSL(x, y)\r\n schedule(colRef.current.hue, s, l)\r\n }\r\n const onMove = (ev: MouseEvent) => {\r\n const rr = cvsRef.current!.getBoundingClientRect()\r\n const mx = ev.clientX - rr.left, my = ev.clientY - rr.top\r\n if (region === 'ring') {\r\n const d = Math.sqrt((mx - CX) ** 2 + (my - CX) ** 2)\r\n if (d >= RING_INNER - 10 && d <= RING_OUTER + 10) schedule(pickHue(mx, my), colRef.current.sat, colRef.current.lit)\r\n } else {\r\n const [s, l] = pickSL(mx, my)\r\n schedule(colRef.current.hue, s, l)\r\n }\r\n }\r\n const onUp = () => { document.removeEventListener('mousemove', onMove); document.removeEventListener('mouseup', onUp) }\r\n document.addEventListener('mousemove', onMove); document.addEventListener('mouseup', onUp)\r\n }, [schedule])\r\n\r\n return <canvas ref={cvsRef} width={WHEEL_SIZE} height={WHEEL_SIZE} className=\"dab-wheel\" onMouseDown={onDown} />\r\n})\r\n","import { useState, useEffect, useRef } from 'react'\r\nimport type { CSSProperties } from 'react'\r\nimport { hsvToHsl, hslToRgb, rgbToHsl, hslToHsv } from '../utils/color'\r\n\r\ntype Mode = 'hsl' | 'rgb'\r\n\r\nconst SEG_W = 66\r\n\r\nfunction clamp(v: number, min: number, max: number): number {\r\n return Math.min(max, Math.max(min, v))\r\n}\r\n\r\n/**\r\n * A single numeric field that edits one color channel. Keeps its own text\r\n * while focused so typing never gets clobbered by the parent re-rendering the\r\n * canonical value; commits every valid keystroke live and re-normalizes on\r\n * blur. The value prop only pushes back in when the field is not focused\r\n * (wheel drags, wallpaper extraction, mode switches).\r\n */\r\nfunction NumField({ label, value, min, max, step, onChange }: {\r\n label: string; value: number; min: number; max: number; step: number\r\n onChange: (v: number) => void\r\n}) {\r\n const [text, setText] = useState(String(value))\r\n const focused = useRef(false)\r\n\r\n useEffect(() => {\r\n if (!focused.current) setText(String(value))\r\n }, [value])\r\n\r\n return (\r\n <label className=\"dab-field\">\r\n <span className=\"dab-field-label\">{label}</span>\r\n <input\r\n type=\"number\"\r\n min={min} max={max} step={step}\r\n value={text}\r\n className=\"dab-num\"\r\n onFocus={() => { focused.current = true }}\r\n onBlur={() => { focused.current = false; setText(String(value)) }}\r\n onChange={e => {\r\n setText(e.target.value)\r\n const v = Number(e.target.value)\r\n if (Number.isFinite(v)) onChange(clamp(v, min, max))\r\n }}\r\n />\r\n </label>\r\n )\r\n}\r\n\r\n/**\r\n * Precise color entry next to the wheel: a HSL/RGB segmented toggle plus three\r\n * numeric channel fields and a live swatch. The wheel is HSV end-to-end, so\r\n * this panel converts at the boundary — HSL fields map straight onto the\r\n * stored HSL, RGB fields round-trip through rgbToHsl — and both emit HSV via\r\n * the same onChange the wheel uses, keeping one canonical color.\r\n */\r\nexport function ColorInputs({ hue, sat, lit, onChange }: {\r\n hue: number; sat: number; lit: number\r\n onChange: (h: number, s: number, l: number) => void\r\n}) {\r\n const [mode, setMode] = useState<Mode>('hsl')\r\n const [h, s, l] = hsvToHsl(hue, sat, lit)\r\n const [r, g, b] = hslToRgb(h, s, l)\r\n\r\n const setHsl = (nh: number, ns: number, nl: number) => onChange(...hslToHsv(nh, ns, nl))\r\n const setRgb = (nr: number, ng: number, nb: number) => {\r\n const [nh, ns, nl] = rgbToHsl(nr, ng, nb)\r\n onChange(...hslToHsv(nh, ns, nl))\r\n }\r\n\r\n return (\r\n <div className=\"dab-inputs\">\r\n <div className=\"dab-seg\" style={{ '--w': `${SEG_W}px` } as CSSProperties}>\r\n <div className=\"dab-seg-thumb\" style={{ transform: `translateX(${mode === 'hsl' ? 0 : SEG_W}px)` }} />\r\n <button type=\"button\" className={`dab-seg-item${mode === 'hsl' ? ' is-active' : ''}`} onClick={() => setMode('hsl')}>HSL</button>\r\n <button type=\"button\" className={`dab-seg-item${mode === 'rgb' ? ' is-active' : ''}`} onClick={() => setMode('rgb')}>RGB</button>\r\n </div>\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 7 }}>\r\n {mode === 'hsl' ? (\r\n <>\r\n <NumField label=\"H\" value={Math.round(h)} min={0} max={360} step={1} onChange={v => setHsl(v, s, l)} />\r\n <NumField label=\"S\" value={Math.round(s * 100)} min={0} max={100} step={1} onChange={v => setHsl(h, v / 100, l)} />\r\n <NumField label=\"L\" value={Math.round(l * 100)} min={0} max={100} step={1} onChange={v => setHsl(h, s, v / 100)} />\r\n </>\r\n ) : (\r\n <>\r\n <NumField label=\"R\" value={r} min={0} max={255} step={1} onChange={v => setRgb(v, g, b)} />\r\n <NumField label=\"G\" value={g} min={0} max={255} step={1} onChange={v => setRgb(r, v, b)} />\r\n <NumField label=\"B\" value={b} min={0} max={255} step={1} onChange={v => setRgb(r, g, v)} />\r\n </>\r\n )}\r\n </div>\r\n <div className=\"dab-swatch-lg\" style={{ background: `hsl(${Math.round(h)} ${Math.round(s * 100)}% ${Math.round(l * 100)}%)` }} />\r\n </div>\r\n )\r\n}\r\n","import { useRef, useState, useEffect, useCallback } from 'react'\r\nimport { rgbToHsl, hslToHsv } from '../utils/color'\r\nimport { Portal } from './Portal'\r\n\r\nconst MAG_SIZE = 96\r\nconst MAG_ZOOM = 8\r\n\r\nfunction toHex(rgb: [number, number, number]): string {\r\n return '#' + rgb.map(v => v.toString(16).padStart(2, '0')).join('')\r\n}\r\n\r\n/**\r\n * Eyedropper modal: shows the wallpaper full-bleed (no drag/zoom) and lets the\r\n * user click any pixel to adopt it as the theme color. A magnifier circle\r\n * follows the cursor so small details can be picked precisely. The wallpaper\r\n * is a data URL, so sampling is CORS-free: draw it once to an offscreen-sized\r\n * canvas and read pixels via getImageData.\r\n */\r\nexport function ColorPicker({ url, t, onPick, onClose }: {\r\n url: string\r\n t: (key: string) => string\r\n onPick: (hsv: [number, number, number]) => void\r\n onClose: () => void\r\n}) {\r\n const canvasRef = useRef<HTMLCanvasElement>(null)\r\n const magRef = useRef<HTMLCanvasElement>(null)\r\n const imgRef = useRef<HTMLImageElement | null>(null)\r\n const [ready, setReady] = useState(false)\r\n const [hover, setHover] = useState<{ rgb: [number, number, number] } | null>(null)\r\n const [mag, setMag] = useState<{ x: number; y: number } | null>(null)\r\n\r\n useEffect(() => {\r\n const img = new Image()\r\n img.onload = () => { imgRef.current = img; setReady(true) }\r\n img.src = url\r\n }, [url])\r\n\r\n useEffect(() => {\r\n if (!ready || !canvasRef.current || !imgRef.current) return\r\n const canvas = canvasRef.current\r\n canvas.width = imgRef.current.naturalWidth\r\n canvas.height = imgRef.current.naturalHeight\r\n const ctx = canvas.getContext('2d')\r\n if (ctx) ctx.drawImage(imgRef.current, 0, 0)\r\n }, [ready])\r\n\r\n const sampleAt = useCallback((clientX: number, clientY: number) => {\r\n const canvas = canvasRef.current\r\n if (!canvas) return null\r\n const rect = canvas.getBoundingClientRect()\r\n if (rect.width === 0 || rect.height === 0) return null\r\n const ctx = canvas.getContext('2d')\r\n if (!ctx) return null\r\n const sx = Math.round((clientX - rect.left) * (canvas.width / rect.width))\r\n const sy = Math.round((clientY - rect.top) * (canvas.height / rect.height))\r\n if (sx < 0 || sy < 0 || sx >= canvas.width || sy >= canvas.height) return null\r\n const d = ctx.getImageData(sx, sy, 1, 1).data\r\n return { sx, sy, rgb: [d[0], d[1], d[2]] as [number, number, number] }\r\n }, [])\r\n\r\n const drawMagnifier = useCallback((sx: number, sy: number) => {\r\n const mag = magRef.current\r\n const src = canvasRef.current\r\n if (!mag || !src) return\r\n const ctx = mag.getContext('2d')\r\n if (!ctx) return\r\n const half = MAG_SIZE / MAG_ZOOM / 2\r\n ctx.clearRect(0, 0, MAG_SIZE, MAG_SIZE)\r\n ctx.drawImage(src, sx - half, sy - half, half * 2, half * 2, 0, 0, MAG_SIZE, MAG_SIZE)\r\n ctx.strokeStyle = 'rgba(255,255,255,0.85)'\r\n ctx.lineWidth = 1\r\n ctx.beginPath()\r\n ctx.moveTo(MAG_SIZE / 2, 0); ctx.lineTo(MAG_SIZE / 2, MAG_SIZE)\r\n ctx.moveTo(0, MAG_SIZE / 2); ctx.lineTo(MAG_SIZE, MAG_SIZE / 2)\r\n ctx.stroke()\r\n }, [])\r\n\r\n const onMove = (e: React.MouseEvent) => {\r\n const s = sampleAt(e.clientX, e.clientY)\r\n if (!s) { setHover(null); setMag(null); return }\r\n setHover({ rgb: s.rgb })\r\n drawMagnifier(s.sx, s.sy)\r\n const off = 28\r\n let x = e.clientX + off\r\n let y = e.clientY + off\r\n if (x + MAG_SIZE > window.innerWidth) x = e.clientX - off - MAG_SIZE\r\n if (y + MAG_SIZE > window.innerHeight) y = e.clientY - off - MAG_SIZE\r\n setMag({ x, y })\r\n }\r\n\r\n const onClick = (e: React.MouseEvent) => {\r\n const s = sampleAt(e.clientX, e.clientY)\r\n if (!s) return\r\n const [h, sl, l] = rgbToHsl(s.rgb[0], s.rgb[1], s.rgb[2])\r\n onPick(hslToHsv(h, sl, l))\r\n }\r\n\r\n return (\r\n <Portal>\r\n <div className=\"dab-overlay\">\r\n <div className=\"dab-overlay-title\">{t('pickerTitle')}</div>\r\n <div className=\"dab-overlay-hint\">{t('pickerHint')}</div>\r\n <div className=\"dab-modal-card\" style={{\r\n maxWidth: 'min(90vw, 720px)', maxHeight: '60vh', overflow: 'hidden',\r\n borderRadius: 12, border: '2px solid rgba(255,255,255,0.3)', background: '#000', cursor: 'crosshair',\r\n }}>\r\n <canvas ref={canvasRef} style={{ display: 'block', maxWidth: '100%', maxHeight: '60vh', objectFit: 'contain' }}\r\n onMouseMove={onMove}\r\n onMouseLeave={() => { setHover(null); setMag(null) }}\r\n onClick={onClick} />\r\n </div>\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, minWidth: 260 }}>\r\n <div style={{ width: 28, height: 28, borderRadius: 8, border: '1px solid rgba(255,255,255,0.4)', background: hover ? toHex(hover.rgb) : 'transparent' }} />\r\n <div style={{ color: '#fff', fontSize: 13, fontFamily: 'var(--dab-mono, monospace)' }}>{hover ? `${toHex(hover.rgb)} · rgb(${hover.rgb.join(', ')})` : '—'}</div>\r\n </div>\r\n <div style={{ display: 'flex', gap: 10 }}>\r\n <button type=\"button\" className=\"dab-btn\" onClick={onClose}>{t('pickerClose')}</button>\r\n </div>\r\n <canvas ref={magRef} width={MAG_SIZE} height={MAG_SIZE}\r\n style={{\r\n position: 'fixed', width: MAG_SIZE, height: MAG_SIZE, borderRadius: '50%',\r\n border: '2px solid rgba(255,255,255,0.7)', boxShadow: '0 4px 16px rgba(0,0,0,0.5)',\r\n zIndex: 10000, background: '#000', pointerEvents: 'none', transition: 'opacity 0.08s',\r\n left: mag?.x ?? 0, top: mag?.y ?? 0, opacity: mag ? 1 : 0,\r\n }} />\r\n </div>\r\n </Portal>\r\n )\r\n}\r\n","import { useRef, useState, useEffect, useCallback } from 'react'\nimport type { BgState } from '../types'\nimport { Portal } from './Portal'\n\n/**\n * Framing editor for one rule's image.\n *\n * The placement state is passed IN rather than read from a global slot: every\n * rule owns its own framing, and editing rule B must never touch rule A.\n */\nexport function BgEditor({ url, state, t, onClose, onCommit }: {\n url: string\n /** The rule's own framing. */\n state: BgState\n t: (key: string) => string; onClose: () => void\n onCommit: (zoom: number, x: number, y: number, iw: number, ih: number) => void\n}) {\n const pw = Math.min(window.innerWidth * 0.75, 860)\n const ph = Math.round(pw * window.innerHeight / window.innerWidth)\n const saved = state\n const [zoom, setZoom] = useState(saved.iw > 0 ? saved.zoom : 1)\n const [pos, setPos] = useState(saved.iw > 0 ? { x: saved.x * pw, y: saved.y * ph } : { x: 0, y: 0 })\n const [imgSize, setImgSize] = useState({ w: 0, h: 0 })\n const containerRef = useRef<HTMLDivElement>(null)\n const imgRef = useRef<HTMLImageElement>(null)\n const dragRef = useRef({ active: false, sx: 0, sy: 0, spx: 0, spy: 0 })\n\n useEffect(() => {\n const img = new Image()\n img.onload = () => {\n const scale = Math.min(pw / img.width, ph / img.height)\n const w = img.width * scale, h = img.height * scale\n setImgSize({ w, h })\n const s = state\n if (s.iw > 0 && s.iw === img.width && s.ih === img.height) {\n setZoom(s.zoom)\n // Saved x, y are CENTER fractions of the preview: the image center\n // lands at (x·pw, y·ph), so the top-left comes from subtracting half\n // the displayed (zoom-scaled) image size.\n setPos({ x: s.x * pw - w * s.zoom / 2, y: s.y * ph - h * s.zoom / 2 })\n } else {\n setZoom(1)\n setPos({ x: (pw - w) / 2, y: (ph - h) / 2 })\n }\n }\n img.src = url\n }, [url, state, pw, ph])\n\n const onDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault()\n dragRef.current = { active: true, sx: e.clientX, sy: e.clientY, spx: pos.x, spy: pos.y }\n const onMove = (ev: MouseEvent) => {\n if (!dragRef.current.active) return\n setPos({ x: dragRef.current.spx + ev.clientX - dragRef.current.sx, y: dragRef.current.spy + ev.clientY - dragRef.current.sy })\n }\n const onUp = () => { dragRef.current.active = false; document.removeEventListener('mousemove', onMove); document.removeEventListener('mouseup', onUp) }\n document.addEventListener('mousemove', onMove); document.addEventListener('mouseup', onUp)\n }, [pos])\n\n const onWheelCb = useCallback((e: WheelEvent) => {\n e.preventDefault()\n const el = containerRef.current\n if (!el) return\n const rect = el.getBoundingClientRect()\n // Anchor the zoom at the preview center so the mouse position never\n // steers where the image grows/shrinks — the current view stays centered.\n const mx = rect.width / 2, my = rect.height / 2\n // 3% per wheel step (0.97 zoom-out / 1.03 zoom-in).\n const factor = e.deltaY > 0 ? 0.97 : 1.03\n const nz = Math.max(0.1, Math.min(10, zoom * factor))\n const nx = mx - (mx - pos.x) * (nz / zoom)\n const ny = my - (my - pos.y) * (nz / zoom)\n setZoom(nz); setPos({ x: nx, y: ny })\n }, [zoom, pos])\n\n useEffect(() => {\n const el = containerRef.current\n if (!el) return\n el.addEventListener('wheel', onWheelCb, { passive: false })\n return () => el.removeEventListener('wheel', onWheelCb)\n }, [onWheelCb])\n\n const resetView = useCallback(() => {\n if (imgSize.w === 0) return\n setZoom(1); setPos({ x: (pw - imgSize.w) / 2, y: (ph - imgSize.h) / 2 })\n }, [pw, ph, imgSize])\n\n return (\n <Portal>\n <div className=\"dab-overlay\" onClick={e => { if (e.target === e.currentTarget) onClose() }}>\n <div className=\"dab-overlay-title\">{t('editorTitle')}</div>\n <div ref={containerRef} className=\"dab-modal-card\" style={{\n position: 'relative', overflow: 'hidden', border: '2px solid rgba(255,255,255,0.3)',\n borderRadius: 12, background: '#000', cursor: 'grab', width: pw, height: ph,\n }} onMouseDown={onDown}>\n <img ref={imgRef} src={url} alt=\"\" draggable={false} style={{\n position: 'absolute', transformOrigin: '0 0', pointerEvents: 'none',\n width: imgSize.w, height: imgSize.h,\n transform: `translate(${pos.x}px,${pos.y}px) scale(${zoom})`,\n }} />\n </div>\n <div className=\"dab-overlay-hint\">{t('editorHint')}</div>\n <div style={{ display: 'flex', gap: 10 }}>\n <button type=\"button\" className=\"dab-btn\" onClick={resetView}>{t('editorReset')}</button>\n <button type=\"button\" className=\"dab-btn\" onClick={onClose}>{t('editorCancel')}</button>\n <button type=\"button\" className=\"dab-btn\" onClick={() => onCommit(zoom, (pos.x + imgSize.w * zoom / 2) / pw, (pos.y + imgSize.h * zoom / 2) / ph, imgRef.current?.naturalWidth ?? 0, imgRef.current?.naturalHeight ?? 0)}>{t('editorCommit')}</button>\n </div>\n </div>\n </Portal>\n )\n}\n","import { useEffect, useRef, useState } from 'react'\nimport type { CSSProperties } from 'react'\nimport type { BgMode, BgRule, ThemeSectionProps, ThemeStoreState } from '../../types'\nimport { cfg, PALETTE } from '../../state'\nimport { matchRule } from '../../modelbg'\nimport { readImg } from '../../utils/image'\nimport { hslToHsv, hsvToHsl, hslToRgb } from '../../utils/color'\nimport { ColorWheel } from '../ColorWheel'\nimport { ColorInputs } from '../ColorInputs'\nimport { ColorPicker } from '../ColorPicker'\nimport { BgEditor } from '../BgEditor'\nimport { LiveSlider } from '../LiveSlider'\nimport { DropletIcon, EditIcon, LinkIcon, PipetteIcon, SparkleIcon, TrashIcon, UploadIcon } from '../icons'\n\nconst BG_MODES: Array<{ mode: BgMode; key: string }> = [\n { mode: 'fit', key: 'bgModeFit' },\n { mode: 'fill', key: 'bgModeFill' },\n { mode: 'stretch', key: 'bgModeStretch' },\n { mode: 'tile', key: 'bgModeTile' },\n { mode: 'center', key: 'bgModeCenter' },\n]\n\n/** Seed color a rule starts from when the user picks one for the first time. */\nconst SEED_COLOR: [number, number, number] = [220, 0.55, 0.25]\n\n/**\n * Failing-hop codes the model watcher can report, mapped to their copy. Only\n * these are rendered: `waiting` and `fallback` already have their own hints.\n */\nconst MODEL_NOTE_KEYS: Record<string, string | undefined> = {\n 'no-service': 'statusNoteNoService',\n 'no-session': 'statusNoteNoSession',\n 'no-projection': 'statusNoteNoProjection',\n 'empty-selection': 'statusNoteEmptySelection',\n}\n\nfunction toHex(rgb: [number, number, number]): string {\n return '#' + rgb.map(v => Math.round(v).toString(16).padStart(2, '0')).join('')\n}\n\nexport function ModelBgPage({ p, notify }: { p: ThemeSectionProps; notify: (msg: string, ok?: boolean) => void }) {\n const { t, useStore } = p\n const store = useStore((s: ThemeStoreState) => s)\n const rules = cfg.rules\n\n // Match tester: the field follows the detected model until the user types\n // their own text, so the card is useful the moment it is looked at and never\n // fights the watcher once it is not. It replaced the old \"active now\" readout —\n // the same question (\"what does this model resolve to?\") one step earlier, and\n // it does not go stale between switches.\n const [text, setText] = useState('')\n const [touched, setTouched] = useState(false)\n useEffect(() => { if (!touched) setText(store.model) }, [store.model, touched])\n const probe = text.trim()\n const result = ((): string | null => {\n if (probe === '') return null\n const hit = matchRule(rules, probe)\n const rule = hit.rule\n if (rule === null) return null\n const n = rules.findIndex(r => r.id === rule.id) + 1\n return `${hit.matched ? t('tryoutHit') : t('tryoutFallback')} ${n}`\n })()\n\n return (\n <>\n <header className=\"dab-head dab-rise\" style={{ '--d': 0 } as CSSProperties}>\n <div className=\"dab-overline\">Rules</div>\n <h2 className=\"dab-h1\">{t('pageModelBg')}</h2>\n <p className=\"dab-desc\">{t('descModelBg')}</p>\n </header>\n\n <section className=\"dab-card dab-rise\" style={{ '--d': 1 } as CSSProperties}>\n <div className=\"dab-swatch-title\">{t('tryoutTitle')}</div>\n <div style={{ marginTop: 10, display: 'flex', flexWrap: 'wrap', gap: 8, alignItems: 'center' }}>\n <input\n type=\"text\" className=\"dab-urlinput\" value={text}\n placeholder={t('tryoutPlaceholder')}\n onChange={e => { setTouched(true); setText(e.target.value) }} />\n {store.model !== '' ? (\n <button type=\"button\" className=\"dab-btn\" onClick={() => { setTouched(true); setText(store.model) }}>\n {t('tryoutUseCurrent')}\n </button>\n ) : null}\n </div>\n <p className=\"dab-hint\" style={{ marginTop: 9 }}>\n {probe === '' ? t('tryoutEmpty') : result === null ? t('tryoutNone') : result}\n </p>\n {/* Why the pre-filled value is what it is: without these, a host default\n passed off as this session's model, or a sessions service that simply\n is not up yet, is indistinguishable from a correct read. */}\n {store.model === '' ? <p className=\"dab-hint\" style={{ marginTop: 6 }}>{t('statusUnknownHint')}</p> : null}\n {store.model !== '' && store.modelSource === 'default'\n ? <p className=\"dab-hint\" style={{ marginTop: 6 }}>{t('statusSourceDefaultHint')}</p>\n : null}\n {MODEL_NOTE_KEYS[store.modelNote] !== undefined\n ? <p className=\"dab-hint\" style={{ marginTop: 6 }}>{t(MODEL_NOTE_KEYS[store.modelNote]!)}</p>\n : null}\n </section>\n\n <section className=\"dab-rise\" style={{ '--d': 2 } as CSSProperties}>\n <div className=\"dab-swatch-title\">{t('rulesTitle')}</div>\n <p className=\"dab-hint\" style={{ marginBottom: 11 }}>{t('rulesHint')}</p>\n\n {/* Picking an image should just theme the rule; this is the off switch\n for people who want the color to be their own choice every time. */}\n <div className=\"dab-chip-row\" style={{ marginBottom: 12, alignItems: 'center' }}>\n <button type=\"button\" className={`dab-toggle${cfg.autoExtract ? ' is-on' : ''}`}\n role=\"switch\" aria-checked={cfg.autoExtract} title={t('autoExtract')}\n onClick={() => p.setAutoExtract(!cfg.autoExtract)}>\n <span className=\"dab-toggle-knob\" />\n </button>\n <span className=\"dab-hint\">{t('autoExtract')}</span>\n </div>\n <p className=\"dab-hint\" style={{ marginBottom: 11 }}>{t('autoExtractHint')}</p>\n\n <div className=\"dab-rules\">\n {rules.map((rule, i) => (\n <RuleCard\n key={rule.id} p={p} rule={rule} index={i} total={rules.length}\n active={rule.id === store.activeRuleId} notify={notify} />\n ))}\n </div>\n\n <button type=\"button\" className=\"dab-btn dab-btn-primary\" style={{ marginTop: 12 }} onClick={() => { p.addRule() }}>\n + {t('ruleAdd')}\n </button>\n </section>\n </>\n )\n}\n\nfunction RuleCard({ p, rule, index, total, active, notify }: {\n p: ThemeSectionProps\n rule: BgRule\n index: number\n total: number\n active: boolean\n notify: (msg: string, ok?: boolean) => void\n}) {\n const { t } = p\n // The active rule opens by default so the panel shows the live one first.\n const [open, setOpen] = useState(active)\n const [dragOver, setDragOver] = useState(false)\n const [urlOpen, setUrlOpen] = useState(false)\n const [urlVal, setUrlVal] = useState('')\n const [urlBusy, setUrlBusy] = useState(false)\n const [urlErr, setUrlErr] = useState<string | null>(null)\n const [editorOpen, setEditorOpen] = useState(false)\n const [pickerOpen, setPickerOpen] = useState(false)\n const [extracting, setExtracting] = useState(false)\n const fileRef = useRef<HTMLInputElement>(null)\n\n const url = p.imageOf(rule.slot)\n const [h, s, l] = rule.color ?? SEED_COLOR\n const wheel = hslToHsv(h, s, l)\n\n const onColor = (nh: number, ns: number, nl: number): void => {\n const [sh, ss, sl] = hsvToHsl(nh, ns, nl)\n p.setRule(rule.id, { color: [sh, ss, sl] })\n }\n\n const onFile = (f: File): void => {\n readImg(f, d => { if (d !== null) p.setRuleImage(rule.id, d) })\n }\n\n const onDrop = (e: React.DragEvent): void => {\n e.preventDefault()\n setDragOver(false)\n const f = e.dataTransfer.files?.[0]\n if (f && f.type.startsWith('image/')) onFile(f)\n }\n\n const applyUrl = async (): Promise<void> => {\n const u = urlVal.trim()\n if (!/^https?:\\/\\//i.test(u)) { setUrlErr(t('ruleUrlBadHttp')); return }\n setUrlBusy(true)\n setUrlErr(null)\n const res = await p.setRuleImageFromUrl(rule.id, u)\n setUrlBusy(false)\n if (res.ok) {\n setUrlOpen(false)\n setUrlVal('')\n } else {\n setUrlErr(res.error === 'invalid url' || res.error === 'unsupported scheme'\n ? t('ruleUrlBadHttp')\n : (res.error ?? t('ruleUrlFail')))\n }\n }\n\n const onExtract = async (): Promise<void> => {\n if (url === null || extracting) return\n setExtracting(true)\n try {\n const ok = await p.extractColor(rule.id)\n notify(ok ? t('extractDone') : t('extractFail'), ok)\n } catch {\n notify(t('extractFail'), false)\n } finally {\n setExtracting(false)\n }\n }\n\n const cls = `dab-rule${active ? ' is-active' : ''}${rule.enabled ? '' : ' is-off'}`\n\n return (\n <section className={cls}>\n <div className=\"dab-rule-head\">\n <button type=\"button\" className=\"dab-icon-btn\" onClick={() => setOpen(o => !o)}\n title={open ? 'Collapse' : 'Expand'} aria-expanded={open}>\n {open ? '▾' : '▸'}\n </button>\n <span className=\"dab-rule-num\">{index + 1}</span>\n {index === 0 ? <span className=\"dab-rule-badge\">{t('ruleFallbackBadge')}</span> : null}\n <input\n className=\"dab-rule-match\" value={rule.match}\n placeholder={t('ruleMatchPlaceholder')}\n onChange={e => p.setRule(rule.id, { match: e.target.value })} />\n <button type=\"button\" className={`dab-toggle${rule.enabled ? ' is-on' : ''}`}\n role=\"switch\" aria-checked={rule.enabled} title={t('ruleEnabled')}\n onClick={() => p.setRule(rule.id, { enabled: !rule.enabled })}>\n <span className=\"dab-toggle-knob\" />\n </button>\n <button type=\"button\" className=\"dab-icon-btn\" disabled={index === 0}\n title={t('ruleUp')} onClick={() => p.moveRule(rule.id, -1)}>↑</button>\n <button type=\"button\" className=\"dab-icon-btn\" disabled={index === total - 1}\n title={t('ruleDown')} onClick={() => p.moveRule(rule.id, 1)}>↓</button>\n <button type=\"button\" className=\"dab-icon-btn dab-icon-btn-danger\"\n title={t('ruleRemove')} onClick={() => p.removeRule(rule.id)}>\n <TrashIcon size={13} />\n </button>\n </div>\n\n {open ? (\n <div className=\"dab-rule-body\">\n <div className=\"dab-rule-cols\">\n {/* ── image + layout ─────────────────────────────────────────── */}\n <div>\n <div\n className={`dab-rule-thumb${dragOver ? ' is-over' : ''}`}\n onClick={() => fileRef.current?.click()}\n onDragOver={e => { e.preventDefault(); setDragOver(true) }}\n onDragLeave={() => setDragOver(false)}\n onDrop={onDrop}>\n {url !== null\n ? <img src={url} alt=\"\" draggable={false} />\n : (\n <div className=\"dab-rule-thumb-empty\">\n <UploadIcon size={18} />\n <span>{t('ruleNoImage')}</span>\n </div>\n )}\n </div>\n\n <div className=\"dab-chip-row\" style={{ marginTop: 10 }}>\n <button type=\"button\" className=\"dab-btn\" onClick={() => fileRef.current?.click()}>\n <UploadIcon size={13} />{url === null ? t('rulePickImage') : t('ruleChangeImage')}\n </button>\n <button type=\"button\" className=\"dab-btn dab-btn-ghost\" onClick={() => setUrlOpen(o => !o)}>\n <LinkIcon size={13} />{t('ruleFromUrl')}\n </button>\n {url !== null && rule.bgMode === 'fit' ? (\n <button type=\"button\" className=\"dab-btn\" onClick={() => setEditorOpen(true)}>\n <EditIcon size={13} />{t('ruleFramingEdit')}\n </button>\n ) : null}\n {url !== null ? (\n <button type=\"button\" className=\"dab-btn dab-btn-ghost dab-btn-danger\"\n onClick={() => p.setRuleImage(rule.id, null)}>\n <TrashIcon size={13} />{t('ruleImageRemove')}\n </button>\n ) : null}\n </div>\n\n {urlOpen ? (\n <div style={{ marginTop: 10, display: 'flex', flexWrap: 'wrap', gap: 8, alignItems: 'center' }}>\n <input\n type=\"text\" className=\"dab-urlinput\" value={urlVal}\n placeholder={t('ruleUrlPlaceholder')} autoFocus\n onChange={e => setUrlVal(e.target.value)}\n onKeyDown={e => { if (e.key === 'Enter') { e.preventDefault(); void applyUrl() } }} />\n <button type=\"button\" className=\"dab-btn dab-btn-primary\" disabled={urlBusy} onClick={() => void applyUrl()}>\n {urlBusy ? t('ruleUrlApplying') : t('ruleUrlApply')}\n </button>\n <button type=\"button\" className=\"dab-btn\"\n onClick={() => { setUrlOpen(false); setUrlVal(''); setUrlErr(null) }}>\n {t('ruleUrlCancel')}\n </button>\n </div>\n ) : null}\n {urlErr !== null ? (\n <p style={{ marginTop: 8, color: 'var(--dsw-alias-state-error-primary)', fontSize: 12 }}>{urlErr}</p>\n ) : null}\n {url === null ? <p className=\"dab-hint\" style={{ marginTop: 8 }}>{t('ruleEmptyHint')}</p> : null}\n\n <div style={{ marginTop: 14 }}>\n <div className=\"dab-rule-section-title\">{t('ruleLayout')}</div>\n <div className=\"dab-chip-row\">\n {BG_MODES.map(m => (\n <button key={m.mode} type=\"button\"\n className={`dab-chip${rule.bgMode === m.mode ? ' is-active' : ''}`}\n onClick={() => p.setRule(rule.id, { bgMode: m.mode })}>\n {t(m.key)}\n </button>\n ))}\n </div>\n </div>\n </div>\n\n {/* ── color + wallpaper effects ──────────────────────────────── */}\n <div>\n <div className=\"dab-rule-section-title\">{t('ruleColor')}</div>\n {rule.color === null ? (\n <>\n <div className=\"dab-chip-row\">\n <button type=\"button\" className=\"dab-btn\" onClick={() => p.setRule(rule.id, { color: SEED_COLOR })}>\n <DropletIcon size={14} />{t('ruleColorNone')}\n </button>\n <button type=\"button\" className=\"dab-btn\" disabled={url === null || extracting} onClick={() => void onExtract()}>\n <SparkleIcon size={14} />{extracting ? t('extracting') : t('ruleColorExtract')}\n </button>\n </div>\n <p className=\"dab-hint\" style={{ marginTop: 8 }}>{t('ruleColorNoneHint')}</p>\n </>\n ) : (\n <>\n <div style={{ display: 'flex', gap: 16, alignItems: 'center', flexWrap: 'wrap' }}>\n <ColorWheel hue={wheel[0]} sat={wheel[1]} lit={wheel[2]} onChange={onColor} />\n <div className=\"dab-inputs\">\n <div className=\"dab-hex-caption\">{toHex(hslToRgb(h, s, l)).toUpperCase()}</div>\n <ColorInputs hue={wheel[0]} sat={wheel[1]} lit={wheel[2]} onChange={onColor} />\n </div>\n </div>\n <div className=\"dab-chip-row\" style={{ marginTop: 12 }}>\n <button type=\"button\" className=\"dab-btn\" disabled={url === null || extracting} onClick={() => void onExtract()}>\n <SparkleIcon size={13} />{extracting ? t('extracting') : t('ruleColorExtract')}\n </button>\n <button type=\"button\" className=\"dab-btn\" disabled={url === null} onClick={() => setPickerOpen(true)}>\n <PipetteIcon size={13} />{t('eyedropper')}\n </button>\n <button type=\"button\" className=\"dab-btn dab-btn-ghost\" onClick={() => p.setRule(rule.id, { color: null })}>\n {t('ruleColorNone')}\n </button>\n </div>\n <div className=\"dab-swatches\" style={{ marginTop: 12 }}>\n {PALETTE.map(([sh, ss, sl], i) => (\n <button\n key={i} type=\"button\" className=\"dab-swatch\"\n style={{ background: `hsl(${sh} ${Math.round(ss * 100)}% ${Math.round(sl * 100)}%)` }}\n title={toHex(hslToRgb(sh, ss, sl)).toUpperCase()}\n onClick={() => p.setRule(rule.id, { color: [sh, ss, sl] })} />\n ))}\n </div>\n </>\n )}\n\n <div style={{ marginTop: 16 }}>\n <LiveSlider\n label={t('ruleOpacity')} min={0} max={100} step={1}\n def={Math.round(rule.wallpaperOpacity * 100)} fmt={v => `${v}%`}\n onChange={v => p.setRule(rule.id, { wallpaperOpacity: v / 100 })} />\n <LiveSlider\n label={t('ruleBlur')} min={0} max={60} step={1}\n def={rule.blur} fmt={v => `${v}px`}\n onChange={v => p.setRule(rule.id, { blur: v })} />\n <p className=\"dab-hint\" style={{ marginTop: 10 }}>{t('ruleBlurHint')}</p>\n </div>\n </div>\n </div>\n </div>\n ) : null}\n\n <input ref={fileRef} type=\"file\" accept=\"image/*\" style={{ display: 'none' }} onChange={e => {\n const f = e.target.files?.[0]\n if (!f) return\n onFile(f)\n e.target.value = ''\n }} />\n\n {editorOpen && url !== null ? (\n <BgEditor\n url={url} state={rule.bgState} t={t} onClose={() => setEditorOpen(false)}\n onCommit={(z, x, y, iw, ih) => {\n p.setRule(rule.id, { bgState: { zoom: z, x, y, iw, ih } })\n setEditorOpen(false)\n }} />\n ) : null}\n\n {pickerOpen && url !== null ? (\n <ColorPicker url={url} t={t} onClose={() => setPickerOpen(false)}\n onPick={hsv => { onColor(hsv[0], hsv[1], hsv[2]); setPickerOpen(false) }} />\n ) : null}\n </section>\n )\n}\n","import { useRef } from 'react'\r\nimport type { CSSProperties } from 'react'\r\nimport type { ThemeSectionProps } from '../../types'\r\nimport { DownloadIcon, UploadIcon } from '../icons'\r\n\r\nexport function ProfilePage({ p, notify }: { p: ThemeSectionProps; notify: (msg: string, ok?: boolean) => void }) {\r\n const { t, exportTheme, importTheme } = p\r\n const importRef = useRef<HTMLInputElement>(null)\r\n\r\n const onImport = async (file: File) => {\r\n try {\r\n const ok = await importTheme(file)\r\n notify(ok ? t('importDone') : t('importFail'), ok)\r\n } catch {\r\n notify(t('importFail'), false)\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n <header className=\"dab-head dab-rise\" style={{ '--d': 0 } as CSSProperties}>\r\n <div className=\"dab-overline\">Profile</div>\r\n <h2 className=\"dab-h1\">{t('pageProfile')}</h2>\r\n <p className=\"dab-desc\">{t('descProfile')}</p>\r\n </header>\r\n\r\n <div className=\"dab-profile-grid\">\r\n <section className=\"dab-card dab-card-hover dab-rise\" style={{ '--d': 1 } as CSSProperties}>\r\n <div className=\"dab-profile-ico\"><DownloadIcon size={17} /></div>\r\n <div className=\"dab-profile-title\">{t('exportCardTitle')}</div>\r\n <div className=\"dab-profile-desc\">{t('exportCardDesc')}</div>\r\n <button type=\"button\" className=\"dab-btn dab-btn-primary\" onClick={() => { exportTheme(); notify(t('toastExportDone')) }}>\r\n <DownloadIcon size={14} />{t('exportTheme')}\r\n </button>\r\n </section>\r\n\r\n <section className=\"dab-card dab-card-hover dab-rise\" style={{ '--d': 2 } as CSSProperties}>\r\n <div className=\"dab-profile-ico\"><UploadIcon size={17} /></div>\r\n <div className=\"dab-profile-title\">{t('importCardTitle')}</div>\r\n <div className=\"dab-profile-desc\">{t('importCardDesc')}</div>\r\n <button type=\"button\" className=\"dab-btn\" onClick={() => importRef.current?.click()}>\r\n <UploadIcon size={14} />{t('importTheme')}\r\n </button>\r\n <input ref={importRef} type=\"file\" accept=\"application/json,.json\" style={{ display: 'none' }} onChange={e => {\r\n const f = e.target.files?.[0]; if (!f) return\r\n void onImport(f); e.target.value = ''\r\n }} />\r\n </section>\r\n </div>\r\n\r\n <footer className=\"dab-footer dab-rise\" style={{ '--d': 3 } as CSSProperties}>\r\n <span className=\"dab-footer-mono\">dsh-background-by-model</span>\r\n <span>{t('footerTag')}</span>\r\n </footer>\r\n </>\r\n )\r\n}\r\n","/**\n * The \"Host check\" page.\n *\n * Two answers side by side, because a plugin that styles someone else's interface\n * fails in two different ways:\n *\n * this build, live the probe in ../../judge.ts runs against the DOM, the\n * host stylesheets and the Cordis services — what the\n * plugin can actually see right now.\n * the installed files the node half's scan (src/host-scan.ts) reports whether\n * the packages on disk still contain every literal the\n * plugin depends on, and names the host's own version.\n *\n * The page exists so a failure stops being \"背景不动了\": it names the hop, the\n * literal, the file that should define it and the file of this plugin that reads\n * it — and copies all of that as one markdown block for an issue.\n */\nimport { useCallback, useEffect, useState } from 'react'\nimport type { CSSProperties, ReactElement } from 'react'\nimport type { ThemeSectionProps } from '../../types'\nimport type { ContractResult, HostReport } from '../../../host-contracts'\nimport { CONTRACT_GROUPS, HOST_CONTRACTS, verdictOf, reportToMarkdown } from '../../../host-contracts'\nimport { buildClientReport } from '../../judge'\nimport { readHostScan } from '../../rpc'\nimport { PLUGIN_VERSION, DSH_FLOOR } from '../../build-info'\nimport { CheckIcon, AlertIcon, RefreshIcon, CopyIcon, LayersIcon } from '../icons'\n\n/** Contract id → its group, so the panel's order is the table's order. */\nconst GROUP_OF = new Map(HOST_CONTRACTS.map(c => [c.id, c.group]))\n\nexport function HostPage({ p, notify }: { p: ThemeSectionProps; notify: (msg: string, ok?: boolean) => void }) {\n const { t, lang, readModelFacts } = p\n const [client, setClient] = useState<HostReport | null>(null)\n const [scanned, setScanned] = useState<HostReport | null>(null)\n const [busy, setBusy] = useState(false)\n\n const run = useCallback(async () => {\n setBusy(true)\n try {\n // The live probe first: it is synchronous and always answers. The version\n // and the on-disk verdict are node-side facts, so they arrive afterwards.\n setClient(buildClientReport({\n ctx: p.ctx,\n lang,\n pluginVersion: PLUGIN_VERSION,\n floor: DSH_FLOOR,\n model: readModelFacts?.(),\n }, { version: '', compatible: null, note: '' }))\n setScanned(await readHostScan(lang))\n } finally {\n setBusy(false)\n }\n }, [p, lang, readModelFacts])\n\n useEffect(() => { void run() }, [run])\n\n const hostVersion = scanned?.host.version ?? ''\n const compatible = scanned?.host.compatible ?? null\n const verdict = client === null ? 'unknown' : verdictOf(client)\n const diskVerdict = scanned === null ? 'unknown' : verdictOf(scanned)\n const rows = client?.results ?? []\n\n const copyReport = async () => {\n const parts: string[] = []\n if (client !== null) parts.push(reportToMarkdown(client, lang))\n if (scanned !== null) parts.push(reportToMarkdown(scanned, lang))\n try {\n await navigator.clipboard.writeText(parts.join('\\n\\n'))\n notify(t('hostCopied'))\n } catch {\n // Clipboard denied (an insecure origin, or a policy): say so instead of\n // pretending the report was copied.\n notify(t('hostCopyFail'), false)\n }\n }\n\n const statusWord = (s: ContractResult['status']): string => (\n s === 'pass' ? t('hostPass') : s === 'fail' ? t('hostFail') : s === 'skip' ? t('hostNa') : t('hostInfo')\n )\n\n const row = (r: ContractResult): ReactElement => (\n <li key={r.id} className={`dab-check dab-check-${r.status}`}>\n <span className={`dab-check-ico dab-check-ico-${r.status}`} aria-hidden=\"true\">\n {r.status === 'pass' ? <CheckIcon size={12} />\n : r.status === 'fail' ? <AlertIcon size={12} />\n : <span className=\"dab-check-dot\" />}\n </span>\n <div className=\"dab-check-body\">\n <div className=\"dab-check-head\">\n <span className=\"dab-check-label\">{r.label}</span>\n <span className={`dab-check-status dab-check-status-${r.status}`}>{statusWord(r.status)}</span>\n <code className=\"dab-check-target\">{r.target}</code>\n </div>\n {r.status === 'fail' ? (\n <div className=\"dab-check-reason\">\n <div>{r.reason ?? r.detail}</div>\n <div className=\"dab-check-symptom\">{r.symptom}</div>\n <div className=\"dab-check-where\">\n <span>{t('hostExpectedIn')}</span>\n <code>{r.sources.map(s => s.path).join(' · ')}</code>\n </div>\n <div className=\"dab-check-where\">\n <span>{t('hostUsedBy')}</span>\n <code>{r.usedBy}</code>\n </div>\n </div>\n ) : (\n <div className=\"dab-check-detail\" title={r.checks.join('\\n')}>{r.detail}</div>\n )}\n </div>\n </li>\n )\n\n let rise = 1\n\n return (\n <>\n <header className=\"dab-head dab-rise\" style={{ '--d': 0 } as CSSProperties}>\n <div className=\"dab-overline\">Host check</div>\n <h2 className=\"dab-h1\">{t('pageHostCheck')}</h2>\n <p className=\"dab-desc\">{t('descHostCheck')}</p>\n </header>\n\n <section className={`dab-card dab-verdict dab-verdict-${verdict} dab-rise`} style={{ '--d': rise++ } as CSSProperties}>\n <div className=\"dab-verdict-head\">\n <span className={`dab-verdict-ico dab-verdict-ico-${verdict}`} aria-hidden=\"true\">\n {verdict === 'ok' ? <CheckIcon size={16} />\n : verdict === 'unknown' ? <LayersIcon size={16} />\n : <AlertIcon size={16} />}\n </span>\n <div className=\"dab-verdict-text\">\n <div className=\"dab-verdict-title\">\n {verdict === 'ok' ? t('hostAllOk')\n : verdict === 'unknown' ? t('hostUnknown')\n : verdict === 'broken' ? t('hostBroken')\n : t('hostPartial')}\n </div>\n <div className=\"dab-verdict-sub\">\n {t('hostSummary')\n .replace('{pass}', String(client?.summary.pass ?? 0))\n .replace('{fail}', String(client?.summary.fail ?? 0))\n .replace('{skip}', String(client?.summary.skip ?? 0))}\n </div>\n </div>\n <div className=\"dab-verdict-actions\">\n <button type=\"button\" className=\"dab-btn\" disabled={busy} onClick={() => void run()}>\n <RefreshIcon size={13} />{busy ? t('hostRunning') : t('hostRerun')}\n </button>\n <button type=\"button\" className=\"dab-btn dab-btn-primary\" onClick={() => void copyReport()}>\n <CopyIcon size={13} />{t('hostCopy')}\n </button>\n </div>\n </div>\n\n <div className=\"dab-facts\">\n <Fact label=\"dsh\" value={hostVersion !== '' ? hostVersion : t('hostUnreadable')} bad={compatible === false} />\n <Fact label={t('hostPluginFloor')} value={`>=${DSH_FLOOR}`} />\n <Fact label={t('hostPlugin')} value={PLUGIN_VERSION} />\n {scanned !== null && scanned.host.node !== '' ? <Fact label=\"node\" value={scanned.host.node} /> : null}\n <Fact\n label={t('hostDiskScan')}\n value={diskVerdict === 'ok' ? `${scanned?.summary.pass ?? 0}/${scanned?.summary.total ?? 0}`\n : diskVerdict === 'unknown' ? t('hostNa')\n : `${scanned?.summary.fail ?? 0} ${t('hostFail')}`}\n bad={diskVerdict === 'broken' || diskVerdict === 'partial'}\n />\n {client?.host.model !== undefined ? (\n <Fact label={t('hostModel')} value={client.host.model.text !== '' ? client.host.model.text : t('hostModelNone')} />\n ) : null}\n </div>\n\n {compatible === false ? <p className=\"dab-check-note\">{t('hostBelowFloor')}</p> : null}\n {scanned !== null && scanned.host.note !== '' ? <p className=\"dab-check-note\">{scanned.host.note}</p> : null}\n {diskFailures(scanned) > 0 ? (\n <p className=\"dab-check-note\">\n {t('hostDiskFailures').replace('{n}', String(diskFailures(scanned)))}\n </p>\n ) : null}\n </section>\n\n {client === null ? (\n <section className=\"dab-card dab-rise\" style={{ '--d': rise } as CSSProperties}>\n <div className=\"dab-check-detail\">{t('hostRunning')}</div>\n </section>\n ) : null}\n\n {CONTRACT_GROUPS.map(group => {\n const groupRows = rows.filter(r => GROUP_OF.get(r.id) === group.id)\n if (groupRows.length === 0) return null\n const ok = groupRows.filter(r => r.status === 'pass').length\n return (\n <section key={group.id} className=\"dab-card dab-rise\" style={{ '--d': rise++ } as CSSProperties}>\n <div className=\"dab-check-group-title\">\n {lang === 'zh' ? group.label.zh : group.label.en}\n <span className=\"dab-check-group-count\">{ok}/{groupRows.length}</span>\n </div>\n <ul className=\"dab-checks\">{groupRows.map(row)}</ul>\n </section>\n )\n })}\n\n <p className=\"dab-hint dab-rise\" style={{ '--d': rise++ } as CSSProperties}>{t('hostHint')}</p>\n\n <footer className=\"dab-footer dab-rise\" style={{ '--d': rise } as CSSProperties}>\n <span className=\"dab-footer-mono\">dsh-background-by-model</span>\n <span>{t('footerTag')}</span>\n </footer>\n </>\n )\n}\n\n/** How many contracts the on-disk scan could not find (0 when it did not answer). */\nfunction diskFailures(report: HostReport | null): number {\n return report === null ? 0 : report.summary.fail\n}\n\nfunction Fact({ label, value, bad = false }: { label: string; value: string; bad?: boolean }) {\n return (\n <div className={`dab-fact${bad ? ' is-bad' : ''}`}>\n <span className=\"dab-fact-k\">{label}</span>\n <code className=\"dab-fact-v\" title={value}>{value}</code>\n </div>\n )\n}\n","/**\n * dsh-background-by-model — settings section shell.\n *\n * The host renders this section only while the settings dialog is open and the\n * section is the active nav entry, so mounting IS being visible. The section is\n * rendered INLINE inside the host settings dialog's content column (the host\n * provides the modal chrome); the shell is a left nav rail + page body. Only\n * the transient toast escapes through a Portal (the shell's container-type\n * containment would otherwise capture its fixed positioning).\n */\nimport { useEffect, useRef, useState } from 'react'\nimport type { ThemeSectionProps } from '../types'\nimport { ensureUiCss, NAV_ITEM_H, NAV_GAP } from './ui.css'\nimport { SunIcon, LayersIcon, PhotoIcon, SlidersIcon, AlertIcon, CheckIcon, GearIcon } from './icons'\nimport { ErrorBoundary } from './ErrorBoundary'\nimport { Portal } from './Portal'\nimport { InterfacePage } from './pages/InterfacePage'\nimport { ModelBgPage } from './pages/ModelBgPage'\nimport { ProfilePage } from './pages/ProfilePage'\nimport { HostPage } from './pages/HostPage'\n\nexport function ThemeSection(props: ThemeSectionProps) {\n ensureUiCss()\n const { t } = props\n const [page, setPage] = useState(0)\n const [toast, setToast] = useState<{ msg: string; ok: boolean } | null>(null)\n const toastTimer = useRef<number | undefined>(undefined)\n\n useEffect(() => () => window.clearTimeout(toastTimer.current), [])\n\n const notify = (msg: string, ok = true): void => {\n setToast({ msg, ok })\n window.clearTimeout(toastTimer.current)\n toastTimer.current = window.setTimeout(() => setToast(null), 2600)\n }\n\n const pages = [\n { label: t('pageInterface'), Icon: LayersIcon, node: <InterfacePage p={props} /> },\n { label: t('pageModelBg'), Icon: PhotoIcon, node: <ModelBgPage p={props} notify={notify} /> },\n { label: t('pageProfile'), Icon: SlidersIcon, node: <ProfilePage p={props} notify={notify} /> },\n { label: t('pageHostCheck'), Icon: GearIcon, node: <HostPage p={props} notify={notify} /> },\n ]\n\n return (\n <ErrorBoundary t={t}>\n <div className=\"dab-root\">\n <div className=\"dab-shell\">\n <nav className=\"dab-nav\">\n <div className=\"dab-brand\">\n <div className=\"dab-brand-tile\"><SunIcon size={15} /></div>\n <div>\n <div className=\"dab-brand-name\">{t('nav')}</div>\n <div className=\"dab-brand-tag\">{t('brandTag')}</div>\n </div>\n </div>\n <div className=\"dab-nav-list\">\n <div className=\"dab-nav-ind\" style={{ transform: `translateY(${page * (NAV_ITEM_H + NAV_GAP)}px)` }} />\n {pages.map((pg, i) => (\n <button\n key={pg.label} type=\"button\"\n className={`dab-nav-item${i === page ? ' is-active' : ''}`}\n onClick={() => setPage(i)}>\n <pg.Icon size={16} />\n <span>{pg.label}</span>\n </button>\n ))}\n </div>\n </nav>\n\n <div className=\"dab-page\" key={page}>\n {pages[page].node}\n </div>\n </div>\n </div>\n\n {toast ? (\n <Portal>\n <div className=\"dab-toast\" role=\"status\">\n <span className={toast.ok ? 'dab-toast-ok' : 'dab-toast-err'}>\n {toast.ok ? <CheckIcon size={14} /> : <AlertIcon size={14} />}\n </span>\n <span>{toast.msg}</span>\n </div>\n </Portal>\n ) : null}\n </ErrorBoundary>\n )\n}\n","/**\n * dsh-background-by-model — browser half entry.\n *\n * Wires the plugin lifecycle: rule resolution against the current model,\n * wallpaper layer, theme skin, viewport watch, i18n, settings-section injection,\n * boot restore and watchdogs. The heavy lifting lives in the sibling modules\n * (state / modelbg / rpc / wallpaper / components).\n */\nimport { defineStore } from './runtime'\nimport type {\n Ctx, RpcResultLike, ThemeSectionProps, PartOpacities, PartBlurs, BgRule, FetchResult, ModelFacts,\n} from './types'\nimport { NS, zh, en } from './i18n'\nimport {\n cfg, adoptConfig, imageOf, displayImageOf, setImage, newRule, nextSlot, nextRuleId, ruleById,\n normalizeRule, setActive, setModelLabel, activeRuleId, activeMatched, modelLabel, rWp, rRightbarOpacity,\n} from './state'\nimport {\n RPC_CHANNEL, initRpc, saveConfig, flushSave, persistConfig, loadPersisted,\n readImage, writeImage, deleteImage, fetchImageUrl, readDefaultModel,\n} from './rpc'\nimport {\n applyWp, teardownWp, applySettingsOverrides, applyRightbarOverrides, SETTINGS_STYLE_RULE, TRAJECTORY_STYLE_RULE,\n RIGHTBAR_STYLE_RULE, INPUT_BLUR_RULE, PLACEHOLDER_RULE, watchParts, watchThemeResets,\n} from './wallpaper'\nimport { genTokens, extractWallpaperColor } from './utils/color'\nimport { matchRule, watchModel } from './modelbg'\nimport { buildClientReport } from './judge'\nimport { PLUGIN_VERSION, DSH_FLOOR } from './build-info'\nimport { ThemeSection } from './components/ThemeSection'\nimport { SUN_PATHS } from './components/icons'\n\nexport const name = 'dsh-background-by-model'\nexport const inject = ['slots', 'locale', 'theme', 'connection']\n\nconst CUSTOM_ID = 'custom-color'\n\nexport function apply(ctx: Ctx): void {\n // Bind the dedicated `/dsh-background-by-model` RPC caller so the persistence\n // module can reach the node half's file-backed store.\n initRpc((endpoint, payload) =>\n ctx.connection.rpc.call(RPC_CHANNEL, endpoint, payload).then((res: any) => res as RpcResultLike | undefined)\n )\n\n // ── 1. Custom theme skin, driven by the ACTIVE rule's color ────────────────\n let customDispose: (() => void) | null = null\n // Trailing debounce for the theme-skin switch (see applyActive): a color drag\n // would otherwise dispose + re-register + re-activate the host theme on every\n // pointer move.\n let skinTimer: number | null = null\n const registerCustom = (h: number, s: number, l: number): void => {\n customDispose?.()\n try {\n const { colorScheme, tokens } = genTokens(h, s, l)\n customDispose = ctx.theme.register({ id: CUSTOM_ID, colorScheme, tokens })\n } catch {\n // A live registration from an earlier HMR apply pass cannot be torn down\n // here; keep it and activate it below. Without this the duplicate-id\n // throw would abort apply and skip the wallpaper/opacity restore.\n customDispose = null\n }\n // Only activate the custom theme if it is actually registered.\n if (ctx.theme.getTheme().themes.some(t => t.id === CUSTOM_ID)) {\n ctx.theme.setTheme(CUSTOM_ID)\n }\n }\n /** A rule without a saved color means \"follow the system theme\". */\n const dropCustom = (): void => {\n customDispose?.()\n customDispose = null\n try {\n if (ctx.theme.getTheme().preference === CUSTOM_ID) ctx.theme.setTheme('system')\n } catch {\n // A host build without a `system` preference keeps its own choice.\n }\n }\n ctx.effect(() => () => {\n if (skinTimer !== null) window.clearTimeout(skinTimer)\n customDispose?.()\n }, 'dsh-background-by-model: skin dispose')\n\n // ── 2. Gradient CSS (for custom dark themes) + static rules ────────────────\n const styleEl = document.createElement('style')\n styleEl.dataset.plugin = 'dsh-background-by-model'\n // The gradient only applies while applyCustomTokens marks the body with the\n // plugin's own dark-mode value, avoiding matches against the host's attribute.\n styleEl.textContent = `body[data-ds-dark-theme=\"dsh-background-by-model\"]::before{content:'';position:fixed;inset:0;z-index:-1;pointer-events:none;background:radial-gradient(ellipse 80% 60% at 50% 0%,rgba(255,255,255,0.03) 0%,transparent 60%)}${SETTINGS_STYLE_RULE}${TRAJECTORY_STYLE_RULE}${RIGHTBAR_STYLE_RULE}${INPUT_BLUR_RULE}` + PLACEHOLDER_RULE\n document.head.appendChild(styleEl)\n ctx.effect(() => () => { styleEl?.parentNode?.removeChild(styleEl) }, 'dsh-background-by-model: gradient')\n\n // ── 3. State store ────────────────────────────────────────────────────────\n let rev = 0\n let rulesRev = 0\n let modelText = ''\n let modelSource: 'session' | 'default' = 'default'\n // Why no per-session model is available yet ('waiting' until the sessions\n // service mounts, then the failing hop, then 'fallback'). Shown by the status\n // readout so a dead hop is never mistaken for a real model.\n let modelNote = 'waiting'\n // Text + source last acted on, so the watch's forced re-emits (and the 1.5 s\n // safety poll) cannot re-run the whole apply while nothing changed.\n let modelKey = '\\u0000'\n const store = defineStore({\n init: () => ({\n url: null as string | null,\n rev: -1,\n rulesRev: -1,\n model: '',\n modelSource: 'session' as 'session' | 'default',\n modelNote: 'waiting',\n activeRuleId: null as string | null,\n matched: false,\n }),\n actions: {\n sync: (d: any, url: string | null, r: number, rr: number, model: string, source: 'session' | 'default', note: string, id: string | null, matched: boolean) => {\n if (r > d.rev) { d.url = url; d.rev = r }\n if (rr > d.rulesRev) d.rulesRev = rr\n d.model = model\n d.modelSource = source\n d.modelNote = note\n d.activeRuleId = id\n d.matched = matched\n },\n },\n })\n let bound: { sync: (...a: any[]) => void } | null = null\n const sync = (): void => {\n rev++\n bound?.sync(rWp(), rev, rulesRev, modelLabel !== '' ? modelLabel : modelText, modelSource, modelNote, activeRuleId, activeMatched)\n }\n\n /** Resolve the active rule for the current model and repaint everything. */\n const applyActive = (): void => {\n const { rule, matched } = matchRule(cfg.rules, modelText)\n setActive(rule === null ? null : rule.id, matched)\n const color = rule === null ? null : rule.color\n // The skin is a host-visible switch (dispose + register + activate) and is\n // batched; the wallpaper and tokens below land immediately either way.\n if (skinTimer !== null) window.clearTimeout(skinTimer)\n skinTimer = window.setTimeout(() => {\n skinTimer = null\n if (color === null) dropCustom()\n else registerCustom(color[0], color[1], color[2])\n }, 60)\n applyWp()\n sync()\n }\n\n // ── 4. First paint + the AppFrame watch ───────────────────────────────────\n applyWp()\n sync()\n watchParts()\n\n // ── 5. Model watch ────────────────────────────────────────────────────────\n // The session's own durable model selection is the authority; the host default\n // is only a last resort, and the settings page labels it as such.\n const offModel = watchModel(ctx, (text, label, source, note) => {\n const key = `${text}\\u0001${source}\\u0001${note}`\n if (key === modelKey) return\n const textChanged = text !== modelText\n modelKey = key\n modelText = text\n modelSource = source\n modelNote = note\n setModelLabel(label !== '' ? label : text)\n // A note-only change (e.g. still waiting for the sessions service) must\n // refresh the readout without repainting the whole interface.\n if (textChanged) applyActive()\n else sync()\n })\n ctx.effect(() => () => offModel(), 'dsh-background-by-model: model watch')\n // A trimmed client (or one whose session is not materialized yet) leaves the\n // per-session sources empty; the host's default model is a coarse but honest\n // stand-in, tagged so the UI never claims it is this session's selection.\n void (async () => {\n if (modelText !== '') return\n const fallback = await readDefaultModel()\n if (fallback !== null && modelText === '') {\n modelKey = `${fallback}\\u0001default\\u0001fallback`\n modelText = fallback\n modelSource = 'default'\n modelNote = 'fallback'\n setModelLabel(fallback)\n applyActive()\n }\n })()\n\n // ── 6. Boot restore ───────────────────────────────────────────────────────\n void (async () => {\n const persisted = await loadPersisted()\n if (persisted !== null) {\n adoptConfig(persisted.config)\n const slots = Array.from(new Set([...persisted.slots, ...cfg.rules.map(r => r.slot)]))\n // The active rule's bytes paint first; the remaining slots stream in after\n // so a large multi-rule setup never delays the first frame.\n const priority = matchRule(cfg.rules, modelText).rule\n const first = priority === null ? null : priority.slot\n const order = first === null ? slots : [first, ...slots.filter(s => s !== first)]\n for (const slot of order) {\n if (imageOf(slot) !== null) continue\n const url = await readImage(slot)\n if (url !== null) setImage(slot, url)\n if (slot === first) applyActive()\n }\n }\n applyActive()\n })()\n\n ctx.effect(() => () => { teardownWp() }, 'dsh-background-by-model: wp cleanup')\n\n ctx.effect(() => ctx.on('theme/change', () => {\n // The custom theme's preference lives in memory, so a host adoption can\n // silently reset it; re-assert it while the active rule has a color. Guard\n // on registry presence — registerCustom disposes the old skin first, so\n // during that transient the registry lacks CUSTOM_ID.\n if (activeRuleColor() !== null) {\n const snapshot = ctx.theme.getTheme()\n if (snapshot.preference !== CUSTOM_ID && snapshot.themes.some(t => t.id === CUSTOM_ID)) {\n ctx.theme.setTheme(CUSTOM_ID)\n }\n }\n applyWp()\n }), 'dsh-background-by-model: theme change')\n\n // Wallpaper placement is computed in absolute viewport pixels, so watch the\n // viewport itself: a fixed inset:0 sentinel's box always equals the viewport,\n // so a ResizeObserver on it catches any viewport change (window resize,\n // monitor moves, panel splitters, zoom); a resolution media query catches\n // DPI-only moves. Re-applies are coalesced to one per animation frame.\n let frame = 0\n const applySoon = (): void => {\n if (frame !== 0) return\n frame = requestAnimationFrame(() => { frame = 0; applyWp() })\n }\n const sentinel = document.createElement('div')\n sentinel.style.cssText = 'position:fixed;inset:0;pointer-events:none;visibility:hidden'\n document.body.append(sentinel)\n const viewportObserver = new ResizeObserver(applySoon)\n viewportObserver.observe(sentinel)\n const dprQuery = window.matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`)\n dprQuery.addEventListener('change', applySoon)\n ctx.effect(() => () => {\n viewportObserver.disconnect()\n dprQuery.removeEventListener('change', applySoon)\n sentinel.remove()\n }, 'dsh-background-by-model: viewport watch')\n\n // ── 7. Locale ─────────────────────────────────────────────────────────────\n ctx.effect(() => ctx.locale.register(NS, { zh, en }) as any, 'dsh-background-by-model: i18n')\n\n /**\n * The automatic half of \"extract from image\": fill a rule's theme color from\n * the picture it just received, but only while the rule has no color at all —\n * a color the user picked (or a previous extraction produced) is never\n * overwritten, so this cannot fight a deliberate choice.\n *\n * The decode is asynchronous, so the \"still empty?\" question is asked AGAIN on\n * arrival: a color chosen while it ran must win over the one being computed.\n */\n const maybeAutoExtract = async (id: string): Promise<void> => {\n if (!cfg.autoExtract) return\n const rule = ruleById(id)\n if (rule === null || rule.color !== null) return\n const url = displayImageOf(rule.slot)\n if (url === null) return\n let hsl: [number, number, number] | null = null\n try { hsl = await extractWallpaperColor(url, rule.bgState) } catch { hsl = null }\n if (hsl === null) return\n const current = ruleById(id)\n if (current === null || current.color !== null) return\n current.color = hsl\n rulesRev++\n saveConfig()\n if (id === activeRuleId) applyActive()\n else sync()\n }\n\n // ── 8. Section injection ──────────────────────────────────────────────────\n // The section's props are built ONCE by the slot host, so anything that changes\n // at runtime rides the store; the two exceptions are the context (needed by the\n // host self-check probe) and the language (read at build time, refreshed when\n // the section is rebuilt).\n const activeLang = (): 'zh' | 'en' => {\n try {\n const snapshot = ctx.locale.getSnapshot()\n return typeof snapshot?.active === 'string' && snapshot.active.toLowerCase().startsWith('zh') ? 'zh' : 'en'\n } catch {\n return 'en'\n }\n }\n /** The model-resolution facts the host self-check reports, read on demand. */\n const readModelFacts = (): ModelFacts => {\n const rule = activeRuleId === null ? null : ruleById(activeRuleId)\n return {\n text: modelText,\n source: modelSource,\n note: modelNote,\n rule: rule === null ? '' : (rule.match !== '' ? rule.match : rule.id),\n matched: activeMatched,\n }\n }\n const sectionInject = (actions: { sync: (...a: any[]) => void }): Omit<ThemeSectionProps, 'useStore'> => {\n bound = actions\n sync()\n return {\n t: ctx.locale.bind(NS),\n ctx,\n lang: activeLang(),\n readModelFacts,\n imageOf: (slot: string) => displayImageOf(slot),\n addRule: (): string => {\n const rule = newRule(nextRuleId(), nextSlot())\n cfg.rules.push(rule)\n rulesRev++\n persistConfig()\n applyActive()\n return rule.id\n },\n removeRule: (id: string): void => {\n const idx = cfg.rules.findIndex(r => r.id === id)\n if (idx < 0) return\n const [rule] = cfg.rules.splice(idx, 1)\n if (rule !== undefined && !cfg.rules.some(r => r.slot === rule.slot)) {\n setImage(rule.slot, null)\n void deleteImage(rule.slot)\n }\n rulesRev++\n persistConfig()\n applyActive()\n },\n moveRule: (id: string, dir: -1 | 1): void => {\n const idx = cfg.rules.findIndex(r => r.id === id)\n const to = idx + dir\n if (idx < 0 || to < 0 || to >= cfg.rules.length) return\n const [rule] = cfg.rules.splice(idx, 1)\n cfg.rules.splice(to, 0, rule!)\n rulesRev++\n persistConfig()\n applyActive()\n },\n setRule: (id: string, patch: Partial<BgRule>): void => {\n const rule = ruleById(id)\n if (rule === null) return\n Object.assign(rule, patch)\n const normalized = normalizeRule(rule)\n if (normalized !== null) Object.assign(rule, normalized)\n rulesRev++\n // Text/color/slider edits arrive per keystroke and per pointer move, so\n // the write is coalesced; structural edits below stay immediate.\n saveConfig()\n if (id === activeRuleId) applyActive()\n else sync()\n },\n setRuleImage: (id: string, dataUrl: string | null): void => {\n const rule = ruleById(id)\n if (rule === null) return\n setImage(rule.slot, dataUrl)\n void (dataUrl === null ? deleteImage(rule.slot) : writeImage(rule.slot, dataUrl))\n if (id === activeRuleId) applyActive()\n else sync()\n // A rule that has never been themed should simply come out themed; an\n // explicit color (or a cleared one the user set on purpose) is left be.\n if (dataUrl !== null) void maybeAutoExtract(id)\n },\n setRuleImageFromUrl: async (id: string, url: string): Promise<FetchResult> => {\n const rule = ruleById(id)\n if (rule === null) return { ok: false, error: 'unknown rule' }\n const res = await fetchImageUrl(rule.slot, url)\n if (res.ok) {\n setImage(rule.slot, res.dataUrl ?? null)\n if (id === activeRuleId) applyActive()\n else sync()\n void maybeAutoExtract(id)\n }\n return res\n },\n extractColor: async (id: string): Promise<boolean> => {\n const rule = ruleById(id)\n if (rule === null) return false\n const url = displayImageOf(rule.slot)\n if (url === null) return false\n const hsl = await extractWallpaperColor(url, rule.bgState)\n if (hsl === null) return false\n rule.color = hsl\n rulesRev++\n saveConfig()\n if (id === activeRuleId) applyActive()\n else sync()\n return true\n },\n setOps: (ops: PartOpacities): void => { cfg.opacities = ops; applyWp(); sync(); saveConfig() },\n setBlurs: (blurs: PartBlurs): void => { cfg.blurs = blurs; applyWp(); sync(); saveConfig() },\n setSop: (v: number): void => { cfg.settingsOpacity = v; applySettingsOverrides(v); saveConfig() },\n // The file-preview panel owns its surface from the first drag on; a null\n // hands it back to the main-background slider.\n setRightbarOpacity: (v: number | null): void => {\n cfg.rightbarOpacity = v\n applyRightbarOverrides(rRightbarOpacity())\n saveConfig()\n },\n setAutoExtract: (v: boolean): void => { cfg.autoExtract = v; saveConfig(); sync() },\n // Download every rule plus its image as one JSON file.\n exportTheme: (): void => {\n const images: Record<string, string> = {}\n for (const rule of cfg.rules) {\n const url = imageOf(rule.slot)\n if (url !== null) images[rule.slot] = url\n }\n const payload = {\n version: 3,\n exportedAt: new Date().toISOString(),\n config: cfg,\n images,\n }\n const blob = new Blob([JSON.stringify(payload, null, 2)], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = 'dsh-background-by-model-theme.json'\n a.click()\n URL.revokeObjectURL(url)\n },\n // Import: replaces the whole rule set and every rule image.\n importTheme: async (file: File): Promise<boolean> => {\n try {\n const data: unknown = JSON.parse(await file.text())\n if (!data || typeof data !== 'object') return false\n const d = data as { version?: number; config?: unknown; images?: unknown }\n if (typeof d.config !== 'object' || d.config === null) return false\n adoptConfig(d.config)\n const incoming = (d.images ?? {}) as Record<string, unknown>\n const keep = new Set<string>()\n for (const rule of cfg.rules) {\n keep.add(rule.slot)\n const raw = incoming[rule.slot]\n if (typeof raw === 'string' && /^data:image\\//.test(raw)) {\n setImage(rule.slot, raw)\n void writeImage(rule.slot, raw)\n } else {\n setImage(rule.slot, null)\n void deleteImage(rule.slot)\n }\n }\n // Slots the imported config no longer references are released.\n for (const slot of Object.keys(incoming)) {\n if (!keep.has(slot) && /^[A-Za-z0-9_-]{1,32}$/.test(slot)) void deleteImage(slot)\n }\n persistConfig()\n applyActive()\n return true\n } catch {\n return false\n }\n },\n }\n }\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section', id: 'dsh-background-by-model', order: 35,\n label: () => ctx.locale.bind(NS)('nav'),\n locale: NS, store, inject: sectionInject,\n }, ThemeSection as any))\n\n // ── 9. Settings-nav icon ──────────────────────────────────────────────────\n // The harness derives the nav glyph from the section id (unknown ids fall back\n // to the settings gear) with no plugin hook, so patch the mounted nav cell in\n // place — find the cell whose label matches this section's nav text and swap\n // its svg for the sun glyph.\n const navLabel = (): string => ctx.locale.bind(NS)('nav')\n const applyNavIcon = (): void => {\n const panel = document.querySelector<HTMLElement>('[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby]')\n const nav = panel?.querySelector('nav')\n if (!nav) return\n const target = navLabel()\n for (const cell of Array.from(nav.querySelectorAll('button'))) {\n const label = cell.querySelector('span')\n if (label && label.textContent?.trim() === target) {\n const svg = cell.querySelector('svg')\n if (svg && svg.dataset.dshAnyIcon !== '1') {\n const sun = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n sun.setAttribute('width', '16')\n sun.setAttribute('height', '16')\n sun.setAttribute('viewBox', '0 0 16 16')\n sun.setAttribute('fill', 'none')\n sun.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\n sun.dataset.dshAnyIcon = '1'\n sun.innerHTML = SUN_PATHS\n svg.replaceWith(sun)\n }\n return\n }\n }\n }\n let navIconObserver: MutationObserver | null = null\n const watchNavIcon = (): void => {\n if (navIconObserver !== null || typeof MutationObserver === 'undefined') return\n navIconObserver = new MutationObserver(records => {\n // React only when the settings panel (or its nav) is (re)created, so\n // chat-content mutations don't trigger a scan.\n const relevant = records.some(r => {\n for (const n of r.addedNodes) {\n if (n.nodeType !== 1) continue\n const el = n as Element\n if (el.matches?.('[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby]') || el.querySelector?.('[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby]')) return true\n }\n return false\n })\n if (relevant) applyNavIcon()\n })\n navIconObserver.observe(document.body, { childList: true, subtree: true })\n applyNavIcon()\n }\n watchNavIcon()\n ctx.effect(() => () => { navIconObserver?.disconnect(); navIconObserver = null }, 'dsh-background-by-model: nav icon watch')\n\n // ── 10. Deferred boot restore ─────────────────────────────────────────────\n // The theme service and the host settings scope settle asynchronously after\n // this apply, so the synchronous restore can be observed mid-flight — a late\n // host adoption resets the preference, or the presenter re-applies over our\n // overrides. Re-running the restore a few ticks later guarantees the saved\n // records land.\n const restoreSaved = (): void => {\n const color = activeRuleColor()\n if (color !== null) {\n const snapshot = ctx.theme.getTheme()\n if (!snapshot.themes.some(t => t.id === CUSTOM_ID)) {\n // Theme missing (host adoption dropped it): re-register + activate.\n registerCustom(color[0], color[1], color[2])\n } else if (snapshot.preference !== CUSTOM_ID) {\n // Theme present but inactive: just re-assert the preference. Calling\n // registerCustom here would dispose + re-create the skin, flashing the\n // interface back to the system theme for a frame on every boot.\n ctx.theme.setTheme(CUSTOM_ID)\n }\n }\n applyWp()\n }\n const restoreTimers = [300, 1500].map(delay => window.setTimeout(restoreSaved, delay))\n ctx.effect(() => () => { restoreTimers.forEach(id => window.clearTimeout(id)) }, 'dsh-background-by-model: boot restore')\n\n // ── 11. Theme watchdog ────────────────────────────────────────────────────\n // The theme service keeps only built-in preferences in memory, so ANY\n // host-scope adoption can silently drop the custom theme — reverting the label\n // colors and the inner surfaces to the system palette. While the active rule\n // carries a color, re-register and re-assert on a slow interval.\n const watchdogId = window.setInterval(() => {\n const color = activeRuleColor()\n if (color === null) return\n const snapshot = ctx.theme.getTheme()\n let changed = false\n if (!snapshot.themes.some(t => t.id === CUSTOM_ID)) {\n registerCustom(color[0], color[1], color[2])\n changed = true\n } else if (snapshot.preference !== CUSTOM_ID) {\n ctx.theme.setTheme(CUSTOM_ID)\n changed = true\n }\n if (changed) applyWp()\n }, 1000)\n ctx.effect(() => () => { window.clearInterval(watchdogId) }, 'dsh-background-by-model: theme watchdog')\n\n // ── 12. Theme-reset watchdog ──────────────────────────────────────────────\n const disposeThemeResets = watchThemeResets()\n ctx.effect(() => () => { disposeThemeResets() }, 'dsh-background-by-model: theme resets watch')\n\n // ── 13. Flush pending writes on page hide ─────────────────────────────────\n const onPageHide = (): void => flushSave()\n window.addEventListener('pagehide', onPageHide)\n ctx.effect(() => () => window.removeEventListener('pagehide', onPageHide), 'dsh-background-by-model: pagehide flush')\n\n // ── 14. One boot-time host check ──────────────────────────────────────────\n // The settings page can say exactly what broke, but only once someone opens it.\n // A host upgrade that renames something the plugin reads should also leave a\n // trace in the log of the session where it happened — one line per failing\n // contract, naming the literal and this plugin's file that reads it, so a bug\n // report can start from the log instead of from \"the background stopped\".\n //\n // Delayed: at apply time the shell is still mounting, so the surfaces that are\n // legitimately absent would be indistinguishable from renamed ones. Only\n // failures are logged — `skip` is the normal state of a closed panel.\n const hostCheckTimer = window.setTimeout(() => {\n try {\n const report = buildClientReport({\n ctx, lang: activeLang(), pluginVersion: PLUGIN_VERSION, floor: DSH_FLOOR, model: readModelFacts(),\n }, { version: '', compatible: null, note: '' })\n const failed = report.results.filter(r => r.status === 'fail')\n if (failed.length === 0) return\n console.warn(`dsh-background-by-model: ${failed.length} of ${report.results.length} host contract(s) are broken on this dsh build. Open Settings → ${ctx.locale.bind(NS)('pageHostCheck')} for the full report.`)\n for (const r of failed) {\n console.warn(`dsh-background-by-model: [${r.id}] ${r.reason ?? r.detail} — read by ${r.usedBy}; expected in ${r.sources.map(s => s.path).join(', ')}`)\n }\n } catch {\n // The check itself must never break the plugin it is checking.\n }\n }, 2500)\n ctx.effect(() => () => window.clearTimeout(hostCheckTimer), 'dsh-background-by-model: host check')\n}\n\n/** Color of the currently active rule, or null when it uses the system theme. */\nfunction activeRuleColor(): [number, number, number] | null {\n if (activeRuleId === null) return null\n const rule = ruleById(activeRuleId)\n return rule === null ? null : rule.color\n}\n"],"mappings":"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"}