dsh-claude-style 0.11.1 → 0.12.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/CHANGELOG.md +146 -0
- package/LICENSE +11 -8
- package/README.en.md +27 -75
- package/README.md +37 -84
- package/THIRD_PARTY_NOTICES.md +63 -0
- package/docs/FEATURES.en.md +39 -0
- package/docs/FEATURES.md +39 -0
- package/docs/SETTINGS.en.md +39 -0
- package/docs/SETTINGS.md +39 -0
- package/docs/STYLE.md +134 -66
- package/docs/decisions/D10-settings-transport.md +4 -2
- package/docs/decisions/D11-private-routes.md +3 -3
- package/docs/decisions/D12-fail-fast.md +5 -4
- package/docs/decisions/D14-account-surface.md +3 -2
- package/docs/decisions/D15-hdsl-contract.md +2 -1
- package/docs/decisions/D16-popover-baseline.md +3 -2
- package/docs/decisions/D17-permission-presets.md +1 -0
- package/docs/decisions/D19-host-contracts.md +4 -3
- package/docs/decisions/D20-sliding-pill.md +1 -0
- package/docs/decisions/D21-archived-list.md +1 -0
- package/docs/decisions/D22-search-panel.md +2 -1
- package/docs/decisions/D23-turn-status.md +1 -0
- package/docs/decisions/D24-mascot.md +8 -10
- package/docs/decisions/D25-ban-screen-titlebar.md +2 -1
- package/docs/decisions/D26-motion-preference.md +2 -1
- package/docs/decisions/D27-context-stats.md +3 -2
- package/docs/decisions/D28-desktop-band.md +2 -1
- package/docs/decisions/D29-feature-switches.md +3 -3
- package/docs/decisions/D3-host-selectors.md +3 -2
- package/docs/decisions/D30-palette-and-typeface.md +3 -3
- package/docs/decisions/D31-windows-titlebar.md +1 -0
- package/docs/decisions/D32-chat-interactions.md +6 -5
- package/docs/decisions/D33-stylesheet-ownership.md +4 -3
- package/docs/decisions/D34-turn-navigator.md +2 -1
- package/docs/decisions/D35-selection-scope.md +1 -0
- package/docs/decisions/D36-modules-and-bundling.md +16 -15
- package/docs/decisions/D38-assets.md +13 -13
- package/docs/decisions/D39-on-demand-loading.md +20 -9
- package/docs/decisions/D4-composer-gate.md +3 -3
- package/docs/decisions/D40-observation-bus.md +13 -11
- package/docs/decisions/D41-scroll-owner.md +25 -9
- package/docs/decisions/D42-feature-manifest.md +11 -8
- package/docs/decisions/D43-overlay-and-upstream.md +12 -15
- package/docs/decisions/D44-contract-module.md +14 -3
- package/docs/decisions/D45-testing.md +14 -12
- package/docs/decisions/D46-monorepo.md +11 -14
- package/docs/decisions/D47-build-output.md +14 -7
- package/docs/decisions/D48-documentation.md +9 -8
- package/docs/decisions/D49-visual-yield.md +8 -8
- package/docs/decisions/D5-model-copy.md +7 -4
- package/docs/decisions/D50-brand.md +24 -0
- package/docs/decisions/D51-css-toolchain.md +34 -0
- package/docs/decisions/D52-header-band.md +31 -0
- package/docs/decisions/D53-usage-merge.md +32 -0
- package/docs/decisions/D54-peakrate-meter.md +33 -0
- package/docs/decisions/D57-reader-view.md +44 -0
- package/docs/decisions/D7-one-package.md +1 -0
- package/docs/decisions/D9-style-performance.md +5 -3
- package/docs/decisions/README.md +23 -16
- package/lib/assets/05af73ae052e.js.br +0 -0
- package/lib/assets/07ba49c55318.svg.br +0 -0
- package/lib/assets/0f01ab580fd7.js.br +0 -0
- package/lib/assets/174b8df9435c.js.map.br +0 -0
- package/lib/assets/192fda8da55a.svg.br +0 -0
- package/lib/assets/22360387d0e1.svg.br +0 -0
- package/lib/assets/244d8652af79.js.map.br +0 -0
- package/lib/assets/2d4bd629514d.svg.br +0 -0
- package/lib/assets/31253ed42440.js.br +0 -0
- package/lib/assets/3b6d7b199795.svg.br +0 -0
- package/lib/assets/41e470a78fff.js.map.br +0 -0
- package/lib/assets/5e05b29d5005.js.br +0 -0
- package/lib/assets/5ff45ccd6396.svg.br +0 -0
- package/lib/assets/62647b81453f.svg.br +0 -0
- package/lib/assets/65476dea0432.js.br +0 -0
- package/lib/assets/6be8e4fa01d6.js.br +0 -0
- package/lib/assets/6cda22c8c355.svg.br +0 -0
- package/lib/assets/7f10aaf08b36.svg.br +0 -0
- package/lib/assets/84bc02d65566.svg.br +0 -0
- package/lib/assets/853c3ac35bee.js.map.br +0 -0
- package/lib/assets/917b19426a88.svg.br +0 -0
- package/lib/assets/930546669455.js.map.br +0 -0
- package/lib/assets/968fcbfc3e22.js.br +0 -0
- package/lib/assets/ac9b0e625837.js.map.br +0 -0
- package/lib/assets/ae2250afa4d4.svg.br +0 -0
- package/lib/assets/aee0b9809ae6.svg.br +0 -0
- package/lib/assets/b0e3c7732358.js.map.br +0 -0
- package/lib/assets/b5c88fffcd08.svg.br +0 -0
- package/lib/assets/bd48fda92d54.svg.br +0 -0
- package/lib/assets/c52e41b4842b.js.map.br +0 -0
- package/lib/assets/c94f98071b0f.svg.br +0 -0
- package/lib/assets/d0b76604f76f.svg.br +0 -0
- package/lib/assets/db89dccfb643.js.br +0 -0
- package/lib/assets/e4c4d54e666e.svg.br +0 -0
- package/lib/assets/manifest.json +175 -0
- package/lib/client.js +11 -28602
- package/lib/client.js.map +7 -0
- package/lib/host/harness-home.js +11 -0
- package/lib/host/hdsl.js +33 -0
- package/lib/host/index.js +17 -0
- package/lib/host/package-root.js +25 -0
- package/lib/host/peakrate-catalog.js +171 -0
- package/lib/host/peakrate.js +137 -0
- package/lib/host/routes.js +393 -0
- package/lib/host/search.js +113 -0
- package/lib/host/settings.js +75 -0
- package/lib/host/usage-cache.js +95 -0
- package/lib/host/usage-fold.js +155 -0
- package/lib/host/usage-ledger.js +71 -0
- package/lib/host/usage-summary.js +128 -0
- package/lib/host/usage.js +107 -0
- package/lib/model-descriptions.json +639 -150
- package/lib/peakrate-catalog.json +1601 -0
- package/package.json +49 -12
- package/docs/decisions/D37-css-toolchain.md +0 -27
- package/host/harness-home.js +0 -21
- package/host/hdsl.js +0 -69
- package/host/index.js +0 -62
- package/host/routes.js +0 -540
- package/host/search.js +0 -167
- package/host/settings.js +0 -138
- package/host/usage.js +0 -630
- package/lib/deepy/building.png +0 -0
- package/lib/deepy/compacting.png +0 -0
- package/lib/deepy/conducting.png +0 -0
- package/lib/deepy/drag.png +0 -0
- package/lib/deepy/error.png +0 -0
- package/lib/deepy/happy.png +0 -0
- package/lib/deepy/idle-look.png +0 -0
- package/lib/deepy/idle-spout.png +0 -0
- package/lib/deepy/idle.png +0 -0
- package/lib/deepy/music.png +0 -0
- package/lib/deepy/notification.png +0 -0
- package/lib/deepy/poke-left.png +0 -0
- package/lib/deepy/poke-right.png +0 -0
- package/lib/deepy/sleeping.png +0 -0
- package/lib/deepy/thinking.png +0 -0
- package/lib/deepy/tickle.png +0 -0
- package/lib/deepy/typing.png +0 -0
- package/lib/deepy/waking.png +0 -0
- /package/{fonts → lib/fonts}/AUTHORS.txt +0 -0
- /package/{fonts → lib/fonts}/InterVariable.woff2 +0 -0
- /package/{fonts → lib/fonts}/JetBrainsMonoItalicVariable.ttf +0 -0
- /package/{fonts → lib/fonts}/JetBrainsMonoVariable.ttf +0 -0
- /package/{fonts → lib/fonts}/NotoSerifVariable.woff2 +0 -0
- /package/{fonts → lib/fonts}/OFL-Inter.txt +0 -0
- /package/{fonts → lib/fonts}/OFL-NotoSerif.txt +0 -0
- /package/{fonts → lib/fonts}/OFL.txt +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,152 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `dsh-claude-style` are documented here, newest first.
|
|
4
4
|
|
|
5
|
+
## [Unreleased]
|
|
6
|
+
|
|
7
|
+
## [0.12.1] - 2026-10-09
|
|
8
|
+
|
|
9
|
+
[中文](#cn-0.12.1) | [English](#en-0.12.1)
|
|
10
|
+
|
|
11
|
+
<h3 id="cn-0.12.1">新增功能</h3>
|
|
12
|
+
|
|
13
|
+
- 「聊天区动画效果」的「重绘」档换上插件自己的会话视图:它直接占据宿主「对话」视图的位置,标签条上不再多出一个标签,宿主转到「对话」的跳转同样落到它;档位离开「重绘」时宿主的「对话」原样回来。轮次进行中,新出现的一段思考把同一条链上此前的思考、正文与工具收成一行(思考×N · 输出×M · 工具×K),数字随内容跳变,用户插话重新开一条链,收拢走收缩、计数、停顿、展开四段时序;轮次成功结束后过程与中间叙述收起、只留最终回答与它的复制、分叉、反馈操作,失败、中断与等待批准的轮次保持展开,读者选中文字期间推迟折叠,历史轮次随时可以点开。思考在卡片里按阅读节奏滑动跟随,卡片只放思考的文字,读者滚回末尾即重新跟随;收进折叠的思考每段只占一行,写作「思考 · 内容」并带着思考卡片的边框,与中间输出一眼分开,按一下边框随全文展开;正文由宿主的 Markdown 渲染,新出现的词逐个淡入;工具行写出目标、改动行数与慢调用的计时,展开后是宿主自己的工具详情、输入与原始记录。轮次进行中的每一种状态(等待模型、思考、输出、准备与使用工具、等你操作)都由最新一条消息下面同一行说出;等待模型时这一行计时,过 10 秒标出「暂未响应」,进行中的过程也从这一行展开与收起。页面上装有 dsh-better-display 的阅读视图时这一份不登记;桌面端随带的 0.2.0 宿主与 npm 上的 0.2.1 宿主都能读。「动画」设为「减弱」时一律直接落位。
|
|
14
|
+
- 模型选择器的每一行标出该模型此刻的倍率:峰价、谷价与限时活动三种状态各有自己的图标,颜色区分贵与便宜,倍数后面跟着距离切换还有多久,鼠标停在徽章上读到「此刻的判定 · 多久后转为哪个状态」的完整一句,距切换不足一分钟时读 `<1m`。判定按各家供应商自己发布的作息表与自己的时区做(工作日窗口之外、周末与法定节假日整日算谷价,跨零点的窗口归它开始的那一天,夏令时切换按真实时刻计算,落进夏令时空档的窗边落在跳变那一刻);没有作息表的模型不显示徽章,把标准费率整天在走的供应商按其作息表显示。限时活动按文档声明的日期与时刻边界起止(结束时刻就是切换那一刻,已经结束的活动不会再生效)。作息表来自公开目录 offpeakclock.com 的一份快照:宿主半边取一次、在 `$DSH_HOME/cache/dsh-claude-style/peakrate.json` 留一份缓存、每 24 小时刷新一次,经 `/dsh-claude-style/peakrate` 下发(`POST` 强制重拉),连不上时按插件包里带的那份判定;浏览器半边只在功能装上时读一次,第三方地址不经过页面。构建核对匹配表里每一行点到的那条作息确实在包内快照里、且属于同一个供应方,对不上即构建失败。设置页「输入区」页新增「峰谷电表」子项,关闭后各行的徽章消失,模型选择器关闭时该项目变灰不可操作。
|
|
15
|
+
|
|
16
|
+
### 体验优化
|
|
17
|
+
|
|
18
|
+
- 设置页「对话」页的「聊天区动画效果」从开关改成三档分段控件:关闭、增强、重绘。「关闭」把聊天区交回宿主;「增强」是原来的全套动效(跟随、自动开合与卷帘门、新文字淡入、文件变更行、聊天气泡动效);「重绘」交给另一套动效,接上的是聊天气泡动效与插件自己的阅读视图。旧版本存下的开关取值照旧生效(开 = 增强,关 = 关闭),不需要重新设置。
|
|
19
|
+
- 页面启动时插件占用的主线程时间减少:设置页、内容搜索、吉祥物、发送动效、对话导航、上下文弹层与封号彩蛋这七个首屏可以缺席的功能离开 `lib/client.js`,各自成为一个块,由插件已有的资产路由 `/dsh-claude-style/assets/` 提供,页面被接管后立即请求、到达后安装。在本地临时宿主上实测(两种产物各载入 20 次取中位数):`lib/client.js` 从 776 KB 降到 712 KB,前 3 秒的主线程长任务从 713 ms 降到 648 ms,皮肤生效时刻从导航后 298 ms 提前到 280 ms;七个块经 brotli 压缩后共 33 KB,比主产物晚约 5 ms 到达。块与它的 source map 各自按自身内容的哈希命名,浏览器不会把旧的 map 当成新的那份;构建拒绝主产物与块同时携带同一个模块(构建期生成的模块也在其中,它经共享表读主产物里的那一份)。插件更新后页面换代时,块已经在磁盘上:构建把主产物写在最后,先写新资产、再写清单、最后删清单里没有的文件。
|
|
20
|
+
- 设置页「侧栏」页新增「面板悬浮卡片」开关:开启(默认)时右侧栏停靠的面板仍是悬浮卡片——四周留 8px、16px 圆角、1px 描边与投影;关闭后停靠的面板铺满整列、贴住四边,分栏时每栏铺满各自那一栏,两栏之间只留宿主的接缝线。切换不需要刷新页面。
|
|
21
|
+
- 模型选择器每一行的说明改由一张按名字模式认领的有序规则表得出:带上日期后缀、把官方点号写成连字符或下划线(`glm-5-3-flashx`)或换一个售卖方前缀,仍然读到同一句;`k3-256k`、`ernie-5`、`minimax-m3-1m`、`deepseek-v41-flash` 这类目录拼法各自落到所在产品线的规则上,不必再逐条登记。带版本数字或最高级的说明写成锚定该版本的规则(`glm-5.3`、`gpt-5.4`、`qwen3.8-max`、`step-3.7-flash`、`celeris-1` 等),同产品线的其他版本读到线级文案;目录里现有的 25 个模型 id 里,除 Grok 与 ERNIE 两行按另一条记录改写外,其余解析出的句子与改动前逐条相同。
|
|
22
|
+
- 「重绘」档里轮次进行中的那条状态行(「正在思考」「正在使用工具」这些)上下各收进 30px,贴着最新一条消息读,不再像独占一行。实测:该行与上方轮次之间原有的 26px 空隙收掉,行内文字与它的下一条内容之间的距离也少 30px;这一行仍按内容居中,高度不变。为了让它在压上去时不露出旧内容的接缝,这一行补了一圈底色投影,并抬到上方内容之上。
|
|
23
|
+
- 「重绘」档的思考卡片只留思考本身:参考实现搬来的「思考 · 第 N 步」抬头、「暂停跟随 / 跟随最新」与「完整阅读 / 收起」两个按钮,以及为展开态在会话里量出的阅读高度都不再出现,卡片的边框里就是思考的文字,高度由预览高度与内容决定。跟随仍按阅读节奏走,滚回卡片末尾就重新跟随,而上一版要靠按钮点回来的那一步现在由滚动自己完成;展开一段思考仍是从折叠里那行文字点开,于是每段思考在折叠里保持一行,读全文按一下即可。
|
|
24
|
+
- 「重绘」档的一轮过程现在按宿主「工作步骤展示」的当前档位成形,两侧设置不再各行其是:插件不新增自己的档位控件,只读宿主 `ui-chat` 命名空间的档位并在每次有轮次开始时重读,读不到时按网页端缺省档「详细」。「简洁」把整条链收成一行,中间输出的正文也进这一行的计数;「标准」收拢最后一段思考之前的全部步骤,中间输出随最后一段思考留在行外;「详细」把结尾的中间输出留成自己的一行、收拢它之前的全部步骤;「完全展开」与「详细」同形,另外把收进折叠的思考画成整张推理卡片(全文,而不是「思考 · 内容」一行),工具仍由读者自己按开。宿主自己的设置行仍是唯一控件,插件不代写。
|
|
25
|
+
- 模型选择器里 Grok 与 ERNIE 两行的说明改写:Grok 的规则从匹配 4.5 改成匹配 Grok 4 整条产品线,`grok-4`、`grok-4.5`、`grok-4-2026` 这些拼法读到同一句「全球最智能的模型之一,支持原生工具使用以及实时搜索功能。」;ERNIE 5 一行改成「2.4 万亿参数的原生全模态大模型。」,不再列激活比例与上下文长度。
|
|
26
|
+
- 插件的样式表以压缩后的文本随包发出:注释与排版只留在源文件里,整张样式表从 349 KB 降到 208 KB,`lib/client.js` 从 712 KB 降到 570 KB。页面画出的样子不变:端到端通道把压缩前后的两份样式表放到同一个页面上,22 个页面状态逐元素比对计算值,全部一致。压缩还把 `!important` 审计过去豁免的一部分规则变成可以逐条判定的(同一个属性写两遍的规则,压缩后只剩一条声明):判定之后,输入区停止按钮、侧栏进行中指示与聊天区跟随尾部上页面并不需要的 46 处 `!important` 从源样式表里去掉了。审计也随之收紧:处在条件不成立的 `@media` / `@supports` 里的规则不再参与判定,它们的 `!important` 不会因为页面当时不在那个条件里就被判成多余。在本地临时宿主上实测(两种产物各载入 20 次、做两轮,取中位数):插件包的求值时间从约 9.0 ms 降到约 8.3 ms;启动阶段的其余计时差别落在两轮之间的波动以内。
|
|
27
|
+
|
|
28
|
+
### 问题修复
|
|
29
|
+
|
|
30
|
+
- 长会话里流式输出期间的卡顿减少:跟随在每一批文字到达时都要问的几个问题不再落到整个文档上——会话的滚动容器与消息列读一次后保留(换会话、切「轨迹」页签时旧节点会从文档里移除,届时重新读取),流式标记改在消息列里查找,宿主「回到底部」按钮的存在本身就是「跟随已关闭」的判据,而同一帧里读到的高度只读一次,交给收回宿主写下的末尾、判断是否继续滑行这两处共用。在 120 轮、4286 个节点的临时会话上实测:插件发出的文档级查询从 3263 次降到 2762 次(−15%),整页最长的一次停顿从 270ms 降到 234ms;文档越大,省下的每次全页样式重算越多。
|
|
31
|
+
- 模型选择器里当前在用的模型、当它所属的供应商不在第一级列表里时,会单独占一级列表最下面一行——这一行过去绕过了其余各行共用的行构造,因此没有峰谷徽章,也没有厂商标志与说明;现在它与列表里的每一行走同一个构造,徽章、标志、说明和行高内边距都一致。
|
|
32
|
+
- 「重绘」档里收进折叠的一段思考,展开后再点它的文字没有反应,只能点右侧的折角按钮才能收起。文字上的点击此前只在收起时挂着,展开后整行文字只剩选择文字的作用。现在文字两态都可点:收起时点它展开,展开时点它收起;一次以选中文字收尾的落点不改开合,选中文字期间推迟折叠的行为照旧。
|
|
33
|
+
- 进行中的状态行不再随流式内容上下跳动。此前该行只在宿主自己的「跟随还开着」标记下钉住,而流式期间跟随的滑动会把滚动位置停在末尾之前,宿主把这次写入读成读者离开了末尾并摘掉标记,于是每一片内容到达时该行退回文档流、被内容底部推下去,滑动追上来再把它拉回:视口 1280×600 下实测,标记缺席的 115 帧里该行顶边在 447px 与 573px 之间移动,而钉住位是 426px。现在滑动持有位置期间在聊天列上写下自己的标记,该行按宿主标记或滑动标记任一钉住,内容突发的追加不再带动它:同一场景里标记缺席的 112 帧内顶边恒为 426px。往回翻看历史时两个标记都不在,该行照常留在文档位置,不会浮在读者正在读的内容上。
|
|
34
|
+
- 「重绘」档里轮次状态行的文字在长短之间切换时,被替换下去的那一段会暂时折成两行、溢出状态行的高度(视口 1280×900 实测:状态行高始终 32px,而退出中的文字片段为 84×48px)。原因是两层文字在替换的同一帧里用新文字的宽度排布了旧文字:状态行按隐藏的丈量层取宽,绝对定位的文字层虽然被同一层撑开,浏览器在这一帧仍把旧文字按它原来的窄宽度断行。现在丈量层与被替换的两层都不换行,文字生长期间各行始终单行,状态行高度不再跳变。
|
|
35
|
+
- 修复 **重新编译后设置页等延后功能从设置里消失、要重新开关插件才回来**:构建原先先写 `lib/client.js`、几秒之后才重写 `lib/assets/`,而客户端热重载只认主产物,页面在新块落盘之前就换代,按当时那份清单请求新块得到 404,延后的功能各报告一次并退役。现在资产按「先写新文件、再写清单、最后删清单里没有的文件」落盘,`lib/client.js` 写在最后:换代的那一代要的块已经在磁盘上、也已经在清单里。
|
|
36
|
+
|
|
37
|
+
### 其他变更
|
|
38
|
+
|
|
39
|
+
- 开发机上新增构建标记 `DSH_CLAUDE_STYLE_DEBUG=1`:链接安装的检出重建时,资产清单继续带着上一代仍然存在的条目并保留它们的文件,宿主在启动时读到旧主产物的页面不会因为一次重建丢掉延后的功能。发布构建与持续集成里这个标记不生效,清单就是这一次构建自己的资产;构建日志会说明当前处于哪一档。
|
|
40
|
+
- 构建把 Deepy 帧图的矢量化结果与资产的 brotli 压缩结果按输入哈希缓存在 `.debug/build-cache/`,只改 TypeScript 后的重建从约 14 秒降到约 1.7 秒,`lib/` 与不带缓存时逐字节相同;新增 `npm run dev`,监听构建读取的目录,每次保存后重新构建(带 `DSH_CLAUDE_STYLE_DEBUG=1`),构建失败时保留上一次的 `lib/` 并继续监听。
|
|
41
|
+
|
|
42
|
+
<h3 id="en-0.12.1">New Features</h3>
|
|
43
|
+
|
|
44
|
+
- The Redraw tier of Chat-area animations swaps in the plugin's own conversation view: it takes the place of the host's Chat view itself, no extra tab appears in the strip, and whatever the host sends to Chat lands on it; leaving the Redraw tier brings the host's Chat back as it was. While a turn runs, a new thought folds the thinking, output and tools before it in the same chain into one row (Thinking×N · Output×M · Tools×K) whose figures roll as the work grows, a message from the reader starts a new chain, and each fold runs a shrink, count, pause, reveal sequence. Once a turn completes, its process and interim narration fold away and the final answer stays with its copy, branch and feedback actions; a failed, stopped or waiting turn stays open, a text selection holds the fold, and any past turn opens again. Thinking glides inside its card at reading pace, the card holds the thought's text alone, and scrolling it back to its end resumes the follow; a thought inside a fold takes one line, reading "Thinking · …" inside the thinking card's frame so it never passes for interim output, and a press grows the frame to its whole text; the answer is the host's own Markdown with each new word fading in; a tool row names its target, the lines it changed and how long a slow call has run, and opens onto the host's own tool view, its input and the raw record. Every live state of a running turn (waiting on the model, thinking, writing, preparing and using a tool, waiting for you) is said by one line under the newest message; while the model is silent the line times the wait and marks it "No response yet" past 10 seconds, and the running process opens and closes from it. With dsh-better-display's reading view on the page this one does not register; it reads both the 0.2.0 host the desktop ships and the 0.2.1 host on npm. With Animation set to Reduced everything lands at once.
|
|
45
|
+
- Every row of the model picker now carries the rate in force for that model: peak, off-peak and a dated promotion each get their own mark, the colour separates expensive from cheap, the multiplier is followed by how long it lasts, hovering the badge reads one line — the judgement now, and what it becomes and when — and a switch under a minute away reads `<1m`. The judgement is made from each provider's own published schedule in that provider's own time zone (outside the weekday windows, and on weekends and public holidays in full, the rate is off-peak; a window crossing midnight belongs to the day it starts; a daylight-saving change is resolved against real instants, so a window edge inside a skipped hour falls at the transition), and a model with no schedule published carries no badge while a provider billing a flat standard rate all day keeps the badge its schedule describes. A dated promotion runs between the day and instant bounds the document states (its closing instant is the switch itself, so an expired promotion never applies again). The schedules come from one snapshot in the public offpeakclock.com catalog: the host half fetches it, keeps a copy in `$DSH_HOME/cache/dsh-claude-style/peakrate.json`, refreshes every 24 hours and serves it over `/dsh-claude-style/peakrate` (`POST` fetches again first), and falls back to the copy shipped in the package when it cannot be reached; the browser half reads it once when the feature installs, and the third-party address never goes through the page. The build checks that every row of the mapping table names a profile the shipped snapshot yields and belongs to the same provider, and fails on a row that does not. The Composer settings tab gains a Peak rate meter sub-row under the model picker: off removes the badges, and turning the picker off greys the row out.
|
|
46
|
+
|
|
47
|
+
### Improvements
|
|
48
|
+
|
|
49
|
+
- The Conversation tab's Chat-area animations row is a three-way segmented control now — Off, Enhanced and Redraw — in place of its switch. Off hands the conversation back to the host; Enhanced is the set that was there before (the follow, the automatic folding with its rolling door, the text fade, the file change rows and the send flight); Redraw hands the area to a second set, whose members are the send flight and the plugin's own reading view. A switch value stored by an earlier build keeps its meaning (on reads as Enhanced, off as Off), so nothing has to be set again.
|
|
50
|
+
- Less main-thread time at page start: seven features the first frames can do without — the settings page, content search, the mascot, the send animation, the conversation navigator, the context popover and the account-hold easter egg — leave `lib/client.js` for chunks of their own, served by the plugin's existing asset route `/dsh-claude-style/assets/`, requested as soon as the page is taken and installed on arrival. Measured on a local scratch host (20 page loads of each build, medians): `lib/client.js` falls from 776 KB to 712 KB, main-thread long tasks in the first 3 s from 713 ms to 648 ms, and the skin takes the page 280 ms after navigation instead of 298 ms; the seven chunks are 33 KB brotli-compressed and arrive about 5 ms after the bundle. A chunk and its source map are each named by their own content, so the browser never reads an older map as the current one; the build refuses a module the bundle and a chunk would both carry, generated modules included — those are read from the bundle's own copy through the shared table. After an update the chunks are already on disk when a page swaps to the new bundle, because the build writes the new assets first, the manifest next, the files it does not name last, and the main bundle after all of them.
|
|
51
|
+
- The Sidebar tab gains a Float docked panels switch: on (the default) keeps the right sidebar's docked panels as floating cards — 8px inside the column, a 16px radius, a hairline and an elevation; off fills the column and hugs its edges, each pane filling its own column when the dock is split, with only the dock's own resting line left on the seam. Switching needs no reload.
|
|
52
|
+
- Every model row's description now comes from one ordered table of name-pattern rules: a dated suffix, a separator spelled differently (`glm-5-3-flashx`) or another reseller's prefix still reads the line's own sentence, and catalog spellings such as `k3-256k`, `ernie-5`, `minimax-m3-1m` and `deepseek-v41-flash` land on their product line's rule without an entry of their own. Copy carrying a version's numbers or a superlative sits on a rule anchored to that version (`glm-5.3`, `gpt-5.4`, `qwen3.8-max`, `step-3.7-flash`, `celeris-1` and the rest), while another version of the same line reads the line-level copy; of the 25 model ids the catalog names, every one but the Grok and ERNIE rows another record rewrites resolves to the same sentence as before.
|
|
53
|
+
- In the Redraw tier the live status line ("Thinking", "Using a tool" and the rest) comes in by 30px above and below, so it reads with the newest message instead of as a row of its own. Measured: the 26px gap it used to leave to the turn above is gone, and the distance from its text to whatever follows it drops by 30px as well; the line stays centred in its own height, which is unchanged. A base-coloured shadow now runs under and over the line where it draws over the content above, so the older content never shows at its edge.
|
|
54
|
+
- A thinking card in the Redraw tier now holds the thought and nothing else: the "Thinking · Step N" heading, the Pause following / Follow latest and Read in full / Collapse controls that came with the ported implementation, and the reading height it measured against the conversation while expanded are gone, so the card's frame is the thought's text with its height set by the preview and the text itself. The follow still runs at reading pace, and scrolling the card back to its end resumes it — the step the buttons used to do is now the scroll's own. Opening a thought still starts from its line inside a fold, so each thought keeps one line there and a press reads it in full.
|
|
55
|
+
- In the Redraw tier a turn's process now takes the shape of the host's Work details setting, so the two settings stop disagreeing: the plugin adds no tier control of its own — it reads the host's `ui-chat` value, re-reads it whenever a turn opens, and falls back to the Web client's default, Detailed, when the host serves none. Compact gathers a whole chain into one row, the intermediate output's own text included in that row's figures; Standard gathers everything before the last thought and leaves the intermediate output outside it, beside that thought; Detailed keeps the trailing intermediate output as its own row and gathers what came before; Verbose matches Detailed and draws a thought inside a fold as its whole reasoning card instead of the one-line "Thinking · …", with tools still opened by the reader alone. The host's own settings row stays the only control: the plugin never writes the value.
|
|
56
|
+
- Two lines of the model picker's copy are rewritten: Grok's rule now claims the whole Grok 4 line rather than the 4.5 build, so `grok-4`, `grok-4.5`, `grok-4-2026` and the rest read one sentence — one of the most intelligent models in the world, with native tool use and real-time search — and the ERNIE 5 row now reads a native omni-modal model with 2.4 trillion parameters, without the activation share or the context length.
|
|
57
|
+
- The plugin's stylesheet ships minified: comments and formatting stay in the source files, the sheet falls from 349 KB to 208 KB and `lib/client.js` from 712 KB to 570 KB. Nothing it paints changes: the end-to-end lane puts the sheet before and after minifying on the same page and compares computed values element by element across 22 page states, all identical. Minifying also brings rules the `!important` audit used to exempt within reach of it (a rule declaring one property twice keeps a single declaration once minified): judged one by one, the 46 `!important`s the page never needed — on the composer's stop button, the sidebar's ongoing indicator and the chat area's follow tail — leave the source sheets. The audit tightens with it: a rule inside a `@media` or `@supports` condition the page is not in is no longer judged, so its `!important` cannot be called redundant for a condition that keeps it out of the cascade. Measured on a local scratch host (two rounds of 20 page loads of each build, medians): evaluating the plugin's bundle takes about 8.3 ms instead of about 9.0 ms; the other startup timings move by less than they vary between rounds.
|
|
58
|
+
|
|
59
|
+
### Bug Fixes
|
|
60
|
+
|
|
61
|
+
- Less jank while an answer streams in a long session: the questions the follow asks on every batch of arriving text no longer go to the document — the conversation's scroller and its message column are read once and kept (a session switch or the Trajectory tab removes the old node, and the reading is taken again), the streaming mark is looked for inside the message column, and the presence of the host's back-to-end button is itself the reading that its follow is off. What a frame does read it reads once and shares between taking back the end the host wrote and deciding whether to keep walking. Measured on a 120-turn, 4286-node scratch conversation: the plugin's document-level queries fall from 3263 to 2762 (−15%) and the page's longest single stall from 270ms to 234ms; the larger the document, the more each avoided whole-page style recalculation is worth.
|
|
62
|
+
- In the model picker, the model in force gets a row of its own at the bottom of level 1 when its provider is not listed there. That row was built apart from every other row, so it carried no peak rate badge, no vendor mark and no description line; it now goes through the same row builder as the rest of the list, with the same badge, mark, description and row metrics.
|
|
63
|
+
- In the Redraw tier a thought inside a fold could only be closed from the chevron button: once its line was open, a press on the text itself did nothing, because the text carried a click only while closed and left the whole line to text selection afterwards. The text now toggles in both states — closed, a press opens it, open, a press closes it again — while a press that ended as a selection changes nothing, and a selection still holds the fold off as before.
|
|
64
|
+
- The live turn's status line no longer moves with the streaming answer. It was pinned only under the host's own following mark, and while an answer streams the follow's glide holds the scroll position short of the end; the host reads that write as the reader leaving the tail, takes the mark away, and the row falls back into the flow, where each burst pushes it down and the glide pulls it back (measured at 1280×600: with the mark off, the row's top travelled between 447px and 573px in 115 frames, while the pin sits at 426px). The glide now writes its own mark on the chat column while it holds a position, and the row is pinned under either mark, so a burst costs it nothing: in the same scenario the row's top stayed at 426px in all 112 frames the host's mark was off. Scrolled away from the tail neither mark is present, so the row keeps its document place instead of floating over what the reader went back to read.
|
|
65
|
+
- In the Redraw tier a turn's status label briefly broke onto two lines while the text changed — the leftover half hung out of the row (measured at a 1280×900 viewport: the status row stayed 32px tall while the outgoing segment measured 84×48px). Two layers of text replace each other, and in the same frame the old text was laid out at the new text's width: the row takes its width from a hidden sizer, and the absolutely positioned copies are widened by it, yet the browser still broke the old text at its earlier, narrower width in that frame. The sizer and both copies now keep to one line, so a growing label stays on one line and the row keeps its height.
|
|
66
|
+
- Fix **the settings page and the other deferred features vanishing from a rebuild until the plugin was switched off and on**: the build wrote `lib/client.js` first and replaced `lib/assets/` seconds later, and since the client half of hot reload watches only the bundle, a page swapped to the new bundle before its chunks were on disk, asked for them under the previous manifest, got a 404, and each deferred feature reported once and retired. New asset files now land first, the manifest after them, the files it does not name last, and `lib/client.js` is written after all of them: the generation a page swaps to finds its chunks already on disk and already in the manifest.
|
|
67
|
+
|
|
68
|
+
### Chores
|
|
69
|
+
|
|
70
|
+
- New build flag for a linked checkout, `DSH_CLAUDE_STYLE_DEBUG=1`: a rebuild keeps the entries an earlier build shipped and their files, so a page that booted the previous bundle does not lose the deferred features to a rebuild. The flag is inert in a release build and in CI, where the manifest carries exactly this build's assets; the build log says which mode ran.
|
|
71
|
+
- The build caches the Deepy sheets' vectors and the assets' brotli payloads in `.debug/build-cache/` under the hash of their inputs, so a rebuild after a TypeScript-only change drops from about 14 s to about 1.7 s while `lib/` stays byte-identical to an uncached build; the new `npm run dev` watches what the build reads and rebuilds on every save (with `DSH_CLAUDE_STYLE_DEBUG=1`), keeping the previous `lib/` and watching on when a build fails.
|
|
72
|
+
|
|
73
|
+
## [0.12.0] - 2026-10-07
|
|
74
|
+
|
|
75
|
+
[中文](#cn-0.12.0) | [English](#en-0.12.0)
|
|
76
|
+
|
|
77
|
+
<h3 id="cn-0.12.0">新增功能</h3>
|
|
78
|
+
|
|
79
|
+
- 桌面端把会话标题与标题行里的控件抬进窗口顶端的标题栏:标题靠左、控件靠右排在窗口按钮之前,标题行剩下的内容左移并上提到标题下面;放不下的一侧留在原来的行里。
|
|
80
|
+
|
|
81
|
+
### 体验优化
|
|
82
|
+
|
|
83
|
+
- **插件主文件缩小一半**:浏览器每次启动都要读取并解析的插件主文件此前是 1.6 MB(1,619,502 字节),现在压缩后是 0.8 MB(816,520 字节)。
|
|
84
|
+
- 右侧栏停靠的面板改成一枚悬浮卡片:四周各留 8px、16px 圆角、1px 描边与宿主面板自己的投影,列后面的画布从缝隙里透出来;分栏后每一栏的面板各有一枚卡片,拖出来的浮动面板保持宿主自己的窗口样式。
|
|
85
|
+
- **小鲸鱼的帧图改为矢量取用**:Deepy 的 18 张帧图此前由浏览器在某个动作第一次出现时下载 PNG、在画布上重建成矢量、再存进 Cache API;现在构建期就把它们转成矢量,按内容哈希长期缓存。第一次播放不再有重建的停顿,观感与之前一致;随包携带的帧图从 426 KB 变为 658 KB(brotli 后)。
|
|
86
|
+
- **浏览器里的侧栏品牌行**:非桌面外壳(浏览器页面)下侧栏品牌行是这一列的第一行,列顶部只有 6px 内边距,logo 贴着窗口上沿;品牌左侧也比「新会话」的加号圆片靠左 8px。现在浏览器页面给这一行加 8px 顶部边距,品牌带上这一行自己的 8px 左内边距,鲸鱼/星芒的左缘与加号圆片的左缘对齐。桌面外壳(Windows 标题栏、macOS)与折叠后的窄栏不变。
|
|
87
|
+
- **进行中的状态行不再随内容上下跳动**:宿主把「深度求索中」这一行画成聊天流的最后一行,答案流式追加时它跟着内容底部一起被推下去、跟随的滑动再把它拉回来,盯着末尾看时就是不停跳动。现在只要读者的跟随还开着,这一行就钉在输入框上方(输入框高度 + 上方的渐隐带 + 宿主的 16px 正文内边距),也就是跟随追上时它本来停的位置:突发的追加不再带动它,往回翻看历史时它照常留在文档位置,不会浮在读者正在读的内容上。
|
|
88
|
+
- 分栏的右侧栏:两栏各自仍是独立的圆角卡片,中间那条分栏线不再画(拖动时的提示照旧),两栏之间的距离从 16px 收到 6px,每栏到列边的距离从 8px 收到 6px。
|
|
89
|
+
- 手机宽度下的输入框下沿:权限选择器收起下三角,权限与模型选择器按窄屏上限截断,上下文只留圆环不显示数字;那一行同时不再溢出卡片——模型名随行收缩、输入框下方的停靠层不再保留桌面那两份留白,圆环因此回到卡片里、也不再压在推理等级上。
|
|
90
|
+
- 输入框下沿的权限档位:按钮不再画下三角(任何宽度都是),档位名过长时在按钮内截断;已经打开的档位卡在布局移动时会重新贴回它的触发按钮,而不再留在原处。
|
|
91
|
+
- 宿主的「回到底部」按钮改到输入框上方的正中:它原先长在对话栏右缘,正好压在站在输入卡片上的吉祥物身上;按钮仍是宿主的那个,皮肤只挪位置。
|
|
92
|
+
|
|
93
|
+
### 问题修复
|
|
94
|
+
|
|
95
|
+
- **启动之后才选的皮肤也会接手页面**:页面载入后才在皮肤中心选中别的皮肤时,本主题不让出页面,两套视觉叠在一起。现在无论页面启动时归谁,皮肤到来就让出、离开就接回,都不需要刷新。
|
|
96
|
+
- 右侧栏「开始」页的项目一屏放不下时,整列被上下同时裁掉,既看不到第一项也滚不到最后一项;现在这一列自己滚动,列表短时依旧居中。
|
|
97
|
+
- **发送时飞行的气泡从第一帧就是气泡的颜色**(#29):替身此前带两层底色——输入卡片的底色压在上面、气泡的底色在下面——随形状一起互相过渡;形状早已收成气泡,上层还没退完,读者看到的气泡先发白,在 DeepSeek 档下正是 Claude 档那条灰气泡的样子,过半秒才变蓝。现在底色画在那层始终等于形状的壳上,按下那一刻起就是目标气泡自己的颜色,没有哪一层能落在形状后面。卡片的描边与阴影照旧随形状收掉,并在形状归位的那一刻写定、撤掉各自的动画,不会在收窄完成后多留一帧。
|
|
98
|
+
- 成本计量插件停止写入后,用量面板把它覆盖的历史(8/24 起 26 天、11.23B Token)整份丢掉,改由会话日志现折,面板只剩日志还在的那部分(13 天、6.47B);现在两个来源按日期合并,账本认识的天仍用账本的数,只有它没覆盖的日期由折算补上,面板恢复完整历史。
|
|
99
|
+
- **与壁纸插件共存**:0.11.1 在启动时已有壁纸渲染(`body[data-we-wallpaper]`)的页面上整页让出,「与其他主题插件同时使用」里壁纸透过侧栏与玻璃弹层的效果随之失效。现在只为皮肤中心的皮肤(`html[data-dsh-skin]`)让路,壁纸在渲染时本主题照常工作。对外契约:不再读取 `body[data-we-wallpaper]`。
|
|
100
|
+
- **发送的替身不再在真实消息行缺席时淡出**:宿主的回显气泡只活约 159 毫秒,真实消息行要一秒以上才挂上,而替身按自己的时间表在 400 毫秒落地淡出,那一段里目标位置空着——读者看到刚发出的气泡淡成页面背景,随后整条又冒出来。现在降落前先确认有一条行在页面上可以交接:没有就把替身停在原地(保持可见、继续跟随目标位置),真实行一到立刻交接;宿主始终没挂上行时按 2.5 秒兜底把页面交还宿主。
|
|
101
|
+
- **设置页不再多出一层内边距**:皮肤自己的设置页带了 24px 横向内边距,而宿主的选项列本来就有 24px,于是整页比其余设置页(宿主自己的与别的插件的)向右缩进 24px、顶部也多 20px。现在横向不留内边距,顶部只留宿主行自己的 16px,标题与第一行文字和其余设置页在同一条竖线上。
|
|
102
|
+
- **吉祥物的分段控件回到右侧**:吉祥物这一行此前固定把控件排到文字下面(与品牌卡片同一套排法)。现在控件与文字同占一行、靠右对齐,只有在放不下时才落到下一行并从左边开始——判定用文字列的最小宽度(220px),控件本身不收缩。
|
|
103
|
+
- **欢迎语与账号区跟随登录的 DeepSeek 账号**:此前这两处只显示自定义用户名或本机系统用户名,登录账号的昵称从不出现;现在桌面端登录后显示账号昵称,自定义用户名仍然优先,账号资料读不到时才回退到 HDSL 昵称与本机系统用户名。
|
|
104
|
+
- 顶栏里的对话 / 轨迹标签条:标题与控件分列两侧时,标签条改取两者之间余下空当的中线(原先按窗口居中,两侧有内容后看着偏左);鼠标在对话区时标签条重新能唤起(本表自己的静置透明度带 !important,唤起规则少了它就一直压不过去,网页端同样受影响)。
|
|
105
|
+
- 顶栏里的会话标题不再过早截断:标题的可用宽度改为直接留出标签条自身的宽度与两侧的空隙,而不是去读标签条「按窗口居中」时的位置——标签条随后会被推到标题与控件之间的中线,那个位置本来就会被放弃,标题因此在小一半的宽度上就开始省略号。标题同时下移 2px,在标题栏里读起来才是垂直居中。
|
|
106
|
+
- 用对话导航跳到某一轮之后,新输出不再把位置拖回页底:跳转算读者自己选定的阅读位置,接管与滚轮相同,跟随与流式滑行在这一期间让开,读者自己回到页底时解除。
|
|
107
|
+
|
|
108
|
+
### 其他变更
|
|
109
|
+
|
|
110
|
+
- **公开路由变化**:`GET /dsh-claude-style/deepy/<动作>.png` 不再提供,帧图改由 `GET /dsh-claude-style/assets/<内容哈希>.svg` 提供;品牌标志、厂商组合标与螃蟹帧图同样由这份构建清单决定内联进产物还是走这条路由(小鲸鱼的 18 张帧图走路由)。更新插件后需要重启宿主,早于本次构建的宿主半边没有这条路由,小鲸鱼不会出现(控制台提示一次)。
|
|
111
|
+
- **附带 source map**:npm 包里新增 `lib/client.js.map`,浏览器开发者工具里的报错位置与断点能对应到插件源码。
|
|
112
|
+
- **Anthropic 字体的投放点迁到宿主目录**:把两款 Anthropic 字体复制进插件包 `fonts/` 目录后界面仍用替代字体,那个位置已不再被读取。现在的投放点是 `$DSH_HOME/dsh-claude-style/fonts/`(没有设置 `DSH_HOME` 时是 `~/.dsh/dsh-claude-style/fonts/`):放在这里的文件优先于包内的同名文件,缺失时照旧 404 回退到系统字体与替代字体。随包分发的四款字体与它们的授权文件改由构建写入 `lib/fonts/`,仓库里的字体文件移到了 `packages/assets/src/fonts/`,两款 Anthropic 字体在其 `anthropic/` 子目录里,仍然不随 npm 包分发。
|
|
113
|
+
|
|
114
|
+
<h3 id="en-0.12.0">New Features</h3>
|
|
115
|
+
|
|
116
|
+
- On the desktop the conversation's title and the header's controls rise into the window's own caption row — the title at the left, the controls at the right before the window buttons — and what is left of the title row closes up to the left and rides up under the title. A side without room stays in the header's own row.
|
|
117
|
+
|
|
118
|
+
### Improvements
|
|
119
|
+
|
|
120
|
+
- **The plugin's main file is half the size**: the file the browser reads and parses on every start was 1.6 MB (1,619,502 bytes); minified it is now 0.8 MB (816,520 bytes).
|
|
121
|
+
- A panel docked in the right sidebar is a floating card: 8px inside the column on every side, a 16px radius, a 1px hairline and the host's own panel elevation, with the column's canvas showing through the gap. Each column of a split dock gets its own card, and a panel pulled out of the sidebar keeps the host's own floating window.
|
|
122
|
+
- **Deepy's frames are taken as vectors**: the whale's 18 sheets used to be downloaded as PNGs the first time an animation appeared, rebuilt into a vector on a canvas and kept in the Cache API; the build now produces the vectors and they are cached for good under their content hash. The first play no longer pauses to rebuild and the whale looks the same; the sheets that ship with the package go from 426 KB to 658 KB (brotli).
|
|
123
|
+
- **The sidebar brand row in a browser**: without a desktop shell the brand row is the column's first row, so 6px of column padding was the whole inset and the logo sat against the window's top edge; the brand also started 8px left of the New session plus chip. A browser page now gives that row 8px of top margin and the brand the row's own 8px leading inset, so the whale or starburst's left edge lands on the chip's. The desktop shells (Windows titlebar, macOS) and the collapsed rail are unchanged.
|
|
124
|
+
- **The running status line no longer rides the content**: the host draws its "deep diving" row as the chat flow's last row, so every burst of a streaming answer pushes it down and the follow's glide drags it back, which reads as continuous jumping at the tail. While the reader's follow is on, the row is now pinned above the composer — the composer's height, the fade band above it and the host's 16px transcript padding — which is where it already comes to rest once the glide has caught up: a burst no longer moves it, and scrolled back through history it keeps its document place instead of floating over what the reader went back to read.
|
|
125
|
+
- In a split right sidebar each pane stays its own rounded card: the line the dock draws between them is gone (the drag highlight stays), the gap between the two comes in from 16px to 6px, and each pane now sits 6px from the column's edge instead of 8px.
|
|
126
|
+
- The composer's bottom line at a phone's width: the permission control drops its chevron, the permission and model controls truncate at narrow-screen caps, and the context meter keeps the ring without its number. The row no longer runs past the card either — the model name shrinks with it and the dock line under the card gives up the two desktop-sized reserves — so the ring lands inside the card instead of under the reasoning level.
|
|
127
|
+
- The permission tier control on the composer's bottom line drops its chevron at every width, not just on a phone, and a long tier name truncates inside the button. An open tier card is also placed again when the layout under it moves, instead of hanging where its trigger used to be.
|
|
128
|
+
- The host's back-to-end button now sits centred above the composer. Its shipped place is the conversation column's right edge, which is where the mascot stands on the composer card; the button stays the host's own and only its placement is the skin's.
|
|
129
|
+
|
|
130
|
+
### Bug Fixes
|
|
131
|
+
|
|
132
|
+
- **A skin picked after the page loaded takes the page too**: picking another skin in the Skin Center once the page had loaded left this theme on the page, two looks painted over each other. Now the theme gives the page up when a skin arrives and takes it back when the skin leaves, whichever way the page booted, without a reload.
|
|
133
|
+
- The right sidebar's start page clipped its entries at both ends once the list outgrew the pane, hiding the first rows with no way to scroll; the column scrolls now, and still centers the list while it fits.
|
|
134
|
+
- **The flying bubble is the bubble's colour from the first frame** (#29): the stand-in carried two fills — the composer card's over the bubble's — cross-fading as the shape narrowed, and the shape was already a bubble while the upper fill was still there, so the reader saw a pale bubble (in the DeepSeek palette, the colour the grey bubble has under Claude) that only turned blue half a second later. The fill is now painted on the one layer that is the shape at every step, so it is the destination bubble's own colour from the moment of the press and no fill can fall behind the shape. The card's hairline and shadow still leave with the shape, written and cancelled on the frame the shape settles rather than lingering a frame past it.
|
|
135
|
+
- Once the cost-meter plugin stopped writing, the usage panel discarded the whole history the ledger covered (11.23B tokens over 26 days from 8/24) and fell back to folding the session logs, which left it with only the part the logs still held (6.47B over 13 days); the two accounts now merge by date, the ledger keeps the days it knows and the fold fills only the dates past its newest, so the panel shows the whole history again.
|
|
136
|
+
- **Sharing the page with a wallpaper plugin**: 0.11.1 gave the whole page up when a wallpaper was already rendering at boot (`body[data-we-wallpaper]`), which lost the wallpaper showing through the sidebar and the glass popovers described under Alongside other theme plugins. Now only a Skin Center skin (`html[data-dsh-skin]`) makes the theme yield; while a wallpaper renders the theme keeps working. External contract: `body[data-we-wallpaper]` is no longer read.
|
|
137
|
+
- **The stand-in no longer fades out with no message row to land on**: the host's echo bubble lives about 159 ms while the real row takes over a second to mount, and the stand-in faded out on its own 400 ms schedule — with nothing at the destination, the reader watched the bubble they had just sent fade into the page and then the whole message pop back. The hand-over now waits until there is a row on the page to take the message: the stand-in holds where it is (visible, still following the destination) and hands over the moment the row mounts, with a 2.5 s backstop that gives the page back to the host if no row ever comes.
|
|
138
|
+
- **The settings page no longer adds an inset of its own**: the skin's page carried 24px of side padding while the host's options column already has 24px, which set the whole page — and its top, by another 20px — 24px inside the host's own pages and other plugins'. The page now keeps no side padding and only the host row's own 16px on top, so its heading and first row line up with every other page's.
|
|
139
|
+
- **The mascot's segmented control is back on the right**: the mascot row used to stack its control under the text, the layout the brand cards use. The control now shares the row and sits at its right edge, and drops to a line of its own starting at the left only when it no longer fits — decided by the text column's minimum width (220px), since the control itself never shrinks.
|
|
140
|
+
- **The welcome line and the account area follow the signed-in DeepSeek account**: both used to show the custom username or the local system user, never the signed-in account's nickname; on the desktop they now show the account nickname, a custom username still wins, and the HDSL name and the local system user remain the fallbacks for a profile that cannot be read.
|
|
141
|
+
- The Chat / Trajectory strip in the caption row: with the title and the controls standing on either side, the strip now takes the middle of the room left between them (it was centred on the window, which reads off-centre once both sides carry something), and hovering the conversation brings it back — the sheet's own resting opacity is stated with !important, so the reveal rule needed it too, on the web as much as on the desktop.
|
|
142
|
+
- The session title in the caption row no longer truncates early: its room is now the space up to the controls with the tab strip's own width and the air on both sides reserved, rather than the strip's window-centred position — the strip is then pushed to the middle between the title and the controls, so that position was one it was about to leave and the title began ellipsizing at half the width it had. The title also sits 2px lower, which is what reads as vertically centred in the caption row.
|
|
143
|
+
- After a jump to a turn from the conversation navigator, new output no longer drags the position back to the end: the jump counts as the reader choosing where to read, so it holds the conversation the way his own wheel does — the follow and the stream glide stand down until he comes back to the end himself.
|
|
144
|
+
|
|
145
|
+
### Chores
|
|
146
|
+
|
|
147
|
+
- **Public route change**: `GET /dsh-claude-style/deepy/<animation>.png` is gone; the frames are served by `GET /dsh-claude-style/assets/<content hash>.svg`, and the brand marks, the vendor lockups and the crab's sheets follow the same build manifest, which decides per file between an inline form and that route (the whale's 18 sheets take the route). Restart the host after updating: a host half older than this build has no such route and the whale will not appear (one console message).
|
|
148
|
+
- **Source map included**: the npm package now carries `lib/client.js.map`, so error locations and breakpoints in the browser's developer tools map back to the plugin's sources.
|
|
149
|
+
- **The Anthropic fonts are dropped into the harness home now**: copying the two Anthropic faces into the plugin package's `fonts/` directory left the look-alike faces in place, because that location is no longer read. The drop point is `$DSH_HOME/dsh-claude-style/fonts/` (`~/.dsh/dsh-claude-style/fonts/` when `DSH_HOME` is unset): a file there wins over a bundled face of the same name, and a missing one still answers 404 and falls back to the system and the look-alike faces. The four faces the package ships, with their licences, are written to `lib/fonts/` by the build, and the repository's font files moved to `packages/assets/src/fonts/`, the two Anthropic ones under its `anthropic/` directory and still outside the npm package.
|
|
150
|
+
|
|
5
151
|
## [0.11.1] - 2026-10-06
|
|
6
152
|
|
|
7
153
|
[中文](#cn-0.11.1) | [English](#en-0.11.1)
|
package/LICENSE
CHANGED
|
@@ -24,25 +24,28 @@ SOFTWARE.
|
|
|
24
24
|
|
|
25
25
|
Font files notice:
|
|
26
26
|
|
|
27
|
-
- `fonts/AnthropicSansWebText.ttf` and
|
|
27
|
+
- `packages/assets/src/fonts/anthropic/AnthropicSansWebText.ttf` and
|
|
28
|
+
`packages/assets/src/fonts/anthropic/AnthropicSerifWebText.ttf` are
|
|
28
29
|
proprietary typefaces of Anthropic, extracted from Anthropic's web products.
|
|
29
30
|
They are included in this repository for personal use only and are **not**
|
|
30
31
|
covered by the MIT license above; all rights remain with Anthropic. The npm
|
|
31
32
|
package does not ship these files.
|
|
32
|
-
Provider icon notice: the files under `
|
|
33
|
+
Provider icon notice: the files under `packages/assets/src/icons/providers/` (and their
|
|
33
34
|
`lib/icons/providers/` build copy) are vendored from farion1231/cc-switch
|
|
34
35
|
(MIT License, Copyright (c) 2025 Jason Young). They are redistributed under
|
|
35
36
|
the MIT License; brand names and logos remain trademarks of their respective
|
|
36
37
|
owners.
|
|
37
38
|
|
|
38
|
-
- `fonts/JetBrainsMonoVariable.ttf` and
|
|
39
|
-
are JetBrains Mono,
|
|
40
|
-
|
|
39
|
+
- `packages/assets/src/fonts/JetBrainsMonoVariable.ttf` and
|
|
40
|
+
`packages/assets/src/fonts/JetBrainsMonoItalicVariable.ttf` are JetBrains Mono,
|
|
41
|
+
distributed under the SIL Open Font License
|
|
42
|
+
(`packages/assets/src/fonts/OFL.txt`; the package carries them under
|
|
43
|
+
`lib/fonts/`). They may be redistributed with this plugin.
|
|
41
44
|
|
|
42
45
|
Crab artwork notice: the pixel crab (Clawd) is a character of Anthropic, and
|
|
43
|
-
all rights in it remain with Anthropic. `
|
|
44
|
-
and `
|
|
45
|
-
animation; the sheets under `
|
|
46
|
+
all rights in it remain with Anthropic. `packages/assets/src/mascot/crab-laptop-body.png`
|
|
47
|
+
and `packages/assets/src/mascot/crab-laptop-ink.png` are frames of Claude Code's own
|
|
48
|
+
animation; the sheets under `packages/assets/src/mascot/crab/` are drawn by this project
|
|
46
49
|
after that character (by `scripts/draw-crab.py`, which carries the drawings).
|
|
47
50
|
These files, and their copies inlined into `lib/client.js`, are **not** covered
|
|
48
51
|
by the MIT license above. This plugin is an unofficial fan work, not affiliated
|
package/README.en.md
CHANGED
|
@@ -24,12 +24,12 @@ The settings page's Brand mark row switches between the Claude and DeepSeek pale
|
|
|
24
24
|
|
|
25
25
|
<table>
|
|
26
26
|
<tr>
|
|
27
|
-
<td align="center" width="50%"><img src="./docs/claude-home-light.png" alt="Claude brand, Studio home — light" /></td>
|
|
28
|
-
<td align="center" width="50%"><img src="./docs/claude-home-dark.png" alt="Claude brand, Studio home — dark" /></td>
|
|
27
|
+
<td align="center" width="50%"><img src="./docs/screenshots/claude-home-light.png" alt="Claude brand, Studio home — light" /></td>
|
|
28
|
+
<td align="center" width="50%"><img src="./docs/screenshots/claude-home-dark.png" alt="Claude brand, Studio home — dark" /></td>
|
|
29
29
|
</tr>
|
|
30
30
|
<tr>
|
|
31
|
-
<td align="center" width="50%"><img src="./docs/claude-conversation-light.png" alt="Claude brand, Markdown conversation — light" /></td>
|
|
32
|
-
<td align="center" width="50%"><img src="./docs/claude-conversation-dark.png" alt="Claude brand, Markdown conversation — dark" /></td>
|
|
31
|
+
<td align="center" width="50%"><img src="./docs/screenshots/claude-conversation-light.png" alt="Claude brand, Markdown conversation — light" /></td>
|
|
32
|
+
<td align="center" width="50%"><img src="./docs/screenshots/claude-conversation-dark.png" alt="Claude brand, Markdown conversation — dark" /></td>
|
|
33
33
|
</tr>
|
|
34
34
|
</table>
|
|
35
35
|
|
|
@@ -39,12 +39,12 @@ The settings page's Brand mark row switches between the Claude and DeepSeek pale
|
|
|
39
39
|
|
|
40
40
|
<table>
|
|
41
41
|
<tr>
|
|
42
|
-
<td align="center" width="50%"><img src="./docs/deepseek-home-light.png" alt="DeepSeek brand, Studio home — light" /></td>
|
|
43
|
-
<td align="center" width="50%"><img src="./docs/deepseek-home-dark.png" alt="DeepSeek brand, Studio home — dark" /></td>
|
|
42
|
+
<td align="center" width="50%"><img src="./docs/screenshots/deepseek-home-light.png" alt="DeepSeek brand, Studio home — light" /></td>
|
|
43
|
+
<td align="center" width="50%"><img src="./docs/screenshots/deepseek-home-dark.png" alt="DeepSeek brand, Studio home — dark" /></td>
|
|
44
44
|
</tr>
|
|
45
45
|
<tr>
|
|
46
|
-
<td align="center" width="50%"><img src="./docs/deepseek-conversation-light.png" alt="DeepSeek brand, Markdown conversation — light" /></td>
|
|
47
|
-
<td align="center" width="50%"><img src="./docs/deepseek-conversation-dark.png" alt="DeepSeek brand, Markdown conversation — dark" /></td>
|
|
46
|
+
<td align="center" width="50%"><img src="./docs/screenshots/deepseek-conversation-light.png" alt="DeepSeek brand, Markdown conversation — light" /></td>
|
|
47
|
+
<td align="center" width="50%"><img src="./docs/screenshots/deepseek-conversation-dark.png" alt="DeepSeek brand, Markdown conversation — dark" /></td>
|
|
48
48
|
</tr>
|
|
49
49
|
</table>
|
|
50
50
|
|
|
@@ -52,91 +52,40 @@ The settings page's Brand mark row switches between the Claude and DeepSeek pale
|
|
|
52
52
|
>
|
|
53
53
|
> <table>
|
|
54
54
|
> <tr>
|
|
55
|
-
> <td align="center" width="25%"><img src="./
|
|
56
|
-
> <td align="center" width="25%"><img src="./
|
|
57
|
-
> <td align="center" width="25%"><img src="./
|
|
58
|
-
> <td align="center" width="25%"><img src="./
|
|
55
|
+
> <td align="center" width="25%"><img src="./docs/gifs/idle.gif" width="120" alt="Idle" /><br />Idle</td>
|
|
56
|
+
> <td align="center" width="25%"><img src="./docs/gifs/thinking.gif" width="120" alt="Thinking" /><br />Thinking</td>
|
|
57
|
+
> <td align="center" width="25%"><img src="./docs/gifs/typing.gif" width="120" alt="Answering and calling tools" /><br />Answering and calling tools</td>
|
|
58
|
+
> <td align="center" width="25%"><img src="./docs/gifs/conducting.gif" width="120" alt="Conducting subagents" /><br />Conducting subagents</td>
|
|
59
59
|
> </tr>
|
|
60
60
|
> <tr>
|
|
61
|
-
> <td align="center" width="25%"><img src="./
|
|
62
|
-
> <td align="center" width="25%"><img src="./
|
|
63
|
-
> <td align="center" width="25%"><img src="./
|
|
64
|
-
> <td align="center" width="25%"><img src="./
|
|
61
|
+
> <td align="center" width="25%"><img src="./docs/gifs/notification.gif" width="120" alt="Waiting on you" /><br />Waiting on you</td>
|
|
62
|
+
> <td align="center" width="25%"><img src="./docs/gifs/error.gif" width="120" alt="Failed" /><br />Failed</td>
|
|
63
|
+
> <td align="center" width="25%"><img src="./docs/gifs/happy.gif" width="120" alt="Finished" /><br />Finished</td>
|
|
64
|
+
> <td align="center" width="25%"><img src="./docs/gifs/sleeping.gif" width="120" alt="Asleep" /><br />Asleep</td>
|
|
65
65
|
> </tr>
|
|
66
66
|
> </table>
|
|
67
67
|
|
|
68
68
|
> The workspaces, sessions, usage figures and nickname in the screenshots are sample data.
|
|
69
69
|
|
|
70
|
-
##
|
|
70
|
+
## Features and settings
|
|
71
71
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
| Tab | Settings |
|
|
75
|
-
|---|---|
|
|
76
|
-
| General | Username, Animation, Open popovers on hover, Account-hold easter egg language |
|
|
77
|
-
| Appearance | Brand mark, Colours, Typefaces, Mascot, Where it appears |
|
|
78
|
-
| Composer | Composer restyle, Home layout, Redraw the model picker (with Quick providers under it), Redraw the permission control |
|
|
79
|
-
| Sidebar | Collapse the sidebar settings area, Sidebar search, In progress / Archived view |
|
|
80
|
-
| Conversation | Turn status line, Conversation navigator, Chat-area animations, Composer caret motion, Chat / Trajectory tabs |
|
|
81
|
-
|
|
82
|
-
Every feature that takes over part of the host's interface has its own switch; turning it off brings the host's original back at once, without a reload. The conversation area's animations — the follow, the automatic folding with its rolling door, the text fade, the file change rows and the send flight — share one Chat-area animations switch; the caret keeps its own three-way choice.
|
|
83
|
-
|
|
84
|
-
**Alongside other theme plugins**: with Colours and Typefaces set to Follow the host, the skin no longer rewrites the host's colours and fonts and keeps only its layout and controls; the colours are left to DSH itself, or to another theme plugin enabled at the same time. With [dsh-wallpaper-engine](https://github.com/elysia395/dsh-wallpaper-engine), for example, the wallpaper shows through the sidebar and the conversation, and the skin's own popovers take that plugin's glass, translucent and blurring the picture behind them. **Alongside [dsh-chat-ux](https://github.com/alm-allen/dsh-chat-ux)**: that plugin implements the same chat-area interactions (the rolling door, automatic folding, the token fade, file change rows, the send flight, the drawn caret), and two copies of them intercept each other's clicks and press the same controls. So this skin stands down when it sees that plugin: the Chat-area animations and Composer caret motion rows on the settings page's Conversation tab have their controls disabled while each still shows the value you set, with a line underneath in the accent colour reading "Managed by dsh-chat-ux". Your settings are not rewritten, and they take effect as they are once dsh-chat-ux is removed.
|
|
85
|
-
|
|
86
|
-
**Chat-area follow**: at the structural moments — a thinking row folding, a tool call row arriving — a reader sitting at the bottom is handed back to the host's own follow, instead of being left tens of pixels short by the burst of content; a process group capped in the Standard and Compact tiers (thinking and tool output kept in one scrolling body) is caught up the same way. Catching up runs on a curve: a trickle of characters settles softly and a burst glides at one steady speed before landing. While content streams, the main scroller's own follow is walked along that curve too rather than written to the end in a single frame — with a fast stream the newest lines trail just below the fold and slide into place once it stops. A message you send does not go through it: the host's scroll to bring it into view lands at once. Once the reader scrolls away from the bottom himself, the plugin stays out of it until he returns.
|
|
87
|
-
|
|
88
|
-
**Automatic folding**: a thinking row opens while the model reasons and folds back when it stops; a running process group opens and folds back once that piece of work ends. A row or group the reader pressed himself keeps what he chose for that phase.
|
|
89
|
-
|
|
90
|
-
**Send flight**: on submission the composer card lifts as it is and narrows into the bubble as it travels, its words re-flowing into the shape, landing on the message row: the real bubble shows underneath and the flying copy fades out, so the words sharpen into place.
|
|
91
|
-
|
|
92
|
-
**File change rows**: a write or edit dispatched from inside a run_code program carries the `+n -m` tail and an expandable diff card, and its path opens the file; a failed or interrupted row keeps its verdict.
|
|
93
|
-
|
|
94
|
-
**New text fades in**: characters arriving in a streaming answer start faint and settle over about 0.12 s, staggered slightly by arrival order; a block arriving whole, a burst of thousands of characters and text that just reflowed from a fold stay solid.
|
|
95
|
-
|
|
96
|
-
**A rolling door for folds**: opening or closing a row (a tool card, a thinking row, a command card) or a process group moves the height frame by frame, really pushing the content below away or pulling it back. The door only rolls the stretch the reader can see, so any length moves at the same speed, and a body holding several cards rolls as one door. It rides the Chat-area animations switch, together with the entrance fade of an expanded body.
|
|
97
|
-
|
|
98
|
-
**Composer caret motion**: the composer's text caret is drawn by the plugin and glides when it moves; a question card's answer box and a queued message's inline editor are covered as well. The Conversation tab offers Every move (the default), Explicit moves and Off.
|
|
99
|
-
|
|
100
|
-
**Conversation navigator**: the column of short marks at the conversation's right edge holds one per turn and follows where you are reading. Reach it with the pointer and it opens into a list: each row carries the message that started its turn and sits exactly where that turn's mark was — the turn you are reading stays in place, and the turn under the pointer is still under it. The wheel scrolls the list and a click glides the page to the turn, loading earlier history first when it is not loaded yet; the Chat / Trajectory tabs at the top of the conversation stay up while the pointer is on the list. Alt+↑ / Alt+↓ jump to the previous or the next turn, and held or repeated they keep stepping; while the composer holds a draft the keys stay with it. The turn you land on flashes a short line over its start. With [dsh-plugin-msg-nav](https://github.com/SherUnlocked-4869/dsh-plugin-msg-nav) installed too, Alt+↑ / Alt+↓ stay with that plugin.
|
|
101
|
-
|
|
102
|
-
**Mascot**: a pixel companion stands on the composer's top edge and changes its animation with what the agent is doing (thinking, writing and calling tools, several sessions at work, subagents, waiting on you, compacting the context, finished, failed, asleep). Follow the brand shows the pixel crab under Claude and Deepy the whale under DeepSeek; either can be picked for good, or none. Where it appears keeps it to the new-conversation page, or puts it in conversations as well.
|
|
72
|
+
What the plugin does and what each setting changes is documented: [Features](docs/FEATURES.en.md), [Settings](docs/SETTINGS.en.md).
|
|
103
73
|
|
|
104
74
|
## Fonts
|
|
105
75
|
|
|
106
|
-
> **Important: the Anthropic fonts
|
|
76
|
+
> **Important: the Anthropic fonts do not ship with the npm package; they are in this repository for download and study only.**
|
|
107
77
|
|
|
108
78
|
| Font | Used for | File |
|
|
109
79
|
|---|---|---|
|
|
110
|
-
| Anthropic Sans Web Text | Interface / UI | [`fonts/AnthropicSansWebText.ttf`](https://github.com/Nwflower/dsh-claude-style/raw/main/fonts/AnthropicSansWebText.ttf) |
|
|
111
|
-
| Anthropic Serif Web Text | Conversation body / Markdown | [`fonts/AnthropicSerifWebText.ttf`](https://github.com/Nwflower/dsh-claude-style/raw/main/fonts/AnthropicSerifWebText.ttf) |
|
|
112
|
-
| JetBrains Mono Variable | Code / code blocks | [`fonts/JetBrainsMonoVariable.ttf`](https://github.com/Nwflower/dsh-claude-style/raw/main/fonts/JetBrainsMonoVariable.ttf), [`fonts/JetBrainsMonoItalicVariable.ttf`](https://github.com/Nwflower/dsh-claude-style/raw/main/fonts/JetBrainsMonoItalicVariable.ttf) |
|
|
113
|
-
| Inter | Interface when Anthropic Sans is absent | [`fonts/InterVariable.woff2`](https://github.com/Nwflower/dsh-claude-style/raw/main/fonts/InterVariable.woff2) |
|
|
114
|
-
| Noto Serif | Conversation body when Anthropic Serif is absent | [`fonts/NotoSerifVariable.woff2`](https://github.com/Nwflower/dsh-claude-style/raw/main/fonts/NotoSerifVariable.woff2) |
|
|
115
|
-
|
|
116
|
-
JetBrains Mono, Inter and Noto Serif are licensed under the SIL Open Font License 1.1 and ship with the npm package; nothing to set up. Inter and Noto Serif nearly match the two Anthropic fonts in letter height and width, so without the Anthropic fonts they stand in and the interface and conversation text keep their layout. Both carry only the Latin characters the Anthropic fonts cover; Chinese text keeps using the system's Chinese fonts.
|
|
80
|
+
| Anthropic Sans Web Text | Interface / UI | [`packages/assets/src/fonts/anthropic/AnthropicSansWebText.ttf`](https://github.com/Nwflower/dsh-claude-style/raw/main/packages/assets/src/fonts/anthropic/AnthropicSansWebText.ttf) |
|
|
81
|
+
| Anthropic Serif Web Text | Conversation body / Markdown | [`packages/assets/src/fonts/anthropic/AnthropicSerifWebText.ttf`](https://github.com/Nwflower/dsh-claude-style/raw/main/packages/assets/src/fonts/anthropic/AnthropicSerifWebText.ttf) |
|
|
117
82
|
|
|
118
83
|
To enable the Anthropic fonts, choose one of the following:
|
|
119
84
|
|
|
120
85
|
① Install them on your system — on Windows, double-click each `.ttf` and choose "Install"; on macOS, import them with Font Book.
|
|
121
86
|
|
|
122
|
-
② Skip the install — copy the `.ttf` files into
|
|
87
|
+
② Skip the install — copy the `.ttf` files into `$DSH_HOME/dsh-claude-style/fonts/`.
|
|
123
88
|
|
|
124
|
-
> The Anthropic Sans and Serif fonts are the property of Anthropic, licensed for personal use only, and are not covered by this project's MIT license.
|
|
125
|
-
|
|
126
|
-
## Skin center handoff
|
|
127
|
-
|
|
128
|
-
This theme is also offered as a **skin** in the DSH Skin Center. Selecting it there hands the whole page to this
|
|
129
|
-
plugin; selecting anything else - another skin, the official default, or a running wallpaper - takes the page back
|
|
130
|
-
without a reload.
|
|
131
|
-
|
|
132
|
-
- The answer holds from the first frame: the Skin Center stamps `html[data-dsh-skin]` into the served document, so a
|
|
133
|
-
page that boots with a skin already painting never flashes a frame of this theme first.
|
|
134
|
-
- While another owner has the page this theme mounts no stylesheet, installs no feature and claims no document
|
|
135
|
-
attribute at all. It takes the page back on a real flip, and gives it back when an owner returns.
|
|
136
|
-
- The settings page and every stored preference survive the handoff. A skin taking the screen does not uninstall
|
|
137
|
-
anything, and closing the Skin Center does not throw away what you configured here.
|
|
138
|
-
- `data-dsh-claude-style-handoff` on `body` marks a build that can do this; the Skin Center offers the row only
|
|
139
|
-
while it is there.
|
|
140
89
|
## Installation
|
|
141
90
|
|
|
142
91
|
1. From the official plugin page, add the plugin below and it installs.
|
|
@@ -153,6 +102,7 @@ dsh plugin --profile web add Nwflower/dsh-claude-style # GitHub source
|
|
|
153
102
|
```
|
|
154
103
|
|
|
155
104
|
3. From the [plugin market](https://github.com/dsh-market/dsh-market)
|
|
105
|
+
4. From the Skin Center of the dsh-web-all plugin
|
|
156
106
|
|
|
157
107
|
Keep only one theme enabled at a time. dsh ≥ 0.1.7 is required, and a restart of DeepSeek Harness brings the full feature set.
|
|
158
108
|
|
|
@@ -163,13 +113,15 @@ Keep only one theme enabled at a time. dsh ≥ 0.1.7 is required, and a restart
|
|
|
163
113
|
| [Design tokens](docs/STYLE.md) | Palette, typography, shapes, source layout, and host-selector discipline (in English) |
|
|
164
114
|
| [Architecture decisions](docs/decisions/README.md) | One file per decision: build and source, the host boundary, the runtime and each feature's trade-offs, and the architecture migration in progress (in Chinese) |
|
|
165
115
|
| [Changelog](CHANGELOG.md) | Version history |
|
|
166
|
-
| [Contributing](CONTRIBUTING.md) | Building from `src/`, commit conventions, and the screenshot and regression tooling (in English) |
|
|
116
|
+
| [Contributing](CONTRIBUTING.md) | Building from `packages/client/src/`, commit conventions, and the screenshot and regression tooling (in English) |
|
|
167
117
|
|
|
168
118
|
## Acknowledgements
|
|
169
119
|
|
|
170
120
|
The conversation navigator's opening list, keyboard jumps and landing line follow SherUnlocked-4869's [dsh-plugin-msg-nav](https://github.com/SherUnlocked-4869/dsh-plugin-msg-nav) (MIT).
|
|
171
121
|
|
|
172
|
-
The animation frames of Deepy the pixel whale come from the Deepy whale theme pack drawn by calmly-eating-bugs ([@wp3171216237](https://github.com/wp3171216237)), and ship with the plugin by the author's permission. Many thanks to the author! GIFs of all 20 animations, contributed by the author, are in [
|
|
122
|
+
The animation frames of Deepy the pixel whale come from the Deepy whale theme pack drawn by calmly-eating-bugs ([@wp3171216237](https://github.com/wp3171216237)), and ship with the plugin by the author's permission. Many thanks to the author! GIFs of all 20 animations, contributed by the author, are in [docs/gifs/](docs/gifs/).
|
|
123
|
+
|
|
124
|
+
The enhanced animations in the chat area are modified from [dsh-chat-ux](https://github.com/alm-allen/dsh-chat-ux) (MIT), and the redraw animations from [dsh-better-display](https://github.com/aa2246740/dsh-better-display) (MIT).
|
|
173
125
|
|
|
174
126
|
The pixel crab (Clawd) is a character of Anthropic, and all rights in it remain with Anthropic. Its laptop animation is taken from Claude Code; the animations of its other states are drawn by this project after that character. The crab's frames are not covered by the MIT license (see [LICENSE](LICENSE)). This plugin is an unofficial fan work, not affiliated with or endorsed by Anthropic.
|
|
175
127
|
|