dsh-claude-style 0.15.0-dev.22 → 0.16.0-dev.27

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/docs/STYLE.md CHANGED
@@ -18,7 +18,11 @@ Design tokens for `dsh-claude-style`, recreating the Claude Code Desktop aesthet
18
18
 
19
19
  Rules:
20
20
 
21
- - Never pure white, never pure black, never cool grays.
21
+ - Never pure white, never pure black, never cool grays. The reader's own message
22
+ plate is the one fill that is not a step of the warm surface ladder and not the
23
+ canvas either (`--dsw-specific-bubble`: the neutral the table header wears in
24
+ light, a 6% white lift in dark) — the product's own light tint is a cool
25
+ blue-grey, which reads blue beside this canvas.
22
26
  - Accent usage stays under ~10% of visible elements.
23
27
 
24
28
  **The DeepSeek brand's palettes.** The DeepSeek brand turns both palettes
@@ -46,9 +50,9 @@ keeps where it states none of its own; `—` is a token that theme leaves unset.
46
50
  | `--dsw-alias-bg-layer-2` | `#fbfbf9` | `#f7f9ff` | `#242320` | `#212631` | host's own | |
47
51
  | `--dsw-alias-bg-layer-3` | `#f9f9f6` | `#f4f7fe` | `#2e2c29` | `#2a303c` | host's own | |
48
52
  | `--dsw-alias-bg-overlay` | `#ffffff` | `#ffffff` | `#242320` | `#212631` | host's own | |
49
- | `--dsw-alias-border-l1` | `#e8e6dc` | `#e7ecf7` | `#242320` | `#212631` | host's own | |
50
- | `--dsw-alias-border-l2` | `#dedcd2` | `#dde4f1` | `#2e2c29` | `#2a303c` | host's own | |
51
- | `--dsw-alias-border-l3` | `#d0cdc1` | `#cfd8ea` | `#3a3833` | `#363d4b` | host's own | |
53
+ | `--dsw-alias-border-l1` | `#e8e6dc` | `#e7ecf7` | `rgba(255, 255, 255, 0.09)` | `#212631` | host's own | the standard edge: card and panel outlines, dividers, field outlines |
54
+ | `--dsw-alias-border-l2` | `#dedcd2` | `#dde4f1` | `rgba(255, 255, 255, 0.18)` | `#2a303c` | host's own | |
55
+ | `--dsw-alias-border-l3` | `#d0cdc1` | `#cfd8ea` | `rgba(255, 255, 255, 0.30)` | `#363d4b` | host's own | |
52
56
  | `--dsw-alias-brand-primary` | `#d97757` | `#4d6bfe` | `#d97757` | `#4d6bfe` | host's own | the single accent: checks, focus rings, selected marks |
53
57
  | `--dsw-alias-brand-text` | `#faf9f5` | `#fafbff` | `#faf9f5` | `#eef1f8` | host's own | |
54
58
  | `--dsw-alias-button-primary-fill` | `#d97757` | `#4d6bfe` | `#d97757` | `#4d6bfe` | host's own | |
@@ -73,6 +77,8 @@ keeps where it states none of its own; `—` is a token that theme leaves unset.
73
77
  | `--dsw-alias-label-secondary` | `#6e6a60` | `#61666b` | `#b0aea5` | `#aeb5c4` | host's own | |
74
78
  | `--dsw-alias-label-tertiary` | `#8f8a7e` | `#81858c` | `#8f8d84` | `#8a92a3` | host's own | |
75
79
  | `--dsw-alias-label-caption` | `#a6a094` | `#adb2b8` | `#6b6a65` | `#666e7e` | host's own | |
