@dsh-plugin/dsh-ui-components 0.0.1 → 0.1.0-dev.43613492370

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 (65) hide show
  1. package/LICENSE +21 -21
  2. package/NOTICE +21 -21
  3. package/README.md +136 -136
  4. package/README.zh_CN.md +136 -136
  5. package/docs/tokens.md +67 -67
  6. package/lib/basic/form.js +49 -49
  7. package/lib/basic/styles.js +391 -391
  8. package/lib/composites/styles.js +427 -427
  9. package/lib/data/styles.js +257 -257
  10. package/lib/display/styles.js +310 -310
  11. package/lib/feedback/styles.js +228 -228
  12. package/lib/foundation/bridge.js +203 -203
  13. package/lib/navigation/styles.js +417 -417
  14. package/package.json +104 -104
  15. package/scripts/check-size.mjs +69 -69
  16. package/scripts/dump-npm-latest.mjs +59 -59
  17. package/scripts/gen-host-tokens.mjs +61 -61
  18. package/scripts/gen-icons.mjs +188 -178
  19. package/scripts/verify-no-literal-colors.mjs +63 -63
  20. package/scripts/verify-tokens.mjs +135 -135
  21. package/src/basic/button.tsx +76 -76
  22. package/src/basic/form.tsx +187 -187
  23. package/src/basic/icon-button.tsx +66 -66
  24. package/src/basic/index.ts +38 -38
  25. package/src/basic/input.tsx +140 -140
  26. package/src/basic/select.tsx +120 -120
  27. package/src/basic/styles.ts +412 -412
  28. package/src/basic/toggle.tsx +116 -116
  29. package/src/composites/data-view.tsx +189 -189
  30. package/src/composites/index.ts +11 -11
  31. package/src/composites/indicator.tsx +90 -90
  32. package/src/composites/menu-select.tsx +230 -230
  33. package/src/composites/panel.tsx +72 -72
  34. package/src/composites/settings.tsx +80 -80
  35. package/src/composites/styles.ts +450 -450
  36. package/src/data/collection.tsx +71 -71
  37. package/src/data/index.ts +39 -39
  38. package/src/data/info.tsx +89 -89
  39. package/src/data/picker.tsx +113 -113
  40. package/src/data/styles.ts +278 -278
  41. package/src/display/container.tsx +67 -67
  42. package/src/display/feedback.tsx +92 -92
  43. package/src/display/index.ts +44 -44
  44. package/src/display/label.tsx +165 -165
  45. package/src/display/overlay.tsx +103 -103
  46. package/src/display/styles.ts +332 -332
  47. package/src/feedback/global.tsx +110 -110
  48. package/src/feedback/index.ts +19 -19
  49. package/src/feedback/inline.tsx +50 -50
  50. package/src/feedback/panel.tsx +93 -93
  51. package/src/feedback/styles.ts +250 -250
  52. package/src/foundation/bridge.ts +318 -318
  53. package/src/foundation/icons.tsx +315 -315
  54. package/src/foundation/index.ts +33 -33
  55. package/src/foundation/palette.ts +153 -153
  56. package/src/foundation/provider.tsx +62 -62
  57. package/src/foundation/style.ts +63 -63
  58. package/src/foundation/tokens.ts +62 -62
  59. package/src/index.ts +18 -18
  60. package/src/navigation/hierarchy.tsx +82 -82
  61. package/src/navigation/index.ts +21 -21
  62. package/src/navigation/indicator.tsx +125 -125
  63. package/src/navigation/menu.tsx +94 -94
  64. package/src/navigation/segmented.tsx +136 -136
  65. package/src/navigation/styles.ts +438 -438
