convex-cms 0.0.9-alpha.5 → 0.0.9-alpha.7

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 (76) hide show
  1. package/admin/src/contexts/SettingsConfigContext.tsx +67 -11
  2. package/admin/src/embed/index.tsx +57 -67
  3. package/admin/src/embed/pages/Entry.tsx +4 -5
  4. package/admin/src/embed/pages/NewEntry.tsx +2 -1
  5. package/admin/src/embed/types.ts +0 -1
  6. package/admin/src/pages/SettingsPage.tsx +124 -80
  7. package/admin/src/routes/__root.tsx +4 -1
  8. package/admin-dist/nitro.json +1 -1
  9. package/admin-dist/public/assets/{CmsEmptyState-BM4e6N83.js → CmsEmptyState-gxhf-b6F.js} +1 -1
  10. package/admin-dist/public/assets/{CmsPageHeader-uor3DPIk.js → CmsPageHeader-equV7Sd9.js} +1 -1
  11. package/admin-dist/public/assets/{CmsStatusBadge-D8N18LJx.js → CmsStatusBadge-DQAslyW4.js} +1 -1
  12. package/admin-dist/public/assets/{CmsSurface-BEcY-WpI.js → CmsSurface-DdC_aGB5.js} +1 -1
  13. package/admin-dist/public/assets/{CmsToolbar-DE-bu3W8.js → CmsToolbar-Crleacii.js} +1 -1
  14. package/admin-dist/public/assets/{ContentEntryEditor-BdkIMCUk.js → ContentEntryEditor-RmtIo3lE.js} +1 -1
  15. package/admin-dist/public/assets/{TaxonomyFilter-a1-O9DPs.js → TaxonomyFilter-BsoK90hw.js} +1 -1
  16. package/admin-dist/public/assets/{_contentTypeId-XIkYOLyY.js → _contentTypeId-Bn2ItET5.js} +1 -1
  17. package/admin-dist/public/assets/{_entryId-DyP15QpI.js → _entryId-CkZWLvOZ.js} +1 -1
  18. package/admin-dist/public/assets/{alert-DHBQuuib.js → alert-C7q0k4u0.js} +1 -1
  19. package/admin-dist/public/assets/{badge-BOhWFWzb.js → badge-DiaAY1It.js} +1 -1
  20. package/admin-dist/public/assets/{circle-check-big-DjTNapen.js → circle-check-big-Bl0y10am.js} +1 -1
  21. package/admin-dist/public/assets/{command-BIc5_8gL.js → command-QyTDg7pa.js} +1 -1
  22. package/admin-dist/public/assets/{content-C3N8Ugra.js → content-D868GT7T.js} +1 -1
  23. package/admin-dist/public/assets/{content-types-D0wh1eUF.js → content-types-DD7fJA5i.js} +1 -1
  24. package/admin-dist/public/assets/{index-B-g3F_ri.js → index-CMnzrG_D.js} +1 -1
  25. package/admin-dist/public/assets/main-DWSY6jZL.js +107 -0
  26. package/admin-dist/public/assets/{media-8uh1MwDi.js → media-aqxopgtw.js} +1 -1
  27. package/admin-dist/public/assets/{new._contentTypeId-S96rFbgY.js → new._contentTypeId-9ji3Hibs.js} +1 -1
  28. package/admin-dist/public/assets/{pencil-DgaZav4e.js → pencil-D8GqMaV3.js} +1 -1
  29. package/admin-dist/public/assets/{refresh-cw-BBut4hAU.js → refresh-cw-JipRPLLT.js} +1 -1
  30. package/admin-dist/public/assets/{rotate-ccw-DVCkojZZ.js → rotate-ccw-CK11hP79.js} +1 -1
  31. package/admin-dist/public/assets/{scroll-area-DPC4uXzf.js → scroll-area-CJS1P20j.js} +1 -1
  32. package/admin-dist/public/assets/{search-CSyHHglh.js → search-BT8HTHxb.js} +1 -1
  33. package/admin-dist/public/assets/settings-DCY0s2hR.js +1 -0
  34. package/admin-dist/public/assets/{switch-O2BviO8Q.js → switch-Cb-ecsrJ.js} +1 -1
  35. package/admin-dist/public/assets/{tabs-p1MWhOqY.js → tabs-CFEXN2p7.js} +1 -1
  36. package/admin-dist/public/assets/{tanstack-adapter-CDrxoPZD.js → tanstack-adapter-CGxC-fmP.js} +1 -1
  37. package/admin-dist/public/assets/{taxonomies-DJ9UbjXW.js → taxonomies-C21Z8CBa.js} +1 -1
  38. package/admin-dist/public/assets/{trash-RnpP6lXF.js → trash-CMRJlzc0.js} +1 -1
  39. package/admin-dist/public/assets/{useBreadcrumbLabel-zbIWXlkc.js → useBreadcrumbLabel-ZZFYdqzi.js} +1 -1
  40. package/admin-dist/public/assets/{usePermissions-4CTlK-vU.js → usePermissions-C2FRye75.js} +1 -1
  41. package/admin-dist/server/_libs/convex-helpers.mjs +37 -0
  42. package/admin-dist/server/_libs/convex.mjs +1357 -168
  43. package/admin-dist/server/_ssr/{CmsEmptyState-BA0Lc5xs.mjs → CmsEmptyState-DWqt3y_O.mjs} +1 -1
  44. package/admin-dist/server/_ssr/{CmsPageHeader-PMyecILZ.mjs → CmsPageHeader-BuN0dOPA.mjs} +1 -1
  45. package/admin-dist/server/_ssr/{CmsStatusBadge-CInuN2bZ.mjs → CmsStatusBadge-CV35-X_8.mjs} +2 -2
  46. package/admin-dist/server/_ssr/{CmsSurface-CH1PIfcS.mjs → CmsSurface-DEcWf_aJ.mjs} +1 -1
  47. package/admin-dist/server/_ssr/{CmsToolbar-IuhSA7gR.mjs → CmsToolbar-BMBEZVgb.mjs} +1 -1
  48. package/admin-dist/server/_ssr/{ContentEntryEditor-Bzhir4fQ.mjs → ContentEntryEditor-Db9Sy_0y.mjs} +9 -9
  49. package/admin-dist/server/_ssr/{TaxonomyFilter-r4izSMBh.mjs → TaxonomyFilter-D_xDfC8t.mjs} +3 -3
  50. package/admin-dist/server/_ssr/{_contentTypeId-BWEbjqxY.mjs → _contentTypeId-HZlfcQi-.mjs} +12 -11
  51. package/admin-dist/server/_ssr/{_entryId-B5xoXoJf.mjs → _entryId-Cc_Ry7AV.mjs} +12 -11
  52. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-DhspKP9e.mjs +4 -0
  53. package/admin-dist/server/_ssr/{badge-DXrjBRqZ.mjs → badge-CmG74mbX.mjs} +1 -1
  54. package/admin-dist/server/_ssr/{command-Cj90OdCX.mjs → command-DWXiOsOb.mjs} +1 -1
  55. package/admin-dist/server/_ssr/{content-DKRI-YqL.mjs → content-CAgFQzx-.mjs} +10 -9
  56. package/admin-dist/server/_ssr/{content-types-BzgRcS8K.mjs → content-types-CqKvAZ8P.mjs} +7 -6
  57. package/admin-dist/server/_ssr/{index-BPf6_agY.mjs → index--qYdIqvh.mjs} +5 -4
  58. package/admin-dist/server/_ssr/index.mjs +2 -2
  59. package/admin-dist/server/_ssr/{media-MpjxOZL8.mjs → media-AXePwPAK.mjs} +11 -10
  60. package/admin-dist/server/_ssr/{new._contentTypeId-DSb4qR9j.mjs → new._contentTypeId-DNWIl-Ha.mjs} +11 -10
  61. package/admin-dist/server/_ssr/router-B_gIkxi2.mjs +8022 -0
  62. package/admin-dist/server/_ssr/{scroll-area-JwVD_6MZ.mjs → scroll-area-Cz-9ry0J.mjs} +1 -1
  63. package/admin-dist/server/_ssr/{settings-KVJNe0GM.mjs → settings-BjSxo5d6.mjs} +97 -81
  64. package/admin-dist/server/_ssr/{switch-DvREvRv4.mjs → switch-IsC1gdb1.mjs} +1 -1
  65. package/admin-dist/server/_ssr/{tabs-B0h57pFf.mjs → tabs-BdgLwrYe.mjs} +2 -2
  66. package/admin-dist/server/_ssr/{tanstack-adapter-gmM64LnW.mjs → tanstack-adapter-CFwjrqRl.mjs} +1 -1
  67. package/admin-dist/server/_ssr/{taxonomies-BbBNx260.mjs → taxonomies-D5Di9EgA.mjs} +9 -8
  68. package/admin-dist/server/_ssr/{trash-JAzYGh7A.mjs → trash-DokZl1yA.mjs} +9 -8
  69. package/admin-dist/server/_ssr/{useBreadcrumbLabel-BWIujj97.mjs → useBreadcrumbLabel-C4TsA5z0.mjs} +1 -1
  70. package/admin-dist/server/_ssr/{usePermissions-CcLDCSwa.mjs → usePermissions-COsRlMp-.mjs} +1 -1
  71. package/admin-dist/server/index.mjs +150 -150
  72. package/package.json +2 -1
  73. package/admin-dist/public/assets/main-BapBJgQD.js +0 -102
  74. package/admin-dist/public/assets/settings-cEqPsoJ0.js +0 -1
  75. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-CBTan6ii.mjs +0 -4
  76. package/admin-dist/server/_ssr/router-Dk9ikPNc.mjs +0 -3055
