niuma-ui 2.1.0 → 2.1.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 (43) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/components/auto-complete/src/RsAutoComplete.d.ts +2 -2
  3. package/dist/components/code-block/src/RsCodeBlock.css +26 -26
  4. package/dist/components/code-block/src/RsCodeBlock.impl.js +2 -2
  5. package/dist/components/code-block/src/RsCodeBlock.js +1 -1
  6. package/dist/components/context-menu/src/RsContextMenu.css +19 -19
  7. package/dist/components/date-picker/src/RsDatePicker.d.ts +2 -2
  8. package/dist/components/date-picker/src/RsDateTimePicker.d.ts +2 -2
  9. package/dist/components/dialog/src/RsConfirmDialog.css +25 -25
  10. package/dist/components/dialog/src/RsConfirmDialog.impl.js +4 -4
  11. package/dist/components/dialog/src/RsConfirmDialog.js +1 -1
  12. package/dist/components/dialog/src/RsDialog.css +63 -63
  13. package/dist/components/dialog/src/RsDialog.impl.js +56 -11
  14. package/dist/components/dialog/src/RsDialog.js +1 -1
  15. package/dist/components/dialog/src/dialog-window.d.ts +1 -0
  16. package/dist/components/dialog/src/dialog-window.js +1 -0
  17. package/dist/components/dynamic-tags/src/RsDynamicTags.d.ts +2 -2
  18. package/dist/components/icon/src/RsIcon.css +5 -5
  19. package/dist/components/icon/src/RsIcon.d.ts +1 -1
  20. package/dist/components/icon/src/RsIcon.impl.js +1 -1
  21. package/dist/components/icon/src/RsIcon.js +1 -1
  22. package/dist/components/input/src/RsInput.d.ts +2 -2
  23. package/dist/components/mentions/src/RsMentions.d.ts +2 -2
  24. package/dist/components/select/src/RsSelect.d.ts +2 -2
  25. package/dist/components/tabs/src/RsTabs.d.ts +3 -3
  26. package/dist/components/tabs/src/RsTabs.impl.js +1 -1
  27. package/dist/components/textarea/src/RsTextarea.d.ts +2 -2
  28. package/dist/components/time-picker/src/RsTimePicker.d.ts +2 -2
  29. package/dist/components/tree/src/RsTree.css +74 -74
  30. package/dist/components/tree/src/RsTree.js +1 -1
  31. package/dist/components/tree-select/src/RsTreeSelect.d.ts +2 -2
  32. package/dist/icons/host.d.ts +11 -0
  33. package/dist/icons/host.js +30 -0
  34. package/dist/icons/lucide.js +10 -3
  35. package/dist/icons/registry.js +1 -1
  36. package/dist/index.d.ts +1 -0
  37. package/dist/index.js +1 -0
  38. package/dist/styles.css +27 -11
  39. package/dist/utils/rs-clipboard.d.ts +1 -1
  40. package/dist/utils/rs-clipboard.js +17 -7
  41. package/dist/vite-plugins/niuma-ui-host.d.ts +2 -1
  42. package/dist/vite-plugins/niuma-ui-host.js +25 -6
  43. package/package.json +1 -1
@@ -66,9 +66,9 @@ type __VLS_Slots = {} & {
66
66
  error?: (props: typeof __VLS_8) => any;
67
67
  };
68
68
  declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, RsTextareaExpose, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
69
+ clear: () => any;
69
70
  blur: (event: FocusEvent) => any;
70
71
  focus: (event: FocusEvent) => any;
71
- clear: () => any;
72
72
  "update:modelValue": (value: string) => any;
73
73
  validate: (payload: {
74
74
  valid: boolean;
@@ -76,9 +76,9 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, RsTex
76
76
  }) => any;
77
77
  pressEnter: (event: KeyboardEvent) => any;
78
78
  }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
79
+ onClear?: (() => any) | undefined;
79
80
  onBlur?: ((event: FocusEvent) => any) | undefined;
80
81
  onFocus?: ((event: FocusEvent) => any) | undefined;
81
- onClear?: (() => any) | undefined;
82
82
  "onUpdate:modelValue"?: ((value: string) => any) | undefined;