80
+ | `--dsw-alias-label-shimmer` | `color-mix(in srgb, #141413 30%, transparent)` | `color-mix(in srgb, #141413 30%, transparent)` | `color-mix(in srgb, #faf9f5 45%, transparent)` | `color-mix(in srgb, #faf9f5 45%, transparent)` | host's own | the highlight band's tint over running words: the host's own rows and the skin's band (shared/sweep-band.ts) alike |
81
+ | `--dsw-alias-label-deep-diving-shimmer` | `color-mix(in srgb, #141413 30%, transparent)` | `color-mix(in srgb, #141413 30%, transparent)` | `color-mix(in srgb, #faf9f5 45%, transparent)` | `color-mix(in srgb, #faf9f5 45%, transparent)` | host's own | the band's tint inside the running row, which the host points --dsw-alias-label-shimmer at; under Claude it is the same warm band as everywhere else |
76
82
  | `--dsw-alias-state-business-primary` | `#d97757` | `#4d6bfe` | `#d97757` | `#6a84ff` | host's own | |
77
83
  | `--dsw-alias-state-business-tertiary` | `#e9dfd2` | `#e9eeff` | `#3a2a22` | `#253056` | host's own | |
78
84
  | `--dsw-alias-link` | `#c6613f` | `#3b56d9` | `#e08a6d` | `#8fa4ff` | host's own | text link at rest |
@@ -95,7 +101,7 @@ keeps where it states none of its own; `—` is a token that theme leaves unset.
95
101
  | `--dsh-claude-link-hover` | `#a94f2f` | `#2c43b8` | `#f0a488` | `#b0c0ff` | `var(--dsw-alias-link)` | text link under the pointer |
96
102
  | `--dsh-claude-logo-ink` | `#141413` | `#4d6bfe` | `#faf9f5` | `#4d6bfe` | `var(--dsw-alias-label-primary)` | sidebar brand art: the whale and the wordmark |
97
103
  | `--dsw-specific-menu` | `#ffffff` | `#ffffff` | — | — | host's own | |
98
- | `--dsw-specific-bubble` | `var(--dsh-claude-hover-bg)` | `#eaf0fe` | — | `#232a3a` | host's own | user message bubble |
104
+ | `--dsw-specific-bubble` | `#f0f0ef` | `#eaf0fe` | `rgba(255, 255, 255, 0.06)` | `#232a3a` | host's own | user message bubble |
99
105
  | `--dsh-claude-chip` | `#f6f6f4` | `#f2f6fd` | — | — | `var(--dsw-specific-selector)` | segmented control and switch at rest |
100
106
  | `--dsh-claude-meter-peak` | `#a4621d` | `#9a5a1a` | `#e2a45f` | `#e5ae67` | `var(--dsw-alias-state-warn-label)` | the peak rate badge: the expensive end of a provider's own billing clock |
101
107
  | `--dsh-claude-meter-valley` | `#3d7550` | `#2e7554` | `#8cbf96` | `#7cc2a0` | `var(--dsw-alias-state-success-primary)` | the off-peak rate badge, and the dated promotions priced below it |
@@ -149,7 +155,7 @@ text, a border or an accent reads a token.
149
155
  On the Windows desktop the 40px caption row has no colour of its own: the
150
156
  sidebar and the conversation run to the window's top edge, each in its own
151
157
  fill (`--dsh-claude-sidebar-canvas`, `--dsh-claude-canvas`), and the sidebar's
152
- 1px `--dsw-alias-border-l1` hairline runs with them from the top edge to the
158
+ 0.5px `--dsw-alias-border-l1` hairline runs with them from the top edge to the
153
159
  bottom. The conversation column and the fullscreen file panel lose the host's
154
160
  16px top-left corner, so the hairline meets them straight. The three window
155
161
  buttons sit on the page itself: no block of their own behind them, and they dim
@@ -203,8 +209,18 @@ and scrolls to its end.
203
209
  composer card's 18px (the host's 22px less 4), the inline composer's 14px and
204
210
  11px, the permission and workspace segments' 7px, the view tabs' 5px, the
205
211
  peak-rate and file pills' 999px.
