@jhits/plugin-blog 0.0.7 → 0.0.9

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 (440) hide show
  1. package/dist/api/categories.d.ts +8 -0
  2. package/dist/api/categories.d.ts.map +1 -0
  3. package/dist/api/categories.js +30 -0
  4. package/dist/api/check-title.d.ts +8 -0
  5. package/dist/api/check-title.d.ts.map +1 -0
  6. package/dist/api/check-title.js +47 -0
  7. package/dist/api/config-handler.d.ts +21 -0
  8. package/dist/api/config-handler.d.ts.map +1 -0
  9. package/dist/api/config-handler.js +46 -0
  10. package/dist/api/handler.d.ts +42 -0
  11. package/dist/api/handler.d.ts.map +1 -0
  12. package/dist/api/handler.js +331 -0
  13. package/dist/api/index.d.ts +12 -0
  14. package/dist/api/index.d.ts.map +1 -0
  15. package/dist/api/index.js +12 -0
  16. package/dist/api/route.d.ts +50 -0
  17. package/dist/api/route.d.ts.map +1 -0
  18. package/dist/api/route.js +69 -0
  19. package/dist/api/router.d.ts +27 -0
  20. package/dist/api/router.d.ts.map +1 -0
  21. package/dist/api/router.js +98 -0
  22. package/dist/api-server.d.ts +9 -0
  23. package/dist/api-server.d.ts.map +1 -0
  24. package/dist/api-server.js +9 -0
  25. package/dist/config.d.ts +14 -0
  26. package/dist/config.d.ts.map +1 -0
  27. package/dist/config.js +156 -0
  28. package/dist/hooks/index.d.ts +8 -0
  29. package/dist/hooks/index.d.ts.map +1 -0
  30. package/dist/hooks/index.js +7 -0
  31. package/dist/hooks/useBlog.d.ts +31 -0
  32. package/dist/hooks/useBlog.d.ts.map +1 -0
  33. package/dist/hooks/useBlog.js +57 -0
  34. package/dist/hooks/useBlogs.d.ts +39 -0
  35. package/dist/hooks/useBlogs.d.ts.map +1 -0
  36. package/dist/hooks/useBlogs.js +82 -0
  37. package/dist/hooks/useCategories.d.ts +9 -0
  38. package/dist/hooks/useCategories.d.ts.map +1 -0
  39. package/dist/hooks/useCategories.js +70 -0
  40. package/dist/index.d.ts +55 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +228 -0
  43. package/dist/index.server.d.ts +12 -0
  44. package/dist/index.server.d.ts.map +1 -0
  45. package/dist/index.server.js +10 -0
  46. package/dist/init.d.ts +40 -0
  47. package/dist/init.d.ts.map +1 -0
  48. package/dist/init.js +41 -0
  49. package/dist/lib/blocks/BlockRenderer.d.ts +54 -0
  50. package/dist/lib/blocks/BlockRenderer.d.ts.map +1 -0
  51. package/dist/lib/blocks/BlockRenderer.js +54 -0
  52. package/dist/lib/blocks/index.d.ts +5 -0
  53. package/dist/lib/blocks/index.d.ts.map +1 -0
  54. package/dist/lib/blocks/index.js +4 -0
  55. package/dist/lib/config-storage.d.ts +30 -0
  56. package/dist/lib/config-storage.d.ts.map +1 -0
  57. package/dist/lib/config-storage.js +31 -0
  58. package/dist/lib/index.d.ts +8 -0
  59. package/dist/lib/index.d.ts.map +1 -0
  60. package/dist/lib/index.js +7 -0
  61. package/dist/lib/layouts/blocks/ColumnsBlock.d.ts +25 -0
  62. package/dist/lib/layouts/blocks/ColumnsBlock.d.ts.map +1 -0
  63. package/dist/lib/layouts/blocks/ColumnsBlock.js +186 -0
  64. package/dist/lib/layouts/blocks/SectionBlock.d.ts +25 -0
  65. package/dist/lib/layouts/blocks/SectionBlock.d.ts.map +1 -0
  66. package/dist/lib/layouts/blocks/SectionBlock.js +44 -0
  67. package/dist/lib/layouts/blocks/index.d.ts +7 -0
  68. package/dist/lib/layouts/blocks/index.d.ts.map +1 -0
  69. package/dist/lib/layouts/blocks/index.js +6 -0
  70. package/dist/lib/layouts/index.d.ts +23 -0
  71. package/dist/lib/layouts/index.d.ts.map +1 -0
  72. package/dist/lib/layouts/index.js +45 -0
  73. package/dist/lib/layouts/registerLayoutBlocks.d.ts +9 -0
  74. package/dist/lib/layouts/registerLayoutBlocks.d.ts.map +1 -0
  75. package/dist/lib/layouts/registerLayoutBlocks.js +60 -0
  76. package/dist/lib/mappers/apiMapper.d.ts +66 -0
  77. package/dist/lib/mappers/apiMapper.d.ts.map +1 -0
  78. package/dist/lib/mappers/apiMapper.js +188 -0
  79. package/dist/lib/migration/index.d.ts +5 -0
  80. package/dist/lib/migration/index.d.ts.map +1 -0
  81. package/dist/lib/migration/index.js +4 -0
  82. package/dist/lib/migration/mapper.d.ts +37 -0
  83. package/dist/lib/migration/mapper.d.ts.map +1 -0
  84. package/dist/lib/migration/mapper.js +98 -0
  85. package/dist/lib/rich-text/RichTextEditor.d.ts +45 -0
  86. package/dist/lib/rich-text/RichTextEditor.d.ts.map +1 -0
  87. package/dist/lib/rich-text/RichTextEditor.js +556 -0
  88. package/dist/lib/rich-text/RichTextPreview.d.ts +16 -0
  89. package/dist/lib/rich-text/RichTextPreview.d.ts.map +1 -0
  90. package/dist/lib/rich-text/RichTextPreview.js +144 -0
  91. package/dist/lib/rich-text/index.d.ts +9 -0
  92. package/dist/lib/rich-text/index.d.ts.map +1 -0
  93. package/dist/lib/rich-text/index.js +6 -0
  94. package/dist/lib/utils/blockHelpers.d.ts +23 -0
  95. package/dist/lib/utils/blockHelpers.d.ts.map +1 -0
  96. package/dist/lib/utils/blockHelpers.js +65 -0
  97. package/dist/lib/utils/configValidation.d.ts +23 -0
  98. package/dist/lib/utils/configValidation.d.ts.map +1 -0
  99. package/dist/lib/utils/configValidation.js +111 -0
  100. package/dist/lib/utils/index.d.ts +7 -0
  101. package/dist/lib/utils/index.d.ts.map +1 -0
  102. package/dist/lib/utils/index.js +6 -0
  103. package/dist/lib/utils/slugify.d.ts +25 -0
  104. package/dist/lib/utils/slugify.d.ts.map +1 -0
  105. package/dist/lib/utils/slugify.js +65 -0
  106. package/dist/registry/BlockRegistry.d.ts +62 -0
  107. package/dist/registry/BlockRegistry.d.ts.map +1 -0
  108. package/dist/registry/BlockRegistry.js +112 -0
  109. package/dist/registry/index.d.ts +6 -0
  110. package/dist/registry/index.d.ts.map +1 -0
  111. package/dist/registry/index.js +4 -0
  112. package/dist/state/EditorContext.d.ts +45 -0
  113. package/dist/state/EditorContext.d.ts.map +1 -0
  114. package/dist/state/EditorContext.js +215 -0
  115. package/dist/state/index.d.ts +7 -0
  116. package/dist/state/index.d.ts.map +1 -0
  117. package/dist/state/index.js +6 -0
  118. package/dist/state/reducer.d.ts +11 -0
  119. package/dist/state/reducer.d.ts.map +1 -0
  120. package/dist/state/reducer.js +599 -0
  121. package/dist/state/types.d.ts +162 -0
  122. package/dist/state/types.d.ts.map +1 -0
  123. package/dist/state/types.js +27 -0
  124. package/dist/types/block.d.ts +221 -0
  125. package/dist/types/block.d.ts.map +1 -0
  126. package/dist/types/block.js +6 -0
  127. package/dist/types/index.d.ts +8 -0
  128. package/dist/types/index.d.ts.map +1 -0
  129. package/dist/types/index.js +5 -0
  130. package/dist/types/post.d.ts +136 -0
  131. package/dist/types/post.d.ts.map +1 -0
  132. package/dist/types/post.js +5 -0
  133. package/dist/utils/client.d.ts +48 -0
  134. package/dist/utils/client.d.ts.map +1 -0
  135. package/dist/utils/client.js +77 -0
  136. package/dist/utils/index.d.ts +6 -0
  137. package/dist/utils/index.d.ts.map +1 -0
  138. package/dist/utils/index.js +5 -0
  139. package/dist/views/CanvasEditor/BlockWrapper.d.ts +16 -0
  140. package/dist/views/CanvasEditor/BlockWrapper.d.ts.map +1 -0
  141. package/dist/views/CanvasEditor/BlockWrapper.js +285 -0
  142. package/dist/views/CanvasEditor/CanvasEditorView.d.ts +14 -0
  143. package/dist/views/CanvasEditor/CanvasEditorView.d.ts.map +1 -0
  144. package/dist/views/CanvasEditor/CanvasEditorView.js +215 -0
  145. package/dist/views/CanvasEditor/EditorBody.d.ts +22 -0
  146. package/dist/views/CanvasEditor/EditorBody.d.ts.map +1 -0
  147. package/dist/views/CanvasEditor/EditorBody.js +505 -0
  148. package/dist/views/CanvasEditor/EditorHeader.d.ts +18 -0
  149. package/dist/views/CanvasEditor/EditorHeader.d.ts.map +1 -0
  150. package/dist/views/CanvasEditor/EditorHeader.js +101 -0
  151. package/dist/views/CanvasEditor/LayoutContainer.d.ts +17 -0
  152. package/dist/views/CanvasEditor/LayoutContainer.d.ts.map +1 -0
  153. package/dist/views/CanvasEditor/LayoutContainer.js +222 -0
  154. package/dist/views/CanvasEditor/SaveConfirmationModal.d.ts +13 -0
  155. package/dist/views/CanvasEditor/SaveConfirmationModal.d.ts.map +1 -0
  156. package/dist/views/CanvasEditor/SaveConfirmationModal.js +78 -0
  157. package/dist/views/CanvasEditor/components/CustomBlockItem.d.ts +14 -0
  158. package/dist/views/CanvasEditor/components/CustomBlockItem.d.ts.map +1 -0
  159. package/dist/views/CanvasEditor/components/CustomBlockItem.js +44 -0
  160. package/dist/views/CanvasEditor/components/EditorCanvas.d.ts +29 -0
  161. package/dist/views/CanvasEditor/components/EditorCanvas.d.ts.map +1 -0
  162. package/dist/views/CanvasEditor/components/EditorCanvas.js +32 -0
  163. package/dist/views/CanvasEditor/components/EditorLibrary.d.ts +7 -0
  164. package/dist/views/CanvasEditor/components/EditorLibrary.d.ts.map +1 -0
  165. package/dist/views/CanvasEditor/components/EditorLibrary.js +25 -0
  166. package/dist/views/CanvasEditor/components/EditorSidebar.d.ts +13 -0
  167. package/dist/views/CanvasEditor/components/EditorSidebar.d.ts.map +1 -0
  168. package/dist/views/CanvasEditor/components/EditorSidebar.js +19 -0
  169. package/dist/views/CanvasEditor/components/ErrorBanner.d.ts +6 -0
  170. package/dist/views/CanvasEditor/components/ErrorBanner.d.ts.map +1 -0
  171. package/dist/views/CanvasEditor/components/ErrorBanner.js +8 -0
  172. package/dist/views/CanvasEditor/components/FeaturedMediaSection.d.ts +25 -0
  173. package/dist/views/CanvasEditor/components/FeaturedMediaSection.d.ts.map +1 -0
  174. package/dist/views/CanvasEditor/components/FeaturedMediaSection.js +199 -0
  175. package/dist/views/CanvasEditor/components/LibraryItem.d.ts +14 -0
  176. package/dist/views/CanvasEditor/components/LibraryItem.d.ts.map +1 -0
  177. package/dist/views/CanvasEditor/components/LibraryItem.js +43 -0
  178. package/dist/views/CanvasEditor/components/PrivacySettingsSection.d.ts +15 -0
  179. package/dist/views/CanvasEditor/components/PrivacySettingsSection.d.ts.map +1 -0
  180. package/dist/views/CanvasEditor/components/PrivacySettingsSection.js +70 -0
  181. package/dist/views/CanvasEditor/components/index.d.ts +21 -0
  182. package/dist/views/CanvasEditor/components/index.d.ts.map +1 -0
  183. package/dist/views/CanvasEditor/components/index.js +12 -0
  184. package/dist/views/CanvasEditor/hooks/index.d.ts +10 -0
  185. package/dist/views/CanvasEditor/hooks/index.d.ts.map +1 -0
  186. package/dist/views/CanvasEditor/hooks/index.js +9 -0
  187. package/dist/views/CanvasEditor/hooks/useHeroBlock.d.ts +8 -0
  188. package/dist/views/CanvasEditor/hooks/useHeroBlock.d.ts.map +1 -0
  189. package/dist/views/CanvasEditor/hooks/useHeroBlock.js +90 -0
  190. package/dist/views/CanvasEditor/hooks/useKeyboardShortcuts.d.ts +3 -0
  191. package/dist/views/CanvasEditor/hooks/useKeyboardShortcuts.d.ts.map +1 -0
  192. package/dist/views/CanvasEditor/hooks/useKeyboardShortcuts.js +119 -0
  193. package/dist/views/CanvasEditor/hooks/usePostLoader.d.ts +5 -0
  194. package/dist/views/CanvasEditor/hooks/usePostLoader.d.ts.map +1 -0
  195. package/dist/views/CanvasEditor/hooks/usePostLoader.js +32 -0
  196. package/dist/views/CanvasEditor/hooks/useRegisteredBlocks.d.ts +2 -0
  197. package/dist/views/CanvasEditor/hooks/useRegisteredBlocks.d.ts.map +1 -0
  198. package/dist/views/CanvasEditor/hooks/useRegisteredBlocks.js +47 -0
  199. package/dist/views/CanvasEditor/hooks/useUnsavedChanges.d.ts +25 -0
  200. package/dist/views/CanvasEditor/hooks/useUnsavedChanges.d.ts.map +1 -0
  201. package/dist/views/CanvasEditor/hooks/useUnsavedChanges.js +285 -0
  202. package/dist/views/CanvasEditor/index.d.ts +16 -0
  203. package/dist/views/CanvasEditor/index.d.ts.map +1 -0
  204. package/dist/views/CanvasEditor/index.js +9 -0
  205. package/dist/views/PostManager/EmptyState.d.ts +10 -0
  206. package/dist/views/PostManager/EmptyState.d.ts.map +1 -0
  207. package/dist/views/PostManager/EmptyState.js +12 -0
  208. package/dist/views/PostManager/PostActionsMenu.d.ts +12 -0
  209. package/dist/views/PostManager/PostActionsMenu.d.ts.map +1 -0
  210. package/dist/views/PostManager/PostActionsMenu.js +58 -0
  211. package/dist/views/PostManager/PostCards.d.ts +15 -0
  212. package/dist/views/PostManager/PostCards.d.ts.map +1 -0
  213. package/dist/views/PostManager/PostCards.js +77 -0
  214. package/dist/views/PostManager/PostFilters.d.ts +16 -0
  215. package/dist/views/PostManager/PostFilters.d.ts.map +1 -0
  216. package/dist/views/PostManager/PostFilters.js +10 -0
  217. package/dist/views/PostManager/PostManagerView.d.ts +11 -0
  218. package/dist/views/PostManager/PostManagerView.d.ts.map +1 -0
  219. package/dist/views/PostManager/PostManagerView.js +179 -0
  220. package/dist/views/PostManager/PostStats.d.ts +11 -0
  221. package/dist/views/PostManager/PostStats.d.ts.map +1 -0
  222. package/dist/views/PostManager/PostStats.js +46 -0
  223. package/dist/views/PostManager/PostTable.d.ts +15 -0
  224. package/dist/views/PostManager/PostTable.d.ts.map +1 -0
  225. package/dist/views/PostManager/PostTable.js +77 -0
  226. package/dist/views/PostManager/index.d.ts +12 -0
  227. package/dist/views/PostManager/index.d.ts.map +1 -0
  228. package/dist/views/PostManager/index.js +11 -0
  229. package/dist/views/Preview/PreviewBridgeView.d.ts +12 -0
  230. package/dist/views/Preview/PreviewBridgeView.d.ts.map +1 -0
  231. package/dist/views/Preview/PreviewBridgeView.js +11 -0
  232. package/dist/views/Preview/index.d.ts +6 -0
  233. package/dist/views/Preview/index.d.ts.map +1 -0
  234. package/dist/views/Preview/index.js +4 -0
  235. package/dist/views/Settings/SettingsView.d.ts +10 -0
  236. package/dist/views/Settings/SettingsView.d.ts.map +1 -0
  237. package/dist/views/Settings/SettingsView.js +113 -0
  238. package/dist/views/Settings/index.d.ts +6 -0
  239. package/dist/views/Settings/index.d.ts.map +1 -0
  240. package/dist/views/Settings/index.js +4 -0
  241. package/dist/views/SlugSEO/SlugSEOManagerView.d.ts +12 -0
  242. package/dist/views/SlugSEO/SlugSEOManagerView.d.ts.map +1 -0
  243. package/dist/views/SlugSEO/SlugSEOManagerView.js +11 -0
  244. package/dist/views/SlugSEO/index.d.ts +6 -0
  245. package/dist/views/SlugSEO/index.d.ts.map +1 -0
  246. package/dist/views/SlugSEO/index.js +4 -0
  247. package/package.json +59 -55
  248. package/src/hooks/index.d.ts +8 -0
  249. package/src/hooks/index.d.ts.map +1 -0
  250. package/src/hooks/index.js +7 -0
  251. package/src/hooks/useBlog.d.ts +31 -0
  252. package/src/hooks/useBlog.d.ts.map +1 -0
  253. package/src/hooks/useBlog.js +57 -0
  254. package/src/hooks/useBlogs.d.ts +39 -0
  255. package/src/hooks/useBlogs.d.ts.map +1 -0
  256. package/src/hooks/useBlogs.js +82 -0
  257. package/src/hooks/useCategories.d.ts +9 -0
  258. package/src/hooks/useCategories.d.ts.map +1 -0
  259. package/src/hooks/useCategories.js +70 -0
  260. package/src/index.d.ts +55 -0
  261. package/src/index.d.ts.map +1 -0
  262. package/src/index.js +228 -0
  263. package/src/init.d.ts +40 -0
  264. package/src/init.d.ts.map +1 -0
  265. package/src/init.js +41 -0
  266. package/src/lib/blocks/BlockRenderer.d.ts +54 -0
  267. package/src/lib/blocks/BlockRenderer.d.ts.map +1 -0
  268. package/src/lib/blocks/BlockRenderer.js +54 -0
  269. package/src/lib/config-storage.d.ts +30 -0
  270. package/src/lib/config-storage.d.ts.map +1 -0
  271. package/src/lib/config-storage.js +31 -0
  272. package/src/lib/layouts/blocks/ColumnsBlock.d.ts +25 -0
  273. package/src/lib/layouts/blocks/ColumnsBlock.d.ts.map +1 -0
  274. package/src/lib/layouts/blocks/ColumnsBlock.js +182 -0
  275. package/src/lib/layouts/blocks/SectionBlock.d.ts +25 -0
  276. package/src/lib/layouts/blocks/SectionBlock.d.ts.map +1 -0
  277. package/src/lib/layouts/blocks/SectionBlock.js +44 -0
  278. package/src/lib/layouts/index.d.ts +23 -0
  279. package/src/lib/layouts/index.d.ts.map +1 -0
  280. package/src/lib/layouts/index.js +45 -0
  281. package/src/lib/layouts/registerLayoutBlocks.d.ts +9 -0
  282. package/src/lib/layouts/registerLayoutBlocks.d.ts.map +1 -0
  283. package/src/lib/layouts/registerLayoutBlocks.js +60 -0
  284. package/src/lib/mappers/apiMapper.d.ts +66 -0
  285. package/src/lib/mappers/apiMapper.d.ts.map +1 -0
  286. package/src/lib/mappers/apiMapper.js +191 -0
  287. package/src/lib/rich-text/RichTextEditor.d.ts +45 -0
  288. package/src/lib/rich-text/RichTextEditor.d.ts.map +1 -0
  289. package/src/lib/rich-text/RichTextEditor.js +564 -0
  290. package/src/lib/rich-text/RichTextPreview.d.ts +16 -0
  291. package/src/lib/rich-text/RichTextPreview.d.ts.map +1 -0
  292. package/src/lib/rich-text/RichTextPreview.js +144 -0
  293. package/src/lib/rich-text/index.d.ts +9 -0
  294. package/src/lib/rich-text/index.d.ts.map +1 -0
  295. package/src/lib/rich-text/index.js +6 -0
  296. package/src/lib/utils/blockHelpers.d.ts +23 -0
  297. package/src/lib/utils/blockHelpers.d.ts.map +1 -0
  298. package/src/lib/utils/blockHelpers.js +65 -0
  299. package/src/lib/utils/configValidation.d.ts +23 -0
  300. package/src/lib/utils/configValidation.d.ts.map +1 -0
  301. package/src/lib/utils/configValidation.js +113 -0
  302. package/src/registry/BlockRegistry.d.ts +62 -0
  303. package/src/registry/BlockRegistry.d.ts.map +1 -0
  304. package/src/registry/BlockRegistry.js +112 -0
  305. package/src/registry/index.d.ts +6 -0
  306. package/src/registry/index.d.ts.map +1 -0
  307. package/src/registry/index.js +4 -0
  308. package/src/state/EditorContext.d.ts +45 -0
  309. package/src/state/EditorContext.d.ts.map +1 -0
  310. package/src/state/EditorContext.js +215 -0
  311. package/src/state/index.d.ts +7 -0
  312. package/src/state/index.d.ts.map +1 -0
  313. package/src/state/index.js +6 -0
  314. package/src/state/reducer.d.ts +11 -0
  315. package/src/state/reducer.d.ts.map +1 -0
  316. package/src/state/reducer.js +443 -0
  317. package/src/state/types.d.ts +162 -0
  318. package/src/state/types.d.ts.map +1 -0
  319. package/src/state/types.js +27 -0
  320. package/src/types/block.d.ts +221 -0
  321. package/src/types/block.d.ts.map +1 -0
  322. package/src/types/block.js +6 -0
  323. package/src/types/index.d.ts +8 -0
  324. package/src/types/index.d.ts.map +1 -0
  325. package/src/types/index.js +5 -0
  326. package/src/types/post.d.ts +136 -0
  327. package/src/types/post.d.ts.map +1 -0
  328. package/src/types/post.js +5 -0
  329. package/src/utils/client.d.ts +48 -0
  330. package/src/utils/client.d.ts.map +1 -0
  331. package/src/utils/client.js +77 -0
  332. package/src/utils/index.ts +0 -2
  333. package/src/views/CanvasEditor/BlockWrapper.d.ts +16 -0
  334. package/src/views/CanvasEditor/BlockWrapper.d.ts.map +1 -0
  335. package/src/views/CanvasEditor/BlockWrapper.js +276 -0
  336. package/src/views/CanvasEditor/CanvasEditorView.d.ts +14 -0
  337. package/src/views/CanvasEditor/CanvasEditorView.d.ts.map +1 -0
  338. package/src/views/CanvasEditor/CanvasEditorView.js +209 -0
  339. package/src/views/CanvasEditor/EditorBody.d.ts +22 -0
  340. package/src/views/CanvasEditor/EditorBody.d.ts.map +1 -0
  341. package/src/views/CanvasEditor/EditorBody.js +505 -0
  342. package/src/views/CanvasEditor/EditorHeader.d.ts +18 -0
  343. package/src/views/CanvasEditor/EditorHeader.d.ts.map +1 -0
  344. package/src/views/CanvasEditor/EditorHeader.js +101 -0
  345. package/src/views/CanvasEditor/LayoutContainer.d.ts +17 -0
  346. package/src/views/CanvasEditor/LayoutContainer.d.ts.map +1 -0
  347. package/src/views/CanvasEditor/LayoutContainer.js +222 -0
  348. package/src/views/CanvasEditor/SaveConfirmationModal.d.ts +13 -0
  349. package/src/views/CanvasEditor/SaveConfirmationModal.d.ts.map +1 -0
  350. package/src/views/CanvasEditor/SaveConfirmationModal.js +78 -0
  351. package/src/views/CanvasEditor/components/CustomBlockItem.d.ts +14 -0
  352. package/src/views/CanvasEditor/components/CustomBlockItem.d.ts.map +1 -0
  353. package/src/views/CanvasEditor/components/CustomBlockItem.js +44 -0
  354. package/src/views/CanvasEditor/components/EditorCanvas.d.ts +29 -0
  355. package/src/views/CanvasEditor/components/EditorCanvas.d.ts.map +1 -0
  356. package/src/views/CanvasEditor/components/EditorCanvas.js +32 -0
  357. package/src/views/CanvasEditor/components/EditorLibrary.d.ts +7 -0
  358. package/src/views/CanvasEditor/components/EditorLibrary.d.ts.map +1 -0
  359. package/src/views/CanvasEditor/components/EditorLibrary.js +25 -0
  360. package/src/views/CanvasEditor/components/EditorSidebar.d.ts +13 -0
  361. package/src/views/CanvasEditor/components/EditorSidebar.d.ts.map +1 -0
  362. package/src/views/CanvasEditor/components/EditorSidebar.js +20 -0
  363. package/src/views/CanvasEditor/components/ErrorBanner.d.ts +6 -0
  364. package/src/views/CanvasEditor/components/ErrorBanner.d.ts.map +1 -0
  365. package/src/views/CanvasEditor/components/ErrorBanner.js +8 -0
  366. package/src/views/CanvasEditor/components/FeaturedMediaSection.d.ts +25 -0
  367. package/src/views/CanvasEditor/components/FeaturedMediaSection.d.ts.map +1 -0
  368. package/src/views/CanvasEditor/components/FeaturedMediaSection.js +182 -0
  369. package/src/views/CanvasEditor/components/LibraryItem.d.ts +14 -0
  370. package/src/views/CanvasEditor/components/LibraryItem.d.ts.map +1 -0
  371. package/src/views/CanvasEditor/components/LibraryItem.js +43 -0
  372. package/src/views/CanvasEditor/components/PrivacySettingsSection.d.ts +15 -0
  373. package/src/views/CanvasEditor/components/PrivacySettingsSection.d.ts.map +1 -0
  374. package/src/views/CanvasEditor/components/PrivacySettingsSection.js +63 -0
  375. package/src/views/CanvasEditor/components/index.d.ts +21 -0
  376. package/src/views/CanvasEditor/components/index.d.ts.map +1 -0
  377. package/src/views/CanvasEditor/components/index.js +12 -0
  378. package/src/views/CanvasEditor/hooks/index.d.ts +10 -0
  379. package/src/views/CanvasEditor/hooks/index.d.ts.map +1 -0
  380. package/src/views/CanvasEditor/hooks/index.js +9 -0
  381. package/src/views/CanvasEditor/hooks/useHeroBlock.d.ts +8 -0
  382. package/src/views/CanvasEditor/hooks/useHeroBlock.d.ts.map +1 -0
  383. package/src/views/CanvasEditor/hooks/useHeroBlock.js +79 -0
  384. package/src/views/CanvasEditor/hooks/useKeyboardShortcuts.d.ts +3 -0
  385. package/src/views/CanvasEditor/hooks/useKeyboardShortcuts.d.ts.map +1 -0
  386. package/src/views/CanvasEditor/hooks/useKeyboardShortcuts.js +114 -0
  387. package/src/views/CanvasEditor/hooks/usePostLoader.d.ts +5 -0
  388. package/src/views/CanvasEditor/hooks/usePostLoader.d.ts.map +1 -0
  389. package/src/views/CanvasEditor/hooks/usePostLoader.js +32 -0
  390. package/src/views/CanvasEditor/hooks/useRegisteredBlocks.d.ts +2 -0
  391. package/src/views/CanvasEditor/hooks/useRegisteredBlocks.d.ts.map +1 -0
  392. package/src/views/CanvasEditor/hooks/useRegisteredBlocks.js +47 -0
  393. package/src/views/CanvasEditor/hooks/useUnsavedChanges.d.ts +25 -0
  394. package/src/views/CanvasEditor/hooks/useUnsavedChanges.d.ts.map +1 -0
  395. package/src/views/CanvasEditor/hooks/useUnsavedChanges.js +285 -0
  396. package/src/views/CanvasEditor/index.d.ts +16 -0
  397. package/src/views/CanvasEditor/index.d.ts.map +1 -0
  398. package/src/views/CanvasEditor/index.js +9 -0
  399. package/src/views/PostManager/EmptyState.d.ts +10 -0
  400. package/src/views/PostManager/EmptyState.d.ts.map +1 -0
  401. package/src/views/PostManager/EmptyState.js +12 -0
  402. package/src/views/PostManager/PostActionsMenu.d.ts +12 -0
  403. package/src/views/PostManager/PostActionsMenu.d.ts.map +1 -0
  404. package/src/views/PostManager/PostActionsMenu.js +58 -0
  405. package/src/views/PostManager/PostCards.d.ts +15 -0
  406. package/src/views/PostManager/PostCards.d.ts.map +1 -0
  407. package/src/views/PostManager/PostCards.js +79 -0
  408. package/src/views/PostManager/PostFilters.d.ts +16 -0
  409. package/src/views/PostManager/PostFilters.d.ts.map +1 -0
  410. package/src/views/PostManager/PostFilters.js +10 -0
  411. package/src/views/PostManager/PostManagerView.d.ts +11 -0
  412. package/src/views/PostManager/PostManagerView.d.ts.map +1 -0
  413. package/src/views/PostManager/PostManagerView.js +174 -0
  414. package/src/views/PostManager/PostStats.d.ts +11 -0
  415. package/src/views/PostManager/PostStats.d.ts.map +1 -0
  416. package/src/views/PostManager/PostStats.js +46 -0
  417. package/src/views/PostManager/PostTable.d.ts +15 -0
  418. package/src/views/PostManager/PostTable.d.ts.map +1 -0
  419. package/src/views/PostManager/PostTable.js +79 -0
  420. package/src/views/PostManager/index.d.ts +12 -0
  421. package/src/views/PostManager/index.d.ts.map +1 -0
  422. package/src/views/PostManager/index.js +11 -0
  423. package/src/views/Preview/PreviewBridgeView.d.ts +12 -0
  424. package/src/views/Preview/PreviewBridgeView.d.ts.map +1 -0
  425. package/src/views/Preview/PreviewBridgeView.js +11 -0
  426. package/src/views/Preview/index.d.ts +6 -0
  427. package/src/views/Preview/index.d.ts.map +1 -0
  428. package/src/views/Preview/index.js +4 -0
  429. package/src/views/Settings/SettingsView.d.ts +10 -0
  430. package/src/views/Settings/SettingsView.d.ts.map +1 -0
  431. package/src/views/Settings/SettingsView.js +111 -0
  432. package/src/views/Settings/index.d.ts +6 -0
  433. package/src/views/Settings/index.d.ts.map +1 -0
  434. package/src/views/Settings/index.js +4 -0
  435. package/src/views/SlugSEO/SlugSEOManagerView.d.ts +12 -0
  436. package/src/views/SlugSEO/SlugSEOManagerView.d.ts.map +1 -0
  437. package/src/views/SlugSEO/SlugSEOManagerView.js +11 -0
  438. package/src/views/SlugSEO/index.d.ts +6 -0
  439. package/src/views/SlugSEO/index.d.ts.map +1 -0
  440. package/src/views/SlugSEO/index.js +4 -0