@@ -1,438 +1,438 @@
1
- /**
2
- * 导航组件追加样式。
3
- *
4
- * 菜单表面使用宿主菜单材质(`--dsw-specific-menu` 配 `--dsw-menu-backdrop-filter`),
5
- * 浮起表面用描边阴影而不是边框,与宿主自己的下拉菜单一致。
6
- *
7
- * @module @dsh-plugin/dsh-ui-components/navigation/styles
8
- */
9
- import { injectUiStyle } from '../foundation/style.js'
10
-
11
- /** 导航组件样式表。 */
12
- export const NAVIGATION_CSS = `
13
- /* ── 菜单与下拉 ─────────────────────────────────────────────────── */
14
- .dsh-ui .arco-menu {
15
- background-color: transparent;
16
- border: 0;
17
- font-size: 14px;
18
- line-height: 22px;
19
- }
20
-
21
- .dsh-ui .arco-menu-item,
22
- .dsh-ui .arco-menu-pop-header {
23
- border-radius: var(--dsw-radius-sm, 8px);
24
- color: var(--dsw-alias-label-secondary);
25
- line-height: 32px;
26
- height: 32px;
27
- padding: 0 10px;
28
- margin: 2px 0;
29
- }
30
-
31
- @media (hover: hover) {
32
- .dsh-ui .arco-menu-item:hover,
33
- .dsh-ui .arco-menu-pop-header:hover {
34
- background-color: var(--dsw-alias-interactive-bg-hover);
35
- color: var(--dsw-alias-label-primary);
36
- }
37
- }
38
-
39
- .dsh-ui .arco-menu-selected,
40
- .dsh-ui .arco-menu-item.arco-menu-selected {
41
- background-color: var(--dsw-alias-button-ghost-active-fill);
42
- color: var(--dsw-alias-label-primary);
43
- font-weight: 500;
44
- }
45
-
46
- .dsh-ui .arco-menu-inline-header {
47
- color: var(--dsw-alias-label-tertiary);
48
- font-size: 12px;
49
- line-height: 18px;
50
- padding: 8px 10px 4px;
51
- height: auto;
52
- }
53
-
54
- .dsh-ui-overlay .arco-dropdown-menu,
55
- .dsh-ui .arco-dropdown-menu {
56
- border-radius: var(--dsw-radius-lg, 16px);
57
- border: 0;
58
- background: var(--dsw-specific-menu, var(--dsw-alias-bg-layer-2));
59
- backdrop-filter: var(--dsw-menu-backdrop-filter, none);
60
- box-shadow: var(--dsw-elevation-panel);
61
- padding: 4px;
62
- min-width: 160px;
63
- }
64
-
65
- .dsh-ui-overlay .arco-dropdown-menu-item,
66
- .dsh-ui .arco-dropdown-menu-item {
67
- border-radius: var(--dsw-radius-sm, 8px);
68
- font-size: 14px;
69
- line-height: 22px;
70
- height: 32px;
71
- color: var(--dsw-alias-label-primary);
72
- }
73
-
74
- @media (hover: hover) {
75
- .dsh-ui-overlay .arco-dropdown-menu-item:hover,
76
- .dsh-ui .arco-dropdown-menu-item:hover {
77
- background-color: var(--dsw-alias-interactive-bg-hover);
78
- }
79
- }
80
-
81
- .dsh-ui-overlay .arco-dropdown-menu-item-disabled,
82
- .dsh-ui .arco-dropdown-menu-item-disabled {
83
- color: var(--dsw-alias-label-caption);
84
- }
85
-
86
- /* ── 标签页 ─────────────────────────────────────────────────────── */
87
- .dsh-ui .arco-tabs-header-nav::before {
88
- background-color: var(--dsw-alias-border-l1);
89
- }
90
-
91
- .dsh-ui .arco-tabs-header-title {
92
- font-size: 14px;
93
- line-height: 22px;
94
- color: var(--dsw-alias-label-tertiary);
95
- font-weight: 400;
96
- }
97
-
98
- .dsh-ui .arco-tabs-header-title:hover {
99
- color: var(--dsw-alias-label-secondary);
100
- }
101
-
102
- .dsh-ui .arco-tabs-header-title-active,
103
- .dsh-ui .arco-tabs-header-title-active:hover {
104
- color: var(--dsw-alias-label-primary);
105
- font-weight: 500;
106
- }
107
-
108
- .dsh-ui .arco-tabs-header-ink {
109
- background-color: var(--dsw-alias-brand-primary);
110
- height: 2px;
111
- }
112
-
113
- .dsh-ui .arco-tabs-content {
114
- padding-top: 16px;
115
- }
116
-
117
- /* 卡片式标签改为胶囊分段 */
118
- .dsh-ui .dsh-tabs--segment .arco-tabs-header-nav {
119
- background-color: var(--dsw-alias-interactive-bg-hover-solid);
120
- border-radius: var(--dsw-radius-md, 12px);
121
- padding: 4px;
122
- display: inline-flex;
123
- }
124
-
125
- .dsh-ui .dsh-tabs--segment .arco-tabs-header-nav::before {
126
- display: none;
127
- }
128
-
129
- /* Arco 的行式标签给首个标题额外加了 16px 左外边距,分段外观下会变成大面积留白。 */
130
- .dsh-ui .dsh-tabs--segment .arco-tabs-header > .arco-tabs-header-title:first-of-type,
131
- .dsh-ui .dsh-tabs--segment .arco-tabs-header-scroll > .arco-tabs-header-title:first-of-type {
132
- margin-left: 0;
133
- }
134
-
135
- .dsh-ui .dsh-tabs--segment .arco-tabs-header-title {
136
- border-radius: var(--dsw-radius-sm, 8px);
137
- height: 28px;
138
- line-height: 20px;
139
- padding: 4px 16px;
140
- margin: 0;
141
- font-size: 13px;
142
- font-weight: 500;
143
- }
144
-
145
- .dsh-ui .dsh-tabs--segment .arco-tabs-header-title-active {
146
- background-color: var(--dsw-alias-bg-layer-1);
147
- box-shadow: var(--dsw-elevation-soft);
148
- }
149
-
150
- .dsh-ui .dsh-tabs--segment .arco-tabs-header-ink {
151
- display: none;
152
- }
153
-
154
- /* ── 面包屑 ─────────────────────────────────────────────────────── */
155
- .dsh-ui .arco-breadcrumb {
156
- font-size: 13px;
157
- line-height: 20px;
158
- color: var(--dsw-alias-label-tertiary);
159
- }
160
-
161
- .dsh-ui .arco-breadcrumb-item a,
162
- .dsh-ui .arco-breadcrumb-item-link {
163
- color: var(--dsw-alias-label-tertiary);
164
- font-weight: 400;
165
- }
166
-
167
- .dsh-ui .arco-breadcrumb-item a:hover,
168
- .dsh-ui .arco-breadcrumb-item-link:hover {
169
- color: var(--dsw-alias-label-primary);
170
- }
171
-
172
- .dsh-ui .arco-breadcrumb-item:last-child {
173
- color: var(--dsw-alias-label-primary);
174
- font-weight: 500;
175
- }
176
-
177
- /* ── 分页 ───────────────────────────────────────────────────────── */
178
- .dsh-ui .arco-pagination-item {
179
- border-radius: var(--dsw-radius-sm, 8px);
180
- border: 0;
181
- background-color: transparent;
182
- color: var(--dsw-alias-label-secondary);
183
- font-size: 13px;
184
- min-width: 28px;
185
- height: 28px;
186
- line-height: 28px;
187
- }
188
-
189
- @media (hover: hover) {
190
- .dsh-ui .arco-pagination-item:hover {
191
- background-color: var(--dsw-alias-interactive-bg-hover);
192
- color: var(--dsw-alias-label-primary);
193
- }
194
- }
195
-
196
- .dsh-ui .arco-pagination-item-active {
197
- background-color: var(--dsw-alias-button-ghost-active-fill);
198
- color: var(--dsw-alias-label-primary);
199
- font-weight: 500;
200
- }
201
-
202
- .dsh-ui .arco-pagination-item-disabled {
203
- color: var(--dsw-alias-label-caption);
204
- }
205
-
206
- /* ── 步骤条 ─────────────────────────────────────────────────────── */
207
- .dsh-ui .arco-steps-item-title {
208
- font-size: 14px;
209
- line-height: 22px;
210
- color: var(--dsw-alias-label-primary);
211
- }
212
-
213
- .dsh-ui .arco-steps-item-description {
214
- font-size: 12px;
215
- line-height: 18px;
216
- color: var(--dsw-alias-label-tertiary);
217
- }
218
-
219
- .dsh-ui .arco-steps-item-wait .arco-steps-item-title {
220
- color: var(--dsw-alias-label-tertiary);
221
- }
222
-
223
- .dsh-ui .arco-steps-item-process .arco-steps-icon,
224
- .dsh-ui .arco-steps-item-finish .arco-steps-icon {
225
- background-color: var(--dsw-alias-brand-primary);
226
- color: var(--dsw-alias-label-primary-foreground);
227
- }
228
-
229
- .dsh-ui .arco-steps-item-wait .arco-steps-icon {
230
- background-color: var(--dsw-alias-bg-module-platform);
231
- color: var(--dsw-alias-label-tertiary);
232
- }
233
-
234
- /* ── 分段控件 ───────────────────────────────────────────────────── */
235
- .dsh-segmented {
236
- position: relative;
237
- display: inline-grid;
238
- /* 放在 grid 容器里时,inline-grid 仍会被拉伸到整行;按内容收缩才符合宿主的
239
- 表单控件观感。需要撑满时用 block 形态。 */
240
- justify-self: start;
241
- width: fit-content;
242
- grid-auto-flow: column;
243
- grid-auto-columns: 1fr;
244
- gap: 2px;
245
- padding: 4px;
246
- border-radius: var(--dsw-radius-md, 12px);
247
- background-color: var(--dsw-alias-interactive-bg-hover-solid);
248
- }
249
-
250
- .dsh-segmented--block {
251
- display: grid;
252
- width: 100%;
253
- justify-self: stretch;
254
- }
255
-
256
- .dsh-segmented__indicator {
257
- position: absolute;
258
- top: 4px;
259
- left: 4px;
260
- width: calc((100% - 8px - 2px * (var(--dsh-segment-count) - 1)) / var(--dsh-segment-count));
261
- height: calc(100% - 8px);
262
- border: 0;
263
- border-radius: var(--dsw-radius-sm, 8px);
264
- background-color: var(--dsw-alias-bg-layer-1);
265
- box-shadow: var(--dsw-elevation-soft);
266
- transform: translateX(calc(var(--dsh-segment-index) * (100% + 2px)));
267
- transition: transform 160ms ease;
268
- pointer-events: none;
269
- }
270
-
271
- .dsh-segmented__tab {
272
- position: relative;
273
- z-index: 1;
274
- height: 28px;
275
- padding: 0 16px;
276
- border: 0;
277
- border-radius: var(--dsw-radius-sm, 8px);
278
- background-color: transparent;
279
- color: var(--dsw-alias-label-secondary);
280
- font-family: inherit;
281
- font-size: 13px;
282
- line-height: 20px;
283
- font-weight: 500;
284
- white-space: nowrap;
285
- cursor: pointer;
286
- transition: color 120ms ease;
287
- }
288
-
289
- .dsh-segmented__tab[aria-selected='true'] {
290
- color: var(--dsw-alias-label-primary);
291
- }
292
-
293
- @media (hover: hover) {
294
- .dsh-segmented__tab:hover:not(:disabled) {
295
- color: var(--dsw-alias-label-primary);
296
- }
297
- }
298
-
299
- .dsh-segmented__tab:disabled {
300
- cursor: default;
301
- opacity: 0.4;
302
- }
303
-
304
- /* ── 折叠标题行 ─────────────────────────────────────────────────── */
305
- .dsh-disclosure {
306
- display: flex;
307
- flex-direction: column;
308
- width: 100%;
309
- min-width: 0;
310
- }
311
-
312
- .dsh-disclosure__header {
313
- display: flex;
314
- align-items: center;
315
- min-width: 0;
316
- gap: 6px;
317
- height: 24px;
318
- color: var(--dsw-alias-label-tertiary);
319
- transition: color 100ms ease;
320
- }
321
-
322
- .dsh-disclosure__header--expandable {
323
- cursor: pointer;
324
- border: 0;
325
- background: none;
326
- padding: 0;
327
- /* 按钮不继承父级文字颜色,不写这一行在深色主题下会是浏览器默认的黑色。 */
328
- color: inherit;
329
- font-family: inherit;
330
- font-size: 13px;
331
- line-height: 24px;
332
- text-align: left;
333
- width: 100%;
334
- }
335
-
336
- @media (hover: hover) {
337
- .dsh-disclosure__header--expandable:hover {
338
- color: var(--dsw-alias-label-secondary);
339
- }
340
- }
341
-
342
- .dsh-disclosure__leading {
343
- display: inline-flex;
344
- flex: none;
345
- width: 16px;
346
- height: 16px;
347
- align-items: center;
348
- justify-content: center;
349
- color: inherit;
350
- }
351
-
352
- .dsh-disclosure__title {
353
- flex: none;
354
- font-size: 13px;
355
- line-height: 24px;
356
- color: inherit;
357
- }
358
-
359
- .dsh-disclosure__content {
360
- min-width: 0;
361
- color: var(--dsw-alias-label-primary);
362
- }
363
-
364
- /* ── 状态点 ─────────────────────────────────────────────────────── */
365
- .dsh-state-dot {
366
- position: relative;
367
- display: inline-block;
368
- flex: none;
369
- width: 10px;
370
- height: 10px;
371
- }
372
-
373
- .dsh-state-dot::after {
374
- content: '';
375
- position: absolute;
376
- inset: 20%;
377
- border-radius: 50%;
378
- corner-shape: round;
379
- background-color: currentColor;
380
- }
381
-
382
- .dsh-state-dot[data-state='done'] {
383
- color: var(--dsw-alias-state-success-primary);
384
- }
385
-
386
- .dsh-state-dot[data-state='warning'] {
387
- color: var(--dsw-alias-state-warn-primary);
388
- }
389
-
390
- .dsh-state-dot[data-state='error'] {
391
- color: var(--dsw-alias-state-error-primary);
392
- }
393
-
394
- .dsh-state-dot[data-state='idle'] {
395
- color: var(--dsw-alias-state-idle-primary);
396
- }
397
-
398
- .dsh-state-dot[data-state='ongoing'] {
399
- color: var(--dsw-alias-label-tertiary);
400
- }
401
-
402
- .dsh-state-dot[data-state='ongoing']::after {
403
- inset: 0;
404
- border-radius: 50%;
405
- corner-shape: round;
406
- background: none;
407
- border: 2px solid currentColor;
408
- border-right-color: transparent;
409
- animation: dsh-state-dot-spin 1.5s linear infinite;
410
- }
411
-
412
- @keyframes dsh-state-dot-spin {
413
- to {
414
- transform: rotate(360deg);
415
- }
416
- }
417
-
418
- @media (prefers-reduced-motion: reduce) {
419
- .dsh-state-dot[data-state='ongoing']::after {
420
- animation: none;
421
- }
422
-
423
- .dsh-segmented__indicator,
424
- .dsh-segmented__tab,
425
- .dsh-disclosure__header {
426
- transition: none;
427
- }
428
- }
429
- `
430
-
431
- /**
432
- * 注入导航组件样式。幂等。
433
- *
434
- * @returns 释放函数。
435
- */
436
- export function injectNavigationStyles(): () => void {
437
- return injectUiStyle('navigation/components.css', NAVIGATION_CSS)
438
- }
1
+ /**
2
+ * 导航组件追加样式。
3
+ *
4
+ * 菜单表面使用宿主菜单材质(`--dsw-specific-menu` 配 `--dsw-menu-backdrop-filter`),
5
+ * 浮起表面用描边阴影而不是边框,与宿主自己的下拉菜单一致。
6
+ *
7
+ * @module @dsh-plugin/dsh-ui-components/navigation/styles
8
+ */
9
+ import { injectUiStyle } from '../foundation/style.js'
10
+
11
+ /** 导航组件样式表。 */
12
+ export const NAVIGATION_CSS = `
13
+ /* ── 菜单与下拉 ─────────────────────────────────────────────────── */
14
+ .dsh-ui .arco-menu {
15
+ background-color: transparent;
16
+ border: 0;
17
+ font-size: 14px;
18
+ line-height: 22px;
19
+ }
20
+
21
+ .dsh-ui .arco-menu-item,
22
+ .dsh-ui .arco-menu-pop-header {
23
+ border-radius: var(--dsw-radius-sm, 8px);
24
+ color: var(--dsw-alias-label-secondary);
25
+ line-height: 32px;
26
+ height: 32px;
27
+ padding: 0 10px;
28
+ margin: 2px 0;
29
+ }
30
+
31
+ @media (hover: hover) {
32
+ .dsh-ui .arco-menu-item:hover,
33
+ .dsh-ui .arco-menu-pop-header:hover {
34
+ background-color: var(--dsw-alias-interactive-bg-hover);
35
+ color: var(--dsw-alias-label-primary);
36
+ }
37
+ }
38
+
39
+ .dsh-ui .arco-menu-selected,
40
+ .dsh-ui .arco-menu-item.arco-menu-selected {
41
+ background-color: var(--dsw-alias-button-ghost-active-fill);
42
+ color: var(--dsw-alias-label-primary);
43
+ font-weight: 500;
44
+ }
45
+
46
+ .dsh-ui .arco-menu-inline-header {
47
+ color: var(--dsw-alias-label-tertiary);
48
+ font-size: 12px;
49
+ line-height: 18px;
50
+ padding: 8px 10px 4px;
51
+ height: auto;
52
+ }
53
+
54
+ .dsh-ui-overlay .arco-dropdown-menu,
55
+ .dsh-ui .arco-dropdown-menu {
56
+ border-radius: var(--dsw-radius-lg, 16px);
57
+ border: 0;
58
+ background: var(--dsw-specific-menu, var(--dsw-alias-bg-layer-2));
59
+ backdrop-filter: var(--dsw-menu-backdrop-filter, none);
60
+ box-shadow: var(--dsw-elevation-panel);
61
+ padding: 4px;
62
+ min-width: 160px;
63
+ }
64
+
65
+ .dsh-ui-overlay .arco-dropdown-menu-item,
66
+ .dsh-ui .arco-dropdown-menu-item {
67
+ border-radius: var(--dsw-radius-sm, 8px);
68
+ font-size: 14px;
69
+ line-height: 22px;
70
+ height: 32px;
71
+ color: var(--dsw-alias-label-primary);
72
+ }
73
+
74
+ @media (hover: hover) {
75
+ .dsh-ui-overlay .arco-dropdown-menu-item:hover,
76
+ .dsh-ui .arco-dropdown-menu-item:hover {
77
+ background-color: var(--dsw-alias-interactive-bg-hover);
78
+ }
79
+ }
80
+
81
+ .dsh-ui-overlay .arco-dropdown-menu-item-disabled,
82
+ .dsh-ui .arco-dropdown-menu-item-disabled {
83
+ color: var(--dsw-alias-label-caption);
84
+ }
85
+
86
+ /* ── 标签页 ─────────────────────────────────────────────────────── */
87
+ .dsh-ui .arco-tabs-header-nav::before {
88
+ background-color: var(--dsw-alias-border-l1);
89
+ }
90
+
91
+ .dsh-ui .arco-tabs-header-title {
92
+ font-size: 14px;
93
+ line-height: 22px;
94
+ color: var(--dsw-alias-label-tertiary);
95
+ font-weight: 400;
96
+ }
97
+
98
+ .dsh-ui .arco-tabs-header-title:hover {
99
+ color: var(--dsw-alias-label-secondary);
100
+ }
101
+
102
+ .dsh-ui .arco-tabs-header-title-active,
103
+ .dsh-ui .arco-tabs-header-title-active:hover {
104
+ color: var(--dsw-alias-label-primary);
105
+ font-weight: 500;
106
+ }
107
+
108
+ .dsh-ui .arco-tabs-header-ink {
109
+ background-color: var(--dsw-alias-brand-primary);
110
+ height: 2px;
111
+ }
112
+
113
+ .dsh-ui .arco-tabs-content {
114
+ padding-top: 16px;
115
+ }
116
+
117
+ /* 卡片式标签改为胶囊分段 */
118
+ .dsh-ui .dsh-tabs--segment .arco-tabs-header-nav {
119
+ background-color: var(--dsw-alias-interactive-bg-hover-solid);
120
+ border-radius: var(--dsw-radius-md, 12px);
121
+ padding: 4px;
122
+ display: inline-flex;
123
+ }
124
+
125
+ .dsh-ui .dsh-tabs--segment .arco-tabs-header-nav::before {
126
+ display: none;
127
+ }
128
+
129
+ /* Arco 的行式标签给首个标题额外加了 16px 左外边距,分段外观下会变成大面积留白。 */
130
+ .dsh-ui .dsh-tabs--segment .arco-tabs-header > .arco-tabs-header-title:first-of-type,
131
+ .dsh-ui .dsh-tabs--segment .arco-tabs-header-scroll > .arco-tabs-header-title:first-of-type {
132
+ margin-left: 0;
133
+ }
134
+
135
+ .dsh-ui .dsh-tabs--segment .arco-tabs-header-title {
136
+ border-radius: var(--dsw-radius-sm, 8px);
137
+ height: 28px;
138
+ line-height: 20px;
139
+ padding: 4px 16px;
140
+ margin: 0;
141
+ font-size: 13px;
142
+ font-weight: 500;
143
+ }
144
+
145
+ .dsh-ui .dsh-tabs--segment .arco-tabs-header-title-active {
146
+ background-color: var(--dsw-alias-bg-layer-1);
147
+ box-shadow: var(--dsw-elevation-soft);
148
+ }
149
+
150
+ .dsh-ui .dsh-tabs--segment .arco-tabs-header-ink {
151
+ display: none;
152
+ }
153
+
154
+ /* ── 面包屑 ─────────────────────────────────────────────────────── */
155
+ .dsh-ui .arco-breadcrumb {
156
+ font-size: 13px;
157
+ line-height: 20px;
158
+ color: var(--dsw-alias-label-tertiary);
159
+ }
160
+
161
+ .dsh-ui .arco-breadcrumb-item a,
162
+ .dsh-ui .arco-breadcrumb-item-link {
163
+ color: var(--dsw-alias-label-tertiary);
164
+ font-weight: 400;
165
+ }
166
+
167
+ .dsh-ui .arco-breadcrumb-item a:hover,
168
+ .dsh-ui .arco-breadcrumb-item-link:hover {
169
+ color: var(--dsw-alias-label-primary);
170
+ }
171
+
172
+ .dsh-ui .arco-breadcrumb-item:last-child {
173
+ color: var(--dsw-alias-label-primary);
174
+ font-weight: 500;
175
+ }
176
+
177
+ /* ── 分页 ───────────────────────────────────────────────────────── */
178
+ .dsh-ui .arco-pagination-item {
179
+ border-radius: var(--dsw-radius-sm, 8px);
180
+ border: 0;
181
+ background-color: transparent;
182
+ color: var(--dsw-alias-label-secondary);
183
+ font-size: 13px;
184
+ min-width: 28px;
185
+ height: 28px;
186
+ line-height: 28px;
187
+ }
188
+
189
+ @media (hover: hover) {
190
+ .dsh-ui .arco-pagination-item:hover {
191
+ background-color: var(--dsw-alias-interactive-bg-hover);
192
+ color: var(--dsw-alias-label-primary);
193
+ }
194
+ }
195
+
196
+ .dsh-ui .arco-pagination-item-active {
197
+ background-color: var(--dsw-alias-button-ghost-active-fill);
198
+ color: var(--dsw-alias-label-primary);
199
+ font-weight: 500;
200
+ }
201
+
202
+ .dsh-ui .arco-pagination-item-disabled {
203
+ color: var(--dsw-alias-label-caption);
204
+ }
205
+
206
+ /* ── 步骤条 ─────────────────────────────────────────────────────── */
207
+ .dsh-ui .arco-steps-item-title {
208
+ font-size: 14px;
209
+ line-height: 22px;
210
+ color: var(--dsw-alias-label-primary);
211
+ }
212
+
213
+ .dsh-ui .arco-steps-item-description {
214
+ font-size: 12px;
215
+ line-height: 18px;
216
+ color: var(--dsw-alias-label-tertiary);
217
+ }
218
+
219
+ .dsh-ui .arco-steps-item-wait .arco-steps-item-title {
220
+ color: var(--dsw-alias-label-tertiary);
221
+ }
222
+
223
+ .dsh-ui .arco-steps-item-process .arco-steps-icon,
224
+ .dsh-ui .arco-steps-item-finish .arco-steps-icon {
225
+ background-color: var(--dsw-alias-brand-primary);
226
+ color: var(--dsw-alias-label-primary-foreground);
227
+ }
228
+
229
+ .dsh-ui .arco-steps-item-wait .arco-steps-icon {
230
+ background-color: var(--dsw-alias-bg-module-platform);
231
+ color: var(--dsw-alias-label-tertiary);
232
+ }
233
+
234
+ /* ── 分段控件 ───────────────────────────────────────────────────── */
235
+ .dsh-segmented {
236
+ position: relative;
237
+ display: inline-grid;
238
+ /* 放在 grid 容器里时,inline-grid 仍会被拉伸到整行;按内容收缩才符合宿主的
239
+ 表单控件观感。需要撑满时用 block 形态。 */
240
+ justify-self: start;
241
+ width: fit-content;
242
+ grid-auto-flow: column;
243
+ grid-auto-columns: 1fr;
244
+ gap: 2px;
245
+ padding: 4px;
246
+ border-radius: var(--dsw-radius-md, 12px);
247
+ background-color: var(--dsw-alias-interactive-bg-hover-solid);
248
+ }
249
+
250
+ .dsh-segmented--block {
251
+ display: grid;
252
+ width: 100%;
253
+ justify-self: stretch;
254
+ }
255
+
256
+ .dsh-segmented__indicator {
257
+ position: absolute;
258
+ top: 4px;
259
+ left: 4px;
260
+ width: calc((100% - 8px - 2px * (var(--dsh-segment-count) - 1)) / var(--dsh-segment-count));
261
+ height: calc(100% - 8px);
262
+ border: 0;
263
+ border-radius: var(--dsw-radius-sm, 8px);
264
+ background-color: var(--dsw-alias-bg-layer-1);
265
+ box-shadow: var(--dsw-elevation-soft);
266
+ transform: translateX(calc(var(--dsh-segment-index) * (100% + 2px)));
267
+ transition: transform 160ms ease;
268
+ pointer-events: none;
269
+ }
270
+
271
+ .dsh-segmented__tab {
272
+ position: relative;
273
+ z-index: 1;
274
+ height: 28px;
275
+ padding: 0 16px;
276
+ border: 0;
277
+ border-radius: var(--dsw-radius-sm, 8px);
278
+ background-color: transparent;
279
+ color: var(--dsw-alias-label-secondary);
280
+ font-family: inherit;
281
+ font-size: 13px;
282
+ line-height: 20px;
283
+ font-weight: 500;
284
+ white-space: nowrap;
285
+ cursor: pointer;
286
+ transition: color 120ms ease;
287
+ }
288
+
289
+ .dsh-segmented__tab[aria-selected='true'] {
290
+ color: var(--dsw-alias-label-primary);
291
+ }
292
+
293
+ @media (hover: hover) {
294
+ .dsh-segmented__tab:hover:not(:disabled) {
295
+ color: var(--dsw-alias-label-primary);
296
+ }
297
+ }
298
+
299
+ .dsh-segmented__tab:disabled {
300
+ cursor: default;
301
+ opacity: 0.4;
302
+ }
303
+
304
+ /* ── 折叠标题行 ─────────────────────────────────────────────────── */
305
+ .dsh-disclosure {
306
+ display: flex;
307
+ flex-direction: column;
308
+ width: 100%;
309
+ min-width: 0;
310
+ }
311
+
312
+ .dsh-disclosure__header {
313
+ display: flex;
314
+ align-items: center;
315
+ min-width: 0;
316
+ gap: 6px;
317
+ height: 24px;
318
+ color: var(--dsw-alias-label-tertiary);
319
+ transition: color 100ms ease;
320
+ }
321
+
322
+ .dsh-disclosure__header--expandable {
323
+ cursor: pointer;
324
+ border: 0;
325
+ background: none;
326
+ padding: 0;
327
+ /* 按钮不继承父级文字颜色,不写这一行在深色主题下会是浏览器默认的黑色。 */
328
+ color: inherit;
329
+ font-family: inherit;
330
+ font-size: 13px;
331
+ line-height: 24px;
332
+ text-align: left;
333
+ width: 100%;
334
+ }
335
+
336
+ @media (hover: hover) {
337
+ .dsh-disclosure__header--expandable:hover {
338
+ color: var(--dsw-alias-label-secondary);
339
+ }
340
+ }
341
+
342
+ .dsh-disclosure__leading {
343
+ display: inline-flex;
344
+ flex: none;
345
+ width: 16px;
346
+ height: 16px;
347
+ align-items: center;
348
+ justify-content: center;
349
+ color: inherit;
350
+ }
351
+
352
+ .dsh-disclosure__title {
353
+ flex: none;
354
+ font-size: 13px;
355
+ line-height: 24px;
356
+ color: inherit;
357
+ }
358
+
359
+ .dsh-disclosure__content {
360
+ min-width: 0;
361
+ color: var(--dsw-alias-label-primary);
362
+ }
363
+
364
+ /* ── 状态点 ─────────────────────────────────────────────────────── */
365
+ .dsh-state-dot {
366
+ position: relative;
367
+ display: inline-block;
368
+ flex: none;
369
+ width: 10px;
370
+ height: 10px;
371
+ }
372
+
373
+ .dsh-state-dot::after {
374
+ content: '';
375
+ position: absolute;
376
+ inset: 20%;
377
+ border-radius: 50%;
378
+ corner-shape: round;
379
+ background-color: currentColor;
380
+ }
381
+
382
+ .dsh-state-dot[data-state='done'] {
383
+ color: var(--dsw-alias-state-success-primary);
384
+ }
385
+
386
+ .dsh-state-dot[data-state='warning'] {
387
+ color: var(--dsw-alias-state-warn-primary);
388
+ }
389
+
390
+ .dsh-state-dot[data-state='error'] {
391
+ color: var(--dsw-alias-state-error-primary);
392
+ }
393
+
394
+ .dsh-state-dot[data-state='idle'] {
395
+ color: var(--dsw-alias-state-idle-primary);
396
+ }
397
+
398
+ .dsh-state-dot[data-state='ongoing'] {
399
+ color: var(--dsw-alias-label-tertiary);
400
+ }
401
+
402
+ .dsh-state-dot[data-state='ongoing']::after {
403
+ inset: 0;
404
+ border-radius: 50%;
405
+ corner-shape: round;
406
+ background: none;
407
+ border: 2px solid currentColor;
408
+ border-right-color: transparent;
409
+ animation: dsh-state-dot-spin 1.5s linear infinite;
410
+ }
411
+
412
+ @keyframes dsh-state-dot-spin {
413
+ to {
414
+ transform: rotate(360deg);
415
+ }
416
+ }
417
+
418
+ @media (prefers-reduced-motion: reduce) {
419
+ .dsh-state-dot[data-state='ongoing']::after {
420
+ animation: none;
421
+ }
422
+
423
+ .dsh-segmented__indicator,
424
+ .dsh-segmented__tab,
425
+ .dsh-disclosure__header {
426
+ transition: none;
427
+ }
428
+ }
429
+ `
430
+
431
+ /**
432
+ * 注入导航组件样式。幂等。
433
+ *
434
+ * @returns 释放函数。
435
+ */
436
+ export function injectNavigationStyles(): () => void {
437
+ return injectUiStyle('navigation/components.css', NAVIGATION_CSS)
438
+ }