niuma-ui 1.0.0 → 1.0.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 (159) hide show
  1. package/CHANGELOG.md +50 -1
  2. package/NOTICE +2 -2
  3. package/package.json +13 -5
  4. package/src/__tests__/RsButton.spec.ts +47 -0
  5. package/src/__tests__/RsCard.spec.ts +160 -1
  6. package/src/__tests__/RsConfirmDialog.spec.ts +127 -0
  7. package/src/__tests__/RsContextMenu.spec.ts +12 -0
  8. package/src/__tests__/RsDateTimePicker.spec.ts +11 -0
  9. package/src/__tests__/RsDescriptions.spec.ts +50 -0
  10. package/src/__tests__/RsDialog.spec.ts +117 -0
  11. package/src/__tests__/RsDrawer.spec.ts +96 -3
  12. package/src/__tests__/RsDynamicTags.spec.ts +52 -0
  13. package/src/__tests__/RsForm.spec.ts +245 -1
  14. package/src/__tests__/RsInput.spec.ts +15 -1
  15. package/src/__tests__/RsMenu.spec.ts +406 -14
  16. package/src/__tests__/RsPagination.spec.ts +67 -2
  17. package/src/__tests__/RsSelect.spec.ts +42 -1
  18. package/src/__tests__/RsSwitch.spec.ts +44 -0
  19. package/src/__tests__/RsTable.a11y.spec.ts +83 -0
  20. package/src/__tests__/RsTable.dom-baseline.spec.ts +87 -0
  21. package/src/__tests__/RsTable.perf.spec.ts +23 -4
  22. package/src/__tests__/RsTable.spec.ts +63 -8
  23. package/src/__tests__/RsTable.ssr.spec.ts +71 -0
  24. package/src/__tests__/RsTable.summary.spec.ts +45 -0
  25. package/src/__tests__/RsTabs.spec.ts +102 -4
  26. package/src/__tests__/RsTerminal.spec.ts +1 -1
  27. package/src/__tests__/RsTimePicker.spec.ts +11 -0
  28. package/src/__tests__/RsUpload.spec.ts +62 -6
  29. package/src/__tests__/createRsDialog.spec.ts +145 -0
  30. package/src/__tests__/form-rules.spec.ts +76 -0
  31. package/src/__tests__/perf-budgets.ts +32 -0
  32. package/src/__tests__/rs-table-api.spec.ts +206 -0
  33. package/src/__tests__/rs-table-compat-matrix.spec.ts +108 -0
  34. package/src/__tests__/rs-table-echarts-adapter.spec.ts +43 -0
  35. package/src/__tests__/rs-table-grid-nav.spec.ts +63 -0
  36. package/src/__tests__/rs-table-isolation.spec.ts +158 -0
  37. package/src/__tests__/split-pane-utils.spec.ts +21 -0
  38. package/src/__tests__/table-chart-utils.spec.ts +88 -0
  39. package/src/__tests__/table-summary-utils.spec.ts +62 -0
  40. package/src/__tests__/table-utils.spec.ts +124 -0
  41. package/src/__tests__/theme.spec.ts +25 -0
  42. package/src/__tests__/useRsTableColumnResize.spec.ts +25 -0
  43. package/src/__tests__/useRsTableCore.perf.spec.ts +170 -0
  44. package/src/components/RsAlert.vue +212 -0
  45. package/src/components/RsButton.vue +145 -21
  46. package/src/components/RsCard.vue +200 -16
  47. package/src/components/RsConfirmDialog.vue +215 -28
  48. package/src/components/RsContextMenu.vue +51 -13
  49. package/src/components/RsDatePicker.vue +267 -34
  50. package/src/components/RsDateTimePicker.vue +19 -2
  51. package/src/components/RsDescriptions.vue +186 -0
  52. package/src/components/RsDescriptionsItem.vue +32 -0
  53. package/src/components/RsDialog.vue +363 -51
  54. package/src/components/RsDivider.vue +89 -0
  55. package/src/components/RsDrawer.vue +558 -33
  56. package/src/components/RsDropdown.vue +33 -2
  57. package/src/components/RsDynamicTags.vue +517 -0
  58. package/src/components/RsForm.vue +97 -8
  59. package/src/components/RsInput.vue +80 -82
  60. package/src/components/RsInputNumber.vue +64 -23
  61. package/src/components/RsLabel.vue +20 -5
  62. package/src/components/RsLoadingBar.vue +151 -0
  63. package/src/components/RsMenu.vue +73 -15
  64. package/src/components/RsMenuItems.vue +147 -9
  65. package/src/components/RsPagination.vue +93 -14
  66. package/src/components/RsRadio.vue +81 -0
  67. package/src/components/RsRadioItem.vue +156 -0
  68. package/src/components/RsSelect.vue +67 -58
  69. package/src/components/RsSplitPane.vue +69 -1
  70. package/src/components/RsSwitch.vue +179 -0
  71. package/src/components/RsTable.vue +653 -2555
  72. package/src/components/RsTabs.vue +415 -83
  73. package/src/components/RsTag.vue +191 -0
  74. package/src/components/RsTerminal.vue +3 -3
  75. package/src/components/RsTimePicker.vue +44 -5
  76. package/src/components/RsTimePickerColumns.vue +136 -77
  77. package/src/components/RsToaster.vue +58 -18
  78. package/src/components/RsTree.vue +39 -21
  79. package/src/components/RsUpload.vue +145 -12
  80. package/src/components/RsVNodeHost.vue +20 -0
  81. package/src/components/button-utils.ts +39 -0
  82. package/src/components/context-menu-utils.ts +6 -0
  83. package/src/components/date-picker-utils.ts +84 -4
  84. package/src/components/descriptions-utils.ts +24 -0
  85. package/src/components/dialog-utils.ts +147 -0
  86. package/src/components/dialog-window.ts +74 -9
  87. package/src/components/drawer-utils.ts +73 -0
  88. package/src/components/form-rules.ts +257 -0
  89. package/src/components/form-utils.ts +52 -2
  90. package/src/components/menu-utils.ts +11 -0
  91. package/src/components/overlay-utils.ts +3 -0
  92. package/src/components/radio-utils.ts +12 -0
  93. package/src/components/reka.ts +5 -0
  94. package/src/components/select-utils.ts +21 -2
  95. package/src/components/split-pane-utils.ts +65 -12
  96. package/src/components/table/RsTableBody.vue +217 -0
  97. package/src/components/table/RsTableBodyRow.vue +90 -1
  98. package/src/components/table/RsTableColGroup.vue +41 -0
  99. package/src/components/table/RsTableHeader.vue +158 -0
  100. package/src/components/table/RsTableSummaryRow.vue +52 -0
  101. package/src/components/table/rs-table-api.ts +99 -0
  102. package/src/components/table/rs-table-compat-matrix.ts +71 -0
  103. package/src/components/table/rs-table-echarts-adapter.ts +81 -0
  104. package/src/components/table/rs-table-feature-host.ts +178 -0
  105. package/src/components/table/rs-table-grid-nav.ts +122 -0
  106. package/src/components/table/rs-table-header-types.ts +47 -0
  107. package/src/components/table/rs-table-module-registry.ts +72 -0
  108. package/src/components/table/rs-table-props.ts +274 -0
  109. package/src/components/table/rs-table-view-context.ts +258 -0
  110. package/src/components/table/rs-table.css +84 -6
  111. package/src/components/table/table-chart-utils.ts +165 -0
  112. package/src/components/table/table-features.ts +284 -0
  113. package/src/components/table/table-summary-utils.ts +194 -0
  114. package/src/components/table-utils.ts +452 -2
  115. package/src/components/tabs-utils.ts +142 -2
  116. package/src/components/terminal-utils.ts +1 -1
  117. package/src/components/terminal-wheel.ts +1 -1
  118. package/src/components/time-picker-utils.ts +76 -3
  119. package/src/components/upload-utils.ts +122 -0
  120. package/src/components/virtual-list-utils.ts +15 -2
  121. package/src/composables/assembleRsTableApi.ts +79 -0
  122. package/src/composables/bindRsTableViewContext.ts +269 -0
  123. package/src/composables/createRsDialog.ts +357 -0
  124. package/src/composables/createRsTableEditEmitBridge.ts +38 -0
  125. package/src/composables/useRsLoadingBar.ts +36 -0
  126. package/src/composables/useRsTable.ts +134 -0
  127. package/src/composables/useRsTableA11y.ts +52 -0
  128. package/src/composables/useRsTableChartBridge.ts +79 -0
  129. package/src/composables/useRsTableColumnLayout.ts +320 -0
  130. package/src/composables/useRsTableColumnResize.ts +244 -0
  131. package/src/composables/useRsTableColumnVirtual.ts +180 -0
  132. package/src/composables/useRsTableColumns.ts +200 -0
  133. package/src/composables/useRsTableContextMenu.ts +257 -0
  134. package/src/composables/useRsTableCore.ts +256 -0
  135. package/src/composables/useRsTableEditActions.ts +606 -0
  136. package/src/composables/useRsTableEditLayer.ts +251 -0
  137. package/src/composables/useRsTableEngine.ts +357 -0
  138. package/src/composables/useRsTableGridKeyboard.ts +123 -0
  139. package/src/composables/useRsTableHeadless.ts +137 -0
  140. package/src/composables/useRsTableInteraction.ts +433 -0
  141. package/src/composables/useRsTableScrollHost.ts +75 -0
  142. package/src/composables/useRsTableScrollLayout.ts +255 -0
  143. package/src/composables/useRsTableSelectionSource.ts +89 -0
  144. package/src/composables/useRsTableShell.ts +416 -0
  145. package/src/composables/useRsTableShellChrome.ts +170 -0
  146. package/src/composables/useRsTableSummary.ts +113 -0
  147. package/src/composables/useRsTableViewProvide.ts +263 -0
  148. package/src/composables/useRsTableVirtual.ts +154 -0
  149. package/src/composables/useRsTabsNav.ts +4 -0
  150. package/src/composables/useTableEdit.ts +1 -1
  151. package/src/icons/lucide.ts +2 -2
  152. package/src/index.ts +309 -9
  153. package/src/locale/messages.ts +30 -0
  154. package/src/styles.css +305 -52
  155. package/src/theme/brand.example.css +21 -2
  156. package/src/theme/presets.ts +4 -0
  157. package/src/theme/types.ts +67 -0
  158. package/src/components/RsTableColgroup.vue +0 -17
  159. package/src/components/RsTableHeaderRow.vue +0 -30
