@jhits/plugin-blog 0.0.19 → 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 -490
  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 -594
  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,5 +1,5 @@
1
1
  /**
2
- * Settings View - Development/Installation Screen
2
+ * Settings View - Theme Configuration
3
3
  * Allows manual configuration of plugin settings (darkMode, backgroundColors)
4
4
  */
5
5
 
@@ -56,14 +56,8 @@ export function SettingsView({ siteId, locale }: SettingsViewProps) {
56
56
  const handleSave = () => {
57
57
  if (typeof window === 'undefined') return;
58
58
 
59
- // Initialize window global if needed
60
- if (!(window as any).__JHITS_PLUGIN_PROPS__) {
61
- (window as any).__JHITS_PLUGIN_PROPS__ = {};
62
- }
63
-
64
59
  // Update configuration
65
- (window as any).__JHITS_PLUGIN_PROPS__['plugin-blog'] = {
66
- ...((window as any).__JHITS_PLUGIN_PROPS__['plugin-blog'] || {}),
60
+ const config = {
67
61
  darkMode,
68
62
  backgroundColors: {
69
63
  light: lightBg,
@@ -71,41 +65,26 @@ export function SettingsView({ siteId, locale }: SettingsViewProps) {
71
65
  },
72
66
  };
73
67
 
74
- // Also save to localStorage for persistence
75
- try {
76
- localStorage.setItem('__JHITS_PLUGIN_BLOG_CONFIG__', JSON.stringify({
77
- darkMode,
78
- backgroundColors: {
79
- light: lightBg,
80
- dark: darkBg,
81
- },
82
- }));
83
- } catch (e) {
84
- console.warn('[SettingsView] Failed to save to localStorage:', e);
68
+ if (!(window as any).__JHITS_PLUGIN_PROPS__) {
69
+ (window as any).__JHITS_PLUGIN_PROPS__ = {};
85
70
  }
71
+ (window as any).__JHITS_PLUGIN_PROPS__['plugin-blog'] = {
72
+ ...((window as any).__JHITS_PLUGIN_PROPS__['plugin-blog'] || {}),
73
+ ...config
74
+ };
86
75
 
76
+ localStorage.setItem('__JHITS_PLUGIN_BLOG_CONFIG__', JSON.stringify(config));
87
77
  setSaved(true);
88
78
  setTimeout(() => setSaved(false), 2000);
89
-
90
- // Trigger a custom event to notify other components
91
- window.dispatchEvent(new CustomEvent('blog-plugin-config-updated', {
92
- detail: { darkMode, backgroundColors: { light: lightBg, dark: darkBg } }
93
- }));
94
-
95
- console.log('[SettingsView] Configuration saved:', {
96
- darkMode,
97
- backgroundColors: { light: lightBg, dark: darkBg },
98
- });
79
+ window.dispatchEvent(new CustomEvent('blog-plugin-config-updated', { detail: config }));
99
80
  };
100
81
 
101
- // Reset to defaults
102
82
  const handleReset = () => {
103
83
  setDarkMode(true);
104
84
  setLightBg('#ffffff');
105
85
  setDarkBg('#171717');
106
86
  };
107
87
 
108
- // Load from localStorage on mount
109
88
  useEffect(() => {
110
89
  try {
111
90
  const saved = localStorage.getItem('__JHITS_PLUGIN_BLOG_CONFIG__');
@@ -115,184 +94,89 @@ export function SettingsView({ siteId, locale }: SettingsViewProps) {
115
94
  setLightBg(config.backgroundColors?.light ?? '#ffffff');
116
95
  setDarkBg(config.backgroundColors?.dark ?? '#171717');
117
96
  }
118
- } catch (e) {
119
- console.warn('[SettingsView] Failed to load from localStorage:', e);
120
- }
97
+ } catch (e) { }
121
98
  }, []);
122
99
 
123
100
  return (
124
- <div className="min-h-screen bg-neutral-50 dark:bg-neutral-900 p-8">
125
- <div className="max-w-4xl mx-auto">
126
- {/* Header */}
127
- <div className="mb-8">
128
- <h1 className="text-4xl font-black uppercase tracking-tighter text-neutral-950 dark:text-white mb-2">
129
- Blog Plugin Settings
101
+ <div className="w-full flex flex-col space-y-8 px-6 lg:px-10 py-6 lg:py-10 bg-transparent">
102
+ <div className="max-w-4xl">
103
+ <div className="mb-8 px-2">
104
+ <h1 className="text-4xl font-bold text-dashboard-text tracking-tight leading-none mb-2">
105
+ Blog <span className="text-primary italic">Configuration</span>
130
106
  </h1>
131
- <p className="text-sm text-neutral-600 dark:text-neutral-400">
132
- Configure editor appearance and behavior. Changes are applied immediately.
107
+ <p className="text-sm text-dashboard-text-secondary font-medium opacity-80">
108
+ Customize your editorial environment and visual preferences.
133
109
  </p>
134
110
  </div>
135
111
 
136
- {/* Settings Card */}
137
- <div className="bg-white dark:bg-neutral-800 rounded-[2.5rem] border border-neutral-200 dark:border-neutral-700 shadow-lg p-8">
138
- {/* Dark Mode Toggle */}
139
- <div className="mb-8 pb-8 border-b border-neutral-200 dark:border-neutral-700">
140
- <div className="flex items-center justify-between mb-4">
141
- <div className="flex items-center gap-3">
142
- {darkMode ? (
143
- <Moon className="size-5 text-neutral-600 dark:text-neutral-400" />
144
- ) : (
145
- <Sun className="size-5 text-neutral-600 dark:text-neutral-400" />
146
- )}
112
+ <div className="bg-dashboard-card/40 backdrop-blur-xl rounded-[2.5rem] border border-dashboard-border/40 shadow-sm p-8 lg:p-10">
113
+ <div className="mb-10 pb-8 border-b border-dashboard-border/30">
114
+ <div className="flex items-center justify-between">
115
+ <div className="flex items-center gap-4">
116
+ <div className="size-10 rounded-xl bg-primary/10 flex items-center justify-center text-primary border border-primary/20">
117
+ {darkMode ? <Moon size={20} /> : <Sun size={20} />}
118
+ </div>
147
119
  <div>
148
- <label className="text-sm font-black uppercase tracking-widest text-neutral-600 dark:text-neutral-400">
149
- Dark Mode
150
- </label>
151
- <p className="text-xs text-neutral-500 dark:text-neutral-500 mt-1">
152
- Enable dark mode for editor content area and wrappers
153
- </p>
120
+ <label className="text-sm font-bold text-dashboard-text uppercase tracking-wider block">Visual Mode</label>
121
+ <p className="text-xs text-dashboard-text-secondary mt-0.5 opacity-70">Synchronize editor with system preference</p>
154
122
  </div>
155
123
  </div>
156
- <button
157
- onClick={() => setDarkMode(!darkMode)}
158
- className={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors ${
159
- darkMode
160
- ? 'bg-primary'
161
- : 'bg-neutral-300 dark:bg-neutral-600'
162
- }`}
124
+ <button
125
+ onClick={() => setDarkMode(!darkMode)}
126
+ className={`relative inline-flex h-6 w-11 items-center rounded-full transition-all ${darkMode ? 'bg-primary shadow-lg shadow-primary/20' : 'bg-neutral-300 dark:bg-neutral-700'}`}
163
127
  >
164
- <span
165
- className={`inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${
166
- darkMode ? 'translate-x-6' : 'translate-x-1'
167
- }`}
168
- />
128
+ <span className={`inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${darkMode ? 'translate-x-6' : 'translate-x-1'}`} />
169
129
  </button>
170
130
  </div>
171
131
  </div>
172
132
 
173
- {/* Background Colors */}
174
- <div className="mb-8">
175
- <div className="flex items-center gap-3 mb-6">
176
- <Palette className="size-5 text-neutral-600 dark:text-neutral-400" />
177
- <div>
178
- <label className="text-sm font-black uppercase tracking-widest text-neutral-600 dark:text-neutral-400">
179
- Background Colors
180
- </label>
181
- <p className="text-xs text-neutral-500 dark:text-neutral-500 mt-1">
182
- Set custom background colors for the editor canvas
183
- </p>
133
+ <div className="mb-10">
134
+ <div className="flex items-center gap-4 mb-8">
135
+ <div className="size-10 rounded-xl bg-amber-500/10 flex items-center justify-center text-amber-500 border border-amber-500/20">
136
+ <Palette size={20} />
184
137
  </div>
138
+ <label className="text-sm font-bold text-dashboard-text uppercase tracking-wider">Canvas Aesthetics</label>
185
139
  </div>
186
-
187
- <div className="space-y-4">
188
- {/* Light Mode Background */}
189
- <div>
190
- <label className="block text-[10px] font-black uppercase tracking-widest text-neutral-500 dark:text-neutral-500 mb-2">
191
- Light Mode Background <span className="text-red-500">*</span>
192
- </label>
193
- <div className="flex items-center gap-3">
194
- <input
195
- type="text"
196
- value={lightBg}
197
- onChange={(e) => setLightBg(e.target.value)}
198
- placeholder="#ffffff"
199
- 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"
200
- />
201
- <div
202
- className="w-16 h-16 rounded-xl border-2 border-neutral-200 dark:border-neutral-700"
203
- style={{ backgroundColor: lightBg }}
204
- />
205
- </div>
206
- <p className="text-xs text-neutral-400 dark:text-neutral-600 mt-1">
207
- CSS color value (hex, rgb, or named color)
208
- </p>
140
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-8">
141
+ <div className="space-y-3">
142
+ <label className="block text-[10px] font-bold uppercase tracking-[0.2em] text-dashboard-text-secondary ml-1 opacity-60 text-primary">Light Protocol</label>
143
+ <input
144
+ type="text"
145
+ value={lightBg}
146
+ onChange={e => setLightBg(e.target.value)}
147
+ className="w-full bg-dashboard-bg/50 border border-dashboard-border/40 p-4 rounded-2xl text-sm font-semibold outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary/30 text-dashboard-text transition-all"
148
+ />
209
149
  </div>
210
-
211
- {/* Dark Mode Background */}
212
- <div>
213
- <label className="block text-[10px] font-black uppercase tracking-widest text-neutral-500 dark:text-neutral-500 mb-2">
214
- Dark Mode Background <span className="text-neutral-400">(Optional)</span>
215
- </label>
216
- <div className="flex items-center gap-3">
217
- <input
218
- type="text"
219
- value={darkBg}
220
- onChange={(e) => setDarkBg(e.target.value)}
221
- placeholder="#171717"
222
- disabled={!darkMode}
223
- 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 ${
224
- !darkMode ? 'opacity-50 cursor-not-allowed' : ''
225
- }`}
226
- />
227
- <div
228
- className={`w-16 h-16 rounded-xl border-2 border-neutral-200 dark:border-neutral-700 ${
229
- !darkMode ? 'opacity-50' : ''
230
- }`}
231
- style={{ backgroundColor: darkBg }}
232
- />
233
- </div>
234
- <p className="text-xs text-neutral-400 dark:text-neutral-600 mt-1">
235
- Only used when dark mode is enabled
236
- </p>
150
+ <div className="space-y-3">
151
+ <label className="block text-[10px] font-bold uppercase tracking-[0.2em] text-dashboard-text-secondary ml-1 opacity-60 text-primary">Dark Protocol</label>
152
+ <input
153
+ type="text"
154
+ value={darkBg}
155
+ onChange={e => setDarkBg(e.target.value)}
156
+ disabled={!darkMode}
157
+ className="w-full bg-dashboard-bg/50 border border-dashboard-border/40 p-4 rounded-2xl text-sm font-semibold outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary/30 text-dashboard-text disabled:opacity-30 transition-all"
158
+ />
237
159
  </div>
238
160
  </div>
239
161
  </div>
240
162
 
241
- {/* Preview */}
242
- <div className="mb-8 p-6 bg-neutral-50 dark:bg-neutral-900/50 rounded-2xl border border-neutral-200 dark:border-neutral-700">
243
- <label className="block text-[10px] font-black uppercase tracking-widest text-neutral-500 dark:text-neutral-500 mb-3">
244
- Preview
245
- </label>
246
- <div
247
- className="h-32 rounded-xl border-2 border-dashed border-neutral-300 dark:border-neutral-700 flex items-center justify-center"
248
- style={{
249
- backgroundColor: darkMode ? darkBg : lightBg,
250
- }}
251
- >
252
- <span className="text-xs font-bold uppercase tracking-widest text-neutral-600 dark:text-neutral-400">
253
- Editor Canvas Preview
254
- </span>
255
- </div>
256
- </div>
257
-
258
- {/* Actions */}
259
- <div className="flex items-center justify-between pt-6 border-t border-neutral-200 dark:border-neutral-700">
260
- <button
261
- onClick={handleReset}
262
- 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"
163
+ <div className="flex items-center justify-between pt-8 border-t border-dashboard-border/30">
164
+ <button
165
+ onClick={handleReset}
166
+ className="px-6 py-3.5 rounded-2xl border border-dashboard-border/60 text-xs font-bold uppercase tracking-widest text-dashboard-text-secondary hover:text-dashboard-text hover:bg-dashboard-bg/50 transition-all active:scale-95"
263
167
  >
264
- <RotateCcw className="size-4" />
265
- Reset
168
+ <RotateCcw size={14} className="inline mr-2" /> Restore Factory
266
169
  </button>
267
- <button
268
- onClick={handleSave}
269
- disabled={!hasChanges}
270
- className={`px-6 py-3 rounded-full text-sm font-black uppercase tracking-widest transition-all flex items-center gap-2 ${
271
- hasChanges
272
- ? 'bg-primary text-white hover:bg-primary/90 shadow-lg shadow-primary/20'
273
- : 'bg-neutral-200 dark:bg-neutral-700 text-neutral-400 dark:text-neutral-600 cursor-not-allowed'
274
- }`}
170
+ <button
171
+ onClick={handleSave}
172
+ disabled={!hasChanges}
173
+ className={`px-8 py-3.5 rounded-2xl text-xs font-bold uppercase tracking-widest transition-all flex items-center gap-2 ${hasChanges ? 'bg-primary text-white shadow-xl shadow-primary/25 hover:scale-[1.02]' : 'bg-neutral-100 dark:bg-neutral-800 text-dashboard-text-secondary opacity-40 cursor-not-allowed'}`}
275
174
  >
276
- <Save className="size-4" />
277
- {saved ? 'Saved!' : 'Save Changes'}
175
+ <Save size={16} /> {saved ? 'System Updated' : 'Commit Changes'}
278
176
  </button>
279
177
  </div>
280
178
  </div>
281
-
282
- {/* Info Card */}
283
- <div className="mt-6 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-2xl p-6">
284
- <h3 className="text-sm font-black uppercase tracking-widest text-blue-900 dark:text-blue-300 mb-2">
285
- How It Works
286
- </h3>
287
- <ul className="text-xs text-blue-800 dark:text-blue-400 space-y-1 list-disc list-inside">
288
- <li>Changes are saved to <code className="bg-blue-100 dark:bg-blue-900/50 px-1 rounded">window.__JHITS_PLUGIN_PROPS__</code> and localStorage</li>
289
- <li>Configuration persists across page refreshes</li>
290
- <li>To apply changes in the editor, navigate to a post editor page</li>
291
- <li>For production, configure these settings in your client app's blog config file</li>
292
- </ul>
293
- </div>
294
179
  </div>
295
180
  </div>
296
181
  );
297
182
  }
298
-
@@ -7,7 +7,7 @@
7
7
  'use client';
8
8
 
9
9
  import React from 'react';
10
- import { Search, Link2, FileText } from 'lucide-react';
10
+ import { Search, Link2, FileText, Globe } from 'lucide-react';
11
11
 
12
12
  export interface SlugSEOManagerViewProps {
13
13
  postId?: string;
@@ -17,78 +17,93 @@ export interface SlugSEOManagerViewProps {
17
17
 
18
18
  export function SlugSEOManagerView({ postId, siteId, locale }: SlugSEOManagerViewProps) {
19
19
  return (
20
- <div className="h-full w-full bg-white dark:bg-neutral-900 p-8 overflow-y-auto">
21
- <div className="max-w-4xl mx-auto">
22
- <h1 className="text-3xl font-black text-neutral-950 dark:text-white uppercase tracking-tighter mb-2">
23
- Slug & SEO Manager
24
- </h1>
25
- <p className="text-sm text-neutral-500 dark:text-neutral-400 mb-8">
26
- {postId ? `Managing SEO for post: ${postId}` : 'Manage URL slugs and SEO metadata'}
27
- </p>
20
+ <div className="w-full flex flex-col space-y-8 px-6 lg:px-10 py-6 lg:py-10 bg-transparent overflow-y-auto">
21
+ <div className="max-w-4xl">
22
+ <div className="mb-8 px-2">
23
+ <h1 className="text-4xl font-bold text-dashboard-text tracking-tight leading-none mb-2">
24
+ Search <span className="text-primary italic">&</span> Discovery
25
+ </h1>
26
+ <p className="text-sm text-dashboard-text-secondary font-medium opacity-80">
27
+ {postId ? `Optimizing visibility for: ${postId}` : 'Manage URL architecture and search engine metadata'}
28
+ </p>
29
+ </div>
28
30
 
29
31
  <div className="space-y-6">
30
32
  {/* Slug Editor */}
31
- <div className="p-6 bg-neutral-100 dark:bg-neutral-800/50 rounded-[2.5rem] border border-neutral-300 dark:border-neutral-700">
32
- <label className="block text-sm font-black text-neutral-950 dark:text-white uppercase tracking-tight mb-3">
33
- URL Slug
34
- </label>
33
+ <div className="p-8 bg-dashboard-card/40 backdrop-blur-xl rounded-[2.5rem] border border-dashboard-border/40 shadow-sm">
34
+ <div className="flex items-center gap-3 mb-4 ml-1">
35
+ <Link2 className="text-primary size-5" />
36
+ <label className="block text-sm font-bold text-dashboard-text uppercase tracking-wider">
37
+ URL Identifier
38
+ </label>
39
+ </div>
35
40
  <div className="flex items-center gap-3">
36
- <Link2 className="text-neutral-400 size-5" />
37
41
  <input
38
42
  type="text"
39
- placeholder="post-url-slug"
40
- className="flex-1 px-4 py-3 bg-white dark:bg-neutral-900 border border-neutral-300 dark:border-neutral-700 rounded-2xl text-sm focus:ring-2 focus:ring-primary/20 focus:border-primary outline-none"
43
+ placeholder="article-url-slug"
44
+ className="flex-1 px-5 py-4 bg-dashboard-bg/50 border border-dashboard-border/40 rounded-2xl text-sm font-semibold text-dashboard-text outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary/30 transition-all"
41
45
  />
42
46
  </div>
43
- <p className="text-xs text-neutral-500 dark:text-neutral-400 mt-2">
44
- Collision detection will appear here
47
+ <p className="text-[10px] font-bold text-dashboard-text-secondary uppercase tracking-widest mt-3 ml-1 opacity-50">
48
+ Automatic collision detection active
45
49
  </p>
46
50
  </div>
47
51
 
48
52
  {/* SEO Preview */}
49
- <div className="p-6 bg-neutral-100 dark:bg-neutral-800/50 rounded-[2.5rem] border border-neutral-300 dark:border-neutral-700">
50
- <label className="block text-sm font-black text-neutral-950 dark:text-white uppercase tracking-tight mb-3">
51
- Search Result Preview
52
- </label>
53
- <div className="bg-white dark:bg-neutral-900 rounded-2xl p-4 border border-neutral-300 dark:border-neutral-700">
54
- <div className="flex items-center gap-2 mb-2">
55
- <Search size={16} className="text-neutral-400" />
56
- <span className="text-xs text-neutral-500">Google Search Result</span>
53
+ <div className="p-8 bg-dashboard-card/40 backdrop-blur-xl rounded-[2.5rem] border border-dashboard-border/40 shadow-sm">
54
+ <div className="flex items-center gap-3 mb-4 ml-1">
55
+ <Search className="text-primary size-5" />
56
+ <label className="block text-sm font-bold text-dashboard-text uppercase tracking-wider">
57
+ Search Engine Preview
58
+ </label>
59
+ </div>
60
+ <div className="bg-white dark:bg-neutral-900 rounded-2xl p-6 border border-neutral-200 dark:border-neutral-800 shadow-inner">
61
+ <div className="flex items-center gap-2 mb-3">
62
+ <div className="size-4 rounded-full bg-neutral-100 dark:bg-neutral-800 flex items-center justify-center">
63
+ <Globe size={10} className="text-neutral-400" />
64
+ </div>
65
+ <span className="text-[10px] font-bold text-neutral-400 uppercase tracking-widest">Global Result</span>
57
66
  </div>
58
- <div className="space-y-1">
59
- <h3 className="text-lg text-blue-600 dark:text-blue-400 hover:underline cursor-pointer">
60
- Post Title Will Appear Here
67
+ <div className="space-y-1.5">
68
+ <h3 className="text-xl text-blue-600 dark:text-blue-400 font-medium hover:underline cursor-pointer leading-tight">
69
+ Publication Title Will Appear Here
61
70
  </h3>
62
- <p className="text-sm text-green-700 dark:text-green-400">
63
- https://example.com/blog/post-url-slug
71
+ <p className="text-sm text-emerald-700 dark:text-emerald-500 font-medium">
72
+ https://yourdomain.com/blog/article-url-slug
64
73
  </p>
65
- <p className="text-sm text-neutral-600 dark:text-neutral-400">
66
- Meta description will appear here. This is what users see in search results.
74
+ <p className="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-2">
75
+ Meta description will appear here. This is the snippet users see when discovering your content via search protocols.
67
76
  </p>
68
77
  </div>
69
78
  </div>
70
79
  </div>
71
80
 
72
81
  {/* Meta Description */}
73
- <div className="p-6 bg-neutral-100 dark:bg-neutral-800/50 rounded-[2.5rem] border border-neutral-300 dark:border-neutral-700">
74
- <label className="block text-sm font-black text-neutral-950 dark:text-white uppercase tracking-tight mb-3">
75
- Meta Description
76
- </label>
82
+ <div className="p-8 bg-dashboard-card/40 backdrop-blur-xl rounded-[2.5rem] border border-dashboard-border/40 shadow-sm">
83
+ <div className="flex items-center gap-3 mb-4 ml-1">
84
+ <FileText className="text-primary size-5" />
85
+ <label className="block text-sm font-bold text-dashboard-text uppercase tracking-wider">
86
+ Metadata Summary
87
+ </label>
88
+ </div>
77
89
  <div className="flex items-start gap-3">
78
- <FileText className="text-neutral-400 size-5 mt-1" />
79
90
  <textarea
80
- placeholder="Enter meta description for search engines..."
91
+ placeholder="Enter meta description for indexing..."
81
92
  rows={4}
82
- className="flex-1 px-4 py-3 bg-white dark:bg-neutral-900 border border-neutral-300 dark:border-neutral-700 rounded-2xl text-sm focus:ring-2 focus:ring-primary/20 focus:border-primary outline-none resize-none"
93
+ className="flex-1 px-5 py-4 bg-dashboard-bg/50 border border-dashboard-border/40 rounded-2xl text-sm font-semibold text-dashboard-text outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary/30 transition-all resize-none"
83
94
  />
84
95
  </div>
85
- <p className="text-xs text-neutral-500 dark:text-neutral-400 mt-2">
86
- 0 / 160 characters
87
- </p>
96
+ <div className="flex justify-between items-center mt-3 px-1">
97
+ <p className="text-[10px] font-bold text-dashboard-text-secondary uppercase tracking-widest opacity-50">
98
+ Recommended: 150-160 characters
99
+ </p>
100
+ <span className="text-[10px] font-bold text-primary uppercase tracking-widest">
101
+ 0 / 160
102
+ </span>
103
+ </div>
88
104
  </div>
89
105
  </div>
90
106
  </div>
91
107
  </div>
92
108
  );
93
109
  }
94
-
@@ -1,8 +0,0 @@
1
- /**
2
- * Blog Hooks
3
- * React hooks for fetching blog data in client applications
4
- */
5
- export { useBlogs, type UseBlogsOptions, type UseBlogsResult } from './useBlogs';
6
- export { useBlog, type UseBlogOptions, type UseBlogResult } from './useBlog';
7
- export { useCategories } from './useCategories';
8
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,31 +0,0 @@
1
- /**
2
- * useBlog Hook
3
- * React hook for fetching a single blog post by slug
4
- */
5
- import { BlogPost } from '../types/post';
6
- export interface UseBlogOptions {
7
- /** Blog post slug */
8
- slug: string;
9
- /** API base URL (default: '/api/blogs') */
10
- apiBaseUrl?: string;
11
- }
12
- export interface UseBlogResult {
13
- /** Blog post data */
14
- blog: BlogPost | null;
15
- /** Whether data is currently loading */
16
- loading: boolean;
17
- /** Error message if fetch failed */
18
- error: string | null;
19
- /** Function to refetch the blog post */
20
- refetch: () => Promise<void>;
21
- }
22
- /**
23
- * React hook to fetch a single blog post by slug
24
- *
25
- * @example
26
- * ```tsx
27
- * const { blog, loading, error } = useBlog({ slug: 'my-blog-post' });
28
- * ```
29
- */
30
- export declare function useBlog(options: UseBlogOptions): UseBlogResult;
31
- //# sourceMappingURL=useBlog.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useBlog.d.ts","sourceRoot":"","sources":["useBlog.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,WAAW,cAAc;IAC3B,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC1B,qBAAqB;IACrB,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,wCAAwC;IACxC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CAgD9D"}
@@ -1,39 +0,0 @@
1
- /**
2
- * useBlogs Hook
3
- * React hook for fetching blog posts in client applications
4
- */
5
- import { PostListItem } from '../types/post';
6
- export interface UseBlogsOptions {
7
- /** Maximum number of posts to fetch (default: 10) */
8
- limit?: number;
9
- /** Number of posts to skip (default: 0) */
10
- skip?: number;
11
- /** Filter by status (published, draft, concept) */
12
- status?: string;
13
- /** Whether to fetch all posts for admin (includes drafts) */
14
- admin?: boolean;
15
- /** API base URL (default: '/api/blogs') */
16
- apiBaseUrl?: string;
17
- }
18
- export interface UseBlogsResult {
19
- /** Array of blog posts */
20
- blogs: PostListItem[];
21
- /** Whether data is currently loading */
22
- loading: boolean;
23
- /** Error message if fetch failed */
24
- error: string | null;
25
- /** Total number of posts available */
26
- total: number;
27
- /** Function to refetch blogs */
28
- refetch: () => Promise<void>;
29
- }
30
- /**
31
- * React hook to fetch blog posts
32
- *
33
- * @example
34
- * ```tsx
35
- * const { blogs, loading, error } = useBlogs({ limit: 5 });
36
- * ```
37
- */
38
- export declare function useBlogs(options?: UseBlogsOptions): UseBlogsResult;
39
- //# sourceMappingURL=useBlogs.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useBlogs.d.ts","sourceRoot":"","sources":["useBlogs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,WAAW,eAAe;IAC5B,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC3B,0BAA0B;IAC1B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,cAAc,CA8EtE"}
@@ -1,9 +0,0 @@
1
- /**
2
- * Hook to fetch categories from existing blog posts
3
- * Extracts categories from Hero blocks in all posts
4
- */
5
- export declare function useCategories(): {
6
- categories: string[];
7
- loading: boolean;
8
- };
9
- //# sourceMappingURL=useCategories.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useCategories.d.ts","sourceRoot":"","sources":["useCategories.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,wBAAgB,aAAa;;;EAkE5B"}
@@ -1,54 +0,0 @@
1
- /**
2
- * Block Renderer
3
- * Library component for rendering blocks (decoupled from editor)
4
- * This is the "headless" rendering layer
5
- *
6
- * Multi-Tenant: Uses Preview components from client-provided blocks
7
- */
8
- import React from 'react';
9
- import { Block, BlockPreviewProps } from '../../types/block';
10
- /**
11
- * Block Renderer Props
12
- */
13
- export interface BlockRendererProps {
14
- /** Block to render */
15
- block: Block;
16
- /** Custom renderers for specific block types (optional override) */
17
- customRenderers?: Map<string, React.ComponentType<BlockPreviewProps>>;
18
- /** Additional context for rendering */
19
- context?: {
20
- siteId?: string;
21
- locale?: string;
22
- [key: string]: unknown;
23
- };
24
- }
25
- /**
26
- * Block Renderer Component
27
- * Renders a single block using its Preview component from the registry
28
- *
29
- * This is the headless rendering layer - it uses the Preview component
30
- * provided by the client application, allowing each client to have
31
- * their own design system in the frontend while the editor uses
32
- * the dashboard's design system.
33
- */
34
- export declare function BlockRenderer({ block, customRenderers, context }: BlockRendererProps): import("react/jsx-runtime").JSX.Element;
35
- /**
36
- * Blocks Renderer
37
- * Renders an array of blocks
38
- */
39
- export interface BlocksRendererProps {
40
- /** Array of blocks to render */
41
- blocks: Block[];
42
- /** Custom renderers for specific block types */
43
- customRenderers?: Map<string, React.ComponentType<{
44
- block: Block;
45
- }>>;
46
- /** Additional props to pass to renderers */
47
- renderProps?: Record<string, unknown>;
48
- /** Wrapper component for the blocks */
49
- wrapper?: React.ComponentType<{
50
- children: React.ReactNode;
51
- }>;
52
- }
53
- export declare function BlocksRenderer({ blocks, customRenderers, renderProps, wrapper: Wrapper, }: BlocksRendererProps): import("react/jsx-runtime").JSX.Element;
54
- //# sourceMappingURL=BlockRenderer.d.ts.map