@jhits/plugin-blog 0.0.8 → 0.0.10

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 +4 -4
  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,16 @@
1
+ /**
2
+ * Post Filters Component
3
+ * Search and filter controls for posts
4
+ */
5
+ import { PostStatus } from '../../types/post';
6
+ export interface PostFiltersProps {
7
+ search: string;
8
+ onSearchChange: (value: string) => void;
9
+ statusFilter: PostStatus | 'all';
10
+ onStatusFilterChange: (value: PostStatus | 'all') => void;
11
+ categoryFilter: string;
12
+ onCategoryFilterChange: (value: string) => void;
13
+ categories: string[];
14
+ }
15
+ export declare function PostFilters({ search, onSearchChange, statusFilter, onStatusFilterChange, categoryFilter, onCategoryFilterChange, categories, }: PostFiltersProps): import("react/jsx-runtime").JSX.Element;
16
+ //# sourceMappingURL=PostFilters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostFilters.d.ts","sourceRoot":"","sources":["PostFilters.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,YAAY,EAAE,UAAU,GAAG,KAAK,CAAC;IACjC,oBAAoB,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,KAAK,IAAI,CAAC;IAC1D,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,UAAU,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,wBAAgB,WAAW,CAAC,EACxB,MAAM,EACN,cAAc,EACd,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACd,sBAAsB,EACtB,UAAU,GACb,EAAE,gBAAgB,2CAgElB"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Post Filters Component
3
+ * Search and filter controls for posts
4
+ */
5
+ 'use client';
6
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
+ import { Search, Filter, Tag } from 'lucide-react';
8
+ export function PostFilters({ search, onSearchChange, statusFilter, onStatusFilterChange, categoryFilter, onCategoryFilterChange, categories, }) {
9
+ return (_jsxs("div", { className: "flex flex-col sm:flex-row gap-4 mb-6", children: [_jsxs("div", { className: "relative flex-1", children: [_jsx("label", { htmlFor: "blog-post-search", className: "absolute w-px h-px p-0 -m-px overflow-hidden whitespace-nowrap border-0", style: { clip: 'rect(0, 0, 0, 0)', clipPath: 'inset(50%)' }, children: "Search posts by title or content" }), _jsx(Search, { className: "absolute left-4 top-1/2 -translate-y-1/2 text-neutral-400 size-4" }), _jsx("input", { id: "blog-post-search", name: "blog-post-search", type: "text", value: search, onChange: (e) => onSearchChange(e.target.value), placeholder: "Search posts by title or content...", className: "w-full pl-11 pr-4 py-3 bg-neutral-100 dark:bg-neutral-800 border border-neutral-300 dark:border-neutral-700 rounded-2xl text-sm focus:ring-2 focus:ring-primary/20 focus:border-primary outline-none transition-all" })] }), _jsxs("div", { className: "relative", children: [_jsx("label", { htmlFor: "blog-post-status-filter", className: "absolute w-px h-px p-0 -m-px overflow-hidden whitespace-nowrap border-0", style: { clip: 'rect(0, 0, 0, 0)', clipPath: 'inset(50%)' }, children: "Filter by status" }), _jsx(Filter, { className: "absolute left-4 top-1/2 -translate-y-1/2 text-neutral-400 size-4 pointer-events-none" }), _jsxs("select", { id: "blog-post-status-filter", name: "blog-post-status-filter", value: statusFilter, onChange: (e) => onStatusFilterChange(e.target.value), className: "pl-11 pr-8 py-3 bg-neutral-100 dark:bg-neutral-800 border border-neutral-300 dark:border-neutral-700 rounded-2xl text-sm focus:ring-2 focus:ring-primary/20 focus:border-primary appearance-none outline-none cursor-pointer min-w-[160px]", children: [_jsx("option", { value: "all", children: "All Statuses" }), _jsx("option", { value: "published", children: "Published" }), _jsx("option", { value: "draft", children: "Draft" }), _jsx("option", { value: "scheduled", children: "Scheduled" }), _jsx("option", { value: "archived", children: "Archived" })] })] }), _jsxs("div", { className: "relative", children: [_jsx("label", { htmlFor: "blog-post-category-filter", className: "absolute w-px h-px p-0 -m-px overflow-hidden whitespace-nowrap border-0", style: { clip: 'rect(0, 0, 0, 0)', clipPath: 'inset(50%)' }, children: "Filter by category" }), _jsx(Tag, { className: "absolute left-4 top-1/2 -translate-y-1/2 text-neutral-400 size-4 pointer-events-none" }), _jsxs("select", { id: "blog-post-category-filter", name: "blog-post-category-filter", value: categoryFilter, onChange: (e) => onCategoryFilterChange(e.target.value), className: "pl-11 pr-8 py-3 bg-neutral-100 dark:bg-neutral-800 border border-neutral-300 dark:border-neutral-700 rounded-2xl text-sm focus:ring-2 focus:ring-primary/20 focus:border-primary appearance-none outline-none cursor-pointer min-w-[160px]", children: [_jsx("option", { value: "all", children: "All Categories" }), categories.map((category) => (_jsx("option", { value: category, children: category }, category)))] })] })] }));
10
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Post Manager View
3
+ * Production-ready listing page for managing blog posts
4
+ * Follows dashboard earth-tone design system
5
+ */
6
+ export interface PostManagerViewProps {
7
+ siteId: string;
8
+ locale: string;
9
+ }
10
+ export declare function PostManagerView({ siteId, locale }: PostManagerViewProps): import("react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=PostManagerView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostManagerView.d.ts","sourceRoot":"","sources":["PostManagerView.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,MAAM,WAAW,oBAAoB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAClB;AAMD,wBAAgB,eAAe,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,oBAAoB,2CAqQvE"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Post Manager View
3
+ * Production-ready listing page for managing blog posts
4
+ * Follows dashboard earth-tone design system
5
+ */
6
+ 'use client';
7
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
8
+ import React, { useState, useEffect } from 'react';
9
+ import { Plus, List, Grid3x3 } from 'lucide-react';
10
+ import { PostStats } from './PostStats';
11
+ import { PostFilters } from './PostFilters';
12
+ import { PostTable } from './PostTable';
13
+ import { PostCards } from './PostCards';
14
+ import { EmptyState } from './EmptyState';
15
+ import { apiToBlogPost } from '../../lib/mappers/apiMapper';
16
+ const STORAGE_KEY_PREFIX = 'blog-view-mode';
17
+ export function PostManagerView({ siteId, locale }) {
18
+ const [posts, setPosts] = useState([]);
19
+ const [totalPosts, setTotalPosts] = useState(0);
20
+ const [loading, setLoading] = useState(true);
21
+ const [search, setSearch] = useState('');
22
+ const [statusFilter, setStatusFilter] = useState('all');
23
+ const [categoryFilter, setCategoryFilter] = useState('all');
24
+ // Load view mode preference from localStorage
25
+ const getStoredViewMode = () => {
26
+ if (typeof window === 'undefined')
27
+ return 'list';
28
+ const stored = localStorage.getItem(`${STORAGE_KEY_PREFIX}-${siteId}`);
29
+ return (stored === 'list' || stored === 'cards') ? stored : 'list';
30
+ };
31
+ const [viewMode, setViewMode] = useState(getStoredViewMode);
32
+ // Save view mode preference to localStorage when it changes
33
+ useEffect(() => {
34
+ if (typeof window !== 'undefined') {
35
+ localStorage.setItem(`${STORAGE_KEY_PREFIX}-${siteId}`, viewMode);
36
+ }
37
+ }, [viewMode, siteId]);
38
+ // Fetch posts from API
39
+ useEffect(() => {
40
+ const fetchPosts = async () => {
41
+ try {
42
+ setLoading(true);
43
+ const response = await fetch('/api/plugin-blog?admin=true');
44
+ const data = await response.json();
45
+ if (data.blogs && Array.isArray(data.blogs)) {
46
+ // Convert API format to PostListItem format
47
+ const postListItems = data.blogs.map((doc) => {
48
+ var _a;
49
+ const blogPost = apiToBlogPost(doc);
50
+ // Use semantic ID (id) - plugin-images handles resolution
51
+ // The id is the semantic ID (e.g., "blog-featured-{slug}") which plugin-images resolves
52
+ const featuredImageId = (_a = blogPost.metadata.featuredImage) === null || _a === void 0 ? void 0 : _a.id;
53
+ // Extract category from metadata or hero block
54
+ let category = undefined;
55
+ if (blogPost.metadata.categories && blogPost.metadata.categories.length > 0) {
56
+ category = blogPost.metadata.categories[0];
57
+ }
58
+ else {
59
+ // Check hero block for category
60
+ const heroBlock = blogPost.blocks.find(block => block.type === 'hero');
61
+ if (heroBlock && heroBlock.data && typeof heroBlock.data === 'object') {
62
+ const heroCategory = heroBlock.data.category;
63
+ if (heroCategory && typeof heroCategory === 'string' && heroCategory.trim()) {
64
+ category = heroCategory.trim();
65
+ }
66
+ }
67
+ }
68
+ return {
69
+ id: blogPost.id,
70
+ title: blogPost.title,
71
+ slug: blogPost.slug,
72
+ status: blogPost.publication.status,
73
+ date: blogPost.publication.date,
74
+ excerpt: blogPost.metadata.excerpt,
75
+ featuredImage: featuredImageId,
76
+ authorId: blogPost.publication.authorId,
77
+ updatedAt: blogPost.updatedAt,
78
+ category: category,
79
+ };
80
+ });
81
+ setPosts(postListItems);
82
+ setTotalPosts(data.total);
83
+ }
84
+ }
85
+ catch (error) {
86
+ console.error('Failed to fetch posts:', error);
87
+ }
88
+ finally {
89
+ setLoading(false);
90
+ }
91
+ };
92
+ fetchPosts();
93
+ }, []);
94
+ // Extract unique categories from posts
95
+ const categories = React.useMemo(() => {
96
+ const categorySet = new Set();
97
+ posts.forEach(post => {
98
+ if (post.category && post.category.trim()) {
99
+ categorySet.add(post.category.trim());
100
+ }
101
+ });
102
+ return Array.from(categorySet).sort();
103
+ }, [posts]);
104
+ // Filter posts
105
+ const filteredPosts = React.useMemo(() => {
106
+ return posts.filter((post) => {
107
+ var _a;
108
+ const matchesSearch = search === '' ||
109
+ post.title.toLowerCase().includes(search.toLowerCase()) ||
110
+ ((_a = post.excerpt) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(search.toLowerCase())) ||
111
+ post.slug.toLowerCase().includes(search.toLowerCase());
112
+ const matchesStatus = statusFilter === 'all' || post.status === statusFilter;
113
+ const matchesCategory = categoryFilter === 'all' || post.category === categoryFilter;
114
+ return matchesSearch && matchesStatus && matchesCategory;
115
+ });
116
+ }, [posts, search, statusFilter, categoryFilter]);
117
+ // Action handlers
118
+ const handleCreatePost = () => {
119
+ // Navigate to editor route - the plugin router will handle this
120
+ // The route 'new' maps to the editor view
121
+ window.location.href = '/dashboard/blog/new';
122
+ };
123
+ const handleEdit = (postId) => {
124
+ // Find the post to get its slug
125
+ const post = posts.find(p => p.id === postId);
126
+ if (post) {
127
+ // Navigate to editor with slug (API uses slug, not ID)
128
+ window.location.href = `/dashboard/blog/editor/${post.slug}`;
129
+ }
130
+ };
131
+ const handlePreview = (postId) => {
132
+ // Open preview in new tab
133
+ window.open(`/dashboard/blog/preview/${postId}`, '_blank');
134
+ };
135
+ const handleDuplicate = (postId) => {
136
+ // TODO: Implement duplicate functionality
137
+ const post = posts.find((p) => p.id === postId);
138
+ if (post) {
139
+ const duplicated = Object.assign(Object.assign({}, post), { id: `duplicate-${Date.now()}`, title: `${post.title} (Copy)`, slug: `${post.slug}-copy-${Date.now()}`, status: 'draft', updatedAt: new Date().toISOString() });
140
+ setPosts((prev) => [...prev, duplicated]);
141
+ }
142
+ };
143
+ const handleDelete = async (postId) => {
144
+ if (confirm('Are you sure you want to delete this post?')) {
145
+ try {
146
+ const post = posts.find(p => p.id === postId);
147
+ if (post) {
148
+ const response = await fetch(`/api/plugin-blog/${post.slug}`, {
149
+ method: 'DELETE',
150
+ });
151
+ if (response.ok) {
152
+ // Remove from local state
153
+ setPosts((prev) => prev.filter((p) => p.id !== postId));
154
+ setTotalPosts(prev => prev - 1);
155
+ }
156
+ else {
157
+ const error = await response.json();
158
+ alert(error.error || 'Failed to delete post');
159
+ }
160
+ }
161
+ }
162
+ catch (error) {
163
+ console.error('Failed to delete post:', error);
164
+ alert('Failed to delete post');
165
+ }
166
+ }
167
+ };
168
+ const hasActiveFilters = search !== '' || statusFilter !== 'all' || categoryFilter !== 'all';
169
+ return (_jsxs("div", { className: "h-full w-full rounded-[2.5rem] bg-white dark:bg-neutral-900 p-8 overflow-y-auto", children: [_jsxs("div", { className: "flex flex-col md:flex-row md:items-center justify-between gap-6 mb-8", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-3xl font-black text-neutral-950 dark:text-white uppercase tracking-tighter mb-2", children: "Blog Posts" }), _jsx("p", { className: "text-sm text-neutral-500 dark:text-neutral-400", children: "Manage your blog posts, drafts, and published content" })] }), _jsxs("button", { onClick: handleCreatePost, className: "inline-flex items-center gap-2 px-6 py-3 bg-primary text-white rounded-full text-[10px] font-black uppercase tracking-widest hover:bg-primary/90 transition-all shadow-lg shadow-primary/20", children: [_jsx(Plus, { size: 16 }), "New Post"] })] }), _jsx(PostStats, { total: totalPosts, posts: posts }), _jsxs("div", { className: "flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4 mb-6", children: [_jsx(PostFilters, { search: search, onSearchChange: setSearch, statusFilter: statusFilter, onStatusFilterChange: setStatusFilter, categoryFilter: categoryFilter, onCategoryFilterChange: setCategoryFilter, categories: categories }), _jsxs("div", { className: "flex items-center gap-2 bg-neutral-100 dark:bg-neutral-800/50 rounded-full p-1 border border-neutral-300 dark:border-neutral-700", children: [_jsx("button", { onClick: () => setViewMode('list'), className: `p-2 rounded-full transition-all ${viewMode === 'list'
170
+ ? 'bg-white dark:bg-neutral-900 text-primary shadow-sm'
171
+ : 'text-neutral-500 dark:text-neutral-400 hover:text-neutral-950 dark:hover:text-white'}`, title: "List View", children: _jsx(List, { size: 18 }) }), _jsx("button", { onClick: () => setViewMode('cards'), className: `p-2 rounded-full transition-all ${viewMode === 'cards'
172
+ ? 'bg-white dark:bg-neutral-900 text-primary shadow-sm'
173
+ : 'text-neutral-500 dark:text-neutral-400 hover:text-neutral-950 dark:hover:text-white'}`, title: "Card View", children: _jsx(Grid3x3, { size: 18 }) })] })] }), loading ? (_jsx("div", { className: "flex items-center justify-center py-20", children: _jsx("div", { className: "w-8 h-8 border-4 border-primary/20 border-t-primary rounded-full animate-spin" }) })) : filteredPosts.length === 0 ? (_jsx(EmptyState, { hasFilters: hasActiveFilters, onCreatePost: handleCreatePost })) : viewMode === 'list' ? (_jsx(PostTable, { posts: filteredPosts, locale: locale, onEdit: handleEdit, onPreview: handlePreview, onDuplicate: handleDuplicate, onDelete: handleDelete })) : (_jsx(PostCards, { posts: filteredPosts, locale: locale, onEdit: handleEdit, onPreview: handlePreview, onDuplicate: handleDuplicate, onDelete: handleDelete }))] }));
174
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Post Stats Component
3
+ * Displays summary statistics for blog posts
4
+ */
5
+ import { PostListItem } from '../../types/post';
6
+ export interface PostStatsProps {
7
+ posts: PostListItem[];
8
+ total: Number;
9
+ }
10
+ export declare function PostStats({ total, posts }: PostStatsProps): import("react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=PostStats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostStats.d.ts","sourceRoot":"","sources":["PostStats.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,MAAM,WAAW,cAAc;IAC3B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,cAAc,2CA+DzD"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Post Stats Component
3
+ * Displays summary statistics for blog posts
4
+ */
5
+ 'use client';
6
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
+ import { FileText, CheckCircle2, Clock, Archive } from 'lucide-react';
8
+ export function PostStats({ total, posts }) {
9
+ const published = posts.filter(p => p.status === 'published').length;
10
+ const drafts = posts.filter(p => p.status === 'draft').length;
11
+ const scheduled = posts.filter(p => p.status === 'scheduled').length;
12
+ const stats = [
13
+ {
14
+ label: 'Total Posts',
15
+ value: total,
16
+ icon: FileText,
17
+ color: 'text-neutral-600 dark:text-neutral-400',
18
+ bgColor: 'bg-neutral-100 dark:bg-neutral-800',
19
+ },
20
+ {
21
+ label: 'Published',
22
+ value: published,
23
+ icon: CheckCircle2,
24
+ color: 'text-green-600 dark:text-green-400',
25
+ bgColor: 'bg-green-500/10 dark:bg-green-500/20',
26
+ },
27
+ {
28
+ label: 'Drafts',
29
+ value: drafts,
30
+ icon: Clock,
31
+ color: 'text-amber-600 dark:text-amber-400',
32
+ bgColor: 'bg-amber-500/10 dark:bg-amber-500/20',
33
+ },
34
+ {
35
+ label: 'Scheduled',
36
+ value: scheduled,
37
+ icon: Archive,
38
+ color: 'text-blue-600 dark:text-blue-400',
39
+ bgColor: 'bg-blue-500/10 dark:bg-blue-500/20',
40
+ },
41
+ ];
42
+ return (_jsx("div", { className: "grid grid-cols-2 md:grid-cols-4 gap-4 mb-6", children: stats.map((stat) => {
43
+ const Icon = stat.icon;
44
+ return (_jsx("div", { className: `p-4 rounded-2xl border border-neutral-300 dark:border-neutral-700 ${stat.bgColor}`, children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: `p-2 rounded-xl ${stat.bgColor}`, children: _jsx(Icon, { className: `size-5 ${stat.color}` }) }), _jsxs("div", { children: [_jsx("p", { className: "text-2xl font-black text-neutral-950 dark:text-white", children: stat.value }), _jsx("p", { className: "text-xs text-neutral-500 dark:text-neutral-400 uppercase tracking-wider", children: stat.label })] })] }) }, stat.label));
45
+ }) }));
46
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Post Table Component
3
+ * Professional table layout for displaying posts
4
+ */
5
+ import { PostListItem } from '../../types/post';
6
+ export interface PostTableProps {
7
+ posts: PostListItem[];
8
+ locale: string;
9
+ onEdit: (postId: string) => void;
10
+ onPreview: (postId: string) => void;
11
+ onDuplicate: (postId: string) => void;
12
+ onDelete: (postId: string) => void;
13
+ }
14
+ export declare function PostTable({ posts, locale, onEdit, onPreview, onDuplicate, onDelete, }: PostTableProps): import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=PostTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostTable.d.ts","sourceRoot":"","sources":["PostTable.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,YAAY,EAAc,MAAM,kBAAkB,CAAC;AAI5D,MAAM,WAAW,cAAc;IAC3B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AA0BD,wBAAgB,SAAS,CAAC,EACtB,KAAK,EACL,MAAM,EACN,MAAM,EACN,SAAS,EACT,WAAW,EACX,QAAQ,GACX,EAAE,cAAc,2CA8KhB"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Post Table Component
3
+ * Professional table layout for displaying posts
4
+ */
5
+ 'use client';
6
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
+ import { useState, useEffect } from 'react';
8
+ import { Calendar, User, UserCheck } from 'lucide-react';
9
+ import { Image } from '@jhits/plugin-images';
10
+ import { PostActionsMenu } from './PostActionsMenu';
11
+ import { useSession } from 'next-auth/react';
12
+ function getStatusBadgeColor(status) {
13
+ switch (status) {
14
+ case 'published':
15
+ return 'bg-green-500/10 text-green-700 dark:text-green-400 border-green-500/20';
16
+ case 'draft':
17
+ return 'bg-amber-500/10 text-amber-700 dark:text-amber-400 border-amber-500/20';
18
+ case 'scheduled':
19
+ return 'bg-blue-500/10 text-blue-700 dark:text-blue-400 border-blue-500/20';
20
+ case 'archived':
21
+ return 'bg-neutral-500/10 text-neutral-700 dark:text-neutral-400 border-neutral-500/20';
22
+ default:
23
+ return 'bg-neutral-500/10 text-neutral-700 dark:text-neutral-400 border-neutral-500/20';
24
+ }
25
+ }
26
+ function formatDate(dateString, locale) {
27
+ if (!dateString)
28
+ return 'No date';
29
+ return new Date(dateString).toLocaleDateString(locale, {
30
+ day: 'numeric',
31
+ month: 'short',
32
+ year: 'numeric',
33
+ });
34
+ }
35
+ export function PostTable({ posts, locale, onEdit, onPreview, onDuplicate, onDelete, }) {
36
+ var _a;
37
+ const { data: session, status: sessionStatus } = useSession();
38
+ const currentUserId = (_a = session === null || session === void 0 ? void 0 : session.user) === null || _a === void 0 ? void 0 : _a.id;
39
+ const [userMap, setUserMap] = useState({});
40
+ // Helper function to check if user is the owner
41
+ const isPostOwner = (post) => {
42
+ if (sessionStatus === 'loading')
43
+ return false; // Don't show actions while loading
44
+ if (!currentUserId || !post.authorId)
45
+ return false;
46
+ // Convert both to strings for comparison to handle ObjectId vs string
47
+ return String(currentUserId) === String(post.authorId);
48
+ };
49
+ // Fetch users to map IDs to names
50
+ useEffect(() => {
51
+ const fetchUsers = async () => {
52
+ try {
53
+ const response = await fetch('/api/users');
54
+ const users = await response.json();
55
+ if (Array.isArray(users)) {
56
+ const map = {};
57
+ users.forEach((user) => {
58
+ var _a;
59
+ const id = (_a = user._id) === null || _a === void 0 ? void 0 : _a.toString();
60
+ if (id) {
61
+ map[id] = user.name || user.email || 'Unknown';
62
+ }
63
+ });
64
+ setUserMap(map);
65
+ }
66
+ }
67
+ catch (error) {
68
+ console.error('Failed to fetch users:', error);
69
+ }
70
+ };
71
+ fetchUsers();
72
+ }, []);
73
+ const getAuthorName = (authorId) => {
74
+ if (!authorId)
75
+ return 'Unknown';
76
+ return userMap[authorId] || authorId;
77
+ };
78
+ return (_jsx("div", { className: "bg-neutral-100 dark:bg-neutral-800/50 rounded-[2.5rem] border border-neutral-300 dark:border-neutral-700 overflow-hidden", children: _jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full", children: [_jsx("thead", { className: "bg-neutral-200 dark:bg-neutral-900/50 border-b border-neutral-300 dark:border-neutral-700", children: _jsxs("tr", { children: [_jsx("th", { className: "px-6 py-4 text-left text-[10px] font-black uppercase tracking-widest text-neutral-600 dark:text-neutral-400", children: "Post" }), _jsx("th", { className: "px-6 py-4 text-left text-[10px] font-black uppercase tracking-widest text-neutral-600 dark:text-neutral-400", children: "Author" }), _jsx("th", { className: "px-6 py-4 text-left text-[10px] font-black uppercase tracking-widest text-neutral-600 dark:text-neutral-400", children: "Category" }), _jsx("th", { className: "px-6 py-4 text-left text-[10px] font-black uppercase tracking-widest text-neutral-600 dark:text-neutral-400", children: "Status" }), _jsx("th", { className: "px-6 py-4 text-left text-[10px] font-black uppercase tracking-widest text-neutral-600 dark:text-neutral-400", children: "Last Modified" }), _jsx("th", { className: "px-6 py-4 text-right text-[10px] font-black uppercase tracking-widest text-neutral-600 dark:text-neutral-400", children: "Actions" })] }) }), _jsx("tbody", { className: "divide-y divide-neutral-300 dark:divide-neutral-700", children: posts.map((post) => (_jsxs("tr", { className: "hover:bg-white dark:hover:bg-neutral-900/50 transition-colors cursor-pointer", children: [_jsx("td", { className: "px-6 py-4", children: _jsxs("div", { className: "flex items-center gap-4", children: [post.featuredImage ? (_jsx("div", { className: "w-16 h-16 rounded-xl bg-neutral-200 dark:bg-neutral-700 overflow-hidden flex-shrink-0 relative", children: _jsx(Image, { id: post.featuredImage, alt: post.title, fill: true, editable: false, className: "w-full h-full object-cover" }) })) : (_jsx("div", { className: "w-16 h-16 rounded-xl bg-neutral-200 dark:bg-neutral-700 flex items-center justify-center flex-shrink-0", children: _jsx("span", { className: "text-xs text-neutral-400", children: "No Image" }) })), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("button", { onClick: () => onEdit(post.id), className: "text-left w-full hover:cursor-pointer p-0 m-0 border-0 bg-transparent", children: _jsx("h3", { className: "font-bold hover:underline text-neutral-950 dark:text-white mb-1 line-clamp-1 text-left", children: post.title.trim() }) }), _jsxs("p", { className: "text-xs text-neutral-500 dark:text-neutral-400 font-mono text-left", children: ["/", post.slug] })] })] }) }), _jsx("td", { className: "px-6 py-4", children: _jsxs("div", { className: "flex items-center gap-2", children: [isPostOwner(post) ? (_jsx(UserCheck, { size: 14, className: "text-primary" })) : (_jsx(User, { size: 14, className: "text-neutral-400" })), _jsxs("span", { className: `text-sm ${isPostOwner(post) ? 'text-primary font-semibold' : 'text-neutral-600 dark:text-neutral-400'}`, children: [getAuthorName(post.authorId), isPostOwner(post) && (_jsx("span", { className: "ml-2 text-xs text-primary/70", children: "(Jij)" }))] })] }) }), _jsx("td", { className: "px-6 py-4", children: _jsx("span", { className: "text-sm text-neutral-600 dark:text-neutral-400", children: post.category || 'Uncategorized' }) }), _jsx("td", { className: "px-6 py-4", children: _jsx("span", { className: `inline-flex items-center px-3 py-1 rounded-full text-[10px] font-black uppercase tracking-wider border ${getStatusBadgeColor(post.status)}`, children: post.status }) }), _jsx("td", { className: "px-6 py-4", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Calendar, { size: 14, className: "text-neutral-400" }), _jsx("span", { className: "text-sm text-neutral-600 dark:text-neutral-400", children: formatDate(post.updatedAt, locale) })] }) }), _jsx("td", { className: "px-6 py-4", children: isPostOwner(post) ? (_jsx("div", { className: "flex items-center justify-end", children: _jsx(PostActionsMenu, { onEdit: () => onEdit(post.id), onPreview: () => onPreview(post.id), onDuplicate: () => onDuplicate(post.id), onDelete: () => onDelete(post.id) }) })) : (_jsx("div", { className: "flex items-center justify-end text-neutral-400 text-xs", children: "Alleen auteur" })) })] }, post.id))) })] }) }) }));
79
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Post Manager View Exports
3
+ */
4
+ export { PostManagerView } from './PostManagerView';
5
+ export type { PostManagerViewProps } from './PostManagerView';
6
+ export { PostStats } from './PostStats';
7
+ export { PostFilters } from './PostFilters';
8
+ export { PostTable } from './PostTable';
9
+ export { PostCards } from './PostCards';
10
+ export { EmptyState } from './EmptyState';
11
+ export { PostActionsMenu } from './PostActionsMenu';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAG9D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Post Manager View Exports
3
+ */
4
+ export { PostManagerView } from './PostManagerView';
5
+ // Sub-components (for potential reuse)
6
+ export { PostStats } from './PostStats';
7
+ export { PostFilters } from './PostFilters';
8
+ export { PostTable } from './PostTable';
9
+ export { PostCards } from './PostCards';
10
+ export { EmptyState } from './EmptyState';
11
+ export { PostActionsMenu } from './PostActionsMenu';
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Preview Bridge View
3
+ * Live preview of blog post
4
+ * Follows dashboard earth-tone design system
5
+ */
6
+ export interface PreviewBridgeViewProps {
7
+ postId?: string;
8
+ siteId: string;
9
+ locale: string;
10
+ }
11
+ export declare function PreviewBridgeView({ postId, siteId, locale }: PreviewBridgeViewProps): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=PreviewBridgeView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreviewBridgeView.d.ts","sourceRoot":"","sources":["PreviewBridgeView.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,MAAM,WAAW,sBAAsB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,sBAAsB,2CA6CnF"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Preview Bridge View
3
+ * Live preview of blog post
4
+ * Follows dashboard earth-tone design system
5
+ */
6
+ 'use client';
7
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
8
+ import { ExternalLink, RefreshCw } from 'lucide-react';
9
+ export function PreviewBridgeView({ postId, siteId, locale }) {
10
+ return (_jsxs("div", { className: "h-full w-full bg-white dark:bg-neutral-900 flex flex-col", children: [_jsxs("div", { className: "flex items-center justify-between p-6 border-b border-neutral-300 dark:border-neutral-700 bg-neutral-100 dark:bg-neutral-800/50", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-xl font-black text-neutral-950 dark:text-white uppercase tracking-tighter", children: "Preview" }), _jsx("p", { className: "text-xs text-neutral-500 dark:text-neutral-400", children: postId ? `Previewing post: ${postId}` : 'Live preview of your post' })] }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsxs("button", { className: "inline-flex items-center gap-2 px-4 py-2 bg-neutral-200 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded-full text-[10px] font-black uppercase tracking-widest hover:bg-neutral-300 dark:hover:bg-neutral-600 transition-all", children: [_jsx(RefreshCw, { size: 14 }), "Refresh"] }), _jsxs("button", { className: "inline-flex items-center gap-2 px-4 py-2 bg-neutral-200 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded-full text-[10px] font-black uppercase tracking-widest hover:bg-neutral-300 dark:hover:bg-neutral-600 transition-all", children: [_jsx(ExternalLink, { size: 14 }), "Open in New Tab"] })] })] }), _jsx("div", { className: "flex-1 overflow-hidden bg-neutral-100 dark:bg-neutral-800/30", children: _jsx("div", { className: "h-full w-full p-8", children: _jsx("div", { className: "h-full w-full bg-white dark:bg-neutral-900 rounded-[2.5rem] border border-neutral-300 dark:border-neutral-700 overflow-hidden", children: _jsx("div", { className: "h-full w-full flex items-center justify-center", children: _jsxs("div", { className: "text-center", children: [_jsx("p", { className: "text-sm text-neutral-500 dark:text-neutral-400 mb-2", children: "Preview will be rendered here" }), _jsx("p", { className: "text-xs text-neutral-400", children: "Using iframe or side-by-side panel" })] }) }) }) }) })] }));
11
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Preview Bridge View Exports
3
+ */
4
+ export { PreviewBridgeView } from './PreviewBridgeView';
5
+ export type { PreviewBridgeViewProps } from './PreviewBridgeView';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Preview Bridge View Exports
3
+ */
4
+ export { PreviewBridgeView } from './PreviewBridgeView';
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Settings View - Development/Installation Screen
3
+ * Allows manual configuration of plugin settings (darkMode, backgroundColors)
4
+ */
5
+ export interface SettingsViewProps {
6
+ siteId: string;
7
+ locale: string;
8
+ }
9
+ export declare function SettingsView({ siteId, locale }: SettingsViewProps): import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=SettingsView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SettingsView.d.ts","sourceRoot":"","sources":["SettingsView.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,iBAAiB;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,iBAAiB,2CAyRjE"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Settings View - Development/Installation Screen
3
+ * Allows manual configuration of plugin settings (darkMode, backgroundColors)
4
+ */
5
+ 'use client';
6
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
+ import { useState, useEffect } from 'react';
8
+ import { Save, RotateCcw, Palette, Moon, Sun } from 'lucide-react';
9
+ export function SettingsView({ siteId, locale }) {
10
+ // Get current config from window global
11
+ const getCurrentConfig = () => {
12
+ var _a, _b;
13
+ if (typeof window !== 'undefined' && window.__JHITS_PLUGIN_PROPS__) {
14
+ const pluginProps = window.__JHITS_PLUGIN_PROPS__['plugin-blog'];
15
+ return {
16
+ darkMode: (_a = pluginProps === null || pluginProps === void 0 ? void 0 : pluginProps.darkMode) !== null && _a !== void 0 ? _a : true,
17
+ backgroundColors: (_b = pluginProps === null || pluginProps === void 0 ? void 0 : pluginProps.backgroundColors) !== null && _b !== void 0 ? _b : {
18
+ light: '#ffffff',
19
+ dark: '#171717',
20
+ },
21
+ };
22
+ }
23
+ return {
24
+ darkMode: true,
25
+ backgroundColors: {
26
+ light: '#ffffff',
27
+ dark: '#171717',
28
+ },
29
+ };
30
+ };
31
+ const [darkMode, setDarkMode] = useState(getCurrentConfig().darkMode);
32
+ const [lightBg, setLightBg] = useState(getCurrentConfig().backgroundColors.light);
33
+ const [darkBg, setDarkBg] = useState(getCurrentConfig().backgroundColors.dark || '#171717');
34
+ const [hasChanges, setHasChanges] = useState(false);
35
+ const [saved, setSaved] = useState(false);
36
+ // Check for changes
37
+ useEffect(() => {
38
+ const current = getCurrentConfig();
39
+ const hasChanges = darkMode !== current.darkMode ||
40
+ lightBg !== current.backgroundColors.light ||
41
+ darkBg !== (current.backgroundColors.dark || '#171717');
42
+ setHasChanges(hasChanges);
43
+ setSaved(false);
44
+ }, [darkMode, lightBg, darkBg]);
45
+ // Save configuration
46
+ const handleSave = () => {
47
+ if (typeof window === 'undefined')
48
+ return;
49
+ // Initialize window global if needed
50
+ if (!window.__JHITS_PLUGIN_PROPS__) {
51
+ window.__JHITS_PLUGIN_PROPS__ = {};
52
+ }
53
+ // Update configuration
54
+ window.__JHITS_PLUGIN_PROPS__['plugin-blog'] = Object.assign(Object.assign({}, (window.__JHITS_PLUGIN_PROPS__['plugin-blog'] || {})), { darkMode, backgroundColors: {
55
+ light: lightBg,
56
+ dark: darkBg,
57
+ } });
58
+ // Also save to localStorage for persistence
59
+ try {
60
+ localStorage.setItem('__JHITS_PLUGIN_BLOG_CONFIG__', JSON.stringify({
61
+ darkMode,
62
+ backgroundColors: {
63
+ light: lightBg,
64
+ dark: darkBg,
65
+ },
66
+ }));
67
+ }
68
+ catch (e) {
69
+ console.warn('[SettingsView] Failed to save to localStorage:', e);
70
+ }
71
+ setSaved(true);
72
+ setTimeout(() => setSaved(false), 2000);
73
+ // Trigger a custom event to notify other components
74
+ window.dispatchEvent(new CustomEvent('blog-plugin-config-updated', {
75
+ detail: { darkMode, backgroundColors: { light: lightBg, dark: darkBg } }
76
+ }));
77
+ console.log('[SettingsView] Configuration saved:', {
78
+ darkMode,
79
+ backgroundColors: { light: lightBg, dark: darkBg },
80
+ });
81
+ };
82
+ // Reset to defaults
83
+ const handleReset = () => {
84
+ setDarkMode(true);
85
+ setLightBg('#ffffff');
86
+ setDarkBg('#171717');
87
+ };
88
+ // Load from localStorage on mount
89
+ useEffect(() => {
90
+ var _a, _b, _c, _d, _e;
91
+ try {
92
+ const saved = localStorage.getItem('__JHITS_PLUGIN_BLOG_CONFIG__');
93
+ if (saved) {
94
+ const config = JSON.parse(saved);
95
+ setDarkMode((_a = config.darkMode) !== null && _a !== void 0 ? _a : true);
96
+ setLightBg((_c = (_b = config.backgroundColors) === null || _b === void 0 ? void 0 : _b.light) !== null && _c !== void 0 ? _c : '#ffffff');
97
+ setDarkBg((_e = (_d = config.backgroundColors) === null || _d === void 0 ? void 0 : _d.dark) !== null && _e !== void 0 ? _e : '#171717');
98
+ }
99
+ }
100
+ catch (e) {
101
+ console.warn('[SettingsView] Failed to load from localStorage:', e);
102
+ }
103
+ }, []);
104
+ return (_jsx("div", { className: "min-h-screen bg-neutral-50 dark:bg-neutral-900 p-8", children: _jsxs("div", { className: "max-w-4xl mx-auto", children: [_jsxs("div", { className: "mb-8", children: [_jsx("h1", { className: "text-4xl font-black uppercase tracking-tighter text-neutral-950 dark:text-white mb-2", children: "Blog Plugin Settings" }), _jsx("p", { className: "text-sm text-neutral-600 dark:text-neutral-400", children: "Configure editor appearance and behavior. Changes are applied immediately." })] }), _jsxs("div", { className: "bg-white dark:bg-neutral-800 rounded-[2.5rem] border border-neutral-200 dark:border-neutral-700 shadow-lg p-8", children: [_jsx("div", { className: "mb-8 pb-8 border-b border-neutral-200 dark:border-neutral-700", children: _jsxs("div", { className: "flex items-center justify-between mb-4", children: [_jsxs("div", { className: "flex items-center gap-3", children: [darkMode ? (_jsx(Moon, { className: "size-5 text-neutral-600 dark:text-neutral-400" })) : (_jsx(Sun, { className: "size-5 text-neutral-600 dark:text-neutral-400" })), _jsxs("div", { children: [_jsx("label", { className: "text-sm font-black uppercase tracking-widest text-neutral-600 dark:text-neutral-400", children: "Dark Mode" }), _jsx("p", { className: "text-xs text-neutral-500 dark:text-neutral-500 mt-1", children: "Enable dark mode for editor content area and wrappers" })] })] }), _jsx("button", { onClick: () => setDarkMode(!darkMode), className: `relative inline-flex h-6 w-11 items-center rounded-full transition-colors ${darkMode
105
+ ? 'bg-primary'
106
+ : 'bg-neutral-300 dark:bg-neutral-600'}`, children: _jsx("span", { className: `inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${darkMode ? 'translate-x-6' : 'translate-x-1'}` }) })] }) }), _jsxs("div", { className: "mb-8", children: [_jsxs("div", { className: "flex items-center gap-3 mb-6", children: [_jsx(Palette, { className: "size-5 text-neutral-600 dark:text-neutral-400" }), _jsxs("div", { children: [_jsx("label", { className: "text-sm font-black uppercase tracking-widest text-neutral-600 dark:text-neutral-400", children: "Background Colors" }), _jsx("p", { className: "text-xs text-neutral-500 dark:text-neutral-500 mt-1", children: "Set custom background colors for the editor canvas" })] })] }), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsxs("label", { className: "block text-[10px] font-black uppercase tracking-widest text-neutral-500 dark:text-neutral-500 mb-2", children: ["Light Mode Background ", _jsx("span", { className: "text-red-500", children: "*" })] }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("input", { type: "text", value: lightBg, onChange: (e) => setLightBg(e.target.value), placeholder: "#ffffff", className: "flex-1 bg-dashboard-card border border-dashboard-border p-4 rounded-2xl text-sm font-bold outline-none focus:border-primary transition-all text-dashboard-text" }), _jsx("div", { className: "w-16 h-16 rounded-xl border-2 border-neutral-200 dark:border-neutral-700", style: { backgroundColor: lightBg } })] }), _jsx("p", { className: "text-xs text-neutral-400 dark:text-neutral-600 mt-1", children: "CSS color value (hex, rgb, or named color)" })] }), _jsxs("div", { children: [_jsxs("label", { className: "block text-[10px] font-black uppercase tracking-widest text-neutral-500 dark:text-neutral-500 mb-2", children: ["Dark Mode Background ", _jsx("span", { className: "text-neutral-400", children: "(Optional)" })] }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("input", { type: "text", value: darkBg, onChange: (e) => setDarkBg(e.target.value), placeholder: "#171717", disabled: !darkMode, className: `flex-1 bg-white dark:bg-neutral-900/50 border border-neutral-300 dark:border-neutral-700 p-4 rounded-2xl text-sm font-bold outline-none focus:border-primary transition-all dark:text-neutral-100 ${!darkMode ? 'opacity-50 cursor-not-allowed' : ''}` }), _jsx("div", { className: `w-16 h-16 rounded-xl border-2 border-neutral-200 dark:border-neutral-700 ${!darkMode ? 'opacity-50' : ''}`, style: { backgroundColor: darkBg } })] }), _jsx("p", { className: "text-xs text-neutral-400 dark:text-neutral-600 mt-1", children: "Only used when dark mode is enabled" })] })] })] }), _jsxs("div", { className: "mb-8 p-6 bg-neutral-50 dark:bg-neutral-900/50 rounded-2xl border border-neutral-200 dark:border-neutral-700", children: [_jsx("label", { className: "block text-[10px] font-black uppercase tracking-widest text-neutral-500 dark:text-neutral-500 mb-3", children: "Preview" }), _jsx("div", { className: "h-32 rounded-xl border-2 border-dashed border-neutral-300 dark:border-neutral-700 flex items-center justify-center", style: {
107
+ backgroundColor: darkMode ? darkBg : lightBg,
108
+ }, children: _jsx("span", { className: "text-xs font-bold uppercase tracking-widest text-neutral-600 dark:text-neutral-400", children: "Editor Canvas Preview" }) })] }), _jsxs("div", { className: "flex items-center justify-between pt-6 border-t border-neutral-200 dark:border-neutral-700", children: [_jsxs("button", { onClick: handleReset, className: "px-6 py-3 rounded-full border border-neutral-300 dark:border-neutral-700 bg-white dark:bg-neutral-900/50 text-sm font-black uppercase tracking-widest text-neutral-600 dark:text-neutral-400 hover:bg-neutral-50 dark:hover:bg-neutral-800 transition-colors flex items-center gap-2", children: [_jsx(RotateCcw, { className: "size-4" }), "Reset"] }), _jsxs("button", { onClick: handleSave, disabled: !hasChanges, className: `px-6 py-3 rounded-full text-sm font-black uppercase tracking-widest transition-all flex items-center gap-2 ${hasChanges
109
+ ? 'bg-primary text-white hover:bg-primary/90 shadow-lg shadow-primary/20'
110
+ : 'bg-neutral-200 dark:bg-neutral-700 text-neutral-400 dark:text-neutral-600 cursor-not-allowed'}`, children: [_jsx(Save, { className: "size-4" }), saved ? 'Saved!' : 'Save Changes'] })] })] }), _jsxs("div", { className: "mt-6 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-2xl p-6", children: [_jsx("h3", { className: "text-sm font-black uppercase tracking-widest text-blue-900 dark:text-blue-300 mb-2", children: "How It Works" }), _jsxs("ul", { className: "text-xs text-blue-800 dark:text-blue-400 space-y-1 list-disc list-inside", children: [_jsxs("li", { children: ["Changes are saved to ", _jsx("code", { className: "bg-blue-100 dark:bg-blue-900/50 px-1 rounded", children: "window.__JHITS_PLUGIN_PROPS__" }), " and localStorage"] }), _jsx("li", { children: "Configuration persists across page refreshes" }), _jsx("li", { children: "To apply changes in the editor, navigate to a post editor page" }), _jsx("li", { children: "For production, configure these settings in your client app's blog config file" })] })] })] }) }));
111
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Settings View Exports
3
+ */
4
+ export { SettingsView } from './SettingsView';
5
+ export type { SettingsViewProps } from './SettingsView';
6
+ //# sourceMappingURL=index.d.ts.map