@leverege/imaginarium-ui 1.2.1 → 1.3.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.
Files changed (113) hide show
  1. package/lib/ImaginariumApp-D7jCl_VH.js +514 -0
  2. package/lib/ImaginariumApp-D7jCl_VH.js.map +1 -0
  3. package/lib/ImaginariumApp-DeLr4nad.cjs +2 -0
  4. package/lib/ImaginariumApp-DeLr4nad.cjs.map +1 -0
  5. package/lib/MarkdownPageDoc-BZF02iL5.cjs +2 -0
  6. package/lib/MarkdownPageDoc-BZF02iL5.cjs.map +1 -0
  7. package/lib/MarkdownPageDoc-DR1FmNpF.js +157 -0
  8. package/lib/MarkdownPageDoc-DR1FmNpF.js.map +1 -0
  9. package/lib/{PluginSetup-NL8jYfpN.js → PluginSetup-CTRJO5hU.js} +164 -118
  10. package/lib/PluginSetup-CTRJO5hU.js.map +1 -0
  11. package/lib/PluginSetup-CuLezaDw.cjs +45 -0
  12. package/lib/PluginSetup-CuLezaDw.cjs.map +1 -0
  13. package/lib/{PluginSetup-Co-WnS3V.js → PluginSetup-DNKri9P1.js} +2 -2
  14. package/lib/{PluginSetup-Co-WnS3V.js.map → PluginSetup-DNKri9P1.js.map} +1 -1
  15. package/lib/{PluginSetup-BQk4FFh9.js → PluginSetup-DaNNHmql.js} +782 -671
  16. package/lib/PluginSetup-DaNNHmql.js.map +1 -0
  17. package/lib/{PluginSetup-CQPpS_Js.cjs → PluginSetup-De9E1hRC.cjs} +2 -2
  18. package/lib/{PluginSetup-CQPpS_Js.cjs.map → PluginSetup-De9E1hRC.cjs.map} +1 -1
  19. package/lib/PluginSetup-o9elzgOQ.cjs +112 -0
  20. package/lib/PluginSetup-o9elzgOQ.cjs.map +1 -0
  21. package/lib/PluginTypes-BmYA5_B9.cjs +2 -0
  22. package/lib/PluginTypes-BmYA5_B9.cjs.map +1 -0
  23. package/lib/PluginTypes-mZ4TjxPV.js +9 -0
  24. package/lib/PluginTypes-mZ4TjxPV.js.map +1 -0
  25. package/lib/docs/DocsPanel.d.ts +15 -0
  26. package/lib/docs/DocsPanel.d.ts.map +1 -0
  27. package/lib/docs/MarkdownPageDoc.d.ts +8 -0
  28. package/lib/docs/MarkdownPageDoc.d.ts.map +1 -0
  29. package/lib/docs/PageDoc.d.ts +9 -0
  30. package/lib/docs/PageDoc.d.ts.map +1 -0
  31. package/lib/docs/PageDocsContext.d.ts +12 -0
  32. package/lib/docs/PageDocsContext.d.ts.map +1 -0
  33. package/lib/docs/index.d.ts +5 -0
  34. package/lib/docs/index.d.ts.map +1 -0
  35. package/lib/docs/mdComponents.d.ts +21 -0
  36. package/lib/docs/mdComponents.d.ts.map +1 -0
  37. package/lib/imp/release/ImpPageDoc.d.ts +3 -0
  38. package/lib/imp/release/ImpPageDoc.d.ts.map +1 -0
  39. package/lib/imp/release/PluginSetup.d.ts.map +1 -1
  40. package/lib/index.cjs +1 -1
  41. package/lib/index.cjs.map +1 -1
  42. package/lib/index.d.ts +4 -1
  43. package/lib/index.d.ts.map +1 -1
  44. package/lib/index.js +75 -72
  45. package/lib/mdComponents-BiOJ7Epf.cjs +16 -0
  46. package/lib/mdComponents-BiOJ7Epf.cjs.map +1 -0
  47. package/lib/mdComponents-kPa8Rxqz.js +6792 -0
  48. package/lib/mdComponents-kPa8Rxqz.js.map +1 -0
  49. package/lib/plugins/PluginTypes.d.ts +1 -0
  50. package/lib/plugins/PluginTypes.d.ts.map +1 -1
  51. package/lib/plugins/registry.d.ts +3 -1
  52. package/lib/plugins/registry.d.ts.map +1 -1
  53. package/lib/plugins/types.d.ts +5 -0
  54. package/lib/plugins/types.d.ts.map +1 -1
  55. package/lib/plugins.cjs +1 -1
  56. package/lib/plugins.js +2 -2
  57. package/lib/registry-Bq42i86Q.cjs +2 -0
  58. package/lib/registry-Bq42i86Q.cjs.map +1 -0
  59. package/lib/registry-CMZCG8pH.js +44 -0
  60. package/lib/registry-CMZCG8pH.js.map +1 -0
  61. package/lib/release.cjs +1 -1
  62. package/lib/release.js +1 -1
  63. package/lib/secret.cjs +1 -1
  64. package/lib/secret.js +1 -1
  65. package/lib/shell/Shell.d.ts.map +1 -1
  66. package/lib/shell.cjs +1 -1
  67. package/lib/shell.js +1 -1
  68. package/lib/system/PluginSetup.d.ts.map +1 -1
  69. package/lib/system/SystemPageDoc.d.ts +3 -0
  70. package/lib/system/SystemPageDoc.d.ts.map +1 -0
  71. package/lib/system.cjs +1 -1
  72. package/lib/system.js +2 -2
  73. package/lib/theme/index.css +3 -3
  74. package/package.json +3 -2
  75. package/src/docs/DocsPanel.tsx +80 -0
  76. package/src/docs/MarkdownPageDoc.tsx +35 -0
  77. package/src/docs/PageDoc.ts +12 -0
  78. package/src/docs/PageDocsContext.tsx +37 -0
  79. package/src/docs/index.ts +4 -0
  80. package/src/docs/mdComponents.tsx +75 -0
  81. package/src/imp/release/ImpPageDoc.ts +113 -0
  82. package/src/imp/release/PluginSetup.ts +3 -0
  83. package/src/index.ts +4 -0
  84. package/src/plugins/PluginTypes.ts +1 -0
  85. package/src/plugins/registry.ts +13 -2
  86. package/src/plugins/types.ts +6 -0
  87. package/src/shell/ImaginariumApp.tsx +1 -1
  88. package/src/shell/Shell.tsx +48 -14
  89. package/src/system/PluginSetup.ts +4 -0
  90. package/src/system/SystemPageDoc.ts +49 -0
  91. package/src/theme/index.css +3 -3
  92. package/lib/ImaginariumApp-B7Vlrxfd.cjs +0 -2
  93. package/lib/ImaginariumApp-B7Vlrxfd.cjs.map +0 -1
  94. package/lib/ImaginariumApp-DJ0f2GWB.js +0 -437
  95. package/lib/ImaginariumApp-DJ0f2GWB.js.map +0 -1
  96. package/lib/PluginSetup-3m6kjRze.cjs +0 -2
  97. package/lib/PluginSetup-3m6kjRze.cjs.map +0 -1
  98. package/lib/PluginSetup-BQk4FFh9.js.map +0 -1
  99. package/lib/PluginSetup-DoIf-dYR.cjs +0 -5
  100. package/lib/PluginSetup-DoIf-dYR.cjs.map +0 -1
  101. package/lib/PluginSetup-NL8jYfpN.js.map +0 -1
  102. package/lib/PluginTypes-C4a2lmPj.cjs +0 -2
  103. package/lib/PluginTypes-C4a2lmPj.cjs.map +0 -1
  104. package/lib/PluginTypes-DsLT43Y8.js +0 -8
  105. package/lib/PluginTypes-DsLT43Y8.js.map +0 -1
  106. package/lib/SystemConfigsContext-D0hXRSH-.js +0 -128
  107. package/lib/SystemConfigsContext-D0hXRSH-.js.map +0 -1
  108. package/lib/SystemConfigsContext-yOuS10VO.cjs +0 -2
  109. package/lib/SystemConfigsContext-yOuS10VO.cjs.map +0 -1
  110. package/lib/registry-8kQ494RA.js +0 -36
  111. package/lib/registry-8kQ494RA.js.map +0 -1
  112. package/lib/registry-CHzOVHAg.cjs +0 -2
  113. package/lib/registry-CHzOVHAg.cjs.map +0 -1
