@rebasepro/cms 0.17.3 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (449) hide show
  1. package/README.md +4 -0
  2. package/dist/{CollectionEditorDialog-B-akreOU.js → CollectionEditorDialog-BeX4b92r.js} +13 -7
  3. package/dist/{CollectionEditorDialog-B-akreOU.js.map → CollectionEditorDialog-BeX4b92r.js.map} +1 -1
  4. package/dist/{PropertyEditView-CiY84wkR.js → PropertyEditView-C7thfj4L.js} +3 -3
  5. package/dist/{PropertyEditView-CiY84wkR.js.map → PropertyEditView-C7thfj4L.js.map} +1 -1
  6. package/dist/{RouterCollectionsStudioView-DkAWda4N.js → RouterCollectionsStudioView-BtjzvB6E.js} +4 -4
  7. package/dist/{RouterCollectionsStudioView-DkAWda4N.js.map → RouterCollectionsStudioView-BtjzvB6E.js.map} +1 -1
  8. package/dist/{SchemaChangeDialog-DceT8QFX.js → SchemaChangeDialog-CkqK6KOC.js} +4 -2
  9. package/dist/{SchemaChangeDialog-DceT8QFX.js.map → SchemaChangeDialog-CkqK6KOC.js.map} +1 -1
  10. package/dist/collection_editor/api/generateCollectionApi.d.ts +1 -2
  11. package/dist/collection_editor_ui.d.ts +2 -0
  12. package/dist/collection_editor_ui.js +6 -5
  13. package/dist/collection_editor_ui.js.map +1 -1
  14. package/dist/components/DeleteEntityDialog.d.ts +2 -3
  15. package/dist/components/RebaseLayout.d.ts +11 -4
  16. package/dist/components/field_configs.d.ts +1 -1
  17. package/dist/editor/sanitize-html.d.ts +15 -0
  18. package/dist/editor.js +195 -10
  19. package/dist/editor.js.map +1 -1
  20. package/dist/{export-Ben8E355.js → export--arni_VY.js} +2 -2
  21. package/dist/{export-Ben8E355.js.map → export--arni_VY.js.map} +1 -1
  22. package/dist/form/components/LabelWithIcon.d.ts +10 -0
  23. package/dist/{history-DIEVd26f.js → history-C2TpoQwi.js} +2 -2
  24. package/dist/{history-DIEVd26f.js.map → history-C2TpoQwi.js.map} +1 -1
  25. package/dist/hooks/navigation/useBuildNavigationStateController.d.ts +1 -1
  26. package/dist/hooks/navigation/useResolvedViews.d.ts +1 -1
  27. package/dist/hooks/navigation/useTopLevelNavigation.d.ts +1 -1
  28. package/dist/{import-D25x7ko-.js → import-DTkXNoBg.js} +2 -2
  29. package/dist/{import-D25x7ko-.js.map → import-DTkXNoBg.js.map} +1 -1
  30. package/dist/index.js +78 -33
  31. package/dist/index.js.map +1 -1
  32. package/dist/util/propertyConfigMapper.d.ts +1 -1
  33. package/dist/util-CfLFggP7.js +57 -0
  34. package/dist/util-CfLFggP7.js.map +1 -0
  35. package/dist/{util-DVqnqlLn.js → util-DE1WQW6h.js} +134 -112
  36. package/dist/util-DE1WQW6h.js.map +1 -0
  37. package/package.json +42 -34
  38. package/dist/util-DVqnqlLn.js.map +0 -1
  39. package/src/collection_editor/CollectionEditorDialogsContext.tsx +0 -25
  40. package/src/collection_editor/ConfigControllerProvider.tsx +0 -395
  41. package/src/collection_editor/_cms_internals.ts +0 -41
  42. package/src/collection_editor/api/generateCollectionApi.ts +0 -126
  43. package/src/collection_editor/api/index.ts +0 -1
  44. package/src/collection_editor/extensibility_types.ts +0 -168
  45. package/src/collection_editor/index.ts +0 -108
  46. package/src/collection_editor/liveSchemaClient.ts +0 -285
  47. package/src/collection_editor/relation_kinds.ts +0 -44
  48. package/src/collection_editor/serializable_types.ts +0 -535
  49. package/src/collection_editor/serializable_utils.ts +0 -729
  50. package/src/collection_editor/types/collection_editor_controller.tsx +0 -62
  51. package/src/collection_editor/types/collection_inference.ts +0 -18
  52. package/src/collection_editor/types/config_controller.tsx +0 -121
  53. package/src/collection_editor/ui/AddKanbanColumnAction.tsx +0 -199
  54. package/src/collection_editor/ui/CollectionViewHeaderAction.tsx +0 -51
  55. package/src/collection_editor/ui/EditorCollectionAction.tsx +0 -54
  56. package/src/collection_editor/ui/EditorCollectionActionStart.tsx +0 -90
  57. package/src/collection_editor/ui/EditorEntityAction.tsx +0 -50
  58. package/src/collection_editor/ui/HomePageEditorCollectionAction.tsx +0 -114
  59. package/src/collection_editor/ui/KanbanSetupAction.tsx +0 -43
  60. package/src/collection_editor/ui/MissingReferenceWidget.tsx +0 -35
  61. package/src/collection_editor/ui/NewCollectionButton.tsx +0 -27
  62. package/src/collection_editor/ui/NewCollectionCard.tsx +0 -48
  63. package/src/collection_editor/ui/PropertyAddColumnComponent.tsx +0 -49
  64. package/src/collection_editor/ui/collection_editor/AICollectionGeneratorPopover.tsx +0 -260
  65. package/src/collection_editor/ui/collection_editor/AIModifiedPathsContext.tsx +0 -90
  66. package/src/collection_editor/ui/collection_editor/CollectionDetailsForm.tsx +0 -388
  67. package/src/collection_editor/ui/collection_editor/CollectionEditorDialog.tsx +0 -1098
  68. package/src/collection_editor/ui/collection_editor/CollectionEditorWelcomeView.tsx +0 -301
  69. package/src/collection_editor/ui/collection_editor/CollectionJsonImportDialog.tsx +0 -172
  70. package/src/collection_editor/ui/collection_editor/CollectionPropertiesEditorForm.tsx +0 -620
  71. package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +0 -530
  72. package/src/collection_editor/ui/collection_editor/CollectionRelationsTab.tsx +0 -462
  73. package/src/collection_editor/ui/collection_editor/CollectionStudioView.tsx +0 -104
  74. package/src/collection_editor/ui/collection_editor/CollectionYupValidation.tsx +0 -9
  75. package/src/collection_editor/ui/collection_editor/CollectionsStudioView.tsx +0 -199
  76. package/src/collection_editor/ui/collection_editor/DisplaySettingsForm.tsx +0 -315
  77. package/src/collection_editor/ui/collection_editor/EntityActionsEditTab.tsx +0 -164
  78. package/src/collection_editor/ui/collection_editor/EntityActionsSelectDialog.tsx +0 -40
  79. package/src/collection_editor/ui/collection_editor/EntityCustomViewsSelectDialog.tsx +0 -39
  80. package/src/collection_editor/ui/collection_editor/EnumForm.tsx +0 -373
  81. package/src/collection_editor/ui/collection_editor/GeneralSettingsForm.tsx +0 -288
  82. package/src/collection_editor/ui/collection_editor/GetCodeDialog.tsx +0 -141
  83. package/src/collection_editor/ui/collection_editor/KanbanConfigSection.tsx +0 -194
  84. package/src/collection_editor/ui/collection_editor/LayoutModeSwitch.tsx +0 -53
  85. package/src/collection_editor/ui/collection_editor/PropertyEditView.tsx +0 -980
  86. package/src/collection_editor/ui/collection_editor/PropertyFieldPreview.tsx +0 -164
  87. package/src/collection_editor/ui/collection_editor/PropertyTree.tsx +0 -364
  88. package/src/collection_editor/ui/collection_editor/RouterCollectionStudioView.tsx +0 -44
  89. package/src/collection_editor/ui/collection_editor/RouterCollectionsStudioView.tsx +0 -41
  90. package/src/collection_editor/ui/collection_editor/SchemaChangeDialog.tsx +0 -470
  91. package/src/collection_editor/ui/collection_editor/SubcollectionsEditTab.tsx +0 -256
  92. package/src/collection_editor/ui/collection_editor/SwitchControl.tsx +0 -39
  93. package/src/collection_editor/ui/collection_editor/ViewModeSwitch.tsx +0 -68
  94. package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportDataPreview.tsx +0 -67
  95. package/src/collection_editor/ui/collection_editor/import/CollectionEditorImportMapping.tsx +0 -296
  96. package/src/collection_editor/ui/collection_editor/import/clean_import_data.ts +0 -57
  97. package/src/collection_editor/ui/collection_editor/properties/BlockPropertyField.tsx +0 -147
  98. package/src/collection_editor/ui/collection_editor/properties/BooleanPropertyField.tsx +0 -41
  99. package/src/collection_editor/ui/collection_editor/properties/CommonPropertyFields.tsx +0 -113
  100. package/src/collection_editor/ui/collection_editor/properties/DateTimePropertyField.tsx +0 -250
  101. package/src/collection_editor/ui/collection_editor/properties/EnumPropertyField.tsx +0 -126
  102. package/src/collection_editor/ui/collection_editor/properties/KeyValuePropertyField.tsx +0 -20
  103. package/src/collection_editor/ui/collection_editor/properties/MapPropertyField.tsx +0 -153
  104. package/src/collection_editor/ui/collection_editor/properties/MarkdownPropertyField.tsx +0 -217
  105. package/src/collection_editor/ui/collection_editor/properties/NumberPropertyField.tsx +0 -117
  106. package/src/collection_editor/ui/collection_editor/properties/ReferencePropertyField.tsx +0 -129
  107. package/src/collection_editor/ui/collection_editor/properties/RelationPropertyField.tsx +0 -335
  108. package/src/collection_editor/ui/collection_editor/properties/RepeatPropertyField.tsx +0 -107
  109. package/src/collection_editor/ui/collection_editor/properties/StoragePropertyField.tsx +0 -403
  110. package/src/collection_editor/ui/collection_editor/properties/StringPropertyField.tsx +0 -148
  111. package/src/collection_editor/ui/collection_editor/properties/UrlPropertyField.tsx +0 -91
  112. package/src/collection_editor/ui/collection_editor/properties/VectorPropertyField.tsx +0 -34
  113. package/src/collection_editor/ui/collection_editor/properties/advanced/AdvancedPropertyValidation.tsx +0 -49
  114. package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsEditor.tsx +0 -925
  115. package/src/collection_editor/ui/collection_editor/properties/conditions/ConditionsPanel.tsx +0 -28
  116. package/src/collection_editor/ui/collection_editor/properties/conditions/EnumConditionsEditor.tsx +0 -626
  117. package/src/collection_editor/ui/collection_editor/properties/conditions/index.ts +0 -6
  118. package/src/collection_editor/ui/collection_editor/properties/conditions/property_paths.ts +0 -93
  119. package/src/collection_editor/ui/collection_editor/properties/validation/ArrayPropertyValidation.tsx +0 -52
  120. package/src/collection_editor/ui/collection_editor/properties/validation/GeneralPropertyValidation.tsx +0 -63
  121. package/src/collection_editor/ui/collection_editor/properties/validation/NumberPropertyValidation.tsx +0 -114
  122. package/src/collection_editor/ui/collection_editor/properties/validation/StringPropertyValidation.tsx +0 -154
  123. package/src/collection_editor/ui/collection_editor/properties/validation/ValidationPanel.tsx +0 -28
  124. package/src/collection_editor/ui/collection_editor/templates/blog_template.ts +0 -112
  125. package/src/collection_editor/ui/collection_editor/templates/pages_template.ts +0 -183
  126. package/src/collection_editor/ui/collection_editor/templates/products_template.ts +0 -88
  127. package/src/collection_editor/ui/collection_editor/templates/users_template.ts +0 -42
  128. package/src/collection_editor/ui/collection_editor/util.ts +0 -28
  129. package/src/collection_editor/ui/collection_editor/utils/strings.ts +0 -1
  130. package/src/collection_editor/ui/collection_editor/utils/supported_fields.tsx +0 -39
  131. package/src/collection_editor/ui/collection_editor/utils/update_property_for_widget.ts +0 -276
  132. package/src/collection_editor/useCollectionEditorController.tsx +0 -9
  133. package/src/collection_editor/useCollectionsConfigController.tsx +0 -9
  134. package/src/collection_editor/useJsonCollectionsConfigController.tsx +0 -297
  135. package/src/collection_editor/useLiveSchemaEditing.tsx +0 -315
  136. package/src/collection_editor/useLocalCollectionsConfigController.tsx +0 -341
  137. package/src/collection_editor/useSafeSnackbarController.ts +0 -9
  138. package/src/collection_editor/validateCollectionJson.ts +0 -440
  139. package/src/collection_editor_ui.ts +0 -21
  140. package/src/components/AdditionalFieldValue.tsx +0 -68
  141. package/src/components/AdminModeSyncer.tsx +0 -56
  142. package/src/components/ArrayContainer.tsx +0 -542
  143. package/src/components/ClearFilterSortButton.tsx +0 -56
  144. package/src/components/CollectionEditorDialogs.tsx +0 -69
  145. package/src/components/CollectionPanel.tsx +0 -179
  146. package/src/components/CollectionTableBinding/CollectionRowActions.tsx +0 -244
  147. package/src/components/CollectionTableBinding/CollectionTableBinding.tsx +0 -394
  148. package/src/components/CollectionTableBinding/CollectionTableBindingProps.tsx +0 -172
  149. package/src/components/CollectionTableBinding/PropertyTableCell.tsx +0 -350
  150. package/src/components/CollectionTableBinding/column_utils.tsx +0 -155
  151. package/src/components/CollectionTableBinding/fields/TableMultipleRelationField.tsx +0 -131
  152. package/src/components/CollectionTableBinding/fields/TableReferenceField.tsx +0 -193
  153. package/src/components/CollectionTableBinding/fields/TableRelationField.tsx +0 -192
  154. package/src/components/CollectionTableBinding/fields/TableRelationSelectorField.tsx +0 -42
  155. package/src/components/CollectionTableBinding/fields/TableStorageUpload.tsx +0 -324
  156. package/src/components/CollectionTableBinding/fields/VirtualTableSelect.tsx +0 -132
  157. package/src/components/CollectionTableBinding/fields/VirtualTableUserSelect.tsx +0 -41
  158. package/src/components/CollectionTableBinding/index.tsx +0 -14
  159. package/src/components/CollectionTableBinding/internal/CollectionTableToolbar.tsx +0 -96
  160. package/src/components/CollectionTableBinding/internal/EntityTableCell.tsx +0 -309
  161. package/src/components/CollectionTableBinding/internal/EntityTableCellActions.tsx +0 -80
  162. package/src/components/CollectionTableBinding/internal/common.tsx +0 -74
  163. package/src/components/CollectionTableBinding/internal/popup_field/PopupFormField.tsx +0 -422
  164. package/src/components/CollectionTableBinding/internal/popup_field/useDraggable.tsx +0 -99
  165. package/src/components/CollectionTableBinding/internal/popup_field/useWindowSize.tsx +0 -22
  166. package/src/components/CollectionTableBinding/table_bindings.tsx +0 -350
  167. package/src/components/CollectionViewBinding/BoardCardBinding.tsx +0 -263
  168. package/src/components/CollectionViewBinding/CollectionBoardViewBinding.tsx +0 -662
  169. package/src/components/CollectionViewBinding/CollectionCardViewBinding.tsx +0 -159
  170. package/src/components/CollectionViewBinding/CollectionListViewBinding.tsx +0 -1430
  171. package/src/components/CollectionViewBinding/CollectionViewActions.tsx +0 -227
  172. package/src/components/CollectionViewBinding/CollectionViewBinding.tsx +0 -1603
  173. package/src/components/CollectionViewBinding/CollectionViewStartActions.tsx +0 -240
  174. package/src/components/CollectionViewBinding/EntityCardBinding.tsx +0 -239
  175. package/src/components/CollectionViewBinding/FilterPresetsButton.tsx +0 -298
  176. package/src/components/CollectionViewBinding/FiltersDialog.tsx +0 -218
  177. package/src/components/CollectionViewBinding/SearchExplanation.tsx +0 -106
  178. package/src/components/CollectionViewBinding/SearchHighlight.tsx +0 -311
  179. package/src/components/CollectionViewBinding/SlotValue.tsx +0 -156
  180. package/src/components/CollectionViewBinding/SortButton.tsx +0 -354
  181. package/src/components/CollectionViewBinding/SplitListCloseButton.tsx +0 -49
  182. package/src/components/CollectionViewBinding/SplitListShowButton.tsx +0 -28
  183. package/src/components/CollectionViewBinding/SplitListView.tsx +0 -488
  184. package/src/components/CollectionViewBinding/SplitViewContext.tsx +0 -34
  185. package/src/components/CollectionViewBinding/ViewModeToggle.tsx +0 -250
  186. package/src/components/CollectionViewBinding/hooks/useCollectionInlineEditor.ts +0 -81
  187. package/src/components/CollectionViewBinding/hooks/useKanbanDragAndDrop.ts +0 -181
  188. package/src/components/CollectionViewBinding/useBoardDataController.tsx +0 -802
  189. package/src/components/CollectionViewBinding/usePreviewSlots.ts +0 -703
  190. package/src/components/CollectionViewBinding/useSelectionController.tsx +0 -40
  191. package/src/components/CollectionViewBinding/utils.ts +0 -22
  192. package/src/components/DefaultAppBar.tsx +0 -264
  193. package/src/components/DefaultDrawer.tsx +0 -593
  194. package/src/components/DeleteEntityDialog.tsx +0 -205
  195. package/src/components/DetailViewBinding.tsx +0 -731
  196. package/src/components/DrawerNavigationGroup.tsx +0 -141
  197. package/src/components/DrawerNavigationItem.tsx +0 -115
  198. package/src/components/EditFormActions.tsx +0 -303
  199. package/src/components/EditViewBinding.tsx +0 -1069
  200. package/src/components/EntityDisplayHeader.tsx +0 -170
  201. package/src/components/EntityIdentityBar.tsx +0 -428
  202. package/src/components/EntityInspector.tsx +0 -156
  203. package/src/components/EntityPreviewBinding.tsx +0 -432
  204. package/src/components/EntityPreviewNesting.tsx +0 -50
  205. package/src/components/EntityViewBinding.tsx +0 -374
  206. package/src/components/FieldCaption.tsx +0 -14
  207. package/src/components/HomePage/ContentHomePage.tsx +0 -586
  208. package/src/components/HomePage/FavouritesView.tsx +0 -60
  209. package/src/components/HomePage/HomePageDnD.tsx +0 -704
  210. package/src/components/HomePage/NavigationCard.tsx +0 -81
  211. package/src/components/HomePage/NavigationCardBinding.tsx +0 -107
  212. package/src/components/HomePage/NavigationGroup.tsx +0 -156
  213. package/src/components/HomePage/RenameGroupDialog.tsx +0 -123
  214. package/src/components/HomePage/SmallNavigationCard.tsx +0 -41
  215. package/src/components/HomePage/index.tsx +0 -5
  216. package/src/components/InlineEntityPreview.tsx +0 -149
  217. package/src/components/JsonPreviewBinding.tsx +0 -66
  218. package/src/components/PropertyCollectionView.tsx +0 -336
  219. package/src/components/PropertyConfigBadge.tsx +0 -28
  220. package/src/components/PropertyIdCopyTooltip.tsx +0 -47
  221. package/src/components/RebaseAuthGate.tsx +0 -44
  222. package/src/components/RebaseCMS.tsx +0 -30
  223. package/src/components/RebaseLayout.tsx +0 -80
  224. package/src/components/RebaseNavigation.tsx +0 -369
  225. package/src/components/RebaseRouteDefs.tsx +0 -127
  226. package/src/components/RebaseShell.tsx +0 -83
  227. package/src/components/ReferenceTable/SelectionTableBinding.tsx +0 -389
  228. package/src/components/ReferenceWidget.tsx +0 -156
  229. package/src/components/RelationSelector.tsx +0 -926
  230. package/src/components/SearchIconsView.tsx +0 -78
  231. package/src/components/SelectableTable/SelectableTable.tsx +0 -309
  232. package/src/components/SelectableTable/SelectableTableContext.tsx +0 -7
  233. package/src/components/SelectableTable/SelectionStore.ts +0 -43
  234. package/src/components/SelectableTable/filters/BooleanFilterField.tsx +0 -59
  235. package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +0 -146
  236. package/src/components/SelectableTable/filters/FilterFieldBinding.tsx +0 -190
  237. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +0 -250
  238. package/src/components/SelectableTable/filters/RelationFilterField.tsx +0 -238
  239. package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +0 -282
  240. package/src/components/SelectableTable/filters/null_filter.ts +0 -63
  241. package/src/components/SideDialogs.tsx +0 -238
  242. package/src/components/SidePanelBinding.tsx +0 -361
  243. package/src/components/SidePanelProvider.tsx +0 -80
  244. package/src/components/UserSelector.tsx +0 -513
  245. package/src/components/admin/CreationResultDialog.tsx +0 -138
  246. package/src/components/admin/index.ts +0 -1
  247. package/src/components/app/AppBar.tsx +0 -17
  248. package/src/components/app/Drawer.tsx +0 -38
  249. package/src/components/app/Scaffold.tsx +0 -366
  250. package/src/components/app/index.ts +0 -4
  251. package/src/components/app/useApp.tsx +0 -36
  252. package/src/components/common/default_entity_actions.tsx +0 -440
  253. package/src/components/common/index.ts +0 -1
  254. package/src/components/field_configs.tsx +0 -506
  255. package/src/components/history/EntityHistoryEntry.tsx +0 -203
  256. package/src/components/history/EntityHistoryView.tsx +0 -206
  257. package/src/components/history/LastEditedByFormAction.tsx +0 -24
  258. package/src/components/history/LastEditedByIndicator.tsx +0 -95
  259. package/src/components/history/UserChip.tsx +0 -15
  260. package/src/components/history/index.tsx +0 -5
  261. package/src/components/index.ts +0 -63
  262. package/src/contexts/BreacrumbsContext.tsx +0 -45
  263. package/src/contexts/SideDialogsControllerContext.tsx +0 -5
  264. package/src/contexts/SidePanelControllerContext.tsx +0 -5
  265. package/src/data_export/export/BasicExportAction.tsx +0 -142
  266. package/src/data_export/export/ExportCollectionAction.tsx +0 -321
  267. package/src/data_export/export/export.ts +0 -295
  268. package/src/data_export/export/fetch_export_data.ts +0 -90
  269. package/src/data_export/export/index.ts +0 -4
  270. package/src/data_export/index.ts +0 -1
  271. package/src/data_import/components/DataNewPropertiesMapping.tsx +0 -261
  272. package/src/data_import/components/ImportFileUpload.tsx +0 -42
  273. package/src/data_import/components/ImportNewPropertyFieldPreview.tsx +0 -58
  274. package/src/data_import/components/ImportSaveInProgress.tsx +0 -121
  275. package/src/data_import/components/index.ts +0 -4
  276. package/src/data_import/hooks/index.ts +0 -1
  277. package/src/data_import/hooks/useImportConfig.tsx +0 -34
  278. package/src/data_import/import/ImportCollectionAction.tsx +0 -461
  279. package/src/data_import/import/index.ts +0 -1
  280. package/src/data_import/index.ts +0 -5
  281. package/src/data_import/types/column_mapping.ts +0 -32
  282. package/src/data_import/types/index.ts +0 -1
  283. package/src/data_import/utils/csv.ts +0 -153
  284. package/src/data_import/utils/data.ts +0 -181
  285. package/src/data_import/utils/file_headers.ts +0 -14
  286. package/src/data_import/utils/file_to_json.ts +0 -149
  287. package/src/data_import/utils/get_import_inference_type.ts +0 -33
  288. package/src/data_import/utils/get_properties_mapping.ts +0 -67
  289. package/src/data_import/utils/index.ts +0 -5
  290. package/src/data_import/utils/save_entities.ts +0 -138
  291. package/src/data_import/utils/transforms.ts +0 -70
  292. package/src/editor/components/SlashCommandMenu.tsx +0 -532
  293. package/src/editor/components/editor-bubble-item.tsx +0 -32
  294. package/src/editor/components/editor-bubble.tsx +0 -143
  295. package/src/editor/components/image-bubble.tsx +0 -183
  296. package/src/editor/components/index.ts +0 -14
  297. package/src/editor/components/table-bubble.tsx +0 -233
  298. package/src/editor/editor.tsx +0 -529
  299. package/src/editor/extensions/HighlightDecorationExtension.ts +0 -115
  300. package/src/editor/extensions/Image.ts +0 -159
  301. package/src/editor/extensions/TextLoadingDecorationExtension.tsx +0 -107
  302. package/src/editor/extensions/clipboard.ts +0 -72
  303. package/src/editor/extensions/custom-keymap.ts +0 -25
  304. package/src/editor/extensions/drag-and-drop.tsx +0 -508
  305. package/src/editor/hooks/useProseMirror.ts +0 -126
  306. package/src/editor/hooks/useProseMirrorContext.ts +0 -15
  307. package/src/editor/index.ts +0 -2
  308. package/src/editor/markdown-it-plugins.d.ts +0 -24
  309. package/src/editor/markdown.ts +0 -204
  310. package/src/editor/nodeViews/ImageComponent.tsx +0 -20
  311. package/src/editor/nodeViews/ReactNodeView.tsx +0 -89
  312. package/src/editor/nodeViews/TaskItemComponent.tsx +0 -30
  313. package/src/editor/nodeViews/index.ts +0 -35
  314. package/src/editor/plugins/index.ts +0 -58
  315. package/src/editor/plugins/inputrules.ts +0 -82
  316. package/src/editor/plugins/placeholderPlugin.ts +0 -55
  317. package/src/editor/plugins/slashCommandPlugin.ts +0 -65
  318. package/src/editor/schema.ts +0 -339
  319. package/src/editor/selectors/ai-selector.tsx +0 -110
  320. package/src/editor/selectors/color-selector.tsx +0 -199
  321. package/src/editor/selectors/link-selector.tsx +0 -122
  322. package/src/editor/selectors/node-selector.tsx +0 -159
  323. package/src/editor/selectors/text-buttons.tsx +0 -79
  324. package/src/editor/types.ts +0 -6
  325. package/src/editor/useProseMirror.ts +0 -125
  326. package/src/editor/utils/prosemirror-utils.ts +0 -113
  327. package/src/editor/utils/remove_classes.ts +0 -18
  328. package/src/editor/utils/useDebouncedCallback.ts +0 -25
  329. package/src/form/EntityForm.tsx +0 -761
  330. package/src/form/EntityFormActions.tsx +0 -160
  331. package/src/form/EntityFormBinding.tsx +0 -342
  332. package/src/form/PropertyFieldBinding.tsx +0 -348
  333. package/src/form/components/ErrorFocus.tsx +0 -44
  334. package/src/form/components/FieldBlock.tsx +0 -189
  335. package/src/form/components/FieldHelperText.tsx +0 -84
  336. package/src/form/components/FormRail.tsx +0 -153
  337. package/src/form/components/FormSections.tsx +0 -145
  338. package/src/form/components/LabelWithIcon.tsx +0 -43
  339. package/src/form/components/LabelWithIconAndTooltip.tsx +0 -28
  340. package/src/form/components/LocalChangesMenu.tsx +0 -147
  341. package/src/form/components/StorageItemPreview.tsx +0 -81
  342. package/src/form/components/StorageUploadProgress.tsx +0 -118
  343. package/src/form/components/index.tsx +0 -6
  344. package/src/form/components/useRailVisible.tsx +0 -47
  345. package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +0 -109
  346. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +0 -172
  347. package/src/form/field_bindings/BinaryFieldBinding.tsx +0 -177
  348. package/src/form/field_bindings/BlockFieldBinding.tsx +0 -282
  349. package/src/form/field_bindings/DateTimeFieldBinding.tsx +0 -78
  350. package/src/form/field_bindings/GeopointFieldBinding.tsx +0 -200
  351. package/src/form/field_bindings/KeyValueFieldBinding.tsx +0 -574
  352. package/src/form/field_bindings/MapFieldBinding.tsx +0 -120
  353. package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +0 -259
  354. package/src/form/field_bindings/MultiSelectFieldBinding.tsx +0 -130
  355. package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +0 -168
  356. package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +0 -94
  357. package/src/form/field_bindings/ReferenceFieldBinding.tsx +0 -146
  358. package/src/form/field_bindings/RelationFieldBinding.tsx +0 -202
  359. package/src/form/field_bindings/RepeatFieldBinding.tsx +0 -143
  360. package/src/form/field_bindings/SelectFieldBinding.tsx +0 -111
  361. package/src/form/field_bindings/StorageUploadFieldBinding.tsx +0 -521
  362. package/src/form/field_bindings/SwitchFieldBinding.tsx +0 -70
  363. package/src/form/field_bindings/TextFieldBinding.tsx +0 -189
  364. package/src/form/field_bindings/UserSelectFieldBinding.tsx +0 -71
  365. package/src/form/field_bindings/VectorFieldBinding.tsx +0 -209
  366. package/src/form/form_utils.ts +0 -243
  367. package/src/form/index.tsx +0 -36
  368. package/src/form/useClearRestoreValue.tsx +0 -36
  369. package/src/form/useUndoableDiscard.ts +0 -39
  370. package/src/form/validation.ts +0 -583
  371. package/src/hooks/index.ts +0 -16
  372. package/src/hooks/navigation/contexts/CollectionRegistryContext.tsx +0 -22
  373. package/src/hooks/navigation/contexts/NavigationStateContext.tsx +0 -16
  374. package/src/hooks/navigation/contexts/UrlContext.tsx +0 -24
  375. package/src/hooks/navigation/contexts/index.ts +0 -14
  376. package/src/hooks/navigation/useAsyncResolver.ts +0 -100
  377. package/src/hooks/navigation/useBuildCollectionRegistryController.tsx +0 -218
  378. package/src/hooks/navigation/useBuildNavigationStateController.tsx +0 -134
  379. package/src/hooks/navigation/useBuildUrlController.tsx +0 -66
  380. package/src/hooks/navigation/useNavigationResolution.ts +0 -271
  381. package/src/hooks/navigation/useResolvedCollections.ts +0 -102
  382. package/src/hooks/navigation/useResolvedViews.tsx +0 -139
  383. package/src/hooks/navigation/useTopLevelNavigation.ts +0 -273
  384. package/src/hooks/navigation/utils.ts +0 -200
  385. package/src/hooks/useAdminContext.tsx +0 -83
  386. package/src/hooks/useBreadcrumbsController.tsx +0 -17
  387. package/src/hooks/useBuildSideDialogsController.tsx +0 -145
  388. package/src/hooks/useBuildSidePanel.tsx +0 -315
  389. package/src/hooks/useChildViewSource.ts +0 -46
  390. package/src/hooks/useEntityDisplay.tsx +0 -262
  391. package/src/hooks/useEntityDisplayTitle.tsx +0 -49
  392. package/src/hooks/useHistory.ts +0 -178
  393. package/src/hooks/useRecordActions.tsx +0 -69
  394. package/src/hooks/useResolvedNavigationFrom.tsx +0 -167
  395. package/src/hooks/useResolvedUsers.ts +0 -148
  396. package/src/hooks/useSelectionDialog.tsx +0 -58
  397. package/src/hooks/useSideDialogsController.tsx +0 -25
  398. package/src/hooks/useSidePanel.tsx +0 -13
  399. package/src/index.ts +0 -124
  400. package/src/preview/PropertyPreview.tsx +0 -331
  401. package/src/preview/compact_text.ts +0 -68
  402. package/src/preview/components/ArrayEnumPreview.tsx +0 -39
  403. package/src/preview/components/BooleanPreview.tsx +0 -28
  404. package/src/preview/components/DatePreview.tsx +0 -106
  405. package/src/preview/components/EmptyValue.tsx +0 -10
  406. package/src/preview/components/EnumValuesChip.tsx +0 -39
  407. package/src/preview/components/ImagePreview.tsx +0 -144
  408. package/src/preview/components/InlineEntityListPreview.tsx +0 -42
  409. package/src/preview/components/ReferencePreview.tsx +0 -235
  410. package/src/preview/components/RelationPreview.tsx +0 -271
  411. package/src/preview/components/StorageThumbnail.tsx +0 -147
  412. package/src/preview/components/UrlComponentPreview.tsx +0 -116
  413. package/src/preview/components/UserPreview.tsx +0 -30
  414. package/src/preview/components/date_fns_locales.ts +0 -125
  415. package/src/preview/index.ts +0 -26
  416. package/src/preview/property_previews/ArrayOfMapsPreview.tsx +0 -73
  417. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +0 -67
  418. package/src/preview/property_previews/ArrayOfRelationsPreview.tsx +0 -77
  419. package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +0 -49
  420. package/src/preview/property_previews/ArrayOfStringsPreview.tsx +0 -70
  421. package/src/preview/property_previews/ArrayOneOfPreview.tsx +0 -79
  422. package/src/preview/property_previews/ArrayPropertyEnumPreview.tsx +0 -35
  423. package/src/preview/property_previews/ArrayPropertyPreview.tsx +0 -79
  424. package/src/preview/property_previews/MapPropertyPreview.tsx +0 -198
  425. package/src/preview/property_previews/NumberPropertyPreview.tsx +0 -39
  426. package/src/preview/property_previews/SkeletonPropertyComponent.tsx +0 -276
  427. package/src/preview/property_previews/StringPropertyPreview.tsx +0 -70
  428. package/src/preview/util.ts +0 -39
  429. package/src/routes/CustomViewRoute.tsx +0 -33
  430. package/src/routes/RebaseRoute.tsx +0 -467
  431. package/src/routes/index.ts +0 -2
  432. package/src/types/components/EntityFormActionsProps.tsx +0 -20
  433. package/src/types/components/EntityFormProps.tsx +0 -119
  434. package/src/types/components/PropertyPreviewProps.tsx +0 -85
  435. package/src/types/components/formex.tsx +0 -2
  436. package/src/types/components/index.ts +0 -3
  437. package/src/types/fields.tsx +0 -340
  438. package/src/types/index.ts +0 -4
  439. package/src/util/dataControllerAdapter.ts +0 -88
  440. package/src/util/entity_actions.ts +0 -28
  441. package/src/util/index.ts +0 -5
  442. package/src/util/navigation_utils.ts +0 -89
  443. package/src/util/number_format.ts +0 -46
  444. package/src/util/previews.ts +0 -131
  445. package/src/util/propertyConfigMapper.ts +0 -134
  446. package/src/util/property_utils.tsx +0 -236
  447. package/src/util/resolutions.ts +0 -96
  448. package/src/util/view_constants.ts +0 -33
  449. package/src/util/view_mode.ts +0 -176