package/src/styles.css CHANGED
@@ -9,13 +9,43 @@
9
9
  --rs-radius-lg: 1rem;
10
10
  --rs-radius-full: 9999px;
11
11
 
12
- --rs-font-size-xs: 0.75rem;
13
- --rs-font-size-sm: 0.875rem;
14
- --rs-font-size-base: 1rem;
15
- --rs-font-size-lg: 1.125rem;
12
+ /*
13
+ * 排版阶梯(对齐 Ant Design / Arco / MD3 常用档位)
14
+ * xs=Caption · sm=Secondary · base=Body · lg=Emphasized
15
+ * xl=Title · 2xl=Heading · 3xl=Display
16
+ */
17
+ --rs-font-size-xs: 0.75rem; /* 12px @ 16 */
18
+ --rs-font-size-sm: 0.875rem; /* 14px */
19
+ --rs-font-size-base: 1rem; /* 16px */
20
+ --rs-font-size-lg: 1.125rem; /* 18px */
21
+ --rs-font-size-xl: 1.25rem; /* 20px */
22
+ --rs-font-size-2xl: 1.5rem; /* 24px */
23
+ --rs-font-size-3xl: 1.875rem; /* 30px */
24
+
25
+ --rs-font-weight-regular: 400;
26
+ --rs-font-weight-medium: 500;
27
+ --rs-font-weight-semibold: 600;
28
+ --rs-font-weight-bold: 700;
16
29
 
17
30
  --rs-line-height-tight: 1.25;
18
31
  --rs-line-height-normal: 1.5;
