@deepseek-ai/dsh-client-ui-primitives 0.1.7-alpha.2 → 0.1.7-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.i18n.yaml +60 -5
  2. package/README.md +27 -10
  3. package/README.zh.md +27 -10
  4. package/lib/Button.module.css +6 -8
  5. package/lib/Checkbox.module.css +1 -1
  6. package/lib/CodeCard.module.css +3 -3
  7. package/lib/ConnectionIndicator.module.css +6 -2
  8. package/lib/HoverCard.module.css +17 -8
  9. package/lib/ImageLightbox.module.css +46 -0
  10. package/lib/ImagePreview.module.css +24 -0
  11. package/lib/Input.module.css +2 -2
  12. package/lib/JsonTree.module.css +3 -3
  13. package/lib/Menu.module.css +22 -18
  14. package/lib/MenuSurface.module.css +49 -0
  15. package/lib/Modal.module.css +27 -6
  16. package/lib/Pill.module.css +2 -1
  17. package/lib/RiskConfirmation.module.css +1 -1
  18. package/lib/SearchBlock.module.css +1 -1
  19. package/lib/SegmentedControl.module.css +9 -9
  20. package/lib/SegmentedTabs.module.css +3 -3
  21. package/lib/ShortcutKeys.module.css +33 -0
  22. package/lib/Switch.module.css +3 -8
  23. package/lib/TerminalBlock.module.css +3 -3
  24. package/lib/Toast.module.css +2 -2
  25. package/lib/Tooltip.module.css +9 -1
  26. package/lib/WebBlock.module.css +1 -1
  27. package/lib/index.js +1592 -825
  28. package/lib/markdown/CodeBlock.module.css +1 -1
  29. package/lib/markdown/JsonBlock.module.css +2 -2
  30. package/lib/markdown/MarkdownText.module.css +28 -5
  31. package/lib/settings-form/SettingsForm.module.css +2 -2
  32. package/lib/settings-form/fields.module.css +4 -4
  33. package/lib/types/Button.d.ts +6 -5
  34. package/lib/types/HoverCard.d.ts +5 -2
  35. package/lib/types/ImageLightbox.d.ts +27 -0
  36. package/lib/types/ImagePreview.d.ts +12 -0
  37. package/lib/types/Menu.d.ts +9 -1
  38. package/lib/types/MenuSurface.d.ts +16 -0
  39. package/lib/types/Modal.d.ts +12 -4
  40. package/lib/types/ShortcutKeys.d.ts +11 -0
  41. package/lib/types/Tooltip.d.ts +15 -4
  42. package/lib/types/code-highlighting.d.ts +1 -8
  43. package/lib/types/focus.d.ts +9 -0
  44. package/lib/types/guide-artwork.d.ts +15 -0
  45. package/lib/types/icons/index.d.ts +8 -4
  46. package/lib/types/icons/shared-artwork.d.ts +8 -1
  47. package/lib/types/index.d.ts +9 -1
  48. package/lib/types/input-modality.d.ts +19 -0
  49. package/lib/types/keyboard-composition.d.ts +11 -0
  50. package/lib/types/markdown/MarkdownDelegate.d.ts +11 -1
  51. package/lib/types/markdown/highlight.d.ts +16 -10
  52. package/lib/types/markdown/local-image-syntax.d.ts +10 -0
  53. package/lib/types/plugin-artwork.d.ts +1 -1
  54. package/lib/types/settings-form/fields.d.ts +1 -0
  55. package/lib/types/useModalLayer.d.ts +27 -0
  56. package/package.json +4 -3
  57. package/lib/OnboardingSurface.module.css +0 -28
  58. package/lib/types/OnboardingSurface.d.ts +0 -11
@@ -187,7 +187,7 @@
187
187
  }
188
188
 
189
189
  .stringToggle:focus-visible {
190
- outline: 1px solid var(--dsw-alias-state-business-primary);
190
+ outline: 1px solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));
191
191
  outline-offset: 1px;
192
192
  }
193
193
 
@@ -271,7 +271,7 @@
271
271
  margin: 0;
272
272
  padding: 0;
273
273
  border: 0;
274
- border-radius: 3px;
274
+ border-radius: var(--dsw-radius-xs);
275
275
  color: var(--dsw-alias-label-secondary);
276
276
  background: transparent;
277
277
  cursor: pointer;
@@ -286,7 +286,7 @@
286
286
  }
287
287
 
288
288
  .actionButton:focus-visible {
289
- outline: 1px solid var(--dsw-alias-state-business-primary);
289
+ outline: 1px solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));
290
290
  outline-offset: -1px;
