@prenta/admin 2.6.1 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +98 -0
- package/design-system/tokens.css +179 -85
- package/design-system/tokens.json +276 -85
- package/design-system/tokens.scss +148 -44
- package/design-system/tokens.tailwind.cjs +50 -1
- package/dist/AdminRoot.d.ts.map +1 -1
- package/dist/AdminRoot.js +42 -20
- package/dist/AdminRoot.js.map +1 -1
- package/dist/LoginRoot.d.ts.map +1 -1
- package/dist/LoginRoot.js +2 -1
- package/dist/LoginRoot.js.map +1 -1
- package/dist/__tests__/components/author-avatar.test.js +3 -17
- package/dist/__tests__/components/author-avatar.test.js.map +1 -1
- package/dist/__tests__/components/notification-bell.test.js +86 -15
- package/dist/__tests__/components/notification-bell.test.js.map +1 -1
- package/dist/__tests__/components/responsive-tiers.render.test.d.ts +2 -0
- package/dist/__tests__/components/responsive-tiers.render.test.d.ts.map +1 -0
- package/dist/__tests__/components/responsive-tiers.render.test.js +313 -0
- package/dist/__tests__/components/responsive-tiers.render.test.js.map +1 -0
- package/dist/__tests__/components/serp-preview.render.test.js +6 -3
- package/dist/__tests__/components/serp-preview.render.test.js.map +1 -1
- package/dist/__tests__/components/shell-primitives.render.test.d.ts +2 -0
- package/dist/__tests__/components/shell-primitives.render.test.d.ts.map +1 -0
- package/dist/__tests__/components/shell-primitives.render.test.js +716 -0
- package/dist/__tests__/components/shell-primitives.render.test.js.map +1 -0
- package/dist/__tests__/components/theme-provider-accent.test.js +49 -7
- package/dist/__tests__/components/theme-provider-accent.test.js.map +1 -1
- package/dist/__tests__/components/toggle.test.js +10 -3
- package/dist/__tests__/components/toggle.test.js.map +1 -1
- package/dist/__tests__/components/ui-primitives.test.js +3 -7
- package/dist/__tests__/components/ui-primitives.test.js.map +1 -1
- package/dist/__tests__/layout/build-nav-items.test.js +1 -1
- package/dist/__tests__/layout/build-nav-items.test.js.map +1 -1
- package/dist/__tests__/layout/shell-nav.render.test.d.ts +2 -0
- package/dist/__tests__/layout/shell-nav.render.test.d.ts.map +1 -0
- package/dist/__tests__/layout/shell-nav.render.test.js +736 -0
- package/dist/__tests__/layout/shell-nav.render.test.js.map +1 -0
- package/dist/__tests__/layout/sidebar-forms-submenu.render.test.js +8 -4
- package/dist/__tests__/layout/sidebar-forms-submenu.render.test.js.map +1 -1
- package/dist/__tests__/layout/sidebar-groups.render.test.d.ts +2 -0
- package/dist/__tests__/layout/sidebar-groups.render.test.d.ts.map +1 -0
- package/dist/__tests__/layout/sidebar-groups.render.test.js +56 -0
- package/dist/__tests__/layout/sidebar-groups.render.test.js.map +1 -0
- package/dist/__tests__/layout/sidebar-menus.render.test.d.ts +2 -0
- package/dist/__tests__/layout/sidebar-menus.render.test.d.ts.map +1 -0
- package/dist/__tests__/layout/sidebar-menus.render.test.js +82 -0
- package/dist/__tests__/layout/sidebar-menus.render.test.js.map +1 -0
- package/dist/__tests__/layout/sidebar-plugin-nav.test.js +1 -1
- package/dist/__tests__/layout/sidebar-plugin-nav.test.js.map +1 -1
- package/dist/__tests__/layout/sidebar-posts.test.js +48 -38
- package/dist/__tests__/layout/sidebar-posts.test.js.map +1 -1
- package/dist/__tests__/layout/sidebar-submenu.render.test.js +26 -10
- package/dist/__tests__/layout/sidebar-submenu.render.test.js.map +1 -1
- package/dist/__tests__/layout/topbar.render.test.d.ts +2 -0
- package/dist/__tests__/layout/topbar.render.test.d.ts.map +1 -0
- package/dist/__tests__/layout/topbar.render.test.js +406 -0
- package/dist/__tests__/layout/topbar.render.test.js.map +1 -0
- package/dist/__tests__/lib/api.test.js +2 -0
- package/dist/__tests__/lib/api.test.js.map +1 -1
- package/dist/__tests__/lib/job-drawer.test.d.ts +2 -0
- package/dist/__tests__/lib/job-drawer.test.d.ts.map +1 -0
- package/dist/__tests__/lib/job-drawer.test.js +393 -0
- package/dist/__tests__/lib/job-drawer.test.js.map +1 -0
- package/dist/__tests__/lib/job-view.test.d.ts +2 -0
- package/dist/__tests__/lib/job-view.test.d.ts.map +1 -0
- package/dist/__tests__/lib/job-view.test.js +387 -0
- package/dist/__tests__/lib/job-view.test.js.map +1 -0
- package/dist/__tests__/lib/jobs-service.test.d.ts +2 -0
- package/dist/__tests__/lib/jobs-service.test.d.ts.map +1 -0
- package/dist/__tests__/lib/jobs-service.test.js +88 -0
- package/dist/__tests__/lib/jobs-service.test.js.map +1 -0
- package/dist/__tests__/router/admin-route-order.test.d.ts +2 -0
- package/dist/__tests__/router/admin-route-order.test.d.ts.map +1 -0
- package/dist/__tests__/router/admin-route-order.test.js +36 -0
- package/dist/__tests__/router/admin-route-order.test.js.map +1 -0
- package/dist/__tests__/styles/ai-gradient-contrast.test.d.ts +2 -0
- package/dist/__tests__/styles/ai-gradient-contrast.test.d.ts.map +1 -0
- package/dist/__tests__/styles/ai-gradient-contrast.test.js +110 -0
- package/dist/__tests__/styles/ai-gradient-contrast.test.js.map +1 -0
- package/dist/__tests__/styles/breakpoint-order.test.d.ts +2 -0
- package/dist/__tests__/styles/breakpoint-order.test.d.ts.map +1 -0
- package/dist/__tests__/styles/breakpoint-order.test.js +52 -0
- package/dist/__tests__/styles/breakpoint-order.test.js.map +1 -0
- package/dist/__tests__/styles/responsive-layer.test.js +303 -12
- package/dist/__tests__/styles/responsive-layer.test.js.map +1 -1
- package/dist/__tests__/styles/tailwind-preset.test.d.ts +2 -0
- package/dist/__tests__/styles/tailwind-preset.test.d.ts.map +1 -0
- package/dist/__tests__/styles/tailwind-preset.test.js +147 -0
- package/dist/__tests__/styles/tailwind-preset.test.js.map +1 -0
- package/dist/__tests__/styles/theme-token-scope.test.js +9 -3
- package/dist/__tests__/styles/theme-token-scope.test.js.map +1 -1
- package/dist/__tests__/styles/tiers.test.d.ts +2 -0
- package/dist/__tests__/styles/tiers.test.d.ts.map +1 -0
- package/dist/__tests__/styles/tiers.test.js +121 -0
- package/dist/__tests__/styles/tiers.test.js.map +1 -0
- package/dist/__tests__/styles/tokens-drift.test.js +57 -6
- package/dist/__tests__/styles/tokens-drift.test.js.map +1 -1
- package/dist/__tests__/views/admin-lazy-route.render.test.js +27 -1
- package/dist/__tests__/views/admin-lazy-route.render.test.js.map +1 -1
- package/dist/__tests__/views/ai-settings.render.test.js +4 -4
- package/dist/__tests__/views/appearance-menus-route.render.test.d.ts +2 -0
- package/dist/__tests__/views/appearance-menus-route.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/appearance-menus-route.render.test.js +50 -0
- package/dist/__tests__/views/appearance-menus-route.render.test.js.map +1 -0
- package/dist/__tests__/views/appearance-settings.render.test.js +8 -6
- package/dist/__tests__/views/appearance-settings.render.test.js.map +1 -1
- package/dist/__tests__/views/appearance-theme-provider.render.test.d.ts +2 -0
- package/dist/__tests__/views/appearance-theme-provider.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/appearance-theme-provider.render.test.js +286 -0
- package/dist/__tests__/views/appearance-theme-provider.render.test.js.map +1 -0
- package/dist/__tests__/views/dashboard.test.js +37 -0
- package/dist/__tests__/views/dashboard.test.js.map +1 -1
- package/dist/__tests__/views/document-edit-navigation.render.test.d.ts +2 -0
- package/dist/__tests__/views/document-edit-navigation.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/document-edit-navigation.render.test.js +101 -0
- package/dist/__tests__/views/document-edit-navigation.render.test.js.map +1 -0
- package/dist/__tests__/views/document-edit-routes.render.test.d.ts +2 -0
- package/dist/__tests__/views/document-edit-routes.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/document-edit-routes.render.test.js +113 -0
- package/dist/__tests__/views/document-edit-routes.render.test.js.map +1 -0
- package/dist/__tests__/views/email-settings.render.test.js +2 -2
- package/dist/__tests__/views/form-entries.render.test.js +15 -0
- package/dist/__tests__/views/form-entries.render.test.js.map +1 -1
- package/dist/__tests__/views/form-submissions.render.test.js +18 -0
- package/dist/__tests__/views/form-submissions.render.test.js.map +1 -1
- package/dist/__tests__/views/forms-list.render.test.js +12 -0
- package/dist/__tests__/views/forms-list.render.test.js.map +1 -1
- package/dist/__tests__/views/general-settings.render.test.js +26 -10
- package/dist/__tests__/views/general-settings.render.test.js.map +1 -1
- package/dist/__tests__/views/jobs-drawer.render.test.d.ts +2 -0
- package/dist/__tests__/views/jobs-drawer.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/jobs-drawer.render.test.js +908 -0
- package/dist/__tests__/views/jobs-drawer.render.test.js.map +1 -0
- package/dist/__tests__/views/jobs-list.render.test.d.ts +2 -0
- package/dist/__tests__/views/jobs-list.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/jobs-list.render.test.js +695 -0
- package/dist/__tests__/views/jobs-list.render.test.js.map +1 -0
- package/dist/__tests__/views/kpi-grid.test.d.ts +2 -0
- package/dist/__tests__/views/kpi-grid.test.d.ts.map +1 -0
- package/dist/__tests__/views/kpi-grid.test.js +26 -0
- package/dist/__tests__/views/kpi-grid.test.js.map +1 -0
- package/dist/__tests__/views/post-section-editor.test.js +3 -1
- package/dist/__tests__/views/post-section-editor.test.js.map +1 -1
- package/dist/__tests__/views/script-tags.render.test.js +25 -0
- package/dist/__tests__/views/script-tags.render.test.js.map +1 -1
- package/dist/__tests__/views/security-settings.render.test.js +9 -8
- package/dist/__tests__/views/security-settings.render.test.js.map +1 -1
- package/dist/__tests__/views/seo-settings.render.test.js +7 -7
- package/dist/__tests__/views/seo-settings.render.test.js.map +1 -1
- package/dist/__tests__/views/settings-save-bar.render.test.d.ts +2 -0
- package/dist/__tests__/views/settings-save-bar.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/settings-save-bar.render.test.js +68 -0
- package/dist/__tests__/views/settings-save-bar.render.test.js.map +1 -0
- package/dist/__tests__/views/settings-save-footer.render.test.js +23 -15
- package/dist/__tests__/views/settings-save-footer.render.test.js.map +1 -1
- package/dist/__tests__/views/settings-tabs.render.test.d.ts +2 -0
- package/dist/__tests__/views/settings-tabs.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/settings-tabs.render.test.js +319 -0
- package/dist/__tests__/views/settings-tabs.render.test.js.map +1 -0
- package/dist/__tests__/views/updates-tab.render.test.js +4 -3
- package/dist/__tests__/views/updates-tab.render.test.js.map +1 -1
- package/dist/components/Breadcrumbs.d.ts +8 -1
- package/dist/components/Breadcrumbs.d.ts.map +1 -1
- package/dist/components/Breadcrumbs.js +6 -0
- package/dist/components/Breadcrumbs.js.map +1 -1
- package/dist/components/CommandPalette.d.ts.map +1 -1
- package/dist/components/CommandPalette.js +40 -4
- package/dist/components/CommandPalette.js.map +1 -1
- package/dist/components/LocaleSwitcher.d.ts.map +1 -1
- package/dist/components/LocaleSwitcher.js +1 -1
- package/dist/components/LocaleSwitcher.js.map +1 -1
- package/dist/components/NotificationBell.d.ts.map +1 -1
- package/dist/components/NotificationBell.js +44 -3
- package/dist/components/NotificationBell.js.map +1 -1
- package/dist/components/OfflineStatus.js +1 -1
- package/dist/components/OfflineStatus.js.map +1 -1
- package/dist/components/PresenceIndicator.d.ts.map +1 -1
- package/dist/components/PresenceIndicator.js +2 -1
- package/dist/components/PresenceIndicator.js.map +1 -1
- package/dist/components/ReflowMeter.js +2 -2
- package/dist/components/ReflowMeter.js.map +1 -1
- package/dist/components/SEOPanel.js +2 -2
- package/dist/components/SEOPanel.js.map +1 -1
- package/dist/components/ThemeProvider.d.ts +24 -4
- package/dist/components/ThemeProvider.d.ts.map +1 -1
- package/dist/components/ThemeProvider.js +80 -22
- package/dist/components/ThemeProvider.js.map +1 -1
- package/dist/components/TipTapEditor.d.ts.map +1 -1
- package/dist/components/TipTapEditor.js +3 -4
- package/dist/components/TipTapEditor.js.map +1 -1
- package/dist/components/forms/EmbedPanel.js +1 -1
- package/dist/components/forms/EmbedPanel.js.map +1 -1
- package/dist/components/forms/FormEntryDetailPane.js +6 -1
- package/dist/components/forms/FormEntryDetailPane.js.map +1 -1
- package/dist/components/forms/ShortcodeGlossary.d.ts.map +1 -1
- package/dist/components/forms/ShortcodeGlossary.js +6 -1
- package/dist/components/forms/ShortcodeGlossary.js.map +1 -1
- package/dist/components/forms/primitives.d.ts +15 -5
- package/dist/components/forms/primitives.d.ts.map +1 -1
- package/dist/components/forms/primitives.js +11 -11
- package/dist/components/forms/primitives.js.map +1 -1
- package/dist/components/pages/tag-badges.d.ts +2 -1
- package/dist/components/pages/tag-badges.d.ts.map +1 -1
- package/dist/components/pages/tag-badges.js +4 -3
- package/dist/components/pages/tag-badges.js.map +1 -1
- package/dist/components/seo/PageAuditPanel.js +2 -2
- package/dist/components/seo/PageAuditPanel.js.map +1 -1
- package/dist/components/seo/SerpPreview.d.ts +4 -4
- package/dist/components/seo/SerpPreview.js +1 -1
- package/dist/components/seo/SerpPreview.js.map +1 -1
- package/dist/components/seo/primitives.js +2 -2
- package/dist/components/seo/primitives.js.map +1 -1
- package/dist/components/ui/AuthorAvatar.d.ts +4 -4
- package/dist/components/ui/AuthorAvatar.d.ts.map +1 -1
- package/dist/components/ui/AuthorAvatar.js +11 -10
- package/dist/components/ui/AuthorAvatar.js.map +1 -1
- package/dist/components/ui/Badge.d.ts +1 -1
- package/dist/components/ui/Badge.js +1 -1
- package/dist/components/ui/Badge.js.map +1 -1
- package/dist/components/ui/Breadcrumb.d.ts +27 -0
- package/dist/components/ui/Breadcrumb.d.ts.map +1 -0
- package/dist/components/ui/Breadcrumb.js +41 -0
- package/dist/components/ui/Breadcrumb.js.map +1 -0
- package/dist/components/ui/Button.d.ts +2 -2
- package/dist/components/ui/Button.d.ts.map +1 -1
- package/dist/components/ui/Button.js +31 -16
- package/dist/components/ui/Button.js.map +1 -1
- package/dist/components/ui/Card.d.ts +8 -4
- package/dist/components/ui/Card.d.ts.map +1 -1
- package/dist/components/ui/Card.js +21 -13
- package/dist/components/ui/Card.js.map +1 -1
- package/dist/components/ui/CardListControls.d.ts +34 -0
- package/dist/components/ui/CardListControls.d.ts.map +1 -0
- package/dist/components/ui/CardListControls.js +25 -0
- package/dist/components/ui/CardListControls.js.map +1 -0
- package/dist/components/ui/CountChip.d.ts +20 -0
- package/dist/components/ui/CountChip.d.ts.map +1 -0
- package/dist/components/ui/CountChip.js +48 -0
- package/dist/components/ui/CountChip.js.map +1 -0
- package/dist/components/ui/FilterPill.d.ts +2 -1
- package/dist/components/ui/FilterPill.d.ts.map +1 -1
- package/dist/components/ui/FilterPill.js +3 -2
- package/dist/components/ui/FilterPill.js.map +1 -1
- package/dist/components/ui/Input.d.ts +1 -1
- package/dist/components/ui/InspectorPane.d.ts +1 -1
- package/dist/components/ui/InspectorPane.d.ts.map +1 -1
- package/dist/components/ui/InspectorPane.js +15 -4
- package/dist/components/ui/InspectorPane.js.map +1 -1
- package/dist/components/ui/Modal.d.ts.map +1 -1
- package/dist/components/ui/Modal.js +10 -2
- package/dist/components/ui/Modal.js.map +1 -1
- package/dist/components/ui/PageHeader.d.ts +28 -0
- package/dist/components/ui/PageHeader.d.ts.map +1 -0
- package/dist/components/ui/PageHeader.js +18 -0
- package/dist/components/ui/PageHeader.js.map +1 -0
- package/dist/components/ui/RowActions.d.ts +5 -0
- package/dist/components/ui/RowActions.d.ts.map +1 -1
- package/dist/components/ui/RowActions.js +7 -2
- package/dist/components/ui/RowActions.js.map +1 -1
- package/dist/components/ui/Segmented.d.ts +21 -0
- package/dist/components/ui/Segmented.d.ts.map +1 -0
- package/dist/components/ui/Segmented.js +41 -0
- package/dist/components/ui/Segmented.js.map +1 -0
- package/dist/components/ui/Toaster.d.ts +12 -0
- package/dist/components/ui/Toaster.d.ts.map +1 -0
- package/dist/components/ui/Toaster.js +103 -0
- package/dist/components/ui/Toaster.js.map +1 -0
- package/dist/components/ui/Toggle.d.ts +4 -3
- package/dist/components/ui/Toggle.d.ts.map +1 -1
- package/dist/components/ui/Toggle.js +16 -12
- package/dist/components/ui/Toggle.js.map +1 -1
- package/dist/components/ui/UnderlineTabs.d.ts +56 -0
- package/dist/components/ui/UnderlineTabs.d.ts.map +1 -0
- package/dist/components/ui/UnderlineTabs.js +205 -0
- package/dist/components/ui/UnderlineTabs.js.map +1 -0
- package/dist/components/ui/UnsavedBar.d.ts +25 -0
- package/dist/components/ui/UnsavedBar.d.ts.map +1 -0
- package/dist/components/ui/UnsavedBar.js +22 -0
- package/dist/components/ui/UnsavedBar.js.map +1 -0
- package/dist/components/ui/admin-links.d.ts +11 -0
- package/dist/components/ui/admin-links.d.ts.map +1 -0
- package/dist/components/ui/admin-links.js +10 -0
- package/dist/components/ui/admin-links.js.map +1 -0
- package/dist/components/ui/card-table.d.ts +43 -0
- package/dist/components/ui/card-table.d.ts.map +1 -0
- package/dist/components/ui/card-table.js +31 -0
- package/dist/components/ui/card-table.js.map +1 -0
- package/dist/components/virtual-window.d.ts +7 -0
- package/dist/components/virtual-window.d.ts.map +1 -1
- package/dist/components/virtual-window.js +5 -2
- package/dist/components/virtual-window.js.map +1 -1
- package/dist/fields/RelationshipField.js +1 -1
- package/dist/fields/RelationshipField.js.map +1 -1
- package/dist/files/dm-mono-latin-400-normal.woff +0 -0
- package/dist/files/dm-mono-latin-400-normal.woff2 +0 -0
- package/dist/files/dm-mono-latin-500-normal.woff +0 -0
- package/dist/files/dm-mono-latin-500-normal.woff2 +0 -0
- package/dist/files/dm-mono-latin-ext-400-normal.woff +0 -0
- package/dist/files/dm-mono-latin-ext-400-normal.woff2 +0 -0
- package/dist/files/dm-mono-latin-ext-500-normal.woff +0 -0
- package/dist/files/dm-mono-latin-ext-500-normal.woff2 +0 -0
- package/dist/files/dm-sans-latin-400-normal.woff +0 -0
- package/dist/files/dm-sans-latin-400-normal.woff2 +0 -0
- package/dist/files/dm-sans-latin-500-normal.woff +0 -0
- package/dist/files/dm-sans-latin-500-normal.woff2 +0 -0
- package/dist/files/dm-sans-latin-600-normal.woff +0 -0
- package/dist/files/dm-sans-latin-600-normal.woff2 +0 -0
- package/dist/files/dm-sans-latin-700-normal.woff +0 -0
- package/dist/files/dm-sans-latin-700-normal.woff2 +0 -0
- package/dist/files/dm-sans-latin-ext-400-normal.woff +0 -0
- package/dist/files/dm-sans-latin-ext-400-normal.woff2 +0 -0
- package/dist/files/dm-sans-latin-ext-500-normal.woff +0 -0
- package/dist/files/dm-sans-latin-ext-500-normal.woff2 +0 -0
- package/dist/files/dm-sans-latin-ext-600-normal.woff +0 -0
- package/dist/files/dm-sans-latin-ext-600-normal.woff2 +0 -0
- package/dist/files/dm-sans-latin-ext-700-normal.woff +0 -0
- package/dist/files/dm-sans-latin-ext-700-normal.woff2 +0 -0
- package/dist/hooks/useAppearanceBootstrap.d.ts.map +1 -1
- package/dist/hooks/useAppearanceBootstrap.js +9 -3
- package/dist/hooks/useAppearanceBootstrap.js.map +1 -1
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/layout/Header.d.ts +14 -5
- package/dist/layout/Header.d.ts.map +1 -1
- package/dist/layout/Header.js +78 -13
- package/dist/layout/Header.js.map +1 -1
- package/dist/layout/Layout.d.ts +5 -3
- package/dist/layout/Layout.d.ts.map +1 -1
- package/dist/layout/Layout.js +45 -54
- package/dist/layout/Layout.js.map +1 -1
- package/dist/layout/MobileTabBar.d.ts +20 -0
- package/dist/layout/MobileTabBar.d.ts.map +1 -0
- package/dist/layout/MobileTabBar.js +29 -0
- package/dist/layout/MobileTabBar.js.map +1 -0
- package/dist/layout/Sidebar.d.ts +8 -26
- package/dist/layout/Sidebar.d.ts.map +1 -1
- package/dist/layout/Sidebar.js +309 -345
- package/dist/layout/Sidebar.js.map +1 -1
- package/dist/layout/nav-config.d.ts +101 -0
- package/dist/layout/nav-config.d.ts.map +1 -0
- package/dist/layout/nav-config.js +297 -0
- package/dist/layout/nav-config.js.map +1 -0
- package/dist/layout/primitives/AdminShell.d.ts +10 -2
- package/dist/layout/primitives/AdminShell.d.ts.map +1 -1
- package/dist/layout/primitives/AdminShell.js +114 -6
- package/dist/layout/primitives/AdminShell.js.map +1 -1
- package/dist/layout/topbar-classes.d.ts +8 -0
- package/dist/layout/topbar-classes.d.ts.map +1 -0
- package/dist/layout/topbar-classes.js +8 -0
- package/dist/layout/topbar-classes.js.map +1 -0
- package/dist/layout/use-nav-items.d.ts +10 -0
- package/dist/layout/use-nav-items.d.ts.map +1 -0
- package/dist/layout/use-nav-items.js +39 -0
- package/dist/layout/use-nav-items.js.map +1 -0
- package/dist/lib/api.d.ts +6 -0
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +1 -1
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/appearance-api.d.ts +3 -1
- package/dist/lib/appearance-api.d.ts.map +1 -1
- package/dist/lib/appearance-api.js +1 -0
- package/dist/lib/appearance-api.js.map +1 -1
- package/dist/lib/job-drawer.d.ts +128 -0
- package/dist/lib/job-drawer.d.ts.map +1 -0
- package/dist/lib/job-drawer.js +351 -0
- package/dist/lib/job-drawer.js.map +1 -0
- package/dist/lib/job-view.d.ts +187 -0
- package/dist/lib/job-view.d.ts.map +1 -0
- package/dist/lib/job-view.js +363 -0
- package/dist/lib/job-view.js.map +1 -0
- package/dist/lib/jobs-service.d.ts +134 -0
- package/dist/lib/jobs-service.d.ts.map +1 -0
- package/dist/lib/jobs-service.js +179 -0
- package/dist/lib/jobs-service.js.map +1 -0
- package/dist/lib/sheet-focus.d.ts +24 -0
- package/dist/lib/sheet-focus.d.ts.map +1 -0
- package/dist/lib/sheet-focus.js +61 -0
- package/dist/lib/sheet-focus.js.map +1 -0
- package/dist/lib/tiers.d.ts +30 -0
- package/dist/lib/tiers.d.ts.map +1 -0
- package/dist/lib/tiers.js +43 -0
- package/dist/lib/tiers.js.map +1 -0
- package/dist/prenta-admin.css +1 -1
- package/dist/router/admin-routes.d.ts.map +1 -1
- package/dist/router/admin-routes.js +8 -0
- package/dist/router/admin-routes.js.map +1 -1
- package/dist/router/index.d.ts +5 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +7 -0
- package/dist/router/index.js.map +1 -1
- package/dist/views/ApiKeys.js +2 -2
- package/dist/views/ApiKeys.js.map +1 -1
- package/dist/views/AppearanceChrome.d.ts +6 -0
- package/dist/views/AppearanceChrome.d.ts.map +1 -0
- package/dist/views/AppearanceChrome.js +25 -0
- package/dist/views/AppearanceChrome.js.map +1 -0
- package/dist/views/CollectionList.d.ts.map +1 -1
- package/dist/views/CollectionList.js +73 -53
- package/dist/views/CollectionList.js.map +1 -1
- package/dist/views/Dashboard.d.ts.map +1 -1
- package/dist/views/Dashboard.js +14 -8
- package/dist/views/Dashboard.js.map +1 -1
- package/dist/views/DocumentEdit.d.ts +6 -1
- package/dist/views/DocumentEdit.d.ts.map +1 -1
- package/dist/views/DocumentEdit.js +44 -8
- package/dist/views/DocumentEdit.js.map +1 -1
- package/dist/views/FormDeliveries.d.ts.map +1 -1
- package/dist/views/FormDeliveries.js +7 -1
- package/dist/views/FormDeliveries.js.map +1 -1
- package/dist/views/FormEntries.d.ts.map +1 -1
- package/dist/views/FormEntries.js +11 -2
- package/dist/views/FormEntries.js.map +1 -1
- package/dist/views/FormSubmissions.d.ts +1 -1
- package/dist/views/FormSubmissions.d.ts.map +1 -1
- package/dist/views/FormSubmissions.js +15 -4
- package/dist/views/FormSubmissions.js.map +1 -1
- package/dist/views/Forms.d.ts.map +1 -1
- package/dist/views/Forms.js +6 -4
- package/dist/views/Forms.js.map +1 -1
- package/dist/views/FormsSettings.d.ts +2 -0
- package/dist/views/FormsSettings.d.ts.map +1 -0
- package/dist/views/FormsSettings.js +37 -0
- package/dist/views/FormsSettings.js.map +1 -0
- package/dist/views/Jobs/BusyButton.d.ts +15 -0
- package/dist/views/Jobs/BusyButton.d.ts.map +1 -0
- package/dist/views/Jobs/BusyButton.js +26 -0
- package/dist/views/Jobs/BusyButton.js.map +1 -0
- package/dist/views/Jobs/CancelJobDialog.d.ts +21 -0
- package/dist/views/Jobs/CancelJobDialog.d.ts.map +1 -0
- package/dist/views/Jobs/CancelJobDialog.js +66 -0
- package/dist/views/Jobs/CancelJobDialog.js.map +1 -0
- package/dist/views/Jobs/DrawerActivity.d.ts +16 -0
- package/dist/views/Jobs/DrawerActivity.d.ts.map +1 -0
- package/dist/views/Jobs/DrawerActivity.js +59 -0
- package/dist/views/Jobs/DrawerActivity.js.map +1 -0
- package/dist/views/Jobs/DrawerOverview.d.ts +28 -0
- package/dist/views/Jobs/DrawerOverview.d.ts.map +1 -0
- package/dist/views/Jobs/DrawerOverview.js +32 -0
- package/dist/views/Jobs/DrawerOverview.js.map +1 -0
- package/dist/views/Jobs/DrawerResults.d.ts +25 -0
- package/dist/views/Jobs/DrawerResults.d.ts.map +1 -0
- package/dist/views/Jobs/DrawerResults.js +50 -0
- package/dist/views/Jobs/DrawerResults.js.map +1 -0
- package/dist/views/Jobs/DrawerReview.d.ts +44 -0
- package/dist/views/Jobs/DrawerReview.d.ts.map +1 -0
- package/dist/views/Jobs/DrawerReview.js +110 -0
- package/dist/views/Jobs/DrawerReview.js.map +1 -0
- package/dist/views/Jobs/JobDrawer.d.ts +31 -0
- package/dist/views/Jobs/JobDrawer.d.ts.map +1 -0
- package/dist/views/Jobs/JobDrawer.js +353 -0
- package/dist/views/Jobs/JobDrawer.js.map +1 -0
- package/dist/views/Jobs/JobsTable.d.ts +19 -0
- package/dist/views/Jobs/JobsTable.d.ts.map +1 -0
- package/dist/views/Jobs/JobsTable.js +80 -0
- package/dist/views/Jobs/JobsTable.js.map +1 -0
- package/dist/views/Jobs/WorkerStrip.d.ts +22 -0
- package/dist/views/Jobs/WorkerStrip.d.ts.map +1 -0
- package/dist/views/Jobs/WorkerStrip.js +63 -0
- package/dist/views/Jobs/WorkerStrip.js.map +1 -0
- package/dist/views/Jobs/atoms.d.ts +19 -0
- package/dist/views/Jobs/atoms.d.ts.map +1 -0
- package/dist/views/Jobs/atoms.js +52 -0
- package/dist/views/Jobs/atoms.js.map +1 -0
- package/dist/views/Jobs/focus.d.ts +23 -0
- package/dist/views/Jobs/focus.d.ts.map +1 -0
- package/dist/views/Jobs/focus.js +54 -0
- package/dist/views/Jobs/focus.js.map +1 -0
- package/dist/views/Jobs/icons.d.ts +22 -0
- package/dist/views/Jobs/icons.d.ts.map +1 -0
- package/dist/views/Jobs/icons.js +23 -0
- package/dist/views/Jobs/icons.js.map +1 -0
- package/dist/views/Jobs/placeholders.d.ts +6 -0
- package/dist/views/Jobs/placeholders.d.ts.map +1 -0
- package/dist/views/Jobs/placeholders.js +20 -0
- package/dist/views/Jobs/placeholders.js.map +1 -0
- package/dist/views/Jobs/useJobDetail.d.ts +21 -0
- package/dist/views/Jobs/useJobDetail.d.ts.map +1 -0
- package/dist/views/Jobs/useJobDetail.js +39 -0
- package/dist/views/Jobs/useJobDetail.js.map +1 -0
- package/dist/views/Jobs/useJobsFeed.d.ts +35 -0
- package/dist/views/Jobs/useJobsFeed.d.ts.map +1 -0
- package/dist/views/Jobs/useJobsFeed.js +231 -0
- package/dist/views/Jobs/useJobsFeed.js.map +1 -0
- package/dist/views/Jobs/useReviewItems.d.ts +39 -0
- package/dist/views/Jobs/useReviewItems.d.ts.map +1 -0
- package/dist/views/Jobs/useReviewItems.js +140 -0
- package/dist/views/Jobs/useReviewItems.js.map +1 -0
- package/dist/views/Jobs.d.ts +10 -1
- package/dist/views/Jobs.d.ts.map +1 -1
- package/dist/views/Jobs.js +126 -35
- package/dist/views/Jobs.js.map +1 -1
- package/dist/views/MediaBrowser.d.ts.map +1 -1
- package/dist/views/MediaBrowser.js +37 -9
- package/dist/views/MediaBrowser.js.map +1 -1
- package/dist/views/Pages/PagesListView.d.ts +1 -1
- package/dist/views/Pages/PagesListView.d.ts.map +1 -1
- package/dist/views/Pages/PagesListView.js +34 -5
- package/dist/views/Pages/PagesListView.js.map +1 -1
- package/dist/views/Posts/NewPostTypeInstructions.d.ts.map +1 -1
- package/dist/views/Posts/NewPostTypeInstructions.js +12 -2
- package/dist/views/Posts/NewPostTypeInstructions.js.map +1 -1
- package/dist/views/Posts/PostTypesView.d.ts.map +1 -1
- package/dist/views/Posts/PostTypesView.js +10 -1
- package/dist/views/Posts/PostTypesView.js.map +1 -1
- package/dist/views/Posts/PostsListView.d.ts +1 -2
- package/dist/views/Posts/PostsListView.d.ts.map +1 -1
- package/dist/views/Posts/PostsListView.js +31 -3
- package/dist/views/Posts/PostsListView.js.map +1 -1
- package/dist/views/SEO.d.ts.map +1 -1
- package/dist/views/SEO.js +3 -3
- package/dist/views/SEO.js.map +1 -1
- package/dist/views/ScriptTags.d.ts.map +1 -1
- package/dist/views/ScriptTags.js +20 -15
- package/dist/views/ScriptTags.js.map +1 -1
- package/dist/views/Settings.d.ts.map +1 -1
- package/dist/views/Settings.js +115 -51
- package/dist/views/Settings.js.map +1 -1
- package/dist/views/SpamFolder.d.ts +2 -0
- package/dist/views/SpamFolder.d.ts.map +1 -0
- package/dist/views/SpamFolder.js +14 -0
- package/dist/views/SpamFolder.js.map +1 -0
- package/dist/views/Trash.d.ts +6 -1
- package/dist/views/Trash.d.ts.map +1 -1
- package/dist/views/Trash.js +7 -2
- package/dist/views/Trash.js.map +1 -1
- package/dist/views/Users.js +2 -2
- package/dist/views/Users.js.map +1 -1
- package/dist/views/WidgetsPlaceholder.d.ts +2 -0
- package/dist/views/WidgetsPlaceholder.d.ts.map +1 -0
- package/dist/views/WidgetsPlaceholder.js +15 -0
- package/dist/views/WidgetsPlaceholder.js.map +1 -0
- package/dist/views/dashboard/kpi-grid.d.ts +18 -0
- package/dist/views/dashboard/kpi-grid.d.ts.map +1 -0
- package/dist/views/dashboard/kpi-grid.js +36 -0
- package/dist/views/dashboard/kpi-grid.js.map +1 -0
- package/dist/views/lazy-views.d.ts +4 -0
- package/dist/views/lazy-views.d.ts.map +1 -1
- package/dist/views/lazy-views.js +4 -0
- package/dist/views/lazy-views.js.map +1 -1
- package/dist/views/page-editor/PageTab.js +1 -1
- package/dist/views/page-editor/PageTab.js.map +1 -1
- package/dist/views/page-editor/ReviewBar.js +1 -1
- package/dist/views/page-editor/ReviewBar.js.map +1 -1
- package/dist/views/page-editor/VersionHistoryPanel.js +1 -1
- package/dist/views/page-editor/VersionHistoryPanel.js.map +1 -1
- package/dist/views/seo/AuditTab.js +1 -1
- package/dist/views/seo/AuditTab.js.map +1 -1
- package/dist/views/seo/OverviewTab.d.ts.map +1 -1
- package/dist/views/seo/OverviewTab.js +2 -2
- package/dist/views/seo/OverviewTab.js.map +1 -1
- package/dist/views/seo/ProposalsTab.js +1 -1
- package/dist/views/seo/ProposalsTab.js.map +1 -1
- package/dist/views/settings/AISettingsTab.d.ts.map +1 -1
- package/dist/views/settings/AISettingsTab.js +4 -2
- package/dist/views/settings/AISettingsTab.js.map +1 -1
- package/dist/views/settings/AccessProtectionCard.js +1 -1
- package/dist/views/settings/AccessProtectionCard.js.map +1 -1
- package/dist/views/settings/AdminThemeCard.d.ts.map +1 -1
- package/dist/views/settings/AdminThemeCard.js +63 -15
- package/dist/views/settings/AdminThemeCard.js.map +1 -1
- package/dist/views/settings/AppearanceTab.d.ts.map +1 -1
- package/dist/views/settings/AppearanceTab.js +4 -2
- package/dist/views/settings/AppearanceTab.js.map +1 -1
- package/dist/views/settings/BrandPreviewCard.js +1 -1
- package/dist/views/settings/BrandPreviewCard.js.map +1 -1
- package/dist/views/settings/BrandVoiceCard.js +1 -1
- package/dist/views/settings/BrandVoiceCard.js.map +1 -1
- package/dist/views/settings/EmailSettingsTab.d.ts.map +1 -1
- package/dist/views/settings/EmailSettingsTab.js +5 -3
- package/dist/views/settings/EmailSettingsTab.js.map +1 -1
- package/dist/views/settings/GeneralSettingsTab.d.ts.map +1 -1
- package/dist/views/settings/GeneralSettingsTab.js +4 -2
- package/dist/views/settings/GeneralSettingsTab.js.map +1 -1
- package/dist/views/settings/ProviderConnectionCard.js +1 -1
- package/dist/views/settings/ProviderConnectionCard.js.map +1 -1
- package/dist/views/settings/SearchDataCard.js +1 -1
- package/dist/views/settings/SearchDataCard.js.map +1 -1
- package/dist/views/settings/SecurityStatusCard.js +2 -2
- package/dist/views/settings/SecurityStatusCard.js.map +1 -1
- package/dist/views/settings/SecurityTab.d.ts.map +1 -1
- package/dist/views/settings/SecurityTab.js +4 -2
- package/dist/views/settings/SecurityTab.js.map +1 -1
- package/dist/views/settings/SeoAutopilotCard.js +2 -2
- package/dist/views/settings/SeoAutopilotCard.js.map +1 -1
- package/dist/views/settings/SeoSettingsTab.d.ts.map +1 -1
- package/dist/views/settings/SeoSettingsTab.js +5 -3
- package/dist/views/settings/SeoSettingsTab.js.map +1 -1
- package/dist/views/settings/SiteIndexStatusCard.js +1 -1
- package/dist/views/settings/SiteIndexStatusCard.js.map +1 -1
- package/dist/views/settings/SiteThemeCard.js +1 -1
- package/dist/views/settings/UpdatesTab.d.ts.map +1 -1
- package/dist/views/settings/UpdatesTab.js +6 -5
- package/dist/views/settings/UpdatesTab.js.map +1 -1
- package/dist/views/settings/components.d.ts +7 -11
- package/dist/views/settings/components.d.ts.map +1 -1
- package/dist/views/settings/components.js +18 -12
- package/dist/views/settings/components.js.map +1 -1
- package/dist/views/settings/useAppearanceSettings.d.ts +7 -1
- package/dist/views/settings/useAppearanceSettings.d.ts.map +1 -1
- package/dist/views/settings/useAppearanceSettings.js +89 -22
- package/dist/views/settings/useAppearanceSettings.js.map +1 -1
- package/dist/views/users/UserDetailDrawer.js +1 -1
- package/dist/views/users/UserDetailDrawer.js.map +1 -1
- package/package.json +10 -8
- package/src/AdminRoot.tsx +88 -30
- package/src/LoginRoot.tsx +2 -1
- package/src/__tests__/components/author-avatar.test.tsx +3 -20
- package/src/__tests__/components/notification-bell.test.tsx +146 -14
- package/src/__tests__/components/responsive-tiers.render.test.tsx +461 -0
- package/src/__tests__/components/serp-preview.render.test.tsx +6 -3
- package/src/__tests__/components/shell-primitives.render.test.tsx +951 -0
- package/src/__tests__/components/theme-provider-accent.test.tsx +83 -8
- package/src/__tests__/components/toggle.test.tsx +11 -3
- package/src/__tests__/components/ui-primitives.test.tsx +5 -8
- package/src/__tests__/layout/build-nav-items.test.ts +1 -1
- package/src/__tests__/layout/shell-nav.render.test.tsx +983 -0
- package/src/__tests__/layout/sidebar-forms-submenu.render.test.tsx +8 -4
- package/src/__tests__/layout/sidebar-groups.render.test.tsx +116 -0
- package/src/__tests__/layout/sidebar-menus.render.test.tsx +116 -0
- package/src/__tests__/layout/sidebar-plugin-nav.test.ts +1 -1
- package/src/__tests__/layout/sidebar-posts.test.ts +48 -40
- package/src/__tests__/layout/sidebar-submenu.render.test.tsx +35 -10
- package/src/__tests__/layout/topbar.render.test.tsx +464 -0
- package/src/__tests__/lib/api.test.ts +2 -0
- package/src/__tests__/lib/job-drawer.test.ts +493 -0
- package/src/__tests__/lib/job-view.test.ts +437 -0
- package/src/__tests__/lib/jobs-service.test.ts +98 -0
- package/src/__tests__/router/admin-route-order.test.ts +39 -0
- package/src/__tests__/styles/ai-gradient-contrast.test.ts +135 -0
- package/src/__tests__/styles/breakpoint-order.test.ts +68 -0
- package/src/__tests__/styles/responsive-layer.test.ts +367 -12
- package/src/__tests__/styles/tailwind-preset.test.ts +154 -0
- package/src/__tests__/styles/theme-token-scope.test.ts +10 -3
- package/src/__tests__/styles/tiers.test.ts +136 -0
- package/src/__tests__/styles/tokens-drift.test.ts +67 -6
- package/src/__tests__/views/admin-lazy-route.render.test.tsx +41 -1
- package/src/__tests__/views/ai-settings.render.test.tsx +4 -4
- package/src/__tests__/views/appearance-menus-route.render.test.tsx +58 -0
- package/src/__tests__/views/appearance-settings.render.test.tsx +10 -8
- package/src/__tests__/views/appearance-theme-provider.render.test.tsx +347 -0
- package/src/__tests__/views/dashboard.test.tsx +48 -0
- package/src/__tests__/views/document-edit-navigation.render.test.tsx +130 -0
- package/src/__tests__/views/document-edit-routes.render.test.tsx +130 -0
- package/src/__tests__/views/email-settings.render.test.tsx +2 -2
- package/src/__tests__/views/form-entries.render.test.tsx +22 -0
- package/src/__tests__/views/form-submissions.render.test.tsx +22 -0
- package/src/__tests__/views/forms-list.render.test.tsx +13 -0
- package/src/__tests__/views/general-settings.render.test.tsx +38 -11
- package/src/__tests__/views/jobs-drawer.render.test.tsx +1047 -0
- package/src/__tests__/views/jobs-list.render.test.tsx +850 -0
- package/src/__tests__/views/kpi-grid.test.ts +29 -0
- package/src/__tests__/views/post-section-editor.test.tsx +5 -1
- package/src/__tests__/views/script-tags.render.test.tsx +29 -0
- package/src/__tests__/views/security-settings.render.test.tsx +9 -10
- package/src/__tests__/views/seo-settings.render.test.tsx +7 -9
- package/src/__tests__/views/settings-save-bar.render.test.tsx +91 -0
- package/src/__tests__/views/settings-save-footer.render.test.tsx +25 -15
- package/src/__tests__/views/settings-tabs.render.test.tsx +371 -0
- package/src/__tests__/views/updates-tab.render.test.tsx +4 -3
- package/src/components/Breadcrumbs.tsx +7 -1
- package/src/components/CommandPalette.tsx +51 -3
- package/src/components/LocaleSwitcher.tsx +5 -6
- package/src/components/NotificationBell.tsx +74 -18
- package/src/components/OfflineStatus.tsx +1 -1
- package/src/components/PresenceIndicator.tsx +2 -1
- package/src/components/ReflowMeter.tsx +3 -3
- package/src/components/SEOPanel.tsx +2 -2
- package/src/components/ThemeProvider.tsx +122 -42
- package/src/components/TipTapEditor.tsx +3 -4
- package/src/components/forms/EmbedPanel.tsx +1 -1
- package/src/components/forms/FormEntryDetailPane.tsx +7 -1
- package/src/components/forms/ShortcodeGlossary.tsx +7 -1
- package/src/components/forms/primitives.tsx +37 -21
- package/src/components/pages/tag-badges.tsx +4 -3
- package/src/components/seo/PageAuditPanel.tsx +2 -2
- package/src/components/seo/SerpPreview.tsx +5 -5
- package/src/components/seo/primitives.tsx +2 -2
- package/src/components/ui/AuthorAvatar.tsx +11 -10
- package/src/components/ui/Badge.tsx +1 -1
- package/src/components/ui/Breadcrumb.tsx +109 -0
- package/src/components/ui/Button.tsx +40 -15
- package/src/components/ui/Card.tsx +35 -32
- package/src/components/ui/CardListControls.tsx +90 -0
- package/src/components/ui/CountChip.tsx +90 -0
- package/src/components/ui/FilterPill.tsx +5 -3
- package/src/components/ui/InspectorPane.tsx +21 -7
- package/src/components/ui/Modal.tsx +20 -6
- package/src/components/ui/PageHeader.tsx +63 -0
- package/src/components/ui/RowActions.tsx +7 -2
- package/src/components/ui/Segmented.tsx +97 -0
- package/src/components/ui/Toaster.tsx +139 -0
- package/src/components/ui/Toggle.tsx +18 -14
- package/src/components/ui/UnderlineTabs.tsx +373 -0
- package/src/components/ui/UnsavedBar.tsx +119 -0
- package/src/components/ui/admin-links.tsx +20 -0
- package/src/components/ui/card-table.ts +34 -0
- package/src/components/virtual-window.tsx +13 -2
- package/src/fields/RelationshipField.tsx +1 -1
- package/src/hooks/useAppearanceBootstrap.ts +9 -3
- package/src/index.ts +19 -0
- package/src/layout/Header.tsx +210 -135
- package/src/layout/Layout.tsx +61 -108
- package/src/layout/MobileTabBar.tsx +92 -0
- package/src/layout/Sidebar.tsx +555 -593
- package/src/layout/nav-config.tsx +425 -0
- package/src/layout/primitives/AdminShell.tsx +154 -6
- package/src/layout/topbar-classes.ts +8 -0
- package/src/layout/use-nav-items.ts +40 -0
- package/src/lib/api.ts +7 -1
- package/src/lib/appearance-api.ts +4 -0
- package/src/lib/job-drawer.ts +424 -0
- package/src/lib/job-view.ts +456 -0
- package/src/lib/jobs-service.ts +290 -0
- package/src/lib/sheet-focus.ts +71 -0
- package/src/lib/tiers.ts +43 -0
- package/src/router/admin-routes.ts +8 -0
- package/src/router/index.ts +9 -1
- package/src/styles/prenta-tokens.css +263 -82
- package/src/styles/responsive.css +460 -22
- package/src/styles/theme.css +177 -28
- package/src/views/ApiKeys.tsx +2 -2
- package/src/views/AppearanceChrome.tsx +74 -0
- package/src/views/CollectionList.tsx +264 -205
- package/src/views/Dashboard.tsx +26 -13
- package/src/views/DocumentEdit.tsx +111 -56
- package/src/views/FormDeliveries.tsx +30 -17
- package/src/views/FormEntries.tsx +28 -20
- package/src/views/FormSubmissions.tsx +32 -34
- package/src/views/Forms.tsx +55 -34
- package/src/views/FormsSettings.tsx +94 -0
- package/src/views/Jobs/BusyButton.tsx +56 -0
- package/src/views/Jobs/CancelJobDialog.tsx +127 -0
- package/src/views/Jobs/DrawerActivity.tsx +142 -0
- package/src/views/Jobs/DrawerOverview.tsx +139 -0
- package/src/views/Jobs/DrawerResults.tsx +155 -0
- package/src/views/Jobs/DrawerReview.tsx +464 -0
- package/src/views/Jobs/JobDrawer.tsx +556 -0
- package/src/views/Jobs/JobsTable.tsx +260 -0
- package/src/views/Jobs/WorkerStrip.tsx +144 -0
- package/src/views/Jobs/atoms.tsx +93 -0
- package/src/views/Jobs/focus.ts +56 -0
- package/src/views/Jobs/icons.tsx +111 -0
- package/src/views/Jobs/placeholders.tsx +66 -0
- package/src/views/Jobs/useJobDetail.ts +64 -0
- package/src/views/Jobs/useJobsFeed.ts +249 -0
- package/src/views/Jobs/useReviewItems.ts +187 -0
- package/src/views/Jobs.tsx +282 -105
- package/src/views/MediaBrowser.tsx +71 -21
- package/src/views/Pages/PagesListView.tsx +115 -39
- package/src/views/Posts/NewPostTypeInstructions.tsx +15 -10
- package/src/views/Posts/PostTypesView.tsx +28 -6
- package/src/views/Posts/PostsListView.tsx +130 -40
- package/src/views/SEO.tsx +23 -8
- package/src/views/ScriptTags.tsx +233 -153
- package/src/views/Settings.tsx +215 -256
- package/src/views/SpamFolder.tsx +32 -0
- package/src/views/Trash.tsx +12 -1
- package/src/views/Users.tsx +2 -2
- package/src/views/WidgetsPlaceholder.tsx +33 -0
- package/src/views/dashboard/kpi-grid.ts +38 -0
- package/src/views/lazy-views.tsx +12 -0
- package/src/views/page-editor/PageTab.tsx +2 -2
- package/src/views/page-editor/ReviewBar.tsx +1 -1
- package/src/views/page-editor/VersionHistoryPanel.tsx +1 -1
- package/src/views/seo/AuditTab.tsx +1 -1
- package/src/views/seo/OverviewTab.tsx +6 -5
- package/src/views/seo/ProposalsTab.tsx +1 -1
- package/src/views/settings/AISettingsTab.tsx +10 -6
- package/src/views/settings/AccessProtectionCard.tsx +1 -1
- package/src/views/settings/AdminThemeCard.tsx +228 -35
- package/src/views/settings/AppearanceTab.tsx +10 -6
- package/src/views/settings/BrandPreviewCard.tsx +1 -1
- package/src/views/settings/BrandVoiceCard.tsx +1 -1
- package/src/views/settings/EmailSettingsTab.tsx +11 -7
- package/src/views/settings/GeneralSettingsTab.tsx +10 -6
- package/src/views/settings/ProviderConnectionCard.tsx +1 -1
- package/src/views/settings/SearchDataCard.tsx +1 -1
- package/src/views/settings/SecurityStatusCard.tsx +2 -2
- package/src/views/settings/SecurityTab.tsx +10 -6
- package/src/views/settings/SeoAutopilotCard.tsx +2 -2
- package/src/views/settings/SeoSettingsTab.tsx +13 -9
- package/src/views/settings/SiteIndexStatusCard.tsx +1 -1
- package/src/views/settings/SiteThemeCard.tsx +1 -1
- package/src/views/settings/UpdatesTab.tsx +107 -101
- package/src/views/settings/components.tsx +26 -62
- package/src/views/settings/useAppearanceSettings.ts +116 -25
- package/src/views/users/UserDetailDrawer.tsx +1 -1
- package/dist/components/ui/StatPill.d.ts +0 -18
- package/dist/components/ui/StatPill.d.ts.map +0 -1
- package/dist/components/ui/StatPill.js +0 -5
- package/dist/components/ui/StatPill.js.map +0 -1
- package/src/components/ui/StatPill.tsx +0 -37
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
import { AlertTriangle, CheckCircle2, Info, KeyRound, Loader2, Send } from 'lucide-react'
|
|
4
4
|
import { useId } from 'react'
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import { UnsavedBar } from '../../components/ui/UnsavedBar.js'
|
|
7
|
+
import { SettingsCard, SettingsToggleRow, useSavedToast } from './components.js'
|
|
7
8
|
import {
|
|
8
9
|
EMAIL_PROVIDER_OPTIONS,
|
|
9
10
|
useEmailSettings,
|
|
@@ -104,7 +105,7 @@ function Notice({
|
|
|
104
105
|
}) {
|
|
105
106
|
const toneClass =
|
|
106
107
|
tone === 'warning'
|
|
107
|
-
? 'border-warning/30 bg-
|
|
108
|
+
? 'border-warning/30 bg-warn-l text-warning'
|
|
108
109
|
: tone === 'success'
|
|
109
110
|
? 'border-success/30 bg-success/10 text-success'
|
|
110
111
|
: tone === 'error'
|
|
@@ -280,6 +281,7 @@ function ProviderFields({ s, canEdit }: { s: UseEmailSettings; canEdit: boolean
|
|
|
280
281
|
export function EmailSettingsTab({ role }: { role?: string }) {
|
|
281
282
|
const canEdit = String(role ?? '').toUpperCase() === 'ADMIN'
|
|
282
283
|
const s = useEmailSettings(canEdit)
|
|
284
|
+
useSavedToast(s.saveState)
|
|
283
285
|
const providerGroupId = useId()
|
|
284
286
|
|
|
285
287
|
if (s.loading) {
|
|
@@ -423,13 +425,15 @@ export function EmailSettingsTab({ role }: { role?: string }) {
|
|
|
423
425
|
)}
|
|
424
426
|
</SettingsCard>
|
|
425
427
|
|
|
426
|
-
<
|
|
428
|
+
<UnsavedBar
|
|
427
429
|
dirty={s.dirty}
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
saveState={s.saveState}
|
|
430
|
+
saving={s.saveState === 'saving'}
|
|
431
|
+
saveDisabled={!canEdit}
|
|
431
432
|
onSave={() => void s.save()}
|
|
432
|
-
|
|
433
|
+
onDiscard={s.reset}
|
|
434
|
+
discardLabel="Reset"
|
|
435
|
+
saveLabel="Save changes"
|
|
436
|
+
variant="card"
|
|
433
437
|
/>
|
|
434
438
|
</div>
|
|
435
439
|
)
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
import { AlertTriangle, Info } from 'lucide-react'
|
|
4
4
|
import { useGeneralSettings } from './useGeneralSettings.js'
|
|
5
|
-
import {
|
|
5
|
+
import { UnsavedBar } from '../../components/ui/UnsavedBar.js'
|
|
6
|
+
import { SettingsValidationSummary, useSavedToast } from './components.js'
|
|
6
7
|
import { SiteIndexStatusCard } from './SiteIndexStatusCard.js'
|
|
7
8
|
import { SiteInformationCard } from './SiteInformationCard.js'
|
|
8
9
|
import { LanguageRegionCard } from './LanguageRegionCard.js'
|
|
@@ -17,6 +18,7 @@ export interface GeneralSettingsTabProps {
|
|
|
17
18
|
export function GeneralSettingsTab({ onNavigate, role }: GeneralSettingsTabProps) {
|
|
18
19
|
const canEdit = role === 'ADMIN'
|
|
19
20
|
const settings = useGeneralSettings(canEdit)
|
|
21
|
+
useSavedToast(settings.saveState)
|
|
20
22
|
|
|
21
23
|
const runAudit = () => onNavigate?.('/seo?tab=audit')
|
|
22
24
|
|
|
@@ -113,13 +115,15 @@ export function GeneralSettingsTab({ onNavigate, role }: GeneralSettingsTabProps
|
|
|
113
115
|
</div>
|
|
114
116
|
)}
|
|
115
117
|
|
|
116
|
-
<
|
|
118
|
+
<UnsavedBar
|
|
117
119
|
dirty={settings.dirty}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
saveState={settings.saveState}
|
|
120
|
+
saving={settings.saveState === 'saving'}
|
|
121
|
+
saveDisabled={!canEdit || settings.hasErrors}
|
|
121
122
|
onSave={settings.save}
|
|
122
|
-
|
|
123
|
+
onDiscard={settings.reset}
|
|
124
|
+
discardLabel="Reset"
|
|
125
|
+
saveLabel="Save changes"
|
|
126
|
+
variant="card"
|
|
123
127
|
/>
|
|
124
128
|
</div>
|
|
125
129
|
)
|
|
@@ -38,7 +38,7 @@ function StatusPill({ status }: { status: AiConnectionStatus }) {
|
|
|
38
38
|
: meta.tone === 'error'
|
|
39
39
|
? 'border-destructive/30 bg-destructive/10 text-destructive'
|
|
40
40
|
: meta.tone === 'warn'
|
|
41
|
-
? 'border-warning/30 bg-
|
|
41
|
+
? 'border-warning/30 bg-warn-l text-warning'
|
|
42
42
|
: 'border-border bg-muted text-muted-foreground'
|
|
43
43
|
return (
|
|
44
44
|
<span
|
|
@@ -376,7 +376,7 @@ export function SearchDataCard({ canEdit }: { canEdit: boolean }) {
|
|
|
376
376
|
className={
|
|
377
377
|
status.syncStatus.state === 'error'
|
|
378
378
|
? 'border-destructive/30 bg-destructive/10 text-destructive flex items-start gap-2 rounded-md border p-3'
|
|
379
|
-
: 'border-warning/30 bg-
|
|
379
|
+
: 'border-warning/30 bg-warn-l text-warning flex items-start gap-2 rounded-md border p-3'
|
|
380
380
|
}
|
|
381
381
|
>
|
|
382
382
|
<AlertTriangle size={14} className="mt-0.5 shrink-0" aria-hidden="true" />
|
|
@@ -15,7 +15,7 @@ const LEVEL_STYLES: Record<
|
|
|
15
15
|
word: 'Secure',
|
|
16
16
|
},
|
|
17
17
|
needs_attention: {
|
|
18
|
-
pill: 'bg-
|
|
18
|
+
pill: 'bg-warn-l text-warning border-warning/30',
|
|
19
19
|
Icon: ShieldAlert,
|
|
20
20
|
word: 'Needs attention',
|
|
21
21
|
},
|
|
@@ -29,7 +29,7 @@ const LEVEL_STYLES: Record<
|
|
|
29
29
|
|
|
30
30
|
const SEVERITY_STYLES: Record<SecurityWarning['severity'], string> = {
|
|
31
31
|
critical: 'border-destructive/30 bg-destructive/10 text-destructive',
|
|
32
|
-
warning: 'border-warning/30 bg-
|
|
32
|
+
warning: 'border-warning/30 bg-warn-l text-warning',
|
|
33
33
|
info: 'border-border bg-muted text-muted-foreground',
|
|
34
34
|
}
|
|
35
35
|
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
import { useEffect } from 'react'
|
|
4
4
|
import { Loader2, ShieldAlert } from 'lucide-react'
|
|
5
5
|
import { parseRouteQuery } from '../../router/index.js'
|
|
6
|
+
import { UnsavedBar } from '../../components/ui/UnsavedBar.js'
|
|
6
7
|
import {
|
|
7
8
|
ConfirmDangerousSettingDialog,
|
|
8
|
-
SettingsSaveBar,
|
|
9
9
|
SettingsValidationSummary,
|
|
10
|
+
useSavedToast,
|
|
10
11
|
} from './components.js'
|
|
11
12
|
import { AccessProtectionCard } from './AccessProtectionCard.js'
|
|
12
13
|
import { AuthMfaCard } from './AuthMfaCard.js'
|
|
@@ -56,6 +57,7 @@ export function SecurityTab({
|
|
|
56
57
|
revokeState,
|
|
57
58
|
revokeAllOtherSessions,
|
|
58
59
|
} = useSecuritySettings(canEdit)
|
|
60
|
+
useSavedToast(saveState)
|
|
59
61
|
|
|
60
62
|
// Deep-link support: /settings?tab=security§ion=sessions|ip-allowlist|audit
|
|
61
63
|
useEffect(() => {
|
|
@@ -180,13 +182,15 @@ export function SecurityTab({
|
|
|
180
182
|
onCancel={dismissLockoutPrompt}
|
|
181
183
|
/>
|
|
182
184
|
|
|
183
|
-
<
|
|
185
|
+
<UnsavedBar
|
|
184
186
|
dirty={dirty}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
saveState={saveState}
|
|
187
|
+
saving={saveState === 'saving'}
|
|
188
|
+
saveDisabled={!canEdit || hasErrors}
|
|
188
189
|
onSave={() => void save()}
|
|
189
|
-
|
|
190
|
+
onDiscard={reset}
|
|
191
|
+
discardLabel="Reset"
|
|
192
|
+
saveLabel="Save changes"
|
|
193
|
+
variant="card"
|
|
190
194
|
/>
|
|
191
195
|
</div>
|
|
192
196
|
)
|
|
@@ -516,7 +516,7 @@ export function SeoAutopilotCard({
|
|
|
516
516
|
|
|
517
517
|
{paused ? (
|
|
518
518
|
<section
|
|
519
|
-
className="border-warning/30 bg-
|
|
519
|
+
className="border-warning/30 bg-warn-l flex flex-wrap items-center justify-between gap-3 rounded-lg border px-4 py-3"
|
|
520
520
|
aria-label="Autopilot is paused"
|
|
521
521
|
>
|
|
522
522
|
<p className="text-foreground flex items-start gap-2 text-sm">
|
|
@@ -725,7 +725,7 @@ export function SeoAutopilotCard({
|
|
|
725
725
|
|
|
726
726
|
{vetoed.length > 0 ? (
|
|
727
727
|
<section
|
|
728
|
-
className="border-warning/30 bg-
|
|
728
|
+
className="border-warning/30 bg-warn-l flex items-start gap-2 rounded-lg border px-4 py-3 text-sm"
|
|
729
729
|
aria-label="Governance warning"
|
|
730
730
|
>
|
|
731
731
|
<AlertTriangle size={16} className="text-warning mt-0.5 shrink-0" aria-hidden="true" />
|
|
@@ -23,11 +23,12 @@ import { SeoGeoSettingsCard } from './SeoGeoSettingsCard.js'
|
|
|
23
23
|
import {
|
|
24
24
|
ConfirmDangerousSettingDialog,
|
|
25
25
|
SettingsCard,
|
|
26
|
-
SettingsSaveBar,
|
|
27
26
|
SettingsSourceBadge,
|
|
28
27
|
SettingsToggleRow,
|
|
29
28
|
SettingsValidationSummary,
|
|
29
|
+
useSavedToast,
|
|
30
30
|
} from './components.js'
|
|
31
|
+
import { UnsavedBar } from '../../components/ui/UnsavedBar.js'
|
|
31
32
|
import {
|
|
32
33
|
META_DESCRIPTION_MAX,
|
|
33
34
|
META_DESCRIPTION_MIN,
|
|
@@ -82,6 +83,7 @@ export interface SeoSettingsTabProps {
|
|
|
82
83
|
export function SeoSettingsTab({ onNavigate, role }: SeoSettingsTabProps) {
|
|
83
84
|
const canEdit = role === 'ADMIN'
|
|
84
85
|
const seo = useSeoSettings(canEdit)
|
|
86
|
+
useSavedToast(seo.saveState)
|
|
85
87
|
|
|
86
88
|
if (seo.loading) {
|
|
87
89
|
return (
|
|
@@ -133,7 +135,7 @@ export function SeoSettingsTab({ onNavigate, role }: SeoSettingsTabProps) {
|
|
|
133
135
|
{!seo.siteUrl ? (
|
|
134
136
|
<div
|
|
135
137
|
role="status"
|
|
136
|
-
className="border-warning/30 bg-
|
|
138
|
+
className="border-warning/30 bg-warn-l text-warning flex items-start gap-2 rounded-lg border p-4 text-sm"
|
|
137
139
|
>
|
|
138
140
|
<AlertTriangle size={16} className="mt-0.5 shrink-0" aria-hidden="true" />
|
|
139
141
|
Set the public site URL in Settings → General. View site and Share stay disabled until it
|
|
@@ -142,7 +144,7 @@ export function SeoSettingsTab({ onNavigate, role }: SeoSettingsTabProps) {
|
|
|
142
144
|
) : siteUrlMatchesAdminOrigin(seo.siteUrl) ? (
|
|
143
145
|
<div
|
|
144
146
|
role="status"
|
|
145
|
-
className="border-warning/30 bg-
|
|
147
|
+
className="border-warning/30 bg-warn-l text-warning flex items-start gap-2 rounded-lg border p-4 text-sm"
|
|
146
148
|
>
|
|
147
149
|
<AlertTriangle size={16} className="mt-0.5 shrink-0" aria-hidden="true" />
|
|
148
150
|
This origin is the admin, not the public site. Set the public site URL to the live apex —
|
|
@@ -193,13 +195,15 @@ export function SeoSettingsTab({ onNavigate, role }: SeoSettingsTabProps) {
|
|
|
193
195
|
</div>
|
|
194
196
|
)}
|
|
195
197
|
|
|
196
|
-
<
|
|
198
|
+
<UnsavedBar
|
|
197
199
|
dirty={seo.dirty}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
saveState={seo.saveState}
|
|
200
|
+
saving={seo.saveState === 'saving'}
|
|
201
|
+
saveDisabled={!canEdit || seo.hasErrors}
|
|
201
202
|
onSave={seo.save}
|
|
202
|
-
|
|
203
|
+
onDiscard={seo.reset}
|
|
204
|
+
discardLabel="Reset"
|
|
205
|
+
saveLabel="Save changes"
|
|
206
|
+
variant="card"
|
|
203
207
|
/>
|
|
204
208
|
</div>
|
|
205
209
|
)
|
|
@@ -729,7 +733,7 @@ function SitemapDefaultsCard({
|
|
|
729
733
|
description="Control XML sitemap generation and whether search engines are pinged on publish."
|
|
730
734
|
>
|
|
731
735
|
{!siteUrl && (
|
|
732
|
-
<div className="border-warning/30 bg-
|
|
736
|
+
<div className="border-warning/30 bg-warn-l text-warning mb-4 flex items-start gap-2 rounded-md border p-4 text-sm">
|
|
733
737
|
<AlertTriangle size={16} className="mt-0.5 shrink-0" aria-hidden="true" />
|
|
734
738
|
Site URL is not set — sitemap URLs may be incorrect. Set it in Settings → General.
|
|
735
739
|
</div>
|
|
@@ -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>
|