@prenta/admin 2.6.1 → 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 +98 -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/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/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 +10 -8
- 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/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/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/layout/Header.tsx
CHANGED
|
@@ -1,24 +1,36 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
|
|
3
|
+
import {
|
|
4
|
+
useCallback,
|
|
5
|
+
useEffect,
|
|
6
|
+
useRef,
|
|
7
|
+
useState,
|
|
8
|
+
useSyncExternalStore,
|
|
9
|
+
type ReactNode,
|
|
10
|
+
} from 'react'
|
|
11
|
+
import { LogOut, Menu, Moon, Search, Settings, Sun, User } from 'lucide-react'
|
|
5
12
|
import * as DropdownMenu from '@radix-ui/react-dropdown-menu'
|
|
6
13
|
import { adminPortalContainer } from '../lib/portal-container.js'
|
|
7
14
|
import { CommandPalette } from '../components/CommandPalette.js'
|
|
8
15
|
import { NotificationBell } from '../components/NotificationBell.js'
|
|
9
16
|
import { useTheme } from '../components/ThemeProvider.js'
|
|
10
17
|
import { LocaleSwitcher } from '../components/LocaleSwitcher.js'
|
|
11
|
-
import {
|
|
18
|
+
import { TOPBAR_ICON_BUTTON } from './topbar-classes.js'
|
|
12
19
|
|
|
13
20
|
export interface HeaderProps {
|
|
14
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Renders a menu button below 769px that opens the navigation drawer. Leave
|
|
23
|
+
* it out when the shell has its own opener: the admin's `Layout` does,
|
|
24
|
+
* because its mobile tab bar's More opens the drawer and the kit's mobile
|
|
25
|
+
* topbar has no menu button.
|
|
26
|
+
*/
|
|
27
|
+
onToggleSidebar?: () => void
|
|
15
28
|
session?: any
|
|
16
29
|
onNavigate: (path: string) => void
|
|
17
30
|
/**
|
|
18
|
-
* Page-specific actions rendered on the
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* without forcing every view to render its own header.
|
|
31
|
+
* Page-specific actions rendered on the right of the top bar, before the
|
|
32
|
+
* utility icons. Used to surface list-level primary actions like
|
|
33
|
+
* "+ New Post Type" without forcing every view to render its own header.
|
|
22
34
|
*
|
|
23
35
|
* The Layout decides what to pass here based on `currentPath`.
|
|
24
36
|
* Keeping the slot on Header rather than per-view means the
|
|
@@ -30,6 +42,66 @@ export interface HeaderProps {
|
|
|
30
42
|
onLogout?: () => void
|
|
31
43
|
}
|
|
32
44
|
|
|
45
|
+
/**
|
|
46
|
+
* Avatar initials: the first letters of the first and last words of the
|
|
47
|
+
* user's name ("Brandon West" → "BW"), else the first letter of the email.
|
|
48
|
+
*/
|
|
49
|
+
function userInitials(user: { name?: string | null; email?: string | null } | undefined): string {
|
|
50
|
+
const firstLetter = (word: string | undefined) =>
|
|
51
|
+
word ? (Array.from(word)[0] ?? '').toLocaleUpperCase() : ''
|
|
52
|
+
const words = user?.name?.trim().split(/\s+/).filter(Boolean) ?? []
|
|
53
|
+
if (words.length > 0) {
|
|
54
|
+
return firstLetter(words[0]) + (words.length > 1 ? firstLetter(words[words.length - 1]) : '')
|
|
55
|
+
}
|
|
56
|
+
return firstLetter(user?.email?.trim()) || 'A'
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* The search hint names the platform's own shortcut: ⌘K on Mac, iPhone and
|
|
61
|
+
* iPad (iPadOS reports "MacIntel"), Ctrl+K everywhere else. Both open the
|
|
62
|
+
* palette on every platform.
|
|
63
|
+
*/
|
|
64
|
+
type SearchHint = { kbd: string; name: string; keyshortcuts: string }
|
|
65
|
+
const APPLE_HINT: SearchHint = {
|
|
66
|
+
kbd: '⌘K',
|
|
67
|
+
name: 'Search (Command K)',
|
|
68
|
+
keyshortcuts: 'Meta+K Control+K',
|
|
69
|
+
}
|
|
70
|
+
const CTRL_HINT: SearchHint = {
|
|
71
|
+
kbd: 'Ctrl+K',
|
|
72
|
+
name: 'Search (Ctrl+K)',
|
|
73
|
+
// Meta+K still opens the palette here, but Windows keeps Win+K for itself,
|
|
74
|
+
// so only Ctrl+K is advertised.
|
|
75
|
+
keyshortcuts: 'Control+K',
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function platformHint(): SearchHint {
|
|
79
|
+
const nav = navigator as Navigator & { userAgentData?: { platform?: string } }
|
|
80
|
+
const platform = nav.userAgentData?.platform || nav.platform || nav.userAgent
|
|
81
|
+
return /mac|iphone|ipad|ipod/i.test(platform) ? APPLE_HINT : CTRL_HINT
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const subscribeToNothing = () => () => {}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* `null` on the server and while hydrating, where the platform is unknown, so
|
|
88
|
+
* the server markup and the first client render agree; React then renders
|
|
89
|
+
* again with the browser's answer. A client-only mount gets it right away.
|
|
90
|
+
*/
|
|
91
|
+
function useSearchHint(): SearchHint | null {
|
|
92
|
+
return useSyncExternalStore(subscribeToNothing, platformHint, () => null)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Radix focuses the item under the pointer or the arrow keys and marks it
|
|
96
|
+
// `data-highlighted`; that state gets the kit's hover fill. Keyboard focus also
|
|
97
|
+
// gets the admin's focus ring (responsive.css).
|
|
98
|
+
const MENU_ITEM = 'rounded-7 flex cursor-pointer items-center gap-2 px-3 py-2 text-[13px]'
|
|
99
|
+
const MENU_ITEM_DEFAULT = `${MENU_ITEM} text-txt data-[highlighted]:bg-acc-l data-[highlighted]:text-acc`
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* The topbar (SHELL.md §1, §3): search trigger on the left; the page actions
|
|
103
|
+
* slot, then the dark-mode toggle, notifications and the avatar on the right.
|
|
104
|
+
*/
|
|
33
105
|
export function Header({
|
|
34
106
|
onToggleSidebar,
|
|
35
107
|
session,
|
|
@@ -38,157 +110,160 @@ export function Header({
|
|
|
38
110
|
pageActions,
|
|
39
111
|
}: HeaderProps) {
|
|
40
112
|
const [showCommandPalette, setShowCommandPalette] = useState(false)
|
|
41
|
-
const [searchQuery, setSearchQuery] = useState('')
|
|
42
113
|
const { resolvedTheme, setTheme } = useTheme()
|
|
114
|
+
const searchRef = useRef<HTMLButtonElement>(null)
|
|
115
|
+
// Where focus was when the palette opened (the search trigger, or wherever
|
|
116
|
+
// Ctrl/Cmd+K was pressed). The palette unmounts on close and focus would
|
|
117
|
+
// fall to <body>.
|
|
118
|
+
const openerRef = useRef<HTMLElement | null>(null)
|
|
119
|
+
|
|
120
|
+
const setPaletteOpen = useCallback((open: boolean) => {
|
|
121
|
+
if (open && !openerRef.current) {
|
|
122
|
+
openerRef.current = document.activeElement as HTMLElement | null
|
|
123
|
+
}
|
|
124
|
+
setShowCommandPalette(open)
|
|
125
|
+
}, [])
|
|
126
|
+
|
|
127
|
+
useEffect(() => {
|
|
128
|
+
if (showCommandPalette) return
|
|
129
|
+
const opener = openerRef.current
|
|
130
|
+
openerRef.current = null
|
|
131
|
+
const focusLost = document.activeElement === null || document.activeElement === document.body
|
|
132
|
+
if (opener && opener !== document.body && opener.isConnected && focusLost) opener.focus()
|
|
133
|
+
}, [showCommandPalette])
|
|
43
134
|
|
|
44
135
|
const toggleTheme = () => {
|
|
45
136
|
setTheme(resolvedTheme === 'dark' ? 'light' : 'dark')
|
|
46
137
|
}
|
|
47
138
|
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
139
|
+
const user = session?.user as { name?: string | null; email?: string | null } | undefined
|
|
140
|
+
const displayName = user?.name?.trim() || user?.email || 'Admin User'
|
|
141
|
+
const initials = userInitials(user)
|
|
142
|
+
const searchHint = useSearchHint()
|
|
52
143
|
|
|
53
144
|
return (
|
|
54
145
|
<>
|
|
55
|
-
<header className="border-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
</button>
|
|
63
|
-
|
|
64
|
-
{/* Search: takes available width on desktop so it visually anchors
|
|
65
|
-
the top bar like the reference design. */}
|
|
66
|
-
<div className="relative hidden flex-1 md:block">
|
|
67
|
-
<Search
|
|
68
|
-
className="text-muted-foreground pointer-events-none absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2"
|
|
69
|
-
aria-hidden
|
|
70
|
-
/>
|
|
71
|
-
<input
|
|
72
|
-
type="text"
|
|
73
|
-
placeholder="Search..."
|
|
74
|
-
aria-label="Search content"
|
|
75
|
-
value={searchQuery}
|
|
76
|
-
onChange={(e) => setSearchQuery(e.target.value)}
|
|
77
|
-
onFocus={() => setShowCommandPalette(true)}
|
|
78
|
-
onKeyDown={(e) => {
|
|
79
|
-
if (e.key === 'Escape') (e.target as HTMLInputElement).blur()
|
|
80
|
-
}}
|
|
81
|
-
className={inputVariants({
|
|
82
|
-
class:
|
|
83
|
-
'h-9 w-full max-w-md py-1.5 pr-14 pl-9 focus-visible:ring-0 focus-visible:ring-offset-0',
|
|
84
|
-
})}
|
|
85
|
-
/>
|
|
86
|
-
{/* Keyboard hint pill. Hidden on narrow widths to avoid overlap. */}
|
|
87
|
-
<span
|
|
88
|
-
className="border-border bg-background text-muted-foreground pointer-events-none absolute top-1/2 right-2 hidden -translate-y-1/2 rounded border px-1.5 py-0.5 font-mono text-[10px] sm:inline-flex"
|
|
89
|
-
aria-hidden
|
|
146
|
+
<header className="bg-sb border-bdr tablet:px-3.5 mobile:gap-1.5 mobile:px-2.5 4k:px-7 flex h-[var(--tbh)] shrink-0 items-center gap-2.5 border-b px-5">
|
|
147
|
+
{onToggleSidebar ? (
|
|
148
|
+
<button
|
|
149
|
+
type="button"
|
|
150
|
+
onClick={onToggleSidebar}
|
|
151
|
+
className={`${TOPBAR_ICON_BUTTON} not-mobile:hidden`}
|
|
152
|
+
aria-label="Toggle sidebar"
|
|
90
153
|
>
|
|
91
|
-
|
|
92
|
-
</
|
|
93
|
-
|
|
154
|
+
<Menu size={16} strokeWidth={1.75} aria-hidden />
|
|
155
|
+
</button>
|
|
156
|
+
) : null}
|
|
94
157
|
|
|
95
|
-
{/*
|
|
158
|
+
{/* `.search-box`: a real button that opens the command palette. Below
|
|
159
|
+
769px it collapses to a 44px icon; the name stays. Its name and
|
|
160
|
+
hint wait for the platform (see useSearchHint). */}
|
|
96
161
|
<button
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
162
|
+
ref={searchRef}
|
|
163
|
+
type="button"
|
|
164
|
+
onClick={() => {
|
|
165
|
+
openerRef.current = searchRef.current
|
|
166
|
+
setPaletteOpen(true)
|
|
167
|
+
}}
|
|
168
|
+
aria-label={searchHint?.name ?? 'Search'}
|
|
169
|
+
aria-keyshortcuts={searchHint?.keyshortcuts ?? APPLE_HINT.keyshortcuts}
|
|
170
|
+
className="rounded-8 border-bdr bg-bg text-sub hover:border-acc-m prenta-touch-target wide:max-w-[360px] tablet:max-w-[220px] mobile:h-11 mobile:max-w-11 mobile:flex-[0_0_44px] mobile:justify-center mobile:p-0 4k:max-w-[440px] 4k:px-3.5 4k:py-[9px] 4k:text-[14px] flex max-w-[280px] min-w-0 flex-1 cursor-pointer items-center gap-2 border px-3 py-1.5 text-left text-[13px] leading-[normal]"
|
|
100
171
|
>
|
|
101
|
-
<Search className="
|
|
172
|
+
<Search size={14} strokeWidth={1.75} className="shrink-0" aria-hidden />
|
|
173
|
+
<span className="mobile:hidden truncate">Search…</span>
|
|
174
|
+
{searchHint ? (
|
|
175
|
+
<kbd className="border-bdr bg-card text-sub rounded-4 mobile:hidden ml-auto border px-[5px] py-px font-mono text-[10px] leading-[normal]">
|
|
176
|
+
{searchHint.kbd}
|
|
177
|
+
</kbd>
|
|
178
|
+
) : null}
|
|
102
179
|
</button>
|
|
103
180
|
|
|
104
|
-
<div className="ml-auto flex items-center gap-
|
|
105
|
-
|
|
181
|
+
<div className="ml-auto flex items-center gap-2.5">
|
|
182
|
+
{/* Page actions slot. Hidden below 769px, where narrow viewports
|
|
183
|
+
lack the room; pages can re-surface the same action in their
|
|
184
|
+
header there. */}
|
|
185
|
+
{pageActions ? (
|
|
186
|
+
<div className="border-bdr not-mobile:flex hidden items-center gap-2 border-r pr-2.5">
|
|
187
|
+
{pageActions}
|
|
188
|
+
</div>
|
|
189
|
+
) : null}
|
|
106
190
|
|
|
107
|
-
<
|
|
108
|
-
|
|
109
|
-
className="hover:bg-accent rounded-lg p-2 transition-colors"
|
|
110
|
-
aria-label={resolvedTheme === 'dark' ? 'Switch to light mode' : 'Switch to dark mode'}
|
|
111
|
-
>
|
|
112
|
-
{resolvedTheme === 'dark' ? (
|
|
113
|
-
<Sun className="text-muted-foreground h-5 w-5" />
|
|
114
|
-
) : (
|
|
115
|
-
<Moon className="text-muted-foreground h-5 w-5" />
|
|
116
|
-
)}
|
|
117
|
-
</button>
|
|
191
|
+
<div className="flex items-center gap-[3px]">
|
|
192
|
+
<LocaleSwitcher />
|
|
118
193
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
aria-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
align="end"
|
|
144
|
-
sideOffset={5}
|
|
145
|
-
>
|
|
146
|
-
<div className="border-border border-b px-3 py-2">
|
|
147
|
-
<p className="text-sm font-medium">{session?.user?.name ?? 'Admin User'}</p>
|
|
148
|
-
<p className="text-muted-foreground text-xs">
|
|
149
|
-
{session?.user?.email ?? 'admin@example.com'}
|
|
150
|
-
</p>
|
|
151
|
-
</div>
|
|
152
|
-
<DropdownMenu.Item
|
|
153
|
-
className="hover:bg-accent flex cursor-pointer items-center gap-2 rounded px-3 py-2 text-sm outline-none"
|
|
154
|
-
onSelect={() => onNavigate('/profile')}
|
|
155
|
-
>
|
|
156
|
-
<User className="h-4 w-4" />
|
|
157
|
-
Profile
|
|
158
|
-
</DropdownMenu.Item>
|
|
159
|
-
<DropdownMenu.Item
|
|
160
|
-
className="hover:bg-accent flex cursor-pointer items-center gap-2 rounded px-3 py-2 text-sm outline-none"
|
|
161
|
-
onSelect={() => onNavigate('/settings')}
|
|
194
|
+
<button
|
|
195
|
+
type="button"
|
|
196
|
+
onClick={toggleTheme}
|
|
197
|
+
className={TOPBAR_ICON_BUTTON}
|
|
198
|
+
aria-label={resolvedTheme === 'dark' ? 'Switch to light mode' : 'Switch to dark mode'}
|
|
199
|
+
>
|
|
200
|
+
{resolvedTheme === 'dark' ? (
|
|
201
|
+
<Sun size={16} strokeWidth={1.75} aria-hidden />
|
|
202
|
+
) : (
|
|
203
|
+
<Moon size={16} strokeWidth={1.75} aria-hidden />
|
|
204
|
+
)}
|
|
205
|
+
</button>
|
|
206
|
+
|
|
207
|
+
{/* SSE-backed unread state; the kit's dot shows while anything
|
|
208
|
+
is unread. */}
|
|
209
|
+
<NotificationBell />
|
|
210
|
+
|
|
211
|
+
<DropdownMenu.Root>
|
|
212
|
+
<DropdownMenu.Trigger asChild>
|
|
213
|
+
<button
|
|
214
|
+
type="button"
|
|
215
|
+
aria-label="Account menu"
|
|
216
|
+
title={displayName}
|
|
217
|
+
className="bg-acc text-acc-on prenta-touch-hit relative ml-1 flex h-8 w-8 shrink-0 cursor-pointer items-center justify-center rounded-full border-0 p-0 text-[12px] leading-none font-bold [--touch-hit-block:-6px] [--touch-hit-inline:-6px]"
|
|
162
218
|
>
|
|
163
|
-
|
|
164
|
-
</
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
219
|
+
{initials}
|
|
220
|
+
</button>
|
|
221
|
+
</DropdownMenu.Trigger>
|
|
222
|
+
|
|
223
|
+
<DropdownMenu.Portal container={adminPortalContainer()}>
|
|
224
|
+
<DropdownMenu.Content
|
|
225
|
+
className="rounded-10 border-bdr bg-card text-txt shadow-shd2 z-50 min-w-[200px] border p-1"
|
|
226
|
+
align="end"
|
|
227
|
+
sideOffset={6}
|
|
169
228
|
>
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
229
|
+
<div className="border-bdr mb-1 border-b px-3 py-2">
|
|
230
|
+
<p className="text-txt text-[13px] font-semibold">{displayName}</p>
|
|
231
|
+
{user?.email && user.email !== displayName ? (
|
|
232
|
+
<p className="text-sub text-[12px]">{user.email}</p>
|
|
233
|
+
) : null}
|
|
234
|
+
</div>
|
|
235
|
+
<DropdownMenu.Item
|
|
236
|
+
className={MENU_ITEM_DEFAULT}
|
|
237
|
+
onSelect={() => onNavigate('/profile')}
|
|
238
|
+
>
|
|
239
|
+
<User size={16} strokeWidth={1.75} aria-hidden />
|
|
240
|
+
Profile
|
|
241
|
+
</DropdownMenu.Item>
|
|
242
|
+
<DropdownMenu.Item
|
|
243
|
+
className={MENU_ITEM_DEFAULT}
|
|
244
|
+
onSelect={() => onNavigate('/settings')}
|
|
245
|
+
>
|
|
246
|
+
<Settings size={16} strokeWidth={1.75} aria-hidden />
|
|
247
|
+
Settings
|
|
248
|
+
</DropdownMenu.Item>
|
|
249
|
+
<DropdownMenu.Separator className="bg-bdr my-1 h-px" />
|
|
250
|
+
<DropdownMenu.Item
|
|
251
|
+
className={`${MENU_ITEM} text-err data-[highlighted]:bg-err-l`}
|
|
252
|
+
onSelect={() => onLogout?.()}
|
|
253
|
+
>
|
|
254
|
+
<LogOut size={16} strokeWidth={1.75} aria-hidden />
|
|
255
|
+
Logout
|
|
256
|
+
</DropdownMenu.Item>
|
|
257
|
+
</DropdownMenu.Content>
|
|
258
|
+
</DropdownMenu.Portal>
|
|
259
|
+
</DropdownMenu.Root>
|
|
260
|
+
</div>
|
|
186
261
|
</div>
|
|
187
262
|
</header>
|
|
188
263
|
|
|
189
264
|
<CommandPalette
|
|
190
265
|
open={showCommandPalette}
|
|
191
|
-
onOpenChange={
|
|
266
|
+
onOpenChange={setPaletteOpen}
|
|
192
267
|
onNavigate={onNavigate}
|
|
193
268
|
/>
|
|
194
269
|
</>
|
package/src/layout/Layout.tsx
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
|
|
3
3
|
import { useMemo, useState, useEffect, type ReactNode } from 'react'
|
|
4
|
-
import { Plus } from 'lucide-react'
|
|
5
4
|
import { Sidebar } from './Sidebar.js'
|
|
5
|
+
import { MobileTabBar } from './MobileTabBar.js'
|
|
6
|
+
import { useNavItems } from './use-nav-items.js'
|
|
7
|
+
import { withSettingsTabs } from './nav-config.js'
|
|
6
8
|
import { Header } from './Header.js'
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
9
|
+
import { AdminShell, DRAWER_ID } from './primitives/AdminShell.js'
|
|
10
|
+
import { Toaster } from '../components/ui/Toaster.js'
|
|
11
|
+
import { TIER_MEDIA } from '../lib/tiers.js'
|
|
10
12
|
|
|
11
13
|
export interface LayoutProps {
|
|
12
14
|
config: any
|
|
@@ -18,14 +20,16 @@ export interface LayoutProps {
|
|
|
18
20
|
}
|
|
19
21
|
|
|
20
22
|
/**
|
|
21
|
-
* Layout — thin shell that wires Sidebar/Header
|
|
23
|
+
* Layout — thin shell that wires Sidebar/Header into the
|
|
22
24
|
* `<AdminShell>` primitive.
|
|
23
25
|
*
|
|
24
26
|
* `AdminShell` (in `./primitives/AdminShell.tsx`) owns the actual layout
|
|
25
27
|
* algorithm (CSS Grid on desktop, fixed slide-in overlay on mobile,
|
|
26
28
|
* JS-driven `matchMedia` breakpoint) so that every layout decision lives
|
|
27
|
-
* in one place. Per-product chrome (Sidebar, Header
|
|
28
|
-
*
|
|
29
|
+
* in one place. Per-product chrome (Sidebar, Header) composes on top of it.
|
|
30
|
+
*
|
|
31
|
+
* There is no automatic breadcrumb bar: second-level screens pass an explicit
|
|
32
|
+
* `<Breadcrumb>` to their `PageHeader` (SHELL.md §4 "Breadcrumb rule").
|
|
29
33
|
*
|
|
30
34
|
* DO NOT re-implement layout logic in this file — extend `AdminShell`
|
|
31
35
|
* instead. The previous flex + `fixed`↔`static` toggle caused recurring
|
|
@@ -39,43 +43,78 @@ export function Layout({
|
|
|
39
43
|
onLogout,
|
|
40
44
|
children,
|
|
41
45
|
}: LayoutProps) {
|
|
42
|
-
const [
|
|
46
|
+
const [manualCollapsed, setManualCollapsed] = useState(false)
|
|
47
|
+
const [rail, setRail] = useState(false)
|
|
48
|
+
const [mobile, setMobile] = useState(false)
|
|
43
49
|
const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false)
|
|
50
|
+
// The mobile drawer always shows the full sidebar, labels and sub-groups.
|
|
51
|
+
const sidebarCollapsed = !mobile && (rail || manualCollapsed)
|
|
52
|
+
const navItems = useNavItems(config)
|
|
53
|
+
// The mobile drawer also lists the Settings tabs under Settings
|
|
54
|
+
// (CONFLICTS.md §2); wider screens keep Settings a single row.
|
|
55
|
+
const drawerItems = useMemo(
|
|
56
|
+
() => (mobile ? withSettingsTabs(navItems, config) : navItems),
|
|
57
|
+
[mobile, navItems, config],
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
// Kit tiers (SHELL.md §8): ≤768px mobile tab bar, 769–1024px icon rail.
|
|
61
|
+
// Half-open ranges (lib/tiers.ts), the same as the `mobile:`/`tablet:` CSS
|
|
62
|
+
// variants and AdminShell's `min-width: 769px`, so no fractional width
|
|
63
|
+
// (768.5px at a zoom level) falls between two tiers.
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
const railMq = window.matchMedia(TIER_MEDIA.tablet)
|
|
66
|
+
const mobileMq = window.matchMedia(TIER_MEDIA.mobile)
|
|
67
|
+
const apply = () => {
|
|
68
|
+
setRail(railMq.matches)
|
|
69
|
+
setMobile(mobileMq.matches)
|
|
70
|
+
}
|
|
71
|
+
apply()
|
|
72
|
+
railMq.addEventListener('change', apply)
|
|
73
|
+
mobileMq.addEventListener('change', apply)
|
|
74
|
+
return () => {
|
|
75
|
+
railMq.removeEventListener('change', apply)
|
|
76
|
+
mobileMq.removeEventListener('change', apply)
|
|
77
|
+
}
|
|
78
|
+
}, [])
|
|
44
79
|
|
|
45
80
|
useEffect(() => {
|
|
46
81
|
setMobileSidebarOpen(false)
|
|
47
82
|
}, [currentPath])
|
|
48
83
|
|
|
49
|
-
const pageActions = useMemo(
|
|
50
|
-
() => computePageActions({ currentPath, config, onNavigate }),
|
|
51
|
-
[currentPath, config, onNavigate],
|
|
52
|
-
)
|
|
53
|
-
|
|
54
84
|
return (
|
|
55
85
|
<>
|
|
56
|
-
<Toaster
|
|
86
|
+
<Toaster aboveTabBar={mobile} />
|
|
57
87
|
<AdminShell
|
|
88
|
+
desktopBreakpoint={769}
|
|
58
89
|
mobileSidebarOpen={mobileSidebarOpen}
|
|
59
90
|
onMobileSidebarClose={() => setMobileSidebarOpen(false)}
|
|
60
91
|
sidebar={
|
|
61
92
|
<Sidebar
|
|
62
93
|
collapsed={sidebarCollapsed}
|
|
63
|
-
onToggleCollapse={() =>
|
|
94
|
+
onToggleCollapse={() => setManualCollapsed((value) => !value)}
|
|
64
95
|
currentPath={currentPath}
|
|
65
96
|
onNavigate={onNavigate}
|
|
66
97
|
config={config}
|
|
98
|
+
items={drawerItems}
|
|
67
99
|
/>
|
|
68
100
|
}
|
|
69
|
-
|
|
70
|
-
<
|
|
71
|
-
|
|
72
|
-
|
|
101
|
+
tabBar={
|
|
102
|
+
<MobileTabBar
|
|
103
|
+
items={navItems}
|
|
104
|
+
currentPath={currentPath}
|
|
73
105
|
onNavigate={onNavigate}
|
|
74
|
-
|
|
75
|
-
|
|
106
|
+
onMore={() => setMobileSidebarOpen((open) => !open)}
|
|
107
|
+
moreOpen={mobileSidebarOpen}
|
|
108
|
+
drawerId={DRAWER_ID}
|
|
76
109
|
/>
|
|
77
110
|
}
|
|
78
|
-
|
|
111
|
+
header={
|
|
112
|
+
// No onToggleSidebar: below 769px the tab bar's More opens the
|
|
113
|
+
// drawer, and the kit's mobile topbar has no menu button. No
|
|
114
|
+
// pageActions either: every screen's create action sits in its own
|
|
115
|
+
// page header, as in the kit (Post Types' "New Post Type").
|
|
116
|
+
<Header session={session} onNavigate={onNavigate} onLogout={onLogout} />
|
|
117
|
+
}
|
|
79
118
|
>
|
|
80
119
|
{/* min-h-0 lets fill-height views (list tables, split panes) shrink and
|
|
81
120
|
scroll internally instead of clipping under main's overflow-y-auto. */}
|
|
@@ -84,89 +123,3 @@ export function Layout({
|
|
|
84
123
|
</>
|
|
85
124
|
)
|
|
86
125
|
}
|
|
87
|
-
|
|
88
|
-
// ─── Page actions ────────────────────────────────────────────────────────────
|
|
89
|
-
|
|
90
|
-
interface PageActionsContext {
|
|
91
|
-
currentPath: string
|
|
92
|
-
config: any
|
|
93
|
-
onNavigate: (path: string) => void
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Per-route primary actions that render on the right of the top bar.
|
|
98
|
-
*
|
|
99
|
-
* Centralised here so the top bar's actions row stays consistent
|
|
100
|
-
* across view changes — no flicker on navigation, no per-view header
|
|
101
|
-
* reimplementation. Views that need view-local actions (e.g. a
|
|
102
|
-
* "Save draft" button on the post editor) continue to render them
|
|
103
|
-
* inside their own hero; this slot is for the highest-level
|
|
104
|
-
* primary/secondary pair that mirrors the reference dashboard.
|
|
105
|
-
*
|
|
106
|
-
* Resolution rules:
|
|
107
|
-
* - Dashboard / Posts / Pages → nothing here; those views render their
|
|
108
|
-
* hero CTAs inside the page header per the design
|
|
109
|
-
* - Other list views → just "+ New <Type>"
|
|
110
|
-
* - Editor views → no top-bar action (editor renders its own toolbar)
|
|
111
|
-
*/
|
|
112
|
-
function computePageActions({
|
|
113
|
-
currentPath,
|
|
114
|
-
config,
|
|
115
|
-
onNavigate,
|
|
116
|
-
}: PageActionsContext): ReactNode | null {
|
|
117
|
-
const collections = collectionList(config)
|
|
118
|
-
|
|
119
|
-
// Dashboard, /posts, and /pages render their own hero CTAs in the page
|
|
120
|
-
// header (design `.page-hdr` → `.hdr-r`), so the top bar stays empty there.
|
|
121
|
-
const isDashboard = currentPath === '/' || currentPath === '/dashboard'
|
|
122
|
-
if (isDashboard || currentPath === '/posts' || currentPath === '/pages') {
|
|
123
|
-
return null
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
if (currentPath === '/posts/types') {
|
|
127
|
-
return (
|
|
128
|
-
<button
|
|
129
|
-
type="button"
|
|
130
|
-
onClick={() => onNavigate('/posts/types/new')}
|
|
131
|
-
className="bg-primary text-primary-foreground hover:bg-primary/90 focus-visible:ring-ring inline-flex items-center gap-1.5 rounded-lg px-3.5 py-1.5 text-sm font-medium shadow-sm transition-colors focus:outline-none focus-visible:ring-2"
|
|
132
|
-
>
|
|
133
|
-
<Plus className="h-3.5 w-3.5" aria-hidden />
|
|
134
|
-
New Post Type
|
|
135
|
-
</button>
|
|
136
|
-
)
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// List views — surface "+ New X" so authors can keep creating without
|
|
140
|
-
// hunting for a per-list button. Skip on editor views; those have their
|
|
141
|
-
// own toolbar.
|
|
142
|
-
for (const c of collections) {
|
|
143
|
-
if (currentPath === `/${c.slug}`) {
|
|
144
|
-
return (
|
|
145
|
-
<button
|
|
146
|
-
type="button"
|
|
147
|
-
onClick={() => onNavigate(`/${c.slug}/new`)}
|
|
148
|
-
className="bg-primary text-primary-foreground hover:bg-primary/90 focus-visible:ring-ring inline-flex items-center gap-1.5 rounded-lg px-3.5 py-1.5 text-sm font-medium shadow-sm transition-colors focus:outline-none focus-visible:ring-2"
|
|
149
|
-
>
|
|
150
|
-
<Plus className="h-3.5 w-3.5" aria-hidden />
|
|
151
|
-
New {c.labels?.singular ?? c.slug}
|
|
152
|
-
</button>
|
|
153
|
-
)
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
return null
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
interface CollectionMeta {
|
|
161
|
-
slug: string
|
|
162
|
-
type?: string
|
|
163
|
-
labels?: { singular?: string; plural?: string }
|
|
164
|
-
admin?: { hidden?: boolean }
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
function collectionList(config: any): CollectionMeta[] {
|
|
168
|
-
if (!config?.collections) return []
|
|
169
|
-
const raw = config.collections
|
|
170
|
-
const list: any[] = Array.isArray(raw) ? raw : Object.values(raw)
|
|
171
|
-
return list.filter((c) => !c?.admin?.hidden)
|
|
172
|
-
}
|