dsh-claude-style 0.2.6 → 0.3.0

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.
Files changed (111) hide show
  1. package/CHANGELOG.md +40 -1
  2. package/LICENSE +6 -0
  3. package/README.en.md +4 -3
  4. package/README.md +6 -3
  5. package/docs/STYLE.md +68 -1
  6. package/lib/client.js +2889 -68
  7. package/lib/icons/providers/ClaudeApi.png +0 -0
  8. package/lib/icons/providers/README.md +13 -0
  9. package/lib/icons/providers/TeamoRouter-icon-dark.png +0 -0
  10. package/lib/icons/providers/a6-icon.png +0 -0
  11. package/lib/icons/providers/aicodemirror.svg +19 -0
  12. package/lib/icons/providers/aicoding.svg +20 -0
  13. package/lib/icons/providers/aihubmix-color.svg +1 -0
  14. package/lib/icons/providers/algocode.svg +51 -0
  15. package/lib/icons/providers/alibaba.svg +1 -0
  16. package/lib/icons/providers/amuxapi-icon.svg +13 -0
  17. package/lib/icons/providers/anthropic.svg +1 -0
  18. package/lib/icons/providers/apikeyfun.png +0 -0
  19. package/lib/icons/providers/apinebula_icon.png +0 -0
  20. package/lib/icons/providers/atlascloud_icon.png +0 -0
  21. package/lib/icons/providers/aws.svg +1 -0
  22. package/lib/icons/providers/azure.svg +1 -0
  23. package/lib/icons/providers/baidu.svg +1 -0
  24. package/lib/icons/providers/bailian.svg +1 -0
  25. package/lib/icons/providers/bytedance.svg +1 -0
  26. package/lib/icons/providers/byteplus.png +0 -0
  27. package/lib/icons/providers/catcoder.svg +1 -0
  28. package/lib/icons/providers/ccsub.svg +4 -0
  29. package/lib/icons/providers/chatglm.svg +1 -0
  30. package/lib/icons/providers/cherryin.png +0 -0
  31. package/lib/icons/providers/claude.svg +1 -0
  32. package/lib/icons/providers/claudecn.png +0 -0
  33. package/lib/icons/providers/claw.svg +22 -0
  34. package/lib/icons/providers/cloudflare.svg +1 -0
  35. package/lib/icons/providers/code0.png +0 -0
  36. package/lib/icons/providers/cohere.svg +1 -0
  37. package/lib/icons/providers/copilot.svg +1 -0
  38. package/lib/icons/providers/crazyrouter.svg +1 -0
  39. package/lib/icons/providers/cubence.svg +9 -0
  40. package/lib/icons/providers/deepseek.svg +1 -0
  41. package/lib/icons/providers/doubao.svg +1 -0
  42. package/lib/icons/providers/eflowcode.png +0 -0
  43. package/lib/icons/providers/etok.png +0 -0
  44. package/lib/icons/providers/fenno-icon.webp +0 -0
  45. package/lib/icons/providers/gemini.svg +1 -0
  46. package/lib/icons/providers/gemma.svg +1 -0
  47. package/lib/icons/providers/github.svg +1 -0
  48. package/lib/icons/providers/githubcopilot.svg +1 -0
  49. package/lib/icons/providers/google.svg +1 -0
  50. package/lib/icons/providers/googlecloud.svg +1 -0
  51. package/lib/icons/providers/grok.svg +1 -0
  52. package/lib/icons/providers/hermes.png +0 -0
  53. package/lib/icons/providers/huawei.svg +1 -0
  54. package/lib/icons/providers/huggingface.svg +1 -0
  55. package/lib/icons/providers/hunyuan.svg +1 -0
  56. package/lib/icons/providers/huoshan.png +0 -0
  57. package/lib/icons/providers/kimi.svg +1 -0
  58. package/lib/icons/providers/lioncc.svg +6 -0
  59. package/lib/icons/providers/longcat-color.svg +1 -0
  60. package/lib/icons/providers/mcp.svg +1 -0
  61. package/lib/icons/providers/meta.svg +1 -0
  62. package/lib/icons/providers/micu.svg +23 -0
  63. package/lib/icons/providers/midjourney.svg +1 -0
  64. package/lib/icons/providers/minimax.svg +1 -0
  65. package/lib/icons/providers/mistral.svg +1 -0
  66. package/lib/icons/providers/modelscope-color.svg +1 -0
  67. package/lib/icons/providers/nekocode-icon.png +0 -0
  68. package/lib/icons/providers/newapi.svg +1 -0
  69. package/lib/icons/providers/notion.svg +1 -0
  70. package/lib/icons/providers/novita.svg +11 -0
  71. package/lib/icons/providers/nvidia.svg +1 -0
  72. package/lib/icons/providers/ollama.svg +1 -0
  73. package/lib/icons/providers/openai.svg +1 -0
  74. package/lib/icons/providers/opencode-logo-light.svg +1 -0
  75. package/lib/icons/providers/openrouter.svg +1 -0
  76. package/lib/icons/providers/packycode.svg +1 -0
  77. package/lib/icons/providers/palm.svg +1 -0
  78. package/lib/icons/providers/pateway.jpg +0 -0
  79. package/lib/icons/providers/perplexity.svg +1 -0
  80. package/lib/icons/providers/pipellm.png +0 -0
  81. package/lib/icons/providers/ppio.svg +1 -0
  82. package/lib/icons/providers/qianwenai.svg +1 -0
  83. package/lib/icons/providers/qiniu.png +0 -0
  84. package/lib/icons/providers/qwen.svg +1 -0
  85. package/lib/icons/providers/qwencloud.svg +1 -0
  86. package/lib/icons/providers/rc.svg +1 -0
  87. package/lib/icons/providers/relaxcode.png +0 -0
  88. package/lib/icons/providers/runapi.jpg +0 -0
  89. package/lib/icons/providers/shengsuanyun.svg +4 -0
  90. package/lib/icons/providers/siliconflow.svg +1 -0
  91. package/lib/icons/providers/sssaicode.svg +73 -0
  92. package/lib/icons/providers/stability.svg +1 -0
  93. package/lib/icons/providers/stepfun.svg +10 -0
  94. package/lib/icons/providers/subrouter.svg +30 -0
  95. package/lib/icons/providers/sudocode-us.png +0 -0
  96. package/lib/icons/providers/sudocode.png +0 -0
  97. package/lib/icons/providers/tencent.svg +1 -0
  98. package/lib/icons/providers/ucloud.svg +1 -0
  99. package/lib/icons/providers/unity2.png +0 -0
  100. package/lib/icons/providers/vercel.svg +1 -0
  101. package/lib/icons/providers/wenxin.svg +1 -0
  102. package/lib/icons/providers/xai.svg +1 -0
  103. package/lib/icons/providers/xiaomimimo.svg +1 -0
  104. package/lib/icons/providers/xycai-icon.png +0 -0
  105. package/lib/icons/providers/yi.svg +1 -0
  106. package/lib/icons/providers/zeroone.svg +1 -0
  107. package/lib/icons/providers/zetaapi-icon.png +0 -0
  108. package/lib/icons/providers/zhipu.svg +1 -0
  109. package/lib/index.js +27 -0
  110. package/lib/model-descriptions.json +223 -0
  111. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,44 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.3.0] - 2026-09-20