291
291
  }
292
292
 
@@ -8,14 +8,11 @@
8
8
  .submenu {
9
9
  /* min-widths below are the design's outer card widths — include the pad. */
10
10
  box-sizing: border-box;
11
- padding: 3px;
11
+ padding: 4px;
12
12
  display: flex;
13
13
  flex-direction: column;
14
14
  gap: 0;
15
15
  border: 0;
16
- border-radius: 16px;
17
- background: var(--dsw-specific-menu);
18
- backdrop-filter: var(--dsw-menu-backdrop-filter);
19
16
  --dsw-elevation-stroke-color: var(--dsw-alias-border-l1);
20
17
  box-shadow: var(--dsw-elevation-prominent);
21
18
  /* Elevated surface: the scrollbar thumb takes the l2 elevation tokens. The
@@ -103,7 +100,7 @@
103
100
  min-height: 34px;
104
101
  padding: 6px 8px;
105
102
  border: none;
106
- border-radius: 8px;
103
+ border-radius: var(--dsw-radius-md);
107
104
  background: transparent;
108
105
  cursor: pointer;
109
106
  font-size: 13px;
@@ -136,15 +133,14 @@
136
133
  .list.compactList,
137
134
  .submenu.compactList {
138
135
  min-width: 156px;
139
- padding: 2px;
140
- border-radius: 7px;
136
+ padding: 4px;
141
137
  }
142
138
 
143
139
  .compactList .item {
144
140
  min-height: 24px;
145
141
  gap: 5px;
146
142
  padding: 2px 6px;
147
- border-radius: 5px;
143
+ border-radius: var(--dsw-radius-sm);
148
144
  font-size: 11px;
149
145
  line-height: 17px;
150
146
  }
@@ -176,7 +172,7 @@
176
172
  height: 14px;
177
173
  align-items: center;
178
174
  justify-content: center;
179
- color: var(--dsw-alias-label-tertiary);
175
+ color: var(--dsw-alias-menu-icon);
180
176
  }
181
177
 
182
178
  .itemIcon svg,
@@ -199,6 +195,17 @@
199
195
  white-space: nowrap;
200
196
  }
201
197
 
198
+ .shortcut {
199
+ flex: none;
200
+ margin-inline-start: auto;
201
+ }
202
+
203
+ .shortcut .shortcutKeys {
204
+ color: var(--dsw-alias-label-caption);
205
+ font-size: 11px;
206
+ line-height: 16px;
207
+ }
208
+
202
209
  .check {
203
210
  flex: none;
204
211
  color: var(--dsw-alias-label-primary);
@@ -257,16 +264,13 @@
257
264
  display: none;
258
265
  }
259
266
 
260
- /* Nested card to the right of the parent row.
261
- * Bottom-aligned with the parent menu card (grows upward): itemWrap sits in
262
- * .list's 3px pad, so bottom: -3px matches the list's outer bottom edge.
263
- * Horizontal: list pad (3px) + 6px card gap = 9px past itemWrap.
264
- * ::before bridges the full gap so the pointer can cross without mouseLeave. */
267
+ /* The submenu aligns with the parent's bottom edge. Its hit bridge covers
268
+ * the menu inset and the 6px gap so pointer movement keeps it open. */
265
269
  .submenu {
266
270
  position: absolute;
267
271
  top: auto;
268
- bottom: -3px;
269
- left: calc(100% + 9px);
272
+ bottom: -4px;
273
+ left: calc(100% + 10px);
270
274
  z-index: 101;
271
275
  min-width: 163px;
272
276
  }
@@ -276,6 +280,6 @@
276
280
  position: absolute;
277
281
  top: 0;
278
282
  bottom: 0;
279
- left: -9px;
280
- width: 9px;
283
+ left: -10px;
284
+ width: 10px;
281
285
  }