206
- - Borders: 1px warm hairline. The same host copies keep their own stroke: the
207
- inline composer's 1.6px stop square.
212
+ - Borders: 1px, and in dark not a colour but a highlight. The three border
213
+ tokens are one translucent white at `.09` / `.18` / `.30`, so a card, a panel,
214
+ a code block or a keycap reads as a chamfer catching the top light over
215
+ whatever fill it sits on rather than as a contour whose colour has to be
216
+ re-picked per surface. The light rungs stay the warm opaque ladder. A copy of a
217
+ host control keeps that control's own stroke: the inline composer's 1.6px stop
218
+ square.
219
+ - Hairline: 0.5px, for the split between the sidebar and the conversation
220
+ (`theme/chrome.css`, one device pixel on a retina display and the width the
221
+ product itself states), the Markdown table frame and the trajectory chip
222
+ (`theme/typography.css`, `features/chat-files`). Every other single-direction
223
+ rule stays 1px.
208
224
  - Spacing: 4 px rhythm.
209
225
  - Bottom edge: the transcript never fades behind the composer by shadow. The
210
226
  composer seat paints an opaque `var(--dsw-alias-bg-base)` bar across its own
@@ -227,7 +243,7 @@ and scrolls to its end.
227
243
 
228
244
  Every duration, curve, distance, blur and scale the skin uses is a token here,
229
245
  and a stylesheet or a Web Animations call reads the token rather than writing the
230
- value (D65). One value per role, so a faster feedback or a calmer swap is one
246
+ value (D9). One value per role, so a faster feedback or a calmer swap is one
231
247
  edit; the build refuses a time or a curve written anywhere else.
232
248
 
233
249
  - Feedback: a control answering hover, press or focus.
@@ -267,7 +283,7 @@ edit the JSON, not the table.
267
283
  | `--dsh-claude-duration-swap-gap` | `50ms` | the offset the words arriving start after the words leaving, so the two halves of a wording swap travel together |
268
284
  | `--dsh-claude-duration-roll` | `160ms` | a figure's characters rolling over to new digits |
269
285
  | `--dsh-claude-duration-move` | `200ms` | something travelling along its own track: a fold's door, the reasoning slider's knob and fill |
270
- | `--dsh-claude-duration-slide` | `240ms` | the segmented controls' sliding highlight (D20), a sidebar icon's quarter turn, and the wording box taking the width of the words arriving |
286
+ | `--dsh-claude-duration-slide` | `240ms` | the segmented controls' sliding highlight, a sidebar icon's quarter turn, the wording box taking the width of the words arriving, and streamed content sliding up from the bottom edge |
271
287
  | `--dsh-claude-duration-fade` | `300ms` | a slow cross-fade: the theme flip, the titlebar tabs' hover reveal, the reasoning knob's glow, a placeholder handing its place to what it stood for |
272
288
  | `--dsh-claude-duration-bounce` | `350ms` | a switch's knob travelling across with its double bounce |
273
289
  | `--dsh-claude-duration-flight` | `400ms` | the sent message flying from the composer to its row |
@@ -277,8 +293,9 @@ edit the JSON, not the table.
277
293
  | `--dsh-claude-duration-stagger` | `70ms` | how far behind the piece before it a staggered piece starts: the last two popping digits, the greeting's second line |
278
294
  | `--dsh-claude-period-dot-orbit` | `2400ms` | one turn of the waiting line's loader dots that swap corners: four quarter-turns of the two pairs, which leaves every dot where it started |
279
295
  | `--dsh-claude-period-dot-rotate` | `10s` | how long one of the waiting line's loader motions stands before another takes its place, the next one picked so a motion never follows itself |
280
- | `--dsh-claude-duration-reduced` | `0.01ms` | every skin animation and transition under the Reduced animation choice (D26) |
296
+ | `--dsh-claude-duration-reduced` | `0.01ms` | every skin animation and transition under the Reduced animation choice (D40) |
281
297
  | `--dsh-claude-period-host-sweep` | `1500ms` | one pass of the highlight band across the waiting line's words and a running process group's header |