4
+
5
+ ### Added
6
+ - **账户横条彩蛋:Claude 封号页**:侧栏底栏账户弹层顶部那条用户名横条现在可以点,点开是 Claude 官方「Your account is on hold」封号页的完整复刻(手绘锁形图标、`account_banned` 提示条、三步复核流程卡片、申请复核按钮、导出数据/删除账户两条操作)。它只是彩蛋——不改宿主状态、不碰会话与设置,只是一个挂在 `<body>` 上、退出时移除的全窗口浮层,因此能盖住标题栏、侧栏与输入区,也不会被侧栏列宽裁掉。退出全是明确动作:页面上的每个按钮(退出登录、申请复核、两条操作、提示条、窗口控制)都能关掉它,`Esc` 也能;点页面空白处不会关。**切走窗口不会关**——这页是用来读的,读者很可能要切出去查点东西,一失焦就消失比多留一会儿更糟,所以窗口失焦那条退出路径已经拿掉。品牌偏好同样生效——选 Anthropic 时页头换成 `A\` + ANTHROPIC 字标,选「关闭」时只留 Claude 字标。
7
+ - **`封号彩蛋语言` 设置**:彩蛋那页的语言由设置(`Ctrl+,` → Claude Style)单独决定,可选中文/英文,默认英文;文案仍走 `model-descriptions.json` 的 `ban` 块。之所以不让它跟随界面语言:那页复刻的是 Claude 的真实界面,按它本来的语言读才对。改语言会立刻重建已打开的那一页,时间戳的时钟也跟着换(英文 AM/PM、中文 24 小时制);该值存在宿主设置命名空间的 `banLocale` 字段,读取端对未知值一律回落到英文,手改配置不会把页面变成空白。
8
+
9
+ ### Changed
10
+ - **封号页的锁改为手绘描摹**:那页顶部的锁此前是 `rect` + `circle` 拼出来的标准图标,跟参考草图的手绘气质不搭。现在整把锁按参考图(89×92px)的墨迹中心线逐锚点描摹成三条三次贝塞尔路径——方框的每条「直」边都带一点自己的倾斜与漂移(顶边右低、底边微垂、左边下行时外移、右边绕过锁孔处外鼓再收回),四角用一小段斜线收口,锁梁里外两拱不同心、两条腿停在方框顶边上而不穿过它,锁孔的头部比正圆扁、腰身偏右、底座比头更宽。手绘感来自锚点本身,不是滤镜也不是随机抖动,所以缩放到任何尺寸都成立;锚点数值整体映射到图标集统一的 24 单位格(墨迹 15.3×20 单位居中),图标框 58px → 75px(墨迹 47.5px → 62.8px,约 +32%),描边 0.5 单位。选这两个数是量出来的:参考页里「锁的墨迹高 ÷ 标题墨迹高」是 3.08,改完是 2.70(此前 2.05);参考页的「线宽 ÷ 锁高」是 0.025,改完实测 0.0250(此前 0.075,粗了近三倍)。
11
+ - **修掉 `banSvg` 的重复属性**:图标助手此前把 `stroke-width` 追加在 `<svg>` 已有的一条之后,形成重复属性——HTML 解析器只认第一条,于是覆盖静默失效,锁实际按图标集的 1.6 画(在 58px 框里近 3.9px),这正是它看起来「线条太粗」的原因。现在粗细是 `banSvg(body, strokeWidth)` 的形参,只发一条属性;`.debug` 里的校验脚本会数属性条数,防止再犯。
12
+ - **点击展开的账户弹层不再被鼠标移出关掉**:此前点账户按钮展开弹层后,指针一离开按钮(弹层挂在按钮下方,指针必须离开)就被 `mouseleave` 关掉,等于点开即关、弹层里的条目够不着;现在点击展开的弹层改为由「点击别处」或「移出整个底栏」关闭,悬停展开仍按原来的延迟关闭逻辑。
13
+ - **账户弹层:账号名下的横线移出 hover 区**:弹层顶部原来是「整块(含横线)在 hover 时整体铺底」,指针扫过横线也会亮;现在横线是账号行的兄弟节点、归弹层所有(左右通栏到弹层内边距边缘),hover 底板只覆盖账号名那一行。
14
+ - **封号页排版**:内容列由靠左改为水平居中;页头(左上角品牌标 + 右上角 Sign out 与窗口控制)整体下移 30px。
15
+ - **行内代码片收紧**:行内代码(`` `npm run build` ``)的圆角矩形此前继承正文行高(15px 代码字号配 23px 行盒),上下各空出约 5px 底纹,显得虚胖。现在代码片自带 `line-height: 1.2`,行盒收到 18px、整片高度 27px → 22px,1px 内边距成为唯一的可见内缩;再小就开始切字形下伸部。底纹、描边、圆角、字号不变,正文段落/表格/标题的行距不受影响。
16
+
17
+ ### Fixed
18
+ - **回退引用块的链接材质**:0.2.7 把 Markdown 引用块(`blockquote`)改成了链接材质(蓝字 + 蓝色下划线 + 蓝色底纹/竖条),但引用是**容器**而不是链接,这套样式会连同块内的行内代码、文件引用一起染蓝,等于让链接材质泄露进引用块。现回退为原来的中性灰:文字 `#B0AEA5`(亮色 `#6E6A60`)、灰底 + 灰竖条,块内的链接、行内代码片、文件引用各自保持自己的材质,互不串色。`padding` 也不再需要 `!important` 钉死。
19
+ - **文件引用(行内文件名)颜色与超链接不一致**:聊天里的 `` `CHANGELOG.md` `` 这类**文件引用**是宿主把行内代码里的文件路径解析成按钮(`.fileMention`)后的产物,但皮肤的通配行内代码规则(`code:not(pre code)`,特异性 (0,2,1))压过宿主自己的链接色类((0,1,0)),于是同一段话里文件引用是代码片的暖红、真正的超链接是链接蓝。现在文件引用的文字改用链接色(亮 `#184F95` / 暗 `#8AB4F8`)、字重 500,下划线沿用超链接那一套(静止态实线、链接色调 60%、1.5px、offset 2px;hover/focus 同样实线、换成不透明的链接色,**线宽与线位不变**),**代码片本身完全不动**——底纹、描边、圆角、内边距与普通行内代码逐项相同,只有文字颜色不同。hover 规则只改颜色:先前用 `text-decoration` 简写会把 `text-decoration-thickness` 重置为 `auto`,导致 hover 时下划线反而变细。普通行内代码仍是暖红代码片;宿主类名带哈希,故按仓库纪律取最长稳定片段 `[class*="_fileMention"]`。
20
+ - **修复 Markdown 表格左侧空隙**:删除旧的全局 `table { width:100% }`、`table th` 背景与 `td/th { padding: 0.6em 0.85em !important }` 规则,避免覆盖宿主 `th:first-child { padding-left: 0 }` 和 `width: max-content`,表格过宽时不再出现左侧空白与外部边框错位。 同时对全部 `.tableScroll` 包装器强制 table margin/padding/border-spacing 归零,首/末单元格恢复 16px 内边距,并把表头背景与行线覆盖到 `thead th/td` 和每行首末单元格(th 或 td),使首列的留白看起来是表格内部区域而不是空隙。
21
+
22
+ ## [0.2.7] - 2026-09-20
23
+
24
+ ### Added
25
+ - **模型选择器厂商标识**:模型行显示**模型所属厂商**的标识(而非转售该模型的 provider),「更多模型」的 provider 分组标题显示该 provider 的标识。标识取自 [Lobe Icons](https://lobehub.com/icons) 的静态 SVG(`@lobehub/icons-static-svg`,MIT),按仓库既有架构在构建期内联进 bundle——`@lobehub/icons` 是 React 组件包,装它就要破坏「零依赖、零打包器、单文件产物」这条约束。用单色字形(`fill="currentColor"`)随主题文字色绘制,亮暗两画布都清晰,也不与「陶烬橙唯一强调色」冲突;彩色变体不做——OpenAI、Anthropic、xAI、Moonshot、Z.ai、Vercel、Groq 等 12 家上游本就没有彩色版,且部分厂商色在 `#141413` 画布上不可见。绑定关系仍是数据:`model-descriptions.json` 的 `brands.providers` / `brands.models`,构建期校验引用的标识都已 vendored,写错即构建失败。
26
+
27
+ ### Changed
28
+ - **Markdown 引用块改用超链接材质**:引用(`blockquote`)此前是中性灰文字 + 灰底灰条,与超链接毫无关联;现改为与 Markdown 链接同一套材质——链接蓝文字(亮 `#184F95` / 暗 `#8AB4F8`)、静止态同色下划线(1.5px、offset 2px,与链接逐项一致),底纹与左侧竖条取该蓝色的淡色(亮 `rgba(24,79,149,.08)` / `.45`,暗 `rgba(138,180,248,.12)` / `.55`)。引用与链接本就是同一类信号(「这段内容来自别处」),故共用一种材质;正文衬线字体不变。同时把引用块 `padding` 钉死,宿主 `.markdown blockquote` 的 `padding-left: 14px` 不再吃掉右侧内边距,底纹左右等宽。
29
+ - **文本选区改为实色两态**:选中文字不再用半透明陶烬橙,改为平台式实色——窗口聚焦时蓝底白字(`#3366D0` / `#FFFFFF`),窗口失焦时灰底黑字(`#C7C7C6` / `#000000`),亮暗两画布一致。选区是瞬时操作而非界面表层,因此不跟随主题;两态都是实色且带 `!important`,覆盖底下的链接色、行内代码色与语法高亮色,避免"蓝底上保留原文字色"导致读不清。CSS 无法读取窗口焦点(Chromium 走内部 `-internal-inactive-selection-*`),故由新增的 `src/overrides/selection.js` 把焦点态镜像到文档属性上,样式表据此切换;失焦时选区本身保留,不消失。
30
+ - **接入 cc-switch 全量供应商图标**:`src/assets/icons/providers` 引入其 107 个图标,build 解析 `index.ts` / `metadata.ts` 生成 `PROVIDER_ICONS` / `PROVIDER_ICON_METADATA`,宿主新增 `/dsh-claude-style/icons/providers/*` 路由;模型选择器优先用 cc-switch 图标,缺失时回退 Lobe。
31
+ - **更多模型供应商标签改为推挤式 sticky**:每个供应商包成 section,滚动时上一个标签被下一个 section 往上推,而不是直接覆盖。
32
+ - **附件输入框接缝优化**:移除附件轨 focus 时 1px 内圈阴影,消除图片区与文字区之间的分界线和阴影。
33
+ - **更多模型子弹层**:适当提高弹层高度;供应商标签改为 sticky 顶部条,滚动时由下一个供应商标签替换。
34
+ - **更多模型 provider 标签强化**:provider 分组标题改为黑底白字圆角矩形;深色模式为白底黑字。
35
+ - **模型触发器 hover 去重**:删除 trailing 下针对 trigger/model 的额外 hover 规则,只保留模型触发器自身一层背景。
36
+ - **标题中文回退改为黑体**:SERIF 栈移除 CJK 衬线回退,中文落到 Noto Sans SC / 微软雅黑等黑体;西文仍保持 Anthropic Serif / Georgia / Times。
37
+ - **统计弹层合并**:统计行允许收缩省略(如 20轮...);隐藏宿主两个独立弹层,改为一个自定义弹层:上下两个区块(会话统计 / Token 用量),每块 2×2 网格,无总标题,风格与权限弹层一致,内容字号加大。
38
+ - **统计区交互**:统计弹层改为 hover 打开;统计控件仅在鼠标位于整个对话窗口内时显示。 统计行占据中间剩余空间并居中,使到左侧按钮组和右侧模型选择器的距离一致。
39
+ - **输入区统计合并重绘**:会话统计与 token 统计合并为一条居中的紧凑文本(如 23轮439步 · 130tok/s · 125M tok · 99% Cache),隐藏宿主图标与原始标签,两个统计弹层同步重绘为同一套字体/圆角/边框。
40
+ - **模型选择器补充当前非官方模型**:当前选中模型不属于 DeepSeek 官方服务时,在官方模型与更多模型之间用横线分隔并额外显示一行 provider/model。 触发器同时去掉向下箭头,hover 背景只保留在整个触发器上。
41
+
3
42
  ## [0.2.6] - 2026-09-20
4
43
 
5
44
  ### Added
@@ -9,7 +48,7 @@
9
48
  ### Changed
10
49
  - **代码块与表格样式对齐 Claude**:行内代码与代码块字号 -1px;代码块边框移到外层容器,语言标签与代码共用同一圆角边框;Markdown 表格字号提升一档(13px → 14px)、表头 #F0F0EF 背景、12px 圆角,并使用与内部横线一致的 0.5px 线条加外边框。
11
50
  - **设置页支持自定义用户名**:新增用户名输入框,输入停顿后自动保存;默认用户名由宿主 OS 用户解析一次并缓存,不再解析工作区路径或轮询;宿主半边未重载时浏览器本地回退保留自定义值。
12
- - **链接与行内代码样式对齐 Claude**:Markdown 链接下划线静止态 60% 不透明度、hover/focus-visible 恢复 100%,下划线加粗到 1.5px 并保留下划线避让;行内代码与代码块均改用 JetBrains Mono、字号强制与正文一致,并 +1 字重;代码字体栈补上正文 CJK 回退。行内代码背景矩形 padding 缩到 1px、背景色进一步减淡,边框与 composer 输入卡片非焦点态一致(1px solid --dsw-alias-border-l1);Markdown 正文行高 -1px、段落间距 -4px,代码块外边距与行高同步对齐正文。新对话页 composer 卡片保留纯白填充与真实投影,仅移除背景色光晕阴影。排队消息、后台任务、目标栏提升到消息层之上,避免被消息卡片遮挡。
51
+ - **链接与行内代码样式对齐 Claude**:Markdown 链接下划线静止态 60% 不透明度、hover/focus-visible 恢复 100%,下划线加粗到 1.5px 并保留下划线避让;行内代码与代码块均改用 JetBrains Mono、字号强制与正文一致,并 +1 字重;代码字体栈补上正文 CJK 回退。行内代码背景矩形 padding 缩到 1px、背景色进一步减淡,边框与 composer 输入卡片非焦点态一致(1px solid --dsw-alias-border-l1);Markdown 正文行高 -1px、段落间距 -4px,代码块外边距与行高同步对齐正文。新对话页 composer 卡片保留纯白填充与真实投影,仅移除背景色光晕阴影。排队消息、后台任务、目标栏提升到消息层之上,避免被消息卡片遮挡;排队 dock 上移 3px,使其下沿对齐输入卡片边框。
13
52
  - **代码字体从 Anthropic Mono Variable 替换为 JetBrains Mono Variable**:选用 JetBrains Mono 可变字体(含 Italic)作为代码字体,随插件库一并分发,并保留 SIL OFL 许可证。
14
53
  - **权限弹层改为 hover 态打开**:权限分段按钮悬停时打开权限弹层,移入弹层取消关闭,移出后延迟关闭;`autoPopover` 关闭时仍保持点击打开/关闭。
15
54
 
package/LICENSE CHANGED
@@ -29,6 +29,12 @@ Font files notice:
29
29
  They are included in this repository for personal use only and are **not**
30
30
  covered by the MIT license above; all rights remain with Anthropic. The npm
31
31
  package does not ship these files.
32
+ Provider icon notice: the files under `src/assets/icons/providers/` (and their
33
+ `lib/icons/providers/` build copy) are vendored from farion1231/cc-switch
34
+ (MIT License, Copyright (c) 2025 Jason Young). They are redistributed under
35
+ the MIT License; brand names and logos remain trademarks of their respective
36
+ owners.
37
+
32
38
  - `fonts/JetBrainsMonoVariable.ttf` and `fonts/JetBrainsMonoItalicVariable.ttf`
33
39
  are JetBrains Mono, distributed under the SIL Open Font License
34
40
  (`fonts/OFL.txt`). They may be redistributed with this plugin.
package/README.en.md CHANGED
@@ -56,9 +56,10 @@ Only one theme should be active at a time. After installing, **restart `dsh web`
56
56
 
57
57
  1. **Theme** — applies the whole canvas automatically after install; no configuration needed. Light and dark follow the system color scheme.
58
58
  2. **Permission segments** — the composer gets a Read | Edit | Auto segmented control replacing the shipped access-mode menu: read-only, workspace write, and full access (Auto is switched through the shipped risk-confirmation dialog).
59
- 3. **Brand switch** — Settings (`Ctrl+,`) **Claude Style**: the sidebar brand flips between the Claude starburst + the official Claude wordmark and Anthropic (`A\` + ANTHROPIC wordmark); the hero mark follows the choice with the clay fill. The choice persists in the browser; `claude` is the default.
60
- 4. **Account drawer** — the sidebar footer button opens a hover popover with quick access to Settings (`Ctrl+,`) and plugin management.
61
- 5. **Status polish** — thinking turns pick one of Claude Code's 185 spinner verbs per turn; the workspace loading state uses a Fluent-style circular indicator.
59
+ 3. **Model picker** — the composer's model seat becomes a two-level Claude-style menu: the first level lists DeepSeek's official models, a divider, the reasoning-effort row and "More models", and the second opens beside it. Every model row carries the mark of the **vendor that made the model** (not the provider reselling it), and the "More models" group headers carry the provider's mark. The marks are [Lobe Icons](https://lobehub.com/icons) mono glyphs painted in the theme's own text colour, so they stay legible on both canvases — no React dependency, and no full-colour logos.
60
+ 4. **Brand switch** — Settings (`Ctrl+,`) → **Claude Style**: the sidebar brand flips between the Claude starburst + the official Claude wordmark and Anthropic (`A\` + ANTHROPIC wordmark); the hero mark follows the choice with the clay fill. The choice persists in the browser; `claude` is the default.
61
+ 5. **Account drawer** — the sidebar footer button opens a hover popover with quick access to Settings (`Ctrl+,`) and plugin management; the username row at its top is an easter egg: it opens Claude's own "Your account is on hold" page (a purely local reproduction that touches no real state — click any control on it, or press `Esc`, to leave; it deliberately stays put when the window loses focus, so you can switch away and read it). That page's language is its own setting (**Account-hold easter egg language**, Chinese/English, English by default).
62
+ 6. **Status polish** — thinking turns pick one of Claude Code's 185 spinner verbs per turn; the workspace loading state uses a Fluent-style circular indicator.
62
63
 
63
64
  ## Disable & Uninstall
64
65
 
package/README.md CHANGED
@@ -57,9 +57,10 @@ dsh plugin --profile web add Nwflower/dsh-claude-style # GitHub 源
57
57
 
58
58
  1. **主题** —— 安装即全局生效,无需配置;亮暗跟随系统颜色模式。
59
59
  2. **权限分段** —— 输入框以 Read | Edit | Auto 三段式控制器替换原生的访问模式菜单:只读、工作区写入与完全权限(Auto 经宿主的安全确认弹窗切换)。
60
- 3. **品牌切换** —— 设置(`Ctrl+,`)→ **Claude Style**:侧栏品牌在 Claude(官方星芒 + Claude 字标)与 Anthropic(`A\` + ANTHROPIC 字标)之间切换,新会话页标识随所选品牌保持陶烬橙星芒;选择保存在浏览器本地,默认 Claude
61
- 4. **账户抽屉** —— 侧栏底栏的账户按钮悬停展开弹层,一键打开设置(`Ctrl+,`)与管理插件。
62
- 5. **状态细节** —— 思考状态每轮从 Claude Code 185 个思考动词随机抽取一个稳定展示;工作区运行中状态使用 Fluent 风格的圆形加载动画。
60
+ 3. **模型选择器** —— 输入框的模型席位换成 Claude 风格的两级弹层:一级列出 DeepSeek 官方模型、分隔线、推理等级与「更多模型」,二级在右侧展开。每个模型行显示**所属厂商**的标识(不是转售该模型的 provider),「更多模型」的分组标题显示 provider 的标识。标识取自 [Lobe Icons](https://lobehub.com/icons) 的单色字形,跟随主题文字色绘制,因此亮暗两套画布都清晰;不引入 React 组件依赖,也不使用彩色 logo
61
+ 4. **品牌切换** —— 设置(`Ctrl+,`)→ **Claude Style**:侧栏品牌在 Claude(官方星芒 + Claude 字标)与 Anthropic(`A\` + ANTHROPIC 字标)之间切换,新会话页标识随所选品牌保持陶烬橙星芒;选择保存在浏览器本地,默认 Claude。
62
+ 5. **账户抽屉** —— 侧栏底栏的账户按钮悬停展开弹层,一键打开设置(`Ctrl+,`)与管理插件;弹层顶部那条用户名横条是个彩蛋:点开会看到 Claude 官方的「账户已暂停」页(纯本地复刻,不碰任何真实状态,点页面上任意按钮或按 `Esc` 退出;切走窗口**不会**关,方便你切出去照着它看)。这页的语言在设置里单独选(**封号彩蛋语言**,中文/英文,默认英文)。
63
+ 6. **状态细节** —— 思考状态每轮从 Claude Code 的 185 个思考动词随机抽取一个稳定展示;工作区运行中状态使用 Fluent 风格的圆形加载动画。
63
64
 
64
65
  ## 停用与卸载
65
66
 
@@ -84,9 +85,11 @@ dsh plugin --profile web remove dsh-claude-style # 卸载
84
85
  | --- | --- | --- |
85
86
  | Claude 视觉 | 全局 | 象牙白/暖黑双画布、陶烬橙唯一强调色、衬线展示标题 + 无衬线界面 + 等宽代码三字体分工 |
86
87
  | 权限控制器 | 输入框浮层 / 新会话分段 | Read · Edit · Auto 三段切换会话权限,Auto 走宿主安全确认 |
88
+ | 模型选择器 | 输入框模型席位 | 两级弹层(官方模型 / 推理等级 / 更多模型);模型行按厂商、分组标题按 provider 显示单色品牌标识 |
87
89
  | 品牌切换 | 设置 → Claude Style | Claude(星芒 + Claude 字标)与 Anthropic(`A\`)双标识,选择持久化 |
88
90
  | 状态动画 | 会话运行中 | 185 个思考动词随机展示;Windows 11 Fluent 风格圆形加载器 |
89
91
  | 账户抽屉 | 侧栏底栏 | 悬停展开弹层,直达设置与管理插件 |
92
+ | 封号页彩蛋 | 账户弹层顶部的用户名横条 | 复刻 Claude「Your account is on hold」整页,点任意按钮或按 `Esc` 退出(切走窗口不关);语言由「封号彩蛋语言」设置决定(默认英文) |
90
93
 
91
94
  ## 文档
92
95
 
package/docs/STYLE.md CHANGED
@@ -40,6 +40,54 @@ Rules:
40
40
  follows the same hairline so the two tiers stay one outline. Accent is never
41
41
  used for focus strokes.
42
42
 
43
+ ## Text selection
44
+
45
+ Selection is the one surface that leaves the palette on purpose — it is a
46
+ transient gesture, not part of the interface, so it uses the platform's two
47
+ solid paints and looks the same on both canvases:
48
+
49
+ | State | Background | Text |
50
+ |---|---|---|
51
+ | Window focused | `#3366D0` | `#FFFFFF` |
52
+ | Window unfocused | `#C7C7C6` | `#000000` |
53
+
54
+ Both are solid (never translucent) and `!important`, so they override whatever
55
+ colour the text underneath carries — links, inline code, syntax tokens. CSS
56
+ cannot read window focus: Chromium reaches the inactive paint through its own
57
+ internal `-internal-inactive-selection-*` properties, which a stylesheet cannot
58
+ address. `src/overrides/selection.js` therefore mirrors `document.hasFocus()`
59
+ onto `data-dsh-window-blur` and the stylesheet switches on that attribute; the
60
+ selection itself survives the blur.
61
+
62
+ ## Markdown material
63
+
64
+ A quote is a **container**, not a link: it keeps the prose face on a neutral bar
65
+ and wash (text `#B0AEA5`, light `#6E6A60`), and whatever sits inside it keeps its
66
+ own material — links stay blue, inline-code chips stay warm red, file mentions
67
+ stay link-blue. Never paint the quote itself with the link colour: the colour
68
+ inherits into the block's inline code and mentions, which is exactly the leak
69
+ that made every path inside a quote read as a link.
70
+
71
+ **Inline file mentions are links, not code.** The host resolves a file path
72
+ inside an inline code span to a button (`.fileMention`, hashed — match it with
73
+ `[class*="_fileMention"]`) and paints it with its link alias. The generic
74
+ inline-code chip rule is more specific than that class, so a mention inherits
75
+ the chip's warm red unless a rule names it. A mention takes the link blue, weight
76
+ 500, and the link's underline (solid in the link tone at rest, solid and fully
77
+ opaque on hover, same thickness and offset — the same treatment the skin gives an
78
+ anchor); the chip itself is left alone — the same fill, hairline, radius and
79
+ padding as any other inline code. Plain inline code keeps its warm text. Note the
80
+ hover rule must set only `text-decoration-color`: the `text-decoration` shorthand
81
+ resets `text-decoration-thickness` to `auto` and thins the line mid-hover.
82
+
83
+ ## Inline code
84
+
85
+ The chip hugs its glyphs. The host builds it as an `inline-flex` box that
86
+ inherits the prose line box — 23px for a 15px code size — which left ~5px of
87
+ empty wash above and below the text. The skin sets `line-height: 1.2` on inline
88
+ code (27px → 22px, with the 1px padding as the visible inset); lower values
89
+ start clipping descenders. The fill, hairline, radius and size are unchanged.
90
+
43
91
  ## Implementation notes
44
92
 
45
93
  - Every rule is scoped under `body[data-dsh-claude-style]`.
@@ -54,7 +102,9 @@ assembles the bundle:
54
102
  | Source | Content |
55
103
  |---|---|
56
104
  | `src/constants.js` | constants, spinner verbs, shared token values (evaluated at build time to fill `%%TOKEN%%` placeholders) |
57
- | `src/assets/*.svg` | brand marks, inlined as CSS `url()` data URIs at build time (the loader exposes no asset URLs) |
105
+ | `src/assets/brand/*.svg` | brand marks, inlined as CSS `url()` data URIs at build time (the loader exposes no asset URLs) |
106
+ | `src/assets/icons/lobe/*.svg` | model-vendor marks (Lobe Icons mono, MIT), inlined as a JS markup table at build time; bound to providers/models by `model-descriptions.json` → `brands` |
107
+ | `src/assets/icons/providers/*` | cc-switch provider/vendor icon set (MIT); inline SVGs are bundled, raster/imported files are served by the host route |
58
108
  | `src/styles/tokens.css` | design tokens (dark base + ivory light) |
59
109
  | `src/styles/typography.css` | serif display / sans UI / mono code, editorial markdown |
60
110
  | `src/styles/chrome.css` | canvas, hairlines, clay accent, chrome details |
@@ -64,6 +114,7 @@ assembles the bundle:
64
114
  | `src/styles/sidebar.css` | sidebar brand, new-session row, workspace tree |
65
115
  | `src/styles/components/permissions.css` | permission segments and popover |
66
116
  | `src/styles/components/account-footer.css` | account row and floating popover |
117
+ | `src/styles/components/ban-screen.css` | the account-hold easter egg (full-window overlay) |
67
118
  | `src/styles/components/model-picker.css` | model picker popovers |
68
119
  | `src/styles/components/footer-takeover.css` | host footer takeover rules |
69
120
  | `src/styles/components/third-party.css` | agy-link repair rules |
@@ -77,7 +128,9 @@ assembles the bundle:
77
128
  | `src/overrides/permissions.js` | permission segments/popover installer |
78
129
  | `src/overrides/model-picker.js` | model picker installer |
79
130
  | `src/overrides/account-footer.js` | account footer/popover installer |
131
+ | `src/overrides/ban-screen.js` | account-hold easter egg installer |
80
132
  | `src/overrides/scheduler.js` | scheduler, observers, subscriptions, teardown |
133
+ | `src/overrides/selection.js` | mirrors the window's focus state onto the document for the two text-selection paints |
81
134
  | `src/settings.js` | settings section (brand switch) |
82
135
  | `src/entry.js` | `apply()` orchestrator + exports |
83
136
  | `src/model-descriptions.json` | model copy (picker labels + per-model descriptions); validated at build time and **copied** to `lib/`, not inlined |
@@ -99,6 +152,20 @@ the catalog's own text; family rules are ordered and must stay anchored (the
99
152
  `flash` rule is scoped to `deepseek`, or another vendor's flash tier inherits
100
153
  DeepSeek's copy).
101
154
 
155
+ The same document carries the picker's **brand marks** under `brands`:
156
+ `brands.providers` maps a provider route id to a vendored mark (the level-2
157
+ group header), and `brands.models` is an ordered, anchored rule list matching a
158
+ model id (the row's vendor — the vendor that made the model, not the aggregator
159
+ reselling it, with the provider's mark as the fallback). Both name ids vendored
160
+ in `src/assets/icons/lobe/`, and the build fails on an id that is not there, so the
161
+ binding cannot drift. The marks are the **mono** Lobe Icons glyphs
162
+ (`fill="currentColor"`), stamped into the row as markup: the theme's own text
163
+ colour paints them, which keeps them legible on both canvases and keeps the
164
+ palette to its single clay accent. Full-colour variants are deliberately not
165
+ used — a third of the vendors ship no colour version (OpenAI, Anthropic, xAI,
166
+ Moonshot, Z.ai, Vercel, Groq), and several brand colours are near-black on the
167
+ `#141413` canvas.
168
+
102
169
  ### Host selector discipline · 宿主选择器纪律
103
170
 
104
171
  The host uses hashed CSS-module classes (`p_FcLG_row`, `_0cyzDW_viewArea`, …).