@firecms/core 3.0.0-canary.16 → 3.0.0-canary.160

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 (329) hide show
  1. package/README.md +3 -3
  2. package/dist/app/AppBar.d.ts +12 -0
  3. package/dist/app/Drawer.d.ts +16 -0
  4. package/dist/app/Scaffold.d.ts +30 -0
  5. package/dist/app/index.d.ts +4 -0
  6. package/dist/app/useApp.d.ts +16 -0
  7. package/dist/components/ArrayContainer.d.ts +19 -6
  8. package/dist/components/CircularProgressCenter.d.ts +1 -1
  9. package/dist/components/ClearFilterSortButton.d.ts +5 -0
  10. package/dist/components/{DeleteConfirmationDialog.d.ts → ConfirmationDialog.d.ts} +1 -1
  11. package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +11 -12
  12. package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +1 -1
  13. package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +7 -5
  14. package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +1 -0
  15. package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
  16. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +3 -1
  17. package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
  18. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
  19. package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +7 -4
  20. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +12 -2
  21. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
  22. package/dist/components/EntityCollectionView/utils.d.ts +3 -0
  23. package/dist/components/EntityPreview.d.ts +7 -6
  24. package/dist/components/ErrorView.d.ts +1 -1
  25. package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
  26. package/dist/components/HomePage/NavigationCardBinding.d.ts +1 -1
  27. package/dist/components/PropertyConfigBadge.d.ts +2 -1
  28. package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
  29. package/dist/components/ReferenceWidget.d.ts +3 -1
  30. package/dist/components/SelectableTable/SelectableTable.d.ts +1 -1
  31. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  32. package/dist/components/VirtualTable/VirtualTableProps.d.ts +15 -12
  33. package/dist/components/VirtualTable/types.d.ts +3 -3
  34. package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -1
  35. package/dist/components/common/index.d.ts +1 -0
  36. package/dist/components/common/table_height.d.ts +5 -0
  37. package/dist/components/common/types.d.ts +4 -6
  38. package/dist/components/common/useColumnsIds.d.ts +2 -1
  39. package/dist/components/common/useDataSourceEntityCollectionTableController.d.ts +4 -1
  40. package/dist/components/index.d.ts +4 -2
  41. package/dist/{components/FireCMSAppBar.d.ts → core/DefaultAppBar.d.ts} +6 -9
  42. package/dist/core/DefaultDrawer.d.ts +19 -0
  43. package/dist/core/DrawerNavigationItem.d.ts +10 -0
  44. package/dist/core/EntityEditView.d.ts +18 -4
  45. package/dist/core/FireCMS.d.ts +2 -2
  46. package/dist/core/NavigationRoutes.d.ts +3 -3
  47. package/dist/core/index.d.ts +3 -4
  48. package/dist/form/PropertyFieldBinding.d.ts +1 -1
  49. package/dist/form/components/ErrorFocus.d.ts +1 -1
  50. package/dist/form/components/FieldHelperText.d.ts +3 -3
  51. package/dist/form/components/LabelWithIcon.d.ts +1 -1
  52. package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
  53. package/dist/form/components/StorageItemPreview.d.ts +4 -4
  54. package/dist/form/components/index.d.ts +1 -1
  55. package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
  56. package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
  57. package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
  58. package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
  59. package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
  60. package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
  61. package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
  62. package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
  63. package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
  64. package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
  65. package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
  66. package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -5
  67. package/dist/form/field_bindings/SwitchFieldBinding.d.ts +1 -2
  68. package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
  69. package/dist/form/index.d.ts +3 -5
  70. package/dist/form/useClearRestoreValue.d.ts +2 -2
  71. package/dist/hooks/data/delete.d.ts +4 -4
  72. package/dist/hooks/data/save.d.ts +4 -5
  73. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  74. package/dist/hooks/data/useEntityFetch.d.ts +3 -3
  75. package/dist/hooks/index.d.ts +1 -0
  76. package/dist/hooks/useAuthController.d.ts +1 -1
  77. package/dist/hooks/useBuildNavigationController.d.ts +3 -4
  78. package/dist/hooks/useFireCMSContext.d.ts +1 -1
  79. package/dist/hooks/useProjectLog.d.ts +8 -2
  80. package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
  81. package/dist/hooks/useValidateAuthenticator.d.ts +5 -9
  82. package/dist/index.d.ts +1 -0
  83. package/dist/index.es.js +20202 -14110
  84. package/dist/index.es.js.map +1 -1
  85. package/dist/index.umd.js +22773 -588
  86. package/dist/index.umd.js.map +1 -1
  87. package/dist/internal/useBuildDataSource.d.ts +1 -16
  88. package/dist/preview/PropertyPreviewProps.d.ts +6 -1
  89. package/dist/preview/components/EnumValuesChip.d.ts +1 -1
  90. package/dist/preview/components/ReferencePreview.d.ts +3 -2
  91. package/dist/preview/components/StorageThumbnail.d.ts +2 -1
  92. package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
  93. package/dist/preview/util.d.ts +3 -3
  94. package/dist/types/auth.d.ts +8 -10
  95. package/dist/types/collections.d.ts +53 -18
  96. package/dist/types/datasource.d.ts +51 -35
  97. package/dist/types/entities.d.ts +6 -1
  98. package/dist/types/entity_actions.d.ts +18 -4
  99. package/dist/types/entity_callbacks.d.ts +16 -16
  100. package/dist/types/entity_overrides.d.ts +2 -2
  101. package/dist/types/export_import.d.ts +4 -4
  102. package/dist/types/fields.d.ts +63 -41
  103. package/dist/types/firecms.d.ts +6 -2
  104. package/dist/types/firecms_context.d.ts +1 -1
  105. package/dist/types/index.d.ts +0 -1
  106. package/dist/types/navigation.d.ts +6 -5
  107. package/dist/types/permissions.d.ts +4 -4
  108. package/dist/types/plugins.d.ts +22 -12
  109. package/dist/types/properties.d.ts +34 -21
  110. package/dist/types/property_config.d.ts +0 -2
  111. package/dist/types/side_dialogs_controller.d.ts +10 -0
  112. package/dist/types/storage.d.ts +86 -3
  113. package/dist/types/user.d.ts +1 -0
  114. package/dist/util/builders.d.ts +2 -2
  115. package/dist/util/entities.d.ts +2 -2
  116. package/dist/util/icon_list.d.ts +5 -1
  117. package/dist/util/icon_synonyms.d.ts +1 -97
  118. package/dist/util/icons.d.ts +6 -3
  119. package/dist/util/index.d.ts +1 -0
  120. package/dist/util/navigation_utils.d.ts +2 -2
  121. package/dist/util/objects.d.ts +2 -1
  122. package/dist/util/permissions.d.ts +4 -4
  123. package/dist/util/plurals.d.ts +0 -2
  124. package/dist/util/property_utils.d.ts +3 -3
  125. package/dist/util/resolutions.d.ts +30 -16
  126. package/dist/util/storage.d.ts +23 -2
  127. package/dist/util/useStorageUploadController.d.ts +3 -3
  128. package/package.json +59 -44
  129. package/src/app/AppBar.tsx +18 -0
  130. package/src/app/Drawer.tsx +24 -0
  131. package/src/app/Scaffold.tsx +243 -0
  132. package/src/app/index.ts +4 -0
  133. package/src/app/useApp.tsx +32 -0
  134. package/src/components/ArrayContainer.tsx +92 -25
  135. package/src/components/CircularProgressCenter.tsx +2 -2
  136. package/src/components/ClearFilterSortButton.tsx +41 -0
  137. package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +3 -3
  138. package/src/components/DeleteEntityDialog.tsx +9 -18
  139. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +13 -20
  140. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +28 -25
  141. package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +12 -8
  142. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +47 -39
  143. package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
  144. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +31 -17
  145. package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +16 -8
  146. package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +30 -35
  147. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +36 -34
  148. package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +19 -7
  149. package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +82 -75
  150. package/src/components/EntityCollectionView/EntityCollectionView.tsx +139 -87
  151. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
  152. package/src/components/EntityCollectionView/useSelectionController.tsx +19 -7
  153. package/src/components/EntityCollectionView/utils.ts +19 -0
  154. package/src/components/EntityPreview.tsx +55 -51
  155. package/src/components/EntityView.tsx +10 -10
  156. package/src/components/ErrorView.tsx +4 -4
  157. package/src/components/HomePage/DefaultHomePage.tsx +26 -19
  158. package/src/components/HomePage/FavouritesView.tsx +1 -1
  159. package/src/components/HomePage/NavigationCard.tsx +4 -4
  160. package/src/components/HomePage/NavigationCardBinding.tsx +2 -2
  161. package/src/components/HomePage/NavigationGroup.tsx +2 -2
  162. package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
  163. package/src/components/PropertyConfigBadge.tsx +9 -3
  164. package/src/components/PropertyIdCopyTooltip.tsx +48 -0
  165. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +8 -7
  166. package/src/components/ReferenceWidget.tsx +22 -12
  167. package/src/components/SearchIconsView.tsx +10 -7
  168. package/src/components/SelectableTable/SelectableTable.tsx +9 -9
  169. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
  170. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +25 -8
  171. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +30 -6
  172. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +90 -21
  173. package/src/components/VirtualTable/VirtualTable.tsx +77 -46
  174. package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
  175. package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
  176. package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
  177. package/src/components/VirtualTable/VirtualTableProps.tsx +18 -14
  178. package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
  179. package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +5 -5
  180. package/src/components/VirtualTable/fields/VirtualTableInput.tsx +2 -1
  181. package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
  182. package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +16 -28
  183. package/src/components/VirtualTable/types.tsx +2 -3
  184. package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +8 -4
  185. package/src/components/common/index.ts +1 -0
  186. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  187. package/src/components/common/types.tsx +4 -6
  188. package/src/components/common/useColumnsIds.tsx +23 -2
  189. package/src/components/common/useDataSourceEntityCollectionTableController.tsx +25 -14
  190. package/src/components/common/useTableSearchHelper.ts +53 -12
  191. package/src/components/index.tsx +4 -2
  192. package/src/contexts/DialogsProvider.tsx +2 -2
  193. package/src/contexts/SnackbarProvider.tsx +2 -0
  194. package/src/core/DefaultAppBar.tsx +178 -0
  195. package/src/core/DefaultDrawer.tsx +183 -0
  196. package/src/core/DrawerNavigationItem.tsx +66 -0
  197. package/src/core/EntityEditView.tsx +721 -156
  198. package/src/core/EntitySidePanel.tsx +1 -2
  199. package/src/core/FireCMS.tsx +57 -53
  200. package/src/core/NavigationRoutes.tsx +7 -8
  201. package/src/core/SideDialogs.tsx +2 -1
  202. package/src/core/field_configs.tsx +9 -10
  203. package/src/core/index.tsx +3 -4
  204. package/src/form/PropertyFieldBinding.tsx +74 -35
  205. package/src/form/components/CustomIdField.tsx +6 -2
  206. package/src/form/components/FieldHelperText.tsx +4 -4
  207. package/src/form/components/LabelWithIcon.tsx +27 -19
  208. package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
  209. package/src/form/components/StorageItemPreview.tsx +22 -12
  210. package/src/form/components/StorageUploadProgress.tsx +3 -4
  211. package/src/form/components/index.tsx +1 -1
  212. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +29 -17
  213. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +45 -35
  214. package/src/form/field_bindings/BlockFieldBinding.tsx +53 -33
  215. package/src/form/field_bindings/DateTimeFieldBinding.tsx +17 -14
  216. package/src/form/field_bindings/KeyValueFieldBinding.tsx +60 -51
  217. package/src/form/field_bindings/MapFieldBinding.tsx +67 -48
  218. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +150 -0
  219. package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +25 -20
  220. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
  221. package/src/form/field_bindings/ReferenceFieldBinding.tsx +42 -31
  222. package/src/form/field_bindings/RepeatFieldBinding.tsx +52 -34
  223. package/src/form/field_bindings/SelectFieldBinding.tsx +21 -13
  224. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +37 -47
  225. package/src/form/field_bindings/SwitchFieldBinding.tsx +28 -24
  226. package/src/form/field_bindings/TextFieldBinding.tsx +26 -23
  227. package/src/form/index.tsx +4 -9
  228. package/src/form/useClearRestoreValue.tsx +2 -2
  229. package/src/form/validation.ts +1 -17
  230. package/src/hooks/data/delete.ts +6 -5
  231. package/src/hooks/data/save.ts +12 -8
  232. package/src/hooks/data/useCollectionFetch.tsx +2 -2
  233. package/src/hooks/data/useDataSource.tsx +11 -3
  234. package/src/hooks/data/useEntityFetch.tsx +5 -5
  235. package/src/hooks/index.tsx +1 -0
  236. package/src/hooks/useAuthController.tsx +1 -1
  237. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
  238. package/src/hooks/useBuildModeController.tsx +11 -5
  239. package/src/hooks/useBuildNavigationController.tsx +92 -34
  240. package/src/hooks/useFireCMSContext.tsx +5 -5
  241. package/src/hooks/useProjectLog.tsx +32 -10
  242. package/src/hooks/useResolvedNavigationFrom.tsx +6 -6
  243. package/src/hooks/useValidateAuthenticator.tsx +21 -41
  244. package/src/index.ts +1 -0
  245. package/src/internal/useBuildDataSource.ts +72 -82
  246. package/src/internal/useBuildSideDialogsController.tsx +1 -0
  247. package/src/internal/useBuildSideEntityController.tsx +102 -22
  248. package/src/internal/useUnsavedChangesDialog.tsx +5 -3
  249. package/src/preview/PropertyPreview.tsx +11 -18
  250. package/src/preview/PropertyPreviewProps.tsx +7 -1
  251. package/src/preview/components/BooleanPreview.tsx +2 -2
  252. package/src/preview/components/EmptyValue.tsx +1 -1
  253. package/src/preview/components/EnumValuesChip.tsx +2 -2
  254. package/src/preview/components/ImagePreview.tsx +25 -35
  255. package/src/preview/components/ReferencePreview.tsx +23 -34
  256. package/src/preview/components/StorageThumbnail.tsx +5 -1
  257. package/src/preview/components/UrlComponentPreview.tsx +44 -11
  258. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +2 -3
  259. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +4 -3
  260. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +2 -3
  261. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -2
  262. package/src/preview/property_previews/ArrayOneOfPreview.tsx +4 -5
  263. package/src/preview/property_previews/ArrayPropertyPreview.tsx +4 -5
  264. package/src/preview/property_previews/MapPropertyPreview.tsx +9 -9
  265. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +12 -12
  266. package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
  267. package/src/preview/util.ts +10 -10
  268. package/src/types/auth.tsx +9 -13
  269. package/src/types/collections.ts +62 -20
  270. package/src/types/customization_controller.tsx +0 -1
  271. package/src/types/datasource.ts +60 -43
  272. package/src/types/entities.ts +11 -1
  273. package/src/types/entity_actions.tsx +20 -7
  274. package/src/types/entity_callbacks.ts +18 -18
  275. package/src/types/entity_overrides.tsx +2 -2
  276. package/src/types/export_import.ts +4 -4
  277. package/src/types/fields.tsx +69 -45
  278. package/src/types/firecms.tsx +7 -2
  279. package/src/types/firecms_context.tsx +1 -1
  280. package/src/types/index.ts +0 -1
  281. package/src/types/navigation.ts +7 -7
  282. package/src/types/permissions.ts +5 -5
  283. package/src/types/plugins.tsx +24 -14
  284. package/src/types/properties.ts +39 -22
  285. package/src/types/property_config.tsx +0 -2
  286. package/src/types/side_dialogs_controller.tsx +13 -0
  287. package/src/types/storage.ts +94 -3
  288. package/src/types/user.ts +2 -0
  289. package/src/util/builders.ts +6 -6
  290. package/src/util/entities.ts +6 -5
  291. package/src/util/enums.ts +1 -1
  292. package/src/util/icon_list.ts +15 -10
  293. package/src/util/icon_synonyms.ts +3 -99
  294. package/src/util/icons.tsx +17 -7
  295. package/src/util/index.ts +1 -0
  296. package/src/util/make_properties_editable.ts +13 -5
  297. package/src/util/navigation_utils.ts +6 -6
  298. package/src/util/objects.ts +45 -28
  299. package/src/util/permissions.ts +9 -8
  300. package/src/util/plurals.ts +0 -2
  301. package/src/util/property_utils.tsx +11 -4
  302. package/src/util/references.ts +3 -0
  303. package/src/util/resolutions.ts +79 -46
  304. package/src/util/storage.ts +79 -21
  305. package/src/util/strings.ts +2 -2
  306. package/src/util/useStorageUploadController.tsx +34 -8
  307. package/src/util/useTraceUpdate.tsx +1 -0
  308. package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
  309. package/dist/components/VirtualTable/common.d.ts +0 -2
  310. package/dist/core/Drawer.d.ts +0 -23
  311. package/dist/core/Scaffold.d.ts +0 -55
  312. package/dist/core/SideEntityView.d.ts +0 -7
  313. package/dist/form/EntityForm.d.ts +0 -77
  314. package/dist/form/components/FormikArrayContainer.d.ts +0 -18
  315. package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
  316. package/dist/internal/useBuildCustomizationController.d.ts +0 -2
  317. package/dist/internal/useLocaleConfig.d.ts +0 -1
  318. package/dist/types/appcheck.d.ts +0 -26
  319. package/src/components/FireCMSAppBar.tsx +0 -165
  320. package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
  321. package/src/core/Drawer.tsx +0 -191
  322. package/src/core/Scaffold.tsx +0 -281
  323. package/src/core/SideEntityView.tsx +0 -38
  324. package/src/form/EntityForm.tsx +0 -728
  325. package/src/form/components/FormikArrayContainer.tsx +0 -44
  326. package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
  327. package/src/internal/useBuildCustomizationController.tsx +0 -5
  328. package/src/internal/useLocaleConfig.tsx +0 -18
  329. package/src/types/appcheck.ts +0 -29
