@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/editor/components/HeaderActions.tsx"],"sourcesContent":["'use client'\n\nimport { memo, useCallback, type ReactNode, type CSSProperties } from 'react'\nimport { createUsePuck, type Data } from '@puckeditor/core'\nimport {\n ArrowLeft,\n Save,\n ExternalLink,\n Loader2,\n Check,\n MousePointerClick,\n MousePointer,\n Upload,\n X,\n AlertTriangle,\n Eye,\n} from 'lucide-react'\nimport { VersionHistory } from './VersionHistory.js'\nimport { PreviewModeToggle } from './PreviewModeToggle.js'\nimport { VERSION } from '../../version.js'\n\n// Create usePuck hook for accessing editor state\nconst usePuck = createUsePuck()\n\nexport interface HeaderActionsProps {\n /**\n * Default Puck header actions (undo/redo, publish button)\n */\n children: ReactNode\n /**\n * Handler for back button click\n */\n onBack: () => void\n /**\n * Handler for preview button click\n */\n onPreview: () => void\n /**\n * Handler for save button click\n */\n onSave: (data: Data) => void\n /**\n * Handler for publish button click (optional, uses default Puck publish if not provided)\n */\n onPublish?: (data: Data) => void\n /**\n * Handler for unpublish button click (reverts to draft)\n */\n onUnpublish?: () => void\n /**\n * Whether a save operation is in progress\n */\n isSaving: boolean\n /**\n * Whether there are unsaved changes\n */\n hasUnsavedChanges: boolean\n /**\n * Last saved timestamp\n */\n lastSaved: Date | null\n /**\n * Document status from Payload (_status field)\n * Shows visual indicator for draft vs published\n */\n documentStatus?: 'draft' | 'published'\n /**\n * Whether the document has ever been published (initially or during this session)\n * Used to show \"Unpublished Changes\" vs \"Draft\" badge\n */\n wasPublished?: boolean\n /**\n * Custom actions to render at the start of the header\n */\n actionsStart?: ReactNode\n /**\n * Custom actions to render at the end of the header (before publish)\n */\n actionsEnd?: ReactNode\n /**\n * Whether to show the save draft button\n * @default true\n */\n showSaveDraft?: boolean\n /**\n * Whether to show the view page button\n * @default true\n */\n showViewPage?: boolean\n /**\n * Whether to show the interactive mode toggle\n * @default false\n * @deprecated Use the Preview button instead\n */\n showInteractiveToggle?: boolean\n /**\n * Whether to show the preview button\n * @default true\n */\n showPreviewButton?: boolean\n /**\n * Handler for opening the preview modal\n */\n onOpenPreview?: () => void\n /**\n * Whether to show the version history button in the header\n * @default true\n * @deprecated Version history has moved to the plugin rail. This prop will be removed in a future version.\n */\n showVersionHistory?: boolean\n /**\n * Page ID for version history (required if showVersionHistory is true)\n */\n pageId?: string\n /**\n * API endpoint base path for version history\n * @default '/api/puck/pages'\n */\n apiEndpoint?: string\n /**\n * Error message to display (e.g., validation errors)\n */\n saveError?: string | null\n /**\n * Handler to dismiss the error message\n */\n onDismissError?: () => void\n\n // Preview dark mode toggle props\n\n /**\n * Whether to show the preview dark mode toggle\n * @default false\n */\n showPreviewDarkModeToggle?: boolean\n /**\n * Current state of preview dark mode\n */\n previewDarkMode?: boolean\n /**\n * Handler for toggling preview dark mode\n */\n onPreviewDarkModeChange?: (isDarkMode: boolean) => void\n}\n\n// Shared styles\nconst styles = {\n buttonBase: {\n display: 'inline-flex',\n alignItems: 'center',\n whiteSpace: 'nowrap',\n fontSize: '14px',\n fontWeight: 500,\n borderRadius: '6px',\n transition: 'background-color 0.15s, border-color 0.15s',\n cursor: 'pointer',\n border: 'none',\n } as CSSProperties,\n buttonSecondary: {\n padding: '6px 12px',\n backgroundColor: 'var(--theme-bg)',\n color: 'var(--theme-elevation-700)',\n border: '1px solid var(--theme-elevation-200)',\n } as CSSProperties,\n buttonPrimary: {\n padding: '6px 12px',\n backgroundColor: 'var(--theme-elevation-900)',\n color: 'var(--theme-bg)',\n border: '1px solid var(--theme-elevation-900)',\n } as CSSProperties,\n buttonDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n } as CSSProperties,\n icon: {\n width: '16px',\n height: '16px',\n marginRight: '4px',\n flexShrink: 0,\n } as CSSProperties,\n iconSmall: {\n width: '14px',\n height: '14px',\n } as CSSProperties,\n badge: {\n padding: '4px 10px',\n borderRadius: '9999px',\n fontSize: '12px',\n fontWeight: 500,\n whiteSpace: 'nowrap',\n } as CSSProperties,\n badgePublished: {\n backgroundColor: 'var(--theme-success-100)',\n color: 'var(--theme-success-700)',\n border: '1px solid var(--theme-success-200)',\n } as CSSProperties,\n badgeUnpublished: {\n backgroundColor: 'var(--theme-warning-100)',\n color: 'var(--theme-warning-700)',\n border: '1px solid var(--theme-warning-200)',\n } as CSSProperties,\n badgeDraft: {\n backgroundColor: 'var(--theme-elevation-100)',\n color: 'var(--theme-elevation-600)',\n border: '1px solid var(--theme-elevation-200)',\n } as CSSProperties,\n statusText: {\n fontSize: '12px',\n color: 'var(--theme-elevation-500)',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n whiteSpace: 'nowrap',\n } as CSSProperties,\n unsavedText: {\n fontSize: '12px',\n color: 'var(--theme-warning-600)',\n fontWeight: 500,\n whiteSpace: 'nowrap',\n } as CSSProperties,\n versionText: {\n fontSize: '10px',\n color: 'var(--theme-elevation-400)',\n fontFamily: 'monospace',\n } as CSSProperties,\n linkButton: {\n background: 'none',\n border: 'none',\n padding: '4px 8px',\n fontSize: '12px',\n color: 'var(--theme-elevation-500)',\n cursor: 'pointer',\n textDecoration: 'underline',\n textUnderlineOffset: '2px',\n } as CSSProperties,\n errorButton: {\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '6px 10px',\n backgroundColor: 'var(--theme-error-50)',\n border: '1px solid var(--theme-error-200)',\n borderRadius: '6px',\n color: 'var(--theme-error-700)',\n fontSize: '12px',\n fontWeight: 500,\n cursor: 'pointer',\n } as CSSProperties,\n modalOverlay: {\n position: 'fixed',\n inset: 0,\n zIndex: 9999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n } as CSSProperties,\n modalContainer: {\n backgroundColor: 'var(--theme-bg)',\n borderRadius: '8px',\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.25)',\n maxWidth: '448px',\n width: '100%',\n margin: '0 16px',\n overflow: 'hidden',\n } as CSSProperties,\n modalHeader: {\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '16px 20px',\n borderBottom: '1px solid var(--theme-elevation-150)',\n backgroundColor: 'var(--theme-error-50)',\n } as CSSProperties,\n modalIconWrapper: {\n flexShrink: 0,\n width: '40px',\n height: '40px',\n borderRadius: '50%',\n backgroundColor: 'var(--theme-error-100)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n } as CSSProperties,\n modalTitle: {\n fontSize: '16px',\n fontWeight: 600,\n color: 'var(--theme-elevation-900)',\n margin: 0,\n } as CSSProperties,\n modalSubtitle: {\n fontSize: '14px',\n color: 'var(--theme-elevation-500)',\n margin: 0,\n } as CSSProperties,\n modalBody: {\n padding: '16px 20px',\n } as CSSProperties,\n modalBodyText: {\n fontSize: '14px',\n color: 'var(--theme-elevation-700)',\n margin: 0,\n } as CSSProperties,\n modalFooter: {\n padding: '16px 20px',\n backgroundColor: 'var(--theme-elevation-50)',\n borderTop: '1px solid var(--theme-elevation-150)',\n display: 'flex',\n justifyContent: 'flex-end',\n } as CSSProperties,\n toggleContainer: {\n display: 'flex',\n gap: '4px',\n } as CSSProperties,\n toggleButton: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '12px',\n fontWeight: 500,\n borderRadius: '4px',\n transition: 'background-color 0.15s',\n padding: '6px 10px',\n cursor: 'pointer',\n } as CSSProperties,\n toggleActive: {\n backgroundColor: 'var(--theme-elevation-900)',\n color: 'var(--theme-bg)',\n border: '1px solid var(--theme-elevation-900)',\n } as CSSProperties,\n toggleInactive: {\n backgroundColor: 'var(--theme-elevation-100)',\n color: 'var(--theme-elevation-500)',\n border: '1px solid var(--theme-elevation-200)',\n } as CSSProperties,\n}\n\n/**\n * Custom header actions component for the Puck editor\n *\n * Provides standard actions: Back, Edit/Interactive toggle, View Page, Save Draft\n * Also displays save status and last saved time.\n */\nexport const HeaderActions = memo(function HeaderActions({\n children,\n onBack,\n onPreview,\n onSave,\n onPublish,\n onUnpublish,\n isSaving,\n hasUnsavedChanges,\n lastSaved,\n documentStatus,\n wasPublished,\n actionsStart,\n actionsEnd,\n showSaveDraft = true,\n showViewPage = true,\n showInteractiveToggle = false,\n showPreviewButton = true,\n onOpenPreview,\n showVersionHistory = true,\n pageId,\n apiEndpoint = '/api/puck/pages',\n saveError,\n onDismissError,\n showPreviewDarkModeToggle = false,\n previewDarkMode = false,\n onPreviewDarkModeChange,\n}: HeaderActionsProps) {\n const appState = usePuck((s) => s.appState)\n const dispatch = usePuck((s) => s.dispatch)\n\n const isInteractive = appState.ui.previewMode === 'interactive'\n\n const togglePreviewMode = useCallback(() => {\n dispatch({\n type: 'setUi',\n ui: {\n previewMode: isInteractive ? 'edit' : 'interactive',\n },\n })\n }, [dispatch, isInteractive])\n\n const handleSaveClick = useCallback(() => {\n onSave(appState.data)\n }, [onSave, appState.data])\n\n const handlePublishClick = useCallback(() => {\n if (onPublish) {\n onPublish(appState.data)\n }\n }, [onPublish, appState.data])\n\n return (\n <>\n {/* Custom actions at start */}\n {actionsStart}\n\n {/* Back button */}\n <button\n type=\"button\"\n onClick={onBack}\n style={{ ...styles.buttonBase, ...styles.buttonSecondary }}\n >\n <ArrowLeft style={styles.icon} />\n Back\n </button>\n\n {/* Version indicator for debugging */}\n <span style={styles.versionText}>v{VERSION}</span>\n\n {/* Document status badge */}\n {documentStatus && (() => {\n const isPublished = documentStatus === 'published'\n const hasUnpublishedChanges = documentStatus === 'draft' && wasPublished\n\n let badgeLabel: string\n let badgeStyle: CSSProperties\n\n if (isPublished) {\n badgeLabel = 'Published'\n badgeStyle = { ...styles.badge, ...styles.badgePublished }\n } else if (hasUnpublishedChanges) {\n badgeLabel = 'Unpublished Changes'\n badgeStyle = { ...styles.badge, ...styles.badgeUnpublished }\n } else {\n badgeLabel = 'Draft'\n badgeStyle = { ...styles.badge, ...styles.badgeDraft }\n }\n\n return <span style={badgeStyle}>{badgeLabel}</span>\n })()}\n\n {/* Interactive mode toggle */}\n {showInteractiveToggle && (\n <div style={styles.toggleContainer}>\n <button\n type=\"button\"\n onClick={() => isInteractive && togglePreviewMode()}\n style={{\n ...styles.toggleButton,\n ...(!isInteractive ? styles.toggleActive : styles.toggleInactive),\n }}\n >\n <MousePointer style={styles.iconSmall} />\n Edit\n </button>\n <button\n type=\"button\"\n onClick={() => !isInteractive && togglePreviewMode()}\n style={{\n ...styles.toggleButton,\n ...(isInteractive ? styles.toggleActive : styles.toggleInactive),\n }}\n >\n <MousePointerClick style={styles.iconSmall} />\n Interactive\n </button>\n </div>\n )}\n\n {/* Preview dark mode toggle */}\n {showPreviewDarkModeToggle && onPreviewDarkModeChange && (\n <PreviewModeToggle\n isDarkMode={previewDarkMode}\n onToggle={onPreviewDarkModeChange}\n disabled={isSaving}\n />\n )}\n\n {/* Status indicators */}\n {lastSaved && !saveError && (\n <span style={styles.statusText}>\n <Check style={{ width: '12px', height: '12px', flexShrink: 0 }} />\n Saved {lastSaved.toLocaleTimeString()}\n </span>\n )}\n {hasUnsavedChanges && !saveError && (\n <span style={styles.unsavedText}>Unsaved</span>\n )}\n\n {/* Error indicator in header - clicking opens modal */}\n {saveError && (\n <button\n type=\"button\"\n onClick={() => {}}\n style={styles.errorButton}\n >\n <AlertTriangle style={{ width: '16px', height: '16px', color: 'var(--theme-error-500)', flexShrink: 0 }} />\n Error\n </button>\n )}\n\n {/* Error Modal */}\n {saveError && (\n <div\n style={styles.modalOverlay}\n onClick={onDismissError}\n >\n <div\n style={styles.modalContainer}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Modal Header */}\n <div style={styles.modalHeader}>\n <div style={styles.modalIconWrapper}>\n <AlertTriangle style={{ width: '20px', height: '20px', color: 'var(--theme-error-600)' }} />\n </div>\n <div>\n <h3 style={styles.modalTitle}>Save Failed</h3>\n <p style={styles.modalSubtitle}>Unable to save your changes</p>\n </div>\n </div>\n\n {/* Modal Body */}\n <div style={styles.modalBody}>\n <p style={styles.modalBodyText}>{saveError}</p>\n </div>\n\n {/* Modal Footer */}\n <div style={styles.modalFooter}>\n <button\n type=\"button\"\n onClick={onDismissError}\n style={{ ...styles.buttonBase, ...styles.buttonPrimary }}\n >\n Close\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Preview modal button */}\n {showPreviewButton && onOpenPreview && (\n <button\n type=\"button\"\n onClick={onOpenPreview}\n disabled={isSaving}\n style={{\n ...styles.buttonBase,\n ...styles.buttonPrimary,\n ...(isSaving ? styles.buttonDisabled : {}),\n }}\n >\n <Eye style={styles.icon} />\n Preview\n </button>\n )}\n\n {/* View published page in new tab */}\n {showViewPage && (\n <button\n type=\"button\"\n onClick={onPreview}\n style={{ ...styles.buttonBase, ...styles.buttonSecondary }}\n >\n <ExternalLink style={styles.icon} />\n View\n </button>\n )}\n\n {/* Version History */}\n {showVersionHistory && pageId && (\n <VersionHistory\n pageId={pageId}\n apiEndpoint={apiEndpoint}\n disabled={isSaving}\n />\n )}\n\n {/* Save Draft button */}\n {showSaveDraft && (\n <button\n type=\"button\"\n onClick={handleSaveClick}\n disabled={isSaving || !hasUnsavedChanges}\n style={{\n ...styles.buttonBase,\n ...styles.buttonSecondary,\n ...((isSaving || !hasUnsavedChanges) ? styles.buttonDisabled : {}),\n }}\n >\n {isSaving ? (\n <Loader2 style={{ ...styles.icon, animation: 'spin 1s linear infinite' }} />\n ) : (\n <Save style={styles.icon} />\n )}\n Save\n </button>\n )}\n\n {/* Custom publish button if handler provided */}\n {onPublish && (\n <button\n type=\"button\"\n onClick={handlePublishClick}\n disabled={isSaving}\n style={{\n ...styles.buttonBase,\n ...styles.buttonPrimary,\n ...(isSaving ? styles.buttonDisabled : {}),\n }}\n >\n {isSaving ? (\n <Loader2 style={{ ...styles.icon, animation: 'spin 1s linear infinite' }} />\n ) : (\n <Upload style={styles.icon} />\n )}\n Publish\n </button>\n )}\n\n {/* Unpublish link (only shown when document is published) */}\n {onUnpublish && documentStatus === 'published' && (\n <button\n type=\"button\"\n onClick={onUnpublish}\n disabled={isSaving}\n style={{\n ...styles.linkButton,\n ...(isSaving ? { opacity: 0.5, cursor: 'not-allowed' } : {}),\n }}\n >\n Unpublish\n </button>\n )}\n\n {/* Custom actions at end */}\n {actionsEnd}\n\n {/* Default Puck actions (undo/redo, publish button if no custom handler) */}\n {!onPublish && children}\n </>\n )\n})\n"],"names":["memo","useCallback","createUsePuck","ArrowLeft","Save","ExternalLink","Loader2","Check","MousePointerClick","MousePointer","Upload","AlertTriangle","Eye","VersionHistory","PreviewModeToggle","VERSION","usePuck","styles","buttonBase","display","alignItems","whiteSpace","fontSize","fontWeight","borderRadius","transition","cursor","border","buttonSecondary","padding","backgroundColor","color","buttonPrimary","buttonDisabled","opacity","icon","width","height","marginRight","flexShrink","iconSmall","badge","badgePublished","badgeUnpublished","badgeDraft","statusText","gap","unsavedText","versionText","fontFamily","linkButton","background","textDecoration","textUnderlineOffset","errorButton","modalOverlay","position","inset","zIndex","justifyContent","modalContainer","boxShadow","maxWidth","margin","overflow","modalHeader","borderBottom","modalIconWrapper","modalTitle","modalSubtitle","modalBody","modalBodyText","modalFooter","borderTop","toggleContainer","toggleButton","toggleActive","toggleInactive","HeaderActions","children","onBack","onPreview","onSave","onPublish","onUnpublish","isSaving","hasUnsavedChanges","lastSaved","documentStatus","wasPublished","actionsStart","actionsEnd","showSaveDraft","showViewPage","showInteractiveToggle","showPreviewButton","onOpenPreview","showVersionHistory","pageId","apiEndpoint","saveError","onDismissError","showPreviewDarkModeToggle","previewDarkMode","onPreviewDarkModeChange","appState","s","dispatch","isInteractive","ui","previewMode","togglePreviewMode","type","handleSaveClick","data","handlePublishClick","button","onClick","style","span","isPublished","hasUnpublishedChanges","badgeLabel","badgeStyle","div","isDarkMode","onToggle","disabled","toLocaleTimeString","e","stopPropagation","h3","p","animation"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"IframeWrapper.d.ts","sourceRoot":"","sources":["../../../src/editor/components/IframeWrapper.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAiE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAA;AAEzH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAM9D;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,yCAAsC,CAAA;AAE1E;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,mBAAmB,sBAA4C,CAAA;AAE5E;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,MAAM,EAAE,OAAO,CAAA;IACf;;OAEG;IACH,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB;;OAEG;IACH,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB;AAaD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,SAAS,CAAA;IACnB;;OAEG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB;;;OAGG;IACH,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IAC1C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;OAKG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAClC;AAUD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,aAAa,0DAmYxB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/editor/components/IframeWrapper.tsx"],"sourcesContent":["'use client'\n\nimport { memo, useEffect, useMemo, useState, createContext, useContext, type ReactNode, type ComponentType } from 'react'\nimport { createUsePuck } from '@puckeditor/core'\nimport type { LayoutDefinition } from '../../layouts/index.js'\nimport { backgroundValueToCSS, type BackgroundValue } from '../../fields/shared.js'\n\n// Create usePuck hook for accessing editor state\nconst usePuck = createUsePuck()\n\n/**\n * Context for preview dark mode state.\n * - `null` = not inside the editor (use DOM-based theme detection)\n * - `boolean` = inside the editor, indicates current dark mode state\n *\n * This allows Puck components to reactively respond to preview theme changes\n * without polling or MutationObserver hacks.\n */\nexport const PuckPreviewThemeContext = createContext<boolean | null>(null)\n\n/**\n * Hook to get the current preview theme from IframeWrapper context.\n *\n * @returns `null` if not inside the editor, or a `boolean` indicating dark mode state\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const previewTheme = usePuckPreviewTheme()\n *\n * // If in editor, use context; otherwise fall back to DOM\n * const isDark = previewTheme !== null\n * ? previewTheme\n * : document.documentElement.getAttribute('data-theme') === 'dark'\n *\n * return <div className={isDark ? 'dark-styles' : 'light-styles'}>...</div>\n * }\n * ```\n */\nexport const usePuckPreviewTheme = () => useContext(PuckPreviewThemeContext)\n\n/**\n * Layout style configuration for theme-aware preview\n * @deprecated Use LayoutDefinition with editorBackground and editorDarkMode instead\n */\nexport interface LayoutStyle {\n /**\n * CSS background value (color, gradient, etc.)\n */\n background: string\n /**\n * Whether this layout uses dark mode styling\n */\n isDark: boolean\n /**\n * Header component to render above the page content in the editor preview\n */\n header?: ComponentType\n /**\n * Footer component to render below the page content in the editor preview\n */\n footer?: ComponentType\n}\n\n/**\n * Internal layout config used by the iframe wrapper\n */\ninterface InternalLayoutConfig {\n background: string\n isDark: boolean\n header?: ComponentType\n footer?: ComponentType\n stickyHeaderHeight?: number\n}\n\nexport interface IframeWrapperProps {\n children: ReactNode\n /**\n * The iframe document to apply styles to\n */\n document?: Document\n /**\n * Layout definitions - the primary way to configure layouts.\n * Reads header, footer, editorBackground, and editorDarkMode from each layout.\n */\n layouts?: LayoutDefinition[]\n /**\n * Layout style configurations keyed by layout value\n * @deprecated Use `layouts` prop instead\n */\n layoutStyles?: Record<string, LayoutStyle>\n /**\n * Key in root.props to read layout value from\n * @default 'pageLayout'\n */\n layoutKey?: string\n /**\n * Default layout to use if none specified\n * @default 'default'\n */\n defaultLayout?: string\n /**\n * Stylesheet URLs to inject into the iframe.\n * These are merged from PuckConfigProvider and layout-specific settings.\n * Use this to provide frontend CSS (Tailwind, CSS variables, etc.) that\n * header/footer components need for proper styling.\n */\n editorStylesheets?: string[]\n /**\n * Raw CSS to inject into the iframe.\n * Merged from PuckConfigProvider and layout-specific settings.\n * Useful for CSS variables or style overrides.\n */\n editorCss?: string\n /**\n * Override the layout's dark mode setting for the preview.\n * When true, forces dark mode in the preview iframe.\n * When false, forces light mode in the preview iframe.\n * When undefined, uses the layout's editorDarkMode setting.\n */\n previewDarkModeOverride?: boolean\n}\n\n/**\n * Default layout config\n */\nconst DEFAULT_LAYOUT_CONFIG: InternalLayoutConfig = {\n background: '#ffffff',\n isDark: false,\n}\n\n/**\n * Theme-aware iframe wrapper component\n *\n * Uses usePuck to read the pageLayout from root.props and applies\n * appropriate background and theme class to the preview iframe.\n *\n * @example\n * ```tsx\n * // Using layouts (recommended)\n * const overrides = {\n * iframe: ({ children, document }) => (\n * <IframeWrapper\n * document={document}\n * layouts={[\n * { value: 'default', label: 'Default', header: Header, footer: Footer },\n * { value: 'landing', label: 'Landing', editorBackground: '#f8fafc' },\n * ]}\n * >\n * {children}\n * </IframeWrapper>\n * ),\n * }\n * ```\n */\nexport const IframeWrapper = memo(function IframeWrapper({\n children,\n document: iframeDoc,\n layouts,\n layoutStyles,\n layoutKey = 'pageLayout',\n defaultLayout = 'default',\n editorStylesheets,\n editorCss,\n previewDarkModeOverride,\n}: IframeWrapperProps) {\n const appState = usePuck((s) => s.appState)\n\n // Track stylesheet loading state to force re-render when styles are ready\n const [stylesLoaded, setStylesLoaded] = useState(false)\n\n // Check if we're in interactive mode (links should be clickable)\n const isInteractive = appState.ui.previewMode === 'interactive'\n\n // Read layout value and page-level overrides from root props\n const rootProps = appState.data.root?.props as Record<string, unknown> | undefined\n const layoutValue = (rootProps?.[layoutKey] as string) || defaultLayout\n\n // Page-level overrides\n const showHeaderOverride = rootProps?.showHeader as 'default' | 'show' | 'hide' | undefined\n const showFooterOverride = rootProps?.showFooter as 'default' | 'show' | 'hide' | undefined\n const pageBackground = rootProps?.pageBackground as BackgroundValue | null | undefined\n\n // Convert layouts array to config map, or use deprecated layoutStyles\n const layoutConfigMap = useMemo<Record<string, InternalLayoutConfig>>(() => {\n // If layouts prop provided, convert to internal format\n if (layouts) {\n const map: Record<string, InternalLayoutConfig> = {}\n for (const layout of layouts) {\n map[layout.value] = {\n background: layout.editorBackground ?? '#ffffff',\n isDark: layout.editorDarkMode ?? false,\n header: layout.header,\n footer: layout.footer,\n stickyHeaderHeight: layout.stickyHeaderHeight,\n }\n }\n return map\n }\n\n // Fall back to deprecated layoutStyles if provided\n if (layoutStyles) {\n return layoutStyles\n }\n\n // Default fallback\n return { default: DEFAULT_LAYOUT_CONFIG }\n }, [layouts, layoutStyles])\n\n // Get config for current layout\n const layoutConfig = layoutConfigMap[layoutValue] || layoutConfigMap[defaultLayout] || DEFAULT_LAYOUT_CONFIG\n\n // Calculate isDark for context provider (same logic as in useEffect)\n const isDark = previewDarkModeOverride ?? layoutConfig.isDark\n\n useEffect(() => {\n if (!iframeDoc) return\n\n const body = iframeDoc.body\n const html = iframeDoc.documentElement\n\n // Apply background - page-level override takes precedence\n if (pageBackground) {\n const bgStyles = backgroundValueToCSS(pageBackground)\n // Clear previous background styles\n body.style.background = ''\n body.style.backgroundColor = ''\n body.style.backgroundImage = ''\n // Apply new styles\n Object.assign(body.style, bgStyles)\n } else {\n body.style.background = layoutConfig.background\n }\n body.style.backgroundAttachment = 'fixed'\n body.style.minHeight = '100vh'\n\n // Apply theme class and data-theme attribute for dark/light mode\n // Supports both patterns: CSS classes (.dark/.light) and data attributes ([data-theme='dark'])\n // previewDarkModeOverride takes precedence over layoutConfig.isDark\n if (isDark) {\n html.classList.add('dark')\n html.classList.remove('light')\n html.setAttribute('data-theme', 'dark')\n body.style.color = '#ffffff'\n } else {\n html.classList.remove('dark')\n html.classList.add('light')\n html.setAttribute('data-theme', 'light')\n body.style.color = '#1f2937' // gray-800\n }\n\n // Inject external stylesheets (Tailwind CSS, CSS variables, etc.)\n // These provide the styles needed for header/footer components\n if (editorStylesheets && editorStylesheets.length > 0) {\n let pendingLoads = 0\n let loadedCount = 0\n\n const checkAllLoaded = () => {\n loadedCount++\n if (loadedCount >= pendingLoads) {\n // All stylesheets loaded - force browser to recalculate styles\n // This is necessary because the DOM was already rendered before CSS loaded\n setStylesLoaded(true)\n\n // Force a browser repaint after styles load\n // Use multiple techniques to ensure CSS is applied to existing elements\n requestAnimationFrame(() => {\n if (!html || !body) return\n\n // Technique 1: Re-apply theme classes (mimics what dark mode toggle does)\n const isDark = previewDarkModeOverride ?? layoutConfig.isDark\n if (isDark) {\n html.classList.remove('dark')\n void html.offsetHeight // Force reflow\n html.classList.add('dark')\n } else {\n html.classList.remove('light')\n void html.offsetHeight // Force reflow\n html.classList.add('light')\n }\n\n // Technique 2: Toggle visibility to force repaint\n body.style.visibility = 'hidden'\n void body.offsetHeight\n body.style.visibility = ''\n })\n }\n }\n\n // Get origin for resolving relative URLs\n // Puck's iframe may use srcdoc which doesn't have a proper base URL,\n // so relative paths like '/api/puck/styles' won't resolve correctly\n const origin = typeof window !== 'undefined' ? window.location.origin : ''\n\n // Track which stylesheets have been counted to avoid double-counting\n const loadedIndexes = new Set<number>()\n\n const markLoaded = (index: number) => {\n if (loadedIndexes.has(index)) return\n loadedIndexes.add(index)\n checkAllLoaded()\n }\n\n editorStylesheets.forEach((href, index) => {\n const linkId = `puck-editor-stylesheet-${index}`\n const existingLink = iframeDoc.getElementById(linkId) as HTMLLinkElement | null\n\n if (!existingLink) {\n pendingLoads++\n const link = iframeDoc.createElement('link')\n link.id = linkId\n link.rel = 'stylesheet'\n // Resolve relative URLs to absolute URLs for iframe compatibility\n link.href = href.startsWith('/') ? `${origin}${href}` : href\n // Track when stylesheet loads\n link.onload = () => markLoaded(index)\n link.onerror = () => markLoaded(index) // Count errors too to avoid hanging\n iframeDoc.head.appendChild(link)\n\n // Fallback: if onload doesn't fire within 2 seconds, force trigger\n // This handles edge cases with cached resources or browser quirks\n setTimeout(() => {\n if (!loadedIndexes.has(index)) {\n markLoaded(index)\n }\n }, 2000)\n } else if (!stylesLoaded) {\n // Link exists - assume it's already loaded\n pendingLoads++\n // Immediately mark as loaded since it's already in the DOM\n requestAnimationFrame(() => markLoaded(index))\n }\n })\n\n // If no new stylesheets to load, mark as loaded\n if (pendingLoads === 0 && !stylesLoaded) {\n setStylesLoaded(true)\n }\n } else if (!stylesLoaded) {\n // No stylesheets to load\n setStylesLoaded(true)\n }\n\n // Inject custom CSS (CSS variables, overrides, etc.)\n if (editorCss) {\n const CUSTOM_CSS_ID = 'puck-editor-custom-css'\n let style = iframeDoc.getElementById(CUSTOM_CSS_ID) as HTMLStyleElement | null\n if (!style) {\n style = iframeDoc.createElement('style')\n style.id = CUSTOM_CSS_ID\n iframeDoc.head.appendChild(style)\n }\n style.textContent = editorCss\n }\n\n // Inject richtext-output styles into the iframe for proper heading/list rendering\n const RICHTEXT_STYLES_ID = 'puck-richtext-output-styles'\n if (!iframeDoc.getElementById(RICHTEXT_STYLES_ID)) {\n const style = iframeDoc.createElement('style')\n style.id = RICHTEXT_STYLES_ID\n style.textContent = `\n /* Rich Text Output Styles for Puck Preview */\n .richtext-output {\n font-size: 1.125rem;\n line-height: 1.75;\n color: inherit;\n }\n .richtext-output h1 {\n margin-top: 2rem;\n margin-bottom: 1rem;\n font-weight: 700;\n font-size: 2.25rem;\n line-height: 1.2;\n }\n .richtext-output h1:first-child { margin-top: 0; }\n .richtext-output h2 {\n margin-top: 2rem;\n margin-bottom: 1rem;\n font-weight: 700;\n font-size: 1.875rem;\n line-height: 1.25;\n }\n .richtext-output h2:first-child { margin-top: 0; }\n .richtext-output h3 {\n margin-top: 2rem;\n margin-bottom: 1rem;\n font-weight: 700;\n font-size: 1.5rem;\n line-height: 1.3;\n }\n .richtext-output h3:first-child { margin-top: 0; }\n .richtext-output h4 {\n margin-top: 2rem;\n margin-bottom: 1rem;\n font-weight: 700;\n font-size: 1.25rem;\n line-height: 1.35;\n }\n .richtext-output h4:first-child { margin-top: 0; }\n .richtext-output p {\n margin-bottom: 1.25rem;\n }\n .richtext-output p:last-child { margin-bottom: 0; }\n .richtext-output ul {\n margin-bottom: 1.25rem;\n padding-left: 2rem;\n list-style-type: disc !important;\n }\n .richtext-output ol {\n margin-bottom: 1.25rem;\n padding-left: 2rem;\n list-style-type: decimal !important;\n }\n .richtext-output li {\n margin-bottom: 0.5rem;\n display: list-item !important;\n }\n .richtext-output li::marker {\n color: currentColor;\n }\n .richtext-output ul ul,\n .richtext-output ol ul {\n list-style-type: circle !important;\n margin-top: 0.5rem;\n margin-bottom: 0;\n }\n .richtext-output ul ul ul,\n .richtext-output ol ul ul {\n list-style-type: square !important;\n }\n .richtext-output ol ol,\n .richtext-output ul ol {\n list-style-type: lower-alpha !important;\n margin-top: 0.5rem;\n margin-bottom: 0;\n }\n .richtext-output blockquote {\n margin: 1.5rem 0;\n padding-left: 1.5rem;\n border-left: 4px solid #e5e7eb;\n font-style: italic;\n }\n .richtext-output a {\n color: #2563eb;\n text-decoration: underline;\n }\n .richtext-output a:hover { opacity: 0.8; }\n .richtext-output code {\n background-color: #f3f4f6;\n padding: 0.125rem 0.25rem;\n border-radius: 0.25rem;\n font-size: 0.875rem;\n }\n .richtext-output mark {\n background-color: #fef08a;\n padding: 0.125rem 0.25rem;\n border-radius: 0.125rem;\n }\n .richtext-output s,\n .richtext-output strike {\n text-decoration: line-through;\n }\n @media (max-width: 768px) {\n .richtext-output { font-size: 1rem; }\n .richtext-output h1 { font-size: 1.875rem; }\n .richtext-output h2 { font-size: 1.5rem; }\n .richtext-output h3 { font-size: 1.25rem; }\n }\n `\n iframeDoc.head.appendChild(style)\n }\n }, [iframeDoc, layoutConfig, pageBackground, editorStylesheets, editorCss, stylesLoaded, previewDarkModeOverride])\n\n // Get header/footer components from layout config\n const LayoutHeader = layoutConfig.header\n const LayoutFooter = layoutConfig.footer\n\n // Determine header/footer visibility based on page-level overrides\n // 'default' or undefined = use layout setting\n // 'show' = always show (even if layout doesn't have one - use layout's component)\n // 'hide' = always hide\n const shouldShowHeader =\n showHeaderOverride === 'hide'\n ? false\n : showHeaderOverride === 'show'\n ? !!LayoutHeader\n : !!LayoutHeader\n\n const shouldShowFooter =\n showFooterOverride === 'hide'\n ? false\n : showFooterOverride === 'show'\n ? !!LayoutFooter\n : !!LayoutFooter\n\n // If we have header or footer to show, wrap in flex container to ensure proper layout\n if (shouldShowHeader || shouldShowFooter) {\n // Calculate content padding for sticky headers (only if header is actually shown)\n const contentStyle: React.CSSProperties = {\n flex: 1,\n position: 'relative',\n // Add padding-top for sticky headers so content doesn't render behind them\n ...(shouldShowHeader && layoutConfig.stickyHeaderHeight && { paddingTop: layoutConfig.stickyHeaderHeight }),\n }\n\n // Disable pointer events on header/footer in edit mode to prevent accidental clicks\n const headerFooterStyle: React.CSSProperties = isInteractive\n ? {}\n : { pointerEvents: 'none' }\n\n // Use key to force re-render when styles finish loading\n // This ensures Tailwind classes are applied after the stylesheet loads\n return (\n <PuckPreviewThemeContext.Provider value={isDark}>\n <div\n key={stylesLoaded ? 'styles-loaded' : 'styles-loading'}\n style={{ display: 'flex', flexDirection: 'column', minHeight: '100vh' }}\n >\n {shouldShowHeader && LayoutHeader && (\n <div style={headerFooterStyle}>\n <LayoutHeader />\n </div>\n )}\n <div style={contentStyle}>{children}</div>\n {shouldShowFooter && LayoutFooter && (\n <div style={headerFooterStyle}>\n <LayoutFooter />\n </div>\n )}\n </div>\n </PuckPreviewThemeContext.Provider>\n )\n }\n\n // Use key to force re-render when styles finish loading\n return (\n <PuckPreviewThemeContext.Provider value={isDark}>\n <div key={stylesLoaded ? 'styles-loaded' : 'styles-loading'}>\n {children}\n </div>\n </PuckPreviewThemeContext.Provider>\n )\n})\n"],"names":["memo","useEffect","useMemo","useState","createContext","useContext","createUsePuck","backgroundValueToCSS","usePuck","PuckPreviewThemeContext","usePuckPreviewTheme","DEFAULT_LAYOUT_CONFIG","background","isDark","IframeWrapper","children","document","iframeDoc","layouts","layoutStyles","layoutKey","defaultLayout","editorStylesheets","editorCss","previewDarkModeOverride","appState","s","stylesLoaded","setStylesLoaded","isInteractive","ui","previewMode","rootProps","data","root","props","layoutValue","showHeaderOverride","showHeader","showFooterOverride","showFooter","pageBackground","layoutConfigMap","map","layout","value","editorBackground","editorDarkMode","header","footer","stickyHeaderHeight","default","layoutConfig","body","html","documentElement","bgStyles","style","backgroundColor","backgroundImage","Object","assign","backgroundAttachment","minHeight","classList","add","remove","setAttribute","color","length","pendingLoads","loadedCount","checkAllLoaded","requestAnimationFrame","offsetHeight","visibility","origin","window","location","loadedIndexes","Set","markLoaded","index","has","forEach","href","linkId","existingLink","getElementById","link","createElement","id","rel","startsWith","onload","onerror","head","appendChild","setTimeout","CUSTOM_CSS_ID","textContent","RICHTEXT_STYLES_ID","LayoutHeader","LayoutFooter","shouldShowHeader","shouldShowFooter","contentStyle","flex","position","paddingTop","headerFooterStyle","pointerEvents","Provider","div","display","flexDirection"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LoadingState.d.ts","sourceRoot":"","sources":["../../../src/editor/components/LoadingState.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAAE,OAA6B,EAAE,EAAE,iBAAiB,+BAShF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/editor/components/LoadingState.tsx"],"sourcesContent":["'use client'\n\nimport { Loader2 } from 'lucide-react'\n\nexport interface LoadingStateProps {\n /**\n * Loading message to display\n * @default 'Loading editor...'\n */\n message?: string\n}\n\n/**\n * Loading indicator shown while the Puck editor is being loaded\n *\n * Used as the fallback for dynamic import with ssr: false\n */\nexport function LoadingState({ message = 'Loading editor...' }: LoadingStateProps) {\n return (\n <div className=\"h-screen flex items-center justify-center bg-gray-50\">\n <div className=\"text-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-gray-600 mx-auto mb-4\" />\n <p className=\"text-gray-600\">{message}</p>\n </div>\n </div>\n )\n}\n"],"names":["Loader2","LoadingState","message","div","className","p"],"mappings":"AAAA;;AAEA,SAASA,OAAO,QAAQ,eAAc;AAUtC;;;;CAIC,GACD,OAAO,SAASC,aAAa,EAAEC,UAAU,mBAAmB,EAAqB;IAC/E,qBACE,KAACC;QAAIC,WAAU;kBACb,cAAA,MAACD;YAAIC,WAAU;;8BACb,KAACJ;oBAAQI,WAAU;;8BACnB,KAACC;oBAAED,WAAU;8BAAiBF;;;;;AAItC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PreviewModal.d.ts","sourceRoot":"","sources":["../../../src/editor/components/PreviewModal.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAgC9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAE9D,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,MAAM,EAAE,OAAO,CAAA;IACf;;OAEG;IACH,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB;;OAEG;IACH,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAA;IACrB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IAC3B;;OAEG;IACH,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;OAGG;IACH,MAAM,CAAC,EAAE,UAAU,CAAA;CACpB;AA0MD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,yDA4QvB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/editor/components/PreviewModal.tsx"],"sourcesContent":["'use client'\n\nimport { useState, useCallback, memo, useEffect, useMemo, type MouseEvent, type CSSProperties } from 'react'\nimport type { Data as PuckData, Config as PuckConfig } from '@puckeditor/core'\n\n/**\n * Editor-only props that should be stripped from data before preview rendering.\n * These props are used for editor/panel synchronization and shouldn't affect\n * how content renders in the preview.\n */\nconst EDITOR_ONLY_PROPS = ['editorPreviewFilter'] as const\n\n/**\n * Removes editor-only props from Puck data content items.\n * This ensures the preview renders as it would on the frontend,\n * without editor-specific state interfering.\n */\nfunction stripEditorOnlyProps(data: PuckData): PuckData {\n return {\n ...data,\n content: data.content.map((item) => {\n const cleanedProps = { ...item.props }\n for (const prop of EDITOR_ONLY_PROPS) {\n delete cleanedProps[prop]\n }\n return { ...item, props: cleanedProps }\n }),\n }\n}\nimport {\n X,\n ExternalLink,\n AlertTriangle,\n} from 'lucide-react'\nimport { PageRenderer } from '../../render/PageRenderer.js'\nimport type { LayoutDefinition } from '../../layouts/index.js'\n\nexport interface PreviewModalProps {\n /**\n * Whether the modal is open\n */\n isOpen: boolean\n /**\n * Handler for closing the modal\n */\n onClose: () => void\n /**\n * Puck data to render in the preview\n */\n data: PuckData | null\n /**\n * Page title for the modal header\n */\n pageTitle?: string\n /**\n * Handler for opening the page in a new tab\n */\n onOpenInNewTab?: () => void\n /**\n * Available layouts for rendering\n */\n layouts?: LayoutDefinition[]\n /**\n * Whether there are unsaved changes in the editor\n */\n hasUnsavedChanges?: boolean\n /**\n * Handler to save the current data before navigating\n */\n onSave?: () => Promise<void>\n /**\n * Whether a save is in progress\n */\n isSaving?: boolean\n /**\n * Stylesheet URLs to inject into the preview\n */\n editorStylesheets?: string[]\n /**\n * Raw CSS to inject into the preview\n */\n editorCss?: string\n /**\n * Puck configuration with components for rendering.\n * Required for custom components to render correctly in the preview.\n */\n config?: PuckConfig\n}\n\n// Styles\nconst styles = {\n overlay: {\n position: 'fixed',\n inset: 0,\n zIndex: 9990,\n backgroundColor: 'var(--theme-bg)',\n } as CSSProperties,\n controlPanel: {\n position: 'fixed',\n top: '50%',\n right: '16px',\n transform: 'translateY(-50%)',\n zIndex: 9998,\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n alignItems: 'flex-end',\n } as CSSProperties,\n controlCard: {\n backgroundColor: 'var(--theme-bg)',\n borderRadius: '8px',\n boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n border: '1px solid var(--theme-elevation-200)',\n padding: '8px',\n display: 'flex',\n flexDirection: 'column',\n gap: '4px',\n } as CSSProperties,\n closeButton: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '8px 12px',\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--theme-bg)',\n backgroundColor: 'var(--theme-elevation-900)',\n borderRadius: '6px',\n transition: 'background-color 0.15s',\n border: 'none',\n cursor: 'pointer',\n } as CSSProperties,\n viewButton: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '8px 12px',\n fontSize: '14px',\n color: 'var(--theme-elevation-600)',\n backgroundColor: 'transparent',\n borderRadius: '6px',\n transition: 'background-color 0.15s, color 0.15s',\n border: 'none',\n cursor: 'pointer',\n } as CSSProperties,\n unsavedBadge: {\n backgroundColor: 'var(--theme-warning-100)',\n color: 'var(--theme-warning-700)',\n padding: '6px 12px',\n borderRadius: '9999px',\n fontSize: '12px',\n fontWeight: 500,\n boxShadow: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',\n } as CSSProperties,\n content: {\n height: '100%',\n overflow: 'auto',\n backgroundColor: 'var(--theme-bg)',\n } as CSSProperties,\n emptyState: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n color: 'var(--theme-elevation-500)',\n } as CSSProperties,\n // Navigation dialog styles\n dialogOverlay: {\n position: 'fixed',\n inset: 0,\n zIndex: 9999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n } as CSSProperties,\n dialogContainer: {\n backgroundColor: 'var(--theme-bg)',\n borderRadius: '8px',\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.25)',\n maxWidth: '448px',\n width: '100%',\n margin: '0 16px',\n overflow: 'hidden',\n } as CSSProperties,\n dialogHeader: {\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '16px 20px',\n borderBottom: '1px solid var(--theme-elevation-200)',\n backgroundColor: 'var(--theme-warning-50)',\n } as CSSProperties,\n dialogIconWrapper: {\n flexShrink: 0,\n width: '40px',\n height: '40px',\n borderRadius: '50%',\n backgroundColor: 'var(--theme-warning-100)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n } as CSSProperties,\n dialogTitle: {\n fontSize: '16px',\n fontWeight: 600,\n color: 'var(--theme-elevation-900)',\n margin: 0,\n } as CSSProperties,\n dialogSubtitle: {\n fontSize: '14px',\n color: 'var(--theme-elevation-500)',\n margin: 0,\n } as CSSProperties,\n dialogBody: {\n padding: '16px 20px',\n } as CSSProperties,\n dialogBodyText: {\n fontSize: '14px',\n color: 'var(--theme-elevation-700)',\n margin: 0,\n marginBottom: '8px',\n } as CSSProperties,\n dialogUrl: {\n fontSize: '14px',\n fontFamily: 'monospace',\n backgroundColor: 'var(--theme-elevation-100)',\n padding: '8px 12px',\n borderRadius: '4px',\n color: 'var(--theme-elevation-800)',\n wordBreak: 'break-all',\n } as CSSProperties,\n dialogWarning: {\n fontSize: '14px',\n color: 'var(--theme-warning-600)',\n marginTop: '12px',\n fontWeight: 500,\n } as CSSProperties,\n dialogFooter: {\n padding: '16px 20px',\n backgroundColor: 'var(--theme-elevation-50)',\n borderTop: '1px solid var(--theme-elevation-200)',\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n } as CSSProperties,\n buttonSecondary: {\n padding: '8px 16px',\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--theme-elevation-700)',\n backgroundColor: 'var(--theme-bg)',\n border: '1px solid var(--theme-elevation-300)',\n borderRadius: '6px',\n transition: 'background-color 0.15s',\n cursor: 'pointer',\n } as CSSProperties,\n buttonPrimary: {\n padding: '8px 16px',\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--theme-bg)',\n backgroundColor: 'var(--theme-elevation-900)',\n border: 'none',\n borderRadius: '6px',\n transition: 'background-color 0.15s',\n cursor: 'pointer',\n } as CSSProperties,\n buttonDanger: {\n padding: '8px 16px',\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--theme-error-700)',\n backgroundColor: 'var(--theme-error-50)',\n border: '1px solid var(--theme-error-200)',\n borderRadius: '6px',\n transition: 'background-color 0.15s',\n cursor: 'pointer',\n } as CSSProperties,\n buttonDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n } as CSSProperties,\n icon: {\n width: '16px',\n height: '16px',\n } as CSSProperties,\n}\n\n/**\n * Full-screen preview modal with client-side rendering\n *\n * Renders the current editor data directly using PageRenderer.\n * Links prompt for confirmation before navigating (with option to save first).\n *\n * Features:\n * - Zero consumer setup required\n * - Shows current editor state (including unsaved changes)\n * - Interactive elements (accordions, hover states) still work\n * - Links show confirmation dialog before navigating\n */\nexport const PreviewModal = memo(function PreviewModal({\n isOpen,\n onClose,\n data,\n pageTitle,\n onOpenInNewTab,\n layouts,\n hasUnsavedChanges = false,\n onSave,\n isSaving = false,\n editorStylesheets,\n editorCss,\n config,\n}: PreviewModalProps) {\n // Strip editor-only props from data to ensure preview renders like frontend\n const cleanedData = useMemo(() => {\n return data ? stripEditorOnlyProps(data) : null\n }, [data])\n\n // Navigation confirmation state\n const [pendingNavigation, setPendingNavigation] = useState<string | null>(null)\n const [isNavigating, setIsNavigating] = useState(false)\n const [viewButtonHovered, setViewButtonHovered] = useState(false)\n\n // Inject stylesheets into document head when modal is open\n useEffect(() => {\n if (!isOpen) return\n\n const injectedElements: HTMLElement[] = []\n\n // Inject external stylesheets\n if (editorStylesheets && editorStylesheets.length > 0) {\n editorStylesheets.forEach((href, index) => {\n const linkId = `puck-preview-stylesheet-${index}`\n if (!document.getElementById(linkId)) {\n const link = document.createElement('link')\n link.id = linkId\n link.rel = 'stylesheet'\n link.href = href\n document.head.appendChild(link)\n injectedElements.push(link)\n }\n })\n }\n\n // Inject custom CSS\n if (editorCss) {\n const styleId = 'puck-preview-custom-css'\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style')\n style.id = styleId\n style.textContent = editorCss\n document.head.appendChild(style)\n injectedElements.push(style)\n }\n }\n\n // Cleanup: remove injected elements when modal closes\n return () => {\n injectedElements.forEach((el) => el.remove())\n }\n }, [isOpen, editorStylesheets, editorCss])\n\n // Handle escape key\n useEffect(() => {\n if (!isOpen) return\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n if (pendingNavigation) {\n setPendingNavigation(null)\n } else {\n onClose()\n }\n }\n }\n\n document.addEventListener('keydown', handleEscape)\n return () => document.removeEventListener('keydown', handleEscape)\n }, [isOpen, pendingNavigation, onClose])\n\n // Intercept link clicks\n const handleContentClick = useCallback((e: MouseEvent<HTMLDivElement>) => {\n const target = e.target as HTMLElement\n const anchor = target.closest('a')\n\n if (anchor) {\n const href = anchor.getAttribute('href')\n\n // Allow hash-only links (scroll to section on same page)\n if (href?.startsWith('#') && !href.includes('/')) {\n return\n }\n\n // Block navigation and show confirmation\n e.preventDefault()\n e.stopPropagation()\n\n if (href) {\n setPendingNavigation(href)\n }\n }\n }, [])\n\n // Handle navigation after confirmation\n const handleNavigate = useCallback((saveFirst: boolean) => {\n if (!pendingNavigation) return\n\n const navigate = () => {\n setIsNavigating(true)\n onClose()\n window.location.href = pendingNavigation\n }\n\n if (saveFirst && onSave) {\n onSave().then(navigate).catch(() => {\n setIsNavigating(false)\n })\n } else {\n navigate()\n }\n }, [pendingNavigation, onClose, onSave])\n\n // Cancel navigation\n const handleCancelNavigation = useCallback(() => {\n setPendingNavigation(null)\n }, [])\n\n if (!isOpen) return null\n\n return (\n <div style={styles.overlay}>\n {/* Floating control panel */}\n <div style={styles.controlPanel}>\n <div style={styles.controlCard}>\n {/* Close button */}\n <button\n type=\"button\"\n onClick={onClose}\n style={styles.closeButton}\n title=\"Close preview (Esc)\"\n >\n <X style={styles.icon} />\n Close Preview\n </button>\n\n {/* View page button */}\n {onOpenInNewTab && (\n <button\n type=\"button\"\n onClick={onOpenInNewTab}\n style={{\n ...styles.viewButton,\n ...(viewButtonHovered ? {\n backgroundColor: 'var(--theme-elevation-100)',\n color: 'var(--theme-elevation-900)',\n } : {}),\n }}\n onMouseEnter={() => setViewButtonHovered(true)}\n onMouseLeave={() => setViewButtonHovered(false)}\n title=\"Open published page in new tab\"\n >\n <ExternalLink style={styles.icon} />\n View Page\n </button>\n )}\n </div>\n\n {/* Status badge */}\n {hasUnsavedChanges && (\n <div style={styles.unsavedBadge}>\n Unsaved changes\n </div>\n )}\n </div>\n\n {/* Preview content */}\n <div\n style={styles.content}\n onClickCapture={handleContentClick}\n >\n {cleanedData ? (\n <PageRenderer data={cleanedData} layouts={layouts} config={config} />\n ) : (\n <div style={styles.emptyState}>\n No content to preview\n </div>\n )}\n </div>\n\n {/* Navigation confirmation dialog */}\n {pendingNavigation && (\n <div style={styles.dialogOverlay}>\n <div\n style={styles.dialogContainer}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div style={styles.dialogHeader}>\n <div style={styles.dialogIconWrapper}>\n <AlertTriangle style={{ width: '20px', height: '20px', color: 'var(--theme-warning-600)' }} />\n </div>\n <div>\n <h3 style={styles.dialogTitle}>Navigate away?</h3>\n <p style={styles.dialogSubtitle}>This will close the preview</p>\n </div>\n </div>\n\n {/* Body */}\n <div style={styles.dialogBody}>\n <p style={styles.dialogBodyText}>\n You're about to navigate to:\n </p>\n <p style={styles.dialogUrl}>\n {pendingNavigation}\n </p>\n {hasUnsavedChanges && (\n <p style={styles.dialogWarning}>\n You have unsaved changes that will be lost.\n </p>\n )}\n </div>\n\n {/* Footer */}\n <div style={styles.dialogFooter}>\n <div style={{ display: 'flex', gap: '8px', justifyContent: 'flex-end', flexWrap: 'wrap' }}>\n <button\n type=\"button\"\n onClick={handleCancelNavigation}\n disabled={isNavigating || isSaving}\n style={{\n ...styles.buttonSecondary,\n ...((isNavigating || isSaving) ? styles.buttonDisabled : {}),\n }}\n >\n Cancel\n </button>\n {hasUnsavedChanges && onSave && (\n <button\n type=\"button\"\n onClick={() => handleNavigate(true)}\n disabled={isNavigating || isSaving}\n style={{\n ...styles.buttonPrimary,\n ...((isNavigating || isSaving) ? styles.buttonDisabled : {}),\n }}\n >\n {isSaving ? 'Saving...' : 'Save & Navigate'}\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => handleNavigate(false)}\n disabled={isNavigating || isSaving}\n style={{\n ...(hasUnsavedChanges ? styles.buttonDanger : styles.buttonPrimary),\n ...((isNavigating || isSaving) ? styles.buttonDisabled : {}),\n }}\n >\n {isNavigating ? 'Navigating...' : hasUnsavedChanges ? 'Navigate without saving' : 'Navigate'}\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n )\n})\n"],"names":["useState","useCallback","memo","useEffect","useMemo","EDITOR_ONLY_PROPS","stripEditorOnlyProps","data","content","map","item","cleanedProps","props","prop","X","ExternalLink","AlertTriangle","PageRenderer","styles","overlay","position","inset","zIndex","backgroundColor","controlPanel","top","right","transform","display","flexDirection","gap","alignItems","controlCard","borderRadius","boxShadow","border","padding","closeButton","fontSize","fontWeight","color","transition","cursor","viewButton","unsavedBadge","height","overflow","emptyState","justifyContent","dialogOverlay","dialogContainer","maxWidth","width","margin","dialogHeader","borderBottom","dialogIconWrapper","flexShrink","dialogTitle","dialogSubtitle","dialogBody","dialogBodyText","marginBottom","dialogUrl","fontFamily","wordBreak","dialogWarning","marginTop","dialogFooter","borderTop","buttonSecondary","buttonPrimary","buttonDanger","buttonDisabled","opacity","icon","PreviewModal","isOpen","onClose","pageTitle","onOpenInNewTab","layouts","hasUnsavedChanges","onSave","isSaving","editorStylesheets","editorCss","config","cleanedData","pendingNavigation","setPendingNavigation","isNavigating","setIsNavigating","viewButtonHovered","setViewButtonHovered","injectedElements","length","forEach","href","index","linkId","document","getElementById","link","createElement","id","rel","head","appendChild","push","styleId","style","textContent","el","remove","handleEscape","e","key","addEventListener","removeEventListener","handleContentClick","target","anchor","closest","getAttribute","startsWith","includes","preventDefault","stopPropagation","handleNavigate","saveFirst","navigate","window","location","then","catch","handleCancelNavigation","div","button","type","onClick","title","onMouseEnter","onMouseLeave","onClickCapture","h3","p","flexWrap","disabled"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PreviewModeToggle.d.ts","sourceRoot":"","sources":["../../../src/editor/components/PreviewModeToggle.tsx"],"names":[],"mappings":"AAwCA,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,UAAU,EAAE,OAAO,CAAA;IACnB;;OAEG;IACH,QAAQ,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAA;IACvC;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,8DAuC5B,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/editor/components/PreviewModeToggle.tsx"],"sourcesContent":["'use client'\n\nimport { memo, type CSSProperties } from 'react'\nimport { Sun, Moon } from 'lucide-react'\n\nconst styles = {\n container: {\n display: 'flex',\n alignItems: 'center',\n gap: '2px',\n padding: '2px',\n backgroundColor: 'var(--puck-color-grey-11, #e8e8e8)',\n borderRadius: '6px',\n } as CSSProperties,\n button: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '28px',\n height: '28px',\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n transition: 'background-color 0.15s, color 0.15s',\n } as CSSProperties,\n buttonActive: {\n backgroundColor: 'var(--puck-color-white, #ffffff)',\n color: 'var(--puck-color-grey-02, #3d3d3d)',\n boxShadow: '0 1px 2px rgba(0, 0, 0, 0.05)',\n } as CSSProperties,\n buttonInactive: {\n backgroundColor: 'transparent',\n color: 'var(--puck-color-grey-05, #8f8f8f)',\n } as CSSProperties,\n icon: {\n width: '14px',\n height: '14px',\n } as CSSProperties,\n}\n\nexport interface PreviewModeToggleProps {\n /**\n * Whether dark mode is currently enabled in the preview\n */\n isDarkMode: boolean\n /**\n * Callback when the mode is toggled\n */\n onToggle: (isDarkMode: boolean) => void\n /**\n * Whether the toggle is disabled\n */\n disabled?: boolean\n}\n\n/**\n * Toggle button for switching preview iframe between light/dark modes.\n *\n * This controls the preview content's dark mode independently from the\n * editor UI dark mode. Useful for testing how the page looks in both modes.\n *\n * @example\n * ```tsx\n * const [previewDarkMode, setPreviewDarkMode] = useState(false)\n *\n * <PreviewModeToggle\n * isDarkMode={previewDarkMode}\n * onToggle={setPreviewDarkMode}\n * />\n * ```\n */\nexport const PreviewModeToggle = memo(function PreviewModeToggle({\n isDarkMode,\n onToggle,\n disabled = false,\n}: PreviewModeToggleProps) {\n return (\n <div\n style={{\n ...styles.container,\n ...(disabled ? { opacity: 0.5, pointerEvents: 'none' } : {}),\n }}\n title=\"Toggle preview dark/light mode\"\n >\n <button\n type=\"button\"\n onClick={() => onToggle(false)}\n style={{\n ...styles.button,\n ...(!isDarkMode ? styles.buttonActive : styles.buttonInactive),\n }}\n aria-label=\"Light mode preview\"\n aria-pressed={!isDarkMode}\n >\n <Sun style={styles.icon} />\n </button>\n <button\n type=\"button\"\n onClick={() => onToggle(true)}\n style={{\n ...styles.button,\n ...(isDarkMode ? styles.buttonActive : styles.buttonInactive),\n }}\n aria-label=\"Dark mode preview\"\n aria-pressed={isDarkMode}\n >\n <Moon style={styles.icon} />\n </button>\n </div>\n )\n})\n"],"names":["memo","Sun","Moon","styles","container","display","alignItems","gap","padding","backgroundColor","borderRadius","button","justifyContent","width","height","border","cursor","transition","buttonActive","color","boxShadow","buttonInactive","icon","PreviewModeToggle","isDarkMode","onToggle","disabled","div","style","opacity","pointerEvents","title","type","onClick","aria-label","aria-pressed"],"mappings":"AAAA;;AAEA,SAASA,IAAI,QAA4B,QAAO;AAChD,SAASC,GAAG,EAAEC,IAAI,QAAQ,eAAc;AAExC,MAAMC,SAAS;IACbC,WAAW;QACTC,SAAS;QACTC,YAAY;QACZC,KAAK;QACLC,SAAS;QACTC,iBAAiB;QACjBC,cAAc;IAChB;IACAC,QAAQ;QACNN,SAAS;QACTC,YAAY;QACZM,gBAAgB;QAChBC,OAAO;QACPC,QAAQ;QACRC,QAAQ;QACRL,cAAc;QACdM,QAAQ;QACRC,YAAY;IACd;IACAC,cAAc;QACZT,iBAAiB;QACjBU,OAAO;QACPC,WAAW;IACb;IACAC,gBAAgB;QACdZ,iBAAiB;QACjBU,OAAO;IACT;IACAG,MAAM;QACJT,OAAO;QACPC,QAAQ;IACV;AACF;AAiBA;;;;;;;;;;;;;;;CAeC,GACD,OAAO,MAAMS,kCAAoBvB,KAAK,SAASuB,kBAAkB,EAC/DC,UAAU,EACVC,QAAQ,EACRC,WAAW,KAAK,EACO;IACvB,qBACE,MAACC;QACCC,OAAO;YACL,GAAGzB,OAAOC,SAAS;YACnB,GAAIsB,WAAW;gBAAEG,SAAS;gBAAKC,eAAe;YAAO,IAAI,CAAC,CAAC;QAC7D;QACAC,OAAM;;0BAEN,KAACpB;gBACCqB,MAAK;gBACLC,SAAS,IAAMR,SAAS;gBACxBG,OAAO;oBACL,GAAGzB,OAAOQ,MAAM;oBAChB,GAAI,CAACa,aAAarB,OAAOe,YAAY,GAAGf,OAAOkB,cAAc;gBAC/D;gBACAa,cAAW;gBACXC,gBAAc,CAACX;0BAEf,cAAA,KAACvB;oBAAI2B,OAAOzB,OAAOmB,IAAI;;;0BAEzB,KAACX;gBACCqB,MAAK;gBACLC,SAAS,IAAMR,SAAS;gBACxBG,OAAO;oBACL,GAAGzB,OAAOQ,MAAM;oBAChB,GAAIa,aAAarB,OAAOe,YAAY,GAAGf,OAAOkB,cAAc;gBAC9D;gBACAa,cAAW;gBACXC,gBAAcX;0BAEd,cAAA,KAACtB;oBAAK0B,OAAOzB,OAAOmB,IAAI;;;;;AAIhC,GAAE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VersionHistory.d.ts","sourceRoot":"","sources":["../../../src/editor/components/VersionHistory.tsx"],"names":[],"mappings":"AAYA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,OAAO,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;QAC/B,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;KAClB,CAAA;IACD,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAA;IAC1C;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAgLD;;;;GAIG;AACH,eAAO,MAAM,cAAc,2DAyPzB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/editor/components/VersionHistory.tsx"],"sourcesContent":["'use client'\n\nimport { useState, useCallback, useEffect, useRef, memo, type CSSProperties } from 'react'\nimport {\n History,\n Loader2,\n Check,\n RotateCcw,\n X,\n ChevronDown,\n} from 'lucide-react'\n\n/**\n * Version entry from Payload's versions system\n */\nexport interface PageVersion {\n id: string\n parent: string\n version: {\n title?: string\n slug?: string\n _status?: 'draft' | 'published'\n updatedAt: string\n createdAt: string\n }\n createdAt: string\n updatedAt: string\n autosave?: boolean\n latest?: boolean\n}\n\nexport interface VersionHistoryProps {\n /**\n * Page ID to fetch versions for\n */\n pageId: string\n /**\n * API endpoint base path\n * @default '/api/puck/pages'\n */\n apiEndpoint?: string\n /**\n * Callback when a version is restored\n */\n onRestore?: (version: PageVersion) => void\n /**\n * Whether restore operations are disabled\n */\n disabled?: boolean\n}\n\n// Shared styles\nconst styles = {\n container: {\n position: 'relative',\n } as CSSProperties,\n button: {\n display: 'inline-flex',\n alignItems: 'center',\n whiteSpace: 'nowrap',\n padding: '6px 12px',\n fontSize: '14px',\n fontWeight: 500,\n borderRadius: '6px',\n transition: 'background-color 0.15s',\n backgroundColor: 'var(--theme-bg)',\n color: 'var(--theme-elevation-700)',\n border: '1px solid var(--theme-elevation-200)',\n cursor: 'pointer',\n } as CSSProperties,\n buttonDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n } as CSSProperties,\n icon: {\n width: '16px',\n height: '16px',\n marginRight: '4px',\n flexShrink: 0,\n } as CSSProperties,\n iconSmall: {\n width: '12px',\n height: '12px',\n marginLeft: '4px',\n flexShrink: 0,\n } as CSSProperties,\n dropdown: {\n position: 'absolute',\n top: '100%',\n right: 0,\n marginTop: '4px',\n backgroundColor: 'var(--theme-bg)',\n border: '1px solid var(--theme-elevation-200)',\n borderRadius: '8px',\n boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n zIndex: 50,\n width: '320px',\n maxHeight: '400px',\n overflow: 'hidden',\n } as CSSProperties,\n header: {\n borderBottom: '1px solid var(--theme-elevation-200)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '12px 16px',\n } as CSSProperties,\n headerTitle: {\n fontWeight: 500,\n fontSize: '14px',\n color: 'var(--theme-elevation-900)',\n } as CSSProperties,\n closeButton: {\n color: 'var(--theme-elevation-400)',\n transition: 'color 0.15s',\n padding: '4px',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n } as CSSProperties,\n content: {\n maxHeight: '340px',\n overflowY: 'auto',\n } as CSSProperties,\n loadingContainer: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '32px',\n } as CSSProperties,\n loadingIcon: {\n width: '20px',\n height: '20px',\n color: 'var(--theme-elevation-400)',\n animation: 'spin 1s linear infinite',\n } as CSSProperties,\n errorText: {\n fontSize: '14px',\n color: 'var(--theme-error-600)',\n padding: '16px',\n textAlign: 'center',\n } as CSSProperties,\n emptyText: {\n fontSize: '14px',\n color: 'var(--theme-elevation-500)',\n padding: '16px',\n textAlign: 'center',\n } as CSSProperties,\n listContainer: {\n padding: '8px',\n } as CSSProperties,\n versionItem: {\n borderRadius: '6px',\n transition: 'background-color 0.15s',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '10px 12px',\n gap: '12px',\n } as CSSProperties,\n versionInfo: {\n flex: 1,\n minWidth: 0,\n } as CSSProperties,\n versionHeader: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n } as CSSProperties,\n versionDate: {\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--theme-elevation-900)',\n } as CSSProperties,\n badgeCurrent: {\n fontSize: '12px',\n fontWeight: 500,\n borderRadius: '9999px',\n padding: '2px 8px',\n backgroundColor: 'var(--theme-elevation-100)',\n color: 'var(--theme-elevation-700)',\n } as CSSProperties,\n badgePublished: {\n fontSize: '12px',\n fontWeight: 500,\n borderRadius: '9999px',\n padding: '2px 8px',\n backgroundColor: 'var(--theme-success-100)',\n color: 'var(--theme-success-700)',\n } as CSSProperties,\n autosaveText: {\n fontSize: '12px',\n color: 'var(--theme-elevation-400)',\n } as CSSProperties,\n versionDetails: {\n fontSize: '12px',\n color: 'var(--theme-elevation-500)',\n marginTop: '2px',\n } as CSSProperties,\n restoreButton: {\n fontSize: '12px',\n fontWeight: 500,\n color: 'var(--theme-elevation-700)',\n transition: 'color 0.15s',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n padding: '4px 8px',\n flexShrink: 0,\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n } as CSSProperties,\n restoreButtonDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n } as CSSProperties,\n checkIcon: {\n width: '16px',\n height: '16px',\n color: 'var(--theme-elevation-400)',\n flexShrink: 0,\n } as CSSProperties,\n}\n\n/**\n * Version history dropdown for the Puck editor\n *\n * Shows a list of previous versions with the ability to restore them.\n */\nexport const VersionHistory = memo(function VersionHistory({\n pageId,\n apiEndpoint = '/api/puck/pages',\n onRestore,\n disabled,\n}: VersionHistoryProps) {\n const [isOpen, setIsOpen] = useState(false)\n const [isLoading, setIsLoading] = useState(false)\n const [isRestoring, setIsRestoring] = useState(false)\n const [versions, setVersions] = useState<PageVersion[]>([])\n const [error, setError] = useState<string | null>(null)\n const [isAvailable, setIsAvailable] = useState<boolean | null>(null)\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n\n // Check if versions endpoint is available on mount\n useEffect(() => {\n async function checkAvailability() {\n try {\n const response = await fetch(`${apiEndpoint}/${pageId}/versions?limit=1`, {\n method: 'GET',\n })\n setIsAvailable(response.status !== 404)\n } catch {\n setIsAvailable(false)\n }\n }\n checkAvailability()\n }, [apiEndpoint, pageId])\n\n // Close on outside click\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [])\n\n // Fetch versions when dropdown opens\n const fetchVersions = useCallback(async () => {\n setIsLoading(true)\n setError(null)\n try {\n const response = await fetch(`${apiEndpoint}/${pageId}/versions?limit=20`)\n if (!response.ok) {\n throw new Error('Failed to fetch versions')\n }\n const data = await response.json()\n setVersions(data.docs || [])\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load versions')\n console.error('Error fetching versions:', err)\n } finally {\n setIsLoading(false)\n }\n }, [apiEndpoint, pageId])\n\n // Fetch versions when opening\n useEffect(() => {\n if (isOpen) {\n fetchVersions()\n }\n }, [isOpen, fetchVersions])\n\n // Handle version restore\n const handleRestore = useCallback(\n async (version: PageVersion) => {\n if (!confirm(`Restore this version from ${formatDate(version.updatedAt)}? This will overwrite current changes.`)) {\n return\n }\n\n setIsRestoring(true)\n try {\n const response = await fetch(`${apiEndpoint}/${pageId}/versions`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ versionId: version.id }),\n })\n\n if (!response.ok) {\n throw new Error('Failed to restore version')\n }\n\n onRestore?.(version)\n setIsOpen(false)\n window.location.reload()\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to restore version')\n console.error('Error restoring version:', err)\n } finally {\n setIsRestoring(false)\n }\n },\n [apiEndpoint, pageId, onRestore]\n )\n\n // Format date for display\n function formatDate(dateStr: string): string {\n const date = new Date(dateStr)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffMins = Math.floor(diffMs / 60000)\n const diffHours = Math.floor(diffMs / 3600000)\n const diffDays = Math.floor(diffMs / 86400000)\n\n if (diffMins < 1) return 'Just now'\n if (diffMins < 60) return `${diffMins}m ago`\n if (diffHours < 24) return `${diffHours}h ago`\n if (diffDays < 7) return `${diffDays}d ago`\n return date.toLocaleDateString()\n }\n\n // Format time for display\n function formatTime(dateStr: string): string {\n const date = new Date(dateStr)\n return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })\n }\n\n // Don't render if versions endpoint is not available or still checking\n if (isAvailable !== true) {\n return null\n }\n\n return (\n <div ref={dropdownRef} style={styles.container}>\n {/* Trigger button */}\n <button\n type=\"button\"\n onClick={() => setIsOpen(!isOpen)}\n disabled={disabled}\n style={{\n ...styles.button,\n ...(disabled ? styles.buttonDisabled : {}),\n }}\n >\n <History style={styles.icon} />\n History\n <ChevronDown style={styles.iconSmall} />\n </button>\n\n {/* Dropdown panel */}\n {isOpen && (\n <div style={styles.dropdown}>\n {/* Header */}\n <div style={styles.header}>\n <span style={styles.headerTitle}>Version History</span>\n <button\n type=\"button\"\n onClick={() => setIsOpen(false)}\n style={styles.closeButton}\n >\n <X style={{ width: '16px', height: '16px' }} />\n </button>\n </div>\n\n {/* Content */}\n <div style={styles.content}>\n {isLoading ? (\n <div style={styles.loadingContainer}>\n <Loader2 style={styles.loadingIcon} />\n </div>\n ) : error ? (\n <div style={styles.errorText as CSSProperties}>\n {error}\n </div>\n ) : versions.length === 0 ? (\n <div style={styles.emptyText as CSSProperties}>\n No version history available\n </div>\n ) : (\n <div style={styles.listContainer}>\n {versions.map((version, index) => (\n <div\n key={version.id}\n style={{\n ...styles.versionItem,\n backgroundColor: hoveredIndex === index ? 'var(--theme-elevation-50)' : 'transparent',\n }}\n onMouseEnter={() => setHoveredIndex(index)}\n onMouseLeave={() => setHoveredIndex(null)}\n >\n {/* Version info */}\n <div style={styles.versionInfo}>\n <div style={styles.versionHeader}>\n <span style={styles.versionDate}>\n {formatDate(version.updatedAt)}\n </span>\n {index === 0 && (\n <span style={styles.badgeCurrent}>\n Current\n </span>\n )}\n {version.version._status === 'published' && (\n <span style={styles.badgePublished}>\n Published\n </span>\n )}\n {version.autosave && (\n <span style={styles.autosaveText} title=\"Autosaved\">\n (auto)\n </span>\n )}\n </div>\n <div style={styles.versionDetails}>\n {formatTime(version.updatedAt)}\n {version.version.title && (\n <span> · {version.version.title}</span>\n )}\n </div>\n </div>\n\n {/* Restore button (not for current version) */}\n {index > 0 && (\n <button\n type=\"button\"\n onClick={() => handleRestore(version)}\n disabled={isRestoring}\n style={{\n ...styles.restoreButton,\n ...(isRestoring ? styles.restoreButtonDisabled : {}),\n }}\n >\n {isRestoring ? (\n <Loader2 style={{ width: '12px', height: '12px', animation: 'spin 1s linear infinite' }} />\n ) : (\n <RotateCcw style={{ width: '12px', height: '12px' }} />\n )}\n Restore\n </button>\n )}\n\n {/* Current indicator */}\n {index === 0 && (\n <span style={{ flexShrink: 0 }}>\n <Check style={styles.checkIcon} />\n </span>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n )\n})\n"],"names":["useState","useCallback","useEffect","useRef","memo","History","Loader2","Check","RotateCcw","X","ChevronDown","styles","container","position","button","display","alignItems","whiteSpace","padding","fontSize","fontWeight","borderRadius","transition","backgroundColor","color","border","cursor","buttonDisabled","opacity","icon","width","height","marginRight","flexShrink","iconSmall","marginLeft","dropdown","top","right","marginTop","boxShadow","zIndex","maxHeight","overflow","header","borderBottom","justifyContent","headerTitle","closeButton","background","content","overflowY","loadingContainer","loadingIcon","animation","errorText","textAlign","emptyText","listContainer","versionItem","gap","versionInfo","flex","minWidth","versionHeader","versionDate","badgeCurrent","badgePublished","autosaveText","versionDetails","restoreButton","restoreButtonDisabled","checkIcon","VersionHistory","pageId","apiEndpoint","onRestore","disabled","isOpen","setIsOpen","isLoading","setIsLoading","isRestoring","setIsRestoring","versions","setVersions","error","setError","isAvailable","setIsAvailable","hoveredIndex","setHoveredIndex","dropdownRef","checkAvailability","response","fetch","method","status","handleClickOutside","event","current","contains","target","document","addEventListener","removeEventListener","fetchVersions","ok","Error","data","json","docs","err","message","console","handleRestore","version","confirm","formatDate","updatedAt","headers","body","JSON","stringify","versionId","id","window","location","reload","dateStr","date","Date","now","diffMs","getTime","diffMins","Math","floor","diffHours","diffDays","toLocaleDateString","formatTime","toLocaleTimeString","hour","minute","div","ref","style","type","onClick","span","length","map","index","onMouseEnter","onMouseLeave","_status","autosave","title"],"mappings":"AAAA;;AAEA,SAASA,QAAQ,EAAEC,WAAW,EAAEC,SAAS,EAAEC,MAAM,EAAEC,IAAI,QAA4B,QAAO;AAC1F,SACEC,OAAO,EACPC,OAAO,EACPC,KAAK,EACLC,SAAS,EACTC,CAAC,EACDC,WAAW,QACN,eAAc;AAyCrB,gBAAgB;AAChB,MAAMC,SAAS;IACbC,WAAW;QACTC,UAAU;IACZ;IACAC,QAAQ;QACNC,SAAS;QACTC,YAAY;QACZC,YAAY;QACZC,SAAS;QACTC,UAAU;QACVC,YAAY;QACZC,cAAc;QACdC,YAAY;QACZC,iBAAiB;QACjBC,OAAO;QACPC,QAAQ;QACRC,QAAQ;IACV;IACAC,gBAAgB;QACdC,SAAS;QACTF,QAAQ;IACV;IACAG,MAAM;QACJC,OAAO;QACPC,QAAQ;QACRC,aAAa;QACbC,YAAY;IACd;IACAC,WAAW;QACTJ,OAAO;QACPC,QAAQ;QACRI,YAAY;QACZF,YAAY;IACd;IACAG,UAAU;QACRvB,UAAU;QACVwB,KAAK;QACLC,OAAO;QACPC,WAAW;QACXhB,iBAAiB;QACjBE,QAAQ;QACRJ,cAAc;QACdmB,WAAW;QACXC,QAAQ;QACRX,OAAO;QACPY,WAAW;QACXC,UAAU;IACZ;IACAC,QAAQ;QACNC,cAAc;QACd9B,SAAS;QACTC,YAAY;QACZ8B,gBAAgB;QAChB5B,SAAS;IACX;IACA6B,aAAa;QACX3B,YAAY;QACZD,UAAU;QACVK,OAAO;IACT;IACAwB,aAAa;QACXxB,OAAO;QACPF,YAAY;QACZJ,SAAS;QACT+B,YAAY;QACZxB,QAAQ;QACRC,QAAQ;IACV;IACAwB,SAAS;QACPR,WAAW;QACXS,WAAW;IACb;IACAC,kBAAkB;QAChBrC,SAAS;QACTC,YAAY;QACZ8B,gBAAgB;QAChB5B,SAAS;IACX;IACAmC,aAAa;QACXvB,OAAO;QACPC,QAAQ;QACRP,OAAO;QACP8B,WAAW;IACb;IACAC,WAAW;QACTpC,UAAU;QACVK,OAAO;QACPN,SAAS;QACTsC,WAAW;IACb;IACAC,WAAW;QACTtC,UAAU;QACVK,OAAO;QACPN,SAAS;QACTsC,WAAW;IACb;IACAE,eAAe;QACbxC,SAAS;IACX;IACAyC,aAAa;QACXtC,cAAc;QACdC,YAAY;QACZP,SAAS;QACTC,YAAY;QACZ8B,gBAAgB;QAChB5B,SAAS;QACT0C,KAAK;IACP;IACAC,aAAa;QACXC,MAAM;QACNC,UAAU;IACZ;IACAC,eAAe;QACbjD,SAAS;QACTC,YAAY;QACZ4C,KAAK;IACP;IACAK,aAAa;QACX9C,UAAU;QACVC,YAAY;QACZI,OAAO;IACT;IACA0C,cAAc;QACZ/C,UAAU;QACVC,YAAY;QACZC,cAAc;QACdH,SAAS;QACTK,iBAAiB;QACjBC,OAAO;IACT;IACA2C,gBAAgB;QACdhD,UAAU;QACVC,YAAY;QACZC,cAAc;QACdH,SAAS;QACTK,iBAAiB;QACjBC,OAAO;IACT;IACA4C,cAAc;QACZjD,UAAU;QACVK,OAAO;IACT;IACA6C,gBAAgB;QACdlD,UAAU;QACVK,OAAO;QACPe,WAAW;IACb;IACA+B,eAAe;QACbnD,UAAU;QACVC,YAAY;QACZI,OAAO;QACPF,YAAY;QACZP,SAAS;QACTC,YAAY;QACZ4C,KAAK;QACL1C,SAAS;QACTe,YAAY;QACZgB,YAAY;QACZxB,QAAQ;QACRC,QAAQ;IACV;IACA6C,uBAAuB;QACrB3C,SAAS;QACTF,QAAQ;IACV;IACA8C,WAAW;QACT1C,OAAO;QACPC,QAAQ;QACRP,OAAO;QACPS,YAAY;IACd;AACF;AAEA;;;;CAIC,GACD,OAAO,MAAMwC,+BAAiBrE,KAAK,SAASqE,eAAe,EACzDC,MAAM,EACNC,cAAc,iBAAiB,EAC/BC,SAAS,EACTC,QAAQ,EACY;IACpB,MAAM,CAACC,QAAQC,UAAU,GAAG/E,SAAS;IACrC,MAAM,CAACgF,WAAWC,aAAa,GAAGjF,SAAS;IAC3C,MAAM,CAACkF,aAAaC,eAAe,GAAGnF,SAAS;IAC/C,MAAM,CAACoF,UAAUC,YAAY,GAAGrF,SAAwB,EAAE;IAC1D,MAAM,CAACsF,OAAOC,SAAS,GAAGvF,SAAwB;IAClD,MAAM,CAACwF,aAAaC,eAAe,GAAGzF,SAAyB;IAC/D,MAAM,CAAC0F,cAAcC,gBAAgB,GAAG3F,SAAwB;IAChE,MAAM4F,cAAczF,OAAuB;IAE3C,mDAAmD;IACnDD,UAAU;QACR,eAAe2F;YACb,IAAI;gBACF,MAAMC,WAAW,MAAMC,MAAM,GAAGpB,YAAY,CAAC,EAAED,OAAO,iBAAiB,CAAC,EAAE;oBACxEsB,QAAQ;gBACV;gBACAP,eAAeK,SAASG,MAAM,KAAK;YACrC,EAAE,OAAM;gBACNR,eAAe;YACjB;QACF;QACAI;IACF,GAAG;QAAClB;QAAaD;KAAO;IAExB,yBAAyB;IACzBxE,UAAU;QACR,SAASgG,mBAAmBC,KAAiB;YAC3C,IAAIP,YAAYQ,OAAO,IAAI,CAACR,YAAYQ,OAAO,CAACC,QAAQ,CAACF,MAAMG,MAAM,GAAW;gBAC9EvB,UAAU;YACZ;QACF;QACAwB,SAASC,gBAAgB,CAAC,aAAaN;QACvC,OAAO,IAAMK,SAASE,mBAAmB,CAAC,aAAaP;IACzD,GAAG,EAAE;IAEL,qCAAqC;IACrC,MAAMQ,gBAAgBzG,YAAY;QAChCgF,aAAa;QACbM,SAAS;QACT,IAAI;YACF,MAAMO,WAAW,MAAMC,MAAM,GAAGpB,YAAY,CAAC,EAAED,OAAO,kBAAkB,CAAC;YACzE,IAAI,CAACoB,SAASa,EAAE,EAAE;gBAChB,MAAM,IAAIC,MAAM;YAClB;YACA,MAAMC,OAAO,MAAMf,SAASgB,IAAI;YAChCzB,YAAYwB,KAAKE,IAAI,IAAI,EAAE;QAC7B,EAAE,OAAOC,KAAK;YACZzB,SAASyB,eAAeJ,QAAQI,IAAIC,OAAO,GAAG;YAC9CC,QAAQ5B,KAAK,CAAC,4BAA4B0B;QAC5C,SAAU;YACR/B,aAAa;QACf;IACF,GAAG;QAACN;QAAaD;KAAO;IAExB,8BAA8B;IAC9BxE,UAAU;QACR,IAAI4E,QAAQ;YACV4B;QACF;IACF,GAAG;QAAC5B;QAAQ4B;KAAc;IAE1B,yBAAyB;IACzB,MAAMS,gBAAgBlH,YACpB,OAAOmH;QACL,IAAI,CAACC,QAAQ,CAAC,0BAA0B,EAAEC,WAAWF,QAAQG,SAAS,EAAE,sCAAsC,CAAC,GAAG;YAChH;QACF;QAEApC,eAAe;QACf,IAAI;YACF,MAAMW,WAAW,MAAMC,MAAM,GAAGpB,YAAY,CAAC,EAAED,OAAO,SAAS,CAAC,EAAE;gBAChEsB,QAAQ;gBACRwB,SAAS;oBAAE,gBAAgB;gBAAmB;gBAC9CC,MAAMC,KAAKC,SAAS,CAAC;oBAAEC,WAAWR,QAAQS,EAAE;gBAAC;YAC/C;YAEA,IAAI,CAAC/B,SAASa,EAAE,EAAE;gBAChB,MAAM,IAAIC,MAAM;YAClB;YAEAhC,YAAYwC;YACZrC,UAAU;YACV+C,OAAOC,QAAQ,CAACC,MAAM;QACxB,EAAE,OAAOhB,KAAK;YACZzB,SAASyB,eAAeJ,QAAQI,IAAIC,OAAO,GAAG;YAC9CC,QAAQ5B,KAAK,CAAC,4BAA4B0B;QAC5C,SAAU;YACR7B,eAAe;QACjB;IACF,GACA;QAACR;QAAaD;QAAQE;KAAU;IAGlC,0BAA0B;IAC1B,SAAS0C,WAAWW,OAAe;QACjC,MAAMC,OAAO,IAAIC,KAAKF;QACtB,MAAMG,MAAM,IAAID;QAChB,MAAME,SAASD,IAAIE,OAAO,KAAKJ,KAAKI,OAAO;QAC3C,MAAMC,WAAWC,KAAKC,KAAK,CAACJ,SAAS;QACrC,MAAMK,YAAYF,KAAKC,KAAK,CAACJ,SAAS;QACtC,MAAMM,WAAWH,KAAKC,KAAK,CAACJ,SAAS;QAErC,IAAIE,WAAW,GAAG,OAAO;QACzB,IAAIA,WAAW,IAAI,OAAO,GAAGA,SAAS,KAAK,CAAC;QAC5C,IAAIG,YAAY,IAAI,OAAO,GAAGA,UAAU,KAAK,CAAC;QAC9C,IAAIC,WAAW,GAAG,OAAO,GAAGA,SAAS,KAAK,CAAC;QAC3C,OAAOT,KAAKU,kBAAkB;IAChC;IAEA,0BAA0B;IAC1B,SAASC,WAAWZ,OAAe;QACjC,MAAMC,OAAO,IAAIC,KAAKF;QACtB,OAAOC,KAAKY,kBAAkB,CAAC,EAAE,EAAE;YAAEC,MAAM;YAAWC,QAAQ;QAAU;IAC1E;IAEA,uEAAuE;IACvE,IAAIxD,gBAAgB,MAAM;QACxB,OAAO;IACT;IAEA,qBACE,MAACyD;QAAIC,KAAKtD;QAAauD,OAAOxI,OAAOC,SAAS;;0BAE5C,MAACE;gBACCsI,MAAK;gBACLC,SAAS,IAAMtE,UAAU,CAACD;gBAC1BD,UAAUA;gBACVsE,OAAO;oBACL,GAAGxI,OAAOG,MAAM;oBAChB,GAAI+D,WAAWlE,OAAOgB,cAAc,GAAG,CAAC,CAAC;gBAC3C;;kCAEA,KAACtB;wBAAQ8I,OAAOxI,OAAOkB,IAAI;;oBAAI;kCAE/B,KAACnB;wBAAYyI,OAAOxI,OAAOuB,SAAS;;;;YAIrC4C,wBACC,MAACmE;gBAAIE,OAAOxI,OAAOyB,QAAQ;;kCAEzB,MAAC6G;wBAAIE,OAAOxI,OAAOiC,MAAM;;0CACvB,KAAC0G;gCAAKH,OAAOxI,OAAOoC,WAAW;0CAAE;;0CACjC,KAACjC;gCACCsI,MAAK;gCACLC,SAAS,IAAMtE,UAAU;gCACzBoE,OAAOxI,OAAOqC,WAAW;0CAEzB,cAAA,KAACvC;oCAAE0I,OAAO;wCAAErH,OAAO;wCAAQC,QAAQ;oCAAO;;;;;kCAK9C,KAACkH;wBAAIE,OAAOxI,OAAOuC,OAAO;kCACvB8B,0BACC,KAACiE;4BAAIE,OAAOxI,OAAOyC,gBAAgB;sCACjC,cAAA,KAAC9C;gCAAQ6I,OAAOxI,OAAO0C,WAAW;;6BAElCiC,sBACF,KAAC2D;4BAAIE,OAAOxI,OAAO4C,SAAS;sCACzB+B;6BAEDF,SAASmE,MAAM,KAAK,kBACtB,KAACN;4BAAIE,OAAOxI,OAAO8C,SAAS;sCAAmB;2CAI/C,KAACwF;4BAAIE,OAAOxI,OAAO+C,aAAa;sCAC7B0B,SAASoE,GAAG,CAAC,CAACpC,SAASqC,sBACtB,MAACR;oCAECE,OAAO;wCACL,GAAGxI,OAAOgD,WAAW;wCACrBpC,iBAAiBmE,iBAAiB+D,QAAQ,8BAA8B;oCAC1E;oCACAC,cAAc,IAAM/D,gBAAgB8D;oCACpCE,cAAc,IAAMhE,gBAAgB;;sDAGpC,MAACsD;4CAAIE,OAAOxI,OAAOkD,WAAW;;8DAC5B,MAACoF;oDAAIE,OAAOxI,OAAOqD,aAAa;;sEAC9B,KAACsF;4DAAKH,OAAOxI,OAAOsD,WAAW;sEAC5BqD,WAAWF,QAAQG,SAAS;;wDAE9BkC,UAAU,mBACT,KAACH;4DAAKH,OAAOxI,OAAOuD,YAAY;sEAAE;;wDAInCkD,QAAQA,OAAO,CAACwC,OAAO,KAAK,6BAC3B,KAACN;4DAAKH,OAAOxI,OAAOwD,cAAc;sEAAE;;wDAIrCiD,QAAQyC,QAAQ,kBACf,KAACP;4DAAKH,OAAOxI,OAAOyD,YAAY;4DAAE0F,OAAM;sEAAY;;;;8DAKxD,MAACb;oDAAIE,OAAOxI,OAAO0D,cAAc;;wDAC9BwE,WAAWzB,QAAQG,SAAS;wDAC5BH,QAAQA,OAAO,CAAC0C,KAAK,kBACpB,MAACR;;gEAAK;gEAAWlC,QAAQA,OAAO,CAAC0C,KAAK;;;;;;;wCAM3CL,QAAQ,mBACP,MAAC3I;4CACCsI,MAAK;4CACLC,SAAS,IAAMlC,cAAcC;4CAC7BvC,UAAUK;4CACViE,OAAO;gDACL,GAAGxI,OAAO2D,aAAa;gDACvB,GAAIY,cAAcvE,OAAO4D,qBAAqB,GAAG,CAAC,CAAC;4CACrD;;gDAECW,4BACC,KAAC5E;oDAAQ6I,OAAO;wDAAErH,OAAO;wDAAQC,QAAQ;wDAAQuB,WAAW;oDAA0B;mEAEtF,KAAC9C;oDAAU2I,OAAO;wDAAErH,OAAO;wDAAQC,QAAQ;oDAAO;;gDAClD;;;wCAML0H,UAAU,mBACT,KAACH;4CAAKH,OAAO;gDAAElH,YAAY;4CAAE;sDAC3B,cAAA,KAAC1B;gDAAM4I,OAAOxI,OAAO6D,SAAS;;;;mCA7D7B4C,QAAQS,EAAE;;;;;;;AAyEnC,GAAE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useDarkMode.d.ts","sourceRoot":"","sources":["../../../src/editor/hooks/useDarkMode.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,aAAa,GAAG,MAAM,CAAA;AAE7D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,UAAU,EAAE,OAAO,CAAA;IACnB;;OAEG;IACH,MAAM,EAAE,cAAc,CAAA;CACvB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,IAAI,iBAAiB,CAqE/C"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/editor/hooks/useDarkMode.ts"],"sourcesContent":["'use client'\n\nimport { useState, useEffect, useCallback } from 'react'\n\n/**\n * Source of dark mode detection\n */\nexport type DarkModeSource = 'class' | 'media-query' | 'none'\n\n/**\n * Return type for useDarkMode hook\n */\nexport interface UseDarkModeReturn {\n /**\n * Whether dark mode is currently active\n */\n isDarkMode: boolean\n /**\n * How dark mode was detected\n */\n source: DarkModeSource\n}\n\n/**\n * Detects dark mode state from PayloadCMS admin or OS preferences.\n *\n * Detection priority:\n * 1. `.dark` class on `document.documentElement` (PayloadCMS admin)\n * 2. `prefers-color-scheme: dark` media query (OS preference)\n *\n * Uses MutationObserver to track class changes in real-time.\n *\n * @example\n * ```tsx\n * const { isDarkMode, source } = useDarkMode()\n *\n * if (isDarkMode) {\n * // Apply dark mode styles\n * }\n * ```\n */\nexport function useDarkMode(): UseDarkModeReturn {\n const [state, setState] = useState<UseDarkModeReturn>({\n isDarkMode: false,\n source: 'none',\n })\n\n // Check for dark mode class on document element\n const checkDarkModeClass = useCallback((): boolean => {\n if (typeof document === 'undefined') return false\n return document.documentElement.classList.contains('dark')\n }, [])\n\n // Check for OS dark mode preference\n const checkMediaQuery = useCallback((): boolean => {\n if (typeof window === 'undefined') return false\n return window.matchMedia('(prefers-color-scheme: dark)').matches\n }, [])\n\n // Compute current dark mode state\n const computeState = useCallback((): UseDarkModeReturn => {\n // Priority 1: Check for .dark class (PayloadCMS)\n if (checkDarkModeClass()) {\n return { isDarkMode: true, source: 'class' }\n }\n\n // Priority 2: Check OS preference\n if (checkMediaQuery()) {\n return { isDarkMode: true, source: 'media-query' }\n }\n\n return { isDarkMode: false, source: 'none' }\n }, [checkDarkModeClass, checkMediaQuery])\n\n useEffect(() => {\n // Set initial state\n setState(computeState())\n\n // Watch for class changes on document element\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (\n mutation.type === 'attributes' &&\n mutation.attributeName === 'class'\n ) {\n setState(computeState())\n break\n }\n }\n })\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n })\n\n // Watch for OS preference changes\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n const handleMediaChange = () => {\n setState(computeState())\n }\n mediaQuery.addEventListener('change', handleMediaChange)\n\n return () => {\n observer.disconnect()\n mediaQuery.removeEventListener('change', handleMediaChange)\n }\n }, [computeState])\n\n return state\n}\n"],"names":["useState","useEffect","useCallback","useDarkMode","state","setState","isDarkMode","source","checkDarkModeClass","document","documentElement","classList","contains","checkMediaQuery","window","matchMedia","matches","computeState","observer","MutationObserver","mutations","mutation","type","attributeName","observe","attributes","attributeFilter","mediaQuery","handleMediaChange","addEventListener","disconnect","removeEventListener"],"mappings":"AAAA;AAEA,SAASA,QAAQ,EAAEC,SAAS,EAAEC,WAAW,QAAQ,QAAO;AAqBxD;;;;;;;;;;;;;;;;;CAiBC,GACD,OAAO,SAASC;IACd,MAAM,CAACC,OAAOC,SAAS,GAAGL,SAA4B;QACpDM,YAAY;QACZC,QAAQ;IACV;IAEA,gDAAgD;IAChD,MAAMC,qBAAqBN,YAAY;QACrC,IAAI,OAAOO,aAAa,aAAa,OAAO;QAC5C,OAAOA,SAASC,eAAe,CAACC,SAAS,CAACC,QAAQ,CAAC;IACrD,GAAG,EAAE;IAEL,oCAAoC;IACpC,MAAMC,kBAAkBX,YAAY;QAClC,IAAI,OAAOY,WAAW,aAAa,OAAO;QAC1C,OAAOA,OAAOC,UAAU,CAAC,gCAAgCC,OAAO;IAClE,GAAG,EAAE;IAEL,kCAAkC;IAClC,MAAMC,eAAef,YAAY;QAC/B,iDAAiD;QACjD,IAAIM,sBAAsB;YACxB,OAAO;gBAAEF,YAAY;gBAAMC,QAAQ;YAAQ;QAC7C;QAEA,kCAAkC;QAClC,IAAIM,mBAAmB;YACrB,OAAO;gBAAEP,YAAY;gBAAMC,QAAQ;YAAc;QACnD;QAEA,OAAO;YAAED,YAAY;YAAOC,QAAQ;QAAO;IAC7C,GAAG;QAACC;QAAoBK;KAAgB;IAExCZ,UAAU;QACR,oBAAoB;QACpBI,SAASY;QAET,8CAA8C;QAC9C,MAAMC,WAAW,IAAIC,iBAAiB,CAACC;YACrC,KAAK,MAAMC,YAAYD,UAAW;gBAChC,IACEC,SAASC,IAAI,KAAK,gBAClBD,SAASE,aAAa,KAAK,SAC3B;oBACAlB,SAASY;oBACT;gBACF;YACF;QACF;QAEAC,SAASM,OAAO,CAACf,SAASC,eAAe,EAAE;YACzCe,YAAY;YACZC,iBAAiB;gBAAC;aAAQ;QAC5B;QAEA,kCAAkC;QAClC,MAAMC,aAAab,OAAOC,UAAU,CAAC;QACrC,MAAMa,oBAAoB;YACxBvB,SAASY;QACX;QACAU,WAAWE,gBAAgB,CAAC,UAAUD;QAEtC,OAAO;YACLV,SAASY,UAAU;YACnBH,WAAWI,mBAAmB,CAAC,UAAUH;QAC3C;IACF,GAAG;QAACX;KAAa;IAEjB,OAAOb;AACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useUnsavedChanges.d.ts","sourceRoot":"","sources":["../../../src/editor/hooks/useUnsavedChanges.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,uBAAuB;IACtC,iBAAiB,EAAE,OAAO,CAAA;IAC1B,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,SAAS,EAAE,MAAM,IAAI,CAAA;CACtB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,IAAI,uBAAuB,CAqC3D"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/editor/hooks/useUnsavedChanges.ts"],"sourcesContent":["'use client'\n\nimport { useState, useEffect, useCallback, useRef } from 'react'\n\nexport interface UseUnsavedChangesReturn {\n hasUnsavedChanges: boolean\n markClean: () => void\n markDirty: () => void\n}\n\n/**\n * Hook to track unsaved changes and warn before navigation\n *\n * Registers a beforeunload handler to prevent accidental navigation\n * when there are unsaved changes.\n *\n * @example\n * ```tsx\n * const { hasUnsavedChanges, markClean, markDirty } = useUnsavedChanges()\n *\n * const handleChange = () => {\n * markDirty()\n * }\n *\n * const handleSave = async () => {\n * await save()\n * markClean()\n * }\n * ```\n */\nexport function useUnsavedChanges(): UseUnsavedChangesReturn {\n const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false)\n\n // Use a ref to track the latest value for the beforeunload handler\n // This ensures the handler always checks the current value, not a stale closure\n const hasUnsavedChangesRef = useRef(hasUnsavedChanges)\n hasUnsavedChangesRef.current = hasUnsavedChanges\n\n // Register beforeunload handler once (uses ref for latest value)\n useEffect(() => {\n const handleBeforeUnload = (e: BeforeUnloadEvent) => {\n if (hasUnsavedChangesRef.current) {\n e.preventDefault()\n // Modern browsers ignore custom messages but still show a warning\n e.returnValue = ''\n }\n }\n\n window.addEventListener('beforeunload', handleBeforeUnload)\n return () => window.removeEventListener('beforeunload', handleBeforeUnload)\n }, [])\n\n const markClean = useCallback(() => {\n hasUnsavedChangesRef.current = false // Update ref immediately for beforeunload\n setHasUnsavedChanges(false)\n }, [])\n\n const markDirty = useCallback(() => {\n hasUnsavedChangesRef.current = true // Update ref immediately for beforeunload\n setHasUnsavedChanges(true)\n }, [])\n\n return {\n hasUnsavedChanges,\n markClean,\n markDirty,\n }\n}\n"],"names":["useState","useEffect","useCallback","useRef","useUnsavedChanges","hasUnsavedChanges","setHasUnsavedChanges","hasUnsavedChangesRef","current","handleBeforeUnload","e","preventDefault","returnValue","window","addEventListener","removeEventListener","markClean","markDirty"],"mappings":"AAAA;AAEA,SAASA,QAAQ,EAAEC,SAAS,EAAEC,WAAW,EAAEC,MAAM,QAAQ,QAAO;AAQhE;;;;;;;;;;;;;;;;;;;CAmBC,GACD,OAAO,SAASC;IACd,MAAM,CAACC,mBAAmBC,qBAAqB,GAAGN,SAAS;IAE3D,mEAAmE;IACnE,gFAAgF;IAChF,MAAMO,uBAAuBJ,OAAOE;IACpCE,qBAAqBC,OAAO,GAAGH;IAE/B,iEAAiE;IACjEJ,UAAU;QACR,MAAMQ,qBAAqB,CAACC;YAC1B,IAAIH,qBAAqBC,OAAO,EAAE;gBAChCE,EAAEC,cAAc;gBAChB,kEAAkE;gBAClED,EAAEE,WAAW,GAAG;YAClB;QACF;QAEAC,OAAOC,gBAAgB,CAAC,gBAAgBL;QACxC,OAAO,IAAMI,OAAOE,mBAAmB,CAAC,gBAAgBN;IAC1D,GAAG,EAAE;IAEL,MAAMO,YAAYd,YAAY;QAC5BK,qBAAqBC,OAAO,GAAG,OAAM,0CAA0C;QAC/EF,qBAAqB;IACvB,GAAG,EAAE;IAEL,MAAMW,YAAYf,YAAY;QAC5BK,qBAAqBC,OAAO,GAAG,MAAK,0CAA0C;QAC9EF,qBAAqB;IACvB,GAAG,EAAE;IAEL,OAAO;QACLD;QACAW;QACAC;IACF;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/editor/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAGH,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAGlE,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAGrF,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AACtF,OAAO,EACL,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AACnF,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AACnF,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AACzF,OAAO,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAClG;;GAEG;AACH,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,KAAK,WAAW,EAAE,MAAM,gCAAgC,CAAA;AAG3G,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAA;AACtE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAG7E,OAAO,EAAE,iBAAiB,EAAE,KAAK,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAC9F,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAGjG,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EACL,0BAA0B,EAC1B,KAAK,2BAA2B,EAChC,mBAAmB,EACnB,KAAK,wBAAwB,GAC9B,MAAM,oBAAoB,CAAA"}
|
package/dist/editor/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/editor/index.ts"],"sourcesContent":["'use client'\n\n/**\n * @delmaredigital/payload-puck/editor\n *\n * Full-featured Puck editor component with built-in page-tree support,\n * dynamic loading, unsaved changes tracking, and theme-aware preview.\n *\n * @example Basic usage\n * ```tsx\n * 'use client'\n *\n * import { PuckEditor } from '@delmaredigital/payload-puck/editor'\n * import { editorConfig } from '@delmaredigital/payload-puck/config/editor'\n *\n * export function PageEditor({ page }) {\n * return (\n * <PuckEditor\n * pageId={page.id}\n * initialData={page.puckData}\n * config={editorConfig}\n * pageTitle={page.title}\n * pageSlug={page.slug}\n * apiEndpoint=\"/api/puck/pages\"\n * backUrl=\"/admin/pages\"\n * />\n * )\n * }\n * ```\n *\n * @example With page-tree integration\n * ```tsx\n * <PuckEditor\n * pageId={page.id}\n * initialData={page.puckData}\n * config={editorConfig}\n * pageTitle={page.title}\n * pageSlug={page.slug}\n * apiEndpoint=\"/api/puck/pages\"\n * hasPageTree={true}\n * folder={page.folder}\n * pageSegment={page.pageSegment}\n * />\n * ```\n */\n\n// Main editor component\nexport { PuckEditor, type PuckEditorProps } from './PuckEditor.js'\n\n// Ready-to-use editor page component (auto-fetches page data from route params)\nexport { PuckEditorView, type PuckEditorViewProps } from '../admin/PuckEditorView.js'\n\n// Sub-components for advanced customization\nexport { HeaderActions, type HeaderActionsProps } from './components/HeaderActions.js'\nexport {\n IframeWrapper,\n type IframeWrapperProps,\n type LayoutStyle,\n PuckPreviewThemeContext,\n usePuckPreviewTheme,\n} from './components/IframeWrapper.js'\nexport { LoadingState, type LoadingStateProps } from './components/LoadingState.js'\nexport { PreviewModal, type PreviewModalProps } from './components/PreviewModal.js'\nexport { DarkModeStyles, type DarkModeStylesProps } from './components/DarkModeStyles.js'\nexport { PreviewModeToggle, type PreviewModeToggleProps } from './components/PreviewModeToggle.js'\n/**\n * @deprecated Use createVersionHistoryPlugin instead. VersionHistory has moved to the plugin rail.\n */\nexport { VersionHistory, type VersionHistoryProps, type PageVersion } from './components/VersionHistory.js'\n\n// Utilities\nexport { injectPageTreeFields } from './utils/injectPageTreeFields.js'\nexport { detectPageTree, hasPageTreeFields } from './utils/detectPageTree.js'\n\n// Hooks\nexport { useUnsavedChanges, type UseUnsavedChangesReturn } from './hooks/useUnsavedChanges.js'\nexport { useDarkMode, type UseDarkModeReturn, type DarkModeSource } from './hooks/useDarkMode.js'\n\n// Plugins\nexport { headingAnalyzer } from './plugins/index.js'\nexport {\n createVersionHistoryPlugin,\n type VersionHistoryPluginOptions,\n VersionHistoryPanel,\n type VersionHistoryPanelProps,\n} from './plugins/index.js'\n"],"names":["PuckEditor","PuckEditorView","HeaderActions","IframeWrapper","PuckPreviewThemeContext","usePuckPreviewTheme","LoadingState","PreviewModal","DarkModeStyles","PreviewModeToggle","VersionHistory","injectPageTreeFields","detectPageTree","hasPageTreeFields","useUnsavedChanges","useDarkMode","headingAnalyzer","createVersionHistoryPlugin","VersionHistoryPanel"],"mappings":"AAAA;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0CC,GAED,wBAAwB;AACxB,SAASA,UAAU,QAA8B,kBAAiB;AAElE,gFAAgF;AAChF,SAASC,cAAc,QAAkC,6BAA4B;AAErF,4CAA4C;AAC5C,SAASC,aAAa,QAAiC,gCAA+B;AACtF,SACEC,aAAa,EAGbC,uBAAuB,EACvBC,mBAAmB,QACd,gCAA+B;AACtC,SAASC,YAAY,QAAgC,+BAA8B;AACnF,SAASC,YAAY,QAAgC,+BAA8B;AACnF,SAASC,cAAc,QAAkC,iCAAgC;AACzF,SAASC,iBAAiB,QAAqC,oCAAmC;AAClG;;CAEC,GACD,SAASC,cAAc,QAAoD,iCAAgC;AAE3G,YAAY;AACZ,SAASC,oBAAoB,QAAQ,kCAAiC;AACtE,SAASC,cAAc,EAAEC,iBAAiB,QAAQ,4BAA2B;AAE7E,QAAQ;AACR,SAASC,iBAAiB,QAAsC,+BAA8B;AAC9F,SAASC,WAAW,QAAqD,yBAAwB;AAEjG,UAAU;AACV,SAASC,eAAe,QAAQ,qBAAoB;AACpD,SACEC,0BAA0B,EAE1BC,mBAAmB,QAEd,qBAAoB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VersionHistoryPanel.d.ts","sourceRoot":"","sources":["../../../src/editor/plugins/VersionHistoryPanel.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAM3D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,QAAQ,CAAC,EAAE,IAAI,CAAA;QACf,OAAO,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;QAC/B,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;KAClB,CAAA;IACD,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAA;CAC9B;AA2KD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,gEAgP9B,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/editor/plugins/VersionHistoryPanel.tsx"],"sourcesContent":["'use client'\n\nimport { useState, useCallback, useEffect, memo, type CSSProperties } from 'react'\nimport { createUsePuck, type Data } from '@puckeditor/core'\nimport { Loader2, Check, RotateCcw, AlertCircle } from 'lucide-react'\n\n// Create usePuck hook for accessing editor state and dispatch\nconst usePuck = createUsePuck()\n\n/**\n * Version entry from Payload's versions system\n */\nexport interface PageVersion {\n id: string\n parent: string\n version: {\n title?: string\n slug?: string\n puckData?: Data\n _status?: 'draft' | 'published'\n updatedAt: string\n createdAt: string\n }\n createdAt: string\n updatedAt: string\n autosave?: boolean\n latest?: boolean\n}\n\nexport interface VersionHistoryPanelProps {\n /**\n * Page ID to fetch versions for\n */\n pageId: string\n /**\n * API endpoint base path\n * @default '/api/puck/pages'\n */\n apiEndpoint?: string\n /**\n * Callback after successful restore (e.g., to mark editor as clean)\n */\n onRestoreSuccess?: () => void\n}\n\n// Panel styles using Puck's CSS variables\nconst styles = {\n container: {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n backgroundColor: 'var(--puck-color-white)',\n } as CSSProperties,\n header: {\n padding: '16px',\n borderBottom: '1px solid var(--puck-color-grey-09)',\n flexShrink: 0,\n } as CSSProperties,\n headerTitle: {\n fontSize: '14px',\n fontWeight: 600,\n color: 'var(--puck-color-grey-02)',\n margin: 0,\n } as CSSProperties,\n headerSubtitle: {\n fontSize: '12px',\n color: 'var(--puck-color-grey-05)',\n marginTop: '4px',\n } as CSSProperties,\n content: {\n flex: 1,\n overflowY: 'auto',\n padding: '8px',\n } as CSSProperties,\n loadingContainer: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '48px 16px',\n gap: '12px',\n } as CSSProperties,\n loadingIcon: {\n width: '24px',\n height: '24px',\n color: 'var(--puck-color-grey-05)',\n animation: 'spin 1s linear infinite',\n } as CSSProperties,\n loadingText: {\n fontSize: '14px',\n color: 'var(--puck-color-grey-05)',\n } as CSSProperties,\n errorContainer: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n padding: '32px 16px',\n gap: '8px',\n } as CSSProperties,\n errorIcon: {\n width: '32px',\n height: '32px',\n color: 'var(--puck-color-red-06)',\n } as CSSProperties,\n errorText: {\n fontSize: '14px',\n color: 'var(--puck-color-red-06)',\n textAlign: 'center',\n } as CSSProperties,\n emptyContainer: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n padding: '48px 16px',\n gap: '8px',\n } as CSSProperties,\n emptyText: {\n fontSize: '14px',\n color: 'var(--puck-color-grey-05)',\n textAlign: 'center',\n } as CSSProperties,\n versionItem: {\n borderRadius: '8px',\n transition: 'background-color 0.15s',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '12px',\n gap: '12px',\n marginBottom: '4px',\n } as CSSProperties,\n versionInfo: {\n flex: 1,\n minWidth: 0,\n } as CSSProperties,\n versionHeader: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n flexWrap: 'wrap',\n } as CSSProperties,\n versionDate: {\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--puck-color-grey-02)',\n } as CSSProperties,\n badge: {\n fontSize: '11px',\n fontWeight: 500,\n borderRadius: '4px',\n padding: '2px 6px',\n } as CSSProperties,\n badgeCurrent: {\n backgroundColor: 'var(--puck-color-azure-11)',\n color: 'var(--puck-color-azure-04)',\n } as CSSProperties,\n badgePublished: {\n backgroundColor: 'var(--puck-color-green-11)',\n color: 'var(--puck-color-green-04)',\n } as CSSProperties,\n autosaveText: {\n fontSize: '11px',\n color: 'var(--puck-color-grey-06)',\n fontStyle: 'italic',\n } as CSSProperties,\n versionDetails: {\n fontSize: '12px',\n color: 'var(--puck-color-grey-05)',\n marginTop: '4px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } as CSSProperties,\n restoreButton: {\n fontSize: '12px',\n fontWeight: 500,\n color: 'var(--puck-color-grey-04)',\n transition: 'all 0.15s',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n padding: '6px 10px',\n flexShrink: 0,\n background: 'none',\n border: '1px solid var(--puck-color-grey-08)',\n borderRadius: '6px',\n cursor: 'pointer',\n } as CSSProperties,\n restoreButtonDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n } as CSSProperties,\n checkIcon: {\n width: '16px',\n height: '16px',\n color: 'var(--puck-color-azure-05)',\n flexShrink: 0,\n } as CSSProperties,\n successMessage: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '12px 16px',\n backgroundColor: 'var(--puck-color-green-11)',\n borderRadius: '8px',\n marginBottom: '8px',\n } as CSSProperties,\n successText: {\n fontSize: '13px',\n color: 'var(--puck-color-green-03)',\n fontWeight: 500,\n } as CSSProperties,\n}\n\n/**\n * Version history panel for the Puck plugin rail\n *\n * Displays a list of previous versions with the ability to restore them.\n * Uses Puck's dispatch to update editor state without page reload.\n */\nexport const VersionHistoryPanel = memo(function VersionHistoryPanel({\n pageId,\n apiEndpoint = '/api/puck/pages',\n onRestoreSuccess,\n}: VersionHistoryPanelProps) {\n const dispatch = usePuck((s) => s.dispatch)\n\n const [isLoading, setIsLoading] = useState(true)\n const [isRestoring, setIsRestoring] = useState(false)\n const [versions, setVersions] = useState<PageVersion[]>([])\n const [error, setError] = useState<string | null>(null)\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n const [successMessage, setSuccessMessage] = useState<string | null>(null)\n\n // Fetch versions on mount\n const fetchVersions = useCallback(async () => {\n setIsLoading(true)\n setError(null)\n try {\n const url = `${apiEndpoint}/${pageId}/versions?limit=20`\n const response = await fetch(url)\n if (!response.ok) {\n if (response.status === 404) {\n setError('Version history is not available for this page.')\n } else {\n throw new Error('Failed to fetch versions')\n }\n return\n }\n const data = await response.json()\n // Handle both 'docs' (our API) and 'versions' (Payload direct) response formats\n setVersions(data.docs || data.versions || [])\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load versions')\n console.error('Error fetching versions:', err)\n } finally {\n setIsLoading(false)\n }\n }, [apiEndpoint, pageId])\n\n useEffect(() => {\n fetchVersions()\n }, [fetchVersions])\n\n // Handle version restore\n const handleRestore = useCallback(\n async (version: PageVersion) => {\n if (!confirm(`Restore this version from ${formatDate(version.updatedAt)}? This will replace your current content.`)) {\n return\n }\n\n setIsRestoring(true)\n setError(null)\n setSuccessMessage(null)\n\n try {\n // Call restore endpoint\n const response = await fetch(`${apiEndpoint}/${pageId}/versions`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ versionId: version.id }),\n })\n\n if (!response.ok) {\n throw new Error('Failed to restore version')\n }\n\n const result = await response.json()\n const restoredDoc = result.doc\n\n // Update Puck editor state with restored data\n if (restoredDoc?.puckData) {\n dispatch({\n type: 'setData',\n data: restoredDoc.puckData,\n })\n }\n\n // Show success message\n setSuccessMessage(`Restored version from ${formatDate(version.updatedAt)}`)\n setTimeout(() => setSuccessMessage(null), 3000)\n\n // Notify parent to mark as clean\n onRestoreSuccess?.()\n\n // Refresh version list\n fetchVersions()\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to restore version')\n console.error('Error restoring version:', err)\n } finally {\n setIsRestoring(false)\n }\n },\n [apiEndpoint, pageId, dispatch, onRestoreSuccess, fetchVersions]\n )\n\n // Format date for display\n function formatDate(dateStr: string): string {\n const date = new Date(dateStr)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffMins = Math.floor(diffMs / 60000)\n const diffHours = Math.floor(diffMs / 3600000)\n const diffDays = Math.floor(diffMs / 86400000)\n\n if (diffMins < 1) return 'Just now'\n if (diffMins < 60) return `${diffMins}m ago`\n if (diffHours < 24) return `${diffHours}h ago`\n if (diffDays < 7) return `${diffDays}d ago`\n return date.toLocaleDateString()\n }\n\n // Format time for display\n function formatTime(dateStr: string): string {\n const date = new Date(dateStr)\n return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })\n }\n\n return (\n <div style={styles.container}>\n {/* Header */}\n <div style={styles.header}>\n <h3 style={styles.headerTitle}>Version History</h3>\n {!isLoading && !error && versions.length > 0 && (\n <div style={styles.headerSubtitle}>\n {versions.length} version{versions.length !== 1 ? 's' : ''} available\n </div>\n )}\n </div>\n\n {/* Content */}\n <div style={styles.content}>\n {/* Success message */}\n {successMessage && (\n <div style={styles.successMessage}>\n <Check style={{ width: '16px', height: '16px', color: 'var(--puck-color-green-04)' }} />\n <span style={styles.successText}>{successMessage}</span>\n </div>\n )}\n\n {isLoading ? (\n <div style={styles.loadingContainer}>\n <Loader2 style={styles.loadingIcon} />\n <span style={styles.loadingText}>Loading versions...</span>\n </div>\n ) : error ? (\n <div style={styles.errorContainer}>\n <AlertCircle style={styles.errorIcon} />\n <div style={styles.errorText as CSSProperties}>{error}</div>\n </div>\n ) : versions.length === 0 ? (\n <div style={styles.emptyContainer}>\n <div style={styles.emptyText as CSSProperties}>\n No version history available yet.\n <br />\n Versions are created when you save or publish.\n </div>\n </div>\n ) : (\n versions.map((version, index) => (\n <div\n key={version.id}\n style={{\n ...styles.versionItem,\n backgroundColor: hoveredIndex === index ? 'var(--puck-color-grey-11)' : 'transparent',\n }}\n onMouseEnter={() => setHoveredIndex(index)}\n onMouseLeave={() => setHoveredIndex(null)}\n >\n {/* Version info */}\n <div style={styles.versionInfo}>\n <div style={styles.versionHeader}>\n <span style={styles.versionDate}>\n {formatDate(version.updatedAt)}\n </span>\n {index === 0 && (\n <span style={{ ...styles.badge, ...styles.badgeCurrent }}>\n Current\n </span>\n )}\n {version.version._status === 'published' && (\n <span style={{ ...styles.badge, ...styles.badgePublished }}>\n Published\n </span>\n )}\n {version.autosave && (\n <span style={styles.autosaveText}>\n auto\n </span>\n )}\n </div>\n <div style={styles.versionDetails}>\n {formatTime(version.updatedAt)}\n {version.version.title && (\n <span> · {version.version.title}</span>\n )}\n </div>\n </div>\n\n {/* Restore button (not for current version) */}\n {index > 0 && (\n <button\n type=\"button\"\n onClick={() => handleRestore(version)}\n disabled={isRestoring}\n style={{\n ...styles.restoreButton,\n ...(isRestoring ? styles.restoreButtonDisabled : {}),\n }}\n onMouseEnter={(e) => {\n if (!isRestoring) {\n e.currentTarget.style.backgroundColor = 'var(--puck-color-grey-10)'\n e.currentTarget.style.borderColor = 'var(--puck-color-grey-07)'\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent'\n e.currentTarget.style.borderColor = 'var(--puck-color-grey-08)'\n }}\n >\n {isRestoring ? (\n <Loader2 style={{ width: '14px', height: '14px', animation: 'spin 1s linear infinite' }} />\n ) : (\n <RotateCcw style={{ width: '14px', height: '14px' }} />\n )}\n Restore\n </button>\n )}\n\n {/* Current indicator */}\n {index === 0 && (\n <Check style={styles.checkIcon} />\n )}\n </div>\n ))\n )}\n </div>\n </div>\n )\n})\n"],"names":["useState","useCallback","useEffect","memo","createUsePuck","Loader2","Check","RotateCcw","AlertCircle","usePuck","styles","container","display","flexDirection","height","backgroundColor","header","padding","borderBottom","flexShrink","headerTitle","fontSize","fontWeight","color","margin","headerSubtitle","marginTop","content","flex","overflowY","loadingContainer","alignItems","justifyContent","gap","loadingIcon","width","animation","loadingText","errorContainer","errorIcon","errorText","textAlign","emptyContainer","emptyText","versionItem","borderRadius","transition","marginBottom","versionInfo","minWidth","versionHeader","flexWrap","versionDate","badge","badgeCurrent","badgePublished","autosaveText","fontStyle","versionDetails","overflow","textOverflow","whiteSpace","restoreButton","background","border","cursor","restoreButtonDisabled","opacity","checkIcon","successMessage","successText","VersionHistoryPanel","pageId","apiEndpoint","onRestoreSuccess","dispatch","s","isLoading","setIsLoading","isRestoring","setIsRestoring","versions","setVersions","error","setError","hoveredIndex","setHoveredIndex","setSuccessMessage","fetchVersions","url","response","fetch","ok","status","Error","data","json","docs","err","message","console","handleRestore","version","confirm","formatDate","updatedAt","method","headers","body","JSON","stringify","versionId","id","result","restoredDoc","doc","puckData","type","setTimeout","dateStr","date","Date","now","diffMs","getTime","diffMins","Math","floor","diffHours","diffDays","toLocaleDateString","formatTime","toLocaleTimeString","hour","minute","div","style","h3","length","span","br","map","index","onMouseEnter","onMouseLeave","_status","autosave","title","button","onClick","disabled","e","currentTarget","borderColor"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/editor/plugins/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,qCAAqC,CAAA;AAGhF,OAAO,EACL,0BAA0B,EAC1B,KAAK,2BAA2B,GACjC,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,KAAK,WAAW,GACjB,MAAM,0BAA0B,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/editor/plugins/index.ts"],"sourcesContent":["/**\n * Puck plugins re-exported for easy consumption\n *\n * @example\n * ```tsx\n * import { PuckEditor, headingAnalyzer, createVersionHistoryPlugin } from '@delmaredigital/payload-puck/editor'\n *\n * const versionPlugin = createVersionHistoryPlugin({ pageId: 'page-123' })\n * <PuckEditor plugins={[headingAnalyzer, versionPlugin]} />\n * ```\n */\n\nexport { default as headingAnalyzer } from '@puckeditor/plugin-heading-analyzer'\n\n// Version History plugin for plugin rail\nexport {\n createVersionHistoryPlugin,\n type VersionHistoryPluginOptions,\n} from './versionHistoryPlugin.js'\n\nexport {\n VersionHistoryPanel,\n type VersionHistoryPanelProps,\n type PageVersion,\n} from './VersionHistoryPanel.js'\n"],"names":["default","headingAnalyzer","createVersionHistoryPlugin","VersionHistoryPanel"],"mappings":"AAAA;;;;;;;;;;CAUC,GAED,SAASA,WAAWC,eAAe,QAAQ,sCAAqC;AAEhF,yCAAyC;AACzC,SACEC,0BAA0B,QAErB,4BAA2B;AAElC,SACEC,mBAAmB,QAGd,2BAA0B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"versionHistoryPlugin.d.ts","sourceRoot":"","sources":["../../../src/editor/plugins/versionHistoryPlugin.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAG9C,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAA;CAC9B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,2BAA2B,GAAG,MAAM,CAYvF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/editor/plugins/versionHistoryPlugin.tsx"],"sourcesContent":["'use client'\n\nimport { createElement } from 'react'\nimport { History } from 'lucide-react'\nimport type { Plugin } from '@puckeditor/core'\nimport { VersionHistoryPanel } from './VersionHistoryPanel.js'\n\nexport interface VersionHistoryPluginOptions {\n /**\n * Page ID to fetch versions for\n */\n pageId: string\n /**\n * API endpoint base path\n * @default '/api/puck/pages'\n */\n apiEndpoint?: string\n /**\n * Callback after successful restore (e.g., to mark editor as clean)\n */\n onRestoreSuccess?: () => void\n}\n\n/**\n * Creates a Puck plugin for version history\n *\n * Adds a \"History\" button to the plugin rail that opens a panel\n * showing version history with the ability to restore previous versions.\n *\n * @example\n * ```tsx\n * import { createVersionHistoryPlugin } from '@delmaredigital/payload-puck/editor'\n *\n * const versionPlugin = createVersionHistoryPlugin({\n * pageId: 'page-123',\n * apiEndpoint: '/api/puck/pages',\n * onRestoreSuccess: () => markEditorClean(),\n * })\n *\n * <Puck plugins={[versionPlugin]} />\n * ```\n */\nexport function createVersionHistoryPlugin(options: VersionHistoryPluginOptions): Plugin {\n return {\n name: 'version-history',\n label: 'History',\n icon: createElement(History, { size: 20 }),\n render: () =>\n createElement(VersionHistoryPanel, {\n pageId: options.pageId,\n apiEndpoint: options.apiEndpoint,\n onRestoreSuccess: options.onRestoreSuccess,\n }),\n }\n}\n"],"names":["createElement","History","VersionHistoryPanel","createVersionHistoryPlugin","options","name","label","icon","size","render","pageId","apiEndpoint","onRestoreSuccess"],"mappings":"AAAA;AAEA,SAASA,aAAa,QAAQ,QAAO;AACrC,SAASC,OAAO,QAAQ,eAAc;AAEtC,SAASC,mBAAmB,QAAQ,2BAA0B;AAkB9D;;;;;;;;;;;;;;;;;;CAkBC,GACD,OAAO,SAASC,2BAA2BC,OAAoC;IAC7E,OAAO;QACLC,MAAM;QACNC,OAAO;QACPC,oBAAMP,cAAcC,SAAS;YAAEO,MAAM;QAAG;QACxCC,QAAQ,kBACNT,cAAcE,qBAAqB;gBACjCQ,QAAQN,QAAQM,MAAM;gBACtBC,aAAaP,QAAQO,WAAW;gBAChCC,kBAAkBR,QAAQQ,gBAAgB;YAC5C;IACJ;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detectPageTree.d.ts","sourceRoot":"","sources":["../../../src/editor/utils/detectPageTree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE5D;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAclF;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAG7D"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/editor/utils/detectPageTree.ts"],"sourcesContent":["import type { Config as PuckConfig } from '@puckeditor/core'\n\n/**\n * Detects whether page-tree integration should be enabled.\n *\n * Detection priority:\n * 1. Explicit prop takes precedence (true/false)\n * 2. Auto-detect from config: checks if root.fields has both 'folder' and 'pageSegment'\n *\n * @param config - The Puck config to check\n * @param explicitProp - Optional explicit hasPageTree prop value\n * @returns Whether page-tree fields should be injected\n */\nexport function detectPageTree(config: PuckConfig, explicitProp?: boolean): boolean {\n // Explicit prop takes precedence\n if (explicitProp !== undefined) {\n return explicitProp\n }\n\n // Auto-detect from config: if root.fields already has folder and pageSegment,\n // the user is using pageTreeRoot preset - don't double-inject\n const rootFields = config.root?.fields || {}\n const hasPageTreeFields = 'folder' in rootFields && 'pageSegment' in rootFields\n\n // If fields already exist, page-tree is already configured (via preset)\n // Return false to avoid re-injecting\n return false && hasPageTreeFields // Never auto-inject - require explicit opt-in\n}\n\n/**\n * Checks if a config already has page-tree fields configured.\n * Useful for determining if injectPageTreeFields would be redundant.\n *\n * @param config - The Puck config to check\n * @returns Whether the config already has page-tree fields\n */\nexport function hasPageTreeFields(config: PuckConfig): boolean {\n const rootFields = config.root?.fields || {}\n return 'folder' in rootFields && 'pageSegment' in rootFields\n}\n"],"names":["detectPageTree","config","explicitProp","undefined","rootFields","root","fields","hasPageTreeFields"],"mappings":"AAEA;;;;;;;;;;CAUC,GACD,OAAO,SAASA,eAAeC,MAAkB,EAAEC,YAAsB;IACvE,iCAAiC;IACjC,IAAIA,iBAAiBC,WAAW;QAC9B,OAAOD;IACT;IAEA,8EAA8E;IAC9E,8DAA8D;IAC9D,MAAME,aAAaH,OAAOI,IAAI,EAAEC,UAAU,CAAC;IAC3C,MAAMC,oBAAoB,YAAYH,cAAc,iBAAiBA;IAErE,wEAAwE;IACxE,qCAAqC;IACrC,OAAO,SAASG,kBAAkB,8CAA8C;;AAClF;AAEA;;;;;;CAMC,GACD,OAAO,SAASA,kBAAkBN,MAAkB;IAClD,MAAMG,aAAaH,OAAOI,IAAI,EAAEC,UAAU,CAAC;IAC3C,OAAO,YAAYF,cAAc,iBAAiBA;AACpD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/editor/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/editor/utils/index.ts"],"sourcesContent":["export { injectPageTreeFields } from './injectPageTreeFields.js'\nexport { detectPageTree, hasPageTreeFields } from './detectPageTree.js'\n"],"names":["injectPageTreeFields","detectPageTree","hasPageTreeFields"],"mappings":"AAAA,SAASA,oBAAoB,QAAQ,4BAA2B;AAChE,SAASC,cAAc,EAAEC,iBAAiB,QAAQ,sBAAqB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"injectPageTreeFields.d.ts","sourceRoot":"","sources":["../../../src/editor/utils/injectPageTreeFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAK5D;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAyBnE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/editor/utils/injectPageTreeFields.ts"],"sourcesContent":["import type { Config as PuckConfig } from '@puckeditor/core'\nimport { createFolderPickerField } from '../../fields/FolderPickerField.js'\nimport { createLockedPageSegmentField } from '../../fields/PageSegmentField.js'\nimport { createSlugPreviewField } from '../../fields/SlugPreviewField.js'\n\n/**\n * Injects page-tree fields (folder, pageSegment, slug) into a Puck config's root fields.\n * Replaces any existing slug field with the page-tree slug preview.\n *\n * @param config - The base Puck config to enhance\n * @returns A new config with page-tree fields injected into root.fields\n */\nexport function injectPageTreeFields(config: PuckConfig): PuckConfig {\n // Create page-tree specific fields\n const pageTreeFields = {\n folder: createFolderPickerField({ label: 'Folder' }),\n pageSegment: createLockedPageSegmentField({ label: 'Page Segment' }),\n slug: createSlugPreviewField({\n label: 'URL Slug',\n hint: 'Auto-generated from folder + page segment',\n }),\n }\n\n // Merge page-tree fields into root config, replacing existing slug field\n const existingRootFields = config.root?.fields || {}\n const { slug: _existingSlug, ...otherFields } = existingRootFields as Record<string, unknown>\n\n return {\n ...config,\n root: {\n ...config.root,\n fields: {\n ...otherFields,\n ...pageTreeFields,\n },\n },\n } as PuckConfig\n}\n"],"names":["createFolderPickerField","createLockedPageSegmentField","createSlugPreviewField","injectPageTreeFields","config","pageTreeFields","folder","label","pageSegment","slug","hint","existingRootFields","root","fields","_existingSlug","otherFields"],"mappings":"AACA,SAASA,uBAAuB,QAAQ,oCAAmC;AAC3E,SAASC,4BAA4B,QAAQ,mCAAkC;AAC/E,SAASC,sBAAsB,QAAQ,mCAAkC;AAEzE;;;;;;CAMC,GACD,OAAO,SAASC,qBAAqBC,MAAkB;IACrD,mCAAmC;IACnC,MAAMC,iBAAiB;QACrBC,QAAQN,wBAAwB;YAAEO,OAAO;QAAS;QAClDC,aAAaP,6BAA6B;YAAEM,OAAO;QAAe;QAClEE,MAAMP,uBAAuB;YAC3BK,OAAO;YACPG,MAAM;QACR;IACF;IAEA,yEAAyE;IACzE,MAAMC,qBAAqBP,OAAOQ,IAAI,EAAEC,UAAU,CAAC;IACnD,MAAM,EAAEJ,MAAMK,aAAa,EAAE,GAAGC,aAAa,GAAGJ;IAEhD,OAAO;QACL,GAAGP,MAAM;QACTQ,MAAM;YACJ,GAAGR,OAAOQ,IAAI;YACdC,QAAQ;gBACN,GAAGE,WAAW;gBACd,GAAGV,cAAc;YACnB;QACF;IACF;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/endpoints/ai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,SAAS,CAAA;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAa,MAAM,gBAAgB,CAAA;AAItE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,CAAA;AAiDrC;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,iBAAsB,GAAG,cAAc,CAqLvF"}
|
package/dist/endpoints/ai.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/endpoints/ai.ts"],"sourcesContent":["import type { PayloadHandler, PayloadRequest } from 'payload'\nimport type { AiTool, AiToolContext, AiContext } from '../ai/types.js'\nimport { pagePatternSystemContext } from '../ai/presets/index.js'\n\n// Re-export for convenience\nexport type { AiTool, AiToolContext }\n\n/**\n * Collection slug for AI context\n * Matches the auto-generated collection from createPuckPlugin\n */\nconst AI_CONTEXT_COLLECTION = 'puck-ai-context'\n\n/**\n * Fetches dynamic context entries from the database\n * @param req - The Payload request object\n * @returns Concatenated context string or undefined if no entries\n */\nasync function fetchDynamicContext(req: PayloadRequest): Promise<string | undefined> {\n try {\n // Check if the context collection exists (it's optional)\n const collections = req.payload.config.collections\n const hasContextCollection = collections?.some((c) => c.slug === AI_CONTEXT_COLLECTION)\n\n if (!hasContextCollection) {\n return undefined\n }\n\n // Fetch enabled context entries, sorted by order\n const result = await req.payload.find({\n collection: AI_CONTEXT_COLLECTION,\n where: { enabled: { equals: true } },\n sort: 'order',\n limit: 100, // Reasonable limit for context entries\n })\n\n if (!result.docs || result.docs.length === 0) {\n return undefined\n }\n\n // Format each context entry with its name as a header\n const contextBlocks = (result.docs as AiContext[]).map((doc) => {\n const header = doc.category ? `## ${doc.name} (${doc.category})` : `## ${doc.name}`\n return `${header}\\n\\n${doc.content}`\n })\n\n return contextBlocks.join('\\n\\n---\\n\\n')\n } catch (e) {\n // Log but don't fail - context is optional\n console.warn('[payload-puck] Failed to fetch dynamic AI context:', e)\n return undefined\n }\n}\n\n/**\n * Options for the AI endpoint handler\n */\nexport interface AiEndpointOptions {\n /**\n * Business context for AI generation\n * Helps the AI understand your brand, tone, and requirements\n */\n context?: string\n /**\n * Custom tools for AI to use during generation\n * These allow AI to perform actions like database lookups, API calls, etc.\n */\n tools?: Record<string, AiTool>\n}\n\n/**\n * Creates a Payload endpoint handler for Puck AI\n *\n * This handler wraps @puckeditor/cloud-client's puckHandler with\n * Payload authentication. It's auto-registered by createPuckPlugin\n * when `ai.enabled: true`.\n *\n * @example\n * // Automatically registered at /api/puck/ai when:\n * createPuckPlugin({\n * ai: {\n * enabled: true,\n * context: 'You build pages for Acme Corp...',\n * },\n * })\n */\nexport function createAiEndpointHandler(options: AiEndpointOptions = {}): PayloadHandler {\n return async (req) => {\n // 1. Require authentication - AI features are admin-only\n if (!req.user) {\n return Response.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n // 2. Lazy import to avoid bundle bloat (like PostCSS pattern in styles.ts)\n let puckHandler: typeof import('@puckeditor/cloud-client').puckHandler\n try {\n const cloudClient = await import('@puckeditor/cloud-client')\n puckHandler = cloudClient.puckHandler\n } catch (e) {\n console.error('[payload-puck] Failed to load @puckeditor/cloud-client:', e)\n return Response.json(\n { error: 'AI requires @puckeditor/cloud-client. This should be bundled with the plugin.' },\n { status: 500 }\n )\n }\n\n // 3. Check for API key\n const apiKey = process.env.PUCK_API_KEY\n if (!apiKey) {\n return Response.json(\n { error: 'PUCK_API_KEY environment variable is not set' },\n { status: 500 }\n )\n }\n\n // 4. Forward to Puck Cloud handler\n // puckHandler expects a standard Web Request object with specific pathname\n // The handler internally routes based on pathname - it expects /api/puck/chat\n // See: @puckeditor/cloud-client/src/routes.ts - routeRegistry['/api/puck/chat']\n try {\n // Get the request body\n const body = await req.json?.()\n\n // NOTE: We previously removed null values from defaultProps here, but this\n // was preventing the AI from knowing about optional styling fields.\n // Per Puck docs: \"All fields in defaultProps are considered required by the agent\"\n // Fields with null values still need to be present so the AI knows they exist.\n\n // Auto-exclude custom fields in root that don't have ai.exclude set\n // BUT: if field has AI instructions, don't exclude it (we want AI to use it)\n // This handles fields added by page-tree or user customization\n if (body?.config?.root?.fields) {\n for (const [fieldName, field] of Object.entries(body.config.root.fields)) {\n const f = field as any\n // Only exclude if: is custom, doesn't have exclude set, AND doesn't have instructions\n if (f.type === 'custom' && !f.ai?.exclude && !f.ai?.instructions) {\n f.ai = { ...f.ai, exclude: true }\n }\n }\n }\n\n // Auto-exclude custom fields in components that don't have ai.exclude set\n // BUT: if field has AI instructions, don't exclude it (we want AI to use it)\n if (body?.config?.components) {\n for (const [, comp] of Object.entries(body.config.components)) {\n const c = comp as any\n if (c.fields) {\n for (const [, field] of Object.entries(c.fields)) {\n const f = field as any\n // Only exclude if: is custom, doesn't have exclude set, AND doesn't have instructions\n if (f.type === 'custom' && !f.ai?.exclude && !f.ai?.instructions) {\n f.ai = { ...f.ai, exclude: true }\n }\n }\n }\n }\n }\n\n // Validate required fields - puckHandler expects config and pageData\n if (!body) {\n return Response.json({ error: 'Request body is required' }, { status: 400 })\n }\n\n // Ensure config exists (puckHandler needs this)\n if (!body.config) {\n console.warn('[payload-puck] AI request missing config, this may cause issues')\n }\n\n // Construct URL with the pathname puckHandler expects\n // Our Payload endpoint is /api/puck/ai but puckHandler routes to /api/puck/chat\n const protocol = req.headers.get('x-forwarded-proto') || 'http'\n const host = req.headers.get('host') || 'localhost'\n const url = `${protocol}://${host}/api/puck/chat`\n\n // Create new headers without content-length (will be recalculated)\n const headers = new Headers()\n headers.set('content-type', 'application/json')\n // Copy auth headers\n const authHeader = req.headers.get('authorization')\n if (authHeader) {\n headers.set('authorization', authHeader)\n }\n\n const webRequest = new Request(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n })\n\n // Build AI options, only including properties that have values\n // (passing `tools: undefined` explicitly prevents the default from applying)\n const aiOptions: { context?: string; tools?: Record<string, any> } = {}\n\n // Build context from multiple sources:\n // 1. Static context from plugin config\n // 2. Dynamic context from database (puck-ai-context collection)\n // 3. Page pattern system context (composition guidance)\n const contextParts: string[] = []\n\n // Add static context from plugin config\n if (options.context) {\n contextParts.push(options.context)\n }\n\n // Fetch and add dynamic context from database\n const dynamicContext = await fetchDynamicContext(req)\n if (dynamicContext) {\n contextParts.push('# Business Context\\n\\n' + dynamicContext)\n }\n\n // Always add page pattern system context for better composition\n if (pagePatternSystemContext) {\n contextParts.push(pagePatternSystemContext)\n }\n\n // Combine all context parts\n if (contextParts.length > 0) {\n aiOptions.context = contextParts.join('\\n\\n---\\n\\n')\n }\n\n // Wrap tools to inject Payload context into execute functions\n if (options.tools && Object.keys(options.tools).length > 0) {\n const toolContext: AiToolContext = {\n payload: req.payload,\n user: req.user,\n }\n\n // Create wrapped tools that inject the context\n const wrappedTools: Record<string, any> = {}\n for (const [name, tool] of Object.entries(options.tools)) {\n wrappedTools[name] = {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n // Wrap execute to inject Payload context\n execute: (input: any) => tool.execute(input, toolContext),\n }\n }\n aiOptions.tools = wrappedTools\n }\n\n const response = await puckHandler(webRequest, {\n ai: aiOptions,\n apiKey,\n })\n\n if (!response.ok) {\n // Try to get more info from error response\n const clonedResponse = response.clone()\n try {\n const errorBody = await clonedResponse.json()\n console.error('[payload-puck] Puck Cloud error body:', errorBody)\n } catch {\n const errorText = await clonedResponse.text()\n console.error('[payload-puck] Puck Cloud error text:', errorText)\n }\n }\n\n return response\n } catch (e) {\n console.error('[payload-puck] AI handler error:', e)\n return Response.json(\n { error: e instanceof Error ? e.message : 'AI request failed' },\n { status: 500 }\n )\n }\n }\n}\n"],"names":["pagePatternSystemContext","AI_CONTEXT_COLLECTION","fetchDynamicContext","req","collections","payload","config","hasContextCollection","some","c","slug","undefined","result","find","collection","where","enabled","equals","sort","limit","docs","length","contextBlocks","map","doc","header","category","name","content","join","e","console","warn","createAiEndpointHandler","options","user","Response","json","error","status","puckHandler","cloudClient","apiKey","process","env","PUCK_API_KEY","body","root","fields","fieldName","field","Object","entries","f","type","ai","exclude","instructions","components","comp","protocol","headers","get","host","url","Headers","set","authHeader","webRequest","Request","method","JSON","stringify","aiOptions","contextParts","context","push","dynamicContext","tools","keys","toolContext","wrappedTools","tool","description","inputSchema","execute","input","response","ok","clonedResponse","clone","errorBody","errorText","text","Error","message"],"mappings":"AAEA,SAASA,wBAAwB,QAAQ,yBAAwB;AAKjE;;;CAGC,GACD,MAAMC,wBAAwB;AAE9B;;;;CAIC,GACD,eAAeC,oBAAoBC,GAAmB;IACpD,IAAI;QACF,yDAAyD;QACzD,MAAMC,cAAcD,IAAIE,OAAO,CAACC,MAAM,CAACF,WAAW;QAClD,MAAMG,uBAAuBH,aAAaI,KAAK,CAACC,IAAMA,EAAEC,IAAI,KAAKT;QAEjE,IAAI,CAACM,sBAAsB;YACzB,OAAOI;QACT;QAEA,iDAAiD;QACjD,MAAMC,SAAS,MAAMT,IAAIE,OAAO,CAACQ,IAAI,CAAC;YACpCC,YAAYb;YACZc,OAAO;gBAAEC,SAAS;oBAAEC,QAAQ;gBAAK;YAAE;YACnCC,MAAM;YACNC,OAAO;QACT;QAEA,IAAI,CAACP,OAAOQ,IAAI,IAAIR,OAAOQ,IAAI,CAACC,MAAM,KAAK,GAAG;YAC5C,OAAOV;QACT;QAEA,sDAAsD;QACtD,MAAMW,gBAAgB,AAACV,OAAOQ,IAAI,CAAiBG,GAAG,CAAC,CAACC;YACtD,MAAMC,SAASD,IAAIE,QAAQ,GAAG,CAAC,GAAG,EAAEF,IAAIG,IAAI,CAAC,EAAE,EAAEH,IAAIE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAEF,IAAIG,IAAI,EAAE;YACnF,OAAO,GAAGF,OAAO,IAAI,EAAED,IAAII,OAAO,EAAE;QACtC;QAEA,OAAON,cAAcO,IAAI,CAAC;IAC5B,EAAE,OAAOC,GAAG;QACV,2CAA2C;QAC3CC,QAAQC,IAAI,CAAC,sDAAsDF;QACnE,OAAOnB;IACT;AACF;AAkBA;;;;;;;;;;;;;;;CAeC,GACD,OAAO,SAASsB,wBAAwBC,UAA6B,CAAC,CAAC;IACrE,OAAO,OAAO/B;QACZ,yDAAyD;QACzD,IAAI,CAACA,IAAIgC,IAAI,EAAE;YACb,OAAOC,SAASC,IAAI,CAAC;gBAAEC,OAAO;YAAe,GAAG;gBAAEC,QAAQ;YAAI;QAChE;QAEA,2EAA2E;QAC3E,IAAIC;QACJ,IAAI;YACF,MAAMC,cAAc,MAAM,MAAM,CAAC;YACjCD,cAAcC,YAAYD,WAAW;QACvC,EAAE,OAAOV,GAAG;YACVC,QAAQO,KAAK,CAAC,2DAA2DR;YACzE,OAAOM,SAASC,IAAI,CAClB;gBAAEC,OAAO;YAAgF,GACzF;gBAAEC,QAAQ;YAAI;QAElB;QAEA,uBAAuB;QACvB,MAAMG,SAASC,QAAQC,GAAG,CAACC,YAAY;QACvC,IAAI,CAACH,QAAQ;YACX,OAAON,SAASC,IAAI,CAClB;gBAAEC,OAAO;YAA+C,GACxD;gBAAEC,QAAQ;YAAI;QAElB;QAEA,mCAAmC;QACnC,2EAA2E;QAC3E,8EAA8E;QAC9E,gFAAgF;QAChF,IAAI;YACF,uBAAuB;YACvB,MAAMO,OAAO,MAAM3C,IAAIkC,IAAI;YAE3B,2EAA2E;YAC3E,oEAAoE;YACpE,mFAAmF;YACnF,+EAA+E;YAE/E,oEAAoE;YACpE,6EAA6E;YAC7E,+DAA+D;YAC/D,IAAIS,MAAMxC,QAAQyC,MAAMC,QAAQ;gBAC9B,KAAK,MAAM,CAACC,WAAWC,MAAM,IAAIC,OAAOC,OAAO,CAACN,KAAKxC,MAAM,CAACyC,IAAI,CAACC,MAAM,EAAG;oBACxE,MAAMK,IAAIH;oBACV,sFAAsF;oBACtF,IAAIG,EAAEC,IAAI,KAAK,YAAY,CAACD,EAAEE,EAAE,EAAEC,WAAW,CAACH,EAAEE,EAAE,EAAEE,cAAc;wBAChEJ,EAAEE,EAAE,GAAG;4BAAE,GAAGF,EAAEE,EAAE;4BAAEC,SAAS;wBAAK;oBAClC;gBACF;YACF;YAEA,0EAA0E;YAC1E,6EAA6E;YAC7E,IAAIV,MAAMxC,QAAQoD,YAAY;gBAC5B,KAAK,MAAM,GAAGC,KAAK,IAAIR,OAAOC,OAAO,CAACN,KAAKxC,MAAM,CAACoD,UAAU,EAAG;oBAC7D,MAAMjD,IAAIkD;oBACV,IAAIlD,EAAEuC,MAAM,EAAE;wBACZ,KAAK,MAAM,GAAGE,MAAM,IAAIC,OAAOC,OAAO,CAAC3C,EAAEuC,MAAM,EAAG;4BAChD,MAAMK,IAAIH;4BACV,sFAAsF;4BACtF,IAAIG,EAAEC,IAAI,KAAK,YAAY,CAACD,EAAEE,EAAE,EAAEC,WAAW,CAACH,EAAEE,EAAE,EAAEE,cAAc;gCAChEJ,EAAEE,EAAE,GAAG;oCAAE,GAAGF,EAAEE,EAAE;oCAAEC,SAAS;gCAAK;4BAClC;wBACF;oBACF;gBACF;YACF;YAEA,qEAAqE;YACrE,IAAI,CAACV,MAAM;gBACT,OAAOV,SAASC,IAAI,CAAC;oBAAEC,OAAO;gBAA2B,GAAG;oBAAEC,QAAQ;gBAAI;YAC5E;YAEA,gDAAgD;YAChD,IAAI,CAACO,KAAKxC,MAAM,EAAE;gBAChByB,QAAQC,IAAI,CAAC;YACf;YAEA,sDAAsD;YACtD,gFAAgF;YAChF,MAAM4B,WAAWzD,IAAI0D,OAAO,CAACC,GAAG,CAAC,wBAAwB;YACzD,MAAMC,OAAO5D,IAAI0D,OAAO,CAACC,GAAG,CAAC,WAAW;YACxC,MAAME,MAAM,GAAGJ,SAAS,GAAG,EAAEG,KAAK,cAAc,CAAC;YAEjD,mEAAmE;YACnE,MAAMF,UAAU,IAAII;YACpBJ,QAAQK,GAAG,CAAC,gBAAgB;YAC5B,oBAAoB;YACpB,MAAMC,aAAahE,IAAI0D,OAAO,CAACC,GAAG,CAAC;YACnC,IAAIK,YAAY;gBACdN,QAAQK,GAAG,CAAC,iBAAiBC;YAC/B;YAEA,MAAMC,aAAa,IAAIC,QAAQL,KAAK;gBAClCM,QAAQ;gBACRT;gBACAf,MAAMyB,KAAKC,SAAS,CAAC1B;YACvB;YAEA,+DAA+D;YAC/D,6EAA6E;YAC7E,MAAM2B,YAA+D,CAAC;YAEtE,uCAAuC;YACvC,uCAAuC;YACvC,gEAAgE;YAChE,wDAAwD;YACxD,MAAMC,eAAyB,EAAE;YAEjC,wCAAwC;YACxC,IAAIxC,QAAQyC,OAAO,EAAE;gBACnBD,aAAaE,IAAI,CAAC1C,QAAQyC,OAAO;YACnC;YAEA,8CAA8C;YAC9C,MAAME,iBAAiB,MAAM3E,oBAAoBC;YACjD,IAAI0E,gBAAgB;gBAClBH,aAAaE,IAAI,CAAC,2BAA2BC;YAC/C;YAEA,gEAAgE;YAChE,IAAI7E,0BAA0B;gBAC5B0E,aAAaE,IAAI,CAAC5E;YACpB;YAEA,4BAA4B;YAC5B,IAAI0E,aAAarD,MAAM,GAAG,GAAG;gBAC3BoD,UAAUE,OAAO,GAAGD,aAAa7C,IAAI,CAAC;YACxC;YAEA,8DAA8D;YAC9D,IAAIK,QAAQ4C,KAAK,IAAI3B,OAAO4B,IAAI,CAAC7C,QAAQ4C,KAAK,EAAEzD,MAAM,GAAG,GAAG;gBAC1D,MAAM2D,cAA6B;oBACjC3E,SAASF,IAAIE,OAAO;oBACpB8B,MAAMhC,IAAIgC,IAAI;gBAChB;gBAEA,+CAA+C;gBAC/C,MAAM8C,eAAoC,CAAC;gBAC3C,KAAK,MAAM,CAACtD,MAAMuD,KAAK,IAAI/B,OAAOC,OAAO,CAAClB,QAAQ4C,KAAK,EAAG;oBACxDG,YAAY,CAACtD,KAAK,GAAG;wBACnBA,MAAMuD,KAAKvD,IAAI;wBACfwD,aAAaD,KAAKC,WAAW;wBAC7BC,aAAaF,KAAKE,WAAW;wBAC7B,yCAAyC;wBACzCC,SAAS,CAACC,QAAeJ,KAAKG,OAAO,CAACC,OAAON;oBAC/C;gBACF;gBACAP,UAAUK,KAAK,GAAGG;YACpB;YAEA,MAAMM,WAAW,MAAM/C,YAAY4B,YAAY;gBAC7Cb,IAAIkB;gBACJ/B;YACF;YAEA,IAAI,CAAC6C,SAASC,EAAE,EAAE;gBAChB,2CAA2C;gBAC3C,MAAMC,iBAAiBF,SAASG,KAAK;gBACrC,IAAI;oBACF,MAAMC,YAAY,MAAMF,eAAepD,IAAI;oBAC3CN,QAAQO,KAAK,CAAC,yCAAyCqD;gBACzD,EAAE,OAAM;oBACN,MAAMC,YAAY,MAAMH,eAAeI,IAAI;oBAC3C9D,QAAQO,KAAK,CAAC,yCAAyCsD;gBACzD;YACF;YAEA,OAAOL;QACT,EAAE,OAAOzD,GAAG;YACVC,QAAQO,KAAK,CAAC,oCAAoCR;YAClD,OAAOM,SAASC,IAAI,CAClB;gBAAEC,OAAOR,aAAagE,QAAQhE,EAAEiE,OAAO,GAAG;YAAoB,GAC9D;gBAAExD,QAAQ;YAAI;QAElB;IACF;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/endpoints/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAQ7C;;;;;;GAMG;AACH,wBAAgB,wBAAwB,IAAI,cAAc,CAyBzD;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,IAAI,cAAc,CAyB3D;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,IAAI,cAAc,CA+B3D;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,cAAc,CAyB3D"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/endpoints/context.ts"],"sourcesContent":["import type { PayloadHandler } from 'payload'\n\n/**\n * Collection slug for AI context\n * Matches the auto-generated collection from createPuckPlugin\n */\nconst COLLECTION = 'puck-ai-context'\n\n/**\n * List all AI context entries, sorted by order\n * Only returns enabled entries by default\n *\n * GET /api/puck/ai-context\n * Query: ?all=true to include disabled entries\n */\nexport function createContextListHandler(): PayloadHandler {\n return async (req) => {\n if (!req.user) {\n return Response.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n try {\n // Check if we should include all entries (including disabled)\n const includeAll = req.query?.all === 'true'\n\n const result = await req.payload.find({\n collection: COLLECTION,\n sort: 'order',\n limit: 100, // Reasonable limit for context entries\n where: includeAll ? {} : { enabled: { equals: true } },\n })\n return Response.json(result)\n } catch (e) {\n console.error('[payload-puck] Error listing context:', e)\n return Response.json(\n { error: e instanceof Error ? e.message : 'Failed to list context' },\n { status: 500 }\n )\n }\n }\n}\n\n/**\n * Create a new AI context entry\n *\n * POST /api/puck/ai-context\n * Body: { name: string, content: string, category?: string, enabled?: boolean, order?: number }\n */\nexport function createContextCreateHandler(): PayloadHandler {\n return async (req) => {\n if (!req.user) {\n return Response.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n try {\n const data = await req.json?.()\n if (!data) {\n return Response.json({ error: 'Request body is required' }, { status: 400 })\n }\n\n const doc = await req.payload.create({\n collection: COLLECTION,\n data,\n })\n return Response.json(doc)\n } catch (e) {\n console.error('[payload-puck] Error creating context:', e)\n return Response.json(\n { error: e instanceof Error ? e.message : 'Failed to create context' },\n { status: 500 }\n )\n }\n }\n}\n\n/**\n * Update an existing AI context entry\n *\n * PATCH /api/puck/ai-context/:id\n * Body: { name?: string, content?: string, category?: string, enabled?: boolean, order?: number }\n */\nexport function createContextUpdateHandler(): PayloadHandler {\n return async (req) => {\n if (!req.user) {\n return Response.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const id = req.routeParams?.id as string\n if (!id) {\n return Response.json({ error: 'Context ID is required' }, { status: 400 })\n }\n\n try {\n const data = await req.json?.()\n if (!data) {\n return Response.json({ error: 'Request body is required' }, { status: 400 })\n }\n\n const doc = await req.payload.update({\n collection: COLLECTION,\n id,\n data,\n })\n return Response.json(doc)\n } catch (e) {\n console.error('[payload-puck] Error updating context:', e)\n return Response.json(\n { error: e instanceof Error ? e.message : 'Failed to update context' },\n { status: 500 }\n )\n }\n }\n}\n\n/**\n * Delete an AI context entry\n *\n * DELETE /api/puck/ai-context/:id\n */\nexport function createContextDeleteHandler(): PayloadHandler {\n return async (req) => {\n if (!req.user) {\n return Response.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const id = req.routeParams?.id as string\n if (!id) {\n return Response.json({ error: 'Context ID is required' }, { status: 400 })\n }\n\n try {\n await req.payload.delete({\n collection: COLLECTION,\n id,\n })\n return Response.json({ success: true })\n } catch (e) {\n console.error('[payload-puck] Error deleting context:', e)\n return Response.json(\n { error: e instanceof Error ? e.message : 'Failed to delete context' },\n { status: 500 }\n )\n }\n }\n}\n"],"names":["COLLECTION","createContextListHandler","req","user","Response","json","error","status","includeAll","query","all","result","payload","find","collection","sort","limit","where","enabled","equals","e","console","Error","message","createContextCreateHandler","data","doc","create","createContextUpdateHandler","id","routeParams","update","createContextDeleteHandler","delete","success"],"mappings":"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"}
|