@jhits/plugin-blog 0.0.18 → 0.0.20

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 (291) hide show
  1. package/dist/api/categories.d.ts.map +1 -1
  2. package/dist/api/categories.js +42 -38
  3. package/dist/api/handler.d.ts +1 -26
  4. package/dist/api/handler.d.ts.map +1 -1
  5. package/dist/api/handler.js +81 -500
  6. package/dist/api/router.d.ts +0 -5
  7. package/dist/api/router.d.ts.map +1 -1
  8. package/dist/api/router.js +8 -35
  9. package/dist/api/service.d.ts +80 -0
  10. package/dist/api/service.d.ts.map +1 -0
  11. package/dist/api/service.js +219 -0
  12. package/dist/hooks/useAutoSave.d.ts +10 -0
  13. package/dist/hooks/useAutoSave.d.ts.map +1 -0
  14. package/dist/hooks/useAutoSave.js +57 -0
  15. package/dist/hooks/useCategories.d.ts +1 -1
  16. package/dist/hooks/useCategories.d.ts.map +1 -1
  17. package/dist/hooks/useCategories.js +15 -46
  18. package/dist/index.d.ts +24 -31
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +44 -201
  21. package/dist/init.d.ts +20 -7
  22. package/dist/init.d.ts.map +1 -1
  23. package/dist/init.js +8 -7
  24. package/dist/lib/blocks/BlockRenderer.d.ts.map +1 -1
  25. package/dist/lib/layouts/blocks/ColumnsBlock.d.ts.map +1 -1
  26. package/dist/lib/layouts/blocks/ColumnsBlock.js +30 -113
  27. package/dist/lib/layouts/blocks/SectionBlock.d.ts.map +1 -1
  28. package/dist/lib/layouts/blocks/SectionBlock.js +9 -21
  29. package/dist/lib/layouts/index.d.ts +3 -3
  30. package/dist/lib/layouts/index.js +4 -4
  31. package/dist/lib/mappers/apiMapper.d.ts +10 -0
  32. package/dist/lib/mappers/apiMapper.d.ts.map +1 -1
  33. package/dist/lib/mappers/apiMapper.js +47 -32
  34. package/dist/lib/rich-text/RichTextEditor.d.ts +4 -2
  35. package/dist/lib/rich-text/RichTextEditor.d.ts.map +1 -1
  36. package/dist/lib/rich-text/RichTextEditor.js +12 -9
  37. package/dist/lib/utils/config-resolver.d.ts +28 -0
  38. package/dist/lib/utils/config-resolver.d.ts.map +1 -0
  39. package/dist/lib/utils/config-resolver.js +46 -0
  40. package/dist/lib/utils/tree.d.ts +29 -0
  41. package/dist/lib/utils/tree.d.ts.map +1 -0
  42. package/dist/lib/utils/tree.js +129 -0
  43. package/dist/state/EditorContext.d.ts +3 -25
  44. package/dist/state/EditorContext.d.ts.map +1 -1
  45. package/dist/state/EditorContext.js +124 -174
  46. package/dist/state/reducer.d.ts +1 -5
  47. package/dist/state/reducer.d.ts.map +1 -1
  48. package/dist/state/reducer.js +128 -521
  49. package/dist/state/types.d.ts +12 -1
  50. package/dist/state/types.d.ts.map +1 -1
  51. package/dist/types/block.d.ts +9 -0
  52. package/dist/types/block.d.ts.map +1 -1
  53. package/dist/types/post.d.ts +17 -1
  54. package/dist/types/post.d.ts.map +1 -1
  55. package/dist/views/CanvasEditor/BlockWrapper.d.ts +5 -6
  56. package/dist/views/CanvasEditor/BlockWrapper.d.ts.map +1 -1
  57. package/dist/views/CanvasEditor/BlockWrapper.js +56 -264
  58. package/dist/views/CanvasEditor/CanvasEditorView.d.ts +5 -3
  59. package/dist/views/CanvasEditor/CanvasEditorView.d.ts.map +1 -1
  60. package/dist/views/CanvasEditor/CanvasEditorView.js +55 -315
  61. package/dist/views/CanvasEditor/EditorBody.d.ts +6 -8
  62. package/dist/views/CanvasEditor/EditorBody.d.ts.map +1 -1
  63. package/dist/views/CanvasEditor/EditorBody.js +34 -482
  64. package/dist/views/CanvasEditor/EditorHeader.d.ts.map +1 -1
  65. package/dist/views/CanvasEditor/EditorHeader.js +27 -63
  66. package/dist/views/CanvasEditor/LayoutContainer.d.ts.map +1 -1
  67. package/dist/views/CanvasEditor/LayoutContainer.js +49 -70
  68. package/dist/views/CanvasEditor/components/CustomBlockItem.js +1 -1
  69. package/dist/views/CanvasEditor/components/EditorCanvas.d.ts +15 -3
  70. package/dist/views/CanvasEditor/components/EditorCanvas.d.ts.map +1 -1
  71. package/dist/views/CanvasEditor/components/EditorCanvas.js +40 -18
  72. package/dist/views/CanvasEditor/components/EditorLibrary.d.ts +5 -1
  73. package/dist/views/CanvasEditor/components/EditorLibrary.d.ts.map +1 -1
  74. package/dist/views/CanvasEditor/components/EditorLibrary.js +11 -7
  75. package/dist/views/CanvasEditor/components/EditorSidebar.d.ts.map +1 -1
  76. package/dist/views/CanvasEditor/components/EditorSidebar.js +32 -14
  77. package/dist/views/CanvasEditor/components/FeaturedMediaSection.d.ts +0 -6
  78. package/dist/views/CanvasEditor/components/FeaturedMediaSection.d.ts.map +1 -1
  79. package/dist/views/CanvasEditor/components/FeaturedMediaSection.js +17 -128
  80. package/dist/views/CanvasEditor/components/JSONInspector.d.ts +9 -0
  81. package/dist/views/CanvasEditor/components/JSONInspector.d.ts.map +1 -0
  82. package/dist/views/CanvasEditor/components/JSONInspector.js +56 -0
  83. package/dist/views/CanvasEditor/components/LibraryItem.js +2 -2
  84. package/dist/views/CanvasEditor/components/PrivacySettingsSection.d.ts +0 -4
  85. package/dist/views/CanvasEditor/components/PrivacySettingsSection.d.ts.map +1 -1
  86. package/dist/views/CanvasEditor/components/PrivacySettingsSection.js +6 -28
  87. package/dist/views/CanvasEditor/components/index.d.ts +2 -0
  88. package/dist/views/CanvasEditor/components/index.d.ts.map +1 -1
  89. package/dist/views/CanvasEditor/components/index.js +1 -0
  90. package/dist/views/CanvasEditor/hooks/useHeroBlock.d.ts.map +1 -1
  91. package/dist/views/CanvasEditor/hooks/useHeroBlock.js +15 -18
  92. package/dist/views/CanvasEditor/hooks/usePostLoader.d.ts +3 -0
  93. package/dist/views/CanvasEditor/hooks/usePostLoader.d.ts.map +1 -1
  94. package/dist/views/CanvasEditor/hooks/usePostLoader.js +12 -13
  95. package/dist/views/CanvasEditor/hooks/useUnsavedChanges.js +0 -4
  96. package/dist/views/PostManager/EmptyState.d.ts +1 -1
  97. package/dist/views/PostManager/EmptyState.js +4 -4
  98. package/dist/views/PostManager/FilterDropdown.d.ts +21 -0
  99. package/dist/views/PostManager/FilterDropdown.d.ts.map +1 -0
  100. package/dist/views/PostManager/FilterDropdown.js +28 -0
  101. package/dist/views/PostManager/LanguageFlags.d.ts.map +1 -1
  102. package/dist/views/PostManager/LanguageFlags.js +4 -1
  103. package/dist/views/PostManager/PostCards.d.ts.map +1 -1
  104. package/dist/views/PostManager/PostCards.js +23 -40
  105. package/dist/views/PostManager/PostFilters.d.ts.map +1 -1
  106. package/dist/views/PostManager/PostFilters.js +34 -3
  107. package/dist/views/PostManager/PostManagerView.d.ts +1 -2
  108. package/dist/views/PostManager/PostManagerView.d.ts.map +1 -1
  109. package/dist/views/PostManager/PostManagerView.js +30 -96
  110. package/dist/views/PostManager/PostStats.d.ts.map +1 -1
  111. package/dist/views/PostManager/PostStats.js +10 -10
  112. package/dist/views/PostManager/PostTable.d.ts.map +1 -1
  113. package/dist/views/PostManager/PostTable.js +23 -40
  114. package/dist/views/Settings/SettingsView.d.ts +1 -1
  115. package/dist/views/Settings/SettingsView.d.ts.map +1 -1
  116. package/dist/views/Settings/SettingsView.js +12 -39
  117. package/dist/views/SlugSEO/SlugSEOManagerView.d.ts.map +1 -1
  118. package/dist/views/SlugSEO/SlugSEOManagerView.js +2 -2
  119. package/package.json +42 -6
  120. package/src/api/categories.ts +48 -52
  121. package/src/api/handler.ts +87 -604
  122. package/src/api/router.ts +15 -65
  123. package/src/api/service.ts +241 -0
  124. package/src/hooks/useAutoSave.ts +64 -0
  125. package/src/hooks/useCategories.ts +19 -47
  126. package/src/index.tsx +79 -293
  127. package/src/init.tsx +24 -11
  128. package/src/lib/blocks/BlockRenderer.tsx +1 -0
  129. package/src/lib/layouts/blocks/ColumnsBlock.tsx +60 -173
  130. package/src/lib/layouts/blocks/SectionBlock.tsx +22 -26
  131. package/src/lib/layouts/index.ts +4 -4
  132. package/src/lib/mappers/apiMapper.ts +63 -32
  133. package/src/lib/rich-text/RichTextEditor.tsx +16 -9
  134. package/src/lib/utils/config-resolver.ts +64 -0
  135. package/src/lib/utils/tree.ts +150 -0
  136. package/src/state/EditorContext.tsx +153 -232
  137. package/src/state/reducer.ts +141 -606
  138. package/src/state/types.ts +14 -1
  139. package/src/types/block.ts +10 -0
  140. package/src/types/post.ts +19 -1
  141. package/src/views/CanvasEditor/BlockWrapper.tsx +130 -460
  142. package/src/views/CanvasEditor/CanvasEditorView.tsx +145 -420
  143. package/src/views/CanvasEditor/EditorBody.tsx +98 -610
  144. package/src/views/CanvasEditor/EditorHeader.tsx +176 -196
  145. package/src/views/CanvasEditor/LayoutContainer.tsx +74 -89
  146. package/src/views/CanvasEditor/components/CustomBlockItem.tsx +7 -8
  147. package/src/views/CanvasEditor/components/EditorCanvas.tsx +139 -84
  148. package/src/views/CanvasEditor/components/EditorLibrary.tsx +25 -10
  149. package/src/views/CanvasEditor/components/EditorSidebar.tsx +196 -127
  150. package/src/views/CanvasEditor/components/FeaturedMediaSection.tsx +78 -210
  151. package/src/views/CanvasEditor/components/JSONInspector.tsx +125 -0
  152. package/src/views/CanvasEditor/components/LibraryItem.tsx +5 -6
  153. package/src/views/CanvasEditor/components/PrivacySettingsSection.tsx +73 -124
  154. package/src/views/CanvasEditor/components/index.ts +2 -1
  155. package/src/views/CanvasEditor/hooks/useHeroBlock.ts +15 -18
  156. package/src/views/CanvasEditor/hooks/usePostLoader.ts +21 -13
  157. package/src/views/CanvasEditor/hooks/useUnsavedChanges.ts +4 -4
  158. package/src/views/PostManager/EmptyState.tsx +9 -10
  159. package/src/views/PostManager/FilterDropdown.tsx +95 -0
  160. package/src/views/PostManager/LanguageFlags.tsx +6 -2
  161. package/src/views/PostManager/PostCards.tsx +127 -133
  162. package/src/views/PostManager/PostFilters.tsx +73 -68
  163. package/src/views/PostManager/PostManagerView.tsx +132 -179
  164. package/src/views/PostManager/PostStats.tsx +21 -20
  165. package/src/views/PostManager/PostTable.tsx +137 -165
  166. package/src/views/Settings/SettingsView.tsx +64 -180
  167. package/src/views/SlugSEO/SlugSEOManagerView.tsx +59 -44
  168. package/src/hooks/index.d.ts +0 -8
  169. package/src/hooks/index.d.ts.map +0 -1
  170. package/src/hooks/useBlog.d.ts +0 -31
  171. package/src/hooks/useBlog.d.ts.map +0 -1
  172. package/src/hooks/useBlogs.d.ts +0 -39
  173. package/src/hooks/useBlogs.d.ts.map +0 -1
  174. package/src/hooks/useCategories.d.ts +0 -9
  175. package/src/hooks/useCategories.d.ts.map +0 -1
  176. package/src/lib/blocks/BlockRenderer.d.ts +0 -54
  177. package/src/lib/blocks/BlockRenderer.d.ts.map +0 -1
  178. package/src/lib/config-storage.d.ts +0 -30
  179. package/src/lib/config-storage.d.ts.map +0 -1
  180. package/src/lib/layouts/blocks/ColumnsBlock.d.ts +0 -25
  181. package/src/lib/layouts/blocks/ColumnsBlock.d.ts.map +0 -1
  182. package/src/lib/layouts/blocks/SectionBlock.d.ts +0 -25
  183. package/src/lib/layouts/blocks/SectionBlock.d.ts.map +0 -1
  184. package/src/lib/layouts/index.d.ts +0 -23
  185. package/src/lib/layouts/index.d.ts.map +0 -1
  186. package/src/lib/layouts/registerLayoutBlocks.d.ts +0 -9
  187. package/src/lib/layouts/registerLayoutBlocks.d.ts.map +0 -1
  188. package/src/lib/mappers/apiMapper.d.ts +0 -66
  189. package/src/lib/mappers/apiMapper.d.ts.map +0 -1
  190. package/src/lib/rich-text/RichTextEditor.d.ts +0 -45
  191. package/src/lib/rich-text/RichTextEditor.d.ts.map +0 -1
  192. package/src/lib/rich-text/RichTextPreview.d.ts +0 -16
  193. package/src/lib/rich-text/RichTextPreview.d.ts.map +0 -1
  194. package/src/lib/rich-text/index.d.ts +0 -9
  195. package/src/lib/rich-text/index.d.ts.map +0 -1
  196. package/src/lib/utils/blockHelpers.d.ts +0 -23
  197. package/src/lib/utils/blockHelpers.d.ts.map +0 -1
  198. package/src/lib/utils/configValidation.d.ts +0 -23
  199. package/src/lib/utils/configValidation.d.ts.map +0 -1
  200. package/src/registry/BlockRegistry.d.ts +0 -62
  201. package/src/registry/BlockRegistry.d.ts.map +0 -1
  202. package/src/registry/index.d.ts +0 -6
  203. package/src/registry/index.d.ts.map +0 -1
  204. package/src/state/EditorContext.d.ts +0 -45
  205. package/src/state/EditorContext.d.ts.map +0 -1
  206. package/src/state/index.d.ts +0 -7
  207. package/src/state/index.d.ts.map +0 -1
  208. package/src/state/reducer.d.ts +0 -11
  209. package/src/state/reducer.d.ts.map +0 -1
  210. package/src/state/types.d.ts +0 -162
  211. package/src/state/types.d.ts.map +0 -1
  212. package/src/types/block.d.ts +0 -221
  213. package/src/types/block.d.ts.map +0 -1
  214. package/src/types/index.d.ts +0 -8
  215. package/src/types/index.d.ts.map +0 -1
  216. package/src/types/post.d.ts +0 -136
  217. package/src/types/post.d.ts.map +0 -1
  218. package/src/utils/client.d.ts +0 -48
  219. package/src/utils/client.d.ts.map +0 -1
  220. package/src/views/CanvasEditor/BlockWrapper.d.ts +0 -16
  221. package/src/views/CanvasEditor/BlockWrapper.d.ts.map +0 -1
  222. package/src/views/CanvasEditor/CanvasEditorView.d.ts +0 -14
  223. package/src/views/CanvasEditor/CanvasEditorView.d.ts.map +0 -1
  224. package/src/views/CanvasEditor/EditorBody.d.ts +0 -22
  225. package/src/views/CanvasEditor/EditorBody.d.ts.map +0 -1
  226. package/src/views/CanvasEditor/EditorHeader.d.ts +0 -18
  227. package/src/views/CanvasEditor/EditorHeader.d.ts.map +0 -1
  228. package/src/views/CanvasEditor/LayoutContainer.d.ts +0 -17
  229. package/src/views/CanvasEditor/LayoutContainer.d.ts.map +0 -1
  230. package/src/views/CanvasEditor/SaveConfirmationModal.d.ts +0 -13
  231. package/src/views/CanvasEditor/SaveConfirmationModal.d.ts.map +0 -1
  232. package/src/views/CanvasEditor/components/CustomBlockItem.d.ts +0 -14
  233. package/src/views/CanvasEditor/components/CustomBlockItem.d.ts.map +0 -1
  234. package/src/views/CanvasEditor/components/EditorCanvas.d.ts +0 -29
  235. package/src/views/CanvasEditor/components/EditorCanvas.d.ts.map +0 -1
  236. package/src/views/CanvasEditor/components/EditorLibrary.d.ts +0 -7
  237. package/src/views/CanvasEditor/components/EditorLibrary.d.ts.map +0 -1
  238. package/src/views/CanvasEditor/components/EditorSidebar.d.ts +0 -13
  239. package/src/views/CanvasEditor/components/EditorSidebar.d.ts.map +0 -1
  240. package/src/views/CanvasEditor/components/ErrorBanner.d.ts +0 -6
  241. package/src/views/CanvasEditor/components/ErrorBanner.d.ts.map +0 -1
  242. package/src/views/CanvasEditor/components/FeaturedMediaSection.d.ts +0 -25
  243. package/src/views/CanvasEditor/components/FeaturedMediaSection.d.ts.map +0 -1
  244. package/src/views/CanvasEditor/components/LibraryItem.d.ts +0 -14
  245. package/src/views/CanvasEditor/components/LibraryItem.d.ts.map +0 -1
  246. package/src/views/CanvasEditor/components/PrivacySettingsSection.d.ts +0 -15
  247. package/src/views/CanvasEditor/components/PrivacySettingsSection.d.ts.map +0 -1
  248. package/src/views/CanvasEditor/components/index.d.ts +0 -21
  249. package/src/views/CanvasEditor/components/index.d.ts.map +0 -1
  250. package/src/views/CanvasEditor/hooks/index.d.ts +0 -10
  251. package/src/views/CanvasEditor/hooks/index.d.ts.map +0 -1
  252. package/src/views/CanvasEditor/hooks/useHeroBlock.d.ts +0 -8
  253. package/src/views/CanvasEditor/hooks/useHeroBlock.d.ts.map +0 -1
  254. package/src/views/CanvasEditor/hooks/useKeyboardShortcuts.d.ts +0 -3
  255. package/src/views/CanvasEditor/hooks/useKeyboardShortcuts.d.ts.map +0 -1
  256. package/src/views/CanvasEditor/hooks/usePostLoader.d.ts +0 -5
  257. package/src/views/CanvasEditor/hooks/usePostLoader.d.ts.map +0 -1
  258. package/src/views/CanvasEditor/hooks/useRegisteredBlocks.d.ts +0 -2
  259. package/src/views/CanvasEditor/hooks/useRegisteredBlocks.d.ts.map +0 -1
  260. package/src/views/CanvasEditor/hooks/useUnsavedChanges.d.ts +0 -25
  261. package/src/views/CanvasEditor/hooks/useUnsavedChanges.d.ts.map +0 -1
  262. package/src/views/CanvasEditor/index.d.ts +0 -16
  263. package/src/views/CanvasEditor/index.d.ts.map +0 -1
  264. package/src/views/PostManager/EmptyState.d.ts +0 -10
  265. package/src/views/PostManager/EmptyState.d.ts.map +0 -1
  266. package/src/views/PostManager/PostActionsMenu.d.ts +0 -12
  267. package/src/views/PostManager/PostActionsMenu.d.ts.map +0 -1
  268. package/src/views/PostManager/PostCards.d.ts +0 -15
  269. package/src/views/PostManager/PostCards.d.ts.map +0 -1
  270. package/src/views/PostManager/PostFilters.d.ts +0 -16
  271. package/src/views/PostManager/PostFilters.d.ts.map +0 -1
  272. package/src/views/PostManager/PostManagerView.d.ts +0 -11
  273. package/src/views/PostManager/PostManagerView.d.ts.map +0 -1
  274. package/src/views/PostManager/PostStats.d.ts +0 -11
  275. package/src/views/PostManager/PostStats.d.ts.map +0 -1
  276. package/src/views/PostManager/PostTable.d.ts +0 -15
  277. package/src/views/PostManager/PostTable.d.ts.map +0 -1
  278. package/src/views/PostManager/index.d.ts +0 -12
  279. package/src/views/PostManager/index.d.ts.map +0 -1
  280. package/src/views/Preview/PreviewBridgeView.d.ts +0 -12
  281. package/src/views/Preview/PreviewBridgeView.d.ts.map +0 -1
  282. package/src/views/Preview/index.d.ts +0 -6
  283. package/src/views/Preview/index.d.ts.map +0 -1
  284. package/src/views/Settings/SettingsView.d.ts +0 -10
  285. package/src/views/Settings/SettingsView.d.ts.map +0 -1
  286. package/src/views/Settings/index.d.ts +0 -6
  287. package/src/views/Settings/index.d.ts.map +0 -1
  288. package/src/views/SlugSEO/SlugSEOManagerView.d.ts +0 -12
  289. package/src/views/SlugSEO/SlugSEOManagerView.d.ts.map +0 -1
  290. package/src/views/SlugSEO/index.d.ts +0 -6
  291. package/src/views/SlugSEO/index.d.ts.map +0 -1
