niuma-ui 2.0.9 → 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 (60) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/NOTICE +0 -1
  3. package/README.md +3 -3
  4. package/README.zh-CN.md +3 -3
  5. package/dist/components/auto-complete/src/RsAutoComplete.d.ts +2 -2
  6. package/dist/components/button/src/RsButton.css +75 -72
  7. package/dist/components/button/src/RsButton.d.ts +1 -4
  8. package/dist/components/button/src/RsButton.impl.js +2 -6
  9. package/dist/components/button/src/RsButton.js +1 -1
  10. package/dist/components/code-block/src/RsCodeBlock.css +26 -26
  11. package/dist/components/code-block/src/RsCodeBlock.impl.js +2 -2
  12. package/dist/components/code-block/src/RsCodeBlock.js +1 -1
  13. package/dist/components/config-provider/src/RsConfigProvider.css +1 -1
  14. package/dist/components/config-provider/src/RsConfigProvider.d.ts +2 -2
  15. package/dist/components/config-provider/src/RsConfigProvider.impl.js +7 -16
  16. package/dist/components/config-provider/src/RsConfigProvider.js +1 -1
  17. package/dist/components/context-menu/src/RsContextMenu.css +19 -19
  18. package/dist/components/date-picker/src/RsDatePicker.d.ts +2 -2
  19. package/dist/components/date-picker/src/RsDateTimePicker.d.ts +2 -2
  20. package/dist/components/dialog/src/RsConfirmDialog.css +25 -25
  21. package/dist/components/dialog/src/RsConfirmDialog.impl.js +4 -4
  22. package/dist/components/dialog/src/RsConfirmDialog.js +1 -1
  23. package/dist/components/dialog/src/RsDialog.css +63 -63
  24. package/dist/components/dialog/src/RsDialog.impl.js +56 -11
  25. package/dist/components/dialog/src/RsDialog.js +1 -1
  26. package/dist/components/dialog/src/dialog-window.d.ts +1 -0
  27. package/dist/components/dialog/src/dialog-window.js +1 -0
  28. package/dist/components/dynamic-tags/src/RsDynamicTags.d.ts +2 -2
  29. package/dist/components/icon/src/RsIcon.css +5 -5
  30. package/dist/components/icon/src/RsIcon.d.ts +1 -1
  31. package/dist/components/icon/src/RsIcon.impl.js +1 -1
  32. package/dist/components/icon/src/RsIcon.js +1 -1
  33. package/dist/components/input/src/RsInput.d.ts +2 -2
  34. package/dist/components/mentions/src/RsMentions.d.ts +2 -2
  35. package/dist/components/select/src/RsSelect.d.ts +2 -2
  36. package/dist/components/table/src/table-body/RsTableCell.impl.js +1 -1
  37. package/dist/components/table/style/rs-table.css +54 -10
  38. package/dist/components/tabs/src/RsTabs.d.ts +3 -3
  39. package/dist/components/tabs/src/RsTabs.impl.js +1 -1
  40. package/dist/components/textarea/src/RsTextarea.d.ts +2 -2
  41. package/dist/components/time-picker/src/RsTimePicker.d.ts +2 -2
  42. package/dist/components/toaster/src/RsToaster.d.ts +1 -1
  43. package/dist/components/tree/src/RsTree.css +74 -74
  44. package/dist/components/tree/src/RsTree.js +1 -1
  45. package/dist/components/tree-select/src/RsTreeSelect.d.ts +2 -2
  46. package/dist/icons/host.d.ts +11 -0
  47. package/dist/icons/host.js +30 -0
  48. package/dist/icons/lucide.js +10 -3
  49. package/dist/icons/registry.js +1 -1
  50. package/dist/index.d.ts +1 -0
  51. package/dist/index.js +1 -0
  52. package/dist/styles.css +34 -24
  53. package/dist/theme/brand.example.css +1 -1
  54. package/dist/utils/rs-clipboard.d.ts +1 -1
  55. package/dist/utils/rs-clipboard.js +17 -7
  56. package/dist/vite-plugins/niuma-ui-host.d.ts +2 -1
  57. package/dist/vite-plugins/niuma-ui-host.js +25 -6
  58. package/package.json +2 -4
  59. package/dist/components/_shared/src/reka.d.ts +0 -2
  60. package/dist/components/_shared/src/reka.js +0 -2