@@ -8,10 +8,10 @@ export declare function resolveCollectionPathIds(path: string, allCollections: E
8
8
  /**
9
9
  * Find the corresponding view at any depth for a given path.
10
10
  * Note that path or segments of the paths can be collection aliases.
11
- * @param pathOrAlias
11
+ * @param pathOrId
12
12
  * @param collections
13
13
  */
14
- export declare function getCollectionByPathOrId(pathOrAlias: string, collections: EntityCollection[]): EntityCollection | undefined;
14
+ export declare function getCollectionByPathOrId(pathOrId: string, collections: EntityCollection[]): EntityCollection | undefined;
15
15
  /**
16
16
  * Get the subcollection combinations from a path:
17
17
  * "sites/es/locales" => ["sites/es/locales", "sites"]
@@ -1,10 +1,11 @@
1
1
  export declare const pick: <T>(obj: T, ...args: any[]) => T;
2
2
  export declare function isObject(item: any): any;
3
- export declare function mergeDeep<T extends object>(target: T, source: any): T;
3
+ export declare function mergeDeep<T extends Record<any, any>, U extends Record<any, any>>(target: T, source: U): T & U;
4
4
  export declare function getValueInPath(o: object | undefined, path: string): any;
5
5
  export declare function removeInPath(o: object, path: string): object | undefined;
6
6
  export declare function removeFunctions(o: object | undefined): any;
7
7
  export declare function getHashValue<T>(v: T): any;
8
8
  export declare function removeUndefined(value: any, removeEmptyStrings?: boolean): any;
9
+ export declare function removeNulls(value: any): any;
9
10
  export declare function isEmptyObject(obj: object): boolean;
10
11
  export declare function removePropsIfExisting(source: any, comparison: any): any;
@@ -1,5 +1,5 @@
1
1
  import { AuthController, Entity, EntityCollection, Permissions, User } from "../types";
2
- export declare function resolvePermissions<M extends Record<string, any>, UserType extends User>(collection: EntityCollection<M>, authController: AuthController<UserType>, path: string, entity: Entity<M> | null): Permissions | undefined;
3
- export declare function canEditEntity<M extends Record<string, any>, UserType extends User>(collection: EntityCollection<M>, authController: AuthController<UserType>, path: string, entity: Entity<M> | null): boolean;
4
- export declare function canCreateEntity<M extends Record<string, any>, UserType extends User>(collection: EntityCollection<M>, authController: AuthController<UserType>, path: string, entity: Entity<M> | null): boolean;
5
- export declare function canDeleteEntity<M extends Record<string, any>, UserType extends User>(collection: EntityCollection<M>, authController: AuthController<UserType>, path: string, entity: Entity<M> | null): boolean;
2
+ export declare function resolvePermissions<M extends Record<string, any>, USER extends User>(collection: EntityCollection<M>, authController: AuthController<USER>, path: string, entity: Entity<M> | null): Permissions | undefined;
3
+ export declare function canEditEntity<M extends Record<string, any>, USER extends User>(collection: EntityCollection<M>, authController: AuthController<USER>, path: string, entity: Entity<M> | null): boolean;
4
+ export declare function canCreateEntity<M extends Record<string, any>, USER extends User>(collection: EntityCollection<M>, authController: AuthController<USER>, path: string, entity: Entity<M> | null): boolean;
5
+ export declare function canDeleteEntity<M extends Record<string, any>, USER extends User>(collection: EntityCollection<M>, authController: AuthController<USER>, path: string, entity: Entity<M> | null): boolean;
@@ -1,7 +1,6 @@
1
1
  /**
2
2
  * Returns the plural of an English word.
3
3
  *
4
- * @export
5
4
  * @param {string} word
6
5
  * @param {number} [amount]
7
6
  * @returns {string}
@@ -10,7 +9,6 @@ export declare function plural(word: string, amount?: number): string;
10
9
  /**
11
10
  * Returns the singular of an English word.
12
11
  *
13
- * @export
14
12
  * @param {string} word
15
13
  * @param {number} [amount]
16
14
  * @returns {string}
@@ -1,9 +1,9 @@
1
1
  import React from "react";
2
- import { EntityCollection, PropertiesOrBuilders, PropertyConfig, PropertyOrBuilder, ResolvedProperty } from "../types";
2
+ import { EntityCollection, PropertiesOrBuilders, PropertyConfig, PropertyOrBuilder, ResolvedProperties, ResolvedProperty } from "../types";
3
3
  export declare function isReferenceProperty(propertyOrBuilder: PropertyOrBuilder, fields: Record<string, PropertyConfig>): boolean | null;
4
4
  export declare function getIdIcon(size: "small" | "medium" | "large"): React.ReactNode;
5
5
  export declare function getIconForWidget(widget: PropertyConfig | undefined, size: "small" | "medium" | "large"): import("react/jsx-runtime").JSX.Element;
6
- export declare function getIconForProperty(property: PropertyOrBuilder | ResolvedProperty, size?: "small" | "medium" | "large", fields?: Record<string, PropertyConfig>): React.ReactNode;
6
+ export declare function getIconForProperty(property: PropertyOrBuilder<any> | ResolvedProperty<any>, size?: "small" | "medium" | "large", fields?: Record<string, PropertyConfig>): React.ReactNode;
7
7
  export declare function getColorForProperty(property: PropertyOrBuilder, fields: Record<string, PropertyConfig>): string;
8
8
  /**
9
9
  * Get a property in a property tree from a path like
@@ -11,7 +11,7 @@ export declare function getColorForProperty(property: PropertyOrBuilder, fields:
11
11
  * @param properties
12
12
  * @param path
13
13
  */
14
- export declare function getPropertyInPath<M extends Record<string, any>>(properties: PropertiesOrBuilders<M>, path: string): PropertyOrBuilder<any, M> | undefined;
14
+ export declare function getPropertyInPath<M extends Record<string, any>>(properties: PropertiesOrBuilders<M> | ResolvedProperties, path: string): PropertyOrBuilder<any, M> | undefined;
15
15
  export declare function getResolvedPropertyInPath(properties: Record<string, ResolvedProperty>, path: string): ResolvedProperty | undefined;
16
16
  export declare function getBracketNotation(path: string): string;
17
17
  /**
@@ -1,58 +1,72 @@
1
1
  import { ArrayProperty, CMSType, EntityCollection, EntityCustomView, EntityValues, EnumValueConfig, EnumValues, NumberProperty, PropertiesOrBuilders, PropertyConfig, PropertyOrBuilder, ResolvedArrayProperty, ResolvedEntityCollection, ResolvedNumberProperty, ResolvedProperties, ResolvedProperty, ResolvedStringProperty, StringProperty, UserConfigurationPersistence } from "../types";
2
- export declare const resolveCollection: <M extends Record<string, any>>({ collection, path, entityId, values, previousValues, userConfigPersistence, fields }: {
2
+ export declare const resolveCollection: <M extends Record<string, any>>({ collection, path, entityId, values, previousValues, userConfigPersistence, propertyConfigs, ignoreMissingFields }: {
3
3
  collection: EntityCollection<M> | ResolvedEntityCollection<M>;
4
4
  path: string;
5
- entityId?: string | undefined;
6
- values?: Partial<M> | undefined;
7
- previousValues?: Partial<M> | undefined;
8
- userConfigPersistence?: UserConfigurationPersistence | undefined;
9
- fields?: Record<string, PropertyConfig> | undefined;
5
+ entityId?: string;
6
+ values?: Partial<EntityValues<M>>;
7
+ previousValues?: Partial<EntityValues<M>>;
8
+ userConfigPersistence?: UserConfigurationPersistence;
9
+ propertyConfigs?: Record<string, PropertyConfig>;
10
+ ignoreMissingFields?: boolean;
10
11
  }) => ResolvedEntityCollection<M>;
11
12
  /**
12
13
  * Resolve property builders, enums and arrays.
13
14
  * @param propertyOrBuilder
14
15
  * @param propertyValue
15
- * @param values
16
16
  */
17
- export declare function resolveProperty<T extends CMSType = CMSType, M extends Record<string, any> = any>({ propertyOrBuilder, propertyValue, fromBuilder, ...props }: {
17
+ export declare function resolveProperty<T extends CMSType = CMSType, M extends Record<string, any> = any>({ propertyOrBuilder, fromBuilder, ignoreMissingFields, ...props }: {
18
18
  propertyKey?: string;
19
19
  propertyOrBuilder: PropertyOrBuilder<T, M> | ResolvedProperty<T>;
20
- propertyValue?: unknown;
21
20
  values?: Partial<M>;
22
21
  previousValues?: Partial<M>;
23
22
  path?: string;
24
23
  entityId?: string;
25
24
  index?: number;
26
25
  fromBuilder?: boolean;
27
- fields?: Record<string, PropertyConfig<any>>;
26
+ propertyConfigs?: Record<string, PropertyConfig<any>>;
27
+ ignoreMissingFields?: boolean;
28
28
  }): ResolvedProperty<T> | null;
29
- export declare function resolveArrayProperty<T extends any[], M>({ propertyKey, property, propertyValue, ...props }: {
29
+ export declare function getArrayResolvedProperties<M>({ propertyKey, propertyValue, property, ...props }: {
30
+ propertyValue: any;
31
+ propertyKey?: string;
32
+ property: ArrayProperty<any> | ResolvedArrayProperty<any>;
33
+ ignoreMissingFields: boolean;
34
+ values?: Partial<M>;
35
+ previousValues?: Partial<M>;
36
+ path?: string;
37
+ entityId?: string;
38
+ index?: number;
39
+ fromBuilder?: boolean;
40
+ propertyConfigs?: Record<string, PropertyConfig>;
41
+ }): ResolvedProperty[];
42
+ export declare function resolveArrayProperty<T extends any[], M>({ propertyKey, property, ignoreMissingFields, ...props }: {
30
43
  propertyKey?: string;
31
44
  property: ArrayProperty<T> | ResolvedArrayProperty<T>;
32
- propertyValue: any;
33
45
  values?: Partial<M>;
34
46
  previousValues?: Partial<M>;
35
47
  path?: string;
36
48
  entityId?: string;
37
49
  index?: number;
38
50
  fromBuilder?: boolean;
39
- fields?: Record<string, PropertyConfig>;
51
+ propertyConfigs?: Record<string, PropertyConfig>;
52
+ ignoreMissingFields?: boolean;
40
53
  }): ResolvedArrayProperty;
41
54
  /**
42
55
  * Resolve enums and arrays for properties
43
56
  * @param properties
44
57
  * @param value
45
58
  */
46
- export declare function resolveProperties<M extends Record<string, any>>({ properties, propertyValue, ...props }: {
59
+ export declare function resolveProperties<M extends Record<string, any>>({ propertyKey, properties, ignoreMissingFields, ...props }: {
60
+ propertyKey?: string;
47
61
  properties: PropertiesOrBuilders<M>;
48
- propertyValue: unknown;
49
62
  values?: Partial<M>;
50
63
  previousValues?: Partial<M>;
51
64
  path?: string;
52
65
  entityId?: string;
53
66
  index?: number;
54
67
  fromBuilder?: boolean;
55
- fields?: Record<string, PropertyConfig>;
68
+ propertyConfigs?: Record<string, PropertyConfig>;
69
+ ignoreMissingFields?: boolean;
56
70
  }): ResolvedProperties<M>;
57
71
  /**
58
72
  * Resolve enum aliases for a string or number property
@@ -1,3 +1,24 @@
1
1
  import { EntityValues, ResolvedArrayProperty, ResolvedStringProperty, StorageConfig, UploadedFileContext } from "../types";
2
- export declare function resolveFilenameString<M extends object>(input: string | ((context: UploadedFileContext) => Promise<string> | string), storage: StorageConfig, values: EntityValues<M>, entityId: string, path: string, property: ResolvedStringProperty | ResolvedArrayProperty<string[]>, file: File, propertyKey: string): Promise<string>;
3
- export declare function resolveStoragePathString<M extends object>(input: string | ((context: UploadedFileContext) => string), storage: StorageConfig, values: EntityValues<M>, entityId: string, path: string, property: ResolvedStringProperty | ResolvedArrayProperty<string[]>, file: File, propertyKey: string): string;
2
+ interface ResolveFilenameStringParams<M extends object> {
3
+ input: string | ((context: UploadedFileContext) => (Promise<string> | string));
4
+ storage: StorageConfig;
5
+ values: EntityValues<M>;
6
+ entityId: string;
7
+ path?: string;
8
+ property: ResolvedStringProperty | ResolvedArrayProperty<string[]>;
9
+ file: File;
10
+ propertyKey: string;
11
+ }
12
+ export declare function resolveStorageFilenameString<M extends object>({ input, storage, values, entityId, path, property, file, propertyKey }: ResolveFilenameStringParams<M>): Promise<string>;
13
+ interface ResolveStoragePathStringParams<M extends object> {
14
+ input: string | ((context: UploadedFileContext) => string);
15
+ storage: StorageConfig;
16
+ values: EntityValues<M>;
17
+ entityId: string;
18
+ path?: string;
19
+ property: ResolvedStringProperty | ResolvedArrayProperty<string[]>;
20
+ file: File;
21
+ propertyKey: string;
22
+ }
23
+ export declare function resolveStoragePathString<M extends object>({ input, storage, values, entityId, path, property, file, propertyKey }: ResolveStoragePathStringParams<M>): string;
24
+ export {};
@@ -1,4 +1,4 @@
1
- import { EntityValues, ResolvedArrayProperty, ResolvedStringProperty, StorageConfig, StorageSource } from "../types";
1
+ import { ArrayProperty, EntityValues, ResolvedArrayProperty, ResolvedStringProperty, StorageConfig, StorageSource, StringProperty } from "../types";
2
2
  import { PreviewSize } from "../preview";
3
3
  /**
4
4
  * Internal representation of an item in the storage
@@ -18,9 +18,9 @@ export declare function useStorageUploadController<M extends object>({ entityId,
18
18
  entityId: string;
19
19
  entityValues: EntityValues<M>;
20
20
  value: string | string[] | null;
21
- path: string;
21
+ path?: string;
22
22
  propertyKey: string;
23
- property: ResolvedStringProperty | ResolvedArrayProperty<string[]>;
23
+ property: StringProperty | ArrayProperty<string[]> | ResolvedStringProperty | ResolvedArrayProperty<string[]>;
24
24
  storageSource: StorageSource;
25
25
  disabled: boolean;
26
26
  onChange: (value: string | string[] | null) => void;
package/package.json CHANGED
@@ -1,14 +1,18 @@
1
1
  {
2
2
  "name": "@firecms/core",
3
3
  "type": "module",
4
- "version": "3.0.0-canary.16",
4
+ "version": "3.0.0-canary.160",
5
5
  "description": "Awesome Firebase/Firestore-based headless open-source CMS",
6
6
  "funding": {
7
7
  "url": "https://github.com/sponsors/firecmsco"
8
8
  },
9
9
  "author": "FireCMS",
10
10
  "license": "MIT",
11
- "repository": "git@github.com:FireCMSco/firecms.git",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/firecmsco/firecms.git",
14
+ "directory": "packages/firecms_core"
15
+ },
12
16
  "main": "./dist/index.umd.js",
13
17
  "module": "./dist/index.es.js",
14
18
  "types": "./dist/index.d.ts",
@@ -46,77 +50,88 @@
46
50
  "./package.json": "./package.json"
47
51
  },
48
52
  "dependencies": {
49
- "@firecms/formex": "^3.0.0-canary.16",
50
- "@firecms/ui": "^3.0.0-canary.16",
51
- "@fontsource/ibm-plex-mono": "^5.0.12",
52
- "@fontsource/roboto": "^5.0.12",
53
- "@hello-pangea/dnd": "^16.5.0",
53
+ "@firecms/editor": "^3.0.0-canary.160",
54
+ "@firecms/formex": "^3.0.0-canary.160",
55
+ "@firecms/ui": "^3.0.0-canary.159",
56
+ "@hello-pangea/dnd": "^17.0.0",
57
+ "@radix-ui/react-portal": "^1.1.2",
58
+ "clsx": "^2.1.1",
54
59
  "date-fns": "^3.6.0",
60
+ "fuse.js": "^7.0.0",
55
61
  "history": "^5.3.0",
56
- "js-search": "^2.0.1",
57
62
  "markdown-it": "^14.1.0",
58
63
  "notistack": "^3.0.1",
59
64
  "object-hash": "^3.0.0",
65
+ "react-dropzone": "^14.3.5",
66
+ "react-fast-compare": "^3.2.2",
60
67
  "react-image-file-resizer": "^0.4.8",
61
- "react-markdown-editor-lite": "^1.3.4",
62
68
  "react-transition-group": "^4.4.5",
63
69
  "react-use-measure": "^2.1.1",
64
70
  "react-window": "^1.8.10",
65
- "typeface-rubik": "^1.1.13",
66
71
  "yup": "^0.32.11"
67
72
  },
68
73
  "peerDependencies": {
69
74
  "firebase": "^10.5.2",
70
- "react": "^18.2.0",
71
- "react-dom": "^18.2.0",
72
- "react-router": "^6.22.0",
73
- "react-router-dom": "^6.22.0"
74
- },
75
- "eslintConfig": {
76
- "extends": [
77
- "react-app",
78
- "react-app/jest"
79
- ]
75
+ "react": "^18.3.1",
76
+ "react-dom": "^18.3.1",
77
+ "react-router": "^6.28.0",
78
+ "react-router-dom": "^6.28.0"
80
79
  },
81
80
  "devDependencies": {
82
81
  "@jest/globals": "^29.7.0",
83
- "@testing-library/jest-dom": "^6.4.2",
84
- "@testing-library/react": "^14.2.1",
82
+ "@testing-library/react": "^16.0.1",
85
83
  "@testing-library/user-event": "^14.5.2",
86
- "@types/jest": "^29.5.12",
87
- "@types/node": "^20.11.30",
84
+ "@types/jest": "^29.5.14",
85
+ "@types/node": "^20.17.9",
88
86
  "@types/object-hash": "^3.0.6",
89
- "@types/react": "^18.2.67",
90
- "@types/react-dom": "^18.2.22",
87
+ "@types/react": "^18.3.11",
88
+ "@types/react-dom": "^18.3.1",
91
89
  "@types/react-measure": "^2.0.12",
92
- "@typescript-eslint/eslint-plugin": "^7.3.1",
93
- "@typescript-eslint/parser": "^7.3.1",
94
- "@vitejs/plugin-react": "^4.2.1",
90
+ "@vitejs/plugin-react": "^4.3.4",
91
+ "babel-plugin-react-compiler": "beta",
95
92
  "cross-env": "^7.0.3",
96
- "eslint": "^8.57.0",
97
- "eslint-config-standard": "^17.1.0",
98
- "eslint-plugin-import": "^2.29.1",
99
- "eslint-plugin-n": "^16.6.2",
100
- "eslint-plugin-promise": "^6.1.1",
101
- "eslint-plugin-react": "^7.34.1",
102
- "eslint-plugin-react-hooks": "^4.6.0",
103
- "firebase": "^10.9.0",
93
+ "eslint-plugin-react-compiler": "beta",
94
+ "firebase": "^10.14.1",
104
95
  "jest": "^29.7.0",
105
96
  "npm-run-all": "^4.1.5",
106
- "react-router": "^6.22.0",
107
- "react-router-dom": "^6.22.0",
108
- "ts-jest": "^29.1.2",
97
+ "react-router": "^6.28.0",
98
+ "react-router-dom": "^6.28.0",
99
+ "ts-jest": "^29.2.5",
109
100
  "ts-node": "^10.9.2",
110
- "tsd": "^0.30.7",
111
- "typescript": "^5.4.2",
112
- "vite": "^5.2.3"
101
+ "tsd": "^0.31.2",
102
+ "typescript": "^5.7.2",
103
+ "vite": "^5.4.11"
113
104
  },
114
105
  "files": [
115
106
  "dist",
116
107
  "src"
117
108
  ],
118
- "gitHead": "6c7d1dd64fa4b9f31433ab6dd938835589e8a25a",
109
+ "gitHead": "840f2733672a90a6a56aed89259eaa5365589512",
119
110
  "publishConfig": {
120
111
  "access": "public"
112
+ },
113
+ "eslintConfig": {
114
+ "extends": [
115
+ "react-app",
116
+ "react-app/jest"
117
+ ]
118
+ },
119
+ "jest": {
120
+ "transform": {
121
+ "^.+\\.tsx?$": "ts-jest"
122
+ },
123
+ "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$",
124
+ "moduleFileExtensions": [
125
+ "ts",
126
+ "tsx",
127
+ "js",
128
+ "jsx",
129
+ "json",
130
+ "node"
131
+ ],
132
+ "testEnvironment": "node",
133
+ "moduleNameMapper": {
134
+ "\\.(css|less)$": "<rootDir>/test/__mocks__/styleMock.js"
135
+ }
121
136
  }
122
137
  }
@@ -0,0 +1,18 @@
1
+ import { DefaultAppBar, DefaultAppBarProps } from "../core/DefaultAppBar";
2
+
3
+ /**
4
+ * This component renders the main app bar of FireCMS.
5
+ */
6
+ export function AppBar({
7
+ children,
8
+ ...props
9
+ }: {
10
+ children?: React.ReactNode,
11
+ className?: string,
12
+ style?: React.CSSProperties
13
+ } & DefaultAppBarProps) {
14
+ const usedChildren = children ?? <DefaultAppBar {...props}/>;
15
+ return <>{usedChildren}</>;
16
+ }
17
+
18
+ AppBar.componentType = "AppBar";
@@ -0,0 +1,24 @@
1
+ import { DefaultDrawer } from "../core";
2
+
3
+ /**
4
+ * This component is in charge of rendering the drawer.
5
+ * If you add this component under your {@link Scaffold}, it will be rendered
6
+ * as a drawer, and the open and close functionality will be handled automatically.
7
+ * If you want to customise the drawer, you can create your own component and pass it as a child.
8
+ * For custom drawers, you can use the {@link useApp} to open and close the drawer.
9
+ *
10
+ */
11
+ export function Drawer({
12
+ children,
13
+ className,
14
+ style
15
+ }: {
16
+ children?: React.ReactNode,
17
+ className?: string,
18
+ style?: React.CSSProperties
19
+ }) {
20
+ const usedChildren = children ?? <DefaultDrawer className={className} style={style}/>;
21
+ return <>{usedChildren}</>;
22
+ }
23
+
24
+ Drawer.componentType = "Drawer";
@@ -0,0 +1,243 @@
1
+ import React, { PropsWithChildren, useCallback } from "react";
2
+ import { ChevronLeftIcon, cls, defaultBorderMixin, IconButton, MenuIcon, Sheet, Tooltip } from "@firecms/ui";
3
+ import equal from "react-fast-compare"
4
+ import { useLargeLayout } from "../hooks";
5
+ import { ErrorBoundary } from "../components";
6
+ import { AppContext } from "./useApp";
7
+
8
+ export const DRAWER_WIDTH = 280;
9
+
10
+ /**
11
+ * @group Core
12
+ */
13
+ export interface ScaffoldProps {
14
+
15
+ /**
16
+ * Open the drawer on hover
17
+ */
18
+ autoOpenDrawer?: boolean;
19
+
20
+ /**
21
+ * Logo to be displayed in the top bar and drawer.
22
+ * Note that this has no effect if you are using a custom AppBar or Drawer.
23
+ */
24
+ logo?: string;
25
+
26
+ className?: string;
27
+
28
+ style?: React.CSSProperties;
29
+ }
30
+
31
+ /**
32
+ * This view acts as a scaffold for FireCMS.
33
+ *
34
+ * It is in charge of displaying the navigation drawer, top bar and main
35
+ * collection views.
36
+ * This component needs a parent {@link FireCMS}
37
+ *
38
+ * @param props
39
+
40
+ * @group Core
41
+ */
42
+ export const Scaffold = React.memo<PropsWithChildren<ScaffoldProps>>(
43
+ function Scaffold(props: PropsWithChildren<ScaffoldProps>) {
44
+
45
+ const {
46
+ children,
47
+ autoOpenDrawer,
48
+ logo,
49
+ className,
50
+ style
51
+ } = props;
52
+
53
+ const drawerChildren = React.Children.toArray(children).filter((child: any) => child.type.componentType === "Drawer");
54
+ if (drawerChildren.length > 1) {
55
+ throw Error("Only one Drawer component is allowed in Scaffold");
56
+ }
57
+ const appBarChildren = React.Children.toArray(children).filter((child: any) => child.type.componentType === "AppBar");
58
+ if (appBarChildren.length > 1) {
59
+ throw Error("Only one AppBar component is allowed in Scaffold");
60
+ }
61
+ const otherChildren = React.Children.toArray(children)
62
+ .filter((child: any) => child.type.componentType !== "Drawer" && child.type.componentType !== "AppBar");
63
+ const includeDrawer = drawerChildren.length > 0;
64
+ const largeLayout = useLargeLayout();
65
+
66
+ const [drawerOpen, setDrawerOpen] = React.useState(false);
67
+ const [onHover, setOnHover] = React.useState(false);
68
+
69
+ const setOnHoverTrue = useCallback(() => setOnHover(true), []);
70
+ const setOnHoverFalse = useCallback(() => setOnHover(false), []);
71
+
72
+ const handleDrawerOpen = useCallback(() => {
73
+ setDrawerOpen(true);
74
+ }, []);
75
+
76
+ const handleDrawerClose = useCallback(() => {
77
+ setDrawerOpen(false);
78
+ }, []);
79
+
80
+ const computedDrawerOpen: boolean = drawerOpen || Boolean(largeLayout && autoOpenDrawer && onHover);
81
+
82
+ const hasAppBar = Boolean(appBarChildren.length > 0);
83
+ return (
84
+ <AppContext.Provider value={{
85
+ logo,
86
+ hasDrawer: includeDrawer,
87
+ drawerHovered: onHover,
88
+ drawerOpen: computedDrawerOpen,
89
+ closeDrawer: handleDrawerClose,
90
+ openDrawer: handleDrawerOpen,
91
+ autoOpenDrawer
92
+ }}>
93
+ <div
94
+ className={cls("flex h-screen w-screen bg-surface-50 dark:bg-surface-900 text-surface-900 dark:text-white overflow-hidden", className)}
95
+ style={{
96
+ paddingTop: "env(safe-area-inset-top)",
97
+ paddingLeft: "env(safe-area-inset-left)",
98
+ paddingRight: "env(safe-area-inset-right)",
99
+ paddingBottom: "env(safe-area-inset-bottom)",
100
+ height: "100dvh",
101
+ ...style
102
+ }}>
103
+
104
+ {appBarChildren}
105
+
106
+ <DrawerWrapper
107
+ displayed={includeDrawer}
108
+ onMouseEnter={setOnHoverTrue}
109
+ onMouseMove={setOnHoverTrue}
110
+ onMouseLeave={setOnHoverFalse}
111
+ open={computedDrawerOpen}
112
+ hovered={onHover}
113
+ setDrawerOpen={setDrawerOpen}>
114
+ {includeDrawer && drawerChildren}
115
+ </DrawerWrapper>
116
+
117
+ <main
118
+ className="flex flex-col flex-grow overflow-auto">
119
+ {hasAppBar && <DrawerHeader/>}
120
+ <div
121
+ className={cls(defaultBorderMixin, "flex-grow overflow-auto lg:m-0 lg:mx-4 lg:mb-4 lg:rounded-lg lg:border lg:border-solid m-0 mt-1", {
122
+ "lg:mt-4": !hasAppBar
123
+ })}>
124
+
125
+ <ErrorBoundary>
126
+ {otherChildren}
127
+ </ErrorBoundary>
128
+
129
+ </div>
130
+ </main>
131
+ </div>
132
+ </AppContext.Provider>
133
+ );
134
+ },
135
+ equal
136
+ )
137
+
138
+ const DrawerHeader = () => {
139
+ return (
140
+ <div className="flex flex-col min-h-16"></div>
141
+ );
142
+ };
143
+
144
+ function DrawerWrapper(props: {
145
+ children: React.ReactNode,
146
+ displayed: boolean,
147
+ open: boolean,
148
+ logo?: string,
149
+ hovered: boolean,
150
+ setDrawerOpen: (open: boolean) => void,
151
+ onMouseEnter: () => void,
152
+ onMouseMove: () => void,
153
+ onMouseLeave: () => void
154
+ }) {
155
+
156
+ const width = !props.displayed ? 0 : (props.open ? DRAWER_WIDTH : 72);
157
+ const innerDrawer = <div
158
+ className={"relative h-full no-scrollbar overflow-y-auto overflow-x-hidden"}
159
+ style={{
160
+ width,
161
+ transition: "left 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, opacity 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, width 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms"
162
+ }}
163
+ >
164
+
165
+ {!props.open && props.displayed && (
166
+ <Tooltip title="Open menu"
167
+ side="right"
168
+ sideOffset={12}
169
+ asChild={true}>
170
+ <div
171
+ className="ml-2 fixed top-1 left-2 sm:top-2 sm:left-2 !bg-surface-50 dark:!bg-surface-900 rounded-full w-fit z-20">
172
+ <IconButton
173
+ color="inherit"
174
+ aria-label="Open menu"
175
+ onClick={() => props.setDrawerOpen(true)}
176
+ size="large"
177
+ >
178
+ <MenuIcon/>
179
+ </IconButton>
180
+ </div>
181
+ </Tooltip>
182
+ )}
183
+
184
+ <div
185
+ className={`z-20 absolute right-0 top-4 ${
186
+ props.open ? "opacity-100" : "opacity-0 invisible"
187
+ } transition-opacity duration-200 ease-in-out`}>
188
+ <IconButton
189
+ aria-label="Close drawer"
190
+ onClick={() => props.setDrawerOpen(false)}
191
+ >
192
+ <ChevronLeftIcon/>
193
+ </IconButton>
194
+ </div>
195
+
196
+ <div className={"flex flex-col h-full"}>
197
+ {props.children}
198
+ </div>
199
+
200
+ </div>;
201
+
202
+ const largeLayout = useLargeLayout();
203
+ if (!largeLayout) {
204
+ if (!props.displayed)
205
+ return null;
206
+ return <>
207
+ <IconButton
208
+ color="inherit"
209
+ aria-label="Open drawer"
210
+ onClick={() => props.setDrawerOpen(true)}
211
+ size="large"
212
+ className="absolute sm:top-2 sm:left-4 top-1 left-2"
213
+ >
214
+ <MenuIcon/>
215
+ </IconButton>
216
+ <Sheet side={"left"}
217
+ transparent={true}
218
+ open={props.open}
219
+ onOpenChange={props.setDrawerOpen}
220
+ title={"Navigation drawer"}
221
+ overlayClassName={"bg-white bg-opacity-80"}
222
+ >
223
+ {innerDrawer}
224
+ </Sheet>
225
+ </>;
226
+ }
227
+
228
+ return (
229
+ <div
230
+ className="z-20 relative"
231
+ onMouseEnter={props.onMouseEnter}
232
+ onMouseMove={props.onMouseMove}
233
+ onMouseLeave={props.onMouseLeave}
234
+ style={{
235
+ width,
236
+ transition: "left 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, opacity 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, width 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms"
237
+ }}>
238
+
239
+ {innerDrawer}
240
+
241
+ </div>
242
+ );
243
+ }
@@ -0,0 +1,4 @@
1
+ export * from "./Drawer";
2
+ export * from "./AppBar";
3
+ export * from "./Scaffold";
4
+ export * from "./useApp";