@@ -1,341 +1,81 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useState, useEffect, useRef } from 'react';
3
+ import { useState, useEffect } from 'react';
4
4
  import { useEditor } from '../../state/EditorContext';
5
5
  import { EditorHeader } from './EditorHeader';
6
6
  import { ErrorBanner } from './components/ErrorBanner';
7
7
  import { EditorLibrary } from './components/EditorLibrary';
8
- import { EditorCanvas } from './components/EditorCanvas';
9
8
  import { EditorSidebar } from './components/EditorSidebar';
10
- import { usePostLoader, useHeroBlock, useRegisteredBlocks, useKeyboardShortcuts, useUnsavedChanges } from './hooks';
11
- export function CanvasEditorView({ postId, darkMode, backgroundColors: propsBackgroundColors, siteId, locale }) {
12
- const { state, helpers, dispatch, darkMode: contextDarkMode, backgroundColors: contextBackgroundColors, canUndo, canRedo } = useEditor();
13
- const effectiveDarkMode = darkMode !== undefined ? darkMode : contextDarkMode;
14
- const effectiveBackgroundColors = propsBackgroundColors || contextBackgroundColors;
15
- const [isSidebarOpen, setSidebarOpen] = useState(true);
9
+ import { EditorCanvas } from './components/EditorCanvas';
10
+ import { JSONInspector } from './components/JSONInspector';
11
+ import { useRegisteredBlocks } from './hooks/useRegisteredBlocks';
12
+ import { useAutoSave } from '../../hooks/useAutoSave';
13
+ import { usePostLoader } from './hooks/usePostLoader';
14
+ import { RefreshCw } from 'lucide-react';
15
+ export function CanvasEditorView({ postId, siteId, locale, initialData, availableLanguages = [], darkMode = false, backgroundColors, LayoutWrapper }) {
16
+ const { state, dispatch, helpers, availableLanguages: contextLanguages } = useEditor();
17
+ const registeredBlocks = useRegisteredBlocks();
16
18
  const [isLibraryOpen, setLibraryOpen] = useState(true);
19
+ const [isSidebarOpen, setSidebarOpen] = useState(true);
17
20
  const [isPreviewMode, setIsPreviewMode] = useState(false);
18
21
  const [isSaving, setIsSaving] = useState(false);
19
22
  const [saveError, setSaveError] = useState(null);
20
- // Language state for multilingual support
21
- const [primaryLanguage, setPrimaryLanguage] = useState(locale || 'en');
22
- const [isLoadingLanguage, setIsLoadingLanguage] = useState(true);
23
- const [availableLanguages, setAvailableLanguages] = useState([locale || 'en']);
24
- const [currentLanguage, setCurrentLanguage] = useState(locale || 'en');
25
- // Get registered blocks
26
- const registeredBlocks = useRegisteredBlocks();
27
- // Hero block management
28
- const { heroBlock, setHeroBlock, heroBlockDefinition } = useHeroBlock(state, registeredBlocks);
29
- // Post loading - wait for language settings to be loaded first
30
- const { isLoadingPost } = usePostLoader(postId, state.postId, (post) => {
31
- helpers.loadPost(post);
32
- // Don't reset current language when loading - preserve user's selection
33
- // This allows switching to a new language even if no content exists yet
34
- // Update available languages from post's languages object
35
- if (post.languages && Object.keys(post.languages).length > 0) {
36
- const langs = Object.keys(post.languages);
37
- // Add current language to available if not already there
38
- if (!langs.includes(currentLanguage)) {
39
- langs.push(currentLanguage);
40
- }
41
- setAvailableLanguages(langs);
42
- }
43
- // After loading, ensure we're marked as clean
44
- // Use setTimeout to ensure this runs after the reducer has processed LOAD_POST
45
- setTimeout(() => {
46
- dispatch({ type: 'MARK_CLEAN' });
47
- }, 0);
48
- }, () => setHeroBlock(null), !isLoadingLanguage ? currentLanguage : undefined);
49
- // Sync currentLanguage to editor state on mount so onSave always knows the active language
50
- useEffect(() => {
51
- dispatch({ type: 'SET_CURRENT_LANGUAGE', payload: currentLanguage });
52
- }, []); // eslint-disable-line react-hooks/exhaustive-deps -- only on mount
53
- // Fetch primary language from settings (simulated - in real app would come from config)
23
+ // Ensure currentLanguage is always set from the locale prop
54
24
  useEffect(() => {
55
- const fetchLanguageSettings = async () => {
56
- try {
57
- // Use the locale prop as the initial language
58
- // Only set this once on initial load, don't override if user already selected a language
59
- if (!currentLanguage || currentLanguage === 'en') {
60
- setPrimaryLanguage(locale || 'nl');
61
- if (!availableLanguages.includes(locale || 'nl')) {
62
- setAvailableLanguages([locale || 'nl']);
63
- }
64
- setCurrentLanguage(locale || 'nl');
65
- dispatch({ type: 'SET_CURRENT_LANGUAGE', payload: locale || 'nl' });
66
- }
67
- }
68
- catch (error) {
69
- console.error('Failed to fetch language settings:', error);
70
- }
71
- finally {
72
- setIsLoadingLanguage(false);
73
- }
74
- };
75
- fetchLanguageSettings();
76
- }, []); // Empty dependency - only run once on mount
77
- // Handle language change
78
- const handleLanguageChange = async (newLanguage) => {
79
- // Save current content first if dirty
80
- if (state.isDirty) {
81
- const confirmed = window.confirm('You have unsaved changes. Do you want to save them first?');
82
- if (confirmed) {
83
- await handleSave();
84
- }
85
- }
86
- setCurrentLanguage(newLanguage);
87
- dispatch({ type: 'SET_CURRENT_LANGUAGE', payload: newLanguage });
88
- // Reload with new language
89
- if (postId) {
90
- try {
91
- const response = await fetch(`/api/plugin-blog/${postId}?language=${newLanguage}`);
92
- if (response && response.ok) {
93
- const apiDoc = await response.json();
94
- // Manually update state instead of going through loadPost
95
- // This avoids re-triggering the usePostLoader hook
96
- const blocks = apiDoc.contentBlocks || apiDoc.blocks || [];
97
- dispatch({ type: 'SET_TITLE', payload: apiDoc.title || '' });
98
- // Replace all blocks
99
- // First clear, then set new blocks via LOAD_POST-like behavior
100
- // We use a custom dispatch to update blocks without resetting postId
101
- dispatch({
102
- type: 'LOAD_POST',
103
- payload: {
104
- id: state.postId || apiDoc._id || apiDoc.id,
105
- title: apiDoc.title || '',
106
- slug: apiDoc.slug || state.slug,
107
- blocks: blocks,
108
- seo: apiDoc.seo || {},
109
- publication: {
110
- status: apiDoc.publicationData?.status === 'concept' ? 'draft' : (apiDoc.publicationData?.status || state.status),
111
- date: apiDoc.publicationData?.date,
112
- authorId: apiDoc.authorId,
113
- },
114
- metadata: {
115
- featuredImage: apiDoc.image ? {
116
- id: apiDoc.image.id || apiDoc.image.src,
117
- alt: apiDoc.image.alt,
118
- isCustom: apiDoc.image.isCustom,
119
- } : state.metadata?.featuredImage,
120
- categories: apiDoc.categoryTags?.category ? [apiDoc.categoryTags.category] : [],
121
- tags: apiDoc.categoryTags?.tags || [],
122
- excerpt: apiDoc.summary || '',
123
- lang: newLanguage,
124
- },
125
- languages: apiDoc.languages,
126
- createdAt: apiDoc.createdAt || new Date().toISOString(),
127
- updatedAt: apiDoc.updatedAt || new Date().toISOString(),
128
- }
129
- });
130
- // Update available languages
131
- if (apiDoc.availableLanguages) {
132
- const langs = [...apiDoc.availableLanguages];
133
- if (!langs.includes(newLanguage)) {
134
- langs.push(newLanguage);
135
- }
136
- setAvailableLanguages(langs);
137
- }
138
- // Reset hero block so it re-initializes from new blocks
139
- setHeroBlock(null);
140
- setTimeout(() => {
141
- dispatch({ type: 'MARK_CLEAN' });
142
- }, 100);
143
- }
144
- }
145
- catch (error) {
146
- console.error('Failed to switch language:', error);
147
- }
25
+ if (locale && !state.currentLanguage) {
26
+ dispatch({ type: 'SET_CURRENT_LANGUAGE', payload: locale });
148
27
  }
149
- };
150
- // Handle adding a new language
151
- const handleAddLanguage = async (newLanguage) => {
152
- if (availableLanguages.includes(newLanguage))
153
- return;
154
- // Add the new language to the list
155
- setAvailableLanguages([...availableLanguages, newLanguage]);
156
- // Switch to the new language (it will copy from primary language)
157
- await handleLanguageChange(newLanguage);
158
- };
159
- // Track if we just loaded a post to prevent marking as dirty during cleanup
160
- const justLoadedRef = useRef(false);
161
- const previousIsLoadingRef = useRef(false);
162
- const loadingCleanupTimerRef = useRef(null);
163
- // Mark when post loading completes and ensure it stays clean after all effects
164
- useEffect(() => {
165
- // Detect when loading just finished (was loading, now not loading, and we have a postId)
166
- const loadingJustFinished = previousIsLoadingRef.current && !isLoadingPost && state.postId;
167
- if (loadingJustFinished) {
168
- justLoadedRef.current = true;
169
- // Clear any existing cleanup timer
170
- if (loadingCleanupTimerRef.current) {
171
- clearTimeout(loadingCleanupTimerRef.current);
172
- }
173
- // Wait for all effects to complete, then ensure we're marked as clean
174
- // Use multiple animation frames + setTimeout to ensure all effects have run
175
- requestAnimationFrame(() => {
176
- requestAnimationFrame(() => {
177
- loadingCleanupTimerRef.current = setTimeout(() => {
178
- // Force mark as clean after loading - this ensures cleanup effects don't leave us dirty
179
- console.log('[CanvasEditorView] Post loading complete - ensuring clean state');
180
- dispatch({ type: 'MARK_CLEAN' });
181
- justLoadedRef.current = false;
182
- loadingCleanupTimerRef.current = null;
183
- }, 500); // Delay to ensure all effects complete
184
- });
185
- });
186
- }
187
- // Update ref
188
- previousIsLoadingRef.current = isLoadingPost;
189
- return () => {
190
- if (loadingCleanupTimerRef.current) {
191
- clearTimeout(loadingCleanupTimerRef.current);
192
- loadingCleanupTimerRef.current = null;
193
- }
194
- };
195
- }, [isLoadingPost, state.postId, dispatch]);
196
- // Keyboard shortcuts
197
- useKeyboardShortcuts(state, dispatch, canUndo, canRedo, helpers.undo, helpers.redo);
198
- // Unsaved changes warning and auto-save
199
- const { autoSaveEnabled, setAutoSaveEnabled, countdown, saveStatus } = useUnsavedChanges({
200
- state,
201
- isDirty: state.isDirty,
202
- onSave: async () => {
203
- // Preserve current status: if already published, keep it published
204
- // Otherwise save as draft
205
- const shouldPublish = state.status === 'published';
206
- await handleSave(shouldPublish);
207
- },
208
- heroBlock,
209
- postId: state.postId,
28
+ }, [locale, state.currentLanguage, dispatch]);
29
+ // Initial post loading logic
30
+ const { isLoadingPost } = usePostLoader(postId, state.postId, helpers.loadPost, () => setHeroBlock(null), locale);
31
+ const { autoSaveEnabled, setAutoSaveEnabled, saveStatus, countdown } = useAutoSave(postId, state, async (data) => {
32
+ await helpers.save(heroBlock);
210
33
  });
211
- // Listen for hero title updates from HeroBlock (if it dispatches events)
212
- useEffect(() => {
213
- const handleHeroTitleUpdate = (e) => {
214
- dispatch({ type: 'SET_TITLE', payload: e.detail });
215
- };
216
- window.addEventListener('hero-title-update', handleHeroTitleUpdate);
217
- return () => window.removeEventListener('hero-title-update', handleHeroTitleUpdate);
218
- }, [dispatch]);
219
- // Remove any hero blocks from the content blocks array
220
- // Note: This effect will mark as dirty, but the loading cleanup effect will fix it
34
+ // Initialize editor with post data (fallback if not using usePostLoader)
221
35
  useEffect(() => {
222
- const heroBlocksInContent = state.blocks.filter(b => b.type === 'hero');
223
- if (heroBlocksInContent.length > 0) {
224
- heroBlocksInContent.forEach(block => {
225
- dispatch({ type: 'DELETE_BLOCK', payload: { id: block.id } });
226
- });
227
- // Don't mark as clean here - let the loading cleanup effect handle it
228
- // This ensures we wait for all effects to complete before marking clean
36
+ if (initialData) {
37
+ const data = initialData.data || initialData;
38
+ if (data.blocks)
39
+ dispatch({ type: 'SET_BLOCKS', payload: data.blocks });
40
+ if (data.title)
41
+ dispatch({ type: 'SET_TITLE', payload: data.title });
42
+ if (data.slug)
43
+ dispatch({ type: 'SET_SLUG', payload: data.slug });
44
+ if (data.seo)
45
+ dispatch({ type: 'SET_SEO', payload: data.seo });
46
+ if (data.metadata)
47
+ dispatch({ type: 'SET_METADATA', payload: data.metadata });
48
+ if (data.status)
49
+ dispatch({ type: 'SET_STATUS', payload: data.status });
50
+ dispatch({ type: 'SET_CURRENT_LANGUAGE', payload: locale });
229
51
  }
230
- }, [state.blocks, dispatch]);
231
- // Filter out hero blocks from content blocks
232
- const contentBlocks = state.blocks.filter(b => b.type !== 'hero');
233
- // Handler to add block at the bottom when clicking (not dragging)
234
- const handleAddBlockAtBottom = (blockType) => {
235
- // Add at the end of content blocks (excluding hero)
236
- helpers.addBlock(blockType, contentBlocks.length, undefined);
237
- };
238
- // Handle save
239
- const handleSave = async (publish) => {
52
+ }, [initialData, locale, dispatch]);
53
+ const handleSave = async (publish = false) => {
240
54
  setIsSaving(true);
241
55
  setSaveError(null);
242
56
  try {
243
- // Status should already be set in EditorHeader, but verify and log
244
- console.log('[CanvasEditorView] onSave called with publish:', publish, 'current status:', state.status);
245
- // Only change status if explicitly requested (publish is true or false)
246
- // If publish is undefined, preserve the current status (used for autosave)
247
- if (publish === true && state.status !== 'published') {
248
- console.warn('[CanvasEditorView] Status mismatch! Setting to published...');
249
- dispatch({ type: 'SET_STATUS', payload: 'published' });
250
- await new Promise(resolve => setTimeout(resolve, 100));
251
- }
252
- else if (publish === false && state.status !== 'draft' && state.status !== 'published') {
253
- // Only set to draft if not already published (preserve published status)
254
- // This prevents autosave from changing published posts back to draft
255
- console.warn('[CanvasEditorView] Status mismatch! Setting to draft...');
256
- dispatch({ type: 'SET_STATUS', payload: 'draft' });
257
- await new Promise(resolve => setTimeout(resolve, 100));
258
- }
259
- console.log('[CanvasEditorView] Final status before save:', state.status);
260
- // Pass hero block to save function so it can be included in the saved data
261
- await helpers.save(heroBlock);
262
- setIsSaving(false);
57
+ await helpers.save(heroBlock, publish ? 'published' : 'draft');
263
58
  }
264
59
  catch (error) {
265
- console.error('[CanvasEditorView] Save error:', error);
266
- // Extract and format user-friendly error message
267
- let errorMessage = error.message || 'Failed to save post';
268
- // Make error messages more user-friendly
269
- if (errorMessage.includes('Missing required fields')) {
270
- errorMessage = errorMessage.replace('Missing required fields for publishing:', 'To publish, please fill in:');
271
- }
272
- else if (errorMessage.includes('All required fields')) {
273
- errorMessage = 'To publish, please fill in all required fields: summary, featured image, category, and content.';
274
- }
275
- else if (errorMessage.includes('Unauthorized')) {
276
- errorMessage = 'You are not authorized to save this post. Please log in again.';
277
- }
278
- else if (errorMessage.includes('Failed to save')) {
279
- errorMessage = 'Unable to save the post. Please check your connection and try again.';
280
- }
281
- setSaveError(errorMessage);
282
- setIsSaving(false); // Always reset saving state on error
283
- throw error; // Re-throw so EditorHeader can handle it
60
+ setSaveError(error.message || 'Failed to save publication');
284
61
  }
285
- };
286
- // Handle hero block update
287
- const handleHeroBlockUpdate = (data) => {
288
- if (!heroBlock)
289
- return;
290
- setHeroBlock({
291
- ...heroBlock,
292
- data: { ...heroBlock.data, ...data },
293
- });
294
- // Sync title to editor state
295
- if (data.title !== undefined && typeof data.title === 'string') {
296
- dispatch({ type: 'SET_TITLE', payload: data.title });
297
- }
298
- // Sync summary to editor state metadata
299
- if (data.summary !== undefined && typeof data.summary === 'string') {
300
- dispatch({
301
- type: 'SET_METADATA',
302
- payload: { excerpt: data.summary }
303
- });
304
- }
305
- // Hero image and featured image are completely independent
306
- // Do NOT sync hero image to featured image
307
- // The featured image is a separate thumbnail that the client adjusts independently
308
- // Sync category to editor state metadata
309
- if (data.category !== undefined && typeof data.category === 'string') {
310
- dispatch({
311
- type: 'SET_METADATA',
312
- payload: {
313
- categories: data.category.trim() ? [data.category.trim()] : []
314
- }
315
- });
62
+ finally {
63
+ setIsSaving(false);
316
64
  }
317
65
  };
318
- // Handle hero block delete/reset
319
- const handleHeroBlockDelete = () => {
320
- if (!heroBlock || !heroBlockDefinition)
321
- return;
322
- const defaultData = heroBlockDefinition.defaultData || {};
323
- setHeroBlock({
324
- ...heroBlock,
325
- data: { ...defaultData },
326
- });
66
+ const handleHeroUpdate = (block) => {
67
+ setHeroBlock(block);
327
68
  };
328
- return (_jsxs("div", { className: "h-full rounded-[2.5rem] w-full bg-dashboard-card text-dashboard-text flex flex-col font-sans transition-colors duration-300 overflow-hidden", children: [_jsx("header", { className: "overflow-visible flex-none shrink-0 z-10", children: _jsx(EditorHeader, { isLibraryOpen: isLibraryOpen, onLibraryToggle: () => setLibraryOpen(!isLibraryOpen), isPreviewMode: isPreviewMode, onPreviewToggle: () => setIsPreviewMode(!isPreviewMode), isSidebarOpen: isSidebarOpen, onSidebarToggle: () => setSidebarOpen(!isSidebarOpen), isSaving: isSaving, onSave: handleSave, onSaveError: (error) => {
329
- // Format error message for display
330
- if (error) {
331
- let formattedError = error;
332
- if (formattedError.includes('Missing required fields')) {
333
- formattedError = formattedError.replace('Missing required fields for publishing:', 'To publish, please fill in:');
334
- }
335
- setSaveError(formattedError);
336
- }
337
- else {
338
- setSaveError(null);
339
- }
340
- }, autoSaveEnabled: autoSaveEnabled, onAutoSaveToggle: setAutoSaveEnabled, isDirty: state.isDirty, autoSaveCountdown: countdown, autoSaveStatus: saveStatus, languages: availableLanguages, currentLanguage: currentLanguage, onLanguageChange: handleLanguageChange, onAddLanguage: handleAddLanguage }) }), _jsx(ErrorBanner, { error: saveError, onDismiss: () => setSaveError(null) }), _jsx("main", { className: "flex flex-1 flex-col relative min-h-0 overflow-hidden", children: _jsxs("div", { className: "flex flex-1 relative overflow-hidden min-h-0 flex-nowrap", children: [!isPreviewMode && (_jsx("aside", { className: `transition-all duration-500 ease-[cubic-bezier(0.4,0,0.2,1)] border-r border-dashboard-border bg-dashboard-sidebar overflow-y-auto overflow-x-hidden h-full ${isLibraryOpen ? 'w-72' : 'w-0 opacity-0 pointer-events-none'}`, children: _jsx(EditorLibrary, { registeredBlocks: registeredBlocks, onAddBlock: handleAddBlockAtBottom }) })), _jsx(EditorCanvas, { isPreviewMode: isPreviewMode, heroBlock: heroBlock, heroBlockDefinition: heroBlockDefinition, contentBlocks: contentBlocks, title: state.title, siteId: siteId, locale: locale, darkMode: effectiveDarkMode, backgroundColors: effectiveBackgroundColors, featuredImage: state.metadata.featuredImage, onTitleChange: (title) => dispatch({ type: 'SET_TITLE', payload: title }), onHeroBlockUpdate: handleHeroBlockUpdate, onHeroBlockDelete: handleHeroBlockDelete, onBlockAdd: (type, index, containerId) => helpers.addBlock(type, index, containerId), onBlockUpdate: (id, data) => helpers.updateBlock(id, data), onBlockDelete: (id) => helpers.deleteBlock(id), onBlockMove: (id, newIndex, containerId) => helpers.moveBlock(id, newIndex, containerId) }), !isPreviewMode && (_jsx("aside", { className: `transition-all duration-500 ease-[cubic-bezier(0.4,0,0.2,1)] border-l border-dashboard-border bg-dashboard-sidebar overflow-y-auto overflow-x-hidden h-full ${isSidebarOpen ? 'w-80' : 'w-0 opacity-0 pointer-events-none'}`, children: _jsx(EditorSidebar, { slug: state.slug, seo: state.seo, metadata: state.metadata, heroBlock: heroBlock, status: state.status, onSEOUpdate: (seo) => dispatch({ type: 'SET_SEO', payload: seo }), onMetadataUpdate: (metadata) => dispatch({ type: 'SET_METADATA', payload: metadata }) }) }))] }) })] }));
69
+ // Find hero block if it exists
70
+ const [heroBlock, setHeroBlock] = useState(null);
71
+ useEffect(() => {
72
+ const hero = state.blocks.find((b) => b.type === 'hero' || b.category === 'hero');
73
+ if (hero)
74
+ setHeroBlock(hero);
75
+ }, [state.blocks]);
76
+ const heroBlockDefinition = registeredBlocks.find(b => b.type === heroBlock?.type);
77
+ if (isLoadingPost) {
78
+ return (_jsx("div", { className: "absolute inset-0 w-full flex items-center justify-center bg-dashboard-bg/10 backdrop-blur-sm z-[100]", children: _jsxs("div", { className: "flex flex-col items-center gap-4", children: [_jsx(RefreshCw, { className: "size-10 text-primary animate-spin" }), _jsx("p", { className: "text-[10px] font-black uppercase tracking-[0.3em] text-primary", children: "Synchronizing_Node_Data..." })] }) }));
79
+ }
80
+ return (_jsxs("div", { className: "absolute inset-0 w-full flex flex-col overflow-hidden bg-dashboard-bg/10 backdrop-blur-sm", children: [_jsx(EditorHeader, { isLibraryOpen: isLibraryOpen, onLibraryToggle: () => setLibraryOpen(!isLibraryOpen), isPreviewMode: isPreviewMode, onPreviewToggle: () => setIsPreviewMode(!isPreviewMode), isSidebarOpen: isSidebarOpen, onSidebarToggle: () => setSidebarOpen(!isSidebarOpen), isSaving: isSaving, onSave: handleSave, onSaveError: setSaveError, autoSaveEnabled: autoSaveEnabled, onAutoSaveToggle: setAutoSaveEnabled, isDirty: state.isDirty, autoSaveCountdown: countdown, autoSaveStatus: saveStatus, languages: contextLanguages, currentLanguage: state.currentLanguage || locale, onLanguageChange: (lang) => helpers.switchLanguage(lang, postId), onAddLanguage: (lang) => helpers.switchLanguage(lang, postId) }), _jsx(ErrorBanner, { error: saveError, onDismiss: () => setSaveError(null) }), _jsxs("main", { className: "flex flex-1 relative overflow-hidden", children: [_jsx("aside", { className: `transition-all duration-500 bg-dashboard-sidebar/40 backdrop-blur-xl border-r border-dashboard-border/50 relative z-20 overflow-hidden ${isLibraryOpen ? 'w-72' : 'w-0'}`, children: _jsx("div", { className: "w-72 h-full opacity-100 transition-opacity duration-300", children: _jsx(EditorLibrary, { registeredBlocks: registeredBlocks, onAddBlock: (type) => helpers.addBlock(type) }) }) }), _jsx("div", { className: "flex-1 relative overflow-hidden bg-white/[0.01] flex flex-col", children: _jsx(EditorCanvas, { isPreviewMode: isPreviewMode, heroBlock: heroBlock, heroBlockDefinition: heroBlockDefinition, contentBlocks: state.blocks, title: state.title, siteId: siteId, locale: locale, darkMode: darkMode, backgroundColors: backgroundColors, featuredImage: state.metadata.featuredImage, LayoutWrapper: LayoutWrapper, onTitleChange: (title) => dispatch({ type: 'SET_TITLE', payload: title }), onHeroBlockUpdate: handleHeroUpdate, onHeroBlockDelete: () => setHeroBlock(null), onBlockAdd: helpers.addBlock, onBlockUpdate: helpers.updateBlock, onBlockDelete: helpers.deleteBlock, onBlockMove: helpers.moveBlock }) }), _jsx("aside", { className: `transition-all duration-500 bg-dashboard-sidebar/40 backdrop-blur-xl border-l border-dashboard-border/50 relative z-20 overflow-hidden ${isSidebarOpen ? 'w-80' : 'w-0'}`, children: _jsx("div", { className: "w-80 h-full opacity-100 transition-opacity duration-300", children: _jsx(EditorSidebar, { slug: state.slug, seo: state.seo, metadata: state.metadata, heroBlock: heroBlock, status: state.status, onSEOUpdate: (seo) => dispatch({ type: 'SET_SEO', payload: seo }), onMetadataUpdate: (meta) => dispatch({ type: 'SET_METADATA', payload: meta }) }) }) })] }), _jsx(JSONInspector, { data: state })] }));
341
81
  }
@@ -6,17 +6,15 @@
6
6
  import { Block } from '../../types/block';
7
7
  export interface EditorBodyProps {
8
8
  blocks: Block[];
9
- onBlockAdd: (type: string, index: number, containerId?: string) => void;
10
- onBlockUpdate: (id: string, data: Partial<Block['data']>) => void;
11
- onBlockDelete: (id: string) => void;
12
- onBlockMove: (id: string, newIndex: number, containerId?: string) => void;
13
- /** Enable dark mode for content area and wrappers (default: true) */
14
- darkMode?: boolean;
15
- /** Background colors for the editor */
9
+ darkMode: boolean;
16
10
  backgroundColors?: {
17
11
  light: string;
18
12
  dark?: string;
19
13
  };
14
+ onBlockUpdate: (id: string, data: Partial<Block['data']>, containerId?: string) => void;
15
+ onBlockDelete: (id: string, containerId?: string) => void;
16
+ onBlockMove: (id: string, newIndex: number, containerId?: string) => void;
17
+ onBlockAdd: (type: string, index: number, containerId?: string) => void;
20
18
  }
21
- export declare function EditorBody({ blocks, onBlockAdd, onBlockUpdate, onBlockDelete, onBlockMove, darkMode, backgroundColors, }: EditorBodyProps): import("react/jsx-runtime").JSX.Element;
19
+ export declare function EditorBody({ blocks, darkMode, backgroundColors, onBlockUpdate, onBlockDelete, onBlockMove, onBlockAdd, }: EditorBodyProps): import("react/jsx-runtime").JSX.Element;
22
20
  //# sourceMappingURL=EditorBody.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EditorBody.d.ts","sourceRoot":"","sources":["../../../src/views/CanvasEditor/EditorBody.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG1C,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACxE,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC;IAClE,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E,qEAAqE;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,gBAAgB,CAAC,EAAE;QACf,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACL;AAED,wBAAgB,UAAU,CAAC,EACvB,MAAM,EACN,UAAU,EACV,aAAa,EACb,aAAa,EACb,WAAW,EACX,QAAe,EACf,gBAAgB,GACnB,EAAE,eAAe,2CAuhBjB"}
1
+ {"version":3,"file":"EditorBody.d.ts","sourceRoot":"","sources":["../../../src/views/CanvasEditor/EditorBody.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAK1C,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACxF,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3E;AAED,wBAAgB,UAAU,CAAC,EACvB,MAAM,EACN,QAAQ,EACR,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,WAAW,EACX,UAAU,GACb,EAAE,eAAe,2CAuHjB"}