32
+ --rs-line-height-relaxed: 1.625;
33
+
34
+ /* 字体族:业务可整体替换,组件勿硬编码 system 栈 */
35
+ --rs-font-sans:
36
+ -apple-system,
37
+ BlinkMacSystemFont,
38
+ 'SF Pro Text',
39
+ 'SF Pro Display',
40
+ system-ui,
41
+ 'Segoe UI',
42
+ Roboto,
43
+ 'Helvetica Neue',
44
+ 'PingFang SC',
45
+ 'Microsoft YaHei',
46
+ sans-serif;
47
+ --rs-font-mono: ui-monospace, 'SF Mono', Consolas, 'Liberation Mono', Menlo, monospace;
48
+ --rs-font-rounded: ui-rounded, 'SF Pro Rounded', 'Segoe UI', system-ui, sans-serif;
19
49
 
20
50
  --rs-control-height-ssm: 1.25rem;
21
51
  --rs-control-height-sm: 1.5rem;
@@ -39,11 +69,62 @@
39
69
  /* Shell 底部 Dock / 常驻面板:低于 modal,避免盖住弹出对话框 */
40
70
  --rs-z-panel: 80;
41
71
  --rs-z-modal: 100;
72
+ /* 顶栏加载条:高于 modal,低于 toast,避免遮挡通知 */
73
+ --rs-z-loading-bar: 190;
42
74
  --rs-z-toast: 200;
43
75
 
44
76
  --rs-transition-fast: 0.15s cubic-bezier(0.4, 0, 0.2, 1);
45
77
  --rs-transition-normal: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
46
78
 
79
+ /* Dialog 尺寸(静态;颜色在主题块内) */
80
+ --rs-dialog-header-padding-y: var(--rs-space-md);
81
+ --rs-dialog-header-padding-x: var(--rs-space-xl);
82
+ --rs-dialog-footer-padding-y: var(--rs-space-md);
83
+ --rs-dialog-footer-padding-x: var(--rs-space-xl);
84
+ --rs-dialog-body-padding-y: var(--rs-space-xl);
85
+ --rs-dialog-body-padding-x: var(--rs-space-xl);
86
+ /* 默认 0:由内容撑开;宿主可设为固定栏高(如 36px) */
87
+ --rs-dialog-header-min-height: 0px;
88
+ --rs-dialog-footer-min-height: 0px;
89
+ /* 默认 auto:不锁死;宿主设为具体值即固定栏高 */
90
+ --rs-dialog-header-height: auto;
91
+ --rs-dialog-footer-height: auto;
92
+ /* footer 顶部分割线;设为 transparent 可做开放式底栏 */
93
+ --rs-dialog-footer-border: color-mix(in srgb, var(--rs-dialog-separator, var(--rs-border-subtle)) 72%, transparent);
94
+
95
+ /* Drawer 尺寸(静态;颜色在主题块内) */
96
+ --rs-drawer-header-padding-y: var(--rs-space-md);
97
+ --rs-drawer-header-padding-x: var(--rs-space-xl);
98
+ --rs-drawer-footer-padding-y: var(--rs-space-md);
99
+ --rs-drawer-footer-padding-x: var(--rs-space-xl);
100
+ --rs-drawer-body-padding-y: var(--rs-space-xl);
101
+ --rs-drawer-body-padding-x: var(--rs-space-xl);
102
+ /* 默认 0:由内容撑开;宿主可设为固定栏高(如 36px) */
103
+ --rs-drawer-header-min-height: 0px;
104
+ --rs-drawer-footer-min-height: 0px;
105
+ /* 默认 auto:不锁死;宿主设为具体值即固定栏高 */
106
+ --rs-drawer-header-height: auto;
107
+ --rs-drawer-footer-height: auto;
108
+ /* footer 顶部分割线;设为 transparent 可做开放式底栏 */
109
+ --rs-drawer-footer-border: var(--rs-drawer-separator, var(--rs-border-subtle));
110
+ /* 滑入 / 滑出时长(与 RsDrawer keyframes 对齐) */
111
+ --rs-drawer-motion-duration-in: 240ms;
112
+ --rs-drawer-motion-duration-out: 180ms;
113
+
114
+ /* Menu 尺寸(静态;颜色在主题块内) */
115
+ --rs-menu-item-height: var(--rs-control-height-md);
116
+ --rs-menu-item-font-size: var(--rs-font-size-sm);
117
+ --rs-menu-item-radius: var(--rs-radius-sm);
118
+ --rs-menu-item-active-weight: 500;
119
+
120
+ /*
121
+ * 表单标签(RsLabel / .rs-field__label 共用)
122
+ * 默认对齐 Ant Form:与正文同档 14px;颜色在主题块内。
123
+ */
124
+ --rs-label-font-size: var(--rs-font-size-sm);
125
+ --rs-label-font-weight: var(--rs-font-weight-medium);
126
+ --rs-label-line-height: var(--rs-line-height-normal);
127
+
47
128
  /* FTP 图标内嵌字样默认强调色 */
48
129
  --rs-icon-ftp-accent: #ea580c;
49
130
  --rs-icon-ftp-on-accent: #ffffff;
@@ -139,6 +220,18 @@
139
220
  --rs-table-resize-handle: #6e6e6e;
140
221
  --rs-table-resize-handle-hover: var(--rs-primary);
141
222
 
223
+ /* ── Tree(导航线 / 行选中 / 焦点;业务可覆盖)── */
224
+ --rs-tree-line: color-mix(in srgb, var(--rs-text) 14%, transparent);
225
+ --rs-tree-line-width: 1px;
226
+ --rs-tree-row-hover: var(--rs-item-hover);
227
+ --rs-tree-selected-bg: color-mix(in srgb, var(--rs-primary) 12%, var(--rs-surface));
228
+ --rs-tree-selected-fg: var(--rs-text);
229
+ --rs-tree-focused-bg: color-mix(in srgb, var(--rs-primary) 8%, var(--rs-surface));
230
+ --rs-tree-focused-ring: color-mix(in srgb, var(--rs-primary) 28%, transparent);
231
+ --rs-tree-selected-focused-bg: color-mix(in srgb, var(--rs-primary) 16%, var(--rs-surface));
232
+ --rs-tree-selected-focused-ring: color-mix(in srgb, var(--rs-primary) 36%, transparent);
233
+ --rs-tree-drop-indicator: var(--rs-primary);
234
+
142
235
  /* VS Code 式抬升型输入底(比内容略亮),非 macOS 凹陷井 */
143
236
  /* WCAG AA: input-border 3.18:1 vs #2b2b2b; border 3.24:1 vs #1f1f1f; placeholder 4.5:1 vs #2b2b2b */