83
83
  onValidate?: ((payload: {
84
84
  valid: boolean;
@@ -55,17 +55,17 @@ type __VLS_ModelProps = {
55
55
  type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
56
56
  declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, RsTimePickerExpose, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
57
57
  change: (value: RsTimePickerModelValue) => any;
58
+ clear: () => any;
58
59
  blur: () => any;
59
60
  focus: () => any;
60
- clear: () => any;
61
61
  "update:modelValue": (value: RsTimePickerModelValue) => any;
62
62
  openChange: (open: boolean) => any;
63
63
  "update:open": (value: boolean) => any;
64
64
  }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
65
65
  onChange?: ((value: RsTimePickerModelValue) => any) | undefined;
66
+ onClear?: (() => any) | undefined;
66
67
  onBlur?: (() => any) | undefined;
67
68
  onFocus?: (() => any) | undefined;
68
- onClear?: (() => any) | undefined;
69
69
  "onUpdate:modelValue"?: ((value: RsTimePickerModelValue) => any) | undefined;
70
70
  onOpenChange?: ((open: boolean) => any) | undefined;
71
71
  "onUpdate:open"?: ((value: boolean) => any) | undefined;
@@ -1,54 +1,54 @@
1
1
 
2
- .rs-tree[data-v-ef7566eb] {
2
+ .rs-tree[data-v-2c7a1313] {
3
3
  outline: none;
4
4
  }
5
5
 
6
6
  /* 限定高度 / 虚拟滚动:铺满父级,::before 捕获节点列表下方空白区右键 */
7
- .rs-tree--fill-capture[data-v-ef7566eb] {
7
+ .rs-tree--fill-capture[data-v-2c7a1313] {
8
8
  position: relative;
9
9
  height: 100%;
10
10
  min-height: 0;
11
11
  }
12
- .rs-tree--fill-capture[data-v-ef7566eb]::before {
12
+ .rs-tree--fill-capture[data-v-2c7a1313]::before {
13
13
  content: '';
14
14
  position: absolute;
15
15
  inset: 0;
16
16
  z-index: 0;
17
17
  }
18
- .rs-tree--fill-capture > .rs-tree__empty[data-v-ef7566eb],
19
- .rs-tree--fill-capture > .rs-tree__viewport[data-v-ef7566eb] {
18
+ .rs-tree--fill-capture > .rs-tree__empty[data-v-2c7a1313],
19
+ .rs-tree--fill-capture > .rs-tree__viewport[data-v-2c7a1313] {
20
20
  position: relative;
21
21
  z-index: 1;
22
22
  height: 100%;
23
23
  min-height: 0;
24
24
  box-sizing: border-box;
25
25
  }
26
- .rs-tree[data-v-ef7566eb]:focus-visible {
26
+ .rs-tree[data-v-2c7a1313]:focus-visible {
27
27
  box-shadow: 0 0 0 var(--rs-focus-ring-width, 2px) var(--rs-focus-ring);
28
28
  border-radius: var(--rs-radius-sm);
29
29
  }
30
- .rs-tree__viewport--scroll[data-v-ef7566eb] {
30
+ .rs-tree__viewport--scroll[data-v-2c7a1313] {
31
31
  overflow: auto;
32
32
  }
33
33
 
34
34
  /* 虚拟模式下组件自动撑满父容器,使内置 ResizeObserver 能测到真实可用高度 */
35
- .rs-tree--virtual[data-v-ef7566eb] {
35
+ .rs-tree--virtual[data-v-2c7a1313] {
36
36
  height: 100%;
37
37
  }
38
- .rs-tree--virtual .rs-tree__viewport--scroll[data-v-ef7566eb],
39
- .rs-tree__viewport--scroll[data-v-ef7566eb] {
38
+ .rs-tree--virtual .rs-tree__viewport--scroll[data-v-2c7a1313],
39
+ .rs-tree__viewport--scroll[data-v-2c7a1313] {
40
40
  border-radius: var(--rs-radius-sm);
41
41
  }
42
- .rs-tree__empty[data-v-ef7566eb] {
42
+ .rs-tree__empty[data-v-2c7a1313] {
43
43
  padding: var(--rs-space-xl) var(--rs-space-md);
44
44
  }
45
- .rs-tree__list[data-v-ef7566eb],
46
- .rs-tree__item[data-v-ef7566eb] {
45
+ .rs-tree__list[data-v-2c7a1313],
46
+ .rs-tree__item[data-v-2c7a1313] {
47
47
  margin: 0;
48
48
  padding: 0;
49
49
  list-style: none;
50
50
  }
51
- .rs-tree__row[data-v-ef7566eb] {
51
+ .rs-tree__row[data-v-2c7a1313] {
52
52
  position: relative;
53
53
  display: flex;
54
54
  align-items: center;
@@ -59,34 +59,34 @@
59
59
  box-sizing: border-box;
60
60
  transition: background 0.15s ease, box-shadow 0.15s ease, color 0.15s ease;
61
61
  }
62
- .rs-tree__row[data-v-ef7566eb]:hover:not(.rs-tree__row--disabled):not(.rs-tree__row--selected) {
62
+ .rs-tree__row[data-v-2c7a1313]:hover:not(.rs-tree__row--disabled):not(.rs-tree__row--selected) {
63
63
  background: var(--rs-tree-row-hover);
64
64
  }
65
- .rs-tree__row--selected[data-v-ef7566eb] {
65
+ .rs-tree__row--selected[data-v-2c7a1313] {
66
66
  background: var(--rs-tree-selected-bg);
67
67
  }
68
- .rs-tree__row--selected .rs-tree__label[data-v-ef7566eb],
69
- .rs-tree__row--selected .rs-tree__label--block[data-v-ef7566eb] {
68
+ .rs-tree__row--selected .rs-tree__label[data-v-2c7a1313],
69
+ .rs-tree__row--selected .rs-tree__label--block[data-v-2c7a1313] {
70
70
  color: var(--rs-tree-selected-fg);
71
71
  font-weight: inherit;
72
72
  }
73
- .rs-tree__row--focused[data-v-ef7566eb] {
73
+ .rs-tree__row--focused[data-v-2c7a1313] {
74
74
  background: var(--rs-tree-focused-bg);
75
75
  box-shadow: inset 0 0 0 1px var(--rs-tree-focused-ring);
76
76
  }
77
- .rs-tree__row--selected.rs-tree__row--focused[data-v-ef7566eb] {
77
+ .rs-tree__row--selected.rs-tree__row--focused[data-v-2c7a1313] {
78
78
  background: var(--rs-tree-selected-focused-bg);
79
79
  box-shadow: inset 0 0 0 1px var(--rs-tree-selected-focused-ring);
80
80
  }
81
- .rs-tree--block .rs-tree__row[data-v-ef7566eb] {
81
+ .rs-tree--block .rs-tree__row[data-v-2c7a1313] {
82
82
  cursor: pointer;
83
83
  }
84
- .rs-tree__row--disabled[data-v-ef7566eb] {
84
+ .rs-tree__row--disabled[data-v-2c7a1313] {
85
85
  opacity: 0.38;
86
86
  cursor: not-allowed;
87
87
  }
88
- .rs-tree__row--drop-before[data-v-ef7566eb]::before,
89
- .rs-tree__row--drop-after[data-v-ef7566eb]::after {
88
+ .rs-tree__row--drop-before[data-v-2c7a1313]::before,
89
+ .rs-tree__row--drop-after[data-v-2c7a1313]::after {
90
90
  content: '';
91
91
  position: absolute;
92
92
  inset-inline: 0;
@@ -94,50 +94,50 @@
94
94
  background: var(--rs-tree-drop-indicator);
95
95
  pointer-events: none;
96
96
  }
97
- .rs-tree__row--drop-before[data-v-ef7566eb]::before {
97
+ .rs-tree__row--drop-before[data-v-2c7a1313]::before {
98
98
  top: 0;
99
99
  }
100
- .rs-tree__row--drop-after[data-v-ef7566eb]::after {
100
+ .rs-tree__row--drop-after[data-v-2c7a1313]::after {
101
101
  bottom: 0;
102
102
  }
103
- .rs-tree__row--drop-inside[data-v-ef7566eb] {
103
+ .rs-tree__row--drop-inside[data-v-2c7a1313] {
104
104
  background: var(--rs-tree-drop-inside-bg);
105
105
  }
106
- .rs-tree--disabled[data-v-ef7566eb] {
106
+ .rs-tree--disabled[data-v-2c7a1313] {
107
107
  cursor: not-allowed;
108
108
  }
109
- .rs-tree--line .rs-tree__lines[data-v-ef7566eb] {
109
+ .rs-tree--line .rs-tree__lines[data-v-2c7a1313] {
110
110
  position: absolute;
111
111
  inset: 0;
112
112
  pointer-events: none;
113
113
  }
114
114
 
115
115
  /* 导航线:半透明字色 token,避免宿主把 --rs-border-subtle 桥成实色灰后过深 */
116
- .rs-tree--line .rs-tree__line-vert[data-v-ef7566eb] {
116
+ .rs-tree--line .rs-tree__line-vert[data-v-2c7a1313] {
117
117
  position: absolute;
118
118
  top: 0;
119
119
  bottom: 0;
120
120
  width: var(--rs-tree-line-width, 1px);
121
121
  background: var(--rs-tree-line);
122
122
  }
123
- .rs-tree--line .rs-tree__line-vert--self.rs-tree__line-vert--end[data-v-ef7566eb] {
123
+ .rs-tree--line .rs-tree__line-vert--self.rs-tree__line-vert--end[data-v-2c7a1313] {
124
124
  bottom: 50%;
125
125
  }
126
- .rs-tree--line .rs-tree__line-horz[data-v-ef7566eb] {
126
+ .rs-tree--line .rs-tree__line-horz[data-v-2c7a1313] {
127
127
  position: absolute;
128
128
  top: 50%;
129
129
  height: var(--rs-tree-line-width, 1px);
130
130
  background: var(--rs-tree-line);
131
131
  }
132
- .rs-tree__drag-handle[data-v-ef7566eb] {
132
+ .rs-tree__drag-handle[data-v-2c7a1313] {
133
133
  display: inline-flex;
134
134
  align-items: center;
135
135
  color: var(--rs-muted);
136
136
  cursor: move;
137
137
  flex: 0 0 auto;
138
138
  }
139
- .rs-tree__toggle[data-v-ef7566eb],
140
- .rs-tree__spacer[data-v-ef7566eb] {
139
+ .rs-tree__toggle[data-v-2c7a1313],
140
+ .rs-tree__spacer[data-v-2c7a1313] {
141
141
  display: inline-flex;
142
142
  align-items: center;
143
143
  justify-content: center;
@@ -145,7 +145,7 @@
145
145
  height: 1.25rem;
146
146
  flex: 0 0 auto;
147
147
  }
148
- .rs-tree__toggle[data-v-ef7566eb] {
148
+ .rs-tree__toggle[data-v-2c7a1313] {
149
149
  border: 0;
150
150
  padding: 0;
151
151
  border-radius: var(--rs-radius-xs);
@@ -155,16 +155,16 @@
155
155
  outline: none;
156
156
  transition: color var(--rs-transition-fast);
157
157
  }
158
- .rs-tree__toggle[data-v-ef7566eb]:hover:not(:disabled) {
158
+ .rs-tree__toggle[data-v-2c7a1313]:hover:not(:disabled) {
159
159
  color: var(--rs-text);
160
160
  }
161
- .rs-tree__toggle[data-v-ef7566eb]:focus-visible {
161
+ .rs-tree__toggle[data-v-2c7a1313]:focus-visible {
162
162
  box-shadow: 0 0 0 var(--rs-focus-ring-width, 2px) var(--rs-focus-ring);
163
163
  }
164
- .rs-tree__toggle[data-v-ef7566eb]:disabled {
164
+ .rs-tree__toggle[data-v-2c7a1313]:disabled {
165
165
  cursor: default;
166
166
  }
167
- .rs-tree__toggle-caret[data-v-ef7566eb] {
167
+ .rs-tree__toggle-caret[data-v-2c7a1313] {
168
168
  display: block;
169
169
  font-size: var(--rs-font-size-lg);
170
170
  font-weight: var(--rs-font-weight-medium);
@@ -172,32 +172,32 @@
172
172
  transform: translateY(-0.5px);
173
173
  transition: transform var(--rs-transition-fast);
174
174
  }
175
- [dir='rtl'] .rs-tree__toggle-caret[data-v-ef7566eb] {
175
+ [dir='rtl'] .rs-tree__toggle-caret[data-v-2c7a1313] {
176
176
  transform: translateY(-0.5px) scaleX(-1);
177
177
  }
178
- .rs-tree__toggle--expanded .rs-tree__toggle-caret[data-v-ef7566eb] {
178
+ .rs-tree__toggle--expanded .rs-tree__toggle-caret[data-v-2c7a1313] {
179
179
  transform: translateY(-0.5px) rotate(90deg);
180
180
  }
181
- [dir='rtl'] .rs-tree__toggle--expanded .rs-tree__toggle-caret[data-v-ef7566eb] {
181
+ [dir='rtl'] .rs-tree__toggle--expanded .rs-tree__toggle-caret[data-v-2c7a1313] {
182
182
  transform: translateY(-0.5px) scaleX(-1) rotate(-90deg);
183
183
  }
184
- .rs-tree__loading-icon[data-v-ef7566eb] {
184
+ .rs-tree__loading-icon[data-v-2c7a1313] {
185
185
  color: var(--rs-primary);
186
186
  }
187
- .rs-tree__checkbox[data-v-ef7566eb] {
187
+ .rs-tree__checkbox[data-v-2c7a1313] {
188
188
  position: relative;
189
189
  display: inline-flex;
190
190
  align-items: center;
191
191
  flex: 0 0 auto;
192
192
  cursor: pointer;
193
193
  }
194
- .rs-tree__checkbox-spacer[data-v-ef7566eb] {
194
+ .rs-tree__checkbox-spacer[data-v-2c7a1313] {
195
195
  display: inline-block;
196
196
  width: 1rem;
197
197
  height: 1rem;
198
198
  flex: 0 0 auto;
199
199
  }
200
- .rs-tree__checkbox-input[data-v-ef7566eb] {
200
+ .rs-tree__checkbox-input[data-v-2c7a1313] {
201
201
  position: absolute;
202
202
  width: 1px;
203
203
  height: 1px;
@@ -208,7 +208,7 @@
208
208
  white-space: nowrap;
209
209
  border: 0;
210
210
  }
211
- .rs-tree__checkbox-box[data-v-ef7566eb] {
211
+ .rs-tree__checkbox-box[data-v-2c7a1313] {
212
212
  display: inline-flex;
213
213
  align-items: center;
214
214
  justify-content: center;
@@ -219,12 +219,12 @@
219
219
  background: var(--rs-surface);
220
220
  transition: background 0.15s ease, border-color 0.15s ease;
221
221
  }
222
- .rs-tree__checkbox--checked .rs-tree__checkbox-box[data-v-ef7566eb],
223
- .rs-tree__checkbox--indeterminate .rs-tree__checkbox-box[data-v-ef7566eb] {
222
+ .rs-tree__checkbox--checked .rs-tree__checkbox-box[data-v-2c7a1313],
223
+ .rs-tree__checkbox--indeterminate .rs-tree__checkbox-box[data-v-2c7a1313] {
224
224
  border-color: var(--rs-primary);
225
225
  background: var(--rs-primary);
226
226
  }
227
- .rs-tree__checkbox--checked .rs-tree__checkbox-box[data-v-ef7566eb]::after {
227
+ .rs-tree__checkbox--checked .rs-tree__checkbox-box[data-v-2c7a1313]::after {
228
228
  content: '';
229
229
  width: 0.3rem;
230
230
  height: 0.55rem;
@@ -232,18 +232,18 @@
232
232
  border-width: 0 2px 2px 0;
233
233
  transform: rotate(45deg) translate(-1px, -1px);
234
234
  }
235
- .rs-tree__checkbox--indeterminate .rs-tree__checkbox-box[data-v-ef7566eb]::after {
235
+ .rs-tree__checkbox--indeterminate .rs-tree__checkbox-box[data-v-2c7a1313]::after {
236
236
  content: '';
237
237
  width: 0.5rem;
238
238
  height: 2px;
239
239
  background: var(--rs-tree-check-fg, var(--rs-primary-foreground));
240
240
  border-radius: 1px;
241
241
  }
242
- .rs-tree__node-icon[data-v-ef7566eb] {
242
+ .rs-tree__node-icon[data-v-2c7a1313] {
243
243
  flex: 0 0 auto;
244
244
  color: var(--rs-muted);
245
245
  }
246
- .rs-tree__label[data-v-ef7566eb] {
246
+ .rs-tree__label[data-v-2c7a1313] {
247
247
  flex: 1 1 auto;
248
248
  min-width: 0;
249
249
  border: 0;
@@ -254,20 +254,20 @@
254
254
  text-align: start;
255
255
  cursor: pointer;
256
256
  }
257
- .rs-tree__label-text[data-v-ef7566eb] {
257
+ .rs-tree__label-text[data-v-2c7a1313] {
258
258
  display: block;
259
259
  overflow: hidden;
260
260
  text-overflow: ellipsis;
261
261
  white-space: nowrap;
262
262
  }
263
- .rs-tree__label--block[data-v-ef7566eb] {
263
+ .rs-tree__label--block[data-v-2c7a1313] {
264
264
  cursor: inherit;
265
265
  }
266
- .rs-tree__label[data-v-ef7566eb]:disabled,
267
- .rs-tree__label--disabled[data-v-ef7566eb] {
266
+ .rs-tree__label[data-v-2c7a1313]:disabled,
267
+ .rs-tree__label--disabled[data-v-2c7a1313] {
268
268
  cursor: not-allowed;
269
269
  }
270
- .rs-tree__highlight[data-v-ef7566eb] {
270
+ .rs-tree__highlight[data-v-2c7a1313] {
271
271
  padding: 0 0.125rem;
272
272
  border: 0;
273
273
  border-radius: 2px;
@@ -275,42 +275,42 @@
275
275
  color: inherit;
276
276
  font-weight: var(--rs-font-weight-semibold);
277
277
  }
278
- .rs-tree__pad[data-v-ef7566eb] {
278
+ .rs-tree__pad[data-v-2c7a1313] {
279
279
  flex: 0 0 auto;
280
280
  pointer-events: none;
281
281
  }
282
- .rs-tree--ssm .rs-tree__label[data-v-ef7566eb],
283
- .rs-tree--ssm .rs-tree__toggle[data-v-ef7566eb] {
282
+ .rs-tree--ssm .rs-tree__label[data-v-2c7a1313],
283
+ .rs-tree--ssm .rs-tree__toggle[data-v-2c7a1313] {
284
284
  font-size: var(--rs-font-size-xs);
285
285
  }
286
- .rs-tree--ssm .rs-tree__toggle[data-v-ef7566eb],
287
- .rs-tree--ssm .rs-tree__spacer[data-v-ef7566eb] {
286
+ .rs-tree--ssm .rs-tree__toggle[data-v-2c7a1313],
287
+ .rs-tree--ssm .rs-tree__spacer[data-v-2c7a1313] {
288
288
  width: 0.875rem;
289
289
  height: 0.875rem;
290
290
  }
291
- .rs-tree--ssm .rs-tree__toggle-caret[data-v-ef7566eb] {
291
+ .rs-tree--ssm .rs-tree__toggle-caret[data-v-2c7a1313] {
292
292
  font-size: var(--rs-font-size-sm);
293
293
  }
294
- .rs-tree--sm .rs-tree__label[data-v-ef7566eb],
295
- .rs-tree--sm .rs-tree__toggle[data-v-ef7566eb] {
294
+ .rs-tree--sm .rs-tree__label[data-v-2c7a1313],
295
+ .rs-tree--sm .rs-tree__toggle[data-v-2c7a1313] {
296
296
  font-size: var(--rs-font-size-xs);
297
297
  }
298
- .rs-tree--sm .rs-tree__toggle[data-v-ef7566eb],
299
- .rs-tree--sm .rs-tree__spacer[data-v-ef7566eb] {
298
+ .rs-tree--sm .rs-tree__toggle[data-v-2c7a1313],
299
+ .rs-tree--sm .rs-tree__spacer[data-v-2c7a1313] {
300
300
  width: 1rem;
301
301
  height: 1rem;
302
302
  }
303
- .rs-tree--sm .rs-tree__toggle-caret[data-v-ef7566eb] {
303
+ .rs-tree--sm .rs-tree__toggle-caret[data-v-2c7a1313] {
304
304
  font-size: var(--rs-font-size-base);
305
305
  }
306
- .rs-tree--lg .rs-tree__label[data-v-ef7566eb] {
306
+ .rs-tree--lg .rs-tree__label[data-v-2c7a1313] {
307
307
  font-size: var(--rs-font-size-sm);
308
308
  }
309
- .rs-tree--lg .rs-tree__toggle[data-v-ef7566eb],
310
- .rs-tree--lg .rs-tree__spacer[data-v-ef7566eb] {
309
+ .rs-tree--lg .rs-tree__toggle[data-v-2c7a1313],
310
+ .rs-tree--lg .rs-tree__spacer[data-v-2c7a1313] {
311
311
  width: 1.5rem;
312
312
  height: 1.5rem;
313
313
  }
314
- .rs-tree--lg .rs-tree__toggle-caret[data-v-ef7566eb] {
314
+ .rs-tree--lg .rs-tree__toggle-caret[data-v-2c7a1313] {
315
315
  font-size: var(--rs-font-size-xl);
316
316
  }
@@ -3,6 +3,6 @@ import _plugin_vue_export_helper_default from "../../../_virtual/_plugin-vue_exp
3
3
  import RsTree_vue_vue_type_script_setup_true_lang_default from "./RsTree.impl.js";
4
4
 
5
5
  //#region src/components/tree/src/RsTree.vue
6
- var RsTree_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsTree_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-ef7566eb"]]);
6
+ var RsTree_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsTree_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-2c7a1313"]]);
7
7
  //#endregion
8
8
  export { RsTree_default as default };
@@ -72,9 +72,9 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, RsTre
72
72
  change: (value: RsTreeSelectModelValue) => any;
73
73
  search: (query: string) => any;
74
74
  select: (key: string, node?: RsTreeNode | undefined) => any;
75
+ clear: () => any;
75
76
  blur: (event: FocusEvent) => any;
76
77
  focus: (event: FocusEvent) => any;
77
- clear: () => any;
78
78
  "update:modelValue": (value: RsTreeSelectModelValue) => any;
79
79
  "update:open": (value: boolean) => any;
80
80
  dropdownVisibleChange: (open: boolean) => any;
@@ -82,9 +82,9 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, RsTre
82
82
  onChange?: ((value: RsTreeSelectModelValue) => any) | undefined;
83
83
  onSearch?: ((query: string) => any) | undefined;
84
84
  onSelect?: ((key: string, node?: RsTreeNode | undefined) => any) | undefined;
85
+ onClear?: (() => any) | undefined;
85
86
  onBlur?: ((event: FocusEvent) => any) | undefined;
86
87
  onFocus?: ((event: FocusEvent) => any) | undefined;
87
- onClear?: (() => any) | undefined;
88
88
  "onUpdate:modelValue"?: ((value: RsTreeSelectModelValue) => any) | undefined;
89
89
  "onUpdate:open"?: ((value: boolean) => any) | undefined;
90
90
  onDropdownVisibleChange?: ((open: boolean) => any) | undefined;
@@ -0,0 +1,11 @@
1
+ import type { Component } from 'vue';
2
+ /**
3
+ * 登记业务自己的图标,供 `RsIcon` 以及页签 / 菜单 / 树 / 右键的 `icon` 字符串使用。
4
+ * 同名再次调用会换成新组件。内置品牌 mark 不能覆盖。
5
+ * Lucide 已有的名字仍渲染内置图形,开发环境会警告一次。
6
+ * 组件会收到 `size`、`strokeWidth`、`color`(默认 `currentColor`)。
7
+ */
8
+ export declare function registerRsIcon(name: string, component: Component): void;
9
+ export declare function resolveHostIcon(name: string): Component | undefined;
10
+ /** 测试里撤掉登记,避免盖住后续用例。不从包入口导出。 */
11
+ export declare function unregisterRsIcon(name: string): void;
@@ -0,0 +1,30 @@
1
+ import { isRsBrandIconName } from "./brand.js";
2
+ //#region src/icons/host.ts
3
+ /**
4
+ * 业务登记的图标。本文件不引入 Lucide。
5
+ * `import { registerRsIcon } from '@niuma/ui'` 只应落到这里。
6
+ */
7
+ var hostIcons = /* @__PURE__ */ new Map();
8
+ /** kebab-case,与 Lucide / 品牌 mark 同一套名字。 */
9
+ var ICON_NAME = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
10
+ function isVueComponent(value) {
11
+ return typeof value === "function" || typeof value === "object" && value !== null;
12
+ }
13
+ /**
14
+ * 登记业务自己的图标,供 `RsIcon` 以及页签 / 菜单 / 树 / 右键的 `icon` 字符串使用。
15
+ * 同名再次调用会换成新组件。内置品牌 mark 不能覆盖。
16
+ * Lucide 已有的名字仍渲染内置图形,开发环境会警告一次。
17
+ * 组件会收到 `size`、`strokeWidth`、`color`(默认 `currentColor`)。
18
+ */
19
+ function registerRsIcon(name, component) {
20
+ const id = name.trim();
21
+ if (!ICON_NAME.test(id)) throw new Error(`registerRsIcon: "${name}" must be kebab-case (for example "my-product")`);
22
+ if (isRsBrandIconName(id)) throw new Error(`registerRsIcon: "${id}" is a built-in brand mark and cannot be replaced`);
23
+ if (!isVueComponent(component)) throw new Error("registerRsIcon: component must be a Vue component");
24
+ hostIcons.set(id, component);
25
+ }
26
+ function resolveHostIcon(name) {
27
+ return hostIcons.get(name);
28
+ }
29
+ //#endregion
30
+ export { registerRsIcon, resolveHostIcon };
@@ -1,3 +1,4 @@
1
+ import { resolveHostIcon } from "./host.js";
1
2
  import { ApiIcon } from "./custom/api.js";
2
3
  import { FtpIcon } from "./custom/ftp.js";
3
4
  import { MongodbIcon } from "./custom/mongodb.js";
@@ -56,17 +57,23 @@ function resolveIconName(name) {
56
57
  return iconAliases.get(name) ?? name;
57
58
  }
58
59
  var iconCache = /* @__PURE__ */ new Map();
60
+ function hasBuiltinIcon(resolvedName) {
61
+ return customIconMap.has(resolvedName) || getLucideComponent(resolvedName) !== void 0;
62
+ }
59
63
  function isRsIconName(name) {
60
64
  const resolvedName = resolveIconName(name);
61
- return customIconMap.has(resolvedName) || getLucideComponent(resolvedName) !== void 0;
65
+ return hasBuiltinIcon(resolvedName) || resolveHostIcon(name) !== void 0 || resolveHostIcon(resolvedName) !== void 0;
62
66
  }
63
67
  function resolveLucideIcon(name) {
64
68
  const resolvedName = resolveIconName(name);
65
69
  const cached = iconCache.get(resolvedName);
66
70
  if (cached) return cached;
67
71
  const icon = customIconMap.get(resolvedName) ?? getLucideComponent(resolvedName);
68
- if (icon) iconCache.set(resolvedName, icon);
69
- return icon;
72
+ if (icon) {
73
+ iconCache.set(resolvedName, icon);
74
+ return icon;
75
+ }
76
+ return resolveHostIcon(name) ?? resolveHostIcon(resolvedName);
70
77
  }
71
78
  /** 可解析的图标数量(自定义 + Lucide 命名导出) */
72
79
  var lucideIconCount = customIconMap.size + Object.keys(lucideExports).filter((key) => !SKIP_LUCIDE_EXPORTS.has(key) && isVueComponent(lucideExports[key])).length;
@@ -1,5 +1,5 @@
1
- import { LUCIDE_ATTRIBUTION, LUCIDE_LICENSE, isRsIconName, lucideIconCount, resolveLucideIcon } from "./lucide.js";
2
1
  import { isRsBrandIconName, rsBrandIconAccentVar, rsBrandIconNames } from "./brand.js";
2
+ import { LUCIDE_ATTRIBUTION, LUCIDE_LICENSE, isRsIconName, lucideIconCount, resolveLucideIcon } from "./lucide.js";
3
3
  //#region src/icons/registry.ts
4
4
  /** Playground / 文档常用图标(Lucide 全库约 1600+;kebab-case,如 `house`、`trash-2`) */
5
5
  var rsCommonIconNames = [
package/dist/index.d.ts CHANGED
@@ -237,6 +237,7 @@ export type { RsTranslateFn } from './composables/useRsI18n';
237
237
  export { useRsToast } from './composables/useRsToast';
238
238
  export type { RsToastAction, RsToastInput, RsToastKind, RsToastOptions, RsToastPromiseMessages, } from './composables/useRsToast';
239
239
  export { rsCommonIconNames, rsBrandIconNames, rsBrandIconAccentVar, LUCIDE_ATTRIBUTION, LUCIDE_LICENSE, lucideIconCount, isRsIconName, isRsBrandIconName, } from './icons/registry';
240
+ export { registerRsIcon } from './icons/host';
240
241
  export type { RsBrandIconName } from './icons/registry';
241
242
  export type { RsThemeMode, RsResolvedTheme, RsThemeTokens, RsComponentSize, RsRadius, RsFontSize, RsFontWeight, } from './theme/types';
242
243
  export { RS_COMPONENT_SIZES, RS_COMPONENT_SIZE_ICON_PX, RS_RADII, RS_RADIUS_CSS, RS_FONT_SIZES, RS_FONT_SIZE_CSS, RS_FONT_WEIGHTS, RS_FONT_WEIGHT_CSS, } from './theme/types';
package/dist/index.js CHANGED
@@ -340,6 +340,7 @@ export { readTerminalFontSizePx } from './theme/css-token.js'
340
340
  export { readTerminalFontWeight } from './theme/css-token.js'
341
341
  export { readTerminalFontWeightBold } from './theme/css-token.js'
342
342
  export { readTerminalThemeFromCss } from './components/terminal/src/terminal-utils.js'
343
+ export { registerRsIcon } from './icons/host.js'
343
344
  export { registerRsLocale } from './locale/registry.js'
344
345
  export { removeUploadFileAt } from './components/upload/src/upload-utils.js'
345
346
  export { renderMarkdown } from './components/markdown/src/markdown-utils.js'
package/dist/styles.css CHANGED
@@ -360,29 +360,33 @@ html {
360
360
  --rs-dropdown-max-height: 16rem;
361
361
  --rs-dropdown-disabled-opacity: 0.38;
362
362
 
363
- /* Context menu。尺寸在此;颜色别名语义 token,随 data-rs-theme。挂到 body 须盖住 Dialog。 */
363
+ /*
364
+ * Context menu。macOS 菜单:12px 面板、6px 选中条、约 26px 行、13px 字。
365
+ * 选中用主题色铺底、文字反白。颜色别名语义 token,随 data-rs-theme。
366
+ * 挂到 body 须盖住 Dialog。实色底,不用 backdrop-filter。
367
+ */
364
368
  --rs-ctx-z: calc(var(--rs-z-modal) + 2);
365
- --rs-ctx-min-width: 11rem;
369
+ --rs-ctx-min-width: 11.5rem;
366
370
  --rs-ctx-max-width: 22rem;
367
371
  --rs-ctx-pad: 5px;
368
- --rs-ctx-radius: 10px;
369
- --rs-ctx-item-height: 1.5rem;
372
+ --rs-ctx-radius: 12px;
373
+ --rs-ctx-item-height: 1.625rem;
370
374
  --rs-ctx-item-radius: 6px;
371
- --rs-ctx-font-size: var(--rs-font-size-xs);
372
- --rs-ctx-icon-col: 28px;
375
+ --rs-ctx-font-size: 0.8125rem;
376
+ --rs-ctx-icon-col: 1.75rem;
373
377
  --rs-ctx-disabled-opacity: 0.38;
374
- --rs-ctx-motion-in: 0.13s;
378
+ --rs-ctx-motion-in: 0.14s;
375
379
  --rs-ctx-motion-sub: 0.1s;
376
380
  --rs-ctx-bg: var(--rs-surface-elevated);
377
381
  --rs-ctx-fg: var(--rs-text-primary);
378
382
  --rs-ctx-muted: var(--rs-text-tertiary);
379
- --rs-ctx-border: var(--rs-border);
380
- --rs-ctx-separator: var(--rs-border-subtle);
381
- --rs-ctx-shadow: var(--rs-shadow-lg);
383
+ --rs-ctx-border: color-mix(in srgb, var(--rs-text-primary) 8%, transparent);
384
+ --rs-ctx-separator: color-mix(in srgb, var(--rs-text-primary) 10%, transparent);
385
+ --rs-ctx-shadow: 0 16px 40px rgb(0 0 0 / 0.12), 0 2px 8px rgb(0 0 0 / 0.06);
382
386
  --rs-ctx-danger: var(--rs-danger);
383
387
  --rs-ctx-item-active-bg: var(--rs-primary);
384
388
  --rs-ctx-item-active-fg: var(--rs-primary-foreground);
385
- --rs-ctx-item-active-muted: color-mix(in srgb, var(--rs-primary-foreground) 75%, transparent);
389
+ --rs-ctx-item-active-muted: color-mix(in srgb, var(--rs-primary-foreground) 78%, transparent);
386
390
 
387
391
  /* Popover(气泡卡片)。尺寸静态;颜色在主题块内。 */
388
392
  --rs-popover-pad: 0.75rem;
@@ -977,6 +981,7 @@ html {
977
981
  --rs-shadow-sm: 0 1px 3px rgb(0 0 0 / 0.4);
978
982
  --rs-shadow: 0 4px 16px rgb(0 0 0 / 0.45), 0 0 0 0.5px rgb(255 255 255 / 0.08);
979
983
  --rs-shadow-lg: 0 12px 32px rgb(0 0 0 / 0.5), 0 0 0 0.5px rgb(255 255 255 / 0.1);
984
+ --rs-ctx-shadow: 0 16px 40px rgb(0 0 0 / 0.46), 0 2px 8px rgb(0 0 0 / 0.28);
980
985
  }
981
986
 
982
987
  /* ── 公共亮色:无属性 = light,避免盖住后面的 dark(:root 与属性选择器同权)── */
@@ -1362,6 +1367,7 @@ html {
1362
1367
  --rs-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.04), 0 0 0 0.5px rgb(0 0 0 / 0.04);
1363
1368
  --rs-shadow: 0 4px 16px rgb(0 0 0 / 0.08), 0 0 0 0.5px rgb(0 0 0 / 0.06);
1364
1369
  --rs-shadow-lg: 0 12px 32px rgb(0 0 0 / 0.12), 0 0 0 0.5px rgb(0 0 0 / 0.08);
1370
+ --rs-ctx-shadow: 0 16px 40px rgb(0 0 0 / 0.12), 0 2px 8px rgb(0 0 0 / 0.06);
1365
1371
  }
1366
1372
 
1367
1373
  /**
@@ -1419,6 +1425,16 @@ html {
1419
1425
  --rs-shadow-sm: none;
1420
1426
  --rs-shadow: none;
1421
1427
  --rs-shadow-lg: none;
1428
+ --rs-ctx-bg: Canvas;
1429
+ --rs-ctx-fg: CanvasText;
1430
+ --rs-ctx-muted: GrayText;
1431
+ --rs-ctx-border: CanvasText;
1432
+ --rs-ctx-separator: CanvasText;
1433
+ --rs-ctx-shadow: none;
1434
+ --rs-ctx-danger: Mark;
1435
+ --rs-ctx-item-active-bg: Highlight;
1436
+ --rs-ctx-item-active-fg: HighlightText;
1437
+ --rs-ctx-item-active-muted: HighlightText;
1422
1438
  --rs-card-border: CanvasText;
1423
1439
  --rs-card-separator: CanvasText;
1424
1440
  --rs-card-header-bg: Canvas;
@@ -13,7 +13,7 @@ export declare function writeClipboardText(text: string): Promise<boolean>;
13
13
  export declare function copyTextWithExecCommand(text: string): boolean;
14
14
  /** HTTP / 非安全上下文没有 Clipboard API,writeText 会 SecurityError。 */
15
15
  export declare function isInsecureClipboardContext(): boolean;
16
- /** 写入系统剪贴板。HTTP 先同步 execCommand,避免 await 丢掉用户手势。 */
16
+ /** 写入系统剪贴板。先同步 execCommand,避免 await 丢掉点击手势;对话框里也要在这一拍写完。 */
17
17
  export declare function copyTextToClipboard(text: string): Promise<boolean>;
18
18
  /** @internal vitest 用 */
19
19
  export declare function __resetClipboardStateForTests(): void;