dsh-claude-style 0.2.2 → 0.2.4

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/lib/client.js CHANGED
@@ -4,6 +4,7 @@
4
4
  * GENERATED FILE — do not edit. Source lives in src/ (JS zones as fragments,
5
5
  * stylesheets as plain CSS); `node scripts/build.mjs` assembles this bundle.
6
6
  * - src/constants.js Zone 1: Constants & Tokens
7
+ * - src/assets/*.svg Brand marks (inlined as CSS url() data URIs at build time)
7
8
  * - src/styles/*.css Zone 2: Stylesheets (tokens, typography, chrome,
8
9
  * composer, sidebar, components)
9
10
  * - src/context.js Zone 3: DSH Context & Helpers
@@ -29,6 +30,24 @@ window.__ModuleLoader__.load({
29
30
 
30
31
  var COMPOSER_HINT = 'How can I help you today?'
31
32
 
33
+ /**
34
+ * Model-picker copy. The host's model catalog only carries English
35
+ * descriptions for its two builtin DeepSeek models, so the skin mirrors
36
+ * the host dictionary's zh strings for them (raw descriptions otherwise).
37
+ * `deepseek-official` is the provider group id of DeepSeek's own service.
38
+ */
39
+ var MODEL_OFFICIAL_GROUP = 'deepseek-official'
40
+ var MODEL_FALLBACK_LABEL = '选择模型'
41
+ var MODEL_LOADING_LABEL = '正在加载模型…'
42
+ var MODEL_EMPTY_LABEL = '没有可用的模型。'
43
+ var MODEL_EFFORT_LABEL = '推理等级'
44
+ var MODEL_EFFORT_DEFAULT = 'Default'
45
+ var MODEL_MORE_LABEL = 'More models'
46
+ var MODEL_DESCRIPTIONS = {
47
+ 'deepseek-official/deepseek-v4-flash': '快速、高效且经济;适合目标明确、常规或并行任务。',
48
+ 'deepseek-official/deepseek-v4-pro': '更强的自主编码、知识与复杂推理能力;适合复杂或质量优先的任务,但成本更高。',
49
+ }
50
+
32
51
  /** English weekday names, indexed by Date#getDay() (0 = Sunday). */
33
52
  var WEEKDAY_NAMES = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
34
53
 