@@ -0,0 +1,49 @@
1
+ .surface,
2
+ .backing {
3
+ border-radius: var(--dsw-radius-lg);
4
+ }
5
+
6
+ .compact {
7
+ border-radius: var(--dsw-radius-md);
8
+ }
9
+
10
+ :where(.surface) {
11
+ position: relative;
12
+ }
13
+
14
+ .surface {
15
+ anchor-name: var(--dsh-menu-anchor);
16
+ isolation: isolate;
17
+ }
18
+
19
+ /* Filtering only the background keeps nested menus and fixed overlays free of
20
+ * an ancestor backdrop root or a new fixed-position containing block. */
21
+ .material {
22
+ position: absolute;
23
+ inset: 0;
24
+ z-index: -1;
25
+ border-radius: inherit;
26
+ background: var(--dsw-menu-surface-fill);
27
+ backdrop-filter: var(--dsw-menu-backdrop-filter);
28
+ pointer-events: none;
29
+ }
30
+
31
+ .backing {
32
+ display: none;
33
+ }
34
+
35
+ /* Chromium needs opaque pixels behind the page content to blur it over native
36
+ * vibrancy. Body isolation keeps this backing above the native window and below
37
+ * the page; CSS anchors limit it to this menu without a layout observer. */
38
+ :global(html[data-platform='darwin']) .backing {
39
+ display: block;
40
+ position: fixed;
41
+ position-anchor: var(--dsh-menu-anchor);
42
+ top: anchor(top);
43
+ left: anchor(left);
44
+ width: anchor-size(width, 0px);
45
+ height: anchor-size(height, 0px);
46
+ z-index: -1;
47
+ background: var(--dsw-alias-bg-base);
48
+ pointer-events: none;
49
+ }
@@ -4,6 +4,7 @@
4
4
  Cards size against this padding box: consumers cap growth with
5
5
  `max-height: 100%`, never their own viewport calc. */
6
6
  .root {
7
+ pointer-events: auto;
7
8
  position: fixed;
8
9
  inset: 0;
9
10
  z-index: 1000;
@@ -13,16 +14,22 @@
13
14
  padding: max(24px, var(--dsh-frame-top-clearance, 24px)) 24px;
14
15
  }
15
16
 
16
- /* User/spec mask: rgba(0,0,0,0.24) + blur(2px) via --dsw-alias-bg-mask-1 /
17
- --dsw-mask-blur (light); dark theme raises mask opacity. */
17
+ /* The mask dims the page; dark theme raises its opacity. */
18
18
  .mask {
19
19
  position: absolute;
20
20
  inset: 0;
21
- background: var(--dsw-alias-bg-mask-1);
22
21
  backdrop-filter: var(--dsw-mask-blur);
23
22
  }
24
23
 
25
- /* Dialog card: r24, elevation-prominent, layer-2 fill, pb 24. */
24
+ .mask::after {
25
+ content: '';
26
+ position: absolute;
27
+ inset: 0;
28
+ background: var(--dsw-alias-bg-mask-1);
29
+ animation: modalEnter var(--ds-transition-duration) var(--ds-ease-in-out);
30
+ }
31
+
32
+ /* Dialogs use the prominent elevation on the secondary layer. */
26
33
  .dialog {
27
34
  position: relative;
28
35
  z-index: 1;
@@ -33,9 +40,23 @@
33
40
  padding: 0 0 24px;
34
41
  overflow: hidden;
35
42
  border: 0;
36
- border-radius: 24px;
43
+ border-radius: var(--dsw-radius-panel);
37
44
  background: var(--dsw-alias-bg-layer-2);
38
45
  box-shadow: var(--dsw-elevation-prominent);
46
+ animation: modalEnter var(--ds-transition-duration) var(--ds-ease-in-out);
47
+ }
48
+
49
+ @keyframes modalEnter {
50
+ from { opacity: 0; }
51
+ to { opacity: 1; }
52
+ }
53
+
54
+ @media (prefers-reduced-motion: reduce) {
55
+ .mask::after, .dialog { animation: none; }
56
+ }
57
+
58
+ .dialog:focus {
59
+ outline: none;
39
60
  }
40
61
 
41
62
  .content {
@@ -70,7 +91,7 @@
70
91
  width: 28px;
71
92
  height: 28px;
72
93
  border: none;
73
- border-radius: 8px;
94
+ border-radius: var(--dsw-radius-sm);
74
95
  background: transparent;
75
96
  cursor: pointer;
76
97
  color: var(--dsw-alias-label-secondary);
@@ -5,7 +5,8 @@
5
5
  height: 24px;
6
6
  padding: 0 8px;
7
7
  border: none;
8
- border-radius: 12px;
8
+ border-radius: 999px;
9
+ corner-shape: round;
9
10
  font-size: 12px;
10
11
  line-height: 18px;
11
12
  color: var(--dsw-alias-label-secondary);
@@ -56,7 +56,7 @@
56
56
  }
57
57
 
58
58
  .acknowledgement input:focus-visible {
59
- outline: 2px solid var(--dsw-alias-border-l4);
59
+ outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));
60
60
  outline-offset: 2px;
61
61
  }
62
62
 
