dsh-any-background 0.1.7 → 0.1.8
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/LICENSE +21 -21
- package/README.md +40 -209
- package/README.zh.md +43 -211
- package/cordis.patch.yml +8 -8
- package/lib/client.js +2866 -963
- package/lib/client.js.map +1 -1
- package/lib/index.js +47 -2
- package/package.json +1 -1
package/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["useRef","useState","useCallback","useState","useRef","useRef","useState","useCallback","useState","useRef","useCallback","useRef","Component","useRef","useState","defineStore"],"sources":["../src/client/i18n.ts","../src/client/state.ts","../src/client/rpc.ts","../src/client/utils/color.ts","../src/client/wallpaper.ts","../src/client/styles.ts","../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/LiveSlider.tsx","../src/client/components/ErrorBoundary.tsx","../src/client/components/ThemeSection.tsx","../src/client/components/icons.tsx","../src/client/index.tsx"],"sourcesContent":["export const NS = 'settings.anyBg'\n\nexport const zh: Record<string, string> = {\n nav: '主题', subtitle: '自定义界面外观',\n colorTitle: '主题色', colorHint: '在色轮上选择色相,在方形中调整饱和度和明度',\n uiTitle: '主界面',\n uiOpacity: '透明度', uiBlur: '模糊度',\n uiOpacityBg: '主背景', uiOpacitySide: '侧边栏', uiOpacityCard: '对话框中选项面板',\n uiSop: '设置界面透明度',\n bgTitle: '背景图片', bgChoose: '选择图片', bgRemove: '移除图片',\n bgEdit: '编辑位置', wpOpacity: '壁纸透明度', bgBlur: '壁纸模糊',\n bgHint: '拖动滑块实时调整。点击背景图可打开编辑器调整位置和大小',\n editorTitle: '背景编辑器', editorHint: '拖动移动图片,滚轮缩放大小',\n editorCommit: '确认', editorCancel: '取消', editorReset: '重置',\n extractColor: '从壁纸提取主题色', extracting: '取色中…',\n extractNoWp: '请先设置背景图片',\n extractDone: '已应用壁纸主色调',\n extractFail: '未在壁纸中找到鲜明的颜色,请换一张壁纸',\n crashTitle: '界面渲染出错',\n crashDesc: '主题设置面板遇到问题,点击下方按钮重置后重试',\n crashReset: '重置面板',\n exportTheme: '导出配置',\n importTheme: '导入配置',\n importDone: '已导入主题配置',\n importFail: '导入失败,文件格式不正确',\n eyedropper: '从壁纸取色',\n pickerTitle: '从壁纸取色',\n pickerHint: '移动鼠标预览颜色,点击壁纸选取为主题色',\n pickerClose: '关闭',\n}\n\nexport const en: Record<string, string> = {\n nav: 'Theme', subtitle: 'Customize appearance',\n colorTitle: 'Theme color', colorHint: 'Pick hue on the ring, adjust saturation & lightness in the square',\n uiTitle: 'Interface opacity',\n uiOpacity: 'Opacity', uiBlur: 'Blur',\n uiOpacityBg: 'Main background', uiOpacitySide: 'Sidebar', uiOpacityCard: 'Cards & panels',\n uiSop: 'Settings interface opacity',\n bgTitle: 'Wallpaper', bgChoose: 'Choose image', bgRemove: 'Remove image',\n bgEdit: 'Edit position', wpOpacity: 'Wallpaper opacity', bgBlur: 'Wallpaper blur',\n bgHint: 'Drag sliders for real-time adjustment. Click the image to open the editor',\n editorTitle: 'Background editor', editorHint: 'Drag to move, scroll to zoom',\n editorCommit: 'Confirm', editorCancel: 'Cancel', editorReset: 'Reset',\n extractColor: 'Extract from wallpaper', extracting: 'Extracting…',\n extractNoWp: 'Set a wallpaper first',\n extractDone: 'Wallpaper color applied',\n extractFail: 'No vivid color found in this wallpaper, try another',\n crashTitle: 'Section crashed',\n crashDesc: 'The theme panel hit an error. Reset below to recover.',\n crashReset: 'Reset panel',\n exportTheme: 'Export',\n importTheme: 'Import',\n importDone: 'Theme imported',\n importFail: 'Import failed — invalid file',\n eyedropper: 'Eyedropper',\n pickerTitle: 'Pick from wallpaper',\n pickerHint: 'Hover to preview, click to pick as theme color',\n pickerClose: 'Close',\n}\n","import type { BgState, ThemeConfig, PartOpacities, PartBlurs } from './types'\n\nexport const DEFAULT_CONFIG: ThemeConfig = {\n color: null,\n opacities: { bg: 0.85, sidebar: 0.93, card: 1 },\n blurs: { bg: 0, sidebar: 0, card: 0, settings: 0 },\n settingsOpacity: 1,\n wallpaperOpacity: 1,\n blur: 0,\n bgState: { zoom: 1, x: 0, y: 0, iw: 0, ih: 0 },\n}\n\n// In-memory mirror of the file-backed store. The node half owns the disk; this\n// module is the single source of truth the UI reads from and mutates, synced\n// to disk via the RPC layer.\nexport let cfg: ThemeConfig = { ...DEFAULT_CONFIG, opacities: { ...DEFAULT_CONFIG.opacities }, blurs: { ...DEFAULT_CONFIG.blurs }, bgState: { ...DEFAULT_CONFIG.bgState } }\nexport let wpUrl: string | null = null\n\nexport function setWpUrl(url: string | null): void { wpUrl = url }\nexport function setBgState(s: BgState): void { cfg.bgState = s }\n\nexport function rHasColor(): boolean { return cfg.color !== null }\nexport function rColor(): [number, number, number] { return cfg.color ?? [220, 0.55, 0.25] }\nexport function rWp(): string | null { return wpUrl }\nexport function rOps(): PartOpacities {\n const o = cfg.opacities ?? {}\n return {\n bg: typeof o.bg === 'number' ? Math.min(1, Math.max(0, o.bg)) : DEFAULT_CONFIG.opacities.bg,\n sidebar: typeof o.sidebar === 'number' ? Math.min(1, Math.max(0, o.sidebar)) : DEFAULT_CONFIG.opacities.sidebar,\n card: typeof o.card === 'number' ? Math.min(1, Math.max(0, o.card)) : DEFAULT_CONFIG.opacities.card,\n }\n}\nexport function rBlurs(): PartBlurs {\n const b = cfg.blurs ?? {}\n return {\n bg: typeof b.bg === 'number' ? Math.min(60, Math.max(0, b.bg)) : DEFAULT_CONFIG.blurs.bg,\n sidebar: typeof b.sidebar === 'number' ? Math.min(60, Math.max(0, b.sidebar)) : DEFAULT_CONFIG.blurs.sidebar,\n card: typeof b.card === 'number' ? Math.min(60, Math.max(0, b.card)) : DEFAULT_CONFIG.blurs.card,\n settings: typeof b.settings === 'number' ? Math.min(60, Math.max(0, b.settings)) : DEFAULT_CONFIG.blurs.settings,\n }\n}\nexport function rWop(): number { return typeof cfg.wallpaperOpacity === 'number' ? Math.min(1, Math.max(0, cfg.wallpaperOpacity)) : DEFAULT_CONFIG.wallpaperOpacity }\nexport function rBl(): number { return typeof cfg.blur === 'number' ? Math.min(60, Math.max(0, cfg.blur)) : DEFAULT_CONFIG.blur }\nexport function rSop(): number { return typeof cfg.settingsOpacity === 'number' ? Math.min(1, Math.max(0, cfg.settingsOpacity)) : DEFAULT_CONFIG.settingsOpacity }\nexport function rBgState(): BgState { return cfg.bgState }\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> & { opacity?: unknown }\n const color = Array.isArray(c.color) && c.color.length === 3\n ? [c.color[0], c.color[1], c.color[2]] as [number, number, number]\n : null\n const bg = (c.bgState ?? {}) as Partial<BgState>\n // Migration: the old single main-interface opacity becomes per-part, keeping\n // the sidebar's former +0.08 offset and leaving cards opaque as before.\n const legacy = typeof c.opacity === 'number' ? c.opacity : null\n const ops = (c.opacities ?? {}) as Partial<PartOpacities>\n const bl = (c.blurs ?? {}) as Partial<PartBlurs>\n cfg = {\n color,\n opacities: {\n bg: typeof ops.bg === 'number' ? ops.bg : (legacy ?? DEFAULT_CONFIG.opacities.bg),\n sidebar: typeof ops.sidebar === 'number' ? ops.sidebar : (legacy !== null ? Math.min(1, legacy + 0.08) : DEFAULT_CONFIG.opacities.sidebar),\n card: typeof ops.card === 'number' ? ops.card : DEFAULT_CONFIG.opacities.card,\n },\n blurs: {\n bg: typeof bl.bg === 'number' ? bl.bg : DEFAULT_CONFIG.blurs.bg,\n sidebar: typeof bl.sidebar === 'number' ? bl.sidebar : DEFAULT_CONFIG.blurs.sidebar,\n card: typeof bl.card === 'number' ? bl.card : DEFAULT_CONFIG.blurs.card,\n settings: typeof bl.settings === 'number' ? bl.settings : DEFAULT_CONFIG.blurs.settings,\n },\n settingsOpacity: typeof c.settingsOpacity === 'number' ? c.settingsOpacity : DEFAULT_CONFIG.settingsOpacity,\n wallpaperOpacity: typeof c.wallpaperOpacity === 'number' ? c.wallpaperOpacity : DEFAULT_CONFIG.wallpaperOpacity,\n blur: typeof c.blur === 'number' ? c.blur : DEFAULT_CONFIG.blur,\n bgState: {\n zoom: typeof bg.zoom === 'number' ? bg.zoom : 1,\n x: typeof bg.x === 'number' ? bg.x : 0,\n y: typeof bg.y === 'number' ? bg.y : 0,\n iw: typeof bg.iw === 'number' && bg.iw > 0 ? bg.iw : 0,\n ih: typeof bg.ih === 'number' && bg.ih > 0 ? bg.ih : 0,\n },\n }\n}\n","import type { RpcResultLike } from './types'\nimport { cfg, adoptConfig, setWpUrl } from './state'\n\nexport const RPC_CHANNEL = '/dsh-any-background'\nconst RPC_NS = 'dshAnyBackground'\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-any-background: rpc \"${method}\" failed`, res?.error)\n return undefined\n } catch (e) {\n console.warn(`dsh-any-background: rpc \"${method}\" threw`, e)\n return undefined\n }\n}\n\n// ── Debounced persistence ─────────────────────────────────────────────────────\n// Slider drags fire onInput (and React's onChange) dozens of times per second;\n// each saveConfig() would trigger an RPC write. Coalesce writes to a trailing\n// debounce so the disk is only touched after the user pauses or releases, and\n// flush the last pending write on pagehide so a quick close never loses it.\n\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 (import path — no debounce). */\nexport function persistConfig(): void {\n void rpcCall('writeConfig', { config: cfg })\n}\n\n/** Load the persisted theme (config + wallpaper) from the node half. */\nexport async function loadPersisted(): Promise<void> {\n const data = await rpcCall('read', {})\n if (data && typeof data === 'object') {\n const d = data as { config?: unknown; wallpaper?: unknown }\n if (d.config) adoptConfig(d.config)\n if (typeof d.wallpaper === 'string') setWpUrl(d.wallpaper)\n else if (d.wallpaper === null) setWpUrl(null)\n }\n}\n\n/** Persist a wallpaper (null removes it). One-shot large payload, no debounce. */\nexport function persistWallpaper(dataUrl: string | null): void {\n void rpcCall('setWallpaper', { dataUrl })\n}\n","import type { BgState } from '../types'\n\n// ── HSV ↔ HSL ────────────────────────────────────────────────────────────────\n// The wheel works in HSV end to end: props and pickSL are HSV, the canvas\n// renders the HSV S-V plane directly. Storage and genTokens expect HSL, so\n// setColor converts HSV → HSL at the boundary; sectionInject converts stored\n// HSL → HSV for the initial wheel props. Conversions never stack.\n\nexport function hsvToHsl(h: number, s: number, v: number): [number, number, number] {\n const l = v * (1 - s / 2)\n const sl = l === 0 || l === 1 ? 0 : (v - l) / Math.min(l, 1 - l)\n return [h, sl, l]\n}\n\nexport function hslToHsv(h: number, s: number, l: number): [number, number, number] {\n const v = l + s * Math.min(l, 1 - l)\n const sv = v === 0 ? 0 : 2 * (1 - l / v)\n return [h, sv, v]\n}\n\n// ── Token generation from HSL ──────────────────────────────────────────────────\n\nlet tokensCacheKey = ''\nlet tokensCache: { colorScheme: 'light' | 'dark'; tokens: Record<string, string> } | null = null\n\n/**\n * Memoized token generation: the same (hue, sat, lit) input always yields the\n * same token set, and applyWp / applyCustomTokens / applySettingsOverrides call\n * this repeatedly (slider drags, viewport re-applies), so cache the last result\n * and skip the 30+ hsl() string builds when nothing changed.\n */\nexport function genTokens(hue: number, sat: number, lit: number): { colorScheme: 'light' | 'dark'; tokens: Record<string, string> } {\n const key = `${hue}|${sat}|${lit}`\n if (tokensCacheKey === key && tokensCache) return tokensCache\n tokensCacheKey = key\n tokensCache = buildTokens(hue, sat, lit)\n return tokensCache\n}\n\nfunction buildTokens(hue: number, sat: number, lit: number): { colorScheme: 'light' | 'dark'; tokens: Record<string, string> } {\n const dark = lit < 0.55\n const h = (d: number) => ((hue + d) % 360 + 360) % 360\n const s = (d: number) => Math.max(0, Math.min(1, sat + d))\n const l = (d: number) => Math.max(0, Math.min(1, lit + d))\n const hsl = (hh: number, ss: number, ll: number) => `hsl(${Math.round(hh)},${Math.round(ss * 100)}%,${Math.round(ll * 100)}%)`\n const rgba = (hh: number, ss: number, ll: number, a: number) =>\n `hsla(${Math.round(hh)},${Math.round(ss * 100)}%,${Math.round(ll * 100)}%,${a})`\n\n if (dark) {\n return {\n colorScheme: 'dark',\n tokens: {\n '--dsw-alias-bg-base': hsl(h(0), s(0), l(-0.04)),\n '--dsw-alias-bg-layer-1': hsl(h(0), s(0), l(0.02)),\n '--dsw-alias-bg-layer-2': hsl(h(0), s(0), l(0.07)),\n '--dsw-alias-bg-layer-3': hsl(h(0), s(-0.05), l(0.12)),\n '--dsw-alias-bg-overlay': hsl(h(0), s(-0.05), l(0.12)),\n '--dsw-alias-border-l1': rgba(h(0), s(-0.1), l(0.18), 0.12),\n '--dsw-alias-border-l2': rgba(h(0), s(-0.1), l(0.22), 0.22),\n '--dsw-alias-label-primary': hsl(0, 0, 1),\n '--dsw-alias-label-secondary': hsl(0, 0, 1),\n '--dsw-alias-label-tertiary': hsl(0, 0, 1),\n // The harness's dimmer label tiers (placeholder text, model/permission\n // chevrons, disabled rows) must follow the dark scheme's light font\n // instead of staying neutral gray, or they read as \"always gray\".\n '--dsw-alias-label-caption': hsl(0, 0, 1),\n '--dsw-alias-label-dimmed': hsl(0, 0, 1),\n '--dsw-alias-label-quaternary': hsl(0, 0, 1),\n '--dsw-alias-brand-primary': hsl(h(0), s(0.1), Math.max(l(0.2), 0.5)),\n '--dsw-alias-brand-text': l(0.2) > 0.6 ? '#000' : '#fff',\n '--dsw-alias-button-primary-hover': hsl(h(0), s(0.1), Math.max(l(0.28), 0.58)),\n '--dsw-alias-button-primary-dimmed': hsl(h(0), s(0), l(0.07)),\n '--dsw-alias-button-elevated-fill': hsl(h(0), s(0), l(0.04)),\n '--dsw-alias-interactive-bg-hover': rgba(h(0), s(0), Math.max(l(0.15), 0.4), 0.12),\n '--dsw-alias-interactive-bg-active': rgba(h(0), s(0), Math.max(l(0.15), 0.4), 0.2),\n '--dsw-alias-markdown-code-block': hsl(h(0), s(0), l(-0.06)),\n '--dsw-alias-markdown-inline-code': hsl(h(0), s(0), l(0.04)),\n '--dsw-alias-state-error-primary': '#ff5c72',\n '--dsw-alias-state-success-primary': '#3ddc84',\n '--dsw-alias-state-warn-primary': '#ffb347',\n '--dsw-specific-sidebar-fill': hsl(h(0), s(0), l(-0.06)),\n '--dsw-specific-sidebar-nav-item-active': hsl(h(0), s(0), l(0.04)),\n '--dsw-specific-sidebar-nav-item-hover': hsl(h(0), s(0), l(0)),\n '--dsw-specific-input-major': hsl(h(0), s(0), l(0.02)),\n '--dsw-alias-scrollbar-bg-l1': hsl(h(0), s(-0.05), l(0.12)),\n '--dsw-alias-scrollbar-bg-l2': hsl(h(0), s(-0.05), l(0.16)),\n '--dsw-alias-scrollbar-hover-l1': hsl(h(0), s(-0.05), l(0.22)),\n '--dsw-alias-scrollbar-hover-l2': hsl(h(0), s(-0.05), l(0.22)),\n },\n }\n }\n return {\n colorScheme: 'light',\n tokens: {\n // Backgrounds track the picked color at its lightness — theme-colored,\n // with only mild desaturation so the surfaces stay readable.\n '--dsw-alias-bg-base': hsl(h(0), s(-0.08), l(0.03)),\n '--dsw-alias-bg-layer-1': hsl(h(0), s(-0.12), l(0.07)),\n '--dsw-alias-bg-layer-2': hsl(h(0), s(-0.1), l(-0.03)),\n '--dsw-alias-bg-layer-3': hsl(h(0), s(-0.08), l(-0.09)),\n '--dsw-alias-bg-overlay': hsl(h(0), s(-0.12), l(0.08)),\n '--dsw-alias-border-l1': rgba(h(0), s(-0.15), l(-0.35), 0.18),\n '--dsw-alias-border-l2': rgba(h(0), s(-0.15), l(-0.35), 0.3),\n // Text is pure black on light surfaces, pure white on dark.\n '--dsw-alias-label-primary': hsl(0, 0, 0),\n '--dsw-alias-label-secondary': hsl(0, 0, 0),\n '--dsw-alias-label-tertiary': hsl(0, 0, 0),\n // Same as above but for the light scheme: dimmer tiers go black so the\n // placeholder, chevrons, category captions and disabled rows follow the\n // theme's dark font instead of staying gray.\n '--dsw-alias-label-caption': hsl(0, 0, 0),\n '--dsw-alias-label-dimmed': hsl(0, 0, 0),\n '--dsw-alias-label-quaternary': hsl(0, 0, 0),\n '--dsw-alias-brand-primary': hsl(h(0), s(0.05), Math.min(l(-0.18), 0.45)),\n '--dsw-alias-brand-text': '#fff',\n '--dsw-alias-button-primary-hover': hsl(h(0), s(0.05), Math.min(l(-0.12), 0.5)),\n '--dsw-alias-button-primary-dimmed': hsl(h(0), s(-0.1), l(-0.03)),\n '--dsw-alias-button-elevated-fill': hsl(h(0), s(-0.1), l(0.1)),\n '--dsw-alias-interactive-bg-hover': rgba(h(0), s(0), l(-0.3), 0.08),\n '--dsw-alias-interactive-bg-active': rgba(h(0), s(0), l(-0.3), 0.14),\n '--dsw-alias-markdown-code-block': hsl(h(0), s(-0.1), l(-0.03)),\n '--dsw-alias-markdown-inline-code': hsl(h(0), s(-0.08), l(0.04)),\n '--dsw-specific-sidebar-fill': hsl(h(0), s(-0.1), l(-0.03)),\n '--dsw-specific-sidebar-nav-item-active': hsl(h(0), s(-0.08), l(0.05)),\n '--dsw-specific-sidebar-nav-item-hover': hsl(h(0), s(-0.12), l(0)),\n '--dsw-specific-input-major': hsl(h(0), s(-0.12), l(0.1)),\n '--dsw-alias-scrollbar-bg-l1': hsl(h(0), s(-0.1), l(-0.08)),\n '--dsw-alias-scrollbar-bg-l2': hsl(h(0), s(-0.08), l(-0.12)),\n '--dsw-alias-scrollbar-hover-l1': hsl(h(0), s(-0.08), l(-0.16)),\n '--dsw-alias-scrollbar-hover-l2': hsl(h(0), s(-0.08), l(-0.16)),\n },\n }\n}\n\nexport function toRgba(c: string, a: number): string {\n const hx = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(c.trim())\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})` }\n const rgb = /^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+))?\\s*\\)$/i.exec(c.trim())\n if (rgb) return `rgba(${rgb[1]},${rgb[2]},${rgb[3]},${a})`\n const hsl = /^hsla?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%/i.exec(c.trim())\n if (hsl) return `hsla(${hsl[1]},${hsl[2]}%,${hsl[3]}%,${a})`\n return c.trim()\n}\n\nexport function rgbToHsl(r: number, g: number, b: number): [number, number, number] {\n const rn = r / 255, gn = g / 255, bn = b / 255\n const max = Math.max(rn, gn, bn), min = Math.min(rn, gn, bn)\n const l = (max + min) / 2\n if (max === min) return [0, 0, l]\n const d = max - min\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n let h: number\n if (max === rn) h = ((gn - bn) / d) % 6\n else if (max === gn) h = (bn - rn) / d + 2\n else h = (rn - gn) / d + 4\n h *= 60\n if (h < 0) h += 360\n return [h, s, l]\n}\n\n// ── Wallpaper color extraction ─────────────────────────────────────────────────\n// Full chain: decode the cached data URL → crop the visible (framed) region →\n// downsample to a 64×64 canvas → quantize pixels into 4-bit RGB buckets →\n// discard near-gray / near-black / near-white pixels → pick the most populous\n// vivid bucket (count × saturation bias) → average its members → RGB→HSL →\n// clamp lightness into a band that keeps the light/dark scheme decision\n// unambiguous. Purely client-side: no RPC traffic, and memory is bounded by\n// one 64×64 canvas + one ImageData + two small typed arrays.\n\nconst EXTRACT_SIDE = 64\n\nexport function extractWallpaperColor(dataUrl: string, bgState: BgState): Promise<[number, number, number] | null> {\n return new Promise(resolve => {\n const img = new Image()\n img.onerror = () => resolve(null)\n img.onload = () => {\n try {\n const iw = img.naturalWidth || img.width\n const ih = img.naturalHeight || img.height\n // Sample what the user framed: reuse the wallpaper placement model\n // (contain-fit at zoom with the center pinned to the committed\n // fractional point) to crop the visible region in image coordinates.\n const bg = bgState\n let sx = 0, sy = 0, sw = iw, sh = ih\n if (bg.iw === iw && bg.ih === ih && bg.iw > 0) {\n const fit = Math.min(window.innerWidth / iw, window.innerHeight / ih)\n const w = iw * fit * bg.zoom\n const h = ih * fit * bg.zoom\n sx = Math.max(0, bg.x * window.innerWidth - w / 2)\n sy = Math.max(0, bg.y * window.innerHeight - h / 2)\n sw = Math.min(iw - sx, w)\n sh = Math.min(ih - sy, h)\n if (sw <= 0 || sh <= 0) { sx = 0; sy = 0; sw = iw; sh = ih }\n }\n const c = document.createElement('canvas')\n c.width = EXTRACT_SIDE; c.height = EXTRACT_SIDE\n const g = c.getContext('2d', { willReadFrequently: true })!\n g.drawImage(img, sx, sy, sw, sh, 0, 0, EXTRACT_SIDE, EXTRACT_SIDE)\n const px = g.getImageData(0, 0, EXTRACT_SIDE, EXTRACT_SIDE).data\n // 4-bit RGB quantization → 4096 buckets with pixel counts and sums.\n const counts = new Uint32Array(4096)\n const sums = new Float64Array(4096 * 3)\n for (let i = 0; i < px.length; i += 4) {\n const r = px[i], gg = px[i + 1], b = px[i + 2]\n const max = Math.max(r, gg, b), min = Math.min(r, gg, b)\n const v = max / 255\n const s = max === 0 ? 0 : (max - min) / max\n // Skip achromatic and nearly black/white pixels — they would yield\n // dull gray themes.\n if (s < 0.08 || v < 0.12 || v > 0.97) continue\n const key = ((r >> 4) << 8) | ((gg >> 4) << 4) | (b >> 4)\n counts[key]++\n sums[key * 3] += r; sums[key * 3 + 1] += gg; sums[key * 3 + 2] += b\n }\n // Winner: the most populous vivid bucket (vividness breaks near ties).\n let best = -1, bestW = 0\n for (let k = 0; k < 4096; k++) {\n if (counts[k] === 0) continue\n const r = sums[k * 3] / counts[k]\n const gg = sums[k * 3 + 1] / counts[k]\n const b = sums[k * 3 + 2] / counts[k]\n const max = Math.max(r, gg, b), min = Math.min(r, gg, b)\n const s = max === 0 ? 0 : (max - min) / max\n const w = counts[k] * (0.5 + s)\n if (w > bestW) { bestW = w; best = k }\n }\n if (best < 0) { resolve(null); return }\n const r = sums[best * 3] / counts[best]\n const gg = sums[best * 3 + 1] / counts[best]\n const b = sums[best * 3 + 2] / counts[best]\n const [h, s, l] = rgbToHsl(r, gg, b)\n // Keep hue and saturation, snap lightness out of the ambiguous middle\n // (genTokens decides the scheme at l < 0.55): dark picks land in\n // [0.2, 0.44], light picks in [0.6, 0.82].\n const lc = l < 0.5 ? Math.min(0.44, Math.max(0.2, l)) : Math.max(0.6, Math.min(0.82, l))\n resolve([h, Math.min(0.9, Math.max(0.15, s)), lc])\n } catch {\n resolve(null)\n }\n }\n img.src = dataUrl\n })\n}\n\n/** HSL (h 0-360, s/l 0-1) → RGB (0-255 integers). */\nexport function hslToRgb(h: number, s: number, l: number): [number, number, number] {\n const c = (1 - Math.abs(2 * l - 1)) * s\n const hp = h / 60\n const x = c * (1 - Math.abs((hp % 2) - 1))\n let r = 0, g = 0, b = 0\n if (hp < 1) { r = c; g = x }\n else if (hp < 2) { r = x; g = c }\n else if (hp < 3) { g = c; b = x }\n else if (hp < 4) { g = x; b = c }\n else if (hp < 5) { r = x; b = c }\n else { r = c; b = x }\n const m = l - c / 2\n return [Math.round((r + m) * 255), Math.round((g + m) * 255), Math.round((b + m) * 255)]\n}\n","import { rWp, rBgState, rBl, rWop, rOps, rSop, rColor, rBlurs } from './state'\nimport type { PartOpacities, PartBlurs } from './types'\nimport { genTokens, toRgba } from './utils/color'\n\nlet wpEl: HTMLDivElement | null = null\nlet appliedTokenNames: string[] = []\n\nfunction clearCustomTokens(): void {\n for (const name of appliedTokenNames) document.body.style.removeProperty(name)\n appliedTokenNames = []\n}\n\n/**\n * Write the saved color's full token set as inline variables on body — the\n * same write surface the theme presenter owns, but derived DIRECTLY from the\n * saved pick, so the theme color never depends on the theme service's active\n * state or the presenter's timing. The bg-base, sidebar and layer surfaces are\n * re-emitted at their per-part alpha; every other token (labels, borders,\n * brand) is written verbatim. No reads: nothing can observe a stale or reset\n * theme value and leave the homepage on the system color.\n */\nexport function applyCustomTokens(ops: PartOpacities): void {\n const [h, s, l] = rColor()\n const { tokens } = genTokens(h, s, l)\n clearCustomTokens()\n // Drive the base-palette switch ourselves so tokens the plugin does not\n // override (the input surface, masks, static tokens) follow the picked\n // color's dark/light scheme even while the theme service preference is\n // being adopted/reset.\n // Use a plugin-specific value so the gradient rule does not accidentally\n // match a dark-mode flag set by the host harness.\n if (l < 0.55) document.body.setAttribute('data-ds-dark-theme', 'dsh-any-background')\n else document.body.removeAttribute('data-ds-dark-theme')\n for (const [name, value] of Object.entries(tokens)) {\n let v = value\n if (name === '--dsw-alias-bg-base') v = toRgba(value, ops.bg)\n else if (name === '--dsw-specific-sidebar-fill') v = toRgba(value, ops.sidebar)\n else if (name === '--dsw-alias-bg-layer-1' || name === '--dsw-alias-bg-layer-2' || name === '--dsw-alias-bg-layer-3') v = toRgba(value, ops.card)\n document.body.style.setProperty(name, v)\n appliedTokenNames.push(name)\n }\n}\n\n// ── Settings panel opacity ─────────────────────────────────────────────────────\n// The settings modal is the only aria-modal dialog that identifies itself with\n// aria-labelledby (ui-primitives' Modal and the image lightbox use aria-label),\n// so this selector scopes the translucency to the settings panel alone. The\n// panel surface is --dsw-alias-bg-layer-2, resolved here from body's computed\n// style (the theme presenter writes custom-theme tokens inline on body; the\n// base palettes declare the alias in the stylesheets) and re-emitted with an\n// alpha through a plugin-owned variable, so the panel keeps its current color\n// while fading toward whatever sits behind the modal.\n\nconst SETTINGS_PANEL_SEL = '[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby]'\nexport const SETTINGS_STYLE_RULE = `${SETTINGS_PANEL_SEL}{background:var(--dsh-any-bg-settings-surface,var(--dsw-alias-bg-layer-2));backdrop-filter:var(--dsh-any-blur-settings,none)}`\n\nexport function applySettingsOverrides(op: number): void {\n if (op >= 1) {\n document.documentElement.style.removeProperty('--dsh-any-bg-settings-surface')\n return\n }\n // Derive the panel surface from the saved color's layer-2 token (not a\n // computed-style read), so the settings panel matches the homepage tint\n // without depending on the presenter or theme state.\n const [h, s, l] = rColor()\n const layer2 = genTokens(h, s, l).tokens['--dsw-alias-bg-layer-2']\n if (layer2 !== undefined) {\n document.documentElement.style.setProperty('--dsh-any-bg-settings-surface', toRgba(layer2, op))\n }\n}\n\n// ── Per-part interface blur ───────────────────────────────────────────────────\n// The three-column AppFrame (ui-layout) styles its columns with hashed\n// CSS-module classes, so the parts are located structurally instead: the shell\n// overlay carries a stable data attribute, and the sidebar/center/details\n// columns are its three preceding siblings inside the frame. The frame fills\n// the viewport (html/body/#root are 100% tall), so making it a backdrop root\n// does not move or clip the fixed settings overlay it contains.\nlet frameEl: HTMLElement | null = null\nlet sidebarEl: HTMLElement | null = null\nlet centerEl: HTMLElement | null = null\nlet detailsEl: HTMLElement | null = null\n\nfunction discoverParts(): void {\n const overlay = document.querySelector<HTMLElement>('[data-shell-overlay]')\n if (overlay === null) return\n const frame = overlay.parentElement\n if (frame === null) return\n frameEl = frame\n const idx = Array.from(frame.children).indexOf(overlay)\n sidebarEl = (frame.children[idx - 3] as HTMLElement | undefined) ?? null\n centerEl = (frame.children[idx - 2] as HTMLElement | undefined) ?? null\n detailsEl = (frame.children[idx - 1] as HTMLElement | undefined) ?? null\n}\n\nfunction setBlur(el: HTMLElement | null, px: number): void {\n if (el === null) return\n if (px > 0) el.style.backdropFilter = `blur(${px}px)`\n else el.style.removeProperty('backdrop-filter')\n}\n\nfunction applySettingsBlur(px: number): void {\n if (px > 0) document.documentElement.style.setProperty('--dsh-any-blur-settings', `blur(${px}px)`)\n else document.documentElement.style.removeProperty('--dsh-any-blur-settings')\n}\n\n/** Apply per-part interface blur to the AppFrame columns + settings panel. */\nexport function applyPartBlurs(blurs: PartBlurs): void {\n discoverParts()\n setBlur(frameEl, blurs.bg)\n setBlur(sidebarEl, blurs.sidebar)\n setBlur(centerEl, blurs.card)\n setBlur(detailsEl, blurs.card)\n applySettingsBlur(blurs.settings)\n}\n\n/** Live per-part blur update during slider drag (no full re-apply). */\nexport function setPartBlur(part: keyof PartBlurs, v: number): void {\n if (part === 'settings') { applySettingsBlur(v); return }\n discoverParts()\n if (part === 'bg') setBlur(frameEl, v)\n else if (part === 'sidebar') setBlur(sidebarEl, v)\n else { setBlur(centerEl, v); setBlur(detailsEl, v) }\n}\n\nlet partsObserver: MutationObserver | null = null\n\n/** Watch for the AppFrame mounting so persisted blurs land even when the shell\n * renders after this plugin's apply. Cheap: once all parts are found, the\n * callback returns. */\nexport function watchParts(): void {\n if (partsObserver !== null || typeof MutationObserver === 'undefined') return\n partsObserver = new MutationObserver(() => {\n if (frameEl !== null && sidebarEl !== null && centerEl !== null && detailsEl !== null && document.body.contains(frameEl)) return\n applyPartBlurs(rBlurs())\n })\n partsObserver.observe(document.body, { childList: true, subtree: true })\n}\n\nexport function stopWatchingParts(): void {\n partsObserver?.disconnect()\n partsObserver = null\n}\n\nexport function applyWp(): void {\n const url = rWp()\n // Wallpaper element (only when image exists)\n if (!url) { wpEl?.remove(); wpEl = null } else {\n if (!wpEl || !document.body.contains(wpEl)) {\n wpEl = document.createElement('div')\n wpEl.style.cssText = 'position:fixed;inset:0;z-index:-1;pointer-events:none;background-repeat:no-repeat;'\n document.body.prepend(wpEl)\n }\n const bg = rBgState()\n wpEl.style.backgroundImage = `url(\"${url}\")`\n if (bg.iw > 0) {\n // Saved placement: contain-fit at zoom with the image CENTER pinned to\n // the committed fractional viewport point (x, y are center fractions,\n // 0.5 = viewport center — the editor commits the same anchor), so the\n // framed region survives viewport changes: window moves between screens,\n // aspect-ratio changes, and panel splitters re-derive a consistent view.\n const fit = Math.min(window.innerWidth / bg.iw, window.innerHeight / bg.ih)\n const w = bg.iw * fit * bg.zoom\n const h = bg.ih * fit * bg.zoom\n wpEl.style.backgroundSize = `${w}px ${h}px`\n wpEl.style.backgroundPosition = `${bg.x * window.innerWidth - w / 2}px ${bg.y * window.innerHeight - h / 2}px`\n } else {\n // Fresh image: match the editor's initial centered contain view.\n wpEl.style.backgroundSize = 'contain'\n wpEl.style.backgroundPosition = 'center'\n }\n const blur = rBl()\n wpEl.style.filter = blur > 0 ? `blur(${blur}px)` : 'none'\n wpEl.style.opacity = String(rWop())\n }\n // Theme color + per-part opacities: write the full token set inline\n // (self-contained), then the settings panel surface + per-part blur.\n applyCustomTokens(rOps())\n applySettingsOverrides(rSop())\n applyPartBlurs(rBlurs())\n}\n\nexport function teardownWp(): void {\n wpEl?.remove(); wpEl = null\n clearCustomTokens()\n document.documentElement.style.removeProperty('--dsh-any-bg-settings-surface')\n document.documentElement.style.removeProperty('--dsh-any-blur-settings')\n setBlur(frameEl, 0); setBlur(sidebarEl, 0); setBlur(centerEl, 0); setBlur(detailsEl, 0)\n stopWatchingParts()\n}\n\n/** Live wallpaper-opacity updates during slider drag (no full re-apply). */\nexport function setWpOpacity(v: number): void {\n if (wpEl) wpEl.style.opacity = String(v)\n}\n\n/** Live wallpaper-blur updates during slider drag (no full re-apply). */\nexport function setWpBlur(v: number): void {\n if (wpEl) wpEl.style.filter = v > 0 ? `blur(${v}px)` : 'none'\n}\n","export const ST = {\n root: { display: 'flex', flexDirection: 'column' as const, gap: '20px', padding: '4px 0', maxWidth: '640px' },\n headerRow: { display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: '12px', flexWrap: 'wrap' as const },\n h2: { color: 'var(--dsw-alias-label-primary)', fontSize: '18px', fontWeight: 600, margin: 0 },\n sub: { color: 'var(--dsw-alias-label-tertiary)', fontSize: '13px' },\n hr: { height: '1px', background: 'var(--dsw-alias-border-l2)', border: 'none', margin: '4px 0' },\n label: { color: 'var(--dsw-alias-label-primary)', fontSize: '16px', fontWeight: 600, marginBottom: '8px' },\n hint: { color: 'var(--dsw-alias-label-tertiary)', fontSize: '12px', lineHeight: '18px', marginTop: '4px' },\n colorHint: { color: 'var(--dsw-alias-label-tertiary)', fontSize: '12px', lineHeight: '18px', marginTop: '7px', textAlign: 'center' as const },\n wheelCanvas: { cursor: 'crosshair', borderRadius: '50%' },\n center: { display: 'flex', justifyContent: 'center' },\n // Wheel on the left, precise HSL/RGB entry on the right.\n wheelRow: { display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '24px', flexWrap: 'wrap' as const },\n inputPanel: { display: 'flex', flexDirection: 'column' as const, gap: '10px', minWidth: '168px' },\n inputTabs: { display: 'flex', gap: '6px' },\n inputTab: { height: '26px', padding: '0 12px', borderRadius: '6px', border: '1px solid var(--dsw-alias-border-l2)', background: 'var(--dsw-alias-button-elevated-fill)', color: 'var(--dsw-alias-label-tertiary)', cursor: 'pointer', fontSize: '12px', font: 'inherit' },\n inputTabActive: { background: 'var(--dsw-alias-brand-primary)', color: 'var(--dsw-alias-brand-text)', borderColor: 'transparent' },\n inputGrid: { display: 'flex', flexDirection: 'column' as const, gap: '6px' },\n inputField: { display: 'flex', alignItems: 'center', gap: '8px' },\n inputLabel: { color: 'var(--dsw-alias-label-secondary)', fontSize: '12px', width: '14px', textAlign: 'center' as const },\n input: { flex: 1, height: '28px', padding: '0 8px', borderRadius: '6px', border: '1px solid var(--dsw-alias-border-l2)', background: 'var(--dsw-alias-button-elevated-fill)', color: 'var(--dsw-alias-label-primary)', fontSize: '12px', font: 'inherit', boxSizing: 'border-box' as const, minWidth: '0' },\n swatch: { height: '22px', borderRadius: '6px', border: '1px solid var(--dsw-alias-border-l2)' },\n // Error boundary fallback\n crashBox: { display: 'flex', flexDirection: 'column' as const, gap: '10px', alignItems: 'center', padding: '24px 16px', border: '1px solid var(--dsw-alias-border-l2)', borderRadius: '10px' },\n crashTitle: { color: 'var(--dsw-alias-label-primary)', fontSize: '15px', fontWeight: 600 },\n crashDesc: { color: 'var(--dsw-alias-label-tertiary)', fontSize: '12px', textAlign: 'center' as const },\n btnGroup: { display: 'flex', justifyContent: 'center', marginTop: '10px' },\n row: { display: 'flex', alignItems: 'center', gap: '10px', flexWrap: 'wrap' as const },\n sliderBlock: { display: 'flex', flexDirection: 'column' as const, gap: '4px' },\n sliderRow: { display: 'flex', alignItems: 'center', gap: '10px' },\n sliderLabel: { color: 'var(--dsw-alias-label-secondary)', fontSize: '13px' },\n slider: { flex: 1, accentColor: 'var(--dsw-alias-brand-primary)', minWidth: '160px' },\n sliderVal: { color: 'var(--dsw-alias-label-secondary)', fontSize: '12px', whiteSpace: 'nowrap' as const, width: '44px', textAlign: 'right' as const },\n btn: { height: '32px', padding: '0 14px', borderRadius: '8px', border: '1px solid var(--dsw-alias-border-l2)', background: 'var(--dsw-alias-button-elevated-fill)', color: 'var(--dsw-alias-label-primary)', cursor: 'pointer', fontSize: '13px', font: 'inherit', boxSizing: 'border-box' as const },\n btnDanger: { color: 'var(--dsw-alias-state-error-primary)' },\n btnPrimary: { background: 'var(--dsw-alias-brand-primary)', color: 'var(--dsw-alias-brand-text)', border: 'none' },\n preview: { width: '368px', height: '225px', objectFit: 'cover' as const, borderRadius: '6px', border: '1px solid var(--dsw-alias-border-l2)', cursor: 'pointer' },\n sliders: { display: 'flex', flexDirection: 'column' as const, gap: '12px', marginTop: '8px' },\n // Modal\n overlay: { position: 'fixed' as const, inset: 0, zIndex: 9999, background: 'rgba(0,0,0,0.7)', display: 'flex', flexDirection: 'column' as const, alignItems: 'center', justifyContent: 'center', gap: '12px' },\n modalTitle: { color: '#fff', fontSize: '16px', fontWeight: 500 },\n modalHint: { color: 'rgba(255,255,255,0.6)', fontSize: '12px' },\n previewRect: { position: 'relative' as const, overflow: 'hidden', border: '2px solid rgba(255,255,255,0.3)', borderRadius: '8px', background: '#000', cursor: 'grab' },\n previewImg: { position: 'absolute' as const, transformOrigin: '0 0', pointerEvents: 'none' as const },\n modalBtns: { display: 'flex', gap: '10px' },\n // Eyedropper modal\n pickerBox: { maxWidth: 'min(90vw, 720px)', maxHeight: '60vh', overflow: 'hidden', borderRadius: '8px', border: '2px solid rgba(255,255,255,0.3)', background: '#000', cursor: 'crosshair' },\n pickerCanvas: { display: 'block', maxWidth: '100%', maxHeight: '60vh', objectFit: 'contain' as const },\n pickerBar: { display: 'flex', alignItems: 'center', gap: '10px', minWidth: '260px' },\n pickerSwatch: { width: '28px', height: '28px', borderRadius: '6px', border: '1px solid rgba(255,255,255,0.4)', flexShrink: 0 },\n pickerValue: { color: '#fff', fontSize: '13px', fontFamily: 'monospace' },\n magnifier: { position: 'fixed' as const, width: '96px', height: '96px', borderRadius: '50%', border: '2px solid rgba(255,255,255,0.7)', boxShadow: '0 4px 16px rgba(0,0,0,0.5)', zIndex: 10000, background: '#000', pointerEvents: 'none' as const, transition: 'opacity 0.08s' },\n}\n","/**\n * Read a chosen image file as a data URL WITHOUT re-encoding: the original\n * pixels are kept as-is (no canvas downscale / JPEG re-compression), so the\n * wallpaper is stored and displayed at full fidelity. The tradeoff is a larger\n * payload over the RPC channel and on disk for big images.\n */\nexport function readImg(file: File, cb: (url: string | null) => void): void {\n const r = new FileReader()\n r.onerror = () => cb(null)\n r.onload = () => cb(r.result as string)\n r.readAsDataURL(file)\n}\n","import { useRef, useState, useEffect, useCallback } from 'react'\nimport { ST } from '../styles'\n\nconst WHEEL_SIZE = 220\nconst CX = WHEEL_SIZE / 2\nconst RING_OUTER = 106\nconst RING_INNER = 82\n// Square inscribed in the ring's inner circle: half-side = RING_INNER / √2,\n// so the four corners sit exactly on the inner edge of the hue ring.\nconst SQ_HALF = Math.round(RING_INNER / Math.SQRT2)\n\nfunction drawWheel(cvs: HTMLCanvasElement, hue: number, sat: number, lit: number): void {\n // Wheel coordinates are HSV (the S-V plane); props arrive in HSV from the\n // section. The HSL conversion happens at the setColor boundary.\n const c = cvs.getContext('2d')!\n c.clearRect(0, 0, WHEEL_SIZE, WHEEL_SIZE)\n // Hue ring\n for (let a = 0; a < 360; a++) {\n const r1 = (a - 90) * Math.PI / 180\n const r2 = (a + 1.5 - 90) * Math.PI / 180\n c.beginPath(); c.arc(CX, CX, RING_OUTER, r1, r2); c.arc(CX, CX, RING_INNER, r2, r1, true); c.closePath()\n c.fillStyle = `hsl(${a},100%,50%)`; c.fill()\n }\n // SL square inside ring (HSV S-V plane)\n const gx = CX - SQ_HALF, gy = CX - SQ_HALF, sz = SQ_HALF * 2\n c.fillStyle = '#fff'; c.fillRect(gx, gy, sz, sz)\n const gh = c.createLinearGradient(gx, 0, gx + sz, 0)\n gh.addColorStop(0, 'rgba(255,255,255,1)'); gh.addColorStop(1, `hsl(${hue},100%,50%)`)\n c.fillStyle = gh; c.fillRect(gx, gy, sz, sz)\n const gv = c.createLinearGradient(0, gy, 0, gy + sz)\n gv.addColorStop(0, 'rgba(0,0,0,0)'); gv.addColorStop(1, 'rgba(0,0,0,1)')\n c.fillStyle = gv; c.fillRect(gx, gy, sz, sz)\n // Hue marker on ring\n const hRad = (hue - 90) * Math.PI / 180\n const hR = (RING_OUTER + RING_INNER) / 2\n const hmx = CX + Math.cos(hRad) * hR, hmy = CX + Math.sin(hRad) * hR\n c.beginPath(); c.arc(hmx, hmy, 8, 0, Math.PI * 2)\n c.fillStyle = 'rgba(0,0,0,0.25)'; c.fill()\n c.beginPath(); c.arc(hmx, hmy, 6.5, 0, Math.PI * 2)\n c.strokeStyle = '#fff'; c.lineWidth = 2; c.stroke()\n // SL marker (HSV coordinates)\n const smx = gx + sat * sz, smy = gy + (1 - lit) * sz\n c.beginPath(); c.arc(smx, smy, 7, 0, Math.PI * 2)\n c.fillStyle = 'rgba(0,0,0,0.25)'; c.fill()\n c.beginPath(); c.arc(smx, smy, 5.5, 0, Math.PI * 2)\n c.strokeStyle = '#fff'; c.lineWidth = 2; c.stroke()\n c.beginPath(); c.arc(smx, smy, 3.5, 0, Math.PI * 2)\n c.strokeStyle = '#000'; c.lineWidth = 1; c.stroke()\n}\n\nfunction hitTest(x: number, y: number): 'ring' | 'square' | null {\n if (Math.abs(x - CX) <= SQ_HALF && Math.abs(y - CX) <= SQ_HALF) return 'square'\n const dx = x - CX, dy = y - CX\n const dist = Math.sqrt(dx * dx + dy * dy)\n if (dist >= RING_INNER - 4 && dist <= RING_OUTER + 4) return 'ring'\n return null\n}\n\nfunction pickHue(x: number, y: number): number {\n let angle = Math.atan2(y - CX, x - CX) * 180 / Math.PI + 90\n if (angle < 0) angle += 360\n return angle\n}\n\nfunction pickSL(x: number, y: number): [number, number] {\n const gx = CX - SQ_HALF, gy = CX - SQ_HALF, sz = SQ_HALF * 2\n return [\n Math.max(0, Math.min(1, (x - gx) / sz)),\n Math.max(0.02, Math.min(0.98, 1 - (y - gy) / sz)),\n ]\n}\n\nexport function ColorWheel({ hue, sat, lit, onChange }: {\n hue: number; sat: number; lit: number\n onChange: (h: number, s: number, l: number) => void\n}) {\n const cvsRef = useRef<HTMLCanvasElement>(null)\n // Internal HSV state: the slots host caches injected section props once, so\n // the canvas must redraw from interaction state instead of from props.\n const [col, setCol] = useState({ hue, sat, lit })\n const colRef = useRef(col)\n colRef.current = col\n\n // Adopt external changes (e.g. section remount after theme restore).\n useEffect(() => {\n setCol(c => (c.hue === hue && c.sat === sat && c.lit === lit ? c : { hue, sat, lit }))\n }, [hue, sat, lit])\n\n useEffect(() => { if (cvsRef.current) drawWheel(cvsRef.current, col.hue, col.sat, col.lit) }, [col])\n\n const apply = useCallback((nh: number, ns: number, nl: number) => {\n setCol({ hue: nh, sat: ns, lit: nl })\n onChange(nh, ns, nl)\n }, [onChange])\n\n const onDown = useCallback((e: React.MouseEvent<HTMLCanvasElement>) => {\n const r = cvsRef.current!.getBoundingClientRect()\n const x = e.clientX - r.left, y = e.clientY - r.top\n const region = hitTest(x, y)\n if (!region) return\n if (region === 'ring') {\n apply(pickHue(x, y), colRef.current.sat, colRef.current.lit)\n } else {\n const [s, l] = pickSL(x, y)\n apply(colRef.current.hue, s, l)\n }\n const onMove = (ev: MouseEvent) => {\n const rr = cvsRef.current!.getBoundingClientRect()\n const mx = ev.clientX - rr.left, my = ev.clientY - rr.top\n if (region === 'ring') {\n const d = Math.sqrt((mx - CX) ** 2 + (my - CX) ** 2)\n if (d >= RING_INNER - 10 && d <= RING_OUTER + 10) apply(pickHue(mx, my), colRef.current.sat, colRef.current.lit)\n } else {\n const [s, l] = pickSL(mx, my)\n apply(colRef.current.hue, s, l)\n }\n }\n const onUp = () => { document.removeEventListener('mousemove', onMove); document.removeEventListener('mouseup', onUp) }\n document.addEventListener('mousemove', onMove); document.addEventListener('mouseup', onUp)\n }, [apply])\n\n return <canvas ref={cvsRef} width={WHEEL_SIZE} height={WHEEL_SIZE} style={ST.wheelCanvas} onMouseDown={onDown} />\n}\n","import { useState, useEffect, useRef } from 'react'\nimport { ST } from '../styles'\nimport { hsvToHsl, hslToRgb, rgbToHsl, hslToHsv } from '../utils/color'\n\ntype Mode = 'hsl' | 'rgb'\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, v))\n}\n\n/**\n * A single numeric field that edits one color channel. Keeps its own text\n * while focused so typing never gets clobbered by the parent re-rendering the\n * canonical value; commits every valid keystroke live and re-normalizes on\n * blur. The value prop only pushes back in when the field is not focused\n * (wheel drags, wallpaper extraction, mode switches).\n */\nfunction NumField({ label, value, min, max, step, onChange }: {\n label: string; value: number; min: number; max: number; step: number\n onChange: (v: number) => void\n}) {\n const [text, setText] = useState(String(value))\n const focused = useRef(false)\n\n useEffect(() => {\n if (!focused.current) setText(String(value))\n }, [value])\n\n return (\n <label style={ST.inputField}>\n <span style={ST.inputLabel}>{label}</span>\n <input\n type=\"number\"\n min={min} max={max} step={step}\n value={text}\n style={ST.input}\n onFocus={() => { focused.current = true }}\n onBlur={() => { focused.current = false; setText(String(value)) }}\n onChange={e => {\n setText(e.target.value)\n const v = Number(e.target.value)\n if (Number.isFinite(v)) onChange(clamp(v, min, max))\n }}\n />\n </label>\n )\n}\n\n/**\n * Precise color entry next to the wheel: a HSL/RGB mode toggle plus three\n * numeric channel fields and a live swatch. The wheel is HSV end-to-end, so\n * this panel converts at the boundary — HSL fields map straight onto the\n * stored HSL, RGB fields round-trip through rgbToHsl — and both emit HSV via\n * the same onChange the wheel uses, keeping one canonical color.\n */\nexport function ColorInputs({ hue, sat, lit, onChange }: {\n hue: number; sat: number; lit: number\n onChange: (h: number, s: number, l: number) => void\n}) {\n const [mode, setMode] = useState<Mode>('hsl')\n const [h, s, l] = hsvToHsl(hue, sat, lit)\n const [r, g, b] = hslToRgb(h, s, l)\n\n const setHsl = (nh: number, ns: number, nl: number) => onChange(...hslToHsv(nh, ns, nl))\n const setRgb = (nr: number, ng: number, nb: number) => {\n const [nh, ns, nl] = rgbToHsl(nr, ng, nb)\n onChange(...hslToHsv(nh, ns, nl))\n }\n\n return (\n <div style={ST.inputPanel}>\n <div style={ST.inputTabs}>\n <button type=\"button\" style={{ ...ST.inputTab, ...(mode === 'hsl' ? ST.inputTabActive : {}) }} onClick={() => setMode('hsl')}>HSL</button>\n <button type=\"button\" style={{ ...ST.inputTab, ...(mode === 'rgb' ? ST.inputTabActive : {}) }} onClick={() => setMode('rgb')}>RGB</button>\n </div>\n <div style={ST.inputGrid}>\n {mode === 'hsl' ? (\n <>\n <NumField label=\"H\" value={Math.round(h)} min={0} max={360} step={1} onChange={v => setHsl(v, s, l)} />\n <NumField label=\"S\" value={Math.round(s * 100)} min={0} max={100} step={1} onChange={v => setHsl(h, v / 100, l)} />\n <NumField label=\"L\" value={Math.round(l * 100)} min={0} max={100} step={1} onChange={v => setHsl(h, s, v / 100)} />\n </>\n ) : (\n <>\n <NumField label=\"R\" value={r} min={0} max={255} step={1} onChange={v => setRgb(v, g, b)} />\n <NumField label=\"G\" value={g} min={0} max={255} step={1} onChange={v => setRgb(r, v, b)} />\n <NumField label=\"B\" value={b} min={0} max={255} step={1} onChange={v => setRgb(r, g, v)} />\n </>\n )}\n </div>\n <div style={{ ...ST.swatch, background: `hsl(${Math.round(h)} ${Math.round(s * 100)}% ${Math.round(l * 100)}%)` }} />\n </div>\n )\n}\n","import { useRef, useState, useEffect, useCallback } from 'react'\nimport { ST } from '../styles'\nimport { rgbToHsl, hslToHsv } from '../utils/color'\n\nconst MAG_SIZE = 96\nconst MAG_ZOOM = 8\n\nfunction toHex(rgb: [number, number, number]): string {\n return '#' + rgb.map(v => v.toString(16).padStart(2, '0')).join('')\n}\n\n/**\n * Eyedropper modal: shows the wallpaper full-bleed (no drag/zoom) and lets the\n * user click any pixel to adopt it as the theme color. A magnifier circle\n * follows the cursor so small details can be picked precisely. The wallpaper\n * is a data URL, so sampling is CORS-free: draw it once to an offscreen-sized\n * canvas and read pixels via getImageData.\n */\nexport function ColorPicker({ url, t, onPick, onClose }: {\n url: string\n t: (key: string) => string\n onPick: (hsv: [number, number, number]) => void\n onClose: () => void\n}) {\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const magRef = useRef<HTMLCanvasElement>(null)\n const imgRef = useRef<HTMLImageElement | null>(null)\n const [ready, setReady] = useState(false)\n const [hover, setHover] = useState<{ rgb: [number, number, number] } | null>(null)\n const [mag, setMag] = useState<{ x: number; y: number } | null>(null)\n\n useEffect(() => {\n const img = new Image()\n img.onload = () => { imgRef.current = img; setReady(true) }\n img.src = url\n }, [url])\n\n useEffect(() => {\n if (!ready || !canvasRef.current || !imgRef.current) return\n const canvas = canvasRef.current\n canvas.width = imgRef.current.naturalWidth\n canvas.height = imgRef.current.naturalHeight\n const ctx = canvas.getContext('2d')\n if (ctx) ctx.drawImage(imgRef.current, 0, 0)\n }, [ready])\n\n const sampleAt = useCallback((clientX: number, clientY: number) => {\n const canvas = canvasRef.current\n if (!canvas) return null\n const rect = canvas.getBoundingClientRect()\n if (rect.width === 0 || rect.height === 0) return null\n const ctx = canvas.getContext('2d')\n if (!ctx) return null\n const sx = Math.round((clientX - rect.left) * (canvas.width / rect.width))\n const sy = Math.round((clientY - rect.top) * (canvas.height / rect.height))\n if (sx < 0 || sy < 0 || sx >= canvas.width || sy >= canvas.height) return null\n const d = ctx.getImageData(sx, sy, 1, 1).data\n return { sx, sy, rgb: [d[0], d[1], d[2]] as [number, number, number] }\n }, [])\n\n const drawMagnifier = useCallback((sx: number, sy: number) => {\n const mag = magRef.current\n const src = canvasRef.current\n if (!mag || !src) return\n const ctx = mag.getContext('2d')\n if (!ctx) return\n const half = MAG_SIZE / MAG_ZOOM / 2\n ctx.clearRect(0, 0, MAG_SIZE, MAG_SIZE)\n ctx.drawImage(src, sx - half, sy - half, half * 2, half * 2, 0, 0, MAG_SIZE, MAG_SIZE)\n ctx.strokeStyle = 'rgba(255,255,255,0.85)'\n ctx.lineWidth = 1\n ctx.beginPath()\n ctx.moveTo(MAG_SIZE / 2, 0); ctx.lineTo(MAG_SIZE / 2, MAG_SIZE)\n ctx.moveTo(0, MAG_SIZE / 2); ctx.lineTo(MAG_SIZE, MAG_SIZE / 2)\n ctx.stroke()\n }, [])\n\n const onMove = (e: React.MouseEvent) => {\n const s = sampleAt(e.clientX, e.clientY)\n if (!s) { setHover(null); setMag(null); return }\n setHover({ rgb: s.rgb })\n drawMagnifier(s.sx, s.sy)\n const off = 28\n let x = e.clientX + off\n let y = e.clientY + off\n if (x + MAG_SIZE > window.innerWidth) x = e.clientX - off - MAG_SIZE\n if (y + MAG_SIZE > window.innerHeight) y = e.clientY - off - MAG_SIZE\n setMag({ x, y })\n }\n\n const onClick = (e: React.MouseEvent) => {\n const s = sampleAt(e.clientX, e.clientY)\n if (!s) return\n const [h, sl, l] = rgbToHsl(s.rgb[0], s.rgb[1], s.rgb[2])\n onPick(hslToHsv(h, sl, l))\n }\n\n return (\n <div style={ST.overlay}>\n <div style={ST.modalTitle}>{t('pickerTitle')}</div>\n <div style={ST.modalHint}>{t('pickerHint')}</div>\n <div style={ST.pickerBox}>\n <canvas ref={canvasRef} style={ST.pickerCanvas}\n onMouseMove={onMove}\n onMouseLeave={() => { setHover(null); setMag(null) }}\n onClick={onClick} />\n </div>\n <div style={ST.pickerBar}>\n <div style={{ ...ST.pickerSwatch, background: hover ? toHex(hover.rgb) : 'transparent' }} />\n <div style={ST.pickerValue}>{hover ? `${toHex(hover.rgb)} · rgb(${hover.rgb.join(', ')})` : '—'}</div>\n </div>\n <div style={ST.modalBtns}>\n <button type=\"button\" style={ST.btn} onClick={onClose}>{t('pickerClose')}</button>\n </div>\n <canvas ref={magRef} width={MAG_SIZE} height={MAG_SIZE}\n style={{ ...ST.magnifier, left: mag?.x ?? 0, top: mag?.y ?? 0, opacity: mag ? 1 : 0 }} />\n </div>\n )\n}\n","import { useRef, useState, useEffect, useCallback } from 'react'\nimport { ST } from '../styles'\nimport { rBgState } from '../state'\n\nexport function BgEditor({ url, t, onClose, onCommit }: {\n url: string; 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 = rBgState()\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 = rBgState()\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, 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 const factor = e.deltaY > 0 ? 0.92 : 1.08\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 <div style={ST.overlay} onClick={e => { if (e.target === e.currentTarget) onClose() }}>\n <div style={ST.modalTitle}>{t('editorTitle')}</div>\n <div ref={containerRef} style={{ ...ST.previewRect, width: pw, height: ph }} onMouseDown={onDown}>\n <img ref={imgRef} src={url} alt=\"\" draggable={false} style={{\n ...ST.previewImg, width: imgSize.w, height: imgSize.h,\n transform: `translate(${pos.x}px,${pos.y}px) scale(${zoom})`,\n }} />\n </div>\n <div style={ST.modalHint}>{t('editorHint')}</div>\n <div style={ST.modalBtns}>\n <button style={ST.btn} onClick={resetView}>{t('editorReset')}</button>\n <button style={ST.btn} onClick={onClose}>{t('editorCancel')}</button>\n <button style={{ ...ST.btn, ...ST.btnPrimary }} 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 )\n}\n","import { useRef } from 'react'\nimport { ST } from '../styles'\n\nexport function LiveSlider({ min, max, step, def, fmt, label, onInput, onChange }: {\n min: number; max: number; step: number; def: number\n fmt: (v: number) => string; label?: string; onInput: (v: number) => void; onChange: (v: number) => void\n}) {\n const valRef = useRef<HTMLSpanElement>(null)\n return (\n <div style={ST.sliderRow}>\n {label ? <span style={ST.sliderLabel}>{label}</span> : null}\n <input type=\"range\" min={min} max={max} step={step} defaultValue={def} style={ST.slider}\n onInput={e => { const v = Number((e.target as HTMLInputElement).value); onInput(v); if (valRef.current) valRef.current.textContent = fmt(v) }}\n onChange={e => onChange(Number((e.target as HTMLInputElement).value))} />\n <span ref={valRef} style={ST.sliderVal}>{fmt(def)}</span>\n </div>\n )\n}\n","import { Component, type ReactNode } from 'react'\nimport { ST } from '../styles'\n\ninterface Props {\n t: (key: string) => string\n onReset?: () => void\n children: ReactNode\n}\n\ninterface State {\n error: Error | null\n}\n\n/**\n * Catches render errors from the theme section subtree (wheel, sliders, editor)\n * so a single bad state can never take down the whole settings panel. Shows a\n * compact fallback with a reset button; the reset re-renders the section with\n * the current saved config, which is enough to recover from most transient\n * failures (corrupt transient UI state, stale image decode, etc.).\n */\nexport class ErrorBoundary extends Component<Props, State> {\n override state: State = { error: null }\n\n static getDerivedStateFromError(error: Error): State {\n return { error }\n }\n\n override componentDidCatch(error: Error, info: { componentStack?: string | null }): void {\n console.error('dsh-any-background: section render crashed', error, info.componentStack)\n }\n\n private reset = (): void => {\n this.setState({ error: null })\n this.props.onReset?.()\n }\n\n override render() {\n if (this.state.error) {\n return (\n <div style={ST.crashBox}>\n <div style={ST.crashTitle}>{this.props.t('crashTitle')}</div>\n <div style={ST.crashDesc}>{this.props.t('crashDesc')}</div>\n <button type=\"button\" style={ST.btn} onClick={this.reset}>{this.props.t('crashReset')}</button>\n </div>\n )\n }\n return this.props.children\n }\n}\n","import { useRef, useState, useEffect } from 'react'\nimport { ST } from '../styles'\nimport { cfg, rOps, rSop, rWop, rBl, rBlurs } from '../state'\nimport { saveConfig } from '../rpc'\nimport { applyWp, applyCustomTokens, applySettingsOverrides, setWpOpacity, setWpBlur, setPartBlur } from '../wallpaper'\nimport { readImg } from '../utils/image'\nimport type { ThemeSectionProps, PartOpacities, PartBlurs } from '../types'\nimport { ColorWheel } from './ColorWheel'\nimport { ColorInputs } from './ColorInputs'\nimport { ColorPicker } from './ColorPicker'\nimport { BgEditor } from './BgEditor'\nimport { LiveSlider } from './LiveSlider'\nimport { ErrorBoundary } from './ErrorBoundary'\n\nexport function ThemeSection(props: ThemeSectionProps) {\n const { t, hue, sat, lit, setColor, setWp, setOps, setBlurs, setWop, setBl, setSop, useStore, extractColor, exportTheme, importTheme } = props\n const storeUrl = useStore(s => s.url)\n // Programmatic color changes (wallpaper extraction, async boot restore)\n // arrive through the store; the wheel adopts them via its props effect.\n const storeColor = useStore(s => s.color)\n const fileRef = useRef<HTMLInputElement>(null)\n const importRef = useRef<HTMLInputElement>(null)\n const [editorOpen, setEditorOpen] = useState(false)\n const [pickerOpen, setPickerOpen] = useState(false)\n const [extracting, setExtracting] = useState(false)\n const [extractMsg, setExtractMsg] = useState<string | null>(null)\n const [importMsg, setImportMsg] = useState<string | null>(null)\n const msgTimer = useRef<number | undefined>(undefined)\n useEffect(() => () => window.clearTimeout(msgTimer.current), [])\n const showMsg = (setter: (v: string | null) => void, key: string) => {\n setter(t(key))\n window.clearTimeout(msgTimer.current)\n msgTimer.current = window.setTimeout(() => setter(null), 2500)\n }\n const onExtract = async () => {\n if (!storeUrl || extracting) return\n setExtracting(true)\n try {\n showMsg(setExtractMsg, await extractColor() ? 'extractDone' : 'extractFail')\n } catch {\n showMsg(setExtractMsg, 'extractFail')\n } finally {\n setExtracting(false)\n }\n }\n const onImport = async (file: File) => {\n try {\n showMsg(setImportMsg, await importTheme(file) ? 'importDone' : 'importFail')\n } catch {\n showMsg(setImportMsg, 'importFail')\n }\n }\n const wheel = (storeColor ?? [hue, sat, lit]) as [number, number, number]\n // One blur slider per interface part; each edits its own blur live and\n // commits the full per-part set on release.\n const blurSlider = (part: keyof PartBlurs) => (\n <LiveSlider label={t('uiBlur')} min={0} max={60} step={1} def={rBlurs()[part]}\n fmt={v => `${v}px`}\n onInput={v => {\n const blurs = { ...rBlurs() }\n blurs[part] = v\n cfg.blurs = blurs\n setPartBlur(part, v)\n saveConfig()\n }}\n onChange={v => {\n const blurs = { ...rBlurs() }\n blurs[part] = v\n setBlurs(blurs)\n }} />\n )\n // One slider per main-interface part; each edits its own opacity live and\n // commits the full per-part set on release.\n const partSlider = (labelKey: string, part: keyof PartOpacities) => (\n <div style={ST.sliderBlock}>\n <div style={ST.sliderLabel}>{t(labelKey)}</div>\n <LiveSlider label={t('uiOpacity')} min={0} max={100} step={1} def={Math.round(rOps()[part] * 100)}\n fmt={v => `${v}%`}\n onInput={v => {\n const ops = { ...rOps() }\n ops[part] = v / 100\n cfg.opacities = ops\n applyCustomTokens(ops)\n saveConfig()\n }}\n onChange={v => {\n const ops = { ...rOps() }\n ops[part] = v / 100\n setOps(ops)\n }} />\n {blurSlider(part)}\n </div>\n )\n\n return (\n <ErrorBoundary t={t}>\n <div style={ST.root}>\n <div style={ST.headerRow}>\n <div><h2 style={ST.h2}>{t('nav')}</h2><div style={ST.sub}>{t('subtitle')}</div></div>\n <div style={ST.row}>\n <button type=\"button\" style={ST.btn} onClick={exportTheme}>{t('exportTheme')}</button>\n <button type=\"button\" style={ST.btn} onClick={() => importRef.current?.click()}>{t('importTheme')}</button>\n <input ref={importRef} type=\"file\" accept=\"application/json,.json\" style={{ display: 'none' }} onChange={e => {\n const f = e.target.files?.[0]; if (!f) return\n void onImport(f); e.target.value = ''\n }} />\n </div>\n </div>\n {importMsg ? <div style={ST.colorHint}>{importMsg}</div> : null}\n\n {/* Theme color: wheel on the left, precise HSL/RGB entry on the right */}\n <div>\n <div style={ST.label}>{t('colorTitle')}</div>\n <div style={ST.wheelRow}>\n <ColorWheel hue={wheel[0]} sat={wheel[1]} lit={wheel[2]} onChange={setColor} />\n <ColorInputs hue={wheel[0]} sat={wheel[1]} lit={wheel[2]} onChange={setColor} />\n </div>\n <div style={ST.colorHint}>{t('colorHint')}</div>\n <div style={ST.btnGroup}>\n <button type=\"button\"\n style={{ ...ST.btn, opacity: !storeUrl || extracting ? 0.55 : 1 }}\n title={!storeUrl ? t('extractNoWp') : undefined}\n disabled={!storeUrl || extracting}\n onClick={onExtract}>\n {extracting ? t('extracting') : t('extractColor')}\n </button>\n <button type=\"button\"\n style={{ ...ST.btn, opacity: !storeUrl ? 0.55 : 1 }}\n title={!storeUrl ? t('extractNoWp') : undefined}\n disabled={!storeUrl}\n onClick={() => setPickerOpen(true)}>\n {t('eyedropper')}\n </button>\n </div>\n {extractMsg ? <div style={ST.colorHint}>{extractMsg}</div> : null}\n </div>\n\n <hr style={ST.hr} />\n\n {/* Interface: per-part homepage opacities + settings panel opacity */}\n <div>\n <div style={ST.label}>{t('uiTitle')}</div>\n <div style={ST.sliders}>\n {partSlider('uiOpacityBg', 'bg')}\n {partSlider('uiOpacitySide', 'sidebar')}\n {partSlider('uiOpacityCard', 'card')}\n <div style={ST.sliderBlock}>\n <div style={ST.sliderLabel}>{t('uiSop')}</div>\n <LiveSlider label={t('uiOpacity')} min={0} max={100} step={1} def={Math.round(rSop() * 100)}\n fmt={v => `${v}%`}\n onInput={v => { const op = v / 100; cfg.settingsOpacity = op; applySettingsOverrides(op); saveConfig() }}\n onChange={v => setSop(v / 100)} />\n {blurSlider('settings')}\n </div>\n </div>\n </div>\n\n <hr style={ST.hr} />\n\n {/* Background image */}\n <div>\n <div style={ST.label}>{t('bgTitle')}</div>\n <div style={ST.center}>{storeUrl ? <img src={storeUrl} alt=\"\" style={ST.preview} onClick={() => setEditorOpen(true)} /> : null}</div>\n <div style={ST.btnGroup}>\n <div style={ST.row}>\n <button type=\"button\" style={ST.btn} onClick={() => fileRef.current?.click()}>{t('bgChoose')}</button>\n {storeUrl ? <button type=\"button\" style={ST.btn} onClick={() => setEditorOpen(true)}>{t('bgEdit')}</button> : null}\n {storeUrl ? <button type=\"button\" style={{ ...ST.btn, ...ST.btnDanger }} onClick={() => setWp(null)}>{t('bgRemove')}</button> : null}\n <input ref={fileRef} type=\"file\" accept=\"image/*\" style={{ display: 'none' }} onChange={e => {\n const f = e.target.files?.[0]; if (!f) return\n readImg(f, d => { if (d) setWp(d); e.target.value = '' })\n }} />\n </div>\n </div>\n <div style={ST.sliders}>\n <div style={ST.sliderBlock}>\n <div style={ST.sliderLabel}>{t('wpOpacity')}</div>\n <LiveSlider min={0} max={100} step={1} def={Math.round(rWop() * 100)}\n fmt={v => `${v}%`}\n onInput={v => { const op = v / 100; cfg.wallpaperOpacity = op; setWpOpacity(op); saveConfig() }}\n onChange={v => setWop(v / 100)} />\n </div>\n <div style={ST.sliderBlock}>\n <div style={ST.sliderLabel}>{t('bgBlur')}</div>\n <LiveSlider min={0} max={60} step={1} def={rBl()}\n fmt={v => `${v}px`}\n onInput={v => { cfg.blur = v; setWpBlur(v); saveConfig() }}\n onChange={v => setBl(v)} />\n </div>\n </div>\n <div style={ST.hint}>{t('bgHint')}</div>\n </div>\n\n {/* Eyedropper modal: pick a theme color straight from the wallpaper */}\n {pickerOpen && storeUrl ? (\n <ColorPicker url={storeUrl} t={t} onClose={() => setPickerOpen(false)}\n onPick={hsv => { setColor(hsv[0], hsv[1], hsv[2]); setPickerOpen(false) }} />\n ) : null}\n\n {/* Background editor modal */}\n {editorOpen && storeUrl ? (\n <BgEditor url={storeUrl} t={t} onClose={() => setEditorOpen(false)}\n onCommit={(z, x, y, iw, ih) => { cfg.bgState = { zoom: z, x, y, iw, ih }; applyWp(); saveConfig(); setEditorOpen(false) }} />\n ) : null}\n </div>\n </ErrorBoundary>\n )\n}\n","/** Sun glyph, migrated from @deepseek-ai/dsh-client-ui-primitives IconLightOutline16. */\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.5V7.35461Z\" fill=\"currentColor\"/>'\n\nexport function SunIcon({ size = 16, className }: { size?: number; className?: string }) {\n return (\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 }} />\n )\n}\n","/**\n * dsh-any-background — browser half entry.\n *\n * Appearance plugin with:\n * 1. PS-style color wheel (hue ring + saturation/lightness square) for\n * real-time theme color selection with dynamic token generation.\n * 2. Background image editor modal with drag-to-pan and scroll-to-zoom\n * inside a viewport-proportional preview rectangle.\n * 3. Opacity / blur sliders with zero-lag direct DOM manipulation: the\n * homepage background opacity (主界面) and the settings panel opacity\n * (设置界面透明度) are separate sliders.\n *\n * This file wires the plugin lifecycle (theme registration, wallpaper layer,\n * viewport watch, i18n, settings-section injection, boot restore, watchdog).\n * The heavy lifting lives in the sibling modules:\n * state.ts in-memory config mirror + getters\n * rpc.ts file-backed persistence over the /dsh-any-background channel\n * wallpaper.ts wallpaper DOM layer + inline token writes\n * utils/ color math, token generation, image compression\n * components/ ColorWheel, BgEditor, LiveSlider, ThemeSection\n * i18n.ts zh/en dictionaries\n * styles.ts shared inline styles\n */\nimport { defineStore } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { Ctx, RpcResultLike, BoundActions, ThemeSectionProps, PartOpacities, PartBlurs } from './types'\nimport { NS, zh, en } from './i18n'\nimport { cfg, rHasColor, rColor, rWp, rBgState, setWpUrl, setBgState, adoptConfig, DEFAULT_CONFIG } from './state'\nimport { RPC_CHANNEL, initRpc, saveConfig, flushSave, loadPersisted, persistWallpaper, persistConfig } from './rpc'\nimport { applyWp, teardownWp, applySettingsOverrides, SETTINGS_STYLE_RULE, watchParts } from './wallpaper'\nimport { genTokens, hslToHsv, hsvToHsl, extractWallpaperColor } from './utils/color'\nimport { ThemeSection } from './components/ThemeSection'\nimport { SUN_PATHS } from './components/icons'\n\nexport const name = 'dsh-any-background'\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-any-background` 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. Restore custom color and register as a skin. The saved color's\n // lightness decides the scheme — a dark pick gets white text, a light pick\n // black text — so both the theme color and the dark/light text follow the\n // picked color.\n const [initH, initS, initL] = rColor()\n let customDispose: (() => void) | null = null\n // registerCustom takes HSL (the storage/wheel space and genTokens space).\n const registerCustom = (h: number, s: number, l: number) => {\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 apply pass (HMR swap that could\n // not run this fiber's disposer) cannot be torn down here; keep it and\n // activate it below. Without this the duplicate-id throw would abort\n // apply and skip the wallpaper/opacity restore.\n customDispose = null\n }\n // Only activate the custom theme if it is actually registered. This keeps\n // the HMR fallback above safe and avoids a crash when registration fails\n // for any other reason.\n if (ctx.theme.getTheme().themes.some(t => t.id === CUSTOM_ID)) {\n ctx.theme.setTheme(CUSTOM_ID)\n }\n }\n // Restore saved color on boot.\n if (rHasColor()) registerCustom(initH, initS, initL)\n ctx.effect(() => () => { customDispose?.() }, 'dsh-any-background: skin dispose')\n\n // 2. Gradient CSS (for custom dark themes).\n let styleEl: HTMLStyleElement | undefined\n if (typeof document !== 'undefined') {\n styleEl = document.createElement('style')\n styleEl.dataset.plugin = 'dsh-any-background'\n // This gradient only applies while applyCustomTokens has marked the body\n // with the plugin's own dark-mode value, avoiding accidental matches against\n // the host harness's theme attribute.\n styleEl.textContent = `body[data-ds-dark-theme=\"dsh-any-background\"]::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}`\n document.head.appendChild(styleEl)\n }\n ctx.effect(() => () => { styleEl?.parentNode?.removeChild(styleEl) }, 'dsh-any-background: gradient')\n\n // 3. State store.\n let rev = 0\n let colorRev = 0\n const store = defineStore({\n init: () => ({ url: null as string | null, rev: -1, colorRev: -1, color: null as [number, number, number] | null }),\n actions: {\n syncBg: (d: any, url: string | null, r: number) => { if (r <= d.rev) return; d.url = url; d.rev = r },\n syncColor: (d: any, hsv: [number, number, number], r: number) => { if (r <= d.colorRev) return; d.color = hsv; d.colorRev = r },\n },\n })\n let bound: BoundActions | null = null\n const syncBg = () => { rev++; bound?.syncBg(rWp(), rev) }\n\n // 4. Wallpaper.\n applyWp(); syncBg()\n // The AppFrame mounts after this apply; watch for it so persisted per-part\n // blurs land as soon as the shell renders.\n watchParts()\n // Load the file-backed theme from the node half and re-apply once it lands\n // (the node store may be absent or unreachable at this instant; defaults are\n // already applied above, and the deferred restore below re-asserts too).\n void loadPersisted().then(() => {\n // The file-backed store may land after the section mounted with defaults:\n // re-register the skin with the restored color and push it to the wheel\n // through the store so UI and theme never diverge.\n if (rHasColor()) {\n const [h, s, l] = rColor()\n registerCustom(h, s, l)\n }\n applyWp(); syncBg()\n if (rHasColor()) { colorRev++; bound?.syncColor(hslToHsv(...rColor()), colorRev) }\n })\n ctx.effect(() => () => { teardownWp() }, 'dsh-any-background: wp cleanup')\n ctx.effect(() => ctx.on('theme/change', () => {\n // The theme service persists only built-in preferences; the custom theme's\n // preference lives in memory, so a host-scope adoption can silently reset\n // it. While a color is saved, re-assert the custom theme so it stays\n // active. Guard on registry presence — registerCustom disposes the old\n // skin before re-registering, and during that transient the registry lacks\n // CUSTOM_ID, so asserting there would throw.\n if (rHasColor()) {\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-any-background: theme change')\n // The wallpaper's inline size/position are absolute pixels computed for the\n // viewport at apply time, so a stale viewport leaves them misplaced.\n // Watch the viewport itself: a fixed inset:0 sentinel's box always equals\n // the viewport, so a ResizeObserver on it fires for ANY viewport change\n // (window resize, moving between monitors, panel splitters, zoom) where\n // window.resize can be missed; a resolution media query catches DPI-only\n // moves between differently scaled screens. All re-applies are coalesced to\n // one per animation frame. Re-running applyWp recomputes the contain-fit\n // scale and the fractional offsets for the new viewport (the editor's model).\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-any-background: viewport watch')\n\n // 5. Locale.\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'dsh-any-background: i18n')\n\n // 6. Section injection.\n const sectionInject = (actions: BoundActions): Omit<ThemeSectionProps, 'useStore'> => {\n bound = actions; syncBg()\n const [wh, ws, wl] = rColor()\n const [dh, ds, dv] = hslToHsv(wh, ws, wl)\n return {\n t: ctx.locale.bind(NS),\n hue: dh, sat: ds, lit: dv,\n setColor: (nh: number, ns: number, nl: number) => {\n const [sh, ss, sl] = hsvToHsl(nh, ns, nl)\n cfg.color = [sh, ss, sl]\n registerCustom(sh, ss, sl)\n applyWp()\n saveConfig()\n // Keep the wheel's canonical color in the store so programmatic\n // changes (wallpaper extraction) and remounts share one source.\n colorRev++\n bound?.syncColor([nh, ns, nl], colorRev)\n },\n setWp: (u: string | null) => {\n setWpUrl(u)\n setBgState({ ...DEFAULT_CONFIG.bgState })\n applyWp(); syncBg()\n persistWallpaper(u)\n },\n setOps: (ops: PartOpacities) => { cfg.opacities = ops; applyWp(); syncBg(); saveConfig() },\n setBlurs: (blurs: PartBlurs) => { cfg.blurs = blurs; applyWp(); syncBg(); saveConfig() },\n setWop: (v: number) => { cfg.wallpaperOpacity = v; applyWp(); syncBg(); saveConfig() },\n setBl: (v: number) => { cfg.blur = v; applyWp(); syncBg(); saveConfig() },\n setSop: (v: number) => { cfg.settingsOpacity = v; applySettingsOverrides(v); saveConfig() },\n // One-click: derive a theme color from the current wallpaper. Purely\n // client-side — no RPC traffic; the sample is a 64×64 canvas.\n extractColor: async (): Promise<boolean> => {\n const url = rWp()\n if (!url) return false\n const hsl = await extractWallpaperColor(url, rBgState())\n if (!hsl) return false\n cfg.color = hsl\n registerCustom(hsl[0], hsl[1], hsl[2])\n applyWp()\n saveConfig()\n const hsv = hslToHsv(hsl[0], hsl[1], hsl[2])\n colorRev++\n bound?.syncColor(hsv, colorRev)\n return true\n },\n // Download the whole theme as dsh-any-theme.json: the config plus the\n // wallpaper as its original data URL, so the file is self-contained.\n exportTheme: () => {\n const payload = {\n version: 1,\n exportedAt: new Date().toISOString(),\n config: cfg,\n wallpaper: rWp(),\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-any-theme.json'\n a.click()\n URL.revokeObjectURL(url)\n },\n // Import a theme JSON: apply the config to memory, then persist through\n // the same paths as manual edits — config → theme-config.json, wallpaper\n // base64 → wallpaper.jpg (decoded on the node half). The client keeps the\n // data URL from the file, so nothing is re-encoded on every load.\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 { config?: unknown; wallpaper?: unknown }\n if (typeof d.config !== 'object' || d.config === null) return false\n adoptConfig(d.config)\n const wallpaper = typeof d.wallpaper === 'string' && /^data:image\\//.test(d.wallpaper) ? d.wallpaper : null\n setWpUrl(wallpaper)\n persistConfig()\n persistWallpaper(wallpaper)\n if (rHasColor()) {\n const [h, s, l] = rColor()\n registerCustom(h, s, l)\n }\n applyWp()\n syncBg()\n if (rHasColor()) {\n colorRev++\n bound?.syncColor(hslToHsv(...rColor()), colorRev)\n }\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-any-background', order: 35,\n label: () => ctx.locale.bind(NS)('nav'),\n locale: NS, store, inject: sectionInject,\n }, ThemeSection as any))\n\n // 6.5. Settings-nav icon: the harness derives the nav glyph from the section\n // id (unknown ids fall back to the settings gear) with no plugin hook, so\n // patch the mounted nav cell in place — find the cell whose label matches\n // this section's nav text and swap 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-any-background: nav icon watch')\n\n // 7. Deferred boot restore: the theme service and the host settings scope\n // settle asynchronously after this apply, so the synchronous restore can be\n // observed mid-flight — a late host adoption resets the preference, or the\n // presenter re-applies over our overrides. Re-running the saved-color and\n // wallpaper restore a few ticks later guarantees the saved records land.\n const restoreSaved = (): void => {\n if (rHasColor()) {\n const [h, s, l] = rColor()\n registerCustom(h, s, l)\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-any-background: boot restore')\n\n // 8. Theme watchdog: the theme service keeps only built-in preferences in\n // memory, so ANY host-scope adoption can silently drop the custom theme —\n // reverting the label colors (white/black) and the inner surfaces to the\n // system palette. While a color is saved, re-register and re-assert the\n // custom theme on a slow interval so the theme state always matches the\n // saved color and the active scheme, independent of which event resets it.\n const watchdogId = window.setInterval(() => {\n if (!rHasColor()) return\n const snapshot = ctx.theme.getTheme()\n let changed = false\n if (!snapshot.themes.some(t => t.id === CUSTOM_ID)) {\n const [h, s, l] = rColor()\n registerCustom(h, s, l)\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-any-background: theme watchdog')\n\n // 9. Flush any pending debounced config write when the page is hidden or\n // closed, so the last slider position is never lost to the debounce window.\n const onPageHide = (): void => flushSave()\n window.addEventListener('pagehide', onPageHide)\n ctx.effect(() => () => window.removeEventListener('pagehide', onPageHide), 'dsh-any-background: pagehide flush')\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["randomSeed","Component","useState","createPortal","memo","useRef","useState","useCallback","SEG_W","useState","useRef","toHex","useRef","useState","useCallback","useState","useRef","useState","useRef","useCallback","useRef","useState","useRef","useState","useRef","defineStore"],"sources":["../src/client/i18n.ts","../src/client/state.ts","../src/client/rpc.ts","../src/client/utils/color.ts","../src/client/utils/bg-generators.ts","../src/client/wallpaper.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/ColorWheel.tsx","../src/client/components/ColorInputs.tsx","../src/client/components/ColorPicker.tsx","../src/client/components/pages/ColorPage.tsx","../src/client/components/LiveSlider.tsx","../src/client/components/pages/InterfacePage.tsx","../src/client/utils/image.ts","../src/client/components/BgEditor.tsx","../src/client/components/pages/BackgroundPage.tsx","../src/client/components/pages/ProfilePage.tsx","../src/client/components/ThemeSection.tsx","../src/client/index.tsx"],"sourcesContent":["export const NS = 'settings.anyBg'\n\nexport const zh: Record<string, string> = {\n nav: '主题', brandTag: '外观定制', close: '关闭',\n pageColor: '色彩', pageInterface: '界面', pageBackground: '背景', pageProfile: '配置',\n descColor: '拖动色轮或输入精确数值,整个界面的配色将实时跟随变化',\n descInterface: '为主界面的各个区域单独调节透明度与模糊,营造空间层次感',\n descBackground: '上传一张图片作为壁纸,或让算法为你实时生成动态背景',\n descProfile: '将当前主题导出为文件备份,或从文件一键恢复完整配置',\n colorTitle: '主题色', colorHint: '在色轮外圈选择色相,在内部方形中调整饱和度和明度;双击滑块可恢复默认值',\n swatchTitle: '灵感色板',\n hexCaption: '当前主题色',\n uiTitle: '主界面',\n uiOpacity: '透明度', uiBlur: '模糊度',\n uiOpacityBg: '主背景', uiOpacitySide: '侧边栏', uiOpacityCard: '对话框中选项面板',\n uiSop: '设置界面透明度',\n bgTitle: '背景', bgChoose: '选择图片', bgRemove: '移除背景',\n bgEdit: '编辑位置', wpOpacity: '背景透明度', bgBlur: '背景模糊',\n bgSourceImage: '图片',\n bgSourceGenerated: '动态生成',\n dropHint: '点击选择图片,或将图片拖到这里',\n liveBadge: '动态壁纸',\n bgHint: '图片模式下悬停预览可编辑位置;动态生成模式下可选择类型、预设与参数。绑定种子后刷新页面壁纸保持不变,取消绑定则每次刷新随机换新',\n editorTitle: '背景编辑器', editorHint: '拖动移动图片,滚轮缩放大小',\n editorCommit: '确认', editorCancel: '取消', editorReset: '重置',\n extractColor: '从背景提取主题色', extracting: '取色中…',\n extractNoWp: '请先设置背景图片',\n extractDone: '已应用背景主色调',\n extractFail: '未在背景中找到鲜明的颜色,请换一张背景',\n crashTitle: '界面渲染出错',\n crashDesc: '主题设置面板遇到问题,点击下方按钮重置后重试',\n crashReset: '重置面板',\n exportTheme: '导出配置',\n importTheme: '导入配置',\n exportCardTitle: '导出配置',\n exportCardDesc: '将主题色、透明度、模糊与壁纸打包为 dsh-any-theme.json 文件',\n importCardTitle: '导入配置',\n importCardDesc: '从之前导出的 JSON 文件一键恢复完整主题',\n toastExportDone: '配置文件已开始下载',\n importDone: '已导入主题配置',\n importFail: '导入失败,文件格式不正确',\n footerTag: '外观插件',\n eyedropper: '从背景取色',\n pickerTitle: '从背景取色',\n pickerHint: '移动鼠标预览颜色,点击背景选取为主题色',\n pickerClose: '关闭',\n bgTypeImage: '图片',\n bgTypeMesh: '网格渐变',\n bgTypeShader: 'Shader',\n bgTypePattern: '几何图案',\n bgMeshDesc: '柔和的多点渐变色块',\n bgShaderDesc: '持续流动的光影动画',\n bgPatternDesc: '规律的几何纹理',\n bgRegenerate: '重新生成',\n bgSeedLocked: '已绑定 · 刷新不变',\n bgSeedUnlocked: '未绑定 · 刷新换新',\n seedLock: '锁定种子',\n bgMeshScale: '扩散范围',\n bgMeshIntensity: '色彩强度',\n bgShaderPreset: '预设',\n bgShaderSpeed: '流动速度',\n bgShaderScale: '纹理尺度',\n bgPatternPreset: '图案',\n bgPatternDensity: '密度',\n bgPatternScale: '尺度',\n presetAurora: '极光',\n presetNebula: '星云',\n presetNoise: '流动噪声',\n presetDots: '点阵',\n presetWaves: '波浪',\n presetPoly: '低多边形',\n}\n\nexport const en: Record<string, string> = {\n nav: 'Theme', brandTag: 'Appearance', close: 'Close',\n pageColor: 'Color', pageInterface: 'Interface', pageBackground: 'Background', pageProfile: 'Profile',\n descColor: 'Drag the wheel or type exact values — the whole UI follows live',\n descInterface: 'Tune opacity and blur per surface to build depth',\n descBackground: 'Upload an image as wallpaper, or let the algorithm paint a live background',\n descProfile: 'Export the current theme as a file, or restore it from one',\n colorTitle: 'Theme color', colorHint: 'Pick hue on the outer ring, adjust saturation & lightness in the square; double-click a slider to reset',\n swatchTitle: 'Quick swatches',\n hexCaption: 'Current accent',\n uiTitle: 'Interface',\n uiOpacity: 'Opacity', uiBlur: 'Blur',\n uiOpacityBg: 'Main background', uiOpacitySide: 'Sidebar', uiOpacityCard: 'Cards & panels',\n uiSop: 'Settings interface opacity',\n bgTitle: 'Background', bgChoose: 'Choose image', bgRemove: 'Remove background',\n bgEdit: 'Edit position', wpOpacity: 'Background opacity', bgBlur: 'Background blur',\n bgSourceImage: 'Image',\n bgSourceGenerated: 'Generated',\n dropHint: 'Click to choose an image, or drop one here',\n liveBadge: 'Live wallpaper',\n bgHint: 'In image mode hover the preview to edit position; in generated mode pick a type, preset and parameters. With the seed locked the wallpaper stays the same across refreshes; unlocked, every refresh randomizes it',\n editorTitle: 'Background editor', editorHint: 'Drag to move, scroll to zoom',\n editorCommit: 'Confirm', editorCancel: 'Cancel', editorReset: 'Reset',\n extractColor: 'Extract from background', extracting: 'Extracting…',\n extractNoWp: 'Set a background first',\n extractDone: 'Background color applied',\n extractFail: 'No vivid color found in this background, try another',\n crashTitle: 'Section crashed',\n crashDesc: 'The theme panel hit an error. Reset below to recover.',\n crashReset: 'Reset panel',\n exportTheme: 'Export',\n importTheme: 'Import',\n exportCardTitle: 'Export profile',\n exportCardDesc: 'Bundle color, opacity, blur and wallpaper into dsh-any-theme.json',\n importCardTitle: 'Import profile',\n importCardDesc: 'Restore a full theme from a previously exported JSON file',\n toastExportDone: 'Export started',\n importDone: 'Theme imported',\n importFail: 'Import failed — invalid file',\n footerTag: 'Appearance plugin',\n eyedropper: 'Eyedropper',\n pickerTitle: 'Pick from background',\n pickerHint: 'Hover to preview, click to pick as theme color',\n pickerClose: 'Close',\n bgTypeImage: 'Image',\n bgTypeMesh: 'Mesh gradient',\n bgTypeShader: 'Shader',\n bgTypePattern: 'Pattern',\n bgMeshDesc: 'Soft multi-blob gradients',\n bgShaderDesc: 'Flowing light animation',\n bgPatternDesc: 'Regular geometric texture',\n bgRegenerate: 'Regenerate',\n bgSeedLocked: 'Seeded · stable on refresh',\n bgSeedUnlocked: 'Unseeded · new on refresh',\n seedLock: 'Lock seed',\n bgMeshScale: 'Spread',\n bgMeshIntensity: 'Intensity',\n bgShaderPreset: 'Preset',\n bgShaderSpeed: 'Flow speed',\n bgShaderScale: 'Texture scale',\n bgPatternPreset: 'Pattern',\n bgPatternDensity: 'Density',\n bgPatternScale: 'Scale',\n presetAurora: 'Aurora',\n presetNebula: 'Nebula',\n presetNoise: 'Flowing noise',\n presetDots: 'Dots',\n presetWaves: 'Waves',\n presetPoly: 'Low poly',\n}\n","import type { BgState, ThemeConfig, PartOpacities, PartBlurs, ColorPalette } from './types'\n\nexport const DEFAULT_CONFIG: ThemeConfig = {\n color: null,\n opacities: { bg: 0.85, sidebar: 0.93, card: 1 },\n blurs: { bg: 0, sidebar: 0, card: 0, settings: 0 },\n settingsOpacity: 1,\n wallpaperOpacity: 1,\n blur: 0,\n bgState: { zoom: 1, x: 0, y: 0, iw: 0, ih: 0 },\n backgroundType: 'image',\n generatedBg: null,\n regenerateOnReload: false,\n}\n\n// Derived Material-You-style palette. It is recomputed from the active\n// wallpaper/generated background whenever the background changes, and used by\n// genTokens to map brand/accent/surface colors more harmoniously.\nexport let palette: ColorPalette | null = null\nexport function setPalette(p: ColorPalette | null): void { palette = p }\nexport function rPalette(): ColorPalette | null { return palette }\n\n// In-memory mirror of the file-backed store. The node half owns the disk; this\n// module is the single source of truth the UI reads from and mutates, synced\n// to disk via the RPC layer.\nexport let cfg: ThemeConfig = { ...DEFAULT_CONFIG, opacities: { ...DEFAULT_CONFIG.opacities }, blurs: { ...DEFAULT_CONFIG.blurs }, bgState: { ...DEFAULT_CONFIG.bgState } }\nexport let wpImageUrl: string | null = null\n// The uploaded image is retained across background-type switches so coming back\n// to the \"image\" type restores the original picture (see issue: switching to a\n// generated bg overwrote the image URL and lost it).\nexport let wpUrl: string | null = null\n\nexport function setWpImageUrl(url: string | null): void { wpImageUrl = url }\nexport function setWpUrl(url: string | null): void { wpUrl = url }\nexport function setBgState(s: BgState): void { cfg.bgState = s }\n\n// Brightness verdict of the active generated background, analyzed ONCE per\n// switch from a captured frame (never per-frame). null = no generated\n// background active or analysis pending, so the picked color's lightness\n// keeps deciding the font direction as before.\nexport let bgDark: boolean | null = null\nexport function setBgDark(v: boolean | null): void { bgDark = v }\nexport function rBgDark(): boolean | null { return bgDark }\n\nexport function rHasColor(): boolean { return cfg.color !== null }\nexport function rColor(): [number, number, number] { return cfg.color ?? [220, 0.55, 0.25] }\nexport function rWpImage(): string | null { return wpImageUrl }\n/** Display URL: the uploaded image when in image mode, else the generated snapshot. */\nexport function rWp(): string | null { return cfg.backgroundType === 'image' ? wpImageUrl : wpUrl }\nexport function rOps(): PartOpacities {\n const o = cfg.opacities ?? {}\n return {\n bg: typeof o.bg === 'number' ? Math.min(1, Math.max(0, o.bg)) : DEFAULT_CONFIG.opacities.bg,\n sidebar: typeof o.sidebar === 'number' ? Math.min(1, Math.max(0, o.sidebar)) : DEFAULT_CONFIG.opacities.sidebar,\n card: typeof o.card === 'number' ? Math.min(1, Math.max(0, o.card)) : DEFAULT_CONFIG.opacities.card,\n }\n}\nexport function rBlurs(): PartBlurs {\n const b = cfg.blurs ?? {}\n return {\n bg: typeof b.bg === 'number' ? Math.min(60, Math.max(0, b.bg)) : DEFAULT_CONFIG.blurs.bg,\n sidebar: typeof b.sidebar === 'number' ? Math.min(60, Math.max(0, b.sidebar)) : DEFAULT_CONFIG.blurs.sidebar,\n card: typeof b.card === 'number' ? Math.min(60, Math.max(0, b.card)) : DEFAULT_CONFIG.blurs.card,\n settings: typeof b.settings === 'number' ? Math.min(60, Math.max(0, b.settings)) : DEFAULT_CONFIG.blurs.settings,\n }\n}\nexport function rWop(): number { return typeof cfg.wallpaperOpacity === 'number' ? Math.min(1, Math.max(0, cfg.wallpaperOpacity)) : DEFAULT_CONFIG.wallpaperOpacity }\nexport function rBl(): number { return typeof cfg.blur === 'number' ? Math.min(60, Math.max(0, cfg.blur)) : DEFAULT_CONFIG.blur }\nexport function rSop(): number { return typeof cfg.settingsOpacity === 'number' ? Math.min(1, Math.max(0, cfg.settingsOpacity)) : DEFAULT_CONFIG.settingsOpacity }\nexport function rBgState(): BgState { return cfg.bgState }\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> & { opacity?: unknown }\n const color = Array.isArray(c.color) && c.color.length === 3\n ? [c.color[0], c.color[1], c.color[2]] as [number, number, number]\n : null\n const bg = (c.bgState ?? {}) as Partial<BgState>\n // Migration: the old single main-interface opacity becomes per-part, keeping\n // the sidebar's former +0.08 offset and leaving cards opaque as before.\n const legacy = typeof c.opacity === 'number' ? c.opacity : null\n const ops = (c.opacities ?? {}) as Partial<PartOpacities>\n const bl = (c.blurs ?? {}) as Partial<PartBlurs>\n const bgType = (c.backgroundType === 'mesh' || c.backgroundType === 'shader' || c.backgroundType === 'pattern') ? c.backgroundType : DEFAULT_CONFIG.backgroundType\n const gen = c.generatedBg && typeof c.generatedBg === 'object'\n ? (c.generatedBg as { type?: string })\n : null\n const generatedBg = gen && gen.type === bgType ? (c.generatedBg as ThemeConfig['generatedBg']) : null\n\n cfg = {\n color,\n opacities: {\n bg: typeof ops.bg === 'number' ? ops.bg : (legacy ?? DEFAULT_CONFIG.opacities.bg),\n sidebar: typeof ops.sidebar === 'number' ? ops.sidebar : (legacy !== null ? Math.min(1, legacy + 0.08) : DEFAULT_CONFIG.opacities.sidebar),\n card: typeof ops.card === 'number' ? ops.card : DEFAULT_CONFIG.opacities.card,\n },\n blurs: {\n bg: typeof bl.bg === 'number' ? bl.bg : DEFAULT_CONFIG.blurs.bg,\n sidebar: typeof bl.sidebar === 'number' ? bl.sidebar : DEFAULT_CONFIG.blurs.sidebar,\n card: typeof bl.card === 'number' ? bl.card : DEFAULT_CONFIG.blurs.card,\n settings: typeof bl.settings === 'number' ? bl.settings : DEFAULT_CONFIG.blurs.settings,\n },\n settingsOpacity: typeof c.settingsOpacity === 'number' ? c.settingsOpacity : DEFAULT_CONFIG.settingsOpacity,\n wallpaperOpacity: typeof c.wallpaperOpacity === 'number' ? c.wallpaperOpacity : DEFAULT_CONFIG.wallpaperOpacity,\n blur: typeof c.blur === 'number' ? c.blur : DEFAULT_CONFIG.blur,\n bgState: {\n zoom: typeof bg.zoom === 'number' ? bg.zoom : 1,\n x: typeof bg.x === 'number' ? bg.x : 0,\n y: typeof bg.y === 'number' ? bg.y : 0,\n iw: typeof bg.iw === 'number' && bg.iw > 0 ? bg.iw : 0,\n ih: typeof bg.ih === 'number' && bg.ih > 0 ? bg.ih : 0,\n },\n backgroundType: bgType,\n generatedBg: generatedBg ? normalizeGeneratedBg(generatedBg) : null,\n regenerateOnReload: typeof c.regenerateOnReload === 'boolean' ? c.regenerateOnReload : DEFAULT_CONFIG.regenerateOnReload,\n }\n}\n\nfunction normalizeGeneratedBg(p: ThemeConfig['generatedBg']): ThemeConfig['generatedBg'] {\n if (!p) return null\n if (p.type === 'mesh') {\n return {\n type: 'mesh',\n seed: typeof p.seed === 'number' ? p.seed : 0,\n scale: typeof p.scale === 'number' ? Math.min(3, Math.max(0.3, p.scale)) : 1,\n intensity: typeof p.intensity === 'number' ? Math.min(1, Math.max(0, p.intensity)) : 0.6,\n }\n }\n if (p.type === 'shader') {\n return {\n type: 'shader',\n preset: ['aurora', 'nebula', 'noise'].includes(p.preset) ? p.preset : 'aurora',\n speed: typeof p.speed === 'number' ? Math.min(2, Math.max(0, p.speed)) : 0.3,\n scale: typeof p.scale === 'number' ? Math.min(3, Math.max(0.3, p.scale)) : 1,\n seed: typeof p.seed === 'number' ? Math.floor(p.seed) : 0,\n }\n }\n return {\n type: 'pattern',\n preset: ['dots', 'waves', 'poly'].includes(p.preset) ? p.preset : 'dots',\n density: typeof p.density === 'number' ? Math.min(1, Math.max(0, p.density)) : 0.5,\n scale: typeof p.scale === 'number' ? Math.min(3, Math.max(0.3, p.scale)) : 1,\n seed: typeof p.seed === 'number' ? Math.floor(p.seed) : 0,\n }\n}\n","import type { RpcResultLike } from './types'\nimport { cfg, adoptConfig, setWpUrl, setWpImageUrl } from './state'\n\nexport const RPC_CHANNEL = '/dsh-any-background'\nconst RPC_NS = 'dshAnyBackground'\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-any-background: rpc \"${method}\" failed`, res?.error)\n return undefined\n } catch (e) {\n console.warn(`dsh-any-background: rpc \"${method}\" threw`, e)\n return undefined\n }\n}\n\n// ── Debounced persistence ─────────────────────────────────────────────────────\n// Slider drags fire onInput (and React's onChange) dozens of times per second;\n// each saveConfig() would trigger an RPC write. Coalesce writes to a trailing\n// debounce so the disk is only touched after the user pauses or releases, and\n// flush the last pending write on pagehide so a quick close never loses it.\n\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 (import path — no debounce). */\nexport function persistConfig(): void {\n void rpcCall('writeConfig', { config: cfg })\n}\n\n/** Load the persisted theme (config + wallpaper) from the node half. */\nexport async function loadPersisted(): Promise<void> {\n const data = await rpcCall('read', {})\n if (data && typeof data === 'object') {\n const d = data as { config?: unknown; wallpaper?: unknown }\n if (d.config) adoptConfig(d.config)\n // The uploaded image is always its own slot so switching background types\n // never discards it. When in image mode the caller points wpUrl at it.\n if (typeof d.wallpaper === 'string') setWpImageUrl(d.wallpaper)\n else if (d.wallpaper === null) setWpImageUrl(null)\n // The display URL is determined by the active type; if image mode, restore it.\n if (cfg.backgroundType === 'image') setWpUrl(d.wallpaper === null ? null : d.wallpaper as string | null)\n }\n}\n\n/** Persist a wallpaper (null removes it). One-shot large payload, no debounce. */\nexport function persistWallpaper(dataUrl: string | null): void {\n void rpcCall('setWallpaper', { dataUrl })\n}\n","import type { BgState, ColorPalette } from '../types'\n\n// ── HSV ↔ HSL ────────────────────────────────────────────────────────────────\n// The wheel works in HSV end to end: props and pickSL are HSV, the canvas\n// renders the HSV S-V plane directly. Storage and genTokens expect HSL, so\n// setColor converts HSV → HSL at the boundary; sectionInject converts stored\n// HSL → HSV for the initial wheel props. Conversions never stack.\n\nexport function hsvToHsl(h: number, s: number, v: number): [number, number, number] {\n const l = v * (1 - s / 2)\n const sl = l === 0 || l === 1 ? 0 : (v - l) / Math.min(l, 1 - l)\n return [h, sl, l]\n}\n\nexport function hslToHsv(h: number, s: number, l: number): [number, number, number] {\n const v = l + s * Math.min(l, 1 - l)\n const sv = v === 0 ? 0 : 2 * (1 - l / v)\n return [h, sv, v]\n}\n\n// ── Token generation from HSL ──────────────────────────────────────────────────\n\nlet tokensCacheKey = ''\nlet tokensCache: { colorScheme: 'light' | 'dark'; tokens: Record<string, string> } | null = null\n\n/**\n * Memoized token generation: the same (hue, sat, lit) input always yields the\n * same token set, and applyWp / applyCustomTokens / applySettingsOverrides call\n * this repeatedly (slider drags, viewport re-applies), so cache the last result\n * and skip the 30+ hsl() string builds when nothing changed.\n *\n * This is the simple, pre-Material-You version: dark/light is decided only by\n * lit < 0.55, and all tokens are derived directly from the picked hue/sat/lit.\n * The optional palette argument is kept for API compatibility but ignored here,\n * so saved picks never get rewritten by a wallpaper-derived palette.\n */\nexport function genTokens(hue: number, sat: number, lit: number, _palette?: ColorPalette | null): { colorScheme: 'light' | 'dark'; tokens: Record<string, string> } {\n const key = `${hue}|${sat}|${lit}`\n if (tokensCacheKey === key && tokensCache) return tokensCache\n tokensCacheKey = key\n tokensCache = buildTokens(hue, sat, lit)\n return tokensCache\n}\n\nfunction buildTokens(hue: number, sat: number, lit: number): { colorScheme: 'light' | 'dark'; tokens: Record<string, string> } {\n const dark = lit < 0.55\n const h = (d: number) => ((hue + d) % 360 + 360) % 360\n const s = (d: number) => Math.max(0, Math.min(1, sat + d))\n const l = (d: number) => Math.max(0, Math.min(1, lit + d))\n const hsl = (hh: number, ss: number, ll: number) => `hsl(${Math.round(hh)},${Math.round(ss * 100)}%,${Math.round(ll * 100)}%)`\n const rgba = (hh: number, ss: number, ll: number, a: number) =>\n `hsla(${Math.round(hh)},${Math.round(ss * 100)}%,${Math.round(ll * 100)}%,${a})`\n\n if (dark) {\n return {\n colorScheme: 'dark',\n tokens: {\n '--dsw-alias-bg-base': hsl(h(0), s(0), l(-0.04)),\n '--dsw-alias-bg-layer-1': hsl(h(0), s(0), l(0.02)),\n '--dsw-alias-bg-layer-2': hsl(h(0), s(0), l(0.07)),\n '--dsw-alias-bg-layer-3': hsl(h(0), s(-0.05), l(0.12)),\n '--dsw-alias-bg-overlay': hsl(h(0), s(-0.05), l(0.12)),\n '--dsw-alias-border-l1': rgba(h(0), s(-0.1), l(0.18), 0.12),\n '--dsw-alias-border-l2': rgba(h(0), s(-0.1), l(0.22), 0.22),\n '--dsw-alias-label-primary': hsl(0, 0, 1),\n '--dsw-alias-label-secondary': hsl(0, 0, 1),\n '--dsw-alias-label-tertiary': hsl(0, 0, 1),\n '--dsw-alias-label-caption': hsl(0, 0, 1),\n '--dsw-alias-label-dimmed': hsl(0, 0, 1),\n '--dsw-alias-label-quaternary': hsl(0, 0, 1),\n '--dsw-alias-brand-primary': hsl(h(0), s(0.1), Math.max(l(0.2), 0.5)),\n '--dsw-alias-brand-text': l(0.2) > 0.6 ? '#000' : '#fff',\n '--dsw-alias-button-primary-hover': hsl(h(0), s(0.1), Math.max(l(0.28), 0.58)),\n '--dsw-alias-button-primary-dimmed': hsl(h(0), s(0), l(0.07)),\n '--dsw-alias-button-elevated-fill': hsl(h(0), s(0), l(0.04)),\n '--dsw-alias-interactive-bg-hover': rgba(h(0), s(0), Math.max(l(0.15), 0.4), 0.12),\n '--dsw-alias-interactive-bg-active': rgba(h(0), s(0), Math.max(l(0.15), 0.4), 0.2),\n '--dsw-alias-markdown-code-block': hsl(h(0), s(0), l(-0.06)),\n '--dsw-alias-markdown-inline-code': hsl(h(0), s(0), l(0.04)),\n '--dsw-alias-state-error-primary': '#ff5c72',\n '--dsw-alias-state-success-primary': '#3ddc84',\n '--dsw-alias-state-warn-primary': '#ffb347',\n '--dsw-specific-sidebar-fill': hsl(h(0), s(0), l(-0.06)),\n '--dsw-specific-sidebar-nav-item-active': hsl(h(0), s(0), l(0.04)),\n '--dsw-specific-sidebar-nav-item-hover': hsl(h(0), s(0), l(0)),\n '--dsw-specific-input-major': hsl(h(0), s(0), l(0.02)),\n '--dsw-alias-scrollbar-bg-l1': hsl(h(0), s(-0.05), l(0.12)),\n '--dsw-alias-scrollbar-bg-l2': hsl(h(0), s(-0.05), l(0.16)),\n '--dsw-alias-scrollbar-hover-l1': hsl(h(0), s(-0.05), l(0.22)),\n '--dsw-alias-scrollbar-hover-l2': hsl(h(0), s(-0.05), l(0.22)),\n },\n }\n }\n return {\n colorScheme: 'light',\n tokens: {\n '--dsw-alias-bg-base': hsl(h(0), s(-0.08), l(0.03)),\n '--dsw-alias-bg-layer-1': hsl(h(0), s(-0.12), l(0.07)),\n '--dsw-alias-bg-layer-2': hsl(h(0), s(-0.1), l(-0.03)),\n '--dsw-alias-bg-layer-3': hsl(h(0), s(-0.08), l(-0.09)),\n '--dsw-alias-bg-overlay': hsl(h(0), s(-0.12), l(0.08)),\n '--dsw-alias-border-l1': rgba(h(0), s(-0.15), l(-0.35), 0.18),\n '--dsw-alias-border-l2': rgba(h(0), s(-0.15), l(-0.35), 0.3),\n '--dsw-alias-label-primary': hsl(0, 0, 0),\n '--dsw-alias-label-secondary': hsl(0, 0, 0),\n '--dsw-alias-label-tertiary': hsl(0, 0, 0),\n '--dsw-alias-label-caption': hsl(0, 0, 0),\n '--dsw-alias-label-dimmed': hsl(0, 0, 0),\n '--dsw-alias-label-quaternary': hsl(0, 0, 0),\n '--dsw-alias-brand-primary': hsl(h(0), s(0.05), Math.min(l(-0.18), 0.45)),\n '--dsw-alias-brand-text': '#fff',\n '--dsw-alias-button-primary-hover': hsl(h(0), s(0.05), Math.min(l(-0.12), 0.5)),\n '--dsw-alias-button-primary-dimmed': hsl(h(0), s(-0.1), l(-0.03)),\n '--dsw-alias-button-elevated-fill': hsl(h(0), s(-0.1), l(0.1)),\n '--dsw-alias-interactive-bg-hover': rgba(h(0), s(0), l(-0.3), 0.08),\n '--dsw-alias-interactive-bg-active': rgba(h(0), s(0), l(-0.3), 0.14),\n '--dsw-alias-markdown-code-block': hsl(h(0), s(-0.1), l(-0.03)),\n '--dsw-alias-markdown-inline-code': hsl(h(0), s(-0.08), l(0.04)),\n '--dsw-specific-sidebar-fill': hsl(h(0), s(-0.1), l(-0.03)),\n '--dsw-specific-sidebar-nav-item-active': hsl(h(0), s(-0.08), l(0.05)),\n '--dsw-specific-sidebar-nav-item-hover': hsl(h(0), s(-0.12), l(0)),\n '--dsw-specific-input-major': hsl(h(0), s(-0.12), l(0.1)),\n '--dsw-alias-scrollbar-bg-l1': hsl(h(0), s(-0.1), l(-0.08)),\n '--dsw-alias-scrollbar-bg-l2': hsl(h(0), s(-0.08), l(-0.12)),\n '--dsw-alias-scrollbar-hover-l1': hsl(h(0), s(-0.08), l(-0.16)),\n '--dsw-alias-scrollbar-hover-l2': hsl(h(0), s(-0.08), l(-0.16)),\n },\n }\n}\n\nexport function toRgba(c: string, a: number): string {\n const hx = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(c.trim())\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})` }\n const rgb = /^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+))?\\s*\\)$/i.exec(c.trim())\n if (rgb) return `rgba(${rgb[1]},${rgb[2]},${rgb[3]},${a})`\n const hsl = /^hsla?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%/i.exec(c.trim())\n if (hsl) return `hsla(${hsl[1]},${hsl[2]}%,${hsl[3]}%,${a})`\n return c.trim()\n}\n\nexport function rgbToHsl(r: number, g: number, b: number): [number, number, number] {\n const rn = r / 255, gn = g / 255, bn = b / 255\n const max = Math.max(rn, gn, bn), min = Math.min(rn, gn, bn)\n const l = (max + min) / 2\n if (max === min) return [0, 0, l]\n const d = max - min\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n let h: number\n if (max === rn) h = ((gn - bn) / d) % 6\n else if (max === gn) h = (bn - rn) / d + 2\n else h = (rn - gn) / d + 4\n h *= 60\n if (h < 0) h += 360\n return [h, s, l]\n}\n\n// ── Wallpaper color extraction ─────────────────────────────────────────────────\n// Full chain: decode the cached data URL → crop the visible (framed) region →\n// downsample to a 64×64 canvas → quantize pixels into 4-bit RGB buckets →\n// discard near-gray / near-black / near-white pixels → pick the most populous\n// vivid bucket (count × saturation bias) → average its members → RGB→HSL →\n// clamp lightness into a band that keeps the light/dark scheme decision\n// unambiguous. Purely client-side: no RPC traffic, and memory is bounded by\n// one 64×64 canvas + one ImageData + two small typed arrays.\n//\n// The extraction now returns a Material-You-style palette: primary (dominant),\n// secondary (second-most vivid), tertiary (complementary accent), surface\n// (neutralized dominant), and the average luminance of the sampled image for\n// automatic light/dark decisions.\n\nconst EXTRACT_SIDE = 64\n\ninterface Bucket { count: number; r: number; g: number; b: number; s: number }\n\nfunction bucketsToHsl(b: Bucket): [number, number, number] {\n return rgbToHsl(b.r / b.count, b.g / b.count, b.b / b.count)\n}\n\nexport function extractWallpaperPalette(dataUrl: string, bgState: BgState): Promise<ColorPalette | null> {\n return new Promise(resolve => {\n const img = new Image()\n img.onerror = () => resolve(null)\n img.onload = () => {\n try {\n const iw = img.naturalWidth || img.width\n const ih = img.naturalHeight || img.height\n const bg = bgState\n let sx = 0, sy = 0, sw = iw, sh = ih\n if (bg.iw === iw && bg.ih === ih && bg.iw > 0) {\n const fit = Math.min(window.innerWidth / iw, window.innerHeight / ih)\n const w = iw * fit * bg.zoom\n const h = ih * fit * bg.zoom\n sx = Math.max(0, bg.x * window.innerWidth - w / 2)\n sy = Math.max(0, bg.y * window.innerHeight - h / 2)\n sw = Math.min(iw - sx, w)\n sh = Math.min(ih - sy, h)\n if (sw <= 0 || sh <= 0) { sx = 0; sy = 0; sw = iw; sh = ih }\n }\n const c = document.createElement('canvas')\n c.width = EXTRACT_SIDE; c.height = EXTRACT_SIDE\n const g = c.getContext('2d', { willReadFrequently: true })!\n g.drawImage(img, sx, sy, sw, sh, 0, 0, EXTRACT_SIDE, EXTRACT_SIDE)\n const px = g.getImageData(0, 0, EXTRACT_SIDE, EXTRACT_SIDE).data\n const counts = new Uint32Array(4096)\n const sums = new Float64Array(4096 * 3)\n let totalLum = 0\n let sampled = 0\n for (let i = 0; i < px.length; i += 4) {\n const r = px[i], gg = px[i + 1], b = px[i + 2]\n const max = Math.max(r, gg, b), min = Math.min(r, gg, b)\n const v = max / 255\n const s = max === 0 ? 0 : (max - min) / max\n // Include all non-extreme pixels in luminance; only vivid pixels in\n // palette buckets so we don't theme around gray/black/white.\n totalLum += v\n sampled++\n if (s < 0.08 || v < 0.12 || v > 0.97) continue\n const key = ((r >> 4) << 8) | ((gg >> 4) << 4) | (b >> 4)\n counts[key]++\n sums[key * 3] += r; sums[key * 3 + 1] += gg; sums[key * 3 + 2] += b\n }\n const buckets: Bucket[] = []\n for (let k = 0; k < 4096; k++) {\n if (counts[k] === 0) continue\n buckets.push({\n count: counts[k],\n r: sums[k * 3],\n g: sums[k * 3 + 1],\n b: sums[k * 3 + 2],\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,\n })\n }\n if (buckets.length === 0) { resolve(null); return }\n // Sort by vivid-weighted count.\n buckets.sort((a, b) => b.count * (0.5 + b.s) - a.count * (0.5 + a.s))\n const primary = bucketsToHsl(buckets[0]!)\n const primaryHue = primary[0]\n // Secondary: next bucket that is reasonably separated from primary.\n let secondary = primary\n for (const b of buckets.slice(1)) {\n const [h] = bucketsToHsl(b)\n const sep = Math.abs(((h - primaryHue + 540) % 360) - 180)\n if (sep > 30) { secondary = bucketsToHsl(b); break }\n }\n // Tertiary: complementary-ish hue based on primary if no good secondary.\n let tertiary: [number, number, number] = [((primaryHue + 180) % 360), Math.min(0.7, primary[1]), Math.min(0.7, primary[2])]\n for (const b of buckets.slice(1)) {\n const [h] = bucketsToHsl(b)\n const sep = Math.abs(((h - primaryHue + 540) % 360) - 180)\n if (sep > 90 && sep < 150) { tertiary = bucketsToHsl(b); break }\n }\n // Surface: neutralized primary (very low saturation).\n const surface: [number, number, number] = [primaryHue, Math.min(0.06, primary[1] * 0.3), primary[2]]\n // Auto light/dark: use the average luminance of the whole image so a\n // bright wallpaper naturally drives a light scheme and vice-versa.\n const luminance = sampled > 0 ? totalLum / sampled : primary[2]\n // Snap primary lightness out of the ambiguous middle band.\n const autoDark = luminance < 0.5\n const lc = autoDark ? Math.min(0.44, Math.max(0.2, primary[2])) : Math.max(0.6, Math.min(0.82, primary[2]))\n primary[2] = lc\n resolve({\n primary: [primary[0], Math.min(0.9, Math.max(0.15, primary[1])), primary[2]],\n secondary: [secondary[0], Math.min(0.85, Math.max(0.2, secondary[1])), Math.min(0.75, Math.max(0.35, secondary[2]))],\n tertiary: [tertiary[0], Math.min(0.8, Math.max(0.2, tertiary[1])), Math.min(0.7, Math.max(0.35, tertiary[2]))],\n surface,\n luminance,\n })\n } catch {\n resolve(null)\n }\n }\n img.src = dataUrl\n })\n}\n\n/** Fallback palette when only a seed HSL color is known (no wallpaper).\n *\n * CRITICAL: the primary color MUST equal the user's pick. Previously the\n * lightness was clamped into a 0.2–0.44 / 0.6–0.82 band, which turned a pure\n * red (#FA000F, L≈0.49) into a washed-out #746768-like color. We now keep the\n * user's HSL exactly and only sanitize saturation into a readable range. The\n * secondary/tertiary hues are derived for accents, while surface stays neutral.\n */\nexport function paletteFromHsl([h, s, l]: [number, number, number]): ColorPalette {\n const hue = ((h % 360) + 360) % 360\n const sat = Math.min(1, Math.max(0, s))\n return {\n primary: [hue, sat, l],\n secondary: [((hue + 30) % 360), Math.min(0.85, Math.max(0.2, sat)), Math.min(0.75, Math.max(0.35, l))],\n tertiary: [((hue + 180) % 360), Math.min(0.7, Math.max(0.2, sat)), Math.min(0.7, Math.max(0.35, l))],\n surface: [hue, Math.min(0.05, sat * 0.3), l],\n luminance: l,\n }\n}\n\n/** Backward-compatible single-color extraction: returns the primary HSL. */\nexport async function extractWallpaperColor(dataUrl: string, bgState: BgState): Promise<[number, number, number] | null> {\n const palette = await extractWallpaperPalette(dataUrl, bgState)\n return palette ? palette.primary : null\n}\n\n// ── One-shot frame brightness analysis ────────────────────────────────────────\n// Called only when a generated background is switched (from its captured\n// snapshot), never from the animation loop: decode the frame, downsample to a\n// 32×32 canvas, average Rec.709 luma. Dark frame → light fonts, light frame →\n// dark fonts. The whole pass costs one small ImageData read per switch.\n\nconst ANALYZE_SIDE = 32\n\n/** Analyze a captured frame's average luminance. Resolves true when the frame\n * reads dark (use white fonts), false when light (use black fonts), or null\n * when the frame cannot be decoded. */\nexport function analyzeFrameDark(dataUrl: string): Promise<boolean | null> {\n return new Promise(resolve => {\n const img = new Image()\n img.onerror = () => resolve(null)\n img.onload = () => {\n try {\n const c = document.createElement('canvas')\n c.width = ANALYZE_SIDE; c.height = ANALYZE_SIDE\n const g = c.getContext('2d', { willReadFrequently: true })!\n g.drawImage(img, 0, 0, ANALYZE_SIDE, ANALYZE_SIDE)\n const px = g.getImageData(0, 0, ANALYZE_SIDE, ANALYZE_SIDE).data\n let lum = 0\n const count = px.length / 4\n for (let i = 0; i < px.length; i += 4) {\n lum += 0.2126 * px[i]! + 0.7152 * px[i + 1]! + 0.0722 * px[i + 2]!\n }\n resolve(lum / count / 255 < 0.5)\n } catch {\n resolve(null)\n }\n }\n img.src = dataUrl\n })\n}\n\n/** HSL (h 0-360, s/l 0-1) → RGB (0-255 integers). */\nexport function hslToRgb(h: number, s: number, l: number): [number, number, number] {\n const c = (1 - Math.abs(2 * l - 1)) * s\n const hp = h / 60\n const x = c * (1 - Math.abs((hp % 2) - 1))\n let r = 0, g = 0, b = 0\n if (hp < 1) { r = c; g = x }\n else if (hp < 2) { r = x; g = c }\n else if (hp < 3) { g = c; b = x }\n else if (hp < 4) { g = x; b = c }\n else if (hp < 5) { r = x; b = c }\n else { r = c; b = x }\n const m = l - c / 2\n return [Math.round((r + m) * 255), Math.round((g + m) * 255), Math.round((b + m) * 255)]\n}\n","import type { GeneratedBgParams, MeshGradientParams, ShaderParams, PatternParams } from '../types'\n\n// The live full-screen canvas renders at a fraction of the CSS size — it sits\n// behind frosted/translucent UI anyway, so ~0.5–0.6px backing keeps it looking\n// sharp while drastically cutting fill/gradient cost per frame.\nconst RENDER_SCALE = 0.55\nconst FPS = 30\nconst FRAME_MS = 1000 / FPS\n\nfunction newRaf(canvas: HTMLCanvasElement, draw: () => void): { stop: () => void } {\n canvas.dataset.dshAnyCanvas = '1'\n let running = true\n let last = 0\n // Draw the very first frame synchronously so snapshot() right after creation\n // already yields a real frame (used by the preview, palette and export).\n draw()\n const loop = (ts: number) => {\n if (!running) return\n if (ts - last >= FRAME_MS) { last = ts; draw() }\n requestAnimationFrame(loop)\n }\n requestAnimationFrame(loop)\n return { stop: () => { running = false } }\n}\n\nfunction createCanvas(): HTMLCanvasElement {\n const c = document.createElement('canvas')\n c.style.cssText = 'position:absolute;inset:0;width:100%;height:100%;object-fit:cover;'\n return c\n}\n\nfunction liveSize(): { w: number; h: number } {\n const dpr = Math.min(window.devicePixelRatio || 1, 1.5)\n const w = Math.max(320, Math.ceil(window.innerWidth * dpr * RENDER_SCALE))\n const h = Math.max(180, Math.ceil(window.innerHeight * dpr * RENDER_SCALE))\n return { w, h }\n}\n\nfunction fitLiveCanvas(c: HTMLCanvasElement): void {\n if (c.dataset.dshAnyStatic === '1') return\n const { w, h } = liveSize()\n if (c.width !== w || c.height !== h) { c.width = w; c.height = h }\n}\n\n// ── Deterministic seeded RNG ─────────────────────────────────────────────────\nfunction createRng(seed: number) {\n let s = seed > 0 ? seed : 1\n return () => {\n s ^= s << 13\n s ^= s >>> 17\n s ^= s << 5\n return (s >>> 0) / 0xffffffff\n }\n}\n\n// ── Seeded 2D noise (for canvas mesh / pattern motion) ──────────────────────\nfunction createNoise(seed: number) {\n const rng = createRng(seed)\n const perm: number[] = []\n for (let i = 0; i < 256; i++) perm[i] = i\n for (let i = 255; i > 0; i--) {\n const j = Math.floor(rng() * (i + 1))\n const t = perm[i]!; perm[i] = perm[j]!; perm[j] = t\n }\n for (let i = 0; i < 256; i++) perm[i + 256] = perm[i]!\n function fade(t: number) { return t * t * t * (t * (t * 6 - 15) + 10) }\n function lerp(a: number, b: number, t: number) { return a + (b - a) * t }\n function grad(hash: number, x: number, y: number) {\n const h = hash & 15\n const u = h < 8 ? x : y\n const v = h < 4 ? y : (h === 12 || h === 14) ? x : 0\n return ((h & 1) === 0 ? u : -u) + ((h & 2) === 0 ? v : -v)\n }\n return (x: number, y: number) => {\n const X = Math.floor(x) & 255\n const Y = Math.floor(y) & 255\n x -= Math.floor(x)\n y -= Math.floor(y)\n const u = fade(x)\n const v = fade(y)\n const A = perm[X]! + Y\n return lerp(\n lerp(grad(perm[A]!, x, y), grad(perm[A! + 1]!, x - 1, y), u),\n lerp(grad(perm[A! + 256]!, x, y - 1), grad(perm[A! + 257]!, x - 1, y - 1), u),\n v,\n )\n }\n}\n\n// ── Mesh gradient (animated) ──────────────────────────────────────────────────\nexport function createMeshGradient(params: MeshGradientParams, canvas?: HTMLCanvasElement): { canvas: HTMLCanvasElement; stop: () => void; snapshot: () => string } {\n const c = canvas ?? createCanvas()\n fitLiveCanvas(c)\n const g = c.getContext('2d', { alpha: false })!\n const rng = createRng(params.seed)\n const noise = createNoise(params.seed)\n const dark = rng() < 0.5\n const baseHue = Math.round(rng() * 360)\n const count = Math.round(7 + 9 * params.scale * params.intensity)\n const blobs: { x: number; y: number; r: number; hx: number; hy: number; speed: number; hue: number; sat: number; lit: number }[] = []\n for (let i = 0; i < count; i++) {\n blobs.push({\n x: rng(), y: rng(),\n r: (0.22 + rng() * 0.6) * params.scale,\n hx: rng() * 4 - 2, hy: rng() * 4 - 2,\n speed: 0.05 + rng() * 0.1,\n hue: (baseHue + (rng() < 0.5 ? 30 : 180) + rng() * 60) % 360,\n sat: Math.round(45 + rng() * 50 * params.intensity),\n lit: dark ? Math.round(18 + rng() * 35 * params.intensity) : Math.round(60 + rng() * 25 * params.intensity),\n })\n }\n let t = 0\n const alpha = (0.22 + 0.3 * params.intensity).toFixed(3)\n const innerAlpha = (+alpha * 0.35).toFixed(3)\n const draw = () => {\n fitLiveCanvas(c)\n const w = c.width, h = c.height\n g.fillStyle = dark ? '#0a0b0e' : '#f5f7fa'\n g.fillRect(0, 0, w, h)\n for (const b of blobs) {\n const phase = t * b.speed\n const cx = (((b.x + noise(b.hx + phase * 0.3, b.hy) * 0.25 + phase * 0.03) % 1 + 1) % 1) * w\n const cy = (((b.y + noise(b.hx, b.hy + phase * 0.3) * 0.25 + phase * 0.012) % 1 + 1) % 1) * h\n const r = b.r * Math.min(w, h) * (0.8 + 0.4 * Math.sin(phase + b.hx))\n const rad = g.createRadialGradient(cx, cy, 0, cx, cy, r)\n rad.addColorStop(0, `hsla(${b.hue},${b.sat}%,${b.lit}%,${alpha})`)\n rad.addColorStop(0.55, `hsla(${b.hue},${Math.round(b.sat * 0.6)}%,${b.lit}%,${innerAlpha})`)\n rad.addColorStop(1, 'hsla(0,0%,0%,0)')\n g.fillStyle = rad\n g.fillRect(0, 0, w, h)\n }\n t += 0.028\n }\n return { canvas: c, ...newRaf(c, draw), snapshot: () => c.toDataURL('image/jpeg', 0.92) }\n}\n\n// ── Shader backgrounds (animated WebGL) ───────────────────────────────────────\nexport function createShaderBg(params: ShaderParams, canvas?: HTMLCanvasElement): { canvas: HTMLCanvasElement; stop: () => void; snapshot: () => string } {\n const c = canvas ?? createCanvas()\n fitLiveCanvas(c)\n const gl = c.getContext('webgl', { alpha: false }) || c.getContext('experimental-webgl', { alpha: false }) as WebGLRenderingContext | null\n if (!gl) return createMeshGradient({ type: 'mesh', seed: params.speed * 1000, scale: params.scale, intensity: 0.6 }, c)\n\n const vs = `\n attribute vec2 a_position;\n void main() { gl_Position = vec4(a_position, 0.0, 1.0); }\n `\n const program = createProgram(gl, vs, shaderFragment(params.preset))\n if (!program) return createMeshGradient({ type: 'mesh', seed: params.speed * 1000, scale: params.scale, intensity: 0.6 }, c)\n\n const posLoc = gl.getAttribLocation(program, 'a_position')\n const buf = gl.createBuffer()\n gl.bindBuffer(gl.ARRAY_BUFFER, buf)\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1]), gl.STATIC_DRAW)\n gl.enableVertexAttribArray(posLoc)\n gl.vertexAttribPointer(posLoc, 2, gl.FLOAT, false, 0, 0)\n gl.useProgram(program)\n const uRes = gl.getUniformLocation(program, 'u_resolution')\n const uTime = gl.getUniformLocation(program, 'u_time')\n const uScale = gl.getUniformLocation(program, 'u_scale')\n const uSeed = gl.getUniformLocation(program, 'u_seed')\n const seed01 = (params.seed >>> 0) / 0xffffffff\n let t = 0\n const draw = () => {\n fitLiveCanvas(c)\n gl.viewport(0, 0, c.width, c.height)\n gl.uniform2f(uRes, c.width, c.height)\n gl.uniform1f(uTime, t)\n gl.uniform1f(uScale, params.scale)\n gl.uniform1f(uSeed, seed01)\n gl.drawArrays(gl.TRIANGLES, 0, 6)\n t += 0.32 * params.speed\n }\n return { canvas: c, ...newRaf(c, draw), snapshot: () => c.toDataURL('image/jpeg', 0.95) }\n}\n\nfunction createProgram(gl: WebGLRenderingContext, vs: string, fs: string): WebGLProgram | null {\n const v = gl.createShader(gl.VERTEX_SHADER)\n const f = gl.createShader(gl.FRAGMENT_SHADER)\n if (!v || !f) return null\n gl.shaderSource(v, vs); gl.compileShader(v)\n gl.shaderSource(f, fs); gl.compileShader(f)\n if (!gl.getShaderParameter(v, gl.COMPILE_STATUS) || !gl.getShaderParameter(f, gl.COMPILE_STATUS)) {\n gl.deleteShader(v); gl.deleteShader(f)\n return null\n }\n const p = gl.createProgram()\n if (!p) return null\n gl.attachShader(p, v); gl.attachShader(p, f); gl.linkProgram(p)\n if (!gl.getProgramParameter(p, gl.LINK_STATUS)) { gl.deleteProgram(p); return null }\n return p\n}\n\nfunction shaderFragment(preset: ShaderParams['preset']): string {\n const common = `\n precision mediump float;\n uniform vec2 u_resolution;\n uniform float u_time;\n uniform float u_scale;\n uniform float u_seed;\n\n vec3 mod289(vec3 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }\n vec4 mod289(vec4 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }\n vec4 permute(vec4 x) { return mod289(((x*34.0)+1.0)*x); }\n vec4 taylorInvSqrt(vec4 r) { return 1.79284291400159 - 0.85373472095314 * r; }\n vec3 hueRotate(vec3 rgb, float angle) {\n float c = cos(angle), s = sin(angle);\n mat3 m = mat3(\n 0.299 + 0.701*c + 0.168*s, 0.587 - 0.587*c + 0.330*s, 0.114 - 0.114*c - 0.497*s,\n 0.299 - 0.299*c - 0.328*s, 0.587 + 0.413*c + 0.035*s, 0.114 - 0.114*c + 0.292*s,\n 0.299 - 0.300*c + 1.250*s, 0.587 - 0.588*c - 1.050*s, 0.114 + 0.886*c - 0.203*s\n );\n return rgb * m;\n }\n float snoise(vec3 v) {\n const vec2 C = vec2(1.0/6.0, 1.0/3.0);\n const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n vec3 i = floor(v + dot(v, C.yyy));\n vec3 x0 = v - i + dot(i, C.xxx);\n vec3 g = step(x0.yzx, x0.xyz);\n vec3 l = 1.0 - g;\n vec3 i1 = min(g.xyz, l.zxy);\n vec3 i2 = max(g.xyz, l.zxy);\n vec3 x1 = x0 - i1 + C.xxx;\n vec3 x2 = x0 - i2 + C.yyy;\n vec3 x3 = x0 - D.yyy;\n i = mod289(i);\n vec4 p = permute(permute(permute(\n i.z + vec4(0.0, i1.z, i2.z, 1.0))\n + i.y + vec4(0.0, i1.y, i2.y, 1.0))\n + i.x + vec4(0.0, i1.x, i2.x, 1.0));\n float n_ = 0.142857142857;\n vec3 ns = n_ * D.wyz - D.xzx;\n vec4 j = p - 49.0 * floor(p * ns.z * ns.z);\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_);\n vec4 x = x_ * ns.x + ns.yyyy;\n vec4 y = y_ * ns.x + ns.yyyy;\n vec4 h = 1.0 - abs(x) - abs(y);\n vec4 b0 = vec4(x.xy, y.xy);\n vec4 b1 = vec4(x.zw, y.zw);\n vec4 s0 = floor(b0)*2.0 + 1.0;\n vec4 s1 = floor(b1)*2.0 + 1.0;\n vec4 sh = -step(h, vec4(0.0));\n vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy;\n vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww;\n vec3 p0 = vec3(a0.xy, h.x);\n vec3 p1 = vec3(a0.zw, h.y);\n vec3 p2 = vec3(a1.xy, h.z);\n vec3 p3 = vec3(a1.zw, h.w);\n vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2,p2), dot(p3,p3)));\n p0 *= norm.x; p1 *= norm.y; p2 *= norm.z; p3 *= norm.w;\n vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n m = m * m;\n return 42.0 * dot(m*m, vec4(dot(p0,x0), dot(p1,x1), dot(p2,x2), dot(p3,x3)));\n }\n float fbm(vec3 p) {\n float v = 0.0, a = 0.5;\n for (int i = 0; i < 5; i++) {\n v += a * snoise(p);\n p *= 2.0; a *= 0.5;\n }\n return v;\n }\n `\n if (preset === 'aurora') {\n return common + `\n void main() {\n vec2 uv = gl_FragCoord.xy / u_resolution;\n float t = u_time;\n float n1 = fbm(vec3(uv * 2.5 * u_scale, t));\n float n2 = fbm(vec3(uv * 4.0 * u_scale + 7.0, t * 1.4));\n float n3 = fbm(vec3(uv * 1.2 * u_scale - 3.0, t * 0.7));\n float bands = smoothstep(0.15, 0.85, 0.5 + 0.5 * sin((uv.y + n3 * 0.08) * 8.0 + n1 * 1.5));\n vec3 c1 = vec3(0.03, 0.08, 0.14);\n vec3 c2 = vec3(0.05, 0.28, 0.32);\n vec3 c3 = vec3(0.18, 0.62, 0.42);\n vec3 c4 = vec3(0.55, 0.22, 0.52);\n vec3 c5 = vec3(0.85, 0.35, 0.25);\n vec3 col = mix(c1, c2, bands);\n col = mix(col, c3, smoothstep(0.25, 0.75, n1));\n col = mix(col, c4, smoothstep(0.45, 0.85, n2) * 0.75);\n col = mix(col, c5, smoothstep(0.7, 0.95, n2 + n1 * 0.3) * 0.45);\n col = hueRotate(col, u_seed * 6.28318530718);\n gl_FragColor = vec4(col, 1.0);\n }\n `\n }\n if (preset === 'nebula') {\n return common + `\n void main() {\n vec2 uv = gl_FragCoord.xy / u_resolution;\n float t = u_time * 0.8;\n float n = fbm(vec3(uv * 2.2 * u_scale, t));\n float n2 = fbm(vec3(uv * 5.0 * u_scale - 4.0, t * 0.65));\n float n3 = fbm(vec3(uv * 0.9 * u_scale + 2.0, t * 0.4));\n vec3 c1 = vec3(0.02, 0.02, 0.08);\n vec3 c2 = vec3(0.12, 0.04, 0.22);\n vec3 c3 = vec3(0.32, 0.10, 0.35);\n vec3 c4 = vec3(0.10, 0.18, 0.42);\n vec3 c5 = vec3(0.55, 0.30, 0.55);\n vec3 col = mix(c1, c2, smoothstep(-0.5, 0.6, n));\n col = mix(col, c3, smoothstep(0.15, 0.8, n2) * 0.75);\n col = mix(col, c4, smoothstep(0.35, 0.85, n + n3 * 0.3) * 0.55);\n col = mix(col, c5, smoothstep(0.6, 0.95, n2) * 0.35);\n col = hueRotate(col, u_seed * 6.28318530718);\n gl_FragColor = vec4(col, 1.0);\n }\n `\n }\n // noise\n return common + `\n void main() {\n vec2 uv = gl_FragCoord.xy / u_resolution;\n float t = u_time;\n float n = fbm(vec3(uv * 3.5 * u_scale, t));\n float n2 = fbm(vec3(uv * 9.0 * u_scale + 15.0, t * 1.6));\n float n3 = fbm(vec3(uv * 1.5 * u_scale - 5.0, t * 0.5));\n vec3 c1 = vec3(0.06, 0.06, 0.08);\n vec3 c2 = vec3(0.16, 0.18, 0.22);\n vec3 c3 = vec3(0.30, 0.32, 0.36);\n vec3 c4 = vec3(0.46, 0.48, 0.52);\n vec3 col = mix(c1, c2, 0.5 + 0.5 * n + n3 * 0.15);\n col = mix(col, c3, smoothstep(0.3, 0.8, n2) * 0.45);\n col = mix(col, c4, smoothstep(0.6, 0.95, n2) * 0.25);\n col = hueRotate(col, u_seed * 6.28318530718);\n gl_FragColor = vec4(col, 1.0);\n }\n `\n}\n\n// ── Geometric patterns (animated) ─────────────────────────────────────────────\nexport function createPatternBg(params: PatternParams, canvas?: HTMLCanvasElement): { canvas: HTMLCanvasElement; stop: () => void; snapshot: () => string } {\n if (params.preset === 'waves') return createWaves(params, canvas)\n if (params.preset === 'poly') return createLowPoly(params, canvas)\n return createDots(params, canvas)\n}\n\nfunction createDots(params: PatternParams, canvas?: HTMLCanvasElement): { canvas: HTMLCanvasElement; stop: () => void; snapshot: () => string } {\n const c = canvas ?? createCanvas()\n fitLiveCanvas(c)\n const g = c.getContext('2d', { alpha: false })!\n const rng = createRng(params.seed)\n const dark = rng() < 0.5\n const baseHue = Math.round(rng() * 360)\n const spacing = Math.max(26, 150 * params.scale / (0.25 + params.density))\n const dots: { cx: number; cy: number; r: number; hue: number; sat: number; lit: number; phase: number; speed: number }[] = []\n for (let y = 0; y < 8; y++) {\n for (let x = 0; x < 8; x++) {\n dots.push({\n cx: x / 7, cy: y / 7,\n r: spacing * 0.16 * params.scale * (0.6 + rng() * 0.7),\n hue: (baseHue + rng() * 80) % 360,\n sat: Math.round(35 + rng() * 55),\n lit: dark ? Math.round(30 + rng() * 35) : Math.round(55 + rng() * 30),\n phase: rng() * Math.PI * 2,\n speed: 0.5 + rng() * 1.2,\n })\n }\n }\n let t = 0\n const draw = () => {\n fitLiveCanvas(c)\n const w = c.width, h = c.height\n g.fillStyle = dark ? '#0a0b0d' : '#f6f7f9'\n g.fillRect(0, 0, w, h)\n for (const d of dots) {\n const pulse = 0.75 + 0.35 * Math.sin(t * d.speed + d.phase)\n const r = Math.max(1, d.r * pulse)\n const x = d.cx * w + (d.r * 0.3) * Math.sin(t * d.speed * 0.5 + d.phase)\n const y = d.cy * h + (d.r * 0.3) * Math.cos(t * d.speed * 0.7 + d.phase)\n g.beginPath()\n g.arc(x, y, r, 0, Math.PI * 2)\n g.fillStyle = `hsla(${d.hue},${d.sat}%,${d.lit}%,${(0.18 + 0.25 * pulse).toFixed(2)})`\n g.fill()\n }\n t += 0.032\n }\n return { canvas: c, ...newRaf(c, draw), snapshot: () => c.toDataURL('image/jpeg', 0.94) }\n}\n\nfunction createWaves(params: PatternParams, canvas?: HTMLCanvasElement): { canvas: HTMLCanvasElement; stop: () => void; snapshot: () => string } {\n const c = canvas ?? createCanvas()\n fitLiveCanvas(c)\n const g = c.getContext('2d', { alpha: false })!\n const rng = createRng(params.seed)\n const dark = rng() < 0.5\n const hue = Math.round(rng() * 360)\n const layers = Math.round(5 + params.density * 8)\n const waves: { yBase: number; amp: number; freq: number; phase: number; speed: number; hue: number; sat: number; lit: number; alpha: number }[] = []\n for (let i = 0; i < layers; i++) {\n waves.push({\n yBase: 0.25 + (i / layers) * 0.55,\n amp: (25 + rng() * 45) * params.scale,\n freq: (0.006 + rng() * 0.01) / params.scale,\n phase: rng() * Math.PI * 2,\n speed: (0.3 + rng() * 0.7) * (rng() < 0.5 ? 1 : -1),\n hue: (hue + i * 12) % 360,\n sat: Math.round(40 + rng() * 45),\n lit: dark ? Math.round(14 + (i / layers) * 32) : Math.round(72 - (i / layers) * 28),\n alpha: 0.22 + rng() * 0.32,\n })\n }\n let t = 0\n const draw = () => {\n fitLiveCanvas(c)\n const w = c.width, h = c.height\n g.fillStyle = dark ? '#07080a' : '#f8f9fb'\n g.fillRect(0, 0, w, h)\n for (const wave of waves) {\n g.beginPath()\n g.moveTo(0, h)\n for (let x = 0; x <= w; x += Math.max(6, Math.floor(w / 180))) {\n const y = h * wave.yBase\n + Math.sin(x * wave.freq + wave.phase + t * wave.speed) * wave.amp\n + Math.sin(x * wave.freq * 2.1 + wave.phase * 1.3 - t * wave.speed * 1.5) * wave.amp * 0.5\n g.lineTo(x, y)\n }\n g.lineTo(w, h)\n g.closePath()\n g.fillStyle = `hsla(${wave.hue},${wave.sat}%,${wave.lit}%,${wave.alpha.toFixed(2)})`\n g.fill()\n }\n t += 0.032\n }\n return { canvas: c, ...newRaf(c, draw), snapshot: () => c.toDataURL('image/jpeg', 0.94) }\n}\n\nfunction createLowPoly(params: PatternParams, canvas?: HTMLCanvasElement): { canvas: HTMLCanvasElement; stop: () => void; snapshot: () => string } {\n const c = canvas ?? createCanvas()\n fitLiveCanvas(c)\n const g = c.getContext('2d', { alpha: false })!\n const rng = createRng(params.seed)\n const dark = rng() < 0.5\n const hue = Math.round(rng() * 360)\n const cols = Math.round(10 + params.density * 20)\n const rows = Math.max(6, Math.round(cols * 0.65))\n const points: { x: number; y: number; dx: number; dy: number; speed: number }[][] = []\n for (let y = 0; y <= rows; y++) {\n const row: { x: number; y: number; dx: number; dy: number; speed: number }[] = []\n for (let x = 0; x <= cols; x++) {\n row.push({\n x: x / cols, y: y / rows,\n dx: (rng() - 0.5) * 0.02, dy: (rng() - 0.5) * 0.02,\n speed: 0.3 + rng() * 0.5,\n })\n }\n points.push(row)\n }\n const cells: { y: number; x: number; hue: number; sat: number; lit: number; phase: number }[] = []\n for (let y = 0; y < rows; y++) {\n for (let x = 0; x < cols; x++) {\n cells.push({ y, x, hue: (hue + rng() * 60) % 360, sat: Math.round(35 + rng() * 40), lit: dark ? Math.round(12 + rng() * 35) : Math.round(65 - rng() * 10), phase: rng() * Math.PI * 2 })\n }\n }\n let t = 0\n const px: { x: number; y: number }[][] = points.map(row => row.map(() => ({ x: 0, y: 0 })))\n const draw = () => {\n fitLiveCanvas(c)\n const w = c.width, h = c.height\n g.fillStyle = dark ? '#08090c' : '#f5f6f8'\n g.fillRect(0, 0, w, h)\n for (let y = 0; y <= rows; y++) {\n const row = points[y]!\n const out = px[y]!\n for (let x = 0; x <= cols; x++) {\n const p = row[x]!\n out[x]!.x = (p.x + Math.sin(t * p.speed + p.dx * 100) * p.dx) * w\n out[x]!.y = (p.y + Math.cos(t * p.speed + p.dy * 100) * p.dy) * h\n }\n }\n for (const cell of cells) {\n const p1 = px[cell.y]![cell.x]!, p2 = px[cell.y]![cell.x + 1]!, p3 = px[cell.y + 1]![cell.x]!, p4 = px[cell.y + 1]![cell.x + 1]!\n const cx = (p1.x + p2.x + p3.x) / 3 / w\n const lit = Math.max(0, Math.min(100, cell.lit + Math.sin(t * 0.6 + cell.phase) * 6))\n g.beginPath(); g.moveTo(p1.x, p1.y); g.lineTo(p2.x, p2.y); g.lineTo(p3.x, p3.y); g.closePath()\n g.fillStyle = `hsla(${cell.hue + cx * 40},${cell.sat}%,${lit}%,0.92)`\n g.fill()\n g.beginPath(); g.moveTo(p2.x, p2.y); g.lineTo(p4.x, p4.y); g.lineTo(p3.x, p3.y); g.closePath()\n g.fillStyle = `hsla(${(cell.hue + cx * 40 + 12) % 360},${cell.sat}%,${Math.max(0, lit - 4)}%,0.92)`\n g.fill()\n }\n t += 0.03\n }\n return { canvas: c, ...newRaf(c, draw), snapshot: () => c.toDataURL('image/jpeg', 0.94) }\n}\n\n// ── Dispatcher ────────────────────────────────────────────────────────────────\nexport function createDynamicBackground(params: GeneratedBgParams, canvas?: HTMLCanvasElement): { canvas: HTMLCanvasElement; stop: () => void; snapshot: () => string } {\n if (params.type === 'mesh') return createMeshGradient(params, canvas)\n if (params.type === 'shader') return createShaderBg(params, canvas)\n return createPatternBg(params, canvas)\n}\n\nfunction randomSeed(): number {\n return Math.floor(Math.random() * 0x7fffffff)\n}\n\n/** Build default params for a newly selected background type. */\nexport function defaultParamsFor(type: Exclude<GeneratedBgParams['type'], 'image'>): GeneratedBgParams {\n if (type === 'mesh') return { type: 'mesh', seed: randomSeed(), scale: 1.1, intensity: 0.65 }\n if (type === 'shader') return { type: 'shader', preset: 'aurora', speed: 0.35, scale: 1, seed: randomSeed() }\n return { type: 'pattern', preset: 'dots', density: 0.5, scale: 1, seed: randomSeed() }\n}\n\n// ── Static snapshot helpers ───────────────────────────────────────────────────\nconst STATIC_W = 1280\nconst STATIC_H = Math.round(STATIC_W * 9 / 16)\n\nfunction createStaticCanvas(): HTMLCanvasElement {\n const c = document.createElement('canvas')\n c.width = STATIC_W; c.height = STATIC_H\n c.dataset.dshAnyStatic = '1'\n return c\n}\n\nexport function renderMeshGradient(params: MeshGradientParams): string {\n const { stop, snapshot } = createMeshGradient(params, createStaticCanvas())\n stop()\n return snapshot()\n}\n\nexport function renderShader(params: ShaderParams): string {\n const { stop, snapshot } = createShaderBg(params, createStaticCanvas())\n stop()\n return snapshot()\n}\n\nexport function renderPattern(params: PatternParams): string {\n const { stop, snapshot } = createPatternBg(params, createStaticCanvas())\n stop()\n return snapshot()\n}\n\nexport function renderGeneratedBg(params: GeneratedBgParams): string {\n if (params.type === 'mesh') return renderMeshGradient(params)\n if (params.type === 'shader') return renderShader(params)\n return renderPattern(params)\n}","import { rWp, rWpImage, rBgState, rBl, rWop, rOps, rSop, rColor, rHasColor, rBlurs, cfg, setWpUrl, rBgDark, setBgDark } from './state'\nimport type { BackgroundType, GeneratedBgParams, PartOpacities, PartBlurs } from './types'\nimport { genTokens, toRgba, extractWallpaperColor, analyzeFrameDark } from './utils/color'\nimport { createDynamicBackground, defaultParamsFor } from './utils/bg-generators'\n\nlet wpEl: HTMLDivElement | null = null\nlet appliedTokenNames: string[] = []\nlet wpController: { canvas: HTMLCanvasElement; stop: () => void; snapshot: () => string } | null = null\nlet snapshotListener: (() => void) | null = null\nlet tokenStyleEl: HTMLStyleElement | null = null\n\nfunction clearDynamicBg(): void {\n wpController?.stop()\n wpController?.canvas.remove()\n wpController = null\n}\n\n/** Register a callback fired once a generated snapshot is ready (so the caller\n * can re-sync the settings preview / store). */\nexport function onGeneratedSnapshot(cb: () => void): void {\n snapshotListener = cb\n}\n\nfunction ensureTokenStyle(): HTMLStyleElement {\n if (tokenStyleEl?.isConnected) return tokenStyleEl\n tokenStyleEl = document.createElement('style')\n tokenStyleEl.dataset.plugin = 'dsh-any-background-tokens'\n document.head.appendChild(tokenStyleEl)\n return tokenStyleEl\n}\n\nfunction clearCustomTokens(): void {\n if (tokenStyleEl) tokenStyleEl.textContent = ''\n for (const name of appliedTokenNames) document.body.style.removeProperty(name)\n appliedTokenNames = []\n}\n\n/**\n * Write the saved color's full token set as inline variables on body — the\n * same write surface the theme presenter owns, but derived DIRECTLY from the\n * saved pick, so the theme color never depends on the theme service's active\n * state or the presenter's timing. The bg-base, sidebar and layer surfaces are\n * re-emitted at their per-part alpha; every other token (labels, borders,\n * brand) is written verbatim. No reads: nothing can observe a stale or reset\n * theme value and leave the homepage on the system color.\n */\n/** Label tokens flipped by the generated-background brightness verdict. */\nconst LABEL_TOKENS = [\n '--dsw-alias-label-primary',\n '--dsw-alias-label-secondary',\n '--dsw-alias-label-tertiary',\n '--dsw-alias-label-caption',\n '--dsw-alias-label-dimmed',\n '--dsw-alias-label-quaternary',\n]\n\nexport function applyCustomTokens(ops: PartOpacities): void {\n const [h, s, l] = rColor()\n let { tokens } = genTokens(h, s, l)\n try {\n // A generated background carries its own brightness verdict (analyzed once\n // per switch from a captured frame — never per-frame). It overrides ONLY\n // the font direction (dark frame → white labels, light frame → black) so\n // text stays readable over the animated background; every other token\n // keeps following the picked color. genTokens' result is cached and shared,\n // so clone before overriding.\n const dark = rBgDark()\n if (dark !== null) {\n tokens = { ...tokens }\n const font = dark ? '#fff' : '#000'\n for (const name of LABEL_TOKENS) tokens[name] = font\n }\n // Drive the base-palette switch ourselves so tokens the plugin does not\n // override (the input surface, masks, static tokens) follow the picked\n // color's dark/light scheme even while the theme service preference is\n // being adopted/reset.\n // Use a plugin-specific value so the gradient rule does not accidentally\n // match a dark-mode flag set by the host harness.\n if (dark ?? l < 0.55) document.body.setAttribute('data-ds-dark-theme', 'dsh-any-background')\n else document.body.removeAttribute('data-ds-dark-theme')\n // Write the tokens as a stylesheet rule with !important instead of inline\n // on body. The host's theme presenter clears body inline styles when it\n // adopts a built-in preference (observed on boot), which wipes inline\n // tokens for ~150ms and flashes the interface back to the system palette.\n // A stylesheet rule survives that clearing and, being !important, also\n // outranks the host's own non-important inline token writes.\n const decls: string[] = []\n for (const [name, value] of Object.entries(tokens)) {\n let v = value\n if (name === '--dsw-alias-bg-base') v = toRgba(value, ops.bg)\n else if (name === '--dsw-specific-sidebar-fill') v = toRgba(value, ops.sidebar)\n else if (name === '--dsw-alias-bg-layer-1' || name === '--dsw-alias-bg-layer-2' || name === '--dsw-alias-bg-layer-3') v = toRgba(value, ops.card)\n decls.push(`${name}:${v}!important`)\n }\n ensureTokenStyle().textContent = `body{${decls.join(';')}}`\n // Drop any inline tokens left by earlier builds so the stylesheet is the\n // single source of truth.\n for (const name of appliedTokenNames) document.body.style.removeProperty(name)\n appliedTokenNames = Object.keys(tokens)\n } catch (e) {\n // ignore\n }\n}\n\n// ── Settings panel opacity ─────────────────────────────────────────────────────\n// The settings modal is the only aria-modal dialog that identifies itself with\n// aria-labelledby (ui-primitives' Modal and the image lightbox use aria-label),\n// so this selector scopes the translucency to the settings panel alone. The\n// panel surface is --dsw-alias-bg-layer-2, resolved here from body's computed\n// style (the theme presenter writes custom-theme tokens inline on body; the\n// base palettes declare the alias in the stylesheets) and re-emitted with an\n// alpha through a plugin-owned variable, so the panel keeps its current color\n// while fading toward whatever sits behind the modal.\n\nconst SETTINGS_PANEL_SEL = '[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby]'\nexport const SETTINGS_STYLE_RULE = `${SETTINGS_PANEL_SEL}{background:var(--dsh-any-bg-settings-surface,var(--dsw-alias-bg-layer-2));backdrop-filter:var(--dsh-any-blur-settings,none)}`\n\nexport function applySettingsOverrides(op: number): void {\n if (op >= 1) {\n document.documentElement.style.removeProperty('--dsh-any-bg-settings-surface')\n return\n }\n // No saved color → the panel keeps the host surface; nothing to tint.\n if (!rHasColor()) return\n // Derive the panel surface from the saved color's layer-2 token (not a\n // computed-style read), so the settings panel matches the homepage tint\n // without depending on the presenter or theme state.\n const [h, s, l] = rColor()\n const layer2 = genTokens(h, s, l).tokens['--dsw-alias-bg-layer-2']\n if (layer2 !== undefined) {\n document.documentElement.style.setProperty('--dsh-any-bg-settings-surface', toRgba(layer2, op))\n }\n}\n\n// ── Generated backgrounds & palette refresh ───────────────────────────────────\n\n/** Apply only the wallpaper layer (position, scale, opacity, blur) without\n * touching the theme color palette. Used when generated background parameters\n * change so the visual keeps updating without shifting the picked theme color. */\nfunction applyWallpaper(): void {\n applyWp()\n}\n\n/** Re-apply the current theme/wallpaper state. Since genTokens now derives\n * everything directly from the saved HSL pick, no palette refresh is needed. */\nexport function refreshPaletteAndApply(): void {\n applyWp()\n}\n\n/** Apply the theme color. If the user has an explicit saved pick we use it\n * directly; otherwise we fall back to extracting a dominant color from the\n * current wallpaper (one HSL sample, no palette), so new uploads still get a\n * matching theme automatically. */\nexport function applyThemeColor(): void {\n if (rHasColor()) {\n applyWp()\n return\n }\n const url = rWp()\n if (url) {\n void extractWallpaperColor(url, rBgState()).then(hsl => {\n if (hsl) cfg.color = hsl\n applyWp()\n })\n } else {\n applyWp()\n }\n}\n\n/** Switch the background source type. For generated types a new live canvas is\n * attached to the wallpaper layer and a snapshot is kept for the store/preview. */\nexport function setBackgroundType(type: BackgroundType): void {\n cfg.backgroundType = type\n if (type === 'image') {\n // Restore the previously uploaded image (it is retained separately), remove\n // the live canvas, and point the display URL back at the image. The\n // generated-background brightness verdict no longer applies.\n clearDynamicBg()\n setBgDark(null)\n setWpUrl(rWpImage())\n applyThemeColor()\n return\n }\n // If we already have params for this generated type, keep them so switching\n // between generated sub-types does not wipe user adjustments.\n if (!cfg.generatedBg || cfg.generatedBg.type !== type) {\n cfg.generatedBg = defaultParamsFor(type)\n }\n applyGeneratedBg(cfg.generatedBg)\n}\n\nfunction randomSeed(): number {\n return Math.floor(Math.random() * 0x7fffffff)\n}\n\n/** Regenerate the current generated background with a new visual seed while\n * preserving the user's scale/intensity/speed/density/preset choices. */\nexport function regenerateGeneratedBg(): void {\n const params = cfg.generatedBg\n if (!params || cfg.backgroundType === 'image') return\n const next: GeneratedBgParams =\n params.type === 'mesh'\n ? { ...params, seed: randomSeed() }\n : { ...params, seed: randomSeed() }\n cfg.generatedBg = next\n applyGeneratedBg(next)\n}\n\n/** Update a generated background's parameters and re-render. */\nexport function updateGeneratedBg(params: GeneratedBgParams): void {\n cfg.backgroundType = params.type\n cfg.generatedBg = params\n applyGeneratedBg(params)\n}\n\nfunction applyGeneratedBg(params: GeneratedBgParams): void {\n clearDynamicBg()\n ensureWpContainer()\n wpController = createDynamicBackground(params)\n if (wpEl) {\n wpEl.style.backgroundImage = 'none'\n wpEl.appendChild(wpController.canvas)\n }\n // The canvas paints its first frame on the next animation tick; only then is\n // the snapshot meaningful for the settings preview and color picker. Capture\n // it after that frame and re-sync dependents. Do NOT refresh the palette here:\n // generated backgrounds should not overwrite the user's picked theme color.\n requestAnimationFrame(() => {\n if (!wpController) return\n const controller = wpController\n const frame = controller.snapshot()\n setWpUrl(frame)\n applyWallpaper()\n snapshotListener?.()\n // One-shot brightness verdict from the just-captured frame: decode +\n // average luma on a 32×32 canvas, then flip the font direction. Runs only\n // on switches — never in the animation loop — so there is zero per-frame\n // cost. While pending, the picked color's lightness keeps deciding fonts.\n setBgDark(null)\n void analyzeFrameDark(frame).then(dark => {\n if (dark === null || wpController !== controller) return\n setBgDark(dark)\n applyCustomTokens(rOps())\n })\n })\n}\n\n// ── Per-part interface blur ───────────────────────────────────────────────────\n// The three-column AppFrame (ui-layout) styles its columns with hashed\n// CSS-module classes, so the parts are located structurally instead: the shell\n// overlay carries a stable data attribute, and the sidebar/center/details\n// columns are its three preceding siblings inside the frame.\n//\n// backdrop-filter must NEVER be written directly onto a host part: any element\n// with a non-none backdrop-filter becomes the containing block for its\n// fixed-positioned descendants, and the host mounts the settings dialog inside\n// the AppFrame subtree (observed inside the sidebar column) — a direct blur\n// would lock that fixed dialog into the column box (\"settings window stuck in\n// the sidebar\"). Each blurred part instead carries an isolated ::before\n// underlay that holds the backdrop-filter, so the part itself never traps\n// fixed-positioned host UI.\nlet frameEl: HTMLElement | null = null\nlet sidebarEl: HTMLElement | null = null\nlet centerEl: HTMLElement | null = null\nlet detailsEl: HTMLElement | null = null\n\nconst PART_BLUR_CLASS = 'dab-part-blur'\nconst PART_UNDERLAY_CLASS = 'dab-part-underlay'\nconst PART_BLUR_RULE =\n `${PART_BLUR_CLASS}{isolation:isolate}` +\n `.${PART_UNDERLAY_CLASS}{position:absolute;inset:0;z-index:-1;pointer-events:none;border-radius:inherit;` +\n `backdrop-filter:var(--dsh-any-part-blur,none);-webkit-backdrop-filter:var(--dsh-any-part-blur,none)}`\n\nlet partBlurStyleEl: HTMLStyleElement | null = null\n\nfunction ensurePartBlurStyle(): void {\n if (partBlurStyleEl?.isConnected) return\n partBlurStyleEl = document.createElement('style')\n partBlurStyleEl.dataset.plugin = 'dsh-any-background-parts'\n partBlurStyleEl.textContent = PART_BLUR_RULE\n document.head.appendChild(partBlurStyleEl)\n}\n\nfunction discoverParts(): void {\n const overlay = document.querySelector<HTMLElement>('[data-shell-overlay]')\n if (overlay === null) return\n const frame = overlay.parentElement\n if (frame === null) return\n frameEl = frame\n const idx = Array.from(frame.children).indexOf(overlay)\n sidebarEl = (frame.children[idx - 3] as HTMLElement | undefined) ?? null\n centerEl = (frame.children[idx - 2] as HTMLElement | undefined) ?? null\n detailsEl = (frame.children[idx - 1] as HTMLElement | undefined) ?? null\n}\n\nfunction setBlur(el: HTMLElement | null, px: number): void {\n if (el === null) return\n const underlay = el.querySelector<HTMLDivElement>(`:scope > .${PART_UNDERLAY_CLASS}`)\n if (px > 0) {\n ensurePartBlurStyle()\n // The underlay is position:absolute and needs a positioned host: static\n // columns get relative (a layout no-op for flex items) that is restored on\n // clear; parts the host already positions keep their own scheme.\n if (!el.classList.contains(PART_BLUR_CLASS) && getComputedStyle(el).position === 'static') {\n el.style.position = 'relative'\n el.setAttribute('data-dab-pos-patched', '1')\n }\n el.classList.add(PART_BLUR_CLASS)\n if (underlay === null) {\n const node = document.createElement('div')\n node.className = PART_UNDERLAY_CLASS\n el.prepend(node)\n }\n el.style.setProperty('--dsh-any-part-blur', `blur(${px}px)`)\n } else {\n el.classList.remove(PART_BLUR_CLASS)\n el.style.removeProperty('--dsh-any-part-blur')\n underlay?.remove()\n if (el.getAttribute('data-dab-pos-patched') === '1') {\n el.style.removeProperty('position')\n el.removeAttribute('data-dab-pos-patched')\n }\n }\n}\n\nfunction applySettingsBlur(px: number): void {\n if (px > 0) document.documentElement.style.setProperty('--dsh-any-blur-settings', `blur(${px}px)`)\n else document.documentElement.style.removeProperty('--dsh-any-blur-settings')\n}\n\n/** Apply per-part interface blur to the AppFrame columns + settings panel. */\nexport function applyPartBlurs(blurs: PartBlurs): void {\n discoverParts()\n setBlur(frameEl, blurs.bg)\n setBlur(sidebarEl, blurs.sidebar)\n setBlur(centerEl, blurs.card)\n setBlur(detailsEl, blurs.card)\n applySettingsBlur(blurs.settings)\n}\n\n/** Live per-part blur update during slider drag (no full re-apply). */\nexport function setPartBlur(part: keyof PartBlurs, v: number): void {\n if (part === 'settings') { applySettingsBlur(v); return }\n discoverParts()\n if (part === 'bg') setBlur(frameEl, v)\n else if (part === 'sidebar') setBlur(sidebarEl, v)\n else { setBlur(centerEl, v); setBlur(detailsEl, v) }\n}\n\nlet partsObserver: MutationObserver | null = null\n\n/** Watch for the AppFrame mounting so persisted blurs land even when the shell\n * renders after this plugin's apply. Cheap: once all parts are found, the\n * callback returns. */\nexport function watchParts(): void {\n if (partsObserver !== null || typeof MutationObserver === 'undefined') return\n partsObserver = new MutationObserver(() => {\n if (frameEl !== null && sidebarEl !== null && centerEl !== null && detailsEl !== null && document.body.contains(frameEl)) return\n applyPartBlurs(rBlurs())\n })\n partsObserver.observe(document.body, { childList: true, subtree: true })\n}\n\nexport function stopWatchingParts(): void {\n partsObserver?.disconnect()\n partsObserver = null\n}\n\nfunction ensureWpContainer(): void {\n if (!wpEl || !document.body.contains(wpEl)) {\n wpEl = document.createElement('div')\n wpEl.style.cssText = 'position:fixed;inset:0;z-index:-1;pointer-events:none;overflow:hidden;'\n document.body.prepend(wpEl)\n }\n}\n\nfunction applyImageWp(url: string): void {\n clearDynamicBg()\n ensureWpContainer()\n const bg = rBgState()\n const next = `url(\"${url}\")`\n // Skip re-setting the background image when it is already in place. Re-setting\n // the same data URL makes the browser re-decode the image, which flashes the\n // wallpaper blank for a frame on boot re-applies.\n if (wpEl!.style.backgroundImage !== next) {\n wpEl!.style.backgroundImage = next\n wpEl!.style.backgroundRepeat = 'no-repeat'\n }\n if (bg.iw > 0) {\n // Saved placement: contain-fit at zoom with the image CENTER pinned to\n // the committed fractional viewport point (x, y are center fractions,\n // 0.5 = viewport center — the editor commits the same anchor), so the\n // framed region survives viewport changes: window moves between screens,\n // aspect-ratio changes, and panel splitters re-derive a consistent view.\n const fit = Math.min(window.innerWidth / bg.iw, window.innerHeight / bg.ih)\n const w = bg.iw * fit * bg.zoom\n const h = bg.ih * fit * bg.zoom\n wpEl!.style.backgroundSize = `${w}px ${h}px`\n wpEl!.style.backgroundPosition = `${bg.x * window.innerWidth - w / 2}px ${bg.y * window.innerHeight - h / 2}px`\n } else {\n // Fresh image: match the editor's initial centered contain view.\n wpEl!.style.backgroundSize = 'contain'\n wpEl!.style.backgroundPosition = 'center'\n }\n applyWpEffects()\n}\n\nfunction applyWpEffects(): void {\n if (!wpEl) return\n const blur = rBl()\n wpEl.style.filter = blur > 0 ? `blur(${blur}px)` : 'none'\n wpEl.style.opacity = String(rWop())\n}\n\nexport function applyWp(): void {\n const url = rWp()\n if (cfg.backgroundType !== 'image' && cfg.generatedBg) {\n // Generated backgrounds are live canvases. If one is not active yet,\n // create it from the saved params (happens on boot or after import).\n if (!wpController) {\n applyGeneratedBg(cfg.generatedBg)\n return\n }\n ensureWpContainer()\n if (wpController.canvas.parentElement !== wpEl) wpEl!.appendChild(wpController.canvas)\n applyWpEffects()\n } else if (url) {\n applyImageWp(url)\n } else {\n // No background: tear down the layer but keep tokens/blur intact.\n clearDynamicBg()\n wpEl?.remove(); wpEl = null\n }\n // Theme color + per-part opacities: write the full token set inline\n // (self-contained), then the settings panel surface + per-part blur.\n // Only write tokens when there is a color to derive them from (a saved pick,\n // or a generated background whose brightness verdict is known). On boot the\n // persisted state has not loaded yet, so rColor() falls back to the default\n // blue and would flash the whole interface before the saved color lands.\n if (rHasColor() || rBgDark() !== null) {\n applyCustomTokens(rOps())\n }\n if (rHasColor()) {\n applySettingsOverrides(rSop())\n }\n applyPartBlurs(rBlurs())\n}\n\nexport function teardownWp(): void {\n clearDynamicBg()\n setBgDark(null)\n wpEl?.remove(); wpEl = null\n clearCustomTokens()\n tokenStyleEl?.remove(); tokenStyleEl = null\n document.documentElement.style.removeProperty('--dsh-any-bg-settings-surface')\n document.documentElement.style.removeProperty('--dsh-any-blur-settings')\n setBlur(frameEl, 0); setBlur(sidebarEl, 0); setBlur(centerEl, 0); setBlur(detailsEl, 0)\n stopWatchingParts()\n}\n\n/** Live wallpaper-opacity updates during slider drag (no full re-apply). */\nexport function setWpOpacity(v: number): void {\n if (wpEl) wpEl.style.opacity = String(v)\n}\n\n/** Live wallpaper-blur updates during slider drag (no full re-apply). */\nexport function setWpBlur(v: number): void {\n if (wpEl) wpEl.style.filter = v > 0 ? `blur(${v}px)` : 'none'\n}\n","/**\n * dsh-any-background — settings UI design system.\n *\n * The section is styled entirely through these scoped classes instead of the\n * host's inline-style approach: animations (page transitions, staggered\n * reveals, the rotating orb ring) and pseudo-element effects cannot be\n * expressed as React inline styles. Every color reads the host's\n * --dsw-alias-* tokens so the panel follows the user's custom theme color and\n * light/dark scheme automatically; `color-mix` tints carry a plain-token\n * fallback first for older engines.\n */\nexport const NAV_ITEM_H = 38\nexport const NAV_GAP = 4\n\nexport const UI_CSS = `\n/* The section is rendered INLINE inside the host settings dialog's content\n * column: the host provides the modal chrome (backdrop, centering, closing).\n * These classes style only the embedded shell; transient fixed layers (toast,\n * color picker, background editor) escape through Portals on <html>. */\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}\n.dab-root *,.dab-root *::before,.dab-root *::after{box-sizing:border-box}\n.dab-root button{font-family:inherit}\n\n/* ── shell: nav rail + page body ─────────────────────────────────────────── */\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}\n.dab-nav{position:sticky;top:0;display:flex;flex-direction:column;gap:18px}\n.dab-brand{display:flex;align-items:center;gap:10px;padding:2px 6px}\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)}\n.dab-brand-name{font-size:13px;font-weight:650;letter-spacing:.01em;line-height:1.25}\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}\n.dab-nav-list{position:relative;display:flex;flex-direction:column;gap:${NAV_GAP}px}\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)}\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}\n.dab-nav-item:hover{color:var(--dsw-alias-label-primary)}\n.dab-nav-item.is-active{color:var(--dsw-alias-brand-primary);font-weight:600}\n.dab-nav-item svg{flex:none;transition:transform .3s cubic-bezier(.34,1.56,.64,1)}\n.dab-nav-item:hover svg{transform:scale(1.14) rotate(-5deg)}\n\n/* ── page chrome ─────────────────────────────────────────────────────────── */\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}\n.dab-head{margin:2px 0 5px}\n.dab-overline{font-size:10.5px;font-weight:700;letter-spacing:.18em;text-transform:uppercase;color:var(--dsw-alias-brand-primary);opacity:.9}\n.dab-h1{margin:4px 0 0;font-size:21px;font-weight:700;letter-spacing:-.01em}\n.dab-desc{margin:6px 0 0;font-size:12.5px;line-height:1.55;color:var(--dsw-alias-label-tertiary);max-width:56ch}\n.dab-card{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);border-radius:16px;padding:18px}\n.dab-card-hover{transition:transform .28s ease,box-shadow .28s ease,border-color .28s ease}\n.dab-card-hover:hover{transform:translateY(-2px);box-shadow:0 10px 28px -12px rgba(0,0,0,.28)}\n.dab-rise{animation:dab-rise-in .55s cubic-bezier(.22,1,.36,1) both;animation-delay:calc(var(--d,0) * 62ms)}\n\n/* ── accent hero (color orb) ─────────────────────────────────────────────── */\n.dab-hero-accent{display:flex;align-items:center;gap:24px;flex-wrap:wrap}\n.dab-orb-wrap{position:relative;width:118px;height:118px;flex:none}\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}\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}\n.dab-hex-caption{font-size:11px;color:var(--dsw-alias-label-tertiary);letter-spacing:.04em}\n.dab-hex{font-family:var(--dab-mono);font-size:24px;font-weight:600;letter-spacing:.02em;line-height:1.2;margin-top:2px}\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)}\n.dab-hsl-row b{font-weight:600;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\n\n/* ── swatches ────────────────────────────────────────────────────────────── */\n.dab-swatch-title{font-size:12px;font-weight:600;margin-bottom:10px;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\n.dab-swatches{display:flex;flex-wrap:wrap;gap:9px}\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}\n.dab-swatch:hover{transform:scale(1.2)}\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)}\n\n/* ── wheel card ──────────────────────────────────────────────────────────── */\n.dab-wheel-card{position:relative;display:flex;align-items:center;justify-content:center;gap:28px;flex-wrap:wrap;padding:24px 18px}\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}\n.dab-wheel{position:relative;cursor:crosshair;border-radius:50%;box-shadow:0 12px 32px -14px rgba(0,0,0,.4)}\n.dab-hint{font-size:11.5px;line-height:1.55;color:var(--dsw-alias-label-tertiary);padding:0 4px}\n\n/* ── precise color inputs ────────────────────────────────────────────────── */\n.dab-inputs{display:flex;flex-direction:column;gap:10px;min-width:172px}\n.dab-field{display:flex;align-items:center;gap:8px}\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)}\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}\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)}\n.dab-num::-webkit-outer-spin-button,.dab-num::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}\n.dab-num{-moz-appearance:textfield;appearance:textfield}\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}\n.dab-swatch-lg:hover{transform:scale(1.02)}\n\n/* ── buttons & chips ─────────────────────────────────────────────────────── */\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}\n.dab-btn:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 5px 14px -6px rgba(0,0,0,.32)}\n.dab-btn:active:not(:disabled){transform:translateY(0) scale(.97);box-shadow:none}\n.dab-btn:disabled{opacity:.5;cursor:not-allowed}\n.dab-btn-primary{background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-text);border-color:transparent}\n.dab-btn-danger{color:var(--dsw-alias-state-error-primary)}\n.dab-btn-ghost{background:transparent;border-color:transparent;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\n.dab-btn-ghost:hover:not(:disabled){background:var(--dsw-alias-bg-layer-2);box-shadow:none}\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}\n.dab-chip-row{display:flex;flex-wrap:wrap;gap:8px}\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}\n.dab-chip:hover{border-color:var(--dsw-alias-brand-primary);color:var(--dsw-alias-label-primary)}\n.dab-chip.is-active{background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-text);border-color:transparent}\n\n/* ── sliders ─────────────────────────────────────────────────────────────── */\n.dab-slider-block{display:flex;flex-direction:column;gap:6px}\n.dab-slider-block + .dab-slider-block{margin-top:13px}\n.dab-slider-label{font-size:12px;font-weight:550;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\n.dab-slider-val{font-family:var(--dab-mono);font-size:11px;color:var(--dsw-alias-label-tertiary);min-width:44px;text-align:right}\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}\n.dab-slider:hover{height:5px}\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)}\n.dab-slider:hover::-webkit-slider-thumb,.dab-slider:focus-visible::-webkit-slider-thumb{transform:scale(1.22)}\n.dab-slider:active::-webkit-slider-thumb{transform:scale(1.34)}\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)}\n\n/* ── interface part cards ────────────────────────────────────────────────── */\n.dab-grid-parts{display:grid;grid-template-columns:repeat(auto-fill,minmax(256px,1fr));gap:13px}\n.dab-part-head{display:flex;align-items:center;gap:11px;margin-bottom:14px}\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)}\n.dab-part-name{font-size:13.5px;font-weight:600}\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}\n\n/* ── segmented control ───────────────────────────────────────────────────── */\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}\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)}\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}\n.dab-seg-item.is-active{color:var(--dsw-alias-label-primary);font-weight:600}\n\n/* ── toggle switch ───────────────────────────────────────────────────────── */\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}\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}\n.dab-toggle.is-on{background:var(--dsw-alias-brand-primary);border-color:var(--dsw-alias-brand-primary)}\n.dab-toggle.is-on .dab-toggle-knob{transform:translateX(18px);background:#fff}\n\n/* ── background preview hero ─────────────────────────────────────────────── */\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)}\n.dab-hero-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;transition:transform .5s cubic-bezier(.22,1,.36,1)}\n.dab-hero:hover .dab-hero-img{transform:scale(1.03)}\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}\n.dab-hero-empty:hover{border-color:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-primary)}\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)}\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}\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}\n.dab-hero:hover .dab-hero-veil{opacity:1;transform:none}\n.dab-hero-veil .dab-btn{background:rgba(255,255,255,.94);color:#14161a;border-color:transparent;height:30px;font-size:12px}\n.dab-hero-veil .dab-btn-danger{color:#dc2626}\n\n/* ── generated background type cards ─────────────────────────────────────── */\n.dab-types{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}\n.dab-type{position:relative;border:1.5px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:14px;padding:10px;cursor:pointer;text-align:left;font:inherit;transition:border-color .25s,transform .25s,box-shadow .25s}\n.dab-type:hover{transform:translateY(-2px)}\n.dab-type.is-active{border-color:var(--dsw-alias-brand-primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--dsw-alias-brand-primary) 18%,transparent)}\n.dab-type-thumb{height:62px;border-radius:9px;overflow:hidden;position:relative}\n.dab-type-name{margin-top:9px;font-size:12.5px;font-weight:600;color:var(--dsw-alias-label-primary)}\n.dab-type-desc{margin-top:2px;font-size:11px;color:var(--dsw-alias-label-tertiary);line-height:1.4}\n.dab-type-check{position:absolute;top:16px;right:16px;width:20px;height:20px;border-radius:50%;background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-text);display:grid;place-items:center;opacity:0;transform:scale(.4);transition:opacity .25s,transform .25s cubic-bezier(.34,1.56,.64,1)}\n.dab-type.is-active .dab-type-check{opacity:1;transform:none}\n.dab-thumb-mesh{background:radial-gradient(circle at 22% 30%,#f472b6,transparent 42%),radial-gradient(circle at 80% 22%,#38bdf8,transparent 46%),radial-gradient(circle at 52% 84%,#fbbf24,transparent 52%),#1e293b}\n.dab-thumb-shader{background:linear-gradient(120deg,#0ea5e9,#8b5cf6,#d946ef,#0ea5e9);background-size:300% 300%;animation:dab-flow 6s linear infinite}\n.dab-thumb-pattern{background-image:radial-gradient(circle,rgba(255,255,255,.92) 1.2px,transparent 1.4px);background-size:10px 10px;background-color:#334155}\n\n/* ── seed row ────────────────────────────────────────────────────────────── */\n.dab-seed{display:flex;align-items:center;gap:13px;padding:12px 14px;border-radius:12px;background:var(--dsw-alias-bg-layer-2);margin-top:14px}\n.dab-seed-ico{color:var(--dsw-alias-brand-primary);display:grid;place-items:center}\n.dab-seed-txt{flex:1;min-width:0}\n.dab-seed-title{font-size:12.5px;font-weight:600;display:flex;align-items:center;gap:6px}\n.dab-seed-desc{font-size:11px;color:var(--dsw-alias-label-tertiary);margin-top:2px}\n.dab-spin{animation:dab-rotate .7s cubic-bezier(.3,.7,.3,1) 1}\n\n/* ── profile page ────────────────────────────────────────────────────────── */\n.dab-profile-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(238px,1fr));gap:13px}\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)}\n.dab-profile-title{font-size:14px;font-weight:650}\n.dab-profile-desc{font-size:12px;color:var(--dsw-alias-label-tertiary);line-height:1.55;margin:5px 0 15px}\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)}\n.dab-footer-mono{font-family:var(--dab-mono);letter-spacing:.02em}\n\n/* ── toast ───────────────────────────────────────────────────────────────── */\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}\n.dab-toast-ok{color:var(--dsw-alias-brand-primary);display:grid;place-items:center}\n.dab-toast-err{color:var(--dsw-alias-state-error-primary);display:grid;place-items:center}\n\n/* ── modals (editor / eyedropper / crash) ────────────────────────────────── */\n/* Pin to the viewport explicitly with vw/vh so ancestor padding/margins on\n * body cannot shift or clip the overlay; keep it above host sidebar chrome.\n * pointer-events:auto re-enables interaction: these overlays render inside a\n * Portal root that is pointer-events:none so it never blocks the page alone. */\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}\n.dab-overlay-title{color:#fff;font-size:15px;font-weight:600}\n.dab-overlay-hint{color:rgba(255,255,255,.62);font-size:12px}\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}\n.dab-overlay .dab-btn{background:rgba(255,255,255,.94);color:#14161a;border-color:transparent}\n.dab-overlay .dab-btn-primary{background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-text)}\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}\n.dab-crash-title{font-size:15px;font-weight:650}\n.dab-crash-desc{font-size:12px;color:var(--dsw-alias-label-tertiary);text-align:center;line-height:1.5}\n\n/* ── keyframes ───────────────────────────────────────────────────────────── */\n@keyframes dab-fade-in{from{opacity:0}to{opacity:1}}\n@keyframes dab-page-in{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}\n@keyframes dab-rise-in{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}\n@keyframes dab-orb-in{from{opacity:0;transform:scale(.82)}to{opacity:1;transform:none}}\n@keyframes dab-spin{to{transform:rotate(360deg)}}\n@keyframes dab-rotate{to{transform:rotate(360deg)}}\n@keyframes dab-toast-in{from{opacity:0;transform:translate(-50%,10px)}to{opacity:1;transform:translate(-50%,0)}}\n@keyframes dab-zoom-in{from{opacity:0;transform:scale(.94) translateY(8px)}to{opacity:1;transform:none}}\n@keyframes dab-flow{to{background-position:300% 50%}}\n\n/* ── responsive & motion preferences ─────────────────────────────────────── */\n@container (max-width:620px){\n .dab-shell{grid-template-columns:1fr;gap:14px}\n .dab-nav{position:static;flex-direction:row;align-items:center;justify-content:space-between;gap:10px}\n .dab-nav-list{flex-direction:row;overflow-x:auto;scrollbar-width:none}\n .dab-nav-list::-webkit-scrollbar{display:none}\n .dab-nav-ind{display:none}\n .dab-nav-item{flex:none;padding:0 10px}\n .dab-nav-item.is-active{background:var(--dsw-alias-bg-layer-2)}\n .dab-types{grid-template-columns:1fr}\n}\n@container (min-width:621px){\n .dab-shell{grid-template-columns:158px minmax(0,1fr);gap:26px}\n}\n@media (prefers-reduced-motion:reduce){\n .dab-root *,.dab-root *::before,.dab-root *::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}\n}\n`\n\nconst CSS_ID = 'dab-ui-css'\n\n/** Inject the design-system stylesheet once per document (HMR-safe). */\nexport function ensureUiCss(): void {\n if (typeof document === 'undefined') return\n let el = document.getElementById(CSS_ID) as HTMLStyleElement | null\n if (!el) {\n el = document.createElement('style')\n el.id = CSS_ID\n document.head.appendChild(el)\n }\n if (el.textContent !== UI_CSS) el.textContent = UI_CSS\n}\n","import type { ReactNode } from 'react'\n\n/** Sun glyph, migrated from @deepseek-ai/dsh-client-ui-primitives IconLightOutline16. */\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\"/>'\n\nexport function SunIcon({ size = 16, className }: { size?: number; className?: string }) {\n return (\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 }} />\n )\n}\n\nfunction Glyph({ children, size = 16, className }: { children: ReactNode; size?: number; className?: string }) {\n return (\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\">\n {children}\n </svg>\n )\n}\n\nexport const DropletIcon = ({ size, className }: { size?: number; className?: string }) => (\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>\n)\n\nexport const LayersIcon = ({ size, className }: { size?: number; className?: string }) => (\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>\n)\n\nexport const PhotoIcon = ({ size, className }: { size?: number; className?: string }) => (\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>\n)\n\nexport const SlidersIcon = ({ size, className }: { size?: number; className?: string }) => (\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>\n)\n\nexport const SparkleIcon = ({ size, className }: { size?: number; className?: string }) => (\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>\n)\n\nexport const RefreshIcon = ({ size, className }: { size?: number; className?: string }) => (\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>\n)\n\nexport const DownloadIcon = ({ size, className }: { size?: number; className?: string }) => (\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>\n)\n\nexport const UploadIcon = ({ size, className }: { size?: number; className?: string }) => (\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>\n)\n\nexport const LockIcon = ({ size, className }: { size?: number; className?: string }) => (\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>\n)\n\nexport const TrashIcon = ({ size, className }: { size?: number; className?: string }) => (\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>\n)\n\nexport const EditIcon = ({ size, className }: { size?: number; className?: string }) => (\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>\n)\n\nexport const PipetteIcon = ({ size, className }: { size?: number; className?: string }) => (\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>\n)\n\nexport const CheckIcon = ({ size, className }: { size?: number; className?: string }) => (\n <Glyph size={size} className={className}><path d=\"M3.2 8.6l3 3L12.8 5\" /></Glyph>\n)\n\nexport const AlertIcon = ({ size, className }: { size?: number; className?: string }) => (\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>\n)\n\nexport const CanvasIcon = ({ size, className }: { size?: number; className?: string }) => (\n <Glyph size={size} className={className}><rect x=\"2.2\" y=\"2.2\" width=\"11.6\" height=\"11.6\" rx=\"2\" /></Glyph>\n)\n\nexport const SidebarIcon = ({ size, className }: { size?: number; className?: string }) => (\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>\n)\n\nexport const ChatIcon = ({ size, className }: { size?: number; className?: string }) => (\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>\n)\n\nexport const GearIcon = ({ size, className }: { size?: number; className?: string }) => (\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>\n)\n\n","import { Component, type ReactNode } from 'react'\n\ninterface Props {\n t: (key: string) => string\n onReset?: () => void\n children: ReactNode\n}\n\ninterface State {\n error: Error | null\n}\n\n/**\n * Catches render errors from the theme section subtree (wheel, sliders, editor)\n * so a single bad state can never take down the whole settings panel. Shows a\n * compact fallback with a reset button; the reset re-renders the section with\n * the current saved config, which is enough to recover from most transient\n * failures (corrupt transient UI state, stale image decode, etc.).\n */\nexport class ErrorBoundary extends Component<Props, State> {\n override state: State = { error: null }\n\n static getDerivedStateFromError(error: Error): State {\n return { error }\n }\n\n override componentDidCatch(error: Error, info: { componentStack?: string | null }): void {\n console.error('dsh-any-background: section render crashed', error, info.componentStack)\n }\n\n private reset = (): void => {\n this.setState({ error: null })\n this.props.onReset?.()\n }\n\n override render() {\n if (this.state.error) {\n return (\n <div className=\"dab-crash\">\n <div className=\"dab-crash-title\">{this.props.t('crashTitle')}</div>\n <div className=\"dab-crash-desc\">{this.props.t('crashDesc')}</div>\n <button type=\"button\" className=\"dab-btn\" onClick={this.reset}>{this.props.t('crashReset')}</button>\n </div>\n )\n }\n return this.props.children\n }\n}\n","import { useEffect, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\n\n/**\n * Render children into a fixed root attached to document.documentElement.\n *\n * The host's sidebar is often implemented by translating the body or a wrapper\n * (margin-left / transform). A fixed element portaled to body would still be\n * captured by that transformed ancestor and shift with the sidebar. Attaching\n * the portal root directly to <html> escapes body-level transforms so the\n * overlay is always painted relative to the viewport and centered correctly.\n */\nexport function Portal({ children }: { children: ReactNode }) {\n const [target, setTarget] = useState<HTMLElement | null>(null)\n useEffect(() => {\n const el = document.createElement('div')\n el.dataset.dabPortal = '1'\n el.style.cssText = 'position:fixed;inset:0;pointer-events:none;z-index:999999'\n document.documentElement.appendChild(el)\n setTarget(el)\n return () => { el.remove() }\n }, [])\n return target ? createPortal(children, target) : null\n}\n","import { useRef, useState, useEffect, useCallback, memo } from 'react'\n\nconst WHEEL_SIZE = 220\nconst CX = WHEEL_SIZE / 2\nconst RING_OUTER = 106\nconst RING_INNER = 82\n// Square inscribed in the ring's inner circle: half-side = RING_INNER / √2,\n// so the four corners sit exactly on the inner edge of the hue ring. The\n// exact (un-rounded) value keeps the corners tangent to the ring — a rounded\n// half-side would push the diagonals past the ring's inner boundary.\nconst SQ_HALF = RING_INNER / Math.SQRT2\n\n/** Static hue ring cached once across all wheels. */\nlet ringCache: HTMLCanvasElement | null = null\nfunction getRingCache(): HTMLCanvasElement {\n if (ringCache) return ringCache\n const cvs = document.createElement('canvas')\n cvs.width = WHEEL_SIZE; cvs.height = WHEEL_SIZE\n const c = cvs.getContext('2d')!\n // Instead of 360 separate arc paths, use a single conic gradient clipped to\n // the ring. This removes per-frame path overhead and anti-aliasing gaps.\n const g = c.createConicGradient(0, CX, CX)\n for (let i = 0; i <= 360; i++) g.addColorStop(i / 360, `hsl(${i},100%,50%)`)\n c.beginPath()\n c.arc(CX, CX, RING_OUTER, 0, Math.PI * 2)\n c.arc(CX, CX, RING_INNER, 0, Math.PI * 2, true)\n c.fillStyle = g\n c.fill()\n ringCache = cvs\n return ringCache\n}\n\nfunction drawMarkers(ctx: CanvasRenderingContext2D, hue: number, sat: number, lit: number): void {\n // Hue marker on ring. Canvas math angles (0 = +x / \"3 o'clock\", positive =\n // toward +y) directly match the conic-gradient hue distribution drawn in\n // getRingCache (colorStop i/360 → hsl(i)), so NO extra ±90° shift is applied.\n // A shift would rotate the picker's indication 90° away from the rendered\n // gradient (e.g. picking the top of the wheel would report red while the\n // pixels there are blue). hue 0 sits at the right edge, +90° at the bottom.\n const hRad = hue * Math.PI / 180\n const hR = (RING_OUTER + RING_INNER) / 2\n const hmx = CX + Math.cos(hRad) * hR\n const hmy = CX + Math.sin(hRad) * hR\n ctx.beginPath(); ctx.arc(hmx, hmy, 8, 0, Math.PI * 2)\n ctx.fillStyle = 'rgba(0,0,0,0.25)'; ctx.fill()\n ctx.beginPath(); ctx.arc(hmx, hmy, 6.5, 0, Math.PI * 2)\n ctx.strokeStyle = '#fff'; ctx.lineWidth = 2; ctx.stroke()\n\n // SL marker (HSV coordinates)\n const gx = CX - SQ_HALF, gy = CX - SQ_HALF, sz = SQ_HALF * 2\n const smx = gx + sat * sz\n const smy = gy + (1 - lit) * sz\n ctx.beginPath(); ctx.arc(smx, smy, 7, 0, Math.PI * 2)\n ctx.fillStyle = 'rgba(0,0,0,0.25)'; ctx.fill()\n ctx.beginPath(); ctx.arc(smx, smy, 5.5, 0, Math.PI * 2)\n ctx.strokeStyle = '#fff'; ctx.lineWidth = 2; ctx.stroke()\n ctx.beginPath(); ctx.arc(smx, smy, 3.5, 0, Math.PI * 2)\n ctx.strokeStyle = '#000'; ctx.lineWidth = 1; ctx.stroke()\n}\n\nfunction drawSquare(c: CanvasRenderingContext2D, hue: number): void {\n const gx = CX - SQ_HALF, gy = CX - SQ_HALF, sz = SQ_HALF * 2\n c.clearRect(gx - 1, gy - 1, sz + 2, sz + 2)\n c.fillStyle = '#fff'; c.fillRect(gx, gy, sz, sz)\n const gh = c.createLinearGradient(gx, 0, gx + sz, 0)\n gh.addColorStop(0, 'rgba(255,255,255,1)'); gh.addColorStop(1, `hsl(${hue},100%,50%)`)\n c.fillStyle = gh; c.fillRect(gx, gy, sz, sz)\n const gv = c.createLinearGradient(0, gy, 0, gy + sz)\n gv.addColorStop(0, 'rgba(0,0,0,0)'); gv.addColorStop(1, 'rgba(0,0,0,1)')\n c.fillStyle = gv; c.fillRect(gx, gy, sz, sz)\n}\n\nfunction hitTest(x: number, y: number): 'ring' | 'square' | null {\n if (Math.abs(x - CX) <= SQ_HALF && Math.abs(y - CX) <= SQ_HALF) return 'square'\n const dx = x - CX, dy = y - CX\n const dist = Math.sqrt(dx * dx + dy * dy)\n if (dist >= RING_INNER - 4 && dist <= RING_OUTER + 4) return 'ring'\n return null\n}\n\nfunction pickHue(x: number, y: number): number {\n // Inverse of drawMarkers: no ±90° shift, matching the conic gradient exactly.\n let angle = Math.atan2(y - CX, x - CX) * 180 / Math.PI\n if (angle < 0) angle += 360\n return angle\n}\n\nfunction pickSL(x: number, y: number): [number, number] {\n const gx = CX - SQ_HALF, gy = CX - SQ_HALF, sz = SQ_HALF * 2\n return [\n Math.max(0, Math.min(1, (x - gx) / sz)),\n Math.max(0.02, Math.min(0.98, 1 - (y - gy) / sz)),\n ]\n}\n\nexport const ColorWheel = memo(function ColorWheel({ hue, sat, lit, onChange }: {\n hue: number; sat: number; lit: number\n onChange: (h: number, s: number, l: number) => void\n}) {\n const cvsRef = useRef<HTMLCanvasElement>(null)\n const [col, setCol] = useState({ hue, sat, lit })\n const colRef = useRef(col)\n colRef.current = col\n\n // Adopt external changes (e.g. section remount after theme restore).\n useEffect(() => {\n setCol(c => (c.hue === hue && c.sat === sat && c.lit === lit ? c : { hue, sat, lit }))\n }, [hue, sat, lit])\n\n // Redraw only what changed. The static ring is copied from cache; the square\n // only redraws when hue changes; markers redraw on every value change.\n useEffect(() => {\n const cvs = cvsRef.current\n if (!cvs) return\n const ctx = cvs.getContext('2d')!\n ctx.clearRect(0, 0, WHEEL_SIZE, WHEEL_SIZE)\n // Draw the square first, then the ring on top: the ring's opaque pixels\n // cover the square's four corners (which are tangent to the ring's inner\n // edge), so the corners no longer visually overlap the hue ring.\n drawSquare(ctx, col.hue)\n ctx.drawImage(getRingCache(), 0, 0)\n drawMarkers(ctx, col.hue, col.sat, col.lit)\n }, [col])\n\n // Batch pointer updates in a single rAF so rapid mousemove events do not\n // trigger a React state flush + onChange on every pixel.\n const pendingRef = useRef<{ h: number; s: number; l: number } | null>(null)\n const rafRef = useRef<number | null>(null)\n const flushPending = useCallback(() => {\n rafRef.current = null\n const p = pendingRef.current\n if (!p) return\n pendingRef.current = null\n setCol({ hue: p.h, sat: p.s, lit: p.l })\n onChange(p.h, p.s, p.l)\n }, [onChange])\n\n const schedule = useCallback((h: number, s: number, l: number) => {\n pendingRef.current = { h, s, l }\n if (rafRef.current === null) rafRef.current = requestAnimationFrame(flushPending)\n }, [flushPending])\n\n const onDown = useCallback((e: React.MouseEvent<HTMLCanvasElement>) => {\n const r = cvsRef.current!.getBoundingClientRect()\n const x = e.clientX - r.left, y = e.clientY - r.top\n const region = hitTest(x, y)\n if (!region) return\n if (region === 'ring') {\n schedule(pickHue(x, y), colRef.current.sat, colRef.current.lit)\n } else {\n const [s, l] = pickSL(x, y)\n schedule(colRef.current.hue, s, l)\n }\n const onMove = (ev: MouseEvent) => {\n const rr = cvsRef.current!.getBoundingClientRect()\n const mx = ev.clientX - rr.left, my = ev.clientY - rr.top\n if (region === 'ring') {\n const d = Math.sqrt((mx - CX) ** 2 + (my - CX) ** 2)\n if (d >= RING_INNER - 10 && d <= RING_OUTER + 10) schedule(pickHue(mx, my), colRef.current.sat, colRef.current.lit)\n } else {\n const [s, l] = pickSL(mx, my)\n schedule(colRef.current.hue, s, l)\n }\n }\n const onUp = () => { document.removeEventListener('mousemove', onMove); document.removeEventListener('mouseup', onUp) }\n document.addEventListener('mousemove', onMove); document.addEventListener('mouseup', onUp)\n }, [schedule])\n\n return <canvas ref={cvsRef} width={WHEEL_SIZE} height={WHEEL_SIZE} className=\"dab-wheel\" onMouseDown={onDown} />\n})\n","import { useState, useEffect, useRef } from 'react'\nimport type { CSSProperties } from 'react'\nimport { hsvToHsl, hslToRgb, rgbToHsl, hslToHsv } from '../utils/color'\n\ntype Mode = 'hsl' | 'rgb'\n\nconst SEG_W = 66\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, v))\n}\n\n/**\n * A single numeric field that edits one color channel. Keeps its own text\n * while focused so typing never gets clobbered by the parent re-rendering the\n * canonical value; commits every valid keystroke live and re-normalizes on\n * blur. The value prop only pushes back in when the field is not focused\n * (wheel drags, wallpaper extraction, mode switches).\n */\nfunction NumField({ label, value, min, max, step, onChange }: {\n label: string; value: number; min: number; max: number; step: number\n onChange: (v: number) => void\n}) {\n const [text, setText] = useState(String(value))\n const focused = useRef(false)\n\n useEffect(() => {\n if (!focused.current) setText(String(value))\n }, [value])\n\n return (\n <label className=\"dab-field\">\n <span className=\"dab-field-label\">{label}</span>\n <input\n type=\"number\"\n min={min} max={max} step={step}\n value={text}\n className=\"dab-num\"\n onFocus={() => { focused.current = true }}\n onBlur={() => { focused.current = false; setText(String(value)) }}\n onChange={e => {\n setText(e.target.value)\n const v = Number(e.target.value)\n if (Number.isFinite(v)) onChange(clamp(v, min, max))\n }}\n />\n </label>\n )\n}\n\n/**\n * Precise color entry next to the wheel: a HSL/RGB segmented toggle plus three\n * numeric channel fields and a live swatch. The wheel is HSV end-to-end, so\n * this panel converts at the boundary — HSL fields map straight onto the\n * stored HSL, RGB fields round-trip through rgbToHsl — and both emit HSV via\n * the same onChange the wheel uses, keeping one canonical color.\n */\nexport function ColorInputs({ hue, sat, lit, onChange }: {\n hue: number; sat: number; lit: number\n onChange: (h: number, s: number, l: number) => void\n}) {\n const [mode, setMode] = useState<Mode>('hsl')\n const [h, s, l] = hsvToHsl(hue, sat, lit)\n const [r, g, b] = hslToRgb(h, s, l)\n\n const setHsl = (nh: number, ns: number, nl: number) => onChange(...hslToHsv(nh, ns, nl))\n const setRgb = (nr: number, ng: number, nb: number) => {\n const [nh, ns, nl] = rgbToHsl(nr, ng, nb)\n onChange(...hslToHsv(nh, ns, nl))\n }\n\n return (\n <div className=\"dab-inputs\">\n <div className=\"dab-seg\" style={{ '--w': `${SEG_W}px` } as CSSProperties}>\n <div className=\"dab-seg-thumb\" style={{ transform: `translateX(${mode === 'hsl' ? 0 : SEG_W}px)` }} />\n <button type=\"button\" className={`dab-seg-item${mode === 'hsl' ? ' is-active' : ''}`} onClick={() => setMode('hsl')}>HSL</button>\n <button type=\"button\" className={`dab-seg-item${mode === 'rgb' ? ' is-active' : ''}`} onClick={() => setMode('rgb')}>RGB</button>\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 7 }}>\n {mode === 'hsl' ? (\n <>\n <NumField label=\"H\" value={Math.round(h)} min={0} max={360} step={1} onChange={v => setHsl(v, s, l)} />\n <NumField label=\"S\" value={Math.round(s * 100)} min={0} max={100} step={1} onChange={v => setHsl(h, v / 100, l)} />\n <NumField label=\"L\" value={Math.round(l * 100)} min={0} max={100} step={1} onChange={v => setHsl(h, s, v / 100)} />\n </>\n ) : (\n <>\n <NumField label=\"R\" value={r} min={0} max={255} step={1} onChange={v => setRgb(v, g, b)} />\n <NumField label=\"G\" value={g} min={0} max={255} step={1} onChange={v => setRgb(r, v, b)} />\n <NumField label=\"B\" value={b} min={0} max={255} step={1} onChange={v => setRgb(r, g, v)} />\n </>\n )}\n </div>\n <div className=\"dab-swatch-lg\" style={{ background: `hsl(${Math.round(h)} ${Math.round(s * 100)}% ${Math.round(l * 100)}%)` }} />\n </div>\n )\n}\n","import { useRef, useState, useEffect, useCallback } from 'react'\nimport { rgbToHsl, hslToHsv } from '../utils/color'\nimport { Portal } from './Portal'\n\nconst MAG_SIZE = 96\nconst MAG_ZOOM = 8\n\nfunction toHex(rgb: [number, number, number]): string {\n return '#' + rgb.map(v => v.toString(16).padStart(2, '0')).join('')\n}\n\n/**\n * Eyedropper modal: shows the wallpaper full-bleed (no drag/zoom) and lets the\n * user click any pixel to adopt it as the theme color. A magnifier circle\n * follows the cursor so small details can be picked precisely. The wallpaper\n * is a data URL, so sampling is CORS-free: draw it once to an offscreen-sized\n * canvas and read pixels via getImageData.\n */\nexport function ColorPicker({ url, t, onPick, onClose }: {\n url: string\n t: (key: string) => string\n onPick: (hsv: [number, number, number]) => void\n onClose: () => void\n}) {\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const magRef = useRef<HTMLCanvasElement>(null)\n const imgRef = useRef<HTMLImageElement | null>(null)\n const [ready, setReady] = useState(false)\n const [hover, setHover] = useState<{ rgb: [number, number, number] } | null>(null)\n const [mag, setMag] = useState<{ x: number; y: number } | null>(null)\n\n useEffect(() => {\n const img = new Image()\n img.onload = () => { imgRef.current = img; setReady(true) }\n img.src = url\n }, [url])\n\n useEffect(() => {\n if (!ready || !canvasRef.current || !imgRef.current) return\n const canvas = canvasRef.current\n canvas.width = imgRef.current.naturalWidth\n canvas.height = imgRef.current.naturalHeight\n const ctx = canvas.getContext('2d')\n if (ctx) ctx.drawImage(imgRef.current, 0, 0)\n }, [ready])\n\n const sampleAt = useCallback((clientX: number, clientY: number) => {\n const canvas = canvasRef.current\n if (!canvas) return null\n const rect = canvas.getBoundingClientRect()\n if (rect.width === 0 || rect.height === 0) return null\n const ctx = canvas.getContext('2d')\n if (!ctx) return null\n const sx = Math.round((clientX - rect.left) * (canvas.width / rect.width))\n const sy = Math.round((clientY - rect.top) * (canvas.height / rect.height))\n if (sx < 0 || sy < 0 || sx >= canvas.width || sy >= canvas.height) return null\n const d = ctx.getImageData(sx, sy, 1, 1).data\n return { sx, sy, rgb: [d[0], d[1], d[2]] as [number, number, number] }\n }, [])\n\n const drawMagnifier = useCallback((sx: number, sy: number) => {\n const mag = magRef.current\n const src = canvasRef.current\n if (!mag || !src) return\n const ctx = mag.getContext('2d')\n if (!ctx) return\n const half = MAG_SIZE / MAG_ZOOM / 2\n ctx.clearRect(0, 0, MAG_SIZE, MAG_SIZE)\n ctx.drawImage(src, sx - half, sy - half, half * 2, half * 2, 0, 0, MAG_SIZE, MAG_SIZE)\n ctx.strokeStyle = 'rgba(255,255,255,0.85)'\n ctx.lineWidth = 1\n ctx.beginPath()\n ctx.moveTo(MAG_SIZE / 2, 0); ctx.lineTo(MAG_SIZE / 2, MAG_SIZE)\n ctx.moveTo(0, MAG_SIZE / 2); ctx.lineTo(MAG_SIZE, MAG_SIZE / 2)\n ctx.stroke()\n }, [])\n\n const onMove = (e: React.MouseEvent) => {\n const s = sampleAt(e.clientX, e.clientY)\n if (!s) { setHover(null); setMag(null); return }\n setHover({ rgb: s.rgb })\n drawMagnifier(s.sx, s.sy)\n const off = 28\n let x = e.clientX + off\n let y = e.clientY + off\n if (x + MAG_SIZE > window.innerWidth) x = e.clientX - off - MAG_SIZE\n if (y + MAG_SIZE > window.innerHeight) y = e.clientY - off - MAG_SIZE\n setMag({ x, y })\n }\n\n const onClick = (e: React.MouseEvent) => {\n const s = sampleAt(e.clientX, e.clientY)\n if (!s) return\n const [h, sl, l] = rgbToHsl(s.rgb[0], s.rgb[1], s.rgb[2])\n onPick(hslToHsv(h, sl, l))\n }\n\n return (\n <Portal>\n <div className=\"dab-overlay\">\n <div className=\"dab-overlay-title\">{t('pickerTitle')}</div>\n <div className=\"dab-overlay-hint\">{t('pickerHint')}</div>\n <div className=\"dab-modal-card\" style={{\n maxWidth: 'min(90vw, 720px)', maxHeight: '60vh', overflow: 'hidden',\n borderRadius: 12, border: '2px solid rgba(255,255,255,0.3)', background: '#000', cursor: 'crosshair',\n }}>\n <canvas ref={canvasRef} style={{ display: 'block', maxWidth: '100%', maxHeight: '60vh', objectFit: 'contain' }}\n onMouseMove={onMove}\n onMouseLeave={() => { setHover(null); setMag(null) }}\n onClick={onClick} />\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, minWidth: 260 }}>\n <div style={{ width: 28, height: 28, borderRadius: 8, border: '1px solid rgba(255,255,255,0.4)', background: hover ? toHex(hover.rgb) : 'transparent' }} />\n <div style={{ color: '#fff', fontSize: 13, fontFamily: 'var(--dab-mono, monospace)' }}>{hover ? `${toHex(hover.rgb)} · rgb(${hover.rgb.join(', ')})` : '—'}</div>\n </div>\n <div style={{ display: 'flex', gap: 10 }}>\n <button type=\"button\" className=\"dab-btn\" onClick={onClose}>{t('pickerClose')}</button>\n </div>\n <canvas ref={magRef} width={MAG_SIZE} height={MAG_SIZE}\n style={{\n position: 'fixed', width: MAG_SIZE, height: MAG_SIZE, borderRadius: '50%',\n border: '2px solid rgba(255,255,255,0.7)', boxShadow: '0 4px 16px rgba(0,0,0,0.5)',\n zIndex: 10000, background: '#000', pointerEvents: 'none', transition: 'opacity 0.08s',\n left: mag?.x ?? 0, top: mag?.y ?? 0, opacity: mag ? 1 : 0,\n }} />\n </div>\n </Portal>\n )\n}\n","import { useState } from 'react'\nimport type { CSSProperties } from 'react'\nimport type { ThemeSectionProps, ThemeStoreState } from '../../types'\nimport { hsvToHsl, hslToRgb, hslToHsv } from '../../utils/color'\nimport { ColorWheel } from '../ColorWheel'\nimport { ColorInputs } from '../ColorInputs'\nimport { ColorPicker } from '../ColorPicker'\nimport { PipetteIcon, SparkleIcon } from '../icons'\n\n/** Curated quick-pick hues (HSL, s .72 l .55). */\nconst SWATCHES: 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]\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 ColorPage({ p, notify }: { p: ThemeSectionProps; notify: (msg: string, ok?: boolean) => void }) {\n const { t, hue, sat, lit, setColor, extractColor, useStore } = p\n const store = useStore((s: ThemeStoreState) => s)\n const storeUrl = store.url\n const [pickerOpen, setPickerOpen] = useState(false)\n const [extracting, setExtracting] = useState(false)\n\n const wheel = (store.color ?? [hue, sat, lit]) as [number, number, number]\n const [h, s, l] = hsvToHsl(wheel[0], wheel[1], wheel[2])\n const [r, g, b] = hslToRgb(h, s, l)\n const hex = toHex([r, g, b])\n const soft = `rgba(${Math.round(r)},${Math.round(g)},${Math.round(b)},0.5)`\n const orbVars = { '--c': hex, '--c-soft': soft } as CSSProperties\n\n const onExtract = async () => {\n if (!storeUrl || extracting) return\n setExtracting(true)\n try {\n const ok = await extractColor()\n notify(ok ? t('extractDone') : t('extractFail'), ok)\n } catch {\n notify(t('extractFail'), false)\n } finally {\n setExtracting(false)\n }\n }\n\n return (\n <>\n <header className=\"dab-head dab-rise\" style={{ '--d': 0 } as CSSProperties}>\n <div className=\"dab-overline\">Accent</div>\n <h2 className=\"dab-h1\">{t('colorTitle')}</h2>\n <p className=\"dab-desc\">{t('descColor')}</p>\n </header>\n\n {/* Hero: living orb with a rotating conic halo + live HEX readout */}\n <section className=\"dab-card dab-card-hover dab-hero-accent dab-rise\" style={{ '--d': 1 } as CSSProperties}>\n <div className=\"dab-orb-wrap\" style={orbVars}>\n <div className=\"dab-orb-ring\" />\n <div className=\"dab-orb\" />\n </div>\n <div style={{ flex: 1, minWidth: 200 }}>\n <div className=\"dab-hex-caption\">{t('hexCaption')}</div>\n <div className=\"dab-hex\">{hex.toUpperCase()}</div>\n <div className=\"dab-hsl-row\">\n <span>H <b>{Math.round(h)}°</b></span>\n <span>S <b>{Math.round(s * 100)}%</b></span>\n <span>L <b>{Math.round(l * 100)}%</b></span>\n </div>\n <div className=\"dab-chip-row\" style={{ marginTop: 14 }}>\n <button type=\"button\" className=\"dab-btn\" disabled={!storeUrl || extracting} onClick={onExtract}>\n <SparkleIcon size={14} />{extracting ? t('extracting') : t('extractColor')}\n </button>\n <button type=\"button\" className=\"dab-btn\" disabled={!storeUrl} onClick={() => setPickerOpen(true)}>\n <PipetteIcon size={14} />{t('eyedropper')}\n </button>\n </div>\n </div>\n </section>\n\n {/* Wheel + precise entry */}\n <section className=\"dab-card dab-wheel-card dab-rise\" style={{ '--d': 2 } as CSSProperties}>\n <div className=\"dab-wheel-glow\" style={{ background: hex }} />\n <ColorWheel hue={wheel[0]} sat={wheel[1]} lit={wheel[2]} onChange={setColor} />\n <ColorInputs hue={wheel[0]} sat={wheel[1]} lit={wheel[2]} onChange={setColor} />\n </section>\n <p className=\"dab-hint dab-rise\" style={{ '--d': 3 } as CSSProperties}>{t('colorHint')}</p>\n\n {/* Quick swatches */}\n <section className=\"dab-card dab-card-hover dab-rise\" style={{ '--d': 3 } as CSSProperties}>\n <div className=\"dab-swatch-title\">{t('swatchTitle')}</div>\n <div className=\"dab-swatches\">\n {SWATCHES.map(([sh, ss, sl], i) => {\n // Circular hue distance via the (Δ+540)%360 trick. A swatch is \"on\"\n // only when the current color actually matches it (hue within 3°,\n // sat/lightness within 0.05). Picking a custom color in the wheel\n // clears the swatch selection instead of keeping it highlighted\n // based on hue proximity alone.\n const dist = Math.abs(((wheel[0] - sh + 540) % 360) - 180)\n const on = dist < 3 && Math.abs(s - ss) < 0.05 && Math.abs(l - sl) < 0.05\n return (\n <button\n key={i} type=\"button\"\n className={`dab-swatch${on ? ' is-on' : ''}`}\n style={{ background: `hsl(${sh} ${Math.round(ss * 100)}% ${Math.round(sl * 100)}%)` }}\n title={toHex(hslToRgb(sh, ss, sl)).toUpperCase()}\n onClick={() => setColor(...hslToHsv(sh, ss, sl))} />\n )\n })}\n </div>\n </section>\n\n {/* Eyedropper modal */}\n {pickerOpen && storeUrl ? (\n <ColorPicker url={storeUrl} t={t} onClose={() => setPickerOpen(false)}\n onPick={hsv => { setColor(hsv[0], hsv[1], hsv[2]); setPickerOpen(false) }} />\n ) : null}\n </>\n )\n}\n","import { useEffect, useRef } from 'react'\nimport type { CSSProperties } from 'react'\n\n/**\n * Zero-lag slider: the thumb and value label update through DOM refs while\n * dragging (onInput) so the caller can mutate the live UI directly without a\n * React re-render; onChange commits the settled value. Double-click resets to\n * the canonical default. The track fill is a gradient driven by the --pct\n * custom property, updated imperatively alongside the thumb.\n */\nexport function LiveSlider({ min, max, step, def, fmt, label, onInput, onChange }: {\n min: number; max: number; step: number; def: number\n fmt: (v: number) => string; label?: string; onInput: (v: number) => void; onChange: (v: number) => void\n}) {\n const inputRef = useRef<HTMLInputElement>(null)\n const valRef = useRef<HTMLSpanElement>(null)\n\n const paint = (el: HTMLInputElement, v: number): void => {\n el.style.setProperty('--pct', String(((v - min) / (max - min)) * 100))\n }\n\n // Controlled sync: keep the knob and label aligned with the canonical prop\n // so external updates (presets, regeneration, imports) never leave it stale.\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.value = String(def)\n paint(inputRef.current, def)\n }\n if (valRef.current) valRef.current.textContent = fmt(def)\n }, [def, fmt, min, max])\n\n const apply = (v: number): void => {\n if (inputRef.current) {\n inputRef.current.value = String(v)\n paint(inputRef.current, v)\n }\n if (valRef.current) valRef.current.textContent = fmt(v)\n onInput(v)\n onChange(v)\n }\n\n return (\n <div className=\"dab-slider-block\">\n {label ? <span className=\"dab-slider-label\">{label}</span> : null}\n <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>\n <input\n ref={inputRef} type=\"range\" className=\"dab-slider\"\n style={{ '--pct': ((def - min) / (max - min)) * 100 } as CSSProperties}\n min={min} max={max} step={step} defaultValue={def}\n title={label ? `${label} · ${fmt(def)}` : fmt(def)}\n onDoubleClick={() => apply(def)}\n onInput={e => {\n const el = e.target as HTMLInputElement\n const v = Number(el.value)\n paint(el, v)\n onInput(v)\n if (valRef.current) valRef.current.textContent = fmt(v)\n }}\n onChange={e => onChange(Number((e.target as HTMLInputElement).value))} />\n <span ref={valRef} className=\"dab-slider-val\">{fmt(def)}</span>\n </div>\n </div>\n )\n}\n","import type { CSSProperties, ComponentType } from 'react'\nimport type { ThemeSectionProps, PartOpacities, PartBlurs } from '../../types'\nimport { cfg, rOps, rSop, rBlurs } from '../../state'\nimport { saveConfig } from '../../rpc'\nimport { applyCustomTokens, applySettingsOverrides, setPartBlur } from '../../wallpaper'\nimport { LiveSlider } from '../LiveSlider'\nimport { CanvasIcon, SidebarIcon, ChatIcon, GearIcon } from '../icons'\n\ninterface PartDef {\n labelKey: string\n Icon: ComponentType<{ size?: number }>\n /** Homepage part key; absent for the settings-panel part. */\n opKey?: keyof PartOpacities\n isSettings?: boolean\n}\n\nconst PARTS: PartDef[] = [\n { opKey: 'bg', labelKey: 'uiOpacityBg', Icon: CanvasIcon },\n { opKey: 'sidebar', labelKey: 'uiOpacitySide', Icon: SidebarIcon },\n { opKey: 'card', labelKey: 'uiOpacityCard', Icon: ChatIcon },\n { isSettings: true, labelKey: 'uiSop', Icon: GearIcon },\n]\n\nexport function InterfacePage({ p }: { p: ThemeSectionProps }) {\n const { t, setOps, setBlurs, setSop } = p\n\n return (\n <>\n <header className=\"dab-head dab-rise\" style={{ '--d': 0 } as CSSProperties}>\n <div className=\"dab-overline\">Surfaces</div>\n <h2 className=\"dab-h1\">{t('uiTitle')}</h2>\n <p className=\"dab-desc\">{t('descInterface')}</p>\n </header>\n\n <div className=\"dab-grid-parts\">\n {PARTS.map((part, i) => {\n const { labelKey, Icon, isSettings } = part\n const opKey = part.opKey\n const blurKey: keyof PartBlurs = opKey ?? 'settings'\n const opacity = isSettings ? rSop() : rOps()[opKey!]\n return (\n <section key={blurKey} className=\"dab-card dab-card-hover dab-rise\" style={{ '--d': i + 1 } as CSSProperties}>\n <div className=\"dab-part-head\">\n <div className=\"dab-part-ico\"><Icon size={16} /></div>\n <div className=\"dab-part-name\">{t(labelKey)}</div>\n <span className=\"dab-part-badge\">{Math.round(opacity * 100)}%</span>\n </div>\n\n <LiveSlider label={t('uiOpacity')} min={0} max={100} step={1} def={Math.round(opacity * 100)}\n fmt={v => `${v}%`}\n onInput={v => {\n const op = v / 100\n if (isSettings) {\n cfg.settingsOpacity = op\n applySettingsOverrides(op)\n } else {\n const ops = { ...rOps() }\n ops[opKey!] = op\n cfg.opacities = ops\n applyCustomTokens(ops)\n }\n saveConfig()\n }}\n onChange={v => {\n const op = v / 100\n if (isSettings) {\n setSop(op)\n } else {\n const ops = { ...rOps() }\n ops[opKey!] = op\n setOps(ops)\n }\n }} />\n\n <LiveSlider label={t('uiBlur')} min={0} max={60} step={1} def={rBlurs()[blurKey]}\n fmt={v => `${v}px`}\n onInput={v => {\n const blurs = { ...rBlurs() }\n blurs[blurKey] = v\n cfg.blurs = blurs\n setPartBlur(blurKey, v)\n saveConfig()\n }}\n onChange={v => {\n const blurs = { ...rBlurs() }\n blurs[blurKey] = v\n setBlurs(blurs)\n }} />\n </section>\n )\n })}\n </div>\n </>\n )\n}\n","/**\n * Read a chosen image file as a data URL WITHOUT re-encoding: the original\n * pixels are kept as-is (no canvas downscale / JPEG re-compression), so the\n * wallpaper is stored and displayed at full fidelity. The tradeoff is a larger\n * payload over the RPC channel and on disk for big images.\n */\nexport function readImg(file: File, cb: (url: string | null) => void): void {\n const r = new FileReader()\n r.onerror = () => cb(null)\n r.onload = () => cb(r.result as string)\n r.readAsDataURL(file)\n}\n","import { useRef, useState, useEffect, useCallback } from 'react'\nimport { rBgState } from '../state'\nimport { Portal } from './Portal'\n\nexport function BgEditor({ url, t, onClose, onCommit }: {\n url: string; 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 = rBgState()\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 = rBgState()\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, 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 dab-btn-primary\" 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 { ThemeSectionProps, ThemeStoreState, BackgroundType, GeneratedBgParams } from '../../types'\nimport { cfg, rWop, rBl } from '../../state'\nimport { saveConfig } from '../../rpc'\nimport { applyWp, setWpOpacity, setWpBlur } from '../../wallpaper'\nimport { readImg } from '../../utils/image'\nimport { defaultParamsFor } from '../../utils/bg-generators'\nimport { BgEditor } from '../BgEditor'\nimport { LiveSlider } from '../LiveSlider'\nimport { LockIcon, CheckIcon, PhotoIcon, RefreshIcon, SparkleIcon, TrashIcon, UploadIcon, EditIcon } from '../icons'\n\nconst SEG_W = 108\n\nexport function BackgroundPage({ p }: { p: ThemeSectionProps }) {\n const { t, setWp, setWop, setBl, setBgType, setGeneratedBg, regenerateBg, setRegenerateOnReload, useStore } = p\n const store = useStore((s: ThemeStoreState) => s)\n const storeUrl = store.url\n const backgroundType = store.backgroundType\n const generatedBg = store.generatedBg\n const regenerateOnReload = store.regenerateOnReload\n\n const fileRef = useRef<HTMLInputElement>(null)\n const [editorOpen, setEditorOpen] = useState(false)\n const [dragOver, setDragOver] = useState(false)\n const [spinTick, setSpinTick] = useState(0)\n\n const isGenerated = backgroundType !== 'image'\n const activeGenType: Exclude<BackgroundType, 'image'> = isGenerated && generatedBg ? generatedBg.type : 'mesh'\n\n const onFileSelect = (f: File) => {\n readImg(f, d => {\n if (d) setWp(d)\n })\n }\n\n const onDrop = (e: React.DragEvent) => {\n e.preventDefault()\n setDragOver(false)\n const f = e.dataTransfer.files?.[0]\n if (f && f.type.startsWith('image/')) onFileSelect(f)\n }\n\n const switchToImage = () => {\n if (backgroundType !== 'image') setBgType('image')\n }\n\n const setGenType = (type: Exclude<BackgroundType, 'image'>) => {\n if (type === activeGenType) return\n setBgType(type)\n }\n\n const ensureGenParams = (): GeneratedBgParams => generatedBg ?? defaultParamsFor(activeGenType)\n\n const updateGenerated = (patch: Partial<GeneratedBgParams>) => {\n setGeneratedBg({ ...ensureGenParams(), ...patch } as GeneratedBgParams)\n }\n\n const typeMeta: Array<{ type: Exclude<BackgroundType, 'image'>; labelKey: string; descKey: string; thumb: string }> = [\n { type: 'mesh', labelKey: 'bgTypeMesh', descKey: 'bgMeshDesc', thumb: 'dab-thumb-mesh' },\n { type: 'shader', labelKey: 'bgTypeShader', descKey: 'bgShaderDesc', thumb: 'dab-thumb-shader' },\n { type: 'pattern', labelKey: 'bgTypePattern', descKey: 'bgPatternDesc', thumb: 'dab-thumb-pattern' },\n ]\n\n const presetLabel = (key: string) => {\n switch (key) {\n case 'aurora': return t('presetAurora')\n case 'nebula': return t('presetNebula')\n case 'noise': return t('presetNoise')\n case 'dots': return t('presetDots')\n case 'waves': return t('presetWaves')\n case 'poly': return t('presetPoly')\n default: return key\n }\n }\n\n return (\n <>\n <header className=\"dab-head dab-rise\" style={{ '--d': 0 } as CSSProperties}>\n <div className=\"dab-overline\">Canvas</div>\n <h2 className=\"dab-h1\">{t('bgTitle')}</h2>\n <p className=\"dab-desc\">{t('descBackground')}</p>\n </header>\n\n {/* Preview hero with hover veil */}\n <section className=\"dab-rise\" style={{ '--d': 1 } as CSSProperties}>\n <div className=\"dab-hero\">\n {storeUrl ? (\n <>\n <img className=\"dab-hero-img\" src={storeUrl} alt=\"\" draggable={false} />\n {isGenerated ? (\n <span className=\"dab-hero-badge\"><SparkleIcon size={11} />{t('liveBadge')}</span>\n ) : null}\n <div className=\"dab-hero-veil\">\n {backgroundType === 'image' ? (\n <button type=\"button\" className=\"dab-btn\" onClick={() => setEditorOpen(true)}>\n <EditIcon size={13} />{t('bgEdit')}\n </button>\n ) : (\n <button type=\"button\" className=\"dab-btn\" onClick={() => { regenerateBg(); setSpinTick(x => x + 1) }}>\n <RefreshIcon size={13} />{t('bgRegenerate')}\n </button>\n )}\n <button type=\"button\" className=\"dab-btn dab-btn-danger\" onClick={() => setWp(null)}>\n <TrashIcon size={13} />{t('bgRemove')}\n </button>\n </div>\n </>\n ) : (\n <button\n type=\"button\"\n className={`dab-hero-empty${dragOver ? ' is-over' : ''}`}\n onClick={() => fileRef.current?.click()}\n onDragOver={e => { e.preventDefault(); setDragOver(true) }}\n onDragLeave={() => setDragOver(false)}\n onDrop={onDrop}>\n <UploadIcon size={20} />\n <span>{t('dropHint')}</span>\n </button>\n )}\n </div>\n </section>\n\n {/* Source segmented control */}\n <section className=\"dab-rise\" style={{ '--d': 2 } as CSSProperties}>\n <div className=\"dab-seg\" style={{ '--w': `${SEG_W}px` } as CSSProperties}>\n <div className=\"dab-seg-thumb\" style={{ transform: `translateX(${isGenerated ? SEG_W : 0}px)` }} />\n <button type=\"button\" className={`dab-seg-item${!isGenerated ? ' is-active' : ''}`} onClick={switchToImage}>\n <PhotoIcon size={14} />{t('bgSourceImage')}\n </button>\n <button type=\"button\" className={`dab-seg-item${isGenerated ? ' is-active' : ''}`}\n onClick={() => { if (!isGenerated) setBgType(generatedBg?.type ?? 'mesh') }}>\n <SparkleIcon size={14} />{t('bgSourceGenerated')}\n </button>\n </div>\n </section>\n\n {/* Mode content */}\n {!isGenerated ? (\n <section className=\"dab-card dab-card-hover dab-rise\" style={{ '--d': 3 } as CSSProperties}>\n <div className=\"dab-chip-row\">\n <button type=\"button\" className=\"dab-btn dab-btn-primary\" onClick={() => fileRef.current?.click()}>\n <UploadIcon size={14} />{t('bgChoose')}\n </button>\n {storeUrl ? (\n <>\n <button type=\"button\" className=\"dab-btn\" onClick={() => setEditorOpen(true)}>\n <EditIcon size={14} />{t('bgEdit')}\n </button>\n <button type=\"button\" className=\"dab-btn dab-btn-ghost dab-btn-danger\" onClick={() => setWp(null)}>\n <TrashIcon size={14} />{t('bgRemove')}\n </button>\n </>\n ) : null}\n </div>\n </section>\n ) : (\n <section className=\"dab-card dab-rise\" style={{ '--d': 3 } as CSSProperties}>\n {/* Type cards with animated thumbnails */}\n <div className=\"dab-types\">\n {typeMeta.map(m => (\n <button key={m.type} type=\"button\" className={`dab-type${activeGenType === m.type ? ' is-active' : ''}`} onClick={() => setGenType(m.type)}>\n <div className={`dab-type-thumb ${m.thumb}`} />\n <div className=\"dab-type-name\">{t(m.labelKey)}</div>\n <div className=\"dab-type-desc\">{t(m.descKey)}</div>\n <span className=\"dab-type-check\"><CheckIcon size={11} /></span>\n </button>\n ))}\n </div>\n\n {/* Presets (shader / pattern) */}\n {activeGenType === 'shader' && generatedBg?.type === 'shader' ? (\n <div style={{ marginTop: 14 }}>\n <div className=\"dab-swatch-title\">{t('bgShaderPreset')}</div>\n <div className=\"dab-chip-row\">\n {(['aurora', 'nebula', 'noise'] as const).map(pr => (\n <button key={pr} type=\"button\" className={`dab-chip${generatedBg.preset === pr ? ' is-active' : ''}`}\n onClick={() => updateGenerated({ preset: pr })}>\n {presetLabel(pr)}\n </button>\n ))}\n </div>\n </div>\n ) : null}\n\n {activeGenType === 'pattern' && generatedBg?.type === 'pattern' ? (\n <div style={{ marginTop: 14 }}>\n <div className=\"dab-swatch-title\">{t('bgPatternPreset')}</div>\n <div className=\"dab-chip-row\">\n {(['dots', 'waves', 'poly'] as const).map(pr => (\n <button key={pr} type=\"button\" className={`dab-chip${generatedBg.preset === pr ? ' is-active' : ''}`}\n onClick={() => updateGenerated({ preset: pr })}>\n {presetLabel(pr)}\n </button>\n ))}\n </div>\n </div>\n ) : null}\n\n {/* Parameter sliders */}\n <div style={{ marginTop: 16 }}>\n {activeGenType === 'mesh' && generatedBg?.type === 'mesh' ? (\n <>\n <LiveSlider label={t('bgMeshScale')} min={30} max={300} step={1} def={Math.round(generatedBg.scale * 100)}\n fmt={v => `${v}%`} onInput={() => {}} onChange={v => updateGenerated({ scale: v / 100 })} />\n <LiveSlider label={t('bgMeshIntensity')} min={0} max={100} step={1} def={Math.round(generatedBg.intensity * 100)}\n fmt={v => `${v}%`} onInput={() => {}} onChange={v => updateGenerated({ intensity: v / 100 })} />\n </>\n ) : null}\n {activeGenType === 'shader' && generatedBg?.type === 'shader' ? (\n <>\n <LiveSlider label={t('bgShaderSpeed')} min={0} max={200} step={1} def={Math.round(generatedBg.speed * 100)}\n fmt={v => `${v}%`} onInput={() => {}} onChange={v => updateGenerated({ speed: v / 100 })} />\n <LiveSlider label={t('bgShaderScale')} min={30} max={300} step={1} def={Math.round(generatedBg.scale * 100)}\n fmt={v => `${v}%`} onInput={() => {}} onChange={v => updateGenerated({ scale: v / 100 })} />\n </>\n ) : null}\n {activeGenType === 'pattern' && generatedBg?.type === 'pattern' ? (\n <>\n <LiveSlider label={t('bgPatternDensity')} min={0} max={100} step={1} def={Math.round(generatedBg.density * 100)}\n fmt={v => `${v}%`} onInput={() => {}} onChange={v => updateGenerated({ density: v / 100 })} />\n <LiveSlider label={t('bgPatternScale')} min={30} max={300} step={1} def={Math.round(generatedBg.scale * 100)}\n fmt={v => `${v}%`} onInput={() => {}} onChange={v => updateGenerated({ scale: v / 100 })} />\n </>\n ) : null}\n </div>\n\n {/* Seed lock + regenerate */}\n <div className=\"dab-seed\">\n <span className=\"dab-seed-ico\"><LockIcon size={15} /></span>\n <div className=\"dab-seed-txt\">\n <div className=\"dab-seed-title\">{t('seedLock')}</div>\n <div className=\"dab-seed-desc\">{!regenerateOnReload ? t('bgSeedLocked') : t('bgSeedUnlocked')}</div>\n </div>\n <button type=\"button\" className={`dab-toggle${!regenerateOnReload ? ' is-on' : ''}`}\n role=\"switch\" aria-checked={!regenerateOnReload}\n onClick={() => setRegenerateOnReload(!regenerateOnReload)}>\n <span className=\"dab-toggle-knob\" />\n </button>\n <button type=\"button\" className=\"dab-btn dab-btn-primary\" onClick={() => { regenerateBg(); setSpinTick(x => x + 1) }}>\n <span key={spinTick} className=\"dab-spin\" style={{ display: 'grid' }}><RefreshIcon size={13} /></span>\n {t('bgRegenerate')}\n </button>\n </div>\n </section>\n )}\n\n {/* Global wallpaper adjustments */}\n <section className=\"dab-card dab-card-hover dab-rise\" style={{ '--d': 4 } as CSSProperties}>\n <LiveSlider label={t('wpOpacity')} min={0} max={100} step={1} def={Math.round(rWop() * 100)}\n fmt={v => `${v}%`}\n onInput={v => { const op = v / 100; cfg.wallpaperOpacity = op; setWpOpacity(op); saveConfig() }}\n onChange={v => setWop(v / 100)} />\n <LiveSlider label={t('bgBlur')} min={0} max={60} step={1} def={rBl()}\n fmt={v => `${v}px`}\n onInput={v => { cfg.blur = v; setWpBlur(v); saveConfig() }}\n onChange={v => setBl(v)} />\n <p className=\"dab-hint\" style={{ marginTop: 12 }}>{t('bgHint')}</p>\n </section>\n\n <input ref={fileRef} type=\"file\" accept=\"image/*\" style={{ display: 'none' }} onChange={e => {\n const f = e.target.files?.[0]; if (!f) return\n onFileSelect(f); e.target.value = ''\n }} />\n\n {/* Background editor modal */}\n {editorOpen && storeUrl ? (\n <BgEditor url={storeUrl} t={t} onClose={() => setEditorOpen(false)}\n onCommit={(z, x, y, iw, ih) => { cfg.bgState = { zoom: z, x, y, iw, ih }; applyWp(); saveConfig(); setEditorOpen(false) }} />\n ) : null}\n </>\n )\n}\n","import { useRef } from 'react'\nimport type { CSSProperties } from 'react'\nimport type { ThemeSectionProps } from '../../types'\nimport { DownloadIcon, UploadIcon } from '../icons'\n\nexport function ProfilePage({ p, notify }: { p: ThemeSectionProps; notify: (msg: string, ok?: boolean) => void }) {\n const { t, exportTheme, importTheme } = p\n const importRef = useRef<HTMLInputElement>(null)\n\n const onImport = async (file: File) => {\n try {\n const ok = await importTheme(file)\n notify(ok ? t('importDone') : t('importFail'), ok)\n } catch {\n notify(t('importFail'), false)\n }\n }\n\n return (\n <>\n <header className=\"dab-head dab-rise\" style={{ '--d': 0 } as CSSProperties}>\n <div className=\"dab-overline\">Profile</div>\n <h2 className=\"dab-h1\">{t('pageProfile')}</h2>\n <p className=\"dab-desc\">{t('descProfile')}</p>\n </header>\n\n <div className=\"dab-profile-grid\">\n <section className=\"dab-card dab-card-hover dab-rise\" style={{ '--d': 1 } as CSSProperties}>\n <div className=\"dab-profile-ico\"><DownloadIcon size={17} /></div>\n <div className=\"dab-profile-title\">{t('exportCardTitle')}</div>\n <div className=\"dab-profile-desc\">{t('exportCardDesc')}</div>\n <button type=\"button\" className=\"dab-btn dab-btn-primary\" onClick={() => { exportTheme(); notify(t('toastExportDone')) }}>\n <DownloadIcon size={14} />{t('exportTheme')}\n </button>\n </section>\n\n <section className=\"dab-card dab-card-hover dab-rise\" style={{ '--d': 2 } as CSSProperties}>\n <div className=\"dab-profile-ico\"><UploadIcon size={17} /></div>\n <div className=\"dab-profile-title\">{t('importCardTitle')}</div>\n <div className=\"dab-profile-desc\">{t('importCardDesc')}</div>\n <button type=\"button\" className=\"dab-btn\" onClick={() => importRef.current?.click()}>\n <UploadIcon size={14} />{t('importTheme')}\n </button>\n <input ref={importRef} type=\"file\" accept=\"application/json,.json\" style={{ display: 'none' }} onChange={e => {\n const f = e.target.files?.[0]; if (!f) return\n void onImport(f); e.target.value = ''\n }} />\n </section>\n </div>\n\n <footer className=\"dab-footer dab-rise\" style={{ '--d': 3 } as CSSProperties}>\n <span className=\"dab-footer-mono\">dsh-any-background</span>\n <span>{t('footerTag')}</span>\n </footer>\n </>\n )\n}\n","/**\n * dsh-any-background — 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, DropletIcon, LayersIcon, PhotoIcon, SlidersIcon, CheckIcon, AlertIcon } from './icons'\nimport { ErrorBoundary } from './ErrorBoundary'\nimport { Portal } from './Portal'\nimport { ColorPage } from './pages/ColorPage'\nimport { InterfacePage } from './pages/InterfacePage'\nimport { BackgroundPage } from './pages/BackgroundPage'\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('pageColor'), Icon: DropletIcon, node: <ColorPage p={props} notify={notify} /> },\n { label: t('pageInterface'), Icon: LayersIcon, node: <InterfacePage p={props} /> },\n { label: t('pageBackground'), Icon: PhotoIcon, node: <BackgroundPage p={props} /> },\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-any-background — browser half entry.\n *\n * Appearance plugin with:\n * 1. PS-style color wheel (hue ring + saturation/lightness square) for\n * real-time theme color selection with dynamic token generation.\n * 2. Background image editor modal with drag-to-pan and scroll-to-zoom\n * inside a viewport-proportional preview rectangle.\n * 3. Opacity / blur sliders with zero-lag direct DOM manipulation: the\n * homepage background opacity (主界面) and the settings panel opacity\n * (设置界面透明度) are separate sliders.\n *\n * This file wires the plugin lifecycle (theme registration, wallpaper layer,\n * viewport watch, i18n, settings-section injection, boot restore, watchdog).\n * The heavy lifting lives in the sibling modules:\n * state.ts in-memory config mirror + getters\n * rpc.ts file-backed persistence over the /dsh-any-background channel\n * wallpaper.ts wallpaper DOM layer + inline token writes\n * utils/ color math, token generation, image compression\n * components/ ThemeSection shell + pages/, ColorWheel, BgEditor, LiveSlider\n * i18n.ts zh/en dictionaries\n * ui.css.ts scoped design-system stylesheet (classes + keyframes)\n */\nimport { defineStore } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { Ctx, RpcResultLike, BoundActions, ThemeSectionProps, PartOpacities, PartBlurs, BackgroundType, GeneratedBgParams } from './types'\nimport { NS, zh, en } from './i18n'\nimport { cfg, rHasColor, rColor, rWp, rBgState, setWpUrl, setWpImageUrl, setBgState, adoptConfig, DEFAULT_CONFIG, setBgDark } from './state'\nimport { RPC_CHANNEL, initRpc, saveConfig, flushSave, loadPersisted, persistWallpaper, persistConfig } from './rpc'\nimport { applyWp, teardownWp, applySettingsOverrides, SETTINGS_STYLE_RULE, watchParts, regenerateGeneratedBg, setBackgroundType, updateGeneratedBg, applyThemeColor, onGeneratedSnapshot } from './wallpaper'\nimport { genTokens, hslToHsv, hsvToHsl, extractWallpaperColor } from './utils/color'\nimport { ThemeSection } from './components/ThemeSection'\nimport { SUN_PATHS } from './components/icons'\n\nexport const name = 'dsh-any-background'\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-any-background` 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. Restore custom color and register as a skin. The saved color's\n // lightness decides the scheme — a dark pick gets white text, a light pick\n // black text — so both the theme color and the dark/light text follow the\n // picked color.\n const [initH, initS, initL] = rColor()\n let customDispose: (() => void) | null = null\n // registerCustom takes HSL (the storage/wheel space and genTokens space).\n const registerCustom = (h: number, s: number, l: number) => {\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 apply pass (HMR swap that could\n // not run this fiber's disposer) cannot be torn down here; keep it and\n // activate it below. Without this the duplicate-id throw would abort\n // apply and skip the wallpaper/opacity restore.\n customDispose = null\n }\n // Only activate the custom theme if it is actually registered. This keeps\n // the HMR fallback above safe and avoids a crash when registration fails\n // for any other reason.\n if (ctx.theme.getTheme().themes.some(t => t.id === CUSTOM_ID)) {\n ctx.theme.setTheme(CUSTOM_ID)\n }\n }\n // Restore saved color on boot.\n if (rHasColor()) registerCustom(initH, initS, initL)\n ctx.effect(() => () => {\n customDispose?.()\n if (colorTimerRef.current !== null) window.clearTimeout(colorTimerRef.current)\n }, 'dsh-any-background: skin dispose')\n\n // 2. Gradient CSS (for custom dark themes).\n let styleEl: HTMLStyleElement | undefined\n if (typeof document !== 'undefined') {\n styleEl = document.createElement('style')\n styleEl.dataset.plugin = 'dsh-any-background'\n // This gradient only applies while applyCustomTokens has marked the body\n // with the plugin's own dark-mode value, avoiding accidental matches against\n // the host harness's theme attribute.\n styleEl.textContent = `body[data-ds-dark-theme=\"dsh-any-background\"]::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}`\n document.head.appendChild(styleEl)\n }\n ctx.effect(() => () => { styleEl?.parentNode?.removeChild(styleEl) }, 'dsh-any-background: gradient')\n\n // 3. State store.\n let rev = 0\n let colorRev = 0\n let bgRev = 0\n const colorTimerRef: { current: number | null } = { current: null }\n const store = defineStore({\n init: () => ({\n url: null as string | null,\n rev: -1,\n colorRev: -1,\n color: null as [number, number, number] | null,\n backgroundType: cfg.backgroundType,\n generatedBg: cfg.generatedBg,\n bgRev: -1,\n regenerateOnReload: cfg.regenerateOnReload,\n }),\n actions: {\n syncBg: (d: any, url: string | null, r: number, bgType?: BackgroundType, genBg?: GeneratedBgParams | null, bgr?: number, reload?: boolean) => {\n if (r > d.rev) { d.url = url; d.rev = r }\n if (bgr !== undefined && bgr > d.bgRev) { d.backgroundType = bgType!; d.generatedBg = genBg ?? null; d.bgRev = bgr }\n if (reload !== undefined) { d.regenerateOnReload = reload }\n },\n syncColor: (d: any, hsv: [number, number, number], r: number) => { if (r > d.colorRev) { d.color = hsv; d.colorRev = r } },\n },\n })\n let bound: BoundActions | null = null\n const syncBg = () => {\n rev++; bgRev++\n bound?.syncBg(rWp(), rev, cfg.backgroundType, cfg.generatedBg, bgRev, cfg.regenerateOnReload)\n }\n // When a generated background finishes its first frame, its snapshot becomes\n // the display/preview URL — re-sync the store so the preview follows.\n onGeneratedSnapshot(syncBg)\n\n // 4. Wallpaper.\n applyWp(); syncBg()\n // The AppFrame mounts after this apply; watch for it so persisted per-part\n // blurs land as soon as the shell renders.\n watchParts()\n // Load the file-backed theme from the node half and re-apply once it lands\n // (the node store may be absent or unreachable at this instant; defaults are\n // already applied above, and the deferred restore below re-asserts too).\n void loadPersisted().then(() => {\n // The file-backed store may land after the section mounted with defaults:\n // re-register the skin with the restored color and push it to the wheel\n // through the store so UI and theme never diverge.\n if (rHasColor()) {\n const [h, s, l] = rColor()\n registerCustom(h, s, l)\n }\n // If the user last used a generated background, either regenerate it on\n // reload (when regenerateOnReload is enabled) or reconstruct the same\n // snapshot from the saved parameters so the wallpaper stays stable.\n if (cfg.backgroundType !== 'image') {\n if (cfg.regenerateOnReload) {\n regenerateGeneratedBg()\n } else if (cfg.generatedBg) {\n updateGeneratedBg(cfg.generatedBg)\n }\n // Persist the normalized config so the seed (and regenerateOnReload flag)\n // are written back to disk. Old configs created before the seed field\n // existed will get a deterministic seed=0 saved, so subsequent reloads\n // are stable without requiring user interaction.\n persistConfig()\n } else {\n // Apply the theme color: when a color is saved this synchronously derives\n // the palette from it (so the saved pick wins); otherwise it falls back\n // to extracting a palette from the uploaded wallpaper.\n applyThemeColor()\n }\n syncBg()\n if (rHasColor()) { colorRev++; bound?.syncColor(hslToHsv(...rColor()), colorRev) }\n })\n ctx.effect(() => () => { teardownWp() }, 'dsh-any-background: wp cleanup')\n ctx.effect(() => ctx.on('theme/change', () => {\n // The theme service persists only built-in preferences; the custom theme's\n // preference lives in memory, so a host-scope adoption can silently reset\n // it. While a color is saved, re-assert the custom theme so it stays\n // active. Guard on registry presence — registerCustom disposes the old\n // skin before re-registering, and during that transient the registry lacks\n // CUSTOM_ID, so asserting there would throw.\n if (rHasColor()) {\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-any-background: theme change')\n // The wallpaper's inline size/position are absolute pixels computed for the\n // viewport at apply time, so a stale viewport leaves them misplaced.\n // Watch the viewport itself: a fixed inset:0 sentinel's box always equals\n // the viewport, so a ResizeObserver on it fires for ANY viewport change\n // (window resize, moving between monitors, panel splitters, zoom) where\n // window.resize can be missed; a resolution media query catches DPI-only\n // moves between differently scaled screens. All re-applies are coalesced to\n // one per animation frame. Re-running applyWp recomputes the contain-fit\n // scale and the fractional offsets for the new viewport (the editor's model).\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-any-background: viewport watch')\n\n // 5. Locale.\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'dsh-any-background: i18n')\n\n // 6. Section injection.\n const sectionInject = (actions: BoundActions): Omit<ThemeSectionProps, 'useStore'> => {\n bound = actions; syncBg()\n const [wh, ws, wl] = rColor()\n const [dh, ds, dv] = hslToHsv(wh, ws, wl)\n return {\n t: ctx.locale.bind(NS),\n hue: dh, sat: ds, lit: dv,\n setColor: (nh: number, ns: number, nl: number) => {\n const [sh, ss, sl] = hsvToHsl(nh, ns, nl)\n cfg.color = [sh, ss, sl]\n // Wheel dragging produces a flood of events. Updating the preview UI\n // (orb/hex/wheel marker) must stay synchronous so it feels instant, but\n // registering a new theme + writing 40+ CSS variables + persisting the\n // config is expensive. Debounce that work by 80ms: while the user drags\n // rapidly we only update in-memory state/UI; once they pause or release\n // the mouse the theme is applied once.\n if (colorTimerRef.current !== null) window.clearTimeout(colorTimerRef.current)\n colorTimerRef.current = window.setTimeout(() => {\n colorTimerRef.current = null\n registerCustom(sh, ss, sl)\n applyWp()\n saveConfig()\n }, 80)\n // Keep the wheel's canonical color in the store so programmatic\n // changes (wallpaper extraction) and remounts share one source.\n colorRev++\n bound?.syncColor([nh, ns, nl], colorRev)\n },\n setWp: (u: string | null) => {\n cfg.backgroundType = 'image'\n // Retain the uploaded image in its own slot so switching to a generated\n // background and back never loses it. persisted to wallpaper.jpg too.\n // The generated-background brightness verdict stops applying here.\n setBgDark(null)\n setWpImageUrl(u)\n setWpUrl(u)\n setBgState({ ...DEFAULT_CONFIG.bgState })\n persistWallpaper(u)\n applyThemeColor()\n syncBg()\n },\n setBgType: (type: BackgroundType) => {\n setBackgroundType(type)\n // Keep the uploaded wallpaper on disk so it can be restored when the\n // user returns to the image type; it is only removed via setWp(null).\n saveConfig()\n syncBg()\n },\n setGeneratedBg: (params) => {\n updateGeneratedBg(params)\n saveConfig()\n syncBg()\n },\n regenerateBg: () => {\n regenerateGeneratedBg()\n // Immediate (non-debounced) write so the new seed survives a refresh\n // fired right after the click.\n persistConfig()\n syncBg()\n },\n setRegenerateOnReload: (v: boolean) => {\n cfg.regenerateOnReload = v\n // Immediate (non-debounced) write: a debounced save can be cut off by\n // page unload, which would revert the toggle on the next refresh.\n persistConfig()\n syncBg()\n },\n setOps: (ops: PartOpacities) => { cfg.opacities = ops; applyWp(); syncBg(); saveConfig() },\n setBlurs: (blurs: PartBlurs) => { cfg.blurs = blurs; applyWp(); syncBg(); saveConfig() },\n setWop: (v: number) => { cfg.wallpaperOpacity = v; applyWp(); syncBg(); saveConfig() },\n setBl: (v: number) => { cfg.blur = v; applyWp(); syncBg(); saveConfig() },\n setSop: (v: number) => { cfg.settingsOpacity = v; applySettingsOverrides(v); saveConfig() },\n // One-click: derive a theme color from the current wallpaper. Purely\n // client-side — no RPC traffic; the sample is a 64×64 canvas.\n extractColor: async (): Promise<boolean> => {\n const url = rWp()\n if (!url) return false\n const hsl = await extractWallpaperColor(url, rBgState())\n if (!hsl) return false\n cfg.color = hsl\n registerCustom(hsl[0], hsl[1], hsl[2])\n applyWp()\n saveConfig()\n const hsv = hslToHsv(hsl[0], hsl[1], hsl[2])\n colorRev++\n bound?.syncColor(hsv, colorRev)\n return true\n },\n // Download the whole theme as dsh-any-theme.json: the config plus the\n // wallpaper data URL only when it is an uploaded image. Generated\n // backgrounds are reconstructed from the saved params on import, so the\n // export stays small.\n exportTheme: () => {\n const payload = {\n version: 2,\n exportedAt: new Date().toISOString(),\n config: cfg,\n wallpaper: cfg.backgroundType === 'image' ? rWp() : null,\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-any-theme.json'\n a.click()\n URL.revokeObjectURL(url)\n },\n // Import a theme JSON: apply the config to memory, then persist through\n // the same paths as manual edits — config → theme-config.json, wallpaper\n // base64 → wallpaper.jpg (decoded on the node half). For generated\n // backgrounds the image is reconstructed from params instead of persisted.\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; wallpaper?: unknown }\n if (typeof d.config !== 'object' || d.config === null) return false\n adoptConfig(d.config)\n if (cfg.backgroundType === 'image') {\n const wallpaper = typeof d.wallpaper === 'string' && /^data:image\\//.test(d.wallpaper) ? d.wallpaper : null\n setWpImageUrl(wallpaper)\n setWpUrl(wallpaper)\n persistWallpaper(wallpaper)\n applyThemeColor()\n } else {\n setWpImageUrl(null)\n setWpUrl(null)\n persistWallpaper(null)\n // Reconstruct the imported dynamic background from its saved params.\n // Import means \"restore what I exported\", so the seed/params must be\n // preserved exactly; only regenerate a fresh look when the user has\n // that preference enabled — mirroring the boot-restore branch.\n if (cfg.regenerateOnReload) regenerateGeneratedBg()\n else if (cfg.generatedBg) updateGeneratedBg(cfg.generatedBg)\n }\n persistConfig()\n if (rHasColor()) {\n const [h, s, l] = rColor()\n registerCustom(h, s, l)\n }\n syncBg()\n if (rHasColor()) {\n colorRev++\n bound?.syncColor(hslToHsv(...rColor()), colorRev)\n }\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-any-background', order: 35,\n label: () => ctx.locale.bind(NS)('nav'),\n locale: NS, store, inject: sectionInject,\n }, ThemeSection as any))\n\n // 6.5. Settings-nav icon: the harness derives the nav glyph from the section\n // id (unknown ids fall back to the settings gear) with no plugin hook, so\n // patch the mounted nav cell in place — find the cell whose label matches\n // this section's nav text and swap 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-any-background: nav icon watch')\n\n // 7. Deferred boot restore: the theme service and the host settings scope\n // settle asynchronously after this apply, so the synchronous restore can be\n // observed mid-flight — a late host adoption resets the preference, or the\n // presenter re-applies over our overrides. Re-running the saved-color and\n // wallpaper restore a few ticks later guarantees the saved records land.\n const restoreSaved = (): void => {\n if (rHasColor()) {\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 const [h, s, l] = rColor()\n registerCustom(h, s, l)\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-any-background: boot restore')\n\n // 8. Theme watchdog: the theme service keeps only built-in preferences in\n // memory, so ANY host-scope adoption can silently drop the custom theme —\n // reverting the label colors (white/black) and the inner surfaces to the\n // system palette. While a color is saved, re-register and re-assert the\n // custom theme on a slow interval so the theme state always matches the\n // saved color and the active scheme, independent of which event resets it.\n const watchdogId = window.setInterval(() => {\n if (!rHasColor()) return\n const snapshot = ctx.theme.getTheme()\n let changed = false\n if (!snapshot.themes.some(t => t.id === CUSTOM_ID)) {\n const [h, s, l] = rColor()\n registerCustom(h, s, l)\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-any-background: theme watchdog')\n\n // 9. Flush any pending debounced config write when the page is hidden or\n // closed, so the last slider position is never lost to the debounce window.\n const onPageHide = (): void => flushSave()\n window.addEventListener('pagehide', onPageHide)\n ctx.effect(() => () => window.removeEventListener('pagehide', onPageHide), 'dsh-any-background: pagehide flush')\n}\n"],"mappings":"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"}
|