@jhits/plugin-blog 0.0.8 → 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 (439) 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 -59
  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/views/CanvasEditor/BlockWrapper.d.ts +16 -0
  333. package/src/views/CanvasEditor/BlockWrapper.d.ts.map +1 -0
  334. package/src/views/CanvasEditor/BlockWrapper.js +276 -0
  335. package/src/views/CanvasEditor/CanvasEditorView.d.ts +14 -0
  336. package/src/views/CanvasEditor/CanvasEditorView.d.ts.map +1 -0
  337. package/src/views/CanvasEditor/CanvasEditorView.js +209 -0
  338. package/src/views/CanvasEditor/EditorBody.d.ts +22 -0
  339. package/src/views/CanvasEditor/EditorBody.d.ts.map +1 -0
  340. package/src/views/CanvasEditor/EditorBody.js +505 -0
  341. package/src/views/CanvasEditor/EditorHeader.d.ts +18 -0
  342. package/src/views/CanvasEditor/EditorHeader.d.ts.map +1 -0
  343. package/src/views/CanvasEditor/EditorHeader.js +101 -0
  344. package/src/views/CanvasEditor/LayoutContainer.d.ts +17 -0
  345. package/src/views/CanvasEditor/LayoutContainer.d.ts.map +1 -0
  346. package/src/views/CanvasEditor/LayoutContainer.js +222 -0
  347. package/src/views/CanvasEditor/SaveConfirmationModal.d.ts +13 -0
  348. package/src/views/CanvasEditor/SaveConfirmationModal.d.ts.map +1 -0
  349. package/src/views/CanvasEditor/SaveConfirmationModal.js +78 -0
  350. package/src/views/CanvasEditor/components/CustomBlockItem.d.ts +14 -0
  351. package/src/views/CanvasEditor/components/CustomBlockItem.d.ts.map +1 -0
  352. package/src/views/CanvasEditor/components/CustomBlockItem.js +44 -0
  353. package/src/views/CanvasEditor/components/EditorCanvas.d.ts +29 -0
  354. package/src/views/CanvasEditor/components/EditorCanvas.d.ts.map +1 -0
  355. package/src/views/CanvasEditor/components/EditorCanvas.js +32 -0
  356. package/src/views/CanvasEditor/components/EditorLibrary.d.ts +7 -0
  357. package/src/views/CanvasEditor/components/EditorLibrary.d.ts.map +1 -0
  358. package/src/views/CanvasEditor/components/EditorLibrary.js +25 -0
  359. package/src/views/CanvasEditor/components/EditorSidebar.d.ts +13 -0
  360. package/src/views/CanvasEditor/components/EditorSidebar.d.ts.map +1 -0
  361. package/src/views/CanvasEditor/components/EditorSidebar.js +20 -0
  362. package/src/views/CanvasEditor/components/ErrorBanner.d.ts +6 -0
  363. package/src/views/CanvasEditor/components/ErrorBanner.d.ts.map +1 -0
  364. package/src/views/CanvasEditor/components/ErrorBanner.js +8 -0
  365. package/src/views/CanvasEditor/components/FeaturedMediaSection.d.ts +25 -0
  366. package/src/views/CanvasEditor/components/FeaturedMediaSection.d.ts.map +1 -0
  367. package/src/views/CanvasEditor/components/FeaturedMediaSection.js +182 -0
  368. package/src/views/CanvasEditor/components/LibraryItem.d.ts +14 -0
  369. package/src/views/CanvasEditor/components/LibraryItem.d.ts.map +1 -0
  370. package/src/views/CanvasEditor/components/LibraryItem.js +43 -0
  371. package/src/views/CanvasEditor/components/PrivacySettingsSection.d.ts +15 -0
  372. package/src/views/CanvasEditor/components/PrivacySettingsSection.d.ts.map +1 -0
  373. package/src/views/CanvasEditor/components/PrivacySettingsSection.js +63 -0
  374. package/src/views/CanvasEditor/components/index.d.ts +21 -0
  375. package/src/views/CanvasEditor/components/index.d.ts.map +1 -0
  376. package/src/views/CanvasEditor/components/index.js +12 -0
  377. package/src/views/CanvasEditor/hooks/index.d.ts +10 -0
  378. package/src/views/CanvasEditor/hooks/index.d.ts.map +1 -0
  379. package/src/views/CanvasEditor/hooks/index.js +9 -0
  380. package/src/views/CanvasEditor/hooks/useHeroBlock.d.ts +8 -0
  381. package/src/views/CanvasEditor/hooks/useHeroBlock.d.ts.map +1 -0
  382. package/src/views/CanvasEditor/hooks/useHeroBlock.js +79 -0
  383. package/src/views/CanvasEditor/hooks/useKeyboardShortcuts.d.ts +3 -0
  384. package/src/views/CanvasEditor/hooks/useKeyboardShortcuts.d.ts.map +1 -0
  385. package/src/views/CanvasEditor/hooks/useKeyboardShortcuts.js +114 -0
  386. package/src/views/CanvasEditor/hooks/usePostLoader.d.ts +5 -0
  387. package/src/views/CanvasEditor/hooks/usePostLoader.d.ts.map +1 -0
  388. package/src/views/CanvasEditor/hooks/usePostLoader.js +32 -0
  389. package/src/views/CanvasEditor/hooks/useRegisteredBlocks.d.ts +2 -0
  390. package/src/views/CanvasEditor/hooks/useRegisteredBlocks.d.ts.map +1 -0
  391. package/src/views/CanvasEditor/hooks/useRegisteredBlocks.js +47 -0
  392. package/src/views/CanvasEditor/hooks/useUnsavedChanges.d.ts +25 -0
  393. package/src/views/CanvasEditor/hooks/useUnsavedChanges.d.ts.map +1 -0
  394. package/src/views/CanvasEditor/hooks/useUnsavedChanges.js +285 -0
  395. package/src/views/CanvasEditor/index.d.ts +16 -0
  396. package/src/views/CanvasEditor/index.d.ts.map +1 -0
  397. package/src/views/CanvasEditor/index.js +9 -0
  398. package/src/views/PostManager/EmptyState.d.ts +10 -0
  399. package/src/views/PostManager/EmptyState.d.ts.map +1 -0
  400. package/src/views/PostManager/EmptyState.js +12 -0
  401. package/src/views/PostManager/PostActionsMenu.d.ts +12 -0
  402. package/src/views/PostManager/PostActionsMenu.d.ts.map +1 -0
  403. package/src/views/PostManager/PostActionsMenu.js +58 -0
  404. package/src/views/PostManager/PostCards.d.ts +15 -0
  405. package/src/views/PostManager/PostCards.d.ts.map +1 -0
  406. package/src/views/PostManager/PostCards.js +79 -0
  407. package/src/views/PostManager/PostFilters.d.ts +16 -0
  408. package/src/views/PostManager/PostFilters.d.ts.map +1 -0
  409. package/src/views/PostManager/PostFilters.js +10 -0
  410. package/src/views/PostManager/PostManagerView.d.ts +11 -0
  411. package/src/views/PostManager/PostManagerView.d.ts.map +1 -0
  412. package/src/views/PostManager/PostManagerView.js +174 -0
  413. package/src/views/PostManager/PostStats.d.ts +11 -0
  414. package/src/views/PostManager/PostStats.d.ts.map +1 -0
  415. package/src/views/PostManager/PostStats.js +46 -0
  416. package/src/views/PostManager/PostTable.d.ts +15 -0
  417. package/src/views/PostManager/PostTable.d.ts.map +1 -0
  418. package/src/views/PostManager/PostTable.js +79 -0
  419. package/src/views/PostManager/index.d.ts +12 -0
  420. package/src/views/PostManager/index.d.ts.map +1 -0
  421. package/src/views/PostManager/index.js +11 -0
  422. package/src/views/Preview/PreviewBridgeView.d.ts +12 -0
  423. package/src/views/Preview/PreviewBridgeView.d.ts.map +1 -0
  424. package/src/views/Preview/PreviewBridgeView.js +11 -0
  425. package/src/views/Preview/index.d.ts +6 -0
  426. package/src/views/Preview/index.d.ts.map +1 -0
  427. package/src/views/Preview/index.js +4 -0
  428. package/src/views/Settings/SettingsView.d.ts +10 -0
  429. package/src/views/Settings/SettingsView.d.ts.map +1 -0
  430. package/src/views/Settings/SettingsView.js +111 -0
  431. package/src/views/Settings/index.d.ts +6 -0
  432. package/src/views/Settings/index.d.ts.map +1 -0
  433. package/src/views/Settings/index.js +4 -0
  434. package/src/views/SlugSEO/SlugSEOManagerView.d.ts +12 -0
  435. package/src/views/SlugSEO/SlugSEOManagerView.d.ts.map +1 -0
  436. package/src/views/SlugSEO/SlugSEOManagerView.js +11 -0
  437. package/src/views/SlugSEO/index.d.ts +6 -0
  438. package/src/views/SlugSEO/index.d.ts.map +1 -0
  439. package/src/views/SlugSEO/index.js +4 -0
