@actuate-media/cms-admin 0.10.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.js +1 -1
- package/dist/components/SharePreviewLinkDialog.js +1 -1
- 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 +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -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.js +7 -7
- 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.js +3 -3
- 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 +4 -4
- package/src/components/SharePreviewLinkDialog.tsx +1 -1
- 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 +28 -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 +9 -9
- 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
|
@@ -6,7 +6,7 @@ import { useApiData } from '../lib/useApiData.js';
|
|
|
6
6
|
function ScoreBadge({ score }) {
|
|
7
7
|
const color = score >= 80 ? 'text-green-600' : score >= 60 ? 'text-amber-500' : 'text-red-500';
|
|
8
8
|
const bg = score >= 80 ? 'bg-green-50' : score >= 60 ? 'bg-amber-50' : 'bg-red-50';
|
|
9
|
-
return (_jsx("span", { className: `inline-flex items-center justify-center
|
|
9
|
+
return (_jsx("span", { className: `inline-flex h-9 w-9 items-center justify-center rounded-full text-sm font-semibold ${color} ${bg}`, children: score }));
|
|
10
10
|
}
|
|
11
11
|
export function SEOPerformance({ onNavigate }) {
|
|
12
12
|
const { data, loading, error } = useApiData('/seo/summary');
|
|
@@ -19,6 +19,6 @@ export function SEOPerformance({ onNavigate }) {
|
|
|
19
19
|
const topContent = data.topContent ?? [];
|
|
20
20
|
const totalPages = Math.max(1, Math.ceil(topContent.length / perPage));
|
|
21
21
|
const visible = topContent.slice(page * perPage, (page + 1) * perPage);
|
|
22
|
-
return (_jsxs("div", { className: "
|
|
22
|
+
return (_jsxs("div", { className: "rounded-lg border border-gray-200 bg-white", children: [_jsxs("div", { className: "flex items-center justify-between border-b border-gray-200 p-4", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Search, { className: "h-4 w-4 text-gray-500" }), _jsx("h2", { className: "text-sm font-semibold text-gray-900", children: "SEO Performance" })] }), totalIssues > 0 && (_jsxs("span", { className: "text-xs text-gray-500", children: [totalIssues, " issue", totalIssues !== 1 ? 's' : '', " found"] }))] }), _jsxs("div", { className: "grid grid-cols-1 divide-y divide-gray-200 lg:grid-cols-12 lg:divide-x lg:divide-y-0", children: [_jsxs("div", { className: "p-4 lg:col-span-7", children: [_jsx("h3", { className: "mb-3 text-sm font-medium text-gray-700", children: "Top Performing Content" }), _jsxs("div", { className: "space-y-2", children: [visible.map((item) => (_jsxs("div", { className: "flex items-center justify-between py-2", children: [_jsxs("div", { className: "mr-3 min-w-0 flex-1", children: [_jsx("p", { className: "truncate text-sm font-medium text-gray-900", children: item.title }), _jsx("p", { className: "text-xs text-gray-500 capitalize", children: item.collection })] }), _jsx(ScoreBadge, { score: item.score })] }, item.id))), visible.length === 0 && (_jsx("p", { className: "py-4 text-center text-sm text-gray-400", children: "No published content yet" }))] }), topContent.length > perPage && (_jsxs("div", { className: "mt-3 flex items-center justify-between border-t border-gray-100 pt-3 text-xs text-gray-500", children: [_jsxs("span", { children: ["Showing ", page * perPage + 1, "-", Math.min((page + 1) * perPage, topContent.length), " of", ' ', topContent.length] }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsx("button", { onClick: () => setPage(Math.max(0, page - 1)), disabled: page === 0, className: "rounded p-1 hover:bg-gray-100 disabled:opacity-30", children: _jsx(ChevronLeft, { className: "h-3.5 w-3.5" }) }), _jsxs("span", { children: ["Page ", page + 1, " of ", totalPages] }), _jsx("button", { onClick: () => setPage(Math.min(totalPages - 1, page + 1)), disabled: page >= totalPages - 1, className: "rounded p-1 hover:bg-gray-100 disabled:opacity-30", children: _jsx(ChevronRight, { className: "h-3.5 w-3.5" }) })] })] }))] }), _jsxs("div", { className: "p-4 lg:col-span-5", children: [_jsx("h3", { className: "mb-3 text-sm font-medium text-gray-700", children: "SEO Issues" }), _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(FileWarning, { className: "h-4 w-4 text-red-400" }), _jsx("span", { className: "text-sm text-gray-700", children: "Missing meta descriptions" })] }), _jsx("span", { className: "text-sm font-semibold text-gray-900", children: issues.missingMetaDescriptions })] }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(LinkIcon, { className: "h-4 w-4 text-red-400" }), _jsx("span", { className: "text-sm text-gray-700", children: "Broken internal links" })] }), _jsx("span", { className: "text-sm font-semibold text-gray-900", children: issues.brokenInternalLinks })] }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(ImageOff, { className: "h-4 w-4 text-red-400" }), _jsx("span", { className: "text-sm text-gray-700", children: "Missing alt text" })] }), _jsx("span", { className: "text-sm font-semibold text-gray-900", children: issues.missingAltText })] })] }), totalIssues > 0 && (_jsx("button", { onClick: () => onNavigate?.('/seo'), className: "mt-4 text-sm font-medium text-blue-600 hover:text-blue-700", children: "View All Issues" }))] })] })] }));
|
|
23
23
|
}
|
|
24
24
|
//# sourceMappingURL=SEOPerformance.js.map
|
|
@@ -101,6 +101,6 @@ export function SchedulePublishDialog({ collectionSlug, documentId, scheduledAt,
|
|
|
101
101
|
}
|
|
102
102
|
if (!open)
|
|
103
103
|
return null;
|
|
104
|
-
return (_jsxs("div", { className: "fixed inset-0 z-50 flex items-center justify-center p-4", children: [_jsx("div", { className: "fixed inset-0 bg-black/40", onClick: onClose }), _jsxs("div", { className: "relative w-full max-w-md rounded-lg bg-white shadow-xl", children: [_jsxs("div", { className: "flex items-center justify-between border-b border-gray-200 px-4 py-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Calendar, { className: "h-5 w-5 text-gray-600" }), _jsx("h2", { className: "text-lg font-semibold text-gray-900", children: "Schedule publishing" })] }), _jsx("button", { onClick: onClose, className: "rounded-lg p-1.5 transition-colors hover:bg-gray-100", children: _jsx(X, { className: "h-5 w-5 text-gray-500" }) })] }), _jsxs("div", { className: "space-y-4 px-4 py-4", children: [_jsxs("div", { className: "space-y-1.5", children: [_jsx("label", { className: "text-sm font-medium text-gray-700", children: "Publish at" }), _jsxs("div", { className: "relative", children: [_jsx(Clock, { className: "pointer-events-none absolute
|
|
104
|
+
return (_jsxs("div", { className: "fixed inset-0 z-50 flex items-center justify-center p-4", children: [_jsx("div", { className: "fixed inset-0 bg-black/40", onClick: onClose }), _jsxs("div", { className: "relative w-full max-w-md rounded-lg bg-white shadow-xl", children: [_jsxs("div", { className: "flex items-center justify-between border-b border-gray-200 px-4 py-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Calendar, { className: "h-5 w-5 text-gray-600" }), _jsx("h2", { className: "text-lg font-semibold text-gray-900", children: "Schedule publishing" })] }), _jsx("button", { onClick: onClose, className: "rounded-lg p-1.5 transition-colors hover:bg-gray-100", children: _jsx(X, { className: "h-5 w-5 text-gray-500" }) })] }), _jsxs("div", { className: "space-y-4 px-4 py-4", children: [_jsxs("div", { className: "space-y-1.5", children: [_jsx("label", { className: "text-sm font-medium text-gray-700", children: "Publish at" }), _jsxs("div", { className: "relative", children: [_jsx(Clock, { className: "pointer-events-none absolute top-2.5 left-2.5 h-4 w-4 text-gray-400" }), _jsx("input", { type: "datetime-local", value: publishAt, onChange: (e) => setPublishAt(e.target.value), min: toLocalDateTimeInput(new Date(Date.now() + 60 * 1000)), className: "w-full rounded-md border border-gray-300 bg-white py-2 pr-3 pl-9 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 focus:outline-none" })] }), _jsx("p", { className: "text-xs text-gray-500", children: "The document will move from DRAFT to PUBLISHED at this time (your local timezone)." })] }), _jsxs("label", { className: "flex items-center gap-2 text-sm text-gray-700", children: [_jsx("input", { type: "checkbox", checked: includeUnpublish, onChange: (e) => setIncludeUnpublish(e.target.checked), className: "h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500" }), "Also schedule an unpublish"] }), includeUnpublish && (_jsxs("div", { className: "space-y-1.5", children: [_jsx("label", { className: "text-sm font-medium text-gray-700", children: "Unpublish at" }), _jsxs("div", { className: "relative", children: [_jsx(Clock, { className: "pointer-events-none absolute top-2.5 left-2.5 h-4 w-4 text-gray-400" }), _jsx("input", { type: "datetime-local", value: unpublishAt, onChange: (e) => setUnpublishAt(e.target.value), min: publishAt || toLocalDateTimeInput(new Date(Date.now() + 60 * 1000)), className: "w-full rounded-md border border-gray-300 bg-white py-2 pr-3 pl-9 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 focus:outline-none" })] })] }))] }), _jsxs("div", { className: "flex items-center justify-between gap-2 border-t border-gray-200 px-4 py-3", children: [hasExistingSchedule ? (_jsxs("button", { onClick: handleCancelSchedule, disabled: cancelling || saving, className: "inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-sm font-medium text-red-700 hover:bg-red-50 disabled:opacity-50", children: [cancelling ? (_jsx(Loader2, { className: "h-4 w-4 animate-spin" })) : (_jsx(X, { className: "h-4 w-4" })), "Cancel schedule"] })) : (_jsx("span", {})), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("button", { onClick: onClose, className: "rounded-md px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100", children: "Close" }), _jsxs("button", { onClick: handleSave, disabled: saving || cancelling, className: "inline-flex items-center gap-1.5 rounded-md bg-blue-600 px-3 py-1.5 text-sm font-medium text-white hover:bg-blue-700 disabled:opacity-50", children: [saving ? (_jsx(Loader2, { className: "h-4 w-4 animate-spin" })) : (_jsx(Calendar, { className: "h-4 w-4" })), hasExistingSchedule ? 'Reschedule' : 'Schedule'] })] })] })] })] }));
|
|
105
105
|
}
|
|
106
106
|
//# sourceMappingURL=SchedulePublishDialog.js.map
|
|
@@ -78,6 +78,6 @@ export function SharePreviewLinkDialog({ collectionSlug, documentId, documentSlu
|
|
|
78
78
|
return (_jsxs("button", { onClick: () => setTtl(choice.seconds), className: `rounded-md border px-3 py-2 text-left text-sm transition-colors ${selected
|
|
79
79
|
? 'border-blue-500 bg-blue-50 text-blue-900'
|
|
80
80
|
: 'border-gray-200 hover:border-gray-300 hover:bg-gray-50'}`, children: [_jsx("div", { className: "font-medium", children: choice.label }), _jsx("div", { className: "text-xs text-gray-500", children: choice.hint })] }, choice.seconds));
|
|
81
|
-
}) }), _jsx("p", { className: "text-xs text-gray-500", children: "Preview tokens can't be revoked individually \u2014 pick the shortest TTL that fits." })] }), previewUrl ? (_jsxs("div", { className: "space-y-2 rounded-lg border border-gray-200 bg-gray-50 p-3", children: [_jsx("label", { className: "text-xs font-medium
|
|
81
|
+
}) }), _jsx("p", { className: "text-xs text-gray-500", children: "Preview tokens can't be revoked individually \u2014 pick the shortest TTL that fits." })] }), previewUrl ? (_jsxs("div", { className: "space-y-2 rounded-lg border border-gray-200 bg-gray-50 p-3", children: [_jsx("label", { className: "text-xs font-medium tracking-wide text-gray-500 uppercase", children: "Preview URL" }), _jsxs("div", { className: "flex items-stretch gap-2", children: [_jsx("input", { readOnly: true, value: previewUrl, onFocus: (e) => e.currentTarget.select(), className: "flex-1 rounded-md border border-gray-300 bg-white px-2 py-1.5 font-mono text-xs" }), _jsxs("button", { onClick: copyToClipboard, className: "inline-flex items-center gap-1.5 rounded-md bg-gray-900 px-3 py-1.5 text-xs font-medium text-white hover:bg-gray-700", children: [copied ? _jsx(Check, { className: "h-3.5 w-3.5" }) : _jsx(Copy, { className: "h-3.5 w-3.5" }), copied ? 'Copied' : 'Copy'] })] }), expiresAt && (_jsxs("p", { className: "text-xs text-gray-500", children: ["Expires ", new Date(expiresAt).toLocaleString()] }))] })) : null] }), _jsxs("div", { className: "flex items-center justify-end gap-2 border-t border-gray-200 px-4 py-3", children: [_jsx("button", { onClick: onClose, className: "rounded-md px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100", children: "Close" }), _jsxs("button", { onClick: generate, disabled: generating, className: "inline-flex items-center gap-1.5 rounded-md bg-blue-600 px-3 py-1.5 text-sm font-medium text-white hover:bg-blue-700 disabled:opacity-50", children: [generating ? (_jsx(Loader2, { className: "h-4 w-4 animate-spin" })) : (_jsx(Link2, { className: "h-4 w-4" })), previewUrl ? 'Generate new link' : 'Generate link'] })] })] })] }));
|
|
82
82
|
}
|
|
83
83
|
//# sourceMappingURL=SharePreviewLinkDialog.js.map
|
|
@@ -98,12 +98,12 @@ const editorStyles = `
|
|
|
98
98
|
}
|
|
99
99
|
`;
|
|
100
100
|
function ToolbarButton({ onClick, isActive = false, disabled = false, title, children, }) {
|
|
101
|
-
return (_jsx("button", { type: "button", onClick: onClick, disabled: disabled, title: title, className: `p-1.5
|
|
101
|
+
return (_jsx("button", { type: "button", onClick: onClick, disabled: disabled, title: title, className: `rounded p-1.5 transition-colors ${isActive
|
|
102
102
|
? 'bg-blue-100 text-blue-700'
|
|
103
|
-
: 'text-gray-600 hover:bg-gray-100 hover:text-gray-900'} ${disabled ? '
|
|
103
|
+
: 'text-gray-600 hover:bg-gray-100 hover:text-gray-900'} ${disabled ? 'cursor-not-allowed opacity-40' : ''}`, children: children }));
|
|
104
104
|
}
|
|
105
105
|
function Divider() {
|
|
106
|
-
return _jsx("div", { className: "
|
|
106
|
+
return _jsx("div", { className: "mx-1 h-6 w-px bg-gray-200" });
|
|
107
107
|
}
|
|
108
108
|
function Toolbar({ editor, onOpenMediaPicker }) {
|
|
109
109
|
const addLink = () => {
|
|
@@ -121,7 +121,7 @@ function Toolbar({ editor, onOpenMediaPicker }) {
|
|
|
121
121
|
editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run();
|
|
122
122
|
};
|
|
123
123
|
const isInTable = editor.isActive('table');
|
|
124
|
-
return (_jsxs("div", { className: "
|
|
124
|
+
return (_jsxs("div", { className: "sticky top-0 z-10 flex flex-wrap items-center gap-0.5 border-b border-gray-200 bg-gray-50 p-2", children: [_jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleBold().run(), isActive: editor.isActive('bold'), title: "Bold (Ctrl+B)", children: _jsx(Bold, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleItalic().run(), isActive: editor.isActive('italic'), title: "Italic (Ctrl+I)", children: _jsx(Italic, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleUnderline().run(), isActive: editor.isActive('underline'), title: "Underline (Ctrl+U)", children: _jsx(Underline, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleStrike().run(), isActive: editor.isActive('strike'), title: "Strikethrough", children: _jsx(Strikethrough, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleCode().run(), isActive: editor.isActive('code'), title: "Inline code", children: _jsx(Code, { className: "h-4 w-4" }) }), _jsx(Divider, {}), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleHeading({ level: 1 }).run(), isActive: editor.isActive('heading', { level: 1 }), title: "Heading 1", children: _jsx(Heading1, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleHeading({ level: 2 }).run(), isActive: editor.isActive('heading', { level: 2 }), title: "Heading 2", children: _jsx(Heading2, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleHeading({ level: 3 }).run(), isActive: editor.isActive('heading', { level: 3 }), title: "Heading 3", children: _jsx(Heading3, { className: "h-4 w-4" }) }), _jsx(Divider, {}), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleBulletList().run(), isActive: editor.isActive('bulletList'), title: "Bullet list", children: _jsx(List, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleOrderedList().run(), isActive: editor.isActive('orderedList'), title: "Ordered list", children: _jsx(ListOrdered, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleBlockquote().run(), isActive: editor.isActive('blockquote'), title: "Blockquote", children: _jsx(Quote, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleCodeBlock().run(), isActive: editor.isActive('codeBlock'), title: "Code block", children: _jsx(FileCode, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().setHorizontalRule().run(), title: "Horizontal rule", children: _jsx(Minus, { className: "h-4 w-4" }) }), _jsx(Divider, {}), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().setTextAlign('left').run(), isActive: editor.isActive({ textAlign: 'left' }), title: "Align left", children: _jsx(AlignLeft, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().setTextAlign('center').run(), isActive: editor.isActive({ textAlign: 'center' }), title: "Align center", children: _jsx(AlignCenter, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().setTextAlign('right').run(), isActive: editor.isActive({ textAlign: 'right' }), title: "Align right", children: _jsx(AlignRight, { className: "h-4 w-4" }) }), _jsx(Divider, {}), _jsx(ToolbarButton, { onClick: addLink, isActive: editor.isActive('link'), title: "Insert link", children: _jsx(LinkIcon, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: onOpenMediaPicker, title: "Insert image", children: _jsx(ImageIcon, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: insertTable, title: "Insert table (3\u00D73)", children: _jsx(TableIcon, { className: "h-4 w-4" }) }), isInTable && (_jsxs(_Fragment, { children: [_jsx(Divider, {}), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().addColumnBefore().run(), title: "Add column before", children: _jsx(Columns, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().addColumnAfter().run(), title: "Add column after", children: _jsx(Columns, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().deleteColumn().run(), title: "Delete column", children: _jsx(Columns, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().addRowBefore().run(), title: "Add row before", children: _jsx(Rows, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().addRowAfter().run(), title: "Add row after", children: _jsx(Rows, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().deleteRow().run(), title: "Delete row", children: _jsx(Rows, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().deleteTable().run(), title: "Delete table", children: _jsx(Trash2, { className: "h-4 w-4" }) })] })), _jsx(Divider, {}), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().undo().run(), disabled: !editor.can().undo(), title: "Undo", children: _jsx(Undo, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().redo().run(), disabled: !editor.can().redo(), title: "Redo", children: _jsx(Redo, { className: "h-4 w-4" }) })] }));
|
|
125
125
|
}
|
|
126
126
|
export function TipTapEditor({ content, onChange, placeholder, editable = true, className, }) {
|
|
127
127
|
const [mediaPickerOpen, setMediaPickerOpen] = useState(false);
|
|
@@ -166,6 +166,6 @@ export function TipTapEditor({ content, onChange, placeholder, editable = true,
|
|
|
166
166
|
.setImage({ src: url, alt: alt ?? '' })
|
|
167
167
|
.run();
|
|
168
168
|
};
|
|
169
|
-
return (_jsxs("div", { className: `border border-gray-200
|
|
169
|
+
return (_jsxs("div", { className: `overflow-hidden rounded-lg border border-gray-200 bg-white ${className ?? ''}`, children: [editable && _jsx(Toolbar, { editor: editor, onOpenMediaPicker: () => setMediaPickerOpen(true) }), _jsx(EditorContent, { editor: editor }), _jsx("style", { dangerouslySetInnerHTML: { __html: editorStyles } }), _jsx(MediaPickerModal, { open: mediaPickerOpen, onClose: () => setMediaPickerOpen(false), onSelect: handleImageSelected, accept: "image/*" })] }));
|
|
170
170
|
}
|
|
171
171
|
//# sourceMappingURL=TipTapEditor.js.map
|
|
@@ -58,13 +58,13 @@ export function VersionHistory({ collectionSlug, documentId, open, onClose, onRe
|
|
|
58
58
|
}
|
|
59
59
|
if (!open)
|
|
60
60
|
return null;
|
|
61
|
-
return (_jsxs("div", { className: "fixed inset-0 z-50 flex justify-end", children: [_jsx("div", { className: "fixed inset-0 bg-black/30", onClick: onClose }), _jsxs("div", { className: "relative w-full max-w-md bg-white shadow-xl
|
|
61
|
+
return (_jsxs("div", { className: "fixed inset-0 z-50 flex justify-end", children: [_jsx("div", { className: "fixed inset-0 bg-black/30", onClick: onClose }), _jsxs("div", { className: "animate-in slide-in-from-right relative flex w-full max-w-md flex-col bg-white shadow-xl", children: [_jsxs("div", { className: "flex items-center justify-between border-b border-gray-200 px-4 py-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Clock, { className: "h-5 w-5 text-gray-600" }), _jsx("h2", { className: "text-lg font-semibold text-gray-900", children: "Version History" })] }), _jsx("button", { onClick: onClose, className: "rounded-lg p-1.5 transition-colors hover:bg-gray-100", children: _jsx(X, { className: "h-5 w-5 text-gray-500" }) })] }), _jsx("div", { className: "flex-1 overflow-y-auto", children: loading ? (_jsx("div", { className: "flex items-center justify-center py-16", children: _jsx(Loader2, { className: "h-6 w-6 animate-spin text-gray-400" }) })) : versions.length === 0 ? (_jsx("div", { className: "py-16 text-center text-sm text-gray-500", children: "No version history available" })) : (_jsx("div", { className: "divide-y divide-gray-100", children: versions.map((version, index) => {
|
|
62
62
|
const typeInfo = CHANGE_TYPE_LABELS[version.changeType] ?? {
|
|
63
63
|
label: version.changeType,
|
|
64
64
|
color: 'bg-gray-100 text-gray-800',
|
|
65
65
|
};
|
|
66
66
|
const isLatest = index === 0;
|
|
67
|
-
return (_jsx("div", { className: "px-4 py-3 hover:bg-gray-50
|
|
67
|
+
return (_jsx("div", { className: "px-4 py-3 transition-colors hover:bg-gray-50", children: _jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "mb-1 flex items-center gap-2", children: [_jsx("span", { className: `inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${typeInfo.color}`, children: typeInfo.label }), isLatest && (_jsx("span", { className: "text-xs font-medium text-gray-400", children: "Current" }))] }), _jsxs("div", { className: "flex items-center gap-3 text-xs text-gray-500", children: [version.changedBy && (_jsxs("span", { className: "flex items-center gap-1", children: [_jsx(User, { className: "h-3 w-3" }), version.changedBy.name ?? version.changedBy.email ?? 'Unknown'] })), _jsx("span", { title: new Date(version.createdAt).toLocaleString(), children: timeAgo(version.createdAt) })] })] }), !isLatest && (_jsxs("button", { onClick: () => handleRestore(version), disabled: restoring === version.id, className: "flex items-center gap-1.5 rounded-lg bg-blue-50 px-2.5 py-1.5 text-xs font-medium text-blue-700 transition-colors hover:bg-blue-100 disabled:opacity-50", children: [restoring === version.id ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" })) : (_jsx(RotateCcw, { className: "h-3.5 w-3.5" })), "Restore"] }))] }) }, version.id));
|
|
68
68
|
}) })) })] })] }));
|
|
69
69
|
}
|
|
70
70
|
//# sourceMappingURL=VersionHistory.js.map
|
|
@@ -1,5 +1,35 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import type { HTMLAttributes, ReactNode } from 'react';
|
|
2
|
+
import { type VariantProps } from '../../lib/cv.js';
|
|
3
|
+
declare const badge: (props?: ({
|
|
4
|
+
tone?: "primary" | "danger" | "neutral" | "success" | "warning" | "info" | undefined;
|
|
5
|
+
size?: "sm" | "md" | "lg" | undefined;
|
|
6
|
+
} & {
|
|
7
|
+
class?: string | false | null | undefined;
|
|
8
|
+
className?: string | false | null | undefined;
|
|
9
|
+
}) | undefined) => string;
|
|
10
|
+
export type BadgeVariants = VariantProps<typeof badge>;
|
|
11
|
+
/**
|
|
12
|
+
* Map document statuses to badge tones. Exposed so callers can reuse the
|
|
13
|
+
* mapping (e.g. for the same status rendered as a dot indicator).
|
|
14
|
+
*/
|
|
15
|
+
export declare const STATUS_TONE: Record<DocumentStatus, BadgeVariants['tone']>;
|
|
16
|
+
export declare const STATUS_LABEL: Record<DocumentStatus, string>;
|
|
17
|
+
export type DocumentStatus = 'published' | 'draft' | 'archived' | 'scheduled';
|
|
18
|
+
export interface BadgeProps extends HTMLAttributes<HTMLSpanElement>, BadgeVariants {
|
|
19
|
+
/**
|
|
20
|
+
* Shorthand for the canonical document status badge. When set, takes
|
|
21
|
+
* precedence over `tone` and uses the matching label.
|
|
22
|
+
*/
|
|
23
|
+
status?: DocumentStatus;
|
|
24
|
+
/** Render as outlined (border + transparent background). */
|
|
25
|
+
outline?: boolean;
|
|
26
|
+
children?: ReactNode;
|
|
3
27
|
}
|
|
4
|
-
|
|
28
|
+
/**
|
|
29
|
+
* Generic typed badge. Pass `status` for the canonical document-status
|
|
30
|
+
* variants (preserves the original Badge API), or `tone` / `outline` /
|
|
31
|
+
* `size` for everything else.
|
|
32
|
+
*/
|
|
33
|
+
export declare function Badge({ status, tone, outline, size, className, children, ...rest }: BadgeProps): import("react/jsx-runtime").JSX.Element;
|
|
34
|
+
export { badge as badgeVariants };
|
|
5
35
|
//# sourceMappingURL=Badge.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Badge.d.ts","sourceRoot":"","sources":["../../../src/components/ui/Badge.tsx"],"names":[],"mappings":"AAAA,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"Badge.d.ts","sourceRoot":"","sources":["../../../src/components/ui/Badge.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtD,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAEvD,QAAA,MAAM,KAAK;;;;;;yBAiBT,CAAA;AAEF,MAAM,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,KAAK,CAAC,CAAA;AAEtD;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,cAAc,EAAE,aAAa,CAAC,MAAM,CAAC,CAKrE,CAAA;AAED,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAKvD,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,OAAO,GAAG,UAAU,GAAG,WAAW,CAAA;AAE7E,MAAM,WAAW,UAAW,SAAQ,cAAc,CAAC,eAAe,CAAC,EAAE,aAAa;IAChF;;;OAGG;IACH,MAAM,CAAC,EAAE,cAAc,CAAA;IACvB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAID;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,UAAU,2CAc9F;AAED,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,CAAA"}
|
|
@@ -1,17 +1,51 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
import { cv } from '../../lib/cv.js';
|
|
3
|
+
const badge = cv('inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium', {
|
|
4
|
+
variants: {
|
|
5
|
+
tone: {
|
|
6
|
+
neutral: 'bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-300',
|
|
7
|
+
success: 'bg-emerald-100 text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-400',
|
|
8
|
+
warning: 'bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-400',
|
|
9
|
+
danger: 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400',
|
|
10
|
+
info: 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400',
|
|
11
|
+
primary: 'bg-[var(--primary)]/15 text-[var(--primary)] dark:bg-[var(--primary)]/25',
|
|
12
|
+
},
|
|
13
|
+
size: {
|
|
14
|
+
sm: 'px-2 py-0.5 text-[10px]',
|
|
15
|
+
md: 'px-2.5 py-0.5 text-xs',
|
|
16
|
+
lg: 'px-3 py-1 text-sm',
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
defaultVariants: { tone: 'neutral', size: 'md' },
|
|
20
|
+
});
|
|
21
|
+
/**
|
|
22
|
+
* Map document statuses to badge tones. Exposed so callers can reuse the
|
|
23
|
+
* mapping (e.g. for the same status rendered as a dot indicator).
|
|
24
|
+
*/
|
|
25
|
+
export const STATUS_TONE = {
|
|
26
|
+
published: 'success',
|
|
27
|
+
draft: 'neutral',
|
|
28
|
+
archived: 'warning',
|
|
29
|
+
scheduled: 'info',
|
|
7
30
|
};
|
|
8
|
-
const
|
|
31
|
+
export const STATUS_LABEL = {
|
|
9
32
|
published: 'Published',
|
|
10
33
|
draft: 'Draft',
|
|
11
34
|
archived: 'Archived',
|
|
12
35
|
scheduled: 'Scheduled',
|
|
13
36
|
};
|
|
14
|
-
|
|
15
|
-
|
|
37
|
+
const OUTLINE_CLASS = 'border border-current bg-transparent';
|
|
38
|
+
/**
|
|
39
|
+
* Generic typed badge. Pass `status` for the canonical document-status
|
|
40
|
+
* variants (preserves the original Badge API), or `tone` / `outline` /
|
|
41
|
+
* `size` for everything else.
|
|
42
|
+
*/
|
|
43
|
+
export function Badge({ status, tone, outline, size, className, children, ...rest }) {
|
|
44
|
+
const extras = [outline ? OUTLINE_CLASS : '', className].filter(Boolean).join(' ');
|
|
45
|
+
if (status) {
|
|
46
|
+
return (_jsx("span", { className: badge({ tone: STATUS_TONE[status], size, class: extras }), ...rest, children: children ?? STATUS_LABEL[status] }));
|
|
47
|
+
}
|
|
48
|
+
return (_jsx("span", { className: badge({ tone, size, class: extras }), ...rest, children: children }));
|
|
16
49
|
}
|
|
50
|
+
export { badge as badgeVariants };
|
|
17
51
|
//# sourceMappingURL=Badge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Badge.js","sourceRoot":"","sources":["../../../src/components/ui/Badge.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"Badge.js","sourceRoot":"","sources":["../../../src/components/ui/Badge.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAqB,MAAM,iBAAiB,CAAA;AAEvD,MAAM,KAAK,GAAG,EAAE,CAAC,yEAAyE,EAAE;IAC1F,QAAQ,EAAE;QACR,IAAI,EAAE;YACJ,OAAO,EAAE,+DAA+D;YACxE,OAAO,EAAE,8EAA8E;YACvF,OAAO,EAAE,sEAAsE;YAC/E,MAAM,EAAE,8DAA8D;YACtE,IAAI,EAAE,kEAAkE;YACxE,OAAO,EAAE,0EAA0E;SACpF;QACD,IAAI,EAAE;YACJ,EAAE,EAAE,yBAAyB;YAC7B,EAAE,EAAE,uBAAuB;YAC3B,EAAE,EAAE,mBAAmB;SACxB;KACF;IACD,eAAe,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;CACjD,CAAC,CAAA;AAIF;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAkD;IACxE,SAAS,EAAE,SAAS;IACpB,KAAK,EAAE,SAAS;IAChB,QAAQ,EAAE,SAAS;IACnB,SAAS,EAAE,MAAM;CAClB,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAmC;IAC1D,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;CACvB,CAAA;AAeD,MAAM,aAAa,GAAG,sCAAsC,CAAA;AAE5D;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAc;IAC7F,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAClF,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CACL,eAAM,SAAS,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,KAAM,IAAI,YACjF,QAAQ,IAAI,YAAY,CAAC,MAAM,CAAC,GAC5B,CACR,CAAA;IACH,CAAC;IACD,OAAO,CACL,eAAM,SAAS,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,KAAM,IAAI,YAC5D,QAAQ,GACJ,CACR,CAAA;AACH,CAAC;AAED,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,CAAA"}
|
|
@@ -1,12 +1,23 @@
|
|
|
1
1
|
import { type ButtonHTMLAttributes, type ReactNode } from 'react';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
import { type VariantProps } from '../../lib/cv.js';
|
|
3
|
+
declare const button: (props?: ({
|
|
4
|
+
variant?: "link" | "primary" | "secondary" | "danger" | "ghost" | "outline" | undefined;
|
|
5
|
+
size?: "icon" | "xs" | "sm" | "md" | "lg" | undefined;
|
|
6
|
+
} & {
|
|
7
|
+
class?: string | false | null | undefined;
|
|
8
|
+
className?: string | false | null | undefined;
|
|
9
|
+
}) | undefined) => string;
|
|
10
|
+
export type ButtonVariants = VariantProps<typeof button>;
|
|
11
|
+
export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement>, ButtonVariants {
|
|
7
12
|
loading?: boolean;
|
|
8
|
-
|
|
13
|
+
/** Stretch the button to fill its container width. */
|
|
14
|
+
full?: boolean;
|
|
15
|
+
/** Icon rendered before the children. Use with `size="icon"` for icon-only buttons. */
|
|
16
|
+
leftIcon?: ReactNode;
|
|
17
|
+
/** Icon rendered after the children. */
|
|
18
|
+
rightIcon?: ReactNode;
|
|
19
|
+
children?: ReactNode;
|
|
9
20
|
}
|
|
10
|
-
export declare
|
|
11
|
-
export {};
|
|
21
|
+
export declare const Button: import("react").ForwardRefExoticComponent<ButtonProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
22
|
+
export { button as buttonVariants };
|
|
12
23
|
//# sourceMappingURL=Button.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../src/components/ui/Button.tsx"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../src/components/ui/Button.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,oBAAoB,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAC7E,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAEvD,QAAA,MAAM,MAAM;;;;;;yBA2BX,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,YAAY,CAAC,OAAO,MAAM,CAAC,CAAA;AAExD,MAAM,WAAW,WAAY,SAAQ,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,cAAc;IAC1F,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,sDAAsD;IACtD,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,uFAAuF;IACvF,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,wCAAwC;IACxC,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAED,eAAO,MAAM,MAAM,2GAkDjB,CAAA;AAEF,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,CAAA"}
|
|
@@ -1,17 +1,38 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { cv } from '../../lib/cv.js';
|
|
5
|
+
const button = cv(
|
|
6
|
+
// Base classes apply to every variant.
|
|
7
|
+
'focus-visible:ring-offset-background inline-flex items-center justify-center gap-2 rounded-[var(--radius)] font-medium transition-colors 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', {
|
|
8
|
+
variants: {
|
|
9
|
+
variant: {
|
|
10
|
+
primary: 'bg-[var(--primary)] text-[var(--primary-foreground)] hover:opacity-90',
|
|
11
|
+
secondary: 'bg-[var(--secondary)] text-[var(--secondary-foreground)] hover:opacity-80',
|
|
12
|
+
danger: 'bg-[var(--destructive)] text-[var(--destructive-foreground)] hover:opacity-90',
|
|
13
|
+
ghost: 'bg-transparent text-[var(--foreground)] hover:bg-[var(--accent)]',
|
|
14
|
+
outline: 'border border-[var(--border)] bg-transparent text-[var(--foreground)] hover:bg-[var(--accent)]',
|
|
15
|
+
link: 'bg-transparent text-[var(--primary)] underline-offset-4 hover:underline',
|
|
16
|
+
},
|
|
17
|
+
size: {
|
|
18
|
+
xs: 'h-7 px-2 text-xs',
|
|
19
|
+
sm: 'h-8 px-2.5 text-xs',
|
|
20
|
+
md: 'h-9 px-4 text-sm',
|
|
21
|
+
lg: 'h-10 px-6 text-base',
|
|
22
|
+
icon: 'h-9 w-9 p-0',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
defaultVariants: {
|
|
26
|
+
variant: 'primary',
|
|
27
|
+
size: 'md',
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
export const Button = forwardRef(function Button({ variant, size, full, loading = false, disabled, leftIcon, rightIcon, children, className, ...rest }, ref) {
|
|
31
|
+
return (_jsxs("button", { ref: ref, disabled: disabled || loading, "aria-busy": loading || undefined, className: button({
|
|
32
|
+
variant,
|
|
33
|
+
size,
|
|
34
|
+
class: [full ? 'w-full' : '', className].filter(Boolean).join(' '),
|
|
35
|
+
}), ...rest, children: [loading ? (_jsxs("svg", { className: "h-4 w-4 animate-spin", viewBox: "0 0 24 24", fill: "none", "aria-hidden": true, children: [_jsx("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), _jsx("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8v4a4 4 0 00-4 4H4z" })] })) : (leftIcon), children, !loading && rightIcon] }));
|
|
36
|
+
});
|
|
37
|
+
export { button as buttonVariants };
|
|
17
38
|
//# sourceMappingURL=Button.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.js","sourceRoot":"","sources":["../../../src/components/ui/Button.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;
|
|
1
|
+
{"version":3,"file":"Button.js","sourceRoot":"","sources":["../../../src/components/ui/Button.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,UAAU,EAA6C,MAAM,OAAO,CAAA;AAC7E,OAAO,EAAE,EAAE,EAAqB,MAAM,iBAAiB,CAAA;AAEvD,MAAM,MAAM,GAAG,EAAE;AACf,uCAAuC;AACvC,wSAAwS,EACxS;IACE,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,OAAO,EAAE,uEAAuE;YAChF,SAAS,EAAE,2EAA2E;YACtF,MAAM,EAAE,+EAA+E;YACvF,KAAK,EAAE,kEAAkE;YACzE,OAAO,EACL,gGAAgG;YAClG,IAAI,EAAE,yEAAyE;SAChF;QACD,IAAI,EAAE;YACJ,EAAE,EAAE,kBAAkB;YACtB,EAAE,EAAE,oBAAoB;YACxB,EAAE,EAAE,kBAAkB;YACtB,EAAE,EAAE,qBAAqB;YACzB,IAAI,EAAE,aAAa;SACpB;KACF;IACD,eAAe,EAAE;QACf,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,IAAI;KACX;CACF,CACF,CAAA;AAeD,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAiC,SAAS,MAAM,CAC9E,EACE,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,OAAO,GAAG,KAAK,EACf,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACR,EACD,GAAG;IAEH,OAAO,CACL,kBACE,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,QAAQ,IAAI,OAAO,eAClB,OAAO,IAAI,SAAS,EAC/B,SAAS,EAAE,MAAM,CAAC;YAChB,OAAO;YACP,IAAI;YACJ,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;SACnE,CAAC,KACE,IAAI,aAEP,OAAO,CAAC,CAAC,CAAC,CACT,eAAK,SAAS,EAAC,sBAAsB,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,kCACnE,iBACE,SAAS,EAAC,YAAY,EACtB,EAAE,EAAC,IAAI,EACP,EAAE,EAAC,IAAI,EACP,CAAC,EAAC,IAAI,EACN,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,GAAG,GACf,EACF,eACE,SAAS,EAAC,YAAY,EACtB,IAAI,EAAC,cAAc,EACnB,CAAC,EAAC,qCAAqC,GACvC,IACE,CACP,CAAC,CAAC,CAAC,CACF,QAAQ,CACT,EACA,QAAQ,EACR,CAAC,OAAO,IAAI,SAAS,IACf,CACV,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,CAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type HTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
import { type VariantProps } from '../../lib/cv.js';
|
|
3
|
+
declare const card: (props?: ({
|
|
4
|
+
padding?: "none" | "sm" | "md" | "lg" | undefined;
|
|
5
|
+
elevation?: "flat" | "sm" | "md" | "lg" | undefined;
|
|
6
|
+
} & {
|
|
7
|
+
class?: string | false | null | undefined;
|
|
8
|
+
className?: string | false | null | undefined;
|
|
9
|
+
}) | undefined) => string;
|
|
10
|
+
export type CardVariants = VariantProps<typeof card>;
|
|
11
|
+
export interface CardProps extends HTMLAttributes<HTMLDivElement>, CardVariants {
|
|
12
|
+
/** Apply hover/focus elevation transitions (e.g. for clickable cards). */
|
|
13
|
+
interactive?: boolean;
|
|
14
|
+
children?: ReactNode;
|
|
15
|
+
}
|
|
16
|
+
export declare const Card: import("react").ForwardRefExoticComponent<CardProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
17
|
+
/**
|
|
18
|
+
* Header slot — sits at the top of a card. Pair with CardTitle / CardDescription.
|
|
19
|
+
*/
|
|
20
|
+
export declare function CardHeader({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
export declare function CardTitle({ className, children, ...rest }: HTMLAttributes<HTMLHeadingElement>): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
export declare function CardDescription({ className, children, ...rest }: HTMLAttributes<HTMLParagraphElement>): import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
export declare function CardContent({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
export declare function CardFooter({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
export { card as cardVariants };
|
|
26
|
+
//# sourceMappingURL=Card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Card.d.ts","sourceRoot":"","sources":["../../../src/components/ui/Card.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AACvE,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAEvD,QAAA,MAAM,IAAI;;;;;;yBAmBT,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,IAAI,CAAC,CAAA;AAIpD,MAAM,WAAW,SAAU,SAAQ,cAAc,CAAC,cAAc,CAAC,EAAE,YAAY;IAC7E,0EAA0E;IAC1E,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAED,eAAO,MAAM,IAAI,sGAUf,CAAA;AAEF;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,SAAc,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,CAAC,cAAc,CAAC,2CAM/F;AAED,wBAAgB,SAAS,CAAC,EACxB,SAAc,EACd,QAAQ,EACR,GAAG,IAAI,EACR,EAAE,cAAc,CAAC,kBAAkB,CAAC,2CASpC;AAED,wBAAgB,eAAe,CAAC,EAC9B,SAAc,EACd,QAAQ,EACR,GAAG,IAAI,EACR,EAAE,cAAc,CAAC,oBAAoB,CAAC,2CAMtC;AAED,wBAAgB,WAAW,CAAC,EAAE,SAAc,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,CAAC,cAAc,CAAC,2CAMhG;AAED,wBAAgB,UAAU,CAAC,EAAE,SAAc,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,CAAC,cAAc,CAAC,2CAM/F;AAED,OAAO,EAAE,IAAI,IAAI,YAAY,EAAE,CAAA"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from 'react';
|
|
3
|
+
import { cv } from '../../lib/cv.js';
|
|
4
|
+
const card = cv('rounded-[var(--radius)] border border-[var(--border)] bg-[var(--card)] text-[var(--card-foreground)]', {
|
|
5
|
+
variants: {
|
|
6
|
+
padding: {
|
|
7
|
+
none: 'p-0',
|
|
8
|
+
sm: 'p-4',
|
|
9
|
+
md: 'p-6',
|
|
10
|
+
lg: 'p-8',
|
|
11
|
+
},
|
|
12
|
+
elevation: {
|
|
13
|
+
flat: 'shadow-none',
|
|
14
|
+
sm: 'shadow-sm',
|
|
15
|
+
md: 'shadow-md',
|
|
16
|
+
lg: 'shadow-lg',
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
defaultVariants: { padding: 'md', elevation: 'sm' },
|
|
20
|
+
});
|
|
21
|
+
const INTERACTIVE_CLASS = 'transition-shadow hover:shadow-md focus-within:shadow-md';
|
|
22
|
+
export const Card = forwardRef(function Card({ padding, elevation, interactive, className, children, ...rest }, ref) {
|
|
23
|
+
const extras = [interactive ? INTERACTIVE_CLASS : '', className].filter(Boolean).join(' ');
|
|
24
|
+
return (_jsx("div", { ref: ref, className: card({ padding, elevation, class: extras }), ...rest, children: children }));
|
|
25
|
+
});
|
|
26
|
+
/**
|
|
27
|
+
* Header slot — sits at the top of a card. Pair with CardTitle / CardDescription.
|
|
28
|
+
*/
|
|
29
|
+
export function CardHeader({ className = '', children, ...rest }) {
|
|
30
|
+
return (_jsx("div", { className: `flex flex-col space-y-1.5 ${className}`, ...rest, children: children }));
|
|
31
|
+
}
|
|
32
|
+
export function CardTitle({ className = '', children, ...rest }) {
|
|
33
|
+
return (_jsx("h3", { className: `text-lg leading-tight font-semibold tracking-tight text-[var(--card-foreground)] ${className}`, ...rest, children: children }));
|
|
34
|
+
}
|
|
35
|
+
export function CardDescription({ className = '', children, ...rest }) {
|
|
36
|
+
return (_jsx("p", { className: `text-sm text-[var(--muted-foreground)] ${className}`, ...rest, children: children }));
|
|
37
|
+
}
|
|
38
|
+
export function CardContent({ className = '', children, ...rest }) {
|
|
39
|
+
return (_jsx("div", { className: className, ...rest, children: children }));
|
|
40
|
+
}
|
|
41
|
+
export function CardFooter({ className = '', children, ...rest }) {
|
|
42
|
+
return (_jsx("div", { className: `flex items-center justify-end gap-2 pt-4 ${className}`, ...rest, children: children }));
|
|
43
|
+
}
|
|
44
|
+
export { card as cardVariants };
|
|
45
|
+
//# sourceMappingURL=Card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Card.js","sourceRoot":"","sources":["../../../src/components/ui/Card.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAuC,MAAM,OAAO,CAAA;AACvE,OAAO,EAAE,EAAE,EAAqB,MAAM,iBAAiB,CAAA;AAEvD,MAAM,IAAI,GAAG,EAAE,CACb,sGAAsG,EACtG;IACE,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,IAAI,EAAE,KAAK;YACX,EAAE,EAAE,KAAK;YACT,EAAE,EAAE,KAAK;YACT,EAAE,EAAE,KAAK;SACV;QACD,SAAS,EAAE;YACT,IAAI,EAAE,aAAa;YACnB,EAAE,EAAE,WAAW;YACf,EAAE,EAAE,WAAW;YACf,EAAE,EAAE,WAAW;SAChB;KACF;IACD,eAAe,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;CACpD,CACF,CAAA;AAID,MAAM,iBAAiB,GAAG,0DAA0D,CAAA;AAQpF,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAA4B,SAAS,IAAI,CACrE,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EACjE,GAAG;IAEH,MAAM,MAAM,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC1F,OAAO,CACL,cAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,KAAM,IAAI,YAC5E,QAAQ,GACL,CACP,CAAA;AACH,CAAC,CAAC,CAAA;AAEF;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,SAAS,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAkC;IAC9F,OAAO,CACL,cAAK,SAAS,EAAE,6BAA6B,SAAS,EAAE,KAAM,IAAI,YAC/D,QAAQ,GACL,CACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EACxB,SAAS,GAAG,EAAE,EACd,QAAQ,EACR,GAAG,IAAI,EAC4B;IACnC,OAAO,CACL,aACE,SAAS,EAAE,oFAAoF,SAAS,EAAE,KACtG,IAAI,YAEP,QAAQ,GACN,CACN,CAAA;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAC9B,SAAS,GAAG,EAAE,EACd,QAAQ,EACR,GAAG,IAAI,EAC8B;IACrC,OAAO,CACL,YAAG,SAAS,EAAE,0CAA0C,SAAS,EAAE,KAAM,IAAI,YAC1E,QAAQ,GACP,CACL,CAAA;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAE,SAAS,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAkC;IAC/F,OAAO,CACL,cAAK,SAAS,EAAE,SAAS,KAAM,IAAI,YAChC,QAAQ,GACL,CACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,SAAS,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAkC;IAC9F,OAAO,CACL,cAAK,SAAS,EAAE,4CAA4C,SAAS,EAAE,KAAM,IAAI,YAC9E,QAAQ,GACL,CACP,CAAA;AACH,CAAC;AAED,OAAO,EAAE,IAAI,IAAI,YAAY,EAAE,CAAA"}
|
|
@@ -27,7 +27,7 @@ function RowActionsMenu({ actions, row }) {
|
|
|
27
27
|
}, [open]);
|
|
28
28
|
return (_jsxs("div", { className: "relative flex items-center justify-end gap-1", ref: ref, children: [actions
|
|
29
29
|
.filter((a) => a.icon)
|
|
30
|
-
.map((action) => (_jsx("button", { onClick: () => action.onClick(row), className: "rounded p-1 text-[var(--muted-foreground)] hover:bg-[var(--muted)] hover:text-[var(--foreground)]", "aria-label": action.label, title: action.label, children: action.icon }, action.key))), _jsx("button", { onClick: () => setOpen((o) => !o), className: "rounded p-1 hover:bg-[var(--muted)]", "aria-label": "More actions", children: _jsx(MoreVerticalIcon, {}) }), open && (_jsx("div", { className: "absolute right-0
|
|
30
|
+
.map((action) => (_jsx("button", { onClick: () => action.onClick(row), className: "rounded p-1 text-[var(--muted-foreground)] hover:bg-[var(--muted)] hover:text-[var(--foreground)]", "aria-label": action.label, title: action.label, children: action.icon }, action.key))), _jsx("button", { onClick: () => setOpen((o) => !o), className: "rounded p-1 hover:bg-[var(--muted)]", "aria-label": "More actions", children: _jsx(MoreVerticalIcon, {}) }), open && (_jsx("div", { className: "absolute top-full right-0 z-50 mt-1 w-40 rounded-md border border-[var(--border)] bg-[var(--popover)] py-1 shadow-lg", children: actions.map((action) => (_jsxs("button", { className: `flex w-full items-center gap-2 px-3 py-1.5 text-sm hover:bg-[var(--accent)] ${action.destructive ? 'text-[var(--destructive)]' : ''}`, onClick: () => {
|
|
31
31
|
action.onClick(row);
|
|
32
32
|
setOpen(false);
|
|
33
33
|
}, children: [action.icon && _jsx("span", { className: "h-4 w-4", children: action.icon }), action.label] }, action.key))) }))] }));
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type InputHTMLAttributes } from 'react';
|
|
2
|
+
import { type VariantProps } from '../../lib/cv.js';
|
|
3
|
+
declare const input: (props?: ({
|
|
4
|
+
size?: "sm" | "md" | "lg" | undefined;
|
|
5
|
+
state?: "default" | "invalid" | "valid" | undefined;
|
|
6
|
+
} & {
|
|
7
|
+
class?: string | false | null | undefined;
|
|
8
|
+
className?: string | false | null | undefined;
|
|
9
|
+
}) | undefined) => string;
|
|
10
|
+
export type InputVariants = VariantProps<typeof input>;
|
|
11
|
+
export interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'>, InputVariants {
|
|
12
|
+
}
|
|
13
|
+
export declare const Input: import("react").ForwardRefExoticComponent<InputProps & import("react").RefAttributes<HTMLInputElement>>;
|
|
14
|
+
export { input as inputVariants };
|
|
15
|
+
//# sourceMappingURL=Input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../src/components/ui/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,mBAAmB,EAAE,MAAM,OAAO,CAAA;AAC5D,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAEvD,QAAA,MAAM,KAAK;;;;;;yBAiBV,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,KAAK,CAAC,CAAA;AAEtD,MAAM,WAAW,UACf,SAAQ,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,EAAE,aAAa;CAAG;AAE/E,eAAO,MAAM,KAAK,yGAKhB,CAAA;AAEF,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from 'react';
|
|
3
|
+
import { cv } from '../../lib/cv.js';
|
|
4
|
+
const input = cv('focus-visible:ring-offset-background flex w-full rounded-[var(--radius)] border bg-[var(--background)] text-[var(--foreground)] file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-[var(--muted-foreground)] focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50', {
|
|
5
|
+
variants: {
|
|
6
|
+
size: {
|
|
7
|
+
sm: 'h-8 px-2.5 text-xs',
|
|
8
|
+
md: 'h-9 px-3 text-sm',
|
|
9
|
+
lg: 'h-10 px-4 text-base',
|
|
10
|
+
},
|
|
11
|
+
state: {
|
|
12
|
+
default: 'border-[var(--border)]',
|
|
13
|
+
invalid: 'border-[var(--destructive)] focus-visible:ring-[var(--destructive)]',
|
|
14
|
+
valid: 'border-emerald-500 focus-visible:ring-emerald-500',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
defaultVariants: { size: 'md', state: 'default' },
|
|
18
|
+
});
|
|
19
|
+
export const Input = forwardRef(function Input({ size, state, className, ...rest }, ref) {
|
|
20
|
+
return _jsx("input", { ref: ref, className: input({ size, state, class: className }), ...rest });
|
|
21
|
+
});
|
|
22
|
+
export { input as inputVariants };
|
|
23
|
+
//# sourceMappingURL=Input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Input.js","sourceRoot":"","sources":["../../../src/components/ui/Input.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAA4B,MAAM,OAAO,CAAA;AAC5D,OAAO,EAAE,EAAE,EAAqB,MAAM,iBAAiB,CAAA;AAEvD,MAAM,KAAK,GAAG,EAAE,CACd,yYAAyY,EACzY;IACE,QAAQ,EAAE;QACR,IAAI,EAAE;YACJ,EAAE,EAAE,oBAAoB;YACxB,EAAE,EAAE,kBAAkB;YACtB,EAAE,EAAE,qBAAqB;SAC1B;QACD,KAAK,EAAE;YACL,OAAO,EAAE,wBAAwB;YACjC,OAAO,EAAE,qEAAqE;YAC9E,KAAK,EAAE,mDAAmD;SAC3D;KACF;IACD,eAAe,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;CAClD,CACF,CAAA;AAOD,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAA+B,SAAS,KAAK,CAC1E,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EACnC,GAAG;IAEH,OAAO,gBAAO,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,KAAM,IAAI,GAAI,CAAA;AAC3F,CAAC,CAAC,CAAA;AAEF,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
export function SearchInput({ value, onChange, placeholder = 'Search...' }) {
|
|
4
|
-
return (_jsxs("div", { className: "relative flex-1", children: [_jsx("svg", { className: "absolute
|
|
4
|
+
return (_jsxs("div", { className: "relative flex-1", children: [_jsx("svg", { className: "absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 text-[var(--muted-foreground)]", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" }) }), _jsx("input", { type: "text", value: value, onChange: (e) => onChange(e.target.value), placeholder: placeholder, className: "w-full rounded-md border border-[var(--border)] bg-[var(--input-background)] py-2 pr-8 pl-9 text-sm outline-none focus:ring-2 focus:ring-[var(--ring)]" }), value && (_jsx("button", { onClick: () => onChange(''), className: "absolute top-1/2 right-2 -translate-y-1/2 rounded p-0.5 text-[var(--muted-foreground)] hover:text-[var(--foreground)]", "aria-label": "Clear search", children: _jsx("svg", { className: "h-3.5 w-3.5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" }) }) })), _jsx("kbd", { className: "pointer-events-none absolute top-1/2 right-8 hidden -translate-y-1/2 rounded border border-[var(--border)] px-1.5 py-0.5 text-[10px] text-[var(--muted-foreground)] sm:inline-block", children: "\u2318K" })] }));
|
|
5
5
|
}
|
|
6
6
|
//# sourceMappingURL=SearchInput.js.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type SelectHTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
import { type VariantProps } from '../../lib/cv.js';
|
|
3
|
+
declare const select: (props?: ({
|
|
4
|
+
size?: "sm" | "md" | "lg" | undefined;
|
|
5
|
+
state?: "default" | "invalid" | "valid" | undefined;
|
|
6
|
+
} & {
|
|
7
|
+
class?: string | false | null | undefined;
|
|
8
|
+
className?: string | false | null | undefined;
|
|
9
|
+
}) | undefined) => string;
|
|
10
|
+
export type SelectVariants = VariantProps<typeof select>;
|
|
11
|
+
export interface SelectProps extends Omit<SelectHTMLAttributes<HTMLSelectElement>, 'size'>, SelectVariants {
|
|
12
|
+
children?: ReactNode;
|
|
13
|
+
}
|
|
14
|
+
export declare const Select: import("react").ForwardRefExoticComponent<SelectProps & import("react").RefAttributes<HTMLSelectElement>>;
|
|
15
|
+
export { select as selectVariants };
|
|
16
|
+
//# sourceMappingURL=Select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Select.d.ts","sourceRoot":"","sources":["../../../src/components/ui/Select.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,oBAAoB,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAC7E,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAEvD,QAAA,MAAM,MAAM;;;;;;yBAkBX,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,YAAY,CAAC,OAAO,MAAM,CAAC,CAAA;AAExD,MAAM,WAAW,WACf,SAAQ,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,EAAE,cAAc;IAC7E,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAED,eAAO,MAAM,MAAM,2GAuBjB,CAAA;AAEF,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,CAAA"}
|