144
237
  --rs-input-bg: #2b2b2b;
@@ -147,9 +240,26 @@
147
240
  --rs-input-shadow: none;
148
241
  --rs-border: #6e6e6e;
149
242
  --rs-border-subtle: #3a3a3a;
243
+ /*
244
+ * Button secondary/default:轮廓与底色独立于分隔线 --rs-border,
245
+ * 业务可用 --rs-btn-* 覆盖(见 theme/brand.example.css)。
246
+ */
247
+ --rs-btn-outline-border: #a3a3a3;
248
+ --rs-btn-secondary-bg: var(--rs-surface-hover);
249
+ --rs-btn-secondary-bg-hover: color-mix(in srgb, var(--rs-primary) 16%, var(--rs-surface-hover));
250
+ --rs-btn-secondary-bg-active: color-mix(in srgb, var(--rs-primary) 24%, var(--rs-surface-hover));
150
251
  --rs-text: #cccccc;
151
252
  --rs-muted: #9d9d9d;
152
253
  --rs-placeholder: #919191;
254
+ /* 文字语义 alias(Ant / Arco 四级 + link;底层仍可用 --rs-text / --rs-muted) */
255
+ --rs-text-primary: var(--rs-text);
256
+ --rs-text-secondary: var(--rs-muted);
257
+ --rs-text-tertiary: var(--rs-placeholder);
258
+ --rs-text-disabled: #6e6e6e;
259
+ --rs-text-inverse: #ffffff;
260
+ --rs-text-link: var(--rs-primary);
261
+ --rs-text-link-hover: var(--rs-primary-hover);
262
+ --rs-label-color: var(--rs-text);
153
263
  --rs-danger: #ff453a;
154
264
  --rs-danger-container: #3b1210;
155
265
  --rs-on-danger-container: #ff8a84;
@@ -180,22 +290,71 @@
180
290
  --rs-focus-ring: color-mix(in srgb, var(--rs-primary) 28%, transparent);
181
291
  --rs-focus-ring-width: 2px;
182
292
 
183
- /* ── Dialog(VS Code editorWidget 分层 + macOS sheet 实底分隔)── */
184
- /* WCAG AA: dialog-border 3.49:1 vs frame bg #181818 */
185
- --rs-dialog-overlay-bg: rgb(0 0 0 / 0.5);
186
- --rs-dialog-overlay-blur: 12px;
187
- --rs-dialog-border: #6e6e6e;
188
- --rs-dialog-separator: #484848;
293
+ /* ── Dialog(浮层语义;默认 alias 全局 surface,业务可单独覆盖)── */
294
+ /* 遮罩默认最浅:可看清背后内容;可用 --rs-dialog-overlay-* 或 overlayOpacity/Blur 加深 */
295
+ --rs-dialog-overlay-bg: rgb(0 0 0 / 0.24);
296
+ --rs-dialog-overlay-blur: 0px;
297
+ --rs-dialog-border: color-mix(in srgb, var(--rs-border) 72%, transparent);
298
+ --rs-dialog-separator: var(--rs-border-subtle);
189
299
  --rs-dialog-shadow:
190
- 0 0 0 0.5px rgb(255 255 255 / 0.08),
191
- 0 8px 32px rgb(0 0 0 / 0.55),
192
- 0 2px 8px rgb(0 0 0 / 0.35);
193
- --rs-dialog-header-bg: #2b2b2b;
194
- --rs-dialog-body-bg: #1f1f1f;
195
- --rs-dialog-footer-bg: #262626;
300
+ 0 0 0 0.5px color-mix(in srgb, var(--rs-border) 50%, transparent),
301
+ 0 18px 48px rgb(0 0 0 / 0.48),
302
+ 0 4px 14px rgb(0 0 0 / 0.28);
303
+ /* 默认同色面:header/body/footer 统一,仅靠 separator 分区 */
304
+ --rs-dialog-body-bg: var(--rs-surface);
305
+ --rs-dialog-header-bg: var(--rs-dialog-body-bg);
306
+ --rs-dialog-footer-bg: var(--rs-dialog-body-bg);
196
307
  --rs-dialog-bg: var(--rs-dialog-body-bg);
197
- --rs-dialog-title-fg: #ffffff;
198
- --rs-dialog-description-fg: #9d9d9d;
308
+ --rs-dialog-title-fg: var(--rs-text);
309
+ --rs-dialog-description-fg: var(--rs-muted);
310
+
311
+ /* ── Drawer(浮层语义;默认 alias 全局 surface,业务可单独覆盖)── */
312
+ --rs-drawer-border: var(--rs-border);
313
+ --rs-drawer-separator: var(--rs-border-subtle);
314
+ --rs-drawer-body-bg: var(--rs-surface-elevated);
315
+ --rs-drawer-header-bg: var(--rs-drawer-body-bg);
316
+ --rs-drawer-footer-bg: var(--rs-drawer-body-bg);
317
+ --rs-drawer-title-fg: var(--rs-text);
318
+ --rs-drawer-description-fg: var(--rs-muted);
319
+ --rs-drawer-overlay-bg: var(--rs-dialog-overlay-bg);
320
+ --rs-drawer-overlay-blur: var(--rs-dialog-overlay-blur);
321
+
322
+ /* ── Tag / DynamicTags(可被业务覆盖)── */
323
+ --rs-tag-font-weight: var(--rs-font-weight-medium);
324
+ --rs-tag-border-alpha: 40%;
325
+ --rs-dynamic-tags-bg: var(--rs-input-bg);
326
+ --rs-dynamic-tags-border: var(--rs-input-border);
327
+ --rs-dynamic-tags-border-hover: var(--rs-input-border-hover);
328
+ --rs-dynamic-tags-shadow: var(--rs-input-shadow);
329
+ --rs-dynamic-tags-radius: var(--rs-radius);
330
+ --rs-dynamic-tags-gap: var(--rs-space-xs);
331
+ --rs-dynamic-tags-padding: var(--rs-space-xs);
332
+ --rs-dynamic-tags-trigger-border: var(--rs-border);
333
+
334
+ /* ── Menu(侧栏 / 导航;业务可在父级覆盖,无需 :deep)── */
335
+ --rs-menu-item-fg: var(--rs-muted);
336
+ --rs-menu-item-fg-hover: var(--rs-text);
337
+ --rs-menu-item-bg-hover: var(--rs-surface-hover);
338
+ --rs-menu-item-active-fg: var(--rs-primary);
339
+ --rs-menu-item-active-bg: color-mix(in srgb, var(--rs-primary) 12%, transparent);
340
+ --rs-menu-item-active-parent-fg: var(--rs-primary);
341
+ --rs-menu-item-active-parent-bg: transparent;
342
+
343
+ /* ── Alert(反馈条;正文色可按主题单独调)── */
344
+ --rs-alert-radius: var(--rs-radius);
345
+ --rs-alert-gap: var(--rs-space-sm);
346
+ --rs-alert-padding-y: var(--rs-space-md);
347
+ --rs-alert-padding-x: var(--rs-space-lg);
348
+ --rs-alert-border-alpha: 35%;
349
+ --rs-alert-content-fg: var(--rs-muted);
350
+
351
+ /* ── Descriptions(描述列表栅格)── */
352
+ --rs-descriptions-radius: var(--rs-radius);
353
+ --rs-descriptions-border: var(--rs-border);
354
+ /* 标签列用实色表面混合,避免 surface-hover 被桥成透明 overlay 时失效 */
355
+ --rs-descriptions-label-bg: color-mix(in srgb, var(--rs-surface-hover) 72%, var(--rs-surface));
356
+ --rs-descriptions-label-fg: var(--rs-muted);
357
+ --rs-descriptions-value-fg: var(--rs-text);
199
358
 
