@prenta/admin 2.6.0 → 2.7.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.
- package/CHANGELOG.md +104 -0
- package/design-system/tokens.css +179 -85
- package/design-system/tokens.json +276 -85
- package/design-system/tokens.scss +148 -44
- package/design-system/tokens.tailwind.cjs +50 -1
- package/dist/AdminRoot.d.ts.map +1 -1
- package/dist/AdminRoot.js +42 -20
- package/dist/AdminRoot.js.map +1 -1
- package/dist/LoginRoot.d.ts.map +1 -1
- package/dist/LoginRoot.js +2 -1
- package/dist/LoginRoot.js.map +1 -1
- package/dist/__tests__/components/author-avatar.test.js +3 -17
- package/dist/__tests__/components/author-avatar.test.js.map +1 -1
- package/dist/__tests__/components/notification-bell.test.js +86 -15
- package/dist/__tests__/components/notification-bell.test.js.map +1 -1
- package/dist/__tests__/components/responsive-tiers.render.test.d.ts +2 -0
- package/dist/__tests__/components/responsive-tiers.render.test.d.ts.map +1 -0
- package/dist/__tests__/components/responsive-tiers.render.test.js +313 -0
- package/dist/__tests__/components/responsive-tiers.render.test.js.map +1 -0
- package/dist/__tests__/components/serp-preview.render.test.js +6 -3
- package/dist/__tests__/components/serp-preview.render.test.js.map +1 -1
- package/dist/__tests__/components/shell-primitives.render.test.d.ts +2 -0
- package/dist/__tests__/components/shell-primitives.render.test.d.ts.map +1 -0
- package/dist/__tests__/components/shell-primitives.render.test.js +716 -0
- package/dist/__tests__/components/shell-primitives.render.test.js.map +1 -0
- package/dist/__tests__/components/theme-provider-accent.test.js +49 -7
- package/dist/__tests__/components/theme-provider-accent.test.js.map +1 -1
- package/dist/__tests__/components/toggle.test.js +10 -3
- package/dist/__tests__/components/toggle.test.js.map +1 -1
- package/dist/__tests__/components/ui-primitives.test.js +3 -7
- package/dist/__tests__/components/ui-primitives.test.js.map +1 -1
- package/dist/__tests__/layout/build-nav-items.test.js +1 -1
- package/dist/__tests__/layout/build-nav-items.test.js.map +1 -1
- package/dist/__tests__/layout/shell-nav.render.test.d.ts +2 -0
- package/dist/__tests__/layout/shell-nav.render.test.d.ts.map +1 -0
- package/dist/__tests__/layout/shell-nav.render.test.js +736 -0
- package/dist/__tests__/layout/shell-nav.render.test.js.map +1 -0
- package/dist/__tests__/layout/sidebar-forms-submenu.render.test.js +8 -4
- package/dist/__tests__/layout/sidebar-forms-submenu.render.test.js.map +1 -1
- package/dist/__tests__/layout/sidebar-groups.render.test.d.ts +2 -0
- package/dist/__tests__/layout/sidebar-groups.render.test.d.ts.map +1 -0
- package/dist/__tests__/layout/sidebar-groups.render.test.js +56 -0
- package/dist/__tests__/layout/sidebar-groups.render.test.js.map +1 -0
- package/dist/__tests__/layout/sidebar-menus.render.test.d.ts +2 -0
- package/dist/__tests__/layout/sidebar-menus.render.test.d.ts.map +1 -0
- package/dist/__tests__/layout/sidebar-menus.render.test.js +82 -0
- package/dist/__tests__/layout/sidebar-menus.render.test.js.map +1 -0
- package/dist/__tests__/layout/sidebar-plugin-nav.test.js +1 -1
- package/dist/__tests__/layout/sidebar-plugin-nav.test.js.map +1 -1
- package/dist/__tests__/layout/sidebar-posts.test.js +48 -38
- package/dist/__tests__/layout/sidebar-posts.test.js.map +1 -1
- package/dist/__tests__/layout/sidebar-submenu.render.test.js +26 -10
- package/dist/__tests__/layout/sidebar-submenu.render.test.js.map +1 -1
- package/dist/__tests__/layout/topbar.render.test.d.ts +2 -0
- package/dist/__tests__/layout/topbar.render.test.d.ts.map +1 -0
- package/dist/__tests__/layout/topbar.render.test.js +406 -0
- package/dist/__tests__/layout/topbar.render.test.js.map +1 -0
- package/dist/__tests__/lib/api.test.js +2 -0
- package/dist/__tests__/lib/api.test.js.map +1 -1
- package/dist/__tests__/lib/job-drawer.test.d.ts +2 -0
- package/dist/__tests__/lib/job-drawer.test.d.ts.map +1 -0
- package/dist/__tests__/lib/job-drawer.test.js +393 -0
- package/dist/__tests__/lib/job-drawer.test.js.map +1 -0
- package/dist/__tests__/lib/job-view.test.d.ts +2 -0
- package/dist/__tests__/lib/job-view.test.d.ts.map +1 -0
- package/dist/__tests__/lib/job-view.test.js +387 -0
- package/dist/__tests__/lib/job-view.test.js.map +1 -0
- package/dist/__tests__/lib/jobs-service.test.d.ts +2 -0
- package/dist/__tests__/lib/jobs-service.test.d.ts.map +1 -0
- package/dist/__tests__/lib/jobs-service.test.js +88 -0
- package/dist/__tests__/lib/jobs-service.test.js.map +1 -0
- package/dist/__tests__/router/admin-route-order.test.d.ts +2 -0
- package/dist/__tests__/router/admin-route-order.test.d.ts.map +1 -0
- package/dist/__tests__/router/admin-route-order.test.js +36 -0
- package/dist/__tests__/router/admin-route-order.test.js.map +1 -0
- package/dist/__tests__/styles/ai-gradient-contrast.test.d.ts +2 -0
- package/dist/__tests__/styles/ai-gradient-contrast.test.d.ts.map +1 -0
- package/dist/__tests__/styles/ai-gradient-contrast.test.js +110 -0
- package/dist/__tests__/styles/ai-gradient-contrast.test.js.map +1 -0
- package/dist/__tests__/styles/breakpoint-order.test.d.ts +2 -0
- package/dist/__tests__/styles/breakpoint-order.test.d.ts.map +1 -0
- package/dist/__tests__/styles/breakpoint-order.test.js +52 -0
- package/dist/__tests__/styles/breakpoint-order.test.js.map +1 -0
- package/dist/__tests__/styles/responsive-layer.test.js +303 -12
- package/dist/__tests__/styles/responsive-layer.test.js.map +1 -1
- package/dist/__tests__/styles/tailwind-preset.test.d.ts +2 -0
- package/dist/__tests__/styles/tailwind-preset.test.d.ts.map +1 -0
- package/dist/__tests__/styles/tailwind-preset.test.js +147 -0
- package/dist/__tests__/styles/tailwind-preset.test.js.map +1 -0
- package/dist/__tests__/styles/theme-token-scope.test.js +9 -3
- package/dist/__tests__/styles/theme-token-scope.test.js.map +1 -1
- package/dist/__tests__/styles/tiers.test.d.ts +2 -0
- package/dist/__tests__/styles/tiers.test.d.ts.map +1 -0
- package/dist/__tests__/styles/tiers.test.js +121 -0
- package/dist/__tests__/styles/tiers.test.js.map +1 -0
- package/dist/__tests__/styles/tokens-drift.test.js +57 -6
- package/dist/__tests__/styles/tokens-drift.test.js.map +1 -1
- package/dist/__tests__/views/admin-lazy-route.render.test.js +27 -1
- package/dist/__tests__/views/admin-lazy-route.render.test.js.map +1 -1
- package/dist/__tests__/views/ai-settings.render.test.js +4 -4
- package/dist/__tests__/views/appearance-menus-route.render.test.d.ts +2 -0
- package/dist/__tests__/views/appearance-menus-route.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/appearance-menus-route.render.test.js +50 -0
- package/dist/__tests__/views/appearance-menus-route.render.test.js.map +1 -0
- package/dist/__tests__/views/appearance-settings.render.test.js +8 -6
- package/dist/__tests__/views/appearance-settings.render.test.js.map +1 -1
- package/dist/__tests__/views/appearance-theme-provider.render.test.d.ts +2 -0
- package/dist/__tests__/views/appearance-theme-provider.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/appearance-theme-provider.render.test.js +286 -0
- package/dist/__tests__/views/appearance-theme-provider.render.test.js.map +1 -0
- package/dist/__tests__/views/dashboard.test.js +37 -0
- package/dist/__tests__/views/dashboard.test.js.map +1 -1
- package/dist/__tests__/views/document-edit-navigation.render.test.d.ts +2 -0
- package/dist/__tests__/views/document-edit-navigation.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/document-edit-navigation.render.test.js +101 -0
- package/dist/__tests__/views/document-edit-navigation.render.test.js.map +1 -0
- package/dist/__tests__/views/document-edit-routes.render.test.d.ts +2 -0
- package/dist/__tests__/views/document-edit-routes.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/document-edit-routes.render.test.js +113 -0
- package/dist/__tests__/views/document-edit-routes.render.test.js.map +1 -0
- package/dist/__tests__/views/email-settings.render.test.js +2 -2
- package/dist/__tests__/views/form-entries.render.test.js +15 -0
- package/dist/__tests__/views/form-entries.render.test.js.map +1 -1
- package/dist/__tests__/views/form-submissions.render.test.js +18 -0
- package/dist/__tests__/views/form-submissions.render.test.js.map +1 -1
- package/dist/__tests__/views/forms-list.render.test.js +12 -0
- package/dist/__tests__/views/forms-list.render.test.js.map +1 -1
- package/dist/__tests__/views/general-settings.render.test.js +26 -10
- package/dist/__tests__/views/general-settings.render.test.js.map +1 -1
- package/dist/__tests__/views/jobs-drawer.render.test.d.ts +2 -0
- package/dist/__tests__/views/jobs-drawer.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/jobs-drawer.render.test.js +908 -0
- package/dist/__tests__/views/jobs-drawer.render.test.js.map +1 -0
- package/dist/__tests__/views/jobs-list.render.test.d.ts +2 -0
- package/dist/__tests__/views/jobs-list.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/jobs-list.render.test.js +695 -0
- package/dist/__tests__/views/jobs-list.render.test.js.map +1 -0
- package/dist/__tests__/views/kpi-grid.test.d.ts +2 -0
- package/dist/__tests__/views/kpi-grid.test.d.ts.map +1 -0
- package/dist/__tests__/views/kpi-grid.test.js +26 -0
- package/dist/__tests__/views/kpi-grid.test.js.map +1 -0
- package/dist/__tests__/views/mcp-connect.render.test.js +1 -0
- package/dist/__tests__/views/mcp-connect.render.test.js.map +1 -1
- package/dist/__tests__/views/post-section-editor.test.js +3 -1
- package/dist/__tests__/views/post-section-editor.test.js.map +1 -1
- package/dist/__tests__/views/script-tags.render.test.js +25 -0
- package/dist/__tests__/views/script-tags.render.test.js.map +1 -1
- package/dist/__tests__/views/security-settings.render.test.js +9 -8
- package/dist/__tests__/views/security-settings.render.test.js.map +1 -1
- package/dist/__tests__/views/seo-settings.render.test.js +7 -7
- package/dist/__tests__/views/seo-settings.render.test.js.map +1 -1
- package/dist/__tests__/views/settings-save-bar.render.test.d.ts +2 -0
- package/dist/__tests__/views/settings-save-bar.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/settings-save-bar.render.test.js +68 -0
- package/dist/__tests__/views/settings-save-bar.render.test.js.map +1 -0
- package/dist/__tests__/views/settings-save-footer.render.test.js +23 -15
- package/dist/__tests__/views/settings-save-footer.render.test.js.map +1 -1
- package/dist/__tests__/views/settings-tabs.render.test.d.ts +2 -0
- package/dist/__tests__/views/settings-tabs.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/settings-tabs.render.test.js +319 -0
- package/dist/__tests__/views/settings-tabs.render.test.js.map +1 -0
- package/dist/__tests__/views/updates-tab.render.test.js +4 -3
- package/dist/__tests__/views/updates-tab.render.test.js.map +1 -1
- package/dist/components/Breadcrumbs.d.ts +8 -1
- package/dist/components/Breadcrumbs.d.ts.map +1 -1
- package/dist/components/Breadcrumbs.js +6 -0
- package/dist/components/Breadcrumbs.js.map +1 -1
- package/dist/components/CommandPalette.d.ts.map +1 -1
- package/dist/components/CommandPalette.js +40 -4
- package/dist/components/CommandPalette.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/NotificationBell.d.ts.map +1 -1
- package/dist/components/NotificationBell.js +44 -3
- package/dist/components/NotificationBell.js.map +1 -1
- package/dist/components/OfflineStatus.js +1 -1
- package/dist/components/OfflineStatus.js.map +1 -1
- package/dist/components/PresenceIndicator.d.ts.map +1 -1
- package/dist/components/PresenceIndicator.js +2 -1
- package/dist/components/PresenceIndicator.js.map +1 -1
- package/dist/components/ReflowMeter.js +2 -2
- package/dist/components/ReflowMeter.js.map +1 -1
- package/dist/components/SEOPanel.js +2 -2
- package/dist/components/SEOPanel.js.map +1 -1
- package/dist/components/ThemeProvider.d.ts +24 -4
- package/dist/components/ThemeProvider.d.ts.map +1 -1
- package/dist/components/ThemeProvider.js +80 -22
- package/dist/components/ThemeProvider.js.map +1 -1
- package/dist/components/TipTapEditor.d.ts.map +1 -1
- package/dist/components/TipTapEditor.js +3 -4
- package/dist/components/TipTapEditor.js.map +1 -1
- package/dist/components/forms/EmbedPanel.js +1 -1
- package/dist/components/forms/EmbedPanel.js.map +1 -1
- package/dist/components/forms/FormEntryDetailPane.js +6 -1
- package/dist/components/forms/FormEntryDetailPane.js.map +1 -1
- package/dist/components/forms/ShortcodeGlossary.d.ts.map +1 -1
- package/dist/components/forms/ShortcodeGlossary.js +6 -1
- package/dist/components/forms/ShortcodeGlossary.js.map +1 -1
- package/dist/components/forms/primitives.d.ts +15 -5
- package/dist/components/forms/primitives.d.ts.map +1 -1
- package/dist/components/forms/primitives.js +11 -11
- package/dist/components/forms/primitives.js.map +1 -1
- package/dist/components/pages/tag-badges.d.ts +2 -1
- package/dist/components/pages/tag-badges.d.ts.map +1 -1
- package/dist/components/pages/tag-badges.js +4 -3
- package/dist/components/pages/tag-badges.js.map +1 -1
- package/dist/components/seo/PageAuditPanel.js +2 -2
- package/dist/components/seo/PageAuditPanel.js.map +1 -1
- package/dist/components/seo/SerpPreview.d.ts +4 -4
- package/dist/components/seo/SerpPreview.js +1 -1
- package/dist/components/seo/SerpPreview.js.map +1 -1
- package/dist/components/seo/primitives.js +2 -2
- package/dist/components/seo/primitives.js.map +1 -1
- package/dist/components/ui/AuthorAvatar.d.ts +4 -4
- package/dist/components/ui/AuthorAvatar.d.ts.map +1 -1
- package/dist/components/ui/AuthorAvatar.js +11 -10
- package/dist/components/ui/AuthorAvatar.js.map +1 -1
- package/dist/components/ui/Badge.d.ts +1 -1
- package/dist/components/ui/Badge.js +1 -1
- package/dist/components/ui/Badge.js.map +1 -1
- package/dist/components/ui/Breadcrumb.d.ts +27 -0
- package/dist/components/ui/Breadcrumb.d.ts.map +1 -0
- package/dist/components/ui/Breadcrumb.js +41 -0
- package/dist/components/ui/Breadcrumb.js.map +1 -0
- package/dist/components/ui/Button.d.ts +2 -2
- package/dist/components/ui/Button.d.ts.map +1 -1
- package/dist/components/ui/Button.js +31 -16
- package/dist/components/ui/Button.js.map +1 -1
- package/dist/components/ui/Card.d.ts +8 -4
- package/dist/components/ui/Card.d.ts.map +1 -1
- package/dist/components/ui/Card.js +21 -13
- package/dist/components/ui/Card.js.map +1 -1
- package/dist/components/ui/CardListControls.d.ts +34 -0
- package/dist/components/ui/CardListControls.d.ts.map +1 -0
- package/dist/components/ui/CardListControls.js +25 -0
- package/dist/components/ui/CardListControls.js.map +1 -0
- package/dist/components/ui/CountChip.d.ts +20 -0
- package/dist/components/ui/CountChip.d.ts.map +1 -0
- package/dist/components/ui/CountChip.js +48 -0
- package/dist/components/ui/CountChip.js.map +1 -0
- package/dist/components/ui/FilterPill.d.ts +2 -1
- package/dist/components/ui/FilterPill.d.ts.map +1 -1
- package/dist/components/ui/FilterPill.js +3 -2
- package/dist/components/ui/FilterPill.js.map +1 -1
- package/dist/components/ui/Input.d.ts +1 -1
- package/dist/components/ui/InspectorPane.d.ts +1 -1
- package/dist/components/ui/InspectorPane.d.ts.map +1 -1
- package/dist/components/ui/InspectorPane.js +15 -4
- package/dist/components/ui/InspectorPane.js.map +1 -1
- package/dist/components/ui/Modal.d.ts.map +1 -1
- package/dist/components/ui/Modal.js +10 -2
- package/dist/components/ui/Modal.js.map +1 -1
- package/dist/components/ui/PageHeader.d.ts +28 -0
- package/dist/components/ui/PageHeader.d.ts.map +1 -0
- package/dist/components/ui/PageHeader.js +18 -0
- package/dist/components/ui/PageHeader.js.map +1 -0
- package/dist/components/ui/RowActions.d.ts +5 -0
- package/dist/components/ui/RowActions.d.ts.map +1 -1
- package/dist/components/ui/RowActions.js +7 -2
- package/dist/components/ui/RowActions.js.map +1 -1
- package/dist/components/ui/Segmented.d.ts +21 -0
- package/dist/components/ui/Segmented.d.ts.map +1 -0
- package/dist/components/ui/Segmented.js +41 -0
- package/dist/components/ui/Segmented.js.map +1 -0
- package/dist/components/ui/Toaster.d.ts +12 -0
- package/dist/components/ui/Toaster.d.ts.map +1 -0
- package/dist/components/ui/Toaster.js +103 -0
- package/dist/components/ui/Toaster.js.map +1 -0
- package/dist/components/ui/Toggle.d.ts +4 -3
- package/dist/components/ui/Toggle.d.ts.map +1 -1
- package/dist/components/ui/Toggle.js +16 -12
- package/dist/components/ui/Toggle.js.map +1 -1
- package/dist/components/ui/UnderlineTabs.d.ts +56 -0
- package/dist/components/ui/UnderlineTabs.d.ts.map +1 -0
- package/dist/components/ui/UnderlineTabs.js +205 -0
- package/dist/components/ui/UnderlineTabs.js.map +1 -0
- package/dist/components/ui/UnsavedBar.d.ts +25 -0
- package/dist/components/ui/UnsavedBar.d.ts.map +1 -0
- package/dist/components/ui/UnsavedBar.js +22 -0
- package/dist/components/ui/UnsavedBar.js.map +1 -0
- package/dist/components/ui/admin-links.d.ts +11 -0
- package/dist/components/ui/admin-links.d.ts.map +1 -0
- package/dist/components/ui/admin-links.js +10 -0
- package/dist/components/ui/admin-links.js.map +1 -0
- package/dist/components/ui/card-table.d.ts +43 -0
- package/dist/components/ui/card-table.d.ts.map +1 -0
- package/dist/components/ui/card-table.js +31 -0
- package/dist/components/ui/card-table.js.map +1 -0
- package/dist/components/virtual-window.d.ts +7 -0
- package/dist/components/virtual-window.d.ts.map +1 -1
- package/dist/components/virtual-window.js +5 -2
- package/dist/components/virtual-window.js.map +1 -1
- package/dist/fields/RelationshipField.js +1 -1
- package/dist/fields/RelationshipField.js.map +1 -1
- package/dist/files/dm-mono-latin-400-normal.woff +0 -0
- package/dist/files/dm-mono-latin-400-normal.woff2 +0 -0
- package/dist/files/dm-mono-latin-500-normal.woff +0 -0
- package/dist/files/dm-mono-latin-500-normal.woff2 +0 -0
- package/dist/files/dm-mono-latin-ext-400-normal.woff +0 -0
- package/dist/files/dm-mono-latin-ext-400-normal.woff2 +0 -0
- package/dist/files/dm-mono-latin-ext-500-normal.woff +0 -0
- package/dist/files/dm-mono-latin-ext-500-normal.woff2 +0 -0
- package/dist/files/dm-sans-latin-400-normal.woff +0 -0
- package/dist/files/dm-sans-latin-400-normal.woff2 +0 -0
- package/dist/files/dm-sans-latin-500-normal.woff +0 -0
- package/dist/files/dm-sans-latin-500-normal.woff2 +0 -0
- package/dist/files/dm-sans-latin-600-normal.woff +0 -0
- package/dist/files/dm-sans-latin-600-normal.woff2 +0 -0
- package/dist/files/dm-sans-latin-700-normal.woff +0 -0
- package/dist/files/dm-sans-latin-700-normal.woff2 +0 -0
- package/dist/files/dm-sans-latin-ext-400-normal.woff +0 -0
- package/dist/files/dm-sans-latin-ext-400-normal.woff2 +0 -0
- package/dist/files/dm-sans-latin-ext-500-normal.woff +0 -0
- package/dist/files/dm-sans-latin-ext-500-normal.woff2 +0 -0
- package/dist/files/dm-sans-latin-ext-600-normal.woff +0 -0
- package/dist/files/dm-sans-latin-ext-600-normal.woff2 +0 -0
- package/dist/files/dm-sans-latin-ext-700-normal.woff +0 -0
- package/dist/files/dm-sans-latin-ext-700-normal.woff2 +0 -0
- package/dist/hooks/useAppearanceBootstrap.d.ts.map +1 -1
- package/dist/hooks/useAppearanceBootstrap.js +9 -3
- package/dist/hooks/useAppearanceBootstrap.js.map +1 -1
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/layout/Header.d.ts +14 -5
- package/dist/layout/Header.d.ts.map +1 -1
- package/dist/layout/Header.js +78 -13
- package/dist/layout/Header.js.map +1 -1
- package/dist/layout/Layout.d.ts +5 -3
- package/dist/layout/Layout.d.ts.map +1 -1
- package/dist/layout/Layout.js +45 -54
- package/dist/layout/Layout.js.map +1 -1
- package/dist/layout/MobileTabBar.d.ts +20 -0
- package/dist/layout/MobileTabBar.d.ts.map +1 -0
- package/dist/layout/MobileTabBar.js +29 -0
- package/dist/layout/MobileTabBar.js.map +1 -0
- package/dist/layout/Sidebar.d.ts +8 -26
- package/dist/layout/Sidebar.d.ts.map +1 -1
- package/dist/layout/Sidebar.js +309 -345
- package/dist/layout/Sidebar.js.map +1 -1
- package/dist/layout/nav-config.d.ts +101 -0
- package/dist/layout/nav-config.d.ts.map +1 -0
- package/dist/layout/nav-config.js +297 -0
- package/dist/layout/nav-config.js.map +1 -0
- package/dist/layout/primitives/AdminShell.d.ts +10 -2
- package/dist/layout/primitives/AdminShell.d.ts.map +1 -1
- package/dist/layout/primitives/AdminShell.js +114 -6
- package/dist/layout/primitives/AdminShell.js.map +1 -1
- package/dist/layout/topbar-classes.d.ts +8 -0
- package/dist/layout/topbar-classes.d.ts.map +1 -0
- package/dist/layout/topbar-classes.js +8 -0
- package/dist/layout/topbar-classes.js.map +1 -0
- package/dist/layout/use-nav-items.d.ts +10 -0
- package/dist/layout/use-nav-items.d.ts.map +1 -0
- package/dist/layout/use-nav-items.js +39 -0
- package/dist/layout/use-nav-items.js.map +1 -0
- package/dist/lib/api.d.ts +6 -0
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +1 -1
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/appearance-api.d.ts +3 -1
- package/dist/lib/appearance-api.d.ts.map +1 -1
- package/dist/lib/appearance-api.js +1 -0
- package/dist/lib/appearance-api.js.map +1 -1
- package/dist/lib/job-drawer.d.ts +128 -0
- package/dist/lib/job-drawer.d.ts.map +1 -0
- package/dist/lib/job-drawer.js +351 -0
- package/dist/lib/job-drawer.js.map +1 -0
- package/dist/lib/job-view.d.ts +187 -0
- package/dist/lib/job-view.d.ts.map +1 -0
- package/dist/lib/job-view.js +363 -0
- package/dist/lib/job-view.js.map +1 -0
- package/dist/lib/jobs-service.d.ts +134 -0
- package/dist/lib/jobs-service.d.ts.map +1 -0
- package/dist/lib/jobs-service.js +179 -0
- package/dist/lib/jobs-service.js.map +1 -0
- package/dist/lib/sheet-focus.d.ts +24 -0
- package/dist/lib/sheet-focus.d.ts.map +1 -0
- package/dist/lib/sheet-focus.js +61 -0
- package/dist/lib/sheet-focus.js.map +1 -0
- package/dist/lib/tiers.d.ts +30 -0
- package/dist/lib/tiers.d.ts.map +1 -0
- package/dist/lib/tiers.js +43 -0
- package/dist/lib/tiers.js.map +1 -0
- package/dist/prenta-admin.css +1 -1
- package/dist/router/admin-routes.d.ts.map +1 -1
- package/dist/router/admin-routes.js +8 -0
- package/dist/router/admin-routes.js.map +1 -1
- package/dist/router/index.d.ts +5 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +7 -0
- package/dist/router/index.js.map +1 -1
- package/dist/views/ApiKeys.js +2 -2
- package/dist/views/ApiKeys.js.map +1 -1
- package/dist/views/AppearanceChrome.d.ts +6 -0
- package/dist/views/AppearanceChrome.d.ts.map +1 -0
- package/dist/views/AppearanceChrome.js +25 -0
- package/dist/views/AppearanceChrome.js.map +1 -0
- package/dist/views/CollectionList.d.ts.map +1 -1
- package/dist/views/CollectionList.js +73 -53
- package/dist/views/CollectionList.js.map +1 -1
- package/dist/views/Dashboard.d.ts.map +1 -1
- package/dist/views/Dashboard.js +14 -8
- package/dist/views/Dashboard.js.map +1 -1
- package/dist/views/DocumentEdit.d.ts +6 -1
- package/dist/views/DocumentEdit.d.ts.map +1 -1
- package/dist/views/DocumentEdit.js +44 -8
- package/dist/views/DocumentEdit.js.map +1 -1
- package/dist/views/FormDeliveries.d.ts.map +1 -1
- package/dist/views/FormDeliveries.js +7 -1
- package/dist/views/FormDeliveries.js.map +1 -1
- package/dist/views/FormEntries.d.ts.map +1 -1
- package/dist/views/FormEntries.js +11 -2
- package/dist/views/FormEntries.js.map +1 -1
- package/dist/views/FormSubmissions.d.ts +1 -1
- package/dist/views/FormSubmissions.d.ts.map +1 -1
- package/dist/views/FormSubmissions.js +15 -4
- package/dist/views/FormSubmissions.js.map +1 -1
- package/dist/views/Forms.d.ts.map +1 -1
- package/dist/views/Forms.js +6 -4
- package/dist/views/Forms.js.map +1 -1
- package/dist/views/FormsSettings.d.ts +2 -0
- package/dist/views/FormsSettings.d.ts.map +1 -0
- package/dist/views/FormsSettings.js +37 -0
- package/dist/views/FormsSettings.js.map +1 -0
- package/dist/views/Jobs/BusyButton.d.ts +15 -0
- package/dist/views/Jobs/BusyButton.d.ts.map +1 -0
- package/dist/views/Jobs/BusyButton.js +26 -0
- package/dist/views/Jobs/BusyButton.js.map +1 -0
- package/dist/views/Jobs/CancelJobDialog.d.ts +21 -0
- package/dist/views/Jobs/CancelJobDialog.d.ts.map +1 -0
- package/dist/views/Jobs/CancelJobDialog.js +66 -0
- package/dist/views/Jobs/CancelJobDialog.js.map +1 -0
- package/dist/views/Jobs/DrawerActivity.d.ts +16 -0
- package/dist/views/Jobs/DrawerActivity.d.ts.map +1 -0
- package/dist/views/Jobs/DrawerActivity.js +59 -0
- package/dist/views/Jobs/DrawerActivity.js.map +1 -0
- package/dist/views/Jobs/DrawerOverview.d.ts +28 -0
- package/dist/views/Jobs/DrawerOverview.d.ts.map +1 -0
- package/dist/views/Jobs/DrawerOverview.js +32 -0
- package/dist/views/Jobs/DrawerOverview.js.map +1 -0
- package/dist/views/Jobs/DrawerResults.d.ts +25 -0
- package/dist/views/Jobs/DrawerResults.d.ts.map +1 -0
- package/dist/views/Jobs/DrawerResults.js +50 -0
- package/dist/views/Jobs/DrawerResults.js.map +1 -0
- package/dist/views/Jobs/DrawerReview.d.ts +44 -0
- package/dist/views/Jobs/DrawerReview.d.ts.map +1 -0
- package/dist/views/Jobs/DrawerReview.js +110 -0
- package/dist/views/Jobs/DrawerReview.js.map +1 -0
- package/dist/views/Jobs/JobDrawer.d.ts +31 -0
- package/dist/views/Jobs/JobDrawer.d.ts.map +1 -0
- package/dist/views/Jobs/JobDrawer.js +353 -0
- package/dist/views/Jobs/JobDrawer.js.map +1 -0
- package/dist/views/Jobs/JobsTable.d.ts +19 -0
- package/dist/views/Jobs/JobsTable.d.ts.map +1 -0
- package/dist/views/Jobs/JobsTable.js +80 -0
- package/dist/views/Jobs/JobsTable.js.map +1 -0
- package/dist/views/Jobs/WorkerStrip.d.ts +22 -0
- package/dist/views/Jobs/WorkerStrip.d.ts.map +1 -0
- package/dist/views/Jobs/WorkerStrip.js +63 -0
- package/dist/views/Jobs/WorkerStrip.js.map +1 -0
- package/dist/views/Jobs/atoms.d.ts +19 -0
- package/dist/views/Jobs/atoms.d.ts.map +1 -0
- package/dist/views/Jobs/atoms.js +52 -0
- package/dist/views/Jobs/atoms.js.map +1 -0
- package/dist/views/Jobs/focus.d.ts +23 -0
- package/dist/views/Jobs/focus.d.ts.map +1 -0
- package/dist/views/Jobs/focus.js +54 -0
- package/dist/views/Jobs/focus.js.map +1 -0
- package/dist/views/Jobs/icons.d.ts +22 -0
- package/dist/views/Jobs/icons.d.ts.map +1 -0
- package/dist/views/Jobs/icons.js +23 -0
- package/dist/views/Jobs/icons.js.map +1 -0
- package/dist/views/Jobs/placeholders.d.ts +6 -0
- package/dist/views/Jobs/placeholders.d.ts.map +1 -0
- package/dist/views/Jobs/placeholders.js +20 -0
- package/dist/views/Jobs/placeholders.js.map +1 -0
- package/dist/views/Jobs/useJobDetail.d.ts +21 -0
- package/dist/views/Jobs/useJobDetail.d.ts.map +1 -0
- package/dist/views/Jobs/useJobDetail.js +39 -0
- package/dist/views/Jobs/useJobDetail.js.map +1 -0
- package/dist/views/Jobs/useJobsFeed.d.ts +35 -0
- package/dist/views/Jobs/useJobsFeed.d.ts.map +1 -0
- package/dist/views/Jobs/useJobsFeed.js +231 -0
- package/dist/views/Jobs/useJobsFeed.js.map +1 -0
- package/dist/views/Jobs/useReviewItems.d.ts +39 -0
- package/dist/views/Jobs/useReviewItems.d.ts.map +1 -0
- package/dist/views/Jobs/useReviewItems.js +140 -0
- package/dist/views/Jobs/useReviewItems.js.map +1 -0
- package/dist/views/Jobs.d.ts +10 -1
- package/dist/views/Jobs.d.ts.map +1 -1
- package/dist/views/Jobs.js +126 -35
- package/dist/views/Jobs.js.map +1 -1
- package/dist/views/MediaBrowser.d.ts.map +1 -1
- package/dist/views/MediaBrowser.js +37 -9
- package/dist/views/MediaBrowser.js.map +1 -1
- package/dist/views/Pages/PagesListView.d.ts +1 -1
- package/dist/views/Pages/PagesListView.d.ts.map +1 -1
- package/dist/views/Pages/PagesListView.js +34 -5
- package/dist/views/Pages/PagesListView.js.map +1 -1
- package/dist/views/Posts/NewPostTypeInstructions.d.ts.map +1 -1
- package/dist/views/Posts/NewPostTypeInstructions.js +12 -2
- package/dist/views/Posts/NewPostTypeInstructions.js.map +1 -1
- package/dist/views/Posts/PostTypesView.d.ts.map +1 -1
- package/dist/views/Posts/PostTypesView.js +10 -1
- package/dist/views/Posts/PostTypesView.js.map +1 -1
- package/dist/views/Posts/PostsListView.d.ts +1 -2
- package/dist/views/Posts/PostsListView.d.ts.map +1 -1
- package/dist/views/Posts/PostsListView.js +31 -3
- package/dist/views/Posts/PostsListView.js.map +1 -1
- package/dist/views/SEO.d.ts.map +1 -1
- package/dist/views/SEO.js +3 -3
- package/dist/views/SEO.js.map +1 -1
- package/dist/views/ScriptTags.d.ts.map +1 -1
- package/dist/views/ScriptTags.js +20 -15
- package/dist/views/ScriptTags.js.map +1 -1
- package/dist/views/Settings.d.ts.map +1 -1
- package/dist/views/Settings.js +115 -51
- package/dist/views/Settings.js.map +1 -1
- package/dist/views/SpamFolder.d.ts +2 -0
- package/dist/views/SpamFolder.d.ts.map +1 -0
- package/dist/views/SpamFolder.js +14 -0
- package/dist/views/SpamFolder.js.map +1 -0
- package/dist/views/Trash.d.ts +6 -1
- package/dist/views/Trash.d.ts.map +1 -1
- package/dist/views/Trash.js +7 -2
- package/dist/views/Trash.js.map +1 -1
- package/dist/views/Users.js +2 -2
- package/dist/views/Users.js.map +1 -1
- package/dist/views/WidgetsPlaceholder.d.ts +2 -0
- package/dist/views/WidgetsPlaceholder.d.ts.map +1 -0
- package/dist/views/WidgetsPlaceholder.js +15 -0
- package/dist/views/WidgetsPlaceholder.js.map +1 -0
- package/dist/views/dashboard/kpi-grid.d.ts +18 -0
- package/dist/views/dashboard/kpi-grid.d.ts.map +1 -0
- package/dist/views/dashboard/kpi-grid.js +36 -0
- package/dist/views/dashboard/kpi-grid.js.map +1 -0
- package/dist/views/lazy-views.d.ts +4 -0
- package/dist/views/lazy-views.d.ts.map +1 -1
- package/dist/views/lazy-views.js +4 -0
- package/dist/views/lazy-views.js.map +1 -1
- package/dist/views/page-editor/PageTab.js +1 -1
- package/dist/views/page-editor/PageTab.js.map +1 -1
- package/dist/views/page-editor/ReviewBar.js +1 -1
- package/dist/views/page-editor/ReviewBar.js.map +1 -1
- package/dist/views/page-editor/VersionHistoryPanel.js +1 -1
- package/dist/views/page-editor/VersionHistoryPanel.js.map +1 -1
- package/dist/views/seo/AuditTab.js +1 -1
- package/dist/views/seo/AuditTab.js.map +1 -1
- package/dist/views/seo/OverviewTab.d.ts.map +1 -1
- package/dist/views/seo/OverviewTab.js +2 -2
- package/dist/views/seo/OverviewTab.js.map +1 -1
- package/dist/views/seo/ProposalsTab.js +1 -1
- package/dist/views/seo/ProposalsTab.js.map +1 -1
- package/dist/views/settings/AISettingsTab.d.ts.map +1 -1
- package/dist/views/settings/AISettingsTab.js +4 -2
- package/dist/views/settings/AISettingsTab.js.map +1 -1
- package/dist/views/settings/AccessProtectionCard.js +1 -1
- package/dist/views/settings/AccessProtectionCard.js.map +1 -1
- package/dist/views/settings/AdminThemeCard.d.ts.map +1 -1
- package/dist/views/settings/AdminThemeCard.js +63 -15
- package/dist/views/settings/AdminThemeCard.js.map +1 -1
- package/dist/views/settings/AppearanceTab.d.ts.map +1 -1
- package/dist/views/settings/AppearanceTab.js +4 -2
- package/dist/views/settings/AppearanceTab.js.map +1 -1
- package/dist/views/settings/BrandPreviewCard.js +1 -1
- package/dist/views/settings/BrandPreviewCard.js.map +1 -1
- package/dist/views/settings/BrandVoiceCard.js +1 -1
- package/dist/views/settings/BrandVoiceCard.js.map +1 -1
- package/dist/views/settings/EmailSettingsTab.d.ts.map +1 -1
- package/dist/views/settings/EmailSettingsTab.js +5 -3
- package/dist/views/settings/EmailSettingsTab.js.map +1 -1
- package/dist/views/settings/GeneralSettingsTab.d.ts.map +1 -1
- package/dist/views/settings/GeneralSettingsTab.js +4 -2
- package/dist/views/settings/GeneralSettingsTab.js.map +1 -1
- package/dist/views/settings/McpConnectTab.d.ts.map +1 -1
- package/dist/views/settings/McpConnectTab.js +1 -1
- package/dist/views/settings/McpConnectTab.js.map +1 -1
- package/dist/views/settings/ProviderConnectionCard.js +1 -1
- package/dist/views/settings/ProviderConnectionCard.js.map +1 -1
- package/dist/views/settings/SearchDataCard.js +1 -1
- package/dist/views/settings/SearchDataCard.js.map +1 -1
- package/dist/views/settings/SecurityStatusCard.js +2 -2
- package/dist/views/settings/SecurityStatusCard.js.map +1 -1
- package/dist/views/settings/SecurityTab.d.ts.map +1 -1
- package/dist/views/settings/SecurityTab.js +4 -2
- package/dist/views/settings/SecurityTab.js.map +1 -1
- package/dist/views/settings/SeoAutopilotCard.js +2 -2
- package/dist/views/settings/SeoAutopilotCard.js.map +1 -1
- package/dist/views/settings/SeoSettingsTab.d.ts.map +1 -1
- package/dist/views/settings/SeoSettingsTab.js +5 -3
- package/dist/views/settings/SeoSettingsTab.js.map +1 -1
- package/dist/views/settings/SiteIndexStatusCard.js +1 -1
- package/dist/views/settings/SiteIndexStatusCard.js.map +1 -1
- package/dist/views/settings/SiteThemeCard.js +1 -1
- package/dist/views/settings/UpdatesTab.d.ts.map +1 -1
- package/dist/views/settings/UpdatesTab.js +6 -5
- package/dist/views/settings/UpdatesTab.js.map +1 -1
- package/dist/views/settings/components.d.ts +7 -11
- package/dist/views/settings/components.d.ts.map +1 -1
- package/dist/views/settings/components.js +18 -12
- package/dist/views/settings/components.js.map +1 -1
- package/dist/views/settings/useAppearanceSettings.d.ts +7 -1
- package/dist/views/settings/useAppearanceSettings.d.ts.map +1 -1
- package/dist/views/settings/useAppearanceSettings.js +89 -22
- package/dist/views/settings/useAppearanceSettings.js.map +1 -1
- package/dist/views/users/UserDetailDrawer.js +1 -1
- package/dist/views/users/UserDetailDrawer.js.map +1 -1
- package/package.json +11 -9
- package/src/AdminRoot.tsx +88 -30
- package/src/LoginRoot.tsx +2 -1
- package/src/__tests__/components/author-avatar.test.tsx +3 -20
- package/src/__tests__/components/notification-bell.test.tsx +146 -14
- package/src/__tests__/components/responsive-tiers.render.test.tsx +461 -0
- package/src/__tests__/components/serp-preview.render.test.tsx +6 -3
- package/src/__tests__/components/shell-primitives.render.test.tsx +951 -0
- package/src/__tests__/components/theme-provider-accent.test.tsx +83 -8
- package/src/__tests__/components/toggle.test.tsx +11 -3
- package/src/__tests__/components/ui-primitives.test.tsx +5 -8
- package/src/__tests__/layout/build-nav-items.test.ts +1 -1
- package/src/__tests__/layout/shell-nav.render.test.tsx +983 -0
- package/src/__tests__/layout/sidebar-forms-submenu.render.test.tsx +8 -4
- package/src/__tests__/layout/sidebar-groups.render.test.tsx +116 -0
- package/src/__tests__/layout/sidebar-menus.render.test.tsx +116 -0
- package/src/__tests__/layout/sidebar-plugin-nav.test.ts +1 -1
- package/src/__tests__/layout/sidebar-posts.test.ts +48 -40
- package/src/__tests__/layout/sidebar-submenu.render.test.tsx +35 -10
- package/src/__tests__/layout/topbar.render.test.tsx +464 -0
- package/src/__tests__/lib/api.test.ts +2 -0
- package/src/__tests__/lib/job-drawer.test.ts +493 -0
- package/src/__tests__/lib/job-view.test.ts +437 -0
- package/src/__tests__/lib/jobs-service.test.ts +98 -0
- package/src/__tests__/router/admin-route-order.test.ts +39 -0
- package/src/__tests__/styles/ai-gradient-contrast.test.ts +135 -0
- package/src/__tests__/styles/breakpoint-order.test.ts +68 -0
- package/src/__tests__/styles/responsive-layer.test.ts +367 -12
- package/src/__tests__/styles/tailwind-preset.test.ts +154 -0
- package/src/__tests__/styles/theme-token-scope.test.ts +10 -3
- package/src/__tests__/styles/tiers.test.ts +136 -0
- package/src/__tests__/styles/tokens-drift.test.ts +67 -6
- package/src/__tests__/views/admin-lazy-route.render.test.tsx +41 -1
- package/src/__tests__/views/ai-settings.render.test.tsx +4 -4
- package/src/__tests__/views/appearance-menus-route.render.test.tsx +58 -0
- package/src/__tests__/views/appearance-settings.render.test.tsx +10 -8
- package/src/__tests__/views/appearance-theme-provider.render.test.tsx +347 -0
- package/src/__tests__/views/dashboard.test.tsx +48 -0
- package/src/__tests__/views/document-edit-navigation.render.test.tsx +130 -0
- package/src/__tests__/views/document-edit-routes.render.test.tsx +130 -0
- package/src/__tests__/views/email-settings.render.test.tsx +2 -2
- package/src/__tests__/views/form-entries.render.test.tsx +22 -0
- package/src/__tests__/views/form-submissions.render.test.tsx +22 -0
- package/src/__tests__/views/forms-list.render.test.tsx +13 -0
- package/src/__tests__/views/general-settings.render.test.tsx +38 -11
- package/src/__tests__/views/jobs-drawer.render.test.tsx +1047 -0
- package/src/__tests__/views/jobs-list.render.test.tsx +850 -0
- package/src/__tests__/views/kpi-grid.test.ts +29 -0
- package/src/__tests__/views/mcp-connect.render.test.tsx +1 -0
- package/src/__tests__/views/post-section-editor.test.tsx +5 -1
- package/src/__tests__/views/script-tags.render.test.tsx +29 -0
- package/src/__tests__/views/security-settings.render.test.tsx +9 -10
- package/src/__tests__/views/seo-settings.render.test.tsx +7 -9
- package/src/__tests__/views/settings-save-bar.render.test.tsx +91 -0
- package/src/__tests__/views/settings-save-footer.render.test.tsx +25 -15
- package/src/__tests__/views/settings-tabs.render.test.tsx +371 -0
- package/src/__tests__/views/updates-tab.render.test.tsx +4 -3
- package/src/components/Breadcrumbs.tsx +7 -1
- package/src/components/CommandPalette.tsx +51 -3
- package/src/components/LocaleSwitcher.tsx +5 -6
- package/src/components/NotificationBell.tsx +74 -18
- package/src/components/OfflineStatus.tsx +1 -1
- package/src/components/PresenceIndicator.tsx +2 -1
- package/src/components/ReflowMeter.tsx +3 -3
- package/src/components/SEOPanel.tsx +2 -2
- package/src/components/ThemeProvider.tsx +122 -42
- package/src/components/TipTapEditor.tsx +3 -4
- package/src/components/forms/EmbedPanel.tsx +1 -1
- package/src/components/forms/FormEntryDetailPane.tsx +7 -1
- package/src/components/forms/ShortcodeGlossary.tsx +7 -1
- package/src/components/forms/primitives.tsx +37 -21
- package/src/components/pages/tag-badges.tsx +4 -3
- package/src/components/seo/PageAuditPanel.tsx +2 -2
- package/src/components/seo/SerpPreview.tsx +5 -5
- package/src/components/seo/primitives.tsx +2 -2
- package/src/components/ui/AuthorAvatar.tsx +11 -10
- package/src/components/ui/Badge.tsx +1 -1
- package/src/components/ui/Breadcrumb.tsx +109 -0
- package/src/components/ui/Button.tsx +40 -15
- package/src/components/ui/Card.tsx +35 -32
- package/src/components/ui/CardListControls.tsx +90 -0
- package/src/components/ui/CountChip.tsx +90 -0
- package/src/components/ui/FilterPill.tsx +5 -3
- package/src/components/ui/InspectorPane.tsx +21 -7
- package/src/components/ui/Modal.tsx +20 -6
- package/src/components/ui/PageHeader.tsx +63 -0
- package/src/components/ui/RowActions.tsx +7 -2
- package/src/components/ui/Segmented.tsx +97 -0
- package/src/components/ui/Toaster.tsx +139 -0
- package/src/components/ui/Toggle.tsx +18 -14
- package/src/components/ui/UnderlineTabs.tsx +373 -0
- package/src/components/ui/UnsavedBar.tsx +119 -0
- package/src/components/ui/admin-links.tsx +20 -0
- package/src/components/ui/card-table.ts +34 -0
- package/src/components/virtual-window.tsx +13 -2
- package/src/fields/RelationshipField.tsx +1 -1
- package/src/hooks/useAppearanceBootstrap.ts +9 -3
- package/src/index.ts +19 -0
- package/src/layout/Header.tsx +210 -135
- package/src/layout/Layout.tsx +61 -108
- package/src/layout/MobileTabBar.tsx +92 -0
- package/src/layout/Sidebar.tsx +555 -593
- package/src/layout/nav-config.tsx +425 -0
- package/src/layout/primitives/AdminShell.tsx +154 -6
- package/src/layout/topbar-classes.ts +8 -0
- package/src/layout/use-nav-items.ts +40 -0
- package/src/lib/api.ts +7 -1
- package/src/lib/appearance-api.ts +4 -0
- package/src/lib/job-drawer.ts +424 -0
- package/src/lib/job-view.ts +456 -0
- package/src/lib/jobs-service.ts +290 -0
- package/src/lib/sheet-focus.ts +71 -0
- package/src/lib/tiers.ts +43 -0
- package/src/router/admin-routes.ts +8 -0
- package/src/router/index.ts +9 -1
- package/src/styles/prenta-tokens.css +263 -82
- package/src/styles/responsive.css +460 -22
- package/src/styles/theme.css +177 -28
- package/src/views/ApiKeys.tsx +2 -2
- package/src/views/AppearanceChrome.tsx +74 -0
- package/src/views/CollectionList.tsx +264 -205
- package/src/views/Dashboard.tsx +26 -13
- package/src/views/DocumentEdit.tsx +111 -56
- package/src/views/FormDeliveries.tsx +30 -17
- package/src/views/FormEntries.tsx +28 -20
- package/src/views/FormSubmissions.tsx +32 -34
- package/src/views/Forms.tsx +55 -34
- package/src/views/FormsSettings.tsx +94 -0
- package/src/views/Jobs/BusyButton.tsx +56 -0
- package/src/views/Jobs/CancelJobDialog.tsx +127 -0
- package/src/views/Jobs/DrawerActivity.tsx +142 -0
- package/src/views/Jobs/DrawerOverview.tsx +139 -0
- package/src/views/Jobs/DrawerResults.tsx +155 -0
- package/src/views/Jobs/DrawerReview.tsx +464 -0
- package/src/views/Jobs/JobDrawer.tsx +556 -0
- package/src/views/Jobs/JobsTable.tsx +260 -0
- package/src/views/Jobs/WorkerStrip.tsx +144 -0
- package/src/views/Jobs/atoms.tsx +93 -0
- package/src/views/Jobs/focus.ts +56 -0
- package/src/views/Jobs/icons.tsx +111 -0
- package/src/views/Jobs/placeholders.tsx +66 -0
- package/src/views/Jobs/useJobDetail.ts +64 -0
- package/src/views/Jobs/useJobsFeed.ts +249 -0
- package/src/views/Jobs/useReviewItems.ts +187 -0
- package/src/views/Jobs.tsx +282 -105
- package/src/views/MediaBrowser.tsx +71 -21
- package/src/views/Pages/PagesListView.tsx +115 -39
- package/src/views/Posts/NewPostTypeInstructions.tsx +15 -10
- package/src/views/Posts/PostTypesView.tsx +28 -6
- package/src/views/Posts/PostsListView.tsx +130 -40
- package/src/views/SEO.tsx +23 -8
- package/src/views/ScriptTags.tsx +233 -153
- package/src/views/Settings.tsx +215 -256
- package/src/views/SpamFolder.tsx +32 -0
- package/src/views/Trash.tsx +12 -1
- package/src/views/Users.tsx +2 -2
- package/src/views/WidgetsPlaceholder.tsx +33 -0
- package/src/views/dashboard/kpi-grid.ts +38 -0
- package/src/views/lazy-views.tsx +12 -0
- package/src/views/page-editor/PageTab.tsx +2 -2
- package/src/views/page-editor/ReviewBar.tsx +1 -1
- package/src/views/page-editor/VersionHistoryPanel.tsx +1 -1
- package/src/views/seo/AuditTab.tsx +1 -1
- package/src/views/seo/OverviewTab.tsx +6 -5
- package/src/views/seo/ProposalsTab.tsx +1 -1
- package/src/views/settings/AISettingsTab.tsx +10 -6
- package/src/views/settings/AccessProtectionCard.tsx +1 -1
- package/src/views/settings/AdminThemeCard.tsx +228 -35
- package/src/views/settings/AppearanceTab.tsx +10 -6
- package/src/views/settings/BrandPreviewCard.tsx +1 -1
- package/src/views/settings/BrandVoiceCard.tsx +1 -1
- package/src/views/settings/EmailSettingsTab.tsx +11 -7
- package/src/views/settings/GeneralSettingsTab.tsx +10 -6
- package/src/views/settings/McpConnectTab.tsx +2 -1
- package/src/views/settings/ProviderConnectionCard.tsx +1 -1
- package/src/views/settings/SearchDataCard.tsx +1 -1
- package/src/views/settings/SecurityStatusCard.tsx +2 -2
- package/src/views/settings/SecurityTab.tsx +10 -6
- package/src/views/settings/SeoAutopilotCard.tsx +2 -2
- package/src/views/settings/SeoSettingsTab.tsx +13 -9
- package/src/views/settings/SiteIndexStatusCard.tsx +1 -1
- package/src/views/settings/SiteThemeCard.tsx +1 -1
- package/src/views/settings/UpdatesTab.tsx +107 -101
- package/src/views/settings/components.tsx +26 -62
- package/src/views/settings/useAppearanceSettings.ts +116 -25
- package/src/views/users/UserDetailDrawer.tsx +1 -1
- package/dist/components/ui/StatPill.d.ts +0 -18
- package/dist/components/ui/StatPill.d.ts.map +0 -1
- package/dist/components/ui/StatPill.js +0 -5
- package/dist/components/ui/StatPill.js.map +0 -1
- package/src/components/ui/StatPill.tsx +0 -37
package/src/views/Settings.tsx
CHANGED
|
@@ -1,18 +1,7 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
Bot,
|
|
6
|
-
Loader2,
|
|
7
|
-
AlertTriangle,
|
|
8
|
-
Download,
|
|
9
|
-
Layers,
|
|
10
|
-
Mail,
|
|
11
|
-
Users as UsersIcon,
|
|
12
|
-
KeyRound,
|
|
13
|
-
Plug,
|
|
14
|
-
} from 'lucide-react'
|
|
15
|
-
import { useState, useEffect, useCallback, useMemo } from 'react'
|
|
3
|
+
import { Loader2, AlertTriangle } from 'lucide-react'
|
|
4
|
+
import { useState, useEffect, useCallback, useMemo, type ReactNode } from 'react'
|
|
16
5
|
import { toast } from 'sonner'
|
|
17
6
|
import { parseRouteQuery } from '../router/index.js'
|
|
18
7
|
import { useApiData } from '../lib/useApiData.js'
|
|
@@ -25,6 +14,10 @@ import { EmailSettingsTab } from './settings/EmailSettingsTab.js'
|
|
|
25
14
|
import { AppearanceTab } from './settings/AppearanceTab.js'
|
|
26
15
|
import { SecurityTab } from './settings/SecurityTab.js'
|
|
27
16
|
import { SettingsCard } from './settings/components.js'
|
|
17
|
+
import { PageHeader } from '../components/ui/PageHeader.js'
|
|
18
|
+
import { UnderlineTabPanel, UnderlineTabs } from '../components/ui/UnderlineTabs.js'
|
|
19
|
+
import { UnsavedBar } from '../components/ui/UnsavedBar.js'
|
|
20
|
+
import { SETTINGS_TABS } from '../layout/nav-config.js'
|
|
28
21
|
import { UpdatesTab } from './settings/UpdatesTab.js'
|
|
29
22
|
import { WebhooksTab } from './settings/WebhooksTab.js'
|
|
30
23
|
import { Users as UsersView } from './Users.js'
|
|
@@ -44,18 +37,30 @@ export interface SettingsProps {
|
|
|
44
37
|
currentPath?: string
|
|
45
38
|
}
|
|
46
39
|
|
|
40
|
+
/** Every tab id, in strip order. `layout` exists only with layout regions. */
|
|
41
|
+
const SETTINGS_TAB_IDS: readonly string[] = SETTINGS_TABS.map((tab) => tab.id)
|
|
42
|
+
|
|
43
|
+
/** Kit tab ids (Settings.html `#hash`) that differ from the `?tab=` ids. */
|
|
44
|
+
const KIT_HASH_TABS: Record<string, string> = { keys: 'api-keys' }
|
|
45
|
+
|
|
47
46
|
/**
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
* "Settings saved successfully!" toast while persisting nothing relevant.
|
|
52
|
-
* This is an allowlist on purpose: new tabs default to self-managed.
|
|
47
|
+
* The tab in the URL: `?tab=appearance`, else the kit's `#appearance` form,
|
|
48
|
+
* so links written against the prototype land on the same tab. A hash that
|
|
49
|
+
* names no tab is ignored, so the route's own `initialTab` still applies.
|
|
53
50
|
*/
|
|
54
|
-
const GLOBAL_SAVE_TABS = new Set(['layout'])
|
|
55
|
-
|
|
56
51
|
function readSettingsTabFromUrl(): string | null {
|
|
57
52
|
if (typeof window === 'undefined') return null
|
|
58
|
-
|
|
53
|
+
const fromQuery = parseRouteQuery(window.location.search).get('tab')
|
|
54
|
+
if (fromQuery) return fromQuery
|
|
55
|
+
const hash = window.location.hash.slice(1)
|
|
56
|
+
const fromHash = KIT_HASH_TABS[hash] ?? hash
|
|
57
|
+
return SETTINGS_TAB_IDS.includes(fromHash) ? fromHash : null
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Same regions with the same variants, whatever the key order. */
|
|
61
|
+
function sameLayout(a: Record<string, string>, b: Record<string, string>): boolean {
|
|
62
|
+
const keys = Object.keys(a)
|
|
63
|
+
return keys.length === Object.keys(b).length && keys.every((k) => a[k] === b[k])
|
|
59
64
|
}
|
|
60
65
|
|
|
61
66
|
export function Settings({
|
|
@@ -70,8 +75,10 @@ export function Settings({
|
|
|
70
75
|
const [activeTab, setActiveTab] = useState<string>(() => readSettingsTabFromUrl() ?? initialTab)
|
|
71
76
|
const [saving, setSaving] = useState(false)
|
|
72
77
|
|
|
73
|
-
// Layout defaults
|
|
78
|
+
// Layout defaults, and the last saved copy the Layout tab's bar diffs against.
|
|
74
79
|
const [defaultLayout, setDefaultLayout] = useState<Record<string, string>>({})
|
|
80
|
+
const [savedLayout, setSavedLayout] = useState<Record<string, string>>({})
|
|
81
|
+
const layoutDirty = !sameLayout(defaultLayout, savedLayout)
|
|
75
82
|
const layoutConfig = config?.layout
|
|
76
83
|
const layoutRegions: Array<{ name: string; collection: string; label: string }> =
|
|
77
84
|
layoutConfig?.regions
|
|
@@ -86,40 +93,48 @@ export function Settings({
|
|
|
86
93
|
// Valid tab ids, with `layout` only available when the project configures
|
|
87
94
|
// layout regions. Used to normalise deep links and keep the URL honest.
|
|
88
95
|
const availableTabs = useMemo(
|
|
89
|
-
() =>
|
|
90
|
-
[
|
|
91
|
-
'general',
|
|
92
|
-
'appearance',
|
|
93
|
-
...(hasLayoutRegions ? ['layout'] : []),
|
|
94
|
-
'security',
|
|
95
|
-
'users',
|
|
96
|
-
'mcp',
|
|
97
|
-
'api-keys',
|
|
98
|
-
'seo',
|
|
99
|
-
'email',
|
|
100
|
-
'webhooks',
|
|
101
|
-
'ai',
|
|
102
|
-
'updates',
|
|
103
|
-
] as const,
|
|
96
|
+
() => SETTINGS_TABS.filter((tab) => tab.id !== 'layout' || hasLayoutRegions),
|
|
104
97
|
[hasLayoutRegions],
|
|
105
98
|
)
|
|
106
99
|
const normalizeTab = useCallback(
|
|
107
100
|
(tab: string | null | undefined): string =>
|
|
108
|
-
tab && (
|
|
101
|
+
tab && availableTabs.some((available) => available.id === tab) ? tab : 'general',
|
|
102
|
+
[availableTabs],
|
|
103
|
+
)
|
|
104
|
+
// Settings.html `TABS`: each tab with its 15px icon.
|
|
105
|
+
const stripTabs = useMemo(
|
|
106
|
+
() =>
|
|
107
|
+
availableTabs.map(({ id, label, icon: Icon }) => ({
|
|
108
|
+
id,
|
|
109
|
+
label,
|
|
110
|
+
icon: <Icon strokeWidth={1.8} />,
|
|
111
|
+
})),
|
|
109
112
|
[availableTabs],
|
|
110
113
|
)
|
|
111
114
|
|
|
112
115
|
// Drive the active tab from the `?tab=` query param so tabs are deep-linkable
|
|
113
116
|
// and survive browser back/forward (the legacy /users and /api-keys routes
|
|
114
|
-
// land here via `initialTab`).
|
|
117
|
+
// land here via `initialTab`). Re-read on in-app navigation too: the mobile
|
|
118
|
+
// nav drawer links straight to `/settings?tab=…`.
|
|
115
119
|
useEffect(() => {
|
|
116
120
|
function sync() {
|
|
117
|
-
|
|
121
|
+
const fromUrl = readSettingsTabFromUrl()
|
|
122
|
+
// A hash that names no tab (the skip link's `#prenta-main`, an in-page
|
|
123
|
+
// anchor) is not a tab change: keep the open tab, if it exists here.
|
|
124
|
+
if (fromUrl === null && window.location.hash) {
|
|
125
|
+
setActiveTab((current) => normalizeTab(current))
|
|
126
|
+
return
|
|
127
|
+
}
|
|
128
|
+
setActiveTab(normalizeTab(fromUrl ?? initialTab))
|
|
118
129
|
}
|
|
119
130
|
sync()
|
|
120
131
|
window.addEventListener('popstate', sync)
|
|
121
|
-
|
|
122
|
-
|
|
132
|
+
window.addEventListener('hashchange', sync)
|
|
133
|
+
return () => {
|
|
134
|
+
window.removeEventListener('popstate', sync)
|
|
135
|
+
window.removeEventListener('hashchange', sync)
|
|
136
|
+
}
|
|
137
|
+
}, [normalizeTab, initialTab, currentPath])
|
|
123
138
|
|
|
124
139
|
const changeTab = useCallback(
|
|
125
140
|
(tab: string) => {
|
|
@@ -134,252 +149,196 @@ export function Settings({
|
|
|
134
149
|
if (data) {
|
|
135
150
|
if (data.defaultLayout && typeof data.defaultLayout === 'object') {
|
|
136
151
|
setDefaultLayout(data.defaultLayout)
|
|
152
|
+
setSavedLayout(data.defaultLayout)
|
|
137
153
|
}
|
|
138
154
|
}
|
|
139
155
|
}, [data])
|
|
140
156
|
|
|
141
|
-
const
|
|
157
|
+
const saveLayout = async () => {
|
|
142
158
|
setSaving(true)
|
|
143
|
-
const
|
|
159
|
+
const layout = defaultLayout
|
|
144
160
|
// Read-modify-write: the General tab owns site info / SEO defaults in the
|
|
145
161
|
// same global blob, so merge against a fresh fetch instead of overwriting.
|
|
162
|
+
// A failed read must not turn into a write of `defaultLayout` alone.
|
|
146
163
|
const current = await cmsApi<Record<string, unknown>>('/globals/settings')
|
|
164
|
+
if (current.error) {
|
|
165
|
+
setSaving(false)
|
|
166
|
+
toast.error(current.error)
|
|
167
|
+
return
|
|
168
|
+
}
|
|
169
|
+
// Always sent, so clearing every default is saved too (the server reads a
|
|
170
|
+
// missing `defaultLayout` as `{}`).
|
|
147
171
|
const res = await cmsApi('/globals/settings', {
|
|
148
172
|
method: 'PUT',
|
|
149
|
-
body: JSON.stringify({
|
|
150
|
-
...(current.data ?? {}),
|
|
151
|
-
...layoutPayload,
|
|
152
|
-
}),
|
|
173
|
+
body: JSON.stringify({ ...(current.data ?? {}), defaultLayout: layout }),
|
|
153
174
|
})
|
|
154
175
|
setSaving(false)
|
|
155
176
|
if (res.error) {
|
|
156
177
|
toast.error(res.error)
|
|
157
178
|
} else {
|
|
158
|
-
|
|
179
|
+
setSavedLayout(layout)
|
|
180
|
+
toast.success('Saved')
|
|
159
181
|
}
|
|
160
182
|
}
|
|
161
183
|
|
|
162
|
-
|
|
163
|
-
|
|
184
|
+
// One panel at a time, as Radix Tabs rendered them: each tab loads its own
|
|
185
|
+
// data when it opens. `className` keeps each panel's previous spacing.
|
|
186
|
+
const panels: Record<string, { body: ReactNode; className?: string }> = {
|
|
187
|
+
general: { body: <GeneralSettingsTab onNavigate={onNavigate} role={session?.user?.role} /> },
|
|
188
|
+
appearance: {
|
|
189
|
+
body: <AppearanceTab role={session?.user?.role} config={config} />,
|
|
190
|
+
className: 'space-y-4',
|
|
191
|
+
},
|
|
192
|
+
layout: {
|
|
193
|
+
body: (
|
|
194
|
+
<>
|
|
195
|
+
<SettingsCard
|
|
196
|
+
title="Default Layout Variants"
|
|
197
|
+
description="Select the default header, footer, and other layout variants used site-wide. Pages can override these individually or inherit from parent pages."
|
|
198
|
+
>
|
|
199
|
+
<div className="space-y-4">
|
|
200
|
+
{layoutRegions.map((region) => (
|
|
201
|
+
<RelationshipField
|
|
202
|
+
key={region.name}
|
|
203
|
+
label={`Default ${region.label}`}
|
|
204
|
+
value={defaultLayout[region.name] ?? ''}
|
|
205
|
+
onChange={(val) => {
|
|
206
|
+
setDefaultLayout((prev) => {
|
|
207
|
+
const next = { ...prev }
|
|
208
|
+
if (val && typeof val === 'string') {
|
|
209
|
+
next[region.name] = val
|
|
210
|
+
} else {
|
|
211
|
+
delete next[region.name]
|
|
212
|
+
}
|
|
213
|
+
return next
|
|
214
|
+
})
|
|
215
|
+
}}
|
|
216
|
+
relationTo={region.collection}
|
|
217
|
+
helpText={`The ${region.label.toLowerCase()} variant used when no page in the ancestor chain specifies one`}
|
|
218
|
+
/>
|
|
219
|
+
))}
|
|
220
|
+
</div>
|
|
221
|
+
</SettingsCard>
|
|
222
|
+
<SettingsCard title="How Layout Inheritance Works">
|
|
223
|
+
<ul className="text-muted-foreground space-y-1.5 text-sm">
|
|
224
|
+
<li className="flex items-start gap-2">
|
|
225
|
+
<span className="bg-brand/10 text-brand mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-full text-[10px] font-medium">
|
|
226
|
+
1
|
|
227
|
+
</span>
|
|
228
|
+
<span>
|
|
229
|
+
Each page can assign specific layout variants (header, footer, etc.) from the
|
|
230
|
+
document editor.
|
|
231
|
+
</span>
|
|
232
|
+
</li>
|
|
233
|
+
<li className="flex items-start gap-2">
|
|
234
|
+
<span className="bg-brand/10 text-brand mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-full text-[10px] font-medium">
|
|
235
|
+
2
|
|
236
|
+
</span>
|
|
237
|
+
<span>
|
|
238
|
+
Child pages automatically inherit their parent's layout. For example,{' '}
|
|
239
|
+
<code className="bg-muted rounded px-1 font-mono">/hampton-roads/thank-you</code>{' '}
|
|
240
|
+
inherits from{' '}
|
|
241
|
+
<code className="bg-muted rounded px-1 font-mono">/hampton-roads</code>.
|
|
242
|
+
</span>
|
|
243
|
+
</li>
|
|
244
|
+
<li className="flex items-start gap-2">
|
|
245
|
+
<span className="bg-brand/10 text-brand mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-full text-[10px] font-medium">
|
|
246
|
+
3
|
|
247
|
+
</span>
|
|
248
|
+
<span>
|
|
249
|
+
If no page in the ancestor chain sets a variant, the defaults configured above are
|
|
250
|
+
used.
|
|
251
|
+
</span>
|
|
252
|
+
</li>
|
|
253
|
+
</ul>
|
|
254
|
+
</SettingsCard>
|
|
255
|
+
<UnsavedBar
|
|
256
|
+
dirty={layoutDirty}
|
|
257
|
+
saving={saving}
|
|
258
|
+
onSave={saveLayout}
|
|
259
|
+
onDiscard={() => setDefaultLayout(savedLayout)}
|
|
260
|
+
discardLabel="Reset"
|
|
261
|
+
saveLabel="Save changes"
|
|
262
|
+
variant="card"
|
|
263
|
+
/>
|
|
264
|
+
</>
|
|
265
|
+
),
|
|
266
|
+
className: 'space-y-4',
|
|
267
|
+
},
|
|
268
|
+
security: {
|
|
269
|
+
body: <SecurityTab role={session?.user?.role} onNavigate={onNavigate} />,
|
|
270
|
+
className: 'space-y-4',
|
|
271
|
+
},
|
|
272
|
+
seo: {
|
|
273
|
+
body: <SeoSettingsTab onNavigate={onNavigate} role={session?.user?.role} />,
|
|
274
|
+
className: 'space-y-4',
|
|
275
|
+
},
|
|
276
|
+
email: { body: <EmailSettingsTab role={session?.user?.role} />, className: 'space-y-4' },
|
|
277
|
+
webhooks: { body: <WebhooksTab role={session?.user?.role} />, className: 'space-y-4' },
|
|
278
|
+
ai: {
|
|
279
|
+
body: <AISettingsTab role={session?.user?.role} config={config} />,
|
|
280
|
+
className: 'space-y-4',
|
|
281
|
+
},
|
|
282
|
+
users: { body: <UsersView onNavigate={onNavigate} embedded currentPath={currentPath} /> },
|
|
283
|
+
mcp: { body: <McpConnectTab onNavigate={onNavigate} /> },
|
|
284
|
+
'api-keys': { body: <ApiKeysView onNavigate={onNavigate} embedded /> },
|
|
285
|
+
updates: { body: <UpdatesTab role={session?.user?.role} />, className: 'space-y-4' },
|
|
286
|
+
}
|
|
287
|
+
const panel = panels[activeTab]
|
|
164
288
|
|
|
165
289
|
if (loading) {
|
|
166
290
|
return (
|
|
167
|
-
<div className="flex h-64 items-center justify-center
|
|
291
|
+
<div className="flex h-64 items-center justify-center px-[var(--gut)] pt-6">
|
|
168
292
|
<Loader2 className="text-primary h-6 w-6 animate-spin" />
|
|
169
293
|
</div>
|
|
170
294
|
)
|
|
171
295
|
}
|
|
172
296
|
|
|
297
|
+
// Settings.html: `.pg-hdr` (24px var(--gut) 0, 16px above the strip), the
|
|
298
|
+
// full-width `.pg-tabs` strip with the gutter inside it, then `.scroll-area`
|
|
299
|
+
// (20px var(--gut)). Its 48px bottom padding is left at 16px: the kit
|
|
300
|
+
// cancels it under the sticky save bar with a -48px margin, which would
|
|
301
|
+
// pull Updates' help card over the bar.
|
|
173
302
|
return (
|
|
174
|
-
<div className="
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
<AlertTriangle size={20} className="shrink-0" aria-hidden="true" />
|
|
181
|
-
<span className="flex-1">{error}</span>
|
|
182
|
-
<button
|
|
183
|
-
onClick={refetch}
|
|
184
|
-
className="border-destructive/40 rounded-md border px-3 py-1 transition-colors hover:opacity-80"
|
|
303
|
+
<div className="pb-4">
|
|
304
|
+
<div className="px-[var(--gut)] pt-6 pb-4">
|
|
305
|
+
{error && (
|
|
306
|
+
<div
|
|
307
|
+
role="alert"
|
|
308
|
+
className="border-destructive/30 bg-destructive/10 text-destructive mb-4 flex items-center gap-3 rounded-lg border p-3 text-sm"
|
|
185
309
|
>
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
<div className="mb-4">
|
|
192
|
-
<h1 className="text-foreground mb-1">Settings</h1>
|
|
193
|
-
<p className="text-muted-foreground text-sm">Manage your CMS configuration</p>
|
|
194
|
-
</div>
|
|
195
|
-
|
|
196
|
-
<Tabs.Root value={activeTab} onValueChange={changeTab}>
|
|
197
|
-
<Tabs.List className="border-border mb-4 flex gap-1 overflow-x-auto border-b">
|
|
198
|
-
<Tabs.Trigger value="general" className={tabTriggerClass}>
|
|
199
|
-
General
|
|
200
|
-
</Tabs.Trigger>
|
|
201
|
-
<Tabs.Trigger value="appearance" className={tabTriggerClass}>
|
|
202
|
-
Appearance
|
|
203
|
-
</Tabs.Trigger>
|
|
204
|
-
{hasLayoutRegions && (
|
|
205
|
-
<Tabs.Trigger value="layout" className={tabTriggerClass}>
|
|
206
|
-
<span className="flex items-center gap-1.5">
|
|
207
|
-
<Layers className="h-4 w-4" />
|
|
208
|
-
Layout
|
|
209
|
-
</span>
|
|
210
|
-
</Tabs.Trigger>
|
|
211
|
-
)}
|
|
212
|
-
<Tabs.Trigger value="security" className={tabTriggerClass}>
|
|
213
|
-
Security
|
|
214
|
-
</Tabs.Trigger>
|
|
215
|
-
<Tabs.Trigger value="users" className={tabTriggerClass}>
|
|
216
|
-
<span className="flex items-center gap-1.5">
|
|
217
|
-
<UsersIcon className="h-4 w-4" />
|
|
218
|
-
Users
|
|
219
|
-
</span>
|
|
220
|
-
</Tabs.Trigger>
|
|
221
|
-
<Tabs.Trigger value="mcp" className={tabTriggerClass}>
|
|
222
|
-
<span className="flex items-center gap-1.5">
|
|
223
|
-
<Plug className="h-4 w-4" />
|
|
224
|
-
MCP
|
|
225
|
-
</span>
|
|
226
|
-
</Tabs.Trigger>
|
|
227
|
-
<Tabs.Trigger value="api-keys" className={tabTriggerClass}>
|
|
228
|
-
<span className="flex items-center gap-1.5">
|
|
229
|
-
<KeyRound className="h-4 w-4" />
|
|
230
|
-
API Keys
|
|
231
|
-
</span>
|
|
232
|
-
</Tabs.Trigger>
|
|
233
|
-
<Tabs.Trigger value="seo" className={tabTriggerClass}>
|
|
234
|
-
SEO
|
|
235
|
-
</Tabs.Trigger>
|
|
236
|
-
<Tabs.Trigger value="email" className={tabTriggerClass}>
|
|
237
|
-
<span className="flex items-center gap-1.5">
|
|
238
|
-
<Mail className="h-4 w-4" />
|
|
239
|
-
Email
|
|
240
|
-
</span>
|
|
241
|
-
</Tabs.Trigger>
|
|
242
|
-
<Tabs.Trigger value="webhooks" className={tabTriggerClass}>
|
|
243
|
-
Webhooks
|
|
244
|
-
</Tabs.Trigger>
|
|
245
|
-
<Tabs.Trigger value="ai" className={tabTriggerClass}>
|
|
246
|
-
<span className="flex items-center gap-1.5">
|
|
247
|
-
<Bot className="h-4 w-4" />
|
|
248
|
-
AI
|
|
249
|
-
</span>
|
|
250
|
-
</Tabs.Trigger>
|
|
251
|
-
<Tabs.Trigger value="updates" className={tabTriggerClass}>
|
|
252
|
-
<span className="flex items-center gap-1.5">
|
|
253
|
-
<Download className="h-4 w-4" />
|
|
254
|
-
Updates
|
|
255
|
-
</span>
|
|
256
|
-
</Tabs.Trigger>
|
|
257
|
-
</Tabs.List>
|
|
258
|
-
|
|
259
|
-
<Tabs.Content value="general">
|
|
260
|
-
<GeneralSettingsTab onNavigate={onNavigate} role={session?.user?.role} />
|
|
261
|
-
</Tabs.Content>
|
|
262
|
-
|
|
263
|
-
<Tabs.Content value="appearance" className="space-y-4">
|
|
264
|
-
<AppearanceTab role={session?.user?.role} config={config} />
|
|
265
|
-
</Tabs.Content>
|
|
266
|
-
|
|
267
|
-
{hasLayoutRegions && (
|
|
268
|
-
<Tabs.Content value="layout" className="space-y-4">
|
|
269
|
-
<SettingsCard
|
|
270
|
-
title="Default Layout Variants"
|
|
271
|
-
description="Select the default header, footer, and other layout variants used site-wide. Pages can override these individually or inherit from parent pages."
|
|
310
|
+
<AlertTriangle size={20} className="shrink-0" aria-hidden="true" />
|
|
311
|
+
<span className="flex-1">{error}</span>
|
|
312
|
+
<button
|
|
313
|
+
onClick={refetch}
|
|
314
|
+
className="border-destructive/40 rounded-md border px-3 py-1 transition-colors hover:opacity-80"
|
|
272
315
|
>
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
key={region.name}
|
|
277
|
-
label={`Default ${region.label}`}
|
|
278
|
-
value={defaultLayout[region.name] ?? ''}
|
|
279
|
-
onChange={(val) => {
|
|
280
|
-
setDefaultLayout((prev) => {
|
|
281
|
-
const next = { ...prev }
|
|
282
|
-
if (val && typeof val === 'string') {
|
|
283
|
-
next[region.name] = val
|
|
284
|
-
} else {
|
|
285
|
-
delete next[region.name]
|
|
286
|
-
}
|
|
287
|
-
return next
|
|
288
|
-
})
|
|
289
|
-
}}
|
|
290
|
-
relationTo={region.collection}
|
|
291
|
-
helpText={`The ${region.label.toLowerCase()} variant used when no page in the ancestor chain specifies one`}
|
|
292
|
-
/>
|
|
293
|
-
))}
|
|
294
|
-
</div>
|
|
295
|
-
</SettingsCard>
|
|
296
|
-
<SettingsCard title="How Layout Inheritance Works">
|
|
297
|
-
<ul className="text-muted-foreground space-y-1.5 text-sm">
|
|
298
|
-
<li className="flex items-start gap-2">
|
|
299
|
-
<span className="bg-brand/10 text-brand mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-full text-[10px] font-medium">
|
|
300
|
-
1
|
|
301
|
-
</span>
|
|
302
|
-
<span>
|
|
303
|
-
Each page can assign specific layout variants (header, footer, etc.) from the
|
|
304
|
-
document editor.
|
|
305
|
-
</span>
|
|
306
|
-
</li>
|
|
307
|
-
<li className="flex items-start gap-2">
|
|
308
|
-
<span className="bg-brand/10 text-brand mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-full text-[10px] font-medium">
|
|
309
|
-
2
|
|
310
|
-
</span>
|
|
311
|
-
<span>
|
|
312
|
-
Child pages automatically inherit their parent's layout. For example,{' '}
|
|
313
|
-
<code className="bg-muted rounded px-1 font-mono">
|
|
314
|
-
/hampton-roads/thank-you
|
|
315
|
-
</code>{' '}
|
|
316
|
-
inherits from{' '}
|
|
317
|
-
<code className="bg-muted rounded px-1 font-mono">/hampton-roads</code>.
|
|
318
|
-
</span>
|
|
319
|
-
</li>
|
|
320
|
-
<li className="flex items-start gap-2">
|
|
321
|
-
<span className="bg-brand/10 text-brand mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-full text-[10px] font-medium">
|
|
322
|
-
3
|
|
323
|
-
</span>
|
|
324
|
-
<span>
|
|
325
|
-
If no page in the ancestor chain sets a variant, the defaults configured above
|
|
326
|
-
are used.
|
|
327
|
-
</span>
|
|
328
|
-
</li>
|
|
329
|
-
</ul>
|
|
330
|
-
</SettingsCard>
|
|
331
|
-
</Tabs.Content>
|
|
316
|
+
Retry
|
|
317
|
+
</button>
|
|
318
|
+
</div>
|
|
332
319
|
)}
|
|
320
|
+
<PageHeader flush title="Settings" subtitle="Manage your CMS configuration" />
|
|
321
|
+
</div>
|
|
333
322
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
<EmailSettingsTab role={session?.user?.role} />
|
|
344
|
-
</Tabs.Content>
|
|
345
|
-
|
|
346
|
-
<Tabs.Content value="webhooks" className="space-y-4">
|
|
347
|
-
<WebhooksTab role={session?.user?.role} />
|
|
348
|
-
</Tabs.Content>
|
|
349
|
-
|
|
350
|
-
<Tabs.Content value="ai" className="space-y-4">
|
|
351
|
-
<AISettingsTab role={session?.user?.role} config={config} />
|
|
352
|
-
</Tabs.Content>
|
|
353
|
-
|
|
354
|
-
<Tabs.Content value="users">
|
|
355
|
-
<UsersView onNavigate={onNavigate} embedded currentPath={currentPath} />
|
|
356
|
-
</Tabs.Content>
|
|
357
|
-
|
|
358
|
-
<Tabs.Content value="mcp">
|
|
359
|
-
<McpConnectTab onNavigate={onNavigate} />
|
|
360
|
-
</Tabs.Content>
|
|
361
|
-
|
|
362
|
-
<Tabs.Content value="api-keys">
|
|
363
|
-
<ApiKeysView onNavigate={onNavigate} embedded />
|
|
364
|
-
</Tabs.Content>
|
|
365
|
-
|
|
366
|
-
<Tabs.Content value="updates" className="space-y-4">
|
|
367
|
-
<UpdatesTab role={session?.user?.role} />
|
|
368
|
-
</Tabs.Content>
|
|
369
|
-
</Tabs.Root>
|
|
323
|
+
<UnderlineTabs
|
|
324
|
+
variant="page"
|
|
325
|
+
label="Settings"
|
|
326
|
+
idBase="settings"
|
|
327
|
+
tabs={stripTabs}
|
|
328
|
+
value={activeTab}
|
|
329
|
+
onChange={changeTab}
|
|
330
|
+
className="px-[var(--gut)]"
|
|
331
|
+
/>
|
|
370
332
|
|
|
371
|
-
{
|
|
372
|
-
<
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
</button>
|
|
381
|
-
</div>
|
|
382
|
-
)}
|
|
333
|
+
{panel ? (
|
|
334
|
+
<UnderlineTabPanel
|
|
335
|
+
idBase="settings"
|
|
336
|
+
tabId={activeTab}
|
|
337
|
+
className={`px-[var(--gut)] pt-5 ${panel.className ?? ''}`}
|
|
338
|
+
>
|
|
339
|
+
{panel.body}
|
|
340
|
+
</UnderlineTabPanel>
|
|
341
|
+
) : null}
|
|
383
342
|
</div>
|
|
384
343
|
)
|
|
385
344
|
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { Breadcrumb } from '../components/ui/Breadcrumb.js'
|
|
4
|
+
import { PageHeader } from '../components/ui/PageHeader.js'
|
|
5
|
+
import { EmptyState } from '../components/ui/EmptyState.js'
|
|
6
|
+
import { ShieldAlert } from 'lucide-react'
|
|
7
|
+
|
|
8
|
+
export function SpamFolder() {
|
|
9
|
+
return (
|
|
10
|
+
<div className="flex flex-col gap-6 p-6">
|
|
11
|
+
<PageHeader
|
|
12
|
+
flush
|
|
13
|
+
title="Spam"
|
|
14
|
+
subtitle="Entries caught by the blocklist stay out of the inbox."
|
|
15
|
+
breadcrumb={
|
|
16
|
+
<Breadcrumb
|
|
17
|
+
items={[
|
|
18
|
+
{ label: 'Dashboard', path: '/' },
|
|
19
|
+
{ label: 'Forms', path: '/forms' },
|
|
20
|
+
{ label: 'Spam' },
|
|
21
|
+
]}
|
|
22
|
+
/>
|
|
23
|
+
}
|
|
24
|
+
/>
|
|
25
|
+
<EmptyState
|
|
26
|
+
icon={<ShieldAlert size={24} aria-hidden />}
|
|
27
|
+
title="Spam folder is empty"
|
|
28
|
+
description="Not spam restores an entry and sends a held notification once."
|
|
29
|
+
/>
|
|
30
|
+
</div>
|
|
31
|
+
)
|
|
32
|
+
}
|
package/src/views/Trash.tsx
CHANGED
|
@@ -4,11 +4,14 @@ import { useCallback, useEffect, useMemo, useState } from 'react'
|
|
|
4
4
|
import { Loader2, RotateCcw, Trash2 } from 'lucide-react'
|
|
5
5
|
import { toast } from 'sonner'
|
|
6
6
|
import { cmsApi } from '../lib/api.js'
|
|
7
|
+
import { Breadcrumb } from '../components/ui/Breadcrumb.js'
|
|
7
8
|
import { ConfirmDialog } from '../components/ui/ConfirmDialog.js'
|
|
8
9
|
import { EmptyState } from '../components/ui/EmptyState.js'
|
|
9
10
|
|
|
10
11
|
export interface TrashProps {
|
|
11
12
|
onNavigate: (path: string) => void
|
|
13
|
+
/** The section this Trash belongs to (Pages or Posts), for the breadcrumb. */
|
|
14
|
+
parent?: { label: string; path: string }
|
|
12
15
|
config?: {
|
|
13
16
|
collections?:
|
|
14
17
|
| Record<string, { slug?: string; admin?: { hidden?: boolean } } | undefined>
|
|
@@ -68,7 +71,7 @@ function asRow(collection: string, doc: Record<string, unknown>): TrashRow {
|
|
|
68
71
|
}
|
|
69
72
|
}
|
|
70
73
|
|
|
71
|
-
export function Trash({ onNavigate, config }: TrashProps) {
|
|
74
|
+
export function Trash({ onNavigate, config, parent }: TrashProps) {
|
|
72
75
|
const collections = useMemo(() => {
|
|
73
76
|
const raw = config?.collections
|
|
74
77
|
const list = Array.isArray(raw) ? raw : Object.values(raw ?? {})
|
|
@@ -158,6 +161,14 @@ export function Trash({ onNavigate, config }: TrashProps) {
|
|
|
158
161
|
return (
|
|
159
162
|
<div className="p-4 pr-8">
|
|
160
163
|
<div className="mb-4">
|
|
164
|
+
<Breadcrumb
|
|
165
|
+
className="mb-1"
|
|
166
|
+
items={[
|
|
167
|
+
{ label: 'Dashboard', path: '/' },
|
|
168
|
+
...(parent ? [parent] : []),
|
|
169
|
+
{ label: 'Trash' },
|
|
170
|
+
]}
|
|
171
|
+
/>
|
|
161
172
|
<h1 className="text-foreground mb-1">Trash</h1>
|
|
162
173
|
<p className="text-muted-foreground text-sm">
|
|
163
174
|
Soft-deleted pages and posts stay here for 30 days. Restore one, or delete it permanently
|
package/src/views/Users.tsx
CHANGED
|
@@ -505,7 +505,7 @@ function InviteModal({
|
|
|
505
505
|
</div>
|
|
506
506
|
|
|
507
507
|
{seatsFull && (
|
|
508
|
-
<div className="border-warning/30 bg-
|
|
508
|
+
<div className="border-warning/30 bg-warn-l text-warning mb-4 flex items-start gap-2 rounded-md border p-3 text-sm">
|
|
509
509
|
<AlertTriangle size={16} className="mt-0.5 shrink-0" aria-hidden />
|
|
510
510
|
<span>
|
|
511
511
|
All seats are in use. Remove a member or raise the seat limit before inviting.
|
|
@@ -1081,7 +1081,7 @@ export function Users({ embedded = false, currentPath }: UsersProps = {}) {
|
|
|
1081
1081
|
</span>
|
|
1082
1082
|
)}
|
|
1083
1083
|
{row.externalDomain && (
|
|
1084
|
-
<span className="bg-
|
|
1084
|
+
<span className="bg-warn-l text-warning rounded px-1 text-[10px]">
|
|
1085
1085
|
External
|
|
1086
1086
|
</span>
|
|
1087
1087
|
)}
|