@@ -1,5 +1,5 @@
1
1
  .block {
2
- --dsl-search-radius: 12px;
2
+ --dsl-search-radius: var(--dsw-radius-lg);
3
3
  --dsl-search-line-height: 22px;
4
4
 
5
5
  position: relative;
@@ -14,19 +14,19 @@
14
14
  grid-auto-flow: column;
15
15
  grid-auto-columns: 1fr;
16
16
  gap: 2px;
17
- padding: 3px;
18
- border-radius: 9px;
17
+ padding: 4px;
18
+ border-radius: var(--dsw-radius-md);
19
19
  background: var(--dsw-alias-interactive-bg-hover);
20
20
  }
21
21
 
22
22
  .indicator {
23
23
  position: absolute;
24
- top: 3px;
25
- left: 3px;
26
- width: calc((100% - 6px - 2px * (var(--dsh-segment-count) - 1)) / var(--dsh-segment-count));
27
- height: calc(100% - 6px);
24
+ top: 4px;
25
+ left: 4px;
26
+ width: calc((100% - 8px - 2px * (var(--dsh-segment-count) - 1)) / var(--dsh-segment-count));
27
+ height: calc(100% - 8px);
28
28
  border: 0;
29
- border-radius: 7px;
29
+ border-radius: var(--dsw-radius-sm);
30
30
  background: var(--dsw-alias-bg-layer-1);
31
31
  box-shadow: var(--dsw-elevation-soft);
32
32
  transform: translateX(calc(var(--dsh-segment-index) * (100% + 2px)));
@@ -41,7 +41,7 @@
41
41
  height: 28px;
42
42
  padding: 0 16px;
43
43
  border: 0;
44
- border-radius: 7px;
44
+ border-radius: var(--dsw-radius-sm);
45
45
  background: transparent;
46
46
  color: var(--dsw-alias-label-secondary);
47
47
  font: inherit;
@@ -64,7 +64,7 @@
64
64
  }
65
65
 
66
66
  .tab:focus-visible {
67
- outline: 2px solid var(--dsw-alias-brand-primary);
67
+ outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));
68
68
  outline-offset: -2px;
69
69
  }
70
70
 
@@ -2,7 +2,7 @@
2
2
  position: relative;
3
3
  display: grid;
4
4
  padding: 4px;
5
- border-radius: 12px;
5
+ border-radius: var(--dsw-radius-lg);
6
6
  background: var(--dsw-alias-bg-module-platform);
7
7
  }
8
8
 
@@ -11,7 +11,7 @@
11
11
  inset: 4px auto 4px 4px;
12
12
  box-sizing: border-box;
13
13
  border: 0.5px solid var(--dsw-alias-border-l3);
14
- border-radius: 8px;
14
+ border-radius: var(--dsw-radius-md);
15
15
  background: var(--dsw-alias-bg-layer-3);
16
16
  transition: transform 180ms ease;
17
17
  pointer-events: none;
@@ -22,7 +22,7 @@
22
22
  justify-content: center;
23
23
  height: 34px;
24
24
  padding: 0 12px;
25
- border-radius: 8px;
25
+ border-radius: var(--dsw-radius-md);
26
26
  font-size: 14px;
27
27
  line-height: 20px;
28
28
  background: transparent;
@@ -0,0 +1,33 @@
1
+ .keys {
2
+ display: inline-flex;
3
+ flex: none;
4
+ align-items: center;
5
+ gap: 3px;
6
+ color: var(--dsw-alias-label-tertiary);
7
+ font-size: 12px;
8
+ line-height: 16px;
9
+ white-space: nowrap;
10
+ }
11
+
12
+ .key {
13
+ box-sizing: border-box;
14
+ display: inline-flex;
15
+ align-items: center;
16
+ justify-content: center;
17
+ font: inherit;
18
+ }
19
+
20
+ .tooltip { color: inherit; font-size: 11px; line-height: 14px; gap: 2px; }
21
+ .tooltip .key {
22
+ min-width: 16px;
23
+ height: 16px;
24
+ padding: 0 2px;
25
+ border-radius: 4px;
26
+ border: 0;
27
+ background: var(--dsw-alias-tooltip-key-bg);
28
+ }
29
+
30
+ .separator { font: inherit; }
31
+
32
+ .joined { box-sizing: border-box; height: 16px; padding: 0 4px; border-radius: 4px; background: var(--dsw-alias-tooltip-key-bg); }
33
+ .joined .key { min-width: 0; height: auto; padding: 0; border: 0; background: transparent; }
@@ -1,12 +1,7 @@
1
1
  /* The on/off appearance keys off aria-checked rather than a parallel class, so
2
2
  * the visual state cannot disagree with the state assistive technology reads.
3
3
  *
4
- * The track is a capsule: its radius is half its height, so the corners consume
5
- * the whole side and the global superellipse would square the ends off against
6
- * the round thumb inside it. `corner-shape: round` opts the track out, the way
7
- * every full-round radius does. The corner-shape spec does not catch this one —
8
- * it recognizes 50%, 100%, and radii at or above 99px, not a radius that is
9
- * full-round only relative to its own box. */
4
+ * The capsule track and circular thumb opt out of the global superellipse. */
10
5
  .switch {
11
6
  box-sizing: border-box;
12
7
  position: relative;
@@ -15,7 +10,7 @@
15
10
  height: 20px;
16
11
  padding: 2px;
17
12
  border: 0;
18
- border-radius: 10px;
13
+ border-radius: 999px;
19
14
  corner-shape: round;
20
15
  background: var(--dsw-alias-border-l3);
21
16
  cursor: pointer;
@@ -31,7 +26,7 @@
31
26
  }
