@manohub/ui 0.6.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 (169) hide show
  1. package/README.md +141 -0
  2. package/dist/components/avatar/index.d.ts +283 -0
  3. package/dist/components/avatar/index.js +167 -0
  4. package/dist/components/badge/index.d.ts +132 -0
  5. package/dist/components/badge/index.js +99 -0
  6. package/dist/components/button/index.d.ts +578 -0
  7. package/dist/components/button/index.js +191 -0
  8. package/dist/components/capsule/index.d.ts +161 -0
  9. package/dist/components/capsule/index.js +101 -0
  10. package/dist/components/card/index.d.ts +456 -0
  11. package/dist/components/card/index.js +231 -0
  12. package/dist/components/checkbox/index.d.ts +331 -0
  13. package/dist/components/checkbox/index.js +165 -0
  14. package/dist/components/code/index.d.ts +134 -0
  15. package/dist/components/code/index.js +117 -0
  16. package/dist/components/code-editor/index.d.ts +163 -0
  17. package/dist/components/code-editor/index.js +98 -0
  18. package/dist/components/collapse/index.d.ts +125 -0
  19. package/dist/components/collapse/index.js +95 -0
  20. package/dist/components/control-size.d.ts +8 -0
  21. package/dist/components/dialog/index.d.ts +224 -0
  22. package/dist/components/dialog/index.js +194 -0
  23. package/dist/components/divider/index.d.ts +64 -0
  24. package/dist/components/divider/index.js +62 -0
  25. package/dist/components/drawer/index.d.ts +226 -0
  26. package/dist/components/drawer/index.js +190 -0
  27. package/dist/components/filter/index.d.ts +391 -0
  28. package/dist/components/filter/index.js +203 -0
  29. package/dist/components/form/index.d.ts +704 -0
  30. package/dist/components/form/index.js +329 -0
  31. package/dist/components/input/index.d.ts +980 -0
  32. package/dist/components/input/index.js +334 -0
  33. package/dist/components/layout/index.d.ts +162 -0
  34. package/dist/components/layout/index.js +100 -0
  35. package/dist/components/list-view/index.d.ts +563 -0
  36. package/dist/components/list-view/index.js +221 -0
  37. package/dist/components/loading/index.d.ts +77 -0
  38. package/dist/components/loading/index.js +40 -0
  39. package/dist/components/nav/index.d.ts +293 -0
  40. package/dist/components/nav/index.js +164 -0
  41. package/dist/components/notice/index.d.ts +137 -0
  42. package/dist/components/notice/index.js +101 -0
  43. package/dist/components/notification/index.d.ts +118 -0
  44. package/dist/components/notification/index.js +99 -0
  45. package/dist/components/page/index.d.ts +276 -0
  46. package/dist/components/page/index.js +351 -0
  47. package/dist/components/page/split-resize.d.ts +42 -0
  48. package/dist/components/page/split-resize.js +36 -0
  49. package/dist/components/pagination/index.d.ts +171 -0
  50. package/dist/components/pagination/index.js +226 -0
  51. package/dist/components/panel/index.d.ts +401 -0
  52. package/dist/components/panel/index.js +193 -0
  53. package/dist/components/part-padding.d.ts +27 -0
  54. package/dist/components/part-padding.js +23 -0
  55. package/dist/components/query-state/index.d.ts +207 -0
  56. package/dist/components/query-state/index.js +181 -0
  57. package/dist/components/radio/index.d.ts +473 -0
  58. package/dist/components/radio/index.js +250 -0
  59. package/dist/components/search/index.d.ts +167 -0
  60. package/dist/components/search/index.js +105 -0
  61. package/dist/components/select/index.d.ts +252 -0
  62. package/dist/components/select/index.js +281 -0
  63. package/dist/components/skeleton/index.d.ts +88 -0
  64. package/dist/components/skeleton/index.js +56 -0
  65. package/dist/components/steps/index.d.ts +199 -0
  66. package/dist/components/steps/index.js +117 -0
  67. package/dist/components/switch/index.d.ts +150 -0
  68. package/dist/components/switch/index.js +103 -0
  69. package/dist/components/table/index.d.ts +351 -0
  70. package/dist/components/table/index.js +286 -0
  71. package/dist/components/tabs/index.d.ts +179 -0
  72. package/dist/components/tabs/index.js +153 -0
  73. package/dist/components/tabset/index.d.ts +105 -0
  74. package/dist/components/tabset/index.js +68 -0
  75. package/dist/components/tag/index.d.ts +203 -0
  76. package/dist/components/tag/index.js +144 -0
  77. package/dist/components/toast/index.d.ts +271 -0
  78. package/dist/components/toast/index.js +116 -0
  79. package/dist/components/tooltip/index.d.ts +126 -0
  80. package/dist/components/tooltip/index.js +97 -0
  81. package/dist/components/tree/index.d.ts +317 -0
  82. package/dist/components/tree/index.js +251 -0
  83. package/dist/components/upload/index.d.ts +384 -0
  84. package/dist/components/upload/index.js +172 -0
  85. package/dist/index.d.ts +63 -0
  86. package/dist/index.js +102 -0
  87. package/dist/services/base.d.ts +21 -0
  88. package/dist/services/base.js +42 -0
  89. package/dist/services/dialog.d.ts +41 -0
  90. package/dist/services/dialog.js +83 -0
  91. package/dist/services/index.d.ts +12 -0
  92. package/dist/services/loading.d.ts +21 -0
  93. package/dist/services/loading.js +41 -0
  94. package/dist/services/toast.d.ts +40 -0
  95. package/dist/services/toast.js +74 -0
  96. package/dist/styles/components/avatar.css +128 -0
  97. package/dist/styles/components/avatar.tokens.css +24 -0
  98. package/dist/styles/components/badge.css +237 -0
  99. package/dist/styles/components/button.css +454 -0
  100. package/dist/styles/components/button.tokens.css +56 -0
  101. package/dist/styles/components/capsule.css +120 -0
  102. package/dist/styles/components/capsule.tokens.css +27 -0
  103. package/dist/styles/components/card.css +192 -0
  104. package/dist/styles/components/checkbox.css +145 -0
  105. package/dist/styles/components/checkbox.tokens.css +26 -0
  106. package/dist/styles/components/code-editor.css +91 -0
  107. package/dist/styles/components/code-editor.tokens.css +24 -0
  108. package/dist/styles/components/code.css +153 -0
  109. package/dist/styles/components/code.tokens.css +29 -0
  110. package/dist/styles/components/collapse.css +62 -0
  111. package/dist/styles/components/collapse.tokens.css +20 -0
  112. package/dist/styles/components/dialog.css +106 -0
  113. package/dist/styles/components/dialog.tokens.css +24 -0
  114. package/dist/styles/components/divider.css +71 -0
  115. package/dist/styles/components/divider.tokens.css +21 -0
  116. package/dist/styles/components/drawer.css +143 -0
  117. package/dist/styles/components/drawer.tokens.css +22 -0
  118. package/dist/styles/components/filter.css +41 -0
  119. package/dist/styles/components/filter.tokens.css +14 -0
  120. package/dist/styles/components/form.css +220 -0
  121. package/dist/styles/components/form.tokens.css +15 -0
  122. package/dist/styles/components/input.css +445 -0
  123. package/dist/styles/components/input.tokens.css +41 -0
  124. package/dist/styles/components/layout.css +198 -0
  125. package/dist/styles/components/list-view.css +244 -0
  126. package/dist/styles/components/loading.css +76 -0
  127. package/dist/styles/components/loading.tokens.css +23 -0
  128. package/dist/styles/components/nav.css +48 -0
  129. package/dist/styles/components/notice.css +153 -0
  130. package/dist/styles/components/notice.tokens.css +17 -0
  131. package/dist/styles/components/notification.css +159 -0
  132. package/dist/styles/components/notification.tokens.css +37 -0
  133. package/dist/styles/components/page.css +473 -0
  134. package/dist/styles/components/pagination.css +297 -0
  135. package/dist/styles/components/pagination.tokens.css +32 -0
  136. package/dist/styles/components/panel.css +77 -0
  137. package/dist/styles/components/query-state.css +88 -0
  138. package/dist/styles/components/radio.css +271 -0
  139. package/dist/styles/components/radio.tokens.css +26 -0
  140. package/dist/styles/components/search.css +30 -0
  141. package/dist/styles/components/select.css +242 -0
  142. package/dist/styles/components/select.tokens.css +33 -0
  143. package/dist/styles/components/skeleton.css +60 -0
  144. package/dist/styles/components/skeleton.tokens.css +27 -0
  145. package/dist/styles/components/steps.css +157 -0
  146. package/dist/styles/components/steps.tokens.css +42 -0
  147. package/dist/styles/components/switch.css +165 -0
  148. package/dist/styles/components/switch.tokens.css +26 -0
  149. package/dist/styles/components/table.css +439 -0
  150. package/dist/styles/components/table.tokens.css +41 -0
  151. package/dist/styles/components/tabs.css +234 -0
  152. package/dist/styles/components/tabs.tokens.css +30 -0
  153. package/dist/styles/components/tag.css +200 -0
  154. package/dist/styles/components/tag.tokens.css +30 -0
  155. package/dist/styles/components/toast.css +150 -0
  156. package/dist/styles/components/toast.tokens.css +26 -0
  157. package/dist/styles/components/tooltip.css +89 -0
  158. package/dist/styles/components/tooltip.tokens.css +25 -0
  159. package/dist/styles/components/tree.css +139 -0
  160. package/dist/styles/components/tree.tokens.css +20 -0
  161. package/dist/styles/components/upload.css +150 -0
  162. package/dist/styles/components/upload.tokens.css +27 -0
  163. package/dist/styles/index.css +149 -0
  164. package/dist/styles/operations/collapse.css +84 -0
  165. package/dist/styles/operations/popup.css +189 -0
  166. package/dist/styles/operations/tabset.css +57 -0
  167. package/dist/utils/state-illustration.d.ts +31 -0
  168. package/dist/utils/state-illustration.js +156 -0
  169. package/package.json +62 -0
