@vertebr/react 0.8.1 → 0.10.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 (109) hide show
  1. package/dist/components/admin/AddonEditor.d.ts +13 -0
  2. package/dist/components/admin/AddonEditor.d.ts.map +1 -0
  3. package/dist/components/admin/AddonEditor.js +27 -0
  4. package/dist/components/admin/AddonOverview.d.ts +8 -0
  5. package/dist/components/admin/AddonOverview.d.ts.map +1 -0
  6. package/dist/components/admin/AddonOverview.js +125 -0
  7. package/dist/components/admin/AddonPreviewThumb.d.ts +11 -0
  8. package/dist/components/admin/AddonPreviewThumb.d.ts.map +1 -0
  9. package/dist/components/admin/AddonPreviewThumb.js +52 -0
  10. package/dist/components/admin/AdminCommandPalette.d.ts +9 -0
  11. package/dist/components/admin/AdminCommandPalette.d.ts.map +1 -0
  12. package/dist/components/admin/AdminCommandPalette.js +68 -0
  13. package/dist/components/admin/AdminContent.d.ts +4 -1
  14. package/dist/components/admin/AdminContent.d.ts.map +1 -1
  15. package/dist/components/admin/AdminContent.js +32 -10
  16. package/dist/components/admin/AdminHeader.d.ts +2 -3
  17. package/dist/components/admin/AdminHeader.d.ts.map +1 -1
  18. package/dist/components/admin/AdminHeader.js +10 -3
  19. package/dist/components/admin/AdminPoweredBy.d.ts +5 -0
  20. package/dist/components/admin/AdminPoweredBy.d.ts.map +1 -0
  21. package/dist/components/admin/AdminPoweredBy.js +8 -0
  22. package/dist/components/admin/AdminSidebar.d.ts.map +1 -1
  23. package/dist/components/admin/AdminSidebar.js +9 -7
  24. package/dist/components/admin/AdminSyncPage.d.ts +7 -0
  25. package/dist/components/admin/AdminSyncPage.d.ts.map +1 -0
  26. package/dist/components/admin/AdminSyncPage.js +169 -0
  27. package/dist/components/admin/AdminTopBar.d.ts +11 -3
  28. package/dist/components/admin/AdminTopBar.d.ts.map +1 -1
  29. package/dist/components/admin/AdminTopBar.js +27 -4
  30. package/dist/components/admin/AuditBoard.d.ts +7 -0
  31. package/dist/components/admin/AuditBoard.d.ts.map +1 -0
  32. package/dist/components/admin/AuditBoard.js +43 -0
  33. package/dist/components/admin/HealthModal.d.ts +9 -0
  34. package/dist/components/admin/HealthModal.d.ts.map +1 -0
  35. package/dist/components/admin/HealthModal.js +59 -0
  36. package/dist/components/admin/PagePreviewPane.d.ts +3 -1
  37. package/dist/components/admin/PagePreviewPane.d.ts.map +1 -1
  38. package/dist/components/admin/PagePreviewPane.js +2 -2
  39. package/dist/components/admin/VertebrAdmin.d.ts.map +1 -1
  40. package/dist/components/admin/VertebrAdmin.js +146 -17
  41. package/dist/components/admin/addonLabels.d.ts +6 -0
  42. package/dist/components/admin/addonLabels.d.ts.map +1 -0
  43. package/dist/components/admin/addonLabels.js +20 -0
  44. package/dist/components/admin/adminSearch.d.ts +12 -0
  45. package/dist/components/admin/adminSearch.d.ts.map +1 -0
  46. package/dist/components/admin/adminSearch.js +120 -0
  47. package/dist/components/admin/breadcrumbs.d.ts.map +1 -1
  48. package/dist/components/admin/breadcrumbs.js +14 -0
  49. package/dist/components/admin/routes.d.ts.map +1 -1
  50. package/dist/components/admin/routes.js +43 -1
  51. package/dist/components/admin/types.d.ts +9 -0
  52. package/dist/components/admin/types.d.ts.map +1 -1
  53. package/dist/components/config/ReferenceInput.d.ts +11 -0
  54. package/dist/components/config/ReferenceInput.d.ts.map +1 -0
  55. package/dist/components/config/ReferenceInput.js +99 -0
  56. package/dist/components/config/RevisionHistory.d.ts +8 -0
  57. package/dist/components/config/RevisionHistory.d.ts.map +1 -0
  58. package/dist/components/config/RevisionHistory.js +84 -0
  59. package/dist/components/config/form/ConfigField.d.ts +3 -2
  60. package/dist/components/config/form/ConfigField.d.ts.map +1 -1
  61. package/dist/components/config/form/ConfigField.js +3 -2
  62. package/dist/components/config/form/ConfigForm.d.ts +1 -1
  63. package/dist/components/config/form/ConfigForm.d.ts.map +1 -1
  64. package/dist/components/config/form/ConfigForm.js +13 -6
  65. package/dist/components/config/form/RecordConfigForm.d.ts +3 -2
  66. package/dist/components/config/form/RecordConfigForm.d.ts.map +1 -1
  67. package/dist/components/config/form/RecordConfigForm.js +2 -1
  68. package/dist/components/config/form/SettingsConfigForm.d.ts +3 -2
  69. package/dist/components/config/form/SettingsConfigForm.d.ts.map +1 -1
  70. package/dist/components/config/form/SettingsConfigForm.js +2 -2
  71. package/dist/components/config/form/types.d.ts +5 -1
  72. package/dist/components/config/form/types.d.ts.map +1 -1
  73. package/dist/components/env/EnvMultiSelect.d.ts +20 -0
  74. package/dist/components/env/EnvMultiSelect.d.ts.map +1 -0
  75. package/dist/components/env/EnvMultiSelect.js +38 -0
  76. package/dist/components/resources/ResourceTable.d.ts +7 -1
  77. package/dist/components/resources/ResourceTable.d.ts.map +1 -1
  78. package/dist/components/resources/ResourceTable.js +56 -6
  79. package/dist/components/theme/ThemeToggle.d.ts +3 -1
  80. package/dist/components/theme/ThemeToggle.d.ts.map +1 -1
  81. package/dist/components/theme/ThemeToggle.js +2 -2
  82. package/dist/components/ui/icons.d.ts +3 -0
  83. package/dist/components/ui/icons.d.ts.map +1 -1
  84. package/dist/components/ui/icons.js +17 -0
  85. package/dist/index.d.ts +2 -1
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +1 -0
  88. package/dist/lib/capabilities.d.ts +4 -0
  89. package/dist/lib/capabilities.d.ts.map +1 -0
  90. package/dist/lib/capabilities.js +9 -0
  91. package/dist/styles/addon.css +540 -0
  92. package/dist/styles/audit.css +34 -0
  93. package/dist/styles/base.css +1 -0
  94. package/dist/styles/font-library.css +2 -0
  95. package/dist/styles/form.css +143 -0
  96. package/dist/styles/index.css +3 -0
  97. package/dist/styles/main.css +0 -38
  98. package/dist/styles/modal.css +113 -0
  99. package/dist/styles/motion.css +55 -0
  100. package/dist/styles/nav.css +39 -4
  101. package/dist/styles/select.css +6 -0
  102. package/dist/styles/shell.css +417 -14
  103. package/dist/styles/sidebar.css +63 -3
  104. package/dist/styles/sync.css +540 -0
  105. package/dist/styles/table.css +15 -5
  106. package/dist/themes/dark.css +11 -11
  107. package/dist/themes/index.css +1 -0
  108. package/dist/themes/light.css +19 -19
  109. package/package.json +1 -1
