@rebasepro/admin 0.9.0 → 0.9.1-canary.0de22e0

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 (264) hide show
  1. package/README.md +7 -7
  2. package/dist/{CollectionEditorDialog-B-7uW3iJ.js → CollectionEditorDialog-D7odTn0N.js} +150 -36
  3. package/dist/CollectionEditorDialog-D7odTn0N.js.map +1 -0
  4. package/dist/{PropertyEditView-7KMTcrqi.js → PropertyEditView-i51tFOfM.js} +6 -6
  5. package/dist/PropertyEditView-i51tFOfM.js.map +1 -0
  6. package/dist/{RouterCollectionsStudioView-epqIbZrJ.js → RouterCollectionsStudioView-B9AjTCjT.js} +5 -5
  7. package/dist/RouterCollectionsStudioView-B9AjTCjT.js.map +1 -0
  8. package/dist/collection_editor/api/generateCollectionApi.d.ts +4 -4
  9. package/dist/collection_editor/ui/collection_editor/PropertyEditView.d.ts +1 -1
  10. package/dist/collection_editor/ui/collection_editor/SwitchControl.d.ts +1 -1
  11. package/dist/collection_editor/useSafeSnackbarController.d.ts +1 -1
  12. package/dist/collection_editor_ui.js +5 -5
  13. package/dist/collection_editor_ui.js.map +1 -1
  14. package/dist/components/CollectionTableBinding/CollectionTableBindingProps.d.ts +1 -1
  15. package/dist/components/CollectionTableBinding/internal/EntityTableCell.d.ts +1 -1
  16. package/dist/components/CollectionTableBinding/internal/popup_field/PopupFormField.d.ts +1 -1
  17. package/dist/components/CollectionTableBinding/table_bindings.d.ts +1 -1
  18. package/dist/components/CollectionViewBinding/hooks/useCollectionInlineEditor.d.ts +1 -1
  19. package/dist/components/{RebaseCMS.d.ts → RebaseAdmin.d.ts} +2 -2
  20. package/dist/components/RebaseLayout.d.ts +5 -4
  21. package/dist/components/RebaseShell.d.ts +1 -0
  22. package/dist/components/SelectableTable/SelectableTable.d.ts +1 -1
  23. package/dist/components/SelectableTable/SelectableTableContext.d.ts +1 -1
  24. package/dist/components/SidePanelProvider.d.ts +1 -1
  25. package/dist/components/field_configs.d.ts +17 -0
  26. package/dist/components/index.d.ts +1 -1
  27. package/dist/contexts/BreacrumbsContext.d.ts +1 -1
  28. package/dist/editor.js +1 -1
  29. package/dist/editor.js.map +1 -1
  30. package/dist/export-BM6HPujv.js +518 -0
  31. package/dist/export-BM6HPujv.js.map +1 -0
  32. package/dist/form/components/LocalChangesMenu.d.ts +1 -1
  33. package/dist/form/components/StorageUploadProgress.d.ts +1 -1
  34. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +1 -1
  35. package/dist/{history-7X5bON_n.js → history-CtIPJxvQ.js} +6 -6
  36. package/dist/history-CtIPJxvQ.js.map +1 -0
  37. package/dist/hooks/useSelectionDialog.d.ts +1 -1
  38. package/dist/import-DzQnT03v.js +328 -0
  39. package/dist/import-DzQnT03v.js.map +1 -0
  40. package/dist/index.d.ts +1 -1
  41. package/dist/index.js +3300 -2
  42. package/dist/index.js.map +1 -0
  43. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  44. package/dist/preview/util.d.ts +1 -0
  45. package/dist/types/components/formex.d.ts +1 -1
  46. package/dist/util/view_mode.d.ts +54 -0
  47. package/dist/{src-sUZfe29F.js → util-XFwQ9FEc.js} +17554 -21391
  48. package/dist/util-XFwQ9FEc.js.map +1 -0
  49. package/package.json +12 -17
  50. package/src/collection_editor/ConfigControllerProvider.tsx +1 -1
  51. package/src/collection_editor/api/generateCollectionApi.ts +4 -4
  52. package/src/collection_editor/ui/AddKanbanColumnAction.tsx +1 -1
  53. package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +1 -1
  54. package/src/collection_editor/ui/EditorCollectionAction.tsx +1 -1
  55. package/src/collection_editor/ui/EditorCollectionActionStart.tsx +1 -1
  56. package/src/collection_editor/ui/EditorEntityAction.tsx +1 -1
  57. package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +1 -1
  58. package/src/collection_editor/ui/KanbanSetupAction.tsx +1 -1
  59. package/src/collection_editor/ui/MissingReferenceWidget.tsx +1 -1
  60. package/src/collection_editor/ui/NewCollectionButton.tsx +1 -1
  61. package/src/collection_editor/ui/NewCollectionCard.tsx +1 -1
  62. package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +1 -1
  63. package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +1 -1
  64. package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +3 -3
  65. package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +3 -3
  66. package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +2 -2
  67. package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +2 -2
  68. package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +139 -13
  69. package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +1 -1
  70. package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +1 -1
  71. package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +1 -1
  72. package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +2 -2
  73. package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +2 -2
  74. package/src/collection_editor/ui/collection_editor/EntityActionsSelectDialog.tsx +1 -1
  75. package/src/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.tsx +1 -1
  76. package/src/collection_editor/ui/collection_editor/EnumForm.tsx +2 -2
  77. package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +2 -2
  78. package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +2 -2
  79. package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +2 -2
  80. package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +2 -2
  81. package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +1 -1
  82. package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +1 -1
  83. package/src/collection_editor/ui/collection_editor/RouterCollectionStudioView.tsx +1 -1
  84. package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +2 -2
  85. package/src/collection_editor/ui/collection_editor/SwitchControl.tsx +1 -1
  86. package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx +1 -1
  87. package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.tsx +2 -2
  88. package/src/collection_editor/ui/collection_editor/properties/BlockPropertyField.tsx +1 -1
  89. package/src/collection_editor/ui/collection_editor/properties/BooleanPropertyField.tsx +1 -1
  90. package/src/collection_editor/ui/collection_editor/properties/CommonPropertyFields.tsx +3 -3
  91. package/src/collection_editor/ui/collection_editor/properties/DateTimePropertyField.tsx +2 -2
  92. package/src/collection_editor/ui/collection_editor/properties/EnumPropertyField.tsx +3 -3
  93. package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +2 -2
  94. package/src/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.tsx +2 -2
  95. package/src/collection_editor/ui/collection_editor/properties/NumberPropertyField.tsx +2 -2
  96. package/src/collection_editor/ui/collection_editor/properties/ReferencePropertyField.tsx +2 -2
  97. package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +1 -1
  98. package/src/collection_editor/ui/collection_editor/properties/RepeatPropertyField.tsx +1 -1
  99. package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +2 -2
  100. package/src/collection_editor/ui/collection_editor/properties/StringPropertyField.tsx +2 -2
  101. package/src/collection_editor/ui/collection_editor/properties/UrlPropertyField.tsx +1 -1
  102. package/src/collection_editor/ui/collection_editor/properties/VectorPropertyField.tsx +1 -1
  103. package/src/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx +1 -1
  104. package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.tsx +1 -1
  105. package/src/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.tsx +1 -1
  106. package/src/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx +2 -2
  107. package/src/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx +2 -2
  108. package/src/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx +2 -2
  109. package/src/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.tsx +2 -2
  110. package/src/collection_editor/useSafeSnackbarController.ts +1 -1
  111. package/src/components/AdminModeSyncer.tsx +1 -1
  112. package/src/components/ArrayContainer.tsx +1 -1
  113. package/src/components/ClearFilterSortButton.tsx +1 -1
  114. package/src/components/CollectionPanel.tsx +1 -1
  115. package/src/components/CollectionTableBinding/CollectionRowActions.tsx +3 -3
  116. package/src/components/CollectionTableBinding/CollectionTableBinding.tsx +3 -3
  117. package/src/components/CollectionTableBinding/CollectionTableBindingProps.tsx +1 -1
  118. package/src/components/CollectionTableBinding/PropertyTableCell.tsx +1 -1
  119. package/src/components/CollectionTableBinding/column_utils.tsx +1 -1
  120. package/src/components/CollectionTableBinding/fields/TableMultipleRelationField.tsx +2 -2
  121. package/src/components/CollectionTableBinding/fields/TableReferenceField.tsx +2 -2
  122. package/src/components/CollectionTableBinding/fields/TableRelationField.tsx +2 -2
  123. package/src/components/CollectionTableBinding/fields/TableStorageUpload.tsx +1 -1
  124. package/src/components/CollectionTableBinding/internal/CollectionTableToolbar.tsx +1 -1
  125. package/src/components/CollectionTableBinding/internal/EntityTableCell.tsx +2 -2
  126. package/src/components/CollectionTableBinding/internal/EntityTableCellActions.tsx +1 -1
  127. package/src/components/CollectionTableBinding/internal/popup_field/PopupFormField.tsx +4 -4
  128. package/src/components/CollectionTableBinding/table_bindings.tsx +1 -1
  129. package/src/components/CollectionViewBinding/BoardCardBinding.tsx +2 -2
  130. package/src/components/CollectionViewBinding/CollectionBoardViewBinding.tsx +4 -4
  131. package/src/components/CollectionViewBinding/CollectionCardViewBinding.tsx +1 -1
  132. package/src/components/CollectionViewBinding/CollectionListViewBinding.tsx +3 -3
  133. package/src/components/CollectionViewBinding/CollectionViewActions.tsx +3 -3
  134. package/src/components/CollectionViewBinding/CollectionViewBinding.tsx +77 -127
  135. package/src/components/CollectionViewBinding/CollectionViewStartActions.tsx +5 -9
  136. package/src/components/CollectionViewBinding/EntityCardBinding.tsx +3 -3
  137. package/src/components/CollectionViewBinding/FiltersDialog.tsx +19 -1
  138. package/src/components/CollectionViewBinding/SplitListView.tsx +114 -63
  139. package/src/components/CollectionViewBinding/ViewModeToggle.tsx +1 -1
  140. package/src/components/CollectionViewBinding/hooks/useCollectionInlineEditor.ts +2 -2
  141. package/src/components/CollectionViewBinding/hooks/useKanbanDragAndDrop.ts +2 -2
  142. package/src/components/CollectionViewBinding/useBoardDataController.tsx +9 -3
  143. package/src/components/CollectionViewBinding/usePreviewSlots.ts +1 -1
  144. package/src/components/DefaultAppBar.tsx +3 -3
  145. package/src/components/DefaultDrawer.tsx +3 -3
  146. package/src/components/DeleteEntityDialog.tsx +1 -1
  147. package/src/components/DetailViewBinding.tsx +7 -5
  148. package/src/components/DrawerNavigationGroup.tsx +2 -2
  149. package/src/components/EditFormActions.tsx +6 -6
  150. package/src/components/EditViewBinding.tsx +9 -8
  151. package/src/components/EntityPreviewBinding.tsx +5 -4
  152. package/src/components/EntityViewBinding.tsx +2 -2
  153. package/src/components/HomePage/ContentHomePage.tsx +6 -5
  154. package/src/components/HomePage/FavouritesView.tsx +2 -2
  155. package/src/components/HomePage/NavigationCardBinding.tsx +3 -3
  156. package/src/components/HomePage/NavigationGroup.tsx +1 -1
  157. package/src/components/HomePage/RenameGroupDialog.tsx +1 -1
  158. package/src/components/JsonPreviewBinding.tsx +1 -1
  159. package/src/components/{RebaseCMS.tsx → RebaseAdmin.tsx} +3 -3
  160. package/src/components/RebaseAuthGate.tsx +2 -2
  161. package/src/components/RebaseLayout.tsx +7 -13
  162. package/src/components/RebaseNavigation.tsx +18 -3
  163. package/src/components/RebaseRouteDefs.tsx +3 -3
  164. package/src/components/RebaseShell.tsx +2 -1
  165. package/src/components/ReferenceTable/SelectionTableBinding.tsx +7 -6
  166. package/src/components/ReferenceWidget.tsx +1 -1
  167. package/src/components/RelationSelector.tsx +1 -1
  168. package/src/components/SearchIconsView.tsx +2 -2
  169. package/src/components/SelectableTable/SelectableTable.tsx +2 -2
  170. package/src/components/SelectableTable/SelectableTableContext.tsx +1 -1
  171. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +1 -1
  172. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +1 -1
  173. package/src/components/SelectableTable/filters/FilterFieldBinding.tsx +1 -1
  174. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +2 -2
  175. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +1 -1
  176. package/src/components/SideDialogs.tsx +1 -1
  177. package/src/components/SidePanelBinding.tsx +47 -9
  178. package/src/components/SidePanelProvider.tsx +15 -12
  179. package/src/components/UserSelector.tsx +1 -1
  180. package/src/components/admin/CreationResultDialog.tsx +6 -3
  181. package/src/components/app/Scaffold.tsx +6 -2
  182. package/src/components/common/default_entity_actions.tsx +123 -25
  183. package/src/components/field_configs.tsx +42 -25
  184. package/src/components/history/EntityHistoryEntry.tsx +1 -1
  185. package/src/components/history/EntityHistoryView.tsx +5 -5
  186. package/src/components/history/LastEditedByIndicator.tsx +2 -2
  187. package/src/components/index.ts +1 -1
  188. package/src/contexts/BreacrumbsContext.tsx +1 -1
  189. package/src/data_export/export/BasicExportAction.tsx +1 -1
  190. package/src/data_export/export/ExportCollectionAction.tsx +1 -1
  191. package/src/data_import/components/DataNewPropertiesMapping.tsx +1 -1
  192. package/src/data_import/components/ImportFileUpload.tsx +1 -1
  193. package/src/data_import/components/ImportNewPropertyFieldPreview.tsx +3 -5
  194. package/src/data_import/components/ImportSaveInProgress.tsx +1 -1
  195. package/src/data_import/import/ImportCollectionAction.tsx +8 -8
  196. package/src/data_import/utils/data.ts +2 -2
  197. package/src/data_import/utils/get_properties_mapping.ts +1 -1
  198. package/src/editor/components/image-bubble.tsx +1 -1
  199. package/src/editor/components/table-bubble.tsx +1 -1
  200. package/src/editor/editor.tsx +1 -1
  201. package/src/editor/selectors/color-selector.tsx +1 -1
  202. package/src/editor/selectors/link-selector.tsx +1 -1
  203. package/src/editor/selectors/node-selector.tsx +2 -2
  204. package/src/editor/selectors/text-buttons.tsx +1 -1
  205. package/src/form/EntityForm.tsx +8 -5
  206. package/src/form/EntityFormActions.tsx +1 -1
  207. package/src/form/EntityFormBinding.tsx +7 -5
  208. package/src/form/PropertyFieldBinding.tsx +3 -3
  209. package/src/form/components/ErrorFocus.tsx +1 -1
  210. package/src/form/components/LocalChangesMenu.tsx +3 -3
  211. package/src/form/components/StorageItemPreview.tsx +1 -1
  212. package/src/form/components/StorageUploadProgress.tsx +3 -3
  213. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +3 -2
  214. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +4 -3
  215. package/src/form/field_bindings/BlockFieldBinding.tsx +4 -3
  216. package/src/form/field_bindings/DateTimeFieldBinding.tsx +3 -2
  217. package/src/form/field_bindings/KeyValueFieldBinding.tsx +4 -3
  218. package/src/form/field_bindings/MapFieldBinding.tsx +3 -2
  219. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +4 -3
  220. package/src/form/field_bindings/MultiSelectFieldBinding.tsx +2 -1
  221. package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +3 -2
  222. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +2 -1
  223. package/src/form/field_bindings/ReferenceFieldBinding.tsx +5 -4
  224. package/src/form/field_bindings/RelationFieldBinding.tsx +3 -2
  225. package/src/form/field_bindings/RepeatFieldBinding.tsx +3 -2
  226. package/src/form/field_bindings/SelectFieldBinding.tsx +2 -1
  227. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +5 -4
  228. package/src/form/field_bindings/SwitchFieldBinding.tsx +2 -1
  229. package/src/form/field_bindings/TextFieldBinding.tsx +2 -1
  230. package/src/form/field_bindings/UserSelectFieldBinding.tsx +2 -1
  231. package/src/form/field_bindings/VectorFieldBinding.tsx +2 -1
  232. package/src/form/form_utils.ts +1 -1
  233. package/src/hooks/navigation/useNavigationResolution.ts +19 -4
  234. package/src/hooks/useBuildSidePanel.tsx +10 -2
  235. package/src/hooks/useCMSContext.tsx +1 -1
  236. package/src/hooks/useHistory.ts +1 -1
  237. package/src/hooks/useResolvedNavigationFrom.tsx +4 -2
  238. package/src/hooks/useSelectionDialog.tsx +3 -3
  239. package/src/index.ts +3 -3
  240. package/src/preview/PropertyPreview.tsx +2 -2
  241. package/src/preview/components/DatePreview.tsx +1 -1
  242. package/src/preview/components/EnumValuesChip.tsx +1 -1
  243. package/src/preview/components/ImagePreview.tsx +2 -2
  244. package/src/preview/components/ReferencePreview.tsx +3 -3
  245. package/src/preview/components/RelationPreview.tsx +3 -3
  246. package/src/preview/components/StorageThumbnail.tsx +1 -1
  247. package/src/preview/components/UrlComponentPreview.tsx +2 -9
  248. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +1 -1
  249. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -1
  250. package/src/preview/property_previews/ArrayOneOfPreview.tsx +1 -1
  251. package/src/preview/property_previews/ArrayPropertyPreview.tsx +1 -1
  252. package/src/preview/property_previews/NumberPropertyPreview.tsx +1 -1
  253. package/src/preview/util.ts +9 -0
  254. package/src/routes/CustomViewRoute.tsx +2 -1
  255. package/src/routes/RebaseRoute.tsx +21 -26
  256. package/src/types/components/formex.tsx +1 -1
  257. package/src/util/navigation_utils.ts +2 -5
  258. package/src/util/previews.ts +4 -2
  259. package/src/util/view_mode.ts +102 -0
  260. package/dist/CollectionEditorDialog-B-7uW3iJ.js.map +0 -1
  261. package/dist/PropertyEditView-7KMTcrqi.js.map +0 -1
  262. package/dist/RouterCollectionsStudioView-epqIbZrJ.js.map +0 -1
  263. package/dist/history-7X5bON_n.js.map +0 -1
  264. package/dist/src-sUZfe29F.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import React, { useLayoutEffect } from "react";