298
+ | `--dsh-claude-duration-host-sweep-delay` | `300ms` | how long the highlight band waits after its words appear before its first pass |
282
299
  | `--dsh-claude-period-preview-swap` | `4000ms` | one turn of the settings page's waiting-line preview: one wording standing, leaving, and standing again |
283
300
  | `--dsh-claude-period-preview-reveal` | `4000ms` | one turn of the settings page's new-text fade preview: the sample arriving character by character, then standing before the next wipe |
284
301
  | `--dsh-claude-period-preview-caret` | `4000ms` | one turn of the settings page's caret preview: the sample line typed out, then standing whole before the next turn |
@@ -297,7 +314,7 @@ edit the JSON, not the table.
297
314
  | `--dsh-claude-ease-out` | `ease-out` | something arriving and settling: a fold's door, content entering the chat area, the landing mark |
298
315
  | `--dsh-claude-ease-enter` | `cubic-bezier(0.34, 1.3, 0.64, 1)` | a message the reader sends growing into its row: the slight overshoot as it takes its full size |
299
316
  | `--dsh-claude-ease-in-out` | `ease-in-out` | something that leaves and returns, or swaps in place: wording swaps, pulses, flashes |
300
- | `--dsh-claude-ease-glide` | `cubic-bezier(0.22, 0.61, 0.36, 1)` | travel along a track: the sliding highlight, the reasoning slider, the search dialog's entrance, the reasoning window's step, the wording box's width |
317
+ | `--dsh-claude-ease-glide` | `cubic-bezier(0.22, 0.61, 0.36, 1)` | travel along a track: the sliding highlight, the reasoning slider, the search dialog's entrance, the reasoning window's step, the wording box's width, the stream's slide |
301
318
  | `--dsh-claude-ease-roll` | `cubic-bezier(0.4, 0, 0.2, 1)` | digits rolling over: the file rows' tail and the process group header's counts |
302
319
  | `--dsh-claude-ease-spring` | `cubic-bezier(0.34, 1.45, 0.64, 1)` | a small overshoot as something lands: the session numbers' digits and the overtime badge popping in, a switch's knob bouncing past its end |
303
320
  | `--dsh-claude-ease-settle` | `cubic-bezier(0.22, 1, 0.36, 1)` | a surface or a page settling into place out of its anchor: menus and dialogs opening and closing, a settings page sliding, the overtime badge sliding onto its line, the greeting's lines rising |
@@ -320,7 +337,7 @@ edit the JSON, not the table.
320
337
 
321
338
  ## Layers
322
339
 
323
- A z-index the skin writes is one of two kinds (D67). Inside one box, siblings
340
+ A z-index the skin writes is one of two kinds (D9). Inside one box, siblings
324
341
  are ordered with a literal from -1 to 9: a fill painted under its own content,
325
342
  a label over its sliding pill, the composer's rows over one another. Anything
326
343
  that has to clear what the host draws around it — the composer's own controls,
@@ -415,9 +432,9 @@ the shell itself. What it carries is described under "Context popover" below.
415
432
  | Property | Value |
416
433
  |---|---|
417
434
  | background | `var(--dsw-alias-bg-overlay)`; dark `#1e1e1d` |
418
- | border | `1px solid var(--dsw-alias-border-l1)`; dark `#2e2c29` |
435
+ | border | `1px solid var(--dsw-alias-border-l1)`; dark the same stroke, which the dark ladder makes a highlight. The edge stays the card's own border: the box the placement reads and the opening animation scales keeps the paint path it has always had, and no stroke is drawn inside it |
419
436
  | radius | 12px |
420
- | shadow | `0 8px 30px rgba(20,20,19,.12), 0 2px 8px rgba(20,20,19,.06)`; dark `rgba(0,0,0,.5)` / `rgba(0,0,0,.3)` |
437
+ | shadow | `0 8px 24px rgba(20,20,19,.12), 0 2px 6px rgba(20,20,19,.08)`; dark a 3px `rgba(0,0,0,.35)` falloff outside the border first — it separates the lit edge from the near-black canvas — then `0 8px 28px rgba(0,0,0,.65), 0 2px 8px rgba(0,0,0,.45)` |
421
438
  | padding | 6px |