@@ -1,8 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useCallback, useEffect, useMemo, useRef, useState } from "react";
3
2
  import { createVertebrClient, } from "@vertebr/client";
3
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
4
  import { useVertebrTheme } from "../../hooks/useVertebrTheme";
5
+ import { hasCap } from "../../lib/capabilities";
5
6
  import { parseMetricsRangeId, } from "../../lib/metricsRanges";
7
+ import { AdminCommandPalette } from "./AdminCommandPalette";
6
8
  import { AdminContent } from "./AdminContent";
7
9
  import { AdminHeader } from "./AdminHeader";
8
10
  import { AdminSaveBar } from "./AdminSaveBar";
@@ -38,6 +40,7 @@ export function VertebrAdmin({ apiBase = "/admin/api", basePath: basePathProp, t
38
40
  });
39
41
  });
40
42
  const [resourceData, setResourceData] = useState(null);
43
+ const [resourceSearch, setResourceSearch] = useState("");
41
44
  const [configData, setConfigData] = useState(null);
42
45
  const [metricsData, setMetricsData] = useState(null);
43
46
  const [metricsLoading, setMetricsLoading] = useState(false);
@@ -48,9 +51,11 @@ export function VertebrAdmin({ apiBase = "/admin/api", basePath: basePathProp, t
48
51
  const [fontLibraryLoading, setFontLibraryLoading] = useState(false);
49
52
  const [emailsData, setEmailsData] = useState(null);
50
53
  const [emailsLoading, setEmailsLoading] = useState(false);
54
+ const [healthChecks, setHealthChecks] = useState(null);
51
55
  const [error, setError] = useState(null);
52
56
  const [loading, setLoading] = useState(true);
53
57
  const [sidebarCollapsed, setSidebarCollapsed] = useState(false);
58
+ const [searchOpen, setSearchOpen] = useState(false);
54
59
  /** Skip pushState when selection was applied from the URL (catalog/popstate). */
55
60
  const skipNextUrlPush = useRef(true);
56
61
  const syncUrl = useCallback((next, catalogSnapshot, replace = false) => {
@@ -130,6 +135,16 @@ export function VertebrAdmin({ apiBase = "/admin/api", basePath: basePathProp, t
130
135
  }
131
136
  syncUrl(selection, catalog, false);
132
137
  }, [selection, catalog, syncUrl]);
138
+ useEffect(() => {
139
+ const onKeyDown = (event) => {
140
+ if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === "k") {
141
+ event.preventDefault();
142
+ setSearchOpen(true);
143
+ }
144
+ };
145
+ window.addEventListener("keydown", onKeyDown);
146
+ return () => window.removeEventListener("keydown", onKeyDown);
147
+ }, []);
133
148
  useEffect(() => {
134
149
  const onPopState = () => {
135
150
  if (!catalog)
@@ -198,7 +213,10 @@ export function VertebrAdmin({ apiBase = "/admin/api", basePath: basePathProp, t
198
213
  }
199
214
  }
200
215
  else if (selection.kind === "resource") {
201
- const data = await client.listResource(selection.id);
216
+ const data = await client.listResource(selection.id, {
217
+ ...(resourceSearch.trim() ? { q: resourceSearch.trim() } : {}),
218
+ fresh: true,
219
+ });
202
220
  if (!cancelled) {
203
221
  setResourceData(data);
204
222
  setConfigData(null);
@@ -208,7 +226,19 @@ export function VertebrAdmin({ apiBase = "/admin/api", basePath: basePathProp, t
208
226
  setEmailsData(null);
209
227
  }
210
228
  }
211
- else {
229
+ else if (selection.kind === "sync" ||
230
+ selection.kind === "addons" ||
231
+ selection.kind === "audit") {
232
+ if (!cancelled) {
233
+ setResourceData(null);
234
+ setConfigData(null);
235
+ setMetricsData(null);
236
+ setGalleryData(null);
237
+ setFontLibraryData(null);
238
+ setEmailsData(null);
239
+ }
240
+ }
241
+ else if (selection.kind === "config" || selection.kind === "addon") {
212
242
  const data = await client.getConfig(selection.id);
213
243
  if (!cancelled) {
214
244
  setConfigData(data);
@@ -248,12 +278,54 @@ export function VertebrAdmin({ apiBase = "/admin/api", basePath: basePathProp, t
248
278
  return () => {
249
279
  cancelled = true;
250
280
  };
251
- }, [client, selection, catalog, environment, metricsRange]);
281
+ }, [client, selection, catalog, environment, metricsRange, resourceSearch]);
282
+ const resourceSelectionId = selection?.kind === "resource" ? selection.id : null;
283
+ useEffect(() => {
284
+ setResourceSearch("");
285
+ }, [resourceSelectionId]);
286
+ const refreshHealth = useCallback(async () => {
287
+ if (!catalog?.health) {
288
+ setHealthChecks(null);
289
+ return;
290
+ }
291
+ const data = await client.getHealth({ fresh: true });
292
+ setHealthChecks(data.checks);
293
+ }, [client, catalog]);
294
+ useEffect(() => {
295
+ if (!catalog?.health) {
296
+ setHealthChecks(null);
297
+ return;
298
+ }
299
+ let cancelled = false;
300
+ void (async () => {
301
+ try {
302
+ const data = await client.getHealth({ fresh: true });
303
+ if (!cancelled)
304
+ setHealthChecks(data.checks);
305
+ }
306
+ catch {
307
+ if (!cancelled)
308
+ setHealthChecks(null);
309
+ }
310
+ })();
311
+ return () => {
312
+ cancelled = true;
313
+ };
314
+ }, [client, catalog?.health, environment]);
252
315
  const refreshResource = useCallback(async () => {
253
316
  if (selection?.kind !== "resource")
254
317
  return;
255
- const data = await client.listResource(selection.id);
318
+ const data = await client.listResource(selection.id, {
319
+ ...(resourceSearch.trim() ? { q: resourceSearch.trim() } : {}),
320
+ fresh: true,
321
+ });
256
322
  setResourceData(data);
323
+ }, [client, selection, resourceSearch]);
324
+ const refreshConfig = useCallback(async () => {
325
+ if (selection?.kind !== "config" && selection?.kind !== "addon")
326
+ return;
327
+ const data = await client.getConfig(selection.id, { fresh: true });
328
+ setConfigData(data);
257
329
  }, [client, selection]);
258
330
  const refreshMetrics = useCallback(async () => {
259
331
  setMetricsLoading(true);
@@ -336,11 +408,14 @@ export function VertebrAdmin({ apiBase = "/admin/api", basePath: basePathProp, t
336
408
  const envList = catalog?.environments ?? bootstrap?.environments ?? [];
337
409
  const activeEnv = envList.find((env) => env.id === environment);
338
410
  const authRequired = Boolean(activeEnv?.auth?.required);
411
+ const authProvider = activeEnv?.auth?.client?.provider;
412
+ const authViaTokenOnly = authProvider === "custom" && Boolean(getAccessToken);
339
413
  const activeConfig = selection?.kind === "config"
340
414
  ? catalog?.configs.find((c) => c.id === selection.id)
341
415
  : undefined;
342
416
  const isPageSelection = activeConfig?.section === "page";
343
417
  const hasPagePreview = Boolean(activeConfig?.previewPath);
418
+ const syncEnabled = Boolean(catalog?.sync?.enabled) && hasCap(catalog, "sync.run");
344
419
  const switchEnvironment = (nextEnv) => {
345
420
  if (nextEnv === environment)
346
421
  return;
@@ -353,6 +428,7 @@ export function VertebrAdmin({ apiBase = "/admin/api", basePath: basePathProp, t
353
428
  writeStored(envStorageKey, nextEnv);
354
429
  setEnvironment(nextEnv);
355
430
  setResourceData(null);
431
+ setResourceSearch("");
356
432
  setConfigData(null);
357
433
  setGalleryData(null);
358
434
  setFontLibraryData(null);
@@ -384,6 +460,16 @@ export function VertebrAdmin({ apiBase = "/admin/api", basePath: basePathProp, t
384
460
  onSelect: () => setSelection({ kind: "overview" }),
385
461
  });
386
462
  }
463
+ if (catalog.audit) {
464
+ entries.push({
465
+ key: "audit",
466
+ group: catalog.audit.group ?? "Analytics",
467
+ label: catalog.audit.label,
468
+ icon: iconForNavKey("audit"),
469
+ active: selection?.kind === "audit",
470
+ onSelect: () => setSelection({ kind: "audit" }),
471
+ });
472
+ }
387
473
  for (const resource of catalog.resources) {
388
474
  entries.push({
389
475
  key: `resource:${resource.id}`,
@@ -445,6 +531,26 @@ export function VertebrAdmin({ apiBase = "/admin/api", basePath: basePathProp, t
445
531
  ],
446
532
  });
447
533
  }
534
+ if (catalog.addons?.length) {
535
+ entries.push({
536
+ key: "addons:overview",
537
+ group: "Add-ons",
538
+ label: "Browse add-ons",
539
+ icon: iconForNavKey("addons:overview"),
540
+ active: selection?.kind === "addons",
541
+ onSelect: () => setSelection({ kind: "addons" }),
542
+ });
543
+ }
544
+ for (const addon of catalog.addons ?? []) {
545
+ entries.push({
546
+ key: `addon:${addon.id}`,
547
+ group: addon.group ?? "Add-ons",
548
+ label: addon.label,
549
+ icon: iconForNavKey(`addon:${addon.id}`),
550
+ active: selection?.kind === "addon" && selection.id === addon.id,
551
+ onSelect: () => setSelection({ kind: "addon", id: addon.id }),
552
+ });
553
+ }
448
554
  for (const config of catalog.configs) {
449
555
  const fallback = config.section === "page" ? "Pages" : "Config";
450
556
  entries.push({
@@ -456,6 +562,16 @@ export function VertebrAdmin({ apiBase = "/admin/api", basePath: basePathProp, t
456
562
  onSelect: () => setSelection({ kind: "config", id: config.id }),
457
563
  });
458
564
  }
565
+ if (catalog.sync?.enabled && hasCap(catalog, "sync.run")) {
566
+ entries.push({
567
+ key: "sync",
568
+ group: "Settings",
569
+ label: "Sync environments",
570
+ icon: iconForNavKey("sync"),
571
+ active: selection?.kind === "sync",
572
+ onSelect: () => setSelection({ kind: "sync" }),
573
+ });
574
+ }
459
575
  return sidebarGroups(entries);
460
576
  }, [catalog, selection]);
461
577
  if (!bootstrap && loading) {
@@ -466,16 +582,29 @@ export function VertebrAdmin({ apiBase = "/admin/api", basePath: basePathProp, t
466
582
  }
467
583
  const activeLabel = selection?.kind === "overview"
468
584
  ? (catalog?.metrics?.label ?? "Overview")
469
- : selection?.kind === "gallery"
470
- ? (catalog?.gallery?.label ?? "Gallery")
471
- : selection?.kind === "fontLibrary"
472
- ? (catalog?.fontLibrary?.label ?? "Font Library")
473
- : selection?.kind === "emails"
474
- ? (catalog?.emails?.label ?? "Emails")
475
- : selection?.kind === "resource"
476
- ? catalog?.resources.find((r) => r.id === selection.id)?.label
477
- : selection?.kind === "config"
478
- ? catalog?.configs.find((c) => c.id === selection.id)?.label
479
- : null;
480
- return (_jsx(SaveBarProvider, { children: _jsx(ToastProvider, { children: _jsxs("div", { className: "vertebr-root", "data-env": environment, "data-sidebar-collapsed": sidebarCollapsed || undefined, children: [_jsx(AdminTopBar, { brand: bootstrap?.brand ?? catalog?.brand ?? "Vertebr", envList: envList, environment: environment, onEnvironmentChange: switchEnvironment, activeEnv: activeEnv, authUserLabel: authUserLabel, onSignOut: onSignOut, getAccessToken: getAccessToken, authRequired: authRequired, token: token, tokenDraft: tokenDraft, onTokenDraftChange: setTokenDraft, onSaveToken: saveToken, onClearToken: clearToken, theme: theme, onThemeChange: setTheme, sidebarCollapsed: sidebarCollapsed, onToggleSidebar: () => setSidebarCollapsed((prev) => !prev) }), _jsx(AdminSidebar, { navGroups: navGroups, collapsed: sidebarCollapsed }), _jsxs("main", { className: "vertebr-main", children: [_jsx(AdminHeader, { activeLabel: activeLabel ?? (catalog ? "Dashboard" : "Sign in"), activeEnv: activeEnv, catalogLoaded: Boolean(catalog), authRequired: authRequired, selection: selection, isPageSelection: isPageSelection, hasPagePreview: hasPagePreview, error: error, breadcrumbs: breadcrumbsForSelection(selection, catalog) }), _jsx(AdminContent, { client: client, catalog: catalog, selection: selection, onSelectionChange: setSelection, authRequired: authRequired, loading: loading, isPageSelection: isPageSelection, metricsData: metricsData, metricsLoading: metricsLoading, metricsRange: metricsRange, onMetricsRangeChange: changeMetricsRange, onRefreshMetrics: refreshMetrics, galleryData: galleryData, galleryLoading: galleryLoading, onRefreshGallery: refreshGallery, fontLibraryData: fontLibraryData, fontLibraryLoading: fontLibraryLoading, onRefreshFonts: refreshFonts, emailsData: emailsData, emailsLoading: emailsLoading, onRefreshEmails: refreshEmails, resourceData: resourceData, onRefreshResource: refreshResource, configData: configData, onConfigSaved: setConfigData, galleryPicker: galleryPicker, fontLibraryPicker: fontLibraryPicker }), _jsx(AdminSaveBar, {})] }), _jsx(AdminToastStack, {})] }) }) }));
585
+ : selection?.kind === "sync"
586
+ ? "Sync environments"
587
+ : selection?.kind === "audit"
588
+ ? (catalog?.audit?.label ?? "Audit")
589
+ : selection?.kind === "addons"
590
+ ? "Add-ons"
591
+ : selection?.kind === "gallery"
592
+ ? (catalog?.gallery?.label ?? "Gallery")
593
+ : selection?.kind === "fontLibrary"
594
+ ? (catalog?.fontLibrary?.label ?? "Font Library")
595
+ : selection?.kind === "emails"
596
+ ? (catalog?.emails?.label ?? "Emails")
597
+ : selection?.kind === "resource"
598
+ ? catalog?.resources.find((r) => r.id === selection.id)?.label
599
+ : selection?.kind === "config"
600
+ ? catalog?.configs.find((c) => c.id === selection.id)?.label
601
+ : selection?.kind === "addon"
602
+ ? catalog?.addons?.find((a) => a.id === selection.id)?.label
603
+ : null;
604
+ const selectionDescription = selection?.kind === "addons"
605
+ ? "Preview how optional storefront features look in your shop, then configure each one."
606
+ : selection?.kind === "addon"
607
+ ? catalog?.addons?.find((item) => item.id === selection.id)?.description
608
+ : undefined;
609
+ return (_jsx(SaveBarProvider, { children: _jsx(ToastProvider, { children: _jsxs("div", { className: "vertebr-root", "data-env": environment, "data-sidebar-collapsed": sidebarCollapsed || undefined, children: [_jsx(AdminTopBar, { brand: bootstrap?.brand ?? catalog?.brand ?? "Vertebr", hostName: bootstrap?.appearance?.hostName ?? catalog?.appearance?.hostName, hostLogoUrl: bootstrap?.appearance?.hostLogoUrl ?? catalog?.appearance?.hostLogoUrl, envList: envList, environment: environment, onEnvironmentChange: switchEnvironment, authUserLabel: authUserLabel, onSignOut: onSignOut, getAccessToken: getAccessToken, authViaTokenOnly: authViaTokenOnly, authRequired: authRequired, token: token, tokenDraft: tokenDraft, onTokenDraftChange: setTokenDraft, onSaveToken: saveToken, onClearToken: clearToken, theme: theme, onThemeChange: setTheme, sidebarCollapsed: sidebarCollapsed, onToggleSidebar: () => setSidebarCollapsed((prev) => !prev), syncEnabled: syncEnabled, onOpenSync: () => setSelection({ kind: "sync" }), onOpenSearch: () => setSearchOpen(true), healthChecks: healthChecks, onRefreshHealth: catalog?.health ? refreshHealth : undefined }), catalog && searchOpen ? (_jsx(AdminCommandPalette, { catalog: catalog, onClose: () => setSearchOpen(false), onSelect: setSelection })) : null, _jsx(AdminSidebar, { navGroups: navGroups, collapsed: sidebarCollapsed }), _jsxs("main", { className: "vertebr-main", children: [_jsx(AdminHeader, { activeLabel: activeLabel ?? (catalog ? "Dashboard" : "Sign in"), catalogLoaded: Boolean(catalog), authRequired: authRequired, selection: selection, isPageSelection: isPageSelection, hasPagePreview: hasPagePreview, selectionDescription: selectionDescription, error: error, breadcrumbs: breadcrumbsForSelection(selection, catalog) }), _jsx(AdminContent, { client: client, catalog: catalog, selection: selection, onSelectionChange: setSelection, authRequired: authRequired, loading: loading, isPageSelection: isPageSelection, metricsData: metricsData, metricsLoading: metricsLoading, metricsRange: metricsRange, onMetricsRangeChange: changeMetricsRange, onRefreshMetrics: refreshMetrics, galleryData: galleryData, galleryLoading: galleryLoading, onRefreshGallery: refreshGallery, fontLibraryData: fontLibraryData, fontLibraryLoading: fontLibraryLoading, onRefreshFonts: refreshFonts, emailsData: emailsData, emailsLoading: emailsLoading, onRefreshEmails: refreshEmails, resourceData: resourceData, resourceSearch: resourceSearch, onResourceSearchChange: setResourceSearch, onRefreshResource: refreshResource, configData: configData, onConfigSaved: setConfigData, onRefreshConfig: refreshConfig, galleryPicker: galleryPicker, fontLibraryPicker: fontLibraryPicker }), _jsx(AdminSaveBar, {})] }), _jsx(AdminToastStack, {})] }) }) }));
481
610
  }
@@ -0,0 +1,6 @@
1
+ import type { CatalogAddonCategory } from "@vertebr/client";
2
+ export declare const ADDON_CATEGORY_LABELS: Record<CatalogAddonCategory, string>;
3
+ export declare function addonCategoryLabel(category: CatalogAddonCategory | undefined): string;
4
+ export declare const ADDON_CATEGORY_HINTS: Record<CatalogAddonCategory, string>;
5
+ export declare function addonCategoryHint(category: CatalogAddonCategory | undefined): string;
6
+ //# sourceMappingURL=addonLabels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addonLabels.d.ts","sourceRoot":"","sources":["../../../src/components/admin/addonLabels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAE5D,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,oBAAoB,EAAE,MAAM,CAItE,CAAC;AAEF,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,oBAAoB,GAAG,SAAS,GACzC,MAAM,CAGR;AAED,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,oBAAoB,EAAE,MAAM,CAIrE,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,oBAAoB,GAAG,SAAS,GACzC,MAAM,CAGR"}
@@ -0,0 +1,20 @@
1
+ export const ADDON_CATEGORY_LABELS = {
2
+ product: "Products",
3
+ engagement: "Engagement",
4
+ sales: "Sales",
5
+ };
6
+ export function addonCategoryLabel(category) {
7
+ if (!category)
8
+ return "Add-on";
9
+ return ADDON_CATEGORY_LABELS[category] ?? "Add-on";
10
+ }
11
+ export const ADDON_CATEGORY_HINTS = {
12
+ product: "Tied to products, variants, and checkout",
13
+ engagement: "Brand story and feedback on the side",
14
+ sales: "Promos, urgency, and cart nudges",
15
+ };
16
+ export function addonCategoryHint(category) {
17
+ if (!category)
18
+ return "Optional storefront feature";
19
+ return ADDON_CATEGORY_HINTS[category] ?? "Optional storefront feature";
20
+ }
@@ -0,0 +1,12 @@
1
+ import type { CatalogResponse } from "@vertebr/client";
2
+ import type { Selection } from "./types";
3
+ export type AdminSearchItem = {
4
+ id: string;
5
+ label: string;
6
+ group: string;
7
+ hint?: string;
8
+ selection: Selection;
9
+ };
10
+ export declare function adminSearchItems(catalog: CatalogResponse): AdminSearchItem[];
11
+ export declare function filterAdminSearchItems(items: AdminSearchItem[], query: string): AdminSearchItem[];
12
+ //# sourceMappingURL=adminSearch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adminSearch.d.ts","sourceRoot":"","sources":["../../../src/components/admin/adminSearch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,eAAe,EAAE,CAuH5E;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,eAAe,EAAE,EACxB,KAAK,EAAE,MAAM,GACZ,eAAe,EAAE,CASnB"}
@@ -0,0 +1,120 @@
1
+ export function adminSearchItems(catalog) {
2
+ const items = [];
3
+ if (catalog.metrics) {
4
+ items.push({
5
+ id: "overview",
6
+ label: catalog.metrics.label,
7
+ group: catalog.metrics.group ?? "Home",
8
+ hint: "Overview and metrics",
9
+ selection: { kind: "overview" },
10
+ });
11
+ }
12
+ if (catalog.audit) {
13
+ items.push({
14
+ id: "audit",
15
+ label: catalog.audit.label,
16
+ group: catalog.audit.group ?? "Analytics",
17
+ hint: "Audit log",
18
+ selection: { kind: "audit" },
19
+ });
20
+ }
21
+ for (const resource of catalog.resources) {
22
+ items.push({
23
+ id: `resource:${resource.id}`,
24
+ label: resource.label,
25
+ group: resource.group ?? "Resources",
26
+ hint: "Resource table",
27
+ selection: { kind: "resource", id: resource.id },
28
+ });
29
+ }
30
+ if (catalog.gallery) {
31
+ items.push({
32
+ id: "gallery",
33
+ label: catalog.gallery.label,
34
+ group: catalog.gallery.group ?? "Resources",
35
+ hint: "Media library",
36
+ selection: { kind: "gallery" },
37
+ });
38
+ }
39
+ if (catalog.fontLibrary) {
40
+ items.push({
41
+ id: "fonts",
42
+ label: catalog.fontLibrary.label,
43
+ group: catalog.fontLibrary.group ?? "Resources",
44
+ hint: "Font library",
45
+ selection: { kind: "fontLibrary" },
46
+ });
47
+ }
48
+ if (catalog.emails) {
49
+ items.push({
50
+ id: "emails:compose",
51
+ label: "Compose email",
52
+ group: catalog.emails.group ?? "Growth",
53
+ hint: catalog.emails.label,
54
+ selection: { kind: "emails", tab: "compose" },
55
+ });
56
+ items.push({
57
+ id: "emails:templates",
58
+ label: "Email templates",
59
+ group: catalog.emails.group ?? "Growth",
60
+ hint: catalog.emails.label,
61
+ selection: { kind: "emails", tab: "templates" },
62
+ });
63
+ items.push({
64
+ id: "emails:activity",
65
+ label: "Email activity",
66
+ group: catalog.emails.group ?? "Growth",
67
+ hint: catalog.emails.label,
68
+ selection: { kind: "emails", tab: "activity" },
69
+ });
70
+ }
71
+ if (catalog.addons?.length) {
72
+ items.push({
73
+ id: "addons:overview",
74
+ label: "Browse add-ons",
75
+ group: "Add-ons",
76
+ hint: "Preview and configure storefront features",
77
+ selection: { kind: "addons" },
78
+ });
79
+ }
80
+ for (const addon of catalog.addons ?? []) {
81
+ items.push({
82
+ id: `addon:${addon.id}`,
83
+ label: addon.label,
84
+ group: addon.group ?? "Add-ons",
85
+ hint: addon.description ?? "Storefront add-on",
86
+ selection: { kind: "addon", id: addon.id },
87
+ });
88
+ }
89
+ for (const config of catalog.configs) {
90
+ const bucket = config.section === "page" ? "Pages" : "Config";
91
+ items.push({
92
+ id: `config:${config.id}`,
93
+ label: config.label,
94
+ group: config.group ?? bucket,
95
+ hint: config.section === "page" ? "Page content" : "Settings",
96
+ selection: { kind: "config", id: config.id },
97
+ });
98
+ }
99
+ if (catalog.sync?.enabled) {
100
+ items.push({
101
+ id: "sync",
102
+ label: "Sync environments",
103
+ group: "Settings",
104
+ hint: "Copy content between environments",
105
+ selection: { kind: "sync" },
106
+ });
107
+ }
108
+ return items;
109
+ }
110
+ export function filterAdminSearchItems(items, query) {
111
+ const needle = query.trim().toLowerCase();
112
+ if (!needle)
113
+ return items;
114
+ return items.filter((item) => {
115
+ const haystack = [item.label, item.group, item.hint ?? "", item.id]
116
+ .join(" ")
117
+ .toLowerCase();
118
+ return haystack.includes(needle);
119
+ });
120
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"breadcrumbs.d.ts","sourceRoot":"","sources":["../../../src/components/admin/breadcrumbs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,eAAe,GAAG,IAAI,GAC9B,UAAU,EAAE,CA6Cd"}
1
+ {"version":3,"file":"breadcrumbs.d.ts","sourceRoot":"","sources":["../../../src/components/admin/breadcrumbs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,eAAe,GAAG,IAAI,GAC9B,UAAU,EAAE,CA2Dd"}
@@ -5,6 +5,20 @@ export function breadcrumbsForSelection(selection, catalog) {
5
5
  switch (selection.kind) {
6
6
  case "overview":
7
7
  return [...crumbs, { label: catalog.metrics?.label ?? "Overview" }];
8
+ case "sync":
9
+ return [...crumbs, { label: "Sync environments" }];
10
+ case "audit":
11
+ return [...crumbs, { label: catalog.audit?.label ?? "Audit" }];
12
+ case "addons":
13
+ return [...crumbs, { label: "Add-ons" }];
14
+ case "addon": {
15
+ const addon = catalog.addons?.find((item) => item.id === selection.id);
16
+ return [
17
+ ...crumbs,
18
+ { label: "Add-ons", href: "/addons" },
19
+ { label: addon?.label ?? selection.id },
20
+ ];
21
+ }
8
22
  case "gallery":
9
23
  return [...crumbs, { label: catalog.gallery?.label ?? "Gallery" }];
10
24
  case "fontLibrary":
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/components/admin/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAa,SAAS,EAAE,MAAM,SAAS,CAAC;AAIpD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAO5D;AAOD,iEAAiE;AACjE,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,eAAe,GACvB,MAAM,CA0BR;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,eAAe,GACvB,MAAM,CAIR;AASD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,eAAe,GAAG,IAAI,GAC9B,SAAS,GAAG,IAAI,CAuClB;AAED,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,SAAS,CAUpE;AAED,+DAA+D;AAC/D,wBAAgB,eAAe,CAC7B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,eAAe,GACvB,SAAS,CAyBX;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,OAAO,CAenE"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/components/admin/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAa,SAAS,EAAE,MAAM,SAAS,CAAC;AAIpD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAO5D;AAOD,iEAAiE;AACjE,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,eAAe,GACvB,MAAM,CAkCR;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,eAAe,GACvB,MAAM,CAIR;AASD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,eAAe,GAAG,IAAI,GAC9B,SAAS,GAAG,IAAI,CAiDlB;AAED,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,SAAS,CAUpE;AAED,+DAA+D;AAC/D,wBAAgB,eAAe,CAC7B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,eAAe,GACvB,SAAS,CAuCX;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,OAAO,CAuBnE"}
@@ -23,6 +23,14 @@ export function pathForSelection(selection, catalog) {
23
23
  switch (selection.kind) {
24
24
  case "overview":
25
25
  return "/overview";
26
+ case "sync":
27
+ return "/sync";
28
+ case "audit":
29
+ return "/audit";
30
+ case "addons":
31
+ return "/addons";
32
+ case "addon":
33
+ return `/addons/${encodeURIComponent(selection.id)}`;
26
34
  case "gallery":
27
35
  return "/gallery";
28
36
  case "fontLibrary":
@@ -77,6 +85,19 @@ export function selectionFromPath(pathname, basePath, catalog) {
77
85
  const [head, ...tail] = parts;
78
86
  if (head === "overview")
79
87
  return { kind: "overview" };
88
+ if (head === "sync")
89
+ return { kind: "sync" };
90
+ if (head === "audit")
91
+ return { kind: "audit" };
92
+ if (head === "addons") {
93
+ if (!tail[0])
94
+ return { kind: "addons" };
95
+ const id = decodeURIComponent(tail[0]);
96
+ if (catalog && !catalog.addons?.some((item) => item.id === id)) {
97
+ return null;
98
+ }
99
+ return { kind: "addon", id };
100
+ }
80
101
  if (head === "gallery")
81
102
  return { kind: "gallery" };
82
103
  if (head === "fonts")
@@ -134,6 +155,20 @@ export function coerceSelection(selection, catalog) {
134
155
  if (selection.kind === "overview") {
135
156
  return catalog.metrics ? selection : defaultSelection(catalog);
136
157
  }
158
+ if (selection.kind === "sync") {
159
+ return catalog.sync?.enabled ? selection : defaultSelection(catalog);
160
+ }
161
+ if (selection.kind === "audit") {
162
+ return catalog.audit ? selection : defaultSelection(catalog);
163
+ }
164
+ if (selection.kind === "addons") {
165
+ return catalog.addons?.length ? selection : defaultSelection(catalog);
166
+ }
167
+ if (selection.kind === "addon") {
168
+ return catalog.addons?.some((item) => item.id === selection.id)
169
+ ? selection
170
+ : defaultSelection(catalog);
171
+ }
137
172
  if (selection.kind === "gallery") {
138
173
  return catalog.gallery ? selection : defaultSelection(catalog);
139
174
  }
@@ -162,9 +197,16 @@ export function selectionsEqual(a, b) {
162
197
  return a === b;
163
198
  if (a.kind !== b.kind)
164
199
  return false;
165
- if (a.kind === "overview" || a.kind === "gallery" || a.kind === "fontLibrary") {
200
+ if (a.kind === "overview" ||
201
+ a.kind === "gallery" ||
202
+ a.kind === "fontLibrary" ||
203
+ a.kind === "sync" ||
204
+ a.kind === "audit" ||
205
+ a.kind === "addons") {
166
206
  return true;
167
207
  }
208
+ if (a.kind === "addon" && b.kind === "addon")
209
+ return a.id === b.id;
168
210
  if (a.kind === "emails" && b.kind === "emails") {
169
211
  return (a.tab ?? "compose") === (b.tab ?? "compose");
170
212
  }
@@ -29,6 +29,13 @@ export type NavIcon = (props: {
29
29
  }) => ReactElement;
30
30
  export type Selection = {
31
31
  kind: "overview";
32
+ } | {
33
+ kind: "sync";
34
+ } | {
35
+ kind: "addons";
36
+ } | {
37
+ kind: "addon";
38
+ id: string;
32
39
  } | {
33
40
  kind: "resource";
34
41
  id: string;
@@ -40,6 +47,8 @@ export type Selection = {
40
47
  } | {
41
48
  kind: "emails";
42
49
  tab?: EmailsTab;
50
+ } | {
51
+ kind: "audit";
43
52
  } | {
44
53
  kind: "config";
45
54
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/admin/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4CAA4C;IAC5C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sDAAsD;IACtD,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,oEAAoE;IACpE,cAAc,CAAC,EAAE,MACb,MAAM,GACN,IAAI,GACJ,SAAS,GACT,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACvC,iDAAiD;IACjD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC,CAAC;AAEF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;AAE7D,MAAM,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,YAAY,CAAC;AAEtE,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,CAAC,EAAE,SAAS,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC9B,IAAI,CAAC;AAET,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,OAAO,CAAC;QAChB,QAAQ,EAAE,MAAM,IAAI,CAAC;KACtB,CAAC,CAAC;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/admin/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4CAA4C;IAC5C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sDAAsD;IACtD,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,oEAAoE;IACpE,cAAc,CAAC,EAAE,MACb,MAAM,GACN,IAAI,GACJ,SAAS,GACT,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACvC,iDAAiD;IACjD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC,CAAC;AAEF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;AAE7D,MAAM,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,YAAY,CAAC;AAEtE,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,CAAC,EAAE,SAAS,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC9B,IAAI,CAAC;AAET,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,OAAO,CAAC;QAChB,QAAQ,EAAE,MAAM,IAAI,CAAC;KACtB,CAAC,CAAC;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { FieldSchema, VertebrClient } from "@vertebr/client";
2
+ export type ReferenceInputProps = {
3
+ id?: string;
4
+ value: unknown;
5
+ field: FieldSchema;
6
+ client: VertebrClient;
7
+ readOnly?: boolean;
8
+ onChange: (value: string) => void;
9
+ };
10
+ export declare function ReferenceInput({ id: idProp, value, field, client, readOnly, onChange, }: ReferenceInputProps): import("react").JSX.Element;
11
+ //# sourceMappingURL=ReferenceInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReferenceInput.d.ts","sourceRoot":"","sources":["../../../src/components/config/ReferenceInput.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAElE,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AAuBF,wBAAgB,cAAc,CAAC,EAC7B,EAAE,EAAE,MAAM,EACV,KAAK,EACL,KAAK,EACL,MAAM,EACN,QAAQ,EACR,QAAQ,GACT,EAAE,mBAAmB,+BA0IrB"}