scrubbed-tailwind-components-v2 2.0.2
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,51 @@
|
|
|
1
|
+
# scrubbed-tailwind-components-v2
|
|
2
|
+
|
|
3
|
+
This template should help get you started developing with Vue 3 in Vite.
|
|
4
|
+
|
|
5
|
+
## Recommended IDE Setup
|
|
6
|
+
|
|
7
|
+
[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur).
|
|
8
|
+
|
|
9
|
+
## Customize configuration
|
|
10
|
+
|
|
11
|
+
See [Vite Configuration Reference](https://vite.dev/config/).
|
|
12
|
+
|
|
13
|
+
## Project Setup
|
|
14
|
+
|
|
15
|
+
```sh
|
|
16
|
+
npm install
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### Compile and Hot-Reload for Development
|
|
20
|
+
|
|
21
|
+
```sh
|
|
22
|
+
npm run dev
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Compile and Minify for Production
|
|
26
|
+
|
|
27
|
+
```sh
|
|
28
|
+
npm run build
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Run Headed Component Tests with [Cypress Component Testing](https://on.cypress.io/component)
|
|
32
|
+
|
|
33
|
+
```sh
|
|
34
|
+
npm run test:unit:dev # or `npm run test:unit` for headless testing
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Run End-to-End Tests with [Cypress](https://www.cypress.io/)
|
|
38
|
+
|
|
39
|
+
```sh
|
|
40
|
+
npm run test:e2e:dev
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
This runs the end-to-end tests against the Vite development server.
|
|
44
|
+
It is much faster than the production build.
|
|
45
|
+
|
|
46
|
+
But it's still recommended to test the production build with `test:e2e` before deploying (e.g. in CI environments):
|
|
47
|
+
|
|
48
|
+
```sh
|
|
49
|
+
npm run build
|
|
50
|
+
npm run test:e2e
|
|
51
|
+
```
|
package/dist/favicon.ico
ADDED
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@starting-style{.backdrop[data-v-aaece1c7]{opacity:0}}
|
|
@@ -0,0 +1,604 @@
|
|
|
1
|
+
import { inject as m, createElementBlock as l, openBlock as a, normalizeClass as h, unref as u, createElementVNode as d, renderSlot as i, createBlock as $, withCtx as g, ref as f, provide as w, createVNode as B, Fragment as y, Teleport as R, normalizeStyle as M, watch as N, createCommentVNode as k, resolveComponent as j, mergeProps as v, useModel as V, withDirectives as A, vModelCheckbox as G, onMounted as z, onUnmounted as E, vModelText as D, vModelRadio as W, renderList as T, toDisplayString as C, createTextVNode as H, computed as q } from "vue";
|
|
2
|
+
import { RouterLink as S, useRoute as L } from "vue-router";
|
|
3
|
+
const O = { class: "flex w-full items-center justify-between" }, U = { class: "flex items-center gap-2" }, Z = { class: "flex items-center gap-10" }, J = { class: "hidden gap-6 sm:flex" }, Y = {
|
|
4
|
+
__name: "AppHeader",
|
|
5
|
+
setup(e) {
|
|
6
|
+
const o = m("APP_DATA"), { isSidebarToggled: r, toggleSidebar: n } = o;
|
|
7
|
+
return (t, s) => (a(), l("header", {
|
|
8
|
+
class: h(["fixed flex h-16 w-dvw items-center bg-white/50 px-3 backdrop-blur sm:px-6", { "rounded-t-2xl": u(r) }])
|
|
9
|
+
}, [
|
|
10
|
+
d("nav", O, [
|
|
11
|
+
d("div", U, [
|
|
12
|
+
d("button", {
|
|
13
|
+
onClick: s[0] || (s[0] = (c) => u(n)()),
|
|
14
|
+
class: "block cursor-pointer rounded-full p-2 hover:bg-neutral-100 sm:hidden"
|
|
15
|
+
}, s[1] || (s[1] = [
|
|
16
|
+
d("svg", {
|
|
17
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
18
|
+
width: "24",
|
|
19
|
+
height: "24",
|
|
20
|
+
viewBox: "0 0 24 24",
|
|
21
|
+
fill: "none",
|
|
22
|
+
stroke: "currentColor",
|
|
23
|
+
"stroke-width": "2",
|
|
24
|
+
"stroke-linecap": "round",
|
|
25
|
+
"stroke-linejoin": "round",
|
|
26
|
+
class: "lucide lucide-menu-icon lucide-menu size-5 stroke-neutral-600"
|
|
27
|
+
}, [
|
|
28
|
+
d("path", { d: "M4 12h16" }),
|
|
29
|
+
d("path", { d: "M4 18h16" }),
|
|
30
|
+
d("path", { d: "M4 6h16" })
|
|
31
|
+
], -1)
|
|
32
|
+
])),
|
|
33
|
+
i(t.$slots, "header-img")
|
|
34
|
+
]),
|
|
35
|
+
d("div", Z, [
|
|
36
|
+
d("ul", J, [
|
|
37
|
+
i(t.$slots, "header-links")
|
|
38
|
+
]),
|
|
39
|
+
i(t.$slots, "header-actions")
|
|
40
|
+
])
|
|
41
|
+
])
|
|
42
|
+
], 2));
|
|
43
|
+
}
|
|
44
|
+
}, F = ["href"], X = {
|
|
45
|
+
__name: "AppHeaderLink",
|
|
46
|
+
props: {
|
|
47
|
+
to: { type: String, required: !0 }
|
|
48
|
+
},
|
|
49
|
+
setup(e) {
|
|
50
|
+
const o = e;
|
|
51
|
+
return (r, n) => (a(), l("li", null, [
|
|
52
|
+
o.to.startsWith("/") ? (a(), $(u(S), {
|
|
53
|
+
key: 0,
|
|
54
|
+
class: "hover:text-primary-950 [&.router-link-active]:text-primary-950 text-xs uppercase text-neutral-600 hover:transition-all [&.router-link-active]:font-semibold",
|
|
55
|
+
to: o.to
|
|
56
|
+
}, {
|
|
57
|
+
default: g(() => [
|
|
58
|
+
i(r.$slots, "default")
|
|
59
|
+
]),
|
|
60
|
+
_: 3
|
|
61
|
+
}, 8, ["to"])) : (a(), l("a", {
|
|
62
|
+
key: 1,
|
|
63
|
+
class: "hover:text-primary-950 text-xs uppercase text-neutral-600 hover:transition-all",
|
|
64
|
+
href: o.to
|
|
65
|
+
}, [
|
|
66
|
+
i(r.$slots, "default")
|
|
67
|
+
], 8, F))
|
|
68
|
+
]));
|
|
69
|
+
}
|
|
70
|
+
}, Q = { class: "relative" }, K = { class: "flex" }, ee = {
|
|
71
|
+
__name: "AppLayout",
|
|
72
|
+
setup(e) {
|
|
73
|
+
const o = f(!1);
|
|
74
|
+
function r() {
|
|
75
|
+
window.innerWidth <= 640 ? (o.value = !o.value, n()) : o.value && (o.value = !1, n());
|
|
76
|
+
}
|
|
77
|
+
function n() {
|
|
78
|
+
const t = document.querySelector("body");
|
|
79
|
+
t.classList.contains("bg-black") ? t.classList.remove("bg-black") : t.classList.add("bg-black");
|
|
80
|
+
}
|
|
81
|
+
return w("APP_DATA", { isSidebarToggled: o, toggleSidebar: r }), (t, s) => (a(), l("div", {
|
|
82
|
+
class: h(["bg-white transition-all duration-500 ease-[cubic-bezier(.32,.72,0,1)]", {
|
|
83
|
+
"scale-93 origin-[center_top] translate-y-4": o.value
|
|
84
|
+
}])
|
|
85
|
+
}, [
|
|
86
|
+
d("div", Q, [
|
|
87
|
+
i(t.$slots, "header"),
|
|
88
|
+
d("div", K, [
|
|
89
|
+
i(t.$slots, "content")
|
|
90
|
+
])
|
|
91
|
+
])
|
|
92
|
+
], 2));
|
|
93
|
+
}
|
|
94
|
+
}, te = {
|
|
95
|
+
__name: "AppMain",
|
|
96
|
+
setup(e) {
|
|
97
|
+
const o = m("APP_DATA"), { isSidebarToggled: r } = o;
|
|
98
|
+
return (n, t) => (a(), l("main", {
|
|
99
|
+
class: h([
|
|
100
|
+
"bg-background-main fixed z-[-1] h-svh w-full overflow-auto px-6 pb-9 pt-24 sm:top-16 sm:ml-[223px] sm:h-[calc(100dvh-4rem)] sm:w-[calc(100dvw-223px)] sm:pt-9",
|
|
101
|
+
u(r) ? "overflow-hidden rounded-t-xl sm:rounded-none" : "sm:rounded-tl-2xl"
|
|
102
|
+
])
|
|
103
|
+
}, [
|
|
104
|
+
i(n.$slots, "default")
|
|
105
|
+
], 2));
|
|
106
|
+
}
|
|
107
|
+
}, oe = { class: "group flex w-full overflow-x-auto border-b-[1px] border-neutral-200" }, re = {
|
|
108
|
+
__name: "AppNavTabs",
|
|
109
|
+
setup(e) {
|
|
110
|
+
const o = f(null);
|
|
111
|
+
function r(t, s, c) {
|
|
112
|
+
o.value.style = `left: ${t}px; top: calc(${s}px + 6px); opacity: 1; width: ${c}px`;
|
|
113
|
+
}
|
|
114
|
+
function n(t, s, c) {
|
|
115
|
+
o.value.style = `left: ${t}px; top: calc(${s}px + 6px); opacity: 0; width: ${c}px`;
|
|
116
|
+
}
|
|
117
|
+
return w("NAV_TABS", {
|
|
118
|
+
setSelectorAttributes: r,
|
|
119
|
+
resetSelectorOpacity: n
|
|
120
|
+
}), (t, s) => (a(), l("div", oe, [
|
|
121
|
+
i(t.$slots, "default"),
|
|
122
|
+
d("div", {
|
|
123
|
+
class: "bg-brand-primary-700 absolute left-0 z-[-1] h-[32px] w-10 rounded-lg opacity-0 transition-all ease-in-out",
|
|
124
|
+
ref_key: "selector",
|
|
125
|
+
ref: o
|
|
126
|
+
}, null, 512)
|
|
127
|
+
]));
|
|
128
|
+
}
|
|
129
|
+
}, ne = {
|
|
130
|
+
__name: "AppNavTab",
|
|
131
|
+
props: {
|
|
132
|
+
to: { type: String, required: !0 }
|
|
133
|
+
},
|
|
134
|
+
setup(e) {
|
|
135
|
+
const o = e, r = m("NAV_TABS"), { setSelectorAttributes: n, resetSelectorOpacity: t } = r, s = f(null);
|
|
136
|
+
return (c, p) => (a(), l("div", {
|
|
137
|
+
onMouseover: p[0] || (p[0] = (x) => u(n)(s.value.offsetLeft, s.value.offsetTop, s.value.clientWidth)),
|
|
138
|
+
onMouseleave: p[1] || (p[1] = (x) => u(t)(s.value.offsetLeft, s.value.offsetTop, s.value.clientWidth)),
|
|
139
|
+
class: "shrink-0",
|
|
140
|
+
ref_key: "el",
|
|
141
|
+
ref: s
|
|
142
|
+
}, [
|
|
143
|
+
B(u(S), {
|
|
144
|
+
class: "[&.router-link-exact-active]:text-primary-950 [&.router-link-exact-active]:border-brand-primary-700 flex h-12 shrink-0 items-center justify-between gap-2 border-b-2 border-transparent px-3 text-sm text-neutral-600 transition-all hover:font-medium hover:text-white [&.router-link-exact-active]:font-medium [&.router-link-exact-active]:hover:text-white",
|
|
145
|
+
to: o.to
|
|
146
|
+
}, {
|
|
147
|
+
default: g(() => [
|
|
148
|
+
i(c.$slots, "default")
|
|
149
|
+
]),
|
|
150
|
+
_: 3
|
|
151
|
+
}, 8, ["to"])
|
|
152
|
+
], 544));
|
|
153
|
+
}
|
|
154
|
+
}, _ = (e, o) => {
|
|
155
|
+
const r = e.__vccOpts || e;
|
|
156
|
+
for (const [n, t] of o)
|
|
157
|
+
r[n] = t;
|
|
158
|
+
return r;
|
|
159
|
+
}, se = { class: "fixed left-0 top-0 hidden w-[223px] space-y-4 bg-white px-4 py-8 sm:top-[64px] sm:block" }, ae = {
|
|
160
|
+
__name: "AppSidebar",
|
|
161
|
+
setup(e) {
|
|
162
|
+
const o = m("APP_DATA"), { isSidebarToggled: r, toggleSidebar: n } = o;
|
|
163
|
+
return (t, s) => (a(), l(y, null, [
|
|
164
|
+
d("aside", se, [
|
|
165
|
+
i(t.$slots, "default", {}, void 0, !0)
|
|
166
|
+
]),
|
|
167
|
+
(a(), $(R, { to: "body" }, [
|
|
168
|
+
d("div", {
|
|
169
|
+
class: "shadow-t-2xl fixed bottom-0 z-50 h-[60svh] w-full space-y-4 overflow-y-scroll rounded-t-2xl bg-white p-4 transition-all duration-500 ease-[cubic-bezier(.32,.72,0,1)] [&::-webkit-scrollbar]:hidden",
|
|
170
|
+
style: M(
|
|
171
|
+
u(r) ? "transform: translateZ(0)" : "transform: translate3d(0,60svh,0)"
|
|
172
|
+
)
|
|
173
|
+
}, [
|
|
174
|
+
i(t.$slots, "default", {}, void 0, !0)
|
|
175
|
+
], 4),
|
|
176
|
+
d("div", {
|
|
177
|
+
onClick: s[0] || (s[0] = (c) => u(n)()),
|
|
178
|
+
class: h([
|
|
179
|
+
"backdrop backdrop-blur-[0.50px] transition-all duration-300 [transition-behavior:allow-discrete]",
|
|
180
|
+
u(r) ? "fixed inset-0 z-40 block bg-black/80 opacity-100" : "hidden"
|
|
181
|
+
])
|
|
182
|
+
}, null, 2)
|
|
183
|
+
]))
|
|
184
|
+
], 64));
|
|
185
|
+
}
|
|
186
|
+
}, le = /* @__PURE__ */ _(ae, [["__scopeId", "data-v-aaece1c7"]]), ie = { class: "flex flex-col" }, de = {
|
|
187
|
+
__name: "AppSidebarItem",
|
|
188
|
+
setup(e) {
|
|
189
|
+
L();
|
|
190
|
+
const o = f(!1);
|
|
191
|
+
function r() {
|
|
192
|
+
o.value = !o.value;
|
|
193
|
+
}
|
|
194
|
+
return w("SIDEBAR_TOGGLE", { toggled: o, toggleSidebarItem: r }), (n, t) => (a(), l("div", ie, [
|
|
195
|
+
i(n.$slots, "default")
|
|
196
|
+
]));
|
|
197
|
+
}
|
|
198
|
+
}, ue = ["to"], ce = {
|
|
199
|
+
__name: "AppSidebarItemChild",
|
|
200
|
+
props: {
|
|
201
|
+
to: { type: String, required: !0 }
|
|
202
|
+
},
|
|
203
|
+
setup(e) {
|
|
204
|
+
const o = e;
|
|
205
|
+
return (r, n) => o.to.startsWith("/") ? (a(), $(u(S), {
|
|
206
|
+
key: 0,
|
|
207
|
+
class: "[&.router-link-exact-active]:text-primary-950 [&.router-link-exact-active]:bg-background-main text-primary-950 hover:bg-background-main block h-10 items-center gap-3 overflow-hidden text-ellipsis whitespace-nowrap rounded-lg px-3 text-xs leading-[40px] transition-all [&.router-link-exact-active]:font-medium",
|
|
208
|
+
to: o.to
|
|
209
|
+
}, {
|
|
210
|
+
default: g(() => [
|
|
211
|
+
i(r.$slots, "default")
|
|
212
|
+
]),
|
|
213
|
+
_: 3
|
|
214
|
+
}, 8, ["to"])) : (a(), l("a", {
|
|
215
|
+
key: 1,
|
|
216
|
+
class: "text-primary-950 hover:bg-background-main block h-10 items-center gap-3 overflow-hidden text-ellipsis whitespace-nowrap rounded-lg px-3 text-xs leading-[40px] transition-all",
|
|
217
|
+
to: o.to
|
|
218
|
+
}, [
|
|
219
|
+
i(r.$slots, "default")
|
|
220
|
+
], 8, ue));
|
|
221
|
+
}
|
|
222
|
+
}, pe = {
|
|
223
|
+
__name: "AppSidebarItemChildren",
|
|
224
|
+
setup(e) {
|
|
225
|
+
const o = m("SIDEBAR_TOGGLE"), { toggled: r } = o;
|
|
226
|
+
return (n, t) => (a(), l("div", {
|
|
227
|
+
class: h(["max-h-0 overflow-y-hidden rounded-b-lg opacity-0 transition-all", { "mt-2 max-h-max overflow-y-auto px-2 opacity-100": u(r) }])
|
|
228
|
+
}, [
|
|
229
|
+
i(n.$slots, "default")
|
|
230
|
+
], 2));
|
|
231
|
+
}
|
|
232
|
+
}, me = { class: "group/sidebar-item hover:bg-background-main has-[&.router-link-active]:bg-background-main peer flex h-10 items-center justify-between rounded-lg px-3 transition-all" }, fe = ["href"], be = {
|
|
233
|
+
__name: "AppSidebarItemParent",
|
|
234
|
+
props: {
|
|
235
|
+
to: { type: String, required: !0 },
|
|
236
|
+
name: { type: String },
|
|
237
|
+
hasChildren: { type: Boolean, default: !1 }
|
|
238
|
+
},
|
|
239
|
+
setup(e) {
|
|
240
|
+
const o = L(), r = e, n = m("SIDEBAR_TOGGLE"), t = m("APP_DATA"), { toggled: s, toggleSidebarItem: c } = n, { toggleSidebar: p } = t;
|
|
241
|
+
function x() {
|
|
242
|
+
o.matched.some(
|
|
243
|
+
(b) => r.name === b.name
|
|
244
|
+
) ? s.value = !0 : s.value = !1;
|
|
245
|
+
}
|
|
246
|
+
return N(o, () => x(), { immediate: !0 }), (I, b) => (a(), l("div", me, [
|
|
247
|
+
r.to.startsWith("/") ? (a(), $(u(S), {
|
|
248
|
+
key: 0,
|
|
249
|
+
onClick: b[0] || (b[0] = (P) => u(p)()),
|
|
250
|
+
class: "[&.router-link-active]:text-primary-950 [&.router-link-active]:text-primary-950 text-primary-950 peer flex h-full w-full items-center gap-3 text-xs [&.router-link-active]:font-medium",
|
|
251
|
+
to: r.to
|
|
252
|
+
}, {
|
|
253
|
+
default: g(() => [
|
|
254
|
+
i(I.$slots, "default")
|
|
255
|
+
]),
|
|
256
|
+
_: 3
|
|
257
|
+
}, 8, ["to"])) : (a(), l("a", {
|
|
258
|
+
key: 1,
|
|
259
|
+
class: "text-primary-950 peer flex h-full w-full items-center gap-3 text-xs",
|
|
260
|
+
href: r.to
|
|
261
|
+
}, [
|
|
262
|
+
i(I.$slots, "default")
|
|
263
|
+
], 8, fe)),
|
|
264
|
+
r.hasChildren ? (a(), l("button", {
|
|
265
|
+
key: 2,
|
|
266
|
+
onClick: b[1] || (b[1] = (P) => u(c)()),
|
|
267
|
+
class: "cursor-pointer rounded-full p-1 transition-all hover:bg-neutral-100",
|
|
268
|
+
type: "button"
|
|
269
|
+
}, [
|
|
270
|
+
(a(), l("svg", {
|
|
271
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
272
|
+
width: "16",
|
|
273
|
+
height: "16",
|
|
274
|
+
viewBox: "0 0 24 24",
|
|
275
|
+
fill: "none",
|
|
276
|
+
stroke: "currentColor",
|
|
277
|
+
"stroke-width": "2",
|
|
278
|
+
"stroke-linecap": "round",
|
|
279
|
+
"stroke-linejoin": "round",
|
|
280
|
+
class: h(["lucide lucide-chevron-down-icon lucide-chevron-down stroke-primary-950 transition-all duration-300", { "rotate-180": u(s) }])
|
|
281
|
+
}, b[2] || (b[2] = [
|
|
282
|
+
d("path", { d: "m6 9 6 6 6-6" }, null, -1)
|
|
283
|
+
]), 2))
|
|
284
|
+
])) : k("", !0)
|
|
285
|
+
]));
|
|
286
|
+
}
|
|
287
|
+
}, he = { class: "hover:bg-background-main has-[&.router-link-active]:active has-[&.router-link-active]:bg-primary-700 peer flex h-10 items-center justify-between rounded-lg px-3 transition-all" }, ve = {
|
|
288
|
+
__name: "AppSidebarToggle",
|
|
289
|
+
setup(e) {
|
|
290
|
+
const o = m("SIDEBAR_TOGGLE");
|
|
291
|
+
return (r, n) => {
|
|
292
|
+
const t = j("RouterLink");
|
|
293
|
+
return a(), l("div", he, [
|
|
294
|
+
B(t, {
|
|
295
|
+
class: "text-primary-950 peer flex h-full w-full items-center gap-3 text-xs [&.router-link-active]:font-medium [&.router-link-active]:text-white",
|
|
296
|
+
to: "/"
|
|
297
|
+
}, {
|
|
298
|
+
default: g(() => [
|
|
299
|
+
i(r.$slots, "default")
|
|
300
|
+
]),
|
|
301
|
+
_: 3
|
|
302
|
+
}),
|
|
303
|
+
d("button", {
|
|
304
|
+
onClick: n[0] || (n[0] = (s) => u(o).toggleSidebarItem()),
|
|
305
|
+
class: "cursor-pointer",
|
|
306
|
+
type: "button"
|
|
307
|
+
}, n[1] || (n[1] = [
|
|
308
|
+
d("svg", {
|
|
309
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
310
|
+
width: "16",
|
|
311
|
+
height: "16",
|
|
312
|
+
viewBox: "0 0 24 24",
|
|
313
|
+
fill: "none",
|
|
314
|
+
stroke: "currentColor",
|
|
315
|
+
"stroke-width": "2",
|
|
316
|
+
"stroke-linecap": "round",
|
|
317
|
+
"stroke-linejoin": "round",
|
|
318
|
+
class: "lucide lucide-chevron-down-icon lucide-chevron-down stroke-white"
|
|
319
|
+
}, [
|
|
320
|
+
d("path", { d: "m6 9 6 6 6-6" })
|
|
321
|
+
], -1)
|
|
322
|
+
]))
|
|
323
|
+
]);
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
}, ge = {}, _e = {
|
|
327
|
+
key: 0,
|
|
328
|
+
class: "text-primary-950 px-1 text-sm font-medium"
|
|
329
|
+
}, xe = { class: "mt-2" };
|
|
330
|
+
function ye(e, o) {
|
|
331
|
+
return a(), l("nav", null, [
|
|
332
|
+
e.$slots.title ? (a(), l("b", _e, [
|
|
333
|
+
i(e.$slots, "title")
|
|
334
|
+
])) : k("", !0),
|
|
335
|
+
d("div", xe, [
|
|
336
|
+
i(e.$slots, "items")
|
|
337
|
+
])
|
|
338
|
+
]);
|
|
339
|
+
}
|
|
340
|
+
const ke = /* @__PURE__ */ _(ge, [["render", ye]]), $e = {}, we = { class: "rounded-full px-3 py-1 text-xs font-medium" };
|
|
341
|
+
function Ae(e, o) {
|
|
342
|
+
return a(), l("div", we, [
|
|
343
|
+
i(e.$slots, "default")
|
|
344
|
+
]);
|
|
345
|
+
}
|
|
346
|
+
const Se = /* @__PURE__ */ _($e, [["render", Ae]]), Ie = {
|
|
347
|
+
__name: "Button",
|
|
348
|
+
props: {
|
|
349
|
+
variant: { type: String, default: "primary" }
|
|
350
|
+
},
|
|
351
|
+
setup(e) {
|
|
352
|
+
const o = e, r = {
|
|
353
|
+
primary: [
|
|
354
|
+
"bg-brand-primary-700",
|
|
355
|
+
"text-white",
|
|
356
|
+
"active:bg-primary-950 hover:bg-primary-800"
|
|
357
|
+
],
|
|
358
|
+
secondary: ["bg-neutral-100", "text-primary-900"],
|
|
359
|
+
outlined: [
|
|
360
|
+
"border-[1px]",
|
|
361
|
+
"border-neutral-200",
|
|
362
|
+
"text-primary-900",
|
|
363
|
+
"hover:bg-neutral-100"
|
|
364
|
+
],
|
|
365
|
+
ghost: ["font-medium", "text-primary-900", "hover:bg-neutral-100"],
|
|
366
|
+
destructive: [
|
|
367
|
+
"bg-danger-600",
|
|
368
|
+
"text-white",
|
|
369
|
+
"active:bg-danger-600-active",
|
|
370
|
+
"hover:bg-danger-600-hovered"
|
|
371
|
+
]
|
|
372
|
+
};
|
|
373
|
+
return (n, t) => (a(), l("button", v(n.$attrs, {
|
|
374
|
+
class: ["cursor-pointer rounded-lg px-4 py-2 text-xs transition-all disabled:cursor-not-allowed disabled:opacity-50", r[o.variant]]
|
|
375
|
+
}), [
|
|
376
|
+
i(n.$slots, "default")
|
|
377
|
+
], 16));
|
|
378
|
+
}
|
|
379
|
+
}, Te = {}, Ce = { class: "rounded-2xl bg-white p-6" };
|
|
380
|
+
function Be(e, o) {
|
|
381
|
+
return a(), l("div", Ce, [
|
|
382
|
+
i(e.$slots, "default")
|
|
383
|
+
]);
|
|
384
|
+
}
|
|
385
|
+
const Ve = /* @__PURE__ */ _(Te, [["render", Be]]), De = {
|
|
386
|
+
__name: "Checkbox",
|
|
387
|
+
props: {
|
|
388
|
+
modelValue: {},
|
|
389
|
+
modelModifiers: {}
|
|
390
|
+
},
|
|
391
|
+
emits: ["update:modelValue"],
|
|
392
|
+
setup(e) {
|
|
393
|
+
const o = V(e, "modelValue"), r = f(null);
|
|
394
|
+
return (n, t) => (a(), l("button", {
|
|
395
|
+
onClick: t[1] || (t[1] = (s) => r.value.click()),
|
|
396
|
+
class: "group/checkbox bg-neutral-100 has-checked:bg-primary-700 flex size-4 cursor-pointer items-center justify-center rounded-sm transition-all"
|
|
397
|
+
}, [
|
|
398
|
+
t[2] || (t[2] = d("svg", {
|
|
399
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
400
|
+
width: "14",
|
|
401
|
+
height: "14",
|
|
402
|
+
viewBox: "0 0 24 24",
|
|
403
|
+
fill: "none",
|
|
404
|
+
stroke: "currentColor",
|
|
405
|
+
"stroke-width": "2",
|
|
406
|
+
"stroke-linecap": "round",
|
|
407
|
+
"stroke-linejoin": "round",
|
|
408
|
+
class: "lucide lucide-check-icon lucide-check hidden stroke-white group-has-[:checked]/checkbox:block"
|
|
409
|
+
}, [
|
|
410
|
+
d("path", { d: "M20 6 9 17l-5-5" })
|
|
411
|
+
], -1)),
|
|
412
|
+
A(d("input", v(n.$attrs, {
|
|
413
|
+
"onUpdate:modelValue": t[0] || (t[0] = (s) => o.value = s),
|
|
414
|
+
type: "checkbox",
|
|
415
|
+
ref_key: "checkboxRef",
|
|
416
|
+
ref: r,
|
|
417
|
+
hidden: ""
|
|
418
|
+
}), null, 16), [
|
|
419
|
+
[G, o.value]
|
|
420
|
+
])
|
|
421
|
+
]));
|
|
422
|
+
}
|
|
423
|
+
}, Le = { class: "pointer-events-auto fixed inset-0 z-[100] min-h-screen bg-black/80 backdrop-blur-[2px]" }, Pe = {
|
|
424
|
+
__name: "DialogBackground",
|
|
425
|
+
setup(e) {
|
|
426
|
+
return z(() => {
|
|
427
|
+
document.querySelector("body").classList.add("overflow-hidden");
|
|
428
|
+
}), E(() => {
|
|
429
|
+
document.querySelector("body").classList.remove("overflow-hidden");
|
|
430
|
+
}), (o, r) => (a(), l("div", Le, [
|
|
431
|
+
i(o.$slots, "default")
|
|
432
|
+
]));
|
|
433
|
+
}
|
|
434
|
+
}, Re = {
|
|
435
|
+
__name: "Input",
|
|
436
|
+
props: ["modelValue"],
|
|
437
|
+
setup(e) {
|
|
438
|
+
const r = f(e.modelValue);
|
|
439
|
+
return (n, t) => A((a(), l("input", {
|
|
440
|
+
"onUpdate:modelValue": t[0] || (t[0] = (s) => r.value = s),
|
|
441
|
+
onInput: t[1] || (t[1] = (s) => n.$emit("update:modelValue", s.target.value)),
|
|
442
|
+
class: "text-primary-950 focus:ring-primary-700 neutral-400:text-neutral-400 rounded-lg border-[1px] border-neutral-200 bg-white px-3 py-2 text-xs outline-none transition-all focus:ring-2 focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"
|
|
443
|
+
}, null, 544)), [
|
|
444
|
+
[D, r.value]
|
|
445
|
+
]);
|
|
446
|
+
}
|
|
447
|
+
}, Me = {};
|
|
448
|
+
function Ne(e, o) {
|
|
449
|
+
return a(), l("label", v(e.$attrs, { class: "text-primary-950 text-xs transition-all" }), [
|
|
450
|
+
i(e.$slots, "default")
|
|
451
|
+
], 16);
|
|
452
|
+
}
|
|
453
|
+
const je = /* @__PURE__ */ _(Me, [["render", Ne]]), Ge = {
|
|
454
|
+
__name: "Radio",
|
|
455
|
+
props: {
|
|
456
|
+
modelValue: {},
|
|
457
|
+
modelModifiers: {}
|
|
458
|
+
},
|
|
459
|
+
emits: ["update:modelValue"],
|
|
460
|
+
setup(e) {
|
|
461
|
+
const o = V(e, "modelValue"), r = f(null);
|
|
462
|
+
return (n, t) => (a(), l("button", {
|
|
463
|
+
onClick: t[1] || (t[1] = (s) => r.value.click()),
|
|
464
|
+
class: "group/radio bg-neutral-100 has-checked:bg-white has-checked:border-primary-700 flex size-4 cursor-pointer items-center justify-center rounded-full border-[1px] border-transparent"
|
|
465
|
+
}, [
|
|
466
|
+
t[2] || (t[2] = d("div", { class: "group-has-checked/radio:bg-primary-700 group-has-checked/radio:opacity-100 size-[10px] rounded-full opacity-0 transition-all" }, null, -1)),
|
|
467
|
+
A(d("input", v(n.$attrs, {
|
|
468
|
+
"onUpdate:modelValue": t[0] || (t[0] = (s) => o.value = s),
|
|
469
|
+
type: "radio",
|
|
470
|
+
ref_key: "radioRef",
|
|
471
|
+
ref: r,
|
|
472
|
+
hidden: ""
|
|
473
|
+
}), null, 16), [
|
|
474
|
+
[W, o.value]
|
|
475
|
+
])
|
|
476
|
+
]));
|
|
477
|
+
}
|
|
478
|
+
}, ze = "bg-[url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiM1YjYxNmUiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0ibHVjaWRlIGx1Y2lkZS1jaGV2cm9uLWRvd24iPjxwYXRoIGQ9Im02IDkgNiA2IDYtNiIvPjwvc3ZnPg==')]", Ee = {
|
|
479
|
+
__name: "Select",
|
|
480
|
+
setup(e) {
|
|
481
|
+
return (o, r) => (a(), l("select", v(o.$attrs, {
|
|
482
|
+
onChange: r[0] || (r[0] = (n) => o.$emit("update:modelValue", n.target.value)),
|
|
483
|
+
class: ["border-neutral-200 text-primary-950 focus:ring-primary-700 appearance-none rounded-lg border-[1px] bg-white bg-[length:16px] bg-[right_12px_center] bg-no-repeat px-3 py-2 text-xs outline-none transition-all focus:ring-2 focus:ring-offset-2", ze]
|
|
484
|
+
}), [
|
|
485
|
+
i(o.$slots, "default")
|
|
486
|
+
], 16));
|
|
487
|
+
}
|
|
488
|
+
}, We = { class: "w-full" }, He = { class: "h-16" }, qe = { key: 0 }, Oe = {
|
|
489
|
+
key: 0,
|
|
490
|
+
class: "pe-4"
|
|
491
|
+
}, Ue = {
|
|
492
|
+
__name: "Table",
|
|
493
|
+
props: {
|
|
494
|
+
columns: { type: Array, required: !0 },
|
|
495
|
+
data: { type: Array, required: !0 }
|
|
496
|
+
},
|
|
497
|
+
setup(e) {
|
|
498
|
+
const o = e;
|
|
499
|
+
return (r, n) => (a(), l("table", We, [
|
|
500
|
+
d("thead", null, [
|
|
501
|
+
d("tr", He, [
|
|
502
|
+
(a(!0), l(y, null, T(o.columns, (t) => (a(), l("th", {
|
|
503
|
+
key: t.key,
|
|
504
|
+
class: "text-xs font-medium text-neutral-600 first-of-type:ps-4"
|
|
505
|
+
}, C(t.label), 1))), 128)),
|
|
506
|
+
r.$slots.actions ? (a(), l("th", qe)) : k("", !0)
|
|
507
|
+
])
|
|
508
|
+
]),
|
|
509
|
+
d("tbody", null, [
|
|
510
|
+
(a(!0), l(y, null, T(o.data, (t, s) => (a(), l("tr", {
|
|
511
|
+
key: s,
|
|
512
|
+
class: "odd:bg-background-main/50 hover:bg-background-main min-h-16 rounded-md transition-all"
|
|
513
|
+
}, [
|
|
514
|
+
(a(!0), l(y, null, T(o.columns, (c) => (a(), l("td", {
|
|
515
|
+
key: c.key,
|
|
516
|
+
class: "text-primary-950 py-4 text-xs first-of-type:rounded-s-md first-of-type:ps-4 last-of-type:rounded-e-md last-of-type:pe-4"
|
|
517
|
+
}, [
|
|
518
|
+
i(r.$slots, c.key, { row: t }, () => [
|
|
519
|
+
H(C(t[c.key]), 1)
|
|
520
|
+
])
|
|
521
|
+
]))), 128)),
|
|
522
|
+
r.$slots.actions ? (a(), l("td", Oe, [
|
|
523
|
+
i(r.$slots, "actions", { row: t })
|
|
524
|
+
])) : k("", !0)
|
|
525
|
+
]))), 128))
|
|
526
|
+
])
|
|
527
|
+
]));
|
|
528
|
+
}
|
|
529
|
+
}, Ze = { class: "bg-neutral-100/50 overflow-x-scroll rounded-xl p-1 [&::-webkit-scrollbar]:hidden" }, Je = {
|
|
530
|
+
__name: "Tabs",
|
|
531
|
+
props: {
|
|
532
|
+
default: { default: null }
|
|
533
|
+
},
|
|
534
|
+
setup(e) {
|
|
535
|
+
const r = f(e.default);
|
|
536
|
+
function n(t) {
|
|
537
|
+
r.value = t;
|
|
538
|
+
}
|
|
539
|
+
return w("TAB_DATA", { currentValue: r, setCurrentValue: n }), (t, s) => (a(), l("div", Ze, [
|
|
540
|
+
i(t.$slots, "default")
|
|
541
|
+
]));
|
|
542
|
+
}
|
|
543
|
+
}, Ye = {
|
|
544
|
+
__name: "TabItem",
|
|
545
|
+
props: {
|
|
546
|
+
value: { required: !0 }
|
|
547
|
+
},
|
|
548
|
+
setup(e) {
|
|
549
|
+
const o = e, r = m("TAB_DATA"), { currentValue: n, setCurrentValue: t } = r, s = q(() => n.value === o.value ? ["bg-white", "font-medium", "text-primary-700", "shadow-xl"] : "text-neutral-600");
|
|
550
|
+
return (c, p) => (a(), l("button", {
|
|
551
|
+
onClick: p[0] || (p[0] = (x) => u(t)(o.value)),
|
|
552
|
+
class: h(["h-8 cursor-pointer rounded-lg px-3 text-xs transition-all disabled:cursor-not-allowed disabled:opacity-50", s.value])
|
|
553
|
+
}, [
|
|
554
|
+
i(c.$slots, "default")
|
|
555
|
+
], 2));
|
|
556
|
+
}
|
|
557
|
+
}, Fe = {
|
|
558
|
+
__name: "TextArea",
|
|
559
|
+
props: ["modelValue"],
|
|
560
|
+
setup(e) {
|
|
561
|
+
const r = f(e.modelValue);
|
|
562
|
+
return (n, t) => A((a(), l("textarea", v({
|
|
563
|
+
onInput: t[0] || (t[0] = (s) => n.$emit("update:modelValue", s.target.value))
|
|
564
|
+
}, n.$attrs, {
|
|
565
|
+
"onUpdate:modelValue": t[1] || (t[1] = (s) => r.value = s),
|
|
566
|
+
class: "border-neutral-200 text-primary-950 neutral-400:text-neutral-400 focus:ring-primary-700 rounded-lg border-[1px] px-3 py-2 text-xs outline-none transition-all focus:ring-2 focus:ring-offset-2"
|
|
567
|
+
}), null, 16)), [
|
|
568
|
+
[D, r.value]
|
|
569
|
+
]);
|
|
570
|
+
}
|
|
571
|
+
}, Ke = {
|
|
572
|
+
install(e) {
|
|
573
|
+
e.component("AppHeader", Y), e.component("AppHeaderLink", X), e.component("AppLayout", ee), e.component("AppMain", te), e.component("AppNavTabs", re), e.component("AppNavTab", ne), e.component("AppSidebar", le), e.component("AppSidebarItem", de), e.component("AppSidebarItemChild", ce), e.component("AppSidebarItemChildren", pe), e.component("AppSidebarItemParent", be), e.component("AppSidebarToggle", ve), e.component("AppSidebarNavSection", ke), e.component("Badge", Se), e.component("Button", Ie), e.component("Checkbox", De), e.component("Card", Ve), e.component("DialogBackground", Pe), e.component("Input", Re), e.component("Label", je), e.component("Radio", Ge), e.component("Select", Ee), e.component("Table", Ue), e.component("Tabs", Je), e.component("TabItem", Ye), e.component("TextArea", Fe);
|
|
574
|
+
}
|
|
575
|
+
};
|
|
576
|
+
export {
|
|
577
|
+
Y as AppHeader,
|
|
578
|
+
X as AppHeaderLink,
|
|
579
|
+
ee as AppLayout,
|
|
580
|
+
te as AppMain,
|
|
581
|
+
ne as AppNavTab,
|
|
582
|
+
re as AppNavTabs,
|
|
583
|
+
le as AppSidebar,
|
|
584
|
+
de as AppSidebarItem,
|
|
585
|
+
ce as AppSidebarItemChild,
|
|
586
|
+
pe as AppSidebarItemChildren,
|
|
587
|
+
be as AppSidebarItemParent,
|
|
588
|
+
ke as AppSidebarNavSection,
|
|
589
|
+
ve as AppSidebarToggle,
|
|
590
|
+
Se as Badge,
|
|
591
|
+
Ie as Button,
|
|
592
|
+
Ve as Card,
|
|
593
|
+
De as Checkbox,
|
|
594
|
+
Pe as DialogBackground,
|
|
595
|
+
Re as Input,
|
|
596
|
+
je as Label,
|
|
597
|
+
Ge as Radio,
|
|
598
|
+
Ee as Select,
|
|
599
|
+
Ye as TabItem,
|
|
600
|
+
Ue as Table,
|
|
601
|
+
Je as Tabs,
|
|
602
|
+
Fe as TextArea,
|
|
603
|
+
Ke as default
|
|
604
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(function(s,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("vue-router")):typeof define=="function"&&define.amd?define(["exports","vue","vue-router"],e):(s=typeof globalThis<"u"?globalThis:s||self,e(s.ScrubbedTailwindComponentsV2={},s.Vue,s.vueRouter))})(this,function(s,e,p){"use strict";const W={class:"flex w-full items-center justify-between"},H={class:"flex items-center gap-2"},q={class:"flex items-center gap-10"},O={class:"hidden gap-6 sm:flex"},k={__name:"AppHeader",setup(t){const o=e.inject("APP_DATA"),{isSidebarToggled:n,toggleSidebar:l}=o;return(r,a)=>(e.openBlock(),e.createElementBlock("header",{class:e.normalizeClass(["fixed flex h-16 w-dvw items-center bg-white/50 px-3 backdrop-blur sm:px-6",{"rounded-t-2xl":e.unref(n)}])},[e.createElementVNode("nav",W,[e.createElementVNode("div",H,[e.createElementVNode("button",{onClick:a[0]||(a[0]=i=>e.unref(l)()),class:"block cursor-pointer rounded-full p-2 hover:bg-neutral-100 sm:hidden"},a[1]||(a[1]=[e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"lucide lucide-menu-icon lucide-menu size-5 stroke-neutral-600"},[e.createElementVNode("path",{d:"M4 12h16"}),e.createElementVNode("path",{d:"M4 18h16"}),e.createElementVNode("path",{d:"M4 6h16"})],-1)])),e.renderSlot(r.$slots,"header-img")]),e.createElementVNode("div",q,[e.createElementVNode("ul",O,[e.renderSlot(r.$slots,"header-links")]),e.renderSlot(r.$slots,"header-actions")])])],2))}},U=["href"],b={__name:"AppHeaderLink",props:{to:{type:String,required:!0}},setup(t){const o=t;return(n,l)=>(e.openBlock(),e.createElementBlock("li",null,[o.to.startsWith("/")?(e.openBlock(),e.createBlock(e.unref(p.RouterLink),{key:0,class:"hover:text-primary-950 [&.router-link-active]:text-primary-950 text-xs uppercase text-neutral-600 hover:transition-all [&.router-link-active]:font-semibold",to:o.to},{default:e.withCtx(()=>[e.renderSlot(n.$slots,"default")]),_:3},8,["to"])):(e.openBlock(),e.createElementBlock("a",{key:1,class:"hover:text-primary-950 text-xs uppercase text-neutral-600 hover:transition-all",href:o.to},[e.renderSlot(n.$slots,"default")],8,U))]))}},Z={class:"relative"},J={class:"flex"},h={__name:"AppLayout",setup(t){const o=e.ref(!1);function n(){window.innerWidth<=640?(o.value=!o.value,l()):o.value&&(o.value=!1,l())}function l(){const r=document.querySelector("body");r.classList.contains("bg-black")?r.classList.remove("bg-black"):r.classList.add("bg-black")}return e.provide("APP_DATA",{isSidebarToggled:o,toggleSidebar:n}),(r,a)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["bg-white transition-all duration-500 ease-[cubic-bezier(.32,.72,0,1)]",{"scale-93 origin-[center_top] translate-y-4":o.value}])},[e.createElementVNode("div",Z,[e.renderSlot(r.$slots,"header"),e.createElementVNode("div",J,[e.renderSlot(r.$slots,"content")])])],2))}},g={__name:"AppMain",setup(t){const o=e.inject("APP_DATA"),{isSidebarToggled:n}=o;return(l,r)=>(e.openBlock(),e.createElementBlock("main",{class:e.normalizeClass(["bg-background-main fixed z-[-1] h-svh w-full overflow-auto px-6 pb-9 pt-24 sm:top-16 sm:ml-[223px] sm:h-[calc(100dvh-4rem)] sm:w-[calc(100dvw-223px)] sm:pt-9",e.unref(n)?"overflow-hidden rounded-t-xl sm:rounded-none":"sm:rounded-tl-2xl"])},[e.renderSlot(l.$slots,"default")],2))}},Y={class:"group flex w-full overflow-x-auto border-b-[1px] border-neutral-200"},_={__name:"AppNavTabs",setup(t){const o=e.ref(null);function n(r,a,i){o.value.style=`left: ${r}px; top: calc(${a}px + 6px); opacity: 1; width: ${i}px`}function l(r,a,i){o.value.style=`left: ${r}px; top: calc(${a}px + 6px); opacity: 0; width: ${i}px`}return e.provide("NAV_TABS",{setSelectorAttributes:n,resetSelectorOpacity:l}),(r,a)=>(e.openBlock(),e.createElementBlock("div",Y,[e.renderSlot(r.$slots,"default"),e.createElementVNode("div",{class:"bg-brand-primary-700 absolute left-0 z-[-1] h-[32px] w-10 rounded-lg opacity-0 transition-all ease-in-out",ref_key:"selector",ref:o},null,512)]))}},x={__name:"AppNavTab",props:{to:{type:String,required:!0}},setup(t){const o=t,n=e.inject("NAV_TABS"),{setSelectorAttributes:l,resetSelectorOpacity:r}=n,a=e.ref(null);return(i,c)=>(e.openBlock(),e.createElementBlock("div",{onMouseover:c[0]||(c[0]=u=>e.unref(l)(a.value.offsetLeft,a.value.offsetTop,a.value.clientWidth)),onMouseleave:c[1]||(c[1]=u=>e.unref(r)(a.value.offsetLeft,a.value.offsetTop,a.value.clientWidth)),class:"shrink-0",ref_key:"el",ref:a},[e.createVNode(e.unref(p.RouterLink),{class:"[&.router-link-exact-active]:text-primary-950 [&.router-link-exact-active]:border-brand-primary-700 flex h-12 shrink-0 items-center justify-between gap-2 border-b-2 border-transparent px-3 text-sm text-neutral-600 transition-all hover:font-medium hover:text-white [&.router-link-exact-active]:font-medium [&.router-link-exact-active]:hover:text-white",to:o.to},{default:e.withCtx(()=>[e.renderSlot(i.$slots,"default")]),_:3},8,["to"])],544))}},m=(t,o)=>{const n=t.__vccOpts||t;for(const[l,r]of o)n[l]=r;return n},F={class:"fixed left-0 top-0 hidden w-[223px] space-y-4 bg-white px-4 py-8 sm:top-[64px] sm:block"},y=m({__name:"AppSidebar",setup(t){const o=e.inject("APP_DATA"),{isSidebarToggled:n,toggleSidebar:l}=o;return(r,a)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[e.createElementVNode("aside",F,[e.renderSlot(r.$slots,"default",{},void 0,!0)]),(e.openBlock(),e.createBlock(e.Teleport,{to:"body"},[e.createElementVNode("div",{class:"shadow-t-2xl fixed bottom-0 z-50 h-[60svh] w-full space-y-4 overflow-y-scroll rounded-t-2xl bg-white p-4 transition-all duration-500 ease-[cubic-bezier(.32,.72,0,1)] [&::-webkit-scrollbar]:hidden",style:e.normalizeStyle(e.unref(n)?"transform: translateZ(0)":"transform: translate3d(0,60svh,0)")},[e.renderSlot(r.$slots,"default",{},void 0,!0)],4),e.createElementVNode("div",{onClick:a[0]||(a[0]=i=>e.unref(l)()),class:e.normalizeClass(["backdrop backdrop-blur-[0.50px] transition-all duration-300 [transition-behavior:allow-discrete]",e.unref(n)?"fixed inset-0 z-40 block bg-black/80 opacity-100":"hidden"])},null,2)]))],64))}},[["__scopeId","data-v-aaece1c7"]]),X={class:"flex flex-col"},B={__name:"AppSidebarItem",setup(t){p.useRoute();const o=e.ref(!1);function n(){o.value=!o.value}return e.provide("SIDEBAR_TOGGLE",{toggled:o,toggleSidebarItem:n}),(l,r)=>(e.openBlock(),e.createElementBlock("div",X,[e.renderSlot(l.$slots,"default")]))}},Q=["to"],w={__name:"AppSidebarItemChild",props:{to:{type:String,required:!0}},setup(t){const o=t;return(n,l)=>o.to.startsWith("/")?(e.openBlock(),e.createBlock(e.unref(p.RouterLink),{key:0,class:"[&.router-link-exact-active]:text-primary-950 [&.router-link-exact-active]:bg-background-main text-primary-950 hover:bg-background-main block h-10 items-center gap-3 overflow-hidden text-ellipsis whitespace-nowrap rounded-lg px-3 text-xs leading-[40px] transition-all [&.router-link-exact-active]:font-medium",to:o.to},{default:e.withCtx(()=>[e.renderSlot(n.$slots,"default")]),_:3},8,["to"])):(e.openBlock(),e.createElementBlock("a",{key:1,class:"text-primary-950 hover:bg-background-main block h-10 items-center gap-3 overflow-hidden text-ellipsis whitespace-nowrap rounded-lg px-3 text-xs leading-[40px] transition-all",to:o.to},[e.renderSlot(n.$slots,"default")],8,Q))}},$={__name:"AppSidebarItemChildren",setup(t){const o=e.inject("SIDEBAR_TOGGLE"),{toggled:n}=o;return(l,r)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["max-h-0 overflow-y-hidden rounded-b-lg opacity-0 transition-all",{"mt-2 max-h-max overflow-y-auto px-2 opacity-100":e.unref(n)}])},[e.renderSlot(l.$slots,"default")],2))}},K={class:"group/sidebar-item hover:bg-background-main has-[&.router-link-active]:bg-background-main peer flex h-10 items-center justify-between rounded-lg px-3 transition-all"},v=["href"],S={__name:"AppSidebarItemParent",props:{to:{type:String,required:!0},name:{type:String},hasChildren:{type:Boolean,default:!1}},setup(t){const o=p.useRoute(),n=t,l=e.inject("SIDEBAR_TOGGLE"),r=e.inject("APP_DATA"),{toggled:a,toggleSidebarItem:i}=l,{toggleSidebar:c}=r;function u(){o.matched.some(d=>n.name===d.name)?a.value=!0:a.value=!1}return e.watch(o,()=>u(),{immediate:!0}),(f,d)=>(e.openBlock(),e.createElementBlock("div",K,[n.to.startsWith("/")?(e.openBlock(),e.createBlock(e.unref(p.RouterLink),{key:0,onClick:d[0]||(d[0]=ye=>e.unref(c)()),class:"[&.router-link-active]:text-primary-950 [&.router-link-active]:text-primary-950 text-primary-950 peer flex h-full w-full items-center gap-3 text-xs [&.router-link-active]:font-medium",to:n.to},{default:e.withCtx(()=>[e.renderSlot(f.$slots,"default")]),_:3},8,["to"])):(e.openBlock(),e.createElementBlock("a",{key:1,class:"text-primary-950 peer flex h-full w-full items-center gap-3 text-xs",href:n.to},[e.renderSlot(f.$slots,"default")],8,v)),n.hasChildren?(e.openBlock(),e.createElementBlock("button",{key:2,onClick:d[1]||(d[1]=ye=>e.unref(i)()),class:"cursor-pointer rounded-full p-1 transition-all hover:bg-neutral-100",type:"button"},[(e.openBlock(),e.createElementBlock("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:e.normalizeClass(["lucide lucide-chevron-down-icon lucide-chevron-down stroke-primary-950 transition-all duration-300",{"rotate-180":e.unref(a)}])},d[2]||(d[2]=[e.createElementVNode("path",{d:"m6 9 6 6 6-6"},null,-1)]),2))])):e.createCommentVNode("",!0)]))}},ee={class:"hover:bg-background-main has-[&.router-link-active]:active has-[&.router-link-active]:bg-primary-700 peer flex h-10 items-center justify-between rounded-lg px-3 transition-all"},A={__name:"AppSidebarToggle",setup(t){const o=e.inject("SIDEBAR_TOGGLE");return(n,l)=>{const r=e.resolveComponent("RouterLink");return e.openBlock(),e.createElementBlock("div",ee,[e.createVNode(r,{class:"text-primary-950 peer flex h-full w-full items-center gap-3 text-xs [&.router-link-active]:font-medium [&.router-link-active]:text-white",to:"/"},{default:e.withCtx(()=>[e.renderSlot(n.$slots,"default")]),_:3}),e.createElementVNode("button",{onClick:l[0]||(l[0]=a=>e.unref(o).toggleSidebarItem()),class:"cursor-pointer",type:"button"},l[1]||(l[1]=[e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"lucide lucide-chevron-down-icon lucide-chevron-down stroke-white"},[e.createElementVNode("path",{d:"m6 9 6 6 6-6"})],-1)]))])}}},te={},oe={key:0,class:"text-primary-950 px-1 text-sm font-medium"},re={class:"mt-2"};function ne(t,o){return e.openBlock(),e.createElementBlock("nav",null,[t.$slots.title?(e.openBlock(),e.createElementBlock("b",oe,[e.renderSlot(t.$slots,"title")])):e.createCommentVNode("",!0),e.createElementVNode("div",re,[e.renderSlot(t.$slots,"items")])])}const E=m(te,[["render",ne]]),le={},ae={class:"rounded-full px-3 py-1 text-xs font-medium"};function se(t,o){return e.openBlock(),e.createElementBlock("div",ae,[e.renderSlot(t.$slots,"default")])}const V=m(le,[["render",se]]),T={__name:"Button",props:{variant:{type:String,default:"primary"}},setup(t){const o=t,n={primary:["bg-brand-primary-700","text-white","active:bg-primary-950 hover:bg-primary-800"],secondary:["bg-neutral-100","text-primary-900"],outlined:["border-[1px]","border-neutral-200","text-primary-900","hover:bg-neutral-100"],ghost:["font-medium","text-primary-900","hover:bg-neutral-100"],destructive:["bg-danger-600","text-white","active:bg-danger-600-active","hover:bg-danger-600-hovered"]};return(l,r)=>(e.openBlock(),e.createElementBlock("button",e.mergeProps(l.$attrs,{class:["cursor-pointer rounded-lg px-4 py-2 text-xs transition-all disabled:cursor-not-allowed disabled:opacity-50",n[o.variant]]}),[e.renderSlot(l.$slots,"default")],16))}},ie={},ce={class:"rounded-2xl bg-white p-6"};function de(t,o){return e.openBlock(),e.createElementBlock("div",ce,[e.renderSlot(t.$slots,"default")])}const I=m(ie,[["render",de]]),N={__name:"Checkbox",props:{modelValue:{},modelModifiers:{}},emits:["update:modelValue"],setup(t){const o=e.useModel(t,"modelValue"),n=e.ref(null);return(l,r)=>(e.openBlock(),e.createElementBlock("button",{onClick:r[1]||(r[1]=a=>n.value.click()),class:"group/checkbox bg-neutral-100 has-checked:bg-primary-700 flex size-4 cursor-pointer items-center justify-center rounded-sm transition-all"},[r[2]||(r[2]=e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"lucide lucide-check-icon lucide-check hidden stroke-white group-has-[:checked]/checkbox:block"},[e.createElementVNode("path",{d:"M20 6 9 17l-5-5"})],-1)),e.withDirectives(e.createElementVNode("input",e.mergeProps(l.$attrs,{"onUpdate:modelValue":r[0]||(r[0]=a=>o.value=a),type:"checkbox",ref_key:"checkboxRef",ref:n,hidden:""}),null,16),[[e.vModelCheckbox,o.value]])]))}},pe={class:"pointer-events-auto fixed inset-0 z-[100] min-h-screen bg-black/80 backdrop-blur-[2px]"},C={__name:"DialogBackground",setup(t){return e.onMounted(()=>{document.querySelector("body").classList.add("overflow-hidden")}),e.onUnmounted(()=>{document.querySelector("body").classList.remove("overflow-hidden")}),(o,n)=>(e.openBlock(),e.createElementBlock("div",pe,[e.renderSlot(o.$slots,"default")]))}},D={__name:"Input",props:["modelValue"],setup(t){const o=t,n=e.ref(o.modelValue);return(l,r)=>e.withDirectives((e.openBlock(),e.createElementBlock("input",{"onUpdate:modelValue":r[0]||(r[0]=a=>n.value=a),onInput:r[1]||(r[1]=a=>l.$emit("update:modelValue",a.target.value)),class:"text-primary-950 focus:ring-primary-700 neutral-400:text-neutral-400 rounded-lg border-[1px] border-neutral-200 bg-white px-3 py-2 text-xs outline-none transition-all focus:ring-2 focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"},null,544)),[[e.vModelText,n.value]])}},me={};function ue(t,o){return e.openBlock(),e.createElementBlock("label",e.mergeProps(t.$attrs,{class:"text-primary-950 text-xs transition-all"}),[e.renderSlot(t.$slots,"default")],16)}const L=m(me,[["render",ue]]),P={__name:"Radio",props:{modelValue:{},modelModifiers:{}},emits:["update:modelValue"],setup(t){const o=e.useModel(t,"modelValue"),n=e.ref(null);return(l,r)=>(e.openBlock(),e.createElementBlock("button",{onClick:r[1]||(r[1]=a=>n.value.click()),class:"group/radio bg-neutral-100 has-checked:bg-white has-checked:border-primary-700 flex size-4 cursor-pointer items-center justify-center rounded-full border-[1px] border-transparent"},[r[2]||(r[2]=e.createElementVNode("div",{class:"group-has-checked/radio:bg-primary-700 group-has-checked/radio:opacity-100 size-[10px] rounded-full opacity-0 transition-all"},null,-1)),e.withDirectives(e.createElementVNode("input",e.mergeProps(l.$attrs,{"onUpdate:modelValue":r[0]||(r[0]=a=>o.value=a),type:"radio",ref_key:"radioRef",ref:n,hidden:""}),null,16),[[e.vModelRadio,o.value]])]))}},fe="bg-[url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiM1YjYxNmUiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0ibHVjaWRlIGx1Y2lkZS1jaGV2cm9uLWRvd24iPjxwYXRoIGQ9Im02IDkgNiA2IDYtNiIvPjwvc3ZnPg==')]",j={__name:"Select",setup(t){return(o,n)=>(e.openBlock(),e.createElementBlock("select",e.mergeProps(o.$attrs,{onChange:n[0]||(n[0]=l=>o.$emit("update:modelValue",l.target.value)),class:["border-neutral-200 text-primary-950 focus:ring-primary-700 appearance-none rounded-lg border-[1px] bg-white bg-[length:16px] bg-[right_12px_center] bg-no-repeat px-3 py-2 text-xs outline-none transition-all focus:ring-2 focus:ring-offset-2",fe]}),[e.renderSlot(o.$slots,"default")],16))}},ke={class:"w-full"},be={class:"h-16"},he={key:0},ge={key:0,class:"pe-4"},M={__name:"Table",props:{columns:{type:Array,required:!0},data:{type:Array,required:!0}},setup(t){const o=t;return(n,l)=>(e.openBlock(),e.createElementBlock("table",ke,[e.createElementVNode("thead",null,[e.createElementVNode("tr",be,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.columns,r=>(e.openBlock(),e.createElementBlock("th",{key:r.key,class:"text-xs font-medium text-neutral-600 first-of-type:ps-4"},e.toDisplayString(r.label),1))),128)),n.$slots.actions?(e.openBlock(),e.createElementBlock("th",he)):e.createCommentVNode("",!0)])]),e.createElementVNode("tbody",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.data,(r,a)=>(e.openBlock(),e.createElementBlock("tr",{key:a,class:"odd:bg-background-main/50 hover:bg-background-main min-h-16 rounded-md transition-all"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.columns,i=>(e.openBlock(),e.createElementBlock("td",{key:i.key,class:"text-primary-950 py-4 text-xs first-of-type:rounded-s-md first-of-type:ps-4 last-of-type:rounded-e-md last-of-type:pe-4"},[e.renderSlot(n.$slots,i.key,{row:r},()=>[e.createTextVNode(e.toDisplayString(r[i.key]),1)])]))),128)),n.$slots.actions?(e.openBlock(),e.createElementBlock("td",ge,[e.renderSlot(n.$slots,"actions",{row:r})])):e.createCommentVNode("",!0)]))),128))])]))}},_e={class:"bg-neutral-100/50 overflow-x-scroll rounded-xl p-1 [&::-webkit-scrollbar]:hidden"},R={__name:"Tabs",props:{default:{default:null}},setup(t){const o=t,n=e.ref(o.default);function l(r){n.value=r}return e.provide("TAB_DATA",{currentValue:n,setCurrentValue:l}),(r,a)=>(e.openBlock(),e.createElementBlock("div",_e,[e.renderSlot(r.$slots,"default")]))}},z={__name:"TabItem",props:{value:{required:!0}},setup(t){const o=t,n=e.inject("TAB_DATA"),{currentValue:l,setCurrentValue:r}=n,a=e.computed(()=>l.value===o.value?["bg-white","font-medium","text-primary-700","shadow-xl"]:"text-neutral-600");return(i,c)=>(e.openBlock(),e.createElementBlock("button",{onClick:c[0]||(c[0]=u=>e.unref(r)(o.value)),class:e.normalizeClass(["h-8 cursor-pointer rounded-lg px-3 text-xs transition-all disabled:cursor-not-allowed disabled:opacity-50",a.value])},[e.renderSlot(i.$slots,"default")],2))}},G={__name:"TextArea",props:["modelValue"],setup(t){const o=t,n=e.ref(o.modelValue);return(l,r)=>e.withDirectives((e.openBlock(),e.createElementBlock("textarea",e.mergeProps({onInput:r[0]||(r[0]=a=>l.$emit("update:modelValue",a.target.value))},l.$attrs,{"onUpdate:modelValue":r[1]||(r[1]=a=>n.value=a),class:"border-neutral-200 text-primary-950 neutral-400:text-neutral-400 focus:ring-primary-700 rounded-lg border-[1px] px-3 py-2 text-xs outline-none transition-all focus:ring-2 focus:ring-offset-2"}),null,16)),[[e.vModelText,n.value]])}},xe={install(t){t.component("AppHeader",k),t.component("AppHeaderLink",b),t.component("AppLayout",h),t.component("AppMain",g),t.component("AppNavTabs",_),t.component("AppNavTab",x),t.component("AppSidebar",y),t.component("AppSidebarItem",B),t.component("AppSidebarItemChild",w),t.component("AppSidebarItemChildren",$),t.component("AppSidebarItemParent",S),t.component("AppSidebarToggle",A),t.component("AppSidebarNavSection",E),t.component("Badge",V),t.component("Button",T),t.component("Checkbox",N),t.component("Card",I),t.component("DialogBackground",C),t.component("Input",D),t.component("Label",L),t.component("Radio",P),t.component("Select",j),t.component("Table",M),t.component("Tabs",R),t.component("TabItem",z),t.component("TextArea",G)}};s.AppHeader=k,s.AppHeaderLink=b,s.AppLayout=h,s.AppMain=g,s.AppNavTab=x,s.AppNavTabs=_,s.AppSidebar=y,s.AppSidebarItem=B,s.AppSidebarItemChild=w,s.AppSidebarItemChildren=$,s.AppSidebarItemParent=S,s.AppSidebarNavSection=E,s.AppSidebarToggle=A,s.Badge=V,s.Button=T,s.Card=I,s.Checkbox=N,s.DialogBackground=C,s.Input=D,s.Label=L,s.Radio=P,s.Select=j,s.TabItem=z,s.Table=M,s.Tabs=R,s.TextArea=G,s.default=xe,Object.defineProperties(s,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "scrubbed-tailwind-components-v2",
|
|
3
|
+
"version": "2.0.2",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/scrubbed-tailwind-components-v2.umd.js",
|
|
7
|
+
"module": "dist/scrubbed-tailwind-components-v2.es.js",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./dist/scrubbed-tailwind-components-v2.es.js",
|
|
14
|
+
"require": "./dist/scrubbed-tailwind-components-v2.umd.js",
|
|
15
|
+
"default": "./dist/scrubbed-tailwind-components-v2.es.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"dev": "vite",
|
|
20
|
+
"build": "vite build",
|
|
21
|
+
"preview": "vite preview",
|
|
22
|
+
"prepare": "cypress install",
|
|
23
|
+
"test:e2e": "start-server-and-test preview http://localhost:4173 'cypress run --e2e'",
|
|
24
|
+
"test:e2e:dev": "start-server-and-test 'vite dev --port 4173' http://localhost:4173 'cypress open --e2e'",
|
|
25
|
+
"test:unit": "cypress run --component",
|
|
26
|
+
"test:unit:dev": "cypress open --component",
|
|
27
|
+
"format": "prettier --write src/"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {},
|
|
30
|
+
"peerDependencies": {
|
|
31
|
+
"vue": "^3.5.13",
|
|
32
|
+
"vue-router": "^4.5.0"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@vitejs/plugin-vue": "^5.2.3",
|
|
36
|
+
"@vitejs/plugin-vue-jsx": "^4.1.2",
|
|
37
|
+
"cypress": "^14.2.1",
|
|
38
|
+
"prettier": "^3.6.0",
|
|
39
|
+
"prettier-plugin-classnames": "^0.7.8",
|
|
40
|
+
"prettier-plugin-tailwindcss": "^0.6.13",
|
|
41
|
+
"start-server-and-test": "^2.0.11",
|
|
42
|
+
"vite": "^6.2.4",
|
|
43
|
+
"vite-plugin-vue-devtools": "^7.7.2",
|
|
44
|
+
"vue-router": "^4.5.0"
|
|
45
|
+
}
|
|
46
|
+
}
|