@stachelock/ui 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/dist/{CalendarHeader.vue_vue_type_script_setup_true_lang-B3KQTxfD.js → CalendarHeader.vue_vue_type_script_setup_true_lang-Cirr0hMB.js} +2 -2
  2. package/dist/{CalendarHeader.vue_vue_type_script_setup_true_lang-B3KQTxfD.js.map → CalendarHeader.vue_vue_type_script_setup_true_lang-Cirr0hMB.js.map} +1 -1
  3. package/dist/ComboboxInput.vue_vue_type_script_setup_true_lang-2dJNxQUF.js +1300 -0
  4. package/dist/ComboboxInput.vue_vue_type_script_setup_true_lang-2dJNxQUF.js.map +1 -0
  5. package/dist/{DashboardLayout.vue_vue_type_script_setup_true_lang-CClxYrOW.js → DashboardLayout.vue_vue_type_script_setup_true_lang-VeZhdPhj.js} +38 -37
  6. package/dist/DashboardLayout.vue_vue_type_script_setup_true_lang-VeZhdPhj.js.map +1 -0
  7. package/dist/DynamicForm.vue_vue_type_script_setup_true_lang-BpfPAZiT.js +217 -0
  8. package/dist/DynamicForm.vue_vue_type_script_setup_true_lang-BpfPAZiT.js.map +1 -0
  9. package/dist/{DynamicFormField.vue_vue_type_script_setup_true_lang-qAwVNm--.js → DynamicFormField.vue_vue_type_script_setup_true_lang-DvT03FIS.js} +40 -24
  10. package/dist/DynamicFormField.vue_vue_type_script_setup_true_lang-DvT03FIS.js.map +1 -0
  11. package/dist/EventCard.vue_vue_type_script_setup_true_lang-YV1lfgUY.js +157 -0
  12. package/dist/EventCard.vue_vue_type_script_setup_true_lang-YV1lfgUY.js.map +1 -0
  13. package/dist/EventsList.vue_vue_type_script_setup_true_lang-Cn_WOpZi.js +103 -0
  14. package/dist/EventsList.vue_vue_type_script_setup_true_lang-Cn_WOpZi.js.map +1 -0
  15. package/dist/SelectInput.vue_vue_type_script_setup_true_lang-BPjHLHdM.js +522 -0
  16. package/dist/SelectInput.vue_vue_type_script_setup_true_lang-BPjHLHdM.js.map +1 -0
  17. package/dist/{SidebarLayout.vue_vue_type_script_setup_true_lang-CQIW5dy_.js → SidebarLayout.vue_vue_type_script_setup_true_lang-J1nfUTdM.js} +28 -27
  18. package/dist/{SidebarLayout.vue_vue_type_script_setup_true_lang-CQIW5dy_.js.map → SidebarLayout.vue_vue_type_script_setup_true_lang-J1nfUTdM.js.map} +1 -1
  19. package/dist/SwitchInput.vue_vue_type_script_setup_true_lang-BFr2SByh.js +273 -0
  20. package/dist/SwitchInput.vue_vue_type_script_setup_true_lang-BFr2SByh.js.map +1 -0
  21. package/dist/{TagifyInput.vue_vue_type_script_setup_true_lang-RHqhKoK5.js → TagifyInput.vue_vue_type_script_setup_true_lang-DRR6jt_8.js} +60 -50
  22. package/dist/TagifyInput.vue_vue_type_script_setup_true_lang-DRR6jt_8.js.map +1 -0
  23. package/dist/UiBreadcrumb.vue_vue_type_script_setup_true_lang-quGuN9v4.js +82 -0
  24. package/dist/UiBreadcrumb.vue_vue_type_script_setup_true_lang-quGuN9v4.js.map +1 -0
  25. package/dist/{UiModal.vue_vue_type_script_setup_true_lang-CMk62qeq.js → UiModal.vue_vue_type_script_setup_true_lang-SAo39zpS.js} +21 -20
  26. package/dist/{UiModal.vue_vue_type_script_setup_true_lang-CMk62qeq.js.map → UiModal.vue_vue_type_script_setup_true_lang-SAo39zpS.js.map} +1 -1
  27. package/dist/XMarkIcon-C4wILUsz.js +40 -0
  28. package/dist/XMarkIcon-C4wILUsz.js.map +1 -0
  29. package/dist/calculate-active-index-CksdUwZY.js +87 -0
  30. package/dist/calculate-active-index-CksdUwZY.js.map +1 -0
  31. package/dist/calendars/CalendarDashboard.js +2 -2
  32. package/dist/calendars/CalendarHeader.js +1 -1
  33. package/dist/calendars/EventCard.js +1 -1
  34. package/dist/calendars/EventsList.js +1 -1
  35. package/dist/components/Breadcrumb.js +1 -1
  36. package/dist/components/Modal.js +1 -1
  37. package/dist/components/RadialProgressBar.d.ts +2 -2
  38. package/dist/components/RadialProgressBar.js +1 -1
  39. package/dist/description-CBd3BJ9O.js +30 -0
  40. package/dist/description-CBd3BJ9O.js.map +1 -0
  41. package/dist/dialog-U1KNiPzc.js +493 -0
  42. package/dist/dialog-U1KNiPzc.js.map +1 -0
  43. package/dist/form-DQKuKVqJ.js +51 -0
  44. package/dist/form-DQKuKVqJ.js.map +1 -0
  45. package/dist/forms/DynamicForm.js +1 -1
  46. package/dist/forms/DynamicFormField.js +1 -1
  47. package/dist/forms/FormFieldWrapper.js +71 -42
  48. package/dist/forms/FormFieldWrapper.js.map +1 -1
  49. package/dist/index.js +307 -242
  50. package/dist/index.js.map +1 -1
  51. package/dist/inputs/ComboboxInput.js +1 -1
  52. package/dist/inputs/SelectInput.js +1 -1
  53. package/dist/inputs/SwitchInput.js +1 -1
  54. package/dist/inputs/TagifyInput.js +1 -1
  55. package/dist/keyboard-DJD8TwH4.js +113 -0
  56. package/dist/keyboard-DJD8TwH4.js.map +1 -0
  57. package/dist/layouts/DashboardLayout.js +1 -1
  58. package/dist/layouts/SidebarLayout.js +1 -1
  59. package/dist/open-closed-DgcU-HDT.js +179 -0
  60. package/dist/open-closed-DgcU-HDT.js.map +1 -0
  61. package/dist/src/components/layouts/DashboardLayout.d.ts.map +1 -1
  62. package/dist/src/components/layouts/SidebarLayout.d.ts.map +1 -1
  63. package/dist/transition-CuxxW9dY.js +209 -0
  64. package/dist/transition-CuxxW9dY.js.map +1 -0
  65. package/package.json +1 -1
  66. package/dist/ComboboxInput.vue_vue_type_script_setup_true_lang-DoJHjJsA.js +0 -304
  67. package/dist/ComboboxInput.vue_vue_type_script_setup_true_lang-DoJHjJsA.js.map +0 -1
  68. package/dist/DashboardLayout.vue_vue_type_script_setup_true_lang-CClxYrOW.js.map +0 -1
  69. package/dist/DynamicForm.vue_vue_type_script_setup_true_lang-BKhcXkNG.js +0 -201
  70. package/dist/DynamicForm.vue_vue_type_script_setup_true_lang-BKhcXkNG.js.map +0 -1
  71. package/dist/DynamicFormField.vue_vue_type_script_setup_true_lang-qAwVNm--.js.map +0 -1
  72. package/dist/EventCard.vue_vue_type_script_setup_true_lang-B3TP-mWX.js +0 -75
  73. package/dist/EventCard.vue_vue_type_script_setup_true_lang-B3TP-mWX.js.map +0 -1
  74. package/dist/EventsList.vue_vue_type_script_setup_true_lang-Cpc9A9Ev.js +0 -89
  75. package/dist/EventsList.vue_vue_type_script_setup_true_lang-Cpc9A9Ev.js.map +0 -1
  76. package/dist/SelectInput.vue_vue_type_script_setup_true_lang-BguP8xMU.js +0 -242
  77. package/dist/SelectInput.vue_vue_type_script_setup_true_lang-BguP8xMU.js.map +0 -1
  78. package/dist/SwitchInput.vue_vue_type_script_setup_true_lang-BagTQ6M0.js +0 -197
  79. package/dist/SwitchInput.vue_vue_type_script_setup_true_lang-BagTQ6M0.js.map +0 -1
  80. package/dist/TagifyInput.vue_vue_type_script_setup_true_lang-RHqhKoK5.js.map +0 -1
  81. package/dist/UiBreadcrumb.vue_vue_type_script_setup_true_lang-CMH47CoK.js +0 -68
  82. package/dist/UiBreadcrumb.vue_vue_type_script_setup_true_lang-CMH47CoK.js.map +0 -1
  83. package/dist/UiRadialProgressBar.vue_vue_type_script_setup_true_lang-BGCBJa2S.js +0 -72
  84. package/dist/UiRadialProgressBar.vue_vue_type_script_setup_true_lang-BGCBJa2S.js.map +0 -1
