@delmaredigital/payload-puck 0.6.10 → 0.6.13
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 +79 -1
- package/dist/admin/EditWithPuckButton.d.ts +1 -1
- package/dist/admin/EditWithPuckButton.d.ts.map +1 -1
- package/dist/admin/EditWithPuckButton.js +65 -25
- package/dist/admin/EditWithPuckButton.js.map +1 -1
- package/dist/admin/EditWithPuckCell.js +43 -13
- package/dist/admin/EditWithPuckCell.js.map +1 -1
- package/dist/admin/PuckEditorView.d.ts +1 -1
- package/dist/admin/PuckEditorView.d.ts.map +1 -1
- package/dist/admin/PuckEditorView.js +118 -32
- package/dist/admin/PuckEditorView.js.map +1 -1
- package/dist/admin/client.d.ts +2 -2
- package/dist/admin/client.d.ts.map +1 -1
- package/dist/admin/client.js +4 -4
- package/dist/admin/client.js.map +1 -1
- package/dist/admin/generateAdminComponents.js +7 -7
- package/dist/admin/generateAdminComponents.js.map +1 -1
- package/dist/admin/index.d.ts +5 -5
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +3 -2
- package/dist/admin/index.js.map +1 -1
- package/dist/ai/collections/AiContext.js +56 -29
- package/dist/ai/collections/AiContext.js.map +1 -1
- package/dist/ai/collections/AiPrompts.js +24 -19
- package/dist/ai/collections/AiPrompts.js.map +1 -1
- package/dist/ai/createAiApiRoutes.js +28 -19
- package/dist/ai/createAiApiRoutes.js.map +1 -1
- package/dist/ai/createAiGenerate.js +7 -8
- package/dist/ai/createAiGenerate.js.map +1 -1
- package/dist/ai/createAiPlugin.js +7 -9
- package/dist/ai/createAiPlugin.js.map +1 -1
- package/dist/ai/hooks/useAiContext.js +50 -39
- package/dist/ai/hooks/useAiContext.js.map +1 -1
- package/dist/ai/hooks/useAiPrompts.js +33 -25
- package/dist/ai/hooks/useAiPrompts.js.map +1 -1
- package/dist/ai/index.js +9 -10
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/plugins/ContextEditorPanel.d.ts +1 -1
- package/dist/ai/plugins/ContextEditorPanel.d.ts.map +1 -1
- package/dist/ai/plugins/ContextEditorPanel.js +399 -107
- package/dist/ai/plugins/ContextEditorPanel.js.map +1 -1
- package/dist/ai/plugins/PromptEditorPanel.d.ts +1 -1
- package/dist/ai/plugins/PromptEditorPanel.d.ts.map +1 -1
- package/dist/ai/plugins/PromptEditorPanel.js +237 -51
- package/dist/ai/plugins/PromptEditorPanel.js.map +1 -1
- package/dist/ai/plugins/contextEditorPlugin.js +12 -5
- package/dist/ai/plugins/contextEditorPlugin.js.map +1 -1
- package/dist/ai/plugins/promptApiRoutes.js +119 -50
- package/dist/ai/plugins/promptApiRoutes.js.map +1 -1
- package/dist/ai/plugins/promptEditorPlugin.js +12 -5
- package/dist/ai/plugins/promptEditorPlugin.js.map +1 -1
- package/dist/ai/presets/componentAiDefaults.js +108 -83
- package/dist/ai/presets/componentAiDefaults.js.map +1 -1
- package/dist/ai/presets/index.js +12 -18
- package/dist/ai/presets/index.js.map +1 -1
- package/dist/ai/presets/instructions/interactive.js +85 -75
- package/dist/ai/presets/instructions/interactive.js.map +1 -1
- package/dist/ai/presets/instructions/layout.js +122 -117
- package/dist/ai/presets/instructions/layout.js.map +1 -1
- package/dist/ai/presets/instructions/media.js +31 -29
- package/dist/ai/presets/instructions/media.js.map +1 -1
- package/dist/ai/presets/instructions/pagePatterns.js +4 -6
- package/dist/ai/presets/instructions/pagePatterns.js.map +1 -1
- package/dist/ai/presets/instructions/schemas.js +495 -137
- package/dist/ai/presets/instructions/schemas.js.map +1 -1
- package/dist/ai/presets/instructions/typography.js +38 -33
- package/dist/ai/presets/instructions/typography.js.map +1 -1
- package/dist/ai/tools/index.js +92 -55
- package/dist/ai/tools/index.js.map +1 -1
- package/dist/ai/types.js +7 -1
- package/dist/ai/types.js.map +1 -1
- package/dist/ai/utils/injectAiConfig.js +33 -40
- package/dist/ai/utils/injectAiConfig.js.map +1 -1
- package/dist/api/createPuckApiRoutes.d.ts +1 -1
- package/dist/api/createPuckApiRoutes.d.ts.map +1 -1
- package/dist/api/createPuckApiRoutes.js +123 -65
- package/dist/api/createPuckApiRoutes.js.map +1 -1
- package/dist/api/createPuckApiRoutesVersions.d.ts +1 -1
- package/dist/api/createPuckApiRoutesVersions.d.ts.map +1 -1
- package/dist/api/createPuckApiRoutesVersions.js +88 -37
- package/dist/api/createPuckApiRoutesVersions.js.map +1 -1
- package/dist/api/createPuckApiRoutesWithId.d.ts +1 -1
- package/dist/api/createPuckApiRoutesWithId.d.ts.map +1 -1
- package/dist/api/createPuckApiRoutesWithId.js +166 -72
- package/dist/api/createPuckApiRoutesWithId.js.map +1 -1
- package/dist/api/index.d.ts +5 -5
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +6 -6
- package/dist/api/index.js.map +1 -1
- package/dist/api/payload-config.d.js +15 -0
- package/dist/api/payload-config.d.js.map +1 -0
- package/dist/api/types.js +4 -1
- package/dist/api/types.js.map +1 -1
- package/dist/api/utils/mapRootProps.d.ts +1 -1
- package/dist/api/utils/mapRootProps.d.ts.map +1 -1
- package/dist/api/utils/mapRootProps.js +77 -44
- package/dist/api/utils/mapRootProps.js.map +1 -1
- package/dist/collections/Templates.js +24 -20
- package/dist/collections/Templates.js.map +1 -1
- package/dist/components/AccordionClient.d.ts +2 -2
- package/dist/components/AccordionClient.d.ts.map +1 -1
- package/dist/components/AccordionClient.js +81 -22
- package/dist/components/AccordionClient.js.map +1 -1
- package/dist/components/AnimatedWrapper.d.ts +2 -2
- package/dist/components/AnimatedWrapper.d.ts.map +1 -1
- package/dist/components/AnimatedWrapper.js +31 -16
- package/dist/components/AnimatedWrapper.js.map +1 -1
- package/dist/components/exports.js +2 -2
- package/dist/components/exports.js.map +1 -1
- package/dist/components/index.d.ts +5 -5
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +7 -7
- package/dist/components/index.js.map +1 -1
- package/dist/components/interactive/Accordion.d.ts +1 -1
- package/dist/components/interactive/Accordion.d.ts.map +1 -1
- package/dist/components/interactive/Accordion.js +149 -55
- package/dist/components/interactive/Accordion.js.map +1 -1
- package/dist/components/interactive/Accordion.server.d.ts +1 -1
- package/dist/components/interactive/Accordion.server.d.ts.map +1 -1
- package/dist/components/interactive/Accordion.server.js +25 -7
- package/dist/components/interactive/Accordion.server.js.map +1 -1
- package/dist/components/interactive/Button.d.ts +3 -3
- package/dist/components/interactive/Button.d.ts.map +1 -1
- package/dist/components/interactive/Button.js +89 -43
- package/dist/components/interactive/Button.js.map +1 -1
- package/dist/components/interactive/Button.server.d.ts +2 -2
- package/dist/components/interactive/Button.server.d.ts.map +1 -1
- package/dist/components/interactive/Button.server.js +40 -20
- package/dist/components/interactive/Button.server.js.map +1 -1
- package/dist/components/interactive/Card.d.ts +3 -3
- package/dist/components/interactive/Card.d.ts.map +1 -1
- package/dist/components/interactive/Card.js +131 -39
- package/dist/components/interactive/Card.js.map +1 -1
- package/dist/components/interactive/Card.server.d.ts +3 -3
- package/dist/components/interactive/Card.server.d.ts.map +1 -1
- package/dist/components/interactive/Card.server.js +72 -11
- package/dist/components/interactive/Card.server.js.map +1 -1
- package/dist/components/interactive/Divider.d.ts +1 -1
- package/dist/components/interactive/Divider.d.ts.map +1 -1
- package/dist/components/interactive/Divider.js +54 -26
- package/dist/components/interactive/Divider.js.map +1 -1
- package/dist/components/interactive/Divider.server.d.ts +1 -1
- package/dist/components/interactive/Divider.server.d.ts.map +1 -1
- package/dist/components/interactive/Divider.server.js +28 -12
- package/dist/components/interactive/Divider.server.js.map +1 -1
- package/dist/components/interactive/index.d.ts +4 -4
- package/dist/components/interactive/index.d.ts.map +1 -1
- package/dist/components/interactive/index.js +5 -5
- package/dist/components/interactive/index.js.map +1 -1
- package/dist/components/layout/Container.d.ts +1 -1
- package/dist/components/layout/Container.d.ts.map +1 -1
- package/dist/components/layout/Container.js +101 -47
- package/dist/components/layout/Container.js.map +1 -1
- package/dist/components/layout/Container.server.d.ts +1 -1
- package/dist/components/layout/Container.server.d.ts.map +1 -1
- package/dist/components/layout/Container.server.js +67 -19
- package/dist/components/layout/Container.server.js.map +1 -1
- package/dist/components/layout/Flex.d.ts +2 -2
- package/dist/components/layout/Flex.d.ts.map +1 -1
- package/dist/components/layout/Flex.js +124 -55
- package/dist/components/layout/Flex.js.map +1 -1
- package/dist/components/layout/Flex.server.d.ts +1 -1
- package/dist/components/layout/Flex.server.d.ts.map +1 -1
- package/dist/components/layout/Flex.server.js +50 -14
- package/dist/components/layout/Flex.server.js.map +1 -1
- package/dist/components/layout/Grid.d.ts +1 -1
- package/dist/components/layout/Grid.d.ts.map +1 -1
- package/dist/components/layout/Grid.js +93 -44
- package/dist/components/layout/Grid.js.map +1 -1
- package/dist/components/layout/Grid.server.d.ts +1 -1
- package/dist/components/layout/Grid.server.d.ts.map +1 -1
- package/dist/components/layout/Grid.server.js +56 -14
- package/dist/components/layout/Grid.server.js.map +1 -1
- package/dist/components/layout/Section.d.ts +1 -1
- package/dist/components/layout/Section.d.ts.map +1 -1
- package/dist/components/layout/Section.js +147 -64
- package/dist/components/layout/Section.js.map +1 -1
- package/dist/components/layout/Section.server.d.ts +1 -1
- package/dist/components/layout/Section.server.d.ts.map +1 -1
- package/dist/components/layout/Section.server.js +92 -28
- package/dist/components/layout/Section.server.js.map +1 -1
- package/dist/components/layout/Spacer.d.ts +1 -1
- package/dist/components/layout/Spacer.d.ts.map +1 -1
- package/dist/components/layout/Spacer.js +80 -30
- package/dist/components/layout/Spacer.js.map +1 -1
- package/dist/components/layout/Spacer.server.d.ts +1 -1
- package/dist/components/layout/Spacer.server.d.ts.map +1 -1
- package/dist/components/layout/Spacer.server.js +31 -9
- package/dist/components/layout/Spacer.server.js.map +1 -1
- package/dist/components/layout/Template.d.ts +1 -1
- package/dist/components/layout/Template.d.ts.map +1 -1
- package/dist/components/layout/Template.js +58 -30
- package/dist/components/layout/Template.js.map +1 -1
- package/dist/components/layout/Template.server.d.ts +1 -1
- package/dist/components/layout/Template.server.d.ts.map +1 -1
- package/dist/components/layout/Template.server.js +43 -11
- package/dist/components/layout/Template.server.js.map +1 -1
- package/dist/components/layout/index.d.ts +8 -8
- package/dist/components/layout/index.d.ts.map +1 -1
- package/dist/components/layout/index.js +8 -8
- package/dist/components/layout/index.js.map +1 -1
- package/dist/components/media/Image.d.ts +3 -3
- package/dist/components/media/Image.d.ts.map +1 -1
- package/dist/components/media/Image.js +122 -39
- package/dist/components/media/Image.js.map +1 -1
- package/dist/components/media/Image.server.d.ts +3 -3
- package/dist/components/media/Image.server.d.ts.map +1 -1
- package/dist/components/media/Image.server.js +76 -13
- package/dist/components/media/Image.server.js.map +1 -1
- package/dist/components/media/index.d.ts +1 -1
- package/dist/components/media/index.d.ts.map +1 -1
- package/dist/components/media/index.js +2 -2
- package/dist/components/media/index.js.map +1 -1
- package/dist/components/typography/Heading.d.ts +2 -2
- package/dist/components/typography/Heading.d.ts.map +1 -1
- package/dist/components/typography/Heading.js +45 -25
- package/dist/components/typography/Heading.js.map +1 -1
- package/dist/components/typography/Heading.server.d.ts +2 -2
- package/dist/components/typography/Heading.server.d.ts.map +1 -1
- package/dist/components/typography/Heading.server.js +16 -10
- package/dist/components/typography/Heading.server.js.map +1 -1
- package/dist/components/typography/RichText.editor.d.ts +1 -1
- package/dist/components/typography/RichText.editor.d.ts.map +1 -1
- package/dist/components/typography/RichText.editor.js +44 -19
- package/dist/components/typography/RichText.editor.js.map +1 -1
- package/dist/components/typography/RichText.server.d.ts +2 -2
- package/dist/components/typography/RichText.server.d.ts.map +1 -1
- package/dist/components/typography/RichText.server.js +33 -14
- package/dist/components/typography/RichText.server.js.map +1 -1
- package/dist/components/typography/Text.d.ts +2 -2
- package/dist/components/typography/Text.d.ts.map +1 -1
- package/dist/components/typography/Text.js +49 -23
- package/dist/components/typography/Text.js.map +1 -1
- package/dist/components/typography/Text.server.d.ts +2 -2
- package/dist/components/typography/Text.server.d.ts.map +1 -1
- package/dist/components/typography/Text.server.js +21 -8
- package/dist/components/typography/Text.server.js.map +1 -1
- package/dist/components/typography/index.d.ts +4 -4
- package/dist/components/typography/index.d.ts.map +1 -1
- package/dist/components/typography/index.js +5 -5
- package/dist/components/typography/index.js.map +1 -1
- package/dist/config/config.editor.d.ts +3 -3
- package/dist/config/config.editor.d.ts.map +1 -1
- package/dist/config/config.editor.js +119 -54
- package/dist/config/config.editor.js.map +1 -1
- package/dist/config/index.d.ts +4 -4
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +62 -35
- package/dist/config/index.js.map +1 -1
- package/dist/config/merge.d.ts +1 -1
- package/dist/config/merge.d.ts.map +1 -1
- package/dist/config/merge.js +23 -26
- package/dist/config/merge.js.map +1 -1
- package/dist/config/presets.d.ts +4 -4
- package/dist/config/presets.js +195 -75
- package/dist/config/presets.js.map +1 -1
- package/dist/config/types.js +6 -2
- package/dist/config/types.js.map +1 -1
- package/dist/editor/PuckEditor.d.ts +12 -4
- package/dist/editor/PuckEditor.d.ts.map +1 -1
- package/dist/editor/PuckEditor.js +168 -67
- package/dist/editor/PuckEditor.js.map +1 -1
- package/dist/editor/PuckEditorImpl.client.d.ts +4 -4
- package/dist/editor/PuckEditorImpl.client.d.ts.map +1 -1
- package/dist/editor/PuckEditorImpl.client.js +304 -152
- package/dist/editor/PuckEditorImpl.client.js.map +1 -1
- package/dist/editor/components/DarkModeStyles.js +11 -12
- package/dist/editor/components/DarkModeStyles.js.map +1 -1
- package/dist/editor/components/HeaderActions.js +308 -64
- package/dist/editor/components/HeaderActions.js.map +1 -1
- package/dist/editor/components/IframeWrapper.d.ts +1 -1
- package/dist/editor/components/IframeWrapper.d.ts.map +1 -1
- package/dist/editor/components/IframeWrapper.js +82 -58
- package/dist/editor/components/IframeWrapper.js.map +1 -1
- package/dist/editor/components/LoadingState.d.ts +1 -1
- package/dist/editor/components/LoadingState.d.ts.map +1 -1
- package/dist/editor/components/LoadingState.js +17 -3
- package/dist/editor/components/LoadingState.js.map +1 -1
- package/dist/editor/components/PreviewModal.js +234 -78
- package/dist/editor/components/PreviewModal.js.map +1 -1
- package/dist/editor/components/PreviewModeToggle.js +43 -15
- package/dist/editor/components/PreviewModeToggle.js.map +1 -1
- package/dist/editor/components/VersionHistory.js +219 -71
- package/dist/editor/components/VersionHistory.js.map +1 -1
- package/dist/editor/hooks/useDarkMode.js +36 -23
- package/dist/editor/hooks/useDarkMode.js.map +1 -1
- package/dist/editor/hooks/useUnsavedChanges.js +8 -8
- package/dist/editor/hooks/useUnsavedChanges.js.map +1 -1
- package/dist/editor/index.js +5 -6
- package/dist/editor/index.js.map +1 -1
- package/dist/editor/plugins/VersionHistoryPanel.js +236 -75
- package/dist/editor/plugins/VersionHistoryPanel.js.map +1 -1
- package/dist/editor/plugins/index.js +4 -4
- package/dist/editor/plugins/index.js.map +1 -1
- package/dist/editor/plugins/versionHistoryPlugin.js +10 -8
- package/dist/editor/plugins/versionHistoryPlugin.js.map +1 -1
- package/dist/editor/utils/detectPageTree.js +5 -5
- package/dist/editor/utils/detectPageTree.js.map +1 -1
- package/dist/editor/utils/index.js +1 -0
- package/dist/editor/utils/index.js.map +1 -1
- package/dist/editor/utils/injectPageTreeFields.js +13 -9
- package/dist/editor/utils/injectPageTreeFields.js.map +1 -1
- package/dist/endpoints/ai.js +58 -34
- package/dist/endpoints/ai.js.map +1 -1
- package/dist/endpoints/context.js +86 -40
- package/dist/endpoints/context.js.map +1 -1
- package/dist/endpoints/index.js +153 -76
- package/dist/endpoints/index.js.map +1 -1
- package/dist/endpoints/postcss.d.js +5 -0
- package/dist/endpoints/postcss.d.js.map +1 -0
- package/dist/endpoints/prompts.js +81 -39
- package/dist/endpoints/prompts.js.map +1 -1
- package/dist/endpoints/styles.js +34 -36
- package/dist/endpoints/styles.js.map +1 -1
- package/dist/exports/client.js +2 -2
- package/dist/exports/client.js.map +1 -1
- package/dist/exports/rsc.js +2 -2
- package/dist/exports/rsc.js.map +1 -1
- package/dist/fields/AlignmentField.d.ts +1 -1
- package/dist/fields/AlignmentField.d.ts.map +1 -1
- package/dist/fields/AlignmentField.js +93 -30
- package/dist/fields/AlignmentField.js.map +1 -1
- package/dist/fields/AnimationField.d.ts +2 -2
- package/dist/fields/AnimationField.d.ts.map +1 -1
- package/dist/fields/AnimationField.js +558 -84
- package/dist/fields/AnimationField.js.map +1 -1
- package/dist/fields/BackgroundField.d.ts +2 -2
- package/dist/fields/BackgroundField.d.ts.map +1 -1
- package/dist/fields/BackgroundField.js +754 -120
- package/dist/fields/BackgroundField.js.map +1 -1
- package/dist/fields/BorderField.d.ts +2 -2
- package/dist/fields/BorderField.d.ts.map +1 -1
- package/dist/fields/BorderField.js +275 -73
- package/dist/fields/BorderField.js.map +1 -1
- package/dist/fields/ColorPickerField.d.ts +2 -2
- package/dist/fields/ColorPickerField.d.ts.map +1 -1
- package/dist/fields/ColorPickerField.js +210 -68
- package/dist/fields/ColorPickerField.js.map +1 -1
- package/dist/fields/ContentAlignmentField.d.ts +1 -1
- package/dist/fields/ContentAlignmentField.d.ts.map +1 -1
- package/dist/fields/ContentAlignmentField.js +161 -75
- package/dist/fields/ContentAlignmentField.js.map +1 -1
- package/dist/fields/DimensionsField.d.ts +2 -2
- package/dist/fields/DimensionsField.d.ts.map +1 -1
- package/dist/fields/DimensionsField.js +575 -146
- package/dist/fields/DimensionsField.js.map +1 -1
- package/dist/fields/FlexAlignmentField.d.ts +2 -2
- package/dist/fields/FlexAlignmentField.d.ts.map +1 -1
- package/dist/fields/FlexAlignmentField.js +189 -51
- package/dist/fields/FlexAlignmentField.js.map +1 -1
- package/dist/fields/FolderPickerField.d.ts +8 -1
- package/dist/fields/FolderPickerField.d.ts.map +1 -1
- package/dist/fields/FolderPickerField.js +288 -75
- package/dist/fields/FolderPickerField.js.map +1 -1
- package/dist/fields/GradientEditor.d.ts +2 -2
- package/dist/fields/GradientEditor.d.ts.map +1 -1
- package/dist/fields/GradientEditor.js +462 -86
- package/dist/fields/GradientEditor.js.map +1 -1
- package/dist/fields/LockedField.d.ts +15 -2
- package/dist/fields/LockedField.d.ts.map +1 -1
- package/dist/fields/LockedField.js +180 -49
- package/dist/fields/LockedField.js.map +1 -1
- package/dist/fields/MarginField.d.ts +2 -2
- package/dist/fields/MarginField.d.ts.map +1 -1
- package/dist/fields/MarginField.js +144 -46
- package/dist/fields/MarginField.js.map +1 -1
- package/dist/fields/MediaField.d.ts +1 -1
- package/dist/fields/MediaField.d.ts.map +1 -1
- package/dist/fields/MediaField.js +688 -186
- package/dist/fields/MediaField.js.map +1 -1
- package/dist/fields/PaddingField.d.ts +2 -2
- package/dist/fields/PaddingField.d.ts.map +1 -1
- package/dist/fields/PaddingField.js +144 -46
- package/dist/fields/PaddingField.js.map +1 -1
- package/dist/fields/PageSegmentField.d.ts +15 -2
- package/dist/fields/PageSegmentField.d.ts.map +1 -1
- package/dist/fields/PageSegmentField.js +156 -54
- package/dist/fields/PageSegmentField.js.map +1 -1
- package/dist/fields/ResetField.d.ts +1 -1
- package/dist/fields/ResetField.d.ts.map +1 -1
- package/dist/fields/ResetField.js +59 -31
- package/dist/fields/ResetField.js.map +1 -1
- package/dist/fields/ResponsiveField.d.ts +1 -1
- package/dist/fields/ResponsiveField.d.ts.map +1 -1
- package/dist/fields/ResponsiveField.js +233 -90
- package/dist/fields/ResponsiveField.js.map +1 -1
- package/dist/fields/ResponsiveVisibilityField.d.ts +2 -2
- package/dist/fields/ResponsiveVisibilityField.d.ts.map +1 -1
- package/dist/fields/ResponsiveVisibilityField.js +119 -36
- package/dist/fields/ResponsiveVisibilityField.js.map +1 -1
- package/dist/fields/SizeField.d.ts +3 -3
- package/dist/fields/SizeField.d.ts.map +1 -1
- package/dist/fields/SizeField.js +226 -52
- package/dist/fields/SizeField.js.map +1 -1
- package/dist/fields/SlugPreviewField.d.ts +8 -1
- package/dist/fields/SlugPreviewField.d.ts.map +1 -1
- package/dist/fields/SlugPreviewField.js +65 -16
- package/dist/fields/SlugPreviewField.js.map +1 -1
- package/dist/fields/TemplateField.d.ts +1 -1
- package/dist/fields/TemplateField.d.ts.map +1 -1
- package/dist/fields/TemplateField.js +362 -120
- package/dist/fields/TemplateField.js.map +1 -1
- package/dist/fields/TransformField.d.ts +2 -2
- package/dist/fields/TransformField.d.ts.map +1 -1
- package/dist/fields/TransformField.js +517 -81
- package/dist/fields/TransformField.js.map +1 -1
- package/dist/fields/VerticalAlignmentField.d.ts +1 -1
- package/dist/fields/VerticalAlignmentField.d.ts.map +1 -1
- package/dist/fields/VerticalAlignmentField.js +93 -30
- package/dist/fields/VerticalAlignmentField.js.map +1 -1
- package/dist/fields/WidthField.d.ts +2 -2
- package/dist/fields/WidthField.d.ts.map +1 -1
- package/dist/fields/WidthField.js +278 -81
- package/dist/fields/WidthField.js.map +1 -1
- package/dist/fields/index.d.ts +41 -41
- package/dist/fields/index.d.ts.map +1 -1
- package/dist/fields/index.js +37 -43
- package/dist/fields/index.js.map +1 -1
- package/dist/fields/richtext/controls/ColorPickerControl.d.ts +13 -2
- package/dist/fields/richtext/controls/ColorPickerControl.d.ts.map +1 -1
- package/dist/fields/richtext/controls/ColorPickerControl.js +212 -47
- package/dist/fields/richtext/controls/ColorPickerControl.js.map +1 -1
- package/dist/fields/richtext/controls/DropdownPortal.d.ts +2 -2
- package/dist/fields/richtext/controls/DropdownPortal.d.ts.map +1 -1
- package/dist/fields/richtext/controls/DropdownPortal.js +36 -4
- package/dist/fields/richtext/controls/DropdownPortal.js.map +1 -1
- package/dist/fields/richtext/controls/FontSizeControl.d.ts +9 -1
- package/dist/fields/richtext/controls/FontSizeControl.d.ts.map +1 -1
- package/dist/fields/richtext/controls/FontSizeControl.js +109 -24
- package/dist/fields/richtext/controls/FontSizeControl.js.map +1 -1
- package/dist/fields/richtext/controls/HighlightControl.d.ts +12 -1
- package/dist/fields/richtext/controls/HighlightControl.d.ts.map +1 -1
- package/dist/fields/richtext/controls/HighlightControl.js +54 -17
- package/dist/fields/richtext/controls/HighlightControl.js.map +1 -1
- package/dist/fields/richtext/controls/index.d.ts +5 -5
- package/dist/fields/richtext/controls/index.d.ts.map +1 -1
- package/dist/fields/richtext/controls/index.js +8 -11
- package/dist/fields/richtext/controls/index.js.map +1 -1
- package/dist/fields/richtext/controls/shared.js +108 -63
- package/dist/fields/richtext/controls/shared.js.map +1 -1
- package/dist/fields/richtext/createRichTextField.d.ts +18 -4
- package/dist/fields/richtext/createRichTextField.d.ts.map +1 -1
- package/dist/fields/richtext/createRichTextField.js +113 -26
- package/dist/fields/richtext/createRichTextField.js.map +1 -1
- package/dist/fields/richtext/extensions/FontSize.js +26 -20
- package/dist/fields/richtext/extensions/FontSize.js.map +1 -1
- package/dist/fields/richtext/extensions/index.d.ts +1 -1
- package/dist/fields/richtext/extensions/index.d.ts.map +1 -1
- package/dist/fields/richtext/extensions/index.js +2 -2
- package/dist/fields/richtext/extensions/index.js.map +1 -1
- package/dist/fields/richtext/index.d.ts +6 -6
- package/dist/fields/richtext/index.d.ts.map +1 -1
- package/dist/fields/richtext/index.js +8 -8
- package/dist/fields/richtext/index.js.map +1 -1
- package/dist/fields/shared.d.ts +1 -1
- package/dist/fields/shared.d.ts.map +1 -1
- package/dist/fields/shared.js +915 -478
- package/dist/fields/shared.js.map +1 -1
- package/dist/hooks/index.d.ts +2 -2
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +3 -3
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/useResponsiveStyles.d.ts +1 -1
- package/dist/hooks/useResponsiveStyles.d.ts.map +1 -1
- package/dist/hooks/useResponsiveStyles.js +36 -32
- package/dist/hooks/useResponsiveStyles.js.map +1 -1
- package/dist/hooks/useScrollAnimation.js +26 -24
- package/dist/hooks/useScrollAnimation.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/layouts/LayoutWrapper.d.ts +3 -3
- package/dist/layouts/LayoutWrapper.d.ts.map +1 -1
- package/dist/layouts/LayoutWrapper.js +115 -51
- package/dist/layouts/LayoutWrapper.js.map +1 -1
- package/dist/layouts/defaults.d.ts +1 -1
- package/dist/layouts/defaults.d.ts.map +1 -1
- package/dist/layouts/defaults.js +23 -31
- package/dist/layouts/defaults.js.map +1 -1
- package/dist/layouts/index.d.ts +4 -4
- package/dist/layouts/index.d.ts.map +1 -1
- package/dist/layouts/index.js +5 -4
- package/dist/layouts/index.js.map +1 -1
- package/dist/layouts/types.js +4 -2
- package/dist/layouts/types.js.map +1 -1
- package/dist/layouts/utils.d.ts +1 -1
- package/dist/layouts/utils.d.ts.map +1 -1
- package/dist/layouts/utils.js +32 -40
- package/dist/layouts/utils.js.map +1 -1
- package/dist/next/index.js +31 -34
- package/dist/next/index.js.map +1 -1
- package/dist/plugin/collections/Pages.d.ts +2 -2
- package/dist/plugin/collections/Pages.d.ts.map +1 -1
- package/dist/plugin/collections/Pages.js +46 -43
- package/dist/plugin/collections/Pages.js.map +1 -1
- package/dist/plugin/fields/index.d.ts +3 -3
- package/dist/plugin/fields/index.d.ts.map +1 -1
- package/dist/plugin/fields/index.js +100 -78
- package/dist/plugin/fields/index.js.map +1 -1
- package/dist/plugin/fields/types.d.ts +1 -1
- package/dist/plugin/fields/types.d.ts.map +1 -1
- package/dist/plugin/fields/types.js +26 -2
- package/dist/plugin/fields/types.js.map +1 -1
- package/dist/plugin/hooks/index.d.ts +1 -1
- package/dist/plugin/hooks/index.d.ts.map +1 -1
- package/dist/plugin/hooks/index.js +2 -2
- package/dist/plugin/hooks/index.js.map +1 -1
- package/dist/plugin/hooks/isHomepageUnique.js +28 -19
- package/dist/plugin/hooks/isHomepageUnique.js.map +1 -1
- package/dist/plugin/index.d.ts +8 -8
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js +192 -188
- package/dist/plugin/index.js.map +1 -1
- package/dist/render/HybridPageRenderer.d.ts +2 -2
- package/dist/render/HybridPageRenderer.d.ts.map +1 -1
- package/dist/render/HybridPageRenderer.js +58 -10
- package/dist/render/HybridPageRenderer.js.map +1 -1
- package/dist/render/PageRenderer.d.ts +2 -2
- package/dist/render/PageRenderer.d.ts.map +1 -1
- package/dist/render/PageRenderer.js +31 -14
- package/dist/render/PageRenderer.js.map +1 -1
- package/dist/render/PuckEditor.client.d.ts +1 -1
- package/dist/render/PuckEditor.client.d.ts.map +1 -1
- package/dist/render/PuckEditor.client.js +33 -16
- package/dist/render/PuckEditor.client.js.map +1 -1
- package/dist/render/index.d.ts +5 -5
- package/dist/render/index.d.ts.map +1 -1
- package/dist/render/index.js +5 -6
- package/dist/render/index.js.map +1 -1
- package/dist/styles/puck-dark-mode.css +101 -0
- package/dist/theme/context.d.ts +2 -2
- package/dist/theme/context.d.ts.map +1 -1
- package/dist/theme/context.js +21 -18
- package/dist/theme/context.js.map +1 -1
- package/dist/theme/defaults.d.ts +1 -1
- package/dist/theme/defaults.d.ts.map +1 -1
- package/dist/theme/defaults.js +83 -37
- package/dist/theme/defaults.js.map +1 -1
- package/dist/theme/example.d.ts +1 -1
- package/dist/theme/example.d.ts.map +1 -1
- package/dist/theme/example.js +68 -30
- package/dist/theme/example.js.map +1 -1
- package/dist/theme/index.d.ts +5 -5
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +6 -5
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/types.js +6 -2
- package/dist/theme/types.js.map +1 -1
- package/dist/theme/utils.d.ts +1 -1
- package/dist/theme/utils.d.ts.map +1 -1
- package/dist/theme/utils.js +24 -25
- package/dist/theme/utils.js.map +1 -1
- package/dist/types/index.d.ts +42 -6
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +3 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/index.d.ts +2 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +13 -22
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/migration.d.ts +1 -1
- package/dist/utils/migration.d.ts.map +1 -1
- package/dist/utils/migration.js +43 -49
- package/dist/utils/migration.js.map +1 -1
- package/dist/utils/validation.d.ts +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +36 -43
- package/dist/utils/validation.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -1
- package/dist/version.js.map +1 -1
- package/dist/views/PuckConfigContext.d.ts +1 -1
- package/dist/views/PuckConfigContext.d.ts.map +1 -1
- package/dist/views/PuckConfigContext.js +25 -10
- package/dist/views/PuckConfigContext.js.map +1 -1
- package/dist/views/PuckEditorView.d.ts +1 -1
- package/dist/views/PuckEditorView.d.ts.map +1 -1
- package/dist/views/PuckEditorView.js +137 -41
- package/dist/views/PuckEditorView.js.map +1 -1
- package/dist/views/index.js +2 -2
- package/dist/views/index.js.map +1 -1
- package/package.json +62 -42
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/collections/AiPrompts.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\n/**\n * AI Prompts Collection\n *\n * Stores example prompts for the AI chat interface.\n * These prompts are displayed in the Puck editor for users to quickly\n * start common AI generation tasks.\n */\nexport const AiPromptsCollection: CollectionConfig = {\n slug: 'puck-ai-prompts',\n labels: {\n singular: 'AI Prompt',\n plural: 'AI Prompts',\n },\n admin: {\n group: 'Puck',\n useAsTitle: 'label',\n defaultColumns: ['label', 'category', 'order', 'updatedAt'],\n hidden: false, // Visible in admin for prompt management\n },\n access: {\n // Default: authenticated users can manage prompts\n read: ({ req }) => Boolean(req.user),\n create: ({ req }) => Boolean(req.user),\n update: ({ req }) => Boolean(req.user),\n delete: ({ req }) => Boolean(req.user),\n },\n fields: [\n {\n name: 'label',\n type: 'text',\n required: true,\n admin: {\n description: 'Display label for the prompt (e.g., \"Landing page\")',\n },\n },\n {\n name: 'prompt',\n type: 'textarea',\n required: true,\n admin: {\n description: 'The actual prompt text sent to the AI',\n rows: 4,\n },\n },\n {\n name: 'category',\n type: 'text',\n admin: {\n description: 'Optional category for grouping prompts (e.g., \"Marketing\", \"Product\")',\n },\n },\n {\n name: 'order',\n type: 'number',\n defaultValue: 0,\n admin: {\n description: 'Display order (lower numbers appear first)',\n },\n },\n ],\n timestamps: true,\n}\n"],"names":["AiPromptsCollection","slug","labels","singular","plural","admin","group","useAsTitle","defaultColumns","hidden","access","read","req","Boolean","user","create","update","delete","fields","name","type","required","description","rows","defaultValue","timestamps"],"mappings":"AAEA;;;;;;CAMC,GACD,OAAO,MAAMA,sBAAwC;IACnDC,MAAM;IACNC,QAAQ;QACNC,UAAU;QACVC,QAAQ;IACV;IACAC,OAAO;QACLC,OAAO;QACPC,YAAY;QACZC,gBAAgB;YAAC;YAAS;YAAY;YAAS;SAAY;QAC3DC,QAAQ;IACV;IACAC,QAAQ;QACN,kDAAkD;QAClDC,MAAM,CAAC,EAAEC,GAAG,EAAE,GAAKC,QAAQD,IAAIE,IAAI;QACnCC,QAAQ,CAAC,EAAEH,GAAG,EAAE,GAAKC,QAAQD,IAAIE,IAAI;QACrCE,QAAQ,CAAC,EAAEJ,GAAG,EAAE,GAAKC,QAAQD,IAAIE,IAAI;QACrCG,QAAQ,CAAC,EAAEL,GAAG,EAAE,GAAKC,QAAQD,IAAIE,IAAI;IACvC;IACAI,QAAQ;QACN;YACEC,MAAM;YACNC,MAAM;YACNC,UAAU;YACVhB,OAAO;gBACLiB,aAAa;YACf;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNC,UAAU;YACVhB,OAAO;gBACLiB,aAAa;gBACbC,MAAM;YACR;QACF;QACA;YACEJ,MAAM;YACNC,MAAM;YACNf,OAAO;gBACLiB,aAAa;YACf;QACF;QACA;YACEH,MAAM;YACNC,MAAM;YACNI,cAAc;YACdnB,OAAO;gBACLiB,aAAa;YACf;QACF;KACD;IACDG,YAAY;AACd,EAAC"}
|
|
@@ -34,18 +34,21 @@
|
|
|
34
34
|
* },
|
|
35
35
|
* })
|
|
36
36
|
* ```
|
|
37
|
-
*/
|
|
38
|
-
export function createPuckAiApiRoutes(config) {
|
|
37
|
+
*/ export function createPuckAiApiRoutes(config) {
|
|
39
38
|
const { auth, ai, onError } = config;
|
|
40
39
|
return {
|
|
41
|
-
POST: async (request)
|
|
40
|
+
POST: async (request)=>{
|
|
42
41
|
try {
|
|
43
42
|
// 1. Authenticate the request
|
|
44
43
|
const authResult = await auth.authenticate(request);
|
|
45
44
|
if (!authResult.authenticated) {
|
|
46
|
-
return new Response(JSON.stringify({
|
|
45
|
+
return new Response(JSON.stringify({
|
|
46
|
+
error: authResult.error || 'Unauthorized'
|
|
47
|
+
}), {
|
|
47
48
|
status: 401,
|
|
48
|
-
headers: {
|
|
49
|
+
headers: {
|
|
50
|
+
'Content-Type': 'application/json'
|
|
51
|
+
}
|
|
49
52
|
});
|
|
50
53
|
}
|
|
51
54
|
// 2. Lazy import @puckeditor/cloud-client to avoid errors if not installed
|
|
@@ -55,24 +58,25 @@ export function createPuckAiApiRoutes(config) {
|
|
|
55
58
|
const cloudClient = await import('@puckeditor/cloud-client');
|
|
56
59
|
puckHandler = cloudClient.puckHandler;
|
|
57
60
|
tool = cloudClient.tool;
|
|
58
|
-
}
|
|
59
|
-
catch (e) {
|
|
61
|
+
} catch (e) {
|
|
60
62
|
return new Response(JSON.stringify({
|
|
61
|
-
error: 'AI features require @puckeditor/cloud-client. Please install it.'
|
|
63
|
+
error: 'AI features require @puckeditor/cloud-client. Please install it.'
|
|
62
64
|
}), {
|
|
63
65
|
status: 500,
|
|
64
|
-
headers: {
|
|
66
|
+
headers: {
|
|
67
|
+
'Content-Type': 'application/json'
|
|
68
|
+
}
|
|
65
69
|
});
|
|
66
70
|
}
|
|
67
71
|
// 3. Convert our tool format to Puck's tool format
|
|
68
72
|
const puckTools = {};
|
|
69
73
|
if (ai?.tools) {
|
|
70
|
-
for (const [name, toolDef] of Object.entries(ai.tools))
|
|
74
|
+
for (const [name, toolDef] of Object.entries(ai.tools)){
|
|
71
75
|
puckTools[name] = tool({
|
|
72
76
|
description: toolDef.description,
|
|
73
77
|
inputSchema: toolDef.inputSchema,
|
|
74
78
|
execute: toolDef.execute,
|
|
75
|
-
name: toolDef.name
|
|
79
|
+
name: toolDef.name
|
|
76
80
|
});
|
|
77
81
|
}
|
|
78
82
|
}
|
|
@@ -82,25 +86,30 @@ export function createPuckAiApiRoutes(config) {
|
|
|
82
86
|
host: ai?.host,
|
|
83
87
|
ai: {
|
|
84
88
|
context: ai?.context,
|
|
85
|
-
tools: Object.keys(puckTools).length > 0 ? puckTools : undefined
|
|
86
|
-
}
|
|
89
|
+
tools: Object.keys(puckTools).length > 0 ? puckTools : undefined
|
|
90
|
+
}
|
|
87
91
|
});
|
|
88
|
-
}
|
|
89
|
-
catch (error) {
|
|
92
|
+
} catch (error) {
|
|
90
93
|
// Call custom error handler if provided
|
|
91
94
|
if (onError) {
|
|
92
|
-
onError(error, {
|
|
95
|
+
onError(error, {
|
|
96
|
+
operation: 'ai-chat',
|
|
97
|
+
request
|
|
98
|
+
});
|
|
93
99
|
}
|
|
94
100
|
console.error('[Puck AI] Error handling request:', error);
|
|
95
101
|
return new Response(JSON.stringify({
|
|
96
102
|
error: 'Internal server error',
|
|
97
|
-
message: error instanceof Error ? error.message : 'Unknown error'
|
|
103
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
98
104
|
}), {
|
|
99
105
|
status: 500,
|
|
100
|
-
headers: {
|
|
106
|
+
headers: {
|
|
107
|
+
'Content-Type': 'application/json'
|
|
108
|
+
}
|
|
101
109
|
});
|
|
102
110
|
}
|
|
103
|
-
}
|
|
111
|
+
}
|
|
104
112
|
};
|
|
105
113
|
}
|
|
114
|
+
|
|
106
115
|
//# sourceMappingURL=createAiApiRoutes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../src/ai/createAiApiRoutes.ts"],"sourcesContent":["import type { NextRequest } from 'next/server'\nimport type { PuckAiRoutesConfig, PuckAiRouteHandlers } from './types.js'\n\n/**\n * Creates API route handlers for /api/puck/[...all]\n *\n * Wraps @puckeditor/cloud-client's puckHandler with authentication\n * and custom context/tools support.\n *\n * @example\n * ```typescript\n * // app/api/puck/[...all]/route.ts\n * import { createPuckAiApiRoutes } from '@delmaredigital/payload-puck/ai'\n * import config from '@payload-config'\n * import { z } from 'zod'\n *\n * export const POST = createPuckAiApiRoutes({\n * payloadConfig: config,\n * auth: {\n * authenticate: async (request) => {\n * const session = await auth.api.getSession({ headers: request.headers })\n * if (!session?.user) return { authenticated: false }\n * return { authenticated: true, user: session.user }\n * },\n * },\n * ai: {\n * context: 'We are Acme Corp. You build our landing pages.',\n * tools: {\n * getProducts: {\n * description: 'Get a list of products',\n * inputSchema: z.object({}),\n * execute: async () => {\n * return await payload.find({ collection: 'products' })\n * },\n * },\n * },\n * },\n * })\n * ```\n */\nexport function createPuckAiApiRoutes(config: PuckAiRoutesConfig): PuckAiRouteHandlers {\n const { auth, ai, onError } = config\n\n return {\n POST: async (request: NextRequest): Promise<Response> => {\n try {\n // 1. Authenticate the request\n const authResult = await auth.authenticate(request)\n\n if (!authResult.authenticated) {\n return new Response(\n JSON.stringify({ error: authResult.error || 'Unauthorized' }),\n {\n status: 401,\n headers: { 'Content-Type': 'application/json' },\n }\n )\n }\n\n // 2. Lazy import @puckeditor/cloud-client to avoid errors if not installed\n let puckHandler: typeof import('@puckeditor/cloud-client').puckHandler\n let tool: typeof import('@puckeditor/cloud-client').tool\n\n try {\n const cloudClient = await import('@puckeditor/cloud-client')\n puckHandler = cloudClient.puckHandler\n tool = cloudClient.tool\n } catch (e) {\n return new Response(\n JSON.stringify({\n error: 'AI features require @puckeditor/cloud-client. Please install it.',\n }),\n {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n }\n )\n }\n\n // 3. Convert our tool format to Puck's tool format\n const puckTools: Record<string, ReturnType<typeof tool>> = {}\n if (ai?.tools) {\n for (const [name, toolDef] of Object.entries(ai.tools)) {\n puckTools[name] = tool({\n description: toolDef.description,\n inputSchema: toolDef.inputSchema,\n execute: toolDef.execute,\n name: toolDef.name,\n })\n }\n }\n\n // 4. Call puckHandler with our configuration\n return puckHandler(request, {\n apiKey: ai?.apiKey,\n host: ai?.host,\n ai: {\n context: ai?.context,\n tools: Object.keys(puckTools).length > 0 ? puckTools : undefined,\n },\n })\n } catch (error) {\n // Call custom error handler if provided\n if (onError) {\n onError(error, { operation: 'ai-chat', request })\n }\n\n console.error('[Puck AI] Error handling request:', error)\n\n return new Response(\n JSON.stringify({\n error: 'Internal server error',\n message: error instanceof Error ? error.message : 'Unknown error',\n }),\n {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n }\n )\n }\n },\n }\n}\n"],"names":["createPuckAiApiRoutes","config","auth","ai","onError","POST","request","authResult","authenticate","authenticated","Response","JSON","stringify","error","status","headers","puckHandler","tool","cloudClient","e","puckTools","tools","name","toolDef","Object","entries","description","inputSchema","execute","apiKey","host","context","keys","length","undefined","operation","console","message","Error"],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCC,GACD,OAAO,SAASA,sBAAsBC,MAA0B;IAC9D,MAAM,EAAEC,IAAI,EAAEC,EAAE,EAAEC,OAAO,EAAE,GAAGH;IAE9B,OAAO;QACLI,MAAM,OAAOC;YACX,IAAI;gBACF,8BAA8B;gBAC9B,MAAMC,aAAa,MAAML,KAAKM,YAAY,CAACF;gBAE3C,IAAI,CAACC,WAAWE,aAAa,EAAE;oBAC7B,OAAO,IAAIC,SACTC,KAAKC,SAAS,CAAC;wBAAEC,OAAON,WAAWM,KAAK,IAAI;oBAAe,IAC3D;wBACEC,QAAQ;wBACRC,SAAS;4BAAE,gBAAgB;wBAAmB;oBAChD;gBAEJ;gBAEA,2EAA2E;gBAC3E,IAAIC;gBACJ,IAAIC;gBAEJ,IAAI;oBACF,MAAMC,cAAc,MAAM,MAAM,CAAC;oBACjCF,cAAcE,YAAYF,WAAW;oBACrCC,OAAOC,YAAYD,IAAI;gBACzB,EAAE,OAAOE,GAAG;oBACV,OAAO,IAAIT,SACTC,KAAKC,SAAS,CAAC;wBACbC,OAAO;oBACT,IACA;wBACEC,QAAQ;wBACRC,SAAS;4BAAE,gBAAgB;wBAAmB;oBAChD;gBAEJ;gBAEA,mDAAmD;gBACnD,MAAMK,YAAqD,CAAC;gBAC5D,IAAIjB,IAAIkB,OAAO;oBACb,KAAK,MAAM,CAACC,MAAMC,QAAQ,IAAIC,OAAOC,OAAO,CAACtB,GAAGkB,KAAK,EAAG;wBACtDD,SAAS,CAACE,KAAK,GAAGL,KAAK;4BACrBS,aAAaH,QAAQG,WAAW;4BAChCC,aAAaJ,QAAQI,WAAW;4BAChCC,SAASL,QAAQK,OAAO;4BACxBN,MAAMC,QAAQD,IAAI;wBACpB;oBACF;gBACF;gBAEA,6CAA6C;gBAC7C,OAAON,YAAYV,SAAS;oBAC1BuB,QAAQ1B,IAAI0B;oBACZC,MAAM3B,IAAI2B;oBACV3B,IAAI;wBACF4B,SAAS5B,IAAI4B;wBACbV,OAAOG,OAAOQ,IAAI,CAACZ,WAAWa,MAAM,GAAG,IAAIb,YAAYc;oBACzD;gBACF;YACF,EAAE,OAAOrB,OAAO;gBACd,wCAAwC;gBACxC,IAAIT,SAAS;oBACXA,QAAQS,OAAO;wBAAEsB,WAAW;wBAAW7B;oBAAQ;gBACjD;gBAEA8B,QAAQvB,KAAK,CAAC,qCAAqCA;gBAEnD,OAAO,IAAIH,SACTC,KAAKC,SAAS,CAAC;oBACbC,OAAO;oBACPwB,SAASxB,iBAAiByB,QAAQzB,MAAMwB,OAAO,GAAG;gBACpD,IACA;oBACEvB,QAAQ;oBACRC,SAAS;wBAAE,gBAAgB;oBAAmB;gBAChD;YAEJ;QACF;IACF;AACF"}
|
|
@@ -59,10 +59,9 @@
|
|
|
59
59
|
* data: { puckData: updatedData },
|
|
60
60
|
* })
|
|
61
61
|
* ```
|
|
62
|
-
*/
|
|
63
|
-
export function createAiGenerate(config) {
|
|
62
|
+
*/ export function createAiGenerate(config) {
|
|
64
63
|
const { ai } = config;
|
|
65
|
-
return async (options)
|
|
64
|
+
return async (options)=>{
|
|
66
65
|
const { prompt, puckConfig, pageData } = options;
|
|
67
66
|
// Lazy import @puckeditor/cloud-client
|
|
68
67
|
let generate;
|
|
@@ -71,19 +70,18 @@ export function createAiGenerate(config) {
|
|
|
71
70
|
const cloudClient = await import('@puckeditor/cloud-client');
|
|
72
71
|
generate = cloudClient.generate;
|
|
73
72
|
tool = cloudClient.tool;
|
|
74
|
-
}
|
|
75
|
-
catch (e) {
|
|
73
|
+
} catch (e) {
|
|
76
74
|
throw new Error('AI generation requires @puckeditor/cloud-client. Please install it with: pnpm add @puckeditor/cloud-client');
|
|
77
75
|
}
|
|
78
76
|
// Convert our tool format to Puck's tool format
|
|
79
77
|
const puckTools = {};
|
|
80
78
|
if (ai?.tools) {
|
|
81
|
-
for (const [name, toolDef] of Object.entries(ai.tools))
|
|
79
|
+
for (const [name, toolDef] of Object.entries(ai.tools)){
|
|
82
80
|
puckTools[name] = tool({
|
|
83
81
|
description: toolDef.description,
|
|
84
82
|
inputSchema: toolDef.inputSchema,
|
|
85
83
|
execute: toolDef.execute,
|
|
86
|
-
name: toolDef.name
|
|
84
|
+
name: toolDef.name
|
|
87
85
|
});
|
|
88
86
|
}
|
|
89
87
|
}
|
|
@@ -95,7 +93,7 @@ export function createAiGenerate(config) {
|
|
|
95
93
|
apiKey: ai?.apiKey,
|
|
96
94
|
host: ai?.host,
|
|
97
95
|
pageData,
|
|
98
|
-
tools: Object.keys(puckTools).length > 0 ? puckTools : undefined
|
|
96
|
+
tools: Object.keys(puckTools).length > 0 ? puckTools : undefined
|
|
99
97
|
});
|
|
100
98
|
if (!result) {
|
|
101
99
|
throw new Error('AI generation failed: no result returned');
|
|
@@ -103,4 +101,5 @@ export function createAiGenerate(config) {
|
|
|
103
101
|
return result;
|
|
104
102
|
};
|
|
105
103
|
}
|
|
104
|
+
|
|
106
105
|
//# sourceMappingURL=createAiGenerate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../src/ai/createAiGenerate.ts"],"sourcesContent":["import type { Data as PuckData } from '@puckeditor/core'\nimport type { AiGenerateConfig, AiGenerateOptions, AiGenerateFunction } from './types.js'\n\n/**\n * Creates a headless AI page generation function\n *\n * Use this to generate Puck pages programmatically without the editor UI.\n * Useful for batch generation, automated workflows, or API-driven page creation.\n *\n * @example Basic generation\n * ```typescript\n * import { createAiGenerate } from '@delmaredigital/payload-puck/ai'\n * import { editorConfig } from '@delmaredigital/payload-puck/config/editor'\n * import config from '@payload-config'\n *\n * const generatePage = createAiGenerate({\n * payloadConfig: config,\n * auth: {\n * authenticate: async (req) => {\n * // Authenticate the request\n * return { authenticated: true, user: { id: 'system' } }\n * },\n * },\n * ai: {\n * context: 'We are Acme Corp. You build our marketing pages.',\n * },\n * })\n *\n * // Generate a new page\n * const pageData = await generatePage({\n * prompt: 'Create a landing page for our new product launch',\n * puckConfig: editorConfig,\n * })\n *\n * // Save to Payload\n * await payload.create({\n * collection: 'pages',\n * data: {\n * title: 'New Product Launch',\n * slug: 'new-product',\n * puckData: pageData,\n * },\n * })\n * ```\n *\n * @example Updating an existing page\n * ```typescript\n * // Fetch existing page\n * const page = await payload.findByID({ collection: 'pages', id: 'abc123' })\n *\n * // Update with AI\n * const updatedData = await generatePage({\n * prompt: 'Add a testimonials section after the hero',\n * puckConfig: editorConfig,\n * pageData: page.puckData, // Pass existing data\n * })\n *\n * // Save the update\n * await payload.update({\n * collection: 'pages',\n * id: 'abc123',\n * data: { puckData: updatedData },\n * })\n * ```\n */\nexport function createAiGenerate(config: AiGenerateConfig): AiGenerateFunction {\n const { ai } = config\n\n return async (options: AiGenerateOptions): Promise<PuckData> => {\n const { prompt, puckConfig, pageData } = options\n\n // Lazy import @puckeditor/cloud-client\n let generate: typeof import('@puckeditor/cloud-client').generate\n let tool: typeof import('@puckeditor/cloud-client').tool\n\n try {\n const cloudClient = await import('@puckeditor/cloud-client')\n generate = cloudClient.generate\n tool = cloudClient.tool\n } catch (e) {\n throw new Error(\n 'AI generation requires @puckeditor/cloud-client. Please install it with: pnpm add @puckeditor/cloud-client'\n )\n }\n\n // Convert our tool format to Puck's tool format\n const puckTools: Record<string, ReturnType<typeof tool>> = {}\n if (ai?.tools) {\n for (const [name, toolDef] of Object.entries(ai.tools)) {\n puckTools[name] = tool({\n description: toolDef.description,\n inputSchema: toolDef.inputSchema,\n execute: toolDef.execute,\n name: toolDef.name,\n })\n }\n }\n\n // Call the generate API\n const result = await generate({\n prompt,\n config: puckConfig,\n context: ai?.context,\n apiKey: ai?.apiKey,\n host: ai?.host,\n pageData,\n tools: Object.keys(puckTools).length > 0 ? puckTools : undefined,\n })\n\n if (!result) {\n throw new Error('AI generation failed: no result returned')\n }\n\n return result as PuckData\n }\n}\n"],"names":["createAiGenerate","config","ai","options","prompt","puckConfig","pageData","generate","tool","cloudClient","e","Error","puckTools","tools","name","toolDef","Object","entries","description","inputSchema","execute","result","context","apiKey","host","keys","length","undefined"],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6DC,GACD,OAAO,SAASA,iBAAiBC,MAAwB;IACvD,MAAM,EAAEC,EAAE,EAAE,GAAGD;IAEf,OAAO,OAAOE;QACZ,MAAM,EAAEC,MAAM,EAAEC,UAAU,EAAEC,QAAQ,EAAE,GAAGH;QAEzC,uCAAuC;QACvC,IAAII;QACJ,IAAIC;QAEJ,IAAI;YACF,MAAMC,cAAc,MAAM,MAAM,CAAC;YACjCF,WAAWE,YAAYF,QAAQ;YAC/BC,OAAOC,YAAYD,IAAI;QACzB,EAAE,OAAOE,GAAG;YACV,MAAM,IAAIC,MACR;QAEJ;QAEA,gDAAgD;QAChD,MAAMC,YAAqD,CAAC;QAC5D,IAAIV,IAAIW,OAAO;YACb,KAAK,MAAM,CAACC,MAAMC,QAAQ,IAAIC,OAAOC,OAAO,CAACf,GAAGW,KAAK,EAAG;gBACtDD,SAAS,CAACE,KAAK,GAAGN,KAAK;oBACrBU,aAAaH,QAAQG,WAAW;oBAChCC,aAAaJ,QAAQI,WAAW;oBAChCC,SAASL,QAAQK,OAAO;oBACxBN,MAAMC,QAAQD,IAAI;gBACpB;YACF;QACF;QAEA,wBAAwB;QACxB,MAAMO,SAAS,MAAMd,SAAS;YAC5BH;YACAH,QAAQI;YACRiB,SAASpB,IAAIoB;YACbC,QAAQrB,IAAIqB;YACZC,MAAMtB,IAAIsB;YACVlB;YACAO,OAAOG,OAAOS,IAAI,CAACb,WAAWc,MAAM,GAAG,IAAId,YAAYe;QACzD;QAEA,IAAI,CAACN,QAAQ;YACX,MAAM,IAAIV,MAAM;QAClB;QAEA,OAAOU;IACT;AACF"}
|
|
@@ -33,8 +33,7 @@
|
|
|
33
33
|
*
|
|
34
34
|
* <PuckEditor plugins={[aiPlugin]} />
|
|
35
35
|
* ```
|
|
36
|
-
*/
|
|
37
|
-
export function createAiPlugin(options = {}) {
|
|
36
|
+
*/ export function createAiPlugin(options = {}) {
|
|
38
37
|
const { host = '/api/puck', examplePrompts, onSubmit } = options;
|
|
39
38
|
// Dynamic import to avoid build errors if plugin-ai not installed
|
|
40
39
|
// Also allows for tree-shaking when AI is not used
|
|
@@ -45,17 +44,16 @@ export function createAiPlugin(options = {}) {
|
|
|
45
44
|
host,
|
|
46
45
|
chat: {
|
|
47
46
|
examplePrompts,
|
|
48
|
-
onSubmit
|
|
49
|
-
}
|
|
47
|
+
onSubmit
|
|
48
|
+
}
|
|
50
49
|
});
|
|
51
|
-
}
|
|
52
|
-
catch (e) {
|
|
50
|
+
} catch (e) {
|
|
53
51
|
// Return a placeholder plugin if @puckeditor/plugin-ai is not installed
|
|
54
|
-
console.warn('[payload-puck] AI plugin requested but @puckeditor/plugin-ai not installed. ' +
|
|
55
|
-
'Install it with: pnpm add @puckeditor/plugin-ai');
|
|
52
|
+
console.warn('[payload-puck] AI plugin requested but @puckeditor/plugin-ai not installed. ' + 'Install it with: pnpm add @puckeditor/plugin-ai');
|
|
56
53
|
return {
|
|
57
|
-
name: 'ai-placeholder'
|
|
54
|
+
name: 'ai-placeholder'
|
|
58
55
|
};
|
|
59
56
|
}
|
|
60
57
|
}
|
|
58
|
+
|
|
61
59
|
//# sourceMappingURL=createAiPlugin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../src/ai/createAiPlugin.ts"],"sourcesContent":["'use client'\n\nimport type { Plugin as PuckPlugin } from '@puckeditor/core'\nimport type { AiPluginOptions } from './types.js'\n\n/**\n * Creates a Puck AI plugin for the editor\n *\n * Wraps @puckeditor/plugin-ai with sensible defaults for payload-puck.\n * This factory allows for runtime-configurable prompts (from database, API, etc.).\n *\n * @example Basic usage\n * ```tsx\n * import { createAiPlugin } from '@delmaredigital/payload-puck/ai'\n *\n * const aiPlugin = createAiPlugin({\n * host: '/api/puck',\n * examplePrompts: [\n * { label: 'Landing page', prompt: 'Create a landing page about our product' },\n * ],\n * })\n *\n * <PuckEditor plugins={[aiPlugin]} />\n * ```\n *\n * @example With runtime prompts from database\n * ```tsx\n * // Fetch prompts from Payload\n * const prompts = await payload.find({ collection: 'puck-ai-prompts' })\n *\n * const aiPlugin = createAiPlugin({\n * examplePrompts: prompts.docs.map(p => ({\n * label: p.label,\n * prompt: p.prompt,\n * })),\n * })\n *\n * <PuckEditor plugins={[aiPlugin]} />\n * ```\n */\nexport function createAiPlugin(options: AiPluginOptions = {}): PuckPlugin {\n const { host = '/api/puck', examplePrompts, onSubmit } = options\n\n // Dynamic import to avoid build errors if plugin-ai not installed\n // Also allows for tree-shaking when AI is not used\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { createAiPlugin: createPuckAiPlugin } = require('@puckeditor/plugin-ai')\n\n return createPuckAiPlugin({\n host,\n chat: {\n examplePrompts,\n onSubmit,\n },\n })\n } catch (e) {\n // Return a placeholder plugin if @puckeditor/plugin-ai is not installed\n console.warn(\n '[payload-puck] AI plugin requested but @puckeditor/plugin-ai not installed. ' +\n 'Install it with: pnpm add @puckeditor/plugin-ai'\n )\n\n return {\n name: 'ai-placeholder',\n }\n }\n}\n"],"names":["createAiPlugin","options","host","examplePrompts","onSubmit","createPuckAiPlugin","require","chat","e","console","warn","name"],"mappings":"AAAA;AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCC,GACD,OAAO,SAASA,eAAeC,UAA2B,CAAC,CAAC;IAC1D,MAAM,EAAEC,OAAO,WAAW,EAAEC,cAAc,EAAEC,QAAQ,EAAE,GAAGH;IAEzD,kEAAkE;IAClE,mDAAmD;IACnD,IAAI;QACF,iEAAiE;QACjE,MAAM,EAAED,gBAAgBK,kBAAkB,EAAE,GAAGC,QAAQ;QAEvD,OAAOD,mBAAmB;YACxBH;YACAK,MAAM;gBACJJ;gBACAC;YACF;QACF;IACF,EAAE,OAAOI,GAAG;QACV,wEAAwE;QACxEC,QAAQC,IAAI,CACV,iFACE;QAGJ,OAAO;YACLC,MAAM;QACR;IACF;AACF"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { useState, useEffect, useCallback } from 'react';
|
|
3
|
-
/** Event name for context updates */
|
|
4
|
-
export const AI_CONTEXT_UPDATED_EVENT = 'puck:ai-context-updated';
|
|
3
|
+
/** Event name for context updates */ export const AI_CONTEXT_UPDATED_EVENT = 'puck:ai-context-updated';
|
|
5
4
|
/**
|
|
6
5
|
* Dispatches an event to notify that AI context has been updated
|
|
7
6
|
* Call this after creating, editing, or deleting a context entry
|
|
8
|
-
*/
|
|
9
|
-
export function dispatchContextUpdated() {
|
|
7
|
+
*/ export function dispatchContextUpdated() {
|
|
10
8
|
if (typeof window !== 'undefined') {
|
|
11
9
|
window.dispatchEvent(new CustomEvent(AI_CONTEXT_UPDATED_EVENT));
|
|
12
10
|
}
|
|
@@ -30,13 +28,12 @@ export function dispatchContextUpdated() {
|
|
|
30
28
|
* // Delete an entry
|
|
31
29
|
* await remove(context[0].id)
|
|
32
30
|
* ```
|
|
33
|
-
*/
|
|
34
|
-
|
|
35
|
-
const { apiEndpoint = '/api/puck/ai-context', enabled = true, includeDisabled = false, } = options;
|
|
31
|
+
*/ export function useAiContext(options = {}) {
|
|
32
|
+
const { apiEndpoint = '/api/puck/ai-context', enabled = true, includeDisabled = false } = options;
|
|
36
33
|
const [context, setContext] = useState([]);
|
|
37
34
|
const [loading, setLoading] = useState(true);
|
|
38
35
|
const [error, setError] = useState(null);
|
|
39
|
-
const fetchContext = useCallback(async ()
|
|
36
|
+
const fetchContext = useCallback(async ()=>{
|
|
40
37
|
if (!enabled) {
|
|
41
38
|
setLoading(false);
|
|
42
39
|
return;
|
|
@@ -51,22 +48,26 @@ export function useAiContext(options = {}) {
|
|
|
51
48
|
}
|
|
52
49
|
const data = await response.json();
|
|
53
50
|
setContext(data.docs || []);
|
|
54
|
-
}
|
|
55
|
-
catch (err) {
|
|
51
|
+
} catch (err) {
|
|
56
52
|
setError(err instanceof Error ? err.message : 'Failed to load context');
|
|
57
53
|
setContext([]);
|
|
58
|
-
}
|
|
59
|
-
finally {
|
|
54
|
+
} finally{
|
|
60
55
|
setLoading(false);
|
|
61
56
|
}
|
|
62
|
-
}, [
|
|
57
|
+
}, [
|
|
58
|
+
apiEndpoint,
|
|
59
|
+
enabled,
|
|
60
|
+
includeDisabled
|
|
61
|
+
]);
|
|
63
62
|
// Create a new context entry
|
|
64
|
-
const create = useCallback(async (data)
|
|
63
|
+
const create = useCallback(async (data)=>{
|
|
65
64
|
try {
|
|
66
65
|
const response = await fetch(apiEndpoint, {
|
|
67
66
|
method: 'POST',
|
|
68
|
-
headers: {
|
|
69
|
-
|
|
67
|
+
headers: {
|
|
68
|
+
'Content-Type': 'application/json'
|
|
69
|
+
},
|
|
70
|
+
body: JSON.stringify(data)
|
|
70
71
|
});
|
|
71
72
|
if (!response.ok) {
|
|
72
73
|
throw new Error('Failed to create context entry');
|
|
@@ -74,19 +75,22 @@ export function useAiContext(options = {}) {
|
|
|
74
75
|
const newEntry = await response.json();
|
|
75
76
|
dispatchContextUpdated();
|
|
76
77
|
return newEntry;
|
|
77
|
-
}
|
|
78
|
-
catch (err) {
|
|
78
|
+
} catch (err) {
|
|
79
79
|
setError(err instanceof Error ? err.message : 'Failed to create context entry');
|
|
80
80
|
return null;
|
|
81
81
|
}
|
|
82
|
-
}, [
|
|
82
|
+
}, [
|
|
83
|
+
apiEndpoint
|
|
84
|
+
]);
|
|
83
85
|
// Update an existing context entry
|
|
84
|
-
const update = useCallback(async (id, data)
|
|
86
|
+
const update = useCallback(async (id, data)=>{
|
|
85
87
|
try {
|
|
86
88
|
const response = await fetch(`${apiEndpoint}/${id}`, {
|
|
87
89
|
method: 'PATCH',
|
|
88
|
-
headers: {
|
|
89
|
-
|
|
90
|
+
headers: {
|
|
91
|
+
'Content-Type': 'application/json'
|
|
92
|
+
},
|
|
93
|
+
body: JSON.stringify(data)
|
|
90
94
|
});
|
|
91
95
|
if (!response.ok) {
|
|
92
96
|
throw new Error('Failed to update context entry');
|
|
@@ -94,45 +98,51 @@ export function useAiContext(options = {}) {
|
|
|
94
98
|
const updatedEntry = await response.json();
|
|
95
99
|
dispatchContextUpdated();
|
|
96
100
|
return updatedEntry;
|
|
97
|
-
}
|
|
98
|
-
catch (err) {
|
|
101
|
+
} catch (err) {
|
|
99
102
|
setError(err instanceof Error ? err.message : 'Failed to update context entry');
|
|
100
103
|
return null;
|
|
101
104
|
}
|
|
102
|
-
}, [
|
|
105
|
+
}, [
|
|
106
|
+
apiEndpoint
|
|
107
|
+
]);
|
|
103
108
|
// Delete a context entry
|
|
104
|
-
const remove = useCallback(async (id)
|
|
109
|
+
const remove = useCallback(async (id)=>{
|
|
105
110
|
try {
|
|
106
111
|
const response = await fetch(`${apiEndpoint}/${id}`, {
|
|
107
|
-
method: 'DELETE'
|
|
112
|
+
method: 'DELETE'
|
|
108
113
|
});
|
|
109
114
|
if (!response.ok) {
|
|
110
115
|
throw new Error('Failed to delete context entry');
|
|
111
116
|
}
|
|
112
117
|
dispatchContextUpdated();
|
|
113
118
|
return true;
|
|
114
|
-
}
|
|
115
|
-
catch (err) {
|
|
119
|
+
} catch (err) {
|
|
116
120
|
setError(err instanceof Error ? err.message : 'Failed to delete context entry');
|
|
117
121
|
return false;
|
|
118
122
|
}
|
|
119
|
-
}, [
|
|
123
|
+
}, [
|
|
124
|
+
apiEndpoint
|
|
125
|
+
]);
|
|
120
126
|
// Initial fetch
|
|
121
|
-
useEffect(()
|
|
127
|
+
useEffect(()=>{
|
|
122
128
|
fetchContext();
|
|
123
|
-
}, [
|
|
129
|
+
}, [
|
|
130
|
+
fetchContext
|
|
131
|
+
]);
|
|
124
132
|
// Listen for context updates
|
|
125
|
-
useEffect(()
|
|
126
|
-
if (!enabled)
|
|
127
|
-
|
|
128
|
-
const handleUpdate = () => {
|
|
133
|
+
useEffect(()=>{
|
|
134
|
+
if (!enabled) return;
|
|
135
|
+
const handleUpdate = ()=>{
|
|
129
136
|
fetchContext();
|
|
130
137
|
};
|
|
131
138
|
window.addEventListener(AI_CONTEXT_UPDATED_EVENT, handleUpdate);
|
|
132
|
-
return ()
|
|
139
|
+
return ()=>{
|
|
133
140
|
window.removeEventListener(AI_CONTEXT_UPDATED_EVENT, handleUpdate);
|
|
134
141
|
};
|
|
135
|
-
}, [
|
|
142
|
+
}, [
|
|
143
|
+
enabled,
|
|
144
|
+
fetchContext
|
|
145
|
+
]);
|
|
136
146
|
return {
|
|
137
147
|
context,
|
|
138
148
|
loading,
|
|
@@ -140,7 +150,8 @@ export function useAiContext(options = {}) {
|
|
|
140
150
|
refetch: fetchContext,
|
|
141
151
|
create,
|
|
142
152
|
update,
|
|
143
|
-
remove
|
|
153
|
+
remove
|
|
144
154
|
};
|
|
145
155
|
}
|
|
156
|
+
|
|
146
157
|
//# sourceMappingURL=useAiContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/hooks/useAiContext.ts"],"sourcesContent":["'use client'\n\nimport { useState, useEffect, useCallback } from 'react'\nimport type { AiContext } from '../types.js'\n\n/** Event name for context updates */\nexport const AI_CONTEXT_UPDATED_EVENT = 'puck:ai-context-updated'\n\n/**\n * Dispatches an event to notify that AI context has been updated\n * Call this after creating, editing, or deleting a context entry\n */\nexport function dispatchContextUpdated(): void {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent(AI_CONTEXT_UPDATED_EVENT))\n }\n}\n\nexport interface UseAiContextOptions {\n /**\n * API endpoint to fetch context from\n * @default '/api/puck/ai-context'\n */\n apiEndpoint?: string\n /**\n * Whether to enable fetching\n * @default true\n */\n enabled?: boolean\n /**\n * Whether to include disabled entries\n * @default false\n */\n includeDisabled?: boolean\n}\n\nexport interface UseAiContextReturn {\n /** Array of context entries */\n context: AiContext[]\n /** Loading state */\n loading: boolean\n /** Error message if any */\n error: string | null\n /** Refetch context entries */\n refetch: () => Promise<void>\n /** Create a new context entry */\n create: (data: Omit<AiContext, 'id' | 'createdAt' | 'updatedAt'>) => Promise<AiContext | null>\n /** Update an existing context entry */\n update: (id: string, data: Partial<AiContext>) => Promise<AiContext | null>\n /** Delete a context entry */\n remove: (id: string) => Promise<boolean>\n}\n\n/**\n * Hook to fetch and manage AI context entries client-side\n *\n * When context is updated via the context editor panel, this hook will\n * automatically refetch to stay in sync.\n *\n * @example\n * ```tsx\n * const { context, loading, create, update, remove } = useAiContext()\n *\n * // Create a new context entry\n * await create({ name: 'Brand Guidelines', content: '...', enabled: true })\n *\n * // Update an entry\n * await update(context[0].id, { content: 'Updated content' })\n *\n * // Delete an entry\n * await remove(context[0].id)\n * ```\n */\nexport function useAiContext(options: UseAiContextOptions = {}): UseAiContextReturn {\n const {\n apiEndpoint = '/api/puck/ai-context',\n enabled = true,\n includeDisabled = false,\n } = options\n\n const [context, setContext] = useState<AiContext[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n const fetchContext = useCallback(async () => {\n if (!enabled) {\n setLoading(false)\n return\n }\n\n try {\n setLoading(true)\n setError(null)\n\n const url = includeDisabled ? `${apiEndpoint}?all=true` : apiEndpoint\n const response = await fetch(url)\n\n if (!response.ok) {\n throw new Error('Failed to fetch context')\n }\n\n const data = await response.json()\n setContext(data.docs || [])\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load context')\n setContext([])\n } finally {\n setLoading(false)\n }\n }, [apiEndpoint, enabled, includeDisabled])\n\n // Create a new context entry\n const create = useCallback(\n async (\n data: Omit<AiContext, 'id' | 'createdAt' | 'updatedAt'>\n ): Promise<AiContext | null> => {\n try {\n const response = await fetch(apiEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data),\n })\n\n if (!response.ok) {\n throw new Error('Failed to create context entry')\n }\n\n const newEntry = await response.json()\n dispatchContextUpdated()\n return newEntry\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to create context entry')\n return null\n }\n },\n [apiEndpoint]\n )\n\n // Update an existing context entry\n const update = useCallback(\n async (id: string, data: Partial<AiContext>): Promise<AiContext | null> => {\n try {\n const response = await fetch(`${apiEndpoint}/${id}`, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data),\n })\n\n if (!response.ok) {\n throw new Error('Failed to update context entry')\n }\n\n const updatedEntry = await response.json()\n dispatchContextUpdated()\n return updatedEntry\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to update context entry')\n return null\n }\n },\n [apiEndpoint]\n )\n\n // Delete a context entry\n const remove = useCallback(\n async (id: string): Promise<boolean> => {\n try {\n const response = await fetch(`${apiEndpoint}/${id}`, {\n method: 'DELETE',\n })\n\n if (!response.ok) {\n throw new Error('Failed to delete context entry')\n }\n\n dispatchContextUpdated()\n return true\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to delete context entry')\n return false\n }\n },\n [apiEndpoint]\n )\n\n // Initial fetch\n useEffect(() => {\n fetchContext()\n }, [fetchContext])\n\n // Listen for context updates\n useEffect(() => {\n if (!enabled) return\n\n const handleUpdate = () => {\n fetchContext()\n }\n\n window.addEventListener(AI_CONTEXT_UPDATED_EVENT, handleUpdate)\n return () => {\n window.removeEventListener(AI_CONTEXT_UPDATED_EVENT, handleUpdate)\n }\n }, [enabled, fetchContext])\n\n return {\n context,\n loading,\n error,\n refetch: fetchContext,\n create,\n update,\n remove,\n }\n}\n"],"names":["useState","useEffect","useCallback","AI_CONTEXT_UPDATED_EVENT","dispatchContextUpdated","window","dispatchEvent","CustomEvent","useAiContext","options","apiEndpoint","enabled","includeDisabled","context","setContext","loading","setLoading","error","setError","fetchContext","url","response","fetch","ok","Error","data","json","docs","err","message","create","method","headers","body","JSON","stringify","newEntry","update","id","updatedEntry","remove","handleUpdate","addEventListener","removeEventListener","refetch"],"mappings":"AAAA;AAEA,SAASA,QAAQ,EAAEC,SAAS,EAAEC,WAAW,QAAQ,QAAO;AAGxD,mCAAmC,GACnC,OAAO,MAAMC,2BAA2B,0BAAyB;AAEjE;;;CAGC,GACD,OAAO,SAASC;IACd,IAAI,OAAOC,WAAW,aAAa;QACjCA,OAAOC,aAAa,CAAC,IAAIC,YAAYJ;IACvC;AACF;AAqCA;;;;;;;;;;;;;;;;;;;CAmBC,GACD,OAAO,SAASK,aAAaC,UAA+B,CAAC,CAAC;IAC5D,MAAM,EACJC,cAAc,sBAAsB,EACpCC,UAAU,IAAI,EACdC,kBAAkB,KAAK,EACxB,GAAGH;IAEJ,MAAM,CAACI,SAASC,WAAW,GAAGd,SAAsB,EAAE;IACtD,MAAM,CAACe,SAASC,WAAW,GAAGhB,SAAS;IACvC,MAAM,CAACiB,OAAOC,SAAS,GAAGlB,SAAwB;IAElD,MAAMmB,eAAejB,YAAY;QAC/B,IAAI,CAACS,SAAS;YACZK,WAAW;YACX;QACF;QAEA,IAAI;YACFA,WAAW;YACXE,SAAS;YAET,MAAME,MAAMR,kBAAkB,GAAGF,YAAY,SAAS,CAAC,GAAGA;YAC1D,MAAMW,WAAW,MAAMC,MAAMF;YAE7B,IAAI,CAACC,SAASE,EAAE,EAAE;gBAChB,MAAM,IAAIC,MAAM;YAClB;YAEA,MAAMC,OAAO,MAAMJ,SAASK,IAAI;YAChCZ,WAAWW,KAAKE,IAAI,IAAI,EAAE;QAC5B,EAAE,OAAOC,KAAK;YACZV,SAASU,eAAeJ,QAAQI,IAAIC,OAAO,GAAG;YAC9Cf,WAAW,EAAE;QACf,SAAU;YACRE,WAAW;QACb;IACF,GAAG;QAACN;QAAaC;QAASC;KAAgB;IAE1C,6BAA6B;IAC7B,MAAMkB,SAAS5B,YACb,OACEuB;QAEA,IAAI;YACF,MAAMJ,WAAW,MAAMC,MAAMZ,aAAa;gBACxCqB,QAAQ;gBACRC,SAAS;oBAAE,gBAAgB;gBAAmB;gBAC9CC,MAAMC,KAAKC,SAAS,CAACV;YACvB;YAEA,IAAI,CAACJ,SAASE,EAAE,EAAE;gBAChB,MAAM,IAAIC,MAAM;YAClB;YAEA,MAAMY,WAAW,MAAMf,SAASK,IAAI;YACpCtB;YACA,OAAOgC;QACT,EAAE,OAAOR,KAAK;YACZV,SAASU,eAAeJ,QAAQI,IAAIC,OAAO,GAAG;YAC9C,OAAO;QACT;IACF,GACA;QAACnB;KAAY;IAGf,mCAAmC;IACnC,MAAM2B,SAASnC,YACb,OAAOoC,IAAYb;QACjB,IAAI;YACF,MAAMJ,WAAW,MAAMC,MAAM,GAAGZ,YAAY,CAAC,EAAE4B,IAAI,EAAE;gBACnDP,QAAQ;gBACRC,SAAS;oBAAE,gBAAgB;gBAAmB;gBAC9CC,MAAMC,KAAKC,SAAS,CAACV;YACvB;YAEA,IAAI,CAACJ,SAASE,EAAE,EAAE;gBAChB,MAAM,IAAIC,MAAM;YAClB;YAEA,MAAMe,eAAe,MAAMlB,SAASK,IAAI;YACxCtB;YACA,OAAOmC;QACT,EAAE,OAAOX,KAAK;YACZV,SAASU,eAAeJ,QAAQI,IAAIC,OAAO,GAAG;YAC9C,OAAO;QACT;IACF,GACA;QAACnB;KAAY;IAGf,yBAAyB;IACzB,MAAM8B,SAAStC,YACb,OAAOoC;QACL,IAAI;YACF,MAAMjB,WAAW,MAAMC,MAAM,GAAGZ,YAAY,CAAC,EAAE4B,IAAI,EAAE;gBACnDP,QAAQ;YACV;YAEA,IAAI,CAACV,SAASE,EAAE,EAAE;gBAChB,MAAM,IAAIC,MAAM;YAClB;YAEApB;YACA,OAAO;QACT,EAAE,OAAOwB,KAAK;YACZV,SAASU,eAAeJ,QAAQI,IAAIC,OAAO,GAAG;YAC9C,OAAO;QACT;IACF,GACA;QAACnB;KAAY;IAGf,gBAAgB;IAChBT,UAAU;QACRkB;IACF,GAAG;QAACA;KAAa;IAEjB,6BAA6B;IAC7BlB,UAAU;QACR,IAAI,CAACU,SAAS;QAEd,MAAM8B,eAAe;YACnBtB;QACF;QAEAd,OAAOqC,gBAAgB,CAACvC,0BAA0BsC;QAClD,OAAO;YACLpC,OAAOsC,mBAAmB,CAACxC,0BAA0BsC;QACvD;IACF,GAAG;QAAC9B;QAASQ;KAAa;IAE1B,OAAO;QACLN;QACAE;QACAE;QACA2B,SAASzB;QACTW;QACAO;QACAG;IACF;AACF"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { useState, useEffect, useCallback } from 'react';
|
|
3
|
-
/** Event name for prompt updates */
|
|
4
|
-
export const AI_PROMPTS_UPDATED_EVENT = 'puck:ai-prompts-updated';
|
|
3
|
+
/** Event name for prompt updates */ export const AI_PROMPTS_UPDATED_EVENT = 'puck:ai-prompts-updated';
|
|
5
4
|
/**
|
|
6
5
|
* Dispatches an event to notify that AI prompts have been updated
|
|
7
6
|
* Call this after creating, editing, or deleting a prompt
|
|
8
|
-
*/
|
|
9
|
-
export function dispatchPromptsUpdated() {
|
|
7
|
+
*/ export function dispatchPromptsUpdated() {
|
|
10
8
|
if (typeof window !== 'undefined') {
|
|
11
9
|
window.dispatchEvent(new CustomEvent(AI_PROMPTS_UPDATED_EVENT));
|
|
12
10
|
}
|
|
@@ -20,12 +18,11 @@ export function dispatchPromptsUpdated() {
|
|
|
20
18
|
* @param apiEndpoint - API endpoint to fetch prompts from
|
|
21
19
|
* @param enabled - Whether to enable fetching (default: true)
|
|
22
20
|
* @returns Object with prompts array and loading state
|
|
23
|
-
*/
|
|
24
|
-
export function useAiPrompts(apiEndpoint = '/api/puck/ai-prompts', enabled = true) {
|
|
21
|
+
*/ export function useAiPrompts(apiEndpoint = '/api/puck/ai-prompts', enabled = true) {
|
|
25
22
|
const [prompts, setPrompts] = useState([]);
|
|
26
23
|
const [loading, setLoading] = useState(true);
|
|
27
24
|
const [error, setError] = useState(null);
|
|
28
|
-
const fetchPrompts = useCallback(async ()
|
|
25
|
+
const fetchPrompts = useCallback(async ()=>{
|
|
29
26
|
if (!enabled) {
|
|
30
27
|
setLoading(false);
|
|
31
28
|
return;
|
|
@@ -39,36 +36,47 @@ export function useAiPrompts(apiEndpoint = '/api/puck/ai-prompts', enabled = tru
|
|
|
39
36
|
}
|
|
40
37
|
const data = await response.json();
|
|
41
38
|
// Transform API response to AiExamplePrompt format
|
|
42
|
-
const fetchedPrompts = (data.docs || []).map((doc)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
39
|
+
const fetchedPrompts = (data.docs || []).map((doc)=>({
|
|
40
|
+
label: doc.label,
|
|
41
|
+
prompt: doc.prompt
|
|
42
|
+
}));
|
|
46
43
|
setPrompts(fetchedPrompts);
|
|
47
|
-
}
|
|
48
|
-
catch (err) {
|
|
44
|
+
} catch (err) {
|
|
49
45
|
setError(err instanceof Error ? err.message : 'Failed to load prompts');
|
|
50
46
|
setPrompts([]);
|
|
51
|
-
}
|
|
52
|
-
finally {
|
|
47
|
+
} finally{
|
|
53
48
|
setLoading(false);
|
|
54
49
|
}
|
|
55
|
-
}, [
|
|
50
|
+
}, [
|
|
51
|
+
apiEndpoint,
|
|
52
|
+
enabled
|
|
53
|
+
]);
|
|
56
54
|
// Initial fetch
|
|
57
|
-
useEffect(()
|
|
55
|
+
useEffect(()=>{
|
|
58
56
|
fetchPrompts();
|
|
59
|
-
}, [
|
|
57
|
+
}, [
|
|
58
|
+
fetchPrompts
|
|
59
|
+
]);
|
|
60
60
|
// Listen for prompt updates
|
|
61
|
-
useEffect(()
|
|
62
|
-
if (!enabled)
|
|
63
|
-
|
|
64
|
-
const handleUpdate = () => {
|
|
61
|
+
useEffect(()=>{
|
|
62
|
+
if (!enabled) return;
|
|
63
|
+
const handleUpdate = ()=>{
|
|
65
64
|
fetchPrompts();
|
|
66
65
|
};
|
|
67
66
|
window.addEventListener(AI_PROMPTS_UPDATED_EVENT, handleUpdate);
|
|
68
|
-
return ()
|
|
67
|
+
return ()=>{
|
|
69
68
|
window.removeEventListener(AI_PROMPTS_UPDATED_EVENT, handleUpdate);
|
|
70
69
|
};
|
|
71
|
-
}, [
|
|
72
|
-
|
|
70
|
+
}, [
|
|
71
|
+
enabled,
|
|
72
|
+
fetchPrompts
|
|
73
|
+
]);
|
|
74
|
+
return {
|
|
75
|
+
prompts,
|
|
76
|
+
loading,
|
|
77
|
+
error,
|
|
78
|
+
refetch: fetchPrompts
|
|
79
|
+
};
|
|
73
80
|
}
|
|
81
|
+
|
|
74
82
|
//# sourceMappingURL=useAiPrompts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/hooks/useAiPrompts.ts"],"sourcesContent":["'use client'\n\nimport { useState, useEffect, useCallback } from 'react'\nimport type { AiExamplePrompt } from '../types.js'\n\n/** Event name for prompt updates */\nexport const AI_PROMPTS_UPDATED_EVENT = 'puck:ai-prompts-updated'\n\n/**\n * Dispatches an event to notify that AI prompts have been updated\n * Call this after creating, editing, or deleting a prompt\n */\nexport function dispatchPromptsUpdated(): void {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent(AI_PROMPTS_UPDATED_EVENT))\n }\n}\n\n/**\n * Hook to fetch AI prompts client-side with auto-refresh support\n *\n * When prompts are updated via the prompt editor panel, this hook will\n * automatically refetch to stay in sync.\n *\n * @param apiEndpoint - API endpoint to fetch prompts from\n * @param enabled - Whether to enable fetching (default: true)\n * @returns Object with prompts array and loading state\n */\nexport function useAiPrompts(\n apiEndpoint: string = '/api/puck/ai-prompts',\n enabled: boolean = true\n): {\n prompts: AiExamplePrompt[]\n loading: boolean\n error: string | null\n refetch: () => Promise<void>\n} {\n const [prompts, setPrompts] = useState<AiExamplePrompt[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n const fetchPrompts = useCallback(async () => {\n if (!enabled) {\n setLoading(false)\n return\n }\n\n try {\n setLoading(true)\n setError(null)\n\n const response = await fetch(apiEndpoint)\n\n if (!response.ok) {\n throw new Error('Failed to fetch prompts')\n }\n\n const data = await response.json()\n // Transform API response to AiExamplePrompt format\n const fetchedPrompts: AiExamplePrompt[] = (data.docs || []).map(\n (doc: { label: string; prompt: string }) => ({\n label: doc.label,\n prompt: doc.prompt,\n })\n )\n setPrompts(fetchedPrompts)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load prompts')\n setPrompts([])\n } finally {\n setLoading(false)\n }\n }, [apiEndpoint, enabled])\n\n // Initial fetch\n useEffect(() => {\n fetchPrompts()\n }, [fetchPrompts])\n\n // Listen for prompt updates\n useEffect(() => {\n if (!enabled) return\n\n const handleUpdate = () => {\n fetchPrompts()\n }\n\n window.addEventListener(AI_PROMPTS_UPDATED_EVENT, handleUpdate)\n return () => {\n window.removeEventListener(AI_PROMPTS_UPDATED_EVENT, handleUpdate)\n }\n }, [enabled, fetchPrompts])\n\n return { prompts, loading, error, refetch: fetchPrompts }\n}\n"],"names":["useState","useEffect","useCallback","AI_PROMPTS_UPDATED_EVENT","dispatchPromptsUpdated","window","dispatchEvent","CustomEvent","useAiPrompts","apiEndpoint","enabled","prompts","setPrompts","loading","setLoading","error","setError","fetchPrompts","response","fetch","ok","Error","data","json","fetchedPrompts","docs","map","doc","label","prompt","err","message","handleUpdate","addEventListener","removeEventListener","refetch"],"mappings":"AAAA;AAEA,SAASA,QAAQ,EAAEC,SAAS,EAAEC,WAAW,QAAQ,QAAO;AAGxD,kCAAkC,GAClC,OAAO,MAAMC,2BAA2B,0BAAyB;AAEjE;;;CAGC,GACD,OAAO,SAASC;IACd,IAAI,OAAOC,WAAW,aAAa;QACjCA,OAAOC,aAAa,CAAC,IAAIC,YAAYJ;IACvC;AACF;AAEA;;;;;;;;;CASC,GACD,OAAO,SAASK,aACdC,cAAsB,sBAAsB,EAC5CC,UAAmB,IAAI;IAOvB,MAAM,CAACC,SAASC,WAAW,GAAGZ,SAA4B,EAAE;IAC5D,MAAM,CAACa,SAASC,WAAW,GAAGd,SAAS;IACvC,MAAM,CAACe,OAAOC,SAAS,GAAGhB,SAAwB;IAElD,MAAMiB,eAAef,YAAY;QAC/B,IAAI,CAACQ,SAAS;YACZI,WAAW;YACX;QACF;QAEA,IAAI;YACFA,WAAW;YACXE,SAAS;YAET,MAAME,WAAW,MAAMC,MAAMV;YAE7B,IAAI,CAACS,SAASE,EAAE,EAAE;gBAChB,MAAM,IAAIC,MAAM;YAClB;YAEA,MAAMC,OAAO,MAAMJ,SAASK,IAAI;YAChC,mDAAmD;YACnD,MAAMC,iBAAoC,AAACF,CAAAA,KAAKG,IAAI,IAAI,EAAE,AAAD,EAAGC,GAAG,CAC7D,CAACC,MAA4C,CAAA;oBAC3CC,OAAOD,IAAIC,KAAK;oBAChBC,QAAQF,IAAIE,MAAM;gBACpB,CAAA;YAEFjB,WAAWY;QACb,EAAE,OAAOM,KAAK;YACZd,SAASc,eAAeT,QAAQS,IAAIC,OAAO,GAAG;YAC9CnB,WAAW,EAAE;QACf,SAAU;YACRE,WAAW;QACb;IACF,GAAG;QAACL;QAAaC;KAAQ;IAEzB,gBAAgB;IAChBT,UAAU;QACRgB;IACF,GAAG;QAACA;KAAa;IAEjB,4BAA4B;IAC5BhB,UAAU;QACR,IAAI,CAACS,SAAS;QAEd,MAAMsB,eAAe;YACnBf;QACF;QAEAZ,OAAO4B,gBAAgB,CAAC9B,0BAA0B6B;QAClD,OAAO;YACL3B,OAAO6B,mBAAmB,CAAC/B,0BAA0B6B;QACvD;IACF,GAAG;QAACtB;QAASO;KAAa;IAE1B,OAAO;QAAEN;QAASE;QAASE;QAAOoB,SAASlB;IAAa;AAC1D"}
|