422
439
  | layout | flex column, `gap: 6px`; a list body stacks its rows 3px apart |
423
440
  | z-index | 99999, above the host's own menus (1100) |
@@ -440,8 +457,13 @@ the shell itself. What it carries is described under "Context popover" below.
440
457
  **Heading, separator, footer**
441
458
 
442
459
  - heading row: 11px / 16px at 600, `letter-spacing: .04em`, uppercase, `label-tertiary`, `padding: 6px 7px 2px`
443
- - separator: 1px `var(--dsw-alias-border-l1)`, `margin: 2px 4px`
444
- - pinned footer: `margin-top` / `padding-top` 4px, `1px solid var(--dsw-alias-border-l1)` above
460
+ - separator: `0.5px` `var(--dsw-alias-border-l2)` — the host's own line on a menu
461
+ surface (`Menu.module.css`) — `margin: 2px 4px`, drawn as a top border on a
462
+ zero-height box. One rule in the shared shell covers every separator in a card,
463
+ the host's own menu separators included, so the line is one thickness wherever
464
+ it appears and does not follow the card's opening scale
465
+ - pinned footer: `margin-top` / `padding-top` 4px, and the same `0.5px`
466
+ `var(--dsw-alias-border-l2)` line above it
445
467
 
446
468
  **Host surfaces**
447
469
 
@@ -632,14 +654,18 @@ shimmering words step aside for the skin's line beside it: the wording in the
632
654
  secondary label at 14px on a 24px line,
633
655
  the turn's clock 8px later in the caption at 13px with tabular figures, and the
634
656
  "No response yet" badge 8px after that (11px on a 16px line, 0 6px padding, a 5px
635
- radius, the warning label over 16% of itself). The wording wears one of two
636
- paints, whichever the Motion tab's Waiting-line animation holds: a highlight band
637
- swept across it the way the host's own rows sweep — 1.5s a pass with the band
638
- resting the last third of it, in the host's shimmer tint — or a colour wash, the
639
- seven radial washes of `packages/client/src/shared/motion.css` over a grey ramp,
640
- orbiting the glyph box (5s an orbit while the hue turns a full circle over 4s),
641
- which is the effect transitions.dev ships as its Pro gradient text. A wording that
642
- changes runs both halves of the swap at once and is over in 0.2s: the old one
657
+ radius, the warning label over 16% of itself). The line takes the row's own
658
+ width and gives way inside it: the words are carried whole, so a clause the row
659
+ has no room for is clipped where the room ends and the copy draws an ellipsis,
660
+ with the loader, the clock and the badge keeping their places. The wording wears
661
+ one of two paints, whichever the Motion tab's Waiting-line animation holds: a
662
+ highlight band swept across it the way the host's own rows sweep — 1.5s a pass
663
+ with the band resting the last third of it, in the host's shimmer tint — or a
664
+ colour wash, the seven radial washes of `packages/client/src/shared/motion.css`
665
+ over a grey ramp, orbiting the glyph box (5s an orbit while the hue turns a full
666
+ circle over 4s), which is the effect transitions.dev ships as its Pro gradient
667
+ text. A wording that changes runs both halves of the swap at once and is over in
668
+ 0.2s: the old one
643
669
  leaves upward with a 2px blur while the new one, parked one gap, enters from 4px
644
670
  below; under Reduced motion the band is left out, the wash holds its still frame,
645
671
  and the wording is written at once. The Motion tab's preview cards
@@ -847,5 +873,5 @@ plays its reaction.
847
873
  the look no single feature owns is in `packages/client/src/theme/`, and the parts several
848
874
  features share (the popover card and rows, the sliding highlight) are in
849
875
  `packages/client/src/shared/`. The host selector discipline and the style checks the build
