@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
|
@@ -27,7 +27,7 @@ const SEVERITY_STYLES: Record<SiteIndexStatus['severity'], { pill: string; icon:
|
|
|
27
27
|
icon: <CheckCircle2 size={14} aria-hidden="true" />,
|
|
28
28
|
},
|
|
29
29
|
warning: {
|
|
30
|
-
pill: 'bg-
|
|
30
|
+
pill: 'bg-warn-l text-warning border-warning/30',
|
|
31
31
|
icon: <AlertTriangle size={14} aria-hidden="true" />,
|
|
32
32
|
},
|
|
33
33
|
danger: {
|
|
@@ -5,7 +5,7 @@ import type { PublicTheme } from '@prenta/core/appearance'
|
|
|
5
5
|
import type { UseAppearanceSettings } from './useAppearanceSettings.js'
|
|
6
6
|
|
|
7
7
|
const FIELDS: { key: keyof PublicTheme; label: string; hint: string }[] = [
|
|
8
|
-
{ key: 'accent', label: 'Accent', hint: 'Buttons and highlights. Example: #
|
|
8
|
+
{ key: 'accent', label: 'Accent', hint: 'Buttons and highlights. Example: #2f5bea' },
|
|
9
9
|
{ key: 'background', label: 'Background', hint: 'Page surface. Example: #ffffff' },
|
|
10
10
|
{ key: 'foreground', label: 'Text', hint: 'Body text. Example: #18181b' },
|
|
11
11
|
{ key: 'muted', label: 'Muted text', hint: 'Secondary text. Example: #71717a' },
|
|
@@ -17,7 +17,8 @@ import {
|
|
|
17
17
|
} from 'lucide-react'
|
|
18
18
|
import { useState, type ReactNode } from 'react'
|
|
19
19
|
|
|
20
|
-
import {
|
|
20
|
+
import { UnsavedBar } from '../../components/ui/UnsavedBar.js'
|
|
21
|
+
import { SettingsCard, SettingsControlRow } from './components.js'
|
|
21
22
|
import {
|
|
22
23
|
useUpdates,
|
|
23
24
|
type UpdateChangeType,
|
|
@@ -30,7 +31,7 @@ const SEVERITY: Record<
|
|
|
30
31
|
{ banner: string; text: string; label: string }
|
|
31
32
|
> = {
|
|
32
33
|
patch: { banner: 'border-brand/30 bg-brand/10', text: 'text-brand', label: 'Patch' },
|
|
33
|
-
minor: { banner: 'border-warning/30 bg-
|
|
34
|
+
minor: { banner: 'border-warning/30 bg-warn-l', text: 'text-warning', label: 'Minor' },
|
|
34
35
|
major: {
|
|
35
36
|
banner: 'border-destructive/30 bg-destructive/10',
|
|
36
37
|
text: 'text-destructive',
|
|
@@ -58,7 +59,7 @@ const CHANGE_TYPE: Record<UpdateChangeType, { label: string; className: string }
|
|
|
58
59
|
label: 'Security',
|
|
59
60
|
className: 'border-destructive/40 bg-destructive/15 text-destructive',
|
|
60
61
|
},
|
|
61
|
-
deprecation: { label: 'Deprecated', className: 'border-warning/30 bg-
|
|
62
|
+
deprecation: { label: 'Deprecated', className: 'border-warning/30 bg-warn-l text-warning' },
|
|
62
63
|
}
|
|
63
64
|
|
|
64
65
|
const ghInputClass =
|
|
@@ -107,7 +108,7 @@ function Notice({
|
|
|
107
108
|
const toneClass =
|
|
108
109
|
tone === 'destructive'
|
|
109
110
|
? 'border-destructive/30 bg-destructive/10 text-destructive'
|
|
110
|
-
: 'border-warning/30 bg-
|
|
111
|
+
: 'border-warning/30 bg-warn-l text-warning'
|
|
111
112
|
return (
|
|
112
113
|
<div className={`mt-3 flex items-start gap-2.5 rounded-md border p-4 ${toneClass}`}>
|
|
113
114
|
<span className="mt-0.5 shrink-0" aria-hidden="true">
|
|
@@ -418,108 +419,113 @@ export function UpdatesTab({ role }: UpdatesTabProps) {
|
|
|
418
419
|
|
|
419
420
|
{/* GitHub integration — admins only */}
|
|
420
421
|
{canManage && (
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
<
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
<
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
</div>
|
|
456
|
-
}
|
|
457
|
-
/>
|
|
458
|
-
|
|
459
|
-
<SettingsControlRow
|
|
460
|
-
label={
|
|
461
|
-
<span className="inline-flex items-center gap-2">
|
|
462
|
-
GitHub token
|
|
463
|
-
{info?.hasGithubToken && !form.githubToken && (
|
|
464
|
-
<span className="text-success text-xs font-normal">Saved</span>
|
|
465
|
-
)}
|
|
466
|
-
</span>
|
|
467
|
-
}
|
|
468
|
-
htmlFor="updates-gh-token"
|
|
469
|
-
align="start"
|
|
470
|
-
description={
|
|
471
|
-
<>
|
|
472
|
-
Needs <code className="bg-muted rounded px-1 font-mono">repo</code> scope. Create
|
|
473
|
-
one at{' '}
|
|
474
|
-
<a
|
|
475
|
-
href="https://github.com/settings/tokens"
|
|
476
|
-
target="_blank"
|
|
477
|
-
rel="noopener noreferrer"
|
|
478
|
-
className="text-brand hover:underline"
|
|
479
|
-
>
|
|
480
|
-
github.com/settings/tokens
|
|
481
|
-
</a>
|
|
482
|
-
.
|
|
483
|
-
</>
|
|
484
|
-
}
|
|
485
|
-
control={
|
|
486
|
-
<div className="relative w-72 max-w-full">
|
|
487
|
-
<input
|
|
488
|
-
id="updates-gh-token"
|
|
489
|
-
type={showToken ? 'text' : 'password'}
|
|
490
|
-
value={form.githubToken}
|
|
491
|
-
onChange={(e) => setField('githubToken', e.target.value)}
|
|
492
|
-
placeholder={
|
|
493
|
-
info?.hasGithubToken ? '••••••••••••••••' : 'ghp_… or github_pat_…'
|
|
494
|
-
}
|
|
495
|
-
className={`${ghInputClass} pr-10`}
|
|
496
|
-
/>
|
|
497
|
-
<button
|
|
498
|
-
type="button"
|
|
499
|
-
onClick={() => setShowToken((s) => !s)}
|
|
500
|
-
aria-label={showToken ? 'Hide token' : 'Show token'}
|
|
501
|
-
className="text-muted-foreground hover:text-foreground absolute top-1/2 right-2 -translate-y-1/2 p-1"
|
|
502
|
-
>
|
|
503
|
-
{showToken ? (
|
|
504
|
-
<EyeOff size={16} aria-hidden="true" />
|
|
505
|
-
) : (
|
|
506
|
-
<Eye size={16} aria-hidden="true" />
|
|
422
|
+
<>
|
|
423
|
+
<SettingsCard
|
|
424
|
+
title="GitHub Integration"
|
|
425
|
+
description="Connect your repository to enable one-click update PRs. Credentials are encrypted at rest (AES-256-GCM)."
|
|
426
|
+
>
|
|
427
|
+
<div className="space-y-4">
|
|
428
|
+
<SettingsControlRow
|
|
429
|
+
label="Repository"
|
|
430
|
+
htmlFor="updates-gh-repo"
|
|
431
|
+
align="start"
|
|
432
|
+
description={
|
|
433
|
+
<>
|
|
434
|
+
e.g.{' '}
|
|
435
|
+
<code className="bg-muted rounded px-1 font-mono">
|
|
436
|
+
actuate-media/my-client-site
|
|
437
|
+
</code>
|
|
438
|
+
</>
|
|
439
|
+
}
|
|
440
|
+
control={
|
|
441
|
+
<div className="w-72 max-w-full">
|
|
442
|
+
<input
|
|
443
|
+
id="updates-gh-repo"
|
|
444
|
+
type="text"
|
|
445
|
+
value={form.githubRepo}
|
|
446
|
+
onChange={(e) => setField('githubRepo', e.target.value)}
|
|
447
|
+
placeholder="owner/repo"
|
|
448
|
+
aria-invalid={Boolean(repoError)}
|
|
449
|
+
aria-describedby={repoError ? 'updates-gh-repo-error' : undefined}
|
|
450
|
+
className={ghInputClass}
|
|
451
|
+
/>
|
|
452
|
+
{repoError && (
|
|
453
|
+
<p id="updates-gh-repo-error" className="text-destructive mt-1 text-xs">
|
|
454
|
+
{repoError}
|
|
455
|
+
</p>
|
|
507
456
|
)}
|
|
508
|
-
</
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
/>
|
|
512
|
-
</div>
|
|
457
|
+
</div>
|
|
458
|
+
}
|
|
459
|
+
/>
|
|
513
460
|
|
|
514
|
-
|
|
461
|
+
<SettingsControlRow
|
|
462
|
+
label={
|
|
463
|
+
<span className="inline-flex items-center gap-2">
|
|
464
|
+
GitHub token
|
|
465
|
+
{info?.hasGithubToken && !form.githubToken && (
|
|
466
|
+
<span className="text-success text-xs font-normal">Saved</span>
|
|
467
|
+
)}
|
|
468
|
+
</span>
|
|
469
|
+
}
|
|
470
|
+
htmlFor="updates-gh-token"
|
|
471
|
+
align="start"
|
|
472
|
+
description={
|
|
473
|
+
<>
|
|
474
|
+
Needs <code className="bg-muted rounded px-1 font-mono">repo</code> scope.
|
|
475
|
+
Create one at{' '}
|
|
476
|
+
<a
|
|
477
|
+
href="https://github.com/settings/tokens"
|
|
478
|
+
target="_blank"
|
|
479
|
+
rel="noopener noreferrer"
|
|
480
|
+
className="text-brand hover:underline"
|
|
481
|
+
>
|
|
482
|
+
github.com/settings/tokens
|
|
483
|
+
</a>
|
|
484
|
+
.
|
|
485
|
+
</>
|
|
486
|
+
}
|
|
487
|
+
control={
|
|
488
|
+
<div className="relative w-72 max-w-full">
|
|
489
|
+
<input
|
|
490
|
+
id="updates-gh-token"
|
|
491
|
+
type={showToken ? 'text' : 'password'}
|
|
492
|
+
value={form.githubToken}
|
|
493
|
+
onChange={(e) => setField('githubToken', e.target.value)}
|
|
494
|
+
placeholder={
|
|
495
|
+
info?.hasGithubToken ? '••••••••••••••••' : 'ghp_… or github_pat_…'
|
|
496
|
+
}
|
|
497
|
+
className={`${ghInputClass} pr-10`}
|
|
498
|
+
/>
|
|
499
|
+
<button
|
|
500
|
+
type="button"
|
|
501
|
+
onClick={() => setShowToken((s) => !s)}
|
|
502
|
+
aria-label={showToken ? 'Hide token' : 'Show token'}
|
|
503
|
+
className="text-muted-foreground hover:text-foreground absolute top-1/2 right-2 -translate-y-1/2 p-1"
|
|
504
|
+
>
|
|
505
|
+
{showToken ? (
|
|
506
|
+
<EyeOff size={16} aria-hidden="true" />
|
|
507
|
+
) : (
|
|
508
|
+
<Eye size={16} aria-hidden="true" />
|
|
509
|
+
)}
|
|
510
|
+
</button>
|
|
511
|
+
</div>
|
|
512
|
+
}
|
|
513
|
+
/>
|
|
514
|
+
</div>
|
|
515
|
+
</SettingsCard>
|
|
516
|
+
{/* Outside the card: its overflow-hidden would stop the bar sticking.
|
|
517
|
+
useUpdates toasts its own save result, so no useSavedToast here. */}
|
|
518
|
+
<UnsavedBar
|
|
515
519
|
dirty={dirty}
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
saveState={saveState}
|
|
520
|
+
saving={saveState === 'saving'}
|
|
521
|
+
saveDisabled={!canManage || hasErrors}
|
|
519
522
|
onSave={save}
|
|
520
|
-
|
|
523
|
+
onDiscard={reset}
|
|
524
|
+
discardLabel="Reset"
|
|
525
|
+
saveLabel="Save changes"
|
|
526
|
+
variant="card"
|
|
521
527
|
/>
|
|
522
|
-
|
|
528
|
+
</>
|
|
523
529
|
)}
|
|
524
530
|
|
|
525
531
|
{/* Help */}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
|
|
3
3
|
import * as Dialog from '@radix-ui/react-dialog'
|
|
4
|
-
import { AlertTriangle,
|
|
5
|
-
import { useId, type ReactNode } from 'react'
|
|
6
|
-
import {
|
|
4
|
+
import { AlertTriangle, Lock } from 'lucide-react'
|
|
5
|
+
import { useEffect, useId, type ReactNode } from 'react'
|
|
6
|
+
import { toast } from 'sonner'
|
|
7
|
+
import {
|
|
8
|
+
Card,
|
|
9
|
+
CardContent,
|
|
10
|
+
CardDescription,
|
|
11
|
+
CardHeader,
|
|
12
|
+
CardTitle,
|
|
13
|
+
} from '../../components/ui/Card.js'
|
|
7
14
|
import { Toggle } from '../../components/ui/Toggle.js'
|
|
8
15
|
import { adminPortalContainer } from '../../lib/portal-container.js'
|
|
9
16
|
import type { SettingsSourceMetadata, ValidationIssue } from './useGeneralSettings.js'
|
|
@@ -14,8 +21,8 @@ import type { SettingsSourceMetadata, ValidationIssue } from './useGeneralSettin
|
|
|
14
21
|
* slot. This is the single source of truth for the Settings design language —
|
|
15
22
|
* every tab's sections render through it so spacing, padding, typography, and
|
|
16
23
|
* the title/description rhythm stay identical across General, Appearance,
|
|
17
|
-
* Security, SEO, AI, and beyond.
|
|
18
|
-
*
|
|
24
|
+
* Security, SEO, AI, and beyond. Chrome comes from the shared `Card`
|
|
25
|
+
* primitives (kit `.ap-card` / `.ap-ch`).
|
|
19
26
|
*/
|
|
20
27
|
export function SettingsCard({
|
|
21
28
|
title,
|
|
@@ -46,14 +53,11 @@ export function SettingsCard({
|
|
|
46
53
|
role="region"
|
|
47
54
|
className={className}
|
|
48
55
|
>
|
|
49
|
-
<CardHeader
|
|
50
|
-
<div className="min-w-0">
|
|
51
|
-
<Heading
|
|
52
|
-
id={headingId}
|
|
53
|
-
className="text-[length:var(--fs-card)] font-semibold text-[var(--txt)]"
|
|
54
|
-
>
|
|
56
|
+
<CardHeader>
|
|
57
|
+
<div className="min-w-0 flex-1">
|
|
58
|
+
<CardTitle as={Heading} id={headingId}>
|
|
55
59
|
{title}
|
|
56
|
-
</
|
|
60
|
+
</CardTitle>
|
|
57
61
|
{description && <CardDescription>{description}</CardDescription>}
|
|
58
62
|
</div>
|
|
59
63
|
{actions && <div className="flex shrink-0 items-center gap-2">{actions}</div>}
|
|
@@ -212,7 +216,7 @@ export function SettingsValidationSummary({ issues }: { issues: ValidationIssue[
|
|
|
212
216
|
className={`flex items-start gap-3 rounded-lg border p-4 text-sm ${
|
|
213
217
|
isError
|
|
214
218
|
? 'border-destructive/30 bg-destructive/10 text-destructive'
|
|
215
|
-
: 'border-warning/30 bg-
|
|
219
|
+
: 'border-warning/30 bg-warn-l text-warning'
|
|
216
220
|
}`}
|
|
217
221
|
>
|
|
218
222
|
<AlertTriangle size={16} className="mt-0.5 shrink-0" aria-hidden="true" />
|
|
@@ -225,54 +229,14 @@ export function SettingsValidationSummary({ issues }: { issues: ValidationIssue[
|
|
|
225
229
|
)
|
|
226
230
|
}
|
|
227
231
|
|
|
228
|
-
/**
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
}: {
|
|
237
|
-
dirty: boolean
|
|
238
|
-
canEdit: boolean
|
|
239
|
-
hasErrors: boolean
|
|
240
|
-
saveState: 'idle' | 'saving' | 'success' | 'error'
|
|
241
|
-
onSave: () => void
|
|
242
|
-
onReset: () => void
|
|
243
|
-
}) {
|
|
244
|
-
const saving = saveState === 'saving'
|
|
245
|
-
return (
|
|
246
|
-
<div className="border-border bg-background/80 sticky bottom-0 z-10 flex items-center justify-end gap-4 border-t py-3 backdrop-blur">
|
|
247
|
-
{saveState === 'success' && !dirty && (
|
|
248
|
-
<span className="text-success flex items-center gap-1.5 text-sm" aria-live="polite">
|
|
249
|
-
<Check size={16} aria-hidden="true" /> Saved
|
|
250
|
-
</span>
|
|
251
|
-
)}
|
|
252
|
-
{dirty && !saving && (
|
|
253
|
-
<span className="text-muted-foreground text-sm" aria-live="polite">
|
|
254
|
-
Unsaved changes
|
|
255
|
-
</span>
|
|
256
|
-
)}
|
|
257
|
-
<button
|
|
258
|
-
type="button"
|
|
259
|
-
onClick={onReset}
|
|
260
|
-
disabled={!dirty || saving}
|
|
261
|
-
className="text-muted-foreground hover:text-foreground rounded-md px-3 py-2 text-base transition-colors disabled:cursor-not-allowed disabled:opacity-40"
|
|
262
|
-
>
|
|
263
|
-
Reset
|
|
264
|
-
</button>
|
|
265
|
-
<button
|
|
266
|
-
type="button"
|
|
267
|
-
onClick={onSave}
|
|
268
|
-
disabled={!canEdit || !dirty || hasErrors || saving}
|
|
269
|
-
className="bg-brand text-brand-foreground focus-visible:ring-ring inline-flex items-center gap-2 rounded-md px-5 py-2 text-base font-medium transition-opacity hover:opacity-90 focus-visible:ring-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50"
|
|
270
|
-
>
|
|
271
|
-
{saving && <Loader2 size={16} className="animate-spin" aria-hidden="true" />}
|
|
272
|
-
{saving ? 'Saving…' : 'Save Changes'}
|
|
273
|
-
</button>
|
|
274
|
-
</div>
|
|
275
|
-
)
|
|
232
|
+
/**
|
|
233
|
+
* Confirms a finished save. The tabs' `UnsavedBar` renders only while the form
|
|
234
|
+
* is dirty, so it is already gone when the save lands; the toast says it worked.
|
|
235
|
+
*/
|
|
236
|
+
export function useSavedToast(saveState: 'idle' | 'saving' | 'success' | 'error') {
|
|
237
|
+
useEffect(() => {
|
|
238
|
+
if (saveState === 'success') toast.success('Saved')
|
|
239
|
+
}, [saveState])
|
|
276
240
|
}
|
|
277
241
|
|
|
278
242
|
/** Confirmation dialog for dangerous indexing changes. */
|
|
@@ -297,7 +261,7 @@ export function ConfirmDangerousSettingDialog({
|
|
|
297
261
|
<Dialog.Overlay className="fixed inset-0 z-50 bg-black/50" />
|
|
298
262
|
<Dialog.Content className="bg-card text-card-foreground fixed top-1/2 left-1/2 z-50 w-full max-w-md -translate-x-1/2 -translate-y-1/2 rounded-lg p-6 shadow-lg">
|
|
299
263
|
<div className="mb-3 flex items-center gap-2">
|
|
300
|
-
<span className="bg-
|
|
264
|
+
<span className="bg-warn-l text-warning flex h-9 w-9 items-center justify-center rounded-full">
|
|
301
265
|
<AlertTriangle size={20} aria-hidden="true" />
|
|
302
266
|
</span>
|
|
303
267
|
<Dialog.Title className="text-foreground text-lg font-medium">{title}</Dialog.Title>
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
type BrandAssetRole,
|
|
14
14
|
type BrandSettings,
|
|
15
15
|
type ColorMode,
|
|
16
|
+
type LightBase,
|
|
16
17
|
type LogoShape,
|
|
17
18
|
type ResolvedAdminBrand,
|
|
18
19
|
type PublicTheme,
|
|
@@ -20,8 +21,14 @@ import {
|
|
|
20
21
|
type SidebarDensity,
|
|
21
22
|
} from '@prenta/core/appearance'
|
|
22
23
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
|
|
24
|
+
import { toast } from 'sonner'
|
|
23
25
|
|
|
24
|
-
import {
|
|
26
|
+
import {
|
|
27
|
+
useTheme,
|
|
28
|
+
usableAccentOverride,
|
|
29
|
+
type AppearanceSnapshot,
|
|
30
|
+
type ThemeBase,
|
|
31
|
+
} from '../../components/ThemeProvider.js'
|
|
25
32
|
import {
|
|
26
33
|
adminBrandToCache,
|
|
27
34
|
appearanceApiToSnapshot,
|
|
@@ -38,6 +45,7 @@ type SaveState = 'idle' | 'saving' | 'success' | 'error'
|
|
|
38
45
|
/** Theme + typography + motion form (the `appearance` settings blob). */
|
|
39
46
|
interface AppearanceForm {
|
|
40
47
|
colorMode: ColorMode
|
|
48
|
+
lightBase: LightBase
|
|
41
49
|
accent: string
|
|
42
50
|
density: SidebarDensity
|
|
43
51
|
font: string
|
|
@@ -136,6 +144,10 @@ export interface UseAppearanceSettings {
|
|
|
136
144
|
showAdvanced: boolean
|
|
137
145
|
setShowAdvanced: (v: boolean) => void
|
|
138
146
|
setColorMode: (v: ColorMode) => void
|
|
147
|
+
/** Pick Porcelain, Linen or Graphite. Turns "Match operating system" off. */
|
|
148
|
+
setBase: (v: ThemeBase) => void
|
|
149
|
+
/** Follow the OS between the light base and Graphite. */
|
|
150
|
+
setMatchSystem: (on: boolean) => void
|
|
139
151
|
setAccent: (v: string) => void
|
|
140
152
|
setDensity: (v: SidebarDensity) => void
|
|
141
153
|
setFont: (v: string) => void
|
|
@@ -163,9 +175,10 @@ const EMPTY_PUBLIC_THEME: Required<PublicTheme> = {
|
|
|
163
175
|
|
|
164
176
|
const DEFAULT_FORM: AppearanceForm = {
|
|
165
177
|
colorMode: 'system',
|
|
166
|
-
|
|
178
|
+
lightBase: 'porcelain',
|
|
179
|
+
accent: 'cobalt',
|
|
167
180
|
density: 'default',
|
|
168
|
-
font: '
|
|
181
|
+
font: 'DM Sans',
|
|
169
182
|
reduceMotion: false,
|
|
170
183
|
publicTheme: EMPTY_PUBLIC_THEME,
|
|
171
184
|
}
|
|
@@ -176,6 +189,24 @@ function snapshot(a: AppearanceForm, b: BrandForm): string {
|
|
|
176
189
|
return JSON.stringify({ a, b })
|
|
177
190
|
}
|
|
178
191
|
|
|
192
|
+
/** What the ThemeProvider shows for a form state. */
|
|
193
|
+
function themeSnapshot(
|
|
194
|
+
a: AppearanceForm,
|
|
195
|
+
b: BrandForm,
|
|
196
|
+
assetMap: Record<string, AssetPreview>,
|
|
197
|
+
siteTitle: string | null,
|
|
198
|
+
): AppearanceSnapshot {
|
|
199
|
+
return {
|
|
200
|
+
theme: a.colorMode,
|
|
201
|
+
lightBase: a.lightBase,
|
|
202
|
+
accent: a.accent,
|
|
203
|
+
density: a.density,
|
|
204
|
+
font: a.font,
|
|
205
|
+
reduceMotion: a.reduceMotion,
|
|
206
|
+
adminBrand: adminBrandToCache(b as BrandSettings, assetMap, siteTitle),
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
179
210
|
/** Read an uploaded image's shape client-side (raster via Image, SVG via XML). */
|
|
180
211
|
async function detectShape(file: File): Promise<LogoShape> {
|
|
181
212
|
if (file.type === 'image/svg+xml') {
|
|
@@ -216,7 +247,7 @@ export function useAppearanceSettings(
|
|
|
216
247
|
canEdit: boolean,
|
|
217
248
|
config?: Record<string, unknown>,
|
|
218
249
|
): UseAppearanceSettings {
|
|
219
|
-
const { applyAppearance, setAdminBrand } = useTheme()
|
|
250
|
+
const { applyAppearance, setAdminBrand, resolvedTheme } = useTheme()
|
|
220
251
|
|
|
221
252
|
const [loading, setLoading] = useState(true)
|
|
222
253
|
const [loadError, setLoadError] = useState<string | null>(null)
|
|
@@ -229,6 +260,13 @@ export function useAppearanceSettings(
|
|
|
229
260
|
const [showAdvanced, setShowAdvanced] = useState(false)
|
|
230
261
|
|
|
231
262
|
const baselineRef = useRef<string>(snapshot(DEFAULT_FORM, DEFAULT_BRAND_FORM))
|
|
263
|
+
// `load` must run on mount and on an explicit reload only. Reading the
|
|
264
|
+
// provider's function through a ref keeps a new identity from refetching
|
|
265
|
+
// and overwriting unsaved edits.
|
|
266
|
+
const applyRef = useRef(applyAppearance)
|
|
267
|
+
useEffect(() => {
|
|
268
|
+
applyRef.current = applyAppearance
|
|
269
|
+
}, [applyAppearance])
|
|
232
270
|
const siteTitleRef = useRef<string | null>(null)
|
|
233
271
|
|
|
234
272
|
// Config-managed source detection (admin branding configured in prenta.config.ts).
|
|
@@ -237,7 +275,9 @@ export function useAppearanceSettings(
|
|
|
237
275
|
| undefined
|
|
238
276
|
const sources = useMemo<Record<string, SettingsSourceMetadata>>(() => {
|
|
239
277
|
const out: Record<string, SettingsSourceMetadata> = {}
|
|
240
|
-
|
|
278
|
+
// Only a config color the ThemeProvider can actually apply locks the
|
|
279
|
+
// picker; otherwise it is ignored there (with a warning) and stays editable.
|
|
280
|
+
if (usableAccentOverride(branding?.primaryColor)) {
|
|
241
281
|
out.accent = {
|
|
242
282
|
source: 'config',
|
|
243
283
|
editable: false,
|
|
@@ -256,14 +296,7 @@ export function useAppearanceSettings(
|
|
|
256
296
|
|
|
257
297
|
const pushLive = useCallback(
|
|
258
298
|
(a: AppearanceForm, b: BrandForm, assetMap: Record<string, AssetPreview>) => {
|
|
259
|
-
applyAppearance(
|
|
260
|
-
theme: a.colorMode,
|
|
261
|
-
accent: a.accent,
|
|
262
|
-
density: a.density,
|
|
263
|
-
font: a.font,
|
|
264
|
-
reduceMotion: a.reduceMotion,
|
|
265
|
-
adminBrand: adminBrandToCache(b as BrandSettings, assetMap, siteTitleRef.current),
|
|
266
|
-
})
|
|
299
|
+
applyAppearance(themeSnapshot(a, b, assetMap, siteTitleRef.current))
|
|
267
300
|
},
|
|
268
301
|
[applyAppearance],
|
|
269
302
|
)
|
|
@@ -281,6 +314,7 @@ export function useAppearanceSettings(
|
|
|
281
314
|
const storedTheme = d.appearance.publicTheme
|
|
282
315
|
const nextAppearance: AppearanceForm = {
|
|
283
316
|
colorMode: d.appearance.adminColorModeDefault,
|
|
317
|
+
lightBase: d.appearance.adminLightBase === 'linen' ? 'linen' : 'porcelain',
|
|
284
318
|
accent: d.appearance.adminAccentColor,
|
|
285
319
|
density: d.appearance.sidebarDensity,
|
|
286
320
|
font: d.appearance.contentFont,
|
|
@@ -295,10 +329,10 @@ export function useAppearanceSettings(
|
|
|
295
329
|
setAssets(nextAssets)
|
|
296
330
|
if (nextBrand.adminLogoMarkAssetId || nextBrand.publicLogoMarkAssetId) setShowAdvanced(true)
|
|
297
331
|
baselineRef.current = snapshot(nextAppearance, nextBrand)
|
|
298
|
-
|
|
332
|
+
applyRef.current(appearanceApiToSnapshot(d))
|
|
299
333
|
setSaveState('idle')
|
|
300
334
|
setLoading(false)
|
|
301
|
-
}, [
|
|
335
|
+
}, [])
|
|
302
336
|
|
|
303
337
|
useEffect(() => {
|
|
304
338
|
void load()
|
|
@@ -320,6 +354,23 @@ export function useAppearanceSettings(
|
|
|
320
354
|
(v: ColorMode) => update({ ...appearance, colorMode: v }, brand, assets),
|
|
321
355
|
[appearance, brand, assets, update],
|
|
322
356
|
)
|
|
357
|
+
const setBase = useCallback(
|
|
358
|
+
(v: ThemeBase) =>
|
|
359
|
+
update(
|
|
360
|
+
v === 'graphite'
|
|
361
|
+
? { ...appearance, colorMode: 'dark' }
|
|
362
|
+
: { ...appearance, colorMode: 'light', lightBase: v },
|
|
363
|
+
brand,
|
|
364
|
+
assets,
|
|
365
|
+
),
|
|
366
|
+
[appearance, brand, assets, update],
|
|
367
|
+
)
|
|
368
|
+
// Turning it off keeps whatever is on screen, so nothing jumps.
|
|
369
|
+
const setMatchSystem = useCallback(
|
|
370
|
+
(on: boolean) =>
|
|
371
|
+
update({ ...appearance, colorMode: on ? 'system' : resolvedTheme }, brand, assets),
|
|
372
|
+
[appearance, brand, assets, update, resolvedTheme],
|
|
373
|
+
)
|
|
323
374
|
const setAccent = useCallback(
|
|
324
375
|
(v: string) => update({ ...appearance, accent: v }, brand, assets),
|
|
325
376
|
[appearance, brand, assets, update],
|
|
@@ -498,29 +549,65 @@ export function useAppearanceSettings(
|
|
|
498
549
|
}
|
|
499
550
|
}, [brand, assets])
|
|
500
551
|
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
552
|
+
// Not memoized on [appearance, brand]: a save moves the baseline (a ref)
|
|
553
|
+
// without changing either, and the dirty-only save bar must hide then.
|
|
554
|
+
const dirty = snapshot(appearance, brand) !== baselineRef.current
|
|
555
|
+
|
|
556
|
+
// Unsaved picks are only a live preview. Leaving the tab (Radix unmounts it)
|
|
557
|
+
// or Settings without saving puts the saved look back, cache included.
|
|
558
|
+
// Leaving while a save is in flight shows what is being saved instead; if
|
|
559
|
+
// that save then fails, the look goes back to the last saved snapshot.
|
|
560
|
+
const latestRef = useRef({ appearance, brand, assets })
|
|
561
|
+
useEffect(() => {
|
|
562
|
+
latestRef.current = { appearance, brand, assets }
|
|
563
|
+
}, [appearance, brand, assets])
|
|
564
|
+
const pendingSaveRef = useRef<string | null>(null)
|
|
565
|
+
const mountedRef = useRef(true)
|
|
566
|
+
const applySaved = useCallback((saved: string, assetMap: Record<string, AssetPreview>) => {
|
|
567
|
+
const { a, b } = JSON.parse(saved) as { a: AppearanceForm; b: BrandForm }
|
|
568
|
+
applyRef.current(themeSnapshot(a, b, assetMap, siteTitleRef.current))
|
|
569
|
+
}, [])
|
|
570
|
+
useEffect(() => {
|
|
571
|
+
mountedRef.current = true
|
|
572
|
+
return () => {
|
|
573
|
+
mountedRef.current = false
|
|
574
|
+
const { appearance: a, brand: b, assets: assetMap } = latestRef.current
|
|
575
|
+
const target = pendingSaveRef.current ?? baselineRef.current
|
|
576
|
+
if (snapshot(a, b) === target) return
|
|
577
|
+
applySaved(target, assetMap)
|
|
578
|
+
}
|
|
579
|
+
}, [applySaved])
|
|
505
580
|
|
|
506
581
|
const save = useCallback(async () => {
|
|
507
582
|
if (!canEdit) return
|
|
508
583
|
if (issues.some((i) => i.severity === 'error')) return
|
|
509
584
|
setSaveState('saving')
|
|
510
585
|
setSaveError(null)
|
|
586
|
+
const saving = snapshot(appearance, brand)
|
|
587
|
+
pendingSaveRef.current = saving
|
|
588
|
+
const fail = (message: string) => {
|
|
589
|
+
pendingSaveRef.current = null
|
|
590
|
+
setSaveState('error')
|
|
591
|
+
setSaveError(message)
|
|
592
|
+
if (mountedRef.current) return
|
|
593
|
+
// The tab is gone, so nothing shows the error and the look shows the
|
|
594
|
+
// failed picks: put the saved look back and say so.
|
|
595
|
+
applySaved(baselineRef.current, assets)
|
|
596
|
+
toast.error(`Admin appearance wasn't saved: ${message}`)
|
|
597
|
+
}
|
|
511
598
|
|
|
512
599
|
// Read-modify-write the settings global so we never clobber sibling keys
|
|
513
600
|
// (siteTitle, SEO defaults, AI flags, …) written by other settings tabs.
|
|
514
601
|
const current = await cmsApi<Record<string, unknown>>('/globals/settings')
|
|
515
602
|
if (current.error) {
|
|
516
|
-
|
|
517
|
-
setSaveError(current.error)
|
|
603
|
+
fail(current.error)
|
|
518
604
|
return
|
|
519
605
|
}
|
|
520
606
|
const now = new Date().toISOString()
|
|
521
607
|
const brandPayload: BrandSettings = { ...(brand as BrandSettings), updatedAt: now }
|
|
522
608
|
const appearancePayload = {
|
|
523
609
|
adminColorModeDefault: appearance.colorMode,
|
|
610
|
+
adminLightBase: appearance.lightBase,
|
|
524
611
|
adminAccentColor: appearance.accent,
|
|
525
612
|
sidebarDensity: appearance.density,
|
|
526
613
|
contentFont: appearance.font,
|
|
@@ -535,11 +622,11 @@ export function useAppearanceSettings(
|
|
|
535
622
|
}
|
|
536
623
|
const res = await cmsApi('/globals/settings', { method: 'PUT', body: JSON.stringify(merged) })
|
|
537
624
|
if (res.error) {
|
|
538
|
-
|
|
539
|
-
setSaveError(res.error)
|
|
625
|
+
fail(res.error)
|
|
540
626
|
return
|
|
541
627
|
}
|
|
542
|
-
baselineRef.current =
|
|
628
|
+
baselineRef.current = saving
|
|
629
|
+
pendingSaveRef.current = null
|
|
543
630
|
setAdminBrand(adminBrandToCache(brand as BrandSettings, assets, siteTitleRef.current))
|
|
544
631
|
// Notify live surfaces (browser-tab favicon) to refresh from the saved
|
|
545
632
|
// brand without a full reload.
|
|
@@ -547,7 +634,9 @@ export function useAppearanceSettings(
|
|
|
547
634
|
window.dispatchEvent(new CustomEvent(BRAND_UPDATED_EVENT))
|
|
548
635
|
}
|
|
549
636
|
setSaveState('success')
|
|
550
|
-
|
|
637
|
+
// The tab's own "Saved" toast went with it.
|
|
638
|
+
if (!mountedRef.current) toast.success('Saved')
|
|
639
|
+
}, [canEdit, issues, appearance, brand, assets, setAdminBrand, applySaved])
|
|
551
640
|
|
|
552
641
|
const reset = useCallback(() => {
|
|
553
642
|
const base = JSON.parse(baselineRef.current) as { a: AppearanceForm; b: BrandForm }
|
|
@@ -570,6 +659,8 @@ export function useAppearanceSettings(
|
|
|
570
659
|
showAdvanced,
|
|
571
660
|
setShowAdvanced,
|
|
572
661
|
setColorMode,
|
|
662
|
+
setBase,
|
|
663
|
+
setMatchSystem,
|
|
573
664
|
setAccent,
|
|
574
665
|
setDensity,
|
|
575
666
|
setFont,
|