@@ -1,170 +0,0 @@
1
- import type { AdminCollection } from "@rebasepro/cms-types";
2
- import type { Entity, Property } from "@rebasepro/types";
3
- import React from "react";
4
- import { Chip, cls, Typography } from "@rebasepro/ui";
5
-
6
- import { useEntityDisplayValues } from "../hooks/useEntityDisplay";
7
- import { PropertyPreview } from "../preview";
8
-
9
- /**
10
- * The roles whose property the read-only view takes out of its grid.
11
- *
12
- * A role rendered here and left in the grid prints the value twice, so the
13
- * header's own rendering and this list have to agree — but the list is *not*
14
- * simply "every role the header draws". Two are deliberately absent:
15
- *
16
- * `title`, because the heading above a record and a labelled field are not the
17
- * same thing. `Order #` is a column with a name, a description and a format that
18
- * someone reads the record to find; `ORD-2026-0043` sitting in the identity bar
19
- * beside the breadcrumb is a label for the page. Removing the field because the
20
- * page is named after it takes a value out of the record on the grounds that its
21
- * text appears elsewhere, which is not a reason — a value in the database is
22
- * shown.
23
- *
24
- * `date`, because the rail's record block already carries the timestamps, and a
25
- * collection whose `date` role points at a business date — an order date, a due
26
- * date — wants that field where it declared it.
27
- */
28
- export const HEADER_DISPLAY_ROLES = ["subtitle", "image", "status", "tags"] as const;
29
-
30
- export interface EntityDisplayHeaderProps<M extends Record<string, unknown>> {
31
- entity: Entity<M>;
32
- collection: AdminCollection<M>;
33
- /**
34
- * Render the title. Off when an identity bar above already shows it — which
35
- * is every full-page use — and on inside a dialog that has no bar.
36
- */
37
- showTitle?: boolean;
38
- className?: string;
39
- }
40
-
41
- /**
42
- * What the record *is*, above the fields that say what it holds.
43
- *
44
- * A record's picture, name, state and labels are the things you opened the page
45
- * to see; on the plain grid they were fields like any other, so an order's
46
- * status sat in the second cell of the first row at the same size and weight as
47
- * its shipping cost, and its tags were a wrapped list of grey text.
48
- *
49
- * Every role here comes from `admin.display` and nothing is derived except the
50
- * title, which was already derived for the identity bar. A collection that
51
- * declares no display block therefore gets no header at all rather than a
52
- * heuristic guess at which of its enums is a "status" — the panel does not know
53
- * what these records are, and a wrong guess here is louder than no guess.
54
- *
55
- * A role filled by a *property* renders through {@link PropertyPreview}, so a
56
- * status keeps its enum's colour and an image stays a storage thumbnail. A role
57
- * filled by a resolver has no property behind it and renders as what it
58
- * returned.
59
- */
60
- export function EntityDisplayHeader<M extends Record<string, unknown>>({
61
- entity,
62
- collection,
63
- showTitle = false,
64
- className
65
- }: EntityDisplayHeaderProps<M>) {
66
-
67
- const display = useEntityDisplayValues<M>({
68
- collection,
69
- entity
70
- });
71
-
72
- const title = showTitle ? asText(display.title.value) : undefined;
73
- const subtitle = asText(display.subtitle.value);
74
- const tags = asTags(display.tags.value);
75
-
76
- const hasStatus = display.status.value !== undefined;
77
- const hasImage = display.image.value !== undefined;
78
-
79
- if (!title && !subtitle && !hasStatus && !hasImage && !tags.length) return null;
80
-
81
- return (
82
- <div className={cls("flex items-start gap-4 min-w-0", className)}>
83
-
84
- {hasImage && (
85
- <div className={"shrink-0 w-16 h-16 rounded-lg overflow-hidden flex items-center justify-center bg-surface-100 dark:bg-surface-800"}>
86
- <RoleValue role={display.image} propertyFallback={
87
- // A resolver's image is documented as a URL; a storage
88
- // path only resolves when a property is behind it, which
89
- // is what carries the storage source.
90
- typeof display.image.value === "string"
91
- ? <img src={display.image.value}
92
- alt={""}
93
- className={"w-full h-full object-cover"}/>
94
- : null
95
- }/>
96
- </div>
97
- )}
98
-
99
- <div className={"flex flex-col gap-1.5 min-w-0 flex-1"}>
100
-
101
- {title && (
102
- <Typography variant={"h5"} className={"min-w-0 truncate m-0"}>
103
- {title}
104
- </Typography>
105
- )}
106
-
107
- {subtitle && (
108
- <Typography variant={"body2"}
109
- color={"secondary"}
110
- className={"min-w-0 m-0"}>
111
- {subtitle}
112
- </Typography>
113
- )}
114
-
115
- {(hasStatus || tags.length > 0) && (
116
- <div className={"flex flex-wrap items-center gap-1.5"}>
117
- {hasStatus && (
118
- <RoleValue role={display.status} propertyFallback={
119
- <Chip size={"small"}>{asText(display.status.value)}</Chip>
120
- }/>
121
- )}
122
- {tags.map(tag => (
123
- <Chip key={tag} size={"small"} outlined>{tag}</Chip>
124
- ))}
125
- </div>
126
- )}
127
- </div>
128
- </div>
129
- );
130
- }
131
-
132
- /**
133
- * One resolved role, rendered richly when a property is behind it.
134
- *
135
- * `source` is set only when the value came from a property of this collection
136
- * (see `useEntityDisplay`), and it carries what a rich rendering needs. Its
137
- * absence is exactly the "this was computed" signal, and a computed value is a
138
- * bare string with no property to describe it — hence the fallback.
139
- */
140
- function RoleValue({
141
- role,
142
- propertyFallback
143
- }: {
144
- role: { value: unknown, source?: { key: string, property: Property | undefined, value: unknown } };
145
- propertyFallback: React.ReactNode;
146
- }) {
147
- const source = role.source;
148
- if (!source?.property) return <>{propertyFallback}</>;
149
- return <PropertyPreview propertyKey={source.key}
150
- value={source.value}
151
- property={source.property}
152
- hideLabel
153
- size={"medium"}/>;
154
- }
155
-
156
- /** A role's value as a line of text, or nothing when it holds nothing to read. */
157
- function asText(value: unknown): string | undefined {
158
- if (value === undefined || value === null) return undefined;
159
- const text = String(value).trim();
160
- return text.length ? text : undefined;
161
- }
162
-
163
- /** The `tags` role, which takes a single string as shorthand for one tag. */
164
- function asTags(value: unknown): string[] {
165
- if (value === undefined || value === null) return [];
166
- const list = Array.isArray(value) ? value : [value];
167
- return list
168
- .map(entry => asText(entry))
169
- .filter((entry): entry is string => Boolean(entry));
170
- }
@@ -1,428 +0,0 @@
1
- import type { AdminCollection } from "@rebasepro/cms-types";
2
- import type { EntityStatus } from "@rebasepro/types";
3
- import React, { useState } from "react";
4
- import { Link } from "react-router";
5
- import { useTranslation } from "@rebasepro/app";
6
- import {
7
- Button,
8
- CheckIcon,
9
- ChevronDownIcon,
10
- cls,
11
- CodeIcon,
12
- CopyIcon,
13
- defaultBorderMixin,
14
- ExternalLinkIcon,
15
- HistoryIcon,
16
- IconButton,
17
- iconSize,
18
- LoadingButton,
19
- ArrowLeftIcon,
20
- Menu,
21
- MenuItem,
22
- MoreVerticalIcon,
23
- Separator,
24
- Tooltip,
25
- Typography,
26
- XIcon
27
- } from "@rebasepro/ui";
28
-
29
- export interface EntityIdentityBarProps {
30
- /** Plural collection name, shown as the breadcrumb ahead of the title. */
31
- collection: AdminCollection;
32
- /**
33
- * Where the breadcrumb points. Without it the collection name is inert text
34
- * that still reads as a breadcrumb — worse than no breadcrumb at all, and
35
- * the only way back once a layout drops its back arrow.
36
- *
37
- * Left unset by the overlays (side panel, dialog), where the collection is
38
- * already underneath and navigating would dismiss the record instead.
39
- */
40
- collectionUrl?: string;
41
- /** Resolved record title, already guarded against showing a field default. */
42
- title: string;
43
- entityId?: string | number;
44
- status: EntityStatus;
45
-
46
- dirty: boolean;
47
- saving: boolean;
48
- /** Undefined hides the Save button — read-only views, or a custom form. */
49
- onSave?: () => void;
50
- onDiscard?: () => void;
51
- saveDisabled?: boolean;
52
- hasErrors?: boolean;
53
-
54
- /**
55
- * Save and dismiss, for the side panel and the dialog where the dominant
56
- * action is "done with this record" rather than "keep editing".
57
- */
58
- onSaveAndClose?: () => void;
59
-
60
- /**
61
- * Where {@link onSaveAndClose} is offered.
62
- *
63
- * `"button"` — its own filled button, and Save demotes to text. For the
64
- * overlays, where you opened the record to do one thing to it and closing is
65
- * the dominant intent.
66
- *
67
- * `"menu"` — a `▾` welded to the Save button. For the split, where the list
68
- * is right there and `j`/`k` walk from record to record: there, saving and
69
- * *staying* is the common case, so it keeps the filled button and dismissing
70
- * is one step further in. The gesture still exists, so muscle memory carried
71
- * over from the side panel finds it.
72
- */
73
- saveAndClosePlacement?: "button" | "menu";
74
-
75
- /**
76
- * Dismiss this record, from the ✕ at the bar's trailing edge.
77
- *
78
- * Fenced off from Save by a separator: it is chrome, not the last item in
79
- * the action row. The panel that supplies it decides what dismissing means —
80
- * in the split it is a navigation, which the layout's unsaved-changes
81
- * blocker already guards, so the ✕ cannot drop an edit without asking.
82
- */
83
- onClose?: () => void;
84
-
85
- onBack?: () => void;
86
- onInspect?: () => void;
87
- /** Opens the inspector straight on its history tab. */
88
- onViewHistory?: () => void;
89
-
90
- /**
91
- * Where this record appears on the live site, from `entityLinkBuilder`.
92
- *
93
- * Here rather than above the record, where it used to be a single unlabelled
94
- * icon alone on its own right-aligned row — the only thing between the bar
95
- * and the first field, and the only control in the view that did not say
96
- * what it was. It is a thing you do *to* a record, so it belongs with the
97
- * others.
98
- */
99
- externalLink?: string;
100
-
101
- /**
102
- * Actions performed *on* the record — copy, delete, whatever the collection
103
- * adds — as menu items under the overflow button. They live here rather
104
- * than in a footer, which is what let the footer go away entirely.
105
- */
106
- recordActions?: React.ReactNode;
107
-
108
- /** Plugin-contributed actions, rendered inline before Save. */
109
- pluginActions?: React.ReactNode;
110
-
111
- /** Close / full-screen buttons supplied by the panel that owns this view. */
112
- trailing?: React.ReactNode;
113
-
114
- /**
115
- * Controls the owning panel puts at the bar's leading edge, ahead of the
116
- * breadcrumb — where the side panel's close button lives.
117
- */
118
- leading?: React.ReactNode;
119
- }
120
-
121
- /**
122
- * The persistent header of an entity view: who this record is, and what you can
123
- * do to it.
124
- *
125
- * The title and the id used to live inside the scrolling form, above 72px of
126
- * empty space — 219px of chrome that carried nothing and scrolled away the
127
- * moment you touched the wheel, leaving no indication of which record you were
128
- * editing. They live here instead, and the left half of a bar that was
129
- * previously empty now does the work.
130
- */
131
- export function EntityIdentityBar({
132
- collection,
133
- collectionUrl,
134
- title,
135
- entityId,
136
- status,
137
- dirty,
138
- saving,
139
- onSave,
140
- onDiscard,
141
- saveDisabled,
142
- hasErrors,
143
- onSaveAndClose,
144
- saveAndClosePlacement = "button",
145
- onClose,
146
- onBack,
147
- onInspect,
148
- onViewHistory,
149
- externalLink,
150
- recordActions,
151
- pluginActions,
152
- trailing,
153
- leading
154
- }: EntityIdentityBarProps) {
155
-
156
- const { t } = useTranslation();
157
-
158
- const saveLabel = status === "existing"
159
- ? t("save")
160
- : status === "copy" ? t("create_copy") : t("create");
161
- const closeLabel = status === "existing"
162
- ? t("save_and_close")
163
- : status === "copy" ? t("create_copy_and_close") : t("create_and_close");
164
- const hasMenu = Boolean(recordActions) || Boolean(onInspect) || Boolean(onViewHistory)
165
- || Boolean(externalLink);
166
-
167
- // The two shapes "save and close" takes, so the Save button next to it knows
168
- // whether it is still the primary action.
169
- const saveAndCloseButton = Boolean(onSaveAndClose) && saveAndClosePlacement === "button";
170
- const saveAndCloseMenu = Boolean(onSaveAndClose) && saveAndClosePlacement === "menu";
171
-
172
- const saveTooltip = hasErrors
173
- ? (t("fix_errors_before_saving") ?? "Fix highlighted errors before saving")
174
- : undefined;
175
-
176
- return (
177
- <div className={cls(
178
- "h-[52px] shrink-0 flex items-center gap-2 pl-1.5 pr-2 border-b",
179
- "bg-surface-50 dark:bg-surface-900",
180
- defaultBorderMixin
181
- )}>
182
- {leading}
183
-
184
- {onBack && (
185
- <Tooltip title={t("back")}>
186
- <IconButton size={"small"} onClick={onBack} aria-label={t("back")}>
187
- <ArrowLeftIcon size={iconSize.smallest}/>
188
- </IconButton>
189
- </Tooltip>
190
- )}
191
-
192
- {collectionUrl
193
- ? <Link to={collectionUrl}
194
- className={"visited:text-inherit dark:visited:text-inherit hidden sm:block"}>
195
- <Typography variant={"caption"}
196
- className={cls(
197
- "text-text-disabled dark:text-text-disabled-dark whitespace-nowrap",
198
- "hover:text-text-primary dark:hover:text-text-primary-dark transition-colors"
199
- )}>
200
- {collection.name}&nbsp;/
201
- </Typography>
202
- </Link>
203
- : <Typography variant={"caption"}
204
- className={"text-text-disabled dark:text-text-disabled-dark whitespace-nowrap hidden sm:block"}>
205
- {collection.name}&nbsp;/
206
- </Typography>}
207
-
208
- <span className={"font-headers font-semibold text-[15px] tracking-tight truncate min-w-0"}
209
- title={title}>
210
- {title}
211
- </span>
212
-
213
- {entityId !== undefined && <IdChip value={String(entityId)}/>}
214
-
215
- <div className={"flex-1"}/>
216
-
217
- {/* Only where there is something to save. The read-only detail
218
- view has no Save button, and reporting "Saved" there implies an
219
- editing session the user never started. */}
220
- {onSave && <SaveState dirty={dirty} saving={saving} status={status} t={t}/>}
221
-
222
- {pluginActions}
223
-
224
- {onDiscard && dirty && !saving && (
225
- <Button variant={"text"} size={"small"} onClick={onDiscard}>
226
- {status === "existing" ? t("discard") : t("clear")}
227
- </Button>
228
- )}
229
-
230
- {onSave && (
231
- // `rounded-lg overflow-hidden`: the two halves of the split
232
- // button are square inside and the group carries the radius, so
233
- // there is one control with a seam rather than two buttons that
234
- // happen to touch. Their borders match their own fill, so the
235
- // seam has to be drawn — see the `▾` half for where and in what.
236
- <div className={"flex items-stretch rounded-lg overflow-hidden"}>
237
- <Tooltip title={saveTooltip}>
238
- <LoadingButton
239
- // Where a separate close button carries it, closing
240
- // is the dominant intent and takes the filled
241
- // treatment. Under the `▾` the record is staying
242
- // open, so Save keeps it.
243
- variant={saveAndCloseButton ? "text" : "filled"}
244
- color={"primary"}
245
- size={"small"}
246
- loading={saving && !saveAndCloseButton}
247
- disabled={saveDisabled}
248
- onClick={onSave}
249
- className={saveAndCloseMenu ? "rounded-none" : undefined}>
250
- {saveLabel}
251
- </LoadingButton>
252
- </Tooltip>
253
-
254
- {saveAndCloseMenu && <>
255
- <Menu align={"end"}
256
- trigger={
257
- <Button variant={"filled"}
258
- color={"primary"}
259
- size={"small"}
260
- disabled={saveDisabled}
261
- aria-label={closeLabel}
262
- // The seam is this half's own left border,
263
- // tinted from `currentColor` — the ink the
264
- // label is drawn in — so it holds on any
265
- // button colour and dims with the control
266
- // rather than needing a case per state. It
267
- // was a `bg-white/25` span between the
268
- // halves: a bright hairline scratched over a
269
- // saturated blue, and, being a sibling of
270
- // the buttons rather than part of one, it
271
- // stayed at full strength while `disabled`
272
- // dropped both halves to `opacity-40` — a
273
- // rule brighter than the button it bisected.
274
- // Inline because it has to beat the
275
- // variant's `border-<color>` on one edge.
276
- style={{ borderLeftColor: "color-mix(in oklab, currentColor 15%, transparent)" }}
277
- className={"rounded-none px-1.5"}>
278
- <ChevronDownIcon size={iconSize.smallest}/>
279
- </Button>
280
- }>
281
- <MenuItem onClick={onSaveAndClose}>
282
- <CheckIcon size={iconSize.smallest}/>
283
- {closeLabel}
284
- </MenuItem>
285
- </Menu>
286
- </>}
287
- </div>
288
- )}
289
-
290
- {saveAndCloseButton && (
291
- <LoadingButton variant={"filled"}
292
- color={"primary"}
293
- size={"small"}
294
- loading={saving}
295
- disabled={saveDisabled}
296
- onClick={onSaveAndClose}>
297
- {closeLabel}
298
- </LoadingButton>
299
- )}
300
-
301
- {hasMenu && (
302
- <Menu align={"end"}
303
- trigger={
304
- <IconButton size={"small"} aria-label={t("more_actions") ?? "More actions"}>
305
- <MoreVerticalIcon size={iconSize.smallest}/>
306
- </IconButton>
307
- }>
308
- {externalLink && (
309
- <MenuItem onClick={() => window.open(externalLink, "_blank", "noopener,noreferrer")}>
310
- <ExternalLinkIcon size={iconSize.smallest}/>
311
- {t("open_in_live_site") ?? "Open in the live site"}
312
- </MenuItem>
313
- )}
314
- {externalLink && (recordActions || onInspect || onViewHistory) &&
315
- <Separator orientation={"horizontal"}/>}
316
- {recordActions}
317
- {recordActions && (onInspect || onViewHistory) && <Separator orientation={"horizontal"}/>}
318
- {onViewHistory && (
319
- <MenuItem onClick={onViewHistory}>
320
- <HistoryIcon size={iconSize.smallest}/>
321
- {t("record_history") ?? "History"}
322
- </MenuItem>
323
- )}
324
- {onInspect && (
325
- <MenuItem onClick={onInspect}>
326
- <CodeIcon size={iconSize.smallest}/>
327
- {t("inspect_record") ?? "Inspect record"}
328
- </MenuItem>
329
- )}
330
- </Menu>
331
- )}
332
-
333
- {trailing}
334
-
335
- {/* Last, and behind a rule. A ✕ that sits flush against Save reads
336
- as the next item in the action row, and the two adjacent controls
337
- are then "commit this edit" and "abandon it". */}
338
- {onClose && <>
339
- <Separator orientation={"vertical"} className={"h-5 mx-1 shrink-0"}/>
340
- <Tooltip title={`${t("close")} · Esc`}>
341
- <IconButton size={"small"} onClick={onClose} aria-label={t("close")}>
342
- <XIcon size={iconSize.smallest}/>
343
- </IconButton>
344
- </Tooltip>
345
- </>}
346
- </div>
347
- );
348
- }
349
-
350
- /**
351
- * The words the unlabelled floating circle never said.
352
- *
353
- * That indicator was a ✓ / pencil / spinner chip stuck to the top-right of the
354
- * scroll area in an `h-0 overflow-visible` container, so it drifted across
355
- * field values as you scrolled — and it duplicated what the Save button was
356
- * already able to tell you.
357
- */
358
- function SaveState({
359
- dirty,
360
- saving,
361
- status,
362
- t
363
- }: {
364
- dirty: boolean;
365
- saving: boolean;
366
- status: EntityStatus;
367
- t: (key: string) => string;
368
- }) {
369
- if (saving) {
370
- return <StateText>{t("saving")}</StateText>;
371
- }
372
- if (dirty) {
373
- return <StateText>{t("unsaved_changes_title")}</StateText>;
374
- }
375
- if (status === "existing") {
376
- return <StateText>{t("entity_saved") ?? "Saved"}</StateText>;
377
- }
378
- return null;
379
- }
380
-
381
- function StateText({ children }: { children: React.ReactNode }) {
382
- return (
383
- <span className={"text-xs text-text-disabled dark:text-text-disabled-dark whitespace-nowrap hidden md:inline"}>
384
- {children}
385
- </span>
386
- );
387
- }
388
-
389
- /**
390
- * The id, as a chip you can copy rather than a full-width alert holding a UUID.
391
- */
392
- function IdChip({ value }: { value: string }) {
393
-
394
- const { t } = useTranslation();
395
- const [copied, setCopied] = useState(false);
396
-
397
- const truncated = value.length > 14
398
- ? `${value.slice(0, 8)}…${value.slice(-4)}`
399
- : value;
400
-
401
- const copy = () => {
402
- navigator.clipboard?.writeText(value).then(() => {
403
- setCopied(true);
404
- setTimeout(() => setCopied(false), 1600);
405
- }, () => undefined);
406
- };
407
-
408
- return (
409
- <Tooltip title={copied ? t("copied") : value}>
410
- <button type={"button"}
411
- onClick={copy}
412
- aria-label={`${t("copy_id")} ${value}`}
413
- className={cls(
414
- // `whitespace-nowrap`: the middle of the id is elided with a
415
- // `…`, and a line break is allowed after one. In the dialog,
416
- // where the bar is narrow and every button is on it, the
417
- // chip broke across two lines inside a 52px row.
418
- "hidden md:inline-flex items-center gap-1.5 shrink-0 whitespace-nowrap px-2 py-0.5 rounded-md",
419
- "font-mono text-[11px] text-text-secondary dark:text-text-secondary-dark",
420
- "bg-surface-accent-200/50 dark:bg-white/[0.055]",
421
- "hover:bg-surface-accent-200/75 dark:hover:bg-white/[0.09] transition-colors"
422
- )}>
423
- {truncated}
424
- {copied ? <CheckIcon size={iconSize.smallest}/> : <CopyIcon size={iconSize.smallest}/>}
425
- </button>
426
- </Tooltip>
427
- );
428
- }