@@ -1,242 +0,0 @@
1
- import { defineComponent as z, ref as E, watch as B, computed as c, createElementBlock as n, openBlock as o, createVNode as i, unref as t, withCtx as u, createElementVNode as d, normalizeClass as m, createBlock as b, createCommentVNode as p, resolveDynamicComponent as S, toDisplayString as f, Transition as j, withModifiers as I, Fragment as W, renderList as $ } from "vue";
2
- import { Listbox as q, ListboxButton as G, ListboxOptions as H, ListboxOption as J } from "@headlessui/vue";
3
- import { ChevronUpDownIcon as P, CheckIcon as Q } from "@heroicons/vue/20/solid";
4
- import { useField as R } from "vee-validate";
5
- import X from "./forms/FormFieldWrapper.js";
6
- import { g as Y } from "./id-DafBB_QF.js";
7
- const Z = { class: "sl-w-full" }, ee = { class: "sl-relative" }, le = { class: "sl-flex sl-items-center sl-gap-2" }, se = {
8
- key: 1,
9
- class: "sl-block sl-truncate sl-text-left"
10
- }, te = {
11
- key: 2,
12
- class: "sl-block sl-truncate sl-text-left sl-text-gray-500"
13
- }, ae = { class: "sl-pointer-events-none sl-absolute sl-inset-y-0 sl-right-0 sl-flex sl-items-center sl-pr-2" }, oe = { class: "sl-block sl-truncate sl-font-medium" }, re = { class: "sl-flex sl-items-center sl-gap-2" }, ne = {
14
- key: 0,
15
- class: "sl-absolute sl-inset-y-0 sl-right-0 sl-flex sl-items-center sl-pr-4"
16
- }, ie = { key: 0 }, he = /* @__PURE__ */ z({
17
- __name: "SelectInput",
18
- props: {
19
- name: {},
20
- items: {},
21
- label: {},
22
- placeholder: {},
23
- disabled: { type: Boolean },
24
- rules: {},
25
- validateOnMount: { type: Boolean },
26
- successMessage: {},
27
- tertiaryLabel: {},
28
- buttonClass: {},
29
- multiple: { type: Boolean, default: !1 },
30
- showAll: { type: Boolean, default: !1 },
31
- itemKey: { default: "id" },
32
- itemText: { default: "name" },
33
- modelValue: {},
34
- boxShadow: { type: Boolean, default: !1 }
35
- },
36
- emits: ["update:modelValue"],
37
- setup(L, { emit: O }) {
38
- const s = L, T = O, g = Y(s.name), { value: y, errorMessage: k, handleChange: w, meta: h, setTouched: F } = R(
39
- () => s.name,
40
- s.rules,
41
- {
42
- validateOnMount: s.validateOnMount,
43
- initialValue: s.modelValue
44
- }
45
- ), l = E(
46
- s.multiple ? Array.isArray(s.modelValue) ? s.modelValue : [] : s.modelValue
47
- );
48
- B(
49
- () => s.modelValue,
50
- (e) => {
51
- if (s.multiple) {
52
- const a = Array.isArray(e) ? e : [];
53
- a !== l.value && (l.value = a, y.value = a);
54
- } else
55
- e !== l.value && (l.value = e, y.value = e);
56
- },
57
- { immediate: !0 }
58
- ), B(
59
- l,
60
- (e) => {
61
- T("update:modelValue", e);
62
- }
63
- );
64
- const D = c(() => {
65
- const e = [
66
- "sl-relative",
67
- "sl-w-full",
68
- "sl-cursor-default",
69
- "sl-rounded-md",
70
- "sl-bg-white",
71
- "sl-py-2",
72
- "sl-pl-3",
73
- "sl-pr-10",
74
- "sl-text-left",
75
- "sl-border",
76
- "sl-text-sm",
77
- "focus:sl-outline-none",
78
- "focus:sl-ring-2",
79
- "focus:sl-ring-stachelock-500",
80
- "focus:sl-border-stachelock-500",
81
- "sl-transition-all",
82
- "sl-duration-200"
83
- ];
84
- return s.disabled ? e.push(
85
- "sl-bg-gray-50",
86
- "sl-text-gray-500",
87
- "sl-cursor-not-allowed",
88
- "sl-border-gray-200"
89
- ) : k.value ? e.push(
90
- "sl-border-red-300",
91
- "focus:sl-ring-red-500",
92
- "focus:sl-border-red-500"
93
- ) : h.valid && h.touched ? e.push(
94
- "sl-border-green-300",
95
- "focus:sl-ring-green-500",
96
- "focus:sl-border-green-500"
97
- ) : e.push(
98
- "sl-border-gray-300",
99
- "hover:sl-border-gray-400"
100
- ), e.join(" ");
101
- }), K = (e) => e[s.itemKey], v = (e) => e[s.itemText] || e.toString(), x = c(() => l.value ? s.multiple && Array.isArray(l.value) ? l.value.length === 0 ? "" : l.value.length === 1 ? v(l.value[0]) : `${l.value.length} items selected` : v(l.value) : ""), A = c(() => l.value ? s.multiple && Array.isArray(l.value) ? l.value.length === 1 ? l.value[0].icon : null : l.value.icon : null), C = c(() => s.items.filter((e) => !e.disabled)), N = (e) => {
102
- l.value = e, F(!0), w(e);
103
- }, V = c(() => {
104
- if (!s.multiple || !Array.isArray(l.value)) return !1;
105
- const e = C.value;
106
- return e.length === 0 ? !1 : e.every((a) => l.value.includes(a));
107
- }), U = () => {
108
- s.multiple && (V.value ? l.value = [] : l.value = [...C.value], w(l.value));
109
- };
110
- return (e, a) => (o(), n("div", Z, [
111
- i(X, {
112
- id: t(g),
113
- name: e.name,
114
- label: e.label,
115
- disabled: e.disabled,
116
- optional: !e.rules,
117
- "tertiary-label": e.tertiaryLabel,
118
- "box-shadow": e.boxShadow,
119
- "error-message": t(k),
120
- "success-message": e.successMessage,
121
- "is-valid": t(h).valid,
122
- "is-touched": t(h).touched
123
- }, {
124
- "success-message": u(() => [
125
- e.successMessage ? (o(), n("span", ie, f(e.successMessage), 1)) : p("", !0)
126
- ]),
127
- default: u(() => [
128
- i(t(q), {
129
- modelValue: l.value,
130
- "onUpdate:modelValue": [
131
- a[1] || (a[1] = (r) => l.value = r),
132
- N
133
- ],
134
- disabled: e.disabled,
135
- multiple: e.multiple
136
- }, {
137
- default: u(() => [
138
- d("div", ee, [
139
- i(t(G), {
140
- id: t(g),
141
- class: m([
142
- D.value,
143
- e.buttonClass
144
- ])
145
- }, {
146
- default: u(() => [
147
- d("span", le, [
148
- A.value ? (o(), b(S(A.value), {
149
- key: 0,
150
- class: "sl-h-4 sl-w-4 sl-flex-shrink-0",
151
- "aria-hidden": "true"
152
- })) : p("", !0),
153
- x.value ? (o(), n("span", se, f(x.value), 1)) : (o(), n("span", te, f(e.placeholder || "Select an option"), 1))
154
- ]),
155
- d("span", ae, [
156
- i(t(P), {
157
- class: "sl-h-5 sl-w-5 sl-text-gray-400",
158
- "aria-hidden": "true"
159
- })
160
- ])
161
- ]),
162
- _: 1
163
- }, 8, ["id", "class"]),
164
- i(j, {
165
- "leave-active-class": "sl-transition sl-duration-100 sl-ease-in",
166
- "leave-from-class": "sl-opacity-100",
167
- "leave-to-class": "sl-opacity-0"
168
- }, {
169
- default: u(() => [
170
- i(t(H), { class: "sl-absolute sl-z-10 sl-mt-1 sl-max-h-56 sl-w-full sl-overflow-auto sl-rounded-md sl-bg-white sl-py-1 sl-text-base sl-shadow-lg sl-ring-1 sl-ring-black sl-ring-opacity-5 focus:sl-outline-none sm:sl-text-sm" }, {
171
- default: u(() => [
172
- e.multiple && e.showAll ? (o(), n("li", {
173
- key: 0,
174
- role: "button",
175
- tabindex: "0",
176
- onMousedown: a[0] || (a[0] = I(() => {
177
- }, ["prevent"])),
178
- onClick: I(U, ["prevent", "stop"]),
179
- class: m([
180
- "sl-relative sl-cursor-pointer sl-select-none sl-py-2 sl-pl-3 sl-pr-9",
181
- "hover:sl-bg-stachelock-600 hover:sl-text-white"
182
- ])
183
- }, [
184
- d("span", oe, f(V.value ? "Unselect All" : "Select All"), 1)
185
- ], 32)) : p("", !0),
186
- (o(!0), n(W, null, $(e.items, (r) => (o(), b(t(J), {
187
- key: K(r),
188
- value: r,
189
- as: "template",
190
- disabled: r.disabled
191
- }, {
192
- default: u(({ active: _, selected: M }) => [
193
- d("li", {
194
- class: m([
195
- "sl-relative sl-cursor-default sl-select-none sl-py-2 sl-pl-3 sl-pr-9",
196
- _ ? "sl-bg-stachelock-600 sl-text-white" : "sl-text-gray-900",
197
- r.disabled ? "sl-opacity-50 sl-cursor-not-allowed" : ""
198
- ])
199
- }, [
200
- d("div", re, [
201
- r.icon ? (o(), b(S(r.icon), {
202
- key: 0,
203
- class: m(["sl-h-4 sl-w-4 sl-flex-shrink-0", _ ? "sl-text-white" : "sl-text-gray-400"]),
204
- "aria-hidden": "true"
205
- }, null, 8, ["class"])) : p("", !0),
206
- d("span", {
207
- class: m([
208
- "sl-block sl-truncate",
209
- M ? "sl-font-medium" : "sl-font-normal"
210
- ])
211
- }, f(v(r)), 3)
212
- ]),
213
- M ? (o(), n("span", ne, [
214
- i(t(Q), {
215
- class: "sl-h-5 sl-w-5",
216
- "aria-hidden": "true"
217
- })
218
- ])) : p("", !0)
219
- ], 2)
220
- ]),
221
- _: 2
222
- }, 1032, ["value", "disabled"]))), 128))
223
- ]),
224
- _: 1
225
- })
226
- ]),
227
- _: 1
228
- })
229
- ])
230
- ]),
231
- _: 1
232
- }, 8, ["modelValue", "disabled", "multiple"])
233
- ]),
234
- _: 1
235
- }, 8, ["id", "name", "label", "disabled", "optional", "tertiary-label", "box-shadow", "error-message", "success-message", "is-valid", "is-touched"])
236
- ]));
237
- }
238
- });
239
- export {
240
- he as _
241
- };
242
- //# sourceMappingURL=SelectInput.vue_vue_type_script_setup_true_lang-BguP8xMU.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SelectInput.vue_vue_type_script_setup_true_lang-BguP8xMU.js","sources":["../src/components/inputs/SelectInput.vue"],"sourcesContent":["<template>\n <div class=\"sl-w-full\">\n <FormFieldWrapper\n :id=\"id\"\n :name=\"name\"\n :label=\"label\"\n :disabled=\"disabled\"\n :optional=\"!rules\"\n :tertiary-label=\"tertiaryLabel\"\n :box-shadow=\"boxShadow\"\n :error-message=\"errorMessage\"\n :success-message=\"successMessage\"\n :is-valid=\"meta.valid\"\n :is-touched=\"meta.touched\"\n >\n <Listbox\n v-model=\"selectedValue\"\n :disabled=\"disabled\"\n :multiple=\"multiple\"\n @update:model-value=\"handleChange\"\n >\n <div class=\"sl-relative\">\n <ListboxButton\n :id=\"id\"\n :class=\"[\n selectClasses,\n buttonClass\n ]\"\n >\n <span class=\"sl-flex sl-items-center sl-gap-2\">\n <!-- Selected item icon -->\n <component\n v-if=\"selectedIcon\"\n :is=\"selectedIcon\"\n class=\"sl-h-4 sl-w-4 sl-flex-shrink-0\"\n aria-hidden=\"true\"\n />\n \n <!-- Selected value display -->\n <span\n v-if=\"displayValue\"\n class=\"sl-block sl-truncate sl-text-left\"\n >\n {{ displayValue }}\n </span>\n <span\n v-else\n class=\"sl-block sl-truncate sl-text-left sl-text-gray-500\"\n >\n {{ placeholder || 'Select an option' }}\n </span>\n </span>\n \n <span class=\"sl-pointer-events-none sl-absolute sl-inset-y-0 sl-right-0 sl-flex sl-items-center sl-pr-2\">\n <ChevronUpDownIcon\n class=\"sl-h-5 sl-w-5 sl-text-gray-400\"\n aria-hidden=\"true\"\n />\n </span>\n </ListboxButton>\n\n <transition\n leave-active-class=\"sl-transition sl-duration-100 sl-ease-in\"\n leave-from-class=\"sl-opacity-100\"\n leave-to-class=\"sl-opacity-0\"\n >\n <ListboxOptions\n class=\"sl-absolute sl-z-10 sl-mt-1 sl-max-h-56 sl-w-full sl-overflow-auto sl-rounded-md sl-bg-white sl-py-1 sl-text-base sl-shadow-lg sl-ring-1 sl-ring-black sl-ring-opacity-5 focus:sl-outline-none sm:sl-text-sm\"\n >\n <!-- Show All option for multiple select -->\n <li\n v-if=\"multiple && showAll\"\n role=\"button\"\n tabindex=\"0\"\n @mousedown.prevent\n @click.prevent.stop=\"toggleSelectAll\"\n :class=\"[\n 'sl-relative sl-cursor-pointer sl-select-none sl-py-2 sl-pl-3 sl-pr-9',\n 'hover:sl-bg-stachelock-600 hover:sl-text-white',\n ]\"\n >\n <span class=\"sl-block sl-truncate sl-font-medium\">\n {{ isAllSelected ? 'Unselect All' : 'Select All' }}\n </span>\n </li>\n\n <!-- Regular options -->\n <ListboxOption\n v-for=\"item in items\"\n :key=\"getItemKey(item)\"\n :value=\"item\"\n as=\"template\"\n :disabled=\"item.disabled\"\n v-slot=\"{ active, selected }\"\n >\n <li\n :class=\"[\n 'sl-relative sl-cursor-default sl-select-none sl-py-2 sl-pl-3 sl-pr-9',\n active ? 'sl-bg-stachelock-600 sl-text-white' : 'sl-text-gray-900',\n item.disabled ? 'sl-opacity-50 sl-cursor-not-allowed' : ''\n ]\"\n >\n <div class=\"sl-flex sl-items-center sl-gap-2\">\n <!-- Item icon -->\n <component\n v-if=\"item.icon\"\n :is=\"item.icon\"\n class=\"sl-h-4 sl-w-4 sl-flex-shrink-0\"\n :class=\"active ? 'sl-text-white' : 'sl-text-gray-400'\"\n aria-hidden=\"true\"\n />\n \n <span\n :class=\"[\n 'sl-block sl-truncate',\n selected ? 'sl-font-medium' : 'sl-font-normal'\n ]\"\n >\n {{ getItemText(item) }}\n </span>\n </div>\n\n <span\n v-if=\"selected\"\n class=\"sl-absolute sl-inset-y-0 sl-right-0 sl-flex sl-items-center sl-pr-4\"\n >\n <CheckIcon class=\"sl-h-5 sl-w-5\" aria-hidden=\"true\" />\n </span>\n </li>\n </ListboxOption>\n </ListboxOptions>\n </transition>\n </div>\n </Listbox>\n \n <template #success-message>\n <span v-if=\"successMessage\">{{ successMessage }}</span>\n </template>\n </FormFieldWrapper>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport {\n Listbox,\n ListboxButton,\n ListboxOption,\n ListboxOptions,\n} from '@headlessui/vue'\nimport { CheckIcon, ChevronUpDownIcon } from '@heroicons/vue/20/solid'\nimport { useField } from 'vee-validate'\nimport FormFieldWrapper from '../forms/FormFieldWrapper.vue'\nimport type { ValidationRule } from '../../types/form'\nimport { generateId } from '../../utils/id'\n\ninterface SelectItem {\n [key: string]: any\n icon?: any\n disabled?: boolean\n}\n\ninterface Props {\n name: string\n items: SelectItem[]\n label?: string\n placeholder?: string\n disabled?: boolean\n rules?: ValidationRule\n validateOnMount?: boolean\n successMessage?: string\n tertiaryLabel?: string\n buttonClass?: string\n multiple?: boolean\n showAll?: boolean\n itemKey?: string\n itemText?: string\n modelValue?: any\n boxShadow?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n itemKey: 'id',\n itemText: 'name',\n multiple: false,\n showAll: false,\n boxShadow: false\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: any]\n}>()\n\nconst id = generateId(props.name)\n\n// Use vee-validate for form validation\nconst { value, errorMessage, handleChange: handleValidation, meta, setTouched } = useField(\n () => props.name,\n props.rules,\n {\n validateOnMount: props.validateOnMount,\n initialValue: props.modelValue\n }\n)\n\nconst selectedValue = ref<any>(\n props.multiple\n ? (Array.isArray(props.modelValue) ? props.modelValue : [])\n : props.modelValue\n)\n\n// Watch for external changes\nwatch(\n () => props.modelValue,\n (newValue) => {\n if (props.multiple) {\n const coerced = Array.isArray(newValue) ? newValue : []\n if (coerced !== selectedValue.value) {\n selectedValue.value = coerced\n value.value = coerced\n }\n } else {\n if (newValue !== selectedValue.value) {\n selectedValue.value = newValue\n value.value = newValue\n }\n }\n },\n { immediate: true }\n)\n\nwatch(\n selectedValue,\n (newValue) => {\n emit('update:modelValue', newValue)\n }\n)\n\nconst selectClasses = computed(() => {\n const baseClasses = [\n 'sl-relative',\n 'sl-w-full',\n 'sl-cursor-default',\n 'sl-rounded-md',\n 'sl-bg-white',\n 'sl-py-2',\n 'sl-pl-3',\n 'sl-pr-10',\n 'sl-text-left',\n 'sl-border',\n 'sl-text-sm',\n 'focus:sl-outline-none',\n 'focus:sl-ring-2',\n 'focus:sl-ring-stachelock-500',\n 'focus:sl-border-stachelock-500',\n 'sl-transition-all',\n 'sl-duration-200'\n ]\n\n if (props.disabled) {\n baseClasses.push(\n 'sl-bg-gray-50',\n 'sl-text-gray-500',\n 'sl-cursor-not-allowed',\n 'sl-border-gray-200'\n )\n } else if (errorMessage.value) {\n baseClasses.push(\n 'sl-border-red-300',\n 'focus:sl-ring-red-500',\n 'focus:sl-border-red-500'\n )\n } else if (meta.valid && meta.touched) {\n baseClasses.push(\n 'sl-border-green-300',\n 'focus:sl-ring-green-500',\n 'focus:sl-border-green-500'\n )\n } else {\n baseClasses.push(\n 'sl-border-gray-300',\n 'hover:sl-border-gray-400'\n )\n }\n\n return baseClasses.join(' ')\n})\n\nconst getItemKey = (item: SelectItem): any => {\n return item[props.itemKey]\n}\n\nconst getItemText = (item: SelectItem): string => {\n return item[props.itemText] || item.toString()\n}\n\nconst displayValue = computed(() => {\n if (!selectedValue.value) return ''\n \n if (props.multiple && Array.isArray(selectedValue.value)) {\n if (selectedValue.value.length === 0) return ''\n if (selectedValue.value.length === 1) {\n return getItemText(selectedValue.value[0])\n }\n return `${selectedValue.value.length} items selected`\n }\n \n return getItemText(selectedValue.value)\n})\n\nconst selectedIcon = computed(() => {\n if (!selectedValue.value) return null\n \n if (props.multiple && Array.isArray(selectedValue.value)) {\n return selectedValue.value.length === 1 ? selectedValue.value[0].icon : null\n }\n \n return selectedValue.value.icon\n})\n\nconst allItems = computed(() => {\n return props.items.filter(item => !item.disabled)\n})\n\nconst handleChange = (value: any) => {\n selectedValue.value = value\n setTouched(true)\n handleValidation(value)\n}\n\nconst isAllSelected = computed(() => {\n if (!props.multiple || !Array.isArray(selectedValue.value)) return false\n const selectable = allItems.value\n if (selectable.length === 0) return false\n return selectable.every(item => (selectedValue.value as any[]).includes(item))\n})\n\nconst toggleSelectAll = () => {\n if (!props.multiple) return\n if (isAllSelected.value) {\n selectedValue.value = []\n } else {\n selectedValue.value = [...allItems.value]\n }\n handleValidation(selectedValue.value)\n}\n</script>\n\n\n"],"names":["props","__props","emit","__emit","id","generateId","value","errorMessage","handleValidation","meta","setTouched","useField","selectedValue","ref","watch","newValue","coerced","selectClasses","computed","baseClasses","getItemKey","item","getItemText","displayValue","selectedIcon","allItems","handleChange","isAllSelected","selectable","toggleSelectAll","_openBlock","_createElementBlock","_hoisted_1","_createVNode","FormFieldWrapper","_unref","name","label","disabled","rules","tertiaryLabel","boxShadow","successMessage","Listbox","$event","multiple","_createElementVNode","_hoisted_2","ListboxButton","_normalizeClass","buttonClass","_hoisted_3","_createBlock","_resolveDynamicComponent","_hoisted_4","_toDisplayString","_hoisted_5","placeholder","_hoisted_6","ChevronUpDownIcon","_Transition","ListboxOptions","showAll","_hoisted_7","_Fragment","_renderList","items","ListboxOption","active","selected","_hoisted_8","_hoisted_9","CheckIcon"],"mappings":"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"}
@@ -1,197 +0,0 @@
1
- import { defineComponent as $, ref as g, watch as K, computed as N, createElementBlock as a, openBlock as t, createVNode as w, unref as i, withCtx as k, createElementVNode as p, createCommentVNode as r, toDisplayString as d, normalizeClass as f, withKeys as V, withModifiers as M } from "vue";
2
- import { Switch as O } from "@headlessui/vue";
3
- import { useField as j } from "vee-validate";
4
- import { g as x } from "./id-DafBB_QF.js";
5
- import I from "./forms/FormFieldWrapper.js";
6
- const R = { class: "sl-w-full" }, z = { class: "sl-flex sl-items-center sl-justify-between sl-gap-4" }, U = {
7
- key: 0,
8
- class: "sl-flex-1"
9
- }, W = ["for"], q = ["innerHTML"], A = { key: 1 }, G = { class: "sl-sr-only" }, J = {
10
- key: 1,
11
- class: "sl-ml-3 sl-text-sm"
12
- }, P = {
13
- key: 0,
14
- class: "sl-font-medium sl-text-gray-800"
15
- }, Q = {
16
- key: 1,
17
- class: "sl-text-gray-500"
18
- }, X = {
19
- key: 2,
20
- class: "sl-flex-1"
21
- }, Y = {
22
- key: 0,
23
- class: "sl-mt-1 sl-text-sm sl-text-gray-600"
24
- }, Z = ["innerHTML"], te = /* @__PURE__ */ $({
25
- __name: "SwitchInput",
26
- props: {
27
- name: {},
28
- modelValue: { type: Boolean },
29
- label: {},
30
- description: {},
31
- disabled: { type: Boolean },
32
- immediate: { type: Boolean, default: !1 },
33
- boxShadow: { type: Boolean, default: !1 },
34
- defaultValue: { type: Boolean, default: !1 },
35
- hideMainLabel: { type: Boolean, default: !1 },
36
- textTrue: {},
37
- textFalse: {},
38
- rules: {},
39
- validateOnMount: { type: Boolean },
40
- successMessage: {},
41
- tertiaryLabel: {},
42
- isDescriptionHtml: { type: Boolean, default: !1 },
43
- showErrors: { type: Boolean, default: !1 },
44
- layout: { default: "stacked" }
45
- },
46
- emits: ["update:modelValue", "blur", "focus"],
47
- setup(B, { expose: L, emit: T }) {
48
- const s = B, c = T, n = g(), m = x(`sl-${s.name}`), { value: C, errorMessage: F, handleChange: h, handleBlur: H, meta: b } = j(
49
- () => s.name,
50
- s.rules,
51
- {
52
- type: "checkbox",
53
- validateOnMount: s.validateOnMount,
54
- initialValue: s.modelValue ?? s.defaultValue,
55
- syncVModel: !0
56
- }
57
- ), l = g(s.modelValue ?? s.defaultValue);
58
- K(
59
- () => s.modelValue,
60
- (e) => {
61
- if (e !== void 0 && e !== l.value) {
62
- const o = !!e;
63
- l.value = o, C.value = o;
64
- }
65
- },
66
- { immediate: !0 }
67
- );
68
- const S = N(() => {
69
- const e = [
70
- "sl-relative",
71
- "sl-inline-flex",
72
- "sl-items-center",
73
- "sl-h-6",
74
- "sl-w-11",
75
- "sl-flex-shrink-0",
76
- "sl-cursor-pointer",
77
- "sl-rounded-full",
78
- "sl-border-2",
79
- "sl-border-transparent",
80
- "sl-transition-colors",
81
- "sl-duration-200",
82
- "sl-ease-in-out",
83
- "focus:sl-outline-none",
84
- "focus:sl-ring-2",
85
- "focus:sl-ring-stachelock-600",
86
- "focus:sl-ring-offset-2"
87
- ];
88
- return s.disabled && e.push(
89
- "sl-cursor-not-allowed",
90
- "sl-opacity-50"
91
- ), l.value ? e.push("sl-bg-stachelock-600") : e.push("sl-bg-gray-200"), e.join(" ");
92
- }), y = (e) => {
93
- s.disabled || (l.value = e, s.immediate && h(e), c("update:modelValue", e));
94
- }, D = (e) => {
95
- s.immediate || h(l.value), H(e), c("blur", e);
96
- }, E = (e) => {
97
- c("focus", e);
98
- }, u = () => {
99
- s.disabled || y(!l.value);
100
- };
101
- return L({
102
- toggle: u,
103
- value: l,
104
- focus: () => {
105
- (n.value?.$el ?? n.value)?.focus?.();
106
- },
107
- blur: () => {
108
- (n.value?.$el ?? n.value)?.blur?.();
109
- },
110
- switchRef: n
111
- }), (e, o) => (t(), a("div", R, [
112
- w(I, {
113
- id: i(m),
114
- name: e.name,
115
- label: e.layout === "stacked" && !e.hideMainLabel ? e.label : "",
116
- disabled: e.disabled,
117
- optional: !e.rules,
118
- "tertiary-label": e.tertiaryLabel,
119
- "box-shadow": e.boxShadow,
120
- "error-message": i(F),
121
- "success-message": e.successMessage,
122
- "is-valid": i(b).valid,
123
- "is-touched": i(b).touched,
124
- "show-errors": e.showErrors
125
- }, {
126
- default: k(() => [
127
- p("div", z, [
128
- e.layout === "inline" ? (t(), a("div", U, [
129
- e.label && !e.hideMainLabel ? (t(), a("label", {
130
- key: 0,
131
- for: i(m),
132
- class: "sl-block sl-text-sm sl-font-medium sl-text-gray-900 sl-cursor-pointer"
133
- }, d(e.label), 9, W)) : r("", !0),
134
- e.description ? (t(), a("div", {
135
- key: 1,
136
- class: f(["sl-mt-1 sl-text-sm sl-text-gray-600", { "sl-cursor-pointer": !e.disabled }]),
137
- onClick: o[0] || (o[0] = (v) => !e.disabled && u())
138
- }, [
139
- e.isDescriptionHtml ? (t(), a("div", {
140
- key: 0,
141
- innerHTML: e.description
142
- }, null, 8, q)) : (t(), a("span", A, d(e.description), 1))
143
- ], 2)) : r("", !0)
144
- ])) : r("", !0),
145
- w(i(O), {
146
- id: i(m),
147
- ref_key: "switchRef",
148
- ref: n,
149
- modelValue: l.value,
150
- "onUpdate:modelValue": [
151
- o[1] || (o[1] = (v) => l.value = v),
152
- y
153
- ],
154
- disabled: e.disabled,
155
- class: f([
156
- S.value,
157
- { "sl-shadow-md": e.boxShadow }
158
- ]),
159
- onFocus: E,
160
- onBlur: D,
161
- onKeydown: [
162
- V(M(u, ["prevent"]), ["space"]),
163
- V(M(u, ["prevent"]), ["enter"])
164
- ]
165
- }, {
166
- default: k(() => [
167
- p("span", G, d(e.label), 1),
168
- p("span", {
169
- class: f([
170
- l.value ? "sl-translate-x-5" : "sl-translate-x-0",
171
- "sl-pointer-events-none sl-inline-block sl-h-5 sl-w-5 sl-transform sl-rounded-full sl-bg-white sl-shadow sl-ring-0 sl-transition sl-duration-200 sl-ease-in-out sl-relative"
172
- ])
173
- }, null, 2)
174
- ]),
175
- _: 1
176
- }, 8, ["id", "modelValue", "disabled", "class", "onKeydown"]),
177
- e.textTrue || e.textFalse ? (t(), a("span", J, [
178
- l.value && e.textTrue ? (t(), a("span", P, d(e.textTrue), 1)) : !l.value && e.textFalse ? (t(), a("span", Q, d(e.textFalse), 1)) : r("", !0)
179
- ])) : r("", !0),
180
- e.description && e.layout === "stacked" ? (t(), a("div", X, [
181
- e.isDescriptionHtml ? (t(), a("p", {
182
- key: 1,
183
- class: "sl-mt-1 sl-text-sm sl-text-gray-600",
184
- innerHTML: e.description
185
- }, null, 8, Z)) : (t(), a("p", Y, d(e.description), 1))
186
- ])) : r("", !0)
187
- ])
188
- ]),
189
- _: 1
190
- }, 8, ["id", "name", "label", "disabled", "optional", "tertiary-label", "box-shadow", "error-message", "success-message", "is-valid", "is-touched", "show-errors"])
191
- ]));
192
- }
193
- });
194
- export {
195
- te as _
196
- };
197
- //# sourceMappingURL=SwitchInput.vue_vue_type_script_setup_true_lang-BagTQ6M0.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SwitchInput.vue_vue_type_script_setup_true_lang-BagTQ6M0.js","sources":["../src/components/inputs/SwitchInput.vue"],"sourcesContent":["<template>\n <div class=\"sl-w-full\">\n <FormFieldWrapper\n :id=\"id\"\n :name=\"name\"\n :label=\"layout === 'stacked' && !hideMainLabel ? label : ''\"\n :disabled=\"disabled\"\n :optional=\"!rules\"\n :tertiary-label=\"tertiaryLabel\"\n :box-shadow=\"boxShadow\"\n :error-message=\"errorMessage\"\n :success-message=\"successMessage\"\n :is-valid=\"meta.valid\"\n :is-touched=\"meta.touched\"\n :show-errors=\"showErrors\"\n >\n <div class=\"sl-flex sl-items-center sl-justify-between sl-gap-4\">\n <div v-if=\"layout === 'inline'\" class=\"sl-flex-1\">\n <label\n v-if=\"label && !hideMainLabel\"\n :for=\"id\"\n class=\"sl-block sl-text-sm sl-font-medium sl-text-gray-900 sl-cursor-pointer\"\n >\n {{ label }}\n </label>\n <div v-if=\"description\" class=\"sl-mt-1 sl-text-sm sl-text-gray-600\" :class=\"{ 'sl-cursor-pointer': !disabled }\" @click=\"!disabled && toggle()\">\n <div v-if=\"isDescriptionHtml\" v-html=\"description\" />\n <span v-else>{{ description }}</span>\n </div>\n </div>\n <Switch\n :id=\"id\"\n ref=\"switchRef\"\n v-model=\"switchValue\"\n :disabled=\"disabled\"\n :class=\"[\n switchClasses,\n { 'sl-shadow-md': boxShadow }\n ]\"\n @update:model-value=\"handleToggle\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n @keydown.space.prevent=\"toggle\"\n @keydown.enter.prevent=\"toggle\"\n >\n <span class=\"sl-sr-only\">{{ label }}</span>\n <span\n :class=\"[\n switchValue ? 'sl-translate-x-5' : 'sl-translate-x-0',\n 'sl-pointer-events-none sl-inline-block sl-h-5 sl-w-5 sl-transform sl-rounded-full sl-bg-white sl-shadow sl-ring-0 sl-transition sl-duration-200 sl-ease-in-out sl-relative'\n ]\"\n >\n </span>\n </Switch>\n <span v-if=\"textTrue || textFalse\" class=\"sl-ml-3 sl-text-sm\">\n <span v-if=\"switchValue && textTrue\" class=\"sl-font-medium sl-text-gray-800\">{{ textTrue }}</span>\n <span v-else-if=\"!switchValue && textFalse\" class=\"sl-text-gray-500\">{{ textFalse }}</span>\n </span>\n <div v-if=\"description && layout === 'stacked'\" class=\"sl-flex-1\">\n <p v-if=\"!isDescriptionHtml\" class=\"sl-mt-1 sl-text-sm sl-text-gray-600\">{{ description }}</p>\n <p v-else class=\"sl-mt-1 sl-text-sm sl-text-gray-600\" v-html=\"description\" />\n </div>\n </div>\n </FormFieldWrapper>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { Switch } from '@headlessui/vue'\nimport { useField } from 'vee-validate'\nimport { generateId } from '../../utils/id'\nimport FormFieldWrapper from '../forms/FormFieldWrapper.vue'\nimport type { ValidationRule } from '../../types/form'\n\ninterface Props {\n name: string\n modelValue?: boolean\n label?: string\n description?: string\n disabled?: boolean\n immediate?: boolean\n boxShadow?: boolean\n defaultValue?: boolean\n hideMainLabel?: boolean\n textTrue?: string\n textFalse?: string\n rules?: ValidationRule\n validateOnMount?: boolean\n successMessage?: string\n tertiaryLabel?: string\n isDescriptionHtml?: boolean\n showErrors?: boolean\n layout?: 'stacked' | 'inline'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n immediate: false,\n boxShadow: false,\n defaultValue: false,\n hideMainLabel: false,\n isDescriptionHtml: false,\n showErrors: false,\n layout: 'stacked'\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n blur: [event: FocusEvent]\n focus: [event: FocusEvent]\n}>()\n\nconst switchRef = ref<any>()\nconst id = generateId(`sl-${props.name}`)\n\nconst { value, errorMessage, handleChange, handleBlur, meta } = useField(\n () => props.name,\n props.rules,\n {\n type: 'checkbox',\n validateOnMount: props.validateOnMount,\n initialValue: props.modelValue ?? props.defaultValue,\n syncVModel: true\n }\n)\n\nconst switchValue = ref<boolean>(props.modelValue ?? props.defaultValue)\n\n// Watch for external changes\nwatch(\n () => props.modelValue,\n (newValue) => {\n if (newValue !== undefined && newValue !== switchValue.value) {\n const boolVal = !!newValue\n switchValue.value = boolVal\n value.value = boolVal\n }\n },\n { immediate: true }\n)\n\nconst switchClasses = computed(() => {\n const baseClasses = [\n 'sl-relative',\n 'sl-inline-flex',\n 'sl-items-center',\n 'sl-h-6',\n 'sl-w-11',\n 'sl-flex-shrink-0',\n 'sl-cursor-pointer',\n 'sl-rounded-full',\n 'sl-border-2',\n 'sl-border-transparent',\n 'sl-transition-colors',\n 'sl-duration-200',\n 'sl-ease-in-out',\n 'focus:sl-outline-none',\n 'focus:sl-ring-2',\n 'focus:sl-ring-stachelock-600',\n 'focus:sl-ring-offset-2'\n ]\n\n if (props.disabled) {\n baseClasses.push(\n 'sl-cursor-not-allowed',\n 'sl-opacity-50'\n )\n }\n\n if (switchValue.value) {\n baseClasses.push('sl-bg-stachelock-600')\n } else {\n baseClasses.push('sl-bg-gray-200')\n }\n\n return baseClasses.join(' ')\n})\n\nconst handleToggle = (value: boolean) => {\n if (props.disabled) return\n \n switchValue.value = value\n if (props.immediate) {\n handleChange(value)\n }\n emit('update:modelValue', value)\n}\n\nconst onBlur = (event: FocusEvent) => {\n if (!props.immediate) {\n handleChange(switchValue.value)\n }\n handleBlur(event)\n emit('blur', event)\n}\n\nconst onFocus = (event: FocusEvent) => {\n emit('focus', event)\n}\n\n// Expose toggle method for external control\nconst toggle = () => {\n if (!props.disabled) {\n handleToggle(!switchValue.value)\n }\n}\n\ndefineExpose({\n toggle,\n value: switchValue,\n focus: () => {\n const el = (switchRef.value as any)?.$el ?? switchRef.value\n ;(el as HTMLButtonElement | null)?.focus?.()\n },\n blur: () => {\n const el = (switchRef.value as any)?.$el ?? switchRef.value\n ;(el as HTMLButtonElement | null)?.blur?.()\n },\n switchRef\n})\n</script>\n\n\n"],"names":["props","__props","emit","__emit","switchRef","ref","id","generateId","value","errorMessage","handleChange","handleBlur","meta","useField","switchValue","watch","newValue","boolVal","switchClasses","computed","baseClasses","handleToggle","onBlur","event","onFocus","toggle","__expose","_openBlock","_createElementBlock","_hoisted_1","_createVNode","FormFieldWrapper","_unref","name","layout","hideMainLabel","label","disabled","rules","tertiaryLabel","boxShadow","successMessage","showErrors","_createElementVNode","_hoisted_2","_hoisted_3","_hoisted_4","description","_normalizeClass","_cache","$event","isDescriptionHtml","Switch","_hoisted_7","_toDisplayString","textTrue","textFalse","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"TagifyInput.vue_vue_type_script_setup_true_lang-RHqhKoK5.js","sources":["../src/components/inputs/TagifyInput.vue"],"sourcesContent":["<template>\n <FormFieldWrapper\n :id=\"name\"\n :name=\"name\"\n :label=\"label\"\n :tertiary-label=\"tertiaryLabel\"\n :error-message=\"errorMessage\"\n :disabled=\"disabled\"\n :optional=\"optional\"\n >\n <template #tertiary-label-overlay>\n <slot name=\"tertiary-overlay\"></slot>\n </template>\n \n <div class=\"sl-flex sl-flex-wrap sl-items-center sl-gap-4 sl-rounded-md sl-bg-white sl-px-3 sm:sl-text-sm sm:sl-leading-6\"\n :class=\"inline ? null : 'sl-shadow-sm sl-border sl-border-gray-300 focus-within:sl-ring-2 focus-within:sl-ring-stachelock-600'\">\n <!-- Display selected tags as badges -->\n <UiBadge v-for=\"(tag, index) in selectedTags\" :key=\"index\" @click=\"editTag(index)\" theme=\"primary\" size=\"sm\">\n <span v-if=\"!tag.isEditing\">{{ tagDisplay(tag) }}</span>\n <input v-else ref=\"editInput\" v-model=\"tag[props.itemText]\" :placeholder=\"placeholder\"\n :disabled=\"disabled\" @keydown.enter.prevent=\"stopEditingTag(index)\"\n @blur=\"stopEditingTag(index)\"\n class=\"sl-bg-transparent sl-border-none sl-outline-none sl-text-stachelock-600 sl-text-sm placeholder:sl-text-stachelock-400/80 focus:sl-ring-0 focus:sl-ring-stachelock-600 focus:sl-rounded-lg -sl-mx-3 -sl-my-2\"\n :style=\"{ width: tag[props.itemText].length + 4 + 'ch' }\" />\n <button type=\"button\" class=\"sl-ml-2 sl-text-stachelock-600 hover:sl-text-stachelock-400 focus:sl-outline-none\"\n @click.stop=\"removeTag(index)\" :disabled=\"disabled\">\n <XMarkIcon class=\"sl-h-4 sl-w-4\" />\n </button>\n </UiBadge>\n <!-- Input for adding new tags -->\n <div class=\"sl-flex-1 sl-min-w-0 sl-relative\">\n <input ref=\"input\" v-model=\"query\" :placeholder=\"placeholder\" @input=\"filterItems\"\n :disabled=\"disabled\" @keydown.enter.prevent=\"addTag\"\n class=\"sl-w-full sl-border-none sl-outline-none sl-rounded-md focus:sl-ring-0 sl-text-sm sl-font-light -sl-mx-3 sl-pr-12\" />\n <!-- Overlay slot aligned to the far right -->\n <div class=\"sl-absolute sl-inset-y-0 sl-right-0 sl-flex sl-items-center sl-pr-3 sl-pointer-events-auto\">\n <slot name=\"input-overlay\" />\n </div>\n <!-- Suggestions Dropdown -->\n <div v-if=\"showDropdown && !disabled\"\n class=\"sl-absolute sl-z-50 sl-mt-1 sl-max-h-60 sl-w-full sl-overflow-auto sl-rounded-md sl-bg-white sl-py-1 sl-text-base sl-shadow-lg sl-ring-1 sl-ring-black sl-ring-opacity-5 focus:sl-outline-none sm:sl-text-sm\">\n <div v-for=\"item in filteredItems\" :key=\"item[itemKey]\"\n class=\"sl-cursor-pointer sl-select-none sl-py-2 sl-pl-3 sl-pr-9 hover:sl-bg-stachelock-600 hover:sl-text-white\"\n @click.prevent=\"selectSuggestion(item)\">\n <div class=\"sl-flex\">\n <span class=\"sl-truncate sl-font-semibold\">\n <span class=\"sl-block sl-truncate\">{{ itemDisplay(item) }}</span>\n </span>\n <span v-if=\"showSubext\" class=\"sl-ml-2 sl-truncate sl-text-gray-500\">\n {{ itemSecondaryDisplay(item) }}\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </FormFieldWrapper>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, watch, onMounted, nextTick } from 'vue';\nimport { XMarkIcon } from '@heroicons/vue/20/solid';\nimport UiBadge from '../UiBadge.vue';\nimport FormFieldWrapper from '../forms/FormFieldWrapper.vue';\n\ninterface Item {\n id: string | number | null;\n [key: string]: any; // Allows dynamic keys like 'value' or 'name'\n}\n\nconst props = defineProps({\n items: {\n type: Array as () => Item[],\n required: true,\n },\n value: {\n type: Array as () => Item[],\n default: () => [],\n },\n name: {\n type: String,\n required: true,\n },\n label: {\n type: String,\n required: false,\n },\n itemKey: {\n type: String,\n default: 'id',\n },\n itemText: {\n type: String,\n default: 'value',\n },\n itemSubtext: {\n type: String,\n default: 'name',\n },\n showSubext: {\n type: Boolean,\n default: true\n },\n tagDisplayKey: {\n type: String,\n default: 'name',\n },\n tertiaryLabel: {\n type: String,\n required: false,\n },\n pattern: {\n type: RegExp,\n default: null,\n },\n inline: {\n type: Boolean,\n default: false,\n },\n placeholder: {\n type: String,\n default: 'Add a tag...',\n },\n disabled: {\n type: Boolean,\n default: false\n },\n optional: {\n type: Boolean,\n default: false\n },\n errorMessage: {\n type: String,\n default: ''\n },\n hasInputRing: {\n type: Boolean,\n default: false\n }\n});\n\nconst emits = defineEmits(['update:value', 'update:query', 'invalid-tag']);\n\nconst query = ref<string>('');\nconst filteredItems = ref<Item[]>([]);\nconst selectedTags = ref<Item[]>(JSON.parse(JSON.stringify(props.value)));\nconst showDropdown = ref(false);\n\nwatch(\n () => props.value,\n (newVal) => {\n if (JSON.stringify(newVal) !== JSON.stringify(selectedTags.value)) {\n selectedTags.value = JSON.parse(JSON.stringify(newVal));\n }\n },\n { deep: true }\n);\n\nconst itemDisplay = (item: Item) => item[props.itemSubtext] || item[props.itemText];\nconst itemSecondaryDisplay = (item: Item) => item[props.itemSubtext] ? item[props.itemText] : undefined;\nconst tagDisplay = (tag: Item) => tag[props.tagDisplayKey] || tag[props.itemText];\n\nconst filterItems = () => {\n if (query.value && query.value.length > 0) {\n emits('update:query', query.value);\n\n // Simple filtering logic\n const lowerQuery = query.value.toLowerCase();\n filteredItems.value = props.items.filter((item) => {\n return (\n item[props.itemText]?.toLowerCase().includes(lowerQuery) ||\n item[props.itemSubtext]?.toLowerCase().includes(lowerQuery)\n );\n });\n showDropdown.value = true;\n } else {\n filteredItems.value = [];\n showDropdown.value = false;\n }\n};\n\nconst addTag = () => {\n const trimmedQuery = query.value.trim();\n if (trimmedQuery === '') {\n return;\n }\n\n let tagToAdd: Item | null = null;\n\n const lowerQuery = trimmedQuery.toLowerCase();\n\n // Check if the query matches any item in the items list\n const matchedItem = props.items.find(\n (item) =>\n item[props.itemText]?.toLowerCase() === lowerQuery ||\n item[props.itemSubtext]?.toLowerCase() === lowerQuery\n );\n\n if (matchedItem) {\n tagToAdd = { ...matchedItem };\n } else if (props.pattern && props.pattern.test(trimmedQuery)) {\n // Create a new item if it doesn't exist and matches the pattern\n tagToAdd = { id: null, [props.itemText]: trimmedQuery };\n } else {\n // Do not emit invalid-tag here; let the user continue typing\n return;\n }\n\n // Avoid duplicates\n if (\n !selectedTags.value.some(\n (tag) => tag[props.itemText] === tagToAdd![props.itemText]\n )\n ) {\n selectedTags.value.push(tagToAdd!);\n emits('update:value', selectedTags.value);\n }\n\n query.value = '';\n filteredItems.value = [];\n showDropdown.value = false;\n};\n\nconst selectSuggestion = (item: Item) => {\n const valueToTest = item[props.itemText].trim();\n\n // Avoid duplicates\n if (\n !selectedTags.value.some(\n (tag) => tag[props.itemText] === valueToTest\n )\n ) {\n selectedTags.value.push({ ...item });\n emits('update:value', selectedTags.value);\n }\n query.value = '';\n filteredItems.value = [];\n showDropdown.value = false;\n};\n\nconst removeTag = (index: number) => {\n selectedTags.value.splice(index, 1);\n emits('update:value', selectedTags.value);\n};\n\nconst editTag = (index: number) => {\n selectedTags.value[index].isEditing = true;\n nextTick(() => {\n // Focus logic can be added here if needed\n });\n};\n\nconst stopEditingTag = (index: number) => {\n const tag = selectedTags.value[index];\n if (tag) {\n tag.isEditing = false;\n const valueToTest = tag[props.itemText].trim();\n\n // Validate tag if pattern is provided\n if (props.pattern && !props.pattern.test(valueToTest)) {\n emits('invalid-tag', valueToTest);\n removeTag(index);\n return;\n }\n\n // Update the tag value after trimming\n tag[props.itemText] = valueToTest;\n emits('update:value', selectedTags.value);\n }\n};\n\nonMounted(() => {\n // Initialize filteredItems\n filteredItems.value = [];\n});\n\ndefineExpose({\n selectedTags,\n});\n</script>\n\n<style scoped>\n</style>\n"],"names":["props","__props","emits","__emit","query","ref","filteredItems","selectedTags","showDropdown","watch","newVal","itemDisplay","item","itemSecondaryDisplay","tagDisplay","tag","filterItems","lowerQuery","addTag","trimmedQuery","tagToAdd","matchedItem","selectSuggestion","valueToTest","removeTag","index","editTag","nextTick","stopEditingTag","onMounted","__expose","_createBlock","FormFieldWrapper","_renderSlot","_ctx","_createElementVNode","_normalizeClass","_openBlock","_createElementBlock","_Fragment","_renderList","UiBadge","$event","_withKeys","_withModifiers","_hoisted_1","_toDisplayString","_createVNode","_unref","XMarkIcon","_hoisted_4","_hoisted_6","_hoisted_7","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12"],"mappings":"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"}
@@ -1,68 +0,0 @@
1
- import { defineComponent as g, ref as m, computed as x, watchEffect as v, createElementBlock as l, openBlock as a, createElementVNode as u, Fragment as B, renderList as P, createBlock as k, createCommentVNode as C, createVNode as y, unref as w, withCtx as N, createTextVNode as E, toDisplayString as V } from "vue";
2
- import { u as R, a as S, _ as D } from "./UiNavLink.vue_vue_type_script_setup_true_lang-Bz5oiCCk.js";
3
- import { ChevronRightIcon as L } from "@heroicons/vue/20/solid";
4
- const U = {
5
- class: "sl-hidden sm:sl-flex",
6
- "aria-label": "Breadcrumb"
7
- }, j = {
8
- role: "list",
9
- class: "sl-flex sl-items-center sl-space-x-4"
10
- }, A = { class: "sl-flex sl-items-center" }, q = /* @__PURE__ */ g({
11
- __name: "UiBreadcrumb",
12
- setup(F) {
13
- const n = m([]), h = R(), f = S(), c = m(""), p = x(() => n.value.map((s) => {
14
- const t = s.name.trim();
15
- return {
16
- ...s,
17
- name: t.length > 12 ? t.slice(0, 12) + "..." : t
18
- };
19
- })), d = async () => {
20
- const s = h.path;
21
- c.value = s;
22
- const t = s.split("/").filter(Boolean), e = [];
23
- for (const [o, r] of t.entries()) {
24
- let i;
25
- i = r.charAt(0).toUpperCase() + r.slice(1).toLowerCase(), e.push({
26
- name: i,
27
- fullPath: "/" + t.slice(0, o + 1).join("/")
28
- });
29
- }
30
- n.value = e;
31
- }, _ = (s, t) => {
32
- const e = f.resolve(s.fullPath), o = e.matched.some((r) => r.meta?.isErrorPage);
33
- (!e || e.matched.length === 0 || o) && (t.preventDefault(), t.stopPropagation(), console.warn("Breadcrumb route not found or is an error page:", s.fullPath));
34
- };
35
- return v(() => {
36
- d();
37
- }), (s, t) => (a(), l("nav", U, [
38
- u("ol", j, [
39
- (a(!0), l(B, null, P(p.value, (e, o) => (a(), l("li", {
40
- key: e.fullPath
41
- }, [
42
- u("div", A, [
43
- o !== 0 ? (a(), k(w(L), {
44
- key: 0,
45
- class: "sl-h-5 sl-w-5 sl-flex-shrink-0 sl-text-gray-400 sl-mr-3",
46
- "aria-hidden": "true"
47
- })) : C("", !0),
48
- y(D, {
49
- to: e.fullPath,
50
- onClick: (r) => _(e, r),
51
- "aria-current": e.fullPath === c.value ? "page" : void 0,
52
- class: "sl-text-sm sl-font-medium sl-text-gray-500 hover:sl-text-gray-700 sl-truncate sl-overflow-ellipsis"
53
- }, {
54
- default: N(() => [
55
- E(V(e.name), 1)
56
- ]),
57
- _: 2
58
- }, 1032, ["to", "onClick", "aria-current"])
59
- ])
60
- ]))), 128))
61
- ])
62
- ]));
63
- }
64
- });
65
- export {
66
- q as _
67
- };
68
- //# sourceMappingURL=UiBreadcrumb.vue_vue_type_script_setup_true_lang-CMH47CoK.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"UiBreadcrumb.vue_vue_type_script_setup_true_lang-CMH47CoK.js","sources":["../src/components/UiBreadcrumb.vue"],"sourcesContent":["<template>\n <nav class=\"sl-hidden sm:sl-flex\" aria-label=\"Breadcrumb\">\n <ol role=\"list\" class=\"sl-flex sl-items-center sl-space-x-4\">\n <li v-for=\"(breadcrumb, index) in processedBreadcrumbs\" :key=\"breadcrumb.fullPath\">\n <div class=\"sl-flex sl-items-center\">\n <ChevronRightIcon v-if=\"index !== 0\" class=\"sl-h-5 sl-w-5 sl-flex-shrink-0 sl-text-gray-400 sl-mr-3\" aria-hidden=\"true\" />\n <!-- Make sure UiNavLink forwards the native click event -->\n <UiNavLink :to=\"breadcrumb.fullPath\" @click=\"(event) => handleBreadcrumbClick(breadcrumb, event)\"\n :aria-current=\"breadcrumb.fullPath === currentPath ? 'page' : undefined\"\n class=\"sl-text-sm sl-font-medium sl-text-gray-500 hover:sl-text-gray-700 sl-truncate sl-overflow-ellipsis\">\n {{ breadcrumb.name }}\n </UiNavLink>\n </div>\n </li>\n </ol>\n </nav>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watchEffect, computed } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport UiNavLink from './UiNavLink.vue';\nimport { ChevronRightIcon } from '@heroicons/vue/20/solid';\n\ninterface BreadcrumbItem {\n name: string;\n fullPath: string;\n}\n\ninterface RouteMeta {\n isErrorPage?: boolean;\n}\n\nconst breadcrumbs = ref<BreadcrumbItem[]>([]);\n\nconst route = useRoute();\nconst router = useRouter();\nconst currentPath = ref<string>('');\n\nconst processedBreadcrumbs = computed(() => {\n return breadcrumbs.value.map(breadcrumb => {\n // Optionally trim very long names (only if needed)\n const trimmedName = breadcrumb.name.trim();\n return {\n ...breadcrumb,\n name: trimmedName.length > 12 ? trimmedName.slice(0, 12) + '...' : trimmedName\n };\n });\n});\n\nconst processSegments = async () => {\n const path = route.path;\n currentPath.value = path;\n const pathSegments = path.split('/').filter(Boolean);\n const tempBreadcrumbs: BreadcrumbItem[] = [];\n\n // Loop through each segment in the URL.\n for (const [index, segment] of pathSegments.entries()) {\n let segmentName: string;\n \n // Simple processing - can be extended as needed\n segmentName = segment.charAt(0).toUpperCase() + segment.slice(1).toLowerCase();\n\n tempBreadcrumbs.push({\n name: segmentName,\n fullPath: '/' + pathSegments.slice(0, index + 1).join('/')\n });\n }\n\n breadcrumbs.value = tempBreadcrumbs;\n};\n\n/**\n * Prevent navigation if the resolved route is an error page.\n */\nconst handleBreadcrumbClick = (breadcrumb: BreadcrumbItem, event: MouseEvent) => {\n const resolved = router.resolve(breadcrumb.fullPath);\n // Check if any matched record is an error page.\n const isErrorPage = resolved.matched.some((route: { meta?: RouteMeta }) => route.meta?.isErrorPage);\n if (!resolved || resolved.matched.length === 0 || isErrorPage) {\n event.preventDefault();\n event.stopPropagation();\n console.warn('Breadcrumb route not found or is an error page:', breadcrumb.fullPath);\n }\n};\n\nwatchEffect(() => {\n processSegments();\n});\n</script>\n\n<style scoped>\n</style>\n"],"names":["breadcrumbs","ref","route","useRoute","router","useRouter","currentPath","processedBreadcrumbs","computed","breadcrumb","trimmedName","processSegments","path","pathSegments","tempBreadcrumbs","index","segment","segmentName","handleBreadcrumbClick","event","resolved","isErrorPage","watchEffect","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_Fragment","_renderList","_hoisted_3","_createBlock","_unref","ChevronRightIcon","_createVNode","UiNavLink","_createTextVNode","_toDisplayString"],"mappings":";;;;;;;;;;;;AAiCA,UAAMA,IAAcC,EAAsB,EAAE,GAEtCC,IAAQC,EAAA,GACRC,IAASC,EAAA,GACTC,IAAcL,EAAY,EAAE,GAE5BM,IAAuBC,EAAS,MAC7BR,EAAY,MAAM,IAAI,CAAAS,MAAc;AAEzC,YAAMC,IAAcD,EAAW,KAAK,KAAA;AACpC,aAAO;AAAA,QACL,GAAGA;AAAA,QACH,MAAMC,EAAY,SAAS,KAAKA,EAAY,MAAM,GAAG,EAAE,IAAI,QAAQA;AAAA,MAAA;AAAA,IAEvE,CAAC,CACF,GAEKC,IAAkB,YAAY;AAClC,YAAMC,IAAOV,EAAM;AACnB,MAAAI,EAAY,QAAQM;AACpB,YAAMC,IAAeD,EAAK,MAAM,GAAG,EAAE,OAAO,OAAO,GAC7CE,IAAoC,CAAA;AAG1C,iBAAW,CAACC,GAAOC,CAAO,KAAKH,EAAa,WAAW;AACrD,YAAII;AAGJ,QAAAA,IAAcD,EAAQ,OAAO,CAAC,EAAE,gBAAgBA,EAAQ,MAAM,CAAC,EAAE,YAAA,GAEjEF,EAAgB,KAAK;AAAA,UACnB,MAAMG;AAAA,UACN,UAAU,MAAMJ,EAAa,MAAM,GAAGE,IAAQ,CAAC,EAAE,KAAK,GAAG;AAAA,QAAA,CAC1D;AAAA,MACH;AAEA,MAAAf,EAAY,QAAQc;AAAA,IACtB,GAKMI,IAAwB,CAACT,GAA4BU,MAAsB;AAC/E,YAAMC,IAAWhB,EAAO,QAAQK,EAAW,QAAQ,GAE7CY,IAAcD,EAAS,QAAQ,KAAK,CAAClB,MAAgCA,EAAM,MAAM,WAAW;AAClG,OAAI,CAACkB,KAAYA,EAAS,QAAQ,WAAW,KAAKC,OAChDF,EAAM,eAAA,GACNA,EAAM,gBAAA,GACN,QAAQ,KAAK,mDAAmDV,EAAW,QAAQ;AAAA,IAEvF;AAEA,WAAAa,EAAY,MAAM;AAChB,MAAAX,EAAA;AAAA,IACF,CAAC,cAvFCY,EAAA,GAAAC,EAcM,OAdNC,GAcM;AAAA,MAbJC,EAYK,MAZLC,GAYK;AAAA,SAXHJ,EAAA,EAAA,GAAAC,EAUKI,GAAA,MAAAC,EAV6BtB,EAAA,OAAoB,CAA1CE,GAAYM,YAAxBS,EAUK,MAAA;AAAA,UAVoD,KAAKf,EAAW;AAAA,QAAA;UACvEiB,EAQM,OARNI,GAQM;AAAA,YAPoBf,MAAK,UAA7BgB,EAA0HC,EAAAC,CAAA,GAAA;AAAA;cAArF,OAAM;AAAA,cAA0D,eAAY;AAAA,YAAA;YAEjHC,EAIYC,GAAA;AAAA,cAJA,IAAI1B,EAAW;AAAA,cAAW,UAAQU,MAAUD,EAAsBT,GAAYU,CAAK;AAAA,cAC5F,gBAAcV,EAAW,aAAaH,EAAA,iBAAuB;AAAA,cAC9D,OAAM;AAAA,YAAA;yBACN,MAAqB;AAAA,gBAAlB8B,EAAAC,EAAA5B,EAAW,IAAI,GAAA,CAAA;AAAA,cAAA;;;;;;;;;"}