@@ -1,6 +1,6 @@
1
1
  import { j as jsxRuntimeExports } from "../_chunks/_libs/react.mjs";
2
2
  import { R as Root, V as Viewport, C as Corner, S as ScrollAreaScrollbar, a as ScrollAreaThumb } from "../_chunks/_libs/@radix-ui/react-scroll-area.mjs";
3
- import { f as cn } from "./router-Dk9ikPNc.mjs";
3
+ import { f as cn } from "./router-B_gIkxi2.mjs";
4
4
  function ScrollArea({
5
5
  className,
6
6
  children,
@@ -1,13 +1,13 @@
1
1
  import { j as jsxRuntimeExports, r as reactExports } from "../_chunks/_libs/react.mjs";
2
- import { h as api, j as useAdminConfig, R as RouteGuard, L as Label, C as CmsButton, S as Select, a as SelectTrigger, b as SelectValue, c as SelectContent, d as SelectItem, k as useTheme, f as cn } from "./router-Dk9ikPNc.mjs";
3
- import { B as Badge } from "./badge-DXrjBRqZ.mjs";
4
- import { u as useTanStackNavigation, A as Alert, a as AlertDescription } from "./tanstack-adapter-gmM64LnW.mjs";
5
- import { u as usePermissions } from "./usePermissions-CcLDCSwa.mjs";
6
- import { C as CmsPageHeader } from "./CmsPageHeader-PMyecILZ.mjs";
7
- import { C as CmsSurface } from "./CmsSurface-CH1PIfcS.mjs";
8
- import { S as Switch } from "./switch-DvREvRv4.mjs";
9
- import { u as useQuery, d as useMutation } from "../_libs/convex.mjs";
10
- import { a5 as Info, z as Lock, i as Check, X, a6 as Sun, a7 as Moon, a8 as Monitor } from "../_libs/lucide-react.mjs";
2
+ import { h as api, j as useAdminConfig, R as RouteGuard, C as CmsButton, L as Label, S as Select, a as SelectTrigger, b as SelectValue, c as SelectContent, d as SelectItem, k as useTheme, f as cn } from "./router-B_gIkxi2.mjs";
3
+ import { B as Badge } from "./badge-CmG74mbX.mjs";
4
+ import { u as useTanStackNavigation, A as Alert, a as AlertDescription } from "./tanstack-adapter-CFwjrqRl.mjs";
5
+ import { u as usePermissions } from "./usePermissions-COsRlMp-.mjs";
6
+ import { C as CmsPageHeader } from "./CmsPageHeader-BuN0dOPA.mjs";
7
+ import { C as CmsSurface } from "./CmsSurface-DEcWf_aJ.mjs";
8
+ import { S as Switch } from "./switch-IsC1gdb1.mjs";
9
+ import { u as useQuery, f as useMutation } from "../_libs/convex.mjs";
10
+ import { i as Check, X, z as Lock, a5 as Info, a6 as Sun, a7 as Moon, a8 as Monitor } from "../_libs/lucide-react.mjs";
11
11
  import "../_chunks/_libs/@tanstack/react-router.mjs";
12
12
  import "../_libs/tiny-warning.mjs";
13
13
  import "../_chunks/_libs/@tanstack/router-core.mjs";
@@ -23,6 +23,7 @@ import "stream";
23
23
  import "../_libs/isbot.mjs";
24
24
  import "../_libs/clsx.mjs";
25
25
  import "../_libs/tailwind-merge.mjs";
26
+ import "../_libs/convex-helpers.mjs";
26
27
  import "../_chunks/_libs/@radix-ui/react-collapsible.mjs";
27
28
  import "../_chunks/_libs/@radix-ui/primitive.mjs";
28
29
  import "../_chunks/_libs/@radix-ui/react-context.mjs";
@@ -130,20 +131,81 @@ function AppearanceSection() {
130
131
  ] }) })