@@ -0,0 +1,514 @@
1
+ import { jsx as t, jsxs as s, Fragment as j } from "react/jsx-runtime";
2
+ import * as v from "react";
3
+ import { createContext as H, useContext as B, useEffect as y, useState as N, isValidElement as Q, createElement as L, useCallback as I, useMemo as U } from "react";
4
+ import { useQuery as W, QueryClient as J, QueryClientProvider as K } from "@tanstack/react-query";
5
+ import { Config as g } from "@leverege/plugin";
6
+ import { b as X } from "./Tooltip-CIwKmgzA.js";
7
+ import { c as d, u as Y, C as Z, b as ee, d as te, e as re, f as oe, B as ne, a as ae, I as se } from "./Card-D2LdIJwJ.js";
8
+ import * as u from "@radix-ui/react-toast";
9
+ import { cva as ie } from "class-variance-authority";
10
+ import { ChevronLeft as le, ChevronDown as ce, X as de } from "lucide-react";
11
+ import { d as ue, h as me, g as fe, i as pe, e as ge } from "./registry-CMZCG8pH.js";
12
+ import { useLocation as O, Switch as he, Route as T, Link as P } from "wouter";
13
+ import { M as xe, m as ve } from "./mdComponents-kPa8Rxqz.js";
14
+ const A = H({
15
+ tabMarkdown: null,
16
+ setTabMarkdown: () => {
17
+ }
18
+ });
19
+ function be({ children: e }) {
20
+ const [r, n] = N(null);
21
+ return /* @__PURE__ */ t(A.Provider, { value: { tabMarkdown: r, setTabMarkdown: n }, children: e });
22
+ }
23
+ function et(e) {
24
+ const { setTabMarkdown: r } = B(A);
25
+ y(() => (r(e), () => {
26
+ r(null);
27
+ }), [e, r]);
28
+ }
29
+ function we() {
30
+ return B(A).tabMarkdown;
31
+ }
32
+ const R = (e) => d(
33
+ "flex items-center gap-1.5 rounded-md border px-2.5 py-1 text-xs font-medium transition-colors",
34
+ e ? "border-primary/50 bg-primary/10 text-primary" : "border-border bg-card text-muted-foreground hover:border-primary/30 hover:text-foreground"
35
+ ), E = () => /* @__PURE__ */ t("span", { className: "flex h-3.5 w-3.5 items-center justify-center rounded-full border border-current text-[9px] font-bold leading-none", children: "i" });
36
+ function M({ href: e, open: r = !1, onToggle: n }) {
37
+ return e != null ? /* @__PURE__ */ t("div", { children: /* @__PURE__ */ s("a", { href: e, target: "_blank", rel: "noopener noreferrer", className: R(!1), children: [
38
+ /* @__PURE__ */ t(E, {}),
39
+ "Docs"
40
+ ] }) }) : /* @__PURE__ */ t("div", { children: /* @__PURE__ */ s("button", { onClick: n, className: R(r), children: [
41
+ /* @__PURE__ */ t(E, {}),
42
+ "Docs"
43
+ ] }) });
44
+ }
45
+ function ye({ pageDocs: e, tabMarkdown: r, onClose: n }) {
46
+ const a = e.path.replace(/^\//, "") || "docs", o = e.component;
47
+ return /* @__PURE__ */ s("aside", { className: "absolute right-0 top-0 bottom-0 z-20 w-[26rem] border-l border-border bg-card flex flex-col overflow-hidden shadow-xl", children: [
48
+ /* @__PURE__ */ s("div", { className: "flex items-center justify-between px-4 py-3 border-b border-border", children: [
49
+ /* @__PURE__ */ t("span", { className: "text-sm font-semibold text-foreground", children: a }),
50
+ /* @__PURE__ */ t(
51
+ "button",
52
+ {
53
+ onClick: n,
54
+ className: "text-xs text-muted-foreground hover:text-foreground transition-colors",
55
+ "aria-label": "Close docs panel",
56
+ children: "✕"
57
+ }
58
+ )
59
+ ] }),
60
+ /* @__PURE__ */ s("div", { className: "flex-1 overflow-y-auto px-4 py-4", children: [
61
+ r != null && /* @__PURE__ */ s(j, { children: [
62
+ /* @__PURE__ */ t(xe, { components: ve, children: r }),
63
+ /* @__PURE__ */ t("hr", { className: "border-border my-3" })
64
+ ] }),
65
+ o != null && /* @__PURE__ */ t(o, {})
66
+ ] })
67
+ ] });
68
+ }
69
+ function Ne(e) {
70
+ const { element: r } = e;
71
+ return Q(r) ? r : typeof r == "function" ? L(r) : r;
72
+ }
73
+ function Se({ fallback: e, children: r }) {
74
+ return /* @__PURE__ */ t(be, { children: /* @__PURE__ */ t(Ce, { fallback: e, children: r }) });
75
+ }
76
+ function Ce({ fallback: e, children: r }) {
77
+ const n = ue(), [a, o] = N(!1), [l] = O(), i = me(l);
78
+ y(() => {
79
+ o(!1);
80
+ }, [l]);
81
+ const p = we();
82
+ return /* @__PURE__ */ s("div", { className: "relative flex flex-1 overflow-hidden", children: [
83
+ /* @__PURE__ */ s("main", { className: "relative flex-1 overflow-y-auto", children: [
84
+ i != null && /* @__PURE__ */ t("div", { className: "flex justify-end px-6 pt-4", children: i.href != null ? /* @__PURE__ */ t(M, { href: i.href }) : /* @__PURE__ */ t(M, { open: a, onToggle: () => o((f) => !f) }) }),
85
+ /* @__PURE__ */ s("div", { className: "px-6 pb-6 pt-4", children: [
86
+ r,
87
+ /* @__PURE__ */ s(he, { children: [
88
+ n.map((f) => /* @__PURE__ */ t(T, { path: f.path, children: Ne(f) }, f.path)),
89
+ /* @__PURE__ */ t(T, { children: e ?? /* @__PURE__ */ t("div", { className: "p-8 text-muted-foreground", children: "Not found" }) })
90
+ ] })
91
+ ] })
92
+ ] }),
93
+ a && i != null && i.href == null && /* @__PURE__ */ t(
94
+ ye,
95
+ {
96
+ pageDocs: i,
97
+ tabMarkdown: p,
98
+ onClose: () => o(!1)
99
+ }
100
+ )
101
+ ] });
102
+ }
103
+ function Ae(e) {
104
+ const r = [], n = /* @__PURE__ */ new Map();
105
+ for (const o of e) {
106
+ if (!o.section) {
107
+ r.push(o);
108
+ continue;
109
+ }
110
+ n.has(o.section) || n.set(o.section, {
111
+ label: o.section,
112
+ sectionSort: o.sectionSort ?? o.sort ?? 0,
113
+ items: []
114
+ }), n.get(o.section).items.push(o);
115
+ }
116
+ r.sort((o, l) => (o.sort ?? 0) - (l.sort ?? 0));
117
+ const a = Array.from(n.values());
118
+ for (const o of a)
119
+ o.items.sort((l, i) => (l.sort ?? 0) - (i.sort ?? 0));
120
+ return a.sort((o, l) => {
121
+ const i = o.sectionSort - l.sectionSort;
122
+ return i !== 0 ? i : o.label.localeCompare(l.label);
123
+ }), { ungrouped: r, sections: a };
124
+ }
125
+ const D = "imaginarium.ui.sidebar.collapsed", $ = "imaginarium.ui.sidebar.sections";
126
+ function ke(e, r) {
127
+ try {
128
+ const n = localStorage.getItem(e);
129
+ return n === null ? r : n === "true";
130
+ } catch {
131
+ return r;
132
+ }
133
+ }
134
+ function Ie() {
135
+ try {
136
+ const e = localStorage.getItem($);
137
+ if (!e)
138
+ return /* @__PURE__ */ new Set();
139
+ const r = JSON.parse(e);
140
+ return new Set(Array.isArray(r) ? r : []);
141
+ } catch {
142
+ return /* @__PURE__ */ new Set();
143
+ }
144
+ }
145
+ const Te = /^(https?:|data:|blob:|\/|\.\/|\.\.\/)/;
146
+ function Pe(e, r) {
147
+ return e ? typeof e == "string" ? Te.test(e) ? /* @__PURE__ */ t("img", { src: e, alt: "", className: r }) : /* @__PURE__ */ t("span", { className: `${e} ${r}`, "aria-hidden": "true" }) : /* @__PURE__ */ t(e, { className: r }) : null;
148
+ }
149
+ function Re({ title: e = "Imaginarium", titleIcon: r, rightSlot: n }) {
150
+ const [a] = O(), [o, l] = N(() => ke(D, !1)), [i, p] = N(Ie);
151
+ y(() => {
152
+ try {
153
+ localStorage.setItem(D, String(o));
154
+ } catch {
155
+ }
156
+ }, [o]), y(() => {
157
+ try {
158
+ localStorage.setItem($, JSON.stringify(Array.from(i)));
159
+ } catch {
160
+ }
161
+ }, [i]);
162
+ const f = I(() => l((c) => !c), []), b = I((c) => {
163
+ p((h) => {
164
+ const m = new Set(h);
165
+ return m.has(c) ? m.delete(c) : m.add(c), m;
166
+ });
167
+ }, []), { ungrouped: x, sections: S } = Ae(fe()), C = pe();
168
+ return /* @__PURE__ */ s(
169
+ "aside",
170
+ {
171
+ className: d(
172
+ "flex flex-col flex-shrink-0 border-r bg-background transition-[width] duration-200 ease-in-out overflow-hidden",
173
+ o ? "w-[52px]" : "w-[220px]"
174
+ ),
175
+ children: [
176
+ /* @__PURE__ */ s("div", { className: "flex h-[52px] flex-shrink-0 items-center border-b px-2.5 gap-2", children: [
177
+ !o && Pe(r, "h-6 w-6"),
178
+ !o && /* @__PURE__ */ t("span", { className: "flex-1 truncate text-sm font-semibold", children: e }),
179
+ /* @__PURE__ */ t(
180
+ "button",
181
+ {
182
+ onClick: f,
183
+ "aria-label": o ? "Expand sidebar" : "Collapse sidebar",
184
+ className: d(
185
+ "flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md border text-muted-foreground",
186
+ "hover:bg-accent hover:text-accent-foreground transition-colors",
187
+ o && "mx-auto border-transparent"
188
+ ),
189
+ children: /* @__PURE__ */ t(
190
+ le,
191
+ {
192
+ className: d("h-4 w-4 transition-transform duration-200", o && "rotate-180")
193
+ }
194
+ )
195
+ }
196
+ )
197
+ ] }),
198
+ /* @__PURE__ */ s("nav", { className: "flex flex-1 flex-col gap-0.5 overflow-y-auto overflow-x-hidden p-1.5", children: [
199
+ x.map(({ path: c, label: h, icon: m }) => {
200
+ const w = a === c || a.startsWith(`${c}/`);
201
+ return /* @__PURE__ */ s(
202
+ P,
203
+ {
204
+ href: c,
205
+ title: o ? h : void 0,
206
+ className: d(
207
+ "relative flex items-center gap-2.5 rounded-md px-2 py-1.5 text-sm text-muted-foreground",
208
+ "hover:bg-accent hover:text-accent-foreground transition-colors whitespace-nowrap",
209
+ w && "bg-accent/50 text-accent-foreground font-medium",
210
+ o && "justify-center px-2"
211
+ ),
212
+ children: [
213
+ m && /* @__PURE__ */ t(m, { className: "h-4 w-4 flex-shrink-0" }),
214
+ !o && /* @__PURE__ */ t("span", { children: h })
215
+ ]
216
+ },
217
+ c
218
+ );
219
+ }),
220
+ S.map((c) => {
221
+ const h = !o && i.has(c.label);
222
+ return /* @__PURE__ */ s("div", { className: "flex flex-col", children: [
223
+ /* @__PURE__ */ t("div", { className: "my-1.5 h-px bg-border" }),
224
+ !o && /* @__PURE__ */ s(
225
+ "button",
226
+ {
227
+ onClick: () => b(c.label),
228
+ className: d(
229
+ "flex items-center justify-between px-2 pb-1 pt-2.5",
230
+ "text-[10px] font-semibold uppercase tracking-widest text-muted-foreground",
231
+ "hover:text-foreground transition-colors cursor-pointer rounded-sm"
232
+ ),
233
+ children: [
234
+ c.label,
235
+ /* @__PURE__ */ t(
236
+ ce,
237
+ {
238
+ className: d(
239
+ "h-3 w-3 transition-transform duration-200",
240
+ h && "-rotate-90"
241
+ )
242
+ }
243
+ )
244
+ ]
245
+ }
246
+ ),
247
+ /* @__PURE__ */ t(
248
+ "div",
249
+ {
250
+ className: d(
251
+ "flex flex-col gap-0.5 overflow-hidden transition-all duration-200",
252
+ h ? "max-h-0 opacity-0" : "max-h-screen opacity-100"
253
+ ),
254
+ children: c.items.map(({ path: m, label: w, icon: k }) => {
255
+ const _ = a === m || a.startsWith(`${m}/`);
256
+ return /* @__PURE__ */ s(
257
+ P,
258
+ {
259
+ href: m,
260
+ title: o ? w : void 0,
261
+ className: d(
262
+ "relative flex items-center gap-2.5 rounded-md px-2 py-1.5 text-sm text-muted-foreground",
263
+ "hover:bg-accent hover:text-accent-foreground transition-colors whitespace-nowrap",
264
+ _ && "bg-accent/50 text-accent-foreground font-medium",
265
+ o && "justify-center px-2"
266
+ ),
267
+ children: [
268
+ k && /* @__PURE__ */ t(k, { className: "h-4 w-4 flex-shrink-0" }),
269
+ !o && /* @__PURE__ */ t("span", { children: w })
270
+ ]
271
+ },
272
+ m
273
+ );
274
+ })
275
+ }
276
+ )
277
+ ] }, c.label);
278
+ })
279
+ ] }),
280
+ /* @__PURE__ */ s("div", { className: d(
281
+ "flex flex-shrink-0 items-center border-t p-1.5",
282
+ o ? "flex-col gap-1" : "flex-row justify-end gap-0.5"
283
+ ), children: [
284
+ !o && n,
285
+ C.map((c) => {
286
+ const h = c.component;
287
+ return /* @__PURE__ */ t(h, {}, c.id);
288
+ })
289
+ ] })
290
+ ]
291
+ }
292
+ );
293
+ }
294
+ const Ee = u.Provider, G = v.forwardRef(({ className: e, ...r }, n) => /* @__PURE__ */ t(
295
+ u.Viewport,
296
+ {
297
+ ref: n,
298
+ className: d(
299
+ "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]",
300
+ e
301
+ ),
302
+ ...r
303
+ }
304
+ ));
305
+ G.displayName = u.Viewport.displayName;
306
+ const Me = ie(
307
+ "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",
308
+ {
309
+ variants: {
310
+ variant: {
311
+ default: "border bg-background text-foreground",
312
+ destructive: "destructive group border-destructive bg-destructive text-destructive-foreground"
313
+ }
314
+ },
315
+ defaultVariants: { variant: "default" }
316
+ }
317
+ ), V = v.forwardRef(({ className: e, variant: r, ...n }, a) => /* @__PURE__ */ t(u.Root, { ref: a, className: d(Me({ variant: r }), e), ...n }));
318
+ V.displayName = u.Root.displayName;
319
+ const De = v.forwardRef(({ className: e, ...r }, n) => /* @__PURE__ */ t(
320
+ u.Action,
321
+ {
322
+ ref: n,
323
+ className: d(
324
+ "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",
325
+ e
326
+ ),
327
+ ...r
328
+ }
329
+ ));
330
+ De.displayName = u.Action.displayName;
331
+ const q = v.forwardRef(({ className: e, ...r }, n) => /* @__PURE__ */ t(
332
+ u.Close,
333
+ {
334
+ ref: n,
335
+ className: d(
336
+ "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",
337
+ e
338
+ ),
339
+ "toast-close": "",
340
+ ...r,
341
+ children: /* @__PURE__ */ t(de, { className: "h-4 w-4" })
342
+ }
343
+ ));
344
+ q.displayName = u.Close.displayName;
345
+ const z = v.forwardRef(({ className: e, ...r }, n) => /* @__PURE__ */ t(u.Title, { ref: n, className: d("text-sm font-semibold", e), ...r }));
346
+ z.displayName = u.Title.displayName;
347
+ const F = v.forwardRef(({ className: e, ...r }, n) => /* @__PURE__ */ t(u.Description, { ref: n, className: d("text-sm opacity-90", e), ...r }));
348
+ F.displayName = u.Description.displayName;
349
+ function je() {
350
+ const { toasts: e } = Y();
351
+ return /* @__PURE__ */ s(Ee, { children: [
352
+ e.map(({ id: r, title: n, description: a, action: o, ...l }) => /* @__PURE__ */ s(V, { ...l, children: [
353
+ /* @__PURE__ */ s("div", { className: "grid gap-1", children: [
354
+ n && /* @__PURE__ */ t(z, { children: n }),
355
+ a && /* @__PURE__ */ t(F, { children: a })
356
+ ] }),
357
+ o,
358
+ /* @__PURE__ */ t(q, {})
359
+ ] }, r)),
360
+ /* @__PURE__ */ t(G, {})
361
+ ] });
362
+ }
363
+ function Be({ className: e }) {
364
+ return /* @__PURE__ */ s("svg", { viewBox: "0 0 24 24", className: e, "aria-hidden": "true", children: [
365
+ /* @__PURE__ */ t("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" }),
366
+ /* @__PURE__ */ t("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" }),
367
+ /* @__PURE__ */ t("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" }),
368
+ /* @__PURE__ */ t("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" })
369
+ ] });
370
+ }
371
+ const Le = {
372
+ auth_failed: "Sign-in failed. Please try again."
373
+ };
374
+ function Oe() {
375
+ if (typeof window > "u")
376
+ return;
377
+ const e = new URLSearchParams(window.location.search).get("error");
378
+ if (e)
379
+ return Le[e] ?? `Sign-in error: ${e}`;
380
+ }
381
+ function $e({
382
+ loginPath: e,
383
+ title: r = "Sign in",
384
+ subtitle: n,
385
+ buttonLabel: a = "Sign in with Google",
386
+ backgroundUrl: o,
387
+ errorMessage: l
388
+ }) {
389
+ const i = l ?? Oe(), p = !!o;
390
+ return /* @__PURE__ */ t(
391
+ "div",
392
+ {
393
+ className: "min-h-screen flex items-center justify-center bg-background bg-cover bg-center px-4",
394
+ style: p ? { backgroundImage: `url(${o})` } : void 0,
395
+ children: /* @__PURE__ */ s(Z, { className: `w-full max-w-md ${p ? "backdrop-blur-sm bg-card/90" : ""}`, children: [
396
+ /* @__PURE__ */ s(ee, { className: "text-center", children: [
397
+ /* @__PURE__ */ t(te, { children: r }),
398
+ n && /* @__PURE__ */ t(re, { children: n })
399
+ ] }),
400
+ /* @__PURE__ */ s(oe, { className: "space-y-4", children: [
401
+ i && /* @__PURE__ */ t("div", { className: "rounded-md border border-destructive bg-destructive/10 px-4 py-2 text-sm text-destructive", children: i }),
402
+ /* @__PURE__ */ s(
403
+ ne,
404
+ {
405
+ className: "w-full",
406
+ variant: "outline",
407
+ onClick: () => {
408
+ window.location.href = e;
409
+ },
410
+ children: [
411
+ /* @__PURE__ */ t(Be, { className: "h-5 w-5 mr-2" }),
412
+ a
413
+ ]
414
+ }
415
+ )
416
+ ] })
417
+ ] })
418
+ }
419
+ );
420
+ }
421
+ function Ge({ children: e }) {
422
+ const { fetchJson: r } = ae(), n = g.get("ImaginariumApp", "userPath", "/auth/user"), { isPending: a, isError: o } = W({
423
+ queryKey: ["imaginarium", "auth", "user", n],
424
+ queryFn: () => r(n),
425
+ retry: !1,
426
+ refetchOnWindowFocus: !1
427
+ });
428
+ if (a)
429
+ return /* @__PURE__ */ t("div", { className: "p-8 text-muted-foreground", children: "Checking sign-in…" });
430
+ if (o) {
431
+ const l = g.get(
432
+ "ImaginariumApp",
433
+ "loginPage",
434
+ $e
435
+ ), i = g.get("ImaginariumApp", "loginTitle", void 0), p = g.get("ImaginariumApp", "loginSubtitle", void 0), f = g.get(
436
+ "ImaginariumApp",
437
+ "loginButtonLabel",
438
+ void 0
439
+ ), b = g.get("ImaginariumApp", "loginPath", "/api/login"), x = g.get(
440
+ "ImaginariumApp",
441
+ "loginBackgroundUrl",
442
+ void 0
443
+ ), S = g.get("ImaginariumApp", "title", "Imaginarium"), C = i ?? `Sign in to ${S}`;
444
+ return L(l, {
445
+ loginPath: b,
446
+ title: C,
447
+ subtitle: p,
448
+ buttonLabel: f,
449
+ backgroundUrl: x
450
+ });
451
+ }
452
+ return /* @__PURE__ */ t(j, { children: e });
453
+ }
454
+ function Ve(e) {
455
+ const r = ge();
456
+ let n = e;
457
+ for (const { component: a } of r)
458
+ n = /* @__PURE__ */ t(a, { children: n });
459
+ return n;
460
+ }
461
+ const qe = new J({
462
+ defaultOptions: {
463
+ queries: { retry: !1, refetchOnWindowFocus: !1 }
464
+ }
465
+ });
466
+ function ze({ title: e, titleIcon: r, navRightSlot: n, shellFallback: a, children: o }) {
467
+ return Ve(
468
+ /* @__PURE__ */ s("div", { className: "flex h-screen overflow-hidden bg-background text-foreground", children: [
469
+ /* @__PURE__ */ t(Re, { title: e, titleIcon: r, rightSlot: n }),
470
+ /* @__PURE__ */ t(Se, { fallback: a, children: o })
471
+ ] })
472
+ );
473
+ }
474
+ function tt({
475
+ apiBaseUrl: e = "/api",
476
+ queryClient: r,
477
+ title: n,
478
+ titleIcon: a,
479
+ navRightSlot: o,
480
+ shellFallback: l,
481
+ children: i
482
+ }) {
483
+ const p = U(() => r ?? qe, [r]), f = g.get("ImaginariumApp", "requireAuth", !0), b = a ?? g.get("ImaginariumApp", "titleIcon", void 0), x = /* @__PURE__ */ t(
484
+ ze,
485
+ {
486
+ title: n,
487
+ titleIcon: b,
488
+ navRightSlot: o,
489
+ shellFallback: l,
490
+ children: i
491
+ }
492
+ );
493
+ return /* @__PURE__ */ t(K, { client: p, children: /* @__PURE__ */ t(X, { children: /* @__PURE__ */ s(se, { apiBaseUrl: e, children: [
494
+ f ? /* @__PURE__ */ t(Ge, { children: x }) : x,
495
+ /* @__PURE__ */ t(je, {})
496
+ ] }) }) });
497
+ }
498
+ export {
499
+ Re as A,
500
+ tt as I,
501
+ $e as L,
502
+ Ge as R,
503
+ Se as S,
504
+ V as T,
505
+ De as a,
506
+ q as b,
507
+ F as c,
508
+ Ee as d,
509
+ z as e,
510
+ G as f,
511
+ je as g,
512
+ et as u
513
+ };
514
+ //# sourceMappingURL=ImaginariumApp-D7jCl_VH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImaginariumApp-D7jCl_VH.js","sources":["../src/docs/PageDocsContext.tsx","../src/docs/DocsPanel.tsx","../src/shell/Shell.tsx","../src/shell/groupNavItems.ts","../src/shell/AppSidebar.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 { createContext, useContext, useEffect, useState, type ReactNode } from 'react'\n\ninterface PageDocsContextValue {\n tabMarkdown: string | null\n setTabMarkdown: ( markdown: string | null ) => void\n}\n\nconst PageDocsContext = createContext<PageDocsContextValue>( {\n tabMarkdown: null,\n setTabMarkdown: () => {},\n} )\n\nexport function PageDocsProvider( { children }: { children: ReactNode } ) {\n const [ tabMarkdown, setTabMarkdown ] = useState<string | null>( null )\n return (\n <PageDocsContext.Provider value={{ tabMarkdown, setTabMarkdown }}>\n {children}\n </PageDocsContext.Provider>\n )\n}\n\n/**\n * Call inside a page component to register tab-specific docs.\n * When the component unmounts or markdown changes, the panel falls back\n * to the page-level docs registered via addPageDocs().\n */\nexport function useRegisterTabDocs( markdown: string ) {\n const { setTabMarkdown } = useContext( PageDocsContext )\n useEffect( () => {\n setTabMarkdown( markdown )\n return () => { setTabMarkdown( null ) }\n }, [ markdown, setTabMarkdown ] )\n}\n\nexport function useActiveTabDocs(): string | null {\n return useContext( PageDocsContext ).tabMarkdown\n}\n","import ReactMarkdown from 'react-markdown'\nimport { cn } from '../lib/utils'\nimport type { PageDocsPlugin } from '../plugins/types'\nimport { mdComponents } from './mdComponents'\n\ninterface DocsTriggerProps {\n href?: string\n open?: boolean\n onToggle?: () => void\n}\n\nconst triggerClass = ( active: boolean ) => cn(\n 'flex items-center gap-1.5 rounded-md border px-2.5 py-1 text-xs font-medium transition-colors',\n active\n ? 'border-primary/50 bg-primary/10 text-primary'\n : 'border-border bg-card text-muted-foreground hover:border-primary/30 hover:text-foreground'\n)\n\nconst TriggerIcon = () => (\n <span className=\"flex h-3.5 w-3.5 items-center justify-center rounded-full border border-current text-[9px] font-bold leading-none\">\n i\n </span>\n)\n\nexport function DocsTrigger( { href, open = false, onToggle }: DocsTriggerProps ) {\n if ( href != null ) {\n return (\n <div>\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className={triggerClass( false )}>\n <TriggerIcon />\n Docs\n </a>\n </div>\n )\n }\n return (\n <div>\n <button onClick={onToggle} className={triggerClass( open )}>\n <TriggerIcon />\n Docs\n </button>\n </div>\n )\n}\n\ninterface DocsSidePanelProps {\n pageDocs: PageDocsPlugin\n tabMarkdown: string | null\n onClose: () => void\n}\n\nexport function DocsSidePanel( { pageDocs, tabMarkdown, onClose }: DocsSidePanelProps ) {\n const title = pageDocs.path.replace( /^\\//, '' ) || 'docs'\n const Component = pageDocs.component\n\n return (\n <aside className=\"absolute right-0 top-0 bottom-0 z-20 w-[26rem] border-l border-border bg-card flex flex-col overflow-hidden shadow-xl\">\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-border\">\n <span className=\"text-sm font-semibold text-foreground\">{title}</span>\n <button\n onClick={onClose}\n className=\"text-xs text-muted-foreground hover:text-foreground transition-colors\"\n aria-label=\"Close docs panel\"\n >\n ✕\n </button>\n </div>\n\n <div className=\"flex-1 overflow-y-auto px-4 py-4\">\n {tabMarkdown != null && (\n <>\n <ReactMarkdown components={mdComponents}>{tabMarkdown}</ReactMarkdown>\n <hr className=\"border-border my-3\" />\n </>\n )}\n {Component != null && <Component />}\n </div>\n </aside>\n )\n}\n","import { isValidElement, createElement, useState, useEffect, type ReactNode } from 'react'\nimport { Route, Switch, useLocation } from 'wouter'\n\nimport { getPageDocs, getPages } from '../plugins/registry'\nimport { PageDocsProvider, useActiveTabDocs } from '../docs/PageDocsContext'\nimport { DocsTrigger, DocsSidePanel } from '../docs/DocsPanel'\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 return (\n <PageDocsProvider>\n <ShellContent fallback={fallback}>{children}</ShellContent>\n </PageDocsProvider>\n )\n}\n\nfunction ShellContent( { fallback, children }: ShellProps ) {\n const pages = getPages()\n const [ open, setOpen ] = useState( false )\n const [ location ] = useLocation()\n const pageDocs = getPageDocs( location )\n\n useEffect( () => { setOpen( false ) }, [ location ] )\n const tabMarkdown = useActiveTabDocs()\n\n return (\n <div className=\"relative flex flex-1 overflow-hidden\">\n <main className=\"relative flex-1 overflow-y-auto\">\n {pageDocs != null && (\n <div className=\"flex justify-end px-6 pt-4\">\n {pageDocs.href != null\n ? <DocsTrigger href={pageDocs.href} />\n : <DocsTrigger open={open} onToggle={() => setOpen( ( o ) => !o )} />}\n </div>\n )}\n <div className=\"px-6 pb-6 pt-4\">\n {children}\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 </div>\n </main>\n {open && pageDocs != null && pageDocs.href == null && (\n <DocsSidePanel\n pageDocs={pageDocs}\n tabMarkdown={tabMarkdown}\n onClose={() => setOpen( false )}\n />\n )}\n </div>\n )\n}\n","import type { NavItemPlugin } from '../plugins/types'\n\nexport interface NavSection {\n label: string\n sectionSort: number\n items: NavItemPlugin[]\n}\n\nexport interface GroupedNav {\n ungrouped: NavItemPlugin[]\n sections: NavSection[]\n}\n\nexport function groupNavItems( items: NavItemPlugin[] ): GroupedNav {\n const ungrouped: NavItemPlugin[] = []\n const sectionMap = new Map<string, NavSection>()\n\n for ( const item of items ) {\n if ( !item.section ) {\n ungrouped.push( item )\n continue\n }\n if ( !sectionMap.has( item.section ) ) {\n sectionMap.set( item.section, {\n label : item.section,\n sectionSort : item.sectionSort ?? item.sort ?? 0,\n items : [],\n } )\n }\n sectionMap.get( item.section )!.items.push( item )\n }\n\n ungrouped.sort( ( a, b ) => ( a.sort ?? 0 ) - ( b.sort ?? 0 ) )\n\n const sections = Array.from( sectionMap.values() )\n for ( const s of sections ) {\n s.items.sort( ( a, b ) => ( a.sort ?? 0 ) - ( b.sort ?? 0 ) )\n }\n sections.sort( ( a, b ) => {\n const d = a.sectionSort - b.sectionSort\n return d !== 0 ? d : a.label.localeCompare( b.label )\n } )\n\n return { ungrouped, sections }\n}\n","import { useState, useEffect, useCallback } from 'react'\nimport { Link, useLocation } from 'wouter'\nimport { ChevronLeft, ChevronDown } from 'lucide-react'\nimport { cn } from '../lib/utils'\nimport { getNavItems, getTopBarItems } from '../plugins/registry'\nimport { groupNavItems } from './groupNavItems'\nimport type { ComponentType } from 'react'\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\nconst STORAGE_COLLAPSED = 'imaginarium.ui.sidebar.collapsed'\nconst STORAGE_SECTIONS = 'imaginarium.ui.sidebar.sections'\n\nfunction readBool( key: string, fallback: boolean ): boolean {\n try {\n const v = localStorage.getItem( key )\n return v === null ? fallback : v === 'true'\n } catch { return fallback }\n}\n\nfunction readSections(): Set<string> {\n try {\n const v = localStorage.getItem( STORAGE_SECTIONS )\n if ( !v ) { return new Set() }\n const parsed = JSON.parse( v )\n return new Set( Array.isArray( parsed ) ? parsed as string[] : [] )\n } catch { return new Set() }\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 ) ) { return <img src={icon} alt=\"\" className={className} /> }\n return <span className={`${icon} ${className}`} aria-hidden=\"true\" />\n }\n const Icon = icon\n return <Icon className={className} />\n}\n\nexport interface AppSidebarProps {\n title?: string\n titleIcon?: IconRef\n rightSlot?: React.ReactNode\n}\n\nexport function AppSidebar( { title = 'Imaginarium', titleIcon, rightSlot }: AppSidebarProps ) {\n const [ location ] = useLocation()\n const [ collapsed, setCollapsed ] = useState( () => readBool( STORAGE_COLLAPSED, false ) )\n const [ collapsedSections, setCollapsedSections ] = useState<Set<string>>( readSections )\n\n useEffect( () => {\n try { localStorage.setItem( STORAGE_COLLAPSED, String( collapsed ) ) } catch { /* ignore */ }\n }, [ collapsed ] )\n\n useEffect( () => {\n try {\n localStorage.setItem( STORAGE_SECTIONS, JSON.stringify( Array.from( collapsedSections ) ) )\n } catch { /* ignore */ }\n }, [ collapsedSections ] )\n\n const toggleSidebar = useCallback( () => setCollapsed( v => !v ), [] )\n\n const toggleSection = useCallback( ( label: string ) => {\n setCollapsedSections( prev => {\n const next = new Set( prev )\n next.has( label ) ? next.delete( label ) : next.add( label )\n return next\n } )\n }, [] )\n\n const { ungrouped, sections } = groupNavItems( getNavItems() )\n const topBarItems = getTopBarItems()\n\n return (\n <aside\n className={cn(\n 'flex flex-col flex-shrink-0 border-r bg-background transition-[width] duration-200 ease-in-out overflow-hidden',\n collapsed ? 'w-[52px]' : 'w-[220px]',\n )}\n >\n {/* Header */}\n <div className=\"flex h-[52px] flex-shrink-0 items-center border-b px-2.5 gap-2\">\n {!collapsed && renderIcon( titleIcon, 'h-6 w-6' )}\n {!collapsed && (\n <span className=\"flex-1 truncate text-sm font-semibold\">{title}</span>\n )}\n <button\n onClick={toggleSidebar}\n aria-label={collapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n className={cn(\n 'flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md border text-muted-foreground',\n 'hover:bg-accent hover:text-accent-foreground transition-colors',\n collapsed && 'mx-auto border-transparent',\n )}\n >\n <ChevronLeft\n className={cn( 'h-4 w-4 transition-transform duration-200', collapsed && 'rotate-180' )}\n />\n </button>\n </div>\n\n {/* Nav */}\n <nav className=\"flex flex-1 flex-col gap-0.5 overflow-y-auto overflow-x-hidden p-1.5\">\n {/* Ungrouped items */}\n {ungrouped.map( ( { path, label, icon: Icon } ) => {\n const isActive = location === path || location.startsWith( `${path}/` )\n return (\n <Link\n key={path}\n href={path}\n title={collapsed ? label : undefined}\n className={cn(\n 'relative flex items-center gap-2.5 rounded-md px-2 py-1.5 text-sm text-muted-foreground',\n 'hover:bg-accent hover:text-accent-foreground transition-colors whitespace-nowrap',\n isActive && 'bg-accent/50 text-accent-foreground font-medium',\n collapsed && 'justify-center px-2',\n )}\n >\n {Icon && <Icon className=\"h-4 w-4 flex-shrink-0\" />}\n {!collapsed && <span>{label}</span>}\n </Link>\n )\n } )}\n\n {/* Sections */}\n {sections.map( ( section ) => {\n const isSectionCollapsed = !collapsed && collapsedSections.has( section.label )\n return (\n <div key={section.label} className=\"flex flex-col\">\n {/* Section divider + header */}\n <div className=\"my-1.5 h-px bg-border\" />\n {!collapsed && (\n <button\n onClick={() => toggleSection( section.label )}\n className={cn(\n 'flex items-center justify-between px-2 pb-1 pt-2.5',\n 'text-[10px] font-semibold uppercase tracking-widest text-muted-foreground',\n 'hover:text-foreground transition-colors cursor-pointer rounded-sm',\n )}\n >\n {section.label}\n <ChevronDown\n className={cn(\n 'h-3 w-3 transition-transform duration-200',\n isSectionCollapsed && '-rotate-90',\n )}\n />\n </button>\n )}\n\n {/* Section items */}\n <div\n className={cn(\n 'flex flex-col gap-0.5 overflow-hidden transition-all duration-200',\n isSectionCollapsed ? 'max-h-0 opacity-0' : 'max-h-screen opacity-100',\n )}\n >\n {section.items.map( ( { path, label, icon: Icon } ) => {\n const isActive = location === path || location.startsWith( `${path}/` )\n return (\n <Link\n key={path}\n href={path}\n title={collapsed ? label : undefined}\n className={cn(\n 'relative flex items-center gap-2.5 rounded-md px-2 py-1.5 text-sm text-muted-foreground',\n 'hover:bg-accent hover:text-accent-foreground transition-colors whitespace-nowrap',\n isActive && 'bg-accent/50 text-accent-foreground font-medium',\n collapsed && 'justify-center px-2',\n )}\n >\n {Icon && <Icon className=\"h-4 w-4 flex-shrink-0\" />}\n {!collapsed && <span>{label}</span>}\n </Link>\n )\n } )}\n </div>\n </div>\n )\n } )}\n </nav>\n\n {/* Footer: rightSlot + TopBarItems */}\n <div className={cn(\n 'flex flex-shrink-0 items-center border-t p-1.5',\n collapsed ? 'flex-col gap-1' : 'flex-row justify-end gap-0.5',\n )}>\n {!collapsed && rightSlot}\n {topBarItems.map( ( item ) => {\n const C = item.component\n return <C key={item.id} />\n } )}\n </div>\n </aside>\n )\n}\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' ) { \n return undefined \n }\n const code = new URLSearchParams( window.location.search ).get( 'error' )\n if ( !code ) { \n return undefined \n }\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 { getProviders } from '../plugins/registry'\nimport { AppSidebar, type AppSidebarProps, type IconRef } from './AppSidebar'\nimport { Shell, type ShellProps } from './Shell'\n\nfunction withProviders( tree: ReactNode ): ReactNode {\n const providers = getProviders()\n let wrapped = tree\n for ( const { component: Provider } of providers ) {\n wrapped = <Provider>{wrapped}</Provider>\n }\n return wrapped\n}\n\nexport interface ImaginariumAppProps {\n apiBaseUrl?: string\n queryClient?: QueryClient\n title?: string\n titleIcon?: IconRef\n navRightSlot?: AppSidebarProps['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?: AppSidebarProps['rightSlot']\n shellFallback?: ShellProps['fallback']\n children?: ReactNode\n} ) {\n return withProviders(\n <div className=\"flex h-screen overflow-hidden bg-background text-foreground\">\n <AppSidebar 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":["PageDocsContext","createContext","PageDocsProvider","children","tabMarkdown","setTabMarkdown","useState","jsx","useRegisterTabDocs","markdown","useContext","useEffect","useActiveTabDocs","triggerClass","active","cn","TriggerIcon","DocsTrigger","href","open","onToggle","jsxs","DocsSidePanel","pageDocs","onClose","title","Component","Fragment","ReactMarkdown","mdComponents","renderPageElement","plugin","element","isValidElement","createElement","Shell","fallback","ShellContent","pages","getPages","setOpen","location","useLocation","getPageDocs","o","Switch","page","Route","groupNavItems","items","ungrouped","sectionMap","item","a","b","sections","s","d","STORAGE_COLLAPSED","STORAGE_SECTIONS","readBool","key","v","readSections","parsed","URL_RE","renderIcon","icon","className","AppSidebar","titleIcon","rightSlot","collapsed","setCollapsed","collapsedSections","setCollapsedSections","toggleSidebar","useCallback","toggleSection","label","prev","next","getNavItems","topBarItems","getTopBarItems","ChevronLeft","path","Icon","isActive","Link","section","isSectionCollapsed","ChevronDown","C","ToastProvider","ToastPrimitives","ToastViewport","React","props","ref","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","Button","RequireAuth","fetchJson","useImaginariumApi","userPath","Config","isPending","isError","useQuery","LoginComponent","appTitle","resolvedTitle","withProviders","tree","providers","getProviders","wrapped","Provider","defaultQueryClient","QueryClient","GatedShell","navRightSlot","shellFallback","ImaginariumApp","apiBaseUrl","queryClient","qc","useMemo","requireAuth","resolvedTitleIcon","gated","QueryClientProvider","TooltipProvider","ImaginariumApiProvider"],"mappings":"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"}