@delmaredigital/payload-puck 0.4.0 → 0.6.0

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 (427) hide show
  1. package/README.md +331 -16
  2. package/dist/admin/PuckEditorView.d.ts +1 -1
  3. package/dist/admin/PuckEditorView.d.ts.map +1 -1
  4. package/dist/ai/collections/AiContext.d.ts +16 -0
  5. package/dist/ai/collections/AiContext.d.ts.map +1 -0
  6. package/dist/ai/collections/AiContext.js +87 -0
  7. package/dist/ai/collections/AiContext.js.map +1 -0
  8. package/dist/ai/collections/AiPrompts.d.ts +10 -0
  9. package/dist/ai/collections/AiPrompts.d.ts.map +1 -0
  10. package/dist/ai/collections/AiPrompts.js +63 -0
  11. package/dist/ai/collections/AiPrompts.js.map +1 -0
  12. package/dist/ai/createAiApiRoutes.d.ts +40 -0
  13. package/dist/ai/createAiApiRoutes.d.ts.map +1 -0
  14. package/dist/ai/createAiApiRoutes.js +106 -0
  15. package/dist/ai/createAiApiRoutes.js.map +1 -0
  16. package/dist/ai/createAiGenerate.d.ts +65 -0
  17. package/dist/ai/createAiGenerate.d.ts.map +1 -0
  18. package/dist/ai/createAiGenerate.js +106 -0
  19. package/dist/ai/createAiGenerate.js.map +1 -0
  20. package/dist/ai/createAiPlugin.d.ts +39 -0
  21. package/dist/ai/createAiPlugin.d.ts.map +1 -0
  22. package/dist/ai/createAiPlugin.js +61 -0
  23. package/dist/ai/createAiPlugin.js.map +1 -0
  24. package/dist/ai/hooks/useAiContext.d.ts +63 -0
  25. package/dist/ai/hooks/useAiContext.d.ts.map +1 -0
  26. package/dist/ai/hooks/useAiContext.js +146 -0
  27. package/dist/ai/hooks/useAiContext.js.map +1 -0
  28. package/dist/ai/hooks/useAiPrompts.d.ts +25 -0
  29. package/dist/ai/hooks/useAiPrompts.d.ts.map +1 -0
  30. package/dist/ai/hooks/useAiPrompts.js +74 -0
  31. package/dist/ai/hooks/useAiPrompts.js.map +1 -0
  32. package/dist/ai/index.d.ts +51 -0
  33. package/dist/ai/index.d.ts.map +1 -0
  34. package/dist/ai/index.js +69 -0
  35. package/dist/ai/index.js.map +1 -0
  36. package/dist/ai/plugins/ContextEditorPanel.d.ts +9 -0
  37. package/dist/ai/plugins/ContextEditorPanel.d.ts.map +1 -0
  38. package/dist/ai/plugins/ContextEditorPanel.js +399 -0
  39. package/dist/ai/plugins/ContextEditorPanel.js.map +1 -0
  40. package/dist/ai/plugins/PromptEditorPanel.d.ts +9 -0
  41. package/dist/ai/plugins/PromptEditorPanel.d.ts.map +1 -0
  42. package/dist/ai/plugins/PromptEditorPanel.js +270 -0
  43. package/dist/ai/plugins/PromptEditorPanel.js.map +1 -0
  44. package/dist/ai/plugins/contextEditorPlugin.d.ts +30 -0
  45. package/dist/ai/plugins/contextEditorPlugin.d.ts.map +1 -0
  46. package/dist/ai/plugins/contextEditorPlugin.js +40 -0
  47. package/dist/ai/plugins/contextEditorPlugin.js.map +1 -0
  48. package/dist/ai/plugins/promptApiRoutes.d.ts +68 -0
  49. package/dist/ai/plugins/promptApiRoutes.d.ts.map +1 -0
  50. package/dist/ai/plugins/promptApiRoutes.js +181 -0
  51. package/dist/ai/plugins/promptApiRoutes.js.map +1 -0
  52. package/dist/ai/plugins/promptEditorPlugin.d.ts +29 -0
  53. package/dist/ai/plugins/promptEditorPlugin.d.ts.map +1 -0
  54. package/dist/ai/plugins/promptEditorPlugin.js +39 -0
  55. package/dist/ai/plugins/promptEditorPlugin.js.map +1 -0
  56. package/dist/ai/presets/componentAiDefaults.d.ts +40 -0
  57. package/dist/ai/presets/componentAiDefaults.d.ts.map +1 -0
  58. package/dist/ai/presets/componentAiDefaults.js +239 -0
  59. package/dist/ai/presets/componentAiDefaults.js.map +1 -0
  60. package/dist/ai/presets/index.d.ts +94 -0
  61. package/dist/ai/presets/index.d.ts.map +1 -0
  62. package/dist/ai/presets/index.js +110 -0
  63. package/dist/ai/presets/index.js.map +1 -0
  64. package/dist/ai/presets/instructions/interactive.d.ts +15 -0
  65. package/dist/ai/presets/instructions/interactive.d.ts.map +1 -0
  66. package/dist/ai/presets/instructions/interactive.js +334 -0
  67. package/dist/ai/presets/instructions/interactive.js.map +1 -0
  68. package/dist/ai/presets/instructions/layout.d.ts +16 -0
  69. package/dist/ai/presets/instructions/layout.d.ts.map +1 -0
  70. package/dist/ai/presets/instructions/layout.js +486 -0
  71. package/dist/ai/presets/instructions/layout.js.map +1 -0
  72. package/dist/ai/presets/instructions/media.d.ts +15 -0
  73. package/dist/ai/presets/instructions/media.d.ts.map +1 -0
  74. package/dist/ai/presets/instructions/media.js +136 -0
  75. package/dist/ai/presets/instructions/media.js.map +1 -0
  76. package/dist/ai/presets/instructions/pagePatterns.d.ts +20 -0
  77. package/dist/ai/presets/instructions/pagePatterns.d.ts.map +1 -0
  78. package/dist/ai/presets/instructions/pagePatterns.js +290 -0
  79. package/dist/ai/presets/instructions/pagePatterns.js.map +1 -0
  80. package/dist/ai/presets/instructions/schemas.d.ts +1247 -0
  81. package/dist/ai/presets/instructions/schemas.d.ts.map +1 -0
  82. package/dist/ai/presets/instructions/schemas.js +240 -0
  83. package/dist/ai/presets/instructions/schemas.js.map +1 -0
  84. package/dist/ai/presets/instructions/typography.d.ts +16 -0
  85. package/dist/ai/presets/instructions/typography.d.ts.map +1 -0
  86. package/dist/ai/presets/instructions/typography.js +192 -0
  87. package/dist/ai/presets/instructions/typography.js.map +1 -0
  88. package/dist/ai/tools/index.d.ts +116 -0
  89. package/dist/ai/tools/index.d.ts.map +1 -0
  90. package/dist/ai/tools/index.js +214 -0
  91. package/dist/ai/tools/index.js.map +1 -0
  92. package/dist/ai/types.d.ts +507 -0
  93. package/dist/ai/types.d.ts.map +1 -0
  94. package/dist/ai/types.js +2 -0
  95. package/dist/ai/types.js.map +1 -0
  96. package/dist/ai/utils/injectAiConfig.d.ts +67 -0
  97. package/dist/ai/utils/injectAiConfig.d.ts.map +1 -0
  98. package/dist/ai/utils/injectAiConfig.js +216 -0
  99. package/dist/ai/utils/injectAiConfig.js.map +1 -0
  100. package/dist/api/createPuckApiRoutesWithId.d.ts.map +1 -1
  101. package/dist/api/createPuckApiRoutesWithId.js +12 -5
  102. package/dist/api/createPuckApiRoutesWithId.js.map +1 -1
  103. package/dist/api/types.d.ts +1 -1
  104. package/dist/api/types.d.ts.map +1 -1
  105. package/dist/components/exports.d.ts +1 -1
  106. package/dist/components/exports.d.ts.map +1 -1
  107. package/dist/components/exports.js +1 -1
  108. package/dist/components/exports.js.map +1 -1
  109. package/dist/components/interactive/Accordion.d.ts +1 -1
  110. package/dist/components/interactive/Accordion.d.ts.map +1 -1
  111. package/dist/components/interactive/Accordion.js +4 -4
  112. package/dist/components/interactive/Accordion.js.map +1 -1
  113. package/dist/components/interactive/Accordion.server.d.ts +1 -1
  114. package/dist/components/interactive/Accordion.server.d.ts.map +1 -1
  115. package/dist/components/interactive/Button.d.ts +1 -1
  116. package/dist/components/interactive/Button.d.ts.map +1 -1
  117. package/dist/components/interactive/Button.server.d.ts +2 -3
  118. package/dist/components/interactive/Button.server.d.ts.map +1 -1
  119. package/dist/components/interactive/Button.server.js +1 -2
  120. package/dist/components/interactive/Button.server.js.map +1 -1
  121. package/dist/components/interactive/Card.d.ts +1 -1
  122. package/dist/components/interactive/Card.d.ts.map +1 -1
  123. package/dist/components/interactive/Card.server.d.ts +1 -1
  124. package/dist/components/interactive/Card.server.d.ts.map +1 -1
  125. package/dist/components/interactive/Divider.d.ts +1 -1
  126. package/dist/components/interactive/Divider.d.ts.map +1 -1
  127. package/dist/components/interactive/Divider.server.d.ts +1 -1
  128. package/dist/components/interactive/Divider.server.d.ts.map +1 -1
  129. package/dist/components/layout/Container.d.ts +3 -1
  130. package/dist/components/layout/Container.d.ts.map +1 -1
  131. package/dist/components/layout/Container.js +16 -2
  132. package/dist/components/layout/Container.js.map +1 -1
  133. package/dist/components/layout/Container.server.d.ts +3 -1
  134. package/dist/components/layout/Container.server.d.ts.map +1 -1
  135. package/dist/components/layout/Container.server.js +5 -2
  136. package/dist/components/layout/Container.server.js.map +1 -1
  137. package/dist/components/layout/Flex.d.ts +3 -1
  138. package/dist/components/layout/Flex.d.ts.map +1 -1
  139. package/dist/components/layout/Flex.js +18 -2
  140. package/dist/components/layout/Flex.js.map +1 -1
  141. package/dist/components/layout/Flex.server.d.ts +3 -1
  142. package/dist/components/layout/Flex.server.d.ts.map +1 -1
  143. package/dist/components/layout/Flex.server.js +5 -2
  144. package/dist/components/layout/Flex.server.js.map +1 -1
  145. package/dist/components/layout/Grid.d.ts +3 -1
  146. package/dist/components/layout/Grid.d.ts.map +1 -1
  147. package/dist/components/layout/Grid.js +15 -2
  148. package/dist/components/layout/Grid.js.map +1 -1
  149. package/dist/components/layout/Grid.server.d.ts +3 -1
  150. package/dist/components/layout/Grid.server.d.ts.map +1 -1
  151. package/dist/components/layout/Grid.server.js +5 -2
  152. package/dist/components/layout/Grid.server.js.map +1 -1
  153. package/dist/components/layout/Section.d.ts +3 -1
  154. package/dist/components/layout/Section.d.ts.map +1 -1
  155. package/dist/components/layout/Section.js +32 -5
  156. package/dist/components/layout/Section.js.map +1 -1
  157. package/dist/components/layout/Section.server.d.ts +3 -1
  158. package/dist/components/layout/Section.server.d.ts.map +1 -1
  159. package/dist/components/layout/Section.server.js +16 -4
  160. package/dist/components/layout/Section.server.js.map +1 -1
  161. package/dist/components/layout/Spacer.d.ts +1 -1
  162. package/dist/components/layout/Spacer.d.ts.map +1 -1
  163. package/dist/components/layout/Spacer.server.d.ts +1 -1
  164. package/dist/components/layout/Spacer.server.d.ts.map +1 -1
  165. package/dist/components/layout/Template.d.ts +1 -1
  166. package/dist/components/layout/Template.d.ts.map +1 -1
  167. package/dist/components/layout/Template.server.d.ts +1 -1
  168. package/dist/components/layout/Template.server.d.ts.map +1 -1
  169. package/dist/components/media/Image.d.ts +1 -1
  170. package/dist/components/media/Image.d.ts.map +1 -1
  171. package/dist/components/media/Image.server.d.ts +1 -1
  172. package/dist/components/media/Image.server.d.ts.map +1 -1
  173. package/dist/components/typography/Heading.d.ts +1 -1
  174. package/dist/components/typography/Heading.d.ts.map +1 -1
  175. package/dist/components/typography/Heading.server.d.ts +1 -1
  176. package/dist/components/typography/Heading.server.d.ts.map +1 -1
  177. package/dist/components/typography/RichText.editor.d.ts +15 -2
  178. package/dist/components/typography/RichText.editor.d.ts.map +1 -1
  179. package/dist/components/typography/RichText.editor.js +18 -11
  180. package/dist/components/typography/RichText.editor.js.map +1 -1
  181. package/dist/components/typography/RichText.server.d.ts +3 -2
  182. package/dist/components/typography/RichText.server.d.ts.map +1 -1
  183. package/dist/components/typography/RichText.server.js +10 -5
  184. package/dist/components/typography/RichText.server.js.map +1 -1
  185. package/dist/components/typography/Text.d.ts +1 -1
  186. package/dist/components/typography/Text.d.ts.map +1 -1
  187. package/dist/components/typography/Text.server.d.ts +1 -1
  188. package/dist/components/typography/Text.server.d.ts.map +1 -1
  189. package/dist/components/typography/index.d.ts +1 -1
  190. package/dist/components/typography/index.d.ts.map +1 -1
  191. package/dist/components/typography/index.js +1 -1
  192. package/dist/components/typography/index.js.map +1 -1
  193. package/dist/config/config.editor.d.ts +4 -4
  194. package/dist/config/config.editor.d.ts.map +1 -1
  195. package/dist/config/index.d.ts +1 -1
  196. package/dist/config/index.d.ts.map +1 -1
  197. package/dist/config/merge.d.ts +1 -1
  198. package/dist/config/merge.d.ts.map +1 -1
  199. package/dist/config/presets.d.ts +15 -15
  200. package/dist/config/presets.d.ts.map +1 -1
  201. package/dist/editor/PuckEditor.d.ts +88 -2
  202. package/dist/editor/PuckEditor.d.ts.map +1 -1
  203. package/dist/editor/PuckEditor.js +41 -13
  204. package/dist/editor/PuckEditor.js.map +1 -1
  205. package/dist/editor/PuckEditorImpl.client.d.ts +49 -4
  206. package/dist/editor/PuckEditorImpl.client.d.ts.map +1 -1
  207. package/dist/editor/PuckEditorImpl.client.js +191 -14
  208. package/dist/editor/PuckEditorImpl.client.js.map +1 -1
  209. package/dist/editor/ai-plugin-overrides.css +20 -0
  210. package/dist/editor/components/HeaderActions.d.ts +7 -2
  211. package/dist/editor/components/HeaderActions.d.ts.map +1 -1
  212. package/dist/editor/components/HeaderActions.js +16 -3
  213. package/dist/editor/components/HeaderActions.js.map +1 -1
  214. package/dist/editor/components/IframeWrapper.d.ts +13 -0
  215. package/dist/editor/components/IframeWrapper.d.ts.map +1 -1
  216. package/dist/editor/components/IframeWrapper.js +60 -4
  217. package/dist/editor/components/IframeWrapper.js.map +1 -1
  218. package/dist/editor/components/PreviewModal.d.ts +9 -1
  219. package/dist/editor/components/PreviewModal.d.ts.map +1 -1
  220. package/dist/editor/components/PreviewModal.js +36 -1
  221. package/dist/editor/components/PreviewModal.js.map +1 -1
  222. package/dist/editor/index.d.ts +4 -0
  223. package/dist/editor/index.d.ts.map +1 -1
  224. package/dist/editor/index.js +4 -0
  225. package/dist/editor/index.js.map +1 -1
  226. package/dist/editor/plugins/VersionHistoryPanel.d.ts +43 -0
  227. package/dist/editor/plugins/VersionHistoryPanel.d.ts.map +1 -0
  228. package/dist/editor/plugins/VersionHistoryPanel.js +303 -0
  229. package/dist/editor/plugins/VersionHistoryPanel.js.map +1 -0
  230. package/dist/editor/plugins/index.d.ts +6 -3
  231. package/dist/editor/plugins/index.d.ts.map +1 -1
  232. package/dist/editor/plugins/index.js +7 -3
  233. package/dist/editor/plugins/index.js.map +1 -1
  234. package/dist/editor/plugins/versionHistoryPlugin.d.ts +37 -0
  235. package/dist/editor/plugins/versionHistoryPlugin.d.ts.map +1 -0
  236. package/dist/editor/plugins/versionHistoryPlugin.js +36 -0
  237. package/dist/editor/plugins/versionHistoryPlugin.js.map +1 -0
  238. package/dist/editor/utils/detectPageTree.d.ts +1 -1
  239. package/dist/editor/utils/detectPageTree.d.ts.map +1 -1
  240. package/dist/editor/utils/injectPageTreeFields.d.ts +1 -1
  241. package/dist/editor/utils/injectPageTreeFields.d.ts.map +1 -1
  242. package/dist/endpoints/ai.d.ts +36 -0
  243. package/dist/endpoints/ai.d.ts.map +1 -0
  244. package/dist/endpoints/ai.js +315 -0
  245. package/dist/endpoints/ai.js.map +1 -0
  246. package/dist/endpoints/context.d.ts +30 -0
  247. package/dist/endpoints/context.d.ts.map +1 -0
  248. package/dist/endpoints/context.js +123 -0
  249. package/dist/endpoints/context.js.map +1 -0
  250. package/dist/endpoints/prompts.d.ts +28 -0
  251. package/dist/endpoints/prompts.d.ts.map +1 -0
  252. package/dist/endpoints/prompts.js +118 -0
  253. package/dist/endpoints/prompts.js.map +1 -0
  254. package/dist/endpoints/styles.d.ts +19 -0
  255. package/dist/endpoints/styles.d.ts.map +1 -0
  256. package/dist/endpoints/styles.js +116 -0
  257. package/dist/endpoints/styles.js.map +1 -0
  258. package/dist/fields/AlignmentField.d.ts +1 -1
  259. package/dist/fields/AlignmentField.d.ts.map +1 -1
  260. package/dist/fields/AlignmentField.js +1 -0
  261. package/dist/fields/AlignmentField.js.map +1 -1
  262. package/dist/fields/AnimationField.d.ts +1 -1
  263. package/dist/fields/AnimationField.d.ts.map +1 -1
  264. package/dist/fields/BackgroundField.d.ts +1 -1
  265. package/dist/fields/BackgroundField.d.ts.map +1 -1
  266. package/dist/fields/BackgroundField.js +9 -4
  267. package/dist/fields/BackgroundField.js.map +1 -1
  268. package/dist/fields/BorderField.d.ts +1 -1
  269. package/dist/fields/BorderField.d.ts.map +1 -1
  270. package/dist/fields/BorderField.js +1 -0
  271. package/dist/fields/BorderField.js.map +1 -1
  272. package/dist/fields/ColorPickerField.d.ts +1 -1
  273. package/dist/fields/ColorPickerField.d.ts.map +1 -1
  274. package/dist/fields/ColorPickerField.js +4 -2
  275. package/dist/fields/ColorPickerField.js.map +1 -1
  276. package/dist/fields/ContentAlignmentField.d.ts +66 -0
  277. package/dist/fields/ContentAlignmentField.d.ts.map +1 -0
  278. package/dist/fields/ContentAlignmentField.js +255 -0
  279. package/dist/fields/ContentAlignmentField.js.map +1 -0
  280. package/dist/fields/DimensionsField.d.ts +1 -1
  281. package/dist/fields/DimensionsField.d.ts.map +1 -1
  282. package/dist/fields/DimensionsField.js +8 -2
  283. package/dist/fields/DimensionsField.js.map +1 -1
  284. package/dist/fields/FlexAlignmentField.d.ts +1 -1
  285. package/dist/fields/FlexAlignmentField.d.ts.map +1 -1
  286. package/dist/fields/FolderPickerField.d.ts +1 -1
  287. package/dist/fields/FolderPickerField.d.ts.map +1 -1
  288. package/dist/fields/GradientEditor.d.ts.map +1 -1
  289. package/dist/fields/GradientEditor.js +3 -0
  290. package/dist/fields/GradientEditor.js.map +1 -1
  291. package/dist/fields/LockedField.d.ts +1 -1
  292. package/dist/fields/LockedField.d.ts.map +1 -1
  293. package/dist/fields/MarginField.d.ts +1 -1
  294. package/dist/fields/MarginField.d.ts.map +1 -1
  295. package/dist/fields/MediaField.d.ts +1 -1
  296. package/dist/fields/MediaField.d.ts.map +1 -1
  297. package/dist/fields/MediaField.js +3 -2
  298. package/dist/fields/MediaField.js.map +1 -1
  299. package/dist/fields/PaddingField.d.ts +1 -1
  300. package/dist/fields/PaddingField.d.ts.map +1 -1
  301. package/dist/fields/PageSegmentField.d.ts +1 -1
  302. package/dist/fields/PageSegmentField.d.ts.map +1 -1
  303. package/dist/fields/ResetField.d.ts +1 -1
  304. package/dist/fields/ResetField.d.ts.map +1 -1
  305. package/dist/fields/ResetField.js +1 -1
  306. package/dist/fields/ResetField.js.map +1 -1
  307. package/dist/fields/ResponsiveField.d.ts +1 -1
  308. package/dist/fields/ResponsiveField.d.ts.map +1 -1
  309. package/dist/fields/ResponsiveField.js +5 -2
  310. package/dist/fields/ResponsiveField.js.map +1 -1
  311. package/dist/fields/ResponsiveVisibilityField.d.ts +1 -1
  312. package/dist/fields/ResponsiveVisibilityField.d.ts.map +1 -1
  313. package/dist/fields/ResponsiveVisibilityField.js +4 -3
  314. package/dist/fields/ResponsiveVisibilityField.js.map +1 -1
  315. package/dist/fields/SizeField.d.ts +3 -25
  316. package/dist/fields/SizeField.d.ts.map +1 -1
  317. package/dist/fields/SizeField.js +8 -34
  318. package/dist/fields/SizeField.js.map +1 -1
  319. package/dist/fields/SlugPreviewField.d.ts +1 -1
  320. package/dist/fields/SlugPreviewField.d.ts.map +1 -1
  321. package/dist/fields/TemplateField.d.ts +1 -1
  322. package/dist/fields/TemplateField.d.ts.map +1 -1
  323. package/dist/fields/TemplateField.js +1 -1
  324. package/dist/fields/TemplateField.js.map +1 -1
  325. package/dist/fields/TransformField.d.ts +1 -1
  326. package/dist/fields/TransformField.d.ts.map +1 -1
  327. package/dist/fields/TransformField.js +2 -0
  328. package/dist/fields/TransformField.js.map +1 -1
  329. package/dist/fields/VerticalAlignmentField.d.ts +1 -1
  330. package/dist/fields/VerticalAlignmentField.d.ts.map +1 -1
  331. package/dist/fields/WidthField.d.ts +1 -1
  332. package/dist/fields/WidthField.d.ts.map +1 -1
  333. package/dist/fields/index.d.ts +8 -36
  334. package/dist/fields/index.d.ts.map +1 -1
  335. package/dist/fields/index.js +20 -78
  336. package/dist/fields/index.js.map +1 -1
  337. package/dist/fields/richtext/controls/ColorPickerControl.d.ts +16 -0
  338. package/dist/fields/richtext/controls/ColorPickerControl.d.ts.map +1 -0
  339. package/dist/fields/richtext/controls/ColorPickerControl.js +116 -0
  340. package/dist/fields/richtext/controls/ColorPickerControl.js.map +1 -0
  341. package/dist/fields/richtext/controls/DropdownPortal.d.ts +17 -0
  342. package/dist/fields/richtext/controls/DropdownPortal.d.ts.map +1 -0
  343. package/dist/fields/richtext/controls/DropdownPortal.js +90 -0
  344. package/dist/fields/richtext/controls/DropdownPortal.js.map +1 -0
  345. package/dist/fields/richtext/controls/FontSizeControl.d.ts +8 -0
  346. package/dist/fields/richtext/controls/FontSizeControl.d.ts.map +1 -0
  347. package/dist/fields/richtext/controls/FontSizeControl.js +62 -0
  348. package/dist/fields/richtext/controls/FontSizeControl.js.map +1 -0
  349. package/dist/fields/richtext/controls/HighlightControl.d.ts +9 -0
  350. package/dist/fields/richtext/controls/HighlightControl.d.ts.map +1 -0
  351. package/dist/fields/richtext/controls/HighlightControl.js +44 -0
  352. package/dist/fields/richtext/controls/HighlightControl.js.map +1 -0
  353. package/dist/fields/richtext/controls/index.d.ts +11 -0
  354. package/dist/fields/richtext/controls/index.d.ts.map +1 -0
  355. package/dist/fields/richtext/controls/index.js +16 -0
  356. package/dist/fields/richtext/controls/index.js.map +1 -0
  357. package/dist/fields/richtext/controls/shared.d.ts +97 -0
  358. package/dist/fields/richtext/controls/shared.d.ts.map +1 -0
  359. package/dist/fields/richtext/controls/shared.js +344 -0
  360. package/dist/fields/richtext/controls/shared.js.map +1 -0
  361. package/dist/fields/richtext/createRichTextField.d.ts +165 -0
  362. package/dist/fields/richtext/createRichTextField.d.ts.map +1 -0
  363. package/dist/fields/richtext/createRichTextField.js +139 -0
  364. package/dist/fields/richtext/createRichTextField.js.map +1 -0
  365. package/dist/fields/richtext/extensions/FontSize.d.ts +23 -0
  366. package/dist/fields/richtext/extensions/FontSize.d.ts.map +1 -0
  367. package/dist/fields/richtext/extensions/FontSize.js +47 -0
  368. package/dist/fields/richtext/extensions/FontSize.js.map +1 -0
  369. package/dist/fields/richtext/extensions/index.d.ts +5 -0
  370. package/dist/fields/richtext/extensions/index.d.ts.map +1 -0
  371. package/dist/fields/richtext/extensions/index.js +5 -0
  372. package/dist/fields/richtext/extensions/index.js.map +1 -0
  373. package/dist/fields/richtext/index.d.ts +14 -0
  374. package/dist/fields/richtext/index.d.ts.map +1 -0
  375. package/dist/fields/richtext/index.js +19 -0
  376. package/dist/fields/richtext/index.js.map +1 -0
  377. package/dist/fields/richtext/richtext-menu.css +50 -0
  378. package/dist/fields/shared.d.ts +27 -1
  379. package/dist/fields/shared.d.ts.map +1 -1
  380. package/dist/fields/shared.js +34 -0
  381. package/dist/fields/shared.js.map +1 -1
  382. package/dist/layouts/types.d.ts +30 -0
  383. package/dist/layouts/types.d.ts.map +1 -1
  384. package/dist/plugin/index.d.ts +1 -0
  385. package/dist/plugin/index.d.ts.map +1 -1
  386. package/dist/plugin/index.js +111 -1
  387. package/dist/plugin/index.js.map +1 -1
  388. package/dist/render/HybridPageRenderer.d.ts +1 -1
  389. package/dist/render/HybridPageRenderer.d.ts.map +1 -1
  390. package/dist/render/PageRenderer.d.ts +1 -1
  391. package/dist/render/PageRenderer.d.ts.map +1 -1
  392. package/dist/render/PageRenderer.js +1 -1
  393. package/dist/render/PageRenderer.js.map +1 -1
  394. package/dist/render/PuckEditor.client.d.ts +2 -2
  395. package/dist/render/PuckEditor.client.d.ts.map +1 -1
  396. package/dist/render/PuckEditor.client.js +2 -2
  397. package/dist/render/PuckEditor.client.js.map +1 -1
  398. package/dist/types/index.d.ts +36 -11
  399. package/dist/types/index.d.ts.map +1 -1
  400. package/dist/version.d.ts +1 -1
  401. package/dist/version.js +1 -1
  402. package/dist/views/PuckConfigContext.d.ts +56 -2
  403. package/dist/views/PuckConfigContext.d.ts.map +1 -1
  404. package/dist/views/PuckConfigContext.js +6 -3
  405. package/dist/views/PuckConfigContext.js.map +1 -1
  406. package/dist/views/PuckEditorView.d.ts.map +1 -1
  407. package/dist/views/PuckEditorView.js +23 -1
  408. package/dist/views/PuckEditorView.js.map +1 -1
  409. package/package.json +34 -10
  410. package/dist/components/typography/RichText.d.ts +0 -20
  411. package/dist/components/typography/RichText.d.ts.map +0 -1
  412. package/dist/components/typography/RichText.js +0 -73
  413. package/dist/components/typography/RichText.js.map +0 -1
  414. package/dist/fields/TiptapField.d.ts +0 -40
  415. package/dist/fields/TiptapField.d.ts.map +0 -1
  416. package/dist/fields/TiptapField.js +0 -857
  417. package/dist/fields/TiptapField.js.map +0 -1
  418. package/dist/fields/TiptapModal.d.ts +0 -10
  419. package/dist/fields/TiptapModal.d.ts.map +0 -1
  420. package/dist/fields/TiptapModal.js +0 -114
  421. package/dist/fields/TiptapModal.js.map +0 -1
  422. package/dist/fields/TiptapModalField.d.ts +0 -23
  423. package/dist/fields/TiptapModalField.d.ts.map +0 -1
  424. package/dist/fields/TiptapModalField.js +0 -55
  425. package/dist/fields/TiptapModalField.js.map +0 -1
  426. package/dist/fields/richtext-output.css +0 -219
  427. package/dist/fields/tiptap-styles.css +0 -248
