@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.
Files changed (698) hide show
  1. package/README.md +15 -3
  2. package/dist/admin/EditWithPuckButton.d.ts +0 -1
  3. package/dist/admin/EditWithPuckButton.js +0 -2
  4. package/dist/admin/EditWithPuckCell.d.ts +0 -1
  5. package/dist/admin/EditWithPuckCell.js +0 -2
  6. package/dist/admin/PuckEditorView.d.ts +0 -1
  7. package/dist/admin/PuckEditorView.js +0 -2
  8. package/dist/admin/client.d.ts +0 -1
  9. package/dist/admin/client.js +0 -2
  10. package/dist/admin/generateAdminComponents.d.ts +0 -1
  11. package/dist/admin/generateAdminComponents.js +0 -2
  12. package/dist/admin/index.d.ts +0 -1
  13. package/dist/admin/index.js +0 -2
  14. package/dist/ai/collections/AiContext.d.ts +0 -1
  15. package/dist/ai/collections/AiContext.js +0 -2
  16. package/dist/ai/collections/AiPrompts.d.ts +0 -1
  17. package/dist/ai/collections/AiPrompts.js +0 -2
  18. package/dist/ai/createAiApiRoutes.d.ts +0 -1
  19. package/dist/ai/createAiApiRoutes.js +5 -4
  20. package/dist/ai/createAiGenerate.d.ts +0 -1
  21. package/dist/ai/createAiGenerate.js +5 -4
  22. package/dist/ai/createAiPlugin.d.ts +0 -1
  23. package/dist/ai/createAiPlugin.js +4 -4
  24. package/dist/ai/hooks/useAiContext.d.ts +0 -1
  25. package/dist/ai/hooks/useAiContext.js +0 -2
  26. package/dist/ai/hooks/useAiPrompts.d.ts +0 -1
  27. package/dist/ai/hooks/useAiPrompts.js +0 -2
  28. package/dist/ai/index.d.ts +0 -1
  29. package/dist/ai/index.js +0 -2
  30. package/dist/ai/plugins/ContextEditorPanel.d.ts +0 -1
  31. package/dist/ai/plugins/ContextEditorPanel.js +0 -2
  32. package/dist/ai/plugins/PromptEditorPanel.d.ts +0 -1
  33. package/dist/ai/plugins/PromptEditorPanel.js +0 -2
  34. package/dist/ai/plugins/contextEditorPlugin.d.ts +0 -1
  35. package/dist/ai/plugins/contextEditorPlugin.js +0 -2
  36. package/dist/ai/plugins/promptApiRoutes.d.ts +0 -1
  37. package/dist/ai/plugins/promptApiRoutes.js +0 -2
  38. package/dist/ai/plugins/promptEditorPlugin.d.ts +0 -1
  39. package/dist/ai/plugins/promptEditorPlugin.js +0 -2
  40. package/dist/ai/presets/componentAiDefaults.d.ts +0 -1
  41. package/dist/ai/presets/componentAiDefaults.js +0 -2
  42. package/dist/ai/presets/index.d.ts +0 -1
  43. package/dist/ai/presets/index.js +0 -2
  44. package/dist/ai/presets/instructions/interactive.d.ts +0 -1
  45. package/dist/ai/presets/instructions/interactive.js +0 -2
  46. package/dist/ai/presets/instructions/layout.d.ts +0 -1
  47. package/dist/ai/presets/instructions/layout.js +0 -2
  48. package/dist/ai/presets/instructions/media.d.ts +0 -1
  49. package/dist/ai/presets/instructions/media.js +0 -2
  50. package/dist/ai/presets/instructions/pagePatterns.d.ts +0 -1
  51. package/dist/ai/presets/instructions/pagePatterns.js +0 -2
  52. package/dist/ai/presets/instructions/schemas.d.ts +0 -1
  53. package/dist/ai/presets/instructions/schemas.js +0 -2
  54. package/dist/ai/presets/instructions/typography.d.ts +0 -1
  55. package/dist/ai/presets/instructions/typography.js +0 -2
  56. package/dist/ai/tools/index.d.ts +0 -1
  57. package/dist/ai/tools/index.js +0 -2
  58. package/dist/ai/types.d.ts +109 -3
  59. package/dist/ai/types.js +0 -2
  60. package/dist/ai/utils/injectAiConfig.d.ts +0 -1
  61. package/dist/ai/utils/injectAiConfig.js +0 -2
  62. package/dist/api/createPuckApiRoutes.d.ts +0 -1
  63. package/dist/api/createPuckApiRoutes.js +0 -2
  64. package/dist/api/createPuckApiRoutesVersions.d.ts +0 -1
  65. package/dist/api/createPuckApiRoutesVersions.js +0 -2
  66. package/dist/api/createPuckApiRoutesWithId.d.ts +0 -1
  67. package/dist/api/createPuckApiRoutesWithId.js +0 -2
  68. package/dist/api/index.d.ts +0 -1
  69. package/dist/api/index.js +0 -2
  70. package/dist/api/payload-config.d.js +1 -2
  71. package/dist/api/types.d.ts +0 -1
  72. package/dist/api/types.js +0 -2
  73. package/dist/api/utils/mapRootProps.d.ts +0 -1
  74. package/dist/api/utils/mapRootProps.js +0 -2
  75. package/dist/collections/Templates.d.ts +0 -1
  76. package/dist/collections/Templates.js +0 -2
  77. package/dist/components/AccordionClient.d.ts +0 -1
  78. package/dist/components/AccordionClient.js +0 -2
  79. package/dist/components/AnimatedWrapper.d.ts +0 -1
  80. package/dist/components/AnimatedWrapper.js +0 -2
  81. package/dist/components/exports.d.ts +0 -1
  82. package/dist/components/exports.js +0 -2
  83. package/dist/components/index.d.ts +0 -1
  84. package/dist/components/index.js +0 -2
  85. package/dist/components/interactive/Accordion.d.ts +0 -1
  86. package/dist/components/interactive/Accordion.js +0 -2
  87. package/dist/components/interactive/Accordion.server.d.ts +0 -1
  88. package/dist/components/interactive/Accordion.server.js +0 -2
  89. package/dist/components/interactive/Button.d.ts +0 -1
  90. package/dist/components/interactive/Button.js +0 -2
  91. package/dist/components/interactive/Button.server.d.ts +0 -1
  92. package/dist/components/interactive/Button.server.js +0 -2
  93. package/dist/components/interactive/Card.d.ts +0 -1
  94. package/dist/components/interactive/Card.js +0 -2
  95. package/dist/components/interactive/Card.server.d.ts +0 -1
  96. package/dist/components/interactive/Card.server.js +0 -2
  97. package/dist/components/interactive/Divider.d.ts +0 -1
  98. package/dist/components/interactive/Divider.js +0 -2
  99. package/dist/components/interactive/Divider.server.d.ts +0 -1
  100. package/dist/components/interactive/Divider.server.js +0 -2
  101. package/dist/components/interactive/index.d.ts +0 -1
  102. package/dist/components/interactive/index.js +0 -2
  103. package/dist/components/layout/Container.d.ts +0 -1
  104. package/dist/components/layout/Container.js +0 -2
  105. package/dist/components/layout/Container.server.d.ts +0 -1
  106. package/dist/components/layout/Container.server.js +0 -2
  107. package/dist/components/layout/Flex.d.ts +0 -1
  108. package/dist/components/layout/Flex.js +0 -2
  109. package/dist/components/layout/Flex.server.d.ts +0 -1
  110. package/dist/components/layout/Flex.server.js +0 -2
  111. package/dist/components/layout/Grid.d.ts +0 -1
  112. package/dist/components/layout/Grid.js +0 -2
  113. package/dist/components/layout/Grid.server.d.ts +0 -1
  114. package/dist/components/layout/Grid.server.js +0 -2
  115. package/dist/components/layout/Section.d.ts +0 -1
  116. package/dist/components/layout/Section.js +0 -2
  117. package/dist/components/layout/Section.server.d.ts +0 -1
  118. package/dist/components/layout/Section.server.js +0 -2
  119. package/dist/components/layout/Spacer.d.ts +0 -1
  120. package/dist/components/layout/Spacer.js +0 -2
  121. package/dist/components/layout/Spacer.server.d.ts +0 -1
  122. package/dist/components/layout/Spacer.server.js +0 -2
  123. package/dist/components/layout/Template.d.ts +0 -1
  124. package/dist/components/layout/Template.js +0 -2
  125. package/dist/components/layout/Template.server.d.ts +0 -1
  126. package/dist/components/layout/Template.server.js +0 -2
  127. package/dist/components/layout/index.d.ts +0 -1
  128. package/dist/components/layout/index.js +0 -2
  129. package/dist/components/media/Image.d.ts +0 -1
  130. package/dist/components/media/Image.js +0 -2
  131. package/dist/components/media/Image.server.d.ts +0 -1
  132. package/dist/components/media/Image.server.js +0 -2
  133. package/dist/components/media/index.d.ts +0 -1
  134. package/dist/components/media/index.js +0 -2
  135. package/dist/components/typography/Heading.d.ts +0 -1
  136. package/dist/components/typography/Heading.js +0 -2
  137. package/dist/components/typography/Heading.server.d.ts +0 -1
  138. package/dist/components/typography/Heading.server.js +0 -2
  139. package/dist/components/typography/RichText.editor.d.ts +0 -1
  140. package/dist/components/typography/RichText.editor.js +0 -2
  141. package/dist/components/typography/RichText.server.d.ts +0 -1
  142. package/dist/components/typography/RichText.server.js +0 -2
  143. package/dist/components/typography/Text.d.ts +0 -1
  144. package/dist/components/typography/Text.js +0 -2
  145. package/dist/components/typography/Text.server.d.ts +0 -1
  146. package/dist/components/typography/Text.server.js +0 -2
  147. package/dist/components/typography/index.d.ts +0 -1
  148. package/dist/components/typography/index.js +0 -2
  149. package/dist/config/config.editor.d.ts +0 -1
  150. package/dist/config/config.editor.js +0 -2
  151. package/dist/config/index.d.ts +0 -1
  152. package/dist/config/index.js +0 -2
  153. package/dist/config/merge.d.ts +0 -1
  154. package/dist/config/merge.js +0 -2
  155. package/dist/config/presets.d.ts +0 -1
  156. package/dist/config/presets.js +0 -2
  157. package/dist/config/types.d.ts +0 -1
  158. package/dist/config/types.js +0 -2
  159. package/dist/editor/PuckEditor.d.ts +18 -1
  160. package/dist/editor/PuckEditor.js +0 -2
  161. package/dist/editor/PuckEditorImpl.client.d.ts +10 -1
  162. package/dist/editor/PuckEditorImpl.client.js +3 -3
  163. package/dist/editor/components/DarkModeStyles.d.ts +0 -1
  164. package/dist/editor/components/DarkModeStyles.js +0 -2
  165. package/dist/editor/components/HeaderActions.d.ts +0 -1
  166. package/dist/editor/components/HeaderActions.js +0 -2
  167. package/dist/editor/components/IframeWrapper.d.ts +0 -1
  168. package/dist/editor/components/IframeWrapper.js +0 -2
  169. package/dist/editor/components/LoadingState.d.ts +0 -1
  170. package/dist/editor/components/LoadingState.js +0 -2
  171. package/dist/editor/components/PreviewModal.d.ts +0 -1
  172. package/dist/editor/components/PreviewModal.js +0 -2
  173. package/dist/editor/components/PreviewModeToggle.d.ts +0 -1
  174. package/dist/editor/components/PreviewModeToggle.js +0 -2
  175. package/dist/editor/components/VersionHistory.d.ts +0 -1
  176. package/dist/editor/components/VersionHistory.js +0 -2
  177. package/dist/editor/hooks/useDarkMode.d.ts +0 -1
  178. package/dist/editor/hooks/useDarkMode.js +0 -2
  179. package/dist/editor/hooks/useUnsavedChanges.d.ts +0 -1
  180. package/dist/editor/hooks/useUnsavedChanges.js +0 -2
  181. package/dist/editor/index.d.ts +0 -1
  182. package/dist/editor/index.js +0 -2
  183. package/dist/editor/plugins/VersionHistoryPanel.d.ts +0 -1
  184. package/dist/editor/plugins/VersionHistoryPanel.js +0 -2
  185. package/dist/editor/plugins/index.d.ts +0 -1
  186. package/dist/editor/plugins/index.js +0 -2
  187. package/dist/editor/plugins/versionHistoryPlugin.d.ts +0 -1
  188. package/dist/editor/plugins/versionHistoryPlugin.js +0 -2
  189. package/dist/editor/utils/detectPageTree.d.ts +0 -1
  190. package/dist/editor/utils/detectPageTree.js +0 -2
  191. package/dist/editor/utils/index.d.ts +0 -1
  192. package/dist/editor/utils/index.js +0 -2
  193. package/dist/editor/utils/injectPageTreeFields.d.ts +0 -1
  194. package/dist/editor/utils/injectPageTreeFields.js +0 -2
  195. package/dist/endpoints/ai.d.ts +13 -1
  196. package/dist/endpoints/ai.js +6 -3
  197. package/dist/endpoints/context.d.ts +0 -1
  198. package/dist/endpoints/context.js +0 -2
  199. package/dist/endpoints/index.d.ts +0 -1
  200. package/dist/endpoints/index.js +0 -2
  201. package/dist/endpoints/postcss.d.js +1 -2
  202. package/dist/endpoints/prompts.d.ts +0 -1
  203. package/dist/endpoints/prompts.js +0 -2
  204. package/dist/endpoints/styles.d.ts +0 -1
  205. package/dist/endpoints/styles.js +0 -2
  206. package/dist/exports/client.d.ts +0 -1
  207. package/dist/exports/client.js +0 -2
  208. package/dist/exports/rsc.d.ts +0 -1
  209. package/dist/exports/rsc.js +0 -2
  210. package/dist/fields/AlignmentField.d.ts +0 -1
  211. package/dist/fields/AlignmentField.js +0 -2
  212. package/dist/fields/AnimationField.d.ts +0 -1
  213. package/dist/fields/AnimationField.js +0 -2
  214. package/dist/fields/BackgroundField.d.ts +0 -1
  215. package/dist/fields/BackgroundField.js +0 -2
  216. package/dist/fields/BorderField.d.ts +0 -1
  217. package/dist/fields/BorderField.js +0 -2
  218. package/dist/fields/ColorPickerField.d.ts +0 -1
  219. package/dist/fields/ColorPickerField.js +0 -2
  220. package/dist/fields/ContentAlignmentField.d.ts +0 -1
  221. package/dist/fields/ContentAlignmentField.js +0 -2
  222. package/dist/fields/DimensionsField.d.ts +0 -1
  223. package/dist/fields/DimensionsField.js +0 -2
  224. package/dist/fields/FlexAlignmentField.d.ts +0 -1
  225. package/dist/fields/FlexAlignmentField.js +0 -2
  226. package/dist/fields/FolderPickerField.d.ts +0 -1
  227. package/dist/fields/FolderPickerField.js +0 -2
  228. package/dist/fields/GradientEditor.d.ts +0 -1
  229. package/dist/fields/GradientEditor.js +0 -2
  230. package/dist/fields/LockedField.d.ts +0 -1
  231. package/dist/fields/LockedField.js +0 -2
  232. package/dist/fields/MarginField.d.ts +0 -1
  233. package/dist/fields/MarginField.js +0 -2
  234. package/dist/fields/MediaField.d.ts +0 -1
  235. package/dist/fields/MediaField.js +0 -2
  236. package/dist/fields/PaddingField.d.ts +0 -1
  237. package/dist/fields/PaddingField.js +0 -2
  238. package/dist/fields/PageSegmentField.d.ts +0 -1
  239. package/dist/fields/PageSegmentField.js +0 -2
  240. package/dist/fields/ResetField.d.ts +0 -1
  241. package/dist/fields/ResetField.js +0 -2
  242. package/dist/fields/ResponsiveField.d.ts +0 -1
  243. package/dist/fields/ResponsiveField.js +0 -2
  244. package/dist/fields/ResponsiveVisibilityField.d.ts +0 -1
  245. package/dist/fields/ResponsiveVisibilityField.js +0 -2
  246. package/dist/fields/SizeField.d.ts +0 -1
  247. package/dist/fields/SizeField.js +0 -2
  248. package/dist/fields/SlugPreviewField.d.ts +0 -1
  249. package/dist/fields/SlugPreviewField.js +0 -2
  250. package/dist/fields/TemplateField.d.ts +0 -1
  251. package/dist/fields/TemplateField.js +0 -2
  252. package/dist/fields/TransformField.d.ts +0 -1
  253. package/dist/fields/TransformField.js +0 -2
  254. package/dist/fields/VerticalAlignmentField.d.ts +0 -1
  255. package/dist/fields/VerticalAlignmentField.js +0 -2
  256. package/dist/fields/WidthField.d.ts +0 -1
  257. package/dist/fields/WidthField.js +0 -2
  258. package/dist/fields/index.d.ts +0 -1
  259. package/dist/fields/index.js +0 -2
  260. package/dist/fields/richtext/controls/ColorPickerControl.d.ts +0 -1
  261. package/dist/fields/richtext/controls/ColorPickerControl.js +0 -2
  262. package/dist/fields/richtext/controls/DropdownPortal.d.ts +0 -1
  263. package/dist/fields/richtext/controls/DropdownPortal.js +0 -2
  264. package/dist/fields/richtext/controls/FontSizeControl.d.ts +0 -1
  265. package/dist/fields/richtext/controls/FontSizeControl.js +0 -2
  266. package/dist/fields/richtext/controls/HighlightControl.d.ts +0 -1
  267. package/dist/fields/richtext/controls/HighlightControl.js +0 -2
  268. package/dist/fields/richtext/controls/index.d.ts +0 -1
  269. package/dist/fields/richtext/controls/index.js +0 -2
  270. package/dist/fields/richtext/controls/shared.d.ts +0 -1
  271. package/dist/fields/richtext/controls/shared.js +0 -2
  272. package/dist/fields/richtext/createRichTextField.d.ts +0 -1
  273. package/dist/fields/richtext/createRichTextField.js +0 -2
  274. package/dist/fields/richtext/extensions/FontSize.d.ts +0 -1
  275. package/dist/fields/richtext/extensions/FontSize.js +0 -2
  276. package/dist/fields/richtext/extensions/index.d.ts +0 -1
  277. package/dist/fields/richtext/extensions/index.js +0 -2
  278. package/dist/fields/richtext/index.d.ts +0 -1
  279. package/dist/fields/richtext/index.js +0 -2
  280. package/dist/fields/shared.d.ts +0 -1
  281. package/dist/fields/shared.js +0 -2
  282. package/dist/hooks/index.d.ts +0 -1
  283. package/dist/hooks/index.js +0 -2
  284. package/dist/hooks/useResponsiveStyles.d.ts +0 -1
  285. package/dist/hooks/useResponsiveStyles.js +0 -2
  286. package/dist/hooks/useScrollAnimation.d.ts +0 -1
  287. package/dist/hooks/useScrollAnimation.js +0 -2
  288. package/dist/index.d.ts +0 -1
  289. package/dist/index.js +0 -2
  290. package/dist/layouts/LayoutWrapper.d.ts +0 -1
  291. package/dist/layouts/LayoutWrapper.js +0 -2
  292. package/dist/layouts/defaults.d.ts +0 -1
  293. package/dist/layouts/defaults.js +0 -2
  294. package/dist/layouts/index.d.ts +0 -1
  295. package/dist/layouts/index.js +0 -2
  296. package/dist/layouts/types.d.ts +0 -1
  297. package/dist/layouts/types.js +0 -2
  298. package/dist/layouts/utils.d.ts +0 -1
  299. package/dist/layouts/utils.js +0 -2
  300. package/dist/next/index.d.ts +0 -1
  301. package/dist/next/index.js +0 -2
  302. package/dist/plugin/collections/Pages.d.ts +0 -1
  303. package/dist/plugin/collections/Pages.js +0 -2
  304. package/dist/plugin/fields/index.d.ts +0 -1
  305. package/dist/plugin/fields/index.js +0 -2
  306. package/dist/plugin/fields/types.d.ts +0 -1
  307. package/dist/plugin/fields/types.js +0 -2
  308. package/dist/plugin/hooks/index.d.ts +0 -1
  309. package/dist/plugin/hooks/index.js +0 -2
  310. package/dist/plugin/hooks/isHomepageUnique.d.ts +0 -1
  311. package/dist/plugin/hooks/isHomepageUnique.js +0 -2
  312. package/dist/plugin/index.d.ts +0 -1
  313. package/dist/plugin/index.js +2 -3
  314. package/dist/render/HybridPageRenderer.d.ts +0 -1
  315. package/dist/render/HybridPageRenderer.js +0 -2
  316. package/dist/render/PageRenderer.d.ts +0 -1
  317. package/dist/render/PageRenderer.js +0 -2
  318. package/dist/render/PuckEditor.client.d.ts +0 -1
  319. package/dist/render/PuckEditor.client.js +0 -2
  320. package/dist/render/index.d.ts +0 -1
  321. package/dist/render/index.js +0 -2
  322. package/dist/theme/context.d.ts +0 -1
  323. package/dist/theme/context.js +0 -2
  324. package/dist/theme/defaults.d.ts +0 -1
  325. package/dist/theme/defaults.js +0 -2
  326. package/dist/theme/example.d.ts +0 -1
  327. package/dist/theme/example.js +0 -2
  328. package/dist/theme/index.d.ts +0 -1
  329. package/dist/theme/index.js +0 -2
  330. package/dist/theme/types.d.ts +0 -1
  331. package/dist/theme/types.js +0 -2
  332. package/dist/theme/utils.d.ts +0 -1
  333. package/dist/theme/utils.js +0 -2
  334. package/dist/types/index.d.ts +0 -1
  335. package/dist/types/index.js +0 -2
  336. package/dist/utils/index.d.ts +0 -1
  337. package/dist/utils/index.js +0 -2
  338. package/dist/utils/migration.d.ts +0 -1
  339. package/dist/utils/migration.js +0 -2
  340. package/dist/utils/validation.d.ts +0 -1
  341. package/dist/utils/validation.js +0 -2
  342. package/dist/version.d.ts +1 -2
  343. package/dist/version.js +1 -3
  344. package/dist/views/PuckConfigContext.d.ts +0 -1
  345. package/dist/views/PuckConfigContext.js +0 -2
  346. package/dist/views/PuckEditorView.d.ts +0 -1
  347. package/dist/views/PuckEditorView.js +0 -2
  348. package/dist/views/index.d.ts +0 -1
  349. package/dist/views/index.js +0 -2
  350. package/package.json +20 -20
  351. package/dist/admin/EditWithPuckButton.d.ts.map +0 -1
  352. package/dist/admin/EditWithPuckButton.js.map +0 -1
  353. package/dist/admin/EditWithPuckCell.d.ts.map +0 -1
  354. package/dist/admin/EditWithPuckCell.js.map +0 -1
  355. package/dist/admin/PuckEditorView.d.ts.map +0 -1
  356. package/dist/admin/PuckEditorView.js.map +0 -1
  357. package/dist/admin/client.d.ts.map +0 -1
  358. package/dist/admin/client.js.map +0 -1
  359. package/dist/admin/generateAdminComponents.d.ts.map +0 -1
  360. package/dist/admin/generateAdminComponents.js.map +0 -1
  361. package/dist/admin/index.d.ts.map +0 -1
  362. package/dist/admin/index.js.map +0 -1
  363. package/dist/ai/collections/AiContext.d.ts.map +0 -1
  364. package/dist/ai/collections/AiContext.js.map +0 -1
  365. package/dist/ai/collections/AiPrompts.d.ts.map +0 -1
  366. package/dist/ai/collections/AiPrompts.js.map +0 -1
  367. package/dist/ai/createAiApiRoutes.d.ts.map +0 -1
  368. package/dist/ai/createAiApiRoutes.js.map +0 -1
  369. package/dist/ai/createAiGenerate.d.ts.map +0 -1
  370. package/dist/ai/createAiGenerate.js.map +0 -1
  371. package/dist/ai/createAiPlugin.d.ts.map +0 -1
  372. package/dist/ai/createAiPlugin.js.map +0 -1
  373. package/dist/ai/hooks/useAiContext.d.ts.map +0 -1
  374. package/dist/ai/hooks/useAiContext.js.map +0 -1
  375. package/dist/ai/hooks/useAiPrompts.d.ts.map +0 -1
  376. package/dist/ai/hooks/useAiPrompts.js.map +0 -1
  377. package/dist/ai/index.d.ts.map +0 -1
  378. package/dist/ai/index.js.map +0 -1
  379. package/dist/ai/plugins/ContextEditorPanel.d.ts.map +0 -1
  380. package/dist/ai/plugins/ContextEditorPanel.js.map +0 -1
  381. package/dist/ai/plugins/PromptEditorPanel.d.ts.map +0 -1
  382. package/dist/ai/plugins/PromptEditorPanel.js.map +0 -1
  383. package/dist/ai/plugins/contextEditorPlugin.d.ts.map +0 -1
  384. package/dist/ai/plugins/contextEditorPlugin.js.map +0 -1
  385. package/dist/ai/plugins/promptApiRoutes.d.ts.map +0 -1
  386. package/dist/ai/plugins/promptApiRoutes.js.map +0 -1
  387. package/dist/ai/plugins/promptEditorPlugin.d.ts.map +0 -1
  388. package/dist/ai/plugins/promptEditorPlugin.js.map +0 -1
  389. package/dist/ai/presets/componentAiDefaults.d.ts.map +0 -1
  390. package/dist/ai/presets/componentAiDefaults.js.map +0 -1
  391. package/dist/ai/presets/index.d.ts.map +0 -1
  392. package/dist/ai/presets/index.js.map +0 -1
  393. package/dist/ai/presets/instructions/interactive.d.ts.map +0 -1
  394. package/dist/ai/presets/instructions/interactive.js.map +0 -1
  395. package/dist/ai/presets/instructions/layout.d.ts.map +0 -1
  396. package/dist/ai/presets/instructions/layout.js.map +0 -1
  397. package/dist/ai/presets/instructions/media.d.ts.map +0 -1
  398. package/dist/ai/presets/instructions/media.js.map +0 -1
  399. package/dist/ai/presets/instructions/pagePatterns.d.ts.map +0 -1
  400. package/dist/ai/presets/instructions/pagePatterns.js.map +0 -1
  401. package/dist/ai/presets/instructions/schemas.d.ts.map +0 -1
  402. package/dist/ai/presets/instructions/schemas.js.map +0 -1
  403. package/dist/ai/presets/instructions/typography.d.ts.map +0 -1
  404. package/dist/ai/presets/instructions/typography.js.map +0 -1
  405. package/dist/ai/tools/index.d.ts.map +0 -1
  406. package/dist/ai/tools/index.js.map +0 -1
  407. package/dist/ai/types.d.ts.map +0 -1
  408. package/dist/ai/types.js.map +0 -1
  409. package/dist/ai/utils/injectAiConfig.d.ts.map +0 -1
  410. package/dist/ai/utils/injectAiConfig.js.map +0 -1
  411. package/dist/api/createPuckApiRoutes.d.ts.map +0 -1
  412. package/dist/api/createPuckApiRoutes.js.map +0 -1
  413. package/dist/api/createPuckApiRoutesVersions.d.ts.map +0 -1
  414. package/dist/api/createPuckApiRoutesVersions.js.map +0 -1
  415. package/dist/api/createPuckApiRoutesWithId.d.ts.map +0 -1
  416. package/dist/api/createPuckApiRoutesWithId.js.map +0 -1
  417. package/dist/api/index.d.ts.map +0 -1
  418. package/dist/api/index.js.map +0 -1
  419. package/dist/api/payload-config.d.js.map +0 -1
  420. package/dist/api/types.d.ts.map +0 -1
  421. package/dist/api/types.js.map +0 -1
  422. package/dist/api/utils/mapRootProps.d.ts.map +0 -1
  423. package/dist/api/utils/mapRootProps.js.map +0 -1
  424. package/dist/collections/Templates.d.ts.map +0 -1
  425. package/dist/collections/Templates.js.map +0 -1
  426. package/dist/components/AccordionClient.d.ts.map +0 -1
  427. package/dist/components/AccordionClient.js.map +0 -1
  428. package/dist/components/AnimatedWrapper.d.ts.map +0 -1
  429. package/dist/components/AnimatedWrapper.js.map +0 -1
  430. package/dist/components/exports.d.ts.map +0 -1
  431. package/dist/components/exports.js.map +0 -1
  432. package/dist/components/index.d.ts.map +0 -1
  433. package/dist/components/index.js.map +0 -1
  434. package/dist/components/interactive/Accordion.d.ts.map +0 -1
  435. package/dist/components/interactive/Accordion.js.map +0 -1
  436. package/dist/components/interactive/Accordion.server.d.ts.map +0 -1
  437. package/dist/components/interactive/Accordion.server.js.map +0 -1
  438. package/dist/components/interactive/Button.d.ts.map +0 -1
  439. package/dist/components/interactive/Button.js.map +0 -1
  440. package/dist/components/interactive/Button.server.d.ts.map +0 -1
  441. package/dist/components/interactive/Button.server.js.map +0 -1
  442. package/dist/components/interactive/Card.d.ts.map +0 -1
  443. package/dist/components/interactive/Card.js.map +0 -1
  444. package/dist/components/interactive/Card.server.d.ts.map +0 -1
  445. package/dist/components/interactive/Card.server.js.map +0 -1
  446. package/dist/components/interactive/Divider.d.ts.map +0 -1
  447. package/dist/components/interactive/Divider.js.map +0 -1
  448. package/dist/components/interactive/Divider.server.d.ts.map +0 -1
  449. package/dist/components/interactive/Divider.server.js.map +0 -1
  450. package/dist/components/interactive/index.d.ts.map +0 -1
  451. package/dist/components/interactive/index.js.map +0 -1
  452. package/dist/components/layout/Container.d.ts.map +0 -1
  453. package/dist/components/layout/Container.js.map +0 -1
  454. package/dist/components/layout/Container.server.d.ts.map +0 -1
  455. package/dist/components/layout/Container.server.js.map +0 -1
  456. package/dist/components/layout/Flex.d.ts.map +0 -1
  457. package/dist/components/layout/Flex.js.map +0 -1
  458. package/dist/components/layout/Flex.server.d.ts.map +0 -1
  459. package/dist/components/layout/Flex.server.js.map +0 -1
  460. package/dist/components/layout/Grid.d.ts.map +0 -1
  461. package/dist/components/layout/Grid.js.map +0 -1
  462. package/dist/components/layout/Grid.server.d.ts.map +0 -1
  463. package/dist/components/layout/Grid.server.js.map +0 -1
  464. package/dist/components/layout/Section.d.ts.map +0 -1
  465. package/dist/components/layout/Section.js.map +0 -1
  466. package/dist/components/layout/Section.server.d.ts.map +0 -1
  467. package/dist/components/layout/Section.server.js.map +0 -1
  468. package/dist/components/layout/Spacer.d.ts.map +0 -1
  469. package/dist/components/layout/Spacer.js.map +0 -1
  470. package/dist/components/layout/Spacer.server.d.ts.map +0 -1
  471. package/dist/components/layout/Spacer.server.js.map +0 -1
  472. package/dist/components/layout/Template.d.ts.map +0 -1
  473. package/dist/components/layout/Template.js.map +0 -1
  474. package/dist/components/layout/Template.server.d.ts.map +0 -1
  475. package/dist/components/layout/Template.server.js.map +0 -1
  476. package/dist/components/layout/index.d.ts.map +0 -1
  477. package/dist/components/layout/index.js.map +0 -1
  478. package/dist/components/media/Image.d.ts.map +0 -1
  479. package/dist/components/media/Image.js.map +0 -1
  480. package/dist/components/media/Image.server.d.ts.map +0 -1
  481. package/dist/components/media/Image.server.js.map +0 -1
  482. package/dist/components/media/index.d.ts.map +0 -1
  483. package/dist/components/media/index.js.map +0 -1
  484. package/dist/components/typography/Heading.d.ts.map +0 -1
  485. package/dist/components/typography/Heading.js.map +0 -1
  486. package/dist/components/typography/Heading.server.d.ts.map +0 -1
  487. package/dist/components/typography/Heading.server.js.map +0 -1
  488. package/dist/components/typography/RichText.editor.d.ts.map +0 -1
  489. package/dist/components/typography/RichText.editor.js.map +0 -1
  490. package/dist/components/typography/RichText.server.d.ts.map +0 -1
  491. package/dist/components/typography/RichText.server.js.map +0 -1
  492. package/dist/components/typography/Text.d.ts.map +0 -1
  493. package/dist/components/typography/Text.js.map +0 -1
  494. package/dist/components/typography/Text.server.d.ts.map +0 -1
  495. package/dist/components/typography/Text.server.js.map +0 -1
  496. package/dist/components/typography/index.d.ts.map +0 -1
  497. package/dist/components/typography/index.js.map +0 -1
  498. package/dist/config/config.editor.d.ts.map +0 -1
  499. package/dist/config/config.editor.js.map +0 -1
  500. package/dist/config/index.d.ts.map +0 -1
  501. package/dist/config/index.js.map +0 -1
  502. package/dist/config/merge.d.ts.map +0 -1
  503. package/dist/config/merge.js.map +0 -1
  504. package/dist/config/presets.d.ts.map +0 -1
  505. package/dist/config/presets.js.map +0 -1
  506. package/dist/config/types.d.ts.map +0 -1
  507. package/dist/config/types.js.map +0 -1
  508. package/dist/editor/PuckEditor.d.ts.map +0 -1
  509. package/dist/editor/PuckEditor.js.map +0 -1
  510. package/dist/editor/PuckEditorImpl.client.d.ts.map +0 -1
  511. package/dist/editor/PuckEditorImpl.client.js.map +0 -1
  512. package/dist/editor/components/DarkModeStyles.d.ts.map +0 -1
  513. package/dist/editor/components/DarkModeStyles.js.map +0 -1
  514. package/dist/editor/components/HeaderActions.d.ts.map +0 -1
  515. package/dist/editor/components/HeaderActions.js.map +0 -1
  516. package/dist/editor/components/IframeWrapper.d.ts.map +0 -1
  517. package/dist/editor/components/IframeWrapper.js.map +0 -1
  518. package/dist/editor/components/LoadingState.d.ts.map +0 -1
  519. package/dist/editor/components/LoadingState.js.map +0 -1
  520. package/dist/editor/components/PreviewModal.d.ts.map +0 -1
  521. package/dist/editor/components/PreviewModal.js.map +0 -1
  522. package/dist/editor/components/PreviewModeToggle.d.ts.map +0 -1
  523. package/dist/editor/components/PreviewModeToggle.js.map +0 -1
  524. package/dist/editor/components/VersionHistory.d.ts.map +0 -1
  525. package/dist/editor/components/VersionHistory.js.map +0 -1
  526. package/dist/editor/hooks/useDarkMode.d.ts.map +0 -1
  527. package/dist/editor/hooks/useDarkMode.js.map +0 -1
  528. package/dist/editor/hooks/useUnsavedChanges.d.ts.map +0 -1
  529. package/dist/editor/hooks/useUnsavedChanges.js.map +0 -1
  530. package/dist/editor/index.d.ts.map +0 -1
  531. package/dist/editor/index.js.map +0 -1
  532. package/dist/editor/plugins/VersionHistoryPanel.d.ts.map +0 -1
  533. package/dist/editor/plugins/VersionHistoryPanel.js.map +0 -1
  534. package/dist/editor/plugins/index.d.ts.map +0 -1
  535. package/dist/editor/plugins/index.js.map +0 -1
  536. package/dist/editor/plugins/versionHistoryPlugin.d.ts.map +0 -1
  537. package/dist/editor/plugins/versionHistoryPlugin.js.map +0 -1
  538. package/dist/editor/utils/detectPageTree.d.ts.map +0 -1
  539. package/dist/editor/utils/detectPageTree.js.map +0 -1
  540. package/dist/editor/utils/index.d.ts.map +0 -1
  541. package/dist/editor/utils/index.js.map +0 -1
  542. package/dist/editor/utils/injectPageTreeFields.d.ts.map +0 -1
  543. package/dist/editor/utils/injectPageTreeFields.js.map +0 -1
  544. package/dist/endpoints/ai.d.ts.map +0 -1
  545. package/dist/endpoints/ai.js.map +0 -1
  546. package/dist/endpoints/context.d.ts.map +0 -1
  547. package/dist/endpoints/context.js.map +0 -1
  548. package/dist/endpoints/index.d.ts.map +0 -1
  549. package/dist/endpoints/index.js.map +0 -1
  550. package/dist/endpoints/postcss.d.js.map +0 -1
  551. package/dist/endpoints/prompts.d.ts.map +0 -1
  552. package/dist/endpoints/prompts.js.map +0 -1
  553. package/dist/endpoints/styles.d.ts.map +0 -1
  554. package/dist/endpoints/styles.js.map +0 -1
  555. package/dist/exports/client.d.ts.map +0 -1
  556. package/dist/exports/client.js.map +0 -1
  557. package/dist/exports/rsc.d.ts.map +0 -1
  558. package/dist/exports/rsc.js.map +0 -1
  559. package/dist/fields/AlignmentField.d.ts.map +0 -1
  560. package/dist/fields/AlignmentField.js.map +0 -1
  561. package/dist/fields/AnimationField.d.ts.map +0 -1
  562. package/dist/fields/AnimationField.js.map +0 -1
  563. package/dist/fields/BackgroundField.d.ts.map +0 -1
  564. package/dist/fields/BackgroundField.js.map +0 -1
  565. package/dist/fields/BorderField.d.ts.map +0 -1
  566. package/dist/fields/BorderField.js.map +0 -1
  567. package/dist/fields/ColorPickerField.d.ts.map +0 -1
  568. package/dist/fields/ColorPickerField.js.map +0 -1
  569. package/dist/fields/ContentAlignmentField.d.ts.map +0 -1
  570. package/dist/fields/ContentAlignmentField.js.map +0 -1
  571. package/dist/fields/DimensionsField.d.ts.map +0 -1
  572. package/dist/fields/DimensionsField.js.map +0 -1
  573. package/dist/fields/FlexAlignmentField.d.ts.map +0 -1
  574. package/dist/fields/FlexAlignmentField.js.map +0 -1
  575. package/dist/fields/FolderPickerField.d.ts.map +0 -1
  576. package/dist/fields/FolderPickerField.js.map +0 -1
  577. package/dist/fields/GradientEditor.d.ts.map +0 -1
  578. package/dist/fields/GradientEditor.js.map +0 -1
  579. package/dist/fields/LockedField.d.ts.map +0 -1
  580. package/dist/fields/LockedField.js.map +0 -1
  581. package/dist/fields/MarginField.d.ts.map +0 -1
  582. package/dist/fields/MarginField.js.map +0 -1
  583. package/dist/fields/MediaField.d.ts.map +0 -1
  584. package/dist/fields/MediaField.js.map +0 -1
  585. package/dist/fields/PaddingField.d.ts.map +0 -1
  586. package/dist/fields/PaddingField.js.map +0 -1
  587. package/dist/fields/PageSegmentField.d.ts.map +0 -1
  588. package/dist/fields/PageSegmentField.js.map +0 -1
  589. package/dist/fields/ResetField.d.ts.map +0 -1
  590. package/dist/fields/ResetField.js.map +0 -1
  591. package/dist/fields/ResponsiveField.d.ts.map +0 -1
  592. package/dist/fields/ResponsiveField.js.map +0 -1
  593. package/dist/fields/ResponsiveVisibilityField.d.ts.map +0 -1
  594. package/dist/fields/ResponsiveVisibilityField.js.map +0 -1
  595. package/dist/fields/SizeField.d.ts.map +0 -1
  596. package/dist/fields/SizeField.js.map +0 -1
  597. package/dist/fields/SlugPreviewField.d.ts.map +0 -1
  598. package/dist/fields/SlugPreviewField.js.map +0 -1
  599. package/dist/fields/TemplateField.d.ts.map +0 -1
  600. package/dist/fields/TemplateField.js.map +0 -1
  601. package/dist/fields/TransformField.d.ts.map +0 -1
  602. package/dist/fields/TransformField.js.map +0 -1
  603. package/dist/fields/VerticalAlignmentField.d.ts.map +0 -1
  604. package/dist/fields/VerticalAlignmentField.js.map +0 -1
  605. package/dist/fields/WidthField.d.ts.map +0 -1
  606. package/dist/fields/WidthField.js.map +0 -1
  607. package/dist/fields/index.d.ts.map +0 -1
  608. package/dist/fields/index.js.map +0 -1
  609. package/dist/fields/richtext/controls/ColorPickerControl.d.ts.map +0 -1
  610. package/dist/fields/richtext/controls/ColorPickerControl.js.map +0 -1
  611. package/dist/fields/richtext/controls/DropdownPortal.d.ts.map +0 -1
  612. package/dist/fields/richtext/controls/DropdownPortal.js.map +0 -1
  613. package/dist/fields/richtext/controls/FontSizeControl.d.ts.map +0 -1
  614. package/dist/fields/richtext/controls/FontSizeControl.js.map +0 -1
  615. package/dist/fields/richtext/controls/HighlightControl.d.ts.map +0 -1
  616. package/dist/fields/richtext/controls/HighlightControl.js.map +0 -1
  617. package/dist/fields/richtext/controls/index.d.ts.map +0 -1
  618. package/dist/fields/richtext/controls/index.js.map +0 -1
  619. package/dist/fields/richtext/controls/shared.d.ts.map +0 -1
  620. package/dist/fields/richtext/controls/shared.js.map +0 -1
  621. package/dist/fields/richtext/createRichTextField.d.ts.map +0 -1
  622. package/dist/fields/richtext/createRichTextField.js.map +0 -1
  623. package/dist/fields/richtext/extensions/FontSize.d.ts.map +0 -1
  624. package/dist/fields/richtext/extensions/FontSize.js.map +0 -1
  625. package/dist/fields/richtext/extensions/index.d.ts.map +0 -1
  626. package/dist/fields/richtext/extensions/index.js.map +0 -1
  627. package/dist/fields/richtext/index.d.ts.map +0 -1
  628. package/dist/fields/richtext/index.js.map +0 -1
  629. package/dist/fields/shared.d.ts.map +0 -1
  630. package/dist/fields/shared.js.map +0 -1
  631. package/dist/hooks/index.d.ts.map +0 -1
  632. package/dist/hooks/index.js.map +0 -1
  633. package/dist/hooks/useResponsiveStyles.d.ts.map +0 -1
  634. package/dist/hooks/useResponsiveStyles.js.map +0 -1
  635. package/dist/hooks/useScrollAnimation.d.ts.map +0 -1
  636. package/dist/hooks/useScrollAnimation.js.map +0 -1
  637. package/dist/index.d.ts.map +0 -1
  638. package/dist/index.js.map +0 -1
  639. package/dist/layouts/LayoutWrapper.d.ts.map +0 -1
  640. package/dist/layouts/LayoutWrapper.js.map +0 -1
  641. package/dist/layouts/defaults.d.ts.map +0 -1
  642. package/dist/layouts/defaults.js.map +0 -1
  643. package/dist/layouts/index.d.ts.map +0 -1
  644. package/dist/layouts/index.js.map +0 -1
  645. package/dist/layouts/types.d.ts.map +0 -1
  646. package/dist/layouts/types.js.map +0 -1
  647. package/dist/layouts/utils.d.ts.map +0 -1
  648. package/dist/layouts/utils.js.map +0 -1
  649. package/dist/next/index.d.ts.map +0 -1
  650. package/dist/next/index.js.map +0 -1
  651. package/dist/plugin/collections/Pages.d.ts.map +0 -1
  652. package/dist/plugin/collections/Pages.js.map +0 -1
  653. package/dist/plugin/fields/index.d.ts.map +0 -1
  654. package/dist/plugin/fields/index.js.map +0 -1
  655. package/dist/plugin/fields/types.d.ts.map +0 -1
  656. package/dist/plugin/fields/types.js.map +0 -1
  657. package/dist/plugin/hooks/index.d.ts.map +0 -1
  658. package/dist/plugin/hooks/index.js.map +0 -1
  659. package/dist/plugin/hooks/isHomepageUnique.d.ts.map +0 -1
  660. package/dist/plugin/hooks/isHomepageUnique.js.map +0 -1
  661. package/dist/plugin/index.d.ts.map +0 -1
  662. package/dist/plugin/index.js.map +0 -1
  663. package/dist/render/HybridPageRenderer.d.ts.map +0 -1
  664. package/dist/render/HybridPageRenderer.js.map +0 -1
  665. package/dist/render/PageRenderer.d.ts.map +0 -1
  666. package/dist/render/PageRenderer.js.map +0 -1
  667. package/dist/render/PuckEditor.client.d.ts.map +0 -1
  668. package/dist/render/PuckEditor.client.js.map +0 -1
  669. package/dist/render/index.d.ts.map +0 -1
  670. package/dist/render/index.js.map +0 -1
  671. package/dist/theme/context.d.ts.map +0 -1
  672. package/dist/theme/context.js.map +0 -1
  673. package/dist/theme/defaults.d.ts.map +0 -1
  674. package/dist/theme/defaults.js.map +0 -1
  675. package/dist/theme/example.d.ts.map +0 -1
  676. package/dist/theme/example.js.map +0 -1
  677. package/dist/theme/index.d.ts.map +0 -1
  678. package/dist/theme/index.js.map +0 -1
  679. package/dist/theme/types.d.ts.map +0 -1
  680. package/dist/theme/types.js.map +0 -1
  681. package/dist/theme/utils.d.ts.map +0 -1
  682. package/dist/theme/utils.js.map +0 -1
  683. package/dist/types/index.d.ts.map +0 -1
  684. package/dist/types/index.js.map +0 -1
  685. package/dist/utils/index.d.ts.map +0 -1
  686. package/dist/utils/index.js.map +0 -1
  687. package/dist/utils/migration.d.ts.map +0 -1
  688. package/dist/utils/migration.js.map +0 -1
  689. package/dist/utils/validation.d.ts.map +0 -1
  690. package/dist/utils/validation.js.map +0 -1
  691. package/dist/version.d.ts.map +0 -1
  692. package/dist/version.js.map +0 -1
  693. package/dist/views/PuckConfigContext.d.ts.map +0 -1
  694. package/dist/views/PuckConfigContext.js.map +0 -1
  695. package/dist/views/PuckEditorView.d.ts.map +0 -1
  696. package/dist/views/PuckEditorView.js.map +0 -1
  697. package/dist/views/index.d.ts.map +0 -1
  698. package/dist/views/index.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/ai/types.ts"],"sourcesContent":["import type { NextRequest } from 'next/server'\nimport type { Config as PuckConfig, Data as PuckData } from '@puckeditor/core'\nimport type { SanitizedConfig } from 'payload'\nimport type { PuckApiAuthHooks, AuthenticatedUser } from '../api/types.js'\n\n// =============================================================================\n// AI Tool Types\n// =============================================================================\n\n/**\n * Tool definition for AI agent\n *\n * Tools enable the AI to query your system for information,\n * executing functions directly on your server.\n *\n * @example\n * ```typescript\n * import { z } from 'zod'\n *\n * const getProducts: AiTool = {\n * description: 'Get a list of products',\n * inputSchema: z.object({\n * category: z.enum(['consumer', 'business']),\n * }),\n * execute: async ({ category }) => {\n * return await payload.find({ collection: 'products', where: { category } })\n * },\n * }\n * ```\n */\n/**\n * Context passed to tool execution\n * Contains the Payload instance for database operations\n */\nexport interface AiToolContext {\n /**\n * Payload CMS instance for database operations\n */\n payload: import('payload').Payload\n /**\n * The authenticated user making the request\n */\n user?: import('payload').User\n}\n\nexport interface AiTool<TInput = unknown, TOutput = unknown> {\n /**\n * A description that the agent will use to understand how to use this tool\n */\n description: string\n /**\n * The shape of the parameters provided to the execute function.\n * Must be a Zod object schema.\n */\n inputSchema: import('zod').ZodObject<any>\n /**\n * The execution function for the tool.\n * Will receive parameters provided by the agent that match the inputSchema.\n * The second parameter is optional execution context containing the Payload instance\n * (available when using createPuckPlugin with auto-registered endpoints).\n */\n execute: (params: TInput, context?: AiToolContext) => Promise<TOutput> | TOutput\n /**\n * Optional name for the tool\n */\n name?: string\n}\n\n// =============================================================================\n// AI Configuration Types\n// =============================================================================\n\n/**\n * AI-specific configuration options for the server-side handler\n */\nexport interface AiOptions {\n /**\n * System context and instructions for the AI agent.\n * Guides the AI's behavior and output.\n *\n * @example\n * ```typescript\n * context: `## Overview\n * We are Google. You help us build Google landing pages.\n *\n * ## Brand Guidelines\n * Our brand colors are:\n * - #4285F4 (primary)\n * - #DB4437\n *\n * ## Tone of Voice\n * - American English\n * - Professional but friendly`\n * ```\n */\n context?: string\n /**\n * Custom tools that enable the AI to execute server-side functions.\n * Tools allow the agent to query your database, fetch external data, etc.\n */\n tools?: Record<string, AiTool>\n /**\n * Custom Puck Cloud API key.\n * Defaults to PUCK_API_KEY environment variable.\n */\n apiKey?: string\n /**\n * Custom Puck Cloud host URL\n */\n host?: string\n}\n\n// =============================================================================\n// AI Field Configuration\n// =============================================================================\n\n/**\n * AI configuration for a Puck field\n *\n * Add to any field's configuration to control how the AI generates content for it.\n *\n * @example\n * ```typescript\n * fields: {\n * title: {\n * type: 'text',\n * ai: {\n * instructions: 'Always use sentence case',\n * required: true,\n * },\n * },\n * }\n * ```\n */\nexport interface AiFieldConfig {\n /**\n * Instructions for the AI when generating this field's value\n */\n instructions?: string\n /**\n * Whether this field is required for AI generation\n * (even if not present in defaultProps)\n */\n required?: boolean\n /**\n * Exclude this field from AI generation.\n * Useful for fields like media library references that AI can't populate.\n */\n exclude?: boolean\n /**\n * Custom JSON schema for the field.\n * Required for 'custom', 'external', or user-defined fields\n * where Puck AI cannot automatically infer the schema.\n */\n schema?: {\n type: string\n [key: string]: unknown\n }\n}\n\n/**\n * AI configuration for a Puck component\n *\n * @example\n * ```typescript\n * const HeadingConfig = {\n * ai: {\n * instructions: 'Always place this at the top of sections',\n * },\n * fields: { ... },\n * render: ({ title }) => <h1>{title}</h1>,\n * }\n * ```\n */\nexport interface AiComponentConfig {\n /**\n * Instructions for the AI when using this component\n */\n instructions?: string\n /**\n * Custom JSON schema for the entire component.\n * For when Puck can't infer from fields.\n */\n schema?: {\n type: 'object'\n parameters: Record<string, { type: string; [key: string]: unknown }>\n required?: string[]\n }\n}\n\n// =============================================================================\n// API Routes Configuration\n// =============================================================================\n\n/**\n * Configuration for Puck AI API routes\n *\n * @example\n * ```typescript\n * // app/api/puck/[...all]/route.ts\n * import { createPuckAiApiRoutes } from '@delmaredigital/payload-puck/ai'\n *\n * export const POST = createPuckAiApiRoutes({\n * payloadConfig: config,\n * auth: {\n * authenticate: async (request) => {\n * // Your auth implementation\n * },\n * },\n * ai: {\n * context: 'We are Acme Corp. You build our landing pages.',\n * },\n * })\n * ```\n */\nexport interface PuckAiRoutesConfig {\n /**\n * Payload configuration - import from @payload-config\n */\n payloadConfig: Promise<SanitizedConfig>\n /**\n * Authentication hooks (reuses existing pattern from API routes)\n */\n auth: PuckApiAuthHooks\n /**\n * AI-specific options\n */\n ai?: AiOptions\n /**\n * Custom error handler for logging/monitoring\n */\n onError?: (error: unknown, context: { operation: string; request: NextRequest }) => void\n}\n\n/**\n * Route handlers returned by createPuckAiApiRoutes\n */\nexport interface PuckAiRouteHandlers {\n POST: (request: NextRequest) => Promise<Response>\n}\n\n// =============================================================================\n// Headless Generation Configuration\n// =============================================================================\n\n/**\n * Configuration for headless AI page generation\n *\n * @example\n * ```typescript\n * const generatePage = createAiGenerate({\n * payloadConfig: config,\n * auth: { authenticate: async (req) => ... },\n * ai: { context: 'We are Acme Corp...' },\n * })\n *\n * const pageData = await generatePage({\n * prompt: 'Create a landing page for our new product',\n * puckConfig: editorConfig,\n * })\n * ```\n */\nexport interface AiGenerateConfig {\n /**\n * Payload configuration - import from @payload-config\n */\n payloadConfig: Promise<SanitizedConfig>\n /**\n * Authentication hooks\n */\n auth: PuckApiAuthHooks\n /**\n * AI-specific options\n */\n ai?: AiOptions\n}\n\n/**\n * Options for a single generation request\n */\nexport interface AiGenerateOptions {\n /**\n * Natural language prompt for generation\n */\n prompt: string\n /**\n * The Puck configuration with component definitions\n */\n puckConfig: PuckConfig\n /**\n * Optional authenticated user for the generation\n */\n user?: AuthenticatedUser\n /**\n * Existing Puck data to consider when actioning the prompt.\n * Use this to update an existing page rather than create from scratch.\n */\n pageData?: PuckData\n}\n\n/**\n * Function returned by createAiGenerate\n */\nexport type AiGenerateFunction = (options: AiGenerateOptions) => Promise<PuckData>\n\n// =============================================================================\n// Client Plugin Configuration\n// =============================================================================\n\n/**\n * Example prompt for the AI chat interface\n */\nexport interface AiExamplePrompt {\n /**\n * Display label for the prompt\n */\n label: string\n /**\n * The actual prompt text\n */\n prompt: string\n}\n\n/**\n * Configuration options for the AI plugin\n *\n * @example\n * ```typescript\n * const aiPlugin = createAiPlugin({\n * host: '/api/puck',\n * examplePrompts: [\n * { label: 'Landing page', prompt: 'Create a landing page about dogs' },\n * ],\n * })\n * ```\n */\nexport interface AiPluginOptions {\n /**\n * API host for AI requests.\n * @default '/api/puck'\n */\n host?: string\n /**\n * Example prompts to show in the chat interface.\n * Users can click these to quickly send common prompts.\n */\n examplePrompts?: AiExamplePrompt[]\n /**\n * Callback when user submits a prompt\n */\n onSubmit?: (prompt: string) => void\n}\n\n// =============================================================================\n// Config Injection Types\n// =============================================================================\n\n/**\n * AI configuration overrides for components\n *\n * Used with injectAiConfig to add AI metadata to existing component configs.\n *\n * @example\n * ```typescript\n * const overrides: ComponentAiOverrides = {\n * Heading: {\n * ai: {\n * instructions: 'Use for section titles',\n * },\n * fields: {\n * text: {\n * ai: { required: true },\n * },\n * },\n * },\n * }\n * ```\n */\nexport interface ComponentAiOverrides {\n [componentName: string]: {\n ai?: AiComponentConfig\n fields?: {\n [fieldName: string]: {\n ai?: AiFieldConfig\n }\n }\n }\n}\n\n// =============================================================================\n// Prompt Editor Plugin Types\n// =============================================================================\n\n/**\n * A stored AI prompt from the database\n */\nexport interface AiPrompt {\n id: string\n label: string\n prompt: string\n category?: string\n order?: number\n createdAt: string\n updatedAt: string\n}\n\n/**\n * A stored AI context entry from the database\n */\nexport interface AiContext {\n id: string\n name: string\n content: string\n category?: 'brand' | 'tone' | 'product' | 'industry' | 'technical' | 'patterns' | 'other'\n enabled: boolean\n order?: number\n createdAt: string\n updatedAt: string\n}\n\n/**\n * Configuration for the prompt editor plugin\n */\nexport interface PromptEditorPluginOptions {\n /**\n * API endpoint for prompt CRUD operations\n * @default '/api/puck/ai-prompts'\n */\n apiEndpoint?: string\n /**\n * Whether users can edit prompts in the panel\n * @default true\n */\n canEdit?: boolean\n /**\n * Whether to show the create button\n * @default true\n */\n canCreate?: boolean\n /**\n * Whether to show delete buttons\n * @default true\n */\n canDelete?: boolean\n}\n\n/**\n * Configuration for the context editor plugin\n */\nexport interface ContextEditorPluginOptions {\n /**\n * API endpoint for context CRUD operations\n * @default '/api/puck/ai-context'\n */\n apiEndpoint?: string\n /**\n * Whether users can edit context in the panel\n * @default true\n */\n canEdit?: boolean\n /**\n * Whether to show the create button\n * @default true\n */\n canCreate?: boolean\n /**\n * Whether to show delete buttons\n * @default true\n */\n canDelete?: boolean\n}\n\n// =============================================================================\n// Plugin System Integration Types\n// =============================================================================\n\n/**\n * AI configuration for createPuckPlugin\n */\nexport interface PuckPluginAiConfig {\n /**\n * Enable AI features\n * @default false\n */\n enabled?: boolean\n /**\n * System context for the AI agent\n */\n context?: string\n /**\n * Custom tools that enable the AI to execute server-side functions.\n * Tools allow the agent to query your database, fetch external data, etc.\n *\n * @example\n * ```typescript\n * import { z } from 'zod'\n *\n * createPuckPlugin({\n * ai: {\n * enabled: true,\n * tools: {\n * getProducts: {\n * description: 'Get products from the database',\n * inputSchema: z.object({ category: z.string() }),\n * execute: async ({ category }) => {\n * return await payload.find({ collection: 'products', where: { category } })\n * },\n * },\n * },\n * },\n * })\n * ```\n */\n tools?: Record<string, AiTool>\n /**\n * Example prompts for the chat interface\n */\n examplePrompts?: AiExamplePrompt[]\n /**\n * Auto-create puck-ai-prompts collection for storing prompts\n * @default false\n */\n promptsCollection?: boolean\n /**\n * Auto-create puck-ai-context collection for dynamic business context.\n * When enabled, context entries can be managed via Payload admin and\n * the Context Editor panel in the Puck editor.\n * @default false\n */\n contextCollection?: boolean\n /**\n * Custom component AI instructions to override or extend defaults.\n * When AI is enabled, built-in component instructions are auto-applied.\n * Use this to customize instructions for your brand/use case.\n *\n * @example\n * ```typescript\n * createPuckPlugin({\n * ai: {\n * enabled: true,\n * componentInstructions: {\n * Heading: {\n * ai: { instructions: 'Use our brand voice: professional but approachable' },\n * fields: {\n * text: { ai: { instructions: 'Keep under 8 words' } },\n * },\n * },\n * },\n * },\n * })\n * ```\n */\n componentInstructions?: ComponentAiOverrides\n}\n"],"names":[],"mappings":"AAwdA,gFAAgF;AAChF,kCAAkC;AAClC,gFAAgF;AAEhF;;CAEC,GACD,WA0EC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"injectAiConfig.d.ts","sourceRoot":"","sources":["../../../src/ai/utils/injectAiConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAuBvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,oBAAoB,GAC9B,UAAU,CAuJZ;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAgBvD"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/ai/utils/injectAiConfig.ts"],"sourcesContent":["import type { Config as PuckConfig } from '@puckeditor/core'\nimport type { ComponentAiOverrides } from '../types.js'\n\n// Extended types to include AI configuration\n// These match what Puck AI expects but aren't in the core types yet\ntype ComponentWithAi = {\n ai?: {\n instructions?: string\n schema?: object\n }\n fields?: Record<string, FieldWithAi>\n [key: string]: unknown\n}\n\ntype FieldWithAi = {\n ai?: {\n instructions?: string\n required?: boolean\n exclude?: boolean\n schema?: object\n }\n [key: string]: unknown\n}\n\n/**\n * Injects AI configuration into an existing Puck config\n *\n * This function:\n * 1. Applies component-level and field-level AI overrides from the provided config\n * 2. **Automatically excludes ALL `type: 'custom'` fields** from AI generation\n * (custom fields are UI-only interactive fields that AI cannot generate values for)\n *\n * @example Basic usage\n * ```typescript\n * import { editorConfig } from '@delmaredigital/payload-puck/config/editor'\n * import { injectAiConfig, defaultComponentAiConfig } from '@delmaredigital/payload-puck/ai'\n *\n * // Use default AI configs for built-in components\n * const aiEnabledConfig = injectAiConfig(editorConfig, defaultComponentAiConfig)\n * ```\n *\n * @example With custom overrides\n * ```typescript\n * const aiEnabledConfig = injectAiConfig(editorConfig, {\n * ...defaultComponentAiConfig,\n * // Override a built-in component\n * Heading: {\n * ai: {\n * instructions: 'Use our brand voice: professional but approachable',\n * },\n * fields: {\n * text: {\n * ai: {\n * instructions: 'Keep headings concise (under 10 words)',\n * required: true,\n * },\n * },\n * },\n * },\n * // Add config for a custom component\n * HeroSection: {\n * ai: {\n * instructions: 'Always place at the top of the page',\n * },\n * fields: {\n * headline: {\n * ai: {\n * instructions: 'Use power words, keep under 8 words',\n * required: true,\n * },\n * },\n * },\n * },\n * })\n * ```\n *\n * @param config - The base Puck configuration to enhance\n * @param overrides - AI configuration overrides for each component\n * @returns A new Puck config with AI metadata injected\n */\nexport function injectAiConfig(\n config: PuckConfig,\n overrides: ComponentAiOverrides\n): PuckConfig {\n // Deep clone the config to avoid mutating the original\n // Use type assertion to work with AI-extended types\n const newConfig = {\n ...config,\n components: { ...config.components } as Record<string, ComponentWithAi>,\n }\n\n // First pass: Apply user-provided overrides\n for (const [componentName, componentOverride] of Object.entries(overrides)) {\n const existingComponent = newConfig.components[componentName]\n\n // Skip if component doesn't exist in config\n if (!existingComponent) {\n continue\n }\n\n // Create a new component config with AI metadata\n const newComponent: ComponentWithAi = {\n ...existingComponent,\n }\n\n // Add component-level AI config\n if (componentOverride.ai) {\n newComponent.ai = {\n ...existingComponent.ai,\n ...componentOverride.ai,\n }\n }\n\n // Process field-level AI configs from overrides\n if (componentOverride.fields && existingComponent.fields) {\n const newFields: Record<string, FieldWithAi> = { ...existingComponent.fields }\n\n for (const [fieldName, fieldOverride] of Object.entries(componentOverride.fields)) {\n const existingField = existingComponent.fields[fieldName]\n\n // Skip if field doesn't exist\n if (!existingField) {\n continue\n }\n\n // Add AI config to field\n newFields[fieldName] = {\n ...existingField,\n ai: {\n ...existingField.ai,\n ...fieldOverride.ai,\n },\n }\n }\n\n newComponent.fields = newFields\n }\n\n newConfig.components[componentName] = newComponent\n }\n\n // Second pass: Auto-exclude custom fields that don't have AI instructions\n // Custom fields (type: 'custom') are typically interactive UI elements,\n // BUT some styling fields (background, padding, etc.) ARE custom fields\n // that we want AI to use. Only auto-exclude if NO AI instructions provided.\n for (const [componentName, component] of Object.entries(newConfig.components)) {\n if (!component.fields) continue\n\n const updatedFields: Record<string, FieldWithAi> = {}\n let hasChanges = false\n\n for (const [fieldName, field] of Object.entries(component.fields)) {\n const existingAi = (field as FieldWithAi).ai\n\n // Check if this is a custom field type\n if ((field as any).type === 'custom') {\n // If the field has AI instructions, DON'T auto-exclude it\n // The presence of instructions indicates we want AI to use this field\n if (existingAi?.instructions) {\n updatedFields[fieldName] = field as FieldWithAi\n }\n // Otherwise, auto-exclude custom fields from AI generation\n // (unless already excluded)\n else if (!existingAi?.exclude) {\n updatedFields[fieldName] = {\n ...field,\n ai: {\n ...existingAi,\n exclude: true,\n },\n }\n hasChanges = true\n } else {\n updatedFields[fieldName] = field as FieldWithAi\n }\n } else {\n updatedFields[fieldName] = field as FieldWithAi\n }\n }\n\n // Only update component if we made changes\n if (hasChanges) {\n newConfig.components[componentName] = {\n ...component,\n fields: updatedFields,\n }\n }\n }\n\n // Third pass: Auto-exclude custom fields from ROOT config (same logic as components)\n // Root can have fields just like components (e.g., isHomepage, pageLayout, etc.)\n if ((config as any).root?.fields) {\n const rootFields = (config as any).root.fields\n const updatedRootFields: Record<string, FieldWithAi> = {}\n let hasRootChanges = false\n\n for (const [fieldName, field] of Object.entries(rootFields)) {\n const existingAi = (field as FieldWithAi).ai\n\n // Check if this is a custom field type\n if ((field as any).type === 'custom') {\n // If the field has AI instructions, DON'T auto-exclude it\n if (existingAi?.instructions) {\n updatedRootFields[fieldName] = field as FieldWithAi\n }\n // Otherwise, auto-exclude custom fields from AI generation\n else if (!existingAi?.exclude) {\n updatedRootFields[fieldName] = {\n ...(field as FieldWithAi),\n ai: {\n ...existingAi,\n exclude: true,\n },\n }\n hasRootChanges = true\n } else {\n updatedRootFields[fieldName] = field as FieldWithAi\n }\n } else {\n updatedRootFields[fieldName] = field as FieldWithAi\n }\n }\n\n // Update root if we made changes\n if (hasRootChanges) {\n ;(newConfig as any).root = {\n ...(newConfig as any).root,\n fields: updatedRootFields,\n }\n }\n }\n\n // Cast back to PuckConfig for return\n return newConfig as unknown as PuckConfig\n}\n\n/**\n * Checks if a config already has AI configuration\n *\n * @param config - The Puck configuration to check\n * @returns True if any component has AI configuration\n */\nexport function hasAiConfig(config: PuckConfig): boolean {\n for (const component of Object.values(config.components)) {\n if ((component as any).ai) {\n return true\n }\n\n if (component.fields) {\n for (const field of Object.values(component.fields)) {\n if ((field as any).ai) {\n return true\n }\n }\n }\n }\n\n return false\n}\n"],"names":["injectAiConfig","config","overrides","newConfig","components","componentName","componentOverride","Object","entries","existingComponent","newComponent","ai","fields","newFields","fieldName","fieldOverride","existingField","component","updatedFields","hasChanges","field","existingAi","type","instructions","exclude","root","rootFields","updatedRootFields","hasRootChanges","hasAiConfig","values"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"createPuckApiRoutes.d.ts","sourceRoot":"","sources":["../../src/api/createPuckApiRoutes.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EAGrB,MAAM,YAAY,CAAA;AAenB;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,mBAAmB,GAC/B,oBAAoB,CAyMtB"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/api/createPuckApiRoutes.ts"],"sourcesContent":["import { NextRequest, NextResponse } from 'next/server'\nimport { getPayload } from 'payload'\nimport type { Where } from 'payload'\nimport type { Data as PuckData } from '@puckeditor/core'\nimport type {\n PuckApiRoutesConfig,\n PuckApiRouteHandlers,\n CreatePageBody,\n RouteHandlerContext,\n} from './types.js'\n\n/**\n * Default Puck data for new pages\n */\nconst DEFAULT_PUCK_DATA: PuckData = {\n root: {\n props: {\n title: '',\n } as Record<string, unknown>,\n },\n content: [],\n zones: {},\n}\n\n/**\n * Create API route handlers for /api/puck/pages\n *\n * Provides GET (list pages) and POST (create page) handlers\n * with configurable authentication and authorization.\n *\n * @example\n * ```typescript\n * // src/app/api/puck/pages/route.ts\n * import { createPuckApiRoutes } from '@delmaredigital/payload-puck/api'\n * import config from '@payload-config'\n *\n * export const { GET, POST } = createPuckApiRoutes({\n * collection: 'pages',\n * payloadConfig: config,\n * auth: {\n * authenticate: async (request) => {\n * const session = await getSession(request)\n * if (!session?.user) return { authenticated: false }\n * return { authenticated: true, user: session.user }\n * },\n * canCreate: async (user) => {\n * return { allowed: user.role === 'admin' || user.role === 'editor' }\n * },\n * },\n * })\n * ```\n */\nexport function createPuckApiRoutes(\n routeConfig: PuckApiRoutesConfig\n): PuckApiRouteHandlers {\n const {\n collection = 'pages',\n payloadConfig,\n auth,\n defaultPuckData = DEFAULT_PUCK_DATA,\n enableDrafts = true,\n onError,\n } = routeConfig\n\n /**\n * GET /api/puck/pages\n * List all pages with optional filtering\n *\n * Query Parameters:\n * - page: Page number (default: 1)\n * - limit: Items per page (default: 10)\n * - search: Search in title field\n * - status: Filter by _status ('draft', 'published', 'all')\n * - editorVersion: Filter by editorVersion field\n * - sort: Sort field (default: '-updatedAt')\n */\n async function GET(request: NextRequest, _context: RouteHandlerContext): Promise<Response> {\n try {\n // Authenticate\n const authResult = await auth.authenticate(request)\n if (!authResult.authenticated || !authResult.user) {\n return NextResponse.json(\n { error: authResult.error || 'Unauthorized' },\n { status: 401 }\n )\n }\n\n // Check list permission\n if (auth.canList) {\n const permission = await auth.canList(authResult.user)\n if (!permission.allowed) {\n return NextResponse.json(\n { error: permission.error || 'Forbidden' },\n { status: 403 }\n )\n }\n }\n\n // Parse query parameters\n const { searchParams } = new URL(request.url)\n const page = parseInt(searchParams.get('page') || '1', 10)\n const limit = Math.min(parseInt(searchParams.get('limit') || '10', 10), 100)\n const search = searchParams.get('search') || ''\n const status = searchParams.get('status')\n const editorVersion = searchParams.get('editorVersion')\n const sort = searchParams.get('sort') || '-updatedAt'\n\n // Get Payload instance with provided config\n const config = await payloadConfig\n const payload = await getPayload({ config })\n\n // Build where clause\n const conditions: Where[] = []\n\n if (search) {\n conditions.push({ title: { contains: search } })\n }\n\n if (status && status !== 'all') {\n conditions.push({ _status: { equals: status } })\n }\n\n if (editorVersion && editorVersion !== 'all') {\n conditions.push({ editorVersion: { equals: editorVersion } })\n }\n\n const where: Where | undefined =\n conditions.length > 0\n ? conditions.length === 1\n ? conditions[0]\n : { and: conditions }\n : undefined\n\n const result = await payload.find({\n collection,\n page,\n limit,\n sort,\n where,\n })\n\n return NextResponse.json(result)\n } catch (error) {\n if (onError) {\n onError(error, { operation: 'list', request })\n }\n console.error('Error listing pages:', error)\n return NextResponse.json(\n { error: 'Failed to list pages' },\n { status: 500 }\n )\n }\n }\n\n /**\n * POST /api/puck/pages\n * Create a new page with Puck data\n *\n * Request Body:\n * - title: string (required)\n * - slug: string (required)\n * - puckData?: PuckData (optional, uses default if not provided)\n * - status?: 'draft' | 'published' (default: 'draft')\n */\n async function POST(request: NextRequest, _context: RouteHandlerContext): Promise<Response> {\n try {\n // Authenticate\n const authResult = await auth.authenticate(request)\n if (!authResult.authenticated || !authResult.user) {\n return NextResponse.json(\n { error: authResult.error || 'Unauthorized' },\n { status: 401 }\n )\n }\n\n // Check create permission\n if (auth.canCreate) {\n const permission = await auth.canCreate(authResult.user)\n if (!permission.allowed) {\n return NextResponse.json(\n { error: permission.error || 'Forbidden' },\n { status: 403 }\n )\n }\n }\n\n // Parse request body\n const body = (await request.json()) as CreatePageBody\n const { title, slug, puckData, status = 'draft' } = body\n\n // Validate required fields\n if (!title || !slug) {\n return NextResponse.json(\n { error: 'Title and slug are required' },\n { status: 400 }\n )\n }\n\n // Get Payload instance with provided config\n const config = await payloadConfig\n const payload = await getPayload({ config })\n\n // Check if slug already exists\n const existing = await payload.find({\n collection,\n where: { slug: { equals: slug } },\n limit: 1,\n })\n\n if (existing.docs.length > 0) {\n return NextResponse.json(\n { error: 'A page with this slug already exists' },\n { status: 409 }\n )\n }\n\n // Prepare initial Puck data with title in root.props\n const initialPuckData = puckData || {\n ...defaultPuckData,\n root: {\n ...defaultPuckData.root,\n props: {\n ...(defaultPuckData.root as { props?: Record<string, unknown> })?.props,\n title,\n },\n },\n }\n\n // Create the page\n const newPage = await payload.create({\n collection,\n draft: enableDrafts,\n data: {\n title,\n slug,\n editorVersion: 'puck',\n puckData: initialPuckData,\n _status: status,\n },\n })\n\n return NextResponse.json({ doc: newPage }, { status: 201 })\n } catch (error) {\n if (onError) {\n onError(error, { operation: 'create', request })\n }\n console.error('Error creating page:', error)\n return NextResponse.json(\n { error: 'Failed to create page' },\n { status: 500 }\n )\n }\n }\n\n return { GET, POST }\n}\n"],"names":["NextResponse","getPayload","DEFAULT_PUCK_DATA","root","props","title","content","zones","createPuckApiRoutes","routeConfig","collection","payloadConfig","auth","defaultPuckData","enableDrafts","onError","GET","request","_context","authResult","authenticate","authenticated","user","json","error","status","canList","permission","allowed","searchParams","URL","url","page","parseInt","get","limit","Math","min","search","editorVersion","sort","config","payload","conditions","push","contains","_status","equals","where","length","and","undefined","result","find","operation","console","POST","canCreate","body","slug","puckData","existing","docs","initialPuckData","newPage","create","draft","data","doc"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"createPuckApiRoutesVersions.d.ts","sourceRoot":"","sources":["../../src/api/createPuckApiRoutesVersions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,mBAAmB,EACnB,4BAA4B,EAE7B,MAAM,YAAY,CAAA;AAEnB;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,mBAAmB,GAC/B,4BAA4B,CAyK9B"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/api/createPuckApiRoutesVersions.ts"],"sourcesContent":["import { NextRequest, NextResponse } from 'next/server'\nimport { getPayload } from 'payload'\nimport type {\n PuckApiRoutesConfig,\n PuckApiVersionsRouteHandlers,\n RouteHandlerWithIdContext,\n} from './types.js'\n\n/**\n * Create API route handlers for /api/puck/pages/[id]/versions\n *\n * Provides GET (list versions) and POST (restore version) handlers\n * for managing page version history.\n *\n * @example\n * ```typescript\n * // src/app/api/puck/pages/[id]/versions/route.ts\n * import { createPuckApiRoutesVersions } from '@delmaredigital/payload-puck/api'\n * import config from '@payload-config'\n *\n * export const { GET, POST } = createPuckApiRoutesVersions({\n * collection: 'pages',\n * payloadConfig: config,\n * auth: {\n * authenticate: async (request) => {\n * const session = await getSession(request)\n * if (!session?.user) return { authenticated: false }\n * return { authenticated: true, user: session.user }\n * },\n * },\n * })\n * ```\n */\nexport function createPuckApiRoutesVersions(\n routeConfig: PuckApiRoutesConfig\n): PuckApiVersionsRouteHandlers {\n const {\n collection = 'pages',\n payloadConfig,\n auth,\n onError,\n } = routeConfig\n\n /**\n * GET /api/puck/pages/[id]/versions\n * Fetch version history for a page\n */\n async function GET(\n request: NextRequest,\n context: RouteHandlerWithIdContext\n ): Promise<Response> {\n try {\n // Get page ID from params\n const params = await context.params\n const id = params.id\n\n if (!id) {\n return NextResponse.json(\n { error: 'Page ID is required' },\n { status: 400 }\n )\n }\n\n // Authenticate\n const authResult = await auth.authenticate(request)\n if (!authResult.authenticated || !authResult.user) {\n return NextResponse.json(\n { error: authResult.error || 'Unauthorized' },\n { status: 401 }\n )\n }\n\n // Check view permission\n if (auth.canView) {\n const permission = await auth.canView(authResult.user, id)\n if (!permission.allowed) {\n return NextResponse.json(\n { error: permission.error || 'Forbidden' },\n { status: 403 }\n )\n }\n }\n\n // Get Payload instance with provided config\n const config = await payloadConfig\n const payload = await getPayload({ config })\n\n // Parse query params for pagination\n const url = new URL(request.url)\n const limit = parseInt(url.searchParams.get('limit') || '20', 10)\n const page = parseInt(url.searchParams.get('page') || '1', 10)\n\n // Fetch versions for this page\n const versions = await payload.findVersions({\n collection,\n where: {\n parent: { equals: id },\n },\n sort: '-updatedAt',\n limit,\n page,\n })\n\n return NextResponse.json({\n docs: versions.docs,\n totalDocs: versions.totalDocs,\n totalPages: versions.totalPages,\n page: versions.page,\n limit: versions.limit,\n hasPrevPage: versions.hasPrevPage,\n hasNextPage: versions.hasNextPage,\n })\n } catch (error) {\n const params = await context.params\n if (onError) {\n onError(error, { operation: 'listVersions', request, pageId: params.id })\n }\n console.error('Error fetching versions:', error)\n return NextResponse.json(\n { error: 'Failed to fetch versions' },\n { status: 500 }\n )\n }\n }\n\n /**\n * POST /api/puck/pages/[id]/versions\n * Restore a specific version\n *\n * Request Body:\n * - versionId: string - The version ID to restore\n */\n async function POST(\n request: NextRequest,\n context: RouteHandlerWithIdContext\n ): Promise<Response> {\n try {\n // Get page ID from params\n const params = await context.params\n const id = params.id\n\n if (!id) {\n return NextResponse.json(\n { error: 'Page ID is required' },\n { status: 400 }\n )\n }\n\n // Authenticate\n const authResult = await auth.authenticate(request)\n if (!authResult.authenticated || !authResult.user) {\n return NextResponse.json(\n { error: authResult.error || 'Unauthorized' },\n { status: 401 }\n )\n }\n\n // Check edit permission\n if (auth.canEdit) {\n const permission = await auth.canEdit(authResult.user, id)\n if (!permission.allowed) {\n return NextResponse.json(\n { error: permission.error || 'Forbidden' },\n { status: 403 }\n )\n }\n }\n\n // Parse request body\n const body = await request.json()\n const { versionId } = body as { versionId: string }\n\n if (!versionId) {\n return NextResponse.json(\n { error: 'Version ID is required' },\n { status: 400 }\n )\n }\n\n // Get Payload instance with provided config\n const config = await payloadConfig\n const payload = await getPayload({ config })\n\n // Restore the version\n const restoredDoc = await payload.restoreVersion({\n collection,\n id: versionId,\n })\n\n return NextResponse.json({ doc: restoredDoc })\n } catch (error) {\n const params = await context.params\n if (onError) {\n onError(error, { operation: 'restoreVersion', request, pageId: params.id })\n }\n console.error('Error restoring version:', error)\n return NextResponse.json(\n { error: 'Failed to restore version' },\n { status: 500 }\n )\n }\n }\n\n return { GET, POST }\n}\n"],"names":["NextResponse","getPayload","createPuckApiRoutesVersions","routeConfig","collection","payloadConfig","auth","onError","GET","request","context","params","id","json","error","status","authResult","authenticate","authenticated","user","canView","permission","allowed","config","payload","url","URL","limit","parseInt","searchParams","get","page","versions","findVersions","where","parent","equals","sort","docs","totalDocs","totalPages","hasPrevPage","hasNextPage","operation","pageId","console","POST","canEdit","body","versionId","restoredDoc","restoreVersion","doc"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"createPuckApiRoutesWithId.d.ts","sourceRoot":"","sources":["../../src/api/createPuckApiRoutesWithId.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,mBAAmB,EACnB,0BAA0B,EAG3B,MAAM,YAAY,CAAA;AAGnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,mBAAmB,GAC/B,0BAA0B,CAsW5B"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/api/createPuckApiRoutesWithId.ts"],"sourcesContent":["import { NextRequest, NextResponse } from 'next/server'\nimport { getPayload } from 'payload'\nimport type {\n PuckApiRoutesConfig,\n PuckApiRouteWithIdHandlers,\n UpdatePageBody,\n RouteHandlerWithIdContext,\n} from './types.js'\nimport { mapRootPropsToPayloadFields, deepMerge } from './utils/mapRootProps.js'\n\n/**\n * Create API route handlers for /api/puck/pages/[id]\n *\n * Provides GET (fetch page), PATCH (update page), and DELETE (delete page)\n * handlers with configurable authentication and authorization.\n *\n * @example\n * ```typescript\n * // src/app/api/puck/pages/[id]/route.ts\n * import { createPuckApiRoutesWithId } from '@delmaredigital/payload-puck/api'\n * import config from '@payload-config'\n *\n * export const { GET, PATCH, DELETE } = createPuckApiRoutesWithId({\n * collection: 'pages',\n * payloadConfig: config,\n * auth: {\n * authenticate: async (request) => {\n * const session = await getSession(request)\n * if (!session?.user) return { authenticated: false }\n * return { authenticated: true, user: session.user }\n * },\n * canPublish: async (user) => {\n * return { allowed: user.role === 'admin' }\n * },\n * },\n * rootPropsMapping: [\n * { from: 'customField', to: 'customPayloadField' },\n * ],\n * })\n * ```\n */\nexport function createPuckApiRoutesWithId(\n routeConfig: PuckApiRoutesConfig\n): PuckApiRouteWithIdHandlers {\n const {\n collection = 'pages',\n payloadConfig,\n auth,\n rootPropsMapping,\n onError,\n } = routeConfig\n\n /**\n * GET /api/puck/pages/[id]\n * Fetch a single page by ID\n */\n async function GET(\n request: NextRequest,\n context: RouteHandlerWithIdContext\n ): Promise<Response> {\n try {\n // Get page ID from params\n const params = await context.params\n const id = params.id\n\n if (!id) {\n return NextResponse.json(\n { error: 'Page ID is required' },\n { status: 400 }\n )\n }\n\n // Authenticate\n const authResult = await auth.authenticate(request)\n if (!authResult.authenticated || !authResult.user) {\n return NextResponse.json(\n { error: authResult.error || 'Unauthorized' },\n { status: 401 }\n )\n }\n\n // Check view permission\n if (auth.canView) {\n const permission = await auth.canView(authResult.user, id)\n if (!permission.allowed) {\n return NextResponse.json(\n { error: permission.error || 'Forbidden' },\n { status: 403 }\n )\n }\n }\n\n // Get Payload instance with provided config\n const config = await payloadConfig\n const payload = await getPayload({ config })\n\n // Check if caller wants draft or published version\n // Default to draft=true for editor use (load latest draft)\n const url = new URL(request.url)\n const wantsDraft = url.searchParams.get('draft') !== 'false'\n\n const page = await payload.findByID({\n collection,\n id,\n draft: wantsDraft, // Load draft version by default for editing\n })\n\n if (!page) {\n return NextResponse.json({ error: 'Page not found' }, { status: 404 })\n }\n\n return NextResponse.json({ doc: page })\n } catch (error) {\n const params = await context.params\n if (onError) {\n onError(error, { operation: 'read', request, pageId: params.id })\n }\n console.error('Error fetching page:', error)\n return NextResponse.json(\n { error: 'Failed to fetch page' },\n { status: 500 }\n )\n }\n }\n\n /**\n * PATCH /api/puck/pages/[id]\n * Update a page with Puck data\n *\n * Request Body:\n * - puckData?: PuckData - Full Puck editor data\n * - title?: string - Override title (also synced from root.props)\n * - slug?: string - Override slug (also synced from root.props)\n * - status?: 'draft' | 'published' - Publishing status\n *\n * Root props from puckData are automatically synced to Payload fields\n * based on the configured mappings.\n */\n async function PATCH(\n request: NextRequest,\n context: RouteHandlerWithIdContext\n ): Promise<Response> {\n try {\n // Get page ID from params\n const params = await context.params\n const id = params.id\n\n if (!id) {\n return NextResponse.json(\n { error: 'Page ID is required' },\n { status: 400 }\n )\n }\n\n // Authenticate\n const authResult = await auth.authenticate(request)\n if (!authResult.authenticated || !authResult.user) {\n return NextResponse.json(\n { error: authResult.error || 'Unauthorized' },\n { status: 401 }\n )\n }\n\n // Check edit permission\n if (auth.canEdit) {\n const permission = await auth.canEdit(authResult.user, id)\n if (!permission.allowed) {\n return NextResponse.json(\n { error: permission.error || 'Forbidden' },\n { status: 403 }\n )\n }\n }\n\n // Parse request body\n const body = (await request.json()) as UpdatePageBody\n const { puckData, title, slug, status, draft, isHomepage, swapHomepage, folder, pageSegment } = body\n\n // Check publish permission only if explicitly publishing\n if (status === 'published') {\n const canPublish = auth.canPublish || auth.canEdit\n if (canPublish) {\n const permission = await canPublish(authResult.user, id)\n if (!permission.allowed) {\n return NextResponse.json(\n { error: permission.error || 'Not authorized to publish pages' },\n { status: 403 }\n )\n }\n }\n }\n\n // Get Payload instance with provided config\n const config = await payloadConfig\n const payload = await getPayload({ config })\n\n // Handle homepage swap - if swapHomepage is true and isHomepage is being set,\n // unset the existing homepage first\n if (swapHomepage && isHomepage === true) {\n const existingHomepage = await payload.find({\n collection,\n where: {\n and: [\n { isHomepage: { equals: true } },\n { id: { not_equals: id } },\n ],\n },\n limit: 1,\n depth: 0,\n })\n\n if (existingHomepage.docs.length > 0) {\n await payload.update({\n collection,\n id: existingHomepage.docs[0].id as string,\n data: { isHomepage: false },\n // Pass context to skip the uniqueness hook on this update\n context: { skipIsHomepageHook: true },\n })\n }\n }\n\n // Extract root props from puckData for syncing to Payload fields\n const rootProps =\n (puckData?.root as { props?: Record<string, unknown> })?.props || {}\n\n // Build update data starting with editorVersion\n const updateData: Record<string, unknown> = {\n editorVersion: 'puck',\n }\n\n // Add puckData if provided\n if (puckData) {\n updateData.puckData = puckData\n }\n\n // Map root.props to Payload fields\n const mappedFields = mapRootPropsToPayloadFields(rootProps, rootPropsMapping)\n\n // Merge mapped fields into update data (deep merge for nested objects)\n deepMerge(updateData, mappedFields)\n\n // Explicit title/slug override the mapped values\n if (title !== undefined) {\n updateData.title = title\n }\n if (slug !== undefined) {\n updateData.slug = slug\n }\n\n // Homepage flag: explicit isHomepage overrides the mapped value\n if (isHomepage !== undefined) {\n updateData.isHomepage = isHomepage\n }\n\n // Page-tree integration: explicit folder/pageSegment override the mapped values\n if (folder !== undefined) {\n updateData.folder = folder\n }\n if (pageSegment !== undefined) {\n updateData.pageSegment = pageSegment\n }\n\n // Set status if provided (for explicit publish)\n if (status) {\n updateData._status = status\n }\n\n // Call payload.update with draft parameter for Payload's versions.drafts system\n // When _status is set to 'published', the document is published regardless of draft param\n // When draft=true and no _status set, saves without publishing\n // When draft=false or omitted, updates the main collection\n const updateOptions: {\n collection: string\n id: string\n data: Record<string, unknown>\n draft?: boolean\n } = {\n collection,\n id,\n data: updateData,\n }\n\n // Only pass draft: true when explicitly saving as draft (not publishing)\n // When publishing (_status: 'published'), we omit the draft option entirely\n // to let Payload handle it correctly\n if (draft === true && status !== 'published') {\n updateOptions.draft = true\n }\n\n const updatedPage = await payload.update(updateOptions)\n\n return NextResponse.json({ doc: updatedPage })\n } catch (error) {\n const params = await context.params\n if (onError) {\n onError(error, { operation: 'update', request, pageId: params.id })\n }\n console.error('Error updating page:', error)\n\n // Handle Payload validation errors gracefully\n if (error instanceof Error && error.name === 'ValidationError') {\n const validationError = error as Error & {\n data?: { errors?: Array<{ field: string; message: string }> }\n }\n const fieldErrors = validationError.data?.errors || []\n\n // Check for common validation issues and provide friendly messages\n const slugError = fieldErrors.find((e) => e.field === 'slug')\n if (slugError) {\n return NextResponse.json(\n {\n error: 'A page with this slug already exists. Please choose a different slug.',\n field: 'slug',\n details: fieldErrors,\n },\n { status: 400 }\n )\n }\n\n // Generic validation error\n return NextResponse.json(\n {\n error: `Validation failed: ${fieldErrors.map((e) => e.message || e.field).join(', ')}`,\n details: fieldErrors,\n },\n { status: 400 }\n )\n }\n\n return NextResponse.json(\n { error: 'Failed to update page' },\n { status: 500 }\n )\n }\n }\n\n /**\n * DELETE /api/puck/pages/[id]\n * Delete a page by ID\n */\n async function DELETE(\n request: NextRequest,\n context: RouteHandlerWithIdContext\n ): Promise<Response> {\n try {\n // Get page ID from params\n const params = await context.params\n const id = params.id\n\n if (!id) {\n return NextResponse.json(\n { error: 'Page ID is required' },\n { status: 400 }\n )\n }\n\n // Authenticate\n const authResult = await auth.authenticate(request)\n if (!authResult.authenticated || !authResult.user) {\n return NextResponse.json(\n { error: authResult.error || 'Unauthorized' },\n { status: 401 }\n )\n }\n\n // Check delete permission\n if (auth.canDelete) {\n const permission = await auth.canDelete(authResult.user, id)\n if (!permission.allowed) {\n return NextResponse.json(\n { error: permission.error || 'Forbidden' },\n { status: 403 }\n )\n }\n }\n\n // Get Payload instance with provided config\n const config = await payloadConfig\n const payload = await getPayload({ config })\n\n await payload.delete({\n collection,\n id,\n })\n\n return NextResponse.json({ success: true })\n } catch (error) {\n const params = await context.params\n if (onError) {\n onError(error, { operation: 'delete', request, pageId: params.id })\n }\n console.error('Error deleting page:', error)\n return NextResponse.json(\n { error: 'Failed to delete page' },\n { status: 500 }\n )\n }\n }\n\n return { GET, PATCH, DELETE }\n}\n"],"names":["NextResponse","getPayload","mapRootPropsToPayloadFields","deepMerge","createPuckApiRoutesWithId","routeConfig","collection","payloadConfig","auth","rootPropsMapping","onError","GET","request","context","params","id","json","error","status","authResult","authenticate","authenticated","user","canView","permission","allowed","config","payload","url","URL","wantsDraft","searchParams","get","page","findByID","draft","doc","operation","pageId","console","PATCH","canEdit","body","puckData","title","slug","isHomepage","swapHomepage","folder","pageSegment","canPublish","existingHomepage","find","where","and","equals","not_equals","limit","depth","docs","length","update","data","skipIsHomepageHook","rootProps","root","props","updateData","editorVersion","mappedFields","undefined","_status","updateOptions","updatedPage","Error","name","validationError","fieldErrors","errors","slugError","e","field","details","map","message","join","DELETE","canDelete","delete","success"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC1E,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAA;AAG9E,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,EAC3B,2BAA2B,EAC3B,cAAc,EACd,cAAc,EACd,aAAa,EACb,SAAS,GACV,MAAM,yBAAyB,CAAA;AAGhC,YAAY,EAEV,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAGhB,gBAAgB,EAGhB,mBAAmB,EACnB,YAAY,EAGZ,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,EACpB,0BAA0B,EAG1B,cAAc,EACd,cAAc,EACd,WAAW,EAGX,WAAW,EACX,4BAA4B,GAC7B,MAAM,YAAY,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/api/index.ts"],"sourcesContent":["/**\n * Puck API Routes\n *\n * Factory functions for creating Next.js App Router API route handlers\n * that integrate with PayloadCMS for Puck visual editor data management.\n *\n * @example\n * ```typescript\n * // src/app/api/puck/pages/route.ts\n * import { createPuckApiRoutes } from '@delmaredigital/payload-puck/api'\n *\n * export const { GET, POST } = createPuckApiRoutes({\n * auth: {\n * authenticate: async (request) => {\n * // Your auth implementation\n * },\n * },\n * })\n * ```\n *\n * @example\n * ```typescript\n * // src/app/api/puck/pages/[id]/route.ts\n * import { createPuckApiRoutesWithId } from '@delmaredigital/payload-puck/api'\n *\n * export const { GET, PATCH, DELETE } = createPuckApiRoutesWithId({\n * auth: {\n * authenticate: async (request) => {\n * // Your auth implementation\n * },\n * },\n * })\n * ```\n */\n\n// Route factories\nexport { createPuckApiRoutes } from './createPuckApiRoutes.js'\nexport { createPuckApiRoutesWithId } from './createPuckApiRoutesWithId.js'\nexport { createPuckApiRoutesVersions } from './createPuckApiRoutesVersions.js'\n\n// Utilities\nexport {\n mapRootPropsToPayloadFields,\n mapPayloadFieldsToRootProps,\n DEFAULT_ROOT_PROPS_MAPPINGS,\n setNestedValue,\n getNestedValue,\n mergeMappings,\n deepMerge,\n} from './utils/mapRootProps.js'\n\n// Types\nexport type {\n // Auth types\n AuthenticatedUser,\n AuthResult,\n PermissionResult,\n PuckApiAuthHooks,\n\n // Mapping types\n RootPropsMapping,\n\n // Config types\n PuckApiRoutesConfig,\n ErrorContext,\n\n // Handler types\n RouteHandler,\n RouteHandlerWithId,\n RouteHandlerContext,\n RouteHandlerWithIdContext,\n PuckApiRouteHandlers,\n PuckApiRouteWithIdHandlers,\n\n // Request/Response types\n CreatePageBody,\n UpdatePageBody,\n ApiResponse,\n\n // Version types\n PageVersion,\n PuckApiVersionsRouteHandlers,\n} from './types.js'\n"],"names":["createPuckApiRoutes","createPuckApiRoutesWithId","createPuckApiRoutesVersions","mapRootPropsToPayloadFields","mapPayloadFieldsToRootProps","DEFAULT_ROOT_PROPS_MAPPINGS","setNestedValue","getNestedValue","mergeMappings","deepMerge"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCC,GAED,kBAAkB;AAClB,SAASA,mBAAmB,QAAQ,2BAA0B;AAC9D,SAASC,yBAAyB,QAAQ,iCAAgC;AAC1E,SAASC,2BAA2B,QAAQ,mCAAkC;AAE9E,YAAY;AACZ,SACEC,2BAA2B,EAC3BC,2BAA2B,EAC3BC,2BAA2B,EAC3BC,cAAc,EACdC,cAAc,EACdC,aAAa,EACbC,SAAS,QACJ,0BAAyB"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/api/payload-config.d.ts"],"sourcesContent":["/**\n * Ambient type declaration for @payload-config\n *\n * This module is provided by the consuming project and resolves to their Payload config.\n * The consuming project should have this alias configured in their tsconfig.json:\n *\n * {\n * \"compilerOptions\": {\n * \"paths\": {\n * \"@payload-config\": [\"./src/payload.config.ts\"]\n * }\n * }\n * }\n */\ndeclare module '@payload-config' {\n import type { SanitizedConfig } from 'payload'\n\n const config: Promise<SanitizedConfig>\n export default config\n}\n"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;CAaC,GACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/api/types.ts"],"sourcesContent":["import type { NextRequest } from 'next/server'\nimport type { Data as PuckData } from '@puckeditor/core'\n\n// =============================================================================\n// Authentication Types\n// =============================================================================\n\n/**\n * Authenticated user from the auth system\n */\nexport interface AuthenticatedUser {\n id: string\n [key: string]: unknown\n}\n\n/**\n * Result of an authentication check\n */\nexport interface AuthResult {\n authenticated: boolean\n user?: AuthenticatedUser\n error?: string\n}\n\n/**\n * Result of a permission check\n */\nexport interface PermissionResult {\n allowed: boolean\n error?: string\n}\n\n// =============================================================================\n// Auth Hooks Interface\n// =============================================================================\n\n/**\n * Authentication and authorization hooks for Puck API routes\n *\n * These hooks allow you to integrate with any authentication system\n * (Better Auth, NextAuth, Payload auth, custom JWT, etc.)\n *\n * @example\n * ```typescript\n * // Example with Better Auth\n * const authHooks: PuckApiAuthHooks = {\n * authenticate: async (request) => {\n * const session = await auth.api.getSession({ headers: await headers() })\n * if (!session?.user) return { authenticated: false }\n * return { authenticated: true, user: session.user }\n * },\n * canEdit: async (user, pageId) => {\n * return { allowed: hasRole(user, 'editor') }\n * },\n * }\n * ```\n */\nexport interface PuckApiAuthHooks {\n /**\n * Authenticate the incoming request\n * Should return the authenticated user or authentication failure\n */\n authenticate: (request: NextRequest) => Promise<AuthResult>\n\n /**\n * Check if user can list pages\n * @default Always allowed for authenticated users\n */\n canList?: (\n user: AuthenticatedUser\n ) => Promise<PermissionResult> | PermissionResult\n\n /**\n * Check if user can view a specific page\n * @default Always allowed for authenticated users\n */\n canView?: (\n user: AuthenticatedUser,\n pageId: string\n ) => Promise<PermissionResult> | PermissionResult\n\n /**\n * Check if user can create new pages\n * @default Always allowed for authenticated users\n */\n canCreate?: (\n user: AuthenticatedUser\n ) => Promise<PermissionResult> | PermissionResult\n\n /**\n * Check if user can edit a specific page\n * @default Always allowed for authenticated users\n */\n canEdit?: (\n user: AuthenticatedUser,\n pageId: string\n ) => Promise<PermissionResult> | PermissionResult\n\n /**\n * Check if user can publish a specific page (change status to published)\n * @default Same as canEdit\n */\n canPublish?: (\n user: AuthenticatedUser,\n pageId: string\n ) => Promise<PermissionResult> | PermissionResult\n\n /**\n * Check if user can delete a specific page\n * @default Always allowed for authenticated users\n */\n canDelete?: (\n user: AuthenticatedUser,\n pageId: string\n ) => Promise<PermissionResult> | PermissionResult\n}\n\n// =============================================================================\n// Root Props Mapping Types\n// =============================================================================\n\n/**\n * Mapping configuration for syncing Puck root.props to Payload fields\n *\n * @example\n * ```typescript\n * // Simple mapping\n * { from: 'pageLayout', to: 'pageLayout' }\n *\n * // Nested field mapping (uses official @payloadcms/plugin-seo convention)\n * { from: 'title', to: 'meta.title' }\n *\n * // With transformation\n * {\n * from: 'publishDate',\n * to: 'publishedAt',\n * transform: (value) => value ? new Date(value as string).toISOString() : null\n * }\n * ```\n */\nexport interface RootPropsMapping {\n /**\n * Property name in Puck root.props\n */\n from: string\n\n /**\n * Field path in Payload document (supports dot notation for nested fields)\n */\n to: string\n\n /**\n * Optional transformation function\n */\n transform?: (value: unknown) => unknown\n}\n\n// =============================================================================\n// API Routes Configuration\n// =============================================================================\n\n/**\n * Error context passed to onError callback\n */\nexport interface ErrorContext {\n operation: string\n request: NextRequest\n pageId?: string\n}\n\n/**\n * Configuration for Puck API routes\n *\n * @example\n * ```typescript\n * const config: PuckApiRoutesConfig = {\n * collection: 'pages',\n * auth: {\n * authenticate: async (request) => {\n * // Your auth logic here\n * },\n * canPublish: async (user) => {\n * return { allowed: user.role === 'admin' }\n * },\n * },\n * rootPropsMapping: [\n * { from: 'title', to: 'meta.title' },\n * { from: 'description', to: 'meta.description' },\n * ],\n * enableDrafts: true,\n * }\n * ```\n */\nexport interface PuckApiRoutesConfig {\n /**\n * Payload collection slug for pages\n * @default 'pages'\n */\n collection?: string\n\n /**\n * Payload configuration - import from @payload-config\n * Required for Turbopack/Next.js 16+ compatibility\n *\n * @example\n * ```typescript\n * import config from '@payload-config'\n *\n * createPuckApiRoutesWithId({\n * payloadConfig: config,\n * // ...\n * })\n * ```\n */\n payloadConfig: Promise<import('payload').SanitizedConfig>\n\n /**\n * Authentication and authorization hooks\n */\n auth: PuckApiAuthHooks\n\n /**\n * Custom mappings from Puck root.props to Payload fields\n * These are merged with the default mappings\n */\n rootPropsMapping?: RootPropsMapping[]\n\n /**\n * Default Puck data for new pages\n */\n defaultPuckData?: PuckData\n\n /**\n * Enable draft mode for page creation/updates\n * @default true\n */\n enableDrafts?: boolean\n\n /**\n * Custom error handler for logging/monitoring\n */\n onError?: (error: unknown, context: ErrorContext) => void\n}\n\n// =============================================================================\n// Route Handler Types\n// =============================================================================\n\n/**\n * Context passed to Next.js App Router route handlers\n */\nexport interface RouteHandlerContext {\n params: Promise<Record<string, string>>\n}\n\n/**\n * Context for route handlers that require an id parameter\n */\nexport interface RouteHandlerWithIdContext {\n params: Promise<{ id: string }>\n}\n\n/**\n * Next.js App Router route handler type\n */\nexport type RouteHandler = (\n request: NextRequest,\n context: RouteHandlerContext\n) => Promise<Response>\n\n/**\n * Next.js App Router route handler type for [id] routes\n */\nexport type RouteHandlerWithId = (\n request: NextRequest,\n context: RouteHandlerWithIdContext\n) => Promise<Response>\n\n/**\n * Route handlers returned by createPuckApiRoutes\n */\nexport interface PuckApiRouteHandlers {\n GET: RouteHandler\n POST: RouteHandler\n}\n\n/**\n * Route handlers returned by createPuckApiRoutesWithId\n */\nexport interface PuckApiRouteWithIdHandlers {\n GET: RouteHandlerWithId\n PATCH: RouteHandlerWithId\n DELETE: RouteHandlerWithId\n}\n\n// =============================================================================\n// Request/Response Types\n// =============================================================================\n\n/**\n * Request body for creating a new page\n */\nexport interface CreatePageBody {\n title: string\n slug: string\n puckData?: PuckData\n status?: 'draft' | 'published'\n}\n\n/**\n * Request body for updating a page\n */\nexport interface UpdatePageBody {\n puckData?: PuckData\n title?: string\n slug?: string\n status?: 'draft' | 'published'\n /**\n * When true, save as draft without publishing.\n * Used by Payload's versions.drafts system.\n */\n draft?: boolean\n /**\n * Mark this page as the homepage.\n * Consumers should check this flag first, then fall back to slug convention.\n */\n isHomepage?: boolean\n /**\n * When true and isHomepage is true, automatically unsets the existing homepage.\n * Used when the user confirms they want to swap homepages.\n */\n swapHomepage?: boolean\n /**\n * Folder ID for page-tree integration.\n * When page-tree plugin is active, this determines the page's parent folder.\n */\n folder?: string | null\n /**\n * Page segment for page-tree integration.\n * Combined with folder path to generate the full slug.\n */\n pageSegment?: string\n}\n\n/**\n * Standard API response wrapper\n */\nexport interface ApiResponse<T = unknown> {\n doc?: T\n docs?: T[]\n error?: string\n success?: boolean\n totalDocs?: number\n totalPages?: number\n page?: number\n limit?: number\n hasPrevPage?: boolean\n hasNextPage?: boolean\n}\n\n// =============================================================================\n// Version Types\n// =============================================================================\n\n/**\n * A 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?: PuckData\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\n/**\n * Route handlers returned by createPuckApiRoutesVersions\n */\nexport interface PuckApiVersionsRouteHandlers {\n GET: RouteHandlerWithId\n POST: RouteHandlerWithId\n}\n"],"names":[],"mappings":"AAgYA;;CAEC,GACD,WAGC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"mapRootProps.d.ts","sourceRoot":"","sources":["../../../src/api/utils/mapRootProps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAEnD;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B,EAAE,gBAAgB,EAuBzD,CAAA;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,GACb,IAAI,CAcN;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,EAAE,MAAM,GACX,OAAO,CAeT;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,cAAc,CAAC,EAAE,gBAAgB,EAAE,GAClC,gBAAgB,EAAE,CAmBpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,cAAc,CAAC,EAAE,gBAAgB,EAAE,GAClC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoBzB;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAyBzB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,cAAc,CAAC,EAAE,gBAAgB,EAAE,GAClC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBzB"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/api/utils/mapRootProps.ts"],"sourcesContent":["import type { RootPropsMapping } from '../types.js'\n\n/**\n * Default mappings from Puck root.props to Payload fields\n *\n * These mappings sync common page properties from Puck's visual editor\n * to the corresponding Payload collection fields.\n *\n * SEO fields use the official @payloadcms/plugin-seo convention: meta.title, meta.description\n */\nexport const DEFAULT_ROOT_PROPS_MAPPINGS: RootPropsMapping[] = [\n // Core page fields\n { from: 'title', to: 'title' },\n { from: 'slug', to: 'slug' },\n { from: 'pageLayout', to: 'pageLayout' },\n { from: 'pageType', to: 'pageType' },\n { from: 'isHomepage', to: 'isHomepage' },\n\n // Page-tree integration fields\n { from: 'folder', to: 'folder' },\n { from: 'pageSegment', to: 'pageSegment' },\n\n // SEO/Meta fields (uses official @payloadcms/plugin-seo convention)\n { from: 'metaTitle', to: 'meta.title' },\n { from: 'metaDescription', to: 'meta.description' },\n { from: 'noindex', to: 'meta.noindex' },\n { from: 'nofollow', to: 'meta.nofollow' },\n { from: 'excludeFromSitemap', to: 'meta.excludeFromSitemap' },\n\n // Conversion tracking fields\n { from: 'isConversionPage', to: 'conversionTracking.isConversionPage' },\n { from: 'conversionType', to: 'conversionTracking.conversionType' },\n { from: 'conversionValue', to: 'conversionTracking.conversionValue' },\n]\n\n/**\n * Set a nested value in an object using dot notation path\n *\n * @example\n * ```typescript\n * const obj = {}\n * setNestedValue(obj, 'meta.title', 'My Title')\n * // Result: { meta: { title: 'My Title' } }\n * ```\n */\nexport function setNestedValue(\n obj: Record<string, unknown>,\n path: string,\n value: unknown\n): void {\n const keys = path.split('.')\n let current = obj\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i]\n if (!(key in current) || typeof current[key] !== 'object') {\n current[key] = {}\n }\n current = current[key] as Record<string, unknown>\n }\n\n const finalKey = keys[keys.length - 1]\n current[finalKey] = value\n}\n\n/**\n * Get a nested value from an object using dot notation path\n *\n * @example\n * ```typescript\n * const obj = { meta: { title: 'My Title' } }\n * getNestedValue(obj, 'meta.title') // 'My Title'\n * ```\n */\nexport function getNestedValue(\n obj: Record<string, unknown>,\n path: string\n): unknown {\n const keys = path.split('.')\n let current: unknown = obj\n\n for (const key of keys) {\n if (current === null || current === undefined) {\n return undefined\n }\n if (typeof current !== 'object') {\n return undefined\n }\n current = (current as Record<string, unknown>)[key]\n }\n\n return current\n}\n\n/**\n * Merge mappings, with custom mappings taking precedence over defaults\n *\n * @param customMappings - Custom mappings to merge with defaults\n * @returns Merged array of mappings with duplicates resolved (custom wins)\n */\nexport function mergeMappings(\n customMappings?: RootPropsMapping[]\n): RootPropsMapping[] {\n if (!customMappings || customMappings.length === 0) {\n return DEFAULT_ROOT_PROPS_MAPPINGS\n }\n\n // Create a map to track unique mappings by 'from' field\n const mappingMap = new Map<string, RootPropsMapping>()\n\n // Add defaults first\n for (const mapping of DEFAULT_ROOT_PROPS_MAPPINGS) {\n mappingMap.set(mapping.from, mapping)\n }\n\n // Custom mappings override defaults\n for (const mapping of customMappings) {\n mappingMap.set(mapping.from, mapping)\n }\n\n return Array.from(mappingMap.values())\n}\n\n/**\n * Map Puck root.props to Payload field update data\n *\n * Takes the root.props from Puck data and maps them to the appropriate\n * Payload fields based on the provided mappings.\n *\n * @param rootProps - The root.props object from Puck data\n * @param customMappings - Optional custom mappings to merge with defaults\n * @returns Object ready to be spread into Payload update data\n *\n * @example\n * ```typescript\n * const rootProps = {\n * title: 'My Page',\n * metaTitle: 'My Page | Site Name',\n * metaDescription: 'Description here',\n * }\n *\n * const updateData = mapRootPropsToPayloadFields(rootProps)\n * // Result: {\n * // title: 'My Page',\n * // meta: {\n * // title: 'My Page | Site Name',\n * // description: 'Description here',\n * // },\n * // }\n * ```\n */\nexport function mapRootPropsToPayloadFields(\n rootProps: Record<string, unknown>,\n customMappings?: RootPropsMapping[]\n): Record<string, unknown> {\n const mappings = mergeMappings(customMappings)\n const result: Record<string, unknown> = {}\n\n for (const mapping of mappings) {\n const value = rootProps[mapping.from]\n\n // Skip undefined values to avoid overwriting existing data\n if (value === undefined) {\n continue\n }\n\n // Apply transformation if provided\n const transformedValue = mapping.transform ? mapping.transform(value) : value\n\n // Set the value at the target path\n setNestedValue(result, mapping.to, transformedValue)\n }\n\n return result\n}\n\n/**\n * Deep merge objects, with source values overwriting target values\n *\n * @param target - The target object to merge into\n * @param source - The source object to merge from\n * @returns The merged object (target is modified in place)\n */\nexport function deepMerge(\n target: Record<string, unknown>,\n source: Record<string, unknown>\n): Record<string, unknown> {\n for (const key of Object.keys(source)) {\n const sourceValue = source[key]\n const targetValue = target[key]\n\n if (\n sourceValue !== null &&\n typeof sourceValue === 'object' &&\n !Array.isArray(sourceValue) &&\n targetValue !== null &&\n typeof targetValue === 'object' &&\n !Array.isArray(targetValue)\n ) {\n // Recursively merge nested objects\n target[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>\n )\n } else {\n // Direct assignment for non-object values or arrays\n target[key] = sourceValue\n }\n }\n\n return target\n}\n\n/**\n * Map Payload document fields to Puck root.props format\n *\n * This is the reverse of mapRootPropsToPayloadFields. It takes a Payload\n * document and extracts the fields that should be synced to root.props\n * when loading the editor.\n *\n * @param doc - The Payload document\n * @param customMappings - Optional custom mappings to merge with defaults\n * @returns Object with root.props field names and values\n *\n * @example\n * ```typescript\n * const page = { title: 'My Page', isHomepage: true, meta: { title: 'SEO Title' } }\n * const rootProps = mapPayloadFieldsToRootProps(page)\n * // Result: { title: 'My Page', isHomepage: true, metaTitle: 'SEO Title' }\n * ```\n */\nexport function mapPayloadFieldsToRootProps(\n doc: Record<string, unknown>,\n customMappings?: RootPropsMapping[]\n): Record<string, unknown> {\n const mappings = mergeMappings(customMappings)\n const result: Record<string, unknown> = {}\n\n for (const mapping of mappings) {\n // Get value from Payload field (supports dot notation for nested fields)\n const value = getNestedValue(doc, mapping.to)\n\n // Skip undefined values\n if (value === undefined) {\n continue\n }\n\n // Set the value using the root.props field name\n result[mapping.from] = value\n }\n\n return result\n}\n"],"names":["DEFAULT_ROOT_PROPS_MAPPINGS","from","to","setNestedValue","obj","path","value","keys","split","current","i","length","key","finalKey","getNestedValue","undefined","mergeMappings","customMappings","mappingMap","Map","mapping","set","Array","values","mapRootPropsToPayloadFields","rootProps","mappings","result","transformedValue","transform","deepMerge","target","source","Object","sourceValue","targetValue","isArray","mapPayloadFieldsToRootProps","doc"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Templates.d.ts","sourceRoot":"","sources":["../../src/collections/Templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,gBAsDjC,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/collections/Templates.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\n/**\n * Templates Collection - Stores reusable Puck component configurations\n *\n * This collection stores serialized Puck component data that can be\n * loaded into Template components for reuse across pages.\n */\nexport const TemplatesCollection: CollectionConfig = {\n slug: 'puck-templates',\n admin: {\n useAsTitle: 'name',\n group: 'Puck',\n defaultColumns: ['name', 'category', 'updatedAt'],\n description: 'Reusable component templates for the visual editor',\n },\n access: {\n read: () => true,\n create: ({ req }) => !!req.user,\n update: ({ req }) => !!req.user,\n delete: ({ req }) => !!req.user,\n },\n fields: [\n {\n name: 'name',\n type: 'text',\n required: true,\n admin: {\n description: 'A descriptive name for this template',\n },\n },\n {\n name: 'description',\n type: 'textarea',\n admin: {\n description: 'Optional description of what this template contains',\n },\n },\n {\n name: 'category',\n type: 'text',\n admin: {\n description: 'Category for organizing templates (e.g., \"Hero\", \"Footer\", \"CTA\")',\n },\n },\n {\n name: 'content',\n type: 'json',\n required: true,\n admin: {\n description: 'Serialized Puck component data',\n },\n },\n {\n name: 'thumbnail',\n type: 'text',\n admin: {\n description: 'Optional thumbnail URL for template preview',\n },\n },\n ],\n timestamps: true,\n}\n"],"names":["TemplatesCollection","slug","admin","useAsTitle","group","defaultColumns","description","access","read","create","req","user","update","delete","fields","name","type","required","timestamps"],"mappings":"AAEA;;;;;CAKC,GACD,OAAO,MAAMA,sBAAwC;IACnDC,MAAM;IACNC,OAAO;QACLC,YAAY;QACZC,OAAO;QACPC,gBAAgB;YAAC;YAAQ;YAAY;SAAY;QACjDC,aAAa;IACf;IACAC,QAAQ;QACNC,MAAM,IAAM;QACZC,QAAQ,CAAC,EAAEC,GAAG,EAAE,GAAK,CAAC,CAACA,IAAIC,IAAI;QAC/BC,QAAQ,CAAC,EAAEF,GAAG,EAAE,GAAK,CAAC,CAACA,IAAIC,IAAI;QAC/BE,QAAQ,CAAC,EAAEH,GAAG,EAAE,GAAK,CAAC,CAACA,IAAIC,IAAI;IACjC;IACAG,QAAQ;QACN;YACEC,MAAM;YACNC,MAAM;YACNC,UAAU;YACVf,OAAO;gBACLI,aAAa;YACf;QACF;QACA;YACES,MAAM;YACNC,MAAM;YACNd,OAAO;gBACLI,aAAa;YACf;QACF;QACA;YACES,MAAM;YACNC,MAAM;YACNd,OAAO;gBACLI,aAAa;YACf;QACF;QACA;YACES,MAAM;YACNC,MAAM;YACNC,UAAU;YACVf,OAAO;gBACLI,aAAa;YACf;QACF;QACA;YACES,MAAM;YACNC,MAAM;YACNd,OAAO;gBACLI,aAAa;YACf;QACF;KACD;IACDY,YAAY;AACd,EAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AccordionClient.d.ts","sourceRoot":"","sources":["../../src/components/AccordionClient.tsx"],"names":[],"mappings":"AAWA,OAAO,EAQL,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,UAAU,EAChB,MAAM,qBAAqB,CAAA;AAG5B,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,iBAAiB,EAAE,CAAA;IAC1B,aAAa,EAAE,OAAO,CAAA;IACtB,SAAS,EAAE,UAAU,GAAG,IAAI,CAAA;IAC5B,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;IAC3B,UAAU,EAAE,eAAe,GAAG,IAAI,CAAA;IAClC,UAAU,EAAE,eAAe,GAAG,IAAI,CAAA;IAClC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAA;IAChC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAA;IAChC,aAAa,EAAE,YAAY,GAAG,IAAI,CAAA;CACnC;AAiDD,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,aAAa,EACb,SAAS,EACT,MAAM,EACN,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,aAAa,GACd,EAAE,oBAAoB,+BAiFtB"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/AccordionClient.tsx"],"sourcesContent":["'use client'\n\n/**\n * AccordionClient - Client component for accordion interactivity\n *\n * This is the actual interactive accordion that uses useState.\n * Imported by the server-safe AccordionConfig to enable client-side expansion.\n */\n\nimport { useState } from 'react'\nimport { ChevronDown } from 'lucide-react'\nimport {\n marginValueToCSS,\n paddingValueToCSS,\n dimensionsValueToCSS,\n backgroundValueToCSS,\n transformValueToCSS,\n colorValueToCSS,\n cn,\n type PaddingValue,\n type DimensionsValue,\n type BackgroundValue,\n type AnimationValue,\n type TransformValue,\n type ColorValue,\n} from '../fields/shared.js'\nimport { AnimatedWrapper } from './AnimatedWrapper.js'\n\ninterface AccordionItemData {\n title: string\n content: string\n defaultOpen: boolean\n}\n\nexport interface AccordionClientProps {\n items: AccordionItemData[]\n allowMultiple: boolean\n textColor: ColorValue | null\n margin: PaddingValue | null\n background: BackgroundValue | null\n dimensions: DimensionsValue | null\n transform: TransformValue | null\n animation: AnimationValue | null\n customPadding: PaddingValue | null\n}\n\n// Accordion Item Component\nfunction AccordionItem({\n item,\n isOpen,\n onToggle,\n textColorCSS,\n}: {\n item: AccordionItemData\n isOpen: boolean\n onToggle: () => void\n textColorCSS?: string\n}) {\n const textStyle: React.CSSProperties = textColorCSS ? { color: textColorCSS } : {}\n\n return (\n <div className=\"border-b border-border last:border-b-0\">\n <button\n type=\"button\"\n onClick={onToggle}\n className=\"flex w-full items-center justify-between py-4 px-4 text-left font-medium transition-all hover:bg-muted/50 text-foreground\"\n style={textStyle}\n >\n <span>{item.title}</span>\n <ChevronDown\n className={cn(\n 'h-4 w-4 shrink-0 transition-transform duration-200',\n isOpen && 'rotate-180'\n )}\n />\n </button>\n <div\n className={cn(\n 'overflow-hidden transition-all duration-200',\n isOpen ? 'max-h-[1000px] opacity-100' : 'max-h-0 opacity-0'\n )}\n >\n <div\n className=\"px-4 pb-4 text-muted-foreground\"\n style={textColorCSS ? { color: textColorCSS } : undefined}\n >\n {item.content}\n </div>\n </div>\n </div>\n )\n}\n\nexport function AccordionClient({\n items,\n allowMultiple,\n textColor,\n margin,\n background,\n dimensions,\n transform,\n animation,\n customPadding,\n}: AccordionClientProps) {\n // Initialize open states from defaultOpen values\n const [openItems, setOpenItems] = useState<Set<number>>(() => {\n const initialOpen = new Set<number>()\n items?.forEach((item, index) => {\n if (item.defaultOpen) {\n initialOpen.add(index)\n }\n })\n return initialOpen\n })\n\n const handleToggle = (index: number) => {\n setOpenItems((prev) => {\n const newSet = new Set(prev)\n if (newSet.has(index)) {\n newSet.delete(index)\n } else {\n if (!allowMultiple) {\n newSet.clear()\n }\n newSet.add(index)\n }\n return newSet\n })\n }\n\n const textColorCSS = colorValueToCSS(textColor)\n const dimensionsStyles = dimensionsValueToCSS(dimensions)\n\n // Theme-aware classes - uses CSS variables for colors\n const accordionClasses = 'rounded-lg border border-border overflow-hidden bg-card'\n\n const backgroundStyles = backgroundValueToCSS(background)\n // Only apply background styles if explicitly set, otherwise let bg-card handle it\n const accordionStyle: React.CSSProperties = backgroundStyles && Object.keys(backgroundStyles).length > 0\n ? backgroundStyles\n : {}\n\n const marginCSS = marginValueToCSS(margin)\n const paddingCSS = paddingValueToCSS(customPadding)\n const transformStyles = transformValueToCSS(transform)\n\n const style: React.CSSProperties = {\n ...dimensionsStyles,\n ...(marginCSS ? { margin: marginCSS } : {}),\n ...(paddingCSS ? { padding: paddingCSS } : {}),\n ...transformStyles,\n }\n\n if (!items || items.length === 0) {\n return (\n <AnimatedWrapper animation={animation}>\n <div style={Object.keys(style).length > 0 ? style : undefined}>\n <div className={accordionClasses} style={accordionStyle}>\n <div className=\"p-4 text-center text-muted-foreground\">\n No accordion items. Add items in the editor.\n </div>\n </div>\n </div>\n </AnimatedWrapper>\n )\n }\n\n return (\n <AnimatedWrapper animation={animation}>\n <div style={Object.keys(style).length > 0 ? style : undefined}>\n <div className={accordionClasses} style={accordionStyle}>\n {items.map((item, index) => (\n <AccordionItem\n key={index}\n item={item}\n isOpen={openItems.has(index)}\n onToggle={() => handleToggle(index)}\n textColorCSS={textColorCSS}\n />\n ))}\n </div>\n </div>\n </AnimatedWrapper>\n )\n}\n"],"names":["useState","ChevronDown","marginValueToCSS","paddingValueToCSS","dimensionsValueToCSS","backgroundValueToCSS","transformValueToCSS","colorValueToCSS","cn","AnimatedWrapper","AccordionItem","item","isOpen","onToggle","textColorCSS","textStyle","color","div","className","button","type","onClick","style","span","title","undefined","content","AccordionClient","items","allowMultiple","textColor","margin","background","dimensions","transform","animation","customPadding","openItems","setOpenItems","initialOpen","Set","forEach","index","defaultOpen","add","handleToggle","prev","newSet","has","delete","clear","dimensionsStyles","accordionClasses","backgroundStyles","accordionStyle","Object","keys","length","marginCSS","paddingCSS","transformStyles","padding","map"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AnimatedWrapper.d.ts","sourceRoot":"","sources":["../../src/components/AnimatedWrapper.tsx"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAElE,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAA;AAE5B,MAAM,WAAW,oBAAoB;IACnC,iDAAiD;IACjD,SAAS,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,CAAA;IAC5C,+BAA+B;IAC/B,QAAQ,EAAE,SAAS,CAAA;IACnB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,oBAAoB;IACpB,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,iDAAiD;IACjD,EAAE,CAAC,EAAE,WAAW,CAAA;CACjB;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,QAAQ,EACR,SAAS,EACT,KAAK,EACL,EAAE,EAAE,SAAiB,GACtB,EAAE,oBAAoB,+BAuEtB"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/AnimatedWrapper.tsx"],"sourcesContent":["'use client'\n\n/**\n * AnimatedWrapper - Client component for scroll-triggered animations\n *\n * Wraps children with animation support using IntersectionObserver.\n * Handles both preset entrance animations and custom transitions.\n * Supports 27 animation presets with customizable intensity, easing, and origin.\n */\n\nimport type { ReactNode, CSSProperties, ElementType } from 'react'\nimport { useScrollAnimation } from '../hooks/useScrollAnimation.js'\nimport {\n getEntranceAnimationStyles,\n animationValueToCSS,\n type AnimationValue,\n} from '../fields/shared.js'\n\nexport interface AnimatedWrapperProps {\n /** Animation configuration from the component */\n animation: AnimationValue | null | undefined\n /** Child content to animate */\n children: ReactNode\n /** Additional CSS classes */\n className?: string\n /** Inline styles */\n style?: CSSProperties\n /** HTML element to render as (default: 'div') */\n as?: ElementType\n}\n\n/**\n * Wraps children with scroll-triggered animation support.\n *\n * For preset animations: Applies initial/animate inline styles\n * when element enters viewport.\n *\n * For custom animations: Applies CSS transition properties.\n *\n * If no animation is set, renders children without a wrapper div.\n */\nexport function AnimatedWrapper({\n animation,\n children,\n className,\n style,\n as: Component = 'div',\n}: AnimatedWrapperProps) {\n // Check if animation should be applied\n const hasAnimation = animation && (\n (animation.mode === 'preset' && animation.entrance && animation.entrance !== 'none') ||\n animation.mode === 'custom'\n )\n\n // If no animation, render children directly without wrapper\n if (!hasAnimation) {\n // If there's a className or style, we still need to wrap\n if (className || style) {\n return <Component className={className} style={style}>{children}</Component>\n }\n return <>{children}</>\n }\n\n // Use the scroll animation hook\n const { ref, isInView } = useScrollAnimation({\n triggerOnScroll: animation.triggerOnScroll ?? true,\n threshold: animation.triggerThreshold ?? 0.1,\n once: animation.triggerOnce ?? true,\n rootMargin: animation.triggerMargin,\n })\n\n // Handle preset entrance animations\n if (animation.mode === 'preset') {\n const { initial, animate, duration, delay, easing, origin } = getEntranceAnimationStyles(animation)\n\n // Apply initial or animate styles based on visibility\n const animationStyles = isInView ? animate : initial\n\n // Build transition string with all relevant properties\n const transitionProperties = [\n `opacity ${duration}ms ${easing} ${delay}ms`,\n `transform ${duration}ms ${easing} ${delay}ms`,\n `filter ${duration}ms ${easing} ${delay}ms`,\n ].join(', ')\n\n return (\n <Component\n ref={ref}\n className={className}\n style={{\n ...style,\n ...animationStyles,\n transition: transitionProperties,\n transformOrigin: origin,\n }}\n >\n {children}\n </Component>\n )\n }\n\n // Handle custom transition mode\n const customStyles = animationValueToCSS(animation)\n\n return (\n <Component\n ref={ref}\n className={className}\n style={{\n ...style,\n ...customStyles,\n // Apply opacity for visibility-based transitions\n opacity: isInView ? 1 : 0,\n }}\n >\n {children}\n </Component>\n )\n}\n"],"names":["useScrollAnimation","getEntranceAnimationStyles","animationValueToCSS","AnimatedWrapper","animation","children","className","style","as","Component","hasAnimation","mode","entrance","ref","isInView","triggerOnScroll","threshold","triggerThreshold","once","triggerOnce","rootMargin","triggerMargin","initial","animate","duration","delay","easing","origin","animationStyles","transitionProperties","join","transition","transformOrigin","customStyles","opacity"],"mappings":"AAAA;;AAWA,SAASA,kBAAkB,QAAQ,iCAAgC;AACnE,SACEC,0BAA0B,EAC1BC,mBAAmB,QAEd,sBAAqB;AAe5B;;;;;;;;;CASC,GACD,OAAO,SAASC,gBAAgB,EAC9BC,SAAS,EACTC,QAAQ,EACRC,SAAS,EACTC,KAAK,EACLC,IAAIC,YAAY,KAAK,EACA;IACrB,uCAAuC;IACvC,MAAMC,eAAeN,aACnB,CAAA,AAACA,UAAUO,IAAI,KAAK,YAAYP,UAAUQ,QAAQ,IAAIR,UAAUQ,QAAQ,KAAK,UAC7ER,UAAUO,IAAI,KAAK,QAAO;IAG5B,4DAA4D;IAC5D,IAAI,CAACD,cAAc;QACjB,yDAAyD;QACzD,IAAIJ,aAAaC,OAAO;YACtB,qBAAO,KAACE;gBAAUH,WAAWA;gBAAWC,OAAOA;0BAAQF;;QACzD;QACA,qBAAO;sBAAGA;;IACZ;IAEA,gCAAgC;IAChC,MAAM,EAAEQ,GAAG,EAAEC,QAAQ,EAAE,GAAGd,mBAAmB;QAC3Ce,iBAAiBX,UAAUW,eAAe,IAAI;QAC9CC,WAAWZ,UAAUa,gBAAgB,IAAI;QACzCC,MAAMd,UAAUe,WAAW,IAAI;QAC/BC,YAAYhB,UAAUiB,aAAa;IACrC;IAEA,oCAAoC;IACpC,IAAIjB,UAAUO,IAAI,KAAK,UAAU;QAC/B,MAAM,EAAEW,OAAO,EAAEC,OAAO,EAAEC,QAAQ,EAAEC,KAAK,EAAEC,MAAM,EAAEC,MAAM,EAAE,GAAG1B,2BAA2BG;QAEzF,sDAAsD;QACtD,MAAMwB,kBAAkBd,WAAWS,UAAUD;QAE7C,uDAAuD;QACvD,MAAMO,uBAAuB;YAC3B,CAAC,QAAQ,EAAEL,SAAS,GAAG,EAAEE,OAAO,CAAC,EAAED,MAAM,EAAE,CAAC;YAC5C,CAAC,UAAU,EAAED,SAAS,GAAG,EAAEE,OAAO,CAAC,EAAED,MAAM,EAAE,CAAC;YAC9C,CAAC,OAAO,EAAED,SAAS,GAAG,EAAEE,OAAO,CAAC,EAAED,MAAM,EAAE,CAAC;SAC5C,CAACK,IAAI,CAAC;QAEP,qBACE,KAACrB;YACCI,KAAKA;YACLP,WAAWA;YACXC,OAAO;gBACL,GAAGA,KAAK;gBACR,GAAGqB,eAAe;gBAClBG,YAAYF;gBACZG,iBAAiBL;YACnB;sBAECtB;;IAGP;IAEA,gCAAgC;IAChC,MAAM4B,eAAe/B,oBAAoBE;IAEzC,qBACE,KAACK;QACCI,KAAKA;QACLP,WAAWA;QACXC,OAAO;YACL,GAAGA,KAAK;YACR,GAAG0B,YAAY;YACf,iDAAiD;YACjDC,SAASpB,WAAW,IAAI;QAC1B;kBAECT;;AAGP"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"exports.d.ts","sourceRoot":"","sources":["../../src/components/exports.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAOH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAGrD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAA;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAGhE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAG9C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAS5D,OAAO,EAAE,eAAe,IAAI,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACvF,OAAO,EAAE,UAAU,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AACxE,OAAO,EAAE,UAAU,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AACxE,OAAO,EAAE,aAAa,IAAI,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AACjF,OAAO,EAAE,YAAY,IAAI,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAGlE,OAAO,EAAE,aAAa,IAAI,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AACrF,OAAO,EAAE,UAAU,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAC5E,OAAO,EAAE,cAAc,IAAI,oBAAoB,EAAE,MAAM,iCAAiC,CAAA;AAGxF,OAAO,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAG1E,OAAO,EAAE,YAAY,IAAI,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AACnF,OAAO,EAAE,UAAU,IAAI,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAC7E,OAAO,EAAE,aAAa,IAAI,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AACtF,OAAO,EAAE,eAAe,IAAI,qBAAqB,EAAE,MAAM,mCAAmC,CAAA;AAM5F,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/exports.ts"],"sourcesContent":["'use client'\n\n/**\n * Individual component config exports\n *\n * This module exports individual Puck component configurations so users can\n * cherry-pick components for their custom configs.\n *\n * @example\n * ```tsx\n * import {\n * SectionConfig,\n * HeadingConfig,\n * TextConfig,\n * } from '@delmaredigital/payload-puck/components'\n *\n * export const myConfig: Config = {\n * components: {\n * Section: SectionConfig,\n * Heading: HeadingConfig,\n * Text: TextConfig,\n * },\n * // ...\n * }\n * ```\n */\n\n// =============================================================================\n// Editor Component Configs (for Puck Editor)\n// =============================================================================\n\n// Layout components\nexport { ContainerConfig } from './layout/Container.js'\nexport { FlexConfig } from './layout/Flex.js'\nexport { GridConfig } from './layout/Grid.js'\nexport { SectionConfig } from './layout/Section.js'\nexport { SpacerConfig } from './layout/Spacer.js'\nexport { TemplateConfig } from './layout/Template.js'\n\n// Typography components\nexport { HeadingConfig } from './typography/Heading.js'\nexport { TextConfig } from './typography/Text.js'\nexport { RichTextEditorConfig } from './typography/RichText.editor.js'\nexport { RichTextConfig } from './typography/RichText.server.js'\n\n// Media components\nexport { ImageConfig } from './media/Image.js'\n\n// Interactive components\nexport { ButtonConfig } from './interactive/Button.js'\nexport { CardConfig } from './interactive/Card.js'\nexport { DividerConfig } from './interactive/Divider.js'\nexport { AccordionConfig } from './interactive/Accordion.js'\n\n// =============================================================================\n// Server Component Configs (for PageRenderer)\n// =============================================================================\n// These are SSR-safe variants without client-side interactivity.\n// Use these when building a custom baseConfig for PageRenderer.\n\n// Layout components (server)\nexport { ContainerConfig as ContainerServerConfig } from './layout/Container.server.js'\nexport { FlexConfig as FlexServerConfig } from './layout/Flex.server.js'\nexport { GridConfig as GridServerConfig } from './layout/Grid.server.js'\nexport { SectionConfig as SectionServerConfig } from './layout/Section.server.js'\nexport { SpacerConfig as SpacerServerConfig } from './layout/Spacer.server.js'\nexport { TemplateServerConfig } from './layout/Template.server.js'\n\n// Typography components (server)\nexport { HeadingConfig as HeadingServerConfig } from './typography/Heading.server.js'\nexport { TextConfig as TextServerConfig } from './typography/Text.server.js'\nexport { RichTextConfig as RichTextServerConfig } from './typography/RichText.server.js'\n\n// Media components (server)\nexport { ImageConfig as ImageServerConfig } from './media/Image.server.js'\n\n// Interactive components (server)\nexport { ButtonConfig as ButtonServerConfig } from './interactive/Button.server.js'\nexport { CardConfig as CardServerConfig } from './interactive/Card.server.js'\nexport { DividerConfig as DividerServerConfig } from './interactive/Divider.server.js'\nexport { AccordionConfig as AccordionServerConfig } from './interactive/Accordion.server.js'\n\n// =============================================================================\n// Animation Components\n// =============================================================================\n\nexport { AnimatedWrapper, type AnimatedWrapperProps } from './AnimatedWrapper.js'\n"],"names":["ContainerConfig","FlexConfig","GridConfig","SectionConfig","SpacerConfig","TemplateConfig","HeadingConfig","TextConfig","RichTextEditorConfig","RichTextConfig","ImageConfig","ButtonConfig","CardConfig","DividerConfig","AccordionConfig","ContainerServerConfig","FlexServerConfig","GridServerConfig","SectionServerConfig","SpacerServerConfig","TemplateServerConfig","HeadingServerConfig","TextServerConfig","RichTextServerConfig","ImageServerConfig","ButtonServerConfig","CardServerConfig","DividerServerConfig","AccordionServerConfig","AnimatedWrapper"],"mappings":"AAAA;AAEA;;;;;;;;;;;;;;;;;;;;;;;CAuBC,GAED,gFAAgF;AAChF,6CAA6C;AAC7C,gFAAgF;AAEhF,oBAAoB;AACpB,SAASA,eAAe,QAAQ,wBAAuB;AACvD,SAASC,UAAU,QAAQ,mBAAkB;AAC7C,SAASC,UAAU,QAAQ,mBAAkB;AAC7C,SAASC,aAAa,QAAQ,sBAAqB;AACnD,SAASC,YAAY,QAAQ,qBAAoB;AACjD,SAASC,cAAc,QAAQ,uBAAsB;AAErD,wBAAwB;AACxB,SAASC,aAAa,QAAQ,0BAAyB;AACvD,SAASC,UAAU,QAAQ,uBAAsB;AACjD,SAASC,oBAAoB,QAAQ,kCAAiC;AACtE,SAASC,cAAc,QAAQ,kCAAiC;AAEhE,mBAAmB;AACnB,SAASC,WAAW,QAAQ,mBAAkB;AAE9C,yBAAyB;AACzB,SAASC,YAAY,QAAQ,0BAAyB;AACtD,SAASC,UAAU,QAAQ,wBAAuB;AAClD,SAASC,aAAa,QAAQ,2BAA0B;AACxD,SAASC,eAAe,QAAQ,6BAA4B;AAE5D,gFAAgF;AAChF,8CAA8C;AAC9C,gFAAgF;AAChF,iEAAiE;AACjE,gEAAgE;AAEhE,6BAA6B;AAC7B,SAASd,mBAAmBe,qBAAqB,QAAQ,+BAA8B;AACvF,SAASd,cAAce,gBAAgB,QAAQ,0BAAyB;AACxE,SAASd,cAAce,gBAAgB,QAAQ,0BAAyB;AACxE,SAASd,iBAAiBe,mBAAmB,QAAQ,6BAA4B;AACjF,SAASd,gBAAgBe,kBAAkB,QAAQ,4BAA2B;AAC9E,SAASC,oBAAoB,QAAQ,8BAA6B;AAElE,iCAAiC;AACjC,SAASd,iBAAiBe,mBAAmB,QAAQ,iCAAgC;AACrF,SAASd,cAAce,gBAAgB,QAAQ,8BAA6B;AAC5E,SAASb,kBAAkBc,oBAAoB,QAAQ,kCAAiC;AAExF,4BAA4B;AAC5B,SAASb,eAAec,iBAAiB,QAAQ,0BAAyB;AAE1E,kCAAkC;AAClC,SAASb,gBAAgBc,kBAAkB,QAAQ,iCAAgC;AACnF,SAASb,cAAcc,gBAAgB,QAAQ,+BAA8B;AAC7E,SAASb,iBAAiBc,mBAAmB,QAAQ,kCAAiC;AACtF,SAASb,mBAAmBc,qBAAqB,QAAQ,oCAAmC;AAE5F,gFAAgF;AAChF,uBAAuB;AACvB,gFAAgF;AAEhF,SAASC,eAAe,QAAmC,uBAAsB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,mBAAmB,CAAA;AAGjC,cAAc,uBAAuB,CAAA;AAGrC,cAAc,kBAAkB,CAAA;AAGhC,cAAc,wBAAwB,CAAA;AAGtC,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/index.ts"],"sourcesContent":["/**\n * Puck Component Configurations\n *\n * All component configs for the Puck visual page builder.\n */\n\n// Layout Components\nexport * from './layout/index.js'\n\n// Typography Components\nexport * from './typography/index.js'\n\n// Media Components\nexport * from './media/index.js'\n\n// Interactive Components\nexport * from './interactive/index.js'\n\n// Animation\nexport { AnimatedWrapper, type AnimatedWrapperProps } from './AnimatedWrapper.js'\n"],"names":["AnimatedWrapper"],"mappings":"AAAA;;;;CAIC,GAED,oBAAoB;AACpB,cAAc,oBAAmB;AAEjC,wBAAwB;AACxB,cAAc,wBAAuB;AAErC,mBAAmB;AACnB,cAAc,mBAAkB;AAEhC,yBAAyB;AACzB,cAAc,yBAAwB;AAEtC,YAAY;AACZ,SAASA,eAAe,QAAmC,uBAAsB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Accordion.d.ts","sourceRoot":"","sources":["../../../src/components/interactive/Accordion.tsx"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAGvD,OAAO,EAQL,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,UAAU,EAChB,MAAM,wBAAwB,CAAA;AAW/B,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,OAAO,CAAA;CACrB;AA0KD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,iBAAiB,EAAE,CAAA;IAC1B,aAAa,EAAE,OAAO,CAAA;IACtB,SAAS,EAAE,UAAU,GAAG,IAAI,CAAA;IAC5B,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;IAC3B,UAAU,EAAE,eAAe,GAAG,IAAI,CAAA;IAClC,UAAU,EAAE,eAAe,GAAG,IAAI,CAAA;IAClC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAA;IAChC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAA;IAChC,aAAa,EAAE,YAAY,GAAG,IAAI,CAAA;CACnC;AAyBD,eAAO,MAAM,eAAe,EAAE,eA+D7B,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components/interactive/Accordion.tsx"],"sourcesContent":["'use client'\n\n/**\n * Accordion Component - Puck Configuration\n *\n * Expandable sections with collapsible content.\n * Uses plain HTML/CSS for the accordion behavior.\n * Supports custom margin for spacing control.\n */\n\nimport type { ComponentConfig } from '@puckeditor/core'\nimport { useState } from 'react'\nimport { ChevronDown } from 'lucide-react'\nimport {\n marginValueToCSS,\n paddingValueToCSS,\n dimensionsValueToCSS,\n backgroundValueToCSS,\n transformValueToCSS,\n colorValueToCSS,\n cn,\n type PaddingValue,\n type DimensionsValue,\n type BackgroundValue,\n type AnimationValue,\n type TransformValue,\n type ColorValue,\n} from '../../fields/shared.js'\nimport { AnimatedWrapper } from '../AnimatedWrapper.js'\nimport { createMarginField } from '../../fields/MarginField.js'\nimport { createPaddingField } from '../../fields/PaddingField.js'\nimport { createDimensionsField } from '../../fields/DimensionsField.js'\nimport { createResetField } from '../../fields/ResetField.js'\nimport { createBackgroundField } from '../../fields/BackgroundField.js'\nimport { createAnimationField } from '../../fields/AnimationField.js'\nimport { createTransformField } from '../../fields/TransformField.js'\nimport { createColorPickerField } from '../../fields/ColorPickerField.js'\n\ninterface AccordionItemData {\n title: string\n content: string\n defaultOpen: boolean\n}\n\ninterface AccordionRendererProps {\n items: AccordionItemData[]\n allowMultiple: boolean\n textColor: ColorValue | null\n margin: PaddingValue | null\n background: BackgroundValue | null\n dimensions: DimensionsValue | null\n transform: TransformValue | null\n animation: AnimationValue | null\n customPadding: PaddingValue | null\n}\n\n// Accordion Item Component\nfunction AccordionItem({\n item,\n isOpen,\n onToggle,\n textColorCSS,\n}: {\n item: AccordionItemData\n isOpen: boolean\n onToggle: () => void\n textColorCSS?: string\n}) {\n const textStyle: React.CSSProperties = textColorCSS ? { color: textColorCSS } : {}\n\n return (\n <div className=\"border-b border-border last:border-b-0\">\n <button\n type=\"button\"\n onClick={onToggle}\n className=\"flex w-full items-center justify-between py-4 px-4 text-left font-medium transition-all hover:bg-muted/50 text-foreground\"\n style={textStyle}\n >\n <span>{item.title}</span>\n <ChevronDown\n className={cn(\n 'h-4 w-4 shrink-0 transition-transform duration-200',\n isOpen && 'rotate-180'\n )}\n />\n </button>\n <div\n className={cn(\n 'overflow-hidden transition-all duration-200',\n isOpen ? 'max-h-[1000px] opacity-100' : 'max-h-0 opacity-0'\n )}\n >\n <div\n className=\"px-4 pb-4 text-muted-foreground\"\n style={textColorCSS ? { color: textColorCSS } : undefined}\n >\n {item.content}\n </div>\n </div>\n </div>\n )\n}\n\n// Main Accordion Render Component\nfunction AccordionRenderer({\n items,\n allowMultiple,\n textColor,\n margin,\n background,\n dimensions,\n transform,\n animation,\n customPadding,\n}: AccordionRendererProps) {\n // Initialize open states from defaultOpen values\n const [openItems, setOpenItems] = useState<Set<number>>(() => {\n const initialOpen = new Set<number>()\n items?.forEach((item, index) => {\n if (item.defaultOpen) {\n initialOpen.add(index)\n }\n })\n return initialOpen\n })\n\n const handleToggle = (index: number) => {\n setOpenItems((prev) => {\n const newSet = new Set(prev)\n if (newSet.has(index)) {\n newSet.delete(index)\n } else {\n if (!allowMultiple) {\n newSet.clear()\n }\n newSet.add(index)\n }\n return newSet\n })\n }\n\n const textColorCSS = colorValueToCSS(textColor)\n const dimensionsStyles = dimensionsValueToCSS(dimensions)\n\n // Theme-aware classes - uses CSS variables for colors\n const accordionClasses = 'rounded-lg border border-border overflow-hidden bg-card'\n\n const backgroundStyles = backgroundValueToCSS(background)\n // Only apply background styles if explicitly set, otherwise let bg-card handle it\n const accordionStyle: React.CSSProperties = backgroundStyles && Object.keys(backgroundStyles).length > 0\n ? backgroundStyles\n : {}\n\n const style: React.CSSProperties = {\n ...dimensionsStyles,\n }\n const marginCSS = marginValueToCSS(margin)\n if (marginCSS) {\n style.margin = marginCSS\n }\n const paddingCSS = paddingValueToCSS(customPadding)\n if (paddingCSS) {\n style.padding = paddingCSS\n }\n const transformStyles = transformValueToCSS(transform)\n if (transformStyles) {\n Object.assign(style, transformStyles)\n }\n\n if (!items || items.length === 0) {\n return (\n <AnimatedWrapper animation={animation}>\n <div style={Object.keys(style).length > 0 ? style : undefined}>\n <div className={accordionClasses} style={accordionStyle}>\n <div className=\"p-4 text-center text-muted-foreground\">\n No accordion items. Add items in the editor.\n </div>\n </div>\n </div>\n </AnimatedWrapper>\n )\n }\n\n return (\n <AnimatedWrapper animation={animation}>\n <div style={Object.keys(style).length > 0 ? style : undefined}>\n <div className={accordionClasses} style={accordionStyle}>\n {items.map((item, index) => (\n <AccordionItem\n key={index}\n item={item}\n isOpen={openItems.has(index)}\n onToggle={() => handleToggle(index)}\n textColorCSS={textColorCSS}\n />\n ))}\n </div>\n </div>\n </AnimatedWrapper>\n )\n}\n\n// Default padding with standard horizontal spacing (replaces hardcoded px-4)\nconst DEFAULT_PADDING: PaddingValue = {\n top: 0,\n right: 16,\n bottom: 0,\n left: 16,\n unit: 'px',\n linked: false,\n}\n\nexport interface AccordionProps {\n items: AccordionItemData[]\n allowMultiple: boolean\n textColor: ColorValue | null\n margin: PaddingValue | null\n background: BackgroundValue | null\n dimensions: DimensionsValue | null\n transform: TransformValue | null\n animation: AnimationValue | null\n customPadding: PaddingValue | null\n}\n\nconst defaultProps: AccordionProps = {\n items: [\n {\n title: 'What is this?',\n content: 'This is an accordion component that can expand and collapse.',\n defaultOpen: false,\n },\n {\n title: 'How do I use it?',\n content: 'Click on each item to expand or collapse it.',\n defaultOpen: false,\n },\n ],\n allowMultiple: false,\n textColor: null,\n margin: null,\n background: null,\n dimensions: null,\n transform: null,\n animation: null,\n customPadding: DEFAULT_PADDING, // Default 16px horizontal padding, visible in editor\n}\n\nexport const AccordionConfig: ComponentConfig = {\n label: 'Accordion',\n fields: {\n _reset: createResetField({ defaultProps }),\n items: {\n type: 'array',\n label: 'Items',\n arrayFields: {\n title: {\n type: 'text',\n label: 'Title',\n },\n content: {\n type: 'textarea',\n label: 'Content',\n },\n defaultOpen: {\n type: 'radio',\n label: 'Default Open',\n options: [\n { label: 'Yes', value: true },\n { label: 'No', value: false },\n ],\n },\n },\n defaultItemProps: (index: number) => ({\n title: `Accordion Item ${index + 1}`,\n content: '',\n defaultOpen: index === 0,\n }),\n getItemSummary: (item: AccordionItemData) => item.title || 'Untitled',\n },\n allowMultiple: {\n type: 'radio',\n label: 'Allow Multiple Open',\n options: [\n { label: 'Yes', value: true },\n { label: 'No', value: false },\n ],\n },\n textColor: createColorPickerField({ label: 'Text Color' }),\n background: createBackgroundField({ label: 'Background' }),\n dimensions: createDimensionsField({ label: 'Dimensions' }),\n transform: createTransformField({ label: 'Transform' }),\n animation: createAnimationField({ label: 'Animation' }),\n // Spacing (grouped at bottom)\n margin: createMarginField({ label: 'Margin' }),\n customPadding: createPaddingField({ label: 'Padding' }),\n },\n defaultProps,\n render: (props) => (\n <AccordionRenderer\n items={props.items}\n allowMultiple={props.allowMultiple}\n textColor={props.textColor}\n margin={props.margin}\n background={props.background}\n dimensions={props.dimensions}\n transform={props.transform}\n animation={props.animation}\n customPadding={props.customPadding}\n />\n ),\n}\n"],"names":["useState","ChevronDown","marginValueToCSS","paddingValueToCSS","dimensionsValueToCSS","backgroundValueToCSS","transformValueToCSS","colorValueToCSS","cn","AnimatedWrapper","createMarginField","createPaddingField","createDimensionsField","createResetField","createBackgroundField","createAnimationField","createTransformField","createColorPickerField","AccordionItem","item","isOpen","onToggle","textColorCSS","textStyle","color","div","className","button","type","onClick","style","span","title","undefined","content","AccordionRenderer","items","allowMultiple","textColor","margin","background","dimensions","transform","animation","customPadding","openItems","setOpenItems","initialOpen","Set","forEach","index","defaultOpen","add","handleToggle","prev","newSet","has","delete","clear","dimensionsStyles","accordionClasses","backgroundStyles","accordionStyle","Object","keys","length","marginCSS","paddingCSS","padding","transformStyles","assign","map","DEFAULT_PADDING","top","right","bottom","left","unit","linked","defaultProps","AccordionConfig","label","fields","_reset","arrayFields","options","value","defaultItemProps","getItemSummary","render","props"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Accordion.server.d.ts","sourceRoot":"","sources":["../../../src/components/interactive/Accordion.server.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,eAAe,EACf,cAAc,EACd,cAAc,EACd,UAAU,EACX,MAAM,wBAAwB,CAAA;AAG/B,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,iBAAiB,EAAE,CAAA;IAC1B,aAAa,EAAE,OAAO,CAAA;IACtB,SAAS,EAAE,UAAU,GAAG,IAAI,CAAA;IAC5B,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;IAC3B,UAAU,EAAE,eAAe,GAAG,IAAI,CAAA;IAClC,UAAU,EAAE,eAAe,GAAG,IAAI,CAAA;IAClC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAA;IAChC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAA;IAChC,aAAa,EAAE,YAAY,GAAG,IAAI,CAAA;CACnC;AAyBD,eAAO,MAAM,eAAe,EAAE,eAAe,CAAC,cAAc,CAgB3D,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components/interactive/Accordion.server.tsx"],"sourcesContent":["/**\n * Accordion Component - Server-safe Puck Configuration\n *\n * Expandable sections with collapsible content.\n * This version contains only the render function and types - no fields.\n * The render function returns a client component (AccordionClient) that\n * handles the interactive state.\n */\n\nimport type { ComponentConfig } from '@puckeditor/core'\nimport type {\n PaddingValue,\n DimensionsValue,\n BackgroundValue,\n AnimationValue,\n TransformValue,\n ColorValue,\n} from '../../fields/shared.js'\nimport { AccordionClient } from '../AccordionClient.js'\n\ninterface AccordionItemData {\n title: string\n content: string\n defaultOpen: boolean\n}\n\nexport interface AccordionProps {\n items: AccordionItemData[]\n allowMultiple: boolean\n textColor: ColorValue | null\n margin: PaddingValue | null\n background: BackgroundValue | null\n dimensions: DimensionsValue | null\n transform: TransformValue | null\n animation: AnimationValue | null\n customPadding: PaddingValue | null\n}\n\nconst defaultProps: AccordionProps = {\n items: [\n {\n title: 'What is this?',\n content: 'This is an accordion component that can expand and collapse.',\n defaultOpen: false,\n },\n {\n title: 'How do I use it?',\n content: 'Click on each item to expand or collapse it.',\n defaultOpen: false,\n },\n ],\n allowMultiple: false,\n textColor: null,\n margin: null,\n background: null,\n dimensions: null,\n transform: null,\n animation: null,\n customPadding: null,\n}\n\nexport const AccordionConfig: ComponentConfig<AccordionProps> = {\n label: 'Accordion',\n defaultProps,\n render: (props) => (\n <AccordionClient\n items={props.items}\n allowMultiple={props.allowMultiple}\n textColor={props.textColor}\n margin={props.margin}\n background={props.background}\n dimensions={props.dimensions}\n transform={props.transform}\n animation={props.animation}\n customPadding={props.customPadding}\n />\n ),\n}\n"],"names":["AccordionClient","defaultProps","items","title","content","defaultOpen","allowMultiple","textColor","margin","background","dimensions","transform","animation","customPadding","AccordionConfig","label","render","props"],"mappings":"AAAA;;;;;;;CAOC;AAWD,SAASA,eAAe,QAAQ,wBAAuB;AAoBvD,MAAMC,eAA+B;IACnCC,OAAO;QACL;YACEC,OAAO;YACPC,SAAS;YACTC,aAAa;QACf;QACA;YACEF,OAAO;YACPC,SAAS;YACTC,aAAa;QACf;KACD;IACDC,eAAe;IACfC,WAAW;IACXC,QAAQ;IACRC,YAAY;IACZC,YAAY;IACZC,WAAW;IACXC,WAAW;IACXC,eAAe;AACjB;AAEA,OAAO,MAAMC,kBAAmD;IAC9DC,OAAO;IACPd;IACAe,QAAQ,CAACC,sBACP,KAACjB;YACCE,OAAOe,MAAMf,KAAK;YAClBI,eAAeW,MAAMX,aAAa;YAClCC,WAAWU,MAAMV,SAAS;YAC1BC,QAAQS,MAAMT,MAAM;YACpBC,YAAYQ,MAAMR,UAAU;YAC5BC,YAAYO,MAAMP,UAAU;YAC5BC,WAAWM,MAAMN,SAAS;YAC1BC,WAAWK,MAAML,SAAS;YAC1BC,eAAeI,MAAMJ,aAAa;;AAGxC,EAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../src/components/interactive/Button.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAQL,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAA;AAM/B,OAAO,EAAwB,KAAK,SAAS,EAAE,MAAM,gCAAgC,CAAA;AACrF,OAAO,EAAmD,KAAK,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAU3G,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,SAAS,GAAG,IAAI,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;IAC3B,qBAAqB,EAAE,UAAU,GAAG,IAAI,CAAA;IACxC,eAAe,EAAE,UAAU,GAAG,IAAI,CAAA;IAClC,YAAY,EAAE,WAAW,GAAG,IAAI,CAAA;IAChC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAA;IAC3B,SAAS,EAAE,cAAc,GAAG,IAAI,CAAA;IAChC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAA;IAChC,aAAa,EAAE,YAAY,GAAG,IAAI,CAAA;CACnC;AA8BD,eAAO,MAAM,YAAY,EAAE,eAqI1B,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components/interactive/Button.tsx"],"sourcesContent":["/**\n * Button Component - Puck Configuration\n *\n * CTA button with customizable styling and link support.\n */\n\nimport type { ComponentConfig } from '@puckeditor/core'\nimport {\n buttonVariantField,\n cn,\n marginValueToCSS,\n paddingValueToCSS,\n colorValueToCSS,\n borderValueToCSS,\n transformValueToCSS,\n type PaddingValue,\n type ColorValue,\n type BorderValue,\n type AnimationValue,\n type TransformValue,\n} from '../../fields/shared.js'\nimport { AnimatedWrapper } from '../AnimatedWrapper.js'\nimport { createMarginField } from '../../fields/MarginField.js'\nimport { createColorPickerField } from '../../fields/ColorPickerField.js'\nimport { createBorderField } from '../../fields/BorderField.js'\nimport { createPaddingField } from '../../fields/PaddingField.js'\nimport { createAlignmentField, type Alignment } from '../../fields/AlignmentField.js'\nimport { createSizeField, sizeValueToCSS, getSizeClasses, type SizeValue } from '../../fields/SizeField.js'\nimport { createAnimationField } from '../../fields/AnimationField.js'\nimport { createTransformField } from '../../fields/TransformField.js'\nimport { createResetField } from '../../fields/ResetField.js'\nimport {\n DEFAULT_BUTTON_VARIANTS,\n DEFAULT_FOCUS_RING,\n getVariantClasses,\n} from '../../theme/index.js'\n\nexport interface ButtonProps {\n text: string\n link: string\n variant: string\n size: SizeValue | null\n openInNewTab: string\n margin: PaddingValue | null\n customBackgroundColor: ColorValue | null\n customTextColor: ColorValue | null\n customBorder: BorderValue | null\n alignment: Alignment | null\n transform: TransformValue | null\n animation: AnimationValue | null\n customPadding: PaddingValue | null\n}\n\nconst sizeStyles: Record<string, string> = {\n sm: 'h-8 px-3 text-sm',\n default: 'h-10 px-4',\n lg: 'h-12 px-8 text-lg',\n}\n\nconst alignmentWrapperMap: Record<string, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n}\n\nconst defaultProps: ButtonProps = {\n text: 'Click Me',\n link: '',\n variant: 'default',\n size: null,\n openInNewTab: 'no',\n margin: null,\n customBackgroundColor: null,\n customTextColor: null,\n customBorder: null,\n alignment: null,\n transform: null,\n animation: null,\n customPadding: null,\n}\n\nexport const ButtonConfig: ComponentConfig = {\n label: 'Button',\n fields: {\n _reset: createResetField({ defaultProps }),\n text: {\n type: 'text',\n label: 'Button Text',\n },\n link: {\n type: 'text',\n label: 'Link URL',\n },\n variant: buttonVariantField,\n size: createSizeField({ label: 'Size' }),\n openInNewTab: {\n type: 'radio',\n label: 'Open in New Tab',\n options: [\n { label: 'No', value: 'no' },\n { label: 'Yes', value: 'yes' },\n ],\n },\n customBackgroundColor: createColorPickerField({ label: 'Custom Background', showOpacity: true }),\n customTextColor: createColorPickerField({ label: 'Custom Text Color', showOpacity: true }),\n customBorder: createBorderField({ label: 'Custom Border' }),\n alignment: createAlignmentField({ label: 'Alignment' }),\n transform: createTransformField({ label: 'Transform' }),\n animation: createAnimationField({ label: 'Animation' }),\n // Spacing (grouped at bottom)\n margin: createMarginField({ label: 'Margin' }),\n customPadding: createPaddingField({ label: 'Padding' }),\n },\n defaultProps,\n render: ({ text, link, variant, size, openInNewTab, alignment, margin, customBackgroundColor, customTextColor, customBorder, transform, animation, customPadding }) => {\n // Determine if custom styles should override preset variant/size styles\n const hasCustomBackground = customBackgroundColor?.hex\n const hasCustomTextColor = customTextColor?.hex\n const hasCustomPadding = customPadding\n const hasCustomSize = size?.mode === 'custom'\n\n // Get variant classes from defaults (SSR-safe, no hooks)\n const variantClasses = getVariantClasses(DEFAULT_BUTTON_VARIANTS, variant, 'default')\n\n // Get size classes for preset modes, or empty for custom mode\n const sizeClasses = getSizeClasses(size, sizeStyles)\n\n // Build button classes - exclude variant/size classes if custom styles are set\n const buttonClasses = cn(\n 'inline-flex items-center justify-center font-medium transition-colors',\n `focus:outline-none focus:ring-2 focus:ring-offset-2 ${DEFAULT_FOCUS_RING}`,\n 'disabled:opacity-50 disabled:pointer-events-none',\n // Only apply variant styles if no custom background/text color\n !hasCustomBackground && !hasCustomTextColor && variantClasses,\n // Only apply background portion of variant if no custom background\n hasCustomBackground && !hasCustomTextColor && 'hover:opacity-90',\n // Only apply size classes if not using custom size or custom padding\n !hasCustomPadding && !hasCustomSize && sizeClasses,\n // Apply rounded-md unless custom border has radius\n !customBorder?.radius && 'rounded-md'\n )\n\n // Build inline styles for the button\n const buttonStyle: React.CSSProperties = {}\n\n // Apply custom background color\n if (hasCustomBackground) {\n buttonStyle.backgroundColor = colorValueToCSS(customBackgroundColor)\n }\n\n // Apply custom text color\n if (hasCustomTextColor) {\n buttonStyle.color = colorValueToCSS(customTextColor)\n }\n\n // Apply custom border\n const borderStyles = borderValueToCSS(customBorder)\n if (borderStyles) {\n Object.assign(buttonStyle, borderStyles)\n }\n\n // Apply custom size (only if mode is custom)\n const customSizeStyles = sizeValueToCSS(size)\n if (customSizeStyles) {\n Object.assign(buttonStyle, customSizeStyles)\n }\n\n // Apply custom padding (overrides size padding if set)\n const paddingCSS = paddingValueToCSS(customPadding)\n if (paddingCSS) {\n buttonStyle.padding = paddingCSS\n }\n\n // Apply transform\n const transformStyles = transformValueToCSS(transform)\n if (transformStyles) {\n Object.assign(buttonStyle, transformStyles)\n }\n\n const buttonElement = link ? (\n <a\n href={link}\n target={openInNewTab === 'yes' ? '_blank' : undefined}\n rel={openInNewTab === 'yes' ? 'noopener noreferrer' : undefined}\n className={buttonClasses}\n style={buttonStyle}\n >\n {text}\n </a>\n ) : (\n <button type=\"button\" className={buttonClasses} style={buttonStyle}>\n {text}\n </button>\n )\n\n const wrapperStyle: React.CSSProperties = {}\n const marginCSS = marginValueToCSS(margin)\n if (marginCSS) {\n wrapperStyle.margin = marginCSS\n }\n\n // Get alignment value, defaulting to 'left'\n const alignmentValue = alignment ?? 'left'\n\n return (\n <AnimatedWrapper\n animation={animation}\n className={alignmentWrapperMap[alignmentValue] || alignmentWrapperMap.left}\n style={wrapperStyle}\n >\n {buttonElement}\n </AnimatedWrapper>\n )\n },\n}\n"],"names":["buttonVariantField","cn","marginValueToCSS","paddingValueToCSS","colorValueToCSS","borderValueToCSS","transformValueToCSS","AnimatedWrapper","createMarginField","createColorPickerField","createBorderField","createPaddingField","createAlignmentField","createSizeField","sizeValueToCSS","getSizeClasses","createAnimationField","createTransformField","createResetField","DEFAULT_BUTTON_VARIANTS","DEFAULT_FOCUS_RING","getVariantClasses","sizeStyles","sm","default","lg","alignmentWrapperMap","left","center","right","defaultProps","text","link","variant","size","openInNewTab","margin","customBackgroundColor","customTextColor","customBorder","alignment","transform","animation","customPadding","ButtonConfig","label","fields","_reset","type","options","value","showOpacity","render","hasCustomBackground","hex","hasCustomTextColor","hasCustomPadding","hasCustomSize","mode","variantClasses","sizeClasses","buttonClasses","radius","buttonStyle","backgroundColor","color","borderStyles","Object","assign","customSizeStyles","paddingCSS","padding","transformStyles","buttonElement","a","href","target","undefined","rel","className","style","button","wrapperStyle","marginCSS","alignmentValue"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Button.server.d.ts","sourceRoot":"","sources":["../../../src/components/interactive/Button.server.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EASL,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,SAAS,EACf,MAAM,wBAAwB,CAAA;AAE/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAI/D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,SAAS,GAAG,IAAI,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;IAC3B,qBAAqB,EAAE,UAAU,GAAG,IAAI,CAAA;IACxC,eAAe,EAAE,UAAU,GAAG,IAAI,CAAA;IAClC,YAAY,EAAE,WAAW,GAAG,IAAI,CAAA;IAChC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAA;IAC3B,SAAS,EAAE,cAAc,GAAG,IAAI,CAAA;IAChC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAA;IAChC,aAAa,EAAE,YAAY,GAAG,IAAI,CAAA;CACnC;AA8BD,eAAO,MAAM,YAAY,EAAE,eAAe,CAAC,WAAW,CAuGrD,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components/interactive/Button.server.tsx"],"sourcesContent":["/**\n * Button Component - Server-safe Puck Configuration\n *\n * CTA button with customizable styling and link support.\n * This version contains only the render function and types - no fields.\n * Safe for use in server components.\n */\n\nimport type { ComponentConfig } from '@puckeditor/core'\nimport {\n cn,\n marginValueToCSS,\n paddingValueToCSS,\n colorValueToCSS,\n borderValueToCSS,\n transformValueToCSS,\n sizeValueToCSS,\n getSizeClasses,\n type PaddingValue,\n type ColorValue,\n type BorderValue,\n type AnimationValue,\n type TransformValue,\n type SizeValue,\n} from '../../fields/shared.js'\nimport { AnimatedWrapper } from '../AnimatedWrapper.js'\nimport type { Alignment } from '../../fields/AlignmentField.js'\nimport { DEFAULT_BUTTON_VARIANTS, DEFAULT_FOCUS_RING } from '../../theme/defaults.js'\nimport { getVariantClasses } from '../../theme/utils.js'\n\nexport interface ButtonProps {\n text: string\n link: string\n variant: string\n size: SizeValue | null\n openInNewTab: string\n margin: PaddingValue | null\n customBackgroundColor: ColorValue | null\n customTextColor: ColorValue | null\n customBorder: BorderValue | null\n alignment: Alignment | null\n transform: TransformValue | null\n animation: AnimationValue | null\n customPadding: PaddingValue | null\n}\n\nconst sizeStyles: Record<string, string> = {\n sm: 'h-8 px-3 text-sm',\n default: 'h-10 px-4',\n lg: 'h-12 px-8 text-lg',\n}\n\nconst alignmentWrapperMap: Record<string, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n}\n\nconst defaultProps: ButtonProps = {\n text: 'Click Me',\n link: '',\n variant: 'default',\n size: null,\n openInNewTab: 'no',\n margin: null,\n customBackgroundColor: null,\n customTextColor: null,\n customBorder: null,\n alignment: null,\n transform: null,\n animation: null,\n customPadding: null,\n}\n\nexport const ButtonConfig: ComponentConfig<ButtonProps> = {\n label: 'Button',\n defaultProps,\n render: ({ text, link, variant, size, openInNewTab, alignment, margin, customBackgroundColor, customTextColor, customBorder, transform, animation, customPadding }) => {\n // Determine if custom styles should override preset variant/size styles\n const hasCustomBackground = customBackgroundColor?.hex\n const hasCustomTextColor = customTextColor?.hex\n const hasCustomPadding = customPadding\n const hasCustomSize = size?.mode === 'custom'\n\n // Get variant classes from defaults (SSR-safe, no hooks)\n const variantClasses = getVariantClasses(DEFAULT_BUTTON_VARIANTS, variant, 'default')\n\n // Get size classes for preset modes, or empty for custom mode\n const sizeClasses = getSizeClasses(size, sizeStyles)\n\n // Build button classes - exclude variant/size classes if custom styles are set\n const buttonClasses = cn(\n 'inline-flex items-center justify-center font-medium transition-colors',\n `focus:outline-none focus:ring-2 focus:ring-offset-2 ${DEFAULT_FOCUS_RING}`,\n 'disabled:opacity-50 disabled:pointer-events-none',\n // Only apply variant styles if no custom background/text color\n !hasCustomBackground && !hasCustomTextColor && variantClasses,\n // Only apply background portion of variant if no custom background\n hasCustomBackground && !hasCustomTextColor && 'hover:opacity-90',\n // Only apply size classes if not using custom size or custom padding\n !hasCustomPadding && !hasCustomSize && sizeClasses,\n // Apply rounded-md unless custom border has radius\n !customBorder?.radius && 'rounded-md'\n )\n\n // Build inline styles for the button\n const buttonStyle: React.CSSProperties = {}\n\n // Apply custom background color\n if (hasCustomBackground) {\n buttonStyle.backgroundColor = colorValueToCSS(customBackgroundColor)\n }\n\n // Apply custom text color\n if (hasCustomTextColor) {\n buttonStyle.color = colorValueToCSS(customTextColor)\n }\n\n // Apply custom border\n const borderStyles = borderValueToCSS(customBorder)\n if (borderStyles) {\n Object.assign(buttonStyle, borderStyles)\n }\n\n // Apply custom size (only if mode is custom)\n const customSizeStyles = sizeValueToCSS(size)\n if (customSizeStyles) {\n Object.assign(buttonStyle, customSizeStyles)\n }\n\n // Apply custom padding (overrides size padding if set)\n const paddingCSS = paddingValueToCSS(customPadding)\n if (paddingCSS) {\n buttonStyle.padding = paddingCSS\n }\n\n // Apply transform\n const transformStyles = transformValueToCSS(transform)\n if (transformStyles) {\n Object.assign(buttonStyle, transformStyles)\n }\n\n const buttonElement = link ? (\n <a\n href={link}\n target={openInNewTab === 'yes' ? '_blank' : undefined}\n rel={openInNewTab === 'yes' ? 'noopener noreferrer' : undefined}\n className={buttonClasses}\n style={buttonStyle}\n >\n {text}\n </a>\n ) : (\n <button type=\"button\" className={buttonClasses} style={buttonStyle}>\n {text}\n </button>\n )\n\n const wrapperStyle: React.CSSProperties = {}\n const marginCSS = marginValueToCSS(margin)\n if (marginCSS) {\n wrapperStyle.margin = marginCSS\n }\n\n // Get alignment value, defaulting to 'left'\n const alignmentValue = alignment ?? 'left'\n\n return (\n <AnimatedWrapper\n animation={animation}\n className={alignmentWrapperMap[alignmentValue] || alignmentWrapperMap.left}\n style={wrapperStyle}\n >\n {buttonElement}\n </AnimatedWrapper>\n )\n },\n}\n"],"names":["cn","marginValueToCSS","paddingValueToCSS","colorValueToCSS","borderValueToCSS","transformValueToCSS","sizeValueToCSS","getSizeClasses","AnimatedWrapper","DEFAULT_BUTTON_VARIANTS","DEFAULT_FOCUS_RING","getVariantClasses","sizeStyles","sm","default","lg","alignmentWrapperMap","left","center","right","defaultProps","text","link","variant","size","openInNewTab","margin","customBackgroundColor","customTextColor","customBorder","alignment","transform","animation","customPadding","ButtonConfig","label","render","hasCustomBackground","hex","hasCustomTextColor","hasCustomPadding","hasCustomSize","mode","variantClasses","sizeClasses","buttonClasses","radius","buttonStyle","backgroundColor","color","borderStyles","Object","assign","customSizeStyles","paddingCSS","padding","transformStyles","buttonElement","a","href","target","undefined","rel","className","style","button","type","wrapperStyle","marginCSS","alignmentValue"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Card.d.ts","sourceRoot":"","sources":["../../../src/components/interactive/Card.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAUL,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAA;AAQ/B,OAAO,EAAwB,KAAK,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAGrF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAYhE,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,cAAc,GAAG,IAAI,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,OAAO,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;IAC3B,UAAU,EAAE,eAAe,GAAG,IAAI,CAAA;IAClC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAA;IAC1B,UAAU,EAAE,eAAe,GAAG,IAAI,CAAA;IAClC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAA;IAC3B,SAAS,EAAE,cAAc,GAAG,IAAI,CAAA;IAChC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAA;IAChC,cAAc,EAAE,YAAY,GAAG,IAAI,CAAA;CACpC;AAmBD,eAAO,MAAM,UAAU,EAAE,eAwJxB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components/interactive/Card.tsx"],"sourcesContent":["/**\n * Card Component - Puck Configuration\n *\n * Content card with image, heading, and text.\n */\n\nimport type { ComponentConfig } from '@puckeditor/core'\nimport {\n shadowField,\n shadowMap,\n cn,\n marginValueToCSS,\n paddingValueToCSS,\n backgroundValueToCSS,\n borderValueToCSS,\n dimensionsValueToCSS,\n transformValueToCSS,\n type PaddingValue,\n type BackgroundValue,\n type BorderValue,\n type DimensionsValue,\n type AnimationValue,\n type TransformValue,\n} from '../../fields/shared.js'\nimport { AnimatedWrapper } from '../AnimatedWrapper.js'\nimport { createMarginField } from '../../fields/MarginField.js'\nimport { createPaddingField } from '../../fields/PaddingField.js'\nimport { createResetField } from '../../fields/ResetField.js'\nimport { createBackgroundField } from '../../fields/BackgroundField.js'\nimport { createBorderField } from '../../fields/BorderField.js'\nimport { createDimensionsField } from '../../fields/DimensionsField.js'\nimport { createAlignmentField, type Alignment } from '../../fields/AlignmentField.js'\nimport { createAnimationField } from '../../fields/AnimationField.js'\nimport { createTransformField } from '../../fields/TransformField.js'\nimport type { MediaReference } from '../../fields/MediaField.js'\n\n// Default content padding for card (replaces hardcoded p-4)\nconst DEFAULT_CONTENT_PADDING: PaddingValue = {\n top: 16,\n right: 16,\n bottom: 16,\n left: 16,\n unit: 'px',\n linked: true,\n}\n\nexport interface CardProps {\n image: MediaReference | null\n heading: string\n text: string\n link: string\n openInNewTab: boolean\n shadow: string\n margin: PaddingValue | null\n background: BackgroundValue | null\n border: BorderValue | null\n dimensions: DimensionsValue | null\n alignment: Alignment | null\n transform: TransformValue | null\n animation: AnimationValue | null\n contentPadding: PaddingValue | null // Renamed from customPadding for clarity\n}\n\nconst defaultProps: CardProps = {\n image: null,\n heading: 'Card Heading',\n text: 'Card description text goes here.',\n link: '',\n openInNewTab: false,\n shadow: 'md',\n margin: null,\n background: null,\n border: null,\n dimensions: null,\n alignment: null,\n transform: null,\n animation: null,\n contentPadding: DEFAULT_CONTENT_PADDING, // Default 16px padding, visible in editor\n}\n\nexport const CardConfig: ComponentConfig = {\n label: 'Card',\n fields: {\n _reset: createResetField({ defaultProps }),\n image: {\n type: 'object',\n label: 'Image',\n objectFields: {\n id: { type: 'text', label: 'Media ID' },\n url: { type: 'text', label: 'URL' },\n alt: { type: 'text', label: 'Alt Text' },\n },\n },\n heading: {\n type: 'text',\n label: 'Heading',\n },\n text: {\n type: 'textarea',\n label: 'Text',\n },\n link: {\n type: 'text',\n label: 'Link URL',\n },\n openInNewTab: {\n type: 'radio',\n label: 'Open in New Tab',\n options: [\n { label: 'Yes', value: true },\n { label: 'No', value: false },\n ],\n },\n shadow: shadowField,\n background: createBackgroundField({ label: 'Background' }),\n border: createBorderField({ label: 'Border' }),\n dimensions: createDimensionsField({ label: 'Dimensions' }),\n alignment: createAlignmentField({ label: 'Alignment' }),\n transform: createTransformField({ label: 'Transform' }),\n animation: createAnimationField({ label: 'Animation' }),\n // Spacing (grouped at bottom)\n margin: createMarginField({ label: 'Margin' }),\n contentPadding: createPaddingField({ label: 'Content Padding' }),\n },\n defaultProps,\n render: ({ image, heading, text, link, openInNewTab, shadow, background, dimensions, alignment, margin, border, transform, animation, contentPadding }) => {\n // Check if border has radius, if so don't apply rounded-lg\n const hasBorderRadius = border?.radius && border.radius > 0\n const cardClasses = cn(\n 'overflow-hidden transition-all bg-card',\n !hasBorderRadius && 'rounded-lg',\n shadowMap[shadow] || '',\n link && 'hover:shadow-lg cursor-pointer'\n )\n\n // Wrapper style for margin, dimensions, alignment, transform, animation\n const wrapperStyle: React.CSSProperties = {}\n const marginCSS = marginValueToCSS(margin)\n if (marginCSS) {\n wrapperStyle.margin = marginCSS\n }\n const dimensionsStyles = dimensionsValueToCSS(dimensions)\n if (dimensionsStyles) {\n Object.assign(wrapperStyle, dimensionsStyles)\n }\n const transformStyles = transformValueToCSS(transform)\n if (transformStyles) {\n Object.assign(wrapperStyle, transformStyles)\n }\n\n // Alignment classes for wrapper\n const alignmentValue = alignment ?? 'left'\n const alignmentClasses = cn(\n 'flex',\n alignmentValue === 'left' && 'justify-start',\n alignmentValue === 'center' && 'justify-center',\n alignmentValue === 'right' && 'justify-end'\n )\n\n // Card background styles from BackgroundValue\n const backgroundStyles = backgroundValueToCSS(background)\n const cardStyle: React.CSSProperties = {\n ...backgroundStyles,\n }\n // Note: bg-card class handles default background (theme-aware)\n // Apply border to card\n const borderStyles = borderValueToCSS(border)\n if (borderStyles) {\n Object.assign(cardStyle, borderStyles)\n }\n\n // Content section style with configurable padding\n const contentStyle: React.CSSProperties = {}\n const contentPaddingCSS = paddingValueToCSS(contentPadding)\n if (contentPaddingCSS) {\n contentStyle.padding = contentPaddingCSS\n }\n\n const cardContent = (\n <div className={cardClasses} style={cardStyle}>\n {/* Image */}\n {image?.url ? (\n <div className=\"relative aspect-video w-full overflow-hidden\">\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img\n src={image.url}\n alt={image.alt || heading || ''}\n className=\"w-full h-full object-cover\"\n />\n </div>\n ) : (\n <div className=\"aspect-video w-full bg-muted flex items-center justify-center\">\n <span className=\"text-muted-foreground\">No image</span>\n </div>\n )}\n\n {/* Content */}\n <div style={contentStyle}>\n {heading && (\n <h3 className=\"text-lg font-semibold text-foreground mb-2\">{heading}</h3>\n )}\n {text && <p className=\"text-muted-foreground text-sm\">{text}</p>}\n </div>\n </div>\n )\n\n if (link) {\n return (\n <AnimatedWrapper animation={animation}>\n <div className={alignmentClasses}>\n <a\n href={link}\n target={openInNewTab ? '_blank' : undefined}\n rel={openInNewTab ? 'noopener noreferrer' : undefined}\n className=\"block\"\n style={wrapperStyle}\n >\n {cardContent}\n </a>\n </div>\n </AnimatedWrapper>\n )\n }\n\n return (\n <AnimatedWrapper animation={animation}>\n <div className={alignmentClasses}>\n <div style={wrapperStyle}>{cardContent}</div>\n </div>\n </AnimatedWrapper>\n )\n },\n}\n"],"names":["shadowField","shadowMap","cn","marginValueToCSS","paddingValueToCSS","backgroundValueToCSS","borderValueToCSS","dimensionsValueToCSS","transformValueToCSS","AnimatedWrapper","createMarginField","createPaddingField","createResetField","createBackgroundField","createBorderField","createDimensionsField","createAlignmentField","createAnimationField","createTransformField","DEFAULT_CONTENT_PADDING","top","right","bottom","left","unit","linked","defaultProps","image","heading","text","link","openInNewTab","shadow","margin","background","border","dimensions","alignment","transform","animation","contentPadding","CardConfig","label","fields","_reset","type","objectFields","id","url","alt","options","value","render","hasBorderRadius","radius","cardClasses","wrapperStyle","marginCSS","dimensionsStyles","Object","assign","transformStyles","alignmentValue","alignmentClasses","backgroundStyles","cardStyle","borderStyles","contentStyle","contentPaddingCSS","padding","cardContent","div","className","style","img","src","span","h3","p","a","href","target","undefined","rel"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Card.server.d.ts","sourceRoot":"","sources":["../../../src/components/interactive/Card.server.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EASL,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAY/D,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,cAAc,GAAG,IAAI,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,OAAO,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;IAC3B,UAAU,EAAE,eAAe,GAAG,IAAI,CAAA;IAClC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAA;IAC1B,UAAU,EAAE,eAAe,GAAG,IAAI,CAAA;IAClC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAA;IAC3B,SAAS,EAAE,cAAc,GAAG,IAAI,CAAA;IAChC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAA;IAChC,cAAc,EAAE,YAAY,GAAG,IAAI,CAAA;CACpC;AAmBD,eAAO,MAAM,UAAU,EAAE,eAAe,CAAC,SAAS,CA8GjD,CAAA"}