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