@@ -846,29 +846,41 @@
846
846
  touch-action: none;
847
847
  z-index: 2;
848
848
  }
849
- /* 默认与列 border 重合,不额外绘制;悬浮时高亮为可拖拽分隔线 */
849
+ /* 平时就画出列边,让人知道这里能拖;悬停改成主色 */
850
850
  .rs-table__resize-handle::after {
851
851
  content: '';
852
852
  position: absolute;
853
853
  top: 0;
854
854
  bottom: 0;
855
855
  left: 50%;
856
- width: 1px;
856
+ width: 2px;
857
857
  transform: translateX(-50%);
858
858
  border-radius: 0;
859
- background: transparent;
860
- opacity: 0;
861
- transition: opacity 0.12s ease, background 0.12s ease;
859
+ background: var(--rs-table-resize-handle);
860
+ opacity: 1;
861
+ transition: background 0.12s ease;
862
862
  }
863
863
  .rs-table__resize-handle:hover::after,
864
864
  .rs-table__resize-handle:active::after {
865
- opacity: 1;
866
865
  background: var(--rs-table-resize-handle-hover);
867
866
  }
868
- /* column-bordered:平时由单元格 border-inline-end 承担分隔线,悬浮时由 handle 接管高亮 */
869
- .rs-table--column-bordered .rs-table__th:has(> .rs-table__resize-handle:hover),
870
- .rs-table--column-bordered .rs-table__th:has(> .rs-table__resize-handle:active) {
871
- border-inline-end-color: transparent;
867
+ /* 已有列分隔线时不再另画 2px 拖拽线,避免表头粗线和表体细线错开。
868
+ 悬停只把这一条分隔线改成主色。最后一列没有分隔线,悬停才画出拖拽线。 */
869
+ .rs-table--column-bordered .rs-table__th:not(:last-child) > .rs-table__resize-handle::after,
870
+ .rs-table--column-bordered .rs-table__th:not(:last-child) > .rs-table__resize-handle:hover::after,
871
+ .rs-table--column-bordered .rs-table__th:not(:last-child) > .rs-table__resize-handle:active::after {
872
+ background: transparent;
873
+ }
874
+ .rs-table--column-bordered .rs-table__th:not(:last-child):has(> .rs-table__resize-handle:hover),
875
+ .rs-table--column-bordered .rs-table__th:not(:last-child):has(> .rs-table__resize-handle:active) {
876
+ border-inline-end-color: var(--rs-table-resize-handle-hover);
877
+ }
878
+ .rs-table--column-bordered .rs-table__th:last-child > .rs-table__resize-handle::after {
879
+ background: transparent;
880
+ }
881
+ .rs-table--column-bordered .rs-table__th:last-child > .rs-table__resize-handle:hover::after,
882
+ .rs-table--column-bordered .rs-table__th:last-child > .rs-table__resize-handle:active::after {
883
+ background: var(--rs-table-resize-handle-hover);
872
884
  }
873
885
  /* 滚动条交汇角与容器底色一致 */
874
886
  .rs-table.rs-native-scrollbar:has(.rs-table__head)::-webkit-scrollbar-corner {
@@ -1234,7 +1246,39 @@
1234
1246
  pointer-events: none;
1235
1247
  }
1236
1248
  .rs-table-cell-editor--custom {
1249
+ display: flex;
1250
+ align-items: stretch;
1251
+ width: 100%;
1252
+ height: 100%;
1253
+ min-width: 0;
1254
+ min-height: 0;
1255
+ }
1256
+ /* 插槽里的原生输入跟内置编辑器一样贴合格子,不再另画一圈边框 */
1257
+ .rs-table-cell-editor--custom > :where(input, textarea, select) {
1258
+ flex: 1 1 auto;
1237
1259
  width: 100%;
1238
1260
  height: 100%;
1239
1261
  min-width: 0;
1262
+ margin: 0;
1263
+ padding: var(--rs-space-sm) var(--rs-space-md);
1264
+ border: 0;
1265
+ border-radius: 0;
1266
+ outline: none;
1267
+ background: transparent;
1268
+ box-shadow: none;
1269
+ color: inherit;
1270
+ font: inherit;
1271
+ line-height: inherit;
1272
+ appearance: none;
1273
+ }
1274
+ .rs-table-cell-editor--custom > :where(input, textarea, select):focus {
1275
+ outline: none;
1276
+ box-shadow: none;
1277
+ }
1278
+ .rs-table--compact .rs-table-cell-editor--custom > :where(input, textarea, select),
1279
+ .rs-table--sm .rs-table-cell-editor--custom > :where(input, textarea, select) {
1280
+ padding: var(--rs-space-xs) var(--rs-space-sm);
1281
+ }
1282
+ .rs-table--lg .rs-table-cell-editor--custom > :where(input, textarea, select) {
1283
+ padding: var(--rs-space-md) var(--rs-space-lg);
1240
1284
  }
@@ -35,7 +35,7 @@ type __VLS_Props = {
35
35
  renamable?: boolean;
36
36
  /** 按住标签拖动排序(整项可拖) */
37
37
  draggable?: boolean;
38
- /** 可拖时是否画左侧六点 grip。false 仍可整项拖,只是不显示图标。 */
38
+ /** 可拖时是否画左侧六点 grip。默认不画,整项仍可拖。 */
39
39
  showDragHandle?: boolean;
40
40
  /** 标签过多:scroll 横向/纵向滚动 · dropdown 折叠到「更多」 */
41
41
  overflow?: RsTabsOverflow | false;
@@ -77,8 +77,8 @@ type __VLS_Slots = {} & {
77
77
  };
78
78
  declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, RsTabsExpose, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
79
79
  change: (value: string) => any;
80
- close: (value: string) => any;
81
80
  add: () => any;
81
+ close: (value: string) => any;
82
82
  "update:modelValue": (value: string) => any;
83
83
  contextMenu: (action: RsTabsCloseAction, value: string) => any;
84
84
  closeBatch: (values: string[], action: RsTabsCloseAction, anchor?: string | undefined) => any;
@@ -86,8 +86,8 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, RsTab
86
86
  reorder: (dragValue: string, dropValue: string) => any;
87
87
  }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
88
88
  onChange?: ((value: string) => any) | undefined;
89
- onClose?: ((value: string) => any) | undefined;
90
89
  onAdd?: (() => any) | undefined;
90
+ onClose?: ((value: string) => any) | undefined;
91
91
  "onUpdate:modelValue"?: ((value: string) => any) | undefined;
92
92
  onContextMenu?: ((action: RsTabsCloseAction, value: string) => any) | undefined;
93
93
  onCloseBatch?: ((values: string[], action: RsTabsCloseAction, anchor?: string | undefined) => any) | undefined;
@@ -106,7 +106,7 @@ var RsTabs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
106
106
  },
107
107
  showDragHandle: {
108
108
  type: Boolean,
109
- default: true
109
+ default: false
110
110
  },
111
111
  overflow: {
112
112
  type: [String, Boolean],
@@ -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;
@@ -30,10 +30,10 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {
30
30
  /** 供模板 ref 关闭。业务侧通常用 useRsToast().dismiss。 */
31
31
  dismiss: (id?: string) => void;
32
32
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
33
- teleportTo: string | HTMLElement;
34
33
  gap: number;
35
34
  expand: boolean;
36
35
  position: RsToastPosition;
36
+ teleportTo: string | HTMLElement;
37
37
  toasterId: string;
38
38
  duration: number;
39
39
  closeButton: boolean;
@@ -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;