@rebasepro/admin 0.13.0 → 0.13.1-canary.gcd6689e

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 (60) hide show
  1. package/dist/{CollectionEditorDialog-CjXkWZ64.js → CollectionEditorDialog-CZZZpYOz.js} +3 -3
  2. package/dist/{CollectionEditorDialog-CjXkWZ64.js.map → CollectionEditorDialog-CZZZpYOz.js.map} +1 -1
  3. package/dist/{PropertyEditView-W8I3YV89.js → PropertyEditView-CeoHSmUg.js} +2 -2
  4. package/dist/{PropertyEditView-W8I3YV89.js.map → PropertyEditView-CeoHSmUg.js.map} +1 -1
  5. package/dist/{RouterCollectionsStudioView-BsLTNoqX.js → RouterCollectionsStudioView-CMKFWM2J.js} +4 -4
  6. package/dist/{RouterCollectionsStudioView-BsLTNoqX.js.map → RouterCollectionsStudioView-CMKFWM2J.js.map} +1 -1
  7. package/dist/collection_editor_ui.js +4 -4
  8. package/dist/components/AdditionalFieldValue.d.ts +25 -0
  9. package/dist/components/CollectionViewBinding/SlotValue.d.ts +29 -0
  10. package/dist/components/CollectionViewBinding/SplitListCloseButton.d.ts +5 -3
  11. package/dist/components/CollectionViewBinding/SplitListShowButton.d.ts +12 -0
  12. package/dist/components/CollectionViewBinding/usePreviewSlots.d.ts +29 -4
  13. package/dist/components/DetailViewBinding.d.ts +6 -0
  14. package/dist/components/EditViewBinding.d.ts +7 -1
  15. package/dist/components/EntityIdentityBar.d.ts +10 -1
  16. package/dist/components/EntityViewBinding.d.ts +41 -6
  17. package/dist/components/app/Scaffold.d.ts +4 -3
  18. package/dist/{export-J79rMoNj.js → export-l19WevKo.js} +2 -2
  19. package/dist/{export-J79rMoNj.js.map → export-l19WevKo.js.map} +1 -1
  20. package/dist/form/components/FieldBlock.d.ts +16 -0
  21. package/dist/{history-D7L_JlLO.js → history-JL1ZmSKD.js} +4 -4
  22. package/dist/{history-D7L_JlLO.js.map → history-JL1ZmSKD.js.map} +1 -1
  23. package/dist/hooks/useEntityDisplay.d.ts +102 -0
  24. package/dist/hooks/useEntityDisplayTitle.d.ts +18 -9
  25. package/dist/{import-BvYl--U4.js → import-DNrKrFQV.js} +3 -3
  26. package/dist/{import-BvYl--U4.js.map → import-DNrKrFQV.js.map} +1 -1
  27. package/dist/index.js +79 -15
  28. package/dist/index.js.map +1 -1
  29. package/dist/preview/components/BooleanPreview.d.ts +3 -1
  30. package/dist/routes/RebaseRoute.d.ts +1 -1
  31. package/dist/types/components/PropertyPreviewProps.d.ts +7 -0
  32. package/dist/{util-GiwPgxnL.js → util-pQ3YwBve.js} +1022 -641
  33. package/dist/util-pQ3YwBve.js.map +1 -0
  34. package/package.json +9 -9
  35. package/src/components/AdditionalFieldValue.tsx +68 -0
  36. package/src/components/CollectionTableBinding/CollectionTableBinding.tsx +5 -6
  37. package/src/components/CollectionViewBinding/BoardCardBinding.tsx +9 -27
  38. package/src/components/CollectionViewBinding/CollectionListViewBinding.tsx +11 -24
  39. package/src/components/CollectionViewBinding/EntityCardBinding.tsx +10 -33
  40. package/src/components/CollectionViewBinding/SlotValue.tsx +52 -0
  41. package/src/components/CollectionViewBinding/SplitListCloseButton.tsx +7 -5
  42. package/src/components/CollectionViewBinding/SplitListShowButton.tsx +28 -0
  43. package/src/components/CollectionViewBinding/usePreviewSlots.ts +115 -48
  44. package/src/components/DetailViewBinding.tsx +71 -54
  45. package/src/components/EditViewBinding.tsx +51 -33
  46. package/src/components/EntityIdentityBar.tsx +26 -4
  47. package/src/components/EntityPreviewBinding.tsx +24 -12
  48. package/src/components/EntityViewBinding.tsx +237 -39
  49. package/src/components/InlineEntityPreview.tsx +10 -10
  50. package/src/components/app/Scaffold.tsx +48 -7
  51. package/src/form/EntityForm.tsx +6 -24
  52. package/src/form/components/FieldBlock.tsx +24 -0
  53. package/src/hooks/navigation/useBuildCollectionRegistryController.tsx +29 -5
  54. package/src/hooks/useEntityDisplay.tsx +258 -0
  55. package/src/hooks/useEntityDisplayTitle.tsx +27 -38
  56. package/src/preview/PropertyPreview.tsx +1 -1
  57. package/src/preview/components/BooleanPreview.tsx +5 -2
  58. package/src/routes/RebaseRoute.tsx +62 -4
  59. package/src/types/components/PropertyPreviewProps.tsx +8 -0
  60. package/dist/util-GiwPgxnL.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
