@actuate-media/cms-admin 0.10.0 → 0.12.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/LICENSE +21 -21
- package/dist/AdminRoot.d.ts.map +1 -1
- package/dist/AdminRoot.js +8 -5
- package/dist/AdminRoot.js.map +1 -1
- package/dist/__tests__/fields/component-block-helpers.test.d.ts +7 -0
- package/dist/__tests__/fields/component-block-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/fields/component-block-helpers.test.js +592 -0
- package/dist/__tests__/fields/component-block-helpers.test.js.map +1 -0
- 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/ComponentBlockField.d.ts +25 -0
- package/dist/fields/ComponentBlockField.d.ts.map +1 -0
- package/dist/fields/ComponentBlockField.js +74 -0
- package/dist/fields/ComponentBlockField.js.map +1 -0
- package/dist/fields/DateField.js +1 -1
- package/dist/fields/FieldRenderer.d.ts +3 -0
- package/dist/fields/FieldRenderer.d.ts.map +1 -1
- package/dist/fields/FieldRenderer.js +3 -1
- package/dist/fields/FieldRenderer.js.map +1 -1
- package/dist/fields/PropInput.d.ts +14 -0
- package/dist/fields/PropInput.d.ts.map +1 -0
- package/dist/fields/PropInput.js +163 -0
- package/dist/fields/PropInput.js.map +1 -0
- package/dist/fields/RelationshipField.js +3 -3
- package/dist/fields/TextField.js +1 -1
- package/dist/fields/component-block-helpers.d.ts +96 -0
- package/dist/fields/component-block-helpers.d.ts.map +1 -0
- package/dist/fields/component-block-helpers.js +323 -0
- package/dist/fields/component-block-helpers.js.map +1 -0
- package/dist/fields/index.d.ts +4 -0
- package/dist/fields/index.d.ts.map +1 -1
- package/dist/fields/index.js +2 -0
- package/dist/fields/index.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -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 +14 -3
- package/src/AdminRoot.tsx +21 -11
- package/src/__tests__/fields/component-block-helpers.test.ts +674 -0
- 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/ComponentBlockField.tsx +179 -0
- package/src/fields/DateField.tsx +1 -1
- package/src/fields/FieldRenderer.tsx +8 -0
- package/src/fields/PropInput.tsx +552 -0
- package/src/fields/RelationshipField.tsx +10 -10
- package/src/fields/TextField.tsx +1 -1
- package/src/fields/component-block-helpers.ts +341 -0
- package/src/fields/index.ts +4 -0
- package/src/index.ts +35 -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
|
@@ -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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from 'react';
|
|
3
|
+
import { cv } from '../../lib/cv.js';
|
|
4
|
+
const select = cv(
|
|
5
|
+
// Shares geometry with Input so they line up in forms.
|
|
6
|
+
'focus-visible:ring-offset-background flex w-full appearance-none rounded-[var(--radius)] border bg-[var(--background)] pr-8 text-[var(--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', {
|
|
7
|
+
variants: {
|
|
8
|
+
size: {
|
|
9
|
+
sm: 'h-8 pr-7 pl-2.5 text-xs',
|
|
10
|
+
md: 'h-9 pr-8 pl-3 text-sm',
|
|
11
|
+
lg: 'h-10 pr-9 pl-4 text-base',
|
|
12
|
+
},
|
|
13
|
+
state: {
|
|
14
|
+
default: 'border-[var(--border)]',
|
|
15
|
+
invalid: 'border-[var(--destructive)] focus-visible:ring-[var(--destructive)]',
|
|
16
|
+
valid: 'border-emerald-500 focus-visible:ring-emerald-500',
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
defaultVariants: { size: 'md', state: 'default' },
|
|
20
|
+
});
|
|
21
|
+
export const Select = forwardRef(function Select({ size, state, className, children, ...rest }, ref) {
|
|
22
|
+
return (_jsxs("div", { className: "relative", children: [_jsx("select", { ref: ref, className: select({ size, state, class: className }), ...rest, children: children }), _jsx("svg", { "aria-hidden": true, className: "pointer-events-none absolute top-1/2 right-2 h-4 w-4 -translate-y-1/2 text-[var(--muted-foreground)]", viewBox: "0 0 20 20", fill: "currentColor", children: _jsx("path", { fillRule: "evenodd", d: "M5.23 7.21a.75.75 0 011.06.02L10 11.06l3.71-3.83a.75.75 0 111.08 1.04l-4.25 4.39a.75.75 0 01-1.08 0L5.21 8.27a.75.75 0 01.02-1.06z", clipRule: "evenodd" }) })] }));
|
|
23
|
+
});
|
|
24
|
+
export { select as selectVariants };
|
|
25
|
+
//# sourceMappingURL=Select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Select.js","sourceRoot":"","sources":["../../../src/components/ui/Select.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAA6C,MAAM,OAAO,CAAA;AAC7E,OAAO,EAAE,EAAE,EAAqB,MAAM,iBAAiB,CAAA;AAEvD,MAAM,MAAM,GAAG,EAAE;AACf,uDAAuD;AACvD,mTAAmT,EACnT;IACE,QAAQ,EAAE;QACR,IAAI,EAAE;YACJ,EAAE,EAAE,yBAAyB;YAC7B,EAAE,EAAE,uBAAuB;YAC3B,EAAE,EAAE,0BAA0B;SAC/B;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;AASD,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAiC,SAAS,MAAM,CAC9E,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAC7C,GAAG;IAEH,OAAO,CACL,eAAK,SAAS,EAAC,UAAU,aACvB,iBAAQ,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,KAAM,IAAI,YAC7E,QAAQ,GACF,EACT,mCAEE,SAAS,EAAC,sGAAsG,EAChH,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,cAAc,YAEnB,eACE,QAAQ,EAAC,SAAS,EAClB,CAAC,EAAC,oIAAoI,EACtI,QAAQ,EAAC,SAAS,GAClB,GACE,IACF,CACP,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,CAAA"}
|
|
@@ -24,6 +24,6 @@ export function useToast() {
|
|
|
24
24
|
export function ToastContainer({ toasts, onDismiss }) {
|
|
25
25
|
if (toasts.length === 0)
|
|
26
26
|
return null;
|
|
27
|
-
return (_jsx("div", { className: "fixed
|
|
27
|
+
return (_jsx("div", { className: "fixed right-4 bottom-4 z-[100] flex flex-col gap-2", children: toasts.map((toast) => (_jsxs("div", { className: `flex items-center gap-3 rounded-md border-l-4 px-4 py-3 shadow-lg ${typeClasses[toast.type]}`, children: [_jsx("p", { className: "flex-1 text-sm", children: toast.message }), _jsx("button", { onClick: () => onDismiss(toast.id), className: "shrink-0 opacity-60 hover:opacity-100", children: _jsx("svg", { className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" }) }) })] }, toast.id))) }));
|
|
28
28
|
}
|
|
29
29
|
//# sourceMappingURL=Toast.js.map
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
export { Button } from './Button.js';
|
|
2
|
-
export type { ButtonProps } from './Button.js';
|
|
3
|
-
export { Badge } from './Badge.js';
|
|
4
|
-
export type { BadgeProps } from './Badge.js';
|
|
1
|
+
export { Button, buttonVariants } from './Button.js';
|
|
2
|
+
export type { ButtonProps, ButtonVariants } from './Button.js';
|
|
3
|
+
export { Badge, badgeVariants, STATUS_TONE, STATUS_LABEL } from './Badge.js';
|
|
4
|
+
export type { BadgeProps, BadgeVariants, DocumentStatus } from './Badge.js';
|
|
5
|
+
export { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter, cardVariants, } from './Card.js';
|
|
6
|
+
export type { CardProps, CardVariants } from './Card.js';
|
|
7
|
+
export { Input, inputVariants } from './Input.js';
|
|
8
|
+
export type { InputProps, InputVariants } from './Input.js';
|
|
9
|
+
export { Select, selectVariants } from './Select.js';
|
|
10
|
+
export type { SelectProps, SelectVariants } from './Select.js';
|
|
5
11
|
export { Avatar } from './Avatar.js';
|
|
6
12
|
export type { AvatarProps } from './Avatar.js';
|
|
7
13
|
export { EmptyState } from './EmptyState.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACpD,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC5E,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3E,OAAO,EACL,IAAI,EACJ,UAAU,EACV,SAAS,EACT,eAAe,EACf,WAAW,EACX,UAAU,EACV,YAAY,GACb,MAAM,WAAW,CAAA;AAClB,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxD,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AACjD,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC3D,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACpD,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
export { Button } from './Button.js';
|
|
2
|
-
export { Badge } from './Badge.js';
|
|
1
|
+
export { Button, buttonVariants } from './Button.js';
|
|
2
|
+
export { Badge, badgeVariants, STATUS_TONE, STATUS_LABEL } from './Badge.js';
|
|
3
|
+
export { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter, cardVariants, } from './Card.js';
|
|
4
|
+
export { Input, inputVariants } from './Input.js';
|
|
5
|
+
export { Select, selectVariants } from './Select.js';
|
|
3
6
|
export { Avatar } from './Avatar.js';
|
|
4
7
|
export { EmptyState } from './EmptyState.js';
|
|
5
8
|
export { Skeleton } from './Skeleton.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE5E,OAAO,EACL,IAAI,EACJ,UAAU,EACV,SAAS,EACT,eAAe,EACf,WAAW,EACX,UAAU,EACV,YAAY,GACb,MAAM,WAAW,CAAA;AAElB,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAEjD,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAErD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA"}
|
|
@@ -16,15 +16,15 @@ const BLOCK_ICONS = {
|
|
|
16
16
|
};
|
|
17
17
|
function BlockField({ field, value, onChange }) {
|
|
18
18
|
if (field.type === 'select' && field.options) {
|
|
19
|
-
return (_jsxs("div", { children: [_jsxs("label", { className: "mb-1 block text-sm font-medium", children: [field.label, field.required && _jsx("span", { className: "ml-0.5 text-[var(--destructive)]", children: "*" })] }), _jsxs("select", { value: value ?? '', onChange: (e) => onChange(e.target.value), className: "w-full rounded-md border border-[var(--border)] bg-[var(--input-background)] px-3 py-2 text-sm outline-none
|
|
19
|
+
return (_jsxs("div", { children: [_jsxs("label", { className: "mb-1 block text-sm font-medium", children: [field.label, field.required && _jsx("span", { className: "ml-0.5 text-[var(--destructive)]", children: "*" })] }), _jsxs("select", { value: value ?? '', onChange: (e) => onChange(e.target.value), className: "w-full rounded-md border border-[var(--border)] bg-[var(--input-background)] px-3 py-2 text-sm transition-colors outline-none focus:ring-2 focus:ring-[var(--ring)]", children: [_jsx("option", { value: "", children: "Select..." }), field.options.map((opt) => (_jsx("option", { value: opt.value, children: opt.label }, opt.value)))] })] }));
|
|
20
20
|
}
|
|
21
21
|
if (field.type === 'richText') {
|
|
22
|
-
return (_jsxs("div", { children: [_jsxs("label", { className: "mb-1 block text-sm font-medium", children: [field.label, field.required && _jsx("span", { className: "ml-0.5 text-[var(--destructive)]", children: "*" })] }), _jsx("textarea", { value: value ?? '', onChange: (e) => onChange(e.target.value), rows: 4, className: "w-full rounded-md border border-[var(--border)] bg-[var(--input-background)] px-3 py-2 text-sm outline-none
|
|
22
|
+
return (_jsxs("div", { children: [_jsxs("label", { className: "mb-1 block text-sm font-medium", children: [field.label, field.required && _jsx("span", { className: "ml-0.5 text-[var(--destructive)]", children: "*" })] }), _jsx("textarea", { value: value ?? '', onChange: (e) => onChange(e.target.value), rows: 4, className: "w-full rounded-md border border-[var(--border)] bg-[var(--input-background)] px-3 py-2 text-sm transition-colors outline-none focus:ring-2 focus:ring-[var(--ring)]" })] }));
|
|
23
23
|
}
|
|
24
24
|
if (field.type === 'media') {
|
|
25
25
|
return (_jsxs("div", { children: [_jsxs("label", { className: "mb-1 block text-sm font-medium", children: [field.label, field.required && _jsx("span", { className: "ml-0.5 text-[var(--destructive)]", children: "*" })] }), _jsxs("div", { className: "flex items-center gap-3 rounded-md border border-dashed border-[var(--border)] p-3", children: [_jsx("div", { className: "flex h-12 w-12 shrink-0 items-center justify-center rounded-md bg-[var(--muted)]", children: _jsx(Image, { className: "h-5 w-5 text-[var(--muted-foreground)]" }) }), _jsx("span", { className: "text-sm text-[var(--muted-foreground)]", children: value ? 'Media selected' : 'No media selected' })] })] }));
|
|
26
26
|
}
|
|
27
|
-
return (_jsxs("div", { children: [_jsxs("label", { className: "mb-1 block text-sm font-medium", children: [field.label, field.required && _jsx("span", { className: "ml-0.5 text-[var(--destructive)]", children: "*" })] }), _jsx("input", { type: "text", value: value ?? '', onChange: (e) => onChange(e.target.value), required: field.required, className: "w-full rounded-md border border-[var(--border)] bg-[var(--input-background)] px-3 py-2 text-sm outline-none
|
|
27
|
+
return (_jsxs("div", { children: [_jsxs("label", { className: "mb-1 block text-sm font-medium", children: [field.label, field.required && _jsx("span", { className: "ml-0.5 text-[var(--destructive)]", children: "*" })] }), _jsx("input", { type: "text", value: value ?? '', onChange: (e) => onChange(e.target.value), required: field.required, className: "w-full rounded-md border border-[var(--border)] bg-[var(--input-background)] px-3 py-2 text-sm transition-colors outline-none focus:ring-2 focus:ring-[var(--ring)]" })] }));
|
|
28
28
|
}
|
|
29
29
|
function SortableBlock({ block, blockDef, expanded, onToggle, onRemove, onFieldChange, }) {
|
|
30
30
|
const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Manifest } from '@actuate-media/component-blocks';
|
|
2
|
+
export interface ComponentBlockValue {
|
|
3
|
+
component: string;
|
|
4
|
+
props: Record<string, unknown>;
|
|
5
|
+
}
|
|
6
|
+
export interface ComponentBlockFieldProps {
|
|
7
|
+
label?: string;
|
|
8
|
+
manifest: Manifest;
|
|
9
|
+
/** Optional whitelist of component names. */
|
|
10
|
+
allow?: string[];
|
|
11
|
+
/** Default component picked when the field is first used. */
|
|
12
|
+
defaultComponent?: string;
|
|
13
|
+
value?: ComponentBlockValue;
|
|
14
|
+
onChange: (value: ComponentBlockValue) => void;
|
|
15
|
+
/**
|
|
16
|
+
* Optional async validator hook. Receives the proposed value and the
|
|
17
|
+
* field config; should return `true` for ok or a string error.
|
|
18
|
+
* Falls back to a built-in structural validator when not provided —
|
|
19
|
+
* which is what cms-core would do server-side at save time anyway.
|
|
20
|
+
*/
|
|
21
|
+
validate?: (value: ComponentBlockValue) => string | true;
|
|
22
|
+
helpText?: string;
|
|
23
|
+
}
|
|
24
|
+
export declare function ComponentBlockField({ label, manifest, allow, defaultComponent, value, onChange, validate, helpText, }: ComponentBlockFieldProps): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
//# sourceMappingURL=ComponentBlockField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComponentBlockField.d.ts","sourceRoot":"","sources":["../../src/fields/ComponentBlockField.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAA;AAU/D,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,QAAQ,CAAA;IAClB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,KAAK,CAAC,EAAE,mBAAmB,CAAA;IAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAA;IAC9C;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,MAAM,GAAG,IAAI,CAAA;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,QAAQ,EACR,KAAK,EACL,gBAAgB,EAChB,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,QAAQ,GACT,EAAE,wBAAwB,2CAmH1B"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* Top-level admin field for component-aware blocks. Consumes a
|
|
5
|
+
* {@link Manifest} produced by `@actuate-media/component-blocks`,
|
|
6
|
+
* renders a component picker (when more than one component is allowed)
|
|
7
|
+
* and a recursive props form via {@link PropInput}.
|
|
8
|
+
*
|
|
9
|
+
* Storage shape:
|
|
10
|
+
* { component: 'Hero', props: { title: 'Welcome', alignment: 'center' } }
|
|
11
|
+
*
|
|
12
|
+
* Live validation runs through `validateComponentBlockValue` from
|
|
13
|
+
* `@actuate-media/cms-core`. The whole-value error is shown at the top
|
|
14
|
+
* of the form, and the per-prop error map (parsed out of the message
|
|
15
|
+
* string) is forwarded into `PropInput` so each input can render its
|
|
16
|
+
* own inline error.
|
|
17
|
+
*/
|
|
18
|
+
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
19
|
+
import { buildClientValidator, getAllowedComponents, parsePerPropErrors, seedPropsForComponent, } from './component-block-helpers.js';
|
|
20
|
+
import { PropInput } from './PropInput.js';
|
|
21
|
+
export function ComponentBlockField({ label, manifest, allow, defaultComponent, value, onChange, validate, helpText, }) {
|
|
22
|
+
const allowedComponents = useMemo(() => getAllowedComponents(manifest, allow), [manifest, allow]);
|
|
23
|
+
// Track the initial seed application so we don't repeatedly stomp
|
|
24
|
+
// the editor's prop values on every render. The defaultComponent
|
|
25
|
+
// seed only fires once, when value is undefined on mount.
|
|
26
|
+
const seededRef = useRef(false);
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
if (seededRef.current)
|
|
29
|
+
return;
|
|
30
|
+
if (value) {
|
|
31
|
+
seededRef.current = true;
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const picked = allowedComponents.find((c) => c.name === defaultComponent) ?? allowedComponents[0];
|
|
35
|
+
if (!picked)
|
|
36
|
+
return;
|
|
37
|
+
seededRef.current = true;
|
|
38
|
+
onChange({ component: picked.name, props: seedPropsForComponent(picked) });
|
|
39
|
+
}, [allowedComponents, defaultComponent, value, onChange]);
|
|
40
|
+
const currentSpec = (value && manifest.components.find((c) => c.name === value.component)) ?? allowedComponents[0];
|
|
41
|
+
// Pure structural validation when caller didn't provide their own.
|
|
42
|
+
// Keeps the form usable even without a live validator wired in.
|
|
43
|
+
const builtinValidate = useMemo(() => buildClientValidator(manifest, allow), [manifest, allow]);
|
|
44
|
+
const validator = validate ?? builtinValidate;
|
|
45
|
+
const [errorMessage, setErrorMessage] = useState(null);
|
|
46
|
+
const perPropErrors = useMemo(() => parsePerPropErrors(errorMessage), [errorMessage]);
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
if (!value) {
|
|
49
|
+
setErrorMessage(null);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const result = validator(value);
|
|
53
|
+
setErrorMessage(result === true ? null : result);
|
|
54
|
+
}, [value, validator]);
|
|
55
|
+
function handleComponentChange(componentName) {
|
|
56
|
+
const spec = manifest.components.find((c) => c.name === componentName);
|
|
57
|
+
if (!spec)
|
|
58
|
+
return;
|
|
59
|
+
onChange({ component: spec.name, props: seedPropsForComponent(spec) });
|
|
60
|
+
}
|
|
61
|
+
function handlePropChange(propName, next) {
|
|
62
|
+
if (!value)
|
|
63
|
+
return;
|
|
64
|
+
onChange({
|
|
65
|
+
...value,
|
|
66
|
+
props: { ...value.props, [propName]: next },
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (!currentSpec) {
|
|
70
|
+
return (_jsx("div", { className: "rounded-md border border-[var(--destructive)] bg-red-50 p-3 text-sm text-[var(--destructive)]", children: "Component block has no components to choose from." }));
|
|
71
|
+
}
|
|
72
|
+
return (_jsxs("div", { className: "space-y-3", children: [label ? _jsx("label", { className: "block text-sm font-medium", children: label }) : null, allowedComponents.length > 1 ? (_jsxs("label", { className: "block text-sm", children: [_jsx("div", { className: "mb-1 text-xs tracking-wide text-[var(--muted-foreground)] uppercase", children: "Component" }), _jsx("select", { value: currentSpec.name, onChange: (e) => handleComponentChange(e.target.value), className: "w-full rounded-md border border-[var(--border)] bg-[var(--input-background)] px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-[var(--ring)]", children: allowedComponents.map((spec) => (_jsx("option", { value: spec.name, children: spec.displayName }, spec.name))) })] })) : null, errorMessage ? (_jsx("div", { className: "rounded-md border border-[var(--destructive)] bg-red-50 px-3 py-2 text-xs text-[var(--destructive)]", children: errorMessage })) : null, _jsxs("fieldset", { className: "rounded-md border border-[var(--border)] bg-[var(--card)] p-4", children: [_jsx("legend", { className: "px-1 text-xs tracking-wide text-[var(--muted-foreground)] uppercase", children: currentSpec.displayName }), currentSpec.description ? (_jsx("p", { className: "mb-3 text-xs text-[var(--muted-foreground)]", children: currentSpec.description })) : null, _jsx("div", { className: "space-y-4", children: currentSpec.props.map((prop) => (_jsx(PropInput, { prop: prop, value: value?.props?.[prop.name], onChange: (next) => handlePropChange(prop.name, next), errors: perPropErrors, path: prop.name }, prop.name))) })] }), helpText ? _jsx("p", { className: "text-xs text-[var(--muted-foreground)]", children: helpText }) : null] }));
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=ComponentBlockField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComponentBlockField.js","sourceRoot":"","sources":["../../src/fields/ComponentBlockField.tsx"],"names":[],"mappings":"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"}
|
package/dist/fields/DateField.js
CHANGED
|
@@ -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 DateField({ label, value = '', onChange, required, helpText }) {
|
|
4
|
-
return (_jsxs("div", { children: [_jsxs("label", { className: "mb-1 block text-sm font-medium", children: [label, required && _jsx("span", { className: "ml-0.5 text-[var(--destructive)]", children: "*" })] }), _jsxs("div", { className: "relative", children: [_jsx("input", { type: "date", value: value, onChange: (e) => onChange(e.target.value), required: required, className: "w-full rounded-md border border-[var(--border)] bg-[var(--input-background)] px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-[var(--ring)]" }), _jsx("button", { type: "button", className: "absolute
|
|
4
|
+
return (_jsxs("div", { children: [_jsxs("label", { className: "mb-1 block text-sm font-medium", children: [label, required && _jsx("span", { className: "ml-0.5 text-[var(--destructive)]", children: "*" })] }), _jsxs("div", { className: "relative", children: [_jsx("input", { type: "date", value: value, onChange: (e) => onChange(e.target.value), required: required, className: "w-full rounded-md border border-[var(--border)] bg-[var(--input-background)] px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-[var(--ring)]" }), _jsx("button", { type: "button", className: "absolute top-1/2 right-2 -translate-y-1/2 text-[var(--muted-foreground)]", "aria-label": "Open calendar", children: _jsx("svg", { className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" }) }) })] }), helpText && _jsx("p", { className: "mt-1 text-xs text-[var(--muted-foreground)]", children: helpText })] }));
|
|
5
5
|
}
|
|
6
6
|
//# sourceMappingURL=DateField.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldRenderer.d.ts","sourceRoot":"","sources":["../../src/fields/FieldRenderer.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FieldRenderer.d.ts","sourceRoot":"","sources":["../../src/fields/FieldRenderer.tsx"],"names":[],"mappings":"AAiBA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,eAAe,EAAE,CAAA;IAC1B,MAAM,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,eAAe,CAAA;IACtB,KAAK,EAAE,GAAG,CAAA;IACV,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAA;CAC/B;AAmBD,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,2CAgC3E"}
|
|
@@ -13,6 +13,7 @@ import { BlockBuilderField } from './BlockBuilderField.js';
|
|
|
13
13
|
import { GroupField } from './GroupField.js';
|
|
14
14
|
import { NavBuilderField } from './NavBuilderField.js';
|
|
15
15
|
import { NumberField } from './NumberField.js';
|
|
16
|
+
import { ComponentBlockField } from './ComponentBlockField.js';
|
|
16
17
|
const FIELD_MAP = {
|
|
17
18
|
text: TextField,
|
|
18
19
|
richText: RichTextField,
|
|
@@ -27,12 +28,13 @@ const FIELD_MAP = {
|
|
|
27
28
|
group: GroupField,
|
|
28
29
|
nav: NavBuilderField,
|
|
29
30
|
number: NumberField,
|
|
31
|
+
componentBlock: ComponentBlockField,
|
|
30
32
|
};
|
|
31
33
|
export function FieldRenderer({ field, value, onChange }) {
|
|
32
34
|
const Component = FIELD_MAP[field.type];
|
|
33
35
|
if (!Component) {
|
|
34
36
|
return (_jsxs("div", { className: "rounded-md border border-[var(--destructive)] bg-red-50 p-3 text-sm text-[var(--destructive)]", children: ["Unknown field type: ", _jsx("code", { children: field.type })] }));
|
|
35
37
|
}
|
|
36
|
-
return (_jsx(Component, { label: field.label, value: value, onChange: onChange, required: field.required, maxLength: field.maxLength, helpText: field.helpText, options: field.options, min: field.min, max: field.max, from: field.from, multi: field.multi, fields: field.fields, blocks: field.blocks, name: field.name }));
|
|
38
|
+
return (_jsx(Component, { label: field.label, value: value, onChange: onChange, required: field.required, maxLength: field.maxLength, helpText: field.helpText, options: field.options, min: field.min, max: field.max, from: field.from, multi: field.multi, fields: field.fields, blocks: field.blocks, name: field.name, manifest: field.manifest, allow: field.allow, defaultComponent: field.defaultComponent }));
|
|
37
39
|
}
|
|
38
40
|
//# sourceMappingURL=FieldRenderer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldRenderer.js","sourceRoot":"","sources":["../../src/fields/FieldRenderer.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"FieldRenderer.js","sourceRoot":"","sources":["../../src/fields/FieldRenderer.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AA2B9D,MAAM,SAAS,GAA6C;IAC1D,IAAI,EAAE,SAAS;IACf,QAAQ,EAAE,aAAa;IACvB,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,WAAW;IACnB,KAAK,EAAE,UAAU;IACjB,YAAY,EAAE,iBAAiB;IAC/B,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,WAAW;IACnB,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,iBAAiB;IACzB,KAAK,EAAE,UAAU;IACjB,GAAG,EAAE,eAAe;IACpB,MAAM,EAAE,WAAW;IACnB,cAAc,EAAE,mBAAmB;CACpC,CAAA;AAED,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAsB;IAC1E,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAEvC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CACL,eAAK,SAAS,EAAC,+FAA+F,qCACxF,yBAAO,KAAK,CAAC,IAAI,GAAQ,IACzC,CACP,CAAA;IACH,CAAC;IAED,OAAO,CACL,KAAC,SAAS,IACR,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,SAAS,EAAE,KAAK,CAAC,SAAS,EAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,GAAG,EAAE,KAAK,CAAC,GAAG,EACd,GAAG,EAAE,KAAK,CAAC,GAAG,EACd,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,GACxC,CACH,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { PropSpec } from '@actuate-media/component-blocks';
|
|
2
|
+
import { defaultForType } from './component-block-helpers.js';
|
|
3
|
+
export { defaultForType };
|
|
4
|
+
export interface PropInputProps {
|
|
5
|
+
prop: PropSpec;
|
|
6
|
+
value: unknown;
|
|
7
|
+
onChange: (value: unknown) => void;
|
|
8
|
+
/** Map keyed by `propPath` (dot-joined) for nested error display. */
|
|
9
|
+
errors?: Record<string, string>;
|
|
10
|
+
/** Dot-separated path for the field; used as the error map key. */
|
|
11
|
+
path?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function PropInput({ prop, value, onChange, errors, path }: PropInputProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
//# sourceMappingURL=PropInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PropInput.d.ts","sourceRoot":"","sources":["../../src/fields/PropInput.tsx"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,iCAAiC,CAAA;AAEzE,OAAO,EACL,cAAc,EAIf,MAAM,8BAA8B,CAAA;AAErC,OAAO,EAAE,cAAc,EAAE,CAAA;AAEzB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAA;IACd,KAAK,EAAE,OAAO,CAAA;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAClC,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,cAAc,2CAmBhF"}
|