@deepseek-ai/dsh-client-ui-theme 0.1.0-rc.7 → 0.1.1-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.i18n.yaml CHANGED
@@ -2,5 +2,5 @@
2
2
  # side as of the last confirmed-consistent state. Both languages carry equal authority;
3
3
  # after editing either side, bring the other along and re-record with:
4
4
  # pnpm run verify-translation-pairing --write packages/client/ui-theme/README.md
5
- README.md: e84a21f085eaef7546321edc90847a9a3f9bb2b8
6
- README.zh.md: 758b6f52d330f4518a2df5267117b61446102ea7
5
+ README.md: a9f0eb428789bc117e2fcbbdd2366066e0b994cc
6
+ README.zh.md: 1447536c3e12a415c3ca241e4fe04a636ecaa6fd
package/README.md CHANGED
@@ -6,7 +6,7 @@ Theme plugin: ThemeRuntime over the --dsw-* token base stylesheets (static scale
6
6
 
7
7
  When the host composition includes an HTTP server, the host half injects a synchronous bootstrap immediately after the opening `<body>` tag. Each index response embeds the registered Host setting for `ui-theme.preference`, or `system` when no settings provider is present; the browser resolves `system` from the OS scheme, then sets `color-scheme` and `body[data-ds-dark-theme]` before the shell loading page renders. Compositions without an HTTP server remain unaffected, and ThemeRuntime and ui-layout remain authoritative for client state and subsequent DOM updates after the plugin tree activates.
8
8
 
9
- `src/styles/` holds five sheets, all imported by the web shell's `base.css`: `base.css`, `design-platform.css`, `scrollbar.css`, `gradient-shadow-text.css`, and `shiki.css`. `scrollbar.css` is the sole consumer of the `--dsw-alias-scrollbar-*` tokens and must follow `design-platform.css`, which declares them.
9
+ `src/styles/` holds five sheets imported in order by ui-theme's dynamic client entry: `base.css`, `design-platform.css`, `scrollbar.css`, `gradient-shadow-text.css`, and `shiki.css`. The client bundle compiles and injects them as plugin-owned global styles, so unload and HMR remove them with ui-theme instead of leaving theme CSS in the static web shell. `scrollbar.css` is the sole consumer of the `--dsw-alias-scrollbar-*` tokens and must follow `design-platform.css`, which declares them.
10
10
 
11
11
  Scrollbar rebinding contract: `scrollbar.css` binds `--dsh-scrollbar-thumb` and `--dsh-scrollbar-thumb-hover` on `body` to the l1 (base-surface) tokens, and both rendering paths read that pair. An elevated surface (menu, popover, dialog) sets `--dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2)` and `--dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2)` on its own container; one rebind retints whichever path the engine took. The pair's other legal target is `transparent`, which draws no thumb at all — [ui-sidebar](../ui-sidebar/README.md) rebinds its column that way while the pointer is elsewhere. A rebind to the l1 pair is not a rebind; it restates the base-surface default. `--dsh-scrollbar-width` mirrors the WebKit bar's layout width for surfaces that align themselves beside a space-consuming bar — [ui-conversation](../ui-conversation/README.md) reads it for the overlay composer seat's `right` offset — and the scrollbar-styles spec pairs it with the mirrored rule and the consumer.
12
12
 
package/README.zh.md CHANGED
@@ -2,15 +2,15 @@
2
2
 
3
3
  [English](README.md) | 中文
4
4
 
5
- 主题插件:基于 --dsw-* token 基础样式表(静态尺度 + 别名语义层)的 ThemeRuntime。该服务拥有实时主题偏好(`light`/`dark`/`system`),将 `system` 通过 `prefers-color-scheme` 解析为实际主题,并发布不可变的 `ThemeSnapshot`,通过 `theme/change` 事件通知变化;它绝不接触 DOM:ui-layout 的呈现器会应用解析后的快照(`html { color-scheme }`、`body[data-ds-dark-theme]`,以及主题的别名 token 内联变量)。来自回环地址的浏览器会先以 `system` 立即提供该服务,随后在后台加载 `ui-theme.preference`,并将每次内置主题选择通过 Host settings API 写入;其本地提供方默认将设置存入 `$DSH_HOME/settings.yaml`。收到推送的 settings 变更时或重连后,浏览器都会重新拉取该设置;连续快速选择会按操作顺序携带 namespace revision 串行写入,最新写入被拒时则重新加载持久化值。远程浏览器无法访问特权 settings API,因此它的选择仅保留在进程内。已注册的第三方主题 id 仍是进程内扩展,不会跨越内置 settings schema;移除其中任意一个都绝不会覆盖最后一个持久化的内置偏好。该持久化边界由[Host settings 支撑的偏好决策](../../../.agents/notes/implemented/bug-fix/2026-08-06-host-backed-web-preferences.md)拥有。
5
+ 主题插件:基于 --dsw-* token 基础样式表(静态尺度 + 别名语义层)的 ThemeRuntime。该服务拥有实时主题偏好(`light`/`dark`/`system`),将 `system` 通过 `prefers-color-scheme` 解析为实际主题,并发布不可变的 `ThemeSnapshot`,通过 `theme/change` 事件通知变化;它绝不接触 DOM:ui-layout 的呈现器会应用解析后的快照(`html { color-scheme }`、`body[data-ds-dark-theme]`,以及主题的别名 token 内联变量)。来自回环地址的浏览器会先以 `system` 立即提供该服务,随后在后台加载 `ui-theme.preference`,并将每次内置主题选择通过 Host settings API 写入;其本地提供方默认将设置存入 `$DSH_HOME/settings.yaml`。收到推送的 settings 变更时或重连后,浏览器都会重新拉取该设置;连续快速选择会按操作顺序携带 namespace revision 串行写入,最新写入被拒时则重新加载持久化值。远程浏览器无法访问特权 settings API,因此它的选择仅保留在进程内。已注册的第三方主题 id 仍是进程内扩展,不会跨越内置 settings schema;移除其中任意一个都绝不会覆盖最后一个持久化的内置偏好。该持久化边界由[Host settings 支撑的偏好决策](../../../.agents/notes/implemented/bug-fix/2026-08-06-host-backed-web-preferences.zh.md)拥有。
6
6
 
7
7
  当主机组合包含 HTTP 服务器时,主机侧紧接 `<body>` 起始标签注入同步引导代码。每份 index 响应会嵌入已注册的 Host 设置 `ui-theme.preference`,没有 settings provider 时则嵌入 `system`;浏览器按操作系统配色解析 `system`,随后在外壳加载页面渲染前设置 `color-scheme` 和 `body[data-ds-dark-theme]`。不含 HTTP 服务器的组合不受影响,插件树激活后,ThemeRuntime 与 ui-layout 仍分别是客户端状态和后续 DOM 更新的权威来源。
8
8
 
9
- `src/styles/` 下有五张样式表,全部由 web 壳的 `base.css` 导入:`base.css`、`design-platform.css`、`scrollbar.css`、`gradient-shadow-text.css` 与 `shiki.css`。`scrollbar.css` 是 `--dsw-alias-scrollbar-*` token 的唯一消费方,必须排在声明这些 token 的 `design-platform.css` 之后。
9
+ `src/styles/` 下有五张样式表,由 ui-theme 的动态客户端 entry 依次导入:`base.css`、`design-platform.css`、`scrollbar.css`、`gradient-shadow-text.css` 与 `shiki.css`。客户端 bundle 将其编译并注入为插件持有的全局样式,因此卸载与 HMR 会随 ui-theme 一同移除这些样式,而不会把主题 CSS 留在静态 Web 外壳中。`scrollbar.css` 是 `--dsw-alias-scrollbar-*` token 的唯一消费方,必须排在声明这些 token 的 `design-platform.css` 之后。
10
10
 
11
- 滚动条重新绑定约定:`scrollbar.css` 在 `body` 上把 `--dsh-scrollbar-thumb` 与 `--dsh-scrollbar-thumb-hover` 绑定到 l1(基础表面)token,两条渲染路径都读取这一组变量。高层级表面(菜单、浮层、对话框)在自己的容器上设置 `--dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2)` 与 `--dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2)`;一次重新绑定即可为引擎实际走的那条路径换色。这组变量的另一个合法目标是 `transparent`,即完全不绘制滑块——[ui-sidebar](../ui-sidebar/README.md) 在指针不在栏内时就这样重新绑定自己的列。绑回 l1 那组不算重新绑定,它只是重述基础表面的默认值。`--dsh-scrollbar-width` 镜像 WebKit 滚动条的布局宽度,供需要与占布局宽度的滚动条对齐的表面使用——[ui-conversation](../ui-conversation/README.md) 用它作为覆盖 composer 座位 `right` 偏移——scrollbar-styles 规格把它与镜像规则及消费者配对检查。
11
+ 滚动条重新绑定约定:`scrollbar.css` 在 `body` 上把 `--dsh-scrollbar-thumb` 与 `--dsh-scrollbar-thumb-hover` 绑定到 l1(基础表面)token,两条渲染路径都读取这一组变量。高层级表面(菜单、浮层、对话框)在自己的容器上设置 `--dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2)` 与 `--dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2)`;一次重新绑定即可为引擎实际走的那条路径换色。这组变量的另一个合法目标是 `transparent`,即完全不绘制滑块——[ui-sidebar](../ui-sidebar/README.zh.md) 在指针不在栏内时就这样重新绑定自己的列。绑回 l1 那组不算重新绑定,它只是重述基础表面的默认值。`--dsh-scrollbar-width` 镜像 WebKit 滚动条的布局宽度,供需要与占布局宽度的滚动条对齐的表面使用——[ui-conversation](../ui-conversation/README.zh.md) 用它作为覆盖 composer 座位 `right` 偏移——scrollbar-styles 规格把它与镜像规则及消费者配对检查。
12
12
 
13
- 两条路径在构造上互斥。`scrollbar-width`/`scrollbar-color` 写在 `@supports not selector(::-webkit-scrollbar)` 之内,因为这两个属性中的任一个只要取非 `auto` 值,Chromium 与 Safari 就会丢弃该元素上的全部 `::-webkit-scrollbar*` 规则,`::-webkit-scrollbar-thumb:hover` 也在其中——若无条件地同时声明,`--dsh-scrollbar-thumb-hover` 在任何引擎上都不会被渲染。因此 Firefox 走标准属性,WebKit 系引擎走伪元素,hover token 只经由伪元素这条路径渲染。相关原理与实测计算值见[滚动条 Agent Note](../../../.agents/notes/implemented/bug-fix/2026-07-28-themed-scrollbars-and-reserved-gutter.md)。
13
+ 两条路径在构造上互斥。`scrollbar-width`/`scrollbar-color` 写在 `@supports not selector(::-webkit-scrollbar)` 之内,因为这两个属性中的任一个只要取非 `auto` 值,Chromium 与 Safari 就会丢弃该元素上的全部 `::-webkit-scrollbar*` 规则,`::-webkit-scrollbar-thumb:hover` 也在其中——若无条件地同时声明,`--dsh-scrollbar-thumb-hover` 在任何引擎上都不会被渲染。因此 Firefox 走标准属性,WebKit 系引擎走伪元素,hover token 只经由伪元素这条路径渲染。相关原理与实测计算值见[滚动条 Agent Note](../../../.agents/notes/implemented/bug-fix/2026-07-28-themed-scrollbars-and-reserved-gutter.zh.md)。
14
14
 
15
15
  ## 模型体验
16
16
 
package/lib/client.js CHANGED
@@ -33,10 +33,10 @@ window.__ModuleLoader__.load({
33
33
  document.head.appendChild(tag);
34
34
  }
35
35
  var AppearanceRow_module_css_default = {
36
- "themeCube": "_8HJdBW_themeCube",
37
- "selected": "_8HJdBW_selected",
38
36
  "cubeRow": "_8HJdBW_cubeRow",
39
37
  "group": "_8HJdBW_group",
38
+ "selected": "_8HJdBW_selected",
39
+ "themeCube": "_8HJdBW_themeCube",
40
40
  "title": "_8HJdBW_title"
41
41
  };
42
42
  //#endregion
@@ -117,6 +117,48 @@ window.__ModuleLoader__.load({
117
117
  });
118
118
  }
119
119
  //#endregion
120
+ //#region \0dsh-inline-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-theme/src/styles/base.css.mjs
121
+ var base_css_default = ":root{--dsw-font-family:-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Hiragino Sans GB\", \"Microsoft YaHei\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;--ds-font-family-code:\"SF Mono\", \"JetBrains Mono\", \"Fira Code\", Consolas, \"Liberation Mono\", Menlo, Courier, \"PingFang SC\", \"Microsoft YaHei\";--ds-ease-in-out:cubic-bezier(.4, 0, .2, 1);--ds-transition-duration:.2s;--ds-transition-duration-fast:.1s;--ds-transition-duration-slow:.3s}";
122
+ //#endregion
123
+ //#region \0dsh-inline-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-theme/src/styles/design-platform.css.mjs
124
+ var design_platform_css_default = "body{--dsw-static-amber-100:#fef5e7;--dsw-static-amber-400:#f7ad31;--dsw-static-amber-500:#f59e0b;--dsw-static-amber-600:#dd8629;--dsw-static-amber-900:#27241f;--dsw-static-blue-100:#dbeafe;--dsw-static-blue-300:#93c5fd;--dsw-static-blue-400:#60a5fa;--dsw-static-blue-450:#4d93f8;--dsw-static-blue-500:#3b82f6;--dsw-static-blue-50:#eff6ff;--dsw-static-blue-50p:#eaf3ff;--dsw-static-blue-600:#2563eb;--dsw-static-blue-75:#e5f0ff;--dsw-static-blue-800:#1e40af;--dsw-static-blue-900:#0e3074;--dsw-static-blue-950:#172554;--dsw-static-deepseek-100:#e4edfd;--dsw-static-deepseek-200:#d3e2ff;--dsw-static-deepseek-300:#b7c8fe;--dsw-static-deepseek-400:#679efe;--dsw-static-deepseek-450:#5686fe;--dsw-static-deepseek-500:#4176e6;--dsw-static-deepseek-50:#edf3fe;--dsw-static-deepseek-600:#4868b2;--dsw-static-deepseek-700-delete:#2f4c8f;--dsw-static-deepseek-800:#34415b;--dsw-static-deepseek-900:#283142;--dsw-static-green-100:#e6faed;--dsw-static-green-400:#4ed17e;--dsw-static-green-500:#22c55e;--dsw-static-green-900:#233c2c;--dsw-static-neutral-00:#fff;--dsw-static-neutral-1000:#000;--dsw-static-neutral-100:#f5f5f5;--dsw-static-neutral-150:#ededed;--dsw-static-neutral-200:#e5e5e5;--dsw-static-neutral-250:#dcdcdc;--dsw-static-neutral-300:#d4d4d4;--dsw-static-neutral-400:#a2a4a6;--dsw-static-neutral-500:#7f8287;--dsw-static-neutral-50:#fafafa;--dsw-static-neutral-550:#65676b;--dsw-static-neutral-600:#545557;--dsw-static-neutral-700:#3c3c3d;--dsw-static-neutral-800:#292929;--dsw-static-neutral-850:#212123;--dsw-static-neutral-900:#0f0f0f;--dsw-static-neutral-bluish-00:#fff;--dsw-static-neutral-bluish-1000:#0f1115;--dsw-static-neutral-bluish-100:#ebeef2;--dsw-static-neutral-bluish-150:#e9ecf2;--dsw-static-neutral-bluish-200:#e1e5ee;--dsw-static-neutral-bluish-300:#cfd3d6;--dsw-static-neutral-bluish-400:#adb2b8;--dsw-static-neutral-bluish-500:#979da6;--dsw-static-neutral-bluish-50:#f9fafb;--dsw-static-neutral-bluish-600:#81858c;--dsw-static-neutral-bluish-60:#f5f6f7;--dsw-static-neutral-bluish-700:#61666b;--dsw-static-neutral-bluish-750:#43454a;--dsw-static-neutral-bluish-75:#f1f3f5;--dsw-static-neutral-bluish-800:#353638;--dsw-static-neutral-bluish-850:#2c2c2e;--dsw-static-neutral-bluish-875:#232324;--dsw-static-neutral-bluish-900:#1b1b1c;--dsw-static-neutral-bluish-950:#151517;--dsw-static-red-100:#fee2e2;--dsw-static-red-400:#f25a5a;--dsw-static-red-500:#ef4444;--dsw-static-red-50:#fef2f2;--dsw-static-red-600:#ec1313;--dsw-static-red-900:#570c0c}body[data-ds-dark-theme]{--dsw-static-amber-100:#fef5e7;--dsw-static-amber-400:#f7ad31;--dsw-static-amber-500:#f59e0b;--dsw-static-amber-600:#dd8629;--dsw-static-amber-900:#27241f;--dsw-static-blue-100:#dbeafe;--dsw-static-blue-300:#93c5fd;--dsw-static-blue-400:#60a5fa;--dsw-static-blue-450:#4d93f8;--dsw-static-blue-500:#3b82f6;--dsw-static-blue-50:#eff6ff;--dsw-static-blue-50p:#eaf3ff;--dsw-static-blue-600:#2563eb;--dsw-static-blue-75:#e5f0ff;--dsw-static-blue-800:#1e40af;--dsw-static-blue-900:#0e3074;--dsw-static-blue-950:#172554;--dsw-static-deepseek-100:#e4edfd;--dsw-static-deepseek-200:#d3e2ff;--dsw-static-deepseek-300:#b7c8fe;--dsw-static-deepseek-400:#679efe;--dsw-static-deepseek-450:#5686fe;--dsw-static-deepseek-500:#4176e6;--dsw-static-deepseek-50:#edf3fe;--dsw-static-deepseek-600:#4868b2;--dsw-static-deepseek-700-delete:#2f4c8f;--dsw-static-deepseek-800:#34415b;--dsw-static-deepseek-900:#283142;--dsw-static-green-100:#e6faed;--dsw-static-green-400:#4ed17e;--dsw-static-green-500:#22c55e;--dsw-static-green-900:#233c2c;--dsw-static-neutral-00:#fff;--dsw-static-neutral-1000:#000;--dsw-static-neutral-100:#f5f5f5;--dsw-static-neutral-150:#ededed;--dsw-static-neutral-200:#e5e5e5;--dsw-static-neutral-250:#dcdcdc;--dsw-static-neutral-300:#d4d4d4;--dsw-static-neutral-400:#a2a4a6;--dsw-static-neutral-500:#7f8287;--dsw-static-neutral-50:#fafafa;--dsw-static-neutral-550:#65676b;--dsw-static-neutral-600:#545557;--dsw-static-neutral-700:#3c3c3d;--dsw-static-neutral-800:#292929;--dsw-static-neutral-850:#212123;--dsw-static-neutral-900:#0f0f0f;--dsw-static-neutral-bluish-00:#fff;--dsw-static-neutral-bluish-1000:#0f1115;--dsw-static-neutral-bluish-100:#ebeef2;--dsw-static-neutral-bluish-150:#e9ecf2;--dsw-static-neutral-bluish-200:#e1e5ee;--dsw-static-neutral-bluish-300:#cfd3d6;--dsw-static-neutral-bluish-400:#adb2b8;--dsw-static-neutral-bluish-500:#979da6;--dsw-static-neutral-bluish-50:#f9fafb;--dsw-static-neutral-bluish-600:#81858c;--dsw-static-neutral-bluish-60:#f9fafb;--dsw-static-neutral-bluish-700:#61666b;--dsw-static-neutral-bluish-750:#43454a;--dsw-static-neutral-bluish-75:#f1f3f5;--dsw-static-neutral-bluish-800:#353638;--dsw-static-neutral-bluish-850:#2c2c2e;--dsw-static-neutral-bluish-875:#232324;--dsw-static-neutral-bluish-900:#1b1b1c;--dsw-static-neutral-bluish-950:#151517;--dsw-static-red-100:#fee2e2;--dsw-static-red-400:#f25a5a;--dsw-static-red-500:#ef4444;--dsw-static-red-50:#fef2f2;--dsw-static-red-600:#ec1313;--dsw-static-red-900:#570c0c}body{--dsw-alias-bg-base:var(--dsw-static-neutral-bluish-00);--dsw-alias-bg-layer-1:var(--dsw-static-neutral-bluish-00);--dsw-alias-bg-layer-2:var(--dsw-static-neutral-bluish-00);--dsw-alias-bg-layer-3:var(--dsw-static-neutral-bluish-00);--dsw-alias-bg-mask-1:#0000003d;--dsw-alias-bg-mask-2:#0000001f;--dsw-alias-bg-mask-3:#0000007a;--dsw-alias-bg-mask-photo:#000000e0;--dsw-alias-bg-mask-drop:#ffffffb3;--dsw-alias-bg-module-platform:var(--dsw-static-neutral-bluish-60);--dsw-alias-bg-multi-select:var(--dsw-static-neutral-bluish-60);--dsw-alias-bg-overlay:var(--dsw-static-neutral-bluish-150);--dsw-alias-bg-skeleton:#0000000a;--dsw-alias-border-inverted2:#0000;--dsw-alias-border-inverted:#0000;--dsw-alias-border-l1:#0000000a;--dsw-alias-border-l2-darkmode-thin:#0000001a;--dsw-alias-border-l2:#0000001a;--dsw-alias-border-l3:#0000001f;--dsw-alias-border-l4:#00000029;--dsw-alias-brand-primary-invert:var(--dsw-static-neutral-bluish-1000);--dsw-alias-brand-primary-new-colorprimary-new-color:#4176e6;--dsw-alias-brand-primary:var(--dsw-static-neutral-bluish-1000);--dsw-alias-brand-text:var(--dsw-static-neutral-bluish-1000);--dsw-alias-button-contrast-fill:var(--dsw-static-neutral-bluish-700);--dsw-alias-button-elevated-fill:var(--dsw-static-neutral-bluish-00);--dsw-alias-button-floating-fill:var(--dsw-static-neutral-bluish-00);--dsw-alias-button-floating-hover:var(--dsw-static-neutral-bluish-75);--dsw-alias-button-ghost-active-border:var(--dsw-static-neutral-bluish-500);--dsw-alias-button-ghost-active-fill:var(--dsw-static-neutral-bluish-100);--dsw-alias-button-ghost-active-hover:var(--dsw-static-neutral-bluish-150);--dsw-alias-button-info-fill:var(--dsw-static-deepseek-500);--dsw-alias-button-info-hover:var(--dsw-static-deepseek-400);--dsw-alias-button-primary-dimmed:var(--dsw-static-neutral-bluish-100);--dsw-alias-button-primary-fill:var(--dsw-alias-brand-primary);--dsw-alias-button-primary-hover:var(--dsw-static-neutral-bluish-750);--dsw-alias-button-tool-bar-fill-invisible:#1f1f1f5c;--dsw-alias-button-tool-bar-fill:#54555780;--dsw-alias-button-tool-bar-hover:#54555799;--dsw-alias-interactive-bg-active:#2631481a;--dsw-alias-interactive-bg-hover-accent:#26314824;--dsw-alias-interactive-bg-hover-danger:#ec13130d;--dsw-alias-interactive-bg-hover-solid:var(--dsw-static-neutral-bluish-75);--dsw-alias-interactive-bg-hover:#2631480f;--dsw-alias-label-caption:var(--dsw-static-neutral-bluish-400);--dsw-alias-label-dimmed:var(--dsw-static-neutral-bluish-200);--dsw-alias-label-primary-bluish:var(--dsw-static-blue-900);--dsw-alias-label-primary-dimmed:var(--dsw-static-neutral-bluish-950);--dsw-alias-label-primary-foreground:var(--dsw-static-neutral-bluish-00);--dsw-alias-label-primary-inverted:var(--dsw-static-neutral-bluish-00);--dsw-alias-label-primary:var(--dsw-static-neutral-bluish-1000);--dsw-alias-label-secondary:var(--dsw-static-neutral-bluish-700);--dsw-alias-label-tertiary:var(--dsw-static-neutral-bluish-600);--dsw-alias-markdown-citation:var(--dsw-static-neutral-bluish-100);--dsw-alias-markdown-code-block-banner:var(--dsw-static-neutral-bluish-50);--dsw-alias-markdown-code-block:var(--dsw-static-neutral-bluish-50);--dsw-alias-markdown-code-segment-selected:var(--dsw-static-neutral-bluish-00);--dsw-alias-markdown-code-segment-unselected:var(--dsw-static-neutral-bluish-75);--dsw-alias-markdown-inline-code:var(--dsw-static-neutral-bluish-100);--dsw-alias-markdown-placeholder:var(--dsw-static-neutral-bluish-60);--dsw-alias-markdown-tag:var(--dsw-static-neutral-bluish-75);--dsw-alias-scrollbar-bg-l1:var(--dsw-static-neutral-200);--dsw-alias-scrollbar-bg-l2:var(--dsw-static-neutral-200);--dsw-alias-scrollbar-hover-l1:var(--dsw-static-neutral-300);--dsw-alias-scrollbar-hover-l2:var(--dsw-static-neutral-300);--dsw-alias-state-business-primary:var(--dsw-static-deepseek-500);--dsw-alias-state-business-tertiary:var(--dsw-static-deepseek-100);--dsw-alias-state-error-primary:var(--dsw-static-red-600);--dsw-alias-state-error-secondary:var(--dsw-static-red-400);--dsw-alias-state-success-primary:var(--dsw-static-green-500);--dsw-alias-state-success-secondary:var(--dsw-static-green-400);--dsw-alias-state-success-tertiary:var(--dsw-static-green-100);--dsw-alias-state-warn-label:var(--dsw-static-amber-600);--dsw-alias-state-warn-primary:var(--dsw-static-amber-500);--dsw-alias-state-warn-secondary:var(--dsw-static-amber-400);--dsw-alias-state-warn-tertiary:var(--dsw-static-amber-100);--dsw-alias-toast-bg:var(--dsw-static-neutral-bluish-800);--dsw-alias-tooltip-bg:var(--dsw-static-neutral-bluish-850);--dsw-specific-bubble-highlight:var(--dsw-static-deepseek-200);--dsw-specific-bubble:var(--dsw-static-deepseek-50);--dsw-specific-input-major:var(--dsw-static-neutral-bluish-00);--dsw-specific-login-input:var(--dsw-static-neutral-bluish-50);--dsw-specific-menu:var(--dsw-alias-bg-layer-3);--dsw-specific-selector:var(--dsw-static-neutral-bluish-60);--dsw-specific-sidebar-fill:var(--dsw-static-neutral-bluish-50);--dsw-specific-sidebar-nav-item-active-accent:var(--dsw-static-deepseek-100);--dsw-specific-sidebar-nav-item-active:var(--dsw-static-neutral-bluish-100);--dsw-specific-sidebar-nav-item-hover:var(--dsw-static-neutral-bluish-75);--dsw-specific-tip:var(--dsw-static-neutral-bluish-60)}body[data-ds-dark-theme]{--dsw-alias-bg-base:var(--dsw-static-neutral-bluish-950);--dsw-alias-bg-layer-1:var(--dsw-static-neutral-bluish-875);--dsw-alias-bg-layer-2:var(--dsw-static-neutral-bluish-850);--dsw-alias-bg-layer-3:var(--dsw-static-neutral-bluish-800);--dsw-alias-bg-mask-1:#00000080;--dsw-alias-bg-mask-2:#0003;--dsw-alias-bg-mask-3:#0000007a;--dsw-alias-bg-mask-photo:#000000e0;--dsw-alias-bg-mask-drop:#272730b3;--dsw-alias-bg-module-platform:var(--dsw-static-neutral-bluish-800);--dsw-alias-bg-multi-select:var(--dsw-static-neutral-850);--dsw-alias-bg-overlay:var(--dsw-static-neutral-bluish-700);--dsw-alias-bg-skeleton:#ffffff14;--dsw-alias-border-inverted2:#ffffff14;--dsw-alias-border-inverted:#ffffff0f;--dsw-alias-border-l1:#ffffff0f;--dsw-alias-border-l2-darkmode-thin:#ffffff0f;--dsw-alias-border-l2:#ffffff1f;--dsw-alias-border-l3:#ffffff29;--dsw-alias-border-l4:#fff3;--dsw-alias-brand-primary-invert:var(--dsw-static-neutral-bluish-50);--dsw-alias-brand-primary-new-colorprimary-new-color:var(--dsw-static-deepseek-450);--dsw-alias-brand-primary:var(--dsw-static-neutral-bluish-50);--dsw-alias-brand-text:var(--dsw-static-neutral-bluish-50);--dsw-alias-button-contrast-fill:var(--dsw-static-neutral-bluish-50);--dsw-alias-button-elevated-fill:var(--dsw-static-neutral-bluish-750);--dsw-alias-button-floating-fill:var(--dsw-static-neutral-bluish-850);--dsw-alias-button-floating-hover:var(--dsw-static-neutral-bluish-800);--dsw-alias-button-ghost-active-border:var(--dsw-static-neutral-bluish-600);--dsw-alias-button-ghost-active-fill:var(--dsw-static-neutral-bluish-750);--dsw-alias-button-ghost-active-hover:var(--dsw-static-neutral-bluish-700);--dsw-alias-button-info-fill:var(--dsw-static-deepseek-400);--dsw-alias-button-info-hover:var(--dsw-static-deepseek-500);--dsw-alias-button-primary-dimmed:var(--dsw-static-neutral-bluish-750);--dsw-alias-button-primary-fill:var(--dsw-alias-brand-primary);--dsw-alias-button-primary-hover:var(--dsw-static-neutral-bluish-100);--dsw-alias-button-tool-bar-fill-invisible:#1f1f1f5c;--dsw-alias-button-tool-bar-fill:#54555780;--dsw-alias-button-tool-bar-hover:#54555799;--dsw-alias-interactive-bg-active:#ffffff24;--dsw-alias-interactive-bg-hover-accent:#ffffff3d;--dsw-alias-interactive-bg-hover-danger:#f25a5a26;--dsw-alias-interactive-bg-hover-solid:var(--dsw-static-neutral-bluish-800);--dsw-alias-interactive-bg-hover:#ffffff14;--dsw-alias-label-caption:var(--dsw-static-neutral-bluish-600);--dsw-alias-label-dimmed:var(--dsw-static-neutral-bluish-750);--dsw-alias-label-primary-bluish:var(--dsw-static-neutral-bluish-50);--dsw-alias-label-primary-dimmed:var(--dsw-static-neutral-bluish-100);--dsw-alias-label-primary-foreground:var(--dsw-static-neutral-bluish-1000);--dsw-alias-label-primary-inverted:var(--dsw-static-neutral-bluish-800);--dsw-alias-label-primary:var(--dsw-static-neutral-bluish-50);--dsw-alias-label-secondary:var(--dsw-static-neutral-bluish-300);--dsw-alias-label-tertiary:var(--dsw-static-neutral-bluish-400);--dsw-alias-markdown-citation:var(--dsw-static-neutral-bluish-800);--dsw-alias-markdown-code-block-banner:var(--dsw-static-neutral-bluish-850);--dsw-alias-markdown-code-block:var(--dsw-static-neutral-bluish-900);--dsw-alias-markdown-code-segment-selected:var(--dsw-static-neutral-bluish-800);--dsw-alias-markdown-code-segment-unselected:var(--dsw-static-neutral-bluish-900);--dsw-alias-markdown-inline-code:var(--dsw-static-neutral-bluish-850);--dsw-alias-markdown-placeholder:var(--dsw-static-neutral-bluish-850);--dsw-alias-markdown-tag:var(--dsw-static-neutral-bluish-850);--dsw-alias-scrollbar-bg-l1:var(--dsw-static-neutral-700);--dsw-alias-scrollbar-bg-l2:var(--dsw-static-neutral-600);--dsw-alias-scrollbar-hover-l1:var(--dsw-static-neutral-600);--dsw-alias-scrollbar-hover-l2:var(--dsw-static-neutral-550);--dsw-alias-state-business-primary:var(--dsw-static-deepseek-400);--dsw-alias-state-business-tertiary:var(--dsw-static-deepseek-800);--dsw-alias-state-error-primary:var(--dsw-static-red-400);--dsw-alias-state-error-secondary:var(--dsw-static-red-400);--dsw-alias-state-success-primary:var(--dsw-static-green-500);--dsw-alias-state-success-secondary:var(--dsw-static-green-400);--dsw-alias-state-success-tertiary:var(--dsw-static-green-900);--dsw-alias-state-warn-label:var(--dsw-static-amber-600);--dsw-alias-state-warn-primary:var(--dsw-static-amber-500);--dsw-alias-state-warn-secondary:var(--dsw-static-amber-400);--dsw-alias-state-warn-tertiary:var(--dsw-static-amber-900);--dsw-alias-toast-bg:var(--dsw-static-neutral-bluish-750);--dsw-alias-tooltip-bg:var(--dsw-static-neutral-bluish-750);--dsw-specific-bubble-highlight:var(--dsw-static-neutral-bluish-750);--dsw-specific-bubble:var(--dsw-static-neutral-bluish-850);--dsw-specific-input-major:var(--dsw-static-neutral-bluish-850);--dsw-specific-login-input:var(--dsw-static-neutral-bluish-900);--dsw-specific-menu:var(--dsw-alias-bg-layer-3);--dsw-specific-selector:var(--dsw-static-neutral-bluish-800);--dsw-specific-sidebar-fill:var(--dsw-static-neutral-bluish-900);--dsw-specific-sidebar-nav-item-active-accent:var(--dsw-static-neutral-bluish-800);--dsw-specific-sidebar-nav-item-active:var(--dsw-static-neutral-bluish-750);--dsw-specific-sidebar-nav-item-hover:var(--dsw-static-neutral-bluish-850);--dsw-specific-tip:var(--dsw-static-neutral-bluish-800)}";
125
+ //#endregion
126
+ //#region \0dsh-inline-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-theme/src/styles/scrollbar.css.mjs
127
+ var scrollbar_css_default = "body{--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l1);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l1);--dsh-scrollbar-width:8px}@supports not selector(::-webkit-scrollbar){body,body *{scrollbar-width:thin;scrollbar-color:var(--dsh-scrollbar-thumb) transparent}}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--dsh-scrollbar-thumb);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--dsh-scrollbar-thumb-hover)}::-webkit-scrollbar-corner{background:0 0}";
128
+ //#endregion
129
+ //#region \0dsh-inline-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-theme/src/styles/gradient-shadow-text.css.mjs
130
+ var gradient_shadow_text_css_default = "body{--dsw-linear-gradient-think:linear-gradient(180deg, #fff 20.19%, #fff0 100%);--dsw-linear-think-select:linear-gradient(180deg, #f5f6f7 20.19%, #f5f6f700 100%);--dsw-shadow-lv1:0 2px 4px 0 #0000000d;--dsw-shadow-lv1-blur:0 4px 12px 0 #00000005;--dsw-shadow-lv2:0 4px 12px 0 #00000005, 0 2px 8px 0 #0000000a;--dsw-shadow-lv3:0 0 1px 0 #0003, 0 0 4px 0 #00000005, 0 12px 32px 0 #00000014;--dsw-mask-blur:blur(2px)}body[data-ds-dark-theme]{--dsw-linear-gradient-think:linear-gradient(180deg, #151517 20.19%, #15151700 100%);--dsw-linear-think-select:linear-gradient(180deg, #232325 20.19%, #23232500 100%)}body{--dsw-font-markdown-h1:700 24px/34px var(--dsw-font-family);--dsw-font-markdown-h1-font-family:var(--dsw-font-family);--dsw-font-markdown-h1-font-weight:700;--dsw-font-markdown-h1-line-height:34px;--dsw-font-markdown-h1-font-size:24px;--dsw-font-markdown-h1-font-style:normal;--dsw-font-markdown-h2:700 22px/32px var(--dsw-font-family);--dsw-font-markdown-h2-font-family:var(--dsw-font-family);--dsw-font-markdown-h2-font-weight:700;--dsw-font-markdown-h2-line-height:32px;--dsw-font-markdown-h2-font-size:22px;--dsw-font-markdown-h2-font-style:normal;--dsw-font-markdown-h3:700 20px/30px var(--dsw-font-family);--dsw-font-markdown-h3-font-family:var(--dsw-font-family);--dsw-font-markdown-h3-font-weight:700;--dsw-font-markdown-h3-line-height:30px;--dsw-font-markdown-h3-font-size:20px;--dsw-font-markdown-h3-font-style:normal;--dsw-font-markdown-h4:600 16px/28px var(--dsw-font-family);--dsw-font-markdown-h4-font-family:var(--dsw-font-family);--dsw-font-markdown-h4-font-weight:600;--dsw-font-markdown-h4-line-height:28px;--dsw-font-markdown-h4-font-size:16px;--dsw-font-markdown-h4-font-style:normal;--dsw-font-markdown-base:16px/28px var(--dsw-font-family);--dsw-font-markdown-base-font-family:var(--dsw-font-family);--dsw-font-markdown-base-font-weight:400;--dsw-font-markdown-base-line-height:28px;--dsw-font-markdown-base-font-size:16px;--dsw-font-markdown-base-font-style:normal;--dsw-font-markdown-base-strong:600 16px/28px var(--dsw-font-family);--dsw-font-markdown-base-strong-font-family:var(--dsw-font-family);--dsw-font-markdown-base-strong-font-weight:600;--dsw-font-markdown-base-strong-line-height:28px;--dsw-font-markdown-base-strong-font-size:16px;--dsw-font-markdown-base-strong-font-style:normal;--dsw-font-markdown-base-italic:italic 16px/28px var(--dsw-font-family);--dsw-font-markdown-base-italic-font-family:var(--dsw-font-family);--dsw-font-markdown-base-italic-font-weight:400;--dsw-font-markdown-base-italic-line-height:28px;--dsw-font-markdown-base-italic-font-size:16px;--dsw-font-markdown-base-italic-font-style:italic;--dsw-font-markdown-base-strong-italic:italic 600 16px/28px var(--dsw-font-family);--dsw-font-markdown-base-strong-italic-font-family:var(--dsw-font-family);--dsw-font-markdown-base-strong-italic-font-weight:600;--dsw-font-markdown-base-strong-italic-line-height:28px;--dsw-font-markdown-base-strong-italic-font-size:16px;--dsw-font-markdown-base-strong-italic-font-style:italic;--dsw-font-markdown-table:15px/25px var(--dsw-font-family);--dsw-font-markdown-table-font-family:var(--dsw-font-family);--dsw-font-markdown-table-font-weight:400;--dsw-font-markdown-table-line-height:25px;--dsw-font-markdown-table-font-size:15px;--dsw-font-markdown-table-font-style:normal;--dsw-font-markdown-table-head:500 15px/25px var(--dsw-font-family);--dsw-font-markdown-table-head-font-family:var(--dsw-font-family);--dsw-font-markdown-table-head-font-weight:500;--dsw-font-markdown-table-head-line-height:25px;--dsw-font-markdown-table-head-font-size:15px;--dsw-font-markdown-table-head-font-style:normal;--dsw-font-markdown-small:14px/24px var(--dsw-font-family);--dsw-font-markdown-small-font-family:var(--dsw-font-family);--dsw-font-markdown-small-font-weight:400;--dsw-font-markdown-small-line-height:24px;--dsw-font-markdown-small-font-size:14px;--dsw-font-markdown-small-font-style:normal;--dsw-font-markdown-small-strong:600 14px/24px var(--dsw-font-family);--dsw-font-markdown-small-strong-font-family:var(--dsw-font-family);--dsw-font-markdown-small-strong-font-weight:600;--dsw-font-markdown-small-strong-line-height:24px;--dsw-font-markdown-small-strong-font-size:14px;--dsw-font-markdown-small-strong-font-style:normal;--dsw-font-markdown-small-italic:italic 14px/24px var(--dsw-font-family);--dsw-font-markdown-small-italic-font-family:var(--dsw-font-family);--dsw-font-markdown-small-italic-font-weight:400;--dsw-font-markdown-small-italic-line-height:24px;--dsw-font-markdown-small-italic-font-size:14px;--dsw-font-markdown-small-italic-font-style:italic;--dsw-font-markdown-small-strong-italic:italic 600 14px/24px var(--dsw-font-family);--dsw-font-markdown-small-strong-italic-font-family:var(--dsw-font-family);--dsw-font-markdown-small-strong-italic-font-weight:600;--dsw-font-markdown-small-strong-italic-line-height:24px;--dsw-font-markdown-small-strong-italic-font-size:14px;--dsw-font-markdown-small-strong-italic-font-style:italic;--dsw-font-markdown-code:14px/22px var(--ds-font-family-code);--dsw-font-markdown-code-font-family:var(--ds-font-family-code);--dsw-font-markdown-code-font-weight:400;--dsw-font-markdown-code-line-height:22px;--dsw-font-markdown-code-font-size:14px;--dsw-font-markdown-code-font-style:normal;--dsw-font-markdown-code-block:13px/22px var(--ds-font-family-code);--dsw-font-markdown-code-block-font-family:var(--ds-font-family-code);--dsw-font-markdown-code-block-font-weight:400;--dsw-font-markdown-code-block-line-height:22px;--dsw-font-markdown-code-block-font-size:13px;--dsw-font-markdown-code-block-font-style:normal;--dsw-font-markdown-code-block-small:12px/18px var(--ds-font-family-code);--dsw-font-markdown-code-block-small-font-family:var(--ds-font-family-code);--dsw-font-markdown-code-block-small-font-weight:400;--dsw-font-markdown-code-block-small-line-height:18px;--dsw-font-markdown-code-block-small-font-size:12px;--dsw-font-markdown-code-block-small-font-style:normal;--dsw-font-xl-24:600 24px/32px var(--dsw-font-family);--dsw-font-xl-24-font-family:var(--dsw-font-family);--dsw-font-xl-24-font-weight:600;--dsw-font-xl-24-line-height:32px;--dsw-font-xl-24-font-size:24px;--dsw-font-xl-24-font-style:normal;--dsw-font-l-20:500 20px/28px var(--dsw-font-family);--dsw-font-l-20-font-family:var(--dsw-font-family);--dsw-font-l-20-font-weight:500;--dsw-font-l-20-line-height:28px;--dsw-font-l-20-font-size:20px;--dsw-font-l-20-font-style:normal;--dsw-font-m-18:500 16px/28px var(--dsw-font-family);--dsw-font-m-18-font-family:var(--dsw-font-family);--dsw-font-m-18-font-weight:500;--dsw-font-m-18-line-height:28px;--dsw-font-m-18-font-size:16px;--dsw-font-m-18-font-style:normal;--dsw-font-base-16:16px/24px var(--dsw-font-family);--dsw-font-base-16-font-family:var(--dsw-font-family);--dsw-font-base-16-font-weight:400;--dsw-font-base-16-line-height:24px;--dsw-font-base-16-font-size:16px;--dsw-font-base-16-font-style:normal;--dsw-font-base-strong-16:500 16px/24px var(--dsw-font-family);--dsw-font-base-strong-16-font-family:var(--dsw-font-family);--dsw-font-base-strong-16-font-weight:500;--dsw-font-base-strong-16-line-height:24px;--dsw-font-base-strong-16-font-size:16px;--dsw-font-base-strong-16-font-style:normal;--dsw-font-s-14:14px/22px var(--dsw-font-family);--dsw-font-s-14-font-family:var(--dsw-font-family);--dsw-font-s-14-font-weight:400;--dsw-font-s-14-line-height:22px;--dsw-font-s-14-font-size:14px;--dsw-font-s-14-font-style:normal;--dsw-font-s-strong-14:500 14px/22px var(--dsw-font-family);--dsw-font-s-strong-14-font-family:var(--dsw-font-family);--dsw-font-s-strong-14-font-weight:500;--dsw-font-s-strong-14-line-height:22px;--dsw-font-s-strong-14-font-size:14px;--dsw-font-s-strong-14-font-style:normal;--dsw-font-xs-13:13px/20px var(--dsw-font-family);--dsw-font-xs-13-font-family:var(--dsw-font-family);--dsw-font-xs-13-font-weight:400;--dsw-font-xs-13-line-height:20px;--dsw-font-xs-13-font-size:13px;--dsw-font-xs-13-font-style:normal;--dsw-font-xs-strong-13:500 13px/20px var(--dsw-font-family);--dsw-font-xs-strong-13-font-family:var(--dsw-font-family);--dsw-font-xs-strong-13-font-weight:500;--dsw-font-xs-strong-13-line-height:20px;--dsw-font-xs-strong-13-font-size:13px;--dsw-font-xs-strong-13-font-style:normal;--dsw-font-xxs-12:12px/18px var(--dsw-font-family);--dsw-font-xxs-12-font-family:var(--dsw-font-family);--dsw-font-xxs-12-font-weight:400;--dsw-font-xxs-12-line-height:18px;--dsw-font-xxs-12-font-size:12px;--dsw-font-xxs-12-font-style:normal;--dsw-font-xxs-strong-12:500 12px/18px var(--dsw-font-family);--dsw-font-xxs-strong-12-font-family:var(--dsw-font-family);--dsw-font-xxs-strong-12-font-weight:500;--dsw-font-xxs-strong-12-line-height:18px;--dsw-font-xxs-strong-12-font-size:12px;--dsw-font-xxs-strong-12-font-style:normal;--dsw-font-xxxs-11:11px/14px var(--dsw-font-family);--dsw-font-xxxs-11-font-family:var(--dsw-font-family);--dsw-font-xxxs-11-font-weight:400;--dsw-font-xxxs-11-line-height:14px;--dsw-font-xxxs-11-font-size:11px;--dsw-font-xxxs-11-font-style:normal;--dsw-font-xxxs-strong-11:500 11px/14px var(--dsw-font-family);--dsw-font-xxxs-strong-11-font-family:var(--dsw-font-family);--dsw-font-xxxs-strong-11-font-weight:500;--dsw-font-xxxs-strong-11-line-height:14px;--dsw-font-xxxs-strong-11-font-size:11px;--dsw-font-xxxs-strong-11-font-style:normal}";
131
+ //#endregion
132
+ //#region \0dsh-inline-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-theme/src/styles/shiki.css.mjs
133
+ var shiki_css_default = ":root{--shiki-foreground:var(--dsw-alias-label-primary);--shiki-background:var(--dsw-alias-markdown-code-block);--shiki-token-constant:#1c7ed6;--shiki-token-string:#2f9e44;--shiki-token-comment:#868e96;--shiki-token-keyword:#d6336c;--shiki-token-parameter:#e8590c;--shiki-token-function:#6741d9;--shiki-token-string-expression:#2b8a3e;--shiki-token-punctuation:#495057;--shiki-token-link:#1971c2}body[data-ds-dark-theme]{--shiki-token-constant:#4dabf7;--shiki-token-string:#69db7c;--shiki-token-comment:#adb5bd;--shiki-token-keyword:#faa2c1;--shiki-token-parameter:#ffa94d;--shiki-token-function:#b197fc;--shiki-token-string-expression:#8ce99a;--shiki-token-punctuation:#ced4da;--shiki-token-link:#74c0fc}";
134
+ //#endregion
135
+ //#region lib/types/client/styles.js
136
+ const PLUGIN_ID = "@deepseek-ai/dsh-client-ui-theme";
137
+ const STYLES = [
138
+ ["base.css", base_css_default],
139
+ ["design-platform.css", design_platform_css_default],
140
+ ["scrollbar.css", scrollbar_css_default],
141
+ ["gradient-shadow-text.css", gradient_shadow_text_css_default],
142
+ ["shiki.css", shiki_css_default]
143
+ ];
144
+ /**
145
+ * Mount the global theme sheets for exactly the owning plugin lifetime.
146
+ * @param ctx - Owning plugin context.
147
+ */
148
+ function installThemeStyles(ctx) {
149
+ if (typeof document === "undefined") return;
150
+ for (const [name, css] of STYLES) ctx.effect(() => {
151
+ const tag = document.createElement("style");
152
+ tag.dataset.plugin = PLUGIN_ID;
153
+ tag.dataset.pluginCss = `${PLUGIN_ID}/${name}`;
154
+ tag.textContent = css;
155
+ document.head.appendChild(tag);
156
+ return () => {
157
+ tag.remove();
158
+ };
159
+ }, `ui-theme: ${name} stylesheet`);
160
+ }
161
+ //#endregion
120
162
  //#region lib/types/client/locales.js
121
163
  /** `settings.theme` namespace dictionaries (the Appearance row's copy). */
122
164
  /** Simplified Chinese dictionary (the key-set source of truth). */
@@ -1256,7 +1298,7 @@ window.__ModuleLoader__.load({
1256
1298
  /**
1257
1299
  * Required services: settings transport plus slots/locale for the Appearance
1258
1300
  * row. `remote` carries the forwarded settings invalidation that
1259
- * `bindSettingsScope` subscribes to on this context.
1301
+ * `ctx.settingsScope.bind(spec)` subscribes to on this context.
1260
1302
  */
1261
1303
  const inject = [
1262
1304
  "slots",
@@ -1272,6 +1314,7 @@ window.__ModuleLoader__.load({
1272
1314
  * @param ctx - client cordis context.
1273
1315
  */
1274
1316
  function apply(ctx) {
1317
+ installThemeStyles(ctx);
1275
1318
  const theme = new ThemeRuntime(ctx, ctx.settingsScope.bind({ namespace: THEME_SETTINGS_NAMESPACE }));
1276
1319
  ctx.provide("theme", theme);
1277
1320
  ctx.effect(() => ctx.locale.register(SETTINGS_NS, {
package/lib/index.js CHANGED
@@ -19,14 +19,14 @@ const ThemeSettingsSchema = z.object({ [THEME_PREFERENCE_FIELD]: z.union([...THE
19
19
  //#endregion
20
20
  //#region lib/types/boot-theme.js
21
21
  /**
22
- * Host-rendered theme bootstrap for the browser's pre-plugin interval. Each
23
- * index response embeds the current durable built-in preference; the browser
24
- * resolves only `system`, then writes the same DOM fields ui-layout's
25
- * ThemePresenter owns after the client plugin tree activates.
22
+ * Theme bootstrap row for the browser's pre-plugin interval. Each index
23
+ * render embeds the current durable built-in preference; the browser resolves
24
+ * only `system`, then writes the same DOM fields ui-layout's ThemePresenter
25
+ * owns after the client plugin tree activates.
26
26
  */
27
- /** Build the inline script for one schema-validated built-in preference. */
27
+ /** Build the inline script body for one schema-validated built-in preference. */
28
28
  function bootThemeScript(preference) {
29
- return `<script>(() => {
29
+ return `(() => {
30
30
  const preference = ${JSON.stringify(preference)}
31
31
  const systemDark = preference === 'system'
32
32
  && typeof matchMedia !== 'undefined'
@@ -34,22 +34,20 @@ function bootThemeScript(preference) {
34
34
  const dark = preference === 'dark' || systemDark
35
35
  document.documentElement.style.colorScheme = dark ? 'dark' : 'light'
36
36
  document.body.toggleAttribute('data-ds-dark-theme', dark)
37
- })()<\/script>`;
37
+ })()`;
38
38
  }
39
39
  /**
40
- * Insert the theme bootstrap immediately after the opening body tag, before
41
- * the shell mount and module script. Body-less fragments receive it at the
42
- * end, where the HTML parser has already synthesized a body.
43
- * @param html - Raw application index HTML.
40
+ * The theme bootstrap as an injection row: an inline script immediately after
41
+ * the opening body tag, before the shell mount and module script.
44
42
  * @param preference - Current Host-backed built-in preference.
45
- * @returns HTML containing the theme bootstrap.
43
+ * @returns the body script row.
46
44
  */
47
- function injectBootTheme(html, preference = DEFAULT_PREFERENCE) {
48
- const script = bootThemeScript(preference);
49
- const body = /<body(?:\s[^>]*)?>/i.exec(html);
50
- if (body === null) return `${html}${script}`;
51
- const at = body.index + body[0].length;
52
- return `${html.slice(0, at)}${script}${html.slice(at)}`;
45
+ function bootThemeInjection(preference = DEFAULT_PREFERENCE) {
46
+ return {
47
+ kind: "script",
48
+ placement: "body",
49
+ text: bootThemeScript(preference)
50
+ };
53
51
  }
54
52
  //#endregion
55
53
  //#region lib/types/index.js
@@ -64,16 +62,17 @@ function readPreference(ctx) {
64
62
  return section.preference;
65
63
  }
66
64
  /**
67
- * Register the durable theme section and initial-theme index transform when
68
- * their optional Host services are composed.
69
- * @param ctx - Host context that may acquire settings and HTTP services.
65
+ * Register the durable theme section when the optional settings service is
66
+ * composed, and answer every index injection collection with the current
67
+ * theme bootstrap row.
68
+ * @param ctx - Host context that may acquire the settings service.
70
69
  */
71
70
  function apply(ctx) {
72
71
  ctx.inject(["settings"], (settingsCtx) => {
73
72
  settingsCtx.settings.register(THEME_NAMESPACE, ThemeSettingsSchema);
74
73
  });
75
- ctx.inject(["webServer"], (httpCtx) => {
76
- httpCtx.effect(() => httpCtx.webServer.tapIndex((html) => injectBootTheme(html, readPreference(ctx))), "client-ui-theme: initial theme bootstrap");
74
+ ctx.on("webserver/index-inject", (table) => {
75
+ table.push(bootThemeInjection(readPreference(ctx)));
77
76
  });
78
77
  }
79
78
  //#endregion
@@ -1,17 +1,16 @@
1
1
  /**
2
- * Host-rendered theme bootstrap for the browser's pre-plugin interval. Each
3
- * index response embeds the current durable built-in preference; the browser
4
- * resolves only `system`, then writes the same DOM fields ui-layout's
5
- * ThemePresenter owns after the client plugin tree activates.
2
+ * Theme bootstrap row for the browser's pre-plugin interval. Each index
3
+ * render embeds the current durable built-in preference; the browser resolves
4
+ * only `system`, then writes the same DOM fields ui-layout's ThemePresenter
5
+ * owns after the client plugin tree activates.
6
6
  */
7
+ import type { IndexInjection } from '@deepseek-ai/dsh-host-webserver';
7
8
  import { type ThemePreference } from './theme-settings.ts';
8
9
  /**
9
- * Insert the theme bootstrap immediately after the opening body tag, before
10
- * the shell mount and module script. Body-less fragments receive it at the
11
- * end, where the HTML parser has already synthesized a body.
12
- * @param html - Raw application index HTML.
10
+ * The theme bootstrap as an injection row: an inline script immediately after
11
+ * the opening body tag, before the shell mount and module script.
13
12
  * @param preference - Current Host-backed built-in preference.
14
- * @returns HTML containing the theme bootstrap.
13
+ * @returns the body script row.
15
14
  */
16
- export declare function injectBootTheme(html: string, preference?: ThemePreference): string;
15
+ export declare function bootThemeInjection(preference?: ThemePreference): IndexInjection;
17
16
  //# sourceMappingURL=boot-theme.d.ts.map
@@ -178,7 +178,7 @@ export declare class ThemeRuntime {
178
178
  /**
179
179
  * Required services: settings transport plus slots/locale for the Appearance
180
180
  * row. `remote` carries the forwarded settings invalidation that
181
- * `bindSettingsScope` subscribes to on this context.
181
+ * `ctx.settingsScope.bind(spec)` subscribes to on this context.
182
182
  */
183
183
  export declare const inject: string[];
184
184
  /**
@@ -0,0 +1,7 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ /**
3
+ * Mount the global theme sheets for exactly the owning plugin lifetime.
4
+ * @param ctx - Owning plugin context.
5
+ */
6
+ export declare function installThemeStyles(ctx: Context): void;
7
+ //# sourceMappingURL=styles.d.ts.map
@@ -2,9 +2,10 @@
2
2
  import type { Context } from '@deepseek-ai/cordis';
3
3
  export { DEFAULT_PREFERENCE, THEME_PREFERENCE_FIELD, THEME_PREFERENCES, THEME_SETTINGS_NAMESPACE, type ThemePreference, type ThemeSettings, } from './theme-settings.ts';
4
4
  /**
5
- * Register the durable theme section and initial-theme index transform when
6
- * their optional Host services are composed.
7
- * @param ctx - Host context that may acquire settings and HTTP services.
5
+ * Register the durable theme section when the optional settings service is
6
+ * composed, and answer every index injection collection with the current
7
+ * theme bootstrap row.
8
+ * @param ctx - Host context that may acquire the settings service.
8
9
  */
9
10
  export declare function apply(ctx: Context): void;
10
11
  //# sourceMappingURL=index.d.ts.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-client-ui-theme",
3
3
  "description": "Theme plugin: Host bootstrap for the pre-plugin palette; DOM-free ThemeRuntime for light/dark/system state; --dsw-* token styles and Appearance settings row",
4
- "version": "0.1.0-rc.7",
4
+ "version": "0.1.1-rc.1",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -26,7 +26,6 @@
26
26
  "types": "./lib/types/client/index.d.ts",
27
27
  "default": "./lib/client.js"
28
28
  },
29
- "./styles/*": "./lib/styles/*",
30
29
  "./src/*": "./src/*",
31
30
  "./package.json": "./package.json"
32
31
  },
@@ -45,31 +44,31 @@
45
44
  },
46
45
  "license": "MIT",
47
46
  "peerDependencies": {
48
- "react": "^18.2.0",
49
- "@deepseek-ai/cordis": "^4.0.1",
50
- "@deepseek-ai/dsh-api-remotes": "^0.1.0-rc.7",
51
- "@deepseek-ai/dsh-client-connection": "^0.1.0-rc.7",
52
- "@deepseek-ai/dsh-client-locale": "^0.1.0-rc.7",
53
- "@deepseek-ai/dsh-client-ui-primitives": "^0.1.0-rc.7",
54
- "@deepseek-ai/dsh-client-ui-settings": "^0.1.0-rc.7",
55
- "@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.7",
56
- "@deepseek-ai/dsh-host-webserver": "^0.1.0-rc.7",
57
- "@deepseek-ai/dsh-invariants": "^0.1.0-rc.7",
58
- "@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.7"
47
+ "@deepseek-ai/dsh-api-remotes": "^0.1.1-rc.1",
48
+ "@deepseek-ai/dsh-client-connection": "^0.1.1-rc.1",
49
+ "@deepseek-ai/dsh-client-locale": "^0.1.1-rc.1",
50
+ "@deepseek-ai/dsh-client-runtime": "^0.1.1-rc.1",
51
+ "@deepseek-ai/dsh-client-ui-settings": "^0.1.1-rc.1",
52
+ "@deepseek-ai/dsh-host-webserver": "^0.1.1-rc.1",
53
+ "@deepseek-ai/dsh-invariants": "^0.1.1-rc.1",
54
+ "@deepseek-ai/dsh-settings": "^0.1.1-rc.1",
55
+ "@deepseek-ai/cordis": "^4.0.1"
59
56
  },
60
57
  "devDependencies": {
61
58
  "@types/react": "~18.3.1",
62
59
  "react": "^18.2.0",
63
60
  "@deepseek-ai/cordis": "^4.0.1",
64
- "@deepseek-ai/dsh-api-remotes": "^0.1.0-rc.7",
65
- "@deepseek-ai/dsh-client-locale": "^0.1.0-rc.7",
66
- "@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.7",
67
- "@deepseek-ai/dsh-client-test-runtime": "^0.1.0-rc.7",
68
- "@deepseek-ai/dsh-client-ui-primitives": "^0.1.0-rc.7",
69
- "@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.7",
70
- "@deepseek-ai/dsh-host-webserver": "^0.1.0-rc.7",
71
- "@deepseek-ai/dsh-invariants": "^0.1.0-rc.7",
72
- "@deepseek-ai/dsh-client-ui-settings": "^0.1.0-rc.7"
61
+ "@deepseek-ai/dsh-client-connection": "^0.1.1-rc.1",
62
+ "@deepseek-ai/dsh-client-locale": "^0.1.1-rc.1",
63
+ "@deepseek-ai/dsh-api-remotes": "^0.1.1-rc.1",
64
+ "@deepseek-ai/dsh-client-runtime": "^0.1.1-rc.1",
65
+ "@deepseek-ai/dsh-client-test-runtime": "^0.1.1-rc.1",
66
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.1.1-rc.1",
67
+ "@deepseek-ai/dsh-client-ui-settings": "^0.1.1-rc.1",
68
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.1-rc.1",
69
+ "@deepseek-ai/dsh-host-webserver": "^0.1.1-rc.1",
70
+ "@deepseek-ai/dsh-invariants": "^0.1.1-rc.1",
71
+ "@deepseek-ai/dsh-settings": "^0.1.1-rc.1"
73
72
  },
74
73
  "files": [
75
74
  "lib/index.js",
@@ -80,7 +79,6 @@
80
79
  ],
81
80
  "dependencies": {
82
81
  "clsx": "^2.0.0",
83
- "@deepseek-ai/dsh-settings": "^0.1.0-rc.7",
84
82
  "@deepseek-ai/schemastery": "^3.18.1"
85
83
  },
86
84
  "scripts": {
@@ -1,15 +0,0 @@
1
- /* Base variables referenced by the token sheets and component CSS but defined
2
- * upstream (deepsuite theme/global.css) — supplied here so the composite
3
- * --dsw-font-* variables resolve and motion rides the upstream curve. Code
4
- * font stack deliberately omits a bare `monospace` tail (Windows CJK falls
5
- * back to SimSun otherwise). */
6
- :root {
7
- --dsw-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC',
8
- 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;
9
- --ds-font-family-code: 'SF Mono', 'JetBrains Mono', 'Fira Code', Consolas,
10
- 'Liberation Mono', Menlo, Courier, 'PingFang SC', 'Microsoft YaHei';
11
- --ds-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
12
- --ds-transition-duration: 0.2s;
13
- --ds-transition-duration-fast: 0.1s;
14
- --ds-transition-duration-slow: 0.3s;
15
- }
@@ -1,338 +0,0 @@
1
- /* Figma font-weight 510 (an SF Pro variable-font weight) always renders as
2
- font-weight: 500 in this UI — non-variable webfonts snap intermediate
3
- weights unpredictably across platforms. */
4
- body {
5
- --dsw-static-amber-100: rgb(254, 245, 231);
6
- --dsw-static-amber-400: rgb(247, 173, 49);
7
- --dsw-static-amber-500: rgb(245, 158, 11);
8
- --dsw-static-amber-600: rgb(221, 134, 41);
9
- --dsw-static-amber-900: rgb(39, 36, 31);
10
- --dsw-static-blue-100: rgb(219, 234, 254);
11
- --dsw-static-blue-300: rgb(147, 197, 253);
12
- --dsw-static-blue-400: rgb(96, 165, 250);
13
- --dsw-static-blue-450: rgb(77, 147, 248);
14
- --dsw-static-blue-500: rgb(59, 130, 246);
15
- --dsw-static-blue-50: rgb(239, 246, 255);
16
- --dsw-static-blue-50p: rgb(234, 243, 255);
17
- --dsw-static-blue-600: rgb(37, 99, 235);
18
- --dsw-static-blue-75: rgb(229, 240, 255);
19
- --dsw-static-blue-800: rgb(30, 64, 175);
20
- --dsw-static-blue-900: rgb(14, 48, 116);
21
- --dsw-static-blue-950: rgb(23, 37, 84);
22
- --dsw-static-deepseek-100: rgb(228, 237, 253);
23
- --dsw-static-deepseek-200: rgb(211, 226, 255);
24
- --dsw-static-deepseek-300: rgb(183, 200, 254);
25
- --dsw-static-deepseek-400: rgb(103, 158, 254);
26
- --dsw-static-deepseek-450: rgb(86, 134, 254);
27
- --dsw-static-deepseek-500: rgb(65, 118, 230);
28
- --dsw-static-deepseek-50: rgb(237, 243, 254);
29
- --dsw-static-deepseek-600: rgb(72, 104, 178);
30
- --dsw-static-deepseek-700-delete: rgb(47, 76, 143);
31
- --dsw-static-deepseek-800: rgb(52, 65, 91);
32
- --dsw-static-deepseek-900: rgb(40, 49, 66);
33
- --dsw-static-green-100: rgb(230, 250, 237);
34
- --dsw-static-green-400: rgb(78, 209, 126);
35
- --dsw-static-green-500: rgb(34, 197, 94);
36
- --dsw-static-green-900: rgb(35, 60, 44);
37
- --dsw-static-neutral-00: rgb(255, 255, 255);
38
- --dsw-static-neutral-1000: rgb(0, 0, 0);
39
- --dsw-static-neutral-100: rgb(245, 245, 245);
40
- --dsw-static-neutral-150: rgb(237, 237, 237);
41
- --dsw-static-neutral-200: rgb(229, 229, 229);
42
- --dsw-static-neutral-250: rgb(220, 220, 220);
43
- --dsw-static-neutral-300: rgb(212, 212, 212);
44
- --dsw-static-neutral-400: rgb(162, 164, 166);
45
- --dsw-static-neutral-500: rgb(127, 130, 135);
46
- --dsw-static-neutral-50: rgb(250, 250, 250);
47
- --dsw-static-neutral-550: rgb(101, 103, 107);
48
- --dsw-static-neutral-600: rgb(84, 85, 87);
49
- --dsw-static-neutral-700: rgb(60, 60, 61);
50
- --dsw-static-neutral-800: rgb(41, 41, 41);
51
- --dsw-static-neutral-850: rgb(33, 33, 35);
52
- --dsw-static-neutral-900: rgb(15, 15, 15);
53
- --dsw-static-neutral-bluish-00: rgb(255, 255, 255);
54
- --dsw-static-neutral-bluish-1000: rgb(15, 17, 21);
55
- --dsw-static-neutral-bluish-100: rgb(235, 238, 242);
56
- --dsw-static-neutral-bluish-150: rgb(233, 236, 242);
57
- --dsw-static-neutral-bluish-200: rgb(225, 229, 238);
58
- --dsw-static-neutral-bluish-300: rgb(207, 211, 214);
59
- --dsw-static-neutral-bluish-400: rgb(173, 178, 184);
60
- --dsw-static-neutral-bluish-500: rgb(151, 157, 166);
61
- --dsw-static-neutral-bluish-50: rgb(249, 250, 251);
62
- --dsw-static-neutral-bluish-600: rgb(129, 133, 140);
63
- --dsw-static-neutral-bluish-60: rgb(245, 246, 247);
64
- --dsw-static-neutral-bluish-700: rgb(97, 102, 107);
65
- --dsw-static-neutral-bluish-750: rgb(67, 69, 74);
66
- --dsw-static-neutral-bluish-75: rgb(241, 243, 245);
67
- --dsw-static-neutral-bluish-800: rgb(53, 54, 56);
68
- --dsw-static-neutral-bluish-850: rgb(44, 44, 46);
69
- --dsw-static-neutral-bluish-875: rgb(35, 35, 36);
70
- --dsw-static-neutral-bluish-900: rgb(27, 27, 28);
71
- --dsw-static-neutral-bluish-950: rgb(21, 21, 23);
72
- --dsw-static-red-100: rgb(254, 226, 226);
73
- --dsw-static-red-400: rgb(242, 90, 90);
74
- --dsw-static-red-500: rgb(239, 68, 68);
75
- --dsw-static-red-50: rgb(254, 242, 242);
76
- --dsw-static-red-600: rgb(236, 19, 19);
77
- --dsw-static-red-900: rgb(87, 12, 12);
78
- }
79
-
80
- body[data-ds-dark-theme] {
81
- --dsw-static-amber-100: rgb(254, 245, 231);
82
- --dsw-static-amber-400: rgb(247, 173, 49);
83
- --dsw-static-amber-500: rgb(245, 158, 11);
84
- --dsw-static-amber-600: rgb(221, 134, 41);
85
- --dsw-static-amber-900: rgb(39, 36, 31);
86
- --dsw-static-blue-100: rgb(219, 234, 254);
87
- --dsw-static-blue-300: rgb(147, 197, 253);
88
- --dsw-static-blue-400: rgb(96, 165, 250);
89
- --dsw-static-blue-450: rgb(77, 147, 248);
90
- --dsw-static-blue-500: rgb(59, 130, 246);
91
- --dsw-static-blue-50: rgb(239, 246, 255);
92
- --dsw-static-blue-50p: rgb(234, 243, 255);
93
- --dsw-static-blue-600: rgb(37, 99, 235);
94
- --dsw-static-blue-75: rgb(229, 240, 255);
95
- --dsw-static-blue-800: rgb(30, 64, 175);
96
- --dsw-static-blue-900: rgb(14, 48, 116);
97
- --dsw-static-blue-950: rgb(23, 37, 84);
98
- --dsw-static-deepseek-100: rgb(228, 237, 253);
99
- --dsw-static-deepseek-200: rgb(211, 226, 255);
100
- --dsw-static-deepseek-300: rgb(183, 200, 254);
101
- --dsw-static-deepseek-400: rgb(103, 158, 254);
102
- --dsw-static-deepseek-450: rgb(86, 134, 254);
103
- --dsw-static-deepseek-500: rgb(65, 118, 230);
104
- --dsw-static-deepseek-50: rgb(237, 243, 254);
105
- --dsw-static-deepseek-600: rgb(72, 104, 178);
106
- --dsw-static-deepseek-700-delete: rgb(47, 76, 143);
107
- --dsw-static-deepseek-800: rgb(52, 65, 91);
108
- --dsw-static-deepseek-900: rgb(40, 49, 66);
109
- --dsw-static-green-100: rgb(230, 250, 237);
110
- --dsw-static-green-400: rgb(78, 209, 126);
111
- --dsw-static-green-500: rgb(34, 197, 94);
112
- --dsw-static-green-900: rgb(35, 60, 44);
113
- --dsw-static-neutral-00: rgb(255, 255, 255);
114
- --dsw-static-neutral-1000: rgb(0, 0, 0);
115
- --dsw-static-neutral-100: rgb(245, 245, 245);
116
- --dsw-static-neutral-150: rgb(237, 237, 237);
117
- --dsw-static-neutral-200: rgb(229, 229, 229);
118
- --dsw-static-neutral-250: rgb(220, 220, 220);
119
- --dsw-static-neutral-300: rgb(212, 212, 212);
120
- --dsw-static-neutral-400: rgb(162, 164, 166);
121
- --dsw-static-neutral-500: rgb(127, 130, 135);
122
- --dsw-static-neutral-50: rgb(250, 250, 250);
123
- --dsw-static-neutral-550: rgb(101, 103, 107);
124
- --dsw-static-neutral-600: rgb(84, 85, 87);
125
- --dsw-static-neutral-700: rgb(60, 60, 61);
126
- --dsw-static-neutral-800: rgb(41, 41, 41);
127
- --dsw-static-neutral-850: rgb(33, 33, 35);
128
- --dsw-static-neutral-900: rgb(15, 15, 15);
129
- --dsw-static-neutral-bluish-00: rgb(255, 255, 255);
130
- --dsw-static-neutral-bluish-1000: rgb(15, 17, 21);
131
- --dsw-static-neutral-bluish-100: rgb(235, 238, 242);
132
- --dsw-static-neutral-bluish-150: rgb(233, 236, 242);
133
- --dsw-static-neutral-bluish-200: rgb(225, 229, 238);
134
- --dsw-static-neutral-bluish-300: rgb(207, 211, 214);
135
- --dsw-static-neutral-bluish-400: rgb(173, 178, 184);
136
- --dsw-static-neutral-bluish-500: rgb(151, 157, 166);
137
- --dsw-static-neutral-bluish-50: rgb(249, 250, 251);
138
- --dsw-static-neutral-bluish-600: rgb(129, 133, 140);
139
- --dsw-static-neutral-bluish-60: rgb(249, 250, 251);
140
- --dsw-static-neutral-bluish-700: rgb(97, 102, 107);
141
- --dsw-static-neutral-bluish-750: rgb(67, 69, 74);
142
- --dsw-static-neutral-bluish-75: rgb(241, 243, 245);
143
- --dsw-static-neutral-bluish-800: rgb(53, 54, 56);
144
- --dsw-static-neutral-bluish-850: rgb(44, 44, 46);
145
- --dsw-static-neutral-bluish-875: rgb(35, 35, 36);
146
- --dsw-static-neutral-bluish-900: rgb(27, 27, 28);
147
- --dsw-static-neutral-bluish-950: rgb(21, 21, 23);
148
- --dsw-static-red-100: rgb(254, 226, 226);
149
- --dsw-static-red-400: rgb(242, 90, 90);
150
- --dsw-static-red-500: rgb(239, 68, 68);
151
- --dsw-static-red-50: rgb(254, 242, 242);
152
- --dsw-static-red-600: rgb(236, 19, 19);
153
- --dsw-static-red-900: rgb(87, 12, 12);
154
- }
155
-
156
- body {
157
- --dsw-alias-bg-base: var(--dsw-static-neutral-bluish-00);
158
- --dsw-alias-bg-layer-1: var(--dsw-static-neutral-bluish-00);
159
- --dsw-alias-bg-layer-2: var(--dsw-static-neutral-bluish-00);
160
- --dsw-alias-bg-layer-3: var(--dsw-static-neutral-bluish-00);
161
- --dsw-alias-bg-mask-1: rgba(0, 0, 0, 0.24);
162
- --dsw-alias-bg-mask-2: rgba(0, 0, 0, 0.12);
163
- --dsw-alias-bg-mask-3: rgba(0, 0, 0, 0.48);
164
- --dsw-alias-bg-mask-photo: rgba(0, 0, 0, 0.88);
165
- --dsw-alias-bg-mask-drop: rgba(255, 255, 255, 0.7);
166
- --dsw-alias-bg-module-platform: var(--dsw-static-neutral-bluish-60);
167
- --dsw-alias-bg-multi-select: var(--dsw-static-neutral-bluish-60);
168
- --dsw-alias-bg-overlay: var(--dsw-static-neutral-bluish-150);
169
- --dsw-alias-bg-skeleton: rgba(0, 0, 0, 0.04);
170
- --dsw-alias-border-inverted2: rgba(0, 0, 0, 0);
171
- --dsw-alias-border-inverted: rgba(0, 0, 0, 0);
172
- --dsw-alias-border-l1: rgba(0, 0, 0, 0.04);
173
- --dsw-alias-border-l2-darkmode-thin: rgba(0, 0, 0, 0.1);
174
- --dsw-alias-border-l2: rgba(0, 0, 0, 0.1);
175
- --dsw-alias-border-l3: rgba(0, 0, 0, 0.12);
176
- --dsw-alias-border-l4: rgba(0, 0, 0, 0.16);
177
- --dsw-alias-brand-primary-invert: var(--dsw-static-neutral-bluish-1000);
178
- --dsw-alias-brand-primary-new-colorprimary-new-color: rgb(65, 118, 230);
179
- --dsw-alias-brand-primary: var(--dsw-static-neutral-bluish-1000);
180
- --dsw-alias-brand-text: var(--dsw-static-neutral-bluish-1000);
181
- --dsw-alias-button-contrast-fill: var(--dsw-static-neutral-bluish-700);
182
- --dsw-alias-button-elevated-fill: var(--dsw-static-neutral-bluish-00);
183
- --dsw-alias-button-floating-fill: var(--dsw-static-neutral-bluish-00);
184
- --dsw-alias-button-floating-hover: var(--dsw-static-neutral-bluish-75);
185
- --dsw-alias-button-ghost-active-border: var(--dsw-static-neutral-bluish-500);
186
- --dsw-alias-button-ghost-active-fill: var(--dsw-static-neutral-bluish-100);
187
- --dsw-alias-button-ghost-active-hover: var(--dsw-static-neutral-bluish-150);
188
- --dsw-alias-button-info-fill: var(--dsw-static-deepseek-500);
189
- --dsw-alias-button-info-hover: var(--dsw-static-deepseek-400);
190
- --dsw-alias-button-primary-dimmed: var(--dsw-static-neutral-bluish-100);
191
- --dsw-alias-button-primary-fill: var(--dsw-alias-brand-primary);
192
- --dsw-alias-button-primary-hover: var(--dsw-static-neutral-bluish-750);
193
- --dsw-alias-button-tool-bar-fill-invisible: rgba(31, 31, 31, 0.36);
194
- --dsw-alias-button-tool-bar-fill: rgba(84, 85, 87, 0.5);
195
- --dsw-alias-button-tool-bar-hover: rgba(84, 85, 87, 0.6);
196
- --dsw-alias-interactive-bg-active: rgba(38, 49, 72, 0.1);
197
- --dsw-alias-interactive-bg-hover-accent: rgba(38, 49, 72, 0.14);
198
- --dsw-alias-interactive-bg-hover-danger: rgba(236, 19, 19, 0.05);
199
- --dsw-alias-interactive-bg-hover-solid: var(--dsw-static-neutral-bluish-75);
200
- --dsw-alias-interactive-bg-hover: rgba(38, 49, 72, 0.06);
201
- --dsw-alias-label-caption: var(--dsw-static-neutral-bluish-400);
202
- --dsw-alias-label-dimmed: var(--dsw-static-neutral-bluish-200);
203
- --dsw-alias-label-primary-bluish: var(--dsw-static-blue-900);
204
- --dsw-alias-label-primary-dimmed: var(--dsw-static-neutral-bluish-950);
205
- --dsw-alias-label-primary-foreground: var(--dsw-static-neutral-bluish-00);
206
- --dsw-alias-label-primary-inverted: var(--dsw-static-neutral-bluish-00);
207
- --dsw-alias-label-primary: var(--dsw-static-neutral-bluish-1000);
208
- --dsw-alias-label-secondary: var(--dsw-static-neutral-bluish-700);
209
- --dsw-alias-label-tertiary: var(--dsw-static-neutral-bluish-600);
210
- --dsw-alias-markdown-citation: var(--dsw-static-neutral-bluish-100);
211
- --dsw-alias-markdown-code-block-banner: var(--dsw-static-neutral-bluish-50);
212
- --dsw-alias-markdown-code-block: var(--dsw-static-neutral-bluish-50);
213
- --dsw-alias-markdown-code-segment-selected: var(--dsw-static-neutral-bluish-00);
214
- --dsw-alias-markdown-code-segment-unselected: var(--dsw-static-neutral-bluish-75);
215
- --dsw-alias-markdown-inline-code: var(--dsw-static-neutral-bluish-100);
216
- --dsw-alias-markdown-placeholder: var(--dsw-static-neutral-bluish-60);
217
- --dsw-alias-markdown-tag: var(--dsw-static-neutral-bluish-75);
218
- --dsw-alias-scrollbar-bg-l1: var(--dsw-static-neutral-200);
219
- --dsw-alias-scrollbar-bg-l2: var(--dsw-static-neutral-200);
220
- --dsw-alias-scrollbar-hover-l1: var(--dsw-static-neutral-300);
221
- --dsw-alias-scrollbar-hover-l2: var(--dsw-static-neutral-300);
222
- --dsw-alias-state-business-primary: var(--dsw-static-deepseek-500);
223
- --dsw-alias-state-business-tertiary: var(--dsw-static-deepseek-100);
224
- --dsw-alias-state-error-primary: var(--dsw-static-red-600);
225
- --dsw-alias-state-error-secondary: var(--dsw-static-red-400);
226
- --dsw-alias-state-success-primary: var(--dsw-static-green-500);
227
- --dsw-alias-state-success-secondary: var(--dsw-static-green-400);
228
- --dsw-alias-state-success-tertiary: var(--dsw-static-green-100);
229
- --dsw-alias-state-warn-label: var(--dsw-static-amber-600);
230
- --dsw-alias-state-warn-primary: var(--dsw-static-amber-500);
231
- --dsw-alias-state-warn-secondary: var(--dsw-static-amber-400);
232
- --dsw-alias-state-warn-tertiary: var(--dsw-static-amber-100);
233
- --dsw-alias-toast-bg: var(--dsw-static-neutral-bluish-800);
234
- --dsw-alias-tooltip-bg: var(--dsw-static-neutral-bluish-850);
235
- --dsw-specific-bubble-highlight: var(--dsw-static-deepseek-200);
236
- --dsw-specific-bubble: var(--dsw-static-deepseek-50);
237
- --dsw-specific-input-major: var(--dsw-static-neutral-bluish-00);
238
- --dsw-specific-login-input: var(--dsw-static-neutral-bluish-50);
239
- --dsw-specific-menu: var(--dsw-alias-bg-layer-3);
240
- --dsw-specific-selector: var(--dsw-static-neutral-bluish-60);
241
- --dsw-specific-sidebar-fill: var(--dsw-static-neutral-bluish-50);
242
- --dsw-specific-sidebar-nav-item-active-accent: var(--dsw-static-deepseek-100);
243
- --dsw-specific-sidebar-nav-item-active: var(--dsw-static-neutral-bluish-100);
244
- --dsw-specific-sidebar-nav-item-hover: var(--dsw-static-neutral-bluish-75);
245
- --dsw-specific-tip: var(--dsw-static-neutral-bluish-60);
246
- }
247
-
248
- body[data-ds-dark-theme] {
249
- --dsw-alias-bg-base: var(--dsw-static-neutral-bluish-950);
250
- --dsw-alias-bg-layer-1: var(--dsw-static-neutral-bluish-875);
251
- --dsw-alias-bg-layer-2: var(--dsw-static-neutral-bluish-850);
252
- --dsw-alias-bg-layer-3: var(--dsw-static-neutral-bluish-800);
253
- --dsw-alias-bg-mask-1: rgba(0, 0, 0, 0.5);
254
- --dsw-alias-bg-mask-2: rgba(0, 0, 0, 0.2);
255
- --dsw-alias-bg-mask-3: rgba(0, 0, 0, 0.48);
256
- --dsw-alias-bg-mask-photo: rgba(0, 0, 0, 0.88);
257
- --dsw-alias-bg-mask-drop: rgba(39, 39, 48, 0.7);
258
- --dsw-alias-bg-module-platform: var(--dsw-static-neutral-bluish-800);
259
- --dsw-alias-bg-multi-select: var(--dsw-static-neutral-850);
260
- --dsw-alias-bg-overlay: var(--dsw-static-neutral-bluish-700);
261
- --dsw-alias-bg-skeleton: rgba(255, 255, 255, 0.08);
262
- --dsw-alias-border-inverted2: rgba(255, 255, 255, 0.08);
263
- --dsw-alias-border-inverted: rgba(255, 255, 255, 0.06);
264
- --dsw-alias-border-l1: rgba(255, 255, 255, 0.06);
265
- --dsw-alias-border-l2-darkmode-thin: rgba(255, 255, 255, 0.06);
266
- --dsw-alias-border-l2: rgba(255, 255, 255, 0.12);
267
- --dsw-alias-border-l3: rgba(255, 255, 255, 0.16);
268
- --dsw-alias-border-l4: rgba(255, 255, 255, 0.2);
269
- --dsw-alias-brand-primary-invert: var(--dsw-static-neutral-bluish-50);
270
- --dsw-alias-brand-primary-new-colorprimary-new-color: var(--dsw-static-deepseek-450);
271
- --dsw-alias-brand-primary: var(--dsw-static-neutral-bluish-50);
272
- --dsw-alias-brand-text: var(--dsw-static-neutral-bluish-50);
273
- --dsw-alias-button-contrast-fill: var(--dsw-static-neutral-bluish-50);
274
- --dsw-alias-button-elevated-fill: var(--dsw-static-neutral-bluish-750);
275
- --dsw-alias-button-floating-fill: var(--dsw-static-neutral-bluish-850);
276
- --dsw-alias-button-floating-hover: var(--dsw-static-neutral-bluish-800);
277
- --dsw-alias-button-ghost-active-border: var(--dsw-static-neutral-bluish-600);
278
- --dsw-alias-button-ghost-active-fill: var(--dsw-static-neutral-bluish-750);
279
- --dsw-alias-button-ghost-active-hover: var(--dsw-static-neutral-bluish-700);
280
- --dsw-alias-button-info-fill: var(--dsw-static-deepseek-400);
281
- --dsw-alias-button-info-hover: var(--dsw-static-deepseek-500);
282
- --dsw-alias-button-primary-dimmed: var(--dsw-static-neutral-bluish-750);
283
- --dsw-alias-button-primary-fill: var(--dsw-alias-brand-primary);
284
- --dsw-alias-button-primary-hover: var(--dsw-static-neutral-bluish-100);
285
- --dsw-alias-button-tool-bar-fill-invisible: rgba(31, 31, 31, 0.36);
286
- --dsw-alias-button-tool-bar-fill: rgba(84, 85, 87, 0.5);
287
- --dsw-alias-button-tool-bar-hover: rgba(84, 85, 87, 0.6);
288
- --dsw-alias-interactive-bg-active: rgba(255, 255, 255, 0.14);
289
- --dsw-alias-interactive-bg-hover-accent: rgba(255, 255, 255, 0.24);
290
- --dsw-alias-interactive-bg-hover-danger: rgba(242, 90, 90, 0.15);
291
- --dsw-alias-interactive-bg-hover-solid: var(--dsw-static-neutral-bluish-800);
292
- --dsw-alias-interactive-bg-hover: rgba(255, 255, 255, 0.08);
293
- --dsw-alias-label-caption: var(--dsw-static-neutral-bluish-600);
294
- --dsw-alias-label-dimmed: var(--dsw-static-neutral-bluish-750);
295
- --dsw-alias-label-primary-bluish: var(--dsw-static-neutral-bluish-50);
296
- --dsw-alias-label-primary-dimmed: var(--dsw-static-neutral-bluish-100);
297
- --dsw-alias-label-primary-foreground: var(--dsw-static-neutral-bluish-1000);
298
- --dsw-alias-label-primary-inverted: var(--dsw-static-neutral-bluish-800);
299
- --dsw-alias-label-primary: var(--dsw-static-neutral-bluish-50);
300
- --dsw-alias-label-secondary: var(--dsw-static-neutral-bluish-300);
301
- --dsw-alias-label-tertiary: var(--dsw-static-neutral-bluish-400);
302
- --dsw-alias-markdown-citation: var(--dsw-static-neutral-bluish-800);
303
- --dsw-alias-markdown-code-block-banner: var(--dsw-static-neutral-bluish-850);
304
- --dsw-alias-markdown-code-block: var(--dsw-static-neutral-bluish-900);
305
- --dsw-alias-markdown-code-segment-selected: var(--dsw-static-neutral-bluish-800);
306
- --dsw-alias-markdown-code-segment-unselected: var(--dsw-static-neutral-bluish-900);
307
- --dsw-alias-markdown-inline-code: var(--dsw-static-neutral-bluish-850);
308
- --dsw-alias-markdown-placeholder: var(--dsw-static-neutral-bluish-850);
309
- --dsw-alias-markdown-tag: var(--dsw-static-neutral-bluish-850);
310
- --dsw-alias-scrollbar-bg-l1: var(--dsw-static-neutral-700);
311
- --dsw-alias-scrollbar-bg-l2: var(--dsw-static-neutral-600);
312
- --dsw-alias-scrollbar-hover-l1: var(--dsw-static-neutral-600);
313
- --dsw-alias-scrollbar-hover-l2: var(--dsw-static-neutral-550);
314
- --dsw-alias-state-business-primary: var(--dsw-static-deepseek-400);
315
- --dsw-alias-state-business-tertiary: var(--dsw-static-deepseek-800);
316
- --dsw-alias-state-error-primary: var(--dsw-static-red-400);
317
- --dsw-alias-state-error-secondary: var(--dsw-static-red-400);
318
- --dsw-alias-state-success-primary: var(--dsw-static-green-500);
319
- --dsw-alias-state-success-secondary: var(--dsw-static-green-400);
320
- --dsw-alias-state-success-tertiary: var(--dsw-static-green-900);
321
- --dsw-alias-state-warn-label: var(--dsw-static-amber-600);
322
- --dsw-alias-state-warn-primary: var(--dsw-static-amber-500);
323
- --dsw-alias-state-warn-secondary: var(--dsw-static-amber-400);
324
- --dsw-alias-state-warn-tertiary: var(--dsw-static-amber-900);
325
- --dsw-alias-toast-bg: var(--dsw-static-neutral-bluish-750);
326
- --dsw-alias-tooltip-bg: var(--dsw-static-neutral-bluish-750);
327
- --dsw-specific-bubble-highlight: var(--dsw-static-neutral-bluish-750);
328
- --dsw-specific-bubble: var(--dsw-static-neutral-bluish-850);
329
- --dsw-specific-input-major: var(--dsw-static-neutral-bluish-850);
330
- --dsw-specific-login-input: var(--dsw-static-neutral-bluish-900);
331
- --dsw-specific-menu: var(--dsw-alias-bg-layer-3);
332
- --dsw-specific-selector: var(--dsw-static-neutral-bluish-800);
333
- --dsw-specific-sidebar-fill: var(--dsw-static-neutral-bluish-900);
334
- --dsw-specific-sidebar-nav-item-active-accent: var(--dsw-static-neutral-bluish-800);
335
- --dsw-specific-sidebar-nav-item-active: var(--dsw-static-neutral-bluish-750);
336
- --dsw-specific-sidebar-nav-item-hover: var(--dsw-static-neutral-bluish-850);
337
- --dsw-specific-tip: var(--dsw-static-neutral-bluish-800);
338
- }
@@ -1,232 +0,0 @@
1
- body {
2
- --dsw-linear-gradient-think: linear-gradient(180deg, #fff 20.19%, rgba(255, 255, 255, 0) 100%);
3
- --dsw-linear-think-select: linear-gradient(180deg, #f5f6f7 20.19%, rgba(245, 246, 247, 0) 100%);
4
- /* 阴影 */
5
- --dsw-shadow-lv1: 0 2px 4px 0 rgba(0, 0, 0, 0.05);
6
- --dsw-shadow-lv1-blur: 0 4px 12px 0 rgba(0, 0, 0, 0.02);
7
- --dsw-shadow-lv2: 0 4px 12px 0 rgba(0, 0, 0, 0.02), 0 2px 8px 0 rgba(0, 0, 0, 0.04);
8
- --dsw-shadow-lv3:
9
- 0 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 4px 0 rgba(0, 0, 0, 0.02), 0 12px 32px 0 rgba(0, 0, 0, 0.08);
10
- /* blur filter */
11
- --dsw-mask-blur: blur(2px);
12
- }
13
-
14
- body[data-ds-dark-theme] {
15
- --dsw-linear-gradient-think: linear-gradient(180deg, #151517 20.19%, rgba(21, 21, 23, 0) 100%);
16
- --dsw-linear-think-select: linear-gradient(180deg, #232325 20.19%, rgba(35, 35, 37, 0) 100%);
17
- }
18
-
19
- /* ---------- 字体 ---------- */
20
- /* 由 @deepseek-figma-plugin/custom-variable-name 插件导出 */
21
- body {
22
- --dsw-font-markdown-h1: 700 24px/34px var(--dsw-font-family);
23
- --dsw-font-markdown-h1-font-family: var(--dsw-font-family);
24
- --dsw-font-markdown-h1-font-weight: 700;
25
- --dsw-font-markdown-h1-line-height: 34px;
26
- --dsw-font-markdown-h1-font-size: 24px;
27
- --dsw-font-markdown-h1-font-style: normal;
28
-
29
- --dsw-font-markdown-h2: 700 22px/32px var(--dsw-font-family);
30
- --dsw-font-markdown-h2-font-family: var(--dsw-font-family);
31
- --dsw-font-markdown-h2-font-weight: 700;
32
- --dsw-font-markdown-h2-line-height: 32px;
33
- --dsw-font-markdown-h2-font-size: 22px;
34
- --dsw-font-markdown-h2-font-style: normal;
35
-
36
- --dsw-font-markdown-h3: 700 20px/30px var(--dsw-font-family);
37
- --dsw-font-markdown-h3-font-family: var(--dsw-font-family);
38
- --dsw-font-markdown-h3-font-weight: 700;
39
- --dsw-font-markdown-h3-line-height: 30px;
40
- --dsw-font-markdown-h3-font-size: 20px;
41
- --dsw-font-markdown-h3-font-style: normal;
42
-
43
- --dsw-font-markdown-h4: 600 16px/28px var(--dsw-font-family);
44
- --dsw-font-markdown-h4-font-family: var(--dsw-font-family);
45
- --dsw-font-markdown-h4-font-weight: 600;
46
- --dsw-font-markdown-h4-line-height: 28px;
47
- --dsw-font-markdown-h4-font-size: 16px;
48
- --dsw-font-markdown-h4-font-style: normal;
49
-
50
- --dsw-font-markdown-base: 16px/28px var(--dsw-font-family);
51
- --dsw-font-markdown-base-font-family: var(--dsw-font-family);
52
- --dsw-font-markdown-base-font-weight: 400;
53
- --dsw-font-markdown-base-line-height: 28px;
54
- --dsw-font-markdown-base-font-size: 16px;
55
- --dsw-font-markdown-base-font-style: normal;
56
-
57
- --dsw-font-markdown-base-strong: 600 16px/28px var(--dsw-font-family);
58
- --dsw-font-markdown-base-strong-font-family: var(--dsw-font-family);
59
- --dsw-font-markdown-base-strong-font-weight: 600;
60
- --dsw-font-markdown-base-strong-line-height: 28px;
61
- --dsw-font-markdown-base-strong-font-size: 16px;
62
- --dsw-font-markdown-base-strong-font-style: normal;
63
-
64
- --dsw-font-markdown-base-italic: italic 16px/28px var(--dsw-font-family);
65
- --dsw-font-markdown-base-italic-font-family: var(--dsw-font-family);
66
- --dsw-font-markdown-base-italic-font-weight: 400;
67
- --dsw-font-markdown-base-italic-line-height: 28px;
68
- --dsw-font-markdown-base-italic-font-size: 16px;
69
- --dsw-font-markdown-base-italic-font-style: italic;
70
-
71
- --dsw-font-markdown-base-strong-italic: italic 600 16px/28px var(--dsw-font-family);
72
- --dsw-font-markdown-base-strong-italic-font-family: var(--dsw-font-family);
73
- --dsw-font-markdown-base-strong-italic-font-weight: 600;
74
- --dsw-font-markdown-base-strong-italic-line-height: 28px;
75
- --dsw-font-markdown-base-strong-italic-font-size: 16px;
76
- --dsw-font-markdown-base-strong-italic-font-style: italic;
77
-
78
- --dsw-font-markdown-table: 15px/25px var(--dsw-font-family);
79
- --dsw-font-markdown-table-font-family: var(--dsw-font-family);
80
- --dsw-font-markdown-table-font-weight: 400;
81
- --dsw-font-markdown-table-line-height: 25px;
82
- --dsw-font-markdown-table-font-size: 15px;
83
- --dsw-font-markdown-table-font-style: normal;
84
-
85
- --dsw-font-markdown-table-head: 500 15px/25px var(--dsw-font-family);
86
- --dsw-font-markdown-table-head-font-family: var(--dsw-font-family);
87
- --dsw-font-markdown-table-head-font-weight: 500;
88
- --dsw-font-markdown-table-head-line-height: 25px;
89
- --dsw-font-markdown-table-head-font-size: 15px;
90
- --dsw-font-markdown-table-head-font-style: normal;
91
-
92
- --dsw-font-markdown-small: 14px/24px var(--dsw-font-family);
93
- --dsw-font-markdown-small-font-family: var(--dsw-font-family);
94
- --dsw-font-markdown-small-font-weight: 400;
95
- --dsw-font-markdown-small-line-height: 24px;
96
- --dsw-font-markdown-small-font-size: 14px;
97
- --dsw-font-markdown-small-font-style: normal;
98
-
99
- --dsw-font-markdown-small-strong: 600 14px/24px var(--dsw-font-family);
100
- --dsw-font-markdown-small-strong-font-family: var(--dsw-font-family);
101
- --dsw-font-markdown-small-strong-font-weight: 600;
102
- --dsw-font-markdown-small-strong-line-height: 24px;
103
- --dsw-font-markdown-small-strong-font-size: 14px;
104
- --dsw-font-markdown-small-strong-font-style: normal;
105
-
106
- --dsw-font-markdown-small-italic: italic 14px/24px var(--dsw-font-family);
107
- --dsw-font-markdown-small-italic-font-family: var(--dsw-font-family);
108
- --dsw-font-markdown-small-italic-font-weight: 400;
109
- --dsw-font-markdown-small-italic-line-height: 24px;
110
- --dsw-font-markdown-small-italic-font-size: 14px;
111
- --dsw-font-markdown-small-italic-font-style: italic;
112
-
113
- --dsw-font-markdown-small-strong-italic: italic 600 14px/24px var(--dsw-font-family);
114
- --dsw-font-markdown-small-strong-italic-font-family: var(--dsw-font-family);
115
- --dsw-font-markdown-small-strong-italic-font-weight: 600;
116
- --dsw-font-markdown-small-strong-italic-line-height: 24px;
117
- --dsw-font-markdown-small-strong-italic-font-size: 14px;
118
- --dsw-font-markdown-small-strong-italic-font-style: italic;
119
-
120
- --dsw-font-markdown-code: 14px/22px var(--ds-font-family-code);
121
- --dsw-font-markdown-code-font-family: var(--ds-font-family-code);
122
- --dsw-font-markdown-code-font-weight: 400;
123
- --dsw-font-markdown-code-line-height: 22px;
124
- --dsw-font-markdown-code-font-size: 14px;
125
- --dsw-font-markdown-code-font-style: normal;
126
-
127
- --dsw-font-markdown-code-block: 13px/22px var(--ds-font-family-code);
128
- --dsw-font-markdown-code-block-font-family: var(--ds-font-family-code);
129
- --dsw-font-markdown-code-block-font-weight: 400;
130
- --dsw-font-markdown-code-block-line-height: 22px;
131
- --dsw-font-markdown-code-block-font-size: 13px;
132
- --dsw-font-markdown-code-block-font-style: normal;
133
-
134
- /* 手工补充(非插件导出):tool row 展开卡片内的小号 code 字体。 */
135
- --dsw-font-markdown-code-block-small: 12px/18px var(--ds-font-family-code);
136
- --dsw-font-markdown-code-block-small-font-family: var(--ds-font-family-code);
137
- --dsw-font-markdown-code-block-small-font-weight: 400;
138
- --dsw-font-markdown-code-block-small-line-height: 18px;
139
- --dsw-font-markdown-code-block-small-font-size: 12px;
140
- --dsw-font-markdown-code-block-small-font-style: normal;
141
-
142
- --dsw-font-xl-24: 600 24px/32px var(--dsw-font-family);
143
- --dsw-font-xl-24-font-family: var(--dsw-font-family);
144
- --dsw-font-xl-24-font-weight: 600;
145
- --dsw-font-xl-24-line-height: 32px;
146
- --dsw-font-xl-24-font-size: 24px;
147
- --dsw-font-xl-24-font-style: normal;
148
-
149
- --dsw-font-l-20: 500 20px/28px var(--dsw-font-family);
150
- --dsw-font-l-20-font-family: var(--dsw-font-family);
151
- --dsw-font-l-20-font-weight: 500;
152
- --dsw-font-l-20-line-height: 28px;
153
- --dsw-font-l-20-font-size: 20px;
154
- --dsw-font-l-20-font-style: normal;
155
-
156
- --dsw-font-m-18: 500 16px/28px var(--dsw-font-family);
157
- --dsw-font-m-18-font-family: var(--dsw-font-family);
158
- --dsw-font-m-18-font-weight: 500;
159
- --dsw-font-m-18-line-height: 28px;
160
- --dsw-font-m-18-font-size: 16px;
161
- --dsw-font-m-18-font-style: normal;
162
-
163
- --dsw-font-base-16: 16px/24px var(--dsw-font-family);
164
- --dsw-font-base-16-font-family: var(--dsw-font-family);
165
- --dsw-font-base-16-font-weight: 400;
166
- --dsw-font-base-16-line-height: 24px;
167
- --dsw-font-base-16-font-size: 16px;
168
- --dsw-font-base-16-font-style: normal;
169
-
170
- --dsw-font-base-strong-16: 500 16px/24px var(--dsw-font-family);
171
- --dsw-font-base-strong-16-font-family: var(--dsw-font-family);
172
- --dsw-font-base-strong-16-font-weight: 500;
173
- --dsw-font-base-strong-16-line-height: 24px;
174
- --dsw-font-base-strong-16-font-size: 16px;
175
- --dsw-font-base-strong-16-font-style: normal;
176
-
177
- --dsw-font-s-14: 14px/22px var(--dsw-font-family);
178
- --dsw-font-s-14-font-family: var(--dsw-font-family);
179
- --dsw-font-s-14-font-weight: 400;
180
- --dsw-font-s-14-line-height: 22px;
181
- --dsw-font-s-14-font-size: 14px;
182
- --dsw-font-s-14-font-style: normal;
183
-
184
- --dsw-font-s-strong-14: 500 14px/22px var(--dsw-font-family);
185
- --dsw-font-s-strong-14-font-family: var(--dsw-font-family);
186
- --dsw-font-s-strong-14-font-weight: 500;
187
- --dsw-font-s-strong-14-line-height: 22px;
188
- --dsw-font-s-strong-14-font-size: 14px;
189
- --dsw-font-s-strong-14-font-style: normal;
190
-
191
- --dsw-font-xs-13: 13px/20px var(--dsw-font-family);
192
- --dsw-font-xs-13-font-family: var(--dsw-font-family);
193
- --dsw-font-xs-13-font-weight: 400;
194
- --dsw-font-xs-13-line-height: 20px;
195
- --dsw-font-xs-13-font-size: 13px;
196
- --dsw-font-xs-13-font-style: normal;
197
-
198
- --dsw-font-xs-strong-13: 500 13px/20px var(--dsw-font-family);
199
- --dsw-font-xs-strong-13-font-family: var(--dsw-font-family);
200
- --dsw-font-xs-strong-13-font-weight: 500;
201
- --dsw-font-xs-strong-13-line-height: 20px;
202
- --dsw-font-xs-strong-13-font-size: 13px;
203
- --dsw-font-xs-strong-13-font-style: normal;
204
-
205
- --dsw-font-xxs-12: 12px/18px var(--dsw-font-family);
206
- --dsw-font-xxs-12-font-family: var(--dsw-font-family);
207
- --dsw-font-xxs-12-font-weight: 400;
208
- --dsw-font-xxs-12-line-height: 18px;
209
- --dsw-font-xxs-12-font-size: 12px;
210
- --dsw-font-xxs-12-font-style: normal;
211
-
212
- --dsw-font-xxs-strong-12: 500 12px/18px var(--dsw-font-family);
213
- --dsw-font-xxs-strong-12-font-family: var(--dsw-font-family);
214
- --dsw-font-xxs-strong-12-font-weight: 500;
215
- --dsw-font-xxs-strong-12-line-height: 18px;
216
- --dsw-font-xxs-strong-12-font-size: 12px;
217
- --dsw-font-xxs-strong-12-font-style: normal;
218
-
219
- --dsw-font-xxxs-11: 11px/14px var(--dsw-font-family);
220
- --dsw-font-xxxs-11-font-family: var(--dsw-font-family);
221
- --dsw-font-xxxs-11-font-weight: 400;
222
- --dsw-font-xxxs-11-line-height: 14px;
223
- --dsw-font-xxxs-11-font-size: 11px;
224
- --dsw-font-xxxs-11-font-style: normal;
225
-
226
- --dsw-font-xxxs-strong-11: 500 11px/14px var(--dsw-font-family);
227
- --dsw-font-xxxs-strong-11-font-family: var(--dsw-font-family);
228
- --dsw-font-xxxs-strong-11-font-weight: 500;
229
- --dsw-font-xxxs-strong-11-line-height: 14px;
230
- --dsw-font-xxxs-strong-11-font-size: 11px;
231
- --dsw-font-xxxs-strong-11-font-style: normal;
232
- }
@@ -1,90 +0,0 @@
1
- /* Scrollbar skin: the sole consumer of the four --dsw-alias-scrollbar-*
2
- * tokens. Without it every scrolling region renders the UA scrollbar, which
3
- * ignores the theme — a light native bar over the dark palette.
4
- *
5
- * The rules sit on `body`, not `html`: design-platform.css declares the
6
- * --dsw-alias-* tokens on `body` (and the dark overrides on
7
- * `body[data-ds-dark-theme]`), and custom properties only inherit downward,
8
- * so an `html` rule resolves them to the guaranteed-invalid value and
9
- * `scrollbar-color` falls back to `auto`.
10
- *
11
- * Surfaces pick their elevation by rebinding --dsh-scrollbar-thumb{,-hover}:
12
- * the l1 pair here is the base-surface default, and an elevated surface
13
- * (menu, popover, dialog) rebinds to the l2 pair on its own container. Both
14
- * rendering paths below read the indirection, so one rebind reaches whichever
15
- * path the engine took. */
16
-
17
- body {
18
- --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l1);
19
- --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l1);
20
- /* The WebKit bar's layout width, mirrored by the ::-webkit-scrollbar rule
21
- below. A surface that must align itself beside a space-consuming bar
22
- (ConversationRoot's overlay composer seat) reads this instead of
23
- hardcoding the number. */
24
- --dsh-scrollbar-width: 8px;
25
- }
26
-
27
- /* The two paths are mutually exclusive, and the gate is load-bearing rather
28
- than defensive. A non-`auto` `scrollbar-width` or `scrollbar-color` makes
29
- Chromium and Safari drop every `::-webkit-scrollbar*` rule for that
30
- element, including `::-webkit-scrollbar-thumb:hover` — measured in chromium
31
- as an 8px `::-webkit-scrollbar` width taking effect on its own and being
32
- ignored as soon as `scrollbar-width: thin` is added. Declaring both
33
- unconditionally therefore leaves the hover tokens with no rendering at all,
34
- because the engines that implement the hover pseudo-element are exactly the
35
- ones the standard properties silence, and Firefox has no hover
36
- pseudo-element to fall back on.
37
-
38
- `not selector(::-webkit-scrollbar)` is true only where the pseudo-element
39
- is unimplemented, so Firefox takes the standard path and WebKit-based
40
- engines take the pseudo-element path. An engine too old for the
41
- `selector()` function makes the condition invalid, which evaluates false
42
- and selects the pseudo-element path — the correct side for the pre-16.4
43
- Safari that is the realistic case. */
44
- @supports not selector(::-webkit-scrollbar) {
45
- /* Declared on every element rather than inherited from `body`. Inheriting
46
- would pass down the COLOUR already substituted at `body`, so a descendant
47
- rebinding --dsh-scrollbar-thumb could not change it; re-declaring makes
48
- each element substitute the variable as it sees it, which is what gives
49
- an elevated surface a working rebind. `scrollbar-width` is not an
50
- inherited property at all, so it needs the per-element declaration
51
- regardless.
52
-
53
- No hover counterpart exists on this path: `scrollbar-color` states one
54
- thumb colour and the engine derives its own hover treatment. */
55
- body,
56
- body * {
57
- scrollbar-width: thin;
58
- scrollbar-color: var(--dsh-scrollbar-thumb) transparent;
59
- }
60
- }
61
-
62
- /* Not gated in turn: an engine that does not implement these pseudo-elements
63
- drops the rules as unknown selectors, so the gate would only restate what
64
- selector matching already does. Not inherited either, hence the unscoped
65
- selectors. */
66
- ::-webkit-scrollbar {
67
- width: 8px;
68
- height: 8px;
69
- }
70
-
71
- /* Track stays transparent so the thumb reads against whatever surface scrolls
72
- under it; only the thumb carries a token colour. */
73
- ::-webkit-scrollbar-track {
74
- background: transparent;
75
- }
76
-
77
- ::-webkit-scrollbar-thumb {
78
- border-radius: 4px;
79
- background: var(--dsh-scrollbar-thumb);
80
- }
81
-
82
- ::-webkit-scrollbar-thumb:hover {
83
- background: var(--dsh-scrollbar-thumb-hover);
84
- }
85
-
86
- /* Both scrollbars meeting in a corner: no separate token, so the corner
87
- matches the transparent track rather than the UA's opaque default. */
88
- ::-webkit-scrollbar-corner {
89
- background: transparent;
90
- }
@@ -1,31 +0,0 @@
1
- /* Syntax-highlight token palette: the values behind shiki's css-variables
2
- theme (--shiki-* custom properties emitted by the ui-primitives CodeBlock).
3
- Light values on :root, dark overrides on the body attribute — the same
4
- cascade as every other token sheet. Background/foreground deliberately
5
- alias the markdown code-block tokens so highlighted and plain blocks agree. */
6
-
7
- :root {
8
- --shiki-foreground: var(--dsw-alias-label-primary);
9
- --shiki-background: var(--dsw-alias-markdown-code-block);
10
- --shiki-token-constant: #1c7ed6;
11
- --shiki-token-string: #2f9e44;
12
- --shiki-token-comment: #868e96;
13
- --shiki-token-keyword: #d6336c;
14
- --shiki-token-parameter: #e8590c;
15
- --shiki-token-function: #6741d9;
16
- --shiki-token-string-expression: #2b8a3e;
17
- --shiki-token-punctuation: #495057;
18
- --shiki-token-link: #1971c2;
19
- }
20
-
21
- body[data-ds-dark-theme] {
22
- --shiki-token-constant: #4dabf7;
23
- --shiki-token-string: #69db7c;
24
- --shiki-token-comment: #adb5bd;
25
- --shiki-token-keyword: #faa2c1;
26
- --shiki-token-parameter: #ffa94d;
27
- --shiki-token-function: #b197fc;
28
- --shiki-token-string-expression: #8ce99a;
29
- --shiki-token-punctuation: #ced4da;
30
- --shiki-token-link: #74c0fc;
31
- }