@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.
Files changed (143) hide show
  1. package/LICENSE.md +3 -0
  2. package/README.md +4 -0
  3. package/dist/Card-CFK_M3Te.js +192 -0
  4. package/dist/Card-CFK_M3Te.js.map +1 -0
  5. package/dist/Card-Z-6q-k3a.cjs +2 -0
  6. package/dist/Card-Z-6q-k3a.cjs.map +1 -0
  7. package/dist/ImaginariumApp-CCSmWwRB.js +278 -0
  8. package/dist/ImaginariumApp-CCSmWwRB.js.map +1 -0
  9. package/dist/ImaginariumApp-DoCgiASz.cjs +2 -0
  10. package/dist/ImaginariumApp-DoCgiASz.cjs.map +1 -0
  11. package/dist/ImaginariumUI.d.ts +40 -0
  12. package/dist/ImaginariumUI.d.ts.map +1 -0
  13. package/dist/PluginSetup-Cauc3iMv.cjs +2 -0
  14. package/dist/PluginSetup-Cauc3iMv.cjs.map +1 -0
  15. package/dist/PluginSetup-DnpUFDph.js +459 -0
  16. package/dist/PluginSetup-DnpUFDph.js.map +1 -0
  17. package/dist/PluginSetup.d.ts +11 -0
  18. package/dist/PluginSetup.d.ts.map +1 -0
  19. package/dist/PluginTypes-Bt6202F8.js +7 -0
  20. package/dist/PluginTypes-Bt6202F8.js.map +1 -0
  21. package/dist/PluginTypes-DOX3G1ip.cjs +2 -0
  22. package/dist/PluginTypes-DOX3G1ip.cjs.map +1 -0
  23. package/dist/api/ImaginariumApiContext.d.ts +13 -0
  24. package/dist/api/ImaginariumApiContext.d.ts.map +1 -0
  25. package/dist/auth/LoginPage.d.ts +13 -0
  26. package/dist/auth/LoginPage.d.ts.map +1 -0
  27. package/dist/auth/RequireAuth.d.ts +23 -0
  28. package/dist/auth/RequireAuth.d.ts.map +1 -0
  29. package/dist/auth/index.d.ts +3 -0
  30. package/dist/auth/index.d.ts.map +1 -0
  31. package/dist/components/ui/Button.d.ts +12 -0
  32. package/dist/components/ui/Button.d.ts.map +1 -0
  33. package/dist/components/ui/Card.d.ts +9 -0
  34. package/dist/components/ui/Card.d.ts.map +1 -0
  35. package/dist/components/ui/Dialog.d.ts +20 -0
  36. package/dist/components/ui/Dialog.d.ts.map +1 -0
  37. package/dist/components/ui/Input.d.ts +4 -0
  38. package/dist/components/ui/Input.d.ts.map +1 -0
  39. package/dist/components/ui/Label.d.ts +6 -0
  40. package/dist/components/ui/Label.d.ts.map +1 -0
  41. package/dist/components/ui/Toast.d.ts +16 -0
  42. package/dist/components/ui/Toast.d.ts.map +1 -0
  43. package/dist/components/ui/Toaster.d.ts +2 -0
  44. package/dist/components/ui/Toaster.d.ts.map +1 -0
  45. package/dist/components/ui/Tooltip.d.ts +8 -0
  46. package/dist/components/ui/Tooltip.d.ts.map +1 -0
  47. package/dist/hooks/useToast.d.ts +45 -0
  48. package/dist/hooks/useToast.d.ts.map +1 -0
  49. package/dist/index.cjs +2 -0
  50. package/dist/index.cjs.map +1 -0
  51. package/dist/index.d.ts +18 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +122 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/lib/utils.d.ts +3 -0
  56. package/dist/lib/utils.d.ts.map +1 -0
  57. package/dist/plugins/PluginTypes.d.ts +4 -0
  58. package/dist/plugins/PluginTypes.d.ts.map +1 -0
  59. package/dist/plugins/index.d.ts +4 -0
  60. package/dist/plugins/index.d.ts.map +1 -0
  61. package/dist/plugins/registry.d.ts +8 -0
  62. package/dist/plugins/registry.d.ts.map +1 -0
  63. package/dist/plugins/types.d.ts +21 -0
  64. package/dist/plugins/types.d.ts.map +1 -0
  65. package/dist/plugins.cjs +2 -0
  66. package/dist/plugins.cjs.map +1 -0
  67. package/dist/plugins.js +14 -0
  68. package/dist/plugins.js.map +1 -0
  69. package/dist/registry--NcHYEqp.js +31 -0
  70. package/dist/registry--NcHYEqp.js.map +1 -0
  71. package/dist/registry-Nyaf2ket.cjs +2 -0
  72. package/dist/registry-Nyaf2ket.cjs.map +1 -0
  73. package/dist/shell/AppNav.d.ts +17 -0
  74. package/dist/shell/AppNav.d.ts.map +1 -0
  75. package/dist/shell/ImaginariumApp.d.ts +15 -0
  76. package/dist/shell/ImaginariumApp.d.ts.map +1 -0
  77. package/dist/shell/Shell.d.ts +7 -0
  78. package/dist/shell/Shell.d.ts.map +1 -0
  79. package/dist/shell/index.d.ts +4 -0
  80. package/dist/shell/index.d.ts.map +1 -0
  81. package/dist/shell.cjs +2 -0
  82. package/dist/shell.cjs.map +1 -0
  83. package/dist/shell.js +7 -0
  84. package/dist/shell.js.map +1 -0
  85. package/dist/system/ImagineSystemNavItem.d.ts +9 -0
  86. package/dist/system/ImagineSystemNavItem.d.ts.map +1 -0
  87. package/dist/system/ImagineSystemPage.d.ts +8 -0
  88. package/dist/system/ImagineSystemPage.d.ts.map +1 -0
  89. package/dist/system/ImagineSystemView.d.ts +12 -0
  90. package/dist/system/ImagineSystemView.d.ts.map +1 -0
  91. package/dist/system/PluginSetup.d.ts +23 -0
  92. package/dist/system/PluginSetup.d.ts.map +1 -0
  93. package/dist/system/index.d.ts +7 -0
  94. package/dist/system/index.d.ts.map +1 -0
  95. package/dist/system/types.d.ts +22 -0
  96. package/dist/system/types.d.ts.map +1 -0
  97. package/dist/system.cjs +2 -0
  98. package/dist/system.cjs.map +1 -0
  99. package/dist/system.js +11 -0
  100. package/dist/system.js.map +1 -0
  101. package/dist/theme/tailwind-preset.cjs +2 -0
  102. package/dist/theme/tailwind-preset.cjs.map +1 -0
  103. package/dist/theme/tailwind-preset.d.ts +4 -0
  104. package/dist/theme/tailwind-preset.d.ts.map +1 -0
  105. package/dist/theme/tailwind-preset.js +62 -0
  106. package/dist/theme/tailwind-preset.js.map +1 -0
  107. package/lib/index.cjs +2 -0
  108. package/lib/index.js +122 -0
  109. package/package.json +82 -0
  110. package/src/ImaginariumUI.tsx +98 -0
  111. package/src/PluginSetup.ts +30 -0
  112. package/src/api/ImaginariumApiContext.tsx +54 -0
  113. package/src/auth/LoginPage.tsx +84 -0
  114. package/src/auth/RequireAuth.tsx +72 -0
  115. package/src/auth/index.ts +2 -0
  116. package/src/components/ui/Button.tsx +49 -0
  117. package/src/components/ui/Card.tsx +58 -0
  118. package/src/components/ui/Dialog.tsx +105 -0
  119. package/src/components/ui/Input.tsx +22 -0
  120. package/src/components/ui/Label.tsx +19 -0
  121. package/src/components/ui/Toast.tsx +106 -0
  122. package/src/components/ui/Toaster.tsx +29 -0
  123. package/src/components/ui/Tooltip.tsx +26 -0
  124. package/src/hooks/useToast.ts +130 -0
  125. package/src/index.ts +63 -0
  126. package/src/lib/utils.ts +6 -0
  127. package/src/plugins/PluginTypes.ts +3 -0
  128. package/src/plugins/index.ts +10 -0
  129. package/src/plugins/leverege-plugin.d.ts +20 -0
  130. package/src/plugins/registry.ts +31 -0
  131. package/src/plugins/types.ts +19 -0
  132. package/src/shell/AppNav.tsx +63 -0
  133. package/src/shell/ImaginariumApp.tsx +78 -0
  134. package/src/shell/Shell.tsx +46 -0
  135. package/src/shell/index.ts +3 -0
  136. package/src/system/ImagineSystemNavItem.ts +9 -0
  137. package/src/system/ImagineSystemPage.tsx +7 -0
  138. package/src/system/ImagineSystemView.tsx +423 -0
  139. package/src/system/PluginSetup.ts +57 -0
  140. package/src/system/index.ts +14 -0
  141. package/src/system/types.ts +24 -0
  142. package/src/theme/index.css +133 -0
  143. package/src/theme/tailwind-preset.ts +62 -0
