@actuate-media/cms-admin 0.9.0 → 0.11.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/dist/AdminRoot.d.ts.map +1 -1
- package/dist/AdminRoot.js +8 -5
- package/dist/AdminRoot.js.map +1 -1
- package/dist/__tests__/layout/primitives.test.d.ts +2 -0
- package/dist/__tests__/layout/primitives.test.d.ts.map +1 -0
- package/dist/__tests__/layout/primitives.test.js +34 -0
- package/dist/__tests__/layout/primitives.test.js.map +1 -0
- package/dist/__tests__/lib/cv.test.d.ts +2 -0
- package/dist/__tests__/lib/cv.test.d.ts.map +1 -0
- package/dist/__tests__/lib/cv.test.js +66 -0
- package/dist/__tests__/lib/cv.test.js.map +1 -0
- package/dist/actuate-admin.css +1 -1
- package/dist/assets/actuate-logo.d.ts +36 -0
- package/dist/assets/actuate-logo.d.ts.map +1 -0
- package/dist/assets/actuate-logo.js +15 -0
- package/dist/assets/actuate-logo.js.map +1 -0
- package/dist/components/Breadcrumbs.js +2 -2
- package/dist/components/CommandPalette.js +10 -10
- package/dist/components/ContentOverviewChart.js +3 -3
- package/dist/components/ErrorBoundary.js +1 -1
- package/dist/components/FocalPointPicker.js +2 -2
- package/dist/components/FolderTree.js +20 -20
- package/dist/components/LivePreview.js +3 -3
- package/dist/components/LocaleSwitcher.js +1 -1
- package/dist/components/MediaPickerModal.js +4 -4
- package/dist/components/PresenceIndicator.js +1 -1
- package/dist/components/SEOConfigPanel.d.ts +2 -0
- package/dist/components/SEOConfigPanel.d.ts.map +1 -0
- package/dist/components/SEOConfigPanel.js +174 -0
- package/dist/components/SEOConfigPanel.js.map +1 -0
- package/dist/components/SEOPanel.js +9 -9
- package/dist/components/SEOPerformance.js +2 -2
- package/dist/components/SchedulePublishDialog.d.ts +18 -0
- package/dist/components/SchedulePublishDialog.d.ts.map +1 -0
- package/dist/components/SchedulePublishDialog.js +106 -0
- package/dist/components/SchedulePublishDialog.js.map +1 -0
- package/dist/components/SharePreviewLinkDialog.d.ts +17 -0
- package/dist/components/SharePreviewLinkDialog.d.ts.map +1 -0
- package/dist/components/SharePreviewLinkDialog.js +83 -0
- package/dist/components/SharePreviewLinkDialog.js.map +1 -0
- package/dist/components/TipTapEditor.js +5 -5
- package/dist/components/VersionHistory.js +2 -2
- package/dist/components/ui/Badge.d.ts +33 -3
- package/dist/components/ui/Badge.d.ts.map +1 -1
- package/dist/components/ui/Badge.js +42 -8
- package/dist/components/ui/Badge.js.map +1 -1
- package/dist/components/ui/Button.d.ts +19 -8
- package/dist/components/ui/Button.d.ts.map +1 -1
- package/dist/components/ui/Button.js +35 -14
- package/dist/components/ui/Button.js.map +1 -1
- package/dist/components/ui/Card.d.ts +26 -0
- package/dist/components/ui/Card.d.ts.map +1 -0
- package/dist/components/ui/Card.js +45 -0
- package/dist/components/ui/Card.js.map +1 -0
- package/dist/components/ui/DataTable.js +1 -1
- package/dist/components/ui/Input.d.ts +15 -0
- package/dist/components/ui/Input.d.ts.map +1 -0
- package/dist/components/ui/Input.js +23 -0
- package/dist/components/ui/Input.js.map +1 -0
- package/dist/components/ui/SearchInput.js +1 -1
- package/dist/components/ui/Select.d.ts +16 -0
- package/dist/components/ui/Select.d.ts.map +1 -0
- package/dist/components/ui/Select.js +25 -0
- package/dist/components/ui/Select.js.map +1 -0
- package/dist/components/ui/Toast.js +1 -1
- package/dist/components/ui/index.d.ts +10 -4
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js +5 -2
- package/dist/components/ui/index.js.map +1 -1
- package/dist/fields/BlockBuilderField.js +3 -3
- package/dist/fields/DateField.js +1 -1
- package/dist/fields/RelationshipField.js +3 -3
- package/dist/fields/TextField.js +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/layout/Header.js +1 -1
- package/dist/layout/Layout.d.ts +14 -0
- package/dist/layout/Layout.d.ts.map +1 -1
- package/dist/layout/Layout.js +17 -11
- package/dist/layout/Layout.js.map +1 -1
- package/dist/layout/Sidebar.d.ts.map +1 -1
- package/dist/layout/Sidebar.js +21 -11
- package/dist/layout/Sidebar.js.map +1 -1
- package/dist/layout/primitives/AdminShell.d.ts +43 -0
- package/dist/layout/primitives/AdminShell.d.ts.map +1 -0
- package/dist/layout/primitives/AdminShell.js +51 -0
- package/dist/layout/primitives/AdminShell.js.map +1 -0
- package/dist/layout/primitives/Box.d.ts +19 -0
- package/dist/layout/primitives/Box.d.ts.map +1 -0
- package/dist/layout/primitives/Box.js +12 -0
- package/dist/layout/primitives/Box.js.map +1 -0
- package/dist/layout/primitives/Cluster.d.ts +27 -0
- package/dist/layout/primitives/Cluster.d.ts.map +1 -0
- package/dist/layout/primitives/Cluster.js +37 -0
- package/dist/layout/primitives/Cluster.js.map +1 -0
- package/dist/layout/primitives/Grid.d.ts +45 -0
- package/dist/layout/primitives/Grid.d.ts.map +1 -0
- package/dist/layout/primitives/Grid.js +59 -0
- package/dist/layout/primitives/Grid.js.map +1 -0
- package/dist/layout/primitives/PageContainer.d.ts +36 -0
- package/dist/layout/primitives/PageContainer.d.ts.map +1 -0
- package/dist/layout/primitives/PageContainer.js +41 -0
- package/dist/layout/primitives/PageContainer.js.map +1 -0
- package/dist/layout/primitives/Split.d.ts +34 -0
- package/dist/layout/primitives/Split.d.ts.map +1 -0
- package/dist/layout/primitives/Split.js +27 -0
- package/dist/layout/primitives/Split.js.map +1 -0
- package/dist/layout/primitives/Stack.d.ts +23 -0
- package/dist/layout/primitives/Stack.d.ts.map +1 -0
- package/dist/layout/primitives/Stack.js +34 -0
- package/dist/layout/primitives/Stack.js.map +1 -0
- package/dist/layout/primitives/index.d.ts +30 -0
- package/dist/layout/primitives/index.d.ts.map +1 -0
- package/dist/layout/primitives/index.js +22 -0
- package/dist/layout/primitives/index.js.map +1 -0
- package/dist/layout/primitives/tokens.d.ts +48 -0
- package/dist/layout/primitives/tokens.d.ts.map +1 -0
- package/dist/layout/primitives/tokens.js +54 -0
- package/dist/layout/primitives/tokens.js.map +1 -0
- package/dist/lib/cv.d.ts +53 -0
- package/dist/lib/cv.d.ts.map +1 -0
- package/dist/lib/cv.js +39 -0
- package/dist/lib/cv.js.map +1 -0
- package/dist/views/ApiKeys.d.ts.map +1 -1
- package/dist/views/ApiKeys.js +13 -11
- package/dist/views/ApiKeys.js.map +1 -1
- package/dist/views/CollectionList.js +8 -8
- package/dist/views/Dashboard.d.ts.map +1 -1
- package/dist/views/Dashboard.js +333 -78
- package/dist/views/Dashboard.js.map +1 -1
- package/dist/views/DocumentEdit.d.ts.map +1 -1
- package/dist/views/DocumentEdit.js +17 -5
- package/dist/views/DocumentEdit.js.map +1 -1
- package/dist/views/ForgotPassword.js +2 -2
- package/dist/views/FormEditor.js +5 -5
- package/dist/views/FormSubmissions.js +6 -6
- package/dist/views/Forms.js +2 -2
- package/dist/views/Login.d.ts +16 -1
- package/dist/views/Login.d.ts.map +1 -1
- package/dist/views/Login.js +17 -7
- package/dist/views/Login.js.map +1 -1
- package/dist/views/MediaBrowser.js +16 -16
- package/dist/views/PageEditor.js +2 -2
- package/dist/views/Pages.js +10 -10
- package/dist/views/PostEditor.js +2 -2
- package/dist/views/Posts.js +4 -4
- package/dist/views/Redirects.js +4 -4
- package/dist/views/ResetPassword.js +2 -2
- package/dist/views/SEO.js +6 -6
- package/dist/views/ScriptTagEditor.js +4 -4
- package/dist/views/ScriptTags.js +2 -2
- package/dist/views/Settings.d.ts.map +1 -1
- package/dist/views/Settings.js +9 -8
- package/dist/views/Settings.js.map +1 -1
- package/dist/views/SetupWizard.js +2 -2
- package/dist/views/Users.js +4 -4
- package/dist/views/page-builder/AIBlockAssist.js +1 -1
- package/dist/views/page-builder/AIGenerateDialog.js +10 -10
- package/dist/views/page-builder/BlockEditor.js +10 -10
- package/dist/views/page-builder/BlockPicker.js +4 -4
- package/dist/views/page-builder/BottomBar.js +1 -1
- package/dist/views/page-builder/BuilderToolbar.js +2 -2
- package/dist/views/page-builder/ContextPanel.js +2 -2
- package/dist/views/page-builder/DesignScore.js +9 -9
- package/dist/views/page-builder/NodeSettings.js +8 -8
- package/dist/views/page-builder/PageBuilder.js +3 -3
- package/dist/views/page-builder/PageSettings.js +1 -1
- package/dist/views/page-builder/PageTemplates.js +2 -2
- package/dist/views/page-builder/SEOPanel.js +13 -13
- package/dist/views/page-builder/SavedSections.js +5 -5
- package/dist/views/page-builder/TemplatePicker.js +2 -2
- package/dist/views/page-builder/block-renderers/CTAPreview.js +5 -5
- package/dist/views/page-builder/block-renderers/CardsPreview.js +1 -1
- package/dist/views/page-builder/block-renderers/CodePreview.js +1 -1
- package/dist/views/page-builder/block-renderers/FAQPreview.js +3 -3
- package/dist/views/page-builder/block-renderers/FallbackPreview.js +1 -1
- package/dist/views/page-builder/block-renderers/FormPreview.js +3 -3
- package/dist/views/page-builder/block-renderers/GalleryPreview.js +5 -5
- package/dist/views/page-builder/block-renderers/HeroPreview.js +3 -3
- package/dist/views/page-builder/block-renderers/ImagePreview.js +3 -3
- package/dist/views/page-builder/block-renderers/TextPreview.js +3 -3
- package/dist/views/page-builder/block-renderers/VideoPreview.js +4 -4
- package/dist/views/page-builder/canvas/BlockRenderer.js +1 -1
- package/dist/views/page-builder/canvas/BuilderCanvas.js +3 -3
- package/dist/views/page-builder/canvas/ColumnRenderer.js +2 -2
- package/dist/views/page-builder/canvas/ContainerRenderer.js +2 -2
- package/dist/views/page-builder/canvas/RowRenderer.js +2 -2
- package/dist/views/page-builder/canvas/SectionRenderer.js +2 -2
- package/package.json +6 -2
- package/src/AdminRoot.tsx +21 -11
- package/src/__tests__/layout/primitives.test.ts +37 -0
- package/src/__tests__/lib/cv.test.ts +74 -0
- package/src/assets/actuate-logo.tsx +72 -0
- package/src/components/Breadcrumbs.tsx +6 -6
- package/src/components/CommandPalette.tsx +34 -34
- package/src/components/ContentOverviewChart.tsx +3 -3
- package/src/components/ErrorBoundary.tsx +3 -3
- package/src/components/FocalPointPicker.tsx +4 -4
- package/src/components/FolderTree.tsx +38 -38
- package/src/components/LivePreview.tsx +16 -16
- package/src/components/LocaleSwitcher.tsx +7 -7
- package/src/components/MediaPickerModal.tsx +21 -21
- package/src/components/PresenceIndicator.tsx +2 -2
- package/src/components/SEOConfigPanel.tsx +582 -0
- package/src/components/SEOPanel.tsx +46 -46
- package/src/components/SEOPerformance.tsx +21 -21
- package/src/components/SchedulePublishDialog.tsx +241 -0
- package/src/components/SharePreviewLinkDialog.tsx +227 -0
- package/src/components/TipTapEditor.tsx +33 -33
- package/src/components/VersionHistory.tsx +16 -16
- package/src/components/ui/Badge.tsx +66 -14
- package/src/components/ui/Button.tsx +70 -33
- package/src/components/ui/Card.tsx +101 -0
- package/src/components/ui/DataTable.tsx +1 -1
- package/src/components/ui/Input.tsx +35 -0
- package/src/components/ui/SearchInput.tsx +4 -4
- package/src/components/ui/Select.tsx +56 -0
- package/src/components/ui/Toast.tsx +1 -1
- package/src/components/ui/index.ts +18 -4
- package/src/fields/BlockBuilderField.tsx +3 -3
- package/src/fields/DateField.tsx +1 -1
- package/src/fields/RelationshipField.tsx +10 -10
- package/src/fields/TextField.tsx +1 -1
- package/src/index.ts +32 -0
- package/src/layout/Header.tsx +28 -28
- package/src/layout/Layout.tsx +39 -46
- package/src/layout/Sidebar.tsx +37 -64
- package/src/layout/primitives/AdminShell.tsx +118 -0
- package/src/layout/primitives/Box.tsx +30 -0
- package/src/layout/primitives/Cluster.tsx +74 -0
- package/src/layout/primitives/Grid.tsx +120 -0
- package/src/layout/primitives/PageContainer.tsx +96 -0
- package/src/layout/primitives/Split.tsx +73 -0
- package/src/layout/primitives/Stack.tsx +67 -0
- package/src/layout/primitives/index.ts +36 -0
- package/src/layout/primitives/tokens.ts +76 -0
- package/src/lib/cv.ts +96 -0
- package/src/styles/build-input.css +1 -1
- package/src/views/ApiKeys.tsx +57 -57
- package/src/views/CollectionList.tsx +30 -30
- package/src/views/Dashboard.tsx +737 -186
- package/src/views/DocumentEdit.tsx +90 -10
- package/src/views/ForgotPassword.tsx +18 -18
- package/src/views/FormEditor.tsx +75 -75
- package/src/views/FormSubmissions.tsx +76 -76
- package/src/views/Forms.tsx +27 -27
- package/src/views/Login.tsx +65 -25
- package/src/views/MediaBrowser.tsx +127 -127
- package/src/views/PageEditor.tsx +25 -25
- package/src/views/Pages.tsx +59 -59
- package/src/views/PostEditor.tsx +37 -37
- package/src/views/Posts.tsx +48 -48
- package/src/views/Redirects.tsx +21 -21
- package/src/views/ResetPassword.tsx +28 -28
- package/src/views/SEO.tsx +144 -144
- package/src/views/ScriptTagEditor.tsx +24 -24
- package/src/views/ScriptTags.tsx +10 -10
- package/src/views/Settings.tsx +88 -80
- package/src/views/SetupWizard.tsx +28 -28
- package/src/views/Users.tsx +20 -20
- package/src/views/page-builder/AIBlockAssist.tsx +1 -1
- package/src/views/page-builder/AIGenerateDialog.tsx +63 -63
- package/src/views/page-builder/BlockEditor.tsx +26 -26
- package/src/views/page-builder/BlockPicker.tsx +22 -22
- package/src/views/page-builder/BottomBar.tsx +8 -8
- package/src/views/page-builder/BuilderToolbar.tsx +17 -17
- package/src/views/page-builder/ContextPanel.tsx +3 -3
- package/src/views/page-builder/DesignScore.tsx +21 -21
- package/src/views/page-builder/NodeSettings.tsx +27 -27
- package/src/views/page-builder/PageBuilder.tsx +11 -11
- package/src/views/page-builder/PageSettings.tsx +4 -4
- package/src/views/page-builder/PageTemplates.tsx +18 -18
- package/src/views/page-builder/SEOPanel.tsx +53 -53
- package/src/views/page-builder/SavedSections.tsx +37 -37
- package/src/views/page-builder/TemplatePicker.tsx +17 -17
- package/src/views/page-builder/block-renderers/CTAPreview.tsx +13 -13
- package/src/views/page-builder/block-renderers/CardsPreview.tsx +5 -5
- package/src/views/page-builder/block-renderers/CodePreview.tsx +6 -6
- package/src/views/page-builder/block-renderers/FAQPreview.tsx +13 -13
- package/src/views/page-builder/block-renderers/FallbackPreview.tsx +3 -3
- package/src/views/page-builder/block-renderers/FormPreview.tsx +20 -20
- package/src/views/page-builder/block-renderers/GalleryPreview.tsx +8 -8
- package/src/views/page-builder/block-renderers/HeroPreview.tsx +16 -16
- package/src/views/page-builder/block-renderers/ImagePreview.tsx +4 -4
- package/src/views/page-builder/block-renderers/TextPreview.tsx +14 -14
- package/src/views/page-builder/block-renderers/VideoPreview.tsx +12 -12
- package/src/views/page-builder/canvas/BlockRenderer.tsx +4 -4
- package/src/views/page-builder/canvas/BuilderCanvas.tsx +6 -6
- package/src/views/page-builder/canvas/ColumnRenderer.tsx +3 -3
- package/src/views/page-builder/canvas/ContainerRenderer.tsx +2 -2
- package/src/views/page-builder/canvas/RowRenderer.tsx +2 -2
- package/src/views/page-builder/canvas/SectionRenderer.tsx +2 -2
package/dist/layout/Layout.js
CHANGED
|
@@ -1,25 +1,31 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useState, useEffect } from 'react';
|
|
4
4
|
import { Sidebar } from './Sidebar.js';
|
|
5
5
|
import { Header } from './Header.js';
|
|
6
6
|
import { Breadcrumbs } from '../components/Breadcrumbs.js';
|
|
7
|
+
import { AdminShell } from './primitives/AdminShell.js';
|
|
7
8
|
import { Toaster } from 'sonner';
|
|
9
|
+
/**
|
|
10
|
+
* Layout — thin shell that wires Sidebar/Header/Breadcrumbs into the
|
|
11
|
+
* `<AdminShell>` primitive.
|
|
12
|
+
*
|
|
13
|
+
* `AdminShell` (in `./primitives/AdminShell.tsx`) owns the actual layout
|
|
14
|
+
* algorithm (CSS Grid on desktop, fixed slide-in overlay on mobile,
|
|
15
|
+
* JS-driven `matchMedia` breakpoint) so that every layout decision lives
|
|
16
|
+
* in one place. Per-product chrome (Sidebar, Header, Breadcrumbs)
|
|
17
|
+
* composes on top of it.
|
|
18
|
+
*
|
|
19
|
+
* DO NOT re-implement layout logic in this file — extend `AdminShell`
|
|
20
|
+
* instead. The previous flex + `fixed`↔`static` toggle caused recurring
|
|
21
|
+
* sidebar-overlap bugs; the grid-based primitive is the contract.
|
|
22
|
+
*/
|
|
8
23
|
export function Layout({ config, session, currentPath, onNavigate, children }) {
|
|
9
24
|
const [sidebarCollapsed, setSidebarCollapsed] = useState(false);
|
|
10
25
|
const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false);
|
|
11
26
|
useEffect(() => {
|
|
12
27
|
setMobileSidebarOpen(false);
|
|
13
28
|
}, [currentPath]);
|
|
14
|
-
|
|
15
|
-
const handleResize = () => {
|
|
16
|
-
if (window.innerWidth < 1024) {
|
|
17
|
-
setMobileSidebarOpen(false);
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
window.addEventListener('resize', handleResize);
|
|
21
|
-
return () => window.removeEventListener('resize', handleResize);
|
|
22
|
-
}, []);
|
|
23
|
-
return (_jsxs("div", { className: "h-screen flex overflow-hidden bg-background text-foreground", children: [_jsx(Toaster, { position: "bottom-right" }), mobileSidebarOpen && (_jsx("div", { className: "fixed inset-0 bg-black/50 z-40 lg:hidden", onClick: () => setMobileSidebarOpen(false) })), _jsx("div", { className: `fixed lg:static inset-y-0 left-0 z-50 transform transition-transform duration-300 lg:transform-none ${mobileSidebarOpen ? 'translate-x-0' : '-translate-x-full lg:translate-x-0'}`, children: _jsx(Sidebar, { collapsed: sidebarCollapsed, onToggleCollapse: () => setSidebarCollapsed(!sidebarCollapsed), currentPath: currentPath, onNavigate: onNavigate, config: config }) }), _jsxs("div", { className: "flex-1 flex flex-col overflow-hidden", children: [_jsx(Header, { onToggleSidebar: () => setMobileSidebarOpen(!mobileSidebarOpen), session: session, onNavigate: onNavigate }), _jsx(Breadcrumbs, { currentPath: currentPath, onNavigate: onNavigate }), _jsx("main", { className: "flex-1 overflow-auto bg-background", children: _jsx("div", { className: "h-full", children: children }) })] })] }));
|
|
29
|
+
return (_jsxs(_Fragment, { children: [_jsx(Toaster, { position: "bottom-right" }), _jsx(AdminShell, { mobileSidebarOpen: mobileSidebarOpen, onMobileSidebarClose: () => setMobileSidebarOpen(false), sidebar: _jsx(Sidebar, { collapsed: sidebarCollapsed, onToggleCollapse: () => setSidebarCollapsed(!sidebarCollapsed), currentPath: currentPath, onNavigate: onNavigate, config: config }), header: _jsx(Header, { onToggleSidebar: () => setMobileSidebarOpen(!mobileSidebarOpen), session: session, onNavigate: onNavigate }), breadcrumbs: _jsx(Breadcrumbs, { currentPath: currentPath, onNavigate: onNavigate }), children: _jsx("div", { className: "h-full", children: children }) })] }));
|
|
24
30
|
}
|
|
25
31
|
//# sourceMappingURL=Layout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../src/layout/Layout.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAkB,MAAM,OAAO,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAUhC,MAAM,UAAU,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAe;IACxF,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC/D,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEjE,SAAS,CAAC,GAAG,EAAE;QACb,oBAAoB,CAAC,KAAK,CAAC,CAAA;IAC7B,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;IAEjB,
|
|
1
|
+
{"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../src/layout/Layout.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAkB,MAAM,OAAO,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAUhC;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAe;IACxF,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC/D,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEjE,SAAS,CAAC,GAAG,EAAE;QACb,oBAAoB,CAAC,KAAK,CAAC,CAAA;IAC7B,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;IAEjB,OAAO,CACL,8BACE,KAAC,OAAO,IAAC,QAAQ,EAAC,cAAc,GAAG,EACnC,KAAC,UAAU,IACT,iBAAiB,EAAE,iBAAiB,EACpC,oBAAoB,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,EACvD,OAAO,EACL,KAAC,OAAO,IACN,SAAS,EAAE,gBAAgB,EAC3B,gBAAgB,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,CAAC,gBAAgB,CAAC,EAC9D,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,GACd,EAEJ,MAAM,EACJ,KAAC,MAAM,IACL,eAAe,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,CAAC,iBAAiB,CAAC,EAC/D,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU,GACtB,EAEJ,WAAW,EAAE,KAAC,WAAW,IAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,GAAI,YAE9E,cAAK,SAAS,EAAC,QAAQ,YAAE,QAAQ,GAAO,GAC7B,IACZ,CACJ,CAAA;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../src/layout/Sidebar.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../src/layout/Sidebar.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAmG9C,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,OAAO,CAAA;IAClB,gBAAgB,EAAE,MAAM,IAAI,CAAA;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,MAAM,CAAC,EAAE,GAAG,CAAA;CACb;AAED,wBAAgB,OAAO,CAAC,EACtB,SAAS,EACT,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,MAAM,GACP,EAAE,YAAY,2CAsEd;AAQD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,UAAU,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf"}
|
package/dist/layout/Sidebar.js
CHANGED
|
@@ -1,11 +1,21 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { LayoutDashboard, FileText, File, Image, Settings, ChevronLeft, ChevronRight, ClipboardList, Users, Search as SearchIcon, Briefcase, FolderOpen, BookOpen, HelpCircle, Newspaper, PanelTop, PanelBottom, Layers, Code2, LayoutTemplate, Library, KeyRound, } from 'lucide-react';
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
import { ActuateBrandLogo } from '../assets/actuate-logo.js';
|
|
5
|
+
/**
|
|
6
|
+
* Compact mark used in the collapsed sidebar — just the "C" symbol from the
|
|
7
|
+
* full lockup, drawn as its own simple SVG so it stays crisp at 32×32.
|
|
8
|
+
*/
|
|
9
|
+
function ActuateMark({ className }) {
|
|
10
|
+
return (_jsxs("svg", { viewBox: "0 0 40 44", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, "aria-hidden": "true", children: [_jsx("polygon", { points: "20,2 6,18 12,18 20,8 28,18 34,18", fill: "#F05E65" }), _jsx("rect", { x: "11", y: "20", width: "4", height: "22", rx: "1", fill: "#F05E65" }), _jsx("rect", { x: "18", y: "20", width: "4", height: "22", rx: "1", fill: "#F05E65" }), _jsx("rect", { x: "25", y: "20", width: "4", height: "22", rx: "1", fill: "#F05E65" })] }));
|
|
6
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Full Actuate Media lockup. Inline SVG with a transparent background so it
|
|
14
|
+
* sits naturally on whatever surface the sidebar uses (light or dark theme,
|
|
15
|
+
* custom branding background, etc.).
|
|
16
|
+
*/
|
|
7
17
|
function ActuateWordmark({ className }) {
|
|
8
|
-
return (
|
|
18
|
+
return _jsx(ActuateBrandLogo, { className: className });
|
|
9
19
|
}
|
|
10
20
|
const ICON_MAP = {
|
|
11
21
|
file: File,
|
|
@@ -25,17 +35,17 @@ function BrandLogo({ config, collapsed }) {
|
|
|
25
35
|
const brandName = branding?.name;
|
|
26
36
|
if (collapsed) {
|
|
27
37
|
if (customLogo) {
|
|
28
|
-
return _jsx("img", { src: customLogo, alt: brandName ?? 'Admin', className: "
|
|
38
|
+
return _jsx("img", { src: customLogo, alt: brandName ?? 'Admin', className: "h-8 w-8 object-contain" });
|
|
29
39
|
}
|
|
30
|
-
return _jsx(
|
|
40
|
+
return _jsx(ActuateMark, { className: "h-8 w-8" });
|
|
31
41
|
}
|
|
32
42
|
if (customLogo) {
|
|
33
|
-
return (_jsxs("div", { className: "flex items-center gap-2.5
|
|
43
|
+
return (_jsxs("div", { className: "flex min-w-0 items-center gap-2.5", children: [_jsx("img", { src: customLogo, alt: brandName ?? 'Admin', className: "h-8 w-auto shrink-0 object-contain" }), brandName && (_jsx("span", { className: "text-sidebar-foreground truncate text-sm font-semibold", children: brandName }))] }));
|
|
34
44
|
}
|
|
35
45
|
if (brandName) {
|
|
36
|
-
return (_jsxs("div", { className: "flex items-center gap-2.5
|
|
46
|
+
return (_jsxs("div", { className: "flex min-w-0 items-center gap-2.5", children: [_jsx(ActuateMark, { className: "h-7 w-7 shrink-0" }), _jsx("span", { className: "text-sidebar-foreground truncate text-sm font-semibold", children: brandName })] }));
|
|
37
47
|
}
|
|
38
|
-
return _jsx(ActuateWordmark, { className: "h-
|
|
48
|
+
return _jsx(ActuateWordmark, { className: "h-9" });
|
|
39
49
|
}
|
|
40
50
|
const defaultNavItems = [
|
|
41
51
|
{ path: '/', label: 'Dashboard', icon: LayoutDashboard },
|
|
@@ -50,14 +60,14 @@ const defaultNavItems = [
|
|
|
50
60
|
];
|
|
51
61
|
export function Sidebar({ collapsed, onToggleCollapse, currentPath, onNavigate, config, }) {
|
|
52
62
|
const navItems = buildNavItems(config);
|
|
53
|
-
return (_jsxs("aside", { className: `
|
|
63
|
+
return (_jsxs("aside", { className: `bg-sidebar border-sidebar-border h-full border-r transition-all duration-200 ${collapsed ? 'w-20' : 'w-64'}`, children: [_jsxs("div", { className: `border-sidebar-border flex h-14 items-center border-b px-4 ${collapsed ? 'justify-center' : 'justify-between'}`, children: [!collapsed && _jsx(BrandLogo, { config: config, collapsed: false }), collapsed && _jsx(BrandLogo, { config: config, collapsed: true }), _jsx("button", { onClick: onToggleCollapse, className: "hover:bg-sidebar-accent hidden shrink-0 rounded-lg p-2 transition-colors md:block", "aria-label": collapsed ? 'Expand sidebar' : 'Collapse sidebar', children: collapsed ? (_jsx(ChevronRight, { className: "text-sidebar-foreground h-4 w-4" })) : (_jsx(ChevronLeft, { className: "text-sidebar-foreground h-4 w-4" })) })] }), _jsx("nav", { className: "space-y-1 p-3", children: navItems.map((item, idx) => {
|
|
54
64
|
const Icon = item.icon;
|
|
55
65
|
const isActive = currentPath === item.path || (item.path !== '/' && currentPath.startsWith(item.path));
|
|
56
66
|
const prevGroup = idx > 0 ? navItems[idx - 1]?.group : undefined;
|
|
57
67
|
const showGroupLabel = item.group && item.group !== prevGroup;
|
|
58
|
-
return (_jsxs("div", { children: [showGroupLabel && !collapsed && (_jsx("div", { className: "pt-3 pb-1
|
|
68
|
+
return (_jsxs("div", { children: [showGroupLabel && !collapsed && (_jsx("div", { className: "px-3 pt-3 pb-1", children: _jsx("span", { className: "text-sidebar-foreground/50 text-[10px] font-semibold tracking-wider uppercase", children: item.group }) })), showGroupLabel && collapsed && (_jsx("div", { className: "flex justify-center pt-2 pb-1", children: _jsx("span", { className: "border-sidebar-foreground/20 w-4 border-t" }) })), _jsxs("button", { onClick: () => onNavigate(item.path), className: `flex w-full items-center gap-3 rounded-lg px-3 py-2.5 text-left transition-colors ${isActive
|
|
59
69
|
? 'bg-sidebar-accent text-sidebar-primary'
|
|
60
|
-
: 'text-sidebar-foreground hover:bg-sidebar-accent'} ${collapsed ? 'justify-center' : ''}`, title: collapsed ? item.label : '', children: [_jsx(Icon, { className: "
|
|
70
|
+
: 'text-sidebar-foreground hover:bg-sidebar-accent'} ${collapsed ? 'justify-center' : ''}`, title: collapsed ? item.label : '', children: [_jsx(Icon, { className: "h-5 w-5 shrink-0" }), !collapsed && _jsx("span", { className: "text-sm font-medium", children: item.label })] })] }, item.path));
|
|
61
71
|
}) })] }));
|
|
62
72
|
}
|
|
63
73
|
function resolveIcon(collection) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sidebar.js","sourceRoot":"","sources":["../../src/layout/Sidebar.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EACL,eAAe,EACf,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,aAAa,EACb,KAAK,EACL,MAAM,IAAI,UAAU,EACpB,SAAS,EACT,UAAU,EACV,QAAQ,EACR,UAAU,EACV,SAAS,EACT,QAAQ,EACR,WAAW,EACX,MAAM,EACN,KAAK,EACL,cAAc,EACd,OAAO,EACP,QAAQ,GACT,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"Sidebar.js","sourceRoot":"","sources":["../../src/layout/Sidebar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export interface AdminShellProps {
|
|
3
|
+
/** Sidebar/navigation slot. Rendered in the left column on desktop. */
|
|
4
|
+
sidebar: ReactNode;
|
|
5
|
+
/** Top header slot. Rendered above the main content. */
|
|
6
|
+
header?: ReactNode;
|
|
7
|
+
/** Optional breadcrumb / sub-header slot rendered below the header. */
|
|
8
|
+
breadcrumbs?: ReactNode;
|
|
9
|
+
/** Main content. Scrolls independently of the sidebar. */
|
|
10
|
+
children: ReactNode;
|
|
11
|
+
/**
|
|
12
|
+
* Whether the mobile sidebar overlay is currently open. Controlled.
|
|
13
|
+
* AdminShell renders the backdrop + slide transform; the consumer owns
|
|
14
|
+
* the open state and the hamburger button that toggles it.
|
|
15
|
+
*/
|
|
16
|
+
mobileSidebarOpen?: boolean;
|
|
17
|
+
onMobileSidebarClose?: () => void;
|
|
18
|
+
/**
|
|
19
|
+
* Breakpoint above which the sidebar docks beside the content instead
|
|
20
|
+
* of overlaying on top of it. Mirrors Tailwind's `md` (768px) default.
|
|
21
|
+
*/
|
|
22
|
+
desktopBreakpoint?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The canonical admin chrome. Owns the entire viewport, splits into
|
|
26
|
+
* `sidebar | (header + breadcrumbs + content)`, and handles the mobile
|
|
27
|
+
* overlay transition.
|
|
28
|
+
*
|
|
29
|
+
* Implementation notes:
|
|
30
|
+
* - Desktop layout is CSS Grid with `gridTemplateColumns: 'auto minmax(0, 1fr)'`.
|
|
31
|
+
* The `minmax(0, 1fr)` is load-bearing: it lets the content shrink
|
|
32
|
+
* below its intrinsic width when the sidebar takes its share, which
|
|
33
|
+
* is the one thing flex-based shells fail at.
|
|
34
|
+
* - Mobile layout is a single block with the sidebar absolutely
|
|
35
|
+
* positioned and slid in via `transform: translateX(…)`. We avoid
|
|
36
|
+
* the brittle `fixed` ↔ `static` toggle that caused recurring sidebar
|
|
37
|
+
* overlap bugs in the old layout.
|
|
38
|
+
* - The desktop/mobile decision is made in JS via `matchMedia` so the
|
|
39
|
+
* layout is independent of Tailwind's `md:` utility compilation. If
|
|
40
|
+
* the CSS bundle is stale or partially loaded the layout still works.
|
|
41
|
+
*/
|
|
42
|
+
export declare function AdminShell({ sidebar, header, breadcrumbs, children, mobileSidebarOpen, onMobileSidebarClose, desktopBreakpoint, }: AdminShellProps): import("react/jsx-runtime").JSX.Element;
|
|
43
|
+
//# sourceMappingURL=AdminShell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminShell.d.ts","sourceRoot":"","sources":["../../../src/layout/primitives/AdminShell.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,OAAO,EAAE,SAAS,CAAA;IAClB,wDAAwD;IACxD,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,uEAAuE;IACvE,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB,0DAA0D;IAC1D,QAAQ,EAAE,SAAS,CAAA;IACnB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAA;IACjC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,MAAM,EACN,WAAW,EACX,QAAQ,EACR,iBAAyB,EACzB,oBAAoB,EACpB,iBAAuB,GACxB,EAAE,eAAe,2CAiEjB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* The canonical admin chrome. Owns the entire viewport, splits into
|
|
5
|
+
* `sidebar | (header + breadcrumbs + content)`, and handles the mobile
|
|
6
|
+
* overlay transition.
|
|
7
|
+
*
|
|
8
|
+
* Implementation notes:
|
|
9
|
+
* - Desktop layout is CSS Grid with `gridTemplateColumns: 'auto minmax(0, 1fr)'`.
|
|
10
|
+
* The `minmax(0, 1fr)` is load-bearing: it lets the content shrink
|
|
11
|
+
* below its intrinsic width when the sidebar takes its share, which
|
|
12
|
+
* is the one thing flex-based shells fail at.
|
|
13
|
+
* - Mobile layout is a single block with the sidebar absolutely
|
|
14
|
+
* positioned and slid in via `transform: translateX(…)`. We avoid
|
|
15
|
+
* the brittle `fixed` ↔ `static` toggle that caused recurring sidebar
|
|
16
|
+
* overlap bugs in the old layout.
|
|
17
|
+
* - The desktop/mobile decision is made in JS via `matchMedia` so the
|
|
18
|
+
* layout is independent of Tailwind's `md:` utility compilation. If
|
|
19
|
+
* the CSS bundle is stale or partially loaded the layout still works.
|
|
20
|
+
*/
|
|
21
|
+
export function AdminShell({ sidebar, header, breadcrumbs, children, mobileSidebarOpen = false, onMobileSidebarClose, desktopBreakpoint = 768, }) {
|
|
22
|
+
const [isDesktop, setIsDesktop] = useState(false);
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
if (typeof window === 'undefined')
|
|
25
|
+
return;
|
|
26
|
+
const mq = window.matchMedia(`(min-width: ${desktopBreakpoint}px)`);
|
|
27
|
+
const handler = () => setIsDesktop(mq.matches);
|
|
28
|
+
handler();
|
|
29
|
+
mq.addEventListener('change', handler);
|
|
30
|
+
return () => mq.removeEventListener('change', handler);
|
|
31
|
+
}, [desktopBreakpoint]);
|
|
32
|
+
return (_jsxs("div", { className: "bg-background text-foreground h-screen overflow-hidden", style: isDesktop
|
|
33
|
+
? { display: 'grid', gridTemplateColumns: 'auto minmax(0, 1fr)' }
|
|
34
|
+
: { display: 'block', position: 'relative' }, children: [!isDesktop && mobileSidebarOpen && (_jsx("div", { "aria-hidden": true, className: "fixed inset-0 z-40 bg-black/30 backdrop-blur-sm", onClick: onMobileSidebarClose })), _jsx("div", { className: "z-50", style: isDesktop
|
|
35
|
+
? {
|
|
36
|
+
gridColumn: '1 / 2',
|
|
37
|
+
height: '100vh',
|
|
38
|
+
overflow: 'hidden',
|
|
39
|
+
}
|
|
40
|
+
: {
|
|
41
|
+
position: 'fixed',
|
|
42
|
+
top: 0,
|
|
43
|
+
bottom: 0,
|
|
44
|
+
left: 0,
|
|
45
|
+
transform: mobileSidebarOpen ? 'translateX(0)' : 'translateX(-100%)',
|
|
46
|
+
transition: 'transform 300ms ease',
|
|
47
|
+
}, children: sidebar }), _jsxs("div", { className: "flex flex-col overflow-hidden", style: isDesktop
|
|
48
|
+
? { gridColumn: '2 / 3', height: '100vh', minWidth: 0 }
|
|
49
|
+
: { height: '100vh', minWidth: 0 }, children: [header, breadcrumbs, _jsx("main", { className: "flex-1 overflow-y-auto", children: children })] })] }));
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=AdminShell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminShell.js","sourceRoot":"","sources":["../../../src/layout/primitives/AdminShell.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AA0B3C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,UAAU,CAAC,EACzB,OAAO,EACP,MAAM,EACN,WAAW,EACX,QAAQ,EACR,iBAAiB,GAAG,KAAK,EACzB,oBAAoB,EACpB,iBAAiB,GAAG,GAAG,GACP;IAChB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEjD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAM;QACzC,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,eAAe,iBAAiB,KAAK,CAAC,CAAA;QACnE,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,OAAO,CAAC,CAAA;QAC9C,OAAO,EAAE,CAAA;QACT,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QACtC,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACxD,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAA;IAEvB,OAAO,CACL,eACE,SAAS,EAAC,wDAAwD,EAClE,KAAK,EACH,SAAS;YACP,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,qBAAqB,EAAE;YACjE,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,aAG/C,CAAC,SAAS,IAAI,iBAAiB,IAAI,CAClC,mCAEE,SAAS,EAAC,iDAAiD,EAC3D,OAAO,EAAE,oBAAoB,GAC7B,CACH,EAED,cACE,SAAS,EAAC,MAAM,EAChB,KAAK,EACH,SAAS;oBACP,CAAC,CAAC;wBACE,UAAU,EAAE,OAAO;wBACnB,MAAM,EAAE,OAAO;wBACf,QAAQ,EAAE,QAAQ;qBACnB;oBACH,CAAC,CAAC;wBACE,QAAQ,EAAE,OAAO;wBACjB,GAAG,EAAE,CAAC;wBACN,MAAM,EAAE,CAAC;wBACT,IAAI,EAAE,CAAC;wBACP,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,mBAAmB;wBACpE,UAAU,EAAE,sBAAsB;qBACnC,YAGN,OAAO,GACJ,EAEN,eACE,SAAS,EAAC,+BAA+B,EACzC,KAAK,EACH,SAAS;oBACP,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE;oBACvD,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,aAGrC,MAAM,EACN,WAAW,EACZ,eAAM,SAAS,EAAC,wBAAwB,YAAE,QAAQ,GAAQ,IACtD,IACF,CACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { HTMLAttributes, ReactNode, ElementType } from 'react';
|
|
2
|
+
export interface BoxProps extends Omit<HTMLAttributes<HTMLElement>, 'children'> {
|
|
3
|
+
/**
|
|
4
|
+
* The element to render. Defaults to `div`. Use semantic elements (`<section>`,
|
|
5
|
+
* `<article>`, etc.) for accessibility — Box is the lowest-level escape
|
|
6
|
+
* hatch and exists primarily so views don't reach for raw `<div>` with
|
|
7
|
+
* five Tailwind utilities.
|
|
8
|
+
*/
|
|
9
|
+
as?: ElementType;
|
|
10
|
+
children?: ReactNode;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The lowest-level primitive — a forwardRef'd div (by default) that exists
|
|
14
|
+
* so consumers always have a stable, semantically-tagged container to
|
|
15
|
+
* compose around. Prefer Box over a bare `<div>` to keep the design system
|
|
16
|
+
* audit clean.
|
|
17
|
+
*/
|
|
18
|
+
export declare const Box: import("react").ForwardRefExoticComponent<BoxProps & import("react").RefAttributes<HTMLElement>>;
|
|
19
|
+
//# sourceMappingURL=Box.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Box.d.ts","sourceRoot":"","sources":["../../../src/layout/primitives/Box.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAEnE,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC;IAC7E;;;;;OAKG;IACH,EAAE,CAAC,EAAE,WAAW,CAAA;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAED;;;;;GAKG;AACH,eAAO,MAAM,GAAG,kGASd,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* The lowest-level primitive — a forwardRef'd div (by default) that exists
|
|
5
|
+
* so consumers always have a stable, semantically-tagged container to
|
|
6
|
+
* compose around. Prefer Box over a bare `<div>` to keep the design system
|
|
7
|
+
* audit clean.
|
|
8
|
+
*/
|
|
9
|
+
export const Box = forwardRef(function Box({ as: Component = 'div', children, ...rest }, ref) {
|
|
10
|
+
return (_jsx(Component, { ref: ref, ...rest, children: children }));
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=Box.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Box.js","sourceRoot":"","sources":["../../../src/layout/primitives/Box.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAclC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,UAAU,CAAwB,SAAS,GAAG,CAC/D,EAAE,EAAE,EAAE,SAAS,GAAG,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAC5C,GAAG;IAEH,OAAO,CACL,KAAC,SAAS,IAAC,GAAG,EAAE,GAAG,KAAM,IAAI,YAC1B,QAAQ,GACC,CACb,CAAA;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { HTMLAttributes, ReactNode, ElementType } from 'react';
|
|
2
|
+
import type { SpaceToken } from './tokens.js';
|
|
3
|
+
export type ClusterAlign = 'start' | 'center' | 'end' | 'baseline' | 'stretch';
|
|
4
|
+
export type ClusterJustify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';
|
|
5
|
+
export interface ClusterProps extends HTMLAttributes<HTMLElement> {
|
|
6
|
+
/** Gap between children. Maps to Tailwind `gap-{space}`. */
|
|
7
|
+
space?: SpaceToken;
|
|
8
|
+
/** Render as a different element. Defaults to `div`. */
|
|
9
|
+
as?: ElementType;
|
|
10
|
+
/** Align items on the cross axis. */
|
|
11
|
+
align?: ClusterAlign;
|
|
12
|
+
/** Distribute items along the main axis. */
|
|
13
|
+
justify?: ClusterJustify;
|
|
14
|
+
/** Reverse the order of children. */
|
|
15
|
+
reverse?: boolean;
|
|
16
|
+
/** Disable wrapping (default: true, items wrap on overflow). */
|
|
17
|
+
noWrap?: boolean;
|
|
18
|
+
children?: ReactNode;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Horizontal cluster of items with a consistent gap, wrapping by default.
|
|
22
|
+
* The canonical use case is action toolbars (`<Cluster justify="end">`),
|
|
23
|
+
* badge groups, breadcrumbs, etc. Never reach for `flex flex-wrap gap-2`
|
|
24
|
+
* directly — use Cluster.
|
|
25
|
+
*/
|
|
26
|
+
export declare function Cluster({ space, as: Component, align, justify, reverse, noWrap, className, children, ...rest }: ClusterProps): import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
//# sourceMappingURL=Cluster.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Cluster.d.ts","sourceRoot":"","sources":["../../../src/layout/primitives/Cluster.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,UAAU,GAAG,SAAS,CAAA;AAC9E,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAEzF,MAAM,WAAW,YAAa,SAAQ,cAAc,CAAC,WAAW,CAAC;IAC/D,4DAA4D;IAC5D,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,wDAAwD;IACxD,EAAE,CAAC,EAAE,WAAW,CAAA;IAChB,qCAAqC;IACrC,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,qCAAqC;IACrC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,gEAAgE;IAChE,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAmBD;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,EACtB,KAAW,EACX,EAAE,EAAE,SAAiB,EACrB,KAAgB,EAChB,OAAiB,EACjB,OAAO,EACP,MAAM,EACN,SAAc,EACd,QAAQ,EACR,GAAG,IAAI,EACR,EAAE,YAAY,2CAkBd"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
const ALIGN_CLASS = {
|
|
3
|
+
start: 'items-start',
|
|
4
|
+
center: 'items-center',
|
|
5
|
+
end: 'items-end',
|
|
6
|
+
baseline: 'items-baseline',
|
|
7
|
+
stretch: 'items-stretch',
|
|
8
|
+
};
|
|
9
|
+
const JUSTIFY_CLASS = {
|
|
10
|
+
start: 'justify-start',
|
|
11
|
+
center: 'justify-center',
|
|
12
|
+
end: 'justify-end',
|
|
13
|
+
between: 'justify-between',
|
|
14
|
+
around: 'justify-around',
|
|
15
|
+
evenly: 'justify-evenly',
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Horizontal cluster of items with a consistent gap, wrapping by default.
|
|
19
|
+
* The canonical use case is action toolbars (`<Cluster justify="end">`),
|
|
20
|
+
* badge groups, breadcrumbs, etc. Never reach for `flex flex-wrap gap-2`
|
|
21
|
+
* directly — use Cluster.
|
|
22
|
+
*/
|
|
23
|
+
export function Cluster({ space = '2', as: Component = 'div', align = 'center', justify = 'start', reverse, noWrap, className = '', children, ...rest }) {
|
|
24
|
+
const classes = [
|
|
25
|
+
'flex',
|
|
26
|
+
reverse ? 'flex-row-reverse' : 'flex-row',
|
|
27
|
+
noWrap ? 'flex-nowrap' : 'flex-wrap',
|
|
28
|
+
`gap-${space}`,
|
|
29
|
+
ALIGN_CLASS[align],
|
|
30
|
+
JUSTIFY_CLASS[justify],
|
|
31
|
+
className,
|
|
32
|
+
]
|
|
33
|
+
.filter(Boolean)
|
|
34
|
+
.join(' ');
|
|
35
|
+
return (_jsx(Component, { className: classes, ...rest, children: children }));
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=Cluster.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Cluster.js","sourceRoot":"","sources":["../../../src/layout/primitives/Cluster.tsx"],"names":[],"mappings":";AAsBA,MAAM,WAAW,GAAiC;IAChD,KAAK,EAAE,aAAa;IACpB,MAAM,EAAE,cAAc;IACtB,GAAG,EAAE,WAAW;IAChB,QAAQ,EAAE,gBAAgB;IAC1B,OAAO,EAAE,eAAe;CACzB,CAAA;AAED,MAAM,aAAa,GAAmC;IACpD,KAAK,EAAE,eAAe;IACtB,MAAM,EAAE,gBAAgB;IACxB,GAAG,EAAE,aAAa;IAClB,OAAO,EAAE,iBAAiB;IAC1B,MAAM,EAAE,gBAAgB;IACxB,MAAM,EAAE,gBAAgB;CACzB,CAAA;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,EACtB,KAAK,GAAG,GAAG,EACX,EAAE,EAAE,SAAS,GAAG,KAAK,EACrB,KAAK,GAAG,QAAQ,EAChB,OAAO,GAAG,OAAO,EACjB,OAAO,EACP,MAAM,EACN,SAAS,GAAG,EAAE,EACd,QAAQ,EACR,GAAG,IAAI,EACM;IACb,MAAM,OAAO,GAAG;QACd,MAAM;QACN,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,UAAU;QACzC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW;QACpC,OAAO,KAAK,EAAE;QACd,WAAW,CAAC,KAAK,CAAC;QAClB,aAAa,CAAC,OAAO,CAAC;QACtB,SAAS;KACV;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAA;IAEZ,OAAO,CACL,KAAC,SAAS,IAAC,SAAS,EAAE,OAAO,KAAM,IAAI,YACpC,QAAQ,GACC,CACb,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { HTMLAttributes, ReactNode, ElementType } from 'react';
|
|
2
|
+
import type { SpaceToken } from './tokens.js';
|
|
3
|
+
/**
|
|
4
|
+
* Responsive column count. Pass a number for static grids, or a map to
|
|
5
|
+
* change column count at each breakpoint.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* columns={3} // 3 cols at every breakpoint
|
|
9
|
+
* columns={{ base: 1, md: 2, lg: 4 }} // responsive
|
|
10
|
+
*/
|
|
11
|
+
export type GridResponsive = number | {
|
|
12
|
+
base?: number;
|
|
13
|
+
sm?: number;
|
|
14
|
+
md?: number;
|
|
15
|
+
lg?: number;
|
|
16
|
+
xl?: number;
|
|
17
|
+
'2xl'?: number;
|
|
18
|
+
};
|
|
19
|
+
export interface GridProps extends HTMLAttributes<HTMLElement> {
|
|
20
|
+
columns: GridResponsive;
|
|
21
|
+
/** Gap between cells. */
|
|
22
|
+
space?: SpaceToken;
|
|
23
|
+
/** Row gap (defaults to `space`). */
|
|
24
|
+
rowSpace?: SpaceToken;
|
|
25
|
+
/** Render as a different element. Defaults to `div`. */
|
|
26
|
+
as?: ElementType;
|
|
27
|
+
/**
|
|
28
|
+
* Use auto-fit instead of explicit column counts. When set, `minItemWidth`
|
|
29
|
+
* controls the minimum tile width before the grid reflows. Use this for
|
|
30
|
+
* card grids that should adapt to container width without specific
|
|
31
|
+
* breakpoints.
|
|
32
|
+
*/
|
|
33
|
+
autoFit?: boolean;
|
|
34
|
+
/** Min tile width when `autoFit` is true. Defaults to `16rem`. */
|
|
35
|
+
minItemWidth?: string;
|
|
36
|
+
children?: ReactNode;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Responsive CSS grid primitive. Pass either an explicit `columns` count
|
|
40
|
+
* (per-breakpoint or static) or set `autoFit` for a `repeat(auto-fit, …)`
|
|
41
|
+
* tile grid. Both modes share the same `space` / `rowSpace` knobs so
|
|
42
|
+
* usage is consistent across views.
|
|
43
|
+
*/
|
|
44
|
+
export declare function Grid({ columns, space, rowSpace, as: Component, autoFit, minItemWidth, className, style, children, ...rest }: GridProps): import("react/jsx-runtime").JSX.Element;
|
|
45
|
+
//# sourceMappingURL=Grid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Grid.d.ts","sourceRoot":"","sources":["../../../src/layout/primitives/Grid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GACtB,MAAM,GACN;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAEzF,MAAM,WAAW,SAAU,SAAQ,cAAc,CAAC,WAAW,CAAC;IAC5D,OAAO,EAAE,cAAc,CAAA;IACvB,yBAAyB;IACzB,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,UAAU,CAAA;IACrB,wDAAwD;IACxD,EAAE,CAAC,EAAE,WAAW,CAAA;IAChB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAoCD;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,EACnB,OAAO,EACP,KAAW,EACX,QAAQ,EACR,EAAE,EAAE,SAAiB,EACrB,OAAO,EACP,YAAsB,EACtB,SAAc,EACd,KAAK,EACL,QAAQ,EACR,GAAG,IAAI,EACR,EAAE,SAAS,2CAiCX"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
const COL_CLASS = {
|
|
3
|
+
1: 'grid-cols-1',
|
|
4
|
+
2: 'grid-cols-2',
|
|
5
|
+
3: 'grid-cols-3',
|
|
6
|
+
4: 'grid-cols-4',
|
|
7
|
+
5: 'grid-cols-5',
|
|
8
|
+
6: 'grid-cols-6',
|
|
9
|
+
7: 'grid-cols-7',
|
|
10
|
+
8: 'grid-cols-8',
|
|
11
|
+
9: 'grid-cols-9',
|
|
12
|
+
10: 'grid-cols-10',
|
|
13
|
+
11: 'grid-cols-11',
|
|
14
|
+
12: 'grid-cols-12',
|
|
15
|
+
};
|
|
16
|
+
const BP_PREFIX = ['', 'sm:', 'md:', 'lg:', 'xl:', '2xl:'];
|
|
17
|
+
function columnsToClasses(columns) {
|
|
18
|
+
if (typeof columns === 'number') {
|
|
19
|
+
return COL_CLASS[columns] ?? 'grid-cols-1';
|
|
20
|
+
}
|
|
21
|
+
const order = ['base', 'sm', 'md', 'lg', 'xl', '2xl'];
|
|
22
|
+
return order
|
|
23
|
+
.map((bp, i) => {
|
|
24
|
+
const n = columns[bp];
|
|
25
|
+
if (!n)
|
|
26
|
+
return '';
|
|
27
|
+
const base = COL_CLASS[n] ?? 'grid-cols-1';
|
|
28
|
+
return BP_PREFIX[i] + base;
|
|
29
|
+
})
|
|
30
|
+
.filter(Boolean)
|
|
31
|
+
.join(' ');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Responsive CSS grid primitive. Pass either an explicit `columns` count
|
|
35
|
+
* (per-breakpoint or static) or set `autoFit` for a `repeat(auto-fit, …)`
|
|
36
|
+
* tile grid. Both modes share the same `space` / `rowSpace` knobs so
|
|
37
|
+
* usage is consistent across views.
|
|
38
|
+
*/
|
|
39
|
+
export function Grid({ columns, space = '4', rowSpace, as: Component = 'div', autoFit, minItemWidth = '16rem', className = '', style, children, ...rest }) {
|
|
40
|
+
if (autoFit) {
|
|
41
|
+
return (_jsx(Component, { className: ['grid', `gap-${space}`, rowSpace ? `gap-y-${rowSpace}` : '', className]
|
|
42
|
+
.filter(Boolean)
|
|
43
|
+
.join(' '), style: {
|
|
44
|
+
gridTemplateColumns: `repeat(auto-fit, minmax(${minItemWidth}, 1fr))`,
|
|
45
|
+
...style,
|
|
46
|
+
}, ...rest, children: children }));
|
|
47
|
+
}
|
|
48
|
+
const classes = [
|
|
49
|
+
'grid',
|
|
50
|
+
columnsToClasses(columns),
|
|
51
|
+
`gap-${space}`,
|
|
52
|
+
rowSpace ? `gap-y-${rowSpace}` : '',
|
|
53
|
+
className,
|
|
54
|
+
]
|
|
55
|
+
.filter(Boolean)
|
|
56
|
+
.join(' ');
|
|
57
|
+
return (_jsx(Component, { className: classes, style: style, ...rest, children: children }));
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=Grid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Grid.js","sourceRoot":"","sources":["../../../src/layout/primitives/Grid.tsx"],"names":[],"mappings":";AAmCA,MAAM,SAAS,GAA2B;IACxC,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,EAAE,EAAE,cAAc;IAClB,EAAE,EAAE,cAAc;IAClB,EAAE,EAAE,cAAc;CACnB,CAAA;AAED,MAAM,SAAS,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAU,CAAA;AAGnE,SAAS,gBAAgB,CAAC,OAAuB;IAC/C,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,SAAS,CAAC,OAAO,CAAC,IAAI,aAAa,CAAA;IAC5C,CAAC;IACD,MAAM,KAAK,GAAY,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;IAC9D,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACb,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,CAAA;QACrB,IAAI,CAAC,CAAC;YAAE,OAAO,EAAE,CAAA;QACjB,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,aAAa,CAAA;QAC1C,OAAO,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;IAC5B,CAAC,CAAC;SACD,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAA;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,IAAI,CAAC,EACnB,OAAO,EACP,KAAK,GAAG,GAAG,EACX,QAAQ,EACR,EAAE,EAAE,SAAS,GAAG,KAAK,EACrB,OAAO,EACP,YAAY,GAAG,OAAO,EACtB,SAAS,GAAG,EAAE,EACd,KAAK,EACL,QAAQ,EACR,GAAG,IAAI,EACG;IACV,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CACL,KAAC,SAAS,IACR,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC;iBAChF,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,GAAG,CAAC,EACZ,KAAK,EAAE;gBACL,mBAAmB,EAAE,2BAA2B,YAAY,SAAS;gBACrE,GAAG,KAAK;aACT,KACG,IAAI,YAEP,QAAQ,GACC,CACb,CAAA;IACH,CAAC;IAED,MAAM,OAAO,GAAG;QACd,MAAM;QACN,gBAAgB,CAAC,OAAO,CAAC;QACzB,OAAO,KAAK,EAAE;QACd,QAAQ,CAAC,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;QACnC,SAAS;KACV;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAA;IAEZ,OAAO,CACL,KAAC,SAAS,IAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,KAAM,IAAI,YAClD,QAAQ,GACC,CACb,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { HTMLAttributes, ReactNode } from 'react';
|
|
2
|
+
export interface PageContainerProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {
|
|
3
|
+
/** Page title rendered as an h1 inside the page header. */
|
|
4
|
+
title?: ReactNode;
|
|
5
|
+
/** Optional sub-headline shown beneath the title. */
|
|
6
|
+
description?: ReactNode;
|
|
7
|
+
/** Right-aligned action area (buttons, filters). Rendered in the header. */
|
|
8
|
+
actions?: ReactNode;
|
|
9
|
+
/**
|
|
10
|
+
* Maximum width of the content. Defaults to `7xl` (Tailwind's max-w-7xl,
|
|
11
|
+
* ~1280px). Pass `'full'` for edge-to-edge content.
|
|
12
|
+
*/
|
|
13
|
+
maxWidth?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl' | '6xl' | '7xl' | 'full';
|
|
14
|
+
/** Horizontal padding token. Defaults to `6` (24px). */
|
|
15
|
+
paddingX?: '4' | '6' | '8';
|
|
16
|
+
/** Vertical padding token. Defaults to `6`. */
|
|
17
|
+
paddingY?: '4' | '6' | '8' | '10';
|
|
18
|
+
/** Vertical gap between the header and the body. Defaults to `6`. */
|
|
19
|
+
gap?: '4' | '6' | '8';
|
|
20
|
+
children?: ReactNode;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The single canonical wrapper for every admin page. PageContainer owns
|
|
24
|
+
* three responsibilities so individual views can stop redoing them:
|
|
25
|
+
*
|
|
26
|
+
* 1. Consistent max-width + horizontal padding (so dashboards, lists, and
|
|
27
|
+
* forms all line up visually).
|
|
28
|
+
* 2. A standard header slot with title + description + actions.
|
|
29
|
+
* 3. A standard body slot rendered as a `<Stack>` so children stack with
|
|
30
|
+
* consistent vertical rhythm.
|
|
31
|
+
*
|
|
32
|
+
* Use PageContainer at the top of every screen. Compose with `<Stack>` /
|
|
33
|
+
* `<Grid>` / `<Cluster>` inside. Never roll a per-screen wrapper.
|
|
34
|
+
*/
|
|
35
|
+
export declare function PageContainer({ title, description, actions, maxWidth, paddingX, paddingY, gap, className, children, ...rest }: PageContainerProps): import("react/jsx-runtime").JSX.Element;
|
|
36
|
+
//# sourceMappingURL=PageContainer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageContainer.d.ts","sourceRoot":"","sources":["../../../src/layout/primitives/PageContainer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtD,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IACpF,2DAA2D;IAC3D,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,qDAAqD;IACrD,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAA;IAC7F,wDAAwD;IACxD,QAAQ,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;IAC1B,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAA;IACjC,qEAAqE;IACrE,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAgBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,WAAW,EACX,OAAO,EACP,QAAgB,EAChB,QAAc,EACd,QAAc,EACd,GAAS,EACT,SAAc,EACd,QAAQ,EACR,GAAG,IAAI,EACR,EAAE,kBAAkB,2CAiCpB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Stack } from './Stack.js';
|
|
3
|
+
const MAX_WIDTH_CLASS = {
|
|
4
|
+
sm: 'max-w-sm',
|
|
5
|
+
md: 'max-w-md',
|
|
6
|
+
lg: 'max-w-lg',
|
|
7
|
+
xl: 'max-w-xl',
|
|
8
|
+
'2xl': 'max-w-2xl',
|
|
9
|
+
'3xl': 'max-w-3xl',
|
|
10
|
+
'4xl': 'max-w-4xl',
|
|
11
|
+
'5xl': 'max-w-5xl',
|
|
12
|
+
'6xl': 'max-w-6xl',
|
|
13
|
+
'7xl': 'max-w-7xl',
|
|
14
|
+
full: 'max-w-none',
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* The single canonical wrapper for every admin page. PageContainer owns
|
|
18
|
+
* three responsibilities so individual views can stop redoing them:
|
|
19
|
+
*
|
|
20
|
+
* 1. Consistent max-width + horizontal padding (so dashboards, lists, and
|
|
21
|
+
* forms all line up visually).
|
|
22
|
+
* 2. A standard header slot with title + description + actions.
|
|
23
|
+
* 3. A standard body slot rendered as a `<Stack>` so children stack with
|
|
24
|
+
* consistent vertical rhythm.
|
|
25
|
+
*
|
|
26
|
+
* Use PageContainer at the top of every screen. Compose with `<Stack>` /
|
|
27
|
+
* `<Grid>` / `<Cluster>` inside. Never roll a per-screen wrapper.
|
|
28
|
+
*/
|
|
29
|
+
export function PageContainer({ title, description, actions, maxWidth = '7xl', paddingX = '6', paddingY = '6', gap = '6', className = '', children, ...rest }) {
|
|
30
|
+
const outerClasses = [
|
|
31
|
+
'mx-auto w-full',
|
|
32
|
+
MAX_WIDTH_CLASS[maxWidth],
|
|
33
|
+
`px-${paddingX}`,
|
|
34
|
+
`py-${paddingY}`,
|
|
35
|
+
className,
|
|
36
|
+
]
|
|
37
|
+
.filter(Boolean)
|
|
38
|
+
.join(' ');
|
|
39
|
+
return (_jsx("section", { className: outerClasses, ...rest, children: _jsxs(Stack, { space: gap, children: [(title || description || actions) && (_jsxs("header", { className: "flex flex-col gap-3 md:flex-row md:items-start md:justify-between", children: [(title || description) && (_jsxs("div", { className: "min-w-0", children: [title && (_jsx("h1", { className: "text-foreground truncate text-2xl font-semibold tracking-tight", children: title })), description && _jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: description })] })), actions && _jsx("div", { className: "flex shrink-0 items-center gap-2", children: actions })] })), children] }) }));
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=PageContainer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageContainer.js","sourceRoot":"","sources":["../../../src/layout/primitives/PageContainer.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAuBlC,MAAM,eAAe,GAAgE;IACnF,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,UAAU;IACd,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,WAAW;IAClB,IAAI,EAAE,YAAY;CACnB,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,KAAK,EACL,WAAW,EACX,OAAO,EACP,QAAQ,GAAG,KAAK,EAChB,QAAQ,GAAG,GAAG,EACd,QAAQ,GAAG,GAAG,EACd,GAAG,GAAG,GAAG,EACT,SAAS,GAAG,EAAE,EACd,QAAQ,EACR,GAAG,IAAI,EACY;IACnB,MAAM,YAAY,GAAG;QACnB,gBAAgB;QAChB,eAAe,CAAC,QAAQ,CAAC;QACzB,MAAM,QAAQ,EAAE;QAChB,MAAM,QAAQ,EAAE;QAChB,SAAS;KACV;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAA;IAEZ,OAAO,CACL,kBAAS,SAAS,EAAE,YAAY,KAAM,IAAI,YACxC,MAAC,KAAK,IAAC,KAAK,EAAE,GAAG,aACd,CAAC,KAAK,IAAI,WAAW,IAAI,OAAO,CAAC,IAAI,CACpC,kBAAQ,SAAS,EAAC,mEAAmE,aAClF,CAAC,KAAK,IAAI,WAAW,CAAC,IAAI,CACzB,eAAK,SAAS,EAAC,SAAS,aACrB,KAAK,IAAI,CACR,aAAI,SAAS,EAAC,gEAAgE,YAC3E,KAAK,GACH,CACN,EACA,WAAW,IAAI,YAAG,SAAS,EAAC,oCAAoC,YAAE,WAAW,GAAK,IAC/E,CACP,EACA,OAAO,IAAI,cAAK,SAAS,EAAC,kCAAkC,YAAE,OAAO,GAAO,IACtE,CACV,EACA,QAAQ,IACH,GACA,CACX,CAAA;AACH,CAAC"}
|