@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
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
import type { ReactNode } from 'react'
|
|
11
11
|
import { AlertTriangle, ChevronLeft, ChevronRight, Loader2 } from 'lucide-react'
|
|
12
12
|
import { StatusBadge, type StatusBadgeTone } from '../ui/StatusBadge.js'
|
|
13
|
-
import
|
|
13
|
+
import { CountChip } from '../ui/CountChip.js'
|
|
14
|
+
import type { EntryCounts, FormFieldType, FormStatus } from '../../lib/forms-service.js'
|
|
14
15
|
|
|
15
16
|
// ─── Field-type badges ─────────────────────────────────────────────────────
|
|
16
17
|
|
|
@@ -28,7 +29,7 @@ function fieldTypeTone(type: FormFieldType): string {
|
|
|
28
29
|
case 'select':
|
|
29
30
|
case 'multiselect':
|
|
30
31
|
case 'radio':
|
|
31
|
-
return 'bg-
|
|
32
|
+
return 'bg-warn-l text-warning'
|
|
32
33
|
case 'checkbox':
|
|
33
34
|
case 'consent':
|
|
34
35
|
return 'bg-success/10 text-success'
|
|
@@ -95,29 +96,44 @@ export function UnreadBadge({ count, className = '' }: { count: number; classNam
|
|
|
95
96
|
)
|
|
96
97
|
}
|
|
97
98
|
|
|
98
|
-
// ───
|
|
99
|
+
// ─── Entry count chips ───────────────────────────────────────────────────
|
|
99
100
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
101
|
+
/** The inbox status filters a count chip can switch on. */
|
|
102
|
+
type EntryChipFilter = 'unread' | 'starred'
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* The inbox's header counts (Inbox.html `.stat-pills`), shared by All
|
|
106
|
+
* Entries and each form's entries. "unread" and "starred" are toggles for
|
|
107
|
+
* the matching status filter, selected while it is on; a second click goes
|
|
108
|
+
* back to all entries. "this week" is repo-only.
|
|
109
|
+
*/
|
|
110
|
+
export function EntryCountChips({
|
|
111
|
+
counts,
|
|
112
|
+
filter,
|
|
113
|
+
onFilter,
|
|
104
114
|
}: {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
115
|
+
counts: Pick<EntryCounts, 'total' | 'unread' | 'starred' | 'thisWeek'>
|
|
116
|
+
/** The view's current status filter. */
|
|
117
|
+
filter: string
|
|
118
|
+
onFilter: (next: 'all' | EntryChipFilter) => void
|
|
108
119
|
}) {
|
|
109
|
-
const
|
|
110
|
-
tone === 'success'
|
|
111
|
-
? 'text-success'
|
|
112
|
-
: tone === 'warning'
|
|
113
|
-
? 'text-warning'
|
|
114
|
-
: tone === 'destructive'
|
|
115
|
-
? 'text-destructive'
|
|
116
|
-
: 'text-foreground'
|
|
120
|
+
const toggle = (chip: EntryChipFilter) => () => onFilter(filter === chip ? 'all' : chip)
|
|
117
121
|
return (
|
|
118
|
-
<div className="
|
|
119
|
-
<
|
|
120
|
-
<
|
|
122
|
+
<div className="flex flex-wrap gap-1.5">
|
|
123
|
+
<CountChip n={counts.total} label="total" />
|
|
124
|
+
<CountChip
|
|
125
|
+
n={counts.unread}
|
|
126
|
+
label="unread"
|
|
127
|
+
selected={filter === 'unread'}
|
|
128
|
+
onClick={toggle('unread')}
|
|
129
|
+
/>
|
|
130
|
+
<CountChip
|
|
131
|
+
n={counts.starred}
|
|
132
|
+
label="starred"
|
|
133
|
+
selected={filter === 'starred'}
|
|
134
|
+
onClick={toggle('starred')}
|
|
135
|
+
/>
|
|
136
|
+
<CountChip n={counts.thisWeek} label="this week" />
|
|
121
137
|
</div>
|
|
122
138
|
)
|
|
123
139
|
}
|
|
@@ -10,7 +10,8 @@ import { paletteFor, TAG_COLOR_KEYS, type TagColorKey } from '../posts/badges.js
|
|
|
10
10
|
* colored dot so tags don't rely on color alone.
|
|
11
11
|
*
|
|
12
12
|
* Both resolve color through the shared `paletteFor` palette so they
|
|
13
|
-
* stay consistent with Post Type badges and work in light/dark mode
|
|
13
|
+
* stay consistent with Post Type badges and work in light/dark mode, and
|
|
14
|
+
* neither wraps its label ("Landing Pages" stays on one line).
|
|
14
15
|
*/
|
|
15
16
|
|
|
16
17
|
export { TAG_COLOR_KEYS }
|
|
@@ -49,7 +50,7 @@ export function PageTagChip({
|
|
|
49
50
|
type="button"
|
|
50
51
|
onClick={onToggle}
|
|
51
52
|
aria-pressed={selected}
|
|
52
|
-
className={`focus-visible:ring-ring inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-xs font-medium transition-colors focus:outline-none focus-visible:ring-2 ${
|
|
53
|
+
className={`focus-visible:ring-ring inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-xs font-medium whitespace-nowrap transition-colors focus:outline-none focus-visible:ring-2 ${
|
|
53
54
|
selected
|
|
54
55
|
? `${p.bg} ${p.text} border-transparent ring-1 ${p.ring}`
|
|
55
56
|
: 'border-border bg-background text-foreground hover:bg-accent'
|
|
@@ -68,7 +69,7 @@ export function PageTagPill({ name, color }: { name: string; color: string | nul
|
|
|
68
69
|
const p = paletteFor(color)
|
|
69
70
|
return (
|
|
70
71
|
<span
|
|
71
|
-
className={`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium ${p.bg} ${p.text}`}
|
|
72
|
+
className={`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium whitespace-nowrap ${p.bg} ${p.text}`}
|
|
72
73
|
>
|
|
73
74
|
<span aria-hidden className={`h-1.5 w-1.5 rounded-full ${tagDotColor(color)}`} />
|
|
74
75
|
{name}
|
|
@@ -76,7 +76,7 @@ function CheckRow({ check }: { check: AuditCheck }) {
|
|
|
76
76
|
<span
|
|
77
77
|
aria-hidden
|
|
78
78
|
className={`mt-0.5 h-4 w-4 shrink-0 rounded ${
|
|
79
|
-
na ? 'bg-muted' : pass ? 'bg-success/15 text-success' : 'bg-
|
|
79
|
+
na ? 'bg-muted' : pass ? 'bg-success/15 text-success' : 'bg-warn-l text-warning'
|
|
80
80
|
}`}
|
|
81
81
|
/>
|
|
82
82
|
<div className="min-w-0">
|
|
@@ -122,7 +122,7 @@ function CheckGroup({ result, title }: { result: AuditGroupResult; title: string
|
|
|
122
122
|
band === 'good'
|
|
123
123
|
? 'bg-success/15 text-success'
|
|
124
124
|
: band === 'fair'
|
|
125
|
-
? 'bg-
|
|
125
|
+
? 'bg-warn-l text-warning'
|
|
126
126
|
: band === 'poor'
|
|
127
127
|
? 'bg-destructive/15 text-destructive'
|
|
128
128
|
: 'bg-muted text-muted-foreground'
|
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
* they see them, so an editor can judge a title and description as a result
|
|
8
8
|
* rather than as two form fields.
|
|
9
9
|
*
|
|
10
|
-
* The link blue is
|
|
11
|
-
* the point of the card is to look like the thing
|
|
12
|
-
*
|
|
13
|
-
*
|
|
10
|
+
* The link blue is Google's result colour (`--serp-link`, with its own dark
|
|
11
|
+
* value), never the accent: the point of the card is to look like the thing
|
|
12
|
+
* being previewed, and letting a brand accent repaint it would quietly stop
|
|
13
|
+
* it being a preview.
|
|
14
14
|
*/
|
|
15
15
|
export interface SerpPreviewProps {
|
|
16
16
|
title: string
|
|
@@ -29,7 +29,7 @@ export function SerpPreview({ title, url, description }: SerpPreviewProps) {
|
|
|
29
29
|
<p className="truncate text-[11px] text-emerald-700 dark:text-emerald-400">
|
|
30
30
|
{url || 'https://example.com/page'}
|
|
31
31
|
</p>
|
|
32
|
-
<p className="truncate text-[14px] leading-snug text-[
|
|
32
|
+
<p className="truncate text-[14px] leading-snug text-[var(--serp-link)]">
|
|
33
33
|
{title || 'Untitled page'}
|
|
34
34
|
</p>
|
|
35
35
|
{/* Two lines is what a result gets; more written here simply is not read. */}
|
|
@@ -25,7 +25,7 @@ export function gradeMeta(grade: SeoGrade): GradeMeta {
|
|
|
25
25
|
case 'good':
|
|
26
26
|
return { label: 'Good', text: 'text-success', bg: 'bg-success/10', dot: 'bg-success' }
|
|
27
27
|
case 'fair':
|
|
28
|
-
return { label: 'Fair', text: 'text-warning', bg: 'bg-
|
|
28
|
+
return { label: 'Fair', text: 'text-warning', bg: 'bg-warn-l', dot: 'bg-warning' }
|
|
29
29
|
case 'poor':
|
|
30
30
|
return {
|
|
31
31
|
label: 'Poor',
|
|
@@ -94,7 +94,7 @@ export function severityMeta(severity: SeoSeverity): GradeMeta {
|
|
|
94
94
|
dot: 'bg-destructive',
|
|
95
95
|
}
|
|
96
96
|
case 'warning':
|
|
97
|
-
return { label: 'Warning', text: 'text-warning', bg: 'bg-
|
|
97
|
+
return { label: 'Warning', text: 'text-warning', bg: 'bg-warn-l', dot: 'bg-warning' }
|
|
98
98
|
default:
|
|
99
99
|
return {
|
|
100
100
|
label: 'Info',
|
|
@@ -7,18 +7,19 @@
|
|
|
7
7
|
* feed and the Pages/Posts list tables so an author always looks the
|
|
8
8
|
* same everywhere.
|
|
9
9
|
*
|
|
10
|
-
* The palette is
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* The palette is the `--avatar-*` tokens (tokens.json), applied via inline
|
|
11
|
+
* style because the pick is computed. Every swatch keeps ≥4.5:1 with the
|
|
12
|
+
* white initials; the token drift test enforces it.
|
|
13
13
|
*/
|
|
14
14
|
export const AVATAR_COLORS = [
|
|
15
|
-
'
|
|
16
|
-
'
|
|
17
|
-
'
|
|
18
|
-
'
|
|
19
|
-
'
|
|
20
|
-
'
|
|
21
|
-
'
|
|
15
|
+
'var(--avatar-1)',
|
|
16
|
+
'var(--avatar-2)',
|
|
17
|
+
'var(--avatar-3)',
|
|
18
|
+
'var(--avatar-4)',
|
|
19
|
+
'var(--avatar-5)',
|
|
20
|
+
'var(--avatar-6)',
|
|
21
|
+
'var(--avatar-7)',
|
|
22
|
+
'var(--avatar-8)',
|
|
22
23
|
] as const
|
|
23
24
|
|
|
24
25
|
function hashString(s: string): number {
|
|
@@ -6,7 +6,7 @@ const badge = cv('inline-flex items-center rounded-full px-2.5 py-0.5 text-xs fo
|
|
|
6
6
|
tone: {
|
|
7
7
|
neutral: 'bg-muted text-muted-foreground',
|
|
8
8
|
success: 'bg-success/10 text-success',
|
|
9
|
-
warning: 'bg-
|
|
9
|
+
warning: 'bg-warn-l text-warning',
|
|
10
10
|
danger: 'bg-destructive/10 text-destructive',
|
|
11
11
|
info: 'bg-info/10 text-info',
|
|
12
12
|
primary: 'bg-[var(--primary)]/15 text-[var(--primary)] dark:bg-[var(--primary)]/25',
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { Fragment, type MouseEvent, type ReactNode } from 'react'
|
|
4
|
+
import { useAdminLinks } from './admin-links.js'
|
|
5
|
+
|
|
6
|
+
export interface BreadcrumbItem {
|
|
7
|
+
label: string
|
|
8
|
+
/**
|
|
9
|
+
* Admin path, e.g. `/posts`. Renders a real link (base path included) and
|
|
10
|
+
* routes plain clicks in-app. Preferred over `href` / `onClick`.
|
|
11
|
+
*/
|
|
12
|
+
path?: string
|
|
13
|
+
/** Real URL for the crumb. With `onClick`, plain clicks go to `onClick` instead. */
|
|
14
|
+
href?: string
|
|
15
|
+
/** In-app navigation, e.g. `() => onNavigate('/posts')`. */
|
|
16
|
+
onClick?: () => void
|
|
17
|
+
/** Optional leading icon (13px). */
|
|
18
|
+
icon?: ReactNode
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface BreadcrumbProps {
|
|
22
|
+
/** Ancestors first. The last item is the current page. */
|
|
23
|
+
items: BreadcrumbItem[]
|
|
24
|
+
className?: string
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Explicit size and leading: the admin base layer styles `button` at 13px / 1.5.
|
|
28
|
+
const LINK_CLASS =
|
|
29
|
+
'inline-flex cursor-pointer items-center gap-[5px] border-0 bg-transparent p-0 text-sm2 leading-[normal] font-[450] text-sub no-underline hover:text-acc'
|
|
30
|
+
|
|
31
|
+
function isPlainClick(event: MouseEvent) {
|
|
32
|
+
return event.button === 0 && !event.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Breadcrumb for second-level screens only (SHELL.md §4 "Breadcrumb rule"):
|
|
37
|
+
* `Dashboard / Section / Screen`. Top-level pages have none. Pass it to
|
|
38
|
+
* `PageHeader` as `breadcrumb`.
|
|
39
|
+
*/
|
|
40
|
+
export function Breadcrumb({ items, className = '' }: BreadcrumbProps) {
|
|
41
|
+
const links = useAdminLinks()
|
|
42
|
+
if (items.length === 0) return null
|
|
43
|
+
return (
|
|
44
|
+
<nav aria-label="Breadcrumb" className={className}>
|
|
45
|
+
<ol className="text-sm2 text-faint m-0 flex list-none flex-wrap items-center gap-[7px] p-0 leading-[normal]">
|
|
46
|
+
{items.map((raw, index) => {
|
|
47
|
+
const current = index === items.length - 1
|
|
48
|
+
// Kit crumbs are `<a href>`: a path becomes a real link that still
|
|
49
|
+
// navigates in-app on a plain click.
|
|
50
|
+
const navigate = links.navigate
|
|
51
|
+
const item: BreadcrumbItem = raw.path
|
|
52
|
+
? {
|
|
53
|
+
...raw,
|
|
54
|
+
href: links.href(raw.path),
|
|
55
|
+
onClick: navigate ? () => navigate(raw.path!) : raw.onClick,
|
|
56
|
+
}
|
|
57
|
+
: raw
|
|
58
|
+
return (
|
|
59
|
+
<Fragment key={`${index}-${item.label}`}>
|
|
60
|
+
{index > 0 ? (
|
|
61
|
+
<li aria-hidden="true" className="text-faint flex">
|
|
62
|
+
/
|
|
63
|
+
</li>
|
|
64
|
+
) : null}
|
|
65
|
+
<li className="flex min-w-0 items-center whitespace-nowrap">
|
|
66
|
+
{current ? (
|
|
67
|
+
<span
|
|
68
|
+
aria-current="page"
|
|
69
|
+
className="text-txt inline-flex items-center gap-[5px] font-[550]"
|
|
70
|
+
>
|
|
71
|
+
{item.icon}
|
|
72
|
+
{item.label}
|
|
73
|
+
</span>
|
|
74
|
+
) : item.href ? (
|
|
75
|
+
<a
|
|
76
|
+
href={item.href}
|
|
77
|
+
className={LINK_CLASS}
|
|
78
|
+
onClick={
|
|
79
|
+
item.onClick
|
|
80
|
+
? (event) => {
|
|
81
|
+
if (!isPlainClick(event)) return
|
|
82
|
+
event.preventDefault()
|
|
83
|
+
item.onClick?.()
|
|
84
|
+
}
|
|
85
|
+
: undefined
|
|
86
|
+
}
|
|
87
|
+
>
|
|
88
|
+
{item.icon}
|
|
89
|
+
{item.label}
|
|
90
|
+
</a>
|
|
91
|
+
) : item.onClick ? (
|
|
92
|
+
<button type="button" className={LINK_CLASS} onClick={item.onClick}>
|
|
93
|
+
{item.icon}
|
|
94
|
+
{item.label}
|
|
95
|
+
</button>
|
|
96
|
+
) : (
|
|
97
|
+
<span className="text-sub inline-flex items-center gap-[5px] font-[450]">
|
|
98
|
+
{item.icon}
|
|
99
|
+
{item.label}
|
|
100
|
+
</span>
|
|
101
|
+
)}
|
|
102
|
+
</li>
|
|
103
|
+
</Fragment>
|
|
104
|
+
)
|
|
105
|
+
})}
|
|
106
|
+
</ol>
|
|
107
|
+
</nav>
|
|
108
|
+
)
|
|
109
|
+
}
|
|
@@ -3,26 +3,42 @@
|
|
|
3
3
|
import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react'
|
|
4
4
|
import { cv, type VariantProps } from '../../lib/cv.js'
|
|
5
5
|
|
|
6
|
+
// Kit buttons (SHELL.md §5, `.jb-btn` in jobs-view.jsx). Focus uses the
|
|
7
|
+
// admin-wide `:focus-visible` outline (2px --acc, offset 2px).
|
|
6
8
|
const button = cv(
|
|
7
|
-
|
|
8
|
-
'focus-visible:ring-offset-background inline-flex items-center justify-center gap-2 rounded-[var(--r-control)] font-medium transition-colors duration-[var(--motion-fast)] focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50',
|
|
9
|
+
'inline-flex shrink-0 cursor-pointer items-center justify-center gap-1.5 border font-semibold whitespace-nowrap disabled:pointer-events-none disabled:opacity-50',
|
|
9
10
|
{
|
|
10
11
|
variants: {
|
|
11
12
|
variant: {
|
|
12
|
-
primary: 'bg-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
outline:
|
|
17
|
-
|
|
18
|
-
|
|
13
|
+
primary: 'border-acc bg-acc text-acc-on hover:brightness-[1.07]',
|
|
14
|
+
/** Card surface with a hairline border. */
|
|
15
|
+
secondary: 'border-bdr bg-card text-txt hover:border-acc-m hover:text-acc',
|
|
16
|
+
/** @deprecated Use `secondary`; kept for existing callers. */
|
|
17
|
+
outline: 'border-bdr bg-card text-txt hover:border-acc-m hover:text-acc',
|
|
18
|
+
ghost: 'text-sub hover:bg-bg hover:text-txt border-transparent bg-transparent',
|
|
19
|
+
/** Outline danger; fills with the error tint on hover. */
|
|
20
|
+
danger:
|
|
21
|
+
'bg-card text-err hover:bg-err-l border-[color-mix(in_srgb,var(--err)_35%,var(--bdr))]',
|
|
22
|
+
/**
|
|
23
|
+
* AI gradient. Keeps its text label at tablet width, where other
|
|
24
|
+
* header actions collapse to icons (`data-keep-label`); on mobile every
|
|
25
|
+
* header action is a 44px icon, AI included (cms-layouts.css).
|
|
26
|
+
*/
|
|
27
|
+
ai: 'text-acc-on border-0 bg-[linear-gradient(135deg,var(--ai1),var(--ai2))] hover:brightness-[1.07] active:translate-y-px',
|
|
28
|
+
/** Row and toolbar icon button: quiet until hovered. */
|
|
29
|
+
icon: 'text-sub hover:border-bdr hover:bg-bg hover:text-txt border-transparent bg-transparent',
|
|
30
|
+
/** Inline text link; ignores the size's height and padding. */
|
|
31
|
+
link: 'text-acc h-auto! border-transparent bg-transparent px-0! underline-offset-4 hover:underline',
|
|
19
32
|
},
|
|
20
33
|
size: {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
icon
|
|
34
|
+
/** 34px, 13px text. */
|
|
35
|
+
md: 'rounded-8 text-body h-[34px] px-[13px]',
|
|
36
|
+
/** 28px, 12px text. */
|
|
37
|
+
sm: 'rounded-8 text-meta h-7 px-2.5',
|
|
38
|
+
/** 30×30 row icon button. */
|
|
39
|
+
icon: 'rounded-7 h-[30px] w-[30px] p-0',
|
|
40
|
+
/** 34×34 topbar / header icon button. */
|
|
41
|
+
'icon-lg': 'rounded-8 h-[34px] w-[34px] p-0',
|
|
26
42
|
},
|
|
27
43
|
},
|
|
28
44
|
defaultVariants: {
|
|
@@ -65,6 +81,10 @@ export const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button
|
|
|
65
81
|
ref={ref}
|
|
66
82
|
disabled={disabled || loading}
|
|
67
83
|
aria-busy={loading || undefined}
|
|
84
|
+
// The variant decides how a header action collapses at tablet and
|
|
85
|
+
// mobile (responsive.css, `[data-header-actions]`).
|
|
86
|
+
data-variant={variant ?? 'primary'}
|
|
87
|
+
data-keep-label={variant === 'ai' ? '' : undefined}
|
|
68
88
|
className={button({
|
|
69
89
|
variant,
|
|
70
90
|
size,
|
|
@@ -73,7 +93,12 @@ export const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button
|
|
|
73
93
|
{...rest}
|
|
74
94
|
>
|
|
75
95
|
{loading ? (
|
|
76
|
-
<svg
|
|
96
|
+
<svg
|
|
97
|
+
className="h-3.5 w-3.5 motion-safe:animate-spin"
|
|
98
|
+
viewBox="0 0 24 24"
|
|
99
|
+
fill="none"
|
|
100
|
+
aria-hidden
|
|
101
|
+
>
|
|
77
102
|
<circle
|
|
78
103
|
className="opacity-25"
|
|
79
104
|
cx="12"
|
|
@@ -1,32 +1,31 @@
|
|
|
1
1
|
import { forwardRef, type HTMLAttributes, type ReactNode } from 'react'
|
|
2
2
|
import { cv, type VariantProps } from '../../lib/cv.js'
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
},
|
|
4
|
+
// Kit card (SHELL.md §7, `.ap-card` / `.ap-ch`): --card, 1px --bdr, radius 12,
|
|
5
|
+
// --shd. Header row 13px 16px with a bottom border; body 14px 16px.
|
|
6
|
+
const card = cv('rounded-12 border-bdr bg-card text-txt overflow-hidden border', {
|
|
7
|
+
variants: {
|
|
8
|
+
padding: {
|
|
9
|
+
none: 'p-0',
|
|
10
|
+
/** Stat / compact surfaces (`.dstat`). */
|
|
11
|
+
sm: 'px-4 py-3.5',
|
|
12
|
+
/** Card body padding (`.ap-cb`). */
|
|
13
|
+
md: 'px-4 py-3.5',
|
|
14
|
+
lg: 'px-6 py-6',
|
|
15
|
+
},
|
|
16
|
+
elevation: {
|
|
17
|
+
flat: 'shadow-none',
|
|
18
|
+
resting: 'shadow-shd',
|
|
19
|
+
elevated: 'shadow-shd2',
|
|
21
20
|
},
|
|
22
|
-
defaultVariants: { padding: 'none', elevation: 'resting' },
|
|
23
21
|
},
|
|
24
|
-
|
|
22
|
+
defaultVariants: { padding: 'none', elevation: 'resting' },
|
|
23
|
+
})
|
|
25
24
|
|
|
26
25
|
type CardVariants = VariantProps<typeof card>
|
|
27
26
|
|
|
28
27
|
const INTERACTIVE_CLASS =
|
|
29
|
-
'motion-safe:transition-shadow motion-safe:duration-[var(--
|
|
28
|
+
'motion-safe:transition-shadow motion-safe:duration-[var(--mo-fast)] hover:shadow-shd2 focus-within:shadow-shd2'
|
|
30
29
|
|
|
31
30
|
export interface CardProps extends HTMLAttributes<HTMLDivElement>, CardVariants {
|
|
32
31
|
/** Apply hover/focus elevation transitions (e.g. for clickable cards). */
|
|
@@ -46,7 +45,7 @@ export const Card = forwardRef<HTMLDivElement, CardProps>(function Card(
|
|
|
46
45
|
)
|
|
47
46
|
})
|
|
48
47
|
|
|
49
|
-
/** Header
|
|
48
|
+
/** Header row (`.ap-ch`): a flex row, gap 10, padding 13px 16px, bottom hairline. */
|
|
50
49
|
export function CardHeader({
|
|
51
50
|
className = '',
|
|
52
51
|
bordered = true,
|
|
@@ -55,7 +54,11 @@ export function CardHeader({
|
|
|
55
54
|
}: HTMLAttributes<HTMLDivElement> & { bordered?: boolean }) {
|
|
56
55
|
return (
|
|
57
56
|
<div
|
|
58
|
-
className={[
|
|
57
|
+
className={[
|
|
58
|
+
'flex items-center gap-2.5 px-4 py-[13px]',
|
|
59
|
+
bordered ? 'border-bdr border-b' : '',
|
|
60
|
+
className,
|
|
61
|
+
]
|
|
59
62
|
.filter(Boolean)
|
|
60
63
|
.join(' ')}
|
|
61
64
|
{...rest}
|
|
@@ -65,40 +68,40 @@ export function CardHeader({
|
|
|
65
68
|
)
|
|
66
69
|
}
|
|
67
70
|
|
|
71
|
+
/** Card heading (`.ap-ch h2`): 13.5px / 650, takes the row's free space. */
|
|
68
72
|
export function CardTitle({
|
|
73
|
+
as: Heading = 'h3',
|
|
69
74
|
className = '',
|
|
70
75
|
children,
|
|
71
76
|
...rest
|
|
72
|
-
}: HTMLAttributes<HTMLHeadingElement>) {
|
|
77
|
+
}: HTMLAttributes<HTMLHeadingElement> & { as?: 'h2' | 'h3' }) {
|
|
73
78
|
return (
|
|
74
|
-
<
|
|
75
|
-
className={`text-
|
|
79
|
+
<Heading
|
|
80
|
+
className={`text-card-title text-txt min-w-0 flex-1 leading-[normal] font-[650] ${className}`}
|
|
76
81
|
{...rest}
|
|
77
82
|
>
|
|
78
83
|
{children}
|
|
79
|
-
</
|
|
84
|
+
</Heading>
|
|
80
85
|
)
|
|
81
86
|
}
|
|
82
87
|
|
|
88
|
+
/** Card subline (`.ap-ch p`): 12px --sub, 1px below the title. */
|
|
83
89
|
export function CardDescription({
|
|
84
90
|
className = '',
|
|
85
91
|
children,
|
|
86
92
|
...rest
|
|
87
93
|
}: HTMLAttributes<HTMLParagraphElement>) {
|
|
88
94
|
return (
|
|
89
|
-
<p className={`
|
|
95
|
+
<p className={`text-meta text-sub mt-px leading-[normal] ${className}`} {...rest}>
|
|
90
96
|
{children}
|
|
91
97
|
</p>
|
|
92
98
|
)
|
|
93
99
|
}
|
|
94
100
|
|
|
95
|
-
/** Body slot
|
|
101
|
+
/** Body slot: padding 14px 16px. */
|
|
96
102
|
export function CardContent({ className = '', children, ...rest }: HTMLAttributes<HTMLDivElement>) {
|
|
97
103
|
return (
|
|
98
|
-
<div
|
|
99
|
-
className={`px-6 pt-4 pb-6 text-[length:var(--fs-body)] leading-[1.55] text-[var(--sub)] ${className}`}
|
|
100
|
-
{...rest}
|
|
101
|
-
>
|
|
104
|
+
<div className={`text-body text-sub px-4 py-3.5 leading-[1.55] ${className}`} {...rest}>
|
|
102
105
|
{children}
|
|
103
106
|
</div>
|
|
104
107
|
)
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
type Dir = 'asc' | 'desc'
|
|
4
|
+
|
|
5
|
+
export interface CardSortOption<F extends string> {
|
|
6
|
+
field: F
|
|
7
|
+
label: string
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface CardListControlsProps<F extends string> {
|
|
11
|
+
/** Select all / none, as the table header's checkbox does. */
|
|
12
|
+
selectAll?: {
|
|
13
|
+
checked: boolean
|
|
14
|
+
onChange: (checked: boolean) => void
|
|
15
|
+
disabled?: boolean
|
|
16
|
+
}
|
|
17
|
+
/** The columns the header can sort by, as one select with both directions. */
|
|
18
|
+
sort?: {
|
|
19
|
+
options: CardSortOption<F>[]
|
|
20
|
+
field: F | null
|
|
21
|
+
dir: Dir
|
|
22
|
+
onChange: (field: F, dir: Dir) => void
|
|
23
|
+
}
|
|
24
|
+
/** Spacing from the screen's own layout. */
|
|
25
|
+
className?: string
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Below 769px a list table is drawn as cards (`table[data-cards]`), and the
|
|
30
|
+
* header row holding its sort buttons and select-all checkbox is hidden: it
|
|
31
|
+
* is clipped to nothing, and responsive.css takes its controls out of the tab
|
|
32
|
+
* order. This row brings both back for phones, at 44px. At 769px and up it is
|
|
33
|
+
* `display: none`, since the header has them. The checkbox is named by its
|
|
34
|
+
* visible "Select all": it sits right above the cards, and only one of it and
|
|
35
|
+
* the header's checkbox is ever exposed.
|
|
36
|
+
*/
|
|
37
|
+
export function CardListControls<F extends string>({
|
|
38
|
+
selectAll,
|
|
39
|
+
sort,
|
|
40
|
+
className,
|
|
41
|
+
}: CardListControlsProps<F>) {
|
|
42
|
+
if (!selectAll && !sort) return null
|
|
43
|
+
const value = sort?.field ? `${sort.field}:${sort.dir}` : ''
|
|
44
|
+
return (
|
|
45
|
+
<div
|
|
46
|
+
className={`not-mobile:hidden flex shrink-0 flex-wrap items-center gap-x-3 gap-y-2 ${className ?? ''}`}
|
|
47
|
+
>
|
|
48
|
+
{selectAll ? (
|
|
49
|
+
<label className="flex min-h-11 cursor-pointer items-center gap-2.5 text-sm text-[var(--txt)]">
|
|
50
|
+
<input
|
|
51
|
+
type="checkbox"
|
|
52
|
+
checked={selectAll.checked}
|
|
53
|
+
disabled={selectAll.disabled}
|
|
54
|
+
onChange={(e) => selectAll.onChange(e.target.checked)}
|
|
55
|
+
className="h-6 w-6 cursor-pointer accent-[var(--acc)]"
|
|
56
|
+
/>
|
|
57
|
+
Select all
|
|
58
|
+
</label>
|
|
59
|
+
) : null}
|
|
60
|
+
{sort ? (
|
|
61
|
+
<label className="ml-auto flex items-center gap-2 text-sm text-[var(--sub)]">
|
|
62
|
+
Sort
|
|
63
|
+
<select
|
|
64
|
+
aria-label="Sort by"
|
|
65
|
+
value={value}
|
|
66
|
+
onChange={(e) => {
|
|
67
|
+
const [field, dir] = e.target.value.split(':') as [F, Dir]
|
|
68
|
+
if (field) sort.onChange(field, dir)
|
|
69
|
+
}}
|
|
70
|
+
className="rounded-8 min-h-11 border border-[var(--bdr)] bg-[var(--card)] px-2.5 text-sm text-[var(--txt)]"
|
|
71
|
+
>
|
|
72
|
+
{sort.field ? null : (
|
|
73
|
+
<option value="" disabled>
|
|
74
|
+
Default order
|
|
75
|
+
</option>
|
|
76
|
+
)}
|
|
77
|
+
{sort.options.flatMap((option) => [
|
|
78
|
+
<option key={`${option.field}:asc`} value={`${option.field}:asc`}>
|
|
79
|
+
{option.label}, ascending
|
|
80
|
+
</option>,
|
|
81
|
+
<option key={`${option.field}:desc`} value={`${option.field}:desc`}>
|
|
82
|
+
{option.label}, descending
|
|
83
|
+
</option>,
|
|
84
|
+
])}
|
|
85
|
+
</select>
|
|
86
|
+
</label>
|
|
87
|
+
) : null}
|
|
88
|
+
</div>
|
|
89
|
+
)
|
|
90
|
+
}
|