@delmaredigital/payload-puck 0.6.13 → 0.6.15
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/README.md +15 -3
- package/dist/admin/EditWithPuckButton.d.ts +0 -1
- package/dist/admin/EditWithPuckButton.js +0 -2
- package/dist/admin/EditWithPuckCell.d.ts +0 -1
- package/dist/admin/EditWithPuckCell.js +0 -2
- package/dist/admin/PuckEditorView.d.ts +0 -1
- package/dist/admin/PuckEditorView.js +0 -2
- package/dist/admin/client.d.ts +0 -1
- package/dist/admin/client.js +0 -2
- package/dist/admin/generateAdminComponents.d.ts +0 -1
- package/dist/admin/generateAdminComponents.js +0 -2
- package/dist/admin/index.d.ts +0 -1
- package/dist/admin/index.js +0 -2
- package/dist/ai/collections/AiContext.d.ts +0 -1
- package/dist/ai/collections/AiContext.js +0 -2
- package/dist/ai/collections/AiPrompts.d.ts +0 -1
- package/dist/ai/collections/AiPrompts.js +0 -2
- package/dist/ai/createAiApiRoutes.d.ts +0 -1
- package/dist/ai/createAiApiRoutes.js +5 -4
- package/dist/ai/createAiGenerate.d.ts +0 -1
- package/dist/ai/createAiGenerate.js +5 -4
- package/dist/ai/createAiPlugin.d.ts +0 -1
- package/dist/ai/createAiPlugin.js +4 -4
- package/dist/ai/hooks/useAiContext.d.ts +0 -1
- package/dist/ai/hooks/useAiContext.js +0 -2
- package/dist/ai/hooks/useAiPrompts.d.ts +0 -1
- package/dist/ai/hooks/useAiPrompts.js +0 -2
- package/dist/ai/index.d.ts +0 -1
- package/dist/ai/index.js +0 -2
- package/dist/ai/plugins/ContextEditorPanel.d.ts +0 -1
- package/dist/ai/plugins/ContextEditorPanel.js +0 -2
- package/dist/ai/plugins/PromptEditorPanel.d.ts +0 -1
- package/dist/ai/plugins/PromptEditorPanel.js +0 -2
- package/dist/ai/plugins/contextEditorPlugin.d.ts +0 -1
- package/dist/ai/plugins/contextEditorPlugin.js +0 -2
- package/dist/ai/plugins/promptApiRoutes.d.ts +0 -1
- package/dist/ai/plugins/promptApiRoutes.js +0 -2
- package/dist/ai/plugins/promptEditorPlugin.d.ts +0 -1
- package/dist/ai/plugins/promptEditorPlugin.js +0 -2
- package/dist/ai/presets/componentAiDefaults.d.ts +0 -1
- package/dist/ai/presets/componentAiDefaults.js +0 -2
- package/dist/ai/presets/index.d.ts +0 -1
- package/dist/ai/presets/index.js +0 -2
- package/dist/ai/presets/instructions/interactive.d.ts +0 -1
- package/dist/ai/presets/instructions/interactive.js +0 -2
- package/dist/ai/presets/instructions/layout.d.ts +0 -1
- package/dist/ai/presets/instructions/layout.js +0 -2
- package/dist/ai/presets/instructions/media.d.ts +0 -1
- package/dist/ai/presets/instructions/media.js +0 -2
- package/dist/ai/presets/instructions/pagePatterns.d.ts +0 -1
- package/dist/ai/presets/instructions/pagePatterns.js +0 -2
- package/dist/ai/presets/instructions/schemas.d.ts +0 -1
- package/dist/ai/presets/instructions/schemas.js +0 -2
- package/dist/ai/presets/instructions/typography.d.ts +0 -1
- package/dist/ai/presets/instructions/typography.js +0 -2
- package/dist/ai/tools/index.d.ts +0 -1
- package/dist/ai/tools/index.js +0 -2
- package/dist/ai/types.d.ts +109 -3
- package/dist/ai/types.js +0 -2
- package/dist/ai/utils/injectAiConfig.d.ts +0 -1
- package/dist/ai/utils/injectAiConfig.js +0 -2
- package/dist/api/createPuckApiRoutes.d.ts +0 -1
- package/dist/api/createPuckApiRoutes.js +0 -2
- package/dist/api/createPuckApiRoutesVersions.d.ts +0 -1
- package/dist/api/createPuckApiRoutesVersions.js +0 -2
- package/dist/api/createPuckApiRoutesWithId.d.ts +0 -1
- package/dist/api/createPuckApiRoutesWithId.js +0 -2
- package/dist/api/index.d.ts +0 -1
- package/dist/api/index.js +0 -2
- package/dist/api/payload-config.d.js +1 -2
- package/dist/api/types.d.ts +0 -1
- package/dist/api/types.js +0 -2
- package/dist/api/utils/mapRootProps.d.ts +0 -1
- package/dist/api/utils/mapRootProps.js +0 -2
- package/dist/collections/Templates.d.ts +0 -1
- package/dist/collections/Templates.js +0 -2
- package/dist/components/AccordionClient.d.ts +0 -1
- package/dist/components/AccordionClient.js +0 -2
- package/dist/components/AnimatedWrapper.d.ts +0 -1
- package/dist/components/AnimatedWrapper.js +0 -2
- package/dist/components/exports.d.ts +0 -1
- package/dist/components/exports.js +0 -2
- package/dist/components/index.d.ts +0 -1
- package/dist/components/index.js +0 -2
- package/dist/components/interactive/Accordion.d.ts +0 -1
- package/dist/components/interactive/Accordion.js +0 -2
- package/dist/components/interactive/Accordion.server.d.ts +0 -1
- package/dist/components/interactive/Accordion.server.js +0 -2
- package/dist/components/interactive/Button.d.ts +0 -1
- package/dist/components/interactive/Button.js +0 -2
- package/dist/components/interactive/Button.server.d.ts +0 -1
- package/dist/components/interactive/Button.server.js +0 -2
- package/dist/components/interactive/Card.d.ts +0 -1
- package/dist/components/interactive/Card.js +0 -2
- package/dist/components/interactive/Card.server.d.ts +0 -1
- package/dist/components/interactive/Card.server.js +0 -2
- package/dist/components/interactive/Divider.d.ts +0 -1
- package/dist/components/interactive/Divider.js +0 -2
- package/dist/components/interactive/Divider.server.d.ts +0 -1
- package/dist/components/interactive/Divider.server.js +0 -2
- package/dist/components/interactive/index.d.ts +0 -1
- package/dist/components/interactive/index.js +0 -2
- package/dist/components/layout/Container.d.ts +0 -1
- package/dist/components/layout/Container.js +0 -2
- package/dist/components/layout/Container.server.d.ts +0 -1
- package/dist/components/layout/Container.server.js +0 -2
- package/dist/components/layout/Flex.d.ts +0 -1
- package/dist/components/layout/Flex.js +0 -2
- package/dist/components/layout/Flex.server.d.ts +0 -1
- package/dist/components/layout/Flex.server.js +0 -2
- package/dist/components/layout/Grid.d.ts +0 -1
- package/dist/components/layout/Grid.js +0 -2
- package/dist/components/layout/Grid.server.d.ts +0 -1
- package/dist/components/layout/Grid.server.js +0 -2
- package/dist/components/layout/Section.d.ts +0 -1
- package/dist/components/layout/Section.js +0 -2
- package/dist/components/layout/Section.server.d.ts +0 -1
- package/dist/components/layout/Section.server.js +0 -2
- package/dist/components/layout/Spacer.d.ts +0 -1
- package/dist/components/layout/Spacer.js +0 -2
- package/dist/components/layout/Spacer.server.d.ts +0 -1
- package/dist/components/layout/Spacer.server.js +0 -2
- package/dist/components/layout/Template.d.ts +0 -1
- package/dist/components/layout/Template.js +0 -2
- package/dist/components/layout/Template.server.d.ts +0 -1
- package/dist/components/layout/Template.server.js +0 -2
- package/dist/components/layout/index.d.ts +0 -1
- package/dist/components/layout/index.js +0 -2
- package/dist/components/media/Image.d.ts +0 -1
- package/dist/components/media/Image.js +0 -2
- package/dist/components/media/Image.server.d.ts +0 -1
- package/dist/components/media/Image.server.js +0 -2
- package/dist/components/media/index.d.ts +0 -1
- package/dist/components/media/index.js +0 -2
- package/dist/components/typography/Heading.d.ts +0 -1
- package/dist/components/typography/Heading.js +0 -2
- package/dist/components/typography/Heading.server.d.ts +0 -1
- package/dist/components/typography/Heading.server.js +0 -2
- package/dist/components/typography/RichText.editor.d.ts +0 -1
- package/dist/components/typography/RichText.editor.js +0 -2
- package/dist/components/typography/RichText.server.d.ts +0 -1
- package/dist/components/typography/RichText.server.js +0 -2
- package/dist/components/typography/Text.d.ts +0 -1
- package/dist/components/typography/Text.js +0 -2
- package/dist/components/typography/Text.server.d.ts +0 -1
- package/dist/components/typography/Text.server.js +0 -2
- package/dist/components/typography/index.d.ts +0 -1
- package/dist/components/typography/index.js +0 -2
- package/dist/config/config.editor.d.ts +0 -1
- package/dist/config/config.editor.js +0 -2
- package/dist/config/index.d.ts +0 -1
- package/dist/config/index.js +0 -2
- package/dist/config/merge.d.ts +0 -1
- package/dist/config/merge.js +0 -2
- package/dist/config/presets.d.ts +0 -1
- package/dist/config/presets.js +0 -2
- package/dist/config/types.d.ts +0 -1
- package/dist/config/types.js +0 -2
- package/dist/editor/PuckEditor.d.ts +18 -1
- package/dist/editor/PuckEditor.js +0 -2
- package/dist/editor/PuckEditorImpl.client.d.ts +10 -1
- package/dist/editor/PuckEditorImpl.client.js +3 -3
- package/dist/editor/components/DarkModeStyles.d.ts +0 -1
- package/dist/editor/components/DarkModeStyles.js +0 -2
- package/dist/editor/components/HeaderActions.d.ts +0 -1
- package/dist/editor/components/HeaderActions.js +0 -2
- package/dist/editor/components/IframeWrapper.d.ts +0 -1
- package/dist/editor/components/IframeWrapper.js +0 -2
- package/dist/editor/components/LoadingState.d.ts +0 -1
- package/dist/editor/components/LoadingState.js +0 -2
- package/dist/editor/components/PreviewModal.d.ts +0 -1
- package/dist/editor/components/PreviewModal.js +0 -2
- package/dist/editor/components/PreviewModeToggle.d.ts +0 -1
- package/dist/editor/components/PreviewModeToggle.js +0 -2
- package/dist/editor/components/VersionHistory.d.ts +0 -1
- package/dist/editor/components/VersionHistory.js +0 -2
- package/dist/editor/hooks/useDarkMode.d.ts +0 -1
- package/dist/editor/hooks/useDarkMode.js +0 -2
- package/dist/editor/hooks/useUnsavedChanges.d.ts +0 -1
- package/dist/editor/hooks/useUnsavedChanges.js +0 -2
- package/dist/editor/index.d.ts +0 -1
- package/dist/editor/index.js +0 -2
- package/dist/editor/plugins/VersionHistoryPanel.d.ts +0 -1
- package/dist/editor/plugins/VersionHistoryPanel.js +0 -2
- package/dist/editor/plugins/index.d.ts +0 -1
- package/dist/editor/plugins/index.js +0 -2
- package/dist/editor/plugins/versionHistoryPlugin.d.ts +0 -1
- package/dist/editor/plugins/versionHistoryPlugin.js +0 -2
- package/dist/editor/utils/detectPageTree.d.ts +0 -1
- package/dist/editor/utils/detectPageTree.js +0 -2
- package/dist/editor/utils/index.d.ts +0 -1
- package/dist/editor/utils/index.js +0 -2
- package/dist/editor/utils/injectPageTreeFields.d.ts +0 -1
- package/dist/editor/utils/injectPageTreeFields.js +0 -2
- package/dist/endpoints/ai.d.ts +13 -1
- package/dist/endpoints/ai.js +6 -3
- package/dist/endpoints/context.d.ts +0 -1
- package/dist/endpoints/context.js +0 -2
- package/dist/endpoints/index.d.ts +0 -1
- package/dist/endpoints/index.js +0 -2
- package/dist/endpoints/postcss.d.js +1 -2
- package/dist/endpoints/prompts.d.ts +0 -1
- package/dist/endpoints/prompts.js +0 -2
- package/dist/endpoints/styles.d.ts +0 -1
- package/dist/endpoints/styles.js +0 -2
- package/dist/exports/client.d.ts +0 -1
- package/dist/exports/client.js +0 -2
- package/dist/exports/rsc.d.ts +0 -1
- package/dist/exports/rsc.js +0 -2
- package/dist/fields/AlignmentField.d.ts +0 -1
- package/dist/fields/AlignmentField.js +0 -2
- package/dist/fields/AnimationField.d.ts +0 -1
- package/dist/fields/AnimationField.js +0 -2
- package/dist/fields/BackgroundField.d.ts +0 -1
- package/dist/fields/BackgroundField.js +0 -2
- package/dist/fields/BorderField.d.ts +0 -1
- package/dist/fields/BorderField.js +0 -2
- package/dist/fields/ColorPickerField.d.ts +0 -1
- package/dist/fields/ColorPickerField.js +0 -2
- package/dist/fields/ContentAlignmentField.d.ts +0 -1
- package/dist/fields/ContentAlignmentField.js +0 -2
- package/dist/fields/DimensionsField.d.ts +0 -1
- package/dist/fields/DimensionsField.js +0 -2
- package/dist/fields/FlexAlignmentField.d.ts +0 -1
- package/dist/fields/FlexAlignmentField.js +0 -2
- package/dist/fields/FolderPickerField.d.ts +0 -1
- package/dist/fields/FolderPickerField.js +0 -2
- package/dist/fields/GradientEditor.d.ts +0 -1
- package/dist/fields/GradientEditor.js +0 -2
- package/dist/fields/LockedField.d.ts +0 -1
- package/dist/fields/LockedField.js +0 -2
- package/dist/fields/MarginField.d.ts +0 -1
- package/dist/fields/MarginField.js +0 -2
- package/dist/fields/MediaField.d.ts +0 -1
- package/dist/fields/MediaField.js +0 -2
- package/dist/fields/PaddingField.d.ts +0 -1
- package/dist/fields/PaddingField.js +0 -2
- package/dist/fields/PageSegmentField.d.ts +0 -1
- package/dist/fields/PageSegmentField.js +0 -2
- package/dist/fields/ResetField.d.ts +0 -1
- package/dist/fields/ResetField.js +0 -2
- package/dist/fields/ResponsiveField.d.ts +0 -1
- package/dist/fields/ResponsiveField.js +0 -2
- package/dist/fields/ResponsiveVisibilityField.d.ts +0 -1
- package/dist/fields/ResponsiveVisibilityField.js +0 -2
- package/dist/fields/SizeField.d.ts +0 -1
- package/dist/fields/SizeField.js +0 -2
- package/dist/fields/SlugPreviewField.d.ts +0 -1
- package/dist/fields/SlugPreviewField.js +0 -2
- package/dist/fields/TemplateField.d.ts +0 -1
- package/dist/fields/TemplateField.js +0 -2
- package/dist/fields/TransformField.d.ts +0 -1
- package/dist/fields/TransformField.js +0 -2
- package/dist/fields/VerticalAlignmentField.d.ts +0 -1
- package/dist/fields/VerticalAlignmentField.js +0 -2
- package/dist/fields/WidthField.d.ts +0 -1
- package/dist/fields/WidthField.js +0 -2
- package/dist/fields/index.d.ts +0 -1
- package/dist/fields/index.js +0 -2
- package/dist/fields/richtext/controls/ColorPickerControl.d.ts +0 -1
- package/dist/fields/richtext/controls/ColorPickerControl.js +0 -2
- package/dist/fields/richtext/controls/DropdownPortal.d.ts +0 -1
- package/dist/fields/richtext/controls/DropdownPortal.js +0 -2
- package/dist/fields/richtext/controls/FontSizeControl.d.ts +0 -1
- package/dist/fields/richtext/controls/FontSizeControl.js +0 -2
- package/dist/fields/richtext/controls/HighlightControl.d.ts +0 -1
- package/dist/fields/richtext/controls/HighlightControl.js +0 -2
- package/dist/fields/richtext/controls/index.d.ts +0 -1
- package/dist/fields/richtext/controls/index.js +0 -2
- package/dist/fields/richtext/controls/shared.d.ts +0 -1
- package/dist/fields/richtext/controls/shared.js +0 -2
- package/dist/fields/richtext/createRichTextField.d.ts +0 -1
- package/dist/fields/richtext/createRichTextField.js +0 -2
- package/dist/fields/richtext/extensions/FontSize.d.ts +0 -1
- package/dist/fields/richtext/extensions/FontSize.js +0 -2
- package/dist/fields/richtext/extensions/index.d.ts +0 -1
- package/dist/fields/richtext/extensions/index.js +0 -2
- package/dist/fields/richtext/index.d.ts +0 -1
- package/dist/fields/richtext/index.js +0 -2
- package/dist/fields/shared.d.ts +0 -1
- package/dist/fields/shared.js +0 -2
- package/dist/hooks/index.d.ts +0 -1
- package/dist/hooks/index.js +0 -2
- package/dist/hooks/useResponsiveStyles.d.ts +0 -1
- package/dist/hooks/useResponsiveStyles.js +0 -2
- package/dist/hooks/useScrollAnimation.d.ts +0 -1
- package/dist/hooks/useScrollAnimation.js +0 -2
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -2
- package/dist/layouts/LayoutWrapper.d.ts +0 -1
- package/dist/layouts/LayoutWrapper.js +0 -2
- package/dist/layouts/defaults.d.ts +0 -1
- package/dist/layouts/defaults.js +0 -2
- package/dist/layouts/index.d.ts +0 -1
- package/dist/layouts/index.js +0 -2
- package/dist/layouts/types.d.ts +0 -1
- package/dist/layouts/types.js +0 -2
- package/dist/layouts/utils.d.ts +0 -1
- package/dist/layouts/utils.js +0 -2
- package/dist/next/index.d.ts +0 -1
- package/dist/next/index.js +0 -2
- package/dist/plugin/collections/Pages.d.ts +0 -1
- package/dist/plugin/collections/Pages.js +0 -2
- package/dist/plugin/fields/index.d.ts +0 -1
- package/dist/plugin/fields/index.js +0 -2
- package/dist/plugin/fields/types.d.ts +0 -1
- package/dist/plugin/fields/types.js +0 -2
- package/dist/plugin/hooks/index.d.ts +0 -1
- package/dist/plugin/hooks/index.js +0 -2
- package/dist/plugin/hooks/isHomepageUnique.d.ts +0 -1
- package/dist/plugin/hooks/isHomepageUnique.js +0 -2
- package/dist/plugin/index.d.ts +0 -1
- package/dist/plugin/index.js +2 -3
- package/dist/render/HybridPageRenderer.d.ts +0 -1
- package/dist/render/HybridPageRenderer.js +0 -2
- package/dist/render/PageRenderer.d.ts +0 -1
- package/dist/render/PageRenderer.js +0 -2
- package/dist/render/PuckEditor.client.d.ts +0 -1
- package/dist/render/PuckEditor.client.js +0 -2
- package/dist/render/index.d.ts +0 -1
- package/dist/render/index.js +0 -2
- package/dist/theme/context.d.ts +0 -1
- package/dist/theme/context.js +0 -2
- package/dist/theme/defaults.d.ts +0 -1
- package/dist/theme/defaults.js +0 -2
- package/dist/theme/example.d.ts +0 -1
- package/dist/theme/example.js +0 -2
- package/dist/theme/index.d.ts +0 -1
- package/dist/theme/index.js +0 -2
- package/dist/theme/types.d.ts +0 -1
- package/dist/theme/types.js +0 -2
- package/dist/theme/utils.d.ts +0 -1
- package/dist/theme/utils.js +0 -2
- package/dist/types/index.d.ts +0 -1
- package/dist/types/index.js +0 -2
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/index.js +0 -2
- package/dist/utils/migration.d.ts +0 -1
- package/dist/utils/migration.js +0 -2
- package/dist/utils/validation.d.ts +0 -1
- package/dist/utils/validation.js +0 -2
- package/dist/version.d.ts +1 -2
- package/dist/version.js +1 -3
- package/dist/views/PuckConfigContext.d.ts +0 -1
- package/dist/views/PuckConfigContext.js +0 -2
- package/dist/views/PuckEditorView.d.ts +0 -1
- package/dist/views/PuckEditorView.js +0 -2
- package/dist/views/index.d.ts +0 -1
- package/dist/views/index.js +0 -2
- package/package.json +20 -20
- package/dist/admin/EditWithPuckButton.d.ts.map +0 -1
- package/dist/admin/EditWithPuckButton.js.map +0 -1
- package/dist/admin/EditWithPuckCell.d.ts.map +0 -1
- package/dist/admin/EditWithPuckCell.js.map +0 -1
- package/dist/admin/PuckEditorView.d.ts.map +0 -1
- package/dist/admin/PuckEditorView.js.map +0 -1
- package/dist/admin/client.d.ts.map +0 -1
- package/dist/admin/client.js.map +0 -1
- package/dist/admin/generateAdminComponents.d.ts.map +0 -1
- package/dist/admin/generateAdminComponents.js.map +0 -1
- package/dist/admin/index.d.ts.map +0 -1
- package/dist/admin/index.js.map +0 -1
- package/dist/ai/collections/AiContext.d.ts.map +0 -1
- package/dist/ai/collections/AiContext.js.map +0 -1
- package/dist/ai/collections/AiPrompts.d.ts.map +0 -1
- package/dist/ai/collections/AiPrompts.js.map +0 -1
- package/dist/ai/createAiApiRoutes.d.ts.map +0 -1
- package/dist/ai/createAiApiRoutes.js.map +0 -1
- package/dist/ai/createAiGenerate.d.ts.map +0 -1
- package/dist/ai/createAiGenerate.js.map +0 -1
- package/dist/ai/createAiPlugin.d.ts.map +0 -1
- package/dist/ai/createAiPlugin.js.map +0 -1
- package/dist/ai/hooks/useAiContext.d.ts.map +0 -1
- package/dist/ai/hooks/useAiContext.js.map +0 -1
- package/dist/ai/hooks/useAiPrompts.d.ts.map +0 -1
- package/dist/ai/hooks/useAiPrompts.js.map +0 -1
- package/dist/ai/index.d.ts.map +0 -1
- package/dist/ai/index.js.map +0 -1
- package/dist/ai/plugins/ContextEditorPanel.d.ts.map +0 -1
- package/dist/ai/plugins/ContextEditorPanel.js.map +0 -1
- package/dist/ai/plugins/PromptEditorPanel.d.ts.map +0 -1
- package/dist/ai/plugins/PromptEditorPanel.js.map +0 -1
- package/dist/ai/plugins/contextEditorPlugin.d.ts.map +0 -1
- package/dist/ai/plugins/contextEditorPlugin.js.map +0 -1
- package/dist/ai/plugins/promptApiRoutes.d.ts.map +0 -1
- package/dist/ai/plugins/promptApiRoutes.js.map +0 -1
- package/dist/ai/plugins/promptEditorPlugin.d.ts.map +0 -1
- package/dist/ai/plugins/promptEditorPlugin.js.map +0 -1
- package/dist/ai/presets/componentAiDefaults.d.ts.map +0 -1
- package/dist/ai/presets/componentAiDefaults.js.map +0 -1
- package/dist/ai/presets/index.d.ts.map +0 -1
- package/dist/ai/presets/index.js.map +0 -1
- package/dist/ai/presets/instructions/interactive.d.ts.map +0 -1
- package/dist/ai/presets/instructions/interactive.js.map +0 -1
- package/dist/ai/presets/instructions/layout.d.ts.map +0 -1
- package/dist/ai/presets/instructions/layout.js.map +0 -1
- package/dist/ai/presets/instructions/media.d.ts.map +0 -1
- package/dist/ai/presets/instructions/media.js.map +0 -1
- package/dist/ai/presets/instructions/pagePatterns.d.ts.map +0 -1
- package/dist/ai/presets/instructions/pagePatterns.js.map +0 -1
- package/dist/ai/presets/instructions/schemas.d.ts.map +0 -1
- package/dist/ai/presets/instructions/schemas.js.map +0 -1
- package/dist/ai/presets/instructions/typography.d.ts.map +0 -1
- package/dist/ai/presets/instructions/typography.js.map +0 -1
- package/dist/ai/tools/index.d.ts.map +0 -1
- package/dist/ai/tools/index.js.map +0 -1
- package/dist/ai/types.d.ts.map +0 -1
- package/dist/ai/types.js.map +0 -1
- package/dist/ai/utils/injectAiConfig.d.ts.map +0 -1
- package/dist/ai/utils/injectAiConfig.js.map +0 -1
- package/dist/api/createPuckApiRoutes.d.ts.map +0 -1
- package/dist/api/createPuckApiRoutes.js.map +0 -1
- package/dist/api/createPuckApiRoutesVersions.d.ts.map +0 -1
- package/dist/api/createPuckApiRoutesVersions.js.map +0 -1
- package/dist/api/createPuckApiRoutesWithId.d.ts.map +0 -1
- package/dist/api/createPuckApiRoutesWithId.js.map +0 -1
- package/dist/api/index.d.ts.map +0 -1
- package/dist/api/index.js.map +0 -1
- package/dist/api/payload-config.d.js.map +0 -1
- package/dist/api/types.d.ts.map +0 -1
- package/dist/api/types.js.map +0 -1
- package/dist/api/utils/mapRootProps.d.ts.map +0 -1
- package/dist/api/utils/mapRootProps.js.map +0 -1
- package/dist/collections/Templates.d.ts.map +0 -1
- package/dist/collections/Templates.js.map +0 -1
- package/dist/components/AccordionClient.d.ts.map +0 -1
- package/dist/components/AccordionClient.js.map +0 -1
- package/dist/components/AnimatedWrapper.d.ts.map +0 -1
- package/dist/components/AnimatedWrapper.js.map +0 -1
- package/dist/components/exports.d.ts.map +0 -1
- package/dist/components/exports.js.map +0 -1
- package/dist/components/index.d.ts.map +0 -1
- package/dist/components/index.js.map +0 -1
- package/dist/components/interactive/Accordion.d.ts.map +0 -1
- package/dist/components/interactive/Accordion.js.map +0 -1
- package/dist/components/interactive/Accordion.server.d.ts.map +0 -1
- package/dist/components/interactive/Accordion.server.js.map +0 -1
- package/dist/components/interactive/Button.d.ts.map +0 -1
- package/dist/components/interactive/Button.js.map +0 -1
- package/dist/components/interactive/Button.server.d.ts.map +0 -1
- package/dist/components/interactive/Button.server.js.map +0 -1
- package/dist/components/interactive/Card.d.ts.map +0 -1
- package/dist/components/interactive/Card.js.map +0 -1
- package/dist/components/interactive/Card.server.d.ts.map +0 -1
- package/dist/components/interactive/Card.server.js.map +0 -1
- package/dist/components/interactive/Divider.d.ts.map +0 -1
- package/dist/components/interactive/Divider.js.map +0 -1
- package/dist/components/interactive/Divider.server.d.ts.map +0 -1
- package/dist/components/interactive/Divider.server.js.map +0 -1
- package/dist/components/interactive/index.d.ts.map +0 -1
- package/dist/components/interactive/index.js.map +0 -1
- package/dist/components/layout/Container.d.ts.map +0 -1
- package/dist/components/layout/Container.js.map +0 -1
- package/dist/components/layout/Container.server.d.ts.map +0 -1
- package/dist/components/layout/Container.server.js.map +0 -1
- package/dist/components/layout/Flex.d.ts.map +0 -1
- package/dist/components/layout/Flex.js.map +0 -1
- package/dist/components/layout/Flex.server.d.ts.map +0 -1
- package/dist/components/layout/Flex.server.js.map +0 -1
- package/dist/components/layout/Grid.d.ts.map +0 -1
- package/dist/components/layout/Grid.js.map +0 -1
- package/dist/components/layout/Grid.server.d.ts.map +0 -1
- package/dist/components/layout/Grid.server.js.map +0 -1
- package/dist/components/layout/Section.d.ts.map +0 -1
- package/dist/components/layout/Section.js.map +0 -1
- package/dist/components/layout/Section.server.d.ts.map +0 -1
- package/dist/components/layout/Section.server.js.map +0 -1
- package/dist/components/layout/Spacer.d.ts.map +0 -1
- package/dist/components/layout/Spacer.js.map +0 -1
- package/dist/components/layout/Spacer.server.d.ts.map +0 -1
- package/dist/components/layout/Spacer.server.js.map +0 -1
- package/dist/components/layout/Template.d.ts.map +0 -1
- package/dist/components/layout/Template.js.map +0 -1
- package/dist/components/layout/Template.server.d.ts.map +0 -1
- package/dist/components/layout/Template.server.js.map +0 -1
- package/dist/components/layout/index.d.ts.map +0 -1
- package/dist/components/layout/index.js.map +0 -1
- package/dist/components/media/Image.d.ts.map +0 -1
- package/dist/components/media/Image.js.map +0 -1
- package/dist/components/media/Image.server.d.ts.map +0 -1
- package/dist/components/media/Image.server.js.map +0 -1
- package/dist/components/media/index.d.ts.map +0 -1
- package/dist/components/media/index.js.map +0 -1
- package/dist/components/typography/Heading.d.ts.map +0 -1
- package/dist/components/typography/Heading.js.map +0 -1
- package/dist/components/typography/Heading.server.d.ts.map +0 -1
- package/dist/components/typography/Heading.server.js.map +0 -1
- package/dist/components/typography/RichText.editor.d.ts.map +0 -1
- package/dist/components/typography/RichText.editor.js.map +0 -1
- package/dist/components/typography/RichText.server.d.ts.map +0 -1
- package/dist/components/typography/RichText.server.js.map +0 -1
- package/dist/components/typography/Text.d.ts.map +0 -1
- package/dist/components/typography/Text.js.map +0 -1
- package/dist/components/typography/Text.server.d.ts.map +0 -1
- package/dist/components/typography/Text.server.js.map +0 -1
- package/dist/components/typography/index.d.ts.map +0 -1
- package/dist/components/typography/index.js.map +0 -1
- package/dist/config/config.editor.d.ts.map +0 -1
- package/dist/config/config.editor.js.map +0 -1
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/index.js.map +0 -1
- package/dist/config/merge.d.ts.map +0 -1
- package/dist/config/merge.js.map +0 -1
- package/dist/config/presets.d.ts.map +0 -1
- package/dist/config/presets.js.map +0 -1
- package/dist/config/types.d.ts.map +0 -1
- package/dist/config/types.js.map +0 -1
- package/dist/editor/PuckEditor.d.ts.map +0 -1
- package/dist/editor/PuckEditor.js.map +0 -1
- package/dist/editor/PuckEditorImpl.client.d.ts.map +0 -1
- package/dist/editor/PuckEditorImpl.client.js.map +0 -1
- package/dist/editor/components/DarkModeStyles.d.ts.map +0 -1
- package/dist/editor/components/DarkModeStyles.js.map +0 -1
- package/dist/editor/components/HeaderActions.d.ts.map +0 -1
- package/dist/editor/components/HeaderActions.js.map +0 -1
- package/dist/editor/components/IframeWrapper.d.ts.map +0 -1
- package/dist/editor/components/IframeWrapper.js.map +0 -1
- package/dist/editor/components/LoadingState.d.ts.map +0 -1
- package/dist/editor/components/LoadingState.js.map +0 -1
- package/dist/editor/components/PreviewModal.d.ts.map +0 -1
- package/dist/editor/components/PreviewModal.js.map +0 -1
- package/dist/editor/components/PreviewModeToggle.d.ts.map +0 -1
- package/dist/editor/components/PreviewModeToggle.js.map +0 -1
- package/dist/editor/components/VersionHistory.d.ts.map +0 -1
- package/dist/editor/components/VersionHistory.js.map +0 -1
- package/dist/editor/hooks/useDarkMode.d.ts.map +0 -1
- package/dist/editor/hooks/useDarkMode.js.map +0 -1
- package/dist/editor/hooks/useUnsavedChanges.d.ts.map +0 -1
- package/dist/editor/hooks/useUnsavedChanges.js.map +0 -1
- package/dist/editor/index.d.ts.map +0 -1
- package/dist/editor/index.js.map +0 -1
- package/dist/editor/plugins/VersionHistoryPanel.d.ts.map +0 -1
- package/dist/editor/plugins/VersionHistoryPanel.js.map +0 -1
- package/dist/editor/plugins/index.d.ts.map +0 -1
- package/dist/editor/plugins/index.js.map +0 -1
- package/dist/editor/plugins/versionHistoryPlugin.d.ts.map +0 -1
- package/dist/editor/plugins/versionHistoryPlugin.js.map +0 -1
- package/dist/editor/utils/detectPageTree.d.ts.map +0 -1
- package/dist/editor/utils/detectPageTree.js.map +0 -1
- package/dist/editor/utils/index.d.ts.map +0 -1
- package/dist/editor/utils/index.js.map +0 -1
- package/dist/editor/utils/injectPageTreeFields.d.ts.map +0 -1
- package/dist/editor/utils/injectPageTreeFields.js.map +0 -1
- package/dist/endpoints/ai.d.ts.map +0 -1
- package/dist/endpoints/ai.js.map +0 -1
- package/dist/endpoints/context.d.ts.map +0 -1
- package/dist/endpoints/context.js.map +0 -1
- package/dist/endpoints/index.d.ts.map +0 -1
- package/dist/endpoints/index.js.map +0 -1
- package/dist/endpoints/postcss.d.js.map +0 -1
- package/dist/endpoints/prompts.d.ts.map +0 -1
- package/dist/endpoints/prompts.js.map +0 -1
- package/dist/endpoints/styles.d.ts.map +0 -1
- package/dist/endpoints/styles.js.map +0 -1
- package/dist/exports/client.d.ts.map +0 -1
- package/dist/exports/client.js.map +0 -1
- package/dist/exports/rsc.d.ts.map +0 -1
- package/dist/exports/rsc.js.map +0 -1
- package/dist/fields/AlignmentField.d.ts.map +0 -1
- package/dist/fields/AlignmentField.js.map +0 -1
- package/dist/fields/AnimationField.d.ts.map +0 -1
- package/dist/fields/AnimationField.js.map +0 -1
- package/dist/fields/BackgroundField.d.ts.map +0 -1
- package/dist/fields/BackgroundField.js.map +0 -1
- package/dist/fields/BorderField.d.ts.map +0 -1
- package/dist/fields/BorderField.js.map +0 -1
- package/dist/fields/ColorPickerField.d.ts.map +0 -1
- package/dist/fields/ColorPickerField.js.map +0 -1
- package/dist/fields/ContentAlignmentField.d.ts.map +0 -1
- package/dist/fields/ContentAlignmentField.js.map +0 -1
- package/dist/fields/DimensionsField.d.ts.map +0 -1
- package/dist/fields/DimensionsField.js.map +0 -1
- package/dist/fields/FlexAlignmentField.d.ts.map +0 -1
- package/dist/fields/FlexAlignmentField.js.map +0 -1
- package/dist/fields/FolderPickerField.d.ts.map +0 -1
- package/dist/fields/FolderPickerField.js.map +0 -1
- package/dist/fields/GradientEditor.d.ts.map +0 -1
- package/dist/fields/GradientEditor.js.map +0 -1
- package/dist/fields/LockedField.d.ts.map +0 -1
- package/dist/fields/LockedField.js.map +0 -1
- package/dist/fields/MarginField.d.ts.map +0 -1
- package/dist/fields/MarginField.js.map +0 -1
- package/dist/fields/MediaField.d.ts.map +0 -1
- package/dist/fields/MediaField.js.map +0 -1
- package/dist/fields/PaddingField.d.ts.map +0 -1
- package/dist/fields/PaddingField.js.map +0 -1
- package/dist/fields/PageSegmentField.d.ts.map +0 -1
- package/dist/fields/PageSegmentField.js.map +0 -1
- package/dist/fields/ResetField.d.ts.map +0 -1
- package/dist/fields/ResetField.js.map +0 -1
- package/dist/fields/ResponsiveField.d.ts.map +0 -1
- package/dist/fields/ResponsiveField.js.map +0 -1
- package/dist/fields/ResponsiveVisibilityField.d.ts.map +0 -1
- package/dist/fields/ResponsiveVisibilityField.js.map +0 -1
- package/dist/fields/SizeField.d.ts.map +0 -1
- package/dist/fields/SizeField.js.map +0 -1
- package/dist/fields/SlugPreviewField.d.ts.map +0 -1
- package/dist/fields/SlugPreviewField.js.map +0 -1
- package/dist/fields/TemplateField.d.ts.map +0 -1
- package/dist/fields/TemplateField.js.map +0 -1
- package/dist/fields/TransformField.d.ts.map +0 -1
- package/dist/fields/TransformField.js.map +0 -1
- package/dist/fields/VerticalAlignmentField.d.ts.map +0 -1
- package/dist/fields/VerticalAlignmentField.js.map +0 -1
- package/dist/fields/WidthField.d.ts.map +0 -1
- package/dist/fields/WidthField.js.map +0 -1
- package/dist/fields/index.d.ts.map +0 -1
- package/dist/fields/index.js.map +0 -1
- package/dist/fields/richtext/controls/ColorPickerControl.d.ts.map +0 -1
- package/dist/fields/richtext/controls/ColorPickerControl.js.map +0 -1
- package/dist/fields/richtext/controls/DropdownPortal.d.ts.map +0 -1
- package/dist/fields/richtext/controls/DropdownPortal.js.map +0 -1
- package/dist/fields/richtext/controls/FontSizeControl.d.ts.map +0 -1
- package/dist/fields/richtext/controls/FontSizeControl.js.map +0 -1
- package/dist/fields/richtext/controls/HighlightControl.d.ts.map +0 -1
- package/dist/fields/richtext/controls/HighlightControl.js.map +0 -1
- package/dist/fields/richtext/controls/index.d.ts.map +0 -1
- package/dist/fields/richtext/controls/index.js.map +0 -1
- package/dist/fields/richtext/controls/shared.d.ts.map +0 -1
- package/dist/fields/richtext/controls/shared.js.map +0 -1
- package/dist/fields/richtext/createRichTextField.d.ts.map +0 -1
- package/dist/fields/richtext/createRichTextField.js.map +0 -1
- package/dist/fields/richtext/extensions/FontSize.d.ts.map +0 -1
- package/dist/fields/richtext/extensions/FontSize.js.map +0 -1
- package/dist/fields/richtext/extensions/index.d.ts.map +0 -1
- package/dist/fields/richtext/extensions/index.js.map +0 -1
- package/dist/fields/richtext/index.d.ts.map +0 -1
- package/dist/fields/richtext/index.js.map +0 -1
- package/dist/fields/shared.d.ts.map +0 -1
- package/dist/fields/shared.js.map +0 -1
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/index.js.map +0 -1
- package/dist/hooks/useResponsiveStyles.d.ts.map +0 -1
- package/dist/hooks/useResponsiveStyles.js.map +0 -1
- package/dist/hooks/useScrollAnimation.d.ts.map +0 -1
- package/dist/hooks/useScrollAnimation.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/layouts/LayoutWrapper.d.ts.map +0 -1
- package/dist/layouts/LayoutWrapper.js.map +0 -1
- package/dist/layouts/defaults.d.ts.map +0 -1
- package/dist/layouts/defaults.js.map +0 -1
- package/dist/layouts/index.d.ts.map +0 -1
- package/dist/layouts/index.js.map +0 -1
- package/dist/layouts/types.d.ts.map +0 -1
- package/dist/layouts/types.js.map +0 -1
- package/dist/layouts/utils.d.ts.map +0 -1
- package/dist/layouts/utils.js.map +0 -1
- package/dist/next/index.d.ts.map +0 -1
- package/dist/next/index.js.map +0 -1
- package/dist/plugin/collections/Pages.d.ts.map +0 -1
- package/dist/plugin/collections/Pages.js.map +0 -1
- package/dist/plugin/fields/index.d.ts.map +0 -1
- package/dist/plugin/fields/index.js.map +0 -1
- package/dist/plugin/fields/types.d.ts.map +0 -1
- package/dist/plugin/fields/types.js.map +0 -1
- package/dist/plugin/hooks/index.d.ts.map +0 -1
- package/dist/plugin/hooks/index.js.map +0 -1
- package/dist/plugin/hooks/isHomepageUnique.d.ts.map +0 -1
- package/dist/plugin/hooks/isHomepageUnique.js.map +0 -1
- package/dist/plugin/index.d.ts.map +0 -1
- package/dist/plugin/index.js.map +0 -1
- package/dist/render/HybridPageRenderer.d.ts.map +0 -1
- package/dist/render/HybridPageRenderer.js.map +0 -1
- package/dist/render/PageRenderer.d.ts.map +0 -1
- package/dist/render/PageRenderer.js.map +0 -1
- package/dist/render/PuckEditor.client.d.ts.map +0 -1
- package/dist/render/PuckEditor.client.js.map +0 -1
- package/dist/render/index.d.ts.map +0 -1
- package/dist/render/index.js.map +0 -1
- package/dist/theme/context.d.ts.map +0 -1
- package/dist/theme/context.js.map +0 -1
- package/dist/theme/defaults.d.ts.map +0 -1
- package/dist/theme/defaults.js.map +0 -1
- package/dist/theme/example.d.ts.map +0 -1
- package/dist/theme/example.js.map +0 -1
- package/dist/theme/index.d.ts.map +0 -1
- package/dist/theme/index.js.map +0 -1
- package/dist/theme/types.d.ts.map +0 -1
- package/dist/theme/types.js.map +0 -1
- package/dist/theme/utils.d.ts.map +0 -1
- package/dist/theme/utils.js.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/migration.d.ts.map +0 -1
- package/dist/utils/migration.js.map +0 -1
- package/dist/utils/validation.d.ts.map +0 -1
- package/dist/utils/validation.js.map +0 -1
- package/dist/version.d.ts.map +0 -1
- package/dist/version.js.map +0 -1
- package/dist/views/PuckConfigContext.d.ts.map +0 -1
- package/dist/views/PuckConfigContext.js.map +0 -1
- package/dist/views/PuckEditorView.d.ts.map +0 -1
- package/dist/views/PuckEditorView.js.map +0 -1
- package/dist/views/index.d.ts.map +0 -1
- package/dist/views/index.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/fields/PaddingField.tsx"],"sourcesContent":["'use client'\n\n/**\n * PaddingField - Custom Puck field for 4-sided padding/margin control\n *\n * This component provides:\n * - 4 number inputs for top/right/bottom/left\n * - Link/unlink toggle button (when linked, all values sync)\n * - Unit selector (px, rem)\n */\n\nimport React, { useCallback, memo, type CSSProperties } from 'react'\nimport type { CustomField } from '@puckeditor/core'\nimport { Link, Unlink } from 'lucide-react'\nimport type { PaddingValue } from './shared.js'\n\n// =============================================================================\n// Types\n// =============================================================================\n\ntype SpacingUnit = 'px' | 'rem' | 'em' | '%'\n\ninterface PaddingFieldProps {\n value: PaddingValue | null\n onChange: (value: PaddingValue | null) => void\n label?: string\n readOnly?: boolean\n showUnits?: boolean\n}\n\n// =============================================================================\n// Default Value\n// =============================================================================\n\nconst DEFAULT_VALUE: PaddingValue = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n unit: 'px',\n linked: true,\n}\n\n// =============================================================================\n// Styles\n// =============================================================================\n\nconst styles = {\n container: {\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n } as CSSProperties,\n header: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n } as CSSProperties,\n label: {\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--theme-elevation-800)',\n } as CSSProperties,\n linkButton: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '28px',\n height: '28px',\n padding: 0,\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: '4px',\n backgroundColor: 'var(--theme-bg)',\n color: 'var(--theme-elevation-500)',\n cursor: 'pointer',\n } as CSSProperties,\n linkButtonActive: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '28px',\n height: '28px',\n padding: 0,\n border: '1px solid var(--theme-elevation-800)',\n borderRadius: '4px',\n backgroundColor: 'var(--theme-elevation-800)',\n color: 'var(--theme-bg)',\n cursor: 'pointer',\n } as CSSProperties,\n grid: {\n display: 'grid',\n gridTemplateColumns: '1fr 1fr',\n gap: '8px',\n padding: '8px',\n backgroundColor: 'var(--theme-elevation-50)',\n borderRadius: '6px',\n } as CSSProperties,\n inputRow: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n } as CSSProperties,\n inputLabel: {\n fontSize: '10px',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n color: 'var(--theme-elevation-500)',\n width: '24px',\n textAlign: 'right',\n flexShrink: 0,\n } as CSSProperties,\n input: {\n height: '28px',\n width: '100%',\n padding: '0 4px',\n textAlign: 'center',\n fontSize: '14px',\n fontFamily: 'monospace',\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: '4px',\n backgroundColor: 'var(--theme-input-bg)',\n color: 'var(--theme-elevation-800)',\n } as CSSProperties,\n footer: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n flexWrap: 'wrap',\n gap: '8px',\n } as CSSProperties,\n unitGroup: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n } as CSSProperties,\n unitLabel: {\n fontSize: '12px',\n color: 'var(--theme-elevation-500)',\n } as CSSProperties,\n unitButtons: {\n display: 'flex',\n gap: '4px',\n } as CSSProperties,\n unitButton: {\n height: '28px',\n padding: '0 10px',\n fontSize: '12px',\n fontFamily: 'monospace',\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: '4px',\n backgroundColor: 'var(--theme-bg)',\n color: 'var(--theme-elevation-500)',\n cursor: 'pointer',\n } as CSSProperties,\n unitButtonActive: {\n height: '28px',\n padding: '0 10px',\n fontSize: '12px',\n fontFamily: 'monospace',\n border: '1px solid var(--theme-elevation-800)',\n borderRadius: '4px',\n backgroundColor: 'var(--theme-elevation-800)',\n color: 'var(--theme-bg)',\n cursor: 'pointer',\n } as CSSProperties,\n summary: {\n fontSize: '12px',\n fontFamily: 'monospace',\n color: 'var(--theme-elevation-500)',\n } as CSSProperties,\n}\n\n// =============================================================================\n// PaddingField Component\n// =============================================================================\n\nfunction PaddingFieldInner({\n value,\n onChange,\n label,\n readOnly,\n showUnits = true,\n}: PaddingFieldProps) {\n // Use default if no value\n const currentValue = value || DEFAULT_VALUE\n\n // Use explicit linked state from value, default to true if not set\n const isLinked = currentValue.linked ?? true\n\n // Handle individual side change\n const handleSideChange = useCallback((\n side: 'top' | 'right' | 'bottom' | 'left',\n newValue: number\n ) => {\n if (isLinked) {\n // When linked, update all sides\n onChange({\n ...currentValue,\n top: newValue,\n right: newValue,\n bottom: newValue,\n left: newValue,\n linked: true,\n })\n } else {\n // When unlinked, update only the specific side\n onChange({\n ...currentValue,\n [side]: newValue,\n linked: false,\n })\n }\n }, [currentValue, onChange, isLinked])\n\n // Handle link toggle\n const handleLinkToggle = useCallback(() => {\n if (isLinked) {\n // Unlinking - keep current values but mark as unlinked\n onChange({\n ...currentValue,\n linked: false,\n })\n } else {\n // Linking - set all sides to the top value and mark as linked\n onChange({\n ...currentValue,\n top: currentValue.top,\n right: currentValue.top,\n bottom: currentValue.top,\n left: currentValue.top,\n linked: true,\n })\n }\n }, [currentValue, onChange, isLinked])\n\n // Handle unit change\n const handleUnitChange = useCallback((unit: SpacingUnit) => {\n onChange({\n ...currentValue,\n unit,\n })\n }, [currentValue, onChange])\n\n // Render a single side input - compact horizontal layout\n const renderSideInput = (\n side: 'top' | 'right' | 'bottom' | 'left',\n sideLabel: string\n ) => (\n <div style={styles.inputRow}>\n <label style={styles.inputLabel as CSSProperties}>\n {sideLabel.charAt(0)}\n </label>\n <input\n type=\"number\"\n min={0}\n value={currentValue[side]}\n onChange={(e) => handleSideChange(side, parseInt(e.target.value, 10) || 0)}\n disabled={readOnly}\n style={styles.input as CSSProperties}\n />\n </div>\n )\n\n return (\n <div className=\"puck-field\" style={styles.container}>\n {/* Header with label and link toggle */}\n <div style={styles.header}>\n {label && (\n <label style={styles.label}>\n {label}\n </label>\n )}\n {/* Link/Unlink toggle button */}\n {!readOnly && (\n <button\n type=\"button\"\n onClick={handleLinkToggle}\n style={isLinked ? styles.linkButtonActive : styles.linkButton}\n title={isLinked ? 'Click to unlink (set sides individually)' : 'Click to link (all sides same value)'}\n >\n {isLinked ? (\n <Link style={{ width: '16px', height: '16px' }} />\n ) : (\n <Unlink style={{ width: '16px', height: '16px' }} />\n )}\n </button>\n )}\n </div>\n\n {/* Compact 2x2 grid layout */}\n <div style={styles.grid}>\n {renderSideInput('top', 'Top')}\n {renderSideInput('right', 'Right')}\n {renderSideInput('bottom', 'Bottom')}\n {renderSideInput('left', 'Left')}\n </div>\n\n {/* Unit selector and summary */}\n {showUnits && !readOnly && (\n <div style={styles.footer}>\n <div style={styles.unitGroup}>\n <label style={styles.unitLabel}>Unit:</label>\n <div style={styles.unitButtons}>\n {(['px', 'rem'] as SpacingUnit[]).map((unit) => {\n const isActive = currentValue.unit === unit\n return (\n <button\n key={unit}\n type=\"button\"\n onClick={() => handleUnitChange(unit)}\n style={isActive ? styles.unitButtonActive : styles.unitButton}\n >\n {unit}\n </button>\n )\n })}\n </div>\n </div>\n {/* Current value summary */}\n <span style={styles.summary}>\n {isLinked\n ? `${currentValue.top}${currentValue.unit}`\n : `${currentValue.top} ${currentValue.right} ${currentValue.bottom} ${currentValue.left}${currentValue.unit}`\n }\n </span>\n </div>\n )}\n </div>\n )\n}\n\nexport const PaddingField = memo(PaddingFieldInner)\n\n// =============================================================================\n// Field Configuration Factory\n// =============================================================================\n\n/**\n * Creates a Puck field configuration for padding/spacing\n */\nexport function createPaddingField(config: {\n label?: string\n showUnits?: boolean\n}): CustomField<PaddingValue | null> {\n return {\n type: 'custom',\n label: config.label,\n render: ({ value, onChange, readOnly }) => (\n <PaddingField\n value={value}\n onChange={onChange}\n label={config.label}\n readOnly={readOnly}\n showUnits={config.showUnits}\n />\n ),\n }\n}\n"],"names":["React","useCallback","memo","Link","Unlink","DEFAULT_VALUE","top","right","bottom","left","unit","linked","styles","container","display","flexDirection","gap","header","alignItems","justifyContent","label","fontSize","fontWeight","color","linkButton","width","height","padding","border","borderRadius","backgroundColor","cursor","linkButtonActive","grid","gridTemplateColumns","inputRow","inputLabel","textTransform","letterSpacing","textAlign","flexShrink","input","fontFamily","footer","flexWrap","unitGroup","unitLabel","unitButtons","unitButton","unitButtonActive","summary","PaddingFieldInner","value","onChange","readOnly","showUnits","currentValue","isLinked","handleSideChange","side","newValue","handleLinkToggle","handleUnitChange","renderSideInput","sideLabel","div","style","charAt","type","min","e","parseInt","target","disabled","className","button","onClick","title","map","isActive","span","PaddingField","createPaddingField","config","render"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PageSegmentField.d.ts","sourceRoot":"","sources":["../../src/fields/PageSegmentField.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAA;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAwBnD,UAAU,qBAAqB;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,UAAU,2BAA4B,SAAQ,qBAAqB;IACjE,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAMD,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,QAAQ,EACR,KAAsB,EACtB,WAA4B,GAC7B,EAAE,qBAAqB,qBAqFvB;AAMD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,CAAC,EAAE;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,GAAG,WAAW,CAAC,MAAM,CAAC,CAatB;AAMD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,KAAK,EACL,QAAQ,EACR,KAAsB,EACtB,WAA4B,EAC5B,cAAoD,GACrD,EAAE,2BAA2B,qBA4I7B;AAMD;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,CAAC,EAAE;IACpD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,GAAG,WAAW,CAAC,MAAM,CAAC,CActB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/fields/PageSegmentField.tsx"],"sourcesContent":["'use client'\n\n/**\n * PageSegmentField - Custom Puck field for page segment editing\n *\n * Provides an editable text field with automatic slugification.\n * Integrates with @delmaredigital/payload-page-tree plugin.\n *\n * Exports:\n * - PageSegmentField: Basic editable page segment field\n * - LockedPageSegmentField: Locked by default, requires clicking lock icon to edit\n * - createPageSegmentField: Factory for basic field\n * - createLockedPageSegmentField: Factory for locked field (recommended for page-tree)\n */\n\nimport React, { useState, useCallback, useEffect, useRef } from 'react'\nimport type { CustomField } from '@puckeditor/core'\nimport { Lock, Unlock } from 'lucide-react'\n\n// =============================================================================\n// Slugify Utility\n// =============================================================================\n\n/**\n * Converts a string to a URL-safe slug\n */\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, '') // Remove special characters\n .replace(/[\\s_]+/g, '-') // Replace spaces and underscores with hyphens\n .replace(/-+/g, '-') // Remove consecutive hyphens\n .replace(/^-+|-+$/g, '') // Remove leading/trailing hyphens\n}\n\n// =============================================================================\n// Types\n// =============================================================================\n\ninterface PageSegmentFieldProps {\n value: string\n onChange: (value: string) => void\n label?: string\n placeholder?: string\n}\n\ninterface LockedPageSegmentFieldProps extends PageSegmentFieldProps {\n warningMessage?: string\n}\n\n// =============================================================================\n// PageSegmentField Component\n// =============================================================================\n\nexport function PageSegmentField({\n value,\n onChange,\n label = 'Page Segment',\n placeholder = 'page-segment',\n}: PageSegmentFieldProps) {\n const [localValue, setLocalValue] = useState(value)\n const [isFocused, setIsFocused] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n\n // Sync with external value changes\n useEffect(() => {\n if (!isFocused) {\n setLocalValue(value)\n }\n }, [value, isFocused])\n\n const handleChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value\n setLocalValue(newValue)\n }, [])\n\n const handleBlur = useCallback(() => {\n setIsFocused(false)\n // Slugify on blur\n const slugified = slugify(localValue)\n setLocalValue(slugified)\n onChange(slugified)\n }, [localValue, onChange])\n\n const handleFocus = useCallback(() => {\n setIsFocused(true)\n }, [])\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n inputRef.current?.blur()\n }\n }, [])\n\n return (\n <div className=\"puck-field\">\n {/* Label */}\n <label\n style={{\n display: 'block',\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--puck-color-grey-04)',\n marginBottom: '8px',\n }}\n >\n {label}\n </label>\n\n {/* Input */}\n <input\n ref={inputRef}\n type=\"text\"\n value={localValue}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n style={{\n width: '100%',\n padding: '8px 12px',\n fontSize: '14px',\n border: `1px solid ${isFocused ? 'var(--puck-color-azure-06)' : 'var(--puck-color-grey-09)'}`,\n borderRadius: '6px',\n backgroundColor: 'var(--puck-color-white)',\n color: 'var(--puck-color-grey-04)',\n outline: 'none',\n transition: 'border-color 0.15s ease',\n }}\n />\n\n {/* Helper text */}\n <p\n style={{\n marginTop: '6px',\n fontSize: '12px',\n color: 'var(--puck-color-grey-06)',\n }}\n >\n Auto-slugified on blur. Used in URL path.\n </p>\n </div>\n )\n}\n\n// =============================================================================\n// Field Configuration Factory\n// =============================================================================\n\n/**\n * Creates a Puck field configuration for page segment editing\n */\nexport function createPageSegmentField(config?: {\n label?: string\n placeholder?: string\n}): CustomField<string> {\n return {\n type: 'custom',\n label: config?.label ?? 'Page Segment',\n render: ({ value, onChange }) => (\n <PageSegmentField\n value={value || ''}\n onChange={onChange}\n label={config?.label}\n placeholder={config?.placeholder}\n />\n ),\n }\n}\n\n// =============================================================================\n// LockedPageSegmentField Component\n// =============================================================================\n\n/**\n * PageSegmentField with lock/unlock functionality.\n * Starts locked to prevent accidental URL changes.\n */\nexport function LockedPageSegmentField({\n value,\n onChange,\n label = 'Page Segment',\n placeholder = 'page-segment',\n warningMessage = 'Changing may break existing links',\n}: LockedPageSegmentFieldProps) {\n const [isLocked, setIsLocked] = useState(true)\n const [localValue, setLocalValue] = useState(value)\n const [isFocused, setIsFocused] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n\n // Sync with external value changes\n useEffect(() => {\n if (!isFocused) {\n setLocalValue(value)\n }\n }, [value, isFocused])\n\n const handleChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value\n setLocalValue(newValue)\n }, [])\n\n const handleBlur = useCallback(() => {\n setIsFocused(false)\n // Slugify on blur\n const slugified = slugify(localValue)\n setLocalValue(slugified)\n onChange(slugified)\n }, [localValue, onChange])\n\n const handleFocus = useCallback(() => {\n setIsFocused(true)\n }, [])\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n inputRef.current?.blur()\n }\n }, [])\n\n return (\n <div className=\"puck-field\">\n {/* Field header with label and lock toggle */}\n <div\n className=\"puck-field-header\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: '8px',\n }}\n >\n <label\n style={{\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--puck-color-grey-04)',\n }}\n >\n {label}\n </label>\n <button\n type=\"button\"\n onClick={() => setIsLocked(!isLocked)}\n style={{\n background: 'none',\n border: 'none',\n padding: '4px',\n cursor: 'pointer',\n color: isLocked ? 'var(--puck-color-grey-05)' : 'var(--puck-color-azure-04)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '4px',\n transition: 'all 0.15s ease',\n }}\n title={isLocked ? 'Click to unlock' : 'Click to lock'}\n >\n {isLocked ? <Lock size={14} /> : <Unlock size={14} />}\n </button>\n </div>\n\n {/* Input field */}\n <div style={{ position: 'relative' }}>\n <input\n ref={inputRef}\n type=\"text\"\n value={localValue}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n disabled={isLocked}\n placeholder={placeholder}\n style={{\n width: '100%',\n padding: '8px 12px',\n paddingRight: isLocked ? '32px' : '12px',\n fontSize: '14px',\n border: `1px solid ${isFocused && !isLocked ? 'var(--puck-color-azure-06)' : 'var(--puck-color-grey-09)'}`,\n borderRadius: '6px',\n backgroundColor: isLocked ? 'var(--puck-color-grey-11)' : 'var(--puck-color-white)',\n color: isLocked ? 'var(--puck-color-grey-05)' : 'var(--puck-color-grey-04)',\n cursor: isLocked ? 'not-allowed' : 'text',\n outline: 'none',\n transition: 'all 0.15s ease',\n }}\n />\n {isLocked && (\n <Lock\n size={14}\n style={{\n position: 'absolute',\n right: '10px',\n top: '50%',\n transform: 'translateY(-50%)',\n color: 'var(--puck-color-grey-07)',\n }}\n />\n )}\n </div>\n\n {/* Helper text / Warning message */}\n <p\n style={{\n marginTop: '6px',\n fontSize: '12px',\n color: 'var(--puck-color-grey-06)',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n {!isLocked && warningMessage ? (\n <>\n <span style={{ color: 'var(--puck-color-rose-07)' }}>⚠</span>\n {warningMessage}\n </>\n ) : (\n 'Auto-slugified on blur. Used in URL path.'\n )}\n </p>\n </div>\n )\n}\n\n// =============================================================================\n// Locked Field Configuration Factory\n// =============================================================================\n\n/**\n * Creates a Puck field configuration for a locked page segment field.\n * Recommended for page-tree integration to prevent accidental URL changes.\n */\nexport function createLockedPageSegmentField(config?: {\n label?: string\n placeholder?: string\n warningMessage?: string\n}): CustomField<string> {\n return {\n type: 'custom',\n label: config?.label ?? 'Page Segment',\n render: ({ value, onChange }) => (\n <LockedPageSegmentField\n value={value || ''}\n onChange={onChange}\n label={config?.label}\n placeholder={config?.placeholder}\n warningMessage={config?.warningMessage}\n />\n ),\n }\n}\n"],"names":["React","useState","useCallback","useEffect","useRef","Lock","Unlock","slugify","text","toLowerCase","trim","replace","PageSegmentField","value","onChange","label","placeholder","localValue","setLocalValue","isFocused","setIsFocused","inputRef","handleChange","e","newValue","target","handleBlur","slugified","handleFocus","handleKeyDown","key","current","blur","div","className","style","display","fontSize","fontWeight","color","marginBottom","input","ref","type","onFocus","onBlur","onKeyDown","width","padding","border","borderRadius","backgroundColor","outline","transition","p","marginTop","createPageSegmentField","config","render","LockedPageSegmentField","warningMessage","isLocked","setIsLocked","alignItems","justifyContent","button","onClick","background","cursor","title","size","position","disabled","paddingRight","right","top","transform","gap","span","createLockedPageSegmentField"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ResetField.d.ts","sourceRoot":"","sources":["../../src/fields/ResetField.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,KAAgD,MAAM,OAAO,CAAA;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAYnD,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAqCD,iBAAS,eAAe,CAAC,EACvB,OAAO,EACP,KAA2B,EAC3B,QAAQ,GACT,EAAE,eAAe,qBA2BjB;AAED,eAAO,MAAM,UAAU,mDAAwB,CAAA;AA+C/C,UAAU,sBAAsB,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,CAAC,CAAA;CAChB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAC/C,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAChC,WAAW,CAAC,OAAO,CAAC,CAuCtB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/fields/ResetField.tsx"],"sourcesContent":["'use client'\n\n/**\n * ResetField - Custom Puck field for resetting component to defaults\n *\n * This field renders a reset button that clears all customizations\n * and restores the component to its default state.\n *\n * Uses Puck's usePuck hook and dispatch to properly update component data.\n */\n\nimport React, { memo, useCallback, type CSSProperties } from 'react'\nimport type { CustomField } from '@puckeditor/core'\nimport { createUsePuck } from '@puckeditor/core'\nimport type { Data } from '@puckeditor/core'\nimport { RefreshCw } from 'lucide-react'\n\n// Create usePuck hook for accessing editor state\nconst usePuck = createUsePuck()\n\n// =============================================================================\n// Types\n// =============================================================================\n\ninterface ResetFieldProps {\n onClick: () => void\n label?: string\n disabled?: boolean\n}\n\n// =============================================================================\n// Styles\n// =============================================================================\n\nconst styles = {\n container: {\n display: 'flex',\n flexDirection: 'column',\n } as CSSProperties,\n button: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '6px',\n width: '100%',\n padding: '6px 12px',\n fontSize: '14px',\n fontWeight: 500,\n border: 'none',\n borderRadius: '4px',\n backgroundColor: 'transparent',\n color: 'var(--theme-elevation-500)',\n cursor: 'pointer',\n transition: 'all 0.15s',\n } as CSSProperties,\n buttonDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n } as CSSProperties,\n}\n\n// =============================================================================\n// ResetField Component\n// =============================================================================\n\nfunction ResetFieldInner({\n onClick,\n label = 'Reset to defaults',\n disabled,\n}: ResetFieldProps) {\n return (\n <div className=\"puck-field\" style={styles.container}>\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n style={{\n ...styles.button,\n ...(disabled ? styles.buttonDisabled : {}),\n }}\n onMouseOver={(e) => {\n if (!disabled) {\n e.currentTarget.style.color = 'var(--theme-error-500)'\n e.currentTarget.style.backgroundColor = 'rgba(239, 68, 68, 0.1)'\n }\n }}\n onMouseOut={(e) => {\n e.currentTarget.style.color = 'var(--theme-elevation-500)'\n e.currentTarget.style.backgroundColor = 'transparent'\n }}\n >\n <RefreshCw style={{ width: '14px', height: '14px' }} />\n {label}\n </button>\n </div>\n )\n}\n\nexport const ResetField = memo(ResetFieldInner)\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Recursively update a component's props in Puck data structure\n */\nfunction updateComponentInData(\n data: Data,\n componentId: string,\n newProps: Record<string, unknown>\n): Data {\n const updateItem = (item: { type: string; props: Record<string, unknown> }) => {\n if (item.props?.id === componentId) {\n return {\n ...item,\n props: {\n ...newProps,\n id: componentId,\n },\n }\n }\n return item\n }\n\n const updatedContent = data.content.map(updateItem)\n\n const updatedZones: Record<string, Array<{ type: string; props: Record<string, unknown> }>> = {}\n if (data.zones) {\n for (const [zoneName, zoneContent] of Object.entries(data.zones)) {\n updatedZones[zoneName] = (zoneContent as Array<{ type: string; props: Record<string, unknown> }>).map(updateItem)\n }\n }\n\n return {\n ...data,\n content: updatedContent,\n zones: Object.keys(updatedZones).length > 0 ? updatedZones : data.zones,\n }\n}\n\n// =============================================================================\n// Field Configuration Factory\n// =============================================================================\n\ninterface CreateResetFieldConfig<T> {\n label?: string\n defaultProps: T\n}\n\n/**\n * Creates a Puck field configuration for a reset button\n */\nexport function createResetField<T extends object>(\n config: CreateResetFieldConfig<T>\n): CustomField<unknown> {\n const ResetFieldWrapper = ({ readOnly }: { readOnly?: boolean }) => {\n const appState = usePuck((s) => s.appState)\n const dispatch = usePuck((s) => s.dispatch)\n const selectedItem = usePuck((s) => s.selectedItem)\n\n const handleReset = useCallback(() => {\n if (!selectedItem?.props?.id) {\n console.warn('ResetField: No selected item found')\n return\n }\n\n const componentId = selectedItem.props.id as string\n\n const updatedData = updateComponentInData(\n appState.data,\n componentId,\n config.defaultProps as unknown as Record<string, unknown>\n )\n\n dispatch({\n type: 'setData',\n data: updatedData,\n })\n }, [appState.data, dispatch, selectedItem])\n\n return (\n <ResetField\n onClick={handleReset}\n label={config.label}\n disabled={readOnly}\n />\n )\n }\n\n return {\n type: 'custom',\n render: ({ readOnly }) => <ResetFieldWrapper readOnly={readOnly} />,\n }\n}\n"],"names":["React","memo","useCallback","createUsePuck","RefreshCw","usePuck","styles","container","display","flexDirection","button","alignItems","justifyContent","gap","width","padding","fontSize","fontWeight","border","borderRadius","backgroundColor","color","cursor","transition","buttonDisabled","opacity","ResetFieldInner","onClick","label","disabled","div","className","style","type","onMouseOver","e","currentTarget","onMouseOut","height","ResetField","updateComponentInData","data","componentId","newProps","updateItem","item","props","id","updatedContent","content","map","updatedZones","zones","zoneName","zoneContent","Object","entries","keys","length","createResetField","config","ResetFieldWrapper","readOnly","appState","s","dispatch","selectedItem","handleReset","console","warn","updatedData","defaultProps","render"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ResponsiveField.d.ts","sourceRoot":"","sources":["../../src/fields/ResponsiveField.tsx"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,OAAO,KAA0D,MAAM,OAAO,CAAA;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAQnD,OAAO,KAAK,EAAc,eAAe,EAAE,MAAM,aAAa,CAAA;AAO9D,UAAU,oBAAoB,CAAC,CAAC;IAC9B,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;IAChC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,IAAI,CAAA;IACpD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,0CAA0C;IAC1C,gBAAgB,EAAE,CAAC,KAAK,EAAE;QACxB,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;QACf,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,CAAA;QAC/B,QAAQ,CAAC,EAAE,OAAO,CAAA;KACnB,KAAK,KAAK,CAAC,SAAS,CAAA;IACrB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,CAAC,CAAA;CACjB;AA4XD,eAAO,MAAM,eAAe,EAAiC,CAAC,CAAC,EAC7D,KAAK,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAC3B,KAAK,CAAC,YAAY,CAAA;AAMvB,UAAU,2BAA2B,CAAC,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IACjE,YAAY,CAAC,EAAE,CAAC,CAAA;CACjB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EACrC,MAAM,EAAE,2BAA2B,CAAC,CAAC,CAAC,GACrC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CA6BxC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/fields/ResponsiveField.tsx"],"sourcesContent":["'use client'\n\n/**\n * ResponsiveField - Generic wrapper for breakpoint-specific field overrides\n *\n * This component wraps any existing field to provide responsive overrides\n * at different breakpoints (xs, sm, md, lg, xl). It uses sparse storage,\n * only storing values for breakpoints that have explicit overrides.\n */\n\nimport React, { useState, useCallback, memo, type CSSProperties } from 'react'\nimport type { CustomField } from '@puckeditor/core'\nimport {\n Smartphone,\n Tablet,\n Laptop,\n Monitor,\n X,\n} from 'lucide-react'\nimport type { Breakpoint, ResponsiveValue } from './shared.js'\nimport { BREAKPOINTS } from './shared.js'\n\n// =============================================================================\n// Types\n// =============================================================================\n\ninterface ResponsiveFieldProps<T> {\n value: ResponsiveValue<T> | null\n onChange: (value: ResponsiveValue<T> | null) => void\n label?: string\n readOnly?: boolean\n /** Render function for the inner field */\n renderInnerField: (props: {\n value: T | null\n onChange: (v: T | null) => void\n readOnly?: boolean\n }) => React.ReactNode\n /** Default value for the xs breakpoint */\n defaultValue?: T\n}\n\n// =============================================================================\n// Breakpoint Icons\n// =============================================================================\n\nconst BREAKPOINT_ICONS: Record<Breakpoint, React.ComponentType<{ style?: CSSProperties }>> = {\n xs: Smartphone,\n sm: Smartphone,\n md: Tablet,\n lg: Laptop,\n xl: Monitor,\n}\n\n// =============================================================================\n// Styles\n// =============================================================================\n\nconst styles = {\n container: {\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n } as CSSProperties,\n header: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n } as CSSProperties,\n labelGroup: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n } as CSSProperties,\n label: {\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--theme-elevation-800)',\n } as CSSProperties,\n overrideBadge: {\n fontSize: '12px',\n color: 'var(--theme-elevation-500)',\n backgroundColor: 'var(--theme-elevation-100)',\n padding: '2px 6px',\n borderRadius: '4px',\n } as CSSProperties,\n clearButton: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '24px',\n height: '24px',\n padding: 0,\n border: 'none',\n borderRadius: '4px',\n backgroundColor: 'transparent',\n color: 'var(--theme-elevation-500)',\n cursor: 'pointer',\n } as CSSProperties,\n tabsContainer: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: '4px',\n padding: '4px',\n backgroundColor: 'var(--theme-elevation-50)',\n borderRadius: '8px',\n } as CSSProperties,\n tab: {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '4px',\n padding: '6px 8px',\n fontSize: '12px',\n fontWeight: 500,\n borderRadius: '6px',\n border: 'none',\n cursor: 'pointer',\n transition: 'all 0.15s',\n flex: '1 1 auto',\n minWidth: '52px',\n backgroundColor: 'var(--theme-elevation-100)',\n color: 'var(--theme-elevation-500)',\n } as CSSProperties,\n tabActive: {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '4px',\n padding: '6px 8px',\n fontSize: '12px',\n fontWeight: 500,\n borderRadius: '6px',\n border: 'none',\n cursor: 'pointer',\n transition: 'all 0.15s',\n flex: '1 1 auto',\n minWidth: '52px',\n backgroundColor: 'var(--theme-elevation-800)',\n color: 'var(--theme-bg)',\n } as CSSProperties,\n tabDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n } as CSSProperties,\n overrideIndicator: {\n position: 'absolute',\n top: '-2px',\n right: '-2px',\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: 'var(--theme-elevation-800)',\n } as CSSProperties,\n infoRow: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n fontSize: '12px',\n color: 'var(--theme-elevation-500)',\n } as CSSProperties,\n clearOverrideButton: {\n padding: '2px 8px',\n fontSize: '12px',\n border: 'none',\n borderRadius: '4px',\n backgroundColor: 'transparent',\n color: 'var(--theme-elevation-500)',\n cursor: 'pointer',\n } as CSSProperties,\n innerFieldContainer: {\n padding: '12px',\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: '6px',\n } as CSSProperties,\n}\n\n// =============================================================================\n// Breakpoint Tab Button\n// =============================================================================\n\ninterface BreakpointTabProps {\n breakpoint: Breakpoint\n label: string\n minWidth: number | null\n isActive: boolean\n hasOverride: boolean\n onClick: () => void\n disabled?: boolean\n}\n\nfunction BreakpointTab({\n breakpoint,\n label,\n minWidth,\n isActive,\n hasOverride,\n onClick,\n disabled,\n}: BreakpointTabProps) {\n const Icon = BREAKPOINT_ICONS[breakpoint]\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n title={minWidth ? `${label} (${minWidth}px+)` : label}\n style={{\n ...(isActive ? styles.tabActive : styles.tab),\n ...(disabled ? styles.tabDisabled : {}),\n }}\n >\n <Icon style={{ width: '14px', height: '14px' }} />\n <span>{label}</span>\n {/* Override indicator dot */}\n {hasOverride && !isActive && (\n <span style={styles.overrideIndicator as CSSProperties} />\n )}\n </button>\n )\n}\n\n// =============================================================================\n// ResponsiveField Component\n// =============================================================================\n\nfunction ResponsiveFieldInner<T>({\n value,\n onChange,\n label,\n readOnly,\n renderInnerField,\n defaultValue,\n}: ResponsiveFieldProps<T>) {\n const [activeBreakpoint, setActiveBreakpoint] = useState<Breakpoint>('xs')\n\n // Get the current value for the active breakpoint\n const getCurrentValue = useCallback((): T | null => {\n if (!value) return null\n\n if (activeBreakpoint === 'xs') {\n return value.xs ?? defaultValue ?? null\n }\n\n const override = value[activeBreakpoint]\n if (override !== undefined) {\n return override\n }\n\n const breakpointOrder: Breakpoint[] = ['xl', 'lg', 'md', 'sm', 'xs']\n const activeIndex = breakpointOrder.indexOf(activeBreakpoint)\n\n for (let i = activeIndex + 1; i < breakpointOrder.length; i++) {\n const bp = breakpointOrder[i]\n const val = value[bp]\n if (val !== undefined) {\n return val\n }\n }\n\n return defaultValue ?? null\n }, [value, activeBreakpoint, defaultValue])\n\n const hasOverride = useCallback(\n (breakpoint: Breakpoint): boolean => {\n if (!value) return false\n if (breakpoint === 'xs') return false\n return value[breakpoint] !== undefined\n },\n [value]\n )\n\n const getInheritanceSource = useCallback((): Breakpoint | null => {\n if (!value || activeBreakpoint === 'xs') return null\n if (value[activeBreakpoint] !== undefined) return null\n\n const breakpointOrder: Breakpoint[] = ['xl', 'lg', 'md', 'sm', 'xs']\n const activeIndex = breakpointOrder.indexOf(activeBreakpoint)\n\n for (let i = activeIndex + 1; i < breakpointOrder.length; i++) {\n const bp = breakpointOrder[i]\n if (value[bp] !== undefined) {\n return bp\n }\n }\n\n return null\n }, [value, activeBreakpoint])\n\n const handleInnerChange = useCallback(\n (newValue: T | null) => {\n if (activeBreakpoint === 'xs') {\n if (newValue === null) {\n onChange(null)\n } else {\n onChange({ ...value, xs: newValue } as ResponsiveValue<T>)\n }\n } else {\n if (newValue === null) {\n if (!value) return\n const newResponsive = { ...value }\n delete newResponsive[activeBreakpoint]\n onChange(newResponsive)\n } else {\n const xs = value?.xs ?? defaultValue\n if (xs === undefined) return\n onChange({\n ...value,\n xs,\n [activeBreakpoint]: newValue,\n } as ResponsiveValue<T>)\n }\n }\n },\n [value, onChange, activeBreakpoint, defaultValue]\n )\n\n const handleClearOverride = useCallback(() => {\n if (activeBreakpoint === 'xs' || !value) return\n const newResponsive = { ...value }\n delete newResponsive[activeBreakpoint]\n onChange(newResponsive)\n }, [value, onChange, activeBreakpoint])\n\n const handleClearAll = useCallback(() => {\n onChange(null)\n }, [onChange])\n\n const currentValue = getCurrentValue()\n const isOverrideBreakpoint = activeBreakpoint !== 'xs'\n const currentHasOverride = hasOverride(activeBreakpoint)\n const inheritanceSource = getInheritanceSource()\n\n const overrideCount = value\n ? (['sm', 'md', 'lg', 'xl'] as Breakpoint[]).filter((bp) => value[bp] !== undefined).length\n : 0\n\n return (\n <div className=\"puck-field\" style={styles.container}>\n {/* Header */}\n <div style={styles.header}>\n {label && (\n <div style={styles.labelGroup}>\n <label style={styles.label}>{label}</label>\n {overrideCount > 0 && (\n <span style={styles.overrideBadge}>\n {overrideCount} override{overrideCount !== 1 ? 's' : ''}\n </span>\n )}\n </div>\n )}\n {value && !readOnly && (\n <button\n type=\"button\"\n onClick={handleClearAll}\n style={styles.clearButton}\n title=\"Clear all values\"\n >\n <X style={{ width: '16px', height: '16px' }} />\n </button>\n )}\n </div>\n\n {/* Breakpoint Tabs */}\n <div style={styles.tabsContainer}>\n {BREAKPOINTS.map((bp) => (\n <BreakpointTab\n key={bp.key}\n breakpoint={bp.key}\n label={bp.label}\n minWidth={bp.minWidth}\n isActive={activeBreakpoint === bp.key}\n hasOverride={hasOverride(bp.key)}\n onClick={() => setActiveBreakpoint(bp.key)}\n disabled={readOnly}\n />\n ))}\n </div>\n\n {/* Active Breakpoint Info */}\n <div style={styles.infoRow}>\n <span>\n {activeBreakpoint === 'xs' ? (\n 'Extra small screens (0-639px)'\n ) : (\n <>\n {BREAKPOINTS.find((bp) => bp.key === activeBreakpoint)?.minWidth}px and up\n {!currentHasOverride && inheritanceSource && (\n <span style={{ color: 'var(--theme-elevation-400)' }}> (inheriting from {inheritanceSource.toUpperCase()})</span>\n )}\n </>\n )}\n </span>\n\n {isOverrideBreakpoint && currentHasOverride && !readOnly && (\n <button\n type=\"button\"\n onClick={handleClearOverride}\n style={styles.clearOverrideButton}\n >\n Clear override\n </button>\n )}\n </div>\n\n {/* Inner Field */}\n <div style={styles.innerFieldContainer}>\n {renderInnerField({\n value: currentValue,\n onChange: handleInnerChange,\n readOnly,\n })}\n </div>\n </div>\n )\n}\n\nexport const ResponsiveField = memo(ResponsiveFieldInner) as <T>(\n props: ResponsiveFieldProps<T>\n) => React.ReactElement\n\n// =============================================================================\n// Field Configuration Factory\n// =============================================================================\n\ninterface CreateResponsiveFieldConfig<T> {\n label?: string\n innerField: (config: { label?: string }) => CustomField<T | null>\n defaultValue?: T\n}\n\n/**\n * Creates a responsive wrapper around any Puck custom field.\n */\nexport function createResponsiveField<T>(\n config: CreateResponsiveFieldConfig<T>\n): CustomField<ResponsiveValue<T> | null> {\n const innerFieldConfig = config.innerField({ label: undefined })\n\n return {\n type: 'custom',\n label: config.label,\n render: ({ value, onChange, readOnly }) => (\n <ResponsiveField\n value={value}\n onChange={onChange}\n label={config.label}\n readOnly={readOnly}\n defaultValue={config.defaultValue}\n renderInnerField={(props) => {\n if (innerFieldConfig.type === 'custom' && innerFieldConfig.render) {\n return innerFieldConfig.render({\n field: innerFieldConfig,\n value: props.value,\n onChange: props.onChange,\n readOnly: props.readOnly,\n name: 'responsive-inner',\n id: 'responsive-inner',\n })\n }\n return null\n }}\n />\n ),\n }\n}\n"],"names":["React","useState","useCallback","memo","Smartphone","Tablet","Laptop","Monitor","X","BREAKPOINTS","BREAKPOINT_ICONS","xs","sm","md","lg","xl","styles","container","display","flexDirection","gap","header","alignItems","justifyContent","labelGroup","label","fontSize","fontWeight","color","overrideBadge","backgroundColor","padding","borderRadius","clearButton","width","height","border","cursor","tabsContainer","flexWrap","tab","position","transition","flex","minWidth","tabActive","tabDisabled","opacity","overrideIndicator","top","right","infoRow","clearOverrideButton","innerFieldContainer","BreakpointTab","breakpoint","isActive","hasOverride","onClick","disabled","Icon","button","type","title","style","span","ResponsiveFieldInner","value","onChange","readOnly","renderInnerField","defaultValue","activeBreakpoint","setActiveBreakpoint","getCurrentValue","override","undefined","breakpointOrder","activeIndex","indexOf","i","length","bp","val","getInheritanceSource","handleInnerChange","newValue","newResponsive","handleClearOverride","handleClearAll","currentValue","isOverrideBreakpoint","currentHasOverride","inheritanceSource","overrideCount","filter","div","className","map","key","find","toUpperCase","ResponsiveField","createResponsiveField","config","innerFieldConfig","innerField","render","props","field","name","id"],"mappings":"AAAA;;AAEA;;;;;;CAMC,GAED,OAAOA,SAASC,QAAQ,EAAEC,WAAW,EAAEC,IAAI,QAA4B,QAAO;AAE9E,SACEC,UAAU,EACVC,MAAM,EACNC,MAAM,EACNC,OAAO,EACPC,CAAC,QACI,eAAc;AAErB,SAASC,WAAW,QAAQ,cAAa;AAqBzC,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF,MAAMC,mBAAuF;IAC3FC,IAAIP;IACJQ,IAAIR;IACJS,IAAIR;IACJS,IAAIR;IACJS,IAAIR;AACN;AAEA,gFAAgF;AAChF,SAAS;AACT,gFAAgF;AAEhF,MAAMS,SAAS;IACbC,WAAW;QACTC,SAAS;QACTC,eAAe;QACfC,KAAK;IACP;IACAC,QAAQ;QACNH,SAAS;QACTI,YAAY;QACZC,gBAAgB;IAClB;IACAC,YAAY;QACVN,SAAS;QACTI,YAAY;QACZF,KAAK;IACP;IACAK,OAAO;QACLC,UAAU;QACVC,YAAY;QACZC,OAAO;IACT;IACAC,eAAe;QACbH,UAAU;QACVE,OAAO;QACPE,iBAAiB;QACjBC,SAAS;QACTC,cAAc;IAChB;IACAC,aAAa;QACXf,SAAS;QACTI,YAAY;QACZC,gBAAgB;QAChBW,OAAO;QACPC,QAAQ;QACRJ,SAAS;QACTK,QAAQ;QACRJ,cAAc;QACdF,iBAAiB;QACjBF,OAAO;QACPS,QAAQ;IACV;IACAC,eAAe;QACbpB,SAAS;QACTqB,UAAU;QACVnB,KAAK;QACLW,SAAS;QACTD,iBAAiB;QACjBE,cAAc;IAChB;IACAQ,KAAK;QACHC,UAAU;QACVvB,SAAS;QACTI,YAAY;QACZC,gBAAgB;QAChBH,KAAK;QACLW,SAAS;QACTL,UAAU;QACVC,YAAY;QACZK,cAAc;QACdI,QAAQ;QACRC,QAAQ;QACRK,YAAY;QACZC,MAAM;QACNC,UAAU;QACVd,iBAAiB;QACjBF,OAAO;IACT;IACAiB,WAAW;QACTJ,UAAU;QACVvB,SAAS;QACTI,YAAY;QACZC,gBAAgB;QAChBH,KAAK;QACLW,SAAS;QACTL,UAAU;QACVC,YAAY;QACZK,cAAc;QACdI,QAAQ;QACRC,QAAQ;QACRK,YAAY;QACZC,MAAM;QACNC,UAAU;QACVd,iBAAiB;QACjBF,OAAO;IACT;IACAkB,aAAa;QACXC,SAAS;QACTV,QAAQ;IACV;IACAW,mBAAmB;QACjBP,UAAU;QACVQ,KAAK;QACLC,OAAO;QACPhB,OAAO;QACPC,QAAQ;QACRH,cAAc;QACdF,iBAAiB;IACnB;IACAqB,SAAS;QACPjC,SAAS;QACTI,YAAY;QACZC,gBAAgB;QAChBG,UAAU;QACVE,OAAO;IACT;IACAwB,qBAAqB;QACnBrB,SAAS;QACTL,UAAU;QACVU,QAAQ;QACRJ,cAAc;QACdF,iBAAiB;QACjBF,OAAO;QACPS,QAAQ;IACV;IACAgB,qBAAqB;QACnBtB,SAAS;QACTK,QAAQ;QACRJ,cAAc;IAChB;AACF;AAgBA,SAASsB,cAAc,EACrBC,UAAU,EACV9B,KAAK,EACLmB,QAAQ,EACRY,QAAQ,EACRC,WAAW,EACXC,OAAO,EACPC,QAAQ,EACW;IACnB,MAAMC,OAAOlD,gBAAgB,CAAC6C,WAAW;IAEzC,qBACE,MAACM;QACCC,MAAK;QACLJ,SAASA;QACTC,UAAUA;QACVI,OAAOnB,WAAW,GAAGnB,MAAM,EAAE,EAAEmB,SAAS,IAAI,CAAC,GAAGnB;QAChDuC,OAAO;YACL,GAAIR,WAAWxC,OAAO6B,SAAS,GAAG7B,OAAOwB,GAAG;YAC5C,GAAImB,WAAW3C,OAAO8B,WAAW,GAAG,CAAC,CAAC;QACxC;;0BAEA,KAACc;gBAAKI,OAAO;oBAAE9B,OAAO;oBAAQC,QAAQ;gBAAO;;0BAC7C,KAAC8B;0BAAMxC;;YAENgC,eAAe,CAACD,0BACf,KAACS;gBAAKD,OAAOhD,OAAOgC,iBAAiB;;;;AAI7C;AAEA,gFAAgF;AAChF,4BAA4B;AAC5B,gFAAgF;AAEhF,SAASkB,qBAAwB,EAC/BC,KAAK,EACLC,QAAQ,EACR3C,KAAK,EACL4C,QAAQ,EACRC,gBAAgB,EAChBC,YAAY,EACY;IACxB,MAAM,CAACC,kBAAkBC,oBAAoB,GAAGxE,SAAqB;IAErE,kDAAkD;IAClD,MAAMyE,kBAAkBxE,YAAY;QAClC,IAAI,CAACiE,OAAO,OAAO;QAEnB,IAAIK,qBAAqB,MAAM;YAC7B,OAAOL,MAAMxD,EAAE,IAAI4D,gBAAgB;QACrC;QAEA,MAAMI,WAAWR,KAAK,CAACK,iBAAiB;QACxC,IAAIG,aAAaC,WAAW;YAC1B,OAAOD;QACT;QAEA,MAAME,kBAAgC;YAAC;YAAM;YAAM;YAAM;YAAM;SAAK;QACpE,MAAMC,cAAcD,gBAAgBE,OAAO,CAACP;QAE5C,IAAK,IAAIQ,IAAIF,cAAc,GAAGE,IAAIH,gBAAgBI,MAAM,EAAED,IAAK;YAC7D,MAAME,KAAKL,eAAe,CAACG,EAAE;YAC7B,MAAMG,MAAMhB,KAAK,CAACe,GAAG;YACrB,IAAIC,QAAQP,WAAW;gBACrB,OAAOO;YACT;QACF;QAEA,OAAOZ,gBAAgB;IACzB,GAAG;QAACJ;QAAOK;QAAkBD;KAAa;IAE1C,MAAMd,cAAcvD,YAClB,CAACqD;QACC,IAAI,CAACY,OAAO,OAAO;QACnB,IAAIZ,eAAe,MAAM,OAAO;QAChC,OAAOY,KAAK,CAACZ,WAAW,KAAKqB;IAC/B,GACA;QAACT;KAAM;IAGT,MAAMiB,uBAAuBlF,YAAY;QACvC,IAAI,CAACiE,SAASK,qBAAqB,MAAM,OAAO;QAChD,IAAIL,KAAK,CAACK,iBAAiB,KAAKI,WAAW,OAAO;QAElD,MAAMC,kBAAgC;YAAC;YAAM;YAAM;YAAM;YAAM;SAAK;QACpE,MAAMC,cAAcD,gBAAgBE,OAAO,CAACP;QAE5C,IAAK,IAAIQ,IAAIF,cAAc,GAAGE,IAAIH,gBAAgBI,MAAM,EAAED,IAAK;YAC7D,MAAME,KAAKL,eAAe,CAACG,EAAE;YAC7B,IAAIb,KAAK,CAACe,GAAG,KAAKN,WAAW;gBAC3B,OAAOM;YACT;QACF;QAEA,OAAO;IACT,GAAG;QAACf;QAAOK;KAAiB;IAE5B,MAAMa,oBAAoBnF,YACxB,CAACoF;QACC,IAAId,qBAAqB,MAAM;YAC7B,IAAIc,aAAa,MAAM;gBACrBlB,SAAS;YACX,OAAO;gBACLA,SAAS;oBAAE,GAAGD,KAAK;oBAAExD,IAAI2E;gBAAS;YACpC;QACF,OAAO;YACL,IAAIA,aAAa,MAAM;gBACrB,IAAI,CAACnB,OAAO;gBACZ,MAAMoB,gBAAgB;oBAAE,GAAGpB,KAAK;gBAAC;gBACjC,OAAOoB,aAAa,CAACf,iBAAiB;gBACtCJ,SAASmB;YACX,OAAO;gBACL,MAAM5E,KAAKwD,OAAOxD,MAAM4D;gBACxB,IAAI5D,OAAOiE,WAAW;gBACtBR,SAAS;oBACP,GAAGD,KAAK;oBACRxD;oBACA,CAAC6D,iBAAiB,EAAEc;gBACtB;YACF;QACF;IACF,GACA;QAACnB;QAAOC;QAAUI;QAAkBD;KAAa;IAGnD,MAAMiB,sBAAsBtF,YAAY;QACtC,IAAIsE,qBAAqB,QAAQ,CAACL,OAAO;QACzC,MAAMoB,gBAAgB;YAAE,GAAGpB,KAAK;QAAC;QACjC,OAAOoB,aAAa,CAACf,iBAAiB;QACtCJ,SAASmB;IACX,GAAG;QAACpB;QAAOC;QAAUI;KAAiB;IAEtC,MAAMiB,iBAAiBvF,YAAY;QACjCkE,SAAS;IACX,GAAG;QAACA;KAAS;IAEb,MAAMsB,eAAehB;IACrB,MAAMiB,uBAAuBnB,qBAAqB;IAClD,MAAMoB,qBAAqBnC,YAAYe;IACvC,MAAMqB,oBAAoBT;IAE1B,MAAMU,gBAAgB3B,QAClB,AAAC;QAAC;QAAM;QAAM;QAAM;KAAK,CAAkB4B,MAAM,CAAC,CAACb,KAAOf,KAAK,CAACe,GAAG,KAAKN,WAAWK,MAAM,GACzF;IAEJ,qBACE,MAACe;QAAIC,WAAU;QAAajC,OAAOhD,OAAOC,SAAS;;0BAEjD,MAAC+E;gBAAIhC,OAAOhD,OAAOK,MAAM;;oBACtBI,uBACC,MAACuE;wBAAIhC,OAAOhD,OAAOQ,UAAU;;0CAC3B,KAACC;gCAAMuC,OAAOhD,OAAOS,KAAK;0CAAGA;;4BAC5BqE,gBAAgB,mBACf,MAAC7B;gCAAKD,OAAOhD,OAAOa,aAAa;;oCAC9BiE;oCAAc;oCAAUA,kBAAkB,IAAI,MAAM;;;;;oBAK5D3B,SAAS,CAACE,0BACT,KAACR;wBACCC,MAAK;wBACLJ,SAAS+B;wBACTzB,OAAOhD,OAAOiB,WAAW;wBACzB8B,OAAM;kCAEN,cAAA,KAACvD;4BAAEwD,OAAO;gCAAE9B,OAAO;gCAAQC,QAAQ;4BAAO;;;;;0BAMhD,KAAC6D;gBAAIhC,OAAOhD,OAAOsB,aAAa;0BAC7B7B,YAAYyF,GAAG,CAAC,CAAChB,mBAChB,KAAC5B;wBAECC,YAAY2B,GAAGiB,GAAG;wBAClB1E,OAAOyD,GAAGzD,KAAK;wBACfmB,UAAUsC,GAAGtC,QAAQ;wBACrBY,UAAUgB,qBAAqBU,GAAGiB,GAAG;wBACrC1C,aAAaA,YAAYyB,GAAGiB,GAAG;wBAC/BzC,SAAS,IAAMe,oBAAoBS,GAAGiB,GAAG;wBACzCxC,UAAUU;uBAPLa,GAAGiB,GAAG;;0BAajB,MAACH;gBAAIhC,OAAOhD,OAAOmC,OAAO;;kCACxB,KAACc;kCACEO,qBAAqB,OACpB,gDAEA;;gCACG/D,YAAY2F,IAAI,CAAC,CAAClB,KAAOA,GAAGiB,GAAG,KAAK3B,mBAAmB5B;gCAAS;gCAChE,CAACgD,sBAAsBC,mCACtB,MAAC5B;oCAAKD,OAAO;wCAAEpC,OAAO;oCAA6B;;wCAAG;wCAAmBiE,kBAAkBQ,WAAW;wCAAG;;;;;;oBAMhHV,wBAAwBC,sBAAsB,CAACvB,0BAC9C,KAACR;wBACCC,MAAK;wBACLJ,SAAS8B;wBACTxB,OAAOhD,OAAOoC,mBAAmB;kCAClC;;;;0BAOL,KAAC4C;gBAAIhC,OAAOhD,OAAOqC,mBAAmB;0BACnCiB,iBAAiB;oBAChBH,OAAOuB;oBACPtB,UAAUiB;oBACVhB;gBACF;;;;AAIR;AAEA,OAAO,MAAMiC,gCAAkBnG,KAAK+D,sBAEb;AAYvB;;CAEC,GACD,OAAO,SAASqC,sBACdC,MAAsC;IAEtC,MAAMC,mBAAmBD,OAAOE,UAAU,CAAC;QAAEjF,OAAOmD;IAAU;IAE9D,OAAO;QACLd,MAAM;QACNrC,OAAO+E,OAAO/E,KAAK;QACnBkF,QAAQ,CAAC,EAAExC,KAAK,EAAEC,QAAQ,EAAEC,QAAQ,EAAE,iBACpC,KAACiC;gBACCnC,OAAOA;gBACPC,UAAUA;gBACV3C,OAAO+E,OAAO/E,KAAK;gBACnB4C,UAAUA;gBACVE,cAAciC,OAAOjC,YAAY;gBACjCD,kBAAkB,CAACsC;oBACjB,IAAIH,iBAAiB3C,IAAI,KAAK,YAAY2C,iBAAiBE,MAAM,EAAE;wBACjE,OAAOF,iBAAiBE,MAAM,CAAC;4BAC7BE,OAAOJ;4BACPtC,OAAOyC,MAAMzC,KAAK;4BAClBC,UAAUwC,MAAMxC,QAAQ;4BACxBC,UAAUuC,MAAMvC,QAAQ;4BACxByC,MAAM;4BACNC,IAAI;wBACN;oBACF;oBACA,OAAO;gBACT;;IAGN;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ResponsiveVisibilityField.d.ts","sourceRoot":"","sources":["../../src/fields/ResponsiveVisibilityField.tsx"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,OAAO,KAAgD,MAAM,OAAO,CAAA;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AASnD,OAAO,KAAK,EAAc,eAAe,EAAE,MAAM,aAAa,CAAA;AAO9D,UAAU,8BAA8B;IACtC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAA;IAC7B,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAA;IACjD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AA8ID,iBAAS,8BAA8B,CAAC,EACtC,KAAK,EACL,QAAQ,EACR,KAAK,EACL,QAAQ,GACT,EAAE,8BAA8B,qBA+DhC;AAED,eAAO,MAAM,yBAAyB,kEAAuC,CAAA;AAM7E,UAAU,qCAAqC;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;;;;;;GASG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,GAAE,qCAA0C,GACjD,WAAW,CAAC,eAAe,GAAG,IAAI,CAAC,CAarC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/fields/ResponsiveVisibilityField.tsx"],"sourcesContent":["'use client'\n\n/**\n * ResponsiveVisibilityField - Show/hide elements at different breakpoints\n *\n * Provides a compact visual interface for toggling element visibility\n * at each breakpoint (xs, sm, md, lg, xl). Simple independent toggles\n * like Elementor/Divi - each breakpoint is just on or off.\n */\n\nimport React, { useCallback, memo, type CSSProperties } from 'react'\nimport type { CustomField } from '@puckeditor/core'\nimport {\n Smartphone,\n Tablet,\n Laptop,\n Monitor,\n Eye,\n EyeOff,\n} from 'lucide-react'\nimport type { Breakpoint, VisibilityValue } from './shared.js'\nimport { BREAKPOINTS, DEFAULT_VISIBILITY } from './shared.js'\n\n// =============================================================================\n// Types\n// =============================================================================\n\ninterface ResponsiveVisibilityFieldProps {\n value: VisibilityValue | null\n onChange: (value: VisibilityValue | null) => void\n label?: string\n readOnly?: boolean\n}\n\n// =============================================================================\n// Breakpoint Icons\n// =============================================================================\n\nconst BREAKPOINT_ICONS: Record<Breakpoint, React.ComponentType<{ className?: string; style?: CSSProperties }>> = {\n xs: Smartphone,\n sm: Smartphone,\n md: Tablet,\n lg: Laptop,\n xl: Monitor,\n}\n\n// =============================================================================\n// Styles\n// =============================================================================\n\nconst styles = {\n container: {\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n } as CSSProperties,\n header: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n } as CSSProperties,\n label: {\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--theme-elevation-800)',\n } as CSSProperties,\n warningBadge: {\n fontSize: '12px',\n color: 'var(--theme-warning-500)',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n } as CSSProperties,\n toggleGrid: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: '4px',\n } as CSSProperties,\n toggleButton: {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '2px',\n padding: '6px 4px',\n borderRadius: '6px',\n flex: '1 1 auto',\n minWidth: '44px',\n cursor: 'pointer',\n transition: 'all 0.15s',\n border: '1px solid',\n } as CSSProperties,\n toggleVisible: {\n backgroundColor: 'rgba(16, 185, 129, 0.15)',\n color: 'rgb(16, 185, 129)',\n borderColor: 'rgba(16, 185, 129, 0.4)',\n } as CSSProperties,\n toggleHidden: {\n backgroundColor: 'rgba(239, 68, 68, 0.15)',\n color: 'rgb(239, 68, 68)',\n borderColor: 'rgba(239, 68, 68, 0.4)',\n } as CSSProperties,\n toggleDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n } as CSSProperties,\n toggleLabel: {\n fontSize: '10px',\n fontWeight: 500,\n } as CSSProperties,\n toggleIcon: {\n position: 'absolute',\n top: '4px',\n right: '4px',\n } as CSSProperties,\n helpText: {\n fontSize: '12px',\n color: 'var(--theme-elevation-500)',\n } as CSSProperties,\n}\n\n// =============================================================================\n// Visibility Toggle Button\n// =============================================================================\n\ninterface VisibilityToggleProps {\n breakpoint: Breakpoint\n label: string\n minWidth: number | null\n isVisible: boolean\n onClick: () => void\n disabled?: boolean\n}\n\nfunction VisibilityToggle({\n breakpoint,\n label,\n minWidth,\n isVisible,\n onClick,\n disabled,\n}: VisibilityToggleProps) {\n const DeviceIcon = BREAKPOINT_ICONS[breakpoint]\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n title={`${label}${minWidth ? ` (${minWidth}px+)` : ''}: ${isVisible ? 'Visible' : 'Hidden'}`}\n style={{\n ...styles.toggleButton,\n ...(isVisible ? styles.toggleVisible : styles.toggleHidden),\n ...(disabled ? styles.toggleDisabled : {}),\n }}\n >\n <DeviceIcon style={{ width: '16px', height: '16px' }} />\n <span style={styles.toggleLabel}>{label}</span>\n <div style={styles.toggleIcon as CSSProperties}>\n {isVisible ? (\n <Eye style={{ width: '12px', height: '12px' }} />\n ) : (\n <EyeOff style={{ width: '12px', height: '12px' }} />\n )}\n </div>\n </button>\n )\n}\n\n// =============================================================================\n// ResponsiveVisibilityField Component\n// =============================================================================\n\nfunction ResponsiveVisibilityFieldInner({\n value,\n onChange,\n label,\n readOnly,\n}: ResponsiveVisibilityFieldProps) {\n // Get visibility for a breakpoint (simple lookup, no cascade)\n const getVisibility = useCallback(\n (breakpoint: Breakpoint): boolean => {\n const val = value ?? DEFAULT_VISIBILITY\n // All breakpoints have explicit values, default to true if undefined\n return val[breakpoint] ?? true\n },\n [value]\n )\n\n // Toggle visibility for a breakpoint (simple toggle, no cascade)\n const toggleVisibility = useCallback(\n (breakpoint: Breakpoint) => {\n const currentVisible = getVisibility(breakpoint)\n const newValue: VisibilityValue = {\n ...(value ?? DEFAULT_VISIBILITY),\n [breakpoint]: !currentVisible,\n }\n onChange(newValue)\n },\n [value, onChange, getVisibility]\n )\n\n // Check if any breakpoint is hidden\n const hasHiddenBreakpoints = BREAKPOINTS.some((bp) => !getVisibility(bp.key))\n\n return (\n <div className=\"puck-field\" style={styles.container}>\n {/* Header */}\n <div style={styles.header}>\n {label && (\n <label style={styles.label}>{label}</label>\n )}\n {hasHiddenBreakpoints && (\n <span style={styles.warningBadge}>\n <EyeOff style={{ width: '12px', height: '12px' }} />\n Partially hidden\n </span>\n )}\n </div>\n\n {/* Visibility Grid */}\n <div style={styles.toggleGrid}>\n {BREAKPOINTS.map((bp) => (\n <VisibilityToggle\n key={bp.key}\n breakpoint={bp.key}\n label={bp.label}\n minWidth={bp.minWidth}\n isVisible={getVisibility(bp.key)}\n onClick={() => toggleVisibility(bp.key)}\n disabled={readOnly}\n />\n ))}\n </div>\n\n {/* Help text */}\n <p style={styles.helpText}>\n Toggle visibility per screen size. Each breakpoint is independent.\n </p>\n </div>\n )\n}\n\nexport const ResponsiveVisibilityField = memo(ResponsiveVisibilityFieldInner)\n\n// =============================================================================\n// Field Configuration Factory\n// =============================================================================\n\ninterface CreateResponsiveVisibilityFieldConfig {\n label?: string\n}\n\n/**\n * Creates a Puck custom field for responsive visibility control.\n *\n * @example\n * ```ts\n * fields: {\n * visibility: createResponsiveVisibilityField({ label: 'Visibility' }),\n * }\n * ```\n */\nexport function createResponsiveVisibilityField(\n config: CreateResponsiveVisibilityFieldConfig = {}\n): CustomField<VisibilityValue | null> {\n return {\n type: 'custom',\n label: config.label,\n render: ({ value, onChange, readOnly }) => (\n <ResponsiveVisibilityField\n value={value}\n onChange={onChange}\n label={config.label}\n readOnly={readOnly}\n />\n ),\n }\n}\n"],"names":["React","useCallback","memo","Smartphone","Tablet","Laptop","Monitor","Eye","EyeOff","BREAKPOINTS","DEFAULT_VISIBILITY","BREAKPOINT_ICONS","xs","sm","md","lg","xl","styles","container","display","flexDirection","gap","header","alignItems","justifyContent","label","fontSize","fontWeight","color","warningBadge","toggleGrid","flexWrap","toggleButton","position","padding","borderRadius","flex","minWidth","cursor","transition","border","toggleVisible","backgroundColor","borderColor","toggleHidden","toggleDisabled","opacity","toggleLabel","toggleIcon","top","right","helpText","VisibilityToggle","breakpoint","isVisible","onClick","disabled","DeviceIcon","button","type","title","style","width","height","span","div","ResponsiveVisibilityFieldInner","value","onChange","readOnly","getVisibility","val","toggleVisibility","currentVisible","newValue","hasHiddenBreakpoints","some","bp","key","className","map","p","ResponsiveVisibilityField","createResponsiveVisibilityField","config","render"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SizeField.d.ts","sourceRoot":"","sources":["../../src/fields/SizeField.tsx"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,OAAO,KAAgD,MAAM,OAAO,CAAA;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAKnD,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,cAAc,EACd,cAAc,GACf,MAAM,aAAa,CAAA;AAEpB,OAAO,KAAK,EAAE,SAAS,EAAsB,MAAM,aAAa,CAAA;AAEhE,UAAU,cAAc;IACtB,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA;IACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAA;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,wCAAwC;IACxC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,2CAA2C;IAC3C,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AA0KD,iBAAS,cAAc,CAAC,EACtB,KAAK,EACL,QAAQ,EACR,KAAc,EACd,QAAQ,EACR,UAAiB,EACjB,YAAmB,GACpB,EAAE,cAAc,qBAuKhB;AAED,eAAO,MAAM,SAAS,kDAAuB,CAAA;AAM7C,UAAU,qBAAqB;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,MAAM,GAAE,qBAA0B,GACjC,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,CAe/B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/fields/SizeField.tsx"],"sourcesContent":["'use client'\n\n/**\n * SizeField - Custom Puck field for button/element sizing\n *\n * Provides preset size options (sm, default, lg) with a \"custom\" mode\n * that reveals detailed controls for height, padding, and font size.\n */\n\nimport React, { useCallback, memo, type CSSProperties } from 'react'\nimport type { CustomField } from '@puckeditor/core'\nimport { X } from 'lucide-react'\n\n// Re-export types and utilities from shared.ts for backward compatibility\n// These are defined in shared.ts to be server-safe\nexport {\n type SizeMode,\n type SizeUnit,\n type SizeValue,\n sizeValueToCSS,\n getSizeClasses,\n} from './shared.js'\n\nimport type { SizeValue, SizeMode, SizeUnit } from './shared.js'\n\ninterface SizeFieldProps {\n value: SizeValue | null\n onChange: (value: SizeValue | null) => void\n label?: string\n readOnly?: boolean\n /** Show height input (default: true) */\n showHeight?: boolean\n /** Show font size input (default: true) */\n showFontSize?: boolean\n}\n\n// =============================================================================\n// Default Values\n// =============================================================================\n\nconst DEFAULT_VALUE: SizeValue = {\n mode: 'default',\n}\n\nconst CUSTOM_DEFAULTS: Required<Omit<SizeValue, 'mode'>> = {\n height: 40,\n paddingX: 16,\n paddingY: 8,\n fontSize: 14,\n unit: 'px',\n}\n\n// =============================================================================\n// Styles\n// =============================================================================\n\nconst styles = {\n container: {\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n } as CSSProperties,\n header: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n } as CSSProperties,\n label: {\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--theme-elevation-800)',\n } as CSSProperties,\n clearButton: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '24px',\n height: '24px',\n padding: 0,\n border: 'none',\n borderRadius: '4px',\n backgroundColor: 'transparent',\n color: 'var(--theme-elevation-500)',\n cursor: 'pointer',\n } as CSSProperties,\n buttonGroup: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: '4px',\n } as CSSProperties,\n button: {\n display: 'inline-flex',\n alignItems: 'center',\n padding: '4px 12px',\n fontSize: '12px',\n fontWeight: 500,\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: '4px',\n backgroundColor: 'var(--theme-bg)',\n color: 'var(--theme-elevation-700)',\n cursor: 'pointer',\n } as CSSProperties,\n buttonActive: {\n display: 'inline-flex',\n alignItems: 'center',\n padding: '4px 12px',\n fontSize: '12px',\n fontWeight: 500,\n border: '1px solid var(--theme-elevation-800)',\n borderRadius: '4px',\n backgroundColor: 'var(--theme-elevation-800)',\n color: 'var(--theme-bg)',\n cursor: 'pointer',\n } as CSSProperties,\n customPanel: {\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n padding: '12px',\n backgroundColor: 'var(--theme-elevation-50)',\n borderRadius: '6px',\n overflow: 'hidden',\n } as CSSProperties,\n unitRow: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n } as CSSProperties,\n unitLabel: {\n fontSize: '10px',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n color: 'var(--theme-elevation-500)',\n flexShrink: 0,\n } as CSSProperties,\n unitButtons: {\n display: 'flex',\n gap: '4px',\n } as CSSProperties,\n unitButton: {\n height: '28px',\n padding: '0 8px',\n fontSize: '12px',\n fontFamily: 'monospace',\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: '4px',\n backgroundColor: 'var(--theme-bg)',\n color: 'var(--theme-elevation-500)',\n cursor: 'pointer',\n } as CSSProperties,\n unitButtonActive: {\n height: '28px',\n padding: '0 8px',\n fontSize: '12px',\n fontFamily: 'monospace',\n border: '1px solid var(--theme-elevation-800)',\n borderRadius: '4px',\n backgroundColor: 'var(--theme-elevation-800)',\n color: 'var(--theme-bg)',\n cursor: 'pointer',\n } as CSSProperties,\n inputGrid: {\n display: 'grid',\n gridTemplateColumns: '1fr 1fr',\n gap: '8px',\n } as CSSProperties,\n inputGroup: {\n display: 'flex',\n flexDirection: 'column',\n gap: '4px',\n minWidth: 0,\n } as CSSProperties,\n inputLabel: {\n fontSize: '10px',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n color: 'var(--theme-elevation-500)',\n } as CSSProperties,\n input: {\n width: '100%',\n minWidth: 0,\n height: '32px',\n padding: '0 8px',\n fontSize: '14px',\n fontFamily: 'monospace',\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: '4px',\n backgroundColor: 'var(--theme-input-bg)',\n color: 'var(--theme-elevation-800)',\n boxSizing: 'border-box',\n } as CSSProperties,\n summary: {\n fontSize: '12px',\n color: 'var(--theme-elevation-500)',\n fontFamily: 'monospace',\n paddingTop: '4px',\n borderTop: '1px solid var(--theme-elevation-100)',\n } as CSSProperties,\n}\n\n// =============================================================================\n// SizeField Component\n// =============================================================================\n\nfunction SizeFieldInner({\n value,\n onChange,\n label = 'Size',\n readOnly,\n showHeight = true,\n showFontSize = true,\n}: SizeFieldProps) {\n const currentValue = value || DEFAULT_VALUE\n\n const handleModeChange = useCallback((mode: SizeMode) => {\n if (mode === 'custom') {\n onChange({\n mode,\n ...CUSTOM_DEFAULTS,\n })\n } else {\n onChange({ mode })\n }\n }, [onChange])\n\n const handleValueChange = useCallback((\n field: 'height' | 'paddingX' | 'paddingY' | 'fontSize',\n val: number\n ) => {\n onChange({\n ...currentValue,\n [field]: val,\n })\n }, [currentValue, onChange])\n\n const handleUnitChange = useCallback((unit: SizeUnit) => {\n onChange({\n ...currentValue,\n unit,\n })\n }, [currentValue, onChange])\n\n const handleClear = useCallback(() => {\n onChange(null)\n }, [onChange])\n\n const presets = [\n { mode: 'sm' as SizeMode, label: 'SM' },\n { mode: 'default' as SizeMode, label: 'Default' },\n { mode: 'lg' as SizeMode, label: 'LG' },\n { mode: 'custom' as SizeMode, label: 'Custom' },\n ]\n\n return (\n <div className=\"puck-field\" style={styles.container}>\n {/* Header with label and clear */}\n <div style={styles.header}>\n <label style={styles.label}>{label}</label>\n {value && !readOnly && (\n <button\n type=\"button\"\n onClick={handleClear}\n style={styles.clearButton}\n title=\"Reset to default\"\n >\n <X style={{ width: '16px', height: '16px' }} />\n </button>\n )}\n </div>\n\n {/* Size mode selector */}\n <div style={styles.buttonGroup}>\n {presets.map(({ mode, label: modeLabel }) => {\n const isActive = currentValue.mode === mode\n return (\n <button\n key={mode}\n type=\"button\"\n onClick={() => handleModeChange(mode)}\n disabled={readOnly}\n style={isActive ? styles.buttonActive : styles.button}\n >\n {modeLabel}\n </button>\n )\n })}\n </div>\n\n {/* Custom size controls */}\n {currentValue.mode === 'custom' && (\n <div style={styles.customPanel as CSSProperties}>\n {/* Unit selector */}\n <div style={styles.unitRow}>\n <label style={styles.unitLabel as CSSProperties}>Unit:</label>\n <div style={styles.unitButtons}>\n {(['px', 'rem'] as SizeUnit[]).map((unit) => {\n const isActive = (currentValue.unit || 'px') === unit\n return (\n <button\n key={unit}\n type=\"button\"\n onClick={() => handleUnitChange(unit)}\n disabled={readOnly}\n style={isActive ? styles.unitButtonActive : styles.unitButton}\n >\n {unit}\n </button>\n )\n })}\n </div>\n </div>\n\n {/* Numeric inputs */}\n <div style={styles.inputGrid}>\n {showHeight && (\n <div style={styles.inputGroup as CSSProperties}>\n <label style={styles.inputLabel as CSSProperties}>Height</label>\n <input\n type=\"number\"\n min={0}\n value={currentValue.height ?? CUSTOM_DEFAULTS.height}\n onChange={(e) => handleValueChange('height', parseInt(e.target.value, 10) || 0)}\n disabled={readOnly}\n style={styles.input}\n />\n </div>\n )}\n\n {showFontSize && (\n <div style={styles.inputGroup as CSSProperties}>\n <label style={styles.inputLabel as CSSProperties}>Font Size</label>\n <input\n type=\"number\"\n min={0}\n value={currentValue.fontSize ?? CUSTOM_DEFAULTS.fontSize}\n onChange={(e) => handleValueChange('fontSize', parseInt(e.target.value, 10) || 0)}\n disabled={readOnly}\n style={styles.input}\n />\n </div>\n )}\n\n <div style={styles.inputGroup as CSSProperties}>\n <label style={styles.inputLabel as CSSProperties}>Padding X</label>\n <input\n type=\"number\"\n min={0}\n value={currentValue.paddingX ?? CUSTOM_DEFAULTS.paddingX}\n onChange={(e) => handleValueChange('paddingX', parseInt(e.target.value, 10) || 0)}\n disabled={readOnly}\n style={styles.input}\n />\n </div>\n\n <div style={styles.inputGroup as CSSProperties}>\n <label style={styles.inputLabel as CSSProperties}>Padding Y</label>\n <input\n type=\"number\"\n min={0}\n value={currentValue.paddingY ?? CUSTOM_DEFAULTS.paddingY}\n onChange={(e) => handleValueChange('paddingY', parseInt(e.target.value, 10) || 0)}\n disabled={readOnly}\n style={styles.input}\n />\n </div>\n </div>\n\n {/* Preview summary */}\n <div style={styles.summary}>\n {showHeight && `h: ${currentValue.height ?? CUSTOM_DEFAULTS.height}${currentValue.unit || 'px'}`}\n {showHeight && ' | '}\n {`p: ${currentValue.paddingY ?? CUSTOM_DEFAULTS.paddingY}${currentValue.unit || 'px'} ${currentValue.paddingX ?? CUSTOM_DEFAULTS.paddingX}${currentValue.unit || 'px'}`}\n {showFontSize && ` | font: ${currentValue.fontSize ?? CUSTOM_DEFAULTS.fontSize}${currentValue.unit || 'px'}`}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport const SizeField = memo(SizeFieldInner)\n\n// =============================================================================\n// Field Configuration Factory\n// =============================================================================\n\ninterface CreateSizeFieldConfig {\n label?: string\n showHeight?: boolean\n showFontSize?: boolean\n}\n\n/**\n * Creates a Puck field configuration for size control\n */\nexport function createSizeField(\n config: CreateSizeFieldConfig = {}\n): CustomField<SizeValue | null> {\n return {\n type: 'custom',\n label: config.label,\n render: ({ value, onChange, readOnly }) => (\n <SizeField\n value={value}\n onChange={onChange}\n label={config.label}\n readOnly={readOnly}\n showHeight={config.showHeight}\n showFontSize={config.showFontSize}\n />\n ),\n }\n}\n"],"names":["React","useCallback","memo","X","sizeValueToCSS","getSizeClasses","DEFAULT_VALUE","mode","CUSTOM_DEFAULTS","height","paddingX","paddingY","fontSize","unit","styles","container","display","flexDirection","gap","header","alignItems","justifyContent","label","fontWeight","color","clearButton","width","padding","border","borderRadius","backgroundColor","cursor","buttonGroup","flexWrap","button","buttonActive","customPanel","overflow","unitRow","unitLabel","textTransform","letterSpacing","flexShrink","unitButtons","unitButton","fontFamily","unitButtonActive","inputGrid","gridTemplateColumns","inputGroup","minWidth","inputLabel","input","boxSizing","summary","paddingTop","borderTop","SizeFieldInner","value","onChange","readOnly","showHeight","showFontSize","currentValue","handleModeChange","handleValueChange","field","val","handleUnitChange","handleClear","presets","div","className","style","type","onClick","title","map","modeLabel","isActive","disabled","min","e","parseInt","target","SizeField","createSizeField","config","render"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SlugPreviewField.d.ts","sourceRoot":"","sources":["../../src/fields/SlugPreviewField.tsx"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAOnD,UAAU,qBAAqB;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAMD,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,KAAkB,EAClB,IAAkD,GACnD,EAAE,qBAAqB,qBA8DvB;AAMD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,CAAC,EAAE;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,GAAG,WAAW,CAAC,MAAM,CAAC,CAYtB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/fields/SlugPreviewField.tsx"],"sourcesContent":["'use client'\n\n/**\n * SlugPreviewField - Custom Puck field for displaying the computed slug\n *\n * Read-only field that shows the auto-generated URL slug.\n * When page-tree is enabled, slug = folderPath + '/' + pageSegment\n */\n\nimport React from 'react'\nimport type { CustomField } from '@puckeditor/core'\nimport { Link, Lock } from 'lucide-react'\n\n// =============================================================================\n// Types\n// =============================================================================\n\ninterface SlugPreviewFieldProps {\n value: string\n label?: string\n hint?: string\n}\n\n// =============================================================================\n// SlugPreviewField Component\n// =============================================================================\n\nexport function SlugPreviewField({\n value,\n label = 'URL Slug',\n hint = 'Auto-generated from folder + page segment',\n}: SlugPreviewFieldProps) {\n const displayValue = value ? (value.startsWith('/') ? value : `/${value}`) : '/'\n\n return (\n <div className=\"puck-field\">\n {/* Label with lock indicator */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: '8px',\n }}\n >\n <label\n style={{\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--puck-color-grey-04)',\n }}\n >\n {label}\n </label>\n <Lock size={14} style={{ color: 'var(--puck-color-grey-06)' }} />\n </div>\n\n {/* Read-only slug display */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n padding: '8px 12px',\n backgroundColor: 'var(--puck-color-grey-11)',\n border: '1px solid var(--puck-color-grey-09)',\n borderRadius: '6px',\n }}\n >\n <Link size={14} style={{ marginRight: '8px', color: 'var(--puck-color-grey-06)' }} />\n <span\n style={{\n fontSize: '14px',\n color: 'var(--puck-color-grey-05)',\n fontFamily: 'var(--font-mono, monospace)',\n wordBreak: 'break-all',\n }}\n >\n {displayValue}\n </span>\n </div>\n\n {/* Hint text */}\n <p\n style={{\n marginTop: '6px',\n fontSize: '12px',\n color: 'var(--puck-color-grey-06)',\n }}\n >\n {hint}\n </p>\n </div>\n )\n}\n\n// =============================================================================\n// Field Configuration Factory\n// =============================================================================\n\n/**\n * Creates a Puck field configuration for slug preview\n */\nexport function createSlugPreviewField(config?: {\n label?: string\n hint?: string\n}): CustomField<string> {\n return {\n type: 'custom',\n label: config?.label ?? 'URL Slug',\n render: ({ value }) => (\n <SlugPreviewField\n value={value || ''}\n label={config?.label}\n hint={config?.hint}\n />\n ),\n }\n}\n"],"names":["React","Link","Lock","SlugPreviewField","value","label","hint","displayValue","startsWith","div","className","style","display","alignItems","justifyContent","marginBottom","fontSize","fontWeight","color","size","padding","backgroundColor","border","borderRadius","marginRight","span","fontFamily","wordBreak","p","marginTop","createSlugPreviewField","config","type","render"],"mappings":"AAAA;;AAEA;;;;;CAKC,GAED,OAAOA,WAAW,QAAO;AAEzB,SAASC,IAAI,EAAEC,IAAI,QAAQ,eAAc;AAYzC,gFAAgF;AAChF,6BAA6B;AAC7B,gFAAgF;AAEhF,OAAO,SAASC,iBAAiB,EAC/BC,KAAK,EACLC,QAAQ,UAAU,EAClBC,OAAO,2CAA2C,EAC5B;IACtB,MAAMC,eAAeH,QAASA,MAAMI,UAAU,CAAC,OAAOJ,QAAQ,CAAC,CAAC,EAAEA,OAAO,GAAI;IAE7E,qBACE,MAACK;QAAIC,WAAU;;0BAEb,MAACD;gBACCE,OAAO;oBACLC,SAAS;oBACTC,YAAY;oBACZC,gBAAgB;oBAChBC,cAAc;gBAChB;;kCAEA,KAACV;wBACCM,OAAO;4BACLK,UAAU;4BACVC,YAAY;4BACZC,OAAO;wBACT;kCAECb;;kCAEH,KAACH;wBAAKiB,MAAM;wBAAIR,OAAO;4BAAEO,OAAO;wBAA4B;;;;0BAI9D,MAACT;gBACCE,OAAO;oBACLC,SAAS;oBACTC,YAAY;oBACZO,SAAS;oBACTC,iBAAiB;oBACjBC,QAAQ;oBACRC,cAAc;gBAChB;;kCAEA,KAACtB;wBAAKkB,MAAM;wBAAIR,OAAO;4BAAEa,aAAa;4BAAON,OAAO;wBAA4B;;kCAChF,KAACO;wBACCd,OAAO;4BACLK,UAAU;4BACVE,OAAO;4BACPQ,YAAY;4BACZC,WAAW;wBACb;kCAECpB;;;;0BAKL,KAACqB;gBACCjB,OAAO;oBACLkB,WAAW;oBACXb,UAAU;oBACVE,OAAO;gBACT;0BAECZ;;;;AAIT;AAEA,gFAAgF;AAChF,8BAA8B;AAC9B,gFAAgF;AAEhF;;CAEC,GACD,OAAO,SAASwB,uBAAuBC,MAGtC;IACC,OAAO;QACLC,MAAM;QACN3B,OAAO0B,QAAQ1B,SAAS;QACxB4B,QAAQ,CAAC,EAAE7B,KAAK,EAAE,iBAChB,KAACD;gBACCC,OAAOA,SAAS;gBAChBC,OAAO0B,QAAQ1B;gBACfC,MAAMyB,QAAQzB;;IAGpB;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TemplateField.d.ts","sourceRoot":"","sources":["../../src/fields/TemplateField.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,OAAO,KAAqE,MAAM,OAAO,CAAA;AACzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AA6BnD,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IACxC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAqMD,iBAAS,kBAAkB,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,KAAkB,EAClB,QAAQ,EACR,WAAmC,GACpC,EAAE,kBAAkB,qBA4YpB;AAGD,eAAO,MAAM,aAAa,sDAA2B,CAAA;AAMrD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,GAAG,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,CAc7B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/fields/TemplateField.tsx"],"sourcesContent":["'use client'\n\n/**\n * TemplateField - Custom Puck field for saving/loading template content\n *\n * This component provides a template picker that:\n * - Fetches templates from the puck-templates Payload collection\n * - Shows a dropdown to select a template\n * - Has a \"Save as template\" button to save current slot content\n * - When a template is selected, loads the saved components into the slot\n *\n * Uses Puck's usePuck hook to access and modify component slot data.\n */\n\nimport React, { useState, useEffect, useCallback, memo, type CSSProperties } from 'react'\nimport type { CustomField } from '@puckeditor/core'\nimport { createUsePuck } from '@puckeditor/core'\nimport type { Data } from '@puckeditor/core'\nimport {\n Loader2,\n Save,\n Download,\n AlertCircle,\n ChevronDown,\n ChevronUp,\n X,\n} from 'lucide-react'\n\n// Create usePuck hook for accessing editor state\nconst usePuck = createUsePuck()\n\n// =============================================================================\n// Types\n// =============================================================================\n\ninterface TemplateItem {\n id: string\n name: string\n description?: string\n category?: string\n content: unknown[]\n updatedAt?: string\n}\n\ninterface TemplateFieldProps {\n value: string | null\n onChange: (value: string | null) => void\n label?: string\n readOnly?: boolean\n apiEndpoint?: string\n}\n\ninterface SaveFormState {\n expanded: boolean\n name: string\n description: string\n category: string\n saving: boolean\n error: string | null\n}\n\n// =============================================================================\n// Styles\n// =============================================================================\n\nconst styles = {\n container: {\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n } as CSSProperties,\n label: {\n display: 'block',\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--theme-elevation-800)',\n } as CSSProperties,\n selectRow: {\n display: 'flex',\n gap: '8px',\n } as CSSProperties,\n select: {\n flex: 1,\n height: '36px',\n padding: '0 12px',\n fontSize: '14px',\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: '6px',\n backgroundColor: 'var(--theme-input-bg)',\n color: 'var(--theme-elevation-800)',\n cursor: 'pointer',\n } as CSSProperties,\n clearButton: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '36px',\n height: '36px',\n padding: 0,\n border: 'none',\n borderRadius: '6px',\n backgroundColor: 'transparent',\n color: 'var(--theme-elevation-500)',\n cursor: 'pointer',\n } as CSSProperties,\n buttonRow: {\n display: 'flex',\n gap: '8px',\n } as CSSProperties,\n button: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '6px',\n flex: 1,\n height: '32px',\n padding: '0 12px',\n fontSize: '14px',\n fontWeight: 500,\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: '4px',\n backgroundColor: 'var(--theme-bg)',\n color: 'var(--theme-elevation-700)',\n cursor: 'pointer',\n } as CSSProperties,\n buttonDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n } as CSSProperties,\n saveForm: {\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n padding: '12px',\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: '6px',\n backgroundColor: 'var(--theme-elevation-50)',\n } as CSSProperties,\n inputGroup: {\n display: 'flex',\n flexDirection: 'column',\n gap: '6px',\n } as CSSProperties,\n inputLabel: {\n fontSize: '12px',\n color: 'var(--theme-elevation-700)',\n } as CSSProperties,\n input: {\n height: '32px',\n padding: '0 8px',\n fontSize: '14px',\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: '4px',\n backgroundColor: 'var(--theme-input-bg)',\n color: 'var(--theme-elevation-800)',\n } as CSSProperties,\n errorBox: {\n display: 'flex',\n alignItems: 'flex-start',\n gap: '8px',\n padding: '8px',\n backgroundColor: 'rgba(239, 68, 68, 0.1)',\n border: '1px solid rgba(239, 68, 68, 0.3)',\n borderRadius: '6px',\n color: 'var(--theme-error-500)',\n fontSize: '12px',\n } as CSSProperties,\n submitButton: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '6px',\n width: '100%',\n height: '32px',\n padding: '0 12px',\n fontSize: '14px',\n fontWeight: 500,\n border: '1px solid var(--theme-elevation-800)',\n borderRadius: '4px',\n backgroundColor: 'var(--theme-elevation-800)',\n color: 'var(--theme-bg)',\n cursor: 'pointer',\n } as CSSProperties,\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Find and update a component's props in the Puck data tree.\n */\nfunction updateComponentInData(\n data: Data,\n componentId: string,\n propsToMerge: Record<string, unknown>\n): Data {\n const updateInArray = (\n items: Array<{ type: string; props: Record<string, unknown> }>\n ): Array<{ type: string; props: Record<string, unknown> }> => {\n return items.map((item) => {\n if (item.props?.id === componentId) {\n return {\n ...item,\n props: {\n ...item.props,\n ...propsToMerge,\n },\n }\n }\n if (item.props?.content && Array.isArray(item.props.content)) {\n return {\n ...item,\n props: {\n ...item.props,\n content: updateInArray(item.props.content as Array<{ type: string; props: Record<string, unknown> }>),\n },\n }\n }\n return item\n })\n }\n\n const updatedContent = data.content\n ? updateInArray(data.content as Array<{ type: string; props: Record<string, unknown> }>)\n : []\n\n const updatedZones: Record<string, Array<{ type: string; props: Record<string, unknown> }>> = {}\n if (data.zones) {\n for (const [zoneName, zoneContent] of Object.entries(data.zones)) {\n updatedZones[zoneName] = updateInArray(\n zoneContent as Array<{ type: string; props: Record<string, unknown> }>\n )\n }\n }\n\n return {\n ...data,\n content: updatedContent,\n zones: updatedZones,\n }\n}\n\n// =============================================================================\n// TemplateField Component\n// =============================================================================\n\nfunction TemplateFieldInner({\n value,\n onChange,\n label = 'Template',\n readOnly,\n apiEndpoint = '/api/puck-templates',\n}: TemplateFieldProps) {\n const [templates, setTemplates] = useState<TemplateItem[]>([])\n const [loading, setLoading] = useState(false)\n const [loadingTemplate, setLoadingTemplate] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [saveForm, setSaveForm] = useState<SaveFormState>({\n expanded: false,\n name: '',\n description: '',\n category: '',\n saving: false,\n error: null,\n })\n\n // Puck state access\n const appState = usePuck((s) => s.appState)\n const dispatch = usePuck((s) => s.dispatch)\n const selectedItem = usePuck((s) => s.selectedItem)\n const getSelectorForId = usePuck((s) => s.getSelectorForId)\n const getItemById = usePuck((s) => s.getItemById)\n\n // Get current component ID\n const componentId = selectedItem?.props?.id as string | undefined\n\n // Fetch templates from Payload API\n const fetchTemplates = useCallback(async () => {\n setLoading(true)\n setError(null)\n try {\n const params = new URLSearchParams({\n limit: '100',\n sort: '-updatedAt',\n })\n\n const response = await fetch(`${apiEndpoint}?${params}`)\n if (!response.ok) throw new Error('Failed to fetch templates')\n\n const data = await response.json()\n const items: TemplateItem[] = (data.docs || []).map(\n (doc: Record<string, unknown>) => ({\n id: doc.id as string,\n name: doc.name as string,\n description: doc.description as string | undefined,\n category: doc.category as string | undefined,\n content: doc.content as unknown[],\n updatedAt: doc.updatedAt as string | undefined,\n })\n )\n\n setTemplates(items)\n } catch (err) {\n console.error('Error fetching templates:', err)\n setError('Failed to load templates')\n } finally {\n setLoading(false)\n }\n }, [apiEndpoint])\n\n // Load templates on mount\n useEffect(() => {\n fetchTemplates()\n }, [fetchTemplates])\n\n // Handle template selection\n const handleTemplateSelect = useCallback(\n async (templateId: string) => {\n if (!componentId || !selectedItem) return\n\n const template = templates.find((t) => String(t.id) === String(templateId))\n if (!template) return\n\n setLoadingTemplate(true)\n try {\n const selector = getSelectorForId(componentId)\n\n if (selector) {\n dispatch({\n type: 'replace',\n destinationIndex: selector.index,\n destinationZone: selector.zone,\n data: {\n type: selectedItem.type,\n props: {\n ...selectedItem.props,\n content: template.content,\n templateId: templateId,\n },\n },\n })\n } else {\n const updatedData = updateComponentInData(\n appState.data,\n componentId,\n { content: template.content, templateId: templateId }\n )\n dispatch({\n type: 'setData',\n data: updatedData,\n })\n }\n\n onChange(templateId)\n } catch (err) {\n console.error('Error loading template:', err)\n setError('Failed to load template')\n } finally {\n setLoadingTemplate(false)\n }\n },\n [componentId, selectedItem, templates, getSelectorForId, appState.data, dispatch, onChange]\n )\n\n // Handle clearing template selection\n const handleClearTemplate = useCallback(() => {\n onChange(null)\n }, [onChange])\n\n // Toggle save form\n const handleToggleSaveForm = useCallback(() => {\n setSaveForm((prev) => ({\n ...prev,\n expanded: !prev.expanded,\n error: null,\n }))\n }, [])\n\n // Close save form\n const handleCloseSaveForm = useCallback(() => {\n setSaveForm({\n expanded: false,\n name: '',\n description: '',\n category: '',\n saving: false,\n error: null,\n })\n }, [])\n\n // Save current slot content as a new template\n const handleSaveTemplate = useCallback(async () => {\n if (!componentId) return\n\n const name = saveForm.name.trim()\n if (!name) {\n setSaveForm((prev) => ({\n ...prev,\n error: 'Please enter a template name',\n }))\n return\n }\n\n setSaveForm((prev) => ({ ...prev, saving: true, error: null }))\n\n try {\n // Use Puck's official getItemById API instead of manual tree traversal\n const component = getItemById(componentId)\n const content = (component?.props?.content as unknown[]) || []\n\n if (content.length === 0) {\n throw new Error('No content to save. Add components to the template first.')\n }\n\n const response = await fetch(apiEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n name,\n description: saveForm.description.trim() || undefined,\n category: saveForm.category.trim() || undefined,\n content,\n }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(\n errorData.message || errorData.errors?.[0]?.message || 'Failed to save template'\n )\n }\n\n const data = await response.json()\n const doc = data.doc || data\n\n const newTemplate: TemplateItem = {\n id: doc.id as string,\n name: doc.name as string,\n description: doc.description as string | undefined,\n category: doc.category as string | undefined,\n content: doc.content as unknown[],\n updatedAt: doc.updatedAt as string | undefined,\n }\n\n setTemplates((prev) => [newTemplate, ...prev])\n handleCloseSaveForm()\n\n setTimeout(() => {\n onChange(newTemplate.id)\n }, 50)\n } catch (err) {\n console.error('Error saving template:', err)\n setSaveForm((prev) => ({\n ...prev,\n saving: false,\n error: err instanceof Error ? err.message : 'Failed to save template',\n }))\n }\n }, [componentId, getItemById, apiEndpoint, saveForm, onChange, handleCloseSaveForm])\n\n // Group templates by category\n const categorizedTemplates = templates.reduce<Record<string, TemplateItem[]>>(\n (acc, template) => {\n const category = template.category || 'Uncategorized'\n if (!acc[category]) {\n acc[category] = []\n }\n acc[category].push(template)\n return acc\n },\n {}\n )\n\n return (\n <div className=\"puck-field\" style={styles.container}>\n {label && (\n <label style={styles.label}>{label}</label>\n )}\n\n {/* Template Selector */}\n <div style={styles.selectRow}>\n <select\n value={value || ''}\n onChange={(e) => e.target.value && handleTemplateSelect(e.target.value)}\n disabled={readOnly || loading || loadingTemplate}\n style={styles.select}\n >\n <option value=\"\">\n {loading ? 'Loading...' : loadingTemplate ? 'Loading template...' : 'Select a template'}\n </option>\n {Object.entries(categorizedTemplates).map(([category, items]) => (\n <optgroup key={category} label={category}>\n {items.map((template) => (\n <option key={template.id} value={template.id}>\n {template.name}\n </option>\n ))}\n </optgroup>\n ))}\n </select>\n\n {value && !readOnly && (\n <button\n type=\"button\"\n onClick={handleClearTemplate}\n style={styles.clearButton}\n title=\"Clear selection\"\n >\n <X style={{ width: '16px', height: '16px' }} />\n </button>\n )}\n </div>\n\n {/* Action Buttons */}\n {!readOnly && (\n <div style={styles.buttonRow}>\n <button\n type=\"button\"\n onClick={handleToggleSaveForm}\n disabled={loading || saveForm.saving}\n style={{\n ...styles.button,\n ...(loading || saveForm.saving ? styles.buttonDisabled : {}),\n }}\n >\n {saveForm.expanded ? (\n <ChevronUp style={{ width: '16px', height: '16px' }} />\n ) : (\n <Save style={{ width: '16px', height: '16px' }} />\n )}\n {saveForm.expanded ? 'Cancel' : 'Save as Template'}\n </button>\n\n {value && (\n <button\n type=\"button\"\n onClick={() => handleTemplateSelect(value)}\n disabled={loadingTemplate}\n style={{\n ...styles.button,\n flex: 'none',\n ...(loadingTemplate ? styles.buttonDisabled : {}),\n }}\n >\n {loadingTemplate ? (\n <Loader2 style={{ width: '16px', height: '16px', animation: 'spin 1s linear infinite' }} />\n ) : (\n <Download style={{ width: '16px', height: '16px' }} />\n )}\n Reload\n </button>\n )}\n </div>\n )}\n\n {/* Inline Save Form */}\n {saveForm.expanded && (\n <div style={styles.saveForm as CSSProperties}>\n <div style={styles.inputGroup as CSSProperties}>\n <label htmlFor=\"template-name\" style={styles.inputLabel}>\n Template Name *\n </label>\n <input\n id=\"template-name\"\n placeholder=\"e.g., Hero Section with CTA\"\n value={saveForm.name}\n onChange={(e) =>\n setSaveForm((prev) => ({ ...prev, name: e.target.value }))\n }\n disabled={saveForm.saving}\n style={styles.input}\n />\n </div>\n\n <div style={styles.inputGroup as CSSProperties}>\n <label htmlFor=\"template-description\" style={styles.inputLabel}>\n Description\n </label>\n <input\n id=\"template-description\"\n placeholder=\"Optional description...\"\n value={saveForm.description}\n onChange={(e) =>\n setSaveForm((prev) => ({ ...prev, description: e.target.value }))\n }\n disabled={saveForm.saving}\n style={styles.input}\n />\n </div>\n\n <div style={styles.inputGroup as CSSProperties}>\n <label htmlFor=\"template-category\" style={styles.inputLabel}>\n Category\n </label>\n <input\n id=\"template-category\"\n placeholder=\"e.g., Hero, Footer, CTA\"\n value={saveForm.category}\n onChange={(e) =>\n setSaveForm((prev) => ({ ...prev, category: e.target.value }))\n }\n disabled={saveForm.saving}\n style={styles.input}\n />\n </div>\n\n {saveForm.error && (\n <div style={styles.errorBox}>\n <AlertCircle style={{ width: '14px', height: '14px', flexShrink: 0, marginTop: '2px' }} />\n <span>{saveForm.error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSaveTemplate}\n disabled={saveForm.saving}\n style={{\n ...styles.submitButton,\n ...(saveForm.saving ? styles.buttonDisabled : {}),\n }}\n >\n {saveForm.saving ? (\n <>\n <Loader2 style={{ width: '16px', height: '16px', animation: 'spin 1s linear infinite' }} />\n Saving...\n </>\n ) : (\n <>\n <Save style={{ width: '16px', height: '16px' }} />\n Save Template\n </>\n )}\n </button>\n </div>\n )}\n\n {/* Error Display */}\n {error && (\n <div style={styles.errorBox}>\n <AlertCircle style={{ width: '16px', height: '16px', flexShrink: 0, marginTop: '2px' }} />\n <span>{error}</span>\n </div>\n )}\n </div>\n )\n}\n\n// Memoize to prevent unnecessary re-renders\nexport const TemplateField = memo(TemplateFieldInner)\n\n// =============================================================================\n// Field Configuration Factory\n// =============================================================================\n\n/**\n * Creates a Puck field configuration for template selection\n */\nexport function createTemplateField(config: {\n label?: string\n apiEndpoint?: string\n}): CustomField<string | null> {\n return {\n type: 'custom',\n label: config.label,\n render: ({ value, onChange, readOnly }) => (\n <TemplateField\n value={value}\n onChange={onChange}\n label={config.label}\n readOnly={readOnly}\n apiEndpoint={config.apiEndpoint}\n />\n ),\n }\n}\n"],"names":["React","useState","useEffect","useCallback","memo","createUsePuck","Loader2","Save","Download","AlertCircle","ChevronUp","X","usePuck","styles","container","display","flexDirection","gap","label","fontSize","fontWeight","color","selectRow","select","flex","height","padding","border","borderRadius","backgroundColor","cursor","clearButton","alignItems","justifyContent","width","buttonRow","button","buttonDisabled","opacity","saveForm","inputGroup","inputLabel","input","errorBox","submitButton","updateComponentInData","data","componentId","propsToMerge","updateInArray","items","map","item","props","id","content","Array","isArray","updatedContent","updatedZones","zones","zoneName","zoneContent","Object","entries","TemplateFieldInner","value","onChange","readOnly","apiEndpoint","templates","setTemplates","loading","setLoading","loadingTemplate","setLoadingTemplate","error","setError","setSaveForm","expanded","name","description","category","saving","appState","s","dispatch","selectedItem","getSelectorForId","getItemById","fetchTemplates","params","URLSearchParams","limit","sort","response","fetch","ok","Error","json","docs","doc","updatedAt","err","console","handleTemplateSelect","templateId","template","find","t","String","selector","type","destinationIndex","index","destinationZone","zone","updatedData","handleClearTemplate","handleToggleSaveForm","prev","handleCloseSaveForm","handleSaveTemplate","trim","component","length","method","headers","body","JSON","stringify","undefined","errorData","catch","message","errors","newTemplate","setTimeout","categorizedTemplates","reduce","acc","push","div","className","style","e","target","disabled","option","optgroup","onClick","title","animation","htmlFor","placeholder","flexShrink","marginTop","span","TemplateField","createTemplateField","config","render"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TransformField.d.ts","sourceRoot":"","sources":["../../src/fields/TransformField.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,OAAO,KAA0D,MAAM,OAAO,CAAA;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAWnD,OAAO,KAAK,EAAE,cAAc,EAAmB,MAAM,aAAa,CAAA;AAOlE,UAAU,mBAAmB;IAC3B,KAAK,EAAE,cAAc,GAAG,IAAI,CAAA;IAC5B,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,KAAK,IAAI,CAAA;IAChD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAoXD,iBAAS,mBAAmB,CAAC,EAC3B,KAAK,EACL,QAAQ,EACR,KAAK,EACL,QAAQ,GACT,EAAE,mBAAmB,qBAkUrB;AAED,eAAO,MAAM,cAAc,uDAA4B,CAAA;AAMvD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,GAAG,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,CAarC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/fields/TransformField.tsx"],"sourcesContent":["'use client'\n\n/**\n * TransformField - Custom Puck field for CSS transforms\n *\n * This component provides:\n * - Live preview of transform effect\n * - Rotate slider (-360 to 360)\n * - Scale X/Y with link/unlink toggle\n * - Skew X/Y sliders\n * - Translate X/Y inputs with unit selector\n * - Transform origin 3x3 grid selector\n * - Collapsible 3D section (perspective, rotateX, rotateY)\n */\n\nimport React, { useCallback, memo, useState, type CSSProperties } from 'react'\nimport type { CustomField } from '@puckeditor/core'\nimport {\n Link,\n Unlink,\n RotateCw,\n Maximize2,\n X,\n ChevronDown,\n ChevronRight,\n Box,\n} from 'lucide-react'\nimport type { TransformValue, TransformOrigin } from './shared.js'\nimport { DEFAULT_TRANSFORM, transformValueToCSS } from './shared.js'\n\n// =============================================================================\n// Types\n// =============================================================================\n\ninterface TransformFieldProps {\n value: TransformValue | null\n onChange: (value: TransformValue | null) => void\n label?: string\n readOnly?: boolean\n}\n\ntype TranslateUnit = 'px' | 'rem' | '%'\n\n// =============================================================================\n// Styles\n// =============================================================================\n\nconst styles = {\n container: {\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n } as CSSProperties,\n header: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n } as CSSProperties,\n label: {\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--theme-elevation-800)',\n } as CSSProperties,\n clearButton: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '24px',\n height: '24px',\n padding: 0,\n border: 'none',\n borderRadius: '4px',\n backgroundColor: 'transparent',\n color: 'var(--theme-elevation-500)',\n cursor: 'pointer',\n } as CSSProperties,\n preview: {\n height: '96px',\n backgroundColor: 'var(--theme-elevation-50)',\n borderRadius: '6px',\n border: '1px solid var(--theme-elevation-150)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n } as CSSProperties,\n previewBox: {\n width: '48px',\n height: '48px',\n backgroundColor: 'var(--theme-elevation-800)',\n borderRadius: '6px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'var(--theme-bg)',\n fontSize: '12px',\n fontWeight: 500,\n transition: 'transform 0.2s',\n } as CSSProperties,\n section: {\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n padding: '12px',\n backgroundColor: 'var(--theme-elevation-50)',\n borderRadius: '6px',\n } as CSSProperties,\n sectionHeader: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n } as CSSProperties,\n sectionTitle: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n } as CSSProperties,\n sectionLabel: {\n fontSize: '12px',\n fontWeight: 500,\n color: 'var(--theme-elevation-700)',\n } as CSSProperties,\n linkButton: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '24px',\n height: '24px',\n padding: 0,\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: '4px',\n backgroundColor: 'var(--theme-bg)',\n color: 'var(--theme-elevation-700)',\n cursor: 'pointer',\n } as CSSProperties,\n linkButtonActive: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '24px',\n height: '24px',\n padding: 0,\n border: '1px solid var(--theme-elevation-800)',\n borderRadius: '4px',\n backgroundColor: 'var(--theme-elevation-800)',\n color: 'var(--theme-bg)',\n cursor: 'pointer',\n } as CSSProperties,\n grid: {\n display: 'grid',\n gridTemplateColumns: '1fr 1fr',\n gap: '12px',\n } as CSSProperties,\n sliderGroup: {\n display: 'flex',\n flexDirection: 'column',\n gap: '4px',\n } as CSSProperties,\n sliderHeader: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n } as CSSProperties,\n sliderLabel: {\n fontSize: '10px',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n color: 'var(--theme-elevation-500)',\n } as CSSProperties,\n sliderValue: {\n fontSize: '12px',\n fontFamily: 'monospace',\n color: 'var(--theme-elevation-500)',\n } as CSSProperties,\n slider: {\n width: '100%',\n height: '6px',\n accentColor: 'var(--theme-elevation-800)',\n cursor: 'pointer',\n } as CSSProperties,\n translateRow: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n flexWrap: 'wrap',\n gap: '8px',\n } as CSSProperties,\n select: {\n height: '28px',\n width: '64px',\n padding: '0 8px',\n fontSize: '12px',\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: '4px',\n backgroundColor: 'var(--theme-input-bg)',\n color: 'var(--theme-elevation-800)',\n cursor: 'pointer',\n } as CSSProperties,\n inputGroup: {\n display: 'flex',\n flexDirection: 'column',\n gap: '4px',\n } as CSSProperties,\n inputLabel: {\n fontSize: '10px',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n color: 'var(--theme-elevation-500)',\n } as CSSProperties,\n input: {\n height: '32px',\n padding: '0 8px',\n fontSize: '14px',\n fontFamily: 'monospace',\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: '4px',\n backgroundColor: 'var(--theme-input-bg)',\n color: 'var(--theme-elevation-800)',\n } as CSSProperties,\n originGrid: {\n display: 'grid',\n gridTemplateColumns: 'repeat(3, 1fr)',\n gap: '4px',\n width: 'fit-content',\n } as CSSProperties,\n originButton: {\n width: '24px',\n height: '24px',\n padding: 0,\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: '4px',\n backgroundColor: 'var(--theme-elevation-50)',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n } as CSSProperties,\n originButtonActive: {\n width: '24px',\n height: '24px',\n padding: 0,\n border: '1px solid var(--theme-elevation-800)',\n borderRadius: '4px',\n backgroundColor: 'var(--theme-elevation-800)',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n } as CSSProperties,\n originDot: {\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: 'var(--theme-elevation-400)',\n } as CSSProperties,\n originDotActive: {\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: 'var(--theme-bg)',\n } as CSSProperties,\n originRow: {\n display: 'flex',\n alignItems: 'center',\n gap: '16px',\n } as CSSProperties,\n originLabel: {\n fontSize: '12px',\n color: 'var(--theme-elevation-500)',\n textTransform: 'capitalize',\n } as CSSProperties,\n collapsible: {\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: '6px',\n overflow: 'hidden',\n } as CSSProperties,\n collapsibleHeader: {\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '12px',\n border: 'none',\n backgroundColor: 'var(--theme-elevation-50)',\n cursor: 'pointer',\n } as CSSProperties,\n collapsibleTitle: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n } as CSSProperties,\n collapsibleContent: {\n padding: '12px',\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n borderTop: '1px solid var(--theme-elevation-150)',\n } as CSSProperties,\n checkboxRow: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n } as CSSProperties,\n checkbox: {\n width: '16px',\n height: '16px',\n accentColor: 'var(--theme-elevation-800)',\n cursor: 'pointer',\n } as CSSProperties,\n checkboxLabel: {\n fontSize: '12px',\n color: 'var(--theme-elevation-500)',\n cursor: 'pointer',\n } as CSSProperties,\n}\n\n// =============================================================================\n// Origin Grid Component\n// =============================================================================\n\ninterface OriginGridProps {\n value: TransformOrigin\n onChange: (origin: TransformOrigin) => void\n disabled?: boolean\n}\n\nconst ORIGIN_POSITIONS: TransformOrigin[] = [\n 'top-left', 'top', 'top-right',\n 'left', 'center', 'right',\n 'bottom-left', 'bottom', 'bottom-right',\n]\n\nfunction OriginGrid({ value, onChange, disabled }: OriginGridProps) {\n return (\n <div style={styles.originGrid}>\n {ORIGIN_POSITIONS.map((origin) => {\n const isActive = value === origin\n return (\n <button\n key={origin}\n type=\"button\"\n onClick={() => onChange(origin)}\n disabled={disabled}\n style={{\n ...(isActive ? styles.originButtonActive : styles.originButton),\n ...(disabled ? { opacity: 0.5, cursor: 'not-allowed' } : {}),\n }}\n title={origin.replace('-', ' ')}\n >\n <span style={isActive ? styles.originDotActive : styles.originDot} />\n </button>\n )\n })}\n </div>\n )\n}\n\n// =============================================================================\n// Slider Input Component\n// =============================================================================\n\ninterface SliderInputProps {\n value: number\n onChange: (value: number) => void\n min: number\n max: number\n step?: number\n disabled?: boolean\n label?: string\n unit?: string\n}\n\nfunction SliderInput({\n value,\n onChange,\n min,\n max,\n step = 1,\n disabled,\n label,\n unit = '',\n}: SliderInputProps) {\n return (\n <div style={styles.sliderGroup as CSSProperties}>\n {label && (\n <div style={styles.sliderHeader}>\n <label style={styles.sliderLabel as CSSProperties}>{label}</label>\n <span style={styles.sliderValue}>{value}{unit}</span>\n </div>\n )}\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={(e) => onChange(Number(e.target.value))}\n disabled={disabled}\n style={{\n ...styles.slider,\n ...(disabled ? { opacity: 0.5, cursor: 'not-allowed' } : {}),\n }}\n />\n </div>\n )\n}\n\n// =============================================================================\n// TransformField Component\n// =============================================================================\n\nfunction TransformFieldInner({\n value,\n onChange,\n label,\n readOnly,\n}: TransformFieldProps) {\n const [show3D, setShow3D] = useState(value?.enable3D ?? false)\n\n // Use default if no value\n const currentValue = value || DEFAULT_TRANSFORM\n\n // Handle individual value changes\n const handleChange = useCallback(\n <K extends keyof TransformValue>(key: K, newValue: TransformValue[K]) => {\n onChange({\n ...currentValue,\n [key]: newValue,\n })\n },\n [currentValue, onChange]\n )\n\n // Handle scale change with locking\n const handleScaleChange = useCallback(\n (axis: 'scaleX' | 'scaleY', newValue: number) => {\n if (currentValue.scaleLocked) {\n onChange({\n ...currentValue,\n scaleX: newValue,\n scaleY: newValue,\n })\n } else {\n onChange({\n ...currentValue,\n [axis]: newValue,\n })\n }\n },\n [currentValue, onChange]\n )\n\n // Handle scale lock toggle\n const handleScaleLockToggle = useCallback(() => {\n if (!currentValue.scaleLocked) {\n // When locking, sync both to X value\n onChange({\n ...currentValue,\n scaleLocked: true,\n scaleY: currentValue.scaleX,\n })\n } else {\n onChange({\n ...currentValue,\n scaleLocked: false,\n })\n }\n }, [currentValue, onChange])\n\n // Handle 3D toggle\n const handle3DToggle = useCallback(\n (enabled: boolean) => {\n setShow3D(enabled)\n onChange({\n ...currentValue,\n enable3D: enabled,\n })\n },\n [currentValue, onChange]\n )\n\n // Handle clear\n const handleClear = useCallback(() => {\n onChange(null)\n }, [onChange])\n\n // Get preview styles\n const previewStyles = transformValueToCSS(currentValue) || {}\n\n return (\n <div className=\"puck-field\" style={styles.container}>\n {/* Header */}\n <div style={styles.header}>\n {label && (\n <label style={styles.label}>{label}</label>\n )}\n {value && !readOnly && (\n <button\n type=\"button\"\n onClick={handleClear}\n style={styles.clearButton}\n title=\"Reset transform\"\n >\n <X style={{ width: '16px', height: '16px' }} />\n </button>\n )}\n </div>\n\n {/* Live Preview */}\n <div style={styles.preview}>\n <div style={{ ...styles.previewBox, ...previewStyles }}>\n Aa\n </div>\n </div>\n\n {/* Rotate */}\n <div style={styles.section as CSSProperties}>\n <div style={styles.sectionTitle}>\n <RotateCw style={{ width: '16px', height: '16px', color: 'var(--theme-elevation-500)' }} />\n <label style={styles.sectionLabel}>Rotate</label>\n </div>\n <SliderInput\n value={currentValue.rotate}\n onChange={(v) => handleChange('rotate', v)}\n min={-360}\n max={360}\n disabled={readOnly}\n unit=\"deg\"\n />\n </div>\n\n {/* Scale */}\n <div style={styles.section as CSSProperties}>\n <div style={styles.sectionHeader}>\n <div style={styles.sectionTitle}>\n <Maximize2 style={{ width: '16px', height: '16px', color: 'var(--theme-elevation-500)' }} />\n <label style={styles.sectionLabel}>Scale</label>\n </div>\n {!readOnly && (\n <button\n type=\"button\"\n onClick={handleScaleLockToggle}\n style={currentValue.scaleLocked ? styles.linkButtonActive : styles.linkButton}\n title={currentValue.scaleLocked ? 'Click to unlink X and Y scale' : 'Click to link X and Y scale'}\n >\n {currentValue.scaleLocked ? (\n <Link style={{ width: '12px', height: '12px' }} />\n ) : (\n <Unlink style={{ width: '12px', height: '12px' }} />\n )}\n </button>\n )}\n </div>\n\n <div style={currentValue.scaleLocked ? {} : styles.grid}>\n <SliderInput\n label={currentValue.scaleLocked ? 'Scale' : 'Scale X'}\n value={currentValue.scaleX}\n onChange={(v) => handleScaleChange('scaleX', v)}\n min={0.1}\n max={3}\n step={0.1}\n disabled={readOnly}\n />\n {!currentValue.scaleLocked && (\n <SliderInput\n label=\"Scale Y\"\n value={currentValue.scaleY}\n onChange={(v) => handleScaleChange('scaleY', v)}\n min={0.1}\n max={3}\n step={0.1}\n disabled={readOnly}\n />\n )}\n </div>\n </div>\n\n {/* Skew */}\n <div style={styles.section as CSSProperties}>\n <label style={styles.sectionLabel}>Skew</label>\n <div style={styles.grid}>\n <SliderInput\n label=\"Skew X\"\n value={currentValue.skewX}\n onChange={(v) => handleChange('skewX', v)}\n min={-45}\n max={45}\n disabled={readOnly}\n unit=\"deg\"\n />\n <SliderInput\n label=\"Skew Y\"\n value={currentValue.skewY}\n onChange={(v) => handleChange('skewY', v)}\n min={-45}\n max={45}\n disabled={readOnly}\n unit=\"deg\"\n />\n </div>\n </div>\n\n {/* Translate */}\n <div style={styles.section as CSSProperties}>\n <div style={styles.translateRow}>\n <label style={styles.sectionLabel}>Translate</label>\n <select\n value={currentValue.translateUnit}\n onChange={(e) => handleChange('translateUnit', e.target.value as TranslateUnit)}\n disabled={readOnly}\n style={styles.select}\n >\n <option value=\"px\">px</option>\n <option value=\"rem\">rem</option>\n <option value=\"%\">%</option>\n </select>\n </div>\n <div style={styles.grid}>\n <div style={styles.inputGroup as CSSProperties}>\n <label style={styles.inputLabel as CSSProperties}>X</label>\n <input\n type=\"number\"\n value={currentValue.translateX}\n onChange={(e) => handleChange('translateX', parseFloat(e.target.value) || 0)}\n disabled={readOnly}\n style={styles.input}\n />\n </div>\n <div style={styles.inputGroup as CSSProperties}>\n <label style={styles.inputLabel as CSSProperties}>Y</label>\n <input\n type=\"number\"\n value={currentValue.translateY}\n onChange={(e) => handleChange('translateY', parseFloat(e.target.value) || 0)}\n disabled={readOnly}\n style={styles.input}\n />\n </div>\n </div>\n </div>\n\n {/* Transform Origin */}\n <div style={styles.section as CSSProperties}>\n <label style={styles.sectionLabel}>Transform Origin</label>\n <div style={styles.originRow}>\n <OriginGrid\n value={currentValue.origin}\n onChange={(v) => handleChange('origin', v)}\n disabled={readOnly}\n />\n <span style={styles.originLabel}>\n {currentValue.origin.replace('-', ' ')}\n </span>\n </div>\n </div>\n\n {/* 3D Section (Collapsible) */}\n <div style={styles.collapsible}>\n <button\n type=\"button\"\n onClick={() => setShow3D(!show3D)}\n style={styles.collapsibleHeader}\n >\n <div style={styles.collapsibleTitle}>\n <Box style={{ width: '16px', height: '16px', color: 'var(--theme-elevation-500)' }} />\n <label style={styles.sectionLabel}>3D Transforms</label>\n </div>\n {show3D ? (\n <ChevronDown style={{ width: '16px', height: '16px', color: 'var(--theme-elevation-500)' }} />\n ) : (\n <ChevronRight style={{ width: '16px', height: '16px', color: 'var(--theme-elevation-500)' }} />\n )}\n </button>\n\n {show3D && (\n <div style={styles.collapsibleContent as CSSProperties}>\n {/* Enable 3D checkbox */}\n <div style={styles.checkboxRow}>\n <input\n type=\"checkbox\"\n id=\"enable3d\"\n checked={currentValue.enable3D}\n onChange={(e) => handle3DToggle(e.target.checked)}\n disabled={readOnly}\n style={styles.checkbox}\n />\n <label htmlFor=\"enable3d\" style={styles.checkboxLabel}>\n Enable 3D Transforms\n </label>\n </div>\n\n {currentValue.enable3D && (\n <>\n {/* Perspective */}\n <div style={styles.inputGroup as CSSProperties}>\n <label style={styles.inputLabel as CSSProperties}>\n Perspective (px)\n </label>\n <input\n type=\"number\"\n min={100}\n max={2000}\n value={currentValue.perspective ?? 1000}\n onChange={(e) => handleChange('perspective', parseInt(e.target.value, 10) || 1000)}\n disabled={readOnly}\n style={styles.input}\n />\n </div>\n\n {/* Rotate X/Y */}\n <div style={styles.grid}>\n <SliderInput\n label=\"Rotate X\"\n value={currentValue.rotateX ?? 0}\n onChange={(v) => handleChange('rotateX', v)}\n min={-180}\n max={180}\n disabled={readOnly}\n unit=\"deg\"\n />\n <SliderInput\n label=\"Rotate Y\"\n value={currentValue.rotateY ?? 0}\n onChange={(v) => handleChange('rotateY', v)}\n min={-180}\n max={180}\n disabled={readOnly}\n unit=\"deg\"\n />\n </div>\n </>\n )}\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport const TransformField = memo(TransformFieldInner)\n\n// =============================================================================\n// Field Configuration Factory\n// =============================================================================\n\n/**\n * Creates a Puck field configuration for CSS transforms\n */\nexport function createTransformField(config: {\n label?: string\n}): CustomField<TransformValue | null> {\n return {\n type: 'custom',\n label: config.label,\n render: ({ value, onChange, readOnly }) => (\n <TransformField\n value={value}\n onChange={onChange}\n label={config.label}\n readOnly={readOnly}\n />\n ),\n }\n}\n"],"names":["React","useCallback","memo","useState","Link","Unlink","RotateCw","Maximize2","X","ChevronDown","ChevronRight","Box","DEFAULT_TRANSFORM","transformValueToCSS","styles","container","display","flexDirection","gap","header","alignItems","justifyContent","label","fontSize","fontWeight","color","clearButton","width","height","padding","border","borderRadius","backgroundColor","cursor","preview","overflow","previewBox","transition","section","sectionHeader","sectionTitle","sectionLabel","linkButton","linkButtonActive","grid","gridTemplateColumns","sliderGroup","sliderHeader","sliderLabel","textTransform","letterSpacing","sliderValue","fontFamily","slider","accentColor","translateRow","flexWrap","select","inputGroup","inputLabel","input","originGrid","originButton","originButtonActive","originDot","originDotActive","originRow","originLabel","collapsible","collapsibleHeader","collapsibleTitle","collapsibleContent","borderTop","checkboxRow","checkbox","checkboxLabel","ORIGIN_POSITIONS","OriginGrid","value","onChange","disabled","div","style","map","origin","isActive","button","type","onClick","opacity","title","replace","span","SliderInput","min","max","step","unit","e","Number","target","TransformFieldInner","readOnly","show3D","setShow3D","enable3D","currentValue","handleChange","key","newValue","handleScaleChange","axis","scaleLocked","scaleX","scaleY","handleScaleLockToggle","handle3DToggle","enabled","handleClear","previewStyles","className","rotate","v","skewX","skewY","translateUnit","option","translateX","parseFloat","translateY","id","checked","htmlFor","perspective","parseInt","rotateX","rotateY","TransformField","createTransformField","config","render"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VerticalAlignmentField.d.ts","sourceRoot":"","sources":["../../src/fields/VerticalAlignmentField.tsx"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,OAAO,KAAgD,MAAM,OAAO,CAAA;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAYnD,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,QAAQ,GAAG,UAAU,CAAA;AAEpE,UAAU,2BAA2B;IACnC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAA;IAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,KAAK,IAAI,CAAA;IACnD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,YAAY,CAAC,EAAE,iBAAiB,CAAA;CACjC;AA2ED,iBAAS,2BAA2B,CAAC,EACnC,KAAK,EACL,QAAQ,EACR,KAA4B,EAC5B,QAAQ,EACR,YAAuB,GACxB,EAAE,2BAA2B,qBAyD7B;AAED,eAAO,MAAM,sBAAsB,+DAAoC,CAAA;AAMvE,UAAU,kCAAkC;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,iBAAiB,CAAA;CACjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,GAAE,kCAAuC,GAC9C,WAAW,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAcvC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/fields/VerticalAlignmentField.tsx"],"sourcesContent":["'use client'\n\n/**\n * VerticalAlignmentField - Icon toggle buttons for vertical/self alignment\n *\n * Used for grid item self-alignment (e.g., in TextImageSplit)\n * Controls how an item aligns itself within its grid/flex cell.\n */\n\nimport React, { useCallback, memo, type CSSProperties } from 'react'\nimport type { CustomField } from '@puckeditor/core'\nimport {\n AlignStartVertical,\n AlignCenterVertical,\n AlignEndVertical,\n X,\n} from 'lucide-react'\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type VerticalAlignment = 'flex-start' | 'center' | 'flex-end'\n\ninterface VerticalAlignmentFieldProps {\n value: VerticalAlignment | null\n onChange: (value: VerticalAlignment | null) => void\n label?: string\n readOnly?: boolean\n defaultValue?: VerticalAlignment\n}\n\n// =============================================================================\n// Styles\n// =============================================================================\n\nconst styles = {\n container: {\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n } as CSSProperties,\n header: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n } as CSSProperties,\n label: {\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--theme-elevation-800)',\n } as CSSProperties,\n clearButton: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '24px',\n height: '24px',\n padding: 0,\n border: 'none',\n borderRadius: '4px',\n backgroundColor: 'transparent',\n color: 'var(--theme-elevation-500)',\n cursor: 'pointer',\n } as CSSProperties,\n buttonGroup: {\n display: 'flex',\n gap: '4px',\n } as CSSProperties,\n button: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n padding: 0,\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: '4px',\n backgroundColor: 'var(--theme-bg)',\n color: 'var(--theme-elevation-700)',\n cursor: 'pointer',\n } as CSSProperties,\n buttonActive: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n padding: 0,\n border: '1px solid var(--theme-elevation-800)',\n borderRadius: '4px',\n backgroundColor: 'var(--theme-elevation-800)',\n color: 'var(--theme-bg)',\n cursor: 'pointer',\n } as CSSProperties,\n buttonDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n } as CSSProperties,\n}\n\n// =============================================================================\n// VerticalAlignmentField Component\n// =============================================================================\n\nfunction VerticalAlignmentFieldInner({\n value,\n onChange,\n label = 'Vertical Alignment',\n readOnly,\n defaultValue = 'center',\n}: VerticalAlignmentFieldProps) {\n const currentValue = value ?? defaultValue\n\n const handleChange = useCallback((alignment: VerticalAlignment) => {\n onChange(alignment)\n }, [onChange])\n\n const handleClear = useCallback(() => {\n onChange(null)\n }, [onChange])\n\n const options = [\n { value: 'flex-start' as VerticalAlignment, icon: AlignStartVertical, title: 'Top' },\n { value: 'center' as VerticalAlignment, icon: AlignCenterVertical, title: 'Center' },\n { value: 'flex-end' as VerticalAlignment, icon: AlignEndVertical, title: 'Bottom' },\n ]\n\n return (\n <div className=\"puck-field\" style={styles.container}>\n <div style={styles.header}>\n <label style={styles.label}>\n {label}\n </label>\n {value && !readOnly && (\n <button\n type=\"button\"\n onClick={handleClear}\n style={styles.clearButton}\n title=\"Reset to default\"\n >\n <X style={{ width: '16px', height: '16px' }} />\n </button>\n )}\n </div>\n\n <div style={styles.buttonGroup}>\n {options.map(({ value: optionValue, icon: Icon, title }) => {\n const isActive = currentValue === optionValue\n return (\n <button\n key={optionValue}\n type=\"button\"\n onClick={() => handleChange(optionValue)}\n disabled={readOnly}\n style={{\n ...(isActive ? styles.buttonActive : styles.button),\n ...(readOnly ? styles.buttonDisabled : {}),\n }}\n title={title}\n >\n <Icon style={{ width: '16px', height: '16px' }} />\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n\nexport const VerticalAlignmentField = memo(VerticalAlignmentFieldInner)\n\n// =============================================================================\n// Field Configuration Factory\n// =============================================================================\n\ninterface CreateVerticalAlignmentFieldConfig {\n label?: string\n defaultValue?: VerticalAlignment\n}\n\n/**\n * Creates a Puck field configuration for vertical/self alignment control\n *\n * @example\n * ```ts\n * fields: {\n * verticalAlignment: createVerticalAlignmentField({ label: 'Vertical Alignment' }),\n * }\n * ```\n */\nexport function createVerticalAlignmentField(\n config: CreateVerticalAlignmentFieldConfig = {}\n): CustomField<VerticalAlignment | null> {\n return {\n type: 'custom',\n label: config.label,\n render: ({ value, onChange, readOnly }) => (\n <VerticalAlignmentField\n value={value}\n onChange={onChange}\n label={config.label}\n readOnly={readOnly}\n defaultValue={config.defaultValue}\n />\n ),\n }\n}\n"],"names":["React","useCallback","memo","AlignStartVertical","AlignCenterVertical","AlignEndVertical","X","styles","container","display","flexDirection","gap","header","alignItems","justifyContent","label","fontSize","fontWeight","color","clearButton","width","height","padding","border","borderRadius","backgroundColor","cursor","buttonGroup","button","buttonActive","buttonDisabled","opacity","VerticalAlignmentFieldInner","value","onChange","readOnly","defaultValue","currentValue","handleChange","alignment","handleClear","options","icon","title","div","className","style","type","onClick","map","optionValue","Icon","isActive","disabled","VerticalAlignmentField","createVerticalAlignmentField","config","render"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WidthField.d.ts","sourceRoot":"","sources":["../../src/fields/WidthField.tsx"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAgD,MAAM,OAAO,CAAA;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAUnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAU7C,UAAU,eAAe;IACvB,KAAK,EAAE,UAAU,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,KAAK,IAAI,CAAA;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAoPD,iBAAS,eAAe,CAAC,EACvB,KAAK,EACL,QAAQ,EACR,KAAK,EACL,QAAQ,GACT,EAAE,eAAe,qBAoMjB;AAED,eAAO,MAAM,UAAU,mDAAwB,CAAA;AAM/C;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,GAAG,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC,CAajC"}
|