@actuate-media/cms-admin 0.8.0 → 0.8.1
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.
- package/dist/AdminRoot.d.ts.map +1 -1
- package/dist/AdminRoot.js +44 -42
- package/dist/AdminRoot.js.map +1 -1
- package/dist/__tests__/lib/search.test.js +10 -10
- package/dist/__tests__/lib/search.test.js.map +1 -1
- package/dist/__tests__/lib/utils.test.js.map +1 -1
- package/dist/__tests__/router/match-route.test.js.map +1 -1
- package/dist/__tests__/router/strip-base.test.js.map +1 -1
- package/dist/components/Breadcrumbs.d.ts.map +1 -1
- package/dist/components/Breadcrumbs.js +2 -4
- package/dist/components/Breadcrumbs.js.map +1 -1
- package/dist/components/CommandPalette.d.ts.map +1 -1
- package/dist/components/CommandPalette.js +7 -3
- package/dist/components/CommandPalette.js.map +1 -1
- package/dist/components/ContentOverviewChart.d.ts.map +1 -1
- package/dist/components/ContentOverviewChart.js.map +1 -1
- package/dist/components/ErrorBoundary.d.ts.map +1 -1
- package/dist/components/ErrorBoundary.js.map +1 -1
- package/dist/components/FocalPointPicker.d.ts.map +1 -1
- package/dist/components/FocalPointPicker.js +4 -2
- package/dist/components/FocalPointPicker.js.map +1 -1
- package/dist/components/FolderTree.d.ts.map +1 -1
- package/dist/components/FolderTree.js +18 -10
- package/dist/components/FolderTree.js.map +1 -1
- package/dist/components/LivePreview.d.ts +1 -1
- package/dist/components/LivePreview.d.ts.map +1 -1
- package/dist/components/LivePreview.js +6 -2
- package/dist/components/LivePreview.js.map +1 -1
- package/dist/components/LocaleProvider.d.ts.map +1 -1
- package/dist/components/LocaleProvider.js.map +1 -1
- package/dist/components/LocaleSwitcher.d.ts.map +1 -1
- package/dist/components/LocaleSwitcher.js +1 -1
- package/dist/components/LocaleSwitcher.js.map +1 -1
- package/dist/components/MediaPickerModal.d.ts.map +1 -1
- package/dist/components/MediaPickerModal.js.map +1 -1
- package/dist/components/PresenceIndicator.d.ts.map +1 -1
- package/dist/components/PresenceIndicator.js +5 -2
- package/dist/components/PresenceIndicator.js.map +1 -1
- package/dist/components/SEOPanel.d.ts +1 -1
- package/dist/components/SEOPanel.d.ts.map +1 -1
- package/dist/components/SEOPanel.js +110 -24
- package/dist/components/SEOPanel.js.map +1 -1
- package/dist/components/SEOPerformance.d.ts.map +1 -1
- package/dist/components/SEOPerformance.js +2 -2
- package/dist/components/SEOPerformance.js.map +1 -1
- package/dist/components/ThemeProvider.d.ts.map +1 -1
- package/dist/components/ThemeProvider.js.map +1 -1
- package/dist/components/TipTapEditor.d.ts.map +1 -1
- package/dist/components/TipTapEditor.js +5 -1
- package/dist/components/TipTapEditor.js.map +1 -1
- package/dist/components/VersionHistory.d.ts +1 -1
- package/dist/components/VersionHistory.d.ts.map +1 -1
- package/dist/components/VersionHistory.js +1 -1
- package/dist/components/VersionHistory.js.map +1 -1
- package/dist/components/ui/Avatar.d.ts.map +1 -1
- package/dist/components/ui/Avatar.js.map +1 -1
- package/dist/components/ui/Badge.d.ts.map +1 -1
- package/dist/components/ui/Badge.js.map +1 -1
- package/dist/components/ui/Button.d.ts.map +1 -1
- package/dist/components/ui/Button.js.map +1 -1
- package/dist/components/ui/CommandPalette.d.ts.map +1 -1
- package/dist/components/ui/CommandPalette.js +8 -2
- package/dist/components/ui/CommandPalette.js.map +1 -1
- package/dist/components/ui/ConfirmDialog.d.ts.map +1 -1
- package/dist/components/ui/ConfirmDialog.js.map +1 -1
- package/dist/components/ui/DataTable.d.ts.map +1 -1
- package/dist/components/ui/DataTable.js +1 -3
- package/dist/components/ui/DataTable.js.map +1 -1
- package/dist/components/ui/EmptyState.d.ts.map +1 -1
- package/dist/components/ui/EmptyState.js +1 -1
- package/dist/components/ui/EmptyState.js.map +1 -1
- package/dist/components/ui/Modal.d.ts.map +1 -1
- package/dist/components/ui/Modal.js.map +1 -1
- package/dist/components/ui/Pagination.d.ts +1 -1
- package/dist/components/ui/Pagination.d.ts.map +1 -1
- package/dist/components/ui/Pagination.js +7 -2
- package/dist/components/ui/Pagination.js.map +1 -1
- package/dist/components/ui/SearchInput.d.ts.map +1 -1
- package/dist/components/ui/SearchInput.js.map +1 -1
- package/dist/components/ui/Skeleton.d.ts.map +1 -1
- package/dist/components/ui/Skeleton.js.map +1 -1
- package/dist/components/ui/Toast.d.ts.map +1 -1
- package/dist/components/ui/Toast.js.map +1 -1
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js.map +1 -1
- package/dist/fields/ArrayField.d.ts.map +1 -1
- package/dist/fields/ArrayField.js +1 -1
- package/dist/fields/ArrayField.js.map +1 -1
- package/dist/fields/BlockBuilderField.d.ts.map +1 -1
- package/dist/fields/BlockBuilderField.js +7 -7
- package/dist/fields/BlockBuilderField.js.map +1 -1
- package/dist/fields/DateField.d.ts.map +1 -1
- package/dist/fields/DateField.js +1 -1
- package/dist/fields/DateField.js.map +1 -1
- package/dist/fields/FieldRenderer.d.ts.map +1 -1
- package/dist/fields/FieldRenderer.js.map +1 -1
- package/dist/fields/GroupField.d.ts.map +1 -1
- package/dist/fields/GroupField.js +1 -1
- package/dist/fields/GroupField.js.map +1 -1
- package/dist/fields/MediaField.d.ts.map +1 -1
- package/dist/fields/MediaField.js +1 -1
- package/dist/fields/MediaField.js.map +1 -1
- package/dist/fields/NavBuilderField.d.ts.map +1 -1
- package/dist/fields/NavBuilderField.js +2 -5
- package/dist/fields/NavBuilderField.js.map +1 -1
- package/dist/fields/NumberField.d.ts +1 -1
- package/dist/fields/NumberField.d.ts.map +1 -1
- package/dist/fields/NumberField.js +2 -2
- package/dist/fields/NumberField.js.map +1 -1
- package/dist/fields/RelationshipField.d.ts.map +1 -1
- package/dist/fields/RelationshipField.js +7 -3
- package/dist/fields/RelationshipField.js.map +1 -1
- package/dist/fields/RichTextField.d.ts +1 -1
- package/dist/fields/RichTextField.d.ts.map +1 -1
- package/dist/fields/RichTextField.js +2 -2
- package/dist/fields/RichTextField.js.map +1 -1
- package/dist/fields/SelectField.d.ts.map +1 -1
- package/dist/fields/SelectField.js +9 -7
- package/dist/fields/SelectField.js.map +1 -1
- package/dist/fields/SlugField.d.ts.map +1 -1
- package/dist/fields/SlugField.js +1 -1
- package/dist/fields/SlugField.js.map +1 -1
- package/dist/fields/TextField.d.ts +1 -1
- package/dist/fields/TextField.d.ts.map +1 -1
- package/dist/fields/TextField.js +2 -2
- package/dist/fields/TextField.js.map +1 -1
- package/dist/fields/ToggleField.d.ts.map +1 -1
- package/dist/fields/ToggleField.js +1 -1
- package/dist/fields/ToggleField.js.map +1 -1
- package/dist/fields/block-types.d.ts.map +1 -1
- package/dist/fields/block-types.js +28 -8
- package/dist/fields/block-types.js.map +1 -1
- package/dist/fields/index.d.ts.map +1 -1
- package/dist/fields/index.js.map +1 -1
- package/dist/hooks/useBuilderState.d.ts.map +1 -1
- package/dist/hooks/useBuilderState.js.map +1 -1
- package/dist/hooks/useContentLock.d.ts.map +1 -1
- package/dist/hooks/useContentLock.js.map +1 -1
- package/dist/hooks/useDebounce.js.map +1 -1
- package/dist/hooks/useKeyboardShortcuts.d.ts.map +1 -1
- package/dist/hooks/useKeyboardShortcuts.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/layout/Header.d.ts.map +1 -1
- package/dist/layout/Header.js.map +1 -1
- package/dist/layout/Layout.d.ts.map +1 -1
- package/dist/layout/Layout.js.map +1 -1
- package/dist/layout/Sidebar.d.ts +1 -1
- package/dist/layout/Sidebar.d.ts.map +1 -1
- package/dist/layout/Sidebar.js +5 -8
- package/dist/layout/Sidebar.js.map +1 -1
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/search.d.ts.map +1 -1
- package/dist/lib/search.js +3 -5
- package/dist/lib/search.js.map +1 -1
- package/dist/lib/useApiData.d.ts.map +1 -1
- package/dist/lib/useApiData.js.map +1 -1
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js.map +1 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +1 -3
- package/dist/router/index.js.map +1 -1
- package/dist/views/CollectionList.d.ts.map +1 -1
- package/dist/views/CollectionList.js +56 -17
- package/dist/views/CollectionList.js.map +1 -1
- package/dist/views/Dashboard.d.ts.map +1 -1
- package/dist/views/Dashboard.js +26 -13
- package/dist/views/Dashboard.js.map +1 -1
- package/dist/views/DocumentEdit.d.ts +1 -1
- package/dist/views/DocumentEdit.d.ts.map +1 -1
- package/dist/views/DocumentEdit.js +33 -15
- package/dist/views/DocumentEdit.js.map +1 -1
- package/dist/views/ForgotPassword.d.ts.map +1 -1
- package/dist/views/ForgotPassword.js.map +1 -1
- package/dist/views/FormEditor.d.ts.map +1 -1
- package/dist/views/FormEditor.js +8 -2
- package/dist/views/FormEditor.js.map +1 -1
- package/dist/views/FormSubmissions.d.ts.map +1 -1
- package/dist/views/FormSubmissions.js +6 -6
- package/dist/views/FormSubmissions.js.map +1 -1
- package/dist/views/Forms.d.ts.map +1 -1
- package/dist/views/Forms.js.map +1 -1
- package/dist/views/Login.d.ts.map +1 -1
- package/dist/views/Login.js +5 -2
- package/dist/views/Login.js.map +1 -1
- package/dist/views/MediaBrowser.d.ts.map +1 -1
- package/dist/views/MediaBrowser.js +39 -19
- package/dist/views/MediaBrowser.js.map +1 -1
- package/dist/views/PageEditor.d.ts.map +1 -1
- package/dist/views/PageEditor.js.map +1 -1
- package/dist/views/Pages.d.ts.map +1 -1
- package/dist/views/Pages.js +20 -10
- package/dist/views/Pages.js.map +1 -1
- package/dist/views/PostEditor.d.ts.map +1 -1
- package/dist/views/PostEditor.js.map +1 -1
- package/dist/views/Posts.d.ts.map +1 -1
- package/dist/views/Posts.js +13 -7
- package/dist/views/Posts.js.map +1 -1
- package/dist/views/Redirects.d.ts.map +1 -1
- package/dist/views/Redirects.js +17 -5
- package/dist/views/Redirects.js.map +1 -1
- package/dist/views/ResetPassword.d.ts.map +1 -1
- package/dist/views/ResetPassword.js.map +1 -1
- package/dist/views/SEO.d.ts.map +1 -1
- package/dist/views/SEO.js +39 -16
- package/dist/views/SEO.js.map +1 -1
- package/dist/views/ScriptTagEditor.d.ts.map +1 -1
- package/dist/views/ScriptTagEditor.js +2 -1
- package/dist/views/ScriptTagEditor.js.map +1 -1
- package/dist/views/ScriptTags.d.ts.map +1 -1
- package/dist/views/ScriptTags.js.map +1 -1
- package/dist/views/Settings.d.ts.map +1 -1
- package/dist/views/Settings.js +38 -11
- package/dist/views/Settings.js.map +1 -1
- package/dist/views/SetupWizard.d.ts.map +1 -1
- package/dist/views/SetupWizard.js.map +1 -1
- package/dist/views/Users.d.ts.map +1 -1
- package/dist/views/Users.js +5 -3
- package/dist/views/Users.js.map +1 -1
- package/dist/views/page-builder/AIBlockAssist.d.ts.map +1 -1
- package/dist/views/page-builder/AIBlockAssist.js +1 -1
- package/dist/views/page-builder/AIBlockAssist.js.map +1 -1
- package/dist/views/page-builder/AIGenerateDialog.d.ts.map +1 -1
- package/dist/views/page-builder/AIGenerateDialog.js +4 -1
- package/dist/views/page-builder/AIGenerateDialog.js.map +1 -1
- package/dist/views/page-builder/BlockEditor.d.ts.map +1 -1
- package/dist/views/page-builder/BlockEditor.js +1 -1
- package/dist/views/page-builder/BlockEditor.js.map +1 -1
- package/dist/views/page-builder/BlockPicker.d.ts.map +1 -1
- package/dist/views/page-builder/BlockPicker.js.map +1 -1
- package/dist/views/page-builder/BottomBar.d.ts.map +1 -1
- package/dist/views/page-builder/BottomBar.js.map +1 -1
- package/dist/views/page-builder/BuilderToolbar.d.ts.map +1 -1
- package/dist/views/page-builder/BuilderToolbar.js.map +1 -1
- package/dist/views/page-builder/ContextPanel.d.ts.map +1 -1
- package/dist/views/page-builder/ContextPanel.js +4 -1
- package/dist/views/page-builder/ContextPanel.js.map +1 -1
- package/dist/views/page-builder/DesignScore.d.ts.map +1 -1
- package/dist/views/page-builder/DesignScore.js.map +1 -1
- package/dist/views/page-builder/NodeSettings.d.ts.map +1 -1
- package/dist/views/page-builder/NodeSettings.js +1 -1
- package/dist/views/page-builder/NodeSettings.js.map +1 -1
- package/dist/views/page-builder/PageBuilder.d.ts +1 -1
- package/dist/views/page-builder/PageBuilder.d.ts.map +1 -1
- package/dist/views/page-builder/PageBuilder.js +4 -2
- package/dist/views/page-builder/PageBuilder.js.map +1 -1
- package/dist/views/page-builder/PageSettings.d.ts.map +1 -1
- package/dist/views/page-builder/PageSettings.js.map +1 -1
- package/dist/views/page-builder/PageTemplates.d.ts.map +1 -1
- package/dist/views/page-builder/PageTemplates.js.map +1 -1
- package/dist/views/page-builder/SEOPanel.d.ts.map +1 -1
- package/dist/views/page-builder/SEOPanel.js +1 -3
- package/dist/views/page-builder/SEOPanel.js.map +1 -1
- package/dist/views/page-builder/SavedSections.d.ts.map +1 -1
- package/dist/views/page-builder/SavedSections.js +3 -7
- package/dist/views/page-builder/SavedSections.js.map +1 -1
- package/dist/views/page-builder/TemplatePicker.d.ts.map +1 -1
- package/dist/views/page-builder/TemplatePicker.js.map +1 -1
- package/dist/views/page-builder/block-renderers/CTAPreview.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/CTAPreview.js +1 -1
- package/dist/views/page-builder/block-renderers/CTAPreview.js.map +1 -1
- package/dist/views/page-builder/block-renderers/CardsPreview.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/CardsPreview.js +1 -1
- package/dist/views/page-builder/block-renderers/CardsPreview.js.map +1 -1
- package/dist/views/page-builder/block-renderers/CodePreview.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/CodePreview.js +1 -5
- package/dist/views/page-builder/block-renderers/CodePreview.js.map +1 -1
- package/dist/views/page-builder/block-renderers/FAQPreview.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/FAQPreview.js +4 -1
- package/dist/views/page-builder/block-renderers/FAQPreview.js.map +1 -1
- package/dist/views/page-builder/block-renderers/FallbackPreview.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/FallbackPreview.js.map +1 -1
- package/dist/views/page-builder/block-renderers/FormPreview.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/FormPreview.js +2 -2
- package/dist/views/page-builder/block-renderers/FormPreview.js.map +1 -1
- package/dist/views/page-builder/block-renderers/GalleryPreview.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/GalleryPreview.js +1 -3
- package/dist/views/page-builder/block-renderers/GalleryPreview.js.map +1 -1
- package/dist/views/page-builder/block-renderers/HeroPreview.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/HeroPreview.js.map +1 -1
- package/dist/views/page-builder/block-renderers/ImagePreview.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/ImagePreview.js.map +1 -1
- package/dist/views/page-builder/block-renderers/TextPreview.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/TextPreview.js +2 -6
- package/dist/views/page-builder/block-renderers/TextPreview.js.map +1 -1
- package/dist/views/page-builder/block-renderers/VideoPreview.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/VideoPreview.js +2 -5
- package/dist/views/page-builder/block-renderers/VideoPreview.js.map +1 -1
- package/dist/views/page-builder/block-renderers/index.d.ts.map +1 -1
- package/dist/views/page-builder/block-renderers/index.js.map +1 -1
- package/dist/views/page-builder/canvas/BlockRenderer.d.ts.map +1 -1
- package/dist/views/page-builder/canvas/BlockRenderer.js +1 -5
- package/dist/views/page-builder/canvas/BlockRenderer.js.map +1 -1
- package/dist/views/page-builder/canvas/BuilderCanvas.d.ts.map +1 -1
- package/dist/views/page-builder/canvas/BuilderCanvas.js.map +1 -1
- package/dist/views/page-builder/canvas/ColumnRenderer.d.ts.map +1 -1
- package/dist/views/page-builder/canvas/ColumnRenderer.js +1 -5
- package/dist/views/page-builder/canvas/ColumnRenderer.js.map +1 -1
- package/dist/views/page-builder/canvas/ContainerRenderer.d.ts.map +1 -1
- package/dist/views/page-builder/canvas/ContainerRenderer.js +1 -5
- package/dist/views/page-builder/canvas/ContainerRenderer.js.map +1 -1
- package/dist/views/page-builder/canvas/RowRenderer.d.ts.map +1 -1
- package/dist/views/page-builder/canvas/RowRenderer.js +1 -5
- package/dist/views/page-builder/canvas/RowRenderer.js.map +1 -1
- package/dist/views/page-builder/canvas/SectionRenderer.d.ts.map +1 -1
- package/dist/views/page-builder/canvas/SectionRenderer.js +1 -5
- package/dist/views/page-builder/canvas/SectionRenderer.js.map +1 -1
- package/dist/views/page-builder/canvas/index.d.ts.map +1 -1
- package/dist/views/page-builder/canvas/index.js.map +1 -1
- package/package.json +2 -2
- package/src/AdminRoot.tsx +263 -191
- package/src/__tests__/lib/search.test.ts +60 -69
- package/src/__tests__/lib/utils.test.ts +12 -12
- package/src/__tests__/router/match-route.test.ts +24 -26
- package/src/__tests__/router/strip-base.test.ts +15 -15
- package/src/components/Breadcrumbs.tsx +27 -24
- package/src/components/CommandPalette.tsx +115 -99
- package/src/components/ContentOverviewChart.tsx +19 -14
- package/src/components/ErrorBoundary.tsx +13 -13
- package/src/components/FocalPointPicker.tsx +31 -20
- package/src/components/FolderTree.tsx +172 -139
- package/src/components/LivePreview.tsx +68 -41
- package/src/components/LocaleProvider.tsx +26 -20
- package/src/components/LocaleSwitcher.tsx +9 -11
- package/src/components/MediaPickerModal.tsx +46 -45
- package/src/components/PresenceIndicator.tsx +30 -27
- package/src/components/SEOPanel.tsx +378 -228
- package/src/components/SEOPerformance.tsx +52 -30
- package/src/components/ThemeProvider.tsx +46 -46
- package/src/components/TipTapEditor.tsx +60 -64
- package/src/components/VersionHistory.tsx +63 -52
- package/src/components/ui/Avatar.tsx +8 -8
- package/src/components/ui/Badge.tsx +7 -5
- package/src/components/ui/Button.tsx +24 -13
- package/src/components/ui/CommandPalette.tsx +56 -42
- package/src/components/ui/ConfirmDialog.tsx +14 -14
- package/src/components/ui/DataTable.tsx +37 -39
- package/src/components/ui/EmptyState.tsx +9 -11
- package/src/components/ui/Modal.tsx +21 -15
- package/src/components/ui/Pagination.tsx +34 -19
- package/src/components/ui/SearchInput.tsx +17 -7
- package/src/components/ui/Skeleton.tsx +7 -7
- package/src/components/ui/Toast.tsx +29 -22
- package/src/components/ui/index.ts +24 -24
- package/src/fields/ArrayField.tsx +43 -25
- package/src/fields/BlockBuilderField.tsx +80 -99
- package/src/fields/DateField.tsx +20 -12
- package/src/fields/FieldRenderer.tsx +34 -34
- package/src/fields/GroupField.tsx +8 -10
- package/src/fields/MediaField.tsx +8 -10
- package/src/fields/NavBuilderField.tsx +24 -25
- package/src/fields/NumberField.tsx +21 -14
- package/src/fields/RelationshipField.tsx +105 -91
- package/src/fields/RichTextField.tsx +16 -12
- package/src/fields/SelectField.tsx +42 -34
- package/src/fields/SlugField.tsx +29 -17
- package/src/fields/TextField.tsx +24 -16
- package/src/fields/ToggleField.tsx +7 -9
- package/src/fields/block-types.ts +50 -24
- package/src/fields/index.ts +17 -17
- package/src/hooks/useBuilderState.ts +260 -221
- package/src/hooks/useContentLock.ts +23 -20
- package/src/hooks/useDebounce.ts +7 -7
- package/src/hooks/useKeyboardShortcuts.ts +16 -16
- package/src/index.ts +69 -58
- package/src/layout/Header.tsx +21 -20
- package/src/layout/Layout.tsx +22 -24
- package/src/layout/Sidebar.tsx +107 -72
- package/src/lib/api.ts +34 -34
- package/src/lib/search.ts +30 -34
- package/src/lib/useApiData.ts +65 -62
- package/src/lib/utils.ts +3 -3
- package/src/router/index.ts +33 -35
- package/src/styles/build-input.css +2 -2
- package/src/styles/tailwind.css +1 -1
- package/src/styles/theme.css +7 -1
- package/src/views/CollectionList.tsx +275 -121
- package/src/views/Dashboard.tsx +164 -117
- package/src/views/DocumentEdit.tsx +298 -253
- package/src/views/ForgotPassword.tsx +27 -23
- package/src/views/FormEditor.tsx +165 -99
- package/src/views/FormSubmissions.tsx +261 -117
- package/src/views/Forms.tsx +56 -26
- package/src/views/Login.tsx +107 -84
- package/src/views/MediaBrowser.tsx +717 -523
- package/src/views/PageEditor.tsx +44 -46
- package/src/views/Pages.tsx +312 -149
- package/src/views/PostEditor.tsx +57 -51
- package/src/views/Posts.tsx +206 -74
- package/src/views/Redirects.tsx +173 -117
- package/src/views/ResetPassword.tsx +43 -32
- package/src/views/SEO.tsx +589 -160
- package/src/views/ScriptTagEditor.tsx +69 -69
- package/src/views/ScriptTags.tsx +54 -42
- package/src/views/Settings.tsx +430 -220
- package/src/views/SetupWizard.tsx +69 -46
- package/src/views/Users.tsx +154 -120
- package/src/views/page-builder/AIBlockAssist.tsx +21 -25
- package/src/views/page-builder/AIGenerateDialog.tsx +134 -127
- package/src/views/page-builder/BlockEditor.tsx +94 -96
- package/src/views/page-builder/BlockPicker.tsx +73 -88
- package/src/views/page-builder/BottomBar.tsx +15 -11
- package/src/views/page-builder/BuilderToolbar.tsx +32 -29
- package/src/views/page-builder/ContextPanel.tsx +57 -57
- package/src/views/page-builder/DesignScore.tsx +52 -59
- package/src/views/page-builder/NodeSettings.tsx +59 -59
- package/src/views/page-builder/PageBuilder.tsx +156 -155
- package/src/views/page-builder/PageSettings.tsx +16 -15
- package/src/views/page-builder/PageTemplates.tsx +23 -17
- package/src/views/page-builder/SEOPanel.tsx +90 -111
- package/src/views/page-builder/SavedSections.tsx +99 -105
- package/src/views/page-builder/TemplatePicker.tsx +44 -48
- package/src/views/page-builder/block-renderers/CTAPreview.tsx +11 -13
- package/src/views/page-builder/block-renderers/CardsPreview.tsx +13 -15
- package/src/views/page-builder/block-renderers/CodePreview.tsx +16 -16
- package/src/views/page-builder/block-renderers/FAQPreview.tsx +20 -23
- package/src/views/page-builder/block-renderers/FallbackPreview.tsx +5 -5
- package/src/views/page-builder/block-renderers/FormPreview.tsx +9 -13
- package/src/views/page-builder/block-renderers/GalleryPreview.tsx +22 -28
- package/src/views/page-builder/block-renderers/HeroPreview.tsx +17 -30
- package/src/views/page-builder/block-renderers/ImagePreview.tsx +12 -12
- package/src/views/page-builder/block-renderers/TextPreview.tsx +22 -22
- package/src/views/page-builder/block-renderers/VideoPreview.tsx +13 -18
- package/src/views/page-builder/block-renderers/index.ts +17 -17
- package/src/views/page-builder/canvas/BlockRenderer.tsx +19 -23
- package/src/views/page-builder/canvas/BuilderCanvas.tsx +17 -20
- package/src/views/page-builder/canvas/ColumnRenderer.tsx +22 -26
- package/src/views/page-builder/canvas/ContainerRenderer.tsx +20 -24
- package/src/views/page-builder/canvas/RowRenderer.tsx +19 -23
- package/src/views/page-builder/canvas/SectionRenderer.tsx +30 -34
- package/src/views/page-builder/canvas/index.ts +2 -2
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
'use client'
|
|
1
|
+
'use client'
|
|
2
2
|
|
|
3
|
-
import { useEffect } from 'react'
|
|
3
|
+
import { useEffect } from 'react'
|
|
4
4
|
|
|
5
5
|
interface ShortcutMap {
|
|
6
|
-
[combo: string]: (e: KeyboardEvent) => void
|
|
6
|
+
[combo: string]: (e: KeyboardEvent) => void
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
export function useKeyboardShortcuts(shortcuts: ShortcutMap) {
|
|
10
10
|
useEffect(() => {
|
|
11
11
|
function handleKeyDown(e: KeyboardEvent) {
|
|
12
|
-
const meta = e.metaKey || e.ctrlKey
|
|
13
|
-
const parts: string[] = []
|
|
12
|
+
const meta = e.metaKey || e.ctrlKey
|
|
13
|
+
const parts: string[] = []
|
|
14
14
|
|
|
15
|
-
if (meta) parts.push('mod')
|
|
16
|
-
if (e.shiftKey) parts.push('shift')
|
|
17
|
-
if (e.altKey) parts.push('alt')
|
|
18
|
-
parts.push(e.key.toLowerCase())
|
|
15
|
+
if (meta) parts.push('mod')
|
|
16
|
+
if (e.shiftKey) parts.push('shift')
|
|
17
|
+
if (e.altKey) parts.push('alt')
|
|
18
|
+
parts.push(e.key.toLowerCase())
|
|
19
19
|
|
|
20
|
-
const combo = parts.join('+')
|
|
21
|
-
const handler = shortcuts[combo]
|
|
20
|
+
const combo = parts.join('+')
|
|
21
|
+
const handler = shortcuts[combo]
|
|
22
22
|
|
|
23
23
|
if (handler) {
|
|
24
|
-
e.preventDefault()
|
|
25
|
-
handler(e)
|
|
24
|
+
e.preventDefault()
|
|
25
|
+
handler(e)
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
document.addEventListener('keydown', handleKeyDown)
|
|
30
|
-
return () => document.removeEventListener('keydown', handleKeyDown)
|
|
31
|
-
}, [shortcuts])
|
|
29
|
+
document.addEventListener('keydown', handleKeyDown)
|
|
30
|
+
return () => document.removeEventListener('keydown', handleKeyDown)
|
|
31
|
+
}, [shortcuts])
|
|
32
32
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,63 +1,74 @@
|
|
|
1
|
-
export { AdminRoot } from './AdminRoot.js'
|
|
2
|
-
export type { AdminRootProps } from './AdminRoot.js'
|
|
1
|
+
export { AdminRoot } from './AdminRoot.js'
|
|
2
|
+
export type { AdminRootProps } from './AdminRoot.js'
|
|
3
3
|
|
|
4
|
-
export { Layout } from './layout/Layout.js'
|
|
5
|
-
export type { LayoutProps } from './layout/Layout.js'
|
|
6
|
-
export { Sidebar } from './layout/Sidebar.js'
|
|
7
|
-
export type { SidebarProps } from './layout/Sidebar.js'
|
|
8
|
-
export { Header } from './layout/Header.js'
|
|
9
|
-
export type { HeaderProps } from './layout/Header.js'
|
|
4
|
+
export { Layout } from './layout/Layout.js'
|
|
5
|
+
export type { LayoutProps } from './layout/Layout.js'
|
|
6
|
+
export { Sidebar } from './layout/Sidebar.js'
|
|
7
|
+
export type { SidebarProps } from './layout/Sidebar.js'
|
|
8
|
+
export { Header } from './layout/Header.js'
|
|
9
|
+
export type { HeaderProps } from './layout/Header.js'
|
|
10
10
|
|
|
11
|
-
export { Dashboard } from './views/Dashboard.js'
|
|
12
|
-
export { Posts } from './views/Posts.js'
|
|
13
|
-
export { Pages } from './views/Pages.js'
|
|
14
|
-
export { PostEditor } from './views/PostEditor.js'
|
|
15
|
-
export { PageEditor } from './views/PageEditor.js'
|
|
16
|
-
export { MediaBrowser } from './views/MediaBrowser.js'
|
|
17
|
-
export { Forms } from './views/Forms.js'
|
|
18
|
-
export { FormEditor } from './views/FormEditor.js'
|
|
19
|
-
export type { FormEditorProps } from './views/FormEditor.js'
|
|
20
|
-
export { FormSubmissions } from './views/FormSubmissions.js'
|
|
21
|
-
export { Redirects } from './views/Redirects.js'
|
|
22
|
-
export { Users } from './views/Users.js'
|
|
23
|
-
export { Settings } from './views/Settings.js'
|
|
24
|
-
export { SEO } from './views/SEO.js'
|
|
25
|
-
export { SetupWizard } from './views/SetupWizard.js'
|
|
26
|
-
export type { SetupWizardProps } from './views/SetupWizard.js'
|
|
27
|
-
export { Login } from './views/Login.js'
|
|
28
|
-
export type { LoginProps, CaptchaConfig } from './views/Login.js'
|
|
29
|
-
export { ForgotPassword } from './views/ForgotPassword.js'
|
|
30
|
-
export type { ForgotPasswordProps } from './views/ForgotPassword.js'
|
|
31
|
-
export { ResetPassword } from './views/ResetPassword.js'
|
|
32
|
-
export type { ResetPasswordProps } from './views/ResetPassword.js'
|
|
33
|
-
export { CollectionList } from './views/CollectionList.js'
|
|
34
|
-
export { DocumentEdit } from './views/DocumentEdit.js'
|
|
11
|
+
export { Dashboard } from './views/Dashboard.js'
|
|
12
|
+
export { Posts } from './views/Posts.js'
|
|
13
|
+
export { Pages } from './views/Pages.js'
|
|
14
|
+
export { PostEditor } from './views/PostEditor.js'
|
|
15
|
+
export { PageEditor } from './views/PageEditor.js'
|
|
16
|
+
export { MediaBrowser } from './views/MediaBrowser.js'
|
|
17
|
+
export { Forms } from './views/Forms.js'
|
|
18
|
+
export { FormEditor } from './views/FormEditor.js'
|
|
19
|
+
export type { FormEditorProps } from './views/FormEditor.js'
|
|
20
|
+
export { FormSubmissions } from './views/FormSubmissions.js'
|
|
21
|
+
export { Redirects } from './views/Redirects.js'
|
|
22
|
+
export { Users } from './views/Users.js'
|
|
23
|
+
export { Settings } from './views/Settings.js'
|
|
24
|
+
export { SEO } from './views/SEO.js'
|
|
25
|
+
export { SetupWizard } from './views/SetupWizard.js'
|
|
26
|
+
export type { SetupWizardProps } from './views/SetupWizard.js'
|
|
27
|
+
export { Login } from './views/Login.js'
|
|
28
|
+
export type { LoginProps, CaptchaConfig } from './views/Login.js'
|
|
29
|
+
export { ForgotPassword } from './views/ForgotPassword.js'
|
|
30
|
+
export type { ForgotPasswordProps } from './views/ForgotPassword.js'
|
|
31
|
+
export { ResetPassword } from './views/ResetPassword.js'
|
|
32
|
+
export type { ResetPasswordProps } from './views/ResetPassword.js'
|
|
33
|
+
export { CollectionList } from './views/CollectionList.js'
|
|
34
|
+
export { DocumentEdit } from './views/DocumentEdit.js'
|
|
35
35
|
|
|
36
|
-
export { PageBuilder } from './views/page-builder/PageBuilder.js'
|
|
37
|
-
export { useBuilderState } from './hooks/useBuilderState.js'
|
|
38
|
-
export type {
|
|
36
|
+
export { PageBuilder } from './views/page-builder/PageBuilder.js'
|
|
37
|
+
export { useBuilderState } from './hooks/useBuilderState.js'
|
|
38
|
+
export type {
|
|
39
|
+
BuilderState,
|
|
40
|
+
BuilderActions,
|
|
41
|
+
DeviceMode,
|
|
42
|
+
PanelTab,
|
|
43
|
+
PageSettings as BuilderPageSettings,
|
|
44
|
+
} from './hooks/useBuilderState.js'
|
|
39
45
|
|
|
40
|
-
export { Breadcrumbs } from './components/Breadcrumbs.js'
|
|
41
|
-
export { CommandPalette } from './components/CommandPalette.js'
|
|
42
|
-
export { ErrorBoundary } from './components/ErrorBoundary.js'
|
|
43
|
-
export { FolderTree } from './components/FolderTree.js'
|
|
44
|
-
export type {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
export
|
|
51
|
-
export {
|
|
52
|
-
export type {
|
|
53
|
-
export {
|
|
54
|
-
export {
|
|
55
|
-
export {
|
|
56
|
-
export {
|
|
57
|
-
export type {
|
|
58
|
-
export {
|
|
59
|
-
export {
|
|
46
|
+
export { Breadcrumbs } from './components/Breadcrumbs.js'
|
|
47
|
+
export { CommandPalette } from './components/CommandPalette.js'
|
|
48
|
+
export { ErrorBoundary } from './components/ErrorBoundary.js'
|
|
49
|
+
export { FolderTree } from './components/FolderTree.js'
|
|
50
|
+
export type {
|
|
51
|
+
FolderTreeProps,
|
|
52
|
+
FolderNode,
|
|
53
|
+
FolderSelection,
|
|
54
|
+
SmartFolder,
|
|
55
|
+
} from './components/FolderTree.js'
|
|
56
|
+
export { TipTapEditor } from './components/TipTapEditor.js'
|
|
57
|
+
export { SEOPanel } from './components/SEOPanel.js'
|
|
58
|
+
export type { SEOData, SEOPanelProps } from './components/SEOPanel.js'
|
|
59
|
+
export { LivePreview } from './components/LivePreview.js'
|
|
60
|
+
export { VersionHistory } from './components/VersionHistory.js'
|
|
61
|
+
export type { VersionHistoryProps } from './components/VersionHistory.js'
|
|
62
|
+
export { MediaPickerModal } from './components/MediaPickerModal.js'
|
|
63
|
+
export type { MediaPickerModalProps } from './components/MediaPickerModal.js'
|
|
64
|
+
export { ThemeProvider, useTheme } from './components/ThemeProvider.js'
|
|
65
|
+
export { FocalPointPicker } from './components/FocalPointPicker.js'
|
|
66
|
+
export { PresenceIndicator } from './components/PresenceIndicator.js'
|
|
67
|
+
export { LocaleProvider, useLocale } from './components/LocaleProvider.js'
|
|
68
|
+
export type { LocaleProviderProps } from './components/LocaleProvider.js'
|
|
69
|
+
export { LocaleSwitcher } from './components/LocaleSwitcher.js'
|
|
70
|
+
export { useKeyboardShortcuts } from './hooks/useKeyboardShortcuts.js'
|
|
60
71
|
|
|
61
|
-
export { cmsApi, setApiBase, ensureCsrfToken } from './lib/api.js'
|
|
62
|
-
export { useApiData } from './lib/useApiData.js'
|
|
63
|
-
export type { UseApiDataResult } from './lib/useApiData.js'
|
|
72
|
+
export { cmsApi, setApiBase, ensureCsrfToken } from './lib/api.js'
|
|
73
|
+
export { useApiData } from './lib/useApiData.js'
|
|
74
|
+
export type { UseApiDataResult } from './lib/useApiData.js'
|
package/src/layout/Header.tsx
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
'use client'
|
|
1
|
+
'use client'
|
|
2
2
|
|
|
3
|
-
import { useState } from 'react'
|
|
4
|
-
import { Search, Bell, User, ChevronDown, Menu, Sun, Moon } from 'lucide-react'
|
|
5
|
-
import * as DropdownMenu from '@radix-ui/react-dropdown-menu'
|
|
6
|
-
import { CommandPalette } from '../components/CommandPalette.js'
|
|
7
|
-
import { useTheme } from '../components/ThemeProvider.js'
|
|
8
|
-
import { LocaleSwitcher } from '../components/LocaleSwitcher.js'
|
|
3
|
+
import { useState } from 'react'
|
|
4
|
+
import { Search, Bell, User, ChevronDown, Menu, Sun, Moon } from 'lucide-react'
|
|
5
|
+
import * as DropdownMenu from '@radix-ui/react-dropdown-menu'
|
|
6
|
+
import { CommandPalette } from '../components/CommandPalette.js'
|
|
7
|
+
import { useTheme } from '../components/ThemeProvider.js'
|
|
8
|
+
import { LocaleSwitcher } from '../components/LocaleSwitcher.js'
|
|
9
9
|
|
|
10
10
|
export interface HeaderProps {
|
|
11
|
-
onToggleSidebar: () => void
|
|
12
|
-
session?: any
|
|
13
|
-
onNavigate: (path: string) => void
|
|
11
|
+
onToggleSidebar: () => void
|
|
12
|
+
session?: any
|
|
13
|
+
onNavigate: (path: string) => void
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
export function Header({ onToggleSidebar, session, onNavigate }: HeaderProps) {
|
|
17
|
-
const [showCommandPalette, setShowCommandPalette] = useState(false)
|
|
18
|
-
const [searchQuery, setSearchQuery] = useState('')
|
|
19
|
-
const { resolvedTheme, setTheme } = useTheme()
|
|
17
|
+
const [showCommandPalette, setShowCommandPalette] = useState(false)
|
|
18
|
+
const [searchQuery, setSearchQuery] = useState('')
|
|
19
|
+
const { resolvedTheme, setTheme } = useTheme()
|
|
20
20
|
|
|
21
21
|
const toggleTheme = () => {
|
|
22
|
-
setTheme(resolvedTheme === 'dark' ? 'light' : 'dark')
|
|
23
|
-
}
|
|
22
|
+
setTheme(resolvedTheme === 'dark' ? 'light' : 'dark')
|
|
23
|
+
}
|
|
24
24
|
|
|
25
25
|
return (
|
|
26
26
|
<>
|
|
@@ -74,7 +74,10 @@ export function Header({ onToggleSidebar, session, onNavigate }: HeaderProps) {
|
|
|
74
74
|
)}
|
|
75
75
|
</button>
|
|
76
76
|
|
|
77
|
-
<button
|
|
77
|
+
<button
|
|
78
|
+
className="p-2 hover:bg-accent rounded-lg transition-colors relative"
|
|
79
|
+
aria-label="Notifications"
|
|
80
|
+
>
|
|
78
81
|
<Bell className="w-5 h-5 text-muted-foreground" />
|
|
79
82
|
<span className="absolute top-1.5 right-1.5 w-2 h-2 bg-destructive rounded-full" />
|
|
80
83
|
</button>
|
|
@@ -98,9 +101,7 @@ export function Header({ onToggleSidebar, session, onNavigate }: HeaderProps) {
|
|
|
98
101
|
sideOffset={5}
|
|
99
102
|
>
|
|
100
103
|
<div className="px-3 py-2 border-b border-border">
|
|
101
|
-
<p className="text-sm font-medium">
|
|
102
|
-
{session?.user?.name ?? 'Admin User'}
|
|
103
|
-
</p>
|
|
104
|
+
<p className="text-sm font-medium">{session?.user?.name ?? 'Admin User'}</p>
|
|
104
105
|
<p className="text-xs text-muted-foreground">
|
|
105
106
|
{session?.user?.email ?? 'admin@example.com'}
|
|
106
107
|
</p>
|
|
@@ -131,5 +132,5 @@ export function Header({ onToggleSidebar, session, onNavigate }: HeaderProps) {
|
|
|
131
132
|
onNavigate={onNavigate}
|
|
132
133
|
/>
|
|
133
134
|
</>
|
|
134
|
-
)
|
|
135
|
+
)
|
|
135
136
|
}
|
package/src/layout/Layout.tsx
CHANGED
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
'use client'
|
|
1
|
+
'use client'
|
|
2
2
|
|
|
3
|
-
import { useState, useEffect, type ReactNode } from 'react'
|
|
4
|
-
import { Sidebar } from './Sidebar.js'
|
|
5
|
-
import { Header } from './Header.js'
|
|
6
|
-
import { Breadcrumbs } from '../components/Breadcrumbs.js'
|
|
7
|
-
import { Toaster } from 'sonner'
|
|
3
|
+
import { useState, useEffect, type ReactNode } from 'react'
|
|
4
|
+
import { Sidebar } from './Sidebar.js'
|
|
5
|
+
import { Header } from './Header.js'
|
|
6
|
+
import { Breadcrumbs } from '../components/Breadcrumbs.js'
|
|
7
|
+
import { Toaster } from 'sonner'
|
|
8
8
|
|
|
9
9
|
export interface LayoutProps {
|
|
10
|
-
config: any
|
|
11
|
-
session: any
|
|
12
|
-
currentPath: string
|
|
13
|
-
onNavigate: (path: string) => void
|
|
14
|
-
children: ReactNode
|
|
10
|
+
config: any
|
|
11
|
+
session: any
|
|
12
|
+
currentPath: string
|
|
13
|
+
onNavigate: (path: string) => void
|
|
14
|
+
children: ReactNode
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
export function Layout({ config, session, currentPath, onNavigate, children }: LayoutProps) {
|
|
18
|
-
const [sidebarCollapsed, setSidebarCollapsed] = useState(false)
|
|
19
|
-
const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false)
|
|
18
|
+
const [sidebarCollapsed, setSidebarCollapsed] = useState(false)
|
|
19
|
+
const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false)
|
|
20
20
|
|
|
21
21
|
useEffect(() => {
|
|
22
|
-
setMobileSidebarOpen(false)
|
|
23
|
-
}, [currentPath])
|
|
22
|
+
setMobileSidebarOpen(false)
|
|
23
|
+
}, [currentPath])
|
|
24
24
|
|
|
25
25
|
useEffect(() => {
|
|
26
26
|
const handleResize = () => {
|
|
27
27
|
if (window.innerWidth < 1024) {
|
|
28
|
-
setMobileSidebarOpen(false)
|
|
28
|
+
setMobileSidebarOpen(false)
|
|
29
29
|
}
|
|
30
|
-
}
|
|
31
|
-
window.addEventListener('resize', handleResize)
|
|
32
|
-
return () => window.removeEventListener('resize', handleResize)
|
|
33
|
-
}, [])
|
|
30
|
+
}
|
|
31
|
+
window.addEventListener('resize', handleResize)
|
|
32
|
+
return () => window.removeEventListener('resize', handleResize)
|
|
33
|
+
}, [])
|
|
34
34
|
|
|
35
35
|
return (
|
|
36
36
|
<div className="h-screen flex overflow-hidden bg-background text-foreground">
|
|
@@ -67,11 +67,9 @@ export function Layout({ config, session, currentPath, onNavigate, children }: L
|
|
|
67
67
|
<Breadcrumbs currentPath={currentPath} onNavigate={onNavigate} />
|
|
68
68
|
|
|
69
69
|
<main className="flex-1 overflow-auto bg-background">
|
|
70
|
-
<div className="h-full">
|
|
71
|
-
{children}
|
|
72
|
-
</div>
|
|
70
|
+
<div className="h-full">{children}</div>
|
|
73
71
|
</main>
|
|
74
72
|
</div>
|
|
75
73
|
</div>
|
|
76
|
-
)
|
|
74
|
+
)
|
|
77
75
|
}
|
package/src/layout/Sidebar.tsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
'use client'
|
|
1
|
+
'use client'
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
LayoutDashboard,
|
|
@@ -22,12 +22,18 @@ import {
|
|
|
22
22
|
Code2,
|
|
23
23
|
LayoutTemplate,
|
|
24
24
|
Library,
|
|
25
|
-
} from 'lucide-react'
|
|
26
|
-
import type { LucideIcon } from 'lucide-react'
|
|
25
|
+
} from 'lucide-react'
|
|
26
|
+
import type { LucideIcon } from 'lucide-react'
|
|
27
27
|
|
|
28
28
|
function ActuateLogo({ className }: { className?: string }) {
|
|
29
29
|
return (
|
|
30
|
-
<svg
|
|
30
|
+
<svg
|
|
31
|
+
viewBox="0 0 40 44"
|
|
32
|
+
fill="none"
|
|
33
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
34
|
+
className={className}
|
|
35
|
+
aria-hidden="true"
|
|
36
|
+
>
|
|
31
37
|
{/* Upward arrow / chevron */}
|
|
32
38
|
<polygon points="20,2 6,18 12,18 20,8 28,18 34,18" fill="#E8646A" />
|
|
33
39
|
{/* Three vertical bars */}
|
|
@@ -35,20 +41,46 @@ function ActuateLogo({ className }: { className?: string }) {
|
|
|
35
41
|
<rect x="18" y="20" width="4" height="22" rx="1" fill="#E8646A" />
|
|
36
42
|
<rect x="25" y="20" width="4" height="22" rx="1" fill="#E8646A" />
|
|
37
43
|
</svg>
|
|
38
|
-
)
|
|
44
|
+
)
|
|
39
45
|
}
|
|
40
46
|
|
|
41
47
|
function ActuateWordmark({ className }: { className?: string }) {
|
|
42
48
|
return (
|
|
43
|
-
<svg
|
|
49
|
+
<svg
|
|
50
|
+
viewBox="0 0 170 44"
|
|
51
|
+
fill="none"
|
|
52
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
53
|
+
className={className}
|
|
54
|
+
aria-hidden="true"
|
|
55
|
+
>
|
|
44
56
|
<polygon points="20,2 6,18 12,18 20,8 28,18 34,18" fill="#E8646A" />
|
|
45
57
|
<rect x="11" y="20" width="4" height="22" rx="1" fill="#E8646A" />
|
|
46
58
|
<rect x="18" y="20" width="4" height="22" rx="1" fill="#E8646A" />
|
|
47
59
|
<rect x="25" y="20" width="4" height="22" rx="1" fill="#E8646A" />
|
|
48
|
-
<text
|
|
49
|
-
|
|
60
|
+
<text
|
|
61
|
+
x="44"
|
|
62
|
+
y="25"
|
|
63
|
+
fontFamily="system-ui, sans-serif"
|
|
64
|
+
fontSize="17"
|
|
65
|
+
fontWeight="600"
|
|
66
|
+
letterSpacing="1.5"
|
|
67
|
+
fill="#E8646A"
|
|
68
|
+
>
|
|
69
|
+
ACTUATE
|
|
70
|
+
</text>
|
|
71
|
+
<text
|
|
72
|
+
x="44"
|
|
73
|
+
y="40"
|
|
74
|
+
fontFamily="system-ui, sans-serif"
|
|
75
|
+
fontSize="10"
|
|
76
|
+
fontWeight="500"
|
|
77
|
+
letterSpacing="4"
|
|
78
|
+
fill="#9CA3AF"
|
|
79
|
+
>
|
|
80
|
+
MEDIA
|
|
81
|
+
</text>
|
|
50
82
|
</svg>
|
|
51
|
-
)
|
|
83
|
+
)
|
|
52
84
|
}
|
|
53
85
|
|
|
54
86
|
const ICON_MAP: Record<string, LucideIcon> = {
|
|
@@ -62,29 +94,35 @@ const ICON_MAP: Record<string, LucideIcon> = {
|
|
|
62
94
|
PanelTop: PanelTop,
|
|
63
95
|
PanelBottom: PanelBottom,
|
|
64
96
|
Layers: Layers,
|
|
65
|
-
}
|
|
97
|
+
}
|
|
66
98
|
|
|
67
99
|
function BrandLogo({ config, collapsed }: { config?: any; collapsed: boolean }) {
|
|
68
|
-
const branding = config?.admin?.branding
|
|
69
|
-
const customLogo = branding?.logo
|
|
70
|
-
const brandName = branding?.name
|
|
100
|
+
const branding = config?.admin?.branding
|
|
101
|
+
const customLogo = branding?.logo
|
|
102
|
+
const brandName = branding?.name
|
|
71
103
|
|
|
72
104
|
if (collapsed) {
|
|
73
105
|
if (customLogo) {
|
|
74
|
-
return <img src={customLogo} alt={brandName ?? 'Admin'} className="w-8 h-8 object-contain"
|
|
106
|
+
return <img src={customLogo} alt={brandName ?? 'Admin'} className="w-8 h-8 object-contain" />
|
|
75
107
|
}
|
|
76
|
-
return <ActuateLogo className="w-8 h-8"
|
|
108
|
+
return <ActuateLogo className="w-8 h-8" />
|
|
77
109
|
}
|
|
78
110
|
|
|
79
111
|
if (customLogo) {
|
|
80
112
|
return (
|
|
81
113
|
<div className="flex items-center gap-2.5 min-w-0">
|
|
82
|
-
<img
|
|
114
|
+
<img
|
|
115
|
+
src={customLogo}
|
|
116
|
+
alt={brandName ?? 'Admin'}
|
|
117
|
+
className="h-8 w-auto object-contain shrink-0"
|
|
118
|
+
/>
|
|
83
119
|
{brandName && (
|
|
84
|
-
<span className="text-sm font-semibold text-sidebar-foreground truncate">
|
|
120
|
+
<span className="text-sm font-semibold text-sidebar-foreground truncate">
|
|
121
|
+
{brandName}
|
|
122
|
+
</span>
|
|
85
123
|
)}
|
|
86
124
|
</div>
|
|
87
|
-
)
|
|
125
|
+
)
|
|
88
126
|
}
|
|
89
127
|
|
|
90
128
|
if (brandName) {
|
|
@@ -93,10 +131,10 @@ function BrandLogo({ config, collapsed }: { config?: any; collapsed: boolean })
|
|
|
93
131
|
<ActuateLogo className="w-7 h-7 shrink-0" />
|
|
94
132
|
<span className="text-sm font-semibold text-sidebar-foreground truncate">{brandName}</span>
|
|
95
133
|
</div>
|
|
96
|
-
)
|
|
134
|
+
)
|
|
97
135
|
}
|
|
98
136
|
|
|
99
|
-
return <ActuateWordmark className="h-8 w-auto"
|
|
137
|
+
return <ActuateWordmark className="h-8 w-auto" />
|
|
100
138
|
}
|
|
101
139
|
|
|
102
140
|
const defaultNavItems = [
|
|
@@ -108,18 +146,24 @@ const defaultNavItems = [
|
|
|
108
146
|
{ path: '/seo', label: 'SEO', icon: SearchIcon },
|
|
109
147
|
{ path: '/users', label: 'Users', icon: Users },
|
|
110
148
|
{ path: '/settings', label: 'Settings', icon: Settings },
|
|
111
|
-
]
|
|
149
|
+
]
|
|
112
150
|
|
|
113
151
|
export interface SidebarProps {
|
|
114
|
-
collapsed: boolean
|
|
115
|
-
onToggleCollapse: () => void
|
|
116
|
-
currentPath: string
|
|
117
|
-
onNavigate: (path: string) => void
|
|
118
|
-
config?: any
|
|
152
|
+
collapsed: boolean
|
|
153
|
+
onToggleCollapse: () => void
|
|
154
|
+
currentPath: string
|
|
155
|
+
onNavigate: (path: string) => void
|
|
156
|
+
config?: any
|
|
119
157
|
}
|
|
120
158
|
|
|
121
|
-
export function Sidebar({
|
|
122
|
-
|
|
159
|
+
export function Sidebar({
|
|
160
|
+
collapsed,
|
|
161
|
+
onToggleCollapse,
|
|
162
|
+
currentPath,
|
|
163
|
+
onNavigate,
|
|
164
|
+
config,
|
|
165
|
+
}: SidebarProps) {
|
|
166
|
+
const navItems = buildNavItems(config)
|
|
123
167
|
|
|
124
168
|
return (
|
|
125
169
|
<aside
|
|
@@ -132,12 +176,8 @@ export function Sidebar({ collapsed, onToggleCollapse, currentPath, onNavigate,
|
|
|
132
176
|
collapsed ? 'justify-center' : 'justify-between'
|
|
133
177
|
}`}
|
|
134
178
|
>
|
|
135
|
-
{!collapsed &&
|
|
136
|
-
|
|
137
|
-
)}
|
|
138
|
-
{collapsed && (
|
|
139
|
-
<BrandLogo config={config} collapsed={true} />
|
|
140
|
-
)}
|
|
179
|
+
{!collapsed && <BrandLogo config={config} collapsed={false} />}
|
|
180
|
+
{collapsed && <BrandLogo config={config} collapsed={true} />}
|
|
141
181
|
<button
|
|
142
182
|
onClick={onToggleCollapse}
|
|
143
183
|
className="hidden lg:block p-2 hover:bg-sidebar-accent rounded-lg transition-colors shrink-0"
|
|
@@ -153,13 +193,12 @@ export function Sidebar({ collapsed, onToggleCollapse, currentPath, onNavigate,
|
|
|
153
193
|
|
|
154
194
|
<nav className="p-3 space-y-1">
|
|
155
195
|
{navItems.map((item, idx) => {
|
|
156
|
-
const Icon = item.icon
|
|
196
|
+
const Icon = item.icon
|
|
157
197
|
const isActive =
|
|
158
|
-
currentPath === item.path ||
|
|
159
|
-
(item.path !== '/' && currentPath.startsWith(item.path));
|
|
198
|
+
currentPath === item.path || (item.path !== '/' && currentPath.startsWith(item.path))
|
|
160
199
|
|
|
161
|
-
const prevGroup = idx > 0 ? navItems[idx - 1]?.group : undefined
|
|
162
|
-
const showGroupLabel = item.group && item.group !== prevGroup
|
|
200
|
+
const prevGroup = idx > 0 ? navItems[idx - 1]?.group : undefined
|
|
201
|
+
const showGroupLabel = item.group && item.group !== prevGroup
|
|
163
202
|
|
|
164
203
|
return (
|
|
165
204
|
<div key={item.path}>
|
|
@@ -185,64 +224,60 @@ export function Sidebar({ collapsed, onToggleCollapse, currentPath, onNavigate,
|
|
|
185
224
|
title={collapsed ? item.label : ''}
|
|
186
225
|
>
|
|
187
226
|
<Icon className="w-5 h-5 shrink-0" />
|
|
188
|
-
{!collapsed &&
|
|
189
|
-
<span className="text-sm font-medium">{item.label}</span>
|
|
190
|
-
)}
|
|
227
|
+
{!collapsed && <span className="text-sm font-medium">{item.label}</span>}
|
|
191
228
|
</button>
|
|
192
229
|
</div>
|
|
193
|
-
)
|
|
230
|
+
)
|
|
194
231
|
})}
|
|
195
232
|
</nav>
|
|
196
233
|
</aside>
|
|
197
|
-
)
|
|
234
|
+
)
|
|
198
235
|
}
|
|
199
236
|
|
|
200
237
|
function resolveIcon(collection: any): LucideIcon {
|
|
201
|
-
const mapped = collection.admin?.icon ? ICON_MAP[collection.admin.icon] : undefined
|
|
202
|
-
if (mapped) return mapped
|
|
203
|
-
return collection.type === 'page' ? File : FileText
|
|
238
|
+
const mapped = collection.admin?.icon ? ICON_MAP[collection.admin.icon] : undefined
|
|
239
|
+
if (mapped) return mapped
|
|
240
|
+
return collection.type === 'page' ? File : FileText
|
|
204
241
|
}
|
|
205
242
|
|
|
206
243
|
export interface NavItem {
|
|
207
|
-
path: string
|
|
208
|
-
label: string
|
|
209
|
-
icon: LucideIcon
|
|
210
|
-
group?: string
|
|
244
|
+
path: string
|
|
245
|
+
label: string
|
|
246
|
+
icon: LucideIcon
|
|
247
|
+
group?: string
|
|
211
248
|
}
|
|
212
249
|
|
|
213
250
|
function buildNavItems(config: any): NavItem[] {
|
|
214
|
-
if (!config?.collections) return defaultNavItems
|
|
251
|
+
if (!config?.collections) return defaultNavItems
|
|
215
252
|
|
|
216
|
-
const raw = config.collections
|
|
217
|
-
const collectionsList: any[] = Array.isArray(raw) ? raw : Object.values(raw)
|
|
253
|
+
const raw = config.collections
|
|
254
|
+
const collectionsList: any[] = Array.isArray(raw) ? raw : Object.values(raw)
|
|
218
255
|
|
|
219
|
-
const visible = collectionsList.filter((c) => !c.admin?.hidden)
|
|
256
|
+
const visible = collectionsList.filter((c) => !c.admin?.hidden)
|
|
220
257
|
|
|
221
|
-
const ungrouped = visible.filter((c) => !c.admin?.group)
|
|
222
|
-
const grouped = visible.filter((c) => c.admin?.group)
|
|
258
|
+
const ungrouped = visible.filter((c) => !c.admin?.group)
|
|
259
|
+
const grouped = visible.filter((c) => c.admin?.group)
|
|
223
260
|
|
|
224
|
-
const pages = ungrouped.filter((c) => c.type === 'page')
|
|
225
|
-
const posts = ungrouped.filter((c) => c.type === 'post')
|
|
226
|
-
const other = ungrouped.filter((c) => c.type !== 'page' && c.type !== 'post')
|
|
227
|
-
const sortedUngrouped = [...pages, ...posts, ...other]
|
|
261
|
+
const pages = ungrouped.filter((c) => c.type === 'page')
|
|
262
|
+
const posts = ungrouped.filter((c) => c.type === 'post')
|
|
263
|
+
const other = ungrouped.filter((c) => c.type !== 'page' && c.type !== 'post')
|
|
264
|
+
const sortedUngrouped = [...pages, ...posts, ...other]
|
|
228
265
|
|
|
229
|
-
const items: NavItem[] = [
|
|
230
|
-
{ path: '/', label: 'Dashboard', icon: LayoutDashboard },
|
|
231
|
-
];
|
|
266
|
+
const items: NavItem[] = [{ path: '/', label: 'Dashboard', icon: LayoutDashboard }]
|
|
232
267
|
|
|
233
268
|
for (const collection of sortedUngrouped) {
|
|
234
269
|
items.push({
|
|
235
270
|
label: collection.labels?.plural ?? collection.slug,
|
|
236
271
|
path: `/${collection.slug}`,
|
|
237
272
|
icon: resolveIcon(collection),
|
|
238
|
-
})
|
|
273
|
+
})
|
|
239
274
|
}
|
|
240
275
|
|
|
241
|
-
const groups = new Map<string, typeof grouped>()
|
|
276
|
+
const groups = new Map<string, typeof grouped>()
|
|
242
277
|
for (const col of grouped) {
|
|
243
|
-
const group = col.admin.group as string
|
|
244
|
-
if (!groups.has(group)) groups.set(group, [])
|
|
245
|
-
groups.get(group)!.push(col)
|
|
278
|
+
const group = col.admin.group as string
|
|
279
|
+
if (!groups.has(group)) groups.set(group, [])
|
|
280
|
+
groups.get(group)!.push(col)
|
|
246
281
|
}
|
|
247
282
|
for (const [groupName, cols] of groups) {
|
|
248
283
|
for (const collection of cols) {
|
|
@@ -251,7 +286,7 @@ function buildNavItems(config: any): NavItem[] {
|
|
|
251
286
|
path: `/${collection.slug}`,
|
|
252
287
|
icon: resolveIcon(collection),
|
|
253
288
|
group: groupName,
|
|
254
|
-
})
|
|
289
|
+
})
|
|
255
290
|
}
|
|
256
291
|
}
|
|
257
292
|
|
|
@@ -265,7 +300,7 @@ function buildNavItems(config: any): NavItem[] {
|
|
|
265
300
|
{ path: '/script-tags', label: 'Script Tags', icon: Code2 },
|
|
266
301
|
{ path: '/users', label: 'Users', icon: Users },
|
|
267
302
|
{ path: '/settings', label: 'Settings', icon: Settings },
|
|
268
|
-
)
|
|
303
|
+
)
|
|
269
304
|
|
|
270
|
-
return items
|
|
305
|
+
return items
|
|
271
306
|
}
|