@prenta/admin 2.6.1 → 2.8.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 +132 -0
- package/design-system/tokens.css +196 -85
- package/design-system/tokens.json +310 -85
- package/design-system/tokens.scss +163 -44
- package/design-system/tokens.tailwind.cjs +64 -1
- package/dist/AdminRoot.d.ts.map +1 -1
- package/dist/AdminRoot.js +43 -21
- 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/batch-wizard.test.d.ts +2 -0
- package/dist/__tests__/lib/batch-wizard.test.d.ts.map +1 -0
- package/dist/__tests__/lib/batch-wizard.test.js +144 -0
- package/dist/__tests__/lib/batch-wizard.test.js.map +1 -0
- 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 +395 -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 +484 -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 +142 -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-chrome.render.test.d.ts +2 -0
- package/dist/__tests__/views/appearance-chrome.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/appearance-chrome.render.test.js +688 -0
- package/dist/__tests__/views/appearance-chrome.render.test.js.map +1 -0
- 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/header-footer-form.test.d.ts +2 -0
- package/dist/__tests__/views/header-footer-form.test.d.ts.map +1 -0
- package/dist/__tests__/views/header-footer-form.test.js +266 -0
- package/dist/__tests__/views/header-footer-form.test.js.map +1 -0
- 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 +1348 -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 +697 -0
- package/dist/__tests__/views/jobs-list.render.test.js.map +1 -0
- package/dist/__tests__/views/jobs-wizard.render.test.d.ts +2 -0
- package/dist/__tests__/views/jobs-wizard.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/jobs-wizard.render.test.js +588 -0
- package/dist/__tests__/views/jobs-wizard.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 +8 -0
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +8 -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/batch-wizard.d.ts +84 -0
- package/dist/lib/batch-wizard.d.ts.map +1 -0
- package/dist/lib/batch-wizard.js +122 -0
- package/dist/lib/batch-wizard.js.map +1 -0
- package/dist/lib/chrome-service.d.ts +69 -0
- package/dist/lib/chrome-service.d.ts.map +1 -0
- package/dist/lib/chrome-service.js +108 -0
- package/dist/lib/chrome-service.js.map +1 -0
- 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 +230 -0
- package/dist/lib/job-view.d.ts.map +1 -0
- package/dist/lib/job-view.js +419 -0
- package/dist/lib/job-view.js.map +1 -0
- package/dist/lib/jobs-service.d.ts +152 -0
- package/dist/lib/jobs-service.d.ts.map +1 -0
- package/dist/lib/jobs-service.js +220 -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 +24 -0
- package/dist/views/AppearanceChrome.d.ts.map +1 -0
- package/dist/views/AppearanceChrome.js +461 -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 +27 -0
- package/dist/views/Jobs/CancelJobDialog.d.ts.map +1 -0
- package/dist/views/Jobs/CancelJobDialog.js +76 -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 +51 -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 +51 -0
- package/dist/views/Jobs/JobDrawer.d.ts.map +1 -0
- package/dist/views/Jobs/JobDrawer.js +378 -0
- package/dist/views/Jobs/JobDrawer.js.map +1 -0
- package/dist/views/Jobs/JobsTable.d.ts +21 -0
- package/dist/views/Jobs/JobsTable.d.ts.map +1 -0
- package/dist/views/Jobs/JobsTable.js +81 -0
- package/dist/views/Jobs/JobsTable.js.map +1 -0
- package/dist/views/Jobs/NewBatchJob.d.ts +34 -0
- package/dist/views/Jobs/NewBatchJob.d.ts.map +1 -0
- package/dist/views/Jobs/NewBatchJob.js +282 -0
- package/dist/views/Jobs/NewBatchJob.js.map +1 -0
- package/dist/views/Jobs/WorkerStrip.d.ts +24 -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 +29 -0
- package/dist/views/Jobs/focus.d.ts.map +1 -0
- package/dist/views/Jobs/focus.js +64 -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/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 +19 -1
- package/dist/views/Jobs.d.ts.map +1 -1
- package/dist/views/Jobs.js +204 -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/header-footer/AnnouncementTab.d.ts +15 -0
- package/dist/views/header-footer/AnnouncementTab.d.ts.map +1 -0
- package/dist/views/header-footer/AnnouncementTab.js +43 -0
- package/dist/views/header-footer/AnnouncementTab.js.map +1 -0
- package/dist/views/header-footer/ChromeField.d.ts +25 -0
- package/dist/views/header-footer/ChromeField.d.ts.map +1 -0
- package/dist/views/header-footer/ChromeField.js +99 -0
- package/dist/views/header-footer/ChromeField.js.map +1 -0
- package/dist/views/header-footer/ChromePreview.d.ts +31 -0
- package/dist/views/header-footer/ChromePreview.d.ts.map +1 -0
- package/dist/views/header-footer/ChromePreview.js +195 -0
- package/dist/views/header-footer/ChromePreview.js.map +1 -0
- package/dist/views/header-footer/DeveloperTab.d.ts +17 -0
- package/dist/views/header-footer/DeveloperTab.d.ts.map +1 -0
- package/dist/views/header-footer/DeveloperTab.js +98 -0
- package/dist/views/header-footer/DeveloperTab.js.map +1 -0
- package/dist/views/header-footer/RegionTab.d.ts +27 -0
- package/dist/views/header-footer/RegionTab.d.ts.map +1 -0
- package/dist/views/header-footer/RegionTab.js +80 -0
- package/dist/views/header-footer/RegionTab.js.map +1 -0
- package/dist/views/header-footer/chrome-form.d.ts +137 -0
- package/dist/views/header-footer/chrome-form.d.ts.map +1 -0
- package/dist/views/header-footer/chrome-form.js +518 -0
- package/dist/views/header-footer/chrome-form.js.map +1 -0
- package/dist/views/header-footer/code-samples.d.ts +30 -0
- package/dist/views/header-footer/code-samples.d.ts.map +1 -0
- package/dist/views/header-footer/code-samples.js +127 -0
- package/dist/views/header-footer/code-samples.js.map +1 -0
- package/dist/views/header-footer/controls.d.ts +57 -0
- package/dist/views/header-footer/controls.d.ts.map +1 -0
- package/dist/views/header-footer/controls.js +43 -0
- package/dist/views/header-footer/controls.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 +103 -31
- 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/batch-wizard.test.ts +199 -0
- package/src/__tests__/lib/job-drawer.test.ts +495 -0
- package/src/__tests__/lib/job-view.test.ts +558 -0
- package/src/__tests__/lib/jobs-service.test.ts +167 -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-chrome.render.test.tsx +818 -0
- 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/header-footer-form.test.ts +333 -0
- package/src/__tests__/views/jobs-drawer.render.test.tsx +1553 -0
- package/src/__tests__/views/jobs-list.render.test.tsx +853 -0
- package/src/__tests__/views/jobs-wizard.render.test.tsx +707 -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 +18 -1
- package/src/lib/appearance-api.ts +4 -0
- package/src/lib/batch-wizard.ts +188 -0
- package/src/lib/chrome-service.ts +200 -0
- package/src/lib/job-drawer.ts +424 -0
- package/src/lib/job-view.ts +550 -0
- package/src/lib/jobs-service.ts +345 -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 +280 -82
- package/src/styles/responsive.css +460 -22
- package/src/styles/theme.css +192 -28
- package/src/views/ApiKeys.tsx +2 -2
- package/src/views/AppearanceChrome.tsx +732 -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 +145 -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 +636 -0
- package/src/views/Jobs/JobsTable.tsx +267 -0
- package/src/views/Jobs/NewBatchJob.tsx +857 -0
- package/src/views/Jobs/WorkerStrip.tsx +149 -0
- package/src/views/Jobs/atoms.tsx +93 -0
- package/src/views/Jobs/focus.ts +67 -0
- package/src/views/Jobs/icons.tsx +111 -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 +396 -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/header-footer/AnnouncementTab.tsx +231 -0
- package/src/views/header-footer/ChromeField.tsx +358 -0
- package/src/views/header-footer/ChromePreview.tsx +497 -0
- package/src/views/header-footer/DeveloperTab.tsx +331 -0
- package/src/views/header-footer/RegionTab.tsx +398 -0
- package/src/views/header-footer/chrome-form.ts +603 -0
- package/src/views/header-footer/code-samples.ts +146 -0
- package/src/views/header-footer/controls.tsx +166 -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
|
@@ -33,8 +33,10 @@ import { cmsApi } from '../lib/api.js'
|
|
|
33
33
|
import { useVirtualWindow, VirtualTablePadding } from '../components/virtual-window.js'
|
|
34
34
|
import { FolderTree, type FolderSelection } from '../components/FolderTree.js'
|
|
35
35
|
import { Button } from '../components/ui/Button.js'
|
|
36
|
+
import { TIER_MEDIA } from '../lib/tiers.js'
|
|
37
|
+
import { useSheetFocus } from '../lib/sheet-focus.js'
|
|
36
38
|
import { StatusBadge } from '../components/ui/StatusBadge.js'
|
|
37
|
-
import {
|
|
39
|
+
import { CountChip } from '../components/ui/CountChip.js'
|
|
38
40
|
import { hasLowQualityAlt, MediaSeoAudit, type MediaSeoAuditItem } from './MediaSeoAudit.js'
|
|
39
41
|
|
|
40
42
|
interface MediaItem {
|
|
@@ -153,6 +155,13 @@ function buildMediaApiUrl(folderSel: FolderSelection): string {
|
|
|
153
155
|
export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
|
|
154
156
|
const [folderSel, setFolderSel] = useState<FolderSelection>({ type: 'smart', smart: 'all' })
|
|
155
157
|
const [sidebarOpen, setSidebarOpen] = useState(true)
|
|
158
|
+
// Below 769px the folder tree stacks above the grid, so it starts closed
|
|
159
|
+
// there; the folder button opens it.
|
|
160
|
+
useEffect(() => {
|
|
161
|
+
if (typeof window.matchMedia === 'function' && window.matchMedia(TIER_MEDIA.mobile).matches) {
|
|
162
|
+
setSidebarOpen(false)
|
|
163
|
+
}
|
|
164
|
+
}, [])
|
|
156
165
|
|
|
157
166
|
const apiUrl = useMemo(() => buildMediaApiUrl(folderSel), [folderSel])
|
|
158
167
|
const { data, loading, error, refetch } = useApiData<{
|
|
@@ -213,6 +222,8 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
|
|
|
213
222
|
const gridColumns = useGridColumns(activeItem !== null)
|
|
214
223
|
const gridScrollRef = useRef<HTMLDivElement>(null)
|
|
215
224
|
const listScrollRef = useRef<HTMLDivElement>(null)
|
|
225
|
+
/** The grid's or list's scroll position when a card opened the detail panel. */
|
|
226
|
+
const savedListScroll = useRef(0)
|
|
216
227
|
const gridRowCount = gridColumns > 0 ? Math.ceil(filteredAndSorted.length / gridColumns) : 0
|
|
217
228
|
const gridWindow = useVirtualWindow({
|
|
218
229
|
count: gridRowCount,
|
|
@@ -243,6 +254,7 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
|
|
|
243
254
|
}, [mediaItems])
|
|
244
255
|
|
|
245
256
|
const openDetail = useCallback((item: MediaItem) => {
|
|
257
|
+
savedListScroll.current = (gridScrollRef.current ?? listScrollRef.current)?.scrollTop ?? 0
|
|
246
258
|
setActiveItem(item)
|
|
247
259
|
setEditAlt(item.altTag ?? '')
|
|
248
260
|
setEditIsDecorative(item.isDecorative === true)
|
|
@@ -517,6 +529,21 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
|
|
|
517
529
|
}
|
|
518
530
|
|
|
519
531
|
const panelOpen = activeItem !== null
|
|
532
|
+
const detailPanelRef = useRef<HTMLDivElement>(null)
|
|
533
|
+
// Below 769px the detail panel is a sheet over the content column
|
|
534
|
+
// (`[data-inspector-open]` in responsive.css hides the grid, tabs and
|
|
535
|
+
// header), so the card that opened it leaves the screen. Focus moves into
|
|
536
|
+
// the panel and back when it closes. The hidden scroll box comes back at the
|
|
537
|
+
// top, and the virtualised window wouldn't follow (no scroll event), so its
|
|
538
|
+
// position, saved when a card opens the panel, goes back first. Grid cards
|
|
539
|
+
// aren't focusable, so focus lands on the list itself.
|
|
540
|
+
useSheetFocus(panelOpen, detailPanelRef, {
|
|
541
|
+
restore: () => {
|
|
542
|
+
const scroller = gridScrollRef.current ?? listScrollRef.current
|
|
543
|
+
if (scroller) scroller.scrollTop = savedListScroll.current
|
|
544
|
+
},
|
|
545
|
+
fallback: () => gridScrollRef.current ?? listScrollRef.current,
|
|
546
|
+
})
|
|
520
547
|
const issues = activeItem
|
|
521
548
|
? [
|
|
522
549
|
...(!hasAccessibleAlt(activeItem) ? ['Missing alt tag'] : []),
|
|
@@ -574,7 +601,8 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
|
|
|
574
601
|
</div>
|
|
575
602
|
)}
|
|
576
603
|
|
|
577
|
-
|
|
604
|
+
{/* Actions sit level with the title, as in Media.html (`.mc-hdr-row`). */}
|
|
605
|
+
<div className="mb-4 flex items-start justify-between">
|
|
578
606
|
<div className="flex items-center gap-3">
|
|
579
607
|
<button
|
|
580
608
|
type="button"
|
|
@@ -586,17 +614,22 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
|
|
|
586
614
|
<FolderInput className="text-muted-foreground h-5 w-5" aria-hidden />
|
|
587
615
|
</button>
|
|
588
616
|
<div>
|
|
589
|
-
|
|
590
|
-
<
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
<
|
|
617
|
+
{/* Title = sidebar label (SHELL.md §4); copy from Media.html. */}
|
|
618
|
+
<h1 className="text-foreground leading-[normal]">Media</h1>
|
|
619
|
+
<p className="text-body text-sub mt-[3px] leading-[normal]">
|
|
620
|
+
Manage and optimize all your media assets
|
|
621
|
+
</p>
|
|
622
|
+
<div className="mt-[18px] flex flex-wrap items-center gap-1.5">
|
|
623
|
+
<CountChip n={mediaStats.total} label="Total Files" />
|
|
624
|
+
<CountChip n={mediaStats.images} label="Images" />
|
|
625
|
+
<CountChip n={mediaStats.videos} label="Videos" />
|
|
626
|
+
<CountChip n={mediaStats.documents} label="Documents" />
|
|
627
|
+
<CountChip n={formatStorage(mediaStats.bytes)} label="Storage used" />
|
|
596
628
|
</div>
|
|
597
629
|
</div>
|
|
598
630
|
</div>
|
|
599
|
-
|
|
631
|
+
{/* Below 769px Upload floats above the tab bar. */}
|
|
632
|
+
<div data-header-actions="">
|
|
600
633
|
<input
|
|
601
634
|
ref={fileInputRef}
|
|
602
635
|
type="file"
|
|
@@ -612,6 +645,7 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
|
|
|
612
645
|
onClick={() => fileInputRef.current?.click()}
|
|
613
646
|
loading={uploading}
|
|
614
647
|
leftIcon={<Upload size={16} aria-hidden />}
|
|
648
|
+
data-fab=""
|
|
615
649
|
>
|
|
616
650
|
{uploading ? 'Uploading...' : 'Upload Files'}
|
|
617
651
|
</Button>
|
|
@@ -671,9 +705,9 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
|
|
|
671
705
|
onRetry={refetch}
|
|
672
706
|
/>
|
|
673
707
|
) : (
|
|
674
|
-
<div className="flex min-h-0 flex-1 gap-4 overflow-hidden">
|
|
708
|
+
<div className="mobile:flex-col flex min-h-0 flex-1 gap-4 overflow-hidden">
|
|
675
709
|
{sidebarOpen && (
|
|
676
|
-
<div className="border-border bg-card flex w-56 shrink-0 flex-col overflow-hidden rounded-lg border">
|
|
710
|
+
<div className="border-border bg-card mobile:max-h-[40vh] mobile:w-full flex w-56 shrink-0 flex-col overflow-hidden rounded-lg border">
|
|
677
711
|
<FolderTree
|
|
678
712
|
scope="media"
|
|
679
713
|
selected={folderSel}
|
|
@@ -688,7 +722,7 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
|
|
|
688
722
|
</div>
|
|
689
723
|
)}
|
|
690
724
|
|
|
691
|
-
<div className="flex min-w-0 flex-1 flex-col">
|
|
725
|
+
<div className="mobile:min-h-0 flex min-w-0 flex-1 flex-col">
|
|
692
726
|
<div className="border-border bg-card mb-4 rounded-lg border">
|
|
693
727
|
<div className="flex items-center justify-between p-3">
|
|
694
728
|
<div className="flex flex-1 items-center gap-3">
|
|
@@ -794,7 +828,11 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
|
|
|
794
828
|
className={`border-border bg-card overflow-hidden rounded-lg border transition-all duration-200 ${panelOpen ? 'min-w-0 flex-1' : 'w-full'}`}
|
|
795
829
|
>
|
|
796
830
|
{viewMode === 'grid' ? (
|
|
797
|
-
<div
|
|
831
|
+
<div
|
|
832
|
+
ref={gridScrollRef}
|
|
833
|
+
tabIndex={-1}
|
|
834
|
+
className="h-full overflow-y-auto p-2 sm:p-3"
|
|
835
|
+
>
|
|
798
836
|
<div className="relative" style={{ height: gridRowCount * 220 }}>
|
|
799
837
|
{gridWindow.rows.map((virtualRow) => (
|
|
800
838
|
<div
|
|
@@ -906,7 +944,11 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
|
|
|
906
944
|
</div>
|
|
907
945
|
</div>
|
|
908
946
|
) : (
|
|
909
|
-
<div
|
|
947
|
+
<div
|
|
948
|
+
ref={listScrollRef}
|
|
949
|
+
tabIndex={-1}
|
|
950
|
+
className="h-full overflow-auto outline-none"
|
|
951
|
+
>
|
|
910
952
|
{/* min-w keeps the list columns readable; narrow viewports scroll sideways. */}
|
|
911
953
|
<table className="w-full min-w-[640px]">
|
|
912
954
|
<thead className="border-border bg-muted sticky top-0 border-b">
|
|
@@ -1009,17 +1051,25 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
|
|
|
1009
1051
|
</div>
|
|
1010
1052
|
|
|
1011
1053
|
{panelOpen && activeItem && (
|
|
1012
|
-
<div
|
|
1054
|
+
<div
|
|
1055
|
+
ref={detailPanelRef}
|
|
1056
|
+
data-inspector-open=""
|
|
1057
|
+
tabIndex={-1}
|
|
1058
|
+
role="region"
|
|
1059
|
+
aria-label={`${activeItem.name} details`}
|
|
1060
|
+
className="border-border bg-card mobile:w-full flex w-80 shrink-0 flex-col overflow-y-auto rounded-lg border lg:w-96"
|
|
1061
|
+
>
|
|
1013
1062
|
<div className="border-border bg-card sticky top-0 z-10 flex items-center justify-between border-b p-4">
|
|
1014
1063
|
<h3 className="text-foreground truncate text-sm font-medium">
|
|
1015
1064
|
{activeItem.name}
|
|
1016
1065
|
</h3>
|
|
1017
1066
|
<button
|
|
1067
|
+
type="button"
|
|
1018
1068
|
onClick={closeDetail}
|
|
1019
|
-
className="hover:bg-muted rounded p-1 transition-colors"
|
|
1069
|
+
className="hover:bg-muted prenta-touch-target mobile:-my-2.5 mobile:-mr-2.5 mobile:h-11 mobile:w-11 flex items-center justify-center rounded p-1 transition-colors"
|
|
1020
1070
|
aria-label="Close panel"
|
|
1021
1071
|
>
|
|
1022
|
-
<X className="text-muted-foreground h-4 w-4" />
|
|
1072
|
+
<X className="text-muted-foreground h-4 w-4" aria-hidden />
|
|
1023
1073
|
</button>
|
|
1024
1074
|
</div>
|
|
1025
1075
|
|
|
@@ -1035,7 +1085,7 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
|
|
|
1035
1085
|
</div>
|
|
1036
1086
|
|
|
1037
1087
|
{issues.length > 0 && (
|
|
1038
|
-
<div className="border-warning/30 bg-
|
|
1088
|
+
<div className="border-warning/30 bg-warn-l mx-4 mt-4 rounded-lg border p-4">
|
|
1039
1089
|
<div className="flex items-start gap-2">
|
|
1040
1090
|
<AlertTriangle className="text-warning mt-0.5 h-4 w-4 shrink-0" />
|
|
1041
1091
|
<div>
|
|
@@ -1166,7 +1216,7 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
|
|
|
1166
1216
|
{activeItem.aiAltSuggestion !== undefined &&
|
|
1167
1217
|
editAlt !== activeItem.aiAltSuggestion &&
|
|
1168
1218
|
!editIsDecorative && (
|
|
1169
|
-
<div className="border-warning/40 bg-
|
|
1219
|
+
<div className="border-warning/40 bg-warn-l mt-2 flex items-start justify-between gap-2 rounded-lg border p-4 text-xs">
|
|
1170
1220
|
<span className="text-foreground">
|
|
1171
1221
|
AI suggestion:{' '}
|
|
1172
1222
|
{activeItem.aiAltSuggestion.trim()
|
|
@@ -1301,7 +1351,7 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
|
|
|
1301
1351
|
))}
|
|
1302
1352
|
</div>
|
|
1303
1353
|
) : (
|
|
1304
|
-
<div className="border-warning/30 bg-
|
|
1354
|
+
<div className="border-warning/30 bg-warn-l rounded-lg border p-4">
|
|
1305
1355
|
<div className="flex items-start gap-2">
|
|
1306
1356
|
<AlertTriangle className="text-warning mt-0.5 h-4 w-4 shrink-0" />
|
|
1307
1357
|
<div>
|
|
@@ -52,6 +52,15 @@ import { AuthorAvatar } from '../../components/ui/AuthorAvatar.js'
|
|
|
52
52
|
import { Button } from '../../components/ui/Button.js'
|
|
53
53
|
import { ConfirmDialog } from '../../components/ui/ConfirmDialog.js'
|
|
54
54
|
import { RowActionButton, RowActions } from '../../components/ui/RowActions.js'
|
|
55
|
+
import {
|
|
56
|
+
cardCell,
|
|
57
|
+
cardColumnHeader,
|
|
58
|
+
cardRow,
|
|
59
|
+
cardRowGroup,
|
|
60
|
+
cardTable,
|
|
61
|
+
} from '../../components/ui/card-table.js'
|
|
62
|
+
import { TIER_MEDIA, useMediaQuery } from '../../lib/tiers.js'
|
|
63
|
+
import { CardListControls, type CardSortOption } from '../../components/ui/CardListControls.js'
|
|
55
64
|
import { PagesTreeTable } from './PagesTreeTable.js'
|
|
56
65
|
|
|
57
66
|
/**
|
|
@@ -62,7 +71,7 @@ import { PagesTreeTable } from './PagesTreeTable.js'
|
|
|
62
71
|
*
|
|
63
72
|
* Routing:
|
|
64
73
|
* - Row click → /pages/:id/edit (the page builder).
|
|
65
|
-
* - "+ New page"
|
|
74
|
+
* - "+ New page" sits on the right of the page header.
|
|
66
75
|
* - "Manage tags" (in the tag bar) → /pages/tags.
|
|
67
76
|
*/
|
|
68
77
|
|
|
@@ -83,6 +92,15 @@ const TOGGLEABLE_COLUMNS: Array<{ key: ToggleableColumn; label: string }> = [
|
|
|
83
92
|
]
|
|
84
93
|
|
|
85
94
|
const PAGE_SIZE = 25
|
|
95
|
+
|
|
96
|
+
/** The sortable columns, for the phone sort select (the header's labels). */
|
|
97
|
+
const PAGE_SORT_OPTIONS: CardSortOption<SortBy>[] = [
|
|
98
|
+
{ field: 'title', label: 'Title' },
|
|
99
|
+
{ field: 'author', label: 'Author' },
|
|
100
|
+
{ field: 'status', label: 'Status' },
|
|
101
|
+
{ field: 'modified', label: 'Last Modified' },
|
|
102
|
+
{ field: 'seo', label: 'SEO' },
|
|
103
|
+
]
|
|
86
104
|
const VIEW_MODE_KEY = 'prenta.pages.viewMode'
|
|
87
105
|
const HIDDEN_COLUMNS_KEY = 'prenta.pages.hiddenColumns'
|
|
88
106
|
|
|
@@ -228,10 +246,14 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
|
|
|
228
246
|
return rows
|
|
229
247
|
}, [displayGroups, grouped])
|
|
230
248
|
const listScrollRef = useRef<HTMLDivElement>(null)
|
|
249
|
+
// Below 769px the rows are cards (`table[data-cards]`), taller than the
|
|
250
|
+
// 56px estimate the window places them by, so every row is mounted.
|
|
251
|
+
const cards = useMediaQuery(TIER_MEDIA.mobile)
|
|
231
252
|
const listWindow = useVirtualWindow({
|
|
232
253
|
count: tableRows.length,
|
|
233
254
|
scrollRef: listScrollRef,
|
|
234
255
|
estimateSize: 56,
|
|
256
|
+
enabled: !cards,
|
|
235
257
|
})
|
|
236
258
|
|
|
237
259
|
// ─── Tree mode ─────────────────────────────────────────────────────
|
|
@@ -535,7 +557,7 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
|
|
|
535
557
|
// Fill the shell's <main> and scroll the table card internally so the
|
|
536
558
|
// pagination footer stays reachable (h-full + main overflow-y-auto alone
|
|
537
559
|
// clips the footer — see #736).
|
|
538
|
-
<div className="flex h-full min-h-0 flex-col gap-4 p-4 sm:p-6">
|
|
560
|
+
<div className="mobile:h-auto flex h-full min-h-0 flex-col gap-4 p-4 sm:p-6">
|
|
539
561
|
{/* Header — the "+ New page" primary action sits on the right, per
|
|
540
562
|
the design's `.page-hdr` / `.hdr-r` layout. */}
|
|
541
563
|
<div className="flex flex-wrap items-start justify-between gap-3">
|
|
@@ -547,16 +569,20 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
|
|
|
547
569
|
: `${grandTotal} page${grandTotal === 1 ? '' : 's'} · organized by tags`}
|
|
548
570
|
</p>
|
|
549
571
|
</div>
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
572
|
+
{/* Below 769px the create action floats above the tab bar. */}
|
|
573
|
+
<div data-header-actions="" className="flex items-center gap-2">
|
|
574
|
+
<Button
|
|
575
|
+
type="button"
|
|
576
|
+
variant="primary"
|
|
577
|
+
size="sm"
|
|
578
|
+
className="shadow-sm"
|
|
579
|
+
onClick={() => onNavigate('/pages/new')}
|
|
580
|
+
leftIcon={<Plus size={16} aria-hidden />}
|
|
581
|
+
data-fab=""
|
|
582
|
+
>
|
|
583
|
+
New page
|
|
584
|
+
</Button>
|
|
585
|
+
</div>
|
|
560
586
|
</div>
|
|
561
587
|
|
|
562
588
|
{/* Controls row */}
|
|
@@ -676,8 +702,38 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
|
|
|
676
702
|
/>
|
|
677
703
|
)}
|
|
678
704
|
|
|
679
|
-
{/*
|
|
680
|
-
|
|
705
|
+
{/* Phones: the table header's sort and select-all, out of reach on cards. */}
|
|
706
|
+
{treeMode ? null : (
|
|
707
|
+
<CardListControls
|
|
708
|
+
selectAll={{
|
|
709
|
+
checked: allOnPageSelected,
|
|
710
|
+
onChange: toggleAllOnPage,
|
|
711
|
+
disabled: visiblePages.length === 0,
|
|
712
|
+
}}
|
|
713
|
+
sort={{
|
|
714
|
+
options: PAGE_SORT_OPTIONS.filter(
|
|
715
|
+
(option) =>
|
|
716
|
+
(option.field !== 'author' || showAuthor) && (option.field !== 'seo' || showSeo),
|
|
717
|
+
),
|
|
718
|
+
field: sortBy,
|
|
719
|
+
dir,
|
|
720
|
+
onChange: (field, nextDir) => {
|
|
721
|
+
setSortBy(field)
|
|
722
|
+
setDir(nextDir)
|
|
723
|
+
},
|
|
724
|
+
}}
|
|
725
|
+
/>
|
|
726
|
+
)}
|
|
727
|
+
|
|
728
|
+
{/* Table card — flex-1 + min-h-0 so the body scrolls; footer stays pinned.
|
|
729
|
+
On mobile the list rows are cards themselves, so this frame drops. */}
|
|
730
|
+
<div
|
|
731
|
+
className={`flex min-h-0 flex-1 flex-col overflow-hidden rounded-xl border border-[var(--bdr)] bg-[var(--card)] shadow-sm ${
|
|
732
|
+
treeMode
|
|
733
|
+
? ''
|
|
734
|
+
: 'mobile:flex-none mobile:overflow-visible mobile:rounded-none mobile:border-0 mobile:bg-transparent mobile:shadow-none'
|
|
735
|
+
}`}
|
|
736
|
+
>
|
|
681
737
|
{treeMode ? (
|
|
682
738
|
<div className="min-h-0 flex-1 overflow-auto">
|
|
683
739
|
<PagesTreeTable
|
|
@@ -705,11 +761,14 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
|
|
|
705
761
|
<>
|
|
706
762
|
{/* Both-axis scroll: tall lists scroll vertically; narrow viewports
|
|
707
763
|
keep column widths and scroll sideways instead of crushing. */}
|
|
708
|
-
<div
|
|
764
|
+
<div
|
|
765
|
+
ref={listScrollRef}
|
|
766
|
+
className="mobile:flex-none mobile:overflow-visible min-h-0 flex-1 overflow-auto"
|
|
767
|
+
>
|
|
709
768
|
<table
|
|
710
769
|
className="w-full table-fixed"
|
|
711
770
|
style={{ minWidth: tableMinWidth }}
|
|
712
|
-
|
|
771
|
+
{...cardTable}
|
|
713
772
|
aria-label="Pages"
|
|
714
773
|
>
|
|
715
774
|
<colgroup>
|
|
@@ -722,9 +781,9 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
|
|
|
722
781
|
{showSeo && <col style={{ width: '80px' }} />}
|
|
723
782
|
<col style={{ width: '110px' }} />
|
|
724
783
|
</colgroup>
|
|
725
|
-
<thead className="bg-muted/40 border-b border-[var(--bdr)]">
|
|
726
|
-
<tr className="text-xs text-[var(--sub)]">
|
|
727
|
-
<th scope="col" className="px-3 py-2.5 text-left">
|
|
784
|
+
<thead {...cardRowGroup} className="bg-muted/40 border-b border-[var(--bdr)]">
|
|
785
|
+
<tr {...cardRow} className="text-xs text-[var(--sub)]">
|
|
786
|
+
<th {...cardColumnHeader} scope="col" className="px-3 py-2.5 text-left">
|
|
728
787
|
<input
|
|
729
788
|
type="checkbox"
|
|
730
789
|
aria-label="Select all pages on this page"
|
|
@@ -734,6 +793,7 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
|
|
|
734
793
|
/>
|
|
735
794
|
</th>
|
|
736
795
|
<th
|
|
796
|
+
{...cardColumnHeader}
|
|
737
797
|
scope="col"
|
|
738
798
|
aria-sort={ariaSortFor('title')}
|
|
739
799
|
className="px-3 py-2.5 text-left"
|
|
@@ -747,12 +807,13 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
|
|
|
747
807
|
/>
|
|
748
808
|
</th>
|
|
749
809
|
{showTags && (
|
|
750
|
-
<th scope="col" className="px-3 py-2.5 text-left">
|
|
810
|
+
<th {...cardColumnHeader} scope="col" className="px-3 py-2.5 text-left">
|
|
751
811
|
<span className="text-xs font-medium tracking-wider uppercase">Tags</span>
|
|
752
812
|
</th>
|
|
753
813
|
)}
|
|
754
814
|
{showAuthor && (
|
|
755
815
|
<th
|
|
816
|
+
{...cardColumnHeader}
|
|
756
817
|
scope="col"
|
|
757
818
|
aria-sort={ariaSortFor('author')}
|
|
758
819
|
className="px-3 py-2.5 text-left"
|
|
@@ -767,6 +828,7 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
|
|
|
767
828
|
</th>
|
|
768
829
|
)}
|
|
769
830
|
<th
|
|
831
|
+
{...cardColumnHeader}
|
|
770
832
|
scope="col"
|
|
771
833
|
aria-sort={ariaSortFor('status')}
|
|
772
834
|
className="px-3 py-2.5 text-left"
|
|
@@ -780,6 +842,7 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
|
|
|
780
842
|
/>
|
|
781
843
|
</th>
|
|
782
844
|
<th
|
|
845
|
+
{...cardColumnHeader}
|
|
783
846
|
scope="col"
|
|
784
847
|
aria-sort={ariaSortFor('modified')}
|
|
785
848
|
className="px-3 py-2.5 text-left"
|
|
@@ -794,6 +857,7 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
|
|
|
794
857
|
</th>
|
|
795
858
|
{showSeo && (
|
|
796
859
|
<th
|
|
860
|
+
{...cardColumnHeader}
|
|
797
861
|
scope="col"
|
|
798
862
|
aria-sort={ariaSortFor('seo')}
|
|
799
863
|
className="px-3 py-2.5 text-left"
|
|
@@ -807,12 +871,12 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
|
|
|
807
871
|
/>
|
|
808
872
|
</th>
|
|
809
873
|
)}
|
|
810
|
-
<th scope="col" className="px-3 py-2.5 text-right">
|
|
874
|
+
<th {...cardColumnHeader} scope="col" className="px-3 py-2.5 text-right">
|
|
811
875
|
<span className="sr-only">Actions</span>
|
|
812
876
|
</th>
|
|
813
877
|
</tr>
|
|
814
878
|
</thead>
|
|
815
|
-
<tbody>
|
|
879
|
+
<tbody {...cardRowGroup}>
|
|
816
880
|
{loading && pages.length === 0 && <LoadingRows columns={columnCount} />}
|
|
817
881
|
{!loading && error && (
|
|
818
882
|
<tr>
|
|
@@ -1119,8 +1183,8 @@ function GroupBlock({
|
|
|
1119
1183
|
return (
|
|
1120
1184
|
<>
|
|
1121
1185
|
{showHeader && (
|
|
1122
|
-
<tr className="bg-muted/30 border-b border-[var(--bdr)]">
|
|
1123
|
-
<td colSpan={columns} className="px-3 py-2">
|
|
1186
|
+
<tr {...cardRow} className="bg-muted/30 border-b border-[var(--bdr)]">
|
|
1187
|
+
<td {...cardCell()} colSpan={columns} className="px-3 py-2">
|
|
1124
1188
|
<span className="inline-flex items-center gap-2 text-xs font-medium tracking-wider text-[var(--txt)] uppercase">
|
|
1125
1189
|
{color && <span aria-hidden className={`h-2 w-2 rounded-full ${dotFor(color)}`} />}
|
|
1126
1190
|
{label}
|
|
@@ -1291,20 +1355,29 @@ function PageRow({
|
|
|
1291
1355
|
}) {
|
|
1292
1356
|
return (
|
|
1293
1357
|
<tr
|
|
1358
|
+
{...cardRow}
|
|
1359
|
+
data-state={selected ? 'selected' : undefined}
|
|
1294
1360
|
className={`group border-b border-[var(--bdr)] transition-colors last:border-b-0 hover:bg-[var(--acc-l)] ${
|
|
1295
1361
|
selected ? 'bg-[var(--acc-l)]' : ''
|
|
1296
1362
|
}`}
|
|
1297
1363
|
>
|
|
1298
|
-
<td
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1364
|
+
<td
|
|
1365
|
+
{...cardCell({ role: 'check' })}
|
|
1366
|
+
className="px-3 py-3"
|
|
1367
|
+
onClick={(e) => e.stopPropagation()}
|
|
1368
|
+
>
|
|
1369
|
+
{/* The label is the card's 44px hit area on mobile (responsive.css). */}
|
|
1370
|
+
<label className="inline-flex cursor-pointer">
|
|
1371
|
+
<input
|
|
1372
|
+
type="checkbox"
|
|
1373
|
+
aria-label={`Select "${page.title}"`}
|
|
1374
|
+
checked={selected}
|
|
1375
|
+
onChange={onSelect}
|
|
1376
|
+
className="accent-primary rounded border-[var(--bdr)]"
|
|
1377
|
+
/>
|
|
1378
|
+
</label>
|
|
1306
1379
|
</td>
|
|
1307
|
-
<td className="px-3 py-3">
|
|
1380
|
+
<td {...cardCell({ role: 'title' })} className="px-3 py-3">
|
|
1308
1381
|
<button type="button" onClick={onOpen} className="block w-full min-w-0 text-left">
|
|
1309
1382
|
<span className="block truncate text-sm font-medium text-[var(--txt)] group-hover:text-[var(--acc)]">
|
|
1310
1383
|
{page.title}
|
|
@@ -1313,7 +1386,7 @@ function PageRow({
|
|
|
1313
1386
|
</button>
|
|
1314
1387
|
</td>
|
|
1315
1388
|
{showTags && (
|
|
1316
|
-
<td className="px-3 py-3">
|
|
1389
|
+
<td {...cardCell({ label: 'Tags' })} className="px-3 py-3">
|
|
1317
1390
|
<PageTagsCell
|
|
1318
1391
|
tagSlugs={page.tags}
|
|
1319
1392
|
primaryTagId={page.primaryTagId}
|
|
@@ -1322,25 +1395,28 @@ function PageRow({
|
|
|
1322
1395
|
</td>
|
|
1323
1396
|
)}
|
|
1324
1397
|
{showAuthor && (
|
|
1325
|
-
<td className="px-3 py-3">
|
|
1398
|
+
<td {...cardCell({ label: 'Author' })} className="px-3 py-3">
|
|
1326
1399
|
<div className="flex items-center gap-2">
|
|
1327
1400
|
<AuthorAvatar name={page.authorName} size={28} />
|
|
1328
1401
|
<span className="truncate text-sm text-[var(--txt)]">{page.authorName}</span>
|
|
1329
1402
|
</div>
|
|
1330
1403
|
</td>
|
|
1331
1404
|
)}
|
|
1332
|
-
<td className="px-3 py-3">
|
|
1405
|
+
<td {...cardCell({ label: 'Status' })} className="px-3 py-3">
|
|
1333
1406
|
<PostStatusBadge status={page.status} />
|
|
1334
1407
|
</td>
|
|
1335
|
-
<td
|
|
1408
|
+
<td
|
|
1409
|
+
{...cardCell({ label: 'Last Modified' })}
|
|
1410
|
+
className="px-3 py-3 text-sm text-[var(--sub)] tabular-nums"
|
|
1411
|
+
>
|
|
1336
1412
|
{formatDateShort(page.lastModified)}
|
|
1337
1413
|
</td>
|
|
1338
1414
|
{showSeo && (
|
|
1339
|
-
<td className="px-3 py-3">
|
|
1415
|
+
<td {...cardCell({ label: 'SEO' })} className="px-3 py-3">
|
|
1340
1416
|
<SeoScoreIndicator score={page.seoScore} />
|
|
1341
1417
|
</td>
|
|
1342
1418
|
)}
|
|
1343
|
-
<td className="px-3 py-3">
|
|
1419
|
+
<td {...cardCell({ role: 'actions' })} className="px-3 py-3">
|
|
1344
1420
|
<RowActions>
|
|
1345
1421
|
<RowActionButton aria-label={`Edit "${page.title}"`} title="Edit" onClick={onOpen}>
|
|
1346
1422
|
<PenLine size={13} aria-hidden />
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
|
|
3
3
|
import { useMemo, useState } from 'react'
|
|
4
|
-
import {
|
|
4
|
+
import { Check, Copy, Sparkles } from 'lucide-react'
|
|
5
5
|
import { toast } from 'sonner'
|
|
6
|
+
import { Breadcrumb } from '../../components/ui/Breadcrumb.js'
|
|
6
7
|
import { resolvePostTypeIcon, type PostTypeIconName } from '../../components/posts/icons.js'
|
|
7
8
|
import { paletteFor } from '../../components/posts/badges.js'
|
|
8
9
|
import { POST_TYPE_PRESETS, type PresetColor, type QuickPreset } from './post-type-presets.js'
|
|
@@ -104,16 +105,20 @@ export function NewPostTypeInstructions({ onNavigate }: { onNavigate: (p: string
|
|
|
104
105
|
|
|
105
106
|
return (
|
|
106
107
|
<div className="mx-auto flex h-full max-w-3xl flex-col gap-6 p-4 sm:p-6">
|
|
107
|
-
<button
|
|
108
|
-
type="button"
|
|
109
|
-
onClick={() => onNavigate('/posts/types')}
|
|
110
|
-
className="text-muted-foreground hover:text-foreground inline-flex w-fit items-center gap-1.5 text-sm transition-colors"
|
|
111
|
-
>
|
|
112
|
-
<ArrowLeft className="h-3.5 w-3.5" aria-hidden />
|
|
113
|
-
Back to Post Types
|
|
114
|
-
</button>
|
|
115
|
-
|
|
116
108
|
<div className="flex flex-col gap-1">
|
|
109
|
+
<Breadcrumb
|
|
110
|
+
className="mb-1"
|
|
111
|
+
items={[
|
|
112
|
+
{ label: 'Dashboard', path: '/' },
|
|
113
|
+
{ label: 'Posts', path: '/posts' },
|
|
114
|
+
{
|
|
115
|
+
label: 'Post Types',
|
|
116
|
+
path: '/posts/types',
|
|
117
|
+
onClick: () => onNavigate('/posts/types'),
|
|
118
|
+
},
|
|
119
|
+
{ label: 'Add a Post Type' },
|
|
120
|
+
]}
|
|
121
|
+
/>
|
|
117
122
|
<h1 className="text-foreground">Add a Post Type</h1>
|
|
118
123
|
<p className="text-muted-foreground text-sm">
|
|
119
124
|
Post Types are content models defined in{' '}
|
|
@@ -5,6 +5,9 @@ import { LayoutTemplate, Plus } from 'lucide-react'
|
|
|
5
5
|
import { fetchPosts, type PostType } from '../../lib/posts-service.js'
|
|
6
6
|
import { paletteFor } from '../../components/posts/badges.js'
|
|
7
7
|
import { resolvePostTypeIcon } from '../../components/posts/icons.js'
|
|
8
|
+
import { Breadcrumb } from '../../components/ui/Breadcrumb.js'
|
|
9
|
+
import { PageHeader } from '../../components/ui/PageHeader.js'
|
|
10
|
+
import { Button } from '../../components/ui/Button.js'
|
|
8
11
|
|
|
9
12
|
/**
|
|
10
13
|
* Post Types — card grid that mirrors the reference screenshot. Each
|
|
@@ -61,12 +64,31 @@ export function PostTypesView({ onNavigate }: PostTypesViewProps) {
|
|
|
61
64
|
|
|
62
65
|
return (
|
|
63
66
|
<div className="flex h-full flex-col gap-6 p-4 sm:p-6">
|
|
64
|
-
<
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
67
|
+
<PageHeader
|
|
68
|
+
flush
|
|
69
|
+
title="Post Types"
|
|
70
|
+
subtitle="Define content models and their fields. All types share the same default fields."
|
|
71
|
+
breadcrumb={
|
|
72
|
+
<Breadcrumb
|
|
73
|
+
items={[
|
|
74
|
+
{ label: 'Dashboard', path: '/' },
|
|
75
|
+
{ label: 'Posts', path: '/posts' },
|
|
76
|
+
{ label: 'Post Types' },
|
|
77
|
+
]}
|
|
78
|
+
/>
|
|
79
|
+
}
|
|
80
|
+
actions={
|
|
81
|
+
// Floats above the tab bar below 769px (data-fab).
|
|
82
|
+
<Button
|
|
83
|
+
type="button"
|
|
84
|
+
onClick={() => onNavigate('/posts/types/new')}
|
|
85
|
+
leftIcon={<Plus size={16} aria-hidden />}
|
|
86
|
+
data-fab=""
|
|
87
|
+
>
|
|
88
|
+
New Post Type
|
|
89
|
+
</Button>
|
|
90
|
+
}
|
|
91
|
+
/>
|
|
70
92
|
|
|
71
93
|
{loading && <CardGridSkeleton />}
|
|
72
94
|
{!loading && error && (
|