131
132
  ] });
132
133
  }
133
- function SettingsPage({
134
- api: api2,
135
- navigation: _navigation
134
+ function SettingsPageUnconfigured() {
135
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(RouteGuard, { requiredPermission: { resource: "settings", action: "manage" }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-6 p-6", children: [
136
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
137
+ CmsPageHeader,
138
+ {
139
+ title: "Settings",
140
+ description: "Configure your CMS settings and preferences."
141
+ }
142
+ ),
143
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-6", children: [
144
+ /* @__PURE__ */ jsxRuntimeExports.jsx(AppearanceSection, {}),
145
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Alert, { children: [
146
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Info, { className: "size-4" }),
147
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(AlertDescription, { children: [
148
+ /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: "Settings not configured." }),
149
+ " To enable CMS settings, export",
150
+ " ",
151
+ /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "rounded bg-muted px-1 py-0.5 text-xs", children: "getSettings" }),
152
+ ",",
153
+ " ",
154
+ /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "rounded bg-muted px-1 py-0.5 text-xs", children: "updateSettings" }),
155
+ ", and",
156
+ " ",
157
+ /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "rounded bg-muted px-1 py-0.5 text-xs", children: "resetSettings" }),
158
+ " ",
159
+ "from your",
160
+ " ",
161
+ /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "rounded bg-muted px-1 py-0.5 text-xs", children: "convex/admin.ts" }),
162
+ " ",
163
+ "file."
164
+ ] })
165
+ ] }),
166
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(CmsSurface, { elevation: "base", className: "p-6", children: [
167
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-4 flex items-center gap-2", children: [
168
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-lg font-semibold text-foreground", children: "Features" }),
169
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Badge, { variant: "secondary", className: "gap-1", children: [
170
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Lock, { className: "size-3" }),
171
+ "Default values"
172
+ ] })
173
+ ] }),
174
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mb-4 text-sm text-muted-foreground", children: "Showing default feature flags. Configure settings in your admin API to customize." }),
175
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-4", children: [
176
+ "versioning",
177
+ "scheduling",
178
+ "localization",
179
+ "mediaManagement"
180
+ ].map((feature) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
181
+ "div",
182
+ {
183
+ className: "flex items-center justify-between opacity-75",
184
+ children: [
185
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Label, { className: "text-sm font-medium capitalize", children: feature }) }),
186
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Switch, { checked: DEFAULT_FEATURES[feature], disabled: true })
187
+ ]
188
+ },
189
+ feature
190
+ )) })
191
+ ] }),
192
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(CmsSurface, { elevation: "base", className: "p-6", children: [
193
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "mb-4 text-lg font-semibold text-foreground", children: "API" }),
194
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
195
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Label, { className: "text-sm font-medium", children: "Convex Deployment URL" }),
196
+ /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "mt-1 block rounded-md bg-muted px-3 py-2 text-sm", children: "https://majestic-beagle-49.convex.cloud" })
197
+ ] }) })
198
+ ] })
199
+ ] })
200
+ ] }) });
201
+ }
202
+ function SettingsPageConfigured({
203
+ api: api2
136
204
  }) {
137
205
  const { canManageSettings } = usePermissions();
138
206
  const canEdit = canManageSettings();
139
207
  const adminConfig = useAdminConfig();
140
- const isConfigured = reactExports.useMemo(() => {
141
- return api2.getSettings != null;
142
- }, [api2]);
143
- const settings = useQuery(
144
- isConfigured ? api2.getSettings : "skip",
145
- isConfigured ? {} : "skip"
146
- );
208
+ const settings = useQuery(api2.getSettings, {});
147
209
  const updateSettingsMutation = useMutation(
148
210
  api2.updateSettings ?? (() => {
149
211
  })
@@ -193,7 +255,7 @@ function SettingsPage({
193
255
  [formData]
194
256
  );
195
257
  const handleSave = reactExports.useCallback(async () => {
196
- if (!formData || !isDirty || !isConfigured || !api2.updateSettings) return;
258
+ if (!formData || !isDirty || !api2.updateSettings) return;
197
259
  setFeedbackStatus("saving");
198
260
  setErrorMessage(null);
199
261
  try {
@@ -243,7 +305,7 @@ function SettingsPage({
243
305
  error instanceof Error ? error.message : "Failed to reset settings"
244
306
  );
245
307
  }
246
- }, [isConfigured, api2.resetSettings, resetSettingsMutation]);
308
+ }, [api2.resetSettings, resetSettingsMutation]);
247
309
  const handleDiscard = reactExports.useCallback(() => {
248
310
  if (normalizedSettings) {
249
311
  setFormData(normalizedSettings);
@@ -252,66 +314,6 @@ function SettingsPage({
252
314
  setErrorMessage(null);
253
315
  }
254
316
  }, [normalizedSettings]);
255
- if (!isConfigured) {
256
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
257
- RouteGuard,
258
- {
259
- requiredPermission: { resource: "settings", action: "manage" },
260
- children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-6 p-6", children: [
261
- /* @__PURE__ */ jsxRuntimeExports.jsx(
262
- CmsPageHeader,
263
- {
264
- title: "Settings",
265
- description: "Configure your CMS settings and preferences."
266
- }
267
- ),
268
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-6", children: [
269
- /* @__PURE__ */ jsxRuntimeExports.jsx(AppearanceSection, {}),
270
- /* @__PURE__ */ jsxRuntimeExports.jsxs(Alert, { children: [
271
- /* @__PURE__ */ jsxRuntimeExports.jsx(Info, { className: "size-4" }),
272
- /* @__PURE__ */ jsxRuntimeExports.jsxs(AlertDescription, { children: [
273
- /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: "Settings not configured." }),
274
- " To enable CMS settings, export",
275
- " ",
276
- /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "rounded bg-muted px-1 py-0.5 text-xs", children: "getSettings" }),
277
- ",",
278
- " ",
279
- /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "rounded bg-muted px-1 py-0.5 text-xs", children: "updateSettings" }),
280
- ", and",
281
- " ",
282
- /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "rounded bg-muted px-1 py-0.5 text-xs", children: "resetSettings" }),
283
- " from your",
284
- " ",
285
- /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "rounded bg-muted px-1 py-0.5 text-xs", children: "convex/admin.ts" }),
286
- " file."
287
- ] })
288
- ] }),
289
- /* @__PURE__ */ jsxRuntimeExports.jsxs(CmsSurface, { elevation: "base", className: "p-6", children: [
290
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-4 flex items-center gap-2", children: [
291
- /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-lg font-semibold text-foreground", children: "Features" }),
292
- /* @__PURE__ */ jsxRuntimeExports.jsxs(Badge, { variant: "secondary", className: "gap-1", children: [
293
- /* @__PURE__ */ jsxRuntimeExports.jsx(Lock, { className: "size-3" }),
294
- "Default values"
295
- ] })
296
- ] }),
297
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mb-4 text-sm text-muted-foreground", children: "Showing default feature flags. Configure settings in your admin API to customize." }),
298
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-4", children: ["versioning", "scheduling", "localization", "mediaManagement"].map((feature) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between opacity-75", children: [
299
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Label, { className: "text-sm font-medium capitalize", children: feature }) }),
300
- /* @__PURE__ */ jsxRuntimeExports.jsx(Switch, { checked: DEFAULT_FEATURES[feature], disabled: true })
301
- ] }, feature)) })
302
- ] }),
303
- /* @__PURE__ */ jsxRuntimeExports.jsxs(CmsSurface, { elevation: "base", className: "p-6", children: [
304
- /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "mb-4 text-lg font-semibold text-foreground", children: "API" }),
305
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
306
- /* @__PURE__ */ jsxRuntimeExports.jsx(Label, { className: "text-sm font-medium", children: "Convex Deployment URL" }),
307
- /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "mt-1 block rounded-md bg-muted px-3 py-2 text-sm", children: "https://majestic-beagle-49.convex.cloud" })
308
- ] }) })
309
- ] })
310
- ] })
311
- ] })
312
- }
313
- );
314
- }
315
317
  if (settings === void 0) {
316
318
  return /* @__PURE__ */ jsxRuntimeExports.jsx(
317
319
  RouteGuard,
@@ -478,6 +480,20 @@ function SettingsPage({
478
480
  ] })
479
481
  ] }) });