2
- import { useRebaseRegistryDispatch } from "@rebasepro/core";
3
- import type { RebaseCMSConfig } from "@rebasepro/types";
2
+ import { useRebaseRegistryDispatch } from "@rebasepro/app";
3
+ import type { RebaseAdminConfig } from "@rebasepro/types";
4
4
 
5
5
  /**
6
6
  * Declarative component to configure the CMS in Rebase.
@@ -10,7 +10,7 @@ import type { RebaseCMSConfig } from "@rebasepro/types";
10
10
  * is auto-wired as a native feature (slots, provider, Studio view) without
11
11
  * needing any external plugin.
12
12
  */
13
- export function RebaseCMS({ collections, views, homePage, entityViews, entityActions, collectionEditor, navigationGroupMappings, basePath }: RebaseCMSConfig) {
13
+ export function RebaseAdmin({ collections, views, homePage, entityViews, entityActions, collectionEditor, navigationGroupMappings, basePath }: RebaseAdminConfig) {
14
14
  const dispatch = useRebaseRegistryDispatch();
15
15
 
16
16
  useLayoutEffect(() => {
@@ -2,9 +2,9 @@ import React from "react";
2
2
  import {
3
3
  useRebaseRegistry,
4
4
  useAuthController
5
- } from "@rebasepro/core";
5
+ } from "@rebasepro/app";
6
6
  import { CircularProgressCenter } from "@rebasepro/ui";
7
- import { LoginView } from "@rebasepro/core";
7
+ import { LoginView } from "@rebasepro/app";
8
8
  import type { AuthControllerExtended } from "@rebasepro/types";
9
9
 
10
10
  /**
@@ -4,10 +4,9 @@ import {
4
4
  useAdminModeController,
5
5
  useComponentOverride,
6
6
  useRebaseRegistry
7
- } from "@rebasepro/core";
7
+ } from "@rebasepro/app";
8
8
 
9
9
  import { Scaffold } from "./app/Scaffold";
10
- import { AppBar } from "./app/AppBar";
11
10
  import { Drawer } from "./app/Drawer";
12
11
  import { SideDialogs } from "./SideDialogs";
13
12
  import { AdminModeSyncer } from "./AdminModeSyncer";
@@ -16,7 +15,7 @@ import type { AppView } from "@rebasepro/types";
16
15
  export interface RebaseLayoutProps {
17
16
  /** Title shown in the drawer. */
18
17
  title?: string;
19
- /** Custom AppBar to override the default. */
18
+ /** Top bar. Only rendered if provided — pass `<AppBar/>` for the default one. */
20
19
  appBar?: React.ReactNode;
21
20
  /** Custom Drawer to override the default. */
22
21
  drawer?: React.ReactNode;
@@ -27,17 +26,18 @@ export interface RebaseLayoutProps {
27
26
  }
28
27
 
29
28
  /**
30
- * Layout layer — provides the Scaffold, AppBar, Drawer, and SideDialogs.
29
+ * Layout layer — provides the Scaffold, Drawer, and SideDialogs.
31
30
  *
32
31
  * Wraps the route outlet with the standard Rebase admin layout.
33
- * Override individual pieces (appBar, drawer) via props.
32
+ * Override the drawer via props; pass `appBar` to add a top bar (there is
33
+ * none by default — the drawer owns navigation and user actions).
34
34
  *
35
35
  * **Independently usable**: Use this when you want the Rebase layout
36
36
  * without its default route definitions.
37
37
  *
38
38
  * @example
39
39
  * ```tsx
40
- * <RebaseLayout title="My Admin">
40
+ * <RebaseLayout title="My Admin" appBar={<AppBar/>}>
41
41
  * <Route path="/" element={<MyHomePage />} />
42
42
  * <Route path="/custom" element={<CustomView />} />
43
43
  * </RebaseLayout>
@@ -53,14 +53,8 @@ export function RebaseLayout(props: RebaseLayoutProps) {
53
53
  } = props;
54
54
 
55
55
  const adminModeController = useAdminModeController();
56
- const ResolvedAppBar = useComponentOverride("Shell.AppBar", AppBar);
57
56
  const ResolvedDrawer = useComponentOverride("Shell.Drawer", Drawer);
58
57
 
59
- const ActiveAppBar = appBar ?? <ResolvedAppBar
60
- includeLanguageToggle={false}
61
- includeModeToggle={false}
62
- includeUserMenu={false}
63
- />;
64
58
  const ActiveDrawer = drawer ?? (
65
59
  <ResolvedDrawer
66
60
  title={title}
@@ -71,7 +65,7 @@ export function RebaseLayout(props: RebaseLayoutProps) {
71
65
  return (
72
66
  <Scaffold autoOpenDrawer={autoOpenDrawer}>
73
67
  <AdminModeSyncer devViews={devViews}/>
74
- {ActiveAppBar}
68
+ {appBar}
75
69
  {ActiveDrawer}
76
70
  <Outlet/>
77
71
  <SideDialogs/>
@@ -1,4 +1,4 @@
1
- import React, { useMemo, useRef, useEffect, lazy, Suspense } from "react";
1
+ import React, { useMemo, useRef, useEffect, useCallback, useContext, lazy, Suspense } from "react";
2
2
  import {
3
3
  useRebaseRegistry,
4
4
  useRebaseContext,
@@ -9,11 +9,12 @@ import {
9
9
  useRebaseClient,
10
10
  useData,
11
11
  useDataSources,
12
+ CollectionResolverRegistrationContext,
12
13
  StudioBridgeRegistryProvider,
13
14
  useBridgeRegistration,
14
15
  CustomizationControllerContext,
15
16
  RebaseDataContext
16
- } from "@rebasepro/core";
17
+ } from "@rebasepro/app";
17
18
  import { buildRoutedRebaseData, resolveDataSource } from "@rebasepro/common";
18
19
  import { CircularProgressCenter } from "@rebasepro/ui";
19
20
  import type { AppView, CollectionEditorOptions, EntityCustomView, EntityAction, CollectionConfig, RebasePlugin } from "@rebasepro/types";
@@ -103,6 +104,20 @@ export function RebaseNavigation({ children }: RebaseNavigationProps) {
103
104
  const defaultData = useData();
104
105
  const getCollectionRef = useRef(collectionRegistryController.getCollection);
105
106
  getCollectionRef.current = collectionRegistryController.getCollection;
107
+
108
+ // Hand the data layer a way to read this registry. It was built by <Rebase>,
109
+ // above us, and needs a collection's primary keys to give its rows an
110
+ // address — rows themselves carry only columns.
111
+ //
112
+ // Registered during render, not in an effect: the views that fetch rows are
113
+ // below us, and their effects run before ours, so an effect here would bind
114
+ // after the first page had already been converted. The call only assigns a
115
+ // ref, so repeating it per render is free.
116
+ const registerCollectionResolver = useContext(CollectionResolverRegistrationContext);
117
+ const resolveCollection = useCallback(
118
+ (slug: string) => getCollectionRef.current(slug),
119
+ []);
120
+ registerCollectionResolver(resolveCollection);
106
121
  const routedData = useMemo(() => buildRoutedRebaseData({
107
122
  defaultData,
108
123
  sources: dataSources.sources,
@@ -220,7 +235,7 @@ export function RebaseNavigation({ children }: RebaseNavigationProps) {
220
235
 
221
236
  // ── Merge CMS-registered entityViews/entityActions into the customization controller ──
222
237
  // The <Rebase> component builds the customizationController from its own props,
223
- // but entity views passed to <RebaseCMS> are stored in the registry and not
238
+ // but entity views passed to <RebaseAdmin> are stored in the registry and not
224
239
  // automatically merged. We re-provide an enriched controller here so that
225
240
  // downstream consumers (EditViewBinding, side panels, etc.) can resolve
226
241
  // string-keyed entity views like "blog_preview".
@@ -7,7 +7,7 @@ import {
7
7
  UIReferenceView,
8
8
  NotFoundPage,
9
9
  useComponentOverride
10
- } from "@rebasepro/core";
10
+ } from "@rebasepro/app";
11
11
  import { CircularProgressCenter } from "@rebasepro/ui";
12
12
 
13
13
  import { ContentHomePage as DefaultHomePage } from "./HomePage/ContentHomePage";
@@ -17,8 +17,8 @@ import { CustomViewRoute } from "../routes/CustomViewRoute";
17
17
  import { useNavigationStateController } from "../hooks/navigation/contexts/NavigationStateContext";
18
18
  import { CollectionEditorDialogs } from "./CollectionEditorDialogs";
19
19
  import { useEffect } from "react";
20
- import { useTranslation } from "@rebasepro/core";
21
- import { useBreadcrumbsController } from "../index";
20
+ import { useTranslation } from "@rebasepro/app";
21
+ import { useBreadcrumbsController } from "../hooks/useBreadcrumbsController";
22
22
 
23
23
  function SettingsView() {
24
24
  const { t } = useTranslation();
@@ -1,7 +1,7 @@
1
1
  import React, { useMemo } from "react";
2
2
  import {
3
3
  useRebaseRegistry
4
- } from "@rebasepro/core";
4
+ } from "@rebasepro/app";
5
5
  import { ErrorBoundary } from "@rebasepro/ui";
6
6
 
7
7
  import { RebaseAuthGate } from "./RebaseAuthGate";
@@ -11,6 +11,7 @@ import { RebaseRouteDefs } from "./RebaseRouteDefs";
11
11
 
12
12
  export interface RebaseShellProps {
13
13
  title?: string;
14
+ /** Top bar. Only rendered if provided — pass `<AppBar/>` for the default one. */
14
15
  appBar?: React.ReactNode;
15
16
  drawer?: React.ReactNode;
16
17
  autoOpenDrawer?: boolean;
@@ -14,16 +14,17 @@ import {
14
14
  useDataTableController,
15
15
  useLargeLayout,
16
16
  usePermissions
17
- } from "@rebasepro/core";
18
- import { ErrorView } from "@rebasepro/core";
17
+ } from "@rebasepro/app";
18
+ import { ErrorView } from "@rebasepro/app";
19
19
  import { Button, DialogActions, PlusIcon, Typography } from "@rebasepro/ui";
20
- import { IconForView } from "@rebasepro/core";
20
+ import { IconForView } from "@rebasepro/app";
21
21
  import { useSelectionController } from "../CollectionViewBinding/useSelectionController";
22
22
 
23
- import { useColumnIds } from "@rebasepro/core";
23
+ import { useColumnIds } from "@rebasepro/app";
24
24
  import { useSideDialogContext } from "../SideDialogs";
25
- import { useAnalyticsController } from "@rebasepro/core";
26
- import { useUrlController, useSidePanel } from "../../index";
25
+ import { useAnalyticsController } from "@rebasepro/app";
26
+ import { useUrlController } from "../../hooks/navigation/contexts/UrlContext";
27
+ import { useSidePanel } from "../../hooks/useSidePanel";
27
28
 
28
29
  /**
29
30
  * @group Components
@@ -7,7 +7,7 @@ import type { PreviewSize } from "../types/components/PropertyPreviewProps";
7
7
  import { getReferenceFrom } from "@rebasepro/common";
8
8
  import { ReferencePreview } from "../preview";
9
9
  import { Button, cls } from "@rebasepro/ui";
10
- import { useCollectionRegistryController } from "../index";
10
+ import { useCollectionRegistryController } from "../hooks/navigation/contexts/CollectionRegistryContext";
11
11
 
12
12
  export type ReferenceWidgetProps<M extends Record<string, unknown>> = {
13
13
  name?: string,
@@ -26,7 +26,7 @@ import { useCallback, useEffect, useRef, useState } from "react";
26
26
  import { Command as CommandPrimitive } from "cmdk";
27
27
  import { Entity, EntityRelation, FilterValues, Relation, getCollectionDataPath } from "@rebasepro/types";
28
28
  import { EntityPreviewBindingData } from "./EntityPreviewBinding";
29
- import { useData, useRelationSelector } from "@rebasepro/core";
29
+ import { useData, useRelationSelector } from "@rebasepro/app";
30
30
  import { useSidePanel } from "../hooks/useSidePanel";
31
31
  import { normalizeToEntityRelation } from "@rebasepro/common";
32
32
  import { EmptyValue } from "../preview";
@@ -10,8 +10,8 @@ import {
10
10
  SearchBar,
11
11
  Tooltip
12
12
  } from "@rebasepro/ui";
13
- import { iconsSearch } from "@rebasepro/core";
14
- import { useTranslation } from "@rebasepro/core";
13
+ import { iconsSearch } from "@rebasepro/app";
14
+ import { useTranslation } from "@rebasepro/app";
15
15
 
16
16
  const UPDATE_SEARCH_INDEX_WAIT_MS = 220;
17
17
 
@@ -3,11 +3,11 @@ import type { Property, WhereFilterOp } from "@rebasepro/types";
3
3
  import React, { useCallback, useEffect, useMemo, useRef } from "react";
4
4
  import { CollectionSize, Entity, EntityTableController, FilterValues, SelectedCellProps } from "@rebasepro/types";
5
5
  import { CellRendererParams, TableView, VirtualTableColumn, VirtualTableFilterValues, OnRowClickParams } from "@rebasepro/ui";
6
- import { DEFAULT_PAGE_SIZE, DataCollectionTableController, OnCellValueChange, OnColumnResizeParams } from "@rebasepro/core";
6
+ import { DEFAULT_PAGE_SIZE, DataCollectionTableController, OnCellValueChange, OnColumnResizeParams } from "@rebasepro/app";
7
7
  import { FilterFormFieldProps } from "@rebasepro/ui";
8
8
  import { useOutsideAlerter } from "@rebasepro/ui";
9
9
  import { SelectableTableContext } from "./SelectableTableContext";
10
- import { getRowHeight } from "@rebasepro/core";
10
+ import { getRowHeight } from "@rebasepro/app";
11
11
  import { FilterFieldBinding } from "./filters/FilterFieldBinding";
12
12
 
13
13
  export type SelectableTableProps<M extends Record<string, unknown>> = {
@@ -1,5 +1,5 @@
1
1
  import React, { useContext } from "react";
2
- import { DataCollectionTableController } from "@rebasepro/core";
2
+ import { DataCollectionTableController } from "@rebasepro/app";
3
3
 
4
4
  export const SelectableTableContext = React.createContext<DataCollectionTableController<Record<string, unknown>>>(null! as DataCollectionTableController<Record<string, unknown>>);
5
5
 
@@ -1,7 +1,7 @@
1
1
  import React from "react";
2
2
  import { VirtualTableWhereFilterOp } from "@rebasepro/ui";
3
3
  import { BooleanSwitchWithLabel } from "@rebasepro/ui";
4
- import { useTranslation } from "@rebasepro/core";
4
+ import { useTranslation } from "@rebasepro/app";
5
5
 
6
6
  interface BooleanFieldProps {
7
7
  name: string,
@@ -1,7 +1,7 @@
1
1
  import React, { useState } from "react";
2
2
  import { VirtualTableWhereFilterOp } from "@rebasepro/ui";
3
3
  import { DateTimeField, Select, SelectItem } from "@rebasepro/ui";
4
- import { useCustomizationController } from "@rebasepro/core";
4
+ import { useCustomizationController } from "@rebasepro/app";
5
5
 
6
6
  interface DateTimeFilterFieldProps {
7
7
  name: string,
@@ -8,7 +8,7 @@ import {
8
8
  WhereFilterOp
9
9
  } from "@rebasepro/types";
10
10
  import { enumToObjectEntries, resolveFilterOperators } from "@rebasepro/common";
11
- import { useCollectionScope, useComponentOverride, useResolvedComponent } from "@rebasepro/core";
11
+ import { useCollectionScope, useComponentOverride, useResolvedComponent } from "@rebasepro/app";
12
12
  import { StringNumberFilterField } from "./StringNumberFilterField";
13
13
  import { BooleanFilterField } from "./BooleanFilterField";
14
14
  import { DateTimeFilterField } from "./DateTimeFilterField";
@@ -6,8 +6,8 @@ import { Entity, EntityReference } from "@rebasepro/types";
6
6
  import { ReferencePreview } from "../../../preview";
7
7
  import { Button, Checkbox, Label, Select, SelectItem } from "@rebasepro/ui";
8
8
  import { getReferenceFrom } from "@rebasepro/common";
9
- import { useTranslation } from "@rebasepro/core";
10
- import { useCollectionRegistryController } from "../../../index";
9
+ import { useTranslation } from "@rebasepro/app";
10
+ import { useCollectionRegistryController } from "../../../hooks/navigation/contexts/CollectionRegistryContext";
11
11
 
12
12
  interface ReferenceFilterFieldProps {
13
13
  name: string,
@@ -11,7 +11,7 @@ import {
11
11
  XIcon
12
12
  } from "@rebasepro/ui";
13
13
  import { EnumValueConfig } from "@rebasepro/types";
14
- import { useTranslation } from "@rebasepro/core";
14
+ import { useTranslation } from "@rebasepro/app";
15
15
 
16
16
  interface StringNumberFilterFieldProps {
17
17
  name: string,
@@ -2,7 +2,7 @@ import type { SideDialogPanelProps } from "../hooks/useSideDialogsController";
2
2
  import React, { useCallback, useContext, useEffect, useState, useMemo } from "react";
3
3
  import { useSideDialogsController } from "../hooks";
4
4
  import { Sheet, Dialog } from "@rebasepro/ui";
5
- import { useUnsavedChangesDialog, UnsavedChangesDialog } from "@rebasepro/core";
5
+ import { useUnsavedChangesDialog, UnsavedChangesDialog } from "@rebasepro/app";
6
6
  import { ErrorBoundary } from "@rebasepro/ui";
7
7
  import type { SidePanelBindingProps } from "@rebasepro/types";
8
8
 
@@ -9,9 +9,10 @@ import { EditViewBinding } from "./EditViewBinding";
9
9
  import { DetailViewBinding } from "./DetailViewBinding";
10
10
  import { useSideDialogContext } from "./SideDialogs";
11
11
  import { useNavigate } from "react-router-dom";
12
- import { saveEntityToMemoryCache, useComponentOverride } from "@rebasepro/core";
13
- import { useCollectionRegistryController, useSidePanel } from "../index";
14
- import { useUrlController } from "../index";
12
+ import { saveEntityToMemoryCache, useComponentOverride } from "@rebasepro/app";
13
+ import { useCollectionRegistryController } from "../hooks/navigation/contexts/CollectionRegistryContext";
14
+ import { useSidePanel } from "../hooks/useSidePanel";
15
+ import { useUrlController } from "../hooks/navigation/contexts/UrlContext";
15
16
  import { resolveDefaultSelectedView } from "@rebasepro/common";
16
17
 
17
18
  /**
@@ -61,8 +62,10 @@ export function SidePanelBinding(props: SidePanelBindingProps) {
61
62
  if (props.onUpdate) {
62
63
  props.onUpdate(params);
63
64
  }
64
- setShowEditInPanel(false);
65
+ setEditInDialog(false);
65
66
  if (params.status !== "existing") {
67
+ // A newly created entity replaces the panel with its own address,
68
+ // which already leaves the edit view behind.
66
69
  sidePanelController.replace({
67
70
  path: params.path,
68
71
  entityId: params.entityId,
@@ -70,6 +73,8 @@ export function SidePanelBinding(props: SidePanelBindingProps) {
70
73
  updateUrl: collection?.openEntityMode !== "dialog",
71
74
  collection: params.collection
72
75
  });
76
+ } else {
77
+ closeEditView();
73
78
  }
74
79
 
75
80
  if (sideDialogsController.pendingClose) {
@@ -89,13 +94,46 @@ export function SidePanelBinding(props: SidePanelBindingProps) {
89
94
 
90
95
  const collection = collectionRegistryController.getCollection(path) ?? props.collection;
91
96
 
92
- const [showEditInPanel, setShowEditInPanel] = useState(selectedTab === "edit");
97
+ // Dialog mode deliberately stays out of the URL, so it is the only case that
98
+ // needs local edit state. Everywhere else `edit` is a path segment, which
99
+ // keeps refresh and the back button working the same way they do in split.
100
+ const isDialogMode = collection?.openEntityMode === "dialog";
101
+ const [editInDialog, setEditInDialog] = useState(false);
102
+ const showEditInPanel = isDialogMode ? editInDialog : selectedTab === "edit";
93
103
  const isDetailMode = collection?.defaultEntityAction === "view" && !showEditInPanel && Boolean(entityId);
94
104
 
95
105
  // Reset edit mode when switching entities
96
106
  useEffect(() => {
97
- setShowEditInPanel(selectedTab === "edit");
98
- }, [entityId, selectedTab]);
107
+ setEditInDialog(false);
108
+ }, [entityId]);
109
+
110
+ const openEditView = useCallback(() => {
111
+ if (isDialogMode || !entityId) {
112
+ setEditInDialog(true);
113
+ return;
114
+ }
115
+ sidePanelController.replace({
116
+ path,
117
+ entityId,
118
+ selectedTab: "edit",
119
+ updateUrl: true,
120
+ collection
121
+ });
122
+ }, [isDialogMode, entityId, path, collection, sidePanelController]);
123
+
124
+ const closeEditView = useCallback(() => {
125
+ if (isDialogMode || !entityId) {
126
+ setEditInDialog(false);
127
+ return;
128
+ }
129
+ sidePanelController.replace({
130
+ path,
131
+ entityId,
132
+ selectedTab: undefined,
133
+ updateUrl: true,
134
+ collection
135
+ });
136
+ }, [isDialogMode, entityId, path, collection, sidePanelController]);
99
137
 
100
138
  // One-time correction: when the side panel opens without the correct
101
139
  // selectedTab but the resolved collection (from the registry) has a
@@ -154,7 +192,7 @@ entityId }
154
192
  entityId={entityId!}
155
193
  parentCollectionSlugs={parentCollectionSlugs}
156
194
  parentEntityIds={parentEntityIds}
157
- onEditClick={() => setShowEditInPanel(true)}
195
+ onEditClick={openEditView}
158
196
  barActions={({
159
197
  status,
160
198
  values
@@ -203,7 +241,7 @@ entityId }
203
241
  parentCollectionSlugs={parentCollectionSlugs} parentEntityIds={parentEntityIds}
204
242
  onValuesModified={onValuesModified}
205
243
  onSaved={onUpdate}
206
- navigateBack={() => setShowEditInPanel(false)}
244
+ navigateBack={closeEditView}
207
245
  barActions={({
208
246
  status,
209
247
  values
@@ -6,13 +6,14 @@ import { SidePanelControllerContext } from "../hooks/useSidePanel";
6
6
  import { SideDialogsControllerContext } from "../contexts/SideDialogsControllerContext";
7
7
  import { BreadcrumbsProvider } from "../contexts/BreacrumbsContext";
8
8
  import { useBreadcrumbsController } from "../hooks/useBreadcrumbsController";
9
- import { useCollectionRegistryController, useUrlController } from "../index";
10
- import { useNavigationStateController } from "../index";
11
- import { useAuthController, useBridgeRegistration } from "@rebasepro/core";
9
+ import { useCollectionRegistryController } from "../hooks/navigation/contexts/CollectionRegistryContext";
10
+ import { useUrlController } from "../hooks/navigation/contexts/UrlContext";
11
+ import { useNavigationStateController } from "../hooks/navigation/contexts/NavigationStateContext";
12
+ import { useAuthController, useBridgeRegistration, NavigationBlockerProvider } from "@rebasepro/app";
12
13
 
13
14
  /**
14
15
  * Provider that builds the SidePanelController and makes it available
15
- * via the SidePanelControllerContext from @rebasepro/core.
16
+ * via the SidePanelControllerContext from @rebasepro/app.
16
17
  *
17
18
  * After the CMS extraction refactor, `useBuildSidePanel` lives
18
19
  * in the CMS package while the context it feeds into lives in core.
@@ -54,14 +55,16 @@ export function SidePanelProvider({ children }: { children: React.ReactNode }) {
54
55
  );
55
56
 
56
57
  return (
57
- <BreadcrumbsProvider>
58
- <SideDialogsControllerContext.Provider value={sideDialogsController}>
59
- <SidePanelControllerContext.Provider value={sidePanelController}>
60
- <BridgeAutoRegistrar sidePanelController={sidePanelController}/>
61
- {children}
62
- </SidePanelControllerContext.Provider>
63
- </SideDialogsControllerContext.Provider>
64
- </BreadcrumbsProvider>
58
+ <NavigationBlockerProvider>
59
+ <BreadcrumbsProvider>
60
+ <SideDialogsControllerContext.Provider value={sideDialogsController}>
61
+ <SidePanelControllerContext.Provider value={sidePanelController}>
62
+ <BridgeAutoRegistrar sidePanelController={sidePanelController}/>
63
+ {children}
64
+ </SidePanelControllerContext.Provider>
65
+ </SideDialogsControllerContext.Provider>
66
+ </BreadcrumbsProvider>
67
+ </NavigationBlockerProvider>
65
68
  );
66
69
  }
67
70
 
@@ -21,7 +21,7 @@ import * as React from "react";
21
21
  import { useCallback, useEffect, useRef, useState } from "react";
22
22
  import { Command as CommandPrimitive } from "cmdk";
23
23
  import { User } from "@rebasepro/types";
24
- import { useRebaseClient, useAuthController, UserDisplay } from "@rebasepro/core";
24
+ import { useRebaseClient, useAuthController, UserDisplay } from "@rebasepro/app";
25
25
  import { EmptyValue } from "../preview";
26
26
 
27
27
  interface UserSelectorItem {
@@ -13,7 +13,7 @@ import {
13
13
  Tooltip,
14
14
  Typography
15
15
  } from "@rebasepro/ui";
16
- import { useSnackbarController, useTranslation } from "@rebasepro/core";
16
+ import { useSnackbarController, useTranslation } from "@rebasepro/app";
17
17
  import { UserCreationResult } from "@rebasepro/types";
18
18
 
19
19
  export function CreationResultDialog({
@@ -90,8 +90,11 @@ export function CreationResultDialog({
90
90
  <div className="flex flex-col gap-4 py-2">
91
91
  <Alert color="warning">
92
92
  <Typography variant="body2">
93
- {t("temporary_password_description") ??
94
- "Email is not configured. Share this temporary password with the user securely. It will not be shown again."}
93
+ {result.emailDeliveryFailed
94
+ ? (t("temporary_password_email_failed_description") ??
95
+ "The email could not be delivered. Share this temporary password with the user securely. It will not be shown again.")
96
+ : (t("temporary_password_description") ??
97
+ "Email is not configured. Share this temporary password with the user securely. It will not be shown again.")}
95
98
  </Typography>
96
99
  </Alert>
97
100
 
@@ -3,7 +3,7 @@ import { cls, defaultBorderMixin, IconButton, Sheet, Tooltip } from "@rebasepro/
3
3
  import { ChevronLeftIcon, ErrorBoundary, MenuIcon } from "@rebasepro/ui";
4
4
  import { deepEqual as equal } from "fast-equals"
5
5
 
6
- import { useLargeLayout, useAdminModeController, useTranslation } from "@rebasepro/core";
6
+ import { useLargeLayout, useAdminModeController, useTranslation } from "@rebasepro/app";
7
7
  import { AppContext } from "./useApp";
8
8
 
9
9
  export const DRAWER_WIDTH = 280;
@@ -141,8 +141,12 @@ export const Scaffold = React.memo<PropsWithChildren<ScaffoldProps>>(
141
141
 
142
142
  <div
143
143
  className={cls(defaultBorderMixin, "bg-surface-50 dark:bg-surface-800", "grow overflow-auto m-0", {
144
- "lg:mt-4": !hasAppBar,
145
144
  "mt-1 lg:m-0 lg:mx-2 lg:mb-2 lg:rounded-lg lg:border-t lg:border-x lg:border-solid": padding,
145
+ // No app bar means no DrawerHeader spacer above, so inset the
146
+ // panel by the same amount as its sides and bottom.
147
+ // Must come after the padding classes, which reset lg margins.
148
+ "lg:mt-2": !hasAppBar && padding,
149
+ "lg:mt-4": !hasAppBar && !padding,
146
150
  "border-t": hasAppBar && !padding
147
151
  })}>
148
152