cisse-vue-ui 0.5.34 → 0.7.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.
- package/dist/Button.vue_vue_type_script_setup_true_lang-CBYr0Z2_.js +99 -0
- package/dist/Button.vue_vue_type_script_setup_true_lang-CBYr0Z2_.js.map +1 -0
- package/dist/Button.vue_vue_type_script_setup_true_lang-CXRj7LEP.cjs +98 -0
- package/dist/Button.vue_vue_type_script_setup_true_lang-CXRj7LEP.cjs.map +1 -0
- package/dist/{ConfirmDialog.vue_vue_type_script_setup_true_lang-CHIIi5Gu.cjs → ConfirmDialog.vue_vue_type_script_setup_true_lang-Bine-xfp.cjs} +2 -2
- package/dist/{ConfirmDialog.vue_vue_type_script_setup_true_lang-CHIIi5Gu.cjs.map → ConfirmDialog.vue_vue_type_script_setup_true_lang-Bine-xfp.cjs.map} +1 -1
- package/dist/{ConfirmDialog.vue_vue_type_script_setup_true_lang-DdCwgxtv.js → ConfirmDialog.vue_vue_type_script_setup_true_lang-DqkA1Zr-.js} +2 -2
- package/dist/{ConfirmDialog.vue_vue_type_script_setup_true_lang-DdCwgxtv.js.map → ConfirmDialog.vue_vue_type_script_setup_true_lang-DqkA1Zr-.js.map} +1 -1
- package/dist/{DarkModeToggle.vue_vue_type_script_setup_true_lang-0K4ucPlO.js → FilterTabs.vue_vue_type_script_setup_true_lang-C5vnz3qo.js} +411 -136
- package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-C5vnz3qo.js.map +1 -0
- package/dist/{DarkModeToggle.vue_vue_type_script_setup_true_lang-DOrIWBcH.cjs → FilterTabs.vue_vue_type_script_setup_true_lang-HwjuvIJX.cjs} +398 -123
- package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-HwjuvIJX.cjs.map +1 -0
- package/dist/{Button.vue_vue_type_script_setup_true_lang-BHpVJnRn.js → ListSkeleton.vue_vue_type_script_setup_true_lang-BwtEbaiT.js} +7 -102
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-BwtEbaiT.js.map +1 -0
- package/dist/{Button.vue_vue_type_script_setup_true_lang-CLmHDal2.cjs → ListSkeleton.vue_vue_type_script_setup_true_lang-DtwwmfWr.cjs} +6 -101
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-DtwwmfWr.cjs.map +1 -0
- package/dist/{PageLayout.vue_vue_type_script_setup_true_lang-rMu1Z5uH.js → PageHero.vue_vue_type_script_setup_true_lang-C-YXGDTY.js} +244 -97
- package/dist/PageHero.vue_vue_type_script_setup_true_lang-C-YXGDTY.js.map +1 -0
- package/dist/{PageLayout.vue_vue_type_script_setup_true_lang-hhzpkC6_.cjs → PageHero.vue_vue_type_script_setup_true_lang-CKCmOxOa.cjs} +241 -94
- package/dist/PageHero.vue_vue_type_script_setup_true_lang-CKCmOxOa.cjs.map +1 -0
- package/dist/{IconPicker.vue_vue_type_script_setup_true_lang-Ch1x6Ap9.js → TagsInput-C4wBPfrj.js} +1750 -221
- package/dist/TagsInput-C4wBPfrj.js.map +1 -0
- package/dist/{IconPicker.vue_vue_type_script_setup_true_lang-agY_E72J.cjs → TagsInput-ClqgyR9O.cjs} +1748 -219
- package/dist/TagsInput-ClqgyR9O.cjs.map +1 -0
- package/dist/cisse-vue-ui.css +10 -0
- package/dist/components/core/FilterTabs.stories.d.ts +14 -0
- package/dist/components/core/FilterTabs.test.d.ts +1 -0
- package/dist/components/core/FilterTabs.vue.d.ts +29 -0
- package/dist/components/core/StatsCard.stories.d.ts +15 -0
- package/dist/components/core/StatsCard.test.d.ts +1 -0
- package/dist/components/core/StatsCard.vue.d.ts +44 -0
- package/dist/components/core/StatsGrid.stories.d.ts +12 -0
- package/dist/components/core/StatsGrid.test.d.ts +1 -0
- package/dist/components/core/StatsGrid.vue.d.ts +16 -0
- package/dist/components/core/index.cjs +24 -21
- package/dist/components/core/index.cjs.map +1 -1
- package/dist/components/core/index.d.ts +5 -0
- package/dist/components/core/index.js +5 -2
- package/dist/components/feedback/index.cjs +5 -5
- package/dist/components/feedback/index.js +5 -5
- package/dist/components/form/EmailInput.stories.d.ts +13 -0
- package/dist/components/form/EmailInput.test.d.ts +1 -0
- package/dist/components/form/EmailInput.vue.d.ts +32 -0
- package/dist/components/form/FormActions.stories.d.ts +18 -0
- package/dist/components/form/FormActions.test.d.ts +1 -0
- package/dist/components/form/FormActions.vue.d.ts +56 -0
- package/dist/components/form/FormInput.vue.d.ts +1 -1
- package/dist/components/form/FormSection.stories.d.ts +13 -0
- package/dist/components/form/FormSection.test.d.ts +1 -0
- package/dist/components/form/FormSection.vue.d.ts +49 -0
- package/dist/components/form/InputWrapper.stories.d.ts +16 -0
- package/dist/components/form/InputWrapper.test.d.ts +1 -0
- package/dist/components/form/InputWrapper.vue.d.ts +40 -0
- package/dist/components/form/MoneyInput.stories.d.ts +16 -0
- package/dist/components/form/MoneyInput.test.d.ts +1 -0
- package/dist/components/form/MoneyInput.vue.d.ts +40 -0
- package/dist/components/form/NumberInput.stories.d.ts +14 -0
- package/dist/components/form/NumberInput.test.d.ts +1 -0
- package/dist/components/form/NumberInput.vue.d.ts +39 -0
- package/dist/components/form/OTPInput.stories.d.ts +13 -0
- package/dist/components/form/OTPInput.test.d.ts +1 -0
- package/dist/components/form/OTPInput.vue.d.ts +33 -0
- package/dist/components/form/PasswordInput.stories.d.ts +15 -0
- package/dist/components/form/PasswordInput.test.d.ts +1 -0
- package/dist/components/form/PasswordInput.vue.d.ts +36 -0
- package/dist/components/form/PercentInput.stories.d.ts +12 -0
- package/dist/components/form/PercentInput.test.d.ts +1 -0
- package/dist/components/form/PercentInput.vue.d.ts +38 -0
- package/dist/components/form/PhoneInput.stories.d.ts +13 -0
- package/dist/components/form/PhoneInput.test.d.ts +1 -0
- package/dist/components/form/PhoneInput.vue.d.ts +76 -0
- package/dist/components/form/QuantityInput.stories.d.ts +12 -0
- package/dist/components/form/QuantityInput.test.d.ts +1 -0
- package/dist/components/form/QuantityInput.vue.d.ts +32 -0
- package/dist/components/form/TagsInput.stories.d.ts +13 -0
- package/dist/components/form/TagsInput.test.d.ts +1 -0
- package/dist/components/form/TagsInput.vue.d.ts +37 -0
- package/dist/components/form/URLInput.stories.d.ts +11 -0
- package/dist/components/form/URLInput.test.d.ts +1 -0
- package/dist/components/form/URLInput.vue.d.ts +32 -0
- package/dist/components/form/index.cjs +29 -16
- package/dist/components/form/index.cjs.map +1 -1
- package/dist/components/form/index.d.ts +17 -0
- package/dist/components/form/index.js +16 -3
- package/dist/components/index.cjs +63 -45
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +35 -17
- package/dist/components/index.js.map +1 -1
- package/dist/components/layout/PageHero.stories.d.ts +11 -0
- package/dist/components/layout/PageHero.test.d.ts +1 -0
- package/dist/components/layout/PageHero.vue.d.ts +51 -0
- package/dist/components/layout/index.cjs +5 -4
- package/dist/components/layout/index.cjs.map +1 -1
- package/dist/components/layout/index.d.ts +2 -0
- package/dist/components/layout/index.js +2 -1
- package/dist/index-CRoTVc47.cjs +94 -0
- package/dist/index-CRoTVc47.cjs.map +1 -0
- package/dist/index-D49k0PP0.js +95 -0
- package/dist/index-D49k0PP0.js.map +1 -0
- package/dist/{index-BaWpldIJ.js → index-SNefWfX0.js} +3 -3
- package/dist/{index-BaWpldIJ.js.map → index-SNefWfX0.js.map} +1 -1
- package/dist/index.cjs +64 -46
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +46 -28
- package/dist/index.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/types/form.d.ts +4 -0
- package/package.json +1 -1
- package/dist/Button.vue_vue_type_script_setup_true_lang-BHpVJnRn.js.map +0 -1
- package/dist/Button.vue_vue_type_script_setup_true_lang-CLmHDal2.cjs.map +0 -1
- package/dist/DarkModeToggle.vue_vue_type_script_setup_true_lang-0K4ucPlO.js.map +0 -1
- package/dist/DarkModeToggle.vue_vue_type_script_setup_true_lang-DOrIWBcH.cjs.map +0 -1
- package/dist/IconPicker.vue_vue_type_script_setup_true_lang-Ch1x6Ap9.js.map +0 -1
- package/dist/IconPicker.vue_vue_type_script_setup_true_lang-agY_E72J.cjs.map +0 -1
- package/dist/PageLayout.vue_vue_type_script_setup_true_lang-hhzpkC6_.cjs.map +0 -1
- package/dist/PageLayout.vue_vue_type_script_setup_true_lang-rMu1Z5uH.js.map +0 -1
- package/dist/index-BBUxkeI7.js +0 -77
- package/dist/index-BBUxkeI7.js.map +0 -1
- package/dist/index-BlwU8BWn.cjs +0 -76
- package/dist/index-BlwU8BWn.cjs.map +0 -1
package/dist/{IconPicker.vue_vue_type_script_setup_true_lang-agY_E72J.cjs → TagsInput-ClqgyR9O.cjs}
RENAMED
|
@@ -5,8 +5,9 @@ const vue$1 = require("@iconify/vue");
|
|
|
5
5
|
const useDropdown = require("./useDropdown-DHFnd259.cjs");
|
|
6
6
|
const _pluginVue_exportHelper = require("./_plugin-vue_export-helper-DM9IkUGy.cjs");
|
|
7
7
|
const index = require("./index-D1x3TH9k.cjs");
|
|
8
|
-
const
|
|
9
|
-
const
|
|
8
|
+
const Button_vue_vue_type_script_setup_true_lang = require("./Button.vue_vue_type_script_setup_true_lang-CXRj7LEP.cjs");
|
|
9
|
+
const _hoisted_1$r = ["data-error", "for"];
|
|
10
|
+
const _sfc_main$r = /* @__PURE__ */ vue.defineComponent({
|
|
10
11
|
__name: "FormLabel",
|
|
11
12
|
props: {
|
|
12
13
|
error: { type: [String, Boolean] },
|
|
@@ -20,12 +21,12 @@ const _sfc_main$e = /* @__PURE__ */ vue.defineComponent({
|
|
|
20
21
|
class: "block text-sm font-medium text-gray-700 data-[error=true]:text-red-500 dark:text-gray-300"
|
|
21
22
|
}, [
|
|
22
23
|
vue.renderSlot(_ctx.$slots, "default")
|
|
23
|
-
], 8, _hoisted_1$
|
|
24
|
+
], 8, _hoisted_1$r);
|
|
24
25
|
};
|
|
25
26
|
}
|
|
26
27
|
});
|
|
27
|
-
const _hoisted_1$
|
|
28
|
-
const _sfc_main$
|
|
28
|
+
const _hoisted_1$q = ["id", "data-error", "role", "aria-live"];
|
|
29
|
+
const _sfc_main$q = /* @__PURE__ */ vue.defineComponent({
|
|
29
30
|
__name: "FormHelp",
|
|
30
31
|
props: {
|
|
31
32
|
id: {},
|
|
@@ -44,12 +45,18 @@ const _sfc_main$d = /* @__PURE__ */ vue.defineComponent({
|
|
|
44
45
|
vue.renderSlot(_ctx.$slots, "default", {}, () => [
|
|
45
46
|
vue.createTextVNode(vue.toDisplayString(__props.text ?? ""), 1)
|
|
46
47
|
])
|
|
47
|
-
], 8, _hoisted_1$
|
|
48
|
+
], 8, _hoisted_1$q);
|
|
48
49
|
};
|
|
49
50
|
}
|
|
50
51
|
});
|
|
51
|
-
const _hoisted_1$
|
|
52
|
-
|
|
52
|
+
const _hoisted_1$p = {
|
|
53
|
+
key: 0,
|
|
54
|
+
class: "relative"
|
|
55
|
+
};
|
|
56
|
+
const _hoisted_2$j = ["id", "disabled", "name", "placeholder", "type", "required", "aria-invalid", "aria-required", "aria-describedby"];
|
|
57
|
+
const _hoisted_3$g = ["id", "disabled", "name", "placeholder", "type", "required", "aria-invalid", "aria-required", "aria-describedby"];
|
|
58
|
+
const baseInputClass = "block w-full rounded-xl border border-gray-200 bg-gray-50 text-sm text-gray-900 placeholder-gray-400 transition-all focus:border-primary-500 focus:ring-2 focus:ring-primary-500 focus:bg-white focus:outline-hidden disabled:border-gray-200 disabled:bg-gray-100 disabled:text-gray-500 disabled:cursor-not-allowed dark:border-slate-600 dark:bg-slate-700 dark:text-white dark:placeholder-gray-500 dark:focus:border-primary-500 dark:focus:ring-primary-500 dark:focus:bg-slate-600 dark:disabled:bg-slate-800 dark:disabled:text-gray-500";
|
|
59
|
+
const _sfc_main$p = /* @__PURE__ */ vue.defineComponent({
|
|
53
60
|
__name: "FormInput",
|
|
54
61
|
props: /* @__PURE__ */ vue.mergeModels({
|
|
55
62
|
type: { default: "text" },
|
|
@@ -60,7 +67,9 @@ const _sfc_main$c = /* @__PURE__ */ vue.defineComponent({
|
|
|
60
67
|
id: {},
|
|
61
68
|
name: {},
|
|
62
69
|
required: { type: Boolean },
|
|
63
|
-
describedBy: {}
|
|
70
|
+
describedBy: {},
|
|
71
|
+
icon: {},
|
|
72
|
+
iconRight: {}
|
|
64
73
|
}, {
|
|
65
74
|
"modelValue": {},
|
|
66
75
|
"modelModifiers": {}
|
|
@@ -70,9 +79,41 @@ const _sfc_main$c = /* @__PURE__ */ vue.defineComponent({
|
|
|
70
79
|
const props = __props;
|
|
71
80
|
const modelValue = vue.useModel(__props, "modelValue");
|
|
72
81
|
return (_ctx, _cache) => {
|
|
73
|
-
return
|
|
82
|
+
return props.icon || props.iconRight ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$p, [
|
|
83
|
+
props.icon ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
|
|
84
|
+
key: 0,
|
|
85
|
+
icon: props.icon,
|
|
86
|
+
class: "absolute left-3 top-1/2 -translate-y-1/2 size-5 text-gray-400 pointer-events-none"
|
|
87
|
+
}, null, 8, ["icon"])) : vue.createCommentVNode("", true),
|
|
88
|
+
vue.withDirectives(vue.createElementVNode("input", vue.mergeProps({
|
|
89
|
+
id: props.id ?? props.name ?? "",
|
|
90
|
+
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => modelValue.value = $event),
|
|
91
|
+
disabled: props.disabled,
|
|
92
|
+
name: props.name ?? "",
|
|
93
|
+
placeholder: props.placeholder,
|
|
94
|
+
type: props.type,
|
|
95
|
+
required: props.required,
|
|
96
|
+
"aria-invalid": props.invalid || void 0,
|
|
97
|
+
"aria-required": props.required || void 0,
|
|
98
|
+
"aria-describedby": props.describedBy || void 0,
|
|
99
|
+
class: [
|
|
100
|
+
baseInputClass,
|
|
101
|
+
"py-3",
|
|
102
|
+
props.icon ? "pl-10" : "pl-4",
|
|
103
|
+
props.iconRight ? "pr-10" : "pr-4"
|
|
104
|
+
]
|
|
105
|
+
}, _ctx.$attrs), null, 16, _hoisted_2$j), [
|
|
106
|
+
[vue.vModelDynamic, modelValue.value]
|
|
107
|
+
]),
|
|
108
|
+
props.iconRight ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
|
|
109
|
+
key: 1,
|
|
110
|
+
icon: props.iconRight,
|
|
111
|
+
class: "absolute right-3 top-1/2 -translate-y-1/2 size-5 text-gray-400 pointer-events-none"
|
|
112
|
+
}, null, 8, ["icon"])) : vue.createCommentVNode("", true)
|
|
113
|
+
])) : vue.withDirectives((vue.openBlock(), vue.createElementBlock("input", vue.mergeProps({
|
|
114
|
+
key: 1,
|
|
74
115
|
id: props.id ?? props.name ?? "",
|
|
75
|
-
"onUpdate:modelValue": _cache[
|
|
116
|
+
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => modelValue.value = $event),
|
|
76
117
|
disabled: props.disabled,
|
|
77
118
|
name: props.name ?? "",
|
|
78
119
|
placeholder: props.placeholder,
|
|
@@ -81,36 +122,36 @@ const _sfc_main$c = /* @__PURE__ */ vue.defineComponent({
|
|
|
81
122
|
"aria-invalid": props.invalid || void 0,
|
|
82
123
|
"aria-required": props.required || void 0,
|
|
83
124
|
"aria-describedby": props.describedBy || void 0,
|
|
84
|
-
class: "
|
|
85
|
-
}, _ctx.$attrs), null, 16,
|
|
125
|
+
class: [baseInputClass, "px-4 py-3"]
|
|
126
|
+
}, _ctx.$attrs), null, 16, _hoisted_3$g)), [
|
|
86
127
|
[vue.vModelDynamic, modelValue.value]
|
|
87
128
|
]);
|
|
88
129
|
};
|
|
89
130
|
}
|
|
90
131
|
});
|
|
91
|
-
const _hoisted_1$
|
|
92
|
-
const _hoisted_2$
|
|
93
|
-
const _hoisted_3$
|
|
94
|
-
const _hoisted_4$
|
|
95
|
-
const _hoisted_5$
|
|
132
|
+
const _hoisted_1$o = { class: "relative" };
|
|
133
|
+
const _hoisted_2$i = ["id", "disabled", "aria-expanded", "aria-controls", "aria-invalid", "aria-describedby"];
|
|
134
|
+
const _hoisted_3$f = { class: "flex-1 truncate" };
|
|
135
|
+
const _hoisted_4$b = ["id", "aria-label"];
|
|
136
|
+
const _hoisted_5$8 = {
|
|
96
137
|
key: 0,
|
|
97
138
|
class: "sticky top-0 border-b border-gray-200 bg-white p-2 dark:border-gray-700 dark:bg-gray-800"
|
|
98
139
|
};
|
|
99
|
-
const _hoisted_6$
|
|
100
|
-
const _hoisted_7$
|
|
140
|
+
const _hoisted_6$8 = { class: "flex items-center gap-2 rounded-md border border-gray-300 bg-gray-50 px-2 py-1.5 dark:border-gray-600 dark:bg-gray-900" };
|
|
141
|
+
const _hoisted_7$7 = {
|
|
101
142
|
key: 1,
|
|
102
143
|
class: "px-4 py-3 text-sm text-gray-500 dark:text-gray-400",
|
|
103
144
|
role: "status"
|
|
104
145
|
};
|
|
105
|
-
const _hoisted_8$
|
|
106
|
-
const _hoisted_9$
|
|
107
|
-
const _hoisted_10$
|
|
146
|
+
const _hoisted_8$6 = { class: "py-1" };
|
|
147
|
+
const _hoisted_9$4 = ["aria-selected", "data-index", "onClick", "onMouseenter"];
|
|
148
|
+
const _hoisted_10$4 = {
|
|
108
149
|
key: 1,
|
|
109
150
|
class: "size-4 shrink-0",
|
|
110
151
|
"aria-hidden": "true"
|
|
111
152
|
};
|
|
112
|
-
const _hoisted_11$
|
|
113
|
-
const _sfc_main$
|
|
153
|
+
const _hoisted_11$4 = { class: "flex-1" };
|
|
154
|
+
const _sfc_main$o = /* @__PURE__ */ vue.defineComponent({
|
|
114
155
|
__name: "FormSelect",
|
|
115
156
|
props: /* @__PURE__ */ vue.mergeModels({
|
|
116
157
|
options: {},
|
|
@@ -123,6 +164,8 @@ const _sfc_main$b = /* @__PURE__ */ vue.defineComponent({
|
|
|
123
164
|
name: {},
|
|
124
165
|
required: { type: Boolean },
|
|
125
166
|
describedBy: {},
|
|
167
|
+
icon: {},
|
|
168
|
+
iconRight: {},
|
|
126
169
|
teleport: { type: Boolean, default: true },
|
|
127
170
|
searchable: { type: Boolean, default: false },
|
|
128
171
|
noResultsText: { default: "No results found" },
|
|
@@ -228,7 +271,7 @@ const _sfc_main$b = /* @__PURE__ */ vue.defineComponent({
|
|
|
228
271
|
return [base, state, text, props.triggerClass];
|
|
229
272
|
});
|
|
230
273
|
return (_ctx, _cache) => {
|
|
231
|
-
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$
|
|
274
|
+
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$o, [
|
|
232
275
|
vue.createElementVNode("button", {
|
|
233
276
|
id: triggerId.value,
|
|
234
277
|
ref_key: "triggerRef",
|
|
@@ -248,14 +291,14 @@ const _sfc_main$b = /* @__PURE__ */ vue.defineComponent({
|
|
|
248
291
|
option: selectedOption.value,
|
|
249
292
|
placeholder: __props.placeholder
|
|
250
293
|
}, () => [
|
|
251
|
-
vue.createElementVNode("span", _hoisted_3$
|
|
294
|
+
vue.createElementVNode("span", _hoisted_3$f, vue.toDisplayString(displayValue.value), 1)
|
|
252
295
|
]),
|
|
253
296
|
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
254
297
|
icon: "lucide:chevron-down",
|
|
255
298
|
class: vue.normalizeClass(["size-4 shrink-0 text-gray-400 transition-transform", vue.unref(isOpen) && "rotate-180"]),
|
|
256
299
|
"aria-hidden": "true"
|
|
257
300
|
}, null, 8, ["class"])
|
|
258
|
-
], 42, _hoisted_2$
|
|
301
|
+
], 42, _hoisted_2$i),
|
|
259
302
|
(vue.openBlock(), vue.createBlock(vue.Teleport, {
|
|
260
303
|
to: "body",
|
|
261
304
|
disabled: !__props.teleport
|
|
@@ -282,8 +325,8 @@ const _sfc_main$b = /* @__PURE__ */ vue.defineComponent({
|
|
|
282
325
|
!__props.teleport && "absolute mt-1 w-full"
|
|
283
326
|
])
|
|
284
327
|
}, [
|
|
285
|
-
__props.searchable ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_5$
|
|
286
|
-
vue.createElementVNode("div", _hoisted_6$
|
|
328
|
+
__props.searchable ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_5$8, [
|
|
329
|
+
vue.createElementVNode("div", _hoisted_6$8, [
|
|
287
330
|
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
288
331
|
icon: "lucide:search",
|
|
289
332
|
class: "size-4 text-gray-400",
|
|
@@ -303,8 +346,8 @@ const _sfc_main$b = /* @__PURE__ */ vue.defineComponent({
|
|
|
303
346
|
])
|
|
304
347
|
])
|
|
305
348
|
])) : vue.createCommentVNode("", true),
|
|
306
|
-
filteredOptions.value.length === 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_7$
|
|
307
|
-
vue.createElementVNode("div", _hoisted_8$
|
|
349
|
+
filteredOptions.value.length === 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_7$7, vue.toDisplayString(__props.noResultsText), 1)) : vue.createCommentVNode("", true),
|
|
350
|
+
vue.createElementVNode("div", _hoisted_8$6, [
|
|
308
351
|
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(filteredOptions.value, (option, index2) => {
|
|
309
352
|
return vue.openBlock(), vue.createElementBlock("button", {
|
|
310
353
|
key: String(option.value),
|
|
@@ -331,13 +374,13 @@ const _sfc_main$b = /* @__PURE__ */ vue.defineComponent({
|
|
|
331
374
|
icon: "lucide:check",
|
|
332
375
|
class: "size-4 shrink-0 text-primary",
|
|
333
376
|
"aria-hidden": "true"
|
|
334
|
-
})) : (vue.openBlock(), vue.createElementBlock("span", _hoisted_10$
|
|
335
|
-
vue.createElementVNode("span", _hoisted_11$
|
|
377
|
+
})) : (vue.openBlock(), vue.createElementBlock("span", _hoisted_10$4)),
|
|
378
|
+
vue.createElementVNode("span", _hoisted_11$4, vue.toDisplayString(option.label), 1)
|
|
336
379
|
])
|
|
337
|
-
], 42, _hoisted_9$
|
|
380
|
+
], 42, _hoisted_9$4);
|
|
338
381
|
}), 128))
|
|
339
382
|
])
|
|
340
|
-
], 14, _hoisted_4$
|
|
383
|
+
], 14, _hoisted_4$b)) : vue.createCommentVNode("", true)
|
|
341
384
|
]),
|
|
342
385
|
_: 3
|
|
343
386
|
})
|
|
@@ -346,8 +389,8 @@ const _sfc_main$b = /* @__PURE__ */ vue.defineComponent({
|
|
|
346
389
|
};
|
|
347
390
|
}
|
|
348
391
|
});
|
|
349
|
-
const _hoisted_1$
|
|
350
|
-
const _sfc_main$
|
|
392
|
+
const _hoisted_1$n = ["hidden"];
|
|
393
|
+
const _sfc_main$n = /* @__PURE__ */ vue.defineComponent({
|
|
351
394
|
__name: "FormGroup",
|
|
352
395
|
props: /* @__PURE__ */ vue.mergeModels({
|
|
353
396
|
label: {},
|
|
@@ -364,6 +407,8 @@ const _sfc_main$a = /* @__PURE__ */ vue.defineComponent({
|
|
|
364
407
|
name: {},
|
|
365
408
|
required: { type: Boolean },
|
|
366
409
|
describedBy: {},
|
|
410
|
+
icon: {},
|
|
411
|
+
iconRight: {},
|
|
367
412
|
options: {}
|
|
368
413
|
}, {
|
|
369
414
|
"modelValue": {},
|
|
@@ -386,7 +431,7 @@ const _sfc_main$a = /* @__PURE__ */ vue.defineComponent({
|
|
|
386
431
|
}, [
|
|
387
432
|
vue.renderSlot(_ctx.$slots, "default", {}, () => [
|
|
388
433
|
vue.renderSlot(_ctx.$slots, "label", {}, () => [
|
|
389
|
-
__props.label ? (vue.openBlock(), vue.createBlock(_sfc_main$
|
|
434
|
+
__props.label ? (vue.openBlock(), vue.createBlock(_sfc_main$r, {
|
|
390
435
|
key: 0,
|
|
391
436
|
"html-for": inputId.value,
|
|
392
437
|
error: __props.error
|
|
@@ -398,7 +443,7 @@ const _sfc_main$a = /* @__PURE__ */ vue.defineComponent({
|
|
|
398
443
|
}, 8, ["html-for", "error"])) : vue.createCommentVNode("", true)
|
|
399
444
|
]),
|
|
400
445
|
vue.renderSlot(_ctx.$slots, "input", {}, () => [
|
|
401
|
-
isSelect.value ? (vue.openBlock(), vue.createBlock(_sfc_main$
|
|
446
|
+
isSelect.value ? (vue.openBlock(), vue.createBlock(_sfc_main$o, vue.mergeProps({
|
|
402
447
|
key: 0,
|
|
403
448
|
modelValue: modelValue.value,
|
|
404
449
|
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => modelValue.value = $event)
|
|
@@ -406,7 +451,7 @@ const _sfc_main$a = /* @__PURE__ */ vue.defineComponent({
|
|
|
406
451
|
id: inputId.value,
|
|
407
452
|
invalid: Boolean(__props.error),
|
|
408
453
|
"described-by": hasError.value ? helpId.value : void 0
|
|
409
|
-
}), null, 16, ["modelValue", "id", "invalid", "described-by"])) : (vue.openBlock(), vue.createBlock(_sfc_main$
|
|
454
|
+
}), null, 16, ["modelValue", "id", "invalid", "described-by"])) : (vue.openBlock(), vue.createBlock(_sfc_main$p, vue.mergeProps({
|
|
410
455
|
key: 1,
|
|
411
456
|
modelValue: modelValue.value,
|
|
412
457
|
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => modelValue.value = $event)
|
|
@@ -416,7 +461,7 @@ const _sfc_main$a = /* @__PURE__ */ vue.defineComponent({
|
|
|
416
461
|
"described-by": hasError.value ? helpId.value : void 0
|
|
417
462
|
}), null, 16, ["modelValue", "id", "invalid", "described-by"]))
|
|
418
463
|
]),
|
|
419
|
-
hasError.value ? (vue.openBlock(), vue.createBlock(_sfc_main$
|
|
464
|
+
hasError.value ? (vue.openBlock(), vue.createBlock(_sfc_main$q, {
|
|
420
465
|
key: 0,
|
|
421
466
|
id: helpId.value,
|
|
422
467
|
error: true
|
|
@@ -427,13 +472,13 @@ const _sfc_main$a = /* @__PURE__ */ vue.defineComponent({
|
|
|
427
472
|
_: 1
|
|
428
473
|
}, 8, ["id"])) : vue.createCommentVNode("", true)
|
|
429
474
|
])
|
|
430
|
-
], 12, _hoisted_1$
|
|
475
|
+
], 12, _hoisted_1$n);
|
|
431
476
|
};
|
|
432
477
|
}
|
|
433
478
|
});
|
|
434
|
-
const _hoisted_1$
|
|
435
|
-
const _hoisted_2$
|
|
436
|
-
const _sfc_main$
|
|
479
|
+
const _hoisted_1$m = { class: "relative" };
|
|
480
|
+
const _hoisted_2$h = ["disabled", "placeholder", "value"];
|
|
481
|
+
const _sfc_main$m = /* @__PURE__ */ vue.defineComponent({
|
|
437
482
|
__name: "SearchInput",
|
|
438
483
|
props: {
|
|
439
484
|
modelValue: {},
|
|
@@ -449,7 +494,7 @@ const _sfc_main$9 = /* @__PURE__ */ vue.defineComponent({
|
|
|
449
494
|
emit("update:modelValue", target.value);
|
|
450
495
|
};
|
|
451
496
|
return (_ctx, _cache) => {
|
|
452
|
-
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$
|
|
497
|
+
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$m, [
|
|
453
498
|
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
454
499
|
icon: __props.icon,
|
|
455
500
|
class: "absolute top-1/2 left-3 size-5 -translate-y-1/2 text-gray-400"
|
|
@@ -461,19 +506,19 @@ const _sfc_main$9 = /* @__PURE__ */ vue.defineComponent({
|
|
|
461
506
|
class: "focus:border-primary focus:ring-primary w-full rounded-lg border border-gray-300 bg-white py-2 pr-4 pl-10 text-gray-900 placeholder-gray-400 transition-colors disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-500",
|
|
462
507
|
type: "text",
|
|
463
508
|
onInput: handleInput
|
|
464
|
-
}, null, 40, _hoisted_2$
|
|
509
|
+
}, null, 40, _hoisted_2$h)
|
|
465
510
|
]);
|
|
466
511
|
};
|
|
467
512
|
}
|
|
468
513
|
});
|
|
469
|
-
const _hoisted_1$
|
|
470
|
-
const _hoisted_2$
|
|
514
|
+
const _hoisted_1$l = ["id", "aria-checked", "aria-labelledby", "aria-describedby", "disabled"];
|
|
515
|
+
const _hoisted_2$g = {
|
|
471
516
|
key: 0,
|
|
472
517
|
class: "flex flex-col"
|
|
473
518
|
};
|
|
474
|
-
const _hoisted_3$
|
|
475
|
-
const _hoisted_4$
|
|
476
|
-
const _sfc_main$
|
|
519
|
+
const _hoisted_3$e = ["id"];
|
|
520
|
+
const _hoisted_4$a = ["id"];
|
|
521
|
+
const _sfc_main$l = /* @__PURE__ */ vue.defineComponent({
|
|
477
522
|
__name: "Switch",
|
|
478
523
|
props: {
|
|
479
524
|
modelValue: { type: Boolean, default: false },
|
|
@@ -537,35 +582,35 @@ const _sfc_main$8 = /* @__PURE__ */ vue.defineComponent({
|
|
|
537
582
|
]),
|
|
538
583
|
"aria-hidden": "true"
|
|
539
584
|
}, null, 2)
|
|
540
|
-
], 10, _hoisted_1$
|
|
541
|
-
__props.label || __props.description ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$
|
|
585
|
+
], 10, _hoisted_1$l),
|
|
586
|
+
__props.label || __props.description ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$g, [
|
|
542
587
|
__props.label ? (vue.openBlock(), vue.createElementBlock("span", {
|
|
543
588
|
key: 0,
|
|
544
589
|
id: labelId.value,
|
|
545
590
|
class: "text-sm font-medium text-gray-900 dark:text-white"
|
|
546
|
-
}, vue.toDisplayString(__props.label), 9, _hoisted_3$
|
|
591
|
+
}, vue.toDisplayString(__props.label), 9, _hoisted_3$e)) : vue.createCommentVNode("", true),
|
|
547
592
|
__props.description ? (vue.openBlock(), vue.createElementBlock("span", {
|
|
548
593
|
key: 1,
|
|
549
594
|
id: descriptionId.value,
|
|
550
595
|
class: "text-sm text-gray-500 dark:text-gray-400"
|
|
551
|
-
}, vue.toDisplayString(__props.description), 9, _hoisted_4$
|
|
596
|
+
}, vue.toDisplayString(__props.description), 9, _hoisted_4$a)) : vue.createCommentVNode("", true)
|
|
552
597
|
])) : vue.createCommentVNode("", true)
|
|
553
598
|
], 2);
|
|
554
599
|
};
|
|
555
600
|
}
|
|
556
601
|
});
|
|
557
|
-
const _hoisted_1$
|
|
558
|
-
const _hoisted_2$
|
|
602
|
+
const _hoisted_1$k = { class: "w-full" };
|
|
603
|
+
const _hoisted_2$f = {
|
|
559
604
|
key: 0,
|
|
560
605
|
class: "mb-2 flex justify-between text-sm"
|
|
561
606
|
};
|
|
562
|
-
const _hoisted_3$
|
|
563
|
-
const _hoisted_4$
|
|
564
|
-
const _hoisted_5$
|
|
565
|
-
const _hoisted_6$
|
|
566
|
-
const _hoisted_7$
|
|
567
|
-
const _hoisted_8$
|
|
568
|
-
const _sfc_main$
|
|
607
|
+
const _hoisted_3$d = { class: "text-gray-600 dark:text-gray-400" };
|
|
608
|
+
const _hoisted_4$9 = { class: "font-medium text-gray-900 dark:text-white" };
|
|
609
|
+
const _hoisted_5$7 = { class: "text-gray-600 dark:text-gray-400" };
|
|
610
|
+
const _hoisted_6$7 = { class: "relative" };
|
|
611
|
+
const _hoisted_7$6 = ["value", "min", "max", "step", "disabled"];
|
|
612
|
+
const _hoisted_8$5 = { class: "pointer-events-none absolute inset-y-0 left-0 flex items-center" };
|
|
613
|
+
const _sfc_main$k = /* @__PURE__ */ vue.defineComponent({
|
|
569
614
|
__name: "Slider",
|
|
570
615
|
props: /* @__PURE__ */ vue.mergeModels({
|
|
571
616
|
min: { default: 0 },
|
|
@@ -596,13 +641,13 @@ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
|
|
|
596
641
|
modelValue.value = Number(target.value);
|
|
597
642
|
};
|
|
598
643
|
return (_ctx, _cache) => {
|
|
599
|
-
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$
|
|
600
|
-
__props.showValue ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$
|
|
601
|
-
vue.createElementVNode("span", _hoisted_3$
|
|
602
|
-
vue.createElementVNode("span", _hoisted_4$
|
|
603
|
-
vue.createElementVNode("span", _hoisted_5$
|
|
644
|
+
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$k, [
|
|
645
|
+
__props.showValue ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$f, [
|
|
646
|
+
vue.createElementVNode("span", _hoisted_3$d, vue.toDisplayString(__props.min), 1),
|
|
647
|
+
vue.createElementVNode("span", _hoisted_4$9, vue.toDisplayString(displayValue.value), 1),
|
|
648
|
+
vue.createElementVNode("span", _hoisted_5$7, vue.toDisplayString(__props.max), 1)
|
|
604
649
|
])) : vue.createCommentVNode("", true),
|
|
605
|
-
vue.createElementVNode("div", _hoisted_6$
|
|
650
|
+
vue.createElementVNode("div", _hoisted_6$7, [
|
|
606
651
|
vue.createElementVNode("input", {
|
|
607
652
|
type: "range",
|
|
608
653
|
value: modelValue.value,
|
|
@@ -612,8 +657,8 @@ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
|
|
|
612
657
|
disabled: __props.disabled,
|
|
613
658
|
class: "slider-input w-full cursor-pointer appearance-none bg-transparent disabled:cursor-not-allowed disabled:opacity-50",
|
|
614
659
|
onInput: handleInput
|
|
615
|
-
}, null, 40, _hoisted_7$
|
|
616
|
-
vue.createElementVNode("div", _hoisted_8$
|
|
660
|
+
}, null, 40, _hoisted_7$6),
|
|
661
|
+
vue.createElementVNode("div", _hoisted_8$5, [
|
|
617
662
|
vue.createElementVNode("div", {
|
|
618
663
|
class: "h-2 rounded-full bg-primary",
|
|
619
664
|
style: vue.normalizeStyle({ width: `${percentage.value}%` })
|
|
@@ -624,27 +669,27 @@ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
|
|
|
624
669
|
};
|
|
625
670
|
}
|
|
626
671
|
});
|
|
627
|
-
const Slider = /* @__PURE__ */ _pluginVue_exportHelper._export_sfc(_sfc_main$
|
|
628
|
-
const _hoisted_1$
|
|
629
|
-
const _hoisted_2$
|
|
630
|
-
const _hoisted_3$
|
|
631
|
-
const _hoisted_4$
|
|
632
|
-
const _hoisted_5$
|
|
633
|
-
const _hoisted_6$
|
|
634
|
-
const _hoisted_7$
|
|
672
|
+
const Slider = /* @__PURE__ */ _pluginVue_exportHelper._export_sfc(_sfc_main$k, [["__scopeId", "data-v-c25e2c2a"]]);
|
|
673
|
+
const _hoisted_1$j = { class: "relative" };
|
|
674
|
+
const _hoisted_2$e = ["id", "disabled", "aria-expanded", "aria-controls"];
|
|
675
|
+
const _hoisted_3$c = { class: "flex-1 truncate" };
|
|
676
|
+
const _hoisted_4$8 = { class: "flex items-center gap-1" };
|
|
677
|
+
const _hoisted_5$6 = ["id", "aria-label"];
|
|
678
|
+
const _hoisted_6$6 = { class: "mb-4 flex items-center justify-between" };
|
|
679
|
+
const _hoisted_7$5 = {
|
|
635
680
|
class: "font-medium text-gray-900 dark:text-white",
|
|
636
681
|
"aria-live": "polite",
|
|
637
682
|
"aria-atomic": "true"
|
|
638
683
|
};
|
|
639
|
-
const _hoisted_8$
|
|
684
|
+
const _hoisted_8$4 = {
|
|
640
685
|
class: "mb-2 grid grid-cols-7 gap-1",
|
|
641
686
|
role: "row"
|
|
642
687
|
};
|
|
643
|
-
const _hoisted_9$
|
|
644
|
-
const _hoisted_10$
|
|
645
|
-
const _hoisted_11$
|
|
646
|
-
const _hoisted_12$
|
|
647
|
-
const _sfc_main$
|
|
688
|
+
const _hoisted_9$3 = ["abbr"];
|
|
689
|
+
const _hoisted_10$3 = ["id", "aria-label"];
|
|
690
|
+
const _hoisted_11$3 = ["aria-label", "aria-selected", "aria-disabled", "disabled", "onClick"];
|
|
691
|
+
const _hoisted_12$2 = { class: "mt-4 border-t border-gray-200 pt-3 dark:border-gray-700" };
|
|
692
|
+
const _sfc_main$j = /* @__PURE__ */ vue.defineComponent({
|
|
648
693
|
__name: "DatePicker",
|
|
649
694
|
props: /* @__PURE__ */ vue.mergeModels({
|
|
650
695
|
placeholder: { default: "Select date" },
|
|
@@ -768,7 +813,7 @@ const _sfc_main$6 = /* @__PURE__ */ vue.defineComponent({
|
|
|
768
813
|
return formatter.format(date);
|
|
769
814
|
};
|
|
770
815
|
return (_ctx, _cache) => {
|
|
771
|
-
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$
|
|
816
|
+
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$j, [
|
|
772
817
|
vue.createElementVNode("button", {
|
|
773
818
|
id: triggerId.value,
|
|
774
819
|
ref_key: "triggerRef",
|
|
@@ -786,8 +831,8 @@ const _sfc_main$6 = /* @__PURE__ */ vue.defineComponent({
|
|
|
786
831
|
onClick: _cache[0] || (_cache[0] = //@ts-ignore
|
|
787
832
|
(...args) => vue.unref(toggle) && vue.unref(toggle)(...args))
|
|
788
833
|
}, [
|
|
789
|
-
vue.createElementVNode("span", _hoisted_3$
|
|
790
|
-
vue.createElementVNode("div", _hoisted_4$
|
|
834
|
+
vue.createElementVNode("span", _hoisted_3$c, vue.toDisplayString(displayValue.value || __props.placeholder), 1),
|
|
835
|
+
vue.createElementVNode("div", _hoisted_4$8, [
|
|
791
836
|
modelValue.value ? (vue.openBlock(), vue.createElementBlock("button", {
|
|
792
837
|
key: 0,
|
|
793
838
|
type: "button",
|
|
@@ -807,7 +852,7 @@ const _sfc_main$6 = /* @__PURE__ */ vue.defineComponent({
|
|
|
807
852
|
"aria-hidden": "true"
|
|
808
853
|
})
|
|
809
854
|
])
|
|
810
|
-
], 10, _hoisted_2$
|
|
855
|
+
], 10, _hoisted_2$e),
|
|
811
856
|
(vue.openBlock(), vue.createBlock(vue.Teleport, {
|
|
812
857
|
to: "body",
|
|
813
858
|
disabled: !__props.teleport
|
|
@@ -832,7 +877,7 @@ const _sfc_main$6 = /* @__PURE__ */ vue.defineComponent({
|
|
|
832
877
|
style: vue.normalizeStyle(vue.unref(dropdownStyle)),
|
|
833
878
|
class: "z-9999 w-72 rounded-lg border border-gray-200 bg-white p-4 shadow-lg dark:border-gray-700 dark:bg-gray-800"
|
|
834
879
|
}, [
|
|
835
|
-
vue.createElementVNode("div", _hoisted_6$
|
|
880
|
+
vue.createElementVNode("div", _hoisted_6$6, [
|
|
836
881
|
vue.createElementVNode("button", {
|
|
837
882
|
type: "button",
|
|
838
883
|
class: "rounded p-1 hover:bg-gray-100 dark:hover:bg-gray-700",
|
|
@@ -845,7 +890,7 @@ const _sfc_main$6 = /* @__PURE__ */ vue.defineComponent({
|
|
|
845
890
|
"aria-hidden": "true"
|
|
846
891
|
})
|
|
847
892
|
]),
|
|
848
|
-
vue.createElementVNode("span", _hoisted_7$
|
|
893
|
+
vue.createElementVNode("span", _hoisted_7$5, vue.toDisplayString(monthYear.value), 1),
|
|
849
894
|
vue.createElementVNode("button", {
|
|
850
895
|
type: "button",
|
|
851
896
|
class: "rounded p-1 hover:bg-gray-100 dark:hover:bg-gray-700",
|
|
@@ -859,14 +904,14 @@ const _sfc_main$6 = /* @__PURE__ */ vue.defineComponent({
|
|
|
859
904
|
})
|
|
860
905
|
])
|
|
861
906
|
]),
|
|
862
|
-
vue.createElementVNode("div", _hoisted_8$
|
|
907
|
+
vue.createElementVNode("div", _hoisted_8$4, [
|
|
863
908
|
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(weekDays.value, (day) => {
|
|
864
909
|
return vue.openBlock(), vue.createElementBlock("div", {
|
|
865
910
|
key: day,
|
|
866
911
|
class: "text-center text-xs font-medium text-gray-500 dark:text-gray-400",
|
|
867
912
|
role: "columnheader",
|
|
868
913
|
abbr: day
|
|
869
|
-
}, vue.toDisplayString(day), 9, _hoisted_9$
|
|
914
|
+
}, vue.toDisplayString(day), 9, _hoisted_9$3);
|
|
870
915
|
}), 128))
|
|
871
916
|
]),
|
|
872
917
|
vue.createElementVNode("div", {
|
|
@@ -893,17 +938,17 @@ const _sfc_main$6 = /* @__PURE__ */ vue.defineComponent({
|
|
|
893
938
|
day.isSelected && "bg-primary text-white font-semibold"
|
|
894
939
|
]),
|
|
895
940
|
onClick: ($event) => selectDate(day)
|
|
896
|
-
}, vue.toDisplayString(day.date.getDate()), 11, _hoisted_11$
|
|
941
|
+
}, vue.toDisplayString(day.date.getDate()), 11, _hoisted_11$3);
|
|
897
942
|
}), 128))
|
|
898
|
-
], 8, _hoisted_10$
|
|
899
|
-
vue.createElementVNode("div", _hoisted_12$
|
|
943
|
+
], 8, _hoisted_10$3),
|
|
944
|
+
vue.createElementVNode("div", _hoisted_12$2, [
|
|
900
945
|
vue.createElementVNode("button", {
|
|
901
946
|
type: "button",
|
|
902
947
|
class: "w-full rounded py-1.5 text-sm font-medium text-primary hover:bg-primary/10",
|
|
903
948
|
onClick: _cache[1] || (_cache[1] = ($event) => selectDate({ date: /* @__PURE__ */ new Date(), isDisabled: false }))
|
|
904
949
|
}, " Today ")
|
|
905
950
|
])
|
|
906
|
-
], 12, _hoisted_5$
|
|
951
|
+
], 12, _hoisted_5$6)) : vue.createCommentVNode("", true)
|
|
907
952
|
]),
|
|
908
953
|
_: 1
|
|
909
954
|
})
|
|
@@ -912,27 +957,27 @@ const _sfc_main$6 = /* @__PURE__ */ vue.defineComponent({
|
|
|
912
957
|
};
|
|
913
958
|
}
|
|
914
959
|
});
|
|
915
|
-
const _hoisted_1$
|
|
916
|
-
const _hoisted_2$
|
|
917
|
-
const _hoisted_3$
|
|
918
|
-
const _hoisted_4$
|
|
919
|
-
const _hoisted_5$
|
|
960
|
+
const _hoisted_1$i = { class: "space-y-4" };
|
|
961
|
+
const _hoisted_2$d = ["accept", "multiple", "disabled"];
|
|
962
|
+
const _hoisted_3$b = { class: "space-y-2" };
|
|
963
|
+
const _hoisted_4$7 = { class: "text-sm font-medium text-gray-700 dark:text-gray-300" };
|
|
964
|
+
const _hoisted_5$5 = {
|
|
920
965
|
key: 0,
|
|
921
966
|
class: "text-xs text-gray-500 dark:text-gray-400"
|
|
922
967
|
};
|
|
923
|
-
const _hoisted_6$
|
|
968
|
+
const _hoisted_6$5 = {
|
|
924
969
|
key: 1,
|
|
925
970
|
class: "text-xs text-gray-500 dark:text-gray-400"
|
|
926
971
|
};
|
|
927
|
-
const _hoisted_7$
|
|
972
|
+
const _hoisted_7$4 = {
|
|
928
973
|
key: 0,
|
|
929
974
|
class: "space-y-2"
|
|
930
975
|
};
|
|
931
|
-
const _hoisted_8$
|
|
932
|
-
const _hoisted_9$
|
|
933
|
-
const _hoisted_10$
|
|
934
|
-
const _hoisted_11$
|
|
935
|
-
const _sfc_main$
|
|
976
|
+
const _hoisted_8$3 = { class: "flex-1 min-w-0" };
|
|
977
|
+
const _hoisted_9$2 = { class: "text-sm font-medium text-gray-700 dark:text-gray-300 truncate" };
|
|
978
|
+
const _hoisted_10$2 = { class: "text-xs text-gray-500 dark:text-gray-400" };
|
|
979
|
+
const _hoisted_11$2 = ["onClick"];
|
|
980
|
+
const _sfc_main$i = /* @__PURE__ */ vue.defineComponent({
|
|
936
981
|
__name: "FileUpload",
|
|
937
982
|
props: {
|
|
938
983
|
accept: {},
|
|
@@ -1060,7 +1105,7 @@ const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
|
|
|
1060
1105
|
return "heroicons:document";
|
|
1061
1106
|
};
|
|
1062
1107
|
return (_ctx, _cache) => {
|
|
1063
|
-
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$
|
|
1108
|
+
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$i, [
|
|
1064
1109
|
vue.createElementVNode("div", {
|
|
1065
1110
|
class: vue.normalizeClass(dropzoneClasses.value),
|
|
1066
1111
|
onDrop: vue.withModifiers(handleDrop, ["prevent"]),
|
|
@@ -1077,18 +1122,18 @@ const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
|
|
|
1077
1122
|
multiple: __props.multiple,
|
|
1078
1123
|
disabled: __props.disabled,
|
|
1079
1124
|
onChange: handleInputChange
|
|
1080
|
-
}, null, 40, _hoisted_2$
|
|
1081
|
-
vue.createElementVNode("div", _hoisted_3$
|
|
1125
|
+
}, null, 40, _hoisted_2$d),
|
|
1126
|
+
vue.createElementVNode("div", _hoisted_3$b, [
|
|
1082
1127
|
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
1083
1128
|
icon: "heroicons:cloud-arrow-up",
|
|
1084
1129
|
class: vue.normalizeClass(["size-12 mx-auto text-gray-400", { "text-primary-500": isDragging.value }])
|
|
1085
1130
|
}, null, 8, ["class"]),
|
|
1086
|
-
vue.createElementVNode("p", _hoisted_4$
|
|
1087
|
-
__props.description ? (vue.openBlock(), vue.createElementBlock("p", _hoisted_5$
|
|
1088
|
-
__props.maxSize ? (vue.openBlock(), vue.createElementBlock("p", _hoisted_6$
|
|
1131
|
+
vue.createElementVNode("p", _hoisted_4$7, vue.toDisplayString(__props.label), 1),
|
|
1132
|
+
__props.description ? (vue.openBlock(), vue.createElementBlock("p", _hoisted_5$5, vue.toDisplayString(__props.description), 1)) : vue.createCommentVNode("", true),
|
|
1133
|
+
__props.maxSize ? (vue.openBlock(), vue.createElementBlock("p", _hoisted_6$5, " Max size: " + vue.toDisplayString(formatSize(__props.maxSize)), 1)) : vue.createCommentVNode("", true)
|
|
1089
1134
|
])
|
|
1090
1135
|
], 34),
|
|
1091
|
-
files.value.length > 0 ? (vue.openBlock(), vue.createElementBlock("ul", _hoisted_7$
|
|
1136
|
+
files.value.length > 0 ? (vue.openBlock(), vue.createElementBlock("ul", _hoisted_7$4, [
|
|
1092
1137
|
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(files.value, (uploadedFile) => {
|
|
1093
1138
|
return vue.openBlock(), vue.createElementBlock("li", {
|
|
1094
1139
|
key: uploadedFile.id,
|
|
@@ -1098,9 +1143,9 @@ const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
|
|
|
1098
1143
|
icon: getFileIcon(uploadedFile.file),
|
|
1099
1144
|
class: "size-8 text-gray-400"
|
|
1100
1145
|
}, null, 8, ["icon"]),
|
|
1101
|
-
vue.createElementVNode("div", _hoisted_8$
|
|
1102
|
-
vue.createElementVNode("p", _hoisted_9$
|
|
1103
|
-
vue.createElementVNode("p", _hoisted_10$
|
|
1146
|
+
vue.createElementVNode("div", _hoisted_8$3, [
|
|
1147
|
+
vue.createElementVNode("p", _hoisted_9$2, vue.toDisplayString(uploadedFile.file.name), 1),
|
|
1148
|
+
vue.createElementVNode("p", _hoisted_10$2, vue.toDisplayString(formatSize(uploadedFile.file.size)), 1)
|
|
1104
1149
|
]),
|
|
1105
1150
|
vue.createElementVNode("button", {
|
|
1106
1151
|
type: "button",
|
|
@@ -1111,7 +1156,7 @@ const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
|
|
|
1111
1156
|
icon: "heroicons:x-mark",
|
|
1112
1157
|
class: "size-5"
|
|
1113
1158
|
})
|
|
1114
|
-
], 8, _hoisted_11$
|
|
1159
|
+
], 8, _hoisted_11$2)
|
|
1115
1160
|
]);
|
|
1116
1161
|
}), 128))
|
|
1117
1162
|
])) : vue.createCommentVNode("", true)
|
|
@@ -1119,13 +1164,13 @@ const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
|
|
|
1119
1164
|
};
|
|
1120
1165
|
}
|
|
1121
1166
|
});
|
|
1122
|
-
const _hoisted_1$
|
|
1123
|
-
const _hoisted_2$
|
|
1124
|
-
const _hoisted_3$
|
|
1167
|
+
const _hoisted_1$h = { class: "flex items-center gap-1" };
|
|
1168
|
+
const _hoisted_2$c = ["disabled", "onClick", "onMousemove"];
|
|
1169
|
+
const _hoisted_3$a = {
|
|
1125
1170
|
key: 0,
|
|
1126
1171
|
class: "ml-2 text-sm font-medium text-gray-700 dark:text-gray-300"
|
|
1127
1172
|
};
|
|
1128
|
-
const _sfc_main$
|
|
1173
|
+
const _sfc_main$h = /* @__PURE__ */ vue.defineComponent({
|
|
1129
1174
|
__name: "Rating",
|
|
1130
1175
|
props: {
|
|
1131
1176
|
modelValue: { default: 0 },
|
|
@@ -1188,7 +1233,7 @@ const _sfc_main$4 = /* @__PURE__ */ vue.defineComponent({
|
|
|
1188
1233
|
hoverValue.value = null;
|
|
1189
1234
|
};
|
|
1190
1235
|
return (_ctx, _cache) => {
|
|
1191
|
-
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$
|
|
1236
|
+
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$h, [
|
|
1192
1237
|
vue.createElementVNode("div", {
|
|
1193
1238
|
class: "flex items-center",
|
|
1194
1239
|
onMouseleave: handleMouseLeave
|
|
@@ -1220,29 +1265,29 @@ const _sfc_main$4 = /* @__PURE__ */ vue.defineComponent({
|
|
|
1220
1265
|
class: vue.normalizeClass([sizeClasses.value, __props.color])
|
|
1221
1266
|
}, null, 8, ["icon", "class"])
|
|
1222
1267
|
], 4)
|
|
1223
|
-
], 42, _hoisted_2$
|
|
1268
|
+
], 42, _hoisted_2$c);
|
|
1224
1269
|
}), 128))
|
|
1225
1270
|
], 32),
|
|
1226
|
-
__props.showValue ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$
|
|
1271
|
+
__props.showValue ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$a, vue.toDisplayString(__props.modelValue.toFixed(__props.allowHalf ? 1 : 0)), 1)) : vue.createCommentVNode("", true)
|
|
1227
1272
|
]);
|
|
1228
1273
|
};
|
|
1229
1274
|
}
|
|
1230
1275
|
});
|
|
1231
|
-
const _hoisted_1$
|
|
1232
|
-
const _hoisted_2$
|
|
1276
|
+
const _hoisted_1$g = { class: "relative inline-block" };
|
|
1277
|
+
const _hoisted_2$b = {
|
|
1233
1278
|
key: 0,
|
|
1234
1279
|
class: "block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"
|
|
1235
1280
|
};
|
|
1236
|
-
const _hoisted_3$
|
|
1237
|
-
const _hoisted_4$
|
|
1238
|
-
const _hoisted_5$
|
|
1239
|
-
const _hoisted_6$
|
|
1240
|
-
const _hoisted_7$
|
|
1281
|
+
const _hoisted_3$9 = ["disabled"];
|
|
1282
|
+
const _hoisted_4$6 = { class: "text-sm font-mono text-gray-700 dark:text-gray-300" };
|
|
1283
|
+
const _hoisted_5$4 = { class: "grid grid-cols-5 gap-2 mb-3" };
|
|
1284
|
+
const _hoisted_6$4 = ["title", "onClick"];
|
|
1285
|
+
const _hoisted_7$3 = {
|
|
1241
1286
|
key: 0,
|
|
1242
1287
|
class: "flex items-center gap-2 pt-3 border-t border-gray-200 dark:border-gray-700"
|
|
1243
1288
|
};
|
|
1244
|
-
const _hoisted_8$
|
|
1245
|
-
const _sfc_main$
|
|
1289
|
+
const _hoisted_8$2 = ["value"];
|
|
1290
|
+
const _sfc_main$g = /* @__PURE__ */ vue.defineComponent({
|
|
1246
1291
|
__name: "ColorPicker",
|
|
1247
1292
|
props: {
|
|
1248
1293
|
modelValue: { default: "#3b82f6" },
|
|
@@ -1311,8 +1356,8 @@ const _sfc_main$3 = /* @__PURE__ */ vue.defineComponent({
|
|
|
1311
1356
|
isOpen.value = false;
|
|
1312
1357
|
};
|
|
1313
1358
|
return (_ctx, _cache) => {
|
|
1314
|
-
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$
|
|
1315
|
-
__props.label ? (vue.openBlock(), vue.createElementBlock("label", _hoisted_2$
|
|
1359
|
+
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$g, [
|
|
1360
|
+
__props.label ? (vue.openBlock(), vue.createElementBlock("label", _hoisted_2$b, vue.toDisplayString(__props.label), 1)) : vue.createCommentVNode("", true),
|
|
1316
1361
|
vue.createElementVNode("button", {
|
|
1317
1362
|
type: "button",
|
|
1318
1363
|
class: vue.normalizeClass(["flex items-center gap-2 px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors", { "opacity-50 cursor-not-allowed": __props.disabled }]),
|
|
@@ -1323,12 +1368,12 @@ const _sfc_main$3 = /* @__PURE__ */ vue.defineComponent({
|
|
|
1323
1368
|
class: "size-6 rounded border border-gray-200 dark:border-gray-600",
|
|
1324
1369
|
style: vue.normalizeStyle({ backgroundColor: __props.modelValue })
|
|
1325
1370
|
}, null, 4),
|
|
1326
|
-
vue.createElementVNode("span", _hoisted_4$
|
|
1371
|
+
vue.createElementVNode("span", _hoisted_4$6, vue.toDisplayString(__props.modelValue), 1),
|
|
1327
1372
|
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
1328
1373
|
icon: "heroicons:chevron-down",
|
|
1329
1374
|
class: vue.normalizeClass(["size-4 text-gray-400", { "rotate-180": isOpen.value }])
|
|
1330
1375
|
}, null, 8, ["class"])
|
|
1331
|
-
], 10, _hoisted_3$
|
|
1376
|
+
], 10, _hoisted_3$9),
|
|
1332
1377
|
(vue.openBlock(), vue.createBlock(vue.Teleport, {
|
|
1333
1378
|
to: teleportTarget.value,
|
|
1334
1379
|
disabled: teleportDisabled.value
|
|
@@ -1348,7 +1393,7 @@ const _sfc_main$3 = /* @__PURE__ */ vue.defineComponent({
|
|
|
1348
1393
|
onClick: _cache[1] || (_cache[1] = vue.withModifiers(() => {
|
|
1349
1394
|
}, ["stop"]))
|
|
1350
1395
|
}, [
|
|
1351
|
-
vue.createElementVNode("div", _hoisted_5$
|
|
1396
|
+
vue.createElementVNode("div", _hoisted_5$4, [
|
|
1352
1397
|
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.swatches, (color) => {
|
|
1353
1398
|
return vue.openBlock(), vue.createElementBlock("button", {
|
|
1354
1399
|
key: color,
|
|
@@ -1367,16 +1412,16 @@ const _sfc_main$3 = /* @__PURE__ */ vue.defineComponent({
|
|
|
1367
1412
|
["#ffffff", "#f9fafb", "#f3f4f6", "#e5e7eb", "#eab308", "#f59e0b"].includes(color) ? "text-gray-800" : "text-white"
|
|
1368
1413
|
]])
|
|
1369
1414
|
}, null, 8, ["class"])) : vue.createCommentVNode("", true)
|
|
1370
|
-
], 14, _hoisted_6$
|
|
1415
|
+
], 14, _hoisted_6$4);
|
|
1371
1416
|
}), 128))
|
|
1372
1417
|
]),
|
|
1373
|
-
__props.showInput ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_7$
|
|
1418
|
+
__props.showInput ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_7$3, [
|
|
1374
1419
|
vue.createElementVNode("input", {
|
|
1375
1420
|
type: "color",
|
|
1376
1421
|
value: __props.modelValue,
|
|
1377
1422
|
class: "size-8 rounded cursor-pointer border-0 p-0",
|
|
1378
1423
|
onInput: handleNativeInput
|
|
1379
|
-
}, null, 40, _hoisted_8$
|
|
1424
|
+
}, null, 40, _hoisted_8$2),
|
|
1380
1425
|
vue.withDirectives(vue.createElementVNode("input", {
|
|
1381
1426
|
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => inputValue.value = $event),
|
|
1382
1427
|
type: "text",
|
|
@@ -1402,16 +1447,16 @@ const _sfc_main$3 = /* @__PURE__ */ vue.defineComponent({
|
|
|
1402
1447
|
};
|
|
1403
1448
|
}
|
|
1404
1449
|
});
|
|
1405
|
-
const _hoisted_1$
|
|
1406
|
-
const _hoisted_2$
|
|
1450
|
+
const _hoisted_1$f = { class: "space-y-2" };
|
|
1451
|
+
const _hoisted_2$a = {
|
|
1407
1452
|
key: 0,
|
|
1408
1453
|
class: "flex justify-between text-sm font-medium text-gray-700 dark:text-gray-300"
|
|
1409
1454
|
};
|
|
1410
|
-
const _hoisted_3$
|
|
1455
|
+
const _hoisted_3$8 = {
|
|
1411
1456
|
key: 1,
|
|
1412
1457
|
class: "flex justify-between text-xs text-gray-500 dark:text-gray-400"
|
|
1413
1458
|
};
|
|
1414
|
-
const _sfc_main$
|
|
1459
|
+
const _sfc_main$f = /* @__PURE__ */ vue.defineComponent({
|
|
1415
1460
|
__name: "RangeSlider",
|
|
1416
1461
|
props: {
|
|
1417
1462
|
modelValue: { default: () => [25, 75] },
|
|
@@ -1489,8 +1534,8 @@ const _sfc_main$2 = /* @__PURE__ */ vue.defineComponent({
|
|
|
1489
1534
|
}
|
|
1490
1535
|
};
|
|
1491
1536
|
return (_ctx, _cache) => {
|
|
1492
|
-
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$
|
|
1493
|
-
__props.showLabels ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$
|
|
1537
|
+
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$f, [
|
|
1538
|
+
__props.showLabels ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$a, [
|
|
1494
1539
|
vue.createElementVNode("span", null, vue.toDisplayString(__props.formatLabel(minValue.value)), 1),
|
|
1495
1540
|
vue.createElementVNode("span", null, vue.toDisplayString(__props.formatLabel(maxValue.value)), 1)
|
|
1496
1541
|
])) : vue.createCommentVNode("", true),
|
|
@@ -1523,7 +1568,7 @@ const _sfc_main$2 = /* @__PURE__ */ vue.defineComponent({
|
|
|
1523
1568
|
onMousedown: _cache[1] || (_cache[1] = ($event) => handleMouseDown("max"))
|
|
1524
1569
|
}, null, 38)
|
|
1525
1570
|
], 2),
|
|
1526
|
-
__props.showMinMax ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$
|
|
1571
|
+
__props.showMinMax ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$8, [
|
|
1527
1572
|
vue.createElementVNode("span", null, vue.toDisplayString(__props.formatLabel(__props.min)), 1),
|
|
1528
1573
|
vue.createElementVNode("span", null, vue.toDisplayString(__props.formatLabel(__props.max)), 1)
|
|
1529
1574
|
])) : vue.createCommentVNode("", true)
|
|
@@ -1531,18 +1576,18 @@ const _sfc_main$2 = /* @__PURE__ */ vue.defineComponent({
|
|
|
1531
1576
|
};
|
|
1532
1577
|
}
|
|
1533
1578
|
});
|
|
1534
|
-
const _hoisted_1$
|
|
1535
|
-
const _hoisted_2$
|
|
1536
|
-
const _hoisted_3$
|
|
1537
|
-
const _hoisted_4$
|
|
1538
|
-
const _hoisted_5$
|
|
1539
|
-
const _hoisted_6$
|
|
1540
|
-
const _hoisted_7$
|
|
1579
|
+
const _hoisted_1$e = ["aria-expanded", "aria-controls"];
|
|
1580
|
+
const _hoisted_2$9 = ["id", "name", "placeholder", "disabled", "aria-controls"];
|
|
1581
|
+
const _hoisted_3$7 = { class: "flex items-center gap-1" };
|
|
1582
|
+
const _hoisted_4$5 = ["id", "aria-label", "aria-multiselectable"];
|
|
1583
|
+
const _hoisted_5$3 = ["aria-selected", "aria-disabled", "disabled", "onClick"];
|
|
1584
|
+
const _hoisted_6$3 = { class: "flex-1" };
|
|
1585
|
+
const _hoisted_7$2 = {
|
|
1541
1586
|
key: 1,
|
|
1542
1587
|
class: "px-3 py-2 text-center text-sm text-gray-500 dark:text-gray-400",
|
|
1543
1588
|
role: "status"
|
|
1544
1589
|
};
|
|
1545
|
-
const _sfc_main$
|
|
1590
|
+
const _sfc_main$e = /* @__PURE__ */ vue.defineComponent({
|
|
1546
1591
|
__name: "Combobox",
|
|
1547
1592
|
props: {
|
|
1548
1593
|
modelValue: {},
|
|
@@ -1673,10 +1718,10 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
|
|
|
1673
1718
|
class: "flex-1 border-none bg-transparent text-sm text-gray-900 outline-hidden placeholder:text-gray-400 dark:text-gray-100 dark:placeholder:text-gray-500",
|
|
1674
1719
|
onClick: _cache[1] || (_cache[1] = vue.withModifiers(() => {
|
|
1675
1720
|
}, ["stop"]))
|
|
1676
|
-
}, null, 8, _hoisted_2$
|
|
1721
|
+
}, null, 8, _hoisted_2$9)), [
|
|
1677
1722
|
[vue.vModelText, search.value]
|
|
1678
1723
|
]),
|
|
1679
|
-
vue.createElementVNode("div", _hoisted_3$
|
|
1724
|
+
vue.createElementVNode("div", _hoisted_3$7, [
|
|
1680
1725
|
__props.clearable && selectedOptions.value.length > 0 && !__props.disabled ? (vue.openBlock(), vue.createElementBlock("button", {
|
|
1681
1726
|
key: 0,
|
|
1682
1727
|
type: "button",
|
|
@@ -1699,7 +1744,7 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
|
|
|
1699
1744
|
"aria-hidden": "true"
|
|
1700
1745
|
}, null, 8, ["class"])
|
|
1701
1746
|
])
|
|
1702
|
-
], 10, _hoisted_1$
|
|
1747
|
+
], 10, _hoisted_1$e),
|
|
1703
1748
|
(vue.openBlock(), vue.createBlock(vue.Teleport, {
|
|
1704
1749
|
to: teleportTarget.value,
|
|
1705
1750
|
disabled: teleportDisabled.value
|
|
@@ -1749,16 +1794,16 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
|
|
|
1749
1794
|
class: "size-3"
|
|
1750
1795
|
})) : vue.createCommentVNode("", true)
|
|
1751
1796
|
], 2)) : vue.createCommentVNode("", true),
|
|
1752
|
-
vue.createElementVNode("span", _hoisted_6$
|
|
1797
|
+
vue.createElementVNode("span", _hoisted_6$3, vue.toDisplayString(option.label), 1),
|
|
1753
1798
|
!__props.multiple && isSelected(option) ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
|
|
1754
1799
|
key: 1,
|
|
1755
1800
|
icon: "lucide:check",
|
|
1756
1801
|
class: "size-4 text-primary",
|
|
1757
1802
|
"aria-hidden": "true"
|
|
1758
1803
|
})) : vue.createCommentVNode("", true)
|
|
1759
|
-
], 10, _hoisted_5$
|
|
1760
|
-
}), 128)) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_7$
|
|
1761
|
-
], 8, _hoisted_4$
|
|
1804
|
+
], 10, _hoisted_5$3);
|
|
1805
|
+
}), 128)) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_7$2, vue.toDisplayString(__props.noResultsText), 1))
|
|
1806
|
+
], 8, _hoisted_4$5)) : vue.createCommentVNode("", true)
|
|
1762
1807
|
]),
|
|
1763
1808
|
_: 1
|
|
1764
1809
|
})
|
|
@@ -1767,30 +1812,30 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
|
|
|
1767
1812
|
};
|
|
1768
1813
|
}
|
|
1769
1814
|
});
|
|
1770
|
-
const _hoisted_1 = { class: "relative" };
|
|
1771
|
-
const _hoisted_2 = {
|
|
1815
|
+
const _hoisted_1$d = { class: "relative" };
|
|
1816
|
+
const _hoisted_2$8 = {
|
|
1772
1817
|
key: 0,
|
|
1773
1818
|
class: "text-red-500 ml-0.5"
|
|
1774
1819
|
};
|
|
1775
|
-
const _hoisted_3 = ["id", "disabled", "aria-invalid", "aria-describedby"];
|
|
1776
|
-
const _hoisted_4 = {
|
|
1820
|
+
const _hoisted_3$6 = ["id", "disabled", "aria-invalid", "aria-describedby"];
|
|
1821
|
+
const _hoisted_4$4 = {
|
|
1777
1822
|
key: 0,
|
|
1778
1823
|
class: "flex items-center gap-2 flex-1"
|
|
1779
1824
|
};
|
|
1780
|
-
const _hoisted_5 = { class: "flex
|
|
1781
|
-
const _hoisted_6 = { class: "text-gray-700 dark:text-gray-300 font-mono text-xs truncate" };
|
|
1782
|
-
const _hoisted_7 = {
|
|
1825
|
+
const _hoisted_5$2 = { class: "flex size-8 items-center justify-center rounded bg-gray-100 dark:bg-gray-800" };
|
|
1826
|
+
const _hoisted_6$2 = { class: "text-gray-700 dark:text-gray-300 font-mono text-xs truncate" };
|
|
1827
|
+
const _hoisted_7$1 = {
|
|
1783
1828
|
key: 1,
|
|
1784
1829
|
class: "flex-1 text-gray-400 dark:text-gray-500"
|
|
1785
1830
|
};
|
|
1786
|
-
const _hoisted_8 = { class: "relative mb-4" };
|
|
1787
|
-
const _hoisted_9 = ["placeholder"];
|
|
1788
|
-
const _hoisted_10 = {
|
|
1831
|
+
const _hoisted_8$1 = { class: "relative mb-4" };
|
|
1832
|
+
const _hoisted_9$1 = ["placeholder"];
|
|
1833
|
+
const _hoisted_10$1 = {
|
|
1789
1834
|
key: 0,
|
|
1790
1835
|
class: "absolute right-3 top-1/2 -translate-y-1/2"
|
|
1791
1836
|
};
|
|
1792
|
-
const _hoisted_11 = { class: "max-h-64 overflow-y-auto" };
|
|
1793
|
-
const _hoisted_12 = {
|
|
1837
|
+
const _hoisted_11$1 = { class: "max-h-64 overflow-y-auto" };
|
|
1838
|
+
const _hoisted_12$1 = {
|
|
1794
1839
|
key: 0,
|
|
1795
1840
|
class: "py-8 text-center text-sm text-gray-500"
|
|
1796
1841
|
};
|
|
@@ -1801,7 +1846,7 @@ const _hoisted_13 = {
|
|
|
1801
1846
|
const _hoisted_14 = ["title", "onClick"];
|
|
1802
1847
|
const _hoisted_15 = { class: "mt-4 flex items-center justify-between border-t border-gray-200 pt-4 dark:border-gray-700" };
|
|
1803
1848
|
const _hoisted_16 = { class: "text-xs text-gray-500" };
|
|
1804
|
-
const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
1849
|
+
const _sfc_main$d = /* @__PURE__ */ vue.defineComponent({
|
|
1805
1850
|
__name: "IconPicker",
|
|
1806
1851
|
props: /* @__PURE__ */ vue.mergeModels({
|
|
1807
1852
|
label: {},
|
|
@@ -1925,15 +1970,15 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
1925
1970
|
searchQuery.value = "";
|
|
1926
1971
|
}
|
|
1927
1972
|
return (_ctx, _cache) => {
|
|
1928
|
-
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
|
|
1929
|
-
__props.label ? (vue.openBlock(), vue.createBlock(_sfc_main$
|
|
1973
|
+
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$d, [
|
|
1974
|
+
__props.label ? (vue.openBlock(), vue.createBlock(_sfc_main$r, {
|
|
1930
1975
|
key: 0,
|
|
1931
1976
|
"html-for": inputId.value,
|
|
1932
1977
|
error: __props.error
|
|
1933
1978
|
}, {
|
|
1934
1979
|
default: vue.withCtx(() => [
|
|
1935
1980
|
vue.createTextVNode(vue.toDisplayString(__props.label) + " ", 1),
|
|
1936
|
-
__props.required ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_2, "*")) : vue.createCommentVNode("", true)
|
|
1981
|
+
__props.required ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_2$8, "*")) : vue.createCommentVNode("", true)
|
|
1937
1982
|
]),
|
|
1938
1983
|
_: 1
|
|
1939
1984
|
}, 8, ["html-for", "error"])) : vue.createCommentVNode("", true),
|
|
@@ -1949,15 +1994,15 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
1949
1994
|
]]),
|
|
1950
1995
|
onClick: openPicker
|
|
1951
1996
|
}, [
|
|
1952
|
-
modelValue.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4, [
|
|
1953
|
-
vue.createElementVNode("div", _hoisted_5, [
|
|
1997
|
+
modelValue.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4$4, [
|
|
1998
|
+
vue.createElementVNode("div", _hoisted_5$2, [
|
|
1954
1999
|
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
1955
2000
|
icon: modelValue.value,
|
|
1956
|
-
class: "
|
|
2001
|
+
class: "size-5 text-gray-700 dark:text-gray-300"
|
|
1957
2002
|
}, null, 8, ["icon"])
|
|
1958
2003
|
]),
|
|
1959
|
-
vue.createElementVNode("span", _hoisted_6, vue.toDisplayString(modelValue.value), 1)
|
|
1960
|
-
])) : (vue.openBlock(), vue.createElementBlock("span", _hoisted_7, vue.toDisplayString(__props.placeholder), 1)),
|
|
2004
|
+
vue.createElementVNode("span", _hoisted_6$2, vue.toDisplayString(modelValue.value), 1)
|
|
2005
|
+
])) : (vue.openBlock(), vue.createElementBlock("span", _hoisted_7$1, vue.toDisplayString(__props.placeholder), 1)),
|
|
1961
2006
|
modelValue.value && !__props.disabled ? (vue.openBlock(), vue.createElementBlock("button", {
|
|
1962
2007
|
key: 2,
|
|
1963
2008
|
type: "button",
|
|
@@ -1966,15 +2011,15 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
1966
2011
|
}, [
|
|
1967
2012
|
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
1968
2013
|
icon: "lucide:x",
|
|
1969
|
-
class: "
|
|
2014
|
+
class: "size-4"
|
|
1970
2015
|
})
|
|
1971
2016
|
])) : vue.createCommentVNode("", true),
|
|
1972
2017
|
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
1973
2018
|
icon: "lucide:chevron-down",
|
|
1974
|
-
class: "
|
|
2019
|
+
class: "size-4 text-gray-400"
|
|
1975
2020
|
})
|
|
1976
|
-
], 10, _hoisted_3),
|
|
1977
|
-
__props.help && !hasError.value ? (vue.openBlock(), vue.createBlock(_sfc_main$
|
|
2021
|
+
], 10, _hoisted_3$6),
|
|
2022
|
+
__props.help && !hasError.value ? (vue.openBlock(), vue.createBlock(_sfc_main$q, {
|
|
1978
2023
|
key: 1,
|
|
1979
2024
|
id: helpId.value
|
|
1980
2025
|
}, {
|
|
@@ -1983,7 +2028,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
1983
2028
|
]),
|
|
1984
2029
|
_: 1
|
|
1985
2030
|
}, 8, ["id"])) : vue.createCommentVNode("", true),
|
|
1986
|
-
hasError.value ? (vue.openBlock(), vue.createBlock(_sfc_main$
|
|
2031
|
+
hasError.value ? (vue.openBlock(), vue.createBlock(_sfc_main$q, {
|
|
1987
2032
|
key: 2,
|
|
1988
2033
|
id: helpId.value,
|
|
1989
2034
|
error: true
|
|
@@ -2004,10 +2049,10 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
2004
2049
|
onClick: _cache[1] || (_cache[1] = vue.withModifiers(() => {
|
|
2005
2050
|
}, ["stop"]))
|
|
2006
2051
|
}, [
|
|
2007
|
-
vue.createElementVNode("div", _hoisted_8, [
|
|
2052
|
+
vue.createElementVNode("div", _hoisted_8$1, [
|
|
2008
2053
|
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
2009
2054
|
icon: "lucide:search",
|
|
2010
|
-
class: "absolute left-3 top-1/2
|
|
2055
|
+
class: "absolute left-3 top-1/2 size-4 -translate-y-1/2 text-gray-400"
|
|
2011
2056
|
}),
|
|
2012
2057
|
vue.withDirectives(vue.createElementVNode("input", {
|
|
2013
2058
|
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => searchQuery.value = $event),
|
|
@@ -2015,23 +2060,23 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
2015
2060
|
placeholder: __props.placeholder,
|
|
2016
2061
|
class: "w-full rounded-md border border-gray-300 bg-white py-2 pl-10 pr-4 text-sm text-gray-800 placeholder-gray-400 focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary dark:border-gray-700 dark:bg-gray-800 dark:text-gray-200 dark:placeholder-gray-500",
|
|
2017
2062
|
autofocus: ""
|
|
2018
|
-
}, null, 8, _hoisted_9), [
|
|
2063
|
+
}, null, 8, _hoisted_9$1), [
|
|
2019
2064
|
[vue.vModelText, searchQuery.value]
|
|
2020
2065
|
]),
|
|
2021
|
-
isLoading.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_10, [
|
|
2066
|
+
isLoading.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_10$1, [
|
|
2022
2067
|
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
2023
2068
|
icon: "lucide:loader-2",
|
|
2024
|
-
class: "
|
|
2069
|
+
class: "size-4 animate-spin text-gray-400"
|
|
2025
2070
|
})
|
|
2026
2071
|
])) : vue.createCommentVNode("", true)
|
|
2027
2072
|
]),
|
|
2028
|
-
vue.createElementVNode("div", _hoisted_11, [
|
|
2029
|
-
displayedIcons.value.length === 0 && searchQuery.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_12, ' Aucune icône trouvée pour "' + vue.toDisplayString(searchQuery.value) + '" ', 1)) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_13, [
|
|
2073
|
+
vue.createElementVNode("div", _hoisted_11$1, [
|
|
2074
|
+
displayedIcons.value.length === 0 && searchQuery.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_12$1, ' Aucune icône trouvée pour "' + vue.toDisplayString(searchQuery.value) + '" ', 1)) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_13, [
|
|
2030
2075
|
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(displayedIcons.value, (icon) => {
|
|
2031
2076
|
return vue.openBlock(), vue.createElementBlock("button", {
|
|
2032
2077
|
key: icon,
|
|
2033
2078
|
type: "button",
|
|
2034
|
-
class: vue.normalizeClass(["flex
|
|
2079
|
+
class: vue.normalizeClass(["flex size-9 items-center justify-center rounded transition-colors", [
|
|
2035
2080
|
modelValue.value === icon ? "bg-primary text-white" : "hover:bg-gray-100 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-300"
|
|
2036
2081
|
]]),
|
|
2037
2082
|
title: icon,
|
|
@@ -2039,7 +2084,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
2039
2084
|
}, [
|
|
2040
2085
|
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
2041
2086
|
icon,
|
|
2042
|
-
class: "
|
|
2087
|
+
class: "size-5"
|
|
2043
2088
|
}, null, 8, ["icon"])
|
|
2044
2089
|
], 10, _hoisted_14);
|
|
2045
2090
|
}), 128))
|
|
@@ -2060,19 +2105,1503 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
2060
2105
|
};
|
|
2061
2106
|
}
|
|
2062
2107
|
});
|
|
2108
|
+
const _hoisted_1$c = { class: "flex items-center justify-between" };
|
|
2109
|
+
const _hoisted_2$7 = { class: "flex items-center gap-3" };
|
|
2110
|
+
const _hoisted_3$5 = { class: "text-lg font-semibold text-gray-900 dark:text-white" };
|
|
2111
|
+
const _hoisted_4$3 = {
|
|
2112
|
+
key: 0,
|
|
2113
|
+
class: "text-sm text-gray-500 dark:text-gray-400"
|
|
2114
|
+
};
|
|
2115
|
+
const _hoisted_5$1 = { class: "p-5 sm:p-6" };
|
|
2116
|
+
const _hoisted_6$1 = {
|
|
2117
|
+
key: 0,
|
|
2118
|
+
class: "px-5 py-4 bg-gray-50 dark:bg-slate-800/50 border-t border-gray-100 dark:border-slate-700"
|
|
2119
|
+
};
|
|
2120
|
+
const _sfc_main$c = /* @__PURE__ */ vue.defineComponent({
|
|
2121
|
+
__name: "FormSection",
|
|
2122
|
+
props: /* @__PURE__ */ vue.mergeModels({
|
|
2123
|
+
title: {},
|
|
2124
|
+
subtitle: {},
|
|
2125
|
+
icon: {},
|
|
2126
|
+
iconColor: { default: "primary" },
|
|
2127
|
+
bordered: { type: Boolean, default: true },
|
|
2128
|
+
collapsible: { type: Boolean, default: false },
|
|
2129
|
+
collapsed: { type: Boolean, default: false }
|
|
2130
|
+
}, {
|
|
2131
|
+
"collapsed": { type: Boolean, ...{ default: false } },
|
|
2132
|
+
"collapsedModifiers": {}
|
|
2133
|
+
}),
|
|
2134
|
+
emits: ["update:collapsed"],
|
|
2135
|
+
setup(__props) {
|
|
2136
|
+
const isCollapsed = vue.useModel(__props, "collapsed");
|
|
2137
|
+
function toggleCollapse() {
|
|
2138
|
+
isCollapsed.value = !isCollapsed.value;
|
|
2139
|
+
}
|
|
2140
|
+
return (_ctx, _cache) => {
|
|
2141
|
+
return vue.openBlock(), vue.createElementBlock("div", {
|
|
2142
|
+
class: vue.normalizeClass([
|
|
2143
|
+
"bg-white dark:bg-slate-800 rounded-2xl overflow-hidden",
|
|
2144
|
+
__props.bordered && "border border-gray-100 dark:border-slate-700 shadow-sm"
|
|
2145
|
+
])
|
|
2146
|
+
}, [
|
|
2147
|
+
vue.createElementVNode("div", {
|
|
2148
|
+
class: vue.normalizeClass([
|
|
2149
|
+
"p-5 border-b border-gray-100 dark:border-slate-700 bg-linear-to-r from-gray-50 to-white dark:from-slate-800 dark:to-slate-800",
|
|
2150
|
+
__props.collapsible && "cursor-pointer hover:bg-gray-50 dark:hover:bg-slate-700/50 transition-colors"
|
|
2151
|
+
]),
|
|
2152
|
+
onClick: _cache[0] || (_cache[0] = ($event) => __props.collapsible && toggleCollapse())
|
|
2153
|
+
}, [
|
|
2154
|
+
vue.createElementVNode("div", _hoisted_1$c, [
|
|
2155
|
+
vue.createElementVNode("div", _hoisted_2$7, [
|
|
2156
|
+
__props.icon ? (vue.openBlock(), vue.createElementBlock("div", {
|
|
2157
|
+
key: 0,
|
|
2158
|
+
class: vue.normalizeClass([
|
|
2159
|
+
"size-10 rounded-xl flex items-center justify-center",
|
|
2160
|
+
__props.iconColor === "primary" && "bg-primary-100 dark:bg-primary-900/30",
|
|
2161
|
+
__props.iconColor === "gray" && "bg-gray-100 dark:bg-slate-700",
|
|
2162
|
+
__props.iconColor === "success" && "bg-emerald-100 dark:bg-emerald-900/30",
|
|
2163
|
+
__props.iconColor === "warning" && "bg-amber-100 dark:bg-amber-900/30",
|
|
2164
|
+
__props.iconColor === "danger" && "bg-red-100 dark:bg-red-900/30"
|
|
2165
|
+
])
|
|
2166
|
+
}, [
|
|
2167
|
+
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
2168
|
+
icon: __props.icon,
|
|
2169
|
+
class: vue.normalizeClass([
|
|
2170
|
+
"size-5",
|
|
2171
|
+
__props.iconColor === "primary" && "text-primary-600 dark:text-primary-400",
|
|
2172
|
+
__props.iconColor === "gray" && "text-gray-600 dark:text-gray-400",
|
|
2173
|
+
__props.iconColor === "success" && "text-emerald-600 dark:text-emerald-400",
|
|
2174
|
+
__props.iconColor === "warning" && "text-amber-600 dark:text-amber-400",
|
|
2175
|
+
__props.iconColor === "danger" && "text-red-600 dark:text-red-400"
|
|
2176
|
+
])
|
|
2177
|
+
}, null, 8, ["icon", "class"])
|
|
2178
|
+
], 2)) : vue.createCommentVNode("", true),
|
|
2179
|
+
vue.createElementVNode("div", null, [
|
|
2180
|
+
vue.createElementVNode("h2", _hoisted_3$5, [
|
|
2181
|
+
vue.renderSlot(_ctx.$slots, "title", {}, () => [
|
|
2182
|
+
vue.createTextVNode(vue.toDisplayString(__props.title), 1)
|
|
2183
|
+
])
|
|
2184
|
+
]),
|
|
2185
|
+
__props.subtitle ? (vue.openBlock(), vue.createElementBlock("p", _hoisted_4$3, [
|
|
2186
|
+
vue.renderSlot(_ctx.$slots, "subtitle", {}, () => [
|
|
2187
|
+
vue.createTextVNode(vue.toDisplayString(__props.subtitle), 1)
|
|
2188
|
+
])
|
|
2189
|
+
])) : vue.createCommentVNode("", true)
|
|
2190
|
+
])
|
|
2191
|
+
]),
|
|
2192
|
+
__props.collapsible ? (vue.openBlock(), vue.createElementBlock("button", {
|
|
2193
|
+
key: 0,
|
|
2194
|
+
type: "button",
|
|
2195
|
+
class: "p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-slate-700 transition-colors",
|
|
2196
|
+
onClick: vue.withModifiers(toggleCollapse, ["stop"])
|
|
2197
|
+
}, [
|
|
2198
|
+
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
2199
|
+
icon: "heroicons:chevron-down",
|
|
2200
|
+
class: vue.normalizeClass([
|
|
2201
|
+
"w-5 h-5 text-gray-400 transition-transform duration-200",
|
|
2202
|
+
isCollapsed.value && "-rotate-90"
|
|
2203
|
+
])
|
|
2204
|
+
}, null, 8, ["class"])
|
|
2205
|
+
])) : vue.createCommentVNode("", true),
|
|
2206
|
+
vue.renderSlot(_ctx.$slots, "header-actions")
|
|
2207
|
+
])
|
|
2208
|
+
], 2),
|
|
2209
|
+
vue.withDirectives(vue.createElementVNode("div", _hoisted_5$1, [
|
|
2210
|
+
vue.renderSlot(_ctx.$slots, "default")
|
|
2211
|
+
], 512), [
|
|
2212
|
+
[vue.vShow, !isCollapsed.value]
|
|
2213
|
+
]),
|
|
2214
|
+
_ctx.$slots.footer ? vue.withDirectives((vue.openBlock(), vue.createElementBlock("div", _hoisted_6$1, [
|
|
2215
|
+
vue.renderSlot(_ctx.$slots, "footer")
|
|
2216
|
+
], 512)), [
|
|
2217
|
+
[vue.vShow, !isCollapsed.value]
|
|
2218
|
+
]) : vue.createCommentVNode("", true)
|
|
2219
|
+
], 2);
|
|
2220
|
+
};
|
|
2221
|
+
}
|
|
2222
|
+
});
|
|
2223
|
+
const _hoisted_1$b = { key: 1 };
|
|
2224
|
+
const _sfc_main$b = /* @__PURE__ */ vue.defineComponent({
|
|
2225
|
+
__name: "FormActions",
|
|
2226
|
+
props: {
|
|
2227
|
+
submitLabel: { default: "Enregistrer" },
|
|
2228
|
+
cancelLabel: { default: "Annuler" },
|
|
2229
|
+
submitIcon: { default: "heroicons:check" },
|
|
2230
|
+
cancelIcon: { default: "heroicons:x-mark" },
|
|
2231
|
+
loading: { type: Boolean },
|
|
2232
|
+
loadingLabel: {},
|
|
2233
|
+
disabled: { type: Boolean },
|
|
2234
|
+
showCancel: { type: Boolean, default: true },
|
|
2235
|
+
align: { default: "right" },
|
|
2236
|
+
stackOnMobile: { type: Boolean, default: false },
|
|
2237
|
+
submitVariant: { default: "primary" }
|
|
2238
|
+
},
|
|
2239
|
+
emits: ["submit", "cancel"],
|
|
2240
|
+
setup(__props, { emit: __emit }) {
|
|
2241
|
+
const emit = __emit;
|
|
2242
|
+
return (_ctx, _cache) => {
|
|
2243
|
+
return vue.openBlock(), vue.createElementBlock("div", {
|
|
2244
|
+
class: vue.normalizeClass([
|
|
2245
|
+
"flex gap-3 pt-2",
|
|
2246
|
+
__props.align === "left" && "justify-start",
|
|
2247
|
+
__props.align === "center" && "justify-center",
|
|
2248
|
+
__props.align === "right" && "justify-end",
|
|
2249
|
+
__props.align === "stretch" && "[&>*]:flex-1",
|
|
2250
|
+
__props.stackOnMobile && "flex-col sm:flex-row"
|
|
2251
|
+
])
|
|
2252
|
+
}, [
|
|
2253
|
+
__props.showCancel ? (vue.openBlock(), vue.createBlock(Button_vue_vue_type_script_setup_true_lang._sfc_main, {
|
|
2254
|
+
key: 0,
|
|
2255
|
+
type: "button",
|
|
2256
|
+
variant: "outline",
|
|
2257
|
+
disabled: __props.loading,
|
|
2258
|
+
class: vue.normalizeClass([
|
|
2259
|
+
__props.stackOnMobile && "order-2 sm:order-1"
|
|
2260
|
+
]),
|
|
2261
|
+
onClick: _cache[0] || (_cache[0] = ($event) => emit("cancel"))
|
|
2262
|
+
}, {
|
|
2263
|
+
default: vue.withCtx(() => [
|
|
2264
|
+
__props.cancelIcon ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
|
|
2265
|
+
key: 0,
|
|
2266
|
+
icon: __props.cancelIcon,
|
|
2267
|
+
class: "w-5 h-5"
|
|
2268
|
+
}, null, 8, ["icon"])) : vue.createCommentVNode("", true),
|
|
2269
|
+
vue.createTextVNode(" " + vue.toDisplayString(__props.cancelLabel), 1)
|
|
2270
|
+
]),
|
|
2271
|
+
_: 1
|
|
2272
|
+
}, 8, ["disabled", "class"])) : vue.createCommentVNode("", true),
|
|
2273
|
+
vue.createVNode(Button_vue_vue_type_script_setup_true_lang._sfc_main, {
|
|
2274
|
+
type: "submit",
|
|
2275
|
+
variant: __props.submitVariant,
|
|
2276
|
+
disabled: __props.disabled || __props.loading,
|
|
2277
|
+
loading: __props.loading,
|
|
2278
|
+
class: vue.normalizeClass([
|
|
2279
|
+
__props.stackOnMobile && "order-1 sm:order-2"
|
|
2280
|
+
]),
|
|
2281
|
+
onClick: _cache[1] || (_cache[1] = ($event) => emit("submit"))
|
|
2282
|
+
}, {
|
|
2283
|
+
default: vue.withCtx(() => [
|
|
2284
|
+
!__props.loading ? (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 0 }, [
|
|
2285
|
+
__props.submitIcon ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
|
|
2286
|
+
key: 0,
|
|
2287
|
+
icon: __props.submitIcon,
|
|
2288
|
+
class: "w-5 h-5"
|
|
2289
|
+
}, null, 8, ["icon"])) : vue.createCommentVNode("", true),
|
|
2290
|
+
vue.createTextVNode(" " + vue.toDisplayString(__props.submitLabel), 1)
|
|
2291
|
+
], 64)) : (vue.openBlock(), vue.createElementBlock("span", _hoisted_1$b, vue.toDisplayString(__props.loadingLabel || __props.submitLabel + "..."), 1))
|
|
2292
|
+
]),
|
|
2293
|
+
_: 1
|
|
2294
|
+
}, 8, ["variant", "disabled", "loading", "class"]),
|
|
2295
|
+
vue.renderSlot(_ctx.$slots, "extra")
|
|
2296
|
+
], 2);
|
|
2297
|
+
};
|
|
2298
|
+
}
|
|
2299
|
+
});
|
|
2300
|
+
const _hoisted_1$a = {
|
|
2301
|
+
key: 0,
|
|
2302
|
+
class: "absolute left-3 top-1/2 -translate-y-1/2 pointer-events-none text-gray-400"
|
|
2303
|
+
};
|
|
2304
|
+
const _hoisted_2$6 = {
|
|
2305
|
+
key: 1,
|
|
2306
|
+
class: "absolute right-3 top-1/2 -translate-y-1/2 flex items-center gap-1"
|
|
2307
|
+
};
|
|
2308
|
+
const _sfc_main$a = /* @__PURE__ */ vue.defineComponent({
|
|
2309
|
+
__name: "InputWrapper",
|
|
2310
|
+
props: {
|
|
2311
|
+
icon: {},
|
|
2312
|
+
iconRight: {},
|
|
2313
|
+
size: { default: "md" },
|
|
2314
|
+
invalid: { type: Boolean },
|
|
2315
|
+
disabled: { type: Boolean },
|
|
2316
|
+
wrapperClass: {}
|
|
2317
|
+
},
|
|
2318
|
+
setup(__props, { expose: __expose }) {
|
|
2319
|
+
const props = __props;
|
|
2320
|
+
const slots = vue.useSlots();
|
|
2321
|
+
const hasLeftIcon = vue.computed(() => props.icon || slots.icon);
|
|
2322
|
+
const hasRightContent = vue.computed(() => props.iconRight || slots.actions);
|
|
2323
|
+
const inputClass = vue.computed(() => [
|
|
2324
|
+
// Base styles
|
|
2325
|
+
"block w-full rounded-xl border text-sm transition-all",
|
|
2326
|
+
"border-gray-200 bg-gray-50 text-gray-900 placeholder-gray-400",
|
|
2327
|
+
"focus:border-primary-500 focus:ring-2 focus:ring-primary-500 focus:bg-white focus:outline-hidden",
|
|
2328
|
+
"disabled:border-gray-200 disabled:bg-gray-100 disabled:text-gray-500 disabled:cursor-not-allowed",
|
|
2329
|
+
// Dark mode
|
|
2330
|
+
"dark:border-slate-600 dark:bg-slate-700 dark:text-white dark:placeholder-gray-500",
|
|
2331
|
+
"dark:focus:border-primary-500 dark:focus:ring-primary-500 dark:focus:bg-slate-600",
|
|
2332
|
+
"dark:disabled:bg-slate-800 dark:disabled:text-gray-500",
|
|
2333
|
+
// Padding based on icons/actions
|
|
2334
|
+
hasLeftIcon.value ? "pl-10" : "pl-4",
|
|
2335
|
+
hasRightContent.value ? "pr-10" : "pr-4",
|
|
2336
|
+
// Size
|
|
2337
|
+
props.size === "sm" && "py-2 text-xs",
|
|
2338
|
+
props.size === "md" && "py-3 text-sm",
|
|
2339
|
+
props.size === "lg" && "py-4 text-base",
|
|
2340
|
+
// Invalid state
|
|
2341
|
+
props.invalid && "border-red-500 focus:border-red-500 focus:ring-red-500 dark:border-red-500"
|
|
2342
|
+
]);
|
|
2343
|
+
__expose({ inputClass });
|
|
2344
|
+
return (_ctx, _cache) => {
|
|
2345
|
+
return vue.openBlock(), vue.createElementBlock("div", {
|
|
2346
|
+
class: vue.normalizeClass(["relative", __props.wrapperClass])
|
|
2347
|
+
}, [
|
|
2348
|
+
hasLeftIcon.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$a, [
|
|
2349
|
+
vue.renderSlot(_ctx.$slots, "icon", {}, () => [
|
|
2350
|
+
__props.icon ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
|
|
2351
|
+
key: 0,
|
|
2352
|
+
icon: __props.icon,
|
|
2353
|
+
class: "size-5"
|
|
2354
|
+
}, null, 8, ["icon"])) : vue.createCommentVNode("", true)
|
|
2355
|
+
])
|
|
2356
|
+
])) : vue.createCommentVNode("", true),
|
|
2357
|
+
vue.renderSlot(_ctx.$slots, "default", { inputClass: inputClass.value }),
|
|
2358
|
+
hasRightContent.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$6, [
|
|
2359
|
+
vue.renderSlot(_ctx.$slots, "actions", {}, () => [
|
|
2360
|
+
__props.iconRight ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
|
|
2361
|
+
key: 0,
|
|
2362
|
+
icon: __props.iconRight,
|
|
2363
|
+
class: "size-5 text-gray-400 pointer-events-none"
|
|
2364
|
+
}, null, 8, ["icon"])) : vue.createCommentVNode("", true)
|
|
2365
|
+
])
|
|
2366
|
+
])) : vue.createCommentVNode("", true)
|
|
2367
|
+
], 2);
|
|
2368
|
+
};
|
|
2369
|
+
}
|
|
2370
|
+
});
|
|
2371
|
+
const _hoisted_1$9 = ["id", "name", "placeholder", "disabled", "required", "aria-invalid", "aria-required", "aria-describedby"];
|
|
2372
|
+
const _sfc_main$9 = /* @__PURE__ */ vue.defineComponent({
|
|
2373
|
+
__name: "EmailInput",
|
|
2374
|
+
props: /* @__PURE__ */ vue.mergeModels({
|
|
2375
|
+
placeholder: { default: "Enter email address..." },
|
|
2376
|
+
size: { default: "md" },
|
|
2377
|
+
disabled: { type: Boolean },
|
|
2378
|
+
showValidation: { type: Boolean, default: true },
|
|
2379
|
+
name: {},
|
|
2380
|
+
id: {},
|
|
2381
|
+
required: { type: Boolean },
|
|
2382
|
+
describedBy: {}
|
|
2383
|
+
}, {
|
|
2384
|
+
"modelValue": { default: "" },
|
|
2385
|
+
"modelModifiers": {}
|
|
2386
|
+
}),
|
|
2387
|
+
emits: ["update:modelValue"],
|
|
2388
|
+
setup(__props) {
|
|
2389
|
+
const props = __props;
|
|
2390
|
+
const modelValue = vue.useModel(__props, "modelValue");
|
|
2391
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
2392
|
+
const isValid = vue.computed(() => {
|
|
2393
|
+
if (!modelValue.value) return null;
|
|
2394
|
+
return emailRegex.test(modelValue.value);
|
|
2395
|
+
});
|
|
2396
|
+
const isTouched = vue.ref(false);
|
|
2397
|
+
const showStatus = vue.computed(() => {
|
|
2398
|
+
return props.showValidation && isTouched.value && !!modelValue.value;
|
|
2399
|
+
});
|
|
2400
|
+
function handleBlur() {
|
|
2401
|
+
isTouched.value = true;
|
|
2402
|
+
}
|
|
2403
|
+
return (_ctx, _cache) => {
|
|
2404
|
+
return vue.openBlock(), vue.createBlock(_sfc_main$a, {
|
|
2405
|
+
icon: "lucide:mail",
|
|
2406
|
+
size: __props.size,
|
|
2407
|
+
disabled: __props.disabled,
|
|
2408
|
+
invalid: showStatus.value && isValid.value === false
|
|
2409
|
+
}, {
|
|
2410
|
+
default: vue.withCtx(({ inputClass }) => [
|
|
2411
|
+
vue.withDirectives(vue.createElementVNode("input", {
|
|
2412
|
+
id: __props.id ?? __props.name,
|
|
2413
|
+
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => modelValue.value = $event),
|
|
2414
|
+
type: "email",
|
|
2415
|
+
name: __props.name,
|
|
2416
|
+
placeholder: __props.placeholder,
|
|
2417
|
+
disabled: __props.disabled,
|
|
2418
|
+
required: __props.required,
|
|
2419
|
+
"aria-invalid": showStatus.value && isValid.value === false || void 0,
|
|
2420
|
+
"aria-required": __props.required || void 0,
|
|
2421
|
+
"aria-describedby": __props.describedBy,
|
|
2422
|
+
class: vue.normalizeClass(inputClass),
|
|
2423
|
+
onBlur: handleBlur
|
|
2424
|
+
}, null, 42, _hoisted_1$9), [
|
|
2425
|
+
[vue.vModelText, modelValue.value]
|
|
2426
|
+
])
|
|
2427
|
+
]),
|
|
2428
|
+
actions: vue.withCtx(() => [
|
|
2429
|
+
showStatus.value && isValid.value ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
|
|
2430
|
+
key: 0,
|
|
2431
|
+
icon: "lucide:check-circle",
|
|
2432
|
+
class: "size-5 text-emerald-500"
|
|
2433
|
+
})) : showStatus.value && isValid.value === false ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
|
|
2434
|
+
key: 1,
|
|
2435
|
+
icon: "lucide:alert-circle",
|
|
2436
|
+
class: "size-5 text-red-500"
|
|
2437
|
+
})) : vue.createCommentVNode("", true)
|
|
2438
|
+
]),
|
|
2439
|
+
_: 1
|
|
2440
|
+
}, 8, ["size", "disabled", "invalid"]);
|
|
2441
|
+
};
|
|
2442
|
+
}
|
|
2443
|
+
});
|
|
2444
|
+
const _hoisted_1$8 = ["id", "type", "name", "placeholder", "disabled", "required", "aria-required", "aria-describedby"];
|
|
2445
|
+
const _hoisted_2$5 = ["disabled"];
|
|
2446
|
+
const _hoisted_3$4 = {
|
|
2447
|
+
key: 0,
|
|
2448
|
+
class: "mt-2"
|
|
2449
|
+
};
|
|
2450
|
+
const _hoisted_4$2 = { class: "h-1.5 w-full rounded-full bg-gray-200 dark:bg-slate-700 overflow-hidden" };
|
|
2451
|
+
const _sfc_main$8 = /* @__PURE__ */ vue.defineComponent({
|
|
2452
|
+
__name: "PasswordInput",
|
|
2453
|
+
props: /* @__PURE__ */ vue.mergeModels({
|
|
2454
|
+
placeholder: { default: "Enter password..." },
|
|
2455
|
+
size: { default: "md" },
|
|
2456
|
+
disabled: { type: Boolean },
|
|
2457
|
+
showStrength: { type: Boolean, default: false },
|
|
2458
|
+
name: {},
|
|
2459
|
+
id: {},
|
|
2460
|
+
required: { type: Boolean },
|
|
2461
|
+
describedBy: {},
|
|
2462
|
+
minLength: { default: 8 }
|
|
2463
|
+
}, {
|
|
2464
|
+
"modelValue": { default: "" },
|
|
2465
|
+
"modelModifiers": {}
|
|
2466
|
+
}),
|
|
2467
|
+
emits: ["update:modelValue"],
|
|
2468
|
+
setup(__props) {
|
|
2469
|
+
const props = __props;
|
|
2470
|
+
const modelValue = vue.useModel(__props, "modelValue");
|
|
2471
|
+
const showPassword = vue.ref(false);
|
|
2472
|
+
const strength = vue.computed(() => {
|
|
2473
|
+
const password = modelValue.value;
|
|
2474
|
+
if (!password) return null;
|
|
2475
|
+
let score = 0;
|
|
2476
|
+
if (password.length >= props.minLength) score++;
|
|
2477
|
+
if (password.length >= 12) score++;
|
|
2478
|
+
if (/[a-z]/.test(password)) score++;
|
|
2479
|
+
if (/[A-Z]/.test(password)) score++;
|
|
2480
|
+
if (/[0-9]/.test(password)) score++;
|
|
2481
|
+
if (/[^a-zA-Z0-9]/.test(password)) score++;
|
|
2482
|
+
if (score <= 2) return "weak";
|
|
2483
|
+
if (score <= 3) return "fair";
|
|
2484
|
+
if (score <= 4) return "good";
|
|
2485
|
+
return "strong";
|
|
2486
|
+
});
|
|
2487
|
+
const strengthConfig = vue.computed(() => {
|
|
2488
|
+
const configs = {
|
|
2489
|
+
weak: { label: "Weak", color: "bg-red-500", width: "w-1/4" },
|
|
2490
|
+
fair: { label: "Fair", color: "bg-orange-500", width: "w-2/4" },
|
|
2491
|
+
good: { label: "Good", color: "bg-yellow-500", width: "w-3/4" },
|
|
2492
|
+
strong: { label: "Strong", color: "bg-emerald-500", width: "w-full" }
|
|
2493
|
+
};
|
|
2494
|
+
return strength.value ? configs[strength.value] : null;
|
|
2495
|
+
});
|
|
2496
|
+
function toggleVisibility() {
|
|
2497
|
+
showPassword.value = !showPassword.value;
|
|
2498
|
+
}
|
|
2499
|
+
return (_ctx, _cache) => {
|
|
2500
|
+
var _a, _b;
|
|
2501
|
+
return vue.openBlock(), vue.createElementBlock("div", null, [
|
|
2502
|
+
vue.createVNode(_sfc_main$a, {
|
|
2503
|
+
icon: "lucide:lock",
|
|
2504
|
+
size: __props.size,
|
|
2505
|
+
disabled: __props.disabled
|
|
2506
|
+
}, {
|
|
2507
|
+
default: vue.withCtx(({ inputClass }) => [
|
|
2508
|
+
vue.withDirectives(vue.createElementVNode("input", {
|
|
2509
|
+
id: __props.id ?? __props.name,
|
|
2510
|
+
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => modelValue.value = $event),
|
|
2511
|
+
type: showPassword.value ? "text" : "password",
|
|
2512
|
+
name: __props.name,
|
|
2513
|
+
placeholder: __props.placeholder,
|
|
2514
|
+
disabled: __props.disabled,
|
|
2515
|
+
required: __props.required,
|
|
2516
|
+
"aria-required": __props.required || void 0,
|
|
2517
|
+
"aria-describedby": __props.describedBy,
|
|
2518
|
+
class: vue.normalizeClass(inputClass),
|
|
2519
|
+
autocomplete: "new-password"
|
|
2520
|
+
}, null, 10, _hoisted_1$8), [
|
|
2521
|
+
[vue.vModelDynamic, modelValue.value]
|
|
2522
|
+
])
|
|
2523
|
+
]),
|
|
2524
|
+
actions: vue.withCtx(() => [
|
|
2525
|
+
vue.createElementVNode("button", {
|
|
2526
|
+
type: "button",
|
|
2527
|
+
disabled: __props.disabled,
|
|
2528
|
+
class: "p-1 rounded hover:bg-gray-100 dark:hover:bg-slate-600 transition-colors disabled:opacity-50 disabled:cursor-not-allowed",
|
|
2529
|
+
onClick: toggleVisibility
|
|
2530
|
+
}, [
|
|
2531
|
+
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
2532
|
+
icon: showPassword.value ? "lucide:eye-off" : "lucide:eye",
|
|
2533
|
+
class: "size-5 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300"
|
|
2534
|
+
}, null, 8, ["icon"])
|
|
2535
|
+
], 8, _hoisted_2$5)
|
|
2536
|
+
]),
|
|
2537
|
+
_: 1
|
|
2538
|
+
}, 8, ["size", "disabled"]),
|
|
2539
|
+
__props.showStrength && modelValue.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$4, [
|
|
2540
|
+
vue.createElementVNode("div", _hoisted_4$2, [
|
|
2541
|
+
vue.createElementVNode("div", {
|
|
2542
|
+
class: vue.normalizeClass([
|
|
2543
|
+
"h-full rounded-full transition-all duration-300",
|
|
2544
|
+
(_a = strengthConfig.value) == null ? void 0 : _a.color,
|
|
2545
|
+
(_b = strengthConfig.value) == null ? void 0 : _b.width
|
|
2546
|
+
])
|
|
2547
|
+
}, null, 2)
|
|
2548
|
+
]),
|
|
2549
|
+
strengthConfig.value ? (vue.openBlock(), vue.createElementBlock("p", {
|
|
2550
|
+
key: 0,
|
|
2551
|
+
class: vue.normalizeClass([
|
|
2552
|
+
"mt-1 text-xs font-medium",
|
|
2553
|
+
strength.value === "weak" && "text-red-500",
|
|
2554
|
+
strength.value === "fair" && "text-orange-500",
|
|
2555
|
+
strength.value === "good" && "text-yellow-600 dark:text-yellow-500",
|
|
2556
|
+
strength.value === "strong" && "text-emerald-500"
|
|
2557
|
+
])
|
|
2558
|
+
}, vue.toDisplayString(strengthConfig.value.label), 3)) : vue.createCommentVNode("", true)
|
|
2559
|
+
])) : vue.createCommentVNode("", true)
|
|
2560
|
+
]);
|
|
2561
|
+
};
|
|
2562
|
+
}
|
|
2563
|
+
});
|
|
2564
|
+
const _hoisted_1$7 = ["disabled"];
|
|
2565
|
+
const _hoisted_2$4 = { class: "text-lg leading-none" };
|
|
2566
|
+
const _hoisted_3$3 = ["id", "value", "name", "placeholder", "disabled", "required", "aria-required", "aria-describedby"];
|
|
2567
|
+
const _hoisted_4$1 = { class: "text-xs text-gray-400 font-medium" };
|
|
2568
|
+
const _hoisted_5 = {
|
|
2569
|
+
key: 0,
|
|
2570
|
+
class: "absolute z-50 mt-1 w-full bg-white dark:bg-slate-800 border border-gray-200 dark:border-slate-700 rounded-xl shadow-lg overflow-hidden"
|
|
2571
|
+
};
|
|
2572
|
+
const _hoisted_6 = { class: "p-2 border-b border-gray-100 dark:border-slate-700" };
|
|
2573
|
+
const _hoisted_7 = { class: "max-h-48 overflow-y-auto" };
|
|
2574
|
+
const _hoisted_8 = ["onClick"];
|
|
2575
|
+
const _hoisted_9 = { class: "text-lg" };
|
|
2576
|
+
const _hoisted_10 = { class: "flex-1 text-sm text-gray-700 dark:text-gray-300" };
|
|
2577
|
+
const _hoisted_11 = { class: "text-sm text-gray-400" };
|
|
2578
|
+
const _hoisted_12 = {
|
|
2579
|
+
key: 0,
|
|
2580
|
+
class: "px-3 py-4 text-center text-sm text-gray-500"
|
|
2581
|
+
};
|
|
2582
|
+
const defaultCountries = [
|
|
2583
|
+
{ code: "FR", name: "France", dialCode: "+33", flag: "🇫🇷" },
|
|
2584
|
+
{ code: "US", name: "United States", dialCode: "+1", flag: "🇺🇸" },
|
|
2585
|
+
{ code: "GB", name: "United Kingdom", dialCode: "+44", flag: "🇬🇧" },
|
|
2586
|
+
{ code: "DE", name: "Germany", dialCode: "+49", flag: "🇩🇪" },
|
|
2587
|
+
{ code: "ES", name: "Spain", dialCode: "+34", flag: "🇪🇸" },
|
|
2588
|
+
{ code: "IT", name: "Italy", dialCode: "+39", flag: "🇮🇹" },
|
|
2589
|
+
{ code: "BE", name: "Belgium", dialCode: "+32", flag: "🇧🇪" },
|
|
2590
|
+
{ code: "CH", name: "Switzerland", dialCode: "+41", flag: "🇨🇭" },
|
|
2591
|
+
{ code: "CA", name: "Canada", dialCode: "+1", flag: "🇨🇦" },
|
|
2592
|
+
{ code: "AU", name: "Australia", dialCode: "+61", flag: "🇦🇺" },
|
|
2593
|
+
{ code: "ML", name: "Mali", dialCode: "+223", flag: "🇲🇱" },
|
|
2594
|
+
{ code: "SN", name: "Senegal", dialCode: "+221", flag: "🇸🇳" },
|
|
2595
|
+
{ code: "CI", name: "Côte d'Ivoire", dialCode: "+225", flag: "🇨🇮" },
|
|
2596
|
+
{ code: "MA", name: "Morocco", dialCode: "+212", flag: "🇲🇦" },
|
|
2597
|
+
{ code: "TN", name: "Tunisia", dialCode: "+216", flag: "🇹🇳" },
|
|
2598
|
+
{ code: "DZ", name: "Algeria", dialCode: "+213", flag: "🇩🇿" }
|
|
2599
|
+
];
|
|
2600
|
+
const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
|
|
2601
|
+
__name: "PhoneInput",
|
|
2602
|
+
props: /* @__PURE__ */ vue.mergeModels({
|
|
2603
|
+
placeholder: { default: "Phone number" },
|
|
2604
|
+
size: { default: "md" },
|
|
2605
|
+
disabled: { type: Boolean },
|
|
2606
|
+
name: {},
|
|
2607
|
+
id: {},
|
|
2608
|
+
required: { type: Boolean },
|
|
2609
|
+
describedBy: {},
|
|
2610
|
+
defaultCountry: { default: "FR" },
|
|
2611
|
+
countries: { default: () => defaultCountries }
|
|
2612
|
+
}, {
|
|
2613
|
+
"modelValue": { default: "" },
|
|
2614
|
+
"modelModifiers": {}
|
|
2615
|
+
}),
|
|
2616
|
+
emits: ["update:modelValue"],
|
|
2617
|
+
setup(__props, { expose: __expose }) {
|
|
2618
|
+
const props = __props;
|
|
2619
|
+
const modelValue = vue.useModel(__props, "modelValue");
|
|
2620
|
+
const selectedCountry = vue.ref(
|
|
2621
|
+
props.countries.find((c) => c.code === props.defaultCountry) || props.countries[0]
|
|
2622
|
+
);
|
|
2623
|
+
const showDropdown = vue.ref(false);
|
|
2624
|
+
const searchQuery = vue.ref("");
|
|
2625
|
+
const dropdownRef = vue.ref(null);
|
|
2626
|
+
const filteredCountries = vue.computed(() => {
|
|
2627
|
+
if (!searchQuery.value) return props.countries;
|
|
2628
|
+
const query = searchQuery.value.toLowerCase();
|
|
2629
|
+
return props.countries.filter(
|
|
2630
|
+
(c) => c.name.toLowerCase().includes(query) || c.dialCode.includes(query) || c.code.toLowerCase().includes(query)
|
|
2631
|
+
);
|
|
2632
|
+
});
|
|
2633
|
+
const fullNumber = vue.computed(() => {
|
|
2634
|
+
if (!modelValue.value) return "";
|
|
2635
|
+
return `${selectedCountry.value.dialCode}${modelValue.value}`;
|
|
2636
|
+
});
|
|
2637
|
+
function selectCountry(country) {
|
|
2638
|
+
selectedCountry.value = country;
|
|
2639
|
+
showDropdown.value = false;
|
|
2640
|
+
searchQuery.value = "";
|
|
2641
|
+
}
|
|
2642
|
+
function formatPhoneNumber(value) {
|
|
2643
|
+
const cleaned = value.replace(/\D/g, "");
|
|
2644
|
+
return cleaned;
|
|
2645
|
+
}
|
|
2646
|
+
function handleInput(event) {
|
|
2647
|
+
const target = event.target;
|
|
2648
|
+
const formatted = formatPhoneNumber(target.value);
|
|
2649
|
+
modelValue.value = formatted;
|
|
2650
|
+
}
|
|
2651
|
+
function handleClickOutside(event) {
|
|
2652
|
+
if (dropdownRef.value && !dropdownRef.value.contains(event.target)) {
|
|
2653
|
+
showDropdown.value = false;
|
|
2654
|
+
searchQuery.value = "";
|
|
2655
|
+
}
|
|
2656
|
+
}
|
|
2657
|
+
vue.watch(showDropdown, (isOpen) => {
|
|
2658
|
+
if (isOpen) {
|
|
2659
|
+
document.addEventListener("click", handleClickOutside);
|
|
2660
|
+
} else {
|
|
2661
|
+
document.removeEventListener("click", handleClickOutside);
|
|
2662
|
+
}
|
|
2663
|
+
});
|
|
2664
|
+
__expose({ selectedCountry, fullNumber });
|
|
2665
|
+
return (_ctx, _cache) => {
|
|
2666
|
+
return vue.openBlock(), vue.createElementBlock("div", {
|
|
2667
|
+
class: "relative",
|
|
2668
|
+
ref_key: "dropdownRef",
|
|
2669
|
+
ref: dropdownRef
|
|
2670
|
+
}, [
|
|
2671
|
+
vue.createVNode(_sfc_main$a, {
|
|
2672
|
+
size: __props.size,
|
|
2673
|
+
disabled: __props.disabled
|
|
2674
|
+
}, {
|
|
2675
|
+
icon: vue.withCtx(() => [
|
|
2676
|
+
vue.createElementVNode("button", {
|
|
2677
|
+
type: "button",
|
|
2678
|
+
disabled: __props.disabled,
|
|
2679
|
+
class: "flex items-center gap-1 pr-2 border-r border-gray-200 dark:border-slate-600 hover:bg-gray-50 dark:hover:bg-slate-600 -ml-1 pl-1 py-1 rounded-l transition-colors disabled:opacity-50 disabled:cursor-not-allowed",
|
|
2680
|
+
onClick: _cache[0] || (_cache[0] = vue.withModifiers(($event) => showDropdown.value = !showDropdown.value, ["stop"]))
|
|
2681
|
+
}, [
|
|
2682
|
+
vue.createElementVNode("span", _hoisted_2$4, vue.toDisplayString(selectedCountry.value.flag), 1),
|
|
2683
|
+
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
2684
|
+
icon: "lucide:chevron-down",
|
|
2685
|
+
class: vue.normalizeClass([
|
|
2686
|
+
"size-3 text-gray-400 transition-transform",
|
|
2687
|
+
showDropdown.value && "rotate-180"
|
|
2688
|
+
])
|
|
2689
|
+
}, null, 8, ["class"])
|
|
2690
|
+
], 8, _hoisted_1$7)
|
|
2691
|
+
]),
|
|
2692
|
+
default: vue.withCtx(({ inputClass }) => [
|
|
2693
|
+
vue.createElementVNode("input", {
|
|
2694
|
+
id: __props.id ?? __props.name,
|
|
2695
|
+
value: modelValue.value,
|
|
2696
|
+
type: "tel",
|
|
2697
|
+
name: __props.name,
|
|
2698
|
+
placeholder: __props.placeholder,
|
|
2699
|
+
disabled: __props.disabled,
|
|
2700
|
+
required: __props.required,
|
|
2701
|
+
"aria-required": __props.required || void 0,
|
|
2702
|
+
"aria-describedby": __props.describedBy,
|
|
2703
|
+
class: vue.normalizeClass([inputClass, "pl-20"]),
|
|
2704
|
+
onInput: handleInput
|
|
2705
|
+
}, null, 42, _hoisted_3$3)
|
|
2706
|
+
]),
|
|
2707
|
+
actions: vue.withCtx(() => [
|
|
2708
|
+
vue.createElementVNode("span", _hoisted_4$1, vue.toDisplayString(selectedCountry.value.dialCode), 1)
|
|
2709
|
+
]),
|
|
2710
|
+
_: 1
|
|
2711
|
+
}, 8, ["size", "disabled"]),
|
|
2712
|
+
vue.createVNode(vue.Transition, {
|
|
2713
|
+
"enter-active-class": "transition-all duration-200 ease-out",
|
|
2714
|
+
"enter-from-class": "opacity-0 -translate-y-2",
|
|
2715
|
+
"enter-to-class": "opacity-100 translate-y-0",
|
|
2716
|
+
"leave-active-class": "transition-all duration-150 ease-in",
|
|
2717
|
+
"leave-from-class": "opacity-100 translate-y-0",
|
|
2718
|
+
"leave-to-class": "opacity-0 -translate-y-2"
|
|
2719
|
+
}, {
|
|
2720
|
+
default: vue.withCtx(() => [
|
|
2721
|
+
showDropdown.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_5, [
|
|
2722
|
+
vue.createElementVNode("div", _hoisted_6, [
|
|
2723
|
+
vue.withDirectives(vue.createElementVNode("input", {
|
|
2724
|
+
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => searchQuery.value = $event),
|
|
2725
|
+
type: "text",
|
|
2726
|
+
placeholder: "Search countries...",
|
|
2727
|
+
class: "w-full px-3 py-2 text-sm border border-gray-200 dark:border-slate-600 rounded-lg bg-gray-50 dark:bg-slate-700 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-primary-500"
|
|
2728
|
+
}, null, 512), [
|
|
2729
|
+
[vue.vModelText, searchQuery.value]
|
|
2730
|
+
])
|
|
2731
|
+
]),
|
|
2732
|
+
vue.createElementVNode("ul", _hoisted_7, [
|
|
2733
|
+
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(filteredCountries.value, (country) => {
|
|
2734
|
+
return vue.openBlock(), vue.createElementBlock("li", {
|
|
2735
|
+
key: country.code,
|
|
2736
|
+
class: vue.normalizeClass(["flex items-center gap-3 px-3 py-2 cursor-pointer hover:bg-gray-50 dark:hover:bg-slate-700 transition-colors", selectedCountry.value.code === country.code && "bg-primary-50 dark:bg-primary-900/20"]),
|
|
2737
|
+
onClick: ($event) => selectCountry(country)
|
|
2738
|
+
}, [
|
|
2739
|
+
vue.createElementVNode("span", _hoisted_9, vue.toDisplayString(country.flag), 1),
|
|
2740
|
+
vue.createElementVNode("span", _hoisted_10, vue.toDisplayString(country.name), 1),
|
|
2741
|
+
vue.createElementVNode("span", _hoisted_11, vue.toDisplayString(country.dialCode), 1)
|
|
2742
|
+
], 10, _hoisted_8);
|
|
2743
|
+
}), 128)),
|
|
2744
|
+
filteredCountries.value.length === 0 ? (vue.openBlock(), vue.createElementBlock("li", _hoisted_12, " No countries found ")) : vue.createCommentVNode("", true)
|
|
2745
|
+
])
|
|
2746
|
+
])) : vue.createCommentVNode("", true)
|
|
2747
|
+
]),
|
|
2748
|
+
_: 1
|
|
2749
|
+
})
|
|
2750
|
+
], 512);
|
|
2751
|
+
};
|
|
2752
|
+
}
|
|
2753
|
+
});
|
|
2754
|
+
const _hoisted_1$6 = ["disabled"];
|
|
2755
|
+
const _hoisted_2$3 = ["id", "value", "name", "placeholder", "disabled", "required", "min", "max", "step", "aria-required", "aria-describedby"];
|
|
2756
|
+
const _hoisted_3$2 = ["disabled"];
|
|
2757
|
+
const _sfc_main$6 = /* @__PURE__ */ vue.defineComponent({
|
|
2758
|
+
__name: "NumberInput",
|
|
2759
|
+
props: /* @__PURE__ */ vue.mergeModels({
|
|
2760
|
+
placeholder: { default: "0" },
|
|
2761
|
+
size: { default: "md" },
|
|
2762
|
+
disabled: { type: Boolean },
|
|
2763
|
+
min: {},
|
|
2764
|
+
max: {},
|
|
2765
|
+
step: { default: 1 },
|
|
2766
|
+
name: {},
|
|
2767
|
+
id: {},
|
|
2768
|
+
required: { type: Boolean },
|
|
2769
|
+
describedBy: {},
|
|
2770
|
+
showStepper: { type: Boolean, default: true }
|
|
2771
|
+
}, {
|
|
2772
|
+
"modelValue": { default: null },
|
|
2773
|
+
"modelModifiers": {}
|
|
2774
|
+
}),
|
|
2775
|
+
emits: ["update:modelValue"],
|
|
2776
|
+
setup(__props) {
|
|
2777
|
+
const props = __props;
|
|
2778
|
+
const modelValue = vue.useModel(__props, "modelValue");
|
|
2779
|
+
const canDecrement = vue.computed(() => {
|
|
2780
|
+
if (props.disabled) return false;
|
|
2781
|
+
if (modelValue.value === null) return true;
|
|
2782
|
+
if (props.min !== void 0) return modelValue.value > props.min;
|
|
2783
|
+
return true;
|
|
2784
|
+
});
|
|
2785
|
+
const canIncrement = vue.computed(() => {
|
|
2786
|
+
if (props.disabled) return false;
|
|
2787
|
+
if (modelValue.value === null) return true;
|
|
2788
|
+
if (props.max !== void 0) return modelValue.value < props.max;
|
|
2789
|
+
return true;
|
|
2790
|
+
});
|
|
2791
|
+
function increment() {
|
|
2792
|
+
if (!canIncrement.value) return;
|
|
2793
|
+
const current = modelValue.value ?? 0;
|
|
2794
|
+
const newValue = current + props.step;
|
|
2795
|
+
modelValue.value = props.max !== void 0 ? Math.min(newValue, props.max) : newValue;
|
|
2796
|
+
}
|
|
2797
|
+
function decrement() {
|
|
2798
|
+
if (!canDecrement.value) return;
|
|
2799
|
+
const current = modelValue.value ?? 0;
|
|
2800
|
+
const newValue = current - props.step;
|
|
2801
|
+
modelValue.value = props.min !== void 0 ? Math.max(newValue, props.min) : newValue;
|
|
2802
|
+
}
|
|
2803
|
+
function handleInput(event) {
|
|
2804
|
+
const target = event.target;
|
|
2805
|
+
const value = target.value === "" ? null : parseFloat(target.value);
|
|
2806
|
+
if (value !== null && !isNaN(value)) {
|
|
2807
|
+
let clampedValue = value;
|
|
2808
|
+
if (props.min !== void 0) clampedValue = Math.max(clampedValue, props.min);
|
|
2809
|
+
if (props.max !== void 0) clampedValue = Math.min(clampedValue, props.max);
|
|
2810
|
+
modelValue.value = clampedValue;
|
|
2811
|
+
} else {
|
|
2812
|
+
modelValue.value = null;
|
|
2813
|
+
}
|
|
2814
|
+
}
|
|
2815
|
+
return (_ctx, _cache) => {
|
|
2816
|
+
return vue.openBlock(), vue.createBlock(_sfc_main$a, {
|
|
2817
|
+
size: __props.size,
|
|
2818
|
+
disabled: __props.disabled
|
|
2819
|
+
}, vue.createSlots({
|
|
2820
|
+
default: vue.withCtx(({ inputClass }) => [
|
|
2821
|
+
vue.createElementVNode("input", {
|
|
2822
|
+
id: __props.id ?? __props.name,
|
|
2823
|
+
value: modelValue.value,
|
|
2824
|
+
type: "number",
|
|
2825
|
+
name: __props.name,
|
|
2826
|
+
placeholder: __props.placeholder,
|
|
2827
|
+
disabled: __props.disabled,
|
|
2828
|
+
required: __props.required,
|
|
2829
|
+
min: __props.min,
|
|
2830
|
+
max: __props.max,
|
|
2831
|
+
step: __props.step,
|
|
2832
|
+
"aria-required": __props.required || void 0,
|
|
2833
|
+
"aria-describedby": __props.describedBy,
|
|
2834
|
+
class: vue.normalizeClass([inputClass, "text-center", __props.showStepper && "pl-12 pr-12"]),
|
|
2835
|
+
onInput: handleInput
|
|
2836
|
+
}, null, 42, _hoisted_2$3)
|
|
2837
|
+
]),
|
|
2838
|
+
_: 2
|
|
2839
|
+
}, [
|
|
2840
|
+
__props.showStepper ? {
|
|
2841
|
+
name: "icon",
|
|
2842
|
+
fn: vue.withCtx(() => [
|
|
2843
|
+
vue.createElementVNode("button", {
|
|
2844
|
+
type: "button",
|
|
2845
|
+
disabled: !canDecrement.value,
|
|
2846
|
+
class: "p-1 rounded hover:bg-gray-100 dark:hover:bg-slate-600 transition-colors disabled:opacity-30 disabled:cursor-not-allowed",
|
|
2847
|
+
onClick: decrement
|
|
2848
|
+
}, [
|
|
2849
|
+
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
2850
|
+
icon: "lucide:minus",
|
|
2851
|
+
class: "size-4 text-gray-500"
|
|
2852
|
+
})
|
|
2853
|
+
], 8, _hoisted_1$6)
|
|
2854
|
+
]),
|
|
2855
|
+
key: "0"
|
|
2856
|
+
} : void 0,
|
|
2857
|
+
__props.showStepper ? {
|
|
2858
|
+
name: "actions",
|
|
2859
|
+
fn: vue.withCtx(() => [
|
|
2860
|
+
vue.createElementVNode("button", {
|
|
2861
|
+
type: "button",
|
|
2862
|
+
disabled: !canIncrement.value,
|
|
2863
|
+
class: "p-1 rounded hover:bg-gray-100 dark:hover:bg-slate-600 transition-colors disabled:opacity-30 disabled:cursor-not-allowed",
|
|
2864
|
+
onClick: increment
|
|
2865
|
+
}, [
|
|
2866
|
+
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
2867
|
+
icon: "lucide:plus",
|
|
2868
|
+
class: "size-4 text-gray-500"
|
|
2869
|
+
})
|
|
2870
|
+
], 8, _hoisted_3$2)
|
|
2871
|
+
]),
|
|
2872
|
+
key: "1"
|
|
2873
|
+
} : void 0
|
|
2874
|
+
]), 1032, ["size", "disabled"]);
|
|
2875
|
+
};
|
|
2876
|
+
}
|
|
2877
|
+
});
|
|
2878
|
+
const _hoisted_1$5 = { class: "text-sm font-medium text-gray-500 dark:text-gray-400" };
|
|
2879
|
+
const _hoisted_2$2 = ["id", "value", "name", "placeholder", "disabled", "required", "aria-required", "aria-describedby"];
|
|
2880
|
+
const _hoisted_3$1 = { class: "text-sm font-medium text-gray-500 dark:text-gray-400" };
|
|
2881
|
+
const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
|
|
2882
|
+
__name: "MoneyInput",
|
|
2883
|
+
props: /* @__PURE__ */ vue.mergeModels({
|
|
2884
|
+
placeholder: { default: "0.00" },
|
|
2885
|
+
size: { default: "md" },
|
|
2886
|
+
disabled: { type: Boolean },
|
|
2887
|
+
currency: { default: "EUR" },
|
|
2888
|
+
min: {},
|
|
2889
|
+
max: {},
|
|
2890
|
+
decimals: { default: 2 },
|
|
2891
|
+
name: {},
|
|
2892
|
+
id: {},
|
|
2893
|
+
required: { type: Boolean },
|
|
2894
|
+
describedBy: {}
|
|
2895
|
+
}, {
|
|
2896
|
+
"modelValue": { default: null },
|
|
2897
|
+
"modelModifiers": {}
|
|
2898
|
+
}),
|
|
2899
|
+
emits: ["update:modelValue"],
|
|
2900
|
+
setup(__props) {
|
|
2901
|
+
const currencyConfig = {
|
|
2902
|
+
EUR: { symbol: "€", locale: "fr-FR", position: "suffix" },
|
|
2903
|
+
USD: { symbol: "$", locale: "en-US", position: "prefix" },
|
|
2904
|
+
GBP: { symbol: "£", locale: "en-GB", position: "prefix" },
|
|
2905
|
+
XOF: { symbol: "CFA", locale: "fr-FR", position: "suffix" },
|
|
2906
|
+
MAD: { symbol: "DH", locale: "fr-MA", position: "suffix" },
|
|
2907
|
+
CHF: { symbol: "CHF", locale: "fr-CH", position: "suffix" },
|
|
2908
|
+
CAD: { symbol: "CA$", locale: "en-CA", position: "prefix" }
|
|
2909
|
+
};
|
|
2910
|
+
const props = __props;
|
|
2911
|
+
const modelValue = vue.useModel(__props, "modelValue");
|
|
2912
|
+
const config = vue.computed(() => currencyConfig[props.currency]);
|
|
2913
|
+
const displayValue = vue.ref("");
|
|
2914
|
+
function formatForDisplay(value) {
|
|
2915
|
+
if (value === null) return "";
|
|
2916
|
+
return value.toLocaleString(config.value.locale, {
|
|
2917
|
+
minimumFractionDigits: props.decimals,
|
|
2918
|
+
maximumFractionDigits: props.decimals
|
|
2919
|
+
});
|
|
2920
|
+
}
|
|
2921
|
+
function parseDisplayValue(value) {
|
|
2922
|
+
if (!value) return null;
|
|
2923
|
+
const cleaned = value.replace(/\s/g, "").replace(/,/g, ".");
|
|
2924
|
+
const parsed = parseFloat(cleaned);
|
|
2925
|
+
return isNaN(parsed) ? null : parsed;
|
|
2926
|
+
}
|
|
2927
|
+
vue.watch(
|
|
2928
|
+
() => modelValue.value,
|
|
2929
|
+
(newValue) => {
|
|
2930
|
+
displayValue.value = formatForDisplay(newValue);
|
|
2931
|
+
},
|
|
2932
|
+
{ immediate: true }
|
|
2933
|
+
);
|
|
2934
|
+
function handleInput(event) {
|
|
2935
|
+
const target = event.target;
|
|
2936
|
+
displayValue.value = target.value;
|
|
2937
|
+
}
|
|
2938
|
+
function handleBlur() {
|
|
2939
|
+
const parsed = parseDisplayValue(displayValue.value);
|
|
2940
|
+
if (parsed !== null) {
|
|
2941
|
+
let clampedValue = parsed;
|
|
2942
|
+
if (props.min !== void 0) clampedValue = Math.max(clampedValue, props.min);
|
|
2943
|
+
if (props.max !== void 0) clampedValue = Math.min(clampedValue, props.max);
|
|
2944
|
+
modelValue.value = clampedValue;
|
|
2945
|
+
displayValue.value = formatForDisplay(clampedValue);
|
|
2946
|
+
} else {
|
|
2947
|
+
modelValue.value = null;
|
|
2948
|
+
displayValue.value = "";
|
|
2949
|
+
}
|
|
2950
|
+
}
|
|
2951
|
+
return (_ctx, _cache) => {
|
|
2952
|
+
return vue.openBlock(), vue.createBlock(_sfc_main$a, {
|
|
2953
|
+
size: __props.size,
|
|
2954
|
+
disabled: __props.disabled
|
|
2955
|
+
}, vue.createSlots({
|
|
2956
|
+
default: vue.withCtx(({ inputClass }) => [
|
|
2957
|
+
vue.createElementVNode("input", {
|
|
2958
|
+
id: __props.id ?? __props.name,
|
|
2959
|
+
value: displayValue.value,
|
|
2960
|
+
type: "text",
|
|
2961
|
+
inputmode: "decimal",
|
|
2962
|
+
name: __props.name,
|
|
2963
|
+
placeholder: __props.placeholder,
|
|
2964
|
+
disabled: __props.disabled,
|
|
2965
|
+
required: __props.required,
|
|
2966
|
+
"aria-required": __props.required || void 0,
|
|
2967
|
+
"aria-describedby": __props.describedBy,
|
|
2968
|
+
class: vue.normalizeClass([inputClass, "text-right"]),
|
|
2969
|
+
onInput: handleInput,
|
|
2970
|
+
onBlur: handleBlur
|
|
2971
|
+
}, null, 42, _hoisted_2$2)
|
|
2972
|
+
]),
|
|
2973
|
+
_: 2
|
|
2974
|
+
}, [
|
|
2975
|
+
config.value.position === "prefix" ? {
|
|
2976
|
+
name: "icon",
|
|
2977
|
+
fn: vue.withCtx(() => [
|
|
2978
|
+
vue.createElementVNode("span", _hoisted_1$5, vue.toDisplayString(config.value.symbol), 1)
|
|
2979
|
+
]),
|
|
2980
|
+
key: "0"
|
|
2981
|
+
} : void 0,
|
|
2982
|
+
config.value.position === "suffix" ? {
|
|
2983
|
+
name: "actions",
|
|
2984
|
+
fn: vue.withCtx(() => [
|
|
2985
|
+
vue.createElementVNode("span", _hoisted_3$1, vue.toDisplayString(config.value.symbol), 1)
|
|
2986
|
+
]),
|
|
2987
|
+
key: "1"
|
|
2988
|
+
} : void 0
|
|
2989
|
+
]), 1032, ["size", "disabled"]);
|
|
2990
|
+
};
|
|
2991
|
+
}
|
|
2992
|
+
});
|
|
2993
|
+
const _hoisted_1$4 = ["id", "value", "name", "placeholder", "disabled", "required", "min", "max", "step", "aria-required", "aria-describedby"];
|
|
2994
|
+
const _sfc_main$4 = /* @__PURE__ */ vue.defineComponent({
|
|
2995
|
+
__name: "PercentInput",
|
|
2996
|
+
props: /* @__PURE__ */ vue.mergeModels({
|
|
2997
|
+
placeholder: { default: "0" },
|
|
2998
|
+
size: { default: "md" },
|
|
2999
|
+
disabled: { type: Boolean },
|
|
3000
|
+
min: { default: 0 },
|
|
3001
|
+
max: { default: 100 },
|
|
3002
|
+
decimals: { default: 0 },
|
|
3003
|
+
name: {},
|
|
3004
|
+
id: {},
|
|
3005
|
+
required: { type: Boolean },
|
|
3006
|
+
describedBy: {}
|
|
3007
|
+
}, {
|
|
3008
|
+
"modelValue": { default: null },
|
|
3009
|
+
"modelModifiers": {}
|
|
3010
|
+
}),
|
|
3011
|
+
emits: ["update:modelValue"],
|
|
3012
|
+
setup(__props) {
|
|
3013
|
+
const props = __props;
|
|
3014
|
+
const modelValue = vue.useModel(__props, "modelValue");
|
|
3015
|
+
const displayValue = vue.computed({
|
|
3016
|
+
get: () => modelValue.value !== null ? modelValue.value.toString() : "",
|
|
3017
|
+
set: (val) => {
|
|
3018
|
+
if (val === "") {
|
|
3019
|
+
modelValue.value = null;
|
|
3020
|
+
return;
|
|
3021
|
+
}
|
|
3022
|
+
const parsed = parseFloat(val);
|
|
3023
|
+
if (!isNaN(parsed)) {
|
|
3024
|
+
let clamped = parsed;
|
|
3025
|
+
if (props.min !== void 0) clamped = Math.max(clamped, props.min);
|
|
3026
|
+
if (props.max !== void 0) clamped = Math.min(clamped, props.max);
|
|
3027
|
+
modelValue.value = clamped;
|
|
3028
|
+
}
|
|
3029
|
+
}
|
|
3030
|
+
});
|
|
3031
|
+
function handleInput(event) {
|
|
3032
|
+
const target = event.target;
|
|
3033
|
+
displayValue.value = target.value;
|
|
3034
|
+
}
|
|
3035
|
+
return (_ctx, _cache) => {
|
|
3036
|
+
return vue.openBlock(), vue.createBlock(_sfc_main$a, {
|
|
3037
|
+
size: __props.size,
|
|
3038
|
+
disabled: __props.disabled
|
|
3039
|
+
}, {
|
|
3040
|
+
default: vue.withCtx(({ inputClass }) => [
|
|
3041
|
+
vue.createElementVNode("input", {
|
|
3042
|
+
id: __props.id ?? __props.name,
|
|
3043
|
+
value: displayValue.value,
|
|
3044
|
+
type: "number",
|
|
3045
|
+
inputmode: "decimal",
|
|
3046
|
+
name: __props.name,
|
|
3047
|
+
placeholder: __props.placeholder,
|
|
3048
|
+
disabled: __props.disabled,
|
|
3049
|
+
required: __props.required,
|
|
3050
|
+
min: __props.min,
|
|
3051
|
+
max: __props.max,
|
|
3052
|
+
step: __props.decimals > 0 ? Math.pow(10, -__props.decimals) : 1,
|
|
3053
|
+
"aria-required": __props.required || void 0,
|
|
3054
|
+
"aria-describedby": __props.describedBy,
|
|
3055
|
+
class: vue.normalizeClass([inputClass, "text-right pr-10"]),
|
|
3056
|
+
onInput: handleInput
|
|
3057
|
+
}, null, 42, _hoisted_1$4)
|
|
3058
|
+
]),
|
|
3059
|
+
actions: vue.withCtx(() => [..._cache[0] || (_cache[0] = [
|
|
3060
|
+
vue.createElementVNode("span", { class: "text-sm font-medium text-gray-500 dark:text-gray-400" }, "%", -1)
|
|
3061
|
+
])]),
|
|
3062
|
+
_: 1
|
|
3063
|
+
}, 8, ["size", "disabled"]);
|
|
3064
|
+
};
|
|
3065
|
+
}
|
|
3066
|
+
});
|
|
3067
|
+
const _hoisted_1$3 = { class: "inline-flex items-center gap-2 bg-gray-50 dark:bg-slate-700 rounded-xl p-1 border border-gray-200 dark:border-slate-600" };
|
|
3068
|
+
const _hoisted_2$1 = ["disabled"];
|
|
3069
|
+
const _hoisted_3 = ["id", "value", "name", "disabled", "required", "min", "max"];
|
|
3070
|
+
const _hoisted_4 = ["disabled"];
|
|
3071
|
+
const _sfc_main$3 = /* @__PURE__ */ vue.defineComponent({
|
|
3072
|
+
__name: "QuantityInput",
|
|
3073
|
+
props: /* @__PURE__ */ vue.mergeModels({
|
|
3074
|
+
size: { default: "md" },
|
|
3075
|
+
disabled: { type: Boolean },
|
|
3076
|
+
min: { default: 1 },
|
|
3077
|
+
max: {},
|
|
3078
|
+
step: { default: 1 },
|
|
3079
|
+
name: {},
|
|
3080
|
+
id: {},
|
|
3081
|
+
required: { type: Boolean }
|
|
3082
|
+
}, {
|
|
3083
|
+
"modelValue": { default: 1 },
|
|
3084
|
+
"modelModifiers": {}
|
|
3085
|
+
}),
|
|
3086
|
+
emits: ["update:modelValue"],
|
|
3087
|
+
setup(__props) {
|
|
3088
|
+
const props = __props;
|
|
3089
|
+
const modelValue = vue.useModel(__props, "modelValue");
|
|
3090
|
+
const canDecrement = vue.computed(() => {
|
|
3091
|
+
if (props.disabled) return false;
|
|
3092
|
+
if (props.min !== void 0) return modelValue.value > props.min;
|
|
3093
|
+
return true;
|
|
3094
|
+
});
|
|
3095
|
+
const canIncrement = vue.computed(() => {
|
|
3096
|
+
if (props.disabled) return false;
|
|
3097
|
+
if (props.max !== void 0) return modelValue.value < props.max;
|
|
3098
|
+
return true;
|
|
3099
|
+
});
|
|
3100
|
+
function increment() {
|
|
3101
|
+
if (!canIncrement.value) return;
|
|
3102
|
+
const newValue = modelValue.value + props.step;
|
|
3103
|
+
modelValue.value = props.max !== void 0 ? Math.min(newValue, props.max) : newValue;
|
|
3104
|
+
}
|
|
3105
|
+
function decrement() {
|
|
3106
|
+
if (!canDecrement.value) return;
|
|
3107
|
+
const newValue = modelValue.value - props.step;
|
|
3108
|
+
modelValue.value = props.min !== void 0 ? Math.max(newValue, props.min) : newValue;
|
|
3109
|
+
}
|
|
3110
|
+
function handleInput(event) {
|
|
3111
|
+
const target = event.target;
|
|
3112
|
+
const value = parseInt(target.value, 10);
|
|
3113
|
+
if (!isNaN(value)) {
|
|
3114
|
+
let clampedValue = value;
|
|
3115
|
+
if (props.min !== void 0) clampedValue = Math.max(clampedValue, props.min);
|
|
3116
|
+
if (props.max !== void 0) clampedValue = Math.min(clampedValue, props.max);
|
|
3117
|
+
modelValue.value = clampedValue;
|
|
3118
|
+
}
|
|
3119
|
+
}
|
|
3120
|
+
const sizeClasses = vue.computed(() => ({
|
|
3121
|
+
button: {
|
|
3122
|
+
sm: "size-7",
|
|
3123
|
+
md: "size-9",
|
|
3124
|
+
lg: "size-11"
|
|
3125
|
+
}[props.size],
|
|
3126
|
+
icon: {
|
|
3127
|
+
sm: "size-3",
|
|
3128
|
+
md: "size-4",
|
|
3129
|
+
lg: "size-5"
|
|
3130
|
+
}[props.size],
|
|
3131
|
+
input: {
|
|
3132
|
+
sm: "text-sm w-10",
|
|
3133
|
+
md: "text-base w-12",
|
|
3134
|
+
lg: "text-lg w-14"
|
|
3135
|
+
}[props.size]
|
|
3136
|
+
}));
|
|
3137
|
+
return (_ctx, _cache) => {
|
|
3138
|
+
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$3, [
|
|
3139
|
+
vue.createElementVNode("button", {
|
|
3140
|
+
type: "button",
|
|
3141
|
+
disabled: !canDecrement.value,
|
|
3142
|
+
class: vue.normalizeClass([
|
|
3143
|
+
"flex items-center justify-center rounded-lg bg-white dark:bg-slate-600 border border-gray-200 dark:border-slate-500 transition-all",
|
|
3144
|
+
"hover:bg-gray-50 dark:hover:bg-slate-500 hover:border-gray-300 dark:hover:border-slate-400",
|
|
3145
|
+
"disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-white dark:disabled:hover:bg-slate-600",
|
|
3146
|
+
"shadow-sm",
|
|
3147
|
+
sizeClasses.value.button
|
|
3148
|
+
]),
|
|
3149
|
+
onClick: decrement
|
|
3150
|
+
}, [
|
|
3151
|
+
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
3152
|
+
icon: "lucide:minus",
|
|
3153
|
+
class: vue.normalizeClass(["text-gray-600 dark:text-gray-300", sizeClasses.value.icon])
|
|
3154
|
+
}, null, 8, ["class"])
|
|
3155
|
+
], 10, _hoisted_2$1),
|
|
3156
|
+
vue.createElementVNode("input", {
|
|
3157
|
+
id: __props.id ?? __props.name,
|
|
3158
|
+
value: modelValue.value,
|
|
3159
|
+
type: "number",
|
|
3160
|
+
name: __props.name,
|
|
3161
|
+
disabled: __props.disabled,
|
|
3162
|
+
required: __props.required,
|
|
3163
|
+
min: __props.min,
|
|
3164
|
+
max: __props.max,
|
|
3165
|
+
class: vue.normalizeClass([
|
|
3166
|
+
"bg-transparent text-center font-semibold text-gray-900 dark:text-white",
|
|
3167
|
+
"focus:outline-none appearance-none",
|
|
3168
|
+
"[&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none",
|
|
3169
|
+
"disabled:opacity-50",
|
|
3170
|
+
sizeClasses.value.input
|
|
3171
|
+
]),
|
|
3172
|
+
onInput: handleInput
|
|
3173
|
+
}, null, 42, _hoisted_3),
|
|
3174
|
+
vue.createElementVNode("button", {
|
|
3175
|
+
type: "button",
|
|
3176
|
+
disabled: !canIncrement.value,
|
|
3177
|
+
class: vue.normalizeClass([
|
|
3178
|
+
"flex items-center justify-center rounded-lg bg-white dark:bg-slate-600 border border-gray-200 dark:border-slate-500 transition-all",
|
|
3179
|
+
"hover:bg-gray-50 dark:hover:bg-slate-500 hover:border-gray-300 dark:hover:border-slate-400",
|
|
3180
|
+
"disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-white dark:disabled:hover:bg-slate-600",
|
|
3181
|
+
"shadow-sm",
|
|
3182
|
+
sizeClasses.value.button
|
|
3183
|
+
]),
|
|
3184
|
+
onClick: increment
|
|
3185
|
+
}, [
|
|
3186
|
+
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
3187
|
+
icon: "lucide:plus",
|
|
3188
|
+
class: vue.normalizeClass(["text-gray-600 dark:text-gray-300", sizeClasses.value.icon])
|
|
3189
|
+
}, null, 8, ["class"])
|
|
3190
|
+
], 10, _hoisted_4)
|
|
3191
|
+
]);
|
|
3192
|
+
};
|
|
3193
|
+
}
|
|
3194
|
+
});
|
|
3195
|
+
const _hoisted_1$2 = ["id", "name", "placeholder", "disabled", "required", "aria-invalid", "aria-required", "aria-describedby"];
|
|
3196
|
+
const _sfc_main$2 = /* @__PURE__ */ vue.defineComponent({
|
|
3197
|
+
__name: "URLInput",
|
|
3198
|
+
props: /* @__PURE__ */ vue.mergeModels({
|
|
3199
|
+
placeholder: { default: "https://example.com" },
|
|
3200
|
+
size: { default: "md" },
|
|
3201
|
+
disabled: { type: Boolean },
|
|
3202
|
+
showValidation: { type: Boolean, default: true },
|
|
3203
|
+
name: {},
|
|
3204
|
+
id: {},
|
|
3205
|
+
required: { type: Boolean },
|
|
3206
|
+
describedBy: {}
|
|
3207
|
+
}, {
|
|
3208
|
+
"modelValue": { default: "" },
|
|
3209
|
+
"modelModifiers": {}
|
|
3210
|
+
}),
|
|
3211
|
+
emits: ["update:modelValue"],
|
|
3212
|
+
setup(__props) {
|
|
3213
|
+
const props = __props;
|
|
3214
|
+
const modelValue = vue.useModel(__props, "modelValue");
|
|
3215
|
+
const urlRegex = /^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([/\w .-]*)*\/?$/;
|
|
3216
|
+
const isValid = vue.computed(() => {
|
|
3217
|
+
if (!modelValue.value) return null;
|
|
3218
|
+
return urlRegex.test(modelValue.value);
|
|
3219
|
+
});
|
|
3220
|
+
const isTouched = vue.ref(false);
|
|
3221
|
+
const showStatus = vue.computed(() => {
|
|
3222
|
+
return props.showValidation && isTouched.value && !!modelValue.value;
|
|
3223
|
+
});
|
|
3224
|
+
function handleBlur() {
|
|
3225
|
+
isTouched.value = true;
|
|
3226
|
+
}
|
|
3227
|
+
function openUrl() {
|
|
3228
|
+
if (isValid.value && modelValue.value) {
|
|
3229
|
+
const url = modelValue.value.startsWith("http") ? modelValue.value : `https://${modelValue.value}`;
|
|
3230
|
+
window.open(url, "_blank");
|
|
3231
|
+
}
|
|
3232
|
+
}
|
|
3233
|
+
return (_ctx, _cache) => {
|
|
3234
|
+
return vue.openBlock(), vue.createBlock(_sfc_main$a, {
|
|
3235
|
+
icon: "lucide:link",
|
|
3236
|
+
size: __props.size,
|
|
3237
|
+
disabled: __props.disabled,
|
|
3238
|
+
invalid: showStatus.value && isValid.value === false
|
|
3239
|
+
}, {
|
|
3240
|
+
default: vue.withCtx(({ inputClass }) => [
|
|
3241
|
+
vue.withDirectives(vue.createElementVNode("input", {
|
|
3242
|
+
id: __props.id ?? __props.name,
|
|
3243
|
+
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => modelValue.value = $event),
|
|
3244
|
+
type: "url",
|
|
3245
|
+
name: __props.name,
|
|
3246
|
+
placeholder: __props.placeholder,
|
|
3247
|
+
disabled: __props.disabled,
|
|
3248
|
+
required: __props.required,
|
|
3249
|
+
"aria-invalid": showStatus.value && isValid.value === false || void 0,
|
|
3250
|
+
"aria-required": __props.required || void 0,
|
|
3251
|
+
"aria-describedby": __props.describedBy,
|
|
3252
|
+
class: vue.normalizeClass(inputClass),
|
|
3253
|
+
onBlur: handleBlur
|
|
3254
|
+
}, null, 42, _hoisted_1$2), [
|
|
3255
|
+
[vue.vModelText, modelValue.value]
|
|
3256
|
+
])
|
|
3257
|
+
]),
|
|
3258
|
+
actions: vue.withCtx(() => [
|
|
3259
|
+
showStatus.value && isValid.value && modelValue.value ? (vue.openBlock(), vue.createElementBlock("button", {
|
|
3260
|
+
key: 0,
|
|
3261
|
+
type: "button",
|
|
3262
|
+
class: "p-1 rounded hover:bg-gray-100 dark:hover:bg-slate-600 transition-colors",
|
|
3263
|
+
title: "Open URL",
|
|
3264
|
+
onClick: openUrl
|
|
3265
|
+
}, [
|
|
3266
|
+
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
3267
|
+
icon: "lucide:external-link",
|
|
3268
|
+
class: "size-4 text-gray-400 hover:text-primary-500"
|
|
3269
|
+
})
|
|
3270
|
+
])) : showStatus.value && isValid.value === false ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
|
|
3271
|
+
key: 1,
|
|
3272
|
+
icon: "lucide:alert-circle",
|
|
3273
|
+
class: "size-5 text-red-500"
|
|
3274
|
+
})) : vue.createCommentVNode("", true)
|
|
3275
|
+
]),
|
|
3276
|
+
_: 1
|
|
3277
|
+
}, 8, ["size", "disabled", "invalid"]);
|
|
3278
|
+
};
|
|
3279
|
+
}
|
|
3280
|
+
});
|
|
3281
|
+
const _hoisted_1$1 = ["value", "type", "name", "disabled", "onInput", "onKeydown"];
|
|
3282
|
+
const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
|
|
3283
|
+
__name: "OTPInput",
|
|
3284
|
+
props: /* @__PURE__ */ vue.mergeModels({
|
|
3285
|
+
length: { default: 6 },
|
|
3286
|
+
size: { default: "md" },
|
|
3287
|
+
disabled: { type: Boolean },
|
|
3288
|
+
autoFocus: { type: Boolean, default: true },
|
|
3289
|
+
name: {},
|
|
3290
|
+
masked: { type: Boolean, default: false }
|
|
3291
|
+
}, {
|
|
3292
|
+
"modelValue": { default: "" },
|
|
3293
|
+
"modelModifiers": {}
|
|
3294
|
+
}),
|
|
3295
|
+
emits: /* @__PURE__ */ vue.mergeModels(["complete"], ["update:modelValue"]),
|
|
3296
|
+
setup(__props, { expose: __expose, emit: __emit }) {
|
|
3297
|
+
const props = __props;
|
|
3298
|
+
const emit = __emit;
|
|
3299
|
+
const modelValue = vue.useModel(__props, "modelValue");
|
|
3300
|
+
const inputRefs = vue.ref([]);
|
|
3301
|
+
const digits = vue.computed(() => {
|
|
3302
|
+
const arr = modelValue.value.split("");
|
|
3303
|
+
while (arr.length < props.length) {
|
|
3304
|
+
arr.push("");
|
|
3305
|
+
}
|
|
3306
|
+
return arr.slice(0, props.length);
|
|
3307
|
+
});
|
|
3308
|
+
const sizeClasses = vue.computed(() => ({
|
|
3309
|
+
input: {
|
|
3310
|
+
sm: "size-10 text-lg",
|
|
3311
|
+
md: "size-12 text-xl",
|
|
3312
|
+
lg: "size-14 text-2xl"
|
|
3313
|
+
}[props.size],
|
|
3314
|
+
gap: {
|
|
3315
|
+
sm: "gap-2",
|
|
3316
|
+
md: "gap-3",
|
|
3317
|
+
lg: "gap-4"
|
|
3318
|
+
}[props.size]
|
|
3319
|
+
}));
|
|
3320
|
+
function updateValue(index2, value) {
|
|
3321
|
+
const newDigits = [...digits.value];
|
|
3322
|
+
newDigits[index2] = value.slice(-1);
|
|
3323
|
+
modelValue.value = newDigits.join("");
|
|
3324
|
+
if (modelValue.value.length === props.length && !modelValue.value.includes("")) {
|
|
3325
|
+
emit("complete", modelValue.value);
|
|
3326
|
+
}
|
|
3327
|
+
}
|
|
3328
|
+
function handleInput(event, index2) {
|
|
3329
|
+
const target = event.target;
|
|
3330
|
+
const value = target.value.replace(/\D/g, "");
|
|
3331
|
+
if (value) {
|
|
3332
|
+
updateValue(index2, value);
|
|
3333
|
+
if (index2 < props.length - 1) {
|
|
3334
|
+
vue.nextTick(() => {
|
|
3335
|
+
var _a;
|
|
3336
|
+
(_a = inputRefs.value[index2 + 1]) == null ? void 0 : _a.focus();
|
|
3337
|
+
});
|
|
3338
|
+
}
|
|
3339
|
+
}
|
|
3340
|
+
}
|
|
3341
|
+
function handleKeydown(event, index2) {
|
|
3342
|
+
var _a, _b, _c;
|
|
3343
|
+
const target = event.target;
|
|
3344
|
+
if (event.key === "Backspace") {
|
|
3345
|
+
if (!target.value && index2 > 0) {
|
|
3346
|
+
(_a = inputRefs.value[index2 - 1]) == null ? void 0 : _a.focus();
|
|
3347
|
+
}
|
|
3348
|
+
updateValue(index2, "");
|
|
3349
|
+
} else if (event.key === "ArrowLeft" && index2 > 0) {
|
|
3350
|
+
(_b = inputRefs.value[index2 - 1]) == null ? void 0 : _b.focus();
|
|
3351
|
+
} else if (event.key === "ArrowRight" && index2 < props.length - 1) {
|
|
3352
|
+
(_c = inputRefs.value[index2 + 1]) == null ? void 0 : _c.focus();
|
|
3353
|
+
}
|
|
3354
|
+
}
|
|
3355
|
+
function handlePaste(event) {
|
|
3356
|
+
var _a;
|
|
3357
|
+
event.preventDefault();
|
|
3358
|
+
const pastedData = (_a = event.clipboardData) == null ? void 0 : _a.getData("text").replace(/\D/g, "").slice(0, props.length);
|
|
3359
|
+
if (pastedData) {
|
|
3360
|
+
modelValue.value = pastedData;
|
|
3361
|
+
const focusIndex = Math.min(pastedData.length, props.length - 1);
|
|
3362
|
+
vue.nextTick(() => {
|
|
3363
|
+
var _a2;
|
|
3364
|
+
(_a2 = inputRefs.value[focusIndex]) == null ? void 0 : _a2.focus();
|
|
3365
|
+
});
|
|
3366
|
+
}
|
|
3367
|
+
}
|
|
3368
|
+
function handleFocus(event) {
|
|
3369
|
+
const target = event.target;
|
|
3370
|
+
target.select();
|
|
3371
|
+
}
|
|
3372
|
+
vue.watch(
|
|
3373
|
+
() => modelValue.value,
|
|
3374
|
+
(newValue) => {
|
|
3375
|
+
if (newValue.length === props.length) {
|
|
3376
|
+
emit("complete", newValue);
|
|
3377
|
+
}
|
|
3378
|
+
}
|
|
3379
|
+
);
|
|
3380
|
+
vue.onMounted(() => {
|
|
3381
|
+
var _a;
|
|
3382
|
+
if (props.autoFocus) {
|
|
3383
|
+
(_a = inputRefs.value[0]) == null ? void 0 : _a.focus();
|
|
3384
|
+
}
|
|
3385
|
+
});
|
|
3386
|
+
function setInputRef(el, index2) {
|
|
3387
|
+
if (el) {
|
|
3388
|
+
inputRefs.value[index2] = el;
|
|
3389
|
+
}
|
|
3390
|
+
}
|
|
3391
|
+
__expose({ focus: () => {
|
|
3392
|
+
var _a;
|
|
3393
|
+
return (_a = inputRefs.value[0]) == null ? void 0 : _a.focus();
|
|
3394
|
+
} });
|
|
3395
|
+
return (_ctx, _cache) => {
|
|
3396
|
+
return vue.openBlock(), vue.createElementBlock("div", {
|
|
3397
|
+
class: vue.normalizeClass(["inline-flex", sizeClasses.value.gap])
|
|
3398
|
+
}, [
|
|
3399
|
+
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(digits.value, (digit, index2) => {
|
|
3400
|
+
return vue.openBlock(), vue.createElementBlock("input", {
|
|
3401
|
+
key: index2,
|
|
3402
|
+
ref_for: true,
|
|
3403
|
+
ref: (el) => setInputRef(el, index2),
|
|
3404
|
+
value: digit,
|
|
3405
|
+
type: __props.masked ? "password" : "text",
|
|
3406
|
+
inputmode: "numeric",
|
|
3407
|
+
name: __props.name ? `${__props.name}-${index2}` : void 0,
|
|
3408
|
+
disabled: __props.disabled,
|
|
3409
|
+
maxlength: "1",
|
|
3410
|
+
autocomplete: "one-time-code",
|
|
3411
|
+
class: vue.normalizeClass([
|
|
3412
|
+
"text-center font-semibold rounded-xl border-2 transition-all",
|
|
3413
|
+
"bg-gray-50 dark:bg-slate-700 text-gray-900 dark:text-white",
|
|
3414
|
+
"border-gray-200 dark:border-slate-600",
|
|
3415
|
+
"focus:border-primary-500 focus:ring-2 focus:ring-primary-500 focus:ring-offset-2 focus:outline-none",
|
|
3416
|
+
"disabled:opacity-50 disabled:cursor-not-allowed",
|
|
3417
|
+
digit ? "border-primary-300 dark:border-primary-500/50" : "",
|
|
3418
|
+
sizeClasses.value.input
|
|
3419
|
+
]),
|
|
3420
|
+
onInput: ($event) => handleInput($event, index2),
|
|
3421
|
+
onKeydown: ($event) => handleKeydown($event, index2),
|
|
3422
|
+
onPaste: handlePaste,
|
|
3423
|
+
onFocus: handleFocus
|
|
3424
|
+
}, null, 42, _hoisted_1$1);
|
|
3425
|
+
}), 128))
|
|
3426
|
+
], 2);
|
|
3427
|
+
};
|
|
3428
|
+
}
|
|
3429
|
+
});
|
|
3430
|
+
const _hoisted_1 = ["onClick"];
|
|
3431
|
+
const _hoisted_2 = ["id", "name", "placeholder", "disabled", "required"];
|
|
3432
|
+
const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
3433
|
+
__name: "TagsInput",
|
|
3434
|
+
props: /* @__PURE__ */ vue.mergeModels({
|
|
3435
|
+
placeholder: { default: "Add tag..." },
|
|
3436
|
+
size: { default: "md" },
|
|
3437
|
+
disabled: { type: Boolean },
|
|
3438
|
+
max: {},
|
|
3439
|
+
allowDuplicates: { type: Boolean, default: false },
|
|
3440
|
+
name: {},
|
|
3441
|
+
id: {},
|
|
3442
|
+
required: { type: Boolean }
|
|
3443
|
+
}, {
|
|
3444
|
+
"modelValue": { default: () => [] },
|
|
3445
|
+
"modelModifiers": {}
|
|
3446
|
+
}),
|
|
3447
|
+
emits: ["update:modelValue"],
|
|
3448
|
+
setup(__props, { expose: __expose }) {
|
|
3449
|
+
const props = __props;
|
|
3450
|
+
const modelValue = vue.useModel(__props, "modelValue");
|
|
3451
|
+
const inputValue = vue.ref("");
|
|
3452
|
+
const inputRef = vue.ref(null);
|
|
3453
|
+
const canAddMore = vue.computed(() => {
|
|
3454
|
+
if (props.max !== void 0) return modelValue.value.length < props.max;
|
|
3455
|
+
return true;
|
|
3456
|
+
});
|
|
3457
|
+
const sizeClasses = vue.computed(() => ({
|
|
3458
|
+
wrapper: {
|
|
3459
|
+
sm: "min-h-9 py-1.5 px-2 gap-1",
|
|
3460
|
+
md: "min-h-11 py-2 px-3 gap-1.5",
|
|
3461
|
+
lg: "min-h-13 py-2.5 px-4 gap-2"
|
|
3462
|
+
}[props.size],
|
|
3463
|
+
tag: {
|
|
3464
|
+
sm: "text-xs px-2 py-0.5",
|
|
3465
|
+
md: "text-sm px-2.5 py-1",
|
|
3466
|
+
lg: "text-base px-3 py-1.5"
|
|
3467
|
+
}[props.size],
|
|
3468
|
+
input: {
|
|
3469
|
+
sm: "text-xs",
|
|
3470
|
+
md: "text-sm",
|
|
3471
|
+
lg: "text-base"
|
|
3472
|
+
}[props.size],
|
|
3473
|
+
icon: {
|
|
3474
|
+
sm: "size-3",
|
|
3475
|
+
md: "size-3.5",
|
|
3476
|
+
lg: "size-4"
|
|
3477
|
+
}[props.size]
|
|
3478
|
+
}));
|
|
3479
|
+
function addTag(value) {
|
|
3480
|
+
const trimmed = value.trim();
|
|
3481
|
+
if (!trimmed) return;
|
|
3482
|
+
if (!canAddMore.value) return;
|
|
3483
|
+
if (!props.allowDuplicates && modelValue.value.includes(trimmed)) return;
|
|
3484
|
+
modelValue.value = [...modelValue.value, trimmed];
|
|
3485
|
+
inputValue.value = "";
|
|
3486
|
+
}
|
|
3487
|
+
function removeTag(index2) {
|
|
3488
|
+
if (props.disabled) return;
|
|
3489
|
+
modelValue.value = modelValue.value.filter((_, i) => i !== index2);
|
|
3490
|
+
}
|
|
3491
|
+
function handleKeydown(event) {
|
|
3492
|
+
if (event.key === "Enter" || event.key === ",") {
|
|
3493
|
+
event.preventDefault();
|
|
3494
|
+
addTag(inputValue.value);
|
|
3495
|
+
} else if (event.key === "Backspace" && !inputValue.value && modelValue.value.length > 0) {
|
|
3496
|
+
removeTag(modelValue.value.length - 1);
|
|
3497
|
+
}
|
|
3498
|
+
}
|
|
3499
|
+
function handleBlur() {
|
|
3500
|
+
if (inputValue.value) {
|
|
3501
|
+
addTag(inputValue.value);
|
|
3502
|
+
}
|
|
3503
|
+
}
|
|
3504
|
+
function focusInput() {
|
|
3505
|
+
var _a;
|
|
3506
|
+
(_a = inputRef.value) == null ? void 0 : _a.focus();
|
|
3507
|
+
}
|
|
3508
|
+
__expose({ focus: focusInput });
|
|
3509
|
+
return (_ctx, _cache) => {
|
|
3510
|
+
return vue.openBlock(), vue.createElementBlock("div", {
|
|
3511
|
+
class: vue.normalizeClass([
|
|
3512
|
+
"flex flex-wrap items-center rounded-xl border transition-all cursor-text",
|
|
3513
|
+
"bg-gray-50 dark:bg-slate-700",
|
|
3514
|
+
"border-gray-200 dark:border-slate-600",
|
|
3515
|
+
"focus-within:border-primary-500 focus-within:ring-2 focus-within:ring-primary-500 focus-within:bg-white dark:focus-within:bg-slate-600",
|
|
3516
|
+
__props.disabled && "opacity-50 cursor-not-allowed",
|
|
3517
|
+
sizeClasses.value.wrapper
|
|
3518
|
+
]),
|
|
3519
|
+
onClick: focusInput
|
|
3520
|
+
}, [
|
|
3521
|
+
vue.createVNode(vue.TransitionGroup, {
|
|
3522
|
+
name: "tag",
|
|
3523
|
+
tag: "div",
|
|
3524
|
+
class: "flex flex-wrap gap-1.5"
|
|
3525
|
+
}, {
|
|
3526
|
+
default: vue.withCtx(() => [
|
|
3527
|
+
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(modelValue.value, (tag, index2) => {
|
|
3528
|
+
return vue.openBlock(), vue.createElementBlock("span", {
|
|
3529
|
+
key: tag + index2,
|
|
3530
|
+
class: vue.normalizeClass([
|
|
3531
|
+
"inline-flex items-center gap-1 rounded-lg font-medium",
|
|
3532
|
+
"bg-primary-100 dark:bg-primary-900/30 text-primary-700 dark:text-primary-300",
|
|
3533
|
+
sizeClasses.value.tag
|
|
3534
|
+
])
|
|
3535
|
+
}, [
|
|
3536
|
+
vue.createTextVNode(vue.toDisplayString(tag) + " ", 1),
|
|
3537
|
+
!__props.disabled ? (vue.openBlock(), vue.createElementBlock("button", {
|
|
3538
|
+
key: 0,
|
|
3539
|
+
type: "button",
|
|
3540
|
+
class: "rounded-full hover:bg-primary-200 dark:hover:bg-primary-800/50 transition-colors p-0.5",
|
|
3541
|
+
onClick: vue.withModifiers(($event) => removeTag(index2), ["stop"])
|
|
3542
|
+
}, [
|
|
3543
|
+
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
3544
|
+
icon: "lucide:x",
|
|
3545
|
+
class: vue.normalizeClass(["text-primary-500", sizeClasses.value.icon])
|
|
3546
|
+
}, null, 8, ["class"])
|
|
3547
|
+
], 8, _hoisted_1)) : vue.createCommentVNode("", true)
|
|
3548
|
+
], 2);
|
|
3549
|
+
}), 128))
|
|
3550
|
+
]),
|
|
3551
|
+
_: 1
|
|
3552
|
+
}),
|
|
3553
|
+
canAddMore.value ? vue.withDirectives((vue.openBlock(), vue.createElementBlock("input", {
|
|
3554
|
+
key: 0,
|
|
3555
|
+
id: __props.id ?? __props.name,
|
|
3556
|
+
ref_key: "inputRef",
|
|
3557
|
+
ref: inputRef,
|
|
3558
|
+
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => inputValue.value = $event),
|
|
3559
|
+
type: "text",
|
|
3560
|
+
name: __props.name,
|
|
3561
|
+
placeholder: modelValue.value.length === 0 ? __props.placeholder : "",
|
|
3562
|
+
disabled: __props.disabled,
|
|
3563
|
+
required: __props.required && modelValue.value.length === 0,
|
|
3564
|
+
class: vue.normalizeClass([
|
|
3565
|
+
"flex-1 min-w-20 bg-transparent border-none focus:outline-none",
|
|
3566
|
+
"text-gray-900 dark:text-white placeholder-gray-400",
|
|
3567
|
+
sizeClasses.value.input
|
|
3568
|
+
]),
|
|
3569
|
+
onKeydown: handleKeydown,
|
|
3570
|
+
onBlur: handleBlur
|
|
3571
|
+
}, null, 42, _hoisted_2)), [
|
|
3572
|
+
[vue.vModelText, inputValue.value]
|
|
3573
|
+
]) : vue.createCommentVNode("", true)
|
|
3574
|
+
], 2);
|
|
3575
|
+
};
|
|
3576
|
+
}
|
|
3577
|
+
});
|
|
3578
|
+
const TagsInput = /* @__PURE__ */ _pluginVue_exportHelper._export_sfc(_sfc_main, [["__scopeId", "data-v-7949bfa4"]]);
|
|
2063
3579
|
exports.Slider = Slider;
|
|
2064
|
-
exports.
|
|
2065
|
-
exports._sfc_main
|
|
2066
|
-
exports._sfc_main$
|
|
2067
|
-
exports._sfc_main$
|
|
2068
|
-
exports._sfc_main$
|
|
2069
|
-
exports._sfc_main$
|
|
2070
|
-
exports._sfc_main$
|
|
2071
|
-
exports._sfc_main$
|
|
2072
|
-
exports._sfc_main$
|
|
2073
|
-
exports._sfc_main$
|
|
2074
|
-
exports._sfc_main$
|
|
2075
|
-
exports._sfc_main$
|
|
2076
|
-
exports._sfc_main$
|
|
2077
|
-
exports._sfc_main$
|
|
2078
|
-
|
|
3580
|
+
exports.TagsInput = TagsInput;
|
|
3581
|
+
exports._sfc_main = _sfc_main$r;
|
|
3582
|
+
exports._sfc_main$1 = _sfc_main$q;
|
|
3583
|
+
exports._sfc_main$10 = _sfc_main$g;
|
|
3584
|
+
exports._sfc_main$11 = _sfc_main$f;
|
|
3585
|
+
exports._sfc_main$12 = _sfc_main$e;
|
|
3586
|
+
exports._sfc_main$13 = _sfc_main$d;
|
|
3587
|
+
exports._sfc_main$14 = _sfc_main$c;
|
|
3588
|
+
exports._sfc_main$15 = _sfc_main$b;
|
|
3589
|
+
exports._sfc_main$16 = _sfc_main$a;
|
|
3590
|
+
exports._sfc_main$17 = _sfc_main$9;
|
|
3591
|
+
exports._sfc_main$18 = _sfc_main$8;
|
|
3592
|
+
exports._sfc_main$19 = _sfc_main$7;
|
|
3593
|
+
exports._sfc_main$2 = _sfc_main$p;
|
|
3594
|
+
exports._sfc_main$20 = _sfc_main$6;
|
|
3595
|
+
exports._sfc_main$21 = _sfc_main$5;
|
|
3596
|
+
exports._sfc_main$22 = _sfc_main$4;
|
|
3597
|
+
exports._sfc_main$23 = _sfc_main$3;
|
|
3598
|
+
exports._sfc_main$24 = _sfc_main$2;
|
|
3599
|
+
exports._sfc_main$25 = _sfc_main$1;
|
|
3600
|
+
exports._sfc_main$3 = _sfc_main$o;
|
|
3601
|
+
exports._sfc_main$4 = _sfc_main$n;
|
|
3602
|
+
exports._sfc_main$5 = _sfc_main$m;
|
|
3603
|
+
exports._sfc_main$6 = _sfc_main$l;
|
|
3604
|
+
exports._sfc_main$7 = _sfc_main$j;
|
|
3605
|
+
exports._sfc_main$8 = _sfc_main$i;
|
|
3606
|
+
exports._sfc_main$9 = _sfc_main$h;
|
|
3607
|
+
//# sourceMappingURL=TagsInput-ClqgyR9O.cjs.map
|