@nr1e/qwik-ui 0.0.43 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/dock.qwik.cjs +25 -12
- package/lib/components/dock.qwik.mjs +27 -14
- package/lib/components/menu.qwik.cjs +27 -11
- package/lib/components/menu.qwik.mjs +28 -12
- package/lib/components/theme-selector.qwik.cjs +107 -0
- package/lib/components/theme-selector.qwik.mjs +107 -0
- package/lib/components/time-zone-selector.qwik.cjs +130 -0
- package/lib/components/time-zone-selector.qwik.mjs +130 -0
- package/lib/index.qwik.cjs +11 -2
- package/lib/index.qwik.mjs +14 -5
- package/lib-types/components/dock.d.ts +10 -4
- package/lib-types/components/menu.d.ts +11 -3
- package/lib-types/components/time-zone-selector.d.ts +5 -0
- package/lib-types/index.d.ts +2 -0
- package/package.json +2 -2
|
@@ -9,23 +9,35 @@ const DockLabel = qwik.component$((props) => {
|
|
|
9
9
|
children: /* @__PURE__ */ jsxRuntime.jsx(qwik.Slot, {})
|
|
10
10
|
});
|
|
11
11
|
});
|
|
12
|
-
const
|
|
13
|
-
|
|
12
|
+
const DockButton = qwik.component$((props) => {
|
|
13
|
+
return /* @__PURE__ */ jsxRuntime.jsx("button", {
|
|
14
|
+
class: `${props.selected ? "bg-base-200" : ""} ${props.class ?? ""}`,
|
|
15
|
+
onClick$: async (event) => {
|
|
16
|
+
if (props.loading) {
|
|
17
|
+
props.loading.value = true;
|
|
18
|
+
}
|
|
19
|
+
await props.onClick$(event);
|
|
20
|
+
if (props.loading) {
|
|
21
|
+
props.loading.value = false;
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(qwik.Slot, {})
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
const DockLink = qwik.component$((props) => {
|
|
14
28
|
return /* @__PURE__ */ jsxRuntime.jsx(qwikCity.Link, {
|
|
15
|
-
class: `${props.selected ? "bg-base-200" : ""} ${props.
|
|
29
|
+
class: `${props.selected ? "bg-base-200" : ""} ${props.class ?? ""}`,
|
|
16
30
|
href: props.href,
|
|
17
31
|
prefetch: props.prefetch ?? true,
|
|
18
32
|
onClick$: async (event) => {
|
|
33
|
+
if (props.loading) {
|
|
34
|
+
props.loading.value = true;
|
|
35
|
+
}
|
|
19
36
|
if (props.onClick$) {
|
|
20
37
|
await props.onClick$(event);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
await nav(props.href);
|
|
26
|
-
if (props.loading) {
|
|
27
|
-
props.loading.value = false;
|
|
28
|
-
}
|
|
38
|
+
}
|
|
39
|
+
if (props.loading) {
|
|
40
|
+
props.loading.value = false;
|
|
29
41
|
}
|
|
30
42
|
},
|
|
31
43
|
children: /* @__PURE__ */ jsxRuntime.jsx(qwik.Slot, {})
|
|
@@ -38,5 +50,6 @@ const Dock = qwik.component$((props) => {
|
|
|
38
50
|
});
|
|
39
51
|
});
|
|
40
52
|
exports.Dock = Dock;
|
|
41
|
-
exports.
|
|
53
|
+
exports.DockButton = DockButton;
|
|
42
54
|
exports.DockLabel = DockLabel;
|
|
55
|
+
exports.DockLink = DockLink;
|
|
@@ -1,29 +1,41 @@
|
|
|
1
1
|
import { jsx } from "@builder.io/qwik/jsx-runtime";
|
|
2
2
|
import { component$, Slot } from "@builder.io/qwik";
|
|
3
|
-
import {
|
|
3
|
+
import { Link } from "@builder.io/qwik-city";
|
|
4
4
|
const DockLabel = component$((props) => {
|
|
5
5
|
return /* @__PURE__ */ jsx("span", {
|
|
6
6
|
class: `dock-label ${props?.class ?? ""}`,
|
|
7
7
|
children: /* @__PURE__ */ jsx(Slot, {})
|
|
8
8
|
});
|
|
9
9
|
});
|
|
10
|
-
const
|
|
11
|
-
|
|
10
|
+
const DockButton = component$((props) => {
|
|
11
|
+
return /* @__PURE__ */ jsx("button", {
|
|
12
|
+
class: `${props.selected ? "bg-base-200" : ""} ${props.class ?? ""}`,
|
|
13
|
+
onClick$: async (event) => {
|
|
14
|
+
if (props.loading) {
|
|
15
|
+
props.loading.value = true;
|
|
16
|
+
}
|
|
17
|
+
await props.onClick$(event);
|
|
18
|
+
if (props.loading) {
|
|
19
|
+
props.loading.value = false;
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
children: /* @__PURE__ */ jsx(Slot, {})
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
const DockLink = component$((props) => {
|
|
12
26
|
return /* @__PURE__ */ jsx(Link, {
|
|
13
|
-
class: `${props.selected ? "bg-base-200" : ""} ${props.
|
|
27
|
+
class: `${props.selected ? "bg-base-200" : ""} ${props.class ?? ""}`,
|
|
14
28
|
href: props.href,
|
|
15
29
|
prefetch: props.prefetch ?? true,
|
|
16
30
|
onClick$: async (event) => {
|
|
31
|
+
if (props.loading) {
|
|
32
|
+
props.loading.value = true;
|
|
33
|
+
}
|
|
17
34
|
if (props.onClick$) {
|
|
18
35
|
await props.onClick$(event);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
await nav(props.href);
|
|
24
|
-
if (props.loading) {
|
|
25
|
-
props.loading.value = false;
|
|
26
|
-
}
|
|
36
|
+
}
|
|
37
|
+
if (props.loading) {
|
|
38
|
+
props.loading.value = false;
|
|
27
39
|
}
|
|
28
40
|
},
|
|
29
41
|
children: /* @__PURE__ */ jsx(Slot, {})
|
|
@@ -37,6 +49,7 @@ const Dock = component$((props) => {
|
|
|
37
49
|
});
|
|
38
50
|
export {
|
|
39
51
|
Dock,
|
|
40
|
-
|
|
41
|
-
DockLabel
|
|
52
|
+
DockButton,
|
|
53
|
+
DockLabel,
|
|
54
|
+
DockLink
|
|
42
55
|
};
|
|
@@ -3,8 +3,25 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const jsxRuntime = require("@builder.io/qwik/jsx-runtime");
|
|
4
4
|
const qwik = require("@builder.io/qwik");
|
|
5
5
|
const qwikCity = require("@builder.io/qwik-city");
|
|
6
|
-
const
|
|
7
|
-
|
|
6
|
+
const MenuButton = qwik.component$((props) => {
|
|
7
|
+
return /* @__PURE__ */ jsxRuntime.jsx("li", {
|
|
8
|
+
class: props.class ?? "",
|
|
9
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("button", {
|
|
10
|
+
class: `truncate ${props.selected ? "bg-base-200" : ""} ${props.linkClass ?? ""}`,
|
|
11
|
+
onClick$: async (event) => {
|
|
12
|
+
if (props.loading) {
|
|
13
|
+
props.loading.value = true;
|
|
14
|
+
}
|
|
15
|
+
await props.onClick$(event);
|
|
16
|
+
if (props.loading) {
|
|
17
|
+
props.loading.value = false;
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(qwik.Slot, {})
|
|
21
|
+
})
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
const MenuLink = qwik.component$((props) => {
|
|
8
25
|
return /* @__PURE__ */ jsxRuntime.jsx("li", {
|
|
9
26
|
class: props.class ?? "",
|
|
10
27
|
children: /* @__PURE__ */ jsxRuntime.jsx(qwikCity.Link, {
|
|
@@ -12,16 +29,14 @@ const MenuItem = qwik.component$((props) => {
|
|
|
12
29
|
href: props.href,
|
|
13
30
|
prefetch: props.prefetch ?? true,
|
|
14
31
|
onClick$: async (event) => {
|
|
32
|
+
if (props.loading) {
|
|
33
|
+
props.loading.value = true;
|
|
34
|
+
}
|
|
15
35
|
if (props.onClick$) {
|
|
16
36
|
await props.onClick$(event);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
await nav(props.href);
|
|
22
|
-
if (props.loading) {
|
|
23
|
-
props.loading.value = false;
|
|
24
|
-
}
|
|
37
|
+
}
|
|
38
|
+
if (props.loading) {
|
|
39
|
+
props.loading.value = false;
|
|
25
40
|
}
|
|
26
41
|
},
|
|
27
42
|
children: /* @__PURE__ */ jsxRuntime.jsx(qwik.Slot, {})
|
|
@@ -61,8 +76,9 @@ const Menu = qwik.component$((props) => {
|
|
|
61
76
|
});
|
|
62
77
|
});
|
|
63
78
|
exports.Menu = Menu;
|
|
79
|
+
exports.MenuButton = MenuButton;
|
|
64
80
|
exports.MenuDivider = MenuDivider;
|
|
65
81
|
exports.MenuGroup = MenuGroup;
|
|
66
82
|
exports.MenuGroupSummary = MenuGroupSummary;
|
|
67
|
-
exports.
|
|
83
|
+
exports.MenuLink = MenuLink;
|
|
68
84
|
exports.Submenu = Submenu;
|
|
@@ -1,8 +1,25 @@
|
|
|
1
1
|
import { jsx } from "@builder.io/qwik/jsx-runtime";
|
|
2
2
|
import { component$, Slot } from "@builder.io/qwik";
|
|
3
|
-
import {
|
|
4
|
-
const
|
|
5
|
-
|
|
3
|
+
import { Link } from "@builder.io/qwik-city";
|
|
4
|
+
const MenuButton = component$((props) => {
|
|
5
|
+
return /* @__PURE__ */ jsx("li", {
|
|
6
|
+
class: props.class ?? "",
|
|
7
|
+
children: /* @__PURE__ */ jsx("button", {
|
|
8
|
+
class: `truncate ${props.selected ? "bg-base-200" : ""} ${props.linkClass ?? ""}`,
|
|
9
|
+
onClick$: async (event) => {
|
|
10
|
+
if (props.loading) {
|
|
11
|
+
props.loading.value = true;
|
|
12
|
+
}
|
|
13
|
+
await props.onClick$(event);
|
|
14
|
+
if (props.loading) {
|
|
15
|
+
props.loading.value = false;
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
children: /* @__PURE__ */ jsx(Slot, {})
|
|
19
|
+
})
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
const MenuLink = component$((props) => {
|
|
6
23
|
return /* @__PURE__ */ jsx("li", {
|
|
7
24
|
class: props.class ?? "",
|
|
8
25
|
children: /* @__PURE__ */ jsx(Link, {
|
|
@@ -10,16 +27,14 @@ const MenuItem = component$((props) => {
|
|
|
10
27
|
href: props.href,
|
|
11
28
|
prefetch: props.prefetch ?? true,
|
|
12
29
|
onClick$: async (event) => {
|
|
30
|
+
if (props.loading) {
|
|
31
|
+
props.loading.value = true;
|
|
32
|
+
}
|
|
13
33
|
if (props.onClick$) {
|
|
14
34
|
await props.onClick$(event);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
await nav(props.href);
|
|
20
|
-
if (props.loading) {
|
|
21
|
-
props.loading.value = false;
|
|
22
|
-
}
|
|
35
|
+
}
|
|
36
|
+
if (props.loading) {
|
|
37
|
+
props.loading.value = false;
|
|
23
38
|
}
|
|
24
39
|
},
|
|
25
40
|
children: /* @__PURE__ */ jsx(Slot, {})
|
|
@@ -60,9 +75,10 @@ const Menu = component$((props) => {
|
|
|
60
75
|
});
|
|
61
76
|
export {
|
|
62
77
|
Menu,
|
|
78
|
+
MenuButton,
|
|
63
79
|
MenuDivider,
|
|
64
80
|
MenuGroup,
|
|
65
81
|
MenuGroupSummary,
|
|
66
|
-
|
|
82
|
+
MenuLink,
|
|
67
83
|
Submenu
|
|
68
84
|
};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("@builder.io/qwik/jsx-runtime");
|
|
4
|
+
const qwik = require("@builder.io/qwik");
|
|
5
|
+
const qwikIcons = require("@nr1e/qwik-icons");
|
|
6
|
+
function capitalizeFirstLetter(input) {
|
|
7
|
+
return input.charAt(0).toUpperCase() + input.slice(1);
|
|
8
|
+
}
|
|
9
|
+
function themeToName(theme) {
|
|
10
|
+
return theme.split("-").map(capitalizeFirstLetter).join(" ");
|
|
11
|
+
}
|
|
12
|
+
const THEMES = [
|
|
13
|
+
"auto",
|
|
14
|
+
"light",
|
|
15
|
+
"dark",
|
|
16
|
+
"abyss",
|
|
17
|
+
"acid",
|
|
18
|
+
"aqua",
|
|
19
|
+
"autumn",
|
|
20
|
+
"black",
|
|
21
|
+
"bumblebee",
|
|
22
|
+
"business",
|
|
23
|
+
"caramellatte",
|
|
24
|
+
"cmyk",
|
|
25
|
+
"coffee",
|
|
26
|
+
"corporate",
|
|
27
|
+
"cupcake",
|
|
28
|
+
"cyberpunk",
|
|
29
|
+
"dim",
|
|
30
|
+
"dracula",
|
|
31
|
+
"emerald",
|
|
32
|
+
"fantasy",
|
|
33
|
+
"forest",
|
|
34
|
+
"garden",
|
|
35
|
+
"halloween",
|
|
36
|
+
"lemonade",
|
|
37
|
+
"lofi",
|
|
38
|
+
"luxury",
|
|
39
|
+
"night",
|
|
40
|
+
"nord",
|
|
41
|
+
"pastel",
|
|
42
|
+
"retro",
|
|
43
|
+
"silk",
|
|
44
|
+
"sunset",
|
|
45
|
+
"synthwave",
|
|
46
|
+
"valentine",
|
|
47
|
+
"wireframe",
|
|
48
|
+
"winter"
|
|
49
|
+
];
|
|
50
|
+
const ThemeSelector = qwik.component$((props) => {
|
|
51
|
+
const currentTheme = qwik.useSignal("auto");
|
|
52
|
+
qwik.useVisibleTask$(() => {
|
|
53
|
+
const savedTheme = localStorage.getItem("theme");
|
|
54
|
+
currentTheme.value = savedTheme ?? "auto";
|
|
55
|
+
});
|
|
56
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", {
|
|
57
|
+
class: "dropdown",
|
|
58
|
+
children: [
|
|
59
|
+
/* @__PURE__ */ jsxRuntime.jsxs("button", {
|
|
60
|
+
role: "button",
|
|
61
|
+
tabIndex: 0,
|
|
62
|
+
class: "btn m-1",
|
|
63
|
+
children: [
|
|
64
|
+
themeToName(currentTheme.value),
|
|
65
|
+
/* @__PURE__ */ jsxRuntime.jsx(qwikIcons.MdiChevronDown, {
|
|
66
|
+
size: 16,
|
|
67
|
+
class: "fill-current opacity-60"
|
|
68
|
+
})
|
|
69
|
+
]
|
|
70
|
+
}),
|
|
71
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", {
|
|
72
|
+
tabIndex: 0,
|
|
73
|
+
class: "dropdown-content card bg-base-100 z-1 shadow-md",
|
|
74
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", {
|
|
75
|
+
class: "card-body rounded-box z-1",
|
|
76
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", {
|
|
77
|
+
class: "grid min-w-50 grid-cols-1 gap-2 p-2 sm:min-w-100 sm:grid-cols-2 lg:min-w-150 lg:grid-cols-3",
|
|
78
|
+
children: (props?.themes ?? THEMES).map((theme) => /* @__PURE__ */ jsxRuntime.jsx("input", {
|
|
79
|
+
type: "radio",
|
|
80
|
+
name: "theme-dropdown",
|
|
81
|
+
class: "theme-controller btn btn-sm btn-ghost justify-start",
|
|
82
|
+
"aria-label": themeToName(theme),
|
|
83
|
+
value: theme,
|
|
84
|
+
checked: theme === currentTheme.value,
|
|
85
|
+
onChange$: () => {
|
|
86
|
+
currentTheme.value = theme;
|
|
87
|
+
if (theme === "auto") {
|
|
88
|
+
document.documentElement.removeAttribute("data-theme");
|
|
89
|
+
localStorage.removeItem("theme");
|
|
90
|
+
} else {
|
|
91
|
+
localStorage.setItem("theme", theme);
|
|
92
|
+
}
|
|
93
|
+
const activeElement = document.activeElement;
|
|
94
|
+
if (activeElement) {
|
|
95
|
+
activeElement.blur();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}, theme))
|
|
99
|
+
})
|
|
100
|
+
})
|
|
101
|
+
})
|
|
102
|
+
]
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
exports.THEMES = THEMES;
|
|
106
|
+
exports.ThemeSelector = ThemeSelector;
|
|
107
|
+
exports.themeToName = themeToName;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { jsxs, jsx } from "@builder.io/qwik/jsx-runtime";
|
|
2
|
+
import { component$, useSignal, useVisibleTask$ } from "@builder.io/qwik";
|
|
3
|
+
import { MdiChevronDown } from "@nr1e/qwik-icons";
|
|
4
|
+
function capitalizeFirstLetter(input) {
|
|
5
|
+
return input.charAt(0).toUpperCase() + input.slice(1);
|
|
6
|
+
}
|
|
7
|
+
function themeToName(theme) {
|
|
8
|
+
return theme.split("-").map(capitalizeFirstLetter).join(" ");
|
|
9
|
+
}
|
|
10
|
+
const THEMES = [
|
|
11
|
+
"auto",
|
|
12
|
+
"light",
|
|
13
|
+
"dark",
|
|
14
|
+
"abyss",
|
|
15
|
+
"acid",
|
|
16
|
+
"aqua",
|
|
17
|
+
"autumn",
|
|
18
|
+
"black",
|
|
19
|
+
"bumblebee",
|
|
20
|
+
"business",
|
|
21
|
+
"caramellatte",
|
|
22
|
+
"cmyk",
|
|
23
|
+
"coffee",
|
|
24
|
+
"corporate",
|
|
25
|
+
"cupcake",
|
|
26
|
+
"cyberpunk",
|
|
27
|
+
"dim",
|
|
28
|
+
"dracula",
|
|
29
|
+
"emerald",
|
|
30
|
+
"fantasy",
|
|
31
|
+
"forest",
|
|
32
|
+
"garden",
|
|
33
|
+
"halloween",
|
|
34
|
+
"lemonade",
|
|
35
|
+
"lofi",
|
|
36
|
+
"luxury",
|
|
37
|
+
"night",
|
|
38
|
+
"nord",
|
|
39
|
+
"pastel",
|
|
40
|
+
"retro",
|
|
41
|
+
"silk",
|
|
42
|
+
"sunset",
|
|
43
|
+
"synthwave",
|
|
44
|
+
"valentine",
|
|
45
|
+
"wireframe",
|
|
46
|
+
"winter"
|
|
47
|
+
];
|
|
48
|
+
const ThemeSelector = component$((props) => {
|
|
49
|
+
const currentTheme = useSignal("auto");
|
|
50
|
+
useVisibleTask$(() => {
|
|
51
|
+
const savedTheme = localStorage.getItem("theme");
|
|
52
|
+
currentTheme.value = savedTheme ?? "auto";
|
|
53
|
+
});
|
|
54
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
55
|
+
class: "dropdown",
|
|
56
|
+
children: [
|
|
57
|
+
/* @__PURE__ */ jsxs("button", {
|
|
58
|
+
role: "button",
|
|
59
|
+
tabIndex: 0,
|
|
60
|
+
class: "btn m-1",
|
|
61
|
+
children: [
|
|
62
|
+
themeToName(currentTheme.value),
|
|
63
|
+
/* @__PURE__ */ jsx(MdiChevronDown, {
|
|
64
|
+
size: 16,
|
|
65
|
+
class: "fill-current opacity-60"
|
|
66
|
+
})
|
|
67
|
+
]
|
|
68
|
+
}),
|
|
69
|
+
/* @__PURE__ */ jsx("div", {
|
|
70
|
+
tabIndex: 0,
|
|
71
|
+
class: "dropdown-content card bg-base-100 z-1 shadow-md",
|
|
72
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
73
|
+
class: "card-body rounded-box z-1",
|
|
74
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
75
|
+
class: "grid min-w-50 grid-cols-1 gap-2 p-2 sm:min-w-100 sm:grid-cols-2 lg:min-w-150 lg:grid-cols-3",
|
|
76
|
+
children: (props?.themes ?? THEMES).map((theme) => /* @__PURE__ */ jsx("input", {
|
|
77
|
+
type: "radio",
|
|
78
|
+
name: "theme-dropdown",
|
|
79
|
+
class: "theme-controller btn btn-sm btn-ghost justify-start",
|
|
80
|
+
"aria-label": themeToName(theme),
|
|
81
|
+
value: theme,
|
|
82
|
+
checked: theme === currentTheme.value,
|
|
83
|
+
onChange$: () => {
|
|
84
|
+
currentTheme.value = theme;
|
|
85
|
+
if (theme === "auto") {
|
|
86
|
+
document.documentElement.removeAttribute("data-theme");
|
|
87
|
+
localStorage.removeItem("theme");
|
|
88
|
+
} else {
|
|
89
|
+
localStorage.setItem("theme", theme);
|
|
90
|
+
}
|
|
91
|
+
const activeElement = document.activeElement;
|
|
92
|
+
if (activeElement) {
|
|
93
|
+
activeElement.blur();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}, theme))
|
|
97
|
+
})
|
|
98
|
+
})
|
|
99
|
+
})
|
|
100
|
+
]
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
export {
|
|
104
|
+
THEMES,
|
|
105
|
+
ThemeSelector,
|
|
106
|
+
themeToName
|
|
107
|
+
};
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("@builder.io/qwik/jsx-runtime");
|
|
4
|
+
const qwik = require("@builder.io/qwik");
|
|
5
|
+
const qwikIcons = require("@nr1e/qwik-icons");
|
|
6
|
+
function timeZoneToName(timezone) {
|
|
7
|
+
if (timezone === "auto") {
|
|
8
|
+
return "Auto (Browser)";
|
|
9
|
+
}
|
|
10
|
+
const parts = timezone.split("/");
|
|
11
|
+
if (parts.length === 2) {
|
|
12
|
+
return `${parts[0]}/${parts[1].replace(/_/g, " ")}`;
|
|
13
|
+
}
|
|
14
|
+
return timezone.replace(/_/g, " ");
|
|
15
|
+
}
|
|
16
|
+
const TIMEZONES = [
|
|
17
|
+
"auto",
|
|
18
|
+
// US & Canada
|
|
19
|
+
"America/New_York",
|
|
20
|
+
"America/Chicago",
|
|
21
|
+
"America/Denver",
|
|
22
|
+
"America/Los_Angeles",
|
|
23
|
+
"America/Anchorage",
|
|
24
|
+
"Pacific/Honolulu",
|
|
25
|
+
"America/Phoenix",
|
|
26
|
+
"America/Toronto",
|
|
27
|
+
"America/Vancouver",
|
|
28
|
+
// Latin America
|
|
29
|
+
"America/Mexico_City",
|
|
30
|
+
"America/Bogota",
|
|
31
|
+
"America/Lima",
|
|
32
|
+
"America/Santiago",
|
|
33
|
+
"America/Buenos_Aires",
|
|
34
|
+
"America/Sao_Paulo",
|
|
35
|
+
// Europe
|
|
36
|
+
"Europe/London",
|
|
37
|
+
"Europe/Paris",
|
|
38
|
+
"Europe/Berlin",
|
|
39
|
+
"Europe/Rome",
|
|
40
|
+
"Europe/Madrid",
|
|
41
|
+
"Europe/Amsterdam",
|
|
42
|
+
"Europe/Brussels",
|
|
43
|
+
"Europe/Vienna",
|
|
44
|
+
"Europe/Stockholm",
|
|
45
|
+
"Europe/Warsaw",
|
|
46
|
+
"Europe/Athens",
|
|
47
|
+
"Europe/Moscow",
|
|
48
|
+
"Europe/Istanbul",
|
|
49
|
+
// Asia
|
|
50
|
+
"Asia/Dubai",
|
|
51
|
+
"Asia/Kolkata",
|
|
52
|
+
"Asia/Singapore",
|
|
53
|
+
"Asia/Hong_Kong",
|
|
54
|
+
"Asia/Shanghai",
|
|
55
|
+
"Asia/Tokyo",
|
|
56
|
+
"Asia/Seoul",
|
|
57
|
+
"Asia/Bangkok",
|
|
58
|
+
"Asia/Jakarta",
|
|
59
|
+
"Asia/Manila",
|
|
60
|
+
// Africa
|
|
61
|
+
"Africa/Cairo",
|
|
62
|
+
"Africa/Johannesburg",
|
|
63
|
+
"Africa/Lagos",
|
|
64
|
+
"Africa/Nairobi",
|
|
65
|
+
// Australia & Pacific
|
|
66
|
+
"Australia/Sydney",
|
|
67
|
+
"Australia/Melbourne",
|
|
68
|
+
"Australia/Brisbane",
|
|
69
|
+
"Australia/Perth",
|
|
70
|
+
"Pacific/Auckland",
|
|
71
|
+
"Pacific/Fiji",
|
|
72
|
+
// Other
|
|
73
|
+
"UTC"
|
|
74
|
+
];
|
|
75
|
+
const TimeZoneSelector = qwik.component$((props) => {
|
|
76
|
+
const currentTimeZone = qwik.useSignal("auto");
|
|
77
|
+
qwik.useVisibleTask$(() => {
|
|
78
|
+
const savedTimeZone = localStorage.getItem("timezone");
|
|
79
|
+
currentTimeZone.value = savedTimeZone ?? "auto";
|
|
80
|
+
});
|
|
81
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", {
|
|
82
|
+
class: "dropdown",
|
|
83
|
+
children: [
|
|
84
|
+
/* @__PURE__ */ jsxRuntime.jsxs("button", {
|
|
85
|
+
role: "button",
|
|
86
|
+
tabIndex: 0,
|
|
87
|
+
class: "btn m-1",
|
|
88
|
+
children: [
|
|
89
|
+
timeZoneToName(currentTimeZone.value),
|
|
90
|
+
/* @__PURE__ */ jsxRuntime.jsx(qwikIcons.MdiChevronDown, {
|
|
91
|
+
size: 16,
|
|
92
|
+
class: "fill-current opacity-60"
|
|
93
|
+
})
|
|
94
|
+
]
|
|
95
|
+
}),
|
|
96
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", {
|
|
97
|
+
tabIndex: 0,
|
|
98
|
+
class: "dropdown-content card bg-base-100 z-1 shadow-md",
|
|
99
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", {
|
|
100
|
+
class: "card-body rounded-box z-1",
|
|
101
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", {
|
|
102
|
+
class: "grid min-w-50 grid-cols-1 gap-2 p-2 sm:min-w-100 sm:grid-cols-2 lg:min-w-150 lg:grid-cols-3",
|
|
103
|
+
children: (props?.timeZones ?? TIMEZONES).map((timezone) => /* @__PURE__ */ jsxRuntime.jsx("input", {
|
|
104
|
+
type: "radio",
|
|
105
|
+
name: "timezone-dropdown",
|
|
106
|
+
class: "btn btn-sm btn-ghost justify-start",
|
|
107
|
+
"aria-label": timeZoneToName(timezone),
|
|
108
|
+
value: timezone,
|
|
109
|
+
checked: timezone === currentTimeZone.value,
|
|
110
|
+
onChange$: () => {
|
|
111
|
+
currentTimeZone.value = timezone;
|
|
112
|
+
if (timezone === "auto") {
|
|
113
|
+
localStorage.removeItem("timezone");
|
|
114
|
+
} else {
|
|
115
|
+
localStorage.setItem("timezone", timezone);
|
|
116
|
+
}
|
|
117
|
+
const activeElement = document.activeElement;
|
|
118
|
+
if (activeElement) {
|
|
119
|
+
activeElement.blur();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}, timezone))
|
|
123
|
+
})
|
|
124
|
+
})
|
|
125
|
+
})
|
|
126
|
+
]
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
exports.TimeZoneSelector = TimeZoneSelector;
|
|
130
|
+
exports.timeZoneToName = timeZoneToName;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { jsxs, jsx } from "@builder.io/qwik/jsx-runtime";
|
|
2
|
+
import { component$, useSignal, useVisibleTask$ } from "@builder.io/qwik";
|
|
3
|
+
import { MdiChevronDown } from "@nr1e/qwik-icons";
|
|
4
|
+
function timeZoneToName(timezone) {
|
|
5
|
+
if (timezone === "auto") {
|
|
6
|
+
return "Auto (Browser)";
|
|
7
|
+
}
|
|
8
|
+
const parts = timezone.split("/");
|
|
9
|
+
if (parts.length === 2) {
|
|
10
|
+
return `${parts[0]}/${parts[1].replace(/_/g, " ")}`;
|
|
11
|
+
}
|
|
12
|
+
return timezone.replace(/_/g, " ");
|
|
13
|
+
}
|
|
14
|
+
const TIMEZONES = [
|
|
15
|
+
"auto",
|
|
16
|
+
// US & Canada
|
|
17
|
+
"America/New_York",
|
|
18
|
+
"America/Chicago",
|
|
19
|
+
"America/Denver",
|
|
20
|
+
"America/Los_Angeles",
|
|
21
|
+
"America/Anchorage",
|
|
22
|
+
"Pacific/Honolulu",
|
|
23
|
+
"America/Phoenix",
|
|
24
|
+
"America/Toronto",
|
|
25
|
+
"America/Vancouver",
|
|
26
|
+
// Latin America
|
|
27
|
+
"America/Mexico_City",
|
|
28
|
+
"America/Bogota",
|
|
29
|
+
"America/Lima",
|
|
30
|
+
"America/Santiago",
|
|
31
|
+
"America/Buenos_Aires",
|
|
32
|
+
"America/Sao_Paulo",
|
|
33
|
+
// Europe
|
|
34
|
+
"Europe/London",
|
|
35
|
+
"Europe/Paris",
|
|
36
|
+
"Europe/Berlin",
|
|
37
|
+
"Europe/Rome",
|
|
38
|
+
"Europe/Madrid",
|
|
39
|
+
"Europe/Amsterdam",
|
|
40
|
+
"Europe/Brussels",
|
|
41
|
+
"Europe/Vienna",
|
|
42
|
+
"Europe/Stockholm",
|
|
43
|
+
"Europe/Warsaw",
|
|
44
|
+
"Europe/Athens",
|
|
45
|
+
"Europe/Moscow",
|
|
46
|
+
"Europe/Istanbul",
|
|
47
|
+
// Asia
|
|
48
|
+
"Asia/Dubai",
|
|
49
|
+
"Asia/Kolkata",
|
|
50
|
+
"Asia/Singapore",
|
|
51
|
+
"Asia/Hong_Kong",
|
|
52
|
+
"Asia/Shanghai",
|
|
53
|
+
"Asia/Tokyo",
|
|
54
|
+
"Asia/Seoul",
|
|
55
|
+
"Asia/Bangkok",
|
|
56
|
+
"Asia/Jakarta",
|
|
57
|
+
"Asia/Manila",
|
|
58
|
+
// Africa
|
|
59
|
+
"Africa/Cairo",
|
|
60
|
+
"Africa/Johannesburg",
|
|
61
|
+
"Africa/Lagos",
|
|
62
|
+
"Africa/Nairobi",
|
|
63
|
+
// Australia & Pacific
|
|
64
|
+
"Australia/Sydney",
|
|
65
|
+
"Australia/Melbourne",
|
|
66
|
+
"Australia/Brisbane",
|
|
67
|
+
"Australia/Perth",
|
|
68
|
+
"Pacific/Auckland",
|
|
69
|
+
"Pacific/Fiji",
|
|
70
|
+
// Other
|
|
71
|
+
"UTC"
|
|
72
|
+
];
|
|
73
|
+
const TimeZoneSelector = component$((props) => {
|
|
74
|
+
const currentTimeZone = useSignal("auto");
|
|
75
|
+
useVisibleTask$(() => {
|
|
76
|
+
const savedTimeZone = localStorage.getItem("timezone");
|
|
77
|
+
currentTimeZone.value = savedTimeZone ?? "auto";
|
|
78
|
+
});
|
|
79
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
80
|
+
class: "dropdown",
|
|
81
|
+
children: [
|
|
82
|
+
/* @__PURE__ */ jsxs("button", {
|
|
83
|
+
role: "button",
|
|
84
|
+
tabIndex: 0,
|
|
85
|
+
class: "btn m-1",
|
|
86
|
+
children: [
|
|
87
|
+
timeZoneToName(currentTimeZone.value),
|
|
88
|
+
/* @__PURE__ */ jsx(MdiChevronDown, {
|
|
89
|
+
size: 16,
|
|
90
|
+
class: "fill-current opacity-60"
|
|
91
|
+
})
|
|
92
|
+
]
|
|
93
|
+
}),
|
|
94
|
+
/* @__PURE__ */ jsx("div", {
|
|
95
|
+
tabIndex: 0,
|
|
96
|
+
class: "dropdown-content card bg-base-100 z-1 shadow-md",
|
|
97
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
98
|
+
class: "card-body rounded-box z-1",
|
|
99
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
100
|
+
class: "grid min-w-50 grid-cols-1 gap-2 p-2 sm:min-w-100 sm:grid-cols-2 lg:min-w-150 lg:grid-cols-3",
|
|
101
|
+
children: (props?.timeZones ?? TIMEZONES).map((timezone) => /* @__PURE__ */ jsx("input", {
|
|
102
|
+
type: "radio",
|
|
103
|
+
name: "timezone-dropdown",
|
|
104
|
+
class: "btn btn-sm btn-ghost justify-start",
|
|
105
|
+
"aria-label": timeZoneToName(timezone),
|
|
106
|
+
value: timezone,
|
|
107
|
+
checked: timezone === currentTimeZone.value,
|
|
108
|
+
onChange$: () => {
|
|
109
|
+
currentTimeZone.value = timezone;
|
|
110
|
+
if (timezone === "auto") {
|
|
111
|
+
localStorage.removeItem("timezone");
|
|
112
|
+
} else {
|
|
113
|
+
localStorage.setItem("timezone", timezone);
|
|
114
|
+
}
|
|
115
|
+
const activeElement = document.activeElement;
|
|
116
|
+
if (activeElement) {
|
|
117
|
+
activeElement.blur();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}, timezone))
|
|
121
|
+
})
|
|
122
|
+
})
|
|
123
|
+
})
|
|
124
|
+
]
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
export {
|
|
128
|
+
TimeZoneSelector,
|
|
129
|
+
timeZoneToName
|
|
130
|
+
};
|
package/lib/index.qwik.cjs
CHANGED
|
@@ -17,6 +17,8 @@ const microsoftSignInButton = require("./components/microsoft-sign-in-button.qwi
|
|
|
17
17
|
const paceBar = require("./components/pace-bar.qwik.cjs");
|
|
18
18
|
const selectField = require("./components/select-field.qwik.cjs");
|
|
19
19
|
const textField = require("./components/text-field.qwik.cjs");
|
|
20
|
+
const themeSelector = require("./components/theme-selector.qwik.cjs");
|
|
21
|
+
const timeZoneSelector = require("./components/time-zone-selector.qwik.cjs");
|
|
20
22
|
const universalLayout = require("./components/universal-layout.qwik.cjs");
|
|
21
23
|
exports.AddButton = addButton.AddButton;
|
|
22
24
|
exports.AlertError = alertError.AlertError;
|
|
@@ -27,8 +29,9 @@ exports.AutoDismiss = autoDismiss.AutoDismiss;
|
|
|
27
29
|
exports.CheckboxField = checkboxField.CheckboxField;
|
|
28
30
|
exports.Dialog = dialog.Dialog;
|
|
29
31
|
exports.Dock = dock.Dock;
|
|
30
|
-
exports.
|
|
32
|
+
exports.DockButton = dock.DockButton;
|
|
31
33
|
exports.DockLabel = dock.DockLabel;
|
|
34
|
+
exports.DockLink = dock.DockLink;
|
|
32
35
|
exports.DropUp = dropUp.DropUp;
|
|
33
36
|
exports.DropUpButtonSelector = dropUp.DropUpButtonSelector;
|
|
34
37
|
exports.DropUpItem = dropUp.DropUpItem;
|
|
@@ -37,13 +40,19 @@ exports.GoogleSignInButton = googleSignInButton.GoogleSignInButton;
|
|
|
37
40
|
exports.GtmBody = gtm.GtmBody;
|
|
38
41
|
exports.GtmHead = gtm.GtmHead;
|
|
39
42
|
exports.Menu = menu.Menu;
|
|
43
|
+
exports.MenuButton = menu.MenuButton;
|
|
40
44
|
exports.MenuDivider = menu.MenuDivider;
|
|
41
45
|
exports.MenuGroup = menu.MenuGroup;
|
|
42
46
|
exports.MenuGroupSummary = menu.MenuGroupSummary;
|
|
43
|
-
exports.
|
|
47
|
+
exports.MenuLink = menu.MenuLink;
|
|
44
48
|
exports.Submenu = menu.Submenu;
|
|
45
49
|
exports.MicrosoftSignInButton = microsoftSignInButton.MicrosoftSignInButton;
|
|
46
50
|
exports.PaceBar = paceBar.PaceBar;
|
|
47
51
|
exports.SelectField = selectField.SelectField;
|
|
48
52
|
exports.TextField = textField.TextField;
|
|
53
|
+
exports.THEMES = themeSelector.THEMES;
|
|
54
|
+
exports.ThemeSelector = themeSelector.ThemeSelector;
|
|
55
|
+
exports.themeToName = themeSelector.themeToName;
|
|
56
|
+
exports.TimeZoneSelector = timeZoneSelector.TimeZoneSelector;
|
|
57
|
+
exports.timeZoneToName = timeZoneSelector.timeZoneToName;
|
|
49
58
|
exports.UniversalLayout = universalLayout.UniversalLayout;
|
package/lib/index.qwik.mjs
CHANGED
|
@@ -6,15 +6,17 @@ import { AlertWarning } from "./components/alert-warning.qwik.mjs";
|
|
|
6
6
|
import { AutoDismiss } from "./components/auto-dismiss.qwik.mjs";
|
|
7
7
|
import { CheckboxField } from "./components/checkbox-field.qwik.mjs";
|
|
8
8
|
import { Dialog } from "./components/dialog.qwik.mjs";
|
|
9
|
-
import { Dock,
|
|
9
|
+
import { Dock, DockButton, DockLabel, DockLink } from "./components/dock.qwik.mjs";
|
|
10
10
|
import { DropUp, DropUpButtonSelector, DropUpItem, DropUpSubmenu } from "./components/drop-up.qwik.mjs";
|
|
11
11
|
import { GoogleSignInButton } from "./components/google-sign-in-button.qwik.mjs";
|
|
12
12
|
import { GtmBody, GtmHead } from "./components/gtm.qwik.mjs";
|
|
13
|
-
import { Menu, MenuDivider, MenuGroup, MenuGroupSummary,
|
|
13
|
+
import { Menu, MenuButton, MenuDivider, MenuGroup, MenuGroupSummary, MenuLink, Submenu } from "./components/menu.qwik.mjs";
|
|
14
14
|
import { MicrosoftSignInButton } from "./components/microsoft-sign-in-button.qwik.mjs";
|
|
15
15
|
import { PaceBar } from "./components/pace-bar.qwik.mjs";
|
|
16
16
|
import { SelectField } from "./components/select-field.qwik.mjs";
|
|
17
17
|
import { TextField } from "./components/text-field.qwik.mjs";
|
|
18
|
+
import { THEMES, ThemeSelector, themeToName } from "./components/theme-selector.qwik.mjs";
|
|
19
|
+
import { TimeZoneSelector, timeZoneToName } from "./components/time-zone-selector.qwik.mjs";
|
|
18
20
|
import { UniversalLayout } from "./components/universal-layout.qwik.mjs";
|
|
19
21
|
export {
|
|
20
22
|
AddButton,
|
|
@@ -26,8 +28,9 @@ export {
|
|
|
26
28
|
CheckboxField,
|
|
27
29
|
Dialog,
|
|
28
30
|
Dock,
|
|
29
|
-
|
|
31
|
+
DockButton,
|
|
30
32
|
DockLabel,
|
|
33
|
+
DockLink,
|
|
31
34
|
DropUp,
|
|
32
35
|
DropUpButtonSelector,
|
|
33
36
|
DropUpItem,
|
|
@@ -36,14 +39,20 @@ export {
|
|
|
36
39
|
GtmBody,
|
|
37
40
|
GtmHead,
|
|
38
41
|
Menu,
|
|
42
|
+
MenuButton,
|
|
39
43
|
MenuDivider,
|
|
40
44
|
MenuGroup,
|
|
41
45
|
MenuGroupSummary,
|
|
42
|
-
|
|
46
|
+
MenuLink,
|
|
43
47
|
MicrosoftSignInButton,
|
|
44
48
|
PaceBar,
|
|
45
49
|
SelectField,
|
|
46
50
|
Submenu,
|
|
51
|
+
THEMES,
|
|
47
52
|
TextField,
|
|
48
|
-
|
|
53
|
+
ThemeSelector,
|
|
54
|
+
TimeZoneSelector,
|
|
55
|
+
UniversalLayout,
|
|
56
|
+
themeToName,
|
|
57
|
+
timeZoneToName
|
|
49
58
|
};
|
|
@@ -3,16 +3,22 @@ export interface DockLabelProps {
|
|
|
3
3
|
class?: string;
|
|
4
4
|
}
|
|
5
5
|
export declare const DockLabel: import("@builder.io/qwik").Component<DockLabelProps | undefined>;
|
|
6
|
-
export interface
|
|
7
|
-
|
|
6
|
+
export interface DockButtonProps {
|
|
7
|
+
class?: string;
|
|
8
|
+
selected?: boolean;
|
|
9
|
+
loading?: Signal<boolean>;
|
|
10
|
+
onClick$: QRL<(event: Event) => void>;
|
|
11
|
+
}
|
|
12
|
+
export declare const DockButton: import("@builder.io/qwik").Component<DockButtonProps>;
|
|
13
|
+
export interface DockLinkProps {
|
|
14
|
+
href: string;
|
|
8
15
|
prefetch?: boolean;
|
|
9
16
|
class?: string;
|
|
10
17
|
selected?: boolean;
|
|
11
18
|
loading?: Signal<boolean>;
|
|
12
19
|
onClick$?: QRL<(event: Event) => void>;
|
|
13
|
-
linkClass?: string;
|
|
14
20
|
}
|
|
15
|
-
export declare const
|
|
21
|
+
export declare const DockLink: import("@builder.io/qwik").Component<DockLinkProps>;
|
|
16
22
|
export interface DockProps {
|
|
17
23
|
class?: string;
|
|
18
24
|
}
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import { QRL, Signal } from '@builder.io/qwik';
|
|
2
|
-
export interface
|
|
3
|
-
|
|
2
|
+
export interface MenuButtonProps {
|
|
3
|
+
class?: string;
|
|
4
|
+
loading?: Signal<boolean>;
|
|
5
|
+
selected?: boolean;
|
|
6
|
+
onClick$: QRL<(event: Event) => void>;
|
|
7
|
+
linkClass?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare const MenuButton: import("@builder.io/qwik").Component<MenuButtonProps>;
|
|
10
|
+
export interface MenuLinkProps {
|
|
11
|
+
href: string;
|
|
4
12
|
prefetch?: boolean;
|
|
5
13
|
selected?: boolean;
|
|
6
14
|
loading?: Signal<boolean>;
|
|
@@ -8,7 +16,7 @@ export interface MenuItemProps {
|
|
|
8
16
|
class?: string;
|
|
9
17
|
linkClass?: string;
|
|
10
18
|
}
|
|
11
|
-
export declare const
|
|
19
|
+
export declare const MenuLink: import("@builder.io/qwik").Component<MenuLinkProps>;
|
|
12
20
|
export interface MenuGroupSummaryProps {
|
|
13
21
|
class?: string;
|
|
14
22
|
}
|
package/lib-types/index.d.ts
CHANGED
|
@@ -15,4 +15,6 @@ export * from './components/microsoft-sign-in-button';
|
|
|
15
15
|
export * from './components/pace-bar';
|
|
16
16
|
export * from './components/select-field';
|
|
17
17
|
export * from './components/text-field';
|
|
18
|
+
export * from './components/theme-selector';
|
|
19
|
+
export * from './components/time-zone-selector';
|
|
18
20
|
export * from './components/universal-layout';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nr1e/qwik-ui",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "NR1E Qwik UI Library",
|
|
5
5
|
"author": "NR1E, Inc.",
|
|
6
6
|
"publishConfig": {
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"peerDependencies": {
|
|
37
37
|
"@builder.io/qwik-city": "1.19.0",
|
|
38
38
|
"tailwindcss-animated": "2.0.0",
|
|
39
|
-
"@nr1e/qwik-icons": "0.0.
|
|
39
|
+
"@nr1e/qwik-icons": "0.0.20"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@builder.io/qwik": "1.19.0",
|