dsh-any-background 0.2.4 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -12
- package/README.zh.md +33 -12
- package/lib/client.js +2167 -305
- package/lib/client.js.map +1 -1
- package/lib/index.js +658 -25
- package/package.json +133 -121
package/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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"],"sources":["../src/client/runtime.ts","../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/utils/video.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":["/**\n * Harness-version-agnostic access to the client runtime.\n *\n * Before dsh 0.1.2 the store primitive lived on the composite package\n * `@deepseek-ai/dsh-client-runtime` (the `/client` subpath). The new harness\n * split it into `@deepseek-ai/dsh-client-store`. Both specifiers are kept\n * external so they resolve against the host client-module table; a missing\n * table entry on one side throws (the \"missed the module table\" error) and is\n * caught, falling through to the other package. This lets one bundle load on\n * both the old npm release and the new source.\n *\n * The host's synchronous `require` is injected by the loader into the bundle\n * factory; tsdown keeps these two bare specifiers as external CJS requires so\n * they bind to that factory `require`.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\ninterface StoreModule {\n defineStore: any\n}\n\nfunction resolveStore(): StoreModule {\n try {\n // New harness (dsh >= 0.1.2): dedicated store package after the runtime\n // was split. Missing here means the loader table has no such row → throw.\n return require('@deepseek-ai/dsh-client-store') as StoreModule\n } catch {\n /* fall through to the legacy composite runtime below */\n }\n // Legacy harness (npm release): composite runtime, /client subpath.\n return require('@deepseek-ai/dsh-client-runtime/client') as StoreModule\n}\n\nexport const defineStore: any = resolveStore().defineStore","export const NS = 'settings.anyBg'\r\n\r\nexport const zh: Record<string, string> = {\r\n nav: '主题', brandTag: '外观定制', close: '关闭',\r\n pageColor: '色彩', pageInterface: '界面', pageBackground: '背景', pageProfile: '配置',\r\n descColor: '拖动色轮或输入精确数值,整个界面的配色将实时跟随变化',\r\n descInterface: '为主界面的各个区域单独调节透明度与模糊,营造空间层次感',\r\n descBackground: '上传一张图片或一段视频作为壁纸并自由摆放,或让算法为你实时生成动态背景',\r\n descProfile: '将当前主题导出为文件备份,或从文件一键恢复完整配置',\r\n colorTitle: '主题色', colorHint: '在色轮外圈选择色相,在内部方形中调整饱和度和明度;双击滑块可恢复默认值',\r\n swatchTitle: '灵感色板',\r\n hexCaption: '当前主题色',\r\n uiTitle: '主界面',\r\n uiOpacity: '透明度', uiBlur: '模糊度',\r\n uiOpacityBg: '主背景', uiOpacitySide: '侧边栏', uiOpacityCard: '对话框中选项面板', uiOpacityInput: '输入框与控件',\r\n uiSop: '设置界面透明度',\r\n uiChatRegion: '对话文本框',\r\n uiTrajectory: '轨迹页',\r\n bgTitle: '背景', bgChoose: '选择图片或视频', bgRemove: '移除背景', bgFromUrl: '从网址', bgUrlPlaceholder: '粘贴图片网址 https://…', bgUrlApply: '应用', bgUrlCancel: '取消', bgUrlApplying: '加载中…', bgUrlBadHttp: '仅支持 http/https 图片网址', bgUrlFail: '获取图片失败',\r\n bgEdit: '编辑位置', bgEditLocked: '仅「适应」模式可编辑位置', wpOpacity: '背景透明度', bgBlur: '背景模糊',\r\n bgModeTitle: '布局模式',\r\n bgModeFit: '适应', bgModeFill: '填充', bgModeStretch: '拉伸', bgModeTile: '平铺', bgModeCenter: '居中',\r\n bgVideoBadge: '视频',\r\n bgSourceImage: '图片 / 视频',\r\n bgSourceGenerated: '动态生成',\r\n dropHint: '点击选择图片或视频,或将文件拖到这里',\r\n liveBadge: '动态壁纸',\r\n bgHint: '「适应」布局模式下悬停预览可编辑图片/视频的位置与缩放(其余布局模式按模式自动排布);动态生成模式下可选择类型、预设与参数。绑定种子后刷新页面壁纸保持不变,取消绑定则每次刷新随机换新',\r\n editorTitle: '背景编辑器', editorHint: '拖动移动画面,滚轮缩放大小',\r\n editorCommit: '确认', editorCancel: '取消', editorReset: '重置',\r\n extractColor: '从背景提取主题色', extracting: '取色中…',\r\n extractNoWp: '请先设置背景图片',\r\n extractDone: '已应用背景主色调',\r\n extractFail: '未在背景中找到鲜明的颜色,请换一张背景',\r\n crashTitle: '界面渲染出错',\r\n crashDesc: '主题设置面板遇到问题,点击下方按钮重置后重试',\r\n crashReset: '重置面板',\r\n exportTheme: '导出配置',\r\n importTheme: '导入配置',\r\n exportCardTitle: '导出配置',\r\n exportCardDesc: '将主题色、透明度、模糊与壁纸打包为 dsh-any-theme.json 文件',\r\n importCardTitle: '导入配置',\r\n importCardDesc: '从之前导出的 JSON 文件一键恢复完整主题',\r\n toastExportDone: '配置文件已开始下载',\r\n importDone: '已导入主题配置',\r\n importFail: '导入失败,文件格式不正确',\r\n footerTag: '外观插件',\r\n eyedropper: '从背景取色',\r\n pickerTitle: '从背景取色',\r\n pickerHint: '移动鼠标预览颜色,点击背景选取为主题色',\r\n pickerClose: '关闭',\r\n bgTypeImage: '图片',\r\n bgTypeMesh: '网格渐变',\r\n bgTypeShader: 'Shader',\r\n bgTypePattern: '几何图案',\r\n bgMeshDesc: '柔和的多点渐变色块',\r\n bgShaderDesc: '持续流动的光影动画',\r\n bgPatternDesc: '规律的几何纹理',\r\n bgRegenerate: '重新生成',\r\n bgSeedLocked: '已绑定 · 刷新不变',\r\n bgSeedUnlocked: '未绑定 · 刷新换新',\r\n seedLock: '锁定种子',\r\n bgMeshScale: '扩散范围',\r\n bgMeshIntensity: '色彩强度',\r\n bgShaderPreset: '预设',\r\n bgShaderSpeed: '流动速度',\r\n bgShaderScale: '纹理尺度',\r\n bgPatternPreset: '图案',\r\n bgPatternDensity: '密度',\r\n bgPatternScale: '尺度',\r\n presetAurora: '极光',\r\n presetNebula: '星云',\r\n presetNoise: '流动噪声',\r\n presetDots: '点阵',\r\n presetWaves: '波浪',\r\n presetPoly: '低多边形',\r\n}\r\n\r\nexport const en: Record<string, string> = {\r\n nav: 'Theme', brandTag: 'Appearance', close: 'Close',\r\n pageColor: 'Color', pageInterface: 'Interface', pageBackground: 'Background', pageProfile: 'Profile',\r\n descColor: 'Drag the wheel or type exact values — the whole UI follows live',\r\n descInterface: 'Tune opacity and blur per surface to build depth',\r\n descBackground: 'Upload an image or a video as wallpaper and place it freely, or let the algorithm paint a live background',\r\n descProfile: 'Export the current theme as a file, or restore it from one',\r\n colorTitle: 'Theme color', colorHint: 'Pick hue on the outer ring, adjust saturation & lightness in the square; double-click a slider to reset',\r\n swatchTitle: 'Quick swatches',\r\n hexCaption: 'Current accent',\r\n uiTitle: 'Interface',\r\n uiOpacity: 'Opacity', uiBlur: 'Blur',\r\n uiOpacityBg: 'Main background', uiOpacitySide: 'Sidebar', uiOpacityCard: 'Cards & panels', uiOpacityInput: 'Input & controls',\r\n uiSop: 'Settings interface opacity',\r\n uiChatRegion: 'Conversation text frame',\r\n uiTrajectory: 'Trajectory view',\r\n bgTitle: 'Background', bgChoose: 'Choose image or video', bgRemove: 'Remove background', bgFromUrl: 'From URL', bgUrlPlaceholder: 'Paste an image URL https://…', bgUrlApply: 'Apply', bgUrlCancel: 'Cancel', bgUrlApplying: 'Loading…', bgUrlBadHttp: 'Only http/https image URLs are supported', bgUrlFail: 'Could not fetch the image',\r\n bgEdit: 'Edit position', bgEditLocked: 'Position editing is only available in Fit mode', wpOpacity: 'Background opacity', bgBlur: 'Background blur',\r\n bgModeTitle: 'Layout mode',\r\n bgModeFit: 'Fit', bgModeFill: 'Fill', bgModeStretch: 'Stretch', bgModeTile: 'Tile', bgModeCenter: 'Center',\r\n bgVideoBadge: 'Video',\r\n bgSourceImage: 'Image / Video',\r\n bgSourceGenerated: 'Generated',\r\n dropHint: 'Click to choose an image or video, or drop one here',\r\n liveBadge: 'Live wallpaper',\r\n bgHint: 'In Fit layout mode hover the preview to reposition and zoom the image/video (other modes arrange it automatically); 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',\r\n editorTitle: 'Background editor', editorHint: 'Drag to move, scroll to zoom',\r\n editorCommit: 'Confirm', editorCancel: 'Cancel', editorReset: 'Reset',\r\n extractColor: 'Extract from background', extracting: 'Extracting…',\r\n extractNoWp: 'Set a background first',\r\n extractDone: 'Background color applied',\r\n extractFail: 'No vivid color found in this background, try another',\r\n crashTitle: 'Section crashed',\r\n crashDesc: 'The theme panel hit an error. Reset below to recover.',\r\n crashReset: 'Reset panel',\r\n exportTheme: 'Export',\r\n importTheme: 'Import',\r\n exportCardTitle: 'Export profile',\r\n exportCardDesc: 'Bundle color, opacity, blur and wallpaper into dsh-any-theme.json',\r\n importCardTitle: 'Import profile',\r\n importCardDesc: 'Restore a full theme from a previously exported JSON file',\r\n toastExportDone: 'Export started',\r\n importDone: 'Theme imported',\r\n importFail: 'Import failed — invalid file',\r\n footerTag: 'Appearance plugin',\r\n eyedropper: 'Eyedropper',\r\n pickerTitle: 'Pick from background',\r\n pickerHint: 'Hover to preview, click to pick as theme color',\r\n pickerClose: 'Close',\r\n bgTypeImage: 'Image',\r\n bgTypeMesh: 'Mesh gradient',\r\n bgTypeShader: 'Shader',\r\n bgTypePattern: 'Pattern',\r\n bgMeshDesc: 'Soft multi-blob gradients',\r\n bgShaderDesc: 'Flowing light animation',\r\n bgPatternDesc: 'Regular geometric texture',\r\n bgRegenerate: 'Regenerate',\r\n bgSeedLocked: 'Seeded · stable on refresh',\r\n bgSeedUnlocked: 'Unseeded · new on refresh',\r\n seedLock: 'Lock seed',\r\n bgMeshScale: 'Spread',\r\n bgMeshIntensity: 'Intensity',\r\n bgShaderPreset: 'Preset',\r\n bgShaderSpeed: 'Flow speed',\r\n bgShaderScale: 'Texture scale',\r\n bgPatternPreset: 'Pattern',\r\n bgPatternDensity: 'Density',\r\n bgPatternScale: 'Scale',\r\n presetAurora: 'Aurora',\r\n presetNebula: 'Nebula',\r\n presetNoise: 'Flowing noise',\r\n presetDots: 'Dots',\r\n presetWaves: 'Waves',\r\n presetPoly: 'Low poly',\r\n}\r\n","import type { BgState, ThemeConfig, PartOpacities, PartBlurs, BgMode } from './types'\n\nexport const DEFAULT_CONFIG: ThemeConfig = {\n color: null,\n opacities: { bg: 0.85, sidebar: 0.93, card: 1, input: 1 },\n blurs: { bg: 0, sidebar: 0, card: 0, settings: 0, chat: 0, trajectory: 0, input: 0 },\n settingsOpacity: 1,\n wallpaperOpacity: 1,\n blur: 0,\n bgState: { zoom: 1, x: 0, y: 0, iw: 0, ih: 0 },\n videoBgState: { zoom: 1, x: 0, y: 0, iw: 0, ih: 0 },\n backgroundType: 'image',\n bgMode: 'fit',\n videoMime: null,\n generatedBg: null,\n regenerateOnReload: false,\n chatTextOpacity: 0,\n // 100% = untouched host surface; zero would blank the page by default.\n trajectoryOpacity: 1,\n}\n\nconst clamp01 = (n: unknown, def: number): number =>\n typeof n === 'number' ? Math.min(1, Math.max(0, n)) : def\n\n// In-memory mirror of the file-backed store; the UI reads and mutates this,\n// and it is synced to disk via the RPC layer.\nexport let cfg: ThemeConfig = { ...DEFAULT_CONFIG, opacities: { ...DEFAULT_CONFIG.opacities }, blurs: { ...DEFAULT_CONFIG.blurs }, bgState: { ...DEFAULT_CONFIG.bgState }, videoBgState: { ...DEFAULT_CONFIG.videoBgState } }\nexport let wpImageUrl: string | null = null\n// Retained across background-type switches so coming back to image/video\n// restores the original upload.\nexport let wpUrl: string | null = null\nexport let wpVideoUrl: string | null = null\n/** Captured video frame standing in for previews/color extraction (still-image APIs). */\nexport let wpVideoSnapshot: string | null = null\n/** Local blob URL backing an in-session video; revoked when replaced or cleared. */\nlet wpVideoObjectUrl: string | null = null\n\nexport function setWpImageUrl(url: string | null): void { wpImageUrl = url }\nexport function setWpUrl(url: string | null): void { wpUrl = url }\n// The serve URL is stable, so replacing the stored video needs a query-string\n// cache-buster or the player keeps the cached copy.\nlet videoRev = 0\nexport function setWpVideoUrl(url: string | null, mime: string | null): void {\n if (url === null) {\n wpVideoUrl = null\n wpVideoSnapshot = null\n } else {\n videoRev++\n // Blob URLs are unique per object; a query string can break their\n // resolution in some engines, so they skip the cache-buster.\n wpVideoUrl = url.startsWith('blob:') ? url : `${url}${url.includes('?') ? '&' : '?'}r=${videoRev}`\n }\n // Release the previous in-session object URL when replaced or cleared.\n if (wpVideoObjectUrl !== null && wpVideoObjectUrl !== url) {\n URL.revokeObjectURL(wpVideoObjectUrl)\n wpVideoObjectUrl = null\n }\n if (url !== null && url.startsWith('blob:')) wpVideoObjectUrl = url\n cfg.videoMime = url ? mime : null\n}\nexport function setWpVideoSnapshot(url: string | null): void { wpVideoSnapshot = url }\n\n/** Release the in-session video object URL (plugin teardown). */\nexport function disposeVideoObjectUrl(): void {\n if (wpVideoObjectUrl !== null) {\n URL.revokeObjectURL(wpVideoObjectUrl)\n wpVideoObjectUrl = null\n }\n}\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. null = fall back to the picked color's lightness.\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 }\nexport function rWpVideo(): string | null { return wpVideoUrl }\nexport function rBgMode(): BgMode { return cfg.bgMode ?? DEFAULT_CONFIG.bgMode }\nexport function rChatTextOpacity(): number { return clamp01(cfg.chatTextOpacity, DEFAULT_CONFIG.chatTextOpacity) }\nexport function rTrajectoryOpacity(): number { return clamp01(cfg.trajectoryOpacity, DEFAULT_CONFIG.trajectoryOpacity) }\n/** Display URL: the uploaded image/video snapshot per active type, else the generated snapshot. */\nexport function rWp(): string | null {\n if (cfg.backgroundType === 'image') return wpImageUrl\n if (cfg.backgroundType === 'video') return wpVideoSnapshot\n return wpUrl\n}\nexport function rOps(): PartOpacities {\n const o = cfg.opacities ?? {}\n const out = {} as PartOpacities\n for (const k of ['bg', 'sidebar', 'card', 'input'] as const) {\n out[k] = clamp01(o[k], DEFAULT_CONFIG.opacities[k])\n }\n return out\n}\nexport function rBlurs(): PartBlurs {\n const b = cfg.blurs ?? {}\n const out = {} as PartBlurs\n for (const k of ['bg', 'sidebar', 'card', 'settings', 'chat', 'trajectory', 'input'] as const) {\n const v = b[k]\n out[k] = typeof v === 'number' ? Math.min(60, Math.max(0, v)) : DEFAULT_CONFIG.blurs[k]\n }\n return out\n}\nexport function rWop(): number { return clamp01(cfg.wallpaperOpacity, DEFAULT_CONFIG.wallpaperOpacity) }\nexport function rBl(): number {\n return typeof cfg.blur === 'number' ? Math.min(60, Math.max(0, cfg.blur)) : DEFAULT_CONFIG.blur\n}\nexport function rSop(): number { return clamp01(cfg.settingsOpacity, DEFAULT_CONFIG.settingsOpacity) }\nexport function rBgState(): BgState { return cfg.bgState }\nexport function rVideoBgState(): BgState { return cfg.videoBgState }\n\nconst num = (n: unknown, def: number): number => typeof n === 'number' ? n : def\nconst cl = (n: unknown, lo: number, hi: number, def: number): number =>\n typeof n === 'number' ? Math.min(hi, Math.max(lo, n)) : def\n\nfunction adoptBgState(s: Partial<BgState>): BgState {\n return {\n zoom: num(s.zoom, 1),\n x: num(s.x, 0),\n y: num(s.y, 0),\n iw: typeof s.iw === 'number' && s.iw > 0 ? s.iw : 0,\n ih: typeof s.ih === 'number' && s.ih > 0 ? s.ih : 0,\n }\n}\n\n/** 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 // Migration: the old single main-interface opacity becomes per-part, keeping\n // the sidebar's former +0.08 offset.\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 blurs = {} as PartBlurs\n for (const k of ['bg', 'sidebar', 'card', 'settings', 'chat', 'trajectory', 'input'] as const) {\n blurs[k] = num(bl[k], DEFAULT_CONFIG.blurs[k])\n }\n const bgType = ['video', 'mesh', 'shader', 'pattern'].includes(c.backgroundType as string)\n ? (c.backgroundType as ThemeConfig['backgroundType'])\n : DEFAULT_CONFIG.backgroundType\n const bgMode = (['fit', 'fill', 'stretch', 'tile', 'center'] as BgMode[]).includes(c.bgMode as BgMode) ? (c.bgMode as BgMode) : DEFAULT_CONFIG.bgMode\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: num(ops.bg, legacy ?? DEFAULT_CONFIG.opacities.bg),\n sidebar: num(ops.sidebar, legacy !== null ? Math.min(1, legacy + 0.08) : DEFAULT_CONFIG.opacities.sidebar),\n card: num(ops.card, DEFAULT_CONFIG.opacities.card),\n input: num(ops.input, DEFAULT_CONFIG.opacities.input),\n },\n blurs,\n settingsOpacity: num(c.settingsOpacity, DEFAULT_CONFIG.settingsOpacity),\n wallpaperOpacity: num(c.wallpaperOpacity, DEFAULT_CONFIG.wallpaperOpacity),\n blur: num(c.blur, DEFAULT_CONFIG.blur),\n bgState: adoptBgState((c.bgState ?? {}) as Partial<BgState>),\n videoBgState: adoptBgState((c.videoBgState ?? {}) as Partial<BgState>),\n backgroundType: bgType,\n bgMode,\n videoMime: typeof c.videoMime === 'string' ? c.videoMime : null,\n generatedBg: generatedBg ? normalizeGeneratedBg(generatedBg) : null,\n regenerateOnReload: typeof c.regenerateOnReload === 'boolean' ? c.regenerateOnReload : DEFAULT_CONFIG.regenerateOnReload,\n chatTextOpacity: clamp01(c.chatTextOpacity, DEFAULT_CONFIG.chatTextOpacity),\n trajectoryOpacity: clamp01(c.trajectoryOpacity, DEFAULT_CONFIG.trajectoryOpacity),\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: num(p.seed, 0),\n scale: cl(p.scale, 0.3, 3, 1),\n intensity: cl(p.intensity, 0, 1, 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: cl(p.speed, 0, 2, 0.3),\n scale: cl(p.scale, 0.3, 3, 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: cl(p.density, 0, 1, 0.5),\n scale: cl(p.scale, 0.3, 3, 1),\n seed: typeof p.seed === 'number' ? Math.floor(p.seed) : 0,\n }\n}\n","import type { RpcResultLike } from './types'\r\nimport { cfg, adoptConfig, setWpUrl, setWpImageUrl, setWpVideoUrl } from './state'\r\n\r\nexport const RPC_CHANNEL = '/dsh-any-background'\r\n/** Same-origin serve URL of the persisted video (enough for <video src>/fetch). */\r\nexport const VIDEO_SERVE_URL = '/dsh-any-background/video'\r\n/** HTTP route new videos are POSTed to as raw bytes (see uploadVideo). */\r\nexport const VIDEO_UPLOAD_URL = '/dsh-any-background/video/upload'\r\nconst RPC_NS = 'dshAnyBackground'\r\nconst rpcEndpoint = (method: string): string => `${RPC_NS}/${method}`\r\n\r\nlet rpcCallFn: ((endpoint: string, payload: unknown) => Promise<RpcResultLike | undefined>) | null = null\r\n\r\nexport function initRpc(call: (endpoint: string, payload: unknown) => Promise<RpcResultLike | undefined>): void {\r\n rpcCallFn = call\r\n}\r\n\r\nasync function rpcCall(method: string, payload: unknown): Promise<unknown> {\r\n if (!rpcCallFn) return undefined\r\n try {\r\n const res = await rpcCallFn(rpcEndpoint(method), payload)\r\n if (res && res.ok === true) return res.value\r\n console.warn(`dsh-any-background: rpc \"${method}\" failed`, res?.error)\r\n return undefined\r\n } catch (e) {\r\n console.warn(`dsh-any-background: rpc \"${method}\" threw`, e)\r\n return undefined\r\n }\r\n}\r\n\r\n// Slider drags fire dozens of events per second; coalesce writes to a trailing\r\n// debounce and flush the last pending write on pagehide so a quick close never\r\n// loses it.\r\nconst SAVE_DEBOUNCE_MS = 250\r\nlet saveTimer: number | undefined\r\n\r\nexport function saveConfig(): void {\r\n if (saveTimer !== undefined) window.clearTimeout(saveTimer)\r\n saveTimer = window.setTimeout(() => {\r\n saveTimer = undefined\r\n void rpcCall('writeConfig', { config: cfg })\r\n }, SAVE_DEBOUNCE_MS)\r\n}\r\n\r\nexport function flushSave(): void {\r\n if (saveTimer === undefined) return\r\n window.clearTimeout(saveTimer)\r\n saveTimer = undefined\r\n void rpcCall('writeConfig', { config: cfg })\r\n}\r\n\r\n/** Persist the current config immediately (import path — no debounce). */\r\nexport function persistConfig(): void {\r\n void rpcCall('writeConfig', { config: cfg })\r\n}\r\n\r\n/** Load the persisted theme (config + wallpaper + video URL) from the node half. */\r\nexport async function loadPersisted(): Promise<void> {\r\n const data = await rpcCall('read', {})\r\n if (data && typeof data === 'object') {\r\n const d = data as { config?: unknown; wallpaper?: unknown; videoUrl?: unknown }\r\n if (d.config) adoptConfig(d.config)\r\n // Uploaded image and video keep their own slots so type switches never\r\n // discard them; in image mode the caller points wpUrl at it.\r\n if (typeof d.wallpaper === 'string') setWpImageUrl(d.wallpaper)\r\n else if (d.wallpaper === null) setWpImageUrl(null)\r\n // The video travels as a serve URL; the frame snapshot is re-captured by\r\n // the boot restore in index.tsx when needed.\r\n if (typeof d.videoUrl === 'string') setWpVideoUrl(d.videoUrl, cfg.videoMime)\r\n else if (d.videoUrl === null) setWpVideoUrl(null, null)\r\n if (cfg.backgroundType === 'image') setWpUrl(d.wallpaper === null ? null : d.wallpaper as string | null)\r\n }\r\n}\r\n\r\n/** Persist a wallpaper (null removes it); one-shot, no debounce. */\r\nexport function persistWallpaper(dataUrl: string | null): void {\r\n void rpcCall('setWallpaper', { dataUrl })\r\n}\r\n\r\n/** Persist a background video (null removes it); resolves true once on disk,\r\n * so callers only switch playback to the serve URL after acceptance. */\r\nexport async function persistVideo(dataUrl: string | null): Promise<boolean> {\r\n const res = await rpcCall('setVideo', { dataUrl })\r\n return res === true\r\n}\r\n\r\n/** Download a wallpaper from a network URL and persist it into the local slot\r\n * (the host replaces wallpaper.jpg). Returns the freshly stored data-URL on\r\n * success, or the host's failure message. */\r\nexport async function setWallpaperFromUrl(url: string): Promise<{ ok: boolean; dataUrl?: string | null; error?: string }> {\r\n if (!rpcCallFn) return { ok: false, error: 'rpc not ready' }\r\n let res: RpcResultLike | undefined\r\n try {\r\n res = await rpcCallFn(rpcEndpoint('setWallpaperUrl'), { url })\r\n } catch (e) {\r\n return { ok: false, error: e instanceof Error ? e.message : String(e) }\r\n }\r\n if (!res) return { ok: false, error: 'no response' }\r\n if (res.ok !== true) {\r\n const err = (res as { error?: { message?: string } }).error\r\n return { ok: false, error: err?.message ?? 'request failed' }\r\n }\r\n const v = res.value as { ok?: boolean; dataUrl?: string | null; error?: string }\r\n return v?.ok === true\r\n ? { ok: true, dataUrl: v.dataUrl ?? null }\r\n : { ok: false, error: v?.error ?? 'failed' }\r\n}\r\n\r\n/** Upload a video's raw bytes over HTTP (MIME in Content-Type, body untouched\r\n * — no base64 inflation that would blow the RPC body limit on large clips). */\r\nexport async function uploadVideo(blob: Blob, mime: string): Promise<boolean> {\r\n try {\r\n const res = await fetch(VIDEO_UPLOAD_URL, {\r\n method: 'POST',\r\n headers: { 'Content-Type': mime || 'application/octet-stream' },\r\n body: blob,\r\n })\r\n return res.ok\r\n } catch (e) {\r\n console.warn('dsh-any-background: video upload failed', e)\r\n return false\r\n }\r\n}\r\n","import type { BgState, ColorPalette } from '../types'\n\n// The wheel works in HSV end to end; storage and genTokens expect HSL, so\n// setColor converts HSV → HSL at the boundary and sectionInject converts the\n// stored 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\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-bg-module-platform': hsl(h(0), s(0), l(0.05)),\n '--dsw-alias-bg-multi-select': hsl(h(0), s(0), l(0.1)),\n '--dsw-alias-bg-skeleton': 'rgba(255,255,255,0.08)',\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-border-l3': 'rgba(255,255,255,0.16)',\n '--dsw-alias-border-l4': 'rgba(255,255,255,0.2)',\n '--dsw-alias-border-inverted': 'rgba(255,255,255,0.06)',\n '--dsw-alias-label-primary': hsl(0, 0, 1),\n '--dsw-alias-label-secondary': 'rgba(255,255,255,0.85)',\n '--dsw-alias-label-tertiary': 'rgba(255,255,255,0.7)',\n // Placeholder/dim hint — deliberately weaker than the text tiers so a\n // placeholder reads as a hint, never as real input.\n '--dsw-alias-label-caption': 'rgba(255,255,255,0.5)',\n '--dsw-alias-label-dimmed': 'rgba(255,255,255,0.35)',\n '--dsw-alias-label-quaternary': 'rgba(255,255,255,0.25)',\n '--dsw-alias-label-primary-dimmed': 'rgba(255,255,255,0.92)',\n '--dsw-alias-label-primary-foreground': hsl(0, 0, 1),\n // Inverted label sits on a light brand/contrast/badge surface in dark\n // mode, so it must be dark ink, not white.\n '--dsw-alias-label-primary-inverted': hsl(h(0), s(0.08), Math.min(l(0.06), 0.16)),\n '--dsw-alias-label-primary-bluish': 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-fill': hsl(h(0), s(0.1), Math.max(l(0.2), 0.5)),\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-button-floating-fill': hsl(h(0), s(0), l(0.02)),\n '--dsw-alias-button-floating-hover': hsl(h(0), s(0), l(0.1)),\n '--dsw-alias-button-tool-bar-fill': 'rgba(255,255,255,0.08)',\n '--dsw-alias-button-tool-bar-hover': 'rgba(255,255,255,0.12)',\n '--dsw-alias-button-ghost-active-fill': hsl(h(0), s(0), l(0.06)),\n '--dsw-alias-button-ghost-active-border': 'rgba(255,255,255,0.16)',\n '--dsw-alias-button-ghost-active-hover': hsl(h(0), s(0), l(0.09)),\n '--dsw-alias-button-info-fill': '#679efe',\n '--dsw-alias-button-info-hover': '#4176e6',\n '--dsw-alias-button-contrast-fill': hsl(0, 0, 1),\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-hover-solid': rgba(h(0), s(0), Math.max(l(0.15), 0.4), 0.16),\n '--dsw-alias-interactive-bg-hover-accent': 'rgba(255,255,255,0.24)',\n '--dsw-alias-interactive-bg-hover-danger': 'rgba(242,90,90,0.15)',\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-code-block-banner': hsl(h(0), s(0), l(-0.02)),\n '--dsw-alias-markdown-inline-code': hsl(h(0), s(0), l(0.04)),\n '--dsw-alias-markdown-placeholder': hsl(h(0), s(0), l(-0.02)),\n '--dsw-alias-markdown-tag': hsl(h(0), s(0), l(0.05)),\n '--dsw-alias-markdown-citation': hsl(h(0), s(0), l(0.06)),\n '--dsw-alias-markdown-code-segment-selected': hsl(h(0), s(0), l(0.05)),\n '--dsw-alias-markdown-code-segment-unselected': hsl(h(0), s(0), l(-0.05)),\n '--dsw-alias-state-error-primary': '#ff5c72',\n '--dsw-alias-state-error-secondary': '#ff8aa0',\n '--dsw-alias-state-success-primary': '#3ddc84',\n '--dsw-alias-state-success-secondary': '#69eea4',\n // Badge tertiary tokens are the static dark surfaces the UI draws\n // over (trajectory tool/context badges, connection pill, plan chip):\n // aligning them with the native dark 800/900 steps keeps light fix label\n // text readable instead of tint-same-as-background (issue #9).\n '--dsw-alias-state-success-tertiary': '#233c2c',\n '--dsw-alias-state-warn-primary': '#ffb347',\n '--dsw-alias-state-warn-secondary': '#ffc980',\n '--dsw-alias-state-warn-tertiary': '#27241f',\n '--dsw-alias-state-warn-label': '#dd8629',\n '--dsw-alias-state-business-primary': '#679efe',\n '--dsw-alias-state-business-tertiary': '#34415b',\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-specific-menu': hsl(h(0), s(0), l(0.08)),\n '--dsw-specific-bubble': hsl(h(0), s(0), l(0.03)),\n '--dsw-specific-bubble-highlight': hsl(h(0), s(0), l(0.08)),\n '--dsw-specific-selector': hsl(h(0), s(0), l(0.05)),\n '--dsw-specific-login-input': hsl(h(0), s(0), l(0.03)),\n '--dsw-specific-tip': hsl(h(0), s(0), l(0.05)),\n '--dsw-alias-toast-bg': hsl(h(0), s(0), l(0.08)),\n '--dsw-alias-tooltip-bg': hsl(h(0), s(0), l(0.08)),\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': 'rgba(0,0,0,0.85)',\n '--dsw-alias-label-tertiary': 'rgba(0,0,0,0.7)',\n // Placeholder/dim hint — deliberately weaker than the text tiers so a\n // placeholder reads as a hint, never as real input.\n '--dsw-alias-label-caption': 'rgba(0,0,0,0.5)',\n '--dsw-alias-label-dimmed': 'rgba(0,0,0,0.35)',\n '--dsw-alias-label-quaternary': 'rgba(0,0,0,0.25)',\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-button-floating-hover': hsl(h(0), s(-0.1), l(0.16)),\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-specific-menu': hsl(h(0), s(-0.12), l(0.15)),\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: decode the cached data URL → crop the visible\n// (framed) region → downsample to a 64×64 canvas → quantize pixels into 4-bit\n// RGB buckets → discard near-gray / near-black / near-white pixels → pick the\n// most populous vivid bucket (count × saturation bias) → average its members →\n// RGB→HSL → clamp lightness into a band that keeps the light/dark scheme\n// decision unambiguous. Purely client-side and memory-bounded.\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\nfunction 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/** 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: called only when a generated background\n// is switched (from its captured snapshot), never from the animation loop.\n// Decode the frame, downsample to a 32×32 canvas, average Rec.709 luma.\n// Dark frame → light fonts, light frame → dark fonts.\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}\n","import { rWp, rWpImage, rWpVideo, rBgState, rVideoBgState, rBl, rWop, rOps, rSop, rColor, rHasColor, rBlurs, rBgMode, rChatTextOpacity, rTrajectoryOpacity, cfg, setWpUrl, rBgDark, setBgDark, disposeVideoObjectUrl } from './state'\r\nimport type { BackgroundType, GeneratedBgParams, PartOpacities, PartBlurs } from './types'\r\nimport { genTokens, toRgba, extractWallpaperColor, analyzeFrameDark } from './utils/color'\r\nimport { createDynamicBackground, defaultParamsFor } from './utils/bg-generators'\r\n\r\nlet wpEl: HTMLDivElement | null = null\r\nlet videoEl: HTMLVideoElement | null = null\r\nlet appliedTokenNames: string[] = []\r\nlet wpController: { canvas: HTMLCanvasElement; stop: () => void; snapshot: () => string } | null = null\r\nlet snapshotListener: (() => void) | null = null\r\nlet tokenStyleEl: HTMLStyleElement | null = null\r\n\r\nfunction clearDynamicBg(): void {\r\n wpController?.stop()\r\n wpController?.canvas.remove()\r\n wpController = null\r\n}\r\n\r\n/** Register a callback fired once a generated snapshot is ready (so the caller\r\n * can re-sync the settings preview / store). */\r\nexport function onGeneratedSnapshot(cb: () => void): void {\r\n snapshotListener = cb\r\n}\r\n\r\nfunction ensureTokenStyle(): HTMLStyleElement {\r\n if (tokenStyleEl?.isConnected) return tokenStyleEl\r\n tokenStyleEl = document.createElement('style')\r\n tokenStyleEl.dataset.plugin = 'dsh-any-background-tokens'\r\n document.head.appendChild(tokenStyleEl)\r\n return tokenStyleEl\r\n}\r\n\r\nfunction clearCustomTokens(): void {\r\n if (tokenStyleEl) tokenStyleEl.textContent = ''\r\n for (const name of appliedTokenNames) document.body.style.removeProperty(name)\r\n appliedTokenNames = []\r\n}\r\n\r\n/** Label tokens flipped by the generated-background brightness verdict. The\r\n * faint tiers (caption/dimmed) are deliberately NOT flipped: they back\r\n * placeholder/hint text, which must stay visibly weaker than real input even\r\n * when the wallpaper brightness flips the main label direction. */\r\nconst LABEL_TOKENS = [\r\n '--dsw-alias-label-primary',\r\n '--dsw-alias-label-secondary',\r\n '--dsw-alias-label-tertiary',\r\n]\r\n\r\n// Solid surface tokens grouped by which interface-opacity slider owns them.\r\n// Every member is re-emitted with per-part alpha so surfaces over the wallpaper\r\n// (composer input, elevated buttons, menu panels) can go translucent — not just\r\n// the layered bg/sidebar tokens. --dsw-specific-menu (dropdowns, slash-trigger\r\n// menu, model selector, popovers around the dialog) is owned by the card\r\n// slider; the Cordis panel shares that token but is re-scoped to the input\r\n// slider via INPUT_BLUR_RULE.\r\nconst OPACITY_TOKEN_GROUPS: Array<{ part: keyof PartOpacities; names: string[] }> = [\r\n { part: 'bg', names: ['--dsw-alias-bg-base'] },\r\n { part: 'sidebar', names: ['--dsw-specific-sidebar-fill'] },\r\n { part: 'card', names: ['--dsw-alias-bg-layer-1', '--dsw-alias-bg-layer-2', '--dsw-alias-bg-layer-3', '--dsw-specific-menu'] },\r\n { part: 'input', names: ['--dsw-specific-input-major'] },\r\n]\r\n\r\n// Plugin-owned variables the opacity-bearing tokens read from. They live as\r\n// inline custom props on <html>, so a slider drag rewrites only those few values\r\n// instead of re-parsing/re-matching the whole body token rule on every tick —\r\n// the difference is critical when a large wallpaper sits under the interface.\r\nconst OPACITY_VARS: Record<string, string> = {\r\n '--dsw-alias-bg-base': '--dsh-any-op-bg',\r\n '--dsw-specific-sidebar-fill': '--dsh-any-op-sidebar',\r\n '--dsw-alias-bg-layer-1': '--dsh-any-op-card-1',\r\n '--dsw-alias-bg-layer-2': '--dsh-any-op-card-2',\r\n '--dsw-alias-bg-layer-3': '--dsh-any-op-card-3',\r\n '--dsw-specific-input-major': '--dsh-any-op-input',\r\n '--dsw-specific-menu': '--dsh-any-op-menu',\r\n}\r\n\r\n// Fingerprint of the non-alpha token base (color pick + brightness verdict).\r\n// The static body rule is only rebuilt when it changes; a drag never touches it.\r\nlet baseTokenKey = ''\r\n\r\n// Coalesce slider-driven token updates to one rAF: a single drag fires several\r\n// input events per frame, and every full re-apply repaints expensive regions\r\n// over a large wallpaper. Batching keeps at most one update per frame. The\r\n// base-fingerprint gate above already makes a muted drag cheap; this prevents\r\n// repeated identical reapplies from stacking within the same frame.\r\nlet pendingOps: PartOpacities | null = null\r\nlet tokensRaf: number | null = null\r\n\r\nexport function applyCustomTokens(ops: PartOpacities): void {\r\n pendingOps = ops\r\n if (tokensRaf !== null) return\r\n tokensRaf = requestAnimationFrame(() => {\r\n tokensRaf = null\r\n if (pendingOps === null) return\r\n const o = pendingOps\r\n pendingOps = null\r\n applyCustomTokensNow(o)\r\n })\r\n}\r\n\r\n// Only the main-bg slider retints the center/details columns; keys on\r\n// baseTokenKey + ops.bg so a sidebar/card/input drag never rewrites them.\r\nlet lastBgKey = ''\r\n\r\nfunction applyCustomTokensNow(ops: PartOpacities): void {\r\n const [h, s, l] = rColor()\r\n let { tokens } = genTokens(h, s, l)\r\n try {\r\n // The generated background's brightness verdict overrides only the font\r\n // direction; genTokens' result is cached and shared, so clone before\r\n // overriding.\r\n const dark = rBgDark()\r\n if (dark !== null) {\r\n tokens = { ...tokens }\r\n const font = dark ? '#fff' : '#000'\r\n for (const name of LABEL_TOKENS) tokens[name] = font\r\n }\r\n const forceDark = dark ?? l < 0.55\r\n if (`${h}|${s}|${l}|${dark}` !== baseTokenKey) {\r\n baseTokenKey = `${h}|${s}|${l}|${dark}`\r\n // Drive the base-palette switch with a plugin-specific value so the\r\n // gradient rule never matches a host dark-mode flag; color-scheme makes\r\n // native controls (select popups) follow the forced palette. Both ride the\r\n // stylesheet (not inline styles) so the host presenter clearing body\r\n // inline styles on boot can't drop them, and the !important rule survives\r\n // that clearing too.\r\n if (forceDark) document.body.setAttribute('data-ds-dark-theme', 'dsh-any-background')\r\n else document.body.removeAttribute('data-ds-dark-theme')\r\n const decls: string[] = [`color-scheme:${forceDark ? 'dark' : 'light'}`]\r\n for (const [name, value] of Object.entries(tokens)) {\r\n const opVar = OPACITY_VARS[name]\r\n decls.push(`${name}:${opVar !== undefined ? `var(${opVar})` : value}!important`)\r\n }\r\n ensureTokenStyle().textContent = `body{${decls.join(';')}}`\r\n // Drop inline tokens left by earlier builds so the stylesheet is the single source of truth.\r\n for (const name of appliedTokenNames) document.body.style.removeProperty(name)\r\n appliedTokenNames = Object.keys(tokens)\r\n }\r\n // Cheap per-drag update: only the surface alpha vars move on <html>.\r\n const root = document.documentElement\r\n for (const g of OPACITY_TOKEN_GROUPS) {\r\n for (const name of g.names) {\r\n root.style.setProperty(OPACITY_VARS[name], toRgba(tokens[name] ?? '#000', ops[g.part]))\r\n }\r\n }\r\n // The Cordis panel keeps its own input-slider alpha (see INPUT_BLUR_RULE).\r\n root.style.setProperty('--dsh-any-op-menu-cordis', toRgba(tokens['--dsw-specific-menu'] ?? '#000', ops.input))\r\n const bgKey = `${baseTokenKey}|${ops.bg}`\r\n if (bgKey !== lastBgKey) { lastBgKey = bgKey; applyPartOpacities(ops) }\r\n } catch {\r\n // ignore\r\n }\r\n}\r\n\r\n// ── Settings panel opacity ─────────────────────────────────────────────────────\r\n// The settings modal is the only aria-modal dialog identifying itself with\r\n// aria-labelledby, so this selector scopes translucency to the settings panel.\r\n// The surface (--dsw-alias-bg-layer-2) is re-emitted with an alpha through a\r\n// plugin-owned variable so the panel keeps its color while fading.\r\n\r\nconst SETTINGS_PANEL_SEL = '[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby]'\r\nexport const SETTINGS_STYLE_RULE =\r\n `${SETTINGS_PANEL_SEL}{` +\r\n `background:var(--dsh-any-bg-settings-surface,var(--dsw-alias-bg-layer-2));` +\r\n `backdrop-filter:var(--dsh-any-blur-settings,none);` +\r\n // Re-scope the dialog's layer tokens to plugin-owned variables so every\r\n // surface inside the dialog follows the settings opacity slider only.\r\n `--dsw-alias-bg-layer-1:var(--dsh-any-bg-settings-layer-1);` +\r\n `--dsw-alias-bg-layer-2:var(--dsh-any-bg-settings-layer-2);` +\r\n `--dsw-alias-bg-layer-3:var(--dsh-any-bg-settings-layer-3)}` +\r\n // Option-panel blur inside the dialog, owned by the card blur slider.\r\n `${SETTINGS_PANEL_SEL} .dab-card{backdrop-filter:var(--dsh-any-blur-card-panels,none);-webkit-backdrop-filter:var(--dsh-any-blur-card-panels,none)}`\r\n\r\n// Input/control surface blur. The composer card and the Cordis panel expose\r\n// stable host data attributes ([data-composer-card], [data-cordis-panel]), so\r\n// the backdrop is attached via a stylesheet rule rather than element discovery.\r\n// The Cordis panel shares the --dsw-specific-menu token with the dialog's\r\n// option boxes, but it stays owned by the input slider — the re-scope below\r\n// keeps it there now that the menu token itself follows the card slider. Note\r\n// the input slider must NOT drive the button-elevated-fill /\r\n// button-floating-hover tokens: the settings panel's own controls (slider\r\n// thumbs, .dab-btn, segmented thumb) are painted from those same tokens, so\r\n// tinting them would bleach the panel's own UI.\r\nexport const INPUT_BLUR_RULE =\r\n '[data-composer-card],[data-cordis-panel]{' +\r\n '-webkit-backdrop-filter:var(--dsh-any-input-blur,none);' +\r\n 'backdrop-filter:var(--dsh-any-input-blur,none)}' +\r\n '[data-cordis-panel]{--dsw-specific-menu:var(--dsh-any-op-menu-cordis)!important}'\r\n\r\nfunction applyInputBlur(px: number): void {\r\n if (px > 0) document.documentElement.style.setProperty('--dsh-any-input-blur', `blur(${px}px)`)\r\n else document.documentElement.style.removeProperty('--dsh-any-input-blur')\r\n}\r\n\r\n// Placeholder/hint text inside the composer and the plugin's own input\r\n// surfaces: rendered with the weak caption token (distinct from real input)\r\n// plus italic, so an empty box is never mistaken for typed content. Written\r\n// as a rule so it also covers placeholder text colored by the host's text tier.\r\nexport const PLACEHOLDER_RULE =\r\n '[data-composer-card] textarea::placeholder,' +\r\n '[data-composer-card] input::placeholder,' +\r\n '[data-composer-card] [contenteditable]::placeholder,' +\r\n '[data-cordis-panel] input::placeholder,' +\r\n '[data-cordis-panel] textarea::placeholder,' +\r\n '.dab-input::placeholder,' +\r\n '.dab-input textarea::placeholder,' +\r\n '.dab-input input::placeholder' +\r\n '{color:var(--dsh-any-placeholder,var(--dsw-alias-label-caption,#8a8f98))!important;font-style:italic;opacity:.85}'\r\n\r\nexport function applySettingsOverrides(op: number): void {\r\n // Always written explicitly (including 100%) — removing them would make\r\n // SETTINGS_STYLE_RULE fall back to the body layer tokens that\r\n // applyCustomTokens rewrites with the homepage card alpha.\r\n const [h, s, l] = rColor()\r\n const tokens = genTokens(h, s, l).tokens\r\n const layer1 = tokens['--dsw-alias-bg-layer-1']\r\n const layer2 = tokens['--dsw-alias-bg-layer-2']\r\n const layer3 = tokens['--dsw-alias-bg-layer-3']\r\n if (layer2 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-bg-settings-surface', toRgba(layer2, op))\r\n }\r\n // Dialog-scoped layer overrides consumed by SETTINGS_STYLE_RULE; opacity\r\n // follows the settings slider only (the card slider reaches panels via blur).\r\n if (layer1 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-bg-settings-layer-1', toRgba(layer1, op))\r\n }\r\n if (layer2 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-bg-settings-layer-2', toRgba(layer2, op))\r\n }\r\n if (layer3 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-bg-settings-layer-3', toRgba(layer3, op))\r\n }\r\n}\r\n\r\n// ── Trajectory view opacity ──────────────────────────────────────────────\r\n// The trajectory view's own panels fully cover the root, so retinting only the\r\n// root background is invisible. Re-scope the view root's layer tokens to\r\n// plugin-owned variables so every surface follows the trajectory slider.\r\nexport const TRAJECTORY_STYLE_RULE =\r\n '[data-conversation-composer-overlay]{' +\r\n // No fallback inside var(): a self-referential fallback would be a cycle.\r\n '--dsw-alias-bg-layer-1:var(--dsh-any-traj-layer-1);' +\r\n '--dsw-alias-bg-layer-2:var(--dsh-any-traj-layer-2);' +\r\n '--dsw-alias-bg-layer-3:var(--dsh-any-traj-layer-3)}'\r\n\r\nexport function applyTrajectoryOverrides(op: number): void {\r\n // Always written explicitly so the view stays owned by this slider at 100%.\r\n const [h, s, l] = rColor()\r\n const tokens = genTokens(h, s, l).tokens\r\n const layer1 = tokens['--dsw-alias-bg-layer-1']\r\n const layer2 = tokens['--dsw-alias-bg-layer-2']\r\n const layer3 = tokens['--dsw-alias-bg-layer-3']\r\n if (layer1 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-traj-layer-1', toRgba(layer1, op))\r\n }\r\n if (layer2 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-traj-layer-2', toRgba(layer2, op))\r\n }\r\n if (layer3 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-traj-layer-3', toRgba(layer3, op))\r\n }\r\n}\r\n\r\n/** Apply the theme color: use the saved pick directly, or fall back to\r\n * extracting a dominant color from the current wallpaper. */\r\nexport function applyThemeColor(): void {\r\n if (rHasColor()) {\r\n applyWp()\r\n return\r\n }\r\n const url = rWp()\r\n if (url) {\r\n // Video mode samples the frame snapshot through the video's own placement\r\n // state; the image slot's framing does not apply to the snapshot.\r\n const st = cfg.backgroundType === 'video' ? rVideoBgState() : rBgState()\r\n void extractWallpaperColor(url, st).then(hsl => {\r\n if (hsl) cfg.color = hsl\r\n applyWp()\r\n })\r\n } else {\r\n applyWp()\r\n }\r\n}\r\n\r\n/** Switch the background source type. For generated types a new live canvas is\r\n * attached to the wallpaper layer and a snapshot is kept for the store/preview. */\r\nexport function setBackgroundType(type: BackgroundType): void {\r\n cfg.backgroundType = type\r\n if (type === 'image') {\r\n // Restore the retained image upload and drop the generated brightness verdict.\r\n clearDynamicBg()\r\n setBgDark(null)\r\n setWpUrl(rWpImage())\r\n applyThemeColor()\r\n return\r\n }\r\n if (type === 'video') {\r\n // Restore the retained video upload; the frame snapshot stays the preview URL.\r\n clearDynamicBg()\r\n setBgDark(null)\r\n setWpUrl(null)\r\n applyThemeColor()\r\n return\r\n }\r\n // Keep existing params for this generated type so sub-type switches preserve adjustments.\r\n if (!cfg.generatedBg || cfg.generatedBg.type !== type) {\r\n cfg.generatedBg = defaultParamsFor(type)\r\n }\r\n applyGeneratedBg(cfg.generatedBg)\r\n}\r\n\r\nfunction randomSeed(): number {\r\n return Math.floor(Math.random() * 0x7fffffff)\r\n}\r\n\r\n/** Regenerate the current generated background with a new visual seed while\r\n * preserving the user's scale/intensity/speed/density/preset choices. */\r\nexport function regenerateGeneratedBg(): void {\r\n const params = cfg.generatedBg\r\n if (!params || cfg.backgroundType === 'image') return\r\n cfg.generatedBg = { ...params, seed: randomSeed() }\r\n applyGeneratedBg(cfg.generatedBg)\r\n}\r\n\r\n/** Update a generated background's parameters and re-render. */\r\nexport function updateGeneratedBg(params: GeneratedBgParams): void {\r\n cfg.backgroundType = params.type\r\n cfg.generatedBg = params\r\n applyGeneratedBg(params)\r\n}\r\n\r\nfunction applyGeneratedBg(params: GeneratedBgParams): void {\r\n clearDynamicBg()\r\n clearVideoEl()\r\n ensureWpContainer()\r\n wpController = createDynamicBackground(params)\r\n if (wpEl) {\r\n wpEl.style.backgroundImage = 'none'\r\n wpEl.appendChild(wpController.canvas)\r\n }\r\n // The canvas paints its first frame on the next animation tick; only then is\r\n // the snapshot meaningful. Do NOT refresh the palette here — generated\r\n // backgrounds must not overwrite the user's picked theme color.\r\n requestAnimationFrame(() => {\r\n if (!wpController) return\r\n const controller = wpController\r\n const frame = controller.snapshot()\r\n setWpUrl(frame)\r\n applyWp()\r\n snapshotListener?.()\r\n // One-shot brightness verdict from the captured frame to flip font\r\n // direction; never runs in the animation loop.\r\n setBgDark(null)\r\n void analyzeFrameDark(frame).then(dark => {\r\n if (dark === null || wpController !== controller) return\r\n setBgDark(dark)\r\n applyCustomTokens(rOps())\r\n })\r\n })\r\n}\r\n\r\n// ── Per-part interface blur ───────────────────────────────────────────────────\r\n// The AppFrame columns use hashed CSS-module classes, so parts are located\r\n// structurally: the shell overlay carries a stable data attribute and the\r\n// sidebar/center/details columns are its three preceding siblings.\r\n//\r\n// backdrop-filter must NEVER go directly on a host part: it turns the element\r\n// into a containing block for fixed-positioned descendants, which would trap\r\n// the host's settings dialog inside the column. Each blurred part carries an\r\n// isolated ::before underlay holding the backdrop-filter instead.\r\nlet frameEl: HTMLElement | null = null\r\nlet sidebarEl: HTMLElement | null = null\r\nlet centerEl: HTMLElement | null = null\r\nlet detailsEl: HTMLElement | null = null\r\n\r\nconst PART_BLUR_CLASS = 'dab-part-blur'\r\nconst PART_UNDERLAY_CLASS = 'dab-part-underlay'\r\nconst PART_BLUR_RULE =\r\n `${PART_BLUR_CLASS}{isolation:isolate}` +\r\n `.${PART_UNDERLAY_CLASS}{position:absolute;inset:0;z-index:-1;pointer-events:none;border-radius:inherit;` +\r\n `backdrop-filter:var(--dsh-any-part-blur,none);-webkit-backdrop-filter:var(--dsh-any-part-blur,none)}`\r\n\r\nlet partBlurStyleEl: HTMLStyleElement | null = null\r\n\r\nfunction ensurePartBlurStyle(): void {\r\n if (partBlurStyleEl?.isConnected) return\r\n partBlurStyleEl = document.createElement('style')\r\n partBlurStyleEl.dataset.plugin = 'dsh-any-background-parts'\r\n partBlurStyleEl.textContent = PART_BLUR_RULE\r\n document.head.appendChild(partBlurStyleEl)\r\n}\r\n\r\nfunction discoverParts(): void {\r\n const overlay = document.querySelector<HTMLElement>('[data-shell-overlay]')\r\n if (overlay === null) return\r\n const frame = overlay.parentElement\r\n if (frame === null) return\r\n frameEl = frame\r\n const idx = Array.from(frame.children).indexOf(overlay)\r\n sidebarEl = (frame.children[idx - 3] as HTMLElement | undefined) ?? null\r\n centerEl = (frame.children[idx - 2] as HTMLElement | undefined) ?? null\r\n detailsEl = (frame.children[idx - 1] as HTMLElement | undefined) ?? null\r\n}\r\n\r\nfunction setBlur(el: HTMLElement | null, px: number): void {\r\n if (el === null) return\r\n const underlay = el.querySelector<HTMLDivElement>(`:scope > .${PART_UNDERLAY_CLASS}`)\r\n if (px > 0) {\r\n ensurePartBlurStyle()\r\n // The underlay is position:absolute and needs a positioned host: static\r\n // columns get relative (a layout no-op for flex items) that is restored on\r\n // clear; parts the host already positions keep their own scheme.\r\n if (!el.classList.contains(PART_BLUR_CLASS) && getComputedStyle(el).position === 'static') {\r\n el.style.position = 'relative'\r\n el.setAttribute('data-dab-pos-patched', '1')\r\n }\r\n el.classList.add(PART_BLUR_CLASS)\r\n if (underlay === null) {\r\n const node = document.createElement('div')\r\n node.className = PART_UNDERLAY_CLASS\r\n el.prepend(node)\r\n }\r\n el.style.setProperty('--dsh-any-part-blur', `blur(${px}px)`)\r\n } else {\r\n el.classList.remove(PART_BLUR_CLASS)\r\n el.style.removeProperty('--dsh-any-part-blur')\r\n underlay?.remove()\r\n if (el.getAttribute('data-dab-pos-patched') === '1') {\r\n el.style.removeProperty('position')\r\n el.removeAttribute('data-dab-pos-patched')\r\n }\r\n }\r\n}\r\n\r\nfunction applySettingsBlur(px: number): void {\r\n if (px > 0) document.documentElement.style.setProperty('--dsh-any-blur-settings', `blur(${px}px)`)\r\n else document.documentElement.style.removeProperty('--dsh-any-blur-settings')\r\n}\r\n\r\n/** Apply the main-background opacity to the center/details columns instead of\r\n * the frame. The frame's translucent bg-base sits UNDER the sidebar, so\r\n * reducing the main-bg opacity stacked a second alpha onto the sidebar; moving\r\n * the alpha onto the columns keeps the sidebar owned by its own slider. */\r\nfunction applyPartOpacities(ops: PartOpacities): void {\r\n if (!(rHasColor() || rBgDark() !== null)) return\r\n discoverParts()\r\n if (frameEl === null) return\r\n const [h, s, l] = rColor()\r\n const base = genTokens(h, s, l).tokens['--dsw-alias-bg-base']\r\n frameEl.style.background = 'transparent'\r\n if (centerEl !== null) centerEl.style.background = base !== undefined ? toRgba(base, ops.bg) : 'transparent'\r\n if (detailsEl !== null) detailsEl.style.background = base !== undefined ? toRgba(base, ops.bg) : 'transparent'\r\n}\r\n\r\n/** Blur of the option panels inside the settings dialog (.dab-card), owned by\r\n * the \"dialog option panel\" (card) blur slider. Written as a plugin-owned\r\n * variable consumed by SETTINGS_STYLE_RULE — deliberately NOT applied to the\r\n * homepage center/details columns, which this slider must never touch. */\r\nfunction applyCardPanelsBlur(px: number): void {\r\n if (px > 0) document.documentElement.style.setProperty('--dsh-any-blur-card-panels', `blur(${px}px)`)\r\n else document.documentElement.style.removeProperty('--dsh-any-blur-card-panels')\r\n}\r\n\r\n/** Apply per-part interface blur to the AppFrame columns + settings panel. */\r\nexport function applyPartBlurs(blurs: PartBlurs): void {\r\n discoverParts()\r\n // The bg blur frosts the wallpaper behind the main content columns (center +\r\n // details); the frame itself stays unblurred so the sidebar is never\r\n // double-frosted by both the bg and sidebar sliders.\r\n setBlur(frameEl, 0)\r\n setBlur(sidebarEl, blurs.sidebar)\r\n setBlur(centerEl, blurs.bg)\r\n setBlur(detailsEl, blurs.bg)\r\n applyCardPanelsBlur(blurs.card)\r\n applySettingsBlur(blurs.settings)\r\n applyInputBlur(blurs.input)\r\n applyViewCards()\r\n}\r\n\r\n/** Live per-part blur update during slider drag (no full re-apply). */\r\nexport function setPartBlur(part: keyof PartBlurs, v: number): void {\r\n if (part === 'settings') { applySettingsBlur(v); return }\r\n if (part === 'card') { applyCardPanelsBlur(v); return }\r\n if (part === 'input') { applyInputBlur(v); return }\r\n if (part === 'chat' || part === 'trajectory') { applyViewCards(); return }\r\n discoverParts()\r\n if (part === 'bg') { setBlur(centerEl, v); setBlur(detailsEl, v) }\r\n else setBlur(sidebarEl, v)\r\n}\r\n\r\n// ── Conversation view treatments ────────────────────────────────────\r\n// The chat message column is styled as a real card (layer-1 surface + border +\r\n// 16px radius + 18px padding); the trajectory view gets NO card decoration —\r\n// its own panels fully cover the view root, so its opacity slider re-scopes the\r\n// layer tokens inside the view and its blur frosts the backdrop through the\r\n// standard root underlay.\r\n//\r\n// Host structure (deepseek-harness ui-conversation / ui-trajectory):\r\n// ConversationRoot\r\n// header — title + tabs, OUTSIDE the scrollport\r\n// [data-conversation-scroll] — the single scrollport\r\n// [data-chat-flow] ← chat column (flow content, NOT scrollable)\r\n// [data-conversation-composer-overlay] ← trajectory view root\r\n// [data-composer-seat] — sticky composer, a sibling\r\n// The input is sticky inside the same scrollport, so the stable host markers\r\n// are used; generic heuristics remain as a chat fallback for marker-less hosts.\r\n//\r\n// Cards are ALWAYS styled once their host exists — sliders at zero only turn\r\n// surface/border transparent, so the layout never reflows and the view cannot\r\n// jump when a slider leaves zero. Removal happens only at plugin teardown.\r\ninterface ViewCardSpec {\r\n sel: string\r\n mark: string\r\n /** Dataset key prefix holding the stashed pre-card inline values. */\r\n prev: string\r\n opacity: () => number\r\n blur: () => number\r\n /** Generic heuristic fallback (chat card only, hosts without the marker). */\r\n fallback?: boolean\r\n /** No card decoration — surfaces follow scoped layer tokens; only the blur\r\n * underlay is attached to the host element. */\r\n plain?: boolean\r\n}\r\n\r\nconst VIEW_CARDS: ViewCardSpec[] = [\r\n { sel: '[data-chat-flow]', mark: 'data-dab-chat-card', prev: 'dabChatPrev', opacity: rChatTextOpacity, blur: () => rBlurs().chat, fallback: true },\r\n { sel: '[data-conversation-composer-overlay]', mark: 'data-dab-traj-card', prev: 'dabTrajPrev', opacity: rTrajectoryOpacity, blur: () => rBlurs().trajectory, plain: true },\r\n]\r\n\r\nconst viewTargets: Array<HTMLElement | null> = VIEW_CARDS.map(() => null)\r\n\r\nfunction isScrollableY(el: HTMLElement): boolean {\r\n const oy = getComputedStyle(el).overflowY\r\n // 'overlay' covers Chromium's non-standard overflow value.\r\n return oy === 'auto' || oy === 'scroll' || oy === 'overlay'\r\n}\r\n\r\n/** Whether the subtree hosts the chat input (textarea / contenteditable /\r\n * textbox role) — used to keep the card off the input row. */\r\nfunction containsChatEditor(el: HTMLElement): boolean {\r\n return el.querySelector('textarea,[contenteditable=\"true\"],[contenteditable=\"\"],[contenteditable=\"plaintext-only\"],[role=\"textbox\"]') !== null\r\n}\r\n\r\n/** Walk down from a coarse candidate toward the actual message column: stop\r\n * at a scroll container (the card surface must stay pinned to the scroll\r\n * port); while the chat input lives inside, descend into the tallest child that\r\n * does NOT contain it (the header row is short, the input row holds the\r\n * editor); otherwise peel wrappers dominated (>= 85%) by a single child so\r\n * tab bars / titles stay outside the card. */\r\nfunction refineMessageColumn(start: HTMLElement): HTMLElement {\r\n let cur = start\r\n for (let depth = 0; depth < 10; depth++) {\r\n if (isScrollableY(cur)) break\r\n const kids = Array.from(cur.children).filter((k): k is HTMLElement => k instanceof HTMLElement)\r\n if (kids.length === 0) break\r\n const tallest = kids.reduce((a, b) => (b.clientHeight > a.clientHeight ? b : a))\r\n if (containsChatEditor(cur)) {\r\n const candidates = kids.filter(k => !containsChatEditor(k) && k.clientHeight >= cur.clientHeight * 0.4)\r\n if (candidates.length === 0) break\r\n cur = candidates.reduce((a, b) => (b.clientHeight > a.clientHeight ? b : a))\r\n continue\r\n }\r\n if (kids.length > 1 && tallest.clientHeight >= cur.clientHeight * 0.85) { cur = tallest; continue }\r\n break\r\n }\r\n return cur\r\n}\r\n\r\nfunction discoverViewTarget(idx: number, spec: ViewCardSpec): HTMLElement | null {\r\n if (centerEl === null || !document.body.contains(centerEl)) { viewTargets[idx] = null; return null }\r\n // The host marker always wins over a cached fallback (the view may not be\r\n // mounted yet when the plugin applies early).\r\n const marked = centerEl.querySelector<HTMLElement>(spec.sel)\r\n const cached = viewTargets[idx]\r\n if (marked !== null) {\r\n if (cached !== null && cached !== marked) { setBlur(cached, 0); restoreCardHost(cached, spec.mark, spec.prev, spec.plain === true) }\r\n viewTargets[idx] = marked\r\n return marked\r\n }\r\n if (cached !== null && centerEl.contains(cached)) return cached\r\n viewTargets[idx] = null\r\n if (spec.fallback !== true) return null\r\n // On the harness, an absent [data-chat-flow] just means the chat view is not\r\n // mounted (hero phase, trajectory tab) — settling on the whole scrollport\r\n // there would wrap the entire page in the card.\r\n if (centerEl.querySelector('[data-conversation-scroll]') !== null) return null\r\n // Marker-less hosts keep their layout until a slider moves.\r\n if (spec.opacity() <= 0 && spec.blur() <= 0) return null\r\n // Generic fallbacks: the largest vertically scrollable element inside the\r\n // column, or the tallest direct child when the host virtualises scrolling.\r\n let best: HTMLElement | null = null\r\n let bestArea = 0\r\n for (const el of Array.from(centerEl.querySelectorAll<HTMLElement>('*'))) {\r\n if (!isScrollableY(el)) continue\r\n if (el.clientHeight < centerEl.clientHeight * 0.35) continue\r\n const area = el.clientWidth * el.clientHeight\r\n if (area > bestArea) { bestArea = area; best = el }\r\n }\r\n if (best === null) {\r\n for (const el of Array.from(centerEl.children)) {\r\n if (!(el instanceof HTMLElement)) continue\r\n if (el.clientHeight < centerEl.clientHeight * 0.5) continue\r\n if (el.clientHeight > (best?.clientHeight ?? 0)) best = el\r\n }\r\n }\r\n // Coarse candidates are narrowed to the message column itself.\r\n const refined = best !== null ? refineMessageColumn(best) : null\r\n viewTargets[idx] = refined\r\n return refined\r\n}\r\n\r\n/** Stash the host's own inline values so teardown restores them exactly.\r\n * Plain views only get a background override, so only that is stashed. */\r\nfunction stashCardPrev(el: HTMLElement, prev: string, plain: boolean): void {\r\n const ds = el.dataset as Record<string, string | undefined>\r\n ds[prev + 'Bg'] = el.style.getPropertyValue('background')\r\n if (plain) return\r\n ds[prev + 'Border'] = el.style.getPropertyValue('border')\r\n ds[prev + 'Radius'] = el.style.getPropertyValue('border-radius')\r\n ds[prev + 'Padding'] = el.style.getPropertyValue('padding')\r\n}\r\n\r\n/** Undo the inline styling, restoring the host's previous inline values. */\r\nfunction restoreCardHost(el: HTMLElement, mark: string, prev: string, plain: boolean): void {\r\n if (!el.hasAttribute(mark)) return\r\n const ds = el.dataset as Record<string, string | undefined>\r\n const restore = (prop: string, v: string | undefined): void => {\r\n if (v !== undefined && v !== '') el.style.setProperty(prop, v)\r\n else el.style.removeProperty(prop)\r\n }\r\n restore('background', ds[prev + 'Bg'])\r\n if (!plain) {\r\n restore('border', ds[prev + 'Border'])\r\n restore('border-radius', ds[prev + 'Radius'])\r\n restore('padding', ds[prev + 'Padding'])\r\n delete ds[prev + 'Border']; delete ds[prev + 'Radius']; delete ds[prev + 'Padding']\r\n }\r\n delete ds[prev + 'Bg']\r\n el.removeAttribute(mark)\r\n}\r\n\r\n/** Teardown only: strip every view treatment and hand the hosts back untouched. */\r\nfunction removeViewCards(): void {\r\n VIEW_CARDS.forEach((spec, i) => {\r\n const el = viewTargets[i]\r\n if (el !== null) { setBlur(el, 0); restoreCardHost(el, spec.mark, spec.prev, spec.plain === true) }\r\n viewTargets[i] = null\r\n })\r\n}\r\n\r\n// ── Wide markdown tables ──────────────────────────────────────────────────────\r\n// DSH intentionally lets `.md-table-wide` bleed outside the text column (a\r\n// negative --dsh-table-lead margin + max-width:none, set by a host rule like\r\n// `.Sxvs8a_body .md-table-wide`; the prefix is a build-time hash class). That\r\n// bleed only becomes visible once the chat surface gains a visible border, i.e.\r\n// when the chat region opacity or blur is non-zero (see borderAlpha in\r\n// applyViewCards). Under that same condition, pull the table back inside the\r\n// column and let it scroll horizontally. The stable `.md-table-wide` class is\r\n// targeted with !important so the fix survives DSH's changing hash prefixes.\r\n\r\nconst TABLE_FIX_RULE = [\r\n '.md-table-wide {',\r\n ' --dsh-table-spare: 0px !important;',\r\n ' --dsh-table-lead: 0px !important;',\r\n ' box-sizing: border-box !important;',\r\n ' width: 100% !important;',\r\n ' max-width: 100% !important;',\r\n ' margin-left: 0 !important;',\r\n ' padding-left: 0 !important;',\r\n ' padding-bottom: 0 !important;',\r\n ' overflow-x: auto !important;',\r\n '}',\r\n].join('\\n')\r\nlet tableFixStyleEl: HTMLStyleElement | null = null\r\n\r\n/** Toggle the wide-table clamp according to the chat region's opacity & blur. */\r\nfunction syncTableFix(): void {\r\n const needed = rChatTextOpacity() > 0 || rBlurs().chat > 0\r\n if (!needed) {\r\n if (tableFixStyleEl !== null) { tableFixStyleEl.remove(); tableFixStyleEl = null }\r\n return\r\n }\r\n if (tableFixStyleEl === null) {\r\n tableFixStyleEl = document.createElement('style')\r\n tableFixStyleEl.dataset.plugin = 'dsh-any-background-table-fix'\r\n tableFixStyleEl.textContent = TABLE_FIX_RULE\r\n }\r\n if (!tableFixStyleEl.isConnected) document.head.appendChild(tableFixStyleEl)\r\n}\r\n\r\n/** Re-derive the conversation view cards from the current config. Cheap\r\n * enough for live slider drags; the card structure is applied unconditionally\r\n * once the host exists so the layout never reflows when a slider leaves zero. */\r\nexport function applyViewCards(): void {\r\n discoverParts()\r\n if (centerEl === null) return\r\n const [h, s, l] = rColor()\r\n const surface = genTokens(h, s, l).tokens['--dsw-alias-bg-layer-1']\r\n VIEW_CARDS.forEach((spec, i) => {\r\n const target = discoverViewTarget(i, spec)\r\n if (target === null) return\r\n const plain = spec.plain === true\r\n const opacity = spec.opacity()\r\n const blurPx = spec.blur()\r\n if (!plain) {\r\n if (!target.hasAttribute(spec.mark)) stashCardPrev(target, spec.prev, false)\r\n // Mirrors .dab-card (layer-1 background, border, 16px radius, 18px\r\n // padding), written inline so it wins over host stylesheets; the opacity\r\n // slider drives surface alpha and fades the border with it.\r\n const borderAlpha = opacity > 0 ? Math.min(1, opacity * 1.5) : (blurPx > 0 ? 0.35 : 0)\r\n target.style.background = surface !== undefined ? toRgba(surface, opacity) : 'transparent'\r\n target.style.border = surface !== undefined ? `1px solid ${toRgba(surface, borderAlpha)}` : '1px solid transparent'\r\n target.style.borderRadius = '16px'\r\n target.style.padding = '18px'\r\n }\r\n // Plain views write no inline styles — only the blur underlay is hosted here.\r\n target.setAttribute(spec.mark, '1')\r\n setBlur(target, blurPx)\r\n })\r\n syncTableFix()\r\n}\r\n\r\nlet partsObserver: MutationObserver | null = null\r\n\r\n/** Watch for the AppFrame mounting so persisted blurs land even when the shell\r\n * renders after this plugin's apply. Cheap: once all parts are found, the\r\n * callback returns. */\r\nexport function watchParts(): void {\r\n if (partsObserver !== null || typeof MutationObserver === 'undefined') return\r\n partsObserver = new MutationObserver(() => {\r\n if (frameEl !== null && sidebarEl !== null && centerEl !== null && detailsEl !== null && document.body.contains(frameEl)\r\n // Keep re-applying while any card host is absent or was swapped by the host.\r\n && viewTargets.every(el => el !== null && document.body.contains(el))) return\r\n applyPartBlurs(rBlurs())\r\n applyPartOpacities(rOps())\r\n })\r\n partsObserver.observe(document.body, { childList: true, subtree: true })\r\n}\r\n\r\nexport function stopWatchingParts(): void {\r\n partsObserver?.disconnect()\r\n partsObserver = null\r\n}\r\n\r\n// ── Theme-reset watchdog ──────────────────────────────────────────────────\r\n// The host re-asserts its own :root/body scheme rules on mount, on settings\r\n// adoption and after the plugin's startup assertion, toggling the\r\n// `data-ds-dark-theme` attribute off / to a host value — which would paint a\r\n// frame of light surfaces. Watch that flag and, whenever the plugin's own\r\n// value disappears, re-set it and re-emit the token stylesheet within the same\r\n// frame. The guard stops feedback: once our mark is present the handler\r\n// returns, so our own re-assertion cannot re-trigger.\r\nlet themeObserver: MutationObserver | null = null\r\nlet themeRaf = 0\r\n\r\nfunction reassertScheme(): void {\r\n const [, , l] = rColor()\r\n const dark = rBgDark() ?? l < 0.55\r\n if (dark) document.body.setAttribute('data-ds-dark-theme', 'dsh-any-background')\r\n else document.body.removeAttribute('data-ds-dark-theme')\r\n applyCustomTokens(rOps())\r\n}\r\n\r\n/** Re-assert the plugin's forced scheme whenever the host strips it, so a\r\n * refresh / cold-load / set-change never flashes a light frame. Returns a\r\n * disposer for teardown. */\r\nexport function watchThemeResets(): () => void {\r\n if (themeObserver !== null || typeof MutationObserver === 'undefined') return () => undefined\r\n themeObserver = new MutationObserver(() => {\r\n if (document.body.getAttribute('data-ds-dark-theme') === 'dsh-any-background') return\r\n if (!(rHasColor() || rBgDark() !== null)) return\r\n if (themeRaf !== 0) return\r\n themeRaf = requestAnimationFrame(() => {\r\n themeRaf = 0\r\n if (document.body.getAttribute('data-ds-dark-theme') === 'dsh-any-background') return\r\n reassertScheme()\r\n })\r\n })\r\n themeObserver.observe(document.body, { attributes: true, attributeFilter: ['data-ds-dark-theme'] })\r\n themeObserver.observe(document.documentElement, { attributes: true, attributeFilter: ['data-ds-dark-theme'] })\r\n return () => {\r\n themeObserver?.disconnect()\r\n themeObserver = null\r\n }\r\n}\r\n\r\nfunction ensureWpContainer(): void {\r\n if (!wpEl || !document.body.contains(wpEl)) {\r\n wpEl = document.createElement('div')\r\n wpEl.style.cssText = 'position:fixed;inset:0;z-index:-1;pointer-events:none;overflow:hidden;'\r\n document.body.prepend(wpEl)\r\n }\r\n}\r\n\r\nfunction clearVideoEl(): void {\r\n if (videoEl === null) return\r\n videoEl.pause()\r\n videoEl.removeAttribute('src')\r\n videoEl.load()\r\n videoEl.remove()\r\n videoEl = null\r\n}\r\n\r\n/** Intrinsic-size cache for the center mode (native pixels of the current image). */\r\nlet imgNat: { url: string; w: number; h: number } | null = null\r\nfunction imageNatSize(url: string, cb: (w: number, h: number) => void): void {\r\n if (imgNat !== null && imgNat.url === url) { cb(imgNat.w, imgNat.h); return }\r\n const img = new Image()\r\n img.onload = () => {\r\n imgNat = { url, w: img.naturalWidth, h: img.naturalHeight }\r\n cb(img.naturalWidth, img.naturalHeight)\r\n }\r\n img.onerror = () => cb(0, 0)\r\n img.src = url\r\n}\r\n\r\n// ── Drag-time wallpaper downscaling ──────────────────────────────────────────\r\n// Repainting translucent surfaces over a full-resolution wallpaper is expensive\r\n// (proportional to the image's pixel area, worse under backdrop blur). During a\r\n// slider drag we swap the layer's background-image to a bounded-size JPEG copy,\r\n// slashing that per-frame raster cost; the full-res image is restored on release\r\n// and stays browser-cached, so the swap is cheap. Precomputed after each image\r\n// apply so the first drag needs no decode hitch.\r\nconst DRAG_MAX_SIDE = 720\r\n\r\nlet lowResUrl: string | null = null\r\nlet lowResFor = ''\r\nlet dragLow = false\r\n\r\nfunction captureLowRes(url: string, cb: (low: string | null) => void): void {\r\n if (lowResFor === url) { cb(lowResUrl); return }\r\n const img = new Image()\r\n img.onload = () => {\r\n const k = Math.min(1, DRAG_MAX_SIDE / Math.max(img.naturalWidth, img.naturalHeight))\r\n if (k >= 1) { lowResFor = url; lowResUrl = null; cb(null); return }\r\n const c = document.createElement('canvas')\r\n c.width = Math.max(1, Math.round(img.naturalWidth * k))\r\n c.height = Math.max(1, Math.round(img.naturalHeight * k))\r\n const g = c.getContext('2d')\r\n if (!g) { lowResFor = url; lowResUrl = null; cb(null); return }\r\n g.drawImage(img, 0, 0, c.width, c.height)\r\n const low = c.toDataURL('image/jpeg', 0.85)\r\n lowResFor = url; lowResUrl = low\r\n cb(low)\r\n }\r\n img.onerror = () => cb(null)\r\n img.src = url\r\n}\r\n\r\nfunction setDragLow(on: boolean): void {\r\n if (cfg.backgroundType !== 'image' || on === dragLow || !wpEl) return\r\n const full = rWpImage()\r\n if (!full) return\r\n if (on) {\r\n dragLow = true\r\n captureLowRes(full, low => {\r\n if (!dragLow || !wpEl || low === null) return\r\n if (wpEl.style.backgroundImage !== `url(\"${low}\")`) wpEl.style.backgroundImage = `url(\"${low}\")`\r\n })\r\n } else {\r\n dragLow = false\r\n if (wpEl.style.backgroundImage !== `url(\"${full}\")`) wpEl.style.backgroundImage = `url(\"${full}\")`\r\n }\r\n}\r\n\r\n/** While any range slider in the app is being dragged, run the wallpaper at\r\n * reduced resolution; restore on release. Returns a disposer for teardown. */\r\nexport function watchWallpaperDragQuality(): () => void {\r\n const isRange = (t: EventTarget | null): boolean =>\r\n t instanceof HTMLInputElement && t.type === 'range'\r\n const down = (e: PointerEvent): void => { if (isRange(e.target)) setDragLow(true) }\r\n const up = (): void => { if (dragLow) setDragLow(false) }\r\n window.addEventListener('pointerdown', down, true)\r\n window.addEventListener('pointerup', up, true)\r\n window.addEventListener('pointercancel', up, true)\r\n return () => {\r\n window.removeEventListener('pointerdown', down, true)\r\n window.removeEventListener('pointerup', up, true)\r\n window.removeEventListener('pointercancel', up, true)\r\n if (dragLow) setDragLow(false)\r\n }\r\n}\r\n\r\nfunction applyImageWp(url: string): void {\r\n clearDynamicBg()\r\n clearVideoEl()\r\n ensureWpContainer()\r\n const bg = rBgState()\r\n const mode = rBgMode()\r\n const next = `url(\"${url}\")`\r\n // Skip re-setting the same data URL — re-decoding it flashes the wallpaper\r\n // blank for a frame on boot re-applies.\r\n if (wpEl!.style.backgroundImage !== next) {\r\n wpEl!.style.backgroundImage = next\r\n }\r\n if (mode === 'fit') {\r\n wpEl!.style.backgroundRepeat = 'no-repeat'\r\n if (bg.iw > 0) {\r\n // Contain-fit at zoom with the image center pinned to the committed\r\n // fractional viewport point, so the framed region survives viewport changes.\r\n const fit = Math.min(window.innerWidth / bg.iw, window.innerHeight / bg.ih)\r\n const w = bg.iw * fit * bg.zoom\r\n const h = bg.ih * fit * bg.zoom\r\n wpEl!.style.backgroundSize = `${w}px ${h}px`\r\n wpEl!.style.backgroundPosition = `${bg.x * window.innerWidth - w / 2}px ${bg.y * window.innerHeight - h / 2}px`\r\n } else {\r\n // Fresh image: match the editor's initial centered contain view.\r\n wpEl!.style.backgroundSize = 'contain'\r\n wpEl!.style.backgroundPosition = 'center'\r\n }\r\n } else if (mode === 'fill') {\r\n wpEl!.style.backgroundRepeat = 'no-repeat'\r\n wpEl!.style.backgroundSize = 'cover'\r\n wpEl!.style.backgroundPosition = 'center'\r\n } else if (mode === 'stretch') {\r\n wpEl!.style.backgroundRepeat = 'no-repeat'\r\n wpEl!.style.backgroundSize = '100% 100%'\r\n wpEl!.style.backgroundPosition = 'center'\r\n } else if (mode === 'tile') {\r\n wpEl!.style.backgroundRepeat = 'repeat'\r\n // background-size:auto resolves the intrinsic size per tile.\r\n wpEl!.style.backgroundSize = 'auto'\r\n wpEl!.style.backgroundPosition = '0px 0px'\r\n } else {\r\n // Center: native size, centered. The intrinsic size needs an async decode;\r\n // 'contain' keeps a sensible frame until it lands.\r\n wpEl!.style.backgroundRepeat = 'no-repeat'\r\n wpEl!.style.backgroundSize = 'contain'\r\n wpEl!.style.backgroundPosition = 'center'\r\n imageNatSize(url, (w, h) => {\r\n if (!wpEl || wpEl.style.backgroundImage !== next || rBgMode() !== 'center') return\r\n if (w > 0 && h > 0) {\r\n wpEl.style.backgroundSize = `${w}px ${h}px`\r\n wpEl.style.backgroundPosition = 'center'\r\n }\r\n })\r\n }\r\n // Precompute the drag-time downscaled copy now so the first drag swaps without\r\n // a decode hitch (the original is already loaded, so this hits the cache).\r\n captureLowRes(url, () => undefined)\r\n applyWpEffects()\r\n}\r\n\r\n/** Video wallpaper: a muted looping <video> inside the wallpaper layer.\r\n * Placement modes map onto object-fit (tile has no video equivalent and\r\n * falls back to cover). */\r\nfunction applyVideoWp(url: string): void {\r\n clearDynamicBg()\r\n ensureWpContainer()\r\n if (wpEl!.style.backgroundImage !== 'none') wpEl!.style.backgroundImage = 'none'\r\n if (videoEl === null || !videoEl.isConnected) {\r\n videoEl = document.createElement('video')\r\n videoEl.muted = true\r\n videoEl.loop = true\r\n videoEl.autoplay = true\r\n videoEl.playsInline = true\r\n videoEl.preload = 'auto'\r\n videoEl.setAttribute('playsinline', '')\r\n videoEl.style.cssText = 'position:absolute;inset:0;width:100%;height:100%;object-position:center;'\r\n // Attach before loading so the element is in the document when play()\r\n // resolves; a detached video can defer its first rendered frame.\r\n wpEl!.appendChild(videoEl)\r\n videoEl.setAttribute('src', url)\r\n void videoEl.play().catch(() => undefined)\r\n } else if (videoEl.getAttribute('src') !== url) {\r\n // Compare the attribute, not videoEl.src: the property getter resolves to\r\n // an absolute URL that would never match the relative serve URL and would\r\n // restart playback on every re-apply.\r\n videoEl.setAttribute('src', url)\r\n void videoEl.play().catch(() => undefined)\r\n }\r\n const mode = rBgMode()\r\n const bg = rVideoBgState()\r\n if (mode === 'fit' && bg.iw > 0) {\r\n // Editor-committed box at contain-fit scale × zoom, centered on the\r\n // fractional point; object-fit:fill stretches the frame into the box\r\n // (same aspect ratio, so nothing distorts).\r\n const fit = Math.min(window.innerWidth / bg.iw, window.innerHeight / bg.ih)\r\n const w = bg.iw * fit * bg.zoom\r\n const h = bg.ih * fit * bg.zoom\r\n videoEl.style.cssText = `position:absolute;left:${bg.x * window.innerWidth - w / 2}px;top:${bg.y * window.innerHeight - h / 2}px;width:${w}px;height:${h}px;object-fit:fill;`\r\n } else {\r\n videoEl.style.cssText = 'position:absolute;inset:0;width:100%;height:100%;object-position:center;'\r\n videoEl.style.objectFit = mode === 'stretch' ? 'fill' : (mode === 'fill' || mode === 'tile') ? 'cover' : 'contain'\r\n }\r\n applyWpEffects()\r\n}\r\n\r\nfunction applyWpEffects(): void {\r\n if (!wpEl) return\r\n const blur = rBl()\r\n wpEl.style.filter = blur > 0 ? `blur(${blur}px)` : 'none'\r\n wpEl.style.opacity = String(rWop())\r\n}\r\n\r\nexport function applyWp(): void {\r\n const url = rWp()\r\n if (cfg.backgroundType === 'video') {\r\n // The frame snapshot (rWp's video branch) is preview-only; the layer plays\r\n // the video from its own slot.\r\n const vurl = rWpVideo()\r\n if (vurl) {\r\n applyVideoWp(vurl)\r\n } else {\r\n clearDynamicBg()\r\n clearVideoEl()\r\n wpEl?.remove(); wpEl = null\r\n }\r\n } else if (cfg.backgroundType !== 'image' && cfg.generatedBg) {\r\n // Recreate the live canvas from saved params if one is not active yet\r\n // (boot or after import).\r\n clearVideoEl()\r\n if (!wpController) {\r\n applyGeneratedBg(cfg.generatedBg)\r\n return\r\n }\r\n ensureWpContainer()\r\n if (wpController.canvas.parentElement !== wpEl) wpEl!.appendChild(wpController.canvas)\r\n applyWpEffects()\r\n } else if (url) {\r\n applyImageWp(url)\r\n } else {\r\n // No background: tear down the layer but keep tokens/blur intact.\r\n clearDynamicBg()\r\n clearVideoEl()\r\n wpEl?.remove(); wpEl = null\r\n }\r\n // Write tokens only when there is a color to derive them from (a saved pick,\r\n // or a generated background whose brightness verdict is known) — on boot the\r\n // persisted state has not loaded yet, and rColor() would flash the default.\r\n if (rHasColor() || rBgDark() !== null) {\r\n applyCustomTokens(rOps())\r\n }\r\n if (rHasColor()) {\r\n applySettingsOverrides(rSop())\r\n applyTrajectoryOverrides(rTrajectoryOpacity())\r\n }\r\n applyPartBlurs(rBlurs())\r\n}\r\n\r\nexport function teardownWp(): void {\r\n clearDynamicBg()\r\n clearVideoEl()\r\n disposeVideoObjectUrl()\r\n setBgDark(null)\r\n wpEl?.remove(); wpEl = null\r\n clearCustomTokens()\r\n tokenStyleEl?.remove(); tokenStyleEl = null\r\n removeViewCards()\r\n document.body.removeAttribute('data-ds-dark-theme')\r\n document.body.style.removeProperty('color-scheme')\r\n document.documentElement.style.removeProperty('--dsh-any-bg-settings-surface')\r\n document.documentElement.style.removeProperty('--dsh-any-bg-settings-layer-1')\r\n document.documentElement.style.removeProperty('--dsh-any-bg-settings-layer-2')\r\n document.documentElement.style.removeProperty('--dsh-any-bg-settings-layer-3')\r\n document.documentElement.style.removeProperty('--dsh-any-traj-layer-1')\r\n document.documentElement.style.removeProperty('--dsh-any-traj-layer-2')\r\n document.documentElement.style.removeProperty('--dsh-any-traj-layer-3')\r\n document.documentElement.style.removeProperty('--dsh-any-bg-settings-card-surface')\r\n document.documentElement.style.removeProperty('--dsh-any-blur-settings')\r\n document.documentElement.style.removeProperty('--dsh-any-blur-card-panels')\r\n document.documentElement.style.removeProperty('--dsh-any-input-blur')\r\n for (const v of Object.values(OPACITY_VARS)) document.documentElement.style.removeProperty(v)\r\n baseTokenKey = ''\r\n lastBgKey = ''\r\n if (tokensRaf !== null) { cancelAnimationFrame(tokensRaf); tokensRaf = null }\r\n pendingOps = null\r\n tableFixStyleEl?.remove(); tableFixStyleEl = null\r\n setBlur(frameEl, 0); setBlur(sidebarEl, 0); setBlur(centerEl, 0); setBlur(detailsEl, 0)\r\n if (frameEl !== null) frameEl.style.removeProperty('background')\r\n if (centerEl !== null) centerEl.style.removeProperty('background')\r\n if (detailsEl !== null) detailsEl.style.removeProperty('background')\r\n stopWatchingParts()\r\n}\r\n\r\n/** Live wallpaper-opacity updates during slider drag (no full re-apply). */\r\nexport function setWpOpacity(v: number): void {\r\n if (wpEl) wpEl.style.opacity = String(v)\r\n}\r\n\r\n/** Live wallpaper-blur updates during slider drag (no full re-apply). */\r\nexport function setWpBlur(v: number): void {\r\n if (wpEl) wpEl.style.filter = v > 0 ? `blur(${v}px)` : 'none'\r\n}\r\n","/**\r\n * Video-background helpers: capturing a single frame as a JPEG snapshot.\r\n * The snapshot stands in for everything that only understands still images:\r\n * the settings preview, theme-color extraction and the eyedropper. Uploads\r\n * stream the raw file over the binary upload route (see rpc.uploadVideo) —\r\n * a data-URL detour would inflate the bytes and trip the RPC body limit.\r\n */\r\n\r\nfunction grabFrame(v: HTMLVideoElement): string | null {\r\n const w = v.videoWidth, h = v.videoHeight\r\n if (w <= 0 || h <= 0) return null\r\n const canvas = document.createElement('canvas')\r\n canvas.width = w\r\n canvas.height = h\r\n const ctx = canvas.getContext('2d')\r\n if (!ctx) return null\r\n ctx.drawImage(v, 0, 0, w, h)\r\n try {\r\n return canvas.toDataURL('image/jpeg', 0.85)\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Capture one representative frame from a video data URL as a JPEG data URL.\r\n * Seeks to ~10% of the duration (first frame is often black) and waits for\r\n * the seek to land; resolves null when the video cannot be decoded. A timeout\r\n * keeps a broken file from hanging the upload flow.\r\n */\r\nexport function captureVideoSnapshot(url: string): Promise<string | null> {\r\n return new Promise(resolve => {\r\n const v = document.createElement('video')\r\n let settled = false\r\n const done = (r: string | null): void => {\r\n if (settled) return\r\n settled = true\r\n window.clearTimeout(timer)\r\n v.removeAttribute('src')\r\n v.load()\r\n resolve(r)\r\n }\r\n const timer = window.setTimeout(() => done(grabFrame(v)), 6000)\r\n v.muted = true\r\n v.preload = 'auto'\r\n v.playsInline = true\r\n v.onerror = () => done(null)\r\n v.onloadeddata = () => {\r\n // Prefer a frame slightly into the clip; very short clips seek to half.\r\n const target = isFinite(v.duration) && v.duration > 0.6 ? Math.min(v.duration * 0.1, 2) : 0\r\n if (target <= 0) { done(grabFrame(v)); return }\r\n v.onseeked = () => done(grabFrame(v))\r\n try {\r\n v.currentTime = target\r\n } catch {\r\n done(grabFrame(v))\r\n }\r\n }\r\n v.src = url\r\n })\r\n}\r\n","/**\r\n * dsh-any-background — settings UI design system.\r\n *\r\n * The section is styled entirely through these scoped classes instead of the\r\n * host's inline-style approach: animations (page transitions, staggered\r\n * reveals, the rotating orb ring) and pseudo-element effects cannot be\r\n * expressed as React inline styles. Every color reads the host's\r\n * --dsw-alias-* tokens so the panel follows the user's custom theme color and\r\n * light/dark scheme automatically; `color-mix` tints carry a plain-token\r\n * fallback first for older engines.\r\n */\r\nexport const NAV_ITEM_H = 38\r\nexport const NAV_GAP = 4\r\n\r\nexport const UI_CSS = `\r\n/* The section is rendered INLINE inside the host settings dialog's content\r\n * column: the host provides the modal chrome (backdrop, centering, closing).\r\n * These classes style only the embedded shell; transient fixed layers (toast,\r\n * color picker, background editor) escape through Portals on <html>. */\r\n.dab-root{position:relative;color:var(--dsw-alias-label-primary);animation:dab-fade-in .35s ease both;container-type:inline-size;display:flex;flex-direction:column;align-items:center;width:100%;min-width:0;--dab-mono:ui-monospace,\"Cascadia Mono\",\"SF Mono\",Consolas,\"Courier New\",monospace}\r\n.dab-root *,.dab-root *::before,.dab-root *::after{box-sizing:border-box}\r\n.dab-root button{font-family:inherit}\r\n\r\n/* ── shell: nav rail + page body ─────────────────────────────────────────── */\r\n.dab-shell{display:grid;grid-template-columns:158px minmax(0,1fr);gap:26px;align-items:start;padding-bottom:8px;width:100%;max-width:980px;margin:0 auto}\r\n.dab-nav{position:sticky;top:0;display:flex;flex-direction:column;gap:18px}\r\n.dab-brand{display:flex;align-items:center;gap:10px;padding:2px 6px}\r\n.dab-brand-tile{width:30px;height:30px;flex:none;border-radius:9px;display:grid;place-items:center;color:var(--dsw-alias-brand-text);background:var(--dsw-alias-brand-primary);box-shadow:0 4px 14px -4px var(--dsw-alias-brand-primary)}\r\n.dab-brand-name{font-size:13px;font-weight:650;letter-spacing:.01em;line-height:1.25}\r\n.dab-brand-tag{font-size:9px;letter-spacing:.16em;font-weight:600;color:var(--dsw-alias-label-quaternary,var(--dsw-alias-label-tertiary));text-transform:uppercase}\r\n.dab-nav-list{position:relative;display:flex;flex-direction:column;gap:${NAV_GAP}px}\r\n.dab-nav-ind{position:absolute;left:0;right:0;top:0;height:${NAV_ITEM_H}px;border-radius:11px;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);background:color-mix(in srgb,var(--dsw-alias-brand-primary) 13%,transparent);border-color:color-mix(in srgb,var(--dsw-alias-brand-primary) 25%,transparent);transition:transform .38s cubic-bezier(.22,1,.36,1)}\r\n.dab-nav-item{position:relative;z-index:1;display:flex;align-items:center;gap:10px;height:${NAV_ITEM_H}px;padding:0 12px;border:0;background:none;border-radius:11px;color:var(--dsw-alias-label-tertiary);font-size:13px;cursor:pointer;text-align:left;transition:color .22s ease}\r\n.dab-nav-item:hover{color:var(--dsw-alias-label-primary)}\r\n.dab-nav-item.is-active{color:var(--dsw-alias-brand-primary);font-weight:600}\r\n.dab-nav-item svg{flex:none;transition:transform .3s cubic-bezier(.34,1.56,.64,1)}\r\n.dab-nav-item:hover svg{transform:scale(1.14) rotate(-5deg)}\r\n\r\n/* ── page chrome ─────────────────────────────────────────────────────────── */\r\n.dab-page{animation:dab-page-in .4s cubic-bezier(.22,1,.36,1) both;min-width:0;display:flex;flex-direction:column;gap:13px}\r\n.dab-head{margin:2px 0 5px}\r\n.dab-overline{font-size:10.5px;font-weight:700;letter-spacing:.18em;text-transform:uppercase;color:var(--dsw-alias-brand-primary);opacity:.9}\r\n.dab-h1{margin:4px 0 0;font-size:21px;font-weight:700;letter-spacing:-.01em}\r\n.dab-desc{margin:6px 0 0;font-size:12.5px;line-height:1.55;color:var(--dsw-alias-label-tertiary);max-width:56ch}\r\n.dab-card{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);border-radius:16px;padding:18px}\r\n.dab-card-hover{transition:transform .28s ease,box-shadow .28s ease,border-color .28s ease}\r\n.dab-card-hover:hover{transform:translateY(-2px);box-shadow:0 10px 28px -12px rgba(0,0,0,.28)}\r\n.dab-rise{animation:dab-rise-in .55s cubic-bezier(.22,1,.36,1) both;animation-delay:calc(var(--d,0) * 62ms)}\r\n\r\n/* ── accent hero (color orb) ─────────────────────────────────────────────── */\r\n.dab-hero-accent{display:flex;align-items:center;gap:24px;flex-wrap:wrap}\r\n.dab-orb-wrap{position:relative;width:118px;height:118px;flex:none}\r\n.dab-orb{position:absolute;inset:11px;border-radius:50%;background:radial-gradient(circle at 32% 28%,rgba(255,255,255,.5),rgba(255,255,255,0) 44%),var(--c,#888);box-shadow:0 16px 36px -10px var(--c-soft,transparent),inset 0 -10px 20px rgba(0,0,0,.16);animation:dab-orb-in .7s cubic-bezier(.22,1,.36,1) both}\r\n.dab-orb-ring{position:absolute;inset:0;border-radius:50%;background:conic-gradient(from 0deg,transparent 0 30%,var(--c,#888) 46%,transparent 62%,transparent 76%,var(--c,#888) 90%,transparent 100%);-webkit-mask:radial-gradient(farthest-side,transparent calc(100% - 3.5px),#000 calc(100% - 2.5px));mask:radial-gradient(farthest-side,transparent calc(100% - 3.5px),#000 calc(100% - 2.5px));animation:dab-spin 7s linear infinite;opacity:.9}\r\n.dab-hex-caption{font-size:11px;color:var(--dsw-alias-label-tertiary);letter-spacing:.04em}\r\n.dab-hex{font-family:var(--dab-mono);font-size:24px;font-weight:600;letter-spacing:.02em;line-height:1.2;margin-top:2px}\r\n.dab-hsl-row{display:flex;gap:16px;margin-top:7px;font-family:var(--dab-mono);font-size:11px;color:var(--dsw-alias-label-tertiary)}\r\n.dab-hsl-row b{font-weight:600;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\r\n\r\n/* ── swatches ────────────────────────────────────────────────────────────── */\r\n.dab-swatch-title{font-size:12px;font-weight:600;margin-bottom:10px;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\r\n.dab-swatches{display:flex;flex-wrap:wrap;gap:9px}\r\n.dab-swatch{width:25px;height:25px;border-radius:50%;border:0;padding:0;cursor:pointer;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);transition:transform .22s cubic-bezier(.34,1.56,.64,1),box-shadow .22s ease}\r\n.dab-swatch:hover{transform:scale(1.2)}\r\n.dab-swatch.is-on{box-shadow:0 0 0 2px var(--dsw-alias-bg-layer-1),0 0 0 4px var(--dsw-alias-brand-primary)}\r\n\r\n/* ── wheel card ──────────────────────────────────────────────────────────── */\r\n.dab-wheel-card{position:relative;display:flex;align-items:center;justify-content:center;gap:28px;flex-wrap:wrap;padding:24px 18px}\r\n.dab-wheel-glow{position:absolute;width:230px;height:230px;border-radius:50%;filter:blur(48px);opacity:.2;background:var(--c,#888);pointer-events:none;transition:background .4s ease}\r\n.dab-wheel{position:relative;cursor:crosshair;border-radius:50%;box-shadow:0 12px 32px -14px rgba(0,0,0,.4)}\r\n.dab-hint{font-size:11.5px;line-height:1.55;color:var(--dsw-alias-label-tertiary);padding:0 4px}\r\n\r\n/* ── precise color inputs ────────────────────────────────────────────────── */\r\n.dab-inputs{display:flex;flex-direction:column;gap:10px;min-width:172px}\r\n.dab-field{display:flex;align-items:center;gap:8px}\r\n.dab-field-label{width:14px;text-align:center;font-family:var(--dab-mono);font-size:11px;font-weight:600;color:var(--dsw-alias-label-tertiary)}\r\n.dab-num{flex:1;min-width:0;height:30px;padding:0 10px;border-radius:9px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font-family:var(--dab-mono);font-size:12px;outline:none;transition:border-color .2s,box-shadow .2s}\r\n.dab-num:focus{border-color:var(--dsw-alias-brand-primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--dsw-alias-brand-primary) 18%,transparent)}\r\n.dab-num::-webkit-outer-spin-button,.dab-num::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}\r\n.dab-num{-moz-appearance:textfield;appearance:textfield}\r\n.dab-urlinput{flex:1;min-width:180px;height:34px;padding:0 12px;border-radius:10px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font-size:12.5px;outline:none;transition:border-color .2s}\r\n.dab-urlinput::placeholder{color:var(--dsw-alias-label-quaternary)}\r\n.dab-urlinput:focus{border-color:var(--dsw-alias-brand-primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--dsw-alias-brand-primary) 18%,transparent)}\r\n.dab-swatch-lg{height:38px;border-radius:10px;border:1px solid var(--dsw-alias-border-l2);box-shadow:inset 0 0 14px rgba(0,0,0,.1);transition:transform .3s ease}\r\n.dab-swatch-lg:hover{transform:scale(1.02)}\r\n\r\n/* ── buttons & chips ─────────────────────────────────────────────────────── */\r\n.dab-btn{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:34px;padding:0 14px;border-radius:10px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-elevated-fill);color:var(--dsw-alias-label-primary);font-size:12.5px;font-weight:550;cursor:pointer;transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease,opacity .18s ease,background .18s ease}\r\n.dab-btn:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 5px 14px -6px rgba(0,0,0,.32)}\r\n.dab-btn:active:not(:disabled){transform:translateY(0) scale(.97);box-shadow:none}\r\n.dab-btn:disabled{opacity:.5;cursor:not-allowed}\r\n.dab-btn-primary{background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-text);border-color:transparent}\r\n.dab-btn-danger{color:var(--dsw-alias-state-error-primary)}\r\n.dab-btn-ghost{background:transparent;border-color:transparent;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\r\n.dab-btn-ghost:hover:not(:disabled){background:var(--dsw-alias-bg-layer-2);box-shadow:none}\r\n.dab-btn:focus-visible,.dab-nav-item:focus-visible,.dab-seg-item:focus-visible,.dab-swatch:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}\r\n.dab-chip-row{display:flex;flex-wrap:wrap;gap:8px}\r\n.dab-chip{height:30px;padding:0 14px;border-radius:99px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary));font-size:12px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;transition:all .22s ease}\r\n.dab-chip:hover{border-color:var(--dsw-alias-brand-primary);color:var(--dsw-alias-label-primary)}\r\n.dab-chip.is-active{background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-text);border-color:transparent}\r\n\r\n/* ── sliders ─────────────────────────────────────────────────────────────── */\r\n.dab-slider-block{display:flex;flex-direction:column;gap:6px}\r\n.dab-slider-block + .dab-slider-block{margin-top:13px}\r\n.dab-slider-label{font-size:12px;font-weight:550;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\r\n.dab-slider-val{font-family:var(--dab-mono);font-size:11px;color:var(--dsw-alias-label-tertiary);min-width:44px;text-align:right}\r\n.dab-slider{-webkit-appearance:none;appearance:none;flex:1;min-width:0;height:4px;border-radius:99px;outline:none;cursor:pointer;margin:5px 0;background:linear-gradient(to right,var(--dsw-alias-brand-primary) calc(var(--pct,50) * 1%),var(--dsw-alias-border-l2) calc(var(--pct,50) * 1%));transition:height .15s ease}\r\n.dab-slider:hover{height:5px}\r\n.dab-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:15px;height:15px;border-radius:50%;background:var(--dsw-alias-button-elevated-fill,#fff);border:2px solid var(--dsw-alias-brand-primary);box-shadow:0 1px 5px rgba(0,0,0,.28);transition:transform .16s cubic-bezier(.34,1.56,.64,1)}\r\n.dab-slider:hover::-webkit-slider-thumb,.dab-slider:focus-visible::-webkit-slider-thumb{transform:scale(1.22)}\r\n.dab-slider:active::-webkit-slider-thumb{transform:scale(1.34)}\r\n.dab-slider::-moz-range-thumb{width:13px;height:13px;border-radius:50%;background:var(--dsw-alias-button-elevated-fill,#fff);border:2px solid var(--dsw-alias-brand-primary)}\r\n\r\n/* ── interface part cards ────────────────────────────────────────────────── */\r\n.dab-grid-parts{display:grid;grid-template-columns:repeat(auto-fill,minmax(256px,1fr));gap:13px}\r\n.dab-part-head{display:flex;align-items:center;gap:11px;margin-bottom:14px}\r\n.dab-part-ico{width:32px;height:32px;flex:none;border-radius:10px;display:grid;place-items:center;color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-bg-layer-2);background:color-mix(in srgb,var(--dsw-alias-brand-primary) 12%,transparent)}\r\n.dab-part-name{font-size:13.5px;font-weight:600}\r\n.dab-part-badge{margin-left:auto;font-family:var(--dab-mono);font-size:11px;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2);border-radius:99px;padding:3px 9px}\r\n\r\n/* ── segmented control ───────────────────────────────────────────────────── */\r\n.dab-seg{position:relative;display:inline-flex;padding:3px;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:11px}\r\n.dab-seg-thumb{position:absolute;top:3px;bottom:3px;left:3px;width:var(--w,96px);border-radius:8px;background:var(--dsw-alias-button-elevated-fill);box-shadow:0 2px 8px -2px rgba(0,0,0,.28);transition:transform .32s cubic-bezier(.22,1,.36,1)}\r\n.dab-seg-item{position:relative;z-index:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;width:var(--w,96px);height:30px;border:0;background:none;border-radius:8px;color:var(--dsw-alias-label-tertiary);font-size:12.5px;cursor:pointer;transition:color .25s ease}\r\n.dab-seg-item.is-active{color:var(--dsw-alias-label-primary);font-weight:600}\r\n\r\n/* ── toggle switch ───────────────────────────────────────────────────────── */\r\n.dab-toggle{position:relative;width:42px;height:24px;flex:none;border-radius:99px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);cursor:pointer;padding:0;transition:background .28s ease,border-color .28s ease}\r\n.dab-toggle-knob{position:absolute;top:2.5px;left:2.5px;width:17px;height:17px;border-radius:50%;background:var(--dsw-alias-label-secondary,#999);box-shadow:0 1px 3px rgba(0,0,0,.3);transition:transform .28s cubic-bezier(.22,1,.36,1),background .28s ease}\r\n.dab-toggle.is-on{background:var(--dsw-alias-brand-primary);border-color:var(--dsw-alias-brand-primary)}\r\n.dab-toggle.is-on .dab-toggle-knob{transform:translateX(18px);background:#fff}\r\n\r\n/* ── background preview hero ─────────────────────────────────────────────── */\r\n.dab-hero{position:relative;border-radius:16px;overflow:hidden;aspect-ratio:16/9;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2)}\r\n.dab-hero-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;transition:transform .5s cubic-bezier(.22,1,.36,1)}\r\n.dab-hero:hover .dab-hero-img{transform:scale(1.03)}\r\n.dab-hero-empty{position:absolute;inset:6px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;color:var(--dsw-alias-label-tertiary);font-size:12.5px;border:1.5px dashed var(--dsw-alias-border-l2);border-radius:12px;cursor:pointer;background:transparent;transition:border-color .25s,color .25s,background .25s;width:auto;height:auto}\r\n.dab-hero-empty:hover{border-color:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-primary)}\r\n.dab-hero-empty.is-over{border-color:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-primary);background:color-mix(in srgb,var(--dsw-alias-brand-primary) 8%,transparent)}\r\n.dab-hero-badge{position:absolute;top:10px;left:10px;display:inline-flex;align-items:center;gap:5px;height:24px;padding:0 11px;border-radius:99px;background:rgba(0,0,0,.45);color:#fff;font-size:11px;backdrop-filter:blur(6px);pointer-events:none}\r\n.dab-hero-veil{position:absolute;left:0;right:0;bottom:0;padding:34px 12px 12px;display:flex;align-items:flex-end;justify-content:flex-end;gap:8px;background:linear-gradient(to top,rgba(0,0,0,.55),rgba(0,0,0,0));opacity:0;transform:translateY(6px);transition:opacity .3s ease,transform .3s ease}\r\n.dab-hero:hover .dab-hero-veil{opacity:1;transform:none}\r\n.dab-hero-veil .dab-btn{background:rgba(255,255,255,.94);color:#14161a;border-color:transparent;height:30px;font-size:12px}\r\n.dab-hero-veil .dab-btn-danger{color:#dc2626}\r\n\r\n/* ── generated background type cards ─────────────────────────────────────── */\r\n.dab-types{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}\r\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}\r\n.dab-type:hover{transform:translateY(-2px)}\r\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)}\r\n.dab-type-thumb{height:62px;border-radius:9px;overflow:hidden;position:relative}\r\n.dab-type-name{margin-top:9px;font-size:12.5px;font-weight:600;color:var(--dsw-alias-label-primary)}\r\n.dab-type-desc{margin-top:2px;font-size:11px;color:var(--dsw-alias-label-tertiary);line-height:1.4}\r\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)}\r\n.dab-type.is-active .dab-type-check{opacity:1;transform:none}\r\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}\r\n.dab-thumb-shader{background:linear-gradient(120deg,#0ea5e9,#8b5cf6,#d946ef,#0ea5e9);background-size:300% 300%;animation:dab-flow 6s linear infinite}\r\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}\r\n\r\n/* ── seed row ────────────────────────────────────────────────────────────── */\r\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}\r\n.dab-seed-ico{color:var(--dsw-alias-brand-primary);display:grid;place-items:center}\r\n.dab-seed-txt{flex:1;min-width:0}\r\n.dab-seed-title{font-size:12.5px;font-weight:600;display:flex;align-items:center;gap:6px}\r\n.dab-seed-desc{font-size:11px;color:var(--dsw-alias-label-tertiary);margin-top:2px}\r\n.dab-spin{animation:dab-rotate .7s cubic-bezier(.3,.7,.3,1) 1}\r\n\r\n/* ── profile page ────────────────────────────────────────────────────────── */\r\n.dab-profile-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(238px,1fr));gap:13px}\r\n.dab-profile-ico{width:38px;height:38px;border-radius:11px;display:grid;place-items:center;margin-bottom:13px;color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-bg-layer-2);background:color-mix(in srgb,var(--dsw-alias-brand-primary) 12%,transparent)}\r\n.dab-profile-title{font-size:14px;font-weight:650}\r\n.dab-profile-desc{font-size:12px;color:var(--dsw-alias-label-tertiary);line-height:1.55;margin:5px 0 15px}\r\n.dab-footer{margin-top:6px;padding:14px 4px 0;border-top:1px solid var(--dsw-alias-border-l2);display:flex;align-items:center;justify-content:space-between;font-size:11px;color:var(--dsw-alias-label-tertiary)}\r\n.dab-footer-mono{font-family:var(--dab-mono);letter-spacing:.02em}\r\n\r\n/* ── toast ───────────────────────────────────────────────────────────────── */\r\n.dab-toast{position:fixed;left:50%;bottom:30px;transform:translateX(-50%);display:flex;align-items:center;gap:8px;height:38px;padding:0 16px;border-radius:99px;background:var(--dsw-alias-bg-layer-3,var(--dsw-alias-bg-layer-2));border:1px solid var(--dsw-alias-border-l2);box-shadow:0 10px 30px -8px rgba(0,0,0,.38);font-size:12.5px;z-index:10001;animation:dab-toast-in .32s cubic-bezier(.22,1,.36,1) both}\r\n.dab-toast-ok{color:var(--dsw-alias-brand-primary);display:grid;place-items:center}\r\n.dab-toast-err{color:var(--dsw-alias-state-error-primary);display:grid;place-items:center}\r\n\r\n/* ── modals (editor / eyedropper / crash) ────────────────────────────────── */\r\n/* Pin to the viewport explicitly with vw/vh so ancestor padding/margins on\r\n * body cannot shift or clip the overlay; keep it above host sidebar chrome.\r\n * pointer-events:auto re-enables interaction: these overlays render inside a\r\n * Portal root that is pointer-events:none so it never blocks the page alone. */\r\n.dab-overlay{position:fixed;left:0;top:0;width:100vw;height:100vh;z-index:999999;background:rgba(8,10,14,.62);backdrop-filter:blur(8px);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;animation:dab-fade-in .25s ease both;pointer-events:auto}\r\n.dab-overlay-title{color:#fff;font-size:15px;font-weight:600}\r\n.dab-overlay-hint{color:rgba(255,255,255,.62);font-size:12px}\r\n.dab-modal-card{animation:dab-zoom-in .3s cubic-bezier(.22,1,.36,1) both;max-width:calc(100vw - 40px);max-height:calc(100vh - 120px);overflow:auto}\r\n.dab-overlay .dab-btn{background:rgba(255,255,255,.94);color:#14161a;border-color:transparent}\r\n.dab-overlay .dab-btn-primary{background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-text)}\r\n.dab-crash{display:flex;flex-direction:column;gap:10px;align-items:center;padding:28px 18px;border:1px solid var(--dsw-alias-border-l2);border-radius:16px}\r\n.dab-crash-title{font-size:15px;font-weight:650}\r\n.dab-crash-desc{font-size:12px;color:var(--dsw-alias-label-tertiary);text-align:center;line-height:1.5}\r\n\r\n/* ── keyframes ───────────────────────────────────────────────────────────── */\r\n@keyframes dab-fade-in{from{opacity:0}to{opacity:1}}\r\n@keyframes dab-page-in{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}\r\n@keyframes dab-rise-in{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}\r\n@keyframes dab-orb-in{from{opacity:0;transform:scale(.82)}to{opacity:1;transform:none}}\r\n@keyframes dab-spin{to{transform:rotate(360deg)}}\r\n@keyframes dab-rotate{to{transform:rotate(360deg)}}\r\n@keyframes dab-toast-in{from{opacity:0;transform:translate(-50%,10px)}to{opacity:1;transform:translate(-50%,0)}}\r\n@keyframes dab-zoom-in{from{opacity:0;transform:scale(.94) translateY(8px)}to{opacity:1;transform:none}}\r\n@keyframes dab-flow{to{background-position:300% 50%}}\r\n\r\n/* ── responsive & motion preferences ─────────────────────────────────────── */\r\n@container (max-width:620px){\r\n .dab-shell{grid-template-columns:1fr;gap:14px}\r\n .dab-nav{position:static;flex-direction:row;align-items:center;justify-content:space-between;gap:10px}\r\n .dab-nav-list{flex-direction:row;overflow-x:auto;scrollbar-width:none}\r\n .dab-nav-list::-webkit-scrollbar{display:none}\r\n .dab-nav-ind{display:none}\r\n .dab-nav-item{flex:none;padding:0 10px}\r\n .dab-nav-item.is-active{background:var(--dsw-alias-bg-layer-2)}\r\n .dab-types{grid-template-columns:1fr}\r\n}\r\n@container (min-width:621px){\r\n .dab-shell{grid-template-columns:158px minmax(0,1fr);gap:26px}\r\n}\r\n@media (prefers-reduced-motion:reduce){\r\n .dab-root *,.dab-root *::before,.dab-root *::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}\r\n}\r\n`\r\n\r\nconst CSS_ID = 'dab-ui-css'\r\n\r\n/** Inject the design-system stylesheet once per document (HMR-safe). */\r\nexport function ensureUiCss(): void {\r\n if (typeof document === 'undefined') return\r\n let el = document.getElementById(CSS_ID) as HTMLStyleElement | null\r\n if (!el) {\r\n el = document.createElement('style')\r\n el.id = CSS_ID\r\n document.head.appendChild(el)\r\n }\r\n if (el.textContent !== UI_CSS) el.textContent = UI_CSS\r\n}\r\n","import type { ReactNode } from 'react'\r\n\r\n/** Sun glyph, migrated from @deepseek-ai/dsh-client-ui-primitives IconLightOutline16. */\r\nexport const SUN_PATHS = '<path d=\"M11.3496 8C11.3496 6.14985 9.85015 4.65039 8 4.65039C6.14985 4.65039 4.65039 6.14985 4.65039 8C4.65039 9.85015 6.14985 11.3496 8 11.3496C9.85015 11.3496 11.3496 9.85015 11.3496 8ZM12.6504 8C12.6504 10.5681 10.5681 12.6504 8 12.6504C5.43188 12.6504 3.34961 10.5681 3.34961 8C3.34961 5.43188 5.43188 3.34961 8 3.34961C10.5681 3.34961 12.6504 5.43188 12.6504 8Z\" fill=\"currentColor\"/><path d=\"M8.65039 0.5V2.5H7.34961V0.5H8.65039Z\" fill=\"currentColor\"/><path d=\"M8.65039 13.5V15.5H7.34961V13.5H8.65039Z\" fill=\"currentColor\"/><path d=\"M3.15808 2.24035L4.57229 3.65456L3.6525 4.57435L2.23829 3.16014L3.15808 2.24035Z\" fill=\"currentColor\"/><path d=\"M12.3505 11.4327L13.7647 12.8469L12.8449 13.7667L11.4307 12.3525L12.3505 11.4327Z\" fill=\"currentColor\"/><path d=\"M2.24537 12.8469L3.65958 11.4327L4.57937 12.3525L3.16516 13.7667L2.24537 12.8469Z\" fill=\"currentColor\"/><path d=\"M11.4377 3.65455L12.852 2.24033L13.7718 3.16012L12.3575 4.57434L11.4377 3.65455Z\" fill=\"currentColor\"/><path d=\"M0.5 7.35461H2.5V8.6554H0.5L0.5 7.35461Z\" fill=\"currentColor\"/><path d=\"M13.5 7.35461H15.5V8.6554H13.5V8.6554Z\" fill=\"currentColor\"/>'\r\n\r\nexport function SunIcon({ size = 16, className }: { size?: number; className?: string }) {\r\n return (\r\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" dangerouslySetInnerHTML={{ __html: SUN_PATHS }} />\r\n )\r\n}\r\n\r\nfunction Glyph({ children, size = 16, className }: { children: ReactNode; size?: number; className?: string }) {\r\n return (\r\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\r\n {children}\r\n </svg>\r\n )\r\n}\r\n\r\nexport const DropletIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M8 1.9c2.4 2.8 4.3 5 4.3 7.1a4.3 4.3 0 1 1-8.6 0C3.7 6.9 5.6 4.7 8 1.9z\" /></Glyph>\r\n)\r\n\r\nexport const LayersIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M8 2.2 13.2 5 8 7.8 2.8 5 8 2.2z\" /><path d=\"M2.8 8.2 8 11l5.2-2.8\" /><path d=\"M2.8 11.2 8 14l5.2-2.8\" /></Glyph>\r\n)\r\n\r\nexport const PhotoIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"2\" y=\"3.2\" width=\"12\" height=\"9.6\" rx=\"2\" /><circle cx=\"5.7\" cy=\"6.3\" r=\"0.9\" /><path d=\"M14 10.4l-2.8-2.8-4.8 4.8\" /></Glyph>\r\n)\r\n\r\nexport const VideoIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"1.5\" y=\"4.2\" width=\"8.8\" height=\"7.6\" rx=\"2\" /><path d=\"M10.3 6.9l4.2-2.4v7l-4.2-2.4\" /></Glyph>\r\n)\r\n\r\nexport const TextIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M3 4.2h10M3 8h10M3 11.8h6.5\" /></Glyph>\r\n)\r\n\r\nexport const TrajectoryIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M2.5 3.2h11M2.5 6.6h11M2.5 10h11\" /><circle cx=\"4.4\" cy=\"3.2\" r=\"1.1\" /><circle cx=\"8\" cy=\"6.6\" r=\"1.1\" /><circle cx=\"11.4\" cy=\"10\" r=\"1.1\" /></Glyph>\r\n)\r\n\r\nexport const SlidersIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M2.5 4.5h4.9M11.6 4.5h1.9M2.5 11.5h1.9M8.6 11.5h4.9\" /><circle cx=\"9.5\" cy=\"4.5\" r=\"1.7\" /><circle cx=\"5.5\" cy=\"11.5\" r=\"1.7\" /></Glyph>\r\n)\r\n\r\nexport const SparkleIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M7.2 1.8l1.2 3.1 3.1 1.2-3.1 1.2-1.2 3.1-1.2-3.1L2.9 6.1 6 4.9l1.2-3.1z\" /><path d=\"M12 10.5l.5 1.2 1.2.5-1.2.5-.5 1.2-.5-1.2-1.2-.5 1.2-.5.5-1.2z\" /></Glyph>\r\n)\r\n\r\nexport const RefreshIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M13.2 8A5.2 5.2 0 1 1 11.5 4.2\" /><path d=\"M13.4 1.8v2.9h-2.9\" /></Glyph>\r\n)\r\n\r\nexport const DownloadIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M8 2.2v8\" /><path d=\"M4.6 7l3.4 3.4L11.4 7\" /><path d=\"M2.8 13.8h10.4\" /></Glyph>\r\n)\r\n\r\nexport const UploadIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M8 10.4V2.6\" /><path d=\"M4.6 5.8L8 2.4l3.4 3.4\" /><path d=\"M2.8 13.8h10.4\" /></Glyph>\r\n)\r\n\r\nexport const LinkIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M6.6 9.4 9.4 6.6\" /><path d=\"M5.9 11.1l-1.4 1.4a2.6 2.6 0 0 1-3.7-3.7L3.5 6.8\" /><path d=\"M10.1 4.9l1.4-1.4a2.6 2.6 0 0 1 3.7 3.7l-2.1 2.1\" /></Glyph>\r\n)\r\n\r\nexport const LockIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"3.6\" y=\"7.2\" width=\"8.8\" height=\"6\" rx=\"1.4\" /><path d=\"M5.6 7.2V5.4a2.4 2.4 0 0 1 4.8 0v1.8\" /></Glyph>\r\n)\r\n\r\nexport const TrashIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M2.8 4.4h10.4\" /><path d=\"M6.4 4.4V2.9h3.2v1.5\" /><path d=\"M4.4 4.4l.5 8.6h6.2l.5-8.6\" /></Glyph>\r\n)\r\n\r\nexport const EditIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M9.5 4l2.5 2.5\" /><path d=\"M3 13l.8-3L10 3.8 12.2 6 6 12.2 3 13z\" /></Glyph>\r\n)\r\n\r\nexport const PipetteIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><circle cx=\"8\" cy=\"8\" r=\"4.2\" /><path d=\"M8 1.6v2.6M8 11.8v2.6M1.6 8h2.6M11.8 8h2.6\" /></Glyph>\r\n)\r\n\r\nexport const CheckIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M3.2 8.6l3 3L12.8 5\" /></Glyph>\r\n)\r\n\r\nexport const AlertIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M8 2.6l5.4 9.8H2.6L8 2.6z\" /><path d=\"M8 6.8v2.4M8 11.4v.01\" /></Glyph>\r\n)\r\n\r\nexport const CanvasIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"2.2\" y=\"2.2\" width=\"11.6\" height=\"11.6\" rx=\"2\" /></Glyph>\r\n)\r\n\r\nexport const SidebarIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"2.2\" y=\"2.2\" width=\"11.6\" height=\"11.6\" rx=\"2\" /><path d=\"M6.6 2.2v11.6\" /></Glyph>\r\n)\r\n\r\nexport const ChatIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M13.4 4.4v4.4a2 2 0 0 1-2 2H6.2l-3.6 3V4.4a2 2 0 0 1 2-2h6.8a2 2 0 0 1 2 2z\" /></Glyph>\r\n)\r\n\r\nexport const GearIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><circle cx=\"8\" cy=\"8\" r=\"2.1\" /><path d=\"M8 1.7v1.8M8 12.5v1.8M1.7 8h1.8M12.5 8h1.8M3.6 3.6l1.3 1.3M11.1 11.1l1.3 1.3M12.4 3.6l-1.3 1.3M4.9 11.1l-1.3 1.3\" /></Glyph>\r\n)\r\n\r\nexport const InputIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"2.2\" y=\"4\" width=\"11.6\" height=\"8\" rx=\"2\" /><path d=\"M8 6.6v2M7 8h2\" /></Glyph>\r\n)\r\n\r\n","import { Component, type ReactNode } from 'react'\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, rChatTextOpacity, rTrajectoryOpacity } from '../../state'\nimport { saveConfig } from '../../rpc'\nimport { applyCustomTokens, applySettingsOverrides, setPartBlur, applyViewCards, applyTrajectoryOverrides } from '../../wallpaper'\nimport { LiveSlider } from '../LiveSlider'\nimport { CanvasIcon, SidebarIcon, ChatIcon, GearIcon, TextIcon, TrajectoryIcon, InputIcon } 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 /** Conversation text region: tint opacity + blur over the message column. */\n isChat?: boolean\n /** Trajectory view: tint opacity + blur over the whole view surface. */\n isTrajectory?: 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 { opKey: 'input', labelKey: 'uiOpacityInput', Icon: InputIcon },\n { isSettings: true, labelKey: 'uiSop', Icon: GearIcon },\n { isChat: true, labelKey: 'uiChatRegion', Icon: TextIcon },\n { isTrajectory: true, labelKey: 'uiTrajectory', Icon: TrajectoryIcon },\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, isChat, isTrajectory } = part\n const opKey = part.opKey\n // Homepage parts (bg/sidebar/card/input) bind to their own part only;\n // the settings panel (isSettings) binds exclusively to the 'settings'\n // part (--dsh-any-blur-settings / --dsh-any-bg-settings-surface) and\n // must never fall back to a homepage part key — otherwise the dialog\n // panel would track the homepage center/card blur and the home-page\n // opacities. The chat region (isChat) and the trajectory view\n // (isTrajectory) own their own blur keys plus their own tint\n // opacities. Every homepage opKey is also a PartBlurs key (input\n // included), so the shared blur slider dereferences it directly.\n const blurKey: keyof PartBlurs = isChat ? 'chat' : isTrajectory ? 'trajectory' : isSettings ? 'settings' : opKey!\n const opacity = isChat ? rChatTextOpacity() : isTrajectory ? rTrajectoryOpacity() : 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 (isChat) {\n cfg.chatTextOpacity = op\n applyViewCards()\n } else if (isTrajectory) {\n cfg.trajectoryOpacity = op\n applyTrajectoryOverrides(op)\n } else 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 (isChat) {\n cfg.chatTextOpacity = op\n applyViewCards()\n saveConfig()\n } else if (isTrajectory) {\n cfg.trajectoryOpacity = op\n applyTrajectoryOverrides(op)\n saveConfig()\n } else 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'\r\nimport { cfg } from '../state'\r\nimport { Portal } from './Portal'\r\n\r\n/** Placement slot for the active background type: video framing lives in its\r\n * own state so image and video edits never overwrite each other. */\r\nconst activeState = () => cfg.backgroundType === 'video' ? cfg.videoBgState : cfg.bgState\r\n\r\nexport function BgEditor({ url, t, onClose, onCommit }: {\r\n url: string; t: (key: string) => string; onClose: () => void\r\n onCommit: (zoom: number, x: number, y: number, iw: number, ih: number) => void\r\n}) {\r\n const pw = Math.min(window.innerWidth * 0.75, 860)\r\n const ph = Math.round(pw * window.innerHeight / window.innerWidth)\r\n const saved = activeState()\r\n const [zoom, setZoom] = useState(saved.iw > 0 ? saved.zoom : 1)\r\n const [pos, setPos] = useState(saved.iw > 0 ? { x: saved.x * pw, y: saved.y * ph } : { x: 0, y: 0 })\r\n const [imgSize, setImgSize] = useState({ w: 0, h: 0 })\r\n const containerRef = useRef<HTMLDivElement>(null)\r\n const imgRef = useRef<HTMLImageElement>(null)\r\n const dragRef = useRef({ active: false, sx: 0, sy: 0, spx: 0, spy: 0 })\r\n\r\n useEffect(() => {\r\n const img = new Image()\r\n img.onload = () => {\r\n const scale = Math.min(pw / img.width, ph / img.height)\r\n const w = img.width * scale, h = img.height * scale\r\n setImgSize({ w, h })\r\n const s = activeState()\r\n if (s.iw > 0 && s.iw === img.width && s.ih === img.height) {\r\n setZoom(s.zoom)\r\n // Saved x, y are CENTER fractions of the preview: the image center\r\n // lands at (x·pw, y·ph), so the top-left comes from subtracting half\r\n // the displayed (zoom-scaled) image size.\r\n setPos({ x: s.x * pw - w * s.zoom / 2, y: s.y * ph - h * s.zoom / 2 })\r\n } else {\r\n setZoom(1)\r\n setPos({ x: (pw - w) / 2, y: (ph - h) / 2 })\r\n }\r\n }\r\n img.src = url\r\n }, [url, pw, ph])\r\n\r\n const onDown = useCallback((e: React.MouseEvent) => {\r\n e.preventDefault()\r\n dragRef.current = { active: true, sx: e.clientX, sy: e.clientY, spx: pos.x, spy: pos.y }\r\n const onMove = (ev: MouseEvent) => {\r\n if (!dragRef.current.active) return\r\n setPos({ x: dragRef.current.spx + ev.clientX - dragRef.current.sx, y: dragRef.current.spy + ev.clientY - dragRef.current.sy })\r\n }\r\n const onUp = () => { dragRef.current.active = false; document.removeEventListener('mousemove', onMove); document.removeEventListener('mouseup', onUp) }\r\n document.addEventListener('mousemove', onMove); document.addEventListener('mouseup', onUp)\r\n }, [pos])\r\n\r\n const onWheelCb = useCallback((e: WheelEvent) => {\r\n e.preventDefault()\r\n const el = containerRef.current\r\n if (!el) return\r\n const rect = el.getBoundingClientRect()\r\n // Anchor the zoom at the preview center so the mouse position never\r\n // steers where the image grows/shrinks — the current view stays centered.\r\n const mx = rect.width / 2, my = rect.height / 2\r\n // 3% per wheel step (0.97 zoom-out / 1.03 zoom-in).\r\n const factor = e.deltaY > 0 ? 0.97 : 1.03\r\n const nz = Math.max(0.1, Math.min(10, zoom * factor))\r\n const nx = mx - (mx - pos.x) * (nz / zoom)\r\n const ny = my - (my - pos.y) * (nz / zoom)\r\n setZoom(nz); setPos({ x: nx, y: ny })\r\n }, [zoom, pos])\r\n\r\n useEffect(() => {\r\n const el = containerRef.current\r\n if (!el) return\r\n el.addEventListener('wheel', onWheelCb, { passive: false })\r\n return () => el.removeEventListener('wheel', onWheelCb)\r\n }, [onWheelCb])\r\n\r\n const resetView = useCallback(() => {\r\n if (imgSize.w === 0) return\r\n setZoom(1); setPos({ x: (pw - imgSize.w) / 2, y: (ph - imgSize.h) / 2 })\r\n }, [pw, ph, imgSize])\r\n\r\n return (\r\n <Portal>\r\n <div className=\"dab-overlay\" onClick={e => { if (e.target === e.currentTarget) onClose() }}>\r\n <div className=\"dab-overlay-title\">{t('editorTitle')}</div>\r\n <div ref={containerRef} className=\"dab-modal-card\" style={{\r\n position: 'relative', overflow: 'hidden', border: '2px solid rgba(255,255,255,0.3)',\r\n borderRadius: 12, background: '#000', cursor: 'grab', width: pw, height: ph,\r\n }} onMouseDown={onDown}>\r\n <img ref={imgRef} src={url} alt=\"\" draggable={false} style={{\r\n position: 'absolute', transformOrigin: '0 0', pointerEvents: 'none',\r\n width: imgSize.w, height: imgSize.h,\r\n transform: `translate(${pos.x}px,${pos.y}px) scale(${zoom})`,\r\n }} />\r\n </div>\r\n <div className=\"dab-overlay-hint\">{t('editorHint')}</div>\r\n <div style={{ display: 'flex', gap: 10 }}>\r\n <button type=\"button\" className=\"dab-btn\" onClick={resetView}>{t('editorReset')}</button>\r\n <button type=\"button\" className=\"dab-btn\" onClick={onClose}>{t('editorCancel')}</button>\r\n <button type=\"button\" className=\"dab-btn\" onClick={() => onCommit(zoom, (pos.x + imgSize.w * zoom / 2) / pw, (pos.y + imgSize.h * zoom / 2) / ph, imgRef.current?.naturalWidth ?? 0, imgRef.current?.naturalHeight ?? 0)}>{t('editorCommit')}</button>\r\n </div>\r\n </div>\r\n </Portal>\r\n )\r\n}\r\n","import { useRef, useState } from 'react'\r\nimport type { CSSProperties } from 'react'\r\nimport type { ThemeSectionProps, ThemeStoreState, BackgroundType, GeneratedBgParams, BgMode } from '../../types'\r\nimport { cfg, rWop, rBl, rBgMode } from '../../state'\r\nimport { saveConfig, setWallpaperFromUrl } from '../../rpc'\r\nimport { applyWp, setWpOpacity, setWpBlur } from '../../wallpaper'\r\nimport { readImg } from '../../utils/image'\r\nimport { defaultParamsFor } from '../../utils/bg-generators'\r\nimport { BgEditor } from '../BgEditor'\r\nimport { LiveSlider } from '../LiveSlider'\r\nimport { LockIcon, CheckIcon, PhotoIcon, RefreshIcon, SparkleIcon, TrashIcon, UploadIcon, EditIcon, VideoIcon, LinkIcon } from '../icons'\r\n\r\nconst SEG_W = 108\r\nconst BG_MODES: Array<{ mode: BgMode; labelKey: string }> = [\r\n { mode: 'fit', labelKey: 'bgModeFit' },\r\n { mode: 'fill', labelKey: 'bgModeFill' },\r\n { mode: 'stretch', labelKey: 'bgModeStretch' },\r\n { mode: 'tile', labelKey: 'bgModeTile' },\r\n { mode: 'center', labelKey: 'bgModeCenter' },\r\n]\r\n\r\nexport function BackgroundPage({ p }: { p: ThemeSectionProps }) {\r\n const { t, setWp, setVideo, setWop, setBl, setBgType, setGeneratedBg, regenerateBg, setRegenerateOnReload, useStore } = p\r\n const store = useStore((s: ThemeStoreState) => s)\r\n const storeUrl = store.url\r\n const backgroundType = store.backgroundType\r\n const generatedBg = store.generatedBg\r\n const regenerateOnReload = store.regenerateOnReload\r\n\r\n const fileRef = useRef<HTMLInputElement>(null)\r\n const [editorOpen, setEditorOpen] = useState(false)\r\n const [dragOver, setDragOver] = useState(false)\r\n const [spinTick, setSpinTick] = useState(0)\r\n const [urlOpen, setUrlOpen] = useState(false)\r\n const [urlVal, setUrlVal] = useState('')\r\n const [urlBusy, setUrlBusy] = useState(false)\r\n const [urlErr, setUrlErr] = useState<string | null>(null)\r\n // Layout mode is owned by cfg (persisted on click); local mirror only so\r\n // the chip row re-renders on selection.\r\n const [mode, setModeState] = useState<BgMode>(rBgMode())\r\n\r\n const isVideo = backgroundType === 'video'\r\n const isStatic = backgroundType === 'image' || isVideo\r\n const isGenerated = !isStatic\r\n const activeGenType: Exclude<BackgroundType, 'image' | 'video'> = isGenerated && generatedBg ? generatedBg.type : 'mesh'\r\n\r\n const onFileSelect = (f: File) => {\r\n if (f.type.startsWith('video/')) {\r\n // Hand the raw file over directly: it streams to disk over the\r\n // binary upload route. A data-URL detour would inflate the bytes by a\r\n // third (base64) and blow the RPC body limit on large clips.\r\n setVideo(f, f.type)\r\n return\r\n }\r\n readImg(f, d => {\r\n if (d) setWp(d)\r\n })\r\n }\r\n\r\n const onDrop = (e: React.DragEvent) => {\r\n e.preventDefault()\r\n setDragOver(false)\r\n const f = e.dataTransfer.files?.[0]\r\n if (f && (f.type.startsWith('image/') || f.type.startsWith('video/'))) onFileSelect(f)\r\n }\r\n\r\n const applyUrl = async () => {\r\n const u = urlVal.trim()\r\n if (!/^https?:\\/\\//i.test(u)) { setUrlErr(t('bgUrlBadHttp')); return }\r\n setUrlBusy(true)\r\n setUrlErr(null)\r\n const r = await setWallpaperFromUrl(u)\r\n setUrlBusy(false)\r\n if (r.ok) {\r\n // The host already replaced the local wallpaper file; setWp just\r\n // switches the theme to image mode and applies the stored data-URL.\r\n setWp(r.dataUrl ?? null)\r\n setUrlOpen(false)\r\n setUrlVal('')\r\n } else {\r\n setUrlErr(r.error === 'invalid url' || r.error === 'unsupported scheme'\r\n ? t('bgUrlBadHttp')\r\n : (r.error ?? t('bgUrlFail')))\r\n }\r\n }\r\n\r\n const switchToStatic = () => {\r\n if (isStatic) return\r\n setBgType(isVideo || cfg.videoMime !== null ? 'video' : 'image')\r\n }\r\n\r\n const setMode = (m: BgMode) => {\r\n if (m === mode) return\r\n setModeState(m)\r\n cfg.bgMode = m\r\n applyWp()\r\n saveConfig()\r\n }\r\n\r\n const setGenType = (type: Exclude<BackgroundType, 'image' | 'video'>) => {\r\n if (type === activeGenType) return\r\n setBgType(type)\r\n }\r\n\r\n const ensureGenParams = (): GeneratedBgParams => generatedBg ?? defaultParamsFor(activeGenType)\r\n\r\n const updateGenerated = (patch: Partial<GeneratedBgParams>) => {\r\n setGeneratedBg({ ...ensureGenParams(), ...patch } as GeneratedBgParams)\r\n }\r\n\r\n const typeMeta: Array<{ type: Exclude<BackgroundType, 'image' | 'video'>; labelKey: string; descKey: string; thumb: string }> = [\r\n { type: 'mesh', labelKey: 'bgTypeMesh', descKey: 'bgMeshDesc', thumb: 'dab-thumb-mesh' },\r\n { type: 'shader', labelKey: 'bgTypeShader', descKey: 'bgShaderDesc', thumb: 'dab-thumb-shader' },\r\n { type: 'pattern', labelKey: 'bgTypePattern', descKey: 'bgPatternDesc', thumb: 'dab-thumb-pattern' },\r\n ]\r\n\r\n const presetLabel = (key: string) => {\r\n switch (key) {\r\n case 'aurora': return t('presetAurora')\r\n case 'nebula': return t('presetNebula')\r\n case 'noise': return t('presetNoise')\r\n case 'dots': return t('presetDots')\r\n case 'waves': return t('presetWaves')\r\n case 'poly': return t('presetPoly')\r\n default: return key\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n <header className=\"dab-head dab-rise\" style={{ '--d': 0 } as CSSProperties}>\r\n <div className=\"dab-overline\">Canvas</div>\r\n <h2 className=\"dab-h1\">{t('bgTitle')}</h2>\r\n <p className=\"dab-desc\">{t('descBackground')}</p>\r\n </header>\r\n\r\n {/* Preview hero with hover veil */}\r\n <section className=\"dab-rise\" style={{ '--d': 1 } as CSSProperties}>\r\n <div className=\"dab-hero\">\r\n {storeUrl ? (\r\n <>\r\n <img className=\"dab-hero-img\" src={storeUrl} alt=\"\" draggable={false} />\r\n {isGenerated ? (\r\n <span className=\"dab-hero-badge\"><SparkleIcon size={11} />{t('liveBadge')}</span>\r\n ) : isVideo ? (\r\n <span className=\"dab-hero-badge\"><VideoIcon size={11} />{t('bgVideoBadge')}</span>\r\n ) : null}\r\n <div className=\"dab-hero-veil\">\r\n {isStatic && storeUrl ? (\r\n <button type=\"button\" className=\"dab-btn\" disabled={mode !== 'fit'}\r\n title={mode !== 'fit' ? t('bgEditLocked') : undefined}\r\n onClick={() => setEditorOpen(true)}>\r\n <EditIcon size={13} />{t('bgEdit')}\r\n </button>\r\n ) : isGenerated ? (\r\n <button type=\"button\" className=\"dab-btn\" onClick={() => { regenerateBg(); setSpinTick(x => x + 1) }}>\r\n <RefreshIcon size={13} />{t('bgRegenerate')}\r\n </button>\r\n ) : null}\r\n <button type=\"button\" className=\"dab-btn dab-btn-danger\" onClick={() => setWp(null)}>\r\n <TrashIcon size={13} />{t('bgRemove')}\r\n </button>\r\n </div>\r\n </>\r\n ) : (\r\n <button\r\n type=\"button\"\r\n className={`dab-hero-empty${dragOver ? ' is-over' : ''}`}\r\n onClick={() => fileRef.current?.click()}\r\n onDragOver={e => { e.preventDefault(); setDragOver(true) }}\r\n onDragLeave={() => setDragOver(false)}\r\n onDrop={onDrop}>\r\n <UploadIcon size={20} />\r\n <span>{t('dropHint')}</span>\r\n </button>\r\n )}\r\n </div>\r\n </section>\r\n\r\n {/* Source segmented control */}\r\n <section className=\"dab-rise\" style={{ '--d': 2 } as CSSProperties}>\r\n <div className=\"dab-seg\" style={{ '--w': `${SEG_W}px` } as CSSProperties}>\r\n <div className=\"dab-seg-thumb\" style={{ transform: `translateX(${isGenerated ? SEG_W : 0}px)` }} />\r\n <button type=\"button\" className={`dab-seg-item${!isGenerated ? ' is-active' : ''}`} onClick={switchToStatic}>\r\n <PhotoIcon size={14} />{t('bgSourceImage')}\r\n </button>\r\n <button type=\"button\" className={`dab-seg-item${isGenerated ? ' is-active' : ''}`}\r\n onClick={() => { if (!isGenerated) setBgType(generatedBg?.type ?? 'mesh') }}>\r\n <SparkleIcon size={14} />{t('bgSourceGenerated')}\r\n </button>\r\n </div>\r\n </section>\r\n\r\n {/* Mode content */}\r\n {!isGenerated ? (\r\n <section className=\"dab-card dab-card-hover dab-rise\" style={{ '--d': 3 } as CSSProperties}>\r\n <div className=\"dab-chip-row\">\r\n <button type=\"button\" className=\"dab-btn dab-btn-primary\" onClick={() => fileRef.current?.click()}>\r\n <UploadIcon size={14} />{t('bgChoose')}\r\n </button>\r\n <button type=\"button\" className=\"dab-btn dab-btn-ghost\" onClick={() => setUrlOpen(o => !o)}>\r\n <LinkIcon size={14} />{t('bgFromUrl')}\r\n </button>\r\n {storeUrl || isVideo ? (\r\n <>\r\n {isStatic && storeUrl ? (\r\n <button type=\"button\" className=\"dab-btn\" disabled={mode !== 'fit'}\r\n title={mode !== 'fit' ? t('bgEditLocked') : undefined}\r\n onClick={() => setEditorOpen(true)}>\r\n <EditIcon size={14} />{t('bgEdit')}\r\n </button>\r\n ) : null}\r\n <button type=\"button\" className=\"dab-btn dab-btn-ghost dab-btn-danger\" onClick={() => setWp(null)}>\r\n <TrashIcon size={14} />{t('bgRemove')}\r\n </button>\r\n </>\r\n ) : null}\r\n </div>\r\n {urlOpen ? (\r\n <div className=\"dab-urlrow\" style={{ marginTop: 12, display: 'flex', flexWrap: 'wrap', gap: 8, alignItems: 'center' }}>\r\n <input type=\"text\" className=\"dab-urlinput\" value={urlVal} placeholder={t('bgUrlPlaceholder')}\r\n onChange={e => setUrlVal(e.target.value)}\r\n onKeyDown={e => { if (e.key === 'Enter') { e.preventDefault(); void applyUrl() } }}\r\n autoFocus />\r\n <button type=\"button\" className=\"dab-btn dab-btn-primary\" disabled={urlBusy} onClick={() => void applyUrl()}>\r\n {urlBusy ? t('bgUrlApplying') : t('bgUrlApply')}\r\n </button>\r\n <button type=\"button\" className=\"dab-btn\" onClick={() => { setUrlOpen(false); setUrlVal(''); setUrlErr(null) }}>\r\n {t('bgUrlCancel')}\r\n </button>\r\n </div>\r\n ) : null}\r\n {urlErr ? (\r\n <p className=\"dab-urlerr\" style={{ marginTop: 8, color: 'var(--dsw-alias-state-error-primary)', fontSize: 12 }}>{urlErr}</p>\r\n ) : null}\r\n {/* Adaptive placement for image/video backgrounds. \"fit\" keeps the\r\n editor-committed framing; the pan/zoom editor only applies there. */}\r\n <div style={{ marginTop: 16 }}>\r\n <div className=\"dab-swatch-title\">{t('bgModeTitle')}</div>\r\n <div className=\"dab-chip-row\">\r\n {BG_MODES.map(m => (\r\n <button key={m.mode} type=\"button\" className={`dab-chip${mode === m.mode ? ' is-active' : ''}`}\r\n onClick={() => setMode(m.mode)}>\r\n {t(m.labelKey)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n </section>\r\n ) : (\r\n <section className=\"dab-card dab-rise\" style={{ '--d': 3 } as CSSProperties}>\r\n {/* Type cards with animated thumbnails */}\r\n <div className=\"dab-types\">\r\n {typeMeta.map(m => (\r\n <button key={m.type} type=\"button\" className={`dab-type${activeGenType === m.type ? ' is-active' : ''}`} onClick={() => setGenType(m.type)}>\r\n <div className={`dab-type-thumb ${m.thumb}`} />\r\n <div className=\"dab-type-name\">{t(m.labelKey)}</div>\r\n <div className=\"dab-type-desc\">{t(m.descKey)}</div>\r\n <span className=\"dab-type-check\"><CheckIcon size={11} /></span>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Presets (shader / pattern) */}\r\n {activeGenType === 'shader' && generatedBg?.type === 'shader' ? (\r\n <div style={{ marginTop: 14 }}>\r\n <div className=\"dab-swatch-title\">{t('bgShaderPreset')}</div>\r\n <div className=\"dab-chip-row\">\r\n {(['aurora', 'nebula', 'noise'] as const).map(pr => (\r\n <button key={pr} type=\"button\" className={`dab-chip${generatedBg.preset === pr ? ' is-active' : ''}`}\r\n onClick={() => updateGenerated({ preset: pr })}>\r\n {presetLabel(pr)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n ) : null}\r\n\r\n {activeGenType === 'pattern' && generatedBg?.type === 'pattern' ? (\r\n <div style={{ marginTop: 14 }}>\r\n <div className=\"dab-swatch-title\">{t('bgPatternPreset')}</div>\r\n <div className=\"dab-chip-row\">\r\n {(['dots', 'waves', 'poly'] as const).map(pr => (\r\n <button key={pr} type=\"button\" className={`dab-chip${generatedBg.preset === pr ? ' is-active' : ''}`}\r\n onClick={() => updateGenerated({ preset: pr })}>\r\n {presetLabel(pr)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n ) : null}\r\n\r\n {/* Parameter sliders */}\r\n <div style={{ marginTop: 16 }}>\r\n {activeGenType === 'mesh' && generatedBg?.type === 'mesh' ? (\r\n <>\r\n <LiveSlider label={t('bgMeshScale')} min={30} max={300} step={1} def={Math.round(generatedBg.scale * 100)}\r\n fmt={v => `${v}%`} onChange={v => updateGenerated({ scale: v / 100 })} />\r\n <LiveSlider label={t('bgMeshIntensity')} min={0} max={100} step={1} def={Math.round(generatedBg.intensity * 100)}\r\n fmt={v => `${v}%`} onChange={v => updateGenerated({ intensity: v / 100 })} />\r\n </>\r\n ) : null}\r\n {activeGenType === 'shader' && generatedBg?.type === 'shader' ? (\r\n <>\r\n <LiveSlider label={t('bgShaderSpeed')} min={0} max={200} step={1} def={Math.round(generatedBg.speed * 100)}\r\n fmt={v => `${v}%`} onChange={v => updateGenerated({ speed: v / 100 })} />\r\n <LiveSlider label={t('bgShaderScale')} min={30} max={300} step={1} def={Math.round(generatedBg.scale * 100)}\r\n fmt={v => `${v}%`} onChange={v => updateGenerated({ scale: v / 100 })} />\r\n </>\r\n ) : null}\r\n {activeGenType === 'pattern' && generatedBg?.type === 'pattern' ? (\r\n <>\r\n <LiveSlider label={t('bgPatternDensity')} min={0} max={100} step={1} def={Math.round(generatedBg.density * 100)}\r\n fmt={v => `${v}%`} onChange={v => updateGenerated({ density: v / 100 })} />\r\n <LiveSlider label={t('bgPatternScale')} min={30} max={300} step={1} def={Math.round(generatedBg.scale * 100)}\r\n fmt={v => `${v}%`} onChange={v => updateGenerated({ scale: v / 100 })} />\r\n </>\r\n ) : null}\r\n </div>\r\n\r\n {/* Seed lock + regenerate */}\r\n <div className=\"dab-seed\">\r\n <span className=\"dab-seed-ico\"><LockIcon size={15} /></span>\r\n <div className=\"dab-seed-txt\">\r\n <div className=\"dab-seed-title\">{t('seedLock')}</div>\r\n <div className=\"dab-seed-desc\">{!regenerateOnReload ? t('bgSeedLocked') : t('bgSeedUnlocked')}</div>\r\n </div>\r\n <button type=\"button\" className={`dab-toggle${!regenerateOnReload ? ' is-on' : ''}`}\r\n role=\"switch\" aria-checked={!regenerateOnReload}\r\n onClick={() => setRegenerateOnReload(!regenerateOnReload)}>\r\n <span className=\"dab-toggle-knob\" />\r\n </button>\r\n <button type=\"button\" className=\"dab-btn dab-btn-primary\" onClick={() => { regenerateBg(); setSpinTick(x => x + 1) }}>\r\n <span key={spinTick} className=\"dab-spin\" style={{ display: 'grid' }}><RefreshIcon size={13} /></span>\r\n {t('bgRegenerate')}\r\n </button>\r\n </div>\r\n </section>\r\n )}\r\n\r\n {/* Global wallpaper adjustments */}\r\n <section className=\"dab-card dab-card-hover dab-rise\" style={{ '--d': 4 } as CSSProperties}>\r\n <LiveSlider label={t('wpOpacity')} min={0} max={100} step={1} def={Math.round(rWop() * 100)}\r\n fmt={v => `${v}%`}\r\n onInput={v => { const op = v / 100; cfg.wallpaperOpacity = op; setWpOpacity(op); saveConfig() }}\r\n onChange={v => setWop(v / 100)} />\r\n <LiveSlider label={t('bgBlur')} min={0} max={60} step={1} def={rBl()}\r\n fmt={v => `${v}px`}\r\n onInput={v => { cfg.blur = v; setWpBlur(v); saveConfig() }}\r\n onChange={v => setBl(v)} />\r\n <p className=\"dab-hint\" style={{ marginTop: 12 }}>{t('bgHint')}</p>\r\n </section>\r\n\r\n <input ref={fileRef} type=\"file\" accept=\"image/*,video/*\" style={{ display: 'none' }} onChange={e => {\r\n const f = e.target.files?.[0]; if (!f) return\r\n onFileSelect(f); e.target.value = ''\r\n }} />\r\n\r\n {/* Background editor modal (image/video + fit mode only). For videos\r\n the reference is the captured frame snapshot — same pixels as the\r\n playing video, so the committed framing maps 1:1 onto the layer. */}\r\n {editorOpen && storeUrl && isStatic && mode === 'fit' ? (\r\n <BgEditor url={storeUrl} t={t} onClose={() => setEditorOpen(false)}\r\n onCommit={(z, x, y, iw, ih) => {\r\n const st = { zoom: z, x, y, iw, ih }\r\n if (backgroundType === 'video') cfg.videoBgState = st\r\n else cfg.bgState = st\r\n applyWp(); saveConfig(); setEditorOpen(false)\r\n }} />\r\n ) : null}\r\n </>\r\n )\r\n}\r\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 * Wires the plugin lifecycle: theme registration, wallpaper layer, viewport\n * watch, i18n, settings-section injection, boot restore, watchdog. The heavy\n * lifting lives in the sibling modules (state/rpc/wallpaper/utils/components).\n */\nimport { defineStore } from './runtime'\nimport type { Ctx, RpcResultLike, BoundActions, ThemeSectionProps, PartOpacities, PartBlurs, BackgroundType, GeneratedBgParams } from './types'\nimport { NS, zh, en } from './i18n'\nimport { cfg, rHasColor, rColor, rWp, rWpImage, rWpVideo, rBgState, rVideoBgState, setWpUrl, setWpImageUrl, setWpVideoUrl, setWpVideoSnapshot, setBgState, adoptConfig, DEFAULT_CONFIG, setBgDark } from './state'\nimport { RPC_CHANNEL, VIDEO_SERVE_URL, initRpc, saveConfig, flushSave, loadPersisted, persistWallpaper, persistVideo, persistConfig, uploadVideo } from './rpc'\nimport { applyWp, teardownWp, applySettingsOverrides, SETTINGS_STYLE_RULE, TRAJECTORY_STYLE_RULE, INPUT_BLUR_RULE, PLACEHOLDER_RULE, watchParts, watchThemeResets, regenerateGeneratedBg, setBackgroundType, updateGeneratedBg, applyThemeColor, onGeneratedSnapshot, watchWallpaperDragQuality } from './wallpaper'\nimport { genTokens, hslToHsv, hsvToHsl, extractWallpaperColor } from './utils/color'\nimport { captureVideoSnapshot } from './utils/video'\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 (dark pick → white text, light → black).\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 HMR apply pass cannot be torn down\n // here; keep it and activate it below. Without this the duplicate-id\n // throw would abort apply and skip the wallpaper/opacity restore.\n customDispose = null\n }\n // Only activate the custom theme if it is actually registered.\n if (ctx.theme.getTheme().themes.some(t => t.id === CUSTOM_ID)) {\n ctx.theme.setTheme(CUSTOM_ID)\n }\n }\n // 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 const styleEl = document.createElement('style')\n styleEl.dataset.plugin = 'dsh-any-background'\n // Only applies while applyCustomTokens marks the body with the plugin's\n // own dark-mode value, avoiding matches against the host'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}${TRAJECTORY_STYLE_RULE}${INPUT_BLUR_RULE}` + PLACEHOLDER_RULE\n document.head.appendChild(styleEl)\n ctx.effect(() => () => { styleEl?.parentNode?.removeChild(styleEl) }, 'dsh-any-background: gradient')\n\n // Wallpaper downscales to a low-res copy during slider drags, restored on release.\n const disposeDragQuality = watchWallpaperDragQuality()\n ctx.effect(() => () => disposeDragQuality(), 'dsh-any-background: drag quality')\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 and re-apply once it lands (defaults are already\n // applied above; the deferred restore below re-asserts too).\n void loadPersisted().then(() => {\n // Re-register the skin with the restored color so UI and theme never diverge.\n if (rHasColor()) {\n const [h, s, l] = rColor()\n registerCustom(h, s, l)\n }\n // Regenerate on reload if enabled, else reconstruct from saved params.\n if (cfg.backgroundType === 'video') {\n const v = rWpVideo()\n if (v) {\n // The frame snapshot is not persisted: re-capture it for previews.\n void captureVideoSnapshot(v).then(snap => {\n if (rWpVideo() !== v) return\n setWpVideoSnapshot(snap)\n applyThemeColor()\n syncBg()\n })\n applyWp()\n } else {\n // Stored video missing: fall back to the retained image slot.\n cfg.backgroundType = 'image'\n setWpUrl(rWpImage())\n applyThemeColor()\n }\n } else 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 flag land on disk.\n persistConfig()\n } else {\n // Saved pick wins; otherwise extract 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 custom theme's preference lives in memory, so a host adoption can\n // silently reset it; re-assert it while a color is saved. Guard on registry\n // presence — registerCustom disposes the old skin first, so during that\n // transient the registry lacks CUSTOM_ID.\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 // Wallpaper placement is computed in absolute viewport pixels, so watch the\n // viewport itself: a fixed inset:0 sentinel's box always equals the viewport,\n // so a ResizeObserver on it catches any viewport change (window resize,\n // monitor moves, panel splitters, zoom); a resolution media query catches\n // DPI-only moves. Re-applies are coalesced to one per animation frame.\n let frame = 0\n const applySoon = (): void => {\n if (frame !== 0) return\n frame = requestAnimationFrame(() => { frame = 0; applyWp() })\n }\n const sentinel = document.createElement('div')\n sentinel.style.cssText = 'position:fixed;inset:0;pointer-events:none;visibility:hidden'\n document.body.append(sentinel)\n const viewportObserver = new ResizeObserver(applySoon)\n viewportObserver.observe(sentinel)\n const dprQuery = window.matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`)\n dprQuery.addEventListener('change', applySoon)\n ctx.effect(() => () => {\n viewportObserver.disconnect()\n dprQuery.removeEventListener('change', applySoon)\n sentinel.remove()\n }, 'dsh-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 // Play a picked/imported video instantly from a local object URL while its\n // raw bytes stream to disk in the background — no upload + first-buffer\n // wait after import. The serve URL takes over on the next reload.\n const playVideoFromBlob = (blob: Blob, mime: string | null): void => {\n const localUrl = URL.createObjectURL(blob)\n cfg.backgroundType = 'video'\n setWpUrl(null)\n cfg.videoBgState = { ...DEFAULT_CONFIG.bgState }\n setWpVideoUrl(localUrl, mime ?? blob.type ?? 'video/mp4')\n applyWp()\n syncBg()\n const applied = rWpVideo()\n void captureVideoSnapshot(localUrl).then(snap => {\n if (rWpVideo() !== applied) return\n setWpVideoSnapshot(snap)\n applyThemeColor()\n syncBg()\n })\n void uploadVideo(blob, mime ?? blob.type ?? 'video/mp4').then(ok => {\n if (ok) persistConfig()\n })\n }\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 // Preview UI stays synchronous for instant feedback; the expensive work\n // (theme registration + token writes + persist) is debounced by 80ms.\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 canonical color in the store so programmatic changes and\n // 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 upload in its own slot so type switches never lose it.\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 if (u === null) {\n // Removing the background clears the stored video as well.\n setWpVideoUrl(null, null)\n void persistVideo(null)\n }\n applyThemeColor()\n syncBg()\n },\n setVideo: async (u: Blob | string | null, mime: string | null) => {\n setBgDark(null)\n if (u === null) {\n // Removing: clear the stored video and return to the image slot.\n setWpVideoUrl(null, null)\n cfg.backgroundType = 'image'\n setWpUrl(rWpImage())\n void persistVideo(null)\n applyThemeColor()\n syncBg()\n saveConfig()\n return\n }\n if (typeof u !== 'string') {\n // A picked file plays instantly from a local object URL while its raw\n // bytes stream to disk in the background — no upload + buffer wait.\n playVideoFromBlob(u, mime)\n return\n }\n // Legacy data-URL string path: persist, then play from the serve URL.\n const ok = await persistVideo(u)\n const live = ok ? VIDEO_SERVE_URL : u\n cfg.backgroundType = 'video'\n setWpUrl(null)\n cfg.videoBgState = { ...DEFAULT_CONFIG.bgState }\n setWpVideoUrl(live, mime ?? null)\n applyWp()\n saveConfig()\n syncBg()\n const applied = rWpVideo()\n void captureVideoSnapshot(live).then(snap => {\n if (rWpVideo() !== applied) return\n setWpVideoSnapshot(snap)\n applyThemeColor()\n syncBg()\n })\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 // Video mode extracts from the frame snapshot through the video's\n // placement state (rWp already returns the snapshot there).\n const st = cfg.backgroundType === 'video' ? rVideoBgState() : rBgState()\n const hsl = await extractWallpaperColor(url, st)\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, and the video\n // bytes copied in as a data URL when a video background is active.\n // Generated backgrounds are reconstructed from the saved params on\n // import, so their exports stay small.\n exportTheme: async () => {\n let videoPayload: string | null = null\n if (cfg.backgroundType === 'video') {\n const vurl = rWpVideo()\n if (vurl) {\n try {\n const blob = await fetch(vurl).then(r => r.blob())\n videoPayload = await new Promise<string>((resolve, reject) => {\n const fr = new FileReader()\n fr.onload = () => resolve(fr.result as string)\n fr.onerror = () => reject(fr.error)\n fr.readAsDataURL(blob)\n })\n // The serve route may report a generic Content-Type; pin the\n // recorded MIME so the import detector sees data:video/….\n if (videoPayload && !/^data:video\\//.test(videoPayload)) {\n videoPayload = videoPayload.replace(/^data:[^;,]*/, `data:${cfg.videoMime ?? 'video/mp4'}`)\n }\n } catch {\n videoPayload = null\n }\n }\n }\n const payload = {\n version: 2,\n exportedAt: new Date().toISOString(),\n config: cfg,\n wallpaper: cfg.backgroundType === 'image' ? rWp() : null,\n video: videoPayload,\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; video?: unknown }\n if (typeof d.config !== 'object' || d.config === null) return false\n adoptConfig(d.config)\n if (cfg.backgroundType === 'video') {\n const video = typeof d.video === 'string' && /^data:video\\//.test(d.video) ? d.video : null\n if (video !== null) {\n // Decode the embedded data URL to a blob and play it instantly\n // from a local object URL while the bytes stream to disk in the\n // background (the data-URL RPC path stays as the small fallback).\n let blob: Blob | null = null\n try { blob = await fetch(video).then(r => r.blob()) } catch { blob = null }\n if (blob !== null) {\n playVideoFromBlob(blob, cfg.videoMime)\n } else {\n const ok = await persistVideo(video)\n const live = ok ? VIDEO_SERVE_URL : video\n setWpVideoUrl(live, cfg.videoMime)\n applyWp()\n const applied = rWpVideo()\n void captureVideoSnapshot(live).then(snap => {\n if (rWpVideo() !== applied) return\n setWpVideoSnapshot(snap)\n applyThemeColor()\n syncBg()\n })\n }\n } else {\n // Export lacked the video payload: fall back to no background.\n setWpVideoUrl(null, null)\n void persistVideo(null)\n cfg.backgroundType = 'image'\n setWpImageUrl(null)\n setWpUrl(null)\n persistWallpaper(null)\n applyThemeColor()\n }\n } else 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 // 8.5. Theme-reset watchdog: counter the host re-asserting its own light\n // :root/body scheme after startup (refresh, cold load, settings adoption),\n // which would paint a frame of white surfaces.\n const disposeThemeResets = watchThemeResets()\n ctx.effect(() => () => { disposeThemeResets() }, 'dsh-any-background: theme resets watch')\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","useState","useRef","rpcSetVideoFromUrl"],"sources":["../src/client/runtime.ts","../src/client/i18n.ts","../src/client/state.ts","../src/client/rpc.ts","../src/client/utils/image.ts","../src/client/utils/color.ts","../src/client/utils/bg-generators.ts","../src/client/wallpaper.ts","../src/client/utils/video.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/components/BgEditor.tsx","../src/client/components/pages/BackgroundPage.tsx","../src/client/utils/presets.ts","../src/client/components/pages/ProfilePage.tsx","../src/client/components/ThemeSection.tsx","../src/client/index.tsx"],"sourcesContent":["/**\n * Harness-version-agnostic access to the client runtime.\n *\n * Before dsh 0.1.2 the store primitive lived on the composite package\n * `@deepseek-ai/dsh-client-runtime` (the `/client` subpath). The new harness\n * split it into `@deepseek-ai/dsh-client-store`. Both specifiers are kept\n * external so they resolve against the host client-module table; a missing\n * table entry on one side throws (the \"missed the module table\" error) and is\n * caught, falling through to the other package. This lets one bundle load on\n * both the old npm release and the new source.\n *\n * The host's synchronous `require` is injected by the loader into the bundle\n * factory; tsdown keeps these two bare specifiers as external CJS requires so\n * they bind to that factory `require`.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\ninterface StoreModule {\n defineStore: any\n}\n\nfunction resolveStore(): StoreModule {\n try {\n // New harness (dsh >= 0.1.2): dedicated store package after the runtime\n // was split. Missing here means the loader table has no such row → throw.\n return require('@deepseek-ai/dsh-client-store') as StoreModule\n } catch {\n /* fall through to the legacy composite runtime below */\n }\n // Legacy harness (npm release): composite runtime, /client subpath.\n return require('@deepseek-ai/dsh-client-runtime/client') as StoreModule\n}\n\nexport const defineStore: any = resolveStore().defineStore","export const NS = 'settings.anyBg'\r\n\r\nexport const zh: Record<string, string> = {\r\n nav: '主题', brandTag: '外观定制', close: '关闭',\r\n pageColor: '色彩', pageInterface: '界面', pageBackground: '背景', pageProfile: '配置',\r\n descColor: '拖动色轮或输入精确数值,整个界面的配色将实时跟随变化',\r\n descInterface: '为主界面的各个区域单独调节透明度与模糊,营造空间层次感',\r\n descBackground: '上传一张图片或一段视频作为壁纸并自由摆放,或让算法为你实时生成动态背景',\r\n descProfile: '一键套用外观预设,保存多套配置随时切换,设置昼夜自动换装,或导出/导入完整主题',\r\n colorTitle: '主题色', colorHint: '在色轮外圈选择色相,在内部方形中调整饱和度和明度;双击滑块可恢复默认值',\r\n swatchTitle: '灵感色板',\r\n hexCaption: '当前主题色',\r\n uiTitle: '主界面',\r\n uiOpacity: '透明度', uiBlur: '模糊度',\r\n uiOpacityBg: '主背景', uiOpacitySide: '侧边栏', uiOpacityCard: '对话框中选项面板', uiOpacityInput: '输入框与控件',\r\n uiSop: '设置界面透明度',\r\n uiChatRegion: '对话文本框',\r\n uiTrajectory: '轨迹页',\r\n bgTitle: '背景', bgChoose: '选择图片或视频', bgRemove: '移除背景', bgFromUrl: '从网址', bgUrlPlaceholder: '粘贴图片或视频网址 https://…', bgUrlApply: '应用', bgUrlCancel: '取消', bgUrlApplying: '加载中…', bgUrlBadHttp: '仅支持 http/https 图片网址', bgUrlFail: '获取图片失败',\r\n bgEdit: '编辑位置', bgEditLocked: '仅「适应」模式可编辑位置', wpOpacity: '背景透明度', bgBlur: '背景模糊',\r\n bgModeTitle: '布局模式',\r\n bgModeFit: '适应', bgModeFill: '填充', bgModeStretch: '拉伸', bgModeTile: '平铺', bgModeCenter: '居中',\r\n bgVideoBadge: '视频',\r\n bgSourceImage: '图片 / 视频',\r\n bgSourceGenerated: '动态生成',\r\n dropHint: '点击选择图片或视频,或将文件拖到这里',\r\n liveBadge: '动态壁纸',\r\n bgHint: '「适应」布局模式下悬停预览可编辑图片/视频的位置与缩放(其余布局模式按模式自动排布);动态生成模式下可选择类型、预设与参数。绑定种子后刷新页面壁纸保持不变,取消绑定则每次刷新随机换新',\r\n editorTitle: '背景编辑器', editorHint: '拖动移动画面,滚轮缩放大小',\r\n editorCommit: '确认', editorCancel: '取消', editorReset: '重置',\r\n extractColor: '从背景提取主题色', extracting: '取色中…',\r\n extractNoWp: '请先设置背景图片',\r\n extractDone: '已应用背景主色调',\r\n extractFail: '未在背景中找到鲜明的颜色,请换一张背景',\r\n crashTitle: '界面渲染出错',\r\n crashDesc: '主题设置面板遇到问题,点击下方按钮重置后重试',\r\n crashReset: '重置面板',\r\n exportTheme: '导出配置',\r\n importTheme: '导入配置',\r\n exportCardTitle: '导出配置',\r\n exportCardDesc: '将主题色、透明度、模糊与壁纸打包为 dsh-any-theme.json 文件',\r\n importCardTitle: '导入配置',\r\n importCardDesc: '从之前导出的 JSON 文件一键恢复完整主题',\r\n toastExportDone: '配置文件已开始下载',\r\n importDone: '已导入主题配置',\r\n importFail: '导入失败,文件格式不正确',\r\n footerTag: '外观插件',\r\n eyedropper: '从背景取色',\r\n pickerTitle: '从背景取色',\r\n pickerHint: '移动鼠标预览颜色,点击背景选取为主题色',\r\n pickerClose: '关闭',\r\n bgTypeImage: '图片',\r\n bgTypeMesh: '网格渐变',\r\n bgTypeShader: 'Shader',\r\n bgTypePattern: '几何图案',\r\n bgMeshDesc: '柔和的多点渐变色块',\r\n bgShaderDesc: '持续流动的光影动画',\r\n bgPatternDesc: '规律的几何纹理',\r\n bgRegenerate: '重新生成',\r\n bgSeedLocked: '已绑定 · 刷新不变',\r\n bgSeedUnlocked: '未绑定 · 刷新换新',\r\n seedLock: '锁定种子',\r\n bgMeshScale: '扩散范围',\r\n bgMeshIntensity: '色彩强度',\r\n bgShaderPreset: '预设',\r\n bgShaderSpeed: '流动速度',\r\n bgShaderScale: '纹理尺度',\r\n bgPatternPreset: '图案',\r\n bgPatternDensity: '密度',\r\n bgPatternScale: '尺度',\r\n presetAurora: '极光',\r\n presetNebula: '星云',\r\n presetNoise: '流动噪声',\r\n presetDots: '点阵',\r\n presetWaves: '波浪',\r\n presetPoly: '低多边形',\r\n presetStarfield: '星空',\r\n presetRain: '雨滴',\r\n presetContour: '等高线',\r\n presetMeta: '流体光斑',\r\n bgPause: '暂停',\r\n bgResume: '播放',\r\n bgUrlVideoFail: '获取视频失败,请确认链接可直接下载视频文件',\r\n schemeTitle: '界面明暗',\r\n schemeLight: '亮色',\r\n schemeDark: '暗色',\r\n schemeAuto: '自动',\r\n schemeHint: '「自动」优先跟随背景画面的实际明暗决定界面明暗(无背景时依据主题色明度);强制亮色/暗色后整套配色按所选方向生成,未选主题色时使用中性灰配色',\r\n presetGalleryTitle: '外观预设',\r\n presetName_default: '默认',\r\n presetDesc_default: '恢复插件的初始外观',\r\n presetName_glass: '毛玻璃',\r\n presetDesc_glass: '通透表面 + 磨砂玻璃层次',\r\n presetName_minimal: '极简白',\r\n presetDesc_minimal: '接近实色的表面,无模糊',\r\n presetName_midnight: '暗夜紫',\r\n presetDesc_midnight: '深色强调,重磨砂低透明度',\r\n presetName_cyber: '赛博',\r\n presetDesc_cyber: '艳丽洋红,界面近乎消失',\r\n presetName_warm: '暖阳',\r\n presetDesc_warm: '琥珀色调的明亮实色界面',\r\n presetApplied: '预设已应用',\r\n profilesTitle: '我的配置',\r\n profileSave: '保存当前配置',\r\n profileNamePlaceholder: '输入配置名称…',\r\n profileNameRequired: '请先输入配置名称',\r\n profileSaved: '配置已保存',\r\n profileApplied: '配置已应用',\r\n profileApply: '应用',\r\n profileDelete: '删除配置',\r\n profileDeleteConfirm: '确认删除',\r\n profileNone: '不切换',\r\n profilesEmpty: '还没有保存的配置。调整好外观后点击「保存当前配置」,即可随时一键切换。',\r\n scheduleTitle: '昼夜自动切换',\r\n scheduleHint: '按时间或系统深色模式,在两套已保存的配置之间自动切换(切换的是配色与表面参数,壁纸不变)',\r\n scheduleMode: '切换依据',\r\n scheduleModeTime: '固定时段',\r\n scheduleModeSystem: '跟随系统',\r\n scheduleTimes: '切换时间',\r\n scheduleDayStart: '日间开始',\r\n scheduleNightStart: '夜间开始',\r\n scheduleProfiles: '对应配置',\r\n scheduleDayProfile: '日间',\r\n scheduleNightProfile: '夜间',\r\n rotTitle: '壁纸轮换',\r\n rotHint: '把多张图片加入轮换池,按所选频率自动更换壁纸;启用后立即生效',\r\n rotAdd: '添加图片',\r\n rotRemove: '移除',\r\n rotShuffle: '随机',\r\n rotOrder: '顺序',\r\n rotReload: '每次刷新',\r\n rotDaily: '每天',\r\n rotWeekly: '每周',\r\n rotNow: '立即切换',\r\n}\r\n\r\nexport const en: Record<string, string> = {\r\n nav: 'Theme', brandTag: 'Appearance', close: 'Close',\r\n pageColor: 'Color', pageInterface: 'Interface', pageBackground: 'Background', pageProfile: 'Profile',\r\n descColor: 'Drag the wheel or type exact values — the whole UI follows live',\r\n descInterface: 'Tune opacity and blur per surface to build depth',\r\n descBackground: 'Upload an image or a video as wallpaper and place it freely, or let the algorithm paint a live background',\r\n descProfile: 'Apply a one-click preset, save multiple named profiles, schedule a day/night switch, or export/import the full theme',\r\n colorTitle: 'Theme color', colorHint: 'Pick hue on the outer ring, adjust saturation & lightness in the square; double-click a slider to reset',\r\n swatchTitle: 'Quick swatches',\r\n hexCaption: 'Current accent',\r\n uiTitle: 'Interface',\r\n uiOpacity: 'Opacity', uiBlur: 'Blur',\r\n uiOpacityBg: 'Main background', uiOpacitySide: 'Sidebar', uiOpacityCard: 'Cards & panels', uiOpacityInput: 'Input & controls',\r\n uiSop: 'Settings interface opacity',\r\n uiChatRegion: 'Conversation text frame',\r\n uiTrajectory: 'Trajectory view',\r\n bgTitle: 'Background', bgChoose: 'Choose image or video', bgRemove: 'Remove background', bgFromUrl: 'From URL', bgUrlPlaceholder: 'Paste an image or video URL https://…', bgUrlApply: 'Apply', bgUrlCancel: 'Cancel', bgUrlApplying: 'Loading…', bgUrlBadHttp: 'Only http/https image URLs are supported', bgUrlFail: 'Could not fetch the image',\r\n bgEdit: 'Edit position', bgEditLocked: 'Position editing is only available in Fit mode', wpOpacity: 'Background opacity', bgBlur: 'Background blur',\r\n bgModeTitle: 'Layout mode',\r\n bgModeFit: 'Fit', bgModeFill: 'Fill', bgModeStretch: 'Stretch', bgModeTile: 'Tile', bgModeCenter: 'Center',\r\n bgVideoBadge: 'Video',\r\n bgSourceImage: 'Image / Video',\r\n bgSourceGenerated: 'Generated',\r\n dropHint: 'Click to choose an image or video, or drop one here',\r\n liveBadge: 'Live wallpaper',\r\n bgHint: 'In Fit layout mode hover the preview to reposition and zoom the image/video (other modes arrange it automatically); 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',\r\n editorTitle: 'Background editor', editorHint: 'Drag to move, scroll to zoom',\r\n editorCommit: 'Confirm', editorCancel: 'Cancel', editorReset: 'Reset',\r\n extractColor: 'Extract from background', extracting: 'Extracting…',\r\n extractNoWp: 'Set a background first',\r\n extractDone: 'Background color applied',\r\n extractFail: 'No vivid color found in this background, try another',\r\n crashTitle: 'Section crashed',\r\n crashDesc: 'The theme panel hit an error. Reset below to recover.',\r\n crashReset: 'Reset panel',\r\n exportTheme: 'Export',\r\n importTheme: 'Import',\r\n exportCardTitle: 'Export profile',\r\n exportCardDesc: 'Bundle color, opacity, blur and wallpaper into dsh-any-theme.json',\r\n importCardTitle: 'Import profile',\r\n importCardDesc: 'Restore a full theme from a previously exported JSON file',\r\n toastExportDone: 'Export started',\r\n importDone: 'Theme imported',\r\n importFail: 'Import failed — invalid file',\r\n footerTag: 'Appearance plugin',\r\n eyedropper: 'Eyedropper',\r\n pickerTitle: 'Pick from background',\r\n pickerHint: 'Hover to preview, click to pick as theme color',\r\n pickerClose: 'Close',\r\n bgTypeImage: 'Image',\r\n bgTypeMesh: 'Mesh gradient',\r\n bgTypeShader: 'Shader',\r\n bgTypePattern: 'Pattern',\r\n bgMeshDesc: 'Soft multi-blob gradients',\r\n bgShaderDesc: 'Flowing light animation',\r\n bgPatternDesc: 'Regular geometric texture',\r\n bgRegenerate: 'Regenerate',\r\n bgSeedLocked: 'Seeded · stable on refresh',\r\n bgSeedUnlocked: 'Unseeded · new on refresh',\r\n seedLock: 'Lock seed',\r\n bgMeshScale: 'Spread',\r\n bgMeshIntensity: 'Intensity',\r\n bgShaderPreset: 'Preset',\r\n bgShaderSpeed: 'Flow speed',\r\n bgShaderScale: 'Texture scale',\r\n bgPatternPreset: 'Pattern',\r\n bgPatternDensity: 'Density',\r\n bgPatternScale: 'Scale',\r\n presetAurora: 'Aurora',\r\n presetNebula: 'Nebula',\r\n presetNoise: 'Flowing noise',\r\n presetDots: 'Dots',\r\n presetWaves: 'Waves',\r\n presetPoly: 'Low poly',\r\n presetStarfield: 'Starfield',\r\n presetRain: 'Rain',\r\n presetContour: 'Contours',\r\n presetMeta: 'Fluid orbs',\r\n bgPause: 'Pause',\r\n bgResume: 'Play',\r\n bgUrlVideoFail: 'Could not fetch the video — make sure the link downloads a video file directly',\r\n schemeTitle: 'Interface scheme',\r\n schemeLight: 'Light',\r\n schemeDark: 'Dark',\r\n schemeAuto: 'Auto',\r\n schemeHint: '\"Auto\" follows the background brightness first (accent lightness as fallback only); forcing light/dark regenerates the palette in that direction - with no accent picked, a neutral gray palette is used',\r\n presetGalleryTitle: 'Appearance presets',\r\n presetName_default: 'Default',\r\n presetDesc_default: 'Restore the plugin\\'s original look',\r\n presetName_glass: 'Frosted glass',\r\n presetDesc_glass: 'Translucent surfaces + frosted depth',\r\n presetName_minimal: 'Minimal',\r\n presetDesc_minimal: 'Near-solid surfaces, no frost',\r\n presetName_midnight: 'Midnight',\r\n presetDesc_midnight: 'Deep violet accent, heavy frost',\r\n presetName_cyber: 'Cyber',\r\n presetDesc_cyber: 'Vivid magenta, vanishing surfaces',\r\n presetName_warm: 'Warm daylight',\r\n presetDesc_warm: 'Amber accent on solid light surfaces',\r\n presetApplied: 'Preset applied',\r\n profilesTitle: 'Saved profiles',\r\n profileSave: 'Save current',\r\n profileNamePlaceholder: 'Profile name…',\r\n profileNameRequired: 'Enter a name first',\r\n profileSaved: 'Profile saved',\r\n profileApplied: 'Profile applied',\r\n profileApply: 'Apply',\r\n profileDelete: 'Delete profile',\r\n profileDeleteConfirm: 'Sure?',\r\n profileNone: 'None',\r\n profilesEmpty: 'No saved profiles yet. Tune the look, then hit \"Save current\" to switch back anytime.',\r\n scheduleTitle: 'Day/night auto switch',\r\n scheduleHint: 'Automatically swap between two saved profiles by clock time or the OS dark mode (colors and surfaces switch; the wallpaper stays)',\r\n scheduleMode: 'Trigger',\r\n scheduleModeTime: 'Fixed times',\r\n scheduleModeSystem: 'Follow system',\r\n scheduleTimes: 'Switch times',\r\n scheduleDayStart: 'Day starts',\r\n scheduleNightStart: 'Night starts',\r\n scheduleProfiles: 'Profiles',\r\n scheduleDayProfile: 'Day',\r\n scheduleNightProfile: 'Night',\r\n rotTitle: 'Wallpaper rotation',\r\n rotHint: 'Add images to a rotation pool and let the wallpaper change on your cadence; takes effect immediately when enabled',\r\n rotAdd: 'Add images',\r\n rotRemove: 'Remove',\r\n rotShuffle: 'Shuffle',\r\n rotOrder: 'In order',\r\n rotReload: 'Every refresh',\r\n rotDaily: 'Daily',\r\n rotWeekly: 'Weekly',\r\n rotNow: 'Switch now',\r\n}\r\n","import type { BgState, ThemeConfig, PartOpacities, PartBlurs, BgMode, ProfileEntry, RotationConfig, RotationItem, ScheduleConfig, SchemeOverride, ProfileAppearance } from './types'\r\n\r\nexport const DEFAULT_CONFIG: ThemeConfig = {\r\n color: null,\r\n opacities: { bg: 0.85, sidebar: 0.93, card: 1, input: 1 },\r\n blurs: { bg: 0, sidebar: 0, card: 0, settings: 0, chat: 0, trajectory: 0, input: 0 },\r\n settingsOpacity: 1,\r\n wallpaperOpacity: 1,\r\n blur: 0,\r\n bgState: { zoom: 1, x: 0, y: 0, iw: 0, ih: 0 },\r\n videoBgState: { zoom: 1, x: 0, y: 0, iw: 0, ih: 0 },\r\n backgroundType: 'image',\r\n bgMode: 'fit',\r\n videoMime: null,\r\n generatedBg: null,\r\n regenerateOnReload: false,\r\n chatTextOpacity: 0,\r\n // 100% = untouched host surface; zero would blank the page by default.\r\n trajectoryOpacity: 1,\r\n profiles: [],\r\n rotation: { enabled: false, mode: 'shuffle', interval: 'daily', current: 0, items: [], lastRotate: null },\r\n schedule: { enabled: false, mode: 'time', dayProfile: null, nightProfile: null, dayStart: '07:00', nightStart: '19:00' },\r\n schemeOverride: 'auto',\r\n activeProfile: null,\r\n}\r\n\r\nconst clamp01 = (n: unknown, def: number): number =>\r\n typeof n === 'number' ? Math.min(1, Math.max(0, n)) : def\r\n\r\n// In-memory mirror of the file-backed store; the UI reads and mutates this,\r\n// and it is synced to disk via the RPC layer.\r\nexport let cfg: ThemeConfig = { ...DEFAULT_CONFIG, opacities: { ...DEFAULT_CONFIG.opacities }, blurs: { ...DEFAULT_CONFIG.blurs }, bgState: { ...DEFAULT_CONFIG.bgState }, videoBgState: { ...DEFAULT_CONFIG.videoBgState } }\r\nexport let wpImageUrl: string | null = null\r\n// Retained across background-type switches so coming back to image/video\r\n// restores the original upload.\r\nexport let wpUrl: string | null = null\r\nexport let wpVideoUrl: string | null = null\r\n/** Captured video frame standing in for previews/color extraction (still-image APIs). */\r\nexport let wpVideoSnapshot: string | null = null\r\n/** Local blob URL backing an in-session video; revoked when replaced or cleared. */\r\nlet wpVideoObjectUrl: string | null = null\r\n\r\nexport function setWpUrl(url: string | null): void { wpUrl = url }\r\n// The serve URL is stable across in-place replacements (upload / URL download /\r\n// rotation), so every swap needs a query-string cache-buster or the URL-keyed\r\n// caches — the layer re-set guard, loadImage decode cache, brightness verdict,\r\n// low-res drag copy, intrinsic-size lookup — all keep the old pixels.\r\nlet imageRev = 0\r\nexport function bumpImageRev(url: string | null): string | null {\r\n if (url === null) return url\r\n // The serve URL is a same-origin relative path (/dsh-any-background/…); the\r\n // rev query must reach those too, or an in-place replacement keeps the same\r\n // backgroundImage string and applyImageWp skips the swap. blob:/data: stay\r\n // intact (a query can break blob resolution).\r\n if (!/^https?:\\/\\//i.test(url) && !url.startsWith('/')) return url\r\n imageRev++\r\n return `${url}${url.includes('?') ? '&' : '?'}r=${imageRev}`\r\n}\r\nexport function setWpImageUrl(url: string | null): void { wpImageUrl = bumpImageRev(url) }\r\n// The serve URL is stable, so replacing the stored video needs a query-string\r\n// cache-buster or the player keeps the cached copy.\r\nlet videoRev = 0\r\nexport function setWpVideoUrl(url: string | null, mime: string | null): void {\r\n if (url === null) {\r\n wpVideoUrl = null\r\n wpVideoSnapshot = null\r\n } else {\r\n videoRev++\r\n // Blob URLs are unique per object; a query string can break their\r\n // resolution in some engines, so they skip the cache-buster.\r\n wpVideoUrl = url.startsWith('blob:') ? url : `${url}${url.includes('?') ? '&' : '?'}r=${videoRev}`\r\n }\r\n // Release the previous in-session object URL when replaced or cleared.\r\n if (wpVideoObjectUrl !== null && wpVideoObjectUrl !== url) {\r\n URL.revokeObjectURL(wpVideoObjectUrl)\r\n wpVideoObjectUrl = null\r\n }\r\n if (url !== null && url.startsWith('blob:')) wpVideoObjectUrl = url\r\n cfg.videoMime = url ? mime : null\r\n}\r\nexport function setWpVideoSnapshot(url: string | null): void { wpVideoSnapshot = url }\r\n\r\n/** Release the in-session video object URL (plugin teardown). */\r\nexport function disposeVideoObjectUrl(): void {\r\n if (wpVideoObjectUrl !== null) {\r\n URL.revokeObjectURL(wpVideoObjectUrl)\r\n wpVideoObjectUrl = null\r\n }\r\n}\r\nexport function setBgState(s: BgState): void { cfg.bgState = s }\r\n\r\n// Brightness verdict of the active generated background, analyzed once per\r\n// switch from a captured frame. null = fall back to the picked color's lightness.\r\nexport let bgDark: boolean | null = null\r\nexport function setBgDark(v: boolean | null): void { bgDark = v }\r\nexport function rBgDark(): boolean | null { return bgDark }\r\n\r\nexport function rHasColor(): boolean { return cfg.color !== null }\r\nexport function rColor(): [number, number, number] { return cfg.color ?? [220, 0.55, 0.25] }\r\nexport function rWpImage(): string | null { return wpImageUrl }\r\nexport function rWpVideo(): string | null { return wpVideoUrl }\r\nexport function rBgMode(): BgMode { return cfg.bgMode ?? DEFAULT_CONFIG.bgMode }\r\nexport function rChatTextOpacity(): number { return clamp01(cfg.chatTextOpacity, DEFAULT_CONFIG.chatTextOpacity) }\r\nexport function rTrajectoryOpacity(): number { return clamp01(cfg.trajectoryOpacity, DEFAULT_CONFIG.trajectoryOpacity) }\r\n/** Display URL: the uploaded image/video snapshot per active type, else the generated snapshot. */\r\nexport function rWp(): string | null {\r\n if (cfg.backgroundType === 'image') return wpImageUrl\r\n if (cfg.backgroundType === 'video') return wpVideoSnapshot\r\n return wpUrl\r\n}\r\nexport function rOps(): PartOpacities {\r\n const o = cfg.opacities ?? {}\r\n const out = {} as PartOpacities\r\n for (const k of ['bg', 'sidebar', 'card', 'input'] as const) {\r\n out[k] = clamp01(o[k], DEFAULT_CONFIG.opacities[k])\r\n }\r\n return out\r\n}\r\nexport function rBlurs(): PartBlurs {\r\n const b = cfg.blurs ?? {}\r\n const out = {} as PartBlurs\r\n for (const k of ['bg', 'sidebar', 'card', 'settings', 'chat', 'trajectory', 'input'] as const) {\r\n const v = b[k]\r\n out[k] = typeof v === 'number' ? Math.min(60, Math.max(0, v)) : DEFAULT_CONFIG.blurs[k]\r\n }\r\n return out\r\n}\r\nexport function rWop(): number { return clamp01(cfg.wallpaperOpacity, DEFAULT_CONFIG.wallpaperOpacity) }\r\nexport function rBl(): number {\r\n return typeof cfg.blur === 'number' ? Math.min(60, Math.max(0, cfg.blur)) : DEFAULT_CONFIG.blur\r\n}\r\nexport function rSop(): number { return clamp01(cfg.settingsOpacity, DEFAULT_CONFIG.settingsOpacity) }\r\nexport function rBgState(): BgState { return cfg.bgState }\r\nexport function rVideoBgState(): BgState { return cfg.videoBgState }\r\n\r\n// ── Profiles / rotation / schedule / scheme ──────────────────────────────────\r\nexport function rProfiles(): ProfileEntry[] { return Array.isArray(cfg.profiles) ? cfg.profiles : [] }\r\nexport function rRotation(): RotationConfig {\r\n const r = cfg.rotation\r\n return r && typeof r === 'object'\r\n ? { ...DEFAULT_CONFIG.rotation, ...r, items: Array.isArray(r.items) ? r.items : [] }\r\n : { ...DEFAULT_CONFIG.rotation, items: [] }\r\n}\r\nexport function rSchedule(): ScheduleConfig {\r\n return cfg.schedule && typeof cfg.schedule === 'object' ? { ...DEFAULT_CONFIG.schedule, ...cfg.schedule } : { ...DEFAULT_CONFIG.schedule }\r\n}\r\nexport function rSchemeOverride(): SchemeOverride {\r\n return cfg.schemeOverride === 'light' || cfg.schemeOverride === 'dark' ? cfg.schemeOverride : 'auto'\r\n}\r\nexport function rActiveProfile(): string | null { return cfg.activeProfile }\r\n\r\n/** Effective interface scheme (drives data-ds-dark-theme / color-scheme): a\r\n * forced override wins; in auto a picked color decides through its palette\r\n * direction (keeps native controls aligned with the drawn surfaces), and\r\n * without a pick the background's brightness verdict does. Stay light as the\r\n * last fallback. */\r\nexport function rScheme(): 'light' | 'dark' {\r\n const o = rSchemeOverride()\r\n if (o !== 'auto') return o\r\n if (rHasColor()) return rColorScheme()\r\n return rBgDark() ? 'dark' : 'light'\r\n}\r\n\r\n/** Direction the color palette itself is built in: a forced override wins; in\r\n * auto the theme color's own lightness decides (0.2.4 behavior) so surfaces\r\n * always contrast with the palette's label fonts — the wallpaper verdict must\r\n * not drag a dark color's surfaces into a light build (and vice versa) or\r\n * text and surfaces converge. */\r\nexport function rColorScheme(): 'light' | 'dark' {\r\n const o = rSchemeOverride()\r\n if (o !== 'auto') return o\r\n return rHasColor() && rColor()[2] < 0.55 ? 'dark' : 'light'\r\n}\r\n\r\n/** Snapshot of the appearance fields a profile/preset restores. */\r\nexport function currentAppearance(): ProfileAppearance {\r\n return {\r\n color: cfg.color,\r\n opacities: { ...rOps() },\r\n blurs: { ...rBlurs() },\r\n settingsOpacity: rSop(),\r\n wallpaperOpacity: rWop(),\r\n blur: rBl(),\r\n chatTextOpacity: rChatTextOpacity(),\r\n trajectoryOpacity: rTrajectoryOpacity(),\r\n }\r\n}\r\n\r\n/** Apply an appearance snapshot onto cfg (meta fields untouched). */\r\nexport function applyAppearance(ap: ProfileAppearance): void {\r\n cfg.color = Array.isArray(ap.color) && ap.color.length === 3 ? [...ap.color] as [number, number, number] : null\r\n cfg.opacities = { ...DEFAULT_CONFIG.opacities, ...(ap.opacities ?? {}) }\r\n cfg.blurs = { ...DEFAULT_CONFIG.blurs, ...(ap.blurs ?? {}) }\r\n cfg.settingsOpacity = clamp01(ap.settingsOpacity, DEFAULT_CONFIG.settingsOpacity)\r\n cfg.wallpaperOpacity = clamp01(ap.wallpaperOpacity, DEFAULT_CONFIG.wallpaperOpacity)\r\n cfg.blur = typeof ap.blur === 'number' ? Math.min(60, Math.max(0, ap.blur)) : DEFAULT_CONFIG.blur\r\n cfg.chatTextOpacity = clamp01(ap.chatTextOpacity, DEFAULT_CONFIG.chatTextOpacity)\r\n cfg.trajectoryOpacity = clamp01(ap.trajectoryOpacity, DEFAULT_CONFIG.trajectoryOpacity)\r\n}\r\n\r\nconst num = (n: unknown, def: number): number => typeof n === 'number' ? n : def\r\nconst cl = (n: unknown, lo: number, hi: number, def: number): number =>\r\n typeof n === 'number' ? Math.min(hi, Math.max(lo, n)) : def\r\n\r\nconst HHMM_RE = /^([01]\\d|2[0-3]):[0-5]\\d$/\r\n\r\nfunction adoptProfiles(raw: unknown): ProfileEntry[] {\r\n if (!Array.isArray(raw)) return []\r\n const out: ProfileEntry[] = []\r\n for (const item of raw.slice(0, 20)) {\r\n const p = (item ?? {}) as Partial<ProfileEntry>\r\n if (typeof p.id !== 'string' || p.id.length === 0 || p.id.length > 64) continue\r\n if (out.some(e => e.id === p.id)) continue\r\n const ac = (p.config ?? {}) as Partial<ProfileAppearance>\r\n out.push({\r\n id: p.id,\r\n name: typeof p.name === 'string' && p.name.trim() ? p.name.slice(0, 60) : 'Profile',\r\n createdAt: typeof p.createdAt === 'string' ? p.createdAt : '',\r\n config: {\r\n color: Array.isArray(ac.color) && ac.color.length === 3 ? [...ac.color] as [number, number, number] : null,\r\n opacities: { ...DEFAULT_CONFIG.opacities, ...(ac.opacities ?? {}) },\r\n blurs: { ...DEFAULT_CONFIG.blurs, ...(ac.blurs ?? {}) },\r\n settingsOpacity: clamp01(ac.settingsOpacity, DEFAULT_CONFIG.settingsOpacity),\r\n wallpaperOpacity: clamp01(ac.wallpaperOpacity, DEFAULT_CONFIG.wallpaperOpacity),\r\n blur: num(ac.blur, DEFAULT_CONFIG.blur),\r\n chatTextOpacity: clamp01(ac.chatTextOpacity, DEFAULT_CONFIG.chatTextOpacity),\r\n trajectoryOpacity: clamp01(ac.trajectoryOpacity, DEFAULT_CONFIG.trajectoryOpacity),\r\n },\r\n })\r\n }\r\n return out\r\n}\r\n\r\nfunction adoptRotation(raw: unknown): RotationConfig {\r\n const r = (raw ?? {}) as Partial<RotationConfig>\r\n const items: RotationItem[] = Array.isArray(r.items)\r\n ? r.items\r\n .filter((it): it is RotationItem => {\r\n const i = (it ?? {}) as Partial<RotationItem>\r\n return typeof i?.file === 'string' && /^[\\w-]+\\.(jpg|jpeg|png|gif|webp)$/i.test(i.file)\r\n })\r\n .slice(0, 30)\r\n .map(it => ({ file: it.file, thumb: typeof it.thumb === 'string' && it.thumb.startsWith('data:image/') && it.thumb.length <= 65536 ? it.thumb : '' }))\r\n : []\r\n return {\r\n enabled: r.enabled === true,\r\n mode: r.mode === 'order' ? 'order' : 'shuffle',\r\n interval: r.interval === 'reload' || r.interval === 'weekly' ? r.interval : 'daily',\r\n current: num(r.current, 0),\r\n items,\r\n lastRotate: typeof r.lastRotate === 'string' ? r.lastRotate : null,\r\n }\r\n}\r\n\r\nfunction adoptSchedule(raw: unknown): ScheduleConfig {\r\n const r = (raw ?? {}) as Partial<ScheduleConfig>\r\n return {\r\n enabled: r.enabled === true,\r\n mode: r.mode === 'system' ? 'system' : 'time',\r\n dayProfile: typeof r.dayProfile === 'string' ? r.dayProfile : null,\r\n nightProfile: typeof r.nightProfile === 'string' ? r.nightProfile : null,\r\n dayStart: typeof r.dayStart === 'string' && HHMM_RE.test(r.dayStart) ? r.dayStart : DEFAULT_CONFIG.schedule.dayStart,\r\n nightStart: typeof r.nightStart === 'string' && HHMM_RE.test(r.nightStart) ? r.nightStart : DEFAULT_CONFIG.schedule.nightStart,\r\n }\r\n}\r\n\r\nfunction adoptBgState(s: Partial<BgState>): BgState {\r\n return {\r\n zoom: num(s.zoom, 1),\r\n x: num(s.x, 0),\r\n y: num(s.y, 0),\r\n iw: typeof s.iw === 'number' && s.iw > 0 ? s.iw : 0,\r\n ih: typeof s.ih === 'number' && s.ih > 0 ? s.ih : 0,\r\n }\r\n}\r\n\r\n/** Move a possibly-absent partial config into the shape the UI reads. */\r\nexport function adoptConfig(raw: unknown): void {\r\n const c = (raw ?? {}) as Partial<ThemeConfig> & { opacity?: unknown }\r\n const color = Array.isArray(c.color) && c.color.length === 3\r\n ? [c.color[0], c.color[1], c.color[2]] as [number, number, number]\r\n : null\r\n // Migration: the old single main-interface opacity becomes per-part, keeping\r\n // the sidebar's former +0.08 offset.\r\n const legacy = typeof c.opacity === 'number' ? c.opacity : null\r\n const ops = (c.opacities ?? {}) as Partial<PartOpacities>\r\n const bl = (c.blurs ?? {}) as Partial<PartBlurs>\r\n const blurs = {} as PartBlurs\r\n for (const k of ['bg', 'sidebar', 'card', 'settings', 'chat', 'trajectory', 'input'] as const) {\r\n blurs[k] = num(bl[k], DEFAULT_CONFIG.blurs[k])\r\n }\r\n const bgType = ['video', 'mesh', 'shader', 'pattern'].includes(c.backgroundType as string)\r\n ? (c.backgroundType as ThemeConfig['backgroundType'])\r\n : DEFAULT_CONFIG.backgroundType\r\n const bgMode = (['fit', 'fill', 'stretch', 'tile', 'center'] as BgMode[]).includes(c.bgMode as BgMode) ? (c.bgMode as BgMode) : DEFAULT_CONFIG.bgMode\r\n const gen = c.generatedBg && typeof c.generatedBg === 'object'\r\n ? (c.generatedBg as { type?: string })\r\n : null\r\n const generatedBg = gen && gen.type === bgType ? (c.generatedBg as ThemeConfig['generatedBg']) : null\r\n\r\n cfg = {\r\n color,\r\n opacities: {\r\n bg: num(ops.bg, legacy ?? DEFAULT_CONFIG.opacities.bg),\r\n sidebar: num(ops.sidebar, legacy !== null ? Math.min(1, legacy + 0.08) : DEFAULT_CONFIG.opacities.sidebar),\r\n card: num(ops.card, DEFAULT_CONFIG.opacities.card),\r\n input: num(ops.input, DEFAULT_CONFIG.opacities.input),\r\n },\r\n blurs,\r\n settingsOpacity: num(c.settingsOpacity, DEFAULT_CONFIG.settingsOpacity),\r\n wallpaperOpacity: num(c.wallpaperOpacity, DEFAULT_CONFIG.wallpaperOpacity),\r\n blur: num(c.blur, DEFAULT_CONFIG.blur),\r\n bgState: adoptBgState((c.bgState ?? {}) as Partial<BgState>),\r\n videoBgState: adoptBgState((c.videoBgState ?? {}) as Partial<BgState>),\r\n backgroundType: bgType,\r\n bgMode,\r\n videoMime: typeof c.videoMime === 'string' ? c.videoMime : null,\r\n generatedBg: generatedBg ? normalizeGeneratedBg(generatedBg) : null,\r\n regenerateOnReload: typeof c.regenerateOnReload === 'boolean' ? c.regenerateOnReload : DEFAULT_CONFIG.regenerateOnReload,\r\n chatTextOpacity: clamp01(c.chatTextOpacity, DEFAULT_CONFIG.chatTextOpacity),\r\n trajectoryOpacity: clamp01(c.trajectoryOpacity, DEFAULT_CONFIG.trajectoryOpacity),\r\n profiles: adoptProfiles(c.profiles),\r\n rotation: adoptRotation(c.rotation),\r\n schedule: adoptSchedule(c.schedule),\r\n schemeOverride: c.schemeOverride === 'light' || c.schemeOverride === 'dark' ? c.schemeOverride : 'auto',\r\n activeProfile: typeof c.activeProfile === 'string' ? c.activeProfile : null,\r\n }\r\n}\r\n\r\nfunction normalizeGeneratedBg(p: ThemeConfig['generatedBg']): ThemeConfig['generatedBg'] {\r\n if (!p) return null\r\n if (p.type === 'mesh') {\r\n return {\r\n type: 'mesh',\r\n seed: num(p.seed, 0),\r\n scale: cl(p.scale, 0.3, 3, 1),\r\n intensity: cl(p.intensity, 0, 1, 0.6),\r\n }\r\n }\r\n if (p.type === 'shader') {\r\n return {\r\n type: 'shader',\r\n preset: ['aurora', 'nebula', 'noise', 'starfield'].includes(p.preset) ? p.preset : 'aurora',\r\n speed: cl(p.speed, 0, 2, 0.3),\r\n scale: cl(p.scale, 0.3, 3, 1),\r\n seed: typeof p.seed === 'number' ? Math.floor(p.seed) : 0,\r\n }\r\n }\r\n return {\r\n type: 'pattern',\r\n preset: ['dots', 'waves', 'poly', 'rain', 'contour', 'meta'].includes(p.preset) ? p.preset : 'dots',\r\n density: cl(p.density, 0, 1, 0.5),\r\n scale: cl(p.scale, 0.3, 3, 1),\r\n seed: typeof p.seed === 'number' ? Math.floor(p.seed) : 0,\r\n }\r\n}\r\n","import type { RpcResultLike } from './types'\nimport { cfg, adoptConfig, setWpUrl, setWpImageUrl, setWpVideoUrl, rWpImage } from './state'\r\n\r\nexport const RPC_CHANNEL = '/dsh-any-background'\r\n/** Same-origin serve URL of the persisted video (enough for <video src>/fetch). */\r\nexport const VIDEO_SERVE_URL = '/dsh-any-background/video'\r\n/** Same-origin serve URL of the persisted wallpaper (native <img> loading). */\r\nexport const WALLPAPER_SERVE_URL = '/dsh-any-background/wallpaper'\r\n/** Raw-bytes upload endpoint for the wallpaper slot (no base64 inflation). */\r\nconst WALLPAPER_UPLOAD_URL = '/dsh-any-background/wallpaper/upload'\r\n/** HTTP route new videos are POSTed to as raw bytes (see uploadVideo). */\r\nexport const VIDEO_UPLOAD_URL = '/dsh-any-background/video/upload'\r\nconst RPC_NS = 'dshAnyBackground'\r\nconst rpcEndpoint = (method: string): string => `${RPC_NS}/${method}`\r\n\r\nlet rpcCallFn: ((endpoint: string, payload: unknown) => Promise<RpcResultLike | undefined>) | null = null\r\n\r\nexport function initRpc(call: (endpoint: string, payload: unknown) => Promise<RpcResultLike | undefined>): void {\r\n rpcCallFn = call\r\n}\r\n\r\nasync function rpcCall(method: string, payload: unknown): Promise<unknown> {\r\n if (!rpcCallFn) return undefined\r\n try {\r\n const res = await rpcCallFn(rpcEndpoint(method), payload)\r\n if (res && res.ok === true) return res.value\r\n console.warn(`dsh-any-background: rpc \"${method}\" failed`, res?.error)\r\n return undefined\r\n } catch (e) {\r\n console.warn(`dsh-any-background: rpc \"${method}\" threw`, e)\r\n return undefined\r\n }\r\n}\r\n\r\n// Slider drags fire dozens of events per second; coalesce writes to a trailing\r\n// debounce and flush the last pending write on pagehide so a quick close never\r\n// loses it.\r\nconst SAVE_DEBOUNCE_MS = 250\r\nlet saveTimer: number | undefined\r\n\r\nexport function saveConfig(): void {\r\n if (saveTimer !== undefined) window.clearTimeout(saveTimer)\r\n saveTimer = window.setTimeout(() => {\r\n saveTimer = undefined\r\n void rpcCall('writeConfig', { config: cfg })\r\n }, SAVE_DEBOUNCE_MS)\r\n}\r\n\r\nexport function flushSave(): void {\r\n if (saveTimer === undefined) return\r\n window.clearTimeout(saveTimer)\r\n saveTimer = undefined\r\n void rpcCall('writeConfig', { config: cfg })\r\n}\r\n\r\n/** Persist the current config immediately (import path — no debounce). */\r\nexport function persistConfig(): void {\r\n void rpcCall('writeConfig', { config: cfg })\r\n}\r\n\r\n/** Load the persisted theme (config + wallpaper URL + video URL) from the node\r\n * half. Image and video both travel as serve URLs — never bytes — so this RPC\r\n * stays tiny. Resolves true when the server advanced a due wallpaper rotation\r\n * during the read — the restored wallpaper is then already the new pick. */\r\nexport async function loadPersisted(): Promise<boolean> {\r\n const data = await rpcCall('read', {})\r\n if (data && typeof data === 'object') {\r\n const d = data as { config?: unknown; wallpaperUrl?: unknown; videoUrl?: unknown; rotated?: unknown }\r\n if (d.config) adoptConfig(d.config)\r\n // Uploaded image and video keep their own slots so type switches never\r\n // discard them; in image mode the caller points wpUrl at it.\r\n if (typeof d.wallpaperUrl === 'string') setWpImageUrl(d.wallpaperUrl)\r\n else if (d.wallpaperUrl === null) setWpImageUrl(null)\r\n // The video travels as a serve URL; the frame snapshot is re-captured by\r\n // the boot restore in index.tsx when needed.\r\n if (typeof d.videoUrl === 'string') setWpVideoUrl(d.videoUrl, cfg.videoMime)\r\n else if (d.videoUrl === null) setWpVideoUrl(null, null)\r\n // Mirror the same rev'd URL setWpImageUrl stored, so wpUrl never diverges.\r\n if (cfg.backgroundType === 'image') setWpUrl(rWpImage())\r\n return d.rotated === true\r\n }\r\n return false\r\n}\r\n\r\n/** Persist a wallpaper (null removes it); one-shot, no debounce. */\r\nexport function persistWallpaper(dataUrl: string | null): void {\r\n void rpcCall('setWallpaper', { dataUrl })\r\n}\r\n\r\n/** Persist a background video (null removes it); resolves true once on disk,\r\n * so callers only switch playback to the serve URL after acceptance. */\r\nexport async function persistVideo(dataUrl: string | null): Promise<boolean> {\r\n const res = await rpcCall('setVideo', { dataUrl })\r\n return res === true\r\n}\r\n\r\n/** Download a wallpaper from a network URL and persist it into the local slot\r\n * (the host replaces wallpaper.jpg). Returns the freshly stored serve URL on\r\n * success, or the host's failure message. */\r\nexport async function setWallpaperFromUrl(url: string): Promise<{ ok: boolean; wallpaperUrl?: string | null; error?: string }> {\r\n if (!rpcCallFn) return { ok: false, error: 'rpc not ready' }\r\n let res: RpcResultLike | undefined\r\n try {\r\n res = await rpcCallFn(rpcEndpoint('setWallpaperUrl'), { url })\r\n } catch (e) {\r\n return { ok: false, error: e instanceof Error ? e.message : String(e) }\r\n }\r\n if (!res) return { ok: false, error: 'no response' }\r\n if (res.ok !== true) {\r\n const err = (res as { error?: { message?: string } }).error\r\n return { ok: false, error: err?.message ?? 'request failed' }\r\n }\r\n const v = res.value as { ok?: boolean; wallpaperUrl?: string | null; error?: string }\r\n return v?.ok === true\r\n ? { ok: true, wallpaperUrl: v.wallpaperUrl ?? null }\r\n : { ok: false, error: v?.error ?? 'failed' }\r\n}\r\n\r\n/** Download a background video from a network URL. The server streams it into\r\n * the video slot and returns the resolved MIME for playback via the serve URL. */\r\nexport async function setVideoFromUrl(url: string): Promise<{ ok: boolean; mime?: string; error?: string }> {\r\n if (!rpcCallFn) return { ok: false, error: 'rpc not ready' }\r\n let res: RpcResultLike | undefined\r\n try {\r\n res = await rpcCallFn(rpcEndpoint('setVideoUrl'), { url })\r\n } catch (e) {\r\n return { ok: false, error: e instanceof Error ? e.message : String(e) }\r\n }\r\n if (!res) return { ok: false, error: 'no response' }\r\n if (res.ok !== true) {\r\n const err = (res as { error?: { message?: string } }).error\r\n return { ok: false, error: err?.message ?? 'request failed' }\r\n }\r\n const v = res.value as { ok?: boolean; mime?: string; error?: string }\r\n return v?.ok === true\r\n ? { ok: true, mime: v.mime ?? 'video/mp4' }\r\n : { ok: false, error: v?.error ?? 'failed' }\r\n}\r\n\r\n/** Upload a video's raw bytes over HTTP (MIME in Content-Type, body untouched\r\n * — no base64 inflation that would blow the RPC body limit on large clips). */\r\nexport async function uploadVideo(blob: Blob, mime: string): Promise<boolean> {\r\n try {\r\n const res = await fetch(VIDEO_UPLOAD_URL, {\r\n method: 'POST',\r\n headers: { 'Content-Type': mime || 'application/octet-stream' },\r\n body: blob,\r\n })\r\n return res.ok\r\n } catch (e) {\r\n console.warn('dsh-any-background: video upload failed', e)\r\n return false\r\n }\r\n}\r\n\r\n/** Upload a wallpaper's raw bytes over HTTP — same streaming model as videos,\r\n * original pixels preserved, zero base64 round-trips. */\r\nexport async function uploadWallpaper(blob: Blob): Promise<boolean> {\r\n try {\r\n const res = await fetch(WALLPAPER_UPLOAD_URL, {\r\n method: 'POST',\r\n headers: { 'Content-Type': blob.type || 'image/jpeg' },\r\n body: blob,\r\n })\r\n return res.ok\r\n } catch (e) {\r\n console.warn('dsh-any-background: wallpaper upload failed', e)\r\n return false\r\n }\r\n}\r\n\r\n// ── Wallpaper rotation RPCs ──────────────────────────────────────────────────\r\n\r\nexport interface RotationAddResult { ok: boolean; index?: number; items?: Array<{ file: string; thumb: string }>; error?: string }\r\n\r\n/** Add an image (data URL + small thumbnail) to the server-side rotation pool. */\r\nexport async function rotationAdd(dataUrl: string, thumb: string): Promise<RotationAddResult> {\r\n if (!rpcCallFn) return { ok: false, error: 'rpc not ready' }\r\n try {\r\n const res = await rpcCallFn(rpcEndpoint('rotationAdd'), { dataUrl, thumb })\r\n if (res && res.ok === true) return (res.value ?? { ok: false, error: 'no value' }) as RotationAddResult\r\n return { ok: false, error: (res as { error?: { message?: string } })?.error?.message ?? 'request failed' }\r\n } catch (e) {\r\n return { ok: false, error: e instanceof Error ? e.message : String(e) }\r\n }\r\n}\r\n\r\n/** Remove a rotation item by index. Returns the updated items list. */\r\nexport async function rotationRemove(index: number): Promise<{ ok: boolean; items?: Array<{ file: string; thumb: string }>; error?: string }> {\r\n if (!rpcCallFn) return { ok: false, error: 'rpc not ready' }\r\n try {\r\n const res = await rpcCallFn(rpcEndpoint('rotationRemove'), { index })\r\n if (res && res.ok === true) return (res.value ?? { ok: false, error: 'no value' }) as { ok: boolean; items?: Array<{ file: string; thumb: string }>; error?: string }\r\n return { ok: false, error: (res as { error?: { message?: string } })?.error?.message ?? 'request failed' }\r\n } catch (e) {\r\n return { ok: false, error: e instanceof Error ? e.message : String(e) }\r\n }\r\n}\r\n\r\n/** Activate a rotation item: the server copies its bytes into the wallpaper\r\n * slot and returns the serve URL for immediate display. */\r\nexport async function rotationActivate(index: number): Promise<{ ok: boolean; wallpaperUrl?: string; error?: string }> {\r\n if (!rpcCallFn) return { ok: false, error: 'rpc not ready' }\r\n try {\r\n const res = await rpcCallFn(rpcEndpoint('rotationSet'), { index })\r\n if (res && res.ok === true) return (res.value ?? { ok: false, error: 'no value' }) as { ok: boolean; wallpaperUrl?: string; error?: string }\r\n return { ok: false, error: (res as { error?: { message?: string } })?.error?.message ?? 'request failed' }\r\n } catch (e) {\r\n return { ok: false, error: e instanceof Error ? e.message : String(e) }\r\n }\r\n}\r\n","/**\r\n * Read a chosen image file as a data URL WITHOUT re-encoding: the original\r\n * pixels are kept as-is (no canvas downscale / JPEG re-compression), so the\r\n * wallpaper is stored and displayed at full fidelity. The tradeoff is a larger\r\n * payload over the RPC channel and on disk for big images.\r\n */\r\nexport function readImg(file: File, cb: (url: string | null) => void): void {\r\n const r = new FileReader()\r\n r.onerror = () => cb(null)\r\n r.onload = () => cb(r.result as string)\r\n r.readAsDataURL(file)\r\n}\r\n\r\n/** Promised readImg variant for async flows. */\r\nexport function readImgAsync(file: File): Promise<string | null> {\r\n return new Promise(resolve => readImg(file, resolve))\r\n}\r\n\r\n/** Blob → data URL (used when a local asset must be embedded, e.g. theme export). */\r\nexport function blobToDataUrl(blob: Blob): Promise<string> {\r\n return new Promise<string>((resolve, reject) => {\r\n const fr = new FileReader()\r\n fr.onload = () => resolve(fr.result as string)\r\n fr.onerror = () => reject(fr.error)\r\n fr.readAsDataURL(blob)\r\n })\r\n}\r\n\r\n// Shared decoded-image cache. The boot path decodes the same wallpaper URL up\r\n// to four times (palette extract, brightness verdict, low-res capture,\r\n// intrinsic size); memoizing the decoded element turns those into one decode.\r\nconst IMG_CACHE_MAX = 6\r\nconst imgCache = new Map<string, Promise<HTMLImageElement | null>>()\r\n\r\n/** Decode an image URL once and share the element across callers (LRU-capped). */\r\nexport function loadImage(url: string): Promise<HTMLImageElement | null> {\r\n const hit = imgCache.get(url)\r\n if (hit) {\r\n imgCache.delete(url)\r\n imgCache.set(url, hit)\r\n return hit\r\n }\r\n const p = new Promise<HTMLImageElement | null>(resolve => {\r\n const img = new Image()\r\n img.onerror = () => resolve(null)\r\n img.onload = () => resolve(img)\r\n img.src = url\r\n })\r\n imgCache.set(url, p)\r\n while (imgCache.size > IMG_CACHE_MAX) {\r\n const oldest = imgCache.keys().next().value\r\n if (oldest !== undefined) imgCache.delete(oldest)\r\n }\r\n return p\r\n}\r\n\r\n/** Build a small JPEG thumbnail (rotation-pool picker preview). Resolves null\r\n * when the image cannot be decoded. */\r\nexport function makeThumb(dataUrl: string, maxSide = 96): Promise<string | null> {\r\n return new Promise(resolve => {\r\n const img = new Image()\r\n img.onerror = () => resolve(null)\r\n img.onload = () => {\r\n try {\r\n const iw = img.naturalWidth || img.width\r\n const ih = img.naturalHeight || img.height\r\n if (iw <= 0 || ih <= 0) { resolve(null); return }\r\n const k = Math.min(1, maxSide / Math.max(iw, ih))\r\n const c = document.createElement('canvas')\r\n c.width = Math.max(1, Math.round(iw * k))\r\n c.height = Math.max(1, Math.round(ih * k))\r\n const g = c.getContext('2d')\r\n if (!g) { resolve(null); return }\r\n g.drawImage(img, 0, 0, c.width, c.height)\r\n resolve(c.toDataURL('image/jpeg', 0.72))\r\n } catch {\r\n resolve(null)\r\n }\r\n }\r\n img.src = dataUrl\r\n })\r\n}\r\n","import type { BgState, ColorPalette } from '../types'\nimport { loadImage } from './image'\r\n\r\n// The wheel works in HSV end to end; storage and genTokens expect HSL, so\r\n// setColor converts HSV → HSL at the boundary and sectionInject converts the\r\n// stored HSL → HSV for the initial wheel props. Conversions never stack.\r\n\r\nexport function hsvToHsl(h: number, s: number, v: number): [number, number, number] {\r\n const l = v * (1 - s / 2)\r\n const sl = l === 0 || l === 1 ? 0 : (v - l) / Math.min(l, 1 - l)\r\n return [h, sl, l]\r\n}\r\n\r\nexport function hslToHsv(h: number, s: number, l: number): [number, number, number] {\r\n const v = l + s * Math.min(l, 1 - l)\r\n const sv = v === 0 ? 0 : 2 * (1 - l / v)\r\n return [h, sv, v]\r\n}\r\n\r\nlet tokensCacheKey = ''\r\nlet tokensCache: { colorScheme: 'light' | 'dark'; tokens: Record<string, string> } | null = null\r\n\r\n/**\r\n * Memoized token generation: the same (hue, sat, lit, scheme) input always\r\n * yields the same token set, and applyWp / applyCustomTokens /\r\n * applySettingsOverrides call this repeatedly (slider drags, viewport\r\n * re-applies), so cache the last result and skip the 30+ hsl() string builds\r\n * when nothing changed. The optional scheme forces the palette direction\r\n * (light/dark) independently of the color's own lightness.\r\n */\r\nexport function genTokens(hue: number, sat: number, lit: number, scheme?: 'light' | 'dark'): { colorScheme: 'light' | 'dark'; tokens: Record<string, string> } {\r\n const key = `${hue}|${sat}|${lit}|${scheme ?? 'auto'}`\r\n if (tokensCacheKey === key && tokensCache) return tokensCache\r\n tokensCacheKey = key\r\n tokensCache = buildTokens(hue, sat, lit, scheme)\r\n return tokensCache\r\n}\r\n\r\nfunction buildTokens(hue: number, sat: number, lit: number, scheme?: 'light' | 'dark'): { colorScheme: 'light' | 'dark'; tokens: Record<string, string> } {\r\n // `scheme ?? lit < 0.55` would hand back the STRING 'light' (truthy) and\r\n // route both forced directions into the dark branch — compare explicitly.\r\n const dark = scheme !== undefined ? scheme === 'dark' : lit < 0.55\r\n // Every token is an offset around the base lightness, so a scheme that\r\n // contradicts the pick's band (a forced dark over a light color) would\r\n // build \"dark\" surfaces that stay light. Mirror the lightness into the\r\n // target band instead — hue/saturation carry over, the stored pick itself\r\n // is untouched (this is a display-time remap, not a config change).\r\n if (scheme !== undefined && (lit < 0.55) !== dark) {\r\n lit = dark\r\n ? Math.min(0.44, Math.max(0.14, 1 - lit))\r\n : Math.max(0.6, Math.min(0.88, 1 - lit))\r\n }\r\n const h = (d: number) => ((hue + d) % 360 + 360) % 360\r\n const s = (d: number) => Math.max(0, Math.min(1, sat + d))\r\n const l = (d: number) => Math.max(0, Math.min(1, lit + d))\r\n const hsl = (hh: number, ss: number, ll: number) => `hsl(${Math.round(hh)},${Math.round(ss * 100)}%,${Math.round(ll * 100)}%)`\r\n const rgba = (hh: number, ss: number, ll: number, a: number) =>\r\n `hsla(${Math.round(hh)},${Math.round(ss * 100)}%,${Math.round(ll * 100)}%,${a})`\r\n\r\n if (dark) {\r\n return {\r\n colorScheme: 'dark',\r\n tokens: {\r\n '--dsw-alias-bg-base': hsl(h(0), s(0), l(-0.04)),\r\n '--dsw-alias-bg-layer-1': hsl(h(0), s(0), l(0.02)),\r\n '--dsw-alias-bg-layer-2': hsl(h(0), s(0), l(0.07)),\r\n '--dsw-alias-bg-layer-3': hsl(h(0), s(-0.05), l(0.12)),\r\n '--dsw-alias-bg-overlay': hsl(h(0), s(-0.05), l(0.12)),\r\n '--dsw-alias-bg-module-platform': hsl(h(0), s(0), l(0.05)),\r\n '--dsw-alias-bg-multi-select': hsl(h(0), s(0), l(0.1)),\r\n '--dsw-alias-bg-skeleton': 'rgba(255,255,255,0.08)',\r\n '--dsw-alias-border-l1': rgba(h(0), s(-0.1), l(0.18), 0.12),\r\n '--dsw-alias-border-l2': rgba(h(0), s(-0.1), l(0.22), 0.22),\r\n '--dsw-alias-border-l3': 'rgba(255,255,255,0.16)',\r\n '--dsw-alias-border-l4': 'rgba(255,255,255,0.2)',\r\n '--dsw-alias-border-inverted': 'rgba(255,255,255,0.06)',\r\n '--dsw-alias-label-primary': hsl(0, 0, 1),\r\n '--dsw-alias-label-secondary': 'rgba(255,255,255,0.85)',\r\n '--dsw-alias-label-tertiary': 'rgba(255,255,255,0.7)',\r\n // Placeholder/dim hint — deliberately weaker than the text tiers so a\r\n // placeholder reads as a hint, never as real input.\r\n '--dsw-alias-label-caption': 'rgba(255,255,255,0.5)',\r\n '--dsw-alias-label-dimmed': 'rgba(255,255,255,0.35)',\r\n '--dsw-alias-label-quaternary': 'rgba(255,255,255,0.25)',\r\n '--dsw-alias-label-primary-dimmed': 'rgba(255,255,255,0.92)',\r\n '--dsw-alias-label-primary-foreground': hsl(0, 0, 1),\r\n // Inverted label sits on a light brand/contrast/badge surface in dark\r\n // mode, so it must be dark ink, not white.\r\n '--dsw-alias-label-primary-inverted': hsl(h(0), s(0.08), Math.min(l(0.06), 0.16)),\r\n '--dsw-alias-label-primary-bluish': hsl(0, 0, 1),\r\n '--dsw-alias-brand-primary': hsl(h(0), s(0.1), Math.max(l(0.2), 0.5)),\r\n '--dsw-alias-brand-text': l(0.2) > 0.6 ? '#000' : '#fff',\r\n '--dsw-alias-button-primary-fill': hsl(h(0), s(0.1), Math.max(l(0.2), 0.5)),\r\n '--dsw-alias-button-primary-hover': hsl(h(0), s(0.1), Math.max(l(0.28), 0.58)),\r\n '--dsw-alias-button-primary-dimmed': hsl(h(0), s(0), l(0.07)),\r\n '--dsw-alias-button-elevated-fill': hsl(h(0), s(0), l(0.04)),\r\n '--dsw-alias-button-floating-fill': hsl(h(0), s(0), l(0.02)),\r\n '--dsw-alias-button-floating-hover': hsl(h(0), s(0), l(0.1)),\r\n '--dsw-alias-button-tool-bar-fill': 'rgba(255,255,255,0.08)',\r\n '--dsw-alias-button-tool-bar-hover': 'rgba(255,255,255,0.12)',\r\n '--dsw-alias-button-ghost-active-fill': hsl(h(0), s(0), l(0.06)),\r\n '--dsw-alias-button-ghost-active-border': 'rgba(255,255,255,0.16)',\r\n '--dsw-alias-button-ghost-active-hover': hsl(h(0), s(0), l(0.09)),\r\n '--dsw-alias-button-info-fill': '#679efe',\r\n '--dsw-alias-button-info-hover': '#4176e6',\r\n '--dsw-alias-button-contrast-fill': hsl(0, 0, 1),\r\n '--dsw-alias-interactive-bg-hover': rgba(h(0), s(0), Math.max(l(0.15), 0.4), 0.12),\r\n '--dsw-alias-interactive-bg-hover-solid': rgba(h(0), s(0), Math.max(l(0.15), 0.4), 0.16),\r\n '--dsw-alias-interactive-bg-hover-accent': 'rgba(255,255,255,0.24)',\r\n '--dsw-alias-interactive-bg-hover-danger': 'rgba(242,90,90,0.15)',\r\n '--dsw-alias-interactive-bg-active': rgba(h(0), s(0), Math.max(l(0.15), 0.4), 0.2),\r\n '--dsw-alias-markdown-code-block': hsl(h(0), s(0), l(-0.06)),\r\n '--dsw-alias-markdown-code-block-banner': hsl(h(0), s(0), l(-0.02)),\r\n '--dsw-alias-markdown-inline-code': hsl(h(0), s(0), l(0.04)),\r\n '--dsw-alias-markdown-placeholder': hsl(h(0), s(0), l(-0.02)),\r\n '--dsw-alias-markdown-tag': hsl(h(0), s(0), l(0.05)),\r\n '--dsw-alias-markdown-citation': hsl(h(0), s(0), l(0.06)),\r\n '--dsw-alias-markdown-code-segment-selected': hsl(h(0), s(0), l(0.05)),\r\n '--dsw-alias-markdown-code-segment-unselected': hsl(h(0), s(0), l(-0.05)),\r\n '--dsw-alias-state-error-primary': '#ff5c72',\r\n '--dsw-alias-state-error-secondary': '#ff8aa0',\r\n '--dsw-alias-state-success-primary': '#3ddc84',\r\n '--dsw-alias-state-success-secondary': '#69eea4',\r\n // Badge tertiary tokens are the static dark surfaces the UI draws\r\n // over (trajectory tool/context badges, connection pill, plan chip):\r\n // aligning them with the native dark 800/900 steps keeps light fix label\r\n // text readable instead of tint-same-as-background (issue #9).\r\n '--dsw-alias-state-success-tertiary': '#233c2c',\r\n '--dsw-alias-state-warn-primary': '#ffb347',\r\n '--dsw-alias-state-warn-secondary': '#ffc980',\r\n '--dsw-alias-state-warn-tertiary': '#27241f',\r\n '--dsw-alias-state-warn-label': '#dd8629',\r\n '--dsw-alias-state-business-primary': '#679efe',\r\n '--dsw-alias-state-business-tertiary': '#34415b',\r\n '--dsw-specific-sidebar-fill': hsl(h(0), s(0), l(-0.06)),\r\n '--dsw-specific-sidebar-nav-item-active': hsl(h(0), s(0), l(0.04)),\r\n '--dsw-specific-sidebar-nav-item-hover': hsl(h(0), s(0), l(0)),\r\n '--dsw-specific-input-major': hsl(h(0), s(0), l(0.02)),\r\n '--dsw-specific-menu': hsl(h(0), s(0), l(0.08)),\r\n '--dsw-specific-bubble': hsl(h(0), s(0), l(0.03)),\r\n '--dsw-specific-bubble-highlight': hsl(h(0), s(0), l(0.08)),\r\n '--dsw-specific-selector': hsl(h(0), s(0), l(0.05)),\r\n '--dsw-specific-login-input': hsl(h(0), s(0), l(0.03)),\r\n '--dsw-specific-tip': hsl(h(0), s(0), l(0.05)),\r\n '--dsw-alias-toast-bg': hsl(h(0), s(0), l(0.08)),\r\n '--dsw-alias-tooltip-bg': hsl(h(0), s(0), l(0.08)),\r\n '--dsw-alias-scrollbar-bg-l1': hsl(h(0), s(-0.05), l(0.12)),\r\n '--dsw-alias-scrollbar-bg-l2': hsl(h(0), s(-0.05), l(0.16)),\r\n '--dsw-alias-scrollbar-hover-l1': hsl(h(0), s(-0.05), l(0.22)),\r\n '--dsw-alias-scrollbar-hover-l2': hsl(h(0), s(-0.05), l(0.22)),\r\n },\r\n }\r\n }\r\n return {\r\n colorScheme: 'light',\r\n tokens: {\r\n '--dsw-alias-bg-base': hsl(h(0), s(-0.08), l(0.03)),\r\n '--dsw-alias-bg-layer-1': hsl(h(0), s(-0.12), l(0.07)),\r\n '--dsw-alias-bg-layer-2': hsl(h(0), s(-0.1), l(-0.03)),\r\n '--dsw-alias-bg-layer-3': hsl(h(0), s(-0.08), l(-0.09)),\r\n '--dsw-alias-bg-overlay': hsl(h(0), s(-0.12), l(0.08)),\r\n '--dsw-alias-border-l1': rgba(h(0), s(-0.15), l(-0.35), 0.18),\r\n '--dsw-alias-border-l2': rgba(h(0), s(-0.15), l(-0.35), 0.3),\r\n '--dsw-alias-label-primary': hsl(0, 0, 0),\r\n '--dsw-alias-label-secondary': 'rgba(0,0,0,0.85)',\r\n '--dsw-alias-label-tertiary': 'rgba(0,0,0,0.7)',\r\n // Placeholder/dim hint — deliberately weaker than the text tiers so a\r\n // placeholder reads as a hint, never as real input.\r\n '--dsw-alias-label-caption': 'rgba(0,0,0,0.5)',\r\n '--dsw-alias-label-dimmed': 'rgba(0,0,0,0.35)',\r\n '--dsw-alias-label-quaternary': 'rgba(0,0,0,0.25)',\r\n '--dsw-alias-brand-primary': hsl(h(0), s(0.05), Math.min(l(-0.18), 0.45)),\r\n '--dsw-alias-brand-text': '#fff',\r\n '--dsw-alias-button-primary-hover': hsl(h(0), s(0.05), Math.min(l(-0.12), 0.5)),\r\n '--dsw-alias-button-primary-dimmed': hsl(h(0), s(-0.1), l(-0.03)),\r\n '--dsw-alias-button-elevated-fill': hsl(h(0), s(-0.1), l(0.1)),\r\n '--dsw-alias-button-floating-hover': hsl(h(0), s(-0.1), l(0.16)),\r\n '--dsw-alias-interactive-bg-hover': rgba(h(0), s(0), l(-0.3), 0.08),\r\n '--dsw-alias-interactive-bg-active': rgba(h(0), s(0), l(-0.3), 0.14),\r\n '--dsw-alias-markdown-code-block': hsl(h(0), s(-0.1), l(-0.03)),\r\n '--dsw-alias-markdown-inline-code': hsl(h(0), s(-0.08), l(0.04)),\r\n '--dsw-specific-sidebar-fill': hsl(h(0), s(-0.1), l(-0.03)),\r\n '--dsw-specific-sidebar-nav-item-active': hsl(h(0), s(-0.08), l(0.05)),\r\n '--dsw-specific-sidebar-nav-item-hover': hsl(h(0), s(-0.12), l(0)),\r\n '--dsw-specific-input-major': hsl(h(0), s(-0.12), l(0.1)),\r\n '--dsw-specific-menu': hsl(h(0), s(-0.12), l(0.15)),\r\n '--dsw-alias-scrollbar-bg-l1': hsl(h(0), s(-0.1), l(-0.08)),\r\n '--dsw-alias-scrollbar-bg-l2': hsl(h(0), s(-0.08), l(-0.12)),\r\n '--dsw-alias-scrollbar-hover-l1': hsl(h(0), s(-0.08), l(-0.16)),\r\n '--dsw-alias-scrollbar-hover-l2': hsl(h(0), s(-0.08), l(-0.16)),\r\n },\r\n }\r\n}\r\n\r\nexport function toRgba(c: string, a: number): string {\r\n const hx = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(c.trim())\r\n if (hx) { let d = hx[1]!; if (d.length === 3) d = d.split('').map(x => x + x).join(''); const n = parseInt(d, 16); return `rgba(${(n >> 16) & 255},${(n >> 8) & 255},${n & 255},${a})` }\r\n const rgb = /^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+))?\\s*\\)$/i.exec(c.trim())\r\n if (rgb) return `rgba(${rgb[1]},${rgb[2]},${rgb[3]},${a})`\r\n const hsl = /^hsla?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%/i.exec(c.trim())\r\n if (hsl) return `hsla(${hsl[1]},${hsl[2]}%,${hsl[3]}%,${a})`\r\n return c.trim()\r\n}\r\n\r\nexport function rgbToHsl(r: number, g: number, b: number): [number, number, number] {\r\n const rn = r / 255, gn = g / 255, bn = b / 255\r\n const max = Math.max(rn, gn, bn), min = Math.min(rn, gn, bn)\r\n const l = (max + min) / 2\r\n if (max === min) return [0, 0, l]\r\n const d = max - min\r\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\r\n let h: number\r\n if (max === rn) h = ((gn - bn) / d) % 6\r\n else if (max === gn) h = (bn - rn) / d + 2\r\n else h = (rn - gn) / d + 4\r\n h *= 60\r\n if (h < 0) h += 360\r\n return [h, s, l]\r\n}\r\n\r\n// Wallpaper color extraction: decode the cached data URL → crop the visible\r\n// (framed) region → downsample to a 64×64 canvas → quantize pixels into 4-bit\r\n// RGB buckets → discard near-gray / near-black / near-white pixels → pick the\r\n// most populous vivid bucket (count × saturation bias) → average its members →\r\n// RGB→HSL → clamp lightness into a band that keeps the light/dark scheme\r\n// decision unambiguous. Purely client-side and memory-bounded.\r\n\r\nconst EXTRACT_SIDE = 64\r\n\r\ninterface Bucket { count: number; r: number; g: number; b: number; s: number }\r\n\r\nfunction bucketsToHsl(b: Bucket): [number, number, number] {\r\n return rgbToHsl(b.r / b.count, b.g / b.count, b.b / b.count)\r\n}\r\n\r\nfunction extractWallpaperPalette(dataUrl: string, bgState: BgState): Promise<ColorPalette | null> {\r\n return loadImage(dataUrl).then(img => {\r\n if (!img) return null\r\n try {\r\n const iw = img.naturalWidth || img.width\r\n const ih = img.naturalHeight || img.height\r\n const bg = bgState\r\n let sx = 0, sy = 0, sw = iw, sh = ih\r\n if (bg.iw === iw && bg.ih === ih && bg.iw > 0) {\r\n const fit = Math.min(window.innerWidth / iw, window.innerHeight / ih)\r\n const w = iw * fit * bg.zoom\r\n const h = ih * fit * bg.zoom\r\n // bg.x/bg.y are the image center's fractional viewport point, so the\r\n // image's top-left sits at (px, py) in viewport coordinates — the\r\n // same offset wallpaper.ts writes into background-position. The\r\n // visible source band is viewport [0, vw] mapped to source\r\n // [-px, vw - px], clipped to the image.\r\n const px = bg.x * window.innerWidth - w / 2\r\n const py = bg.y * window.innerHeight - h / 2\r\n sx = Math.max(0, -px)\r\n sy = Math.max(0, -py)\r\n sw = Math.min(iw - sx, window.innerWidth - px - sx)\r\n sh = Math.min(ih - sy, window.innerHeight - py - sy)\r\n if (sw <= 0 || sh <= 0) { sx = 0; sy = 0; sw = iw; sh = ih }\r\n }\r\n const c = document.createElement('canvas')\r\n c.width = EXTRACT_SIDE; c.height = EXTRACT_SIDE\r\n const g = c.getContext('2d', { willReadFrequently: true })!\r\n g.drawImage(img, sx, sy, sw, sh, 0, 0, EXTRACT_SIDE, EXTRACT_SIDE)\r\n const px = g.getImageData(0, 0, EXTRACT_SIDE, EXTRACT_SIDE).data\r\n const counts = new Uint32Array(4096)\r\n const sums = new Float64Array(4096 * 3)\r\n let totalLum = 0\r\n let sampled = 0\r\n for (let i = 0; i < px.length; i += 4) {\r\n const r = px[i], gg = px[i + 1], b = px[i + 2]\r\n const max = Math.max(r, gg, b), min = Math.min(r, gg, b)\r\n const v = max / 255\r\n const s = max === 0 ? 0 : (max - min) / max\r\n // Include all non-extreme pixels in luminance; only vivid pixels in\r\n // palette buckets so we don't theme around gray/black/white.\r\n // Rec.709 luma — the SAME measure analyzeFrameDark uses for the\r\n // brightness verdict, so the extracted lightness band and the\r\n // verdict can never disagree on a saturated frame.\r\n totalLum += (0.2126 * r + 0.7152 * gg + 0.0722 * b) / 255\r\n sampled++\r\n if (s < 0.08 || v < 0.12 || v > 0.97) continue\r\n const key = ((r >> 4) << 8) | ((gg >> 4) << 4) | (b >> 4)\r\n counts[key]++\r\n sums[key * 3] += r; sums[key * 3 + 1] += gg; sums[key * 3 + 2] += b\r\n }\r\n const buckets: Bucket[] = []\r\n for (let k = 0; k < 4096; k++) {\r\n if (counts[k] === 0) continue\r\n buckets.push({\r\n count: counts[k],\r\n r: sums[k * 3],\r\n g: sums[k * 3 + 1],\r\n b: sums[k * 3 + 2],\r\n s: (Math.max(sums[k * 3], sums[k * 3 + 1], sums[k * 3 + 2]) - Math.min(sums[k * 3], sums[k * 3 + 1], sums[k * 3 + 2])) / Math.max(sums[k * 3], sums[k * 3 + 1], sums[k * 3 + 2]) || 0,\r\n })\r\n }\r\n if (buckets.length === 0) { return null }\r\n // Sort by vivid-weighted count.\r\n buckets.sort((a, b) => b.count * (0.5 + b.s) - a.count * (0.5 + a.s))\r\n const primary = bucketsToHsl(buckets[0]!)\r\n const primaryHue = primary[0]\r\n // Secondary: next bucket that is reasonably separated from primary.\r\n let secondary = primary\r\n for (const b of buckets.slice(1)) {\r\n const [h] = bucketsToHsl(b)\r\n const sep = Math.abs(((h - primaryHue + 540) % 360) - 180)\r\n if (sep > 30) { secondary = bucketsToHsl(b); break }\r\n }\r\n // Tertiary: complementary-ish hue based on primary if no good secondary.\r\n let tertiary: [number, number, number] = [((primaryHue + 180) % 360), Math.min(0.7, primary[1]), Math.min(0.7, primary[2])]\r\n for (const b of buckets.slice(1)) {\r\n const [h] = bucketsToHsl(b)\r\n const sep = Math.abs(((h - primaryHue + 540) % 360) - 180)\r\n if (sep > 90 && sep < 150) { tertiary = bucketsToHsl(b); break }\r\n }\r\n // Surface: neutralized primary (very low saturation).\r\n const surface: [number, number, number] = [primaryHue, Math.min(0.06, primary[1] * 0.3), primary[2]]\r\n // Auto light/dark: use the average luminance of the whole image so a\r\n // bright wallpaper naturally drives a light scheme and vice-versa.\r\n const luminance = sampled > 0 ? totalLum / sampled : primary[2]\r\n // Snap primary lightness out of the ambiguous middle band.\r\n const autoDark = luminance < 0.5\r\n const lc = autoDark ? Math.min(0.44, Math.max(0.2, primary[2])) : Math.max(0.6, Math.min(0.82, primary[2]))\r\n primary[2] = lc\r\n return {\r\n primary: [primary[0], Math.min(0.9, Math.max(0.15, primary[1])), primary[2]],\r\n secondary: [secondary[0], Math.min(0.85, Math.max(0.2, secondary[1])), Math.min(0.75, Math.max(0.35, secondary[2]))],\r\n tertiary: [tertiary[0], Math.min(0.8, Math.max(0.2, tertiary[1])), Math.min(0.7, Math.max(0.35, tertiary[2]))],\r\n surface,\r\n luminance,\r\n }\r\n } catch {\r\n return null\r\n }\r\n })\r\n}\r\n\r\n/** Backward-compatible single-color extraction: returns the primary HSL. */\r\nexport async function extractWallpaperColor(dataUrl: string, bgState: BgState): Promise<[number, number, number] | null> {\r\n const palette = await extractWallpaperPalette(dataUrl, bgState)\r\n return palette ? palette.primary : null\r\n}\r\n\r\n// One-shot frame brightness analysis: called only when a generated background\r\n// is switched (from its captured snapshot), never from the animation loop.\r\n// Decode the frame, downsample to a 32×32 canvas, average Rec.709 luma.\r\n// Dark frame → light fonts, light frame → dark fonts.\r\n\r\nconst ANALYZE_SIDE = 32\r\n\r\n/** Analyze a captured frame's average luminance. Resolves true when the frame\r\n * reads dark (use white fonts), false when light (use black fonts), or null\r\n * when the frame cannot be decoded. */\r\nexport function analyzeFrameDark(dataUrl: string): Promise<boolean | null> {\r\n return loadImage(dataUrl).then(img => {\r\n if (!img) return null\r\n try {\r\n const c = document.createElement('canvas')\r\n c.width = ANALYZE_SIDE; c.height = ANALYZE_SIDE\r\n const g = c.getContext('2d', { willReadFrequently: true })!\r\n g.drawImage(img, 0, 0, ANALYZE_SIDE, ANALYZE_SIDE)\r\n const px = g.getImageData(0, 0, ANALYZE_SIDE, ANALYZE_SIDE).data\r\n let lum = 0\r\n const count = px.length / 4\r\n for (let i = 0; i < px.length; i += 4) {\r\n lum += 0.2126 * px[i]! + 0.7152 * px[i + 1]! + 0.0722 * px[i + 2]!\r\n }\r\n return lum / count / 255 < 0.5\r\n } catch {\r\n return null\r\n }\r\n })\r\n}\r\n\r\n/** HSL (h 0-360, s/l 0-1) → RGB (0-255 integers). */\r\nexport function hslToRgb(h: number, s: number, l: number): [number, number, number] {\r\n const c = (1 - Math.abs(2 * l - 1)) * s\r\n const hp = h / 60\r\n const x = c * (1 - Math.abs((hp % 2) - 1))\r\n let r = 0, g = 0, b = 0\r\n if (hp < 1) { r = c; g = x }\r\n else if (hp < 2) { r = x; g = c }\r\n else if (hp < 3) { g = c; b = x }\r\n else if (hp < 4) { g = x; b = c }\r\n else if (hp < 5) { r = x; b = c }\r\n else { r = c; b = x }\r\n const m = l - c / 2\r\n return [Math.round((r + m) * 255), Math.round((g + m) * 255), Math.round((b + m) * 255)]\r\n}\r\n","import type { GeneratedBgParams, MeshGradientParams, ShaderParams, PatternParams } from '../types'\r\n\r\n// The live full-screen canvas renders at a fraction of the CSS size — it sits\r\n// behind frosted/translucent UI anyway, so ~0.5–0.6px backing keeps it looking\r\n// sharp while drastically cutting fill/gradient cost per frame.\r\nconst RENDER_SCALE = 0.55\r\nconst FPS = 30\r\nconst FRAME_MS = 1000 / FPS\r\n\r\nexport interface LiveBgController {\r\n canvas: HTMLCanvasElement\r\n stop: () => void\r\n pause: () => void\r\n resume: () => void\r\n snapshot: () => string\r\n}\r\n\r\nfunction newRaf(canvas: HTMLCanvasElement, draw: () => void): { stop: () => void; pause: () => void; resume: () => void } {\r\n canvas.dataset.dshAnyCanvas = '1'\r\n let running = true\r\n let paused = false\r\n let rafId = 0\r\n let last = 0\r\n // Draw the very first frame synchronously so snapshot() right after creation\r\n // already yields a real frame (used by the preview, palette and export).\r\n draw()\r\n // Reduced-motion preference: keep the static first frame, never start the loop.\r\n if (typeof window.matchMedia === 'function' && window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\r\n return { stop: () => { running = false }, pause: () => undefined, resume: () => undefined }\r\n }\r\n const loop = (ts: number) => {\r\n if (!running || paused) return\r\n if (ts - last >= FRAME_MS) { last = ts; draw() }\r\n rafId = requestAnimationFrame(loop)\r\n }\r\n rafId = requestAnimationFrame(loop)\r\n return {\r\n stop: () => { running = false; cancelAnimationFrame(rafId) },\r\n pause: () => { paused = true; cancelAnimationFrame(rafId) },\r\n resume: () => {\r\n if (!running || !paused) return\r\n paused = false\r\n last = 0\r\n rafId = requestAnimationFrame(loop)\r\n },\r\n }\r\n}\r\n\r\nfunction createCanvas(): HTMLCanvasElement {\r\n const c = document.createElement('canvas')\r\n c.style.cssText = 'position:absolute;inset:0;width:100%;height:100%;object-fit:cover;'\r\n return c\r\n}\r\n\r\nfunction liveSize(): { w: number; h: number } {\r\n const dpr = Math.min(window.devicePixelRatio || 1, 1.5)\r\n const w = Math.max(320, Math.ceil(window.innerWidth * dpr * RENDER_SCALE))\r\n const h = Math.max(180, Math.ceil(window.innerHeight * dpr * RENDER_SCALE))\r\n return { w, h }\r\n}\r\n\r\nfunction fitLiveCanvas(c: HTMLCanvasElement): void {\r\n const { w, h } = liveSize()\r\n if (c.width !== w || c.height !== h) { c.width = w; c.height = h }\r\n}\r\n\r\n// ── Deterministic seeded RNG ─────────────────────────────────────────────────\r\nfunction createRng(seed: number) {\r\n let s = seed > 0 ? seed : 1\r\n return () => {\r\n s ^= s << 13\r\n s ^= s >>> 17\r\n s ^= s << 5\r\n return (s >>> 0) / 0xffffffff\r\n }\r\n}\r\n\r\n// ── Seeded 2D noise (for canvas mesh / pattern motion) ──────────────────────\r\nfunction createNoise(seed: number) {\r\n const rng = createRng(seed)\r\n const perm: number[] = []\r\n for (let i = 0; i < 256; i++) perm[i] = i\r\n for (let i = 255; i > 0; i--) {\r\n const j = Math.floor(rng() * (i + 1))\r\n const t = perm[i]!; perm[i] = perm[j]!; perm[j] = t\r\n }\r\n for (let i = 0; i < 256; i++) perm[i + 256] = perm[i]!\r\n function fade(t: number) { return t * t * t * (t * (t * 6 - 15) + 10) }\r\n function lerp(a: number, b: number, t: number) { return a + (b - a) * t }\r\n function grad(hash: number, x: number, y: number) {\r\n const h = hash & 15\r\n const u = h < 8 ? x : y\r\n const v = h < 4 ? y : (h === 12 || h === 14) ? x : 0\r\n return ((h & 1) === 0 ? u : -u) + ((h & 2) === 0 ? v : -v)\r\n }\r\n return (x: number, y: number) => {\r\n const X = Math.floor(x) & 255\r\n const Y = Math.floor(y) & 255\r\n x -= Math.floor(x)\r\n y -= Math.floor(y)\r\n const u = fade(x)\r\n const v = fade(y)\r\n const A = perm[X]! + Y\r\n return lerp(\r\n lerp(grad(perm[A]!, x, y), grad(perm[A! + 1]!, x - 1, y), u),\r\n lerp(grad(perm[A! + 256]!, x, y - 1), grad(perm[A! + 257]!, x - 1, y - 1), u),\r\n v,\r\n )\r\n }\r\n}\r\n\r\n// ── Mesh gradient (animated) ──────────────────────────────────────────────────\r\nexport function createMeshGradient(params: MeshGradientParams, canvas?: HTMLCanvasElement): LiveBgController {\r\n const c = canvas ?? createCanvas()\r\n fitLiveCanvas(c)\r\n const g = c.getContext('2d', { alpha: false })!\r\n const rng = createRng(params.seed)\r\n const noise = createNoise(params.seed)\r\n const dark = rng() < 0.5\r\n const baseHue = Math.round(rng() * 360)\r\n const count = Math.round(7 + 9 * params.scale * params.intensity)\r\n const blobs: { x: number; y: number; r: number; hx: number; hy: number; speed: number; hue: number; sat: number; lit: number }[] = []\r\n for (let i = 0; i < count; i++) {\r\n blobs.push({\r\n x: rng(), y: rng(),\r\n r: (0.22 + rng() * 0.6) * params.scale,\r\n hx: rng() * 4 - 2, hy: rng() * 4 - 2,\r\n speed: 0.05 + rng() * 0.1,\r\n hue: (baseHue + (rng() < 0.5 ? 30 : 180) + rng() * 60) % 360,\r\n sat: Math.round(45 + rng() * 50 * params.intensity),\r\n lit: dark ? Math.round(18 + rng() * 35 * params.intensity) : Math.round(60 + rng() * 25 * params.intensity),\r\n })\r\n }\r\n let t = 0\r\n const alpha = (0.22 + 0.3 * params.intensity).toFixed(3)\r\n const innerAlpha = (+alpha * 0.35).toFixed(3)\r\n const draw = () => {\r\n fitLiveCanvas(c)\r\n const w = c.width, h = c.height\r\n g.fillStyle = dark ? '#0a0b0e' : '#f5f7fa'\r\n g.fillRect(0, 0, w, h)\r\n for (const b of blobs) {\r\n const phase = t * b.speed\r\n const cx = (((b.x + noise(b.hx + phase * 0.3, b.hy) * 0.25 + phase * 0.03) % 1 + 1) % 1) * w\r\n const cy = (((b.y + noise(b.hx, b.hy + phase * 0.3) * 0.25 + phase * 0.012) % 1 + 1) % 1) * h\r\n const r = b.r * Math.min(w, h) * (0.8 + 0.4 * Math.sin(phase + b.hx))\r\n const rad = g.createRadialGradient(cx, cy, 0, cx, cy, r)\r\n rad.addColorStop(0, `hsla(${b.hue},${b.sat}%,${b.lit}%,${alpha})`)\r\n rad.addColorStop(0.55, `hsla(${b.hue},${Math.round(b.sat * 0.6)}%,${b.lit}%,${innerAlpha})`)\r\n rad.addColorStop(1, 'hsla(0,0%,0%,0)')\r\n g.fillStyle = rad\r\n g.fillRect(0, 0, w, h)\r\n }\r\n t += 0.028\r\n }\r\n return { canvas: c, ...newRaf(c, draw), snapshot: () => c.toDataURL('image/jpeg', 0.92) }\r\n}\r\n\r\n// ── Shader backgrounds (animated WebGL) ───────────────────────────────────────\r\nexport function createShaderBg(params: ShaderParams, canvas?: HTMLCanvasElement): LiveBgController {\r\n const c = canvas ?? createCanvas()\r\n fitLiveCanvas(c)\r\n const gl = c.getContext('webgl', { alpha: false }) || c.getContext('experimental-webgl', { alpha: false }) as WebGLRenderingContext | null\r\n if (!gl) return createMeshGradient({ type: 'mesh', seed: params.speed * 1000, scale: params.scale, intensity: 0.6 }, c)\r\n\r\n const vs = `\r\n attribute vec2 a_position;\r\n void main() { gl_Position = vec4(a_position, 0.0, 1.0); }\r\n `\r\n const program = createProgram(gl, vs, shaderFragment(params.preset))\r\n if (!program) return createMeshGradient({ type: 'mesh', seed: params.speed * 1000, scale: params.scale, intensity: 0.6 }, c)\r\n\r\n const posLoc = gl.getAttribLocation(program, 'a_position')\r\n const buf = gl.createBuffer()\r\n gl.bindBuffer(gl.ARRAY_BUFFER, buf)\r\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1]), gl.STATIC_DRAW)\r\n gl.enableVertexAttribArray(posLoc)\r\n gl.vertexAttribPointer(posLoc, 2, gl.FLOAT, false, 0, 0)\r\n gl.useProgram(program)\r\n const uRes = gl.getUniformLocation(program, 'u_resolution')\r\n const uTime = gl.getUniformLocation(program, 'u_time')\r\n const uScale = gl.getUniformLocation(program, 'u_scale')\r\n const uSeed = gl.getUniformLocation(program, 'u_seed')\r\n const seed01 = (params.seed >>> 0) / 0xffffffff\r\n let t = 0\r\n const draw = () => {\r\n fitLiveCanvas(c)\r\n gl.viewport(0, 0, c.width, c.height)\r\n gl.uniform2f(uRes, c.width, c.height)\r\n gl.uniform1f(uTime, t)\r\n gl.uniform1f(uScale, params.scale)\r\n gl.uniform1f(uSeed, seed01)\r\n gl.drawArrays(gl.TRIANGLES, 0, 6)\r\n t += 0.32 * params.speed\r\n }\r\n return { canvas: c, ...newRaf(c, draw), snapshot: () => c.toDataURL('image/jpeg', 0.95) }\r\n}\r\n\r\nfunction createProgram(gl: WebGLRenderingContext, vs: string, fs: string): WebGLProgram | null {\r\n const v = gl.createShader(gl.VERTEX_SHADER)\r\n const f = gl.createShader(gl.FRAGMENT_SHADER)\r\n if (!v || !f) return null\r\n gl.shaderSource(v, vs); gl.compileShader(v)\r\n gl.shaderSource(f, fs); gl.compileShader(f)\r\n if (!gl.getShaderParameter(v, gl.COMPILE_STATUS) || !gl.getShaderParameter(f, gl.COMPILE_STATUS)) {\r\n gl.deleteShader(v); gl.deleteShader(f)\r\n return null\r\n }\r\n const p = gl.createProgram()\r\n if (!p) return null\r\n gl.attachShader(p, v); gl.attachShader(p, f); gl.linkProgram(p)\r\n if (!gl.getProgramParameter(p, gl.LINK_STATUS)) { gl.deleteProgram(p); return null }\r\n return p\r\n}\r\n\r\nfunction shaderFragment(preset: ShaderParams['preset']): string {\r\n const common = `\r\n precision mediump float;\r\n uniform vec2 u_resolution;\r\n uniform float u_time;\r\n uniform float u_scale;\r\n uniform float u_seed;\r\n\r\n vec3 mod289(vec3 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }\r\n vec4 mod289(vec4 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }\r\n vec4 permute(vec4 x) { return mod289(((x*34.0)+1.0)*x); }\r\n vec4 taylorInvSqrt(vec4 r) { return 1.79284291400159 - 0.85373472095314 * r; }\r\n vec3 hueRotate(vec3 rgb, float angle) {\r\n float c = cos(angle), s = sin(angle);\r\n mat3 m = mat3(\r\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,\r\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,\r\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\r\n );\r\n return rgb * m;\r\n }\r\n float snoise(vec3 v) {\r\n const vec2 C = vec2(1.0/6.0, 1.0/3.0);\r\n const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\r\n vec3 i = floor(v + dot(v, C.yyy));\r\n vec3 x0 = v - i + dot(i, C.xxx);\r\n vec3 g = step(x0.yzx, x0.xyz);\r\n vec3 l = 1.0 - g;\r\n vec3 i1 = min(g.xyz, l.zxy);\r\n vec3 i2 = max(g.xyz, l.zxy);\r\n vec3 x1 = x0 - i1 + C.xxx;\r\n vec3 x2 = x0 - i2 + C.yyy;\r\n vec3 x3 = x0 - D.yyy;\r\n i = mod289(i);\r\n vec4 p = permute(permute(permute(\r\n i.z + vec4(0.0, i1.z, i2.z, 1.0))\r\n + i.y + vec4(0.0, i1.y, i2.y, 1.0))\r\n + i.x + vec4(0.0, i1.x, i2.x, 1.0));\r\n float n_ = 0.142857142857;\r\n vec3 ns = n_ * D.wyz - D.xzx;\r\n vec4 j = p - 49.0 * floor(p * ns.z * ns.z);\r\n vec4 x_ = floor(j * ns.z);\r\n vec4 y_ = floor(j - 7.0 * x_);\r\n vec4 x = x_ * ns.x + ns.yyyy;\r\n vec4 y = y_ * ns.x + ns.yyyy;\r\n vec4 h = 1.0 - abs(x) - abs(y);\r\n vec4 b0 = vec4(x.xy, y.xy);\r\n vec4 b1 = vec4(x.zw, y.zw);\r\n vec4 s0 = floor(b0)*2.0 + 1.0;\r\n vec4 s1 = floor(b1)*2.0 + 1.0;\r\n vec4 sh = -step(h, vec4(0.0));\r\n vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy;\r\n vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww;\r\n vec3 p0 = vec3(a0.xy, h.x);\r\n vec3 p1 = vec3(a0.zw, h.y);\r\n vec3 p2 = vec3(a1.xy, h.z);\r\n vec3 p3 = vec3(a1.zw, h.w);\r\n vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2,p2), dot(p3,p3)));\r\n p0 *= norm.x; p1 *= norm.y; p2 *= norm.z; p3 *= norm.w;\r\n vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\r\n m = m * m;\r\n return 42.0 * dot(m*m, vec4(dot(p0,x0), dot(p1,x1), dot(p2,x2), dot(p3,x3)));\r\n }\r\n float fbm(vec3 p) {\r\n float v = 0.0, a = 0.5;\r\n for (int i = 0; i < 5; i++) {\r\n v += a * snoise(p);\r\n p *= 2.0; a *= 0.5;\r\n }\r\n return v;\r\n }\r\n `\r\n if (preset === 'aurora') {\r\n return common + `\r\n void main() {\r\n vec2 uv = gl_FragCoord.xy / u_resolution;\r\n float t = u_time;\r\n float n1 = fbm(vec3(uv * 2.5 * u_scale, t));\r\n float n2 = fbm(vec3(uv * 4.0 * u_scale + 7.0, t * 1.4));\r\n float n3 = fbm(vec3(uv * 1.2 * u_scale - 3.0, t * 0.7));\r\n float bands = smoothstep(0.15, 0.85, 0.5 + 0.5 * sin((uv.y + n3 * 0.08) * 8.0 + n1 * 1.5));\r\n vec3 c1 = vec3(0.03, 0.08, 0.14);\r\n vec3 c2 = vec3(0.05, 0.28, 0.32);\r\n vec3 c3 = vec3(0.18, 0.62, 0.42);\r\n vec3 c4 = vec3(0.55, 0.22, 0.52);\r\n vec3 c5 = vec3(0.85, 0.35, 0.25);\r\n vec3 col = mix(c1, c2, bands);\r\n col = mix(col, c3, smoothstep(0.25, 0.75, n1));\r\n col = mix(col, c4, smoothstep(0.45, 0.85, n2) * 0.75);\r\n col = mix(col, c5, smoothstep(0.7, 0.95, n2 + n1 * 0.3) * 0.45);\r\n col = hueRotate(col, u_seed * 6.28318530718);\r\n gl_FragColor = vec4(col, 1.0);\r\n }\r\n `\r\n }\r\n if (preset === 'nebula') {\r\n return common + `\r\n void main() {\r\n vec2 uv = gl_FragCoord.xy / u_resolution;\r\n float t = u_time * 0.8;\r\n float n = fbm(vec3(uv * 2.2 * u_scale, t));\r\n float n2 = fbm(vec3(uv * 5.0 * u_scale - 4.0, t * 0.65));\r\n float n3 = fbm(vec3(uv * 0.9 * u_scale + 2.0, t * 0.4));\r\n vec3 c1 = vec3(0.02, 0.02, 0.08);\r\n vec3 c2 = vec3(0.12, 0.04, 0.22);\r\n vec3 c3 = vec3(0.32, 0.10, 0.35);\r\n vec3 c4 = vec3(0.10, 0.18, 0.42);\r\n vec3 c5 = vec3(0.55, 0.30, 0.55);\r\n vec3 col = mix(c1, c2, smoothstep(-0.5, 0.6, n));\r\n col = mix(col, c3, smoothstep(0.15, 0.8, n2) * 0.75);\r\n col = mix(col, c4, smoothstep(0.35, 0.85, n + n3 * 0.3) * 0.55);\r\n col = mix(col, c5, smoothstep(0.6, 0.95, n2) * 0.35);\r\n col = hueRotate(col, u_seed * 6.28318530718);\r\n gl_FragColor = vec4(col, 1.0);\r\n }\r\n `\r\n }\r\n if (preset === 'starfield') {\r\n return common + `\r\n float hash21(vec2 p) {\r\n p = fract(p * vec2(234.34, 435.345));\r\n p += dot(p, p + 34.23);\r\n return fract(p.x * p.y);\r\n }\r\n vec3 starLayer(vec2 uv, float t, float density) {\r\n vec3 col = vec3(0.0);\r\n vec2 grid = uv * density;\r\n vec2 cell = floor(grid);\r\n vec2 f = fract(grid) - 0.5;\r\n float h = hash21(cell);\r\n if (h > 0.8) {\r\n vec2 offs = (vec2(hash21(cell + 1.3), hash21(cell + 2.7)) - 0.5) * 0.7;\r\n float d = length(f - offs);\r\n float tw = 0.35 + 0.65 * sin(t * (1.0 + h * 2.5) + h * 40.0);\r\n col += vec3(0.85, 0.92, 1.0) * smoothstep(0.07, 0.0, d) * max(0.0, tw);\r\n }\r\n return col;\r\n }\r\n void main() {\r\n vec2 uv = gl_FragCoord.xy / u_resolution;\r\n vec2 p = (gl_FragCoord.xy - 0.5 * u_resolution) / u_resolution.y;\r\n float t = u_time * 0.5;\r\n vec3 col = mix(vec3(0.012, 0.014, 0.035), vec3(0.035, 0.035, 0.08), uv.y);\r\n // Faint drifting nebula veil behind the stars.\r\n float n = fbm(vec3(p * 2.2 * u_scale, t * 0.05));\r\n col += vec3(0.05, 0.045, 0.11) * smoothstep(0.05, 0.85, n);\r\n vec3 stars = vec3(0.0);\r\n stars += starLayer(p + vec2(t * 0.006, 0.0), t, 13.0 * u_scale);\r\n stars += starLayer(p * 1.8 + vec2(t * 0.013, 3.0), t * 1.25, 27.0 * u_scale);\r\n stars += starLayer(p * 3.1 + vec2(t * 0.021, 7.0), t * 0.85, 46.0 * u_scale);\r\n col += stars;\r\n col = hueRotate(col, u_seed * 6.28318530718);\r\n gl_FragColor = vec4(col, 1.0);\r\n }\r\n `\r\n }\r\n // noise\r\n return common + `\r\n void main() {\r\n vec2 uv = gl_FragCoord.xy / u_resolution;\r\n float t = u_time;\r\n float n = fbm(vec3(uv * 3.5 * u_scale, t));\r\n float n2 = fbm(vec3(uv * 9.0 * u_scale + 15.0, t * 1.6));\r\n float n3 = fbm(vec3(uv * 1.5 * u_scale - 5.0, t * 0.5));\r\n vec3 c1 = vec3(0.06, 0.06, 0.08);\r\n vec3 c2 = vec3(0.16, 0.18, 0.22);\r\n vec3 c3 = vec3(0.30, 0.32, 0.36);\r\n vec3 c4 = vec3(0.46, 0.48, 0.52);\r\n vec3 col = mix(c1, c2, 0.5 + 0.5 * n + n3 * 0.15);\r\n col = mix(col, c3, smoothstep(0.3, 0.8, n2) * 0.45);\r\n col = mix(col, c4, smoothstep(0.6, 0.95, n2) * 0.25);\r\n col = hueRotate(col, u_seed * 6.28318530718);\r\n gl_FragColor = vec4(col, 1.0);\r\n }\r\n `\r\n}\r\n\r\n// ── Geometric patterns (animated) ─────────────────────────────────────────────\r\nexport function createPatternBg(params: PatternParams, canvas?: HTMLCanvasElement): LiveBgController {\r\n if (params.preset === 'waves') return createWaves(params, canvas)\r\n if (params.preset === 'poly') return createLowPoly(params, canvas)\r\n if (params.preset === 'rain') return createRain(params, canvas)\r\n if (params.preset === 'contour') return createContour(params, canvas)\r\n if (params.preset === 'meta') return createMeta(params, canvas)\r\n return createDots(params, canvas)\r\n}\r\n\r\nfunction createRain(params: PatternParams, canvas?: HTMLCanvasElement): LiveBgController {\r\n const c = canvas ?? createCanvas()\r\n fitLiveCanvas(c)\r\n const g = c.getContext('2d', { alpha: false })!\r\n const rng = createRng(params.seed)\r\n const dark = rng() < 0.5\r\n const hue = Math.round(rng() * 360)\r\n const count = Math.round(30 + params.density * 150)\r\n const drops: { x: number; y: number; len: number; speed: number; sat: number; lit: number; alpha: number; width: number }[] = []\r\n for (let i = 0; i < count; i++) {\r\n drops.push({\r\n x: rng(),\r\n y: rng(),\r\n len: (0.035 + rng() * 0.075) * (0.7 + params.scale * 0.5),\r\n speed: (0.25 + rng() * 0.55) * (0.6 + params.scale * 0.5),\r\n sat: Math.round(30 + rng() * 40),\r\n lit: dark ? Math.round(55 + rng() * 25) : Math.round(40 + rng() * 25),\r\n alpha: 0.12 + rng() * 0.28,\r\n width: 0.8 + rng() * 1.4,\r\n })\r\n }\r\n let t = 0\r\n const draw = () => {\r\n fitLiveCanvas(c)\r\n const w = c.width, h = c.height\r\n g.fillStyle = dark ? '#07080c' : '#f4f6f9'\r\n g.fillRect(0, 0, w, h)\r\n for (const d of drops) {\r\n const yy = (((d.y + t * d.speed) % 1) + 1) % 1\r\n const x = d.x * w\r\n const y0 = yy * h\r\n const y1 = y0 - d.len * h\r\n const grad = g.createLinearGradient(x, y0, x, y1)\r\n grad.addColorStop(0, `hsla(${hue},${d.sat}%,${d.lit}%,${d.alpha.toFixed(2)})`)\r\n grad.addColorStop(1, 'hsla(0,0%,0%,0)')\r\n g.strokeStyle = grad\r\n g.lineWidth = d.width\r\n g.beginPath()\r\n g.moveTo(x, y0)\r\n g.lineTo(x, y1)\r\n g.stroke()\r\n }\r\n t += 0.016\r\n }\r\n return { canvas: c, ...newRaf(c, draw), snapshot: () => c.toDataURL('image/jpeg', 0.94) }\r\n}\r\n\r\nfunction createContour(params: PatternParams, canvas?: HTMLCanvasElement): LiveBgController {\r\n const c = canvas ?? createCanvas()\r\n fitLiveCanvas(c)\r\n const g = c.getContext('2d', { alpha: false })!\r\n const noise = createNoise(params.seed)\r\n const rng = createRng(params.seed + 1013)\r\n const dark = rng() < 0.5\r\n const hue = Math.round(rng() * 360)\r\n const layers = Math.round(16 + params.density * 46)\r\n const freq = 0.0016 / params.scale\r\n const amp = 0.055 * params.scale\r\n let t = 0\r\n const draw = () => {\r\n fitLiveCanvas(c)\r\n const w = c.width, h = c.height\r\n g.fillStyle = dark ? '#0a0b0e' : '#f6f7fa'\r\n g.fillRect(0, 0, w, h)\r\n const samples = Math.max(60, Math.floor(w / 8))\r\n for (let i = 0; i <= layers; i++) {\r\n const base = i / layers\r\n const shift = t * 0.05\r\n g.beginPath()\r\n for (let s = 0; s <= samples; s++) {\r\n const fx = s / samples\r\n const n = noise(fx * 60 * freq * 400, i * 0.22 + shift)\r\n const y = (base + (n - 0.5) * amp) * h\r\n if (s === 0) g.moveTo(0, y)\r\n else g.lineTo(fx * w, y)\r\n }\r\n const lit = dark ? 20 + (i / layers) * 22 : 62 - (i / layers) * 18\r\n g.strokeStyle = `hsla(${(hue + i * 2) % 360},30%,${lit}%,${(0.25 + 0.2 * (i / layers)).toFixed(2)})`\r\n g.lineWidth = 1\r\n g.stroke()\r\n }\r\n t += 0.032\r\n }\r\n return { canvas: c, ...newRaf(c, draw), snapshot: () => c.toDataURL('image/jpeg', 0.94) }\r\n}\r\n\r\nfunction createMeta(params: PatternParams, canvas?: HTMLCanvasElement): LiveBgController {\r\n const c = canvas ?? createCanvas()\r\n fitLiveCanvas(c)\r\n const g = c.getContext('2d', { alpha: false })!\r\n const rng = createRng(params.seed)\r\n const dark = rng() < 0.5\r\n const baseHue = Math.round(rng() * 360)\r\n const count = Math.round(5 + params.density * 11)\r\n const blobs: { x: number; y: number; r: number; ax: number; ay: number; speed: number; phase: number; hue: number }[] = []\r\n for (let i = 0; i < count; i++) {\r\n blobs.push({\r\n x: 0.15 + rng() * 0.7, y: 0.15 + rng() * 0.7,\r\n r: (0.09 + rng() * 0.14) * params.scale,\r\n ax: 0.08 + rng() * 0.22, ay: 0.08 + rng() * 0.22,\r\n speed: 0.15 + rng() * 0.3,\r\n phase: rng() * Math.PI * 2,\r\n hue: (baseHue + rng() * 70) % 360,\r\n })\r\n }\r\n let t = 0\r\n const draw = () => {\r\n fitLiveCanvas(c)\r\n const w = c.width, h = c.height\r\n g.fillStyle = dark ? '#08090d' : '#f5f6f9'\r\n g.fillRect(0, 0, w, h)\r\n g.globalCompositeOperation = dark ? 'lighter' : 'multiply'\r\n for (const b of blobs) {\r\n const cx = (b.x + Math.sin(t * b.speed + b.phase) * b.ax) * w\r\n const cy = (b.y + Math.cos(t * b.speed * 0.83 + b.phase * 1.7) * b.ay) * h\r\n const r = b.r * Math.min(w, h) * (0.9 + 0.2 * Math.sin(t * b.speed + b.phase))\r\n const rad = g.createRadialGradient(cx, cy, 0, cx, cy, r)\r\n if (dark) {\r\n rad.addColorStop(0, `hsla(${b.hue},65%,58%,0.55)`)\r\n rad.addColorStop(0.7, `hsla(${b.hue},60%,45%,0.18)`)\r\n rad.addColorStop(1, 'hsla(0,0%,0%,0)')\r\n } else {\r\n rad.addColorStop(0, `hsla(${b.hue},55%,70%,0.5)`)\r\n rad.addColorStop(0.7, `hsla(${b.hue},50%,80%,0.2)`)\r\n rad.addColorStop(1, 'hsla(0,0%,100%,0)')\r\n }\r\n g.fillStyle = rad\r\n g.beginPath()\r\n g.arc(cx, cy, r, 0, Math.PI * 2)\r\n g.fill()\r\n }\r\n g.globalCompositeOperation = 'source-over'\r\n t += 0.03\r\n }\r\n return { canvas: c, ...newRaf(c, draw), snapshot: () => c.toDataURL('image/jpeg', 0.94) }\r\n}\r\n\r\nfunction createDots(params: PatternParams, canvas?: HTMLCanvasElement): LiveBgController {\r\n const c = canvas ?? createCanvas()\r\n fitLiveCanvas(c)\r\n const g = c.getContext('2d', { alpha: false })!\r\n const rng = createRng(params.seed)\r\n const dark = rng() < 0.5\r\n const baseHue = Math.round(rng() * 360)\r\n const spacing = Math.max(26, 150 * params.scale / (0.25 + params.density))\r\n const dots: { cx: number; cy: number; r: number; hue: number; sat: number; lit: number; phase: number; speed: number }[] = []\r\n for (let y = 0; y < 8; y++) {\r\n for (let x = 0; x < 8; x++) {\r\n dots.push({\r\n cx: x / 7, cy: y / 7,\r\n r: spacing * 0.16 * params.scale * (0.6 + rng() * 0.7),\r\n hue: (baseHue + rng() * 80) % 360,\r\n sat: Math.round(35 + rng() * 55),\r\n lit: dark ? Math.round(30 + rng() * 35) : Math.round(55 + rng() * 30),\r\n phase: rng() * Math.PI * 2,\r\n speed: 0.5 + rng() * 1.2,\r\n })\r\n }\r\n }\r\n let t = 0\r\n const draw = () => {\r\n fitLiveCanvas(c)\r\n const w = c.width, h = c.height\r\n g.fillStyle = dark ? '#0a0b0d' : '#f6f7f9'\r\n g.fillRect(0, 0, w, h)\r\n for (const d of dots) {\r\n const pulse = 0.75 + 0.35 * Math.sin(t * d.speed + d.phase)\r\n const r = Math.max(1, d.r * pulse)\r\n const x = d.cx * w + (d.r * 0.3) * Math.sin(t * d.speed * 0.5 + d.phase)\r\n const y = d.cy * h + (d.r * 0.3) * Math.cos(t * d.speed * 0.7 + d.phase)\r\n g.beginPath()\r\n g.arc(x, y, r, 0, Math.PI * 2)\r\n g.fillStyle = `hsla(${d.hue},${d.sat}%,${d.lit}%,${(0.18 + 0.25 * pulse).toFixed(2)})`\r\n g.fill()\r\n }\r\n t += 0.032\r\n }\r\n return { canvas: c, ...newRaf(c, draw), snapshot: () => c.toDataURL('image/jpeg', 0.94) }\r\n}\r\n\r\nfunction createWaves(params: PatternParams, canvas?: HTMLCanvasElement): LiveBgController {\r\n const c = canvas ?? createCanvas()\r\n fitLiveCanvas(c)\r\n const g = c.getContext('2d', { alpha: false })!\r\n const rng = createRng(params.seed)\r\n const dark = rng() < 0.5\r\n const hue = Math.round(rng() * 360)\r\n const layers = Math.round(5 + params.density * 8)\r\n const waves: { yBase: number; amp: number; freq: number; phase: number; speed: number; hue: number; sat: number; lit: number; alpha: number }[] = []\r\n for (let i = 0; i < layers; i++) {\r\n waves.push({\r\n yBase: 0.25 + (i / layers) * 0.55,\r\n amp: (25 + rng() * 45) * params.scale,\r\n freq: (0.006 + rng() * 0.01) / params.scale,\r\n phase: rng() * Math.PI * 2,\r\n speed: (0.3 + rng() * 0.7) * (rng() < 0.5 ? 1 : -1),\r\n hue: (hue + i * 12) % 360,\r\n sat: Math.round(40 + rng() * 45),\r\n lit: dark ? Math.round(14 + (i / layers) * 32) : Math.round(72 - (i / layers) * 28),\r\n alpha: 0.22 + rng() * 0.32,\r\n })\r\n }\r\n let t = 0\r\n const draw = () => {\r\n fitLiveCanvas(c)\r\n const w = c.width, h = c.height\r\n g.fillStyle = dark ? '#07080a' : '#f8f9fb'\r\n g.fillRect(0, 0, w, h)\r\n for (const wave of waves) {\r\n g.beginPath()\r\n g.moveTo(0, h)\r\n for (let x = 0; x <= w; x += Math.max(6, Math.floor(w / 180))) {\r\n const y = h * wave.yBase\r\n + Math.sin(x * wave.freq + wave.phase + t * wave.speed) * wave.amp\r\n + Math.sin(x * wave.freq * 2.1 + wave.phase * 1.3 - t * wave.speed * 1.5) * wave.amp * 0.5\r\n g.lineTo(x, y)\r\n }\r\n g.lineTo(w, h)\r\n g.closePath()\r\n g.fillStyle = `hsla(${wave.hue},${wave.sat}%,${wave.lit}%,${wave.alpha.toFixed(2)})`\r\n g.fill()\r\n }\r\n t += 0.032\r\n }\r\n return { canvas: c, ...newRaf(c, draw), snapshot: () => c.toDataURL('image/jpeg', 0.94) }\r\n}\r\n\r\nfunction createLowPoly(params: PatternParams, canvas?: HTMLCanvasElement): LiveBgController {\r\n const c = canvas ?? createCanvas()\r\n fitLiveCanvas(c)\r\n const g = c.getContext('2d', { alpha: false })!\r\n const rng = createRng(params.seed)\r\n const dark = rng() < 0.5\r\n const hue = Math.round(rng() * 360)\r\n const cols = Math.round(10 + params.density * 20)\r\n const rows = Math.max(6, Math.round(cols * 0.65))\r\n const points: { x: number; y: number; dx: number; dy: number; speed: number }[][] = []\r\n for (let y = 0; y <= rows; y++) {\r\n const row: { x: number; y: number; dx: number; dy: number; speed: number }[] = []\r\n for (let x = 0; x <= cols; x++) {\r\n row.push({\r\n x: x / cols, y: y / rows,\r\n dx: (rng() - 0.5) * 0.02, dy: (rng() - 0.5) * 0.02,\r\n speed: 0.3 + rng() * 0.5,\r\n })\r\n }\r\n points.push(row)\r\n }\r\n const cells: { y: number; x: number; hue: number; sat: number; lit: number; phase: number }[] = []\r\n for (let y = 0; y < rows; y++) {\r\n for (let x = 0; x < cols; x++) {\r\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 })\r\n }\r\n }\r\n let t = 0\r\n const px: { x: number; y: number }[][] = points.map(row => row.map(() => ({ x: 0, y: 0 })))\r\n const draw = () => {\r\n fitLiveCanvas(c)\r\n const w = c.width, h = c.height\r\n g.fillStyle = dark ? '#08090c' : '#f5f6f8'\r\n g.fillRect(0, 0, w, h)\r\n for (let y = 0; y <= rows; y++) {\r\n const row = points[y]!\r\n const out = px[y]!\r\n for (let x = 0; x <= cols; x++) {\r\n const p = row[x]!\r\n out[x]!.x = (p.x + Math.sin(t * p.speed + p.dx * 100) * p.dx) * w\r\n out[x]!.y = (p.y + Math.cos(t * p.speed + p.dy * 100) * p.dy) * h\r\n }\r\n }\r\n for (const cell of cells) {\r\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]!\r\n const cx = (p1.x + p2.x + p3.x) / 3 / w\r\n const lit = Math.max(0, Math.min(100, cell.lit + Math.sin(t * 0.6 + cell.phase) * 6))\r\n g.beginPath(); g.moveTo(p1.x, p1.y); g.lineTo(p2.x, p2.y); g.lineTo(p3.x, p3.y); g.closePath()\r\n g.fillStyle = `hsla(${cell.hue + cx * 40},${cell.sat}%,${lit}%,0.92)`\r\n g.fill()\r\n g.beginPath(); g.moveTo(p2.x, p2.y); g.lineTo(p4.x, p4.y); g.lineTo(p3.x, p3.y); g.closePath()\r\n g.fillStyle = `hsla(${(cell.hue + cx * 40 + 12) % 360},${cell.sat}%,${Math.max(0, lit - 4)}%,0.92)`\r\n g.fill()\r\n }\r\n t += 0.03\r\n }\r\n return { canvas: c, ...newRaf(c, draw), snapshot: () => c.toDataURL('image/jpeg', 0.94) }\r\n}\r\n\r\n// ── Dispatcher ────────────────────────────────────────────────────────────────\r\nexport function createDynamicBackground(params: GeneratedBgParams, canvas?: HTMLCanvasElement): LiveBgController {\r\n if (params.type === 'mesh') return createMeshGradient(params, canvas)\r\n if (params.type === 'shader') return createShaderBg(params, canvas)\r\n return createPatternBg(params, canvas)\r\n}\r\n\r\nfunction randomSeed(): number {\r\n return Math.floor(Math.random() * 0x7fffffff)\r\n}\r\n\r\n/** Build default params for a newly selected background type. */\r\nexport function defaultParamsFor(type: Exclude<GeneratedBgParams['type'], 'image'>): GeneratedBgParams {\r\n if (type === 'mesh') return { type: 'mesh', seed: randomSeed(), scale: 1.1, intensity: 0.65 }\r\n if (type === 'shader') return { type: 'shader', preset: 'aurora', speed: 0.35, scale: 1, seed: randomSeed() }\r\n return { type: 'pattern', preset: 'dots', density: 0.5, scale: 1, seed: randomSeed() }\r\n}\r\n","import { rWp, rWpImage, rWpVideo, rBgState, rVideoBgState, rBl, rWop, rOps, rSop, rColor, rHasColor, rBlurs, rBgMode, rChatTextOpacity, rTrajectoryOpacity, rScheme, rColorScheme, rSchemeOverride, cfg, setWpUrl, rBgDark, setBgDark, disposeVideoObjectUrl } from './state'\r\nimport type { BackgroundType, GeneratedBgParams, PartOpacities, PartBlurs } from './types'\r\nimport { genTokens, toRgba, extractWallpaperColor, analyzeFrameDark } from './utils/color'\r\nimport { loadImage } from './utils/image'\r\nimport { createDynamicBackground, defaultParamsFor } from './utils/bg-generators'\r\n\r\nlet wpEl: HTMLDivElement | null = null\r\nlet videoEl: HTMLVideoElement | null = null\r\nlet appliedTokenNames: string[] = []\r\nlet wpController: { canvas: HTMLCanvasElement; stop: () => void; pause?: () => void; resume?: () => void; snapshot: () => string } | null = null\r\nlet snapshotListener: (() => void) | null = null\r\nlet tokenStyleEl: HTMLStyleElement | null = null\r\n\r\n/** Pause the live generated background's animation loop (session-only). */\r\nexport function pauseGeneratedBg(): void { wpController?.pause?.() }\r\n\r\n/** Resume the live generated background's animation loop. */\r\nexport function resumeGeneratedBg(): void { wpController?.resume?.() }\r\n\r\nfunction clearDynamicBg(): void {\r\n wpController?.stop()\r\n wpController?.canvas.remove()\r\n wpController = null\r\n}\r\n\r\n/** Register a callback fired once a generated snapshot is ready (so the caller\r\n * can re-sync the settings preview / store). */\r\nexport function onGeneratedSnapshot(cb: () => void): void {\r\n snapshotListener = cb\r\n}\r\n\r\nfunction ensureTokenStyle(): HTMLStyleElement {\r\n if (tokenStyleEl?.isConnected) return tokenStyleEl\r\n tokenStyleEl = document.createElement('style')\r\n tokenStyleEl.dataset.plugin = 'dsh-any-background-tokens'\r\n document.head.appendChild(tokenStyleEl)\r\n return tokenStyleEl\r\n}\r\n\r\nfunction clearCustomTokens(): void {\r\n if (tokenStyleEl) tokenStyleEl.textContent = ''\r\n for (const name of appliedTokenNames) document.body.style.removeProperty(name)\r\n appliedTokenNames = []\r\n}\r\n\r\n/** Drop every applied custom token and forget the token fingerprint, so a\r\n * later color-less profile (system theme) leaves no stale rule behind. */\r\nexport function clearThemeTokens(): void {\r\n clearCustomTokens()\r\n baseTokenKey = ''\r\n lastBgKey = ''\r\n document.body.removeAttribute('data-ds-dark-theme')\r\n document.body.style.removeProperty('color-scheme')\r\n}\r\n\r\n/** Label tokens flipped by the background brightness verdict. The faint tiers\r\n * (caption/dimmed) are deliberately NOT flipped: they back placeholder/hint\r\n * text, which must stay visibly weaker than real input even when the wallpaper\r\n * brightness flips the main label direction. Exported so the skin registration\r\n * (index) can flip fonts through the host theme service too. */\r\nexport const LABEL_TOKENS = [\r\n '--dsw-alias-label-primary',\r\n '--dsw-alias-label-secondary',\r\n '--dsw-alias-label-tertiary',\r\n]\r\n\r\n// Solid surface tokens grouped by which interface-opacity slider owns them.\r\n// Every member is re-emitted with per-part alpha so surfaces over the wallpaper\r\n// (composer input, elevated buttons, menu panels) can go translucent — not just\r\n// the layered bg/sidebar tokens. --dsw-specific-menu (dropdowns, slash-trigger\r\n// menu, model selector, popovers around the dialog) is owned by the card\r\n// slider; the Cordis panel shares that token but is re-scoped to the input\r\n// slider via INPUT_BLUR_RULE.\r\nconst OPACITY_TOKEN_GROUPS: Array<{ part: keyof PartOpacities; names: string[] }> = [\r\n { part: 'bg', names: ['--dsw-alias-bg-base'] },\r\n { part: 'sidebar', names: ['--dsw-specific-sidebar-fill'] },\r\n { part: 'card', names: ['--dsw-alias-bg-layer-1', '--dsw-alias-bg-layer-2', '--dsw-alias-bg-layer-3', '--dsw-specific-menu'] },\r\n { part: 'input', names: ['--dsw-specific-input-major'] },\r\n]\r\n\r\n// Plugin-owned variables the opacity-bearing tokens read from. They live as\r\n// inline custom props on <html>, so a slider drag rewrites only those few values\r\n// instead of re-parsing/re-matching the whole body token rule on every tick —\r\n// the difference is critical when a large wallpaper sits under the interface.\r\nconst OPACITY_VARS: Record<string, string> = {\r\n '--dsw-alias-bg-base': '--dsh-any-op-bg',\r\n '--dsw-specific-sidebar-fill': '--dsh-any-op-sidebar',\r\n '--dsw-alias-bg-layer-1': '--dsh-any-op-card-1',\r\n '--dsw-alias-bg-layer-2': '--dsh-any-op-card-2',\r\n '--dsw-alias-bg-layer-3': '--dsh-any-op-card-3',\r\n '--dsw-specific-input-major': '--dsh-any-op-input',\r\n '--dsw-specific-menu': '--dsh-any-op-menu',\r\n}\r\n\r\n// Fingerprint of the non-alpha token base (color pick + brightness verdict).\r\n// The static body rule is only rebuilt when it changes; a drag never touches it.\r\nlet baseTokenKey = ''\r\n\r\n// Coalesce slider-driven token updates to one rAF: a single drag fires several\r\n// input events per frame, and every full re-apply repaints expensive regions\r\n// over a large wallpaper. Batching keeps at most one update per frame. The\r\n// base-fingerprint gate above already makes a muted drag cheap; this prevents\r\n// repeated identical reapplies from stacking within the same frame.\r\nlet pendingOps: PartOpacities | null = null\r\nlet tokensRaf: number | null = null\r\n\r\nexport function applyCustomTokens(ops: PartOpacities): void {\r\n pendingOps = ops\r\n if (tokensRaf !== null) return\r\n tokensRaf = requestAnimationFrame(() => {\r\n tokensRaf = null\r\n if (pendingOps === null) return\r\n const o = pendingOps\r\n pendingOps = null\r\n applyCustomTokensNow(o)\r\n })\r\n}\r\n\r\n// Only the main-bg slider retints the center/details columns; keys on\r\n// baseTokenKey + ops.bg so a sidebar/card/input drag never rewrites them.\r\nlet lastBgKey = ''\r\n\r\n/** Palette source for the token rule: the picked color; a forced scheme\r\n * without a picked color builds a neutral near-gray palette in that\r\n * direction; auto without a color keeps the host's own palette (null — only\r\n * the label direction gets asserted). The palette direction follows the\r\n * color's own lightness (rColorScheme), not the wallpaper verdict, so the\r\n * surfaces keep contrasting with the fonts. */\r\nfunction paletteTokens(): Record<string, string> | null {\r\n const scheme = rColorScheme()\r\n if (rHasColor()) {\r\n const [h, s, l] = rColor()\r\n return genTokens(h, s, l, scheme).tokens\r\n }\r\n if (rSchemeOverride() !== 'auto') {\r\n return genTokens(220, 0.04, scheme === 'dark' ? 0.14 : 0.92, scheme).tokens\r\n }\r\n return null\r\n}\r\n\r\nfunction applyCustomTokensNow(ops: PartOpacities): void {\r\n const hasColor = rHasColor()\r\n const override = rSchemeOverride()\r\n const [h, s, l] = rColor()\r\n const scheme = rScheme()\r\n const verdict = rBgDark()\r\n const palette = paletteTokens()\r\n // Clone: the verdict below mutates, and genTokens' result is cached/shared.\r\n const tokens: Record<string, string> = { ...palette }\r\n // Font direction while the scheme is automatic: a picked color owns it —\r\n // its palette direction (rColorScheme) keeps the labels contrasted with the\r\n // surfaces they sit on, so a very dark pick flips to white fonts even over\r\n // a light wallpaper (and vice versa). Without a pick the wallpaper\r\n // brightness verdict decides: the text then sits directly on the wallpaper.\r\n if (override === 'auto') {\r\n const fontDark = hasColor ? rColorScheme() === 'dark' : verdict\r\n if (fontDark !== null && fontDark !== undefined) {\r\n const font = fontDark ? '#fff' : '#000'\r\n for (const name of LABEL_TOKENS) tokens[name] = font\r\n }\r\n }\r\n try {\r\n const forceDark = scheme === 'dark'\r\n const key = `${h}|${s}|${l}|${verdict}|${scheme}|${hasColor}`\r\n if (key !== baseTokenKey) {\r\n baseTokenKey = key\r\n // Drive the base-palette switch with a plugin-specific value so the\r\n // gradient rule never matches a host dark-mode flag; color-scheme makes\r\n // native controls (select popups) follow the forced palette. Both ride the\r\n // stylesheet (not inline styles) so the host presenter clearing body\r\n // inline styles on boot can't drop them, and the !important rule survives\r\n // that clearing too.\r\n if (forceDark) document.body.setAttribute('data-ds-dark-theme', 'dsh-any-background')\r\n else document.body.removeAttribute('data-ds-dark-theme')\r\n const decls: string[] = [`color-scheme:${forceDark ? 'dark' : 'light'}`]\r\n for (const [name, value] of Object.entries(tokens)) {\r\n const opVar = OPACITY_VARS[name]\r\n decls.push(`${name}:${opVar !== undefined ? `var(${opVar})` : value}!important`)\r\n }\r\n ensureTokenStyle().textContent = `body{${decls.join(';')}}`\r\n // Drop inline tokens left by earlier builds so the stylesheet is the single source of truth.\r\n for (const name of appliedTokenNames) document.body.style.removeProperty(name)\r\n appliedTokenNames = Object.keys(tokens)\r\n }\r\n // Without a palette there are no surface alphas to re-emit — the host\r\n // palette stays untouched and only the label direction was asserted.\r\n if (palette === null) return\r\n // Cheap per-drag update: only the surface alpha vars move on <html>.\r\n const root = document.documentElement\r\n for (const g of OPACITY_TOKEN_GROUPS) {\r\n for (const name of g.names) {\r\n root.style.setProperty(OPACITY_VARS[name], toRgba(tokens[name] ?? '#000', ops[g.part]))\r\n }\r\n }\r\n // The Cordis panel keeps its own input-slider alpha (see INPUT_BLUR_RULE).\r\n root.style.setProperty('--dsh-any-op-menu-cordis', toRgba(tokens['--dsw-specific-menu'] ?? '#000', ops.input))\r\n const bgKey = `${baseTokenKey}|${ops.bg}`\r\n if (bgKey !== lastBgKey) { lastBgKey = bgKey; applyPartOpacities(ops) }\r\n } catch {\r\n // ignore\r\n }\r\n}\r\n\r\n// ── Settings panel opacity ─────────────────────────────────────────────────────\r\n// The settings modal is the only aria-modal dialog identifying itself with\r\n// aria-labelledby, so this selector scopes translucency to the settings panel.\r\n// The surface (--dsw-alias-bg-layer-2) is re-emitted with an alpha through a\r\n// plugin-owned variable so the panel keeps its color while fading.\r\n\r\nconst SETTINGS_PANEL_SEL = '[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby]'\r\nexport const SETTINGS_STYLE_RULE =\r\n `${SETTINGS_PANEL_SEL}{` +\r\n `background:var(--dsh-any-bg-settings-surface,var(--dsw-alias-bg-layer-2));` +\r\n `backdrop-filter:var(--dsh-any-blur-settings,none);` +\r\n // Re-scope the dialog's layer tokens to plugin-owned variables so every\r\n // surface inside the dialog follows the settings opacity slider only.\r\n `--dsw-alias-bg-layer-1:var(--dsh-any-bg-settings-layer-1);` +\r\n `--dsw-alias-bg-layer-2:var(--dsh-any-bg-settings-layer-2);` +\r\n `--dsw-alias-bg-layer-3:var(--dsh-any-bg-settings-layer-3)}` +\r\n // Option-panel blur inside the dialog, owned by the card blur slider.\r\n `${SETTINGS_PANEL_SEL} .dab-card{backdrop-filter:var(--dsh-any-blur-card-panels,none);-webkit-backdrop-filter:var(--dsh-any-blur-card-panels,none)}`\r\n\r\n// Input/control surface blur. The composer card and the Cordis panel expose\r\n// stable host data attributes ([data-composer-card], [data-cordis-panel]), so\r\n// the backdrop is attached via a stylesheet rule rather than element discovery.\r\n// The Cordis panel shares the --dsw-specific-menu token with the dialog's\r\n// option boxes, but it stays owned by the input slider — the re-scope below\r\n// keeps it there now that the menu token itself follows the card slider. Note\r\n// the input slider must NOT drive the button-elevated-fill /\r\n// button-floating-hover tokens: the settings panel's own controls (slider\r\n// thumbs, .dab-btn, segmented thumb) are painted from those same tokens, so\r\n// tinting them would bleach the panel's own UI.\r\nexport const INPUT_BLUR_RULE =\r\n '[data-composer-card],[data-cordis-panel]{' +\r\n '-webkit-backdrop-filter:var(--dsh-any-input-blur,none);' +\r\n 'backdrop-filter:var(--dsh-any-input-blur,none)}' +\r\n '[data-cordis-panel]{--dsw-specific-menu:var(--dsh-any-op-menu-cordis)!important}'\r\n\r\nfunction applyInputBlur(px: number): void {\r\n if (px > 0) document.documentElement.style.setProperty('--dsh-any-input-blur', `blur(${px}px)`)\r\n else document.documentElement.style.removeProperty('--dsh-any-input-blur')\r\n}\r\n\r\n// Narrow-viewport hosts render a fixed session-title bar (.dsh-mobile-app-header)\r\n// above the AppFrame columns, outside every column's subtree. The main-bg alpha\r\n// lives on the columns (applyPartOpacities), so that bar paints the raw\r\n// wallpaper and splits visually from the translucent center column. Both rules\r\n// below ride plugin-owned variables so the bar follows the sliders and falls\r\n// back to the host default when the plugin never set them.\r\nexport const MOBILE_HEADER_RULE =\r\n '.dsh-mobile-app-header{' +\r\n 'background:var(--dsh-any-op-bg,transparent)!important;' +\r\n 'backdrop-filter:var(--dsh-any-part-blur-global,none);' +\r\n '-webkit-backdrop-filter:var(--dsh-any-part-blur-global,none)}'\r\n\r\n/** Mirror of the bg-part blur on :root. --dsh-any-part-blur is element-scoped\r\n * to the columns, so surfaces outside their subtree (the mobile header, or\r\n * third-party styles) can never inherit it. */\r\nfunction applyBgBlurGlobal(px: number): void {\r\n if (px > 0) document.documentElement.style.setProperty('--dsh-any-part-blur-global', `blur(${px}px)`)\r\n else document.documentElement.style.removeProperty('--dsh-any-part-blur-global')\r\n}\r\n\r\n// Placeholder/hint text inside the composer and the plugin's own input\r\n// surfaces: rendered with the weak caption token (distinct from real input)\r\n// plus italic, so an empty box is never mistaken for typed content. Written\r\n// as a rule so it also covers placeholder text colored by the host's text tier.\r\nexport const PLACEHOLDER_RULE =\r\n '[data-composer-card] textarea::placeholder,' +\r\n '[data-composer-card] input::placeholder,' +\r\n '[data-composer-card] [contenteditable]::placeholder,' +\r\n '[data-cordis-panel] input::placeholder,' +\r\n '[data-cordis-panel] textarea::placeholder,' +\r\n '.dab-input::placeholder,' +\r\n '.dab-input textarea::placeholder,' +\r\n '.dab-input input::placeholder' +\r\n '{color:var(--dsh-any-placeholder,var(--dsw-alias-label-caption,#8a8f98))!important;font-style:italic;opacity:.85}'\r\n\r\nexport function applySettingsOverrides(op: number): void {\r\n // Always written explicitly (including 100%) — removing them would make\r\n // SETTINGS_STYLE_RULE fall back to the body layer tokens that\r\n // applyCustomTokens rewrites with the homepage card alpha.\r\n const [h, s, l] = rColor()\r\n const tokens = genTokens(h, s, l, rColorScheme()).tokens\r\n const layer1 = tokens['--dsw-alias-bg-layer-1']\r\n const layer2 = tokens['--dsw-alias-bg-layer-2']\r\n const layer3 = tokens['--dsw-alias-bg-layer-3']\r\n if (layer2 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-bg-settings-surface', toRgba(layer2, op))\r\n }\r\n // Dialog-scoped layer overrides consumed by SETTINGS_STYLE_RULE; opacity\r\n // follows the settings slider only (the card slider reaches panels via blur).\r\n if (layer1 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-bg-settings-layer-1', toRgba(layer1, op))\r\n }\r\n if (layer2 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-bg-settings-layer-2', toRgba(layer2, op))\r\n }\r\n if (layer3 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-bg-settings-layer-3', toRgba(layer3, op))\r\n }\r\n}\r\n\r\n// ── Trajectory view opacity ──────────────────────────────────────────────\r\n// The trajectory view's own panels fully cover the root, so retinting only the\r\n// root background is invisible. Re-scope the view root's layer tokens to\r\n// plugin-owned variables so every surface follows the trajectory slider.\r\nexport const TRAJECTORY_STYLE_RULE =\r\n '[data-conversation-composer-overlay]{' +\r\n // No fallback inside var(): a self-referential fallback would be a cycle.\r\n '--dsw-alias-bg-layer-1:var(--dsh-any-traj-layer-1);' +\r\n '--dsw-alias-bg-layer-2:var(--dsh-any-traj-layer-2);' +\r\n '--dsw-alias-bg-layer-3:var(--dsh-any-traj-layer-3)}'\r\n\r\nexport function applyTrajectoryOverrides(op: number): void {\r\n // Always written explicitly so the view stays owned by this slider at 100%.\r\n const [h, s, l] = rColor()\r\n const tokens = genTokens(h, s, l, rColorScheme()).tokens\r\n const layer1 = tokens['--dsw-alias-bg-layer-1']\r\n const layer2 = tokens['--dsw-alias-bg-layer-2']\r\n const layer3 = tokens['--dsw-alias-bg-layer-3']\r\n if (layer1 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-traj-layer-1', toRgba(layer1, op))\r\n }\r\n if (layer2 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-traj-layer-2', toRgba(layer2, op))\r\n }\r\n if (layer3 !== undefined) {\r\n document.documentElement.style.setProperty('--dsh-any-traj-layer-3', toRgba(layer3, op))\r\n }\r\n}\r\n\r\n/** Register a callback fired when a wallpaper-extracted theme color is\r\n * adopted by the auto-adaptation path, so the section can re-register the\r\n * host skin, sync the editor UI and persist the pick (wallpaper.ts cannot\r\n * do those itself — they live in the section). */\r\nlet colorAdoptedListener: ((hsl: [number, number, number]) => void) | null = null\r\nexport function onColorAdopted(cb: (hsl: [number, number, number]) => void): void { colorAdoptedListener = cb }\r\n\r\n/** Apply the theme color: use the saved pick directly, or fall back to\r\n * extracting a dominant color from the current wallpaper. */\r\nexport function applyThemeColor(): void {\r\n if (rHasColor()) {\r\n applyWp()\r\n return\r\n }\r\n const url = rWp()\r\n if (url) {\r\n // Paint the wallpaper immediately — the palette extract decodes the full\r\n // image and would otherwise leave the host's blank background on screen\r\n // for the whole decode. The verdict/skin settle a beat later on re-apply.\r\n applyWp()\r\n // Video mode samples the frame snapshot through the video's own placement\r\n // state; the image slot's framing does not apply to the snapshot.\r\n const st = cfg.backgroundType === 'video' ? rVideoBgState() : rBgState()\r\n void extractWallpaperColor(url, st).then(hsl => {\r\n // A swap during the decode (upload / rotation) points every URL-keyed\r\n // cache at the new picture; only adopt the color when this wallpaper is\r\n // still the active one.\r\n if (hsl && rWp() === url) {\r\n cfg.color = hsl\r\n // The listener runs before applyWp so the freshly registered skin and\r\n // the token pass below describe the same color.\r\n colorAdoptedListener?.(hsl)\r\n }\r\n applyWp()\r\n })\r\n } else {\r\n applyWp()\r\n }\r\n}\r\n\r\n/** Switch the background source type. For generated types a new live canvas is\r\n * attached to the wallpaper layer and a snapshot is kept for the store/preview. */\r\nexport function setBackgroundType(type: BackgroundType): void {\r\n cfg.backgroundType = type\r\n if (type === 'image') {\r\n // Restore the retained image upload and drop the generated brightness verdict.\r\n clearDynamicBg()\r\n setBgDark(null)\r\n setWpUrl(rWpImage())\r\n applyThemeColor()\r\n return\r\n }\r\n if (type === 'video') {\r\n // Restore the retained video upload; the frame snapshot stays the preview URL.\r\n clearDynamicBg()\r\n setBgDark(null)\r\n setWpUrl(null)\r\n applyThemeColor()\r\n return\r\n }\r\n // Keep existing params for this generated type so sub-type switches preserve adjustments.\r\n if (!cfg.generatedBg || cfg.generatedBg.type !== type) {\r\n cfg.generatedBg = defaultParamsFor(type)\r\n }\r\n applyGeneratedBg(cfg.generatedBg)\r\n}\r\n\r\nfunction randomSeed(): number {\r\n return Math.floor(Math.random() * 0x7fffffff)\r\n}\r\n\r\n/** Regenerate the current generated background with a new visual seed while\r\n * preserving the user's scale/intensity/speed/density/preset choices. */\r\nexport function regenerateGeneratedBg(): void {\r\n const params = cfg.generatedBg\r\n if (!params || cfg.backgroundType === 'image') return\r\n cfg.generatedBg = { ...params, seed: randomSeed() }\r\n applyGeneratedBg(cfg.generatedBg)\r\n}\r\n\r\n/** Update a generated background's parameters and re-render. */\r\nexport function updateGeneratedBg(params: GeneratedBgParams): void {\r\n cfg.backgroundType = params.type\r\n cfg.generatedBg = params\r\n applyGeneratedBg(params)\r\n}\r\n\r\nfunction applyGeneratedBg(params: GeneratedBgParams): void {\r\n clearDynamicBg()\r\n clearVideoEl()\r\n ensureWpContainer()\r\n wpController = createDynamicBackground(params)\r\n if (wpEl) {\r\n wpEl.style.backgroundImage = 'none'\r\n wpEl.appendChild(wpController.canvas)\r\n }\r\n // The canvas paints its first frame on the next animation tick; only then is\r\n // the snapshot meaningful. Do NOT refresh the palette here — generated\r\n // backgrounds must not overwrite the user's picked theme color.\r\n requestAnimationFrame(() => {\r\n if (!wpController) return\r\n const controller = wpController\r\n const frame = controller.snapshot()\r\n setWpUrl(frame)\r\n applyWp()\r\n snapshotListener?.()\r\n // One-shot brightness verdict from the captured frame to flip font\r\n // direction; never runs in the animation loop.\r\n setBgDark(null)\r\n void analyzeFrameDark(frame).then(dark => {\r\n if (dark === null || wpController !== controller) return\r\n applyVerdict(dark)\r\n applyCustomTokens(rOps())\r\n })\r\n })\r\n}\r\n\r\n// ── Per-part interface blur ───────────────────────────────────────────────────\r\n// The AppFrame columns use hashed CSS-module classes, so parts are located\r\n// structurally: the shell overlay carries a stable data attribute and the\r\n// sidebar/center/details columns are its three preceding siblings.\r\n//\r\n// backdrop-filter must NEVER go directly on a host part: it turns the element\r\n// into a containing block for fixed-positioned descendants, which would trap\r\n// the host's settings dialog inside the column. Each blurred part carries an\r\n// isolated ::before underlay holding the backdrop-filter instead.\r\nlet frameEl: HTMLElement | null = null\r\nlet sidebarEl: HTMLElement | null = null\r\nlet centerEl: HTMLElement | null = null\r\nlet detailsEl: HTMLElement | null = null\r\n\r\nconst PART_BLUR_CLASS = 'dab-part-blur'\r\nconst PART_UNDERLAY_CLASS = 'dab-part-underlay'\r\nconst PART_BLUR_RULE =\r\n `${PART_BLUR_CLASS}{isolation:isolate}` +\r\n `.${PART_UNDERLAY_CLASS}{position:absolute;inset:0;z-index:-1;pointer-events:none;border-radius:inherit;` +\r\n `backdrop-filter:var(--dsh-any-part-blur,none);-webkit-backdrop-filter:var(--dsh-any-part-blur,none)}`\r\n\r\nlet partBlurStyleEl: HTMLStyleElement | null = null\r\n\r\nfunction ensurePartBlurStyle(): void {\r\n if (partBlurStyleEl?.isConnected) return\r\n partBlurStyleEl = document.createElement('style')\r\n partBlurStyleEl.dataset.plugin = 'dsh-any-background-parts'\r\n partBlurStyleEl.textContent = PART_BLUR_RULE\r\n document.head.appendChild(partBlurStyleEl)\r\n}\r\n\r\nfunction discoverParts(): void {\r\n const overlay = document.querySelector<HTMLElement>('[data-shell-overlay]')\r\n if (overlay === null) return\r\n const frame = overlay.parentElement\r\n if (frame === null) return\r\n frameEl = frame\r\n const idx = Array.from(frame.children).indexOf(overlay)\r\n sidebarEl = (frame.children[idx - 3] as HTMLElement | undefined) ?? null\r\n centerEl = (frame.children[idx - 2] as HTMLElement | undefined) ?? null\r\n detailsEl = (frame.children[idx - 1] as HTMLElement | undefined) ?? null\r\n}\r\n\r\nfunction setBlur(el: HTMLElement | null, px: number): void {\r\n if (el === null) return\r\n const underlay = el.querySelector<HTMLDivElement>(`:scope > .${PART_UNDERLAY_CLASS}`)\r\n if (px > 0) {\r\n ensurePartBlurStyle()\r\n // The underlay is position:absolute and needs a positioned host: static\r\n // columns get relative (a layout no-op for flex items) that is restored on\r\n // clear; parts the host already positions keep their own scheme.\r\n if (!el.classList.contains(PART_BLUR_CLASS) && getComputedStyle(el).position === 'static') {\r\n el.style.position = 'relative'\r\n el.setAttribute('data-dab-pos-patched', '1')\r\n }\r\n el.classList.add(PART_BLUR_CLASS)\r\n if (underlay === null) {\r\n const node = document.createElement('div')\r\n node.className = PART_UNDERLAY_CLASS\r\n el.prepend(node)\r\n }\r\n el.style.setProperty('--dsh-any-part-blur', `blur(${px}px)`)\r\n } else {\r\n el.classList.remove(PART_BLUR_CLASS)\r\n el.style.removeProperty('--dsh-any-part-blur')\r\n underlay?.remove()\r\n if (el.getAttribute('data-dab-pos-patched') === '1') {\r\n el.style.removeProperty('position')\r\n el.removeAttribute('data-dab-pos-patched')\r\n }\r\n }\r\n}\r\n\r\nfunction applySettingsBlur(px: number): void {\r\n if (px > 0) document.documentElement.style.setProperty('--dsh-any-blur-settings', `blur(${px}px)`)\r\n else document.documentElement.style.removeProperty('--dsh-any-blur-settings')\r\n}\r\n\r\n/** Apply the main-background opacity to the center/details columns instead of\r\n * the frame. The frame's translucent bg-base sits UNDER the sidebar, so\r\n * reducing the main-bg opacity stacked a second alpha onto the sidebar; moving\r\n * the alpha onto the columns keeps the sidebar owned by its own slider. */\r\nfunction applyPartOpacities(ops: PartOpacities): void {\r\n const tokens = paletteTokens()\r\n if (tokens === null) return\r\n discoverParts()\r\n if (frameEl === null) return\r\n const base = tokens['--dsw-alias-bg-base']\r\n frameEl.style.background = 'transparent'\r\n if (centerEl !== null) centerEl.style.background = base !== undefined ? toRgba(base, ops.bg) : 'transparent'\r\n if (detailsEl !== null) detailsEl.style.background = base !== undefined ? toRgba(base, ops.bg) : 'transparent'\r\n}\r\n\r\n/** Blur of the option panels inside the settings dialog (.dab-card), owned by\r\n * the \"dialog option panel\" (card) blur slider. Written as a plugin-owned\r\n * variable consumed by SETTINGS_STYLE_RULE — deliberately NOT applied to the\r\n * homepage center/details columns, which this slider must never touch. */\r\nfunction applyCardPanelsBlur(px: number): void {\r\n if (px > 0) document.documentElement.style.setProperty('--dsh-any-blur-card-panels', `blur(${px}px)`)\r\n else document.documentElement.style.removeProperty('--dsh-any-blur-card-panels')\r\n}\r\n\r\n/** Apply per-part interface blur to the AppFrame columns + settings panel. */\r\nexport function applyPartBlurs(blurs: PartBlurs): void {\r\n discoverParts()\r\n // The bg blur frosts the wallpaper behind the main content columns (center +\r\n // details); the frame itself stays unblurred so the sidebar is never\r\n // double-frosted by both the bg and sidebar sliders.\r\n setBlur(frameEl, 0)\r\n setBlur(sidebarEl, blurs.sidebar)\r\n setBlur(centerEl, blurs.bg)\r\n setBlur(detailsEl, blurs.bg)\r\n applyBgBlurGlobal(blurs.bg)\r\n applyCardPanelsBlur(blurs.card)\r\n applySettingsBlur(blurs.settings)\r\n applyInputBlur(blurs.input)\r\n applyViewCards()\r\n}\r\n\r\n/** Live per-part blur update during slider drag (no full re-apply). */\r\nexport function setPartBlur(part: keyof PartBlurs, v: number): void {\r\n if (part === 'settings') { applySettingsBlur(v); return }\r\n if (part === 'card') { applyCardPanelsBlur(v); return }\r\n if (part === 'input') { applyInputBlur(v); return }\r\n if (part === 'chat' || part === 'trajectory') { applyViewCards(); return }\r\n discoverParts()\r\n if (part === 'bg') { setBlur(centerEl, v); setBlur(detailsEl, v); applyBgBlurGlobal(v) }\r\n else setBlur(sidebarEl, v)\r\n}\r\n\r\n// ── Conversation view treatments ────────────────────────────────────\r\n// The chat message column is styled as a real card (layer-1 surface + border +\r\n// 16px radius + 18px padding); the trajectory view gets NO card decoration —\r\n// its own panels fully cover the view root, so its opacity slider re-scopes the\r\n// layer tokens inside the view and its blur frosts the backdrop through the\r\n// standard root underlay.\r\n//\r\n// Host structure (deepseek-harness ui-conversation / ui-trajectory):\r\n// ConversationRoot\r\n// header — title + tabs, OUTSIDE the scrollport\r\n// [data-conversation-scroll] — the single scrollport\r\n// [data-chat-flow] ← chat column (flow content, NOT scrollable)\r\n// [data-conversation-composer-overlay] ← trajectory view root\r\n// [data-composer-seat] — sticky composer, a sibling\r\n// The input is sticky inside the same scrollport, so the stable host markers\r\n// are used; generic heuristics remain as a chat fallback for marker-less hosts.\r\n//\r\n// Cards are ALWAYS styled once their host exists — sliders at zero only turn\r\n// surface/border transparent, so the layout never reflows and the view cannot\r\n// jump when a slider leaves zero. Removal happens only at plugin teardown.\r\ninterface ViewCardSpec {\r\n sel: string\r\n mark: string\r\n /** Dataset key prefix holding the stashed pre-card inline values. */\r\n prev: string\r\n opacity: () => number\r\n blur: () => number\r\n /** Generic heuristic fallback (chat card only, hosts without the marker). */\r\n fallback?: boolean\r\n /** No card decoration — surfaces follow scoped layer tokens; only the blur\r\n * underlay is attached to the host element. */\r\n plain?: boolean\r\n}\r\n\r\nconst VIEW_CARDS: ViewCardSpec[] = [\r\n { sel: '[data-chat-flow]', mark: 'data-dab-chat-card', prev: 'dabChatPrev', opacity: rChatTextOpacity, blur: () => rBlurs().chat, fallback: true },\r\n { sel: '[data-conversation-composer-overlay]', mark: 'data-dab-traj-card', prev: 'dabTrajPrev', opacity: rTrajectoryOpacity, blur: () => rBlurs().trajectory, plain: true },\r\n]\r\n\r\nconst viewTargets: Array<HTMLElement | null> = VIEW_CARDS.map(() => null)\r\n\r\nfunction isScrollableY(el: HTMLElement): boolean {\r\n const oy = getComputedStyle(el).overflowY\r\n // 'overlay' covers Chromium's non-standard overflow value.\r\n return oy === 'auto' || oy === 'scroll' || oy === 'overlay'\r\n}\r\n\r\n/** Whether the subtree hosts the chat input (textarea / contenteditable /\r\n * textbox role) — used to keep the card off the input row. */\r\nfunction containsChatEditor(el: HTMLElement): boolean {\r\n return el.querySelector('textarea,[contenteditable=\"true\"],[contenteditable=\"\"],[contenteditable=\"plaintext-only\"],[role=\"textbox\"]') !== null\r\n}\r\n\r\n/** Walk down from a coarse candidate toward the actual message column: stop\r\n * at a scroll container (the card surface must stay pinned to the scroll\r\n * port); while the chat input lives inside, descend into the tallest child that\r\n * does NOT contain it (the header row is short, the input row holds the\r\n * editor); otherwise peel wrappers dominated (>= 85%) by a single child so\r\n * tab bars / titles stay outside the card. */\r\nfunction refineMessageColumn(start: HTMLElement): HTMLElement {\r\n let cur = start\r\n for (let depth = 0; depth < 10; depth++) {\r\n if (isScrollableY(cur)) break\r\n const kids = Array.from(cur.children).filter((k): k is HTMLElement => k instanceof HTMLElement)\r\n if (kids.length === 0) break\r\n const tallest = kids.reduce((a, b) => (b.clientHeight > a.clientHeight ? b : a))\r\n if (containsChatEditor(cur)) {\r\n const candidates = kids.filter(k => !containsChatEditor(k) && k.clientHeight >= cur.clientHeight * 0.4)\r\n if (candidates.length === 0) break\r\n cur = candidates.reduce((a, b) => (b.clientHeight > a.clientHeight ? b : a))\r\n continue\r\n }\r\n if (kids.length > 1 && tallest.clientHeight >= cur.clientHeight * 0.85) { cur = tallest; continue }\r\n break\r\n }\r\n return cur\r\n}\r\n\r\nfunction discoverViewTarget(idx: number, spec: ViewCardSpec): HTMLElement | null {\r\n if (centerEl === null || !document.body.contains(centerEl)) { viewTargets[idx] = null; return null }\r\n // The host marker always wins over a cached fallback (the view may not be\r\n // mounted yet when the plugin applies early).\r\n const marked = centerEl.querySelector<HTMLElement>(spec.sel)\r\n const cached = viewTargets[idx]\r\n if (marked !== null) {\r\n if (cached !== null && cached !== marked) { setBlur(cached, 0); restoreCardHost(cached, spec.mark, spec.prev, spec.plain === true) }\r\n viewTargets[idx] = marked\r\n return marked\r\n }\r\n if (cached !== null && centerEl.contains(cached)) return cached\r\n viewTargets[idx] = null\r\n if (spec.fallback !== true) return null\r\n // On the harness, an absent [data-chat-flow] just means the chat view is not\r\n // mounted (hero phase, trajectory tab) — settling on the whole scrollport\r\n // there would wrap the entire page in the card.\r\n if (centerEl.querySelector('[data-conversation-scroll]') !== null) return null\r\n // Marker-less hosts keep their layout until a slider moves.\r\n if (spec.opacity() <= 0 && spec.blur() <= 0) return null\r\n // Generic fallbacks: the largest vertically scrollable element inside the\r\n // column, or the tallest direct child when the host virtualises scrolling.\r\n let best: HTMLElement | null = null\r\n let bestArea = 0\r\n for (const el of Array.from(centerEl.querySelectorAll<HTMLElement>('*'))) {\r\n if (!isScrollableY(el)) continue\r\n if (el.clientHeight < centerEl.clientHeight * 0.35) continue\r\n const area = el.clientWidth * el.clientHeight\r\n if (area > bestArea) { bestArea = area; best = el }\r\n }\r\n if (best === null) {\r\n for (const el of Array.from(centerEl.children)) {\r\n if (!(el instanceof HTMLElement)) continue\r\n if (el.clientHeight < centerEl.clientHeight * 0.5) continue\r\n if (el.clientHeight > (best?.clientHeight ?? 0)) best = el\r\n }\r\n }\r\n // Coarse candidates are narrowed to the message column itself.\r\n const refined = best !== null ? refineMessageColumn(best) : null\r\n viewTargets[idx] = refined\r\n return refined\r\n}\r\n\r\n/** Stash the host's own inline values so teardown restores them exactly.\r\n * Plain views only get a background override, so only that is stashed. */\r\nfunction stashCardPrev(el: HTMLElement, prev: string, plain: boolean): void {\r\n const ds = el.dataset as Record<string, string | undefined>\r\n ds[prev + 'Bg'] = el.style.getPropertyValue('background')\r\n if (plain) return\r\n ds[prev + 'Border'] = el.style.getPropertyValue('border')\r\n ds[prev + 'Radius'] = el.style.getPropertyValue('border-radius')\r\n ds[prev + 'Padding'] = el.style.getPropertyValue('padding')\r\n}\r\n\r\n/** Undo the inline styling, restoring the host's previous inline values. */\r\nfunction restoreCardHost(el: HTMLElement, mark: string, prev: string, plain: boolean): void {\r\n if (!el.hasAttribute(mark)) return\r\n const ds = el.dataset as Record<string, string | undefined>\r\n const restore = (prop: string, v: string | undefined): void => {\r\n if (v !== undefined && v !== '') el.style.setProperty(prop, v)\r\n else el.style.removeProperty(prop)\r\n }\r\n restore('background', ds[prev + 'Bg'])\r\n if (!plain) {\r\n restore('border', ds[prev + 'Border'])\r\n restore('border-radius', ds[prev + 'Radius'])\r\n restore('padding', ds[prev + 'Padding'])\r\n delete ds[prev + 'Border']; delete ds[prev + 'Radius']; delete ds[prev + 'Padding']\r\n }\r\n delete ds[prev + 'Bg']\r\n el.removeAttribute(mark)\r\n}\r\n\r\n/** Teardown only: strip every view treatment and hand the hosts back untouched. */\r\nfunction removeViewCards(): void {\r\n VIEW_CARDS.forEach((spec, i) => {\r\n const el = viewTargets[i]\r\n if (el !== null) { setBlur(el, 0); restoreCardHost(el, spec.mark, spec.prev, spec.plain === true) }\r\n viewTargets[i] = null\r\n })\r\n}\r\n\r\n// ── Wide markdown tables ──────────────────────────────────────────────────────\r\n// DSH intentionally lets `.md-table-wide` bleed outside the text column (a\r\n// negative --dsh-table-lead margin + max-width:none, set by a host rule like\r\n// `.Sxvs8a_body .md-table-wide`; the prefix is a build-time hash class). That\r\n// bleed only becomes visible once the chat surface gains a visible border, i.e.\r\n// when the chat region opacity or blur is non-zero (see borderAlpha in\r\n// applyViewCards). Under that same condition, pull the table back inside the\r\n// column and let it scroll horizontally. The stable `.md-table-wide` class is\r\n// targeted with !important so the fix survives DSH's changing hash prefixes.\r\n\r\nconst TABLE_FIX_RULE = [\r\n '.md-table-wide {',\r\n ' --dsh-table-spare: 0px !important;',\r\n ' --dsh-table-lead: 0px !important;',\r\n ' box-sizing: border-box !important;',\r\n ' width: 100% !important;',\r\n ' max-width: 100% !important;',\r\n ' margin-left: 0 !important;',\r\n ' padding-left: 0 !important;',\r\n ' padding-bottom: 0 !important;',\r\n ' overflow-x: auto !important;',\r\n '}',\r\n].join('\\n')\r\nlet tableFixStyleEl: HTMLStyleElement | null = null\r\n\r\n/** Toggle the wide-table clamp according to the chat region's opacity & blur. */\r\nfunction syncTableFix(): void {\r\n const needed = rChatTextOpacity() > 0 || rBlurs().chat > 0\r\n if (!needed) {\r\n if (tableFixStyleEl !== null) { tableFixStyleEl.remove(); tableFixStyleEl = null }\r\n return\r\n }\r\n if (tableFixStyleEl === null) {\r\n tableFixStyleEl = document.createElement('style')\r\n tableFixStyleEl.dataset.plugin = 'dsh-any-background-table-fix'\r\n tableFixStyleEl.textContent = TABLE_FIX_RULE\r\n }\r\n if (!tableFixStyleEl.isConnected) document.head.appendChild(tableFixStyleEl)\r\n}\r\n\r\n/** Re-derive the conversation view cards from the current config. Cheap\r\n * enough for live slider drags; the card structure is applied unconditionally\r\n * once the host exists so the layout never reflows when a slider leaves zero. */\r\nexport function applyViewCards(): void {\r\n discoverParts()\r\n if (centerEl === null) return\r\n const [h, s, l] = rColor()\r\n const surface = genTokens(h, s, l, rColorScheme()).tokens['--dsw-alias-bg-layer-1']\r\n VIEW_CARDS.forEach((spec, i) => {\r\n const target = discoverViewTarget(i, spec)\r\n if (target === null) return\r\n const plain = spec.plain === true\r\n const opacity = spec.opacity()\r\n const blurPx = spec.blur()\r\n if (!plain) {\r\n if (!target.hasAttribute(spec.mark)) stashCardPrev(target, spec.prev, false)\r\n // Mirrors .dab-card (layer-1 background, border, 16px radius, 18px\r\n // padding), written inline so it wins over host stylesheets; the opacity\r\n // slider drives surface alpha and fades the border with it.\r\n const borderAlpha = opacity > 0 ? Math.min(1, opacity * 1.5) : (blurPx > 0 ? 0.35 : 0)\r\n target.style.background = surface !== undefined ? toRgba(surface, opacity) : 'transparent'\r\n target.style.border = surface !== undefined ? `1px solid ${toRgba(surface, borderAlpha)}` : '1px solid transparent'\r\n target.style.borderRadius = '16px'\r\n target.style.padding = '18px'\r\n }\r\n // Plain views write no inline styles — only the blur underlay is hosted here.\r\n target.setAttribute(spec.mark, '1')\r\n setBlur(target, blurPx)\r\n })\r\n syncTableFix()\r\n}\r\n\r\nlet partsObserver: MutationObserver | null = null\r\n\r\n/** Watch for the AppFrame mounting so persisted blurs land even when the shell\r\n * renders after this plugin's apply. Cheap: once all parts are found, the\r\n * callback returns. */\r\nexport function watchParts(): void {\r\n if (partsObserver !== null || typeof MutationObserver === 'undefined') return\r\n partsObserver = new MutationObserver(() => {\r\n if (frameEl !== null && sidebarEl !== null && centerEl !== null && detailsEl !== null && document.body.contains(frameEl)\r\n // Keep re-applying while any card host is absent or was swapped by the host.\r\n && viewTargets.every(el => el !== null && document.body.contains(el))) return\r\n applyPartBlurs(rBlurs())\r\n applyPartOpacities(rOps())\r\n })\r\n partsObserver.observe(document.body, { childList: true, subtree: true })\r\n}\r\n\r\nexport function stopWatchingParts(): void {\r\n partsObserver?.disconnect()\r\n partsObserver = null\r\n}\r\n\r\n// ── Theme-reset watchdog ──────────────────────────────────────────────────\r\n// The host re-asserts its own :root/body scheme rules on mount, on settings\r\n// adoption and after the plugin's startup assertion, toggling the\r\n// `data-ds-dark-theme` attribute off / to a host value — which would paint a\r\n// frame of light surfaces. Watch that flag and, whenever the plugin's own\r\n// value disappears, re-set it and re-emit the token stylesheet within the same\r\n// frame. The guard stops feedback: once our mark is present the handler\r\n// returns, so our own re-assertion cannot re-trigger.\r\nlet themeObserver: MutationObserver | null = null\r\nlet themeRaf = 0\r\n\r\nfunction reassertScheme(): void {\r\n const dark = rScheme() === 'dark'\r\n if (dark) document.body.setAttribute('data-ds-dark-theme', 'dsh-any-background')\r\n else document.body.removeAttribute('data-ds-dark-theme')\r\n applyCustomTokens(rOps())\r\n}\r\n\r\n/** Re-assert the plugin's forced scheme whenever the host strips it, so a\r\n * refresh / cold-load / set-change never flashes a light frame. Returns a\r\n * disposer for teardown. */\r\nexport function watchThemeResets(): () => void {\r\n if (themeObserver !== null || typeof MutationObserver === 'undefined') return () => undefined\r\n themeObserver = new MutationObserver(() => {\r\n if (document.body.getAttribute('data-ds-dark-theme') === 'dsh-any-background') return\r\n if (!(rHasColor() || rBgDark() !== null || rSchemeOverride() !== 'auto')) return\r\n if (themeRaf !== 0) return\r\n themeRaf = requestAnimationFrame(() => {\r\n themeRaf = 0\r\n if (document.body.getAttribute('data-ds-dark-theme') === 'dsh-any-background') return\r\n reassertScheme()\r\n })\r\n })\r\n themeObserver.observe(document.body, { attributes: true, attributeFilter: ['data-ds-dark-theme'] })\r\n themeObserver.observe(document.documentElement, { attributes: true, attributeFilter: ['data-ds-dark-theme'] })\r\n return () => {\r\n themeObserver?.disconnect()\r\n themeObserver = null\r\n }\r\n}\r\n\r\nfunction ensureWpContainer(): void {\r\n if (!wpEl || !document.body.contains(wpEl)) {\r\n wpEl = document.createElement('div')\r\n wpEl.style.cssText = 'position:fixed;inset:0;z-index:-1;pointer-events:none;overflow:hidden;'\r\n document.body.prepend(wpEl)\r\n }\r\n}\r\n\r\nfunction clearVideoEl(): void {\r\n if (videoEl === null) return\r\n videoEl.pause()\r\n videoEl.removeAttribute('src')\r\n videoEl.load()\r\n videoEl.remove()\r\n videoEl = null\r\n}\r\n\r\n/** Intrinsic-size cache for the center mode (native pixels of the current image). */\r\nlet imgNat: { url: string; w: number; h: number } | null = null\r\nfunction imageNatSize(url: string, cb: (w: number, h: number) => void): void {\r\n if (imgNat !== null && imgNat.url === url) { cb(imgNat.w, imgNat.h); return }\r\n void loadImage(url).then(img => {\r\n if (!img) { cb(0, 0); return }\r\n imgNat = { url, w: img.naturalWidth, h: img.naturalHeight }\r\n cb(img.naturalWidth, img.naturalHeight)\r\n })\r\n}\r\n\r\n// ── Drag-time wallpaper downscaling ──────────────────────────────────────────\r\n// Repainting translucent surfaces over a full-resolution wallpaper is expensive\r\n// (proportional to the image's pixel area, worse under backdrop blur). During a\r\n// slider drag we swap the layer's background-image to a bounded-size JPEG copy,\r\n// slashing that per-frame raster cost; the full-res image is restored on release\r\n// and stays browser-cached, so the swap is cheap. Precomputed after each image\r\n// apply so the first drag needs no decode hitch.\r\nconst DRAG_MAX_SIDE = 720\r\n\r\nlet lowResUrl: string | null = null\r\nlet lowResFor = ''\r\nlet dragLow = false\r\n\r\nfunction captureLowRes(url: string, cb: (low: string | null) => void): void {\r\n if (lowResFor === url) { cb(lowResUrl); return }\r\n void loadImage(url).then(img => {\r\n if (!img) { cb(null); return }\r\n const k = Math.min(1, DRAG_MAX_SIDE / Math.max(img.naturalWidth, img.naturalHeight))\r\n if (k >= 1) { lowResFor = url; lowResUrl = null; cb(null); return }\r\n const c = document.createElement('canvas')\r\n c.width = Math.max(1, Math.round(img.naturalWidth * k))\r\n c.height = Math.max(1, Math.round(img.naturalHeight * k))\r\n const g = c.getContext('2d')\r\n if (!g) { lowResFor = url; lowResUrl = null; cb(null); return }\r\n g.drawImage(img, 0, 0, c.width, c.height)\r\n const low = c.toDataURL('image/jpeg', 0.85)\r\n lowResFor = url; lowResUrl = low\r\n cb(low)\r\n })\r\n}\r\n\r\nfunction setDragLow(on: boolean): void {\r\n if (cfg.backgroundType !== 'image' || on === dragLow || !wpEl) return\r\n const full = rWpImage()\r\n if (!full) return\r\n if (on) {\r\n dragLow = true\r\n captureLowRes(full, low => {\r\n if (!dragLow || !wpEl || low === null) return\r\n if (wpEl.style.backgroundImage !== `url(\"${low}\")`) wpEl.style.backgroundImage = `url(\"${low}\")`\r\n })\r\n } else {\r\n dragLow = false\r\n if (wpEl.style.backgroundImage !== `url(\"${full}\")`) wpEl.style.backgroundImage = `url(\"${full}\")`\r\n }\r\n}\r\n\r\n/** While any range slider in the app is being dragged, run the wallpaper at\r\n * reduced resolution; restore on release. Returns a disposer for teardown. */\r\nexport function watchWallpaperDragQuality(): () => void {\r\n const isRange = (t: EventTarget | null): boolean =>\r\n t instanceof HTMLInputElement && t.type === 'range'\r\n const down = (e: PointerEvent): void => { if (isRange(e.target)) setDragLow(true) }\r\n const up = (): void => { if (dragLow) setDragLow(false) }\r\n window.addEventListener('pointerdown', down, true)\r\n window.addEventListener('pointerup', up, true)\r\n window.addEventListener('pointercancel', up, true)\r\n return () => {\r\n window.removeEventListener('pointerdown', down, true)\r\n window.removeEventListener('pointerup', up, true)\r\n window.removeEventListener('pointercancel', up, true)\r\n if (dragLow) setDragLow(false)\r\n }\r\n}\r\n\r\n// ── Wallpaper brightness verdict ─────────────────────────────────────────────\r\n// Image/video wallpapers get the same one-shot brightness verdict generated\r\n// backgrounds analyze from their captured frame: decoded once per URL (cached),\r\n// it drives the label direction and the auto scheme, so a light wallpaper gets\r\n// dark fonts even when no theme color is picked and the host preference is dark.\r\nlet wpVerdict: { url: string; dark: boolean } | null = null\r\nlet verdictListener: (() => void) | null = null\r\n// Monotonic guard for the async frame analysis: a stale result (the wallpaper\r\n// changed while the frame was decoding) must never overwrite the current\r\n// verdict. applyGeneratedBg guards with its own controller comparison; the\r\n// image/video path needs the same protection.\r\nlet verdictGen = 0\r\n\r\n/** Register a callback fired when the background brightness verdict CHANGES\r\n * (a new wallpaper was analyzed, a generated bg regenerated), so the skin can\r\n * be re-registered through the host theme service. */\r\nexport function onVerdictApplied(cb: () => void): void { verdictListener = cb }\r\n\r\nfunction applyVerdict(dark: boolean | null): void {\r\n if (rBgDark() === dark) return\r\n setBgDark(dark)\r\n if (dark !== null) verdictListener?.()\r\n}\r\n\r\nfunction updateWpVerdict(url: string | null): void {\r\n const gen = ++verdictGen\r\n if (url === null) { applyVerdict(null); return }\r\n if (wpVerdict !== null && wpVerdict.url === url) { applyVerdict(wpVerdict.dark); return }\r\n void analyzeFrameDark(url).then(dark => {\r\n if (dark === null || gen !== verdictGen) return\r\n wpVerdict = { url, dark }\r\n applyVerdict(dark)\r\n applyCustomTokens(rOps())\r\n })\r\n}\r\n\r\nfunction applyImageWp(url: string): void {\r\n clearDynamicBg()\r\n clearVideoEl()\r\n ensureWpContainer()\r\n const bg = rBgState()\r\n const mode = rBgMode()\r\n const next = `url(\"${url}\")`\r\n // Skip re-setting the same data URL — re-decoding it flashes the wallpaper\r\n // blank for a frame on boot re-applies.\r\n if (wpEl!.style.backgroundImage !== next) {\r\n wpEl!.style.backgroundImage = next\r\n }\r\n if (mode === 'fit') {\r\n wpEl!.style.backgroundRepeat = 'no-repeat'\r\n if (bg.iw > 0) {\r\n // Contain-fit at zoom with the image center pinned to the committed\r\n // fractional viewport point, so the framed region survives viewport changes.\r\n const fit = Math.min(window.innerWidth / bg.iw, window.innerHeight / bg.ih)\r\n const w = bg.iw * fit * bg.zoom\r\n const h = bg.ih * fit * bg.zoom\r\n wpEl!.style.backgroundSize = `${w}px ${h}px`\r\n wpEl!.style.backgroundPosition = `${bg.x * window.innerWidth - w / 2}px ${bg.y * window.innerHeight - h / 2}px`\r\n } else {\r\n // Fresh image: match the editor's initial centered contain view.\r\n wpEl!.style.backgroundSize = 'contain'\r\n wpEl!.style.backgroundPosition = 'center'\r\n }\r\n } else if (mode === 'fill') {\r\n wpEl!.style.backgroundRepeat = 'no-repeat'\r\n wpEl!.style.backgroundSize = 'cover'\r\n wpEl!.style.backgroundPosition = 'center'\r\n } else if (mode === 'stretch') {\r\n wpEl!.style.backgroundRepeat = 'no-repeat'\r\n wpEl!.style.backgroundSize = '100% 100%'\r\n wpEl!.style.backgroundPosition = 'center'\r\n } else if (mode === 'tile') {\r\n wpEl!.style.backgroundRepeat = 'repeat'\r\n // background-size:auto resolves the intrinsic size per tile.\r\n wpEl!.style.backgroundSize = 'auto'\r\n wpEl!.style.backgroundPosition = '0px 0px'\r\n } else {\r\n // Center: native size, centered. The intrinsic size needs an async decode;\r\n // 'contain' keeps a sensible frame until it lands.\r\n wpEl!.style.backgroundRepeat = 'no-repeat'\r\n wpEl!.style.backgroundSize = 'contain'\r\n wpEl!.style.backgroundPosition = 'center'\r\n imageNatSize(url, (w, h) => {\r\n if (!wpEl || wpEl.style.backgroundImage !== next || rBgMode() !== 'center') return\r\n if (w > 0 && h > 0) {\r\n wpEl.style.backgroundSize = `${w}px ${h}px`\r\n wpEl.style.backgroundPosition = 'center'\r\n }\r\n })\r\n }\r\n // Precompute the drag-time downscaled copy now so the first drag swaps without\r\n // a decode hitch (the original is already loaded, so this hits the cache).\r\n captureLowRes(url, () => undefined)\r\n applyWpEffects()\r\n updateWpVerdict(url)\r\n}\r\n\r\n/** Video wallpaper: a muted looping <video> inside the wallpaper layer.\r\n * Placement modes map onto object-fit (tile has no video equivalent and\r\n * falls back to cover). */\r\nfunction applyVideoWp(url: string): void {\r\n clearDynamicBg()\r\n ensureWpContainer()\r\n if (wpEl!.style.backgroundImage !== 'none') wpEl!.style.backgroundImage = 'none'\r\n if (videoEl === null || !videoEl.isConnected) {\r\n videoEl = document.createElement('video')\r\n videoEl.muted = true\r\n videoEl.loop = true\r\n videoEl.autoplay = true\r\n videoEl.playsInline = true\r\n videoEl.preload = 'auto'\r\n videoEl.setAttribute('playsinline', '')\r\n videoEl.style.cssText = 'position:absolute;inset:0;width:100%;height:100%;object-position:center;'\r\n // Attach before loading so the element is in the document when play()\r\n // resolves; a detached video can defer its first rendered frame.\r\n wpEl!.appendChild(videoEl)\r\n videoEl.setAttribute('src', url)\r\n void videoEl.play().catch(() => undefined)\r\n } else if (videoEl.getAttribute('src') !== url) {\r\n // Compare the attribute, not videoEl.src: the property getter resolves to\r\n // an absolute URL that would never match the relative serve URL and would\r\n // restart playback on every re-apply.\r\n videoEl.setAttribute('src', url)\r\n void videoEl.play().catch(() => undefined)\r\n }\r\n const mode = rBgMode()\r\n const bg = rVideoBgState()\r\n if (mode === 'fit' && bg.iw > 0) {\r\n // Editor-committed box at contain-fit scale × zoom, centered on the\r\n // fractional point; object-fit:fill stretches the frame into the box\r\n // (same aspect ratio, so nothing distorts).\r\n const fit = Math.min(window.innerWidth / bg.iw, window.innerHeight / bg.ih)\r\n const w = bg.iw * fit * bg.zoom\r\n const h = bg.ih * fit * bg.zoom\r\n videoEl.style.cssText = `position:absolute;left:${bg.x * window.innerWidth - w / 2}px;top:${bg.y * window.innerHeight - h / 2}px;width:${w}px;height:${h}px;object-fit:fill;`\r\n } else {\r\n videoEl.style.cssText = 'position:absolute;inset:0;width:100%;height:100%;object-position:center;'\r\n videoEl.style.objectFit = mode === 'stretch' ? 'fill' : (mode === 'fill' || mode === 'tile') ? 'cover' : 'contain'\r\n }\r\n applyWpEffects()\r\n // Video mode has no still Image-decodable source; the captured frame\r\n // snapshot stands in for the brightness verdict (null until it lands, then\r\n // re-analyzed through the next apply).\r\n updateWpVerdict(rWp())\r\n}\r\n\r\nfunction applyWpEffects(): void {\r\n if (!wpEl) return\r\n const blur = rBl()\r\n wpEl.style.filter = blur > 0 ? `blur(${blur}px)` : 'none'\r\n wpEl.style.opacity = String(rWop())\r\n}\r\n\r\nexport function applyWp(): void {\r\n const url = rWp()\r\n if (cfg.backgroundType === 'video') {\r\n // The frame snapshot (rWp's video branch) is preview-only; the layer plays\r\n // the video from its own slot.\r\n const vurl = rWpVideo()\r\n if (vurl) {\r\n applyVideoWp(vurl)\r\n } else {\r\n clearDynamicBg()\r\n clearVideoEl()\r\n wpEl?.remove(); wpEl = null\r\n }\r\n } else if (cfg.backgroundType !== 'image' && cfg.generatedBg) {\r\n // Recreate the live canvas from saved params if one is not active yet\r\n // (boot or after import).\r\n clearVideoEl()\r\n if (!wpController) {\r\n applyGeneratedBg(cfg.generatedBg)\r\n return\r\n }\r\n ensureWpContainer()\r\n if (wpController.canvas.parentElement !== wpEl) wpEl!.appendChild(wpController.canvas)\r\n applyWpEffects()\r\n } else if (url) {\r\n applyImageWp(url)\r\n } else {\r\n // No background: tear down the layer but keep tokens/blur intact.\r\n clearDynamicBg()\r\n clearVideoEl()\r\n wpEl?.remove(); wpEl = null\r\n wpVerdict = null\r\n setBgDark(null)\r\n }\r\n // Write tokens only when there is something to derive them from (a saved\r\n // pick, a background brightness verdict, or a forced scheme) — on boot the\r\n // persisted state has not loaded yet, and rColor() would flash the default.\r\n if (rHasColor() || rBgDark() !== null || rSchemeOverride() !== 'auto') {\r\n applyCustomTokens(rOps())\r\n } else if (!url) {\r\n // Nothing left to derive from (e.g. the wallpaper was removed with no\r\n // picked color): drop the tokens the last brightness verdict left behind,\r\n // or the label direction / dark mark would stay pinned to the old\r\n // wallpaper over the host's own theme.\r\n clearThemeTokens()\r\n }\r\n if (rHasColor()) {\r\n applySettingsOverrides(rSop())\r\n applyTrajectoryOverrides(rTrajectoryOpacity())\r\n }\r\n applyPartBlurs(rBlurs())\r\n}\r\n\r\nexport function teardownWp(): void {\r\n clearDynamicBg()\r\n clearVideoEl()\r\n disposeVideoObjectUrl()\r\n setBgDark(null)\r\n wpVerdict = null\r\n wpEl?.remove(); wpEl = null\r\n clearCustomTokens()\r\n tokenStyleEl?.remove(); tokenStyleEl = null\r\n removeViewCards()\r\n document.body.removeAttribute('data-ds-dark-theme')\r\n document.body.style.removeProperty('color-scheme')\r\n document.documentElement.style.removeProperty('--dsh-any-bg-settings-surface')\r\n document.documentElement.style.removeProperty('--dsh-any-bg-settings-layer-1')\r\n document.documentElement.style.removeProperty('--dsh-any-bg-settings-layer-2')\r\n document.documentElement.style.removeProperty('--dsh-any-bg-settings-layer-3')\r\n document.documentElement.style.removeProperty('--dsh-any-traj-layer-1')\r\n document.documentElement.style.removeProperty('--dsh-any-traj-layer-2')\r\n document.documentElement.style.removeProperty('--dsh-any-traj-layer-3')\r\n document.documentElement.style.removeProperty('--dsh-any-bg-settings-card-surface')\r\n document.documentElement.style.removeProperty('--dsh-any-blur-settings')\r\n document.documentElement.style.removeProperty('--dsh-any-blur-card-panels')\r\n document.documentElement.style.removeProperty('--dsh-any-input-blur')\r\n document.documentElement.style.removeProperty('--dsh-any-part-blur-global')\r\n for (const v of Object.values(OPACITY_VARS)) document.documentElement.style.removeProperty(v)\r\n baseTokenKey = ''\r\n lastBgKey = ''\r\n if (tokensRaf !== null) { cancelAnimationFrame(tokensRaf); tokensRaf = null }\r\n pendingOps = null\r\n tableFixStyleEl?.remove(); tableFixStyleEl = null\r\n setBlur(frameEl, 0); setBlur(sidebarEl, 0); setBlur(centerEl, 0); setBlur(detailsEl, 0)\r\n if (frameEl !== null) frameEl.style.removeProperty('background')\r\n if (centerEl !== null) centerEl.style.removeProperty('background')\r\n if (detailsEl !== null) detailsEl.style.removeProperty('background')\r\n stopWatchingParts()\r\n}\r\n\r\n/** Live wallpaper-opacity updates during slider drag (no full re-apply). */\r\nexport function setWpOpacity(v: number): void {\r\n if (wpEl) wpEl.style.opacity = String(v)\r\n}\r\n\r\n/** Live wallpaper-blur updates during slider drag (no full re-apply). */\r\nexport function setWpBlur(v: number): void {\r\n if (wpEl) wpEl.style.filter = v > 0 ? `blur(${v}px)` : 'none'\r\n}\r\n","/**\r\n * Video-background helpers: capturing a single frame as a JPEG snapshot.\r\n * The snapshot stands in for everything that only understands still images:\r\n * the settings preview, theme-color extraction and the eyedropper. Uploads\r\n * stream the raw file over the binary upload route (see rpc.uploadVideo) —\r\n * a data-URL detour would inflate the bytes and trip the RPC body limit.\r\n */\r\n\r\nfunction grabFrame(v: HTMLVideoElement): string | null {\r\n const w = v.videoWidth, h = v.videoHeight\r\n if (w <= 0 || h <= 0) return null\r\n const canvas = document.createElement('canvas')\r\n canvas.width = w\r\n canvas.height = h\r\n const ctx = canvas.getContext('2d')\r\n if (!ctx) return null\r\n ctx.drawImage(v, 0, 0, w, h)\r\n try {\r\n return canvas.toDataURL('image/jpeg', 0.85)\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Capture one representative frame from a video data URL as a JPEG data URL.\r\n * Seeks to ~10% of the duration (first frame is often black) and waits for\r\n * the seek to land; resolves null when the video cannot be decoded. A timeout\r\n * keeps a broken file from hanging the upload flow.\r\n */\r\nexport function captureVideoSnapshot(url: string): Promise<string | null> {\r\n return new Promise(resolve => {\r\n const v = document.createElement('video')\r\n let settled = false\r\n const done = (r: string | null): void => {\r\n if (settled) return\r\n settled = true\r\n window.clearTimeout(timer)\r\n v.removeAttribute('src')\r\n v.load()\r\n resolve(r)\r\n }\r\n const timer = window.setTimeout(() => done(grabFrame(v)), 6000)\r\n v.muted = true\r\n v.preload = 'auto'\r\n v.playsInline = true\r\n v.onerror = () => done(null)\r\n v.onloadeddata = () => {\r\n // Prefer a frame slightly into the clip; very short clips seek to half.\r\n const target = isFinite(v.duration) && v.duration > 0.6 ? Math.min(v.duration * 0.1, 2) : 0\r\n if (target <= 0) { done(grabFrame(v)); return }\r\n v.onseeked = () => done(grabFrame(v))\r\n try {\r\n v.currentTime = target\r\n } catch {\r\n done(grabFrame(v))\r\n }\r\n }\r\n v.src = url\r\n })\r\n}\r\n","/**\r\n * dsh-any-background — settings UI design system.\r\n *\r\n * The section is styled entirely through these scoped classes instead of the\r\n * host's inline-style approach: animations (page transitions, staggered\r\n * reveals, the rotating orb ring) and pseudo-element effects cannot be\r\n * expressed as React inline styles. Every color reads the host's\r\n * --dsw-alias-* tokens so the panel follows the user's custom theme color and\r\n * light/dark scheme automatically; `color-mix` tints carry a plain-token\r\n * fallback first for older engines.\r\n */\r\nexport const NAV_ITEM_H = 38\r\nexport const NAV_GAP = 4\r\n\r\nexport const UI_CSS = `\r\n/* The section is rendered INLINE inside the host settings dialog's content\r\n * column: the host provides the modal chrome (backdrop, centering, closing).\r\n * These classes style only the embedded shell; transient fixed layers (toast,\r\n * color picker, background editor) escape through Portals on <html>. */\r\n.dab-root{position:relative;color:var(--dsw-alias-label-primary);animation:dab-fade-in .35s ease both;container-type:inline-size;display:flex;flex-direction:column;align-items:center;width:100%;min-width:0;--dab-mono:ui-monospace,\"Cascadia Mono\",\"SF Mono\",Consolas,\"Courier New\",monospace}\r\n.dab-root *,.dab-root *::before,.dab-root *::after{box-sizing:border-box}\r\n.dab-root button{font-family:inherit}\r\n\r\n/* ── shell: nav rail + page body ─────────────────────────────────────────── */\r\n.dab-shell{display:grid;grid-template-columns:158px minmax(0,1fr);gap:26px;align-items:start;padding-bottom:8px;width:100%;max-width:980px;margin:0 auto}\r\n.dab-nav{position:sticky;top:0;display:flex;flex-direction:column;gap:18px}\r\n.dab-brand{display:flex;align-items:center;gap:10px;padding:2px 6px}\r\n.dab-brand-tile{width:30px;height:30px;flex:none;border-radius:9px;display:grid;place-items:center;color:var(--dsw-alias-brand-text);background:var(--dsw-alias-brand-primary);box-shadow:0 4px 14px -4px var(--dsw-alias-brand-primary)}\r\n.dab-brand-name{font-size:13px;font-weight:650;letter-spacing:.01em;line-height:1.25}\r\n.dab-brand-tag{font-size:9px;letter-spacing:.16em;font-weight:600;color:var(--dsw-alias-label-quaternary,var(--dsw-alias-label-tertiary));text-transform:uppercase}\r\n.dab-nav-list{position:relative;display:flex;flex-direction:column;gap:${NAV_GAP}px}\r\n.dab-nav-ind{position:absolute;left:0;right:0;top:0;height:${NAV_ITEM_H}px;border-radius:11px;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);background:color-mix(in srgb,var(--dsw-alias-brand-primary) 13%,transparent);border-color:color-mix(in srgb,var(--dsw-alias-brand-primary) 25%,transparent);transition:transform .38s cubic-bezier(.22,1,.36,1)}\r\n.dab-nav-item{position:relative;z-index:1;display:flex;align-items:center;gap:10px;height:${NAV_ITEM_H}px;padding:0 12px;border:0;background:none;border-radius:11px;color:var(--dsw-alias-label-tertiary);font-size:13px;cursor:pointer;text-align:left;transition:color .22s ease}\r\n.dab-nav-item:hover{color:var(--dsw-alias-label-primary)}\r\n.dab-nav-item.is-active{color:var(--dsw-alias-brand-primary);font-weight:600}\r\n.dab-nav-item svg{flex:none;transition:transform .3s cubic-bezier(.34,1.56,.64,1)}\r\n.dab-nav-item:hover svg{transform:scale(1.14) rotate(-5deg)}\r\n\r\n/* ── page chrome ─────────────────────────────────────────────────────────── */\r\n.dab-page{animation:dab-page-in .4s cubic-bezier(.22,1,.36,1) both;min-width:0;display:flex;flex-direction:column;gap:13px}\r\n.dab-head{margin:2px 0 5px}\r\n.dab-overline{font-size:10.5px;font-weight:700;letter-spacing:.18em;text-transform:uppercase;color:var(--dsw-alias-brand-primary);opacity:.9}\r\n.dab-h1{margin:4px 0 0;font-size:21px;font-weight:700;letter-spacing:-.01em}\r\n.dab-desc{margin:6px 0 0;font-size:12.5px;line-height:1.55;color:var(--dsw-alias-label-tertiary);max-width:56ch}\r\n.dab-card{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);border-radius:16px;padding:18px}\r\n.dab-card-hover{transition:transform .28s ease,box-shadow .28s ease,border-color .28s ease}\r\n.dab-card-hover:hover{transform:translateY(-2px);box-shadow:0 10px 28px -12px rgba(0,0,0,.28)}\r\n.dab-rise{animation:dab-rise-in .55s cubic-bezier(.22,1,.36,1) both;animation-delay:calc(var(--d,0) * 62ms)}\r\n\r\n/* ── accent hero (color orb) ─────────────────────────────────────────────── */\r\n.dab-hero-accent{display:flex;align-items:center;gap:24px;flex-wrap:wrap}\r\n.dab-orb-wrap{position:relative;width:118px;height:118px;flex:none}\r\n.dab-orb{position:absolute;inset:11px;border-radius:50%;background:radial-gradient(circle at 32% 28%,rgba(255,255,255,.5),rgba(255,255,255,0) 44%),var(--c,#888);box-shadow:0 16px 36px -10px var(--c-soft,transparent),inset 0 -10px 20px rgba(0,0,0,.16);animation:dab-orb-in .7s cubic-bezier(.22,1,.36,1) both}\r\n.dab-orb-ring{position:absolute;inset:0;border-radius:50%;background:conic-gradient(from 0deg,transparent 0 30%,var(--c,#888) 46%,transparent 62%,transparent 76%,var(--c,#888) 90%,transparent 100%);-webkit-mask:radial-gradient(farthest-side,transparent calc(100% - 3.5px),#000 calc(100% - 2.5px));mask:radial-gradient(farthest-side,transparent calc(100% - 3.5px),#000 calc(100% - 2.5px));animation:dab-spin 7s linear infinite;opacity:.9}\r\n.dab-hex-caption{font-size:11px;color:var(--dsw-alias-label-tertiary);letter-spacing:.04em}\r\n.dab-hex{font-family:var(--dab-mono);font-size:24px;font-weight:600;letter-spacing:.02em;line-height:1.2;margin-top:2px}\r\n.dab-hsl-row{display:flex;gap:16px;margin-top:7px;font-family:var(--dab-mono);font-size:11px;color:var(--dsw-alias-label-tertiary)}\r\n.dab-hsl-row b{font-weight:600;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\r\n\r\n/* ── swatches ────────────────────────────────────────────────────────────── */\r\n.dab-swatch-title{font-size:12px;font-weight:600;margin-bottom:10px;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\r\n.dab-swatches{display:flex;flex-wrap:wrap;gap:9px}\r\n.dab-swatch{width:25px;height:25px;border-radius:50%;border:0;padding:0;cursor:pointer;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);transition:transform .22s cubic-bezier(.34,1.56,.64,1),box-shadow .22s ease}\r\n.dab-swatch:hover{transform:scale(1.2)}\r\n.dab-swatch.is-on{box-shadow:0 0 0 2px var(--dsw-alias-bg-layer-1),0 0 0 4px var(--dsw-alias-brand-primary)}\r\n\r\n/* ── wheel card ──────────────────────────────────────────────────────────── */\r\n.dab-wheel-card{position:relative;display:flex;align-items:center;justify-content:center;gap:28px;flex-wrap:wrap;padding:24px 18px}\r\n.dab-wheel-glow{position:absolute;width:230px;height:230px;border-radius:50%;filter:blur(48px);opacity:.2;background:var(--c,#888);pointer-events:none;transition:background .4s ease}\r\n.dab-wheel{position:relative;cursor:crosshair;border-radius:50%;box-shadow:0 12px 32px -14px rgba(0,0,0,.4)}\r\n.dab-hint{font-size:11.5px;line-height:1.55;color:var(--dsw-alias-label-tertiary);padding:0 4px}\r\n\r\n/* ── precise color inputs ────────────────────────────────────────────────── */\r\n.dab-inputs{display:flex;flex-direction:column;gap:10px;min-width:172px}\r\n.dab-field{display:flex;align-items:center;gap:8px}\r\n.dab-field-label{width:14px;text-align:center;font-family:var(--dab-mono);font-size:11px;font-weight:600;color:var(--dsw-alias-label-tertiary)}\r\n.dab-num{flex:1;min-width:0;height:30px;padding:0 10px;border-radius:9px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font-family:var(--dab-mono);font-size:12px;outline:none;transition:border-color .2s,box-shadow .2s}\r\n.dab-num:focus{border-color:var(--dsw-alias-brand-primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--dsw-alias-brand-primary) 18%,transparent)}\r\n.dab-num::-webkit-outer-spin-button,.dab-num::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}\r\n.dab-num{-moz-appearance:textfield;appearance:textfield}\r\n.dab-urlinput{flex:1;min-width:180px;height:34px;padding:0 12px;border-radius:10px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font-size:12.5px;outline:none;transition:border-color .2s}\r\n.dab-urlinput::placeholder{color:var(--dsw-alias-label-quaternary)}\r\n.dab-urlinput:focus{border-color:var(--dsw-alias-brand-primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--dsw-alias-brand-primary) 18%,transparent)}\r\n.dab-urlrow{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:12px;animation:dab-list-in .3s cubic-bezier(.22,1,.36,1) both}\r\n.dab-swatch-lg{height:38px;border-radius:10px;border:1px solid var(--dsw-alias-border-l2);box-shadow:inset 0 0 14px rgba(0,0,0,.1);transition:transform .3s ease}\r\n.dab-swatch-lg:hover{transform:scale(1.02)}\r\n\r\n/* ── buttons & chips ─────────────────────────────────────────────────────── */\r\n.dab-btn{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:34px;padding:0 14px;border-radius:10px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-elevated-fill);color:var(--dsw-alias-label-primary);font-size:12.5px;font-weight:550;cursor:pointer;transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease,opacity .18s ease,background .18s ease}\r\n.dab-btn:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 5px 14px -6px rgba(0,0,0,.32)}\r\n.dab-btn:active:not(:disabled){transform:translateY(0) scale(.97);box-shadow:none}\r\n.dab-btn:disabled{opacity:.5;cursor:not-allowed}\r\n.dab-btn-primary{background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-text);border-color:transparent}\r\n.dab-btn-danger{color:var(--dsw-alias-state-error-primary)}\r\n.dab-btn-danger-solid{background:var(--dsw-alias-state-error-primary);color:#fff;border-color:transparent}\r\n.dab-btn-danger-solid:hover:not(:disabled){background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 85%,#000)}\r\n.dab-btn-ghost{background:transparent;border-color:transparent;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\r\n.dab-btn-ghost:hover:not(:disabled){background:var(--dsw-alias-bg-layer-2);box-shadow:none}\r\n/* Soft solid button: subtle layer background instead of transparent ghost. */\r\n.dab-btn-soft{background:var(--dsw-alias-bg-layer-2);border-color:var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\r\n.dab-btn-soft:hover:not(:disabled){background:var(--dsw-alias-bg-layer-3,var(--dsw-alias-bg-layer-2));color:var(--dsw-alias-label-primary)}\r\n/* White background with error-red text (inverse of danger-solid). */\r\n.dab-btn-danger-inverted{background:#fff;color:var(--dsw-alias-state-error-primary);border-color:transparent}\r\n.dab-btn-danger-inverted:hover:not(:disabled){background:#f3f4f6}\r\n.dab-btn:focus-visible,.dab-nav-item:focus-visible,.dab-seg-item:focus-visible,.dab-swatch:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}\r\n.dab-chip-row{display:flex;flex-wrap:wrap;gap:8px}\r\n.dab-chip{height:30px;padding:0 14px;border-radius:99px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary));font-size:12px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;transition:background-color .22s ease,border-color .22s ease,color .22s ease}\r\n.dab-chip:hover{border-color:var(--dsw-alias-brand-primary);color:var(--dsw-alias-label-primary)}\r\n.dab-chip.is-active{background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-text);border-color:transparent}\r\n\r\n/* ── sliders ─────────────────────────────────────────────────────────────── */\r\n.dab-slider-block{display:flex;flex-direction:column;gap:6px}\r\n.dab-slider-block + .dab-slider-block{margin-top:13px}\r\n.dab-slider-label{font-size:12px;font-weight:550;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\r\n.dab-slider-val{font-family:var(--dab-mono);font-size:11px;color:var(--dsw-alias-label-tertiary);min-width:44px;text-align:right}\r\n.dab-slider{-webkit-appearance:none;appearance:none;flex:1;min-width:0;height:4px;border-radius:99px;outline:none;cursor:pointer;margin:5px 0;background:linear-gradient(to right,var(--dsw-alias-brand-primary) calc(var(--pct,50) * 1%),var(--dsw-alias-border-l2) calc(var(--pct,50) * 1%));transition:height .15s ease}\r\n.dab-slider:hover{height:5px}\r\n.dab-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:15px;height:15px;border-radius:50%;background:var(--dsw-alias-button-elevated-fill,#fff);border:2px solid var(--dsw-alias-brand-primary);box-shadow:0 1px 5px rgba(0,0,0,.28);transition:transform .16s cubic-bezier(.34,1.56,.64,1)}\r\n.dab-slider:hover::-webkit-slider-thumb,.dab-slider:focus-visible::-webkit-slider-thumb{transform:scale(1.22)}\r\n.dab-slider:active::-webkit-slider-thumb{transform:scale(1.34)}\r\n.dab-slider::-moz-range-thumb{width:13px;height:13px;border-radius:50%;background:var(--dsw-alias-button-elevated-fill,#fff);border:2px solid var(--dsw-alias-brand-primary)}\r\n\r\n/* ── interface part cards ────────────────────────────────────────────────── */\r\n.dab-grid-parts{display:grid;grid-template-columns:repeat(auto-fill,minmax(256px,1fr));gap:13px}\r\n.dab-part-head{display:flex;align-items:center;gap:11px;margin-bottom:14px}\r\n.dab-part-ico{width:32px;height:32px;flex:none;border-radius:10px;display:grid;place-items:center;color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-bg-layer-2);background:color-mix(in srgb,var(--dsw-alias-brand-primary) 12%,transparent)}\r\n.dab-part-name{font-size:13.5px;font-weight:600}\r\n.dab-part-badge{margin-left:auto;font-family:var(--dab-mono);font-size:11px;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2);border-radius:99px;padding:3px 9px}\r\n\r\n/* ── segmented control ───────────────────────────────────────────────────── */\r\n.dab-seg{position:relative;display:inline-flex;padding:3px;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:11px}\r\n.dab-seg-thumb{position:absolute;top:3px;bottom:3px;left:3px;width:var(--w,96px);border-radius:8px;background:var(--dsw-alias-button-elevated-fill);box-shadow:0 2px 8px -2px rgba(0,0,0,.28);transition:transform .32s cubic-bezier(.22,1,.36,1)}\r\n.dab-seg-item{position:relative;z-index:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;width:var(--w,96px);height:30px;border:0;background:none;border-radius:8px;color:var(--dsw-alias-label-tertiary);font-size:12.5px;cursor:pointer;transition:color .25s ease}\r\n.dab-seg-item.is-active{color:var(--dsw-alias-label-primary);font-weight:600}\r\n\r\n/* ── toggle switch ───────────────────────────────────────────────────────── */\r\n.dab-toggle{position:relative;width:42px;height:24px;flex:none;border-radius:99px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);cursor:pointer;padding:0;transition:background .28s ease,border-color .28s ease}\r\n.dab-toggle-knob{position:absolute;top:2.5px;left:2.5px;width:17px;height:17px;border-radius:50%;background:var(--dsw-alias-label-secondary,#999);box-shadow:0 1px 3px rgba(0,0,0,.3);transition:transform .28s cubic-bezier(.22,1,.36,1),background .28s ease}\r\n.dab-toggle.is-on{background:var(--dsw-alias-brand-primary);border-color:var(--dsw-alias-brand-primary)}\r\n.dab-toggle.is-on .dab-toggle-knob{transform:translateX(18px);background:#fff}\r\n\r\n/* ── background preview hero ─────────────────────────────────────────────── */\r\n.dab-hero{position:relative;border-radius:16px;overflow:hidden;aspect-ratio:16/9;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2)}\r\n.dab-hero-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;transition:transform .5s cubic-bezier(.22,1,.36,1)}\r\n.dab-hero:hover .dab-hero-img{transform:scale(1.03)}\r\n.dab-hero-empty{position:absolute;inset:6px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;color:var(--dsw-alias-label-tertiary);font-size:12.5px;border:1.5px dashed var(--dsw-alias-border-l2);border-radius:12px;cursor:pointer;background:transparent;transition:border-color .25s,color .25s,background .25s;width:auto;height:auto}\r\n.dab-hero-empty:hover{border-color:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-primary)}\r\n.dab-hero-empty.is-over{border-color:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-primary);background:color-mix(in srgb,var(--dsw-alias-brand-primary) 8%,transparent)}\r\n.dab-hero-badge{position:absolute;top:10px;left:10px;display:inline-flex;align-items:center;gap:5px;height:24px;padding:0 11px;border-radius:99px;background:rgba(0,0,0,.45);color:#fff;font-size:11px;backdrop-filter:blur(6px);pointer-events:none}\r\n.dab-hero-veil{position:absolute;left:0;right:0;bottom:0;padding:34px 12px 12px;display:flex;align-items:flex-end;justify-content:flex-end;gap:8px;background:linear-gradient(to top,rgba(0,0,0,.55),rgba(0,0,0,0));opacity:0;transform:translateY(6px);transition:opacity .3s ease,transform .3s ease}\r\n.dab-hero:hover .dab-hero-veil{opacity:1;transform:none}\r\n.dab-hero-veil .dab-btn{background:rgba(255,255,255,.94);color:#14161a;border-color:transparent;height:30px;font-size:12px}\r\n.dab-hero-veil .dab-btn-danger{color:#dc2626}\r\n\r\n/* ── generated background type cards ─────────────────────────────────────── */\r\n.dab-types{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}\r\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;animation:dab-type-in .42s cubic-bezier(.22,1,.36,1) both;animation-delay:calc(var(--i,0) * 60ms)}\r\n.dab-type:hover{transform:translateY(-2px)}\r\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)}\r\n.dab-type-thumb{height:62px;border-radius:9px;overflow:hidden;position:relative}\r\n.dab-type-name{margin-top:9px;font-size:12.5px;font-weight:600;color:var(--dsw-alias-label-primary)}\r\n.dab-type-desc{margin-top:2px;font-size:11px;color:var(--dsw-alias-label-tertiary);line-height:1.4}\r\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)}\r\n.dab-type.is-active .dab-type-check{opacity:1;transform:none}\r\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}\r\n.dab-thumb-shader{background:linear-gradient(120deg,#0ea5e9,#8b5cf6,#d946ef,#0ea5e9);background-size:300% 300%;animation:dab-flow 6s linear infinite}\r\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}\r\n\r\n/* ── seed row ────────────────────────────────────────────────────────────── */\r\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}\r\n.dab-seed-ico{color:var(--dsw-alias-brand-primary);display:grid;place-items:center}\r\n.dab-seed-txt{flex:1;min-width:0}\r\n.dab-seed-title{font-size:12.5px;font-weight:600;display:flex;align-items:center;gap:6px}\r\n.dab-seed-desc{font-size:11px;color:var(--dsw-alias-label-tertiary);margin-top:2px}\r\n.dab-spin{animation:dab-rotate .7s cubic-bezier(.3,.7,.3,1) 1}\r\n\r\n/* ── profile page ────────────────────────────────────────────────────────── */\r\n.dab-profile-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(238px,1fr));gap:13px}\r\n.dab-profile-ico{width:38px;height:38px;border-radius:11px;display:grid;place-items:center;margin-bottom:13px;color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-bg-layer-2);background:color-mix(in srgb,var(--dsw-alias-brand-primary) 12%,transparent)}\r\n.dab-profile-title{font-size:14px;font-weight:650}\r\n.dab-profile-desc{font-size:12px;color:var(--dsw-alias-label-tertiary);line-height:1.55;margin:5px 0 15px}\r\n.dab-footer{margin-top:6px;padding:14px 4px 0;border-top:1px solid var(--dsw-alias-border-l2);display:flex;align-items:center;justify-content:space-between;font-size:11px;color:var(--dsw-alias-label-tertiary)}\r\n.dab-footer-mono{font-family:var(--dab-mono);letter-spacing:.02em}\r\n\r\n/* ── presets / profiles / schedule / rotation ────────────────────────────── */\r\n.dab-row-head{display:flex;align-items:center;justify-content:space-between;gap:12px}\r\n.dab-preset-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px}\r\n.dab-preset{display:flex;flex-direction:column;align-items:flex-start;gap:3px;padding:12px;border:1.5px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:13px;cursor:pointer;font:inherit;text-align:left;transition:border-color .25s,transform .25s,box-shadow .25s;animation:dab-row-in .34s cubic-bezier(.22,1,.36,1) both;animation-delay:calc(var(--i,0) * 45ms)}\r\n.dab-preset:hover{transform:translateY(-2px);border-color:var(--dsw-alias-brand-primary);box-shadow:0 8px 22px -12px rgba(0,0,0,.3)}\r\n.dab-preset-dot{width:22px;height:22px;border-radius:50%;margin-bottom:4px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.12),0 4px 10px -4px rgba(0,0,0,.35);background:var(--dsw-alias-bg-layer-2);display:grid;place-items:center;color:var(--dsw-alias-label-tertiary)}\r\n.dab-preset-name{font-size:12.5px;font-weight:600;color:var(--dsw-alias-label-primary)}\r\n.dab-preset-desc{font-size:10.5px;line-height:1.45;color:var(--dsw-alias-label-tertiary)}\r\n.dab-profile-list{display:flex;flex-direction:column;gap:8px;margin-top:12px;animation:dab-list-in .38s cubic-bezier(.22,1,.36,1) both}\r\n.dab-profile-row{display:flex;align-items:center;gap:11px;padding:9px 12px;border:1px solid var(--dsw-alias-border-l2);border-radius:12px;background:var(--dsw-alias-bg-layer-2);animation:dab-row-in .34s cubic-bezier(.22,1,.36,1) both;animation-delay:calc(var(--i,0) * 45ms);transition:border-color .22s ease,background .22s ease}\r\n.dab-profile-row:hover{border-color:color-mix(in srgb,var(--dsw-alias-brand-primary) 28%,transparent);background:color-mix(in srgb,var(--dsw-alias-label-primary) 4%,var(--dsw-alias-bg-layer-2))}\r\n.dab-profile-row.is-active{border-color:color-mix(in srgb,var(--dsw-alias-brand-primary) 45%,transparent);background:color-mix(in srgb,var(--dsw-alias-brand-primary) 7%,var(--dsw-alias-bg-layer-2))}\r\n.dab-profile-dot{width:22px;height:22px;flex:none;border-radius:50%;background:var(--dsw-alias-bg-layer-1);box-shadow:inset 0 0 0 1px rgba(0,0,0,.12);display:grid;place-items:center;color:var(--dsw-alias-label-tertiary)}\r\n.dab-profile-meta{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}\r\n.dab-profile-name{font-size:12.5px;font-weight:600;color:var(--dsw-alias-label-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\r\n.dab-profile-sub{font-family:var(--dab-mono);font-size:10px;color:var(--dsw-alias-label-tertiary)}\r\n.dab-btn-confirm{background:var(--dsw-alias-state-error-primary)!important;color:#fff!important;border-color:transparent!important}\r\n.dab-select{height:32px;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-size:12px;outline:none;cursor:pointer;max-width:180px}\r\n.dab-select:focus{border-color:var(--dsw-alias-brand-primary)}\r\n.dab-timeinput{height:32px;padding:0 8px;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}\r\n.dab-timeinput:focus{border-color:var(--dsw-alias-brand-primary)}\r\n/* Collapsible panel: animates grid-template-rows 0fr→1fr so the schedule\r\n block unfolds to its content height instead of popping in. visibility\r\n flips after the fold finishes (and instantly on open) so hidden inputs\r\n are never focusable. */\r\n.dab-schedule-wrap{display:grid;grid-template-rows:0fr;visibility:hidden;transition:grid-template-rows .42s cubic-bezier(.22,1,.36,1),visibility 0s linear .42s}\r\n.dab-schedule-wrap.is-open{grid-template-rows:1fr;visibility:visible;transition:grid-template-rows .42s cubic-bezier(.22,1,.36,1)}\r\n.dab-schedule-clip{overflow:hidden;min-height:0;opacity:0;transition:opacity .28s ease}\r\n.dab-schedule-wrap.is-open .dab-schedule-clip{opacity:1;transition:opacity .32s ease .1s}\r\n.dab-schedule-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:16px;padding-top:12px}\r\n.dab-schedule-cell{min-width:0;animation:dab-row-in .34s cubic-bezier(.22,1,.36,1) both;animation-delay:calc(var(--i,0) * 60ms)}\r\n.dab-time-row{display:flex;flex-direction:column;gap:9px}\r\n.dab-time-label{display:flex;align-items:center;gap:7px;font-size:12px;color:var(--dsw-alias-label-secondary,var(--dsw-alias-label-tertiary))}\r\n.dab-time-label svg{color:var(--dsw-alias-brand-primary);flex:none}\r\n.dab-time-label .dab-select,.dab-time-label .dab-timeinput{flex:1;min-width:0}\r\n.dab-thumbstrip{display:flex;flex-wrap:wrap;gap:9px;margin-top:13px}\r\n.dab-thumb{position:relative;width:64px;height:44px;border-radius:9px;overflow:hidden;border:1.5px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);display:grid;place-items:center;color:var(--dsw-alias-label-tertiary);animation:dab-list-in .3s cubic-bezier(.22,1,.36,1) both}\r\n.dab-thumb.is-current{border-color:var(--dsw-alias-brand-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--dsw-alias-brand-primary) 25%,transparent)}\r\n.dab-thumb img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}\r\n.dab-thumb-x{position:absolute;top:2px;right:2px;width:16px;height:16px;border:0;border-radius:50%;background:rgba(0,0,0,.55);color:#fff;cursor:pointer;display:grid;place-items:center;opacity:0;transition:opacity .18s ease,background .18s ease;padding:0}\r\n.dab-thumb:hover .dab-thumb-x{opacity:1}\r\n.dab-thumb-x:hover{background:var(--dsw-alias-state-error-primary)}\r\n.dab-thumb-add{border-style:dashed;cursor:pointer;background:transparent;color:var(--dsw-alias-label-tertiary);font:inherit;transition:border-color .22s ease,color .22s ease}\r\n.dab-thumb-add:hover{border-color:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-primary)}\r\n.dab-chip-sep{width:1px;height:18px;background:var(--dsw-alias-border-l2);margin:0 4px;flex:none}\r\n\r\n/* ── toast ───────────────────────────────────────────────────────────────── */\r\n.dab-toast{position:fixed;left:50%;bottom:30px;transform:translateX(-50%);display:flex;align-items:center;gap:8px;height:38px;padding:0 16px;border-radius:99px;background:var(--dsw-alias-bg-layer-3,var(--dsw-alias-bg-layer-2));border:1px solid var(--dsw-alias-border-l2);box-shadow:0 10px 30px -8px rgba(0,0,0,.38);font-size:12.5px;z-index:10001;animation:dab-toast-in .32s cubic-bezier(.22,1,.36,1) both}\r\n.dab-toast-ok{color:var(--dsw-alias-brand-primary);display:grid;place-items:center}\r\n.dab-toast-err{color:var(--dsw-alias-state-error-primary);display:grid;place-items:center}\r\n\r\n/* ── modals (editor / eyedropper / crash) ────────────────────────────────── */\r\n/* Pin to the viewport explicitly with vw/vh so ancestor padding/margins on\r\n * body cannot shift or clip the overlay; keep it above host sidebar chrome.\r\n * pointer-events:auto re-enables interaction: these overlays render inside a\r\n * Portal root that is pointer-events:none so it never blocks the page alone. */\r\n.dab-overlay{position:fixed;left:0;top:0;width:100vw;height:100vh;z-index:999999;background:rgba(8,10,14,.62);backdrop-filter:blur(8px);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;animation:dab-fade-in .25s ease both;pointer-events:auto}\r\n.dab-overlay-title{color:#fff;font-size:15px;font-weight:600}\r\n.dab-overlay-hint{color:rgba(255,255,255,.62);font-size:12px}\r\n.dab-modal-card{animation:dab-zoom-in .3s cubic-bezier(.22,1,.36,1) both;max-width:calc(100vw - 40px);max-height:calc(100vh - 120px);overflow:auto}\r\n.dab-overlay .dab-btn{background:rgba(255,255,255,.94);color:#14161a;border-color:transparent}\r\n.dab-overlay .dab-btn-primary{background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-brand-text)}\r\n.dab-crash{display:flex;flex-direction:column;gap:10px;align-items:center;padding:28px 18px;border:1px solid var(--dsw-alias-border-l2);border-radius:16px}\r\n.dab-crash-title{font-size:15px;font-weight:650}\r\n.dab-crash-desc{font-size:12px;color:var(--dsw-alias-label-tertiary);text-align:center;line-height:1.5}\r\n\r\n/* ── keyframes ───────────────────────────────────────────────────────────── */\r\n@keyframes dab-fade-in{from{opacity:0}to{opacity:1}}\r\n@keyframes dab-page-in{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}\r\n@keyframes dab-rise-in{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}\r\n@keyframes dab-list-in{from{opacity:0;transform:translateY(-7px)}to{opacity:1;transform:none}}\r\n@keyframes dab-row-in{from{opacity:0;transform:translateY(6px) scale(.985)}to{opacity:1;transform:none}}\n@keyframes dab-type-in{from{opacity:0;transform:translateY(8px) scale(.97)}to{opacity:1;transform:none}}\r\n@keyframes dab-orb-in{from{opacity:0;transform:scale(.82)}to{opacity:1;transform:none}}\r\n@keyframes dab-spin{to{transform:rotate(360deg)}}\r\n@keyframes dab-rotate{to{transform:rotate(360deg)}}\r\n@keyframes dab-toast-in{from{opacity:0;transform:translate(-50%,10px)}to{opacity:1;transform:translate(-50%,0)}}\r\n@keyframes dab-zoom-in{from{opacity:0;transform:scale(.94) translateY(8px)}to{opacity:1;transform:none}}\r\n@keyframes dab-flow{to{background-position:300% 50%}}\r\n\r\n/* ── responsive & motion preferences ─────────────────────────────────────── */\r\n@container (max-width:620px){\r\n .dab-shell{grid-template-columns:1fr;gap:14px}\r\n .dab-nav{position:static;flex-direction:row;align-items:center;justify-content:space-between;gap:10px}\r\n .dab-nav-list{flex-direction:row;overflow-x:auto;scrollbar-width:none}\r\n .dab-nav-list::-webkit-scrollbar{display:none}\r\n .dab-nav-ind{display:none}\r\n .dab-nav-item{flex:none;padding:0 10px}\r\n .dab-nav-item.is-active{background:var(--dsw-alias-bg-layer-2)}\r\n .dab-types{grid-template-columns:1fr}\r\n}\r\n@container (min-width:621px){\r\n .dab-shell{grid-template-columns:158px minmax(0,1fr);gap:26px}\r\n}\r\n@media (prefers-reduced-motion:reduce){\r\n .dab-root *,.dab-root *::before,.dab-root *::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}\r\n}\r\n`\r\n\r\nconst CSS_ID = 'dab-ui-css'\r\n\r\n/** Inject the design-system stylesheet once per document (HMR-safe). */\r\nexport function ensureUiCss(): void {\r\n if (typeof document === 'undefined') return\r\n let el = document.getElementById(CSS_ID) as HTMLStyleElement | null\r\n if (!el) {\r\n el = document.createElement('style')\r\n el.id = CSS_ID\r\n document.head.appendChild(el)\r\n }\r\n if (el.textContent !== UI_CSS) el.textContent = UI_CSS\r\n}\r\n","import type { ReactNode } from 'react'\r\n\r\n/** Sun glyph, migrated from @deepseek-ai/dsh-client-ui-primitives IconLightOutline16. */\r\nexport const SUN_PATHS = '<path d=\"M11.3496 8C11.3496 6.14985 9.85015 4.65039 8 4.65039C6.14985 4.65039 4.65039 6.14985 4.65039 8C4.65039 9.85015 6.14985 11.3496 8 11.3496C9.85015 11.3496 11.3496 9.85015 11.3496 8ZM12.6504 8C12.6504 10.5681 10.5681 12.6504 8 12.6504C5.43188 12.6504 3.34961 10.5681 3.34961 8C3.34961 5.43188 5.43188 3.34961 8 3.34961C10.5681 3.34961 12.6504 5.43188 12.6504 8Z\" fill=\"currentColor\"/><path d=\"M8.65039 0.5V2.5H7.34961V0.5H8.65039Z\" fill=\"currentColor\"/><path d=\"M8.65039 13.5V15.5H7.34961V13.5H8.65039Z\" fill=\"currentColor\"/><path d=\"M3.15808 2.24035L4.57229 3.65456L3.6525 4.57435L2.23829 3.16014L3.15808 2.24035Z\" fill=\"currentColor\"/><path d=\"M12.3505 11.4327L13.7647 12.8469L12.8449 13.7667L11.4307 12.3525L12.3505 11.4327Z\" fill=\"currentColor\"/><path d=\"M2.24537 12.8469L3.65958 11.4327L4.57937 12.3525L3.16516 13.7667L2.24537 12.8469Z\" fill=\"currentColor\"/><path d=\"M11.4377 3.65455L12.852 2.24033L13.7718 3.16012L12.3575 4.57434L11.4377 3.65455Z\" fill=\"currentColor\"/><path d=\"M0.5 7.35461H2.5V8.6554H0.5L0.5 7.35461Z\" fill=\"currentColor\"/><path d=\"M13.5 7.35461H15.5V8.6554H13.5V8.6554Z\" fill=\"currentColor\"/>'\r\n\r\nexport function SunIcon({ size = 16, className }: { size?: number; className?: string }) {\r\n return (\r\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" dangerouslySetInnerHTML={{ __html: SUN_PATHS }} />\r\n )\r\n}\r\n\r\nfunction Glyph({ children, size = 16, className }: { children: ReactNode; size?: number; className?: string }) {\r\n return (\r\n <svg width={size} height={size} className={className} viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\r\n {children}\r\n </svg>\r\n )\r\n}\r\n\r\nexport const DropletIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M8 1.9c2.4 2.8 4.3 5 4.3 7.1a4.3 4.3 0 1 1-8.6 0C3.7 6.9 5.6 4.7 8 1.9z\" /></Glyph>\r\n)\r\n\r\nexport const LayersIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M8 2.2 13.2 5 8 7.8 2.8 5 8 2.2z\" /><path d=\"M2.8 8.2 8 11l5.2-2.8\" /><path d=\"M2.8 11.2 8 14l5.2-2.8\" /></Glyph>\r\n)\r\n\r\nexport const PhotoIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"2\" y=\"3.2\" width=\"12\" height=\"9.6\" rx=\"2\" /><circle cx=\"5.7\" cy=\"6.3\" r=\"0.9\" /><path d=\"M14 10.4l-2.8-2.8-4.8 4.8\" /></Glyph>\r\n)\r\n\r\nexport const VideoIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"1.5\" y=\"4.2\" width=\"8.8\" height=\"7.6\" rx=\"2\" /><path d=\"M10.3 6.9l4.2-2.4v7l-4.2-2.4\" /></Glyph>\r\n)\r\n\r\nexport const TextIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M3 4.2h10M3 8h10M3 11.8h6.5\" /></Glyph>\r\n)\r\n\r\nexport const TrajectoryIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M2.5 3.2h11M2.5 6.6h11M2.5 10h11\" /><circle cx=\"4.4\" cy=\"3.2\" r=\"1.1\" /><circle cx=\"8\" cy=\"6.6\" r=\"1.1\" /><circle cx=\"11.4\" cy=\"10\" r=\"1.1\" /></Glyph>\r\n)\r\n\r\nexport const SlidersIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M2.5 4.5h4.9M11.6 4.5h1.9M2.5 11.5h1.9M8.6 11.5h4.9\" /><circle cx=\"9.5\" cy=\"4.5\" r=\"1.7\" /><circle cx=\"5.5\" cy=\"11.5\" r=\"1.7\" /></Glyph>\r\n)\r\n\r\nexport const SparkleIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M7.2 1.8l1.2 3.1 3.1 1.2-3.1 1.2-1.2 3.1-1.2-3.1L2.9 6.1 6 4.9l1.2-3.1z\" /><path d=\"M12 10.5l.5 1.2 1.2.5-1.2.5-.5 1.2-.5-1.2-1.2-.5 1.2-.5.5-1.2z\" /></Glyph>\r\n)\r\n\r\nexport const RefreshIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M13.2 8A5.2 5.2 0 1 1 11.5 4.2\" /><path d=\"M13.4 1.8v2.9h-2.9\" /></Glyph>\r\n)\r\n\r\nexport const DownloadIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M8 2.2v8\" /><path d=\"M4.6 7l3.4 3.4L11.4 7\" /><path d=\"M2.8 13.8h10.4\" /></Glyph>\r\n)\r\n\r\nexport const UploadIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M8 10.4V2.6\" /><path d=\"M4.6 5.8L8 2.4l3.4 3.4\" /><path d=\"M2.8 13.8h10.4\" /></Glyph>\r\n)\r\n\r\nexport const LinkIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M6.6 9.4 9.4 6.6\" /><path d=\"M5.9 11.1l-1.4 1.4a2.6 2.6 0 0 1-3.7-3.7L3.5 6.8\" /><path d=\"M10.1 4.9l1.4-1.4a2.6 2.6 0 0 1 3.7 3.7l-2.1 2.1\" /></Glyph>\r\n)\r\n\r\nexport const LockIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"3.6\" y=\"7.2\" width=\"8.8\" height=\"6\" rx=\"1.4\" /><path d=\"M5.6 7.2V5.4a2.4 2.4 0 0 1 4.8 0v1.8\" /></Glyph>\r\n)\r\n\r\nexport const TrashIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M2.8 4.4h10.4\" /><path d=\"M6.4 4.4V2.9h3.2v1.5\" /><path d=\"M4.4 4.4l.5 8.6h6.2l.5-8.6\" /></Glyph>\r\n)\r\n\r\nexport const EditIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M9.5 4l2.5 2.5\" /><path d=\"M3 13l.8-3L10 3.8 12.2 6 6 12.2 3 13z\" /></Glyph>\r\n)\r\n\r\nexport const PipetteIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><circle cx=\"8\" cy=\"8\" r=\"4.2\" /><path d=\"M8 1.6v2.6M8 11.8v2.6M1.6 8h2.6M11.8 8h2.6\" /></Glyph>\r\n)\r\n\r\nexport const CheckIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M3.2 8.6l3 3L12.8 5\" /></Glyph>\r\n)\r\n\r\nexport const AlertIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M8 2.6l5.4 9.8H2.6L8 2.6z\" /><path d=\"M8 6.8v2.4M8 11.4v.01\" /></Glyph>\r\n)\r\n\r\nexport const CanvasIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"2.2\" y=\"2.2\" width=\"11.6\" height=\"11.6\" rx=\"2\" /></Glyph>\r\n)\r\n\r\nexport const SidebarIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"2.2\" y=\"2.2\" width=\"11.6\" height=\"11.6\" rx=\"2\" /><path d=\"M6.6 2.2v11.6\" /></Glyph>\r\n)\r\n\r\nexport const ChatIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M13.4 4.4v4.4a2 2 0 0 1-2 2H6.2l-3.6 3V4.4a2 2 0 0 1 2-2h6.8a2 2 0 0 1 2 2z\" /></Glyph>\r\n)\r\n\r\nexport const GearIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><circle cx=\"8\" cy=\"8\" r=\"2.1\" /><path d=\"M8 1.7v1.8M8 12.5v1.8M1.7 8h1.8M12.5 8h1.8M3.6 3.6l1.3 1.3M11.1 11.1l1.3 1.3M12.4 3.6l-1.3 1.3M4.9 11.1l-1.3 1.3\" /></Glyph>\r\n)\r\n\r\nexport const InputIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><rect x=\"2.2\" y=\"4\" width=\"11.6\" height=\"8\" rx=\"2\" /><path d=\"M8 6.6v2M7 8h2\" /></Glyph>\r\n)\r\n\r\nexport const PlusIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M8 3v10M3 8h10\" /></Glyph>\r\n)\r\n\r\nexport const MoonIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M13.2 9.6A5.6 5.6 0 0 1 6.4 2.8a5.6 5.6 0 1 0 6.8 6.8z\" /></Glyph>\r\n)\r\n\r\nexport const ClockIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><circle cx=\"8\" cy=\"8\" r=\"5.8\" /><path d=\"M8 4.8V8l2.2 1.6\" /></Glyph>\r\n)\r\n\r\nexport const XIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M4 4l8 8M12 4l-8 8\" /></Glyph>\r\n)\r\n\r\nexport const PlayIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M5.2 3.4l7.4 4.6-7.4 4.6V3.4z\" /></Glyph>\r\n)\r\n\r\nexport const PauseIcon = ({ size, className }: { size?: number; className?: string }) => (\r\n <Glyph size={size} className={className}><path d=\"M5.4 3.4v9.2M10.6 3.4v9.2\" /></Glyph>\r\n)\r\n\r\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'\r\nimport type { CSSProperties } from 'react'\r\nimport type { ThemeSectionProps, ThemeStoreState } from '../../types'\r\nimport { hsvToHsl, hslToRgb, hslToHsv } from '../../utils/color'\r\nimport { ColorWheel } from '../ColorWheel'\r\nimport { ColorInputs } from '../ColorInputs'\r\nimport { ColorPicker } from '../ColorPicker'\r\nimport { PipetteIcon, SparkleIcon } from '../icons'\r\n\r\n/** Curated quick-pick hues (HSL, s .72 l .55). */\r\nconst SWATCHES: Array<[number, number, number]> = [\r\n [356, 0.72, 0.55], [24, 0.78, 0.55], [44, 0.8, 0.55], [152, 0.62, 0.5],\r\n [174, 0.68, 0.48], [208, 0.72, 0.55], [252, 0.68, 0.6], [300, 0.64, 0.58],\r\n]\r\n\r\nfunction toHex(rgb: [number, number, number]): string {\r\n return '#' + rgb.map(v => Math.round(v).toString(16).padStart(2, '0')).join('')\r\n}\r\n\r\nexport function ColorPage({ p, notify }: { p: ThemeSectionProps; notify: (msg: string, ok?: boolean) => void }) {\r\n const { t, hue, sat, lit, setColor, extractColor, setSchemeOverride, useStore } = p\r\n // Field-level subscriptions: only url (extract/eyedropper gating), the forced\r\n // scheme and the stored color change this page's output.\r\n const storeUrl = useStore((s: ThemeStoreState) => s.url)\r\n const schemeOverride = useStore((s: ThemeStoreState) => s.schemeOverride)\r\n const color = useStore((s: ThemeStoreState) => s.color)\r\n const [pickerOpen, setPickerOpen] = useState(false)\r\n const [extracting, setExtracting] = useState(false)\r\n\r\n const wheel = (color ?? [hue, sat, lit]) as [number, number, number]\r\n const [h, s, l] = hsvToHsl(wheel[0], wheel[1], wheel[2])\r\n const [r, g, b] = hslToRgb(h, s, l)\r\n const hex = toHex([r, g, b])\r\n const soft = `rgba(${Math.round(r)},${Math.round(g)},${Math.round(b)},0.5)`\r\n const orbVars = { '--c': hex, '--c-soft': soft } as CSSProperties\r\n\r\n const onExtract = async () => {\r\n if (!storeUrl || extracting) return\r\n setExtracting(true)\r\n try {\r\n const ok = await extractColor()\r\n notify(ok ? t('extractDone') : t('extractFail'), ok)\r\n } catch {\r\n notify(t('extractFail'), false)\r\n } finally {\r\n setExtracting(false)\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n <header className=\"dab-head dab-rise\" style={{ '--d': 0 } as CSSProperties}>\r\n <div className=\"dab-overline\">Accent</div>\r\n <h2 className=\"dab-h1\">{t('colorTitle')}</h2>\r\n <p className=\"dab-desc\">{t('descColor')}</p>\r\n </header>\r\n\r\n {/* Hero: living orb with a rotating conic halo + live HEX readout */}\r\n <section className=\"dab-card dab-card-hover dab-hero-accent dab-rise\" style={{ '--d': 1 } as CSSProperties}>\r\n <div className=\"dab-orb-wrap\" style={orbVars}>\r\n <div className=\"dab-orb-ring\" />\r\n <div className=\"dab-orb\" />\r\n </div>\r\n <div style={{ flex: 1, minWidth: 200 }}>\r\n <div className=\"dab-hex-caption\">{t('hexCaption')}</div>\r\n <div className=\"dab-hex\">{hex.toUpperCase()}</div>\r\n <div className=\"dab-hsl-row\">\r\n <span>H <b>{Math.round(h)}°</b></span>\r\n <span>S <b>{Math.round(s * 100)}%</b></span>\r\n <span>L <b>{Math.round(l * 100)}%</b></span>\r\n </div>\r\n <div className=\"dab-chip-row\" style={{ marginTop: 14 }}>\r\n <button type=\"button\" className=\"dab-btn\" disabled={!storeUrl || extracting} onClick={onExtract}>\r\n <SparkleIcon size={14} />{extracting ? t('extracting') : t('extractColor')}\r\n </button>\r\n <button type=\"button\" className=\"dab-btn\" disabled={!storeUrl} onClick={() => setPickerOpen(true)}>\r\n <PipetteIcon size={14} />{t('eyedropper')}\r\n </button>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n {/* Wheel + precise entry */}\r\n <section className=\"dab-card dab-wheel-card dab-rise\" style={{ '--d': 2 } as CSSProperties}>\r\n <div className=\"dab-wheel-glow\" style={{ background: hex }} />\r\n <ColorWheel hue={wheel[0]} sat={wheel[1]} lit={wheel[2]} onChange={setColor} />\r\n <ColorInputs hue={wheel[0]} sat={wheel[1]} lit={wheel[2]} onChange={setColor} />\r\n </section>\r\n <p className=\"dab-hint dab-rise\" style={{ '--d': 3 } as CSSProperties}>{t('colorHint')}</p>\r\n\r\n {/* Quick swatches */}\r\n <section className=\"dab-card dab-card-hover dab-rise\" style={{ '--d': 3 } as CSSProperties}>\r\n <div className=\"dab-swatch-title\">{t('swatchTitle')}</div>\r\n <div className=\"dab-swatches\">\r\n {SWATCHES.map(([sh, ss, sl], i) => {\r\n // Circular hue distance via the (Δ+540)%360 trick. A swatch is \"on\"\r\n // only when the current color actually matches it (hue within 3°,\r\n // sat/lightness within 0.05). Picking a custom color in the wheel\r\n // clears the swatch selection instead of keeping it highlighted\r\n // based on hue proximity alone.\r\n const dist = Math.abs(((wheel[0] - sh + 540) % 360) - 180)\r\n const on = dist < 3 && Math.abs(s - ss) < 0.05 && Math.abs(l - sl) < 0.05\r\n return (\r\n <button\r\n key={i} type=\"button\"\r\n className={`dab-swatch${on ? ' is-on' : ''}`}\r\n style={{ background: `hsl(${sh} ${Math.round(ss * 100)}% ${Math.round(sl * 100)}%)` }}\r\n title={toHex(hslToRgb(sh, ss, sl)).toUpperCase()}\r\n onClick={() => setColor(...hslToHsv(sh, ss, sl))} />\r\n )\r\n })}\r\n </div>\r\n </section>\r\n\r\n {/* Forced interface scheme */}\r\n <section className=\"dab-card dab-rise\" style={{ '--d': 4 } as CSSProperties}>\r\n <div className=\"dab-swatch-title\">{t('schemeTitle')}</div>\r\n <div className=\"dab-seg\" style={{ '--w': '86px' } as CSSProperties}>\r\n <div className=\"dab-seg-thumb\" style={{ transform: `translateX(${schemeOverride === 'light' ? 0 : schemeOverride === 'dark' ? 86 : 172}px)` }} />\r\n <button type=\"button\" className={`dab-seg-item${schemeOverride === 'light' ? ' is-active' : ''}`} onClick={() => setSchemeOverride('light')}>{t('schemeLight')}</button>\r\n <button type=\"button\" className={`dab-seg-item${schemeOverride === 'dark' ? ' is-active' : ''}`} onClick={() => setSchemeOverride('dark')}>{t('schemeDark')}</button>\r\n <button type=\"button\" className={`dab-seg-item${schemeOverride === 'auto' ? ' is-active' : ''}`} onClick={() => setSchemeOverride('auto')}>{t('schemeAuto')}</button>\r\n </div>\r\n <p className=\"dab-hint\" style={{ marginTop: 10 }}>{t('schemeHint')}</p>\r\n </section>\r\n\r\n {/* Eyedropper modal */}\r\n {pickerOpen && storeUrl ? (\r\n <ColorPicker url={storeUrl} t={t} onClose={() => setPickerOpen(false)}\r\n onPick={hsv => { setColor(hsv[0], hsv[1], hsv[2]); setPickerOpen(false) }} />\r\n ) : null}\r\n </>\r\n )\r\n}\r\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, rChatTextOpacity, rTrajectoryOpacity } from '../../state'\nimport { saveConfig } from '../../rpc'\nimport { applyCustomTokens, applySettingsOverrides, setPartBlur, applyViewCards, applyTrajectoryOverrides } from '../../wallpaper'\nimport { LiveSlider } from '../LiveSlider'\nimport { CanvasIcon, SidebarIcon, ChatIcon, GearIcon, TextIcon, TrajectoryIcon, InputIcon } 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 /** Conversation text region: tint opacity + blur over the message column. */\n isChat?: boolean\n /** Trajectory view: tint opacity + blur over the whole view surface. */\n isTrajectory?: 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 { opKey: 'input', labelKey: 'uiOpacityInput', Icon: InputIcon },\n { isSettings: true, labelKey: 'uiSop', Icon: GearIcon },\n { isChat: true, labelKey: 'uiChatRegion', Icon: TextIcon },\n { isTrajectory: true, labelKey: 'uiTrajectory', Icon: TrajectoryIcon },\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, isChat, isTrajectory } = part\n const opKey = part.opKey\n // Homepage parts (bg/sidebar/card/input) bind to their own part only;\n // the settings panel (isSettings) binds exclusively to the 'settings'\n // part (--dsh-any-blur-settings / --dsh-any-bg-settings-surface) and\n // must never fall back to a homepage part key — otherwise the dialog\n // panel would track the homepage center/card blur and the home-page\n // opacities. The chat region (isChat) and the trajectory view\n // (isTrajectory) own their own blur keys plus their own tint\n // opacities. Every homepage opKey is also a PartBlurs key (input\n // included), so the shared blur slider dereferences it directly.\n const blurKey: keyof PartBlurs = isChat ? 'chat' : isTrajectory ? 'trajectory' : isSettings ? 'settings' : opKey!\n const opacity = isChat ? rChatTextOpacity() : isTrajectory ? rTrajectoryOpacity() : 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 (isChat) {\n cfg.chatTextOpacity = op\n applyViewCards()\n } else if (isTrajectory) {\n cfg.trajectoryOpacity = op\n applyTrajectoryOverrides(op)\n } else 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 (isChat) {\n cfg.chatTextOpacity = op\n applyViewCards()\n saveConfig()\n } else if (isTrajectory) {\n cfg.trajectoryOpacity = op\n applyTrajectoryOverrides(op)\n saveConfig()\n } else 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","import { useRef, useState, useEffect, useCallback } from 'react'\r\nimport { cfg } from '../state'\r\nimport { Portal } from './Portal'\r\n\r\n/** Placement slot for the active background type: video framing lives in its\r\n * own state so image and video edits never overwrite each other. */\r\nconst activeState = () => cfg.backgroundType === 'video' ? cfg.videoBgState : cfg.bgState\r\n\r\nexport function BgEditor({ url, t, onClose, onCommit }: {\r\n url: string; t: (key: string) => string; onClose: () => void\r\n onCommit: (zoom: number, x: number, y: number, iw: number, ih: number) => void\r\n}) {\r\n const pw = Math.min(window.innerWidth * 0.75, 860)\r\n const ph = Math.round(pw * window.innerHeight / window.innerWidth)\r\n const saved = activeState()\r\n const [zoom, setZoom] = useState(saved.iw > 0 ? saved.zoom : 1)\r\n const [pos, setPos] = useState(saved.iw > 0 ? { x: saved.x * pw, y: saved.y * ph } : { x: 0, y: 0 })\r\n const [imgSize, setImgSize] = useState({ w: 0, h: 0 })\r\n const containerRef = useRef<HTMLDivElement>(null)\r\n const imgRef = useRef<HTMLImageElement>(null)\r\n const dragRef = useRef({ active: false, sx: 0, sy: 0, spx: 0, spy: 0 })\r\n\r\n useEffect(() => {\r\n const img = new Image()\r\n img.onload = () => {\r\n const scale = Math.min(pw / img.width, ph / img.height)\r\n const w = img.width * scale, h = img.height * scale\r\n setImgSize({ w, h })\r\n const s = activeState()\r\n if (s.iw > 0 && s.iw === img.width && s.ih === img.height) {\r\n setZoom(s.zoom)\r\n // Saved x, y are CENTER fractions of the preview: the image center\r\n // lands at (x·pw, y·ph), so the top-left comes from subtracting half\r\n // the displayed (zoom-scaled) image size.\r\n setPos({ x: s.x * pw - w * s.zoom / 2, y: s.y * ph - h * s.zoom / 2 })\r\n } else {\r\n setZoom(1)\r\n setPos({ x: (pw - w) / 2, y: (ph - h) / 2 })\r\n }\r\n }\r\n img.src = url\r\n }, [url, pw, ph])\r\n\r\n const onDown = useCallback((e: React.MouseEvent) => {\r\n e.preventDefault()\r\n dragRef.current = { active: true, sx: e.clientX, sy: e.clientY, spx: pos.x, spy: pos.y }\r\n const onMove = (ev: MouseEvent) => {\r\n if (!dragRef.current.active) return\r\n setPos({ x: dragRef.current.spx + ev.clientX - dragRef.current.sx, y: dragRef.current.spy + ev.clientY - dragRef.current.sy })\r\n }\r\n const onUp = () => { dragRef.current.active = false; document.removeEventListener('mousemove', onMove); document.removeEventListener('mouseup', onUp) }\r\n document.addEventListener('mousemove', onMove); document.addEventListener('mouseup', onUp)\r\n }, [pos])\r\n\r\n const onWheelCb = useCallback((e: WheelEvent) => {\r\n e.preventDefault()\r\n const el = containerRef.current\r\n if (!el) return\r\n const rect = el.getBoundingClientRect()\r\n // Anchor the zoom at the preview center so the mouse position never\r\n // steers where the image grows/shrinks — the current view stays centered.\r\n const mx = rect.width / 2, my = rect.height / 2\r\n // 3% per wheel step (0.97 zoom-out / 1.03 zoom-in).\r\n const factor = e.deltaY > 0 ? 0.97 : 1.03\r\n const nz = Math.max(0.1, Math.min(10, zoom * factor))\r\n const nx = mx - (mx - pos.x) * (nz / zoom)\r\n const ny = my - (my - pos.y) * (nz / zoom)\r\n setZoom(nz); setPos({ x: nx, y: ny })\r\n }, [zoom, pos])\r\n\r\n useEffect(() => {\r\n const el = containerRef.current\r\n if (!el) return\r\n el.addEventListener('wheel', onWheelCb, { passive: false })\r\n return () => el.removeEventListener('wheel', onWheelCb)\r\n }, [onWheelCb])\r\n\r\n const resetView = useCallback(() => {\r\n if (imgSize.w === 0) return\r\n setZoom(1); setPos({ x: (pw - imgSize.w) / 2, y: (ph - imgSize.h) / 2 })\r\n }, [pw, ph, imgSize])\r\n\r\n return (\r\n <Portal>\r\n <div className=\"dab-overlay\" onClick={e => { if (e.target === e.currentTarget) onClose() }}>\r\n <div className=\"dab-overlay-title\">{t('editorTitle')}</div>\r\n <div ref={containerRef} className=\"dab-modal-card\" style={{\r\n position: 'relative', overflow: 'hidden', border: '2px solid rgba(255,255,255,0.3)',\r\n borderRadius: 12, background: '#000', cursor: 'grab', width: pw, height: ph,\r\n }} onMouseDown={onDown}>\r\n <img ref={imgRef} src={url} alt=\"\" draggable={false} style={{\r\n position: 'absolute', transformOrigin: '0 0', pointerEvents: 'none',\r\n width: imgSize.w, height: imgSize.h,\r\n transform: `translate(${pos.x}px,${pos.y}px) scale(${zoom})`,\r\n }} />\r\n </div>\r\n <div className=\"dab-overlay-hint\">{t('editorHint')}</div>\r\n <div style={{ display: 'flex', gap: 10 }}>\r\n <button type=\"button\" className=\"dab-btn\" onClick={resetView}>{t('editorReset')}</button>\r\n <button type=\"button\" className=\"dab-btn\" onClick={onClose}>{t('editorCancel')}</button>\r\n <button type=\"button\" className=\"dab-btn\" onClick={() => onCommit(zoom, (pos.x + imgSize.w * zoom / 2) / pw, (pos.y + imgSize.h * zoom / 2) / ph, imgRef.current?.naturalWidth ?? 0, imgRef.current?.naturalHeight ?? 0)}>{t('editorCommit')}</button>\r\n </div>\r\n </div>\r\n </Portal>\r\n )\r\n}\r\n","import { useEffect, useRef, useState } from 'react'\r\nimport type { CSSProperties } from 'react'\r\nimport type { ThemeSectionProps, ThemeStoreState, BackgroundType, GeneratedBgParams, BgMode } from '../../types'\r\nimport { cfg, rWop, rBl, rBgMode } from '../../state'\r\nimport { saveConfig, setWallpaperFromUrl, uploadWallpaper, WALLPAPER_SERVE_URL } from '../../rpc'\r\nimport { applyWp, setWpOpacity, setWpBlur, pauseGeneratedBg, resumeGeneratedBg } from '../../wallpaper'\r\nimport { defaultParamsFor } from '../../utils/bg-generators'\r\nimport { BgEditor } from '../BgEditor'\r\nimport { LiveSlider } from '../LiveSlider'\r\nimport { LockIcon, CheckIcon, PhotoIcon, RefreshIcon, SparkleIcon, TrashIcon, UploadIcon, EditIcon, VideoIcon, LinkIcon, PlusIcon, XIcon, PlayIcon, PauseIcon } from '../icons'\r\n\r\nconst SEG_W = 108\r\nconst BG_MODES: Array<{ mode: BgMode; labelKey: string }> = [\r\n { mode: 'fit', labelKey: 'bgModeFit' },\r\n { mode: 'fill', labelKey: 'bgModeFill' },\r\n { mode: 'stretch', labelKey: 'bgModeStretch' },\r\n { mode: 'tile', labelKey: 'bgModeTile' },\r\n { mode: 'center', labelKey: 'bgModeCenter' },\r\n]\r\n\r\nexport function BackgroundPage({ p }: { p: ThemeSectionProps }) {\r\n const { t, setWpFromServer, setVideo, setWop, setBl, setBgType, setGeneratedBg, regenerateBg, setRegenerateOnReload, setRotation, addRotationItems, removeRotationItem, rotateNow, setVideoFromUrl, useStore } = p\r\n // Field-level store subscriptions: dragging sliders / picking colors changes\r\n // only the color fields, and the background page has no reason to re-render\r\n // for those — full-state subscription re-renders this whole page (hero img,\r\n // thumbnails, sliders) on every unrelated store write.\r\n const storeUrl = useStore((s: ThemeStoreState) => s.url)\r\n const backgroundType = useStore((s: ThemeStoreState) => s.backgroundType)\r\n const generatedBg = useStore((s: ThemeStoreState) => s.generatedBg)\r\n const regenerateOnReload = useStore((s: ThemeStoreState) => s.regenerateOnReload)\r\n const rotation = useStore((s: ThemeStoreState) => s.rotation)\r\n\r\n const fileRef = useRef<HTMLInputElement>(null)\r\n const rotFileRef = useRef<HTMLInputElement>(null)\r\n const [editorOpen, setEditorOpen] = useState(false)\r\n const [dragOver, setDragOver] = useState(false)\r\n const [spinTick, setSpinTick] = useState(0)\r\n const [rotBusy, setRotBusy] = useState(false)\r\n const [urlOpen, setUrlOpen] = useState(false)\r\n const [urlVal, setUrlVal] = useState('')\r\n const [urlBusy, setUrlBusy] = useState(false)\r\n const [urlErr, setUrlErr] = useState<string | null>(null)\r\n // Layout mode is owned by cfg (persisted on click); local mirror only so\r\n // the chip row re-renders on selection.\r\n const [mode, setModeState] = useState<BgMode>(rBgMode())\r\n\r\n const isVideo = backgroundType === 'video'\r\n const isStatic = backgroundType === 'image' || isVideo\r\n const isGenerated = !isStatic\r\n const activeGenType: Exclude<BackgroundType, 'image' | 'video'> = isGenerated && generatedBg ? generatedBg.type : 'mesh'\r\n\r\n // Session-only pause state; any controller swap (type switch, regenerate)\r\n // recreates the loop running, so reset the button to match.\r\n const [paused, setPaused] = useState(false)\r\n const genPreset = generatedBg !== null && generatedBg.type !== 'mesh' ? generatedBg.preset : undefined\r\n useEffect(() => { setPaused(false) }, [activeGenType, genPreset, generatedBg?.seed])\r\n\r\n const onFileSelect = (f: File) => {\r\n if (f.type.startsWith('video/')) {\r\n // Hand the raw file over directly: it streams to disk over the\r\n // binary upload route. A data-URL detour would inflate the bytes by a\r\n // third (base64) and blow the RPC body limit on large clips.\r\n setVideo(f, f.type)\r\n return\r\n }\r\n // Stream the original bytes straight to disk (no base64 round-trip, no\r\n // re-encoding), then point the wallpaper at the serve URL. The browser\r\n // decodes it natively like any <img>.\r\n void uploadWallpaper(f).then(ok => {\r\n if (ok) setWpFromServer(WALLPAPER_SERVE_URL)\r\n })\r\n }\r\n\r\n const onDrop = (e: React.DragEvent) => {\r\n e.preventDefault()\r\n setDragOver(false)\r\n const f = e.dataTransfer.files?.[0]\r\n if (f && (f.type.startsWith('image/') || f.type.startsWith('video/'))) onFileSelect(f)\r\n }\r\n\r\n const applyUrl = async () => {\r\n const u = urlVal.trim()\r\n if (!/^https?:\\/\\//i.test(u)) { setUrlErr(t('bgUrlBadHttp')); return }\r\n setUrlBusy(true)\r\n setUrlErr(null)\r\n const r = await setWallpaperFromUrl(u)\r\n if (r.ok) {\r\n // The host already replaced the local wallpaper file; just switch the\r\n // theme to image mode and point the display at the serve URL.\r\n setWpFromServer(r.wallpaperUrl ?? null)\r\n setUrlOpen(false)\r\n setUrlVal('')\r\n } else if (r.error === 'not an image') {\r\n // A video URL: stream it into the video slot through the server and\r\n // play from the serve route.\r\n const ok = await setVideoFromUrl(u)\r\n if (ok) {\r\n setUrlOpen(false)\r\n setUrlVal('')\r\n } else {\r\n setUrlErr(t('bgUrlVideoFail'))\r\n }\r\n } else {\r\n setUrlErr(r.error === 'invalid url' || r.error === 'unsupported scheme'\r\n ? t('bgUrlBadHttp')\r\n : (r.error ?? t('bgUrlFail')))\r\n }\r\n setUrlBusy(false)\r\n }\r\n\r\n const switchToStatic = () => {\r\n if (isStatic) return\r\n setBgType(isVideo || cfg.videoMime !== null ? 'video' : 'image')\r\n }\r\n\r\n const setMode = (m: BgMode) => {\r\n if (m === mode) return\r\n setModeState(m)\r\n cfg.bgMode = m\r\n applyWp()\r\n saveConfig()\r\n }\r\n\r\n const setGenType = (type: Exclude<BackgroundType, 'image' | 'video'>) => {\r\n if (type === activeGenType) return\r\n setPaused(false)\r\n setBgType(type)\r\n }\r\n\r\n const ensureGenParams = (): GeneratedBgParams => generatedBg ?? defaultParamsFor(activeGenType)\r\n\r\n const updateGenerated = (patch: Partial<GeneratedBgParams>) => {\r\n // Any parameter change rebuilds the live controller, which restarts the\r\n // animation loop — reset the paused state so the button stays truthful.\r\n setPaused(false)\r\n setGeneratedBg({ ...ensureGenParams(), ...patch } as GeneratedBgParams)\r\n }\r\n\r\n const typeMeta: Array<{ type: Exclude<BackgroundType, 'image' | 'video'>; labelKey: string; descKey: string; thumb: string }> = [\r\n { type: 'mesh', labelKey: 'bgTypeMesh', descKey: 'bgMeshDesc', thumb: 'dab-thumb-mesh' },\r\n { type: 'shader', labelKey: 'bgTypeShader', descKey: 'bgShaderDesc', thumb: 'dab-thumb-shader' },\r\n { type: 'pattern', labelKey: 'bgTypePattern', descKey: 'bgPatternDesc', thumb: 'dab-thumb-pattern' },\r\n ]\r\n\r\n const presetLabel = (key: string) => {\r\n switch (key) {\r\n case 'aurora': return t('presetAurora')\r\n case 'nebula': return t('presetNebula')\r\n case 'noise': return t('presetNoise')\r\n case 'starfield': return t('presetStarfield')\r\n case 'dots': return t('presetDots')\r\n case 'waves': return t('presetWaves')\r\n case 'poly': return t('presetPoly')\r\n case 'rain': return t('presetRain')\r\n case 'contour': return t('presetContour')\r\n case 'meta': return t('presetMeta')\r\n default: return key\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n <header className=\"dab-head dab-rise\" style={{ '--d': 0 } as CSSProperties}>\r\n <div className=\"dab-overline\">Canvas</div>\r\n <h2 className=\"dab-h1\">{t('bgTitle')}</h2>\r\n <p className=\"dab-desc\">{t('descBackground')}</p>\r\n </header>\r\n\r\n {/* Preview hero with hover veil */}\r\n <section className=\"dab-rise\" style={{ '--d': 1 } as CSSProperties}>\r\n <div className=\"dab-hero\">\r\n {storeUrl ? (\r\n <>\r\n <img className=\"dab-hero-img\" src={storeUrl} alt=\"\" draggable={false} />\r\n {isGenerated ? (\r\n <span className=\"dab-hero-badge\"><SparkleIcon size={11} />{t('liveBadge')}</span>\r\n ) : isVideo ? (\r\n <span className=\"dab-hero-badge\"><VideoIcon size={11} />{t('bgVideoBadge')}</span>\r\n ) : null}\r\n <div className=\"dab-hero-veil\">\r\n {isStatic && storeUrl ? (\r\n <button type=\"button\" className=\"dab-btn\" disabled={mode !== 'fit'}\r\n title={mode !== 'fit' ? t('bgEditLocked') : undefined}\r\n onClick={() => setEditorOpen(true)}>\r\n <EditIcon size={13} />{t('bgEdit')}\r\n </button>\r\n ) : isGenerated ? (\r\n <button type=\"button\" className=\"dab-btn\" onClick={() => { setPaused(false); regenerateBg(); setSpinTick(x => x + 1) }}>\r\n <RefreshIcon size={13} />{t('bgRegenerate')}\r\n </button>\r\n ) : null}\r\n <button type=\"button\" className=\"dab-btn dab-btn-danger\" onClick={() => setWpFromServer(null)}>\r\n <TrashIcon size={13} />{t('bgRemove')}\r\n </button>\r\n </div>\r\n </>\r\n ) : (\r\n <button\r\n type=\"button\"\r\n className={`dab-hero-empty${dragOver ? ' is-over' : ''}`}\r\n onClick={() => fileRef.current?.click()}\r\n onDragOver={e => { e.preventDefault(); setDragOver(true) }}\r\n onDragLeave={() => setDragOver(false)}\r\n onDrop={onDrop}>\r\n <UploadIcon size={20} />\r\n <span>{t('dropHint')}</span>\r\n </button>\r\n )}\r\n </div>\r\n </section>\r\n\r\n {/* Source segmented control */}\r\n <section className=\"dab-rise\" style={{ '--d': 2 } as CSSProperties}>\r\n <div className=\"dab-seg\" style={{ '--w': `${SEG_W}px` } as CSSProperties}>\r\n <div className=\"dab-seg-thumb\" style={{ transform: `translateX(${isGenerated ? SEG_W : 0}px)` }} />\r\n <button type=\"button\" className={`dab-seg-item${!isGenerated ? ' is-active' : ''}`} onClick={switchToStatic}>\r\n <PhotoIcon size={14} />{t('bgSourceImage')}\r\n </button>\r\n <button type=\"button\" className={`dab-seg-item${isGenerated ? ' is-active' : ''}`}\r\n onClick={() => { if (!isGenerated) setBgType(generatedBg?.type ?? 'mesh') }}>\r\n <SparkleIcon size={14} />{t('bgSourceGenerated')}\r\n </button>\r\n </div>\r\n </section>\r\n\r\n {/* Mode content */}\r\n {!isGenerated ? (\r\n <>\r\n <section className=\"dab-card dab-card-hover dab-rise\" style={{ '--d': 3 } as CSSProperties}>\r\n <div className=\"dab-chip-row\">\r\n <button type=\"button\" className=\"dab-btn dab-btn-primary\" onClick={() => fileRef.current?.click()}>\r\n <UploadIcon size={14} />{t('bgChoose')}\r\n </button>\r\n <button type=\"button\" className=\"dab-btn dab-btn-soft\" onClick={() => setUrlOpen(o => !o)}>\r\n <LinkIcon size={14} />{t('bgFromUrl')}\r\n </button>\r\n {storeUrl || isVideo ? (\r\n <>\r\n {isStatic && storeUrl ? (\r\n <button type=\"button\" className=\"dab-btn\" disabled={mode !== 'fit'}\r\n title={mode !== 'fit' ? t('bgEditLocked') : undefined}\r\n onClick={() => setEditorOpen(true)}>\r\n <EditIcon size={14} />{t('bgEdit')}\r\n </button>\r\n ) : null}\r\n <button type=\"button\" className=\"dab-btn dab-btn-danger-inverted\" onClick={() => setWpFromServer(null)}>\r\n <TrashIcon size={14} />{t('bgRemove')}\r\n </button>\r\n </>\r\n ) : null}\r\n </div>\r\n {urlOpen ? (\r\n <div className=\"dab-urlrow\">\r\n <input type=\"text\" className=\"dab-urlinput\" value={urlVal} placeholder={t('bgUrlPlaceholder')}\r\n onChange={e => setUrlVal(e.target.value)}\r\n onKeyDown={e => { if (e.key === 'Enter') { e.preventDefault(); void applyUrl() } }}\r\n autoFocus />\r\n <button type=\"button\" className=\"dab-btn dab-btn-primary\" disabled={urlBusy} onClick={() => void applyUrl()}>\r\n {urlBusy ? t('bgUrlApplying') : t('bgUrlApply')}\r\n </button>\r\n <button type=\"button\" className=\"dab-btn\" onClick={() => { setUrlOpen(false); setUrlVal(''); setUrlErr(null) }}>\r\n {t('bgUrlCancel')}\r\n </button>\r\n </div>\r\n ) : null}\r\n {urlErr ? (\r\n <p className=\"dab-urlerr\" style={{ marginTop: 8, color: 'var(--dsw-alias-state-error-primary)', fontSize: 12 }}>{urlErr}</p>\r\n ) : null}\r\n {/* Adaptive placement for image/video backgrounds. \"fit\" keeps the\r\n editor-committed framing; the pan/zoom editor only applies there. */}\r\n <div style={{ marginTop: 16 }}>\r\n <div className=\"dab-swatch-title\">{t('bgModeTitle')}</div>\r\n <div className=\"dab-chip-row\">\r\n {BG_MODES.map(m => (\r\n <button key={m.mode} type=\"button\" className={`dab-chip${mode === m.mode ? ' is-active' : ''}`}\r\n onClick={() => setMode(m.mode)}>\r\n {t(m.labelKey)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n </section>\r\n\r\n {/* Wallpaper rotation pool */}\r\n <section className=\"dab-card dab-rise\" style={{ '--d': 4 } as CSSProperties}>\r\n <div className=\"dab-row-head\">\r\n <div className=\"dab-swatch-title\" style={{ marginBottom: 0 }}>{t('rotTitle')}</div>\r\n <button type=\"button\" className={`dab-toggle${rotation.enabled ? ' is-on' : ''}`} role=\"switch\" aria-checked={rotation.enabled}\r\n onClick={() => setRotation({ enabled: !rotation.enabled })}>\r\n <span className=\"dab-toggle-knob\" />\r\n </button>\r\n </div>\r\n <p className=\"dab-hint\" style={{ marginTop: 8 }}>{t('rotHint')}</p>\r\n <div className=\"dab-thumbstrip\">\r\n {rotation.items.map((it, i) => (\r\n <div key={it.file} className={`dab-thumb${rotation.enabled && i === rotation.current ? ' is-current' : ''}`}>\r\n {it.thumb ? <img src={it.thumb} alt=\"\" draggable={false} /> : <PhotoIcon size={15} />}\r\n <button type=\"button\" className=\"dab-thumb-x\" title={t('rotRemove')}\r\n disabled={rotBusy} onClick={() => { setRotBusy(true); void removeRotationItem(i).finally(() => setRotBusy(false)) }}>\r\n <XIcon size={10} />\r\n </button>\r\n </div>\r\n ))}\r\n <button type=\"button\" className=\"dab-thumb dab-thumb-add\" title={t('rotAdd')} disabled={rotBusy}\r\n onClick={() => rotFileRef.current?.click()}>\r\n <PlusIcon size={16} />\r\n </button>\r\n </div>\r\n {rotation.items.length > 0 ? (\r\n <div className=\"dab-chip-row\" style={{ marginTop: 12 }}>\r\n <button type=\"button\" className={`dab-chip${rotation.mode === 'shuffle' ? ' is-active' : ''}`}\r\n onClick={() => setRotation({ mode: 'shuffle' })}>{t('rotShuffle')}</button>\r\n <button type=\"button\" className={`dab-chip${rotation.mode === 'order' ? ' is-active' : ''}`}\r\n onClick={() => setRotation({ mode: 'order' })}>{t('rotOrder')}</button>\r\n <span className=\"dab-chip-sep\" />\r\n <button type=\"button\" className={`dab-chip${rotation.interval === 'reload' ? ' is-active' : ''}`}\r\n onClick={() => setRotation({ interval: 'reload' })}>{t('rotReload')}</button>\r\n <button type=\"button\" className={`dab-chip${rotation.interval === 'daily' ? ' is-active' : ''}`}\r\n onClick={() => setRotation({ interval: 'daily' })}>{t('rotDaily')}</button>\r\n <button type=\"button\" className={`dab-chip${rotation.interval === 'weekly' ? ' is-active' : ''}`}\r\n onClick={() => setRotation({ interval: 'weekly' })}>{t('rotWeekly')}</button>\r\n <button type=\"button\" className=\"dab-btn\" disabled={rotBusy}\r\n onClick={() => { setRotBusy(true); void rotateNow().finally(() => setRotBusy(false)) }}>\r\n <RefreshIcon size={13} />{t('rotNow')}\r\n </button>\r\n </div>\r\n ) : null}\r\n <input ref={rotFileRef} type=\"file\" accept=\"image/*\" multiple style={{ display: 'none' }} onChange={e => {\r\n const files = Array.from(e.target.files ?? [])\r\n e.target.value = ''\r\n if (files.length === 0) return\r\n setRotBusy(true)\r\n void addRotationItems(files).finally(() => setRotBusy(false))\r\n }} />\r\n </section>\r\n </>\r\n ) : (\r\n <section className=\"dab-card dab-rise\" style={{ '--d': 3 } as CSSProperties}>\r\n {/* Type cards with animated thumbnails */}\r\n <div className=\"dab-types\">\r\n {typeMeta.map((m, i) => (\r\n <button key={m.type} type=\"button\" className={`dab-type${activeGenType === m.type ? ' is-active' : ''}`}\r\n style={{ '--i': i } as CSSProperties} onClick={() => setGenType(m.type)}>\r\n <div className={`dab-type-thumb ${m.thumb}`} />\r\n <div className=\"dab-type-name\">{t(m.labelKey)}</div>\r\n <div className=\"dab-type-desc\">{t(m.descKey)}</div>\r\n <span className=\"dab-type-check\"><CheckIcon size={11} /></span>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Presets (shader / pattern) */}\r\n {activeGenType === 'shader' && generatedBg?.type === 'shader' ? (\r\n <div style={{ marginTop: 14 }}>\r\n <div className=\"dab-swatch-title\">{t('bgShaderPreset')}</div>\r\n <div className=\"dab-chip-row\">\r\n {(['aurora', 'nebula', 'noise', 'starfield'] as const).map(pr => (\r\n <button key={pr} type=\"button\" className={`dab-chip${generatedBg.preset === pr ? ' is-active' : ''}`}\r\n onClick={() => updateGenerated({ preset: pr })}>\r\n {presetLabel(pr)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n ) : null}\r\n\r\n {activeGenType === 'pattern' && generatedBg?.type === 'pattern' ? (\r\n <div style={{ marginTop: 14 }}>\r\n <div className=\"dab-swatch-title\">{t('bgPatternPreset')}</div>\r\n <div className=\"dab-chip-row\">\r\n {(['dots', 'waves', 'poly', 'rain', 'contour', 'meta'] as const).map(pr => (\r\n <button key={pr} type=\"button\" className={`dab-chip${generatedBg.preset === pr ? ' is-active' : ''}`}\r\n onClick={() => updateGenerated({ preset: pr })}>\r\n {presetLabel(pr)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n ) : null}\r\n\r\n {/* Parameter sliders */}\r\n <div style={{ marginTop: 16 }}>\r\n {activeGenType === 'mesh' && generatedBg?.type === 'mesh' ? (\r\n <>\r\n <LiveSlider label={t('bgMeshScale')} min={30} max={300} step={1} def={Math.round(generatedBg.scale * 100)}\r\n fmt={v => `${v}%`} onChange={v => updateGenerated({ scale: v / 100 })} />\r\n <LiveSlider label={t('bgMeshIntensity')} min={0} max={100} step={1} def={Math.round(generatedBg.intensity * 100)}\r\n fmt={v => `${v}%`} onChange={v => updateGenerated({ intensity: v / 100 })} />\r\n </>\r\n ) : null}\r\n {activeGenType === 'shader' && generatedBg?.type === 'shader' ? (\r\n <>\r\n <LiveSlider label={t('bgShaderSpeed')} min={0} max={200} step={1} def={Math.round(generatedBg.speed * 100)}\r\n fmt={v => `${v}%`} onChange={v => updateGenerated({ speed: v / 100 })} />\r\n <LiveSlider label={t('bgShaderScale')} min={30} max={300} step={1} def={Math.round(generatedBg.scale * 100)}\r\n fmt={v => `${v}%`} onChange={v => updateGenerated({ scale: v / 100 })} />\r\n </>\r\n ) : null}\r\n {activeGenType === 'pattern' && generatedBg?.type === 'pattern' ? (\r\n <>\r\n <LiveSlider label={t('bgPatternDensity')} min={0} max={100} step={1} def={Math.round(generatedBg.density * 100)}\r\n fmt={v => `${v}%`} onChange={v => updateGenerated({ density: v / 100 })} />\r\n <LiveSlider label={t('bgPatternScale')} min={30} max={300} step={1} def={Math.round(generatedBg.scale * 100)}\r\n fmt={v => `${v}%`} onChange={v => updateGenerated({ scale: v / 100 })} />\r\n </>\r\n ) : null}\r\n </div>\r\n\r\n {/* Seed lock + regenerate + pause */}\r\n <div className=\"dab-seed\">\r\n <span className=\"dab-seed-ico\"><LockIcon size={15} /></span>\r\n <div className=\"dab-seed-txt\">\r\n <div className=\"dab-seed-title\">{t('seedLock')}</div>\r\n <div className=\"dab-seed-desc\">{!regenerateOnReload ? t('bgSeedLocked') : t('bgSeedUnlocked')}</div>\r\n </div>\r\n <button type=\"button\" className={`dab-toggle${!regenerateOnReload ? ' is-on' : ''}`}\r\n role=\"switch\" aria-checked={!regenerateOnReload}\r\n onClick={() => setRegenerateOnReload(!regenerateOnReload)}>\r\n <span className=\"dab-toggle-knob\" />\r\n </button>\r\n <button type=\"button\" className=\"dab-btn\" onClick={() => {\r\n if (paused) { resumeGeneratedBg(); setPaused(false) }\r\n else { pauseGeneratedBg(); setPaused(true) }\r\n }}>\r\n {paused ? <PlayIcon size={13} /> : <PauseIcon size={13} />}{paused ? t('bgResume') : t('bgPause')}\r\n </button>\r\n <button type=\"button\" className=\"dab-btn dab-btn-primary\" onClick={() => { regenerateBg(); setPaused(false); setSpinTick(x => x + 1) }}>\r\n <span key={spinTick} className=\"dab-spin\" style={{ display: 'grid' }}><RefreshIcon size={13} /></span>\r\n {t('bgRegenerate')}\r\n </button>\r\n </div>\r\n </section>\r\n )}\r\n\r\n {/* Global wallpaper adjustments */}\r\n <section className=\"dab-card dab-card-hover dab-rise\" style={{ '--d': 5 } as CSSProperties}>\r\n <LiveSlider label={t('wpOpacity')} min={0} max={100} step={1} def={Math.round(rWop() * 100)}\r\n fmt={v => `${v}%`}\r\n onInput={v => { const op = v / 100; cfg.wallpaperOpacity = op; setWpOpacity(op); saveConfig() }}\r\n onChange={v => setWop(v / 100)} />\r\n <LiveSlider label={t('bgBlur')} min={0} max={60} step={1} def={rBl()}\r\n fmt={v => `${v}px`}\r\n onInput={v => { cfg.blur = v; setWpBlur(v); saveConfig() }}\r\n onChange={v => setBl(v)} />\r\n <p className=\"dab-hint\" style={{ marginTop: 12 }}>{t('bgHint')}</p>\r\n </section>\r\n\r\n <input ref={fileRef} type=\"file\" accept=\"image/*,video/*\" style={{ display: 'none' }} onChange={e => {\r\n const f = e.target.files?.[0]; if (!f) return\r\n onFileSelect(f); e.target.value = ''\r\n }} />\r\n\r\n {/* Background editor modal (image/video + fit mode only). For videos\r\n the reference is the captured frame snapshot — same pixels as the\r\n playing video, so the committed framing maps 1:1 onto the layer. */}\r\n {editorOpen && storeUrl && isStatic && mode === 'fit' ? (\r\n <BgEditor url={storeUrl} t={t} onClose={() => setEditorOpen(false)}\r\n onCommit={(z, x, y, iw, ih) => {\r\n const st = { zoom: z, x, y, iw, ih }\r\n if (backgroundType === 'video') cfg.videoBgState = st\r\n else cfg.bgState = st\r\n applyWp(); saveConfig(); setEditorOpen(false)\r\n }} />\r\n ) : null}\r\n </>\r\n )\r\n}\r\n","import type { ProfileAppearance } from '../types'\r\n\r\n/**\r\n * Built-in appearance presets. Each bundles the surface parameters a profile\r\n * stores (color, per-part opacities/blurs, tints) — never the wallpaper\r\n * itself, which stays machine-local. Applying a preset is identical to\r\n * applying a saved profile.\r\n */\r\nexport interface BuiltinPreset {\r\n key: string\r\n appearance: ProfileAppearance\r\n}\r\n\r\nconst zeroBlurs = { bg: 0, sidebar: 0, card: 0, settings: 0, chat: 0, trajectory: 0, input: 0 }\r\n\r\nexport const BUILTIN_PRESETS: BuiltinPreset[] = [\r\n {\r\n key: 'default',\r\n appearance: {\r\n color: null,\r\n opacities: { bg: 0.85, sidebar: 0.93, card: 1, input: 1 },\r\n blurs: { ...zeroBlurs },\r\n settingsOpacity: 1,\r\n wallpaperOpacity: 1,\r\n blur: 0,\r\n chatTextOpacity: 0,\r\n trajectoryOpacity: 1,\r\n },\r\n },\r\n {\r\n // Frosted glass: translucent surfaces over a sharp wallpaper, blurred shell.\r\n key: 'glass',\r\n appearance: {\r\n color: [212, 0.5, 0.38],\r\n opacities: { bg: 0.62, sidebar: 0.55, card: 0.62, input: 0.58 },\r\n blurs: { ...zeroBlurs, bg: 20, sidebar: 14, card: 12, settings: 20, trajectory: 8, input: 14 },\r\n settingsOpacity: 0.88,\r\n wallpaperOpacity: 1,\r\n blur: 0,\r\n chatTextOpacity: 0,\r\n trajectoryOpacity: 0.85,\r\n },\r\n },\r\n {\r\n // Minimal: near-solid surfaces, no frost, system theme color.\r\n key: 'minimal',\r\n appearance: {\r\n color: null,\r\n opacities: { bg: 0.97, sidebar: 0.97, card: 1, input: 1 },\r\n blurs: { ...zeroBlurs },\r\n settingsOpacity: 1,\r\n wallpaperOpacity: 1,\r\n blur: 0,\r\n chatTextOpacity: 0,\r\n trajectoryOpacity: 1,\r\n },\r\n },\r\n {\r\n // Midnight: deep violet accent, dark scheme, heavy frost.\r\n key: 'midnight',\r\n appearance: {\r\n color: [262, 0.45, 0.16],\r\n opacities: { bg: 0.5, sidebar: 0.45, card: 0.55, input: 0.6 },\r\n blurs: { ...zeroBlurs, bg: 24, sidebar: 18, card: 14, settings: 22, trajectory: 10, input: 16 },\r\n settingsOpacity: 0.85,\r\n wallpaperOpacity: 0.92,\r\n blur: 2,\r\n chatTextOpacity: 0,\r\n trajectoryOpacity: 0.8,\r\n },\r\n },\r\n {\r\n // Cyber: vivid magenta accent over barely-there surfaces.\r\n key: 'cyber',\r\n appearance: {\r\n color: [315, 0.7, 0.22],\r\n opacities: { bg: 0.42, sidebar: 0.5, card: 0.45, input: 0.55 },\r\n blurs: { ...zeroBlurs, bg: 16, sidebar: 12, card: 10, settings: 18, trajectory: 6, input: 20 },\r\n settingsOpacity: 0.8,\r\n wallpaperOpacity: 1,\r\n blur: 0,\r\n chatTextOpacity: 0,\r\n trajectoryOpacity: 0.78,\r\n },\r\n },\r\n {\r\n // Warm daylight: amber accent, solid light surfaces.\r\n key: 'warm',\r\n appearance: {\r\n color: [28, 0.6, 0.72],\r\n opacities: { bg: 0.92, sidebar: 0.95, card: 1, input: 1 },\r\n blurs: { ...zeroBlurs },\r\n settingsOpacity: 1,\r\n wallpaperOpacity: 1,\r\n blur: 0,\r\n chatTextOpacity: 0,\r\n trajectoryOpacity: 1,\r\n },\r\n },\r\n]\r\n","import { useRef, useState } from 'react'\nimport type { CSSProperties } from 'react'\nimport type { ThemeSectionProps, ThemeStoreState, ProfileEntry, ScheduleConfig } from '../../types'\nimport { BUILTIN_PRESETS } from '../../utils/presets'\nimport { hslToRgb } from '../../utils/color'\nimport { DownloadIcon, UploadIcon, CheckIcon, PlusIcon, SunIcon, MoonIcon, ClockIcon } from '../icons'\n\nconst hexOf = (color: [number, number, number] | null): string =>\n color === null\n ? ''\n : '#' + hslToRgb(color[0], color[1], color[2]).map(v => Math.round(v).toString(16).padStart(2, '0')).join('')\n\nfunction ProfileDot({ entry }: { entry: ProfileEntry }) {\n const hex = hexOf(entry.config.color)\n return (\n <span className=\"dab-profile-dot\" style={hex ? { background: hex } : undefined} title={hex ? hex.toUpperCase() : undefined}>\n {hex ? null : <CheckIcon size={11} />}\n </span>\n )\n}\n\nexport function ProfilePage({ p, notify }: { p: ThemeSectionProps; notify: (msg: string, ok?: boolean) => void }) {\n const { t, exportTheme, importTheme, saveProfile, applyProfile, deleteProfile, applyPreset, setSchedule, useStore } = p\n // Field-level subscriptions: profile list, active id and schedule are the only\n // store fields this page renders — full-state subscription would re-render\n // the whole profile list on every unrelated store write (color, wallpaper…).\n const profiles = useStore((s: ThemeStoreState) => s.profiles)\n const schedule = useStore((s: ThemeStoreState) => s.schedule)\n const activeProfile = useStore((s: ThemeStoreState) => s.activeProfile)\n const importRef = useRef<HTMLInputElement>(null)\n const [nameOpen, setNameOpen] = useState(false)\n const [nameVal, setNameVal] = useState('')\n const [confirmId, setConfirmId] = useState<string | null>(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 const onSave = (): void => {\n const name = nameVal.trim()\n if (!name) return\n if (saveProfile(name)) {\n notify(t('profileSaved'), true)\n setNameVal('')\n setNameOpen(false)\n } else {\n notify(t('profileNameRequired'), false)\n }\n }\n\n const onApply = (entry: ProfileEntry): void => {\n if (applyProfile(entry.id)) notify(t('profileApplied'), true)\n }\n\n const onDelete = (entry: ProfileEntry): void => {\n if (confirmId !== entry.id) { setConfirmId(entry.id); return }\n setConfirmId(null)\n deleteProfile(entry.id)\n }\n\n const profileOptions = (value: string | null, onChange: (id: string | null) => void) => (\n <select className=\"dab-select\" value={value ?? ''} onChange={e => onChange(e.target.value || null)}>\n <option value=\"\">{t('profileNone')}</option>\n {profiles.map(pr => <option key={pr.id} value={pr.id}>{pr.name}</option>)}\n </select>\n )\n\n const patchSchedule = (patch: Partial<ScheduleConfig>): void => setSchedule(patch)\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 {/* Built-in presets */}\n <section className=\"dab-card dab-rise\" style={{ '--d': 1 } as CSSProperties}>\n <div className=\"dab-swatch-title\">{t('presetGalleryTitle')}</div>\n <div className=\"dab-preset-grid\">\n {BUILTIN_PRESETS.map((ps, i) => {\n const hex = hexOf(ps.appearance.color)\n return (\n <button key={ps.key} type=\"button\" className=\"dab-preset\" style={{ '--i': i } as CSSProperties} onClick={() => { applyPreset(ps.appearance); notify(t('presetApplied')) }}>\n <span className=\"dab-preset-dot\" style={hex ? { background: hex } : undefined}>\n {hex ? null : <CheckIcon size={12} />}\n </span>\n <span className=\"dab-preset-name\">{t(`presetName_${ps.key}`)}</span>\n <span className=\"dab-preset-desc\">{t(`presetDesc_${ps.key}`)}</span>\n </button>\n )\n })}\n </div>\n </section>\n\n {/* Saved profiles */}\n <section className=\"dab-card dab-rise\" style={{ '--d': 2 } as CSSProperties}>\n <div className=\"dab-row-head\">\n <div className=\"dab-swatch-title\" style={{ marginBottom: 0 }}>{t('profilesTitle')}</div>\n <button type=\"button\" className=\"dab-btn dab-btn-primary\" onClick={() => setNameOpen(o => !o)}>\n <PlusIcon size={14} />{t('profileSave')}\n </button>\n </div>\n {nameOpen ? (\n <div className=\"dab-urlrow\">\n <input type=\"text\" className=\"dab-urlinput\" value={nameVal} placeholder={t('profileNamePlaceholder')} maxLength={60}\n onChange={e => setNameVal(e.target.value)}\n onKeyDown={e => { if (e.key === 'Enter') { e.preventDefault(); onSave() } }}\n autoFocus />\n <button type=\"button\" className=\"dab-btn dab-btn-primary\" disabled={!nameVal.trim()} onClick={onSave}>{t('editorCommit')}</button>\n <button type=\"button\" className=\"dab-btn\" onClick={() => { setNameOpen(false); setNameVal('') }}>{t('bgUrlCancel')}</button>\n </div>\n ) : null}\n {profiles.length === 0 ? (\n <p className=\"dab-hint\" style={{ marginTop: 10 }}>{t('profilesEmpty')}</p>\n ) : (\n <div className=\"dab-profile-list\">\n {profiles.map((entry, i) => (\n <div key={entry.id} className={`dab-profile-row${activeProfile === entry.id ? ' is-active' : ''}`} style={{ '--i': i } as CSSProperties}>\n <ProfileDot entry={entry} />\n <div className=\"dab-profile-meta\">\n <span className=\"dab-profile-name\">{entry.name}</span>\n <span className=\"dab-profile-sub\">{new Date(entry.createdAt).toLocaleDateString()}</span>\n </div>\n <button type=\"button\" className=\"dab-btn\" onClick={() => onApply(entry)}>{t('profileApply')}</button>\n <button type=\"button\" className={`dab-btn dab-btn-danger-solid${confirmId === entry.id ? ' dab-btn-confirm' : ''}`}\n title={t('profileDelete')} onClick={() => onDelete(entry)}>\n {confirmId === entry.id ? (\n <><CheckIcon size={13} />{t('profileDeleteConfirm')}</>\n ) : (\n t('profileDelete')\n )}\n </button>\n </div>\n ))}\n </div>\n )}\n </section>\n\n {/* Day/night auto switch */}\n <section className=\"dab-card dab-rise\" style={{ '--d': 3 } as CSSProperties}>\n <div className=\"dab-row-head\">\n <div className=\"dab-swatch-title\" style={{ marginBottom: 0 }}>{t('scheduleTitle')}</div>\n <button type=\"button\" className={`dab-toggle${schedule.enabled ? ' is-on' : ''}`} role=\"switch\" aria-checked={schedule.enabled}\n onClick={() => patchSchedule({ enabled: !schedule.enabled })}>\n <span className=\"dab-toggle-knob\" />\n </button>\n </div>\n <p className=\"dab-hint\" style={{ marginTop: 8 }}>{t('scheduleHint')}</p>\n <div className={`dab-schedule-wrap${schedule.enabled ? ' is-open' : ''}`} aria-hidden={!schedule.enabled}>\n <div className=\"dab-schedule-clip\">\n <div className=\"dab-schedule-grid\">\n <div className=\"dab-schedule-cell\" style={{ '--i': 0 } as CSSProperties}>\n <div className=\"dab-swatch-title\">{t('scheduleMode')}</div>\n <div className=\"dab-chip-row\">\n <button type=\"button\" className={`dab-chip${schedule.mode === 'time' ? ' is-active' : ''}`}\n onClick={() => patchSchedule({ mode: 'time' })}><ClockIcon size={13} />{t('scheduleModeTime')}</button>\n <button type=\"button\" className={`dab-chip${schedule.mode === 'system' ? ' is-active' : ''}`}\n onClick={() => patchSchedule({ mode: 'system' })}>{t('scheduleModeSystem')}</button>\n </div>\n </div>\n {schedule.mode === 'time' ? (\n <div className=\"dab-schedule-cell\" style={{ '--i': 1 } as CSSProperties}>\n <div className=\"dab-swatch-title\">{t('scheduleTimes')}</div>\n <div className=\"dab-time-row\">\n <label className=\"dab-time-label\"><SunIcon size={13} />{t('scheduleDayStart')}\n <input type=\"time\" className=\"dab-timeinput\" value={schedule.dayStart}\n onChange={e => { if (/^([01]\\d|2[0-3]):[0-5]\\d$/.test(e.target.value)) patchSchedule({ dayStart: e.target.value }) }} />\n </label>\n <label className=\"dab-time-label\"><MoonIcon size={13} />{t('scheduleNightStart')}\n <input type=\"time\" className=\"dab-timeinput\" value={schedule.nightStart}\n onChange={e => { if (/^([01]\\d|2[0-3]):[0-5]\\d$/.test(e.target.value)) patchSchedule({ nightStart: e.target.value }) }} />\n </label>\n </div>\n </div>\n ) : null}\n <div className=\"dab-schedule-cell\" style={{ '--i': 2 } as CSSProperties}>\n <div className=\"dab-swatch-title\">{t('scheduleProfiles')}</div>\n <div className=\"dab-time-row\">\n <label className=\"dab-time-label\"><SunIcon size={13} />{t('scheduleDayProfile')}\n {profileOptions(schedule.dayProfile, id => patchSchedule({ dayProfile: id }))}\n </label>\n <label className=\"dab-time-label\"><MoonIcon size={13} />{t('scheduleNightProfile')}\n {profileOptions(schedule.nightProfile, id => patchSchedule({ nightProfile: id }))}\n </label>\n </div>\n </div>\n </div>\n </div>\n </div>\n </section>\n\n {/* Export / import */}\n <div className=\"dab-profile-grid\">\n <section className=\"dab-card dab-card-hover dab-rise\" style={{ '--d': 4 } 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': 5 } 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': 6 } 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","/**\r\n * dsh-any-background — browser half entry.\r\n *\r\n * Wires the plugin lifecycle: theme registration, wallpaper layer, viewport\r\n * watch, i18n, settings-section injection, boot restore, watchdog. The heavy\r\n * lifting lives in the sibling modules (state/rpc/wallpaper/utils/components).\r\n */\r\nimport { defineStore } from './runtime'\r\nimport type { Ctx, RpcResultLike, BoundActions, ThemeSectionProps, PartOpacities, PartBlurs, BackgroundType, GeneratedBgParams, ProfileAppearance, ProfileEntry, RotationItem, ScheduleConfig, SchemeOverride } from './types'\r\nimport { NS, zh, en } from './i18n'\r\nimport { cfg, rHasColor, rColor, rWp, rWpImage, rWpVideo, rBgState, rVideoBgState, setWpUrl, setWpImageUrl, setWpVideoUrl, setWpVideoSnapshot, setBgState, adoptConfig, DEFAULT_CONFIG, setBgDark, rBgDark, rProfiles, rRotation, rSchedule, rScheme, rColorScheme, rSchemeOverride, currentAppearance, applyAppearance } from './state'\r\nimport { RPC_CHANNEL, VIDEO_SERVE_URL, initRpc, saveConfig, flushSave, loadPersisted, persistWallpaper, persistVideo, persistConfig, uploadVideo, rotationAdd, rotationRemove, rotationActivate, setVideoFromUrl as rpcSetVideoFromUrl } from './rpc'\r\nimport { applyWp, teardownWp, applySettingsOverrides, SETTINGS_STYLE_RULE, TRAJECTORY_STYLE_RULE, INPUT_BLUR_RULE, PLACEHOLDER_RULE, MOBILE_HEADER_RULE, watchParts, watchThemeResets, regenerateGeneratedBg, setBackgroundType, updateGeneratedBg, applyThemeColor, onGeneratedSnapshot, watchWallpaperDragQuality, clearThemeTokens, onVerdictApplied, onColorAdopted, LABEL_TOKENS } from './wallpaper'\r\nimport { genTokens, hslToHsv, hsvToHsl, extractWallpaperColor } from './utils/color'\r\nimport { captureVideoSnapshot } from './utils/video'\r\nimport { readImgAsync, makeThumb, blobToDataUrl } from './utils/image'\r\nimport { ThemeSection } from './components/ThemeSection'\r\nimport { SUN_PATHS } from './components/icons'\r\n\r\nexport const name = 'dsh-any-background'\r\nexport const inject = ['slots', 'locale', 'theme', 'connection']\r\n\r\nconst CUSTOM_ID = 'custom-color'\r\n\r\nexport function apply(ctx: Ctx): void {\r\n // Bind the dedicated `/dsh-any-background` RPC caller so the persistence\r\n // module can reach the node half's file-backed store.\r\n initRpc((endpoint, payload) =>\r\n ctx.connection.rpc.call(RPC_CHANNEL, endpoint, payload).then((res: any) => res as RpcResultLike | undefined)\r\n )\r\n\r\n // 1. Restore custom color and register as a skin. The skin MUST go through\r\n // the host theme service — the host presenter paints fonts from the\r\n // registered theme, so a stylesheet-only override loses to it.\r\n // · picked color → genTokens in the effective scheme;\r\n // · forced scheme → neutral palette in the forced direction;\r\n // · auto, no color→ adopt the host's own palette in the background\r\n // brightness verdict's direction, fonts flipped to match\r\n // the wallpaper (perceptual luma, threshold 0.5).\r\n const [initH, initS, initL] = rColor()\r\n let customDispose: (() => void) | null = null\r\n // registerCustom takes HSL (the storage/wheel space and genTokens space).\r\n const registerCustom = (h?: number, s?: number, l?: number): boolean => {\r\n customDispose?.()\r\n try {\r\n let colorScheme: 'light' | 'dark'\r\n let tokens: Record<string, string>\r\n if (rHasColor()) {\r\n ;({ colorScheme, tokens } = genTokens(h ?? rColor()[0], s ?? rColor()[1], l ?? rColor()[2], rColorScheme()))\r\n } else if (rSchemeOverride() !== 'auto') {\r\n const dark = rScheme() === 'dark'\r\n ;({ colorScheme, tokens } = genTokens(220, 0.04, dark ? 0.14 : 0.92, dark ? 'dark' : 'light'))\r\n } else {\r\n const verdict = rBgDark()\r\n if (verdict === null) { customDispose = null; return false }\r\n const snap = ctx.theme.getTheme()\r\n const wantScheme = verdict ? 'dark' : 'light'\r\n const source = snap.themes.find(t => t.id !== CUSTOM_ID && t.colorScheme === wantScheme)\r\n ?? snap.themes.find(t => t.id !== CUSTOM_ID)\r\n if (source === undefined) { customDispose = null; return false }\r\n colorScheme = wantScheme\r\n tokens = { ...source.tokens }\r\n const font = verdict ? '#fff' : '#000'\r\n for (const name of LABEL_TOKENS) tokens[name] = font\r\n }\r\n customDispose = ctx.theme.register({ id: CUSTOM_ID, colorScheme, tokens })\r\n } catch {\r\n // A live registration from an earlier HMR apply pass cannot be torn down\r\n // here; keep it and activate it below. Without this the duplicate-id\r\n // throw would abort apply and skip the wallpaper/opacity restore.\r\n customDispose = null\r\n }\r\n // Only activate the custom theme if it is actually registered.\r\n const present = ctx.theme.getTheme().themes.some(t => t.id === CUSTOM_ID)\r\n if (present) ctx.theme.setTheme(CUSTOM_ID)\r\n return present\r\n }\r\n // Restore saved color on boot.\r\n if (rHasColor()) registerCustom(initH, initS, initL)\r\n // A fresh background brightness verdict (wallpaper swapped in, generated bg\r\n // regenerated) re-registration trigger: without a picked color the adopted\r\n // skin must be rebuilt so its fonts follow the new wallpaper.\r\n onVerdictApplied(() => {\r\n if (!rHasColor()) registerCustom()\r\n })\r\n // A wallpaper-extracted color adopted by the auto path (applyThemeColor's\r\n // no-saved-pick branch) must finish the full adaptation here: register the\r\n // skin in the color's direction, persist, and sync the editor wheel — the\r\n // bare cfg.color write in wallpaper.ts cannot reach any of those.\r\n onColorAdopted(hsl => {\r\n registerCustom(hsl[0], hsl[1], hsl[2])\r\n saveConfig()\r\n colorRev++\r\n bound?.syncColor(hslToHsv(hsl[0], hsl[1], hsl[2]), colorRev)\r\n })\r\n ctx.effect(() => () => {\r\n customDispose?.()\r\n if (colorTimerRef.current !== null) window.clearTimeout(colorTimerRef.current)\r\n }, 'dsh-any-background: skin dispose')\r\n\r\n // 2. Gradient CSS (for custom dark themes).\r\n const styleEl = document.createElement('style')\r\n styleEl.dataset.plugin = 'dsh-any-background'\r\n // Only applies while applyCustomTokens marks the body with the plugin's\r\n // own dark-mode value, avoiding matches against the host's theme attribute.\r\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}${TRAJECTORY_STYLE_RULE}${INPUT_BLUR_RULE}${MOBILE_HEADER_RULE}` + PLACEHOLDER_RULE\r\n document.head.appendChild(styleEl)\r\n ctx.effect(() => () => { styleEl?.parentNode?.removeChild(styleEl) }, 'dsh-any-background: gradient')\r\n\r\n // Wallpaper downscales to a low-res copy during slider drags, restored on release.\r\n const disposeDragQuality = watchWallpaperDragQuality()\r\n ctx.effect(() => () => disposeDragQuality(), 'dsh-any-background: drag quality')\r\n\r\n // 3. State store.\r\n let rev = 0\r\n let colorRev = 0\r\n let bgRev = 0\r\n const colorTimerRef: { current: number | null } = { current: null }\r\n const store = defineStore({\r\n init: () => ({\r\n url: null as string | null,\r\n rev: -1,\r\n colorRev: -1,\r\n color: null as [number, number, number] | null,\r\n backgroundType: cfg.backgroundType,\r\n generatedBg: cfg.generatedBg,\r\n bgRev: -1,\r\n regenerateOnReload: cfg.regenerateOnReload,\r\n profiles: [] as ProfileEntry[],\r\n rotation: { ...DEFAULT_CONFIG.rotation, items: [] },\r\n schedule: { ...DEFAULT_CONFIG.schedule },\r\n schemeOverride: 'auto' as SchemeOverride,\r\n activeProfile: null as string | null,\r\n metaRev: -1,\r\n }),\r\n actions: {\r\n syncBg: (d: any, url: string | null, r: number, bgType?: BackgroundType, genBg?: GeneratedBgParams | null, bgr?: number, reload?: boolean) => {\r\n if (r > d.rev) { d.url = url; d.rev = r }\r\n if (bgr !== undefined && bgr > d.bgRev) { d.backgroundType = bgType!; d.generatedBg = genBg ?? null; d.bgRev = bgr }\r\n if (reload !== undefined) { d.regenerateOnReload = reload }\r\n },\r\n syncColor: (d: any, hsv: [number, number, number], r: number) => { if (r > d.colorRev) { d.color = hsv; d.colorRev = r } },\r\n syncMeta: (d: any, profiles: ProfileEntry[], rotation: typeof cfg.rotation, schedule: typeof cfg.schedule, schemeOverride: SchemeOverride, activeProfile: string | null, r: number) => {\r\n if (r > d.metaRev) {\r\n d.profiles = profiles; d.rotation = rotation; d.schedule = schedule\r\n d.schemeOverride = schemeOverride; d.activeProfile = activeProfile; d.metaRev = r\r\n }\r\n },\r\n },\r\n })\r\n let bound: BoundActions | null = null\r\n const syncBg = () => {\r\n rev++; bgRev++\r\n bound?.syncBg(rWp(), rev, cfg.backgroundType, cfg.generatedBg, bgRev, cfg.regenerateOnReload)\r\n }\r\n // When a generated background finishes its first frame, its snapshot becomes\r\n // the display/preview URL — re-sync the store so the preview follows.\r\n onGeneratedSnapshot(syncBg)\r\n\r\n // ── Profiles / presets / scheme / rotation / schedule ────────────────────────\r\n let metaRev = 0\r\n const syncMetaNow = (): void => {\r\n metaRev++\r\n bound?.syncMeta(rProfiles(), rRotation(), rSchedule(), rSchemeOverride(), cfg.activeProfile, metaRev)\r\n }\r\n\r\n /** Apply an appearance snapshot (profile or built-in preset) to the whole\r\n * interface: re-register the skin, re-emit tokens, persist. */\r\n const applyAppearanceLive = (ap: ProfileAppearance): void => {\r\n applyAppearance(ap)\r\n if (rHasColor()) {\r\n const [h, s, l] = rColor()\r\n registerCustom(h, s, l)\r\n } else if (!registerCustom()) {\r\n // Nothing to assert (no color, auto, no verdict): hand the palette back\r\n // to the host theme.\r\n customDispose?.()\r\n customDispose = null\r\n clearThemeTokens()\r\n const snap = ctx.theme.getTheme()\r\n const fallback = snap.themes.find(t => t.id !== CUSTOM_ID)\r\n if (fallback !== undefined && snap.preference === CUSTOM_ID) ctx.theme.setTheme(fallback.id)\r\n }\r\n applyWp()\r\n }\r\n\r\n const applyProfileById = (id: string): boolean => {\r\n const entry = rProfiles().find(p => p.id === id)\r\n if (entry === undefined) return false\r\n applyAppearanceLive(entry.config)\r\n cfg.activeProfile = id\r\n applyWp()\r\n persistConfig()\r\n syncMetaNow()\r\n return true\r\n }\r\n\r\n // ── Wallpaper rotation ───────────────────────────────────────────────────────\r\n /** Extract the theme color once from a freshly activated wallpaper and run\r\n * the full adaptation (host skin + editor wheel sync); the caller persists. */\r\n const adoptWallpaperColor = async (dataUrl: string): Promise<void> => {\r\n const hsl = await extractWallpaperColor(dataUrl, rBgState())\r\n // The wallpaper may have been swapped while the image was decoding; a stale\r\n // pick must not overwrite the new picture's color.\r\n if (!hsl || rWp() !== dataUrl) return\r\n cfg.color = hsl\r\n registerCustom(hsl[0], hsl[1], hsl[2])\r\n colorRev++\r\n bound?.syncColor(hslToHsv(hsl[0], hsl[1], hsl[2]), colorRev)\r\n }\r\n\r\n /** Activate a rotation item: the server copies its bytes into the wallpaper\r\n * slot; the client applies the returned serve URL through the normal image\r\n * path, then re-extracts the theme color from the new picture so the\r\n * palette follows the rotation. */\r\n const applyRotationIndex = async (idx: number, auto: boolean): Promise<boolean> => {\r\n const rot = rRotation()\r\n if (idx < 0 || idx >= rot.items.length) return false\r\n const r = await rotationActivate(idx)\r\n if (!r.ok || !r.wallpaperUrl) {\r\n console.warn('dsh-any-background: rotation activate failed', r.error)\r\n return false\r\n }\r\n // The server already persisted the bytes into the wallpaper slot; mirror\r\n // setWpFromServer's state switch (bound is not initialized yet here).\r\n cfg.backgroundType = 'image'\r\n setBgDark(null)\r\n setWpImageUrl(r.wallpaperUrl)\r\n setWpUrl(rWpImage())\r\n setBgState({ ...DEFAULT_CONFIG.bgState })\r\n cfg.rotation = { ...rot, current: idx, lastRotate: auto || rot.lastRotate === null ? new Date().toISOString() : rot.lastRotate }\r\n // The picture just switched, so any saved pick describes the old wallpaper:\r\n // extract once from the new one to re-adapt (placement state matches the\r\n // previous image, so a size mismatch makes the extractor fall back to the\r\n // whole picture — the desired behavior for a fresh wallpaper).\r\n if (cfg.backgroundType === 'image') await adoptWallpaperColor(rWp()!)\r\n applyThemeColor()\r\n syncBg()\r\n saveConfig()\r\n syncMetaNow()\r\n return true\r\n }\r\n\r\n const isoWeekKey = (d: Date): string => {\r\n const t = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()))\r\n const day = t.getUTCDay() || 7\r\n t.setUTCDate(t.getUTCDate() + 4 - day)\r\n const yearStart = new Date(Date.UTC(t.getUTCFullYear(), 0, 1))\r\n const week = Math.ceil(((t.getTime() - yearStart.getTime()) / 86400000 + 1) / 7)\r\n return `${t.getUTCFullYear()}-W${week}`\r\n }\r\n\r\n const rotationDue = (): boolean => {\r\n const rot = rRotation()\r\n if (!rot.enabled || rot.items.length === 0) return false\r\n if (rot.interval === 'reload') return true\r\n const last = rot.lastRotate !== null ? new Date(rot.lastRotate) : null\r\n if (last === null || isNaN(last.getTime())) return true\r\n const now = new Date()\r\n if (rot.interval === 'daily') return last.toDateString() !== now.toDateString()\r\n return isoWeekKey(last) !== isoWeekKey(now)\r\n }\r\n\r\n const pickNextRotationIndex = (): number => {\r\n const rot = rRotation()\r\n const n = rot.items.length\r\n if (n === 0) return -1\r\n if (rot.mode === 'shuffle' && n > 1) {\r\n let idx = rot.current\r\n while (idx === rot.current) idx = Math.floor(Math.random() * n)\r\n return idx\r\n }\r\n return (rot.current + 1) % n\r\n }\r\n\r\n const maybeRotate = async (): Promise<void> => {\r\n if (!rotationDue()) return\r\n await applyRotationIndex(pickNextRotationIndex(), true)\r\n }\r\n\r\n // ── Day/night profile schedule ───────────────────────────────────────────────\r\n const parseHHMM = (s: string): number => {\r\n const m = /^([01]\\d|2[0-3]):([0-5]\\d)$/.exec(s)\r\n return m === null ? -1 : Number(m[1]) * 60 + Number(m[2])\r\n }\r\n\r\n const isNightNow = (sc: ScheduleConfig): boolean => {\r\n const now = new Date()\r\n const cur = now.getHours() * 60 + now.getMinutes()\r\n const day = parseHHMM(sc.dayStart)\r\n const night = parseHHMM(sc.nightStart)\r\n if (day < 0 || night < 0) return false\r\n // Normal window (day 07:00 → night 19:00): night wraps midnight.\r\n if (day <= night) return cur >= night || cur < day\r\n // Overnight window (e.g. day 22:00 → night 06:00): night is the middle span.\r\n return cur >= night && cur < day\r\n }\r\n\r\n const scheduleTick = (): void => {\r\n const sc = rSchedule()\r\n if (!sc.enabled) return\r\n const night = sc.mode === 'system'\r\n ? (window.matchMedia?.('(prefers-color-scheme: dark)').matches ?? false)\r\n : isNightNow(sc)\r\n const want = night ? sc.nightProfile : sc.dayProfile\r\n if (!want || want === cfg.activeProfile) return\r\n applyProfileById(want)\r\n }\r\n\r\n // 4. Wallpaper.\r\n applyWp(); syncBg()\r\n // The AppFrame mounts after this apply; watch for it so persisted per-part\r\n // blurs land as soon as the shell renders.\r\n watchParts()\r\n // Load the file-backed theme and re-apply once it lands (defaults are already\r\n // applied above; the deferred restore below re-asserts too). The server\r\n // advances a due rotation inside the read itself, so the restored wallpaper\r\n // is already the new pick and paints from the first apply — no old→new flash.\r\n void loadPersisted().then(async (serverRotated) => {\r\n syncMetaNow()\r\n // Re-register the skin with the restored color so UI and theme never diverge.\r\n if (rHasColor()) {\r\n const [h, s, l] = rColor()\r\n registerCustom(h, s, l)\r\n }\r\n if (serverRotated) {\r\n // The wallpaper was swapped server-side while the theme color still\r\n // describes the previous picture: re-extract once so the palette\r\n // follows the rotation (same adaptation as a client-side advance).\r\n // Persist the extracted pick — the disk still holds the old color, and\r\n // without this every later reload would restore it over the new\r\n // wallpaper.\r\n if (cfg.backgroundType === 'image' && rWp()) {\r\n await adoptWallpaperColor(rWp()!)\r\n saveConfig()\r\n }\r\n } else {\r\n // Fallback client-side advance (server flag missing / older half), still\r\n // before the branch restore so the fresh wallpaper is what gets applied.\r\n await maybeRotate()\r\n }\r\n // Regenerate on reload if enabled, else reconstruct from saved params.\r\n if (cfg.backgroundType === 'video') {\r\n const v = rWpVideo()\r\n if (v) {\r\n // The frame snapshot is not persisted: re-capture it for previews.\r\n void captureVideoSnapshot(v).then(snap => {\r\n if (rWpVideo() !== v) return\r\n setWpVideoSnapshot(snap)\r\n applyThemeColor()\r\n syncBg()\r\n })\r\n applyWp()\r\n } else {\r\n // Stored video missing: fall back to the retained image slot.\r\n cfg.backgroundType = 'image'\r\n setWpUrl(rWpImage())\r\n applyThemeColor()\r\n }\r\n } else if (cfg.backgroundType !== 'image') {\r\n if (cfg.regenerateOnReload) {\r\n regenerateGeneratedBg()\r\n } else if (cfg.generatedBg) {\r\n updateGeneratedBg(cfg.generatedBg)\r\n }\r\n // Persist the normalized config so the seed and flag land on disk.\r\n persistConfig()\r\n } else {\r\n // Saved pick wins; otherwise extract from the uploaded wallpaper.\r\n applyThemeColor()\r\n }\r\n syncBg()\r\n scheduleTick()\r\n if (rHasColor()) { colorRev++; bound?.syncColor(hslToHsv(...rColor()), colorRev) }\r\n })\r\n // Schedule cadence: check every 30s (covers fixed-clock switches) and react\r\n // immediately when the OS scheme flips in 'system' mode.\r\n const schemeMq = window.matchMedia?.('(prefers-color-scheme: dark)')\r\n const scheduleTimer = window.setInterval(scheduleTick, 30_000)\r\n schemeMq?.addEventListener?.('change', scheduleTick)\r\n ctx.effect(() => () => {\r\n window.clearInterval(scheduleTimer)\r\n schemeMq?.removeEventListener?.('change', scheduleTick)\r\n }, 'dsh-any-background: schedule timer')\r\n ctx.effect(() => () => { teardownWp() }, 'dsh-any-background: wp cleanup')\r\n ctx.effect(() => ctx.on('theme/change', () => {\r\n // The custom theme's preference lives in memory, so a host adoption can\r\n // silently reset it; re-assert it while the skin has anything to say (a\r\n // color, a brightness verdict, or a forced scheme). Guard on registry\r\n // presence — registerCustom disposes the old skin first, so during that\r\n // transient the registry lacks CUSTOM_ID.\r\n if (rHasColor() || rBgDark() !== null || rSchemeOverride() !== 'auto') {\r\n const snapshot = ctx.theme.getTheme()\r\n if (snapshot.preference !== CUSTOM_ID && snapshot.themes.some(t => t.id === CUSTOM_ID)) {\r\n ctx.theme.setTheme(CUSTOM_ID)\r\n }\r\n }\r\n applyWp()\r\n }), 'dsh-any-background: theme change')\r\n // Wallpaper placement is computed in absolute viewport pixels, so watch the\r\n // viewport itself: a fixed inset:0 sentinel's box always equals the viewport,\r\n // so a ResizeObserver on it catches any viewport change (window resize,\r\n // monitor moves, panel splitters, zoom); a resolution media query catches\r\n // DPI-only moves. Re-applies are coalesced to one per animation frame.\r\n let frame = 0\r\n const applySoon = (): void => {\r\n if (frame !== 0) return\r\n frame = requestAnimationFrame(() => { frame = 0; applyWp() })\r\n }\r\n const sentinel = document.createElement('div')\r\n sentinel.style.cssText = 'position:fixed;inset:0;pointer-events:none;visibility:hidden'\r\n document.body.append(sentinel)\r\n const viewportObserver = new ResizeObserver(applySoon)\r\n viewportObserver.observe(sentinel)\r\n const dprQuery = window.matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`)\r\n dprQuery.addEventListener('change', applySoon)\r\n ctx.effect(() => () => {\r\n viewportObserver.disconnect()\r\n dprQuery.removeEventListener('change', applySoon)\r\n sentinel.remove()\r\n }, 'dsh-any-background: viewport watch')\r\n\r\n // 5. Locale.\r\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'dsh-any-background: i18n')\r\n\r\n // 6. Section injection.\r\n const sectionInject = (actions: BoundActions): Omit<ThemeSectionProps, 'useStore'> => {\r\n bound = actions; syncBg()\r\n // The panel opens long after boot: push the current meta snapshot so the\r\n // profiles/rotation/schedule/scheme controls render live state, not the\r\n // store's boot-time defaults.\r\n syncMetaNow()\r\n // Play a picked/imported video instantly from a local object URL while its\r\n // raw bytes stream to disk in the background — no upload + first-buffer\r\n // wait after import. The serve URL takes over on the next reload.\r\n const playVideoFromBlob = (blob: Blob, mime: string | null): void => {\r\n const localUrl = URL.createObjectURL(blob)\r\n cfg.backgroundType = 'video'\r\n setWpUrl(null)\r\n cfg.videoBgState = { ...DEFAULT_CONFIG.bgState }\r\n setWpVideoUrl(localUrl, mime ?? blob.type ?? 'video/mp4')\r\n applyWp()\r\n syncBg()\r\n const applied = rWpVideo()\r\n void captureVideoSnapshot(localUrl).then(snap => {\r\n if (rWpVideo() !== applied) return\r\n setWpVideoSnapshot(snap)\r\n applyThemeColor()\r\n syncBg()\r\n })\r\n void uploadVideo(blob, mime ?? blob.type ?? 'video/mp4').then(ok => {\r\n if (ok) persistConfig()\r\n })\r\n }\r\n const [wh, ws, wl] = rColor()\r\n const [dh, ds, dv] = hslToHsv(wh, ws, wl)\r\n return {\r\n t: ctx.locale.bind(NS),\r\n hue: dh, sat: ds, lit: dv,\r\n setColor: (nh: number, ns: number, nl: number) => {\r\n const [sh, ss, sl] = hsvToHsl(nh, ns, nl)\r\n cfg.color = [sh, ss, sl]\r\n // Preview UI stays synchronous for instant feedback; the expensive work\r\n // (theme registration + token writes + persist) is debounced by 80ms.\r\n if (colorTimerRef.current !== null) window.clearTimeout(colorTimerRef.current)\r\n colorTimerRef.current = window.setTimeout(() => {\r\n colorTimerRef.current = null\r\n registerCustom(sh, ss, sl)\r\n applyWp()\r\n saveConfig()\r\n }, 80)\r\n // Keep the canonical color in the store so programmatic changes and\r\n // remounts share one source.\r\n colorRev++\r\n bound?.syncColor([nh, ns, nl], colorRev)\r\n },\r\n // Server-side set: the wallpaper bytes are ALREADY persisted by the caller\r\n // (raw upload / URL download / rotation), so this only switches the theme\r\n // to image mode and points the display at the serve URL. null removes the\r\n // stored image and video.\r\n setWpFromServer: (u: string | null) => {\r\n cfg.backgroundType = 'image'\r\n // Retain the upload in its own slot so type switches never lose it.\r\n // The generated-background brightness verdict stops applying here.\r\n setBgDark(null)\r\n setWpImageUrl(u)\r\n // Mirror the same rev'd URL so wpUrl and the display never diverge.\r\n setWpUrl(rWpImage())\r\n setBgState({ ...DEFAULT_CONFIG.bgState })\r\n if (u === null) {\r\n // Removing the background clears the stored video as well.\r\n setWpVideoUrl(null, null)\r\n void persistVideo(null)\r\n persistWallpaper(null)\r\n }\r\n applyThemeColor()\r\n syncBg()\r\n },\r\n setVideo: async (u: Blob | string | null, mime: string | null) => {\r\n setBgDark(null)\r\n if (u === null) {\r\n // Removing: clear the stored video and return to the image slot.\r\n setWpVideoUrl(null, null)\r\n cfg.backgroundType = 'image'\r\n setWpUrl(rWpImage())\r\n void persistVideo(null)\r\n applyThemeColor()\r\n syncBg()\r\n saveConfig()\r\n return\r\n }\r\n if (typeof u !== 'string') {\r\n // A picked file plays instantly from a local object URL while its raw\r\n // bytes stream to disk in the background — no upload + buffer wait.\r\n playVideoFromBlob(u, mime)\r\n return\r\n }\r\n // Legacy data-URL string path: persist, then play from the serve URL.\r\n const ok = await persistVideo(u)\r\n const live = ok ? VIDEO_SERVE_URL : u\r\n cfg.backgroundType = 'video'\r\n setWpUrl(null)\r\n cfg.videoBgState = { ...DEFAULT_CONFIG.bgState }\r\n setWpVideoUrl(live, mime ?? null)\r\n applyWp()\r\n saveConfig()\r\n syncBg()\r\n const applied = rWpVideo()\r\n void captureVideoSnapshot(live).then(snap => {\r\n if (rWpVideo() !== applied) return\r\n setWpVideoSnapshot(snap)\r\n applyThemeColor()\r\n syncBg()\r\n })\r\n },\r\n setBgType: (type: BackgroundType) => {\r\n setBackgroundType(type)\r\n // Keep the uploaded wallpaper on disk so it can be restored when the\r\n // user returns to the image type; it is only removed via setWpFromServer(null).\r\n saveConfig()\r\n syncBg()\r\n },\r\n setGeneratedBg: (params) => {\r\n updateGeneratedBg(params)\r\n saveConfig()\r\n syncBg()\r\n },\r\n regenerateBg: () => {\r\n regenerateGeneratedBg()\r\n // Immediate (non-debounced) write so the new seed survives a refresh\r\n // fired right after the click.\r\n persistConfig()\r\n syncBg()\r\n },\r\n setRegenerateOnReload: (v: boolean) => {\r\n cfg.regenerateOnReload = v\r\n // Immediate (non-debounced) write: a debounced save can be cut off by\r\n // page unload, which would revert the toggle on the next refresh.\r\n persistConfig()\r\n syncBg()\r\n },\r\n setOps: (ops: PartOpacities) => { cfg.opacities = ops; applyWp(); syncBg(); saveConfig() },\r\n setBlurs: (blurs: PartBlurs) => { cfg.blurs = blurs; applyWp(); syncBg(); saveConfig() },\r\n setWop: (v: number) => { cfg.wallpaperOpacity = v; applyWp(); syncBg(); saveConfig() },\r\n setBl: (v: number) => { cfg.blur = v; applyWp(); syncBg(); saveConfig() },\r\n setSop: (v: number) => { cfg.settingsOpacity = v; applySettingsOverrides(v); saveConfig() },\r\n // One-click: derive a theme color from the current wallpaper. Purely\r\n // client-side — no RPC traffic; the sample is a 64×64 canvas.\r\n extractColor: async (): Promise<boolean> => {\r\n const url = rWp()\r\n if (!url) return false\r\n // Video mode extracts from the frame snapshot through the video's\r\n // placement state (rWp already returns the snapshot there).\r\n const st = cfg.backgroundType === 'video' ? rVideoBgState() : rBgState()\r\n const hsl = await extractWallpaperColor(url, st)\r\n if (!hsl) return false\r\n cfg.color = hsl\r\n registerCustom(hsl[0], hsl[1], hsl[2])\r\n applyWp()\r\n saveConfig()\r\n const hsv = hslToHsv(hsl[0], hsl[1], hsl[2])\r\n colorRev++\r\n bound?.syncColor(hsv, colorRev)\r\n return true\r\n },\r\n // Download the whole theme as dsh-any-theme.json: the config plus the\r\n // wallpaper data URL only when it is an uploaded image, and the video\r\n // bytes copied in as a data URL when a video background is active.\r\n // Generated backgrounds are reconstructed from the saved params on\r\n // import, so their exports stay small.\r\n exportTheme: async () => {\r\n let videoPayload: string | null = null\r\n if (cfg.backgroundType === 'video') {\r\n const vurl = rWpVideo()\r\n if (vurl) {\r\n try {\r\n const blob = await fetch(vurl).then(r => r.blob())\r\n videoPayload = await blobToDataUrl(blob)\r\n // The serve route may report a generic Content-Type; pin the\r\n // recorded MIME so the import detector sees data:video/….\r\n if (videoPayload && !/^data:video\\//.test(videoPayload)) {\r\n videoPayload = videoPayload.replace(/^data:[^;,]*/, `data:${cfg.videoMime ?? 'video/mp4'}`)\r\n }\r\n } catch {\r\n videoPayload = null\r\n }\r\n }\r\n }\r\n // The wallpaper is displayed through the serve URL; exports embed the\r\n // bytes (fetched from that URL) so the file is portable.\r\n let wallpaperPayload: string | null = null\r\n if (cfg.backgroundType === 'image') {\r\n const wurl = rWp()\r\n if (wurl) {\r\n if (wurl.startsWith('data:')) {\r\n wallpaperPayload = wurl\r\n } else {\r\n try {\r\n const blob = await fetch(wurl).then(r => r.blob())\r\n wallpaperPayload = await blobToDataUrl(blob)\r\n } catch {\r\n wallpaperPayload = null\r\n }\r\n }\r\n }\r\n }\r\n const payload = {\r\n version: 2,\r\n exportedAt: new Date().toISOString(),\r\n config: cfg,\r\n wallpaper: wallpaperPayload,\r\n video: videoPayload,\r\n }\r\n const blob = new Blob([JSON.stringify(payload, null, 2)], { type: 'application/json' })\r\n const url = URL.createObjectURL(blob)\r\n const a = document.createElement('a')\r\n a.href = url\r\n a.download = 'dsh-any-theme.json'\r\n a.click()\r\n URL.revokeObjectURL(url)\r\n },\r\n // Import a theme JSON: apply the config to memory, then persist through\r\n // the same paths as manual edits — config → theme-config.json, wallpaper\r\n // base64 → wallpaper.jpg (decoded on the node half). For generated\r\n // backgrounds the image is reconstructed from params instead of persisted.\r\n importTheme: async (file: File): Promise<boolean> => {\r\n try {\r\n const data: unknown = JSON.parse(await file.text())\r\n if (!data || typeof data !== 'object') return false\r\n const d = data as { version?: number; config?: unknown; wallpaper?: unknown; video?: unknown }\r\n if (typeof d.config !== 'object' || d.config === null) return false\r\n adoptConfig(d.config)\r\n if (cfg.backgroundType === 'video') {\r\n const video = typeof d.video === 'string' && /^data:video\\//.test(d.video) ? d.video : null\r\n if (video !== null) {\r\n // Decode the embedded data URL to a blob and play it instantly\r\n // from a local object URL while the bytes stream to disk in the\r\n // background (the data-URL RPC path stays as the small fallback).\r\n let blob: Blob | null = null\r\n try { blob = await fetch(video).then(r => r.blob()) } catch { blob = null }\r\n if (blob !== null) {\r\n playVideoFromBlob(blob, cfg.videoMime)\r\n } else {\r\n const ok = await persistVideo(video)\r\n const live = ok ? VIDEO_SERVE_URL : video\r\n setWpVideoUrl(live, cfg.videoMime)\r\n applyWp()\r\n const applied = rWpVideo()\r\n void captureVideoSnapshot(live).then(snap => {\r\n if (rWpVideo() !== applied) return\r\n setWpVideoSnapshot(snap)\r\n applyThemeColor()\r\n syncBg()\r\n })\r\n }\r\n } else {\r\n // Export lacked the video payload: fall back to no background.\r\n setWpVideoUrl(null, null)\r\n void persistVideo(null)\r\n cfg.backgroundType = 'image'\r\n setWpImageUrl(null)\r\n setWpUrl(null)\r\n persistWallpaper(null)\r\n applyThemeColor()\r\n }\r\n } else if (cfg.backgroundType === 'image') {\r\n const wallpaper = typeof d.wallpaper === 'string' && /^data:image\\//.test(d.wallpaper) ? d.wallpaper : null\r\n setWpImageUrl(wallpaper)\r\n setWpUrl(wallpaper)\r\n persistWallpaper(wallpaper)\r\n applyThemeColor()\r\n } else {\r\n setWpImageUrl(null)\r\n setWpUrl(null)\r\n persistWallpaper(null)\r\n // Reconstruct the imported dynamic background from its saved params.\r\n // Import means \"restore what I exported\", so the seed/params must be\r\n // preserved exactly; only regenerate a fresh look when the user has\r\n // that preference enabled — mirroring the boot-restore branch.\r\n if (cfg.regenerateOnReload) regenerateGeneratedBg()\r\n else if (cfg.generatedBg) updateGeneratedBg(cfg.generatedBg)\r\n }\r\n persistConfig()\r\n if (rHasColor()) {\r\n const [h, s, l] = rColor()\r\n registerCustom(h, s, l)\r\n }\r\n syncBg()\r\n if (rHasColor()) {\r\n colorRev++\r\n bound?.syncColor(hslToHsv(...rColor()), colorRev)\r\n }\r\n return true\r\n } catch {\r\n return false\r\n }\r\n },\r\n // Save the current appearance as a named profile (oldest dropped at 20).\r\n saveProfile: (name: string): boolean => {\r\n const trimmed = name.trim()\r\n if (!trimmed) return false\r\n const profiles = [...rProfiles()]\r\n if (profiles.length >= 20) profiles.shift()\r\n const id = `p-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`\r\n profiles.push({ id, name: trimmed.slice(0, 60), createdAt: new Date().toISOString(), config: currentAppearance() })\r\n cfg.profiles = profiles\r\n cfg.activeProfile = id\r\n persistConfig()\r\n syncMetaNow()\r\n return true\r\n },\r\n applyProfile: (id: string): boolean => applyProfileById(id),\r\n deleteProfile: (id: string): boolean => {\r\n const before = rProfiles()\r\n if (!before.some(p => p.id === id)) return false\r\n cfg.profiles = before.filter(p => p.id !== id)\r\n if (cfg.activeProfile === id) cfg.activeProfile = null\r\n // Clear schedule references so the tick never targets a dead id.\r\n const sc = rSchedule()\r\n if (sc.dayProfile === id || sc.nightProfile === id) {\r\n cfg.schedule = {\r\n ...sc,\r\n dayProfile: sc.dayProfile === id ? null : sc.dayProfile,\r\n nightProfile: sc.nightProfile === id ? null : sc.nightProfile,\r\n }\r\n }\r\n persistConfig()\r\n syncMetaNow()\r\n return true\r\n },\r\n applyPreset: (appearance: ProfileAppearance): void => {\r\n applyAppearanceLive(appearance)\r\n cfg.activeProfile = null\r\n applyWp()\r\n persistConfig()\r\n syncMetaNow()\r\n },\r\n setSchemeOverride: (v: SchemeOverride): void => {\r\n cfg.schemeOverride = v\r\n // Re-register the skin in every case: with a color the palette follows\r\n // the forced direction; without one a neutral palette is registered so\r\n // the host presenter flips the fonts too.\r\n registerCustom()\r\n applyWp()\r\n saveConfig()\r\n syncMetaNow()\r\n },\r\n setSchedule: (patch: Partial<ScheduleConfig>): void => {\r\n cfg.schedule = { ...rSchedule(), ...patch }\r\n if (patch.enabled === true) scheduleTick()\r\n persistConfig()\r\n syncMetaNow()\r\n },\r\n setRotation: (patch: Partial<Pick<typeof cfg.rotation, 'enabled' | 'mode' | 'interval'>>): void => {\r\n cfg.rotation = { ...rRotation(), ...patch }\r\n if (patch.enabled === true) void maybeRotate()\r\n persistConfig()\r\n syncMetaNow()\r\n },\r\n addRotationItems: async (files: File[]): Promise<boolean> => {\r\n let added = false\r\n for (const f of files) {\r\n if (!f.type.startsWith('image/')) continue\r\n const dataUrl = await readImgAsync(f)\r\n if (!dataUrl) continue\r\n const thumb = await makeThumb(dataUrl)\r\n const r = await rotationAdd(dataUrl, thumb ?? '')\r\n if (r.ok && r.items !== undefined) {\r\n cfg.rotation = { ...rRotation(), items: r.items as RotationItem[] }\r\n added = true\r\n }\r\n }\r\n if (added) {\r\n // Server already wrote the items into its config copy; re-persist so\r\n // the client's full config (meta included) stays authoritative.\r\n persistConfig()\r\n syncMetaNow()\r\n syncBg()\r\n }\r\n return added\r\n },\r\n removeRotationItem: async (index: number): Promise<boolean> => {\r\n const r = await rotationRemove(index)\r\n if (!r.ok || r.items === undefined) return false\r\n const rot = rRotation()\r\n cfg.rotation = {\r\n ...rot,\r\n items: r.items as RotationItem[],\r\n current: Math.max(0, Math.min(rot.current >= index ? rot.current - 1 : rot.current, Math.max(0, r.items.length - 1))),\r\n }\r\n persistConfig()\r\n syncMetaNow()\r\n return true\r\n },\r\n rotateNow: async (): Promise<boolean> => {\r\n if (rRotation().items.length === 0) return false\r\n return applyRotationIndex(pickNextRotationIndex(), true)\r\n },\r\n // Network video URL: the server streams it into the video slot; the\r\n // client switches to video mode and plays from the serve URL, then\r\n // captures the preview frame through the same path as local uploads.\r\n setVideoFromUrl: async (url: string): Promise<boolean> => {\r\n const r = await rpcSetVideoFromUrl(url)\r\n if (!r.ok || !r.mime) {\r\n console.warn('dsh-any-background: video url fetch failed', r.error)\r\n return false\r\n }\r\n setBgDark(null)\r\n cfg.backgroundType = 'video'\r\n setWpUrl(null)\r\n cfg.videoBgState = { ...DEFAULT_CONFIG.bgState }\r\n setWpVideoUrl(VIDEO_SERVE_URL, r.mime)\r\n applyWp()\r\n saveConfig()\r\n syncBg()\r\n const applied = rWpVideo()\r\n void captureVideoSnapshot(applied!).then(snap => {\r\n if (rWpVideo() !== applied) return\r\n setWpVideoSnapshot(snap)\r\n applyThemeColor()\r\n syncBg()\r\n })\r\n return true\r\n },\r\n }\r\n }\r\n ctx.slots.inject('settings.section', () => ctx.slots.register({\r\n name: 'settings.section', id: 'dsh-any-background', order: 35,\r\n label: () => ctx.locale.bind(NS)('nav'),\r\n locale: NS, store, inject: sectionInject,\r\n }, ThemeSection as any))\r\n\r\n // 6.5. Settings-nav icon: the harness derives the nav glyph from the section\r\n // id (unknown ids fall back to the settings gear) with no plugin hook, so\r\n // patch the mounted nav cell in place — find the cell whose label matches\r\n // this section's nav text and swap its svg for the sun glyph.\r\n const navLabel = (): string => ctx.locale.bind(NS)('nav')\r\n const applyNavIcon = (): void => {\r\n const panel = document.querySelector<HTMLElement>('[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby]')\r\n const nav = panel?.querySelector('nav')\r\n if (!nav) return\r\n const target = navLabel()\r\n for (const cell of Array.from(nav.querySelectorAll('button'))) {\r\n const label = cell.querySelector('span')\r\n if (label && label.textContent?.trim() === target) {\r\n const svg = cell.querySelector('svg')\r\n if (svg && svg.dataset.dshAnyIcon !== '1') {\r\n const sun = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\r\n sun.setAttribute('width', '16')\r\n sun.setAttribute('height', '16')\r\n sun.setAttribute('viewBox', '0 0 16 16')\r\n sun.setAttribute('fill', 'none')\r\n sun.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\r\n sun.dataset.dshAnyIcon = '1'\r\n sun.innerHTML = SUN_PATHS\r\n svg.replaceWith(sun)\r\n }\r\n return\r\n }\r\n }\r\n }\r\n let navIconObserver: MutationObserver | null = null\r\n const watchNavIcon = (): void => {\r\n if (navIconObserver !== null || typeof MutationObserver === 'undefined') return\r\n navIconObserver = new MutationObserver(records => {\r\n // React only when the settings panel (or its nav) is (re)created, so\r\n // chat-content mutations don't trigger a scan.\r\n const relevant = records.some(r => {\r\n for (const n of r.addedNodes) {\r\n if (n.nodeType !== 1) continue\r\n const el = n as Element\r\n if (el.matches?.('[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby]') || el.querySelector?.('[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby]')) return true\r\n }\r\n return false\r\n })\r\n if (relevant) applyNavIcon()\r\n })\r\n navIconObserver.observe(document.body, { childList: true, subtree: true })\r\n applyNavIcon()\r\n }\r\n watchNavIcon()\r\n ctx.effect(() => () => { navIconObserver?.disconnect(); navIconObserver = null }, 'dsh-any-background: nav icon watch')\r\n\r\n // 7. Deferred boot restore: the theme service and the host settings scope\r\n // settle asynchronously after this apply, so the synchronous restore can be\r\n // observed mid-flight — a late host adoption resets the preference, or the\r\n // presenter re-applies over our overrides. Re-running the saved-color and\r\n // wallpaper restore a few ticks later guarantees the saved records land.\r\n const restoreSaved = (): void => {\r\n if (rHasColor()) {\r\n const snapshot = ctx.theme.getTheme()\r\n if (!snapshot.themes.some(t => t.id === CUSTOM_ID)) {\r\n // Theme missing (host adoption dropped it): re-register + activate.\r\n const [h, s, l] = rColor()\r\n registerCustom(h, s, l)\r\n } else if (snapshot.preference !== CUSTOM_ID) {\r\n // Theme present but inactive: just re-assert the preference. Calling\r\n // registerCustom here would dispose + re-create the skin, flashing the\r\n // interface back to the system theme for a frame on every boot.\r\n ctx.theme.setTheme(CUSTOM_ID)\r\n }\r\n }\r\n applyWp()\r\n }\r\n const restoreTimers = [300, 1500].map(delay => window.setTimeout(restoreSaved, delay))\r\n ctx.effect(() => () => { restoreTimers.forEach(id => window.clearTimeout(id)) }, 'dsh-any-background: boot restore')\r\n\r\n // 8. Theme watchdog: the theme service keeps only built-in preferences in\r\n // memory, so ANY host-scope adoption can silently drop the custom theme —\r\n // reverting the label colors (white/black) and the inner surfaces to the\r\n // system palette. While the skin has anything to say (a color, a brightness\r\n // verdict, or a forced scheme), re-register and re-assert the custom theme\r\n // on a slow interval so the theme state always matches it, independent of\r\n // which event resets it.\r\n const watchdogId = window.setInterval(() => {\r\n if (!rHasColor() && rBgDark() === null && rSchemeOverride() === 'auto') return\r\n const snapshot = ctx.theme.getTheme()\r\n let changed = false\r\n if (!snapshot.themes.some(t => t.id === CUSTOM_ID)) {\r\n registerCustom()\r\n changed = true\r\n } else if (snapshot.preference !== CUSTOM_ID) {\r\n ctx.theme.setTheme(CUSTOM_ID)\r\n changed = true\r\n }\r\n if (changed) applyWp()\r\n }, 1000)\r\n ctx.effect(() => () => { window.clearInterval(watchdogId) }, 'dsh-any-background: theme watchdog')\r\n\r\n // 8.5. Theme-reset watchdog: counter the host re-asserting its own light\r\n // :root/body scheme after startup (refresh, cold load, settings adoption),\r\n // which would paint a frame of white surfaces.\r\n const disposeThemeResets = watchThemeResets()\r\n ctx.effect(() => () => { disposeThemeResets() }, 'dsh-any-background: theme resets watch')\r\n\r\n // 9. Flush any pending debounced config write when the page is hidden or\r\n // closed, so the last slider position is never lost to the debounce window.\r\n const onPageHide = (): void => flushSave()\r\n window.addEventListener('pagehide', onPageHide)\r\n ctx.effect(() => () => window.removeEventListener('pagehide', onPageHide), 'dsh-any-background: pagehide flush')\r\n}\r\n"],"mappings":"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"}
|