@@ -0,0 +1,556 @@
1
+ /**
2
+ * Rich Text Editor Component
3
+ * Provides formatting toolbar (bold, italic, underline, links, colors)
4
+ * Only shows options if client has provided styles for them
5
+ */
6
+ 'use client';
7
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
8
+ import { useState, useRef, useEffect } from 'react';
9
+ import { Bold, Italic, Underline, Link, Palette } from 'lucide-react';
10
+ export function RichTextEditor({ value, onChange, placeholder = 'Enter text...', formatting, className = '', isFocused = false, onKeyDown: customOnKeyDown, }) {
11
+ const editorRef = useRef(null);
12
+ const [showToolbar, setShowToolbar] = useState(false);
13
+ const [toolbarPosition, setToolbarPosition] = useState({ top: 0, left: 0 });
14
+ const [showLinkDialog, setShowLinkDialog] = useState(false);
15
+ const [linkUrl, setLinkUrl] = useState('');
16
+ const [showColorPicker, setShowColorPicker] = useState(false);
17
+ const [selectedText, setSelectedText] = useState('');
18
+ const [currentColor, setCurrentColor] = useState(null);
19
+ // Check which formatting options are available
20
+ const hasBold = formatting?.bold !== false;
21
+ const hasItalic = formatting?.italic !== false;
22
+ const hasUnderline = formatting?.underline !== false;
23
+ const hasLinks = formatting?.links !== false;
24
+ const hasColors = formatting?.colors && formatting.colors.length > 0;
25
+ // Initialize content when component mounts
26
+ useEffect(() => {
27
+ if (editorRef.current && !editorRef.current.innerHTML && value) {
28
+ editorRef.current.innerHTML = value;
29
+ }
30
+ }, []); // Only run on mount
31
+ // Update content when value prop changes (but avoid if user is editing)
32
+ useEffect(() => {
33
+ if (editorRef.current && document.activeElement !== editorRef.current) {
34
+ if (editorRef.current.innerHTML !== value) {
35
+ editorRef.current.innerHTML = value || '';
36
+ }
37
+ }
38
+ }, [value]);
39
+ // Handle focus prop
40
+ useEffect(() => {
41
+ if (isFocused && editorRef.current) {
42
+ // Use requestAnimationFrame to ensure DOM is ready
43
+ requestAnimationFrame(() => {
44
+ if (editorRef.current) {
45
+ editorRef.current.focus();
46
+ // Place cursor at the end
47
+ const range = document.createRange();
48
+ range.selectNodeContents(editorRef.current);
49
+ range.collapse(false);
50
+ const selection = window.getSelection();
51
+ if (selection) {
52
+ selection.removeAllRanges();
53
+ selection.addRange(range);
54
+ }
55
+ }
56
+ });
57
+ }
58
+ }, [isFocused]);
59
+ // Close color picker and link dialog when clicking outside, and hide toolbar when no selection
60
+ useEffect(() => {
61
+ const handleClickOutside = (e) => {
62
+ const target = e.target;
63
+ // Check if click is outside color picker
64
+ if (showColorPicker) {
65
+ const colorPicker = target.closest('[data-color-picker]');
66
+ const colorPickerButton = target.closest('[data-color-picker-button]');
67
+ if (!colorPicker && !colorPickerButton) {
68
+ setShowColorPicker(false);
69
+ }
70
+ }
71
+ // Check if click is outside link dialog
72
+ if (showLinkDialog) {
73
+ const linkDialog = target.closest('[data-link-dialog]');
74
+ const linkButton = target.closest('[data-link-button]');
75
+ if (!linkDialog && !linkButton) {
76
+ setShowLinkDialog(false);
77
+ }
78
+ }
79
+ // Check if click is outside editor and toolbar - hide toolbar if no selection
80
+ if (editorRef.current && !editorRef.current.contains(target)) {
81
+ const toolbar = target.closest('[class*="z-50"]');
82
+ if (!toolbar) {
83
+ // Check if there's actually a selection
84
+ setTimeout(() => {
85
+ const selection = window.getSelection();
86
+ if (!selection || selection.rangeCount === 0 || selection.getRangeAt(0).collapsed) {
87
+ setShowToolbar(false);
88
+ setSelectedText('');
89
+ }
90
+ else {
91
+ // Re-check selection to ensure it's still valid
92
+ handleSelectionChange();
93
+ }
94
+ }, 0);
95
+ }
96
+ }
97
+ else if (editorRef.current && editorRef.current.contains(target)) {
98
+ // Clicked inside editor - check selection after a brief delay
99
+ setTimeout(() => {
100
+ handleSelectionChange();
101
+ }, 10);
102
+ }
103
+ };
104
+ document.addEventListener('mousedown', handleClickOutside);
105
+ return () => {
106
+ document.removeEventListener('mousedown', handleClickOutside);
107
+ };
108
+ }, [showColorPicker, showLinkDialog]);
109
+ // Handle selection change to show/hide toolbar
110
+ const handleSelectionChange = () => {
111
+ // Don't hide toolbar if color picker or link dialog is open
112
+ if (showColorPicker || showLinkDialog) {
113
+ return;
114
+ }
115
+ const selection = window.getSelection();
116
+ if (!selection || selection.rangeCount === 0) {
117
+ setShowToolbar(false);
118
+ setSelectedText('');
119
+ return;
120
+ }
121
+ const range = selection.getRangeAt(0);
122
+ // Check if selection is collapsed (no text selected)
123
+ if (range.collapsed) {
124
+ setShowToolbar(false);
125
+ setSelectedText('');
126
+ return;
127
+ }
128
+ // Check if the selection is within our editor
129
+ if (!editorRef.current || !editorRef.current.contains(range.commonAncestorContainer)) {
130
+ setShowToolbar(false);
131
+ setSelectedText('');
132
+ return;
133
+ }
134
+ // Get selected text and check if it's not empty
135
+ const selectedText = selection.toString().trim();
136
+ if (!selectedText) {
137
+ setShowToolbar(false);
138
+ setSelectedText('');
139
+ return;
140
+ }
141
+ setSelectedText(selectedText);
142
+ // Calculate toolbar position
143
+ const rect = range.getBoundingClientRect();
144
+ const editorRect = editorRef.current?.getBoundingClientRect();
145
+ if (editorRect) {
146
+ setToolbarPosition({
147
+ top: rect.top - editorRect.top - 40,
148
+ left: rect.left - editorRect.left + (rect.width / 2),
149
+ });
150
+ setShowToolbar(true);
151
+ }
152
+ };
153
+ // Store selection range before button clicks
154
+ const savedRangeRef = useRef(null);
155
+ // Save selection before it's lost
156
+ const saveSelection = () => {
157
+ const selection = window.getSelection();
158
+ if (selection && selection.rangeCount > 0) {
159
+ savedRangeRef.current = selection.getRangeAt(0).cloneRange();
160
+ }
161
+ };
162
+ // Restore saved selection
163
+ const restoreSelection = () => {
164
+ if (savedRangeRef.current && editorRef.current) {
165
+ const selection = window.getSelection();
166
+ if (selection) {
167
+ selection.removeAllRanges();
168
+ selection.addRange(savedRangeRef.current);
169
+ }
170
+ }
171
+ };
172
+ // Apply formatting command
173
+ // Note: Client styles are applied in RichTextPreview component
174
+ // The editor stores standard HTML tags, and preview applies client styles
175
+ const applyFormat = (command, value) => {
176
+ document.execCommand(command, false, value);
177
+ editorRef.current?.focus();
178
+ updateContent();
179
+ };
180
+ // Update content from editor
181
+ const updateContent = () => {
182
+ if (editorRef.current) {
183
+ onChange(editorRef.current.innerHTML);
184
+ }
185
+ };
186
+ // Handle input
187
+ const handleInput = () => {
188
+ updateContent();
189
+ };
190
+ // Handle keyboard shortcuts
191
+ const handleKeyDown = (e) => {
192
+ // Call custom handler first (allows parent to intercept keys like Enter)
193
+ if (customOnKeyDown) {
194
+ customOnKeyDown(e);
195
+ // If custom handler prevented default, don't process further
196
+ if (e.defaultPrevented) {
197
+ return;
198
+ }
199
+ }
200
+ // Check for Ctrl/Cmd + key combinations
201
+ const isModifierPressed = e.ctrlKey || e.metaKey;
202
+ if (isModifierPressed) {
203
+ switch (e.key.toLowerCase()) {
204
+ case 'b':
205
+ if (hasBold) {
206
+ e.preventDefault();
207
+ e.stopPropagation(); // Prevent event from bubbling to window-level listeners
208
+ applyFormat('bold');
209
+ }
210
+ break;
211
+ case 'i':
212
+ if (hasItalic) {
213
+ e.preventDefault();
214
+ e.stopPropagation(); // Prevent event from bubbling to window-level listeners
215
+ applyFormat('italic');
216
+ }
217
+ break;
218
+ case 'u':
219
+ if (hasUnderline) {
220
+ e.preventDefault();
221
+ e.stopPropagation(); // Prevent event from bubbling to window-level listeners
222
+ applyFormat('underline');
223
+ }
224
+ break;
225
+ case 'k':
226
+ if (hasLinks) {
227
+ e.preventDefault();
228
+ e.stopPropagation(); // Prevent event from bubbling to window-level listeners
229
+ // Get selected text and open link dialog
230
+ const selection = window.getSelection();
231
+ if (selection && selection.rangeCount > 0) {
232
+ const range = selection.getRangeAt(0);
233
+ if (!range.collapsed) {
234
+ // Check if selection is already a link
235
+ const linkElement = range.commonAncestorContainer.parentElement?.closest('a');
236
+ if (linkElement) {
237
+ setLinkUrl(linkElement.href);
238
+ }
239
+ setShowLinkDialog(true);
240
+ }
241
+ }
242
+ }
243
+ break;
244
+ }
245
+ }
246
+ };
247
+ // Handle paste (clean HTML)
248
+ const handlePaste = (e) => {
249
+ e.preventDefault();
250
+ const text = e.clipboardData.getData('text/plain');
251
+ document.execCommand('insertText', false, text);
252
+ updateContent();
253
+ };
254
+ // Handle link creation
255
+ const handleCreateLink = () => {
256
+ if (!linkUrl.trim())
257
+ return;
258
+ const selection = window.getSelection();
259
+ if (selection && selection.rangeCount > 0) {
260
+ const range = selection.getRangeAt(0);
261
+ if (!range.collapsed) {
262
+ applyFormat('createLink', linkUrl);
263
+ setShowLinkDialog(false);
264
+ setLinkUrl('');
265
+ }
266
+ }
267
+ };
268
+ // Check if selected text has a color applied
269
+ const getSelectedColor = () => {
270
+ // Use saved selection if available (when color picker is open)
271
+ let range = null;
272
+ if (savedRangeRef.current) {
273
+ range = savedRangeRef.current;
274
+ }
275
+ else {
276
+ const selection = window.getSelection();
277
+ if (!selection || selection.rangeCount === 0)
278
+ return null;
279
+ range = selection.getRangeAt(0);
280
+ }
281
+ if (!range || range.collapsed)
282
+ return null;
283
+ // Check if the selection is within a span with a color class
284
+ let node = range.commonAncestorContainer;
285
+ // If the node is a text node, check its parent
286
+ if (node.nodeType === Node.TEXT_NODE) {
287
+ node = node.parentElement;
288
+ }
289
+ // Check if the node or any parent has a color class
290
+ while (node && node !== editorRef.current) {
291
+ if (node.nodeType === Node.ELEMENT_NODE) {
292
+ const element = node;
293
+ const className = element.className;
294
+ // Check if this element has any of the configured color classes
295
+ if (formatting?.styles?.colorClasses) {
296
+ for (const [colorKey, colorClass] of Object.entries(formatting.styles.colorClasses)) {
297
+ if (typeof className === 'string' && className.includes(colorClass)) {
298
+ return colorKey;
299
+ }
300
+ }
301
+ }
302
+ // Also check direct color classes
303
+ if (formatting?.colors) {
304
+ for (const color of formatting.colors) {
305
+ const colorClass = formatting?.styles?.colorClasses?.[color] || color;
306
+ if (typeof className === 'string' && className.includes(colorClass)) {
307
+ return color;
308
+ }
309
+ }
310
+ }
311
+ }
312
+ node = node.parentElement;
313
+ }
314
+ return null;
315
+ };
316
+ // Remove color from selected text
317
+ const handleRemoveColor = () => {
318
+ // Restore the saved selection first
319
+ restoreSelection();
320
+ const selection = window.getSelection();
321
+ if (!selection || selection.rangeCount === 0)
322
+ return;
323
+ const range = selection.getRangeAt(0);
324
+ if (range.collapsed)
325
+ return;
326
+ // Get all color classes to check for
327
+ const colorClassesToRemove = [];
328
+ if (formatting?.styles?.colorClasses) {
329
+ colorClassesToRemove.push(...Object.values(formatting.styles.colorClasses));
330
+ }
331
+ if (formatting?.colors) {
332
+ for (const color of formatting.colors) {
333
+ const colorClass = formatting?.styles?.colorClasses?.[color] || color;
334
+ if (!colorClassesToRemove.includes(colorClass)) {
335
+ colorClassesToRemove.push(colorClass);
336
+ }
337
+ }
338
+ }
339
+ if (colorClassesToRemove.length === 0)
340
+ return;
341
+ // Get the editor element
342
+ if (!editorRef.current)
343
+ return;
344
+ // Find all spans in the editor that intersect with the selection
345
+ const allSpans = editorRef.current.querySelectorAll('span');
346
+ const spansToProcess = [];
347
+ allSpans.forEach(span => {
348
+ // Check if span intersects with selection
349
+ if (range.intersectsNode(span)) {
350
+ const className = span.className || '';
351
+ // Check if span has any color class
352
+ for (const colorClass of colorClassesToRemove) {
353
+ if (className.includes(colorClass)) {
354
+ spansToProcess.push(span);
355
+ break;
356
+ }
357
+ }
358
+ }
359
+ });
360
+ // Process spans - remove color classes or unwrap
361
+ spansToProcess.forEach(span => {
362
+ const className = span.className || '';
363
+ let newClassName = className;
364
+ // Remove all color classes
365
+ for (const colorClass of colorClassesToRemove) {
366
+ const escapedClass = colorClass.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
367
+ newClassName = newClassName
368
+ .replace(new RegExp(`\\b${escapedClass}\\b`, 'g'), '')
369
+ .replace(/\s+/g, ' ')
370
+ .trim();
371
+ }
372
+ // Update or remove class
373
+ if (!newClassName) {
374
+ // Unwrap the span - move children to parent
375
+ const parent = span.parentNode;
376
+ if (parent) {
377
+ const fragment = document.createDocumentFragment();
378
+ while (span.firstChild) {
379
+ fragment.appendChild(span.firstChild);
380
+ }
381
+ parent.replaceChild(fragment, span);
382
+ }
383
+ }
384
+ else {
385
+ span.className = newClassName;
386
+ }
387
+ });
388
+ // Normalize to merge text nodes
389
+ if (editorRef.current) {
390
+ editorRef.current.normalize();
391
+ }
392
+ // Update content
393
+ updateContent();
394
+ setShowColorPicker(false);
395
+ setCurrentColor(null);
396
+ // Restore focus
397
+ editorRef.current?.focus();
398
+ };
399
+ // Apply color
400
+ const handleApplyColor = (color) => {
401
+ // Restore the saved selection first
402
+ restoreSelection();
403
+ const selection = window.getSelection();
404
+ if (!selection || selection.rangeCount === 0) {
405
+ return;
406
+ }
407
+ const range = selection.getRangeAt(0);
408
+ if (!range.collapsed) {
409
+ // Check if the selected text already has this color
410
+ const currentColor = getSelectedColor();
411
+ if (currentColor === color) {
412
+ // If clicking the same color, remove it
413
+ handleRemoveColor();
414
+ return;
415
+ }
416
+ // Remove any existing color first
417
+ if (currentColor) {
418
+ handleRemoveColor();
419
+ // Restore selection after removing color
420
+ restoreSelection();
421
+ }
422
+ const colorClass = formatting?.styles?.colorClasses?.[color] || color;
423
+ // Create a span with the color class
424
+ const span = document.createElement('span');
425
+ span.className = colorClass;
426
+ try {
427
+ range.surroundContents(span);
428
+ }
429
+ catch (e) {
430
+ // If surroundContents fails, try a different approach
431
+ span.appendChild(range.extractContents());
432
+ range.insertNode(span);
433
+ }
434
+ updateContent();
435
+ setShowColorPicker(false);
436
+ setCurrentColor(null);
437
+ // Ensure the cursor stays active
438
+ editorRef.current?.focus();
439
+ }
440
+ };
441
+ // Check if format is active
442
+ const isFormatActive = (command) => {
443
+ return document.queryCommandState(command);
444
+ };
445
+ return (_jsxs("div", { className: `relative ${className}`, children: [showToolbar && selectedText && selectedText.trim().length > 0 && (hasBold || hasItalic || hasUnderline || hasLinks || hasColors) && (_jsxs("div", { className: "absolute z-50 flex items-center gap-1 p-2 bg-white dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-700 rounded-lg shadow-lg", style: {
446
+ top: `${toolbarPosition.top}px`,
447
+ left: `${toolbarPosition.left}px`,
448
+ transform: 'translateX(-50%)',
449
+ }, children: [hasBold && (_jsx("button", { type: "button", onMouseDown: (e) => e.preventDefault(), onClick: () => applyFormat('bold'), className: `p-1.5 rounded hover:bg-neutral-100 dark:hover:bg-neutral-700 transition-colors ${isFormatActive('bold') ? 'bg-primary/10 text-primary' : 'text-neutral-600 dark:text-neutral-400'}`, title: "Bold", children: _jsx(Bold, { size: 14 }) })), hasItalic && (_jsx("button", { type: "button", onMouseDown: (e) => e.preventDefault(), onClick: () => applyFormat('italic'), className: `p-1.5 rounded hover:bg-neutral-100 dark:hover:bg-neutral-700 transition-colors ${isFormatActive('italic') ? 'bg-primary/10 text-primary' : 'text-neutral-600 dark:text-neutral-400'}`, title: "Italic", children: _jsx(Italic, { size: 14 }) })), hasUnderline && (_jsx("button", { type: "button", onMouseDown: (e) => e.preventDefault(), onClick: () => applyFormat('underline'), className: `p-1.5 rounded hover:bg-neutral-100 dark:hover:bg-neutral-700 transition-colors ${isFormatActive('underline') ? 'bg-primary/10 text-primary' : 'text-neutral-600 dark:text-neutral-400'}`, title: "Underline", children: _jsx(Underline, { size: 14 }) })), hasLinks && (_jsxs("div", { className: "relative", children: [_jsx("button", { type: "button", "data-link-button": true, onMouseDown: (e) => e.preventDefault(), onClick: (e) => {
450
+ e.stopPropagation();
451
+ const selection = window.getSelection();
452
+ if (selection && selection.rangeCount > 0) {
453
+ const range = selection.getRangeAt(0);
454
+ const linkElement = range.commonAncestorContainer.parentElement?.closest('a');
455
+ if (linkElement) {
456
+ setLinkUrl(linkElement.href);
457
+ }
458
+ }
459
+ setShowLinkDialog(!showLinkDialog);
460
+ }, className: `p-1.5 rounded hover:bg-neutral-100 dark:hover:bg-neutral-700 transition-colors ${isFormatActive('unlink') ? 'bg-primary/10 text-primary' : 'text-neutral-600 dark:text-neutral-400'}`, title: "Link", children: _jsx(Link, { size: 14 }) }), showLinkDialog && (_jsxs("div", { "data-link-dialog": true, className: "absolute top-full left-0 mt-2 p-3 bg-white dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-700 rounded-lg shadow-lg min-w-[300px] z-[60]", onMouseDown: (e) => e.stopPropagation(), onClick: (e) => e.stopPropagation(), children: [_jsx("input", { type: "url", value: linkUrl, onChange: (e) => setLinkUrl(e.target.value), placeholder: "Enter URL...", className: "w-full px-3 py-2 text-sm border border-neutral-300 dark:border-neutral-700 rounded-lg bg-white dark:bg-neutral-900 text-neutral-900 dark:text-neutral-100 outline-none focus:border-primary", onKeyDown: (e) => {
461
+ if (e.key === 'Enter') {
462
+ handleCreateLink();
463
+ }
464
+ else if (e.key === 'Escape') {
465
+ setShowLinkDialog(false);
466
+ }
467
+ }, autoFocus: true }), _jsxs("div", { className: "flex gap-2 mt-2", children: [_jsx("button", { type: "button", onClick: handleCreateLink, className: "flex-1 px-3 py-1.5 text-xs font-bold bg-primary text-white rounded-lg hover:bg-primary/90 transition-colors", children: "Apply" }), _jsx("button", { type: "button", onClick: () => {
468
+ applyFormat('unlink');
469
+ setShowLinkDialog(false);
470
+ }, className: "px-3 py-1.5 text-xs font-bold border border-neutral-300 dark:border-neutral-700 rounded-lg hover:bg-neutral-100 dark:hover:bg-neutral-700 transition-colors", children: "Remove" })] })] }))] })), hasColors && (_jsxs("div", { className: "relative", children: [_jsx("button", { type: "button", "data-color-picker-button": true, onMouseDown: (e) => {
471
+ e.preventDefault();
472
+ saveSelection(); // Save selection before opening color picker
473
+ // Also check current color when saving selection
474
+ setTimeout(() => {
475
+ const color = getSelectedColor();
476
+ setCurrentColor(color);
477
+ }, 0);
478
+ }, onClick: (e) => {
479
+ e.stopPropagation();
480
+ // Check current color before opening picker
481
+ const color = getSelectedColor();
482
+ setCurrentColor(color);
483
+ setShowColorPicker(!showColorPicker);
484
+ }, className: "p-1.5 rounded hover:bg-neutral-100 dark:hover:bg-neutral-700 transition-colors text-neutral-600 dark:text-neutral-400", title: "Text Color", children: _jsx(Palette, { size: 14 }) }), showColorPicker && (_jsx("div", { "data-color-picker": true, className: "absolute top-full left-1/2 -translate-x-1/2 mt-2 p-2.5 bg-white dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-700 rounded-lg shadow-xl z-[60]", style: {
485
+ minWidth: 'fit-content',
486
+ maxWidth: 'none',
487
+ isolation: 'isolate'
488
+ }, onMouseDown: (e) => e.stopPropagation(), onClick: (e) => e.stopPropagation(), children: _jsxs("div", { className: "flex items-center gap-2 flex-nowrap", children: [currentColor && (_jsx("button", { type: "button", onMouseDown: (e) => {
489
+ e.preventDefault();
490
+ e.stopPropagation();
491
+ }, onClick: (e) => {
492
+ e.preventDefault();
493
+ e.stopPropagation();
494
+ handleRemoveColor();
495
+ setCurrentColor(null);
496
+ }, className: "flex-shrink-0 px-2.5 py-1.5 text-xs font-medium border border-neutral-300 dark:border-neutral-600 rounded-md hover:bg-neutral-100 dark:hover:bg-neutral-700 transition-colors text-neutral-700 dark:text-neutral-300", title: "Remove Color", children: "Remove" })), formatting?.colors?.map((color) => {
497
+ // Map text color classes to background colors for display
498
+ const getBackgroundColor = (colorKey) => {
499
+ // Remove 'text-' prefix if present
500
+ const baseColor = colorKey.replace(/^text-/, '');
501
+ // Map to actual color values
502
+ const colorMap = {
503
+ 'forest': '#6B7C5A',
504
+ 'sage': '#9CAF88',
505
+ 'primary': '#94b17b',
506
+ 'soft-green': '#A8C09A',
507
+ };
508
+ return colorMap[baseColor] || '#6B7C5A'; // Default to forest
509
+ };
510
+ const bgColor = getBackgroundColor(color);
511
+ const colorName = color.replace(/^text-/, '');
512
+ return (_jsx("button", { type: "button", onMouseDown: (e) => {
513
+ e.preventDefault();
514
+ e.stopPropagation();
515
+ }, onClick: (e) => {
516
+ e.preventDefault();
517
+ e.stopPropagation();
518
+ handleApplyColor(color);
519
+ }, className: "relative group flex-shrink-0 w-8 h-8 rounded-md border border-neutral-300 dark:border-neutral-600 hover:border-neutral-500 dark:hover:border-neutral-400 transition-all duration-150 hover:scale-110 active:scale-95", style: {
520
+ backgroundColor: bgColor,
521
+ boxShadow: 'inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 2px rgba(0, 0, 0, 0.1)'
522
+ }, title: colorName.charAt(0).toUpperCase() + colorName.slice(1), children: _jsx("span", { className: "sr-only", children: colorName }) }, color));
523
+ })] }) }))] }))] })), _jsx("div", { ref: editorRef, contentEditable: true, onInput: handleInput, onPaste: handlePaste, onKeyDown: handleKeyDown, onSelect: () => {
524
+ // Small delay to ensure selection is updated
525
+ setTimeout(() => {
526
+ handleSelectionChange();
527
+ }, 0);
528
+ }, onMouseUp: (e) => {
529
+ // Don't trigger selection change if clicking on toolbar/dropdowns
530
+ const target = e.target;
531
+ if (!target.closest('[class*="z-50"], [class*="z-[60]"]')) {
532
+ // Small delay to ensure selection is updated
533
+ setTimeout(() => {
534
+ handleSelectionChange();
535
+ }, 0);
536
+ }
537
+ }, onKeyUp: () => {
538
+ // Small delay to ensure selection is updated
539
+ setTimeout(() => {
540
+ handleSelectionChange();
541
+ }, 0);
542
+ }, onBlur: () => {
543
+ // Hide toolbar when editor loses focus (unless dropdowns are open)
544
+ if (!showColorPicker && !showLinkDialog) {
545
+ setTimeout(() => {
546
+ const selection = window.getSelection();
547
+ if (!selection || selection.rangeCount === 0 || selection.getRangeAt(0).collapsed) {
548
+ setShowToolbar(false);
549
+ setSelectedText('');
550
+ }
551
+ }, 100); // Small delay to allow dropdown clicks
552
+ }
553
+ }, "data-placeholder": placeholder, className: `outline-none min-h-[24px] ${!value || value === '<br>' || value === '<div><br></div>'
554
+ ? 'before:content-[attr(data-placeholder)] before:text-neutral-400 dark:before:text-neutral-500 before:pointer-events-none'
555
+ : ''}`, style: { userSelect: 'text' } })] }));
556
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Rich Text Preview Component
3
+ * Renders HTML content with client-provided styles
4
+ * Also supports plain text with formatting markers using the plugin-content parser
5
+ */
6
+ import { RichTextFormattingConfig } from './RichTextEditor';
7
+ export interface RichTextPreviewProps {
8
+ /** HTML content or plain text with formatting markers to render */
9
+ content: string;
10
+ /** Formatting configuration (for applying client styles to HTML) */
11
+ formatting?: RichTextFormattingConfig;
12
+ /** Additional CSS classes */
13
+ className?: string;
14
+ }
15
+ export declare function RichTextPreview({ content, formatting, className, }: RichTextPreviewProps): import("react/jsx-runtime").JSX.Element;
16
+ //# sourceMappingURL=RichTextPreview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RichTextPreview.d.ts","sourceRoot":"","sources":["../../../src/lib/rich-text/RichTextPreview.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAG5D,MAAM,WAAW,oBAAoB;IACjC,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,UAAU,CAAC,EAAE,wBAAwB,CAAC;IACtC,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAkBD,wBAAgB,eAAe,CAAC,EAC5B,OAAO,EACP,UAAU,EACV,SAAc,GACjB,EAAE,oBAAoB,2CAuKtB"}