850
- runs are in `docs/decisions/` (D3, D4, D9, D19, D30, D51).
876
+ runs are in `docs/adr/` (D3, D9, D30).
851
877
 
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -91,75 +91,75 @@
91
91
  "encoding": "br",
92
92
  "bytes": 143044
93
93
  },
94
- "18b7187b47b9.js": {
94
+ "dab5fb383802.js": {
95
95
  "type": "text/javascript; charset=utf-8",
96
96
  "encoding": "br",
97
97
  "bytes": 15684
98
98
  },
99
- "2f741302b16a.js.map": {
99
+ "43a07ef82dc2.js.map": {
100
100
  "type": "application/json; charset=utf-8",
101
101
  "encoding": "br",
102
- "bytes": 78196
102
+ "bytes": 76827
103
103
  },
104
- "1a999a7d3c24.js": {
104
+ "b7ec75cf39a7.js": {
105
105
  "type": "text/javascript; charset=utf-8",
106
106
  "encoding": "br",
107
107
  "bytes": 18812
108
108
  },
109
- "00094f1ce790.js.map": {
109
+ "7d0cb6862824.js.map": {
110
110
  "type": "application/json; charset=utf-8",
111
111
  "encoding": "br",
112
- "bytes": 99722
112
+ "bytes": 99291
113
113
  },
114
- "d8df7a57fbe3.js": {
114
+ "1cefeb3d67c7.js": {
115
115
  "type": "text/javascript; charset=utf-8",
116
116
  "encoding": "br",
117
117
  "bytes": 9972
118
118
  },
119
- "1c63ba6a0ae4.js.map": {
119
+ "12fb21991efd.js.map": {
120
120
  "type": "application/json; charset=utf-8",
121
121
  "encoding": "br",
122
- "bytes": 27515
122
+ "bytes": 28060
123
123
  },
124
- "550eb2fb99aa.js": {
124
+ "34d559377558.js": {
125
125
  "type": "text/javascript; charset=utf-8",
126
126
  "encoding": "br",
127
- "bytes": 20524
127
+ "bytes": 20492
128
128
  },
129
- "18e688cfe04a.js.map": {
129
+ "fdf2c93f29ed.js.map": {
130
130
  "type": "application/json; charset=utf-8",
131
131
  "encoding": "br",
132
- "bytes": 75166
132
+ "bytes": 74893
133
133
  },
134
- "7323c8c86470.js": {
134
+ "2c3bd0b6c22c.js": {
135
135
  "type": "text/javascript; charset=utf-8",
136
136
  "encoding": "br",
137
137
  "bytes": 8044
138
138
  },
139
- "725219568623.js.map": {
139
+ "3052f111c0f6.js.map": {
140
140
  "type": "application/json; charset=utf-8",
141
141
  "encoding": "br",
142
- "bytes": 32476
142
+ "bytes": 33023
143
143
  },
144
- "840442766089.js": {
144
+ "1da1959a3cb1.js": {
145
145
  "type": "text/javascript; charset=utf-8",
146
146
  "encoding": "br",
147
147
  "bytes": 20650
148
148
  },
149
- "bdd4f5b8366f.js.map": {
149
+ "3632e8c0d941.js.map": {
150
150
  "type": "application/json; charset=utf-8",
151
151
  "encoding": "br",
152
152
  "bytes": 132860
153
153
  },
154
- "6947faba7fb6.js": {
154
+ "acf9cf79c43e.js": {
155
155
  "type": "text/javascript; charset=utf-8",
156
156
  "encoding": "br",
157
- "bytes": 36353
157
+ "bytes": 36632
158
158
  },
159
- "80695e8ab866.js.map": {
159
+ "98ff063feb64.js.map": {
160
160
  "type": "application/json; charset=utf-8",
161
161
  "encoding": "br",
162
- "bytes": 129136
162
+ "bytes": 130226
163
163
  }
164
164
  }
165
165
  }