@@ -0,0 +1,505 @@
1
+ /**
2
+ * Editor Body Component
3
+ * Primary root container for the editor canvas
4
+ * Acts as the main drop zone for blocks
5
+ */
6
+ 'use client';
7
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
8
+ import { useState, useRef, Fragment, useEffect } from 'react';
9
+ import { Plus } from 'lucide-react';
10
+ import { BlockWrapper } from './BlockWrapper';
11
+ export function EditorBody({ blocks, onBlockAdd, onBlockUpdate, onBlockDelete, onBlockMove, darkMode = true, backgroundColors, }) {
12
+ // --- State ---
13
+ const [dragOverIndex, setDragOverIndex] = useState(null);
14
+ const [isDragging, setIsDragging] = useState(false);
15
+ const [draggedBlockId, setDraggedBlockId] = useState(null);
16
+ const [dropIndicatorPosition, setDropIndicatorPosition] = useState(null);
17
+ const [calculatedInsertIndex, setCalculatedInsertIndex] = useState(null);
18
+ // --- Refs ---
19
+ const containerRef = useRef(null);
20
+ const blockRefs = useRef(new Map());
21
+ // --- Cleanup & Event Listeners ---
22
+ useEffect(() => {
23
+ const handleClearIndicator = () => {
24
+ setDropIndicatorPosition(null);
25
+ setDragOverIndex(null);
26
+ };
27
+ const container = containerRef.current;
28
+ if (container) {
29
+ container.addEventListener('clear-drop-indicator', handleClearIndicator);
30
+ return () => {
31
+ container.removeEventListener('clear-drop-indicator', handleClearIndicator);
32
+ };
33
+ }
34
+ }, []);
35
+ useEffect(() => {
36
+ const handleGlobalDragEnd = () => {
37
+ setDropIndicatorPosition(null);
38
+ setDragOverIndex(null);
39
+ setIsDragging(false);
40
+ setDraggedBlockId(null);
41
+ setCalculatedInsertIndex(null);
42
+ };
43
+ document.addEventListener('dragend', handleGlobalDragEnd);
44
+ return () => {
45
+ document.removeEventListener('dragend', handleGlobalDragEnd);
46
+ };
47
+ }, []);
48
+ // --- Helper Functions ---
49
+ const setBlockRef = (blockId) => (el) => {
50
+ if (el) {
51
+ blockRefs.current.set(blockId, el);
52
+ }
53
+ else {
54
+ blockRefs.current.delete(blockId);
55
+ }
56
+ };
57
+ // --- Drag & Drop Logic ---
58
+ const handleDragStart = (e) => {
59
+ // This is called when dragging starts from the container
60
+ // The actual block drag start is handled in BlockWrapper
61
+ setIsDragging(true);
62
+ };
63
+ const handleDragOver = (e, index, element) => {
64
+ e.preventDefault();
65
+ e.stopPropagation();
66
+ // Check if we're dragging over a nested container - if so, clear our indicator
67
+ const target = e.target;
68
+ const nestedContainer = target.closest('[data-layout-container]');
69
+ if (nestedContainer && nestedContainer !== containerRef.current) {
70
+ // We're over a nested container, clear our indicator
71
+ setDropIndicatorPosition(null);
72
+ setDragOverIndex(null);
73
+ return;
74
+ }
75
+ setDragOverIndex(index);
76
+ // Calculate position for absolute drop indicator - always show between blocks
77
+ const container = containerRef.current;
78
+ if (container && element) {
79
+ requestAnimationFrame(() => {
80
+ // Double-check refs are still valid inside RAF callback
81
+ if (!containerRef.current)
82
+ return;
83
+ const containerRect = containerRef.current.getBoundingClientRect();
84
+ const elementRect = element.getBoundingClientRect();
85
+ const mouseY = e.clientY;
86
+ const relativeTop = mouseY - containerRect.top;
87
+ const elementTop = elementRect.top - containerRect.top;
88
+ const elementBottom = elementRect.bottom - containerRect.top;
89
+ const elementCenter = elementTop + elementRect.height / 2;
90
+ // Calculate width - use container width minus padding (32px on each side)
91
+ const padding = 32;
92
+ const width = containerRect.width - (padding * 2);
93
+ let finalTop;
94
+ // Determine if we should show above or below the element
95
+ if (relativeTop < elementCenter) {
96
+ // Show above this block - position between previous block and current block
97
+ if (index === 0) {
98
+ // First block - show at top of container (before first block)
99
+ finalTop = 0;
100
+ }
101
+ else {
102
+ // Get previous block to find the gap
103
+ const prevBlock = blocks[index - 1];
104
+ const prevBlockEl = blockRefs.current.get(prevBlock.id);
105
+ if (prevBlockEl) {
106
+ const prevBlockRect = prevBlockEl.getBoundingClientRect();
107
+ const prevBlockBottom = prevBlockRect.bottom - containerRect.top;
108
+ // Position in the middle of the gap (mb-6 = 24px margin)
109
+ finalTop = prevBlockBottom + 12; // Half of the 24px gap
110
+ }
111
+ else {
112
+ finalTop = elementTop;
113
+ }
114
+ }
115
+ }
116
+ else {
117
+ // Show below this block - position between current block and next block
118
+ if (index === blocks.length - 1) {
119
+ // Last block - show after it
120
+ finalTop = elementBottom;
121
+ }
122
+ else {
123
+ // Get next block to find the gap
124
+ const nextBlock = blocks[index + 1];
125
+ const nextBlockEl = blockRefs.current.get(nextBlock.id);
126
+ if (nextBlockEl) {
127
+ const nextBlockRect = nextBlockEl.getBoundingClientRect();
128
+ const nextBlockTop = nextBlockRect.top - containerRect.top;
129
+ // Position in the middle of the gap
130
+ finalTop = elementBottom + (nextBlockTop - elementBottom) / 2;
131
+ }
132
+ else {
133
+ finalTop = elementBottom;
134
+ }
135
+ }
136
+ }
137
+ setDropIndicatorPosition({
138
+ top: finalTop,
139
+ left: padding,
140
+ width: width,
141
+ });
142
+ });
143
+ }
144
+ };
145
+ const handleDragLeave = (e) => {
146
+ // Only clear if we're actually leaving the container
147
+ // Check if we're moving to a child element (nested container)
148
+ const relatedTarget = e.relatedTarget;
149
+ if (!e.currentTarget.contains(relatedTarget)) {
150
+ // Check if relatedTarget is inside a nested LayoutContainer
151
+ const isMovingToNested = relatedTarget && relatedTarget.closest('[data-layout-container]');
152
+ if (!isMovingToNested) {
153
+ setDragOverIndex(null);
154
+ setDropIndicatorPosition(null);
155
+ setCalculatedInsertIndex(null);
156
+ setIsDragging(false);
157
+ }
158
+ }
159
+ };
160
+ const handleDrop = (e, index, containerId) => {
161
+ e.preventDefault();
162
+ e.stopPropagation();
163
+ const dataTransferBlockId = e.dataTransfer.getData('block-id');
164
+ const globalBlockId = typeof window !== 'undefined' ? window.__DRAGGED_BLOCK_ID__ : null;
165
+ const blockId = dataTransferBlockId || globalBlockId;
166
+ const blockType = e.dataTransfer.getData('block-type');
167
+ console.log('[EditorBody] Drop Event:', {
168
+ index,
169
+ containerId,
170
+ dataTransferBlockId,
171
+ globalBlockId,
172
+ resolvedBlockId: blockId,
173
+ blockType,
174
+ currentBlocks: blocks.map(b => ({ id: b.id, type: b.type })),
175
+ rootBlockIds: blocks.map(b => b.id),
176
+ });
177
+ // Clear the global dragged block ID
178
+ if (typeof window !== 'undefined') {
179
+ window.__DRAGGED_BLOCK_ID__ = null;
180
+ }
181
+ if (blockId) {
182
+ // Moving existing block - check if it's in root or nested
183
+ const currentIndex = blocks.findIndex(b => b.id === blockId);
184
+ console.log('[EditorBody] Block location check:', {
185
+ blockId,
186
+ currentIndex,
187
+ isInRoot: currentIndex !== -1,
188
+ targetIndex: index,
189
+ containerId,
190
+ });
191
+ if (currentIndex !== -1) {
192
+ // Block is in root level - move to container or within root
193
+ if (containerId) {
194
+ // Moving from root to container
195
+ console.log('[EditorBody] Moving from root to container:', { blockId, index, containerId });
196
+ onBlockMove(blockId, index, containerId);
197
+ }
198
+ else if (currentIndex !== index) {
199
+ // Moving within root level
200
+ const targetIndex = currentIndex < index ? index - 1 : index;
201
+ console.log('[EditorBody] Moving within root:', { blockId, currentIndex, targetIndex });
202
+ onBlockMove(blockId, targetIndex);
203
+ }
204
+ else {
205
+ console.log('[EditorBody] Block already at target position, no move needed');
206
+ }
207
+ }
208
+ else {
209
+ // Block is nested somewhere - need to move it to this location
210
+ console.log('[EditorBody] Moving nested block to root:', { blockId, index, containerId: containerId || 'root' });
211
+ // Pass undefined containerId to move to root
212
+ onBlockMove(blockId, index, undefined);
213
+ }
214
+ }
215
+ else if (blockType) {
216
+ // Adding new block from library
217
+ console.log('[EditorBody] Adding new block from library:', { blockType, index, containerId });
218
+ onBlockAdd(blockType, index, containerId);
219
+ }
220
+ else {
221
+ console.warn('[EditorBody] Drop event with no block ID or type!');
222
+ }
223
+ setDragOverIndex(null);
224
+ setIsDragging(false);
225
+ setDraggedBlockId(null);
226
+ setDropIndicatorPosition(null);
227
+ setCalculatedInsertIndex(null);
228
+ };
229
+ const handleBodyDragOver = (e) => {
230
+ e.preventDefault();
231
+ e.stopPropagation();
232
+ // Check if we're dragging over a nested container - if so, clear our indicator
233
+ const target = e.target;
234
+ const nestedContainer = target.closest('[data-layout-container]');
235
+ if (nestedContainer && nestedContainer !== containerRef.current) {
236
+ // We're over a nested container, clear our indicator
237
+ setDropIndicatorPosition(null);
238
+ setDragOverIndex(null);
239
+ setCalculatedInsertIndex(null);
240
+ setIsDragging(false);
241
+ return;
242
+ }
243
+ setIsDragging(true);
244
+ // Calculate drop indicator position based on mouse Y position relative to blocks
245
+ const container = containerRef.current;
246
+ if (container && blocks.length > 0) {
247
+ requestAnimationFrame(() => {
248
+ if (!containerRef.current)
249
+ return;
250
+ const containerRect = containerRef.current.getBoundingClientRect();
251
+ const mouseY = e.clientY;
252
+ const relativeTop = mouseY - containerRect.top;
253
+ const padding = 32;
254
+ const width = containerRect.width - (padding * 2);
255
+ // Find the closest insertion point based on block positions - always between blocks
256
+ let insertIndex = blocks.length; // Default to end
257
+ let indicatorTop = containerRect.height; // Default to bottom
258
+ // Check each block to find where to insert
259
+ for (let i = 0; i < blocks.length; i++) {
260
+ const blockEl = blockRefs.current.get(blocks[i].id);
261
+ if (blockEl) {
262
+ const blockRect = blockEl.getBoundingClientRect();
263
+ const blockTop = blockRect.top - containerRect.top;
264
+ const blockBottom = blockRect.bottom - containerRect.top;
265
+ const blockCenter = blockTop + blockRect.height / 2;
266
+ // If mouse is above this block's center, insert before it
267
+ if (relativeTop < blockCenter) {
268
+ insertIndex = i;
269
+ if (i === 0) {
270
+ // First block - show at top
271
+ indicatorTop = 0;
272
+ }
273
+ else {
274
+ // Get previous block to find the gap
275
+ const prevBlock = blocks[i - 1];
276
+ const prevBlockEl = blockRefs.current.get(prevBlock.id);
277
+ if (prevBlockEl) {
278
+ const prevBlockRect = prevBlockEl.getBoundingClientRect();
279
+ const prevBlockBottom = prevBlockRect.bottom - containerRect.top;
280
+ // Position in the middle of the gap
281
+ indicatorTop = prevBlockBottom + (blockTop - prevBlockBottom) / 2;
282
+ }
283
+ else {
284
+ indicatorTop = blockTop;
285
+ }
286
+ }
287
+ break;
288
+ }
289
+ // If mouse is below this block's center, check if we should insert after it
290
+ else if (i === blocks.length - 1 || relativeTop < blockBottom) {
291
+ insertIndex = i + 1;
292
+ if (i === blocks.length - 1) {
293
+ // Last block - show after it
294
+ indicatorTop = blockBottom;
295
+ }
296
+ else {
297
+ // Get next block to find the gap
298
+ const nextBlock = blocks[i + 1];
299
+ const nextBlockEl = blockRefs.current.get(nextBlock.id);
300
+ if (nextBlockEl) {
301
+ const nextBlockRect = nextBlockEl.getBoundingClientRect();
302
+ const nextBlockTop = nextBlockRect.top - containerRect.top;
303
+ // Position in the middle of the gap
304
+ indicatorTop = blockBottom + (nextBlockTop - blockBottom) / 2;
305
+ }
306
+ else {
307
+ indicatorTop = blockBottom;
308
+ }
309
+ }
310
+ break;
311
+ }
312
+ }
313
+ }
314
+ // If we didn't find a position, use the last block's bottom
315
+ if (insertIndex === blocks.length) {
316
+ const lastBlockEl = blockRefs.current.get(blocks[blocks.length - 1].id);
317
+ if (lastBlockEl) {
318
+ const lastBlockRect = lastBlockEl.getBoundingClientRect();
319
+ indicatorTop = lastBlockRect.bottom - containerRect.top;
320
+ }
321
+ }
322
+ setCalculatedInsertIndex(insertIndex);
323
+ setDropIndicatorPosition({
324
+ top: indicatorTop,
325
+ left: padding,
326
+ width: width,
327
+ });
328
+ });
329
+ }
330
+ else if (container) {
331
+ // No blocks, show indicator at top
332
+ requestAnimationFrame(() => {
333
+ if (!containerRef.current)
334
+ return;
335
+ const containerRect = containerRef.current.getBoundingClientRect();
336
+ const padding = 32;
337
+ const width = containerRect.width - (padding * 2);
338
+ setCalculatedInsertIndex(0);
339
+ setDropIndicatorPosition({
340
+ top: 0,
341
+ left: padding,
342
+ width: width,
343
+ });
344
+ });
345
+ }
346
+ };
347
+ const handleBodyDrop = (e) => {
348
+ e.preventDefault();
349
+ e.stopPropagation();
350
+ const dataTransferBlockId = e.dataTransfer.getData('block-id');
351
+ const globalBlockId = typeof window !== 'undefined' ? window.__DRAGGED_BLOCK_ID__ : null;
352
+ const blockId = dataTransferBlockId || globalBlockId;
353
+ const blockType = e.dataTransfer.getData('block-type');
354
+ // Use the calculated insert index if available, otherwise calculate it now
355
+ let targetIndex = calculatedInsertIndex !== null ? calculatedInsertIndex : blocks.length;
356
+ // If we don't have a calculated index, calculate it based on mouse position
357
+ if (calculatedInsertIndex === null && containerRef.current && blocks.length > 0) {
358
+ const containerRect = containerRef.current.getBoundingClientRect();
359
+ const mouseY = e.clientY;
360
+ const relativeTop = mouseY - containerRect.top;
361
+ for (let i = 0; i < blocks.length; i++) {
362
+ const blockEl = blockRefs.current.get(blocks[i].id);
363
+ if (blockEl) {
364
+ const blockRect = blockEl.getBoundingClientRect();
365
+ const blockTop = blockRect.top - containerRect.top;
366
+ const blockCenter = blockTop + blockRect.height / 2;
367
+ if (relativeTop < blockCenter) {
368
+ targetIndex = i;
369
+ break;
370
+ }
371
+ else if (i === blocks.length - 1) {
372
+ targetIndex = blocks.length;
373
+ break;
374
+ }
375
+ }
376
+ }
377
+ }
378
+ console.log('[EditorBody] Body Drop Event:', {
379
+ dataTransferBlockId,
380
+ globalBlockId,
381
+ resolvedBlockId: blockId,
382
+ blockType,
383
+ calculatedInsertIndex,
384
+ targetIndex,
385
+ currentBlocksCount: blocks.length,
386
+ rootBlockIds: blocks.map(b => b.id),
387
+ });
388
+ // Clear the global dragged block ID
389
+ if (typeof window !== 'undefined') {
390
+ window.__DRAGGED_BLOCK_ID__ = null;
391
+ }
392
+ if (blockId) {
393
+ // Moving existing block to calculated position
394
+ const currentIndex = blocks.findIndex(b => b.id === blockId);
395
+ console.log('[EditorBody] Body drop - block location:', {
396
+ blockId,
397
+ currentIndex,
398
+ isInRoot: currentIndex !== -1,
399
+ targetIndex,
400
+ });
401
+ if (currentIndex !== -1) {
402
+ // Already in root, move to target position
403
+ if (currentIndex !== targetIndex) {
404
+ // Adjust for removal if moving forward
405
+ const adjustedIndex = currentIndex < targetIndex ? targetIndex - 1 : targetIndex;
406
+ console.log('[EditorBody] Moving within root:', { blockId, currentIndex, adjustedIndex });
407
+ onBlockMove(blockId, Math.max(0, adjustedIndex));
408
+ }
409
+ }
410
+ else {
411
+ // Block is nested - move it to root level at target position
412
+ console.log('[EditorBody] Moving nested block to root:', { blockId, targetIndex });
413
+ onBlockMove(blockId, targetIndex, undefined);
414
+ }
415
+ }
416
+ else if (blockType) {
417
+ // Adding new block at calculated position
418
+ console.log('[EditorBody] Adding new block:', { blockType, index: targetIndex });
419
+ onBlockAdd(blockType, targetIndex);
420
+ }
421
+ else {
422
+ console.warn('[EditorBody] Body drop with no block ID or type!');
423
+ }
424
+ setIsDragging(false);
425
+ setDragOverIndex(null);
426
+ setDraggedBlockId(null);
427
+ setDropIndicatorPosition(null);
428
+ setCalculatedInsertIndex(null);
429
+ };
430
+ return (_jsxs("div", { ref: containerRef, className: `relative w-full rounded-[2.5rem] border shadow-lg min-h-[400px] transition-all bg-transparent ${darkMode
431
+ ? 'border-neutral-200 dark:border-neutral-800 shadow-neutral-200/50 dark:shadow-neutral-900/50'
432
+ : 'border-neutral-200 shadow-neutral-200/50'}`, onDragOver: handleBodyDragOver, onDrop: handleBodyDrop, onDragLeave: handleDragLeave, onDragStart: handleDragStart, onDragEnd: () => {
433
+ setDropIndicatorPosition(null);
434
+ setDragOverIndex(null);
435
+ setIsDragging(false);
436
+ setDraggedBlockId(null);
437
+ setCalculatedInsertIndex(null);
438
+ }, children: [dropIndicatorPosition && isDragging && (_jsx(DropIndicator, { position: dropIndicatorPosition, darkMode: darkMode })), _jsx("div", { className: "flex flex-col p-8", onDragOver: (e) => {
439
+ // Only handle if not over a block or nested container
440
+ const target = e.target;
441
+ const isOverBlock = target.closest('[data-block-wrapper]');
442
+ const isOverNestedContainer = target.closest('[data-layout-container]') && target.closest('[data-layout-container]') !== containerRef.current;
443
+ if (!isOverBlock && !isOverNestedContainer) {
444
+ handleBodyDragOver(e);
445
+ }
446
+ }, onDrop: (e) => {
447
+ // Only handle if not over a block or nested container
448
+ const target = e.target;
449
+ const isOverBlock = target.closest('[data-block-wrapper]');
450
+ const isOverNestedContainer = target.closest('[data-layout-container]') && target.closest('[data-layout-container]') !== containerRef.current;
451
+ if (!isOverBlock && !isOverNestedContainer) {
452
+ handleBodyDrop(e);
453
+ }
454
+ }, children: blocks.length === 0 ? (_jsx(EmptyState, { isDragging: isDragging, darkMode: darkMode })) : (blocks.map((block, index) => (_jsxs(Fragment, { children: [index > 0 && (_jsx("div", { className: `h-6 transition-all duration-200 ${isDragging && dragOverIndex === index
455
+ ? 'bg-primary/5 border-y border-dashed border-primary/20 rounded-lg'
456
+ : 'bg-transparent'}` })), _jsx("div", { ref: setBlockRef(block.id), onDragOver: (e) => {
457
+ const blockEl = blockRefs.current.get(block.id);
458
+ if (blockEl) {
459
+ handleDragOver(e, index, blockEl);
460
+ }
461
+ }, onDragLeave: handleDragLeave, onDrop: (e) => handleDrop(e, index), className: "relative mb-6 last:mb-0", children: _jsx(BlockWrapper, { block: block, onUpdate: (data) => onBlockUpdate(block.id, data), onDelete: () => onBlockDelete(block.id), onMoveUp: index > 0 ? () => onBlockMove(block.id, index - 1) : undefined, onMoveDown: index < blocks.length - 1 ? () => onBlockMove(block.id, index + 1) : undefined, allBlocks: blocks }) })] }, block.id)))) })] }));
462
+ }
463
+ /**
464
+ * Visual Line that shows where the block will land
465
+ */
466
+ function DropIndicator({ position, darkMode }) {
467
+ return (_jsxs("div", { className: "absolute z-50 pointer-events-none", style: {
468
+ top: `${position.top - 12}px`,
469
+ left: `${position.left}px`,
470
+ width: `${position.width}px`,
471
+ height: '24px',
472
+ }, children: [_jsx("div", { className: `absolute inset-0 rounded-lg border border-dashed backdrop-blur-sm ${darkMode
473
+ ? 'bg-primary/10 dark:bg-primary/20 border-primary dark:border-primary/60'
474
+ : 'bg-primary/10 border-primary'}` }), _jsx("div", { className: `absolute top-1/2 left-0 right-0 h-0.5 rounded-full transform -translate-y-1/2 ${darkMode ? 'bg-primary dark:bg-primary/80' : 'bg-primary'}` }), _jsx("div", { className: "absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2", children: _jsx("div", { className: `w-6 h-6 rounded-full flex items-center justify-center shadow-lg shadow-primary/30 ${darkMode ? 'bg-primary dark:bg-primary/90' : 'bg-primary'}`, children: _jsx("div", { className: `w-2 h-2 rounded-full ${darkMode ? 'bg-white dark:bg-neutral-900' : 'bg-white'}` }) }) })] }));
475
+ }
476
+ /**
477
+ * Placeholder when the editor is empty
478
+ */
479
+ function EmptyState({ isDragging, darkMode }) {
480
+ return (_jsxs("div", { className: `flex flex-col items-center justify-center py-20 px-8 rounded-2xl border border-dashed transition-all ${darkMode
481
+ ? isDragging
482
+ ? 'border-primary/30 bg-primary/5 dark:bg-primary/10'
483
+ : 'border-gray-200/50 dark:border-neutral-700/50 bg-neutral-50/50 dark:bg-neutral-800/30'
484
+ : isDragging
485
+ ? 'border-primary/30 bg-primary/5'
486
+ : 'border-gray-200/50 bg-neutral-50/50'}`, children: [_jsx("div", { className: `p-4 rounded-full mb-4 transition-colors ${darkMode
487
+ ? isDragging
488
+ ? 'bg-primary/10 dark:bg-primary/20'
489
+ : 'bg-neutral-100 dark:bg-neutral-800'
490
+ : isDragging
491
+ ? 'bg-primary/10'
492
+ : 'bg-neutral-100'}`, children: _jsx(Plus, { size: 24, className: `transition-colors ${darkMode
493
+ ? isDragging
494
+ ? 'text-primary'
495
+ : 'text-neutral-400 dark:text-neutral-500'
496
+ : isDragging
497
+ ? 'text-primary'
498
+ : 'text-neutral-400'}` }) }), _jsx("p", { className: `text-sm font-black uppercase tracking-wider transition-colors ${darkMode
499
+ ? isDragging
500
+ ? 'text-primary'
501
+ : 'text-neutral-500 dark:text-neutral-400'
502
+ : isDragging
503
+ ? 'text-primary'
504
+ : 'text-neutral-500'}`, children: isDragging ? 'Drop Block Here' : 'Drop a component here' }), _jsx("p", { className: `text-xs mt-2 ${darkMode ? 'text-neutral-400 dark:text-neutral-500' : 'text-neutral-400'}`, children: "Drag blocks from the library to get started" })] }));
505
+ }
@@ -0,0 +1,18 @@
1
+ export interface EditorHeaderProps {
2
+ isLibraryOpen: boolean;
3
+ onLibraryToggle: () => void;
4
+ isPreviewMode: boolean;
5
+ onPreviewToggle: () => void;
6
+ isSidebarOpen: boolean;
7
+ onSidebarToggle: () => void;
8
+ isSaving: boolean;
9
+ onSave: (publish?: boolean) => Promise<void>;
10
+ onSaveError: (error: string | null) => void;
11
+ autoSaveEnabled?: boolean;
12
+ onAutoSaveToggle?: (enabled: boolean) => void;
13
+ isDirty?: boolean;
14
+ autoSaveCountdown?: number | null;
15
+ autoSaveStatus?: 'idle' | 'saving' | 'saved' | 'error';
16
+ }
17
+ export declare function EditorHeader({ isLibraryOpen, onLibraryToggle, isPreviewMode, onPreviewToggle, isSidebarOpen, onSidebarToggle, isSaving, onSave, onSaveError, autoSaveEnabled, onAutoSaveToggle, isDirty, autoSaveCountdown, autoSaveStatus, }: EditorHeaderProps): import("react/jsx-runtime").JSX.Element;
18
+ //# sourceMappingURL=EditorHeader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditorHeader.d.ts","sourceRoot":"","sources":["EditorHeader.tsx"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAC9B,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;CAC1D;AAED,wBAAgB,YAAY,CAAC,EACzB,aAAa,EACb,eAAe,EACf,aAAa,EACb,eAAe,EACf,aAAa,EACb,eAAe,EACf,QAAQ,EACR,MAAM,EACN,WAAW,EACX,eAAuB,EACvB,gBAAgB,EAChB,OAAe,EACf,iBAAwB,EACxB,cAAuB,GAC1B,EAAE,iBAAiB,2CAmOnB"}
@@ -0,0 +1,101 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ import { ArrowLeft, Library, Settings2, Clock, Edit, Eye } from 'lucide-react';
5
+ import { useEditor } from '../../state/EditorContext';
6
+ import { SaveConfirmationModal } from './SaveConfirmationModal';
7
+ export function EditorHeader({ isLibraryOpen, onLibraryToggle, isPreviewMode, onPreviewToggle, isSidebarOpen, onSidebarToggle, isSaving, onSave, onSaveError, autoSaveEnabled = false, onAutoSaveToggle, isDirty = false, autoSaveCountdown = null, autoSaveStatus = 'idle', }) {
8
+ const { state, dispatch } = useEditor();
9
+ const [showConfirmModal, setShowConfirmModal] = useState(false);
10
+ const [saveAsDraft, setSaveAsDraft] = useState(false);
11
+ const [saveError, setSaveError] = useState(null);
12
+ const handleSaveDraftClick = () => {
13
+ setSaveAsDraft(true);
14
+ setSaveError(null); // Clear any previous errors
15
+ setShowConfirmModal(true);
16
+ };
17
+ const handlePublishClick = () => {
18
+ setSaveAsDraft(false);
19
+ setSaveError(null); // Clear any previous errors
20
+ setShowConfirmModal(true);
21
+ };
22
+ const handleConfirmSave = async () => {
23
+ try {
24
+ const targetStatus = saveAsDraft ? 'draft' : 'published';
25
+ console.log('[EditorHeader] Starting save process...', { saveAsDraft, targetStatus, currentStatus: state.status });
26
+ // Set status before saving - ensure state is updated
27
+ if (saveAsDraft) {
28
+ dispatch({ type: 'SET_STATUS', payload: 'draft' });
29
+ }
30
+ else {
31
+ dispatch({ type: 'SET_STATUS', payload: 'published' });
32
+ }
33
+ // Wait longer to ensure state update propagates through the reducer and context
34
+ // React state updates are asynchronous, so we need to wait for the state to actually update
35
+ await new Promise(resolve => setTimeout(resolve, 150));
36
+ // Verify status was updated
37
+ console.log('[EditorHeader] Status after update:', state.status, 'Expected:', targetStatus);
38
+ await onSave(!saveAsDraft);
39
+ console.log('[EditorHeader] Post saved successfully');
40
+ // Clear any previous errors
41
+ setSaveError(null);
42
+ // Modal will show success message and close automatically
43
+ }
44
+ catch (error) {
45
+ console.error('[EditorHeader] Failed to save post:', error);
46
+ // Extract user-friendly error message
47
+ let errorMessage = error.message || 'Failed to save post';
48
+ // Make error messages more user-friendly
49
+ if (errorMessage.includes('Missing required fields')) {
50
+ // Keep the detailed message about missing fields
51
+ errorMessage = errorMessage.replace('Missing required fields for publishing:', 'To publish, please fill in:');
52
+ }
53
+ else if (errorMessage.includes('All required fields')) {
54
+ errorMessage = 'To publish, please fill in all required fields: summary, featured image, category, and content.';
55
+ }
56
+ else if (errorMessage.includes('Unauthorized')) {
57
+ errorMessage = 'You are not authorized to save this post. Please log in again.';
58
+ }
59
+ else if (errorMessage.includes('Failed to save')) {
60
+ errorMessage = 'Unable to save the post. Please check your connection and try again.';
61
+ }
62
+ setSaveError(errorMessage);
63
+ onSaveError(errorMessage);
64
+ // Re-throw the error so the modal knows it failed and doesn't show success
65
+ throw error;
66
+ }
67
+ };
68
+ return (_jsxs("header", { className: "flex items-center justify-between px-6 py-3 bg-dashboard-sidebar backdrop-blur-md border-b border-dashboard-border flex-none shrink-0", children: [_jsxs("div", { className: "flex items-center gap-6", children: [_jsx("button", { onClick: () => {
69
+ if (isDirty) {
70
+ const confirmed = window.confirm('You have unsaved changes. Are you sure you want to leave? Your changes will be lost.');
71
+ if (!confirmed) {
72
+ return;
73
+ }
74
+ }
75
+ window.location.href = '/dashboard/blog';
76
+ }, className: "text-neutral-500 dark:text-neutral-400 hover:text-neutral-950 dark:hover:text-white transition-colors", children: _jsx(ArrowLeft, { size: 20, strokeWidth: 1.5 }) }), _jsx("div", { className: "h-4 w-[1px] bg-neutral-300 dark:border-neutral-700" }), _jsxs("button", { onClick: onLibraryToggle, className: `flex items-center gap-2 text-[10px] uppercase tracking-widest font-black transition-all ${isLibraryOpen ? 'text-dashboard-text' : 'text-neutral-500 dark:text-neutral-400'}`, children: [_jsx(Library, { size: 16, strokeWidth: 1.5 }), "Library"] })] }), _jsxs("div", { className: "flex items-center gap-4", children: [onAutoSaveToggle && (_jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("button", { onClick: () => onAutoSaveToggle(!autoSaveEnabled), className: `relative flex items-center gap-2 px-3 py-1.5 rounded-full text-[10px] uppercase tracking-widest font-bold transition-all ${autoSaveEnabled
77
+ ? 'bg-primary/20 text-primary border border-primary/30'
78
+ : 'bg-dashboard-bg text-neutral-600 dark:text-neutral-400 border border-dashboard-border hover:text-neutral-950 dark:hover:text-white'}`, title: autoSaveEnabled ? 'Auto-save enabled (saves after 10s of inactivity)' : 'Click to enable auto-save', children: [_jsx(Clock, { size: 12, className: autoSaveEnabled && autoSaveStatus !== 'saving' ? 'animate-pulse' : '' }), _jsx("span", { children: "Auto-save" }), _jsx("span", { className: `ml-1 text-[9px] ${autoSaveEnabled ? 'text-primary' : 'text-neutral-500 dark:text-neutral-400'}`, children: autoSaveEnabled ? 'ON' : 'OFF' }), autoSaveEnabled && isDirty && (_jsxs("span", { className: "ml-1.5 text-[9px] font-bold tabular-nums", children: [autoSaveStatus === 'saving' && (_jsx("span", { className: "text-primary animate-pulse", children: "Saving..." })), autoSaveStatus === 'saved' && (_jsx("span", { className: "text-green-500 dark:text-green-400", children: "Saved!" })), autoSaveStatus === 'error' && (_jsx("span", { className: "text-red-500 dark:text-red-400", children: "Error" })), autoSaveStatus === 'idle' && autoSaveCountdown !== null && (_jsxs("span", { className: "text-primary/70", children: [autoSaveCountdown, "s"] }))] }))] }), isDirty && !autoSaveEnabled && (_jsx("span", { className: "text-[10px] text-amber-500 dark:text-amber-400 font-bold uppercase tracking-widest animate-pulse", children: "Unsaved" }))] })), _jsxs("div", { className: "flex items-center bg-dashboard-bg border border-dashboard-border rounded-full p-1 gap-1", children: [_jsxs("button", { onClick: () => {
79
+ if (isPreviewMode) {
80
+ onPreviewToggle();
81
+ }
82
+ }, className: `flex items-center gap-1.5 px-3 py-1.5 rounded-full text-[10px] uppercase tracking-widest font-bold transition-all ${!isPreviewMode
83
+ ? 'bg-primary text-white shadow-sm'
84
+ : 'text-neutral-600 dark:text-neutral-400 hover:text-neutral-950 dark:hover:text-white'}`, title: "Edit mode - Make changes to your post", children: [_jsx(Edit, { size: 12, strokeWidth: 2.5 }), _jsx("span", { children: "Edit" })] }), _jsxs("button", { onClick: () => {
85
+ if (!isPreviewMode) {
86
+ onPreviewToggle();
87
+ }
88
+ }, className: `flex items-center gap-1.5 px-3 py-1.5 rounded-full text-[10px] uppercase tracking-widest font-bold transition-all ${isPreviewMode
89
+ ? 'bg-primary text-white shadow-sm'
90
+ : 'text-neutral-600 dark:text-neutral-400 hover:text-neutral-950 dark:hover:text-white'}`, title: "Preview mode - See how your post will look", children: [_jsx(Eye, { size: 12, strokeWidth: 2.5 }), _jsx("span", { children: "Preview" })] })] }), (state.status === 'draft' || !state.postId) && (_jsx("button", { onClick: handleSaveDraftClick, disabled: isSaving, className: `px-4 py-2 border-2 border-dashboard-border text-dashboard-text rounded-full text-[10px] font-bold uppercase tracking-widest transition-all ${isSaving
91
+ ? 'opacity-50 cursor-not-allowed'
92
+ : 'hover:bg-dashboard-bg'}`, children: isSaving ? 'Saving...' : 'Save Draft' })), _jsx("button", { onClick: handlePublishClick, disabled: isSaving, className: `px-6 py-2 bg-primary text-white rounded-full text-[10px] font-bold uppercase tracking-widest transition-all shadow-lg shadow-primary/20 ${isSaving
93
+ ? 'opacity-50 cursor-not-allowed'
94
+ : 'hover:bg-primary/90'}`, children: isSaving ? 'Saving...' : state.status === 'published' ? 'Update Post' : 'Publish Post' }), _jsx("button", { onClick: onSidebarToggle, className: `p-2 rounded-full transition-colors ${isSidebarOpen
95
+ ? 'bg-dashboard-bg text-dashboard-text'
96
+ : 'text-neutral-500 dark:text-neutral-400 hover:bg-dashboard-bg'}`, children: _jsx(Settings2, { size: 18 }) })] }), _jsx(SaveConfirmationModal, { isOpen: showConfirmModal, onClose: () => {
97
+ setShowConfirmModal(false);
98
+ setSaveAsDraft(false);
99
+ setSaveError(null);
100
+ }, onConfirm: handleConfirmSave, isSaving: isSaving, postTitle: state.title || undefined, isPublished: state.status === 'published', saveAsDraft: saveAsDraft, error: saveError })] }));
101
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Layout Container Component
3
+ * Recursive drop zone for nested blocks
4
+ */
5
+ import { Block } from '../../types/block';
6
+ export interface LayoutContainerProps {
7
+ blocks: Block[];
8
+ containerId: string;
9
+ onBlockAdd: (type: string, index: number, containerId: string) => void;
10
+ onBlockUpdate: (id: string, data: Partial<Block['data']>, containerId: string) => void;
11
+ onBlockDelete: (id: string, containerId: string) => void;
12
+ onBlockMove: (id: string, newIndex: number, containerId: string) => void;
13
+ className?: string;
14
+ emptyLabel?: string;
15
+ }
16
+ export declare function LayoutContainer({ blocks, containerId, onBlockAdd, onBlockUpdate, onBlockDelete, onBlockMove, className, emptyLabel, }: LayoutContainerProps): import("react/jsx-runtime").JSX.Element;
17
+ //# sourceMappingURL=LayoutContainer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LayoutContainer.d.ts","sourceRoot":"","sources":["LayoutContainer.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAI1C,MAAM,WAAW,oBAAoB;IACjC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACvE,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACvF,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,eAAe,CAAC,EAC5B,MAAM,EACN,WAAW,EACX,UAAU,EACV,aAAa,EACb,aAAa,EACb,WAAW,EACX,SAAc,EACd,UAA+B,GAClC,EAAE,oBAAoB,2CA6OtB"}