cisse-vue-ui 0.1.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 (96) hide show
  1. package/README.md +15 -0
  2. package/dist/BadgeType.vue_vue_type_script_setup_true_lang-CJb63H1I.cjs +145 -0
  3. package/dist/BadgeType.vue_vue_type_script_setup_true_lang-CJb63H1I.cjs.map +1 -0
  4. package/dist/BadgeType.vue_vue_type_script_setup_true_lang-CnB5eNEM.js +146 -0
  5. package/dist/BadgeType.vue_vue_type_script_setup_true_lang-CnB5eNEM.js.map +1 -0
  6. package/dist/NotificationList.vue_vue_type_script_setup_true_lang-B2hjbMm4.js +351 -0
  7. package/dist/NotificationList.vue_vue_type_script_setup_true_lang-B2hjbMm4.js.map +1 -0
  8. package/dist/NotificationList.vue_vue_type_script_setup_true_lang-Ci3zIvrv.cjs +350 -0
  9. package/dist/NotificationList.vue_vue_type_script_setup_true_lang-Ci3zIvrv.cjs.map +1 -0
  10. package/dist/SearchInput.vue_vue_type_script_setup_true_lang-Be73hShP.cjs +234 -0
  11. package/dist/SearchInput.vue_vue_type_script_setup_true_lang-Be73hShP.cjs.map +1 -0
  12. package/dist/SearchInput.vue_vue_type_script_setup_true_lang-DjT2qdcp.js +235 -0
  13. package/dist/SearchInput.vue_vue_type_script_setup_true_lang-DjT2qdcp.js.map +1 -0
  14. package/dist/TableAction.vue_vue_type_script_setup_true_lang-BHskhVhK.js +540 -0
  15. package/dist/TableAction.vue_vue_type_script_setup_true_lang-BHskhVhK.js.map +1 -0
  16. package/dist/TableAction.vue_vue_type_script_setup_true_lang-CojbKn7E.cjs +539 -0
  17. package/dist/TableAction.vue_vue_type_script_setup_true_lang-CojbKn7E.cjs.map +1 -0
  18. package/dist/components/core/AutocompleteComponent.vue.d.ts +19 -0
  19. package/dist/components/core/CardComponent.vue.d.ts +24 -0
  20. package/dist/components/core/MenuItem.vue.d.ts +6 -0
  21. package/dist/components/core/StatusBadge.vue.d.ts +21 -0
  22. package/dist/components/core/TableAction.vue.d.ts +8 -0
  23. package/dist/components/core/TableComponent.vue.d.ts +40 -0
  24. package/dist/components/core/index.cjs +11 -0
  25. package/dist/components/core/index.cjs.map +1 -0
  26. package/dist/components/core/index.d.ts +6 -0
  27. package/dist/components/core/index.js +11 -0
  28. package/dist/components/core/index.js.map +1 -0
  29. package/dist/components/feedback/LoadingSpinner.vue.d.ts +7 -0
  30. package/dist/components/feedback/Modal.vue.d.ts +32 -0
  31. package/dist/components/feedback/NotificationComponent.vue.d.ts +12 -0
  32. package/dist/components/feedback/NotificationList.vue.d.ts +12 -0
  33. package/dist/components/feedback/PaginationControls.vue.d.ts +21 -0
  34. package/dist/components/feedback/index.cjs +9 -0
  35. package/dist/components/feedback/index.cjs.map +1 -0
  36. package/dist/components/feedback/index.d.ts +5 -0
  37. package/dist/components/feedback/index.js +9 -0
  38. package/dist/components/feedback/index.js.map +1 -0
  39. package/dist/components/form/FormGroup.vue.d.ts +30 -0
  40. package/dist/components/form/FormHelp.vue.d.ts +21 -0
  41. package/dist/components/form/FormInput.vue.d.ts +13 -0
  42. package/dist/components/form/FormLabel.vue.d.ts +21 -0
  43. package/dist/components/form/FormSelect.vue.d.ts +26 -0
  44. package/dist/components/form/SearchInput.vue.d.ts +12 -0
  45. package/dist/components/form/index.cjs +10 -0
  46. package/dist/components/form/index.cjs.map +1 -0
  47. package/dist/components/form/index.d.ts +6 -0
  48. package/dist/components/form/index.js +10 -0
  49. package/dist/components/form/index.js.map +1 -0
  50. package/dist/components/index.cjs +29 -0
  51. package/dist/components/index.cjs.map +1 -0
  52. package/dist/components/index.d.ts +4 -0
  53. package/dist/components/index.js +29 -0
  54. package/dist/components/index.js.map +1 -0
  55. package/dist/components/type/BadgeType.vue.d.ts +11 -0
  56. package/dist/components/type/BooleanType.vue.d.ts +11 -0
  57. package/dist/components/type/DateType.vue.d.ts +10 -0
  58. package/dist/components/type/NumberType.vue.d.ts +9 -0
  59. package/dist/components/type/TextType.vue.d.ts +8 -0
  60. package/dist/components/type/index.cjs +9 -0
  61. package/dist/components/type/index.cjs.map +1 -0
  62. package/dist/components/type/index.d.ts +5 -0
  63. package/dist/components/type/index.js +9 -0
  64. package/dist/components/type/index.js.map +1 -0
  65. package/dist/composables/index.cjs +7 -0
  66. package/dist/composables/index.cjs.map +1 -0
  67. package/dist/composables/index.d.ts +3 -0
  68. package/dist/composables/index.js +7 -0
  69. package/dist/composables/index.js.map +1 -0
  70. package/dist/composables/useDarkMode.d.ts +14 -0
  71. package/dist/composables/useExportCSV.d.ts +10 -0
  72. package/dist/composables/useNotifications.d.ts +27 -0
  73. package/dist/index-BoCtJCg0.cjs +32 -0
  74. package/dist/index-BoCtJCg0.cjs.map +1 -0
  75. package/dist/index-CGhDI10m.js +33 -0
  76. package/dist/index-CGhDI10m.js.map +1 -0
  77. package/dist/index.cjs +49 -0
  78. package/dist/index.cjs.map +1 -0
  79. package/dist/index.d.ts +5 -0
  80. package/dist/index.js +49 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/plugin.d.ts +24 -0
  83. package/dist/types/components.d.ts +18 -0
  84. package/dist/types/form.d.ts +27 -0
  85. package/dist/types/index.cjs +2 -0
  86. package/dist/types/index.cjs.map +1 -0
  87. package/dist/types/index.d.ts +4 -0
  88. package/dist/types/index.js +2 -0
  89. package/dist/types/index.js.map +1 -0
  90. package/dist/types/notification.d.ts +12 -0
  91. package/dist/types/property.d.ts +34 -0
  92. package/dist/useExportCSV-B9o9lJ3D.js +130 -0
  93. package/dist/useExportCSV-B9o9lJ3D.js.map +1 -0
  94. package/dist/useExportCSV-BPC_hd25.cjs +129 -0
  95. package/dist/useExportCSV-BPC_hd25.cjs.map +1 -0
  96. package/package.json +131 -0