@@ -0,0 +1,250 @@
1
+ import { defineComponent, createVNode, ref, computed } from "vue";
2
+ const Radio = /* @__PURE__ */ defineComponent({
3
+ name: "Radio",
4
+ inheritAttrs: false,
5
+ props: {
6
+ value: {
7
+ type: [String, Number],
8
+ required: true
9
+ },
10
+ label: {
11
+ type: String,
12
+ default: void 0
13
+ },
14
+ name: {
15
+ type: String,
16
+ default: void 0
17
+ },
18
+ checked: {
19
+ type: Boolean,
20
+ default: void 0
21
+ },
22
+ disabled: {
23
+ type: Boolean,
24
+ default: false
25
+ },
26
+ size: {
27
+ type: String,
28
+ default: "md"
29
+ },
30
+ /** 自动聚焦 */
31
+ autofocus: {
32
+ type: Boolean,
33
+ default: false
34
+ },
35
+ onChange: {
36
+ type: Function,
37
+ default: void 0
38
+ }
39
+ },
40
+ slots: Object,
41
+ setup(props, {
42
+ slots,
43
+ attrs
44
+ }) {
45
+ return () => createVNode("label", {
46
+ "class": ["mh-radio", props.size === "md" ? "" : `mh-radio--${props.size}`, props.disabled ? "is-disabled" : void 0, attrs.class].filter(Boolean).join(" "),
47
+ "style": attrs.style
48
+ }, [createVNode("input", {
49
+ "class": "mh-radio__input",
50
+ "type": "radio",
51
+ "name": props.name,
52
+ "value": props.value,
53
+ "checked": props.checked,
54
+ "disabled": props.disabled,
55
+ "autofocus": props.autofocus,
56
+ "onChange": () => props.onChange?.(props.value)
57
+ }, null), createVNode("span", {
58
+ "class": "mh-radio__box",
59
+ "data-state": props.checked ? "checked" : "unchecked"
60
+ }, null), createVNode("span", {
61
+ "class": "mh-radio__label"
62
+ }, [slots.default ? slots.default() : props.label])]);
63
+ }
64
+ });
65
+ function useGroupValue(props, firstSelectable, isBlocked, report) {
66
+ const inner = ref(props.defaultValue);
67
+ const current = computed(() => props.modelValue ?? inner.value ?? firstSelectable());
68
+ const select = (value) => {
69
+ if (isBlocked(value)) return;
70
+ if (props.modelValue === void 0) inner.value = value;
71
+ report(value);
72
+ };
73
+ return {
74
+ current,
75
+ select
76
+ };
77
+ }
78
+ const RadioGroup = /* @__PURE__ */ defineComponent({
79
+ name: "RadioGroup",
80
+ inheritAttrs: false,
81
+ props: {
82
+ options: {
83
+ type: Array,
84
+ default: void 0
85
+ },
86
+ modelValue: {
87
+ type: [String, Number],
88
+ default: void 0
89
+ },
90
+ defaultValue: {
91
+ type: [String, Number],
92
+ default: void 0
93
+ },
94
+ name: {
95
+ type: String,
96
+ default: void 0
97
+ },
98
+ vertical: {
99
+ type: Boolean,
100
+ default: false
101
+ },
102
+ disabled: {
103
+ type: Boolean,
104
+ default: false
105
+ },
106
+ size: {
107
+ type: String,
108
+ default: "md"
109
+ },
110
+ onChange: {
111
+ type: Function,
112
+ default: void 0
113
+ }
114
+ },
115
+ emits: {
116
+ "update:modelValue": (value) => true
117
+ },
118
+ slots: Object,
119
+ setup(props, {
120
+ emit,
121
+ slots,
122
+ attrs
123
+ }) {
124
+ const fallbackName = `mh-radio-${Math.random().toString(36).slice(2, 10)}`;
125
+ const {
126
+ current,
127
+ select
128
+ } = useGroupValue(
129
+ props,
130
+ // 缺省值:第一个**可选项**(跳过禁用项)
131
+ () => props.options?.find((option) => !option.disabled)?.value,
132
+ (value) => props.disabled || !!props.options?.find((option) => option.value === value)?.disabled,
133
+ (value) => {
134
+ emit("update:modelValue", value);
135
+ props.onChange?.(value);
136
+ }
137
+ );
138
+ return () => createVNode("div", {
139
+ "class": ["mh-radio-group", props.vertical ? "mh-radio-group--vertical" : void 0, attrs.class].filter(Boolean).join(" "),
140
+ "style": attrs.style
141
+ }, [slots.default ? slots.default({
142
+ value: current.value,
143
+ select
144
+ }) : props.options?.map((option) => createVNode(Radio, {
145
+ "key": String(option.value),
146
+ "name": props.name ?? fallbackName,
147
+ "value": option.value,
148
+ "label": option.label,
149
+ "checked": option.value === current.value,
150
+ "disabled": props.disabled || option.disabled,
151
+ "size": props.size,
152
+ "onChange": select
153
+ }, null))]);
154
+ }
155
+ });
156
+ const RadioCard = /* @__PURE__ */ defineComponent({
157
+ name: "RadioCard",
158
+ inheritAttrs: false,
159
+ props: {
160
+ modelValue: {
161
+ type: [String, Number],
162
+ default: void 0
163
+ },
164
+ defaultValue: {
165
+ type: [String, Number],
166
+ default: void 0
167
+ },
168
+ items: {
169
+ type: Array,
170
+ default: () => []
171
+ },
172
+ /** 每行几个(>1 时走等宽网格;缺省 1 列堆叠) */
173
+ columns: {
174
+ type: Number,
175
+ default: 1
176
+ },
177
+ /** 整组禁用(与单项 `disabled` 叠加) */
178
+ disabled: {
179
+ type: Boolean,
180
+ default: false
181
+ },
182
+ onChange: {
183
+ type: Function,
184
+ default: void 0
185
+ }
186
+ },
187
+ emits: {
188
+ "update:modelValue": (value) => true
189
+ },
190
+ setup(props, {
191
+ emit,
192
+ attrs
193
+ }) {
194
+ const groupName = `mh-radio-card-${Math.random().toString(36).slice(2, 10)}`;
195
+ const {
196
+ current,
197
+ select
198
+ } = useGroupValue(
199
+ props,
200
+ // 缺省值:第一个**可选项**(跳过禁用项)
201
+ () => props.items.find((item) => !item.disabled)?.value,
202
+ (value) => props.disabled || !!props.items.find((item) => item.value === value)?.disabled,
203
+ (value) => {
204
+ emit("update:modelValue", value);
205
+ props.onChange?.(value);
206
+ }
207
+ );
208
+ return () => createVNode("div", {
209
+ "class": ["mh-radio-card", props.columns > 1 ? "mh-radio-card--grid" : "", attrs.class].filter(Boolean).join(" "),
210
+ "style": props.columns > 1 ? {
211
+ ...attrs.style,
212
+ "--ui-radio-card-columns": String(props.columns)
213
+ } : attrs.style,
214
+ "role": "radiogroup"
215
+ }, [props.items.map((item) => {
216
+ const isDisabled = props.disabled || !!item.disabled;
217
+ const isChecked = current.value === item.value;
218
+ return createVNode("label", {
219
+ "class": "mh-radio-card__item",
220
+ "key": String(item.value),
221
+ "data-state": isChecked ? "checked" : "unchecked",
222
+ "data-disabled": isDisabled ? "true" : "false"
223
+ }, [createVNode("input", {
224
+ "class": "mh-radio-card__input",
225
+ "type": "radio",
226
+ "name": groupName,
227
+ "value": String(item.value),
228
+ "checked": isChecked,
229
+ "disabled": isDisabled,
230
+ "onChange": () => select(item.value)
231
+ }, null), createVNode("span", {
232
+ "class": "mh-radio-card__radio",
233
+ "aria-hidden": "true"
234
+ }, null), createVNode("span", {
235
+ "class": "mh-radio-card__body"
236
+ }, [createVNode("span", {
237
+ "class": "mh-radio-card__label"
238
+ }, [item.label]), item.description ? createVNode("span", {
239
+ "class": "mh-radio-card__desc"
240
+ }, [item.description]) : null])]);
241
+ })]);
242
+ }
243
+ });
244
+ Object.assign(Radio, {
245
+ Group: RadioGroup,
246
+ Card: RadioCard
247
+ });
248
+ export {
249
+ Radio
250
+ };
@@ -0,0 +1,167 @@
1
+ import { type PropType } from 'vue';
2
+ import type { ControlSize } from '../control-size';
3
+ export interface SearchProps {
4
+ /** 受控值 */
5
+ modelValue?: string;
6
+ /** 非受控初始值 */
7
+ defaultValue?: string;
8
+ /** 占位文案(缺省「请输入关键字」) */
9
+ placeholder?: string;
10
+ /** 尺寸档(输入框与按钮同档,不会出现一高一矮) */
11
+ size?: ControlSize;
12
+ disabled?: boolean;
13
+ /** 有内容时显示清除位(缺省开) */
14
+ clearable?: boolean;
15
+ /** 搜索中:按钮进加载态并吞掉重复点击 */
16
+ loading?: boolean;
17
+ /** 搜索按钮文案;**不传即纯图标按钮**(窄工具条里的形态) */
18
+ searchText?: string;
19
+ /** 值变更回调(每次输入都调,含清空) */
20
+ onChange?: (value: string) => void;
21
+ /** 搜索触发(点搜索按钮 / 输入框内回车) */
22
+ onSearch?: (value: string) => void;
23
+ /** 清空回调(**由非空变空**时补发一次,值变化由 `onChange` 走) */
24
+ onClear?: () => void;
25
+ }
26
+ /**
27
+ * 搜索框(**自绘**;输入框 + 搜索触发位的组合件)。
28
+ *
29
+ * ## 为什么不是 `Input` 的一个档,而是单独一件
30
+ *
31
+ * 搜索语义有两件 `Input` 不该背的事:
32
+ * ① **触发是显式的**(回车与点按钮都算一次「搜索」,与「值变了」不是同一件事)——
33
+ * 调用方要的是「提交时查一次」,而不是「每敲一个字查一次」;
34
+ * ② **清空是一个独立事件**(由非空变空时补发 `onClear`)——这是上游控件长期的坑
35
+ * (清空只改值、不发触发),每处调用都自己写 watch 兜底。
36
+ * 本件把这两条收进一处:`onChange` 管值、`onSearch` / `onClear` 管动作。
37
+ *
38
+ * ## 复用而不是重画
39
+ *
40
+ * 输入框那一段**就是本包的 `Input`**(框、内距、清除位、聚焦态、禁用态、`aria-invalid`
41
+ * 全部沿用输入框面),本件只加「一行里怎么摆」与搜索按钮 —— 不另写一份输入框几何
42
+ * (两份几何必然在改令牌时漂开)。
43
+ *
44
+ * ## 受控口径(与全库同款)
45
+ *
46
+ * 传 `modelValue` 即受控(`update:modelValue` 与 `onChange` 双走),不传即非受控(由 `defaultValue` 起)。
47
+ *
48
+ * @example 最简(图标按钮)
49
+ * <Search modelValue={kw} onChange={setKw} onSearch={apply} />
50
+ *
51
+ * @example 带文案的搜索按钮 + 清空动作
52
+ * <Search
53
+ * modelValue={kw}
54
+ * placeholder="搜索技能名称"
55
+ * search-text="搜索"
56
+ * onChange={setKw}
57
+ * onSearch={apply}
58
+ * onClear={() => apply('')}
59
+ * />
60
+ */
61
+ export declare const Search: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
62
+ modelValue: {
63
+ type: StringConstructor;
64
+ default: undefined;
65
+ };
66
+ defaultValue: {
67
+ type: StringConstructor;
68
+ default: string;
69
+ };
70
+ placeholder: {
71
+ type: StringConstructor;
72
+ default: string;
73
+ };
74
+ size: {
75
+ type: PropType<ControlSize>;
76
+ default: string;
77
+ };
78
+ disabled: {
79
+ type: BooleanConstructor;
80
+ default: boolean;
81
+ };
82
+ clearable: {
83
+ type: BooleanConstructor;
84
+ default: boolean;
85
+ };
86
+ loading: {
87
+ type: BooleanConstructor;
88
+ default: boolean;
89
+ };
90
+ searchText: {
91
+ type: StringConstructor;
92
+ default: undefined;
93
+ };
94
+ onChange: {
95
+ type: PropType<(value: string) => void>;
96
+ default: undefined;
97
+ };
98
+ onSearch: {
99
+ type: PropType<(value: string) => void>;
100
+ default: undefined;
101
+ };
102
+ onClear: {
103
+ type: PropType<() => void>;
104
+ default: undefined;
105
+ };
106
+ }>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
107
+ 'update:modelValue': (value: string) => true;
108
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
109
+ modelValue: {
110
+ type: StringConstructor;
111
+ default: undefined;
112
+ };
113
+ defaultValue: {
114
+ type: StringConstructor;
115
+ default: string;
116
+ };
117
+ placeholder: {
118
+ type: StringConstructor;
119
+ default: string;
120
+ };
121
+ size: {
122
+ type: PropType<ControlSize>;
123
+ default: string;
124
+ };
125
+ disabled: {
126
+ type: BooleanConstructor;
127
+ default: boolean;
128
+ };
129
+ clearable: {
130
+ type: BooleanConstructor;
131
+ default: boolean;
132
+ };
133
+ loading: {
134
+ type: BooleanConstructor;
135
+ default: boolean;
136
+ };
137
+ searchText: {
138
+ type: StringConstructor;
139
+ default: undefined;
140
+ };
141
+ onChange: {
142
+ type: PropType<(value: string) => void>;
143
+ default: undefined;
144
+ };
145
+ onSearch: {
146
+ type: PropType<(value: string) => void>;
147
+ default: undefined;
148
+ };
149
+ onClear: {
150
+ type: PropType<() => void>;
151
+ default: undefined;
152
+ };
153
+ }>> & Readonly<{
154
+ "onUpdate:modelValue"?: ((value: string) => any) | undefined;
155
+ }>, {
156
+ size: ControlSize;
157
+ disabled: boolean;
158
+ onChange: (value: string) => void;
159
+ loading: boolean;
160
+ defaultValue: string;
161
+ placeholder: string;
162
+ modelValue: string;
163
+ clearable: boolean;
164
+ searchText: string;
165
+ onSearch: (value: string) => void;
166
+ onClear: () => void;
167
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -0,0 +1,105 @@
1
+ import { defineComponent, ref, computed, createVNode } from "vue";
2
+ import { Icon } from "@manohub/icon";
3
+ import { Button } from "../button/index.js";
4
+ import { Input } from "../input/index.js";
5
+ const Search = /* @__PURE__ */ defineComponent({
6
+ name: "Search",
7
+ inheritAttrs: false,
8
+ props: {
9
+ modelValue: {
10
+ type: String,
11
+ default: void 0
12
+ },
13
+ defaultValue: {
14
+ type: String,
15
+ default: ""
16
+ },
17
+ placeholder: {
18
+ type: String,
19
+ default: "请输入关键字"
20
+ },
21
+ size: {
22
+ type: String,
23
+ default: "md"
24
+ },
25
+ disabled: {
26
+ type: Boolean,
27
+ default: false
28
+ },
29
+ clearable: {
30
+ type: Boolean,
31
+ default: true
32
+ },
33
+ loading: {
34
+ type: Boolean,
35
+ default: false
36
+ },
37
+ searchText: {
38
+ type: String,
39
+ default: void 0
40
+ },
41
+ onChange: {
42
+ type: Function,
43
+ default: void 0
44
+ },
45
+ onSearch: {
46
+ type: Function,
47
+ default: void 0
48
+ },
49
+ onClear: {
50
+ type: Function,
51
+ default: void 0
52
+ }
53
+ },
54
+ emits: {
55
+ "update:modelValue": (value) => true
56
+ },
57
+ setup(props, {
58
+ emit,
59
+ attrs
60
+ }) {
61
+ const inner = ref(props.defaultValue);
62
+ const current = computed(() => props.modelValue ?? inner.value);
63
+ const commit = (value) => {
64
+ const next = value ?? "";
65
+ const cleared = next === "" && current.value !== "";
66
+ if (props.modelValue === void 0) inner.value = next;
67
+ emit("update:modelValue", next);
68
+ props.onChange?.(next);
69
+ if (cleared) props.onClear?.();
70
+ };
71
+ const search = () => props.onSearch?.(current.value ?? "");
72
+ return () => createVNode("div", {
73
+ "class": ["mh-search", attrs.class].filter(Boolean).join(" "),
74
+ "style": attrs.style
75
+ }, [createVNode(Input, {
76
+ "class": "mh-search__input",
77
+ "modelValue": current.value,
78
+ "size": props.size,
79
+ "disabled": props.disabled,
80
+ "placeholder": props.placeholder,
81
+ "clearable": props.clearable,
82
+ "onChange": commit,
83
+ "onEnter": search
84
+ }, {
85
+ prefix: () => createVNode(Icon, {
86
+ "name": "search"
87
+ }, null)
88
+ }), createVNode(Button, {
89
+ "class": "mh-search__btn",
90
+ "variant": props.searchText ? "primary" : "icon",
91
+ "size": props.size,
92
+ "icon": "search",
93
+ "disabled": props.disabled,
94
+ "loading": props.loading,
95
+ "title": props.searchText ? void 0 : "搜索",
96
+ "aria-label": props.searchText ? void 0 : "搜索",
97
+ "onClick": search
98
+ }, {
99
+ default: () => props.searchText
100
+ })]);
101
+ }
102
+ });
103
+ export {
104
+ Search
105
+ };