480
482
  }
483
+ function SettingsPage({
484
+ api: api2,
485
+ navigation: _navigation
486
+ }) {
487
+ if (api2.getSettings) {
488
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
489
+ SettingsPageConfigured,
490
+ {
491
+ api: api2
492
+ }
493
+ );
494
+ }
495
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsPageUnconfigured, {});
496
+ }
481
497
  function SettingsRoute() {
482
498
  const navigation = useTanStackNavigation();
483
499
  return /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsPage, { api: api.admin, navigation });
@@ -1,6 +1,6 @@
1
1
  import { j as jsxRuntimeExports } from "../_chunks/_libs/react.mjs";
2
2
  import { R as Root, T as Thumb } from "../_chunks/_libs/@radix-ui/react-switch.mjs";
3
- import { f as cn } from "./router-Dk9ikPNc.mjs";
3
+ import { f as cn } from "./router-B_gIkxi2.mjs";
4
4
  function Switch({
5
5
  className,
6
6
  ...props
@@ -1,8 +1,8 @@
1
1
  import { j as jsxRuntimeExports, r as reactExports } from "../_chunks/_libs/react.mjs";
2
- import { f as cn, C as CmsButton } from "./router-Dk9ikPNc.mjs";
2
+ import { f as cn, C as CmsButton } from "./router-B_gIkxi2.mjs";
3
3
  import { R as Root2, L as List, T as Trigger, C as Content } from "../_chunks/_libs/@radix-ui/react-tabs.mjs";
4
4
  import { j as CircleAlert, ab as Upload, X, ao as RefreshCw, i as Check } from "../_libs/lucide-react.mjs";
5
- import { d as useMutation } from "../_libs/convex.mjs";
5
+ import { f as useMutation } from "../_libs/convex.mjs";
6
6
  function generateUploadId() {
7
7
  return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
8
8
  }
@@ -1,6 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_chunks/_libs/react.mjs";
2
2
  import { c as cva } from "../_libs/class-variance-authority.mjs";
3
- import { f as cn } from "./router-Dk9ikPNc.mjs";
3
+ import { f as cn } from "./router-B_gIkxi2.mjs";
4
4
  import { d as useNavigate, e as useLocation, f as useParams } from "../_chunks/_libs/@tanstack/react-router.mjs";
5
5
  const alertVariants = cva(
6
6
  "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",
@@ -1,12 +1,12 @@
1
1
  import { j as jsxRuntimeExports, r as reactExports } from "../_chunks/_libs/react.mjs";
2
- import { h as api, C as CmsButton, f as cn, g as CmsConfirmDialog, u as useApi, i as CmsDialog, L as Label, I as Input, T as Textarea, e as Checkbox } from "./router-Dk9ikPNc.mjs";
3
- import { B as Badge } from "./badge-DXrjBRqZ.mjs";
4
- import { u as useTanStackNavigation } from "./tanstack-adapter-gmM64LnW.mjs";
5
- import { C as CmsEmptyState } from "./CmsEmptyState-BA0Lc5xs.mjs";
6
- import { C as CmsPageHeader } from "./CmsPageHeader-PMyecILZ.mjs";
7
- import { C as CmsSurface } from "./CmsSurface-CH1PIfcS.mjs";
8
- import { S as ScrollArea } from "./scroll-area-JwVD_6MZ.mjs";
9
- import { u as useQuery, d as useMutation } from "../_libs/convex.mjs";
2
+ import { h as api, C as CmsButton, f as cn, g as CmsConfirmDialog, u as useApi, i as CmsDialog, L as Label, I as Input, T as Textarea, e as Checkbox } from "./router-B_gIkxi2.mjs";
3
+ import { B as Badge } from "./badge-CmG74mbX.mjs";
4
+ import { u as useTanStackNavigation } from "./tanstack-adapter-CFwjrqRl.mjs";
5
+ import { C as CmsEmptyState } from "./CmsEmptyState-DWqt3y_O.mjs";
6
+ import { C as CmsPageHeader } from "./CmsPageHeader-BuN0dOPA.mjs";
7
+ import { C as CmsSurface } from "./CmsSurface-DEcWf_aJ.mjs";
8
+ import { S as ScrollArea } from "./scroll-area-Cz-9ry0J.mjs";
9
+ import { u as useQuery, f as useMutation } from "../_libs/convex.mjs";
10
10
  import { P as Plus, W as Tag, a3 as Pencil, I as Trash2, a4 as FolderTree, N as Tags, d as ChevronDown, h as ChevronRight } from "../_libs/lucide-react.mjs";
11
11
  import "../_chunks/_libs/@tanstack/react-router.mjs";
12
12
  import "../_libs/tiny-warning.mjs";
@@ -23,6 +23,7 @@ import "stream";
23
23
  import "../_libs/isbot.mjs";
24
24
  import "../_libs/clsx.mjs";
25
25
  import "../_libs/tailwind-merge.mjs";
26
+ import "../_libs/convex-helpers.mjs";
26
27
  import "../_chunks/_libs/@radix-ui/react-collapsible.mjs";
27
28
  import "../_chunks/_libs/@radix-ui/primitive.mjs";
28
29
  import "../_chunks/_libs/@radix-ui/react-context.mjs";
@@ -1,12 +1,12 @@
1
1
  import { j as jsxRuntimeExports, r as reactExports } from "../_chunks/_libs/react.mjs";
2
- import { h as api, C as CmsButton, I as Input, S as Select, a as SelectTrigger, b as SelectValue, c as SelectContent, d as SelectItem, e as Checkbox, f as cn, g as CmsConfirmDialog } from "./router-Dk9ikPNc.mjs";
3
- import { B as Badge } from "./badge-DXrjBRqZ.mjs";
4
- import { u as useTanStackNavigation, A as Alert, a as AlertDescription } from "./tanstack-adapter-gmM64LnW.mjs";
5
- import { C as CmsPageHeader } from "./CmsPageHeader-PMyecILZ.mjs";
6
- import { C as CmsToolbar } from "./CmsToolbar-IuhSA7gR.mjs";
7
- import { C as CmsEmptyState } from "./CmsEmptyState-BA0Lc5xs.mjs";
8
- import { C as CmsSurface } from "./CmsSurface-CH1PIfcS.mjs";
9
- import { u as useQuery, d as useMutation } from "../_libs/convex.mjs";
2
+ import { h as api, C as CmsButton, I as Input, S as Select, a as SelectTrigger, b as SelectValue, c as SelectContent, d as SelectItem, e as Checkbox, f as cn, g as CmsConfirmDialog } from "./router-B_gIkxi2.mjs";
3
+ import { B as Badge } from "./badge-CmG74mbX.mjs";
4
+ import { u as useTanStackNavigation, A as Alert, a as AlertDescription } from "./tanstack-adapter-CFwjrqRl.mjs";
5
+ import { C as CmsPageHeader } from "./CmsPageHeader-BuN0dOPA.mjs";
6
+ import { C as CmsToolbar } from "./CmsToolbar-BMBEZVgb.mjs";
7
+ import { C as CmsEmptyState } from "./CmsEmptyState-DWqt3y_O.mjs";
8
+ import { C as CmsSurface } from "./CmsSurface-DEcWf_aJ.mjs";
9
+ import { u as useQuery, f as useMutation } from "../_libs/convex.mjs";
10
10
  import { I as Trash2, a1 as Search, a0 as TriangleAlert, X, a2 as RotateCcw } from "../_libs/lucide-react.mjs";
11
11
  import "../_chunks/_libs/@tanstack/react-router.mjs";
12
12
  import "../_libs/tiny-warning.mjs";
@@ -23,6 +23,7 @@ import "stream";
23
23
  import "../_libs/isbot.mjs";
24
24
  import "../_libs/clsx.mjs";
25
25
  import "../_libs/tailwind-merge.mjs";
26
+ import "../_libs/convex-helpers.mjs";
26
27
  import "../_chunks/_libs/@radix-ui/react-collapsible.mjs";
27
28
  import "../_chunks/_libs/@radix-ui/primitive.mjs";
28
29
  import "../_chunks/_libs/@radix-ui/react-context.mjs";
@@ -1,5 +1,5 @@
1
1
  import { r as reactExports } from "../_chunks/_libs/react.mjs";
2
- import { M as useBreadcrumbContext } from "./router-Dk9ikPNc.mjs";
2
+ import { M as useBreadcrumbContext } from "./router-B_gIkxi2.mjs";
3
3
  function useBreadcrumbLabel(path, label) {
4
4
  const { setOverride, clearOverride } = useBreadcrumbContext();
5
5
  reactExports.useEffect(() => {
@@ -1,5 +1,5 @@
1
1
  import { r as reactExports } from "../_chunks/_libs/react.mjs";
2
- import { E as useAuth, F as getResourcePermissions, G as canAccessResource, H as hasPermission } from "./router-Dk9ikPNc.mjs";
2
+ import { E as useAuth, F as getResourcePermissions, G as canAccessResource, H as hasPermission } from "./router-B_gIkxi2.mjs";
3
3
  function usePermissions() {
4
4
  const { role } = useAuth();
5
5
  return reactExports.useMemo(() => {