@@ -0,0 +1,540 @@
1
+ import { defineComponent, createElementBlock, openBlock, createCommentVNode, renderSlot, createElementVNode, createTextVNode, toDisplayString, computed, Fragment, renderList, normalizeClass, createBlock, resolveDynamicComponent, ref, watch, createVNode, withDirectives, unref, vModelText, withModifiers, Transition, withCtx, nextTick, resolveComponent, mergeProps } from "vue";
2
+ import { e as _sfc_main$5, d as _sfc_main$6, c as _sfc_main$7, b as _sfc_main$8, a as _sfc_main$9 } from "./BadgeType.vue_vue_type_script_setup_true_lang-CnB5eNEM.js";
3
+ import { Icon } from "@iconify/vue";
4
+ const _hoisted_1$3 = { class: "flex flex-col overflow-hidden rounded-lg bg-white shadow-md dark:bg-slate-950" };
5
+ const _hoisted_2$3 = {
6
+ key: 0,
7
+ class: "flex items-center justify-between border-b border-gray-200 px-5 py-3 dark:border-gray-700"
8
+ };
9
+ const _hoisted_3$2 = { class: "flex flex-col gap-0.5" };
10
+ const _hoisted_4$2 = {
11
+ key: 0,
12
+ class: "text-md font-semibold text-gray-800 dark:text-gray-200"
13
+ };
14
+ const _hoisted_5$2 = {
15
+ key: 1,
16
+ class: "text-sm font-normal text-gray-600 dark:text-gray-400"
17
+ };
18
+ const _hoisted_6$1 = { class: "flex gap-2" };
19
+ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
20
+ __name: "CardComponent",
21
+ props: {
22
+ title: {},
23
+ description: {}
24
+ },
25
+ setup(__props) {
26
+ return (_ctx, _cache) => {
27
+ return openBlock(), createElementBlock("div", _hoisted_1$3, [
28
+ __props.title || __props.description || _ctx.$slots.title || _ctx.$slots.description || _ctx.$slots.actions ? (openBlock(), createElementBlock("div", _hoisted_2$3, [
29
+ createElementVNode("div", _hoisted_3$2, [
30
+ __props.title || _ctx.$slots.title ? (openBlock(), createElementBlock("span", _hoisted_4$2, [
31
+ renderSlot(_ctx.$slots, "title", {}, () => [
32
+ createTextVNode(toDisplayString(__props.title), 1)
33
+ ])
34
+ ])) : createCommentVNode("", true),
35
+ __props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("span", _hoisted_5$2, [
36
+ renderSlot(_ctx.$slots, "description", {}, () => [
37
+ createTextVNode(toDisplayString(__props.description), 1)
38
+ ])
39
+ ])) : createCommentVNode("", true)
40
+ ]),
41
+ createElementVNode("div", _hoisted_6$1, [
42
+ renderSlot(_ctx.$slots, "actions")
43
+ ])
44
+ ])) : createCommentVNode("", true),
45
+ renderSlot(_ctx.$slots, "default")
46
+ ]);
47
+ };
48
+ }
49
+ });
50
+ const _hoisted_1$2 = { class: "w-full divide-y divide-gray-300 text-left dark:divide-gray-700" };
51
+ const _hoisted_2$2 = { class: "bg-slate-100 text-sm font-semibold text-gray-600 uppercase dark:bg-slate-900 dark:text-gray-400" };
52
+ const _hoisted_3$1 = { class: "divide-y divide-gray-200 font-medium dark:divide-gray-800" };
53
+ const _hoisted_4$1 = { class: "flex items-center justify-end gap-2 px-3 py-4" };
54
+ const _hoisted_5$1 = { key: 0 };
55
+ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
56
+ __name: "TableComponent",
57
+ props: {
58
+ properties: {},
59
+ items: {}
60
+ },
61
+ setup(__props) {
62
+ const typeComponents = {
63
+ text: _sfc_main$9,
64
+ number: _sfc_main$8,
65
+ date: _sfc_main$7,
66
+ boolean: _sfc_main$6,
67
+ badge: _sfc_main$5
68
+ };
69
+ const getTypeComponent = (type = "text") => {
70
+ return typeComponents[type] || _sfc_main$9;
71
+ };
72
+ const visibleProperties = computed(() => __props.properties.filter((p) => !p.hidden));
73
+ const getItemValue = (item, property) => {
74
+ if (property.name.includes(".")) {
75
+ let value = item;
76
+ for (const key of property.name.split(".")) {
77
+ if (value && typeof value === "object" && key in value) {
78
+ value = value[key];
79
+ } else {
80
+ return void 0;
81
+ }
82
+ }
83
+ return value;
84
+ }
85
+ return item[property.name];
86
+ };
87
+ const getAlignmentClass = (align) => {
88
+ switch (align) {
89
+ case "center":
90
+ return "text-center";
91
+ case "right":
92
+ return "text-right";
93
+ default:
94
+ return "text-left";
95
+ }
96
+ };
97
+ const getMainClass = (main) => {
98
+ if (main) {
99
+ return "text-sm font-semibold text-gray-900 dark:text-gray-100";
100
+ }
101
+ return "text-xs font-medium text-gray-600 dark:text-gray-400";
102
+ };
103
+ return (_ctx, _cache) => {
104
+ return openBlock(), createElementBlock(Fragment, null, [
105
+ createElementVNode("table", _hoisted_1$2, [
106
+ createElementVNode("thead", _hoisted_2$2, [
107
+ createElementVNode("tr", null, [
108
+ (openBlock(true), createElementBlock(Fragment, null, renderList(visibleProperties.value, (property) => {
109
+ return openBlock(), createElementBlock("th", {
110
+ key: property.name,
111
+ class: normalizeClass([getAlignmentClass(property.align), "px-3 py-3"])
112
+ }, [
113
+ renderSlot(_ctx.$slots, "header-" + property.name, { property }, () => [
114
+ createTextVNode(toDisplayString(property.label ?? property.name), 1)
115
+ ])
116
+ ], 2);
117
+ }), 128)),
118
+ _cache[0] || (_cache[0] = createElementVNode("th", { class: "px-3 py-3 text-right" }, null, -1))
119
+ ])
120
+ ]),
121
+ createElementVNode("tbody", _hoisted_3$1, [
122
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item) => {
123
+ return openBlock(), createElementBlock("tr", {
124
+ key: item.id,
125
+ class: "hover:bg-slate-50 dark:hover:bg-slate-950"
126
+ }, [
127
+ (openBlock(true), createElementBlock(Fragment, null, renderList(visibleProperties.value, (property) => {
128
+ return openBlock(), createElementBlock("td", {
129
+ key: property.name,
130
+ class: normalizeClass([
131
+ getAlignmentClass(property.align),
132
+ getMainClass(property.main),
133
+ property.className,
134
+ "px-3 py-4"
135
+ ])
136
+ }, [
137
+ renderSlot(_ctx.$slots, "item-" + property.name, {
138
+ item,
139
+ property,
140
+ value: getItemValue(item, property)
141
+ }, () => [
142
+ (openBlock(), createBlock(resolveDynamicComponent(getTypeComponent(property.type || "text")), {
143
+ value: getItemValue(item, property)
144
+ }, null, 8, ["value"]))
145
+ ])
146
+ ], 2);
147
+ }), 128)),
148
+ createElementVNode("td", _hoisted_4$1, [
149
+ renderSlot(_ctx.$slots, "action", { item })
150
+ ])
151
+ ]);
152
+ }), 128))
153
+ ])
154
+ ]),
155
+ !__props.items || __props.items.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_5$1, [
156
+ renderSlot(_ctx.$slots, "empty")
157
+ ])) : createCommentVNode("", true)
158
+ ], 64);
159
+ };
160
+ }
161
+ });
162
+ const _hoisted_1$1 = { class: "autocomplete-container" };
163
+ const _hoisted_2$1 = {
164
+ key: 0,
165
+ class: "mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300"
166
+ };
167
+ const _hoisted_3 = { class: "relative" };
168
+ const _hoisted_4 = ["disabled", "placeholder"];
169
+ const _hoisted_5 = ["disabled"];
170
+ const _hoisted_6 = {
171
+ key: 0,
172
+ class: "px-4 py-3 text-sm text-gray-500"
173
+ };
174
+ const _hoisted_7 = ["data-index", "onClick"];
175
+ const _hoisted_8 = { class: "flex-1 dark:text-white" };
176
+ const _hoisted_9 = { class: "text-xs text-gray-400" };
177
+ const _hoisted_10 = {
178
+ key: 1,
179
+ class: "mt-1 text-sm text-red-600"
180
+ };
181
+ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
182
+ __name: "AutocompleteComponent",
183
+ props: {
184
+ modelValue: {},
185
+ options: {},
186
+ placeholder: {},
187
+ disabled: { type: Boolean },
188
+ label: {},
189
+ error: {},
190
+ noResultsText: {}
191
+ },
192
+ emits: ["update:modelValue"],
193
+ setup(__props, { emit: __emit }) {
194
+ const props = __props;
195
+ const emit = __emit;
196
+ const searchQuery = ref("");
197
+ const isOpen = ref(false);
198
+ const highlightedIndex = ref(-1);
199
+ const inputRef = ref(null);
200
+ const dropdownRef = ref(null);
201
+ const filteredOptions = computed(() => {
202
+ if (!searchQuery.value) {
203
+ return props.options;
204
+ }
205
+ const query = searchQuery.value.toLowerCase();
206
+ return props.options.filter(
207
+ (option) => option.label.toLowerCase().includes(query) || option.value.toLowerCase().includes(query)
208
+ );
209
+ });
210
+ const selectedLabel = computed(() => {
211
+ if (!props.modelValue) return "";
212
+ const option = props.options.find((opt) => opt.value === props.modelValue);
213
+ return (option == null ? void 0 : option.label) || "";
214
+ });
215
+ watch(
216
+ () => props.modelValue,
217
+ () => {
218
+ if (!isOpen.value) {
219
+ searchQuery.value = selectedLabel.value;
220
+ }
221
+ },
222
+ { immediate: true }
223
+ );
224
+ const openDropdown = () => {
225
+ if (props.disabled) return;
226
+ isOpen.value = true;
227
+ searchQuery.value = "";
228
+ highlightedIndex.value = -1;
229
+ nextTick(() => {
230
+ var _a;
231
+ (_a = inputRef.value) == null ? void 0 : _a.focus();
232
+ });
233
+ };
234
+ const closeDropdown = () => {
235
+ isOpen.value = false;
236
+ searchQuery.value = selectedLabel.value;
237
+ highlightedIndex.value = -1;
238
+ };
239
+ const selectOption = (option) => {
240
+ emit("update:modelValue", option.value);
241
+ searchQuery.value = option.label;
242
+ closeDropdown();
243
+ };
244
+ const clearSelection = () => {
245
+ emit("update:modelValue", null);
246
+ searchQuery.value = "";
247
+ highlightedIndex.value = -1;
248
+ nextTick(() => {
249
+ var _a;
250
+ (_a = inputRef.value) == null ? void 0 : _a.focus();
251
+ });
252
+ };
253
+ const handleKeydown = (event) => {
254
+ if (!isOpen.value) return;
255
+ switch (event.key) {
256
+ case "ArrowDown":
257
+ event.preventDefault();
258
+ highlightedIndex.value = Math.min(
259
+ highlightedIndex.value + 1,
260
+ filteredOptions.value.length - 1
261
+ );
262
+ scrollToHighlighted();
263
+ break;
264
+ case "ArrowUp":
265
+ event.preventDefault();
266
+ highlightedIndex.value = Math.max(highlightedIndex.value - 1, 0);
267
+ scrollToHighlighted();
268
+ break;
269
+ case "Enter":
270
+ event.preventDefault();
271
+ if (highlightedIndex.value >= 0 && filteredOptions.value[highlightedIndex.value]) {
272
+ selectOption(filteredOptions.value[highlightedIndex.value]);
273
+ }
274
+ break;
275
+ case "Escape":
276
+ event.preventDefault();
277
+ closeDropdown();
278
+ break;
279
+ }
280
+ };
281
+ const scrollToHighlighted = () => {
282
+ nextTick(() => {
283
+ if (dropdownRef.value) {
284
+ const highlightedElement = dropdownRef.value.querySelector(
285
+ `[data-index="${highlightedIndex.value}"]`
286
+ );
287
+ if (highlightedElement) {
288
+ highlightedElement.scrollIntoView({ block: "nearest" });
289
+ }
290
+ }
291
+ });
292
+ };
293
+ const handleClickOutside = (event) => {
294
+ const target = event.target;
295
+ if (!target.closest(".autocomplete-container") && !target.closest(".autocomplete-dropdown")) {
296
+ closeDropdown();
297
+ }
298
+ };
299
+ watch(isOpen, (newValue) => {
300
+ if (newValue) {
301
+ document.addEventListener("click", handleClickOutside);
302
+ } else {
303
+ document.removeEventListener("click", handleClickOutside);
304
+ }
305
+ });
306
+ return (_ctx, _cache) => {
307
+ return openBlock(), createElementBlock("div", _hoisted_1$1, [
308
+ __props.label ? (openBlock(), createElementBlock("label", _hoisted_2$1, toDisplayString(__props.label), 1)) : createCommentVNode("", true),
309
+ createElementVNode("div", _hoisted_3, [
310
+ createElementVNode("div", {
311
+ class: normalizeClass([{
312
+ "border-red-500": __props.error,
313
+ "border-gray-300 dark:border-gray-600": !__props.error && !isOpen.value,
314
+ "border-blue-500 ring-2 ring-blue-200 dark:ring-blue-900": isOpen.value,
315
+ "cursor-not-allowed opacity-50": __props.disabled
316
+ }, "flex items-center gap-2 rounded-lg border bg-white px-3 py-2 transition dark:bg-gray-800"])
317
+ }, [
318
+ createVNode(unref(Icon), {
319
+ class: "size-5 text-gray-400",
320
+ icon: "lucide:search"
321
+ }),
322
+ withDirectives(createElementVNode("input", {
323
+ ref_key: "inputRef",
324
+ ref: inputRef,
325
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => searchQuery.value = $event),
326
+ disabled: __props.disabled,
327
+ placeholder: __props.placeholder || "Search...",
328
+ class: "flex-1 bg-transparent text-sm outline-none dark:text-white",
329
+ type: "text",
330
+ onFocus: openDropdown,
331
+ onKeydown: handleKeydown
332
+ }, null, 40, _hoisted_4), [
333
+ [vModelText, searchQuery.value]
334
+ ]),
335
+ __props.modelValue && !__props.disabled ? (openBlock(), createElementBlock("button", {
336
+ key: 0,
337
+ class: "rounded p-1 transition hover:bg-gray-100 dark:hover:bg-gray-700",
338
+ type: "button",
339
+ onClick: withModifiers(clearSelection, ["stop"])
340
+ }, [
341
+ createVNode(unref(Icon), {
342
+ class: "size-4 text-gray-400",
343
+ icon: "lucide:x"
344
+ })
345
+ ])) : createCommentVNode("", true),
346
+ createElementVNode("button", {
347
+ disabled: __props.disabled,
348
+ class: "rounded p-1 transition hover:bg-gray-100 dark:hover:bg-gray-700",
349
+ type: "button",
350
+ onClick: _cache[1] || (_cache[1] = withModifiers(($event) => isOpen.value ? closeDropdown() : openDropdown(), ["stop"]))
351
+ }, [
352
+ createVNode(unref(Icon), {
353
+ class: normalizeClass([{ "rotate-180": isOpen.value }, "size-4 text-gray-400 transition"]),
354
+ icon: "lucide:chevron-down"
355
+ }, null, 8, ["class"])
356
+ ], 8, _hoisted_5)
357
+ ], 2),
358
+ createVNode(Transition, {
359
+ "enter-active-class": "transition duration-100 ease-out",
360
+ "enter-from-class": "opacity-0 scale-95",
361
+ "enter-to-class": "opacity-100 scale-100",
362
+ "leave-active-class": "transition duration-75 ease-in",
363
+ "leave-from-class": "opacity-100 scale-100",
364
+ "leave-to-class": "opacity-0 scale-95"
365
+ }, {
366
+ default: withCtx(() => [
367
+ isOpen.value ? (openBlock(), createElementBlock("div", {
368
+ key: 0,
369
+ ref_key: "dropdownRef",
370
+ ref: dropdownRef,
371
+ class: "autocomplete-dropdown absolute z-50 mt-2 max-h-60 w-full overflow-auto rounded-lg border border-gray-200 bg-white shadow-lg dark:border-gray-700 dark:bg-gray-800"
372
+ }, [
373
+ filteredOptions.value.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_6, toDisplayString(__props.noResultsText || "No results found"), 1)) : createCommentVNode("", true),
374
+ (openBlock(true), createElementBlock(Fragment, null, renderList(filteredOptions.value, (option, index) => {
375
+ return openBlock(), createElementBlock("button", {
376
+ key: option.value,
377
+ class: normalizeClass([{
378
+ "bg-gray-100 dark:bg-gray-700": highlightedIndex.value === index,
379
+ "bg-blue-50 dark:bg-blue-900/20": __props.modelValue === option.value
380
+ }, "flex w-full items-center gap-2 px-4 py-2 text-left text-sm transition hover:bg-gray-100 dark:hover:bg-gray-700"]),
381
+ "data-index": index,
382
+ type: "button",
383
+ onClick: ($event) => selectOption(option)
384
+ }, [
385
+ __props.modelValue === option.value ? (openBlock(), createBlock(unref(Icon), {
386
+ key: 0,
387
+ class: "size-4 text-blue-600 dark:text-blue-400",
388
+ icon: "lucide:check"
389
+ })) : createCommentVNode("", true),
390
+ createElementVNode("span", _hoisted_8, toDisplayString(option.label), 1),
391
+ createElementVNode("span", _hoisted_9, "(" + toDisplayString(option.value) + ")", 1)
392
+ ], 10, _hoisted_7);
393
+ }), 128))
394
+ ], 512)) : createCommentVNode("", true)
395
+ ]),
396
+ _: 1
397
+ })
398
+ ]),
399
+ __props.error ? (openBlock(), createElementBlock("p", _hoisted_10, toDisplayString(__props.error), 1)) : createCommentVNode("", true)
400
+ ]);
401
+ };
402
+ }
403
+ });
404
+ const _hoisted_1 = { class: "relative" };
405
+ const _hoisted_2 = {
406
+ key: 0,
407
+ class: "absolute top-0.25 right-0.25 size-1.5 rounded-full bg-red-600"
408
+ };
409
+ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
410
+ __name: "MenuItem",
411
+ props: {
412
+ menuItem: {}
413
+ },
414
+ setup(__props) {
415
+ const isRouteActive = computed(() => {
416
+ if (typeof window === "undefined") return false;
417
+ const currentPath = window.location.pathname;
418
+ if (__props.menuItem.link === "/") {
419
+ return currentPath === "/";
420
+ }
421
+ return currentPath === __props.menuItem.link || currentPath.startsWith(__props.menuItem.link + "/");
422
+ });
423
+ const linkComponent = computed(() => {
424
+ try {
425
+ const RouterLink = resolveComponent("RouterLink");
426
+ if (typeof RouterLink !== "string") {
427
+ return RouterLink;
428
+ }
429
+ } catch {
430
+ }
431
+ return "a";
432
+ });
433
+ const linkProps = computed(() => {
434
+ if (linkComponent.value === "a") {
435
+ return { href: __props.menuItem.link };
436
+ }
437
+ return { to: __props.menuItem.link };
438
+ });
439
+ return (_ctx, _cache) => {
440
+ return openBlock(), createBlock(resolveDynamicComponent(linkComponent.value), mergeProps(linkProps.value, { class: "group relative flex flex-col items-center justify-center gap-2 px-5 @min-[7rem]:flex-row" }), {
441
+ default: withCtx(() => [
442
+ createElementVNode("div", _hoisted_1, [
443
+ createVNode(unref(Icon), {
444
+ class: normalizeClass([
445
+ isRouteActive.value ? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500",
446
+ "size-8 @min-[7rem]:size-6"
447
+ ]),
448
+ icon: __props.menuItem.icon
449
+ }, null, 8, ["class", "icon"]),
450
+ __props.menuItem.notification ? (openBlock(), createElementBlock("span", _hoisted_2)) : createCommentVNode("", true)
451
+ ]),
452
+ createElementVNode("span", {
453
+ class: normalizeClass([
454
+ isRouteActive.value ? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500",
455
+ "hidden text-[10px] font-semibold @min-[7rem]:block @min-[7rem]:text-sm"
456
+ ])
457
+ }, toDisplayString(__props.menuItem.label), 3)
458
+ ]),
459
+ _: 1
460
+ }, 16);
461
+ };
462
+ }
463
+ });
464
+ const _sfc_main = /* @__PURE__ */ defineComponent({
465
+ __name: "TableAction",
466
+ props: {
467
+ link: {},
468
+ icon: {},
469
+ color: {}
470
+ },
471
+ setup(__props) {
472
+ const colorClass = computed(() => {
473
+ switch (__props.color) {
474
+ case "info":
475
+ return "border-blue-200 hover:bg-blue-100 dark:border-blue-800 dark:hover:bg-blue-900";
476
+ case "warning":
477
+ return "border-yellow-200 hover:bg-yellow-100 dark:border-yellow-800 dark:hover:bg-yellow-900";
478
+ case "success":
479
+ return "border-green-200 hover:bg-green-100 dark:border-green-800 dark:hover:bg-green-900";
480
+ case "error":
481
+ return "border-red-200 hover:bg-red-100 dark:border-red-800 dark:hover:bg-red-900";
482
+ default:
483
+ return "border-slate-200 hover:bg-slate-100 dark:border-slate-800 dark:bg-slate-950 dark:hover:bg-slate-900";
484
+ }
485
+ });
486
+ const iconColorClass = computed(() => {
487
+ switch (__props.color) {
488
+ case "info":
489
+ return "text-blue-600 group-hover:text-blue-900 dark:text-blue-400 dark:group-hover:text-blue-100";
490
+ case "warning":
491
+ return "text-yellow-600 group-hover:text-yellow-900 dark:text-yellow-400 dark:group-hover:text-yellow-100";
492
+ case "success":
493
+ return "text-green-600 group-hover:text-green-900 dark:text-green-400 dark:group-hover:text-green-100";
494
+ case "error":
495
+ return "text-red-600 group-hover:text-red-900 dark:text-red-400 dark:group-hover:text-red-100";
496
+ default:
497
+ return "text-gray-600 group-hover:text-gray-900 dark:text-gray-400 dark:group-hover:text-gray-100";
498
+ }
499
+ });
500
+ const linkComponent = computed(() => {
501
+ if (!__props.link) return "button";
502
+ try {
503
+ const RouterLink = resolveComponent("RouterLink");
504
+ if (typeof RouterLink !== "string") {
505
+ return RouterLink;
506
+ }
507
+ } catch {
508
+ }
509
+ return "a";
510
+ });
511
+ const linkProps = computed(() => {
512
+ if (!__props.link) return {};
513
+ if (linkComponent.value === "a") {
514
+ return { href: __props.link };
515
+ }
516
+ return { to: __props.link };
517
+ });
518
+ return (_ctx, _cache) => {
519
+ return openBlock(), createBlock(resolveDynamicComponent(linkComponent.value), mergeProps(linkProps.value, {
520
+ class: [colorClass.value, "group flex size-8 items-center justify-center rounded-lg border"]
521
+ }), {
522
+ default: withCtx(() => [
523
+ createVNode(unref(Icon), {
524
+ class: normalizeClass([iconColorClass.value, "size-4"]),
525
+ icon: __props.icon
526
+ }, null, 8, ["class", "icon"])
527
+ ]),
528
+ _: 1
529
+ }, 16, ["class"]);
530
+ };
531
+ }
532
+ });
533
+ export {
534
+ _sfc_main$4 as _,
535
+ _sfc_main$3 as a,
536
+ _sfc_main$2 as b,
537
+ _sfc_main$1 as c,
538
+ _sfc_main as d
539
+ };
540
+ //# sourceMappingURL=TableAction.vue_vue_type_script_setup_true_lang-BHskhVhK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableAction.vue_vue_type_script_setup_true_lang-BHskhVhK.js","sources":["../src/components/core/CardComponent.vue","../src/components/core/TableComponent.vue","../src/components/core/AutocompleteComponent.vue","../src/components/core/MenuItem.vue","../src/components/core/TableAction.vue"],"sourcesContent":["<script lang=\"ts\" setup>\ndefineProps<{\n title?: string\n description?: string\n}>()\n</script>\n\n<template>\n <div class=\"flex flex-col overflow-hidden rounded-lg bg-white shadow-md dark:bg-slate-950\">\n <div\n v-if=\"title || description || $slots.title || $slots.description || $slots.actions\"\n class=\"flex items-center justify-between border-b border-gray-200 px-5 py-3 dark:border-gray-700\"\n >\n <div class=\"flex flex-col gap-0.5\">\n <span\n v-if=\"title || $slots.title\"\n class=\"text-md font-semibold text-gray-800 dark:text-gray-200\"\n >\n <slot name=\"title\">\n {{ title }}\n </slot>\n </span>\n\n <span\n v-if=\"description || $slots.description\"\n class=\"text-sm font-normal text-gray-600 dark:text-gray-400\"\n >\n <slot name=\"description\">\n {{ description }}\n </slot>\n </span>\n </div>\n\n <div class=\"flex gap-2\">\n <slot name=\"actions\" />\n </div>\n </div>\n\n <slot />\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport type { Property } from '@/types'\nimport TextType from '@/components/type/TextType.vue'\nimport NumberType from '@/components/type/NumberType.vue'\nimport DateType from '@/components/type/DateType.vue'\nimport BooleanType from '@/components/type/BooleanType.vue'\nimport BadgeType from '@/components/type/BadgeType.vue'\nimport { computed, type Component } from 'vue'\n\nconst { properties, items } = defineProps<{\n properties: Property[]\n items: { id: number | string; [key: string]: unknown }[]\n}>()\n\n// Type components mapping\nconst typeComponents: Record<string, Component> = {\n text: TextType,\n number: NumberType,\n date: DateType,\n boolean: BooleanType,\n badge: BadgeType,\n}\n\nconst getTypeComponent = (type: string = 'text'): Component => {\n return typeComponents[type] || TextType\n}\n\n// Filter out hidden properties\nconst visibleProperties = computed(() => properties.filter((p) => !p.hidden))\n\n// Get nested property value\nconst getItemValue = (item: Record<string, unknown>, property: Property): unknown => {\n if (property.name.includes('.')) {\n let value: unknown = item\n for (const key of property.name.split('.')) {\n if (value && typeof value === 'object' && key in value) {\n value = (value as Record<string, unknown>)[key]\n } else {\n return undefined\n }\n }\n return value\n }\n return item[property.name]\n}\n\nconst getAlignmentClass = (align?: 'left' | 'center' | 'right') => {\n switch (align) {\n case 'center':\n return 'text-center'\n case 'right':\n return 'text-right'\n default:\n return 'text-left'\n }\n}\n\nconst getMainClass = (main?: boolean) => {\n if (main) {\n return 'text-sm font-semibold text-gray-900 dark:text-gray-100'\n }\n return 'text-xs font-medium text-gray-600 dark:text-gray-400'\n}\n</script>\n\n<template>\n <table class=\"w-full divide-y divide-gray-300 text-left dark:divide-gray-700\">\n <thead\n class=\"bg-slate-100 text-sm font-semibold text-gray-600 uppercase dark:bg-slate-900 dark:text-gray-400\"\n >\n <tr>\n <th\n v-for=\"property in visibleProperties\"\n :key=\"property.name\"\n :class=\"[getAlignmentClass(property.align), 'px-3 py-3']\"\n >\n <slot :name=\"'header-' + property.name\" :property>\n {{ property.label ?? property.name }}\n </slot>\n </th>\n\n <th class=\"px-3 py-3 text-right\"></th>\n </tr>\n </thead>\n\n <tbody class=\"divide-y divide-gray-200 font-medium dark:divide-gray-800\">\n <tr v-for=\"item in items\" :key=\"item.id\" class=\"hover:bg-slate-50 dark:hover:bg-slate-950\">\n <td\n v-for=\"property in visibleProperties\"\n :key=\"property.name\"\n :class=\"[\n getAlignmentClass(property.align),\n getMainClass(property.main),\n property.className,\n 'px-3 py-4',\n ]\"\n >\n <slot\n :item=\"item\"\n :name=\"'item-' + property.name\"\n :property\n :value=\"getItemValue(item, property)\"\n >\n <component\n :is=\"getTypeComponent(property.type || 'text')\"\n :value=\"getItemValue(item, property)\"\n />\n </slot>\n </td>\n\n <td class=\"flex items-center justify-end gap-2 px-3 py-4\">\n <slot :item=\"item\" name=\"action\"></slot>\n </td>\n </tr>\n </tbody>\n </table>\n\n <!-- Empty state -->\n <div v-if=\"!items || items.length === 0\">\n <slot name=\"empty\"></slot>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, nextTick, ref, watch } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport type { AutocompleteOption } from '@/types'\n\nconst props = defineProps<{\n modelValue: string | null\n options: AutocompleteOption[]\n placeholder?: string\n disabled?: boolean\n label?: string\n error?: string\n noResultsText?: string\n}>()\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | null]\n}>()\n\nconst searchQuery = ref('')\nconst isOpen = ref(false)\nconst highlightedIndex = ref(-1)\nconst inputRef = ref<HTMLInputElement | null>(null)\nconst dropdownRef = ref<HTMLDivElement | null>(null)\n\nconst filteredOptions = computed(() => {\n if (!searchQuery.value) {\n return props.options\n }\n const query = searchQuery.value.toLowerCase()\n return props.options.filter(\n (option) =>\n option.label.toLowerCase().includes(query) || option.value.toLowerCase().includes(query),\n )\n})\n\nconst selectedLabel = computed(() => {\n if (!props.modelValue) return ''\n const option = props.options.find((opt) => opt.value === props.modelValue)\n return option?.label || ''\n})\n\nwatch(\n () => props.modelValue,\n () => {\n if (!isOpen.value) {\n searchQuery.value = selectedLabel.value\n }\n },\n { immediate: true },\n)\n\nconst openDropdown = () => {\n if (props.disabled) return\n isOpen.value = true\n searchQuery.value = ''\n highlightedIndex.value = -1\n nextTick(() => {\n inputRef.value?.focus()\n })\n}\n\nconst closeDropdown = () => {\n isOpen.value = false\n searchQuery.value = selectedLabel.value\n highlightedIndex.value = -1\n}\n\nconst selectOption = (option: AutocompleteOption) => {\n emit('update:modelValue', option.value)\n searchQuery.value = option.label\n closeDropdown()\n}\n\nconst clearSelection = () => {\n emit('update:modelValue', null)\n searchQuery.value = ''\n highlightedIndex.value = -1\n nextTick(() => {\n inputRef.value?.focus()\n })\n}\n\nconst handleKeydown = (event: KeyboardEvent) => {\n if (!isOpen.value) return\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n highlightedIndex.value = Math.min(\n highlightedIndex.value + 1,\n filteredOptions.value.length - 1,\n )\n scrollToHighlighted()\n break\n case 'ArrowUp':\n event.preventDefault()\n highlightedIndex.value = Math.max(highlightedIndex.value - 1, 0)\n scrollToHighlighted()\n break\n case 'Enter':\n event.preventDefault()\n if (highlightedIndex.value >= 0 && filteredOptions.value[highlightedIndex.value]) {\n selectOption(filteredOptions.value[highlightedIndex.value])\n }\n break\n case 'Escape':\n event.preventDefault()\n closeDropdown()\n break\n }\n}\n\nconst scrollToHighlighted = () => {\n nextTick(() => {\n if (dropdownRef.value) {\n const highlightedElement = dropdownRef.value.querySelector(\n `[data-index=\"${highlightedIndex.value}\"]`,\n ) as HTMLElement\n if (highlightedElement) {\n highlightedElement.scrollIntoView({ block: 'nearest' })\n }\n }\n })\n}\n\nconst handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement\n if (!target.closest('.autocomplete-container') && !target.closest('.autocomplete-dropdown')) {\n closeDropdown()\n }\n}\n\nwatch(isOpen, (newValue) => {\n if (newValue) {\n document.addEventListener('click', handleClickOutside)\n } else {\n document.removeEventListener('click', handleClickOutside)\n }\n})\n</script>\n\n<template>\n <div class=\"autocomplete-container\">\n <label v-if=\"label\" class=\"mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {{ label }}\n </label>\n\n <div class=\"relative\">\n <div\n :class=\"{\n 'border-red-500': error,\n 'border-gray-300 dark:border-gray-600': !error && !isOpen,\n 'border-blue-500 ring-2 ring-blue-200 dark:ring-blue-900': isOpen,\n 'cursor-not-allowed opacity-50': disabled,\n }\"\n class=\"flex items-center gap-2 rounded-lg border bg-white px-3 py-2 transition dark:bg-gray-800\"\n >\n <Icon class=\"size-5 text-gray-400\" icon=\"lucide:search\" />\n\n <input\n ref=\"inputRef\"\n v-model=\"searchQuery\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder || 'Search...'\"\n class=\"flex-1 bg-transparent text-sm outline-none dark:text-white\"\n type=\"text\"\n @focus=\"openDropdown\"\n @keydown=\"handleKeydown\"\n />\n\n <button\n v-if=\"modelValue && !disabled\"\n class=\"rounded p-1 transition hover:bg-gray-100 dark:hover:bg-gray-700\"\n type=\"button\"\n @click.stop=\"clearSelection\"\n >\n <Icon class=\"size-4 text-gray-400\" icon=\"lucide:x\" />\n </button>\n\n <button\n :disabled=\"disabled\"\n class=\"rounded p-1 transition hover:bg-gray-100 dark:hover:bg-gray-700\"\n type=\"button\"\n @click.stop=\"isOpen ? closeDropdown() : openDropdown()\"\n >\n <Icon\n :class=\"{ 'rotate-180': isOpen }\"\n class=\"size-4 text-gray-400 transition\"\n icon=\"lucide:chevron-down\"\n />\n </button>\n </div>\n\n <!-- Dropdown -->\n <Transition\n enter-active-class=\"transition duration-100 ease-out\"\n enter-from-class=\"opacity-0 scale-95\"\n enter-to-class=\"opacity-100 scale-100\"\n leave-active-class=\"transition duration-75 ease-in\"\n leave-from-class=\"opacity-100 scale-100\"\n leave-to-class=\"opacity-0 scale-95\"\n >\n <div\n v-if=\"isOpen\"\n ref=\"dropdownRef\"\n class=\"autocomplete-dropdown absolute z-50 mt-2 max-h-60 w-full overflow-auto rounded-lg border border-gray-200 bg-white shadow-lg dark:border-gray-700 dark:bg-gray-800\"\n >\n <div v-if=\"filteredOptions.length === 0\" class=\"px-4 py-3 text-sm text-gray-500\">\n {{ noResultsText || 'No results found' }}\n </div>\n\n <button\n v-for=\"(option, index) in filteredOptions\"\n :key=\"option.value\"\n :class=\"{\n 'bg-gray-100 dark:bg-gray-700': highlightedIndex === index,\n 'bg-blue-50 dark:bg-blue-900/20': modelValue === option.value,\n }\"\n :data-index=\"index\"\n class=\"flex w-full items-center gap-2 px-4 py-2 text-left text-sm transition hover:bg-gray-100 dark:hover:bg-gray-700\"\n type=\"button\"\n @click=\"selectOption(option)\"\n >\n <Icon\n v-if=\"modelValue === option.value\"\n class=\"size-4 text-blue-600 dark:text-blue-400\"\n icon=\"lucide:check\"\n />\n <span class=\"flex-1 dark:text-white\">{{ option.label }}</span>\n <span class=\"text-xs text-gray-400\">({{ option.value }})</span>\n </button>\n </div>\n </Transition>\n </div>\n\n <p v-if=\"error\" class=\"mt-1 text-sm text-red-600\">{{ error }}</p>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, resolveComponent } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport type { MenuItemProps } from '@/types'\n\nconst { menuItem } = defineProps<{ menuItem: MenuItemProps }>()\n\n// Try to use useRoute if available\nconst isRouteActive = computed(() => {\n if (typeof window === 'undefined') return false\n const currentPath = window.location.pathname\n if (menuItem.link === '/') {\n return currentPath === '/'\n }\n return currentPath === menuItem.link || currentPath.startsWith(menuItem.link + '/')\n})\n\n// Try to resolve RouterLink, fallback to 'a' tag\nconst linkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst linkProps = computed(() => {\n if (linkComponent.value === 'a') {\n return { href: menuItem.link }\n }\n return { to: menuItem.link }\n})\n</script>\n\n<template>\n <component\n :is=\"linkComponent\"\n v-bind=\"linkProps\"\n class=\"group relative flex flex-col items-center justify-center gap-2 px-5 @min-[7rem]:flex-row\"\n >\n <div class=\"relative\">\n <Icon\n :class=\"\n isRouteActive\n ? 'text-white'\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500'\n \"\n :icon=\"menuItem.icon\"\n class=\"size-8 @min-[7rem]:size-6\"\n />\n\n <span\n v-if=\"menuItem.notification\"\n class=\"absolute top-0.25 right-0.25 size-1.5 rounded-full bg-red-600\"\n ></span>\n </div>\n\n <span\n :class=\"\n isRouteActive\n ? 'text-white'\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500'\n \"\n class=\"hidden text-[10px] font-semibold @min-[7rem]:block @min-[7rem]:text-sm\"\n >{{ menuItem.label }}</span\n >\n </component>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, resolveComponent } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport type { TableActionColor } from '@/types'\n\nconst { color, icon, link } = defineProps<{\n link?: string\n icon: string\n color?: TableActionColor\n}>()\n\nconst colorClass = computed(() => {\n switch (color) {\n case 'info':\n return 'border-blue-200 hover:bg-blue-100 dark:border-blue-800 dark:hover:bg-blue-900'\n case 'warning':\n return 'border-yellow-200 hover:bg-yellow-100 dark:border-yellow-800 dark:hover:bg-yellow-900'\n case 'success':\n return 'border-green-200 hover:bg-green-100 dark:border-green-800 dark:hover:bg-green-900'\n case 'error':\n return 'border-red-200 hover:bg-red-100 dark:border-red-800 dark:hover:bg-red-900'\n default:\n return 'border-slate-200 hover:bg-slate-100 dark:border-slate-800 dark:bg-slate-950 dark:hover:bg-slate-900'\n }\n})\n\nconst iconColorClass = computed(() => {\n switch (color) {\n case 'info':\n return 'text-blue-600 group-hover:text-blue-900 dark:text-blue-400 dark:group-hover:text-blue-100'\n case 'warning':\n return 'text-yellow-600 group-hover:text-yellow-900 dark:text-yellow-400 dark:group-hover:text-yellow-100'\n case 'success':\n return 'text-green-600 group-hover:text-green-900 dark:text-green-400 dark:group-hover:text-green-100'\n case 'error':\n return 'text-red-600 group-hover:text-red-900 dark:text-red-400 dark:group-hover:text-red-100'\n default:\n return 'text-gray-600 group-hover:text-gray-900 dark:text-gray-400 dark:group-hover:text-gray-100'\n }\n})\n\n// Try to resolve RouterLink, fallback to 'a' tag\nconst linkComponent = computed(() => {\n if (!link) return 'button'\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst linkProps = computed(() => {\n if (!link) return {}\n if (linkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n})\n</script>\n\n<template>\n <component\n :is=\"linkComponent\"\n v-bind=\"linkProps\"\n :class=\"colorClass\"\n class=\"group flex size-8 items-center justify-center rounded-lg border\"\n >\n <Icon :class=\"iconColorClass\" :icon class=\"size-4\" />\n </component>\n</template>\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","$slots","_hoisted_2","_createElementVNode","_hoisted_3","_hoisted_4","_renderSlot","_hoisted_5","_hoisted_6","TextType","NumberType","DateType","BooleanType","BadgeType","_Fragment","_renderList","_normalizeClass","_createTextVNode","_toDisplayString","_createBlock","_resolveDynamicComponent","_createVNode","_unref","_withModifiers","_Transition","_mergeProps"],"mappings":"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"}