@septkit/ui 0.0.1

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/README.md ADDED
@@ -0,0 +1,10 @@
1
+ # SET ui library
2
+
3
+ ## Package name
4
+
5
+ > [!IMPORTANT]
6
+ > If you rename this package from `@septkit/ui`, you must update CSS imports in all consuming packages.
7
+ >
8
+ > Currently, packages using this library need the following directive in their CSS files (path depends on its own context to get to node_modules): `@source "../../../node_modules/@septkit/ui";`
9
+ >
10
+ > This directive points to the relative path from the consuming package to this UI package in the node_modules directory. The @source directive is essential for externalizing Tailwind CSS and DaisyUI dependencies, allowing all projects to share the same Tailwind configuration.
@@ -0,0 +1,67 @@
1
+ import { defineComponent as l, computed as e, createElementBlock as d, openBlock as c, normalizeClass as b, renderSlot as u } from "vue";
2
+ const p = /* @__PURE__ */ l({
3
+ __name: "button",
4
+ props: {
5
+ color: {},
6
+ variant: {},
7
+ size: {},
8
+ active: { type: Boolean },
9
+ disabled: { type: Boolean },
10
+ modifier: {}
11
+ },
12
+ setup(o) {
13
+ const n = o, i = e(
14
+ () => ({
15
+ neutral: "btn-neutral",
16
+ primary: "btn-primary",
17
+ secondary: "btn-secondary",
18
+ accent: "btn-accent",
19
+ info: "btn-info",
20
+ success: "btn-success",
21
+ warning: "btn-warning",
22
+ error: "btn-error",
23
+ undefined: ""
24
+ })[n.color ?? "undefined"]
25
+ ), s = e(
26
+ () => ({
27
+ outline: "btn-outline",
28
+ dash: "btn-dash",
29
+ soft: "btn-soft",
30
+ ghost: "btn-ghost",
31
+ link: "btn-link",
32
+ undefined: ""
33
+ })[n.variant ?? "undefined"]
34
+ ), a = e(
35
+ () => ({
36
+ xs: "btn-xs",
37
+ sm: "btn-sm",
38
+ md: "btn-md",
39
+ lg: "btn-lg",
40
+ xl: "btn-xl",
41
+ undefined: ""
42
+ })[n.size ?? "undefined"]
43
+ ), r = e(
44
+ () => ({
45
+ wide: "btn-wide",
46
+ block: "btn-block",
47
+ square: "btn-square",
48
+ circle: "btn-circle",
49
+ undefined: ""
50
+ })[n.modifier ?? "undefined"]
51
+ );
52
+ return (t, f) => (c(), d("button", {
53
+ class: b(["btn", [
54
+ i.value,
55
+ s.value,
56
+ a.value,
57
+ r.value,
58
+ { "btn-active": t.active, "btn-disabled": t.disabled }
59
+ ]])
60
+ }, [
61
+ u(t.$slots, "default")
62
+ ], 2));
63
+ }
64
+ });
65
+ export {
66
+ p as default
67
+ };
@@ -0,0 +1,4 @@
1
+ import f from "./button.vue.js";
2
+ export {
3
+ f as default
4
+ };
@@ -0,0 +1,38 @@
1
+ @plugin "daisyui" {
2
+ themes: spark --default;
3
+ }
4
+
5
+ @plugin "daisyui/theme" {
6
+ name: 'spark';
7
+ default: true;
8
+ prefersdark: false;
9
+ color-scheme: 'light';
10
+ --color-base-100: oklch(98% 0 0);
11
+ --color-base-200: oklch(97% 0 0);
12
+ --color-base-300: oklch(92% 0 0);
13
+ --color-base-content: oklch(37% 0 0);
14
+ --color-primary: oklch(70% 0.213 47.604);
15
+ --color-primary-content: oklch(97% 0.013 17.38);
16
+ --color-secondary: oklch(95% 0.038 75.164);
17
+ --color-secondary-content: oklch(66% 0.179 58.318);
18
+ --color-accent: oklch(60% 0.118 184.704);
19
+ --color-accent-content: oklch(98% 0.001 106.423);
20
+ --color-neutral: oklch(55% 0.013 58.071);
21
+ --color-neutral-content: oklch(98% 0.031 120.757);
22
+ --color-info: oklch(70% 0.165 254.624);
23
+ --color-info-content: oklch(98% 0.001 106.423);
24
+ --color-success: oklch(72% 0.219 149.579);
25
+ --color-success-content: oklch(98% 0.001 106.423);
26
+ --color-warning: oklch(87% 0.169 91.605);
27
+ --color-warning-content: oklch(98% 0.001 106.423);
28
+ --color-error: oklch(63% 0.237 25.331);
29
+ --color-error-content: oklch(98% 0.001 106.423);
30
+ --radius-selector: 0.25rem;
31
+ --radius-field: 0.25rem;
32
+ --radius-box: 0.25rem;
33
+ --size-selector: 0.21875rem;
34
+ --size-field: 0.21875rem;
35
+ --border: 1.5px;
36
+ --depth: 1;
37
+ --noise: 1;
38
+ }
@@ -0,0 +1,102 @@
1
+ import { defineComponent as w, useTemplateRef as g, ref as y, computed as o, createElementBlock as a, openBlock as d, createElementVNode as k, withDirectives as h, normalizeClass as z, withModifiers as C, renderSlot as l, unref as O } from "vue";
2
+ import { VOnClickOutside as S } from "../external/.pnpm/@vueuse_components@13.5.0_vue@3.5.17_typescript@5.8.3_/node_modules/@vueuse/components/index.js";
3
+ const B = ["open"], _ = {
4
+ "data-testid": "dropdown-menu",
5
+ class: "menu dropdown-content bg-base-100 z-1 w-52 p-2 shadow-sm"
6
+ }, D = /* @__PURE__ */ w({
7
+ __name: "dropdown",
8
+ props: {
9
+ color: {},
10
+ variant: {},
11
+ size: {},
12
+ active: { type: Boolean },
13
+ disabled: { type: Boolean },
14
+ modifier: {}
15
+ },
16
+ setup(r, { expose: c }) {
17
+ const n = r, s = g("details-ref"), e = y(!1), u = o(
18
+ () => ({
19
+ neutral: "btn-neutral",
20
+ primary: "btn-primary",
21
+ secondary: "btn-secondary",
22
+ accent: "btn-accent",
23
+ info: "btn-info",
24
+ success: "btn-success",
25
+ warning: "btn-warning",
26
+ error: "btn-error",
27
+ undefined: ""
28
+ })[n.color ?? "undefined"]
29
+ ), b = o(
30
+ () => ({
31
+ outline: "btn-outline",
32
+ dash: "btn-dash",
33
+ soft: "btn-soft",
34
+ ghost: "btn-ghost",
35
+ link: "btn-link",
36
+ undefined: ""
37
+ })[n.variant ?? "undefined"]
38
+ ), f = o(
39
+ () => ({
40
+ xs: "btn-xs",
41
+ sm: "btn-sm",
42
+ md: "btn-md",
43
+ lg: "btn-lg",
44
+ xl: "btn-xl",
45
+ undefined: ""
46
+ })[n.size ?? "undefined"]
47
+ ), p = o(
48
+ () => ({
49
+ wide: "btn-wide",
50
+ block: "btn-block",
51
+ square: "btn-square",
52
+ circle: "btn-circle",
53
+ undefined: ""
54
+ })[n.modifier ?? "undefined"]
55
+ );
56
+ function m() {
57
+ s.value && (s.value.open = e.value);
58
+ }
59
+ function v() {
60
+ e.value = !1;
61
+ }
62
+ return c({
63
+ /** Method to close the dropdown */
64
+ close: v,
65
+ /** Reactive boolean of the dropdown state */
66
+ isOpen: e
67
+ }), (t, i) => (d(), a("details", {
68
+ "data-testid": "dropdown-wrapper",
69
+ ref: "details-ref",
70
+ class: "dropdown",
71
+ open: e.value,
72
+ onToggle: m
73
+ }, [
74
+ k("summary", {
75
+ "data-testid": "dropdown-trigger",
76
+ onClick: i[0] || (i[0] = C((x) => e.value = !e.value, ["stop"])),
77
+ class: z(["btn", [
78
+ u.value,
79
+ b.value,
80
+ f.value,
81
+ p.value,
82
+ { "btn-active": t.active, "btn-disabled": t.disabled }
83
+ ]])
84
+ }, [
85
+ l(t.$slots, "label")
86
+ ], 2),
87
+ h((d(), a("ul", _, [
88
+ l(t.$slots, "items")
89
+ ])), [
90
+ [
91
+ O(S),
92
+ () => e.value = !1,
93
+ void 0,
94
+ { bubble: !0 }
95
+ ]
96
+ ])
97
+ ], 40, B));
98
+ }
99
+ });
100
+ export {
101
+ D as default
102
+ };
@@ -0,0 +1,4 @@
1
+ import f from "./dropdown.vue.js";
2
+ export {
3
+ f as default
4
+ };
@@ -0,0 +1,197 @@
1
+ import { computed as T, toValue as a, unref as j, shallowRef as I, watch as R } from "vue";
2
+ import { noop as m, isIOS as S, isClient as B, toArray as L, watchImmediate as F, tryOnScopeDispose as $, isObject as H, toRef as V } from "../../../../@vueuse_shared@13.5.0_vue@3.5.17_typescript@5.8.3_/node_modules/@vueuse/shared/index.js";
3
+ const N = B ? window : void 0;
4
+ function y(e) {
5
+ var t;
6
+ const l = a(e);
7
+ return (t = l?.$el) != null ? t : l;
8
+ }
9
+ function k(...e) {
10
+ const t = [], l = () => {
11
+ t.forEach((n) => n()), t.length = 0;
12
+ }, u = (n, r, i, p) => (n.addEventListener(r, i, p), () => n.removeEventListener(r, i, p)), c = T(() => {
13
+ const n = L(a(e[0])).filter((r) => r != null);
14
+ return n.every((r) => typeof r != "string") ? n : void 0;
15
+ }), d = F(
16
+ () => {
17
+ var n, r;
18
+ return [
19
+ (r = (n = c.value) == null ? void 0 : n.map((i) => y(i))) != null ? r : [N].filter((i) => i != null),
20
+ L(a(c.value ? e[1] : e[0])),
21
+ L(j(c.value ? e[2] : e[1])),
22
+ // @ts-expect-error - TypeScript gets the correct types, but somehow still complains
23
+ a(c.value ? e[3] : e[2])
24
+ ];
25
+ },
26
+ ([n, r, i, p]) => {
27
+ if (l(), !n?.length || !r?.length || !i?.length)
28
+ return;
29
+ const E = H(p) ? { ...p } : p;
30
+ t.push(
31
+ ...n.flatMap(
32
+ (w) => r.flatMap(
33
+ (h) => i.map((g) => u(w, h, g, E))
34
+ )
35
+ )
36
+ );
37
+ },
38
+ { flush: "post" }
39
+ ), v = () => {
40
+ d(), l();
41
+ };
42
+ return $(l), v;
43
+ }
44
+ let D = !1;
45
+ function P(e, t, l = {}) {
46
+ const { window: u = N, ignore: c = [], capture: d = !0, detectIframe: v = !1, controls: n = !1 } = l;
47
+ if (!u)
48
+ return n ? { stop: m, cancel: m, trigger: m } : m;
49
+ if (S && !D) {
50
+ D = !0;
51
+ const o = { passive: !0 };
52
+ Array.from(u.document.body.children).forEach((s) => s.addEventListener("click", m, o)), u.document.documentElement.addEventListener("click", m, o);
53
+ }
54
+ let r = !0;
55
+ const i = (o) => a(c).some((s) => {
56
+ if (typeof s == "string")
57
+ return Array.from(u.document.querySelectorAll(s)).some((f) => f === o.target || o.composedPath().includes(f));
58
+ {
59
+ const f = y(s);
60
+ return f && (o.target === f || o.composedPath().includes(f));
61
+ }
62
+ });
63
+ function p(o) {
64
+ const s = a(o);
65
+ return s && s.$.subTree.shapeFlag === 16;
66
+ }
67
+ function E(o, s) {
68
+ const f = a(o), O = f.$.subTree && f.$.subTree.children;
69
+ return O == null || !Array.isArray(O) ? !1 : O.some((A) => A.el === s.target || s.composedPath().includes(A.el));
70
+ }
71
+ const w = (o) => {
72
+ const s = y(e);
73
+ if (o.target != null && !(!(s instanceof Element) && p(e) && E(e, o)) && !(!s || s === o.target || o.composedPath().includes(s))) {
74
+ if ("detail" in o && o.detail === 0 && (r = !i(o)), !r) {
75
+ r = !0;
76
+ return;
77
+ }
78
+ t(o);
79
+ }
80
+ };
81
+ let h = !1;
82
+ const g = [
83
+ k(u, "click", (o) => {
84
+ h || (h = !0, setTimeout(() => {
85
+ h = !1;
86
+ }, 0), w(o));
87
+ }, { passive: !0, capture: d }),
88
+ k(u, "pointerdown", (o) => {
89
+ const s = y(e);
90
+ r = !i(o) && !!(s && !o.composedPath().includes(s));
91
+ }, { passive: !0 }),
92
+ v && k(u, "blur", (o) => {
93
+ setTimeout(() => {
94
+ var s;
95
+ const f = y(e);
96
+ ((s = u.document.activeElement) == null ? void 0 : s.tagName) === "IFRAME" && !f?.contains(u.document.activeElement) && t(o);
97
+ }, 0);
98
+ }, { passive: !0 })
99
+ ].filter(Boolean), b = () => g.forEach((o) => o());
100
+ return n ? {
101
+ stop: b,
102
+ cancel: () => {
103
+ r = !1;
104
+ },
105
+ trigger: (o) => {
106
+ r = !0, w(o), r = !1;
107
+ }
108
+ } : b;
109
+ }
110
+ const M = /* @__PURE__ */ new WeakMap(), J = {
111
+ mounted(e, t) {
112
+ const l = !t.modifiers.bubble;
113
+ let u;
114
+ if (typeof t.value == "function")
115
+ u = P(e, t.value, { capture: l });
116
+ else {
117
+ const [c, d] = t.value;
118
+ u = P(e, c, Object.assign({ capture: l }, d));
119
+ }
120
+ M.set(e, u);
121
+ },
122
+ unmounted(e) {
123
+ const t = M.get(e);
124
+ t && typeof t == "function" ? t() : t?.stop(), M.delete(e);
125
+ }
126
+ };
127
+ function W(e) {
128
+ return typeof Window < "u" && e instanceof Window ? e.document.documentElement : typeof Document < "u" && e instanceof Document ? e.documentElement : e;
129
+ }
130
+ function Y(e) {
131
+ const t = window.getComputedStyle(e);
132
+ if (t.overflowX === "scroll" || t.overflowY === "scroll" || t.overflowX === "auto" && e.clientWidth < e.scrollWidth || t.overflowY === "auto" && e.clientHeight < e.scrollHeight)
133
+ return !0;
134
+ {
135
+ const l = e.parentNode;
136
+ return !l || l.tagName === "BODY" ? !1 : Y(l);
137
+ }
138
+ }
139
+ function X(e) {
140
+ const t = e || window.event, l = t.target;
141
+ return Y(l) ? !1 : t.touches.length > 1 ? !0 : (t.preventDefault && t.preventDefault(), !1);
142
+ }
143
+ const C = /* @__PURE__ */ new WeakMap();
144
+ function q(e, t = !1) {
145
+ const l = I(t);
146
+ let u = null, c = "";
147
+ R(V(e), (n) => {
148
+ const r = W(a(n));
149
+ if (r) {
150
+ const i = r;
151
+ if (C.get(i) || C.set(i, i.style.overflow), i.style.overflow !== "hidden" && (c = i.style.overflow), i.style.overflow === "hidden")
152
+ return l.value = !0;
153
+ if (l.value)
154
+ return i.style.overflow = "hidden";
155
+ }
156
+ }, {
157
+ immediate: !0
158
+ });
159
+ const d = () => {
160
+ const n = W(a(e));
161
+ !n || l.value || (S && (u = k(
162
+ n,
163
+ "touchmove",
164
+ (r) => {
165
+ X(r);
166
+ },
167
+ { passive: !1 }
168
+ )), n.style.overflow = "hidden", l.value = !0);
169
+ }, v = () => {
170
+ const n = W(a(e));
171
+ !n || !l.value || (S && u?.(), n.style.overflow = c, C.delete(n), l.value = !1);
172
+ };
173
+ return $(v), T({
174
+ get() {
175
+ return l.value;
176
+ },
177
+ set(n) {
178
+ n ? d() : v();
179
+ }
180
+ });
181
+ }
182
+ function x() {
183
+ let e = !1;
184
+ const t = I(!1);
185
+ return (l, u) => {
186
+ if (t.value = u.value, e)
187
+ return;
188
+ e = !0;
189
+ const c = q(l, u.value);
190
+ R(t, (d) => c.value = d);
191
+ };
192
+ }
193
+ x();
194
+ export {
195
+ J as VOnClickOutside,
196
+ J as vOnClickOutside
197
+ };
@@ -0,0 +1,41 @@
1
+ import { watch as e, getCurrentScope as i, onScopeDispose as r, toRef as c, readonly as u, ref as d, customRef as s } from "vue";
2
+ function g(o) {
3
+ return i() ? (r(o), !0) : !1;
4
+ }
5
+ const a = typeof window < "u" && typeof document < "u";
6
+ typeof WorkerGlobalScope < "u" && globalThis instanceof WorkerGlobalScope;
7
+ const f = Object.prototype.toString, y = (o) => f.call(o) === "[object Object]", l = () => {
8
+ }, m = /* @__PURE__ */ w();
9
+ function w() {
10
+ var o, t;
11
+ return a && ((o = window?.navigator) == null ? void 0 : o.userAgent) && (/iP(?:ad|hone|od)/.test(window.navigator.userAgent) || ((t = window?.navigator) == null ? void 0 : t.maxTouchPoints) > 2 && /iPad|Macintosh/.test(window?.navigator.userAgent));
12
+ }
13
+ function S(...o) {
14
+ if (o.length !== 1)
15
+ return c(...o);
16
+ const t = o[0];
17
+ return typeof t == "function" ? u(s(() => ({ get: t, set: l }))) : d(t);
18
+ }
19
+ function b(o) {
20
+ return Array.isArray(o) ? o : [o];
21
+ }
22
+ function v(o, t, n) {
23
+ return e(
24
+ o,
25
+ t,
26
+ {
27
+ ...n,
28
+ immediate: !0
29
+ }
30
+ );
31
+ }
32
+ export {
33
+ a as isClient,
34
+ m as isIOS,
35
+ y as isObject,
36
+ l as noop,
37
+ b as toArray,
38
+ S as toRef,
39
+ g as tryOnScopeDispose,
40
+ v as watchImmediate
41
+ };
@@ -0,0 +1,85 @@
1
+ import { ComponentOptionsMixin } from 'vue';
2
+ import { ComponentProvideOptions } from 'vue';
3
+ import { DefineComponent } from 'vue';
4
+ import { PublicProps } from 'vue';
5
+ import { Ref } from 'vue';
6
+
7
+ declare const __VLS_component: DefineComponent<__VLS_Props, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLButtonElement>;
8
+
9
+ declare const __VLS_component_2: DefineComponent<__VLS_Props_2, {
10
+ /** Method to close the dropdown */
11
+ close: typeof closeDropdown;
12
+ /** Reactive boolean of the dropdown state */
13
+ isOpen: Ref<boolean, boolean>;
14
+ }, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<__VLS_Props_2> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
15
+ 'details-ref': HTMLDetailsElement;
16
+ }, HTMLDetailsElement>;
17
+
18
+ declare type __VLS_Props = {
19
+ color?: 'neutral' | 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error';
20
+ variant?: 'outline' | 'dash' | 'soft' | 'ghost' | 'link';
21
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
22
+ active?: boolean;
23
+ disabled?: boolean;
24
+ modifier?: 'wide' | 'block' | 'square' | 'circle';
25
+ };
26
+
27
+ declare type __VLS_Props_2 = {
28
+ /** Trigger color */
29
+ color?: 'neutral' | 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error';
30
+ /** Trigger variant */
31
+ variant?: 'outline' | 'dash' | 'soft' | 'ghost' | 'link';
32
+ /** Trigger size */
33
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
34
+ /** Is the trigger active */
35
+ active?: boolean;
36
+ /** Is the trigger disabled */
37
+ disabled?: boolean;
38
+ /** Trigger modifier */
39
+ modifier?: 'wide' | 'block' | 'square' | 'circle';
40
+ };
41
+
42
+ declare function __VLS_template(): {
43
+ attrs: Partial<{}>;
44
+ slots: {
45
+ default?(_: {}): any;
46
+ };
47
+ refs: {};
48
+ rootEl: HTMLButtonElement;
49
+ };
50
+
51
+ declare function __VLS_template_2(): {
52
+ attrs: Partial<{}>;
53
+ slots: {
54
+ label?(_: {}): any;
55
+ items?(_: {}): any;
56
+ };
57
+ refs: {
58
+ 'details-ref': HTMLDetailsElement;
59
+ };
60
+ rootEl: HTMLDetailsElement;
61
+ };
62
+
63
+ declare type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
64
+
65
+ declare type __VLS_TemplateResult_2 = ReturnType<typeof __VLS_template_2>;
66
+
67
+ declare type __VLS_WithTemplateSlots<T, S> = T & {
68
+ new (): {
69
+ $slots: S;
70
+ };
71
+ };
72
+
73
+ declare type __VLS_WithTemplateSlots_2<T, S> = T & {
74
+ new (): {
75
+ $slots: S;
76
+ };
77
+ };
78
+
79
+ export declare const Button: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
80
+
81
+ declare function closeDropdown(): void;
82
+
83
+ export declare const Dropdown: __VLS_WithTemplateSlots_2<typeof __VLS_component_2, __VLS_TemplateResult_2["slots"]>;
84
+
85
+ export { }
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ import { default as r } from "./button/button.vue.js";
2
+ import { default as e } from "./dropdown/dropdown.vue.js";
3
+ export {
4
+ r as Button,
5
+ e as Dropdown
6
+ };
package/package.json ADDED
@@ -0,0 +1,76 @@
1
+ {
2
+ "name": "@septkit/ui",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "source": "lib/index.ts",
6
+ "scripts": {
7
+ "dev": "storybook dev -p 6006",
8
+ "//====== BUILD ======//": "",
9
+ "build": "run-p type-check \"build-only {@}\" -- && pnpm run copy-tailwind-config",
10
+ "preview": "vite preview",
11
+ "build-only": "vite build",
12
+ "copy-tailwind-config": "cp ./lib/assets/config.css ./dist/config.css",
13
+ "build-storybook": "storybook build",
14
+ "//====== TEST ======//": "",
15
+ "test": "echo TODO",
16
+ "test:unit": "vitest",
17
+ "test:browser": "vitest --config=vitest.browser.config.ts",
18
+ "//====== CHECK ======//": "",
19
+ "type-check": "vue-tsc --build",
20
+ "lint": "oxlint . --fix -D correctness --ignore-path .gitignore",
21
+ "format": "prettier --write lib/",
22
+ "format:check": "prettier --check lib/"
23
+ },
24
+ "files": [
25
+ "dist"
26
+ ],
27
+ "exports": {
28
+ ".": {
29
+ "types": "./dist/index.d.ts",
30
+ "default": "./dist/index.js"
31
+ },
32
+ "./configcss": "./dist/config.css"
33
+ },
34
+ "dependencies": {
35
+ "@tailwindcss/vite": "^4.1.11",
36
+ "@vueuse/components": "^13.5.0",
37
+ "@vueuse/core": "^13.5.0",
38
+ "pinia": "^3.0.3",
39
+ "tailwindcss": "^4.1.11",
40
+ "vue": "^3.5.17"
41
+ },
42
+ "devDependencies": {
43
+ "@storybook/addon-a11y": "^9.0.15",
44
+ "@storybook/addon-docs": "^9.0.15",
45
+ "@storybook/addon-onboarding": "^9.0.15",
46
+ "@storybook/addon-vitest": "^9.0.15",
47
+ "@storybook/vue3-vite": "^9.0.15",
48
+ "@tsconfig/node22": "^22.0.2",
49
+ "@types/jsdom": "^21.1.7",
50
+ "@types/node": "^22.15.32",
51
+ "@vitejs/plugin-vue": "^6.0.0",
52
+ "@vitest/browser": "^3.2.4",
53
+ "@vitest/coverage-v8": "3.2.4",
54
+ "@vue/test-utils": "^2.4.6",
55
+ "@vue/tsconfig": "^0.7.0",
56
+ "daisyui": "^5.0.46",
57
+ "jiti": "^2.4.2",
58
+ "jsdom": "^26.1.0",
59
+ "npm-run-all2": "^8.0.4",
60
+ "oxlint": "~1.6.0",
61
+ "playwright": "^1.53.2",
62
+ "prettier": "3.5.3",
63
+ "storybook": "^9.0.15",
64
+ "typescript": "~5.8.0",
65
+ "vite": "^7.0.0",
66
+ "vite-plugin-dts": "^4.5.4",
67
+ "vite-plugin-vue-devtools": "^7.7.7",
68
+ "vitest": "^3.2.4",
69
+ "vitest-browser-vue": "^1.0.0",
70
+ "vue-tsc": "^2.2.10"
71
+ },
72
+ "peerDependencies": {
73
+ "daisyui": "^5.0.0",
74
+ "tailwindcss": "^4.0.0"
75
+ }
76
+ }