niuma-ui 1.0.0

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 (220) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +25 -0
  4. package/README.en.md +99 -0
  5. package/README.md +161 -0
  6. package/package.json +106 -0
  7. package/src/__tests__/RsBadge.spec.ts +40 -0
  8. package/src/__tests__/RsBreadcrumb.spec.ts +172 -0
  9. package/src/__tests__/RsButton.spec.ts +108 -0
  10. package/src/__tests__/RsCalendarGrid.spec.ts +82 -0
  11. package/src/__tests__/RsCard.spec.ts +97 -0
  12. package/src/__tests__/RsCheckbox.spec.ts +36 -0
  13. package/src/__tests__/RsCodeEditor.spec.ts +111 -0
  14. package/src/__tests__/RsConfirmDialog.spec.ts +158 -0
  15. package/src/__tests__/RsContainer.spec.ts +89 -0
  16. package/src/__tests__/RsContextMenu.spec.ts +118 -0
  17. package/src/__tests__/RsDatePicker.spec.ts +88 -0
  18. package/src/__tests__/RsDateTimePicker.spec.ts +69 -0
  19. package/src/__tests__/RsDialog.spec.ts +404 -0
  20. package/src/__tests__/RsDrawer.spec.ts +145 -0
  21. package/src/__tests__/RsDropdown.spec.ts +135 -0
  22. package/src/__tests__/RsEmpty.spec.ts +99 -0
  23. package/src/__tests__/RsForm.spec.ts +173 -0
  24. package/src/__tests__/RsIcon.spec.ts +244 -0
  25. package/src/__tests__/RsInput.spec.ts +269 -0
  26. package/src/__tests__/RsInputNumber.spec.ts +118 -0
  27. package/src/__tests__/RsLabel.spec.ts +106 -0
  28. package/src/__tests__/RsLink.spec.ts +49 -0
  29. package/src/__tests__/RsLoading.spec.ts +84 -0
  30. package/src/__tests__/RsMarkdown.spec.ts +143 -0
  31. package/src/__tests__/RsMenu.spec.ts +119 -0
  32. package/src/__tests__/RsNewComponents.spec.ts +17 -0
  33. package/src/__tests__/RsPagination.spec.ts +158 -0
  34. package/src/__tests__/RsPopover.spec.ts +126 -0
  35. package/src/__tests__/RsScrollbar.spec.ts +53 -0
  36. package/src/__tests__/RsSelect.spec.ts +291 -0
  37. package/src/__tests__/RsSidebar.spec.ts +119 -0
  38. package/src/__tests__/RsSplitPane.spec.ts +177 -0
  39. package/src/__tests__/RsStatCard.spec.ts +79 -0
  40. package/src/__tests__/RsSteps.spec.ts +125 -0
  41. package/src/__tests__/RsTable.perf.spec.ts +103 -0
  42. package/src/__tests__/RsTable.spec.ts +1135 -0
  43. package/src/__tests__/RsTabs.spec.ts +328 -0
  44. package/src/__tests__/RsTerminal.spec.ts +218 -0
  45. package/src/__tests__/RsTimePicker.spec.ts +77 -0
  46. package/src/__tests__/RsToaster.spec.ts +95 -0
  47. package/src/__tests__/RsToolbar.spec.ts +75 -0
  48. package/src/__tests__/RsTooltip.spec.ts +111 -0
  49. package/src/__tests__/RsTree.spec.ts +572 -0
  50. package/src/__tests__/RsUpload.spec.ts +160 -0
  51. package/src/__tests__/RsVirtualList.spec.ts +77 -0
  52. package/src/__tests__/date-picker-utils.spec.ts +70 -0
  53. package/src/__tests__/dialog-viewport.spec.ts +38 -0
  54. package/src/__tests__/iso-local-datetime.spec.ts +58 -0
  55. package/src/__tests__/rs-clipboard.spec.ts +142 -0
  56. package/src/__tests__/setup.ts +12 -0
  57. package/src/__tests__/split-pane-utils.spec.ts +136 -0
  58. package/src/__tests__/table-drag.spec.ts +35 -0
  59. package/src/__tests__/table-edit-utils.spec.ts +194 -0
  60. package/src/__tests__/table-utils.spec.ts +286 -0
  61. package/src/__tests__/theme.spec.ts +22 -0
  62. package/src/__tests__/tree-utils.spec.ts +234 -0
  63. package/src/__tests__/useTableCellTooltip.spec.ts +101 -0
  64. package/src/components/RsAvatar.vue +115 -0
  65. package/src/components/RsBadge.vue +59 -0
  66. package/src/components/RsBreadcrumb.vue +65 -0
  67. package/src/components/RsBreadcrumbItems.vue +36 -0
  68. package/src/components/RsButton.vue +393 -0
  69. package/src/components/RsCalendarGrid.vue +284 -0
  70. package/src/components/RsCard.vue +237 -0
  71. package/src/components/RsCheckbox.vue +189 -0
  72. package/src/components/RsCodeBlock.vue +278 -0
  73. package/src/components/RsCodeEditor.vue +597 -0
  74. package/src/components/RsConfigProvider.vue +92 -0
  75. package/src/components/RsConfirmDialog.vue +178 -0
  76. package/src/components/RsContainer.vue +235 -0
  77. package/src/components/RsContextMenu.vue +238 -0
  78. package/src/components/RsContextMenuItems.vue +77 -0
  79. package/src/components/RsDatePicker.vue +756 -0
  80. package/src/components/RsDateTimePicker.vue +42 -0
  81. package/src/components/RsDialog.vue +486 -0
  82. package/src/components/RsDrawer.vue +175 -0
  83. package/src/components/RsDropdown.vue +252 -0
  84. package/src/components/RsDropdownItems.vue +90 -0
  85. package/src/components/RsEmpty.vue +107 -0
  86. package/src/components/RsForm.vue +131 -0
  87. package/src/components/RsIcon.vue +104 -0
  88. package/src/components/RsInput.vue +1101 -0
  89. package/src/components/RsInputNumber.vue +532 -0
  90. package/src/components/RsLabel.vue +54 -0
  91. package/src/components/RsLink.vue +106 -0
  92. package/src/components/RsLoading.vue +171 -0
  93. package/src/components/RsMarkdown.vue +329 -0
  94. package/src/components/RsMenu.vue +256 -0
  95. package/src/components/RsMenuItems.vue +125 -0
  96. package/src/components/RsMonacoEditor.vue +541 -0
  97. package/src/components/RsPagination.vue +184 -0
  98. package/src/components/RsPopover.vue +77 -0
  99. package/src/components/RsProseEditor.vue +160 -0
  100. package/src/components/RsScrollbar.vue +171 -0
  101. package/src/components/RsSelect.vue +1045 -0
  102. package/src/components/RsSidebar.vue +121 -0
  103. package/src/components/RsSidebarGroup.vue +32 -0
  104. package/src/components/RsSidebarItem.vue +72 -0
  105. package/src/components/RsSplitPane.vue +619 -0
  106. package/src/components/RsStatCard.vue +85 -0
  107. package/src/components/RsSteps.vue +138 -0
  108. package/src/components/RsTable.vue +2664 -0
  109. package/src/components/RsTableColgroup.vue +17 -0
  110. package/src/components/RsTableHeaderRow.vue +30 -0
  111. package/src/components/RsTabs.vue +951 -0
  112. package/src/components/RsTerminal.vue +697 -0
  113. package/src/components/RsTimePicker.vue +554 -0
  114. package/src/components/RsTimePickerColumns.vue +226 -0
  115. package/src/components/RsToaster.vue +396 -0
  116. package/src/components/RsToolbar.vue +135 -0
  117. package/src/components/RsTooltip.vue +142 -0
  118. package/src/components/RsTooltipProvider.vue +20 -0
  119. package/src/components/RsTree.vue +1248 -0
  120. package/src/components/RsUpload.vue +279 -0
  121. package/src/components/RsVirtualList.vue +217 -0
  122. package/src/components/avatar-utils.ts +19 -0
  123. package/src/components/breadcrumb-utils.ts +19 -0
  124. package/src/components/class-utils.ts +29 -0
  125. package/src/components/code-editor-utils.ts +106 -0
  126. package/src/components/code-mirror-completion.ts +40 -0
  127. package/src/components/code-mirror-diagnostics.ts +52 -0
  128. package/src/components/code-mirror-ghost.ts +158 -0
  129. package/src/components/code-mirror-inline-edit.ts +55 -0
  130. package/src/components/code-mirror-intel.ts +81 -0
  131. package/src/components/code-mirror-lang.ts +128 -0
  132. package/src/components/context-menu-utils.ts +20 -0
  133. package/src/components/date-picker-utils.ts +284 -0
  134. package/src/components/date-range-validation.ts +29 -0
  135. package/src/components/date-validation.ts +38 -0
  136. package/src/components/dialog-viewport.ts +48 -0
  137. package/src/components/dialog-window.ts +253 -0
  138. package/src/components/dropdown-utils.ts +31 -0
  139. package/src/components/form-utils.ts +77 -0
  140. package/src/components/input-number-utils.ts +128 -0
  141. package/src/components/input-rules.ts +84 -0
  142. package/src/components/loading-utils.ts +8 -0
  143. package/src/components/markdown-utils.ts +126 -0
  144. package/src/components/menu-utils.ts +48 -0
  145. package/src/components/overlay-utils.ts +47 -0
  146. package/src/components/pagination-utils.ts +38 -0
  147. package/src/components/popover-utils.ts +8 -0
  148. package/src/components/reka.ts +106 -0
  149. package/src/components/resolve-radius.ts +22 -0
  150. package/src/components/resolve-size.ts +29 -0
  151. package/src/components/scrollbar-utils.ts +10 -0
  152. package/src/components/select-utils.ts +72 -0
  153. package/src/components/split-pane-utils.ts +187 -0
  154. package/src/components/steps-utils.ts +22 -0
  155. package/src/components/table/RsTableBodyRow.vue +287 -0
  156. package/src/components/table/RsTableCell.vue +239 -0
  157. package/src/components/table/RsTableCellContent.ts +18 -0
  158. package/src/components/table/RsTableCellEditor.vue +351 -0
  159. package/src/components/table/RsTableEditGutter.vue +54 -0
  160. package/src/components/table/RsTableHeaderFilter.vue +107 -0
  161. package/src/components/table/RsTableRowStatus.vue +69 -0
  162. package/src/components/table/rs-table.css +1141 -0
  163. package/src/components/table/table-context-menu.ts +53 -0
  164. package/src/components/table/table-edit-utils.ts +496 -0
  165. package/src/components/table/table-keys.ts +12 -0
  166. package/src/components/table-drag.ts +215 -0
  167. package/src/components/table-utils.ts +950 -0
  168. package/src/components/tabs-utils.ts +107 -0
  169. package/src/components/terminal-utils.ts +301 -0
  170. package/src/components/terminal-wheel.ts +49 -0
  171. package/src/components/time-picker-utils.ts +167 -0
  172. package/src/components/time-range-validation.ts +23 -0
  173. package/src/components/time-validation.ts +20 -0
  174. package/src/components/tree-utils.ts +518 -0
  175. package/src/components/upload-utils.ts +55 -0
  176. package/src/components/virtual-list-utils.ts +17 -0
  177. package/src/composables/useClickOutside.ts +22 -0
  178. package/src/composables/useRsConfig.ts +91 -0
  179. package/src/composables/useRsI18n.ts +22 -0
  180. package/src/composables/useRsTabsNav.ts +187 -0
  181. package/src/composables/useRsToast.ts +48 -0
  182. package/src/composables/useTableCellTooltip.ts +239 -0
  183. package/src/composables/useTableEdit.ts +271 -0
  184. package/src/composables/useTableRowHighlight.ts +50 -0
  185. package/src/dev/vite-codemirror-deps.ts +20 -0
  186. package/src/icons/custom/api.ts +54 -0
  187. package/src/icons/custom/clickhouse.ts +52 -0
  188. package/src/icons/custom/dameng.ts +83 -0
  189. package/src/icons/custom/ftp.ts +61 -0
  190. package/src/icons/custom/kingbase.ts +52 -0
  191. package/src/icons/custom/mongodb.ts +50 -0
  192. package/src/icons/custom/mysql.ts +51 -0
  193. package/src/icons/custom/oracle.ts +52 -0
  194. package/src/icons/custom/redis.ts +51 -0
  195. package/src/icons/custom/sqlite.ts +50 -0
  196. package/src/icons/custom/sqlserver.ts +52 -0
  197. package/src/icons/custom/vastbase.ts +57 -0
  198. package/src/icons/lucide.ts +78 -0
  199. package/src/icons/registry.ts +35 -0
  200. package/src/index.ts +425 -0
  201. package/src/lib/iso-local-datetime.ts +152 -0
  202. package/src/lib/rs-dayjs.ts +56 -0
  203. package/src/locale/messages.ts +362 -0
  204. package/src/locale/types.ts +5 -0
  205. package/src/monaco/debug-decorations.css +20 -0
  206. package/src/monaco/debug-decorations.ts +70 -0
  207. package/src/monaco/index.ts +22 -0
  208. package/src/monaco/languages/index.ts +21 -0
  209. package/src/monaco/languages/mongodb-shell.ts +125 -0
  210. package/src/monaco/languages/types.ts +55 -0
  211. package/src/monaco/setup.ts +101 -0
  212. package/src/styles.css +1040 -0
  213. package/src/theme/apply.ts +12 -0
  214. package/src/theme/brand.example.css +37 -0
  215. package/src/theme/presets.ts +69 -0
  216. package/src/theme/types.ts +81 -0
  217. package/src/utils/rs-clipboard.ts +272 -0
  218. package/src/vite-env.d.ts +7 -0
  219. package/vite-plugins/monaco-zh-nls.ts +101 -0
  220. package/vite-plugins/silence-antlr-parse-console.ts +29 -0