@@ -1,857 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- /**
4
- * TiptapField - Rich Text Editor Field for Puck
5
- *
6
- * A custom Puck field that provides WYSIWYG rich text editing using Tiptap.
7
- * Outputs HTML content that can be rendered with dangerouslySetInnerHTML.
8
- *
9
- * Features:
10
- * - Theme-aware "inherit" color option for text that adapts to dark/light mode
11
- * - Expanded color palette organized by category
12
- * - Strikethrough and highlight text styling
13
- * - Font size options (small, normal, large, extra large)
14
- * - Full toolbar with all formatting options
15
- * - HTML source view/edit mode
16
- */
17
- import { useCallback, memo, useState, useRef, useEffect } from 'react';
18
- import { useEditor, EditorContent, useEditorState } from '@tiptap/react';
19
- import StarterKit from '@tiptap/starter-kit';
20
- import TextAlign from '@tiptap/extension-text-align';
21
- import { TextStyle } from '@tiptap/extension-text-style';
22
- import { Color } from '@tiptap/extension-color';
23
- import Highlight from '@tiptap/extension-highlight';
24
- import Superscript from '@tiptap/extension-superscript';
25
- import Subscript from '@tiptap/extension-subscript';
26
- import { Extension } from '@tiptap/core';
27
- import { Bold, Italic, Underline, Strikethrough, Highlighter, Link, List, ListOrdered, AlignLeft, AlignCenter, AlignRight, AlignJustify, Heading1, Heading2, Heading3, Heading4, Heading5, Heading6, Quote, Code, RemoveFormatting, Palette, ALargeSmall, ChevronDown, Superscript as SuperscriptIcon, Subscript as SubscriptIcon, Minus, CornerDownLeft, Pilcrow, } from 'lucide-react';
28
- import { useTheme } from '../theme';
29
- import './tiptap-styles.css';
30
- import './richtext-output.css';
31
- // =============================================================================
32
- // Injected Editor Styles
33
- // =============================================================================
34
- const TIPTAP_EDITOR_STYLES = `
35
- .tiptap-editor h1 { font-size: 2em !important; font-weight: 700 !important; margin: 1em 0 0.5em 0; }
36
- .tiptap-editor h2 { font-size: 1.5em !important; font-weight: 700 !important; margin: 1em 0 0.5em 0; }
37
- .tiptap-editor h3 { font-size: 1.25em !important; font-weight: 600 !important; margin: 1em 0 0.5em 0; }
38
- .tiptap-editor h4 { font-size: 1.1em !important; font-weight: 600 !important; margin: 1em 0 0.5em 0; }
39
- .tiptap-editor h5 { font-size: 1em !important; font-weight: 600 !important; margin: 1em 0 0.5em 0; }
40
- .tiptap-editor h6 { font-size: 0.9em !important; font-weight: 600 !important; margin: 1em 0 0.5em 0; }
41
- .tiptap-editor h1:first-child, .tiptap-editor h2:first-child, .tiptap-editor h3:first-child,
42
- .tiptap-editor h4:first-child, .tiptap-editor h5:first-child, .tiptap-editor h6:first-child { margin-top: 0; }
43
- .tiptap-editor ul, .tiptap-editor ol { padding-left: 1.5em !important; margin: 0 0 1em 0; }
44
- .tiptap-editor ul { list-style-type: disc !important; }
45
- .tiptap-editor ol { list-style-type: decimal !important; }
46
- .tiptap-editor li { margin: 0.25em 0; }
47
- .tiptap-editor li p { margin: 0; }
48
- .tiptap-editor blockquote { border-left: 4px solid var(--theme-elevation-200) !important; padding-left: 1em !important; margin: 1em 0 !important; font-style: italic !important; }
49
- .tiptap-editor p { margin: 0 0 1em 0; }
50
- .tiptap-editor p:last-child { margin-bottom: 0; }
51
- @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
52
- `;
53
- // Inject styles once when module loads
54
- if (typeof document !== 'undefined') {
55
- const styleId = 'tiptap-editor-injected-styles';
56
- if (!document.getElementById(styleId)) {
57
- const style = document.createElement('style');
58
- style.id = styleId;
59
- style.textContent = TIPTAP_EDITOR_STYLES;
60
- document.head.appendChild(style);
61
- }
62
- }
63
- // =============================================================================
64
- // Styles
65
- // =============================================================================
66
- const styles = {
67
- icon: {
68
- width: '18px',
69
- height: '18px',
70
- },
71
- iconSmall: {
72
- width: '12px',
73
- height: '12px',
74
- },
75
- toolbarButton: {
76
- height: '28px',
77
- width: '28px',
78
- padding: 0,
79
- flexShrink: 0,
80
- display: 'inline-flex',
81
- alignItems: 'center',
82
- justifyContent: 'center',
83
- borderRadius: '4px',
84
- transition: 'background-color 0.15s',
85
- border: 'none',
86
- cursor: 'pointer',
87
- backgroundColor: 'transparent',
88
- },
89
- toolbarButtonActive: {
90
- backgroundColor: 'var(--theme-elevation-200)',
91
- },
92
- toolbarDivider: {
93
- width: '1px',
94
- height: '24px',
95
- backgroundColor: 'var(--theme-elevation-300)',
96
- margin: '0 4px',
97
- flexShrink: 0,
98
- },
99
- dropdown: {
100
- position: 'absolute',
101
- top: '100%',
102
- left: 0,
103
- marginTop: '4px',
104
- backgroundColor: 'var(--theme-bg)',
105
- border: '1px solid var(--theme-elevation-200)',
106
- borderRadius: '6px',
107
- boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',
108
- zIndex: 50,
109
- minWidth: '160px',
110
- },
111
- dropdownItem: {
112
- width: '100%',
113
- padding: '8px 12px',
114
- textAlign: 'left',
115
- fontSize: '14px',
116
- transition: 'background-color 0.15s',
117
- display: 'flex',
118
- alignItems: 'center',
119
- border: 'none',
120
- backgroundColor: 'transparent',
121
- cursor: 'pointer',
122
- },
123
- dropdownLabel: {
124
- padding: '4px 12px',
125
- fontSize: '12px',
126
- color: 'var(--theme-elevation-500)',
127
- fontWeight: 500,
128
- },
129
- dropdownSeparator: {
130
- height: '1px',
131
- backgroundColor: 'var(--theme-elevation-200)',
132
- margin: '4px 0',
133
- },
134
- linkPopover: {
135
- position: 'absolute',
136
- top: '100%',
137
- left: 0,
138
- marginTop: '4px',
139
- backgroundColor: 'var(--theme-bg)',
140
- border: '1px solid var(--theme-elevation-200)',
141
- borderRadius: '6px',
142
- boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1)',
143
- zIndex: 50,
144
- padding: '12px',
145
- width: '320px',
146
- },
147
- input: {
148
- width: '100%',
149
- padding: '8px 12px',
150
- border: '1px solid var(--theme-elevation-300)',
151
- borderRadius: '6px',
152
- fontSize: '14px',
153
- outline: 'none',
154
- },
155
- buttonPrimary: {
156
- padding: '6px 12px',
157
- backgroundColor: 'var(--theme-elevation-900)',
158
- color: 'var(--theme-bg)',
159
- fontSize: '14px',
160
- borderRadius: '6px',
161
- border: 'none',
162
- cursor: 'pointer',
163
- },
164
- buttonSecondary: {
165
- padding: '6px 12px',
166
- color: 'var(--theme-elevation-600)',
167
- fontSize: '14px',
168
- borderRadius: '6px',
169
- border: 'none',
170
- backgroundColor: 'transparent',
171
- cursor: 'pointer',
172
- },
173
- fieldContainer: {
174
- // puck-field class
175
- },
176
- label: {
177
- display: 'block',
178
- fontSize: '14px',
179
- fontWeight: 500,
180
- color: 'var(--theme-elevation-700)',
181
- marginBottom: '8px',
182
- },
183
- editorWrapper: {
184
- border: '1px solid var(--theme-elevation-200)',
185
- borderRadius: '8px',
186
- backgroundColor: 'var(--theme-bg)',
187
- overflow: 'hidden',
188
- },
189
- toolbar: {
190
- borderBottom: '1px solid var(--theme-elevation-200)',
191
- backgroundColor: 'var(--theme-elevation-50)',
192
- display: 'flex',
193
- alignItems: 'center',
194
- flexWrap: 'wrap',
195
- gap: '4px',
196
- padding: '8px',
197
- },
198
- editorContent: {
199
- minHeight: '200px',
200
- backgroundColor: 'var(--theme-bg)',
201
- },
202
- sourceTextarea: {
203
- width: '100%',
204
- minHeight: '200px',
205
- padding: '16px',
206
- fontFamily: 'monospace',
207
- fontSize: '14px',
208
- border: 'none',
209
- resize: 'vertical',
210
- outline: 'none',
211
- },
212
- fontSizeGrid: {
213
- display: 'grid',
214
- gridTemplateColumns: 'repeat(3, 1fr)',
215
- gap: '4px',
216
- padding: '0 8px 8px',
217
- },
218
- fontSizeButton: {
219
- padding: '6px 8px',
220
- fontSize: '12px',
221
- borderRadius: '4px',
222
- border: '1px solid var(--theme-elevation-200)',
223
- backgroundColor: 'transparent',
224
- cursor: 'pointer',
225
- textAlign: 'center',
226
- transition: 'background-color 0.15s',
227
- },
228
- customSizeInput: {
229
- width: '64px',
230
- padding: '4px 8px',
231
- fontSize: '14px',
232
- border: '1px solid var(--theme-elevation-200)',
233
- borderRadius: '4px',
234
- outline: 'none',
235
- },
236
- customSizeSelect: {
237
- padding: '4px',
238
- fontSize: '14px',
239
- border: '1px solid var(--theme-elevation-200)',
240
- borderRadius: '4px',
241
- outline: 'none',
242
- },
243
- customSizeApply: {
244
- padding: '4px 8px',
245
- fontSize: '12px',
246
- backgroundColor: 'var(--theme-elevation-900)',
247
- color: 'var(--theme-bg)',
248
- borderRadius: '4px',
249
- border: 'none',
250
- cursor: 'pointer',
251
- },
252
- sourceButton: {
253
- display: 'inline-flex',
254
- alignItems: 'center',
255
- borderRadius: '4px',
256
- transition: 'background-color 0.15s',
257
- fontSize: '12px',
258
- height: '28px',
259
- padding: '0 8px',
260
- gap: '4px',
261
- flexShrink: 0,
262
- border: 'none',
263
- cursor: 'pointer',
264
- backgroundColor: 'transparent',
265
- },
266
- loadingState: {
267
- minHeight: '200px',
268
- padding: '16px',
269
- color: 'var(--theme-elevation-400)',
270
- },
271
- // Color picker styles
272
- colorPickerContainer: {
273
- padding: '12px',
274
- display: 'flex',
275
- flexDirection: 'column',
276
- gap: '12px',
277
- minWidth: '240px',
278
- },
279
- colorPickerRow: {
280
- display: 'flex',
281
- alignItems: 'center',
282
- gap: '8px',
283
- },
284
- colorPickerInput: {
285
- width: '36px',
286
- height: '36px',
287
- padding: 0,
288
- border: '1px solid var(--theme-elevation-200)',
289
- borderRadius: '6px',
290
- cursor: 'pointer',
291
- flexShrink: 0,
292
- },
293
- colorPickerHexInput: {
294
- flex: 1,
295
- height: '36px',
296
- padding: '0 10px',
297
- fontSize: '13px',
298
- fontFamily: 'monospace',
299
- border: '1px solid var(--theme-elevation-200)',
300
- borderRadius: '6px',
301
- backgroundColor: 'var(--theme-input-bg)',
302
- color: 'var(--theme-elevation-800)',
303
- outline: 'none',
304
- },
305
- colorPickerPreview: {
306
- width: '36px',
307
- height: '36px',
308
- borderRadius: '6px',
309
- border: '1px solid var(--theme-elevation-200)',
310
- flexShrink: 0,
311
- position: 'relative',
312
- overflow: 'hidden',
313
- },
314
- colorPickerCheckerboard: {
315
- position: 'absolute',
316
- inset: 0,
317
- backgroundImage: 'linear-gradient(45deg, #d0d0d0 25%, transparent 25%), linear-gradient(-45deg, #d0d0d0 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #d0d0d0 75%), linear-gradient(-45deg, transparent 75%, #d0d0d0 75%)',
318
- backgroundSize: '8px 8px',
319
- backgroundPosition: '0 0, 0 4px, 4px -4px, -4px 0px',
320
- backgroundColor: '#f0f0f0',
321
- },
322
- colorPickerOverlay: {
323
- position: 'absolute',
324
- inset: 0,
325
- },
326
- colorPickerOpacitySection: {
327
- display: 'flex',
328
- flexDirection: 'column',
329
- gap: '4px',
330
- },
331
- colorPickerOpacityHeader: {
332
- display: 'flex',
333
- alignItems: 'center',
334
- justifyContent: 'space-between',
335
- },
336
- colorPickerOpacityLabel: {
337
- fontSize: '11px',
338
- color: 'var(--theme-elevation-500)',
339
- },
340
- colorPickerOpacityValue: {
341
- fontSize: '11px',
342
- fontFamily: 'monospace',
343
- color: 'var(--theme-elevation-500)',
344
- },
345
- colorPickerOpacitySlider: {
346
- position: 'relative',
347
- height: '10px',
348
- borderRadius: '5px',
349
- overflow: 'hidden',
350
- border: '1px solid var(--theme-elevation-200)',
351
- },
352
- colorPickerOpacityInputRange: {
353
- position: 'absolute',
354
- inset: 0,
355
- width: '100%',
356
- height: '100%',
357
- opacity: 0,
358
- cursor: 'pointer',
359
- margin: 0,
360
- },
361
- colorPickerOpacityThumb: {
362
- position: 'absolute',
363
- top: 0,
364
- bottom: 0,
365
- width: '4px',
366
- backgroundColor: 'white',
367
- border: '1px solid var(--theme-elevation-400)',
368
- borderRadius: '2px',
369
- boxShadow: '0 1px 2px rgba(0,0,0,0.15)',
370
- pointerEvents: 'none',
371
- },
372
- colorPickerPresetsLabel: {
373
- fontSize: '11px',
374
- color: 'var(--theme-elevation-500)',
375
- marginBottom: '4px',
376
- },
377
- colorPickerPresetsGrid: {
378
- display: 'flex',
379
- flexWrap: 'wrap',
380
- gap: '4px',
381
- },
382
- colorPickerPresetButton: {
383
- width: '22px',
384
- height: '22px',
385
- padding: 0,
386
- borderRadius: '4px',
387
- cursor: 'pointer',
388
- border: '1px solid var(--theme-elevation-200)',
389
- outline: 'none',
390
- transition: 'transform 0.1s',
391
- },
392
- colorPickerPresetButtonSelected: {
393
- width: '22px',
394
- height: '22px',
395
- padding: 0,
396
- borderRadius: '4px',
397
- cursor: 'pointer',
398
- border: '2px solid var(--theme-elevation-800)',
399
- outline: '2px solid var(--theme-elevation-200)',
400
- outlineOffset: '1px',
401
- },
402
- colorPickerThemeButton: {
403
- display: 'flex',
404
- alignItems: 'center',
405
- gap: '8px',
406
- width: '100%',
407
- padding: '8px',
408
- border: '1px solid var(--theme-elevation-200)',
409
- borderRadius: '6px',
410
- backgroundColor: 'transparent',
411
- cursor: 'pointer',
412
- fontSize: '13px',
413
- color: 'var(--theme-elevation-700)',
414
- transition: 'background-color 0.15s',
415
- },
416
- colorPickerThemeSwatch: {
417
- width: '20px',
418
- height: '20px',
419
- borderRadius: '4px',
420
- border: '1px solid var(--theme-elevation-300)',
421
- flexShrink: 0,
422
- background: 'linear-gradient(135deg, #fff 50%, #1f2937 50%)',
423
- },
424
- };
425
- const FontSize = Extension.create({
426
- name: 'fontSize',
427
- addOptions() {
428
- return {
429
- types: ['textStyle'],
430
- };
431
- },
432
- addGlobalAttributes() {
433
- return [
434
- {
435
- types: this.options.types,
436
- attributes: {
437
- fontSize: {
438
- default: null,
439
- parseHTML: element => element.style.fontSize?.replace(/['"]+/g, ''),
440
- renderHTML: attributes => {
441
- if (!attributes.fontSize) {
442
- return {};
443
- }
444
- return {
445
- style: `font-size: ${attributes.fontSize}`,
446
- };
447
- },
448
- },
449
- },
450
- },
451
- ];
452
- },
453
- addCommands() {
454
- return {
455
- setFontSize: (fontSize) => ({ chain }) => {
456
- return chain().setMark('textStyle', { fontSize }).run();
457
- },
458
- unsetFontSize: () => ({ chain }) => {
459
- return chain()
460
- .setMark('textStyle', { fontSize: null })
461
- .removeEmptyTextStyle()
462
- .run();
463
- },
464
- };
465
- },
466
- });
467
- // =============================================================================
468
- // Color Utilities
469
- // =============================================================================
470
- /**
471
- * Validates and normalizes a hex color string
472
- */
473
- function normalizeHex(hex) {
474
- let clean = hex.replace(/^#/, '');
475
- if (clean.length === 3) {
476
- clean = clean.split('').map(c => c + c).join('');
477
- }
478
- if (!/^[0-9A-Fa-f]{6}$/.test(clean)) {
479
- return '';
480
- }
481
- return `#${clean.toLowerCase()}`;
482
- }
483
- /**
484
- * Converts hex + opacity to rgba CSS string
485
- */
486
- function hexToRgba(hex, opacity) {
487
- const clean = hex.replace(/^#/, '');
488
- const r = parseInt(clean.substring(0, 2), 16);
489
- const g = parseInt(clean.substring(2, 4), 16);
490
- const b = parseInt(clean.substring(4, 6), 16);
491
- return `rgba(${r}, ${g}, ${b}, ${opacity / 100})`;
492
- }
493
- /**
494
- * Parses a color string (hex or rgba) and returns hex + opacity
495
- */
496
- function parseColor(color) {
497
- if (!color)
498
- return { hex: '#000000', opacity: 100 };
499
- // Handle rgba
500
- const rgbaMatch = color.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)/);
501
- if (rgbaMatch) {
502
- const r = parseInt(rgbaMatch[1], 10);
503
- const g = parseInt(rgbaMatch[2], 10);
504
- const b = parseInt(rgbaMatch[3], 10);
505
- const a = rgbaMatch[4] ? parseFloat(rgbaMatch[4]) : 1;
506
- const hex = `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;
507
- return { hex, opacity: Math.round(a * 100) };
508
- }
509
- // Handle hex
510
- const normalized = normalizeHex(color);
511
- if (normalized) {
512
- return { hex: normalized, opacity: 100 };
513
- }
514
- return { hex: '#000000', opacity: 100 };
515
- }
516
- // =============================================================================
517
- // Font Sizes
518
- // =============================================================================
519
- const FONT_SIZES = [
520
- { label: 'XS', value: '0.75rem', px: '12px' },
521
- { label: 'Small', value: '0.875rem', px: '14px' },
522
- { label: 'Normal', value: null, px: '16px' },
523
- { label: 'Medium', value: '1.125rem', px: '18px' },
524
- { label: 'Large', value: '1.25rem', px: '20px' },
525
- { label: 'XL', value: '1.5rem', px: '24px' },
526
- { label: '2XL', value: '1.875rem', px: '30px' },
527
- { label: '3XL', value: '2.25rem', px: '36px' },
528
- { label: '4XL', value: '3rem', px: '48px' },
529
- ];
530
- const FONT_SIZE_UNITS = ['px', 'rem', 'em'];
531
- // =============================================================================
532
- // UI Components
533
- // =============================================================================
534
- function ToolbarButton({ onClick, isActive, title, children, }) {
535
- const [hovered, setHovered] = useState(false);
536
- return (_jsx("button", { type: "button", onClick: onClick, title: title, onMouseEnter: () => setHovered(true), onMouseLeave: () => setHovered(false), style: {
537
- ...styles.toolbarButton,
538
- ...(isActive ? styles.toolbarButtonActive : {}),
539
- ...(hovered && !isActive ? { backgroundColor: 'var(--theme-elevation-100)' } : {}),
540
- }, children: children }));
541
- }
542
- function ToolbarDropdown({ trigger, children, title, isActive, }) {
543
- const [isOpen, setIsOpen] = useState(false);
544
- const [hovered, setHovered] = useState(false);
545
- const dropdownRef = useRef(null);
546
- const close = useCallback(() => setIsOpen(false), []);
547
- useEffect(() => {
548
- function handleClickOutside(event) {
549
- const activeElement = document.activeElement;
550
- if (activeElement?.tagName === 'INPUT' && activeElement.type === 'color') {
551
- return;
552
- }
553
- if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
554
- setIsOpen(false);
555
- }
556
- }
557
- document.addEventListener('mousedown', handleClickOutside);
558
- return () => document.removeEventListener('mousedown', handleClickOutside);
559
- }, []);
560
- return (_jsxs("div", { ref: dropdownRef, style: { position: 'relative', flexShrink: 0 }, children: [_jsx("button", { type: "button", onClick: () => setIsOpen(!isOpen), title: title, onMouseEnter: () => setHovered(true), onMouseLeave: () => setHovered(false), style: {
561
- ...styles.toolbarButton,
562
- ...(isActive ? styles.toolbarButtonActive : {}),
563
- ...(hovered && !isActive ? { backgroundColor: 'var(--theme-elevation-100)' } : {}),
564
- }, children: trigger }), isOpen && (_jsx("div", { style: styles.dropdown, children: typeof children === 'function' ? children(close) : children }))] }));
565
- }
566
- function DropdownItem({ onClick, children, }) {
567
- const [hovered, setHovered] = useState(false);
568
- return (_jsx("button", { type: "button", onClick: onClick, onMouseEnter: () => setHovered(true), onMouseLeave: () => setHovered(false), style: {
569
- ...styles.dropdownItem,
570
- ...(hovered ? { backgroundColor: 'var(--theme-elevation-100)' } : {}),
571
- }, children: children }));
572
- }
573
- function DropdownLabel({ children }) {
574
- return _jsx("div", { style: styles.dropdownLabel, children: children });
575
- }
576
- function DropdownSeparator() {
577
- return _jsx("div", { style: styles.dropdownSeparator });
578
- }
579
- function TiptapColorPicker({ currentColor, onColorChange, onClose, showOpacity = true, mode = 'text', }) {
580
- const theme = useTheme();
581
- const presets = theme.colorPresets;
582
- const parsed = parseColor(currentColor);
583
- const [hex, setHex] = useState(parsed.hex);
584
- const [hexInput, setHexInput] = useState(parsed.hex);
585
- const [opacity, setOpacity] = useState(parsed.opacity);
586
- const [hoverTheme, setHoverTheme] = useState(false);
587
- // Apply color to editor (converts to rgba if opacity < 100)
588
- const applyColor = useCallback((h, o) => {
589
- if (o < 100) {
590
- onColorChange(hexToRgba(h, o));
591
- }
592
- else {
593
- onColorChange(h);
594
- }
595
- }, [onColorChange]);
596
- const handleColorInputChange = useCallback((e) => {
597
- const newHex = e.target.value;
598
- setHex(newHex);
599
- setHexInput(newHex);
600
- applyColor(newHex, opacity);
601
- }, [opacity, applyColor]);
602
- const handleHexInputChange = useCallback((e) => {
603
- const input = e.target.value;
604
- setHexInput(input);
605
- const normalized = normalizeHex(input);
606
- if (normalized) {
607
- setHex(normalized);
608
- applyColor(normalized, opacity);
609
- }
610
- }, [opacity, applyColor]);
611
- const handleHexInputBlur = useCallback(() => {
612
- setHexInput(hex);
613
- }, [hex]);
614
- const handleOpacityChange = useCallback((e) => {
615
- const newOpacity = parseInt(e.target.value, 10);
616
- setOpacity(newOpacity);
617
- applyColor(hex, newOpacity);
618
- }, [hex, applyColor]);
619
- const handlePresetClick = useCallback((preset) => {
620
- setHex(preset.hex);
621
- setHexInput(preset.hex);
622
- setOpacity(100);
623
- applyColor(preset.hex, 100);
624
- onClose();
625
- }, [applyColor, onClose]);
626
- const handleClearColor = useCallback(() => {
627
- onColorChange(null);
628
- onClose();
629
- }, [onColorChange, onClose]);
630
- const previewColor = hexToRgba(hex, opacity);
631
- return (_jsxs("div", { style: styles.colorPickerContainer, children: [_jsxs("button", { type: "button", onClick: handleClearColor, onMouseEnter: () => setHoverTheme(true), onMouseLeave: () => setHoverTheme(false), style: {
632
- ...styles.colorPickerThemeButton,
633
- ...(hoverTheme ? { backgroundColor: 'var(--theme-elevation-50)' } : {}),
634
- }, children: [_jsx("span", { style: styles.colorPickerThemeSwatch }), mode === 'text' ? 'Theme Color (Auto)' : 'Remove Highlight'] }), _jsxs("div", { style: styles.colorPickerRow, children: [_jsx("input", { type: "color", value: hex, onChange: handleColorInputChange, style: styles.colorPickerInput, title: "Pick a color" }), _jsx("input", { type: "text", value: hexInput, onChange: handleHexInputChange, onBlur: handleHexInputBlur, placeholder: "#000000", style: styles.colorPickerHexInput }), _jsxs("div", { style: styles.colorPickerPreview, title: `${hex} at ${opacity}% opacity`, children: [_jsx("div", { style: styles.colorPickerCheckerboard }), _jsx("div", { style: { ...styles.colorPickerOverlay, backgroundColor: previewColor } })] })] }), showOpacity && (_jsxs("div", { style: styles.colorPickerOpacitySection, children: [_jsxs("div", { style: styles.colorPickerOpacityHeader, children: [_jsx("label", { style: styles.colorPickerOpacityLabel, children: "Opacity" }), _jsxs("span", { style: styles.colorPickerOpacityValue, children: [opacity, "%"] })] }), _jsxs("div", { style: styles.colorPickerOpacitySlider, children: [_jsx("div", { style: styles.colorPickerCheckerboard }), _jsx("div", { style: {
635
- ...styles.colorPickerOverlay,
636
- background: `linear-gradient(to right, transparent 0%, ${hex} 100%)`,
637
- } }), _jsx("input", { type: "range", min: "0", max: "100", value: opacity, onChange: handleOpacityChange, style: styles.colorPickerOpacityInputRange }), _jsx("div", { style: {
638
- ...styles.colorPickerOpacityThumb,
639
- left: `calc(${opacity}% - 2px)`,
640
- } })] })] })), presets.length > 0 && (_jsxs("div", { children: [_jsx("div", { style: styles.colorPickerPresetsLabel, children: "Presets" }), _jsx("div", { style: styles.colorPickerPresetsGrid, children: presets.map((preset) => {
641
- const isSelected = hex.toLowerCase() === preset.hex.toLowerCase();
642
- return (_jsx("button", { type: "button", onClick: () => handlePresetClick(preset), style: {
643
- ...(isSelected ? styles.colorPickerPresetButtonSelected : styles.colorPickerPresetButton),
644
- backgroundColor: preset.hex,
645
- }, title: preset.label }, preset.hex));
646
- }) })] }))] }));
647
- }
648
- function LinkPopover({ isOpen, onClose, onSetLink, onRemoveLink, }) {
649
- const [url, setUrl] = useState('');
650
- const popoverRef = useRef(null);
651
- useEffect(() => {
652
- function handleClickOutside(event) {
653
- if (popoverRef.current && !popoverRef.current.contains(event.target)) {
654
- onClose();
655
- }
656
- }
657
- if (isOpen) {
658
- document.addEventListener('mousedown', handleClickOutside);
659
- }
660
- return () => document.removeEventListener('mousedown', handleClickOutside);
661
- }, [isOpen, onClose]);
662
- if (!isOpen)
663
- return null;
664
- return (_jsx("div", { ref: popoverRef, style: styles.linkPopover, children: _jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: '8px' }, children: [_jsx("label", { style: { fontSize: '14px', fontWeight: 500, color: 'var(--theme-elevation-700)' }, children: "URL" }), _jsx("input", { type: "text", placeholder: "https://example.com", value: url, onChange: (e) => setUrl(e.target.value), onKeyDown: (e) => {
665
- if (e.key === 'Enter') {
666
- e.preventDefault();
667
- if (url) {
668
- onSetLink(url);
669
- setUrl('');
670
- }
671
- }
672
- }, style: styles.input }), _jsxs("div", { style: { display: 'flex', gap: '8px' }, children: [_jsx("button", { type: "button", onClick: () => {
673
- if (url) {
674
- onSetLink(url);
675
- setUrl('');
676
- }
677
- }, style: styles.buttonPrimary, children: "Add Link" }), _jsx("button", { type: "button", onClick: () => {
678
- onRemoveLink();
679
- setUrl('');
680
- }, style: styles.buttonSecondary, children: "Remove Link" })] })] }) }));
681
- }
682
- // =============================================================================
683
- // Tiptap Extensions Factory
684
- // =============================================================================
685
- function createTiptapExtensions() {
686
- return [
687
- StarterKit.configure({
688
- heading: { levels: [1, 2, 3, 4, 5, 6] },
689
- strike: {},
690
- horizontalRule: {},
691
- hardBreak: {},
692
- link: {
693
- openOnClick: false,
694
- HTMLAttributes: {
695
- style: 'color: var(--theme-elevation-700); text-decoration: underline;',
696
- },
697
- },
698
- underline: {},
699
- }),
700
- TextAlign.configure({
701
- types: ['heading', 'paragraph'],
702
- alignments: ['left', 'center', 'right', 'justify'],
703
- }),
704
- TextStyle,
705
- Color,
706
- Highlight.configure({ multicolor: true }),
707
- FontSize,
708
- Superscript,
709
- Subscript,
710
- ];
711
- }
712
- // =============================================================================
713
- // TiptapField Component
714
- // =============================================================================
715
- function TiptapFieldInner({ value, onChange, label, readOnly }) {
716
- const [isLinkPopoverOpen, setIsLinkPopoverOpen] = useState(false);
717
- const [showSource, setShowSource] = useState(false);
718
- const [sourceContent, setSourceContent] = useState(value);
719
- const onChangeRef = useRef(onChange);
720
- onChangeRef.current = onChange;
721
- const handleUpdate = useCallback(({ editor }) => {
722
- if (editor) {
723
- const html = editor.getHTML();
724
- onChangeRef.current(html);
725
- }
726
- }, []);
727
- const editor = useEditor({
728
- extensions: createTiptapExtensions(),
729
- content: value,
730
- editorProps: {
731
- attributes: {
732
- class: 'tiptap-editor focus:outline-none min-h-[200px] p-4',
733
- style: 'min-height: 200px; padding: 16px; outline: none;',
734
- },
735
- },
736
- onUpdate: handleUpdate,
737
- immediatelyRender: false,
738
- shouldRerenderOnTransaction: false,
739
- });
740
- const formattingState = useEditorState({
741
- editor,
742
- selector: ({ editor: e }) => {
743
- if (!e)
744
- return null;
745
- return {
746
- isBold: e.isActive('bold'),
747
- isItalic: e.isActive('italic'),
748
- isUnderline: e.isActive('underline'),
749
- isStrike: e.isActive('strike'),
750
- isH1: e.isActive('heading', { level: 1 }),
751
- isH2: e.isActive('heading', { level: 2 }),
752
- isH3: e.isActive('heading', { level: 3 }),
753
- isH4: e.isActive('heading', { level: 4 }),
754
- isH5: e.isActive('heading', { level: 5 }),
755
- isH6: e.isActive('heading', { level: 6 }),
756
- isBulletList: e.isActive('bulletList'),
757
- isOrderedList: e.isActive('orderedList'),
758
- isBlockquote: e.isActive('blockquote'),
759
- isAlignLeft: e.isActive({ textAlign: 'left' }),
760
- isAlignCenter: e.isActive({ textAlign: 'center' }),
761
- isAlignRight: e.isActive({ textAlign: 'right' }),
762
- isAlignJustify: e.isActive({ textAlign: 'justify' }),
763
- isLink: e.isActive('link'),
764
- isHighlight: e.isActive('highlight'),
765
- isSuperscript: e.isActive('superscript'),
766
- isSubscript: e.isActive('subscript'),
767
- };
768
- },
769
- });
770
- if (!editor) {
771
- return (_jsxs("div", { className: "puck-field", children: [label && _jsx("label", { style: styles.label, children: label }), _jsx("div", { style: styles.editorWrapper, children: _jsx("div", { style: styles.loadingState, children: "Loading editor..." }) })] }));
772
- }
773
- const setLink = (url) => {
774
- editor.chain().focus().extendMarkRange('link').setLink({ href: url }).run();
775
- setIsLinkPopoverOpen(false);
776
- };
777
- const removeLink = () => {
778
- editor.chain().focus().unsetLink().run();
779
- setIsLinkPopoverOpen(false);
780
- };
781
- return (_jsxs("div", { className: "puck-field", children: [label && _jsx("label", { style: styles.label, children: label }), _jsxs("div", { style: styles.editorWrapper, children: [!readOnly && (_jsxs("div", { style: styles.toolbar, children: [_jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleBold().run(), isActive: formattingState?.isBold, title: "Bold", children: _jsx(Bold, { style: styles.icon }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleItalic().run(), isActive: formattingState?.isItalic, title: "Italic", children: _jsx(Italic, { style: styles.icon }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleUnderline().run(), isActive: formattingState?.isUnderline, title: "Underline", children: _jsx(Underline, { style: styles.icon }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleStrike().run(), isActive: formattingState?.isStrike, title: "Strikethrough", children: _jsx(Strikethrough, { style: styles.icon }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleSuperscript().run(), isActive: formattingState?.isSuperscript, title: "Superscript", children: _jsx(SuperscriptIcon, { style: styles.icon }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleSubscript().run(), isActive: formattingState?.isSubscript, title: "Subscript", children: _jsx(SubscriptIcon, { style: styles.icon }) }), _jsx("div", { style: styles.toolbarDivider }), _jsx(ToolbarDropdown, { trigger: _jsxs("span", { style: { display: 'flex', alignItems: 'center', gap: '2px' }, children: [formattingState?.isH1 ? _jsx(Heading1, { style: styles.icon }) :
782
- formattingState?.isH2 ? _jsx(Heading2, { style: styles.icon }) :
783
- formattingState?.isH3 ? _jsx(Heading3, { style: styles.icon }) :
784
- formattingState?.isH4 ? _jsx(Heading4, { style: styles.icon }) :
785
- formattingState?.isH5 ? _jsx(Heading5, { style: styles.icon }) :
786
- formattingState?.isH6 ? _jsx(Heading6, { style: styles.icon }) :
787
- _jsx(Pilcrow, { style: styles.icon }), _jsx(ChevronDown, { style: styles.iconSmall })] }), title: "Text Type", isActive: formattingState?.isH1 || formattingState?.isH2 || formattingState?.isH3 || formattingState?.isH4 || formattingState?.isH5 || formattingState?.isH6, children: (close) => (_jsxs(_Fragment, { children: [_jsxs(DropdownItem, { onClick: () => { editor.chain().focus().setParagraph().run(); close(); }, children: [_jsx(Pilcrow, { style: { ...styles.icon, marginRight: '8px' } }), "Paragraph"] }), _jsx(DropdownSeparator, {}), _jsxs(DropdownItem, { onClick: () => { editor.chain().focus().toggleHeading({ level: 1 }).run(); close(); }, children: [_jsx(Heading1, { style: { ...styles.icon, marginRight: '8px' } }), _jsx("span", { style: { fontWeight: 700, fontSize: '18px' }, children: "Heading 1" })] }), _jsxs(DropdownItem, { onClick: () => { editor.chain().focus().toggleHeading({ level: 2 }).run(); close(); }, children: [_jsx(Heading2, { style: { ...styles.icon, marginRight: '8px' } }), _jsx("span", { style: { fontWeight: 700, fontSize: '16px' }, children: "Heading 2" })] }), _jsxs(DropdownItem, { onClick: () => { editor.chain().focus().toggleHeading({ level: 3 }).run(); close(); }, children: [_jsx(Heading3, { style: { ...styles.icon, marginRight: '8px' } }), _jsx("span", { style: { fontWeight: 600 }, children: "Heading 3" })] }), _jsxs(DropdownItem, { onClick: () => { editor.chain().focus().toggleHeading({ level: 4 }).run(); close(); }, children: [_jsx(Heading4, { style: { ...styles.icon, marginRight: '8px' } }), _jsx("span", { style: { fontWeight: 600, fontSize: '14px' }, children: "Heading 4" })] }), _jsxs(DropdownItem, { onClick: () => { editor.chain().focus().toggleHeading({ level: 5 }).run(); close(); }, children: [_jsx(Heading5, { style: { ...styles.icon, marginRight: '8px' } }), _jsx("span", { style: { fontWeight: 600, fontSize: '12px' }, children: "Heading 5" })] }), _jsxs(DropdownItem, { onClick: () => { editor.chain().focus().toggleHeading({ level: 6 }).run(); close(); }, children: [_jsx(Heading6, { style: { ...styles.icon, marginRight: '8px' } }), _jsx("span", { style: { fontWeight: 600, fontSize: '12px', color: 'var(--theme-elevation-600)' }, children: "Heading 6" })] })] })) }), _jsx("div", { style: styles.toolbarDivider }), _jsx(ToolbarDropdown, { trigger: _jsx(ALargeSmall, { style: styles.icon }), title: "Font Size", children: (close) => (_jsxs(_Fragment, { children: [_jsx(DropdownLabel, { children: "Presets" }), _jsx("div", { style: styles.fontSizeGrid, children: FONT_SIZES.map((size) => (_jsx("button", { type: "button", onClick: () => {
788
- if (size.value) {
789
- editor.chain().focus().setFontSize(size.value).run();
790
- }
791
- else {
792
- editor.chain().focus().unsetFontSize().run();
793
- }
794
- close();
795
- }, style: styles.fontSizeButton, title: size.px, children: size.label }, size.label))) }), _jsx(DropdownSeparator, {}), _jsxs("div", { style: { padding: '8px' }, children: [_jsx(DropdownLabel, { children: "Custom Size" }), _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '4px', marginTop: '4px' }, children: [_jsx("input", { type: "number", placeholder: "16", min: "8", max: "200", style: styles.customSizeInput, onKeyDown: (e) => {
796
- if (e.key === 'Enter') {
797
- const input = e.target;
798
- const value = input.value;
799
- const unit = input.nextElementSibling?.value || 'px';
800
- if (value) {
801
- editor.chain().focus().setFontSize(`${value}${unit}`).run();
802
- close();
803
- }
804
- }
805
- } }), _jsx("select", { style: styles.customSizeSelect, defaultValue: "px", children: FONT_SIZE_UNITS.map((unit) => (_jsx("option", { value: unit, children: unit }, unit))) }), _jsx("button", { type: "button", onClick: (e) => {
806
- const container = e.target.parentElement;
807
- const input = container?.querySelector('input');
808
- const select = container?.querySelector('select');
809
- const value = input?.value;
810
- const unit = select?.value || 'px';
811
- if (value) {
812
- editor.chain().focus().setFontSize(`${value}${unit}`).run();
813
- close();
814
- }
815
- }, style: styles.customSizeApply, children: "Apply" })] })] })] })) }), _jsx("div", { style: styles.toolbarDivider }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleBulletList().run(), isActive: formattingState?.isBulletList, title: "Bullet List", children: _jsx(List, { style: styles.icon }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleOrderedList().run(), isActive: formattingState?.isOrderedList, title: "Numbered List", children: _jsx(ListOrdered, { style: styles.icon }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().toggleBlockquote().run(), isActive: formattingState?.isBlockquote, title: "Blockquote", children: _jsx(Quote, { style: styles.icon }) }), _jsx("div", { style: styles.toolbarDivider }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().setTextAlign('left').run(), isActive: formattingState?.isAlignLeft, title: "Align Left", children: _jsx(AlignLeft, { style: styles.icon }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().setTextAlign('center').run(), isActive: formattingState?.isAlignCenter, title: "Align Center", children: _jsx(AlignCenter, { style: styles.icon }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().setTextAlign('right').run(), isActive: formattingState?.isAlignRight, title: "Align Right", children: _jsx(AlignRight, { style: styles.icon }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().setTextAlign('justify').run(), isActive: formattingState?.isAlignJustify, title: "Justify", children: _jsx(AlignJustify, { style: styles.icon }) }), _jsx("div", { style: styles.toolbarDivider }), _jsxs("div", { style: { position: 'relative', flexShrink: 0 }, children: [_jsx(ToolbarButton, { onClick: () => setIsLinkPopoverOpen(!isLinkPopoverOpen), isActive: formattingState?.isLink, title: "Add Link", children: _jsx(Link, { style: styles.icon }) }), _jsx(LinkPopover, { isOpen: isLinkPopoverOpen, onClose: () => setIsLinkPopoverOpen(false), onSetLink: setLink, onRemoveLink: removeLink })] }), _jsx(ToolbarDropdown, { trigger: _jsx(Palette, { style: styles.icon }), title: "Text Color", children: (close) => (_jsx(TiptapColorPicker, { currentColor: editor.getAttributes('textStyle').color, onColorChange: (color) => {
816
- if (color) {
817
- editor.chain().focus().setColor(color).run();
818
- }
819
- else {
820
- editor.chain().focus().unsetColor().run();
821
- }
822
- }, onClose: close, showOpacity: true, mode: "text" })) }), _jsx(ToolbarDropdown, { trigger: _jsx(Highlighter, { style: styles.icon }), title: "Highlight", isActive: formattingState?.isHighlight, children: (close) => (_jsx(TiptapColorPicker, { currentColor: editor.getAttributes('highlight').color, onColorChange: (color) => {
823
- if (color) {
824
- editor.chain().focus().setHighlight({ color }).run();
825
- }
826
- else {
827
- editor.chain().focus().unsetHighlight().run();
828
- }
829
- }, onClose: close, showOpacity: true, mode: "highlight" })) }), _jsx("div", { style: styles.toolbarDivider }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().setHorizontalRule().run(), title: "Horizontal Rule", children: _jsx(Minus, { style: styles.icon }) }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().setHardBreak().run(), title: "Hard Break (Shift+Enter)", children: _jsx(CornerDownLeft, { style: styles.icon }) }), _jsx("div", { style: styles.toolbarDivider }), _jsx(ToolbarButton, { onClick: () => editor.chain().focus().unsetAllMarks().clearNodes().run(), title: "Clear Formatting", children: _jsx(RemoveFormatting, { style: styles.icon }) }), _jsxs("button", { type: "button", onClick: () => {
830
- if (showSource) {
831
- editor.commands.setContent(sourceContent);
832
- onChange(sourceContent);
833
- }
834
- else {
835
- setSourceContent(editor.getHTML());
836
- }
837
- setShowSource(!showSource);
838
- }, title: "View Source", style: {
839
- ...styles.sourceButton,
840
- ...(showSource ? styles.toolbarButtonActive : {}),
841
- }, children: [_jsx(Code, { style: styles.icon }), "Source"] })] })), showSource ? (_jsx("textarea", { value: sourceContent, onChange: (e) => {
842
- setSourceContent(e.target.value);
843
- onChange(e.target.value);
844
- }, style: styles.sourceTextarea, placeholder: "Edit HTML source..." })) : (_jsx("div", { style: styles.editorContent, children: _jsx(EditorContent, { editor: editor }) }))] })] }));
845
- }
846
- export const TiptapField = memo(TiptapFieldInner);
847
- // =============================================================================
848
- // Field Configuration Factory
849
- // =============================================================================
850
- export function createTiptapField(config) {
851
- return {
852
- type: 'custom',
853
- label: config.label,
854
- render: ({ name, value, onChange, readOnly }) => (_jsx(TiptapField, { value: value || '', onChange: onChange, label: config.label, readOnly: readOnly }, `tiptap-${name}`)),
855
- };
856
- }
857
- //# sourceMappingURL=TiptapField.js.map