- import { $ as useBuildCollectionRegistryController, $n as sanitizeUrl, $t as CollectionTableBinding, A as getFieldId, An as ArrayOfReferencesPreview, At as convertFileToJson, B as MapFieldBinding, Bn as getEntityTitlePropertyKeyForEntity, Bt as mergeEntityActions, C as removeEmptyContainers, Cn as MapPropertyPreview, Ct as convertDataToEntity, D as getDefaultFieldConfig, Dn as ArrayEnumPreview, Dt as useImportConfig, E as DEFAULT_FIELD_CONFIGS, En as ArrayPropertyEnumPreview, Et as getInferenceType, F as SelectFieldBinding, Fn as useSidePanel, Ft as FieldCaption, G as useSelectionDialog, Gn as StorageThumbnailInternal, Gt as removeInitialAndTrailingSlashes, H as DateTimeFieldBinding, Hn as StringPropertyPreview, Ht as getCollectionBySlugWithin, I as RepeatFieldBinding, In as CollectionRegistryContext, It as useBreadcrumbsController, J as useBuildUrlController, Jn as renderSkeletonIcon, Jt as resolveCollectionPathIds, K as SelectionTableBinding, Kn as SkeletonPropertyComponent, Kt as removeInitialSlash, L as ReferenceFieldBinding, Ln as useCollectionRegistryController, Lt as BreadcrumbsProvider, M as TextFieldBinding, Mn as ReferencePreview, Mt as ArrayContainer, N as SwitchFieldBinding, Nn as EntityPreviewBinding, Nt as PropertyConfigBadge, O as getDefaultFieldId, On as ArrayOfStorageComponentsPreview, Ot as ImportSaveInProgress, P as StorageUploadFieldBinding, Pn as SidePanelControllerContext, Pt as SearchIconsView, Q as useResolvedCollections, Qn as ImagePreview, Qt as VirtualTableInput, R as MultiSelectFieldBinding, Rn as getEntityPreviewKeys, Rt as resolveEntityAction, S as getInitialEntityValues, Sn as KeyValuePreview, St as DataNewPropertiesMapping, T as PropertyFieldBinding, Tn as ArrayOfStringsPreview, Tt as processValueMapping, U as BlockFieldBinding, Un as EnumValuesChip, Ut as getCollectionPathsCombinations, V as KeyValueFieldBinding, Vn as ArrayPropertyPreview, Vt as addInitialSlash, W as ArrayOfReferencesFieldBinding, Wn as StorageThumbnail, Wt as getLastSegment, X as useTopLevelNavigation, Xn as renderSkeletonText, Xt as resolveViewMode, Y as useBuildNavigationStateController, Yn as renderSkeletonImageThumbnail, Yt as resolveOpenEntityMode, Z as useResolvedViews, Zn as UrlComponentPreview, Zt as useSelectionController, _ as useCollectionsConfigController, _n as getUserLabel, _t as CollectionViewActions, a as namespaceToPropertiesPath, an as NavigationStateContext, ar as FieldBlock, at as useBuildSidePanel, b as extractTouchedValues, bn as BooleanPreview, bt as useCollectionEditorDialogsState, c as buildCollectionGenerationCallback, cn as SideDialogsControllerContext, cr as getBracketNotation, ct as copyEntityAction, d as fromSerializableCollectionConfigs, dn as useClearRestoreValue, dr as getIconForWidget, dt as resetPasswordAction, en as SelectableTable, er as EmptyValue, et as useHistory, f as fromSerializableProperties, fn as ReadOnlyFieldBinding, fr as getPropertiesWithPropertiesOrder, ft as CreationResultDialog, g as toSerializableProperty, gn as UserPreview, gr as isRelationProperty, gt as EntityCardBinding, h as toSerializableProperties, hn as PropertyPreview, hr as isReferenceProperty, ht as CollectionCardViewBinding, i as namespaceToPropertiesOrderPath, in as useUrlController, ir as FormRail, it as getEntityViewWidth, j as VectorFieldBinding, jn as InlineEntityListPreview, jt as unflattenObject, k as getFieldConfig, kn as RelationPreview, kt as ImportFileUpload, l as validateCollectionJson, ln as SelectableTableContext, lr as getDefaultPropertiesOrder, lt as deleteEntityAction, m as toSerializableCollectionConfig, mn as ArrayOfMapsPreview, mr as getResolvedPropertyInPath, mt as EntityViewBinding, n as getFullIdPath, nn as useAdminContext, nr as LabelWithIcon, nt as useResolvedNavigationFrom, o as CollectionGenerationApiError, on as useNavigationStateController, or as isSelfLabellingProperty, ot as EditViewBinding, p as fromSerializableProperty, pn as FieldHelperText, pr as getPropertyInPath, pt as DetailViewBinding, q as SideDialogs, qn as renderSkeletonCaptionText, qt as removeTrailingSlash, r as idToPropertiesPath, rn as UrlContext, rr as FormSections, rt as buildSidePanelsFromUrl, s as DEFAULT_COLLECTION_GENERATION_ENDPOINT, sn as useSideDialogsController, sr as PropertyIdCopyTooltip, st as CollectionViewBinding, t as getFullId, tn as CollectionRowActions, tr as LabelWithIconAndTooltip, tt as resolveNavigationFrom, u as fromSerializableCollectionConfig, un as ArrayCustomShapedFieldBinding, ur as getIconForProperty, ut as editEntityAction, v as EntityFormBinding, vn as useResolvedUser, vt as useCollectionEditorController, w as zodToFormErrors, wn as ArrayOneOfPreview, wt as flattenEntry, x as getChanges, xn as DatePreview, xt as ImportNewPropertyFieldPreview, y as EntityForm, yn as NumberPropertyPreview, yt as ConfigControllerProvider, z as MarkdownEditorFieldBinding, zn as getEntityTitlePropertyKey, zt as resolveEntityView } from "./util-GiwPgxnL.js";
2
- import { i as PropertySelectEntry, n as ImportCollectionAction, r as ImportDataPreview } from "./import-BvYl--U4.js";
3
- import { a as downloadDataAsCsv, c as getEntityJsonExportableData, i as downloadBlob, n as ExportCollectionAction, o as downloadEntitiesExport, r as BasicExportAction, s as getEntityCSVExportableData } from "./export-J79rMoNj.js";
1
+ import { $ as useBuildCollectionRegistryController, $n as sanitizeUrl, $t as CollectionTableBinding, A as getFieldId, An as ReferencePreview, At as convertFileToJson, B as MapFieldBinding, Bn as getEntityTitlePropertyKeyForEntity, Bt as mergeEntityActions, C as removeEmptyContainers, Cn as ArrayOfStringsPreview, Ct as convertDataToEntity, D as getDefaultFieldConfig, Dn as RelationPreview, Dt as useImportConfig, E as DEFAULT_FIELD_CONFIGS, En as ArrayOfStorageComponentsPreview, Et as getInferenceType, F as SelectFieldBinding, Fn as useCollectionRegistryController, Ft as FieldCaption, G as useSelectionDialog, Gn as StorageThumbnailInternal, Gt as removeInitialAndTrailingSlashes, H as DateTimeFieldBinding, Hn as StringPropertyPreview, Ht as getCollectionBySlugWithin, I as RepeatFieldBinding, In as getUserLabel, It as useBreadcrumbsController, J as useBuildUrlController, Jn as renderSkeletonIcon, Jt as resolveCollectionPathIds, K as SelectionTableBinding, Kn as SkeletonPropertyComponent, Kt as removeInitialSlash, L as ReferenceFieldBinding, Ln as useResolvedUser, Lt as BreadcrumbsProvider, M as TextFieldBinding, Mn as SidePanelControllerContext, Mt as ArrayContainer, N as SwitchFieldBinding, Nn as useSidePanel, Nt as PropertyConfigBadge, O as getDefaultFieldId, On as ArrayOfReferencesPreview, Ot as ImportSaveInProgress, P as StorageUploadFieldBinding, Pn as CollectionRegistryContext, Pt as SearchIconsView, Q as useResolvedCollections, Qn as ImagePreview, Qt as VirtualTableInput, R as MultiSelectFieldBinding, Rn as getEntityPreviewKeys, Rt as resolveEntityAction, S as getInitialEntityValues, Sn as ArrayOneOfPreview, St as DataNewPropertiesMapping, T as PropertyFieldBinding, Tn as ArrayEnumPreview, Tt as processValueMapping, U as BlockFieldBinding, Un as EnumValuesChip, Ut as getCollectionPathsCombinations, V as KeyValueFieldBinding, Vn as ArrayPropertyPreview, Vt as addInitialSlash, W as ArrayOfReferencesFieldBinding, Wn as StorageThumbnail, Wt as getLastSegment, X as useTopLevelNavigation, Xn as renderSkeletonText, Xt as resolveViewMode, Y as useBuildNavigationStateController, Yn as renderSkeletonImageThumbnail, Yt as resolveOpenEntityMode, Z as useResolvedViews, Zn as UrlComponentPreview, Zt as useSelectionController, _ as useCollectionsConfigController, _n as NumberPropertyPreview, _r as isRelationProperty, _t as CollectionViewActions, a as namespaceToPropertiesPath, an as NavigationStateContext, ar as FieldBlock, at as useBuildSidePanel, b as extractTouchedValues, bn as KeyValuePreview, bt as useCollectionEditorDialogsState, c as buildCollectionGenerationCallback, cn as SideDialogsControllerContext, cr as PropertyIdCopyTooltip, ct as copyEntityAction, d as fromSerializableCollectionConfigs, dn as useClearRestoreValue, dr as getIconForProperty, dt as resetPasswordAction, en as SelectableTable, er as EmptyValue, et as useHistory, f as fromSerializableProperties, fn as ReadOnlyFieldBinding, fr as getIconForWidget, ft as CreationResultDialog, g as toSerializableProperty, gn as UserPreview, gr as isReferenceProperty, gt as EntityCardBinding, h as toSerializableProperties, hn as PropertyPreview, hr as getResolvedPropertyInPath, ht as CollectionCardViewBinding, i as namespaceToPropertiesOrderPath, in as useUrlController, ir as FormRail, it as getEntityViewWidth, j as VectorFieldBinding, jn as EntityPreviewBinding, jt as unflattenObject, k as getFieldConfig, kn as InlineEntityListPreview, kt as ImportFileUpload, l as validateCollectionJson, ln as SelectableTableContext, lr as getBracketNotation, lt as deleteEntityAction, m as toSerializableCollectionConfig, mn as ArrayOfMapsPreview, mr as getPropertyInPath, mt as EntityViewBinding, n as getFullIdPath, nn as useAdminContext, nr as LabelWithIcon, nt as useResolvedNavigationFrom, o as CollectionGenerationApiError, on as useNavigationStateController, or as isSelfLabellingProperty, ot as EditViewBinding, p as fromSerializableProperty, pn as FieldHelperText, pr as getPropertiesWithPropertiesOrder, pt as DetailViewBinding, q as SideDialogs, qn as renderSkeletonCaptionText, qt as removeTrailingSlash, r as idToPropertiesPath, rn as UrlContext, rr as FormSections, rt as buildSidePanelsFromUrl, s as DEFAULT_COLLECTION_GENERATION_ENDPOINT, sn as useSideDialogsController, sr as spanClass, st as CollectionViewBinding, t as getFullId, tn as CollectionRowActions, tr as LabelWithIconAndTooltip, tt as resolveNavigationFrom, u as fromSerializableCollectionConfig, un as ArrayCustomShapedFieldBinding, ur as getDefaultPropertiesOrder, ut as editEntityAction, v as EntityFormBinding, vn as BooleanPreview, vt as useCollectionEditorController, w as zodToFormErrors, wn as ArrayPropertyEnumPreview, wt as flattenEntry, x as getChanges, xn as MapPropertyPreview, xt as ImportNewPropertyFieldPreview, y as EntityForm, yn as DatePreview, yt as ConfigControllerProvider, z as MarkdownEditorFieldBinding, zn as getEntityTitlePropertyKey, zt as resolveEntityView } from "./util-pQ3YwBve.js";
2
+ import { i as PropertySelectEntry, n as ImportCollectionAction, r as ImportDataPreview } from "./import-DNrKrFQV.js";
3
+ import { a as downloadDataAsCsv, c as getEntityJsonExportableData, i as downloadBlob, n as ExportCollectionAction, o as downloadEntitiesExport, r as BasicExportAction, s as getEntityCSVExportableData } from "./export-l19WevKo.js";
4
4
  import React, { Suspense, lazy, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
5
5
  import { deepEqual } from "fast-equals";
6
- import { Avatar, Button, Card, ChevronDownIcon, ChevronsLeftIcon, ChevronsRightIcon, Chip, CircularProgressCenter, Collapse, Container, Dialog, DialogActions, DialogContent, DialogTitle, ErrorBoundary, ExpandablePanel, IconButton, LogOutIcon, Markdown, Menu, MenuIcon, MenuItem, MoonIcon, PencilIcon, SearchBar, SettingsIcon, Sheet, Skeleton, StarIcon, SunIcon, SunMoonIcon, TextField, Tooltip, Typography, cls, defaultBorderMixin, iconSize } from "@rebasepro/ui";
6
+ import { Avatar, Button, Card, CenteredView, ChevronDownIcon, ChevronsLeftIcon, ChevronsRightIcon, Chip, CircularProgressCenter, Collapse, Container, Dialog, DialogActions, DialogContent, DialogTitle, ErrorBoundary, ExpandablePanel, IconButton, LogOutIcon, Markdown, Menu, MenuIcon, MenuItem, MoonIcon, PencilIcon, SearchBar, SettingsIcon, Sheet, Skeleton, StarIcon, SunIcon, SunMoonIcon, TextField, Tooltip, Typography, cls, defaultBorderMixin, iconSize } from "@rebasepro/ui";
7
7
  import { buildRoutedRebaseData, getReferenceFrom, resolveDataSource } from "@rebasepro/common";
8
8
  import { CollectionResolverRegistrationContext, CollectionScopeProvider, CustomizationControllerContext, DEFAULT_API_PATH, ErrorView, IconForView, LanguageToggle, LoginView, NavigationBlockerProvider, NotFoundPage, RebaseDataContext, RebaseLogo, RebaseRoutes, SchemaDriftBanner, StudioBridgeRegistryProvider, UIReferenceView, UnsavedChangesDialog, UserSettingsView, buildCollapsedDefaults, getIcon, getLastSegment as getLastSegment$1, getNavigationEntriesFromPath, useAdminModeController, useAnalyticsController, useAuthController, useBridgeRegistration, useBuildLocalConfigurationPersistence, useCollapsedGroups, useComponentOverride, useCustomizationController, useData, useDataSources, useLargeLayout, useModeController, useNavigationBlocker, useRebaseClient, useRebaseContext, useRebaseRegistry, useRebaseRegistryDispatch, useRestoreScroll, useSlot, useTranslation, useUserConfigurationPersistence } from "@rebasepro/app";
9
9
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -86,7 +86,7 @@ function RebaseRoute() {
86
86
  if (!collection) collection = collectionRegistry.getCollection(navigationEntries[0].slug);
87
87
  if (!collection) {
88
88
  if (!collectionRegistry.initialised) return /* @__PURE__ */ jsx(CircularProgressCenter, {});
89
- return null;
89
+ return /* @__PURE__ */ jsx(UnresolvedCollectionView, { path: navigationEntries[0].slug });
90
90
  }
91
91
  return /* @__PURE__ */ jsx(ResolvedCollectionView, {
92
92
  ...collection,
@@ -105,7 +105,7 @@ function RebaseRoute() {
105
105
  if (!collection) collection = collectionRegistry.getCollection(firstEntry.slug);
106
106
  if (!collection) {
107
107
  if (!collectionRegistry.initialised) return /* @__PURE__ */ jsx(CircularProgressCenter, {});
108
- return null;
108
+ return /* @__PURE__ */ jsx(UnresolvedCollectionView, { path: firstEntry.slug });
109
109
  }
110
110
  return /* @__PURE__ */ jsx(ResolvedCollectionView, {
111
111
  ...collection,
@@ -178,6 +178,7 @@ function EntityFullScreenRoute({ pathname, navigationEntries, isNew, isCopy }) {
178
178
  const urlController = useUrlController();
179
179
  const navigate = useNavigate();
180
180
  const location = useLocation();
181
+ const userConfigPersistence = useUserConfigurationPersistence();
181
182
  const defaultValues = location.state?.defaultValues;
182
183
  const hash = location.hash;
183
184
  const navigationPath = urlController.urlPathToDataPath(pathname);
@@ -225,12 +226,26 @@ function EntityFullScreenRoute({ pathname, navigationEntries, isNew, isCopy }) {
225
226
  const fullIdPath = isNew ? lastCollectionEntry.slug : lastEntityEntry.slug;
226
227
  const collectionPath = urlController.resolveDatabasePathsFrom(fullIdPath);
227
228
  const isEditRoute = pathname.endsWith("/edit") || pathname.split("/").pop() === "edit";
228
- if (collection.defaultEntityAction === "view" && !isNew && !isCopy && entityId && !isEditRoute) return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(DetailViewBinding, {
229
+ const isDetailMode = collection.defaultEntityAction === "view" && !isNew && !isCopy && entityId && !isEditRoute;
230
+ const showList = !isNew && !isCopy && entityId !== void 0 && navigationEntries[0]?.type === "collection" && (navigationEntries.length === 2 || navigationEntries.length === 3) && resolveOpenEntityMode({
231
+ collection,
232
+ viewMode: resolveViewMode({
233
+ collection,
234
+ search: location.search,
235
+ savedViewMode: userConfigPersistence?.getCollectionConfig(collection.slug)?.defaultViewMode
236
+ })
237
+ }) === "split" ? () => navigate({
238
+ pathname,
239
+ search: location.search,
240
+ hash: ""
241
+ }) : void 0;
242
+ if (isDetailMode) return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(DetailViewBinding, {
229
243
  entityId,
230
244
  collection,
231
245
  layout: "full_screen",
232
246
  path: collectionPath,
233
247
  selectedTab: selectedTab ?? void 0,
248
+ onShowList: showList,
234
249
  onEditClick: () => {
235
250
  const editUrl = urlController.buildUrlCollectionPath(`${collectionPath}/${entityId}`) + "/edit";
236
251
  navigate(editUrl + hash);
@@ -251,6 +266,7 @@ function EntityFullScreenRoute({ pathname, navigationEntries, isNew, isCopy }) {
251
266
  path: collectionPath,
252
267
  copy: isCopy,
253
268
  selectedTab: selectedTab ?? void 0,
269
+ onShowList: showList,
254
270
  defaultValues: isNew ? defaultValues : void 0,
255
271
  onValuesModified: (modified) => blocked.current = modified,
256
272
  navigateBack: () => {
@@ -280,6 +296,29 @@ function EntityFullScreenRoute({ pathname, navigationEntries, isNew, isCopy }) {
280
296
  body: "You have unsaved changes in this entity."
281
297
  })] });
282
298
  }
299
+ /**
300
+ * Shown when a URL names a collection the registry cannot resolve.
301
+ *
302
+ * This used to be `return null`, which renders an empty pane inside the app
303
+ * chrome: the sidebar, the nav highlight and the breadcrumb all still work,
304
+ * because those read the collections array directly, while the view itself is
305
+ * blank. Nothing is thrown, and the only trace is a `console.debug` — so the
306
+ * panel looks like it lost its data rather than like it failed to find the
307
+ * collection, and there is no string to search for.
308
+ *
309
+ * A slug containing slashes went unresolvable this way and cost an afternoon to
310
+ * find. The lookup is fixed; this is the part that made it expensive.
311
+ */
312
+ function UnresolvedCollectionView({ path }) {
313
+ useEffect(() => {
314
+ console.warn(`[rebase] No collection is registered for "${path}", so this route has nothing to render. Check that the collection is in the collections array and that its slug matches the URL.`);
315
+ }, [path]);
316
+ return /* @__PURE__ */ jsx(CenteredView, { children: /* @__PURE__ */ jsx(ErrorView, {
317
+ title: "Collection not found",
318
+ error: `Nothing is registered for "${path}".`,
319
+ tooltip: "The URL names a collection the panel does not know about. It may have been renamed or removed from the collections array, or the slug may not match the path."
320
+ }) });
321
+ }
283
322
  //#endregion
284
323
  //#region src/components/ReferenceWidget.tsx
285
324
  /**
@@ -1188,6 +1227,23 @@ function Drawer({ children, title, logo, logoDestination, footerActions, classNa
1188
1227
  }) });
1189
1228
  }
1190
1229
  Drawer.componentType = "Drawer";
1230
+ var DRAWER_OPEN_STORAGE_KEY = "rebase-drawer-open";
1231
+ /** `null` when the user has never toggled the drawer, or storage is unavailable. */
1232
+ function readStoredDrawerOpen() {
1233
+ if (typeof window === "undefined") return null;
1234
+ try {
1235
+ const stored = window.localStorage.getItem(DRAWER_OPEN_STORAGE_KEY);
1236
+ return stored === null ? null : stored === "true";
1237
+ } catch (e) {
1238
+ return null;
1239
+ }
1240
+ }
1241
+ function writeStoredDrawerOpen(open) {
1242
+ if (typeof window === "undefined") return;
1243
+ try {
1244
+ window.localStorage.setItem(DRAWER_OPEN_STORAGE_KEY, String(open));
1245
+ } catch (e) {}
1246
+ }
1191
1247
  /**
1192
1248
  * This view acts as a scaffold for Rebase.
1193
1249
  *
@@ -1208,19 +1264,27 @@ var Scaffold = React.memo(function Scaffold(props) {
1208
1264
  const otherChildren = React.Children.toArray(children).filter((child) => child.type.componentType !== "Drawer" && child.type.componentType !== "AppBar");
1209
1265
  const includeDrawer = drawerChildren.length > 0;
1210
1266
  const largeLayout = useLargeLayout();
1211
- const [drawerOpen, setDrawerOpen] = React.useState(defaultDrawerOpen && largeLayout);
1267
+ const [drawerOpen, setDrawerOpenState] = React.useState(() => (readStoredDrawerOpen() ?? defaultDrawerOpen) && largeLayout);
1212
1268
  const [onHover, setOnHover] = React.useState(false);
1213
- const setOnHoverTrue = useCallback(() => setOnHover(true), []);
1269
+ const setDrawerOpen = useCallback((open) => {
1270
+ setDrawerOpenState(open);
1271
+ if (!largeLayout) return;
1272
+ writeStoredDrawerOpen(open);
1273
+ }, [largeLayout]);
1274
+ const setOnHoverTrue = useCallback(() => {
1275
+ if (!autoOpenDrawer) return;
1276
+ setOnHover(true);
1277
+ }, [autoOpenDrawer]);
1214
1278
  const setOnHoverFalse = useCallback(() => {
1215
1279
  if (document.querySelector("[data-radix-popper-content-wrapper]")) return;
1216
1280
  setOnHover(false);
1217
1281
  }, []);
1218
1282
  const handleDrawerOpen = useCallback(() => {
1219
1283
  setDrawerOpen(true);
1220
- }, []);
1284
+ }, [setDrawerOpen]);
1221
1285
  const handleDrawerClose = useCallback(() => {
1222
1286
  setDrawerOpen(false);
1223
- }, []);
1287
+ }, [setDrawerOpen]);
1224
1288
  const computedDrawerOpen = drawerOpen;
1225
1289
  const computedDrawerHovered = Boolean(largeLayout && onHover);
1226
1290
  const isStudioDark = useAdminModeController().mode === "studio";
@@ -1561,7 +1625,7 @@ function useLocalCollectionsConfigController(clientOrUrl, baseCollections = [],
1561
1625
  //#region src/components/RebaseNavigation.tsx
1562
1626
  var EMPTY_PLUGINS = [];
1563
1627
  var EMPTY_COLLECTIONS = [];
1564
- var CollectionsStudioView = lazy(() => import("./RouterCollectionsStudioView-BsLTNoqX.js").then((n) => n.n).then((m) => ({ default: m.RouterCollectionsStudioView })));
1628
+ var CollectionsStudioView = lazy(() => import("./RouterCollectionsStudioView-CMKFWM2J.js").then((n) => n.n).then((m) => ({ default: m.RouterCollectionsStudioView })));
1565
1629
  /**
1566
1630
  * Navigation layer — builds and provides all admin navigation controllers:
1567
1631
  * collection registry, URL controller, navigation state, side entity,
@@ -2790,8 +2854,8 @@ function ContentHomePage({ additionalActions, additionalChildrenStart, additiona
2790
2854
  }
2791
2855
  //#endregion
2792
2856
  //#region src/components/CollectionEditorDialogs.tsx
2793
- var CollectionEditorDialog = lazy(() => import("./CollectionEditorDialog-CjXkWZ64.js").then((n) => n.r).then((m) => ({ default: m.CollectionEditorDialog })));
2794
- var PropertyFormDialog = lazy(() => import("./PropertyEditView-W8I3YV89.js").then((n) => n.t).then((m) => ({ default: m.PropertyFormDialog })));
2857
+ var CollectionEditorDialog = lazy(() => import("./CollectionEditorDialog-CZZZpYOz.js").then((n) => n.r).then((m) => ({ default: m.CollectionEditorDialog })));
2858
+ var PropertyFormDialog = lazy(() => import("./PropertyEditView-CeoHSmUg.js").then((n) => n.t).then((m) => ({ default: m.PropertyFormDialog })));
2795
2859
  /**
2796
2860
  * Renders the CollectionEditorDialog and PropertyFormDialog inside
2797
2861
  * the RebaseShell tree where admin-internal contexts
@@ -3389,6 +3453,6 @@ function MissingReferenceWidget({ path: pathProp }) {
3389
3453
  });
3390
3454
  }
3391
3455
  //#endregion
3392
- export { AdminModeSyncer, AppBar, ArrayContainer, ArrayCustomShapedFieldBinding, ArrayEnumPreview, ArrayOfMapsPreview, ArrayOfReferencesFieldBinding, ArrayOfReferencesPreview, ArrayOfStorageComponentsPreview, ArrayOfStringsPreview, ArrayOneOfPreview, ArrayPropertyEnumPreview, ArrayPropertyPreview, BasicExportAction, BlockFieldBinding, BooleanPreview, CollectionCardViewBinding, CollectionGenerationApiError, CollectionPanel, CollectionRegistryContext, CollectionRowActions, CollectionTableBinding, CollectionViewActions, CollectionViewBinding, CreationResultDialog, CustomViewRoute, DEFAULT_COLLECTION_GENERATION_ENDPOINT, DEFAULT_FIELD_CONFIGS, DataNewPropertiesMapping, DatePreview, DateTimeFieldBinding, DefaultDrawer, Drawer, DrawerFooterActions, EmptyValue, EntityCardBinding, EntityForm, EntityFormBinding, EntityPreviewBinding, EntityViewBinding, EnumValuesChip, ExportCollectionAction, FieldBlock, FieldCaption, FieldHelperText, FormRail, FormSections, ImagePreview, ImportCollectionAction, ImportDataPreview, ImportFileUpload, ImportNewPropertyFieldPreview, ImportSaveInProgress, InlineEntityListPreview, KeyValueFieldBinding, KeyValuePreview, LabelWithIcon, LabelWithIconAndTooltip, MapFieldBinding, MapPropertyPreview, MarkdownEditorFieldBinding, MissingReferenceWidget, MultiSelectFieldBinding, NavigationStateContext, NumberPropertyPreview, PropertyConfigBadge, PropertyFieldBinding, PropertyIdCopyTooltip, PropertyPreview, PropertySelectEntry, ReadOnlyFieldBinding, RebaseAdmin, RebaseAuthGate, RebaseLayout, RebaseNavigation, RebaseRoute, RebaseRouteDefs, RebaseShell, ReferenceFieldBinding, ReferencePreview, ReferenceWidget, RelationPreview, RepeatFieldBinding, Scaffold, SearchIconsView, SelectFieldBinding, SelectableTable, SelectableTableContext, SelectionTableBinding, SideDialogs, SidePanelControllerContext, SidePanelProvider, SkeletonPropertyComponent, StorageThumbnail, StorageThumbnailInternal, StorageUploadFieldBinding, StringPropertyPreview, SwitchFieldBinding, TextFieldBinding, UrlComponentPreview, UrlContext, UserPreview, VectorFieldBinding, VirtualTableInput, addInitialSlash, buildCollectionGenerationCallback, buildSidePanelsFromUrl, convertDataToEntity, convertFileToJson, copyEntityAction, createStaticDataController, deleteEntityAction, downloadBlob, downloadDataAsCsv, downloadEntitiesExport, editEntityAction, extractTouchedValues, flattenEntry, fromSerializableCollectionConfig, fromSerializableCollectionConfigs, fromSerializableProperties, fromSerializableProperty, getBracketNotation, getChanges, getCollectionBySlugWithin, getCollectionPathsCombinations, getDefaultFieldConfig, getDefaultFieldId, getDefaultPropertiesOrder, getEntityCSVExportableData, getEntityJsonExportableData, getEntityPreviewKeys, getEntityTitlePropertyKey, getEntityTitlePropertyKeyForEntity, getEntityViewWidth, getFieldConfig, getFieldId, getFullId, getFullIdPath, getIconForProperty, getIconForWidget, getInferenceType, getInitialEntityValues, getLastSegment, getPropertiesWithPropertiesOrder, getPropertyInPath, getResolvedPropertyInPath, getUserLabel, idToPropertiesPath, isReferenceProperty, isRelationProperty, isSelfLabellingProperty, mapPropertiesToConfigs, mapPropertyToConfig, mergeEntityActions, namespaceToPropertiesOrderPath, namespaceToPropertiesPath, processValueMapping, removeEmptyContainers, removeInitialAndTrailingSlashes, removeInitialSlash, removeTrailingSlash, renderSkeletonCaptionText, renderSkeletonIcon, renderSkeletonImageThumbnail, renderSkeletonText, resetPasswordAction, resolveCollectionPathIds, resolveEntityAction, resolveEntityView, resolveNavigationFrom, sanitizeUrl, toSerializableCollectionConfig, toSerializableProperties, toSerializableProperty, unflattenObject, useAdminContext, useApp, useBreadcrumbsController, useBuildCollectionRegistryController, useBuildNavigationStateController, useBuildSidePanel, useBuildUrlController, useClearRestoreValue, useCollectionDataController, useCollectionEditorController, useCollectionRegistryController, useCollectionsConfigController, useHistory, useImportConfig, useJsonCollectionsConfigController, useLocalCollectionsConfigController, useNavigationStateController, useResolvedCollections, useResolvedNavigationFrom, useResolvedUser, useResolvedViews, useSelectionController, useSelectionDialog, useSideDialogsController, useSidePanel, useTopLevelNavigation, useUrlController, validateCollectionJson, zodToFormErrors };
3456
+ export { AdminModeSyncer, AppBar, ArrayContainer, ArrayCustomShapedFieldBinding, ArrayEnumPreview, ArrayOfMapsPreview, ArrayOfReferencesFieldBinding, ArrayOfReferencesPreview, ArrayOfStorageComponentsPreview, ArrayOfStringsPreview, ArrayOneOfPreview, ArrayPropertyEnumPreview, ArrayPropertyPreview, BasicExportAction, BlockFieldBinding, BooleanPreview, CollectionCardViewBinding, CollectionGenerationApiError, CollectionPanel, CollectionRegistryContext, CollectionRowActions, CollectionTableBinding, CollectionViewActions, CollectionViewBinding, CreationResultDialog, CustomViewRoute, DEFAULT_COLLECTION_GENERATION_ENDPOINT, DEFAULT_FIELD_CONFIGS, DataNewPropertiesMapping, DatePreview, DateTimeFieldBinding, DefaultDrawer, Drawer, DrawerFooterActions, EmptyValue, EntityCardBinding, EntityForm, EntityFormBinding, EntityPreviewBinding, EntityViewBinding, EnumValuesChip, ExportCollectionAction, FieldBlock, FieldCaption, FieldHelperText, FormRail, FormSections, ImagePreview, ImportCollectionAction, ImportDataPreview, ImportFileUpload, ImportNewPropertyFieldPreview, ImportSaveInProgress, InlineEntityListPreview, KeyValueFieldBinding, KeyValuePreview, LabelWithIcon, LabelWithIconAndTooltip, MapFieldBinding, MapPropertyPreview, MarkdownEditorFieldBinding, MissingReferenceWidget, MultiSelectFieldBinding, NavigationStateContext, NumberPropertyPreview, PropertyConfigBadge, PropertyFieldBinding, PropertyIdCopyTooltip, PropertyPreview, PropertySelectEntry, ReadOnlyFieldBinding, RebaseAdmin, RebaseAuthGate, RebaseLayout, RebaseNavigation, RebaseRoute, RebaseRouteDefs, RebaseShell, ReferenceFieldBinding, ReferencePreview, ReferenceWidget, RelationPreview, RepeatFieldBinding, Scaffold, SearchIconsView, SelectFieldBinding, SelectableTable, SelectableTableContext, SelectionTableBinding, SideDialogs, SidePanelControllerContext, SidePanelProvider, SkeletonPropertyComponent, StorageThumbnail, StorageThumbnailInternal, StorageUploadFieldBinding, StringPropertyPreview, SwitchFieldBinding, TextFieldBinding, UrlComponentPreview, UrlContext, UserPreview, VectorFieldBinding, VirtualTableInput, addInitialSlash, buildCollectionGenerationCallback, buildSidePanelsFromUrl, convertDataToEntity, convertFileToJson, copyEntityAction, createStaticDataController, deleteEntityAction, downloadBlob, downloadDataAsCsv, downloadEntitiesExport, editEntityAction, extractTouchedValues, flattenEntry, fromSerializableCollectionConfig, fromSerializableCollectionConfigs, fromSerializableProperties, fromSerializableProperty, getBracketNotation, getChanges, getCollectionBySlugWithin, getCollectionPathsCombinations, getDefaultFieldConfig, getDefaultFieldId, getDefaultPropertiesOrder, getEntityCSVExportableData, getEntityJsonExportableData, getEntityPreviewKeys, getEntityTitlePropertyKey, getEntityTitlePropertyKeyForEntity, getEntityViewWidth, getFieldConfig, getFieldId, getFullId, getFullIdPath, getIconForProperty, getIconForWidget, getInferenceType, getInitialEntityValues, getLastSegment, getPropertiesWithPropertiesOrder, getPropertyInPath, getResolvedPropertyInPath, getUserLabel, idToPropertiesPath, isReferenceProperty, isRelationProperty, isSelfLabellingProperty, mapPropertiesToConfigs, mapPropertyToConfig, mergeEntityActions, namespaceToPropertiesOrderPath, namespaceToPropertiesPath, processValueMapping, removeEmptyContainers, removeInitialAndTrailingSlashes, removeInitialSlash, removeTrailingSlash, renderSkeletonCaptionText, renderSkeletonIcon, renderSkeletonImageThumbnail, renderSkeletonText, resetPasswordAction, resolveCollectionPathIds, resolveEntityAction, resolveEntityView, resolveNavigationFrom, sanitizeUrl, spanClass, toSerializableCollectionConfig, toSerializableProperties, toSerializableProperty, unflattenObject, useAdminContext, useApp, useBreadcrumbsController, useBuildCollectionRegistryController, useBuildNavigationStateController, useBuildSidePanel, useBuildUrlController, useClearRestoreValue, useCollectionDataController, useCollectionEditorController, useCollectionRegistryController, useCollectionsConfigController, useHistory, useImportConfig, useJsonCollectionsConfigController, useLocalCollectionsConfigController, useNavigationStateController, useResolvedCollections, useResolvedNavigationFrom, useResolvedUser, useResolvedViews, useSelectionController, useSelectionDialog, useSideDialogsController, useSidePanel, useTopLevelNavigation, useUrlController, validateCollectionJson, zodToFormErrors };
3393
3457
 
3394
3458
  //# sourceMappingURL=index.js.map