@leverege/imaginarium-ui 1.0.0-beta.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/LICENSE.md +3 -0
- package/README.md +4 -0
- package/dist/Card-CFK_M3Te.js +192 -0
- package/dist/Card-CFK_M3Te.js.map +1 -0
- package/dist/Card-Z-6q-k3a.cjs +2 -0
- package/dist/Card-Z-6q-k3a.cjs.map +1 -0
- package/dist/ImaginariumApp-CCSmWwRB.js +278 -0
- package/dist/ImaginariumApp-CCSmWwRB.js.map +1 -0
- package/dist/ImaginariumApp-DoCgiASz.cjs +2 -0
- package/dist/ImaginariumApp-DoCgiASz.cjs.map +1 -0
- package/dist/ImaginariumUI.d.ts +40 -0
- package/dist/ImaginariumUI.d.ts.map +1 -0
- package/dist/PluginSetup-Cauc3iMv.cjs +2 -0
- package/dist/PluginSetup-Cauc3iMv.cjs.map +1 -0
- package/dist/PluginSetup-DnpUFDph.js +459 -0
- package/dist/PluginSetup-DnpUFDph.js.map +1 -0
- package/dist/PluginSetup.d.ts +11 -0
- package/dist/PluginSetup.d.ts.map +1 -0
- package/dist/PluginTypes-Bt6202F8.js +7 -0
- package/dist/PluginTypes-Bt6202F8.js.map +1 -0
- package/dist/PluginTypes-DOX3G1ip.cjs +2 -0
- package/dist/PluginTypes-DOX3G1ip.cjs.map +1 -0
- package/dist/api/ImaginariumApiContext.d.ts +13 -0
- package/dist/api/ImaginariumApiContext.d.ts.map +1 -0
- package/dist/auth/LoginPage.d.ts +13 -0
- package/dist/auth/LoginPage.d.ts.map +1 -0
- package/dist/auth/RequireAuth.d.ts +23 -0
- package/dist/auth/RequireAuth.d.ts.map +1 -0
- package/dist/auth/index.d.ts +3 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/components/ui/Button.d.ts +12 -0
- package/dist/components/ui/Button.d.ts.map +1 -0
- package/dist/components/ui/Card.d.ts +9 -0
- package/dist/components/ui/Card.d.ts.map +1 -0
- package/dist/components/ui/Dialog.d.ts +20 -0
- package/dist/components/ui/Dialog.d.ts.map +1 -0
- package/dist/components/ui/Input.d.ts +4 -0
- package/dist/components/ui/Input.d.ts.map +1 -0
- package/dist/components/ui/Label.d.ts +6 -0
- package/dist/components/ui/Label.d.ts.map +1 -0
- package/dist/components/ui/Toast.d.ts +16 -0
- package/dist/components/ui/Toast.d.ts.map +1 -0
- package/dist/components/ui/Toaster.d.ts +2 -0
- package/dist/components/ui/Toaster.d.ts.map +1 -0
- package/dist/components/ui/Tooltip.d.ts +8 -0
- package/dist/components/ui/Tooltip.d.ts.map +1 -0
- package/dist/hooks/useToast.d.ts +45 -0
- package/dist/hooks/useToast.d.ts.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +122 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/plugins/PluginTypes.d.ts +4 -0
- package/dist/plugins/PluginTypes.d.ts.map +1 -0
- package/dist/plugins/index.d.ts +4 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/registry.d.ts +8 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/types.d.ts +21 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins.cjs +2 -0
- package/dist/plugins.cjs.map +1 -0
- package/dist/plugins.js +14 -0
- package/dist/plugins.js.map +1 -0
- package/dist/registry--NcHYEqp.js +31 -0
- package/dist/registry--NcHYEqp.js.map +1 -0
- package/dist/registry-Nyaf2ket.cjs +2 -0
- package/dist/registry-Nyaf2ket.cjs.map +1 -0
- package/dist/shell/AppNav.d.ts +17 -0
- package/dist/shell/AppNav.d.ts.map +1 -0
- package/dist/shell/ImaginariumApp.d.ts +15 -0
- package/dist/shell/ImaginariumApp.d.ts.map +1 -0
- package/dist/shell/Shell.d.ts +7 -0
- package/dist/shell/Shell.d.ts.map +1 -0
- package/dist/shell/index.d.ts +4 -0
- package/dist/shell/index.d.ts.map +1 -0
- package/dist/shell.cjs +2 -0
- package/dist/shell.cjs.map +1 -0
- package/dist/shell.js +7 -0
- package/dist/shell.js.map +1 -0
- package/dist/system/ImagineSystemNavItem.d.ts +9 -0
- package/dist/system/ImagineSystemNavItem.d.ts.map +1 -0
- package/dist/system/ImagineSystemPage.d.ts +8 -0
- package/dist/system/ImagineSystemPage.d.ts.map +1 -0
- package/dist/system/ImagineSystemView.d.ts +12 -0
- package/dist/system/ImagineSystemView.d.ts.map +1 -0
- package/dist/system/PluginSetup.d.ts +23 -0
- package/dist/system/PluginSetup.d.ts.map +1 -0
- package/dist/system/index.d.ts +7 -0
- package/dist/system/index.d.ts.map +1 -0
- package/dist/system/types.d.ts +22 -0
- package/dist/system/types.d.ts.map +1 -0
- package/dist/system.cjs +2 -0
- package/dist/system.cjs.map +1 -0
- package/dist/system.js +11 -0
- package/dist/system.js.map +1 -0
- package/dist/theme/tailwind-preset.cjs +2 -0
- package/dist/theme/tailwind-preset.cjs.map +1 -0
- package/dist/theme/tailwind-preset.d.ts +4 -0
- package/dist/theme/tailwind-preset.d.ts.map +1 -0
- package/dist/theme/tailwind-preset.js +62 -0
- package/dist/theme/tailwind-preset.js.map +1 -0
- package/lib/index.cjs +2 -0
- package/lib/index.js +122 -0
- package/package.json +82 -0
- package/src/ImaginariumUI.tsx +98 -0
- package/src/PluginSetup.ts +30 -0
- package/src/api/ImaginariumApiContext.tsx +54 -0
- package/src/auth/LoginPage.tsx +84 -0
- package/src/auth/RequireAuth.tsx +72 -0
- package/src/auth/index.ts +2 -0
- package/src/components/ui/Button.tsx +49 -0
- package/src/components/ui/Card.tsx +58 -0
- package/src/components/ui/Dialog.tsx +105 -0
- package/src/components/ui/Input.tsx +22 -0
- package/src/components/ui/Label.tsx +19 -0
- package/src/components/ui/Toast.tsx +106 -0
- package/src/components/ui/Toaster.tsx +29 -0
- package/src/components/ui/Tooltip.tsx +26 -0
- package/src/hooks/useToast.ts +130 -0
- package/src/index.ts +63 -0
- package/src/lib/utils.ts +6 -0
- package/src/plugins/PluginTypes.ts +3 -0
- package/src/plugins/index.ts +10 -0
- package/src/plugins/leverege-plugin.d.ts +20 -0
- package/src/plugins/registry.ts +31 -0
- package/src/plugins/types.ts +19 -0
- package/src/shell/AppNav.tsx +63 -0
- package/src/shell/ImaginariumApp.tsx +78 -0
- package/src/shell/Shell.tsx +46 -0
- package/src/shell/index.ts +3 -0
- package/src/system/ImagineSystemNavItem.ts +9 -0
- package/src/system/ImagineSystemPage.tsx +7 -0
- package/src/system/ImagineSystemView.tsx +423 -0
- package/src/system/PluginSetup.ts +57 -0
- package/src/system/index.ts +14 -0
- package/src/system/types.ts +24 -0
- package/src/theme/index.css +133 -0
- package/src/theme/tailwind-preset.ts +62 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
Copyright (c) 2026 - Leverege LLC
|
|
2
|
+
|
|
3
|
+
This proprietary software is owned by Leverege LLC ("Leverege") for its exclusive use except when otherwise noted. Any user of this software agrees to hold Leverege harmless for any and all damages or liabilities that arise out of the use of the software for any purpose. Leverege does not warrant suitability for any purpose. Except when noted, Leverege explicitly does not grant the user of the software any right to use, modify, or redistribute the source code for any purpose, and will pursue all legal remedies against violators as permitted under the laws of United States.
|
package/README.md
ADDED
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { jsx as n } from "react/jsx-runtime";
|
|
2
|
+
import * as o from "react";
|
|
3
|
+
import { createContext as w, useMemo as C, useContext as A } from "react";
|
|
4
|
+
import { Slot as E } from "@radix-ui/react-slot";
|
|
5
|
+
import { cva as _ } from "class-variance-authority";
|
|
6
|
+
import { clsx as I } from "clsx";
|
|
7
|
+
import { twMerge as N } from "tailwind-merge";
|
|
8
|
+
function c(...e) {
|
|
9
|
+
return N(I(e));
|
|
10
|
+
}
|
|
11
|
+
const O = _(
|
|
12
|
+
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover-elevate active-elevate-2",
|
|
13
|
+
{
|
|
14
|
+
variants: {
|
|
15
|
+
variant: {
|
|
16
|
+
default: "bg-primary text-primary-foreground border border-primary-border",
|
|
17
|
+
destructive: "bg-destructive text-destructive-foreground border border-destructive-border",
|
|
18
|
+
outline: "border [border-color:var(--button-outline)] shadow-xs active:shadow-none",
|
|
19
|
+
secondary: "border bg-secondary text-secondary-foreground border-secondary-border",
|
|
20
|
+
ghost: "border border-transparent"
|
|
21
|
+
},
|
|
22
|
+
size: {
|
|
23
|
+
default: "min-h-9 px-4 py-2",
|
|
24
|
+
sm: "min-h-8 rounded-md px-3 text-xs",
|
|
25
|
+
lg: "min-h-10 rounded-md px-8",
|
|
26
|
+
icon: "h-9 w-9"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
defaultVariants: { variant: "default", size: "default" }
|
|
30
|
+
}
|
|
31
|
+
), R = o.forwardRef(
|
|
32
|
+
({ className: e, variant: t, size: r, asChild: s = !1, ...a }, b) => /* @__PURE__ */ n(
|
|
33
|
+
s ? E : "button",
|
|
34
|
+
{
|
|
35
|
+
className: c(O({ variant: t, size: r, className: e })),
|
|
36
|
+
ref: b,
|
|
37
|
+
...a
|
|
38
|
+
}
|
|
39
|
+
)
|
|
40
|
+
);
|
|
41
|
+
R.displayName = "Button";
|
|
42
|
+
const D = 1, M = 1e6;
|
|
43
|
+
let T = 0;
|
|
44
|
+
function j() {
|
|
45
|
+
return T = (T + 1) % Number.MAX_SAFE_INTEGER, T.toString();
|
|
46
|
+
}
|
|
47
|
+
const g = /* @__PURE__ */ new Map(), x = (e) => {
|
|
48
|
+
if (g.has(e))
|
|
49
|
+
return;
|
|
50
|
+
const t = setTimeout(() => {
|
|
51
|
+
g.delete(e), f({ type: "REMOVE_TOAST", toastId: e });
|
|
52
|
+
}, M);
|
|
53
|
+
g.set(e, t);
|
|
54
|
+
}, P = (e, t) => {
|
|
55
|
+
switch (t.type) {
|
|
56
|
+
case "ADD_TOAST":
|
|
57
|
+
return {
|
|
58
|
+
...e,
|
|
59
|
+
toasts: [t.toast, ...e.toasts].slice(0, D)
|
|
60
|
+
};
|
|
61
|
+
case "UPDATE_TOAST":
|
|
62
|
+
return {
|
|
63
|
+
...e,
|
|
64
|
+
toasts: e.toasts.map((r) => r.id === t.toast.id ? { ...r, ...t.toast } : r)
|
|
65
|
+
};
|
|
66
|
+
case "DISMISS_TOAST": {
|
|
67
|
+
const { toastId: r } = t;
|
|
68
|
+
return r ? x(r) : e.toasts.forEach((s) => x(s.id)), {
|
|
69
|
+
...e,
|
|
70
|
+
toasts: e.toasts.map(
|
|
71
|
+
(s) => s.id === r || r === void 0 ? { ...s, open: !1 } : s
|
|
72
|
+
)
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
case "REMOVE_TOAST":
|
|
76
|
+
return t.toastId === void 0 ? { ...e, toasts: [] } : { ...e, toasts: e.toasts.filter((r) => r.id !== t.toastId) };
|
|
77
|
+
}
|
|
78
|
+
}, l = [];
|
|
79
|
+
let p = { toasts: [] };
|
|
80
|
+
function f(e) {
|
|
81
|
+
p = P(p, e), l.forEach((t) => t(p));
|
|
82
|
+
}
|
|
83
|
+
function V({ ...e }) {
|
|
84
|
+
const t = j(), r = (a) => f({ type: "UPDATE_TOAST", toast: { ...a, id: t } }), s = () => f({ type: "DISMISS_TOAST", toastId: t });
|
|
85
|
+
return f({
|
|
86
|
+
type: "ADD_TOAST",
|
|
87
|
+
toast: {
|
|
88
|
+
...e,
|
|
89
|
+
id: t,
|
|
90
|
+
open: !0,
|
|
91
|
+
onOpenChange: (a) => {
|
|
92
|
+
a || s();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}), { id: t, dismiss: s, update: r };
|
|
96
|
+
}
|
|
97
|
+
function Y() {
|
|
98
|
+
const [e, t] = o.useState(p);
|
|
99
|
+
return o.useEffect(() => (l.push(t), () => {
|
|
100
|
+
const r = l.indexOf(t);
|
|
101
|
+
r > -1 && l.splice(r, 1);
|
|
102
|
+
}), [e]), {
|
|
103
|
+
...e,
|
|
104
|
+
toast: V,
|
|
105
|
+
dismiss: (r) => f({ type: "DISMISS_TOAST", toastId: r })
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const y = w(null);
|
|
109
|
+
function q({ apiBaseUrl: e = "/api", children: t }) {
|
|
110
|
+
const r = C(() => {
|
|
111
|
+
const s = e.replace(/\/$/, ""), a = (u) => `${s}${u.startsWith("/") ? u : `/${u}`}`;
|
|
112
|
+
return { apiBaseUrl: s, buildUrl: a, fetchJson: async (u, d) => {
|
|
113
|
+
var h;
|
|
114
|
+
const v = new Headers(d == null ? void 0 : d.headers);
|
|
115
|
+
d != null && d.body && !v.has("Content-Type") && v.set("Content-Type", "application/json");
|
|
116
|
+
const m = await fetch(a(u), {
|
|
117
|
+
credentials: "include",
|
|
118
|
+
...d,
|
|
119
|
+
headers: v
|
|
120
|
+
}), i = ((h = m.headers.get("content-type")) == null ? void 0 : h.includes("application/json")) && m.status !== 204 ? await m.json() : void 0;
|
|
121
|
+
if (!m.ok) {
|
|
122
|
+
const S = (i == null ? void 0 : i.error) || (i == null ? void 0 : i.message) || m.statusText;
|
|
123
|
+
throw new Error(S);
|
|
124
|
+
}
|
|
125
|
+
return i;
|
|
126
|
+
} };
|
|
127
|
+
}, [e]);
|
|
128
|
+
return /* @__PURE__ */ n(y.Provider, { value: r, children: t });
|
|
129
|
+
}
|
|
130
|
+
function K() {
|
|
131
|
+
const e = A(y);
|
|
132
|
+
if (!e)
|
|
133
|
+
throw new Error("useImaginariumApi must be used within an ImaginariumApiProvider");
|
|
134
|
+
return e;
|
|
135
|
+
}
|
|
136
|
+
const J = o.forwardRef(
|
|
137
|
+
({ className: e, ...t }, r) => /* @__PURE__ */ n(
|
|
138
|
+
"div",
|
|
139
|
+
{
|
|
140
|
+
ref: r,
|
|
141
|
+
className: c(
|
|
142
|
+
"shadcn-card rounded-xl border bg-card border-card-border text-card-foreground shadow-sm",
|
|
143
|
+
e
|
|
144
|
+
),
|
|
145
|
+
...t
|
|
146
|
+
}
|
|
147
|
+
)
|
|
148
|
+
);
|
|
149
|
+
J.displayName = "Card";
|
|
150
|
+
const $ = o.forwardRef(
|
|
151
|
+
({ className: e, ...t }, r) => /* @__PURE__ */ n("div", { ref: r, className: c("flex flex-col space-y-1.5 p-6", e), ...t })
|
|
152
|
+
);
|
|
153
|
+
$.displayName = "CardHeader";
|
|
154
|
+
const k = o.forwardRef(
|
|
155
|
+
({ className: e, ...t }, r) => /* @__PURE__ */ n(
|
|
156
|
+
"div",
|
|
157
|
+
{
|
|
158
|
+
ref: r,
|
|
159
|
+
className: c("text-2xl font-semibold leading-none tracking-tight", e),
|
|
160
|
+
...t
|
|
161
|
+
}
|
|
162
|
+
)
|
|
163
|
+
);
|
|
164
|
+
k.displayName = "CardTitle";
|
|
165
|
+
const z = o.forwardRef(
|
|
166
|
+
({ className: e, ...t }, r) => /* @__PURE__ */ n("div", { ref: r, className: c("text-sm text-muted-foreground", e), ...t })
|
|
167
|
+
);
|
|
168
|
+
z.displayName = "CardDescription";
|
|
169
|
+
const B = o.forwardRef(
|
|
170
|
+
({ className: e, ...t }, r) => /* @__PURE__ */ n("div", { ref: r, className: c("p-6 pt-0", e), ...t })
|
|
171
|
+
);
|
|
172
|
+
B.displayName = "CardContent";
|
|
173
|
+
const F = o.forwardRef(
|
|
174
|
+
({ className: e, ...t }, r) => /* @__PURE__ */ n("div", { ref: r, className: c("flex items-center p-6 pt-0", e), ...t })
|
|
175
|
+
);
|
|
176
|
+
F.displayName = "CardFooter";
|
|
177
|
+
export {
|
|
178
|
+
R as B,
|
|
179
|
+
J as C,
|
|
180
|
+
q as I,
|
|
181
|
+
B as a,
|
|
182
|
+
z as b,
|
|
183
|
+
F as c,
|
|
184
|
+
$ as d,
|
|
185
|
+
k as e,
|
|
186
|
+
O as f,
|
|
187
|
+
c as g,
|
|
188
|
+
Y as h,
|
|
189
|
+
V as t,
|
|
190
|
+
K as u
|
|
191
|
+
};
|
|
192
|
+
//# sourceMappingURL=Card-CFK_M3Te.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Card-CFK_M3Te.js","sources":["../src/lib/utils.ts","../src/components/ui/Button.tsx","../src/hooks/useToast.ts","../src/api/ImaginariumApiContext.tsx","../src/components/ui/Card.tsx"],"sourcesContent":["import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn( ...inputs: ClassValue[] ) {\n return twMerge( clsx( inputs ) )\n}\n","import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../../lib/utils'\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover-elevate active-elevate-2',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground border border-primary-border',\n destructive: 'bg-destructive text-destructive-foreground border border-destructive-border',\n outline: 'border [border-color:var(--button-outline)] shadow-xs active:shadow-none',\n secondary: 'border bg-secondary text-secondary-foreground border-secondary-border',\n ghost: 'border border-transparent',\n },\n size: {\n default: 'min-h-9 px-4 py-2',\n sm: 'min-h-8 rounded-md px-3 text-xs',\n lg: 'min-h-10 rounded-md px-8',\n icon: 'h-9 w-9',\n },\n },\n defaultVariants: { variant: 'default', size: 'default' },\n },\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ( { className, variant, size, asChild = false, ...props }, ref ) => {\n const Comp = asChild ? Slot : 'button'\n return (\n <Comp\n className={cn( buttonVariants( { variant, size, className } ) )}\n ref={ref}\n {...props}\n />\n )\n },\n)\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n","import * as React from 'react'\n\nimport type { ToastActionElement, ToastProps } from '../components/ui/Toast'\n\nconst TOAST_LIMIT = 1\nconst TOAST_REMOVE_DELAY = 1_000_000\n\ntype ToasterToast = ToastProps & {\n id: string\n title?: React.ReactNode\n description?: React.ReactNode\n action?: ToastActionElement\n}\n\nconst actionTypes = {\n ADD_TOAST: 'ADD_TOAST',\n UPDATE_TOAST: 'UPDATE_TOAST',\n DISMISS_TOAST: 'DISMISS_TOAST',\n REMOVE_TOAST: 'REMOVE_TOAST',\n} as const\n\nlet count = 0\nfunction genId() {\n count = ( count + 1 ) % Number.MAX_SAFE_INTEGER\n return count.toString()\n}\n\ntype ActionType = typeof actionTypes\ntype Action =\n | { type: ActionType['ADD_TOAST']; toast: ToasterToast }\n | { type: ActionType['UPDATE_TOAST']; toast: Partial<ToasterToast> }\n | { type: ActionType['DISMISS_TOAST']; toastId?: ToasterToast['id'] }\n | { type: ActionType['REMOVE_TOAST']; toastId?: ToasterToast['id'] }\n\ninterface State {\n toasts: ToasterToast[]\n}\n\nconst toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>()\n\nconst addToRemoveQueue = ( toastId: string ) => {\n if ( toastTimeouts.has( toastId ) ) { return }\n const timeout = setTimeout( () => {\n toastTimeouts.delete( toastId )\n dispatch( { type: 'REMOVE_TOAST', toastId } )\n }, TOAST_REMOVE_DELAY )\n toastTimeouts.set( toastId, timeout )\n}\n\nexport const reducer = ( state: State, action: Action ): State => {\n switch ( action.type ) {\n case 'ADD_TOAST':\n return {\n ...state,\n toasts: [ action.toast, ...state.toasts ].slice( 0, TOAST_LIMIT ),\n }\n case 'UPDATE_TOAST':\n return {\n ...state,\n toasts: state.toasts.map( t => ( t.id === action.toast.id ? { ...t, ...action.toast } : t ) ),\n }\n case 'DISMISS_TOAST': {\n const { toastId } = action\n if ( toastId ) {\n addToRemoveQueue( toastId )\n } else {\n state.toasts.forEach( t => addToRemoveQueue( t.id ) )\n }\n return {\n ...state,\n toasts: state.toasts.map( t =>\n t.id === toastId || toastId === undefined ? { ...t, open: false } : t,\n ),\n }\n }\n case 'REMOVE_TOAST':\n if ( action.toastId === undefined ) {\n return { ...state, toasts: [] }\n }\n return { ...state, toasts: state.toasts.filter( t => t.id !== action.toastId ) }\n }\n}\n\nconst listeners: Array<( state: State ) => void> = []\nlet memoryState: State = { toasts: [] }\n\nfunction dispatch( action: Action ) {\n memoryState = reducer( memoryState, action )\n listeners.forEach( l => l( memoryState ) )\n}\n\ntype Toast = Omit<ToasterToast, 'id'>\n\nfunction toast( { ...props }: Toast ) {\n const id = genId()\n const update = ( p: ToasterToast ) =>\n dispatch( { type: 'UPDATE_TOAST', toast: { ...p, id } } )\n const dismiss = () => dispatch( { type: 'DISMISS_TOAST', toastId: id } )\n\n dispatch( {\n type: 'ADD_TOAST',\n toast: {\n ...props,\n id,\n open: true,\n onOpenChange: ( open ) => {\n if ( !open ) { dismiss() }\n },\n },\n } )\n return { id, dismiss, update }\n}\n\nfunction useToast() {\n const [ state, setState ] = React.useState<State>( memoryState )\n React.useEffect( () => {\n listeners.push( setState )\n return () => {\n const index = listeners.indexOf( setState )\n if ( index > -1 ) { listeners.splice( index, 1 ) }\n }\n }, [ state ] )\n return {\n ...state,\n toast,\n dismiss: ( toastId?: string ) => dispatch( { type: 'DISMISS_TOAST', toastId } ),\n }\n}\n\nexport { useToast, toast }\n","import { createContext, useContext, useMemo, type ReactNode } from 'react'\n\nexport interface ImaginariumApiContextValue {\n apiBaseUrl: string\n fetchJson: <T = unknown>( path: string, init?: RequestInit ) => Promise<T>\n buildUrl: ( path: string ) => string\n}\n\nconst Context = createContext<ImaginariumApiContextValue | null>( null )\n\nexport interface ImaginariumApiProviderProps {\n apiBaseUrl?: string\n children: ReactNode\n}\n\nexport function ImaginariumApiProvider( { apiBaseUrl = '/api', children }: ImaginariumApiProviderProps ) {\n const value = useMemo<ImaginariumApiContextValue>( () => {\n const base = apiBaseUrl.replace( /\\/$/, '' )\n const buildUrl = ( path: string ) => `${base}${path.startsWith( '/' ) ? path : `/${path}`}`\n\n const fetchJson = async <T = unknown>( path: string, init?: RequestInit ): Promise<T> => {\n const headers = new Headers( init?.headers )\n if ( init?.body && !headers.has( 'Content-Type' ) ) {\n headers.set( 'Content-Type', 'application/json' )\n }\n const res = await fetch( buildUrl( path ), {\n credentials: 'include',\n ...init,\n headers,\n } )\n const isJson = res.headers.get( 'content-type' )?.includes( 'application/json' )\n const body = isJson && res.status !== 204 ? await res.json() : undefined\n if ( !res.ok ) {\n const msg = ( body as { error?: string; message?: string } | undefined )?.error\n || ( body as { message?: string } | undefined )?.message\n || res.statusText\n throw new Error( msg )\n }\n return body as T\n }\n\n return { apiBaseUrl: base, buildUrl, fetchJson }\n }, [ apiBaseUrl ] )\n\n return <Context.Provider value={value}>{children}</Context.Provider>\n}\n\nexport function useImaginariumApi() {\n const ctx = useContext( Context )\n if ( !ctx ) {\n throw new Error( 'useImaginariumApi must be used within an ImaginariumApiProvider' )\n }\n return ctx\n}\n","import * as React from 'react'\n\nimport { cn } from '../../lib/utils'\n\nconst Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ( { className, ...props }, ref ) => (\n <div\n ref={ref}\n className={cn(\n 'shadcn-card rounded-xl border bg-card border-card-border text-card-foreground shadow-sm',\n className,\n )}\n {...props}\n />\n ),\n)\nCard.displayName = 'Card'\n\nconst CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ( { className, ...props }, ref ) => (\n <div ref={ref} className={cn( 'flex flex-col space-y-1.5 p-6', className )} {...props} />\n ),\n)\nCardHeader.displayName = 'CardHeader'\n\nconst CardTitle = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ( { className, ...props }, ref ) => (\n <div\n ref={ref}\n className={cn( 'text-2xl font-semibold leading-none tracking-tight', className )}\n {...props}\n />\n ),\n)\nCardTitle.displayName = 'CardTitle'\n\nconst CardDescription = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ( { className, ...props }, ref ) => (\n <div ref={ref} className={cn( 'text-sm text-muted-foreground', className )} {...props} />\n ),\n)\nCardDescription.displayName = 'CardDescription'\n\nconst CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ( { className, ...props }, ref ) => (\n <div ref={ref} className={cn( 'p-6 pt-0', className )} {...props} />\n ),\n)\nCardContent.displayName = 'CardContent'\n\nconst CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ( { className, ...props }, ref ) => (\n <div ref={ref} className={cn( 'flex items-center p-6 pt-0', className )} {...props} />\n ),\n)\nCardFooter.displayName = 'CardFooter'\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n"],"names":["cn","inputs","twMerge","clsx","buttonVariants","cva","Button","React","className","variant","size","asChild","props","ref","jsx","Slot","TOAST_LIMIT","TOAST_REMOVE_DELAY","count","genId","toastTimeouts","addToRemoveQueue","toastId","timeout","dispatch","reducer","state","action","t","listeners","memoryState","l","toast","id","update","p","dismiss","open","useToast","setState","index","Context","createContext","ImaginariumApiProvider","apiBaseUrl","children","value","useMemo","base","buildUrl","path","init","headers","res","body","_a","msg","useImaginariumApi","ctx","useContext","Card","CardHeader","CardTitle","CardDescription","CardContent","CardFooter"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const a=require("react/jsx-runtime"),g=require("react"),R=require("@radix-ui/react-slot"),M=require("class-variance-authority"),P=require("clsx"),V=require("tailwind-merge");function q(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const s=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,s.get?s:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const o=q(g);function i(...e){return V.twMerge(P.clsx(e))}const S=M.cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover-elevate active-elevate-2",{variants:{variant:{default:"bg-primary text-primary-foreground border border-primary-border",destructive:"bg-destructive text-destructive-foreground border border-destructive-border",outline:"border [border-color:var(--button-outline)] shadow-xs active:shadow-none",secondary:"border bg-secondary text-secondary-foreground border-secondary-border",ghost:"border border-transparent"},size:{default:"min-h-9 px-4 py-2",sm:"min-h-8 rounded-md px-3 text-xs",lg:"min-h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),C=o.forwardRef(({className:e,variant:t,size:r,asChild:s=!1,...n},T)=>{const d=s?R.Slot:"button";return a.jsx(d,{className:i(S({variant:t,size:r,className:e})),ref:T,...n})});C.displayName="Button";const k=1,z=1e6;let v=0;function F(){return v=(v+1)%Number.MAX_SAFE_INTEGER,v.toString()}const x=new Map,h=e=>{if(x.has(e))return;const t=setTimeout(()=>{x.delete(e),f({type:"REMOVE_TOAST",toastId:e})},z);x.set(e,t)},H=(e,t)=>{switch(t.type){case"ADD_TOAST":return{...e,toasts:[t.toast,...e.toasts].slice(0,k)};case"UPDATE_TOAST":return{...e,toasts:e.toasts.map(r=>r.id===t.toast.id?{...r,...t.toast}:r)};case"DISMISS_TOAST":{const{toastId:r}=t;return r?h(r):e.toasts.forEach(s=>h(s.id)),{...e,toasts:e.toasts.map(s=>s.id===r||r===void 0?{...s,open:!1}:s)}}case"REMOVE_TOAST":return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(r=>r.id!==t.toastId)}}},m=[];let p={toasts:[]};function f(e){p=H(p,e),m.forEach(t=>t(p))}function w({...e}){const t=F(),r=n=>f({type:"UPDATE_TOAST",toast:{...n,id:t}}),s=()=>f({type:"DISMISS_TOAST",toastId:t});return f({type:"ADD_TOAST",toast:{...e,id:t,open:!0,onOpenChange:n=>{n||s()}}}),{id:t,dismiss:s,update:r}}function J(){const[e,t]=o.useState(p);return o.useEffect(()=>(m.push(t),()=>{const r=m.indexOf(t);r>-1&&m.splice(r,1)}),[e]),{...e,toast:w,dismiss:r=>f({type:"DISMISS_TOAST",toastId:r})}}const A=g.createContext(null);function $({apiBaseUrl:e="/api",children:t}){const r=g.useMemo(()=>{const s=e.replace(/\/$/,""),n=d=>`${s}${d.startsWith("/")?d:`/${d}`}`;return{apiBaseUrl:s,buildUrl:n,fetchJson:async(d,c)=>{var y;const b=new Headers(c==null?void 0:c.headers);c!=null&&c.body&&!b.has("Content-Type")&&b.set("Content-Type","application/json");const l=await fetch(n(d),{credentials:"include",...c,headers:b}),u=((y=l.headers.get("content-type"))==null?void 0:y.includes("application/json"))&&l.status!==204?await l.json():void 0;if(!l.ok){const D=(u==null?void 0:u.error)||(u==null?void 0:u.message)||l.statusText;throw new Error(D)}return u}}},[e]);return a.jsx(A.Provider,{value:r,children:t})}function B(){const e=g.useContext(A);if(!e)throw new Error("useImaginariumApi must be used within an ImaginariumApiProvider");return e}const O=o.forwardRef(({className:e,...t},r)=>a.jsx("div",{ref:r,className:i("shadcn-card rounded-xl border bg-card border-card-border text-card-foreground shadow-sm",e),...t}));O.displayName="Card";const _=o.forwardRef(({className:e,...t},r)=>a.jsx("div",{ref:r,className:i("flex flex-col space-y-1.5 p-6",e),...t}));_.displayName="CardHeader";const j=o.forwardRef(({className:e,...t},r)=>a.jsx("div",{ref:r,className:i("text-2xl font-semibold leading-none tracking-tight",e),...t}));j.displayName="CardTitle";const E=o.forwardRef(({className:e,...t},r)=>a.jsx("div",{ref:r,className:i("text-sm text-muted-foreground",e),...t}));E.displayName="CardDescription";const I=o.forwardRef(({className:e,...t},r)=>a.jsx("div",{ref:r,className:i("p-6 pt-0",e),...t}));I.displayName="CardContent";const N=o.forwardRef(({className:e,...t},r)=>a.jsx("div",{ref:r,className:i("flex items-center p-6 pt-0",e),...t}));N.displayName="CardFooter";exports.Button=C;exports.Card=O;exports.CardContent=I;exports.CardDescription=E;exports.CardFooter=N;exports.CardHeader=_;exports.CardTitle=j;exports.ImaginariumApiProvider=$;exports.buttonVariants=S;exports.cn=i;exports.toast=w;exports.useImaginariumApi=B;exports.useToast=J;
|
|
2
|
+
//# sourceMappingURL=Card-Z-6q-k3a.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Card-Z-6q-k3a.cjs","sources":["../src/lib/utils.ts","../src/components/ui/Button.tsx","../src/hooks/useToast.ts","../src/api/ImaginariumApiContext.tsx","../src/components/ui/Card.tsx"],"sourcesContent":["import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn( ...inputs: ClassValue[] ) {\n return twMerge( clsx( inputs ) )\n}\n","import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../../lib/utils'\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover-elevate active-elevate-2',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground border border-primary-border',\n destructive: 'bg-destructive text-destructive-foreground border border-destructive-border',\n outline: 'border [border-color:var(--button-outline)] shadow-xs active:shadow-none',\n secondary: 'border bg-secondary text-secondary-foreground border-secondary-border',\n ghost: 'border border-transparent',\n },\n size: {\n default: 'min-h-9 px-4 py-2',\n sm: 'min-h-8 rounded-md px-3 text-xs',\n lg: 'min-h-10 rounded-md px-8',\n icon: 'h-9 w-9',\n },\n },\n defaultVariants: { variant: 'default', size: 'default' },\n },\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ( { className, variant, size, asChild = false, ...props }, ref ) => {\n const Comp = asChild ? Slot : 'button'\n return (\n <Comp\n className={cn( buttonVariants( { variant, size, className } ) )}\n ref={ref}\n {...props}\n />\n )\n },\n)\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n","import * as React from 'react'\n\nimport type { ToastActionElement, ToastProps } from '../components/ui/Toast'\n\nconst TOAST_LIMIT = 1\nconst TOAST_REMOVE_DELAY = 1_000_000\n\ntype ToasterToast = ToastProps & {\n id: string\n title?: React.ReactNode\n description?: React.ReactNode\n action?: ToastActionElement\n}\n\nconst actionTypes = {\n ADD_TOAST: 'ADD_TOAST',\n UPDATE_TOAST: 'UPDATE_TOAST',\n DISMISS_TOAST: 'DISMISS_TOAST',\n REMOVE_TOAST: 'REMOVE_TOAST',\n} as const\n\nlet count = 0\nfunction genId() {\n count = ( count + 1 ) % Number.MAX_SAFE_INTEGER\n return count.toString()\n}\n\ntype ActionType = typeof actionTypes\ntype Action =\n | { type: ActionType['ADD_TOAST']; toast: ToasterToast }\n | { type: ActionType['UPDATE_TOAST']; toast: Partial<ToasterToast> }\n | { type: ActionType['DISMISS_TOAST']; toastId?: ToasterToast['id'] }\n | { type: ActionType['REMOVE_TOAST']; toastId?: ToasterToast['id'] }\n\ninterface State {\n toasts: ToasterToast[]\n}\n\nconst toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>()\n\nconst addToRemoveQueue = ( toastId: string ) => {\n if ( toastTimeouts.has( toastId ) ) { return }\n const timeout = setTimeout( () => {\n toastTimeouts.delete( toastId )\n dispatch( { type: 'REMOVE_TOAST', toastId } )\n }, TOAST_REMOVE_DELAY )\n toastTimeouts.set( toastId, timeout )\n}\n\nexport const reducer = ( state: State, action: Action ): State => {\n switch ( action.type ) {\n case 'ADD_TOAST':\n return {\n ...state,\n toasts: [ action.toast, ...state.toasts ].slice( 0, TOAST_LIMIT ),\n }\n case 'UPDATE_TOAST':\n return {\n ...state,\n toasts: state.toasts.map( t => ( t.id === action.toast.id ? { ...t, ...action.toast } : t ) ),\n }\n case 'DISMISS_TOAST': {\n const { toastId } = action\n if ( toastId ) {\n addToRemoveQueue( toastId )\n } else {\n state.toasts.forEach( t => addToRemoveQueue( t.id ) )\n }\n return {\n ...state,\n toasts: state.toasts.map( t =>\n t.id === toastId || toastId === undefined ? { ...t, open: false } : t,\n ),\n }\n }\n case 'REMOVE_TOAST':\n if ( action.toastId === undefined ) {\n return { ...state, toasts: [] }\n }\n return { ...state, toasts: state.toasts.filter( t => t.id !== action.toastId ) }\n }\n}\n\nconst listeners: Array<( state: State ) => void> = []\nlet memoryState: State = { toasts: [] }\n\nfunction dispatch( action: Action ) {\n memoryState = reducer( memoryState, action )\n listeners.forEach( l => l( memoryState ) )\n}\n\ntype Toast = Omit<ToasterToast, 'id'>\n\nfunction toast( { ...props }: Toast ) {\n const id = genId()\n const update = ( p: ToasterToast ) =>\n dispatch( { type: 'UPDATE_TOAST', toast: { ...p, id } } )\n const dismiss = () => dispatch( { type: 'DISMISS_TOAST', toastId: id } )\n\n dispatch( {\n type: 'ADD_TOAST',\n toast: {\n ...props,\n id,\n open: true,\n onOpenChange: ( open ) => {\n if ( !open ) { dismiss() }\n },\n },\n } )\n return { id, dismiss, update }\n}\n\nfunction useToast() {\n const [ state, setState ] = React.useState<State>( memoryState )\n React.useEffect( () => {\n listeners.push( setState )\n return () => {\n const index = listeners.indexOf( setState )\n if ( index > -1 ) { listeners.splice( index, 1 ) }\n }\n }, [ state ] )\n return {\n ...state,\n toast,\n dismiss: ( toastId?: string ) => dispatch( { type: 'DISMISS_TOAST', toastId } ),\n }\n}\n\nexport { useToast, toast }\n","import { createContext, useContext, useMemo, type ReactNode } from 'react'\n\nexport interface ImaginariumApiContextValue {\n apiBaseUrl: string\n fetchJson: <T = unknown>( path: string, init?: RequestInit ) => Promise<T>\n buildUrl: ( path: string ) => string\n}\n\nconst Context = createContext<ImaginariumApiContextValue | null>( null )\n\nexport interface ImaginariumApiProviderProps {\n apiBaseUrl?: string\n children: ReactNode\n}\n\nexport function ImaginariumApiProvider( { apiBaseUrl = '/api', children }: ImaginariumApiProviderProps ) {\n const value = useMemo<ImaginariumApiContextValue>( () => {\n const base = apiBaseUrl.replace( /\\/$/, '' )\n const buildUrl = ( path: string ) => `${base}${path.startsWith( '/' ) ? path : `/${path}`}`\n\n const fetchJson = async <T = unknown>( path: string, init?: RequestInit ): Promise<T> => {\n const headers = new Headers( init?.headers )\n if ( init?.body && !headers.has( 'Content-Type' ) ) {\n headers.set( 'Content-Type', 'application/json' )\n }\n const res = await fetch( buildUrl( path ), {\n credentials: 'include',\n ...init,\n headers,\n } )\n const isJson = res.headers.get( 'content-type' )?.includes( 'application/json' )\n const body = isJson && res.status !== 204 ? await res.json() : undefined\n if ( !res.ok ) {\n const msg = ( body as { error?: string; message?: string } | undefined )?.error\n || ( body as { message?: string } | undefined )?.message\n || res.statusText\n throw new Error( msg )\n }\n return body as T\n }\n\n return { apiBaseUrl: base, buildUrl, fetchJson }\n }, [ apiBaseUrl ] )\n\n return <Context.Provider value={value}>{children}</Context.Provider>\n}\n\nexport function useImaginariumApi() {\n const ctx = useContext( Context )\n if ( !ctx ) {\n throw new Error( 'useImaginariumApi must be used within an ImaginariumApiProvider' )\n }\n return ctx\n}\n","import * as React from 'react'\n\nimport { cn } from '../../lib/utils'\n\nconst Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ( { className, ...props }, ref ) => (\n <div\n ref={ref}\n className={cn(\n 'shadcn-card rounded-xl border bg-card border-card-border text-card-foreground shadow-sm',\n className,\n )}\n {...props}\n />\n ),\n)\nCard.displayName = 'Card'\n\nconst CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ( { className, ...props }, ref ) => (\n <div ref={ref} className={cn( 'flex flex-col space-y-1.5 p-6', className )} {...props} />\n ),\n)\nCardHeader.displayName = 'CardHeader'\n\nconst CardTitle = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ( { className, ...props }, ref ) => (\n <div\n ref={ref}\n className={cn( 'text-2xl font-semibold leading-none tracking-tight', className )}\n {...props}\n />\n ),\n)\nCardTitle.displayName = 'CardTitle'\n\nconst CardDescription = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ( { className, ...props }, ref ) => (\n <div ref={ref} className={cn( 'text-sm text-muted-foreground', className )} {...props} />\n ),\n)\nCardDescription.displayName = 'CardDescription'\n\nconst CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ( { className, ...props }, ref ) => (\n <div ref={ref} className={cn( 'p-6 pt-0', className )} {...props} />\n ),\n)\nCardContent.displayName = 'CardContent'\n\nconst CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ( { className, ...props }, ref ) => (\n <div ref={ref} className={cn( 'flex items-center p-6 pt-0', className )} {...props} />\n ),\n)\nCardFooter.displayName = 'CardFooter'\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n"],"names":["cn","inputs","twMerge","clsx","buttonVariants","cva","Button","React","className","variant","size","asChild","props","ref","Comp","Slot","jsx","TOAST_LIMIT","TOAST_REMOVE_DELAY","count","genId","toastTimeouts","addToRemoveQueue","toastId","timeout","dispatch","reducer","state","action","t","listeners","memoryState","l","toast","id","update","p","dismiss","open","useToast","setState","index","Context","createContext","ImaginariumApiProvider","apiBaseUrl","children","value","useMemo","base","buildUrl","path","init","headers","res","body","_a","msg","useImaginariumApi","ctx","useContext","Card","CardHeader","CardTitle","CardDescription","CardContent","CardFooter"],"mappings":"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"}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import { jsxs as s, jsx as e, Fragment as R } from "react/jsx-runtime";
|
|
2
|
+
import * as u from "react";
|
|
3
|
+
import { isValidElement as k, createElement as x, useMemo as S } from "react";
|
|
4
|
+
import { useQuery as z, QueryClient as E, QueryClientProvider as B } from "@tanstack/react-query";
|
|
5
|
+
import { Config as c } from "@leverege/plugin";
|
|
6
|
+
import * as g from "@radix-ui/react-tooltip";
|
|
7
|
+
import { B as w, g as p, h as L, C as V, d as $, e as j, b as q, a as F, u as M, I as G } from "./Card-CFK_M3Te.js";
|
|
8
|
+
import * as d from "@radix-ui/react-toast";
|
|
9
|
+
import { cva as D } from "class-variance-authority";
|
|
10
|
+
import { X as H } from "lucide-react";
|
|
11
|
+
import { Switch as O, Route as b, useLocation as Q, Link as U } from "wouter";
|
|
12
|
+
import { d as W, e as _, g as J } from "./registry--NcHYEqp.js";
|
|
13
|
+
function K(t) {
|
|
14
|
+
const { element: a } = t;
|
|
15
|
+
return k(a) ? a : typeof a == "function" ? x(a) : a;
|
|
16
|
+
}
|
|
17
|
+
function X({ fallback: t, children: a }) {
|
|
18
|
+
const r = W(), o = _();
|
|
19
|
+
let i = /* @__PURE__ */ s(O, { children: [
|
|
20
|
+
r.map((n) => /* @__PURE__ */ e(b, { path: n.path, children: K(n) }, n.path)),
|
|
21
|
+
/* @__PURE__ */ e(b, { children: t ?? /* @__PURE__ */ e("div", { className: "p-8 text-muted-foreground", children: "Not found" }) })
|
|
22
|
+
] });
|
|
23
|
+
for (const { component: n } of o)
|
|
24
|
+
i = /* @__PURE__ */ e(n, { children: i });
|
|
25
|
+
return /* @__PURE__ */ s("main", { className: "container mx-auto px-4 py-6", children: [
|
|
26
|
+
a,
|
|
27
|
+
i
|
|
28
|
+
] });
|
|
29
|
+
}
|
|
30
|
+
const Y = /^(https?:|data:|blob:|\/|\.\/|\.\.\/)/;
|
|
31
|
+
function Z(t, a) {
|
|
32
|
+
return t ? typeof t == "string" ? Y.test(t) ? /* @__PURE__ */ e("img", { src: t, alt: "", className: a }) : /* @__PURE__ */ e("span", { className: `${t} ${a}`, "aria-hidden": "true" }) : /* @__PURE__ */ e(t, { className: a }) : null;
|
|
33
|
+
}
|
|
34
|
+
function ee({ title: t = "Imaginarium", titleIcon: a, rightSlot: r }) {
|
|
35
|
+
const [o] = Q(), i = J();
|
|
36
|
+
return /* @__PURE__ */ e("nav", { className: "border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60 sticky top-0 z-50", children: /* @__PURE__ */ s("div", { className: "container mx-auto flex h-14 items-center px-4", children: [
|
|
37
|
+
/* @__PURE__ */ s("div", { className: "mr-8 flex items-center gap-2 font-semibold text-lg", children: [
|
|
38
|
+
Z(a, "h-6 w-6"),
|
|
39
|
+
/* @__PURE__ */ e("span", { children: t })
|
|
40
|
+
] }),
|
|
41
|
+
/* @__PURE__ */ e("div", { className: "flex items-center gap-1", children: i.map(({ label: n, path: l, icon: m }) => {
|
|
42
|
+
const f = o === l || o.startsWith(`${l}/`);
|
|
43
|
+
return /* @__PURE__ */ e(U, { href: l, children: /* @__PURE__ */ s(w, { variant: f ? "secondary" : "ghost", size: "sm", className: "gap-2", children: [
|
|
44
|
+
m ? /* @__PURE__ */ e(m, { className: "h-4 w-4" }) : null,
|
|
45
|
+
n
|
|
46
|
+
] }) }, l);
|
|
47
|
+
}) }),
|
|
48
|
+
r ? /* @__PURE__ */ e("div", { className: "ml-auto flex items-center gap-2", children: r }) : null
|
|
49
|
+
] }) });
|
|
50
|
+
}
|
|
51
|
+
const te = g.Provider, Te = g.Root, Ae = g.Trigger, ae = u.forwardRef(({ className: t, sideOffset: a = 4, ...r }, o) => /* @__PURE__ */ e(
|
|
52
|
+
g.Content,
|
|
53
|
+
{
|
|
54
|
+
ref: o,
|
|
55
|
+
sideOffset: a,
|
|
56
|
+
className: p(
|
|
57
|
+
"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
|
|
58
|
+
t
|
|
59
|
+
),
|
|
60
|
+
...r
|
|
61
|
+
}
|
|
62
|
+
));
|
|
63
|
+
ae.displayName = g.Content.displayName;
|
|
64
|
+
const re = d.Provider, y = u.forwardRef(({ className: t, ...a }, r) => /* @__PURE__ */ e(
|
|
65
|
+
d.Viewport,
|
|
66
|
+
{
|
|
67
|
+
ref: r,
|
|
68
|
+
className: p(
|
|
69
|
+
"fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]",
|
|
70
|
+
t
|
|
71
|
+
),
|
|
72
|
+
...a
|
|
73
|
+
}
|
|
74
|
+
));
|
|
75
|
+
y.displayName = d.Viewport.displayName;
|
|
76
|
+
const oe = D(
|
|
77
|
+
"group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",
|
|
78
|
+
{
|
|
79
|
+
variants: {
|
|
80
|
+
variant: {
|
|
81
|
+
default: "border bg-background text-foreground",
|
|
82
|
+
destructive: "destructive group border-destructive bg-destructive text-destructive-foreground"
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
defaultVariants: { variant: "default" }
|
|
86
|
+
}
|
|
87
|
+
), N = u.forwardRef(({ className: t, variant: a, ...r }, o) => /* @__PURE__ */ e(d.Root, { ref: o, className: p(oe({ variant: a }), t), ...r }));
|
|
88
|
+
N.displayName = d.Root.displayName;
|
|
89
|
+
const ie = u.forwardRef(({ className: t, ...a }, r) => /* @__PURE__ */ e(
|
|
90
|
+
d.Action,
|
|
91
|
+
{
|
|
92
|
+
ref: r,
|
|
93
|
+
className: p(
|
|
94
|
+
"inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
|
|
95
|
+
t
|
|
96
|
+
),
|
|
97
|
+
...a
|
|
98
|
+
}
|
|
99
|
+
));
|
|
100
|
+
ie.displayName = d.Action.displayName;
|
|
101
|
+
const T = u.forwardRef(({ className: t, ...a }, r) => /* @__PURE__ */ e(
|
|
102
|
+
d.Close,
|
|
103
|
+
{
|
|
104
|
+
ref: r,
|
|
105
|
+
className: p(
|
|
106
|
+
"absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100",
|
|
107
|
+
t
|
|
108
|
+
),
|
|
109
|
+
"toast-close": "",
|
|
110
|
+
...a,
|
|
111
|
+
children: /* @__PURE__ */ e(H, { className: "h-4 w-4" })
|
|
112
|
+
}
|
|
113
|
+
));
|
|
114
|
+
T.displayName = d.Close.displayName;
|
|
115
|
+
const A = u.forwardRef(({ className: t, ...a }, r) => /* @__PURE__ */ e(d.Title, { ref: r, className: p("text-sm font-semibold", t), ...a }));
|
|
116
|
+
A.displayName = d.Title.displayName;
|
|
117
|
+
const I = u.forwardRef(({ className: t, ...a }, r) => /* @__PURE__ */ e(d.Description, { ref: r, className: p("text-sm opacity-90", t), ...a }));
|
|
118
|
+
I.displayName = d.Description.displayName;
|
|
119
|
+
function ne() {
|
|
120
|
+
const { toasts: t } = L();
|
|
121
|
+
return /* @__PURE__ */ s(re, { children: [
|
|
122
|
+
t.map(({ id: a, title: r, description: o, action: i, ...n }) => /* @__PURE__ */ s(N, { ...n, children: [
|
|
123
|
+
/* @__PURE__ */ s("div", { className: "grid gap-1", children: [
|
|
124
|
+
r && /* @__PURE__ */ e(A, { children: r }),
|
|
125
|
+
o && /* @__PURE__ */ e(I, { children: o })
|
|
126
|
+
] }),
|
|
127
|
+
i,
|
|
128
|
+
/* @__PURE__ */ e(T, {})
|
|
129
|
+
] }, a)),
|
|
130
|
+
/* @__PURE__ */ e(y, {})
|
|
131
|
+
] });
|
|
132
|
+
}
|
|
133
|
+
function se({ className: t }) {
|
|
134
|
+
return /* @__PURE__ */ s("svg", { viewBox: "0 0 24 24", className: t, "aria-hidden": "true", children: [
|
|
135
|
+
/* @__PURE__ */ e("path", { fill: "#4285F4", d: "M23.49 12.27c0-.79-.07-1.54-.19-2.27H12v4.51h6.16c-.27 1.4-1.04 2.59-2.21 3.41v2.77h3.59c2.08-1.92 3.95-4.74 3.95-8.42z" }),
|
|
136
|
+
/* @__PURE__ */ e("path", { fill: "#34A853", d: "M12 24c2.97 0 5.46-.98 7.28-2.66l-3.59-2.77c-.98.66-2.23 1.06-3.69 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 21.53 7.7 24 12 24z" }),
|
|
137
|
+
/* @__PURE__ */ e("path", { fill: "#FBBC05", d: "M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z" }),
|
|
138
|
+
/* @__PURE__ */ e("path", { fill: "#EA4335", d: "M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z" })
|
|
139
|
+
] });
|
|
140
|
+
}
|
|
141
|
+
const de = {
|
|
142
|
+
auth_failed: "Sign-in failed. Please try again."
|
|
143
|
+
};
|
|
144
|
+
function le() {
|
|
145
|
+
if (typeof window > "u")
|
|
146
|
+
return;
|
|
147
|
+
const t = new URLSearchParams(window.location.search).get("error");
|
|
148
|
+
if (t)
|
|
149
|
+
return de[t] ?? `Sign-in error: ${t}`;
|
|
150
|
+
}
|
|
151
|
+
function ce({
|
|
152
|
+
loginPath: t,
|
|
153
|
+
title: a = "Sign in",
|
|
154
|
+
subtitle: r,
|
|
155
|
+
buttonLabel: o = "Sign in with Google",
|
|
156
|
+
backgroundUrl: i,
|
|
157
|
+
errorMessage: n
|
|
158
|
+
}) {
|
|
159
|
+
const l = n ?? le(), m = !!i;
|
|
160
|
+
return /* @__PURE__ */ e(
|
|
161
|
+
"div",
|
|
162
|
+
{
|
|
163
|
+
className: "min-h-screen flex items-center justify-center bg-background bg-cover bg-center px-4",
|
|
164
|
+
style: m ? { backgroundImage: `url(${i})` } : void 0,
|
|
165
|
+
children: /* @__PURE__ */ s(V, { className: `w-full max-w-md ${m ? "backdrop-blur-sm bg-card/90" : ""}`, children: [
|
|
166
|
+
/* @__PURE__ */ s($, { className: "text-center", children: [
|
|
167
|
+
/* @__PURE__ */ e(j, { children: a }),
|
|
168
|
+
r && /* @__PURE__ */ e(q, { children: r })
|
|
169
|
+
] }),
|
|
170
|
+
/* @__PURE__ */ s(F, { className: "space-y-4", children: [
|
|
171
|
+
l && /* @__PURE__ */ e("div", { className: "rounded-md border border-destructive bg-destructive/10 px-4 py-2 text-sm text-destructive", children: l }),
|
|
172
|
+
/* @__PURE__ */ s(
|
|
173
|
+
w,
|
|
174
|
+
{
|
|
175
|
+
className: "w-full",
|
|
176
|
+
variant: "outline",
|
|
177
|
+
onClick: () => {
|
|
178
|
+
window.location.href = t;
|
|
179
|
+
},
|
|
180
|
+
children: [
|
|
181
|
+
/* @__PURE__ */ e(se, { className: "h-5 w-5 mr-2" }),
|
|
182
|
+
o
|
|
183
|
+
]
|
|
184
|
+
}
|
|
185
|
+
)
|
|
186
|
+
] })
|
|
187
|
+
] })
|
|
188
|
+
}
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
function me({ children: t }) {
|
|
192
|
+
const { fetchJson: a } = M(), r = c.get("ImaginariumApp", "userPath", "/auth/user"), { isPending: o, isError: i } = z({
|
|
193
|
+
queryKey: ["imaginarium", "auth", "user", r],
|
|
194
|
+
queryFn: () => a(r),
|
|
195
|
+
retry: !1,
|
|
196
|
+
refetchOnWindowFocus: !1
|
|
197
|
+
});
|
|
198
|
+
if (o)
|
|
199
|
+
return /* @__PURE__ */ e("div", { className: "p-8 text-muted-foreground", children: "Checking sign-in…" });
|
|
200
|
+
if (i) {
|
|
201
|
+
const n = c.get(
|
|
202
|
+
"ImaginariumApp",
|
|
203
|
+
"loginPage",
|
|
204
|
+
ce
|
|
205
|
+
), l = c.get("ImaginariumApp", "loginTitle", void 0), m = c.get("ImaginariumApp", "loginSubtitle", void 0), f = c.get(
|
|
206
|
+
"ImaginariumApp",
|
|
207
|
+
"loginButtonLabel",
|
|
208
|
+
void 0
|
|
209
|
+
), v = c.get("ImaginariumApp", "loginPath", "/api/login"), h = c.get(
|
|
210
|
+
"ImaginariumApp",
|
|
211
|
+
"loginBackgroundUrl",
|
|
212
|
+
void 0
|
|
213
|
+
), C = c.get("ImaginariumApp", "title", "Imaginarium"), P = l ?? `Sign in to ${C}`;
|
|
214
|
+
return x(n, {
|
|
215
|
+
loginPath: v,
|
|
216
|
+
title: P,
|
|
217
|
+
subtitle: m,
|
|
218
|
+
buttonLabel: f,
|
|
219
|
+
backgroundUrl: h
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
return /* @__PURE__ */ e(R, { children: t });
|
|
223
|
+
}
|
|
224
|
+
const ue = new E({
|
|
225
|
+
defaultOptions: {
|
|
226
|
+
queries: { retry: !1, refetchOnWindowFocus: !1 }
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
function pe({ title: t, titleIcon: a, navRightSlot: r, shellFallback: o, children: i }) {
|
|
230
|
+
return /* @__PURE__ */ s("div", { className: "min-h-screen bg-background text-foreground", children: [
|
|
231
|
+
/* @__PURE__ */ e(ee, { title: t, titleIcon: a, rightSlot: r }),
|
|
232
|
+
/* @__PURE__ */ e(X, { fallback: o, children: i })
|
|
233
|
+
] });
|
|
234
|
+
}
|
|
235
|
+
function Ie({
|
|
236
|
+
apiBaseUrl: t = "/api",
|
|
237
|
+
queryClient: a,
|
|
238
|
+
title: r,
|
|
239
|
+
titleIcon: o,
|
|
240
|
+
navRightSlot: i,
|
|
241
|
+
shellFallback: n,
|
|
242
|
+
children: l
|
|
243
|
+
}) {
|
|
244
|
+
const m = S(() => a ?? ue, [a]), f = c.get("ImaginariumApp", "requireAuth", !0), v = o ?? c.get("ImaginariumApp", "titleIcon", void 0), h = /* @__PURE__ */ e(
|
|
245
|
+
pe,
|
|
246
|
+
{
|
|
247
|
+
title: r,
|
|
248
|
+
titleIcon: v,
|
|
249
|
+
navRightSlot: i,
|
|
250
|
+
shellFallback: n,
|
|
251
|
+
children: l
|
|
252
|
+
}
|
|
253
|
+
);
|
|
254
|
+
return /* @__PURE__ */ e(B, { client: m, children: /* @__PURE__ */ e(te, { children: /* @__PURE__ */ s(G, { apiBaseUrl: t, children: [
|
|
255
|
+
f ? /* @__PURE__ */ e(me, { children: h }) : h,
|
|
256
|
+
/* @__PURE__ */ e(ne, {})
|
|
257
|
+
] }) }) });
|
|
258
|
+
}
|
|
259
|
+
export {
|
|
260
|
+
ee as A,
|
|
261
|
+
Ie as I,
|
|
262
|
+
ce as L,
|
|
263
|
+
me as R,
|
|
264
|
+
X as S,
|
|
265
|
+
N as T,
|
|
266
|
+
ie as a,
|
|
267
|
+
T as b,
|
|
268
|
+
I as c,
|
|
269
|
+
re as d,
|
|
270
|
+
A as e,
|
|
271
|
+
y as f,
|
|
272
|
+
ne as g,
|
|
273
|
+
Te as h,
|
|
274
|
+
ae as i,
|
|
275
|
+
te as j,
|
|
276
|
+
Ae as k
|
|
277
|
+
};
|
|
278
|
+
//# sourceMappingURL=ImaginariumApp-CCSmWwRB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImaginariumApp-CCSmWwRB.js","sources":["../src/shell/Shell.tsx","../src/shell/AppNav.tsx","../src/components/ui/Tooltip.tsx","../src/components/ui/Toast.tsx","../src/components/ui/Toaster.tsx","../src/auth/LoginPage.tsx","../src/auth/RequireAuth.tsx","../src/shell/ImaginariumApp.tsx"],"sourcesContent":["import { isValidElement, createElement, type ReactNode } from 'react'\nimport { Route, Switch } from 'wouter'\n\nimport { getPages, getProviders } from '../plugins/registry'\nimport type { PagePlugin } from '../plugins/types'\n\nfunction renderPageElement( plugin: PagePlugin ): ReactNode {\n const { element } = plugin\n if ( isValidElement( element ) ) { return element }\n if ( typeof element === 'function' ) {\n return createElement( element as React.ComponentType )\n }\n return element as ReactNode\n}\n\nexport interface ShellProps {\n fallback?: ReactNode\n children?: ReactNode\n}\n\nexport function Shell( { fallback, children }: ShellProps ) {\n const pages = getPages()\n const providers = getProviders()\n\n let tree: ReactNode = (\n <Switch>\n {pages.map( ( page ) => (\n <Route key={page.path} path={page.path}>\n {renderPageElement( page )}\n </Route>\n ) )}\n <Route>{fallback ?? <div className=\"p-8 text-muted-foreground\">Not found</div>}</Route>\n </Switch>\n )\n\n for ( const { component: Provider } of providers ) {\n tree = <Provider>{tree}</Provider>\n }\n\n return (\n <main className=\"container mx-auto px-4 py-6\">\n {children}\n {tree}\n </main>\n )\n}\n","import type { ComponentType } from 'react'\nimport { Link, useLocation } from 'wouter'\n\nimport { Button } from '../components/ui/Button'\nimport { getNavItems } from '../plugins/registry'\n\n/**\n * Accepted icon forms (anywhere we render an inline icon):\n * - React component: `Settings` from lucide-react\n * - URL string: `/logo.png`, `https://...`, `data:image/...`, `blob:...`\n * - CSS class string: `fa-solid fa-gear`, `material-icons` (rendered on a <span>)\n */\nexport type IconRef = ComponentType<{ className?: string }> | string\n\nexport interface AppNavProps {\n title?: string\n titleIcon?: IconRef\n rightSlot?: React.ReactNode\n}\n\nconst URL_RE = /^(https?:|data:|blob:|\\/|\\.\\/|\\.\\.\\/)/\n\nfunction renderIcon( icon: IconRef | undefined, className: string ) {\n if ( !icon ) { return null }\n if ( typeof icon === 'string' ) {\n if ( URL_RE.test( icon ) ) {\n return <img src={icon} alt=\"\" className={className} />\n }\n return <span className={`${icon} ${className}`} aria-hidden=\"true\" />\n }\n const Icon = icon\n return <Icon className={className} />\n}\n\nexport function AppNav( { title = 'Imaginarium', titleIcon, rightSlot }: AppNavProps ) {\n const [ location ] = useLocation()\n const items = getNavItems()\n\n return (\n <nav className=\"border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60 sticky top-0 z-50\">\n <div className=\"container mx-auto flex h-14 items-center px-4\">\n <div className=\"mr-8 flex items-center gap-2 font-semibold text-lg\">\n {renderIcon( titleIcon, 'h-6 w-6' )}\n <span>{title}</span>\n </div>\n <div className=\"flex items-center gap-1\">\n {items.map( ( { label, path, icon: Icon } ) => {\n const isActive = location === path || location.startsWith( `${path}/` )\n return (\n <Link key={path} href={path}>\n <Button variant={isActive ? 'secondary' : 'ghost'} size=\"sm\" className=\"gap-2\">\n {Icon ? <Icon className=\"h-4 w-4\" /> : null}\n {label}\n </Button>\n </Link>\n )\n } )}\n </div>\n {rightSlot ? <div className=\"ml-auto flex items-center gap-2\">{rightSlot}</div> : null}\n </div>\n </nav>\n )\n}\n","import * as React from 'react'\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip'\n\nimport { cn } from '../../lib/utils'\n\nconst TooltipProvider = TooltipPrimitive.Provider\nconst Tooltip = TooltipPrimitive.Root\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>( ( { className, sideOffset = 4, ...props }, ref ) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',\n className,\n )}\n {...props}\n />\n) )\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import * as React from 'react'\nimport * as ToastPrimitives from '@radix-ui/react-toast'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { X } from 'lucide-react'\n\nimport { cn } from '../../lib/utils'\n\nconst ToastProvider = ToastPrimitives.Provider\n\nconst ToastViewport = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Viewport>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport>\n>( ( { className, ...props }, ref ) => (\n <ToastPrimitives.Viewport\n ref={ref}\n className={cn(\n 'fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]',\n className,\n )}\n {...props}\n />\n) )\nToastViewport.displayName = ToastPrimitives.Viewport.displayName\n\nconst toastVariants = cva(\n 'group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full',\n {\n variants: {\n variant: {\n default: 'border bg-background text-foreground',\n destructive: 'destructive group border-destructive bg-destructive text-destructive-foreground',\n },\n },\n defaultVariants: { variant: 'default' },\n },\n)\n\nconst Toast = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> & VariantProps<typeof toastVariants>\n>( ( { className, variant, ...props }, ref ) => (\n <ToastPrimitives.Root ref={ref} className={cn( toastVariants( { variant } ), className )} {...props} />\n) )\nToast.displayName = ToastPrimitives.Root.displayName\n\nconst ToastAction = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Action>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action>\n>( ( { className, ...props }, ref ) => (\n <ToastPrimitives.Action\n ref={ref}\n className={cn(\n 'inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\n className,\n )}\n {...props}\n />\n) )\nToastAction.displayName = ToastPrimitives.Action.displayName\n\nconst ToastClose = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Close>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close>\n>( ( { className, ...props }, ref ) => (\n <ToastPrimitives.Close\n ref={ref}\n className={cn(\n 'absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100',\n className,\n )}\n toast-close=\"\"\n {...props}\n >\n <X className=\"h-4 w-4\" />\n </ToastPrimitives.Close>\n) )\nToastClose.displayName = ToastPrimitives.Close.displayName\n\nconst ToastTitle = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Title>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title>\n>( ( { className, ...props }, ref ) => (\n <ToastPrimitives.Title ref={ref} className={cn( 'text-sm font-semibold', className )} {...props} />\n) )\nToastTitle.displayName = ToastPrimitives.Title.displayName\n\nconst ToastDescription = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Description>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description>\n>( ( { className, ...props }, ref ) => (\n <ToastPrimitives.Description ref={ref} className={cn( 'text-sm opacity-90', className )} {...props} />\n) )\nToastDescription.displayName = ToastPrimitives.Description.displayName\n\nexport type ToastProps = React.ComponentPropsWithoutRef<typeof Toast>\nexport type ToastActionElement = React.ReactElement<typeof ToastAction>\n\nexport {\n ToastProvider,\n ToastViewport,\n Toast,\n ToastTitle,\n ToastDescription,\n ToastClose,\n ToastAction,\n}\n","import { useToast } from '../../hooks/useToast'\nimport {\n Toast,\n ToastClose,\n ToastDescription,\n ToastProvider,\n ToastTitle,\n ToastViewport,\n} from './Toast'\n\nexport function Toaster() {\n const { toasts } = useToast()\n\n return (\n <ToastProvider>\n {toasts.map( ( { id, title, description, action, ...props } ) => (\n <Toast key={id} {...props}>\n <div className=\"grid gap-1\">\n {title && <ToastTitle>{title}</ToastTitle>}\n {description && <ToastDescription>{description}</ToastDescription>}\n </div>\n {action}\n <ToastClose />\n </Toast>\n ) )}\n <ToastViewport />\n </ToastProvider>\n )\n}\n","import { Button } from '../components/ui/Button'\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from '../components/ui/Card'\n\nexport interface LoginPageProps {\n loginPath: string\n title?: string\n subtitle?: string\n buttonLabel?: string\n /** URL of an image to show behind the sign-in card. Empty/null skips it. */\n backgroundUrl?: string\n /** Optional message shown above the button (e.g. an error from a failed prior attempt). */\n errorMessage?: string\n}\n\nfunction GoogleGlyph( { className }: { className?: string } ) {\n return (\n <svg viewBox=\"0 0 24 24\" className={className} aria-hidden=\"true\">\n <path fill=\"#4285F4\" d=\"M23.49 12.27c0-.79-.07-1.54-.19-2.27H12v4.51h6.16c-.27 1.4-1.04 2.59-2.21 3.41v2.77h3.59c2.08-1.92 3.95-4.74 3.95-8.42z\" />\n <path fill=\"#34A853\" d=\"M12 24c2.97 0 5.46-.98 7.28-2.66l-3.59-2.77c-.98.66-2.23 1.06-3.69 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 21.53 7.7 24 12 24z\" />\n <path fill=\"#FBBC05\" d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\" d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n )\n}\n\nconst ERROR_MESSAGES: Record<string, string> = {\n auth_failed : 'Sign-in failed. Please try again.',\n}\n\nfunction readUrlError(): string | undefined {\n if ( typeof window === 'undefined' ) { return undefined }\n const code = new URLSearchParams( window.location.search ).get( 'error' )\n if ( !code ) { return undefined }\n return ERROR_MESSAGES[code] ?? `Sign-in error: ${code}`\n}\n\nexport function LoginPage( {\n loginPath,\n title = 'Sign in',\n subtitle,\n buttonLabel = 'Sign in with Google',\n backgroundUrl,\n errorMessage,\n}: LoginPageProps ) {\n const message = errorMessage ?? readUrlError()\n const hasBackground = Boolean( backgroundUrl )\n\n return (\n <div\n className=\"min-h-screen flex items-center justify-center bg-background bg-cover bg-center px-4\"\n style={hasBackground ? { backgroundImage: `url(${backgroundUrl})` } : undefined}\n >\n <Card className={`w-full max-w-md ${hasBackground ? 'backdrop-blur-sm bg-card/90' : ''}`}>\n <CardHeader className=\"text-center\">\n <CardTitle>{title}</CardTitle>\n {subtitle && <CardDescription>{subtitle}</CardDescription>}\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {message && (\n <div className=\"rounded-md border border-destructive bg-destructive/10 px-4 py-2 text-sm text-destructive\">\n {message}\n </div>\n )}\n <Button\n className=\"w-full\"\n variant=\"outline\"\n onClick={() => { window.location.href = loginPath }}\n >\n <GoogleGlyph className=\"h-5 w-5 mr-2\" />\n {buttonLabel}\n </Button>\n </CardContent>\n </Card>\n </div>\n )\n}\n\nexport default LoginPage\n","import { createElement, type ComponentType, type ReactNode } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { Config } from '@leverege/plugin'\n\nimport { useImaginariumApi } from '../api/ImaginariumApiContext'\nimport { LoginPage, type LoginPageProps } from './LoginPage'\n\nexport interface RequireAuthProps {\n children: ReactNode\n}\n\n/**\n * Wraps `children` with an authentication gate. On mount, fetches\n * `Config.get('ImaginariumApp', 'userPath', '/auth/user')` from the configured\n * API base URL. While loading, renders a small placeholder. On error, renders\n * the configured login component (defaults to the bundled `LoginPage`). On\n * success, renders `children`.\n *\n * Recognized config keys (under `'ImaginariumApp'`):\n * - `userPath` endpoint to check (default `/auth/user`)\n * - `loginPath` URL the login button navigates to (default `/api/login`)\n * - `loginPage` component to render when unauthenticated\n * - `loginTitle` default page heading\n * - `loginSubtitle` default page subtitle\n * - `loginButtonLabel` default button label\n * - `loginBackgroundUrl` URL of an image to show behind the sign-in card\n */\nexport function RequireAuth( { children }: RequireAuthProps ) {\n const { fetchJson } = useImaginariumApi()\n const userPath = Config.get<string>( 'ImaginariumApp', 'userPath', '/auth/user' )\n\n const { isPending, isError } = useQuery( {\n queryKey: [ 'imaginarium', 'auth', 'user', userPath ],\n queryFn: () => fetchJson( userPath ),\n retry: false,\n refetchOnWindowFocus: false,\n } )\n\n if ( isPending ) {\n return <div className=\"p-8 text-muted-foreground\">Checking sign-in…</div>\n }\n\n if ( isError ) {\n const LoginComponent = Config.get<ComponentType<LoginPageProps>>(\n 'ImaginariumApp', 'loginPage', LoginPage,\n )\n const title = Config.get<string | undefined>( 'ImaginariumApp', 'loginTitle', undefined )\n const subtitle = Config.get<string | undefined>( 'ImaginariumApp', 'loginSubtitle', undefined )\n const buttonLabel = Config.get<string | undefined>(\n 'ImaginariumApp', 'loginButtonLabel', undefined,\n )\n const loginPath = Config.get<string>( 'ImaginariumApp', 'loginPath', '/api/login' )\n const backgroundUrl = Config.get<string | undefined>(\n 'ImaginariumApp', 'loginBackgroundUrl', undefined,\n )\n\n const appTitle = Config.get<string>( 'ImaginariumApp', 'title', 'Imaginarium' )\n const resolvedTitle = title ?? `Sign in to ${appTitle}`\n\n return createElement( LoginComponent, {\n loginPath,\n title: resolvedTitle,\n subtitle,\n buttonLabel,\n backgroundUrl,\n } )\n }\n\n return <>{children}</>\n}\n\nexport default RequireAuth\n","import { useMemo, type ReactNode } from 'react'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { Config } from '@leverege/plugin'\n\nimport { TooltipProvider } from '../components/ui/Tooltip'\nimport { Toaster } from '../components/ui/Toaster'\nimport { ImaginariumApiProvider } from '../api/ImaginariumApiContext'\nimport { RequireAuth } from '../auth/RequireAuth'\nimport { AppNav, type AppNavProps, type IconRef } from './AppNav'\nimport { Shell, type ShellProps } from './Shell'\n\nexport interface ImaginariumAppProps {\n apiBaseUrl?: string\n queryClient?: QueryClient\n title?: string\n titleIcon?: IconRef\n navRightSlot?: AppNavProps['rightSlot']\n shellFallback?: ShellProps['fallback']\n children?: ReactNode\n}\n\nconst defaultQueryClient = new QueryClient( {\n defaultOptions: {\n queries: { retry: false, refetchOnWindowFocus: false },\n },\n} )\n\nfunction GatedShell( { title, titleIcon, navRightSlot, shellFallback, children }: {\n title?: string\n titleIcon?: IconRef\n navRightSlot?: AppNavProps['rightSlot']\n shellFallback?: ShellProps['fallback']\n children?: ReactNode\n} ) {\n return (\n <div className=\"min-h-screen bg-background text-foreground\">\n <AppNav title={title} titleIcon={titleIcon} rightSlot={navRightSlot} />\n <Shell fallback={shellFallback}>{children}</Shell>\n </div>\n )\n}\n\nexport function ImaginariumApp( {\n apiBaseUrl = '/api',\n queryClient,\n title,\n titleIcon,\n navRightSlot,\n shellFallback,\n children,\n}: ImaginariumAppProps ) {\n const qc = useMemo( () => queryClient ?? defaultQueryClient, [ queryClient ] )\n const requireAuth = Config.get<boolean>( 'ImaginariumApp', 'requireAuth', true )\n const resolvedTitleIcon = titleIcon\n ?? Config.get<IconRef | undefined>( 'ImaginariumApp', 'titleIcon', undefined )\n\n const gated = (\n <GatedShell\n title={title}\n titleIcon={resolvedTitleIcon}\n navRightSlot={navRightSlot}\n shellFallback={shellFallback}\n >\n {children}\n </GatedShell>\n )\n\n return (\n <QueryClientProvider client={qc}>\n <TooltipProvider>\n <ImaginariumApiProvider apiBaseUrl={apiBaseUrl}>\n {requireAuth ? <RequireAuth>{gated}</RequireAuth> : gated}\n <Toaster />\n </ImaginariumApiProvider>\n </TooltipProvider>\n </QueryClientProvider>\n )\n}\n"],"names":["renderPageElement","plugin","element","isValidElement","createElement","Shell","fallback","children","pages","getPages","providers","getProviders","tree","Switch","page","jsx","Route","Provider","jsxs","URL_RE","renderIcon","icon","className","AppNav","title","titleIcon","rightSlot","location","useLocation","items","getNavItems","label","path","Icon","isActive","Link","Button","TooltipProvider","TooltipPrimitive","Tooltip","TooltipTrigger","TooltipContent","React","sideOffset","props","ref","cn","ToastProvider","ToastPrimitives","ToastViewport","toastVariants","cva","Toast","variant","ToastAction","ToastClose","X","ToastTitle","ToastDescription","Toaster","toasts","useToast","id","description","action","GoogleGlyph","ERROR_MESSAGES","readUrlError","code","LoginPage","loginPath","subtitle","buttonLabel","backgroundUrl","errorMessage","message","hasBackground","Card","CardHeader","CardTitle","CardDescription","CardContent","RequireAuth","fetchJson","useImaginariumApi","userPath","Config","isPending","isError","useQuery","LoginComponent","appTitle","resolvedTitle","defaultQueryClient","QueryClient","GatedShell","navRightSlot","shellFallback","ImaginariumApp","apiBaseUrl","queryClient","qc","useMemo","requireAuth","resolvedTitleIcon","gated","QueryClientProvider","ImaginariumApiProvider"],"mappings":"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"}
|