@nonamelego/dsh-catppuccin 0.2.8 → 0.2.9

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.
Binary file
package/lib/client.js CHANGED
@@ -2022,25 +2022,18 @@ window.__ModuleLoader__.load({
2022
2022
  glass: glass.getRemoteState()
2023
2023
  });
2024
2024
  ctx.effect(() => {
2025
- let desired = readFlavor();
2026
- let settled = false;
2027
- const started = Date.now();
2028
2025
  const applyDesired = () => {
2029
- if (settled) return;
2030
- if (Date.now() - started > 5e3) {
2031
- settled = true;
2032
- return;
2033
- }
2026
+ const desired = readFlavor();
2034
2027
  if (desired === "off") return;
2028
+ const preference = theme.getTheme().preference;
2029
+ if (preference === desired) return;
2030
+ if (preference !== "system") return;
2035
2031
  try {
2036
- if (theme.getTheme().preference !== desired) theme.setTheme(desired);
2032
+ theme.setTheme(desired);
2037
2033
  } catch {}
2038
2034
  };
2039
2035
  applyDesired();
2040
2036
  const disposer = ctx.on("theme/change", applyDesired);
2041
- const timer = window.setTimeout(() => {
2042
- settled = true;
2043
- }, 5e3);
2044
2037
  const onStorage = (event) => {
2045
2038
  if (event.key !== "dsh.catppuccin.flavor") return;
2046
2039
  const next = readFlavor();
@@ -2062,18 +2055,16 @@ window.__ModuleLoader__.load({
2062
2055
  }
2063
2056
  writeFlavor(result.state.flavor);
2064
2057
  glass.applyRemote(result.state.glass);
2065
- desired = result.state.flavor;
2066
2058
  applyDesired();
2067
2059
  });
2068
2060
  return () => {
2069
2061
  cancelled = true;
2070
2062
  offGlass();
2071
2063
  disposer();
2072
- window.clearTimeout(timer);
2073
2064
  window.removeEventListener("storage", onStorage);
2074
2065
  cancelDurablePersist();
2075
2066
  };
2076
- }, "catppuccin: boot restore");
2067
+ }, "catppuccin: theme restore");
2077
2068
  const injected = () => ({
2078
2069
  themes: CATPPUCCIN_FLAVORS.map((flavor) => ({
2079
2070
  id: flavor.themeId,
@@ -2087,15 +2078,15 @@ window.__ModuleLoader__.load({
2087
2078
  subscribe: (listener) => ctx.on("theme/change", listener),
2088
2079
  select: (choice) => {
2089
2080
  if (choice === "off") {
2090
- theme.setTheme("system");
2091
2081
  writeFlavor("off");
2082
+ theme.setTheme("system");
2092
2083
  scheduleDurablePersist(buildLocalState);
2093
2084
  return;
2094
2085
  }
2095
2086
  const flavor = flavorInfo(choice);
2096
2087
  if (!flavor) return;
2097
- theme.setTheme(flavor.themeId);
2098
2088
  writeFlavor(flavor.themeId);
2089
+ theme.setTheme(flavor.themeId);
2099
2090
  scheduleDurablePersist(buildLocalState);
2100
2091
  }
2101
2092
  });
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["useSyncExternalStore","css","useSyncExternalStore","useState"],"sources":["../src/client/CatppuccinRow.tsx","../src/client/locales.ts","../src/client/palettes.ts","../src/client/shiki-tokens.ts","../src/client/glass/glass-seams.ts","../src/client/glass/glass-layer.ts","../src/client/glass/glass-row.tsx","../src/client/UpdateRow.tsx","../src/update-check.ts","../src/state.ts","../src/client/state-sync.ts","../src/client/index.ts"],"sourcesContent":["/**\n * Catppuccin settings row — one General-section preference row listing the\n * four flavour themes plus a \"follow system\" (off) choice. Selecting a\n * flavour calls the injected `select`, which switches the official\n * ThemeRuntime and persists the choice. The row subscribes to `theme/change`\n * so the highlighted flavour tracks the live preference.\n */\nimport { useSyncExternalStore } from 'react'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { FlavorChoice } from './index.ts'\n\n/** One flavour button shown by the row. */\nexport interface CatppuccinFlavorButton {\n /** Theme id registered into ThemeRuntime. */\n id: string\n /** Display label. */\n label: string\n /** Accent colour for the swatch. */\n accent: string\n}\n\n/** Injected business face of the row (assembled in apply). */\nexport interface CatppuccinRowInjected {\n /** The four flavours, in display order. */\n themes: readonly CatppuccinFlavorButton[]\n /** Current choice (`off` when a Catppuccin theme is not active). */\n current: () => FlavorChoice\n /** Subscribe to theme preference changes. Returns the disposer. */\n subscribe: (listener: () => void) => () => void\n /** Switch the theme and persist the choice (`off` reverts to system). */\n select: (choice: FlavorChoice) => void | Promise<void>\n}\n\n/** Full component props: runtime share + locale seat + injected face. */\nexport type CatppuccinRowProps = PropsRuntime<'settings.general.item'> & PropsLocale<'catppuccin'> & CatppuccinRowInjected\n\n/**\n * Render the Catppuccin row: title, one swatch button per flavour, and a\n * follow-system button. The active flavour is highlighted; clicking a flavour\n * applies it immediately (live, no restart) and persists the choice.\n * @param props - composed slot props.\n * @returns the row element tree.\n */\nexport function CatppuccinRow({ t, themes, current, subscribe, select }: CatppuccinRowProps): React.JSX.Element {\n const choice = useSyncExternalStore(subscribe, current)\n return (\n <div style={{ borderBottom: '1px solid var(--dsw-alias-border-l2)', display: 'flex', flexDirection: 'column', gap: '10px', padding: '16px 0' }}>\n <div style={{ color: 'var(--dsw-alias-label-primary)', fontSize: 14, lineHeight: '22px' }}>\n {t('row.title')}\n </div>\n <div style={{ color: 'var(--dsw-alias-label-tertiary)', fontSize: 12, lineHeight: '18px' }}>\n {t('row.description')}\n </div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '8px' }}>\n {themes.map((flavor) => {\n const selected = choice === flavor.id\n return (\n <button\n key={flavor.id}\n type=\"button\"\n aria-pressed={selected}\n onClick={() => void select(flavor.id)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n padding: '6px 12px',\n borderRadius: 8,\n border: `1px solid ${selected ? 'var(--dsw-alias-border-l3)' : 'var(--dsw-alias-border-l1)'}`,\n background: selected ? 'var(--dsw-alias-interactive-bg-active)' : 'transparent',\n color: 'var(--dsw-alias-label-primary)',\n cursor: 'pointer',\n font: 'inherit',\n }}\n >\n <span aria-hidden=\"true\" style={{ width: 12, height: 12, borderRadius: 3, background: flavor.accent, flex: 'none' }} />\n {flavor.label}\n </button>\n )\n })}\n <button\n key=\"off\"\n type=\"button\"\n aria-pressed={choice === 'off'}\n onClick={() => void select('off')}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n padding: '6px 12px',\n borderRadius: 8,\n border: `1px solid ${choice === 'off' ? 'var(--dsw-alias-border-l3)' : 'var(--dsw-alias-border-l1)'}`,\n background: choice === 'off' ? 'var(--dsw-alias-interactive-bg-active)' : 'transparent',\n color: 'var(--dsw-alias-label-primary)',\n cursor: 'pointer',\n font: 'inherit',\n }}\n >\n {t('row.off')}\n </button>\n </div>\n </div>\n )\n}\n","/**\n * Catppuccin settings-row copy. The zh dictionary is the key-set source of\n * truth; the en dictionary mirrors it (checked complete against the zh keys).\n */\n\n/** Simplified Chinese dictionary. */\nexport const zh = {\n 'row.title': 'Catppuccin 主题',\n 'row.description': 'Latte / Frappé / Macchiato / Mocha 四款配色,一键切换。',\n 'row.off': '跟随系统',\n 'flavor.latte': 'Latte',\n 'flavor.frappe': 'Frappé',\n 'flavor.macchiato': 'Macchiato',\n 'flavor.mocha': 'Mocha',\n 'glass.title': '玻璃质感',\n 'glass.description': '顶栏、侧边栏、输入框、统计行、轨迹视图的磨砂玻璃效果,一键开关。',\n 'glass.enable': '总开关',\n 'glass.on': '开启',\n 'glass.off': '关闭',\n 'glass.mode': '模式',\n 'glass.modeMica': '云母效果',\n 'glass.modeCompat': '兼容模式',\n 'glass.modeHint': '云母效果把界面改成悬浮磨砂卡片;兼容模式保持原版排版,只换玻璃材质',\n 'glass.blur': '玻璃模糊度',\n 'glass.frost': '磨砂度',\n 'glass.brightness': '背景亮度',\n 'glass.brightnessHintDark': '深色模式:0 压暗至纯黑,50 原样',\n 'glass.brightnessHintLight': '浅色模式:50 原样,100 提亮至纯白',\n 'glass.reset': '还原默认值',\n 'update.title': '检查 Catppuccin 插件更新',\n 'update.description': '检测本插件(dsh-catppuccin)在 npm 上的最新版本,判断当前安装是否需要升级。',\n 'update.check': '检查更新',\n 'update.checking': '检查中…',\n 'update.current': '当前版本',\n 'update.upToDate': '已是最新版本 🎉',\n 'update.available': '发现新版本:',\n 'update.commandHint': '在终端运行以下命令升级(把 web 换成你的 profile 名):',\n 'update.commandHintDetected': '已自动探测到 profile「{profile}」,在终端运行以下命令升级:',\n 'update.commandHintDesktop': '已检测到你在使用 DSH Desktop,目标 profile「{profile}」,请在 DSH 终端中运行以下命令升级:',\n 'update.restartHint': '升级完成后重启 dsh web 生效。',\n 'update.restartHintDesktop': '升级完成后重启 DSH Desktop 生效。',\n 'update.copy': '复制命令',\n 'update.copied': '已复制 ✓',\n 'update.failed': '检查失败,请稍后重试。',\n 'update.retry': '重试',\n 'update.checkedAt': '检查时间',\n 'update.localInstall': '检测到本地链接/源码安装,npm 升级命令可能不适用——请用 git pull 或重新构建。',\n 'update.err.registry': '无法连接 npm registry,请检查网络后重试。',\n 'update.err.http': 'npm registry 返回异常状态码,请稍后重试。',\n 'update.err.noTags': 'npm registry 未返回可用的版本标签。',\n 'update.err.invalid': 'npm registry 返回了无法解析的数据。',\n 'update.err.network': '无法连接插件宿主,请刷新页面后重试。',\n} as const\n\n/** English dictionary, checked complete against the zh key set. */\nexport const en: Record<keyof typeof zh, string> = {\n 'row.title': 'Catppuccin theme',\n 'row.description': 'Latte / Frappé / Macchiato / Mocha, one click away.',\n 'row.off': 'Follow system',\n 'flavor.latte': 'Latte',\n 'flavor.frappe': 'Frappé',\n 'flavor.macchiato': 'Macchiato',\n 'flavor.mocha': 'Mocha',\n 'glass.title': 'Glassmorphism',\n 'glass.description': 'Frosted glass for the top bar, sidebar, composer, stats line and trajectory view — one click on/off.',\n 'glass.enable': 'Master switch',\n 'glass.on': 'On',\n 'glass.off': 'Off',\n 'glass.mode': 'Mode',\n 'glass.modeMica': 'Mica',\n 'glass.modeCompat': 'Compatibility',\n 'glass.modeHint': 'Mica restyles the UI into floating frosted cards; Compatibility keeps the stock layout and only swaps the material to glass',\n 'glass.blur': 'Glass blur',\n 'glass.frost': 'Frost',\n 'glass.brightness': 'Backdrop brightness',\n 'glass.brightnessHintDark': 'Dark mode: 0 fades to pure black, 50 unchanged',\n 'glass.brightnessHintLight': 'Light mode: 50 unchanged, 100 brightens to pure white',\n 'glass.reset': 'Reset to defaults',\n 'update.title': 'Check for Catppuccin plugin updates',\n 'update.description': 'Checks npm for the latest dsh-catppuccin release and whether this install is current.',\n 'update.check': 'Check for updates',\n 'update.checking': 'Checking…',\n 'update.current': 'Current version',\n 'update.upToDate': 'Up to date 🎉',\n 'update.available': 'New version available:',\n 'update.commandHint': 'Run this in a terminal to upgrade (replace web with your profile name):',\n 'update.commandHintDetected': 'Profile \"{profile}\" detected — run this in a terminal to upgrade:',\n 'update.commandHintDesktop': 'DSH Desktop detected — target profile \"{profile}\", run this in the DSH terminal to upgrade:',\n 'update.restartHint': 'Restart dsh web after the upgrade.',\n 'update.restartHintDesktop': 'Restart DSH Desktop after the upgrade.',\n 'update.copy': 'Copy command',\n 'update.copied': 'Copied ✓',\n 'update.failed': 'Check failed — try again later.',\n 'update.retry': 'Retry',\n 'update.checkedAt': 'Checked at',\n 'update.localInstall': 'This install is a local link/source checkout — the npm upgrade command may not apply; use git pull or rebuild instead.',\n 'update.err.registry': 'Could not reach the npm registry — check your network and retry.',\n 'update.err.http': 'The npm registry returned an unexpected status code.',\n 'update.err.noTags': 'The npm registry returned no usable version tags.',\n 'update.err.invalid': 'The npm registry returned unparseable data.',\n 'update.err.network': 'Could not reach the plugin host — refresh the page and retry.',\n}\n\n/** Key union of the Catppuccin dictionaries. */\nexport type CatppuccinKey = keyof typeof zh\n","/**\n * AUTO-GENERATED by scripts/generate-palettes.mjs — do not edit by hand.\n * Catppuccin token tables for the DeepSeek Harness web GUI.\n * Source palette: https://github.com/catppuccin/catppuccin (palette.json v1.8.0).\n * Each flavour carries a flat dictionary of every --dsw-static-*,\n * --dsw-alias-* and --dsw-specific-* token the official theme stylesheet\n * declares. Alias/specific entries keep their var() references so the static\n * overrides below flow through automatically; literal (non-var) entries are\n * remapped to Catppuccin colours.\n */\nexport type CatppuccinFlavorId = 'latte' | 'frappe' | 'macchiato' | 'mocha'\nexport interface CatppuccinFlavorInfo {\n /** Theme id registered into ThemeRuntime. */\n themeId: string\n /** Base color scheme this flavour builds on. */\n colorScheme: 'light' | 'dark'\n /** Display label. */\n label: string\n /** Accent colour for the settings row swatch. */\n accent: string\n /** Token dictionary (--dsw-* names). */\n tokens: Record<string, string>\n}\n\nexport const CATPPUCCIN_LATTE: CatppuccinFlavorInfo = {\n themeId: 'catppuccin-latte',\n colorScheme: 'light',\n label: 'Latte',\n accent: '#1e66f5',\n tokens: {\n \"--dsw-static-amber-100\": \"color-mix(in srgb, #fe640b 20%, #eff1f5)\",\n \"--dsw-static-amber-400\": \"color-mix(in srgb, #fe640b 70%, #eff1f5)\",\n \"--dsw-static-amber-500\": \"#fe640b\",\n \"--dsw-static-amber-600\": \"#fe640b\",\n \"--dsw-static-amber-900\": \"color-mix(in srgb, #fe640b 32%, #eff1f5)\",\n \"--dsw-static-blue-100\": \"color-mix(in srgb, #1e66f5 22%, #eff1f5)\",\n \"--dsw-static-blue-300\": \"color-mix(in srgb, #1e66f5 48%, #eff1f5)\",\n \"--dsw-static-blue-400\": \"color-mix(in srgb, #1e66f5 65%, #eff1f5)\",\n \"--dsw-static-blue-450\": \"color-mix(in srgb, #1e66f5 82%, #eff1f5)\",\n \"--dsw-static-blue-500\": \"#1e66f5\",\n \"--dsw-static-blue-50\": \"color-mix(in srgb, #1e66f5 8%, #eff1f5)\",\n \"--dsw-static-blue-50p\": \"color-mix(in srgb, #1e66f5 12%, #eff1f5)\",\n \"--dsw-static-blue-600\": \"color-mix(in srgb, #1e66f5 82%, #eff1f5)\",\n \"--dsw-static-blue-75\": \"color-mix(in srgb, #1e66f5 16%, #eff1f5)\",\n \"--dsw-static-blue-800\": \"color-mix(in srgb, #1e66f5 50%, #eff1f5)\",\n \"--dsw-static-blue-900\": \"color-mix(in srgb, #1e66f5 38%, #eff1f5)\",\n \"--dsw-static-blue-950\": \"color-mix(in srgb, #1e66f5 26%, #eff1f5)\",\n \"--dsw-static-deepseek-100\": \"color-mix(in srgb, #1e66f5 22%, #eff1f5)\",\n \"--dsw-static-deepseek-200\": \"color-mix(in srgb, #1e66f5 34%, #eff1f5)\",\n \"--dsw-static-deepseek-300\": \"color-mix(in srgb, #1e66f5 48%, #eff1f5)\",\n \"--dsw-static-deepseek-400\": \"color-mix(in srgb, #1e66f5 65%, #eff1f5)\",\n \"--dsw-static-deepseek-450\": \"color-mix(in srgb, #1e66f5 82%, #eff1f5)\",\n \"--dsw-static-deepseek-500\": \"#1e66f5\",\n \"--dsw-static-deepseek-50\": \"color-mix(in srgb, #1e66f5 8%, #eff1f5)\",\n \"--dsw-static-deepseek-600\": \"color-mix(in srgb, #1e66f5 82%, #eff1f5)\",\n \"--dsw-static-deepseek-700-delete\": \"color-mix(in srgb, #1e66f5 66%, #eff1f5)\",\n \"--dsw-static-deepseek-800\": \"color-mix(in srgb, #1e66f5 50%, #eff1f5)\",\n \"--dsw-static-deepseek-900\": \"color-mix(in srgb, #1e66f5 38%, #eff1f5)\",\n \"--dsw-static-green-100\": \"color-mix(in srgb, #40a02b 18%, #eff1f5)\",\n \"--dsw-static-green-400\": \"color-mix(in srgb, #40a02b 80%, #eff1f5)\",\n \"--dsw-static-green-500\": \"#40a02b\",\n \"--dsw-static-green-900\": \"color-mix(in srgb, #40a02b 30%, #eff1f5)\",\n \"--dsw-static-neutral-00\": \"#eff1f5\",\n \"--dsw-static-neutral-1000\": \"#4c4f69\",\n \"--dsw-static-neutral-100\": \"#bcc0cc\",\n \"--dsw-static-neutral-150\": \"#acb0be\",\n \"--dsw-static-neutral-200\": \"#9ca0b0\",\n \"--dsw-static-neutral-250\": \"#9ca0b0\",\n \"--dsw-static-neutral-300\": \"#8c8fa1\",\n \"--dsw-static-neutral-400\": \"#7c7f93\",\n \"--dsw-static-neutral-500\": \"#6c6f85\",\n \"--dsw-static-neutral-50\": \"#e6e9ef\",\n \"--dsw-static-neutral-550\": \"#6c6f85\",\n \"--dsw-static-neutral-600\": \"#5c5f77\",\n \"--dsw-static-neutral-700\": \"#5c5f77\",\n \"--dsw-static-neutral-800\": \"#4c4f69\",\n \"--dsw-static-neutral-850\": \"#4c4f69\",\n \"--dsw-static-neutral-900\": \"#4c4f69\",\n \"--dsw-static-neutral-bluish-00\": \"#eff1f5\",\n \"--dsw-static-neutral-bluish-1000\": \"#4c4f69\",\n \"--dsw-static-neutral-bluish-100\": \"#bcc0cc\",\n \"--dsw-static-neutral-bluish-150\": \"#acb0be\",\n \"--dsw-static-neutral-bluish-200\": \"#9ca0b0\",\n \"--dsw-static-neutral-bluish-300\": \"#8c8fa1\",\n \"--dsw-static-neutral-bluish-400\": \"#7c7f93\",\n \"--dsw-static-neutral-bluish-500\": \"#6c6f85\",\n \"--dsw-static-neutral-bluish-50\": \"#e6e9ef\",\n \"--dsw-static-neutral-bluish-600\": \"#5c5f77\",\n \"--dsw-static-neutral-bluish-60\": \"#e6e9ef\",\n \"--dsw-static-neutral-bluish-700\": \"#5c5f77\",\n \"--dsw-static-neutral-bluish-750\": \"#4c4f69\",\n \"--dsw-static-neutral-bluish-75\": \"#ccd0da\",\n \"--dsw-static-neutral-bluish-800\": \"#4c4f69\",\n \"--dsw-static-neutral-bluish-850\": \"#4c4f69\",\n \"--dsw-static-neutral-bluish-875\": \"#4c4f69\",\n \"--dsw-static-neutral-bluish-900\": \"#4c4f69\",\n \"--dsw-static-neutral-bluish-950\": \"#4c4f69\",\n \"--dsw-static-red-100\": \"color-mix(in srgb, #d20f39 20%, #eff1f5)\",\n \"--dsw-static-red-400\": \"color-mix(in srgb, #d20f39 70%, #eff1f5)\",\n \"--dsw-static-red-500\": \"#d20f39\",\n \"--dsw-static-red-50\": \"color-mix(in srgb, #d20f39 10%, #eff1f5)\",\n \"--dsw-static-red-600\": \"#d20f39\",\n \"--dsw-static-red-900\": \"color-mix(in srgb, #d20f39 34%, #eff1f5)\",\n \"--dsw-alias-bg-base\": \"var(--dsw-static-neutral-bluish-00)\",\n \"--dsw-alias-bg-layer-1\": \"var(--dsw-static-neutral-bluish-00)\",\n \"--dsw-alias-bg-layer-2\": \"var(--dsw-static-neutral-bluish-00)\",\n \"--dsw-alias-bg-layer-3\": \"var(--dsw-static-neutral-bluish-00)\",\n \"--dsw-alias-bg-mask-1\": \"rgba(0, 0, 0, 0.24)\",\n \"--dsw-alias-bg-mask-2\": \"rgba(0, 0, 0, 0.12)\",\n \"--dsw-alias-bg-mask-3\": \"rgba(0, 0, 0, 0.48)\",\n \"--dsw-alias-bg-mask-photo\": \"rgba(0, 0, 0, 0.88)\",\n \"--dsw-alias-bg-mask-drop\": \"rgba(255, 255, 255, 0.7)\",\n \"--dsw-alias-bg-module-platform\": \"var(--dsw-static-neutral-bluish-60)\",\n \"--dsw-alias-bg-multi-select\": \"var(--dsw-static-neutral-bluish-60)\",\n \"--dsw-alias-bg-overlay\": \"var(--dsw-static-neutral-bluish-150)\",\n \"--dsw-alias-bg-skeleton\": \"rgba(0, 0, 0, 0.04)\",\n \"--dsw-alias-border-inverted2\": \"rgba(0, 0, 0, 0)\",\n \"--dsw-alias-border-inverted\": \"rgba(0, 0, 0, 0)\",\n \"--dsw-alias-border-l1\": \"rgba(0, 0, 0, 0.04)\",\n \"--dsw-alias-border-l2-darkmode-thin\": \"rgba(0, 0, 0, 0.1)\",\n \"--dsw-alias-border-l2\": \"rgba(0, 0, 0, 0.1)\",\n \"--dsw-alias-border-l3\": \"rgba(0, 0, 0, 0.12)\",\n \"--dsw-alias-border-l4\": \"rgba(0, 0, 0, 0.16)\",\n \"--dsw-alias-brand-primary-invert\": \"var(--dsw-static-neutral-bluish-1000)\",\n \"--dsw-alias-brand-primary-new-colorprimary-new-color\": \"#1e66f5\",\n \"--dsw-alias-brand-primary\": \"var(--dsw-static-neutral-bluish-1000)\",\n \"--dsw-alias-brand-text\": \"var(--dsw-static-neutral-bluish-1000)\",\n \"--dsw-alias-button-contrast-fill\": \"var(--dsw-static-neutral-bluish-700)\",\n \"--dsw-alias-button-elevated-fill\": \"var(--dsw-static-neutral-bluish-00)\",\n \"--dsw-alias-button-floating-fill\": \"var(--dsw-static-neutral-bluish-00)\",\n \"--dsw-alias-button-floating-hover\": \"var(--dsw-static-neutral-bluish-75)\",\n \"--dsw-alias-button-ghost-active-border\": \"var(--dsw-static-neutral-bluish-500)\",\n \"--dsw-alias-button-ghost-active-fill\": \"var(--dsw-static-neutral-bluish-100)\",\n \"--dsw-alias-button-ghost-active-hover\": \"var(--dsw-static-neutral-bluish-150)\",\n \"--dsw-alias-button-info-fill\": \"var(--dsw-static-deepseek-500)\",\n \"--dsw-alias-button-info-hover\": \"var(--dsw-static-deepseek-400)\",\n \"--dsw-alias-button-primary-dimmed\": \"var(--dsw-static-neutral-bluish-100)\",\n \"--dsw-alias-button-primary-fill\": \"var(--dsw-alias-brand-primary)\",\n \"--dsw-alias-button-primary-hover\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-button-tool-bar-fill-invisible\": \"rgba(31, 31, 31, 0.36)\",\n \"--dsw-alias-button-tool-bar-fill\": \"rgba(84, 85, 87, 0.5)\",\n \"--dsw-alias-button-tool-bar-hover\": \"rgba(84, 85, 87, 0.6)\",\n \"--dsw-alias-interactive-bg-active\": \"rgba(38, 49, 72, 0.1)\",\n \"--dsw-alias-interactive-bg-hover-accent\": \"rgba(38, 49, 72, 0.14)\",\n \"--dsw-alias-interactive-bg-hover-danger\": \"rgba(236, 19, 19, 0.05)\",\n \"--dsw-alias-interactive-bg-hover-solid\": \"var(--dsw-static-neutral-bluish-75)\",\n \"--dsw-alias-interactive-bg-hover\": \"rgba(38, 49, 72, 0.06)\",\n \"--dsw-alias-label-caption\": \"var(--dsw-static-neutral-bluish-400)\",\n \"--dsw-alias-label-dimmed\": \"var(--dsw-static-neutral-bluish-200)\",\n \"--dsw-alias-label-primary-bluish\": \"var(--dsw-static-blue-900)\",\n \"--dsw-alias-label-primary-dimmed\": \"var(--dsw-static-neutral-bluish-950)\",\n \"--dsw-alias-label-primary-foreground\": \"var(--dsw-static-neutral-bluish-00)\",\n \"--dsw-alias-label-primary-inverted\": \"var(--dsw-static-neutral-bluish-00)\",\n \"--dsw-alias-label-primary\": \"var(--dsw-static-neutral-bluish-1000)\",\n \"--dsw-alias-label-secondary\": \"var(--dsw-static-neutral-bluish-700)\",\n \"--dsw-alias-label-tertiary\": \"var(--dsw-static-neutral-bluish-600)\",\n \"--dsw-alias-markdown-citation\": \"var(--dsw-static-neutral-bluish-100)\",\n \"--dsw-alias-markdown-code-block-banner\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-markdown-code-block\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-markdown-code-segment-selected\": \"var(--dsw-static-neutral-bluish-00)\",\n \"--dsw-alias-markdown-code-segment-unselected\": \"var(--dsw-static-neutral-bluish-75)\",\n \"--dsw-alias-markdown-inline-code\": \"var(--dsw-static-neutral-bluish-100)\",\n \"--dsw-alias-markdown-placeholder\": \"var(--dsw-static-neutral-bluish-60)\",\n \"--dsw-alias-markdown-tag\": \"var(--dsw-static-neutral-bluish-75)\",\n \"--dsw-alias-scrollbar-bg-l1\": \"var(--dsw-static-neutral-200)\",\n \"--dsw-alias-scrollbar-bg-l2\": \"var(--dsw-static-neutral-200)\",\n \"--dsw-alias-scrollbar-hover-l1\": \"var(--dsw-static-neutral-300)\",\n \"--dsw-alias-scrollbar-hover-l2\": \"var(--dsw-static-neutral-300)\",\n \"--dsw-alias-state-business-primary\": \"var(--dsw-static-deepseek-500)\",\n \"--dsw-alias-state-business-tertiary\": \"var(--dsw-static-deepseek-100)\",\n \"--dsw-alias-state-error-primary\": \"var(--dsw-static-red-600)\",\n \"--dsw-alias-state-error-secondary\": \"var(--dsw-static-red-400)\",\n \"--dsw-alias-state-success-primary\": \"var(--dsw-static-green-500)\",\n \"--dsw-alias-state-success-secondary\": \"var(--dsw-static-green-400)\",\n \"--dsw-alias-state-success-tertiary\": \"var(--dsw-static-green-100)\",\n \"--dsw-alias-state-warn-label\": \"var(--dsw-static-amber-600)\",\n \"--dsw-alias-state-warn-primary\": \"var(--dsw-static-amber-500)\",\n \"--dsw-alias-state-warn-secondary\": \"var(--dsw-static-amber-400)\",\n \"--dsw-alias-state-warn-tertiary\": \"var(--dsw-static-amber-100)\",\n \"--dsw-alias-toast-bg\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-tooltip-bg\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-specific-bubble-highlight\": \"var(--dsw-static-deepseek-200)\",\n \"--dsw-specific-bubble\": \"var(--dsw-static-deepseek-50)\",\n \"--dsw-specific-input-major\": \"var(--dsw-static-neutral-bluish-00)\",\n \"--dsw-specific-login-input\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-specific-menu\": \"var(--dsw-alias-bg-layer-3)\",\n \"--dsw-specific-selector\": \"var(--dsw-static-neutral-bluish-60)\",\n \"--dsw-specific-sidebar-fill\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-specific-sidebar-nav-item-active-accent\": \"var(--dsw-static-deepseek-100)\",\n \"--dsw-specific-sidebar-nav-item-active\": \"var(--dsw-static-neutral-bluish-100)\",\n \"--dsw-specific-sidebar-nav-item-hover\": \"var(--dsw-static-neutral-bluish-75)\",\n \"--dsw-specific-tip\": \"var(--dsw-static-neutral-bluish-60)\",\n },\n}\n\nexport const CATPPUCCIN_FRAPPE: CatppuccinFlavorInfo = {\n themeId: 'catppuccin-frappe',\n colorScheme: 'dark',\n label: 'Frappé',\n accent: '#8caaee',\n tokens: {\n \"--dsw-static-amber-100\": \"color-mix(in srgb, #ef9f76 20%, #303446)\",\n \"--dsw-static-amber-400\": \"color-mix(in srgb, #ef9f76 70%, #303446)\",\n \"--dsw-static-amber-500\": \"#ef9f76\",\n \"--dsw-static-amber-600\": \"#ef9f76\",\n \"--dsw-static-amber-900\": \"color-mix(in srgb, #ef9f76 32%, #303446)\",\n \"--dsw-static-blue-100\": \"color-mix(in srgb, #8caaee 24%, #303446)\",\n \"--dsw-static-blue-300\": \"color-mix(in srgb, #8caaee 50%, #303446)\",\n \"--dsw-static-blue-400\": \"color-mix(in srgb, #8caaee 66%, #303446)\",\n \"--dsw-static-blue-450\": \"color-mix(in srgb, #8caaee 84%, #303446)\",\n \"--dsw-static-blue-500\": \"#8caaee\",\n \"--dsw-static-blue-50\": \"color-mix(in srgb, #8caaee 10%, #303446)\",\n \"--dsw-static-blue-50p\": \"color-mix(in srgb, #8caaee 14%, #303446)\",\n \"--dsw-static-blue-600\": \"color-mix(in srgb, #8caaee 84%, #303446)\",\n \"--dsw-static-blue-75\": \"color-mix(in srgb, #8caaee 18%, #303446)\",\n \"--dsw-static-blue-800\": \"color-mix(in srgb, #8caaee 52%, #303446)\",\n \"--dsw-static-blue-900\": \"color-mix(in srgb, #8caaee 40%, #303446)\",\n \"--dsw-static-blue-950\": \"color-mix(in srgb, #8caaee 28%, #303446)\",\n \"--dsw-static-deepseek-100\": \"color-mix(in srgb, #8caaee 24%, #303446)\",\n \"--dsw-static-deepseek-200\": \"color-mix(in srgb, #8caaee 36%, #303446)\",\n \"--dsw-static-deepseek-300\": \"color-mix(in srgb, #8caaee 50%, #303446)\",\n \"--dsw-static-deepseek-400\": \"color-mix(in srgb, #8caaee 66%, #303446)\",\n \"--dsw-static-deepseek-450\": \"color-mix(in srgb, #8caaee 84%, #303446)\",\n \"--dsw-static-deepseek-500\": \"#8caaee\",\n \"--dsw-static-deepseek-50\": \"color-mix(in srgb, #8caaee 10%, #303446)\",\n \"--dsw-static-deepseek-600\": \"color-mix(in srgb, #8caaee 84%, #303446)\",\n \"--dsw-static-deepseek-700-delete\": \"color-mix(in srgb, #8caaee 68%, #303446)\",\n \"--dsw-static-deepseek-800\": \"color-mix(in srgb, #8caaee 52%, #303446)\",\n \"--dsw-static-deepseek-900\": \"color-mix(in srgb, #8caaee 40%, #303446)\",\n \"--dsw-static-green-100\": \"color-mix(in srgb, #a6d189 18%, #303446)\",\n \"--dsw-static-green-400\": \"color-mix(in srgb, #a6d189 80%, #303446)\",\n \"--dsw-static-green-500\": \"#a6d189\",\n \"--dsw-static-green-900\": \"color-mix(in srgb, #a6d189 30%, #303446)\",\n \"--dsw-static-neutral-00\": \"#c6d0f5\",\n \"--dsw-static-neutral-1000\": \"#232634\",\n \"--dsw-static-neutral-100\": \"#a5adce\",\n \"--dsw-static-neutral-150\": \"#a5adce\",\n \"--dsw-static-neutral-200\": \"#949cbb\",\n \"--dsw-static-neutral-250\": \"#949cbb\",\n \"--dsw-static-neutral-300\": \"#838ba7\",\n \"--dsw-static-neutral-400\": \"#737994\",\n \"--dsw-static-neutral-500\": \"#626880\",\n \"--dsw-static-neutral-50\": \"#c6d0f5\",\n \"--dsw-static-neutral-550\": \"#51576d\",\n \"--dsw-static-neutral-600\": \"#51576d\",\n \"--dsw-static-neutral-700\": \"#414559\",\n \"--dsw-static-neutral-800\": \"#414559\",\n \"--dsw-static-neutral-850\": \"#303446\",\n \"--dsw-static-neutral-900\": \"#292c3c\",\n \"--dsw-static-neutral-bluish-00\": \"#c6d0f5\",\n \"--dsw-static-neutral-bluish-1000\": \"#232634\",\n \"--dsw-static-neutral-bluish-100\": \"#a5adce\",\n \"--dsw-static-neutral-bluish-150\": \"#a5adce\",\n \"--dsw-static-neutral-bluish-200\": \"#949cbb\",\n \"--dsw-static-neutral-bluish-300\": \"#838ba7\",\n \"--dsw-static-neutral-bluish-400\": \"#737994\",\n \"--dsw-static-neutral-bluish-500\": \"#626880\",\n \"--dsw-static-neutral-bluish-50\": \"#c6d0f5\",\n \"--dsw-static-neutral-bluish-600\": \"#51576d\",\n \"--dsw-static-neutral-bluish-60\": \"#b5bfe2\",\n \"--dsw-static-neutral-bluish-700\": \"#414559\",\n \"--dsw-static-neutral-bluish-750\": \"#414559\",\n \"--dsw-static-neutral-bluish-75\": \"#b5bfe2\",\n \"--dsw-static-neutral-bluish-800\": \"#414559\",\n \"--dsw-static-neutral-bluish-850\": \"#303446\",\n \"--dsw-static-neutral-bluish-875\": \"#292c3c\",\n \"--dsw-static-neutral-bluish-900\": \"#292c3c\",\n \"--dsw-static-neutral-bluish-950\": \"#232634\",\n \"--dsw-static-red-100\": \"color-mix(in srgb, #e78284 20%, #303446)\",\n \"--dsw-static-red-400\": \"color-mix(in srgb, #e78284 70%, #303446)\",\n \"--dsw-static-red-500\": \"#e78284\",\n \"--dsw-static-red-50\": \"color-mix(in srgb, #e78284 10%, #303446)\",\n \"--dsw-static-red-600\": \"#e78284\",\n \"--dsw-static-red-900\": \"color-mix(in srgb, #e78284 34%, #303446)\",\n \"--dsw-alias-bg-base\": \"var(--dsw-static-neutral-bluish-950)\",\n \"--dsw-alias-bg-layer-1\": \"var(--dsw-static-neutral-bluish-875)\",\n \"--dsw-alias-bg-layer-2\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-bg-layer-3\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-bg-mask-1\": \"rgba(0, 0, 0, 0.5)\",\n \"--dsw-alias-bg-mask-2\": \"rgba(0, 0, 0, 0.2)\",\n \"--dsw-alias-bg-mask-3\": \"rgba(0, 0, 0, 0.48)\",\n \"--dsw-alias-bg-mask-photo\": \"rgba(0, 0, 0, 0.88)\",\n \"--dsw-alias-bg-mask-drop\": \"rgba(39, 39, 48, 0.7)\",\n \"--dsw-alias-bg-module-platform\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-bg-multi-select\": \"var(--dsw-static-neutral-850)\",\n \"--dsw-alias-bg-overlay\": \"var(--dsw-static-neutral-bluish-700)\",\n \"--dsw-alias-bg-skeleton\": \"rgba(255, 255, 255, 0.08)\",\n \"--dsw-alias-border-inverted2\": \"rgba(255, 255, 255, 0.08)\",\n \"--dsw-alias-border-inverted\": \"rgba(255, 255, 255, 0.06)\",\n \"--dsw-alias-border-l1\": \"rgba(255, 255, 255, 0.06)\",\n \"--dsw-alias-border-l2-darkmode-thin\": \"rgba(255, 255, 255, 0.06)\",\n \"--dsw-alias-border-l2\": \"rgba(255, 255, 255, 0.12)\",\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-brand-primary-invert\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-brand-primary-new-colorprimary-new-color\": \"#8caaee\",\n \"--dsw-alias-brand-primary\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-brand-text\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-button-contrast-fill\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-button-elevated-fill\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-button-floating-fill\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-button-floating-hover\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-button-ghost-active-border\": \"var(--dsw-static-neutral-bluish-600)\",\n \"--dsw-alias-button-ghost-active-fill\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-button-ghost-active-hover\": \"var(--dsw-static-neutral-bluish-700)\",\n \"--dsw-alias-button-info-fill\": \"var(--dsw-static-deepseek-400)\",\n \"--dsw-alias-button-info-hover\": \"var(--dsw-static-deepseek-500)\",\n \"--dsw-alias-button-primary-dimmed\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-button-primary-fill\": \"var(--dsw-alias-brand-primary)\",\n \"--dsw-alias-button-primary-hover\": \"var(--dsw-static-neutral-bluish-100)\",\n \"--dsw-alias-button-tool-bar-fill-invisible\": \"rgba(31, 31, 31, 0.36)\",\n \"--dsw-alias-button-tool-bar-fill\": \"rgba(84, 85, 87, 0.5)\",\n \"--dsw-alias-button-tool-bar-hover\": \"rgba(84, 85, 87, 0.6)\",\n \"--dsw-alias-interactive-bg-active\": \"rgba(255, 255, 255, 0.14)\",\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-hover-solid\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-interactive-bg-hover\": \"rgba(255, 255, 255, 0.08)\",\n \"--dsw-alias-label-caption\": \"var(--dsw-static-neutral-bluish-600)\",\n \"--dsw-alias-label-dimmed\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-label-primary-bluish\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-label-primary-dimmed\": \"var(--dsw-static-neutral-bluish-100)\",\n \"--dsw-alias-label-primary-foreground\": \"var(--dsw-static-neutral-bluish-1000)\",\n \"--dsw-alias-label-primary-inverted\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-label-primary\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-label-secondary\": \"var(--dsw-static-neutral-bluish-300)\",\n \"--dsw-alias-label-tertiary\": \"var(--dsw-static-neutral-bluish-400)\",\n \"--dsw-alias-markdown-citation\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-markdown-code-block-banner\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-markdown-code-block\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-alias-markdown-code-segment-selected\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-markdown-code-segment-unselected\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-alias-markdown-inline-code\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-markdown-placeholder\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-markdown-tag\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-scrollbar-bg-l1\": \"var(--dsw-static-neutral-700)\",\n \"--dsw-alias-scrollbar-bg-l2\": \"var(--dsw-static-neutral-600)\",\n \"--dsw-alias-scrollbar-hover-l1\": \"var(--dsw-static-neutral-600)\",\n \"--dsw-alias-scrollbar-hover-l2\": \"var(--dsw-static-neutral-550)\",\n \"--dsw-alias-state-business-primary\": \"var(--dsw-static-deepseek-400)\",\n \"--dsw-alias-state-business-tertiary\": \"var(--dsw-static-deepseek-800)\",\n \"--dsw-alias-state-error-primary\": \"var(--dsw-static-red-400)\",\n \"--dsw-alias-state-error-secondary\": \"var(--dsw-static-red-400)\",\n \"--dsw-alias-state-success-primary\": \"var(--dsw-static-green-500)\",\n \"--dsw-alias-state-success-secondary\": \"var(--dsw-static-green-400)\",\n \"--dsw-alias-state-success-tertiary\": \"var(--dsw-static-green-900)\",\n \"--dsw-alias-state-warn-label\": \"var(--dsw-static-amber-600)\",\n \"--dsw-alias-state-warn-primary\": \"var(--dsw-static-amber-500)\",\n \"--dsw-alias-state-warn-secondary\": \"var(--dsw-static-amber-400)\",\n \"--dsw-alias-state-warn-tertiary\": \"var(--dsw-static-amber-900)\",\n \"--dsw-alias-toast-bg\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-tooltip-bg\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-specific-bubble-highlight\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-specific-bubble\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-specific-input-major\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-specific-login-input\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-specific-menu\": \"var(--dsw-alias-bg-layer-3)\",\n \"--dsw-specific-selector\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-specific-sidebar-fill\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-specific-sidebar-nav-item-active-accent\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-specific-sidebar-nav-item-active\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-specific-sidebar-nav-item-hover\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-specific-tip\": \"var(--dsw-static-neutral-bluish-800)\",\n },\n}\n\nexport const CATPPUCCIN_MACCHIATO: CatppuccinFlavorInfo = {\n themeId: 'catppuccin-macchiato',\n colorScheme: 'dark',\n label: 'Macchiato',\n accent: '#8aadf4',\n tokens: {\n \"--dsw-static-amber-100\": \"color-mix(in srgb, #f5a97f 20%, #24273a)\",\n \"--dsw-static-amber-400\": \"color-mix(in srgb, #f5a97f 70%, #24273a)\",\n \"--dsw-static-amber-500\": \"#f5a97f\",\n \"--dsw-static-amber-600\": \"#f5a97f\",\n \"--dsw-static-amber-900\": \"color-mix(in srgb, #f5a97f 32%, #24273a)\",\n \"--dsw-static-blue-100\": \"color-mix(in srgb, #8aadf4 24%, #24273a)\",\n \"--dsw-static-blue-300\": \"color-mix(in srgb, #8aadf4 50%, #24273a)\",\n \"--dsw-static-blue-400\": \"color-mix(in srgb, #8aadf4 66%, #24273a)\",\n \"--dsw-static-blue-450\": \"color-mix(in srgb, #8aadf4 84%, #24273a)\",\n \"--dsw-static-blue-500\": \"#8aadf4\",\n \"--dsw-static-blue-50\": \"color-mix(in srgb, #8aadf4 10%, #24273a)\",\n \"--dsw-static-blue-50p\": \"color-mix(in srgb, #8aadf4 14%, #24273a)\",\n \"--dsw-static-blue-600\": \"color-mix(in srgb, #8aadf4 84%, #24273a)\",\n \"--dsw-static-blue-75\": \"color-mix(in srgb, #8aadf4 18%, #24273a)\",\n \"--dsw-static-blue-800\": \"color-mix(in srgb, #8aadf4 52%, #24273a)\",\n \"--dsw-static-blue-900\": \"color-mix(in srgb, #8aadf4 40%, #24273a)\",\n \"--dsw-static-blue-950\": \"color-mix(in srgb, #8aadf4 28%, #24273a)\",\n \"--dsw-static-deepseek-100\": \"color-mix(in srgb, #8aadf4 24%, #24273a)\",\n \"--dsw-static-deepseek-200\": \"color-mix(in srgb, #8aadf4 36%, #24273a)\",\n \"--dsw-static-deepseek-300\": \"color-mix(in srgb, #8aadf4 50%, #24273a)\",\n \"--dsw-static-deepseek-400\": \"color-mix(in srgb, #8aadf4 66%, #24273a)\",\n \"--dsw-static-deepseek-450\": \"color-mix(in srgb, #8aadf4 84%, #24273a)\",\n \"--dsw-static-deepseek-500\": \"#8aadf4\",\n \"--dsw-static-deepseek-50\": \"color-mix(in srgb, #8aadf4 10%, #24273a)\",\n \"--dsw-static-deepseek-600\": \"color-mix(in srgb, #8aadf4 84%, #24273a)\",\n \"--dsw-static-deepseek-700-delete\": \"color-mix(in srgb, #8aadf4 68%, #24273a)\",\n \"--dsw-static-deepseek-800\": \"color-mix(in srgb, #8aadf4 52%, #24273a)\",\n \"--dsw-static-deepseek-900\": \"color-mix(in srgb, #8aadf4 40%, #24273a)\",\n \"--dsw-static-green-100\": \"color-mix(in srgb, #a6da95 18%, #24273a)\",\n \"--dsw-static-green-400\": \"color-mix(in srgb, #a6da95 80%, #24273a)\",\n \"--dsw-static-green-500\": \"#a6da95\",\n \"--dsw-static-green-900\": \"color-mix(in srgb, #a6da95 30%, #24273a)\",\n \"--dsw-static-neutral-00\": \"#cad3f5\",\n \"--dsw-static-neutral-1000\": \"#181926\",\n \"--dsw-static-neutral-100\": \"#a5adcb\",\n \"--dsw-static-neutral-150\": \"#a5adcb\",\n \"--dsw-static-neutral-200\": \"#939ab7\",\n \"--dsw-static-neutral-250\": \"#939ab7\",\n \"--dsw-static-neutral-300\": \"#8087a2\",\n \"--dsw-static-neutral-400\": \"#6e738d\",\n \"--dsw-static-neutral-500\": \"#5b6078\",\n \"--dsw-static-neutral-50\": \"#cad3f5\",\n \"--dsw-static-neutral-550\": \"#494d64\",\n \"--dsw-static-neutral-600\": \"#494d64\",\n \"--dsw-static-neutral-700\": \"#363a4f\",\n \"--dsw-static-neutral-800\": \"#363a4f\",\n \"--dsw-static-neutral-850\": \"#24273a\",\n \"--dsw-static-neutral-900\": \"#1e2030\",\n \"--dsw-static-neutral-bluish-00\": \"#cad3f5\",\n \"--dsw-static-neutral-bluish-1000\": \"#181926\",\n \"--dsw-static-neutral-bluish-100\": \"#a5adcb\",\n \"--dsw-static-neutral-bluish-150\": \"#a5adcb\",\n \"--dsw-static-neutral-bluish-200\": \"#939ab7\",\n \"--dsw-static-neutral-bluish-300\": \"#8087a2\",\n \"--dsw-static-neutral-bluish-400\": \"#6e738d\",\n \"--dsw-static-neutral-bluish-500\": \"#5b6078\",\n \"--dsw-static-neutral-bluish-50\": \"#cad3f5\",\n \"--dsw-static-neutral-bluish-600\": \"#494d64\",\n \"--dsw-static-neutral-bluish-60\": \"#b8c0e0\",\n \"--dsw-static-neutral-bluish-700\": \"#363a4f\",\n \"--dsw-static-neutral-bluish-750\": \"#363a4f\",\n \"--dsw-static-neutral-bluish-75\": \"#b8c0e0\",\n \"--dsw-static-neutral-bluish-800\": \"#363a4f\",\n \"--dsw-static-neutral-bluish-850\": \"#24273a\",\n \"--dsw-static-neutral-bluish-875\": \"#1e2030\",\n \"--dsw-static-neutral-bluish-900\": \"#1e2030\",\n \"--dsw-static-neutral-bluish-950\": \"#181926\",\n \"--dsw-static-red-100\": \"color-mix(in srgb, #ed8796 20%, #24273a)\",\n \"--dsw-static-red-400\": \"color-mix(in srgb, #ed8796 70%, #24273a)\",\n \"--dsw-static-red-500\": \"#ed8796\",\n \"--dsw-static-red-50\": \"color-mix(in srgb, #ed8796 10%, #24273a)\",\n \"--dsw-static-red-600\": \"#ed8796\",\n \"--dsw-static-red-900\": \"color-mix(in srgb, #ed8796 34%, #24273a)\",\n \"--dsw-alias-bg-base\": \"var(--dsw-static-neutral-bluish-950)\",\n \"--dsw-alias-bg-layer-1\": \"var(--dsw-static-neutral-bluish-875)\",\n \"--dsw-alias-bg-layer-2\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-bg-layer-3\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-bg-mask-1\": \"rgba(0, 0, 0, 0.5)\",\n \"--dsw-alias-bg-mask-2\": \"rgba(0, 0, 0, 0.2)\",\n \"--dsw-alias-bg-mask-3\": \"rgba(0, 0, 0, 0.48)\",\n \"--dsw-alias-bg-mask-photo\": \"rgba(0, 0, 0, 0.88)\",\n \"--dsw-alias-bg-mask-drop\": \"rgba(39, 39, 48, 0.7)\",\n \"--dsw-alias-bg-module-platform\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-bg-multi-select\": \"var(--dsw-static-neutral-850)\",\n \"--dsw-alias-bg-overlay\": \"var(--dsw-static-neutral-bluish-700)\",\n \"--dsw-alias-bg-skeleton\": \"rgba(255, 255, 255, 0.08)\",\n \"--dsw-alias-border-inverted2\": \"rgba(255, 255, 255, 0.08)\",\n \"--dsw-alias-border-inverted\": \"rgba(255, 255, 255, 0.06)\",\n \"--dsw-alias-border-l1\": \"rgba(255, 255, 255, 0.06)\",\n \"--dsw-alias-border-l2-darkmode-thin\": \"rgba(255, 255, 255, 0.06)\",\n \"--dsw-alias-border-l2\": \"rgba(255, 255, 255, 0.12)\",\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-brand-primary-invert\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-brand-primary-new-colorprimary-new-color\": \"#8aadf4\",\n \"--dsw-alias-brand-primary\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-brand-text\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-button-contrast-fill\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-button-elevated-fill\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-button-floating-fill\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-button-floating-hover\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-button-ghost-active-border\": \"var(--dsw-static-neutral-bluish-600)\",\n \"--dsw-alias-button-ghost-active-fill\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-button-ghost-active-hover\": \"var(--dsw-static-neutral-bluish-700)\",\n \"--dsw-alias-button-info-fill\": \"var(--dsw-static-deepseek-400)\",\n \"--dsw-alias-button-info-hover\": \"var(--dsw-static-deepseek-500)\",\n \"--dsw-alias-button-primary-dimmed\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-button-primary-fill\": \"var(--dsw-alias-brand-primary)\",\n \"--dsw-alias-button-primary-hover\": \"var(--dsw-static-neutral-bluish-100)\",\n \"--dsw-alias-button-tool-bar-fill-invisible\": \"rgba(31, 31, 31, 0.36)\",\n \"--dsw-alias-button-tool-bar-fill\": \"rgba(84, 85, 87, 0.5)\",\n \"--dsw-alias-button-tool-bar-hover\": \"rgba(84, 85, 87, 0.6)\",\n \"--dsw-alias-interactive-bg-active\": \"rgba(255, 255, 255, 0.14)\",\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-hover-solid\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-interactive-bg-hover\": \"rgba(255, 255, 255, 0.08)\",\n \"--dsw-alias-label-caption\": \"var(--dsw-static-neutral-bluish-600)\",\n \"--dsw-alias-label-dimmed\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-label-primary-bluish\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-label-primary-dimmed\": \"var(--dsw-static-neutral-bluish-100)\",\n \"--dsw-alias-label-primary-foreground\": \"var(--dsw-static-neutral-bluish-1000)\",\n \"--dsw-alias-label-primary-inverted\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-label-primary\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-label-secondary\": \"var(--dsw-static-neutral-bluish-300)\",\n \"--dsw-alias-label-tertiary\": \"var(--dsw-static-neutral-bluish-400)\",\n \"--dsw-alias-markdown-citation\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-markdown-code-block-banner\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-markdown-code-block\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-alias-markdown-code-segment-selected\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-markdown-code-segment-unselected\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-alias-markdown-inline-code\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-markdown-placeholder\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-markdown-tag\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-scrollbar-bg-l1\": \"var(--dsw-static-neutral-700)\",\n \"--dsw-alias-scrollbar-bg-l2\": \"var(--dsw-static-neutral-600)\",\n \"--dsw-alias-scrollbar-hover-l1\": \"var(--dsw-static-neutral-600)\",\n \"--dsw-alias-scrollbar-hover-l2\": \"var(--dsw-static-neutral-550)\",\n \"--dsw-alias-state-business-primary\": \"var(--dsw-static-deepseek-400)\",\n \"--dsw-alias-state-business-tertiary\": \"var(--dsw-static-deepseek-800)\",\n \"--dsw-alias-state-error-primary\": \"var(--dsw-static-red-400)\",\n \"--dsw-alias-state-error-secondary\": \"var(--dsw-static-red-400)\",\n \"--dsw-alias-state-success-primary\": \"var(--dsw-static-green-500)\",\n \"--dsw-alias-state-success-secondary\": \"var(--dsw-static-green-400)\",\n \"--dsw-alias-state-success-tertiary\": \"var(--dsw-static-green-900)\",\n \"--dsw-alias-state-warn-label\": \"var(--dsw-static-amber-600)\",\n \"--dsw-alias-state-warn-primary\": \"var(--dsw-static-amber-500)\",\n \"--dsw-alias-state-warn-secondary\": \"var(--dsw-static-amber-400)\",\n \"--dsw-alias-state-warn-tertiary\": \"var(--dsw-static-amber-900)\",\n \"--dsw-alias-toast-bg\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-tooltip-bg\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-specific-bubble-highlight\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-specific-bubble\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-specific-input-major\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-specific-login-input\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-specific-menu\": \"var(--dsw-alias-bg-layer-3)\",\n \"--dsw-specific-selector\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-specific-sidebar-fill\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-specific-sidebar-nav-item-active-accent\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-specific-sidebar-nav-item-active\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-specific-sidebar-nav-item-hover\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-specific-tip\": \"var(--dsw-static-neutral-bluish-800)\",\n },\n}\n\nexport const CATPPUCCIN_MOCHA: CatppuccinFlavorInfo = {\n themeId: 'catppuccin-mocha',\n colorScheme: 'dark',\n label: 'Mocha',\n accent: '#89b4fa',\n tokens: {\n \"--dsw-static-amber-100\": \"color-mix(in srgb, #fab387 20%, #1e1e2e)\",\n \"--dsw-static-amber-400\": \"color-mix(in srgb, #fab387 70%, #1e1e2e)\",\n \"--dsw-static-amber-500\": \"#fab387\",\n \"--dsw-static-amber-600\": \"#fab387\",\n \"--dsw-static-amber-900\": \"color-mix(in srgb, #fab387 32%, #1e1e2e)\",\n \"--dsw-static-blue-100\": \"color-mix(in srgb, #89b4fa 24%, #1e1e2e)\",\n \"--dsw-static-blue-300\": \"color-mix(in srgb, #89b4fa 50%, #1e1e2e)\",\n \"--dsw-static-blue-400\": \"color-mix(in srgb, #89b4fa 66%, #1e1e2e)\",\n \"--dsw-static-blue-450\": \"color-mix(in srgb, #89b4fa 84%, #1e1e2e)\",\n \"--dsw-static-blue-500\": \"#89b4fa\",\n \"--dsw-static-blue-50\": \"color-mix(in srgb, #89b4fa 10%, #1e1e2e)\",\n \"--dsw-static-blue-50p\": \"color-mix(in srgb, #89b4fa 14%, #1e1e2e)\",\n \"--dsw-static-blue-600\": \"color-mix(in srgb, #89b4fa 84%, #1e1e2e)\",\n \"--dsw-static-blue-75\": \"color-mix(in srgb, #89b4fa 18%, #1e1e2e)\",\n \"--dsw-static-blue-800\": \"color-mix(in srgb, #89b4fa 52%, #1e1e2e)\",\n \"--dsw-static-blue-900\": \"color-mix(in srgb, #89b4fa 40%, #1e1e2e)\",\n \"--dsw-static-blue-950\": \"color-mix(in srgb, #89b4fa 28%, #1e1e2e)\",\n \"--dsw-static-deepseek-100\": \"color-mix(in srgb, #89b4fa 24%, #1e1e2e)\",\n \"--dsw-static-deepseek-200\": \"color-mix(in srgb, #89b4fa 36%, #1e1e2e)\",\n \"--dsw-static-deepseek-300\": \"color-mix(in srgb, #89b4fa 50%, #1e1e2e)\",\n \"--dsw-static-deepseek-400\": \"color-mix(in srgb, #89b4fa 66%, #1e1e2e)\",\n \"--dsw-static-deepseek-450\": \"color-mix(in srgb, #89b4fa 84%, #1e1e2e)\",\n \"--dsw-static-deepseek-500\": \"#89b4fa\",\n \"--dsw-static-deepseek-50\": \"color-mix(in srgb, #89b4fa 10%, #1e1e2e)\",\n \"--dsw-static-deepseek-600\": \"color-mix(in srgb, #89b4fa 84%, #1e1e2e)\",\n \"--dsw-static-deepseek-700-delete\": \"color-mix(in srgb, #89b4fa 68%, #1e1e2e)\",\n \"--dsw-static-deepseek-800\": \"color-mix(in srgb, #89b4fa 52%, #1e1e2e)\",\n \"--dsw-static-deepseek-900\": \"color-mix(in srgb, #89b4fa 40%, #1e1e2e)\",\n \"--dsw-static-green-100\": \"color-mix(in srgb, #a6e3a1 18%, #1e1e2e)\",\n \"--dsw-static-green-400\": \"color-mix(in srgb, #a6e3a1 80%, #1e1e2e)\",\n \"--dsw-static-green-500\": \"#a6e3a1\",\n \"--dsw-static-green-900\": \"color-mix(in srgb, #a6e3a1 30%, #1e1e2e)\",\n \"--dsw-static-neutral-00\": \"#cdd6f4\",\n \"--dsw-static-neutral-1000\": \"#11111b\",\n \"--dsw-static-neutral-100\": \"#a6adc8\",\n \"--dsw-static-neutral-150\": \"#a6adc8\",\n \"--dsw-static-neutral-200\": \"#9399b2\",\n \"--dsw-static-neutral-250\": \"#9399b2\",\n \"--dsw-static-neutral-300\": \"#7f849c\",\n \"--dsw-static-neutral-400\": \"#6c7086\",\n \"--dsw-static-neutral-500\": \"#585b70\",\n \"--dsw-static-neutral-50\": \"#cdd6f4\",\n \"--dsw-static-neutral-550\": \"#45475a\",\n \"--dsw-static-neutral-600\": \"#45475a\",\n \"--dsw-static-neutral-700\": \"#313244\",\n \"--dsw-static-neutral-800\": \"#313244\",\n \"--dsw-static-neutral-850\": \"#1e1e2e\",\n \"--dsw-static-neutral-900\": \"#181825\",\n \"--dsw-static-neutral-bluish-00\": \"#cdd6f4\",\n \"--dsw-static-neutral-bluish-1000\": \"#11111b\",\n \"--dsw-static-neutral-bluish-100\": \"#a6adc8\",\n \"--dsw-static-neutral-bluish-150\": \"#a6adc8\",\n \"--dsw-static-neutral-bluish-200\": \"#9399b2\",\n \"--dsw-static-neutral-bluish-300\": \"#7f849c\",\n \"--dsw-static-neutral-bluish-400\": \"#6c7086\",\n \"--dsw-static-neutral-bluish-500\": \"#585b70\",\n \"--dsw-static-neutral-bluish-50\": \"#cdd6f4\",\n \"--dsw-static-neutral-bluish-600\": \"#45475a\",\n \"--dsw-static-neutral-bluish-60\": \"#bac2de\",\n \"--dsw-static-neutral-bluish-700\": \"#313244\",\n \"--dsw-static-neutral-bluish-750\": \"#313244\",\n \"--dsw-static-neutral-bluish-75\": \"#bac2de\",\n \"--dsw-static-neutral-bluish-800\": \"#313244\",\n \"--dsw-static-neutral-bluish-850\": \"#1e1e2e\",\n \"--dsw-static-neutral-bluish-875\": \"#181825\",\n \"--dsw-static-neutral-bluish-900\": \"#181825\",\n \"--dsw-static-neutral-bluish-950\": \"#11111b\",\n \"--dsw-static-red-100\": \"color-mix(in srgb, #f38ba8 20%, #1e1e2e)\",\n \"--dsw-static-red-400\": \"color-mix(in srgb, #f38ba8 70%, #1e1e2e)\",\n \"--dsw-static-red-500\": \"#f38ba8\",\n \"--dsw-static-red-50\": \"color-mix(in srgb, #f38ba8 10%, #1e1e2e)\",\n \"--dsw-static-red-600\": \"#f38ba8\",\n \"--dsw-static-red-900\": \"color-mix(in srgb, #f38ba8 34%, #1e1e2e)\",\n \"--dsw-alias-bg-base\": \"var(--dsw-static-neutral-bluish-950)\",\n \"--dsw-alias-bg-layer-1\": \"var(--dsw-static-neutral-bluish-875)\",\n \"--dsw-alias-bg-layer-2\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-bg-layer-3\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-bg-mask-1\": \"rgba(0, 0, 0, 0.5)\",\n \"--dsw-alias-bg-mask-2\": \"rgba(0, 0, 0, 0.2)\",\n \"--dsw-alias-bg-mask-3\": \"rgba(0, 0, 0, 0.48)\",\n \"--dsw-alias-bg-mask-photo\": \"rgba(0, 0, 0, 0.88)\",\n \"--dsw-alias-bg-mask-drop\": \"rgba(39, 39, 48, 0.7)\",\n \"--dsw-alias-bg-module-platform\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-bg-multi-select\": \"var(--dsw-static-neutral-850)\",\n \"--dsw-alias-bg-overlay\": \"var(--dsw-static-neutral-bluish-700)\",\n \"--dsw-alias-bg-skeleton\": \"rgba(255, 255, 255, 0.08)\",\n \"--dsw-alias-border-inverted2\": \"rgba(255, 255, 255, 0.08)\",\n \"--dsw-alias-border-inverted\": \"rgba(255, 255, 255, 0.06)\",\n \"--dsw-alias-border-l1\": \"rgba(255, 255, 255, 0.06)\",\n \"--dsw-alias-border-l2-darkmode-thin\": \"rgba(255, 255, 255, 0.06)\",\n \"--dsw-alias-border-l2\": \"rgba(255, 255, 255, 0.12)\",\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-brand-primary-invert\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-brand-primary-new-colorprimary-new-color\": \"#89b4fa\",\n \"--dsw-alias-brand-primary\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-brand-text\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-button-contrast-fill\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-button-elevated-fill\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-button-floating-fill\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-button-floating-hover\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-button-ghost-active-border\": \"var(--dsw-static-neutral-bluish-600)\",\n \"--dsw-alias-button-ghost-active-fill\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-button-ghost-active-hover\": \"var(--dsw-static-neutral-bluish-700)\",\n \"--dsw-alias-button-info-fill\": \"var(--dsw-static-deepseek-400)\",\n \"--dsw-alias-button-info-hover\": \"var(--dsw-static-deepseek-500)\",\n \"--dsw-alias-button-primary-dimmed\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-button-primary-fill\": \"var(--dsw-alias-brand-primary)\",\n \"--dsw-alias-button-primary-hover\": \"var(--dsw-static-neutral-bluish-100)\",\n \"--dsw-alias-button-tool-bar-fill-invisible\": \"rgba(31, 31, 31, 0.36)\",\n \"--dsw-alias-button-tool-bar-fill\": \"rgba(84, 85, 87, 0.5)\",\n \"--dsw-alias-button-tool-bar-hover\": \"rgba(84, 85, 87, 0.6)\",\n \"--dsw-alias-interactive-bg-active\": \"rgba(255, 255, 255, 0.14)\",\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-hover-solid\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-interactive-bg-hover\": \"rgba(255, 255, 255, 0.08)\",\n \"--dsw-alias-label-caption\": \"var(--dsw-static-neutral-bluish-600)\",\n \"--dsw-alias-label-dimmed\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-label-primary-bluish\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-label-primary-dimmed\": \"var(--dsw-static-neutral-bluish-100)\",\n \"--dsw-alias-label-primary-foreground\": \"var(--dsw-static-neutral-bluish-1000)\",\n \"--dsw-alias-label-primary-inverted\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-label-primary\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-label-secondary\": \"var(--dsw-static-neutral-bluish-300)\",\n \"--dsw-alias-label-tertiary\": \"var(--dsw-static-neutral-bluish-400)\",\n \"--dsw-alias-markdown-citation\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-markdown-code-block-banner\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-markdown-code-block\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-alias-markdown-code-segment-selected\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-markdown-code-segment-unselected\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-alias-markdown-inline-code\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-markdown-placeholder\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-markdown-tag\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-scrollbar-bg-l1\": \"var(--dsw-static-neutral-700)\",\n \"--dsw-alias-scrollbar-bg-l2\": \"var(--dsw-static-neutral-600)\",\n \"--dsw-alias-scrollbar-hover-l1\": \"var(--dsw-static-neutral-600)\",\n \"--dsw-alias-scrollbar-hover-l2\": \"var(--dsw-static-neutral-550)\",\n \"--dsw-alias-state-business-primary\": \"var(--dsw-static-deepseek-400)\",\n \"--dsw-alias-state-business-tertiary\": \"var(--dsw-static-deepseek-800)\",\n \"--dsw-alias-state-error-primary\": \"var(--dsw-static-red-400)\",\n \"--dsw-alias-state-error-secondary\": \"var(--dsw-static-red-400)\",\n \"--dsw-alias-state-success-primary\": \"var(--dsw-static-green-500)\",\n \"--dsw-alias-state-success-secondary\": \"var(--dsw-static-green-400)\",\n \"--dsw-alias-state-success-tertiary\": \"var(--dsw-static-green-900)\",\n \"--dsw-alias-state-warn-label\": \"var(--dsw-static-amber-600)\",\n \"--dsw-alias-state-warn-primary\": \"var(--dsw-static-amber-500)\",\n \"--dsw-alias-state-warn-secondary\": \"var(--dsw-static-amber-400)\",\n \"--dsw-alias-state-warn-tertiary\": \"var(--dsw-static-amber-900)\",\n \"--dsw-alias-toast-bg\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-tooltip-bg\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-specific-bubble-highlight\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-specific-bubble\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-specific-input-major\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-specific-login-input\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-specific-menu\": \"var(--dsw-alias-bg-layer-3)\",\n \"--dsw-specific-selector\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-specific-sidebar-fill\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-specific-sidebar-nav-item-active-accent\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-specific-sidebar-nav-item-active\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-specific-sidebar-nav-item-hover\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-specific-tip\": \"var(--dsw-static-neutral-bluish-800)\",\n },\n}\n\nexport const CATPPUCCIN_FLAVORS: readonly CatppuccinFlavorInfo[] = [\n CATPPUCCIN_LATTE,\n CATPPUCCIN_FRAPPE,\n CATPPUCCIN_MACCHIATO,\n CATPPUCCIN_MOCHA,\n]\n","/**\n * Catppuccin syntax-highlighting token overrides for Shiki.\n *\n * DSH's default shiki.css (shipped by @deepseek-ai/dsh-client-ui-theme) defines\n * its own hard-coded syntax colours that are not Catppuccin. This module\n * supplies the canonical Catppuccin palette colours (sourced from the official\n * Shiki themes shipped by @shikijs/themes) for each of the four flavours, so\n * code blocks inside the DSH GUI match the Catppuccin project's syntax\n * highlighting.\n *\n * The foreground and background tokens are kept as var() references into the\n * plugin's own --dsw-* overrides (foreground -> label-primary, background ->\n * markdown-code-block), so they automatically track the active flavour. Every\n * other token is a literal hex from the Catppuccin palette.\n */\n\nimport type { CatppuccinFlavorId } from './palettes.ts'\n\n/** Shiki token names as defined by DSH's shiki.css. */\nexport type ShikiTokenName =\n | '--shiki-foreground'\n | '--shiki-background'\n | '--shiki-token-constant'\n | '--shiki-token-string'\n | '--shiki-token-comment'\n | '--shiki-token-keyword'\n | '--shiki-token-parameter'\n | '--shiki-token-function'\n | '--shiki-token-string-expression'\n | '--shiki-token-punctuation'\n | '--shiki-token-link'\n\n/** Per-flavour shiki token dictionary. */\nexport type ShikiTokens = Record<ShikiTokenName, string>\n\n/**\n * Canonical Catppuccin syntax colours per flavour.\n *\n * Colour → token mapping (from the official @shikijs/themes Catppuccin themes):\n * foreground → text\n * constant → peach\n * string → green\n * comment → overlay2\n * keyword → mauve\n * parameter → maroon\n * function → blue\n * string-expr → green (same as string)\n * punctuation → overlay2\n * link → blue (same as function)\n *\n * Background and foreground use var() references so they flow through the\n * flavour's --dsw-* overrides; the rest are literal hex.\n */\n\nexport const SHIKI_TOKENS: Record<CatppuccinFlavorId, ShikiTokens> = {\n latte: {\n '--shiki-foreground': 'var(--dsw-alias-label-primary)',\n '--shiki-background': 'var(--dsw-alias-markdown-code-block)',\n '--shiki-token-constant': '#fe640b', // peach\n '--shiki-token-string': '#40a02b', // green\n '--shiki-token-comment': '#7c7f93', // overlay2\n '--shiki-token-keyword': '#8839ef', // mauve\n '--shiki-token-parameter': '#e64553', // maroon\n '--shiki-token-function': '#1e66f5', // blue\n '--shiki-token-string-expression': '#40a02b', // green\n '--shiki-token-punctuation': '#7c7f93', // overlay2\n '--shiki-token-link': '#1e66f5', // blue\n },\n\n frappe: {\n '--shiki-foreground': 'var(--dsw-alias-label-primary)',\n '--shiki-background': 'var(--dsw-alias-markdown-code-block)',\n '--shiki-token-constant': '#ef9f76', // peach\n '--shiki-token-string': '#a6d189', // green\n '--shiki-token-comment': '#949cbb', // overlay2\n '--shiki-token-keyword': '#ca9ee6', // mauve\n '--shiki-token-parameter': '#ea999c', // maroon\n '--shiki-token-function': '#8caaee', // blue\n '--shiki-token-string-expression': '#a6d189', // green\n '--shiki-token-punctuation': '#949cbb', // overlay2\n '--shiki-token-link': '#8caaee', // blue\n },\n\n macchiato: {\n '--shiki-foreground': 'var(--dsw-alias-label-primary)',\n '--shiki-background': 'var(--dsw-alias-markdown-code-block)',\n '--shiki-token-constant': '#f5a97f', // peach\n '--shiki-token-string': '#a6da95', // green\n '--shiki-token-comment': '#939ab7', // overlay2\n '--shiki-token-keyword': '#c6a0f6', // mauve\n '--shiki-token-parameter': '#ee99a0', // maroon\n '--shiki-token-function': '#8aadf4', // blue\n '--shiki-token-string-expression': '#a6da95', // green\n '--shiki-token-punctuation': '#939ab7', // overlay2\n '--shiki-token-link': '#8aadf4', // blue\n },\n\n mocha: {\n '--shiki-foreground': 'var(--dsw-alias-label-primary)',\n '--shiki-background': 'var(--dsw-alias-markdown-code-block)',\n '--shiki-token-constant': '#fab387', // peach\n '--shiki-token-string': '#a6e3a1', // green\n '--shiki-token-comment': '#9399b2', // overlay2\n '--shiki-token-keyword': '#cba6f7', // mauve\n '--shiki-token-parameter': '#eba0ac', // maroon\n '--shiki-token-function': '#89b4fa', // blue\n '--shiki-token-string-expression': '#a6e3a1', // green\n '--shiki-token-punctuation': '#9399b2', // overlay2\n '--shiki-token-link': '#89b4fa', // blue\n },\n}","/**\n * Runtime seam stamper for the Catppuccin glass layer.\n *\n * The glass stylesheet keys off stable data-* hooks (`data-dsh-glass-frame`,\n * `data-dsh-glass-trajectory`, `data-dsh-glass-stats`, …) that are NOT part\n * of the stock DSH markup, so this module stamps them onto the matching\n * elements at runtime — the stylesheet works with zero base edits. Each\n * selector uses only stable attributes already present in the stock UI\n * (`data-composer-card`, `data-conversation-composer-overlay`, `data-slot`,\n * ARIA roles) or lightningcss-preserved class-name substrings.\n *\n * Stamps are idempotent and inert without the `data-dsh-glass` root attribute\n * (the whole stylesheet is gated on it), so they are simply left in place when\n * the layer flips off — \"off\" still renders the exact stock UI.\n */\n\ninterface Seam {\n /** Attribute to stamp (bare name; value is always ''). */\n readonly attribute: string\n /** CSS selector for the element(s) to stamp. */\n readonly selector: string\n /** Stamp only the first (topmost) match, not every descendant match. */\n readonly first?: boolean\n}\n\nconst SEAMS: readonly Seam[] = [\n // The layout frame: the sidebar column's direct parent.\n { attribute: 'data-dsh-glass-frame', selector: ':has(> [class*=\"sidebarCol\"])' },\n // The sidebar content root (topmost `root` under the column — settings\n // internals also carry a `root` class but sit deeper, so first match wins).\n { attribute: 'data-dsh-glass-sidebar-root', selector: '[class*=\"sidebarCol\"] [class*=\"root\"]', first: true },\n // New-session button (a raised-surface seam).\n { attribute: 'data-dsh-glass-surface', selector: 'button[class*=\"newSession\"]' },\n // Trajectory view (the composer-overlay view).\n { attribute: 'data-dsh-glass-trajectory', selector: '[data-conversation-composer-overlay]' },\n // Details panel (topmost `root` under the details column).\n { attribute: 'data-dsh-glass-details', selector: '[class*=\"detailsCol\"] [class*=\"root\"]', first: true },\n // Composer bar root: the composer card's direct parent.\n { attribute: 'data-dsh-glass-inputbar', selector: ':has(> [data-composer-card])' },\n // Composer attach \"+\" button.\n { attribute: 'data-dsh-glass-add', selector: '[data-composer-card] [class*=\"add\"]' },\n // Session stats line under the composer (composer.dock slot).\n { attribute: 'data-dsh-glass-stats', selector: '[data-slot=\"conversation.composer.dock\"] [class*=\"root\"]' },\n]\n\nfunction stamp(seam: Seam): void {\n if (seam.first) {\n const el = document.querySelector(seam.selector)\n if (el !== null && !el.hasAttribute(seam.attribute)) el.setAttribute(seam.attribute, '')\n return\n }\n for (const el of document.querySelectorAll(seam.selector)) {\n if (!el.hasAttribute(seam.attribute)) el.setAttribute(seam.attribute, '')\n }\n}\n\nfunction stampAll(): void {\n for (const seam of SEAMS) stamp(seam)\n}\n\n/**\n * Stamp the seams once, then keep them stamped as React remounts nodes.\n * @returns a disposer that disconnects the observer.\n */\nexport function startGlassSeamStamper(): () => void {\n stampAll()\n const observer = new MutationObserver(() => { stampAll() })\n observer.observe(document.documentElement, { childList: true, subtree: true })\n return () => { observer.disconnect() }\n}\n","/**\n * Catppuccin glass layer — one toggleable glassmorphism skin over the whole\n * Web surface, riding on top of the Catppuccin themes. Everything the layer\n * owns is an effect: the CSS hooks ride a `data-dsh-glass` attribute on\n * <html> (the stylesheet only applies under it), the seam stamps ride a\n * MutationObserver, and the page-edge fade bands are DOM elements — so\n * switching the flag off (or unloading the plugin) restores the stock UI\n * exactly: no residue, no reload.\n *\n * The page ground is a SOLID colour: the active theme's own `bg-base`\n * token (Latte / Frappé / Macchiato / Mocha), with the brightness knob\n * mixing white/black straight into it. The earlier animated ambient scene\n * (gradient wash + drifting blobs + hue rotation) was removed in favour of\n * this flat ground.\n *\n * The enable flag and every knob persist in localStorage — the in-browser\n * cache and cross-tab sync bus. The DURABLE copy of the same state lives in a\n * Host file behind `/catppuccin/state` (see `src/state.ts` / `src/host-state.ts`):\n * required because DSH Desktop boots the GUI on a fresh random loopback port\n * every launch, and localStorage (scoped per origin including the port) always\n * starts empty there, while a file in the DSH home does not. The layer lets\n * the plugin hydrate (`applyRemote`) and snapshot (`getRemoteState`) that\n * durable copy; the enable flag and knobs themselves stay client-only visual\n * preferences shared with the plugin alone, needing no host configuration.\n */\nimport type { Context } from '@deepseek-ai/cordis'\n// Type-only: pulls the theme plugin's Context merge (ctx.theme + theme/change).\nimport type {} from '@deepseek-ai/dsh-client-ui-theme/client'\nimport { startGlassSeamStamper } from './glass-seams.ts'\nimport type { GlassState } from '../../state.ts'\n\n/** html attribute selecting the glass layer: CSS hooks and page effects. */\nexport const GLASS_ATTRIBUTE = 'data-dsh-glass'\n\n/** html attribute selecting the mica (floating-card) layout rules. */\nexport const GLASS_FLOAT_ATTRIBUTE = 'data-dsh-glass-float'\n\n/** html attribute selecting the compatibility (stock-layout) rules. */\nexport const GLASS_COMPAT_ATTRIBUTE = 'data-dsh-glass-compat'\n\n/** localStorage key carrying the layer enable flag. */\nexport const GLASS_ENABLED_KEY = 'dsh.catppuccin.glass.enabled'\n\n/** Default state when nothing is stored yet: off (the stock UI stays stock). */\nexport const DEFAULT_ENABLED = false\n\n/** Tunable glass knobs. */\nexport interface GlassSettings {\n /** Rendering mode: mica (frosted floating cards) or the stock layout with a generic glass material. */\n mode: 'mica' | 'compat'\n /** Glass backdrop blur radius, px. */\n blur: number\n /** Glass fill opacity, 0-100 (50 = the shipped look; drives the frost multiplier). */\n frost: number\n /** Backdrop brightness, 0-100 (0 = pure black, 50 = transparent, 100 = pure white; half-range per scheme). */\n brightness: number\n}\n\n/** The full state the settings row mirrors (settings + enable flag + scheme). */\nexport interface GlassRowState extends GlassSettings {\n /** Layer enable flag. */\n enabled: boolean\n /** Resolved palette is dark (the brightness knob darkens). */\n dark: boolean\n}\n\n/**\n * Shipped knob defaults — aligned with the reference project\n * (DSH-Transparent-UI-Plugin / Aqua): mica mode, blur 2px, frost 20\n * (the 0-100 slider maps to a 0-1.4 alpha multiplier via frost/50, so 20\n * reads as a light frost) and neutral backdrop brightness. MUST stay in sync\n * with `DEFAULT_GLASS` in `src/state.ts` (guarded by `tests/state.spec.ts`).\n */\nexport const SETTINGS_DEFAULTS: GlassSettings = {\n mode: 'mica',\n blur: 2,\n frost: 20,\n brightness: 50,\n}\n\n/** Numeric knob keys and their localStorage names. */\nconst NUMERIC_KEYS = {\n blur: 'dsh.catppuccin.glass.blur',\n frost: 'dsh.catppuccin.glass.frost',\n brightness: 'dsh.catppuccin.glass.brightness',\n} as const\ntype NumericKey = keyof typeof NUMERIC_KEYS\n\nconst MODE_KEY = 'dsh.catppuccin.glass.mode'\n\n/** Clamp a numeric knob into its sane range. */\nfunction clampSetting(key: NumericKey, value: number): number {\n const max = key === 'blur' ? 40 : 100\n return Number.isFinite(value) ? Math.min(max, Math.max(0, value)) : SETTINGS_DEFAULTS[key]\n}\n\n/** Read one numeric knob from localStorage (absent/parse failure means the default). */\nfunction readSetting(key: NumericKey): number {\n try {\n const raw = localStorage.getItem(NUMERIC_KEYS[key])\n return raw === null ? SETTINGS_DEFAULTS[key] : clampSetting(key, Number(raw))\n } catch {\n return SETTINGS_DEFAULTS[key]\n }\n}\n\n/** Persist one numeric knob (storage failures keep the in-memory state). */\nfunction writeSetting(key: NumericKey, value: number): void {\n try {\n localStorage.setItem(NUMERIC_KEYS[key], String(value))\n } catch {\n /* in-memory state still applies for this tab */\n }\n}\n\n/** Read the rendering mode ('mica' or 'compat'). */\nfunction readMode(): 'mica' | 'compat' {\n try {\n return localStorage.getItem(MODE_KEY) === 'compat' ? 'compat' : 'mica'\n } catch {\n return 'mica'\n }\n}\n\n/** Persist the rendering mode. */\nfunction writeMode(value: 'mica' | 'compat'): void {\n try {\n localStorage.setItem(MODE_KEY, value)\n } catch {\n /* in-memory state still applies */\n }\n}\n\n/** Read the persisted enable flag (absent storage means the default). */\nfunction readEnabled(): boolean {\n try {\n const raw = localStorage.getItem(GLASS_ENABLED_KEY)\n return raw === null ? DEFAULT_ENABLED : raw === 'true'\n } catch {\n return DEFAULT_ENABLED\n }\n}\n\n/** Persist the enable flag (storage failures keep the in-memory state). */\nfunction writeEnabled(value: boolean): void {\n try {\n localStorage.setItem(GLASS_ENABLED_KEY, String(value))\n } catch {\n /* in-memory state still applies for this tab */\n }\n}\n\n/** Resolved scheme from the theme service (falls back to the body attribute). */\nfunction resolveDark(ctx: Context): boolean {\n try {\n return ctx.theme.getTheme().active.colorScheme === 'dark'\n } catch {\n return document.body.hasAttribute('data-ds-dark-theme')\n }\n}\n\n/**\n * The page-edge fade bands injected while enabled (ported from\n * DSH-Transparent-UI-Plugin): two fixed-position, click-through strips\n * that blur the chat content melting into the viewport edges. Both are\n * removed together on disable. The page ground itself is pure CSS (the\n * body rule), so no backdrop element is needed.\n */\nconst FADE_MARKUP = [\n '<span data-dsh-glass-fade=\"top\" aria-hidden=\"true\"></span>',\n '<span data-dsh-glass-fade=\"bottom\" aria-hidden=\"true\"></span>',\n].join('')\n\n/**\n * Owns the glass layer lifecycle: reads the durable enable flag and knobs,\n * and applies / retracts every layer on change. Cross-tab flips arrive through\n * the storage event; the seam observer and every subscription are released\n * when the plugin fiber is disposed.\n */\nexport class GlassLayer {\n private enabled = false\n private settings: GlassSettings = { ...SETTINGS_DEFAULTS }\n /** Cached snapshot for the settings row (stable reference between changes). */\n private snapshot: GlassRowState\n private readonly listeners = new Set<() => void>()\n private dark = false\n private seamDisposer: (() => void) | undefined\n private readonly ctx: Context\n\n /**\n * @param ctx - owning client context (listeners ride this fiber).\n */\n constructor(ctx: Context) {\n this.ctx = ctx\n this.enabled = readEnabled()\n this.reloadSettings()\n this.dark = resolveDark(ctx)\n this.snapshot = this.buildSnapshot()\n\n ctx.effect(() => {\n const onStorage = (event: StorageEvent): void => {\n if (event.key === null) { this.reloadSettings(); this.enabled = readEnabled(); this.sync() }\n else if (event.key === GLASS_ENABLED_KEY) {\n this.enabled = readEnabled()\n this.sync()\n } else if (event.key === MODE_KEY || event.key in NUMERIC_KEYS) {\n this.reloadSettings()\n if (this.enabled) this.applySettings()\n this.publish()\n }\n }\n window.addEventListener('storage', onStorage)\n // Follow the Appearance switch: the brightness knob's half-range and\n // the mix direction flip with the resolved scheme. Runs even while\n // disabled so the settings row stays correct.\n const themeListener = ctx.on('theme/change', () => {\n this.dark = resolveDark(ctx)\n if (this.enabled) this.applySettings()\n this.publish()\n })\n return () => {\n window.removeEventListener('storage', onStorage)\n themeListener()\n this.unmount()\n }\n }, 'catppuccin: glass layer lifecycle')\n\n // Apply the restored state: mount the layer when the persisted flag is on\n // (the settings row reflects the same snapshot, so the two stay in sync).\n this.sync()\n }\n\n /** Current state snapshot (stable reference until the next change). */\n getSnapshot(): GlassRowState {\n return this.snapshot\n }\n\n /** Subscribe to snapshot changes. Returns the disposer. */\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener)\n return () => { this.listeners.delete(listener) }\n }\n\n /** The durable subset of the current layer state (no derived `dark`). */\n getRemoteState(): GlassState {\n return {\n enabled: this.enabled,\n mode: this.settings.mode,\n blur: this.settings.blur,\n frost: this.settings.frost,\n brightness: this.settings.brightness,\n }\n }\n\n /** Overlay durable state hydrated from the Host file: persist it to\n * localStorage (the cache), apply it to the live layer, and republish so\n * the settings row reflects the restored choice. */\n applyRemote(remote: GlassState): void {\n this.enabled = remote.enabled\n this.settings = {\n mode: remote.mode === 'compat' ? 'compat' : 'mica',\n blur: clampSetting('blur', remote.blur),\n frost: clampSetting('frost', remote.frost),\n brightness: clampSetting('brightness', remote.brightness),\n }\n writeEnabled(this.enabled)\n writeMode(this.settings.mode)\n writeSetting('blur', this.settings.blur)\n writeSetting('frost', this.settings.frost)\n writeSetting('brightness', this.settings.brightness)\n this.sync()\n }\n\n /** Flip the layer: persist, then apply or retract every owned effect. */\n setEnabled(value: boolean): void {\n if (value === this.enabled) return\n this.enabled = value\n writeEnabled(value)\n this.sync()\n }\n\n /** Set the rendering mode ('mica' or 'compat'). */\n setMode(value: 'mica' | 'compat'): void {\n if (value === this.settings.mode) return\n this.settings.mode = value\n writeMode(value)\n if (this.enabled) this.applySettings()\n this.publish()\n }\n\n /** Set the glass blur radius (px). */\n setBlur(value: number): void {\n const next = clampSetting('blur', value)\n if (next === this.settings.blur) return\n this.settings.blur = next\n writeSetting('blur', next)\n if (this.enabled) this.applySettings()\n this.publish()\n }\n\n /** Set the glass frost amount (0-100). */\n setFrost(value: number): void {\n const next = clampSetting('frost', value)\n if (next === this.settings.frost) return\n this.settings.frost = next\n writeSetting('frost', next)\n if (this.enabled) this.applySettings()\n this.publish()\n }\n\n /** Set the backdrop brightness (0-100: 0 = pure black, 50 = transparent, 100 = pure white). */\n setBrightness(value: number): void {\n const next = clampSetting('brightness', value)\n if (next === this.settings.brightness) return\n this.settings.brightness = next\n writeSetting('brightness', next)\n if (this.enabled) this.applySettings()\n this.publish()\n }\n\n /** Restore every knob to the shipped defaults (persisted immediately). */\n resetDefaults(): void {\n this.settings = { ...SETTINGS_DEFAULTS }\n writeMode(this.settings.mode)\n writeSetting('blur', this.settings.blur)\n writeSetting('frost', this.settings.frost)\n writeSetting('brightness', this.settings.brightness)\n if (this.enabled) this.applySettings()\n this.publish()\n }\n\n /** Re-read every knob from localStorage into memory. */\n private reloadSettings(): void {\n this.settings = {\n mode: readMode(),\n blur: readSetting('blur'),\n frost: readSetting('frost'),\n brightness: readSetting('brightness'),\n }\n }\n\n private buildSnapshot(): GlassRowState {\n return { ...this.settings, enabled: this.enabled, dark: this.dark }\n }\n\n private publish(): void {\n this.snapshot = this.buildSnapshot()\n for (const listener of this.listeners) listener()\n }\n\n private sync(): void {\n if (this.enabled) this.mount()\n else this.unmount()\n this.publish()\n }\n\n /** Write the knob-driven CSS variables and mode attributes onto <html>. */\n private applySettings(): void {\n const style = document.documentElement.style\n style.setProperty('--dsh-glass-blur', `${this.settings.blur}px`)\n // Frost 0-100 → a 0-1.4 alpha multiplier (50 = 1x). Capped so max frost\n // stays translucent frosted glass instead of collapsing to a solid slab.\n style.setProperty('--dsh-glass-frost', String(Math.min(this.settings.frost / 50, 1.4)))\n // Backdrop brightness: dark mode darkens (0 = pure black, 50 = off),\n // light mode brightens (50 = off, 100 = pure white) — the knob's range\n // and the mix direction both follow the resolved scheme. The body\n // background rule mixes these fractions straight into the solid ground.\n const dark = this.dark\n style.setProperty('--dsh-glass-brightness-black', String(dark ? Math.max(0, (50 - this.settings.brightness) / 50) : 0))\n style.setProperty('--dsh-glass-brightness-white', String(dark ? 0 : Math.max(0, (this.settings.brightness - 50) / 50)))\n\n // Rendering mode: the float rules key off data-dsh-glass-float; the\n // compat (generic glass) rules key off data-dsh-glass-compat.\n const compat = this.settings.mode === 'compat'\n document.documentElement.toggleAttribute(GLASS_FLOAT_ATTRIBUTE, !compat)\n document.documentElement.toggleAttribute(GLASS_COMPAT_ATTRIBUTE, compat)\n }\n\n private mount(): void {\n document.documentElement.setAttribute(GLASS_ATTRIBUTE, '')\n this.applySettings()\n this.ensureFades()\n if (this.seamDisposer === undefined) this.seamDisposer = startGlassSeamStamper()\n }\n\n private unmount(): void {\n document.documentElement.removeAttribute(GLASS_ATTRIBUTE)\n document.documentElement.removeAttribute(GLASS_FLOAT_ATTRIBUTE)\n document.documentElement.removeAttribute(GLASS_COMPAT_ATTRIBUTE)\n for (const node of document.querySelectorAll('[data-dsh-glass-fade]')) node.remove()\n this.seamDisposer?.()\n this.seamDisposer = undefined\n }\n\n /** Insert the page-edge fade bands (or reuse the existing ones). */\n private ensureFades(): void {\n if (document.querySelector('[data-dsh-glass-fade]') !== null) return\n const holder = document.createElement('div')\n holder.innerHTML = FADE_MARKUP\n for (const node of Array.from(holder.children)) {\n if (node instanceof HTMLElement) document.body.append(node)\n }\n }\n}\n","/**\n * Catppuccin glass settings row — registered into the General settings\n * section (`settings.general.item`, right under the Catppuccin flavour row).\n * Holds the master on/off switch plus every glass knob: mode (mica /\n * compatibility), blur, frost and backdrop brightness. Every write goes\n * straight through to the glass layer, so the skin moves live.\n */\nimport { useSyncExternalStore } from 'react'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { GlassRowState } from './glass-layer.ts'\nimport css from './GlassRow.module.css'\n\n/** Injected business face: the layer state seat plus every knob write. */\nexport interface GlassRowInjected {\n /** Current layer state snapshot. */\n getState: () => GlassRowState\n /** Subscribe to layer state changes. Returns the disposer. */\n subscribe: (listener: () => void) => () => void\n /** Switch the glass layer on or off. */\n setEnabled: (enabled: boolean) => void\n /** Set the rendering mode ('mica' floating cards or 'compat' stock layout). */\n setMode: (mode: 'mica' | 'compat') => void\n /** Set the glass blur radius, px. */\n setBlur: (value: number) => void\n /** Set the glass frost amount, 0-100. */\n setFrost: (value: number) => void\n /** Set the backdrop brightness, 0-100. */\n setBrightness: (value: number) => void\n /** Restore every knob to the shipped defaults. */\n resetDefaults: () => void\n}\n\n/** Full component props: runtime share + locale seat + injected face. */\nexport type GlassRowProps = PropsRuntime<'settings.general.item'> & PropsLocale<'catppuccin'> & GlassRowInjected\n\n/** One slider + number box, wired to a single value. */\nfunction Knob(props: {\n label: string\n value: number\n min: number\n max: number\n step: number\n unit: string\n onChange: (value: number) => void\n}): React.JSX.Element {\n const { label, value, min, max, step, unit, onChange } = props\n const clamp = (n: number): number => Math.min(max, Math.max(min, Number.isFinite(n) ? n : min))\n return (\n <label className={css.knob}>\n <span className={css.knobLabel}>{label}</span>\n <input\n type=\"range\"\n className={css.slider}\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={(e) => { onChange(clamp(Number(e.target.value))) }}\n />\n <span className={css.numberWrap}>\n <input\n type=\"number\"\n className={css.number}\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={(e) => { onChange(clamp(Number(e.target.value))) }}\n />\n <span className={css.unit}>{unit}</span>\n </span>\n </label>\n )\n}\n\n/** A two-option segmented picker. */\nfunction Segmented<T extends string>(props: {\n label: string\n value: T\n options: readonly { id: T; label: string }[]\n onSelect: (value: T) => void\n}): React.JSX.Element {\n const { label, value, options, onSelect } = props\n return (\n <div className={css.segmented} role=\"group\" aria-label={label}>\n {options.map((option) => (\n <button\n key={option.id}\n type=\"button\"\n className={option.id === value ? css.segActive : css.seg}\n aria-pressed={option.id === value}\n onClick={() => { onSelect(option.id) }}\n >\n {option.label}\n </button>\n ))}\n </div>\n )\n}\n\n/**\n * Render the glass row: title, the master switch, and — while enabled — the\n * mode picker and every knob.\n * @param props - composed slot props.\n * @returns the General section row.\n */\nexport function GlassRow({ t, getState, subscribe, setEnabled, setMode, setBlur, setFrost, setBrightness, resetDefaults }: GlassRowProps): React.JSX.Element {\n const state = useSyncExternalStore(subscribe, getState)\n const { enabled, mode, blur, frost, brightness, dark } = state\n\n // The brightness knob only ever offers the half that makes sense for the\n // resolved scheme: dark mode darkens (0-50), light mode brightens (50-100).\n const bgMin = dark ? 0 : 50\n const bgMax = dark ? 50 : 100\n const bgDisplay = Math.min(bgMax, Math.max(bgMin, brightness))\n\n return (\n <div className={css.group}>\n <div className={css.title}>{t('glass.title')}</div>\n <div className={css.description}>{t('glass.description')}</div>\n <div className={css.controls}>\n <div className={css.row}>\n <span className={css.rowLabel}>{t('glass.enable')}</span>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={enabled}\n aria-label={t('glass.enable')}\n className={enabled ? css.toggleOn : css.toggle}\n onClick={() => { setEnabled(!enabled) }}\n >\n <span className={css.check} aria-hidden=\"true\">{enabled ? '✓' : ''}</span>\n </button>\n </div>\n {enabled && (\n <>\n <div className={css.row}>\n <span className={css.rowLabel}>{t('glass.mode')}</span>\n <Segmented\n label={t('glass.mode')}\n value={mode}\n options={[\n { id: 'mica', label: t('glass.modeMica') },\n { id: 'compat', label: t('glass.modeCompat') },\n ]}\n onSelect={setMode}\n />\n </div>\n <div className={css.rowHint}>{t('glass.modeHint')}</div>\n <Knob label={t('glass.blur')} value={blur} min={0} max={40} step={0.5} unit=\"px\" onChange={setBlur} />\n <Knob label={t('glass.frost')} value={frost} min={0} max={100} step={1} unit=\"%\" onChange={setFrost} />\n <Knob label={t('glass.brightness')} value={bgDisplay} min={bgMin} max={bgMax} step={1} unit=\"%\" onChange={setBrightness} />\n <div className={css.knobHint}>\n {t(dark ? 'glass.brightnessHintDark' : 'glass.brightnessHintLight')}\n </div>\n <div className={css.row}>\n <button type=\"button\" className={css.resetButton} onClick={() => { resetDefaults() }}>\n {t('glass.reset')}\n </button>\n </div>\n </>\n )}\n </div>\n </div>\n )\n}\n","/**\n * Update-check settings row — one General-section preference row that asks\n * the Host's `/catppuccin/check-update` route for the latest published npm\n * version and reports whether this install is current. Detection is Host-side\n * (Node fetch, no CORS, profile probe included); the row renders the verdict\n * and, when an update is available, offers the copyable CLI upgrade command\n * whose profile name the Host already probed. Upgrading itself stays a\n * terminal action (`dsh plugin … add @latest`) — the row never touches the\n * profile workspace.\n */\nimport { useState } from 'react'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { UpdateCheckPayload, UpdateErrorCode } from '../update-check.ts'\nimport type { CatppuccinKey } from './locales.ts'\n\n/** Injected business face of the row (assembled in apply). */\nexport interface UpdateRowInjected {\n /** Ask the Host for the update verdict (same-origin fetch of the route). */\n check: () => Promise<UpdateCheckPayload>\n}\n\n/** Full component props: runtime share + locale seat + injected face. */\nexport type UpdateRowProps = PropsRuntime<'settings.general.item'> & PropsLocale<'catppuccin'> & UpdateRowInjected\n\n/** One phase of the row's interaction. */\ntype Phase = 'idle' | 'checking' | 'done'\n\n/** Copy the upgrade command; falls back to no-op when the clipboard is unavailable. */\nasync function copyCommand(text: string): Promise<boolean> {\n try {\n await navigator.clipboard.writeText(text)\n return true\n } catch {\n return false\n }\n}\n\n/** Map a stable error code to its locale key (unknown codes fall back to the generic message). */\nfunction errorKey(code: UpdateErrorCode | undefined): CatppuccinKey {\n switch (code) {\n case 'registry-unreachable': return 'update.err.registry'\n case 'registry-http': return 'update.err.http'\n case 'no-dist-tags': return 'update.err.noTags'\n case 'invalid-response': return 'update.err.invalid'\n case 'network': return 'update.err.network'\n default: return 'update.failed'\n }\n}\n\n/**\n * Render the update-check row: title, description, a check button, and the\n * verdict once checked.\n * @param props - composed slot props.\n * @returns the row element tree.\n */\nexport function UpdateRow({ t, check }: UpdateRowProps): React.JSX.Element {\n const [phase, setPhase] = useState<Phase>('idle')\n const [payload, setPayload] = useState<UpdateCheckPayload | null>(null)\n const [copied, setCopied] = useState(false)\n\n const runCheck = async (): Promise<void> => {\n setPhase('checking')\n setCopied(false)\n try {\n setPayload(await check())\n } catch {\n setPayload({ ok: false, code: 'network', error: 'network' })\n } finally {\n setPhase('done')\n }\n }\n\n const buttonStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n padding: '6px 12px',\n borderRadius: 8,\n border: '1px solid var(--dsw-alias-border-l1)',\n background: 'transparent',\n color: 'var(--dsw-alias-label-primary)',\n cursor: phase === 'checking' ? 'default' : 'pointer',\n font: 'inherit',\n opacity: phase === 'checking' ? 0.6 : 1,\n }\n\n const localInstall = payload?.ok === true && payload.installSource !== undefined\n && payload.installSource !== 'registry'\n // DSH Desktop adapts the copy: its target profile comes from the Desktop\n // service and the hint/restart text says so, while standard dsh web keeps\n // the terminal copy.\n const isDesktop = payload?.ok === true && payload.env === 'desktop'\n\n return (\n <div style={{ borderBottom: '1px solid var(--dsw-alias-border-l2)', display: 'flex', flexDirection: 'column', gap: '10px', padding: '16px 0' }}>\n <div style={{ color: 'var(--dsw-alias-label-primary)', fontSize: 14, lineHeight: '22px' }}>\n {t('update.title')}\n </div>\n <div style={{ color: 'var(--dsw-alias-label-tertiary)', fontSize: 12, lineHeight: '18px' }}>\n {t('update.description')}\n </div>\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '8px', alignItems: 'center' }}>\n <button type=\"button\" disabled={phase === 'checking'} onClick={() => void runCheck()} style={buttonStyle}>\n {phase === 'checking' ? t('update.checking') : t('update.check')}\n </button>\n {payload?.ok === true && payload.current !== undefined && (\n <span style={{ color: 'var(--dsw-alias-label-secondary)', fontSize: 12, lineHeight: '18px' }}>\n {t('update.current')} {payload.current}\n </span>\n )}\n {payload?.ok === true && payload.checkedAt !== undefined && (\n <span style={{ color: 'var(--dsw-alias-label-tertiary)', fontSize: 11, lineHeight: '18px' }}>\n {t('update.checkedAt')} {new Date(payload.checkedAt).toLocaleString()}\n </span>\n )}\n </div>\n\n {phase === 'done' && payload !== null && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px' }}>\n {payload.ok === true ? (\n payload.outdated === true && payload.latest !== undefined ? (\n <>\n <div style={{ color: 'var(--dsw-alias-label-primary)', fontSize: 12, lineHeight: '18px' }}>\n {t('update.available')} <strong>{payload.latest}</strong>\n </div>\n {payload.updateCommand !== undefined && (\n <>\n <div style={{ color: 'var(--dsw-alias-label-tertiary)', fontSize: 12, lineHeight: '18px' }}>\n {isDesktop\n ? t('update.commandHintDesktop').replace('{profile}', payload.profile ?? '')\n : payload.profileDetected === true && payload.profile !== undefined\n ? t('update.commandHintDetected').replace('{profile}', payload.profile)\n : t('update.commandHint')}\n </div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '8px', alignItems: 'center' }}>\n <code style={{\n flex: '1 1 260px',\n padding: '6px 10px',\n borderRadius: 8,\n border: '1px solid var(--dsw-alias-border-l1)',\n background: 'var(--dsw-alias-bg-layer-1)',\n color: 'var(--dsw-alias-label-primary)',\n fontSize: 12,\n lineHeight: '18px',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n }}>\n {payload.updateCommand}\n </code>\n <button\n type=\"button\"\n onClick={() => { void copyCommand(payload.updateCommand ?? '').then(setCopied) }}\n style={{ ...buttonStyle, cursor: 'pointer' }}\n >\n {copied ? t('update.copied') : t('update.copy')}\n </button>\n </div>\n {localInstall && (\n <div style={{ color: 'var(--dsw-alias-label-warning, var(--dsw-alias-label-tertiary))', fontSize: 12, lineHeight: '18px' }}>\n {t('update.localInstall')}\n </div>\n )}\n <div style={{ color: 'var(--dsw-alias-label-tertiary)', fontSize: 12, lineHeight: '18px' }}>\n {t(isDesktop ? 'update.restartHintDesktop' : 'update.restartHint')}\n </div>\n </>\n )}\n </>\n ) : (\n <div style={{ color: 'var(--dsw-alias-label-primary)', fontSize: 12, lineHeight: '18px' }}>\n {t('update.upToDate')}\n </div>\n )\n ) : (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '8px', alignItems: 'center' }}>\n <span style={{ color: 'var(--dsw-alias-label-tertiary)', fontSize: 12, lineHeight: '18px' }}>\n {t(errorKey(payload.code))}\n </span>\n <button type=\"button\" onClick={() => void runCheck()} style={{ ...buttonStyle, cursor: 'pointer' }}>\n {t('update.retry')}\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n )\n}\n","/**\n * Shared contract of the update-check feature — consumed by both halves:\n * the Host registers an exact webServer route answering this JSON payload,\n * and the Client settings row fetches that same-origin route and renders it.\n * This module is dependency-free so both bundles inline it.\n */\nimport { compareVersions, parseVersion } from './versions.ts'\n\n/** The plugin's own npm name (the registry lookup key). */\nexport const PACKAGE_NAME = '@nonamelego/dsh-catppuccin'\n\n/**\n * npm registry abbreviated packument endpoint (the `install-v1` document).\n * The `latest` endpoint alone is not enough: this project ships prereleases\n * under the `beta` dist-tag while `latest` stays on the last stable, so the\n * check reads `dist-tags` to serve both channels.\n */\nexport const REGISTRY_PACKUMENT_URL =\n `https://registry.npmjs.org/${PACKAGE_NAME.replace('/', '%2F')}`\n\n/** Host route the Client row fetches (exact match, same origin). */\nexport const UPDATE_ROUTE_PATH = '/catppuccin/check-update'\n\n/** Network budget for the Host's registry lookup. */\nexport const UPDATE_FETCH_TIMEOUT_MS = 8000\n\n/** Release channels the check knows about. */\nexport type UpdateChannel = 'latest' | 'beta'\n\n/** The `dist-tags` object of an npm packument. */\nexport interface DistTags {\n latest?: string\n beta?: string\n}\n\n/** The newest release a given install should chase, and on which channel. */\nexport interface NewestRelease {\n version: string\n channel: UpdateChannel\n}\n\n/**\n * The copyable CLI upgrade command for one channel (`dsh plugin` is a thin\n * pnpm forwarder). The profile name comes from the Host's runtime probe\n * (`src/profile-detect.ts`), never hard-coded, so the command works on any\n * deployment out of the box.\n * @param channel - the dist-tag to chase.\n * @param profile - the DSH profile name to target.\n */\nexport function updateCommandFor(channel: UpdateChannel, profile: string): string {\n return `dsh plugin --profile ${profile} add ${PACKAGE_NAME}@${channel}`\n}\n\n/**\n * Pick the newest release worth reporting for the given install:\n * - a stable install only chases the `latest` tag (never downgrades onto a\n * beta), so a stable user on the last stable sees \"up to date\";\n * - a prerelease install (e.g. a `beta`-tagged version) also chases `beta`,\n * so beta users see newer betas — and a stable release that outranks their\n * prerelease promotes them via `@latest`.\n * @param current - the installed version.\n * @param tags - the registry's dist-tags.\n * @returns the newest candidate and its channel, or null when nothing applies.\n */\nexport function selectNewest(current: string, tags: DistTags): NewestRelease | null {\n const candidates: NewestRelease[] = []\n if (tags.latest !== undefined) candidates.push({ version: tags.latest, channel: 'latest' })\n const parsed = parseVersion(current)\n if (tags.beta !== undefined && parsed !== null && parsed.prerelease.length > 0) {\n candidates.push({ version: tags.beta, channel: 'beta' })\n }\n if (candidates.length === 0) return null\n let best = candidates[0]\n for (const candidate of candidates.slice(1)) {\n if (compareVersions(best.version, candidate.version) < 0) best = candidate\n }\n return best\n}\n\n/** Stable machine-readable outcome code (borrowed from the plugin-update\n * error-code discipline of dsh-vision-toolkit): the Client maps it to copy\n * instead of sniffing human text. */\nexport type UpdateErrorCode =\n | 'ok'\n | 'network' // the same-origin fetch itself failed (client side)\n | 'registry-unreachable' // npm registry could not be reached or timed out\n | 'registry-http' // registry answered with a non-2xx status\n | 'no-dist-tags' // registry returned no usable dist-tags\n | 'invalid-response' // registry response could not be parsed\n\n/** How this package is installed inside the probed DSH profile. */\nexport type InstallSource = 'registry' | 'link' | 'file' | 'git' | 'unknown'\n\n/** Runtime that answered the check — drives the copy (command hint / restart). */\nexport type UpdateEnv = 'desktop' | 'web'\n\n/**\n * JSON payload of the update check. `ok: false` carries a human-readable\n * `error` plus a stable `code`; `ok: true` carries the comparison result.\n * The Host owns the semver comparison, the channel selection, and the\n * profile probe (single source of truth), so the Client never parses\n * versions or guesses the profile name itself.\n */\nexport interface UpdateCheckPayload {\n /** Whether the registry lookup succeeded. */\n ok: boolean\n /** Installed version (from this package's own manifest). */\n current?: string\n /** Newest release worth chasing (`latest`, plus `beta` for prerelease installs). */\n latest?: string\n /** `latest` is strictly newer than `current`. */\n outdated?: boolean\n /** The dist-tag the newest release came from. */\n channel?: UpdateChannel\n /** Copyable CLI upgrade command (present when outdated). */\n updateCommand?: string\n /** DSH profile name the upgrade command targets (probed, not guessed). */\n profile?: string\n /** Whether the profile probe actually found the install (false = fallback). */\n profileDetected?: boolean\n /** Runtime that answered: DSH Desktop vs standard dsh web (drives copy). */\n env?: UpdateEnv\n /** How the package is installed in that profile (drives copy). */\n installSource?: InstallSource\n /** ISO timestamp of the check (registry lookup moment). */\n checkedAt?: string\n /** Stable outcome code (see {@link UpdateErrorCode}). */\n code?: UpdateErrorCode\n /** Failure detail (only when `ok` is false). */\n error?: string\n}\n","/**\n * Durable Catppuccin state — the shared contract between the two halves.\n *\n * Why this exists: DSH Desktop launches `@deepseek-ai/dsh` with `--port 0`\n * (a fresh random loopback port every launch), and localStorage is scoped per\n * origin including the port. So a flavour/glass choice persisted only in\n * localStorage is silently lost on every Desktop restart — the GUI boots on a\n * brand-new origin where the storage is empty. The other Desktop surfaces that\n * DO persist (the skin centre's active choice) are written by the host to a\n * file under the DSH home (`cordis.patch.yml`), which is port-independent.\n *\n * The fix mirrors that proven pattern: the Host keeps a tiny JSON file at\n * `$DSH_HOME/catppuccin-state.json`, and the Client reads/updates it through\n * two same-origin webServer routes (exactly the update-check pattern). The\n * file is the source of truth; browser localStorage stays as the instant\n * in-browser cache and cross-tab sync. This module is dependency-free so both\n * bundles inline it (like `update-check.ts`).\n */\nexport const STATE_VERSION = 1\n\n/** Host route answering the durable state (GET reads, PUT writes). */\nexport const STATE_ROUTE_PATH = '/catppuccin/state'\n\n/** State file name under the DSH home (kept next to the Desktop-managed\n * `cordis.patch.yml` so it survives the Desktop's per-launch port churn). */\nexport const STATE_FILENAME = 'catppuccin-state.json'\n\n/** The four registered Catppuccin theme ids. MUST stay in sync with the\n * `themeId` of `CATPPUCCIN_FLAVORS` in `src/client/palettes.ts` — guarded by\n * `tests/state.spec.ts` — because the persisted flavour value IS the theme id. */\nexport const CATPPUCCIN_THEME_IDS = [\n 'catppuccin-latte',\n 'catppuccin-frappe',\n 'catppuccin-macchiato',\n 'catppuccin-mocha',\n] as const\n\n/** A persisted flavour choice: one registered theme id or `off` (fall back to\n * the official theme). */\nexport type FlavorValue = (typeof CATPPUCCIN_THEME_IDS)[number] | 'off'\n\n/** Durable glass-layer settings (no derived `dark` field — that resolves at\n * runtime from the active theme). */\nexport interface GlassState {\n /** Layer enable flag. */\n enabled: boolean\n /** Rendering mode. */\n mode: 'mica' | 'compat'\n /** Glass blur radius, px (0-40). */\n blur: number\n /** Glass fill frost, 0-100. */\n frost: number\n /** Backdrop brightness, 0-100. */\n brightness: number\n}\n\n/** The whole durable state the plugin persists. */\nexport interface CatppuccinState {\n /** Schema version; anything else is treated as unknown and defaulted. */\n version: typeof STATE_VERSION\n /** Selected flavour (theme id or `off`). */\n flavor: FlavorValue\n /** Glass-layer settings (enable flag + knobs). */\n glass: GlassState\n}\n\n/** Shipped glass defaults — aligned with `SETTINGS_DEFAULTS` in\n * `src/client/glass/glass-layer.ts` (guarded by `tests/state.spec.ts`). */\nexport const DEFAULT_GLASS: GlassState = {\n enabled: false,\n mode: 'mica',\n blur: 2,\n frost: 20,\n brightness: 50,\n}\n\n/** A fully default state: no Catppuccin flavour and no glass. */\nexport function defaultState(): CatppuccinState {\n return {\n version: STATE_VERSION,\n flavor: 'off',\n glass: { ...DEFAULT_GLASS },\n }\n}\n\n/** Clamp a finite number into [min, max]; non-finite values fall back. */\nfunction clampFinite(value: unknown, min: number, max: number, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value)\n ? Math.min(max, Math.max(min, value))\n : fallback\n}\n\n/**\n * Normalize arbitrary input (JSON from disk or the wire) into a valid state:\n * unknown/missing fields fall back to defaults, out-of-range numbers clamp,\n * and unknown flavours/invalid enums fall back too. The Host applies this on\n * both read and write so a corrupt file or a hand-crafted payload can never\n * poison the plugin's settings.\n */\nexport function sanitizeState(input: unknown): CatppuccinState {\n const state = defaultState()\n if (typeof input !== 'object' || input === null) return state\n const raw = input as Record<string, unknown>\n\n const flavor = raw.flavor\n if (typeof flavor === 'string' && (CATPPUCCIN_THEME_IDS as readonly string[]).includes(flavor)) {\n state.flavor = flavor as FlavorValue\n } else if (flavor === 'off') {\n state.flavor = 'off'\n }\n\n const glass = typeof raw.glass === 'object' && raw.glass !== null\n ? raw.glass as Record<string, unknown>\n : {}\n state.glass.enabled = glass.enabled === true\n state.glass.mode = glass.mode === 'compat' ? 'compat' : 'mica'\n state.glass.blur = clampFinite(glass.blur, 0, 40, DEFAULT_GLASS.blur)\n state.glass.frost = clampFinite(glass.frost, 0, 100, DEFAULT_GLASS.frost)\n state.glass.brightness = clampFinite(glass.brightness, 0, 100, DEFAULT_GLASS.brightness)\n\n return state\n}\n\n/** Whether a normalized state carries nothing beyond the shipped defaults —\n * i.e. the user never actually chose anything worth persisting. Used to tell\n * \"no durable state yet\" apart from \"an explicit default choice\". */\nexport function isDefaultState(state: CatppuccinState): boolean {\n const expected = defaultState()\n return state.flavor === expected.flavor\n && state.glass.enabled === expected.glass.enabled\n && state.glass.mode === expected.glass.mode\n && state.glass.blur === expected.glass.blur\n && state.glass.frost === expected.glass.frost\n && state.glass.brightness === expected.glass.brightness\n}\n","/**\n * Browser half of the durable Catppuccin state — a thin wrapper over the\n * Host's `/catppuccin/state` route (same-origin relative fetch, so it works on\n * DSH Desktop's per-launch random loopback port). The Host file is the source\n * of truth; this module adds the fetch wrapper plus a debounced trailing\n * writer so rapid knob drags coalesce into a single PUT. Every failure is\n * non-fatal: the plugin keeps working from browser localStorage alone.\n */\nimport { STATE_ROUTE_PATH, sanitizeState, type CatppuccinState } from '../state.ts'\n\n/** Outcome of reading the durable state from the Host. */\nexport interface DurableReadResult {\n /** Whether the route answered at all (false = fall back to localStorage-only). */\n available: boolean\n /** The stored state, or null when nothing durable has been written yet. */\n state: CatppuccinState | null\n}\n\n/** Read the durable state from the Host file (same-origin GET). */\nexport async function readDurableStateRemote(): Promise<DurableReadResult> {\n try {\n const response = await fetch(STATE_ROUTE_PATH, { headers: { accept: 'application/json' } })\n if (!response.ok) return { available: false, state: null }\n const payload = await response.json() as { ok?: boolean; state?: unknown }\n if (payload.ok !== true) return { available: false, state: null }\n return { available: true, state: payload.state === null || payload.state === undefined\n ? null\n : sanitizeState(payload.state) }\n } catch {\n return { available: false, state: null }\n }\n}\n\n/** Write the durable state to the Host file (same-origin PUT). */\nexport async function persistDurableState(state: CatppuccinState): Promise<boolean> {\n try {\n const response = await fetch(STATE_ROUTE_PATH, {\n method: 'PUT',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify(sanitizeState(state)),\n })\n return response.ok\n } catch {\n return false\n }\n}\n\nlet pendingTimer: number | undefined\nlet pendingGetState: (() => CatppuccinState) | undefined\n\n/**\n * Debounced trailing persist: after a burst of changes (a slider drag emits a\n * stream of snapshot updates) the latest state is written to the Host once,\n * a short beat after the last change. Pass an accessor so the snapshot is\n * taken at flush time, never stale.\n */\nexport function scheduleDurablePersist(getState: () => CatppuccinState, delayMs = 300): void {\n if (pendingTimer !== undefined) window.clearTimeout(pendingTimer)\n pendingGetState = getState\n pendingTimer = window.setTimeout(() => {\n pendingTimer = undefined\n const state = pendingGetState\n pendingGetState = undefined\n if (state !== undefined) void persistDurableState(state()).catch(() => { /* best-effort */ })\n }, delayMs)\n}\n\n/** Drop any queued persist (plugin unload / page teardown). */\nexport function cancelDurablePersist(): void {\n if (pendingTimer !== undefined) window.clearTimeout(pendingTimer)\n pendingTimer = undefined\n pendingGetState = undefined\n}\n","/**\n * Catppuccin themes for the DeepSeek Harness web GUI — browser half.\n *\n * Registers the four Catppuccin flavours (Latte light / Frappé, Macchiato,\n * Mocha dark) into the official ThemeRuntime, so they become selectable\n * themes whose --dsw-* token overrides fully remap the UI palette. The\n * official Appearance row persists only the built-in light/dark/system\n * preferences, so this plugin also owns a settings row (\"Catppuccin\") that\n * lists the four flavours; selecting one switches the theme and persists the\n * flavour.\n *\n * Persistence is two-tier. The choice lives in two stores:\n * - localStorage keys (`dsh.catppuccin.*`) — the in-browser cache: instant\n * restore at boot and the cross-tab `storage` event bus;\n * - the Host durable file (`$DSH_HOME/catppuccin-state.json`, served by\n * `/catppuccin/state`, written by `src/host-state.ts`) — the source of\n * truth. It exists because DSH Desktop launches `@deepseek-ai/dsh` with\n * `--port 0` (a fresh random loopback port every launch) and localStorage\n * is scoped per origin including the port, so a localStorage-only choice\n * is silently emptied on every Desktop restart. The Host settings wire is\n * not used: it only serves an explicit allowlist of namespaces (a\n * plugin-owned namespace answers `settings-not-exposed`).\n * At boot the plugin fast-applies localStorage, then hydrates the Host file\n * and mirrors it back into localStorage; if the Host has nothing but this\n * browser session already chose something, that choice is migrated to the\n * Host. Every user change is written to localStorage immediately and pushed to\n * the Host (debounced) so it survives the next Desktop restart.\n */\nimport type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { ThemeRuntime, ThemeTokens } from '@deepseek-ai/dsh-client-ui-theme/client'\n// Type-only: pulls the locale plugin's Context merge (ctx.locale).\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\n// Type-only: pulls the settings-surface SlotMap merge (settings.general.item).\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport { CatppuccinRow, type CatppuccinRowInjected } from './CatppuccinRow.tsx'\nimport { en, zh, type CatppuccinKey } from './locales.ts'\nimport { CATPPUCCIN_FLAVORS, type CatppuccinFlavorId, type CatppuccinFlavorInfo } from './palettes.ts'\nimport { SHIKI_TOKENS } from './shiki-tokens.ts'\nimport { GlassLayer } from './glass/glass-layer.ts'\nimport { GlassRow, type GlassRowInjected } from './glass/glass-row.tsx'\nimport { UpdateRow, type UpdateRowInjected } from './UpdateRow.tsx'\nimport type { UpdateCheckPayload } from '../update-check.ts'\nimport { UPDATE_ROUTE_PATH } from '../update-check.ts'\nimport {\n isDefaultState,\n STATE_VERSION,\n type CatppuccinState,\n type FlavorValue,\n} from '../state.ts'\nimport {\n cancelDurablePersist,\n readDurableStateRemote,\n scheduleDurablePersist,\n} from './state-sync.ts'\n// Side-effect import: the glass stylesheet (auto-injected as a plugin-owned\n// <style> tag; every rule is gated on the data-dsh-glass attribute).\nimport './glass/glass.module.css'\n\n/** Locale namespace owned by this plugin. */\nexport const NS = 'catppuccin'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n /** The Catppuccin settings row's copy. */\n catppuccin: CatppuccinKey\n }\n}\n\n/** localStorage key carrying the persisted flavour choice. */\nexport const FLAVOR_STORAGE_KEY = 'dsh.catppuccin.flavor'\n\n/** Accepted flavour values — the four registered theme ids plus `off`. These\n * MUST stay in sync with the registered themes (guarded by\n * tests/palettes.spec.ts) because the persisted value is the theme id. */\nexport const CATPPUCCIN_FLAVOR_VALUES = [\n ...CATPPUCCIN_FLAVORS.map((f) => f.themeId),\n 'off',\n] as const\n\n/** `off` means: fall back to the official theme (default). */\nexport type FlavorChoice = (typeof CATPPUCCIN_FLAVOR_VALUES)[number]\n\n/** The flavour whose themeId this is, or `off`. */\nexport function flavorFromThemeId(themeId: string): FlavorChoice {\n return CATPPUCCIN_FLAVORS.some((f) => f.themeId === themeId) ? themeId as FlavorChoice : 'off'\n}\n\n/** The flavour registered for a theme id, or undefined when not a Catppuccin theme. */\nexport function flavorInfo(themeId: string): CatppuccinFlavorInfo | undefined {\n return CATPPUCCIN_FLAVORS.find((f) => f.themeId === themeId)\n}\n\n/** Read the persisted flavour (absent / unknown values mean the default `off`). */\nexport function readFlavor(): FlavorChoice {\n try {\n const raw = localStorage.getItem(FLAVOR_STORAGE_KEY)\n return raw !== null && (CATPPUCCIN_FLAVOR_VALUES as readonly string[]).includes(raw)\n ? raw as FlavorChoice\n : 'off'\n } catch {\n return 'off'\n }\n}\n\n/** Persist the flavour choice (storage failures keep the in-memory state). */\nexport function writeFlavor(choice: FlavorChoice): void {\n try {\n localStorage.setItem(FLAVOR_STORAGE_KEY, choice)\n } catch {\n /* in-memory state still applies for this tab */\n }\n}\n\n/** Required services: slots + locale (settings rows) and theme (register + switch). */\nexport const inject = ['slots', 'locale', 'theme']\n\n/**\n * Register the Catppuccin dictionaries, the four flavour themes, and the\n * settings row.\n * @param ctx - client root context.\n */\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'catppuccin: dictionaries')\n\n const theme = ctx.get('theme') as ThemeRuntime\n\n // Register the four flavour themes. Each carries the full --dsw-* token\n // dictionary for its flavour plus the Catppuccin syntax-highlighting\n // (--shiki-*) tokens; the presenter applies them as body inline variables\n // when the theme is active.\n ctx.effect(() => {\n const disposers = CATPPUCCIN_FLAVORS.map((flavor) => {\n // Flavour id for the shiki token lookup: themeId is \"catppuccin-latte\"\n // → key is \"latte\".\n const flavorId = flavor.themeId.replace('catppuccin-', '') as CatppuccinFlavorId\n const shiki = SHIKI_TOKENS[flavorId]\n return theme.register({\n id: flavor.themeId,\n colorScheme: flavor.colorScheme,\n tokens: { ...flavor.tokens, ...shiki } as ThemeTokens,\n })\n })\n return () => {\n for (const dispose of disposers) dispose()\n }\n }, 'catppuccin: flavour themes')\n\n // The glass layer: a toggleable glassmorphism skin on top of the Catppuccin\n // themes. It owns its lifecycle (enable flag + knobs persist in\n // localStorage as the in-browser cache; the durable copy is the Host file\n // hydrated/pushed below; every effect is released with this fiber). It is\n // created before the boot-restore effect so hydration can overlay the\n // persisted glass state onto the layer.\n const glass = new GlassLayer(ctx)\n\n // The current durable snapshot: flavour from the localStorage cache (the\n // authoritative write target of the settings row) plus the glass layer's\n // remote state. Passed to the debounced Host persist by reference so the\n // flush always captures the freshest values.\n const buildLocalState = (): CatppuccinState => ({\n version: STATE_VERSION,\n // `FlavorChoice` widens to `string` (palettes carry `themeId: string`), but\n // the runtime value is always one of the four theme ids or `off` — the\n // same set as `FlavorValue`, guarded by tests/state.spec.ts.\n flavor: readFlavor() as FlavorValue,\n glass: glass.getRemoteState(),\n })\n\n // Restore the persisted choice. Two stores feed one mutable `desired`\n // flavour: localStorage (the in-browser cache — instant at boot and the\n // cross-tab `storage` bus) and the Host's durable state file (the source of\n // truth — required by DSH Desktop, which boots on a fresh random loopback\n // port every launch so localStorage there always starts empty). Restoring is\n // also a two-step race at boot: the flavour themes are registered by this\n // plugin (so an immediate setTheme may run before registration), and the\n // official Appearance scope adoption (`adopt()`) re-applies the stored\n // light/dark/system preference once its scope loads, overriding us. So the\n // desired flavour is re-asserted on every theme change within a short boot\n // window; after that a theme change is a user action and must win.\n ctx.effect(() => {\n let desired: FlavorChoice = readFlavor()\n let settled = false\n const started = Date.now()\n const applyDesired = (): void => {\n if (settled) return\n if (Date.now() - started > 5000) {\n settled = true\n return\n }\n if (desired === 'off') return\n try {\n if (theme.getTheme().preference !== desired) theme.setTheme(desired)\n } catch {\n // Theme not registered yet — the registry-update theme/change retries.\n }\n }\n applyDesired()\n const disposer = ctx.on('theme/change', applyDesired)\n const timer = window.setTimeout(() => { settled = true }, 5000)\n const onStorage = (event: StorageEvent): void => {\n if (event.key !== FLAVOR_STORAGE_KEY) return\n const next = readFlavor()\n if (next !== 'off') {\n try {\n theme.setTheme(next)\n } catch {\n /* unknown persisted value — keep the current theme */\n }\n }\n }\n window.addEventListener('storage', onStorage)\n\n // Any glass change (enable flag or knob) coalesces into one durable write.\n const offGlass = glass.subscribe(() => {\n scheduleDurablePersist(buildLocalState)\n })\n\n // Hydrate the durable source of truth without blocking paint. The Host\n // file read is same-origin and answers in ms, so this resolves inside the\n // boot window; if it ever arrives later the fast path keeps working.\n let cancelled = false\n void readDurableStateRemote().then((result) => {\n if (cancelled) return\n if (!result.available) return // route missing — localStorage-only still works\n if (result.state === null) {\n // Nothing durable yet. If this browser session already chose something\n // (e.g. a localStorage-only preference from before this fix), migrate\n // it to the Host so it survives a later Desktop restart.\n if (!isDefaultState(buildLocalState())) scheduleDurablePersist(buildLocalState)\n return\n }\n // Durable state is the source of truth: overlay it, mirror it into\n // localStorage (fast restore + cross-tab for later starts) and re-target\n // the boot re-assert.\n writeFlavor(result.state.flavor)\n glass.applyRemote(result.state.glass)\n desired = result.state.flavor\n applyDesired()\n })\n\n return () => {\n cancelled = true\n offGlass()\n disposer()\n window.clearTimeout(timer)\n window.removeEventListener('storage', onStorage)\n cancelDurablePersist()\n }\n }, 'catppuccin: boot restore')\n\n const injected = (): CatppuccinRowInjected => ({\n themes: CATPPUCCIN_FLAVORS.map((flavor) => ({\n id: flavor.themeId,\n label: flavor.label,\n accent: flavor.accent,\n })),\n current: () => {\n const pref = theme.getTheme().preference\n return flavorFromThemeId(pref)\n },\n subscribe: (listener) => ctx.on('theme/change', listener),\n select: (choice: FlavorChoice) => {\n if (choice === 'off') {\n // Revert to the official default (system-following).\n theme.setTheme('system')\n writeFlavor('off')\n scheduleDurablePersist(buildLocalState)\n return\n }\n const flavor = flavorInfo(choice)\n if (!flavor) return\n theme.setTheme(flavor.themeId)\n writeFlavor(flavor.themeId)\n scheduleDurablePersist(buildLocalState)\n },\n })\n\n ctx.slots.inject('settings.general.item', () => ctx.slots.register({\n name: 'settings.general.item',\n id: 'catppuccin',\n order: 20,\n locale: NS,\n inject: injected,\n }, CatppuccinRow))\n\n const glassInjected = (): GlassRowInjected => ({\n getState: () => glass.getSnapshot(),\n subscribe: (listener) => glass.subscribe(listener),\n setEnabled: (enabled) => { glass.setEnabled(enabled) },\n setMode: (mode) => { glass.setMode(mode) },\n setBlur: (blur) => { glass.setBlur(blur) },\n setFrost: (frost) => { glass.setFrost(frost) },\n setBrightness: (brightness) => { glass.setBrightness(brightness) },\n resetDefaults: () => { glass.resetDefaults() },\n })\n\n ctx.slots.inject('settings.general.item', () => ctx.slots.register({\n name: 'settings.general.item',\n id: 'catppuccin-glass',\n order: 21,\n locale: NS,\n inject: glassInjected,\n }, GlassRow))\n\n // Update check: the Host owns the npm lookup (Node fetch, no CORS); the row\n // only fetches the same-origin route and renders the verdict. Upgrade stays\n // a terminal action — the row just surfaces the CLI command.\n const updateInjected = (): UpdateRowInjected => ({\n check: async () => {\n try {\n const response = await fetch(UPDATE_ROUTE_PATH, { headers: { accept: 'application/json' } })\n return await response.json() as UpdateCheckPayload\n } catch {\n return { ok: false, code: 'network', error: 'network' }\n }\n },\n })\n\n ctx.slots.inject('settings.general.item', () => ctx.slots.register({\n name: 'settings.general.item',\n id: 'catppuccin-update',\n order: 22,\n locale: NS,\n inject: updateInjected,\n }, UpdateRow))\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["useSyncExternalStore","css","useSyncExternalStore","useState"],"sources":["../src/client/CatppuccinRow.tsx","../src/client/locales.ts","../src/client/palettes.ts","../src/client/shiki-tokens.ts","../src/client/glass/glass-seams.ts","../src/client/glass/glass-layer.ts","../src/client/glass/glass-row.tsx","../src/client/UpdateRow.tsx","../src/update-check.ts","../src/state.ts","../src/client/state-sync.ts","../src/client/index.ts"],"sourcesContent":["/**\n * Catppuccin settings row — one General-section preference row listing the\n * four flavour themes plus a \"follow system\" (off) choice. Selecting a\n * flavour calls the injected `select`, which switches the official\n * ThemeRuntime and persists the choice. The row subscribes to `theme/change`\n * so the highlighted flavour tracks the live preference.\n */\nimport { useSyncExternalStore } from 'react'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { FlavorChoice } from './index.ts'\n\n/** One flavour button shown by the row. */\nexport interface CatppuccinFlavorButton {\n /** Theme id registered into ThemeRuntime. */\n id: string\n /** Display label. */\n label: string\n /** Accent colour for the swatch. */\n accent: string\n}\n\n/** Injected business face of the row (assembled in apply). */\nexport interface CatppuccinRowInjected {\n /** The four flavours, in display order. */\n themes: readonly CatppuccinFlavorButton[]\n /** Current choice (`off` when a Catppuccin theme is not active). */\n current: () => FlavorChoice\n /** Subscribe to theme preference changes. Returns the disposer. */\n subscribe: (listener: () => void) => () => void\n /** Switch the theme and persist the choice (`off` reverts to system). */\n select: (choice: FlavorChoice) => void | Promise<void>\n}\n\n/** Full component props: runtime share + locale seat + injected face. */\nexport type CatppuccinRowProps = PropsRuntime<'settings.general.item'> & PropsLocale<'catppuccin'> & CatppuccinRowInjected\n\n/**\n * Render the Catppuccin row: title, one swatch button per flavour, and a\n * follow-system button. The active flavour is highlighted; clicking a flavour\n * applies it immediately (live, no restart) and persists the choice.\n * @param props - composed slot props.\n * @returns the row element tree.\n */\nexport function CatppuccinRow({ t, themes, current, subscribe, select }: CatppuccinRowProps): React.JSX.Element {\n const choice = useSyncExternalStore(subscribe, current)\n return (\n <div style={{ borderBottom: '1px solid var(--dsw-alias-border-l2)', display: 'flex', flexDirection: 'column', gap: '10px', padding: '16px 0' }}>\n <div style={{ color: 'var(--dsw-alias-label-primary)', fontSize: 14, lineHeight: '22px' }}>\n {t('row.title')}\n </div>\n <div style={{ color: 'var(--dsw-alias-label-tertiary)', fontSize: 12, lineHeight: '18px' }}>\n {t('row.description')}\n </div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '8px' }}>\n {themes.map((flavor) => {\n const selected = choice === flavor.id\n return (\n <button\n key={flavor.id}\n type=\"button\"\n aria-pressed={selected}\n onClick={() => void select(flavor.id)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n padding: '6px 12px',\n borderRadius: 8,\n border: `1px solid ${selected ? 'var(--dsw-alias-border-l3)' : 'var(--dsw-alias-border-l1)'}`,\n background: selected ? 'var(--dsw-alias-interactive-bg-active)' : 'transparent',\n color: 'var(--dsw-alias-label-primary)',\n cursor: 'pointer',\n font: 'inherit',\n }}\n >\n <span aria-hidden=\"true\" style={{ width: 12, height: 12, borderRadius: 3, background: flavor.accent, flex: 'none' }} />\n {flavor.label}\n </button>\n )\n })}\n <button\n key=\"off\"\n type=\"button\"\n aria-pressed={choice === 'off'}\n onClick={() => void select('off')}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n padding: '6px 12px',\n borderRadius: 8,\n border: `1px solid ${choice === 'off' ? 'var(--dsw-alias-border-l3)' : 'var(--dsw-alias-border-l1)'}`,\n background: choice === 'off' ? 'var(--dsw-alias-interactive-bg-active)' : 'transparent',\n color: 'var(--dsw-alias-label-primary)',\n cursor: 'pointer',\n font: 'inherit',\n }}\n >\n {t('row.off')}\n </button>\n </div>\n </div>\n )\n}\n","/**\n * Catppuccin settings-row copy. The zh dictionary is the key-set source of\n * truth; the en dictionary mirrors it (checked complete against the zh keys).\n */\n\n/** Simplified Chinese dictionary. */\nexport const zh = {\n 'row.title': 'Catppuccin 主题',\n 'row.description': 'Latte / Frappé / Macchiato / Mocha 四款配色,一键切换。',\n 'row.off': '跟随系统',\n 'flavor.latte': 'Latte',\n 'flavor.frappe': 'Frappé',\n 'flavor.macchiato': 'Macchiato',\n 'flavor.mocha': 'Mocha',\n 'glass.title': '玻璃质感',\n 'glass.description': '顶栏、侧边栏、输入框、统计行、轨迹视图的磨砂玻璃效果,一键开关。',\n 'glass.enable': '总开关',\n 'glass.on': '开启',\n 'glass.off': '关闭',\n 'glass.mode': '模式',\n 'glass.modeMica': '云母效果',\n 'glass.modeCompat': '兼容模式',\n 'glass.modeHint': '云母效果把界面改成悬浮磨砂卡片;兼容模式保持原版排版,只换玻璃材质',\n 'glass.blur': '玻璃模糊度',\n 'glass.frost': '磨砂度',\n 'glass.brightness': '背景亮度',\n 'glass.brightnessHintDark': '深色模式:0 压暗至纯黑,50 原样',\n 'glass.brightnessHintLight': '浅色模式:50 原样,100 提亮至纯白',\n 'glass.reset': '还原默认值',\n 'update.title': '检查 Catppuccin 插件更新',\n 'update.description': '检测本插件(dsh-catppuccin)在 npm 上的最新版本,判断当前安装是否需要升级。',\n 'update.check': '检查更新',\n 'update.checking': '检查中…',\n 'update.current': '当前版本',\n 'update.upToDate': '已是最新版本 🎉',\n 'update.available': '发现新版本:',\n 'update.commandHint': '在终端运行以下命令升级(把 web 换成你的 profile 名):',\n 'update.commandHintDetected': '已自动探测到 profile「{profile}」,在终端运行以下命令升级:',\n 'update.commandHintDesktop': '已检测到你在使用 DSH Desktop,目标 profile「{profile}」,请在 DSH 终端中运行以下命令升级:',\n 'update.restartHint': '升级完成后重启 dsh web 生效。',\n 'update.restartHintDesktop': '升级完成后重启 DSH Desktop 生效。',\n 'update.copy': '复制命令',\n 'update.copied': '已复制 ✓',\n 'update.failed': '检查失败,请稍后重试。',\n 'update.retry': '重试',\n 'update.checkedAt': '检查时间',\n 'update.localInstall': '检测到本地链接/源码安装,npm 升级命令可能不适用——请用 git pull 或重新构建。',\n 'update.err.registry': '无法连接 npm registry,请检查网络后重试。',\n 'update.err.http': 'npm registry 返回异常状态码,请稍后重试。',\n 'update.err.noTags': 'npm registry 未返回可用的版本标签。',\n 'update.err.invalid': 'npm registry 返回了无法解析的数据。',\n 'update.err.network': '无法连接插件宿主,请刷新页面后重试。',\n} as const\n\n/** English dictionary, checked complete against the zh key set. */\nexport const en: Record<keyof typeof zh, string> = {\n 'row.title': 'Catppuccin theme',\n 'row.description': 'Latte / Frappé / Macchiato / Mocha, one click away.',\n 'row.off': 'Follow system',\n 'flavor.latte': 'Latte',\n 'flavor.frappe': 'Frappé',\n 'flavor.macchiato': 'Macchiato',\n 'flavor.mocha': 'Mocha',\n 'glass.title': 'Glassmorphism',\n 'glass.description': 'Frosted glass for the top bar, sidebar, composer, stats line and trajectory view — one click on/off.',\n 'glass.enable': 'Master switch',\n 'glass.on': 'On',\n 'glass.off': 'Off',\n 'glass.mode': 'Mode',\n 'glass.modeMica': 'Mica',\n 'glass.modeCompat': 'Compatibility',\n 'glass.modeHint': 'Mica restyles the UI into floating frosted cards; Compatibility keeps the stock layout and only swaps the material to glass',\n 'glass.blur': 'Glass blur',\n 'glass.frost': 'Frost',\n 'glass.brightness': 'Backdrop brightness',\n 'glass.brightnessHintDark': 'Dark mode: 0 fades to pure black, 50 unchanged',\n 'glass.brightnessHintLight': 'Light mode: 50 unchanged, 100 brightens to pure white',\n 'glass.reset': 'Reset to defaults',\n 'update.title': 'Check for Catppuccin plugin updates',\n 'update.description': 'Checks npm for the latest dsh-catppuccin release and whether this install is current.',\n 'update.check': 'Check for updates',\n 'update.checking': 'Checking…',\n 'update.current': 'Current version',\n 'update.upToDate': 'Up to date 🎉',\n 'update.available': 'New version available:',\n 'update.commandHint': 'Run this in a terminal to upgrade (replace web with your profile name):',\n 'update.commandHintDetected': 'Profile \"{profile}\" detected — run this in a terminal to upgrade:',\n 'update.commandHintDesktop': 'DSH Desktop detected — target profile \"{profile}\", run this in the DSH terminal to upgrade:',\n 'update.restartHint': 'Restart dsh web after the upgrade.',\n 'update.restartHintDesktop': 'Restart DSH Desktop after the upgrade.',\n 'update.copy': 'Copy command',\n 'update.copied': 'Copied ✓',\n 'update.failed': 'Check failed — try again later.',\n 'update.retry': 'Retry',\n 'update.checkedAt': 'Checked at',\n 'update.localInstall': 'This install is a local link/source checkout — the npm upgrade command may not apply; use git pull or rebuild instead.',\n 'update.err.registry': 'Could not reach the npm registry — check your network and retry.',\n 'update.err.http': 'The npm registry returned an unexpected status code.',\n 'update.err.noTags': 'The npm registry returned no usable version tags.',\n 'update.err.invalid': 'The npm registry returned unparseable data.',\n 'update.err.network': 'Could not reach the plugin host — refresh the page and retry.',\n}\n\n/** Key union of the Catppuccin dictionaries. */\nexport type CatppuccinKey = keyof typeof zh\n","/**\n * AUTO-GENERATED by scripts/generate-palettes.mjs — do not edit by hand.\n * Catppuccin token tables for the DeepSeek Harness web GUI.\n * Source palette: https://github.com/catppuccin/catppuccin (palette.json v1.8.0).\n * Each flavour carries a flat dictionary of every --dsw-static-*,\n * --dsw-alias-* and --dsw-specific-* token the official theme stylesheet\n * declares. Alias/specific entries keep their var() references so the static\n * overrides below flow through automatically; literal (non-var) entries are\n * remapped to Catppuccin colours.\n */\nexport type CatppuccinFlavorId = 'latte' | 'frappe' | 'macchiato' | 'mocha'\nexport interface CatppuccinFlavorInfo {\n /** Theme id registered into ThemeRuntime. */\n themeId: string\n /** Base color scheme this flavour builds on. */\n colorScheme: 'light' | 'dark'\n /** Display label. */\n label: string\n /** Accent colour for the settings row swatch. */\n accent: string\n /** Token dictionary (--dsw-* names). */\n tokens: Record<string, string>\n}\n\nexport const CATPPUCCIN_LATTE: CatppuccinFlavorInfo = {\n themeId: 'catppuccin-latte',\n colorScheme: 'light',\n label: 'Latte',\n accent: '#1e66f5',\n tokens: {\n \"--dsw-static-amber-100\": \"color-mix(in srgb, #fe640b 20%, #eff1f5)\",\n \"--dsw-static-amber-400\": \"color-mix(in srgb, #fe640b 70%, #eff1f5)\",\n \"--dsw-static-amber-500\": \"#fe640b\",\n \"--dsw-static-amber-600\": \"#fe640b\",\n \"--dsw-static-amber-900\": \"color-mix(in srgb, #fe640b 32%, #eff1f5)\",\n \"--dsw-static-blue-100\": \"color-mix(in srgb, #1e66f5 22%, #eff1f5)\",\n \"--dsw-static-blue-300\": \"color-mix(in srgb, #1e66f5 48%, #eff1f5)\",\n \"--dsw-static-blue-400\": \"color-mix(in srgb, #1e66f5 65%, #eff1f5)\",\n \"--dsw-static-blue-450\": \"color-mix(in srgb, #1e66f5 82%, #eff1f5)\",\n \"--dsw-static-blue-500\": \"#1e66f5\",\n \"--dsw-static-blue-50\": \"color-mix(in srgb, #1e66f5 8%, #eff1f5)\",\n \"--dsw-static-blue-50p\": \"color-mix(in srgb, #1e66f5 12%, #eff1f5)\",\n \"--dsw-static-blue-600\": \"color-mix(in srgb, #1e66f5 82%, #eff1f5)\",\n \"--dsw-static-blue-75\": \"color-mix(in srgb, #1e66f5 16%, #eff1f5)\",\n \"--dsw-static-blue-800\": \"color-mix(in srgb, #1e66f5 50%, #eff1f5)\",\n \"--dsw-static-blue-900\": \"color-mix(in srgb, #1e66f5 38%, #eff1f5)\",\n \"--dsw-static-blue-950\": \"color-mix(in srgb, #1e66f5 26%, #eff1f5)\",\n \"--dsw-static-deepseek-100\": \"color-mix(in srgb, #1e66f5 22%, #eff1f5)\",\n \"--dsw-static-deepseek-200\": \"color-mix(in srgb, #1e66f5 34%, #eff1f5)\",\n \"--dsw-static-deepseek-300\": \"color-mix(in srgb, #1e66f5 48%, #eff1f5)\",\n \"--dsw-static-deepseek-400\": \"color-mix(in srgb, #1e66f5 65%, #eff1f5)\",\n \"--dsw-static-deepseek-450\": \"color-mix(in srgb, #1e66f5 82%, #eff1f5)\",\n \"--dsw-static-deepseek-500\": \"#1e66f5\",\n \"--dsw-static-deepseek-50\": \"color-mix(in srgb, #1e66f5 8%, #eff1f5)\",\n \"--dsw-static-deepseek-600\": \"color-mix(in srgb, #1e66f5 82%, #eff1f5)\",\n \"--dsw-static-deepseek-700-delete\": \"color-mix(in srgb, #1e66f5 66%, #eff1f5)\",\n \"--dsw-static-deepseek-800\": \"color-mix(in srgb, #1e66f5 50%, #eff1f5)\",\n \"--dsw-static-deepseek-900\": \"color-mix(in srgb, #1e66f5 38%, #eff1f5)\",\n \"--dsw-static-green-100\": \"color-mix(in srgb, #40a02b 18%, #eff1f5)\",\n \"--dsw-static-green-400\": \"color-mix(in srgb, #40a02b 80%, #eff1f5)\",\n \"--dsw-static-green-500\": \"#40a02b\",\n \"--dsw-static-green-900\": \"color-mix(in srgb, #40a02b 30%, #eff1f5)\",\n \"--dsw-static-neutral-00\": \"#eff1f5\",\n \"--dsw-static-neutral-1000\": \"#4c4f69\",\n \"--dsw-static-neutral-100\": \"#bcc0cc\",\n \"--dsw-static-neutral-150\": \"#acb0be\",\n \"--dsw-static-neutral-200\": \"#9ca0b0\",\n \"--dsw-static-neutral-250\": \"#9ca0b0\",\n \"--dsw-static-neutral-300\": \"#8c8fa1\",\n \"--dsw-static-neutral-400\": \"#7c7f93\",\n \"--dsw-static-neutral-500\": \"#6c6f85\",\n \"--dsw-static-neutral-50\": \"#e6e9ef\",\n \"--dsw-static-neutral-550\": \"#6c6f85\",\n \"--dsw-static-neutral-600\": \"#5c5f77\",\n \"--dsw-static-neutral-700\": \"#5c5f77\",\n \"--dsw-static-neutral-800\": \"#4c4f69\",\n \"--dsw-static-neutral-850\": \"#4c4f69\",\n \"--dsw-static-neutral-900\": \"#4c4f69\",\n \"--dsw-static-neutral-bluish-00\": \"#eff1f5\",\n \"--dsw-static-neutral-bluish-1000\": \"#4c4f69\",\n \"--dsw-static-neutral-bluish-100\": \"#bcc0cc\",\n \"--dsw-static-neutral-bluish-150\": \"#acb0be\",\n \"--dsw-static-neutral-bluish-200\": \"#9ca0b0\",\n \"--dsw-static-neutral-bluish-300\": \"#8c8fa1\",\n \"--dsw-static-neutral-bluish-400\": \"#7c7f93\",\n \"--dsw-static-neutral-bluish-500\": \"#6c6f85\",\n \"--dsw-static-neutral-bluish-50\": \"#e6e9ef\",\n \"--dsw-static-neutral-bluish-600\": \"#5c5f77\",\n \"--dsw-static-neutral-bluish-60\": \"#e6e9ef\",\n \"--dsw-static-neutral-bluish-700\": \"#5c5f77\",\n \"--dsw-static-neutral-bluish-750\": \"#4c4f69\",\n \"--dsw-static-neutral-bluish-75\": \"#ccd0da\",\n \"--dsw-static-neutral-bluish-800\": \"#4c4f69\",\n \"--dsw-static-neutral-bluish-850\": \"#4c4f69\",\n \"--dsw-static-neutral-bluish-875\": \"#4c4f69\",\n \"--dsw-static-neutral-bluish-900\": \"#4c4f69\",\n \"--dsw-static-neutral-bluish-950\": \"#4c4f69\",\n \"--dsw-static-red-100\": \"color-mix(in srgb, #d20f39 20%, #eff1f5)\",\n \"--dsw-static-red-400\": \"color-mix(in srgb, #d20f39 70%, #eff1f5)\",\n \"--dsw-static-red-500\": \"#d20f39\",\n \"--dsw-static-red-50\": \"color-mix(in srgb, #d20f39 10%, #eff1f5)\",\n \"--dsw-static-red-600\": \"#d20f39\",\n \"--dsw-static-red-900\": \"color-mix(in srgb, #d20f39 34%, #eff1f5)\",\n \"--dsw-alias-bg-base\": \"var(--dsw-static-neutral-bluish-00)\",\n \"--dsw-alias-bg-layer-1\": \"var(--dsw-static-neutral-bluish-00)\",\n \"--dsw-alias-bg-layer-2\": \"var(--dsw-static-neutral-bluish-00)\",\n \"--dsw-alias-bg-layer-3\": \"var(--dsw-static-neutral-bluish-00)\",\n \"--dsw-alias-bg-mask-1\": \"rgba(0, 0, 0, 0.24)\",\n \"--dsw-alias-bg-mask-2\": \"rgba(0, 0, 0, 0.12)\",\n \"--dsw-alias-bg-mask-3\": \"rgba(0, 0, 0, 0.48)\",\n \"--dsw-alias-bg-mask-photo\": \"rgba(0, 0, 0, 0.88)\",\n \"--dsw-alias-bg-mask-drop\": \"rgba(255, 255, 255, 0.7)\",\n \"--dsw-alias-bg-module-platform\": \"var(--dsw-static-neutral-bluish-60)\",\n \"--dsw-alias-bg-multi-select\": \"var(--dsw-static-neutral-bluish-60)\",\n \"--dsw-alias-bg-overlay\": \"var(--dsw-static-neutral-bluish-150)\",\n \"--dsw-alias-bg-skeleton\": \"rgba(0, 0, 0, 0.04)\",\n \"--dsw-alias-border-inverted2\": \"rgba(0, 0, 0, 0)\",\n \"--dsw-alias-border-inverted\": \"rgba(0, 0, 0, 0)\",\n \"--dsw-alias-border-l1\": \"rgba(0, 0, 0, 0.04)\",\n \"--dsw-alias-border-l2-darkmode-thin\": \"rgba(0, 0, 0, 0.1)\",\n \"--dsw-alias-border-l2\": \"rgba(0, 0, 0, 0.1)\",\n \"--dsw-alias-border-l3\": \"rgba(0, 0, 0, 0.12)\",\n \"--dsw-alias-border-l4\": \"rgba(0, 0, 0, 0.16)\",\n \"--dsw-alias-brand-primary-invert\": \"var(--dsw-static-neutral-bluish-1000)\",\n \"--dsw-alias-brand-primary-new-colorprimary-new-color\": \"#1e66f5\",\n \"--dsw-alias-brand-primary\": \"var(--dsw-static-neutral-bluish-1000)\",\n \"--dsw-alias-brand-text\": \"var(--dsw-static-neutral-bluish-1000)\",\n \"--dsw-alias-button-contrast-fill\": \"var(--dsw-static-neutral-bluish-700)\",\n \"--dsw-alias-button-elevated-fill\": \"var(--dsw-static-neutral-bluish-00)\",\n \"--dsw-alias-button-floating-fill\": \"var(--dsw-static-neutral-bluish-00)\",\n \"--dsw-alias-button-floating-hover\": \"var(--dsw-static-neutral-bluish-75)\",\n \"--dsw-alias-button-ghost-active-border\": \"var(--dsw-static-neutral-bluish-500)\",\n \"--dsw-alias-button-ghost-active-fill\": \"var(--dsw-static-neutral-bluish-100)\",\n \"--dsw-alias-button-ghost-active-hover\": \"var(--dsw-static-neutral-bluish-150)\",\n \"--dsw-alias-button-info-fill\": \"var(--dsw-static-deepseek-500)\",\n \"--dsw-alias-button-info-hover\": \"var(--dsw-static-deepseek-400)\",\n \"--dsw-alias-button-primary-dimmed\": \"var(--dsw-static-neutral-bluish-100)\",\n \"--dsw-alias-button-primary-fill\": \"var(--dsw-alias-brand-primary)\",\n \"--dsw-alias-button-primary-hover\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-button-tool-bar-fill-invisible\": \"rgba(31, 31, 31, 0.36)\",\n \"--dsw-alias-button-tool-bar-fill\": \"rgba(84, 85, 87, 0.5)\",\n \"--dsw-alias-button-tool-bar-hover\": \"rgba(84, 85, 87, 0.6)\",\n \"--dsw-alias-interactive-bg-active\": \"rgba(38, 49, 72, 0.1)\",\n \"--dsw-alias-interactive-bg-hover-accent\": \"rgba(38, 49, 72, 0.14)\",\n \"--dsw-alias-interactive-bg-hover-danger\": \"rgba(236, 19, 19, 0.05)\",\n \"--dsw-alias-interactive-bg-hover-solid\": \"var(--dsw-static-neutral-bluish-75)\",\n \"--dsw-alias-interactive-bg-hover\": \"rgba(38, 49, 72, 0.06)\",\n \"--dsw-alias-label-caption\": \"var(--dsw-static-neutral-bluish-400)\",\n \"--dsw-alias-label-dimmed\": \"var(--dsw-static-neutral-bluish-200)\",\n \"--dsw-alias-label-primary-bluish\": \"var(--dsw-static-blue-900)\",\n \"--dsw-alias-label-primary-dimmed\": \"var(--dsw-static-neutral-bluish-950)\",\n \"--dsw-alias-label-primary-foreground\": \"var(--dsw-static-neutral-bluish-00)\",\n \"--dsw-alias-label-primary-inverted\": \"var(--dsw-static-neutral-bluish-00)\",\n \"--dsw-alias-label-primary\": \"var(--dsw-static-neutral-bluish-1000)\",\n \"--dsw-alias-label-secondary\": \"var(--dsw-static-neutral-bluish-700)\",\n \"--dsw-alias-label-tertiary\": \"var(--dsw-static-neutral-bluish-600)\",\n \"--dsw-alias-markdown-citation\": \"var(--dsw-static-neutral-bluish-100)\",\n \"--dsw-alias-markdown-code-block-banner\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-markdown-code-block\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-markdown-code-segment-selected\": \"var(--dsw-static-neutral-bluish-00)\",\n \"--dsw-alias-markdown-code-segment-unselected\": \"var(--dsw-static-neutral-bluish-75)\",\n \"--dsw-alias-markdown-inline-code\": \"var(--dsw-static-neutral-bluish-100)\",\n \"--dsw-alias-markdown-placeholder\": \"var(--dsw-static-neutral-bluish-60)\",\n \"--dsw-alias-markdown-tag\": \"var(--dsw-static-neutral-bluish-75)\",\n \"--dsw-alias-scrollbar-bg-l1\": \"var(--dsw-static-neutral-200)\",\n \"--dsw-alias-scrollbar-bg-l2\": \"var(--dsw-static-neutral-200)\",\n \"--dsw-alias-scrollbar-hover-l1\": \"var(--dsw-static-neutral-300)\",\n \"--dsw-alias-scrollbar-hover-l2\": \"var(--dsw-static-neutral-300)\",\n \"--dsw-alias-state-business-primary\": \"var(--dsw-static-deepseek-500)\",\n \"--dsw-alias-state-business-tertiary\": \"var(--dsw-static-deepseek-100)\",\n \"--dsw-alias-state-error-primary\": \"var(--dsw-static-red-600)\",\n \"--dsw-alias-state-error-secondary\": \"var(--dsw-static-red-400)\",\n \"--dsw-alias-state-success-primary\": \"var(--dsw-static-green-500)\",\n \"--dsw-alias-state-success-secondary\": \"var(--dsw-static-green-400)\",\n \"--dsw-alias-state-success-tertiary\": \"var(--dsw-static-green-100)\",\n \"--dsw-alias-state-warn-label\": \"var(--dsw-static-amber-600)\",\n \"--dsw-alias-state-warn-primary\": \"var(--dsw-static-amber-500)\",\n \"--dsw-alias-state-warn-secondary\": \"var(--dsw-static-amber-400)\",\n \"--dsw-alias-state-warn-tertiary\": \"var(--dsw-static-amber-100)\",\n \"--dsw-alias-toast-bg\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-tooltip-bg\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-specific-bubble-highlight\": \"var(--dsw-static-deepseek-200)\",\n \"--dsw-specific-bubble\": \"var(--dsw-static-deepseek-50)\",\n \"--dsw-specific-input-major\": \"var(--dsw-static-neutral-bluish-00)\",\n \"--dsw-specific-login-input\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-specific-menu\": \"var(--dsw-alias-bg-layer-3)\",\n \"--dsw-specific-selector\": \"var(--dsw-static-neutral-bluish-60)\",\n \"--dsw-specific-sidebar-fill\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-specific-sidebar-nav-item-active-accent\": \"var(--dsw-static-deepseek-100)\",\n \"--dsw-specific-sidebar-nav-item-active\": \"var(--dsw-static-neutral-bluish-100)\",\n \"--dsw-specific-sidebar-nav-item-hover\": \"var(--dsw-static-neutral-bluish-75)\",\n \"--dsw-specific-tip\": \"var(--dsw-static-neutral-bluish-60)\",\n },\n}\n\nexport const CATPPUCCIN_FRAPPE: CatppuccinFlavorInfo = {\n themeId: 'catppuccin-frappe',\n colorScheme: 'dark',\n label: 'Frappé',\n accent: '#8caaee',\n tokens: {\n \"--dsw-static-amber-100\": \"color-mix(in srgb, #ef9f76 20%, #303446)\",\n \"--dsw-static-amber-400\": \"color-mix(in srgb, #ef9f76 70%, #303446)\",\n \"--dsw-static-amber-500\": \"#ef9f76\",\n \"--dsw-static-amber-600\": \"#ef9f76\",\n \"--dsw-static-amber-900\": \"color-mix(in srgb, #ef9f76 32%, #303446)\",\n \"--dsw-static-blue-100\": \"color-mix(in srgb, #8caaee 24%, #303446)\",\n \"--dsw-static-blue-300\": \"color-mix(in srgb, #8caaee 50%, #303446)\",\n \"--dsw-static-blue-400\": \"color-mix(in srgb, #8caaee 66%, #303446)\",\n \"--dsw-static-blue-450\": \"color-mix(in srgb, #8caaee 84%, #303446)\",\n \"--dsw-static-blue-500\": \"#8caaee\",\n \"--dsw-static-blue-50\": \"color-mix(in srgb, #8caaee 10%, #303446)\",\n \"--dsw-static-blue-50p\": \"color-mix(in srgb, #8caaee 14%, #303446)\",\n \"--dsw-static-blue-600\": \"color-mix(in srgb, #8caaee 84%, #303446)\",\n \"--dsw-static-blue-75\": \"color-mix(in srgb, #8caaee 18%, #303446)\",\n \"--dsw-static-blue-800\": \"color-mix(in srgb, #8caaee 52%, #303446)\",\n \"--dsw-static-blue-900\": \"color-mix(in srgb, #8caaee 40%, #303446)\",\n \"--dsw-static-blue-950\": \"color-mix(in srgb, #8caaee 28%, #303446)\",\n \"--dsw-static-deepseek-100\": \"color-mix(in srgb, #8caaee 24%, #303446)\",\n \"--dsw-static-deepseek-200\": \"color-mix(in srgb, #8caaee 36%, #303446)\",\n \"--dsw-static-deepseek-300\": \"color-mix(in srgb, #8caaee 50%, #303446)\",\n \"--dsw-static-deepseek-400\": \"color-mix(in srgb, #8caaee 66%, #303446)\",\n \"--dsw-static-deepseek-450\": \"color-mix(in srgb, #8caaee 84%, #303446)\",\n \"--dsw-static-deepseek-500\": \"#8caaee\",\n \"--dsw-static-deepseek-50\": \"color-mix(in srgb, #8caaee 10%, #303446)\",\n \"--dsw-static-deepseek-600\": \"color-mix(in srgb, #8caaee 84%, #303446)\",\n \"--dsw-static-deepseek-700-delete\": \"color-mix(in srgb, #8caaee 68%, #303446)\",\n \"--dsw-static-deepseek-800\": \"color-mix(in srgb, #8caaee 52%, #303446)\",\n \"--dsw-static-deepseek-900\": \"color-mix(in srgb, #8caaee 40%, #303446)\",\n \"--dsw-static-green-100\": \"color-mix(in srgb, #a6d189 18%, #303446)\",\n \"--dsw-static-green-400\": \"color-mix(in srgb, #a6d189 80%, #303446)\",\n \"--dsw-static-green-500\": \"#a6d189\",\n \"--dsw-static-green-900\": \"color-mix(in srgb, #a6d189 30%, #303446)\",\n \"--dsw-static-neutral-00\": \"#c6d0f5\",\n \"--dsw-static-neutral-1000\": \"#232634\",\n \"--dsw-static-neutral-100\": \"#a5adce\",\n \"--dsw-static-neutral-150\": \"#a5adce\",\n \"--dsw-static-neutral-200\": \"#949cbb\",\n \"--dsw-static-neutral-250\": \"#949cbb\",\n \"--dsw-static-neutral-300\": \"#838ba7\",\n \"--dsw-static-neutral-400\": \"#737994\",\n \"--dsw-static-neutral-500\": \"#626880\",\n \"--dsw-static-neutral-50\": \"#c6d0f5\",\n \"--dsw-static-neutral-550\": \"#51576d\",\n \"--dsw-static-neutral-600\": \"#51576d\",\n \"--dsw-static-neutral-700\": \"#414559\",\n \"--dsw-static-neutral-800\": \"#414559\",\n \"--dsw-static-neutral-850\": \"#303446\",\n \"--dsw-static-neutral-900\": \"#292c3c\",\n \"--dsw-static-neutral-bluish-00\": \"#c6d0f5\",\n \"--dsw-static-neutral-bluish-1000\": \"#232634\",\n \"--dsw-static-neutral-bluish-100\": \"#a5adce\",\n \"--dsw-static-neutral-bluish-150\": \"#a5adce\",\n \"--dsw-static-neutral-bluish-200\": \"#949cbb\",\n \"--dsw-static-neutral-bluish-300\": \"#838ba7\",\n \"--dsw-static-neutral-bluish-400\": \"#737994\",\n \"--dsw-static-neutral-bluish-500\": \"#626880\",\n \"--dsw-static-neutral-bluish-50\": \"#c6d0f5\",\n \"--dsw-static-neutral-bluish-600\": \"#51576d\",\n \"--dsw-static-neutral-bluish-60\": \"#b5bfe2\",\n \"--dsw-static-neutral-bluish-700\": \"#414559\",\n \"--dsw-static-neutral-bluish-750\": \"#414559\",\n \"--dsw-static-neutral-bluish-75\": \"#b5bfe2\",\n \"--dsw-static-neutral-bluish-800\": \"#414559\",\n \"--dsw-static-neutral-bluish-850\": \"#303446\",\n \"--dsw-static-neutral-bluish-875\": \"#292c3c\",\n \"--dsw-static-neutral-bluish-900\": \"#292c3c\",\n \"--dsw-static-neutral-bluish-950\": \"#232634\",\n \"--dsw-static-red-100\": \"color-mix(in srgb, #e78284 20%, #303446)\",\n \"--dsw-static-red-400\": \"color-mix(in srgb, #e78284 70%, #303446)\",\n \"--dsw-static-red-500\": \"#e78284\",\n \"--dsw-static-red-50\": \"color-mix(in srgb, #e78284 10%, #303446)\",\n \"--dsw-static-red-600\": \"#e78284\",\n \"--dsw-static-red-900\": \"color-mix(in srgb, #e78284 34%, #303446)\",\n \"--dsw-alias-bg-base\": \"var(--dsw-static-neutral-bluish-950)\",\n \"--dsw-alias-bg-layer-1\": \"var(--dsw-static-neutral-bluish-875)\",\n \"--dsw-alias-bg-layer-2\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-bg-layer-3\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-bg-mask-1\": \"rgba(0, 0, 0, 0.5)\",\n \"--dsw-alias-bg-mask-2\": \"rgba(0, 0, 0, 0.2)\",\n \"--dsw-alias-bg-mask-3\": \"rgba(0, 0, 0, 0.48)\",\n \"--dsw-alias-bg-mask-photo\": \"rgba(0, 0, 0, 0.88)\",\n \"--dsw-alias-bg-mask-drop\": \"rgba(39, 39, 48, 0.7)\",\n \"--dsw-alias-bg-module-platform\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-bg-multi-select\": \"var(--dsw-static-neutral-850)\",\n \"--dsw-alias-bg-overlay\": \"var(--dsw-static-neutral-bluish-700)\",\n \"--dsw-alias-bg-skeleton\": \"rgba(255, 255, 255, 0.08)\",\n \"--dsw-alias-border-inverted2\": \"rgba(255, 255, 255, 0.08)\",\n \"--dsw-alias-border-inverted\": \"rgba(255, 255, 255, 0.06)\",\n \"--dsw-alias-border-l1\": \"rgba(255, 255, 255, 0.06)\",\n \"--dsw-alias-border-l2-darkmode-thin\": \"rgba(255, 255, 255, 0.06)\",\n \"--dsw-alias-border-l2\": \"rgba(255, 255, 255, 0.12)\",\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-brand-primary-invert\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-brand-primary-new-colorprimary-new-color\": \"#8caaee\",\n \"--dsw-alias-brand-primary\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-brand-text\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-button-contrast-fill\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-button-elevated-fill\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-button-floating-fill\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-button-floating-hover\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-button-ghost-active-border\": \"var(--dsw-static-neutral-bluish-600)\",\n \"--dsw-alias-button-ghost-active-fill\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-button-ghost-active-hover\": \"var(--dsw-static-neutral-bluish-700)\",\n \"--dsw-alias-button-info-fill\": \"var(--dsw-static-deepseek-400)\",\n \"--dsw-alias-button-info-hover\": \"var(--dsw-static-deepseek-500)\",\n \"--dsw-alias-button-primary-dimmed\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-button-primary-fill\": \"var(--dsw-alias-brand-primary)\",\n \"--dsw-alias-button-primary-hover\": \"var(--dsw-static-neutral-bluish-100)\",\n \"--dsw-alias-button-tool-bar-fill-invisible\": \"rgba(31, 31, 31, 0.36)\",\n \"--dsw-alias-button-tool-bar-fill\": \"rgba(84, 85, 87, 0.5)\",\n \"--dsw-alias-button-tool-bar-hover\": \"rgba(84, 85, 87, 0.6)\",\n \"--dsw-alias-interactive-bg-active\": \"rgba(255, 255, 255, 0.14)\",\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-hover-solid\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-interactive-bg-hover\": \"rgba(255, 255, 255, 0.08)\",\n \"--dsw-alias-label-caption\": \"var(--dsw-static-neutral-bluish-600)\",\n \"--dsw-alias-label-dimmed\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-label-primary-bluish\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-label-primary-dimmed\": \"var(--dsw-static-neutral-bluish-100)\",\n \"--dsw-alias-label-primary-foreground\": \"var(--dsw-static-neutral-bluish-1000)\",\n \"--dsw-alias-label-primary-inverted\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-label-primary\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-label-secondary\": \"var(--dsw-static-neutral-bluish-300)\",\n \"--dsw-alias-label-tertiary\": \"var(--dsw-static-neutral-bluish-400)\",\n \"--dsw-alias-markdown-citation\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-markdown-code-block-banner\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-markdown-code-block\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-alias-markdown-code-segment-selected\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-markdown-code-segment-unselected\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-alias-markdown-inline-code\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-markdown-placeholder\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-markdown-tag\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-scrollbar-bg-l1\": \"var(--dsw-static-neutral-700)\",\n \"--dsw-alias-scrollbar-bg-l2\": \"var(--dsw-static-neutral-600)\",\n \"--dsw-alias-scrollbar-hover-l1\": \"var(--dsw-static-neutral-600)\",\n \"--dsw-alias-scrollbar-hover-l2\": \"var(--dsw-static-neutral-550)\",\n \"--dsw-alias-state-business-primary\": \"var(--dsw-static-deepseek-400)\",\n \"--dsw-alias-state-business-tertiary\": \"var(--dsw-static-deepseek-800)\",\n \"--dsw-alias-state-error-primary\": \"var(--dsw-static-red-400)\",\n \"--dsw-alias-state-error-secondary\": \"var(--dsw-static-red-400)\",\n \"--dsw-alias-state-success-primary\": \"var(--dsw-static-green-500)\",\n \"--dsw-alias-state-success-secondary\": \"var(--dsw-static-green-400)\",\n \"--dsw-alias-state-success-tertiary\": \"var(--dsw-static-green-900)\",\n \"--dsw-alias-state-warn-label\": \"var(--dsw-static-amber-600)\",\n \"--dsw-alias-state-warn-primary\": \"var(--dsw-static-amber-500)\",\n \"--dsw-alias-state-warn-secondary\": \"var(--dsw-static-amber-400)\",\n \"--dsw-alias-state-warn-tertiary\": \"var(--dsw-static-amber-900)\",\n \"--dsw-alias-toast-bg\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-tooltip-bg\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-specific-bubble-highlight\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-specific-bubble\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-specific-input-major\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-specific-login-input\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-specific-menu\": \"var(--dsw-alias-bg-layer-3)\",\n \"--dsw-specific-selector\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-specific-sidebar-fill\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-specific-sidebar-nav-item-active-accent\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-specific-sidebar-nav-item-active\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-specific-sidebar-nav-item-hover\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-specific-tip\": \"var(--dsw-static-neutral-bluish-800)\",\n },\n}\n\nexport const CATPPUCCIN_MACCHIATO: CatppuccinFlavorInfo = {\n themeId: 'catppuccin-macchiato',\n colorScheme: 'dark',\n label: 'Macchiato',\n accent: '#8aadf4',\n tokens: {\n \"--dsw-static-amber-100\": \"color-mix(in srgb, #f5a97f 20%, #24273a)\",\n \"--dsw-static-amber-400\": \"color-mix(in srgb, #f5a97f 70%, #24273a)\",\n \"--dsw-static-amber-500\": \"#f5a97f\",\n \"--dsw-static-amber-600\": \"#f5a97f\",\n \"--dsw-static-amber-900\": \"color-mix(in srgb, #f5a97f 32%, #24273a)\",\n \"--dsw-static-blue-100\": \"color-mix(in srgb, #8aadf4 24%, #24273a)\",\n \"--dsw-static-blue-300\": \"color-mix(in srgb, #8aadf4 50%, #24273a)\",\n \"--dsw-static-blue-400\": \"color-mix(in srgb, #8aadf4 66%, #24273a)\",\n \"--dsw-static-blue-450\": \"color-mix(in srgb, #8aadf4 84%, #24273a)\",\n \"--dsw-static-blue-500\": \"#8aadf4\",\n \"--dsw-static-blue-50\": \"color-mix(in srgb, #8aadf4 10%, #24273a)\",\n \"--dsw-static-blue-50p\": \"color-mix(in srgb, #8aadf4 14%, #24273a)\",\n \"--dsw-static-blue-600\": \"color-mix(in srgb, #8aadf4 84%, #24273a)\",\n \"--dsw-static-blue-75\": \"color-mix(in srgb, #8aadf4 18%, #24273a)\",\n \"--dsw-static-blue-800\": \"color-mix(in srgb, #8aadf4 52%, #24273a)\",\n \"--dsw-static-blue-900\": \"color-mix(in srgb, #8aadf4 40%, #24273a)\",\n \"--dsw-static-blue-950\": \"color-mix(in srgb, #8aadf4 28%, #24273a)\",\n \"--dsw-static-deepseek-100\": \"color-mix(in srgb, #8aadf4 24%, #24273a)\",\n \"--dsw-static-deepseek-200\": \"color-mix(in srgb, #8aadf4 36%, #24273a)\",\n \"--dsw-static-deepseek-300\": \"color-mix(in srgb, #8aadf4 50%, #24273a)\",\n \"--dsw-static-deepseek-400\": \"color-mix(in srgb, #8aadf4 66%, #24273a)\",\n \"--dsw-static-deepseek-450\": \"color-mix(in srgb, #8aadf4 84%, #24273a)\",\n \"--dsw-static-deepseek-500\": \"#8aadf4\",\n \"--dsw-static-deepseek-50\": \"color-mix(in srgb, #8aadf4 10%, #24273a)\",\n \"--dsw-static-deepseek-600\": \"color-mix(in srgb, #8aadf4 84%, #24273a)\",\n \"--dsw-static-deepseek-700-delete\": \"color-mix(in srgb, #8aadf4 68%, #24273a)\",\n \"--dsw-static-deepseek-800\": \"color-mix(in srgb, #8aadf4 52%, #24273a)\",\n \"--dsw-static-deepseek-900\": \"color-mix(in srgb, #8aadf4 40%, #24273a)\",\n \"--dsw-static-green-100\": \"color-mix(in srgb, #a6da95 18%, #24273a)\",\n \"--dsw-static-green-400\": \"color-mix(in srgb, #a6da95 80%, #24273a)\",\n \"--dsw-static-green-500\": \"#a6da95\",\n \"--dsw-static-green-900\": \"color-mix(in srgb, #a6da95 30%, #24273a)\",\n \"--dsw-static-neutral-00\": \"#cad3f5\",\n \"--dsw-static-neutral-1000\": \"#181926\",\n \"--dsw-static-neutral-100\": \"#a5adcb\",\n \"--dsw-static-neutral-150\": \"#a5adcb\",\n \"--dsw-static-neutral-200\": \"#939ab7\",\n \"--dsw-static-neutral-250\": \"#939ab7\",\n \"--dsw-static-neutral-300\": \"#8087a2\",\n \"--dsw-static-neutral-400\": \"#6e738d\",\n \"--dsw-static-neutral-500\": \"#5b6078\",\n \"--dsw-static-neutral-50\": \"#cad3f5\",\n \"--dsw-static-neutral-550\": \"#494d64\",\n \"--dsw-static-neutral-600\": \"#494d64\",\n \"--dsw-static-neutral-700\": \"#363a4f\",\n \"--dsw-static-neutral-800\": \"#363a4f\",\n \"--dsw-static-neutral-850\": \"#24273a\",\n \"--dsw-static-neutral-900\": \"#1e2030\",\n \"--dsw-static-neutral-bluish-00\": \"#cad3f5\",\n \"--dsw-static-neutral-bluish-1000\": \"#181926\",\n \"--dsw-static-neutral-bluish-100\": \"#a5adcb\",\n \"--dsw-static-neutral-bluish-150\": \"#a5adcb\",\n \"--dsw-static-neutral-bluish-200\": \"#939ab7\",\n \"--dsw-static-neutral-bluish-300\": \"#8087a2\",\n \"--dsw-static-neutral-bluish-400\": \"#6e738d\",\n \"--dsw-static-neutral-bluish-500\": \"#5b6078\",\n \"--dsw-static-neutral-bluish-50\": \"#cad3f5\",\n \"--dsw-static-neutral-bluish-600\": \"#494d64\",\n \"--dsw-static-neutral-bluish-60\": \"#b8c0e0\",\n \"--dsw-static-neutral-bluish-700\": \"#363a4f\",\n \"--dsw-static-neutral-bluish-750\": \"#363a4f\",\n \"--dsw-static-neutral-bluish-75\": \"#b8c0e0\",\n \"--dsw-static-neutral-bluish-800\": \"#363a4f\",\n \"--dsw-static-neutral-bluish-850\": \"#24273a\",\n \"--dsw-static-neutral-bluish-875\": \"#1e2030\",\n \"--dsw-static-neutral-bluish-900\": \"#1e2030\",\n \"--dsw-static-neutral-bluish-950\": \"#181926\",\n \"--dsw-static-red-100\": \"color-mix(in srgb, #ed8796 20%, #24273a)\",\n \"--dsw-static-red-400\": \"color-mix(in srgb, #ed8796 70%, #24273a)\",\n \"--dsw-static-red-500\": \"#ed8796\",\n \"--dsw-static-red-50\": \"color-mix(in srgb, #ed8796 10%, #24273a)\",\n \"--dsw-static-red-600\": \"#ed8796\",\n \"--dsw-static-red-900\": \"color-mix(in srgb, #ed8796 34%, #24273a)\",\n \"--dsw-alias-bg-base\": \"var(--dsw-static-neutral-bluish-950)\",\n \"--dsw-alias-bg-layer-1\": \"var(--dsw-static-neutral-bluish-875)\",\n \"--dsw-alias-bg-layer-2\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-bg-layer-3\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-bg-mask-1\": \"rgba(0, 0, 0, 0.5)\",\n \"--dsw-alias-bg-mask-2\": \"rgba(0, 0, 0, 0.2)\",\n \"--dsw-alias-bg-mask-3\": \"rgba(0, 0, 0, 0.48)\",\n \"--dsw-alias-bg-mask-photo\": \"rgba(0, 0, 0, 0.88)\",\n \"--dsw-alias-bg-mask-drop\": \"rgba(39, 39, 48, 0.7)\",\n \"--dsw-alias-bg-module-platform\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-bg-multi-select\": \"var(--dsw-static-neutral-850)\",\n \"--dsw-alias-bg-overlay\": \"var(--dsw-static-neutral-bluish-700)\",\n \"--dsw-alias-bg-skeleton\": \"rgba(255, 255, 255, 0.08)\",\n \"--dsw-alias-border-inverted2\": \"rgba(255, 255, 255, 0.08)\",\n \"--dsw-alias-border-inverted\": \"rgba(255, 255, 255, 0.06)\",\n \"--dsw-alias-border-l1\": \"rgba(255, 255, 255, 0.06)\",\n \"--dsw-alias-border-l2-darkmode-thin\": \"rgba(255, 255, 255, 0.06)\",\n \"--dsw-alias-border-l2\": \"rgba(255, 255, 255, 0.12)\",\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-brand-primary-invert\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-brand-primary-new-colorprimary-new-color\": \"#8aadf4\",\n \"--dsw-alias-brand-primary\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-brand-text\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-button-contrast-fill\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-button-elevated-fill\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-button-floating-fill\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-button-floating-hover\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-button-ghost-active-border\": \"var(--dsw-static-neutral-bluish-600)\",\n \"--dsw-alias-button-ghost-active-fill\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-button-ghost-active-hover\": \"var(--dsw-static-neutral-bluish-700)\",\n \"--dsw-alias-button-info-fill\": \"var(--dsw-static-deepseek-400)\",\n \"--dsw-alias-button-info-hover\": \"var(--dsw-static-deepseek-500)\",\n \"--dsw-alias-button-primary-dimmed\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-button-primary-fill\": \"var(--dsw-alias-brand-primary)\",\n \"--dsw-alias-button-primary-hover\": \"var(--dsw-static-neutral-bluish-100)\",\n \"--dsw-alias-button-tool-bar-fill-invisible\": \"rgba(31, 31, 31, 0.36)\",\n \"--dsw-alias-button-tool-bar-fill\": \"rgba(84, 85, 87, 0.5)\",\n \"--dsw-alias-button-tool-bar-hover\": \"rgba(84, 85, 87, 0.6)\",\n \"--dsw-alias-interactive-bg-active\": \"rgba(255, 255, 255, 0.14)\",\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-hover-solid\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-interactive-bg-hover\": \"rgba(255, 255, 255, 0.08)\",\n \"--dsw-alias-label-caption\": \"var(--dsw-static-neutral-bluish-600)\",\n \"--dsw-alias-label-dimmed\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-label-primary-bluish\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-label-primary-dimmed\": \"var(--dsw-static-neutral-bluish-100)\",\n \"--dsw-alias-label-primary-foreground\": \"var(--dsw-static-neutral-bluish-1000)\",\n \"--dsw-alias-label-primary-inverted\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-label-primary\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-label-secondary\": \"var(--dsw-static-neutral-bluish-300)\",\n \"--dsw-alias-label-tertiary\": \"var(--dsw-static-neutral-bluish-400)\",\n \"--dsw-alias-markdown-citation\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-markdown-code-block-banner\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-markdown-code-block\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-alias-markdown-code-segment-selected\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-markdown-code-segment-unselected\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-alias-markdown-inline-code\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-markdown-placeholder\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-markdown-tag\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-scrollbar-bg-l1\": \"var(--dsw-static-neutral-700)\",\n \"--dsw-alias-scrollbar-bg-l2\": \"var(--dsw-static-neutral-600)\",\n \"--dsw-alias-scrollbar-hover-l1\": \"var(--dsw-static-neutral-600)\",\n \"--dsw-alias-scrollbar-hover-l2\": \"var(--dsw-static-neutral-550)\",\n \"--dsw-alias-state-business-primary\": \"var(--dsw-static-deepseek-400)\",\n \"--dsw-alias-state-business-tertiary\": \"var(--dsw-static-deepseek-800)\",\n \"--dsw-alias-state-error-primary\": \"var(--dsw-static-red-400)\",\n \"--dsw-alias-state-error-secondary\": \"var(--dsw-static-red-400)\",\n \"--dsw-alias-state-success-primary\": \"var(--dsw-static-green-500)\",\n \"--dsw-alias-state-success-secondary\": \"var(--dsw-static-green-400)\",\n \"--dsw-alias-state-success-tertiary\": \"var(--dsw-static-green-900)\",\n \"--dsw-alias-state-warn-label\": \"var(--dsw-static-amber-600)\",\n \"--dsw-alias-state-warn-primary\": \"var(--dsw-static-amber-500)\",\n \"--dsw-alias-state-warn-secondary\": \"var(--dsw-static-amber-400)\",\n \"--dsw-alias-state-warn-tertiary\": \"var(--dsw-static-amber-900)\",\n \"--dsw-alias-toast-bg\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-tooltip-bg\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-specific-bubble-highlight\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-specific-bubble\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-specific-input-major\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-specific-login-input\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-specific-menu\": \"var(--dsw-alias-bg-layer-3)\",\n \"--dsw-specific-selector\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-specific-sidebar-fill\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-specific-sidebar-nav-item-active-accent\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-specific-sidebar-nav-item-active\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-specific-sidebar-nav-item-hover\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-specific-tip\": \"var(--dsw-static-neutral-bluish-800)\",\n },\n}\n\nexport const CATPPUCCIN_MOCHA: CatppuccinFlavorInfo = {\n themeId: 'catppuccin-mocha',\n colorScheme: 'dark',\n label: 'Mocha',\n accent: '#89b4fa',\n tokens: {\n \"--dsw-static-amber-100\": \"color-mix(in srgb, #fab387 20%, #1e1e2e)\",\n \"--dsw-static-amber-400\": \"color-mix(in srgb, #fab387 70%, #1e1e2e)\",\n \"--dsw-static-amber-500\": \"#fab387\",\n \"--dsw-static-amber-600\": \"#fab387\",\n \"--dsw-static-amber-900\": \"color-mix(in srgb, #fab387 32%, #1e1e2e)\",\n \"--dsw-static-blue-100\": \"color-mix(in srgb, #89b4fa 24%, #1e1e2e)\",\n \"--dsw-static-blue-300\": \"color-mix(in srgb, #89b4fa 50%, #1e1e2e)\",\n \"--dsw-static-blue-400\": \"color-mix(in srgb, #89b4fa 66%, #1e1e2e)\",\n \"--dsw-static-blue-450\": \"color-mix(in srgb, #89b4fa 84%, #1e1e2e)\",\n \"--dsw-static-blue-500\": \"#89b4fa\",\n \"--dsw-static-blue-50\": \"color-mix(in srgb, #89b4fa 10%, #1e1e2e)\",\n \"--dsw-static-blue-50p\": \"color-mix(in srgb, #89b4fa 14%, #1e1e2e)\",\n \"--dsw-static-blue-600\": \"color-mix(in srgb, #89b4fa 84%, #1e1e2e)\",\n \"--dsw-static-blue-75\": \"color-mix(in srgb, #89b4fa 18%, #1e1e2e)\",\n \"--dsw-static-blue-800\": \"color-mix(in srgb, #89b4fa 52%, #1e1e2e)\",\n \"--dsw-static-blue-900\": \"color-mix(in srgb, #89b4fa 40%, #1e1e2e)\",\n \"--dsw-static-blue-950\": \"color-mix(in srgb, #89b4fa 28%, #1e1e2e)\",\n \"--dsw-static-deepseek-100\": \"color-mix(in srgb, #89b4fa 24%, #1e1e2e)\",\n \"--dsw-static-deepseek-200\": \"color-mix(in srgb, #89b4fa 36%, #1e1e2e)\",\n \"--dsw-static-deepseek-300\": \"color-mix(in srgb, #89b4fa 50%, #1e1e2e)\",\n \"--dsw-static-deepseek-400\": \"color-mix(in srgb, #89b4fa 66%, #1e1e2e)\",\n \"--dsw-static-deepseek-450\": \"color-mix(in srgb, #89b4fa 84%, #1e1e2e)\",\n \"--dsw-static-deepseek-500\": \"#89b4fa\",\n \"--dsw-static-deepseek-50\": \"color-mix(in srgb, #89b4fa 10%, #1e1e2e)\",\n \"--dsw-static-deepseek-600\": \"color-mix(in srgb, #89b4fa 84%, #1e1e2e)\",\n \"--dsw-static-deepseek-700-delete\": \"color-mix(in srgb, #89b4fa 68%, #1e1e2e)\",\n \"--dsw-static-deepseek-800\": \"color-mix(in srgb, #89b4fa 52%, #1e1e2e)\",\n \"--dsw-static-deepseek-900\": \"color-mix(in srgb, #89b4fa 40%, #1e1e2e)\",\n \"--dsw-static-green-100\": \"color-mix(in srgb, #a6e3a1 18%, #1e1e2e)\",\n \"--dsw-static-green-400\": \"color-mix(in srgb, #a6e3a1 80%, #1e1e2e)\",\n \"--dsw-static-green-500\": \"#a6e3a1\",\n \"--dsw-static-green-900\": \"color-mix(in srgb, #a6e3a1 30%, #1e1e2e)\",\n \"--dsw-static-neutral-00\": \"#cdd6f4\",\n \"--dsw-static-neutral-1000\": \"#11111b\",\n \"--dsw-static-neutral-100\": \"#a6adc8\",\n \"--dsw-static-neutral-150\": \"#a6adc8\",\n \"--dsw-static-neutral-200\": \"#9399b2\",\n \"--dsw-static-neutral-250\": \"#9399b2\",\n \"--dsw-static-neutral-300\": \"#7f849c\",\n \"--dsw-static-neutral-400\": \"#6c7086\",\n \"--dsw-static-neutral-500\": \"#585b70\",\n \"--dsw-static-neutral-50\": \"#cdd6f4\",\n \"--dsw-static-neutral-550\": \"#45475a\",\n \"--dsw-static-neutral-600\": \"#45475a\",\n \"--dsw-static-neutral-700\": \"#313244\",\n \"--dsw-static-neutral-800\": \"#313244\",\n \"--dsw-static-neutral-850\": \"#1e1e2e\",\n \"--dsw-static-neutral-900\": \"#181825\",\n \"--dsw-static-neutral-bluish-00\": \"#cdd6f4\",\n \"--dsw-static-neutral-bluish-1000\": \"#11111b\",\n \"--dsw-static-neutral-bluish-100\": \"#a6adc8\",\n \"--dsw-static-neutral-bluish-150\": \"#a6adc8\",\n \"--dsw-static-neutral-bluish-200\": \"#9399b2\",\n \"--dsw-static-neutral-bluish-300\": \"#7f849c\",\n \"--dsw-static-neutral-bluish-400\": \"#6c7086\",\n \"--dsw-static-neutral-bluish-500\": \"#585b70\",\n \"--dsw-static-neutral-bluish-50\": \"#cdd6f4\",\n \"--dsw-static-neutral-bluish-600\": \"#45475a\",\n \"--dsw-static-neutral-bluish-60\": \"#bac2de\",\n \"--dsw-static-neutral-bluish-700\": \"#313244\",\n \"--dsw-static-neutral-bluish-750\": \"#313244\",\n \"--dsw-static-neutral-bluish-75\": \"#bac2de\",\n \"--dsw-static-neutral-bluish-800\": \"#313244\",\n \"--dsw-static-neutral-bluish-850\": \"#1e1e2e\",\n \"--dsw-static-neutral-bluish-875\": \"#181825\",\n \"--dsw-static-neutral-bluish-900\": \"#181825\",\n \"--dsw-static-neutral-bluish-950\": \"#11111b\",\n \"--dsw-static-red-100\": \"color-mix(in srgb, #f38ba8 20%, #1e1e2e)\",\n \"--dsw-static-red-400\": \"color-mix(in srgb, #f38ba8 70%, #1e1e2e)\",\n \"--dsw-static-red-500\": \"#f38ba8\",\n \"--dsw-static-red-50\": \"color-mix(in srgb, #f38ba8 10%, #1e1e2e)\",\n \"--dsw-static-red-600\": \"#f38ba8\",\n \"--dsw-static-red-900\": \"color-mix(in srgb, #f38ba8 34%, #1e1e2e)\",\n \"--dsw-alias-bg-base\": \"var(--dsw-static-neutral-bluish-950)\",\n \"--dsw-alias-bg-layer-1\": \"var(--dsw-static-neutral-bluish-875)\",\n \"--dsw-alias-bg-layer-2\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-bg-layer-3\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-bg-mask-1\": \"rgba(0, 0, 0, 0.5)\",\n \"--dsw-alias-bg-mask-2\": \"rgba(0, 0, 0, 0.2)\",\n \"--dsw-alias-bg-mask-3\": \"rgba(0, 0, 0, 0.48)\",\n \"--dsw-alias-bg-mask-photo\": \"rgba(0, 0, 0, 0.88)\",\n \"--dsw-alias-bg-mask-drop\": \"rgba(39, 39, 48, 0.7)\",\n \"--dsw-alias-bg-module-platform\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-bg-multi-select\": \"var(--dsw-static-neutral-850)\",\n \"--dsw-alias-bg-overlay\": \"var(--dsw-static-neutral-bluish-700)\",\n \"--dsw-alias-bg-skeleton\": \"rgba(255, 255, 255, 0.08)\",\n \"--dsw-alias-border-inverted2\": \"rgba(255, 255, 255, 0.08)\",\n \"--dsw-alias-border-inverted\": \"rgba(255, 255, 255, 0.06)\",\n \"--dsw-alias-border-l1\": \"rgba(255, 255, 255, 0.06)\",\n \"--dsw-alias-border-l2-darkmode-thin\": \"rgba(255, 255, 255, 0.06)\",\n \"--dsw-alias-border-l2\": \"rgba(255, 255, 255, 0.12)\",\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-brand-primary-invert\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-brand-primary-new-colorprimary-new-color\": \"#89b4fa\",\n \"--dsw-alias-brand-primary\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-brand-text\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-button-contrast-fill\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-button-elevated-fill\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-button-floating-fill\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-button-floating-hover\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-button-ghost-active-border\": \"var(--dsw-static-neutral-bluish-600)\",\n \"--dsw-alias-button-ghost-active-fill\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-button-ghost-active-hover\": \"var(--dsw-static-neutral-bluish-700)\",\n \"--dsw-alias-button-info-fill\": \"var(--dsw-static-deepseek-400)\",\n \"--dsw-alias-button-info-hover\": \"var(--dsw-static-deepseek-500)\",\n \"--dsw-alias-button-primary-dimmed\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-button-primary-fill\": \"var(--dsw-alias-brand-primary)\",\n \"--dsw-alias-button-primary-hover\": \"var(--dsw-static-neutral-bluish-100)\",\n \"--dsw-alias-button-tool-bar-fill-invisible\": \"rgba(31, 31, 31, 0.36)\",\n \"--dsw-alias-button-tool-bar-fill\": \"rgba(84, 85, 87, 0.5)\",\n \"--dsw-alias-button-tool-bar-hover\": \"rgba(84, 85, 87, 0.6)\",\n \"--dsw-alias-interactive-bg-active\": \"rgba(255, 255, 255, 0.14)\",\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-hover-solid\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-interactive-bg-hover\": \"rgba(255, 255, 255, 0.08)\",\n \"--dsw-alias-label-caption\": \"var(--dsw-static-neutral-bluish-600)\",\n \"--dsw-alias-label-dimmed\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-label-primary-bluish\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-label-primary-dimmed\": \"var(--dsw-static-neutral-bluish-100)\",\n \"--dsw-alias-label-primary-foreground\": \"var(--dsw-static-neutral-bluish-1000)\",\n \"--dsw-alias-label-primary-inverted\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-label-primary\": \"var(--dsw-static-neutral-bluish-50)\",\n \"--dsw-alias-label-secondary\": \"var(--dsw-static-neutral-bluish-300)\",\n \"--dsw-alias-label-tertiary\": \"var(--dsw-static-neutral-bluish-400)\",\n \"--dsw-alias-markdown-citation\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-markdown-code-block-banner\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-markdown-code-block\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-alias-markdown-code-segment-selected\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-alias-markdown-code-segment-unselected\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-alias-markdown-inline-code\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-markdown-placeholder\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-markdown-tag\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-alias-scrollbar-bg-l1\": \"var(--dsw-static-neutral-700)\",\n \"--dsw-alias-scrollbar-bg-l2\": \"var(--dsw-static-neutral-600)\",\n \"--dsw-alias-scrollbar-hover-l1\": \"var(--dsw-static-neutral-600)\",\n \"--dsw-alias-scrollbar-hover-l2\": \"var(--dsw-static-neutral-550)\",\n \"--dsw-alias-state-business-primary\": \"var(--dsw-static-deepseek-400)\",\n \"--dsw-alias-state-business-tertiary\": \"var(--dsw-static-deepseek-800)\",\n \"--dsw-alias-state-error-primary\": \"var(--dsw-static-red-400)\",\n \"--dsw-alias-state-error-secondary\": \"var(--dsw-static-red-400)\",\n \"--dsw-alias-state-success-primary\": \"var(--dsw-static-green-500)\",\n \"--dsw-alias-state-success-secondary\": \"var(--dsw-static-green-400)\",\n \"--dsw-alias-state-success-tertiary\": \"var(--dsw-static-green-900)\",\n \"--dsw-alias-state-warn-label\": \"var(--dsw-static-amber-600)\",\n \"--dsw-alias-state-warn-primary\": \"var(--dsw-static-amber-500)\",\n \"--dsw-alias-state-warn-secondary\": \"var(--dsw-static-amber-400)\",\n \"--dsw-alias-state-warn-tertiary\": \"var(--dsw-static-amber-900)\",\n \"--dsw-alias-toast-bg\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-alias-tooltip-bg\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-specific-bubble-highlight\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-specific-bubble\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-specific-input-major\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-specific-login-input\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-specific-menu\": \"var(--dsw-alias-bg-layer-3)\",\n \"--dsw-specific-selector\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-specific-sidebar-fill\": \"var(--dsw-static-neutral-bluish-900)\",\n \"--dsw-specific-sidebar-nav-item-active-accent\": \"var(--dsw-static-neutral-bluish-800)\",\n \"--dsw-specific-sidebar-nav-item-active\": \"var(--dsw-static-neutral-bluish-750)\",\n \"--dsw-specific-sidebar-nav-item-hover\": \"var(--dsw-static-neutral-bluish-850)\",\n \"--dsw-specific-tip\": \"var(--dsw-static-neutral-bluish-800)\",\n },\n}\n\nexport const CATPPUCCIN_FLAVORS: readonly CatppuccinFlavorInfo[] = [\n CATPPUCCIN_LATTE,\n CATPPUCCIN_FRAPPE,\n CATPPUCCIN_MACCHIATO,\n CATPPUCCIN_MOCHA,\n]\n","/**\n * Catppuccin syntax-highlighting token overrides for Shiki.\n *\n * DSH's default shiki.css (shipped by @deepseek-ai/dsh-client-ui-theme) defines\n * its own hard-coded syntax colours that are not Catppuccin. This module\n * supplies the canonical Catppuccin palette colours (sourced from the official\n * Shiki themes shipped by @shikijs/themes) for each of the four flavours, so\n * code blocks inside the DSH GUI match the Catppuccin project's syntax\n * highlighting.\n *\n * The foreground and background tokens are kept as var() references into the\n * plugin's own --dsw-* overrides (foreground -> label-primary, background ->\n * markdown-code-block), so they automatically track the active flavour. Every\n * other token is a literal hex from the Catppuccin palette.\n */\n\nimport type { CatppuccinFlavorId } from './palettes.ts'\n\n/** Shiki token names as defined by DSH's shiki.css. */\nexport type ShikiTokenName =\n | '--shiki-foreground'\n | '--shiki-background'\n | '--shiki-token-constant'\n | '--shiki-token-string'\n | '--shiki-token-comment'\n | '--shiki-token-keyword'\n | '--shiki-token-parameter'\n | '--shiki-token-function'\n | '--shiki-token-string-expression'\n | '--shiki-token-punctuation'\n | '--shiki-token-link'\n\n/** Per-flavour shiki token dictionary. */\nexport type ShikiTokens = Record<ShikiTokenName, string>\n\n/**\n * Canonical Catppuccin syntax colours per flavour.\n *\n * Colour → token mapping (from the official @shikijs/themes Catppuccin themes):\n * foreground → text\n * constant → peach\n * string → green\n * comment → overlay2\n * keyword → mauve\n * parameter → maroon\n * function → blue\n * string-expr → green (same as string)\n * punctuation → overlay2\n * link → blue (same as function)\n *\n * Background and foreground use var() references so they flow through the\n * flavour's --dsw-* overrides; the rest are literal hex.\n */\n\nexport const SHIKI_TOKENS: Record<CatppuccinFlavorId, ShikiTokens> = {\n latte: {\n '--shiki-foreground': 'var(--dsw-alias-label-primary)',\n '--shiki-background': 'var(--dsw-alias-markdown-code-block)',\n '--shiki-token-constant': '#fe640b', // peach\n '--shiki-token-string': '#40a02b', // green\n '--shiki-token-comment': '#7c7f93', // overlay2\n '--shiki-token-keyword': '#8839ef', // mauve\n '--shiki-token-parameter': '#e64553', // maroon\n '--shiki-token-function': '#1e66f5', // blue\n '--shiki-token-string-expression': '#40a02b', // green\n '--shiki-token-punctuation': '#7c7f93', // overlay2\n '--shiki-token-link': '#1e66f5', // blue\n },\n\n frappe: {\n '--shiki-foreground': 'var(--dsw-alias-label-primary)',\n '--shiki-background': 'var(--dsw-alias-markdown-code-block)',\n '--shiki-token-constant': '#ef9f76', // peach\n '--shiki-token-string': '#a6d189', // green\n '--shiki-token-comment': '#949cbb', // overlay2\n '--shiki-token-keyword': '#ca9ee6', // mauve\n '--shiki-token-parameter': '#ea999c', // maroon\n '--shiki-token-function': '#8caaee', // blue\n '--shiki-token-string-expression': '#a6d189', // green\n '--shiki-token-punctuation': '#949cbb', // overlay2\n '--shiki-token-link': '#8caaee', // blue\n },\n\n macchiato: {\n '--shiki-foreground': 'var(--dsw-alias-label-primary)',\n '--shiki-background': 'var(--dsw-alias-markdown-code-block)',\n '--shiki-token-constant': '#f5a97f', // peach\n '--shiki-token-string': '#a6da95', // green\n '--shiki-token-comment': '#939ab7', // overlay2\n '--shiki-token-keyword': '#c6a0f6', // mauve\n '--shiki-token-parameter': '#ee99a0', // maroon\n '--shiki-token-function': '#8aadf4', // blue\n '--shiki-token-string-expression': '#a6da95', // green\n '--shiki-token-punctuation': '#939ab7', // overlay2\n '--shiki-token-link': '#8aadf4', // blue\n },\n\n mocha: {\n '--shiki-foreground': 'var(--dsw-alias-label-primary)',\n '--shiki-background': 'var(--dsw-alias-markdown-code-block)',\n '--shiki-token-constant': '#fab387', // peach\n '--shiki-token-string': '#a6e3a1', // green\n '--shiki-token-comment': '#9399b2', // overlay2\n '--shiki-token-keyword': '#cba6f7', // mauve\n '--shiki-token-parameter': '#eba0ac', // maroon\n '--shiki-token-function': '#89b4fa', // blue\n '--shiki-token-string-expression': '#a6e3a1', // green\n '--shiki-token-punctuation': '#9399b2', // overlay2\n '--shiki-token-link': '#89b4fa', // blue\n },\n}","/**\n * Runtime seam stamper for the Catppuccin glass layer.\n *\n * The glass stylesheet keys off stable data-* hooks (`data-dsh-glass-frame`,\n * `data-dsh-glass-trajectory`, `data-dsh-glass-stats`, …) that are NOT part\n * of the stock DSH markup, so this module stamps them onto the matching\n * elements at runtime — the stylesheet works with zero base edits. Each\n * selector uses only stable attributes already present in the stock UI\n * (`data-composer-card`, `data-conversation-composer-overlay`, `data-slot`,\n * ARIA roles) or lightningcss-preserved class-name substrings.\n *\n * Stamps are idempotent and inert without the `data-dsh-glass` root attribute\n * (the whole stylesheet is gated on it), so they are simply left in place when\n * the layer flips off — \"off\" still renders the exact stock UI.\n */\n\ninterface Seam {\n /** Attribute to stamp (bare name; value is always ''). */\n readonly attribute: string\n /** CSS selector for the element(s) to stamp. */\n readonly selector: string\n /** Stamp only the first (topmost) match, not every descendant match. */\n readonly first?: boolean\n}\n\nconst SEAMS: readonly Seam[] = [\n // The layout frame: the sidebar column's direct parent.\n { attribute: 'data-dsh-glass-frame', selector: ':has(> [class*=\"sidebarCol\"])' },\n // The sidebar content root (topmost `root` under the column — settings\n // internals also carry a `root` class but sit deeper, so first match wins).\n { attribute: 'data-dsh-glass-sidebar-root', selector: '[class*=\"sidebarCol\"] [class*=\"root\"]', first: true },\n // New-session button (a raised-surface seam).\n { attribute: 'data-dsh-glass-surface', selector: 'button[class*=\"newSession\"]' },\n // Trajectory view (the composer-overlay view).\n { attribute: 'data-dsh-glass-trajectory', selector: '[data-conversation-composer-overlay]' },\n // Details panel (topmost `root` under the details column).\n { attribute: 'data-dsh-glass-details', selector: '[class*=\"detailsCol\"] [class*=\"root\"]', first: true },\n // Composer bar root: the composer card's direct parent.\n { attribute: 'data-dsh-glass-inputbar', selector: ':has(> [data-composer-card])' },\n // Composer attach \"+\" button.\n { attribute: 'data-dsh-glass-add', selector: '[data-composer-card] [class*=\"add\"]' },\n // Session stats line under the composer (composer.dock slot).\n { attribute: 'data-dsh-glass-stats', selector: '[data-slot=\"conversation.composer.dock\"] [class*=\"root\"]' },\n]\n\nfunction stamp(seam: Seam): void {\n if (seam.first) {\n const el = document.querySelector(seam.selector)\n if (el !== null && !el.hasAttribute(seam.attribute)) el.setAttribute(seam.attribute, '')\n return\n }\n for (const el of document.querySelectorAll(seam.selector)) {\n if (!el.hasAttribute(seam.attribute)) el.setAttribute(seam.attribute, '')\n }\n}\n\nfunction stampAll(): void {\n for (const seam of SEAMS) stamp(seam)\n}\n\n/**\n * Stamp the seams once, then keep them stamped as React remounts nodes.\n * @returns a disposer that disconnects the observer.\n */\nexport function startGlassSeamStamper(): () => void {\n stampAll()\n const observer = new MutationObserver(() => { stampAll() })\n observer.observe(document.documentElement, { childList: true, subtree: true })\n return () => { observer.disconnect() }\n}\n","/**\n * Catppuccin glass layer — one toggleable glassmorphism skin over the whole\n * Web surface, riding on top of the Catppuccin themes. Everything the layer\n * owns is an effect: the CSS hooks ride a `data-dsh-glass` attribute on\n * <html> (the stylesheet only applies under it), the seam stamps ride a\n * MutationObserver, and the page-edge fade bands are DOM elements — so\n * switching the flag off (or unloading the plugin) restores the stock UI\n * exactly: no residue, no reload.\n *\n * The page ground is a SOLID colour: the active theme's own `bg-base`\n * token (Latte / Frappé / Macchiato / Mocha), with the brightness knob\n * mixing white/black straight into it. The earlier animated ambient scene\n * (gradient wash + drifting blobs + hue rotation) was removed in favour of\n * this flat ground.\n *\n * The enable flag and every knob persist in localStorage — the in-browser\n * cache and cross-tab sync bus. The DURABLE copy of the same state lives in a\n * Host file behind `/catppuccin/state` (see `src/state.ts` / `src/host-state.ts`):\n * required because DSH Desktop boots the GUI on a fresh random loopback port\n * every launch, and localStorage (scoped per origin including the port) always\n * starts empty there, while a file in the DSH home does not. The layer lets\n * the plugin hydrate (`applyRemote`) and snapshot (`getRemoteState`) that\n * durable copy; the enable flag and knobs themselves stay client-only visual\n * preferences shared with the plugin alone, needing no host configuration.\n */\nimport type { Context } from '@deepseek-ai/cordis'\n// Type-only: pulls the theme plugin's Context merge (ctx.theme + theme/change).\nimport type {} from '@deepseek-ai/dsh-client-ui-theme/client'\nimport { startGlassSeamStamper } from './glass-seams.ts'\nimport type { GlassState } from '../../state.ts'\n\n/** html attribute selecting the glass layer: CSS hooks and page effects. */\nexport const GLASS_ATTRIBUTE = 'data-dsh-glass'\n\n/** html attribute selecting the mica (floating-card) layout rules. */\nexport const GLASS_FLOAT_ATTRIBUTE = 'data-dsh-glass-float'\n\n/** html attribute selecting the compatibility (stock-layout) rules. */\nexport const GLASS_COMPAT_ATTRIBUTE = 'data-dsh-glass-compat'\n\n/** localStorage key carrying the layer enable flag. */\nexport const GLASS_ENABLED_KEY = 'dsh.catppuccin.glass.enabled'\n\n/** Default state when nothing is stored yet: off (the stock UI stays stock). */\nexport const DEFAULT_ENABLED = false\n\n/** Tunable glass knobs. */\nexport interface GlassSettings {\n /** Rendering mode: mica (frosted floating cards) or the stock layout with a generic glass material. */\n mode: 'mica' | 'compat'\n /** Glass backdrop blur radius, px. */\n blur: number\n /** Glass fill opacity, 0-100 (50 = the shipped look; drives the frost multiplier). */\n frost: number\n /** Backdrop brightness, 0-100 (0 = pure black, 50 = transparent, 100 = pure white; half-range per scheme). */\n brightness: number\n}\n\n/** The full state the settings row mirrors (settings + enable flag + scheme). */\nexport interface GlassRowState extends GlassSettings {\n /** Layer enable flag. */\n enabled: boolean\n /** Resolved palette is dark (the brightness knob darkens). */\n dark: boolean\n}\n\n/**\n * Shipped knob defaults — aligned with the reference project\n * (DSH-Transparent-UI-Plugin / Aqua): mica mode, blur 2px, frost 20\n * (the 0-100 slider maps to a 0-1.4 alpha multiplier via frost/50, so 20\n * reads as a light frost) and neutral backdrop brightness. MUST stay in sync\n * with `DEFAULT_GLASS` in `src/state.ts` (guarded by `tests/state.spec.ts`).\n */\nexport const SETTINGS_DEFAULTS: GlassSettings = {\n mode: 'mica',\n blur: 2,\n frost: 20,\n brightness: 50,\n}\n\n/** Numeric knob keys and their localStorage names. */\nconst NUMERIC_KEYS = {\n blur: 'dsh.catppuccin.glass.blur',\n frost: 'dsh.catppuccin.glass.frost',\n brightness: 'dsh.catppuccin.glass.brightness',\n} as const\ntype NumericKey = keyof typeof NUMERIC_KEYS\n\nconst MODE_KEY = 'dsh.catppuccin.glass.mode'\n\n/** Clamp a numeric knob into its sane range. */\nfunction clampSetting(key: NumericKey, value: number): number {\n const max = key === 'blur' ? 40 : 100\n return Number.isFinite(value) ? Math.min(max, Math.max(0, value)) : SETTINGS_DEFAULTS[key]\n}\n\n/** Read one numeric knob from localStorage (absent/parse failure means the default). */\nfunction readSetting(key: NumericKey): number {\n try {\n const raw = localStorage.getItem(NUMERIC_KEYS[key])\n return raw === null ? SETTINGS_DEFAULTS[key] : clampSetting(key, Number(raw))\n } catch {\n return SETTINGS_DEFAULTS[key]\n }\n}\n\n/** Persist one numeric knob (storage failures keep the in-memory state). */\nfunction writeSetting(key: NumericKey, value: number): void {\n try {\n localStorage.setItem(NUMERIC_KEYS[key], String(value))\n } catch {\n /* in-memory state still applies for this tab */\n }\n}\n\n/** Read the rendering mode ('mica' or 'compat'). */\nfunction readMode(): 'mica' | 'compat' {\n try {\n return localStorage.getItem(MODE_KEY) === 'compat' ? 'compat' : 'mica'\n } catch {\n return 'mica'\n }\n}\n\n/** Persist the rendering mode. */\nfunction writeMode(value: 'mica' | 'compat'): void {\n try {\n localStorage.setItem(MODE_KEY, value)\n } catch {\n /* in-memory state still applies */\n }\n}\n\n/** Read the persisted enable flag (absent storage means the default). */\nfunction readEnabled(): boolean {\n try {\n const raw = localStorage.getItem(GLASS_ENABLED_KEY)\n return raw === null ? DEFAULT_ENABLED : raw === 'true'\n } catch {\n return DEFAULT_ENABLED\n }\n}\n\n/** Persist the enable flag (storage failures keep the in-memory state). */\nfunction writeEnabled(value: boolean): void {\n try {\n localStorage.setItem(GLASS_ENABLED_KEY, String(value))\n } catch {\n /* in-memory state still applies for this tab */\n }\n}\n\n/** Resolved scheme from the theme service (falls back to the body attribute). */\nfunction resolveDark(ctx: Context): boolean {\n try {\n return ctx.theme.getTheme().active.colorScheme === 'dark'\n } catch {\n return document.body.hasAttribute('data-ds-dark-theme')\n }\n}\n\n/**\n * The page-edge fade bands injected while enabled (ported from\n * DSH-Transparent-UI-Plugin): two fixed-position, click-through strips\n * that blur the chat content melting into the viewport edges. Both are\n * removed together on disable. The page ground itself is pure CSS (the\n * body rule), so no backdrop element is needed.\n */\nconst FADE_MARKUP = [\n '<span data-dsh-glass-fade=\"top\" aria-hidden=\"true\"></span>',\n '<span data-dsh-glass-fade=\"bottom\" aria-hidden=\"true\"></span>',\n].join('')\n\n/**\n * Owns the glass layer lifecycle: reads the durable enable flag and knobs,\n * and applies / retracts every layer on change. Cross-tab flips arrive through\n * the storage event; the seam observer and every subscription are released\n * when the plugin fiber is disposed.\n */\nexport class GlassLayer {\n private enabled = false\n private settings: GlassSettings = { ...SETTINGS_DEFAULTS }\n /** Cached snapshot for the settings row (stable reference between changes). */\n private snapshot: GlassRowState\n private readonly listeners = new Set<() => void>()\n private dark = false\n private seamDisposer: (() => void) | undefined\n private readonly ctx: Context\n\n /**\n * @param ctx - owning client context (listeners ride this fiber).\n */\n constructor(ctx: Context) {\n this.ctx = ctx\n this.enabled = readEnabled()\n this.reloadSettings()\n this.dark = resolveDark(ctx)\n this.snapshot = this.buildSnapshot()\n\n ctx.effect(() => {\n const onStorage = (event: StorageEvent): void => {\n if (event.key === null) { this.reloadSettings(); this.enabled = readEnabled(); this.sync() }\n else if (event.key === GLASS_ENABLED_KEY) {\n this.enabled = readEnabled()\n this.sync()\n } else if (event.key === MODE_KEY || event.key in NUMERIC_KEYS) {\n this.reloadSettings()\n if (this.enabled) this.applySettings()\n this.publish()\n }\n }\n window.addEventListener('storage', onStorage)\n // Follow the Appearance switch: the brightness knob's half-range and\n // the mix direction flip with the resolved scheme. Runs even while\n // disabled so the settings row stays correct.\n const themeListener = ctx.on('theme/change', () => {\n this.dark = resolveDark(ctx)\n if (this.enabled) this.applySettings()\n this.publish()\n })\n return () => {\n window.removeEventListener('storage', onStorage)\n themeListener()\n this.unmount()\n }\n }, 'catppuccin: glass layer lifecycle')\n\n // Apply the restored state: mount the layer when the persisted flag is on\n // (the settings row reflects the same snapshot, so the two stay in sync).\n this.sync()\n }\n\n /** Current state snapshot (stable reference until the next change). */\n getSnapshot(): GlassRowState {\n return this.snapshot\n }\n\n /** Subscribe to snapshot changes. Returns the disposer. */\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener)\n return () => { this.listeners.delete(listener) }\n }\n\n /** The durable subset of the current layer state (no derived `dark`). */\n getRemoteState(): GlassState {\n return {\n enabled: this.enabled,\n mode: this.settings.mode,\n blur: this.settings.blur,\n frost: this.settings.frost,\n brightness: this.settings.brightness,\n }\n }\n\n /** Overlay durable state hydrated from the Host file: persist it to\n * localStorage (the cache), apply it to the live layer, and republish so\n * the settings row reflects the restored choice. */\n applyRemote(remote: GlassState): void {\n this.enabled = remote.enabled\n this.settings = {\n mode: remote.mode === 'compat' ? 'compat' : 'mica',\n blur: clampSetting('blur', remote.blur),\n frost: clampSetting('frost', remote.frost),\n brightness: clampSetting('brightness', remote.brightness),\n }\n writeEnabled(this.enabled)\n writeMode(this.settings.mode)\n writeSetting('blur', this.settings.blur)\n writeSetting('frost', this.settings.frost)\n writeSetting('brightness', this.settings.brightness)\n this.sync()\n }\n\n /** Flip the layer: persist, then apply or retract every owned effect. */\n setEnabled(value: boolean): void {\n if (value === this.enabled) return\n this.enabled = value\n writeEnabled(value)\n this.sync()\n }\n\n /** Set the rendering mode ('mica' or 'compat'). */\n setMode(value: 'mica' | 'compat'): void {\n if (value === this.settings.mode) return\n this.settings.mode = value\n writeMode(value)\n if (this.enabled) this.applySettings()\n this.publish()\n }\n\n /** Set the glass blur radius (px). */\n setBlur(value: number): void {\n const next = clampSetting('blur', value)\n if (next === this.settings.blur) return\n this.settings.blur = next\n writeSetting('blur', next)\n if (this.enabled) this.applySettings()\n this.publish()\n }\n\n /** Set the glass frost amount (0-100). */\n setFrost(value: number): void {\n const next = clampSetting('frost', value)\n if (next === this.settings.frost) return\n this.settings.frost = next\n writeSetting('frost', next)\n if (this.enabled) this.applySettings()\n this.publish()\n }\n\n /** Set the backdrop brightness (0-100: 0 = pure black, 50 = transparent, 100 = pure white). */\n setBrightness(value: number): void {\n const next = clampSetting('brightness', value)\n if (next === this.settings.brightness) return\n this.settings.brightness = next\n writeSetting('brightness', next)\n if (this.enabled) this.applySettings()\n this.publish()\n }\n\n /** Restore every knob to the shipped defaults (persisted immediately). */\n resetDefaults(): void {\n this.settings = { ...SETTINGS_DEFAULTS }\n writeMode(this.settings.mode)\n writeSetting('blur', this.settings.blur)\n writeSetting('frost', this.settings.frost)\n writeSetting('brightness', this.settings.brightness)\n if (this.enabled) this.applySettings()\n this.publish()\n }\n\n /** Re-read every knob from localStorage into memory. */\n private reloadSettings(): void {\n this.settings = {\n mode: readMode(),\n blur: readSetting('blur'),\n frost: readSetting('frost'),\n brightness: readSetting('brightness'),\n }\n }\n\n private buildSnapshot(): GlassRowState {\n return { ...this.settings, enabled: this.enabled, dark: this.dark }\n }\n\n private publish(): void {\n this.snapshot = this.buildSnapshot()\n for (const listener of this.listeners) listener()\n }\n\n private sync(): void {\n if (this.enabled) this.mount()\n else this.unmount()\n this.publish()\n }\n\n /** Write the knob-driven CSS variables and mode attributes onto <html>. */\n private applySettings(): void {\n const style = document.documentElement.style\n style.setProperty('--dsh-glass-blur', `${this.settings.blur}px`)\n // Frost 0-100 → a 0-1.4 alpha multiplier (50 = 1x). Capped so max frost\n // stays translucent frosted glass instead of collapsing to a solid slab.\n style.setProperty('--dsh-glass-frost', String(Math.min(this.settings.frost / 50, 1.4)))\n // Backdrop brightness: dark mode darkens (0 = pure black, 50 = off),\n // light mode brightens (50 = off, 100 = pure white) — the knob's range\n // and the mix direction both follow the resolved scheme. The body\n // background rule mixes these fractions straight into the solid ground.\n const dark = this.dark\n style.setProperty('--dsh-glass-brightness-black', String(dark ? Math.max(0, (50 - this.settings.brightness) / 50) : 0))\n style.setProperty('--dsh-glass-brightness-white', String(dark ? 0 : Math.max(0, (this.settings.brightness - 50) / 50)))\n\n // Rendering mode: the float rules key off data-dsh-glass-float; the\n // compat (generic glass) rules key off data-dsh-glass-compat.\n const compat = this.settings.mode === 'compat'\n document.documentElement.toggleAttribute(GLASS_FLOAT_ATTRIBUTE, !compat)\n document.documentElement.toggleAttribute(GLASS_COMPAT_ATTRIBUTE, compat)\n }\n\n private mount(): void {\n document.documentElement.setAttribute(GLASS_ATTRIBUTE, '')\n this.applySettings()\n this.ensureFades()\n if (this.seamDisposer === undefined) this.seamDisposer = startGlassSeamStamper()\n }\n\n private unmount(): void {\n document.documentElement.removeAttribute(GLASS_ATTRIBUTE)\n document.documentElement.removeAttribute(GLASS_FLOAT_ATTRIBUTE)\n document.documentElement.removeAttribute(GLASS_COMPAT_ATTRIBUTE)\n for (const node of document.querySelectorAll('[data-dsh-glass-fade]')) node.remove()\n this.seamDisposer?.()\n this.seamDisposer = undefined\n }\n\n /** Insert the page-edge fade bands (or reuse the existing ones). */\n private ensureFades(): void {\n if (document.querySelector('[data-dsh-glass-fade]') !== null) return\n const holder = document.createElement('div')\n holder.innerHTML = FADE_MARKUP\n for (const node of Array.from(holder.children)) {\n if (node instanceof HTMLElement) document.body.append(node)\n }\n }\n}\n","/**\n * Catppuccin glass settings row — registered into the General settings\n * section (`settings.general.item`, right under the Catppuccin flavour row).\n * Holds the master on/off switch plus every glass knob: mode (mica /\n * compatibility), blur, frost and backdrop brightness. Every write goes\n * straight through to the glass layer, so the skin moves live.\n */\nimport { useSyncExternalStore } from 'react'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { GlassRowState } from './glass-layer.ts'\nimport css from './GlassRow.module.css'\n\n/** Injected business face: the layer state seat plus every knob write. */\nexport interface GlassRowInjected {\n /** Current layer state snapshot. */\n getState: () => GlassRowState\n /** Subscribe to layer state changes. Returns the disposer. */\n subscribe: (listener: () => void) => () => void\n /** Switch the glass layer on or off. */\n setEnabled: (enabled: boolean) => void\n /** Set the rendering mode ('mica' floating cards or 'compat' stock layout). */\n setMode: (mode: 'mica' | 'compat') => void\n /** Set the glass blur radius, px. */\n setBlur: (value: number) => void\n /** Set the glass frost amount, 0-100. */\n setFrost: (value: number) => void\n /** Set the backdrop brightness, 0-100. */\n setBrightness: (value: number) => void\n /** Restore every knob to the shipped defaults. */\n resetDefaults: () => void\n}\n\n/** Full component props: runtime share + locale seat + injected face. */\nexport type GlassRowProps = PropsRuntime<'settings.general.item'> & PropsLocale<'catppuccin'> & GlassRowInjected\n\n/** One slider + number box, wired to a single value. */\nfunction Knob(props: {\n label: string\n value: number\n min: number\n max: number\n step: number\n unit: string\n onChange: (value: number) => void\n}): React.JSX.Element {\n const { label, value, min, max, step, unit, onChange } = props\n const clamp = (n: number): number => Math.min(max, Math.max(min, Number.isFinite(n) ? n : min))\n return (\n <label className={css.knob}>\n <span className={css.knobLabel}>{label}</span>\n <input\n type=\"range\"\n className={css.slider}\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={(e) => { onChange(clamp(Number(e.target.value))) }}\n />\n <span className={css.numberWrap}>\n <input\n type=\"number\"\n className={css.number}\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={(e) => { onChange(clamp(Number(e.target.value))) }}\n />\n <span className={css.unit}>{unit}</span>\n </span>\n </label>\n )\n}\n\n/** A two-option segmented picker. */\nfunction Segmented<T extends string>(props: {\n label: string\n value: T\n options: readonly { id: T; label: string }[]\n onSelect: (value: T) => void\n}): React.JSX.Element {\n const { label, value, options, onSelect } = props\n return (\n <div className={css.segmented} role=\"group\" aria-label={label}>\n {options.map((option) => (\n <button\n key={option.id}\n type=\"button\"\n className={option.id === value ? css.segActive : css.seg}\n aria-pressed={option.id === value}\n onClick={() => { onSelect(option.id) }}\n >\n {option.label}\n </button>\n ))}\n </div>\n )\n}\n\n/**\n * Render the glass row: title, the master switch, and — while enabled — the\n * mode picker and every knob.\n * @param props - composed slot props.\n * @returns the General section row.\n */\nexport function GlassRow({ t, getState, subscribe, setEnabled, setMode, setBlur, setFrost, setBrightness, resetDefaults }: GlassRowProps): React.JSX.Element {\n const state = useSyncExternalStore(subscribe, getState)\n const { enabled, mode, blur, frost, brightness, dark } = state\n\n // The brightness knob only ever offers the half that makes sense for the\n // resolved scheme: dark mode darkens (0-50), light mode brightens (50-100).\n const bgMin = dark ? 0 : 50\n const bgMax = dark ? 50 : 100\n const bgDisplay = Math.min(bgMax, Math.max(bgMin, brightness))\n\n return (\n <div className={css.group}>\n <div className={css.title}>{t('glass.title')}</div>\n <div className={css.description}>{t('glass.description')}</div>\n <div className={css.controls}>\n <div className={css.row}>\n <span className={css.rowLabel}>{t('glass.enable')}</span>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={enabled}\n aria-label={t('glass.enable')}\n className={enabled ? css.toggleOn : css.toggle}\n onClick={() => { setEnabled(!enabled) }}\n >\n <span className={css.check} aria-hidden=\"true\">{enabled ? '✓' : ''}</span>\n </button>\n </div>\n {enabled && (\n <>\n <div className={css.row}>\n <span className={css.rowLabel}>{t('glass.mode')}</span>\n <Segmented\n label={t('glass.mode')}\n value={mode}\n options={[\n { id: 'mica', label: t('glass.modeMica') },\n { id: 'compat', label: t('glass.modeCompat') },\n ]}\n onSelect={setMode}\n />\n </div>\n <div className={css.rowHint}>{t('glass.modeHint')}</div>\n <Knob label={t('glass.blur')} value={blur} min={0} max={40} step={0.5} unit=\"px\" onChange={setBlur} />\n <Knob label={t('glass.frost')} value={frost} min={0} max={100} step={1} unit=\"%\" onChange={setFrost} />\n <Knob label={t('glass.brightness')} value={bgDisplay} min={bgMin} max={bgMax} step={1} unit=\"%\" onChange={setBrightness} />\n <div className={css.knobHint}>\n {t(dark ? 'glass.brightnessHintDark' : 'glass.brightnessHintLight')}\n </div>\n <div className={css.row}>\n <button type=\"button\" className={css.resetButton} onClick={() => { resetDefaults() }}>\n {t('glass.reset')}\n </button>\n </div>\n </>\n )}\n </div>\n </div>\n )\n}\n","/**\n * Update-check settings row — one General-section preference row that asks\n * the Host's `/catppuccin/check-update` route for the latest published npm\n * version and reports whether this install is current. Detection is Host-side\n * (Node fetch, no CORS, profile probe included); the row renders the verdict\n * and, when an update is available, offers the copyable CLI upgrade command\n * whose profile name the Host already probed. Upgrading itself stays a\n * terminal action (`dsh plugin … add @latest`) — the row never touches the\n * profile workspace.\n */\nimport { useState } from 'react'\nimport type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { UpdateCheckPayload, UpdateErrorCode } from '../update-check.ts'\nimport type { CatppuccinKey } from './locales.ts'\n\n/** Injected business face of the row (assembled in apply). */\nexport interface UpdateRowInjected {\n /** Ask the Host for the update verdict (same-origin fetch of the route). */\n check: () => Promise<UpdateCheckPayload>\n}\n\n/** Full component props: runtime share + locale seat + injected face. */\nexport type UpdateRowProps = PropsRuntime<'settings.general.item'> & PropsLocale<'catppuccin'> & UpdateRowInjected\n\n/** One phase of the row's interaction. */\ntype Phase = 'idle' | 'checking' | 'done'\n\n/** Copy the upgrade command; falls back to no-op when the clipboard is unavailable. */\nasync function copyCommand(text: string): Promise<boolean> {\n try {\n await navigator.clipboard.writeText(text)\n return true\n } catch {\n return false\n }\n}\n\n/** Map a stable error code to its locale key (unknown codes fall back to the generic message). */\nfunction errorKey(code: UpdateErrorCode | undefined): CatppuccinKey {\n switch (code) {\n case 'registry-unreachable': return 'update.err.registry'\n case 'registry-http': return 'update.err.http'\n case 'no-dist-tags': return 'update.err.noTags'\n case 'invalid-response': return 'update.err.invalid'\n case 'network': return 'update.err.network'\n default: return 'update.failed'\n }\n}\n\n/**\n * Render the update-check row: title, description, a check button, and the\n * verdict once checked.\n * @param props - composed slot props.\n * @returns the row element tree.\n */\nexport function UpdateRow({ t, check }: UpdateRowProps): React.JSX.Element {\n const [phase, setPhase] = useState<Phase>('idle')\n const [payload, setPayload] = useState<UpdateCheckPayload | null>(null)\n const [copied, setCopied] = useState(false)\n\n const runCheck = async (): Promise<void> => {\n setPhase('checking')\n setCopied(false)\n try {\n setPayload(await check())\n } catch {\n setPayload({ ok: false, code: 'network', error: 'network' })\n } finally {\n setPhase('done')\n }\n }\n\n const buttonStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n padding: '6px 12px',\n borderRadius: 8,\n border: '1px solid var(--dsw-alias-border-l1)',\n background: 'transparent',\n color: 'var(--dsw-alias-label-primary)',\n cursor: phase === 'checking' ? 'default' : 'pointer',\n font: 'inherit',\n opacity: phase === 'checking' ? 0.6 : 1,\n }\n\n const localInstall = payload?.ok === true && payload.installSource !== undefined\n && payload.installSource !== 'registry'\n // DSH Desktop adapts the copy: its target profile comes from the Desktop\n // service and the hint/restart text says so, while standard dsh web keeps\n // the terminal copy.\n const isDesktop = payload?.ok === true && payload.env === 'desktop'\n\n return (\n <div style={{ borderBottom: '1px solid var(--dsw-alias-border-l2)', display: 'flex', flexDirection: 'column', gap: '10px', padding: '16px 0' }}>\n <div style={{ color: 'var(--dsw-alias-label-primary)', fontSize: 14, lineHeight: '22px' }}>\n {t('update.title')}\n </div>\n <div style={{ color: 'var(--dsw-alias-label-tertiary)', fontSize: 12, lineHeight: '18px' }}>\n {t('update.description')}\n </div>\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '8px', alignItems: 'center' }}>\n <button type=\"button\" disabled={phase === 'checking'} onClick={() => void runCheck()} style={buttonStyle}>\n {phase === 'checking' ? t('update.checking') : t('update.check')}\n </button>\n {payload?.ok === true && payload.current !== undefined && (\n <span style={{ color: 'var(--dsw-alias-label-secondary)', fontSize: 12, lineHeight: '18px' }}>\n {t('update.current')} {payload.current}\n </span>\n )}\n {payload?.ok === true && payload.checkedAt !== undefined && (\n <span style={{ color: 'var(--dsw-alias-label-tertiary)', fontSize: 11, lineHeight: '18px' }}>\n {t('update.checkedAt')} {new Date(payload.checkedAt).toLocaleString()}\n </span>\n )}\n </div>\n\n {phase === 'done' && payload !== null && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px' }}>\n {payload.ok === true ? (\n payload.outdated === true && payload.latest !== undefined ? (\n <>\n <div style={{ color: 'var(--dsw-alias-label-primary)', fontSize: 12, lineHeight: '18px' }}>\n {t('update.available')} <strong>{payload.latest}</strong>\n </div>\n {payload.updateCommand !== undefined && (\n <>\n <div style={{ color: 'var(--dsw-alias-label-tertiary)', fontSize: 12, lineHeight: '18px' }}>\n {isDesktop\n ? t('update.commandHintDesktop').replace('{profile}', payload.profile ?? '')\n : payload.profileDetected === true && payload.profile !== undefined\n ? t('update.commandHintDetected').replace('{profile}', payload.profile)\n : t('update.commandHint')}\n </div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '8px', alignItems: 'center' }}>\n <code style={{\n flex: '1 1 260px',\n padding: '6px 10px',\n borderRadius: 8,\n border: '1px solid var(--dsw-alias-border-l1)',\n background: 'var(--dsw-alias-bg-layer-1)',\n color: 'var(--dsw-alias-label-primary)',\n fontSize: 12,\n lineHeight: '18px',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n }}>\n {payload.updateCommand}\n </code>\n <button\n type=\"button\"\n onClick={() => { void copyCommand(payload.updateCommand ?? '').then(setCopied) }}\n style={{ ...buttonStyle, cursor: 'pointer' }}\n >\n {copied ? t('update.copied') : t('update.copy')}\n </button>\n </div>\n {localInstall && (\n <div style={{ color: 'var(--dsw-alias-label-warning, var(--dsw-alias-label-tertiary))', fontSize: 12, lineHeight: '18px' }}>\n {t('update.localInstall')}\n </div>\n )}\n <div style={{ color: 'var(--dsw-alias-label-tertiary)', fontSize: 12, lineHeight: '18px' }}>\n {t(isDesktop ? 'update.restartHintDesktop' : 'update.restartHint')}\n </div>\n </>\n )}\n </>\n ) : (\n <div style={{ color: 'var(--dsw-alias-label-primary)', fontSize: 12, lineHeight: '18px' }}>\n {t('update.upToDate')}\n </div>\n )\n ) : (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '8px', alignItems: 'center' }}>\n <span style={{ color: 'var(--dsw-alias-label-tertiary)', fontSize: 12, lineHeight: '18px' }}>\n {t(errorKey(payload.code))}\n </span>\n <button type=\"button\" onClick={() => void runCheck()} style={{ ...buttonStyle, cursor: 'pointer' }}>\n {t('update.retry')}\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n )\n}\n","/**\n * Shared contract of the update-check feature — consumed by both halves:\n * the Host registers an exact webServer route answering this JSON payload,\n * and the Client settings row fetches that same-origin route and renders it.\n * This module is dependency-free so both bundles inline it.\n */\nimport { compareVersions, parseVersion } from './versions.ts'\n\n/** The plugin's own npm name (the registry lookup key). */\nexport const PACKAGE_NAME = '@nonamelego/dsh-catppuccin'\n\n/**\n * npm registry abbreviated packument endpoint (the `install-v1` document).\n * The `latest` endpoint alone is not enough: this project ships prereleases\n * under the `beta` dist-tag while `latest` stays on the last stable, so the\n * check reads `dist-tags` to serve both channels.\n */\nexport const REGISTRY_PACKUMENT_URL =\n `https://registry.npmjs.org/${PACKAGE_NAME.replace('/', '%2F')}`\n\n/** Host route the Client row fetches (exact match, same origin). */\nexport const UPDATE_ROUTE_PATH = '/catppuccin/check-update'\n\n/** Network budget for the Host's registry lookup. */\nexport const UPDATE_FETCH_TIMEOUT_MS = 8000\n\n/** Release channels the check knows about. */\nexport type UpdateChannel = 'latest' | 'beta'\n\n/** The `dist-tags` object of an npm packument. */\nexport interface DistTags {\n latest?: string\n beta?: string\n}\n\n/** The newest release a given install should chase, and on which channel. */\nexport interface NewestRelease {\n version: string\n channel: UpdateChannel\n}\n\n/**\n * The copyable CLI upgrade command for one channel (`dsh plugin` is a thin\n * pnpm forwarder). The profile name comes from the Host's runtime probe\n * (`src/profile-detect.ts`), never hard-coded, so the command works on any\n * deployment out of the box.\n * @param channel - the dist-tag to chase.\n * @param profile - the DSH profile name to target.\n */\nexport function updateCommandFor(channel: UpdateChannel, profile: string): string {\n return `dsh plugin --profile ${profile} add ${PACKAGE_NAME}@${channel}`\n}\n\n/**\n * Pick the newest release worth reporting for the given install:\n * - a stable install only chases the `latest` tag (never downgrades onto a\n * beta), so a stable user on the last stable sees \"up to date\";\n * - a prerelease install (e.g. a `beta`-tagged version) also chases `beta`,\n * so beta users see newer betas — and a stable release that outranks their\n * prerelease promotes them via `@latest`.\n * @param current - the installed version.\n * @param tags - the registry's dist-tags.\n * @returns the newest candidate and its channel, or null when nothing applies.\n */\nexport function selectNewest(current: string, tags: DistTags): NewestRelease | null {\n const candidates: NewestRelease[] = []\n if (tags.latest !== undefined) candidates.push({ version: tags.latest, channel: 'latest' })\n const parsed = parseVersion(current)\n if (tags.beta !== undefined && parsed !== null && parsed.prerelease.length > 0) {\n candidates.push({ version: tags.beta, channel: 'beta' })\n }\n if (candidates.length === 0) return null\n let best = candidates[0]\n for (const candidate of candidates.slice(1)) {\n if (compareVersions(best.version, candidate.version) < 0) best = candidate\n }\n return best\n}\n\n/** Stable machine-readable outcome code (borrowed from the plugin-update\n * error-code discipline of dsh-vision-toolkit): the Client maps it to copy\n * instead of sniffing human text. */\nexport type UpdateErrorCode =\n | 'ok'\n | 'network' // the same-origin fetch itself failed (client side)\n | 'registry-unreachable' // npm registry could not be reached or timed out\n | 'registry-http' // registry answered with a non-2xx status\n | 'no-dist-tags' // registry returned no usable dist-tags\n | 'invalid-response' // registry response could not be parsed\n\n/** How this package is installed inside the probed DSH profile. */\nexport type InstallSource = 'registry' | 'link' | 'file' | 'git' | 'unknown'\n\n/** Runtime that answered the check — drives the copy (command hint / restart). */\nexport type UpdateEnv = 'desktop' | 'web'\n\n/**\n * JSON payload of the update check. `ok: false` carries a human-readable\n * `error` plus a stable `code`; `ok: true` carries the comparison result.\n * The Host owns the semver comparison, the channel selection, and the\n * profile probe (single source of truth), so the Client never parses\n * versions or guesses the profile name itself.\n */\nexport interface UpdateCheckPayload {\n /** Whether the registry lookup succeeded. */\n ok: boolean\n /** Installed version (from this package's own manifest). */\n current?: string\n /** Newest release worth chasing (`latest`, plus `beta` for prerelease installs). */\n latest?: string\n /** `latest` is strictly newer than `current`. */\n outdated?: boolean\n /** The dist-tag the newest release came from. */\n channel?: UpdateChannel\n /** Copyable CLI upgrade command (present when outdated). */\n updateCommand?: string\n /** DSH profile name the upgrade command targets (probed, not guessed). */\n profile?: string\n /** Whether the profile probe actually found the install (false = fallback). */\n profileDetected?: boolean\n /** Runtime that answered: DSH Desktop vs standard dsh web (drives copy). */\n env?: UpdateEnv\n /** How the package is installed in that profile (drives copy). */\n installSource?: InstallSource\n /** ISO timestamp of the check (registry lookup moment). */\n checkedAt?: string\n /** Stable outcome code (see {@link UpdateErrorCode}). */\n code?: UpdateErrorCode\n /** Failure detail (only when `ok` is false). */\n error?: string\n}\n","/**\n * Durable Catppuccin state — the shared contract between the two halves.\n *\n * Why this exists: DSH Desktop launches `@deepseek-ai/dsh` with `--port 0`\n * (a fresh random loopback port every launch), and localStorage is scoped per\n * origin including the port. So a flavour/glass choice persisted only in\n * localStorage is silently lost on every Desktop restart — the GUI boots on a\n * brand-new origin where the storage is empty. The other Desktop surfaces that\n * DO persist (the skin centre's active choice) are written by the host to a\n * file under the DSH home (`cordis.patch.yml`), which is port-independent.\n *\n * The fix mirrors that proven pattern: the Host keeps a tiny JSON file at\n * `$DSH_HOME/catppuccin-state.json`, and the Client reads/updates it through\n * two same-origin webServer routes (exactly the update-check pattern). The\n * file is the source of truth; browser localStorage stays as the instant\n * in-browser cache and cross-tab sync. This module is dependency-free so both\n * bundles inline it (like `update-check.ts`).\n */\nexport const STATE_VERSION = 1\n\n/** Host route answering the durable state (GET reads, PUT writes). */\nexport const STATE_ROUTE_PATH = '/catppuccin/state'\n\n/** State file name under the DSH home (kept next to the Desktop-managed\n * `cordis.patch.yml` so it survives the Desktop's per-launch port churn). */\nexport const STATE_FILENAME = 'catppuccin-state.json'\n\n/** The four registered Catppuccin theme ids. MUST stay in sync with the\n * `themeId` of `CATPPUCCIN_FLAVORS` in `src/client/palettes.ts` — guarded by\n * `tests/state.spec.ts` — because the persisted flavour value IS the theme id. */\nexport const CATPPUCCIN_THEME_IDS = [\n 'catppuccin-latte',\n 'catppuccin-frappe',\n 'catppuccin-macchiato',\n 'catppuccin-mocha',\n] as const\n\n/** A persisted flavour choice: one registered theme id or `off` (fall back to\n * the official theme). */\nexport type FlavorValue = (typeof CATPPUCCIN_THEME_IDS)[number] | 'off'\n\n/** Durable glass-layer settings (no derived `dark` field — that resolves at\n * runtime from the active theme). */\nexport interface GlassState {\n /** Layer enable flag. */\n enabled: boolean\n /** Rendering mode. */\n mode: 'mica' | 'compat'\n /** Glass blur radius, px (0-40). */\n blur: number\n /** Glass fill frost, 0-100. */\n frost: number\n /** Backdrop brightness, 0-100. */\n brightness: number\n}\n\n/** The whole durable state the plugin persists. */\nexport interface CatppuccinState {\n /** Schema version; anything else is treated as unknown and defaulted. */\n version: typeof STATE_VERSION\n /** Selected flavour (theme id or `off`). */\n flavor: FlavorValue\n /** Glass-layer settings (enable flag + knobs). */\n glass: GlassState\n}\n\n/** Shipped glass defaults — aligned with `SETTINGS_DEFAULTS` in\n * `src/client/glass/glass-layer.ts` (guarded by `tests/state.spec.ts`). */\nexport const DEFAULT_GLASS: GlassState = {\n enabled: false,\n mode: 'mica',\n blur: 2,\n frost: 20,\n brightness: 50,\n}\n\n/** A fully default state: no Catppuccin flavour and no glass. */\nexport function defaultState(): CatppuccinState {\n return {\n version: STATE_VERSION,\n flavor: 'off',\n glass: { ...DEFAULT_GLASS },\n }\n}\n\n/** Clamp a finite number into [min, max]; non-finite values fall back. */\nfunction clampFinite(value: unknown, min: number, max: number, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value)\n ? Math.min(max, Math.max(min, value))\n : fallback\n}\n\n/**\n * Normalize arbitrary input (JSON from disk or the wire) into a valid state:\n * unknown/missing fields fall back to defaults, out-of-range numbers clamp,\n * and unknown flavours/invalid enums fall back too. The Host applies this on\n * both read and write so a corrupt file or a hand-crafted payload can never\n * poison the plugin's settings.\n */\nexport function sanitizeState(input: unknown): CatppuccinState {\n const state = defaultState()\n if (typeof input !== 'object' || input === null) return state\n const raw = input as Record<string, unknown>\n\n const flavor = raw.flavor\n if (typeof flavor === 'string' && (CATPPUCCIN_THEME_IDS as readonly string[]).includes(flavor)) {\n state.flavor = flavor as FlavorValue\n } else if (flavor === 'off') {\n state.flavor = 'off'\n }\n\n const glass = typeof raw.glass === 'object' && raw.glass !== null\n ? raw.glass as Record<string, unknown>\n : {}\n state.glass.enabled = glass.enabled === true\n state.glass.mode = glass.mode === 'compat' ? 'compat' : 'mica'\n state.glass.blur = clampFinite(glass.blur, 0, 40, DEFAULT_GLASS.blur)\n state.glass.frost = clampFinite(glass.frost, 0, 100, DEFAULT_GLASS.frost)\n state.glass.brightness = clampFinite(glass.brightness, 0, 100, DEFAULT_GLASS.brightness)\n\n return state\n}\n\n/** Whether a normalized state carries nothing beyond the shipped defaults —\n * i.e. the user never actually chose anything worth persisting. Used to tell\n * \"no durable state yet\" apart from \"an explicit default choice\". */\nexport function isDefaultState(state: CatppuccinState): boolean {\n const expected = defaultState()\n return state.flavor === expected.flavor\n && state.glass.enabled === expected.glass.enabled\n && state.glass.mode === expected.glass.mode\n && state.glass.blur === expected.glass.blur\n && state.glass.frost === expected.glass.frost\n && state.glass.brightness === expected.glass.brightness\n}\n","/**\n * Browser half of the durable Catppuccin state — a thin wrapper over the\n * Host's `/catppuccin/state` route (same-origin relative fetch, so it works on\n * DSH Desktop's per-launch random loopback port). The Host file is the source\n * of truth; this module adds the fetch wrapper plus a debounced trailing\n * writer so rapid knob drags coalesce into a single PUT. Every failure is\n * non-fatal: the plugin keeps working from browser localStorage alone.\n */\nimport { STATE_ROUTE_PATH, sanitizeState, type CatppuccinState } from '../state.ts'\n\n/** Outcome of reading the durable state from the Host. */\nexport interface DurableReadResult {\n /** Whether the route answered at all (false = fall back to localStorage-only). */\n available: boolean\n /** The stored state, or null when nothing durable has been written yet. */\n state: CatppuccinState | null\n}\n\n/** Read the durable state from the Host file (same-origin GET). */\nexport async function readDurableStateRemote(): Promise<DurableReadResult> {\n try {\n const response = await fetch(STATE_ROUTE_PATH, { headers: { accept: 'application/json' } })\n if (!response.ok) return { available: false, state: null }\n const payload = await response.json() as { ok?: boolean; state?: unknown }\n if (payload.ok !== true) return { available: false, state: null }\n return { available: true, state: payload.state === null || payload.state === undefined\n ? null\n : sanitizeState(payload.state) }\n } catch {\n return { available: false, state: null }\n }\n}\n\n/** Write the durable state to the Host file (same-origin PUT). */\nexport async function persistDurableState(state: CatppuccinState): Promise<boolean> {\n try {\n const response = await fetch(STATE_ROUTE_PATH, {\n method: 'PUT',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify(sanitizeState(state)),\n })\n return response.ok\n } catch {\n return false\n }\n}\n\nlet pendingTimer: number | undefined\nlet pendingGetState: (() => CatppuccinState) | undefined\n\n/**\n * Debounced trailing persist: after a burst of changes (a slider drag emits a\n * stream of snapshot updates) the latest state is written to the Host once,\n * a short beat after the last change. Pass an accessor so the snapshot is\n * taken at flush time, never stale.\n */\nexport function scheduleDurablePersist(getState: () => CatppuccinState, delayMs = 300): void {\n if (pendingTimer !== undefined) window.clearTimeout(pendingTimer)\n pendingGetState = getState\n pendingTimer = window.setTimeout(() => {\n pendingTimer = undefined\n const state = pendingGetState\n pendingGetState = undefined\n if (state !== undefined) void persistDurableState(state()).catch(() => { /* best-effort */ })\n }, delayMs)\n}\n\n/** Drop any queued persist (plugin unload / page teardown). */\nexport function cancelDurablePersist(): void {\n if (pendingTimer !== undefined) window.clearTimeout(pendingTimer)\n pendingTimer = undefined\n pendingGetState = undefined\n}\n","/**\n * Catppuccin themes for the DeepSeek Harness web GUI — browser half.\n *\n * Registers the four Catppuccin flavours (Latte light / Frappé, Macchiato,\n * Mocha dark) into the official ThemeRuntime, so they become selectable\n * themes whose --dsw-* token overrides fully remap the UI palette. The\n * official Appearance row persists only the built-in light/dark/system\n * preferences, so this plugin also owns a settings row (\"Catppuccin\") that\n * lists the four flavours; selecting one switches the theme and persists the\n * flavour.\n *\n * Persistence is two-tier. The choice lives in two stores:\n * - localStorage keys (`dsh.catppuccin.*`) — the in-browser cache: instant\n * restore at boot and the cross-tab `storage` event bus;\n * - the Host durable file (`$DSH_HOME/catppuccin-state.json`, served by\n * `/catppuccin/state`, written by `src/host-state.ts`) — the source of\n * truth. It exists because DSH Desktop launches `@deepseek-ai/dsh` with\n * `--port 0` (a fresh random loopback port every launch) and localStorage\n * is scoped per origin including the port, so a localStorage-only choice\n * is silently emptied on every Desktop restart. The Host settings wire is\n * not used: it only serves an explicit allowlist of namespaces (a\n * plugin-owned namespace answers `settings-not-exposed`).\n * At boot the plugin fast-applies localStorage, then hydrates the Host file\n * and mirrors it back into localStorage; if the Host has nothing but this\n * browser session already chose something, that choice is migrated to the\n * Host. Every user change is written to localStorage immediately and pushed to\n * the Host (debounced) so it survives the next Desktop restart.\n */\nimport type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { ThemeRuntime, ThemeTokens } from '@deepseek-ai/dsh-client-ui-theme/client'\n// Type-only: pulls the locale plugin's Context merge (ctx.locale).\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\n// Type-only: pulls the settings-surface SlotMap merge (settings.general.item).\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport { CatppuccinRow, type CatppuccinRowInjected } from './CatppuccinRow.tsx'\nimport { en, zh, type CatppuccinKey } from './locales.ts'\nimport { CATPPUCCIN_FLAVORS, type CatppuccinFlavorId, type CatppuccinFlavorInfo } from './palettes.ts'\nimport { SHIKI_TOKENS } from './shiki-tokens.ts'\nimport { GlassLayer } from './glass/glass-layer.ts'\nimport { GlassRow, type GlassRowInjected } from './glass/glass-row.tsx'\nimport { UpdateRow, type UpdateRowInjected } from './UpdateRow.tsx'\nimport type { UpdateCheckPayload } from '../update-check.ts'\nimport { UPDATE_ROUTE_PATH } from '../update-check.ts'\nimport {\n isDefaultState,\n STATE_VERSION,\n type CatppuccinState,\n type FlavorValue,\n} from '../state.ts'\nimport {\n cancelDurablePersist,\n readDurableStateRemote,\n scheduleDurablePersist,\n} from './state-sync.ts'\n// Side-effect import: the glass stylesheet (auto-injected as a plugin-owned\n// <style> tag; every rule is gated on the data-dsh-glass attribute).\nimport './glass/glass.module.css'\n\n/** Locale namespace owned by this plugin. */\nexport const NS = 'catppuccin'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n /** The Catppuccin settings row's copy. */\n catppuccin: CatppuccinKey\n }\n}\n\n/** localStorage key carrying the persisted flavour choice. */\nexport const FLAVOR_STORAGE_KEY = 'dsh.catppuccin.flavor'\n\n/** Accepted flavour values — the four registered theme ids plus `off`. These\n * MUST stay in sync with the registered themes (guarded by\n * tests/palettes.spec.ts) because the persisted value is the theme id. */\nexport const CATPPUCCIN_FLAVOR_VALUES = [\n ...CATPPUCCIN_FLAVORS.map((f) => f.themeId),\n 'off',\n] as const\n\n/** `off` means: fall back to the official theme (default). */\nexport type FlavorChoice = (typeof CATPPUCCIN_FLAVOR_VALUES)[number]\n\n/** The flavour whose themeId this is, or `off`. */\nexport function flavorFromThemeId(themeId: string): FlavorChoice {\n return CATPPUCCIN_FLAVORS.some((f) => f.themeId === themeId) ? themeId as FlavorChoice : 'off'\n}\n\n/** The flavour registered for a theme id, or undefined when not a Catppuccin theme. */\nexport function flavorInfo(themeId: string): CatppuccinFlavorInfo | undefined {\n return CATPPUCCIN_FLAVORS.find((f) => f.themeId === themeId)\n}\n\n/** Read the persisted flavour (absent / unknown values mean the default `off`). */\nexport function readFlavor(): FlavorChoice {\n try {\n const raw = localStorage.getItem(FLAVOR_STORAGE_KEY)\n return raw !== null && (CATPPUCCIN_FLAVOR_VALUES as readonly string[]).includes(raw)\n ? raw as FlavorChoice\n : 'off'\n } catch {\n return 'off'\n }\n}\n\n/** Persist the flavour choice (storage failures keep the in-memory state). */\nexport function writeFlavor(choice: FlavorChoice): void {\n try {\n localStorage.setItem(FLAVOR_STORAGE_KEY, choice)\n } catch {\n /* in-memory state still applies for this tab */\n }\n}\n\n/** Required services: slots + locale (settings rows) and theme (register + switch). */\nexport const inject = ['slots', 'locale', 'theme']\n\n/**\n * Register the Catppuccin dictionaries, the four flavour themes, and the\n * settings row.\n * @param ctx - client root context.\n */\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'catppuccin: dictionaries')\n\n const theme = ctx.get('theme') as ThemeRuntime\n\n // Register the four flavour themes. Each carries the full --dsw-* token\n // dictionary for its flavour plus the Catppuccin syntax-highlighting\n // (--shiki-*) tokens; the presenter applies them as body inline variables\n // when the theme is active.\n ctx.effect(() => {\n const disposers = CATPPUCCIN_FLAVORS.map((flavor) => {\n // Flavour id for the shiki token lookup: themeId is \"catppuccin-latte\"\n // → key is \"latte\".\n const flavorId = flavor.themeId.replace('catppuccin-', '') as CatppuccinFlavorId\n const shiki = SHIKI_TOKENS[flavorId]\n return theme.register({\n id: flavor.themeId,\n colorScheme: flavor.colorScheme,\n tokens: { ...flavor.tokens, ...shiki } as ThemeTokens,\n })\n })\n return () => {\n for (const dispose of disposers) dispose()\n }\n }, 'catppuccin: flavour themes')\n\n // The glass layer: a toggleable glassmorphism skin on top of the Catppuccin\n // themes. It owns its lifecycle (enable flag + knobs persist in\n // localStorage as the in-browser cache; the durable copy is the Host file\n // hydrated/pushed below; every effect is released with this fiber). It is\n // created before the boot-restore effect so hydration can overlay the\n // persisted glass state onto the layer.\n const glass = new GlassLayer(ctx)\n\n // The current durable snapshot: flavour from the localStorage cache (the\n // authoritative write target of the settings row) plus the glass layer's\n // remote state. Passed to the debounced Host persist by reference so the\n // flush always captures the freshest values.\n const buildLocalState = (): CatppuccinState => ({\n version: STATE_VERSION,\n // `FlavorChoice` widens to `string` (palettes carry `themeId: string`), but\n // the runtime value is always one of the four theme ids or `off` — the\n // same set as `FlavorValue`, guarded by tests/state.spec.ts.\n flavor: readFlavor() as FlavorValue,\n glass: glass.getRemoteState(),\n })\n\n // Restore the persisted choice and defend it against the built-in\n // Appearance scope's `adopt()`. Two stores feed the desired flavour:\n // localStorage (the in-browser cache — instant at boot and the cross-tab\n // `storage` bus) and the Host's durable state file (the source of truth —\n // required by DSH Desktop, which boots on a fresh random loopback port every\n // launch so localStorage there always starts empty).\n //\n // The re-assert is not a fixed boot window. The built-in ThemeRuntime's\n // `adopt()` re-applies the settings-document preference — defaulting to\n // \"system\" when `ui-theme.preference` was never written — on every settings\n // reload, and switching the model always reloads the settings document. So\n // we keep listening and restore our flavour whenever the runtime preference\n // falls back to \"system\" (the only built-in value adopt() writes back);\n // explicit `light`/`dark` picks win, and choosing \"off\" in the Catppuccin\n // row clears the persisted flavour before the switch so this guard does not\n // fight it.\n ctx.effect(() => {\n const applyDesired = (): void => {\n const desired = readFlavor()\n if (desired === 'off') return\n const preference = theme.getTheme().preference\n if (preference === desired) return\n // Only \"system\" among the built-in preferences is the never-explicitly-\n // chosen default that adopt() writes back on a settings-document reload;\n // restore our flavour then. A user's explicit light/dark choice wins.\n if (preference !== 'system') return\n try {\n theme.setTheme(desired)\n } catch {\n // Theme not registered yet — a later theme/change re-runs applyDesired.\n }\n }\n applyDesired()\n const disposer = ctx.on('theme/change', applyDesired)\n const onStorage = (event: StorageEvent): void => {\n if (event.key !== FLAVOR_STORAGE_KEY) return\n const next = readFlavor()\n if (next !== 'off') {\n try {\n theme.setTheme(next)\n } catch {\n /* unknown persisted value — keep the current theme */\n }\n }\n }\n window.addEventListener('storage', onStorage)\n\n // Any glass change (enable flag or knob) coalesces into one durable write.\n const offGlass = glass.subscribe(() => {\n scheduleDurablePersist(buildLocalState)\n })\n\n // Hydrate the durable source of truth without blocking paint. The Host\n // file read is same-origin and answers in ms; if it ever arrives later\n // the fast path keeps working.\n let cancelled = false\n void readDurableStateRemote().then((result) => {\n if (cancelled) return\n if (!result.available) return // route missing — localStorage-only still works\n if (result.state === null) {\n // Nothing durable yet. If this browser session already chose something\n // (e.g. a localStorage-only preference from before this fix), migrate\n // it to the Host so it survives a later Desktop restart.\n if (!isDefaultState(buildLocalState())) scheduleDurablePersist(buildLocalState)\n return\n }\n // Durable state is the source of truth: overlay it, mirror it into\n // localStorage (fast restore + cross-tab for later starts) and re-assert.\n writeFlavor(result.state.flavor)\n glass.applyRemote(result.state.glass)\n applyDesired()\n })\n\n return () => {\n cancelled = true\n offGlass()\n disposer()\n window.removeEventListener('storage', onStorage)\n cancelDurablePersist()\n }\n }, 'catppuccin: theme restore')\n\n const injected = (): CatppuccinRowInjected => ({\n themes: CATPPUCCIN_FLAVORS.map((flavor) => ({\n id: flavor.themeId,\n label: flavor.label,\n accent: flavor.accent,\n })),\n current: () => {\n const pref = theme.getTheme().preference\n return flavorFromThemeId(pref)\n },\n subscribe: (listener) => ctx.on('theme/change', listener),\n select: (choice: FlavorChoice) => {\n if (choice === 'off') {\n // Revert to the official default (system-following). Persist the\n // abandoned choice BEFORE setTheme: setTheme emits theme/change\n // synchronously, so the restore guard must already read `off` here\n // and not re-assert the previous flavour.\n writeFlavor('off')\n theme.setTheme('system')\n scheduleDurablePersist(buildLocalState)\n return\n }\n const flavor = flavorInfo(choice)\n if (!flavor) return\n // Persist first so the restore guard (a theme/change listener) sees the\n // new flavour when setTheme below emits synchronously.\n writeFlavor(flavor.themeId)\n theme.setTheme(flavor.themeId)\n scheduleDurablePersist(buildLocalState)\n },\n })\n\n ctx.slots.inject('settings.general.item', () => ctx.slots.register({\n name: 'settings.general.item',\n id: 'catppuccin',\n order: 20,\n locale: NS,\n inject: injected,\n }, CatppuccinRow))\n\n const glassInjected = (): GlassRowInjected => ({\n getState: () => glass.getSnapshot(),\n subscribe: (listener) => glass.subscribe(listener),\n setEnabled: (enabled) => { glass.setEnabled(enabled) },\n setMode: (mode) => { glass.setMode(mode) },\n setBlur: (blur) => { glass.setBlur(blur) },\n setFrost: (frost) => { glass.setFrost(frost) },\n setBrightness: (brightness) => { glass.setBrightness(brightness) },\n resetDefaults: () => { glass.resetDefaults() },\n })\n\n ctx.slots.inject('settings.general.item', () => ctx.slots.register({\n name: 'settings.general.item',\n id: 'catppuccin-glass',\n order: 21,\n locale: NS,\n inject: glassInjected,\n }, GlassRow))\n\n // Update check: the Host owns the npm lookup (Node fetch, no CORS); the row\n // only fetches the same-origin route and renders the verdict. Upgrade stays\n // a terminal action — the row just surfaces the CLI command.\n const updateInjected = (): UpdateRowInjected => ({\n check: async () => {\n try {\n const response = await fetch(UPDATE_ROUTE_PATH, { headers: { accept: 'application/json' } })\n return await response.json() as UpdateCheckPayload\n } catch {\n return { ok: false, code: 'network', error: 'network' }\n }\n },\n })\n\n ctx.slots.inject('settings.general.item', () => ctx.slots.register({\n name: 'settings.general.item',\n id: 'catppuccin-update',\n order: 22,\n locale: NS,\n inject: updateInjected,\n }, UpdateRow))\n}\n"],"mappings":"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"}
package/lib/index.js CHANGED
@@ -3,7 +3,7 @@ import { basename, dirname, join } from "node:path";
3
3
  import { readFile, readdir } from "node:fs/promises";
4
4
  import { homedir } from "node:os";
5
5
  //#region package.json
6
- var version = "0.2.8";
6
+ var version = "0.2.9";
7
7
  //#endregion
8
8
  //#region src/versions.ts
9
9
  /** Parse a semver string, or null when it is not `v?x.y.z[-pre][+build]`. */
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nonamelego/dsh-catppuccin",
3
3
  "description": "Catppuccin themes + a toggleable glassmorphism skin for the DeepSeek Harness web GUI — Latte, Frappé, Macchiato and Mocha registered into the official theme system (Appearance settings), fully remapping the --dsw-* token ladder, with adjustable frosted glass for the top bar, sidebar, composer, stats line and trajectory view.",
4
- "version": "0.2.8",
4
+ "version": "0.2.9",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
7
7
  "repository": {