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

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
@@ -8,397 +8,397 @@
8
8
  */
9
9
  import { injectUiStyle } from '../foundation/style.js';
10
10
  /** 基础控件样式表。 */
11
- export const BASIC_CSS = `
12
- /* ── 按钮 ────────────────────────────────────────────────────────── */
13
- /* Arco 的按钮基线是 inline-block,落进 flex 容器后会被块化,文字随即失去
14
- 垂直居中并在小尺寸下被裁切。DSH 的按钮是 flex 居中的,这里显式改成同一
15
- 语义,不再依赖容器的布局方式。 */
16
- .dsh-ui .arco-btn {
17
- display: inline-flex;
18
- align-items: center;
19
- justify-content: center;
20
- font-family: inherit;
21
- font-weight: 500;
22
- box-sizing: border-box;
23
- gap: 6px;
24
- }
25
-
26
- .dsh-ui .dsh-btn-md .arco-btn,
27
- .dsh-ui .arco-btn-size-default {
28
- height: 36px;
29
- font-size: 14px;
30
- line-height: 22px;
31
- padding: 0 14px;
32
- }
33
-
34
- .dsh-ui .arco-btn-size-small {
35
- height: 28px;
36
- font-size: 12px;
37
- line-height: 18px;
38
- padding: 0 10px;
39
- }
40
-
41
- .dsh-ui .arco-btn-size-large {
42
- height: 44px;
43
- font-size: 15px;
44
- line-height: 24px;
45
- padding: 0 18px;
46
- border-radius: var(--dsw-radius-lg, 16px);
47
- }
48
-
49
- .dsh-ui .arco-btn-shape-circle {
50
- border-radius: 50%;
51
- corner-shape: round;
52
- width: 36px;
53
- padding: 0;
54
- }
55
-
56
- .dsh-ui .arco-btn-shape-circle.arco-btn-size-small {
57
- width: 28px;
58
- }
59
-
60
- /* Arco 给所有按钮默认带上 shape="square",只有真正省略文字的图标按钮才该是
61
- 固定方形,因此这里按 icon-only 收紧而不是按 shape。 */
62
- .dsh-ui .arco-btn.arco-btn-icon-only {
63
- width: 36px;
64
- padding: 0;
65
- }
66
-
67
- .dsh-ui .arco-btn.arco-btn-icon-only.arco-btn-size-small {
68
- width: 28px;
69
- }
70
-
71
- .dsh-ui .arco-btn.arco-btn-icon-only.arco-btn-size-large {
72
- width: 44px;
73
- }
74
-
75
- .dsh-ui .arco-btn-icon-only {
76
- gap: 0;
77
- }
78
-
79
- /* ── 输入类控件 ──────────────────────────────────────────────────── */
80
- /* 宿主的输入框是「层级底色 + 半像素描边」,且用的是第三层(深色下比第一层亮
81
- 一档);Arco 默认用半透明的填充层且描边透明,深色主题下会明显更暗。 */
82
- .dsh-ui .arco-input,
83
- .dsh-ui .arco-input-inner-wrapper,
84
- .dsh-ui .arco-textarea,
85
- .dsh-ui .arco-input-number,
86
- .dsh-ui .arco-select-view {
87
- font-family: inherit;
88
- font-size: 14px;
89
- line-height: 22px;
90
- border-radius: var(--dsw-radius-md, 12px);
91
- background-color: var(--dsw-alias-bg-layer-3);
92
- border: 0.5px solid var(--dsw-alias-border-l4);
93
- }
94
-
95
- /* 包裹层自己画边框与底色,内部的原生输入框必须退回透明,否则会出现双层边框。 */
96
- .dsh-ui .arco-input-inner-wrapper > .arco-input,
97
- .dsh-ui .arco-input-inner-wrapper .arco-input,
98
- .dsh-ui .arco-input-number > .arco-input {
99
- border: 0;
100
- background-color: transparent;
101
- }
102
-
103
- .dsh-ui .arco-input:hover,
104
- .dsh-ui .arco-input-inner-wrapper:hover,
105
- .dsh-ui .arco-textarea:hover,
106
- .dsh-ui .arco-input-number:hover,
107
- .dsh-ui .arco-select:hover .arco-select-view,
108
- .dsh-ui .arco-select-view:hover {
109
- background-color: var(--dsw-alias-bg-layer-3);
110
- border-color: var(--dsw-alias-border-l4);
111
- }
112
-
113
- .dsh-ui .arco-input-size-default,
114
- .dsh-ui .arco-input-inner-wrapper-default {
115
- height: 32px;
116
- }
117
-
118
- .dsh-ui .arco-input-size-small,
119
- .dsh-ui .arco-input-inner-wrapper-small {
120
- height: 28px;
121
- font-size: 12px;
122
- border-radius: var(--dsw-radius-sm, 8px);
123
- }
124
-
125
- .dsh-ui .arco-input-size-large,
126
- .dsh-ui .arco-input-inner-wrapper-large {
127
- height: 44px;
128
- border-radius: var(--dsw-radius-lg, 16px);
129
- }
130
-
131
- .dsh-ui .arco-input::placeholder,
132
- .dsh-ui .arco-textarea::placeholder {
133
- color: var(--dsw-alias-label-dimmed);
134
- }
135
-
136
- /* Arco 的错误态默认用整块浅红填充;DSH 的输入框只换描边与焦点环,填充保持
137
- 背景色,避免表单错误时整片发红。 */
138
- .dsh-ui .arco-input-error,
139
- .dsh-ui .arco-textarea-error,
140
- .dsh-ui .arco-input-wrapper-error,
141
- .dsh-ui .arco-select-view-error {
142
- background-color: var(--dsw-alias-bg-layer-1);
143
- border-color: var(--dsw-alias-state-error-primary);
144
- }
145
-
146
- .dsh-ui .arco-input-error:hover,
147
- .dsh-ui .arco-textarea-error:hover,
148
- .dsh-ui .arco-input-wrapper-error:hover,
149
- .dsh-ui .arco-select-view-error:hover {
150
- background-color: var(--dsw-alias-bg-layer-1);
151
- border-color: var(--dsw-alias-state-error-primary);
152
- }
153
-
154
- .dsh-ui .arco-input-wrapper.arco-input-error > .arco-input {
155
- background: transparent;
156
- }
157
-
158
- .dsh-ui .dsh-mono .arco-input,
159
- .dsh-ui .arco-input.dsh-mono,
160
- .dsh-ui .arco-textarea.dsh-mono {
161
- font-family: var(--ds-font-family-code, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
162
- }
163
-
164
- .dsh-ui .arco-textarea {
165
- padding: 7px 12px;
166
- min-height: 72px;
167
- }
168
-
169
- .dsh-ui .dsh-textarea-sm.arco-textarea {
170
- font-size: 12px;
171
- line-height: 18px;
172
- padding: 5px 10px;
173
- min-height: 60px;
174
- border-radius: var(--dsw-radius-sm, 8px);
175
- }
176
-
177
- .dsh-ui .dsh-textarea-lg.arco-textarea {
178
- font-size: 15px;
179
- line-height: 24px;
180
- padding: 10px 14px;
181
- min-height: 96px;
182
- border-radius: var(--dsw-radius-lg, 16px);
183
- }
184
-
185
- /* ── 选择器 ─────────────────────────────────────────────────────── */
186
- .dsh-ui .arco-select-view,
187
- .dsh-ui .arco-select-view-single {
188
- font-family: inherit;
189
- font-size: 14px;
190
- border-radius: var(--dsw-radius-md, 12px);
191
- }
192
-
193
- .dsh-ui .arco-select-size-default .arco-select-view {
194
- height: 32px;
195
- }
196
-
197
- .dsh-ui .arco-select-size-small .arco-select-view {
198
- height: 28px;
199
- font-size: 12px;
200
- border-radius: var(--dsw-radius-sm, 8px);
201
- }
202
-
203
- .dsh-ui .arco-select-popup,
204
- .dsh-ui .arco-select-dropdown {
205
- border-radius: var(--dsw-radius-lg, 16px);
206
- padding: 4px;
207
- }
208
-
209
- .dsh-ui .arco-select-option {
210
- border-radius: var(--dsw-radius-sm, 8px);
211
- min-height: 32px;
212
- line-height: 22px;
213
- font-size: 14px;
214
- }
215
-
216
- .dsh-ui .arco-select-option-hover {
217
- background-color: var(--dsw-alias-interactive-bg-hover);
218
- }
219
-
220
- .dsh-ui .arco-select-option-selected {
221
- background-color: var(--dsw-alias-button-ghost-active-fill);
222
- color: var(--dsw-alias-label-primary);
223
- font-weight: 500;
224
- }
225
-
226
- /* ── 开关 ───────────────────────────────────────────────────────── */
227
- .dsh-ui .arco-switch {
228
- min-width: 36px;
229
- height: 20px;
230
- border-radius: 999px;
231
- corner-shape: round;
232
- background-color: var(--dsw-alias-border-l3);
233
- }
234
-
235
- .dsh-ui .arco-switch-checked {
236
- background-color: var(--dsw-alias-brand-primary);
237
- }
238
-
239
- .dsh-ui .arco-switch-dot {
240
- width: 16px;
241
- height: 16px;
242
- border-radius: 50%;
243
- corner-shape: round;
244
- background-color: var(--dsw-alias-switch-thumb);
245
- top: 2px;
246
- left: 2px;
247
- }
248
-
249
- .dsh-ui .arco-switch-checked .arco-switch-dot {
250
- background-color: var(--dsw-alias-label-primary-foreground);
251
- left: calc(100% - 18px);
252
- }
253
-
254
- .dsh-ui .arco-switch[disabled] {
255
- opacity: 0.4;
256
- }
257
-
258
- /* ── 复选框与单选框 ─────────────────────────────────────────────── */
259
- .dsh-ui .arco-checkbox,
260
- .dsh-ui .arco-radio {
261
- font-size: 14px;
262
- line-height: 20px;
263
- padding-left: 24px;
264
- }
265
-
266
- .dsh-ui .arco-checkbox-mask,
267
- .dsh-ui .arco-radio-mask {
268
- width: 16px;
269
- height: 16px;
270
- border-radius: var(--dsw-radius-xs, 4px);
271
- border-width: 1px;
272
- border-color: var(--dsw-alias-border-l4);
273
- background-color: transparent;
274
- }
275
-
276
- .dsh-ui .arco-radio-mask {
277
- border-radius: 50%;
278
- corner-shape: round;
279
- }
280
-
281
- .dsh-ui .arco-checkbox-checked .arco-checkbox-mask,
282
- .dsh-ui .arco-radio-checked .arco-radio-mask {
283
- background-color: var(--dsw-alias-brand-primary);
284
- border-color: var(--dsw-alias-brand-primary);
285
- }
286
-
287
- .dsh-ui .arco-checkbox-checked .arco-checkbox-mask-icon {
288
- color: var(--dsw-alias-label-primary-foreground);
289
- }
290
-
291
- /* Arco 的圆点是绝对定位在左上角再缩放;mask 尺寸被改大后必须重新居中。 */
292
- .dsh-ui .arco-radio-mask::after {
293
- box-sizing: border-box;
294
- width: 8px;
295
- height: 8px;
296
- top: 50%;
297
- left: 50%;
298
- transform: translate(-50%, -50%) scale(0);
299
- border-radius: 50%;
300
- transition: transform var(--ds-transition-duration-fast, 0.15s) var(--ds-ease-in-out, ease-out);
301
- }
302
-
303
- .dsh-ui .arco-radio-checked .arco-radio-mask::after {
304
- transform: translate(-50%, -50%) scale(1);
305
- background-color: var(--dsw-alias-label-primary-foreground);
306
- }
307
-
308
- /* ── 数字输入与滑块 ─────────────────────────────────────────────── */
309
- .dsh-ui .arco-input-number-step-button {
310
- border-color: transparent;
311
- color: var(--dsw-alias-label-tertiary);
312
- }
313
-
314
- /* Arco 的 road 是 12px 高的点击热区,轨道本身画在伪元素上;给 road 上色
315
- 会得到一条粗灰带,因此只给轨道和已完成段上色。 */
316
- .dsh-ui .arco-slider-road {
317
- background-color: transparent;
318
- }
319
-
320
- .dsh-ui .arco-slider-road::before {
321
- height: 4px;
322
- border-radius: 999px;
323
- background-color: var(--dsw-alias-border-l2);
324
- }
325
-
326
- .dsh-ui .arco-slider-bar {
327
- height: 4px;
328
- top: calc(50% - 2px);
329
- transform: none;
330
- border-radius: 999px;
331
- background-color: var(--dsw-alias-brand-primary);
332
- }
333
-
334
- /* Arco 把可见手柄画在手柄元素的伪元素上,外层定位盒子与轨道同为 12px 高,
335
- 因此只需调整伪元素本身的尺寸与描边。 */
336
- .dsh-ui .arco-slider-button::after {
337
- box-sizing: border-box;
338
- width: 14px;
339
- height: 14px;
340
- top: -1px;
341
- left: -1px;
342
- border: 2px solid var(--dsw-alias-brand-primary);
343
- border-radius: 50%;
344
- background-color: var(--dsw-alias-bg-layer-1);
345
- box-shadow: var(--dsw-elevation-soft);
346
- transition: transform var(--ds-transition-duration-fast, 0.15s) var(--ds-ease-in-out, ease-out);
347
- }
348
-
349
- .dsh-ui .arco-slider-button:hover::after,
350
- .dsh-ui .arco-slider-button.arco-slider-button-active::after {
351
- transform: none;
352
- border-color: var(--dsw-alias-state-business-primary);
353
- box-shadow: var(--dsw-elevation-soft);
354
- }
355
-
356
- .dsh-ui .arco-slider-button:focus-visible {
357
- outline: none;
358
- }
359
-
360
- .dsh-ui .arco-slider-button:focus-visible::after {
361
- box-shadow: 0 0 0 2px var(--dsw-alias-state-business-primary);
362
- }
363
-
364
- /* ── 表单 ───────────────────────────────────────────────────────── */
365
- .dsh-ui .arco-form-label-item > label {
366
- font-size: 13px;
367
- font-weight: 500;
368
- color: var(--dsw-alias-label-secondary);
369
- }
370
-
371
- .dsh-ui .arco-form-item-message {
372
- font-size: 12px;
373
- line-height: 18px;
374
- }
375
-
376
- .dsh-ui .arco-form-item-status-error .arco-input,
377
- .dsh-ui .arco-form-item-status-error .arco-textarea,
378
- .dsh-ui .arco-form-item-status-error .arco-select-view {
379
- border-color: var(--dsw-alias-state-error-primary);
380
- }
381
-
382
- /* ── 上传 ───────────────────────────────────────────────────────── */
383
- .dsh-ui .arco-upload-trigger,
384
- .dsh-ui .arco-upload-drag {
385
- border-radius: var(--dsw-radius-lg, 16px);
386
- border-color: var(--dsw-alias-border-l3);
387
- background-color: var(--dsw-alias-bg-layer-1);
388
- }
389
-
390
- .dsh-ui .arco-upload-drag:hover {
391
- border-color: var(--dsw-alias-state-business-primary);
392
- }
393
-
394
- /* 减少动效偏好下关闭过渡 */
395
- @media (prefers-reduced-motion: reduce) {
396
- .dsh-ui .arco-btn,
397
- .dsh-ui .arco-switch-dot,
398
- .dsh-ui .arco-slider-btn {
399
- transition: none;
400
- }
401
- }
11
+ export const BASIC_CSS = `
12
+ /* ── 按钮 ────────────────────────────────────────────────────────── */
13
+ /* Arco 的按钮基线是 inline-block,落进 flex 容器后会被块化,文字随即失去
14
+ 垂直居中并在小尺寸下被裁切。DSH 的按钮是 flex 居中的,这里显式改成同一
15
+ 语义,不再依赖容器的布局方式。 */
16
+ .dsh-ui .arco-btn {
17
+ display: inline-flex;
18
+ align-items: center;
19
+ justify-content: center;
20
+ font-family: inherit;
21
+ font-weight: 500;
22
+ box-sizing: border-box;
23
+ gap: 6px;
24
+ }
25
+
26
+ .dsh-ui .dsh-btn-md .arco-btn,
27
+ .dsh-ui .arco-btn-size-default {
28
+ height: 36px;
29
+ font-size: 14px;
30
+ line-height: 22px;
31
+ padding: 0 14px;
32
+ }
33
+
34
+ .dsh-ui .arco-btn-size-small {
35
+ height: 28px;
36
+ font-size: 12px;
37
+ line-height: 18px;
38
+ padding: 0 10px;
39
+ }
40
+
41
+ .dsh-ui .arco-btn-size-large {
42
+ height: 44px;
43
+ font-size: 15px;
44
+ line-height: 24px;
45
+ padding: 0 18px;
46
+ border-radius: var(--dsw-radius-lg, 16px);
47
+ }
48
+
49
+ .dsh-ui .arco-btn-shape-circle {
50
+ border-radius: 50%;
51
+ corner-shape: round;
52
+ width: 36px;
53
+ padding: 0;
54
+ }
55
+
56
+ .dsh-ui .arco-btn-shape-circle.arco-btn-size-small {
57
+ width: 28px;
58
+ }
59
+
60
+ /* Arco 给所有按钮默认带上 shape="square",只有真正省略文字的图标按钮才该是
61
+ 固定方形,因此这里按 icon-only 收紧而不是按 shape。 */
62
+ .dsh-ui .arco-btn.arco-btn-icon-only {
63
+ width: 36px;
64
+ padding: 0;
65
+ }
66
+
67
+ .dsh-ui .arco-btn.arco-btn-icon-only.arco-btn-size-small {
68
+ width: 28px;
69
+ }
70
+
71
+ .dsh-ui .arco-btn.arco-btn-icon-only.arco-btn-size-large {
72
+ width: 44px;
73
+ }
74
+
75
+ .dsh-ui .arco-btn-icon-only {
76
+ gap: 0;
77
+ }
78
+
79
+ /* ── 输入类控件 ──────────────────────────────────────────────────── */
80
+ /* 宿主的输入框是「层级底色 + 半像素描边」,且用的是第三层(深色下比第一层亮
81
+ 一档);Arco 默认用半透明的填充层且描边透明,深色主题下会明显更暗。 */
82
+ .dsh-ui .arco-input,
83
+ .dsh-ui .arco-input-inner-wrapper,
84
+ .dsh-ui .arco-textarea,
85
+ .dsh-ui .arco-input-number,
86
+ .dsh-ui .arco-select-view {
87
+ font-family: inherit;
88
+ font-size: 14px;
89
+ line-height: 22px;
90
+ border-radius: var(--dsw-radius-md, 12px);
91
+ background-color: var(--dsw-alias-bg-layer-3);
92
+ border: 0.5px solid var(--dsw-alias-border-l4);
93
+ }
94
+
95
+ /* 包裹层自己画边框与底色,内部的原生输入框必须退回透明,否则会出现双层边框。 */
96
+ .dsh-ui .arco-input-inner-wrapper > .arco-input,
97
+ .dsh-ui .arco-input-inner-wrapper .arco-input,
98
+ .dsh-ui .arco-input-number > .arco-input {
99
+ border: 0;
100
+ background-color: transparent;
101
+ }
102
+
103
+ .dsh-ui .arco-input:hover,
104
+ .dsh-ui .arco-input-inner-wrapper:hover,
105
+ .dsh-ui .arco-textarea:hover,
106
+ .dsh-ui .arco-input-number:hover,
107
+ .dsh-ui .arco-select:hover .arco-select-view,
108
+ .dsh-ui .arco-select-view:hover {
109
+ background-color: var(--dsw-alias-bg-layer-3);
110
+ border-color: var(--dsw-alias-border-l4);
111
+ }
112
+
113
+ .dsh-ui .arco-input-size-default,
114
+ .dsh-ui .arco-input-inner-wrapper-default {
115
+ height: 32px;
116
+ }
117
+
118
+ .dsh-ui .arco-input-size-small,
119
+ .dsh-ui .arco-input-inner-wrapper-small {
120
+ height: 28px;
121
+ font-size: 12px;
122
+ border-radius: var(--dsw-radius-sm, 8px);
123
+ }
124
+
125
+ .dsh-ui .arco-input-size-large,
126
+ .dsh-ui .arco-input-inner-wrapper-large {
127
+ height: 44px;
128
+ border-radius: var(--dsw-radius-lg, 16px);
129
+ }
130
+
131
+ .dsh-ui .arco-input::placeholder,
132
+ .dsh-ui .arco-textarea::placeholder {
133
+ color: var(--dsw-alias-label-dimmed);
134
+ }
135
+
136
+ /* Arco 的错误态默认用整块浅红填充;DSH 的输入框只换描边与焦点环,填充保持
137
+ 背景色,避免表单错误时整片发红。 */
138
+ .dsh-ui .arco-input-error,
139
+ .dsh-ui .arco-textarea-error,
140
+ .dsh-ui .arco-input-wrapper-error,
141
+ .dsh-ui .arco-select-view-error {
142
+ background-color: var(--dsw-alias-bg-layer-1);
143
+ border-color: var(--dsw-alias-state-error-primary);
144
+ }
145
+
146
+ .dsh-ui .arco-input-error:hover,
147
+ .dsh-ui .arco-textarea-error:hover,
148
+ .dsh-ui .arco-input-wrapper-error:hover,
149
+ .dsh-ui .arco-select-view-error:hover {
150
+ background-color: var(--dsw-alias-bg-layer-1);
151
+ border-color: var(--dsw-alias-state-error-primary);
152
+ }
153
+
154
+ .dsh-ui .arco-input-wrapper.arco-input-error > .arco-input {
155
+ background: transparent;
156
+ }
157
+
158
+ .dsh-ui .dsh-mono .arco-input,
159
+ .dsh-ui .arco-input.dsh-mono,
160
+ .dsh-ui .arco-textarea.dsh-mono {
161
+ font-family: var(--ds-font-family-code, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
162
+ }
163
+
164
+ .dsh-ui .arco-textarea {
165
+ padding: 7px 12px;
166
+ min-height: 72px;
167
+ }
168
+
169
+ .dsh-ui .dsh-textarea-sm.arco-textarea {
170
+ font-size: 12px;
171
+ line-height: 18px;
172
+ padding: 5px 10px;
173
+ min-height: 60px;
174
+ border-radius: var(--dsw-radius-sm, 8px);
175
+ }
176
+
177
+ .dsh-ui .dsh-textarea-lg.arco-textarea {
178
+ font-size: 15px;
179
+ line-height: 24px;
180
+ padding: 10px 14px;
181
+ min-height: 96px;
182
+ border-radius: var(--dsw-radius-lg, 16px);
183
+ }
184
+
185
+ /* ── 选择器 ─────────────────────────────────────────────────────── */
186
+ .dsh-ui .arco-select-view,
187
+ .dsh-ui .arco-select-view-single {
188
+ font-family: inherit;
189
+ font-size: 14px;
190
+ border-radius: var(--dsw-radius-md, 12px);
191
+ }
192
+
193
+ .dsh-ui .arco-select-size-default .arco-select-view {
194
+ height: 32px;
195
+ }
196
+
197
+ .dsh-ui .arco-select-size-small .arco-select-view {
198
+ height: 28px;
199
+ font-size: 12px;
200
+ border-radius: var(--dsw-radius-sm, 8px);
201
+ }
202
+
203
+ .dsh-ui .arco-select-popup,
204
+ .dsh-ui .arco-select-dropdown {
205
+ border-radius: var(--dsw-radius-lg, 16px);
206
+ padding: 4px;
207
+ }
208
+
209
+ .dsh-ui .arco-select-option {
210
+ border-radius: var(--dsw-radius-sm, 8px);
211
+ min-height: 32px;
212
+ line-height: 22px;
213
+ font-size: 14px;
214
+ }
215
+
216
+ .dsh-ui .arco-select-option-hover {
217
+ background-color: var(--dsw-alias-interactive-bg-hover);
218
+ }
219
+
220
+ .dsh-ui .arco-select-option-selected {
221
+ background-color: var(--dsw-alias-button-ghost-active-fill);
222
+ color: var(--dsw-alias-label-primary);
223
+ font-weight: 500;
224
+ }
225
+
226
+ /* ── 开关 ───────────────────────────────────────────────────────── */
227
+ .dsh-ui .arco-switch {
228
+ min-width: 36px;
229
+ height: 20px;
230
+ border-radius: 999px;
231
+ corner-shape: round;
232
+ background-color: var(--dsw-alias-border-l3);
233
+ }
234
+
235
+ .dsh-ui .arco-switch-checked {
236
+ background-color: var(--dsw-alias-brand-primary);
237
+ }
238
+
239
+ .dsh-ui .arco-switch-dot {
240
+ width: 16px;
241
+ height: 16px;
242
+ border-radius: 50%;
243
+ corner-shape: round;
244
+ background-color: var(--dsw-alias-switch-thumb);
245
+ top: 2px;
246
+ left: 2px;
247
+ }
248
+
249
+ .dsh-ui .arco-switch-checked .arco-switch-dot {
250
+ background-color: var(--dsw-alias-label-primary-foreground);
251
+ left: calc(100% - 18px);
252
+ }
253
+
254
+ .dsh-ui .arco-switch[disabled] {
255
+ opacity: 0.4;
256
+ }
257
+
258
+ /* ── 复选框与单选框 ─────────────────────────────────────────────── */
259
+ .dsh-ui .arco-checkbox,
260
+ .dsh-ui .arco-radio {
261
+ font-size: 14px;
262
+ line-height: 20px;
263
+ padding-left: 24px;
264
+ }
265
+
266
+ .dsh-ui .arco-checkbox-mask,
267
+ .dsh-ui .arco-radio-mask {
268
+ width: 16px;
269
+ height: 16px;
270
+ border-radius: var(--dsw-radius-xs, 4px);
271
+ border-width: 1px;
272
+ border-color: var(--dsw-alias-border-l4);
273
+ background-color: transparent;
274
+ }
275
+
276
+ .dsh-ui .arco-radio-mask {
277
+ border-radius: 50%;
278
+ corner-shape: round;
279
+ }
280
+
281
+ .dsh-ui .arco-checkbox-checked .arco-checkbox-mask,
282
+ .dsh-ui .arco-radio-checked .arco-radio-mask {
283
+ background-color: var(--dsw-alias-brand-primary);
284
+ border-color: var(--dsw-alias-brand-primary);
285
+ }
286
+
287
+ .dsh-ui .arco-checkbox-checked .arco-checkbox-mask-icon {
288
+ color: var(--dsw-alias-label-primary-foreground);
289
+ }
290
+
291
+ /* Arco 的圆点是绝对定位在左上角再缩放;mask 尺寸被改大后必须重新居中。 */
292
+ .dsh-ui .arco-radio-mask::after {
293
+ box-sizing: border-box;
294
+ width: 8px;
295
+ height: 8px;
296
+ top: 50%;
297
+ left: 50%;
298
+ transform: translate(-50%, -50%) scale(0);
299
+ border-radius: 50%;
300
+ transition: transform var(--ds-transition-duration-fast, 0.15s) var(--ds-ease-in-out, ease-out);
301
+ }
302
+
303
+ .dsh-ui .arco-radio-checked .arco-radio-mask::after {
304
+ transform: translate(-50%, -50%) scale(1);
305
+ background-color: var(--dsw-alias-label-primary-foreground);
306
+ }
307
+
308
+ /* ── 数字输入与滑块 ─────────────────────────────────────────────── */
309
+ .dsh-ui .arco-input-number-step-button {
310
+ border-color: transparent;
311
+ color: var(--dsw-alias-label-tertiary);
312
+ }
313
+
314
+ /* Arco 的 road 是 12px 高的点击热区,轨道本身画在伪元素上;给 road 上色
315
+ 会得到一条粗灰带,因此只给轨道和已完成段上色。 */
316
+ .dsh-ui .arco-slider-road {
317
+ background-color: transparent;
318
+ }
319
+
320
+ .dsh-ui .arco-slider-road::before {
321
+ height: 4px;
322
+ border-radius: 999px;
323
+ background-color: var(--dsw-alias-border-l2);
324
+ }
325
+
326
+ .dsh-ui .arco-slider-bar {
327
+ height: 4px;
328
+ top: calc(50% - 2px);
329
+ transform: none;
330
+ border-radius: 999px;
331
+ background-color: var(--dsw-alias-brand-primary);
332
+ }
333
+
334
+ /* Arco 把可见手柄画在手柄元素的伪元素上,外层定位盒子与轨道同为 12px 高,
335
+ 因此只需调整伪元素本身的尺寸与描边。 */
336
+ .dsh-ui .arco-slider-button::after {
337
+ box-sizing: border-box;
338
+ width: 14px;
339
+ height: 14px;
340
+ top: -1px;
341
+ left: -1px;
342
+ border: 2px solid var(--dsw-alias-brand-primary);
343
+ border-radius: 50%;
344
+ background-color: var(--dsw-alias-bg-layer-1);
345
+ box-shadow: var(--dsw-elevation-soft);
346
+ transition: transform var(--ds-transition-duration-fast, 0.15s) var(--ds-ease-in-out, ease-out);
347
+ }
348
+
349
+ .dsh-ui .arco-slider-button:hover::after,
350
+ .dsh-ui .arco-slider-button.arco-slider-button-active::after {
351
+ transform: none;
352
+ border-color: var(--dsw-alias-state-business-primary);
353
+ box-shadow: var(--dsw-elevation-soft);
354
+ }
355
+
356
+ .dsh-ui .arco-slider-button:focus-visible {
357
+ outline: none;
358
+ }
359
+
360
+ .dsh-ui .arco-slider-button:focus-visible::after {
361
+ box-shadow: 0 0 0 2px var(--dsw-alias-state-business-primary);
362
+ }
363
+
364
+ /* ── 表单 ───────────────────────────────────────────────────────── */
365
+ .dsh-ui .arco-form-label-item > label {
366
+ font-size: 13px;
367
+ font-weight: 500;
368
+ color: var(--dsw-alias-label-secondary);
369
+ }
370
+
371
+ .dsh-ui .arco-form-item-message {
372
+ font-size: 12px;
373
+ line-height: 18px;
374
+ }
375
+
376
+ .dsh-ui .arco-form-item-status-error .arco-input,
377
+ .dsh-ui .arco-form-item-status-error .arco-textarea,
378
+ .dsh-ui .arco-form-item-status-error .arco-select-view {
379
+ border-color: var(--dsw-alias-state-error-primary);
380
+ }
381
+
382
+ /* ── 上传 ───────────────────────────────────────────────────────── */
383
+ .dsh-ui .arco-upload-trigger,
384
+ .dsh-ui .arco-upload-drag {
385
+ border-radius: var(--dsw-radius-lg, 16px);
386
+ border-color: var(--dsw-alias-border-l3);
387
+ background-color: var(--dsw-alias-bg-layer-1);
388
+ }
389
+
390
+ .dsh-ui .arco-upload-drag:hover {
391
+ border-color: var(--dsw-alias-state-business-primary);
392
+ }
393
+
394
+ /* 减少动效偏好下关闭过渡 */
395
+ @media (prefers-reduced-motion: reduce) {
396
+ .dsh-ui .arco-btn,
397
+ .dsh-ui .arco-switch-dot,
398
+ .dsh-ui .arco-slider-btn {
399
+ transition: none;
400
+ }
401
+ }
402
402
  `;
403
403
  /**
404
404
  * 注入基础控件样式。幂等,可在任意控件首次渲染时调用。