@delmaredigital/payload-puck 0.6.13 → 0.6.14

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 (697) hide show
  1. package/dist/admin/EditWithPuckButton.d.ts +0 -1
  2. package/dist/admin/EditWithPuckButton.js +0 -2
  3. package/dist/admin/EditWithPuckCell.d.ts +0 -1
  4. package/dist/admin/EditWithPuckCell.js +0 -2
  5. package/dist/admin/PuckEditorView.d.ts +0 -1
  6. package/dist/admin/PuckEditorView.js +0 -2
  7. package/dist/admin/client.d.ts +0 -1
  8. package/dist/admin/client.js +0 -2
  9. package/dist/admin/generateAdminComponents.d.ts +0 -1
  10. package/dist/admin/generateAdminComponents.js +0 -2
  11. package/dist/admin/index.d.ts +0 -1
  12. package/dist/admin/index.js +0 -2
  13. package/dist/ai/collections/AiContext.d.ts +0 -1
  14. package/dist/ai/collections/AiContext.js +0 -2
  15. package/dist/ai/collections/AiPrompts.d.ts +0 -1
  16. package/dist/ai/collections/AiPrompts.js +0 -2
  17. package/dist/ai/createAiApiRoutes.d.ts +0 -1
  18. package/dist/ai/createAiApiRoutes.js +0 -2
  19. package/dist/ai/createAiGenerate.d.ts +0 -1
  20. package/dist/ai/createAiGenerate.js +0 -2
  21. package/dist/ai/createAiPlugin.d.ts +0 -1
  22. package/dist/ai/createAiPlugin.js +0 -2
  23. package/dist/ai/hooks/useAiContext.d.ts +0 -1
  24. package/dist/ai/hooks/useAiContext.js +0 -2
  25. package/dist/ai/hooks/useAiPrompts.d.ts +0 -1
  26. package/dist/ai/hooks/useAiPrompts.js +0 -2
  27. package/dist/ai/index.d.ts +0 -1
  28. package/dist/ai/index.js +0 -2
  29. package/dist/ai/plugins/ContextEditorPanel.d.ts +0 -1
  30. package/dist/ai/plugins/ContextEditorPanel.js +0 -2
  31. package/dist/ai/plugins/PromptEditorPanel.d.ts +0 -1
  32. package/dist/ai/plugins/PromptEditorPanel.js +0 -2
  33. package/dist/ai/plugins/contextEditorPlugin.d.ts +0 -1
  34. package/dist/ai/plugins/contextEditorPlugin.js +0 -2
  35. package/dist/ai/plugins/promptApiRoutes.d.ts +0 -1
  36. package/dist/ai/plugins/promptApiRoutes.js +0 -2
  37. package/dist/ai/plugins/promptEditorPlugin.d.ts +0 -1
  38. package/dist/ai/plugins/promptEditorPlugin.js +0 -2
  39. package/dist/ai/presets/componentAiDefaults.d.ts +0 -1
  40. package/dist/ai/presets/componentAiDefaults.js +0 -2
  41. package/dist/ai/presets/index.d.ts +0 -1
  42. package/dist/ai/presets/index.js +0 -2
  43. package/dist/ai/presets/instructions/interactive.d.ts +0 -1
  44. package/dist/ai/presets/instructions/interactive.js +0 -2
  45. package/dist/ai/presets/instructions/layout.d.ts +0 -1
  46. package/dist/ai/presets/instructions/layout.js +0 -2
  47. package/dist/ai/presets/instructions/media.d.ts +0 -1
  48. package/dist/ai/presets/instructions/media.js +0 -2
  49. package/dist/ai/presets/instructions/pagePatterns.d.ts +0 -1
  50. package/dist/ai/presets/instructions/pagePatterns.js +0 -2
  51. package/dist/ai/presets/instructions/schemas.d.ts +0 -1
  52. package/dist/ai/presets/instructions/schemas.js +0 -2
  53. package/dist/ai/presets/instructions/typography.d.ts +0 -1
  54. package/dist/ai/presets/instructions/typography.js +0 -2
  55. package/dist/ai/tools/index.d.ts +0 -1
  56. package/dist/ai/tools/index.js +0 -2
  57. package/dist/ai/types.d.ts +0 -1
  58. package/dist/ai/types.js +0 -2
  59. package/dist/ai/utils/injectAiConfig.d.ts +0 -1
  60. package/dist/ai/utils/injectAiConfig.js +0 -2
  61. package/dist/api/createPuckApiRoutes.d.ts +0 -1
  62. package/dist/api/createPuckApiRoutes.js +0 -2
  63. package/dist/api/createPuckApiRoutesVersions.d.ts +0 -1
  64. package/dist/api/createPuckApiRoutesVersions.js +0 -2
  65. package/dist/api/createPuckApiRoutesWithId.d.ts +0 -1
  66. package/dist/api/createPuckApiRoutesWithId.js +0 -2
  67. package/dist/api/index.d.ts +0 -1
  68. package/dist/api/index.js +0 -2
  69. package/dist/api/payload-config.d.js +1 -2
  70. package/dist/api/types.d.ts +0 -1
  71. package/dist/api/types.js +0 -2
  72. package/dist/api/utils/mapRootProps.d.ts +0 -1
  73. package/dist/api/utils/mapRootProps.js +0 -2
  74. package/dist/collections/Templates.d.ts +0 -1
  75. package/dist/collections/Templates.js +0 -2
  76. package/dist/components/AccordionClient.d.ts +0 -1
  77. package/dist/components/AccordionClient.js +0 -2
  78. package/dist/components/AnimatedWrapper.d.ts +0 -1
  79. package/dist/components/AnimatedWrapper.js +0 -2
  80. package/dist/components/exports.d.ts +0 -1
  81. package/dist/components/exports.js +0 -2
  82. package/dist/components/index.d.ts +0 -1
  83. package/dist/components/index.js +0 -2
  84. package/dist/components/interactive/Accordion.d.ts +0 -1
  85. package/dist/components/interactive/Accordion.js +0 -2
  86. package/dist/components/interactive/Accordion.server.d.ts +0 -1
  87. package/dist/components/interactive/Accordion.server.js +0 -2
  88. package/dist/components/interactive/Button.d.ts +0 -1
  89. package/dist/components/interactive/Button.js +0 -2
  90. package/dist/components/interactive/Button.server.d.ts +0 -1
  91. package/dist/components/interactive/Button.server.js +0 -2
  92. package/dist/components/interactive/Card.d.ts +0 -1
  93. package/dist/components/interactive/Card.js +0 -2
  94. package/dist/components/interactive/Card.server.d.ts +0 -1
  95. package/dist/components/interactive/Card.server.js +0 -2
  96. package/dist/components/interactive/Divider.d.ts +0 -1
  97. package/dist/components/interactive/Divider.js +0 -2
  98. package/dist/components/interactive/Divider.server.d.ts +0 -1
  99. package/dist/components/interactive/Divider.server.js +0 -2
  100. package/dist/components/interactive/index.d.ts +0 -1
  101. package/dist/components/interactive/index.js +0 -2
  102. package/dist/components/layout/Container.d.ts +0 -1
  103. package/dist/components/layout/Container.js +0 -2
  104. package/dist/components/layout/Container.server.d.ts +0 -1
  105. package/dist/components/layout/Container.server.js +0 -2
  106. package/dist/components/layout/Flex.d.ts +0 -1
  107. package/dist/components/layout/Flex.js +0 -2
  108. package/dist/components/layout/Flex.server.d.ts +0 -1
  109. package/dist/components/layout/Flex.server.js +0 -2
  110. package/dist/components/layout/Grid.d.ts +0 -1
  111. package/dist/components/layout/Grid.js +0 -2
  112. package/dist/components/layout/Grid.server.d.ts +0 -1
  113. package/dist/components/layout/Grid.server.js +0 -2
  114. package/dist/components/layout/Section.d.ts +0 -1
  115. package/dist/components/layout/Section.js +0 -2
  116. package/dist/components/layout/Section.server.d.ts +0 -1
  117. package/dist/components/layout/Section.server.js +0 -2
  118. package/dist/components/layout/Spacer.d.ts +0 -1
  119. package/dist/components/layout/Spacer.js +0 -2
  120. package/dist/components/layout/Spacer.server.d.ts +0 -1
  121. package/dist/components/layout/Spacer.server.js +0 -2
  122. package/dist/components/layout/Template.d.ts +0 -1
  123. package/dist/components/layout/Template.js +0 -2
  124. package/dist/components/layout/Template.server.d.ts +0 -1
  125. package/dist/components/layout/Template.server.js +0 -2
  126. package/dist/components/layout/index.d.ts +0 -1
  127. package/dist/components/layout/index.js +0 -2
  128. package/dist/components/media/Image.d.ts +0 -1
  129. package/dist/components/media/Image.js +0 -2
  130. package/dist/components/media/Image.server.d.ts +0 -1
  131. package/dist/components/media/Image.server.js +0 -2
  132. package/dist/components/media/index.d.ts +0 -1
  133. package/dist/components/media/index.js +0 -2
  134. package/dist/components/typography/Heading.d.ts +0 -1
  135. package/dist/components/typography/Heading.js +0 -2
  136. package/dist/components/typography/Heading.server.d.ts +0 -1
  137. package/dist/components/typography/Heading.server.js +0 -2
  138. package/dist/components/typography/RichText.editor.d.ts +0 -1
  139. package/dist/components/typography/RichText.editor.js +0 -2
  140. package/dist/components/typography/RichText.server.d.ts +0 -1
  141. package/dist/components/typography/RichText.server.js +0 -2
  142. package/dist/components/typography/Text.d.ts +0 -1
  143. package/dist/components/typography/Text.js +0 -2
  144. package/dist/components/typography/Text.server.d.ts +0 -1
  145. package/dist/components/typography/Text.server.js +0 -2
  146. package/dist/components/typography/index.d.ts +0 -1
  147. package/dist/components/typography/index.js +0 -2
  148. package/dist/config/config.editor.d.ts +0 -1
  149. package/dist/config/config.editor.js +0 -2
  150. package/dist/config/index.d.ts +0 -1
  151. package/dist/config/index.js +0 -2
  152. package/dist/config/merge.d.ts +0 -1
  153. package/dist/config/merge.js +0 -2
  154. package/dist/config/presets.d.ts +0 -1
  155. package/dist/config/presets.js +0 -2
  156. package/dist/config/types.d.ts +0 -1
  157. package/dist/config/types.js +0 -2
  158. package/dist/editor/PuckEditor.d.ts +0 -1
  159. package/dist/editor/PuckEditor.js +0 -2
  160. package/dist/editor/PuckEditorImpl.client.d.ts +0 -1
  161. package/dist/editor/PuckEditorImpl.client.js +0 -2
  162. package/dist/editor/components/DarkModeStyles.d.ts +0 -1
  163. package/dist/editor/components/DarkModeStyles.js +0 -2
  164. package/dist/editor/components/HeaderActions.d.ts +0 -1
  165. package/dist/editor/components/HeaderActions.js +0 -2
  166. package/dist/editor/components/IframeWrapper.d.ts +0 -1
  167. package/dist/editor/components/IframeWrapper.js +0 -2
  168. package/dist/editor/components/LoadingState.d.ts +0 -1
  169. package/dist/editor/components/LoadingState.js +0 -2
  170. package/dist/editor/components/PreviewModal.d.ts +0 -1
  171. package/dist/editor/components/PreviewModal.js +0 -2
  172. package/dist/editor/components/PreviewModeToggle.d.ts +0 -1
  173. package/dist/editor/components/PreviewModeToggle.js +0 -2
  174. package/dist/editor/components/VersionHistory.d.ts +0 -1
  175. package/dist/editor/components/VersionHistory.js +0 -2
  176. package/dist/editor/hooks/useDarkMode.d.ts +0 -1
  177. package/dist/editor/hooks/useDarkMode.js +0 -2
  178. package/dist/editor/hooks/useUnsavedChanges.d.ts +0 -1
  179. package/dist/editor/hooks/useUnsavedChanges.js +0 -2
  180. package/dist/editor/index.d.ts +0 -1
  181. package/dist/editor/index.js +0 -2
  182. package/dist/editor/plugins/VersionHistoryPanel.d.ts +0 -1
  183. package/dist/editor/plugins/VersionHistoryPanel.js +0 -2
  184. package/dist/editor/plugins/index.d.ts +0 -1
  185. package/dist/editor/plugins/index.js +0 -2
  186. package/dist/editor/plugins/versionHistoryPlugin.d.ts +0 -1
  187. package/dist/editor/plugins/versionHistoryPlugin.js +0 -2
  188. package/dist/editor/utils/detectPageTree.d.ts +0 -1
  189. package/dist/editor/utils/detectPageTree.js +0 -2
  190. package/dist/editor/utils/index.d.ts +0 -1
  191. package/dist/editor/utils/index.js +0 -2
  192. package/dist/editor/utils/injectPageTreeFields.d.ts +0 -1
  193. package/dist/editor/utils/injectPageTreeFields.js +0 -2
  194. package/dist/endpoints/ai.d.ts +0 -1
  195. package/dist/endpoints/ai.js +0 -2
  196. package/dist/endpoints/context.d.ts +0 -1
  197. package/dist/endpoints/context.js +0 -2
  198. package/dist/endpoints/index.d.ts +0 -1
  199. package/dist/endpoints/index.js +0 -2
  200. package/dist/endpoints/postcss.d.js +1 -2
  201. package/dist/endpoints/prompts.d.ts +0 -1
  202. package/dist/endpoints/prompts.js +0 -2
  203. package/dist/endpoints/styles.d.ts +0 -1
  204. package/dist/endpoints/styles.js +0 -2
  205. package/dist/exports/client.d.ts +0 -1
  206. package/dist/exports/client.js +0 -2
  207. package/dist/exports/rsc.d.ts +0 -1
  208. package/dist/exports/rsc.js +0 -2
  209. package/dist/fields/AlignmentField.d.ts +0 -1
  210. package/dist/fields/AlignmentField.js +0 -2
  211. package/dist/fields/AnimationField.d.ts +0 -1
  212. package/dist/fields/AnimationField.js +0 -2
  213. package/dist/fields/BackgroundField.d.ts +0 -1
  214. package/dist/fields/BackgroundField.js +0 -2
  215. package/dist/fields/BorderField.d.ts +0 -1
  216. package/dist/fields/BorderField.js +0 -2
  217. package/dist/fields/ColorPickerField.d.ts +0 -1
  218. package/dist/fields/ColorPickerField.js +0 -2
  219. package/dist/fields/ContentAlignmentField.d.ts +0 -1
  220. package/dist/fields/ContentAlignmentField.js +0 -2
  221. package/dist/fields/DimensionsField.d.ts +0 -1
  222. package/dist/fields/DimensionsField.js +0 -2
  223. package/dist/fields/FlexAlignmentField.d.ts +0 -1
  224. package/dist/fields/FlexAlignmentField.js +0 -2
  225. package/dist/fields/FolderPickerField.d.ts +0 -1
  226. package/dist/fields/FolderPickerField.js +0 -2
  227. package/dist/fields/GradientEditor.d.ts +0 -1
  228. package/dist/fields/GradientEditor.js +0 -2
  229. package/dist/fields/LockedField.d.ts +0 -1
  230. package/dist/fields/LockedField.js +0 -2
  231. package/dist/fields/MarginField.d.ts +0 -1
  232. package/dist/fields/MarginField.js +0 -2
  233. package/dist/fields/MediaField.d.ts +0 -1
  234. package/dist/fields/MediaField.js +0 -2
  235. package/dist/fields/PaddingField.d.ts +0 -1
  236. package/dist/fields/PaddingField.js +0 -2
  237. package/dist/fields/PageSegmentField.d.ts +0 -1
  238. package/dist/fields/PageSegmentField.js +0 -2
  239. package/dist/fields/ResetField.d.ts +0 -1
  240. package/dist/fields/ResetField.js +0 -2
  241. package/dist/fields/ResponsiveField.d.ts +0 -1
  242. package/dist/fields/ResponsiveField.js +0 -2
  243. package/dist/fields/ResponsiveVisibilityField.d.ts +0 -1
  244. package/dist/fields/ResponsiveVisibilityField.js +0 -2
  245. package/dist/fields/SizeField.d.ts +0 -1
  246. package/dist/fields/SizeField.js +0 -2
  247. package/dist/fields/SlugPreviewField.d.ts +0 -1
  248. package/dist/fields/SlugPreviewField.js +0 -2
  249. package/dist/fields/TemplateField.d.ts +0 -1
  250. package/dist/fields/TemplateField.js +0 -2
  251. package/dist/fields/TransformField.d.ts +0 -1
  252. package/dist/fields/TransformField.js +0 -2
  253. package/dist/fields/VerticalAlignmentField.d.ts +0 -1
  254. package/dist/fields/VerticalAlignmentField.js +0 -2
  255. package/dist/fields/WidthField.d.ts +0 -1
  256. package/dist/fields/WidthField.js +0 -2
  257. package/dist/fields/index.d.ts +0 -1
  258. package/dist/fields/index.js +0 -2
  259. package/dist/fields/richtext/controls/ColorPickerControl.d.ts +0 -1
  260. package/dist/fields/richtext/controls/ColorPickerControl.js +0 -2
  261. package/dist/fields/richtext/controls/DropdownPortal.d.ts +0 -1
  262. package/dist/fields/richtext/controls/DropdownPortal.js +0 -2
  263. package/dist/fields/richtext/controls/FontSizeControl.d.ts +0 -1
  264. package/dist/fields/richtext/controls/FontSizeControl.js +0 -2
  265. package/dist/fields/richtext/controls/HighlightControl.d.ts +0 -1
  266. package/dist/fields/richtext/controls/HighlightControl.js +0 -2
  267. package/dist/fields/richtext/controls/index.d.ts +0 -1
  268. package/dist/fields/richtext/controls/index.js +0 -2
  269. package/dist/fields/richtext/controls/shared.d.ts +0 -1
  270. package/dist/fields/richtext/controls/shared.js +0 -2
  271. package/dist/fields/richtext/createRichTextField.d.ts +0 -1
  272. package/dist/fields/richtext/createRichTextField.js +0 -2
  273. package/dist/fields/richtext/extensions/FontSize.d.ts +0 -1
  274. package/dist/fields/richtext/extensions/FontSize.js +0 -2
  275. package/dist/fields/richtext/extensions/index.d.ts +0 -1
  276. package/dist/fields/richtext/extensions/index.js +0 -2
  277. package/dist/fields/richtext/index.d.ts +0 -1
  278. package/dist/fields/richtext/index.js +0 -2
  279. package/dist/fields/shared.d.ts +0 -1
  280. package/dist/fields/shared.js +0 -2
  281. package/dist/hooks/index.d.ts +0 -1
  282. package/dist/hooks/index.js +0 -2
  283. package/dist/hooks/useResponsiveStyles.d.ts +0 -1
  284. package/dist/hooks/useResponsiveStyles.js +0 -2
  285. package/dist/hooks/useScrollAnimation.d.ts +0 -1
  286. package/dist/hooks/useScrollAnimation.js +0 -2
  287. package/dist/index.d.ts +0 -1
  288. package/dist/index.js +0 -2
  289. package/dist/layouts/LayoutWrapper.d.ts +0 -1
  290. package/dist/layouts/LayoutWrapper.js +0 -2
  291. package/dist/layouts/defaults.d.ts +0 -1
  292. package/dist/layouts/defaults.js +0 -2
  293. package/dist/layouts/index.d.ts +0 -1
  294. package/dist/layouts/index.js +0 -2
  295. package/dist/layouts/types.d.ts +0 -1
  296. package/dist/layouts/types.js +0 -2
  297. package/dist/layouts/utils.d.ts +0 -1
  298. package/dist/layouts/utils.js +0 -2
  299. package/dist/next/index.d.ts +0 -1
  300. package/dist/next/index.js +0 -2
  301. package/dist/plugin/collections/Pages.d.ts +0 -1
  302. package/dist/plugin/collections/Pages.js +0 -2
  303. package/dist/plugin/fields/index.d.ts +0 -1
  304. package/dist/plugin/fields/index.js +0 -2
  305. package/dist/plugin/fields/types.d.ts +0 -1
  306. package/dist/plugin/fields/types.js +0 -2
  307. package/dist/plugin/hooks/index.d.ts +0 -1
  308. package/dist/plugin/hooks/index.js +0 -2
  309. package/dist/plugin/hooks/isHomepageUnique.d.ts +0 -1
  310. package/dist/plugin/hooks/isHomepageUnique.js +0 -2
  311. package/dist/plugin/index.d.ts +0 -1
  312. package/dist/plugin/index.js +0 -2
  313. package/dist/render/HybridPageRenderer.d.ts +0 -1
  314. package/dist/render/HybridPageRenderer.js +0 -2
  315. package/dist/render/PageRenderer.d.ts +0 -1
  316. package/dist/render/PageRenderer.js +0 -2
  317. package/dist/render/PuckEditor.client.d.ts +0 -1
  318. package/dist/render/PuckEditor.client.js +0 -2
  319. package/dist/render/index.d.ts +0 -1
  320. package/dist/render/index.js +0 -2
  321. package/dist/theme/context.d.ts +0 -1
  322. package/dist/theme/context.js +0 -2
  323. package/dist/theme/defaults.d.ts +0 -1
  324. package/dist/theme/defaults.js +0 -2
  325. package/dist/theme/example.d.ts +0 -1
  326. package/dist/theme/example.js +0 -2
  327. package/dist/theme/index.d.ts +0 -1
  328. package/dist/theme/index.js +0 -2
  329. package/dist/theme/types.d.ts +0 -1
  330. package/dist/theme/types.js +0 -2
  331. package/dist/theme/utils.d.ts +0 -1
  332. package/dist/theme/utils.js +0 -2
  333. package/dist/types/index.d.ts +0 -1
  334. package/dist/types/index.js +0 -2
  335. package/dist/utils/index.d.ts +0 -1
  336. package/dist/utils/index.js +0 -2
  337. package/dist/utils/migration.d.ts +0 -1
  338. package/dist/utils/migration.js +0 -2
  339. package/dist/utils/validation.d.ts +0 -1
  340. package/dist/utils/validation.js +0 -2
  341. package/dist/version.d.ts +1 -2
  342. package/dist/version.js +1 -3
  343. package/dist/views/PuckConfigContext.d.ts +0 -1
  344. package/dist/views/PuckConfigContext.js +0 -2
  345. package/dist/views/PuckEditorView.d.ts +0 -1
  346. package/dist/views/PuckEditorView.js +0 -2
  347. package/dist/views/index.d.ts +0 -1
  348. package/dist/views/index.js +0 -2
  349. package/package.json +1 -1
  350. package/dist/admin/EditWithPuckButton.d.ts.map +0 -1
  351. package/dist/admin/EditWithPuckButton.js.map +0 -1
  352. package/dist/admin/EditWithPuckCell.d.ts.map +0 -1
  353. package/dist/admin/EditWithPuckCell.js.map +0 -1
  354. package/dist/admin/PuckEditorView.d.ts.map +0 -1
  355. package/dist/admin/PuckEditorView.js.map +0 -1
  356. package/dist/admin/client.d.ts.map +0 -1
  357. package/dist/admin/client.js.map +0 -1
  358. package/dist/admin/generateAdminComponents.d.ts.map +0 -1
  359. package/dist/admin/generateAdminComponents.js.map +0 -1
  360. package/dist/admin/index.d.ts.map +0 -1
  361. package/dist/admin/index.js.map +0 -1
  362. package/dist/ai/collections/AiContext.d.ts.map +0 -1
  363. package/dist/ai/collections/AiContext.js.map +0 -1
  364. package/dist/ai/collections/AiPrompts.d.ts.map +0 -1
  365. package/dist/ai/collections/AiPrompts.js.map +0 -1
  366. package/dist/ai/createAiApiRoutes.d.ts.map +0 -1
  367. package/dist/ai/createAiApiRoutes.js.map +0 -1
  368. package/dist/ai/createAiGenerate.d.ts.map +0 -1
  369. package/dist/ai/createAiGenerate.js.map +0 -1
  370. package/dist/ai/createAiPlugin.d.ts.map +0 -1
  371. package/dist/ai/createAiPlugin.js.map +0 -1
  372. package/dist/ai/hooks/useAiContext.d.ts.map +0 -1
  373. package/dist/ai/hooks/useAiContext.js.map +0 -1
  374. package/dist/ai/hooks/useAiPrompts.d.ts.map +0 -1
  375. package/dist/ai/hooks/useAiPrompts.js.map +0 -1
  376. package/dist/ai/index.d.ts.map +0 -1
  377. package/dist/ai/index.js.map +0 -1
  378. package/dist/ai/plugins/ContextEditorPanel.d.ts.map +0 -1
  379. package/dist/ai/plugins/ContextEditorPanel.js.map +0 -1
  380. package/dist/ai/plugins/PromptEditorPanel.d.ts.map +0 -1
  381. package/dist/ai/plugins/PromptEditorPanel.js.map +0 -1
  382. package/dist/ai/plugins/contextEditorPlugin.d.ts.map +0 -1
  383. package/dist/ai/plugins/contextEditorPlugin.js.map +0 -1
  384. package/dist/ai/plugins/promptApiRoutes.d.ts.map +0 -1
  385. package/dist/ai/plugins/promptApiRoutes.js.map +0 -1
  386. package/dist/ai/plugins/promptEditorPlugin.d.ts.map +0 -1
  387. package/dist/ai/plugins/promptEditorPlugin.js.map +0 -1
  388. package/dist/ai/presets/componentAiDefaults.d.ts.map +0 -1
  389. package/dist/ai/presets/componentAiDefaults.js.map +0 -1
  390. package/dist/ai/presets/index.d.ts.map +0 -1
  391. package/dist/ai/presets/index.js.map +0 -1
  392. package/dist/ai/presets/instructions/interactive.d.ts.map +0 -1
  393. package/dist/ai/presets/instructions/interactive.js.map +0 -1
  394. package/dist/ai/presets/instructions/layout.d.ts.map +0 -1
  395. package/dist/ai/presets/instructions/layout.js.map +0 -1
  396. package/dist/ai/presets/instructions/media.d.ts.map +0 -1
  397. package/dist/ai/presets/instructions/media.js.map +0 -1
  398. package/dist/ai/presets/instructions/pagePatterns.d.ts.map +0 -1
  399. package/dist/ai/presets/instructions/pagePatterns.js.map +0 -1
  400. package/dist/ai/presets/instructions/schemas.d.ts.map +0 -1
  401. package/dist/ai/presets/instructions/schemas.js.map +0 -1
  402. package/dist/ai/presets/instructions/typography.d.ts.map +0 -1
  403. package/dist/ai/presets/instructions/typography.js.map +0 -1
  404. package/dist/ai/tools/index.d.ts.map +0 -1
  405. package/dist/ai/tools/index.js.map +0 -1
  406. package/dist/ai/types.d.ts.map +0 -1
  407. package/dist/ai/types.js.map +0 -1
  408. package/dist/ai/utils/injectAiConfig.d.ts.map +0 -1
  409. package/dist/ai/utils/injectAiConfig.js.map +0 -1
  410. package/dist/api/createPuckApiRoutes.d.ts.map +0 -1
  411. package/dist/api/createPuckApiRoutes.js.map +0 -1
  412. package/dist/api/createPuckApiRoutesVersions.d.ts.map +0 -1
  413. package/dist/api/createPuckApiRoutesVersions.js.map +0 -1
  414. package/dist/api/createPuckApiRoutesWithId.d.ts.map +0 -1
  415. package/dist/api/createPuckApiRoutesWithId.js.map +0 -1
  416. package/dist/api/index.d.ts.map +0 -1
  417. package/dist/api/index.js.map +0 -1
  418. package/dist/api/payload-config.d.js.map +0 -1
  419. package/dist/api/types.d.ts.map +0 -1
  420. package/dist/api/types.js.map +0 -1
  421. package/dist/api/utils/mapRootProps.d.ts.map +0 -1
  422. package/dist/api/utils/mapRootProps.js.map +0 -1
  423. package/dist/collections/Templates.d.ts.map +0 -1
  424. package/dist/collections/Templates.js.map +0 -1
  425. package/dist/components/AccordionClient.d.ts.map +0 -1
  426. package/dist/components/AccordionClient.js.map +0 -1
  427. package/dist/components/AnimatedWrapper.d.ts.map +0 -1
  428. package/dist/components/AnimatedWrapper.js.map +0 -1
  429. package/dist/components/exports.d.ts.map +0 -1
  430. package/dist/components/exports.js.map +0 -1
  431. package/dist/components/index.d.ts.map +0 -1
  432. package/dist/components/index.js.map +0 -1
  433. package/dist/components/interactive/Accordion.d.ts.map +0 -1
  434. package/dist/components/interactive/Accordion.js.map +0 -1
  435. package/dist/components/interactive/Accordion.server.d.ts.map +0 -1
  436. package/dist/components/interactive/Accordion.server.js.map +0 -1
  437. package/dist/components/interactive/Button.d.ts.map +0 -1
  438. package/dist/components/interactive/Button.js.map +0 -1
  439. package/dist/components/interactive/Button.server.d.ts.map +0 -1
  440. package/dist/components/interactive/Button.server.js.map +0 -1
  441. package/dist/components/interactive/Card.d.ts.map +0 -1
  442. package/dist/components/interactive/Card.js.map +0 -1
  443. package/dist/components/interactive/Card.server.d.ts.map +0 -1
  444. package/dist/components/interactive/Card.server.js.map +0 -1
  445. package/dist/components/interactive/Divider.d.ts.map +0 -1
  446. package/dist/components/interactive/Divider.js.map +0 -1
  447. package/dist/components/interactive/Divider.server.d.ts.map +0 -1
  448. package/dist/components/interactive/Divider.server.js.map +0 -1
  449. package/dist/components/interactive/index.d.ts.map +0 -1
  450. package/dist/components/interactive/index.js.map +0 -1
  451. package/dist/components/layout/Container.d.ts.map +0 -1
  452. package/dist/components/layout/Container.js.map +0 -1
  453. package/dist/components/layout/Container.server.d.ts.map +0 -1
  454. package/dist/components/layout/Container.server.js.map +0 -1
  455. package/dist/components/layout/Flex.d.ts.map +0 -1
  456. package/dist/components/layout/Flex.js.map +0 -1
  457. package/dist/components/layout/Flex.server.d.ts.map +0 -1
  458. package/dist/components/layout/Flex.server.js.map +0 -1
  459. package/dist/components/layout/Grid.d.ts.map +0 -1
  460. package/dist/components/layout/Grid.js.map +0 -1
  461. package/dist/components/layout/Grid.server.d.ts.map +0 -1
  462. package/dist/components/layout/Grid.server.js.map +0 -1
  463. package/dist/components/layout/Section.d.ts.map +0 -1
  464. package/dist/components/layout/Section.js.map +0 -1
  465. package/dist/components/layout/Section.server.d.ts.map +0 -1
  466. package/dist/components/layout/Section.server.js.map +0 -1
  467. package/dist/components/layout/Spacer.d.ts.map +0 -1
  468. package/dist/components/layout/Spacer.js.map +0 -1
  469. package/dist/components/layout/Spacer.server.d.ts.map +0 -1
  470. package/dist/components/layout/Spacer.server.js.map +0 -1
  471. package/dist/components/layout/Template.d.ts.map +0 -1
  472. package/dist/components/layout/Template.js.map +0 -1
  473. package/dist/components/layout/Template.server.d.ts.map +0 -1
  474. package/dist/components/layout/Template.server.js.map +0 -1
  475. package/dist/components/layout/index.d.ts.map +0 -1
  476. package/dist/components/layout/index.js.map +0 -1
  477. package/dist/components/media/Image.d.ts.map +0 -1
  478. package/dist/components/media/Image.js.map +0 -1
  479. package/dist/components/media/Image.server.d.ts.map +0 -1
  480. package/dist/components/media/Image.server.js.map +0 -1
  481. package/dist/components/media/index.d.ts.map +0 -1
  482. package/dist/components/media/index.js.map +0 -1
  483. package/dist/components/typography/Heading.d.ts.map +0 -1
  484. package/dist/components/typography/Heading.js.map +0 -1
  485. package/dist/components/typography/Heading.server.d.ts.map +0 -1
  486. package/dist/components/typography/Heading.server.js.map +0 -1
  487. package/dist/components/typography/RichText.editor.d.ts.map +0 -1
  488. package/dist/components/typography/RichText.editor.js.map +0 -1
  489. package/dist/components/typography/RichText.server.d.ts.map +0 -1
  490. package/dist/components/typography/RichText.server.js.map +0 -1
  491. package/dist/components/typography/Text.d.ts.map +0 -1
  492. package/dist/components/typography/Text.js.map +0 -1
  493. package/dist/components/typography/Text.server.d.ts.map +0 -1
  494. package/dist/components/typography/Text.server.js.map +0 -1
  495. package/dist/components/typography/index.d.ts.map +0 -1
  496. package/dist/components/typography/index.js.map +0 -1
  497. package/dist/config/config.editor.d.ts.map +0 -1
  498. package/dist/config/config.editor.js.map +0 -1
  499. package/dist/config/index.d.ts.map +0 -1
  500. package/dist/config/index.js.map +0 -1
  501. package/dist/config/merge.d.ts.map +0 -1
  502. package/dist/config/merge.js.map +0 -1
  503. package/dist/config/presets.d.ts.map +0 -1
  504. package/dist/config/presets.js.map +0 -1
  505. package/dist/config/types.d.ts.map +0 -1
  506. package/dist/config/types.js.map +0 -1
  507. package/dist/editor/PuckEditor.d.ts.map +0 -1
  508. package/dist/editor/PuckEditor.js.map +0 -1
  509. package/dist/editor/PuckEditorImpl.client.d.ts.map +0 -1
  510. package/dist/editor/PuckEditorImpl.client.js.map +0 -1
  511. package/dist/editor/components/DarkModeStyles.d.ts.map +0 -1
  512. package/dist/editor/components/DarkModeStyles.js.map +0 -1
  513. package/dist/editor/components/HeaderActions.d.ts.map +0 -1
  514. package/dist/editor/components/HeaderActions.js.map +0 -1
  515. package/dist/editor/components/IframeWrapper.d.ts.map +0 -1
  516. package/dist/editor/components/IframeWrapper.js.map +0 -1
  517. package/dist/editor/components/LoadingState.d.ts.map +0 -1
  518. package/dist/editor/components/LoadingState.js.map +0 -1
  519. package/dist/editor/components/PreviewModal.d.ts.map +0 -1
  520. package/dist/editor/components/PreviewModal.js.map +0 -1
  521. package/dist/editor/components/PreviewModeToggle.d.ts.map +0 -1
  522. package/dist/editor/components/PreviewModeToggle.js.map +0 -1
  523. package/dist/editor/components/VersionHistory.d.ts.map +0 -1
  524. package/dist/editor/components/VersionHistory.js.map +0 -1
  525. package/dist/editor/hooks/useDarkMode.d.ts.map +0 -1
  526. package/dist/editor/hooks/useDarkMode.js.map +0 -1
  527. package/dist/editor/hooks/useUnsavedChanges.d.ts.map +0 -1
  528. package/dist/editor/hooks/useUnsavedChanges.js.map +0 -1
  529. package/dist/editor/index.d.ts.map +0 -1
  530. package/dist/editor/index.js.map +0 -1
  531. package/dist/editor/plugins/VersionHistoryPanel.d.ts.map +0 -1
  532. package/dist/editor/plugins/VersionHistoryPanel.js.map +0 -1
  533. package/dist/editor/plugins/index.d.ts.map +0 -1
  534. package/dist/editor/plugins/index.js.map +0 -1
  535. package/dist/editor/plugins/versionHistoryPlugin.d.ts.map +0 -1
  536. package/dist/editor/plugins/versionHistoryPlugin.js.map +0 -1
  537. package/dist/editor/utils/detectPageTree.d.ts.map +0 -1
  538. package/dist/editor/utils/detectPageTree.js.map +0 -1
  539. package/dist/editor/utils/index.d.ts.map +0 -1
  540. package/dist/editor/utils/index.js.map +0 -1
  541. package/dist/editor/utils/injectPageTreeFields.d.ts.map +0 -1
  542. package/dist/editor/utils/injectPageTreeFields.js.map +0 -1
  543. package/dist/endpoints/ai.d.ts.map +0 -1
  544. package/dist/endpoints/ai.js.map +0 -1
  545. package/dist/endpoints/context.d.ts.map +0 -1
  546. package/dist/endpoints/context.js.map +0 -1
  547. package/dist/endpoints/index.d.ts.map +0 -1
  548. package/dist/endpoints/index.js.map +0 -1
  549. package/dist/endpoints/postcss.d.js.map +0 -1
  550. package/dist/endpoints/prompts.d.ts.map +0 -1
  551. package/dist/endpoints/prompts.js.map +0 -1
  552. package/dist/endpoints/styles.d.ts.map +0 -1
  553. package/dist/endpoints/styles.js.map +0 -1
  554. package/dist/exports/client.d.ts.map +0 -1
  555. package/dist/exports/client.js.map +0 -1
  556. package/dist/exports/rsc.d.ts.map +0 -1
  557. package/dist/exports/rsc.js.map +0 -1
  558. package/dist/fields/AlignmentField.d.ts.map +0 -1
  559. package/dist/fields/AlignmentField.js.map +0 -1
  560. package/dist/fields/AnimationField.d.ts.map +0 -1
  561. package/dist/fields/AnimationField.js.map +0 -1
  562. package/dist/fields/BackgroundField.d.ts.map +0 -1
  563. package/dist/fields/BackgroundField.js.map +0 -1
  564. package/dist/fields/BorderField.d.ts.map +0 -1
  565. package/dist/fields/BorderField.js.map +0 -1
  566. package/dist/fields/ColorPickerField.d.ts.map +0 -1
  567. package/dist/fields/ColorPickerField.js.map +0 -1
  568. package/dist/fields/ContentAlignmentField.d.ts.map +0 -1
  569. package/dist/fields/ContentAlignmentField.js.map +0 -1
  570. package/dist/fields/DimensionsField.d.ts.map +0 -1
  571. package/dist/fields/DimensionsField.js.map +0 -1
  572. package/dist/fields/FlexAlignmentField.d.ts.map +0 -1
  573. package/dist/fields/FlexAlignmentField.js.map +0 -1
  574. package/dist/fields/FolderPickerField.d.ts.map +0 -1
  575. package/dist/fields/FolderPickerField.js.map +0 -1
  576. package/dist/fields/GradientEditor.d.ts.map +0 -1
  577. package/dist/fields/GradientEditor.js.map +0 -1
  578. package/dist/fields/LockedField.d.ts.map +0 -1
  579. package/dist/fields/LockedField.js.map +0 -1
  580. package/dist/fields/MarginField.d.ts.map +0 -1
  581. package/dist/fields/MarginField.js.map +0 -1
  582. package/dist/fields/MediaField.d.ts.map +0 -1
  583. package/dist/fields/MediaField.js.map +0 -1
  584. package/dist/fields/PaddingField.d.ts.map +0 -1
  585. package/dist/fields/PaddingField.js.map +0 -1
  586. package/dist/fields/PageSegmentField.d.ts.map +0 -1
  587. package/dist/fields/PageSegmentField.js.map +0 -1
  588. package/dist/fields/ResetField.d.ts.map +0 -1
  589. package/dist/fields/ResetField.js.map +0 -1
  590. package/dist/fields/ResponsiveField.d.ts.map +0 -1
  591. package/dist/fields/ResponsiveField.js.map +0 -1
  592. package/dist/fields/ResponsiveVisibilityField.d.ts.map +0 -1
  593. package/dist/fields/ResponsiveVisibilityField.js.map +0 -1
  594. package/dist/fields/SizeField.d.ts.map +0 -1
  595. package/dist/fields/SizeField.js.map +0 -1
  596. package/dist/fields/SlugPreviewField.d.ts.map +0 -1
  597. package/dist/fields/SlugPreviewField.js.map +0 -1
  598. package/dist/fields/TemplateField.d.ts.map +0 -1
  599. package/dist/fields/TemplateField.js.map +0 -1
  600. package/dist/fields/TransformField.d.ts.map +0 -1
  601. package/dist/fields/TransformField.js.map +0 -1
  602. package/dist/fields/VerticalAlignmentField.d.ts.map +0 -1
  603. package/dist/fields/VerticalAlignmentField.js.map +0 -1
  604. package/dist/fields/WidthField.d.ts.map +0 -1
  605. package/dist/fields/WidthField.js.map +0 -1
  606. package/dist/fields/index.d.ts.map +0 -1
  607. package/dist/fields/index.js.map +0 -1
  608. package/dist/fields/richtext/controls/ColorPickerControl.d.ts.map +0 -1
  609. package/dist/fields/richtext/controls/ColorPickerControl.js.map +0 -1
  610. package/dist/fields/richtext/controls/DropdownPortal.d.ts.map +0 -1
  611. package/dist/fields/richtext/controls/DropdownPortal.js.map +0 -1
  612. package/dist/fields/richtext/controls/FontSizeControl.d.ts.map +0 -1
  613. package/dist/fields/richtext/controls/FontSizeControl.js.map +0 -1
  614. package/dist/fields/richtext/controls/HighlightControl.d.ts.map +0 -1
  615. package/dist/fields/richtext/controls/HighlightControl.js.map +0 -1
  616. package/dist/fields/richtext/controls/index.d.ts.map +0 -1
  617. package/dist/fields/richtext/controls/index.js.map +0 -1
  618. package/dist/fields/richtext/controls/shared.d.ts.map +0 -1
  619. package/dist/fields/richtext/controls/shared.js.map +0 -1
  620. package/dist/fields/richtext/createRichTextField.d.ts.map +0 -1
  621. package/dist/fields/richtext/createRichTextField.js.map +0 -1
  622. package/dist/fields/richtext/extensions/FontSize.d.ts.map +0 -1
  623. package/dist/fields/richtext/extensions/FontSize.js.map +0 -1
  624. package/dist/fields/richtext/extensions/index.d.ts.map +0 -1
  625. package/dist/fields/richtext/extensions/index.js.map +0 -1
  626. package/dist/fields/richtext/index.d.ts.map +0 -1
  627. package/dist/fields/richtext/index.js.map +0 -1
  628. package/dist/fields/shared.d.ts.map +0 -1
  629. package/dist/fields/shared.js.map +0 -1
  630. package/dist/hooks/index.d.ts.map +0 -1
  631. package/dist/hooks/index.js.map +0 -1
  632. package/dist/hooks/useResponsiveStyles.d.ts.map +0 -1
  633. package/dist/hooks/useResponsiveStyles.js.map +0 -1
  634. package/dist/hooks/useScrollAnimation.d.ts.map +0 -1
  635. package/dist/hooks/useScrollAnimation.js.map +0 -1
  636. package/dist/index.d.ts.map +0 -1
  637. package/dist/index.js.map +0 -1
  638. package/dist/layouts/LayoutWrapper.d.ts.map +0 -1
  639. package/dist/layouts/LayoutWrapper.js.map +0 -1
  640. package/dist/layouts/defaults.d.ts.map +0 -1
  641. package/dist/layouts/defaults.js.map +0 -1
  642. package/dist/layouts/index.d.ts.map +0 -1
  643. package/dist/layouts/index.js.map +0 -1
  644. package/dist/layouts/types.d.ts.map +0 -1
  645. package/dist/layouts/types.js.map +0 -1
  646. package/dist/layouts/utils.d.ts.map +0 -1
  647. package/dist/layouts/utils.js.map +0 -1
  648. package/dist/next/index.d.ts.map +0 -1
  649. package/dist/next/index.js.map +0 -1
  650. package/dist/plugin/collections/Pages.d.ts.map +0 -1
  651. package/dist/plugin/collections/Pages.js.map +0 -1
  652. package/dist/plugin/fields/index.d.ts.map +0 -1
  653. package/dist/plugin/fields/index.js.map +0 -1
  654. package/dist/plugin/fields/types.d.ts.map +0 -1
  655. package/dist/plugin/fields/types.js.map +0 -1
  656. package/dist/plugin/hooks/index.d.ts.map +0 -1
  657. package/dist/plugin/hooks/index.js.map +0 -1
  658. package/dist/plugin/hooks/isHomepageUnique.d.ts.map +0 -1
  659. package/dist/plugin/hooks/isHomepageUnique.js.map +0 -1
  660. package/dist/plugin/index.d.ts.map +0 -1
  661. package/dist/plugin/index.js.map +0 -1
  662. package/dist/render/HybridPageRenderer.d.ts.map +0 -1
  663. package/dist/render/HybridPageRenderer.js.map +0 -1
  664. package/dist/render/PageRenderer.d.ts.map +0 -1
  665. package/dist/render/PageRenderer.js.map +0 -1
  666. package/dist/render/PuckEditor.client.d.ts.map +0 -1
  667. package/dist/render/PuckEditor.client.js.map +0 -1
  668. package/dist/render/index.d.ts.map +0 -1
  669. package/dist/render/index.js.map +0 -1
  670. package/dist/theme/context.d.ts.map +0 -1
  671. package/dist/theme/context.js.map +0 -1
  672. package/dist/theme/defaults.d.ts.map +0 -1
  673. package/dist/theme/defaults.js.map +0 -1
  674. package/dist/theme/example.d.ts.map +0 -1
  675. package/dist/theme/example.js.map +0 -1
  676. package/dist/theme/index.d.ts.map +0 -1
  677. package/dist/theme/index.js.map +0 -1
  678. package/dist/theme/types.d.ts.map +0 -1
  679. package/dist/theme/types.js.map +0 -1
  680. package/dist/theme/utils.d.ts.map +0 -1
  681. package/dist/theme/utils.js.map +0 -1
  682. package/dist/types/index.d.ts.map +0 -1
  683. package/dist/types/index.js.map +0 -1
  684. package/dist/utils/index.d.ts.map +0 -1
  685. package/dist/utils/index.js.map +0 -1
  686. package/dist/utils/migration.d.ts.map +0 -1
  687. package/dist/utils/migration.js.map +0 -1
  688. package/dist/utils/validation.d.ts.map +0 -1
  689. package/dist/utils/validation.js.map +0 -1
  690. package/dist/version.d.ts.map +0 -1
  691. package/dist/version.js.map +0 -1
  692. package/dist/views/PuckConfigContext.d.ts.map +0 -1
  693. package/dist/views/PuckConfigContext.js.map +0 -1
  694. package/dist/views/PuckEditorView.d.ts.map +0 -1
  695. package/dist/views/PuckEditorView.js.map +0 -1
  696. package/dist/views/index.d.ts.map +0 -1
  697. package/dist/views/index.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/config/types.ts"],"sourcesContent":["/**\n * Server-specific Puck configuration types\n *\n * These types are designed for server-side rendering where field definitions\n * are not needed (only the render function matters).\n */\n\nimport type { ReactNode } from 'react'\n\n/**\n * Slot field definition - the only field type needed in server configs\n *\n * When a component has child content (slots), Puck needs the slot field\n * defined so it can transform the slot data into a renderable component.\n */\nexport interface SlotField {\n type: 'slot'\n}\n\n/**\n * Server-safe component configuration\n *\n * Use this type for component configs in `.server.tsx` files.\n * Unlike Puck's full `ComponentConfig`, this type:\n * - Makes `fields` truly optional (no TypeScript pressure to define them)\n * - Only expects slot fields when components have child content\n * - Focuses on what servers actually need: `render` and `defaultProps`\n *\n * @example\n * ```tsx\n * // Component WITHOUT slots - no fields needed\n * import type { ServerComponentConfig } from '@delmaredigital/payload-puck/config'\n *\n * export const ButtonConfig: ServerComponentConfig<ButtonProps> = {\n * label: 'Button',\n * defaultProps,\n * render: ({ text, link }) => <a href={link}>{text}</a>\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Component WITH slots - only slot field needed\n * import type { ServerComponentConfig } from '@delmaredigital/payload-puck/config'\n *\n * export const SectionConfig: ServerComponentConfig<SectionProps> = {\n * label: 'Section',\n * fields: { content: { type: 'slot' } },\n * defaultProps,\n * render: ({ content: Content }) => <section><Content /></section>\n * }\n * ```\n */\nexport interface ServerComponentConfig<Props = Record<string, unknown>> {\n /**\n * Display label for the component in the editor sidebar\n */\n label?: string\n\n /**\n * Default prop values for new instances of this component\n */\n defaultProps?: Props\n\n /**\n * Slot fields only - define these when your component has child content areas\n *\n * For server configs, you only need to define slot fields. Other field types\n * (text, number, select, etc.) are only used by the editor and can be omitted.\n *\n * @example\n * ```tsx\n * fields: {\n * content: { type: 'slot' }, // Main content area\n * sidebar: { type: 'slot' }, // Optional sidebar slot\n * }\n * ```\n */\n fields?: Record<string, SlotField>\n\n /**\n * Render function for the component\n *\n * This is called during server-side rendering. Must be a pure function\n * without React hooks or client-side interactivity.\n *\n * Slot props are transformed by Puck into renderable components.\n */\n render: (props: Props & { puck?: { isEditing?: boolean }; id?: string }) => ReactNode\n}\n\n/**\n * Server-safe root configuration\n *\n * Use this for the root config in server-side Puck configurations.\n */\nexport interface ServerRootConfig<\n Props extends Record<string, unknown> = Record<string, unknown>,\n> {\n /**\n * Default prop values for the root\n */\n defaultProps?: Partial<Props>\n\n /**\n * Root fields are not needed for server rendering\n */\n fields?: never\n\n /**\n * Render function for the root wrapper\n */\n render: (props: Props & { children: ReactNode }) => ReactNode\n}\n"],"names":[],"mappings":"AAAA;;;;;CAKC,GAsFD;;;;CAIC,GACD,WAiBC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PuckEditor.d.ts","sourceRoot":"","sources":["../../src/editor/PuckEditor.tsx"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/editor/PuckEditor.tsx"],"sourcesContent":["'use client'\n\nimport { useMemo } from 'react'\nimport dynamic from 'next/dynamic'\nimport type { Config as PuckConfig, Data, Plugin as PuckPlugin, Overrides as PuckOverrides } from '@puckeditor/core'\nimport type { ReactNode } from 'react'\nimport type { LayoutStyle } from './components/IframeWrapper.js'\nimport type { ThemeConfig } from '../theme/index.js'\nimport type { LayoutDefinition } from '../layouts/index.js'\nimport type { AiExamplePrompt, ComponentAiOverrides } from '../ai/types.js'\nimport { LoadingState } from './components/LoadingState.js'\nimport { injectPageTreeFields } from './utils/injectPageTreeFields.js'\nimport { hasPageTreeFields } from './utils/detectPageTree.js'\nimport { usePuckConfig } from '../views/PuckConfigContext.js'\nimport { injectAiConfig, hasAiConfig } from '../ai/utils/injectAiConfig.js'\nimport { comprehensiveComponentAiConfig } from '../ai/presets/index.js'\n\n// Dynamic import with ssr: false to prevent hydration mismatch\n// Puck generates random IDs for drag-and-drop that differ between server/client\nconst PuckEditorImpl = dynamic(\n () => import('./PuckEditorImpl.client.js').then((mod) => mod.PuckEditorImpl),\n {\n ssr: false,\n loading: () => <LoadingState />,\n }\n)\n\nexport interface PuckEditorProps {\n /**\n * Page ID for save operations\n */\n pageId: string\n /**\n * Initial Puck data to load\n */\n initialData: Data\n /**\n * Puck configuration with components and settings.\n * If not provided, will attempt to read from PuckConfigContext.\n */\n config?: PuckConfig\n /**\n * Page title for display\n */\n pageTitle: string\n /**\n * Page slug for preview URL\n */\n pageSlug: string\n /**\n * API endpoint for save operations\n * @default '/api/puck/pages'\n */\n apiEndpoint?: string\n /**\n * URL to navigate to when back button is clicked\n */\n backUrl?: string\n /**\n * Preview URL or function to generate preview URL from slug\n */\n previewUrl?: string | ((slug: string) => string)\n /**\n * URL prefix for preview (e.g., '/acme' for org-scoped pages).\n * When provided, the preview URL will be built as:\n * - Homepage: `{prefix}`\n * - Regular pages: `{prefix}/{slug}`\n * This is useful for Server Components where functions can't be passed.\n */\n previewUrlPrefix?: string\n /**\n * Whether to enable viewport switching\n * @default true\n */\n enableViewports?: boolean\n /**\n * Additional Puck plugins to use.\n * The headingAnalyzer plugin is included by default.\n * Set to `false` to disable all default plugins.\n */\n plugins?: PuckPlugin[] | false\n /**\n * Layout definitions for the editor preview.\n * The editor reads header, footer, editorBackground, and editorDarkMode\n * from the layout definition matching the selected pageLayout.\n */\n layouts?: LayoutDefinition[]\n /**\n * Layout style configurations for theme-aware preview\n * @deprecated Use `layouts` prop instead. layoutStyles will be removed in a future version.\n */\n layoutStyles?: Record<string, LayoutStyle>\n /**\n * Key in root.props to read layout value from\n * @default 'pageLayout'\n */\n layoutKey?: string\n /**\n * Custom actions to render at the start of the header\n */\n headerActionsStart?: ReactNode\n /**\n * Custom actions to render at the end of the header\n */\n headerActionsEnd?: ReactNode\n /**\n * Puck overrides to merge with defaults\n */\n overrides?: Partial<PuckOverrides>\n /**\n * Callback on successful save\n */\n onSaveSuccess?: (data: Data) => void\n /**\n * Callback on save error\n */\n onSaveError?: (error: Error) => void\n /**\n * Callback when data changes\n */\n onChange?: (data: Data) => void\n /**\n * Initial document status from Payload (_status field)\n * Automatically populated when using PuckEditorView\n */\n initialStatus?: 'draft' | 'published'\n /**\n * Theme configuration for customizing component styles\n * When provided, components will use themed styles\n */\n theme?: ThemeConfig\n\n // Page-tree integration props\n\n /**\n * Enable page-tree integration (folder picker, page segment, computed slug).\n * When true, injects folder/pageSegment/slug fields into root config.\n * Requires @delmaredigital/payload-page-tree plugin to be installed.\n * @default false\n */\n hasPageTree?: boolean\n /**\n * Initial folder ID for page-tree integration.\n * Only used when hasPageTree is true.\n */\n folder?: string | null\n /**\n * Initial page segment for page-tree integration.\n * Only used when hasPageTree is true.\n */\n pageSegment?: string\n\n // Editor iframe styling props\n\n /**\n * Stylesheet URLs to inject into the editor iframe.\n * Use this to provide frontend CSS (Tailwind, CSS variables, etc.)\n * that header/footer components need for proper styling.\n * Takes precedence over stylesheets from PuckConfigProvider.\n *\n * @example\n * ```tsx\n * <PuckEditor\n * editorStylesheets={['/editor-styles.css']}\n * // ...\n * />\n * ```\n */\n editorStylesheets?: string[]\n /**\n * Raw CSS to inject into the editor iframe.\n * Useful for CSS variables or style overrides.\n * Takes precedence over CSS from PuckConfigProvider.\n *\n * @example\n * ```tsx\n * <PuckEditor\n * editorCss=\":root { --primary: blue; }\"\n * // ...\n * />\n * ```\n */\n editorCss?: string\n\n // AI integration props\n\n /**\n * Enable AI features in the editor.\n * When true, adds the AI chat plugin to the editor.\n * Requires @puckeditor/plugin-ai to be installed and\n * PUCK_API_KEY environment variable to be set.\n * @default false\n */\n enableAi?: boolean\n\n /**\n * AI plugin configuration options.\n * Only used when enableAi is true.\n */\n aiOptions?: {\n /**\n * API host for AI requests.\n * @default '/api/puck/ai'\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\n /**\n * Example prompts from plugin config.\n * These are merged with aiOptions.examplePrompts if both are provided.\n * Typically set automatically by PuckEditorView from plugin config.\n */\n aiExamplePrompts?: AiExamplePrompt[]\n\n /**\n * Whether the puck-ai-prompts collection is enabled.\n * When true, the prompt editor plugin is added to the plugin rail.\n * Typically set automatically by PuckEditorView from plugin config.\n */\n hasPromptsCollection?: boolean\n\n /**\n * Whether the puck-ai-context collection is enabled.\n * When true, the context editor plugin is added to the plugin rail.\n * Typically set automatically by PuckEditorView from plugin config.\n */\n hasContextCollection?: boolean\n\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 * Typically set automatically by PuckEditorView from plugin config.\n */\n aiComponentInstructions?: ComponentAiOverrides\n\n /**\n * Enable experimental full screen canvas mode.\n * When enabled, the canvas takes up the full viewport with a floating viewport switcher.\n * This is an experimental Puck feature.\n * @default false\n */\n experimentalFullScreenCanvas?: boolean\n\n // Dark mode props\n\n /**\n * Auto-detect dark mode from PayloadCMS admin.\n * When true (default), dark mode CSS is automatically injected when Payload is in dark mode.\n * Set to false to disable automatic dark mode detection.\n * @default true\n */\n autoDetectDarkMode?: boolean\n\n /**\n * Show the preview dark mode toggle near the viewport switcher.\n * Allows toggling the preview iframe between light/dark modes independently.\n * @default true\n */\n showPreviewDarkModeToggle?: boolean\n\n /**\n * Initial state for the preview dark mode toggle.\n * Only used when showPreviewDarkModeToggle is true.\n * @default false (light mode)\n */\n initialPreviewDarkMode?: boolean\n}\n\n/**\n * Puck Editor - The primary editor component\n *\n * A full-featured visual page builder with:\n * - Save draft and publish functionality\n * - Unsaved changes tracking with beforeunload warning\n * - Interactive/Edit mode toggle\n * - Theme-aware preview backgrounds\n * - Responsive viewport switching\n * - Optional page-tree integration (folder-based URL structure)\n *\n * @example Basic usage\n * ```tsx\n * 'use client'\n *\n * import { PuckEditor } from '@delmaredigital/payload-puck/editor'\n * import { editorConfig } from '@delmaredigital/payload-puck/config/editor'\n *\n * export function PageEditor({ page }) {\n * return (\n * <PuckEditor\n * pageId={page.id}\n * initialData={page.puckData}\n * config={editorConfig}\n * pageTitle={page.title}\n * pageSlug={page.slug}\n * apiEndpoint=\"/api/puck/pages\"\n * backUrl=\"/admin/pages\"\n * />\n * )\n * }\n * ```\n *\n * @example With page-tree integration\n * ```tsx\n * <PuckEditor\n * pageId={page.id}\n * initialData={page.puckData}\n * config={editorConfig}\n * pageTitle={page.title}\n * pageSlug={page.slug}\n * apiEndpoint=\"/api/puck/pages\"\n * hasPageTree={true}\n * folder={page.folder}\n * pageSegment={page.pageSegment}\n * />\n * ```\n */\nexport function PuckEditor({\n pageId,\n initialData,\n config: configProp,\n pageTitle,\n pageSlug,\n apiEndpoint,\n backUrl,\n previewUrl,\n previewUrlPrefix,\n enableViewports,\n plugins,\n layouts: layoutsProp,\n layoutStyles,\n layoutKey,\n headerActionsStart,\n headerActionsEnd,\n overrides,\n onSaveSuccess,\n onSaveError,\n onChange,\n initialStatus,\n theme: themeProp,\n // Page-tree props\n hasPageTree = false,\n folder,\n pageSegment,\n // Editor iframe styling props\n editorStylesheets: editorStylesheetsProp,\n editorCss: editorCssProp,\n // AI integration props\n enableAi = false,\n aiOptions,\n aiExamplePrompts,\n hasPromptsCollection = false,\n hasContextCollection = false,\n aiComponentInstructions,\n experimentalFullScreenCanvas = false,\n // Dark mode props\n autoDetectDarkMode = true,\n showPreviewDarkModeToggle = true,\n initialPreviewDarkMode = false,\n}: PuckEditorProps) {\n // Get config from context as fallback\n const {\n config: configFromContext,\n layouts: layoutsFromContext,\n theme: themeFromContext,\n plugins: pluginsFromContext,\n editorStylesheets: editorStylesheetsFromContext,\n editorCss: editorCssFromContext,\n } = usePuckConfig()\n\n // Use prop config if provided, otherwise fall back to context\n const baseConfig = configProp || configFromContext\n const theme = themeProp || themeFromContext\n\n // Merge plugins from props and context\n // Props take precedence and are added first, context plugins follow\n const mergedPlugins = useMemo(() => {\n // If plugins prop is false, disable all plugins (including context ones)\n if (plugins === false) return false\n // If plugins prop is provided (not undefined), it takes precedence\n // But also include context plugins\n const propPlugins = plugins || []\n const contextPlugins = pluginsFromContext || []\n const combined = [...propPlugins, ...contextPlugins]\n return combined.length > 0 ? combined : undefined\n }, [plugins, pluginsFromContext])\n\n // Props take precedence over context for editor stylesheets\n const editorStylesheets = editorStylesheetsProp || editorStylesheetsFromContext\n const editorCss = editorCssProp || editorCssFromContext\n\n // Merge layouts from props and context\n // Props may have metadata (value, label, editorBackground) but no React components\n // Context may have React components (header, footer) that can't be serialized through props\n // Merge by matching on 'value', combining properties, preferring context for components\n const layouts = useMemo(() => {\n // If no layouts from either source, return undefined\n if (!layoutsProp && !layoutsFromContext) return undefined\n // If only one source, use it\n if (!layoutsProp) return layoutsFromContext\n if (!layoutsFromContext) return layoutsProp\n\n // Merge: for each prop layout, find matching context layout and combine\n return layoutsProp.map((propLayout) => {\n const contextLayout = layoutsFromContext.find((c) => c.value === propLayout.value)\n if (!contextLayout) return propLayout\n\n // Combine: prop values first, then context values (context provides components)\n return {\n ...propLayout,\n // Context provides React components (these can't be serialized through server props)\n header: propLayout.header || contextLayout.header,\n footer: propLayout.footer || contextLayout.footer,\n // Context may also provide other values not in props\n editorBackground: propLayout.editorBackground || contextLayout.editorBackground,\n editorDarkMode: propLayout.editorDarkMode ?? contextLayout.editorDarkMode,\n stickyHeaderHeight: propLayout.stickyHeaderHeight ?? contextLayout.stickyHeaderHeight,\n styles: propLayout.styles || contextLayout.styles,\n }\n })\n }, [layoutsProp, layoutsFromContext])\n\n // Conditionally inject page-tree fields and AI config into config\n const finalConfig = useMemo(() => {\n if (!baseConfig) return null\n\n let config = baseConfig\n\n // Inject AI component instructions when AI is enabled\n if (enableAi && !hasAiConfig(config)) {\n // Merge comprehensive instructions with user-provided overrides\n const mergedAiConfig = aiComponentInstructions\n ? { ...comprehensiveComponentAiConfig, ...aiComponentInstructions }\n : comprehensiveComponentAiConfig\n\n config = injectAiConfig(config, mergedAiConfig)\n }\n\n // Inject page-tree fields if enabled\n if (hasPageTree && !hasPageTreeFields(config)) {\n config = injectPageTreeFields(config)\n }\n\n return config\n }, [baseConfig, hasPageTree, enableAi, aiComponentInstructions])\n\n // Merge page-tree initial values into initialData\n const finalInitialData = useMemo(() => {\n if (!hasPageTree) return initialData\n\n return {\n ...initialData,\n root: {\n ...initialData.root,\n props: {\n ...(initialData.root as any)?.props,\n // Only set if provided and hasPageTree is true\n ...(folder !== undefined && { folder }),\n ...(pageSegment !== undefined && { pageSegment }),\n },\n },\n }\n }, [initialData, hasPageTree, folder, pageSegment])\n\n // Show error if no config available\n if (!finalConfig) {\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: 'calc(100vh - 120px)',\n padding: '40px',\n textAlign: 'center',\n }}\n >\n <div\n style={{\n backgroundColor: 'var(--theme-elevation-50)',\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: '8px',\n padding: '32px 48px',\n maxWidth: '560px',\n }}\n >\n <h2\n style={{\n color: 'var(--theme-elevation-800)',\n fontSize: '18px',\n fontWeight: 600,\n margin: '0 0 12px 0',\n }}\n >\n Puck Configuration Required\n </h2>\n <p\n style={{\n color: 'var(--theme-elevation-500)',\n fontSize: '14px',\n lineHeight: 1.6,\n margin: '0 0 16px 0',\n }}\n >\n Either pass <code style={{ backgroundColor: 'var(--theme-elevation-100)', padding: '2px 6px', borderRadius: '4px', fontSize: '13px' }}>config</code> prop directly, or wrap your application with{' '}\n <code style={{ backgroundColor: 'var(--theme-elevation-100)', padding: '2px 6px', borderRadius: '4px', fontSize: '13px' }}>PuckConfigProvider</code>\n </p>\n <pre\n style={{\n backgroundColor: 'var(--theme-elevation-100)',\n padding: '16px',\n borderRadius: '6px',\n fontSize: '12px',\n textAlign: 'left',\n overflow: 'auto',\n margin: 0,\n }}\n >\n{`// Option 1: Pass config directly\n<PuckEditor config={editorConfig} ... />\n\n// Option 2: Use context provider\n<PuckConfigProvider config={editorConfig}>\n <PuckEditor ... />\n</PuckConfigProvider>`}\n </pre>\n </div>\n </div>\n )\n }\n\n // Merge example prompts from plugin config and aiOptions prop\n const mergedAiOptions = useMemo(() => {\n if (!enableAi) return undefined\n\n const mergedPrompts = [\n ...(aiExamplePrompts || []),\n ...(aiOptions?.examplePrompts || []),\n ]\n\n return {\n host: aiOptions?.host || '/api/puck/ai',\n examplePrompts: mergedPrompts.length > 0 ? mergedPrompts : undefined,\n }\n }, [enableAi, aiExamplePrompts, aiOptions])\n\n // Compute preview URL from prefix (for Server Component compatibility)\n // previewUrlPrefix takes precedence if provided\n const finalPreviewUrl = useMemo(() => {\n if (previewUrlPrefix) {\n // Convert prefix to a function that builds the full URL\n return (slug: string) => (slug ? `${previewUrlPrefix}/${slug}` : previewUrlPrefix)\n }\n return previewUrl\n }, [previewUrlPrefix, previewUrl])\n\n return (\n <PuckEditorImpl\n pageId={pageId}\n initialData={finalInitialData}\n config={finalConfig}\n pageTitle={pageTitle}\n pageSlug={pageSlug}\n apiEndpoint={apiEndpoint}\n backUrl={backUrl}\n previewUrl={finalPreviewUrl}\n enableViewports={enableViewports}\n plugins={mergedPlugins}\n layouts={layouts}\n layoutStyles={layoutStyles}\n layoutKey={layoutKey}\n headerActionsStart={headerActionsStart}\n headerActionsEnd={headerActionsEnd}\n overrides={overrides}\n onSaveSuccess={onSaveSuccess}\n onSaveError={onSaveError}\n onChange={onChange}\n initialStatus={initialStatus}\n theme={theme}\n editorStylesheets={editorStylesheets}\n editorCss={editorCss}\n enableAi={enableAi}\n aiOptions={mergedAiOptions}\n hasPromptsCollection={hasPromptsCollection}\n hasContextCollection={hasContextCollection}\n experimentalFullScreenCanvas={experimentalFullScreenCanvas}\n autoDetectDarkMode={autoDetectDarkMode}\n showPreviewDarkModeToggle={showPreviewDarkModeToggle}\n initialPreviewDarkMode={initialPreviewDarkMode}\n />\n )\n}\n"],"names":["useMemo","dynamic","LoadingState","injectPageTreeFields","hasPageTreeFields","usePuckConfig","injectAiConfig","hasAiConfig","comprehensiveComponentAiConfig","PuckEditorImpl","then","mod","ssr","loading","PuckEditor","pageId","initialData","config","configProp","pageTitle","pageSlug","apiEndpoint","backUrl","previewUrl","previewUrlPrefix","enableViewports","plugins","layouts","layoutsProp","layoutStyles","layoutKey","headerActionsStart","headerActionsEnd","overrides","onSaveSuccess","onSaveError","onChange","initialStatus","theme","themeProp","hasPageTree","folder","pageSegment","editorStylesheets","editorStylesheetsProp","editorCss","editorCssProp","enableAi","aiOptions","aiExamplePrompts","hasPromptsCollection","hasContextCollection","aiComponentInstructions","experimentalFullScreenCanvas","autoDetectDarkMode","showPreviewDarkModeToggle","initialPreviewDarkMode","configFromContext","layoutsFromContext","themeFromContext","pluginsFromContext","editorStylesheetsFromContext","editorCssFromContext","baseConfig","mergedPlugins","propPlugins","contextPlugins","combined","length","undefined","map","propLayout","contextLayout","find","c","value","header","footer","editorBackground","editorDarkMode","stickyHeaderHeight","styles","finalConfig","mergedAiConfig","finalInitialData","root","props","div","style","display","flexDirection","alignItems","justifyContent","height","padding","textAlign","backgroundColor","border","borderRadius","maxWidth","h2","color","fontSize","fontWeight","margin","p","lineHeight","code","pre","overflow","mergedAiOptions","mergedPrompts","examplePrompts","host","finalPreviewUrl","slug"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PuckEditorImpl.client.d.ts","sourceRoot":"","sources":["../../src/editor/PuckEditorImpl.client.tsx"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/editor/PuckEditorImpl.client.tsx"],"sourcesContent":["'use client'\n\nimport { useState, useCallback, useMemo, useRef, type ReactNode, createElement } from 'react'\nimport { useRouter } from 'next/navigation'\nimport { Puck, type Config as PuckConfig, type Data, type Plugin as PuckPlugin, type Overrides as PuckOverrides } from '@puckeditor/core'\nimport '@puckeditor/core/puck.css'\nimport headingAnalyzer from '@puckeditor/plugin-heading-analyzer'\nimport '@puckeditor/plugin-heading-analyzer/dist/index.css'\nimport { createAiPlugin } from '@puckeditor/plugin-ai'\nimport '@puckeditor/plugin-ai/styles.css'\nimport './ai-plugin-overrides.css'\n\nimport { Maximize2 } from 'lucide-react'\nimport { HeaderActions } from './components/HeaderActions.js'\nimport { IframeWrapper, type LayoutStyle } from './components/IframeWrapper.js'\nimport { PreviewModal } from './components/PreviewModal.js'\nimport { DarkModeStyles } from './components/DarkModeStyles.js'\nimport { useUnsavedChanges } from './hooks/useUnsavedChanges.js'\nimport { createVersionHistoryPlugin } from './plugins/versionHistoryPlugin.js'\nimport { ThemeProvider, type ThemeConfig } from '../theme/index.js'\nimport { usePuckConfig } from '../views/PuckConfigContext.js'\nimport type { LayoutDefinition } from '../layouts/index.js'\nimport type { AiExamplePrompt } from '../ai/types.js'\nimport { useAiPrompts } from '../ai/hooks/useAiPrompts.js'\n\n/**\n * Default viewports for responsive preview\n */\nconst DEFAULT_VIEWPORTS = [\n {\n width: 360,\n height: 'auto' as const,\n label: 'Mobile',\n icon: 'Smartphone' as const,\n },\n {\n width: 768,\n height: 'auto' as const,\n label: 'Tablet',\n icon: 'Tablet' as const,\n },\n {\n width: 1280,\n height: 'auto' as const,\n label: 'Desktop',\n icon: 'Monitor' as const,\n },\n {\n width: '100%' as const,\n height: 'auto' as const,\n label: 'Full Width',\n icon: createElement(Maximize2, { size: 16 }),\n },\n]\n\n/**\n * Extended Data type to include our root props\n */\ninterface PuckDataWithMeta extends Data {\n root: {\n props?: {\n title?: string\n slug?: string\n pageLayout?: string\n // Page-tree integration fields\n folder?: string | null\n pageSegment?: string\n // Homepage field\n isHomepage?: boolean\n [key: string]: unknown\n }\n }\n}\n\nexport interface PuckEditorImplProps {\n /**\n * Page ID for save operations\n */\n pageId: string\n /**\n * Initial Puck data to load\n */\n initialData: Data\n /**\n * Puck configuration with components and settings\n */\n config: PuckConfig\n /**\n * Page title for display\n */\n pageTitle: string\n /**\n * Page slug for preview URL\n */\n pageSlug: string\n /**\n * API endpoint for save operations\n * @default '/api/puck/pages'\n */\n apiEndpoint?: string\n /**\n * URL to navigate to when back button is clicked\n */\n backUrl?: string\n /**\n * Preview URL or function to generate preview URL from slug\n */\n previewUrl?: string | ((slug: string) => string)\n /**\n * Whether to enable viewport switching\n * @default true\n */\n enableViewports?: boolean\n /**\n * Additional Puck plugins to use.\n * The headingAnalyzer plugin is included by default.\n * Set to `false` to disable all default plugins.\n */\n plugins?: PuckPlugin[] | false\n /**\n * Layout definitions for the editor preview.\n * The editor reads header, footer, editorBackground, and editorDarkMode\n * from the layout definition matching the selected pageLayout.\n */\n layouts?: LayoutDefinition[]\n /**\n * Layout style configurations for theme-aware preview\n * @deprecated Use `layouts` prop instead. layoutStyles will be removed in a future version.\n */\n layoutStyles?: Record<string, LayoutStyle>\n /**\n * Key in root.props to read layout value from\n * @default 'pageLayout'\n */\n layoutKey?: string\n /**\n * Custom actions to render at the start of the header\n */\n headerActionsStart?: ReactNode\n /**\n * Custom actions to render at the end of the header\n */\n headerActionsEnd?: ReactNode\n /**\n * Puck overrides to merge with defaults\n */\n overrides?: Partial<PuckOverrides>\n /**\n * Callback on successful save\n */\n onSaveSuccess?: (data: Data) => void\n /**\n * Callback on save error\n */\n onSaveError?: (error: Error) => void\n /**\n * Callback when data changes\n */\n onChange?: (data: Data) => void\n /**\n * Initial document status from Payload (_status field)\n * Used to show draft/published badge in the header\n */\n initialStatus?: 'draft' | 'published'\n\n /**\n * Theme configuration for customizing component styles\n * When provided, components will use themed styles\n */\n theme?: ThemeConfig\n\n /**\n * Stylesheet URLs to inject into the editor iframe.\n * Merged with stylesheets from PuckConfigProvider context.\n */\n editorStylesheets?: string[]\n /**\n * Raw CSS to inject into the editor iframe.\n * Merged with CSS from PuckConfigProvider context.\n */\n editorCss?: string\n\n // AI integration props\n\n /**\n * Enable AI features in the editor.\n * When true, adds the AI chat plugin.\n * @default false\n */\n enableAi?: boolean\n\n /**\n * AI plugin configuration options.\n * Only used when enableAi is true.\n */\n aiOptions?: {\n host?: string\n examplePrompts?: AiExamplePrompt[]\n }\n\n /**\n * Whether the puck-ai-prompts collection is enabled.\n * When true, adds the prompt editor plugin to the plugin rail.\n * @default false\n */\n hasPromptsCollection?: boolean\n\n /**\n * Whether the puck-ai-context collection is enabled.\n * When true, adds the context editor plugin to the plugin rail.\n * @default false\n */\n hasContextCollection?: boolean\n\n /**\n * Enable experimental full screen canvas mode.\n * When enabled, the canvas takes up the full viewport with a floating viewport switcher.\n * @default false\n */\n experimentalFullScreenCanvas?: boolean\n\n // Dark mode props\n\n /**\n * Auto-detect dark mode from PayloadCMS admin.\n * When true (default), dark mode CSS is automatically injected when Payload is in dark mode.\n * Set to false to disable automatic dark mode detection.\n * @default true\n */\n autoDetectDarkMode?: boolean\n\n /**\n * Show the preview dark mode toggle near the viewport switcher.\n * Allows toggling the preview iframe between light/dark modes independently.\n * @default true\n */\n showPreviewDarkModeToggle?: boolean\n\n /**\n * Initial state for the preview dark mode toggle.\n * Only used when showPreviewDarkModeToggle is true.\n * @default false (light mode)\n */\n initialPreviewDarkMode?: boolean\n}\n\n/**\n * Full-featured Puck editor implementation\n *\n * Provides a complete editing experience with:\n * - Save draft and publish functionality\n * - Unsaved changes tracking with beforeunload warning\n * - Interactive/Edit mode toggle\n * - Theme-aware preview backgrounds\n * - Responsive viewport switching\n * - Custom header actions\n *\n * Internal implementation component - use PuckEditor instead.\n * @internal\n */\nexport function PuckEditorImpl({\n pageId,\n initialData,\n config,\n pageTitle,\n pageSlug,\n apiEndpoint = '/api/puck/pages',\n backUrl,\n previewUrl,\n enableViewports = true,\n plugins,\n layouts,\n layoutStyles,\n layoutKey = 'pageLayout',\n headerActionsStart,\n headerActionsEnd,\n overrides: customOverrides,\n onSaveSuccess,\n onSaveError,\n onChange: onChangeProp,\n initialStatus,\n theme,\n editorStylesheets: editorStylesheetsProp,\n editorCss: editorCssProp,\n enableAi = false,\n aiOptions,\n hasPromptsCollection = false,\n hasContextCollection = false,\n experimentalFullScreenCanvas = false,\n autoDetectDarkMode = true,\n showPreviewDarkModeToggle = true,\n initialPreviewDarkMode = false,\n}: PuckEditorImplProps) {\n const router = useRouter()\n const [isSaving, setIsSaving] = useState(false)\n const [lastSaved, setLastSaved] = useState<Date | null>(null)\n const [saveError, setSaveError] = useState<string | null>(null)\n const [documentStatus, setDocumentStatus] = useState<'draft' | 'published' | undefined>(initialStatus)\n // Track if document was ever published (initially or during this session)\n const [wasPublished, setWasPublished] = useState(initialStatus === 'published')\n const { hasUnsavedChanges, markClean, markDirty } = useUnsavedChanges()\n\n // Preview modal state\n const [isPreviewOpen, setIsPreviewOpen] = useState(false)\n\n // Preview dark mode state (for toggling dark/light in preview iframe)\n const [previewDarkMode, setPreviewDarkMode] = useState(initialPreviewDarkMode)\n\n // Inject slug into initial data if not present\n const dataWithSlug = useMemo<PuckDataWithMeta>(() => {\n const data = initialData as PuckDataWithMeta\n return {\n ...data,\n root: {\n ...data.root,\n props: {\n ...data.root?.props,\n slug: data.root?.props?.slug || pageSlug,\n },\n },\n }\n }, [initialData, pageSlug])\n\n // Use a ref to track latest data without causing re-renders\n const latestDataRef = useRef<PuckDataWithMeta>(dataWithSlug)\n\n // Get editor stylesheets from PuckConfigProvider context (as fallback)\n const { editorStylesheets: contextStylesheets, editorCss: contextCss } = usePuckConfig()\n\n // Props take precedence over context\n const baseStylesheets = editorStylesheetsProp || contextStylesheets\n const baseCss = editorCssProp || contextCss\n\n // Get current layout to merge layout-specific stylesheets\n const currentLayoutValue = dataWithSlug.root?.props?.pageLayout || 'default'\n const currentLayout = useMemo(() => {\n return layouts?.find((l) => l.value === currentLayoutValue)\n }, [layouts, currentLayoutValue])\n\n // Merge base stylesheets (props/context) + layout-specific settings\n const mergedEditorStylesheets = useMemo(() => {\n const fromBase = baseStylesheets || []\n const fromLayout = currentLayout?.editorStylesheets || []\n return [...fromBase, ...fromLayout]\n }, [baseStylesheets, currentLayout?.editorStylesheets])\n\n // Merge base CSS (props/context) + layout-specific settings\n const mergedEditorCss = useMemo(() => {\n const parts = [baseCss, currentLayout?.editorCss].filter(Boolean) as string[]\n return parts.length > 0 ? parts.join('\\n') : undefined\n }, [baseCss, currentLayout?.editorCss])\n\n // Helper to make save request with optional homepage swap\n const makeSaveRequest = useCallback(\n async (\n data: Data,\n options: { publish?: boolean; swapHomepage?: boolean } = {}\n ): Promise<Response> => {\n const typedData = data as PuckDataWithMeta\n return fetch(`${apiEndpoint}/${pageId}`, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n puckData: data,\n title: typedData.root?.props?.title || pageTitle,\n slug: typedData.root?.props?.slug || pageSlug,\n isHomepage: typedData.root?.props?.isHomepage,\n swapHomepage: options.swapHomepage,\n // Page-tree integration: include folder and pageSegment if present\n folder: typedData.root?.props?.folder,\n pageSegment: typedData.root?.props?.pageSegment,\n ...(options.publish ? { _status: 'published' } : { draft: true }),\n }),\n })\n },\n [apiEndpoint, pageId, pageTitle, pageSlug]\n )\n\n // Handle homepage conflict - prompt user to swap\n const handleHomepageConflict = useCallback(\n async (\n existingHomepage: { id: string; title: string; slug: string },\n data: Data,\n publish: boolean\n ): Promise<boolean> => {\n const confirmed = confirm(\n `\"${existingHomepage.title}\" (/${existingHomepage.slug}) is currently set as the homepage.\\n\\nDo you want to make this page the homepage instead?`\n )\n if (!confirmed) {\n return false\n }\n\n // Retry with swapHomepage flag\n const response = await makeSaveRequest(data, { publish, swapHomepage: true })\n if (!response.ok) {\n const errorData = await response.json()\n throw new Error(errorData.error || errorData.message || 'Failed to swap homepage')\n }\n return true\n },\n [makeSaveRequest]\n )\n\n // Handle save (as draft)\n const handleSave = useCallback(\n async (data: Data) => {\n setIsSaving(true)\n const typedData = data as PuckDataWithMeta\n try {\n const response = await makeSaveRequest(data, { publish: false })\n\n if (!response.ok) {\n const errorData = await response.json()\n\n // Check for homepage conflict error\n if (errorData.data?.existingHomepage) {\n const swapped = await handleHomepageConflict(\n errorData.data.existingHomepage,\n data,\n false\n )\n if (!swapped) {\n // User cancelled - don't show error, just return\n setIsSaving(false)\n return\n }\n // Successfully swapped - continue to success handling below\n } else {\n const errorMessage = errorData.error || errorData.message || 'Failed to save page'\n const err = new Error(errorMessage) as Error & { field?: string; details?: unknown }\n err.field = errorData.field\n err.details = errorData.details\n throw err\n }\n }\n\n setLastSaved(new Date())\n setSaveError(null) // Clear any previous error\n // After saving as draft, update status to draft (shows \"Unpublished Changes\" if was published)\n setDocumentStatus('draft')\n markClean()\n onSaveSuccess?.(data)\n } catch (error) {\n console.error('Error saving page:', error)\n setSaveError(error instanceof Error ? error.message : 'Unknown error')\n onSaveError?.(error instanceof Error ? error : new Error('Unknown error'))\n } finally {\n setIsSaving(false)\n }\n },\n [makeSaveRequest, handleHomepageConflict, markClean, onSaveSuccess, onSaveError]\n )\n\n // Handle publish\n const handlePublish = useCallback(\n async (data: Data) => {\n setIsSaving(true)\n const typedData = data as PuckDataWithMeta\n try {\n const response = await makeSaveRequest(data, { publish: true })\n\n if (!response.ok) {\n const errorData = await response.json()\n\n // Check for homepage conflict error\n if (errorData.data?.existingHomepage) {\n const swapped = await handleHomepageConflict(\n errorData.data.existingHomepage,\n data,\n true\n )\n if (!swapped) {\n // User cancelled - don't show error, just return\n setIsSaving(false)\n return\n }\n // Successfully swapped - continue to success handling below\n } else {\n const errorMessage = errorData.error || errorData.message || 'Failed to publish page'\n const err = new Error(errorMessage) as Error & { field?: string; details?: unknown }\n err.field = errorData.field\n err.details = errorData.details\n throw err\n }\n }\n\n setLastSaved(new Date())\n setSaveError(null) // Clear any previous error\n setDocumentStatus('published') // Update status after successful publish\n setWasPublished(true) // Mark as having been published\n markClean()\n onSaveSuccess?.(data)\n } catch (error) {\n console.error('Error publishing page:', error)\n setSaveError(error instanceof Error ? error.message : 'Unknown error')\n onSaveError?.(error instanceof Error ? error : new Error('Unknown error'))\n } finally {\n setIsSaving(false)\n }\n },\n [makeSaveRequest, handleHomepageConflict, markClean, onSaveSuccess, onSaveError]\n )\n\n // Handle unpublish (revert to draft)\n const handleUnpublish = useCallback(\n async () => {\n if (!confirm('This will unpublish the page and return it to draft status. Continue?')) {\n return\n }\n\n setIsSaving(true)\n try {\n const response = await fetch(`${apiEndpoint}/${pageId}`, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n _status: 'draft',\n }),\n })\n\n if (!response.ok) {\n const errorData = await response.json()\n const errorMessage = errorData.error || errorData.message || 'Failed to unpublish page'\n throw new Error(errorMessage)\n }\n\n setLastSaved(new Date())\n setSaveError(null)\n setDocumentStatus('draft')\n } catch (error) {\n console.error('Error unpublishing page:', error)\n setSaveError(error instanceof Error ? error.message : 'Unknown error')\n } finally {\n setIsSaving(false)\n }\n },\n [apiEndpoint, pageId]\n )\n\n // Handle data change\n const handleChange = useCallback(\n (data: Data) => {\n latestDataRef.current = data as PuckDataWithMeta\n markDirty()\n onChangeProp?.(data)\n },\n [markDirty, onChangeProp]\n )\n\n // Handle back navigation\n const handleBack = useCallback(() => {\n if (hasUnsavedChanges) {\n if (!confirm('You have unsaved changes. Are you sure you want to leave?')) {\n return\n }\n }\n if (backUrl) {\n router.push(backUrl)\n } else {\n router.back()\n }\n }, [hasUnsavedChanges, router, backUrl])\n\n // Handle preview (opens in new tab)\n const handlePreview = useCallback(() => {\n const rootProps = latestDataRef.current?.root?.props\n const currentSlug = rootProps?.slug || pageSlug\n const isHomepage = rootProps?.isHomepage === true\n let url: string\n if (typeof previewUrl === 'function') {\n // If homepage, pass '/' to the function, otherwise pass the slug\n url = previewUrl(isHomepage ? '' : currentSlug)\n } else if (previewUrl) {\n url = previewUrl\n } else {\n // If homepage, navigate to root, otherwise use slug\n url = isHomepage ? '/' : `/${currentSlug}`\n }\n window.open(url, '_blank')\n }, [pageSlug, previewUrl])\n\n // Handle opening preview modal\n const handleOpenPreview = useCallback(() => {\n setIsPreviewOpen(true)\n }, [])\n\n // Handle save from preview modal (returns Promise for navigation flow)\n const handleSaveFromPreview = useCallback(async () => {\n const data = latestDataRef.current\n setIsSaving(true)\n try {\n const response = await fetch(`${apiEndpoint}/${pageId}`, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n puckData: data,\n title: data?.root?.props?.title || pageTitle,\n slug: data?.root?.props?.slug || pageSlug,\n // Page-tree integration: include folder and pageSegment if present\n folder: data?.root?.props?.folder,\n pageSegment: data?.root?.props?.pageSegment,\n draft: true,\n }),\n })\n\n if (!response.ok) {\n const errorData = await response.json()\n const errorMessage = errorData.error || errorData.message || 'Failed to save page'\n throw new Error(errorMessage)\n }\n\n setLastSaved(new Date())\n setSaveError(null)\n setDocumentStatus('draft')\n markClean()\n onSaveSuccess?.(data)\n } catch (error) {\n console.error('Error saving page:', error)\n setSaveError(error instanceof Error ? error.message : 'Unknown error')\n onSaveError?.(error instanceof Error ? error : new Error('Unknown error'))\n throw error // Re-throw so preview modal knows save failed\n } finally {\n setIsSaving(false)\n }\n }, [apiEndpoint, pageId, pageTitle, pageSlug, markClean, onSaveSuccess, onSaveError])\n\n // Memoized overrides\n const overrides = useMemo<Partial<PuckOverrides>>(\n () => ({\n headerActions: ({ children }: { children: ReactNode }) => (\n <HeaderActions\n onBack={handleBack}\n onPreview={handlePreview}\n onSave={handleSave}\n onPublish={handlePublish}\n onUnpublish={handleUnpublish}\n onOpenPreview={handleOpenPreview}\n isSaving={isSaving}\n hasUnsavedChanges={hasUnsavedChanges}\n lastSaved={lastSaved}\n documentStatus={documentStatus}\n wasPublished={wasPublished}\n actionsStart={headerActionsStart}\n actionsEnd={headerActionsEnd}\n pageId={pageId}\n apiEndpoint={apiEndpoint}\n saveError={saveError}\n onDismissError={() => setSaveError(null)}\n showVersionHistory={false}\n showPreviewDarkModeToggle={showPreviewDarkModeToggle}\n previewDarkMode={previewDarkMode}\n onPreviewDarkModeChange={setPreviewDarkMode}\n >\n {children}\n </HeaderActions>\n ),\n // Always wrap iframe for richtext styles injection and theme-aware background\n iframe: ({ children, document }: { children: ReactNode; document?: Document }) => (\n <IframeWrapper\n document={document}\n layouts={layouts}\n layoutStyles={layoutStyles}\n layoutKey={layoutKey}\n editorStylesheets={mergedEditorStylesheets}\n editorCss={mergedEditorCss}\n previewDarkModeOverride={showPreviewDarkModeToggle ? previewDarkMode : undefined}\n >\n {children}\n </IframeWrapper>\n ),\n // Merge custom overrides\n ...customOverrides,\n }),\n [\n handleBack,\n handlePreview,\n handleSave,\n handlePublish,\n handleUnpublish,\n handleOpenPreview,\n isSaving,\n hasUnsavedChanges,\n lastSaved,\n saveError,\n documentStatus,\n wasPublished,\n headerActionsStart,\n headerActionsEnd,\n pageId,\n apiEndpoint,\n layouts,\n layoutStyles,\n layoutKey,\n customOverrides,\n mergedEditorStylesheets,\n mergedEditorCss,\n showPreviewDarkModeToggle,\n previewDarkMode,\n setPreviewDarkMode,\n ]\n )\n\n // Default plugins - headingAnalyzer is always included unless plugins is explicitly false\n const defaultPlugins: PuckPlugin[] = [headingAnalyzer]\n\n // Version history plugin for the plugin rail\n const versionHistoryPlugin = useMemo(() => {\n if (!pageId) return null\n return createVersionHistoryPlugin({\n pageId,\n apiEndpoint,\n onRestoreSuccess: markClean,\n })\n }, [pageId, apiEndpoint, markClean])\n\n // Fetch AI prompts client-side when prompts collection is enabled\n // This allows prompts to update in real-time when edited via the prompt editor panel\n const { prompts: clientPrompts, loading: promptsLoading } = useAiPrompts(\n '/api/puck/ai-prompts',\n enableAi && hasPromptsCollection\n )\n\n // Use refs to store the latest prompts so onClick handlers can access current values\n // without causing the plugin to be recreated (which would cause Puck to remount panels)\n const clientPromptsRef = useRef(clientPrompts)\n clientPromptsRef.current = clientPrompts\n const staticPromptsRef = useRef(aiOptions?.examplePrompts)\n staticPromptsRef.current = aiOptions?.examplePrompts\n\n // AI plugin - statically imported, only instantiated when enabled\n // IMPORTANT: We intentionally exclude clientPrompts and aiOptions.examplePrompts from deps\n // to prevent plugin recreation. The onClick handlers use refs to access current prompts.\n const aiPlugin = useMemo(() => {\n if (!enableAi) return null\n // Don't create plugin until prompts are loaded (when using prompts collection)\n if (hasPromptsCollection && promptsLoading) return null\n\n // Use client-fetched prompts when prompts collection is enabled,\n // otherwise fall back to static props from config\n // NOTE: We read from refs in onClick to get current values without causing re-renders\n const getPrompts = () => hasPromptsCollection\n ? (clientPromptsRef.current || [])\n : (staticPromptsRef.current || [])\n\n // Get initial prompts for labels (labels are stable, only prompts text might change)\n const initialPrompts = getPrompts()\n\n // Convert our { label, prompt } format to plugin's { label, onClick } format\n // The plugin expects onClick to send the message via window.__PUCK_AI.sendMessage\n const convertedPrompts = initialPrompts.map((item, index) => ({\n label: item.label,\n onClick: () => {\n // Access current prompts via ref to get latest values\n const currentPrompts = getPrompts()\n const currentPrompt = currentPrompts[index]?.prompt || item.prompt\n // Use Puck AI's global API to send the prompt as a user message\n // sendMessage accepts { text: string } as a simpler format\n if (typeof window !== 'undefined' && (window as any).__PUCK_AI?.sendMessage) {\n ;(window as any).__PUCK_AI.sendMessage({ text: currentPrompt })\n }\n },\n }))\n\n return createAiPlugin({\n host: aiOptions?.host || '/api/puck/ai',\n chat: {\n examplePrompts: convertedPrompts.length > 0 ? convertedPrompts : undefined,\n },\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps -- intentionally omit prompt arrays to prevent recreation\n }, [enableAi, hasPromptsCollection, promptsLoading, aiOptions?.host])\n\n // Prompt editor plugin - for managing AI prompts in the plugin rail\n const promptEditorPlugin = useMemo(() => {\n if (!enableAi || !hasPromptsCollection) return null\n\n try {\n // Dynamic require to avoid errors if module not available\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { createPromptEditorPlugin } = require('../ai/plugins/promptEditorPlugin')\n return createPromptEditorPlugin({\n apiEndpoint: '/api/puck/ai-prompts',\n })\n } catch (e) {\n console.warn('[PuckEditor] Failed to load prompt editor plugin:', e)\n return null\n }\n }, [enableAi, hasPromptsCollection])\n\n // Context editor plugin - for managing AI context in the plugin rail\n const contextEditorPlugin = useMemo(() => {\n if (!enableAi || !hasContextCollection) return null\n\n try {\n // Dynamic require to avoid errors if module not available\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { createContextEditorPlugin } = require('../ai/plugins/contextEditorPlugin')\n return createContextEditorPlugin({\n apiEndpoint: '/api/puck/ai-context',\n })\n } catch (e) {\n console.warn('[PuckEditor] Failed to load context editor plugin:', e)\n return null\n }\n }, [enableAi, hasContextCollection])\n\n const resolvedPlugins = useMemo(() => {\n if (plugins === false) return undefined\n const base = !plugins || plugins.length === 0 ? defaultPlugins : [...defaultPlugins, ...plugins]\n\n // Add version history plugin if available\n if (versionHistoryPlugin) {\n base.push(versionHistoryPlugin)\n }\n\n // Add AI plugin if enabled\n if (aiPlugin) {\n base.push(aiPlugin)\n }\n\n // Add prompt editor plugin if enabled\n if (promptEditorPlugin) {\n base.push(promptEditorPlugin)\n }\n\n // Add context editor plugin if enabled\n if (contextEditorPlugin) {\n base.push(contextEditorPlugin)\n }\n\n return base\n }, [plugins, versionHistoryPlugin, aiPlugin, promptEditorPlugin, contextEditorPlugin])\n\n const editorContent = (\n <>\n {/* Dark mode CSS injection - automatically detects PayloadCMS dark mode */}\n {autoDetectDarkMode && <DarkModeStyles />}\n <div className=\"h-screen\">\n <Puck\n config={config}\n data={dataWithSlug}\n onChange={handleChange}\n onPublish={handlePublish}\n headerTitle={`${pageTitle} /${pageSlug}`}\n plugins={resolvedPlugins}\n viewports={enableViewports ? DEFAULT_VIEWPORTS : undefined}\n overrides={overrides}\n iframe={{ waitForStyles: true }}\n _experimentalFullScreenCanvas={experimentalFullScreenCanvas}\n />\n </div>\n <PreviewModal\n isOpen={isPreviewOpen}\n onClose={() => setIsPreviewOpen(false)}\n data={latestDataRef.current}\n pageTitle={pageTitle}\n onOpenInNewTab={handlePreview}\n layouts={layouts}\n hasUnsavedChanges={hasUnsavedChanges}\n onSave={handleSaveFromPreview}\n isSaving={isSaving}\n editorStylesheets={mergedEditorStylesheets}\n editorCss={mergedEditorCss}\n config={config}\n />\n </>\n )\n\n // Wrap with ThemeProvider if theme is provided\n if (theme) {\n return <ThemeProvider theme={theme}>{editorContent}</ThemeProvider>\n }\n\n return editorContent\n}\n"],"names":["useState","useCallback","useMemo","useRef","createElement","useRouter","Puck","headingAnalyzer","createAiPlugin","Maximize2","HeaderActions","IframeWrapper","PreviewModal","DarkModeStyles","useUnsavedChanges","createVersionHistoryPlugin","ThemeProvider","usePuckConfig","useAiPrompts","DEFAULT_VIEWPORTS","width","height","label","icon","size","PuckEditorImpl","pageId","initialData","config","pageTitle","pageSlug","apiEndpoint","backUrl","previewUrl","enableViewports","plugins","layouts","layoutStyles","layoutKey","headerActionsStart","headerActionsEnd","overrides","customOverrides","onSaveSuccess","onSaveError","onChange","onChangeProp","initialStatus","theme","editorStylesheets","editorStylesheetsProp","editorCss","editorCssProp","enableAi","aiOptions","hasPromptsCollection","hasContextCollection","experimentalFullScreenCanvas","autoDetectDarkMode","showPreviewDarkModeToggle","initialPreviewDarkMode","router","isSaving","setIsSaving","lastSaved","setLastSaved","saveError","setSaveError","documentStatus","setDocumentStatus","wasPublished","setWasPublished","hasUnsavedChanges","markClean","markDirty","isPreviewOpen","setIsPreviewOpen","previewDarkMode","setPreviewDarkMode","dataWithSlug","data","root","props","slug","latestDataRef","contextStylesheets","contextCss","baseStylesheets","baseCss","currentLayoutValue","pageLayout","currentLayout","find","l","value","mergedEditorStylesheets","fromBase","fromLayout","mergedEditorCss","parts","filter","Boolean","length","join","undefined","makeSaveRequest","options","typedData","fetch","method","headers","body","JSON","stringify","puckData","title","isHomepage","swapHomepage","folder","pageSegment","publish","_status","draft","handleHomepageConflict","existingHomepage","confirmed","confirm","response","ok","errorData","json","Error","error","message","handleSave","swapped","errorMessage","err","field","details","Date","console","handlePublish","handleUnpublish","handleChange","current","handleBack","push","back","handlePreview","rootProps","currentSlug","url","window","open","handleOpenPreview","handleSaveFromPreview","headerActions","children","onBack","onPreview","onSave","onPublish","onUnpublish","onOpenPreview","actionsStart","actionsEnd","onDismissError","showVersionHistory","onPreviewDarkModeChange","iframe","document","previewDarkModeOverride","defaultPlugins","versionHistoryPlugin","onRestoreSuccess","prompts","clientPrompts","loading","promptsLoading","clientPromptsRef","staticPromptsRef","examplePrompts","aiPlugin","getPrompts","initialPrompts","convertedPrompts","map","item","index","onClick","currentPrompts","currentPrompt","prompt","__PUCK_AI","sendMessage","text","host","chat","promptEditorPlugin","createPromptEditorPlugin","require","e","warn","contextEditorPlugin","createContextEditorPlugin","resolvedPlugins","base","editorContent","div","className","headerTitle","viewports","waitForStyles","_experimentalFullScreenCanvas","isOpen","onClose","onOpenInNewTab"],"mappings":"AAAA;;AAEA,SAASA,QAAQ,EAAEC,WAAW,EAAEC,OAAO,EAAEC,MAAM,EAAkBC,aAAa,QAAQ,QAAO;AAC7F,SAASC,SAAS,QAAQ,kBAAiB;AAC3C,SAASC,IAAI,QAA0G,mBAAkB;AACzI,OAAO,4BAA2B;AAClC,OAAOC,qBAAqB,sCAAqC;AACjE,OAAO,qDAAoD;AAC3D,SAASC,cAAc,QAAQ,wBAAuB;AACtD,OAAO,mCAAkC;AACzC,OAAO,4BAA2B;AAElC,SAASC,SAAS,QAAQ,eAAc;AACxC,SAASC,aAAa,QAAQ,gCAA+B;AAC7D,SAASC,aAAa,QAA0B,gCAA+B;AAC/E,SAASC,YAAY,QAAQ,+BAA8B;AAC3D,SAASC,cAAc,QAAQ,iCAAgC;AAC/D,SAASC,iBAAiB,QAAQ,+BAA8B;AAChE,SAASC,0BAA0B,QAAQ,oCAAmC;AAC9E,SAASC,aAAa,QAA0B,oBAAmB;AACnE,SAASC,aAAa,QAAQ,gCAA+B;AAG7D,SAASC,YAAY,QAAQ,8BAA6B;AAE1D;;CAEC,GACD,MAAMC,oBAAoB;IACxB;QACEC,OAAO;QACPC,QAAQ;QACRC,OAAO;QACPC,MAAM;IACR;IACA;QACEH,OAAO;QACPC,QAAQ;QACRC,OAAO;QACPC,MAAM;IACR;IACA;QACEH,OAAO;QACPC,QAAQ;QACRC,OAAO;QACPC,MAAM;IACR;IACA;QACEH,OAAO;QACPC,QAAQ;QACRC,OAAO;QACPC,oBAAMnB,cAAcK,WAAW;YAAEe,MAAM;QAAG;IAC5C;CACD;AAiMD;;;;;;;;;;;;;CAaC,GACD,OAAO,SAASC,eAAe,EAC7BC,MAAM,EACNC,WAAW,EACXC,MAAM,EACNC,SAAS,EACTC,QAAQ,EACRC,cAAc,iBAAiB,EAC/BC,OAAO,EACPC,UAAU,EACVC,kBAAkB,IAAI,EACtBC,OAAO,EACPC,OAAO,EACPC,YAAY,EACZC,YAAY,YAAY,EACxBC,kBAAkB,EAClBC,gBAAgB,EAChBC,WAAWC,eAAe,EAC1BC,aAAa,EACbC,WAAW,EACXC,UAAUC,YAAY,EACtBC,aAAa,EACbC,KAAK,EACLC,mBAAmBC,qBAAqB,EACxCC,WAAWC,aAAa,EACxBC,WAAW,KAAK,EAChBC,SAAS,EACTC,uBAAuB,KAAK,EAC5BC,uBAAuB,KAAK,EAC5BC,+BAA+B,KAAK,EACpCC,qBAAqB,IAAI,EACzBC,4BAA4B,IAAI,EAChCC,yBAAyB,KAAK,EACV;IACpB,MAAMC,SAASxD;IACf,MAAM,CAACyD,UAAUC,YAAY,GAAG/D,SAAS;IACzC,MAAM,CAACgE,WAAWC,aAAa,GAAGjE,SAAsB;IACxD,MAAM,CAACkE,WAAWC,aAAa,GAAGnE,SAAwB;IAC1D,MAAM,CAACoE,gBAAgBC,kBAAkB,GAAGrE,SAA4C+C;IACxF,0EAA0E;IAC1E,MAAM,CAACuB,cAAcC,gBAAgB,GAAGvE,SAAS+C,kBAAkB;IACnE,MAAM,EAAEyB,iBAAiB,EAAEC,SAAS,EAAEC,SAAS,EAAE,GAAG5D;IAEpD,sBAAsB;IACtB,MAAM,CAAC6D,eAAeC,iBAAiB,GAAG5E,SAAS;IAEnD,sEAAsE;IACtE,MAAM,CAAC6E,iBAAiBC,mBAAmB,GAAG9E,SAAS4D;IAEvD,+CAA+C;IAC/C,MAAMmB,eAAe7E,QAA0B;QAC7C,MAAM8E,OAAOrD;QACb,OAAO;YACL,GAAGqD,IAAI;YACPC,MAAM;gBACJ,GAAGD,KAAKC,IAAI;gBACZC,OAAO;oBACL,GAAGF,KAAKC,IAAI,EAAEC,KAAK;oBACnBC,MAAMH,KAAKC,IAAI,EAAEC,OAAOC,QAAQrD;gBAClC;YACF;QACF;IACF,GAAG;QAACH;QAAaG;KAAS;IAE1B,4DAA4D;IAC5D,MAAMsD,gBAAgBjF,OAAyB4E;IAE/C,uEAAuE;IACvE,MAAM,EAAE9B,mBAAmBoC,kBAAkB,EAAElC,WAAWmC,UAAU,EAAE,GAAGrE;IAEzE,qCAAqC;IACrC,MAAMsE,kBAAkBrC,yBAAyBmC;IACjD,MAAMG,UAAUpC,iBAAiBkC;IAEjC,0DAA0D;IAC1D,MAAMG,qBAAqBV,aAAaE,IAAI,EAAEC,OAAOQ,cAAc;IACnE,MAAMC,gBAAgBzF,QAAQ;QAC5B,OAAOkC,SAASwD,KAAK,CAACC,IAAMA,EAAEC,KAAK,KAAKL;IAC1C,GAAG;QAACrD;QAASqD;KAAmB;IAEhC,oEAAoE;IACpE,MAAMM,0BAA0B7F,QAAQ;QACtC,MAAM8F,WAAWT,mBAAmB,EAAE;QACtC,MAAMU,aAAaN,eAAe1C,qBAAqB,EAAE;QACzD,OAAO;eAAI+C;eAAaC;SAAW;IACrC,GAAG;QAACV;QAAiBI,eAAe1C;KAAkB;IAEtD,4DAA4D;IAC5D,MAAMiD,kBAAkBhG,QAAQ;QAC9B,MAAMiG,QAAQ;YAACX;YAASG,eAAexC;SAAU,CAACiD,MAAM,CAACC;QACzD,OAAOF,MAAMG,MAAM,GAAG,IAAIH,MAAMI,IAAI,CAAC,QAAQC;IAC/C,GAAG;QAAChB;QAASG,eAAexC;KAAU;IAEtC,0DAA0D;IAC1D,MAAMsD,kBAAkBxG,YACtB,OACE+E,MACA0B,UAAyD,CAAC,CAAC;QAE3D,MAAMC,YAAY3B;QAClB,OAAO4B,MAAM,GAAG7E,YAAY,CAAC,EAAEL,QAAQ,EAAE;YACvCmF,QAAQ;YACRC,SAAS;gBAAE,gBAAgB;YAAmB;YAC9CC,MAAMC,KAAKC,SAAS,CAAC;gBACnBC,UAAUlC;gBACVmC,OAAOR,UAAU1B,IAAI,EAAEC,OAAOiC,SAAStF;gBACvCsD,MAAMwB,UAAU1B,IAAI,EAAEC,OAAOC,QAAQrD;gBACrCsF,YAAYT,UAAU1B,IAAI,EAAEC,OAAOkC;gBACnCC,cAAcX,QAAQW,YAAY;gBAClC,mEAAmE;gBACnEC,QAAQX,UAAU1B,IAAI,EAAEC,OAAOoC;gBAC/BC,aAAaZ,UAAU1B,IAAI,EAAEC,OAAOqC;gBACpC,GAAIb,QAAQc,OAAO,GAAG;oBAAEC,SAAS;gBAAY,IAAI;oBAAEC,OAAO;gBAAK,CAAC;YAClE;QACF;IACF,GACA;QAAC3F;QAAaL;QAAQG;QAAWC;KAAS;IAG5C,iDAAiD;IACjD,MAAM6F,yBAAyB1H,YAC7B,OACE2H,kBACA5C,MACAwC;QAEA,MAAMK,YAAYC,QAChB,CAAC,CAAC,EAAEF,iBAAiBT,KAAK,CAAC,IAAI,EAAES,iBAAiBzC,IAAI,CAAC,0FAA0F,CAAC;QAEpJ,IAAI,CAAC0C,WAAW;YACd,OAAO;QACT;QAEA,+BAA+B;QAC/B,MAAME,WAAW,MAAMtB,gBAAgBzB,MAAM;YAAEwC;YAASH,cAAc;QAAK;QAC3E,IAAI,CAACU,SAASC,EAAE,EAAE;YAChB,MAAMC,YAAY,MAAMF,SAASG,IAAI;YACrC,MAAM,IAAIC,MAAMF,UAAUG,KAAK,IAAIH,UAAUI,OAAO,IAAI;QAC1D;QACA,OAAO;IACT,GACA;QAAC5B;KAAgB;IAGnB,yBAAyB;IACzB,MAAM6B,aAAarI,YACjB,OAAO+E;QACLjB,YAAY;QACZ,MAAM4C,YAAY3B;QAClB,IAAI;YACF,MAAM+C,WAAW,MAAMtB,gBAAgBzB,MAAM;gBAAEwC,SAAS;YAAM;YAE9D,IAAI,CAACO,SAASC,EAAE,EAAE;gBAChB,MAAMC,YAAY,MAAMF,SAASG,IAAI;gBAErC,oCAAoC;gBACpC,IAAID,UAAUjD,IAAI,EAAE4C,kBAAkB;oBACpC,MAAMW,UAAU,MAAMZ,uBACpBM,UAAUjD,IAAI,CAAC4C,gBAAgB,EAC/B5C,MACA;oBAEF,IAAI,CAACuD,SAAS;wBACZ,iDAAiD;wBACjDxE,YAAY;wBACZ;oBACF;gBACA,4DAA4D;gBAC9D,OAAO;oBACL,MAAMyE,eAAeP,UAAUG,KAAK,IAAIH,UAAUI,OAAO,IAAI;oBAC7D,MAAMI,MAAM,IAAIN,MAAMK;oBACtBC,IAAIC,KAAK,GAAGT,UAAUS,KAAK;oBAC3BD,IAAIE,OAAO,GAAGV,UAAUU,OAAO;oBAC/B,MAAMF;gBACR;YACF;YAEAxE,aAAa,IAAI2E;YACjBzE,aAAa,OAAM,2BAA2B;YAC9C,+FAA+F;YAC/FE,kBAAkB;YAClBI;YACA9B,gBAAgBqC;QAClB,EAAE,OAAOoD,OAAO;YACdS,QAAQT,KAAK,CAAC,sBAAsBA;YACpCjE,aAAaiE,iBAAiBD,QAAQC,MAAMC,OAAO,GAAG;YACtDzF,cAAcwF,iBAAiBD,QAAQC,QAAQ,IAAID,MAAM;QAC3D,SAAU;YACRpE,YAAY;QACd;IACF,GACA;QAAC0C;QAAiBkB;QAAwBlD;QAAW9B;QAAeC;KAAY;IAGlF,iBAAiB;IACjB,MAAMkG,gBAAgB7I,YACpB,OAAO+E;QACLjB,YAAY;QACZ,MAAM4C,YAAY3B;QAClB,IAAI;YACF,MAAM+C,WAAW,MAAMtB,gBAAgBzB,MAAM;gBAAEwC,SAAS;YAAK;YAE7D,IAAI,CAACO,SAASC,EAAE,EAAE;gBAChB,MAAMC,YAAY,MAAMF,SAASG,IAAI;gBAErC,oCAAoC;gBACpC,IAAID,UAAUjD,IAAI,EAAE4C,kBAAkB;oBACpC,MAAMW,UAAU,MAAMZ,uBACpBM,UAAUjD,IAAI,CAAC4C,gBAAgB,EAC/B5C,MACA;oBAEF,IAAI,CAACuD,SAAS;wBACZ,iDAAiD;wBACjDxE,YAAY;wBACZ;oBACF;gBACA,4DAA4D;gBAC9D,OAAO;oBACL,MAAMyE,eAAeP,UAAUG,KAAK,IAAIH,UAAUI,OAAO,IAAI;oBAC7D,MAAMI,MAAM,IAAIN,MAAMK;oBACtBC,IAAIC,KAAK,GAAGT,UAAUS,KAAK;oBAC3BD,IAAIE,OAAO,GAAGV,UAAUU,OAAO;oBAC/B,MAAMF;gBACR;YACF;YAEAxE,aAAa,IAAI2E;YACjBzE,aAAa,OAAM,2BAA2B;YAC9CE,kBAAkB,cAAa,yCAAyC;YACxEE,gBAAgB,OAAM,gCAAgC;YACtDE;YACA9B,gBAAgBqC;QAClB,EAAE,OAAOoD,OAAO;YACdS,QAAQT,KAAK,CAAC,0BAA0BA;YACxCjE,aAAaiE,iBAAiBD,QAAQC,MAAMC,OAAO,GAAG;YACtDzF,cAAcwF,iBAAiBD,QAAQC,QAAQ,IAAID,MAAM;QAC3D,SAAU;YACRpE,YAAY;QACd;IACF,GACA;QAAC0C;QAAiBkB;QAAwBlD;QAAW9B;QAAeC;KAAY;IAGlF,qCAAqC;IACrC,MAAMmG,kBAAkB9I,YACtB;QACE,IAAI,CAAC6H,QAAQ,0EAA0E;YACrF;QACF;QAEA/D,YAAY;QACZ,IAAI;YACF,MAAMgE,WAAW,MAAMnB,MAAM,GAAG7E,YAAY,CAAC,EAAEL,QAAQ,EAAE;gBACvDmF,QAAQ;gBACRC,SAAS;oBAAE,gBAAgB;gBAAmB;gBAC9CC,MAAMC,KAAKC,SAAS,CAAC;oBACnBQ,SAAS;gBACX;YACF;YAEA,IAAI,CAACM,SAASC,EAAE,EAAE;gBAChB,MAAMC,YAAY,MAAMF,SAASG,IAAI;gBACrC,MAAMM,eAAeP,UAAUG,KAAK,IAAIH,UAAUI,OAAO,IAAI;gBAC7D,MAAM,IAAIF,MAAMK;YAClB;YAEAvE,aAAa,IAAI2E;YACjBzE,aAAa;YACbE,kBAAkB;QACpB,EAAE,OAAO+D,OAAO;YACdS,QAAQT,KAAK,CAAC,4BAA4BA;YAC1CjE,aAAaiE,iBAAiBD,QAAQC,MAAMC,OAAO,GAAG;QACxD,SAAU;YACRtE,YAAY;QACd;IACF,GACA;QAAChC;QAAaL;KAAO;IAGvB,qBAAqB;IACrB,MAAMsH,eAAe/I,YACnB,CAAC+E;QACCI,cAAc6D,OAAO,GAAGjE;QACxBN;QACA5B,eAAekC;IACjB,GACA;QAACN;QAAW5B;KAAa;IAG3B,yBAAyB;IACzB,MAAMoG,aAAajJ,YAAY;QAC7B,IAAIuE,mBAAmB;YACrB,IAAI,CAACsD,QAAQ,8DAA8D;gBACzE;YACF;QACF;QACA,IAAI9F,SAAS;YACX6B,OAAOsF,IAAI,CAACnH;QACd,OAAO;YACL6B,OAAOuF,IAAI;QACb;IACF,GAAG;QAAC5E;QAAmBX;QAAQ7B;KAAQ;IAEvC,oCAAoC;IACpC,MAAMqH,gBAAgBpJ,YAAY;QAChC,MAAMqJ,YAAYlE,cAAc6D,OAAO,EAAEhE,MAAMC;QAC/C,MAAMqE,cAAcD,WAAWnE,QAAQrD;QACvC,MAAMsF,aAAakC,WAAWlC,eAAe;QAC7C,IAAIoC;QACJ,IAAI,OAAOvH,eAAe,YAAY;YACpC,iEAAiE;YACjEuH,MAAMvH,WAAWmF,aAAa,KAAKmC;QACrC,OAAO,IAAItH,YAAY;YACrBuH,MAAMvH;QACR,OAAO;YACL,oDAAoD;YACpDuH,MAAMpC,aAAa,MAAM,CAAC,CAAC,EAAEmC,aAAa;QAC5C;QACAE,OAAOC,IAAI,CAACF,KAAK;IACnB,GAAG;QAAC1H;QAAUG;KAAW;IAEzB,+BAA+B;IAC/B,MAAM0H,oBAAoB1J,YAAY;QACpC2E,iBAAiB;IACnB,GAAG,EAAE;IAEL,uEAAuE;IACvE,MAAMgF,wBAAwB3J,YAAY;QACxC,MAAM+E,OAAOI,cAAc6D,OAAO;QAClClF,YAAY;QACZ,IAAI;YACF,MAAMgE,WAAW,MAAMnB,MAAM,GAAG7E,YAAY,CAAC,EAAEL,QAAQ,EAAE;gBACvDmF,QAAQ;gBACRC,SAAS;oBAAE,gBAAgB;gBAAmB;gBAC9CC,MAAMC,KAAKC,SAAS,CAAC;oBACnBC,UAAUlC;oBACVmC,OAAOnC,MAAMC,MAAMC,OAAOiC,SAAStF;oBACnCsD,MAAMH,MAAMC,MAAMC,OAAOC,QAAQrD;oBACjC,mEAAmE;oBACnEwF,QAAQtC,MAAMC,MAAMC,OAAOoC;oBAC3BC,aAAavC,MAAMC,MAAMC,OAAOqC;oBAChCG,OAAO;gBACT;YACF;YAEA,IAAI,CAACK,SAASC,EAAE,EAAE;gBAChB,MAAMC,YAAY,MAAMF,SAASG,IAAI;gBACrC,MAAMM,eAAeP,UAAUG,KAAK,IAAIH,UAAUI,OAAO,IAAI;gBAC7D,MAAM,IAAIF,MAAMK;YAClB;YAEAvE,aAAa,IAAI2E;YACjBzE,aAAa;YACbE,kBAAkB;YAClBI;YACA9B,gBAAgBqC;QAClB,EAAE,OAAOoD,OAAO;YACdS,QAAQT,KAAK,CAAC,sBAAsBA;YACpCjE,aAAaiE,iBAAiBD,QAAQC,MAAMC,OAAO,GAAG;YACtDzF,cAAcwF,iBAAiBD,QAAQC,QAAQ,IAAID,MAAM;YACzD,MAAMC,MAAM,8CAA8C;;QAC5D,SAAU;YACRrE,YAAY;QACd;IACF,GAAG;QAAChC;QAAaL;QAAQG;QAAWC;QAAU2C;QAAW9B;QAAeC;KAAY;IAEpF,qBAAqB;IACrB,MAAMH,YAAYvC,QAChB,IAAO,CAAA;YACL2J,eAAe,CAAC,EAAEC,QAAQ,EAA2B,iBACnD,KAACpJ;oBACCqJ,QAAQb;oBACRc,WAAWX;oBACXY,QAAQ3B;oBACR4B,WAAWpB;oBACXqB,aAAapB;oBACbqB,eAAeT;oBACf7F,UAAUA;oBACVU,mBAAmBA;oBACnBR,WAAWA;oBACXI,gBAAgBA;oBAChBE,cAAcA;oBACd+F,cAAc9H;oBACd+H,YAAY9H;oBACZd,QAAQA;oBACRK,aAAaA;oBACbmC,WAAWA;oBACXqG,gBAAgB,IAAMpG,aAAa;oBACnCqG,oBAAoB;oBACpB7G,2BAA2BA;oBAC3BkB,iBAAiBA;oBACjB4F,yBAAyB3F;8BAExBgF;;YAGL,8EAA8E;YAC9EY,QAAQ,CAAC,EAAEZ,QAAQ,EAAEa,QAAQ,EAAgD,iBAC3E,KAAChK;oBACCgK,UAAUA;oBACVvI,SAASA;oBACTC,cAAcA;oBACdC,WAAWA;oBACXW,mBAAmB8C;oBACnB5C,WAAW+C;oBACX0E,yBAAyBjH,4BAA4BkB,kBAAkB2B;8BAEtEsD;;YAGL,yBAAyB;YACzB,GAAGpH,eAAe;QACpB,CAAA,GACA;QACEwG;QACAG;QACAf;QACAQ;QACAC;QACAY;QACA7F;QACAU;QACAR;QACAE;QACAE;QACAE;QACA/B;QACAC;QACAd;QACAK;QACAK;QACAC;QACAC;QACAI;QACAqD;QACAG;QACAvC;QACAkB;QACAC;KACD;IAGH,0FAA0F;IAC1F,MAAM+F,iBAA+B;QAACtK;KAAgB;IAEtD,6CAA6C;IAC7C,MAAMuK,uBAAuB5K,QAAQ;QACnC,IAAI,CAACwB,QAAQ,OAAO;QACpB,OAAOX,2BAA2B;YAChCW;YACAK;YACAgJ,kBAAkBtG;QACpB;IACF,GAAG;QAAC/C;QAAQK;QAAa0C;KAAU;IAEnC,kEAAkE;IAClE,qFAAqF;IACrF,MAAM,EAAEuG,SAASC,aAAa,EAAEC,SAASC,cAAc,EAAE,GAAGjK,aAC1D,wBACAmC,YAAYE;IAGd,qFAAqF;IACrF,wFAAwF;IACxF,MAAM6H,mBAAmBjL,OAAO8K;IAChCG,iBAAiBnC,OAAO,GAAGgC;IAC3B,MAAMI,mBAAmBlL,OAAOmD,WAAWgI;IAC3CD,iBAAiBpC,OAAO,GAAG3F,WAAWgI;IAEtC,kEAAkE;IAClE,2FAA2F;IAC3F,yFAAyF;IACzF,MAAMC,WAAWrL,QAAQ;QACvB,IAAI,CAACmD,UAAU,OAAO;QACtB,+EAA+E;QAC/E,IAAIE,wBAAwB4H,gBAAgB,OAAO;QAEnD,iEAAiE;QACjE,kDAAkD;QAClD,sFAAsF;QACtF,MAAMK,aAAa,IAAMjI,uBACpB6H,iBAAiBnC,OAAO,IAAI,EAAE,GAC9BoC,iBAAiBpC,OAAO,IAAI,EAAE;QAEnC,qFAAqF;QACrF,MAAMwC,iBAAiBD;QAEvB,6EAA6E;QAC7E,kFAAkF;QAClF,MAAME,mBAAmBD,eAAeE,GAAG,CAAC,CAACC,MAAMC,QAAW,CAAA;gBAC5DvK,OAAOsK,KAAKtK,KAAK;gBACjBwK,SAAS;oBACP,sDAAsD;oBACtD,MAAMC,iBAAiBP;oBACvB,MAAMQ,gBAAgBD,cAAc,CAACF,MAAM,EAAEI,UAAUL,KAAKK,MAAM;oBAClE,gEAAgE;oBAChE,2DAA2D;oBAC3D,IAAI,OAAOxC,WAAW,eAAe,AAACA,OAAeyC,SAAS,EAAEC,aAAa;;wBACzE1C,OAAeyC,SAAS,CAACC,WAAW,CAAC;4BAAEC,MAAMJ;wBAAc;oBAC/D;gBACF;YACF,CAAA;QAEA,OAAOxL,eAAe;YACpB6L,MAAM/I,WAAW+I,QAAQ;YACzBC,MAAM;gBACJhB,gBAAgBI,iBAAiBpF,MAAM,GAAG,IAAIoF,mBAAmBlF;YACnE;QACF;IACA,iHAAiH;IACnH,GAAG;QAACnD;QAAUE;QAAsB4H;QAAgB7H,WAAW+I;KAAK;IAEpE,oEAAoE;IACpE,MAAME,qBAAqBrM,QAAQ;QACjC,IAAI,CAACmD,YAAY,CAACE,sBAAsB,OAAO;QAE/C,IAAI;YACF,0DAA0D;YAC1D,iEAAiE;YACjE,MAAM,EAAEiJ,wBAAwB,EAAE,GAAGC,QAAQ;YAC7C,OAAOD,yBAAyB;gBAC9BzK,aAAa;YACf;QACF,EAAE,OAAO2K,GAAG;YACV7D,QAAQ8D,IAAI,CAAC,qDAAqDD;YAClE,OAAO;QACT;IACF,GAAG;QAACrJ;QAAUE;KAAqB;IAEnC,qEAAqE;IACrE,MAAMqJ,sBAAsB1M,QAAQ;QAClC,IAAI,CAACmD,YAAY,CAACG,sBAAsB,OAAO;QAE/C,IAAI;YACF,0DAA0D;YAC1D,iEAAiE;YACjE,MAAM,EAAEqJ,yBAAyB,EAAE,GAAGJ,QAAQ;YAC9C,OAAOI,0BAA0B;gBAC/B9K,aAAa;YACf;QACF,EAAE,OAAO2K,GAAG;YACV7D,QAAQ8D,IAAI,CAAC,sDAAsDD;YACnE,OAAO;QACT;IACF,GAAG;QAACrJ;QAAUG;KAAqB;IAEnC,MAAMsJ,kBAAkB5M,QAAQ;QAC9B,IAAIiC,YAAY,OAAO,OAAOqE;QAC9B,MAAMuG,OAAO,CAAC5K,WAAWA,QAAQmE,MAAM,KAAK,IAAIuE,iBAAiB;eAAIA;eAAmB1I;SAAQ;QAEhG,0CAA0C;QAC1C,IAAI2I,sBAAsB;YACxBiC,KAAK5D,IAAI,CAAC2B;QACZ;QAEA,2BAA2B;QAC3B,IAAIS,UAAU;YACZwB,KAAK5D,IAAI,CAACoC;QACZ;QAEA,sCAAsC;QACtC,IAAIgB,oBAAoB;YACtBQ,KAAK5D,IAAI,CAACoD;QACZ;QAEA,uCAAuC;QACvC,IAAIK,qBAAqB;YACvBG,KAAK5D,IAAI,CAACyD;QACZ;QAEA,OAAOG;IACT,GAAG;QAAC5K;QAAS2I;QAAsBS;QAAUgB;QAAoBK;KAAoB;IAErF,MAAMI,8BACJ;;YAEGtJ,oCAAsB,KAAC7C;0BACxB,KAACoM;gBAAIC,WAAU;0BACb,cAAA,KAAC5M;oBACCsB,QAAQA;oBACRoD,MAAMD;oBACNlC,UAAUmG;oBACVkB,WAAWpB;oBACXqE,aAAa,GAAGtL,UAAU,EAAE,EAAEC,UAAU;oBACxCK,SAAS2K;oBACTM,WAAWlL,kBAAkBf,oBAAoBqF;oBACjD/D,WAAWA;oBACXiI,QAAQ;wBAAE2C,eAAe;oBAAK;oBAC9BC,+BAA+B7J;;;0BAGnC,KAAC7C;gBACC2M,QAAQ5I;gBACR6I,SAAS,IAAM5I,iBAAiB;gBAChCI,MAAMI,cAAc6D,OAAO;gBAC3BpH,WAAWA;gBACX4L,gBAAgBpE;gBAChBjH,SAASA;gBACToC,mBAAmBA;gBACnByF,QAAQL;gBACR9F,UAAUA;gBACVb,mBAAmB8C;gBACnB5C,WAAW+C;gBACXtE,QAAQA;;;;IAKd,+CAA+C;IAC/C,IAAIoB,OAAO;QACT,qBAAO,KAAChC;YAAcgC,OAAOA;sBAAQgK;;IACvC;IAEA,OAAOA;AACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"DarkModeStyles.d.ts","sourceRoot":"","sources":["../../../src/editor/components/DarkModeStyles.tsx"],"names":[],"mappings":"AAsIA,MAAM,WAAW,mBAAmB;IAClC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAAC,EAAE,YAAY,EAAE,EAAE,mBAAmB,QAsCnE"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/editor/components/DarkModeStyles.tsx"],"sourcesContent":["'use client'\n\nimport { useEffect } from 'react'\nimport { useDarkMode } from '../hooks/useDarkMode.js'\n\n/**\n * Dark mode CSS to inject. This contains all Puck color variable overrides.\n * We inline this rather than importing a CSS file to avoid build complexity.\n */\nconst DARK_MODE_CSS = `\n/**\n * Puck Editor Dark Mode CSS Overrides\n *\n * Puck's UI is always light-themed (no built-in dark mode).\n * When Payload CMS is in dark mode, we need to ensure Puck's\n * form inputs remain readable (dark text on light background).\n *\n * This CSS overrides PayloadCMS theme CSS variables within Puck UI\n * to force light-mode values, ensuring proper contrast.\n */\n\n/* Override PayloadCMS theme CSS variables to light-mode values within Puck UI */\n.dark [class*=\"Puck\"],\n.dark [class*=\"puck-\"],\n[data-theme=\"dark\"] [class*=\"Puck\"],\n[data-theme=\"dark\"] [class*=\"puck-\"] {\n /* Force light-mode PayloadCMS elevation values */\n --theme-elevation-0: rgb(255, 255, 255);\n --theme-elevation-50: rgb(245, 245, 245);\n --theme-elevation-100: rgb(235, 235, 235);\n --theme-elevation-150: rgb(221, 221, 221);\n --theme-elevation-200: rgb(208, 208, 208);\n --theme-elevation-250: rgb(195, 195, 195);\n --theme-elevation-300: rgb(181, 181, 181);\n --theme-elevation-350: rgb(168, 168, 168);\n --theme-elevation-400: rgb(154, 154, 154);\n --theme-elevation-450: rgb(141, 141, 141);\n --theme-elevation-500: rgb(128, 128, 128);\n --theme-elevation-550: rgb(114, 114, 114);\n --theme-elevation-600: rgb(101, 101, 101);\n --theme-elevation-650: rgb(87, 87, 87);\n --theme-elevation-700: rgb(74, 74, 74);\n --theme-elevation-750: rgb(60, 60, 60);\n --theme-elevation-800: rgb(47, 47, 47);\n --theme-elevation-850: rgb(34, 34, 34);\n --theme-elevation-900: rgb(20, 20, 20);\n --theme-elevation-950: rgb(7, 7, 7);\n --theme-elevation-1000: rgb(0, 0, 0);\n\n /* Force light-mode derived theme variables */\n --theme-bg: rgb(255, 255, 255);\n --theme-input-bg: rgb(255, 255, 255);\n --theme-text: rgb(47, 47, 47);\n\n /* Reset text color inheritance from Payload's dark mode */\n color: #1f2937;\n}\n\n/* Ensure form inputs have dark text */\n.dark [class*=\"Puck\"] input,\n.dark [class*=\"Puck\"] textarea,\n.dark [class*=\"Puck\"] select,\n.dark [class*=\"puck-\"] input,\n.dark [class*=\"puck-\"] textarea,\n.dark [class*=\"puck-\"] select,\n[data-theme=\"dark\"] [class*=\"Puck\"] input,\n[data-theme=\"dark\"] [class*=\"Puck\"] textarea,\n[data-theme=\"dark\"] [class*=\"Puck\"] select,\n[data-theme=\"dark\"] [class*=\"puck-\"] input,\n[data-theme=\"dark\"] [class*=\"puck-\"] textarea,\n[data-theme=\"dark\"] [class*=\"puck-\"] select {\n color: #1f2937 !important;\n background-color: #ffffff !important;\n}\n\n/* Ensure labels and text in Puck panels are dark */\n.dark [class*=\"Puck\"] label,\n.dark [class*=\"Puck\"] span,\n.dark [class*=\"Puck\"] p,\n.dark [class*=\"puck-\"] label,\n.dark [class*=\"puck-\"] span,\n.dark [class*=\"puck-\"] p,\n[data-theme=\"dark\"] [class*=\"Puck\"] label,\n[data-theme=\"dark\"] [class*=\"Puck\"] span,\n[data-theme=\"dark\"] [class*=\"Puck\"] p,\n[data-theme=\"dark\"] [class*=\"puck-\"] label,\n[data-theme=\"dark\"] [class*=\"puck-\"] span,\n[data-theme=\"dark\"] [class*=\"puck-\"] p {\n color: #1f2937;\n}\n\n/* Ensure buttons maintain proper styling */\n.dark [class*=\"Puck\"] button,\n.dark [class*=\"puck-\"] button,\n[data-theme=\"dark\"] [class*=\"Puck\"] button,\n[data-theme=\"dark\"] [class*=\"puck-\"] button {\n color: inherit;\n}\n\n/* Fix placeholder text */\n.dark [class*=\"Puck\"] input::placeholder,\n.dark [class*=\"Puck\"] textarea::placeholder,\n.dark [class*=\"puck-\"] input::placeholder,\n.dark [class*=\"puck-\"] textarea::placeholder,\n[data-theme=\"dark\"] [class*=\"Puck\"] input::placeholder,\n[data-theme=\"dark\"] [class*=\"Puck\"] textarea::placeholder,\n[data-theme=\"dark\"] [class*=\"puck-\"] input::placeholder,\n[data-theme=\"dark\"] [class*=\"puck-\"] textarea::placeholder {\n color: #9ca3af !important;\n}\n\n/* Ensure headings in Puck are visible */\n.dark [class*=\"Puck\"] h1,\n.dark [class*=\"Puck\"] h2,\n.dark [class*=\"Puck\"] h3,\n.dark [class*=\"Puck\"] h4,\n.dark [class*=\"puck-\"] h1,\n.dark [class*=\"puck-\"] h2,\n.dark [class*=\"puck-\"] h3,\n.dark [class*=\"puck-\"] h4,\n[data-theme=\"dark\"] [class*=\"Puck\"] h1,\n[data-theme=\"dark\"] [class*=\"Puck\"] h2,\n[data-theme=\"dark\"] [class*=\"Puck\"] h3,\n[data-theme=\"dark\"] [class*=\"Puck\"] h4,\n[data-theme=\"dark\"] [class*=\"puck-\"] h1,\n[data-theme=\"dark\"] [class*=\"puck-\"] h2,\n[data-theme=\"dark\"] [class*=\"puck-\"] h3,\n[data-theme=\"dark\"] [class*=\"puck-\"] h4 {\n color: #1f2937;\n}\n`.trim()\n\nconst STYLE_ID = 'puck-dark-mode-styles'\n\nexport interface DarkModeStylesProps {\n /**\n * Override automatic dark mode detection.\n * When true, always inject dark mode styles.\n * When false, never inject dark mode styles.\n * When undefined, use automatic detection.\n */\n forceEnabled?: boolean\n}\n\n/**\n * Injects dark mode CSS overrides for Puck when dark mode is detected.\n *\n * This component uses the useDarkMode hook to detect when PayloadCMS admin\n * is in dark mode (via .dark class) or when OS preference is dark mode.\n * It then injects/removes the CSS overrides accordingly.\n *\n * @example\n * ```tsx\n * function MyEditor() {\n * return (\n * <>\n * <DarkModeStyles />\n * <Puck ... />\n * </>\n * )\n * }\n * ```\n */\nexport function DarkModeStyles({ forceEnabled }: DarkModeStylesProps) {\n const { isDarkMode } = useDarkMode()\n\n // Determine if we should inject styles\n const shouldInject = forceEnabled ?? isDarkMode\n\n useEffect(() => {\n if (typeof document === 'undefined') return\n\n // Check if style element already exists\n let styleElement = document.getElementById(STYLE_ID) as HTMLStyleElement | null\n\n if (shouldInject) {\n // Inject styles if not already present\n if (!styleElement) {\n styleElement = document.createElement('style')\n styleElement.id = STYLE_ID\n styleElement.textContent = DARK_MODE_CSS\n document.head.appendChild(styleElement)\n }\n } else {\n // Remove styles if present\n if (styleElement) {\n styleElement.remove()\n }\n }\n\n // Cleanup on unmount\n return () => {\n const el = document.getElementById(STYLE_ID)\n if (el) {\n el.remove()\n }\n }\n }, [shouldInject])\n\n // This component doesn't render anything\n return null\n}\n"],"names":["useEffect","useDarkMode","DARK_MODE_CSS","trim","STYLE_ID","DarkModeStyles","forceEnabled","isDarkMode","shouldInject","document","styleElement","getElementById","createElement","id","textContent","head","appendChild","remove","el"],"mappings":"AAAA;AAEA,SAASA,SAAS,QAAQ,QAAO;AACjC,SAASC,WAAW,QAAQ,0BAAyB;AAErD;;;CAGC,GACD,MAAMC,gBAAgB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyHvB,CAAC,CAACC,IAAI;AAEN,MAAMC,WAAW;AAYjB;;;;;;;;;;;;;;;;;;CAkBC,GACD,OAAO,SAASC,eAAe,EAAEC,YAAY,EAAuB;IAClE,MAAM,EAAEC,UAAU,EAAE,GAAGN;IAEvB,uCAAuC;IACvC,MAAMO,eAAeF,gBAAgBC;IAErCP,UAAU;QACR,IAAI,OAAOS,aAAa,aAAa;QAErC,wCAAwC;QACxC,IAAIC,eAAeD,SAASE,cAAc,CAACP;QAE3C,IAAII,cAAc;YAChB,uCAAuC;YACvC,IAAI,CAACE,cAAc;gBACjBA,eAAeD,SAASG,aAAa,CAAC;gBACtCF,aAAaG,EAAE,GAAGT;gBAClBM,aAAaI,WAAW,GAAGZ;gBAC3BO,SAASM,IAAI,CAACC,WAAW,CAACN;YAC5B;QACF,OAAO;YACL,2BAA2B;YAC3B,IAAIA,cAAc;gBAChBA,aAAaO,MAAM;YACrB;QACF;QAEA,qBAAqB;QACrB,OAAO;YACL,MAAMC,KAAKT,SAASE,cAAc,CAACP;YACnC,IAAIc,IAAI;gBACNA,GAAGD,MAAM;YACX;QACF;IACF,GAAG;QAACT;KAAa;IAEjB,yCAAyC;IACzC,OAAO;AACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"HeaderActions.d.ts","sourceRoot":"","sources":["../../../src/editor/components/HeaderActions.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAqB,KAAK,SAAS,EAAsB,MAAM,OAAO,CAAA;AAC7E,OAAO,EAAiB,KAAK,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAqB3D,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAA;IACnB;;OAEG;IACH,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB;;OAEG;IACH,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB;;OAEG;IACH,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAA;IAC5B;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAA;IAChC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAA;IACjB;;OAEG;IACH,iBAAiB,EAAE,OAAO,CAAA;IAC1B;;OAEG;IACH,SAAS,EAAE,IAAI,GAAG,IAAI,CAAA;IACtB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;IACtC;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB;;OAEG;IACH,YAAY,CAAC,EAAE,SAAS,CAAA;IACxB;;OAEG;IACH,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;IAC1B;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IAI3B;;;OAGG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAA;IACnC;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB;;OAEG;IACH,uBAAuB,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAA;CACxD;AAkMD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,0DAsSxB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/editor/components/HeaderActions.tsx"],"sourcesContent":["'use client'\n\nimport { memo, useCallback, type ReactNode, type CSSProperties } from 'react'\nimport { createUsePuck, type Data } from '@puckeditor/core'\nimport {\n ArrowLeft,\n Save,\n ExternalLink,\n Loader2,\n Check,\n MousePointerClick,\n MousePointer,\n Upload,\n X,\n AlertTriangle,\n Eye,\n} from 'lucide-react'\nimport { VersionHistory } from './VersionHistory.js'\nimport { PreviewModeToggle } from './PreviewModeToggle.js'\nimport { VERSION } from '../../version.js'\n\n// Create usePuck hook for accessing editor state\nconst usePuck = createUsePuck()\n\nexport interface HeaderActionsProps {\n /**\n * Default Puck header actions (undo/redo, publish button)\n */\n children: ReactNode\n /**\n * Handler for back button click\n */\n onBack: () => void\n /**\n * Handler for preview button click\n */\n onPreview: () => void\n /**\n * Handler for save button click\n */\n onSave: (data: Data) => void\n /**\n * Handler for publish button click (optional, uses default Puck publish if not provided)\n */\n onPublish?: (data: Data) => void\n /**\n * Handler for unpublish button click (reverts to draft)\n */\n onUnpublish?: () => void\n /**\n * Whether a save operation is in progress\n */\n isSaving: boolean\n /**\n * Whether there are unsaved changes\n */\n hasUnsavedChanges: boolean\n /**\n * Last saved timestamp\n */\n lastSaved: Date | null\n /**\n * Document status from Payload (_status field)\n * Shows visual indicator for draft vs published\n */\n documentStatus?: 'draft' | 'published'\n /**\n * Whether the document has ever been published (initially or during this session)\n * Used to show \"Unpublished Changes\" vs \"Draft\" badge\n */\n wasPublished?: boolean\n /**\n * Custom actions to render at the start of the header\n */\n actionsStart?: ReactNode\n /**\n * Custom actions to render at the end of the header (before publish)\n */\n actionsEnd?: ReactNode\n /**\n * Whether to show the save draft button\n * @default true\n */\n showSaveDraft?: boolean\n /**\n * Whether to show the view page button\n * @default true\n */\n showViewPage?: boolean\n /**\n * Whether to show the interactive mode toggle\n * @default false\n * @deprecated Use the Preview button instead\n */\n showInteractiveToggle?: boolean\n /**\n * Whether to show the preview button\n * @default true\n */\n showPreviewButton?: boolean\n /**\n * Handler for opening the preview modal\n */\n onOpenPreview?: () => void\n /**\n * Whether to show the version history button in the header\n * @default true\n * @deprecated Version history has moved to the plugin rail. This prop will be removed in a future version.\n */\n showVersionHistory?: boolean\n /**\n * Page ID for version history (required if showVersionHistory is true)\n */\n pageId?: string\n /**\n * API endpoint base path for version history\n * @default '/api/puck/pages'\n */\n apiEndpoint?: string\n /**\n * Error message to display (e.g., validation errors)\n */\n saveError?: string | null\n /**\n * Handler to dismiss the error message\n */\n onDismissError?: () => void\n\n // Preview dark mode toggle props\n\n /**\n * Whether to show the preview dark mode toggle\n * @default false\n */\n showPreviewDarkModeToggle?: boolean\n /**\n * Current state of preview dark mode\n */\n previewDarkMode?: boolean\n /**\n * Handler for toggling preview dark mode\n */\n onPreviewDarkModeChange?: (isDarkMode: boolean) => void\n}\n\n// Shared styles\nconst styles = {\n buttonBase: {\n display: 'inline-flex',\n alignItems: 'center',\n whiteSpace: 'nowrap',\n fontSize: '14px',\n fontWeight: 500,\n borderRadius: '6px',\n transition: 'background-color 0.15s, border-color 0.15s',\n cursor: 'pointer',\n border: 'none',\n } as CSSProperties,\n buttonSecondary: {\n padding: '6px 12px',\n backgroundColor: 'var(--theme-bg)',\n color: 'var(--theme-elevation-700)',\n border: '1px solid var(--theme-elevation-200)',\n } as CSSProperties,\n buttonPrimary: {\n padding: '6px 12px',\n backgroundColor: 'var(--theme-elevation-900)',\n color: 'var(--theme-bg)',\n border: '1px solid var(--theme-elevation-900)',\n } as CSSProperties,\n buttonDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n } as CSSProperties,\n icon: {\n width: '16px',\n height: '16px',\n marginRight: '4px',\n flexShrink: 0,\n } as CSSProperties,\n iconSmall: {\n width: '14px',\n height: '14px',\n } as CSSProperties,\n badge: {\n padding: '4px 10px',\n borderRadius: '9999px',\n fontSize: '12px',\n fontWeight: 500,\n whiteSpace: 'nowrap',\n } as CSSProperties,\n badgePublished: {\n backgroundColor: 'var(--theme-success-100)',\n color: 'var(--theme-success-700)',\n border: '1px solid var(--theme-success-200)',\n } as CSSProperties,\n badgeUnpublished: {\n backgroundColor: 'var(--theme-warning-100)',\n color: 'var(--theme-warning-700)',\n border: '1px solid var(--theme-warning-200)',\n } as CSSProperties,\n badgeDraft: {\n backgroundColor: 'var(--theme-elevation-100)',\n color: 'var(--theme-elevation-600)',\n border: '1px solid var(--theme-elevation-200)',\n } as CSSProperties,\n statusText: {\n fontSize: '12px',\n color: 'var(--theme-elevation-500)',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n whiteSpace: 'nowrap',\n } as CSSProperties,\n unsavedText: {\n fontSize: '12px',\n color: 'var(--theme-warning-600)',\n fontWeight: 500,\n whiteSpace: 'nowrap',\n } as CSSProperties,\n versionText: {\n fontSize: '10px',\n color: 'var(--theme-elevation-400)',\n fontFamily: 'monospace',\n } as CSSProperties,\n linkButton: {\n background: 'none',\n border: 'none',\n padding: '4px 8px',\n fontSize: '12px',\n color: 'var(--theme-elevation-500)',\n cursor: 'pointer',\n textDecoration: 'underline',\n textUnderlineOffset: '2px',\n } as CSSProperties,\n errorButton: {\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '6px 10px',\n backgroundColor: 'var(--theme-error-50)',\n border: '1px solid var(--theme-error-200)',\n borderRadius: '6px',\n color: 'var(--theme-error-700)',\n fontSize: '12px',\n fontWeight: 500,\n cursor: 'pointer',\n } as CSSProperties,\n modalOverlay: {\n position: 'fixed',\n inset: 0,\n zIndex: 9999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n } as CSSProperties,\n modalContainer: {\n backgroundColor: 'var(--theme-bg)',\n borderRadius: '8px',\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.25)',\n maxWidth: '448px',\n width: '100%',\n margin: '0 16px',\n overflow: 'hidden',\n } as CSSProperties,\n modalHeader: {\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '16px 20px',\n borderBottom: '1px solid var(--theme-elevation-150)',\n backgroundColor: 'var(--theme-error-50)',\n } as CSSProperties,\n modalIconWrapper: {\n flexShrink: 0,\n width: '40px',\n height: '40px',\n borderRadius: '50%',\n backgroundColor: 'var(--theme-error-100)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n } as CSSProperties,\n modalTitle: {\n fontSize: '16px',\n fontWeight: 600,\n color: 'var(--theme-elevation-900)',\n margin: 0,\n } as CSSProperties,\n modalSubtitle: {\n fontSize: '14px',\n color: 'var(--theme-elevation-500)',\n margin: 0,\n } as CSSProperties,\n modalBody: {\n padding: '16px 20px',\n } as CSSProperties,\n modalBodyText: {\n fontSize: '14px',\n color: 'var(--theme-elevation-700)',\n margin: 0,\n } as CSSProperties,\n modalFooter: {\n padding: '16px 20px',\n backgroundColor: 'var(--theme-elevation-50)',\n borderTop: '1px solid var(--theme-elevation-150)',\n display: 'flex',\n justifyContent: 'flex-end',\n } as CSSProperties,\n toggleContainer: {\n display: 'flex',\n gap: '4px',\n } as CSSProperties,\n toggleButton: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '12px',\n fontWeight: 500,\n borderRadius: '4px',\n transition: 'background-color 0.15s',\n padding: '6px 10px',\n cursor: 'pointer',\n } as CSSProperties,\n toggleActive: {\n backgroundColor: 'var(--theme-elevation-900)',\n color: 'var(--theme-bg)',\n border: '1px solid var(--theme-elevation-900)',\n } as CSSProperties,\n toggleInactive: {\n backgroundColor: 'var(--theme-elevation-100)',\n color: 'var(--theme-elevation-500)',\n border: '1px solid var(--theme-elevation-200)',\n } as CSSProperties,\n}\n\n/**\n * Custom header actions component for the Puck editor\n *\n * Provides standard actions: Back, Edit/Interactive toggle, View Page, Save Draft\n * Also displays save status and last saved time.\n */\nexport const HeaderActions = memo(function HeaderActions({\n children,\n onBack,\n onPreview,\n onSave,\n onPublish,\n onUnpublish,\n isSaving,\n hasUnsavedChanges,\n lastSaved,\n documentStatus,\n wasPublished,\n actionsStart,\n actionsEnd,\n showSaveDraft = true,\n showViewPage = true,\n showInteractiveToggle = false,\n showPreviewButton = true,\n onOpenPreview,\n showVersionHistory = true,\n pageId,\n apiEndpoint = '/api/puck/pages',\n saveError,\n onDismissError,\n showPreviewDarkModeToggle = false,\n previewDarkMode = false,\n onPreviewDarkModeChange,\n}: HeaderActionsProps) {\n const appState = usePuck((s) => s.appState)\n const dispatch = usePuck((s) => s.dispatch)\n\n const isInteractive = appState.ui.previewMode === 'interactive'\n\n const togglePreviewMode = useCallback(() => {\n dispatch({\n type: 'setUi',\n ui: {\n previewMode: isInteractive ? 'edit' : 'interactive',\n },\n })\n }, [dispatch, isInteractive])\n\n const handleSaveClick = useCallback(() => {\n onSave(appState.data)\n }, [onSave, appState.data])\n\n const handlePublishClick = useCallback(() => {\n if (onPublish) {\n onPublish(appState.data)\n }\n }, [onPublish, appState.data])\n\n return (\n <>\n {/* Custom actions at start */}\n {actionsStart}\n\n {/* Back button */}\n <button\n type=\"button\"\n onClick={onBack}\n style={{ ...styles.buttonBase, ...styles.buttonSecondary }}\n >\n <ArrowLeft style={styles.icon} />\n Back\n </button>\n\n {/* Version indicator for debugging */}\n <span style={styles.versionText}>v{VERSION}</span>\n\n {/* Document status badge */}\n {documentStatus && (() => {\n const isPublished = documentStatus === 'published'\n const hasUnpublishedChanges = documentStatus === 'draft' && wasPublished\n\n let badgeLabel: string\n let badgeStyle: CSSProperties\n\n if (isPublished) {\n badgeLabel = 'Published'\n badgeStyle = { ...styles.badge, ...styles.badgePublished }\n } else if (hasUnpublishedChanges) {\n badgeLabel = 'Unpublished Changes'\n badgeStyle = { ...styles.badge, ...styles.badgeUnpublished }\n } else {\n badgeLabel = 'Draft'\n badgeStyle = { ...styles.badge, ...styles.badgeDraft }\n }\n\n return <span style={badgeStyle}>{badgeLabel}</span>\n })()}\n\n {/* Interactive mode toggle */}\n {showInteractiveToggle && (\n <div style={styles.toggleContainer}>\n <button\n type=\"button\"\n onClick={() => isInteractive && togglePreviewMode()}\n style={{\n ...styles.toggleButton,\n ...(!isInteractive ? styles.toggleActive : styles.toggleInactive),\n }}\n >\n <MousePointer style={styles.iconSmall} />\n Edit\n </button>\n <button\n type=\"button\"\n onClick={() => !isInteractive && togglePreviewMode()}\n style={{\n ...styles.toggleButton,\n ...(isInteractive ? styles.toggleActive : styles.toggleInactive),\n }}\n >\n <MousePointerClick style={styles.iconSmall} />\n Interactive\n </button>\n </div>\n )}\n\n {/* Preview dark mode toggle */}\n {showPreviewDarkModeToggle && onPreviewDarkModeChange && (\n <PreviewModeToggle\n isDarkMode={previewDarkMode}\n onToggle={onPreviewDarkModeChange}\n disabled={isSaving}\n />\n )}\n\n {/* Status indicators */}\n {lastSaved && !saveError && (\n <span style={styles.statusText}>\n <Check style={{ width: '12px', height: '12px', flexShrink: 0 }} />\n Saved {lastSaved.toLocaleTimeString()}\n </span>\n )}\n {hasUnsavedChanges && !saveError && (\n <span style={styles.unsavedText}>Unsaved</span>\n )}\n\n {/* Error indicator in header - clicking opens modal */}\n {saveError && (\n <button\n type=\"button\"\n onClick={() => {}}\n style={styles.errorButton}\n >\n <AlertTriangle style={{ width: '16px', height: '16px', color: 'var(--theme-error-500)', flexShrink: 0 }} />\n Error\n </button>\n )}\n\n {/* Error Modal */}\n {saveError && (\n <div\n style={styles.modalOverlay}\n onClick={onDismissError}\n >\n <div\n style={styles.modalContainer}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Modal Header */}\n <div style={styles.modalHeader}>\n <div style={styles.modalIconWrapper}>\n <AlertTriangle style={{ width: '20px', height: '20px', color: 'var(--theme-error-600)' }} />\n </div>\n <div>\n <h3 style={styles.modalTitle}>Save Failed</h3>\n <p style={styles.modalSubtitle}>Unable to save your changes</p>\n </div>\n </div>\n\n {/* Modal Body */}\n <div style={styles.modalBody}>\n <p style={styles.modalBodyText}>{saveError}</p>\n </div>\n\n {/* Modal Footer */}\n <div style={styles.modalFooter}>\n <button\n type=\"button\"\n onClick={onDismissError}\n style={{ ...styles.buttonBase, ...styles.buttonPrimary }}\n >\n Close\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Preview modal button */}\n {showPreviewButton && onOpenPreview && (\n <button\n type=\"button\"\n onClick={onOpenPreview}\n disabled={isSaving}\n style={{\n ...styles.buttonBase,\n ...styles.buttonPrimary,\n ...(isSaving ? styles.buttonDisabled : {}),\n }}\n >\n <Eye style={styles.icon} />\n Preview\n </button>\n )}\n\n {/* View published page in new tab */}\n {showViewPage && (\n <button\n type=\"button\"\n onClick={onPreview}\n style={{ ...styles.buttonBase, ...styles.buttonSecondary }}\n >\n <ExternalLink style={styles.icon} />\n View\n </button>\n )}\n\n {/* Version History */}\n {showVersionHistory && pageId && (\n <VersionHistory\n pageId={pageId}\n apiEndpoint={apiEndpoint}\n disabled={isSaving}\n />\n )}\n\n {/* Save Draft button */}\n {showSaveDraft && (\n <button\n type=\"button\"\n onClick={handleSaveClick}\n disabled={isSaving || !hasUnsavedChanges}\n style={{\n ...styles.buttonBase,\n ...styles.buttonSecondary,\n ...((isSaving || !hasUnsavedChanges) ? styles.buttonDisabled : {}),\n }}\n >\n {isSaving ? (\n <Loader2 style={{ ...styles.icon, animation: 'spin 1s linear infinite' }} />\n ) : (\n <Save style={styles.icon} />\n )}\n Save\n </button>\n )}\n\n {/* Custom publish button if handler provided */}\n {onPublish && (\n <button\n type=\"button\"\n onClick={handlePublishClick}\n disabled={isSaving}\n style={{\n ...styles.buttonBase,\n ...styles.buttonPrimary,\n ...(isSaving ? styles.buttonDisabled : {}),\n }}\n >\n {isSaving ? (\n <Loader2 style={{ ...styles.icon, animation: 'spin 1s linear infinite' }} />\n ) : (\n <Upload style={styles.icon} />\n )}\n Publish\n </button>\n )}\n\n {/* Unpublish link (only shown when document is published) */}\n {onUnpublish && documentStatus === 'published' && (\n <button\n type=\"button\"\n onClick={onUnpublish}\n disabled={isSaving}\n style={{\n ...styles.linkButton,\n ...(isSaving ? { opacity: 0.5, cursor: 'not-allowed' } : {}),\n }}\n >\n Unpublish\n </button>\n )}\n\n {/* Custom actions at end */}\n {actionsEnd}\n\n {/* Default Puck actions (undo/redo, publish button if no custom handler) */}\n {!onPublish && children}\n </>\n )\n})\n"],"names":["memo","useCallback","createUsePuck","ArrowLeft","Save","ExternalLink","Loader2","Check","MousePointerClick","MousePointer","Upload","AlertTriangle","Eye","VersionHistory","PreviewModeToggle","VERSION","usePuck","styles","buttonBase","display","alignItems","whiteSpace","fontSize","fontWeight","borderRadius","transition","cursor","border","buttonSecondary","padding","backgroundColor","color","buttonPrimary","buttonDisabled","opacity","icon","width","height","marginRight","flexShrink","iconSmall","badge","badgePublished","badgeUnpublished","badgeDraft","statusText","gap","unsavedText","versionText","fontFamily","linkButton","background","textDecoration","textUnderlineOffset","errorButton","modalOverlay","position","inset","zIndex","justifyContent","modalContainer","boxShadow","maxWidth","margin","overflow","modalHeader","borderBottom","modalIconWrapper","modalTitle","modalSubtitle","modalBody","modalBodyText","modalFooter","borderTop","toggleContainer","toggleButton","toggleActive","toggleInactive","HeaderActions","children","onBack","onPreview","onSave","onPublish","onUnpublish","isSaving","hasUnsavedChanges","lastSaved","documentStatus","wasPublished","actionsStart","actionsEnd","showSaveDraft","showViewPage","showInteractiveToggle","showPreviewButton","onOpenPreview","showVersionHistory","pageId","apiEndpoint","saveError","onDismissError","showPreviewDarkModeToggle","previewDarkMode","onPreviewDarkModeChange","appState","s","dispatch","isInteractive","ui","previewMode","togglePreviewMode","type","handleSaveClick","data","handlePublishClick","button","onClick","style","span","isPublished","hasUnpublishedChanges","badgeLabel","badgeStyle","div","isDarkMode","onToggle","disabled","toLocaleTimeString","e","stopPropagation","h3","p","animation"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"IframeWrapper.d.ts","sourceRoot":"","sources":["../../../src/editor/components/IframeWrapper.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAiE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAA;AAEzH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAM9D;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,yCAAsC,CAAA;AAE1E;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,mBAAmB,sBAA4C,CAAA;AAE5E;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,MAAM,EAAE,OAAO,CAAA;IACf;;OAEG;IACH,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB;;OAEG;IACH,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB;AAaD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,SAAS,CAAA;IACnB;;OAEG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB;;;OAGG;IACH,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IAC1C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;OAKG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAClC;AAUD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,aAAa,0DAmYxB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/editor/components/IframeWrapper.tsx"],"sourcesContent":["'use client'\n\nimport { memo, useEffect, useMemo, useState, createContext, useContext, type ReactNode, type ComponentType } from 'react'\nimport { createUsePuck } from '@puckeditor/core'\nimport type { LayoutDefinition } from '../../layouts/index.js'\nimport { backgroundValueToCSS, type BackgroundValue } from '../../fields/shared.js'\n\n// Create usePuck hook for accessing editor state\nconst usePuck = createUsePuck()\n\n/**\n * Context for preview dark mode state.\n * - `null` = not inside the editor (use DOM-based theme detection)\n * - `boolean` = inside the editor, indicates current dark mode state\n *\n * This allows Puck components to reactively respond to preview theme changes\n * without polling or MutationObserver hacks.\n */\nexport const PuckPreviewThemeContext = createContext<boolean | null>(null)\n\n/**\n * Hook to get the current preview theme from IframeWrapper context.\n *\n * @returns `null` if not inside the editor, or a `boolean` indicating dark mode state\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const previewTheme = usePuckPreviewTheme()\n *\n * // If in editor, use context; otherwise fall back to DOM\n * const isDark = previewTheme !== null\n * ? previewTheme\n * : document.documentElement.getAttribute('data-theme') === 'dark'\n *\n * return <div className={isDark ? 'dark-styles' : 'light-styles'}>...</div>\n * }\n * ```\n */\nexport const usePuckPreviewTheme = () => useContext(PuckPreviewThemeContext)\n\n/**\n * Layout style configuration for theme-aware preview\n * @deprecated Use LayoutDefinition with editorBackground and editorDarkMode instead\n */\nexport interface LayoutStyle {\n /**\n * CSS background value (color, gradient, etc.)\n */\n background: string\n /**\n * Whether this layout uses dark mode styling\n */\n isDark: boolean\n /**\n * Header component to render above the page content in the editor preview\n */\n header?: ComponentType\n /**\n * Footer component to render below the page content in the editor preview\n */\n footer?: ComponentType\n}\n\n/**\n * Internal layout config used by the iframe wrapper\n */\ninterface InternalLayoutConfig {\n background: string\n isDark: boolean\n header?: ComponentType\n footer?: ComponentType\n stickyHeaderHeight?: number\n}\n\nexport interface IframeWrapperProps {\n children: ReactNode\n /**\n * The iframe document to apply styles to\n */\n document?: Document\n /**\n * Layout definitions - the primary way to configure layouts.\n * Reads header, footer, editorBackground, and editorDarkMode from each layout.\n */\n layouts?: LayoutDefinition[]\n /**\n * Layout style configurations keyed by layout value\n * @deprecated Use `layouts` prop instead\n */\n layoutStyles?: Record<string, LayoutStyle>\n /**\n * Key in root.props to read layout value from\n * @default 'pageLayout'\n */\n layoutKey?: string\n /**\n * Default layout to use if none specified\n * @default 'default'\n */\n defaultLayout?: string\n /**\n * Stylesheet URLs to inject into the iframe.\n * These are merged from PuckConfigProvider and layout-specific settings.\n * Use this to provide frontend CSS (Tailwind, CSS variables, etc.) that\n * header/footer components need for proper styling.\n */\n editorStylesheets?: string[]\n /**\n * Raw CSS to inject into the iframe.\n * Merged from PuckConfigProvider and layout-specific settings.\n * Useful for CSS variables or style overrides.\n */\n editorCss?: string\n /**\n * Override the layout's dark mode setting for the preview.\n * When true, forces dark mode in the preview iframe.\n * When false, forces light mode in the preview iframe.\n * When undefined, uses the layout's editorDarkMode setting.\n */\n previewDarkModeOverride?: boolean\n}\n\n/**\n * Default layout config\n */\nconst DEFAULT_LAYOUT_CONFIG: InternalLayoutConfig = {\n background: '#ffffff',\n isDark: false,\n}\n\n/**\n * Theme-aware iframe wrapper component\n *\n * Uses usePuck to read the pageLayout from root.props and applies\n * appropriate background and theme class to the preview iframe.\n *\n * @example\n * ```tsx\n * // Using layouts (recommended)\n * const overrides = {\n * iframe: ({ children, document }) => (\n * <IframeWrapper\n * document={document}\n * layouts={[\n * { value: 'default', label: 'Default', header: Header, footer: Footer },\n * { value: 'landing', label: 'Landing', editorBackground: '#f8fafc' },\n * ]}\n * >\n * {children}\n * </IframeWrapper>\n * ),\n * }\n * ```\n */\nexport const IframeWrapper = memo(function IframeWrapper({\n children,\n document: iframeDoc,\n layouts,\n layoutStyles,\n layoutKey = 'pageLayout',\n defaultLayout = 'default',\n editorStylesheets,\n editorCss,\n previewDarkModeOverride,\n}: IframeWrapperProps) {\n const appState = usePuck((s) => s.appState)\n\n // Track stylesheet loading state to force re-render when styles are ready\n const [stylesLoaded, setStylesLoaded] = useState(false)\n\n // Check if we're in interactive mode (links should be clickable)\n const isInteractive = appState.ui.previewMode === 'interactive'\n\n // Read layout value and page-level overrides from root props\n const rootProps = appState.data.root?.props as Record<string, unknown> | undefined\n const layoutValue = (rootProps?.[layoutKey] as string) || defaultLayout\n\n // Page-level overrides\n const showHeaderOverride = rootProps?.showHeader as 'default' | 'show' | 'hide' | undefined\n const showFooterOverride = rootProps?.showFooter as 'default' | 'show' | 'hide' | undefined\n const pageBackground = rootProps?.pageBackground as BackgroundValue | null | undefined\n\n // Convert layouts array to config map, or use deprecated layoutStyles\n const layoutConfigMap = useMemo<Record<string, InternalLayoutConfig>>(() => {\n // If layouts prop provided, convert to internal format\n if (layouts) {\n const map: Record<string, InternalLayoutConfig> = {}\n for (const layout of layouts) {\n map[layout.value] = {\n background: layout.editorBackground ?? '#ffffff',\n isDark: layout.editorDarkMode ?? false,\n header: layout.header,\n footer: layout.footer,\n stickyHeaderHeight: layout.stickyHeaderHeight,\n }\n }\n return map\n }\n\n // Fall back to deprecated layoutStyles if provided\n if (layoutStyles) {\n return layoutStyles\n }\n\n // Default fallback\n return { default: DEFAULT_LAYOUT_CONFIG }\n }, [layouts, layoutStyles])\n\n // Get config for current layout\n const layoutConfig = layoutConfigMap[layoutValue] || layoutConfigMap[defaultLayout] || DEFAULT_LAYOUT_CONFIG\n\n // Calculate isDark for context provider (same logic as in useEffect)\n const isDark = previewDarkModeOverride ?? layoutConfig.isDark\n\n useEffect(() => {\n if (!iframeDoc) return\n\n const body = iframeDoc.body\n const html = iframeDoc.documentElement\n\n // Apply background - page-level override takes precedence\n if (pageBackground) {\n const bgStyles = backgroundValueToCSS(pageBackground)\n // Clear previous background styles\n body.style.background = ''\n body.style.backgroundColor = ''\n body.style.backgroundImage = ''\n // Apply new styles\n Object.assign(body.style, bgStyles)\n } else {\n body.style.background = layoutConfig.background\n }\n body.style.backgroundAttachment = 'fixed'\n body.style.minHeight = '100vh'\n\n // Apply theme class and data-theme attribute for dark/light mode\n // Supports both patterns: CSS classes (.dark/.light) and data attributes ([data-theme='dark'])\n // previewDarkModeOverride takes precedence over layoutConfig.isDark\n if (isDark) {\n html.classList.add('dark')\n html.classList.remove('light')\n html.setAttribute('data-theme', 'dark')\n body.style.color = '#ffffff'\n } else {\n html.classList.remove('dark')\n html.classList.add('light')\n html.setAttribute('data-theme', 'light')\n body.style.color = '#1f2937' // gray-800\n }\n\n // Inject external stylesheets (Tailwind CSS, CSS variables, etc.)\n // These provide the styles needed for header/footer components\n if (editorStylesheets && editorStylesheets.length > 0) {\n let pendingLoads = 0\n let loadedCount = 0\n\n const checkAllLoaded = () => {\n loadedCount++\n if (loadedCount >= pendingLoads) {\n // All stylesheets loaded - force browser to recalculate styles\n // This is necessary because the DOM was already rendered before CSS loaded\n setStylesLoaded(true)\n\n // Force a browser repaint after styles load\n // Use multiple techniques to ensure CSS is applied to existing elements\n requestAnimationFrame(() => {\n if (!html || !body) return\n\n // Technique 1: Re-apply theme classes (mimics what dark mode toggle does)\n const isDark = previewDarkModeOverride ?? layoutConfig.isDark\n if (isDark) {\n html.classList.remove('dark')\n void html.offsetHeight // Force reflow\n html.classList.add('dark')\n } else {\n html.classList.remove('light')\n void html.offsetHeight // Force reflow\n html.classList.add('light')\n }\n\n // Technique 2: Toggle visibility to force repaint\n body.style.visibility = 'hidden'\n void body.offsetHeight\n body.style.visibility = ''\n })\n }\n }\n\n // Get origin for resolving relative URLs\n // Puck's iframe may use srcdoc which doesn't have a proper base URL,\n // so relative paths like '/api/puck/styles' won't resolve correctly\n const origin = typeof window !== 'undefined' ? window.location.origin : ''\n\n // Track which stylesheets have been counted to avoid double-counting\n const loadedIndexes = new Set<number>()\n\n const markLoaded = (index: number) => {\n if (loadedIndexes.has(index)) return\n loadedIndexes.add(index)\n checkAllLoaded()\n }\n\n editorStylesheets.forEach((href, index) => {\n const linkId = `puck-editor-stylesheet-${index}`\n const existingLink = iframeDoc.getElementById(linkId) as HTMLLinkElement | null\n\n if (!existingLink) {\n pendingLoads++\n const link = iframeDoc.createElement('link')\n link.id = linkId\n link.rel = 'stylesheet'\n // Resolve relative URLs to absolute URLs for iframe compatibility\n link.href = href.startsWith('/') ? `${origin}${href}` : href\n // Track when stylesheet loads\n link.onload = () => markLoaded(index)\n link.onerror = () => markLoaded(index) // Count errors too to avoid hanging\n iframeDoc.head.appendChild(link)\n\n // Fallback: if onload doesn't fire within 2 seconds, force trigger\n // This handles edge cases with cached resources or browser quirks\n setTimeout(() => {\n if (!loadedIndexes.has(index)) {\n markLoaded(index)\n }\n }, 2000)\n } else if (!stylesLoaded) {\n // Link exists - assume it's already loaded\n pendingLoads++\n // Immediately mark as loaded since it's already in the DOM\n requestAnimationFrame(() => markLoaded(index))\n }\n })\n\n // If no new stylesheets to load, mark as loaded\n if (pendingLoads === 0 && !stylesLoaded) {\n setStylesLoaded(true)\n }\n } else if (!stylesLoaded) {\n // No stylesheets to load\n setStylesLoaded(true)\n }\n\n // Inject custom CSS (CSS variables, overrides, etc.)\n if (editorCss) {\n const CUSTOM_CSS_ID = 'puck-editor-custom-css'\n let style = iframeDoc.getElementById(CUSTOM_CSS_ID) as HTMLStyleElement | null\n if (!style) {\n style = iframeDoc.createElement('style')\n style.id = CUSTOM_CSS_ID\n iframeDoc.head.appendChild(style)\n }\n style.textContent = editorCss\n }\n\n // Inject richtext-output styles into the iframe for proper heading/list rendering\n const RICHTEXT_STYLES_ID = 'puck-richtext-output-styles'\n if (!iframeDoc.getElementById(RICHTEXT_STYLES_ID)) {\n const style = iframeDoc.createElement('style')\n style.id = RICHTEXT_STYLES_ID\n style.textContent = `\n /* Rich Text Output Styles for Puck Preview */\n .richtext-output {\n font-size: 1.125rem;\n line-height: 1.75;\n color: inherit;\n }\n .richtext-output h1 {\n margin-top: 2rem;\n margin-bottom: 1rem;\n font-weight: 700;\n font-size: 2.25rem;\n line-height: 1.2;\n }\n .richtext-output h1:first-child { margin-top: 0; }\n .richtext-output h2 {\n margin-top: 2rem;\n margin-bottom: 1rem;\n font-weight: 700;\n font-size: 1.875rem;\n line-height: 1.25;\n }\n .richtext-output h2:first-child { margin-top: 0; }\n .richtext-output h3 {\n margin-top: 2rem;\n margin-bottom: 1rem;\n font-weight: 700;\n font-size: 1.5rem;\n line-height: 1.3;\n }\n .richtext-output h3:first-child { margin-top: 0; }\n .richtext-output h4 {\n margin-top: 2rem;\n margin-bottom: 1rem;\n font-weight: 700;\n font-size: 1.25rem;\n line-height: 1.35;\n }\n .richtext-output h4:first-child { margin-top: 0; }\n .richtext-output p {\n margin-bottom: 1.25rem;\n }\n .richtext-output p:last-child { margin-bottom: 0; }\n .richtext-output ul {\n margin-bottom: 1.25rem;\n padding-left: 2rem;\n list-style-type: disc !important;\n }\n .richtext-output ol {\n margin-bottom: 1.25rem;\n padding-left: 2rem;\n list-style-type: decimal !important;\n }\n .richtext-output li {\n margin-bottom: 0.5rem;\n display: list-item !important;\n }\n .richtext-output li::marker {\n color: currentColor;\n }\n .richtext-output ul ul,\n .richtext-output ol ul {\n list-style-type: circle !important;\n margin-top: 0.5rem;\n margin-bottom: 0;\n }\n .richtext-output ul ul ul,\n .richtext-output ol ul ul {\n list-style-type: square !important;\n }\n .richtext-output ol ol,\n .richtext-output ul ol {\n list-style-type: lower-alpha !important;\n margin-top: 0.5rem;\n margin-bottom: 0;\n }\n .richtext-output blockquote {\n margin: 1.5rem 0;\n padding-left: 1.5rem;\n border-left: 4px solid #e5e7eb;\n font-style: italic;\n }\n .richtext-output a {\n color: #2563eb;\n text-decoration: underline;\n }\n .richtext-output a:hover { opacity: 0.8; }\n .richtext-output code {\n background-color: #f3f4f6;\n padding: 0.125rem 0.25rem;\n border-radius: 0.25rem;\n font-size: 0.875rem;\n }\n .richtext-output mark {\n background-color: #fef08a;\n padding: 0.125rem 0.25rem;\n border-radius: 0.125rem;\n }\n .richtext-output s,\n .richtext-output strike {\n text-decoration: line-through;\n }\n @media (max-width: 768px) {\n .richtext-output { font-size: 1rem; }\n .richtext-output h1 { font-size: 1.875rem; }\n .richtext-output h2 { font-size: 1.5rem; }\n .richtext-output h3 { font-size: 1.25rem; }\n }\n `\n iframeDoc.head.appendChild(style)\n }\n }, [iframeDoc, layoutConfig, pageBackground, editorStylesheets, editorCss, stylesLoaded, previewDarkModeOverride])\n\n // Get header/footer components from layout config\n const LayoutHeader = layoutConfig.header\n const LayoutFooter = layoutConfig.footer\n\n // Determine header/footer visibility based on page-level overrides\n // 'default' or undefined = use layout setting\n // 'show' = always show (even if layout doesn't have one - use layout's component)\n // 'hide' = always hide\n const shouldShowHeader =\n showHeaderOverride === 'hide'\n ? false\n : showHeaderOverride === 'show'\n ? !!LayoutHeader\n : !!LayoutHeader\n\n const shouldShowFooter =\n showFooterOverride === 'hide'\n ? false\n : showFooterOverride === 'show'\n ? !!LayoutFooter\n : !!LayoutFooter\n\n // If we have header or footer to show, wrap in flex container to ensure proper layout\n if (shouldShowHeader || shouldShowFooter) {\n // Calculate content padding for sticky headers (only if header is actually shown)\n const contentStyle: React.CSSProperties = {\n flex: 1,\n position: 'relative',\n // Add padding-top for sticky headers so content doesn't render behind them\n ...(shouldShowHeader && layoutConfig.stickyHeaderHeight && { paddingTop: layoutConfig.stickyHeaderHeight }),\n }\n\n // Disable pointer events on header/footer in edit mode to prevent accidental clicks\n const headerFooterStyle: React.CSSProperties = isInteractive\n ? {}\n : { pointerEvents: 'none' }\n\n // Use key to force re-render when styles finish loading\n // This ensures Tailwind classes are applied after the stylesheet loads\n return (\n <PuckPreviewThemeContext.Provider value={isDark}>\n <div\n key={stylesLoaded ? 'styles-loaded' : 'styles-loading'}\n style={{ display: 'flex', flexDirection: 'column', minHeight: '100vh' }}\n >\n {shouldShowHeader && LayoutHeader && (\n <div style={headerFooterStyle}>\n <LayoutHeader />\n </div>\n )}\n <div style={contentStyle}>{children}</div>\n {shouldShowFooter && LayoutFooter && (\n <div style={headerFooterStyle}>\n <LayoutFooter />\n </div>\n )}\n </div>\n </PuckPreviewThemeContext.Provider>\n )\n }\n\n // Use key to force re-render when styles finish loading\n return (\n <PuckPreviewThemeContext.Provider value={isDark}>\n <div key={stylesLoaded ? 'styles-loaded' : 'styles-loading'}>\n {children}\n </div>\n </PuckPreviewThemeContext.Provider>\n )\n})\n"],"names":["memo","useEffect","useMemo","useState","createContext","useContext","createUsePuck","backgroundValueToCSS","usePuck","PuckPreviewThemeContext","usePuckPreviewTheme","DEFAULT_LAYOUT_CONFIG","background","isDark","IframeWrapper","children","document","iframeDoc","layouts","layoutStyles","layoutKey","defaultLayout","editorStylesheets","editorCss","previewDarkModeOverride","appState","s","stylesLoaded","setStylesLoaded","isInteractive","ui","previewMode","rootProps","data","root","props","layoutValue","showHeaderOverride","showHeader","showFooterOverride","showFooter","pageBackground","layoutConfigMap","map","layout","value","editorBackground","editorDarkMode","header","footer","stickyHeaderHeight","default","layoutConfig","body","html","documentElement","bgStyles","style","backgroundColor","backgroundImage","Object","assign","backgroundAttachment","minHeight","classList","add","remove","setAttribute","color","length","pendingLoads","loadedCount","checkAllLoaded","requestAnimationFrame","offsetHeight","visibility","origin","window","location","loadedIndexes","Set","markLoaded","index","has","forEach","href","linkId","existingLink","getElementById","link","createElement","id","rel","startsWith","onload","onerror","head","appendChild","setTimeout","CUSTOM_CSS_ID","textContent","RICHTEXT_STYLES_ID","LayoutHeader","LayoutFooter","shouldShowHeader","shouldShowFooter","contentStyle","flex","position","paddingTop","headerFooterStyle","pointerEvents","Provider","div","display","flexDirection"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"LoadingState.d.ts","sourceRoot":"","sources":["../../../src/editor/components/LoadingState.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAAE,OAA6B,EAAE,EAAE,iBAAiB,+BAShF"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/editor/components/LoadingState.tsx"],"sourcesContent":["'use client'\n\nimport { Loader2 } from 'lucide-react'\n\nexport interface LoadingStateProps {\n /**\n * Loading message to display\n * @default 'Loading editor...'\n */\n message?: string\n}\n\n/**\n * Loading indicator shown while the Puck editor is being loaded\n *\n * Used as the fallback for dynamic import with ssr: false\n */\nexport function LoadingState({ message = 'Loading editor...' }: LoadingStateProps) {\n return (\n <div className=\"h-screen flex items-center justify-center bg-gray-50\">\n <div className=\"text-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-gray-600 mx-auto mb-4\" />\n <p className=\"text-gray-600\">{message}</p>\n </div>\n </div>\n )\n}\n"],"names":["Loader2","LoadingState","message","div","className","p"],"mappings":"AAAA;;AAEA,SAASA,OAAO,QAAQ,eAAc;AAUtC;;;;CAIC,GACD,OAAO,SAASC,aAAa,EAAEC,UAAU,mBAAmB,EAAqB;IAC/E,qBACE,KAACC;QAAIC,WAAU;kBACb,cAAA,MAACD;YAAIC,WAAU;;8BACb,KAACJ;oBAAQI,WAAU;;8BACnB,KAACC;oBAAED,WAAU;8BAAiBF;;;;;AAItC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PreviewModal.d.ts","sourceRoot":"","sources":["../../../src/editor/components/PreviewModal.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAgC9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAE9D,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,MAAM,EAAE,OAAO,CAAA;IACf;;OAEG;IACH,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB;;OAEG;IACH,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAA;IACrB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IAC3B;;OAEG;IACH,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;OAGG;IACH,MAAM,CAAC,EAAE,UAAU,CAAA;CACpB;AA0MD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,yDA4QvB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/editor/components/PreviewModal.tsx"],"sourcesContent":["'use client'\n\nimport { useState, useCallback, memo, useEffect, useMemo, type MouseEvent, type CSSProperties } from 'react'\nimport type { Data as PuckData, Config as PuckConfig } from '@puckeditor/core'\n\n/**\n * Editor-only props that should be stripped from data before preview rendering.\n * These props are used for editor/panel synchronization and shouldn't affect\n * how content renders in the preview.\n */\nconst EDITOR_ONLY_PROPS = ['editorPreviewFilter'] as const\n\n/**\n * Removes editor-only props from Puck data content items.\n * This ensures the preview renders as it would on the frontend,\n * without editor-specific state interfering.\n */\nfunction stripEditorOnlyProps(data: PuckData): PuckData {\n return {\n ...data,\n content: data.content.map((item) => {\n const cleanedProps = { ...item.props }\n for (const prop of EDITOR_ONLY_PROPS) {\n delete cleanedProps[prop]\n }\n return { ...item, props: cleanedProps }\n }),\n }\n}\nimport {\n X,\n ExternalLink,\n AlertTriangle,\n} from 'lucide-react'\nimport { PageRenderer } from '../../render/PageRenderer.js'\nimport type { LayoutDefinition } from '../../layouts/index.js'\n\nexport interface PreviewModalProps {\n /**\n * Whether the modal is open\n */\n isOpen: boolean\n /**\n * Handler for closing the modal\n */\n onClose: () => void\n /**\n * Puck data to render in the preview\n */\n data: PuckData | null\n /**\n * Page title for the modal header\n */\n pageTitle?: string\n /**\n * Handler for opening the page in a new tab\n */\n onOpenInNewTab?: () => void\n /**\n * Available layouts for rendering\n */\n layouts?: LayoutDefinition[]\n /**\n * Whether there are unsaved changes in the editor\n */\n hasUnsavedChanges?: boolean\n /**\n * Handler to save the current data before navigating\n */\n onSave?: () => Promise<void>\n /**\n * Whether a save is in progress\n */\n isSaving?: boolean\n /**\n * Stylesheet URLs to inject into the preview\n */\n editorStylesheets?: string[]\n /**\n * Raw CSS to inject into the preview\n */\n editorCss?: string\n /**\n * Puck configuration with components for rendering.\n * Required for custom components to render correctly in the preview.\n */\n config?: PuckConfig\n}\n\n// Styles\nconst styles = {\n overlay: {\n position: 'fixed',\n inset: 0,\n zIndex: 9990,\n backgroundColor: 'var(--theme-bg)',\n } as CSSProperties,\n controlPanel: {\n position: 'fixed',\n top: '50%',\n right: '16px',\n transform: 'translateY(-50%)',\n zIndex: 9998,\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n alignItems: 'flex-end',\n } as CSSProperties,\n controlCard: {\n backgroundColor: 'var(--theme-bg)',\n borderRadius: '8px',\n boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n border: '1px solid var(--theme-elevation-200)',\n padding: '8px',\n display: 'flex',\n flexDirection: 'column',\n gap: '4px',\n } as CSSProperties,\n closeButton: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '8px 12px',\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--theme-bg)',\n backgroundColor: 'var(--theme-elevation-900)',\n borderRadius: '6px',\n transition: 'background-color 0.15s',\n border: 'none',\n cursor: 'pointer',\n } as CSSProperties,\n viewButton: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '8px 12px',\n fontSize: '14px',\n color: 'var(--theme-elevation-600)',\n backgroundColor: 'transparent',\n borderRadius: '6px',\n transition: 'background-color 0.15s, color 0.15s',\n border: 'none',\n cursor: 'pointer',\n } as CSSProperties,\n unsavedBadge: {\n backgroundColor: 'var(--theme-warning-100)',\n color: 'var(--theme-warning-700)',\n padding: '6px 12px',\n borderRadius: '9999px',\n fontSize: '12px',\n fontWeight: 500,\n boxShadow: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',\n } as CSSProperties,\n content: {\n height: '100%',\n overflow: 'auto',\n backgroundColor: 'var(--theme-bg)',\n } as CSSProperties,\n emptyState: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n color: 'var(--theme-elevation-500)',\n } as CSSProperties,\n // Navigation dialog styles\n dialogOverlay: {\n position: 'fixed',\n inset: 0,\n zIndex: 9999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n } as CSSProperties,\n dialogContainer: {\n backgroundColor: 'var(--theme-bg)',\n borderRadius: '8px',\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.25)',\n maxWidth: '448px',\n width: '100%',\n margin: '0 16px',\n overflow: 'hidden',\n } as CSSProperties,\n dialogHeader: {\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '16px 20px',\n borderBottom: '1px solid var(--theme-elevation-200)',\n backgroundColor: 'var(--theme-warning-50)',\n } as CSSProperties,\n dialogIconWrapper: {\n flexShrink: 0,\n width: '40px',\n height: '40px',\n borderRadius: '50%',\n backgroundColor: 'var(--theme-warning-100)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n } as CSSProperties,\n dialogTitle: {\n fontSize: '16px',\n fontWeight: 600,\n color: 'var(--theme-elevation-900)',\n margin: 0,\n } as CSSProperties,\n dialogSubtitle: {\n fontSize: '14px',\n color: 'var(--theme-elevation-500)',\n margin: 0,\n } as CSSProperties,\n dialogBody: {\n padding: '16px 20px',\n } as CSSProperties,\n dialogBodyText: {\n fontSize: '14px',\n color: 'var(--theme-elevation-700)',\n margin: 0,\n marginBottom: '8px',\n } as CSSProperties,\n dialogUrl: {\n fontSize: '14px',\n fontFamily: 'monospace',\n backgroundColor: 'var(--theme-elevation-100)',\n padding: '8px 12px',\n borderRadius: '4px',\n color: 'var(--theme-elevation-800)',\n wordBreak: 'break-all',\n } as CSSProperties,\n dialogWarning: {\n fontSize: '14px',\n color: 'var(--theme-warning-600)',\n marginTop: '12px',\n fontWeight: 500,\n } as CSSProperties,\n dialogFooter: {\n padding: '16px 20px',\n backgroundColor: 'var(--theme-elevation-50)',\n borderTop: '1px solid var(--theme-elevation-200)',\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n } as CSSProperties,\n buttonSecondary: {\n padding: '8px 16px',\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--theme-elevation-700)',\n backgroundColor: 'var(--theme-bg)',\n border: '1px solid var(--theme-elevation-300)',\n borderRadius: '6px',\n transition: 'background-color 0.15s',\n cursor: 'pointer',\n } as CSSProperties,\n buttonPrimary: {\n padding: '8px 16px',\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--theme-bg)',\n backgroundColor: 'var(--theme-elevation-900)',\n border: 'none',\n borderRadius: '6px',\n transition: 'background-color 0.15s',\n cursor: 'pointer',\n } as CSSProperties,\n buttonDanger: {\n padding: '8px 16px',\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--theme-error-700)',\n backgroundColor: 'var(--theme-error-50)',\n border: '1px solid var(--theme-error-200)',\n borderRadius: '6px',\n transition: 'background-color 0.15s',\n cursor: 'pointer',\n } as CSSProperties,\n buttonDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n } as CSSProperties,\n icon: {\n width: '16px',\n height: '16px',\n } as CSSProperties,\n}\n\n/**\n * Full-screen preview modal with client-side rendering\n *\n * Renders the current editor data directly using PageRenderer.\n * Links prompt for confirmation before navigating (with option to save first).\n *\n * Features:\n * - Zero consumer setup required\n * - Shows current editor state (including unsaved changes)\n * - Interactive elements (accordions, hover states) still work\n * - Links show confirmation dialog before navigating\n */\nexport const PreviewModal = memo(function PreviewModal({\n isOpen,\n onClose,\n data,\n pageTitle,\n onOpenInNewTab,\n layouts,\n hasUnsavedChanges = false,\n onSave,\n isSaving = false,\n editorStylesheets,\n editorCss,\n config,\n}: PreviewModalProps) {\n // Strip editor-only props from data to ensure preview renders like frontend\n const cleanedData = useMemo(() => {\n return data ? stripEditorOnlyProps(data) : null\n }, [data])\n\n // Navigation confirmation state\n const [pendingNavigation, setPendingNavigation] = useState<string | null>(null)\n const [isNavigating, setIsNavigating] = useState(false)\n const [viewButtonHovered, setViewButtonHovered] = useState(false)\n\n // Inject stylesheets into document head when modal is open\n useEffect(() => {\n if (!isOpen) return\n\n const injectedElements: HTMLElement[] = []\n\n // Inject external stylesheets\n if (editorStylesheets && editorStylesheets.length > 0) {\n editorStylesheets.forEach((href, index) => {\n const linkId = `puck-preview-stylesheet-${index}`\n if (!document.getElementById(linkId)) {\n const link = document.createElement('link')\n link.id = linkId\n link.rel = 'stylesheet'\n link.href = href\n document.head.appendChild(link)\n injectedElements.push(link)\n }\n })\n }\n\n // Inject custom CSS\n if (editorCss) {\n const styleId = 'puck-preview-custom-css'\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style')\n style.id = styleId\n style.textContent = editorCss\n document.head.appendChild(style)\n injectedElements.push(style)\n }\n }\n\n // Cleanup: remove injected elements when modal closes\n return () => {\n injectedElements.forEach((el) => el.remove())\n }\n }, [isOpen, editorStylesheets, editorCss])\n\n // Handle escape key\n useEffect(() => {\n if (!isOpen) return\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n if (pendingNavigation) {\n setPendingNavigation(null)\n } else {\n onClose()\n }\n }\n }\n\n document.addEventListener('keydown', handleEscape)\n return () => document.removeEventListener('keydown', handleEscape)\n }, [isOpen, pendingNavigation, onClose])\n\n // Intercept link clicks\n const handleContentClick = useCallback((e: MouseEvent<HTMLDivElement>) => {\n const target = e.target as HTMLElement\n const anchor = target.closest('a')\n\n if (anchor) {\n const href = anchor.getAttribute('href')\n\n // Allow hash-only links (scroll to section on same page)\n if (href?.startsWith('#') && !href.includes('/')) {\n return\n }\n\n // Block navigation and show confirmation\n e.preventDefault()\n e.stopPropagation()\n\n if (href) {\n setPendingNavigation(href)\n }\n }\n }, [])\n\n // Handle navigation after confirmation\n const handleNavigate = useCallback((saveFirst: boolean) => {\n if (!pendingNavigation) return\n\n const navigate = () => {\n setIsNavigating(true)\n onClose()\n window.location.href = pendingNavigation\n }\n\n if (saveFirst && onSave) {\n onSave().then(navigate).catch(() => {\n setIsNavigating(false)\n })\n } else {\n navigate()\n }\n }, [pendingNavigation, onClose, onSave])\n\n // Cancel navigation\n const handleCancelNavigation = useCallback(() => {\n setPendingNavigation(null)\n }, [])\n\n if (!isOpen) return null\n\n return (\n <div style={styles.overlay}>\n {/* Floating control panel */}\n <div style={styles.controlPanel}>\n <div style={styles.controlCard}>\n {/* Close button */}\n <button\n type=\"button\"\n onClick={onClose}\n style={styles.closeButton}\n title=\"Close preview (Esc)\"\n >\n <X style={styles.icon} />\n Close Preview\n </button>\n\n {/* View page button */}\n {onOpenInNewTab && (\n <button\n type=\"button\"\n onClick={onOpenInNewTab}\n style={{\n ...styles.viewButton,\n ...(viewButtonHovered ? {\n backgroundColor: 'var(--theme-elevation-100)',\n color: 'var(--theme-elevation-900)',\n } : {}),\n }}\n onMouseEnter={() => setViewButtonHovered(true)}\n onMouseLeave={() => setViewButtonHovered(false)}\n title=\"Open published page in new tab\"\n >\n <ExternalLink style={styles.icon} />\n View Page\n </button>\n )}\n </div>\n\n {/* Status badge */}\n {hasUnsavedChanges && (\n <div style={styles.unsavedBadge}>\n Unsaved changes\n </div>\n )}\n </div>\n\n {/* Preview content */}\n <div\n style={styles.content}\n onClickCapture={handleContentClick}\n >\n {cleanedData ? (\n <PageRenderer data={cleanedData} layouts={layouts} config={config} />\n ) : (\n <div style={styles.emptyState}>\n No content to preview\n </div>\n )}\n </div>\n\n {/* Navigation confirmation dialog */}\n {pendingNavigation && (\n <div style={styles.dialogOverlay}>\n <div\n style={styles.dialogContainer}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div style={styles.dialogHeader}>\n <div style={styles.dialogIconWrapper}>\n <AlertTriangle style={{ width: '20px', height: '20px', color: 'var(--theme-warning-600)' }} />\n </div>\n <div>\n <h3 style={styles.dialogTitle}>Navigate away?</h3>\n <p style={styles.dialogSubtitle}>This will close the preview</p>\n </div>\n </div>\n\n {/* Body */}\n <div style={styles.dialogBody}>\n <p style={styles.dialogBodyText}>\n You&apos;re about to navigate to:\n </p>\n <p style={styles.dialogUrl}>\n {pendingNavigation}\n </p>\n {hasUnsavedChanges && (\n <p style={styles.dialogWarning}>\n You have unsaved changes that will be lost.\n </p>\n )}\n </div>\n\n {/* Footer */}\n <div style={styles.dialogFooter}>\n <div style={{ display: 'flex', gap: '8px', justifyContent: 'flex-end', flexWrap: 'wrap' }}>\n <button\n type=\"button\"\n onClick={handleCancelNavigation}\n disabled={isNavigating || isSaving}\n style={{\n ...styles.buttonSecondary,\n ...((isNavigating || isSaving) ? styles.buttonDisabled : {}),\n }}\n >\n Cancel\n </button>\n {hasUnsavedChanges && onSave && (\n <button\n type=\"button\"\n onClick={() => handleNavigate(true)}\n disabled={isNavigating || isSaving}\n style={{\n ...styles.buttonPrimary,\n ...((isNavigating || isSaving) ? styles.buttonDisabled : {}),\n }}\n >\n {isSaving ? 'Saving...' : 'Save & Navigate'}\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => handleNavigate(false)}\n disabled={isNavigating || isSaving}\n style={{\n ...(hasUnsavedChanges ? styles.buttonDanger : styles.buttonPrimary),\n ...((isNavigating || isSaving) ? styles.buttonDisabled : {}),\n }}\n >\n {isNavigating ? 'Navigating...' : hasUnsavedChanges ? 'Navigate without saving' : 'Navigate'}\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n )\n})\n"],"names":["useState","useCallback","memo","useEffect","useMemo","EDITOR_ONLY_PROPS","stripEditorOnlyProps","data","content","map","item","cleanedProps","props","prop","X","ExternalLink","AlertTriangle","PageRenderer","styles","overlay","position","inset","zIndex","backgroundColor","controlPanel","top","right","transform","display","flexDirection","gap","alignItems","controlCard","borderRadius","boxShadow","border","padding","closeButton","fontSize","fontWeight","color","transition","cursor","viewButton","unsavedBadge","height","overflow","emptyState","justifyContent","dialogOverlay","dialogContainer","maxWidth","width","margin","dialogHeader","borderBottom","dialogIconWrapper","flexShrink","dialogTitle","dialogSubtitle","dialogBody","dialogBodyText","marginBottom","dialogUrl","fontFamily","wordBreak","dialogWarning","marginTop","dialogFooter","borderTop","buttonSecondary","buttonPrimary","buttonDanger","buttonDisabled","opacity","icon","PreviewModal","isOpen","onClose","pageTitle","onOpenInNewTab","layouts","hasUnsavedChanges","onSave","isSaving","editorStylesheets","editorCss","config","cleanedData","pendingNavigation","setPendingNavigation","isNavigating","setIsNavigating","viewButtonHovered","setViewButtonHovered","injectedElements","length","forEach","href","index","linkId","document","getElementById","link","createElement","id","rel","head","appendChild","push","styleId","style","textContent","el","remove","handleEscape","e","key","addEventListener","removeEventListener","handleContentClick","target","anchor","closest","getAttribute","startsWith","includes","preventDefault","stopPropagation","handleNavigate","saveFirst","navigate","window","location","then","catch","handleCancelNavigation","div","button","type","onClick","title","onMouseEnter","onMouseLeave","onClickCapture","h3","p","flexWrap","disabled"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PreviewModeToggle.d.ts","sourceRoot":"","sources":["../../../src/editor/components/PreviewModeToggle.tsx"],"names":[],"mappings":"AAwCA,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,UAAU,EAAE,OAAO,CAAA;IACnB;;OAEG;IACH,QAAQ,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAA;IACvC;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,8DAuC5B,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/editor/components/PreviewModeToggle.tsx"],"sourcesContent":["'use client'\n\nimport { memo, type CSSProperties } from 'react'\nimport { Sun, Moon } from 'lucide-react'\n\nconst styles = {\n container: {\n display: 'flex',\n alignItems: 'center',\n gap: '2px',\n padding: '2px',\n backgroundColor: 'var(--puck-color-grey-11, #e8e8e8)',\n borderRadius: '6px',\n } as CSSProperties,\n button: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '28px',\n height: '28px',\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n transition: 'background-color 0.15s, color 0.15s',\n } as CSSProperties,\n buttonActive: {\n backgroundColor: 'var(--puck-color-white, #ffffff)',\n color: 'var(--puck-color-grey-02, #3d3d3d)',\n boxShadow: '0 1px 2px rgba(0, 0, 0, 0.05)',\n } as CSSProperties,\n buttonInactive: {\n backgroundColor: 'transparent',\n color: 'var(--puck-color-grey-05, #8f8f8f)',\n } as CSSProperties,\n icon: {\n width: '14px',\n height: '14px',\n } as CSSProperties,\n}\n\nexport interface PreviewModeToggleProps {\n /**\n * Whether dark mode is currently enabled in the preview\n */\n isDarkMode: boolean\n /**\n * Callback when the mode is toggled\n */\n onToggle: (isDarkMode: boolean) => void\n /**\n * Whether the toggle is disabled\n */\n disabled?: boolean\n}\n\n/**\n * Toggle button for switching preview iframe between light/dark modes.\n *\n * This controls the preview content's dark mode independently from the\n * editor UI dark mode. Useful for testing how the page looks in both modes.\n *\n * @example\n * ```tsx\n * const [previewDarkMode, setPreviewDarkMode] = useState(false)\n *\n * <PreviewModeToggle\n * isDarkMode={previewDarkMode}\n * onToggle={setPreviewDarkMode}\n * />\n * ```\n */\nexport const PreviewModeToggle = memo(function PreviewModeToggle({\n isDarkMode,\n onToggle,\n disabled = false,\n}: PreviewModeToggleProps) {\n return (\n <div\n style={{\n ...styles.container,\n ...(disabled ? { opacity: 0.5, pointerEvents: 'none' } : {}),\n }}\n title=\"Toggle preview dark/light mode\"\n >\n <button\n type=\"button\"\n onClick={() => onToggle(false)}\n style={{\n ...styles.button,\n ...(!isDarkMode ? styles.buttonActive : styles.buttonInactive),\n }}\n aria-label=\"Light mode preview\"\n aria-pressed={!isDarkMode}\n >\n <Sun style={styles.icon} />\n </button>\n <button\n type=\"button\"\n onClick={() => onToggle(true)}\n style={{\n ...styles.button,\n ...(isDarkMode ? styles.buttonActive : styles.buttonInactive),\n }}\n aria-label=\"Dark mode preview\"\n aria-pressed={isDarkMode}\n >\n <Moon style={styles.icon} />\n </button>\n </div>\n )\n})\n"],"names":["memo","Sun","Moon","styles","container","display","alignItems","gap","padding","backgroundColor","borderRadius","button","justifyContent","width","height","border","cursor","transition","buttonActive","color","boxShadow","buttonInactive","icon","PreviewModeToggle","isDarkMode","onToggle","disabled","div","style","opacity","pointerEvents","title","type","onClick","aria-label","aria-pressed"],"mappings":"AAAA;;AAEA,SAASA,IAAI,QAA4B,QAAO;AAChD,SAASC,GAAG,EAAEC,IAAI,QAAQ,eAAc;AAExC,MAAMC,SAAS;IACbC,WAAW;QACTC,SAAS;QACTC,YAAY;QACZC,KAAK;QACLC,SAAS;QACTC,iBAAiB;QACjBC,cAAc;IAChB;IACAC,QAAQ;QACNN,SAAS;QACTC,YAAY;QACZM,gBAAgB;QAChBC,OAAO;QACPC,QAAQ;QACRC,QAAQ;QACRL,cAAc;QACdM,QAAQ;QACRC,YAAY;IACd;IACAC,cAAc;QACZT,iBAAiB;QACjBU,OAAO;QACPC,WAAW;IACb;IACAC,gBAAgB;QACdZ,iBAAiB;QACjBU,OAAO;IACT;IACAG,MAAM;QACJT,OAAO;QACPC,QAAQ;IACV;AACF;AAiBA;;;;;;;;;;;;;;;CAeC,GACD,OAAO,MAAMS,kCAAoBvB,KAAK,SAASuB,kBAAkB,EAC/DC,UAAU,EACVC,QAAQ,EACRC,WAAW,KAAK,EACO;IACvB,qBACE,MAACC;QACCC,OAAO;YACL,GAAGzB,OAAOC,SAAS;YACnB,GAAIsB,WAAW;gBAAEG,SAAS;gBAAKC,eAAe;YAAO,IAAI,CAAC,CAAC;QAC7D;QACAC,OAAM;;0BAEN,KAACpB;gBACCqB,MAAK;gBACLC,SAAS,IAAMR,SAAS;gBACxBG,OAAO;oBACL,GAAGzB,OAAOQ,MAAM;oBAChB,GAAI,CAACa,aAAarB,OAAOe,YAAY,GAAGf,OAAOkB,cAAc;gBAC/D;gBACAa,cAAW;gBACXC,gBAAc,CAACX;0BAEf,cAAA,KAACvB;oBAAI2B,OAAOzB,OAAOmB,IAAI;;;0BAEzB,KAACX;gBACCqB,MAAK;gBACLC,SAAS,IAAMR,SAAS;gBACxBG,OAAO;oBACL,GAAGzB,OAAOQ,MAAM;oBAChB,GAAIa,aAAarB,OAAOe,YAAY,GAAGf,OAAOkB,cAAc;gBAC9D;gBACAa,cAAW;gBACXC,gBAAcX;0BAEd,cAAA,KAACtB;oBAAK0B,OAAOzB,OAAOmB,IAAI;;;;;AAIhC,GAAE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"VersionHistory.d.ts","sourceRoot":"","sources":["../../../src/editor/components/VersionHistory.tsx"],"names":[],"mappings":"AAYA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,OAAO,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;QAC/B,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;KAClB,CAAA;IACD,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAA;IAC1C;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAgLD;;;;GAIG;AACH,eAAO,MAAM,cAAc,2DAyPzB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/editor/components/VersionHistory.tsx"],"sourcesContent":["'use client'\n\nimport { useState, useCallback, useEffect, useRef, memo, type CSSProperties } from 'react'\nimport {\n History,\n Loader2,\n Check,\n RotateCcw,\n X,\n ChevronDown,\n} from 'lucide-react'\n\n/**\n * Version entry from Payload's versions system\n */\nexport interface PageVersion {\n id: string\n parent: string\n version: {\n title?: string\n slug?: string\n _status?: 'draft' | 'published'\n updatedAt: string\n createdAt: string\n }\n createdAt: string\n updatedAt: string\n autosave?: boolean\n latest?: boolean\n}\n\nexport interface VersionHistoryProps {\n /**\n * Page ID to fetch versions for\n */\n pageId: string\n /**\n * API endpoint base path\n * @default '/api/puck/pages'\n */\n apiEndpoint?: string\n /**\n * Callback when a version is restored\n */\n onRestore?: (version: PageVersion) => void\n /**\n * Whether restore operations are disabled\n */\n disabled?: boolean\n}\n\n// Shared styles\nconst styles = {\n container: {\n position: 'relative',\n } as CSSProperties,\n button: {\n display: 'inline-flex',\n alignItems: 'center',\n whiteSpace: 'nowrap',\n padding: '6px 12px',\n fontSize: '14px',\n fontWeight: 500,\n borderRadius: '6px',\n transition: 'background-color 0.15s',\n backgroundColor: 'var(--theme-bg)',\n color: 'var(--theme-elevation-700)',\n border: '1px solid var(--theme-elevation-200)',\n cursor: 'pointer',\n } as CSSProperties,\n buttonDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n } as CSSProperties,\n icon: {\n width: '16px',\n height: '16px',\n marginRight: '4px',\n flexShrink: 0,\n } as CSSProperties,\n iconSmall: {\n width: '12px',\n height: '12px',\n marginLeft: '4px',\n flexShrink: 0,\n } as CSSProperties,\n dropdown: {\n position: 'absolute',\n top: '100%',\n right: 0,\n marginTop: '4px',\n backgroundColor: 'var(--theme-bg)',\n border: '1px solid var(--theme-elevation-200)',\n borderRadius: '8px',\n boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n zIndex: 50,\n width: '320px',\n maxHeight: '400px',\n overflow: 'hidden',\n } as CSSProperties,\n header: {\n borderBottom: '1px solid var(--theme-elevation-200)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '12px 16px',\n } as CSSProperties,\n headerTitle: {\n fontWeight: 500,\n fontSize: '14px',\n color: 'var(--theme-elevation-900)',\n } as CSSProperties,\n closeButton: {\n color: 'var(--theme-elevation-400)',\n transition: 'color 0.15s',\n padding: '4px',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n } as CSSProperties,\n content: {\n maxHeight: '340px',\n overflowY: 'auto',\n } as CSSProperties,\n loadingContainer: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '32px',\n } as CSSProperties,\n loadingIcon: {\n width: '20px',\n height: '20px',\n color: 'var(--theme-elevation-400)',\n animation: 'spin 1s linear infinite',\n } as CSSProperties,\n errorText: {\n fontSize: '14px',\n color: 'var(--theme-error-600)',\n padding: '16px',\n textAlign: 'center',\n } as CSSProperties,\n emptyText: {\n fontSize: '14px',\n color: 'var(--theme-elevation-500)',\n padding: '16px',\n textAlign: 'center',\n } as CSSProperties,\n listContainer: {\n padding: '8px',\n } as CSSProperties,\n versionItem: {\n borderRadius: '6px',\n transition: 'background-color 0.15s',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '10px 12px',\n gap: '12px',\n } as CSSProperties,\n versionInfo: {\n flex: 1,\n minWidth: 0,\n } as CSSProperties,\n versionHeader: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n } as CSSProperties,\n versionDate: {\n fontSize: '14px',\n fontWeight: 500,\n color: 'var(--theme-elevation-900)',\n } as CSSProperties,\n badgeCurrent: {\n fontSize: '12px',\n fontWeight: 500,\n borderRadius: '9999px',\n padding: '2px 8px',\n backgroundColor: 'var(--theme-elevation-100)',\n color: 'var(--theme-elevation-700)',\n } as CSSProperties,\n badgePublished: {\n fontSize: '12px',\n fontWeight: 500,\n borderRadius: '9999px',\n padding: '2px 8px',\n backgroundColor: 'var(--theme-success-100)',\n color: 'var(--theme-success-700)',\n } as CSSProperties,\n autosaveText: {\n fontSize: '12px',\n color: 'var(--theme-elevation-400)',\n } as CSSProperties,\n versionDetails: {\n fontSize: '12px',\n color: 'var(--theme-elevation-500)',\n marginTop: '2px',\n } as CSSProperties,\n restoreButton: {\n fontSize: '12px',\n fontWeight: 500,\n color: 'var(--theme-elevation-700)',\n transition: 'color 0.15s',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n padding: '4px 8px',\n flexShrink: 0,\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n } as CSSProperties,\n restoreButtonDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n } as CSSProperties,\n checkIcon: {\n width: '16px',\n height: '16px',\n color: 'var(--theme-elevation-400)',\n flexShrink: 0,\n } as CSSProperties,\n}\n\n/**\n * Version history dropdown for the Puck editor\n *\n * Shows a list of previous versions with the ability to restore them.\n */\nexport const VersionHistory = memo(function VersionHistory({\n pageId,\n apiEndpoint = '/api/puck/pages',\n onRestore,\n disabled,\n}: VersionHistoryProps) {\n const [isOpen, setIsOpen] = useState(false)\n const [isLoading, setIsLoading] = useState(false)\n const [isRestoring, setIsRestoring] = useState(false)\n const [versions, setVersions] = useState<PageVersion[]>([])\n const [error, setError] = useState<string | null>(null)\n const [isAvailable, setIsAvailable] = useState<boolean | null>(null)\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n\n // Check if versions endpoint is available on mount\n useEffect(() => {\n async function checkAvailability() {\n try {\n const response = await fetch(`${apiEndpoint}/${pageId}/versions?limit=1`, {\n method: 'GET',\n })\n setIsAvailable(response.status !== 404)\n } catch {\n setIsAvailable(false)\n }\n }\n checkAvailability()\n }, [apiEndpoint, pageId])\n\n // Close on outside click\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [])\n\n // Fetch versions when dropdown opens\n const fetchVersions = useCallback(async () => {\n setIsLoading(true)\n setError(null)\n try {\n const response = await fetch(`${apiEndpoint}/${pageId}/versions?limit=20`)\n if (!response.ok) {\n throw new Error('Failed to fetch versions')\n }\n const data = await response.json()\n setVersions(data.docs || [])\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load versions')\n console.error('Error fetching versions:', err)\n } finally {\n setIsLoading(false)\n }\n }, [apiEndpoint, pageId])\n\n // Fetch versions when opening\n useEffect(() => {\n if (isOpen) {\n fetchVersions()\n }\n }, [isOpen, fetchVersions])\n\n // Handle version restore\n const handleRestore = useCallback(\n async (version: PageVersion) => {\n if (!confirm(`Restore this version from ${formatDate(version.updatedAt)}? This will overwrite current changes.`)) {\n return\n }\n\n setIsRestoring(true)\n try {\n const response = await fetch(`${apiEndpoint}/${pageId}/versions`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ versionId: version.id }),\n })\n\n if (!response.ok) {\n throw new Error('Failed to restore version')\n }\n\n onRestore?.(version)\n setIsOpen(false)\n window.location.reload()\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to restore version')\n console.error('Error restoring version:', err)\n } finally {\n setIsRestoring(false)\n }\n },\n [apiEndpoint, pageId, onRestore]\n )\n\n // Format date for display\n function formatDate(dateStr: string): string {\n const date = new Date(dateStr)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffMins = Math.floor(diffMs / 60000)\n const diffHours = Math.floor(diffMs / 3600000)\n const diffDays = Math.floor(diffMs / 86400000)\n\n if (diffMins < 1) return 'Just now'\n if (diffMins < 60) return `${diffMins}m ago`\n if (diffHours < 24) return `${diffHours}h ago`\n if (diffDays < 7) return `${diffDays}d ago`\n return date.toLocaleDateString()\n }\n\n // Format time for display\n function formatTime(dateStr: string): string {\n const date = new Date(dateStr)\n return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })\n }\n\n // Don't render if versions endpoint is not available or still checking\n if (isAvailable !== true) {\n return null\n }\n\n return (\n <div ref={dropdownRef} style={styles.container}>\n {/* Trigger button */}\n <button\n type=\"button\"\n onClick={() => setIsOpen(!isOpen)}\n disabled={disabled}\n style={{\n ...styles.button,\n ...(disabled ? styles.buttonDisabled : {}),\n }}\n >\n <History style={styles.icon} />\n History\n <ChevronDown style={styles.iconSmall} />\n </button>\n\n {/* Dropdown panel */}\n {isOpen && (\n <div style={styles.dropdown}>\n {/* Header */}\n <div style={styles.header}>\n <span style={styles.headerTitle}>Version History</span>\n <button\n type=\"button\"\n onClick={() => setIsOpen(false)}\n style={styles.closeButton}\n >\n <X style={{ width: '16px', height: '16px' }} />\n </button>\n </div>\n\n {/* Content */}\n <div style={styles.content}>\n {isLoading ? (\n <div style={styles.loadingContainer}>\n <Loader2 style={styles.loadingIcon} />\n </div>\n ) : error ? (\n <div style={styles.errorText as CSSProperties}>\n {error}\n </div>\n ) : versions.length === 0 ? (\n <div style={styles.emptyText as CSSProperties}>\n No version history available\n </div>\n ) : (\n <div style={styles.listContainer}>\n {versions.map((version, index) => (\n <div\n key={version.id}\n style={{\n ...styles.versionItem,\n backgroundColor: hoveredIndex === index ? 'var(--theme-elevation-50)' : 'transparent',\n }}\n onMouseEnter={() => setHoveredIndex(index)}\n onMouseLeave={() => setHoveredIndex(null)}\n >\n {/* Version info */}\n <div style={styles.versionInfo}>\n <div style={styles.versionHeader}>\n <span style={styles.versionDate}>\n {formatDate(version.updatedAt)}\n </span>\n {index === 0 && (\n <span style={styles.badgeCurrent}>\n Current\n </span>\n )}\n {version.version._status === 'published' && (\n <span style={styles.badgePublished}>\n Published\n </span>\n )}\n {version.autosave && (\n <span style={styles.autosaveText} title=\"Autosaved\">\n (auto)\n </span>\n )}\n </div>\n <div style={styles.versionDetails}>\n {formatTime(version.updatedAt)}\n {version.version.title && (\n <span> &middot; {version.version.title}</span>\n )}\n </div>\n </div>\n\n {/* Restore button (not for current version) */}\n {index > 0 && (\n <button\n type=\"button\"\n onClick={() => handleRestore(version)}\n disabled={isRestoring}\n style={{\n ...styles.restoreButton,\n ...(isRestoring ? styles.restoreButtonDisabled : {}),\n }}\n >\n {isRestoring ? (\n <Loader2 style={{ width: '12px', height: '12px', animation: 'spin 1s linear infinite' }} />\n ) : (\n <RotateCcw style={{ width: '12px', height: '12px' }} />\n )}\n Restore\n </button>\n )}\n\n {/* Current indicator */}\n {index === 0 && (\n <span style={{ flexShrink: 0 }}>\n <Check style={styles.checkIcon} />\n </span>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n )\n})\n"],"names":["useState","useCallback","useEffect","useRef","memo","History","Loader2","Check","RotateCcw","X","ChevronDown","styles","container","position","button","display","alignItems","whiteSpace","padding","fontSize","fontWeight","borderRadius","transition","backgroundColor","color","border","cursor","buttonDisabled","opacity","icon","width","height","marginRight","flexShrink","iconSmall","marginLeft","dropdown","top","right","marginTop","boxShadow","zIndex","maxHeight","overflow","header","borderBottom","justifyContent","headerTitle","closeButton","background","content","overflowY","loadingContainer","loadingIcon","animation","errorText","textAlign","emptyText","listContainer","versionItem","gap","versionInfo","flex","minWidth","versionHeader","versionDate","badgeCurrent","badgePublished","autosaveText","versionDetails","restoreButton","restoreButtonDisabled","checkIcon","VersionHistory","pageId","apiEndpoint","onRestore","disabled","isOpen","setIsOpen","isLoading","setIsLoading","isRestoring","setIsRestoring","versions","setVersions","error","setError","isAvailable","setIsAvailable","hoveredIndex","setHoveredIndex","dropdownRef","checkAvailability","response","fetch","method","status","handleClickOutside","event","current","contains","target","document","addEventListener","removeEventListener","fetchVersions","ok","Error","data","json","docs","err","message","console","handleRestore","version","confirm","formatDate","updatedAt","headers","body","JSON","stringify","versionId","id","window","location","reload","dateStr","date","Date","now","diffMs","getTime","diffMins","Math","floor","diffHours","diffDays","toLocaleDateString","formatTime","toLocaleTimeString","hour","minute","div","ref","style","type","onClick","span","length","map","index","onMouseEnter","onMouseLeave","_status","autosave","title"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useDarkMode.d.ts","sourceRoot":"","sources":["../../../src/editor/hooks/useDarkMode.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,aAAa,GAAG,MAAM,CAAA;AAE7D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,UAAU,EAAE,OAAO,CAAA;IACnB;;OAEG;IACH,MAAM,EAAE,cAAc,CAAA;CACvB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,IAAI,iBAAiB,CAqE/C"}