dsh-background-by-model 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -3
- package/README.zh.md +16 -3
- package/lib/client.js +279 -199
- package/lib/client.js.map +1 -1
- package/lib/index.js +158 -100
- package/package.json +1 -1
package/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["BG_MODES","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/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 uiPreviewHint: '点开文件后出现在右侧的那一栏。透明度默认跟随「主背景」,拖动本卡片后单独生效;模糊会在主背景模糊之上再叠加一层',\r\n uiScopeHint: '界面页的设置是全局的,所有模型共用',\r\n\r\n statusTitle: '当前生效',\r\n statusModel: '当前模型',\r\n statusUnknown: '未检测到当前模型',\r\n statusUnknownHint: '检测不到时一律使用第 1 条可用规则;切换一次模型或稍等片刻会自动重试',\r\n statusSourceDefault: '宿主默认',\r\n statusSourceDefaultHint: '只读到宿主默认模型,它不是本会话当前选择的模型;本会话的模型选择可用后会自动纠正',\r\n statusNoteNoService: '仍未拿到会话服务(会话控制器晚于本插件加载),正在自动重试',\r\n statusNoteNoSession: '会话服务已就绪,但还没有当前会话 id',\r\n statusNoteNoProjection: '拿不到本会话的模型选择投影(binding / projections 不可用)',\r\n statusNoteEmptySelection: '本会话的模型选择投影还没有值(切一次模型即可写入)',\r\n statusNone: '还没有可用规则(规则需要启用并选择图片)',\r\n statusHit: '命中',\r\n statusFallback: '未命中 · 使用兜底',\r\n statusRule: '规则',\r\n\r\n rulesTitle: '规则列表',\r\n rulesHint: '从上到下即为优先级。规则 1 同时兼任兜底:所有匹配串都没命中时使用它',\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: 'Sidebar', uiOpacityCard: 'Cards & panels', uiOpacityInput: 'Input & controls',\r\n uiSop: 'Settings interface opacity', uiChatRegion: 'Conversation text frame', uiTrajectory: 'Trajectory view',\r\n uiPreview: 'File preview panel',\r\n uiPreviewHint: 'The column that slides in on the right when you open a file. Its opacity follows the Main background until you drag this card; its blur stacks on top of the Main background blur',\r\n uiScopeHint: 'Interface settings are global — every model shares them',\r\n\r\n statusTitle: 'Active now',\r\n statusModel: 'Current model',\r\n statusUnknown: 'No model detected',\r\n statusUnknownHint: 'Without a detected model rule 1 is always used; switching the model once or waiting a moment retries automatically',\r\n statusSourceDefault: 'host default',\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 statusNone: 'No usable rule yet (a rule needs to be enabled and have an image)',\r\n statusHit: 'matched',\r\n statusFallback: 'no match · using the fallback',\r\n statusRule: 'Rule',\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 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 color 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","import type { BgRule, BgState, BgMode, ThemeConfig, PartOpacities, PartBlurs } from './types'\n\nexport const DEFAULT_BG_STATE: BgState = { zoom: 1, x: 0, y: 0, iw: 0, ih: 0 }\n\nconst BG_MODES: BgMode[] = ['fit', 'fill', 'stretch', 'tile', 'center']\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\nexport const DEFAULT_CONFIG: ThemeConfig = {\n rules: [],\n opacities: { bg: 0.85, sidebar: 0.93, card: 1, input: 1 },\n blurs: { bg: 0, sidebar: 0, card: 0, settings: 0, chat: 0, trajectory: 0, rightbar: 0, input: 0 },\n settingsOpacity: 1,\n chatTextOpacity: 0,\n // 100% = untouched host surface; zero would blank the page by default.\n trajectoryOpacity: 1,\n // null = keep tracking the main background (the panel's host surface is the\n // very token that slider rewrites), so an upgrade changes nothing until the\n // user drags the file-preview card.\n rightbarOpacity: null,\n}\n\nfunction freshConfig(): ThemeConfig {\n return {\n rules: [],\n opacities: { ...DEFAULT_CONFIG.opacities },\n blurs: { ...DEFAULT_CONFIG.blurs },\n settingsOpacity: DEFAULT_CONFIG.settingsOpacity,\n chatTextOpacity: DEFAULT_CONFIG.chatTextOpacity,\n trajectoryOpacity: DEFAULT_CONFIG.trajectoryOpacity,\n rightbarOpacity: DEFAULT_CONFIG.rightbarOpacity,\n }\n}\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 = freshConfig()\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) ───────\nconst clamp01 = (n: unknown, def: number): number =>\n typeof n === 'number' && isFinite(n) ? Math.min(1, Math.max(0, n)) : def\nconst clamp = (n: unknown, lo: number, hi: number, def: number): number =>\n typeof n === 'number' && isFinite(n) ? Math.min(hi, Math.max(lo, n)) : def\n\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 ['bg', 'sidebar', 'card', 'input'] as const) {\n out[k] = clamp01(o[k], DEFAULT_CONFIG.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 ['bg', 'sidebar', 'card', 'settings', 'chat', 'trajectory', 'rightbar', 'input'] as const) {\n out[k] = clamp(b[k], 0, 60, DEFAULT_CONFIG.blurs[k])\n }\n return out\n}\nexport function rSop(): number { return clamp01(cfg.settingsOpacity, DEFAULT_CONFIG.settingsOpacity) }\nexport function rChatTextOpacity(): number { return clamp01(cfg.chatTextOpacity, DEFAULT_CONFIG.chatTextOpacity) }\nexport function rTrajectoryOpacity(): number { return clamp01(cfg.trajectoryOpacity, DEFAULT_CONFIG.trajectoryOpacity) }\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 ──────────────────────────────────────────────────────────\nfunction adoptBgState(s: Partial<BgState>): BgState {\n return {\n zoom: clamp(s.zoom, 0.1, 10, 1),\n x: typeof s.x === 'number' && isFinite(s.x) ? s.x : 0,\n y: typeof s.y === 'number' && isFinite(s.y) ? s.y : 0,\n iw: typeof s.iw === 'number' && s.iw > 0 ? s.iw : 0,\n ih: typeof s.ih === 'number' && s.ih > 0 ? s.ih : 0,\n }\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' && /^[A-Za-z0-9_-]{1,32}$/.test(r.slot) ? r.slot : null\n if (id === null || slot === null) return null\n const c = r.color\n const color: [number, number, number] | null =\n Array.isArray(c) && c.length === 3 && c.every(n => typeof n === 'number' && isFinite(n))\n ? [clamp(c[0], 0, 360, 220), clamp(c[1], 0, 1, 0.55), clamp(c[2], 0, 1, 0.25)]\n : null\n return {\n id,\n slot,\n match: typeof r.match === 'string' ? r.match : '',\n enabled: r.enabled !== false,\n color,\n bgMode: BG_MODES.includes(r.bgMode as BgMode) ? (r.bgMode as BgMode) : 'fit',\n wallpaperOpacity: clamp01(r.wallpaperOpacity, 1),\n blur: clamp(r.blur, 0, 60, 0),\n bgState: adoptBgState((r.bgState ?? {}) as Partial<BgState>),\n }\n}\n\n/** Move a possibly-absent partial config into the shape the UI reads. */\nexport function adoptConfig(raw: unknown): void {\n const c = (raw ?? {}) as Partial<ThemeConfig>\n const rules = Array.isArray(c.rules)\n ? c.rules.map(normalizeRule).filter((r): r is BgRule => r !== null)\n : []\n const ops = (c.opacities ?? {}) as Partial<PartOpacities>\n const bl = (c.blurs ?? {}) as Partial<PartBlurs>\n const blurs = {} as PartBlurs\n for (const k of ['bg', 'sidebar', 'card', 'settings', 'chat', 'trajectory', 'rightbar', 'input'] as const) {\n blurs[k] = clamp(bl[k], 0, 60, DEFAULT_CONFIG.blurs[k])\n }\n cfg = {\n rules,\n opacities: {\n bg: clamp01(ops.bg, DEFAULT_CONFIG.opacities.bg),\n sidebar: clamp01(ops.sidebar, DEFAULT_CONFIG.opacities.sidebar),\n card: clamp01(ops.card, DEFAULT_CONFIG.opacities.card),\n input: clamp01(ops.input, DEFAULT_CONFIG.opacities.input),\n },\n blurs,\n settingsOpacity: clamp01(c.settingsOpacity, DEFAULT_CONFIG.settingsOpacity),\n chatTextOpacity: clamp01(c.chatTextOpacity, DEFAULT_CONFIG.chatTextOpacity),\n trajectoryOpacity: clamp01(c.trajectoryOpacity, DEFAULT_CONFIG.trajectoryOpacity),\n // Absent or non-numeric keeps \"follow the main background\" (see ThemeConfig).\n rightbarOpacity: typeof c.rightbarOpacity === 'number' && isFinite(c.rightbarOpacity)\n ? clamp01(c.rightbarOpacity, 1)\n : null,\n }\n // A rule that vanished (import/removal) must not stay active.\n if (activeRuleId !== null && !rules.some(r => r.id === activeRuleId)) {\n activeRuleId = null\n activeMatched = false\n }\n}\n\nexport function resetConfig(): void {\n cfg = freshConfig()\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 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': hsl(h(0), s(0), l(0.08)),\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 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': hsl(h(0), s(-0.12), l(0.15)),\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 totalLum += v\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. --dsw-specific-menu (dropdowns, slash-trigger\r\n// menu, model selector, popovers around the dialog) is owned by the card\r\n// slider; the Cordis panel shares that token but is re-scoped to the input\r\n// 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'] },\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 '--dsw-specific-menu': '--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 whole visible surface is\r\n// `background: var(--dsw-alias-bg-base)` — the exact token the main-background\r\n// slider re-emits with its own alpha. The panel was therefore a second, unnamed\r\n// copy of the main background with no control of its own; this card takes it\r\n// over. The declaration is written from a stylesheet (not element discovery)\r\n// because the panel stays mounted across open/close, and the selector carries a\r\n// `div` prefix so it outranks the host's hashed class rule. `!important` covers\r\n// a later host rule that is at least as specific (such as an\r\n// `[data-sidebar-right-open]` variant). The `var()` fallback keeps the host's own\r\n// value until a rule with a color supplies one, so a color-less rule changes\r\n// nothing here.\r\n//\r\n// backdrop-filter goes directly on the panel: the settings dialog and the\r\n// composer already take theirs that way, and the panel holds no fixed-position\r\n// descendant whose containing block could be trapped (the float layer is\r\n// portaled out to <body>).\r\nexport const RIGHTBAR_STYLE_RULE =\r\n 'div[data-sidebar-right-panel]{' +\r\n 'background:var(--dsh-any-bg-rightbar,var(--dsw-alias-bg-base))!important;' +\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. **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 * b. **`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 * c. **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 every hop reports a `note` when it cannot\n * answer, so the settings page can name the failing one instead of silently\n * showing a value that is not this session's model.\n */\nimport type {\n BgRule, Ctx, ModelDirectoryLike, ModelDirectoryResolverLike, ModelSelectionProjectionLike,\n ObservableFaceLike, SessionsServiceLike,\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/**\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<{ current?: string }> | 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 ((list?.getSnapshot()?.current ?? null) === 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 = list?.getSnapshot()?.current ?? null\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 ((list.getSnapshot()?.current ?? null) !== 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-status{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:12.5px;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\r\n.dab-status-model{font-family:var(--dab-mono);font-size:12.5px;font-weight:600;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);border-radius:8px;padding:3px 9px}\r\n.dab-status-arrow{color:var(--dsw-alias-brand-primary);font-weight:700}\r\n.dab-status-hit{color:var(--dsw-alias-brand-primary);font-weight:600}\r\n.dab-status-none{color:var(--dsw-alias-state-error-primary)}\r\n.dab-status-src{font-size:11px;font-weight:600;letter-spacing:.02em;text-transform:uppercase;color:var(--dsw-alias-state-warning-primary,var(--dsw-alias-label-tertiary));background:var(--dsw-alias-interactive-bg-hover);border-radius:6px;padding:2px 7px}\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 <p className=\"dab-hint\" style={{ marginTop: 7 }}>{t('uiScopeHint')}</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\r\n {isRightbar ? <p className=\"dab-hint\" style={{ marginTop: 9 }}>{t('uiPreviewHint')}</p> : null}\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 { useRef, useState } from 'react'\nimport type { CSSProperties } from 'react'\nimport type { BgMode, BgRule, ThemeSectionProps, ThemeStoreState } from '../../types'\nimport { cfg, PALETTE } from '../../state'\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 const activeIndex = store.activeRuleId === null ? -1 : rules.findIndex(r => r.id === store.activeRuleId)\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 {/* Live resolution readout — the fastest way to see whether a rule set\n behaves the way it was written. */}\n <section className=\"dab-card dab-rise\" style={{ '--d': 1 } as CSSProperties}>\n <div className=\"dab-status\">\n <span>{t('statusModel')}</span>\n {store.model !== ''\n ? <span className=\"dab-status-model\">{store.model}</span>\n : <span className=\"dab-status-none\">{t('statusUnknown')}</span>}\n {store.model !== '' && store.modelSource === 'default'\n ? <span className=\"dab-status-src\">{t('statusSourceDefault')}</span>\n : null}\n {store.model !== '' ? <span className=\"dab-status-arrow\">→</span> : null}\n {activeIndex >= 0\n ? (\n <span className={store.matched ? 'dab-status-hit' : ''}>\n {store.matched ? t('statusHit') : t('statusFallback')} · {t('statusRule')} {activeIndex + 1}\n </span>\n )\n : <span className=\"dab-status-none\">{t('statusNone')}</span>}\n </div>\n {store.model === '' ? <p className=\"dab-hint\" style={{ marginTop: 9 }}>{t('statusUnknownHint')}</p> : null}\n {store.model !== '' && store.modelSource === 'default'\n ? <p className=\"dab-hint\" style={{ marginTop: 9 }}>{t('statusSourceDefaultHint')}</p>\n : null}\n {/* The failing hop, so a broken service lookup is never mistaken for a\n session that really is on some other model. */}\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 <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 // ── 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 },\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 }\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 // 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","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 & panels', 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 * `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 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': hsl(h(0), s(0), l(0.08)),\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 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': hsl(h(0), s(-0.12), l(0.15)),\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. --dsw-specific-menu (dropdowns, slash-trigger\r\n// menu, model selector, popovers around the dialog) is owned by the card\r\n// slider; the Cordis panel shares that token but is re-scoped to the input\r\n// 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'] },\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 '--dsw-specific-menu': '--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 whole visible surface is\r\n// `background: var(--dsw-alias-bg-base)` — the exact token the main-background\r\n// slider re-emits with its own alpha. The panel was therefore a second, unnamed\r\n// copy of the main background with no control of its own; this card takes it\r\n// over. The declaration is written from a stylesheet (not element discovery)\r\n// because the panel stays mounted across open/close, and the selector carries a\r\n// `div` prefix so it outranks the host's hashed class rule. `!important` covers\r\n// a later host rule that is at least as specific (such as an\r\n// `[data-sidebar-right-open]` variant). The `var()` fallback keeps the host's own\r\n// value until a rule with a color supplies one, so a color-less rule changes\r\n// nothing here.\r\n//\r\n// backdrop-filter goes directly on the panel: the settings dialog and the\r\n// composer already take theirs that way, and the panel holds no fixed-position\r\n// descendant whose containing block could be trapped (the float layer is\r\n// portaled out to <body>).\r\nexport const RIGHTBAR_STYLE_RULE =\r\n 'div[data-sidebar-right-panel]{' +\r\n 'background:var(--dsh-any-bg-rightbar,var(--dsw-alias-bg-base))!important;' +\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. **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 * b. **`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 * c. **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 every hop reports a `note` when it cannot\n * answer, so the settings page can name the failing one instead of silently\n * showing a value that is not this session's model.\n */\nimport type {\n BgRule, Ctx, ModelDirectoryLike, ModelDirectoryResolverLike, ModelSelectionProjectionLike,\n ObservableFaceLike, SessionsServiceLike,\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/**\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<{ current?: string }> | 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 ((list?.getSnapshot()?.current ?? null) === 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 = list?.getSnapshot()?.current ?? null\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 ((list.getSnapshot()?.current ?? null) !== 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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"}
|