dsh-claude-style 0.19.2 → 0.19.3-dev.48

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.en.md CHANGED
@@ -48,7 +48,7 @@ The settings page switches between the two palettes; light and dark follow the s
48
48
  </tr>
49
49
  </table>
50
50
 
51
- > White canvas `#FFFFFF` with a `#FAFAFA` sidebar, blue-black `#13161D`, DeepSeek blue `#4D6BFE`; Deepy the pixel whale stands on the composer, in eight states:
51
+ > Pale blue-white canvas `#FBFCFF` with a `#F7F9FF` sidebar, blue-black `#13161D`, DeepSeek blue `#4D6BFE`; Deepy the pixel whale stands on the composer, in eight states:
52
52
 
53
53
  <table>
54
54
  <tr>
package/docs/CHANGELOG.md CHANGED
@@ -2,6 +2,56 @@
2
2
 
3
3
  All notable changes to `dsh-claude-style` are documented here, newest first.
4
4
 
5
+ ## [0.19.3] - 2026-10-25
6
+
7
+ [中文](#cn-0.19.3) | [English](#en-0.19.3)
8
+
9
+ <h3 id="cn-0.19.3">体验优化</h3>
10
+
11
+ - 改善 DeepSeek 配色的浅色层次:画布改为 #FBFCFF、侧栏为 #F7F9FF,表面、表头、悬停底、边框与文字色从画布种子派生,不再继承 Claude 的纯白卡片。
12
+ - 改善模型选择器在千级模型目录下的开销:开卡不再整卡重建,峰谷徽章按行原位刷新,价目表匹配与目录签名按代缓存。
13
+ - 改善主题风格切换的反馈:配色固定在某张颜色卡时,切换主题会提示「配色已被固定为…」,并可直接改为跟随品牌。
14
+
15
+ ### 问题修复
16
+
17
+ - 修复其他插件的输入框被套上整页焦点描边:键盘焦点环改由宿主自己的 `:focus-visible` 规则画出、皮肤只提供墨色,兜底环以零权重写在 `:where()` 里,插件声明的 `outline: none` 重新生效。
18
+ - 修复从独立成行切换到紧凑底栏时统计信息的详情与位置适配,使不同切换路径得到一致布局。
19
+ - 修复「进行中」分段仍显示已归档会话的问题:切换分段会同步宿主的筛选与分组,已归档改用宿主自己的列表,归档行保留删除按钮。
20
+ - 修复用量面板丢失账本安装前的历史、以及插件生成的会话不计入用量的问题:用量折叠按宿主认的逻辑会话 id 读取日志,账本没有记录的日子由本地折叠补齐。
21
+ - 修复内容搜索对含冒号或斜杠的会话 id 写不进缓存、以及一次读取失败让该会话从结果中消失的问题:缓存文件按 id 的哈希命名,读取失败的会话保留上一份语料并在下一轮重试。
22
+ - 修复单个特性的失败牵连整页的问题:设置写入被拒绝时重新读取存储值,事件分发与滚动缓动逐个隔离,measure 与 sync 分别累计连续失败次数。
23
+ - 修复关闭工作区开关后归档删除按钮仍在渲染、占位文案不随特性退出还原、折叠动画期间的第二次点击被丢弃,以及等待徽章退场定时器不随特性停止的问题。
24
+ - 修复延后加载的功能块一次失败后再也不重试、以及反复开关功能累积页面观察的问题:失败的块加载会被遗忘并在下次启用时重试,宿主查找共用一条页面观察;分块脚本超时也会失败而不是无限挂起。
25
+ - 修复独立成行时统计行比输入区底部那一行更高的问题:统计行现在与那一行同高,紧凑底栏仍占工具栏的一行。
26
+ - 修复独立成行时费用数字与前后数字之间的间距比其他数字之间更宽的问题,各数字现在按行自身的间距等距排布。
27
+
28
+ ### 安全
29
+
30
+ - 修复模型文案、字体与构建资源路由缺少同源栅栏的问题:这三个入口与其余私有路由共用同一道校验,非本机页面不能再借它们探测用户自置的字体。
31
+
32
+ <h3 id="en-0.19.3">Improvements</h3>
33
+
34
+ - Improve the DeepSeek palette's light steps: the canvas is #FBFCFF and the sidebar #F7F9FF, with surfaces, table heads, hover plates, borders and inks derived from that canvas instead of inheriting Claude's white card.
35
+ - Improve the model picker's cost on a four-digit model catalog: an open stops rebuilding the card, rate badges refresh row by row in place, and the price-table match and the catalog signature are cached per generation.
36
+ - Improve the feedback when switching theme style while the colours are pinned to a card: a toast names the pinned colours and offers to follow the brand again.
37
+
38
+ ### Bug Fixes
39
+
40
+ - Fix another plugin's inputs gaining a page-wide focus outline: the keyboard ring is now drawn by the host's own `:focus-visible` rules from the skin's ink, and the fallback ring weighs nothing inside `:where()`, so a plugin's own `outline: none` stands.
41
+ - Fix statistics detail and placement when switching from On its own line to Compact footer so different switching paths produce the same layout.
42
+ - Fix the In progress section still listing archived conversations: switching the segment now drives the host's filter and grouping, the archived view uses the host's own list, and its rows keep the delete button.
43
+ - Fix the usage panel losing history from before the cost ledger existed and sessions with plugin-generated ids never reaching the totals: the fold now reads logs by the host's logical session id, and days the ledger never recorded are filled from the local fold.
44
+ - Fix content search failing to cache sessions whose ids carry a colon or a slash, and a session disappearing from results after one unreadable pass: cache files are named by a hash of the id, and a session that cannot be read keeps its previous corpus and is retried on the next pass.
45
+ - Fix one feature's failure spreading across the page: a rejected settings write reads the stored value back, event dispatch and scroll easing are isolated per feature, and measure and sync count consecutive failures apart.
46
+ - Fix the archived-row delete action staying mounted after the workspace switch is turned off, placeholder text not being restored when the feature stands down, a second fold click dropped during the closing animation, and the wait badge's exit timer outliving its feature.
47
+ - Fix deferred feature chunks never retrying after one failed load and feature switches accumulating page observers: a failed chunk is forgotten and retried on the next enable, host lookups share one page observation, and a chunk whose script never arrives now times out instead of hanging.
48
+ - Fix the statistics standing taller than the composer's bottom row when they have a line of their own: the line now matches that row's height, while the compact footer keeps the toolbar row's.
49
+ - Fix the cost figure standing farther from the figures around it than they stand from each other when the statistics have a line of their own: every figure now keeps the line's own gap.
50
+
51
+ ### Security
52
+
53
+ - Fix the model copy, font and built-asset routes missing the same-origin fence every other private route carries: all three now pass the same check, so a page outside this machine can no longer probe the fonts a reader dropped in.
54
+
5
55
  ## [0.19.2] - 2026-10-24
6
56
 
7
57
  [中文](#cn-0.19.2) | [English](#en-0.19.2)
package/docs/STYLE.md CHANGED
@@ -31,7 +31,9 @@ Rules:
31
31
 
32
32
  - Never pure black. The Claude card's light canvas is the desktop's `#FFFFFF`
33
33
  with a `#FAFAFA` sidebar; its dark canvas is `#191919` with a `#1F1F1F`
34
- sidebar. The DeepSeek card's light canvas is white with a `#FAFAFA` sidebar.
34
+ sidebar. The DeepSeek card's light canvas is `#FBFCFF` with a `#F7F9FF`
35
+ sidebar; every surface, border and ink step around them is derived from that
36
+ canvas.
35
37
  The reader's own message plate is the card's `bubble` fill: Claude's neutral
36
38
  plate, DeepSeek's light blue `#ECF0FF`; the custom card derives it from its
37
39
  own canvas, so a conversation bubble reads as the card that painted it.
@@ -41,9 +43,10 @@ Rules:
41
43
 
42
44
  **The DeepSeek card** turns both schemes blue. Its accent is DeepSeek's brand
43
45
  blue `#4D6BFE` — the colour of its whale logo and of Deepy; the sidebar's whale
44
- and wordmark and the hero's fish take it as their ink. Its light canvas is pure
45
- white with a snow sidebar and a light blue reader's bubble, its dark canvas a
46
- blue-black, and its dark outlines are surface steps rather than highlights. The
46
+ and wordmark and the hero's fish take it as their ink. Its light canvas is
47
+ `#FBFCFF` with a `#F7F9FF` sidebar and a light blue reader's bubble, its dark
48
+ canvas a blue-black, and its dark outlines are surface steps rather than
49
+ highlights. The
47
50
  skin's Claude marks (the account row's picture without an avatar) become
48
51
  DeepSeek's
49
52
  whale (`packages/assets/src/brand/deepseek-mark.svg`, the host's `FISH_LOGO_PATH`); the
@@ -58,7 +61,7 @@ card leaves unset.
58
61
  | Card | Accent | Canvas light | Canvas dark | Sidebar light | Sidebar dark | Bubble light | Bubble dark | Link light | Link dark | Edges | Logo ink | Code light | Code dark |
59
62
  | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
60
63
  | claude (default) | `#d97757` | `#ffffff` | `#191919` | `#fafafa` | `#1f1f1f` | `#f4f2f3` | `rgba(255, 255, 255, 0.06)` | `#184f95` | `#8ab4f8` | highlight | ink | `#943333` | `#e8a08a` |
61
- | deepseek | `#4d6bfe` | `#ffffff` | `#13161d` | `#fafafa` | `#13161d` | `#ecf0ff` | `#262b36` | `#3b56d9` | `#8fa4ff` | surface | accent | `#0f1115` | `#eef1f8` |
64
+ | deepseek | `#4d6bfe` | `#fbfcff` | `#13161d` | `#f7f9ff` | `#13161d` | `#ecf0ff` | `#262b36` | `#3b56d9` | `#8fa4ff` | surface | accent | `#0f1115` | `#eef1f8` |
62
65
 
63
66
  | Tone | Seed | Light | Dark |
64
67
  | --- | --- | --- | --- |
@@ -106,66 +109,67 @@ card leaves unset.
106
109
 
107
110
  | Token | Tone | claude light | claude dark | deepseek light | deepseek dark | Host alias | Use |
108
111
  | --- | --- | --- | --- | --- | --- | --- | --- |
109
- | `--dsw-alias-bg-base` | `canvas` | `#ffffff` | `#191919` | `#ffffff` | `#13161d` | host's own | |
110
- | `--dsw-alias-bg-layer-1` | `surface-1` | `#ffffff` | `#212121` | `#ffffff` | `#1b1e26` | host's own | |
111
- | `--dsw-alias-bg-layer-2` | `surface-2` | `#ffffff` | `#282828` | `#ffffff` | `#22252d` | host's own | |
112
- | `--dsw-alias-bg-layer-3` | `surface-3` | `#ffffff` | `#323232` | `#ffffff` | `#2b2f37` | host's own | |
112
+ | `--dsw-alias-bg-base` | `canvas` | `#ffffff` | `#191919` | `#fbfcff` | `#13161d` | host's own | |
113
+ | `--dsw-alias-bg-layer-1` | `surface-1` | `#ffffff` | `#212121` | `#fbfcff` | `#1b1e26` | host's own | |
114
+ | `--dsw-alias-bg-layer-2` | `surface-2` | `#ffffff` | `#282828` | `#fbfcff` | `#22252d` | host's own | |
115
+ | `--dsw-alias-bg-layer-3` | `surface-3` | `#ffffff` | `#323232` | `#fcfdff` | `#2b2f37` | host's own | |
113
116
  | `--dsw-alias-bg-overlay` | `overlay` | `#ffffff` | `#282828` | `#ffffff` | `#22252d` | host's own | |
114
117
  | `--dsw-alias-border-l1` | `border-1` / `border-1-flat` | `#e9e9e9` | `rgba(255, 255, 255, 0.09)` | — | `#23262e` | host's own | the standard edge: card and panel outlines, dividers, field outlines |
115
118
  | `--dsw-alias-border-l2` | `border-2` / `border-2-flat` | `#dedede` | `rgba(255, 255, 255, 0.18)` | — | `#2c3038` | host's own | |
116
119
  | `--dsw-alias-border-l3` | `border-3` / `border-3-flat` | `#cfcfcf` | `rgba(255, 255, 255, 0.3)` | — | `#3a3d46` | host's own | |
117
- | `--dsh-claude-divider` | `divider` | `rgba(22, 22, 22, 0.05)` | `rgba(255, 255, 255, 0.06)` | `rgba(22, 22, 22, 0.05)` | `rgba(251, 255, 255, 0.06)` | `var(--dsw-alias-border-l1)` | a line that only separates: foot areas, settings rows, menu separators, the transcript's rule |
120
+ | `--dsh-claude-divider` | `divider` | `rgba(22, 22, 22, 0.05)` | `rgba(255, 255, 255, 0.06)` | `rgba(19, 20, 22, 0.05)` | `rgba(251, 255, 255, 0.06)` | `var(--dsw-alias-border-l1)` | a line that only separates: foot areas, settings rows, menu separators, the transcript's rule |
118
121
  | `--dsw-alias-brand-primary` | `accent` | `#d97757` | `#d97757` | `#4d6bfe` | `#4d6bfe` | host's own | the single accent: checks, focus rings, selected marks |
119
- | `--dsw-alias-brand-text` | `on-accent` | `#ffffff` | `#fbfbfb` | `#ffffff` | `#f2f7ff` | host's own | |
122
+ | `--dsw-alias-brand-text` | `on-accent` | `#ffffff` | `#fbfbfb` | `#fbfcff` | `#f2f7ff` | host's own | |
120
123
  | `--dsw-alias-button-primary-fill` | `accent` | `#d97757` | `#d97757` | `#4d6bfe` | `#4d6bfe` | host's own | |
121
124
  | `--dsw-alias-button-primary-hover` | `accent-hover` | `#c46343` | `#eb9170` | `#3d56e9` | `#6a84ff` | host's own | |
122
125
  | `--dsw-alias-button-elevated-fill` | `overlay` | `#ffffff` | `#282828` | `#ffffff` | `#22252d` | host's own | |
123
126
  | `--dsw-alias-button-floating-fill` | `overlay` | `#ffffff` | `#282828` | `#ffffff` | `#22252d` | host's own | |
124
- | `--dsw-alias-button-floating-hover` | `surface-3` | `#ffffff` | `#323232` | `#ffffff` | `#2b2f37` | host's own | |
127
+ | `--dsw-alias-button-floating-hover` | `surface-3` | `#ffffff` | `#323232` | `#fcfdff` | `#2b2f37` | host's own | |
125
128
  | `--dsw-alias-button-info-fill` | `accent` | `#d97757` | `#d97757` | `#4d6bfe` | `#4d6bfe` | host's own | |
126
129
  | `--dsw-alias-button-info-hover` | `accent-hover` | `#c46343` | `#eb9170` | `#3d56e9` | `#6a84ff` | host's own | |
127
130
  | `--dsw-alias-interactive-bg-active` | `accent-active` | `rgba(246, 136, 98, 0.26)` | `rgba(217, 119, 87, 0.3)` | `rgba(95, 124, 255, 0.26)` | `rgba(77, 107, 254, 0.3)` | host's own | |
128
- | `--dsh-claude-hover-bg` | `hover-wash` | `rgba(6, 6, 6, 0.08)` | `rgba(255, 255, 255, 0.08)` | `rgba(6, 6, 6, 0.08)` | `rgba(251, 255, 255, 0.08)` | `var(--dsw-alias-interactive-bg-hover)` | hover wash |
131
+ | `--dsh-claude-hover-bg` | `hover-wash` | `rgba(6, 6, 6, 0.08)` | `rgba(255, 255, 255, 0.08)` | `rgba(4, 4, 6, 0.08)` | `rgba(251, 255, 255, 0.08)` | `var(--dsw-alias-interactive-bg-hover)` | hover wash |
129
132
  | `--dsh-claude-field-ring` | literal | `#2a78d6` | `#2a78d6` | `#2a78d6` | `#2a78d6` | `var(--dsw-alias-brand-primary)` | the ring around a field the reader is renaming in: the session title's own editor, drawn from the selection blue |
130
- | `--dsh-claude-inline-code-bg` | `code-wash` | `rgba(6, 6, 6, 0.05)` | `rgba(255, 255, 255, 0.05)` | `rgba(6, 6, 6, 0.05)` | `rgba(251, 255, 255, 0.05)` | `var(--dsw-alias-markdown-inline-code)` | inline code fill |
133
+ | `--dsw-focus-ring-color` | literal | `rgba(20, 20, 19, 0.45)` | `rgba(250, 249, 245, 0.60)` | `rgba(20, 20, 19, 0.45)` | `rgba(250, 249, 245, 0.60)` | host's own | the keyboard focus ring: the host's own `:focus-visible` rules paint it, and the skin's fallback ring reads it |
134
+ | `--dsh-claude-inline-code-bg` | `code-wash` | `rgba(6, 6, 6, 0.05)` | `rgba(255, 255, 255, 0.05)` | `rgba(4, 4, 6, 0.05)` | `rgba(251, 255, 255, 0.05)` | `var(--dsw-alias-markdown-inline-code)` | inline code fill |
131
135
  | `--dsh-claude-inline-code-fg` | card `code` | `#943333` | `#e8a08a` | `#0f1115` | `#eef1f8` | `var(--dsw-alias-label-primary)` | inline code ink |
132
136
  | `--dsh-claude-link` | `link` | `#184f95` | `#8ab4f8` | `#3b56d9` | `#8fa4ff` | `var(--dsw-alias-link)` | markdown links |
133
137
  | `--dsh-claude-link-underline` | `link-underline` | `rgba(24, 79, 149, 0.6)` | `rgba(138, 180, 248, 0.6)` | `rgba(59, 86, 217, 0.6)` | `rgba(143, 164, 255, 0.6)` | `color-mix(in srgb, var(--dsw-alias-link) 60%, transparent)` | markdown link underline |
134
138
  | `--dsw-alias-markdown-code-block` | `code-block` | `#ffffff` | `#212121` | `#ffffff` | `#1b1e26` | host's own | |
135
139
  | `--dsw-alias-markdown-code-block-banner` | `overlay` | `#ffffff` | `#282828` | `#ffffff` | `#22252d` | host's own | |
136
140
  | `--dsw-alias-interactive-bg-hover` | `--dsh-claude-hover-bg` | `var(--dsh-claude-hover-bg)` | `var(--dsh-claude-hover-bg)` | `var(--dsh-claude-hover-bg)` | `var(--dsh-claude-hover-bg)` | host's own | |
137
- | `--dsw-alias-interactive-bg-hover-solid` | `hover-plate` | `#f4f4f4` | `#323232` | `#f4f4f4` | `#2b2f37` | host's own | the host's solid hover chip |
138
- | `--dsw-alias-label-primary` | `ink` | `#161616` | `#fdfdfd` | `#161616` | `#f4f9ff` | host's own | |
139
- | `--dsw-alias-label-primary-bluish` | `ink` | `#161616` | `#fdfdfd` | `#161616` | `#f4f9ff` | host's own | |
140
- | `--dsw-alias-label-secondary` | `ink-2` | `#70686a` | `#beb6b8` | `#70686a` | `#aeb5c4` | host's own | |
141
- | `--dsw-alias-label-tertiary` | `ink-3` | `#91888a` | `#9c9395` | `#91888a` | `#8a92a3` | host's own | |
142
- | `--dsw-alias-label-caption` | `ink-4` | `#b2acad` | `#776f71` | `#b2acad` | `#676e7d` | host's own | |
143
- | `--dsw-alias-label-shimmer` | `shimmer` | `#161616` | `#fdfdfd` | `#161616` | `#f4f9ff` | host's own | the highlight band's tint over running words: the host's own rows and the skin's band (shared/sweep-band.ts) alike |
144
- | `--dsw-alias-label-deep-diving-shimmer` | `shimmer` | `#161616` | `#fdfdfd` | `#161616` | `#f4f9ff` | host's own | the band's tint inside the running row, which the host points --dsw-alias-label-shimmer at; under Claude it is the same warm band as everywhere else |
141
+ | `--dsw-alias-interactive-bg-hover-solid` | `hover-plate` | `#f4f4f4` | `#323232` | `#f0f1f4` | `#2b2f37` | host's own | the host's solid hover chip |
142
+ | `--dsw-alias-label-primary` | `ink` | `#161616` | `#fdfdfd` | `#131416` | `#f4f9ff` | host's own | |
143
+ | `--dsw-alias-label-primary-bluish` | `ink` | `#161616` | `#fdfdfd` | `#131416` | `#f4f9ff` | host's own | |
144
+ | `--dsw-alias-label-secondary` | `ink-2` | `#70686a` | `#beb6b8` | `#656871` | `#aeb5c4` | host's own | |
145
+ | `--dsw-alias-label-tertiary` | `ink-3` | `#91888a` | `#9c9395` | `#848891` | `#8a92a3` | host's own | |
146
+ | `--dsw-alias-label-caption` | `ink-4` | `#b2acad` | `#776f71` | `#a8abb2` | `#676e7d` | host's own | |
147
+ | `--dsw-alias-label-shimmer` | `shimmer` | `#161616` | `#fdfdfd` | `#131416` | `#f4f9ff` | host's own | the highlight band's tint over running words: the host's own rows and the skin's band (shared/sweep-band.ts) alike |
148
+ | `--dsw-alias-label-deep-diving-shimmer` | `shimmer` | `#161616` | `#fdfdfd` | `#131416` | `#f4f9ff` | host's own | the band's tint inside the running row, which the host points --dsw-alias-label-shimmer at; under Claude it is the same warm band as everywhere else |
145
149
  | `--dsw-alias-state-business-primary` | `accent` | `#d97757` | `#d97757` | `#4d6bfe` | `#4d6bfe` | host's own | |
146
150
  | `--dsw-alias-state-business-tertiary` | `accent-tint` | `#f6ded7` | `#48261b` | `#dce4f7` | `#252f4c` | host's own | |
147
151
  | `--dsw-alias-link` | `ui-link` | `#bf6446` | `#eaa088` | `#3e57e0` | `#7594fd` | host's own | text link at rest |
148
152
  | `--dsw-alias-shadow-lv2` | literal | `0 4px 18px rgba(20, 20, 19, 0.10), 0 1px 3px rgba(20, 20, 19, 0.05)` | `0 4px 16px rgba(0, 0, 0, 0.30), 0 1px 3px rgba(0, 0, 0, 0.14)` | `0 4px 18px rgba(20, 20, 19, 0.10), 0 1px 3px rgba(20, 20, 19, 0.05)` | `0 4px 16px rgba(0, 0, 0, 0.30), 0 1px 3px rgba(0, 0, 0, 0.14)` | host's own | |
149
153
  | `--dsw-specific-input-major` | `inset` | `#ffffff` | `#141414` | `#ffffff` | `#0e1117` | host's own | |
150
- | `--dsw-specific-selector` | `selector` | `#fefefe` | `#323232` | `#fefefe` | `#2b2f37` | host's own | |
151
- | `--dsw-specific-sidebar-fill` | card `sidebar` | `#fafafa` | `#1f1f1f` | `#fafafa` | `#13161d` | host's own | |
154
+ | `--dsw-specific-selector` | `selector` | `#fefefe` | `#323232` | `#fafbfe` | `#2b2f37` | host's own | |
155
+ | `--dsw-specific-sidebar-fill` | card `sidebar` | `#fafafa` | `#1f1f1f` | `#f7f9ff` | `#13161d` | host's own | |
152
156
  | `--dsw-alias-brand-primary-new-colorprimary-new-color` | `accent` | `#d97757` | `#d97757` | `#4d6bfe` | `#4d6bfe` | host's own | |
153
- | `--dsh-claude-canvas` | `canvas` | `#ffffff` | `#191919` | `#ffffff` | `#13161d` | `var(--dsw-alias-bg-base)` | the page canvas, the search box |
154
- | `--dsh-claude-sidebar-canvas` | card `sidebar` | `#fafafa` | `#1f1f1f` | `#fafafa` | `#13161d` | `var(--dsw-specific-sidebar-fill)` | the sidebar |
155
- | `--dsh-claude-card` | `card` | `#ffffff` | `#232323` | `#ffffff` | `#1d2028` | `var(--dsw-alias-bg-overlay)` | cards on the canvas in light and raised in dark: the account popover, the search palette |
156
- | `--dsh-claude-inverse-fill` | `ink` | `#161616` | `#fdfdfd` | `#161616` | `#f4f9ff` | `var(--dsw-alias-interactive-bg-hover)` | the model picker's group label fill: an inverted chip under Claude, a hover-plate chip under the host |
157
- | `--dsh-claude-inverse-ink` | `inverse-ink` | `#ffffff` | `#171717` | `#ffffff` | `#11141a` | `var(--dsw-alias-label-primary)` | the model picker's group label ink |
158
- | `--dsh-claude-table-head` | `table-head` | `#f4f4f4` | `#282828` | `#f4f4f4` | `#22252d` | `var(--dsw-alias-bg-layer-2)` | table header row |
159
- | `--dsh-claude-ripple-ink` | `ink-3` | `#91888a` | `#9c9395` | `#91888a` | `#8a92a3` | `var(--dsw-alias-label-secondary, #8a8a85)` | the new-conversation page's glyph field, and the wake a ripple leaves in it |
157
+ | `--dsh-claude-canvas` | `canvas` | `#ffffff` | `#191919` | `#fbfcff` | `#13161d` | `var(--dsw-alias-bg-base)` | the page canvas, the search box |
158
+ | `--dsh-claude-sidebar-canvas` | card `sidebar` | `#fafafa` | `#1f1f1f` | `#f7f9ff` | `#13161d` | `var(--dsw-specific-sidebar-fill)` | the sidebar |
159
+ | `--dsh-claude-card` | `card` | `#ffffff` | `#232323` | `#fbfcff` | `#1d2028` | `var(--dsw-alias-bg-overlay)` | cards on the canvas in light and raised in dark: the account popover, the search palette |
160
+ | `--dsh-claude-inverse-fill` | `ink` | `#161616` | `#fdfdfd` | `#131416` | `#f4f9ff` | `var(--dsw-alias-interactive-bg-hover)` | the model picker's group label fill: an inverted chip under Claude, a hover-plate chip under the host |
161
+ | `--dsh-claude-inverse-ink` | `inverse-ink` | `#ffffff` | `#171717` | `#feffff` | `#11141a` | `var(--dsw-alias-label-primary)` | the model picker's group label ink |
162
+ | `--dsh-claude-table-head` | `table-head` | `#f4f4f4` | `#282828` | `#f0f1f4` | `#22252d` | `var(--dsw-alias-bg-layer-2)` | table header row |
163
+ | `--dsh-claude-ripple-ink` | `ink-3` | `#91888a` | `#9c9395` | `#848891` | `#8a92a3` | `var(--dsw-alias-label-secondary, #8a8a85)` | the new-conversation page's glyph field, and the wake a ripple leaves in it |
160
164
  | `--dsh-claude-data-ink` | literal | `#3b6ecf` | `#3b6ecf` | `#3b6ecf` | `#3b6ecf` | `var(--dsw-alias-link, #3b6ecf)` | the home page's data blue: the deepest step of the model chart's ramp and the ink the heat grid's levels are mixed from |
161
165
  | `--dsh-claude-ripple-wave` | literal | `#3b6ef0` | `#7fa6ff` | `#3b6ef0` | `#7fa6ff` | `var(--dsw-alias-link, #3b6ef0)` | the front of a ripple in the new-conversation page's glyph field |
162
- | `--dsh-claude-scrollbar` | `scrollbar` | `rgba(213, 213, 213, 0.9)` | `rgba(62, 62, 62, 0.9)` | `rgba(213, 213, 213, 0.9)` | `rgba(55, 59, 64, 0.9)` | `var(--dsw-alias-border-l2)` | scrollbar thumb |
163
- | `--dsh-claude-scrollbar-hover` | `scrollbar-hover` | `rgba(138, 138, 138, 0.8)` | `rgba(113, 113, 113, 0.9)` | `rgba(138, 138, 138, 0.8)` | `rgba(105, 109, 115, 0.9)` | `var(--dsw-alias-label-caption)` | scrollbar thumb under the pointer |
166
+ | `--dsh-claude-scrollbar` | `scrollbar` | `rgba(213, 213, 213, 0.9)` | `rgba(62, 62, 62, 0.9)` | `rgba(209, 210, 213, 0.9)` | `rgba(55, 59, 64, 0.9)` | `var(--dsw-alias-border-l2)` | scrollbar thumb |
167
+ | `--dsh-claude-scrollbar-hover` | `scrollbar-hover` | `rgba(138, 138, 138, 0.8)` | `rgba(113, 113, 113, 0.9)` | `rgba(134, 135, 138, 0.8)` | `rgba(105, 109, 115, 0.9)` | `var(--dsw-alias-label-caption)` | scrollbar thumb under the pointer |
164
168
  | `--dsh-claude-link-hover` | `ui-link-hover` | `#a35035` | `#ffbea6` | `#2e41c0` | `#91b1ff` | `var(--dsw-alias-link)` | text link under the pointer |
165
169
  | `--dsh-claude-logo-ink` | card `logoInk` | `#161616` | `#fdfdfd` | `#4d6bfe` | `#4d6bfe` | `var(--dsw-alias-label-primary)` | sidebar brand art: the whale and the wordmark |
166
170
  | `--dsw-specific-menu` | `overlay` | `#ffffff` | — | `#ffffff` | — | host's own | |
167
171
  | `--dsw-specific-bubble` | card `bubble` | `#f4f2f3` | `rgba(255, 255, 255, 0.06)` | `#ecf0ff` | `#262b36` | host's own | user message bubble |
168
- | `--dsh-claude-chip` | `chip` | `#f9f9f9` | — | `#f9f9f9` | — | `var(--dsw-specific-selector)` | segmented control and switch at rest |
172
+ | `--dsh-claude-chip` | `chip` | `#f9f9f9` | — | `#f5f6f9` | — | `var(--dsw-specific-selector)` | segmented control and switch at rest |
169
173
  | `--dsh-claude-meter-peak` | literal | `#a4621d` | `#e2a45f` | `#a4621d` | `#e2a45f` | `var(--dsw-alias-state-warn-label)` | the peak rate badge: the expensive end of a provider's own billing clock |
170
174
  | `--dsh-claude-meter-valley` | literal | `#3d7550` | `#8cbf96` | `#3d7550` | `#8cbf96` | `var(--dsw-alias-state-success-primary)` | the off-peak rate badge, and the dated promotions priced below it |
171
175
  <!-- /generated:tokens -->
@@ -332,7 +336,11 @@ and scrolls to its end.
332
336
  black edge carries no cue, so the hairline and halo become bright ivory —
333
337
  the field visibly lights up instead of deepening. The footer tray below
334
338
  follows the same hairline so the two tiers stay one outline. Accent is never
335
- used for focus strokes.
339
+ used for focus strokes. Every other control's keyboard ring is the host's own
340
+ `:focus-visible` rule painting `--dsw-focus-ring-color`, which the skin states
341
+ as the same ink; the skin's ring is a `:where()` fallback of no weight, so the
342
+ rule of whichever layer owns the control — this skin's, the host's, or another
343
+ plugin's `outline: none` — always wins.
336
344
 
337
345
  ## Motion
338
346
 
@@ -682,14 +690,20 @@ stands between the written-back tokens and the cache share, and it is among the
682
690
  figures the ladder gives up when the line needs the room for the total; in the
683
691
  block it is the usage section's first row.
684
692
 
685
- The segment keeps its width across a session switch: the session's figure is
686
- replaced while the next one is being priced, so the amount sits in a box of an
687
- amount's measure, right-aligned so a growing figure extends left, and the box
688
- stands as the currency symbol and a dash in `label-tertiary` until the new
689
- figure arrives. Without it the segment folds out of the line and back, and the
690
- whole bottom line re-lays around it. The `billingCurrency` choice's Off takes
691
- the segment out of the line altogether: nothing is drawn, and the browser asks
692
- the host for neither the price table nor the session's total.
693
+ In the toolbar's placement the segment keeps its width across a session switch:
694
+ the session's figure is replaced while the next one is being priced, so the
695
+ amount sits in a box of an amount's measure, right-aligned so a growing figure
696
+ extends left, and the box stands as the currency symbol and a dash in
697
+ `label-tertiary` until the new figure arrives. Without it the segment folds out
698
+ of the line and back, and the whole bottom line re-lays around it. The box leads
699
+ that line, so the room an amount does not need is the line's leading edge rather
700
+ than a gap between two figures. On the line of its own the segment hugs its
701
+ amount like every other figure: a box there would stand between the written-back
702
+ figure and the cost and the figures would no longer keep one gap, so the line
703
+ fits its figures again for the width the arriving amount needs. The
704
+ `billingCurrency` choice's Off takes the segment out of the line altogether:
705
+ nothing is drawn, and the browser asks the host for neither the price table nor
706
+ the session's total.
693
707
 
694
708
  Which figures appear follows the host's statistics row. Its detailed form gets
695
709
  the whole list. Its compact form carries only the output speed and the cache-hit
Binary file
Binary file
Binary file
@@ -101,15 +101,15 @@
101
101
  "encoding": "br",
102
102
  "bytes": 77602
103
103
  },
104
- "ff0d661c7214.js": {
104
+ "dd2226ba435f.js": {
105
105
  "type": "text/javascript; charset=utf-8",
106
106
  "encoding": "br",
107
- "bytes": 34368
107
+ "bytes": 34453
108
108
  },
109
- "7ec3d9b872d0.js.map": {
109
+ "ca6d29e08e1f.js.map": {
110
110
  "type": "application/json; charset=utf-8",
111
111
  "encoding": "br",
112
- "bytes": 184403
112
+ "bytes": 185238
113
113
  },
114
114
  "b55a1acf34e0.js": {
115
115
  "type": "text/javascript; charset=utf-8",
@@ -121,15 +121,15 @@
121
121
  "encoding": "br",
122
122
  "bytes": 28560
123
123
  },
124
- "37f115eecbe1.js": {
124
+ "cbbadac799d3.js": {
125
125
  "type": "text/javascript; charset=utf-8",
126
126
  "encoding": "br",
127
- "bytes": 20487
127
+ "bytes": 20977
128
128
  },
129
- "31f8d22b11d1.js.map": {
129
+ "b6d695c4c978.js.map": {
130
130
  "type": "application/json; charset=utf-8",
131
131
  "encoding": "br",
132
- "bytes": 78402
132
+ "bytes": 80207
133
133
  },
134
134
  "ee5c79cfab80.js": {
135
135
  "type": "text/javascript; charset=utf-8",
@@ -151,15 +151,15 @@
151
151
  "encoding": "br",
152
152
  "bytes": 134535
153
153
  },
154
- "9381a21ff2d0.js": {
154
+ "d021d0e8b40f.js": {
155
155
  "type": "text/javascript; charset=utf-8",
156
156
  "encoding": "br",
157
- "bytes": 42003
157
+ "bytes": 42475
158
158
  },
159
- "b688ea61a84b.js.map": {
159
+ "e8179a83512a.js.map": {
160
160
  "type": "application/json; charset=utf-8",
161
161
  "encoding": "br",
162
- "bytes": 164475
162
+ "bytes": 165856
163
163
  }
164
164
  }
165
165
  }