200
359
  /* ── Card(macOS grouped panel / inset 分组卡片)── */
201
360
  --rs-card-border: #3a3a3a;
@@ -303,6 +462,18 @@
303
462
  --rs-table-resize-handle: #8c8c8c;
304
463
  --rs-table-resize-handle-hover: var(--rs-primary);
305
464
 
465
+ /* ── Tree(导航线 / 行选中 / 焦点;业务可覆盖)── */
466
+ --rs-tree-line: color-mix(in srgb, var(--rs-text) 10%, transparent);
467
+ --rs-tree-line-width: 1px;
468
+ --rs-tree-row-hover: var(--rs-item-hover);
469
+ --rs-tree-selected-bg: color-mix(in srgb, var(--rs-primary) 8%, var(--rs-surface));
470
+ --rs-tree-selected-fg: var(--rs-text);
471
+ --rs-tree-focused-bg: color-mix(in srgb, var(--rs-primary) 5%, var(--rs-surface));
472
+ --rs-tree-focused-ring: color-mix(in srgb, var(--rs-primary) 22%, transparent);
473
+ --rs-tree-selected-focused-bg: color-mix(in srgb, var(--rs-primary) 10%, var(--rs-surface));
474
+ --rs-tree-selected-focused-ring: color-mix(in srgb, var(--rs-primary) 28%, transparent);
475
+ --rs-tree-drop-indicator: var(--rs-primary);
476
+
306
477
  /* macOS separator 风格:默认边框偏柔,focus 环承担可访问性反馈 */
307
478
  --rs-input-bg: #ffffff;
308
479
  --rs-input-border: rgb(60 60 67 / 0.18);
@@ -310,9 +481,26 @@
310
481
  --rs-input-shadow: none;
311
482
  --rs-border: rgb(60 60 67 / 0.16);
312
483
  --rs-border-subtle: rgb(60 60 67 / 0.10);
484
+ /*
485
+ * Button secondary/default:亮色分隔线偏淡,轮廓单独提高对比(≥3:1 vs 白底)。
486
+ * 业务覆盖 --rs-btn-* 即可,无需改组件。
487
+ */
488
+ --rs-btn-outline-border: #6e6e73;
489
+ --rs-btn-secondary-bg: var(--rs-surface-hover);
490
+ --rs-btn-secondary-bg-hover: color-mix(in srgb, var(--rs-primary) 12%, var(--rs-surface-hover));
491
+ --rs-btn-secondary-bg-active: color-mix(in srgb, var(--rs-primary) 18%, var(--rs-surface-hover));
313
492
  --rs-text: #1d1d1f;
314
493
  --rs-muted: #6e6e73;
315
494
  --rs-placeholder: #909090;
495
+ /* 文字语义 alias(Ant / Arco 四级 + link;底层仍可用 --rs-text / --rs-muted) */
496
+ --rs-text-primary: var(--rs-text);
497
+ --rs-text-secondary: var(--rs-muted);
498
+ --rs-text-tertiary: var(--rs-placeholder);
499
+ --rs-text-disabled: #aeaeb2;
500
+ --rs-text-inverse: #ffffff;
501
+ --rs-text-link: var(--rs-primary);
502
+ --rs-text-link-hover: var(--rs-primary-hover);
503
+ --rs-label-color: var(--rs-text);
316
504
  --rs-danger: #ff3b30;
317
505
  --rs-danger-container: #ffe5e3;
318
506
  --rs-on-danger-container: #c41e16;
@@ -329,22 +517,71 @@
329
517
  --rs-focus-ring: color-mix(in srgb, var(--rs-primary) 22%, transparent);
330
518
  --rs-focus-ring-width: 2px;
331
519
 
332
- /* ── Dialog(VS Code Light Modern widget + macOS 浅色 sheet)── */
333
- --rs-dialog-overlay-bg: rgb(0 0 0 / 0.28);
334
- --rs-dialog-overlay-blur: 8px;
335
- --rs-dialog-border: #c8c8ca;
336
- --rs-dialog-separator: #d4d4d6;
520
+ /* ── Dialog(浮层语义;默认 alias 全局 surface,业务可单独覆盖)── */
521
+ /* 遮罩默认最浅:可看清背后内容;可用 --rs-dialog-overlay-* 或 overlayOpacity/Blur 加深 */
522
+ --rs-dialog-overlay-bg: rgb(0 0 0 / 0.08);
523
+ --rs-dialog-overlay-blur: 0px;
524
+ --rs-dialog-border: color-mix(in srgb, var(--rs-border) 88%, transparent);
525
+ --rs-dialog-separator: var(--rs-border-subtle);
337
526
  --rs-dialog-shadow:
338
- 0 0 0 0.5px rgb(0 0 0 / 0.06),
339
- 0 8px 28px rgb(0 0 0 / 0.18),
340
- 0 2px 8px rgb(0 0 0 / 0.08);
341
- --rs-dialog-header-bg: #f8f8f8;
342
- --rs-dialog-body-bg: #ffffff;
343
- --rs-dialog-footer-bg: #f8f8f8;
344
- --rs-dialog-bg: #ffffff;
527
+ 0 0 0 0.5px color-mix(in srgb, var(--rs-border) 70%, transparent),
528
+ 0 16px 40px rgb(0 0 0 / 0.14),
529
+ 0 4px 12px rgb(0 0 0 / 0.06);
530
+ --rs-dialog-body-bg: var(--rs-surface);
531
+ --rs-dialog-header-bg: var(--rs-dialog-body-bg);
532
+ --rs-dialog-footer-bg: var(--rs-dialog-body-bg);
533
+ --rs-dialog-bg: var(--rs-dialog-body-bg);
345
534
  --rs-dialog-title-fg: var(--rs-text);
346
535
  --rs-dialog-description-fg: var(--rs-muted);
347
536
 
537
+ /* ── Drawer(浮层语义;默认 alias 全局 surface,业务可单独覆盖)── */
538
+ --rs-drawer-border: var(--rs-border);
539
+ --rs-drawer-separator: var(--rs-border-subtle);
540
+ --rs-drawer-body-bg: var(--rs-surface-elevated);
541
+ --rs-drawer-header-bg: var(--rs-drawer-body-bg);
542
+ --rs-drawer-footer-bg: var(--rs-drawer-body-bg);
543
+ --rs-drawer-title-fg: var(--rs-text);
544
+ --rs-drawer-description-fg: var(--rs-muted);
545
+ --rs-drawer-overlay-bg: var(--rs-dialog-overlay-bg);
546
+ --rs-drawer-overlay-blur: var(--rs-dialog-overlay-blur);
547
+
548
+ /* ── Tag / DynamicTags(可被业务覆盖)── */
549
+ --rs-tag-font-weight: var(--rs-font-weight-medium);
550
+ --rs-tag-border-alpha: 40%;
551
+ --rs-dynamic-tags-bg: var(--rs-input-bg);
552
+ --rs-dynamic-tags-border: var(--rs-input-border);
553
+ --rs-dynamic-tags-border-hover: var(--rs-input-border-hover);
554
+ --rs-dynamic-tags-shadow: var(--rs-input-shadow);
555
+ --rs-dynamic-tags-radius: var(--rs-radius);
556
+ --rs-dynamic-tags-gap: var(--rs-space-xs);
557
+ --rs-dynamic-tags-padding: var(--rs-space-xs);
558
+ --rs-dynamic-tags-trigger-border: var(--rs-border);
559
+
560
+ /* ── Menu(侧栏 / 导航;业务可在父级覆盖,无需 :deep)── */
561
+ --rs-menu-item-fg: var(--rs-muted);
562
+ --rs-menu-item-fg-hover: var(--rs-text);
563
+ --rs-menu-item-bg-hover: var(--rs-surface-hover);
564
+ --rs-menu-item-active-fg: var(--rs-primary);
565
+ --rs-menu-item-active-bg: color-mix(in srgb, var(--rs-primary) 12%, transparent);
566
+ --rs-menu-item-active-parent-fg: var(--rs-primary);
567
+ --rs-menu-item-active-parent-bg: transparent;
568
+
569
+ /* ── Alert(反馈条;正文色可按主题单独调)── */
570
+ --rs-alert-radius: var(--rs-radius);
571
+ --rs-alert-gap: var(--rs-space-sm);
572
+ --rs-alert-padding-y: var(--rs-space-md);
573
+ --rs-alert-padding-x: var(--rs-space-lg);
574
+ --rs-alert-border-alpha: 35%;
575
+ --rs-alert-content-fg: var(--rs-muted);
576
+
577
+ /* ── Descriptions(描述列表栅格)── */
578
+ --rs-descriptions-radius: var(--rs-radius);
579
+ --rs-descriptions-border: var(--rs-border);
580
+ /* 标签列用实色表面混合,避免 surface-hover 被桥成透明 overlay 时失效 */
581
+ --rs-descriptions-label-bg: color-mix(in srgb, var(--rs-surface-hover) 72%, var(--rs-surface));
582
+ --rs-descriptions-label-fg: var(--rs-muted);
583
+ --rs-descriptions-value-fg: var(--rs-text);
584
+
348
585
  /* ── Card(macOS systemGroupedBackground 上的圆角分组卡片)── */
349
586
  --rs-card-border: rgb(60 60 67 / 0.14);
350
587
  --rs-card-separator: #d4d4d6;
@@ -460,38 +697,29 @@
460
697
 
461
698
  body {
462
699
  margin: 0;
463
- font-family:
464
- -apple-system,
465
- BlinkMacSystemFont,
466
- 'SF Pro Text',
467
- 'SF Pro Display',
468
- system-ui,
469
- 'Segoe UI',
470
- Roboto,
471
- 'Helvetica Neue',
472
- 'PingFang SC',
473
- 'Microsoft YaHei',
474
- sans-serif;
700
+ font-family: var(--rs-font-sans);
475
701
  font-size: var(--rs-font-size-base);
702
+ font-weight: var(--rs-font-weight-regular);
476
703
  line-height: var(--rs-line-height-normal);
477
704
  background: var(--rs-bg);
478
- color: var(--rs-text);
705
+ color: var(--rs-text-primary);
479
706
  -webkit-font-smoothing: antialiased;
480
707
  -moz-osx-font-smoothing: grayscale;
481
708
  }
482
709
 
483
710
  a {
484
- color: var(--rs-primary);
711
+ color: var(--rs-text-link);
485
712
  text-decoration: none;
486
713
  transition: color var(--rs-transition-fast);
487
714
  }
488
715
 
489
716
  a:hover {
490
- color: var(--rs-primary-hover);
717
+ color: var(--rs-text-link-hover);
491
718
  }
492
719
 
493
720
  code {
494
721
  color: var(--rs-on-primary-container);
722
+ font-family: var(--rs-font-mono);
495
723
  font-size: 0.9em;
496
724
  }
497
725
 
@@ -548,6 +776,12 @@ code {
548
776
  z-index: calc(var(--rs-z-modal) + 2);
549
777
  }
550
778
 