32
27
 
33
28
  .switch:focus-visible {
34
- outline: 2px solid var(--dsw-alias-brand-primary);
29
+ outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));
35
30
  outline-offset: 2px;
36
31
  }
37
32
 
@@ -1,5 +1,5 @@
1
1
  .block {
2
- --dsl-terminal-radius: 12px;
2
+ --dsl-terminal-radius: var(--dsw-radius-lg);
3
3
  --dsl-terminal-line-height: 22px;
4
4
  /* Rebindable by consumers (CodeBlock's --dsl-code-block-content-font
5
5
  pattern): a surface wanting the smaller code size rebinds this together
@@ -51,7 +51,7 @@
51
51
  .header::-webkit-scrollbar-thumb {
52
52
  border: 2px solid transparent;
53
53
  background-clip: padding-box;
54
- border-radius: 6px;
54
+ border-radius: var(--dsw-radius-sm);
55
55
  }
56
56
 
57
57
  .header::-webkit-scrollbar-track {
@@ -170,7 +170,7 @@
170
170
  .output::-webkit-scrollbar-thumb {
171
171
  border: 2px solid transparent;
172
172
  background-clip: padding-box;
173
- border-radius: 6px;
173
+ border-radius: var(--dsw-radius-sm);
174
174
  }
175
175
 
176
176
  /* Track end-margins keep the thumb's travel out of the card's rounded
@@ -22,12 +22,12 @@
22
22
  width: max-content;
23
23
  max-width: min(640px, calc(100vw - 48px));
24
24
  padding: 12px 16px;
25
- border-radius: 14px;
25
+ border-radius: var(--dsw-radius-lg);
26
26
  /* The design platform's toast surface is dark in BOTH themes (bluish-800
27
27
  light / bluish-750 dark), so the label and the action text below stay
28
28
  fixed instead of flipping with the theme. */
29
29
  background: var(--dsw-alias-toast-bg);
30
- color: var(--dsw-static-neutral-bluish-00);
30
+ color: var(--dsw-alias-toast-label);
31
31
  font-size: 14px;
32
32
  line-height: 22px;
33
33
  box-shadow: var(--dsw-shadow-lv3);
@@ -1,4 +1,7 @@
1
1
  .bubble {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ gap: 8px;
2
5
  position: fixed;
3
6
  z-index: 100;
4
7
  /* Fixed-position shrink-to-fit measures only the space from `left` to the
@@ -7,7 +10,7 @@
7
10
  width: max-content;
8
11
  max-width: 50vw;
9
12
  padding: 3px 7px;
10
- border-radius: 8px;
13
+ border-radius: var(--dsw-radius-sm);
11
14
  background: var(--dsw-alias-tooltip-bg);
12
15
  color: var(--dsw-static-neutral-bluish-00);
13
16
  font-size: 13px;
@@ -20,6 +23,11 @@
20
23
  }
21
24
 
22
25
  .bubble[data-portal] { z-index: 1100; }
26
+ .label { min-width: 0; }
27
+
28
+ /* A 16px keycap centered beside a 20px label has 5px of vertical clearance. */
29
+ .bubble[data-has-shortcut] { padding-inline-end: 5px; }
30
+ .bubble[data-has-shortcut]:not(:has(.label)) { padding: 3px; }
23
31
 
24
32
  .bubble[data-side='right'] {
25
33
  transform: translateY(-50%);
@@ -1,5 +1,5 @@
1
1
  .block {
2
- --dsl-web-radius: 12px;
2
+ --dsl-web-radius: var(--dsw-radius-lg);
3
3
 
4
4
  margin: 16px 0;
5
5
  padding: 12px 14px;