@stachelock/ui 0.1.0 → 0.1.3
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/CalendarHeader.vue_vue_type_script_setup_true_lang-B3KQTxfD.js +70 -0
- package/dist/CalendarHeader.vue_vue_type_script_setup_true_lang-B3KQTxfD.js.map +1 -0
- package/dist/CheckboxInput.vue_vue_type_script_setup_true_lang-tYAo46wK.js +186 -0
- package/dist/CheckboxInput.vue_vue_type_script_setup_true_lang-tYAo46wK.js.map +1 -0
- package/dist/ComboboxInput.vue_vue_type_script_setup_true_lang-DoJHjJsA.js +304 -0
- package/dist/ComboboxInput.vue_vue_type_script_setup_true_lang-DoJHjJsA.js.map +1 -0
- package/dist/DashboardLayout.vue_vue_type_script_setup_true_lang-CClxYrOW.js +186 -0
- package/dist/DashboardLayout.vue_vue_type_script_setup_true_lang-CClxYrOW.js.map +1 -0
- package/dist/DayCalendar.vue_vue_type_script_setup_true_lang-xE5bCa3O.js +123 -0
- package/dist/DayCalendar.vue_vue_type_script_setup_true_lang-xE5bCa3O.js.map +1 -0
- package/dist/DefaultLayout.vue_vue_type_script_setup_true_lang-BZAz6aC-.js +85 -0
- package/dist/DefaultLayout.vue_vue_type_script_setup_true_lang-BZAz6aC-.js.map +1 -0
- package/dist/DynamicForm.vue_vue_type_script_setup_true_lang-BKhcXkNG.js +201 -0
- package/dist/DynamicForm.vue_vue_type_script_setup_true_lang-BKhcXkNG.js.map +1 -0
- package/dist/DynamicFormField.vue_vue_type_script_setup_true_lang-qAwVNm--.js +153 -0
- package/dist/DynamicFormField.vue_vue_type_script_setup_true_lang-qAwVNm--.js.map +1 -0
- package/dist/EventCard.vue_vue_type_script_setup_true_lang-B3TP-mWX.js +75 -0
- package/dist/EventCard.vue_vue_type_script_setup_true_lang-B3TP-mWX.js.map +1 -0
- package/dist/EventsList.vue_vue_type_script_setup_true_lang-Cpc9A9Ev.js +89 -0
- package/dist/EventsList.vue_vue_type_script_setup_true_lang-Cpc9A9Ev.js.map +1 -0
- package/dist/HeaderLayout.vue_vue_type_script_setup_true_lang-BY2G6hCc.js +49 -0
- package/dist/HeaderLayout.vue_vue_type_script_setup_true_lang-BY2G6hCc.js.map +1 -0
- package/dist/MonthCalendar.vue_vue_type_script_setup_true_lang-B9Bs0z8j.js +66 -0
- package/dist/MonthCalendar.vue_vue_type_script_setup_true_lang-B9Bs0z8j.js.map +1 -0
- package/dist/NavigationGroup.vue_vue_type_script_setup_true_lang-2WURj34G.js +29 -0
- package/dist/NavigationGroup.vue_vue_type_script_setup_true_lang-2WURj34G.js.map +1 -0
- package/dist/NavigationItem.vue_vue_type_script_setup_true_lang-DiNg3gz2.js +51 -0
- package/dist/NavigationItem.vue_vue_type_script_setup_true_lang-DiNg3gz2.js.map +1 -0
- package/dist/SelectInput.vue_vue_type_script_setup_true_lang-BguP8xMU.js +242 -0
- package/dist/SelectInput.vue_vue_type_script_setup_true_lang-BguP8xMU.js.map +1 -0
- package/dist/SidebarLayout.vue_vue_type_script_setup_true_lang-CQIW5dy_.js +173 -0
- package/dist/SidebarLayout.vue_vue_type_script_setup_true_lang-CQIW5dy_.js.map +1 -0
- package/dist/SwitchInput.vue_vue_type_script_setup_true_lang-BagTQ6M0.js +197 -0
- package/dist/SwitchInput.vue_vue_type_script_setup_true_lang-BagTQ6M0.js.map +1 -0
- package/dist/TagifyInput.vue_vue_type_script_setup_true_lang-RHqhKoK5.js +230 -0
- package/dist/TagifyInput.vue_vue_type_script_setup_true_lang-RHqhKoK5.js.map +1 -0
- package/dist/TextAreaInput.vue_vue_type_script_setup_true_lang-CbR651TU.js +158 -0
- package/dist/TextAreaInput.vue_vue_type_script_setup_true_lang-CbR651TU.js.map +1 -0
- package/dist/UiAvatar.vue_vue_type_script_setup_true_lang-CDNjUA1L.js +108 -0
- package/dist/UiAvatar.vue_vue_type_script_setup_true_lang-CDNjUA1L.js.map +1 -0
- package/dist/UiBreadcrumb.vue_vue_type_script_setup_true_lang-CMH47CoK.js +68 -0
- package/dist/UiBreadcrumb.vue_vue_type_script_setup_true_lang-CMH47CoK.js.map +1 -0
- package/dist/UiLoading.vue_vue_type_script_setup_true_lang-DCz52-Me.js +131 -0
- package/dist/UiLoading.vue_vue_type_script_setup_true_lang-DCz52-Me.js.map +1 -0
- package/dist/UiModal.vue_vue_type_script_setup_true_lang-CMk62qeq.js +162 -0
- package/dist/UiModal.vue_vue_type_script_setup_true_lang-CMk62qeq.js.map +1 -0
- package/dist/UiNavLink.vue_vue_type_script_setup_true_lang-Bz5oiCCk.js +222 -0
- package/dist/UiNavLink.vue_vue_type_script_setup_true_lang-Bz5oiCCk.js.map +1 -0
- package/dist/UiProgressBar.vue_vue_type_script_setup_true_lang-0zFKwh43.js +46 -0
- package/dist/UiProgressBar.vue_vue_type_script_setup_true_lang-0zFKwh43.js.map +1 -0
- package/dist/UiRadialProgressBar.vue_vue_type_script_setup_true_lang-BGCBJa2S.js +72 -0
- package/dist/UiRadialProgressBar.vue_vue_type_script_setup_true_lang-BGCBJa2S.js.map +1 -0
- package/dist/UiTable.vue_vue_type_script_setup_true_lang-hI1_xamh.js +211 -0
- package/dist/UiTable.vue_vue_type_script_setup_true_lang-hI1_xamh.js.map +1 -0
- package/dist/UiTransition.vue_vue_type_script_setup_true_lang-DwBTj18t.js +66 -0
- package/dist/UiTransition.vue_vue_type_script_setup_true_lang-DwBTj18t.js.map +1 -0
- package/dist/WeekCalendar.vue_vue_type_script_setup_true_lang-DAFQiRI9.js +154 -0
- package/dist/WeekCalendar.vue_vue_type_script_setup_true_lang-DAFQiRI9.js.map +1 -0
- package/dist/YearCalendar.vue_vue_type_script_setup_true_lang-BfJkvmpN.js +29 -0
- package/dist/YearCalendar.vue_vue_type_script_setup_true_lang-BfJkvmpN.js.map +1 -0
- package/dist/_plugin-vue_export-helper-CHgC5LLL.js +10 -0
- package/dist/_plugin-vue_export-helper-CHgC5LLL.js.map +1 -0
- package/dist/calendar-905Ofszh.js +77 -0
- package/dist/calendar-905Ofszh.js.map +1 -0
- package/dist/calendars/CalendarDashboard.d.ts +3 -0
- package/dist/calendars/CalendarDashboard.js +72 -0
- package/dist/calendars/CalendarDashboard.js.map +1 -0
- package/dist/calendars/CalendarHeader.d.ts +3 -0
- package/dist/calendars/CalendarHeader.js +5 -0
- package/dist/calendars/CalendarHeader.js.map +1 -0
- package/dist/calendars/DayCalendar.d.ts +3 -0
- package/dist/calendars/DayCalendar.js +5 -0
- package/dist/calendars/DayCalendar.js.map +1 -0
- package/dist/calendars/EventCard.d.ts +3 -0
- package/dist/calendars/EventCard.js +5 -0
- package/dist/calendars/EventCard.js.map +1 -0
- package/dist/calendars/EventsList.d.ts +3 -0
- package/dist/calendars/EventsList.js +5 -0
- package/dist/calendars/EventsList.js.map +1 -0
- package/dist/calendars/MonthCalendar.d.ts +3 -0
- package/dist/calendars/MonthCalendar.js +5 -0
- package/dist/calendars/MonthCalendar.js.map +1 -0
- package/dist/calendars/WeekCalendar.d.ts +3 -0
- package/dist/calendars/WeekCalendar.js +5 -0
- package/dist/calendars/WeekCalendar.js.map +1 -0
- package/dist/calendars/YearCalendar.d.ts +3 -0
- package/dist/calendars/YearCalendar.js +5 -0
- package/dist/calendars/YearCalendar.js.map +1 -0
- package/dist/components/Avatar.d.ts +3 -0
- package/dist/components/Avatar.js +5 -0
- package/dist/components/Avatar.js.map +1 -0
- package/dist/components/Badge.d.ts +3 -0
- package/dist/components/Badge.js +42 -0
- package/dist/components/Badge.js.map +1 -0
- package/dist/components/Breadcrumb.d.ts +3 -0
- package/dist/components/Breadcrumb.js +5 -0
- package/dist/components/Breadcrumb.js.map +1 -0
- package/dist/components/Button.d.ts +3 -0
- package/dist/components/Button.js +197 -0
- package/dist/components/Button.js.map +1 -0
- package/dist/components/Loading.d.ts +3 -0
- package/dist/components/Loading.js +5 -0
- package/dist/components/Loading.js.map +1 -0
- package/dist/components/LoadingDots.d.ts +3 -0
- package/dist/components/LoadingDots.js +69 -0
- package/dist/components/LoadingDots.js.map +1 -0
- package/dist/components/Modal.d.ts +3 -0
- package/dist/components/Modal.js +5 -0
- package/dist/components/Modal.js.map +1 -0
- package/dist/components/NavLink.d.ts +3 -0
- package/dist/components/NavLink.js +5 -0
- package/dist/components/NavLink.js.map +1 -0
- package/dist/components/ProgressBar.d.ts +3 -0
- package/dist/components/ProgressBar.js +5 -0
- package/dist/components/ProgressBar.js.map +1 -0
- package/dist/components/RadialProgressBar.d.ts +3 -0
- package/dist/components/RadialProgressBar.js +5 -0
- package/dist/components/RadialProgressBar.js.map +1 -0
- package/dist/components/Table.d.ts +3 -0
- package/dist/components/Table.js +5 -0
- package/dist/components/Table.js.map +1 -0
- package/dist/components/TextInput.d.ts +3 -0
- package/dist/components/TextInput.js +111 -0
- package/dist/components/TextInput.js.map +1 -0
- package/dist/components/Transition.d.ts +3 -0
- package/dist/components/Transition.js +5 -0
- package/dist/components/Transition.js.map +1 -0
- package/dist/forms/DynamicForm.d.ts +3 -0
- package/dist/forms/DynamicForm.js +5 -0
- package/dist/forms/DynamicForm.js.map +1 -0
- package/dist/forms/DynamicFormField.d.ts +3 -0
- package/dist/forms/DynamicFormField.js +5 -0
- package/dist/forms/DynamicFormField.js.map +1 -0
- package/dist/forms/FormFieldWrapper.d.ts +3 -0
- package/dist/forms/FormFieldWrapper.js +158 -0
- package/dist/forms/FormFieldWrapper.js.map +1 -0
- package/dist/id-DafBB_QF.js +20 -0
- package/dist/id-DafBB_QF.js.map +1 -0
- package/dist/index.js +246 -4609
- package/dist/index.js.map +1 -1
- package/dist/inputs/CheckboxInput.d.ts +3 -0
- package/dist/inputs/CheckboxInput.js +5 -0
- package/dist/inputs/CheckboxInput.js.map +1 -0
- package/dist/inputs/ComboboxInput.d.ts +3 -0
- package/dist/inputs/ComboboxInput.js +5 -0
- package/dist/inputs/ComboboxInput.js.map +1 -0
- package/dist/inputs/SelectInput.d.ts +3 -0
- package/dist/inputs/SelectInput.js +5 -0
- package/dist/inputs/SelectInput.js.map +1 -0
- package/dist/inputs/SwitchInput.d.ts +3 -0
- package/dist/inputs/SwitchInput.js +5 -0
- package/dist/inputs/SwitchInput.js.map +1 -0
- package/dist/inputs/TagifyInput.d.ts +3 -0
- package/dist/inputs/TagifyInput.js +5 -0
- package/dist/inputs/TagifyInput.js.map +1 -0
- package/dist/inputs/TextAreaInput.d.ts +3 -0
- package/dist/inputs/TextAreaInput.js +5 -0
- package/dist/inputs/TextAreaInput.js.map +1 -0
- package/dist/layouts/DashboardLayout.d.ts +3 -0
- package/dist/layouts/DashboardLayout.js +5 -0
- package/dist/layouts/DashboardLayout.js.map +1 -0
- package/dist/layouts/DefaultLayout.d.ts +3 -0
- package/dist/layouts/DefaultLayout.js +5 -0
- package/dist/layouts/DefaultLayout.js.map +1 -0
- package/dist/layouts/HeaderLayout.d.ts +3 -0
- package/dist/layouts/HeaderLayout.js +5 -0
- package/dist/layouts/HeaderLayout.js.map +1 -0
- package/dist/layouts/NavigationGroup.d.ts +3 -0
- package/dist/layouts/NavigationGroup.js +5 -0
- package/dist/layouts/NavigationGroup.js.map +1 -0
- package/dist/layouts/NavigationItem.d.ts +3 -0
- package/dist/layouts/NavigationItem.js +5 -0
- package/dist/layouts/NavigationItem.js.map +1 -0
- package/dist/layouts/SidebarLayout.d.ts +3 -0
- package/dist/layouts/SidebarLayout.js +5 -0
- package/dist/layouts/SidebarLayout.js.map +1 -0
- package/dist/src/components/UiLoadingDots.d.ts +1 -1
- package/dist/src/components/UiNavLink.d.ts +1 -1
- package/dist/src/components/inputs/ComboboxInput.d.ts +2 -2
- package/dist/src/components/inputs/SelectInput.d.ts +2 -2
- package/dist/src/components/layouts/DefaultLayout.d.ts +1 -1
- package/package.json +2 -3
- package/dist/CheckboxInput-rWkcde69.js +0 -5
- package/dist/CheckboxInput-rWkcde69.js.map +0 -1
- package/dist/ComboboxInput-B98P_8CZ.js +0 -5
- package/dist/ComboboxInput-B98P_8CZ.js.map +0 -1
- package/dist/SelectInput-B5liNv7H.js +0 -5
- package/dist/SelectInput-B5liNv7H.js.map +0 -1
- package/dist/SwitchInput-D1k9O8gn.js +0 -5
- package/dist/SwitchInput-D1k9O8gn.js.map +0 -1
- package/dist/TextAreaInput-Di6Kstic.js +0 -5
- package/dist/TextAreaInput-Di6Kstic.js.map +0 -1
- package/dist/UiLoading-BuzCrLqO.js +0 -5
- package/dist/UiLoading-BuzCrLqO.js.map +0 -1
- package/dist/index.umd.cjs +0 -11
- package/dist/index.umd.cjs.map +0 -1
|
@@ -0,0 +1,197 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgGA,UAAMA,IAAQC,GAURC,IAAOC,GAMPC,IAAYC,EAAA,GACZC,IAAKC,EAAW,MAAMP,EAAM,IAAI,EAAE,GAElC,EAAE,OAAAQ,GAAO,cAAAC,GAAc,cAAAC,GAAc,YAAAC,GAAY,MAAAC,MAASC;AAAA,MAC9D,MAAMb,EAAM;AAAA,MACZA,EAAM;AAAA,MACN;AAAA,QACE,MAAM;AAAA,QACN,iBAAiBA,EAAM;AAAA,QACvB,cAAcA,EAAM,cAAcA,EAAM;AAAA,QACxC,YAAY;AAAA,MAAA;AAAA,IACd,GAGIc,IAAcT,EAAaL,EAAM,cAAcA,EAAM,YAAY;AAGvE,IAAAe;AAAA,MACE,MAAMf,EAAM;AAAA,MACZ,CAACgB,MAAa;AACZ,YAAIA,MAAa,UAAaA,MAAaF,EAAY,OAAO;AAC5D,gBAAMG,IAAU,CAAC,CAACD;AAClB,UAAAF,EAAY,QAAQG,GACpBT,EAAM,QAAQS;AAAA,QAChB;AAAA,MACF;AAAA,MACA,EAAE,WAAW,GAAA;AAAA,IAAK;AAGpB,UAAMC,IAAgBC,EAAS,MAAM;AACnC,YAAMC,IAAc;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAGF,aAAIpB,EAAM,YACRoB,EAAY;AAAA,QACV;AAAA,QACA;AAAA,MAAA,GAIAN,EAAY,QACdM,EAAY,KAAK,sBAAsB,IAEvCA,EAAY,KAAK,gBAAgB,GAG5BA,EAAY,KAAK,GAAG;AAAA,IAC7B,CAAC,GAEKC,IAAe,CAACb,MAAmB;AACvC,MAAIR,EAAM,aAEVc,EAAY,QAAQN,GAChBR,EAAM,aACRU,EAAaF,CAAK,GAEpBN,EAAK,qBAAqBM,CAAK;AAAA,IACjC,GAEMc,IAAS,CAACC,MAAsB;AACpC,MAAKvB,EAAM,aACTU,EAAaI,EAAY,KAAK,GAEhCH,EAAWY,CAAK,GAChBrB,EAAK,QAAQqB,CAAK;AAAA,IACpB,GAEMC,IAAU,CAACD,MAAsB;AACrC,MAAArB,EAAK,SAASqB,CAAK;AAAA,IACrB,GAGME,IAAS,MAAM;AACnB,MAAKzB,EAAM,YACTqB,EAAa,CAACP,EAAY,KAAK;AAAA,IAEnC;AAEA,WAAAY,EAAa;AAAA,MACX,QAAAD;AAAA,MACA,OAAOX;AAAA,MACP,OAAO,MAAM;AAET,SADUV,EAAU,OAAe,OAAOA,EAAU,QACnB,QAAA;AAAA,MACrC;AAAA,MACA,MAAM,MAAM;AAER,SADUA,EAAU,OAAe,OAAOA,EAAU,QACnB,OAAA;AAAA,MACrC;AAAA,MACA,WAAAA;AAAA,IAAA,CACD,cA1NCuB,EAAA,GAAAC,EA+DM,OA/DNC,GA+DM;AAAA,MA9DJC,EA6DmBC,GAAA;AAAA,QA5DhB,IAAIC,EAAA1B,CAAA;AAAA,QACJ,MAAM2B,EAAAA;AAAAA,QACN,OAAOC,EAAAA,WAAM,aAAA,CAAmBC,EAAAA,gBAAgBC,EAAAA,QAAK;AAAA,QACrD,UAAUC,EAAAA;AAAAA,QACV,WAAWC,EAAAA;AAAAA,QACX,kBAAgBC,EAAAA;AAAAA,QAChB,cAAYC,EAAAA;AAAAA,QACZ,iBAAeR,EAAAvB,CAAA;AAAA,QACf,mBAAiBgC,EAAAA;AAAAA,QACjB,YAAUT,EAAApB,CAAA,EAAK;AAAA,QACf,cAAYoB,EAAApB,CAAA,EAAK;AAAA,QACjB,eAAa8B,EAAAA;AAAAA,MAAAA;mBAEd,MA8CM;AAAA,UA9CNC,EA8CM,OA9CNC,GA8CM;AAAA,YA7COV,EAAAA,WAAM,YAAjBP,KAAAC,EAYM,OAZNiB,GAYM;AAAA,cAVIT,EAAAA,UAAUD,EAAAA,sBADlBP,EAMQ,SAAA;AAAA;gBAJL,KAAKI,EAAA1B,CAAA;AAAA,gBACN,OAAM;AAAA,cAAA,KAEH8B,EAAAA,KAAK,GAAA,GAAAU,CAAA;cAECC,EAAAA,oBAAXnB,EAGM,OAAA;AAAA;gBAHkB,OAAKoB,EAAA,CAAC,uCAAqC,EAAA,qBAAA,CAAiCX,EAAAA,SAAAA,CAAQ,CAAA;AAAA,gBAAK,SAAKY,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAA,CAAGb,EAAAA,YAAYZ,EAAA;AAAA,cAAM;gBAC9H0B,EAAAA,0BAAXvB,EAAqD,OAAA;AAAA;kBAAvB,WAAQmB,EAAAA;AAAAA,gBAAAA,mBACtCpB,EAAA,GAAAC,EAAqC,aAArBmB,EAAAA,WAAW,GAAA,CAAA;AAAA,cAAA;;YAG/BjB,EAuBSE,EAAAoB,CAAA,GAAA;AAAA,cAtBN,IAAIpB,EAAA1B,CAAA;AAAA,uBACD;AAAA,cAAJ,KAAIF;AAAA,0BACKU,EAAA;AAAA;uCAAAA,EAAW,QAAAoC;AAAA,gBAMC7B;AAAA,cAAA;AAAA,cALpB,UAAUgB,EAAAA;AAAAA,cACV,OAAKW,EAAA;AAAA,gBAAgB9B,EAAA;AAAA,kCAA6CsB,EAAAA,UAAAA;AAAAA,cAAS;cAK3E,SAAAhB;AAAA,cACA,QAAAF;AAAA,cACA,WAAO;AAAA,oBAAgBG,GAAM,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA;AAAA,oBACNA,GAAM,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA;AAAA,cAAA;AAAA;yBAE9B,MAA2C;AAAA,gBAA3CkB,EAA2C,QAA3CU,GAA2CC,EAAflB,EAAAA,KAAK,GAAA,CAAA;AAAA,gBACjCO,EAMO,QAAA;AAAA,kBALJ,OAAKK,EAAA;AAAA,oBAAkBlC,EAAA,QAAW,qBAAA;AAAA;;;;;;YAO3ByC,EAAAA,YAAYC,EAAAA,aAAxB7B,KAAAC,EAGO,QAHP6B,GAGO;AAAA,cAFO3C,EAAA,SAAeyC,EAAAA,iBAA3B3B,EAAkG,QAAlG8B,GAAkGJ,EAAlBC,EAAAA,QAAQ,GAAA,CAAA,KACtE,CAAAzC,EAAA,SAAe0C,EAAAA,kBAAjC5B,EAA2F,QAA3F+B,GAA2FL,EAAnBE,EAAAA,SAAS,GAAA,CAAA;;YAExET,EAAAA,eAAeb,EAAAA,WAAM,aAAhCP,KAAAC,EAGM,OAHNgC,GAGM;AAAA,cAFMT,EAAAA,0BACVvB,EAA6E,KAAA;AAAA;gBAAnE,OAAM;AAAA,gBAAsC,WAAQmB,EAAAA;AAAAA,cAAAA,wBAD9DnB,EAA8F,KAA9FiC,GAA8FP,EAAlBP,EAAAA,WAAW,GAAA,CAAA;AAAA;;;;;;;;"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { defineComponent as V, ref as p, watch as z, onMounted as A, createBlock as w, openBlock as u, withCtx as g, createElementVNode as d, normalizeClass as U, createElementBlock as c, Fragment as T, renderList as S, withDirectives as k, toDisplayString as h, normalizeStyle as F, withKeys as C, withModifiers as y, vModelText as B, createVNode as Q, unref as R, createCommentVNode as K, renderSlot as L, nextTick as W } from "vue";
|
|
2
|
+
import { XMarkIcon as X } from "@heroicons/vue/20/solid";
|
|
3
|
+
import j from "./components/Badge.js";
|
|
4
|
+
import G from "./forms/FormFieldWrapper.js";
|
|
5
|
+
const H = { key: 0 }, P = ["onUpdate:modelValue", "placeholder", "disabled", "onKeydown", "onBlur"], Y = ["onClick", "disabled"], Z = { class: "sl-flex-1 sl-min-w-0 sl-relative" }, _ = ["placeholder", "disabled", "onKeydown"], ee = { class: "sl-absolute sl-inset-y-0 sl-right-0 sl-flex sl-items-center sl-pr-3 sl-pointer-events-auto" }, te = {
|
|
6
|
+
key: 0,
|
|
7
|
+
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"
|
|
8
|
+
}, le = ["onClick"], se = { class: "sl-flex" }, ae = { class: "sl-truncate sl-font-semibold" }, ne = { class: "sl-block sl-truncate" }, oe = {
|
|
9
|
+
key: 0,
|
|
10
|
+
class: "sl-ml-2 sl-truncate sl-text-gray-500"
|
|
11
|
+
}, ce = /* @__PURE__ */ V({
|
|
12
|
+
__name: "TagifyInput",
|
|
13
|
+
props: {
|
|
14
|
+
items: {
|
|
15
|
+
type: Array,
|
|
16
|
+
required: !0
|
|
17
|
+
},
|
|
18
|
+
value: {
|
|
19
|
+
type: Array,
|
|
20
|
+
default: () => []
|
|
21
|
+
},
|
|
22
|
+
name: {
|
|
23
|
+
type: String,
|
|
24
|
+
required: !0
|
|
25
|
+
},
|
|
26
|
+
label: {
|
|
27
|
+
type: String,
|
|
28
|
+
required: !1
|
|
29
|
+
},
|
|
30
|
+
itemKey: {
|
|
31
|
+
type: String,
|
|
32
|
+
default: "id"
|
|
33
|
+
},
|
|
34
|
+
itemText: {
|
|
35
|
+
type: String,
|
|
36
|
+
default: "value"
|
|
37
|
+
},
|
|
38
|
+
itemSubtext: {
|
|
39
|
+
type: String,
|
|
40
|
+
default: "name"
|
|
41
|
+
},
|
|
42
|
+
showSubext: {
|
|
43
|
+
type: Boolean,
|
|
44
|
+
default: !0
|
|
45
|
+
},
|
|
46
|
+
tagDisplayKey: {
|
|
47
|
+
type: String,
|
|
48
|
+
default: "name"
|
|
49
|
+
},
|
|
50
|
+
tertiaryLabel: {
|
|
51
|
+
type: String,
|
|
52
|
+
required: !1
|
|
53
|
+
},
|
|
54
|
+
pattern: {
|
|
55
|
+
type: RegExp,
|
|
56
|
+
default: null
|
|
57
|
+
},
|
|
58
|
+
inline: {
|
|
59
|
+
type: Boolean,
|
|
60
|
+
default: !1
|
|
61
|
+
},
|
|
62
|
+
placeholder: {
|
|
63
|
+
type: String,
|
|
64
|
+
default: "Add a tag..."
|
|
65
|
+
},
|
|
66
|
+
disabled: {
|
|
67
|
+
type: Boolean,
|
|
68
|
+
default: !1
|
|
69
|
+
},
|
|
70
|
+
optional: {
|
|
71
|
+
type: Boolean,
|
|
72
|
+
default: !1
|
|
73
|
+
},
|
|
74
|
+
errorMessage: {
|
|
75
|
+
type: String,
|
|
76
|
+
default: ""
|
|
77
|
+
},
|
|
78
|
+
hasInputRing: {
|
|
79
|
+
type: Boolean,
|
|
80
|
+
default: !1
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
emits: ["update:value", "update:query", "invalid-tag"],
|
|
84
|
+
setup(s, { expose: N, emit: D }) {
|
|
85
|
+
const t = s, m = D, i = p(""), f = p([]), n = p(JSON.parse(JSON.stringify(t.value))), v = p(!1);
|
|
86
|
+
z(
|
|
87
|
+
() => t.value,
|
|
88
|
+
(e) => {
|
|
89
|
+
JSON.stringify(e) !== JSON.stringify(n.value) && (n.value = JSON.parse(JSON.stringify(e)));
|
|
90
|
+
},
|
|
91
|
+
{ deep: !0 }
|
|
92
|
+
);
|
|
93
|
+
const I = (e) => e[t.itemSubtext] || e[t.itemText], q = (e) => e[t.itemSubtext] ? e[t.itemText] : void 0, E = (e) => e[t.tagDisplayKey] || e[t.itemText], $ = () => {
|
|
94
|
+
if (i.value && i.value.length > 0) {
|
|
95
|
+
m("update:query", i.value);
|
|
96
|
+
const e = i.value.toLowerCase();
|
|
97
|
+
f.value = t.items.filter((a) => a[t.itemText]?.toLowerCase().includes(e) || a[t.itemSubtext]?.toLowerCase().includes(e)), v.value = !0;
|
|
98
|
+
} else
|
|
99
|
+
f.value = [], v.value = !1;
|
|
100
|
+
}, J = () => {
|
|
101
|
+
const e = i.value.trim();
|
|
102
|
+
if (e === "")
|
|
103
|
+
return;
|
|
104
|
+
let a = null;
|
|
105
|
+
const l = e.toLowerCase(), r = t.items.find(
|
|
106
|
+
(o) => o[t.itemText]?.toLowerCase() === l || o[t.itemSubtext]?.toLowerCase() === l
|
|
107
|
+
);
|
|
108
|
+
if (r)
|
|
109
|
+
a = { ...r };
|
|
110
|
+
else if (t.pattern && t.pattern.test(e))
|
|
111
|
+
a = { id: null, [t.itemText]: e };
|
|
112
|
+
else
|
|
113
|
+
return;
|
|
114
|
+
n.value.some(
|
|
115
|
+
(o) => o[t.itemText] === a[t.itemText]
|
|
116
|
+
) || (n.value.push(a), m("update:value", n.value)), i.value = "", f.value = [], v.value = !1;
|
|
117
|
+
}, M = (e) => {
|
|
118
|
+
const a = e[t.itemText].trim();
|
|
119
|
+
n.value.some(
|
|
120
|
+
(l) => l[t.itemText] === a
|
|
121
|
+
) || (n.value.push({ ...e }), m("update:value", n.value)), i.value = "", f.value = [], v.value = !1;
|
|
122
|
+
}, b = (e) => {
|
|
123
|
+
n.value.splice(e, 1), m("update:value", n.value);
|
|
124
|
+
}, O = (e) => {
|
|
125
|
+
n.value[e].isEditing = !0, W(() => {
|
|
126
|
+
});
|
|
127
|
+
}, x = (e) => {
|
|
128
|
+
const a = n.value[e];
|
|
129
|
+
if (a) {
|
|
130
|
+
a.isEditing = !1;
|
|
131
|
+
const l = a[t.itemText].trim();
|
|
132
|
+
if (t.pattern && !t.pattern.test(l)) {
|
|
133
|
+
m("invalid-tag", l), b(e);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
a[t.itemText] = l, m("update:value", n.value);
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
return A(() => {
|
|
140
|
+
f.value = [];
|
|
141
|
+
}), N({
|
|
142
|
+
selectedTags: n
|
|
143
|
+
}), (e, a) => (u(), w(G, {
|
|
144
|
+
id: s.name,
|
|
145
|
+
name: s.name,
|
|
146
|
+
label: s.label,
|
|
147
|
+
"tertiary-label": s.tertiaryLabel,
|
|
148
|
+
"error-message": s.errorMessage,
|
|
149
|
+
disabled: s.disabled,
|
|
150
|
+
optional: s.optional
|
|
151
|
+
}, {
|
|
152
|
+
"tertiary-label-overlay": g(() => [
|
|
153
|
+
L(e.$slots, "tertiary-overlay")
|
|
154
|
+
]),
|
|
155
|
+
default: g(() => [
|
|
156
|
+
d("div", {
|
|
157
|
+
class: U(["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", s.inline ? null : "sl-shadow-sm sl-border sl-border-gray-300 focus-within:sl-ring-2 focus-within:sl-ring-stachelock-600"])
|
|
158
|
+
}, [
|
|
159
|
+
(u(!0), c(T, null, S(n.value, (l, r) => (u(), w(j, {
|
|
160
|
+
key: r,
|
|
161
|
+
onClick: (o) => O(r),
|
|
162
|
+
theme: "primary",
|
|
163
|
+
size: "sm"
|
|
164
|
+
}, {
|
|
165
|
+
default: g(() => [
|
|
166
|
+
l.isEditing ? k((u(), c("input", {
|
|
167
|
+
key: 1,
|
|
168
|
+
ref_for: !0,
|
|
169
|
+
ref: "editInput",
|
|
170
|
+
"onUpdate:modelValue": (o) => l[t.itemText] = o,
|
|
171
|
+
placeholder: s.placeholder,
|
|
172
|
+
disabled: s.disabled,
|
|
173
|
+
onKeydown: C(y((o) => x(r), ["prevent"]), ["enter"]),
|
|
174
|
+
onBlur: (o) => x(r),
|
|
175
|
+
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",
|
|
176
|
+
style: F({ width: l[t.itemText].length + 4 + "ch" })
|
|
177
|
+
}, null, 44, P)), [
|
|
178
|
+
[B, l[t.itemText]]
|
|
179
|
+
]) : (u(), c("span", H, h(E(l)), 1)),
|
|
180
|
+
d("button", {
|
|
181
|
+
type: "button",
|
|
182
|
+
class: "sl-ml-2 sl-text-stachelock-600 hover:sl-text-stachelock-400 focus:sl-outline-none",
|
|
183
|
+
onClick: y((o) => b(r), ["stop"]),
|
|
184
|
+
disabled: s.disabled
|
|
185
|
+
}, [
|
|
186
|
+
Q(R(X), { class: "sl-h-4 sl-w-4" })
|
|
187
|
+
], 8, Y)
|
|
188
|
+
]),
|
|
189
|
+
_: 2
|
|
190
|
+
}, 1032, ["onClick"]))), 128)),
|
|
191
|
+
d("div", Z, [
|
|
192
|
+
k(d("input", {
|
|
193
|
+
ref: "input",
|
|
194
|
+
"onUpdate:modelValue": a[0] || (a[0] = (l) => i.value = l),
|
|
195
|
+
placeholder: s.placeholder,
|
|
196
|
+
onInput: $,
|
|
197
|
+
disabled: s.disabled,
|
|
198
|
+
onKeydown: C(y(J, ["prevent"]), ["enter"]),
|
|
199
|
+
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"
|
|
200
|
+
}, null, 40, _), [
|
|
201
|
+
[B, i.value]
|
|
202
|
+
]),
|
|
203
|
+
d("div", ee, [
|
|
204
|
+
L(e.$slots, "input-overlay")
|
|
205
|
+
]),
|
|
206
|
+
v.value && !s.disabled ? (u(), c("div", te, [
|
|
207
|
+
(u(!0), c(T, null, S(f.value, (l) => (u(), c("div", {
|
|
208
|
+
key: l[s.itemKey],
|
|
209
|
+
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",
|
|
210
|
+
onClick: y((r) => M(l), ["prevent"])
|
|
211
|
+
}, [
|
|
212
|
+
d("div", se, [
|
|
213
|
+
d("span", ae, [
|
|
214
|
+
d("span", ne, h(I(l)), 1)
|
|
215
|
+
]),
|
|
216
|
+
s.showSubext ? (u(), c("span", oe, h(q(l)), 1)) : K("", !0)
|
|
217
|
+
])
|
|
218
|
+
], 8, le))), 128))
|
|
219
|
+
])) : K("", !0)
|
|
220
|
+
])
|
|
221
|
+
], 2)
|
|
222
|
+
]),
|
|
223
|
+
_: 3
|
|
224
|
+
}, 8, ["id", "name", "label", "tertiary-label", "error-message", "disabled", "optional"]));
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
export {
|
|
228
|
+
ce as _
|
|
229
|
+
};
|
|
230
|
+
//# sourceMappingURL=TagifyInput.vue_vue_type_script_setup_true_lang-RHqhKoK5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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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"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { defineComponent as S, ref as z, watch as h, computed as F, createElementBlock as d, openBlock as u, createVNode as O, unref as a, withCtx as g, createElementVNode as f, withDirectives as I, createCommentVNode as b, mergeProps as N, isRef as R, vModelText as j, toDisplayString as i } from "vue";
|
|
2
|
+
import { useField as A } from "vee-validate";
|
|
3
|
+
import D from "./forms/FormFieldWrapper.js";
|
|
4
|
+
import { g as E } from "./id-DafBB_QF.js";
|
|
5
|
+
const L = { class: "sl-w-full" }, T = { class: "sl-relative" }, P = ["id", "name", "disabled", "placeholder", "spellcheck", "rows", "maxlength"], U = {
|
|
6
|
+
key: 0,
|
|
7
|
+
class: "sl-absolute sl-bottom-2 sl-right-2 sl-text-xs sl-text-slate-500 sl-pointer-events-none"
|
|
8
|
+
}, W = { key: 0 }, Q = /* @__PURE__ */ S({
|
|
9
|
+
__name: "TextAreaInput",
|
|
10
|
+
props: {
|
|
11
|
+
name: {},
|
|
12
|
+
label: {},
|
|
13
|
+
placeholder: {},
|
|
14
|
+
disabled: { type: Boolean },
|
|
15
|
+
rules: {},
|
|
16
|
+
validateOnMount: { type: Boolean },
|
|
17
|
+
successMessage: {},
|
|
18
|
+
tertiaryLabel: {},
|
|
19
|
+
spellcheck: { type: Boolean, default: !0 },
|
|
20
|
+
rows: { default: 4 },
|
|
21
|
+
maxlength: {},
|
|
22
|
+
inputClass: {},
|
|
23
|
+
inputStyle: { type: [Boolean, null, String, Object, Array] },
|
|
24
|
+
lazy: { type: Boolean, default: !1 },
|
|
25
|
+
modelValue: {},
|
|
26
|
+
boxShadow: { type: Boolean, default: !1 }
|
|
27
|
+
},
|
|
28
|
+
emits: ["update:modelValue", "blur", "focus"],
|
|
29
|
+
setup(y, { expose: v, emit: w }) {
|
|
30
|
+
const s = y, n = w, t = z(), c = E(s.name), { value: l, errorMessage: m, handleBlur: k, handleChange: p, meta: r } = A(
|
|
31
|
+
() => s.name,
|
|
32
|
+
s.rules,
|
|
33
|
+
{
|
|
34
|
+
validateOnMount: s.validateOnMount,
|
|
35
|
+
initialValue: s.modelValue,
|
|
36
|
+
syncVModel: !0
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
h(
|
|
40
|
+
() => s.modelValue,
|
|
41
|
+
(e) => {
|
|
42
|
+
e !== l.value && (l.value = e || "");
|
|
43
|
+
}
|
|
44
|
+
), h(
|
|
45
|
+
l,
|
|
46
|
+
(e) => {
|
|
47
|
+
n("update:modelValue", e);
|
|
48
|
+
}
|
|
49
|
+
);
|
|
50
|
+
const B = F(() => {
|
|
51
|
+
const e = [
|
|
52
|
+
"sl-w-full",
|
|
53
|
+
"sl-px-3",
|
|
54
|
+
"sl-py-2",
|
|
55
|
+
"sl-text-sm",
|
|
56
|
+
"sl-border",
|
|
57
|
+
"sl-rounded-md",
|
|
58
|
+
"sl-bg-white",
|
|
59
|
+
"sl-transition-all",
|
|
60
|
+
"sl-duration-200",
|
|
61
|
+
"focus:sl-outline-none",
|
|
62
|
+
"focus:sl-ring-2",
|
|
63
|
+
"focus:sl-ring-stachelock-500",
|
|
64
|
+
"focus:sl-border-stachelock-500",
|
|
65
|
+
"sl-resize-y",
|
|
66
|
+
"sl-min-h-[80px]"
|
|
67
|
+
];
|
|
68
|
+
return s.disabled ? e.push(
|
|
69
|
+
"sl-bg-gray-50",
|
|
70
|
+
"sl-text-gray-500",
|
|
71
|
+
"sl-cursor-not-allowed",
|
|
72
|
+
"sl-border-gray-200"
|
|
73
|
+
) : m.value ? e.push(
|
|
74
|
+
"sl-border-red-300",
|
|
75
|
+
"focus:sl-ring-red-500",
|
|
76
|
+
"focus:sl-border-red-500"
|
|
77
|
+
) : r.valid && r.touched ? e.push(
|
|
78
|
+
"sl-border-green-300",
|
|
79
|
+
"focus:sl-ring-green-500",
|
|
80
|
+
"focus:sl-border-green-500"
|
|
81
|
+
) : e.push(
|
|
82
|
+
"sl-border-gray-300",
|
|
83
|
+
"hover:sl-border-gray-400"
|
|
84
|
+
), e.join(" ");
|
|
85
|
+
}), M = (e) => {
|
|
86
|
+
const o = e.target;
|
|
87
|
+
s.lazy || p(o.value);
|
|
88
|
+
}, V = (e) => {
|
|
89
|
+
if (s.lazy) {
|
|
90
|
+
const o = e.target;
|
|
91
|
+
p(o.value);
|
|
92
|
+
}
|
|
93
|
+
k(e), n("blur", e);
|
|
94
|
+
}, C = (e) => {
|
|
95
|
+
n("focus", e);
|
|
96
|
+
};
|
|
97
|
+
return v({
|
|
98
|
+
focus: () => {
|
|
99
|
+
t.value?.focus();
|
|
100
|
+
},
|
|
101
|
+
blur: () => {
|
|
102
|
+
t.value?.blur();
|
|
103
|
+
},
|
|
104
|
+
textareaRef: t
|
|
105
|
+
}), (e, o) => (u(), d("div", L, [
|
|
106
|
+
O(D, {
|
|
107
|
+
id: a(c),
|
|
108
|
+
name: e.name,
|
|
109
|
+
label: e.label,
|
|
110
|
+
disabled: e.disabled,
|
|
111
|
+
optional: !e.rules,
|
|
112
|
+
"tertiary-label": e.tertiaryLabel,
|
|
113
|
+
"box-shadow": e.boxShadow,
|
|
114
|
+
"error-message": a(m),
|
|
115
|
+
"success-message": e.successMessage,
|
|
116
|
+
"is-valid": a(r).valid,
|
|
117
|
+
"is-touched": a(r).touched
|
|
118
|
+
}, {
|
|
119
|
+
"success-message": g(() => [
|
|
120
|
+
e.successMessage ? (u(), d("span", W, i(e.successMessage), 1)) : b("", !0)
|
|
121
|
+
]),
|
|
122
|
+
default: g(() => [
|
|
123
|
+
f("div", T, [
|
|
124
|
+
I(f("textarea", N({
|
|
125
|
+
id: a(c),
|
|
126
|
+
ref_key: "textareaRef",
|
|
127
|
+
ref: t,
|
|
128
|
+
"onUpdate:modelValue": o[0] || (o[0] = (x) => R(l) ? l.value = x : null),
|
|
129
|
+
name: e.name,
|
|
130
|
+
disabled: e.disabled,
|
|
131
|
+
placeholder: e.placeholder,
|
|
132
|
+
class: [
|
|
133
|
+
B.value,
|
|
134
|
+
e.inputClass
|
|
135
|
+
],
|
|
136
|
+
style: e.inputStyle,
|
|
137
|
+
spellcheck: e.spellcheck,
|
|
138
|
+
rows: e.rows,
|
|
139
|
+
maxlength: e.maxlength
|
|
140
|
+
}, e.$attrs, {
|
|
141
|
+
onBlur: V,
|
|
142
|
+
onFocus: C,
|
|
143
|
+
onInput: M
|
|
144
|
+
}), null, 16, P), [
|
|
145
|
+
[j, a(l)]
|
|
146
|
+
]),
|
|
147
|
+
e.maxlength !== void 0 ? (u(), d("div", U, i(a(l)?.length || 0) + "/" + i(e.maxlength), 1)) : b("", !0)
|
|
148
|
+
])
|
|
149
|
+
]),
|
|
150
|
+
_: 1
|
|
151
|
+
}, 8, ["id", "name", "label", "disabled", "optional", "tertiary-label", "box-shadow", "error-message", "success-message", "is-valid", "is-touched"])
|
|
152
|
+
]));
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
export {
|
|
156
|
+
Q as _
|
|
157
|
+
};
|
|
158
|
+
//# sourceMappingURL=TextAreaInput.vue_vue_type_script_setup_true_lang-CbR651TU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextAreaInput.vue_vue_type_script_setup_true_lang-CbR651TU.js","sources":["../src/components/inputs/TextAreaInput.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 <div class=\"sl-relative\">\n <textarea\n :id=\"id\"\n ref=\"textareaRef\"\n v-model=\"value\"\n :name=\"name\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :class=\"[\n textareaClasses,\n inputClass\n ]\"\n :style=\"inputStyle\"\n :spellcheck=\"spellcheck\"\n :rows=\"rows\"\n :maxlength=\"maxlength\"\n v-bind=\"$attrs\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @input=\"onInput\"\n />\n \n <!-- Character count -->\n <div \n v-if=\"maxlength !== undefined\" \n class=\"sl-absolute sl-bottom-2 sl-right-2 sl-text-xs sl-text-slate-500 sl-pointer-events-none\"\n >\n {{ value?.length || 0 }}/{{ maxlength }}\n </div>\n </div>\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, type StyleValue } from 'vue'\nimport { useField } from 'vee-validate'\nimport FormFieldWrapper from '../forms/FormFieldWrapper.vue'\nimport type { ValidationRule } from '../../types/form'\nimport { generateId } from '../../utils/id'\n\ninterface Props {\n name: string\n label?: string\n placeholder?: string\n disabled?: boolean\n rules?: ValidationRule\n validateOnMount?: boolean\n successMessage?: string\n tertiaryLabel?: string\n spellcheck?: boolean\n rows?: number\n maxlength?: number\n inputClass?: string\n inputStyle?: StyleValue\n lazy?: boolean\n modelValue?: string\n boxShadow?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n spellcheck: true,\n rows: 4,\n lazy: false,\n boxShadow: false\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n blur: [event: FocusEvent]\n focus: [event: FocusEvent]\n}>()\n\nconst textareaRef = ref<HTMLTextAreaElement>()\nconst id = generateId(props.name)\n\n// Use vee-validate for form validation\nconst { value, errorMessage, handleBlur, handleChange, meta } = useField(\n () => props.name,\n props.rules,\n {\n validateOnMount: props.validateOnMount,\n initialValue: props.modelValue,\n syncVModel: true\n }\n)\n\n// Sync with v-model\nwatch(\n () => props.modelValue,\n (newValue) => {\n if (newValue !== value.value) {\n value.value = newValue || ''\n }\n }\n)\n\nwatch(\n value,\n (newValue) => {\n emit('update:modelValue', newValue)\n }\n)\n\nconst textareaClasses = computed(() => {\n const baseClasses = [\n 'sl-w-full',\n 'sl-px-3',\n 'sl-py-2',\n 'sl-text-sm',\n 'sl-border',\n 'sl-rounded-md',\n 'sl-bg-white',\n 'sl-transition-all',\n 'sl-duration-200',\n 'focus:sl-outline-none',\n 'focus:sl-ring-2',\n 'focus:sl-ring-stachelock-500',\n 'focus:sl-border-stachelock-500',\n 'sl-resize-y',\n 'sl-min-h-[80px]'\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 onInput = (event: Event) => {\n const target = event.target as HTMLTextAreaElement\n if (!props.lazy) {\n handleChange(target.value)\n }\n}\n\nconst onBlur = (event: FocusEvent) => {\n if (props.lazy) {\n const target = event.target as HTMLTextAreaElement\n handleChange(target.value)\n }\n handleBlur(event)\n emit('blur', event)\n}\n\nconst onFocus = (event: FocusEvent) => {\n emit('focus', event)\n}\n\nconst focus = () => {\n textareaRef.value?.focus()\n}\n\nconst blur = () => {\n textareaRef.value?.blur()\n}\n\ndefineExpose({\n focus,\n blur,\n textareaRef\n})\n</script>\n\n\n"],"names":["props","__props","emit","__emit","textareaRef","ref","id","generateId","value","errorMessage","handleBlur","handleChange","meta","useField","watch","newValue","textareaClasses","computed","baseClasses","onInput","event","target","onBlur","onFocus","__expose","_openBlock","_createElementBlock","_hoisted_1","_createVNode","FormFieldWrapper","_unref","name","label","disabled","rules","tertiaryLabel","boxShadow","successMessage","_createElementVNode","_hoisted_2","_withDirectives","_mergeProps","$event","placeholder","inputClass","inputStyle","spellcheck","rows","maxlength","$attrs","_hoisted_4","_toDisplayString"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+EA,UAAMA,IAAQC,GAORC,IAAOC,GAMPC,IAAcC,EAAA,GACdC,IAAKC,EAAWP,EAAM,IAAI,GAG1B,EAAE,OAAAQ,GAAO,cAAAC,GAAc,YAAAC,GAAY,cAAAC,GAAc,MAAAC,MAASC;AAAA,MAC9D,MAAMb,EAAM;AAAA,MACZA,EAAM;AAAA,MACN;AAAA,QACE,iBAAiBA,EAAM;AAAA,QACvB,cAAcA,EAAM;AAAA,QACpB,YAAY;AAAA,MAAA;AAAA,IACd;AAIF,IAAAc;AAAA,MACE,MAAMd,EAAM;AAAA,MACZ,CAACe,MAAa;AACZ,QAAIA,MAAaP,EAAM,UACrBA,EAAM,QAAQO,KAAY;AAAA,MAE9B;AAAA,IAAA,GAGFD;AAAA,MACEN;AAAA,MACA,CAACO,MAAa;AACZ,QAAAb,EAAK,qBAAqBa,CAAQ;AAAA,MACpC;AAAA,IAAA;AAGF,UAAMC,IAAkBC,EAAS,MAAM;AACrC,YAAMC,IAAc;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAGF,aAAIlB,EAAM,WACRkB,EAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,IAEOT,EAAa,QACtBS,EAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,MAAA,IAEON,EAAK,SAASA,EAAK,UAC5BM,EAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,MAAA,IAGFA,EAAY;AAAA,QACV;AAAA,QACA;AAAA,MAAA,GAIGA,EAAY,KAAK,GAAG;AAAA,IAC7B,CAAC,GAEKC,IAAU,CAACC,MAAiB;AAChC,YAAMC,IAASD,EAAM;AACrB,MAAKpB,EAAM,QACTW,EAAaU,EAAO,KAAK;AAAA,IAE7B,GAEMC,IAAS,CAACF,MAAsB;AACpC,UAAIpB,EAAM,MAAM;AACd,cAAMqB,IAASD,EAAM;AACrB,QAAAT,EAAaU,EAAO,KAAK;AAAA,MAC3B;AACA,MAAAX,EAAWU,CAAK,GAChBlB,EAAK,QAAQkB,CAAK;AAAA,IACpB,GAEMG,IAAU,CAACH,MAAsB;AACrC,MAAAlB,EAAK,SAASkB,CAAK;AAAA,IACrB;AAUA,WAAAI,EAAa;AAAA,MACX,OATY,MAAM;AAClB,QAAApB,EAAY,OAAO,MAAA;AAAA,MACrB;AAAA,MAQE,MANW,MAAM;AACjB,QAAAA,EAAY,OAAO,KAAA;AAAA,MACrB;AAAA,MAKE,aAAAA;AAAA,IAAA,CACD,cA1MCqB,EAAA,GAAAC,EAiDM,OAjDNC,GAiDM;AAAA,MAhDJC,EA+CmBC,GAAA;AAAA,QA9ChB,IAAIC,EAAAxB,CAAA;AAAA,QACJ,MAAMyB,EAAAA;AAAAA,QACN,OAAOC,EAAAA;AAAAA,QACP,UAAUC,EAAAA;AAAAA,QACV,WAAWC,EAAAA;AAAAA,QACX,kBAAgBC,EAAAA;AAAAA,QAChB,cAAYC,EAAAA;AAAAA,QACZ,iBAAeN,EAAArB,CAAA;AAAA,QACf,mBAAiB4B,EAAAA;AAAAA,QACjB,YAAUP,EAAAlB,CAAA,EAAK;AAAA,QACf,cAAYkB,EAAAlB,CAAA,EAAK;AAAA,MAAA;QAiCP,qBACT,MAAuD;AAAA,UAA3CyB,EAAAA,kBAAZZ,EAAA,GAAAC,EAAuD,aAAxBW,EAAAA,cAAc,GAAA,CAAA;;mBAhC/C,MA6BM;AAAA,UA7BNC,EA6BM,OA7BNC,GA6BM;AAAA,YA5BJC,EAAAF,EAmBE,YAnBFG,EAmBE;AAAA,cAlBC,IAAIX,EAAAxB,CAAA;AAAA,uBACD;AAAA,cAAJ,KAAIF;AAAA,mEACKI,EAAK,QAAAkC,IAAA;AAAA,cACb,MAAMX,EAAAA;AAAAA,cACN,UAAUE,EAAAA;AAAAA,cACV,aAAaU,EAAAA;AAAAA,cACb,OAAK;AAAA,gBAAgB3B,EAAA;AAAA,gBAA6B4B,EAAAA;AAAAA,cAAAA;AAAAA,cAIlD,OAAOC,EAAAA;AAAAA,cACP,YAAYC,EAAAA;AAAAA,cACZ,MAAMC,EAAAA;AAAAA,cACN,WAAWC,EAAAA;AAAAA,YAAAA,GACJC,EAAAA,QAAM;AAAA,cACb,QAAA3B;AAAA,cACA,SAAAC;AAAA,cACA,SAAAJ;AAAA,YAAA;kBAfQW,EAAAtB,CAAA,CAAK;AAAA,YAAA;YAoBRwC,EAAAA,cAAc,eADtBtB,EAKM,OALNwB,GAKMC,EADDrB,EAAAtB,CAAA,GAAO,UAAM,CAAA,IAAQ,MAAC2C,EAAGH,EAAAA,SAAS,GAAA,CAAA;;;;;;;;"}
|