@@ -0,0 +1,459 @@
1
+ import { Config as v } from "@leverege/plugin";
2
+ import { P as ae, N as te } from "./PluginTypes-Bt6202F8.js";
3
+ import { jsx as a, jsxs as t } from "react/jsx-runtime";
4
+ import * as f from "react";
5
+ import { useState as j } from "react";
6
+ import { useQueryClient as se, useQuery as ie, useMutation as F } from "@tanstack/react-query";
7
+ import { X as K, Plus as E, Pencil as ne, Trash2 as oe, Save as re, Settings as le } from "lucide-react";
8
+ import { g as p, h as de, u as ce, B as h, C as R, d as me, e as ue, b as pe, a as L } from "./Card-CFK_M3Te.js";
9
+ import * as r from "@radix-ui/react-dialog";
10
+ import * as M from "@radix-ui/react-label";
11
+ import { cva as ge } from "class-variance-authority";
12
+ const ye = r.Root, De = r.Trigger, he = r.Portal, ke = r.Close, U = f.forwardRef(({ className: i, ...n }, o) => /* @__PURE__ */ a(
13
+ r.Overlay,
14
+ {
15
+ ref: o,
16
+ className: p(
17
+ "fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
18
+ i
19
+ ),
20
+ ...n
21
+ }
22
+ ));
23
+ U.displayName = r.Overlay.displayName;
24
+ const z = f.forwardRef(({ className: i, children: n, ...o }, g) => /* @__PURE__ */ t(he, { children: [
25
+ /* @__PURE__ */ a(U, {}),
26
+ /* @__PURE__ */ t(
27
+ r.Content,
28
+ {
29
+ ref: g,
30
+ className: p(
31
+ "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 sm:rounded-lg",
32
+ i
33
+ ),
34
+ ...o,
35
+ children: [
36
+ n,
37
+ /* @__PURE__ */ t(r.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground", children: [
38
+ /* @__PURE__ */ a(K, { className: "h-4 w-4" }),
39
+ /* @__PURE__ */ a("span", { className: "sr-only", children: "Close" })
40
+ ] })
41
+ ]
42
+ }
43
+ )
44
+ ] }));
45
+ z.displayName = r.Content.displayName;
46
+ const B = ({ className: i, ...n }) => /* @__PURE__ */ a(
47
+ "div",
48
+ {
49
+ className: p("flex flex-col space-y-1.5 text-center sm:text-left", i),
50
+ ...n
51
+ }
52
+ );
53
+ B.displayName = "DialogHeader";
54
+ const Q = ({ className: i, ...n }) => /* @__PURE__ */ a(
55
+ "div",
56
+ {
57
+ className: p(
58
+ "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
59
+ i
60
+ ),
61
+ ...n
62
+ }
63
+ );
64
+ Q.displayName = "DialogFooter";
65
+ const H = f.forwardRef(({ className: i, ...n }, o) => /* @__PURE__ */ a(
66
+ r.Title,
67
+ {
68
+ ref: o,
69
+ className: p("text-lg font-semibold leading-none tracking-tight", i),
70
+ ...n
71
+ }
72
+ ));
73
+ H.displayName = r.Title.displayName;
74
+ const $ = f.forwardRef(({ className: i, ...n }, o) => /* @__PURE__ */ a(
75
+ r.Description,
76
+ {
77
+ ref: o,
78
+ className: p("text-sm text-muted-foreground", i),
79
+ ...n
80
+ }
81
+ ));
82
+ $.displayName = r.Description.displayName;
83
+ const m = f.forwardRef(
84
+ ({ className: i, type: n, ...o }, g) => /* @__PURE__ */ a(
85
+ "input",
86
+ {
87
+ type: n,
88
+ className: p(
89
+ "flex h-9 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
90
+ i
91
+ ),
92
+ ref: g,
93
+ ...o
94
+ }
95
+ )
96
+ );
97
+ m.displayName = "Input";
98
+ const fe = ge(
99
+ "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
100
+ ), d = f.forwardRef(({ className: i, ...n }, o) => /* @__PURE__ */ a(M.Root, { ref: o, className: p(fe(), i), ...n }));
101
+ d.displayName = M.Root.displayName;
102
+ const J = {
103
+ displayName: "",
104
+ apiKey: "",
105
+ secret: "",
106
+ projectId: "",
107
+ systemId: "",
108
+ baseUrl: "",
109
+ audience: "",
110
+ type: "",
111
+ metadata: ""
112
+ };
113
+ function ve({
114
+ apiPath: i,
115
+ title: n = "Imagine Systems",
116
+ subtitle: o = "Manage Imagine API configurations for different systems",
117
+ dialogDescription: g = "Configure your Imagine API credentials."
118
+ } = {}) {
119
+ const u = i ?? v.get("ImagineSystemConfig", "apiPath", "/configs"), { toast: c } = de(), { fetchJson: x } = ce(), S = se(), [q, b] = j(!1), [y, C] = j(null), [s, l] = j(J), I = ["imaginarium", "system-configs", u], { data: w, isLoading: V } = ie({
120
+ queryKey: I,
121
+ queryFn: async () => {
122
+ const e = await x(u);
123
+ return Array.isArray(e) ? e : (e == null ? void 0 : e.items) ?? [];
124
+ }
125
+ }), P = F({
126
+ mutationFn: (e) => x(u, { method: "POST", body: JSON.stringify(e) }),
127
+ onSuccess: () => {
128
+ S.invalidateQueries({ queryKey: I }), c({ title: "Success", description: "System Configuration created successfully" }), k();
129
+ },
130
+ onError: (e) => {
131
+ c({ title: "Error", description: e.message, variant: "destructive" });
132
+ }
133
+ }), D = F({
134
+ mutationFn: ({ id: e, data: T }) => x(`${u}/${e}`, { method: "PATCH", body: JSON.stringify(T) }),
135
+ onSuccess: () => {
136
+ S.invalidateQueries({ queryKey: I }), c({ title: "Success", description: "System Configuration updated successfully" }), k();
137
+ },
138
+ onError: (e) => {
139
+ c({ title: "Error", description: e.message, variant: "destructive" });
140
+ }
141
+ }), W = F({
142
+ mutationFn: (e) => x(`${u}/${e}`, { method: "DELETE" }),
143
+ onSuccess: () => {
144
+ S.invalidateQueries({ queryKey: I }), c({ title: "Success", description: "System Configuration deleted successfully" });
145
+ },
146
+ onError: (e) => {
147
+ c({ title: "Error", description: e.message, variant: "destructive" });
148
+ }
149
+ }), O = () => {
150
+ C(null), l(J), b(!0);
151
+ }, Y = (e) => {
152
+ C(e), l({
153
+ displayName: e.displayName,
154
+ apiKey: e.apiKey,
155
+ secret: "",
156
+ projectId: e.projectId,
157
+ systemId: e.systemId,
158
+ baseUrl: e.baseUrl,
159
+ audience: e.audience ?? "",
160
+ type: e.type ?? "",
161
+ metadata: e.metadata ? JSON.stringify(e.metadata, null, 2) : ""
162
+ }), b(!0);
163
+ }, k = () => {
164
+ b(!1), C(null);
165
+ }, X = () => {
166
+ const { metadata: e, type: T, ...ee } = s;
167
+ return {
168
+ ...ee,
169
+ type: T.trim() || null,
170
+ metadata: e.trim() ? JSON.parse(e) : null
171
+ };
172
+ }, _ = () => {
173
+ let e;
174
+ try {
175
+ e = X();
176
+ } catch {
177
+ c({
178
+ title: "Invalid metadata",
179
+ description: "Metadata must be valid JSON",
180
+ variant: "destructive"
181
+ });
182
+ return;
183
+ }
184
+ y ? (s.secret.trim() || delete e.secret, D.mutate({ id: y.id, data: e })) : P.mutate(e);
185
+ }, G = (e) => {
186
+ window.confirm("Are you sure you want to delete this system configuration?") && W.mutate(e);
187
+ }, Z = !!(s.displayName.trim() && s.apiKey.trim() && (y || s.secret.trim()) && s.projectId.trim() && s.systemId.trim() && s.baseUrl.trim());
188
+ return /* @__PURE__ */ t("div", { className: "space-y-6", children: [
189
+ /* @__PURE__ */ t("div", { className: "flex items-center justify-between", children: [
190
+ /* @__PURE__ */ t("div", { children: [
191
+ /* @__PURE__ */ a("h2", { className: "text-2xl font-semibold", children: n }),
192
+ /* @__PURE__ */ a("p", { className: "text-sm text-muted-foreground", children: o })
193
+ ] }),
194
+ /* @__PURE__ */ t(h, { onClick: O, children: [
195
+ /* @__PURE__ */ a(E, { className: "w-4 h-4 mr-2" }),
196
+ "Add System"
197
+ ] })
198
+ ] }),
199
+ V ? /* @__PURE__ */ a("div", { className: "text-center text-muted-foreground", children: "Loading system configurations..." }) : w && w.length > 0 ? /* @__PURE__ */ a("div", { className: "grid gap-4", children: w.map((e) => /* @__PURE__ */ t(R, { children: [
200
+ /* @__PURE__ */ a(me, { children: /* @__PURE__ */ t("div", { className: "flex items-center justify-between", children: [
201
+ /* @__PURE__ */ t("div", { children: [
202
+ /* @__PURE__ */ a(ue, { children: e.displayName }),
203
+ /* @__PURE__ */ t(pe, { children: [
204
+ "Project: ",
205
+ e.projectId,
206
+ " | System: ",
207
+ e.systemId
208
+ ] })
209
+ ] }),
210
+ /* @__PURE__ */ t("div", { className: "flex gap-2", children: [
211
+ /* @__PURE__ */ a(h, { variant: "ghost", size: "icon", onClick: () => Y(e), children: /* @__PURE__ */ a(ne, { className: "w-4 h-4" }) }),
212
+ /* @__PURE__ */ a(h, { variant: "ghost", size: "icon", onClick: () => G(e.id), children: /* @__PURE__ */ a(oe, { className: "w-4 h-4" }) })
213
+ ] })
214
+ ] }) }),
215
+ /* @__PURE__ */ a(L, { className: "space-y-2", children: /* @__PURE__ */ t("div", { className: "grid grid-cols-2 gap-4 text-sm", children: [
216
+ /* @__PURE__ */ t("div", { children: [
217
+ /* @__PURE__ */ a("span", { className: "text-muted-foreground", children: "Base URL:" }),
218
+ /* @__PURE__ */ a("div", { className: "font-mono text-xs mt-1", children: e.baseUrl })
219
+ ] }),
220
+ /* @__PURE__ */ t("div", { children: [
221
+ /* @__PURE__ */ a("span", { className: "text-muted-foreground", children: "API Key:" }),
222
+ /* @__PURE__ */ a("div", { className: "font-mono text-xs mt-1", children: e.apiKey })
223
+ ] }),
224
+ e.audience && /* @__PURE__ */ t("div", { children: [
225
+ /* @__PURE__ */ a("span", { className: "text-muted-foreground", children: "Audience:" }),
226
+ /* @__PURE__ */ a("div", { className: "font-mono text-xs mt-1", children: e.audience })
227
+ ] }),
228
+ e.type && /* @__PURE__ */ t("div", { children: [
229
+ /* @__PURE__ */ a("span", { className: "text-muted-foreground", children: "Type:" }),
230
+ /* @__PURE__ */ a("div", { className: "font-mono text-xs mt-1", children: e.type })
231
+ ] }),
232
+ e.metadata && /* @__PURE__ */ t("div", { className: "col-span-2", children: [
233
+ /* @__PURE__ */ a("span", { className: "text-muted-foreground", children: "Metadata:" }),
234
+ /* @__PURE__ */ a("pre", { className: "font-mono text-xs mt-1 whitespace-pre-wrap", children: JSON.stringify(e.metadata, null, 2) })
235
+ ] })
236
+ ] }) })
237
+ ] }, e.id)) }) : /* @__PURE__ */ a(R, { children: /* @__PURE__ */ t(L, { className: "py-12 text-center", children: [
238
+ /* @__PURE__ */ a("p", { className: "text-muted-foreground mb-4", children: "No systems yet" }),
239
+ /* @__PURE__ */ t(h, { onClick: O, children: [
240
+ /* @__PURE__ */ a(E, { className: "w-4 h-4 mr-2" }),
241
+ "Add Your First System"
242
+ ] })
243
+ ] }) }),
244
+ /* @__PURE__ */ a(ye, { open: q, onOpenChange: b, children: /* @__PURE__ */ t(z, { className: "max-w-2xl max-h-[90vh] overflow-y-auto", children: [
245
+ /* @__PURE__ */ t(B, { children: [
246
+ /* @__PURE__ */ a(H, { children: y ? "Edit System" : "New System" }),
247
+ /* @__PURE__ */ a($, { children: g })
248
+ ] }),
249
+ /* @__PURE__ */ t("div", { className: "space-y-4 py-4", children: [
250
+ /* @__PURE__ */ t("div", { className: "space-y-2", children: [
251
+ /* @__PURE__ */ a(d, { htmlFor: "display-name", children: "Display Name" }),
252
+ /* @__PURE__ */ a(
253
+ m,
254
+ {
255
+ id: "display-name",
256
+ value: s.displayName,
257
+ onChange: (e) => l({ ...s, displayName: e.target.value }),
258
+ placeholder: "Production - Customer Name"
259
+ }
260
+ )
261
+ ] }),
262
+ /* @__PURE__ */ t("div", { className: "space-y-2", children: [
263
+ /* @__PURE__ */ a(d, { htmlFor: "base-url", children: "Base URL" }),
264
+ /* @__PURE__ */ a(
265
+ m,
266
+ {
267
+ id: "base-url",
268
+ type: "url",
269
+ value: s.baseUrl,
270
+ onChange: (e) => l({ ...s, baseUrl: e.target.value }),
271
+ placeholder: "https://prd-customer-imagine-api.leverege.com",
272
+ className: "font-mono"
273
+ }
274
+ )
275
+ ] }),
276
+ /* @__PURE__ */ t("div", { className: "grid grid-cols-2 gap-4", children: [
277
+ /* @__PURE__ */ t("div", { className: "space-y-2", children: [
278
+ /* @__PURE__ */ a(d, { htmlFor: "project-id", children: "Project ID" }),
279
+ /* @__PURE__ */ a(
280
+ m,
281
+ {
282
+ id: "project-id",
283
+ value: s.projectId,
284
+ onChange: (e) => l({ ...s, projectId: e.target.value }),
285
+ placeholder: "proj123",
286
+ className: "font-mono"
287
+ }
288
+ )
289
+ ] }),
290
+ /* @__PURE__ */ t("div", { className: "space-y-2", children: [
291
+ /* @__PURE__ */ a(d, { htmlFor: "system-id", children: "System ID" }),
292
+ /* @__PURE__ */ a(
293
+ m,
294
+ {
295
+ id: "system-id",
296
+ value: s.systemId,
297
+ onChange: (e) => l({ ...s, systemId: e.target.value }),
298
+ placeholder: "sys456",
299
+ className: "font-mono"
300
+ }
301
+ )
302
+ ] })
303
+ ] }),
304
+ /* @__PURE__ */ t("div", { className: "space-y-2", children: [
305
+ /* @__PURE__ */ a(d, { htmlFor: "api-key", children: "API Key" }),
306
+ /* @__PURE__ */ a(
307
+ m,
308
+ {
309
+ id: "api-key",
310
+ value: s.apiKey,
311
+ onChange: (e) => l({ ...s, apiKey: e.target.value }),
312
+ placeholder: "Enter API key (JWT issuer)",
313
+ className: "font-mono"
314
+ }
315
+ ),
316
+ /* @__PURE__ */ a("p", { className: "text-xs text-muted-foreground", children: "This will be used as the JWT issuer (iss claim)" })
317
+ ] }),
318
+ /* @__PURE__ */ t("div", { className: "space-y-2", children: [
319
+ /* @__PURE__ */ a(d, { htmlFor: "secret", children: "API Secret" }),
320
+ /* @__PURE__ */ a(
321
+ m,
322
+ {
323
+ id: "secret",
324
+ type: "password",
325
+ value: s.secret,
326
+ onChange: (e) => l({ ...s, secret: e.target.value }),
327
+ placeholder: y ? "Leave blank to keep current secret" : "Enter API secret",
328
+ className: "font-mono"
329
+ }
330
+ ),
331
+ /* @__PURE__ */ t("p", { className: "text-xs text-muted-foreground", children: [
332
+ "The Imagine API secret. It will be encrypted before storage.",
333
+ y && " Leave blank to keep the existing secret."
334
+ ] })
335
+ ] }),
336
+ /* @__PURE__ */ t("div", { className: "space-y-2", children: [
337
+ /* @__PURE__ */ a(d, { htmlFor: "audience", children: "Audience (Optional)" }),
338
+ /* @__PURE__ */ a(
339
+ m,
340
+ {
341
+ id: "audience",
342
+ value: s.audience,
343
+ onChange: (e) => l({ ...s, audience: e.target.value }),
344
+ placeholder: "Auto-extracted from base URL if not provided",
345
+ className: "font-mono"
346
+ }
347
+ )
348
+ ] }),
349
+ /* @__PURE__ */ t("div", { className: "space-y-2", children: [
350
+ /* @__PURE__ */ a(d, { htmlFor: "type", children: "Type (Optional)" }),
351
+ /* @__PURE__ */ a(
352
+ m,
353
+ {
354
+ id: "type",
355
+ value: s.type,
356
+ onChange: (e) => l({ ...s, type: e.target.value }),
357
+ placeholder: "imagine",
358
+ className: "font-mono"
359
+ }
360
+ )
361
+ ] }),
362
+ /* @__PURE__ */ t("div", { className: "space-y-2", children: [
363
+ /* @__PURE__ */ a(d, { htmlFor: "metadata", children: "Metadata (Optional)" }),
364
+ /* @__PURE__ */ a(
365
+ "textarea",
366
+ {
367
+ id: "metadata",
368
+ value: s.metadata,
369
+ onChange: (e) => l({ ...s, metadata: e.target.value }),
370
+ placeholder: '{ "region": "us-central1" }',
371
+ rows: 5,
372
+ className: "flex w-full rounded-md border border-input bg-background px-3 py-2 text-sm font-mono ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"
373
+ }
374
+ ),
375
+ /* @__PURE__ */ a("p", { className: "text-xs text-muted-foreground", children: "JSON object stored alongside the config. Leave empty to clear." })
376
+ ] })
377
+ ] }),
378
+ /* @__PURE__ */ t(Q, { children: [
379
+ /* @__PURE__ */ t(h, { variant: "outline", onClick: k, children: [
380
+ /* @__PURE__ */ a(K, { className: "w-4 h-4 mr-2" }),
381
+ "Cancel"
382
+ ] }),
383
+ /* @__PURE__ */ t(
384
+ h,
385
+ {
386
+ onClick: _,
387
+ disabled: !Z || P.isPending || D.isPending,
388
+ children: [
389
+ /* @__PURE__ */ a(re, { className: "w-4 h-4 mr-2" }),
390
+ P.isPending || D.isPending ? "Saving..." : "Save System"
391
+ ]
392
+ }
393
+ )
394
+ ] })
395
+ ] }) })
396
+ ] });
397
+ }
398
+ const A = {
399
+ id: "imaginarium.ImagineSystemPage",
400
+ path: "/system-config",
401
+ element: ve
402
+ }, N = {
403
+ id: "imaginarium.ImagineSystemNavItem",
404
+ path: "/system-config",
405
+ label: "Imagine Systems",
406
+ sort: 100,
407
+ icon: le
408
+ }, Te = A.id, je = N.id, Fe = {
409
+ install(i) {
410
+ const n = v.get(
411
+ "ImagineSystemConfig",
412
+ "path",
413
+ A.path
414
+ ), o = v.get(
415
+ "ImagineSystemConfig",
416
+ "navLabel",
417
+ N.label
418
+ ), g = v.get(
419
+ "ImagineSystemConfig",
420
+ "navSort",
421
+ N.sort
422
+ ), u = v.get(
423
+ "ImagineSystemConfig",
424
+ "navIcon",
425
+ N.icon
426
+ ), c = u === null ? void 0 : u;
427
+ i.addPlugin(ae, {
428
+ ...A,
429
+ path: n
430
+ }), i.addPlugin(te, {
431
+ ...N,
432
+ path: n,
433
+ label: o,
434
+ sort: g,
435
+ icon: c
436
+ });
437
+ }
438
+ };
439
+ export {
440
+ ye as D,
441
+ N as I,
442
+ d as L,
443
+ Fe as S,
444
+ je as a,
445
+ A as b,
446
+ Te as c,
447
+ ve as d,
448
+ ke as e,
449
+ z as f,
450
+ $ as g,
451
+ Q as h,
452
+ B as i,
453
+ U as j,
454
+ he as k,
455
+ H as l,
456
+ De as m,
457
+ m as n
458
+ };
459
+ //# sourceMappingURL=PluginSetup-DnpUFDph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluginSetup-DnpUFDph.js","sources":["../src/components/ui/Dialog.tsx","../src/components/ui/Input.tsx","../src/components/ui/Label.tsx","../src/system/ImagineSystemView.tsx","../src/system/ImagineSystemPage.tsx","../src/system/ImagineSystemNavItem.ts","../src/system/PluginSetup.ts"],"sourcesContent":["import * as React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { X } from 'lucide-react'\n\nimport { cn } from '../../lib/utils'\n\nconst Dialog = DialogPrimitive.Root\nconst DialogTrigger = DialogPrimitive.Trigger\nconst DialogPortal = DialogPrimitive.Portal\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>( ( { className, ...props }, ref ) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className,\n )}\n {...props}\n />\n) )\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>( ( { className, children, ...props }, ref ) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 sm:rounded-lg',\n className,\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n) )\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogHeader = ( { className, ...props }: React.HTMLAttributes<HTMLDivElement> ) => (\n <div\n className={cn( 'flex flex-col space-y-1.5 text-center sm:text-left', className )}\n {...props}\n />\n)\nDialogHeader.displayName = 'DialogHeader'\n\nconst DialogFooter = ( { className, ...props }: React.HTMLAttributes<HTMLDivElement> ) => (\n <div\n className={cn(\n 'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2',\n className,\n )}\n {...props}\n />\n)\nDialogFooter.displayName = 'DialogFooter'\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>( ( { className, ...props }, ref ) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn( 'text-lg font-semibold leading-none tracking-tight', className )}\n {...props}\n />\n) )\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>( ( { className, ...props }, ref ) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn( 'text-sm text-muted-foreground', className )}\n {...props}\n />\n) )\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}\n","import * as React from 'react'\n\nimport { cn } from '../../lib/utils'\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<'input'>>(\n ( { className, type, ...props }, ref ) => {\n return (\n <input\n type={type}\n className={cn(\n 'flex h-9 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n className,\n )}\n ref={ref}\n {...props}\n />\n )\n },\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","import * as React from 'react'\nimport * as LabelPrimitive from '@radix-ui/react-label'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../../lib/utils'\n\nconst labelVariants = cva(\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n)\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & VariantProps<typeof labelVariants>\n>( ( { className, ...props }, ref ) => (\n <LabelPrimitive.Root ref={ref} className={cn( labelVariants(), className )} {...props} />\n) )\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n","import { useState } from 'react'\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { Plus, Pencil, Trash2, Save, X } from 'lucide-react'\nimport { Config } from '@leverege/plugin'\n\nimport { Button } from '../components/ui/Button'\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from '../components/ui/Card'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '../components/ui/Dialog'\nimport { Input } from '../components/ui/Input'\nimport { Label } from '../components/ui/Label'\nimport { useToast } from '../hooks/useToast'\nimport { useImaginariumApi } from '../api/ImaginariumApiContext'\nimport type {\n ImagineSystemConfig,\n ImagineSystemConfigListResponse,\n} from './types'\n\ninterface ConfigFormData {\n displayName: string\n apiKey: string\n secret: string\n projectId: string\n systemId: string\n baseUrl: string\n audience: string\n type: string\n metadata: string\n}\n\nconst EMPTY_FORM: ConfigFormData = {\n displayName: '',\n apiKey: '',\n secret: '',\n projectId: '',\n systemId: '',\n baseUrl: '',\n audience: '',\n type: '',\n metadata: '',\n}\n\nexport interface ImagineSystemViewProps {\n /**\n * API path (relative to apiBaseUrl). When omitted, falls back to\n * `Config.get('ImagineSystemConfig', 'apiPath', '/configs')`.\n */\n apiPath?: string\n title?: string\n subtitle?: string\n dialogDescription?: string\n}\n\nexport default function ImagineSystemView( {\n apiPath: apiPathProp,\n title = 'Imagine Systems',\n subtitle = 'Manage Imagine API configurations for different systems',\n dialogDescription = 'Configure your Imagine API credentials.',\n}: ImagineSystemViewProps = {} ) {\n const apiPath = apiPathProp\n ?? Config.get<string>( 'ImagineSystemConfig', 'apiPath', '/configs' )\n const { toast } = useToast()\n const { fetchJson } = useImaginariumApi()\n const queryClient = useQueryClient()\n const [ isDialogOpen, setIsDialogOpen ] = useState( false )\n const [ editingConfig, setEditingConfig ] = useState<ImagineSystemConfig | null>( null )\n const [ formData, setFormData ] = useState<ConfigFormData>( EMPTY_FORM )\n\n const queryKey = [ 'imaginarium', 'system-configs', apiPath ] as const\n\n const { data: configs, isLoading } = useQuery<ImagineSystemConfig[]>( {\n queryKey,\n queryFn: async () => {\n const res = await fetchJson<ImagineSystemConfigListResponse | ImagineSystemConfig[]>( apiPath )\n return Array.isArray( res ) ? res : ( res?.items ?? [] )\n },\n } )\n\n const createMutation = useMutation( {\n mutationFn: ( data: Record<string, unknown> ) =>\n fetchJson( apiPath, { method: 'POST', body: JSON.stringify( data ) } ),\n onSuccess: () => {\n queryClient.invalidateQueries( { queryKey } )\n toast( { title: 'Success', description: 'System Configuration created successfully' } )\n closeDialog()\n },\n onError: ( error: Error ) => {\n toast( { title: 'Error', description: error.message, variant: 'destructive' } )\n },\n } )\n\n const updateMutation = useMutation( {\n mutationFn: ( { id, data }: { id: number; data: Record<string, unknown> } ) =>\n fetchJson( `${apiPath}/${id}`, { method: 'PATCH', body: JSON.stringify( data ) } ),\n onSuccess: () => {\n queryClient.invalidateQueries( { queryKey } )\n toast( { title: 'Success', description: 'System Configuration updated successfully' } )\n closeDialog()\n },\n onError: ( error: Error ) => {\n toast( { title: 'Error', description: error.message, variant: 'destructive' } )\n },\n } )\n\n const deleteMutation = useMutation( {\n mutationFn: ( id: number ) => fetchJson( `${apiPath}/${id}`, { method: 'DELETE' } ),\n onSuccess: () => {\n queryClient.invalidateQueries( { queryKey } )\n toast( { title: 'Success', description: 'System Configuration deleted successfully' } )\n },\n onError: ( error: Error ) => {\n toast( { title: 'Error', description: error.message, variant: 'destructive' } )\n },\n } )\n\n const openCreateDialog = () => {\n setEditingConfig( null )\n setFormData( EMPTY_FORM )\n setIsDialogOpen( true )\n }\n\n const openEditDialog = ( config: ImagineSystemConfig ) => {\n setEditingConfig( config )\n setFormData( {\n displayName: config.displayName,\n apiKey: config.apiKey,\n secret: '',\n projectId: config.projectId,\n systemId: config.systemId,\n baseUrl: config.baseUrl,\n audience: config.audience ?? '',\n type: config.type ?? '',\n metadata: config.metadata ? JSON.stringify( config.metadata, null, 2 ) : '',\n } )\n setIsDialogOpen( true )\n }\n\n const closeDialog = () => {\n setIsDialogOpen( false )\n setEditingConfig( null )\n }\n\n const buildPayload = (): Record<string, unknown> => {\n const { metadata, type, ...rest } = formData\n return {\n ...rest,\n type: type.trim() || null,\n metadata: metadata.trim() ? JSON.parse( metadata ) : null,\n }\n }\n\n const handleSubmit = () => {\n let payload: Record<string, unknown>\n try {\n payload = buildPayload()\n } catch {\n toast( {\n title: 'Invalid metadata',\n description: 'Metadata must be valid JSON',\n variant: 'destructive',\n } )\n return\n }\n if ( editingConfig ) {\n if ( !formData.secret.trim() ) { delete payload.secret }\n updateMutation.mutate( { id: editingConfig.id, data: payload } )\n } else {\n createMutation.mutate( payload )\n }\n }\n\n const handleDelete = ( id: number ) => {\n if ( window.confirm( 'Are you sure you want to delete this system configuration?' ) ) {\n deleteMutation.mutate( id )\n }\n }\n\n const isFormValid = Boolean(\n formData.displayName.trim()\n && formData.apiKey.trim()\n && ( editingConfig || formData.secret.trim() )\n && formData.projectId.trim()\n && formData.systemId.trim()\n && formData.baseUrl.trim(),\n )\n\n return (\n <div className=\"space-y-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h2 className=\"text-2xl font-semibold\">{title}</h2>\n <p className=\"text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n <Button onClick={openCreateDialog}>\n <Plus className=\"w-4 h-4 mr-2\" />\n Add System\n </Button>\n </div>\n\n {isLoading ? (\n <div className=\"text-center text-muted-foreground\">Loading system configurations...</div>\n ) : configs && configs.length > 0 ? (\n <div className=\"grid gap-4\">\n {configs.map( ( config ) => (\n <Card key={config.id}>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <div>\n <CardTitle>{config.displayName}</CardTitle>\n <CardDescription>\n Project: {config.projectId} | System: {config.systemId}\n </CardDescription>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => openEditDialog( config )}>\n <Pencil className=\"w-4 h-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" onClick={() => handleDelete( config.id )}>\n <Trash2 className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <div className=\"grid grid-cols-2 gap-4 text-sm\">\n <div>\n <span className=\"text-muted-foreground\">Base URL:</span>\n <div className=\"font-mono text-xs mt-1\">{config.baseUrl}</div>\n </div>\n <div>\n <span className=\"text-muted-foreground\">API Key:</span>\n <div className=\"font-mono text-xs mt-1\">{config.apiKey}</div>\n </div>\n {config.audience && (\n <div>\n <span className=\"text-muted-foreground\">Audience:</span>\n <div className=\"font-mono text-xs mt-1\">{config.audience}</div>\n </div>\n )}\n {config.type && (\n <div>\n <span className=\"text-muted-foreground\">Type:</span>\n <div className=\"font-mono text-xs mt-1\">{config.type}</div>\n </div>\n )}\n {config.metadata && (\n <div className=\"col-span-2\">\n <span className=\"text-muted-foreground\">Metadata:</span>\n <pre className=\"font-mono text-xs mt-1 whitespace-pre-wrap\">\n {JSON.stringify( config.metadata, null, 2 )}\n </pre>\n </div>\n )}\n </div>\n </CardContent>\n </Card>\n ) )}\n </div>\n ) : (\n <Card>\n <CardContent className=\"py-12 text-center\">\n <p className=\"text-muted-foreground mb-4\">No systems yet</p>\n <Button onClick={openCreateDialog}>\n <Plus className=\"w-4 h-4 mr-2\" />\n Add Your First System\n </Button>\n </CardContent>\n </Card>\n )}\n\n <Dialog open={isDialogOpen} onOpenChange={setIsDialogOpen}>\n <DialogContent className=\"max-w-2xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>\n {editingConfig ? 'Edit System' : 'New System'}\n </DialogTitle>\n <DialogDescription>{dialogDescription}</DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4 py-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"display-name\">Display Name</Label>\n <Input\n id=\"display-name\"\n value={formData.displayName}\n onChange={( e ) => setFormData( { ...formData, displayName: e.target.value } )}\n placeholder=\"Production - Customer Name\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"base-url\">Base URL</Label>\n <Input\n id=\"base-url\"\n type=\"url\"\n value={formData.baseUrl}\n onChange={( e ) => setFormData( { ...formData, baseUrl: e.target.value } )}\n placeholder=\"https://prd-customer-imagine-api.leverege.com\"\n className=\"font-mono\"\n />\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"project-id\">Project ID</Label>\n <Input\n id=\"project-id\"\n value={formData.projectId}\n onChange={( e ) => setFormData( { ...formData, projectId: e.target.value } )}\n placeholder=\"proj123\"\n className=\"font-mono\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"system-id\">System ID</Label>\n <Input\n id=\"system-id\"\n value={formData.systemId}\n onChange={( e ) => setFormData( { ...formData, systemId: e.target.value } )}\n placeholder=\"sys456\"\n className=\"font-mono\"\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"api-key\">API Key</Label>\n <Input\n id=\"api-key\"\n value={formData.apiKey}\n onChange={( e ) => setFormData( { ...formData, apiKey: e.target.value } )}\n placeholder=\"Enter API key (JWT issuer)\"\n className=\"font-mono\"\n />\n <p className=\"text-xs text-muted-foreground\">\n This will be used as the JWT issuer (iss claim)\n </p>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"secret\">API Secret</Label>\n <Input\n id=\"secret\"\n type=\"password\"\n value={formData.secret}\n onChange={( e ) => setFormData( { ...formData, secret: e.target.value } )}\n placeholder={editingConfig ? 'Leave blank to keep current secret' : 'Enter API secret'}\n className=\"font-mono\"\n />\n <p className=\"text-xs text-muted-foreground\">\n The Imagine API secret. It will be encrypted before storage.\n {editingConfig && ' Leave blank to keep the existing secret.'}\n </p>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"audience\">Audience (Optional)</Label>\n <Input\n id=\"audience\"\n value={formData.audience}\n onChange={( e ) => setFormData( { ...formData, audience: e.target.value } )}\n placeholder=\"Auto-extracted from base URL if not provided\"\n className=\"font-mono\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"type\">Type (Optional)</Label>\n <Input\n id=\"type\"\n value={formData.type}\n onChange={( e ) => setFormData( { ...formData, type: e.target.value } )}\n placeholder=\"imagine\"\n className=\"font-mono\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"metadata\">Metadata (Optional)</Label>\n <textarea\n id=\"metadata\"\n value={formData.metadata}\n onChange={( e ) => setFormData( { ...formData, metadata: e.target.value } )}\n placeholder='{ \"region\": \"us-central1\" }'\n rows={5}\n className=\"flex w-full rounded-md border border-input bg-background px-3 py-2 text-sm font-mono ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\"\n />\n <p className=\"text-xs text-muted-foreground\">\n JSON object stored alongside the config. Leave empty to clear.\n </p>\n </div>\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={closeDialog}>\n <X className=\"w-4 h-4 mr-2\" />\n Cancel\n </Button>\n <Button\n onClick={handleSubmit}\n disabled={!isFormValid || createMutation.isPending || updateMutation.isPending}\n >\n <Save className=\"w-4 h-4 mr-2\" />\n {createMutation.isPending || updateMutation.isPending ? 'Saving...' : 'Save System'}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n )\n}\n","import ImagineSystemView from './ImagineSystemView'\n\nexport default {\n id : 'imaginarium.ImagineSystemPage',\n path : '/system-config',\n element : ImagineSystemView,\n}\n","import { Settings } from 'lucide-react'\n\nexport default {\n id : 'imaginarium.ImagineSystemNavItem',\n path : '/system-config',\n label : 'Imagine Systems',\n sort : 100,\n icon : Settings,\n}\n","import { Config } from '@leverege/plugin'\n\nimport { NavItemType, PageType } from '../plugins/PluginTypes'\nimport ImagineSystemPage from './ImagineSystemPage'\nimport ImagineSystemNavItem from './ImagineSystemNavItem'\n\nexport const ImagineSystemPageId = ImagineSystemPage.id\nexport const ImagineSystemNavItemId = ImagineSystemNavItem.id\n\ninterface RegistryLike {\n addPlugin( type: string, plugin: unknown ): unknown\n}\n\n/**\n * Self-installs the ImagineSystem CRUD page + nav item, layering in any values\n * set under the `'ImagineSystemConfig'` Config resource on top of the static\n * defaults declared in `ImagineSystemPage` and `ImagineSystemNavItem`.\n *\n * Recognized config keys:\n * - `path` route path for the page (default `/system-config`)\n * - `apiPath` API path the view hits (default `/configs`; consumed by the view)\n * - `navLabel` nav button label (default `'Imagine Systems'`)\n * - `navSort` nav ordering (default `100`)\n * - `navIcon` lucide-react icon component (default `Settings`); set to\n * `null` to render no icon\n */\nexport const SystemPluginSetup = {\n install( plg: RegistryLike ) {\n const path = Config.get<string>(\n 'ImagineSystemConfig', 'path', ImagineSystemPage.path,\n )\n const label = Config.get<string>(\n 'ImagineSystemConfig', 'navLabel', ImagineSystemNavItem.label,\n )\n const sort = Config.get<number>(\n 'ImagineSystemConfig', 'navSort', ImagineSystemNavItem.sort,\n )\n const iconSetting = Config.get<typeof ImagineSystemNavItem.icon | null>(\n 'ImagineSystemConfig', 'navIcon', ImagineSystemNavItem.icon,\n )\n const icon = iconSetting === null ? undefined : iconSetting\n\n plg.addPlugin( PageType, {\n ...ImagineSystemPage,\n path,\n } )\n plg.addPlugin( NavItemType, {\n ...ImagineSystemNavItem,\n path,\n label,\n sort,\n icon,\n } )\n },\n}\n\nexport default SystemPluginSetup\n"],"names":["Dialog","DialogPrimitive","DialogTrigger","DialogPortal","DialogClose","DialogOverlay","React","className","props","ref","jsx","cn","DialogContent","children","jsxs","X","DialogHeader","DialogFooter","DialogTitle","DialogDescription","Input","type","labelVariants","cva","Label","LabelPrimitive","EMPTY_FORM","ImagineSystemView","apiPathProp","title","subtitle","dialogDescription","apiPath","Config","toast","useToast","fetchJson","useImaginariumApi","queryClient","useQueryClient","isDialogOpen","setIsDialogOpen","useState","editingConfig","setEditingConfig","formData","setFormData","queryKey","configs","isLoading","useQuery","res","createMutation","useMutation","data","closeDialog","error","updateMutation","id","deleteMutation","openCreateDialog","openEditDialog","config","buildPayload","metadata","rest","handleSubmit","payload","handleDelete","isFormValid","Button","Plus","Card","CardHeader","CardTitle","CardDescription","Pencil","Trash2","CardContent","Save","ImagineSystemPage","ImagineSystemNavItem","Settings","ImagineSystemPageId","ImagineSystemNavItemId","SystemPluginSetup","plg","path","label","sort","iconSetting","icon","PageType","NavItemType"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Composes every built-in plugin setup that ships with imaginarium-ui.
3
+ * Called by `ImaginariumUI.init` after Config values are loaded and any
4
+ * excludes/mutators have been registered, so each setup reads its tunables
5
+ * from `Config` and respects exclusions.
6
+ */
7
+ export declare const BuiltInPluginSetup: {
8
+ install(plg: any): void;
9
+ };
10
+ export default BuiltInPluginSetup;
11
+ //# sourceMappingURL=PluginSetup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluginSetup.d.ts","sourceRoot":"","sources":["../src/PluginSetup.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB;;CAgB9B,CAAA;AAED,eAAe,kBAAkB,CAAA"}
@@ -0,0 +1,7 @@
1
+ const a = "imaginarium.ui.Page", i = "imaginarium.ui.NavItem", e = "imaginarium.ui.Provider";
2
+ export {
3
+ i as N,
4
+ a as P,
5
+ e as a
6
+ };
7
+ //# sourceMappingURL=PluginTypes-Bt6202F8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluginTypes-Bt6202F8.js","sources":["../src/plugins/PluginTypes.ts"],"sourcesContent":["export const PageType = 'imaginarium.ui.Page'\nexport const NavItemType = 'imaginarium.ui.NavItem'\nexport const ProviderType = 'imaginarium.ui.Provider'\n"],"names":["PageType","NavItemType","ProviderType"],"mappings":"AAAO,MAAMA,IAAW,uBACXC,IAAc,0BACdC,IAAe;"}
@@ -0,0 +1,2 @@
1
+ "use strict";const e="imaginarium.ui.Page",i="imaginarium.ui.NavItem",a="imaginarium.ui.Provider";exports.NavItemType=i;exports.PageType=e;exports.ProviderType=a;
2
+ //# sourceMappingURL=PluginTypes-DOX3G1ip.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluginTypes-DOX3G1ip.cjs","sources":["../src/plugins/PluginTypes.ts"],"sourcesContent":["export const PageType = 'imaginarium.ui.Page'\nexport const NavItemType = 'imaginarium.ui.NavItem'\nexport const ProviderType = 'imaginarium.ui.Provider'\n"],"names":["PageType","NavItemType","ProviderType"],"mappings":"aAAO,MAAMA,EAAW,sBACXC,EAAc,yBACdC,EAAe"}
@@ -0,0 +1,13 @@
1
+ import { ReactNode } from 'react';
2
+ export interface ImaginariumApiContextValue {
3
+ apiBaseUrl: string;
4
+ fetchJson: <T = unknown>(path: string, init?: RequestInit) => Promise<T>;
5
+ buildUrl: (path: string) => string;
6
+ }
7
+ export interface ImaginariumApiProviderProps {
8
+ apiBaseUrl?: string;
9
+ children: ReactNode;
10
+ }
11
+ export declare function ImaginariumApiProvider({ apiBaseUrl, children }: ImaginariumApiProviderProps): import("react/jsx-runtime").JSX.Element;
12
+ export declare function useImaginariumApi(): ImaginariumApiContextValue;
13
+ //# sourceMappingURL=ImaginariumApiContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImaginariumApiContext.d.ts","sourceRoot":"","sources":["../../src/api/ImaginariumApiContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAE1E,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,CAAC,CAAC,GAAG,OAAO,EAAG,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAM,OAAO,CAAC,CAAC,CAAC,CAAA;IAC1E,QAAQ,EAAE,CAAE,IAAI,EAAE,MAAM,KAAM,MAAM,CAAA;CACrC;AAID,MAAM,WAAW,2BAA2B;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED,wBAAgB,sBAAsB,CAAE,EAAE,UAAmB,EAAE,QAAQ,EAAE,EAAE,2BAA2B,2CA8BrG;AAED,wBAAgB,iBAAiB,+BAMhC"}
@@ -0,0 +1,13 @@
1
+ export interface LoginPageProps {
2
+ loginPath: string;
3
+ title?: string;
4
+ subtitle?: string;
5
+ buttonLabel?: string;
6
+ /** URL of an image to show behind the sign-in card. Empty/null skips it. */
7
+ backgroundUrl?: string;
8
+ /** Optional message shown above the button (e.g. an error from a failed prior attempt). */
9
+ errorMessage?: string;
10
+ }
11
+ export declare function LoginPage({ loginPath, title, subtitle, buttonLabel, backgroundUrl, errorMessage, }: LoginPageProps): import("react/jsx-runtime").JSX.Element;
12
+ export default LoginPage;
13
+ //# sourceMappingURL=LoginPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoginPage.d.ts","sourceRoot":"","sources":["../../src/auth/LoginPage.tsx"],"names":[],"mappings":"AASA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,2FAA2F;IAC3F,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAwBD,wBAAgB,SAAS,CAAE,EACzB,SAAS,EACT,KAAiB,EACjB,QAAQ,EACR,WAAmC,EACnC,aAAa,EACb,YAAY,GACb,EAAE,cAAc,2CAgChB;AAED,eAAe,SAAS,CAAA"}
@@ -0,0 +1,23 @@
1
+ import { ReactNode } from 'react';
2
+ export interface RequireAuthProps {
3
+ children: ReactNode;
4
+ }
5
+ /**
6
+ * Wraps `children` with an authentication gate. On mount, fetches
7
+ * `Config.get('ImaginariumApp', 'userPath', '/auth/user')` from the configured
8
+ * API base URL. While loading, renders a small placeholder. On error, renders
9
+ * the configured login component (defaults to the bundled `LoginPage`). On
10
+ * success, renders `children`.
11
+ *
12
+ * Recognized config keys (under `'ImaginariumApp'`):
13
+ * - `userPath` endpoint to check (default `/auth/user`)
14
+ * - `loginPath` URL the login button navigates to (default `/api/login`)
15
+ * - `loginPage` component to render when unauthenticated
16
+ * - `loginTitle` default page heading
17
+ * - `loginSubtitle` default page subtitle
18
+ * - `loginButtonLabel` default button label
19
+ * - `loginBackgroundUrl` URL of an image to show behind the sign-in card
20
+ */
21
+ export declare function RequireAuth({ children }: RequireAuthProps): import("react/jsx-runtime").JSX.Element;
22
+ export default RequireAuth;
23
+ //# sourceMappingURL=RequireAuth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RequireAuth.d.ts","sourceRoot":"","sources":["../../src/auth/RequireAuth.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAOzE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAE,EAAE,QAAQ,EAAE,EAAE,gBAAgB,2CA0C1D;AAED,eAAe,WAAW,CAAA"}