@@ -98,9 +117,6 @@ window.__ModuleLoader__.load({
98
117
  'Spinning', 'Twisting', 'Unfurling', 'Unravelling', 'Vibing', 'Whirring'
99
118
  ]
100
119
 
101
- /** Anthropic's starburst mark as an inline data URI, keeping the skin a single-file bundle with no asset request. */
102
- var ANTHROPIC_MARK = "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z' fill='%23D97757'/%3E%3C/svg%3E\")"
103
-
104
120
  /** Segment label and the shipped /permission preset it selects. */
105
121
  var PERMISSION_SEGMENTS = [
106
122
  { label: 'Read', preset: 'read-only' },
@@ -147,75 +163,8 @@ window.__ModuleLoader__.load({
147
163
  /** The document attribute the stylesheet switches on. */
148
164
  var BRAND_ATTR = 'data-dsh-claude-brand'
149
165
 
150
- /**
151
- * Claude's own brand lockup, taken from the official artwork (claude.ai via
152
- * Wikimedia Commons, public domain as a simple geometric/text logo). The mark
153
- * and the wordmark ship as two separate alpha masks so each can be sized
154
- * independently: the sidebar pairs the starburst with the wordmark, while the
155
- * new-conversation hero uses the starburst alone with the clay fill baked in.
156
- *
157
- * Two details are load-bearing:
158
- * - The source paths live in the artwork's own coordinate space and are
159
- * wrapped in a group transform, so every mask has to carry that same
160
- * `translate` or the tight viewBox crops the geometry away entirely.
161
- * - `#` and `'` stay percent-encoded inside the data URI. A literal `#`
162
- * starts a fragment and truncates the URI at that point.
163
- */
164
- var CLAUDE_TRANSFORM = "translate(-75.96,-223.53)"
165
- /** Tight viewBox of the starburst alone (148.09 x 148.18 user units). */
166
- var CLAUDE_MARK_VIEWBOX = '0 0 148.09 148.18'
167
- /** Tight viewBox of the wordmark alone, excluding the starburst. */
168
- var CLAUDE_WORD_VIEWBOX = '177.76 14.09 512.22 121.54'
169
- /** Aspect ratio of the wordmark, so callers can size it from the height. */
166
+ /** Wordmark aspect ratio; scripts/build.mjs sizes the sidebar word height from it (geometry lives in src/assets/claude-word.svg). */
170
167
  var CLAUDE_WORD_ASPECT = 512.22 / 121.54
171
- /** Aspect ratio of the full mark+wordmark lockup. */
172
- var CLAUDE_LOCKUP_ASPECT = 689.98 / 148.18
173
-
174
- /** Starburst path, in the artwork's own (pre-transform) coordinates. */
175
- var CLAUDE_MARK_PATH = 'm 105.01,322.07 29.14,-16.35 0.49,-1.42 -0.49,-0.79 h -1.42 l -4.87,-0.3 -16.65,-0.45 -14.44,-0.6 -13.99,-0.75 -3.52,-0.75 -3.3,-4.35 0.34,-2.17 2.96,-1.99 4.24,0.37 9.37,0.64 14.06,0.97 10.2,0.6 15.11,1.57 h 2.4 l 0.34,-0.97 -0.82,-0.6 -0.64,-0.6 -14.55,-9.86 -15.75,-10.42 -8.25,-6 -4.46,-3.04 -2.25,-2.85 -0.97,-6.22 4.05,-4.46 5.44,0.37 1.39,0.37 5.51,4.24 11.77,9.11 15.37,11.32 2.25,1.87 0.9,-0.64 0.11,-0.45 -1.01,-1.69 -8.36,-15.11 -8.92,-15.37 -3.97,-6.37 -1.05,-3.82 c -0.37,-1.57 -0.64,-2.89 -0.64,-4.5 l 4.61,-6.26 2.55,-0.82 6.15,0.82 2.59,2.25 3.82,8.74 6.19,13.76 9.6,18.71 2.81,5.55 1.5,5.14 0.56,1.57 h 0.97 v -0.9 l 0.79,-10.54 1.46,-12.94 1.42,-16.65 0.49,-4.69 2.32,-5.62 4.61,-3.04 3.6,1.72 2.96,4.24 -0.41,2.74 -1.76,11.44 -3.45,17.92 -2.25,12 h 1.31 l 1.5,-1.5 6.07,-8.06 10.2,-12.75 4.5,-5.06 5.25,-5.59 3.37,-2.66 h 6.37 l 4.69,6.97 -2.1,7.2 -6.56,8.32 -5.44,7.05 -7.8,10.5 -4.87,8.4 0.45,0.67 1.16,-0.11 17.62,-3.75 9.52,-1.72 11.36,-1.95 5.14,2.4 0.56,2.44 -2.02,4.99 -12.15,3 -14.25,2.85 -21.22,5.02 -0.26,0.19 0.3,0.37 9.56,0.9 4.09,0.22 h 10.01 l 18.64,1.39 4.87,3.22 2.92,3.94 -0.49,3 -7.5,3.82 -10.12,-2.4 -23.62,-5.62 -8.1,-2.02 h -1.12 v 0.67 l 6.75,6.6 12.37,11.17 15.49,14.4 0.79,3.56 -1.99,2.81 -2.1,-0.3 -13.61,-10.24 -5.25,-4.61 -11.89,-10.01 h -0.79 v 1.05 l 2.74,4.01 14.47,21.75 0.75,6.67 -1.05,2.17 -3.75,1.31 -4.12,-0.75 -8.47,-11.89 -8.74,-13.39 -7.05,-12 -0.86,0.49 -4.16,44.81 -1.95,2.29 -4.5,1.72 -3.75,-2.85 -1.99,-4.61 1.99,-9.11 2.4,-11.89 1.95,-9.45 1.76,-11.74 1.05,-3.9 -0.07,-0.26 -0.86,0.11 -8.85,12.15 -13.46,18.19 -10.65,11.4 -2.55,1.01 -4.42,-2.29 0.41,-4.09 2.47,-3.64 14.74,-18.75 8.89,-11.62 5.74,-6.71 -0.04,-0.97 h -0.34 l -39.15,25.42 -6.97,0.9 -3,-2.81 0.37,-4.61 1.42,-1.5 11.77,-8.1 -0.04,0.04 z'
176
-
177
- /** Wordmark path, in the artwork's own (pre-transform) coordinates. */
178
- var CLAUDE_WORD_PATH = 'm 317.73,349.33 c -18.82,0 -31.69,-10.5 -37.76,-26.66 -3.17,-8.42 -4.74,-17.36 -4.61,-26.36 0,-27.11 12.15,-45.94 39,-45.94 18.04,0 29.17,7.87 35.51,26.66 h 7.72 l -1.05,-25.91 c -10.8,-6.97 -24.3,-10.5 -40.72,-10.5 -23.14,0 -42.82,10.35 -53.77,29.02 -5.66,9.86 -8.53,21.07 -8.32,32.44 0,20.74 9.79,39.11 28.16,49.31 10.06,5.37 21.34,8.04 32.74,7.72 17.92,0 32.14,-3.41 44.74,-9.37 l 3.26,-28.57 h -7.87 c -4.72,13.05 -10.35,20.89 -19.69,25.05 -4.57,2.06 -10.35,3.11 -17.32,3.11 z m 81.18,-98.96 0.75,-12.75 h -5.32 l -23.7,7.12 v 3.86 l 10.5,4.87 v 89.17 c 0,6.07 -3.11,7.42 -11.25,8.44 v 6.52 h 40.31 v -6.52 c -8.17,-1.01 -11.25,-2.36 -11.25,-8.44 V 250.4 l -0.04,-0.04 z m 160.31,108.75 h 3.11 l 27.26,-5.17 v -6.67 l -3.82,-0.3 c -6.37,-0.6 -8.02,-1.91 -8.02,-7.12 v -47.55 l 0.75,-15.26 h -4.31 l -25.76,3.71 v 6.52 l 2.51,0.45 c 6.97,1.01 9.04,2.96 9.04,7.84 v 42.37 c -6.67,5.17 -13.05,8.44 -20.62,8.44 -8.4,0 -13.61,-4.27 -13.61,-14.25 v -39.79 l 0.75,-15.26 h -4.42 l -25.8,3.71 v 6.52 l 2.66,0.45 c 6.97,1.01 9.04,2.96 9.04,7.84 v 39.11 c 0,16.57 9.37,24.45 24.3,24.45 11.4,0 20.74,-6.07 27.75,-14.51 l -0.75,14.51 -0.04,-0.04 z M 484.3,306.36 c 0,-21.19 -11.25,-29.32 -31.57,-29.32 -17.92,0 -30.94,7.42 -30.94,19.72 0,3.67 1.31,6.49 3.97,8.44 l 13.65,-1.8 c -0.6,-4.12 -0.9,-6.64 -0.9,-7.69 0,-6.97 3.71,-10.5 11.25,-10.5 11.14,0 16.76,7.84 16.76,20.44 v 4.12 l -28.12,8.44 c -9.37,2.55 -14.7,4.76 -18.26,9.94 -1.89,3.17 -2.8,6.82 -2.62,10.5 0,12 8.25,20.47 22.35,20.47 10.2,0 19.24,-4.61 27.11,-13.35 2.81,8.74 7.12,13.35 14.81,13.35 6.22,0 11.85,-2.51 16.87,-7.42 l -1.5,-5.17 c -2.17,0.6 -4.27,0.9 -6.49,0.9 -4.31,0 -6.37,-3.41 -6.37,-10.09 v -30.97 z m -36,40.76 c -7.69,0 -12.45,-4.46 -12.45,-12.3 0,-5.32 2.51,-8.44 7.87,-10.24 l 22.8,-7.24 v 21.9 c -7.27,5.51 -11.55,7.87 -18.22,7.87 z m 237.36,6.82 v -6.67 l -3.86,-0.3 c -6.37,-0.6 -7.99,-1.91 -7.99,-7.12 v -89.47 l 0.75,-12.75 h -5.36 l -23.7,7.12 v 3.86 l 10.5,4.87 v 29.32 c -5.91,-4.05 -12.98,-6.08 -20.14,-5.77 -23.55,0 -41.92,17.92 -41.92,44.74 0,22.09 13.2,37.35 34.95,37.35 11.25,0 21.04,-5.47 27.11,-13.95 l -0.75,13.95 h 3.15 l 27.26,-5.17 v 0 z m -49.35,-68.02 c 11.25,0 19.69,6.52 19.69,18.52 v 33.75 c -5.18,5.16 -12.23,8 -19.54,7.87 -16.12,0 -24.3,-12.75 -24.3,-29.77 0,-19.12 9.34,-30.37 24.15,-30.37 z M 743.3,302.8 c -2.1,-9.9 -8.17,-15.52 -16.61,-15.52 -12.6,0 -21.34,9.49 -21.34,23.1 0,20.14 10.65,33.19 27.86,33.19 11.48,-0.12 22.04,-6.33 27.71,-16.31 l 5.02,1.35 c -2.25,17.47 -18.07,30.52 -37.5,30.52 -22.8,0 -38.51,-16.87 -38.51,-40.87 0,-24 17.06,-41.21 39.86,-41.21 17.02,0 29.02,10.24 32.89,28.01 l -59.4,18.22 v -8.02 l 40.01,-12.41 v -0.04 z'
179
-
180
- /**
181
- * Build a CSS `url()` for one Claude mask.
182
- *
183
- * `encodeURIComponent` does the escaping, which is why the paths above are kept
184
- * as raw literals rather than pre-baked data URIs: every `#`, `'` and `<` gets
185
- * escaped exactly once, so no fill colour can accidentally terminate the URI.
186
- * `fill` defaults to `currentColor`, letting the mask follow the theme.
187
- *
188
- * @param viewBox - tight viewBox of the geometry being drawn.
189
- * @param paths - one or more path `d` strings to include.
190
- * @param fill - optional paint; omit for a currentColor alpha mask.
191
- * @returns a quoted CSS url() value.
192
- */
193
- function claudeMask(viewBox, paths, fill) {
194
- var body = ''
195
- for (var i = 0; i < paths.length; i++) {
196
- body += "<path" + (fill ? " fill='" + fill + "'" : '') + " d='" + paths[i] + "'/>"
197
- }
198
- var svg =
199
- "<svg xmlns='http://www.w3.org/2000/svg' viewBox='" + viewBox + "'>" +
200
- "<g transform='" + CLAUDE_TRANSFORM + "'>" + body + '</g></svg>'
201
- return 'url("data:image/svg+xml,' + encodeURIComponent(svg) + '")'
202
- }
203
-
204
- /** The starburst alone, as a currentColor alpha mask. */
205
- var CLAUDE_MARK = claudeMask(CLAUDE_MARK_VIEWBOX, [CLAUDE_MARK_PATH])
206
- /** The wordmark alone, as a currentColor alpha mask. */
207
- var CLAUDE_WORD = claudeMask(CLAUDE_WORD_VIEWBOX, [CLAUDE_WORD_PATH])
208
- /** The full lockup (starburst + wordmark) as one currentColor alpha mask. */
209
- var CLAUDE_LOCKUP = claudeMask('0 0 689.98 148.18', [CLAUDE_MARK_PATH, CLAUDE_WORD_PATH])
210
- /** The starburst with the clay accent baked in, for the new-conversation hero. */
211
- var CLAUDE_MARK_CLAY = claudeMask(CLAUDE_MARK_VIEWBOX, [CLAUDE_MARK_PATH], '#D97757')
212
-
213
- /** Anthropic's A\ lockup mark (the alternate sidebar brand), as an alpha mask. */
214
- var ANTHROPIC_BRAND_MARK = "url(\"data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 46 32%27%3E%3Cpath d=%27M32.73 0H25.7846L38.4499 32H45.3953L32.73 0Z%27/%3E%3Cpath d=%27M12.6653 0L0 32H7.08167L9.67193 25.28H22.9219L25.5122 32H32.5939L19.9286 0H12.6653ZM11.9626 19.3371L16.2969 8.09143L20.6313 19.3371H11.9626Z%27/%3E%3C/svg%3E\")"
215
-
216
- /** The ANTHROPIC wordmark (the alternate sidebar brand), as an alpha mask. */
217
- var ANTHROPIC_BRAND_WORD = "url(\"data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 143 16%27%3E%3Cpath transform=%27translate(18.299999237060547,0.27000001072883606)%27 d=%27 M10.716191291809082,10.829001426696777 C10.716191291809082,10.829001426696777 3.756195545196533,0 3.756195545196533,0 C3.756195545196533,0 0,0 0,0 C0,0 0,15.470022201538086 0,15.470022201538086 C0,15.470022201538086 3.2038140296936035,15.470022201538086 3.2038140296936035,15.470022201538086 C3.2038140296936035,15.470022201538086 3.2038140296936035,4.6410064697265625 3.2038140296936035,4.6410064697265625 C3.2038140296936035,4.6410064697265625 10.163809776306152,15.470022201538086 10.163809776306152,15.470022201538086 C10.163809776306152,15.470022201538086 13.919991493225098,15.470022201538086 13.919991493225098,15.470022201538086 C13.919991493225098,15.470022201538086 13.919991493225098,0 13.919991493225098,0 C13.919991493225098,0 10.716191291809082,0 10.716191291809082,0 C10.716191291809082,0 10.716191291809082,10.829001426696777 10.716191291809082,10.829001426696777 C10.716191291809082,10.829001426696777 10.716191291809082,10.829001426696777 10.716191291809082,10.829001426696777z%27/%3E%3Cpath transform=%27translate(34.869998931884766,0.27000001072883606)%27 d=%27 M0,2.983504056930542 C0,2.983504056930542 5.19273567199707,2.983504056930542 5.19273567199707,2.983504056930542 C5.19273567199707,2.983504056930542 5.19273567199707,15.470022201538086 5.19273567199707,15.470022201538086 C5.19273567199707,15.470022201538086 8.507256507873535,15.470022201538086 8.507256507873535,15.470022201538086 C8.507256507873535,15.470022201538086 8.507256507873535,2.983504056930542 8.507256507873535,2.983504056930542 C8.507256507873535,2.983504056930542 13.700006484985352,2.983504056930542 13.700006484985352,2.983504056930542 C13.700006484985352,2.983504056930542 13.700006484985352,0 13.700006484985352,0 C13.700006484985352,0 0,0 0,0 C0,0 0,2.983504056930542 0,2.983504056930542 C0,2.983504056930542 0,2.983504056930542 0,2.983504056930542z%27/%3E%3Cpath transform=%27translate(51.22999954223633,0.27000001072883606)%27 d=%27 M10.605714797973633,6.165900230407715 C10.605714797973633,6.165900230407715 3.3142902851104736,6.165900230407715 3.3142902851104736,6.165900230407715 C3.3142902851104736,6.165900230407715 3.3142902851104736,0 3.3142902851104736,0 C3.3142902851104736,0 0,0 0,0 C0,0 0,15.470022201538086 0,15.470022201538086 C0,15.470022201538086 3.3142902851104736,15.470022201538086 3.3142902851104736,15.470022201538086 C3.3142902851104736,15.470022201538086 3.3142902851104736,9.149404525756836 3.3142902851104736,9.149404525756836 C3.3142902851104736,9.149404525756836 10.605714797973633,9.149404525756836 10.605714797973633,9.149404525756836 C10.605714797973633,9.149404525756836 10.605714797973633,15.470022201538086 10.605714797973633,15.470022201538086 C10.605714797973633,15.470022201538086 13.919991493225098,15.470022201538086 13.919991493225098,15.470022201538086 C13.919991493225098,15.470022201538086 13.919991493225098,0 13.919991493225098,0 C13.919991493225098,0 10.605714797973633,0 10.605714797973633,0 C10.605714797973633,0 10.605714797973633,6.165900230407715 10.605714797973633,6.165900230407715 C10.605714797973633,6.165900230407715 10.605714797973633,6.165900230407715 10.605714797973633,6.165900230407715z%27/%3E%3Cpath transform=%27translate(69.23999786376953,0.27000001072883606)%27 d=%27 M3.3151700496673584,2.983504056930542 C3.3151700496673584,2.983504056930542 7.403865814208984,2.983504056930542 7.403865814208984,2.983504056930542 C9.03934097290039,2.983504056930542 9.901290893554688,3.5801939964294434 9.901290893554688,4.707304000854492 C9.901290893554688,5.834399700164795 9.03934097290039,6.431103706359863 7.403865814208984,6.431103706359863 C7.403865814208984,6.431103706359863 3.3151700496673584,6.431103706359863 3.3151700496673584,6.431103706359863 C3.3151700496673584,6.431103706359863 3.3151700496673584,2.983504056930542 3.3151700496673584,2.983504056930542 C3.3151700496673584,2.983504056930542 3.3151700496673584,2.983504056930542 3.3151700496673584,2.983504056930542z M13.216461181640625,4.707304000854492 C13.216461181640625,1.7900969982147217 11.072648048400879,0 7.558576583862305,0 C7.558576583862305,0 0,0 0,0 C0,0 0,15.470022201538086 0,15.470022201538086 C0,15.470022201538086 3.3151700496673584,15.470022201538086 3.3151700496673584,15.470022201538086 C3.3151700496673584,15.470022201538086 3.3151700496673584,9.414593696594238 3.3151700496673584,9.414593696594238 C3.3151700496673584,9.414593696594238 7.005825519561768,9.414593696594238 7.005825519561768,9.414593696594238 C7.005825519561768,9.414593696594238 10.321218490600586,15.470022201538086 10.321218490600586,15.470022201538086 C10.321218490600586,15.470022201538086 13.990056991577148,15.470022201538086 13.990056991577148,15.470022201538086 C13.990056991577148,15.470022201538086 10.319005966186523,8.953378677368164 10.319005966186523,8.953378677368164 C12.161579132080078,8.245061874389648 13.216461181640625,6.753532409667969 13.216461181640625,4.707304000854492 C13.216461181640625,4.707304000854492 13.216461181640625,4.707304000854492 13.216461181640625,4.707304000854492z%27/%3E%3Cpath transform=%27translate(84.98999786376953,0)%27 d=%27 M7.622087478637695,12.906073570251465 C5.015110492706299,12.906073570251465 3.4244225025177,11.049725532531738 3.4244225025177,8.022093772888184 C3.4244225025177,4.95027494430542 5.015110492706299,3.0939269065856934 7.622087478637695,3.0939269065856934 C10.206976890563965,3.0939269065856934 11.775577545166016,4.95027494430542 11.775577545166016,8.022093772888184 C11.775577545166016,11.049725532531738 10.206976890563965,12.906073570251465 7.622087478637695,12.906073570251465 C7.622087478637695,12.906073570251465 7.622087478637695,12.906073570251465 7.622087478637695,12.906073570251465z M7.622087478637695,0 C3.1593029499053955,0 0,3.3149218559265137 0,8.022093772888184 C0,12.685078620910645 3.1593029499053955,16 7.622087478637695,16 C12.062784194946289,16 15.200028419494629,12.685078620910645 15.200028419494629,8.022093772888184 C15.200028419494629,3.3149218559265137 12.062784194946289,0 7.622087478637695,0 C7.622087478637695,0 7.622087478637695,0 7.622087478637695,0z%27/%3E%3Cpath transform=%27translate(103.29000091552734,0.27000001072883606)%27 d=%27 M7.405848026275635,6.873104095458984 C7.405848026275635,6.873104095458984 3.3160574436187744,6.873104095458984 3.3160574436187744,6.873104095458984 C3.3160574436187744,6.873104095458984 3.3160574436187744,2.983504056930542 3.3160574436187744,2.983504056930542 C3.3160574436187744,2.983504056930542 7.405848026275635,2.983504056930542 7.405848026275635,2.983504056930542 C9.04176139831543,2.983504056930542 9.90394115447998,3.646505117416382 9.90394115447998,4.928304195404053 C9.90394115447998,6.2101030349731445 9.04176139831543,6.873104095458984 7.405848026275635,6.873104095458984 C7.405848026275635,6.873104095458984 7.405848026275635,6.873104095458984 7.405848026275635,6.873104095458984z M7.5605998039245605,0 C7.5605998039245605,0 0,0 0,0 C0,0 0,15.470022201538086 0,15.470022201538086 C0,15.470022201538086 3.3160574436187744,15.470022201538086 3.3160574436187744,15.470022201538086 C3.3160574436187744,15.470022201538086 3.3160574436187744,9.85659408569336 3.3160574436187744,9.85659408569336 C3.3160574436187744,9.85659408569336 7.5605998039245605,9.85659408569336 7.5605998039245605,9.85659408569336 C11.07561206817627,9.85659408569336 13.219999313354492,8.000200271606445 13.219999313354492,4.928304195404053 C13.219999313354492,1.8563942909240723 11.07561206817627,0 7.5605998039245605,0 C7.5605998039245605,0 7.5605998039245605,0 7.5605998039245605,0z%27/%3E%3Cpath transform=%27translate(128.0399932861328,0)%27 d=%27 M10.914844512939453,10.5414400100708 C10.340370178222656,12.044201850891113 9.191434860229492,12.906073570251465 7.622706890106201,12.906073570251465 C5.0155181884765625,12.906073570251465 3.4246866703033447,11.049725532531738 3.4246866703033447,8.022093772888184 C3.4246866703033447,4.95027494430542 5.0155181884765625,3.0939269065856934 7.622706890106201,3.0939269065856934 C9.191434860229492,3.0939269065856934 10.340370178222656,3.9557981491088867 10.914844512939453,5.458559989929199 C10.914844512939453,5.458559989929199 14.427860260009766,5.458559989929199 14.427860260009766,5.458559989929199 C13.566211700439453,2.1436522006988525 10.981111526489258,0 7.622706890106201,0 C3.1595458984375,0 0,3.3149218559265137 0,8.022093772888184 C0,12.685078620910645 3.1595458984375,16 7.622706890106201,16 C11.003214836120605,16 13.588300704956055,13.834254264831543 14.449976921081543,10.5414400100708 C14.449976921081543,10.5414400100708 10.914844512939453,10.5414400100708 10.914844512939453,10.5414400100708 C10.914844512939453,10.5414400100708 10.914844512939453,10.5414400100708 10.914844512939453,10.5414400100708z%27/%3E%3Cpath transform=%27translate(117.83000183105469,0.27000001072883606)%27 d=%27 M0,0 C0,0 6.1677093505859375,15.470022201538086 6.1677093505859375,15.470022201538086 C6.1677093505859375,15.470022201538086 9.550004005432129,15.470022201538086 9.550004005432129,15.470022201538086 C9.550004005432129,15.470022201538086 3.382294178009033,0 3.382294178009033,0 C3.382294178009033,0 0,0 0,0 C0,0 0,0 0,0z%27/%3E%3Cpath transform=%27translate(0,0.27000001072883606)%27 d=%27 M5.824605464935303,9.348296165466309 C5.824605464935303,9.348296165466309 7.93500280380249,3.911694288253784 7.93500280380249,3.911694288253784 C7.93500280380249,3.911694288253784 10.045400619506836,9.348296165466309 10.045400619506836,9.348296165466309 C10.045400619506836,9.348296165466309 5.824605464935303,9.348296165466309 5.824605464935303,9.348296165466309 C5.824605464935303,9.348296165466309 5.824605464935303,9.348296165466309 5.824605464935303,9.348296165466309z M6.166755199432373,0 C6.166755199432373,0 0,15.470022201538086 0,15.470022201538086 C0,15.470022201538086 3.4480772018432617,15.470022201538086 3.4480772018432617,15.470022201538086 C3.4480772018432617,15.470022201538086 4.709278583526611,12.22130012512207 4.709278583526611,12.22130012512207 C4.709278583526611,12.22130012512207 11.16093635559082,12.22130012512207 11.16093635559082,12.22130012512207 C11.16093635559082,12.22130012512207 12.421928405761719,15.470022201538086 12.421928405761719,15.470022201538086 C12.421928405761719,15.470022201538086 15.87000560760498,15.470022201538086 15.87000560760498,15.470022201538086 C15.87000560760498,15.470022201538086 9.703250885009766,0 9.703250885009766,0 C9.703250885009766,0 6.166755199432373,0 6.166755199432373,0 C6.166755199432373,0 6.166755199432373,0 6.166755199432373,0z%27/%3E%3C/svg%3E\")"
218
-
219
168
 
220
169
  var SANS = "'Anthropic Sans Web Text','Noto Sans SC','Source Han Sans SC',-apple-system,BlinkMacSystemFont,'Segoe UI','PingFang SC','Hiragino Sans GB','Microsoft YaHei','Helvetica Neue',Helvetica,Arial,sans-serif"
221
170
  var SERIF = "'Anthropic Serif Web Text',Georgia,'Times New Roman','Noto Serif SC','Source Han Serif SC','Songti SC','SimSun',serif"
@@ -226,18 +175,35 @@ window.__ModuleLoader__.load({
226
175
  // ============================================================================
227
176
  var CSS = [
228
177
  "/* --- 2.1 Design Tokens (Dark Base & Light Overrides) --- */",
229
- "/* ---------- design tokens: warm-black (dark) base ---------- */",
178
+ "/* ---------- typography tokens: theme-independent ---------- */",
230
179
  "body[data-dsh-claude-style] {",
231
180
  " --dsw-font-family: 'Anthropic Sans Web Text','Noto Sans SC','Source Han Sans SC',-apple-system,BlinkMacSystemFont,'Segoe UI','PingFang SC','Hiragino Sans GB','Microsoft YaHei','Helvetica Neue',Helvetica,Arial,sans-serif;",
232
181
  " --dsw-font-serif: 'Anthropic Serif Web Text',Georgia,'Times New Roman','Noto Serif SC','Source Han Serif SC','Songti SC','SimSun',serif;",
233
182
  " --dsw-font-code: 'Anthropic Mono Variable',ui-monospace,'SF Mono','JetBrains Mono','Fira Code',Consolas,'Liberation Mono',Menlo,Courier,monospace;",
234
- " --dsw-font-markdown-h1-font-family: var(--dsw-font-serif);",
235
- " --dsw-font-markdown-h2-font-family: var(--dsw-font-serif);",
236
- " --dsw-font-markdown-h3-font-family: var(--dsw-font-serif);",
237
- " --dsw-font-markdown-h4-font-family: var(--dsw-font-serif);",
183
+ " /* Markdown document headings keep the UI sans at 700 — the face the host",
184
+ " ships and the one Claude uses. The host's markdown heading rule is a",
185
+ " `font:` shorthand (`--dsw-font-markdown-hN`) that names --dsw-font-family",
186
+ " directly, so overriding the four `-font-family` sub-tokens never reached",
187
+ " the page; these re-declare the shorthand itself. The ladder is steepened",
188
+ " from the host's 21/19/18 toward Claude's measured ≈21/17/15; h1 and h4",
189
+ " keep the host's values. */",
190
+ " --dsw-font-markdown-h2: 700 calc(18px + var(--dsh-content-font-delta)) / calc(26px + var(--dsh-content-font-delta)) var(--dsw-font-family);",
191
+ " --dsw-font-markdown-h3: 700 calc(16px + var(--dsh-content-font-delta)) / calc(24px + var(--dsh-content-font-delta)) var(--dsw-font-family);",
238
192
  " --dsw-font-markdown-base-font-family: var(--dsw-font-family);",
239
193
  " --dsw-font-markdown-small-font-family: var(--dsw-font-family);",
240
194
  " --dsw-font-markdown-table-font-family: var(--dsw-font-family);",
195
+ "}",
196
+ "",
197
+ "/* ---------- design tokens: warm-black (dark) palette ---------- */",
198
+ "/* The dark palette is scoped to [data-ds-dark-theme] on purpose. The host",
199
+ " ships its own dark palette on body[data-ds-dark-theme] — the same (0,1,1)",
200
+ " weight as a bare body[data-dsh-claude-style] — so the two only tie, and",
201
+ " whichever stylesheet the loader appends last wins. When the host's lands",
202
+ " after this one its blue accents (--dsw-alias-state-business-primary,",
203
+ " --dsw-alias-button-info-fill, --dsw-alias-link and the brand \"new color\")",
204
+ " replace the warm palette. Naming the attribute keeps this block at (0,2,1)",
205
+ " and makes it order-independent. */",
206
+ "body[data-dsh-claude-style][data-ds-dark-theme] {",
241
207
  " --dsw-alias-bg-base: #141413;",
242
208
  " --dsw-alias-bg-layer-1: #1c1b1a;",
243
209
  " --dsw-alias-bg-layer-2: #242320;",
@@ -264,10 +230,14 @@ window.__ModuleLoader__.load({
264
230
  " --dsw-alias-label-caption: #6b6a65;",
265
231
  " --dsw-alias-state-business-primary: #d97757;",
266
232
  " --dsw-alias-state-business-tertiary: #3a2a22;",
233
+ " --dsw-alias-link: #e08a6d;",
267
234
  " --dsw-shadow-lv2: 0 4px 16px rgba(0, 0, 0, 0.30), 0 1px 3px rgba(0, 0, 0, 0.14);",
268
235
  " --dsw-specific-input-major: #0f0e0d;",
269
236
  " --dsw-specific-selector: #2e2c29;",
270
237
  " --dsw-specific-sidebar-fill: #141413;",
238
+ " /* The host's \"new color\" brand accent (shipped under this doubled suffix)",
239
+ " resolves to a deepseek blue in both palettes; the skin has one accent. */",
240
+ " --dsw-alias-brand-primary-new-colorprimary-new-color: #d97757;",
271
241
  "}",
272
242
  "",
273
243
  "/* ================= light variant: ivory editorial ================= */",
@@ -292,6 +262,7 @@ window.__ModuleLoader__.load({
292
262
  " --dsw-alias-label-caption: #a6a094;",
293
263
  " --dsw-alias-state-business-primary: #d97757;",
294
264
  " --dsw-alias-state-business-tertiary: #e9dfd2;",
265
+ " --dsw-alias-link: #c6613f;",
295
266
  " --dsw-specific-input-major: #ffffff;",
296
267
  " --dsw-specific-menu: #ffffff;",
297
268
  " --dsw-specific-selector: #f0eee6;",
@@ -299,6 +270,16 @@ window.__ModuleLoader__.load({
299
270
  " --dsh-claude-hover-bg: rgba(0, 0, 0, 0.08);",
300
271
  " --dsw-alias-interactive-bg-hover: var(--dsh-claude-hover-bg);",
301
272
  " --dsw-shadow-lv2: 0 4px 18px rgba(20, 20, 19, 0.10), 0 1px 3px rgba(20, 20, 19, 0.05);",
273
+ " --dsw-alias-brand-primary-new-colorprimary-new-color: #d97757;",
274
+ " /* Carried over from the dark base block so the light palette stays complete",
275
+ " now that the dark palette is dark-scoped. */",
276
+ " --dsw-alias-brand-text: #faf9f5;",
277
+ " --dsw-alias-button-elevated-fill: #242320;",
278
+ " --dsw-alias-interactive-bg-active: rgba(217, 119, 87, 0.30);",
279
+ " --dsw-alias-interactive-bg-hover-solid: #2e2c29;",
280
+ " /* User message bubbles: the host's light bubble token is deepseek-50 (blue);",
281
+ " use the skin's button-hover gray instead. */",
282
+ " --dsw-specific-bubble: var(--dsh-claude-hover-bg);",
302
283
  "}",
303
284
  "",
304
285
  "body[data-dsh-claude-style]:not([data-ds-dark-theme]) {",
@@ -344,8 +325,8 @@ window.__ModuleLoader__.load({
344
325
  "",
345
326
  "body[data-dsh-claude-style]:not([data-ds-dark-theme]) blockquote {",
346
327
  " color: #6e6a60;",
347
- " border-left-color: #c6613f;",
348
- " background: rgba(198, 97, 63, 0.05);",
328
+ " border-left-color: var(--dsw-alias-label-caption);",
329
+ " background: rgba(20, 20, 19, 0.04);",
349
330
  "}",
350
331
  "",
351
332
  "body[data-dsh-claude-style]:not([data-ds-dark-theme]) pre {",
@@ -399,6 +380,35 @@ window.__ModuleLoader__.load({
399
380
  " letter-spacing: -0.015em;",
400
381
  "}",
401
382
  "",
383
+ "/* ---------- markdown document headings ---------- */",
384
+ "/* The serif display face above is for UI headlines. Document headings are body",
385
+ " text: re-assert the host's own markdown heading shorthand (sans, 700) at a",
386
+ " weight that beats that rule, so the host's size ladder and line-heights",
387
+ " apply untouched. */",
388
+ "body[data-dsh-claude-style] [class*=\"markdown\"] h1 { font: var(--dsw-font-markdown-h1); }",
389
+ "body[data-dsh-claude-style] [class*=\"markdown\"] h2 { font: var(--dsw-font-markdown-h2); }",
390
+ "body[data-dsh-claude-style] [class*=\"markdown\"] h3 { font: var(--dsw-font-markdown-h3); }",
391
+ "body[data-dsh-claude-style] [class*=\"markdown\"] h4 { font: var(--dsw-font-markdown-h4); }",
392
+ "",
393
+ "/* Heading rhythm. The host gives every heading a 32px top margin, which stacks",
394
+ " on the previous heading's 16px bottom margin: two consecutive headings open",
395
+ " ~36px of air where Claude keeps ~12px, and in the sample document that alone",
396
+ " pushed the last list past the viewport. A heading that directly follows",
397
+ " another tightens further, so a run of headings reads as one block. */",
398
+ "body[data-dsh-claude-style] [class*=\"markdown\"] :is(h1, h2, h3) {",
399
+ " margin-top: 24px;",
400
+ " margin-bottom: 12px;",
401
+ "}",
402
+ "",
403
+ "body[data-dsh-claude-style] [class*=\"markdown\"] :is(h1, h2, h3) + :is(h1, h2, h3) {",
404
+ " margin-top: 8px;",
405
+ "}",
406
+ "",
407
+ "body[data-dsh-claude-style] [class*=\"markdown\"] :is(h4, h5, h6) {",
408
+ " margin-top: 16px;",
409
+ " margin-bottom: 8px;",
410
+ "}",
411
+ "",
402
412
  "body[data-dsh-claude-style] :is(pre, code, kbd, samp, [class*=\"mono\"], [class*=\"codeBlock\"], [class*=\"CodeBlock\"]) {",
403
413
  " font-family: var(--dsw-font-code);",
404
414
  "}",
@@ -410,12 +420,14 @@ window.__ModuleLoader__.load({
410
420
  "}",
411
421
  "",
412
422
  "/* ---------- editorial markdown ---------- */",
423
+ "/* Claude's quote keeps the serif face but stands upright on a neutral bar and",
424
+ " wash; the warm accent stays reserved for links and controls. */",
413
425
  "body[data-dsh-claude-style] blockquote {",
414
426
  " font-family: var(--dsw-font-serif);",
415
- " font-style: italic;",
427
+ " font-style: normal;",
416
428
  " color: #b0aea5;",
417
- " border-left: 2px solid #d97757;",
418
- " background: rgba(217, 119, 87, 0.06);",
429
+ " border-left: 2px solid var(--dsw-alias-label-caption);",
430
+ " background: rgba(250, 249, 245, 0.06);",
419
431
  " border-radius: 0 8px 8px 0;",
420
432
  " padding: 0.6em 1em;",
421
433
  "}",
@@ -579,14 +591,15 @@ window.__ModuleLoader__.load({
579
591
  "}",
580
592
  "",
581
593
  "/* Keyboard focus ring: neutral, in the input box's own shadow colour",
582
- " (espresso #141413 in light, black in dark) instead of the clay accent. */",
594
+ " (espresso #141413 in light); dark inverts to bright ivory — a near-black",
595
+ " canvas gets a light ring, never a darker one. */",
583
596
  "body[data-dsh-claude-style] :is(button, input, textarea, select, [role=\"button\"], [role=\"tab\"], [role=\"treeitem\"]):focus-visible {",
584
597
  " outline: 2px solid rgba(20, 20, 19, 0.45);",
585
598
  " outline-offset: 1px;",
586
599
  "}",
587
600
  "",
588
601
  "body[data-dsh-claude-style][data-ds-dark-theme] :is(button, input, textarea, select, [role=\"button\"], [role=\"tab\"], [role=\"treeitem\"]):focus-visible {",
589
- " outline-color: rgba(0, 0, 0, 0.45);",
602
+ " outline-color: rgba(250, 249, 245, 0.60);",
590
603
  "}",
591
604
  "",
592
605
  "/* ---------- Claude Code layout: hero brand mark ---------- */",
@@ -618,7 +631,7 @@ window.__ModuleLoader__.load({
618
631
  "}",
619
632
  "",
620
633
  "body[data-dsh-claude-style][data-dsh-claude-brand=\"anthropic\"] [class*=\"fishHitbox\"]::before {",
621
- " background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z' fill='%23D97757'/%3E%3C/svg%3E\");",
634
+ " background-image: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2024%2024'%3E%3Cpath%20d%3D'M4.709%2015.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0%2011.784l.055-.352.48-.321.686.06%201.52.103%202.278.158%201.652.097%202.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686%201.908%201.476%202.491%201.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97%202.97%200%2001-.104-.729L6.283.134%206.696%200l.996.134.42.364.62%201.414%201.002%202.229%201.555%203.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286%201.851-.559%202.903-.364%201.942h.212l.243-.242.985-1.306%201.652-2.064.73-.82.85-.904.547-.431h1.033l.76%201.129-.34%201.166-1.064%201.347-.881%201.142-1.264%201.7-.79%201.36.073.11.188-.02%202.856-.606%201.543-.28%201.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061%201.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093%201.068%202.006%201.81%202.509%202.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649%202.345%203.521.122%201.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674%207.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434%201.967-2.18%202.945-1.726%201.845-.414.164-.717-.37.067-.662.401-.589%202.388-3.036%201.44-1.882.93-1.086-.006-.158h-.055L4.132%2018.56l-1.13.146-.487-.456.061-.746.231-.243%201.908-1.312-.006.006z'%20fill%3D'%23D97757'%2F%3E%3C%2Fsvg%3E\");",
622
635
  "}",
623
636
  "",
624
637
  "/* The preview badge has no Claude Code counterpart. */",
@@ -682,18 +695,20 @@ window.__ModuleLoader__.load({
682
695
  "",
683
696
  "/* Focus: the shipped field has no focus face at all — only the caret moves —",
684
697
  " so this adds one, in the input box's own shadow colour rather than the",
685
- " accent: the hairline takes the drop-shadow tint (espresso in light, black",
686
- " in dark), a 1px halo in the same tone hugs the edge, and the drop shadow",
687
- " deepens. The tray below continues the same hairline, so its three edges",
688
- " follow whenever the card above it holds focus. */",
698
+ " accent: the hairline takes the drop-shadow tint (espresso in light), a 1px",
699
+ " halo in the same tone hugs the edge, and the drop shadow deepens. Dark sits",
700
+ " on a near-black canvas, where black-on-black carries no cue at all — there",
701
+ " the focus face inverts to a BRIGHT ivory rim and halo, so the field visibly",
702
+ " lights up instead of deepening. The tray below continues the same hairline,",
703
+ " so its three edges follow whenever the card above it holds focus. */",
689
704
  "body[data-dsh-claude-style]:not([data-ds-dark-theme]) [data-composer-card]:focus-within {",
690
705
  " border-color: rgba(20, 20, 19, 0.36);",
691
706
  " box-shadow: 0 0 0 1px rgba(20, 20, 19, 0.13), 0 6px 18px rgba(20, 20, 19, 0.06), 0 2px 6px rgba(20, 20, 19, 0.03);",
692
707
  "}",
693
708
  "",
694
709
  "body[data-dsh-claude-style][data-ds-dark-theme] [data-composer-card]:focus-within {",
695
- " border-color: rgba(0, 0, 0, 0.38);",
696
- " box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.18), 0 6px 20px rgba(0, 0, 0, 0.27);",
710
+ " border-color: rgba(250, 249, 245, 0.45);",
711
+ " box-shadow: 0 0 0 1px rgba(250, 249, 245, 0.18), 0 6px 24px rgba(0, 0, 0, 0.45), 0 2px 8px rgba(0, 0, 0, 0.22);",
697
712
  "}",
698
713
  "",
699
714
  "body[data-dsh-claude-style]:not([data-ds-dark-theme]) [class*=\"composerStack\"]:has([data-composer-card]:focus-within) > [class*=\"heroWorkspaceRow\"] {",
@@ -701,7 +716,7 @@ window.__ModuleLoader__.load({
701
716
  "}",
702
717
  "",
703
718
  "body[data-dsh-claude-style][data-ds-dark-theme] [class*=\"composerStack\"]:has([data-composer-card]:focus-within) > [class*=\"heroWorkspaceRow\"] {",
704
- " border-color: rgba(0, 0, 0, 0.38);",
719
+ " border-color: rgba(250, 249, 245, 0.45);",
705
720
  "}",
706
721
  "",
707
722
  "/* The workspace-trigger variant paints its dashed ring through a masked svg",
@@ -859,6 +874,14 @@ window.__ModuleLoader__.load({
859
874
  " height: auto !important;",
860
875
  " max-height: none !important;",
861
876
  "}",
877
+ "/* The composer is a chat-view affordance. The host keeps the seat mounted on",
878
+ " every conversation tab (轨迹 / 上下文 even reserve room for it), but it",
879
+ " should only show on the chat tab — drop the whole bottom area otherwise.",
880
+ " Hiding the seat also zeroes the host's --dsh-composer-height, so the",
881
+ " trajectory ledger's bottom clearance collapses with it. */",
882
+ "body[data-dsh-claude-style][data-dsh-claude-composer-hidden] [data-composer-seat] {",
883
+ " display: none !important;",
884
+ "}",
862
885
  "body[data-dsh-claude-style] [data-composer-card][data-composer-variant=\"inline\"]:not([data-has-attachments=\"true\"]) [class*=\"rail\"]:not([class*=\"trailing\"]),",
863
886
  "body[data-dsh-claude-style] [class*=\"composerStack\"]:not(:has([class*=\"heroWorkspaceRow\"])) [data-composer-card]:not([data-has-attachments=\"true\"]) [class*=\"rail\"]:not([class*=\"trailing\"]) {",
864
887
  " display: none !important;",
@@ -889,8 +912,8 @@ window.__ModuleLoader__.load({
889
912
  "}",
890
913
  "body[data-dsh-claude-style][data-ds-dark-theme] [data-composer-card][data-composer-variant=\"inline\"]:focus-within [class*=\"rail\"]:not([class*=\"trailing\"]),",
891
914
  "body[data-dsh-claude-style][data-ds-dark-theme] [class*=\"composerStack\"]:not(:has([class*=\"heroWorkspaceRow\"])) [data-composer-card]:focus-within [class*=\"rail\"]:not([class*=\"trailing\"]) {",
892
- " border-color: rgba(0, 0, 0, 0.38) !important;",
893
- " box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.18), 0 4px 14px rgba(0, 0, 0, 0.27) !important;",
915
+ " border-color: rgba(250, 249, 245, 0.45) !important;",
916
+ " box-shadow: 0 0 0 1px rgba(250, 249, 245, 0.18), 0 4px 16px rgba(0, 0, 0, 0.40) !important;",
894
917
  "}",
895
918
  "/* The attachment rail nests two levels: ComposerAttachments' outer rail wraps",
896
919
  " AttachmentRail's scrolling inner rail, and BOTH substring-match",
@@ -930,8 +953,14 @@ window.__ModuleLoader__.load({
930
953
  "body[data-dsh-claude-style] [class*=\"composerStack\"]:not(:has([class*=\"heroWorkspaceRow\"])) [data-composer-card][data-has-attachments=\"true\"] [data-input-scroll] {",
931
954
  " border-top: none !important;",
932
955
  " border-radius: 0 0 14px 14px !important;",
956
+ " /* The card is a flex column with an 8px gap; with attachments that gap",
957
+ " shows the canvas as a seam line between the thumbnails and the text.",
958
+ " Close it (negative margin pulls the input up onto the rail) and move the",
959
+ " 8px into the top padding, so the text keeps its distance from the",
960
+ " thumbnails and the card's total height is unchanged. */",
961
+ " margin-top: -8px !important;",
933
962
  " min-height: 32px !important;",
934
- " padding: 2px 36px 6px 14px !important;",
963
+ " padding: 10px 36px 6px 14px !important;",
935
964
  "}",
936
965
  "body[data-dsh-claude-style]:not([data-ds-dark-theme]) [data-composer-card][data-composer-variant=\"inline\"] [data-input-scroll],",
937
966
  "body[data-dsh-claude-style]:not([data-ds-dark-theme]) [class*=\"composerStack\"]:not(:has([class*=\"heroWorkspaceRow\"])) [data-composer-card] [data-input-scroll] {",
@@ -946,8 +975,19 @@ window.__ModuleLoader__.load({
946
975
  "}",
947
976
  "body[data-dsh-claude-style][data-ds-dark-theme] [data-composer-card][data-composer-variant=\"inline\"]:focus-within [data-input-scroll],",
948
977
  "body[data-dsh-claude-style][data-ds-dark-theme] [class*=\"composerStack\"]:not(:has([class*=\"heroWorkspaceRow\"])) [data-composer-card]:focus-within [data-input-scroll] {",
949
- " border-color: rgba(0, 0, 0, 0.38) !important;",
950
- " box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.18), 0 4px 14px rgba(0, 0, 0, 0.27) !important;",
978
+ " border-color: rgba(250, 249, 245, 0.45) !important;",
979
+ " box-shadow: 0 0 0 1px rgba(250, 249, 245, 0.18), 0 4px 16px rgba(0, 0, 0, 0.40) !important;",
980
+ "}",
981
+ "/* With attachments the rail already carries the card's focus ring, so the",
982
+ " input keeps only the deepened drop — its own 1px ring would paint a second",
983
+ " line across the seam between the thumbnails and the text. */",
984
+ "body[data-dsh-claude-style]:not([data-ds-dark-theme]) [data-composer-card][data-composer-variant=\"inline\"][data-has-attachments=\"true\"]:focus-within [data-input-scroll],",
985
+ "body[data-dsh-claude-style]:not([data-ds-dark-theme]) [class*=\"composerStack\"]:not(:has([class*=\"heroWorkspaceRow\"])) [data-composer-card][data-has-attachments=\"true\"]:focus-within [data-input-scroll] {",
986
+ " box-shadow: 0 4px 12px rgba(20, 20, 19, 0.05) !important;",
987
+ "}",
988
+ "body[data-dsh-claude-style][data-ds-dark-theme] [data-composer-card][data-composer-variant=\"inline\"][data-has-attachments=\"true\"]:focus-within [data-input-scroll],",
989
+ "body[data-dsh-claude-style][data-ds-dark-theme] [class*=\"composerStack\"]:not(:has([class*=\"heroWorkspaceRow\"])) [data-composer-card][data-has-attachments=\"true\"]:focus-within [data-input-scroll] {",
990
+ " box-shadow: 0 4px 16px rgba(0, 0, 0, 0.40) !important;",
951
991
  "}",
952
992
  "body[data-dsh-claude-style] [data-composer-card][data-composer-variant=\"inline\"] [data-input-scroll] [class*=\"grow\"],",
953
993
  "body[data-dsh-claude-style] [class*=\"composerStack\"]:not(:has([class*=\"heroWorkspaceRow\"])) [data-composer-card] [data-input-scroll] [class*=\"grow\"] {",
@@ -1186,7 +1226,60 @@ window.__ModuleLoader__.load({
1186
1226
  " background: var(--dsh-claude-hover-bg, rgba(0, 0, 0, 0.06)) !important;",
1187
1227
  " color: var(--dsw-alias-label-primary) !important;",
1188
1228
  "}",
1189
- "/* Separate Token stats row below the composer card */",
1229
+ "/* The skin's own model trigger replaces the host's model seat (the host's",
1230
+ " root is marked and hidden by syncModelControl). One button, one hover",
1231
+ " background — the shipped seat stacks an icon + label + effort + chevron,",
1232
+ " each with its own surface. */",
1233
+ "body[data-dsh-claude-style] [data-dsh-claude-model-host] {",
1234
+ " display: none !important;",
1235
+ "}",
1236
+ "body[data-dsh-claude-style] [class*=\"trailing\"] .dsh-claude-model-btn {",
1237
+ " display: inline-flex !important;",
1238
+ " align-items: center !important;",
1239
+ " gap: 2px !important;",
1240
+ " height: 28px !important;",
1241
+ " max-width: 280px !important;",
1242
+ " padding: 0 6px 0 8px !important;",
1243
+ " border: none !important;",
1244
+ " border-radius: 7px !important;",
1245
+ " background: transparent !important;",
1246
+ " color: var(--dsw-alias-label-secondary) !important;",
1247
+ " font-size: 13px !important;",
1248
+ " font-weight: 500 !important;",
1249
+ " line-height: 20px !important;",
1250
+ " cursor: pointer !important;",
1251
+ " box-sizing: border-box !important;",
1252
+ " min-width: 0 !important;",
1253
+ "}",
1254
+ "body[data-dsh-claude-style] [class*=\"trailing\"] .dsh-claude-model-btn-label.dsh-claude-model-btn-loading {",
1255
+ " color: var(--dsw-alias-label-caption, #a6a094) !important;",
1256
+ "}",
1257
+ "body[data-dsh-claude-style] [class*=\"trailing\"] .dsh-claude-model-btn:hover {",
1258
+ " background: var(--dsh-claude-hover-bg, rgba(0, 0, 0, 0.08)) !important;",
1259
+ " color: var(--dsw-alias-label-primary) !important;",
1260
+ "}",
1261
+ "body[data-dsh-claude-style] [class*=\"trailing\"] .dsh-claude-model-btn-label {",
1262
+ " text-overflow: ellipsis !important;",
1263
+ " white-space: nowrap !important;",
1264
+ " min-width: 0 !important;",
1265
+ " overflow: hidden !important;",
1266
+ "}",
1267
+ "body[data-dsh-claude-style] [class*=\"trailing\"] .dsh-claude-model-btn-effort {",
1268
+ " flex: none !important;",
1269
+ " color: var(--dsw-alias-label-caption, #a6a094) !important;",
1270
+ " font-weight: 400 !important;",
1271
+ "}",
1272
+ "body[data-dsh-claude-style] [class*=\"trailing\"] .dsh-claude-model-btn-chevron {",
1273
+ " flex: none !important;",
1274
+ " display: inline-flex !important;",
1275
+ " align-items: center !important;",
1276
+ " color: var(--dsw-alias-label-caption, #a6a094) !important;",
1277
+ "}",
1278
+ "/* Token stats pills — merged into the toolbar row (one line with the",
1279
+ " controls). The base rule below is the fallback for the host's own",
1280
+ " position (a full-width line under the card); once mergeStatsIntoRow()",
1281
+ " has moved the pills into the row, the override after it resets every",
1282
+ " geometry property the host's full-width line depends on. */",
1190
1283
  "body[data-dsh-claude-style] [data-composer-card][data-composer-variant=\"inline\"] ~ [data-composer-stats],",
1191
1284
  "body[data-dsh-claude-style] [class*=\"composerStack\"]:not(:has([class*=\"heroWorkspaceRow\"])) [data-composer-stats] {",
1192
1285
  " display: flex !important;",
@@ -1206,6 +1299,37 @@ window.__ModuleLoader__.load({
1206
1299
  " white-space: nowrap !important;",
1207
1300
  " text-overflow: ellipsis !important;",
1208
1301
  "}",
1302
+ "/* In-row: the pills become an inline, shrinkable flex item between the left",
1303
+ " tool cluster and the trailing model/status group (the row's space-between",
1304
+ " centers them). Width, padding and margin come from the host's full-width",
1305
+ " line, so all of them are reset; the pills keep their own hover/click. */",
1306
+ "body[data-dsh-claude-style] [data-composer-card][data-composer-variant=\"inline\"] [class*=\"_row\"] [data-composer-stats],",
1307
+ "body[data-dsh-claude-style] [class*=\"composerStack\"]:not(:has([class*=\"heroWorkspaceRow\"])) [data-composer-card] [class*=\"_row\"] [data-composer-stats] {",
1308
+ " width: auto !important;",
1309
+ " max-width: none !important;",
1310
+ " margin: 0 8px !important;",
1311
+ " padding: 0 !important;",
1312
+ " height: auto !important;",
1313
+ " line-height: 20px !important;",
1314
+ " justify-content: flex-start !important;",
1315
+ " flex: 0 1 auto !important;",
1316
+ " min-width: 0 !important;",
1317
+ "}",
1318
+ "/* The stats pills are on-demand: hidden unless the chat window (the composer)",
1319
+ " is hovered, so the toolbar stays clean. Space is preserved — no reflow when",
1320
+ " they fade in — and because the pills live inside the card, hovering them",
1321
+ " keeps them visible long enough to click. */",
1322
+ "body[data-dsh-claude-style] [data-composer-card] [class*=\"_row\"] [data-composer-stats] {",
1323
+ " opacity: 0 !important;",
1324
+ " visibility: hidden !important;",
1325
+ " pointer-events: none !important;",
1326
+ " transition: opacity 0.15s ease, visibility 0.15s ease !important;",
1327
+ "}",
1328
+ "body[data-dsh-claude-style] [data-composer-card]:hover [class*=\"_row\"] [data-composer-stats] {",
1329
+ " opacity: 1 !important;",
1330
+ " visibility: visible !important;",
1331
+ " pointer-events: auto !important;",
1332
+ "}",
1209
1333
  "@media (max-width: 820px) {",
1210
1334
  " body[data-dsh-claude-style] [data-composer-card][data-composer-variant=\"inline\"] ~ [data-composer-stats],",
1211
1335
  " body[data-dsh-claude-style] [class*=\"composerStack\"]:not(:has([class*=\"heroWorkspaceRow\"])) [data-composer-stats] {",
@@ -1272,16 +1396,16 @@ window.__ModuleLoader__.load({
1272
1396
  "body[data-dsh-claude-style][data-dsh-claude-brand=\"anthropic\"] :is([class*=\"brandMark\"], [class*=\"railMark\"])::before {",
1273
1397
  " width: 25.9px;",
1274
1398
  " height: 18px;",
1275
- " -webkit-mask: url(\"data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 46 32%27%3E%3Cpath d=%27M32.73 0H25.7846L38.4499 32H45.3953L32.73 0Z%27/%3E%3Cpath d=%27M12.6653 0L0 32H7.08167L9.67193 25.28H22.9219L25.5122 32H32.5939L19.9286 0H12.6653ZM11.9626 19.3371L16.2969 8.09143L20.6313 19.3371H11.9626Z%27/%3E%3C/svg%3E\") center / contain no-repeat;",
1276
- " mask: url(\"data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 46 32%27%3E%3Cpath d=%27M32.73 0H25.7846L38.4499 32H45.3953L32.73 0Z%27/%3E%3Cpath d=%27M12.6653 0L0 32H7.08167L9.67193 25.28H22.9219L25.5122 32H32.5939L19.9286 0H12.6653ZM11.9626 19.3371L16.2969 8.09143L20.6313 19.3371H11.9626Z%27/%3E%3C/svg%3E\") center / contain no-repeat;",
1399
+ " -webkit-mask: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2046%2032'%3E%3Cpath%20d%3D'M32.73%200H25.7846L38.4499%2032H45.3953L32.73%200Z'%2F%3E%3Cpath%20d%3D'M12.6653%200L0%2032H7.08167L9.67193%2025.28H22.9219L25.5122%2032H32.5939L19.9286%200H12.6653ZM11.9626%2019.3371L16.2969%208.09143L20.6313%2019.3371H11.9626Z'%2F%3E%3C%2Fsvg%3E\") center / contain no-repeat;",
1400
+ " mask: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2046%2032'%3E%3Cpath%20d%3D'M32.73%200H25.7846L38.4499%2032H45.3953L32.73%200Z'%2F%3E%3Cpath%20d%3D'M12.6653%200L0%2032H7.08167L9.67193%2025.28H22.9219L25.5122%2032H32.5939L19.9286%200H12.6653ZM11.9626%2019.3371L16.2969%208.09143L20.6313%2019.3371H11.9626Z'%2F%3E%3C%2Fsvg%3E\") center / contain no-repeat;",
1277
1401
  "}",
1278
1402
  "",
1279
1403
  "body[data-dsh-claude-style][data-dsh-claude-brand=\"anthropic\"] [class*=\"brandIdentity\"] > [class*=\"brandName\"]::before {",
1280
1404
  " width: 160.9px;",
1281
1405
  " max-width: 100%;",
1282
1406
  " height: 18px;",
1283
- " -webkit-mask: url(\"data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 143 16%27%3E%3Cpath transform=%27translate(18.299999237060547,0.27000001072883606)%27 d=%27 M10.716191291809082,10.829001426696777 C10.716191291809082,10.829001426696777 3.756195545196533,0 3.756195545196533,0 C3.756195545196533,0 0,0 0,0 C0,0 0,15.470022201538086 0,15.470022201538086 C0,15.470022201538086 3.2038140296936035,15.470022201538086 3.2038140296936035,15.470022201538086 C3.2038140296936035,15.470022201538086 3.2038140296936035,4.6410064697265625 3.2038140296936035,4.6410064697265625 C3.2038140296936035,4.6410064697265625 10.163809776306152,15.470022201538086 10.163809776306152,15.470022201538086 C10.163809776306152,15.470022201538086 13.919991493225098,15.470022201538086 13.919991493225098,15.470022201538086 C13.919991493225098,15.470022201538086 13.919991493225098,0 13.919991493225098,0 C13.919991493225098,0 10.716191291809082,0 10.716191291809082,0 C10.716191291809082,0 10.716191291809082,10.829001426696777 10.716191291809082,10.829001426696777 C10.716191291809082,10.829001426696777 10.716191291809082,10.829001426696777 10.716191291809082,10.829001426696777z%27/%3E%3Cpath transform=%27translate(34.869998931884766,0.27000001072883606)%27 d=%27 M0,2.983504056930542 C0,2.983504056930542 5.19273567199707,2.983504056930542 5.19273567199707,2.983504056930542 C5.19273567199707,2.983504056930542 5.19273567199707,15.470022201538086 5.19273567199707,15.470022201538086 C5.19273567199707,15.470022201538086 8.507256507873535,15.470022201538086 8.507256507873535,15.470022201538086 C8.507256507873535,15.470022201538086 8.507256507873535,2.983504056930542 8.507256507873535,2.983504056930542 C8.507256507873535,2.983504056930542 13.700006484985352,2.983504056930542 13.700006484985352,2.983504056930542 C13.700006484985352,2.983504056930542 13.700006484985352,0 13.700006484985352,0 C13.700006484985352,0 0,0 0,0 C0,0 0,2.983504056930542 0,2.983504056930542 C0,2.983504056930542 0,2.983504056930542 0,2.983504056930542z%27/%3E%3Cpath transform=%27translate(51.22999954223633,0.27000001072883606)%27 d=%27 M10.605714797973633,6.165900230407715 C10.605714797973633,6.165900230407715 3.3142902851104736,6.165900230407715 3.3142902851104736,6.165900230407715 C3.3142902851104736,6.165900230407715 3.3142902851104736,0 3.3142902851104736,0 C3.3142902851104736,0 0,0 0,0 C0,0 0,15.470022201538086 0,15.470022201538086 C0,15.470022201538086 3.3142902851104736,15.470022201538086 3.3142902851104736,15.470022201538086 C3.3142902851104736,15.470022201538086 3.3142902851104736,9.149404525756836 3.3142902851104736,9.149404525756836 C3.3142902851104736,9.149404525756836 10.605714797973633,9.149404525756836 10.605714797973633,9.149404525756836 C10.605714797973633,9.149404525756836 10.605714797973633,15.470022201538086 10.605714797973633,15.470022201538086 C10.605714797973633,15.470022201538086 13.919991493225098,15.470022201538086 13.919991493225098,15.470022201538086 C13.919991493225098,15.470022201538086 13.919991493225098,0 13.919991493225098,0 C13.919991493225098,0 10.605714797973633,0 10.605714797973633,0 C10.605714797973633,0 10.605714797973633,6.165900230407715 10.605714797973633,6.165900230407715 C10.605714797973633,6.165900230407715 10.605714797973633,6.165900230407715 10.605714797973633,6.165900230407715z%27/%3E%3Cpath transform=%27translate(69.23999786376953,0.27000001072883606)%27 d=%27 M3.3151700496673584,2.983504056930542 C3.3151700496673584,2.983504056930542 7.403865814208984,2.983504056930542 7.403865814208984,2.983504056930542 C9.03934097290039,2.983504056930542 9.901290893554688,3.5801939964294434 9.901290893554688,4.707304000854492 C9.901290893554688,5.834399700164795 9.03934097290039,6.431103706359863 7.403865814208984,6.431103706359863 C7.403865814208984,6.431103706359863 3.3151700496673584,6.431103706359863 3.3151700496673584,6.431103706359863 C3.3151700496673584,6.431103706359863 3.3151700496673584,2.983504056930542 3.3151700496673584,2.983504056930542 C3.3151700496673584,2.983504056930542 3.3151700496673584,2.983504056930542 3.3151700496673584,2.983504056930542z M13.216461181640625,4.707304000854492 C13.216461181640625,1.7900969982147217 11.072648048400879,0 7.558576583862305,0 C7.558576583862305,0 0,0 0,0 C0,0 0,15.470022201538086 0,15.470022201538086 C0,15.470022201538086 3.3151700496673584,15.470022201538086 3.3151700496673584,15.470022201538086 C3.3151700496673584,15.470022201538086 3.3151700496673584,9.414593696594238 3.3151700496673584,9.414593696594238 C3.3151700496673584,9.414593696594238 7.005825519561768,9.414593696594238 7.005825519561768,9.414593696594238 C7.005825519561768,9.414593696594238 10.321218490600586,15.470022201538086 10.321218490600586,15.470022201538086 C10.321218490600586,15.470022201538086 13.990056991577148,15.470022201538086 13.990056991577148,15.470022201538086 C13.990056991577148,15.470022201538086 10.319005966186523,8.953378677368164 10.319005966186523,8.953378677368164 C12.161579132080078,8.245061874389648 13.216461181640625,6.753532409667969 13.216461181640625,4.707304000854492 C13.216461181640625,4.707304000854492 13.216461181640625,4.707304000854492 13.216461181640625,4.707304000854492z%27/%3E%3Cpath transform=%27translate(84.98999786376953,0)%27 d=%27 M7.622087478637695,12.906073570251465 C5.015110492706299,12.906073570251465 3.4244225025177,11.049725532531738 3.4244225025177,8.022093772888184 C3.4244225025177,4.95027494430542 5.015110492706299,3.0939269065856934 7.622087478637695,3.0939269065856934 C10.206976890563965,3.0939269065856934 11.775577545166016,4.95027494430542 11.775577545166016,8.022093772888184 C11.775577545166016,11.049725532531738 10.206976890563965,12.906073570251465 7.622087478637695,12.906073570251465 C7.622087478637695,12.906073570251465 7.622087478637695,12.906073570251465 7.622087478637695,12.906073570251465z M7.622087478637695,0 C3.1593029499053955,0 0,3.3149218559265137 0,8.022093772888184 C0,12.685078620910645 3.1593029499053955,16 7.622087478637695,16 C12.062784194946289,16 15.200028419494629,12.685078620910645 15.200028419494629,8.022093772888184 C15.200028419494629,3.3149218559265137 12.062784194946289,0 7.622087478637695,0 C7.622087478637695,0 7.622087478637695,0 7.622087478637695,0z%27/%3E%3Cpath transform=%27translate(103.29000091552734,0.27000001072883606)%27 d=%27 M7.405848026275635,6.873104095458984 C7.405848026275635,6.873104095458984 3.3160574436187744,6.873104095458984 3.3160574436187744,6.873104095458984 C3.3160574436187744,6.873104095458984 3.3160574436187744,2.983504056930542 3.3160574436187744,2.983504056930542 C3.3160574436187744,2.983504056930542 7.405848026275635,2.983504056930542 7.405848026275635,2.983504056930542 C9.04176139831543,2.983504056930542 9.90394115447998,3.646505117416382 9.90394115447998,4.928304195404053 C9.90394115447998,6.2101030349731445 9.04176139831543,6.873104095458984 7.405848026275635,6.873104095458984 C7.405848026275635,6.873104095458984 7.405848026275635,6.873104095458984 7.405848026275635,6.873104095458984z M7.5605998039245605,0 C7.5605998039245605,0 0,0 0,0 C0,0 0,15.470022201538086 0,15.470022201538086 C0,15.470022201538086 3.3160574436187744,15.470022201538086 3.3160574436187744,15.470022201538086 C3.3160574436187744,15.470022201538086 3.3160574436187744,9.85659408569336 3.3160574436187744,9.85659408569336 C3.3160574436187744,9.85659408569336 7.5605998039245605,9.85659408569336 7.5605998039245605,9.85659408569336 C11.07561206817627,9.85659408569336 13.219999313354492,8.000200271606445 13.219999313354492,4.928304195404053 C13.219999313354492,1.8563942909240723 11.07561206817627,0 7.5605998039245605,0 C7.5605998039245605,0 7.5605998039245605,0 7.5605998039245605,0z%27/%3E%3Cpath transform=%27translate(128.0399932861328,0)%27 d=%27 M10.914844512939453,10.5414400100708 C10.340370178222656,12.044201850891113 9.191434860229492,12.906073570251465 7.622706890106201,12.906073570251465 C5.0155181884765625,12.906073570251465 3.4246866703033447,11.049725532531738 3.4246866703033447,8.022093772888184 C3.4246866703033447,4.95027494430542 5.0155181884765625,3.0939269065856934 7.622706890106201,3.0939269065856934 C9.191434860229492,3.0939269065856934 10.340370178222656,3.9557981491088867 10.914844512939453,5.458559989929199 C10.914844512939453,5.458559989929199 14.427860260009766,5.458559989929199 14.427860260009766,5.458559989929199 C13.566211700439453,2.1436522006988525 10.981111526489258,0 7.622706890106201,0 C3.1595458984375,0 0,3.3149218559265137 0,8.022093772888184 C0,12.685078620910645 3.1595458984375,16 7.622706890106201,16 C11.003214836120605,16 13.588300704956055,13.834254264831543 14.449976921081543,10.5414400100708 C14.449976921081543,10.5414400100708 10.914844512939453,10.5414400100708 10.914844512939453,10.5414400100708 C10.914844512939453,10.5414400100708 10.914844512939453,10.5414400100708 10.914844512939453,10.5414400100708z%27/%3E%3Cpath transform=%27translate(117.83000183105469,0.27000001072883606)%27 d=%27 M0,0 C0,0 6.1677093505859375,15.470022201538086 6.1677093505859375,15.470022201538086 C6.1677093505859375,15.470022201538086 9.550004005432129,15.470022201538086 9.550004005432129,15.470022201538086 C9.550004005432129,15.470022201538086 3.382294178009033,0 3.382294178009033,0 C3.382294178009033,0 0,0 0,0 C0,0 0,0 0,0z%27/%3E%3Cpath transform=%27translate(0,0.27000001072883606)%27 d=%27 M5.824605464935303,9.348296165466309 C5.824605464935303,9.348296165466309 7.93500280380249,3.911694288253784 7.93500280380249,3.911694288253784 C7.93500280380249,3.911694288253784 10.045400619506836,9.348296165466309 10.045400619506836,9.348296165466309 C10.045400619506836,9.348296165466309 5.824605464935303,9.348296165466309 5.824605464935303,9.348296165466309 C5.824605464935303,9.348296165466309 5.824605464935303,9.348296165466309 5.824605464935303,9.348296165466309z M6.166755199432373,0 C6.166755199432373,0 0,15.470022201538086 0,15.470022201538086 C0,15.470022201538086 3.4480772018432617,15.470022201538086 3.4480772018432617,15.470022201538086 C3.4480772018432617,15.470022201538086 4.709278583526611,12.22130012512207 4.709278583526611,12.22130012512207 C4.709278583526611,12.22130012512207 11.16093635559082,12.22130012512207 11.16093635559082,12.22130012512207 C11.16093635559082,12.22130012512207 12.421928405761719,15.470022201538086 12.421928405761719,15.470022201538086 C12.421928405761719,15.470022201538086 15.87000560760498,15.470022201538086 15.87000560760498,15.470022201538086 C15.87000560760498,15.470022201538086 9.703250885009766,0 9.703250885009766,0 C9.703250885009766,0 6.166755199432373,0 6.166755199432373,0 C6.166755199432373,0 6.166755199432373,0 6.166755199432373,0z%27/%3E%3C/svg%3E\") center / contain no-repeat;",
1284
- " mask: url(\"data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 143 16%27%3E%3Cpath transform=%27translate(18.299999237060547,0.27000001072883606)%27 d=%27 M10.716191291809082,10.829001426696777 C10.716191291809082,10.829001426696777 3.756195545196533,0 3.756195545196533,0 C3.756195545196533,0 0,0 0,0 C0,0 0,15.470022201538086 0,15.470022201538086 C0,15.470022201538086 3.2038140296936035,15.470022201538086 3.2038140296936035,15.470022201538086 C3.2038140296936035,15.470022201538086 3.2038140296936035,4.6410064697265625 3.2038140296936035,4.6410064697265625 C3.2038140296936035,4.6410064697265625 10.163809776306152,15.470022201538086 10.163809776306152,15.470022201538086 C10.163809776306152,15.470022201538086 13.919991493225098,15.470022201538086 13.919991493225098,15.470022201538086 C13.919991493225098,15.470022201538086 13.919991493225098,0 13.919991493225098,0 C13.919991493225098,0 10.716191291809082,0 10.716191291809082,0 C10.716191291809082,0 10.716191291809082,10.829001426696777 10.716191291809082,10.829001426696777 C10.716191291809082,10.829001426696777 10.716191291809082,10.829001426696777 10.716191291809082,10.829001426696777z%27/%3E%3Cpath transform=%27translate(34.869998931884766,0.27000001072883606)%27 d=%27 M0,2.983504056930542 C0,2.983504056930542 5.19273567199707,2.983504056930542 5.19273567199707,2.983504056930542 C5.19273567199707,2.983504056930542 5.19273567199707,15.470022201538086 5.19273567199707,15.470022201538086 C5.19273567199707,15.470022201538086 8.507256507873535,15.470022201538086 8.507256507873535,15.470022201538086 C8.507256507873535,15.470022201538086 8.507256507873535,2.983504056930542 8.507256507873535,2.983504056930542 C8.507256507873535,2.983504056930542 13.700006484985352,2.983504056930542 13.700006484985352,2.983504056930542 C13.700006484985352,2.983504056930542 13.700006484985352,0 13.700006484985352,0 C13.700006484985352,0 0,0 0,0 C0,0 0,2.983504056930542 0,2.983504056930542 C0,2.983504056930542 0,2.983504056930542 0,2.983504056930542z%27/%3E%3Cpath transform=%27translate(51.22999954223633,0.27000001072883606)%27 d=%27 M10.605714797973633,6.165900230407715 C10.605714797973633,6.165900230407715 3.3142902851104736,6.165900230407715 3.3142902851104736,6.165900230407715 C3.3142902851104736,6.165900230407715 3.3142902851104736,0 3.3142902851104736,0 C3.3142902851104736,0 0,0 0,0 C0,0 0,15.470022201538086 0,15.470022201538086 C0,15.470022201538086 3.3142902851104736,15.470022201538086 3.3142902851104736,15.470022201538086 C3.3142902851104736,15.470022201538086 3.3142902851104736,9.149404525756836 3.3142902851104736,9.149404525756836 C3.3142902851104736,9.149404525756836 10.605714797973633,9.149404525756836 10.605714797973633,9.149404525756836 C10.605714797973633,9.149404525756836 10.605714797973633,15.470022201538086 10.605714797973633,15.470022201538086 C10.605714797973633,15.470022201538086 13.919991493225098,15.470022201538086 13.919991493225098,15.470022201538086 C13.919991493225098,15.470022201538086 13.919991493225098,0 13.919991493225098,0 C13.919991493225098,0 10.605714797973633,0 10.605714797973633,0 C10.605714797973633,0 10.605714797973633,6.165900230407715 10.605714797973633,6.165900230407715 C10.605714797973633,6.165900230407715 10.605714797973633,6.165900230407715 10.605714797973633,6.165900230407715z%27/%3E%3Cpath transform=%27translate(69.23999786376953,0.27000001072883606)%27 d=%27 M3.3151700496673584,2.983504056930542 C3.3151700496673584,2.983504056930542 7.403865814208984,2.983504056930542 7.403865814208984,2.983504056930542 C9.03934097290039,2.983504056930542 9.901290893554688,3.5801939964294434 9.901290893554688,4.707304000854492 C9.901290893554688,5.834399700164795 9.03934097290039,6.431103706359863 7.403865814208984,6.431103706359863 C7.403865814208984,6.431103706359863 3.3151700496673584,6.431103706359863 3.3151700496673584,6.431103706359863 C3.3151700496673584,6.431103706359863 3.3151700496673584,2.983504056930542 3.3151700496673584,2.983504056930542 C3.3151700496673584,2.983504056930542 3.3151700496673584,2.983504056930542 3.3151700496673584,2.983504056930542z M13.216461181640625,4.707304000854492 C13.216461181640625,1.7900969982147217 11.072648048400879,0 7.558576583862305,0 C7.558576583862305,0 0,0 0,0 C0,0 0,15.470022201538086 0,15.470022201538086 C0,15.470022201538086 3.3151700496673584,15.470022201538086 3.3151700496673584,15.470022201538086 C3.3151700496673584,15.470022201538086 3.3151700496673584,9.414593696594238 3.3151700496673584,9.414593696594238 C3.3151700496673584,9.414593696594238 7.005825519561768,9.414593696594238 7.005825519561768,9.414593696594238 C7.005825519561768,9.414593696594238 10.321218490600586,15.470022201538086 10.321218490600586,15.470022201538086 C10.321218490600586,15.470022201538086 13.990056991577148,15.470022201538086 13.990056991577148,15.470022201538086 C13.990056991577148,15.470022201538086 10.319005966186523,8.953378677368164 10.319005966186523,8.953378677368164 C12.161579132080078,8.245061874389648 13.216461181640625,6.753532409667969 13.216461181640625,4.707304000854492 C13.216461181640625,4.707304000854492 13.216461181640625,4.707304000854492 13.216461181640625,4.707304000854492z%27/%3E%3Cpath transform=%27translate(84.98999786376953,0)%27 d=%27 M7.622087478637695,12.906073570251465 C5.015110492706299,12.906073570251465 3.4244225025177,11.049725532531738 3.4244225025177,8.022093772888184 C3.4244225025177,4.95027494430542 5.015110492706299,3.0939269065856934 7.622087478637695,3.0939269065856934 C10.206976890563965,3.0939269065856934 11.775577545166016,4.95027494430542 11.775577545166016,8.022093772888184 C11.775577545166016,11.049725532531738 10.206976890563965,12.906073570251465 7.622087478637695,12.906073570251465 C7.622087478637695,12.906073570251465 7.622087478637695,12.906073570251465 7.622087478637695,12.906073570251465z M7.622087478637695,0 C3.1593029499053955,0 0,3.3149218559265137 0,8.022093772888184 C0,12.685078620910645 3.1593029499053955,16 7.622087478637695,16 C12.062784194946289,16 15.200028419494629,12.685078620910645 15.200028419494629,8.022093772888184 C15.200028419494629,3.3149218559265137 12.062784194946289,0 7.622087478637695,0 C7.622087478637695,0 7.622087478637695,0 7.622087478637695,0z%27/%3E%3Cpath transform=%27translate(103.29000091552734,0.27000001072883606)%27 d=%27 M7.405848026275635,6.873104095458984 C7.405848026275635,6.873104095458984 3.3160574436187744,6.873104095458984 3.3160574436187744,6.873104095458984 C3.3160574436187744,6.873104095458984 3.3160574436187744,2.983504056930542 3.3160574436187744,2.983504056930542 C3.3160574436187744,2.983504056930542 7.405848026275635,2.983504056930542 7.405848026275635,2.983504056930542 C9.04176139831543,2.983504056930542 9.90394115447998,3.646505117416382 9.90394115447998,4.928304195404053 C9.90394115447998,6.2101030349731445 9.04176139831543,6.873104095458984 7.405848026275635,6.873104095458984 C7.405848026275635,6.873104095458984 7.405848026275635,6.873104095458984 7.405848026275635,6.873104095458984z M7.5605998039245605,0 C7.5605998039245605,0 0,0 0,0 C0,0 0,15.470022201538086 0,15.470022201538086 C0,15.470022201538086 3.3160574436187744,15.470022201538086 3.3160574436187744,15.470022201538086 C3.3160574436187744,15.470022201538086 3.3160574436187744,9.85659408569336 3.3160574436187744,9.85659408569336 C3.3160574436187744,9.85659408569336 7.5605998039245605,9.85659408569336 7.5605998039245605,9.85659408569336 C11.07561206817627,9.85659408569336 13.219999313354492,8.000200271606445 13.219999313354492,4.928304195404053 C13.219999313354492,1.8563942909240723 11.07561206817627,0 7.5605998039245605,0 C7.5605998039245605,0 7.5605998039245605,0 7.5605998039245605,0z%27/%3E%3Cpath transform=%27translate(128.0399932861328,0)%27 d=%27 M10.914844512939453,10.5414400100708 C10.340370178222656,12.044201850891113 9.191434860229492,12.906073570251465 7.622706890106201,12.906073570251465 C5.0155181884765625,12.906073570251465 3.4246866703033447,11.049725532531738 3.4246866703033447,8.022093772888184 C3.4246866703033447,4.95027494430542 5.0155181884765625,3.0939269065856934 7.622706890106201,3.0939269065856934 C9.191434860229492,3.0939269065856934 10.340370178222656,3.9557981491088867 10.914844512939453,5.458559989929199 C10.914844512939453,5.458559989929199 14.427860260009766,5.458559989929199 14.427860260009766,5.458559989929199 C13.566211700439453,2.1436522006988525 10.981111526489258,0 7.622706890106201,0 C3.1595458984375,0 0,3.3149218559265137 0,8.022093772888184 C0,12.685078620910645 3.1595458984375,16 7.622706890106201,16 C11.003214836120605,16 13.588300704956055,13.834254264831543 14.449976921081543,10.5414400100708 C14.449976921081543,10.5414400100708 10.914844512939453,10.5414400100708 10.914844512939453,10.5414400100708 C10.914844512939453,10.5414400100708 10.914844512939453,10.5414400100708 10.914844512939453,10.5414400100708z%27/%3E%3Cpath transform=%27translate(117.83000183105469,0.27000001072883606)%27 d=%27 M0,0 C0,0 6.1677093505859375,15.470022201538086 6.1677093505859375,15.470022201538086 C6.1677093505859375,15.470022201538086 9.550004005432129,15.470022201538086 9.550004005432129,15.470022201538086 C9.550004005432129,15.470022201538086 3.382294178009033,0 3.382294178009033,0 C3.382294178009033,0 0,0 0,0 C0,0 0,0 0,0z%27/%3E%3Cpath transform=%27translate(0,0.27000001072883606)%27 d=%27 M5.824605464935303,9.348296165466309 C5.824605464935303,9.348296165466309 7.93500280380249,3.911694288253784 7.93500280380249,3.911694288253784 C7.93500280380249,3.911694288253784 10.045400619506836,9.348296165466309 10.045400619506836,9.348296165466309 C10.045400619506836,9.348296165466309 5.824605464935303,9.348296165466309 5.824605464935303,9.348296165466309 C5.824605464935303,9.348296165466309 5.824605464935303,9.348296165466309 5.824605464935303,9.348296165466309z M6.166755199432373,0 C6.166755199432373,0 0,15.470022201538086 0,15.470022201538086 C0,15.470022201538086 3.4480772018432617,15.470022201538086 3.4480772018432617,15.470022201538086 C3.4480772018432617,15.470022201538086 4.709278583526611,12.22130012512207 4.709278583526611,12.22130012512207 C4.709278583526611,12.22130012512207 11.16093635559082,12.22130012512207 11.16093635559082,12.22130012512207 C11.16093635559082,12.22130012512207 12.421928405761719,15.470022201538086 12.421928405761719,15.470022201538086 C12.421928405761719,15.470022201538086 15.87000560760498,15.470022201538086 15.87000560760498,15.470022201538086 C15.87000560760498,15.470022201538086 9.703250885009766,0 9.703250885009766,0 C9.703250885009766,0 6.166755199432373,0 6.166755199432373,0 C6.166755199432373,0 6.166755199432373,0 6.166755199432373,0z%27/%3E%3C/svg%3E\") center / contain no-repeat;",
1407
+ " -webkit-mask: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%20143%2016'%3E%3Cpath%20transform%3D'translate(18.299999237060547%2C0.27000001072883606)'%20d%3D'%20M10.716191291809082%2C10.829001426696777%20C10.716191291809082%2C10.829001426696777%203.756195545196533%2C0%203.756195545196533%2C0%20C3.756195545196533%2C0%200%2C0%200%2C0%20C0%2C0%200%2C15.470022201538086%200%2C15.470022201538086%20C0%2C15.470022201538086%203.2038140296936035%2C15.470022201538086%203.2038140296936035%2C15.470022201538086%20C3.2038140296936035%2C15.470022201538086%203.2038140296936035%2C4.6410064697265625%203.2038140296936035%2C4.6410064697265625%20C3.2038140296936035%2C4.6410064697265625%2010.163809776306152%2C15.470022201538086%2010.163809776306152%2C15.470022201538086%20C10.163809776306152%2C15.470022201538086%2013.919991493225098%2C15.470022201538086%2013.919991493225098%2C15.470022201538086%20C13.919991493225098%2C15.470022201538086%2013.919991493225098%2C0%2013.919991493225098%2C0%20C13.919991493225098%2C0%2010.716191291809082%2C0%2010.716191291809082%2C0%20C10.716191291809082%2C0%2010.716191291809082%2C10.829001426696777%2010.716191291809082%2C10.829001426696777%20C10.716191291809082%2C10.829001426696777%2010.716191291809082%2C10.829001426696777%2010.716191291809082%2C10.829001426696777z'%2F%3E%3Cpath%20transform%3D'translate(34.869998931884766%2C0.27000001072883606)'%20d%3D'%20M0%2C2.983504056930542%20C0%2C2.983504056930542%205.19273567199707%2C2.983504056930542%205.19273567199707%2C2.983504056930542%20C5.19273567199707%2C2.983504056930542%205.19273567199707%2C15.470022201538086%205.19273567199707%2C15.470022201538086%20C5.19273567199707%2C15.470022201538086%208.507256507873535%2C15.470022201538086%208.507256507873535%2C15.470022201538086%20C8.507256507873535%2C15.470022201538086%208.507256507873535%2C2.983504056930542%208.507256507873535%2C2.983504056930542%20C8.507256507873535%2C2.983504056930542%2013.700006484985352%2C2.983504056930542%2013.700006484985352%2C2.983504056930542%20C13.700006484985352%2C2.983504056930542%2013.700006484985352%2C0%2013.700006484985352%2C0%20C13.700006484985352%2C0%200%2C0%200%2C0%20C0%2C0%200%2C2.983504056930542%200%2C2.983504056930542%20C0%2C2.983504056930542%200%2C2.983504056930542%200%2C2.983504056930542z'%2F%3E%3Cpath%20transform%3D'translate(51.22999954223633%2C0.27000001072883606)'%20d%3D'%20M10.605714797973633%2C6.165900230407715%20C10.605714797973633%2C6.165900230407715%203.3142902851104736%2C6.165900230407715%203.3142902851104736%2C6.165900230407715%20C3.3142902851104736%2C6.165900230407715%203.3142902851104736%2C0%203.3142902851104736%2C0%20C3.3142902851104736%2C0%200%2C0%200%2C0%20C0%2C0%200%2C15.470022201538086%200%2C15.470022201538086%20C0%2C15.470022201538086%203.3142902851104736%2C15.470022201538086%203.3142902851104736%2C15.470022201538086%20C3.3142902851104736%2C15.470022201538086%203.3142902851104736%2C9.149404525756836%203.3142902851104736%2C9.149404525756836%20C3.3142902851104736%2C9.149404525756836%2010.605714797973633%2C9.149404525756836%2010.605714797973633%2C9.149404525756836%20C10.605714797973633%2C9.149404525756836%2010.605714797973633%2C15.470022201538086%2010.605714797973633%2C15.470022201538086%20C10.605714797973633%2C15.470022201538086%2013.919991493225098%2C15.470022201538086%2013.919991493225098%2C15.470022201538086%20C13.919991493225098%2C15.470022201538086%2013.919991493225098%2C0%2013.919991493225098%2C0%20C13.919991493225098%2C0%2010.605714797973633%2C0%2010.605714797973633%2C0%20C10.605714797973633%2C0%2010.605714797973633%2C6.165900230407715%2010.605714797973633%2C6.165900230407715%20C10.605714797973633%2C6.165900230407715%2010.605714797973633%2C6.165900230407715%2010.605714797973633%2C6.165900230407715z'%2F%3E%3Cpath%20transform%3D'translate(69.23999786376953%2C0.27000001072883606)'%20d%3D'%20M3.3151700496673584%2C2.983504056930542%20C3.3151700496673584%2C2.983504056930542%207.403865814208984%2C2.983504056930542%207.403865814208984%2C2.983504056930542%20C9.03934097290039%2C2.983504056930542%209.901290893554688%2C3.5801939964294434%209.901290893554688%2C4.707304000854492%20C9.901290893554688%2C5.834399700164795%209.03934097290039%2C6.431103706359863%207.403865814208984%2C6.431103706359863%20C7.403865814208984%2C6.431103706359863%203.3151700496673584%2C6.431103706359863%203.3151700496673584%2C6.431103706359863%20C3.3151700496673584%2C6.431103706359863%203.3151700496673584%2C2.983504056930542%203.3151700496673584%2C2.983504056930542%20C3.3151700496673584%2C2.983504056930542%203.3151700496673584%2C2.983504056930542%203.3151700496673584%2C2.983504056930542z%20M13.216461181640625%2C4.707304000854492%20C13.216461181640625%2C1.7900969982147217%2011.072648048400879%2C0%207.558576583862305%2C0%20C7.558576583862305%2C0%200%2C0%200%2C0%20C0%2C0%200%2C15.470022201538086%200%2C15.470022201538086%20C0%2C15.470022201538086%203.3151700496673584%2C15.470022201538086%203.3151700496673584%2C15.470022201538086%20C3.3151700496673584%2C15.470022201538086%203.3151700496673584%2C9.414593696594238%203.3151700496673584%2C9.414593696594238%20C3.3151700496673584%2C9.414593696594238%207.005825519561768%2C9.414593696594238%207.005825519561768%2C9.414593696594238%20C7.005825519561768%2C9.414593696594238%2010.321218490600586%2C15.470022201538086%2010.321218490600586%2C15.470022201538086%20C10.321218490600586%2C15.470022201538086%2013.990056991577148%2C15.470022201538086%2013.990056991577148%2C15.470022201538086%20C13.990056991577148%2C15.470022201538086%2010.319005966186523%2C8.953378677368164%2010.319005966186523%2C8.953378677368164%20C12.161579132080078%2C8.245061874389648%2013.216461181640625%2C6.753532409667969%2013.216461181640625%2C4.707304000854492%20C13.216461181640625%2C4.707304000854492%2013.216461181640625%2C4.707304000854492%2013.216461181640625%2C4.707304000854492z'%2F%3E%3Cpath%20transform%3D'translate(84.98999786376953%2C0)'%20d%3D'%20M7.622087478637695%2C12.906073570251465%20C5.015110492706299%2C12.906073570251465%203.4244225025177%2C11.049725532531738%203.4244225025177%2C8.022093772888184%20C3.4244225025177%2C4.95027494430542%205.015110492706299%2C3.0939269065856934%207.622087478637695%2C3.0939269065856934%20C10.206976890563965%2C3.0939269065856934%2011.775577545166016%2C4.95027494430542%2011.775577545166016%2C8.022093772888184%20C11.775577545166016%2C11.049725532531738%2010.206976890563965%2C12.906073570251465%207.622087478637695%2C12.906073570251465%20C7.622087478637695%2C12.906073570251465%207.622087478637695%2C12.906073570251465%207.622087478637695%2C12.906073570251465z%20M7.622087478637695%2C0%20C3.1593029499053955%2C0%200%2C3.3149218559265137%200%2C8.022093772888184%20C0%2C12.685078620910645%203.1593029499053955%2C16%207.622087478637695%2C16%20C12.062784194946289%2C16%2015.200028419494629%2C12.685078620910645%2015.200028419494629%2C8.022093772888184%20C15.200028419494629%2C3.3149218559265137%2012.062784194946289%2C0%207.622087478637695%2C0%20C7.622087478637695%2C0%207.622087478637695%2C0%207.622087478637695%2C0z'%2F%3E%3Cpath%20transform%3D'translate(103.29000091552734%2C0.27000001072883606)'%20d%3D'%20M7.405848026275635%2C6.873104095458984%20C7.405848026275635%2C6.873104095458984%203.3160574436187744%2C6.873104095458984%203.3160574436187744%2C6.873104095458984%20C3.3160574436187744%2C6.873104095458984%203.3160574436187744%2C2.983504056930542%203.3160574436187744%2C2.983504056930542%20C3.3160574436187744%2C2.983504056930542%207.405848026275635%2C2.983504056930542%207.405848026275635%2C2.983504056930542%20C9.04176139831543%2C2.983504056930542%209.90394115447998%2C3.646505117416382%209.90394115447998%2C4.928304195404053%20C9.90394115447998%2C6.2101030349731445%209.04176139831543%2C6.873104095458984%207.405848026275635%2C6.873104095458984%20C7.405848026275635%2C6.873104095458984%207.405848026275635%2C6.873104095458984%207.405848026275635%2C6.873104095458984z%20M7.5605998039245605%2C0%20C7.5605998039245605%2C0%200%2C0%200%2C0%20C0%2C0%200%2C15.470022201538086%200%2C15.470022201538086%20C0%2C15.470022201538086%203.3160574436187744%2C15.470022201538086%203.3160574436187744%2C15.470022201538086%20C3.3160574436187744%2C15.470022201538086%203.3160574436187744%2C9.85659408569336%203.3160574436187744%2C9.85659408569336%20C3.3160574436187744%2C9.85659408569336%207.5605998039245605%2C9.85659408569336%207.5605998039245605%2C9.85659408569336%20C11.07561206817627%2C9.85659408569336%2013.219999313354492%2C8.000200271606445%2013.219999313354492%2C4.928304195404053%20C13.219999313354492%2C1.8563942909240723%2011.07561206817627%2C0%207.5605998039245605%2C0%20C7.5605998039245605%2C0%207.5605998039245605%2C0%207.5605998039245605%2C0z'%2F%3E%3Cpath%20transform%3D'translate(128.0399932861328%2C0)'%20d%3D'%20M10.914844512939453%2C10.5414400100708%20C10.340370178222656%2C12.044201850891113%209.191434860229492%2C12.906073570251465%207.622706890106201%2C12.906073570251465%20C5.0155181884765625%2C12.906073570251465%203.4246866703033447%2C11.049725532531738%203.4246866703033447%2C8.022093772888184%20C3.4246866703033447%2C4.95027494430542%205.0155181884765625%2C3.0939269065856934%207.622706890106201%2C3.0939269065856934%20C9.191434860229492%2C3.0939269065856934%2010.340370178222656%2C3.9557981491088867%2010.914844512939453%2C5.458559989929199%20C10.914844512939453%2C5.458559989929199%2014.427860260009766%2C5.458559989929199%2014.427860260009766%2C5.458559989929199%20C13.566211700439453%2C2.1436522006988525%2010.981111526489258%2C0%207.622706890106201%2C0%20C3.1595458984375%2C0%200%2C3.3149218559265137%200%2C8.022093772888184%20C0%2C12.685078620910645%203.1595458984375%2C16%207.622706890106201%2C16%20C11.003214836120605%2C16%2013.588300704956055%2C13.834254264831543%2014.449976921081543%2C10.5414400100708%20C14.449976921081543%2C10.5414400100708%2010.914844512939453%2C10.5414400100708%2010.914844512939453%2C10.5414400100708%20C10.914844512939453%2C10.5414400100708%2010.914844512939453%2C10.5414400100708%2010.914844512939453%2C10.5414400100708z'%2F%3E%3Cpath%20transform%3D'translate(117.83000183105469%2C0.27000001072883606)'%20d%3D'%20M0%2C0%20C0%2C0%206.1677093505859375%2C15.470022201538086%206.1677093505859375%2C15.470022201538086%20C6.1677093505859375%2C15.470022201538086%209.550004005432129%2C15.470022201538086%209.550004005432129%2C15.470022201538086%20C9.550004005432129%2C15.470022201538086%203.382294178009033%2C0%203.382294178009033%2C0%20C3.382294178009033%2C0%200%2C0%200%2C0%20C0%2C0%200%2C0%200%2C0z'%2F%3E%3Cpath%20transform%3D'translate(0%2C0.27000001072883606)'%20d%3D'%20M5.824605464935303%2C9.348296165466309%20C5.824605464935303%2C9.348296165466309%207.93500280380249%2C3.911694288253784%207.93500280380249%2C3.911694288253784%20C7.93500280380249%2C3.911694288253784%2010.045400619506836%2C9.348296165466309%2010.045400619506836%2C9.348296165466309%20C10.045400619506836%2C9.348296165466309%205.824605464935303%2C9.348296165466309%205.824605464935303%2C9.348296165466309%20C5.824605464935303%2C9.348296165466309%205.824605464935303%2C9.348296165466309%205.824605464935303%2C9.348296165466309z%20M6.166755199432373%2C0%20C6.166755199432373%2C0%200%2C15.470022201538086%200%2C15.470022201538086%20C0%2C15.470022201538086%203.4480772018432617%2C15.470022201538086%203.4480772018432617%2C15.470022201538086%20C3.4480772018432617%2C15.470022201538086%204.709278583526611%2C12.22130012512207%204.709278583526611%2C12.22130012512207%20C4.709278583526611%2C12.22130012512207%2011.16093635559082%2C12.22130012512207%2011.16093635559082%2C12.22130012512207%20C11.16093635559082%2C12.22130012512207%2012.421928405761719%2C15.470022201538086%2012.421928405761719%2C15.470022201538086%20C12.421928405761719%2C15.470022201538086%2015.87000560760498%2C15.470022201538086%2015.87000560760498%2C15.470022201538086%20C15.87000560760498%2C15.470022201538086%209.703250885009766%2C0%209.703250885009766%2C0%20C9.703250885009766%2C0%206.166755199432373%2C0%206.166755199432373%2C0%20C6.166755199432373%2C0%206.166755199432373%2C0%206.166755199432373%2C0z'%2F%3E%3C%2Fsvg%3E\") center / contain no-repeat;",
1408
+ " mask: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%20143%2016'%3E%3Cpath%20transform%3D'translate(18.299999237060547%2C0.27000001072883606)'%20d%3D'%20M10.716191291809082%2C10.829001426696777%20C10.716191291809082%2C10.829001426696777%203.756195545196533%2C0%203.756195545196533%2C0%20C3.756195545196533%2C0%200%2C0%200%2C0%20C0%2C0%200%2C15.470022201538086%200%2C15.470022201538086%20C0%2C15.470022201538086%203.2038140296936035%2C15.470022201538086%203.2038140296936035%2C15.470022201538086%20C3.2038140296936035%2C15.470022201538086%203.2038140296936035%2C4.6410064697265625%203.2038140296936035%2C4.6410064697265625%20C3.2038140296936035%2C4.6410064697265625%2010.163809776306152%2C15.470022201538086%2010.163809776306152%2C15.470022201538086%20C10.163809776306152%2C15.470022201538086%2013.919991493225098%2C15.470022201538086%2013.919991493225098%2C15.470022201538086%20C13.919991493225098%2C15.470022201538086%2013.919991493225098%2C0%2013.919991493225098%2C0%20C13.919991493225098%2C0%2010.716191291809082%2C0%2010.716191291809082%2C0%20C10.716191291809082%2C0%2010.716191291809082%2C10.829001426696777%2010.716191291809082%2C10.829001426696777%20C10.716191291809082%2C10.829001426696777%2010.716191291809082%2C10.829001426696777%2010.716191291809082%2C10.829001426696777z'%2F%3E%3Cpath%20transform%3D'translate(34.869998931884766%2C0.27000001072883606)'%20d%3D'%20M0%2C2.983504056930542%20C0%2C2.983504056930542%205.19273567199707%2C2.983504056930542%205.19273567199707%2C2.983504056930542%20C5.19273567199707%2C2.983504056930542%205.19273567199707%2C15.470022201538086%205.19273567199707%2C15.470022201538086%20C5.19273567199707%2C15.470022201538086%208.507256507873535%2C15.470022201538086%208.507256507873535%2C15.470022201538086%20C8.507256507873535%2C15.470022201538086%208.507256507873535%2C2.983504056930542%208.507256507873535%2C2.983504056930542%20C8.507256507873535%2C2.983504056930542%2013.700006484985352%2C2.983504056930542%2013.700006484985352%2C2.983504056930542%20C13.700006484985352%2C2.983504056930542%2013.700006484985352%2C0%2013.700006484985352%2C0%20C13.700006484985352%2C0%200%2C0%200%2C0%20C0%2C0%200%2C2.983504056930542%200%2C2.983504056930542%20C0%2C2.983504056930542%200%2C2.983504056930542%200%2C2.983504056930542z'%2F%3E%3Cpath%20transform%3D'translate(51.22999954223633%2C0.27000001072883606)'%20d%3D'%20M10.605714797973633%2C6.165900230407715%20C10.605714797973633%2C6.165900230407715%203.3142902851104736%2C6.165900230407715%203.3142902851104736%2C6.165900230407715%20C3.3142902851104736%2C6.165900230407715%203.3142902851104736%2C0%203.3142902851104736%2C0%20C3.3142902851104736%2C0%200%2C0%200%2C0%20C0%2C0%200%2C15.470022201538086%200%2C15.470022201538086%20C0%2C15.470022201538086%203.3142902851104736%2C15.470022201538086%203.3142902851104736%2C15.470022201538086%20C3.3142902851104736%2C15.470022201538086%203.3142902851104736%2C9.149404525756836%203.3142902851104736%2C9.149404525756836%20C3.3142902851104736%2C9.149404525756836%2010.605714797973633%2C9.149404525756836%2010.605714797973633%2C9.149404525756836%20C10.605714797973633%2C9.149404525756836%2010.605714797973633%2C15.470022201538086%2010.605714797973633%2C15.470022201538086%20C10.605714797973633%2C15.470022201538086%2013.919991493225098%2C15.470022201538086%2013.919991493225098%2C15.470022201538086%20C13.919991493225098%2C15.470022201538086%2013.919991493225098%2C0%2013.919991493225098%2C0%20C13.919991493225098%2C0%2010.605714797973633%2C0%2010.605714797973633%2C0%20C10.605714797973633%2C0%2010.605714797973633%2C6.165900230407715%2010.605714797973633%2C6.165900230407715%20C10.605714797973633%2C6.165900230407715%2010.605714797973633%2C6.165900230407715%2010.605714797973633%2C6.165900230407715z'%2F%3E%3Cpath%20transform%3D'translate(69.23999786376953%2C0.27000001072883606)'%20d%3D'%20M3.3151700496673584%2C2.983504056930542%20C3.3151700496673584%2C2.983504056930542%207.403865814208984%2C2.983504056930542%207.403865814208984%2C2.983504056930542%20C9.03934097290039%2C2.983504056930542%209.901290893554688%2C3.5801939964294434%209.901290893554688%2C4.707304000854492%20C9.901290893554688%2C5.834399700164795%209.03934097290039%2C6.431103706359863%207.403865814208984%2C6.431103706359863%20C7.403865814208984%2C6.431103706359863%203.3151700496673584%2C6.431103706359863%203.3151700496673584%2C6.431103706359863%20C3.3151700496673584%2C6.431103706359863%203.3151700496673584%2C2.983504056930542%203.3151700496673584%2C2.983504056930542%20C3.3151700496673584%2C2.983504056930542%203.3151700496673584%2C2.983504056930542%203.3151700496673584%2C2.983504056930542z%20M13.216461181640625%2C4.707304000854492%20C13.216461181640625%2C1.7900969982147217%2011.072648048400879%2C0%207.558576583862305%2C0%20C7.558576583862305%2C0%200%2C0%200%2C0%20C0%2C0%200%2C15.470022201538086%200%2C15.470022201538086%20C0%2C15.470022201538086%203.3151700496673584%2C15.470022201538086%203.3151700496673584%2C15.470022201538086%20C3.3151700496673584%2C15.470022201538086%203.3151700496673584%2C9.414593696594238%203.3151700496673584%2C9.414593696594238%20C3.3151700496673584%2C9.414593696594238%207.005825519561768%2C9.414593696594238%207.005825519561768%2C9.414593696594238%20C7.005825519561768%2C9.414593696594238%2010.321218490600586%2C15.470022201538086%2010.321218490600586%2C15.470022201538086%20C10.321218490600586%2C15.470022201538086%2013.990056991577148%2C15.470022201538086%2013.990056991577148%2C15.470022201538086%20C13.990056991577148%2C15.470022201538086%2010.319005966186523%2C8.953378677368164%2010.319005966186523%2C8.953378677368164%20C12.161579132080078%2C8.245061874389648%2013.216461181640625%2C6.753532409667969%2013.216461181640625%2C4.707304000854492%20C13.216461181640625%2C4.707304000854492%2013.216461181640625%2C4.707304000854492%2013.216461181640625%2C4.707304000854492z'%2F%3E%3Cpath%20transform%3D'translate(84.98999786376953%2C0)'%20d%3D'%20M7.622087478637695%2C12.906073570251465%20C5.015110492706299%2C12.906073570251465%203.4244225025177%2C11.049725532531738%203.4244225025177%2C8.022093772888184%20C3.4244225025177%2C4.95027494430542%205.015110492706299%2C3.0939269065856934%207.622087478637695%2C3.0939269065856934%20C10.206976890563965%2C3.0939269065856934%2011.775577545166016%2C4.95027494430542%2011.775577545166016%2C8.022093772888184%20C11.775577545166016%2C11.049725532531738%2010.206976890563965%2C12.906073570251465%207.622087478637695%2C12.906073570251465%20C7.622087478637695%2C12.906073570251465%207.622087478637695%2C12.906073570251465%207.622087478637695%2C12.906073570251465z%20M7.622087478637695%2C0%20C3.1593029499053955%2C0%200%2C3.3149218559265137%200%2C8.022093772888184%20C0%2C12.685078620910645%203.1593029499053955%2C16%207.622087478637695%2C16%20C12.062784194946289%2C16%2015.200028419494629%2C12.685078620910645%2015.200028419494629%2C8.022093772888184%20C15.200028419494629%2C3.3149218559265137%2012.062784194946289%2C0%207.622087478637695%2C0%20C7.622087478637695%2C0%207.622087478637695%2C0%207.622087478637695%2C0z'%2F%3E%3Cpath%20transform%3D'translate(103.29000091552734%2C0.27000001072883606)'%20d%3D'%20M7.405848026275635%2C6.873104095458984%20C7.405848026275635%2C6.873104095458984%203.3160574436187744%2C6.873104095458984%203.3160574436187744%2C6.873104095458984%20C3.3160574436187744%2C6.873104095458984%203.3160574436187744%2C2.983504056930542%203.3160574436187744%2C2.983504056930542%20C3.3160574436187744%2C2.983504056930542%207.405848026275635%2C2.983504056930542%207.405848026275635%2C2.983504056930542%20C9.04176139831543%2C2.983504056930542%209.90394115447998%2C3.646505117416382%209.90394115447998%2C4.928304195404053%20C9.90394115447998%2C6.2101030349731445%209.04176139831543%2C6.873104095458984%207.405848026275635%2C6.873104095458984%20C7.405848026275635%2C6.873104095458984%207.405848026275635%2C6.873104095458984%207.405848026275635%2C6.873104095458984z%20M7.5605998039245605%2C0%20C7.5605998039245605%2C0%200%2C0%200%2C0%20C0%2C0%200%2C15.470022201538086%200%2C15.470022201538086%20C0%2C15.470022201538086%203.3160574436187744%2C15.470022201538086%203.3160574436187744%2C15.470022201538086%20C3.3160574436187744%2C15.470022201538086%203.3160574436187744%2C9.85659408569336%203.3160574436187744%2C9.85659408569336%20C3.3160574436187744%2C9.85659408569336%207.5605998039245605%2C9.85659408569336%207.5605998039245605%2C9.85659408569336%20C11.07561206817627%2C9.85659408569336%2013.219999313354492%2C8.000200271606445%2013.219999313354492%2C4.928304195404053%20C13.219999313354492%2C1.8563942909240723%2011.07561206817627%2C0%207.5605998039245605%2C0%20C7.5605998039245605%2C0%207.5605998039245605%2C0%207.5605998039245605%2C0z'%2F%3E%3Cpath%20transform%3D'translate(128.0399932861328%2C0)'%20d%3D'%20M10.914844512939453%2C10.5414400100708%20C10.340370178222656%2C12.044201850891113%209.191434860229492%2C12.906073570251465%207.622706890106201%2C12.906073570251465%20C5.0155181884765625%2C12.906073570251465%203.4246866703033447%2C11.049725532531738%203.4246866703033447%2C8.022093772888184%20C3.4246866703033447%2C4.95027494430542%205.0155181884765625%2C3.0939269065856934%207.622706890106201%2C3.0939269065856934%20C9.191434860229492%2C3.0939269065856934%2010.340370178222656%2C3.9557981491088867%2010.914844512939453%2C5.458559989929199%20C10.914844512939453%2C5.458559989929199%2014.427860260009766%2C5.458559989929199%2014.427860260009766%2C5.458559989929199%20C13.566211700439453%2C2.1436522006988525%2010.981111526489258%2C0%207.622706890106201%2C0%20C3.1595458984375%2C0%200%2C3.3149218559265137%200%2C8.022093772888184%20C0%2C12.685078620910645%203.1595458984375%2C16%207.622706890106201%2C16%20C11.003214836120605%2C16%2013.588300704956055%2C13.834254264831543%2014.449976921081543%2C10.5414400100708%20C14.449976921081543%2C10.5414400100708%2010.914844512939453%2C10.5414400100708%2010.914844512939453%2C10.5414400100708%20C10.914844512939453%2C10.5414400100708%2010.914844512939453%2C10.5414400100708%2010.914844512939453%2C10.5414400100708z'%2F%3E%3Cpath%20transform%3D'translate(117.83000183105469%2C0.27000001072883606)'%20d%3D'%20M0%2C0%20C0%2C0%206.1677093505859375%2C15.470022201538086%206.1677093505859375%2C15.470022201538086%20C6.1677093505859375%2C15.470022201538086%209.550004005432129%2C15.470022201538086%209.550004005432129%2C15.470022201538086%20C9.550004005432129%2C15.470022201538086%203.382294178009033%2C0%203.382294178009033%2C0%20C3.382294178009033%2C0%200%2C0%200%2C0%20C0%2C0%200%2C0%200%2C0z'%2F%3E%3Cpath%20transform%3D'translate(0%2C0.27000001072883606)'%20d%3D'%20M5.824605464935303%2C9.348296165466309%20C5.824605464935303%2C9.348296165466309%207.93500280380249%2C3.911694288253784%207.93500280380249%2C3.911694288253784%20C7.93500280380249%2C3.911694288253784%2010.045400619506836%2C9.348296165466309%2010.045400619506836%2C9.348296165466309%20C10.045400619506836%2C9.348296165466309%205.824605464935303%2C9.348296165466309%205.824605464935303%2C9.348296165466309%20C5.824605464935303%2C9.348296165466309%205.824605464935303%2C9.348296165466309%205.824605464935303%2C9.348296165466309z%20M6.166755199432373%2C0%20C6.166755199432373%2C0%200%2C15.470022201538086%200%2C15.470022201538086%20C0%2C15.470022201538086%203.4480772018432617%2C15.470022201538086%203.4480772018432617%2C15.470022201538086%20C3.4480772018432617%2C15.470022201538086%204.709278583526611%2C12.22130012512207%204.709278583526611%2C12.22130012512207%20C4.709278583526611%2C12.22130012512207%2011.16093635559082%2C12.22130012512207%2011.16093635559082%2C12.22130012512207%20C11.16093635559082%2C12.22130012512207%2012.421928405761719%2C15.470022201538086%2012.421928405761719%2C15.470022201538086%20C12.421928405761719%2C15.470022201538086%2015.87000560760498%2C15.470022201538086%2015.87000560760498%2C15.470022201538086%20C15.87000560760498%2C15.470022201538086%209.703250885009766%2C0%209.703250885009766%2C0%20C9.703250885009766%2C0%206.166755199432373%2C0%206.166755199432373%2C0%20C6.166755199432373%2C0%206.166755199432373%2C0%206.166755199432373%2C0z'%2F%3E%3C%2Fsvg%3E\") center / contain no-repeat;",
1285
1409
  "}",
1286
1410
  "",
1287
1411
  "/* ---------- Claude Code layout: new session button ---------- */",
@@ -1669,7 +1793,9 @@ window.__ModuleLoader__.load({
1669
1793
  " z-index: 99999 !important;",
1670
1794
  " display: flex !important;",
1671
1795
  " flex-direction: column !important;",
1672
- " gap: 2px !important;",
1796
+ " /* Two-line preset rows (label + description) need air between them: the",
1797
+ " 2px gap read as one solid block, so each row is separated by 6px. */",
1798
+ " gap: 6px !important;",
1673
1799
  " opacity: 0 !important;",
1674
1800
  " pointer-events: none !important;",
1675
1801
  " transform: translateY(4px) scale(0.98) !important;",
@@ -1724,7 +1850,7 @@ window.__ModuleLoader__.load({
1724
1850
  "body[data-dsh-claude-style] .dsh-claude-account-avatar {",
1725
1851
  " width: 18px;",
1726
1852
  " height: 18px;",
1727
- " background: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z' fill='%23D97757'/%3E%3C/svg%3E\") center / contain no-repeat;",
1853
+ " background: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2024%2024'%3E%3Cpath%20d%3D'M4.709%2015.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0%2011.784l.055-.352.48-.321.686.06%201.52.103%202.278.158%201.652.097%202.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686%201.908%201.476%202.491%201.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97%202.97%200%2001-.104-.729L6.283.134%206.696%200l.996.134.42.364.62%201.414%201.002%202.229%201.555%203.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286%201.851-.559%202.903-.364%201.942h.212l.243-.242.985-1.306%201.652-2.064.73-.82.85-.904.547-.431h1.033l.76%201.129-.34%201.166-1.064%201.347-.881%201.142-1.264%201.7-.79%201.36.073.11.188-.02%202.856-.606%201.543-.28%201.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061%201.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093%201.068%202.006%201.81%202.509%202.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649%202.345%203.521.122%201.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674%207.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434%201.967-2.18%202.945-1.726%201.845-.414.164-.717-.37.067-.662.401-.589%202.388-3.036%201.44-1.882.93-1.086-.006-.158h-.055L4.132%2018.56l-1.13.146-.487-.456.061-.746.231-.243%201.908-1.312-.006.006z'%20fill%3D'%23D97757'%2F%3E%3C%2Fsvg%3E\") center / contain no-repeat;",
1728
1854
  " flex: none;",
1729
1855
  " margin-right: 8px;",
1730
1856
  "}",
@@ -1812,6 +1938,146 @@ window.__ModuleLoader__.load({
1812
1938
  " background: transparent;",
1813
1939
  "}",
1814
1940
  "",
1941
+ "/* ---------- Claude Code layout: model picker ---------- */",
1942
+ "/* Replaces the host's two-pane model menu: level 1 carries the current",
1943
+ " provider's models, a divider, the effort row and a More models row; both",
1944
+ " rows open their level 2 beside this popover. Container metrics mirror the",
1945
+ " permission popover so the two read as one design. */",
1946
+ "body[data-dsh-claude-style] .dsh-claude-model-popover {",
1947
+ " position: fixed !important;",
1948
+ " min-width: 248px !important;",
1949
+ " max-width: min(360px, calc(100vw - 16px)) !important;",
1950
+ " max-height: min(440px, calc(100vh - 96px)) !important;",
1951
+ " overflow-y: auto !important;",
1952
+ " background: var(--dsw-alias-bg-overlay, #ffffff) !important;",
1953
+ " border: 1px solid var(--dsw-alias-border-l1, #e8e6dc) !important;",
1954
+ " border-radius: 12px !important;",
1955
+ " box-shadow: 0 8px 30px rgba(20, 20, 19, 0.12), 0 2px 8px rgba(20, 20, 19, 0.06) !important;",
1956
+ " padding: 6px !important;",
1957
+ " box-sizing: border-box !important;",
1958
+ " z-index: 99999 !important;",
1959
+ " display: flex !important;",
1960
+ " flex-direction: column !important;",
1961
+ " gap: 6px !important;",
1962
+ " opacity: 0 !important;",
1963
+ " pointer-events: none !important;",
1964
+ " transform: translateY(4px) scale(0.98) !important;",
1965
+ " transform-origin: bottom right !important;",
1966
+ " transition: opacity 0.15s ease, transform 0.15s ease !important;",
1967
+ "}",
1968
+ "body[data-dsh-claude-style] .dsh-claude-model-popover[data-open=\"true\"] {",
1969
+ " opacity: 1 !important;",
1970
+ " pointer-events: auto !important;",
1971
+ " transform: translateY(0) scale(1) !important;",
1972
+ "}",
1973
+ "body[data-dsh-claude-style][data-ds-dark-theme] .dsh-claude-model-popover {",
1974
+ " background: #1e1e1d !important;",
1975
+ " border-color: #2e2c29 !important;",
1976
+ " box-shadow: 0 8px 30px rgba(0, 0, 0, 0.5), 0 2px 8px rgba(0, 0, 0, 0.3) !important;",
1977
+ "}",
1978
+ "body[data-dsh-claude-style] .dsh-claude-model-popover-body {",
1979
+ " display: flex !important;",
1980
+ " flex-direction: column !important;",
1981
+ " gap: 6px !important;",
1982
+ " min-width: 0 !important;",
1983
+ "}",
1984
+ "body[data-dsh-claude-style] .dsh-claude-model-status {",
1985
+ " color: var(--dsw-alias-label-tertiary, #8f8d84) !important;",
1986
+ " font-size: 12px !important;",
1987
+ " line-height: 20px !important;",
1988
+ " padding: 4px 8px !important;",
1989
+ "}",
1990
+ "body[data-dsh-claude-style] .dsh-claude-model-group {",
1991
+ " color: var(--dsw-alias-label-tertiary, #8f8d84) !important;",
1992
+ " font-size: 11px !important;",
1993
+ " line-height: 16px !important;",
1994
+ " padding: 2px 8px 0 8px !important;",
1995
+ "}",
1996
+ "/* Model / effort option: same row metrics and hover as the drawer items. */",
1997
+ "body[data-dsh-claude-style] .dsh-claude-model-option {",
1998
+ " display: flex !important;",
1999
+ " align-items: center !important;",
2000
+ " gap: 8px !important;",
2001
+ " width: 100% !important;",
2002
+ " min-height: 32px !important;",
2003
+ " padding: 4px 8px !important;",
2004
+ " border: none !important;",
2005
+ " border-radius: 6px !important;",
2006
+ " background: transparent !important;",
2007
+ " color: var(--dsw-alias-label-primary, #141413) !important;",
2008
+ " font-size: 13px !important;",
2009
+ " text-align: left !important;",
2010
+ " cursor: pointer !important;",
2011
+ " box-sizing: border-box !important;",
2012
+ "}",
2013
+ "body[data-dsh-claude-style] .dsh-claude-model-option:hover {",
2014
+ " background: var(--dsh-claude-hover-bg, rgba(0, 0, 0, 0.08)) !important;",
2015
+ "}",
2016
+ "body[data-dsh-claude-style] .dsh-claude-model-copy {",
2017
+ " display: flex !important;",
2018
+ " flex-direction: column !important;",
2019
+ " gap: 2px !important;",
2020
+ " flex: 1 !important;",
2021
+ " min-width: 0 !important;",
2022
+ "}",
2023
+ "body[data-dsh-claude-style] .dsh-claude-model-name {",
2024
+ " font-size: 13px !important;",
2025
+ " font-weight: 500 !important;",
2026
+ " line-height: 16px !important;",
2027
+ "}",
2028
+ "body[data-dsh-claude-style] .dsh-claude-model-desc {",
2029
+ " font-size: 11px !important;",
2030
+ " line-height: 14px !important;",
2031
+ " color: var(--dsw-alias-label-tertiary, #8f8d84) !important;",
2032
+ "}",
2033
+ "body[data-dsh-claude-style] .dsh-claude-model-check {",
2034
+ " flex: none !important;",
2035
+ " display: inline-flex !important;",
2036
+ " align-items: center !important;",
2037
+ " color: var(--dsw-alias-brand-primary, #d97757) !important;",
2038
+ "}",
2039
+ "body[data-dsh-claude-style] .dsh-claude-model-divider {",
2040
+ " height: 1px !important;",
2041
+ " background: var(--dsw-alias-border-l1, #e8e6dc) !important;",
2042
+ " margin: 2px 4px !important;",
2043
+ " flex: none !important;",
2044
+ "}",
2045
+ "/* Level-2 row: label + current value + chevron; hover opens its own level. */",
2046
+ "body[data-dsh-claude-style] .dsh-claude-model-cell {",
2047
+ " display: flex !important;",
2048
+ " align-items: center !important;",
2049
+ " gap: 8px !important;",
2050
+ " width: 100% !important;",
2051
+ " min-height: 32px !important;",
2052
+ " padding: 4px 8px !important;",
2053
+ " border: none !important;",
2054
+ " border-radius: 6px !important;",
2055
+ " background: transparent !important;",
2056
+ " color: var(--dsw-alias-label-primary, #141413) !important;",
2057
+ " font-size: 13px !important;",
2058
+ " text-align: left !important;",
2059
+ " cursor: pointer !important;",
2060
+ " box-sizing: border-box !important;",
2061
+ "}",
2062
+ "body[data-dsh-claude-style] .dsh-claude-model-cell:hover {",
2063
+ " background: var(--dsh-claude-hover-bg, rgba(0, 0, 0, 0.08)) !important;",
2064
+ "}",
2065
+ "body[data-dsh-claude-style] .dsh-claude-model-cell-label {",
2066
+ " flex: 1 !important;",
2067
+ " min-width: 0 !important;",
2068
+ "}",
2069
+ "body[data-dsh-claude-style] .dsh-claude-model-cell-value {",
2070
+ " flex: none !important;",
2071
+ " color: var(--dsw-alias-label-tertiary, #8f8d84) !important;",
2072
+ " font-size: 12px !important;",
2073
+ "}",
2074
+ "body[data-dsh-claude-style] .dsh-claude-model-cell-chevron {",
2075
+ " flex: none !important;",
2076
+ " display: inline-flex !important;",
2077
+ " align-items: center !important;",
2078
+ " color: var(--dsw-alias-label-caption, #a6a094) !important;",
2079
+ "}",
2080
+ "",
1815
2081
  "/* Popover Header */",
1816
2082
  "body[data-dsh-claude-style] .dsh-claude-account-popover-header {",
1817
2083
  " padding: 6px 8px 6px 8px !important;",
@@ -2138,11 +2404,29 @@ window.__ModuleLoader__.load({
2138
2404
  return null
2139
2405
  }
2140
2406
 
2407
+ /**
2408
+ * The current-session selection left the Session Controller in dsh 0.2:
2409
+ * the list snapshot no longer carries `current`, and the main-view
2410
+ * selection is projected by the `uiSession` service as a binding source
2411
+ * whose `value.key` is the selected session id (`undefined` when no
2412
+ * session is materialized). Read the new source first and fall back to
2413
+ * the legacy `list.current` so older hosts keep working.
2414
+ */
2415
+ function currentSessionId(ctx, sessions) {
2416
+ try {
2417
+ var uiSession = ctx.get('uiSession')
2418
+ var current = uiSession === void 0 || uiSession === null ? null : uiSession.current
2419
+ var value = current === void 0 || current === null ? null : current.value
2420
+ if (value !== void 0 && value !== null && typeof value.key === 'string') return value.key
2421
+ } catch (error) { /* fall through to the legacy snapshot field */ }
2422
+ return sessions.list.getSnapshot().current
2423
+ }
2424
+
2141
2425
  function currentSession(ctx) {
2142
2426
  var sessions = ctx.get('sessions')
2143
2427
  if (sessions === void 0 || sessions === null) return null
2144
- var id = sessions.list.getSnapshot().current
2145
- if (id === void 0) return null
2428
+ var id = currentSessionId(ctx, sessions)
2429
+ if (id === void 0 || id === null) return null
2146
2430
  var binding = sessions.binding(id)
2147
2431
  if (binding === void 0 || binding === null) return null
2148
2432
  return binding.session === void 0 ? null : binding.session
@@ -2151,7 +2435,11 @@ window.__ModuleLoader__.load({
2151
2435
  function currentPreset(session) {
2152
2436
  try {
2153
2437
  var snapshot = session.projections.faceOf('permissions').getSnapshot()
2154
- return snapshot === void 0 ? null : snapshot.currentValue
2438
+ if (snapshot === void 0 || snapshot === null) return null
2439
+ // dsh 0.2+ projection faces hand back the bare value (e.g. the preset
2440
+ // id string); older hosts wrapped it as `{ currentValue }`.
2441
+ if (typeof snapshot === 'object' && 'currentValue' in snapshot) return snapshot.currentValue
2442
+ return snapshot
2155
2443
  } catch (error) {
2156
2444
  return null
2157
2445
  }
@@ -2575,16 +2863,43 @@ window.__ModuleLoader__.load({
2575
2863
  }
2576
2864
  }
2577
2865
 
2578
- function restoreStatsPosition() {
2866
+ /**
2867
+ * Merge the session-stats pills into the composer toolbar row so the
2868
+ * controls and the stats share ONE line. The host renders the pills
2869
+ * (the `conversation.composer.dock` slot) as the card's sibling — a
2870
+ * full-width line of their own below the input box; the skin moves
2871
+ * them into the row, right before the trailing model/status group.
2872
+ * A host re-render can put them back, so the move is re-applied on
2873
+ * every pass and is a no-op once they are in place.
2874
+ */
2875
+ function mergeStatsIntoRow() {
2579
2876
  var stats = document.querySelector('[data-composer-stats]')
2877
+ if (!stats) return
2580
2878
  // `[class*="_row"]`, not `[class*="row"]`: the bare substring also
2581
2879
  // matches the input growth wrapper (`grow` contains `row`).
2582
- if (stats && stats.parentElement && (stats.parentElement.matches && stats.parentElement.matches('[class*="_row"]') || stats.parentElement.querySelector('[class*="tools"]'))) {
2583
- var card = stats.closest('[data-composer-card]')
2584
- if (card && card.parentNode) {
2585
- card.parentNode.insertBefore(stats, card.nextSibling)
2880
+ var row = null
2881
+ if (stats.parentElement && stats.parentElement.matches && stats.parentElement.matches('[class*="_row"]')) {
2882
+ row = stats.parentElement
2883
+ } else {
2884
+ // Host default: the pills sit in a slot anchor beside the card.
2885
+ // Walk up to the nearest ancestor that also holds a composer card.
2886
+ var node = stats.parentElement
2887
+ while (node && node !== document.body && row === null) {
2888
+ var card = node.querySelector('[data-composer-card]')
2889
+ if (card) {
2890
+ var r = card.querySelector('[class*="_row"]')
2891
+ if (r) row = r
2892
+ }
2893
+ node = node.parentElement
2586
2894
  }
2587
2895
  }
2896
+ if (row === null) return
2897
+ var trailing = row.querySelector('[class*="trailing"]')
2898
+ var inPlace = stats.parentElement === row &&
2899
+ (trailing !== null ? stats.nextElementSibling === trailing : row.lastElementChild === stats)
2900
+ if (inPlace) return
2901
+ if (trailing !== null) row.insertBefore(stats, trailing)
2902
+ else row.appendChild(stats)
2588
2903
  }
2589
2904
 
2590
2905
  // Re-insert when a re-render swapped the host row, then mirror the running preset.
@@ -2668,6 +2983,512 @@ window.__ModuleLoader__.load({
2668
2983
  }
2669
2984
  }
2670
2985
 
2986
+ /**
2987
+ * The composer is chat-view-only. The host mounts the seat inside the
2988
+ * conversation root on every tab (轨迹 / 上下文 even reserve room for
2989
+ * it), so the skin reflects the active view on <body> and CSS drops the
2990
+ * whole bottom area unless the chat tab is selected.
2991
+ *
2992
+ * Scope: the conversation tablist lives in the panel header, which is
2993
+ * the root's first child — any other tablist (the trajectory detail
2994
+ * panel, say) renders later inside the ledger. The chat view registers
2995
+ * at order 0, so it is always the tablist's FIRST tab; reading that
2996
+ * tab's aria-selected is locale-independent. No tab bar at all (hero /
2997
+ * single view) means the chat surface is all there is.
2998
+ */
2999
+ function syncChatTabComposer() {
3000
+ var chatActive = true
3001
+ var seat = document.querySelector('[data-composer-seat]')
3002
+ var root = seat && seat.closest ? seat.closest('[data-phase]') : null
3003
+ if (root) {
3004
+ var list = root.querySelector('[role="tablist"]')
3005
+ if (list) {
3006
+ var first = list.querySelector('[role="tab"]')
3007
+ if (first) chatActive = first.getAttribute('aria-selected') === 'true'
3008
+ }
3009
+ }
3010
+ if (chatActive) document.body.removeAttribute('data-dsh-claude-composer-hidden')
3011
+ else document.body.setAttribute('data-dsh-claude-composer-hidden', '')
3012
+ }
3013
+
3014
+ // --- 4.4 Model picker: replaces the host's model seat ---
3015
+ /**
3016
+ * The host's model seat is a click-triggered two-pane menu (Model /
3017
+ * Effort rows drilling into their own lists). The skin replaces it with
3018
+ * a Claude-style picker: hovering the trigger opens the first level —
3019
+ * the DeepSeek official provider's models, a divider, then the
3020
+ * reasoning-effort row (when the current model offers one) and a More
3021
+ * models row; both open their second level BESIDE the first level.
3022
+ *
3023
+ * Data and submission ride the host's own per-session ModelDirectory
3024
+ * (`ctx.modelDirectories`), the same store the host's menu and the
3025
+ * /model command read — so the current selection, catalog and errors
3026
+ * stay in sync without scraping the DOM. The host's seat is hidden and
3027
+ * marked; a React swap re-marks it on the next pass.
3028
+ */
3029
+ var modelBtn = null
3030
+ var modelPop = null
3031
+ var modelSubPop = null
3032
+ var modelBody = null
3033
+ var modelSubBody = null
3034
+ var modelCloseTimer = null
3035
+ var modelDir = null
3036
+ var modelSub = null
3037
+ var modelSessionId = null
3038
+ var modelSubKind = null
3039
+ var modelBodySig = ''
3040
+ var modelSubSig = ''
3041
+
3042
+ function cancelCloseModel() {
3043
+ if (modelCloseTimer) {
3044
+ clearTimeout(modelCloseTimer)
3045
+ modelCloseTimer = null
3046
+ }
3047
+ }
3048
+
3049
+ function scheduleCloseModel() {
3050
+ cancelCloseModel()
3051
+ modelCloseTimer = setTimeout(function () {
3052
+ closeModelPopovers()
3053
+ }, 180)
3054
+ }
3055
+
3056
+ function closeModelPopovers() {
3057
+ cancelCloseModel()
3058
+ if (modelPop) modelPop.setAttribute('data-open', 'false')
3059
+ if (modelSubPop) modelSubPop.setAttribute('data-open', 'false')
3060
+ modelSubKind = null
3061
+ }
3062
+
3063
+ function openModelPopover() {
3064
+ cancelCloseModel()
3065
+ modelDirectory()
3066
+ // load() is async — the host itself guards with .catch(() => {}); a bare
3067
+ // try/catch cannot see its rejection.
3068
+ if (modelDir && typeof modelDir.load === 'function') {
3069
+ try {
3070
+ var pending = modelDir.load()
3071
+ if (pending && typeof pending.catch === 'function') {
3072
+ pending.catch(function () { /* the store's error surface covers a failure */ })
3073
+ }
3074
+ } catch (error) { /* synchronous failure — the store's error surface covers it */ }
3075
+ }
3076
+ modelSubKind = null
3077
+ if (modelSubPop) modelSubPop.setAttribute('data-open', 'false')
3078
+ positionModelPopovers()
3079
+ if (modelPop) modelPop.setAttribute('data-open', 'true')
3080
+ }
3081
+
3082
+ function openModelSub(kind) {
3083
+ cancelCloseModel()
3084
+ modelSubKind = kind
3085
+ positionModelPopovers()
3086
+ if (modelSubPop) modelSubPop.setAttribute('data-open', 'true')
3087
+ }
3088
+
3089
+ /**
3090
+ * The current session id. The Session Controller dropped
3091
+ * `list.current` in dsh 0.2 (the main-view selection now comes from the
3092
+ * `uiSession` projection), so this MUST go through the shared
3093
+ * currentSessionId() in context.js — reading the legacy field directly
3094
+ * resolves to null on current hosts and the picker never loads.
3095
+ */
3096
+ function currentModelSessionId() {
3097
+ try {
3098
+ var sessions = ctx.get('sessions')
3099
+ if (sessions === void 0 || sessions === null) return null
3100
+ var id = currentSessionId(ctx, sessions)
3101
+ return id === void 0 || id === null ? null : id
3102
+ } catch (error) {
3103
+ return null
3104
+ }
3105
+ }
3106
+
3107
+ function dropModelSubscription() {
3108
+ if (modelSub) {
3109
+ try { modelSub() } catch (error) { /* already disposed */ }
3110
+ }
3111
+ modelSub = null
3112
+ }
3113
+
3114
+ /** Resolve the session's directory (and observe it) once per session. */
3115
+ function modelDirectory() {
3116
+ var id = currentModelSessionId()
3117
+ if (id === null) {
3118
+ dropModelSubscription()
3119
+ modelDir = null
3120
+ modelSessionId = null
3121
+ return null
3122
+ }
3123
+ if (modelSessionId === id && modelDir !== null) return modelDir
3124
+ dropModelSubscription()
3125
+ modelDir = null
3126
+ modelSessionId = null
3127
+ try {
3128
+ var dirs = ctx.get('modelDirectories')
3129
+ if (dirs && typeof dirs.directoryFor === 'function') {
3130
+ modelDir = dirs.directoryFor(id)
3131
+ }
3132
+ } catch (error) {
3133
+ modelDir = null
3134
+ }
3135
+ modelSessionId = id
3136
+ // The directory INSTANCE only carries load/select — its reactive state
3137
+ // hangs off the `.store` snapshot store (the host hands that same store
3138
+ // to its own menu as `directory`). Subscribe to the store, never to the
3139
+ // instance, and never let a subscribe failure discard the directory.
3140
+ if (modelDir !== null) {
3141
+ var store = modelDir.store
3142
+ if (store && typeof store.subscribe === 'function') {
3143
+ try {
3144
+ modelSub = store.subscribe(function () { schedule() })
3145
+ } catch (error) {
3146
+ modelSub = null
3147
+ }
3148
+ }
3149
+ }
3150
+ return modelDir
3151
+ }
3152
+
3153
+ function modelSnapshot() {
3154
+ if (modelDir === null || !modelDir.store) return null
3155
+ try { return modelDir.store.getSnapshot() } catch (error) { return null }
3156
+ }
3157
+
3158
+ /** The current selection resolved to its group + model entries. */
3159
+ function modelCurrent(snap) {
3160
+ if (!snap || snap.current === null) return null
3161
+ for (var g = 0; g < snap.groups.length; g++) {
3162
+ var group = snap.groups[g]
3163
+ if (group.id !== snap.current.provider) continue
3164
+ for (var m = 0; m < group.models.length; m++) {
3165
+ if (group.models[m].id === snap.current.model) return { group: group, model: group.models[m] }
3166
+ }
3167
+ }
3168
+ return null
3169
+ }
3170
+
3171
+ /** Reasoning metadata + the effective effort for the current model. */
3172
+ function modelEffort(snap) {
3173
+ var current = modelCurrent(snap)
3174
+ if (current === null || !current.model.reasoning) return null
3175
+ var reasoning = current.model.reasoning
3176
+ var effective = snap.current.reasoningEffort !== void 0 ? snap.current.reasoningEffort : reasoning.defaultEffort
3177
+ var label = MODEL_EFFORT_DEFAULT
3178
+ if (effective !== void 0) {
3179
+ label = effective
3180
+ for (var i = 0; i < reasoning.efforts.length; i++) {
3181
+ if (reasoning.efforts[i].id === effective) {
3182
+ label = reasoning.efforts[i].name
3183
+ break
3184
+ }
3185
+ }
3186
+ }
3187
+ return { reasoning: reasoning, effective: effective, label: label }
3188
+ }
3189
+
3190
+ function modelDescription(groupId, model) {
3191
+ var key = groupId + '/' + model.id
3192
+ if (MODEL_DESCRIPTIONS[key]) return MODEL_DESCRIPTIONS[key]
3193
+ return model.description || ''
3194
+ }
3195
+
3196
+ function modelEl(tag, cls, text) {
3197
+ var el = document.createElement(tag)
3198
+ if (cls) el.className = cls
3199
+ if (text !== void 0 && text !== null) el.textContent = text
3200
+ return el
3201
+ }
3202
+
3203
+ var MODEL_CHECK_SVG = '<svg viewBox="0 0 16 16" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M3 8.5l3.2 3.2L13 5"/></svg>'
3204
+ var MODEL_CHEVRON_SVG = '<svg viewBox="0 0 16 16" width="12" height="12" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M6 4l4 4-4 4"/></svg>'
3205
+ var MODEL_CHEVRON_DOWN_SVG = '<svg viewBox="0 0 16 16" width="12" height="12" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 6l4 4 4-4"/></svg>'
3206
+
3207
+ /** One selectable model row: name (+ description) and a check when current. */
3208
+ function buildModelOption(group, model, selected) {
3209
+ var item = modelEl('button', 'dsh-claude-model-option')
3210
+ item.type = 'button'
3211
+ item.setAttribute('role', 'menuitemradio')
3212
+ item.setAttribute('aria-checked', selected ? 'true' : 'false')
3213
+ var copy = modelEl('span', 'dsh-claude-model-copy')
3214
+ copy.appendChild(modelEl('span', 'dsh-claude-model-name', model.name))
3215
+ var desc = modelDescription(group.id, model)
3216
+ if (desc) copy.appendChild(modelEl('span', 'dsh-claude-model-desc', desc))
3217
+ item.appendChild(copy)
3218
+ var check = modelEl('span', 'dsh-claude-model-check')
3219
+ check.innerHTML = selected ? MODEL_CHECK_SVG : ''
3220
+ item.appendChild(check)
3221
+ item.addEventListener('click', (function (g, m) {
3222
+ return function (e) {
3223
+ e.stopPropagation()
3224
+ pickModel(g, m)
3225
+ }
3226
+ })(group.id, model.id))
3227
+ return item
3228
+ }
3229
+
3230
+ /** One level-2 row: label + current value + chevron, hover opens its level. */
3231
+ function buildModelCell(label, value, kind) {
3232
+ var cell = modelEl('button', 'dsh-claude-model-cell')
3233
+ cell.type = 'button'
3234
+ cell.setAttribute('role', 'menuitem')
3235
+ cell.appendChild(modelEl('span', 'dsh-claude-model-cell-label', label))
3236
+ if (value) cell.appendChild(modelEl('span', 'dsh-claude-model-cell-value', value))
3237
+ var chevron = modelEl('span', 'dsh-claude-model-cell-chevron')
3238
+ chevron.innerHTML = MODEL_CHEVRON_SVG
3239
+ cell.appendChild(chevron)
3240
+ cell.addEventListener('mouseenter', (function (k) {
3241
+ return function () { openModelSub(k) }
3242
+ })(kind))
3243
+ cell.addEventListener('click', (function (k) {
3244
+ return function (e) {
3245
+ e.stopPropagation()
3246
+ if (modelSubKind === k) closeModelPopovers()
3247
+ else openModelSub(k)
3248
+ }
3249
+ })(kind))
3250
+ return cell
3251
+ }
3252
+
3253
+ function pickModel(provider, modelId) {
3254
+ var dir = modelDirectory()
3255
+ if (dir === null) return
3256
+ try {
3257
+ // select() is async and rejects on a failed selection; swallow the
3258
+ // rejection the way the host's own seat wrapper does.
3259
+ var pending = dir.select({ provider: provider, model: modelId })
3260
+ if (pending && typeof pending.catch === 'function') pending.catch(function () {})
3261
+ } catch (error) { /* rejected selections surface on the host's toast */ }
3262
+ closeModelPopovers()
3263
+ }
3264
+
3265
+ function pickEffort(effort) {
3266
+ var dir = modelDirectory()
3267
+ var snap = modelSnapshot()
3268
+ if (dir === null || !snap || snap.current === null) return
3269
+ var selection = { provider: snap.current.provider, model: snap.current.model }
3270
+ if (effort !== void 0) selection.reasoningEffort = effort
3271
+ try {
3272
+ var pending = dir.select(selection)
3273
+ if (pending && typeof pending.catch === 'function') pending.catch(function () {})
3274
+ } catch (error) { /* rejected selections surface on the host's toast */ }
3275
+ closeModelPopovers()
3276
+ }
3277
+
3278
+ /** Level 1: the official provider's models, divider, effort + more rows. */
3279
+ function renderModelBody() {
3280
+ if (!modelBody) return
3281
+ var snap = modelSnapshot()
3282
+ var status = snap ? snap.status : 'idle'
3283
+ var groups = (snap && snap.groups) || []
3284
+ var current = modelCurrent(snap)
3285
+ var effort = modelEffort(snap)
3286
+ var sig = [status, current ? current.group.id + '/' + current.model.id : '', effort ? String(effort.effective) : ''].join('|')
3287
+ for (var g = 0; g < groups.length; g++) sig += ';' + groups[g].id + ':' + groups[g].models.length
3288
+ if (sig === modelBodySig) return
3289
+ modelBodySig = sig
3290
+ while (modelBody.firstChild) modelBody.removeChild(modelBody.firstChild)
3291
+
3292
+ if (status === 'idle' || status === 'loading' || status === 'selecting') {
3293
+ modelBody.appendChild(modelEl('div', 'dsh-claude-model-status', MODEL_LOADING_LABEL))
3294
+ } else {
3295
+ var official = null
3296
+ for (var g2 = 0; g2 < groups.length; g2++) {
3297
+ if (groups[g2].id === MODEL_OFFICIAL_GROUP) { official = groups[g2]; break }
3298
+ }
3299
+ var rows = []
3300
+ if (official) {
3301
+ for (var m = 0; m < official.models.length; m++) rows.push({ group: official, model: official.models[m] })
3302
+ } else {
3303
+ for (var g3 = 0; g3 < groups.length; g3++) {
3304
+ for (var m2 = 0; m2 < groups[g3].models.length; m2++) rows.push({ group: groups[g3], model: groups[g3].models[m2] })
3305
+ }
3306
+ }
3307
+ if (rows.length === 0) {
3308
+ modelBody.appendChild(modelEl('div', 'dsh-claude-model-status', MODEL_EMPTY_LABEL))
3309
+ } else {
3310
+ for (var r = 0; r < rows.length; r++) {
3311
+ var selected = current !== null && current.group.id === rows[r].group.id && current.model.id === rows[r].model.id
3312
+ modelBody.appendChild(buildModelOption(rows[r].group, rows[r].model, selected))
3313
+ }
3314
+ }
3315
+ modelBody.appendChild(modelEl('div', 'dsh-claude-model-divider'))
3316
+ if (effort) modelBody.appendChild(buildModelCell(MODEL_EFFORT_LABEL, effort.label, 'effort'))
3317
+ modelBody.appendChild(buildModelCell(MODEL_MORE_LABEL, '', 'more'))
3318
+ }
3319
+ }
3320
+
3321
+ /** Level 2: the effort ladder, or every provider group's models. */
3322
+ function renderModelSub() {
3323
+ if (!modelSubBody) return
3324
+ var snap = modelSnapshot()
3325
+ if (modelSubKind === 'effort') {
3326
+ var effort = modelEffort(snap)
3327
+ var sig = 'effort:' + (effort ? String(effort.effective) : 'none')
3328
+ if (sig === modelSubSig) return
3329
+ modelSubSig = sig
3330
+ while (modelSubBody.firstChild) modelSubBody.removeChild(modelSubBody.firstChild)
3331
+ if (effort === null) {
3332
+ modelSubBody.appendChild(modelEl('div', 'dsh-claude-model-status', '当前模型未提供推理等级。'))
3333
+ return
3334
+ }
3335
+ var levels = []
3336
+ if (effort.reasoning.defaultEffort === void 0) levels.push({ effort: void 0, label: MODEL_EFFORT_DEFAULT })
3337
+ for (var i = 0; i < effort.reasoning.efforts.length; i++) {
3338
+ levels.push({ effort: effort.reasoning.efforts[i].id, label: effort.reasoning.efforts[i].name })
3339
+ }
3340
+ for (var l = 0; l < levels.length; l++) {
3341
+ (function (level, active) {
3342
+ var item = modelEl('button', 'dsh-claude-model-option')
3343
+ item.type = 'button'
3344
+ item.setAttribute('role', 'menuitemradio')
3345
+ item.setAttribute('aria-checked', active ? 'true' : 'false')
3346
+ item.appendChild(modelEl('span', 'dsh-claude-model-copy', level.label))
3347
+ var check = modelEl('span', 'dsh-claude-model-check')
3348
+ check.innerHTML = active ? MODEL_CHECK_SVG : ''
3349
+ item.appendChild(check)
3350
+ item.addEventListener('click', function (e) {
3351
+ e.stopPropagation()
3352
+ pickEffort(level.effort)
3353
+ })
3354
+ modelSubBody.appendChild(item)
3355
+ })(levels[l], effort.effective === levels[l].effort)
3356
+ }
3357
+ return
3358
+ }
3359
+ // 'more': every provider group, headed by its name.
3360
+ var groups = (snap && snap.groups) || []
3361
+ var current = modelCurrent(snap)
3362
+ var sig2 = 'more'
3363
+ for (var g = 0; g < groups.length; g++) sig2 += ';' + groups[g].id + ':' + groups[g].models.length
3364
+ if (current) sig2 += '#' + current.group.id + '/' + current.model.id
3365
+ if (sig2 === modelSubSig) return
3366
+ modelSubSig = sig2
3367
+ while (modelSubBody.firstChild) modelSubBody.removeChild(modelSubBody.firstChild)
3368
+ for (var g2 = 0; g2 < groups.length; g2++) {
3369
+ var group = groups[g2]
3370
+ if (group.models.length === 0) continue
3371
+ modelSubBody.appendChild(modelEl('div', 'dsh-claude-model-group', group.name))
3372
+ for (var m = 0; m < group.models.length; m++) {
3373
+ var selected = current !== null && current.group.id === group.id && current.model.id === group.models[m].id
3374
+ modelSubBody.appendChild(buildModelOption(group, group.models[m], selected))
3375
+ }
3376
+ }
3377
+ if (modelSubBody.firstChild === null) {
3378
+ modelSubBody.appendChild(modelEl('div', 'dsh-claude-model-status', MODEL_EMPTY_LABEL))
3379
+ }
3380
+ }
3381
+
3382
+ function positionModelPopovers() {
3383
+ if (!modelBtn || !modelPop) return
3384
+ var rect = modelBtn.getBoundingClientRect()
3385
+ var MARGIN = 8
3386
+ var w = modelPop.offsetWidth
3387
+ var h = modelPop.offsetHeight
3388
+ var x = Math.max(MARGIN, Math.min(rect.right - w, window.innerWidth - w - MARGIN))
3389
+ var y = rect.top - 6 - h
3390
+ if (y < MARGIN) y = Math.min(rect.bottom + 6, Math.max(MARGIN, window.innerHeight - h - MARGIN))
3391
+ modelPop.style.left = x + 'px'
3392
+ modelPop.style.top = y + 'px'
3393
+ if (modelSubPop && modelSubPop.getAttribute('data-open') === 'true') {
3394
+ var w2 = modelSubPop.offsetWidth
3395
+ var h2 = modelSubPop.offsetHeight
3396
+ // Beside the first level; flip to its left when the viewport is tight.
3397
+ var x2 = x + w + 4
3398
+ if (x2 + w2 > window.innerWidth - MARGIN) x2 = Math.max(MARGIN, x - 4 - w2)
3399
+ var y2 = Math.max(MARGIN, Math.min(y, window.innerHeight - h2 - MARGIN))
3400
+ modelSubPop.style.left = x2 + 'px'
3401
+ modelSubPop.style.top = y2 + 'px'
3402
+ }
3403
+ }
3404
+
3405
+ function ensureModelChrome() {
3406
+ if (modelPop === null) {
3407
+ modelPop = document.createElement('div')
3408
+ modelPop.className = 'dsh-claude-model-popover'
3409
+ modelPop.setAttribute('role', 'menu')
3410
+ modelPop.setAttribute('data-open', 'false')
3411
+ modelBody = document.createElement('div')
3412
+ modelBody.className = 'dsh-claude-model-popover-body'
3413
+ modelPop.appendChild(modelBody)
3414
+ modelPop.addEventListener('mouseenter', cancelCloseModel)
3415
+ modelPop.addEventListener('mouseleave', scheduleCloseModel)
3416
+ document.body.appendChild(modelPop)
3417
+ }
3418
+ if (modelSubPop === null) {
3419
+ modelSubPop = document.createElement('div')
3420
+ modelSubPop.className = 'dsh-claude-model-popover dsh-claude-model-popover-sub'
3421
+ modelSubPop.setAttribute('role', 'menu')
3422
+ modelSubPop.setAttribute('data-open', 'false')
3423
+ modelSubBody = document.createElement('div')
3424
+ modelSubBody.className = 'dsh-claude-model-popover-body'
3425
+ modelSubPop.appendChild(modelSubBody)
3426
+ modelSubPop.addEventListener('mouseenter', cancelCloseModel)
3427
+ modelSubPop.addEventListener('mouseleave', scheduleCloseModel)
3428
+ document.body.appendChild(modelSubPop)
3429
+ }
3430
+ }
3431
+
3432
+ /** Build/refresh the trigger, its label and the popover rows. */
3433
+ function syncModelControl() {
3434
+ modelDirectory()
3435
+ var slot = document.querySelector('[data-slot="conversation.input.model"]')
3436
+ if (slot === null) return
3437
+ // Hide the host's own seat (React owns the node; re-mark on swap).
3438
+ var hostRoot = slot.firstElementChild
3439
+ if (hostRoot !== null && !hostRoot.hasAttribute('data-dsh-claude-model-host')) {
3440
+ hostRoot.setAttribute('data-dsh-claude-model-host', '')
3441
+ }
3442
+ if (modelBtn === null || modelBtn.parentElement !== slot) {
3443
+ if (modelBtn !== null && modelBtn.parentElement !== null) modelBtn.parentElement.removeChild(modelBtn)
3444
+ modelBtn = document.createElement('button')
3445
+ modelBtn.type = 'button'
3446
+ modelBtn.className = 'dsh-claude-model-btn'
3447
+ modelBtn.setAttribute('aria-haspopup', 'menu')
3448
+ modelBtn.innerHTML =
3449
+ '<span class="dsh-claude-model-btn-label"></span>' +
3450
+ '<span class="dsh-claude-model-btn-chevron">' + MODEL_CHEVRON_DOWN_SVG + '</span>'
3451
+ modelBtn.addEventListener('mouseenter', function () { openModelPopover() })
3452
+ modelBtn.addEventListener('mouseleave', scheduleCloseModel)
3453
+ modelBtn.addEventListener('click', function (e) {
3454
+ e.stopPropagation()
3455
+ if (modelPop && modelPop.getAttribute('data-open') === 'true') closeModelPopovers()
3456
+ else openModelPopover()
3457
+ })
3458
+ slot.appendChild(modelBtn)
3459
+ }
3460
+ ensureModelChrome()
3461
+
3462
+ var snap = modelSnapshot()
3463
+ var current = modelCurrent(snap)
3464
+ var effort = modelEffort(snap)
3465
+ var label = current ? current.model.name : MODEL_FALLBACK_LABEL
3466
+ var labelEl = modelBtn.querySelector('.dsh-claude-model-btn-label')
3467
+ if (labelEl) {
3468
+ labelEl.textContent = label
3469
+ labelEl.classList.toggle('dsh-claude-model-btn-loading', !!(snap && (snap.status === 'loading' || snap.status === 'idle' || snap.status === 'selecting')))
3470
+ }
3471
+ var effortEl = modelBtn.querySelector('.dsh-claude-model-btn-effort')
3472
+ if (effort) {
3473
+ if (effortEl === null) {
3474
+ effortEl = modelEl('span', 'dsh-claude-model-btn-effort')
3475
+ modelBtn.insertBefore(effortEl, modelBtn.firstChild ? labelEl.nextSibling : null)
3476
+ }
3477
+ effortEl.textContent = '· ' + effort.label
3478
+ } else if (effortEl !== null && effortEl.parentElement) {
3479
+ effortEl.parentElement.removeChild(effortEl)
3480
+ }
3481
+ modelBtn.setAttribute('aria-label', '选择模型,当前 ' + label)
3482
+ modelBtn.disabled = false
3483
+
3484
+ renderModelBody()
3485
+ if (modelSubKind !== null) {
3486
+ renderModelSub()
3487
+ if (modelSubPop && modelSubPop.getAttribute('data-open') === 'true') positionModelPopovers()
3488
+ }
3489
+ if (modelPop && modelPop.getAttribute('data-open') === 'true') positionModelPopovers()
3490
+ }
3491
+
2671
3492
  // --- 4.3 Account Footer & Popover ---
2672
3493
  var accountBtn = null
2673
3494
  var accountPopover = null
@@ -2680,6 +3501,13 @@ window.__ModuleLoader__.load({
2680
3501
  clearTimeout(popoverTimer)
2681
3502
  popoverTimer = null
2682
3503
  }
3504
+ // Mirrors are frozen while the popover is open (syncPopoverItems
3505
+ // bails), so reconcile them here — before the reveal — to show fresh
3506
+ // content/order and bind click targets for the upcoming interaction.
3507
+ try {
3508
+ var footArea = document.querySelector('[class*="footArea"]')
3509
+ if (footArea) syncPopoverItems(footArea)
3510
+ } catch (error) { /* opening must never fail because of a mirror sync */ }
2683
3511
  accountPopover.setAttribute('data-open', 'true')
2684
3512
  accountBtn.setAttribute('data-open', 'true')
2685
3513
  accountBtn.setAttribute('aria-expanded', 'true')
@@ -2766,6 +3594,15 @@ window.__ModuleLoader__.load({
2766
3594
  var footerActions = footArea.querySelector('[class*="footerActions"]')
2767
3595
  var footerEntries = syncFooterActionVisibility(footerActions)
2768
3596
 
3597
+ // While the popover is open, its mirrors must stay completely static:
3598
+ // a content rewrite, reorder, or embedded-clone replacement under the
3599
+ // pointer cancels the browser's :hover state and can swallow the click
3600
+ // between pointerdown and pointerup. Sync runs only while closed;
3601
+ // openPopover runs one final pass right before the reveal — and the
3602
+ // sidebar-side redirection above stays live, so a newly mounted entry
3603
+ // keeps being hidden even with the popover open.
3604
+ if (accountPopover && accountPopover.getAttribute('data-open') === 'true') return
3605
+
2769
3606
  var existingActionItems = popoverBody.querySelectorAll('[data-action-index], [data-embed-index]')
2770
3607
  for (var ea = 0; ea < existingActionItems.length; ea++) {
2771
3608
  var staleIdx = parseInt(existingActionItems[ea].getAttribute('data-action-index') || existingActionItems[ea].getAttribute('data-embed-index'), 10)
@@ -2775,7 +3612,8 @@ window.__ModuleLoader__.load({
2775
3612
  }
2776
3613
 
2777
3614
  for (var f = 0; f < footerEntries.length; f++) {
2778
- (function (entry, idx) {
3615
+ try {
3616
+ (function (entry, idx) {
2779
3617
  var trigger = findFooterTrigger(entry)
2780
3618
  var hasContent = (entry.textContent || '').trim() !== '' ||
2781
3619
  entry.querySelector('svg, img, canvas') !== null
@@ -2817,11 +3655,26 @@ window.__ModuleLoader__.load({
2817
3655
  item.addEventListener('click', function (e) {
2818
3656
  e.stopPropagation()
2819
3657
  closePopover()
2820
- // The activator is rebound on every sync pass
3658
+ // The activator is rebound on every (closed-state) sync pass
2821
3659
  // (`item.__dshActivator`), never captured at creation — the
2822
3660
  // host re-sorts list slots by `order` on each render, so the
2823
3661
  // entry behind an index changes over time.
2824
3662
  var live = item.__dshActivator
3663
+ if (!live || typeof live.click !== 'function') {
3664
+ // Safety net: re-resolve the current trigger for this index
3665
+ // from the live footer DOM. Covers the rare case where the
3666
+ // stored node was detached by a host re-render while the
3667
+ // popover was open.
3668
+ try {
3669
+ var fa = document.querySelector('[class*="footArea"]')
3670
+ var actions = fa ? fa.querySelector('[class*="footerActions"]') : null
3671
+ var liveEntries = actions ? footerEntriesOf(actions) : []
3672
+ var liveEntry = liveEntries[idx] || null
3673
+ live = liveEntry ? findFooterTrigger(liveEntry) : null
3674
+ } catch (error) {
3675
+ live = null
3676
+ }
3677
+ }
2825
3678
  if (live && typeof live.click === 'function') live.click()
2826
3679
  })
2827
3680
  popoverBody.insertBefore(item, settingsItem)
@@ -2841,7 +3694,12 @@ window.__ModuleLoader__.load({
2841
3694
  // Rebind the click target to the entry currently behind this
2842
3695
  // index. Done on every pass, for new and reused items alike.
2843
3696
  item.__dshActivator = activator
2844
- })(footerEntries[f], f)
3697
+ })(footerEntries[f], f)
3698
+ } catch (err) {
3699
+ // A single broken entry must not abort the rest of the mirror
3700
+ // sync (which would leave later items without a rebound
3701
+ // activator or un-ordered).
3702
+ }
2845
3703
  }
2846
3704
 
2847
3705
  // The host re-sorts list-slot outlets by `order` on every render
@@ -3239,8 +4097,15 @@ window.__ModuleLoader__.load({
3239
4097
  // Zone 5: 响应式调度与生命周期清理 (Scheduler & Teardown)
3240
4098
  // ============================================================================
3241
4099
  function onGlobalPointerDown(e) {
3242
- if (!accountPopover || !accountBtn) return
3243
4100
  var target = e.target
4101
+ // The model picker is hover-driven; a press anywhere outside its
4102
+ // trigger and both levels closes it (same discipline as the perm menu).
4103
+ if (target && (modelBtn === null || !modelBtn.contains(target)) &&
4104
+ (modelPop === null || !modelPop.contains(target)) &&
4105
+ (modelSubPop === null || !modelSubPop.contains(target))) {
4106
+ closeModelPopovers()
4107
+ }
4108
+ if (!accountPopover || !accountBtn) return
3244
4109
  if (target && (accountBtn.contains(target) || accountPopover.contains(target))) return
3245
4110
  closePopover()
3246
4111
  }
@@ -3249,6 +4114,7 @@ window.__ModuleLoader__.load({
3249
4114
  if (e.key === 'Escape') {
3250
4115
  closePopover()
3251
4116
  closePermMenu()
4117
+ closeModelPopovers()
3252
4118
  }
3253
4119
  if ((e.ctrlKey || e.metaKey) && e.key === ',') {
3254
4120
  e.preventDefault()
@@ -3290,6 +4156,14 @@ window.__ModuleLoader__.load({
3290
4156
  document.addEventListener('pointerdown', onCardPointerDown)
3291
4157
  document.addEventListener('keydown', onGlobalKeyDown, true)
3292
4158
 
4159
+ // The picker is position:fixed against the trigger; scroll of the page
4160
+ // (not the conversation's own auto-stick) and resizes move the anchor.
4161
+ function onModelViewportChange() {
4162
+ if (modelPop && modelPop.getAttribute('data-open') === 'true') positionModelPopovers()
4163
+ }
4164
+ window.addEventListener('resize', onModelViewportChange)
4165
+ window.addEventListener('scroll', onModelViewportChange, true)
4166
+
3293
4167
  // Chat streaming mutates the tree constantly; coalesce to one pass a frame.
3294
4168
  var scheduled = false
3295
4169
  var composerCardObserver = null
@@ -3315,8 +4189,10 @@ window.__ModuleLoader__.load({
3315
4189
  rewriteHint()
3316
4190
  rewriteTurnStatus()
3317
4191
  syncAttachmentState()
3318
- restoreStatsPosition()
4192
+ mergeStatsIntoRow()
3319
4193
  syncSegments()
4194
+ syncChatTabComposer()
4195
+ syncModelControl()
3320
4196
  syncAccountFooter()
3321
4197
  if (composerCardObserver) {
3322
4198
  var currentCard = document.querySelector('[data-composer-card]')
@@ -3335,8 +4211,9 @@ window.__ModuleLoader__.load({
3335
4211
  characterData: true,
3336
4212
  subtree: true,
3337
4213
  attributes: true,
3338
- // The shipped trigger carries the current preset in its aria-label.
3339
- attributeFilter: ['aria-label'],
4214
+ // The shipped trigger carries the current preset in its aria-label;
4215
+ // the conversation tabs carry the active view in aria-selected.
4216
+ attributeFilter: ['aria-label', 'aria-selected'],
3340
4217
  })
3341
4218
  schedule()
3342
4219
 
@@ -3350,6 +4227,22 @@ window.__ModuleLoader__.load({
3350
4227
  return function () {
3351
4228
  clearInterval(greetingTimer)
3352
4229
  greetingTimer = null
4230
+ cancelCloseModel()
4231
+ dropModelSubscription()
4232
+ modelDir = null
4233
+ modelSessionId = null
4234
+ window.removeEventListener('resize', onModelViewportChange)
4235
+ window.removeEventListener('scroll', onModelViewportChange, true)
4236
+ // Null the model chrome too: the sweep below detaches the nodes, and a
4237
+ // later re-install must rebuild them rather than reuse dead elements.
4238
+ modelBtn = null
4239
+ modelPop = null
4240
+ modelSubPop = null
4241
+ modelBody = null
4242
+ modelSubBody = null
4243
+ modelSubKind = null
4244
+ modelBodySig = ''
4245
+ modelSubSig = ''
3353
4246
  observer.disconnect()
3354
4247
  if (composerCardObserver) {
3355
4248
  composerCardObserver.disconnect()
@@ -3390,7 +4283,7 @@ window.__ModuleLoader__.load({
3390
4283
  accountBtn.parentElement.removeChild(accountBtn)
3391
4284
  }
3392
4285
  accountBtn = null
3393
- var leftoverItems = document.querySelectorAll('.dsh-claude-popover-item, .dsh-claude-popover-embed, .dsh-claude-account-popover, .dsh-claude-account-btn, .dsh-claude-perm-container, .dsh-claude-perm-popover, .dsh-claude-segments')
4286
+ var leftoverItems = document.querySelectorAll('.dsh-claude-popover-item, .dsh-claude-popover-embed, .dsh-claude-account-popover, .dsh-claude-account-btn, .dsh-claude-perm-container, .dsh-claude-perm-popover, .dsh-claude-segments, .dsh-claude-model-btn, .dsh-claude-model-popover')
3394
4287
  for (var li = 0; li < leftoverItems.length; li++) {
3395
4288
  if (leftoverItems[li].parentElement) {
3396
4289
  leftoverItems[li].parentElement.removeChild(leftoverItems[li])