package/src/styles.css ADDED
@@ -0,0 +1,1040 @@
1
+ @import 'vue-sonner/style.css';
2
+ @import 'tailwindcss';
3
+
4
+ /* ── 静态 token(不随明暗变化) ── */
5
+ :root {
6
+ --rs-radius-xs: 0.25rem;
7
+ --rs-radius-sm: 0.5rem;
8
+ --rs-radius: 0.75rem;
9
+ --rs-radius-lg: 1rem;
10
+ --rs-radius-full: 9999px;
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;
16
+
17
+ --rs-line-height-tight: 1.25;
18
+ --rs-line-height-normal: 1.5;
19
+
20
+ --rs-control-height-ssm: 1.25rem;
21
+ --rs-control-height-sm: 1.5rem;
22
+ --rs-control-height-md: 2rem;
23
+ --rs-control-height-lg: 2.5rem;
24
+
25
+ --rs-space-xs: 0.25rem;
26
+ --rs-space-sm: 0.5rem;
27
+ --rs-space-md: 0.75rem;
28
+ --rs-space-lg: 1rem;
29
+ --rs-space-xl: 1.5rem;
30
+
31
+ --rs-container-max-sm: 40rem;
32
+ --rs-container-max-md: 48rem;
33
+ --rs-container-max-lg: 64rem;
34
+ --rs-container-max-xl: 80rem;
35
+ --rs-container-max-full: 100%;
36
+
37
+ --rs-z-tooltip: 10;
38
+ --rs-z-dropdown: 50;
39
+ /* Shell 底部 Dock / 常驻面板:低于 modal,避免盖住弹出对话框 */
40
+ --rs-z-panel: 80;
41
+ --rs-z-modal: 100;
42
+ --rs-z-toast: 200;
43
+
44
+ --rs-transition-fast: 0.15s cubic-bezier(0.4, 0, 0.2, 1);
45
+ --rs-transition-normal: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
46
+
47
+ /* FTP 图标内嵌字样默认强调色 */
48
+ --rs-icon-ftp-accent: #ea580c;
49
+ --rs-icon-ftp-on-accent: #ffffff;
50
+
51
+ /* Redis 品牌图标默认强调色(Redis 官方红) */
52
+ --rs-icon-redis-accent: #dc382d;
53
+
54
+ /* MongoDB 品牌图标默认强调色(MongoDB 官方绿) */
55
+ --rs-icon-mongodb-accent: #47a248;
56
+
57
+ /* Vastbase 品牌图标默认强调色(海量数据官网橙) */
58
+ --rs-icon-vastbase-accent: #ff6f1a;
59
+
60
+ /* MySQL 品牌图标默认强调色(MySQL 官方蓝) */
61
+ --rs-icon-mysql-accent: #4479a1;
62
+
63
+ /* Dameng 品牌图标默认色(官网 logo 取样:蓝 / 红) */
64
+ --rs-icon-dameng-accent: #0000d2;
65
+ --rs-icon-dameng-wave: #ec1b34;
66
+
67
+ /* SQLite 品牌图标默认强调色(SQLite 官方蓝) */
68
+ --rs-icon-sqlite-accent: #003b57;
69
+
70
+ /* Oracle 品牌图标默认强调色(Oracle 官方红) */
71
+ --rs-icon-oracle-accent: #f80000;
72
+
73
+ /* ClickHouse 品牌图标默认强调色(ClickHouse 官方黄) */
74
+ --rs-icon-clickhouse-accent: #ffcc01;
75
+
76
+ /* 人大金仓品牌图标默认强调色(官网政务红) */
77
+ --rs-icon-kingbase-accent: #c9151e;
78
+
79
+ /* SQL Server 品牌图标默认强调色(Simple Icons / 产品红) */
80
+ --rs-icon-sqlserver-accent: #cc2927;
81
+
82
+ /* macOS 风格原生滚动条(与 RsScrollbar 视觉一致) */
83
+ --rs-scrollbar-size: 13px;
84
+ --rs-scrollbar-padding: 2px;
85
+ }
86
+
87
+ /* ── 公共暗色:VS Code Dark Modern 中性灰阶 × macOS 深色规范 ── */
88
+ :root,
89
+ [data-rs-theme='dark'] {
90
+ color-scheme: dark;
91
+
92
+ --rs-primary: #0a84ff;
93
+ --rs-primary-hover: #409cff;
94
+ --rs-primary-foreground: #ffffff;
95
+ --rs-primary-container: #0a2540;
96
+ --rs-on-primary-container: #6cb4ff;
97
+ /* 分层:frame/sidebar(#181818) < 内容(#1f1f1f) < 悬浮层/对话框(#262626) */
98
+ --rs-bg: #181818;
99
+ --rs-surface: #1f1f1f;
100
+ --rs-surface-elevated: #262626;
101
+ --rs-surface-hover: #2e2e2e;
102
+ --rs-item-hover: rgb(255 255 255 / 0.08);
103
+
104
+ /* ── Table(VS Code Dark Modern 列表/表格语义)──
105
+ * 灰阶斑马纹 + 主色选中(选中与条纹语义分离) */
106
+ --rs-table-radius: var(--rs-radius-sm);
107
+ --rs-table-border: #2b2b2b;
108
+ --rs-table-cell-divider: #262626;
109
+ --rs-table-fg: #dddddd;
110
+ --rs-table-muted-fg: #9d9d9d;
111
+ --rs-table-bg: #1f1f1f;
112
+ --rs-table-bg-header: #1f1f1f;
113
+ --rs-table-body-bg: #1f1f1f;
114
+ --rs-table-header-bg: #1f1f1f;
115
+ --rs-table-header-fg: #f3f3f3;
116
+ --rs-table-header-weight: 600;
117
+ --rs-table-header-size: var(--rs-table-cell-size, var(--rs-font-size-xs));
118
+ --rs-table-cell-size: var(--rs-font-size-xs);
119
+ --rs-table-cell-weight: 400;
120
+ --rs-table-footer-bg: #1f1f1f;
121
+ --rs-table-group-bg: #2d2d2d;
122
+ --rs-table-expand-bg: #2d2d2d;
123
+ --rs-table-row-stripe: #2d2d2d;
124
+ --rs-table-row-hover: #363636;
125
+ --rs-table-row-selected: color-mix(in srgb, var(--rs-primary) 22%, var(--rs-table-body-bg));
126
+ --rs-table-row-selected-hover: color-mix(in srgb, var(--rs-primary) 30%, var(--rs-table-body-bg));
127
+ --rs-table-row-selected-fg: #ffffff;
128
+ --rs-table-row-selected-accent: var(--rs-primary);
129
+ --rs-table-row-highlight: color-mix(in srgb, var(--rs-primary) 12%, var(--rs-table-body-bg));
130
+ --rs-table-row-highlight-hover: color-mix(in srgb, var(--rs-primary) 18%, var(--rs-table-body-bg));
131
+ --rs-table-row-highlight-fg: var(--rs-table-fg);
132
+ --rs-table-row-highlight-accent: color-mix(in srgb, var(--rs-primary) 65%, transparent);
133
+ --rs-table-gutter-bg: color-mix(in srgb, var(--rs-border) 10%, var(--rs-table-header-bg));
134
+ --rs-table-gutter-border: var(--rs-table-cell-divider);
135
+ --rs-table-scrollbar-corner: var(--rs-table-bg-header);
136
+ --rs-table-checkbox-bg: #313131;
137
+ --rs-table-sort-active-fg: var(--rs-primary);
138
+ --rs-table-drop-indicator: var(--rs-primary);
139
+ --rs-table-resize-handle: #6e6e6e;
140
+ --rs-table-resize-handle-hover: var(--rs-primary);
141
+
142
+ /* VS Code 式抬升型输入底(比内容略亮),非 macOS 凹陷井 */
143
+ /* WCAG AA: input-border 3.18:1 vs #2b2b2b; border 3.24:1 vs #1f1f1f; placeholder 4.5:1 vs #2b2b2b */
144
+ --rs-input-bg: #2b2b2b;
145
+ --rs-input-border: #767676;
146
+ --rs-input-border-hover: #8c8c8c;
147
+ --rs-input-shadow: none;
148
+ --rs-border: #6e6e6e;
149
+ --rs-border-subtle: #3a3a3a;
150
+ --rs-text: #cccccc;
151
+ --rs-muted: #9d9d9d;
152
+ --rs-placeholder: #919191;
153
+ --rs-danger: #ff453a;
154
+ --rs-danger-container: #3b1210;
155
+ --rs-on-danger-container: #ff8a84;
156
+ --rs-success: #30d158;
157
+ --rs-success-container: #0d2818;
158
+ --rs-on-success-container: #6ee79a;
159
+ --rs-warning: #ff9f0a;
160
+ --rs-warning-container: #2e1f08;
161
+ --rs-on-warning-container: #ffc46b;
162
+ --rs-info: #0a84ff;
163
+ --rs-info-container: #0a2540;
164
+ --rs-on-info-container: #6cb4ff;
165
+
166
+ --rs-icon-ftp-accent: #fb923c;
167
+ --rs-icon-ftp-on-accent: #ffffff;
168
+ --rs-icon-redis-accent: #ff6f61;
169
+ --rs-icon-mongodb-accent: #5cb85c;
170
+ --rs-icon-vastbase-accent: #ff8a3d;
171
+ --rs-icon-mysql-accent: #5a9fd4;
172
+ --rs-icon-sqlite-accent: #5aafd4;
173
+ --rs-icon-dameng-accent: #4d4dff;
174
+ --rs-icon-dameng-wave: #ff4d63;
175
+ --rs-icon-oracle-accent: #ff4d4d;
176
+ --rs-icon-clickhouse-accent: #ffe066;
177
+ --rs-icon-kingbase-accent: #ff4d57;
178
+ --rs-icon-sqlserver-accent: #ff5a57;
179
+ --rs-focus-border: var(--rs-primary);
180
+ --rs-focus-ring: color-mix(in srgb, var(--rs-primary) 28%, transparent);
181
+ --rs-focus-ring-width: 2px;
182
+
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;
189
+ --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;
196
+ --rs-dialog-bg: var(--rs-dialog-body-bg);
197
+ --rs-dialog-title-fg: #ffffff;
198
+ --rs-dialog-description-fg: #9d9d9d;
199
+
200
+ /* ── Card(macOS grouped panel / inset 分组卡片)── */
201
+ --rs-card-border: #3a3a3a;
202
+ --rs-card-separator: #484848;
203
+ --rs-card-header-bg: #2b2b2b;
204
+ --rs-card-body-bg: #1f1f1f;
205
+ --rs-card-title-fg: #ffffff;
206
+ --rs-card-description-fg: #9d9d9d;
207
+ --rs-card-shadow:
208
+ 0 0 0 0.5px rgb(255 255 255 / 0.06),
209
+ 0 1px 2px rgb(0 0 0 / 0.2);
210
+ --rs-card-shadow-elevated:
211
+ 0 0 0 0.5px rgb(255 255 255 / 0.08),
212
+ 0 4px 16px rgb(0 0 0 / 0.4),
213
+ 0 1px 3px rgb(0 0 0 / 0.28);
214
+ --rs-card-filled-bg: #262626;
215
+ --rs-card-filled-elevated-shadow:
216
+ 0 1px 2px rgb(0 0 0 / 0.35),
217
+ 0 2px 6px rgb(0 0 0 / 0.28);
218
+ --rs-card-glass-bg: rgb(31 31 31 / 0.72);
219
+ --rs-card-glass-border: rgb(255 255 255 / 0.1);
220
+
221
+ /* ── Terminal(macOS Terminal.app 风格:柔和 ANSI + 可读斑马纹)── */
222
+ --rs-terminal-shell-bg: #141416;
223
+ --rs-terminal-bg: #1e1e1e;
224
+ --rs-terminal-fg: #ebebf0;
225
+ --rs-terminal-cursor: #f5f5f7;
226
+ --rs-terminal-cursor-accent: var(--rs-terminal-bg);
227
+ /* 偶数行 bg / 奇数行 stripe,对比克制但可扫读 */
228
+ --rs-terminal-row-stripe: #27272a;
229
+ --rs-terminal-selection-bg: color-mix(in srgb, var(--rs-primary) 38%, #1e1e1e);
230
+ --rs-terminal-selection-fg: #ffffff;
231
+ --rs-terminal-border: rgb(255 255 255 / 0.1);
232
+ --rs-terminal-ansi-black: #000000;
233
+ --rs-terminal-ansi-red: #c75450;
234
+ --rs-terminal-ansi-green: #7dcc7d;
235
+ --rs-terminal-ansi-yellow: #d8d890;
236
+ --rs-terminal-ansi-blue: #6e9bf5;
237
+ --rs-terminal-ansi-magenta: #c89ae8;
238
+ --rs-terminal-ansi-cyan: #6ec9c9;
239
+ --rs-terminal-ansi-white: #d9d9de;
240
+ --rs-terminal-ansi-bright-black: #6e6e73;
241
+ --rs-terminal-ansi-bright-red: #f77669;
242
+ --rs-terminal-ansi-bright-green: #98d898;
243
+ --rs-terminal-ansi-bright-yellow: #ffffb8;
244
+ --rs-terminal-ansi-bright-blue: #8aadf4;
245
+ --rs-terminal-ansi-bright-magenta: #d4a8f0;
246
+ --rs-terminal-ansi-bright-cyan: #8ad4d4;
247
+ --rs-terminal-ansi-bright-white: #ffffff;
248
+
249
+ --rs-shadow-sm: 0 1px 3px rgb(0 0 0 / 0.4);
250
+ --rs-shadow: 0 4px 16px rgb(0 0 0 / 0.45), 0 0 0 0.5px rgb(255 255 255 / 0.08);
251
+ --rs-shadow-lg: 0 12px 32px rgb(0 0 0 / 0.5), 0 0 0 0.5px rgb(255 255 255 / 0.1);
252
+ }
253
+
254
+ /* ── 公共亮色:macOS systemBackground / label 色阶 ── */
255
+ [data-rs-theme='light'] {
256
+ color-scheme: light;
257
+
258
+ --rs-primary: #007aff;
259
+ --rs-primary-hover: #0071eb;
260
+ --rs-primary-foreground: #ffffff;
261
+ --rs-primary-container: #e5f1ff;
262
+ --rs-on-primary-container: #003d99;
263
+ --rs-bg: #f5f5f7;
264
+ --rs-surface: #ffffff;
265
+ --rs-surface-elevated: #ffffff;
266
+ --rs-surface-hover: #e8e8ed;
267
+ --rs-item-hover: rgb(0 0 0 / 0.05);
268
+
269
+ /* ── Table(VS Code Light Modern 列表/表格语义)── */
270
+ --rs-table-radius: var(--rs-radius-sm);
271
+ --rs-table-border: #e5e5e5;
272
+ --rs-table-cell-divider: #e5e5e5;
273
+ --rs-table-fg: #333333;
274
+ --rs-table-muted-fg: #616161;
275
+ --rs-table-bg: #ffffff;
276
+ --rs-table-bg-header: #f8f8f8;
277
+ --rs-table-body-bg: #ffffff;
278
+ --rs-table-header-bg: #f8f8f8;
279
+ --rs-table-header-fg: #1a1a1a;
280
+ --rs-table-header-weight: 600;
281
+ --rs-table-header-size: var(--rs-table-cell-size, var(--rs-font-size-xs));
282
+ --rs-table-cell-size: var(--rs-font-size-xs);
283
+ --rs-table-cell-weight: 400;
284
+ --rs-table-footer-bg: #f8f8f8;
285
+ --rs-table-group-bg: #f3f3f3;
286
+ --rs-table-expand-bg: #f3f3f3;
287
+ --rs-table-row-stripe: #f6f6f6;
288
+ --rs-table-row-hover: #f2f2f2;
289
+ --rs-table-row-selected: color-mix(in srgb, var(--rs-primary) 10%, var(--rs-table-body-bg));
290
+ --rs-table-row-selected-hover: color-mix(in srgb, var(--rs-primary) 16%, var(--rs-table-body-bg));
291
+ --rs-table-row-selected-fg: var(--rs-text);
292
+ --rs-table-row-selected-accent: var(--rs-primary);
293
+ --rs-table-row-highlight: color-mix(in srgb, var(--rs-primary) 8%, var(--rs-table-body-bg));
294
+ --rs-table-row-highlight-hover: color-mix(in srgb, var(--rs-primary) 12%, var(--rs-table-body-bg));
295
+ --rs-table-row-highlight-fg: var(--rs-text);
296
+ --rs-table-row-highlight-accent: color-mix(in srgb, var(--rs-primary) 45%, transparent);
297
+ --rs-table-gutter-bg: color-mix(in srgb, var(--rs-border) 6%, var(--rs-table-header-bg));
298
+ --rs-table-gutter-border: var(--rs-table-cell-divider);
299
+ --rs-table-scrollbar-corner: var(--rs-table-bg-header);
300
+ --rs-table-checkbox-bg: #ffffff;
301
+ --rs-table-sort-active-fg: var(--rs-primary);
302
+ --rs-table-drop-indicator: var(--rs-primary);
303
+ --rs-table-resize-handle: #8c8c8c;
304
+ --rs-table-resize-handle-hover: var(--rs-primary);
305
+
306
+ /* macOS separator 风格:默认边框偏柔,focus 环承担可访问性反馈 */
307
+ --rs-input-bg: #ffffff;
308
+ --rs-input-border: rgb(60 60 67 / 0.18);
309
+ --rs-input-border-hover: rgb(60 60 67 / 0.30);
310
+ --rs-input-shadow: none;
311
+ --rs-border: rgb(60 60 67 / 0.16);
312
+ --rs-border-subtle: rgb(60 60 67 / 0.10);
313
+ --rs-text: #1d1d1f;
314
+ --rs-muted: #6e6e73;
315
+ --rs-placeholder: #909090;
316
+ --rs-danger: #ff3b30;
317
+ --rs-danger-container: #ffe5e3;
318
+ --rs-on-danger-container: #c41e16;
319
+ --rs-success: #34c759;
320
+ --rs-success-container: #e4f8e9;
321
+ --rs-on-success-container: #1a7f37;
322
+ --rs-warning: #ff9500;
323
+ --rs-warning-container: #fff3e0;
324
+ --rs-on-warning-container: #b26500;
325
+ --rs-info: #007aff;
326
+ --rs-info-container: #e5f1ff;
327
+ --rs-on-info-container: #003d99;
328
+ --rs-focus-border: var(--rs-primary);
329
+ --rs-focus-ring: color-mix(in srgb, var(--rs-primary) 22%, transparent);
330
+ --rs-focus-ring-width: 2px;
331
+
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;
337
+ --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;
345
+ --rs-dialog-title-fg: var(--rs-text);
346
+ --rs-dialog-description-fg: var(--rs-muted);
347
+
348
+ /* ── Card(macOS systemGroupedBackground 上的圆角分组卡片)── */
349
+ --rs-card-border: rgb(60 60 67 / 0.14);
350
+ --rs-card-separator: #d4d4d6;
351
+ --rs-card-header-bg: #f8f8f8;
352
+ --rs-card-body-bg: #ffffff;
353
+ --rs-card-title-fg: var(--rs-text);
354
+ --rs-card-description-fg: var(--rs-muted);
355
+ --rs-card-shadow:
356
+ 0 0 0 0.5px rgb(0 0 0 / 0.04),
357
+ 0 1px 2px rgb(0 0 0 / 0.03);
358
+ --rs-card-shadow-elevated:
359
+ 0 0 0 0.5px rgb(0 0 0 / 0.06),
360
+ 0 4px 16px rgb(0 0 0 / 0.08),
361
+ 0 1px 3px rgb(0 0 0 / 0.04);
362
+ --rs-card-filled-bg: #f3f3f5;
363
+ --rs-card-filled-elevated-shadow:
364
+ 0 1px 2px rgb(0 0 0 / 0.12),
365
+ 0 2px 6px rgb(0 0 0 / 0.08);
366
+ --rs-card-glass-bg: rgb(255 255 255 / 0.72);
367
+ --rs-card-glass-border: rgb(255 255 255 / 0.55);
368
+
369
+ /* ── Terminal(macOS Terminal.app 亮色:systemBackground + 浅灰斑马纹)── */
370
+ --rs-terminal-shell-bg: #ececf0;
371
+ --rs-terminal-bg: #ffffff;
372
+ --rs-terminal-fg: #1d1d1f;
373
+ --rs-terminal-cursor: #1d1d1f;
374
+ --rs-terminal-cursor-accent: var(--rs-terminal-bg);
375
+ --rs-terminal-row-stripe: #f0f9ff;
376
+ --rs-terminal-selection-bg: color-mix(in srgb, var(--rs-primary) 26%, #ffffff);
377
+ --rs-terminal-selection-fg: #1d1d1f;
378
+ --rs-terminal-border: rgb(60 60 67 / 0.14);
379
+ --rs-terminal-ansi-black: #3a3a3c;
380
+ --rs-terminal-ansi-red: #d1453b;
381
+ --rs-terminal-ansi-green: #2f8a42;
382
+ --rs-terminal-ansi-yellow: #9a8f2e;
383
+ --rs-terminal-ansi-blue: #1b6fe0;
384
+ --rs-terminal-ansi-magenta: #a34fa8;
385
+ --rs-terminal-ansi-cyan: #1a8f98;
386
+ --rs-terminal-ansi-white: #6e6e73;
387
+ --rs-terminal-ansi-bright-black: #636366;
388
+ --rs-terminal-ansi-bright-red: #e02f22;
389
+ --rs-terminal-ansi-bright-green: #248a3d;
390
+ --rs-terminal-ansi-bright-yellow: #7a7000;
391
+ --rs-terminal-ansi-bright-blue: #0056d6;
392
+ --rs-terminal-ansi-bright-magenta: #b030b5;
393
+ --rs-terminal-ansi-bright-cyan: #0d7f8a;
394
+ --rs-terminal-ansi-bright-white: #1d1d1f;
395
+
396
+ --rs-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.04), 0 0 0 0.5px rgb(0 0 0 / 0.04);
397
+ --rs-shadow: 0 4px 16px rgb(0 0 0 / 0.08), 0 0 0 0.5px rgb(0 0 0 / 0.06);
398
+ --rs-shadow-lg: 0 12px 32px rgb(0 0 0 / 0.12), 0 0 0 0.5px rgb(0 0 0 / 0.08);
399
+
400
+ --rs-icon-ftp-accent: #ea580c;
401
+ --rs-icon-ftp-on-accent: #ffffff;
402
+ --rs-icon-redis-accent: #dc382d;
403
+ --rs-icon-mongodb-accent: #47a248;
404
+ --rs-icon-vastbase-accent: #ff6f1a;
405
+ --rs-icon-mysql-accent: #4479a1;
406
+ --rs-icon-sqlite-accent: #003b57;
407
+ --rs-icon-dameng-accent: #0000d2;
408
+ --rs-icon-dameng-wave: #ec1b34;
409
+ --rs-icon-oracle-accent: #f80000;
410
+ --rs-icon-clickhouse-accent: #ffcc01;
411
+ --rs-icon-kingbase-accent: #c9151e;
412
+ --rs-icon-sqlserver-accent: #cc2927;
413
+ }
414
+
415
+ /**
416
+ * 装饰性动效 opt-in:仅对挂载了 .rs-motion-reduce 的元素在无障碍「减少动画」下关闭 animation/transition。
417
+ * Loading(RsButton / RsLoading / RsIcon spin)等状态反馈默认不降级。
418
+ */
419
+ @media (prefers-reduced-motion: reduce) {
420
+ .rs-motion-reduce,
421
+ .rs-motion-reduce::before,
422
+ .rs-motion-reduce::after {
423
+ animation: none !important;
424
+ transition: none !important;
425
+ }
426
+ }
427
+
428
+ /* 原生滚动条:WebKit + Firefox,颜色随 --rs-* 主题 token 变化 */
429
+ .rs-native-scrollbar {
430
+ scrollbar-width: thin;
431
+ scrollbar-color: color-mix(in srgb, var(--rs-muted) 60%, transparent) transparent;
432
+ -webkit-overflow-scrolling: touch;
433
+ }
434
+
435
+ .rs-native-scrollbar::-webkit-scrollbar {
436
+ width: var(--rs-scrollbar-size);
437
+ height: var(--rs-scrollbar-size);
438
+ }
439
+
440
+ .rs-native-scrollbar::-webkit-scrollbar-track {
441
+ background: transparent;
442
+ }
443
+
444
+ .rs-native-scrollbar::-webkit-scrollbar-thumb {
445
+ border: var(--rs-scrollbar-padding) solid transparent;
446
+ border-radius: var(--rs-radius-full);
447
+ background: color-mix(in srgb, var(--rs-muted) 60%, transparent);
448
+ background-clip: padding-box;
449
+ transition: background var(--rs-transition-fast);
450
+ }
451
+
452
+ .rs-native-scrollbar::-webkit-scrollbar-thumb:hover {
453
+ background: color-mix(in srgb, var(--rs-primary) 40%, var(--rs-muted));
454
+ background-clip: padding-box;
455
+ }
456
+
457
+ .rs-native-scrollbar::-webkit-scrollbar-corner {
458
+ background: transparent;
459
+ }
460
+
461
+ body {
462
+ 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;
475
+ font-size: var(--rs-font-size-base);
476
+ line-height: var(--rs-line-height-normal);
477
+ background: var(--rs-bg);
478
+ color: var(--rs-text);
479
+ -webkit-font-smoothing: antialiased;
480
+ -moz-osx-font-smoothing: grayscale;
481
+ }
482
+
483
+ a {
484
+ color: var(--rs-primary);
485
+ text-decoration: none;
486
+ transition: color var(--rs-transition-fast);
487
+ }
488
+
489
+ a:hover {
490
+ color: var(--rs-primary-hover);
491
+ }
492
+
493
+ code {
494
+ color: var(--rs-on-primary-container);
495
+ font-size: 0.9em;
496
+ }
497
+
498
+ .rs-focus-ring:focus-visible {
499
+ outline: none;
500
+ box-shadow: 0 0 0 var(--rs-focus-ring-width, 2px) var(--rs-focus-ring);
501
+ }
502
+
503
+ /*
504
+ * 默认:面板可宽于触发器(min-width 对齐触发器,width 随内容,max-width 封顶)。
505
+ * matchTriggerWidth:加 --match-trigger,强制与触发器等宽。
506
+ * 注意:虚拟列表绝对定位项不参与撑开父级宽度,内容撑宽在 virtual 下不可靠(见 RsSelect prop 注释)。
507
+ */
508
+ .rs-select__content {
509
+ z-index: calc(var(--rs-z-modal) + 2);
510
+ box-sizing: border-box;
511
+ width: max-content;
512
+ min-width: var(--reka-combobox-trigger-width, var(--reka-popper-anchor-width));
513
+ max-width: min(24rem, calc(100vw - 1rem));
514
+ max-height: var(--reka-combobox-content-available-height);
515
+ overflow: hidden;
516
+ display: flex;
517
+ flex-direction: column;
518
+ padding: 0;
519
+ border-radius: var(--rs-radius);
520
+ border: 1px solid var(--rs-dialog-border, var(--rs-border));
521
+ background: var(--rs-surface-elevated);
522
+ box-shadow: var(--rs-shadow-lg);
523
+ color: var(--rs-text);
524
+ outline: none;
525
+ }
526
+
527
+ .rs-select__content--match-trigger {
528
+ width: var(--reka-combobox-trigger-width, var(--reka-popper-anchor-width));
529
+ max-width: none;
530
+ }
531
+
532
+ /* Popper 外层:默认允许随内容变宽;等宽模式锁死为触发器宽度 */
533
+ /* z-index 提升到 modal 之上,避免在 RsDialog 内被对话框遮挡 */
534
+ [data-reka-popper-content-wrapper]:has(> .rs-select__content) {
535
+ z-index: calc(var(--rs-z-modal) + 2);
536
+ width: max-content;
537
+ min-width: var(--reka-popper-anchor-width);
538
+ max-width: min(24rem, calc(100vw - 1rem));
539
+ }
540
+
541
+ [data-reka-popper-content-wrapper]:has(> .rs-select__content--match-trigger) {
542
+ width: var(--reka-popper-anchor-width);
543
+ min-width: var(--reka-popper-anchor-width);
544
+ max-width: none;
545
+ }
546
+
547
+ [data-reka-popper-content-wrapper]:has(> .rs-date-picker__content) {
548
+ z-index: calc(var(--rs-z-modal) + 2);
549
+ }
550
+
551
+ /* 日期面板内嵌时间选择:wrapper 也须高于日期面板,否则 portal 后仍被日历盖住 */
552
+ [data-reka-popper-content-wrapper]:has(> .rs-time-picker__content--embedded) {
553
+ z-index: calc(var(--rs-z-modal) + 3);
554
+ }
555
+
556
+ .rs-select__search-bar {
557
+ flex-shrink: 0;
558
+ padding: var(--rs-space-xs);
559
+ border-bottom: 1px solid var(--rs-border-subtle);
560
+ background: color-mix(in srgb, var(--rs-surface) 64%, transparent);
561
+ }
562
+
563
+ .rs-select__search-wrap {
564
+ display: flex;
565
+ align-items: center;
566
+ gap: var(--rs-space-sm);
567
+ width: 100%;
568
+ min-height: var(--rs-control-height-sm);
569
+ box-sizing: border-box;
570
+ padding: 0 var(--rs-space-sm);
571
+ border: 1px solid var(--rs-input-border, var(--rs-border));
572
+ border-radius: var(--rs-radius-sm);
573
+ background: var(--rs-input-bg);
574
+ box-shadow: var(--rs-input-shadow, none);
575
+ transition:
576
+ border-color var(--rs-transition-fast),
577
+ box-shadow var(--rs-transition-fast),
578
+ background var(--rs-transition-fast);
579
+ }
580
+
581
+ .rs-select__search-wrap:hover {
582
+ border-color: var(--rs-input-border-hover, var(--rs-border));
583
+ }
584
+
585
+ .rs-select__search-wrap:focus-within {
586
+ border-color: var(--rs-focus-border, var(--rs-primary));
587
+ background: var(--rs-input-bg);
588
+ box-shadow:
589
+ var(--rs-input-shadow, none),
590
+ 0 0 0 var(--rs-focus-ring-width, 2px) var(--rs-focus-ring);
591
+ }
592
+
593
+ .rs-select__search-icon {
594
+ flex-shrink: 0;
595
+ color: var(--rs-muted);
596
+ }
597
+
598
+ .rs-select__search {
599
+ flex: 1;
600
+ min-width: 0;
601
+ width: 100%;
602
+ margin: 0;
603
+ padding: 0;
604
+ border: none;
605
+ border-radius: 0;
606
+ background: transparent;
607
+ color: var(--rs-text);
608
+ font-size: var(--rs-font-size-sm);
609
+ line-height: var(--rs-line-height-normal);
610
+ outline: none;
611
+ box-shadow: none;
612
+ }
613
+
614
+ .rs-select__search:focus {
615
+ border: none;
616
+ box-shadow: none;
617
+ }
618
+
619
+ .rs-select__search::placeholder {
620
+ color: var(--rs-placeholder);
621
+ }
622
+
623
+ .rs-select__viewport {
624
+ overflow-y: auto;
625
+ max-height: inherit;
626
+ padding: 0 var(--rs-space-xs) var(--rs-space-xs);
627
+ }
628
+
629
+ .rs-select__content:not(:has(.rs-select__search-bar)) .rs-select__viewport {
630
+ padding-top: var(--rs-space-xs);
631
+ }
632
+
633
+ .rs-select__status,
634
+ .rs-select__empty {
635
+ padding: var(--rs-space-md) var(--rs-space-md);
636
+ font-size: var(--rs-font-size-sm);
637
+ line-height: var(--rs-line-height-normal);
638
+ color: var(--rs-muted);
639
+ text-align: center;
640
+ }
641
+
642
+ .rs-select__group + .rs-select__group {
643
+ margin-top: var(--rs-space-sm);
644
+ padding-top: 0;
645
+ border-top: 1px solid var(--rs-border-subtle);
646
+ }
647
+
648
+ .rs-select__group-label {
649
+ display: block;
650
+ padding: var(--rs-space-xs) var(--rs-space-sm) var(--rs-space-xs);
651
+ font-size: var(--rs-font-size-xs);
652
+ font-weight: 600;
653
+ color: var(--rs-muted);
654
+ letter-spacing: 0.04em;
655
+ line-height: var(--rs-line-height-tight);
656
+ user-select: none;
657
+ }
658
+
659
+ /* 非首组:标题骑在分割横线上 */
660
+ .rs-select__group + .rs-select__group .rs-select__group-label {
661
+ position: relative;
662
+ top: -0.55em;
663
+ margin-bottom: 0.125rem;
664
+ padding: 0 0.375rem;
665
+ margin-left: var(--rs-space-sm);
666
+ width: fit-content;
667
+ max-width: calc(100% - var(--rs-space-sm) * 2);
668
+ background: var(--rs-surface-elevated);
669
+ line-height: 1;
670
+ }
671
+
672
+ .rs-select__item {
673
+ display: flex;
674
+ align-items: center;
675
+ gap: var(--rs-space-sm);
676
+ width: 100%;
677
+ box-sizing: border-box;
678
+ padding: var(--rs-space-sm) var(--rs-space-md);
679
+ font-size: var(--rs-font-size-sm);
680
+ line-height: var(--rs-line-height-tight);
681
+ color: var(--rs-text);
682
+ outline: none;
683
+ border-radius: var(--rs-radius-sm);
684
+ transition:
685
+ background var(--rs-transition-fast),
686
+ color var(--rs-transition-fast);
687
+ cursor: pointer;
688
+ user-select: none;
689
+ }
690
+
691
+ .rs-select__item-label {
692
+ flex: 1;
693
+ min-width: 0;
694
+ overflow: hidden;
695
+ text-overflow: ellipsis;
696
+ white-space: nowrap;
697
+ text-align: left;
698
+ }
699
+
700
+ .rs-select__item-check {
701
+ display: inline-flex;
702
+ width: 0.875rem;
703
+ flex-shrink: 0;
704
+ margin-left: auto;
705
+ color: var(--rs-primary);
706
+ }
707
+
708
+ /* 虚拟列表项由 Reka 绝对定位,需显式拉满宽度 */
709
+ [data-reka-virtualizer] .rs-select__item {
710
+ width: 100%;
711
+ }
712
+
713
+ .rs-select__item[data-highlighted] {
714
+ background: var(--rs-item-hover);
715
+ }
716
+
717
+ .rs-select__item[data-state='checked'] {
718
+ color: var(--rs-primary);
719
+ background: color-mix(in srgb, var(--rs-primary) 12%, transparent);
720
+ }
721
+
722
+ .rs-select__item[data-disabled] {
723
+ opacity: 0.38;
724
+ cursor: not-allowed;
725
+ }
726
+
727
+ .rs-field {
728
+ display: flex;
729
+ flex-direction: column;
730
+ gap: var(--rs-space-xs);
731
+ width: 100%;
732
+ color: var(--rs-text);
733
+ font-size: var(--rs-font-size-sm);
734
+ }
735
+
736
+ .rs-field--label-left {
737
+ display: grid;
738
+ grid-template-columns: var(--rs-field-label-width, max-content) minmax(0, 1fr);
739
+ align-items: start;
740
+ column-gap: var(--rs-space-md);
741
+ }
742
+
743
+ .rs-field--label-left.rs-field--label-align-end .rs-field__label {
744
+ justify-content: flex-end;
745
+ text-align: end;
746
+ }
747
+
748
+ .rs-field__label {
749
+ color: var(--rs-muted);
750
+ font-size: var(--rs-font-size-xs);
751
+ font-weight: 600;
752
+ }
753
+
754
+ .rs-field__required {
755
+ color: var(--rs-danger);
756
+ }
757
+
758
+ .rs-field__hint {
759
+ color: var(--rs-muted);
760
+ font-size: var(--rs-font-size-xs);
761
+ }
762
+
763
+ .rs-field--label-left .rs-field__hint {
764
+ grid-column: 2;
765
+ }
766
+
767
+ .rs-field__control {
768
+ width: 100%;
769
+ min-height: var(--rs-control-height-md);
770
+ box-sizing: border-box;
771
+ padding: 0 var(--rs-space-md);
772
+ border: 1px solid var(--rs-input-border, var(--rs-border));
773
+ border-radius: var(--rs-radius-sm);
774
+ background: var(--rs-input-bg);
775
+ color: var(--rs-text);
776
+ box-shadow: var(--rs-input-shadow, none);
777
+ font: inherit;
778
+ outline: none;
779
+ transition:
780
+ border-color var(--rs-transition-fast),
781
+ box-shadow var(--rs-transition-fast);
782
+ }
783
+
784
+ .rs-field__control:hover:not(:disabled) {
785
+ border-color: var(--rs-input-border-hover, var(--rs-border));
786
+ }
787
+
788
+ .rs-field__control:focus {
789
+ border-color: var(--rs-focus-border, var(--rs-primary));
790
+ box-shadow:
791
+ var(--rs-input-shadow, none),
792
+ 0 0 0 var(--rs-focus-ring-width, 2px) var(--rs-focus-ring);
793
+ }
794
+
795
+ .rs-field__control:disabled {
796
+ opacity: 0.38;
797
+ cursor: not-allowed;
798
+ }
799
+
800
+ /* vue-sonner 结构样式已在文件顶部 import;外观由 .rs-toast* 接管 */
801
+
802
+ [data-sonner-toaster].rs-toaster {
803
+ z-index: var(--rs-z-toast);
804
+ font-family: inherit;
805
+ }
806
+
807
+ .rs-toast {
808
+ display: flex;
809
+ align-items: flex-start;
810
+ gap: var(--rs-space-sm);
811
+ position: relative;
812
+ min-width: 18rem;
813
+ max-width: min(28rem, calc(100vw - 2rem));
814
+ padding: var(--rs-space-md) var(--rs-space-lg);
815
+ border: 1px solid var(--rs-border);
816
+ border-radius: var(--rs-radius);
817
+ background: var(--rs-surface-elevated);
818
+ color: var(--rs-text);
819
+ box-shadow: var(--rs-shadow-lg);
820
+ }
821
+
822
+ .rs-toast [data-icon] {
823
+ display: flex;
824
+ flex-shrink: 0;
825
+ align-items: center;
826
+ margin-top: 0.125rem;
827
+ }
828
+
829
+ .rs-toast [data-content] {
830
+ flex: 1;
831
+ min-width: 0;
832
+ display: grid;
833
+ gap: var(--rs-space-xs);
834
+ }
835
+
836
+ .rs-toast--success {
837
+ border-color: color-mix(in srgb, var(--rs-success) 35%, var(--rs-border));
838
+ }
839
+
840
+ .rs-toast--error {
841
+ border-color: color-mix(in srgb, var(--rs-danger) 35%, var(--rs-border));
842
+ }
843
+
844
+ .rs-toast--warning {
845
+ border-color: color-mix(in srgb, var(--rs-warning) 35%, var(--rs-border));
846
+ }
847
+
848
+ .rs-toast--info {
849
+ border-color: color-mix(in srgb, var(--rs-info) 35%, var(--rs-border));
850
+ }
851
+
852
+ .rs-toast__title {
853
+ font-size: var(--rs-font-size-sm);
854
+ font-weight: 600;
855
+ }
856
+
857
+ .rs-toast__description {
858
+ color: var(--rs-muted);
859
+ font-size: var(--rs-font-size-sm);
860
+ }
861
+
862
+ .rs-toast__close {
863
+ position: absolute;
864
+ top: 0;
865
+ left: 0;
866
+ display: flex;
867
+ align-items: center;
868
+ justify-content: center;
869
+ width: 1.25rem;
870
+ height: 1.25rem;
871
+ padding: 0;
872
+ border: 1px solid var(--rs-border);
873
+ border-radius: var(--rs-radius-full);
874
+ background: var(--rs-surface-elevated);
875
+ color: var(--rs-muted);
876
+ cursor: pointer;
877
+ transform: translate(-35%, -35%);
878
+ transition:
879
+ background var(--rs-transition-fast),
880
+ border-color var(--rs-transition-fast),
881
+ color var(--rs-transition-fast);
882
+ }
883
+
884
+ .rs-toast__close:hover {
885
+ background: var(--rs-item-hover);
886
+ border-color: var(--rs-border);
887
+ color: var(--rs-text);
888
+ }
889
+
890
+ .rs-toast__close:focus-visible {
891
+ outline: none;
892
+ box-shadow: 0 0 0 var(--rs-focus-ring-width, 2px) var(--rs-focus-ring);
893
+ }
894
+
895
+ /* Activity Bar「API」字标:粗圆角字重,随 currentColor */
896
+ .lucide-api-icon .api-icon__label {
897
+ fill: currentColor;
898
+ stroke: none;
899
+ font-family: ui-rounded, 'SF Pro Rounded', 'Segoe UI', system-ui, sans-serif;
900
+ font-size: 9.5px;
901
+ font-weight: 800;
902
+ letter-spacing: -0.04em;
903
+ text-anchor: middle;
904
+ -webkit-font-smoothing: antialiased;
905
+ }
906
+
907
+ /* FTP 自定义图标:橙色实心文件夹 + 白色 FTP 字样 */
908
+ .lucide-ftp-icon .ftp-icon__folder {
909
+ fill: var(--rs-icon-ftp-accent);
910
+ stroke: color-mix(in srgb, var(--rs-icon-ftp-accent) 55%, #1a1a1a);
911
+ stroke-width: 1.1;
912
+ }
913
+
914
+ .lucide-ftp-icon .ftp-icon__label {
915
+ fill: var(--rs-icon-ftp-on-accent);
916
+ stroke: none;
917
+ font-family: ui-monospace, 'SF Mono', Consolas, monospace;
918
+ font-size: 6.2px;
919
+ font-weight: 900;
920
+ letter-spacing: -0.08em;
921
+ text-anchor: middle;
922
+ -webkit-font-smoothing: antialiased;
923
+ }
924
+
925
+ .rs-context-menu__item[data-highlighted] .lucide-ftp-icon .ftp-icon__folder,
926
+ .rs-context-menu__item[data-state='open'] .lucide-ftp-icon .ftp-icon__folder {
927
+ fill: rgb(255 255 255 / 0.95);
928
+ stroke: rgb(255 255 255 / 0.55);
929
+ }
930
+
931
+ .rs-context-menu__item[data-highlighted] .lucide-ftp-icon .ftp-icon__label,
932
+ .rs-context-menu__item[data-state='open'] .lucide-ftp-icon .ftp-icon__label {
933
+ fill: var(--rs-icon-ftp-accent);
934
+ }
935
+
936
+ /* Redis 自定义图标:官方品牌 mark,单色填充随主题调整明暗对比度 */
937
+ .lucide-redis-icon .redis-icon__mark {
938
+ fill: var(--rs-icon-redis-accent);
939
+ }
940
+
941
+ .rs-context-menu__item[data-highlighted] .lucide-redis-icon .redis-icon__mark,
942
+ .rs-context-menu__item[data-state='open'] .lucide-redis-icon .redis-icon__mark {
943
+ fill: rgb(255 255 255 / 0.95);
944
+ }
945
+
946
+ /* MongoDB 自定义图标:官方品牌 mark,单色填充随主题调整明暗对比度 */
947
+ .lucide-mongodb-icon .mongodb-icon__mark {
948
+ fill: var(--rs-icon-mongodb-accent);
949
+ }
950
+
951
+ .rs-context-menu__item[data-highlighted] .lucide-mongodb-icon .mongodb-icon__mark,
952
+ .rs-context-menu__item[data-state='open'] .lucide-mongodb-icon .mongodb-icon__mark {
953
+ fill: rgb(255 255 255 / 0.95);
954
+ }
955
+
956
+ /* Vastbase 自定义图标:海量数据官方品牌 mark,单色填充随主题调整明暗对比度 */
957
+ .lucide-vastbase-icon .vastbase-icon__mark {
958
+ fill: var(--rs-icon-vastbase-accent);
959
+ }
960
+
961
+ .rs-context-menu__item[data-highlighted] .lucide-vastbase-icon .vastbase-icon__mark,
962
+ .rs-context-menu__item[data-state='open'] .lucide-vastbase-icon .vastbase-icon__mark {
963
+ fill: rgb(255 255 255 / 0.95);
964
+ }
965
+
966
+ /* MySQL 自定义图标:官方品牌 mark,单色填充随主题调整明暗对比度 */
967
+ .lucide-mysql-icon .mysql-icon__mark {
968
+ fill: var(--rs-icon-mysql-accent);
969
+ }
970
+
971
+ .rs-context-menu__item[data-highlighted] .lucide-mysql-icon .mysql-icon__mark,
972
+ .rs-context-menu__item[data-state='open'] .lucide-mysql-icon .mysql-icon__mark {
973
+ fill: rgb(255 255 255 / 0.95);
974
+ }
975
+
976
+ /* Dameng 自定义图标:官方品牌 mark(蓝椭圆 + 红波浪) */
977
+ .lucide-dameng-icon .dameng-icon__oval {
978
+ fill: var(--rs-icon-dameng-accent);
979
+ }
980
+
981
+ .lucide-dameng-icon .dameng-icon__wave {
982
+ fill: var(--rs-icon-dameng-wave);
983
+ }
984
+
985
+ .rs-context-menu__item[data-highlighted] .lucide-dameng-icon .dameng-icon__oval,
986
+ .rs-context-menu__item[data-state='open'] .lucide-dameng-icon .dameng-icon__oval,
987
+ .rs-context-menu__item[data-highlighted] .lucide-dameng-icon .dameng-icon__wave,
988
+ .rs-context-menu__item[data-state='open'] .lucide-dameng-icon .dameng-icon__wave {
989
+ fill: rgb(255 255 255 / 0.95);
990
+ }
991
+
992
+ /* SQLite 自定义图标:官方品牌 mark,单色填充随主题调整明暗对比度 */
993
+ .lucide-sqlite-icon .sqlite-icon__mark {
994
+ fill: var(--rs-icon-sqlite-accent);
995
+ }
996
+
997
+ .rs-context-menu__item[data-highlighted] .lucide-sqlite-icon .sqlite-icon__mark,
998
+ .rs-context-menu__item[data-state='open'] .lucide-sqlite-icon .sqlite-icon__mark {
999
+ fill: rgb(255 255 255 / 0.95);
1000
+ }
1001
+
1002
+ /* Oracle 自定义图标:官方品牌 oval mark,单色填充随主题调整明暗对比度 */
1003
+ .lucide-oracle-icon .oracle-icon__mark {
1004
+ fill: var(--rs-icon-oracle-accent);
1005
+ }
1006
+
1007
+ .rs-context-menu__item[data-highlighted] .lucide-oracle-icon .oracle-icon__mark,
1008
+ .rs-context-menu__item[data-state='open'] .lucide-oracle-icon .oracle-icon__mark {
1009
+ fill: rgb(255 255 255 / 0.95);
1010
+ }
1011
+
1012
+ /* ClickHouse 自定义图标:官方品牌 barcode mark,单色填充随主题调整明暗对比度 */
1013
+ .lucide-clickhouse-icon .clickhouse-icon__mark {
1014
+ fill: var(--rs-icon-clickhouse-accent);
1015
+ }
1016
+
1017
+ .rs-context-menu__item[data-highlighted] .lucide-clickhouse-icon .clickhouse-icon__mark,
1018
+ .rs-context-menu__item[data-state='open'] .lucide-clickhouse-icon .clickhouse-icon__mark {
1019
+ fill: rgb(255 255 255 / 0.95);
1020
+ }
1021
+
1022
+ /* 人大金仓自定义图标:官方品牌 K lettermark,单色填充随主题调整明暗对比度 */
1023
+ .lucide-kingbase-icon .kingbase-icon__mark {
1024
+ fill: var(--rs-icon-kingbase-accent);
1025
+ }
1026
+
1027
+ .rs-context-menu__item[data-highlighted] .lucide-kingbase-icon .kingbase-icon__mark,
1028
+ .rs-context-menu__item[data-state='open'] .lucide-kingbase-icon .kingbase-icon__mark {
1029
+ fill: rgb(255 255 255 / 0.95);
1030
+ }
1031
+
1032
+ /* SQL Server 自定义图标:官方品牌火焰/翼形 mark,单色填充随主题调整明暗对比度 */
1033
+ .lucide-sqlserver-icon .sqlserver-icon__mark {
1034
+ fill: var(--rs-icon-sqlserver-accent);
1035
+ }
1036
+
1037
+ .rs-context-menu__item[data-highlighted] .lucide-sqlserver-icon .sqlserver-icon__mark,
1038
+ .rs-context-menu__item[data-state='open'] .lucide-sqlserver-icon .sqlserver-icon__mark {
1039
+ fill: rgb(255 255 255 / 0.95);
1040
+ }