779
+ /* ContextMenu:Dialog 内表格右键菜单 Portal 后须高于 modal */
780
+ [data-reka-popper-content-wrapper]:has(> .rs-context-menu__content),
781
+ [data-reka-popper-content-wrapper]:has(> .rs-context-menu__sub-content) {
782
+ z-index: calc(var(--rs-z-modal) + 2);
783
+ }
784
+
551
785
  /* 日期面板内嵌时间选择:wrapper 也须高于日期面板,否则 portal 后仍被日历盖住 */
552
786
  [data-reka-popper-content-wrapper]:has(> .rs-time-picker__content--embedded) {
553
787
  z-index: calc(var(--rs-z-modal) + 3);
@@ -735,7 +969,11 @@ code {
735
969
 
736
970
  .rs-field--label-left {
737
971
  display: grid;
738
- grid-template-columns: var(--rs-field-label-width, max-content) minmax(0, 1fr);
972
+ /*
973
+ * 左侧标签:配置宽为下限,内容更长时按 max-content 撑开,避免中文标签换行。
974
+ * 未设置 --rs-field-label-width 时退回 max-content。
975
+ */
976
+ grid-template-columns: minmax(var(--rs-field-label-width, max-content), max-content) minmax(0, 1fr);
739
977
  align-items: start;
740
978
  column-gap: var(--rs-space-md);
741
979
  }
@@ -746,9 +984,16 @@ code {
746
984
  }
747
985
 
748
986
  .rs-field__label {
749
- color: var(--rs-muted);
750
- font-size: var(--rs-font-size-xs);
751
- font-weight: 600;
987
+ color: var(--rs-label-color);
988
+ font-size: var(--rs-label-font-size);
989
+ font-weight: var(--rs-label-font-weight);
990
+ line-height: var(--rs-label-line-height);
991
+ }
992
+
993
+ /* 左侧标签默认单行(与常见表单库一致);垂直布局不受影响 */
994
+ .rs-field--label-left > .rs-field__label,
995
+ .rs-field--label-left > .rs-label {
996
+ white-space: nowrap;
752
997
  }
753
998
 
754
999
  .rs-field__required {
@@ -806,7 +1051,7 @@ code {
806
1051
 
807
1052
  .rs-toast {
808
1053
  display: flex;
809
- align-items: flex-start;
1054
+ align-items: center;
810
1055
  gap: var(--rs-space-sm);
811
1056
  position: relative;
812
1057
  min-width: 18rem;
@@ -819,10 +1064,18 @@ code {
819
1064
  box-shadow: var(--rs-shadow-lg);
820
1065
  }
821
1066
 
1067
+ .rs-toast:has([data-description]) {
1068
+ align-items: flex-start;
1069
+ }
1070
+
822
1071
  .rs-toast [data-icon] {
823
1072
  display: flex;
824
1073
  flex-shrink: 0;
825
1074
  align-items: center;
1075
+ margin: 0;
1076
+ }
1077
+
1078
+ .rs-toast:has([data-description]) [data-icon] {
826
1079
  margin-top: 0.125rem;
827
1080
  }
828
1081
 
@@ -896,7 +1149,7 @@ code {
896
1149
  .lucide-api-icon .api-icon__label {
897
1150
  fill: currentColor;
898
1151
  stroke: none;
899
- font-family: ui-rounded, 'SF Pro Rounded', 'Segoe UI', system-ui, sans-serif;
1152
+ font-family: var(--rs-font-rounded);
900
1153
  font-size: 9.5px;
901
1154
  font-weight: 800;
902
1155
  letter-spacing: -0.04em;
@@ -914,7 +1167,7 @@ code {
914
1167
  .lucide-ftp-icon .ftp-icon__label {
915
1168
  fill: var(--rs-icon-ftp-on-accent);
916
1169
  stroke: none;
917
- font-family: ui-monospace, 'SF Mono', Consolas, monospace;
1170
+ font-family: var(--rs-font-mono);
918
1171
  font-size: 6.2px;
919
1172
  font-weight: 900;
920
1173
  letter-spacing: -0.08em;
@@ -7,8 +7,18 @@
7
7
  *
8
8
  * 原理:CSS 变量级联,后加载的同名 --rs-* 覆盖公共 preset
9
9
  *
10
- * 表格专用 token(--rs-table-*)可单独覆盖,色值参考 VS Code Dark/Light Modern
11
- * 终端专用 token(--rs-terminal-*)可单独覆盖 xterm 调色板(默认 macOS Terminal.app 风格)
10
+ * 可覆盖的常见 token:
11
+ * - 品牌色:--rs-primary / --rs-primary-hover / --rs-*-container
12
+ * - 文字语义:--rs-text-primary / --rs-text-secondary / --rs-text-tertiary /
13
+ * --rs-text-disabled / --rs-text-link(底层亦兼容 --rs-text / --rs-muted)
14
+ * - 按钮次要态:--rs-btn-outline-border / --rs-btn-secondary-bg /
15
+ * --rs-btn-secondary-bg-hover / --rs-btn-secondary-bg-active
16
+ * - 排版:--rs-font-sans / --rs-font-mono / --rs-font-size-* / --rs-font-weight-*
17
+ * - 菜单:--rs-menu-item-active-fg|bg|weight、--rs-menu-item-fg、--rs-menu-item-bg-hover
18
+ * - 表单标签:--rs-label-font-size|font-weight|line-height|color(RsLabel / .rs-field__label)
19
+ * - 表格专用:--rs-table-*(色值参考 VS Code Dark/Light Modern)
20
+ * - 树专用:--rs-tree-*(导航线 / 选中 / 焦点)
21
+ * - 终端专用:--rs-terminal-*(默认 macOS Terminal.app 风格)
12
22
  */
13
23
 
14
24
  [data-rs-theme='light'] {
@@ -16,6 +26,11 @@
16
26
  --rs-primary-hover: #4f46e5;
17
27
  --rs-primary-container: #eef2ff;
18
28
  --rs-on-primary-container: #312e81;
29
+ /* secondary 轮廓:按需加深(默认已可读,一般无需改) */
30
+ --rs-btn-outline-border: #6b7280;
31
+ --rs-btn-secondary-bg: #f3f4f6;
32
+ --rs-btn-secondary-bg-hover: #ede9fe;
33
+ --rs-btn-secondary-bg-active: color-mix(in srgb, #6366f1 16%, #f3f4f6);
19
34
  }
20
35
 
21
36
  [data-rs-theme='dark'] {
@@ -23,6 +38,10 @@
23
38
  --rs-primary-hover: #a5b4fc;
24
39
  --rs-primary-container: #1e1b4b;
25
40
  --rs-on-primary-container: #c7d2fe;
41
+ --rs-btn-outline-border: #a3a3a3;
42
+ --rs-btn-secondary-bg: #2e2e2e;
43
+ --rs-btn-secondary-bg-hover: #3730a3;
44
+ --rs-btn-secondary-bg-active: color-mix(in srgb, #818cf8 22%, #2e2e2e);
26
45
  }
27
46
 
28
47
  /* 子树隔离:把 data-rs-theme 挂在业务根节点时同样生效 */
@@ -22,6 +22,8 @@ export const themePresets: Record<RsThemeMode, RsThemeTokens> = {
22
22
  text: '#1d1d1f',
23
23
  muted: '#6e6e73',
24
24
  placeholder: '#909090',
25
+ textDisabled: '#aeaeb2',
26
+ textInverse: '#ffffff',
25
27
  danger: '#ff3b30',
26
28
  dangerContainer: '#ffe5e3',
27
29
  onDangerContainer: '#c41e16',
@@ -52,6 +54,8 @@ export const themePresets: Record<RsThemeMode, RsThemeTokens> = {
52
54
  text: '#cccccc',
53
55
  muted: '#9d9d9d',
54
56
  placeholder: '#919191',
57
+ textDisabled: '#6e6e6e',
58
+ textInverse: '#ffffff',
55
59
  danger: '#ff453a',
56
60
  dangerContainer: '#3b1210',
57
61
  onDangerContainer: '#ff8a84',
@@ -43,9 +43,69 @@ export const RS_RADIUS_CSS: Record<RsRadius, string> = {
43
43
  full: 'var(--rs-radius-full)',
44
44
  }
45
45
 
46
+ /**
47
+ * 字号档位(由小到大):
48
+ * - xs:Caption / 辅助
49
+ * - sm:次要正文
50
+ * - base:正文(默认)
51
+ * - lg:强调正文
52
+ * - xl:小标题
53
+ * - 2xl:标题
54
+ * - 3xl:展示级标题
55
+ *
56
+ * 对应 `--rs-font-size-*`;业务侧优先用 token,勿硬编码 px。
57
+ */
58
+ export type RsFontSize = 'xs' | 'sm' | 'base' | 'lg' | 'xl' | '2xl' | '3xl'
59
+
60
+ export const RS_FONT_SIZES: readonly RsFontSize[] = [
61
+ 'xs',
62
+ 'sm',
63
+ 'base',
64
+ 'lg',
65
+ 'xl',
66
+ '2xl',
67
+ '3xl',
68
+ ]
69
+
70
+ /** 各档字号对应的 CSS 值。 */
71
+ export const RS_FONT_SIZE_CSS: Record<RsFontSize, string> = {
72
+ xs: 'var(--rs-font-size-xs)',
73
+ sm: 'var(--rs-font-size-sm)',
74
+ base: 'var(--rs-font-size-base)',
75
+ lg: 'var(--rs-font-size-lg)',
76
+ xl: 'var(--rs-font-size-xl)',
77
+ '2xl': 'var(--rs-font-size-2xl)',
78
+ '3xl': 'var(--rs-font-size-3xl)',
79
+ }
80
+
81
+ /**
82
+ * 字重档位:
83
+ * - regular:正文
84
+ * - medium:标签 / 弱强调
85
+ * - semibold:标题 / 表头
86
+ * - bold:强强调
87
+ */
88
+ export type RsFontWeight = 'regular' | 'medium' | 'semibold' | 'bold'
89
+
90
+ export const RS_FONT_WEIGHTS: readonly RsFontWeight[] = [
91
+ 'regular',
92
+ 'medium',
93
+ 'semibold',
94
+ 'bold',
95
+ ]
96
+
97
+ /** 各档字重对应的 CSS 值。 */
98
+ export const RS_FONT_WEIGHT_CSS: Record<RsFontWeight, string> = {
99
+ regular: 'var(--rs-font-weight-regular)',
100
+ medium: 'var(--rs-font-weight-medium)',
101
+ semibold: 'var(--rs-font-weight-semibold)',
102
+ bold: 'var(--rs-font-weight-bold)',
103
+ }
104
+
46
105
  /**
47
106
  * 设计 token
48
107
  * 色彩语义:Google MD3 容器色 + 字节 Arco 中性色 + 国际 SaaS 功能色
108
+ * 文字语义:Ant / Arco 四级(primary / secondary / tertiary / disabled)+ link / inverse
49
109
  */
50
110
  export interface RsThemeTokens {
51
111
  primary: string
@@ -60,9 +120,16 @@ export interface RsThemeTokens {
60
120
  inputBg: string
61
121
  border: string
62
122
  borderSubtle: string
123
+ /** 主文案(与 --rs-text / --rs-text-primary 同步) */
63
124
  text: string
125
+ /** 次要文案(与 --rs-muted / --rs-text-secondary 同步) */
64
126
  muted: string
127
+ /** 占位 / 三级文案(与 --rs-placeholder / --rs-text-tertiary 同步) */
65
128
  placeholder: string
129
+ /** 禁用文案(与 --rs-text-disabled 同步) */
130
+ textDisabled: string
131
+ /** 反色文案,用于主色 / 深色底(与 --rs-text-inverse 同步) */
132
+ textInverse: string
66
133
  danger: string
67
134
  dangerContainer: string
68
135
  onDangerContainer: string
@@ -1,17 +0,0 @@
1
- <script setup lang="ts" generic="T extends object = Record<string, unknown>">
2
- import type { RsTableColumn } from './table-utils'
3
-
4
- defineProps<{
5
- columns: RsTableColumn<T>[]
6
- }>()
7
- </script>
8
-
9
- <template>
10
- <colgroup>
11
- <col
12
- v-for="column in columns"
13
- :key="column.key"
14
- :style="{ width: typeof column.width === 'number' ? `${column.width}px` : column.width }"
15
- >
16
- </colgroup>
17
- </template>