@canvas-digital/blog-sdk 2.0.0

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 (658) hide show
  1. package/README.md +110 -0
  2. package/dist/BlogPlatform.d.ts +40 -0
  3. package/dist/BlogPlatform.d.ts.map +1 -0
  4. package/dist/BlogPlatform.js +38 -0
  5. package/dist/admin/components/BlogAdmin.d.ts +10 -0
  6. package/dist/admin/components/BlogAdmin.d.ts.map +1 -0
  7. package/dist/admin/components/BlogAdmin.js +36 -0
  8. package/dist/admin/components/CategoryManager.d.ts +5 -0
  9. package/dist/admin/components/CategoryManager.d.ts.map +1 -0
  10. package/dist/admin/components/CategoryManager.js +43 -0
  11. package/dist/admin/components/MediaManager.d.ts +7 -0
  12. package/dist/admin/components/MediaManager.d.ts.map +1 -0
  13. package/dist/admin/components/MediaManager.js +37 -0
  14. package/dist/admin/components/PostEditor.d.ts +7 -0
  15. package/dist/admin/components/PostEditor.d.ts.map +1 -0
  16. package/dist/admin/components/PostEditor.js +160 -0
  17. package/dist/admin/components/PostList.d.ts +8 -0
  18. package/dist/admin/components/PostList.d.ts.map +1 -0
  19. package/dist/admin/components/PostList.js +32 -0
  20. package/dist/admin/components/TagManager.d.ts +5 -0
  21. package/dist/admin/components/TagManager.d.ts.map +1 -0
  22. package/dist/admin/components/TagManager.js +41 -0
  23. package/dist/admin/components/editor/RichTextEditor.d.ts +8 -0
  24. package/dist/admin/components/editor/RichTextEditor.d.ts.map +1 -0
  25. package/dist/admin/components/editor/RichTextEditor.js +47 -0
  26. package/dist/admin/components/internal/States.d.ts +16 -0
  27. package/dist/admin/components/internal/States.d.ts.map +1 -0
  28. package/dist/admin/components/internal/States.js +15 -0
  29. package/dist/admin/hooks/useAsync.d.ts +23 -0
  30. package/dist/admin/hooks/useAsync.d.ts.map +1 -0
  31. package/dist/admin/hooks/useAsync.js +40 -0
  32. package/dist/admin/index.d.ts +10 -0
  33. package/dist/admin/index.d.ts.map +1 -0
  34. package/dist/admin/index.js +9 -0
  35. package/dist/admin/theme.d.ts +6 -0
  36. package/dist/admin/theme.d.ts.map +1 -0
  37. package/dist/admin/theme.js +52 -0
  38. package/dist/admin/types.d.ts +27 -0
  39. package/dist/admin/types.d.ts.map +1 -0
  40. package/dist/admin/types.js +1 -0
  41. package/dist/blog-client.iife.js +1 -0
  42. package/dist/client/admin-client.d.ts +33 -0
  43. package/dist/client/admin-client.d.ts.map +1 -0
  44. package/dist/client/admin-client.js +153 -0
  45. package/dist/client/errors.d.ts +14 -0
  46. package/dist/client/errors.d.ts.map +1 -0
  47. package/dist/client/errors.js +26 -0
  48. package/dist/client/http.d.ts +12 -0
  49. package/dist/client/http.d.ts.map +1 -0
  50. package/dist/client/http.js +135 -0
  51. package/dist/client/index.d.ts +7 -0
  52. package/dist/client/index.d.ts.map +1 -0
  53. package/dist/client/index.js +6 -0
  54. package/dist/client/pagination.d.ts +4 -0
  55. package/dist/client/pagination.d.ts.map +1 -0
  56. package/dist/client/pagination.js +32 -0
  57. package/dist/client/public-client.d.ts +23 -0
  58. package/dist/client/public-client.d.ts.map +1 -0
  59. package/dist/client/public-client.js +94 -0
  60. package/dist/client/types.d.ts +115 -0
  61. package/dist/client/types.d.ts.map +1 -0
  62. package/dist/client/types.js +1 -0
  63. package/dist/components/BlogUploader/BackButton.d.ts +5 -0
  64. package/dist/components/BlogUploader/BackButton.d.ts.map +1 -0
  65. package/dist/components/BlogUploader/BackButton.js +27 -0
  66. package/dist/components/BlogUploader/CommentSection.d.ts +12 -0
  67. package/dist/components/BlogUploader/CommentSection.d.ts.map +1 -0
  68. package/dist/components/BlogUploader/CommentSection.js +65 -0
  69. package/dist/components/BlogUploader/PostCard.d.ts +17 -0
  70. package/dist/components/BlogUploader/PostCard.d.ts.map +1 -0
  71. package/dist/components/BlogUploader/PostCard.js +42 -0
  72. package/dist/components/BlogUploader/PostFormatHero.d.ts +7 -0
  73. package/dist/components/BlogUploader/PostFormatHero.d.ts.map +1 -0
  74. package/dist/components/BlogUploader/PostFormatHero.js +47 -0
  75. package/dist/components/BlogUploader/ReadingProgress.d.ts +9 -0
  76. package/dist/components/BlogUploader/ReadingProgress.d.ts.map +1 -0
  77. package/dist/components/BlogUploader/ReadingProgress.js +28 -0
  78. package/dist/components/BlogUploader/RichText.d.ts +5 -0
  79. package/dist/components/BlogUploader/RichText.d.ts.map +1 -0
  80. package/dist/components/BlogUploader/RichText.js +59 -0
  81. package/dist/components/BlogUploader/ShareRow.d.ts +12 -0
  82. package/dist/components/BlogUploader/ShareRow.d.ts.map +1 -0
  83. package/dist/components/BlogUploader/ShareRow.js +13 -0
  84. package/dist/components/BlogUploader/ViewBeacon.d.ts +12 -0
  85. package/dist/components/BlogUploader/ViewBeacon.d.ts.map +1 -0
  86. package/dist/components/BlogUploader/ViewBeacon.js +37 -0
  87. package/dist/components/BlogUploader/dashboard/BrandSettings.d.ts +28 -0
  88. package/dist/components/BlogUploader/dashboard/BrandSettings.d.ts.map +1 -0
  89. package/dist/components/BlogUploader/dashboard/BrandSettings.js +60 -0
  90. package/dist/components/BlogUploader/dashboard/BrandSwitcher.d.ts +14 -0
  91. package/dist/components/BlogUploader/dashboard/BrandSwitcher.d.ts.map +1 -0
  92. package/dist/components/BlogUploader/dashboard/BrandSwitcher.js +25 -0
  93. package/dist/components/BlogUploader/dashboard/Chips.d.ts +15 -0
  94. package/dist/components/BlogUploader/dashboard/Chips.d.ts.map +1 -0
  95. package/dist/components/BlogUploader/dashboard/Chips.js +15 -0
  96. package/dist/components/BlogUploader/dashboard/CommentsManager.d.ts +19 -0
  97. package/dist/components/BlogUploader/dashboard/CommentsManager.d.ts.map +1 -0
  98. package/dist/components/BlogUploader/dashboard/CommentsManager.js +32 -0
  99. package/dist/components/BlogUploader/dashboard/LogOutButton.d.ts +4 -0
  100. package/dist/components/BlogUploader/dashboard/LogOutButton.d.ts.map +1 -0
  101. package/dist/components/BlogUploader/dashboard/LogOutButton.js +22 -0
  102. package/dist/components/BlogUploader/dashboard/MediaLibrary.d.ts +16 -0
  103. package/dist/components/BlogUploader/dashboard/MediaLibrary.d.ts.map +1 -0
  104. package/dist/components/BlogUploader/dashboard/MediaLibrary.js +124 -0
  105. package/dist/components/BlogUploader/dashboard/MediaPicker.d.ts +19 -0
  106. package/dist/components/BlogUploader/dashboard/MediaPicker.d.ts.map +1 -0
  107. package/dist/components/BlogUploader/dashboard/MediaPicker.js +99 -0
  108. package/dist/components/BlogUploader/dashboard/PostsTable.d.ts +46 -0
  109. package/dist/components/BlogUploader/dashboard/PostsTable.d.ts.map +1 -0
  110. package/dist/components/BlogUploader/dashboard/PostsTable.js +109 -0
  111. package/dist/components/BlogUploader/dashboard/Shell.d.ts +25 -0
  112. package/dist/components/BlogUploader/dashboard/Shell.d.ts.map +1 -0
  113. package/dist/components/BlogUploader/dashboard/Shell.js +128 -0
  114. package/dist/components/BlogUploader/dashboard/TermManager.d.ts +29 -0
  115. package/dist/components/BlogUploader/dashboard/TermManager.d.ts.map +1 -0
  116. package/dist/components/BlogUploader/dashboard/TermManager.js +96 -0
  117. package/dist/components/BlogUploader/dashboard/ToastProvider.d.ts +6 -0
  118. package/dist/components/BlogUploader/dashboard/ToastProvider.d.ts.map +1 -0
  119. package/dist/components/BlogUploader/dashboard/ToastProvider.js +5 -0
  120. package/dist/components/BlogUploader/dashboard/UsersManager.d.ts +32 -0
  121. package/dist/components/BlogUploader/dashboard/UsersManager.d.ts.map +1 -0
  122. package/dist/components/BlogUploader/dashboard/UsersManager.js +98 -0
  123. package/dist/components/BlogUploader/dashboard/charts.d.ts +22 -0
  124. package/dist/components/BlogUploader/dashboard/charts.d.ts.map +1 -0
  125. package/dist/components/BlogUploader/dashboard/charts.js +79 -0
  126. package/dist/components/BlogUploader/dashboard/editor/FormatContentPanel.d.ts +25 -0
  127. package/dist/components/BlogUploader/dashboard/editor/FormatContentPanel.d.ts.map +1 -0
  128. package/dist/components/BlogUploader/dashboard/editor/FormatContentPanel.js +62 -0
  129. package/dist/components/BlogUploader/dashboard/editor/PostEditor.d.ts +95 -0
  130. package/dist/components/BlogUploader/dashboard/editor/PostEditor.d.ts.map +1 -0
  131. package/dist/components/BlogUploader/dashboard/editor/PostEditor.js +649 -0
  132. package/dist/components/BlogUploader/dashboard/editor/RichTextEditor.d.ts +37 -0
  133. package/dist/components/BlogUploader/dashboard/editor/RichTextEditor.d.ts.map +1 -0
  134. package/dist/components/BlogUploader/dashboard/editor/RichTextEditor.js +475 -0
  135. package/dist/components/BlogUploader/dashboard/editor/SeoAnalysisPanel.d.ts +11 -0
  136. package/dist/components/BlogUploader/dashboard/editor/SeoAnalysisPanel.d.ts.map +1 -0
  137. package/dist/components/BlogUploader/dashboard/editor/SeoAnalysisPanel.js +31 -0
  138. package/dist/components/BlogUploader/dashboard/editor/YoastCollapsible.d.ts +12 -0
  139. package/dist/components/BlogUploader/dashboard/editor/YoastCollapsible.d.ts.map +1 -0
  140. package/dist/components/BlogUploader/dashboard/editor/YoastCollapsible.js +5 -0
  141. package/dist/components/BlogUploader/dashboard/editor/YoastInsightsPanel.d.ts +4 -0
  142. package/dist/components/BlogUploader/dashboard/editor/YoastInsightsPanel.d.ts.map +1 -0
  143. package/dist/components/BlogUploader/dashboard/editor/YoastInsightsPanel.js +31 -0
  144. package/dist/components/BlogUploader/dashboard/editor/YoastInternalLinksPanel.d.ts +4 -0
  145. package/dist/components/BlogUploader/dashboard/editor/YoastInternalLinksPanel.d.ts.map +1 -0
  146. package/dist/components/BlogUploader/dashboard/editor/YoastInternalLinksPanel.js +35 -0
  147. package/dist/components/BlogUploader/dashboard/editor/YoastSeoAnalysisPanel.d.ts +11 -0
  148. package/dist/components/BlogUploader/dashboard/editor/YoastSeoAnalysisPanel.d.ts.map +1 -0
  149. package/dist/components/BlogUploader/dashboard/editor/YoastSeoAnalysisPanel.js +23 -0
  150. package/dist/components/BlogUploader/dashboard/editor/YoastSeoMetabox.d.ts +50 -0
  151. package/dist/components/BlogUploader/dashboard/editor/YoastSeoMetabox.d.ts.map +1 -0
  152. package/dist/components/BlogUploader/dashboard/editor/YoastSeoMetabox.js +101 -0
  153. package/dist/components/BlogUploader/dashboard/editor/YoastSnippetField.d.ts +22 -0
  154. package/dist/components/BlogUploader/dashboard/editor/YoastSnippetField.d.ts.map +1 -0
  155. package/dist/components/BlogUploader/dashboard/editor/YoastSnippetField.js +51 -0
  156. package/dist/components/BlogUploader/dashboard/editor/load.d.ts +10 -0
  157. package/dist/components/BlogUploader/dashboard/editor/load.d.ts.map +1 -0
  158. package/dist/components/BlogUploader/dashboard/editor/load.js +141 -0
  159. package/dist/components/BlogUploader/dashboard/loadTerms.d.ts +13 -0
  160. package/dist/components/BlogUploader/dashboard/loadTerms.d.ts.map +1 -0
  161. package/dist/components/BlogUploader/dashboard/loadTerms.js +41 -0
  162. package/dist/components/BlogUploader/dashboard/seo/BrandSeoActions.d.ts +8 -0
  163. package/dist/components/BlogUploader/dashboard/seo/BrandSeoActions.d.ts.map +1 -0
  164. package/dist/components/BlogUploader/dashboard/seo/BrandSeoActions.js +35 -0
  165. package/dist/components/BlogUploader/dashboard/seo/Ga4Settings.d.ts +9 -0
  166. package/dist/components/BlogUploader/dashboard/seo/Ga4Settings.d.ts.map +1 -0
  167. package/dist/components/BlogUploader/dashboard/seo/Ga4Settings.js +40 -0
  168. package/dist/components/BlogUploader/dashboard/seo/RedirectAnalyticsDashboard.d.ts +5 -0
  169. package/dist/components/BlogUploader/dashboard/seo/RedirectAnalyticsDashboard.d.ts.map +1 -0
  170. package/dist/components/BlogUploader/dashboard/seo/RedirectAnalyticsDashboard.js +29 -0
  171. package/dist/components/BlogUploader/dashboard/seo/RedirectDetail.d.ts +10 -0
  172. package/dist/components/BlogUploader/dashboard/seo/RedirectDetail.d.ts.map +1 -0
  173. package/dist/components/BlogUploader/dashboard/seo/RedirectDetail.js +31 -0
  174. package/dist/components/BlogUploader/dashboard/seo/RedirectForm.d.ts +27 -0
  175. package/dist/components/BlogUploader/dashboard/seo/RedirectForm.d.ts.map +1 -0
  176. package/dist/components/BlogUploader/dashboard/seo/RedirectForm.js +79 -0
  177. package/dist/components/BlogUploader/dashboard/seo/RedirectList.d.ts +20 -0
  178. package/dist/components/BlogUploader/dashboard/seo/RedirectList.d.ts.map +1 -0
  179. package/dist/components/BlogUploader/dashboard/seo/RedirectList.js +33 -0
  180. package/dist/components/BlogUploader/dashboard/seo/RobotsEditor.d.ts +11 -0
  181. package/dist/components/BlogUploader/dashboard/seo/RobotsEditor.d.ts.map +1 -0
  182. package/dist/components/BlogUploader/dashboard/seo/RobotsEditor.js +54 -0
  183. package/dist/components/BlogUploader/dashboard/seo/SearchConsoleSettings.d.ts +9 -0
  184. package/dist/components/BlogUploader/dashboard/seo/SearchConsoleSettings.d.ts.map +1 -0
  185. package/dist/components/BlogUploader/dashboard/seo/SearchConsoleSettings.js +38 -0
  186. package/dist/components/BlogUploader/dashboard/seo/SeoBrandList.d.ts +28 -0
  187. package/dist/components/BlogUploader/dashboard/seo/SeoBrandList.d.ts.map +1 -0
  188. package/dist/components/BlogUploader/dashboard/seo/SeoBrandList.js +29 -0
  189. package/dist/components/BlogUploader/dashboard/seo/SeoBrandLists.d.ts +17 -0
  190. package/dist/components/BlogUploader/dashboard/seo/SeoBrandLists.d.ts.map +1 -0
  191. package/dist/components/BlogUploader/dashboard/seo/SeoBrandLists.js +8 -0
  192. package/dist/components/BlogUploader/dashboard/seo/shared.d.ts +18 -0
  193. package/dist/components/BlogUploader/dashboard/seo/shared.d.ts.map +1 -0
  194. package/dist/components/BlogUploader/dashboard/seo/shared.js +6 -0
  195. package/dist/components/BlogUploader/dashboard/tools/ExportTool.d.ts +8 -0
  196. package/dist/components/BlogUploader/dashboard/tools/ExportTool.d.ts.map +1 -0
  197. package/dist/components/BlogUploader/dashboard/tools/ExportTool.js +78 -0
  198. package/dist/components/BlogUploader/dashboard/tools/ImportTool.d.ts +7 -0
  199. package/dist/components/BlogUploader/dashboard/tools/ImportTool.d.ts.map +1 -0
  200. package/dist/components/BlogUploader/dashboard/tools/ImportTool.js +70 -0
  201. package/dist/components/BlogUploader/dashboard/upload.d.ts +47 -0
  202. package/dist/components/BlogUploader/dashboard/upload.d.ts.map +1 -0
  203. package/dist/components/BlogUploader/dashboard/upload.js +68 -0
  204. package/dist/components/BlogUploader/site/ArticleDetailHero.d.ts +27 -0
  205. package/dist/components/BlogUploader/site/ArticleDetailHero.d.ts.map +1 -0
  206. package/dist/components/BlogUploader/site/ArticleDetailHero.js +13 -0
  207. package/dist/components/BlogUploader/site/ArticleRailDetails.d.ts +27 -0
  208. package/dist/components/BlogUploader/site/ArticleRailDetails.d.ts.map +1 -0
  209. package/dist/components/BlogUploader/site/ArticleRailDetails.js +17 -0
  210. package/dist/components/BlogUploader/site/BlogIndexView.d.ts +28 -0
  211. package/dist/components/BlogUploader/site/BlogIndexView.d.ts.map +1 -0
  212. package/dist/components/BlogUploader/site/BlogIndexView.js +34 -0
  213. package/dist/components/BlogUploader/site/BrandTableOfContents.d.ts +18 -0
  214. package/dist/components/BlogUploader/site/BrandTableOfContents.d.ts.map +1 -0
  215. package/dist/components/BlogUploader/site/BrandTableOfContents.js +15 -0
  216. package/dist/components/BlogUploader/site/HeroFadeSlide.d.ts +11 -0
  217. package/dist/components/BlogUploader/site/HeroFadeSlide.d.ts.map +1 -0
  218. package/dist/components/BlogUploader/site/HeroFadeSlide.js +3 -0
  219. package/dist/components/BlogUploader/site/HeroMediaVisual.d.ts +23 -0
  220. package/dist/components/BlogUploader/site/HeroMediaVisual.d.ts.map +1 -0
  221. package/dist/components/BlogUploader/site/HeroMediaVisual.js +50 -0
  222. package/dist/components/BlogUploader/site/IndexFeedSection.d.ts +14 -0
  223. package/dist/components/BlogUploader/site/IndexFeedSection.d.ts.map +1 -0
  224. package/dist/components/BlogUploader/site/IndexFeedSection.js +12 -0
  225. package/dist/components/BlogUploader/site/InfinitePostFeed.d.ts +23 -0
  226. package/dist/components/BlogUploader/site/InfinitePostFeed.d.ts.map +1 -0
  227. package/dist/components/BlogUploader/site/InfinitePostFeed.js +152 -0
  228. package/dist/components/BlogUploader/site/SiteMediaHero.d.ts +12 -0
  229. package/dist/components/BlogUploader/site/SiteMediaHero.d.ts.map +1 -0
  230. package/dist/components/BlogUploader/site/SiteMediaHero.js +80 -0
  231. package/dist/components/BlogUploader/site/SiteMotion.d.ts +12 -0
  232. package/dist/components/BlogUploader/site/SiteMotion.d.ts.map +1 -0
  233. package/dist/components/BlogUploader/site/SiteMotion.js +27 -0
  234. package/dist/components/BlogUploader/site/SiteNavAuth.d.ts +8 -0
  235. package/dist/components/BlogUploader/site/SiteNavAuth.d.ts.map +1 -0
  236. package/dist/components/BlogUploader/site/SiteNavAuth.js +36 -0
  237. package/dist/components/admin/AdminPostDetail.d.ts +7 -0
  238. package/dist/components/admin/AdminPostDetail.d.ts.map +1 -0
  239. package/dist/components/admin/AdminPostDetail.js +105 -0
  240. package/dist/components/admin/BrandSettings.d.ts +11 -0
  241. package/dist/components/admin/BrandSettings.d.ts.map +1 -0
  242. package/dist/components/admin/BrandSettings.js +71 -0
  243. package/dist/components/admin/BrandSwitcher.d.ts +3 -0
  244. package/dist/components/admin/BrandSwitcher.d.ts.map +1 -0
  245. package/dist/components/admin/BrandSwitcher.js +12 -0
  246. package/dist/components/admin/CategoryManager.d.ts +2 -0
  247. package/dist/components/admin/CategoryManager.d.ts.map +1 -0
  248. package/dist/components/admin/CategoryManager.js +1 -0
  249. package/dist/components/admin/Chips.d.ts +15 -0
  250. package/dist/components/admin/Chips.d.ts.map +1 -0
  251. package/dist/components/admin/Chips.js +15 -0
  252. package/dist/components/admin/CommentsManager.d.ts +6 -0
  253. package/dist/components/admin/CommentsManager.d.ts.map +1 -0
  254. package/dist/components/admin/CommentsManager.js +30 -0
  255. package/dist/components/admin/Dashboard.d.ts +3 -0
  256. package/dist/components/admin/Dashboard.d.ts.map +1 -0
  257. package/dist/components/admin/Dashboard.js +34 -0
  258. package/dist/components/admin/MediaLibrary.d.ts +4 -0
  259. package/dist/components/admin/MediaLibrary.d.ts.map +1 -0
  260. package/dist/components/admin/MediaLibrary.js +119 -0
  261. package/dist/components/admin/MediaManager.d.ts +2 -0
  262. package/dist/components/admin/MediaManager.d.ts.map +1 -0
  263. package/dist/components/admin/MediaManager.js +1 -0
  264. package/dist/components/admin/MediaPicker.d.ts +10 -0
  265. package/dist/components/admin/MediaPicker.d.ts.map +1 -0
  266. package/dist/components/admin/MediaPicker.js +86 -0
  267. package/dist/components/admin/PostEditor.d.ts +2 -0
  268. package/dist/components/admin/PostEditor.d.ts.map +1 -0
  269. package/dist/components/admin/PostEditor.js +1 -0
  270. package/dist/components/admin/PostList.d.ts +13 -0
  271. package/dist/components/admin/PostList.d.ts.map +1 -0
  272. package/dist/components/admin/PostList.js +93 -0
  273. package/dist/components/admin/PostsTable.d.ts +15 -0
  274. package/dist/components/admin/PostsTable.d.ts.map +1 -0
  275. package/dist/components/admin/PostsTable.js +106 -0
  276. package/dist/components/admin/Shell.d.ts +18 -0
  277. package/dist/components/admin/Shell.d.ts.map +1 -0
  278. package/dist/components/admin/Shell.js +99 -0
  279. package/dist/components/admin/TagManager.d.ts +2 -0
  280. package/dist/components/admin/TagManager.d.ts.map +1 -0
  281. package/dist/components/admin/TagManager.js +1 -0
  282. package/dist/components/admin/TermManager.d.ts +9 -0
  283. package/dist/components/admin/TermManager.d.ts.map +1 -0
  284. package/dist/components/admin/TermManager.js +105 -0
  285. package/dist/components/admin/UsersManager.d.ts +5 -0
  286. package/dist/components/admin/UsersManager.d.ts.map +1 -0
  287. package/dist/components/admin/UsersManager.js +96 -0
  288. package/dist/components/admin/api/mappers.d.ts +37 -0
  289. package/dist/components/admin/api/mappers.d.ts.map +1 -0
  290. package/dist/components/admin/api/mappers.js +174 -0
  291. package/dist/components/admin/charts.d.ts +30 -0
  292. package/dist/components/admin/charts.d.ts.map +1 -0
  293. package/dist/components/admin/charts.js +79 -0
  294. package/dist/components/admin/editor/FormatContentPanel.d.ts +25 -0
  295. package/dist/components/admin/editor/FormatContentPanel.d.ts.map +1 -0
  296. package/dist/components/admin/editor/FormatContentPanel.js +62 -0
  297. package/dist/components/admin/editor/PostEditor.d.ts +5 -0
  298. package/dist/components/admin/editor/PostEditor.d.ts.map +1 -0
  299. package/dist/components/admin/editor/PostEditor.js +404 -0
  300. package/dist/components/admin/editor/RichTextEditor.d.ts +42 -0
  301. package/dist/components/admin/editor/RichTextEditor.d.ts.map +1 -0
  302. package/dist/components/admin/editor/RichTextEditor.js +475 -0
  303. package/dist/components/admin/editor/SeoAnalysisPanel.d.ts +11 -0
  304. package/dist/components/admin/editor/SeoAnalysisPanel.d.ts.map +1 -0
  305. package/dist/components/admin/editor/SeoAnalysisPanel.js +31 -0
  306. package/dist/components/admin/editor/YoastCollapsible.d.ts +12 -0
  307. package/dist/components/admin/editor/YoastCollapsible.d.ts.map +1 -0
  308. package/dist/components/admin/editor/YoastCollapsible.js +5 -0
  309. package/dist/components/admin/editor/YoastInsightsPanel.d.ts +4 -0
  310. package/dist/components/admin/editor/YoastInsightsPanel.d.ts.map +1 -0
  311. package/dist/components/admin/editor/YoastInsightsPanel.js +31 -0
  312. package/dist/components/admin/editor/YoastInternalLinksPanel.d.ts +4 -0
  313. package/dist/components/admin/editor/YoastInternalLinksPanel.d.ts.map +1 -0
  314. package/dist/components/admin/editor/YoastInternalLinksPanel.js +35 -0
  315. package/dist/components/admin/editor/YoastSeoAnalysisPanel.d.ts +11 -0
  316. package/dist/components/admin/editor/YoastSeoAnalysisPanel.d.ts.map +1 -0
  317. package/dist/components/admin/editor/YoastSeoAnalysisPanel.js +23 -0
  318. package/dist/components/admin/editor/YoastSeoMetabox.d.ts +54 -0
  319. package/dist/components/admin/editor/YoastSeoMetabox.d.ts.map +1 -0
  320. package/dist/components/admin/editor/YoastSeoMetabox.js +101 -0
  321. package/dist/components/admin/editor/YoastSnippetField.d.ts +22 -0
  322. package/dist/components/admin/editor/YoastSnippetField.d.ts.map +1 -0
  323. package/dist/components/admin/editor/YoastSnippetField.js +51 -0
  324. package/dist/components/admin/editor/load.d.ts +10 -0
  325. package/dist/components/admin/editor/load.d.ts.map +1 -0
  326. package/dist/components/admin/editor/load.js +141 -0
  327. package/dist/components/admin/index.d.ts +28 -0
  328. package/dist/components/admin/index.d.ts.map +1 -0
  329. package/dist/components/admin/index.js +27 -0
  330. package/dist/components/admin/internal/States.d.ts +16 -0
  331. package/dist/components/admin/internal/States.d.ts.map +1 -0
  332. package/dist/components/admin/internal/States.js +15 -0
  333. package/dist/components/admin/lib/format.d.ts +7 -0
  334. package/dist/components/admin/lib/format.d.ts.map +1 -0
  335. package/dist/components/admin/lib/format.js +43 -0
  336. package/dist/components/admin/lib/publishing.d.ts +8 -0
  337. package/dist/components/admin/lib/publishing.d.ts.map +1 -0
  338. package/dist/components/admin/lib/publishing.js +10 -0
  339. package/dist/components/admin/lib/robots.d.ts +13 -0
  340. package/dist/components/admin/lib/robots.d.ts.map +1 -0
  341. package/dist/components/admin/lib/robots.js +22 -0
  342. package/dist/components/admin/mock/fixtures.d.ts +240 -0
  343. package/dist/components/admin/mock/fixtures.d.ts.map +1 -0
  344. package/dist/components/admin/mock/fixtures.js +546 -0
  345. package/dist/components/admin/mock/store.d.ts +139 -0
  346. package/dist/components/admin/mock/store.d.ts.map +1 -0
  347. package/dist/components/admin/mock/store.js +1067 -0
  348. package/dist/components/admin/seo/Ga4Settings.d.ts +34 -0
  349. package/dist/components/admin/seo/Ga4Settings.d.ts.map +1 -0
  350. package/dist/components/admin/seo/Ga4Settings.js +80 -0
  351. package/dist/components/admin/seo/RedirectAnalyticsDashboard.d.ts +5 -0
  352. package/dist/components/admin/seo/RedirectAnalyticsDashboard.d.ts.map +1 -0
  353. package/dist/components/admin/seo/RedirectAnalyticsDashboard.js +24 -0
  354. package/dist/components/admin/seo/RedirectDetail.d.ts +11 -0
  355. package/dist/components/admin/seo/RedirectDetail.d.ts.map +1 -0
  356. package/dist/components/admin/seo/RedirectDetail.js +30 -0
  357. package/dist/components/admin/seo/RedirectForm.d.ts +29 -0
  358. package/dist/components/admin/seo/RedirectForm.d.ts.map +1 -0
  359. package/dist/components/admin/seo/RedirectForm.js +89 -0
  360. package/dist/components/admin/seo/RedirectList.d.ts +10 -0
  361. package/dist/components/admin/seo/RedirectList.d.ts.map +1 -0
  362. package/dist/components/admin/seo/RedirectList.js +28 -0
  363. package/dist/components/admin/seo/RobotsEditor.d.ts +5 -0
  364. package/dist/components/admin/seo/RobotsEditor.d.ts.map +1 -0
  365. package/dist/components/admin/seo/RobotsEditor.js +50 -0
  366. package/dist/components/admin/seo/SearchConsoleSettings.d.ts +3 -0
  367. package/dist/components/admin/seo/SearchConsoleSettings.d.ts.map +1 -0
  368. package/dist/components/admin/seo/SearchConsoleSettings.js +1 -0
  369. package/dist/components/admin/seo/SeoBrandList.d.ts +3 -0
  370. package/dist/components/admin/seo/SeoBrandList.d.ts.map +1 -0
  371. package/dist/components/admin/seo/SeoBrandList.js +1 -0
  372. package/dist/components/admin/seo/shared.d.ts +17 -0
  373. package/dist/components/admin/seo/shared.d.ts.map +1 -0
  374. package/dist/components/admin/seo/shared.js +7 -0
  375. package/dist/components/admin/tools/ExportTool.d.ts +3 -0
  376. package/dist/components/admin/tools/ExportTool.d.ts.map +1 -0
  377. package/dist/components/admin/tools/ExportTool.js +1 -0
  378. package/dist/components/admin/tools/ImportTool.d.ts +3 -0
  379. package/dist/components/admin/tools/ImportTool.d.ts.map +1 -0
  380. package/dist/components/admin/tools/ImportTool.js +1 -0
  381. package/dist/components/admin/tools/ToolsHub.d.ts +10 -0
  382. package/dist/components/admin/tools/ToolsHub.d.ts.map +1 -0
  383. package/dist/components/admin/tools/ToolsHub.js +106 -0
  384. package/dist/components/admin/tools/index.d.ts +3 -0
  385. package/dist/components/admin/tools/index.d.ts.map +1 -0
  386. package/dist/components/admin/tools/index.js +1 -0
  387. package/dist/components/index.d.ts +3 -0
  388. package/dist/components/index.d.ts.map +1 -0
  389. package/dist/components/index.js +2 -0
  390. package/dist/components/user/BlogCard.d.ts +20 -0
  391. package/dist/components/user/BlogCard.d.ts.map +1 -0
  392. package/dist/components/user/BlogCard.js +22 -0
  393. package/dist/components/user/BlogCategories.d.ts +6 -0
  394. package/dist/components/user/BlogCategories.d.ts.map +1 -0
  395. package/dist/components/user/BlogCategories.js +11 -0
  396. package/dist/components/user/BlogDetail.d.ts +25 -0
  397. package/dist/components/user/BlogDetail.d.ts.map +1 -0
  398. package/dist/components/user/BlogDetail.js +90 -0
  399. package/dist/components/user/BlogList.d.ts +20 -0
  400. package/dist/components/user/BlogList.d.ts.map +1 -0
  401. package/dist/components/user/BlogList.js +56 -0
  402. package/dist/components/user/BlogSearch.d.ts +8 -0
  403. package/dist/components/user/BlogSearch.d.ts.map +1 -0
  404. package/dist/components/user/BlogSearch.js +19 -0
  405. package/dist/components/user/BlogTags.d.ts +6 -0
  406. package/dist/components/user/BlogTags.d.ts.map +1 -0
  407. package/dist/components/user/BlogTags.js +11 -0
  408. package/dist/components/user/FeaturedBlogs.d.ts +8 -0
  409. package/dist/components/user/FeaturedBlogs.d.ts.map +1 -0
  410. package/dist/components/user/FeaturedBlogs.js +12 -0
  411. package/dist/components/user/RelatedBlogs.d.ts +9 -0
  412. package/dist/components/user/RelatedBlogs.d.ts.map +1 -0
  413. package/dist/components/user/RelatedBlogs.js +12 -0
  414. package/dist/components/user/SiteMediaHero.d.ts +14 -0
  415. package/dist/components/user/SiteMediaHero.d.ts.map +1 -0
  416. package/dist/components/user/SiteMediaHero.js +43 -0
  417. package/dist/components/user/detail/ArticleDetailHero.d.ts +30 -0
  418. package/dist/components/user/detail/ArticleDetailHero.d.ts.map +1 -0
  419. package/dist/components/user/detail/ArticleDetailHero.js +29 -0
  420. package/dist/components/user/detail/ArticleRailDetails.d.ts +24 -0
  421. package/dist/components/user/detail/ArticleRailDetails.d.ts.map +1 -0
  422. package/dist/components/user/detail/ArticleRailDetails.js +12 -0
  423. package/dist/components/user/detail/BackButton.d.ts +7 -0
  424. package/dist/components/user/detail/BackButton.d.ts.map +1 -0
  425. package/dist/components/user/detail/BackButton.js +18 -0
  426. package/dist/components/user/detail/CommentSection.d.ts +28 -0
  427. package/dist/components/user/detail/CommentSection.d.ts.map +1 -0
  428. package/dist/components/user/detail/CommentSection.js +68 -0
  429. package/dist/components/user/detail/HeroFadeSlide.d.ts +12 -0
  430. package/dist/components/user/detail/HeroFadeSlide.d.ts.map +1 -0
  431. package/dist/components/user/detail/HeroFadeSlide.js +5 -0
  432. package/dist/components/user/detail/ReadingProgress.d.ts +2 -0
  433. package/dist/components/user/detail/ReadingProgress.d.ts.map +1 -0
  434. package/dist/components/user/detail/ReadingProgress.js +20 -0
  435. package/dist/components/user/detail/ShareRow.d.ts +7 -0
  436. package/dist/components/user/detail/ShareRow.d.ts.map +1 -0
  437. package/dist/components/user/detail/ShareRow.js +7 -0
  438. package/dist/components/user/detail/toc.d.ts +14 -0
  439. package/dist/components/user/detail/toc.d.ts.map +1 -0
  440. package/dist/components/user/detail/toc.js +106 -0
  441. package/dist/components/user/index.d.ts +14 -0
  442. package/dist/components/user/index.d.ts.map +1 -0
  443. package/dist/components/user/index.js +13 -0
  444. package/dist/components/user/internal/States.d.ts +18 -0
  445. package/dist/components/user/internal/States.d.ts.map +1 -0
  446. package/dist/components/user/internal/States.js +21 -0
  447. package/dist/constants/index.d.ts +4 -0
  448. package/dist/constants/index.d.ts.map +1 -0
  449. package/dist/constants/index.js +3 -0
  450. package/dist/hooks/index.d.ts +2 -0
  451. package/dist/hooks/index.d.ts.map +1 -0
  452. package/dist/hooks/index.js +1 -0
  453. package/dist/hooks/useAsync.d.ts +23 -0
  454. package/dist/hooks/useAsync.d.ts.map +1 -0
  455. package/dist/hooks/useAsync.js +40 -0
  456. package/dist/index.d.ts +12 -0
  457. package/dist/index.d.ts.map +1 -0
  458. package/dist/index.js +9 -0
  459. package/dist/lib/access.d.ts +64 -0
  460. package/dist/lib/access.d.ts.map +1 -0
  461. package/dist/lib/access.js +127 -0
  462. package/dist/lib/canonical.d.ts +15 -0
  463. package/dist/lib/canonical.d.ts.map +1 -0
  464. package/dist/lib/canonical.js +34 -0
  465. package/dist/lib/comments.d.ts +9 -0
  466. package/dist/lib/comments.d.ts.map +1 -0
  467. package/dist/lib/comments.js +23 -0
  468. package/dist/lib/dashboard.d.ts +39 -0
  469. package/dist/lib/dashboard.d.ts.map +1 -0
  470. package/dist/lib/dashboard.js +157 -0
  471. package/dist/lib/data-transfer.d.ts +23 -0
  472. package/dist/lib/data-transfer.d.ts.map +1 -0
  473. package/dist/lib/data-transfer.js +436 -0
  474. package/dist/lib/default-author.d.ts +12 -0
  475. package/dist/lib/default-author.d.ts.map +1 -0
  476. package/dist/lib/default-author.js +57 -0
  477. package/dist/lib/format-media.d.ts +6 -0
  478. package/dist/lib/format-media.d.ts.map +1 -0
  479. package/dist/lib/format-media.js +18 -0
  480. package/dist/lib/format.d.ts +7 -0
  481. package/dist/lib/format.d.ts.map +1 -0
  482. package/dist/lib/format.js +43 -0
  483. package/dist/lib/hero-post.d.ts +24 -0
  484. package/dist/lib/hero-post.d.ts.map +1 -0
  485. package/dist/lib/hero-post.js +95 -0
  486. package/dist/lib/lexical-build.d.ts +30 -0
  487. package/dist/lib/lexical-build.d.ts.map +1 -0
  488. package/dist/lib/lexical-build.js +57 -0
  489. package/dist/lib/lexical-doc.d.ts +88 -0
  490. package/dist/lib/lexical-doc.d.ts.map +1 -0
  491. package/dist/lib/lexical-doc.js +385 -0
  492. package/dist/lib/lexical-dom.d.ts +19 -0
  493. package/dist/lib/lexical-dom.d.ts.map +1 -0
  494. package/dist/lib/lexical-dom.js +181 -0
  495. package/dist/lib/lexical.d.ts +31 -0
  496. package/dist/lib/lexical.d.ts.map +1 -0
  497. package/dist/lib/lexical.js +59 -0
  498. package/dist/lib/post-categories.d.ts +11 -0
  499. package/dist/lib/post-categories.d.ts.map +1 -0
  500. package/dist/lib/post-categories.js +27 -0
  501. package/dist/lib/post-format.d.ts +39 -0
  502. package/dist/lib/post-format.d.ts.map +1 -0
  503. package/dist/lib/post-format.js +82 -0
  504. package/dist/lib/publishing.d.ts +3 -0
  505. package/dist/lib/publishing.d.ts.map +1 -0
  506. package/dist/lib/publishing.js +1 -0
  507. package/dist/lib/queries.d.ts +49 -0
  508. package/dist/lib/queries.d.ts.map +1 -0
  509. package/dist/lib/queries.js +340 -0
  510. package/dist/lib/redirect-analytics.d.ts +27 -0
  511. package/dist/lib/redirect-analytics.d.ts.map +1 -0
  512. package/dist/lib/redirect-analytics.js +147 -0
  513. package/dist/lib/redirects.d.ts +39 -0
  514. package/dist/lib/redirects.d.ts.map +1 -0
  515. package/dist/lib/redirects.js +96 -0
  516. package/dist/lib/revalidate.d.ts +30 -0
  517. package/dist/lib/revalidate.d.ts.map +1 -0
  518. package/dist/lib/revalidate.js +91 -0
  519. package/dist/lib/robots.d.ts +19 -0
  520. package/dist/lib/robots.d.ts.map +1 -0
  521. package/dist/lib/robots.js +38 -0
  522. package/dist/lib/seo-analysis.d.ts +28 -0
  523. package/dist/lib/seo-analysis.d.ts.map +1 -0
  524. package/dist/lib/seo-analysis.js +153 -0
  525. package/dist/lib/seo-limits.d.ts +19 -0
  526. package/dist/lib/seo-limits.d.ts.map +1 -0
  527. package/dist/lib/seo-limits.js +39 -0
  528. package/dist/lib/seo.d.ts +50 -0
  529. package/dist/lib/seo.d.ts.map +1 -0
  530. package/dist/lib/seo.js +238 -0
  531. package/dist/lib/slug.d.ts +3 -0
  532. package/dist/lib/slug.d.ts.map +1 -0
  533. package/dist/lib/slug.js +9 -0
  534. package/dist/lib/stats.d.ts +71 -0
  535. package/dist/lib/stats.d.ts.map +1 -0
  536. package/dist/lib/stats.js +207 -0
  537. package/dist/lib/tenant-host.d.ts +9 -0
  538. package/dist/lib/tenant-host.d.ts.map +1 -0
  539. package/dist/lib/tenant-host.js +15 -0
  540. package/dist/lib/tenant.d.ts +41 -0
  541. package/dist/lib/tenant.d.ts.map +1 -0
  542. package/dist/lib/tenant.js +140 -0
  543. package/dist/lib/toc.d.ts +16 -0
  544. package/dist/lib/toc.d.ts.map +1 -0
  545. package/dist/lib/toc.js +28 -0
  546. package/dist/lib/yoast-snippet.d.ts +25 -0
  547. package/dist/lib/yoast-snippet.d.ts.map +1 -0
  548. package/dist/lib/yoast-snippet.js +79 -0
  549. package/dist/pages/admin/BlogAdmin.d.ts +9 -0
  550. package/dist/pages/admin/BlogAdmin.d.ts.map +1 -0
  551. package/dist/pages/admin/BlogAdmin.js +234 -0
  552. package/dist/pages/admin/index.d.ts +2 -0
  553. package/dist/pages/admin/index.d.ts.map +1 -0
  554. package/dist/pages/admin/index.js +1 -0
  555. package/dist/pages/index.d.ts +3 -0
  556. package/dist/pages/index.d.ts.map +1 -0
  557. package/dist/pages/index.js +2 -0
  558. package/dist/pages/user/UserBlogPage.d.ts +10 -0
  559. package/dist/pages/user/UserBlogPage.d.ts.map +1 -0
  560. package/dist/pages/user/UserBlogPage.js +15 -0
  561. package/dist/pages/user/index.d.ts +2 -0
  562. package/dist/pages/user/index.d.ts.map +1 -0
  563. package/dist/pages/user/index.js +1 -0
  564. package/dist/services/admin-client.d.ts +33 -0
  565. package/dist/services/admin-client.d.ts.map +1 -0
  566. package/dist/services/admin-client.js +154 -0
  567. package/dist/services/admin-sdk-client.d.ts +285 -0
  568. package/dist/services/admin-sdk-client.d.ts.map +1 -0
  569. package/dist/services/admin-sdk-client.js +242 -0
  570. package/dist/services/errors.d.ts +14 -0
  571. package/dist/services/errors.d.ts.map +1 -0
  572. package/dist/services/errors.js +26 -0
  573. package/dist/services/http.d.ts +24 -0
  574. package/dist/services/http.d.ts.map +1 -0
  575. package/dist/services/http.js +159 -0
  576. package/dist/services/index.d.ts +8 -0
  577. package/dist/services/index.d.ts.map +1 -0
  578. package/dist/services/index.js +7 -0
  579. package/dist/services/pagination.d.ts +4 -0
  580. package/dist/services/pagination.d.ts.map +1 -0
  581. package/dist/services/pagination.js +32 -0
  582. package/dist/services/public-client.d.ts +23 -0
  583. package/dist/services/public-client.d.ts.map +1 -0
  584. package/dist/services/public-client.js +94 -0
  585. package/dist/services/types.d.ts +124 -0
  586. package/dist/services/types.d.ts.map +1 -0
  587. package/dist/services/types.js +1 -0
  588. package/dist/style.css +3105 -0
  589. package/dist/styles/adminTheme.d.ts +6 -0
  590. package/dist/styles/adminTheme.d.ts.map +1 -0
  591. package/dist/styles/adminTheme.js +52 -0
  592. package/dist/styles/index.d.ts +3 -0
  593. package/dist/styles/index.d.ts.map +1 -0
  594. package/dist/styles/index.js +2 -0
  595. package/dist/styles/userTheme.d.ts +8 -0
  596. package/dist/styles/userTheme.d.ts.map +1 -0
  597. package/dist/styles/userTheme.js +60 -0
  598. package/dist/types/admin.d.ts +28 -0
  599. package/dist/types/admin.d.ts.map +1 -0
  600. package/dist/types/admin.js +1 -0
  601. package/dist/types/index.d.ts +4 -0
  602. package/dist/types/index.d.ts.map +1 -0
  603. package/dist/types/index.js +1 -0
  604. package/dist/types/user.d.ts +41 -0
  605. package/dist/types/user.d.ts.map +1 -0
  606. package/dist/types/user.js +1 -0
  607. package/dist/user/components/BlogCard.d.ts +15 -0
  608. package/dist/user/components/BlogCard.d.ts.map +1 -0
  609. package/dist/user/components/BlogCard.js +31 -0
  610. package/dist/user/components/BlogCategories.d.ts +6 -0
  611. package/dist/user/components/BlogCategories.d.ts.map +1 -0
  612. package/dist/user/components/BlogCategories.js +11 -0
  613. package/dist/user/components/BlogDetail.d.ts +7 -0
  614. package/dist/user/components/BlogDetail.d.ts.map +1 -0
  615. package/dist/user/components/BlogDetail.js +19 -0
  616. package/dist/user/components/BlogList.d.ts +8 -0
  617. package/dist/user/components/BlogList.d.ts.map +1 -0
  618. package/dist/user/components/BlogList.js +18 -0
  619. package/dist/user/components/BlogSearch.d.ts +8 -0
  620. package/dist/user/components/BlogSearch.d.ts.map +1 -0
  621. package/dist/user/components/BlogSearch.js +19 -0
  622. package/dist/user/components/BlogTags.d.ts +6 -0
  623. package/dist/user/components/BlogTags.d.ts.map +1 -0
  624. package/dist/user/components/BlogTags.js +11 -0
  625. package/dist/user/components/FeaturedBlogs.d.ts +8 -0
  626. package/dist/user/components/FeaturedBlogs.d.ts.map +1 -0
  627. package/dist/user/components/FeaturedBlogs.js +12 -0
  628. package/dist/user/components/RelatedBlogs.d.ts +9 -0
  629. package/dist/user/components/RelatedBlogs.d.ts.map +1 -0
  630. package/dist/user/components/RelatedBlogs.js +12 -0
  631. package/dist/user/components/internal/States.d.ts +18 -0
  632. package/dist/user/components/internal/States.d.ts.map +1 -0
  633. package/dist/user/components/internal/States.js +16 -0
  634. package/dist/user/hooks/useAsync.d.ts +21 -0
  635. package/dist/user/hooks/useAsync.d.ts.map +1 -0
  636. package/dist/user/hooks/useAsync.js +40 -0
  637. package/dist/user/index.d.ts +11 -0
  638. package/dist/user/index.d.ts.map +1 -0
  639. package/dist/user/index.js +10 -0
  640. package/dist/user/sanitize.d.ts +2 -0
  641. package/dist/user/sanitize.d.ts.map +1 -0
  642. package/dist/user/sanitize.js +120 -0
  643. package/dist/user/theme.d.ts +8 -0
  644. package/dist/user/theme.d.ts.map +1 -0
  645. package/dist/user/theme.js +60 -0
  646. package/dist/user/types.d.ts +41 -0
  647. package/dist/user/types.d.ts.map +1 -0
  648. package/dist/user/types.js +1 -0
  649. package/dist/utils/env.d.ts +16 -0
  650. package/dist/utils/env.d.ts.map +1 -0
  651. package/dist/utils/env.js +57 -0
  652. package/dist/utils/index.d.ts +3 -0
  653. package/dist/utils/index.d.ts.map +1 -0
  654. package/dist/utils/index.js +2 -0
  655. package/dist/utils/sanitize.d.ts +2 -0
  656. package/dist/utils/sanitize.d.ts.map +1 -0
  657. package/dist/utils/sanitize.js +120 -0
  658. package/package.json +63 -0
@@ -0,0 +1,1067 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, } from "react";
3
+ import { AdminSdkClient } from "../../../services/admin-sdk-client";
4
+ import { getErrorMessage } from "../../../services/errors";
5
+ import { mapAdminMeToProfile, mapAuthorToTerm, mapBrandToForm, mapCategoryToTerm, mapCommentToRow, mapMediaToHit, mapPostToRow, mapTagToTerm, postRowToWrite, } from "../api/mappers";
6
+ import { createInitialFixtures, nextId, slugify, } from "./fixtures";
7
+ const syncTermCounts = (state) => {
8
+ const countFor = (collection, termId) => state.posts.filter((p) => {
9
+ if (p.trashed)
10
+ return false;
11
+ if (collection === "categories")
12
+ return p.categoryIds.includes(termId);
13
+ if (collection === "tags")
14
+ return p.tagIds.includes(termId);
15
+ return p.authorIds.includes(termId);
16
+ }).length;
17
+ return {
18
+ ...state,
19
+ categories: state.categories.map((t) => ({ ...t, count: countFor("categories", t.id) })),
20
+ tags: state.tags.map((t) => ({ ...t, count: countFor("tags", t.id) })),
21
+ authors: state.authors.map((t) => ({ ...t, count: countFor("authors", t.id) })),
22
+ };
23
+ };
24
+ const resolveNames = (state, post) => {
25
+ const brand = state.brands.find((b) => b.id === post.brandId);
26
+ return {
27
+ ...post,
28
+ brandName: brand?.name ?? post.brandName,
29
+ brandSlug: brand?.slug ?? post.brandSlug,
30
+ categoryNames: post.categoryIds
31
+ .map((id) => state.categories.find((c) => c.id === id)?.name)
32
+ .filter(Boolean),
33
+ tagNames: post.tagIds
34
+ .map((id) => state.tags.find((t) => t.id === id)?.name)
35
+ .filter(Boolean),
36
+ authorNames: post.authorIds
37
+ .map((id) => state.authors.find((a) => a.id === id)?.name)
38
+ .filter(Boolean),
39
+ };
40
+ };
41
+ const AdminMockContext = createContext(null);
42
+ const matchesPostFilter = (post, state) => {
43
+ switch (state) {
44
+ case "all":
45
+ return !post.trashed;
46
+ case "trash":
47
+ return post.trashed;
48
+ case "live":
49
+ return !post.trashed && post.status === "published";
50
+ case "writing":
51
+ return !post.trashed && post.status === "draft" && post.reviewState === "writing" && !post.scheduledFor;
52
+ case "review":
53
+ return !post.trashed && post.status === "draft" && post.reviewState === "in-review";
54
+ case "scheduled":
55
+ return !post.trashed && !!post.scheduledFor && post.status === "draft";
56
+ case "attention":
57
+ return (!post.trashed &&
58
+ post.status === "draft" &&
59
+ (post.reviewState === "in-review" || post.reviewState === "approved"));
60
+ default:
61
+ return !post.trashed;
62
+ }
63
+ };
64
+ export function AdminMockProvider({ children, config, }) {
65
+ const client = useMemo(() => config?.email && config.adminApiKey
66
+ ? new AdminSdkClient(config)
67
+ : null, [config?.apiUrl, config?.email, config?.adminApiKey, config?.domain, config?.timeoutMs]);
68
+ const live = Boolean(client);
69
+ const [data, setData] = useState(() => live
70
+ ? {
71
+ ...createInitialFixtures(),
72
+ brands: [],
73
+ posts: [],
74
+ categories: [],
75
+ tags: [],
76
+ authors: [],
77
+ comments: [],
78
+ media: [],
79
+ }
80
+ : createInitialFixtures());
81
+ const [activeBrandId, setActiveBrandId] = useState(null);
82
+ const [bootStatus, setBootStatus] = useState(live ? "loading" : "ready");
83
+ const [bootError, setBootError] = useState(null);
84
+ const clientRef = useRef(client);
85
+ clientRef.current = client;
86
+ const update = useCallback((fn) => {
87
+ setData((prev) => syncTermCounts(fn(prev)));
88
+ }, []);
89
+ const refreshFromApi = useCallback(async () => {
90
+ const api = clientRef.current;
91
+ if (!api || !config)
92
+ return;
93
+ setBootStatus((prev) => (prev === "ready" ? "ready" : "loading"));
94
+ try {
95
+ const [me, brandsPage, postsPage, catsPage, tagsPage, authorsPage, mediaPage, commentsPage] = await Promise.all([
96
+ api.me(),
97
+ api.listBrands({ pageSize: 100 }),
98
+ api.listPosts({ pageSize: 100, includeTrash: true }),
99
+ api.listCategories({ pageSize: 100 }),
100
+ api.listTags({ pageSize: 100 }),
101
+ api.listAuthors({ pageSize: 100 }),
102
+ api.listMedia({ pageSize: 100 }),
103
+ api.listComments({ pageSize: 100 }),
104
+ ]);
105
+ const brands = brandsPage.items.map(mapBrandToForm);
106
+ const categories = catsPage.items.map(mapCategoryToTerm);
107
+ const tags = tagsPage.items.map(mapTagToTerm);
108
+ const authors = authorsPage.items.map(mapAuthorToTerm);
109
+ const media = mediaPage.items.map(mapMediaToHit);
110
+ const posts = postsPage.items.map((p) => mapPostToRow(p, brands, categories, tags, authors));
111
+ const comments = commentsPage.items.map((c) => mapCommentToRow(c, posts, brands));
112
+ const profile = mapAdminMeToProfile(me);
113
+ const domainHint = config.domain?.trim().toLowerCase().replace(/^www\./, "") ?? "";
114
+ const resolved = (domainHint
115
+ ? brands.find((b) => b.primaryDomain.toLowerCase().replace(/^www\./, "") === domainHint)
116
+ : undefined) ?? brands[0];
117
+ setData((prev) => syncTermCounts({
118
+ ...prev,
119
+ profile,
120
+ brands,
121
+ categories,
122
+ tags,
123
+ authors,
124
+ media,
125
+ posts,
126
+ comments,
127
+ }));
128
+ setActiveBrandId((current) => current ?? resolved?.id ?? null);
129
+ setBootStatus("ready");
130
+ setBootError(null);
131
+ }
132
+ catch (error) {
133
+ setBootError(getErrorMessage(error));
134
+ setBootStatus((prev) => (prev === "ready" ? "ready" : "error"));
135
+ throw error;
136
+ }
137
+ }, [config]);
138
+ useEffect(() => {
139
+ if (!client || !config) {
140
+ setBootStatus("ready");
141
+ return;
142
+ }
143
+ setBootStatus("loading");
144
+ setBootError(null);
145
+ void refreshFromApi().catch(() => {
146
+ /* bootStatus/bootError set inside refreshFromApi */
147
+ });
148
+ }, [client, config, refreshFromApi]);
149
+ const brands = data.brands;
150
+ const activeBrand = brands.find((b) => b.id === activeBrandId) ?? null;
151
+ const filterPosts = useCallback(({ state = "all", query = "", categoryId, brandId }) => {
152
+ const q = query.trim().toLowerCase();
153
+ const brand = brandId === undefined ? activeBrandId : brandId;
154
+ return data.posts
155
+ .filter((p) => matchesPostFilter(p, state))
156
+ .filter((p) => (brand ? p.brandId === brand : true))
157
+ .filter((p) => (categoryId ? p.categoryIds.includes(categoryId) : true))
158
+ .filter((p) => (!q ? true : p.title.toLowerCase().includes(q) || p.slug.toLowerCase().includes(q)))
159
+ .map((p) => resolveNames(data, p))
160
+ .sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
161
+ }, [data, activeBrandId]);
162
+ const postCounts = useCallback((brandId) => {
163
+ const brand = brandId === undefined ? activeBrandId : brandId;
164
+ const scoped = data.posts.filter((p) => (brand ? p.brandId === brand : true));
165
+ const keys = [
166
+ "all",
167
+ "attention",
168
+ "writing",
169
+ "review",
170
+ "scheduled",
171
+ "live",
172
+ "trash",
173
+ ];
174
+ return Object.fromEntries(keys.map((k) => [k, scoped.filter((p) => matchesPostFilter(p, k)).length]));
175
+ }, [data.posts, activeBrandId]);
176
+ const getPost = useCallback((id) => {
177
+ const post = data.posts.find((p) => p.id === id);
178
+ return post ? resolveNames(data, post) : undefined;
179
+ }, [data]);
180
+ const savePost = useCallback((input) => {
181
+ if (!input.title.trim())
182
+ return { ok: false, error: "Title is required." };
183
+ const api = clientRef.current;
184
+ if (api) {
185
+ return (async () => {
186
+ try {
187
+ const intent = input.status === "published"
188
+ ? "publish"
189
+ : input.scheduledFor
190
+ ? "schedule"
191
+ : "save";
192
+ const body = postRowToWrite(input, intent);
193
+ const saved = input.id
194
+ ? await api.updatePost(input.id, body)
195
+ : await api.createPost(body);
196
+ await refreshFromApi();
197
+ return { ok: true, id: saved.id };
198
+ }
199
+ catch (error) {
200
+ return { ok: false, error: getErrorMessage(error) };
201
+ }
202
+ })();
203
+ }
204
+ const id = input.id ?? nextId("post");
205
+ update((prev) => {
206
+ const existing = prev.posts.find((p) => p.id === id);
207
+ const brand = prev.brands.find((b) => b.id === input.brandId);
208
+ const next = resolveNames(prev, {
209
+ id,
210
+ title: input.title,
211
+ slug: input.slug || slugify(input.title),
212
+ status: input.status ?? existing?.status ?? "draft",
213
+ reviewState: input.reviewState ?? existing?.reviewState ?? "writing",
214
+ scheduledFor: input.scheduledFor ?? existing?.scheduledFor ?? null,
215
+ publishedAt: input.publishedAt ?? existing?.publishedAt ?? null,
216
+ updatedAt: new Date().toISOString(),
217
+ createdAt: existing?.createdAt ?? new Date().toISOString(),
218
+ trashed: input.trashed ?? existing?.trashed ?? false,
219
+ categoryIds: input.categoryIds ?? existing?.categoryIds ?? [],
220
+ categoryNames: [],
221
+ tagIds: input.tagIds ?? existing?.tagIds ?? [],
222
+ tagNames: [],
223
+ authorIds: input.authorIds ?? existing?.authorIds ?? [],
224
+ authorNames: [],
225
+ brandId: input.brandId,
226
+ brandName: brand?.name ?? null,
227
+ brandSlug: brand?.slug ?? null,
228
+ blockers: input.blockers ?? existing?.blockers ?? [],
229
+ readingMinutes: input.readingMinutes ?? existing?.readingMinutes ?? null,
230
+ views: input.views ?? existing?.views ?? null,
231
+ canPublish: true,
232
+ excerpt: input.excerpt ?? existing?.excerpt ?? "",
233
+ contentHtml: input.contentHtml ?? existing?.contentHtml ?? "",
234
+ featuredImageId: input.featuredImageId ?? existing?.featuredImageId ?? null,
235
+ allowComments: input.allowComments ?? existing?.allowComments ?? true,
236
+ visibility: input.visibility ?? existing?.visibility ?? "public",
237
+ template: input.template ?? existing?.template ?? "default",
238
+ authorBox: input.authorBox ?? existing?.authorBox ?? "default",
239
+ showInTableOfContents: input.showInTableOfContents ?? existing?.showInTableOfContents ?? true,
240
+ postFormat: input.postFormat ?? existing?.postFormat ?? "standard",
241
+ seo: input.seo ??
242
+ existing?.seo ?? {
243
+ metaTitle: "",
244
+ metaDescription: "",
245
+ focusKeyphrase: "",
246
+ noindex: false,
247
+ },
248
+ });
249
+ const posts = existing
250
+ ? prev.posts.map((p) => (p.id === id ? next : p))
251
+ : [next, ...prev.posts];
252
+ return { ...prev, posts };
253
+ });
254
+ return { ok: true, id };
255
+ }, [update, refreshFromApi]);
256
+ const patchPost = useCallback((id, fn) => {
257
+ let found = false;
258
+ update((prev) => {
259
+ const posts = prev.posts.map((p) => {
260
+ if (p.id !== id)
261
+ return p;
262
+ found = true;
263
+ return resolveNames(prev, { ...fn(p), updatedAt: new Date().toISOString() });
264
+ });
265
+ return { ...prev, posts };
266
+ });
267
+ return found ? { ok: true } : { ok: false, error: "Post not found." };
268
+ }, [update]);
269
+ const bulkPostAction = useCallback((ids, action) => {
270
+ const api = clientRef.current;
271
+ if (api) {
272
+ return (async () => {
273
+ try {
274
+ for (const id of ids) {
275
+ if (action === "publish")
276
+ await api.publishPost(id);
277
+ else if (action === "draft")
278
+ await api.unpublishPost(id);
279
+ else if (action === "trash")
280
+ await api.deletePost(id, false);
281
+ else if (action === "delete")
282
+ await api.deletePost(id, true);
283
+ else if (action === "restore")
284
+ await api.updatePost(id, { intent: "restore" });
285
+ else if (action === "submit")
286
+ await api.updatePost(id, { reviewState: "in-review" });
287
+ else if (action === "approve")
288
+ await api.updatePost(id, { reviewState: "approved" });
289
+ else if (action === "send-back")
290
+ await api.updatePost(id, { reviewState: "writing" });
291
+ }
292
+ await refreshFromApi();
293
+ return { ok: true };
294
+ }
295
+ catch (error) {
296
+ return { ok: false, error: getErrorMessage(error) };
297
+ }
298
+ })();
299
+ }
300
+ update((prev) => {
301
+ let posts = [...prev.posts];
302
+ for (const id of ids) {
303
+ const i = posts.findIndex((p) => p.id === id);
304
+ if (i < 0)
305
+ continue;
306
+ const p = posts[i];
307
+ if (action === "delete") {
308
+ posts = posts.filter((x) => x.id !== id);
309
+ continue;
310
+ }
311
+ let next = { ...p, updatedAt: new Date().toISOString() };
312
+ if (action === "trash")
313
+ next.trashed = true;
314
+ if (action === "restore")
315
+ next.trashed = false;
316
+ if (action === "submit")
317
+ next.reviewState = "in-review";
318
+ if (action === "approve")
319
+ next.reviewState = "approved";
320
+ if (action === "send-back")
321
+ next.reviewState = "writing";
322
+ if (action === "publish") {
323
+ next.status = "published";
324
+ next.reviewState = "approved";
325
+ next.scheduledFor = null;
326
+ next.publishedAt = next.publishedAt ?? new Date().toISOString();
327
+ }
328
+ if (action === "draft") {
329
+ next.status = "draft";
330
+ next.scheduledFor = null;
331
+ }
332
+ posts[i] = next;
333
+ }
334
+ return { ...prev, posts };
335
+ });
336
+ return { ok: true };
337
+ }, [update, refreshFromApi]);
338
+ const submitForReview = useCallback((id) => {
339
+ const api = clientRef.current;
340
+ if (api) {
341
+ return (async () => {
342
+ try {
343
+ await api.updatePost(id, { reviewState: "in-review" });
344
+ await refreshFromApi();
345
+ return { ok: true };
346
+ }
347
+ catch (error) {
348
+ return { ok: false, error: getErrorMessage(error) };
349
+ }
350
+ })();
351
+ }
352
+ return patchPost(id, (p) => ({ ...p, reviewState: "in-review" }));
353
+ }, [patchPost, refreshFromApi]);
354
+ const approve = useCallback((id) => {
355
+ const api = clientRef.current;
356
+ if (api) {
357
+ return (async () => {
358
+ try {
359
+ await api.updatePost(id, { reviewState: "approved" });
360
+ await refreshFromApi();
361
+ return { ok: true };
362
+ }
363
+ catch (error) {
364
+ return { ok: false, error: getErrorMessage(error) };
365
+ }
366
+ })();
367
+ }
368
+ return patchPost(id, (p) => ({ ...p, reviewState: "approved" }));
369
+ }, [patchPost, refreshFromApi]);
370
+ const sendBack = useCallback((id) => {
371
+ const api = clientRef.current;
372
+ if (api) {
373
+ return (async () => {
374
+ try {
375
+ await api.updatePost(id, { reviewState: "writing" });
376
+ await refreshFromApi();
377
+ return { ok: true };
378
+ }
379
+ catch (error) {
380
+ return { ok: false, error: getErrorMessage(error) };
381
+ }
382
+ })();
383
+ }
384
+ return patchPost(id, (p) => ({ ...p, reviewState: "writing" }));
385
+ }, [patchPost, refreshFromApi]);
386
+ const publishNow = useCallback((id) => {
387
+ const api = clientRef.current;
388
+ if (api) {
389
+ return (async () => {
390
+ try {
391
+ await api.publishPost(id);
392
+ await refreshFromApi();
393
+ return { ok: true };
394
+ }
395
+ catch (error) {
396
+ return { ok: false, error: getErrorMessage(error) };
397
+ }
398
+ })();
399
+ }
400
+ return patchPost(id, (p) => ({
401
+ ...p,
402
+ status: "published",
403
+ reviewState: "approved",
404
+ scheduledFor: null,
405
+ publishedAt: p.publishedAt ?? new Date().toISOString(),
406
+ }));
407
+ }, [patchPost, refreshFromApi]);
408
+ const unpublish = useCallback((id) => {
409
+ const api = clientRef.current;
410
+ if (api) {
411
+ return (async () => {
412
+ try {
413
+ await api.unpublishPost(id);
414
+ await refreshFromApi();
415
+ return { ok: true };
416
+ }
417
+ catch (error) {
418
+ return { ok: false, error: getErrorMessage(error) };
419
+ }
420
+ })();
421
+ }
422
+ return patchPost(id, (p) => ({ ...p, status: "draft", scheduledFor: null }));
423
+ }, [patchPost, refreshFromApi]);
424
+ const schedulePost = useCallback((id, when) => {
425
+ const api = clientRef.current;
426
+ if (api) {
427
+ return (async () => {
428
+ try {
429
+ await api.updatePost(id, {
430
+ scheduledAt: when,
431
+ status: "draft",
432
+ reviewState: "approved",
433
+ intent: "schedule",
434
+ });
435
+ await refreshFromApi();
436
+ return { ok: true };
437
+ }
438
+ catch (error) {
439
+ return { ok: false, error: getErrorMessage(error) };
440
+ }
441
+ })();
442
+ }
443
+ return patchPost(id, (p) => ({
444
+ ...p,
445
+ scheduledFor: when,
446
+ status: "draft",
447
+ reviewState: "approved",
448
+ }));
449
+ }, [patchPost, refreshFromApi]);
450
+ const duplicatePost = useCallback((id) => {
451
+ const src = data.posts.find((p) => p.id === id);
452
+ if (!src)
453
+ return { ok: false, error: "Post not found." };
454
+ const copyId = nextId("post");
455
+ update((prev) => ({
456
+ ...prev,
457
+ posts: [
458
+ resolveNames(prev, {
459
+ ...src,
460
+ id: copyId,
461
+ title: `${src.title} (copy)`,
462
+ slug: `${src.slug}-copy`,
463
+ status: "draft",
464
+ reviewState: "writing",
465
+ publishedAt: null,
466
+ scheduledFor: null,
467
+ trashed: false,
468
+ views: null,
469
+ updatedAt: new Date().toISOString(),
470
+ createdAt: new Date().toISOString(),
471
+ }),
472
+ ...prev.posts,
473
+ ],
474
+ }));
475
+ return { ok: true };
476
+ }, [data.posts, update]);
477
+ const quickEditPost = useCallback((input) => patchPost(input.id, (p) => ({
478
+ ...p,
479
+ title: input.title,
480
+ slug: input.slug || slugify(input.title),
481
+ categoryIds: input.category,
482
+ publishedAt: input.publishedAt,
483
+ scheduledFor: input.scheduledFor,
484
+ status: input.status,
485
+ })), [patchPost]);
486
+ const terms = useCallback((collection, brandId) => {
487
+ const brand = brandId === undefined ? activeBrandId : brandId;
488
+ const list = collection === "categories"
489
+ ? data.categories
490
+ : collection === "tags"
491
+ ? data.tags
492
+ : data.authors;
493
+ return list.filter((t) => (brand ? t.brandId === brand : true));
494
+ }, [data, activeBrandId]);
495
+ const saveTerm = useCallback((input) => {
496
+ if (!input.name.trim())
497
+ return { ok: false, error: "Name is required." };
498
+ if (!input.brandId)
499
+ return { ok: false, error: "Pick a brand first." };
500
+ const api = clientRef.current;
501
+ if (api) {
502
+ return (async () => {
503
+ try {
504
+ const base = {
505
+ name: input.name.trim(),
506
+ slug: input.slug?.trim() || slugify(input.name),
507
+ description: input.description,
508
+ brandId: input.brandId,
509
+ };
510
+ let savedId;
511
+ if (input.collection === "categories") {
512
+ const saved = input.id
513
+ ? await api.updateCategory(input.id, base)
514
+ : await api.createCategory(base);
515
+ savedId = saved.id;
516
+ }
517
+ else if (input.collection === "tags") {
518
+ const saved = input.id
519
+ ? await api.updateTag(input.id, base)
520
+ : await api.createTag(base);
521
+ savedId = saved.id;
522
+ }
523
+ else {
524
+ const authorBody = {
525
+ ...base,
526
+ jobTitle: input.jobTitle,
527
+ bio: input.bio,
528
+ };
529
+ const saved = input.id
530
+ ? await api.updateAuthor(input.id, authorBody)
531
+ : await api.createAuthor(authorBody);
532
+ savedId = saved.id;
533
+ }
534
+ await refreshFromApi();
535
+ return { ok: true, id: savedId };
536
+ }
537
+ catch (error) {
538
+ return { ok: false, error: getErrorMessage(error) };
539
+ }
540
+ })();
541
+ }
542
+ const id = input.id ?? nextId(input.collection.slice(0, 3));
543
+ const row = {
544
+ id,
545
+ name: input.name.trim(),
546
+ slug: input.slug?.trim() || slugify(input.name),
547
+ description: input.description ?? "",
548
+ jobTitle: input.jobTitle ?? "",
549
+ bio: input.bio ?? "",
550
+ count: 0,
551
+ brandId: input.brandId,
552
+ };
553
+ update((prev) => {
554
+ const key = input.collection === "categories"
555
+ ? "categories"
556
+ : input.collection === "tags"
557
+ ? "tags"
558
+ : "authors";
559
+ const list = prev[key];
560
+ const exists = list.some((t) => t.id === id);
561
+ return {
562
+ ...prev,
563
+ [key]: exists ? list.map((t) => (t.id === id ? { ...row, count: t.count } : t)) : [row, ...list],
564
+ };
565
+ });
566
+ return { ok: true, id };
567
+ }, [update, refreshFromApi]);
568
+ const deleteTerm = useCallback((collection, id) => {
569
+ const api = clientRef.current;
570
+ if (api) {
571
+ return (async () => {
572
+ try {
573
+ if (collection === "categories")
574
+ await api.deleteCategory(id, true);
575
+ else if (collection === "tags")
576
+ await api.deleteTag(id, true);
577
+ else
578
+ await api.deleteAuthor(id, true);
579
+ await refreshFromApi();
580
+ return { ok: true };
581
+ }
582
+ catch (error) {
583
+ return { ok: false, error: getErrorMessage(error) };
584
+ }
585
+ })();
586
+ }
587
+ const key = collection === "categories" ? "categories" : collection === "tags" ? "tags" : "authors";
588
+ if (collection !== "tags") {
589
+ const inUse = data.posts.some((p) => {
590
+ if (p.trashed)
591
+ return false;
592
+ if (collection === "categories")
593
+ return p.categoryIds.includes(id);
594
+ return p.authorIds.includes(id);
595
+ });
596
+ if (inUse)
597
+ return { ok: false, error: "Still in use by posts — reassign first." };
598
+ }
599
+ update((prev) => {
600
+ const next = { ...prev, [key]: prev[key].filter((t) => t.id !== id) };
601
+ if (collection === "tags") {
602
+ next.posts = prev.posts.map((p) => ({
603
+ ...p,
604
+ tagIds: p.tagIds.filter((tid) => tid !== id),
605
+ }));
606
+ }
607
+ return next;
608
+ });
609
+ return { ok: true };
610
+ }, [data.posts, update, refreshFromApi]);
611
+ const listMedia = useCallback((brandId, query, page, pageSize = 24) => {
612
+ const q = query.trim().toLowerCase();
613
+ const brand = brandId ?? activeBrandId;
614
+ const filtered = data.media
615
+ .filter((m) => (brand ? m.brandId === brand : true))
616
+ .filter((m) => !q ? true : m.alt.toLowerCase().includes(q) || m.filename.toLowerCase().includes(q))
617
+ .sort((a, b) => b.createdAt.localeCompare(a.createdAt));
618
+ const start = (page - 1) * pageSize;
619
+ const items = filtered.slice(start, start + pageSize);
620
+ return { items, total: filtered.length, hasMore: start + pageSize < filtered.length };
621
+ }, [data.media, activeBrandId]);
622
+ const uploadMedia = useCallback(async (files, brandId) => {
623
+ const brand = brandId ?? activeBrandId ?? data.brands[0]?.id;
624
+ if (!brand)
625
+ return { ok: false, error: "No brand selected.", images: [] };
626
+ const api = clientRef.current;
627
+ const list = Array.from(files);
628
+ if (api) {
629
+ try {
630
+ const images = [];
631
+ for (const file of list) {
632
+ const saved = await api.uploadMedia(file, brand);
633
+ images.push(mapMediaToHit(saved));
634
+ }
635
+ await refreshFromApi();
636
+ return { ok: true, images };
637
+ }
638
+ catch (error) {
639
+ return { ok: false, error: getErrorMessage(error), images: [] };
640
+ }
641
+ }
642
+ const images = [];
643
+ for (const file of list) {
644
+ const url = await new Promise((resolve, reject) => {
645
+ const reader = new FileReader();
646
+ reader.onload = () => resolve(String(reader.result));
647
+ reader.onerror = () => reject(new Error("Read failed"));
648
+ reader.readAsDataURL(file);
649
+ });
650
+ const alt = file.name.replace(/\.[^.]+$/, "").replace(/[-_]/g, " ");
651
+ const hit = {
652
+ id: nextId("media"),
653
+ url,
654
+ thumbUrl: url,
655
+ alt,
656
+ filename: file.name,
657
+ width: null,
658
+ height: null,
659
+ filesize: file.size,
660
+ createdAt: new Date().toISOString(),
661
+ brandId: brand,
662
+ caption: "",
663
+ credit: "",
664
+ };
665
+ images.push(hit);
666
+ }
667
+ update((prev) => ({ ...prev, media: [...images, ...prev.media] }));
668
+ return { ok: true, images };
669
+ }, [activeBrandId, data.brands, update, refreshFromApi]);
670
+ const updateMedia = useCallback((id, meta) => {
671
+ if (!meta.alt.trim())
672
+ return { ok: false, error: "Alt text is required." };
673
+ const api = clientRef.current;
674
+ if (api) {
675
+ return (async () => {
676
+ try {
677
+ await api.updateMedia(id, meta);
678
+ await refreshFromApi();
679
+ return { ok: true };
680
+ }
681
+ catch (error) {
682
+ return { ok: false, error: getErrorMessage(error) };
683
+ }
684
+ })();
685
+ }
686
+ update((prev) => ({
687
+ ...prev,
688
+ media: prev.media.map((m) => (m.id === id ? { ...m, ...meta } : m)),
689
+ }));
690
+ return { ok: true };
691
+ }, [update, refreshFromApi]);
692
+ const deleteMedia = useCallback((id) => {
693
+ const api = clientRef.current;
694
+ if (api) {
695
+ return (async () => {
696
+ try {
697
+ await api.deleteMedia(id);
698
+ await refreshFromApi();
699
+ return { ok: true };
700
+ }
701
+ catch (error) {
702
+ return { ok: false, error: getErrorMessage(error) };
703
+ }
704
+ })();
705
+ }
706
+ update((prev) => ({ ...prev, media: prev.media.filter((m) => m.id !== id) }));
707
+ return { ok: true };
708
+ }, [update, refreshFromApi]);
709
+ const comments = useCallback((brandId) => {
710
+ const brand = brandId === undefined ? activeBrandId : brandId;
711
+ return data.comments.filter((c) => (brand ? c.brandId === brand : true));
712
+ }, [data.comments, activeBrandId]);
713
+ const setCommentStatus = useCallback((id, status) => {
714
+ update((prev) => ({
715
+ ...prev,
716
+ comments: prev.comments.map((c) => (c.id === id ? { ...c, status } : c)),
717
+ }));
718
+ return { ok: true };
719
+ }, [update]);
720
+ const deleteComment = useCallback((id) => {
721
+ update((prev) => ({ ...prev, comments: prev.comments.filter((c) => c.id !== id) }));
722
+ return { ok: true };
723
+ }, [update]);
724
+ const users = useCallback(() => data.users, [data.users]);
725
+ const saveUser = useCallback((input) => {
726
+ if (!input.name.trim() || !input.email.trim()) {
727
+ return { ok: false, error: "Name and email are required." };
728
+ }
729
+ if (!input.id && (!input.password || input.password.length < 12)) {
730
+ return { ok: false, error: "Password must be at least 12 characters." };
731
+ }
732
+ if (input.id && input.password && input.password.length > 0 && input.password.length < 12) {
733
+ return { ok: false, error: "Password must be at least 12 characters." };
734
+ }
735
+ update((prev) => {
736
+ const roles = input.tenantRoles.map((r) => ({
737
+ tenant: r.tenant,
738
+ tenantName: prev.brands.find((b) => b.id === r.tenant)?.name ?? r.tenant,
739
+ role: r.role,
740
+ }));
741
+ if (input.id) {
742
+ return {
743
+ ...prev,
744
+ users: prev.users.map((u) => u.id === input.id
745
+ ? { ...u, name: input.name, email: input.email, globalRole: input.globalRole, roles }
746
+ : u),
747
+ };
748
+ }
749
+ const row = {
750
+ id: nextId("user"),
751
+ name: input.name,
752
+ email: input.email,
753
+ globalRole: input.globalRole,
754
+ roles,
755
+ isSelf: false,
756
+ };
757
+ return { ...prev, users: [row, ...prev.users] };
758
+ });
759
+ return { ok: true };
760
+ }, [update]);
761
+ const deleteUser = useCallback((id) => {
762
+ const row = data.users.find((u) => u.id === id);
763
+ if (!row)
764
+ return { ok: false, error: "User not found." };
765
+ if (row.isSelf)
766
+ return { ok: false, error: "You cannot delete your own account." };
767
+ update((prev) => ({ ...prev, users: prev.users.filter((u) => u.id !== id) }));
768
+ return { ok: true };
769
+ }, [data.users, update]);
770
+ const saveBrand = useCallback((brand) => {
771
+ if (!brand.name.trim())
772
+ return { ok: false, error: "Brand name is required." };
773
+ update((prev) => ({
774
+ ...prev,
775
+ brands: prev.brands.map((b) => (b.id === brand.id ? { ...brand } : b)),
776
+ }));
777
+ return { ok: true };
778
+ }, [update]);
779
+ const redirects = useCallback((brandId) => {
780
+ const brand = brandId === undefined ? activeBrandId : brandId;
781
+ return data.redirects.filter((r) => (brand ? r.brandId === brand : true));
782
+ }, [data.redirects, activeBrandId]);
783
+ const getRedirect = useCallback((id) => data.redirects.find((r) => r.id === id), [data.redirects]);
784
+ const saveRedirect = useCallback((input) => {
785
+ if (!input.from.trim())
786
+ return { ok: false, error: "From path is required." };
787
+ const terminal = new Set(["404", "410", "451"]);
788
+ if (!terminal.has(input.type) && !input.to?.trim()) {
789
+ return { ok: false, error: "Target URL is required for this redirect type." };
790
+ }
791
+ const id = input.id ?? nextId("redir");
792
+ const brand = data.brands.find((b) => b.id === input.brandId);
793
+ update((prev) => {
794
+ const row = {
795
+ id,
796
+ from: input.from.trim(),
797
+ to: input.to?.trim() ?? "",
798
+ type: input.type,
799
+ source: input.source ?? "manual",
800
+ active: input.active ?? true,
801
+ note: input.note ?? null,
802
+ brandId: input.brandId,
803
+ brandName: brand?.name ?? null,
804
+ brandSlug: brand?.slug ?? null,
805
+ updatedAt: new Date().toISOString(),
806
+ match: input.match ?? "exact",
807
+ ignoreCase: input.ignoreCase ?? true,
808
+ ignoreTrailingSlash: input.ignoreTrailingSlash ?? true,
809
+ forceHttps: input.forceHttps ?? true,
810
+ preserveQuery: input.preserveQuery ?? true,
811
+ wildcardMatch: input.wildcardMatch ?? false,
812
+ };
813
+ const exists = prev.redirects.some((r) => r.id === id);
814
+ return {
815
+ ...prev,
816
+ redirects: exists
817
+ ? prev.redirects.map((r) => (r.id === id ? row : r))
818
+ : [row, ...prev.redirects],
819
+ redirectAnalytics: {
820
+ ...prev.redirectAnalytics,
821
+ totalRules: exists
822
+ ? prev.redirectAnalytics.totalRules
823
+ : prev.redirectAnalytics.totalRules + 1,
824
+ },
825
+ };
826
+ });
827
+ return { ok: true };
828
+ }, [data.brands, update]);
829
+ const deleteRedirect = useCallback((id) => {
830
+ update((prev) => ({
831
+ ...prev,
832
+ redirects: prev.redirects.filter((r) => r.id !== id),
833
+ redirectAnalytics: {
834
+ ...prev.redirectAnalytics,
835
+ totalRules: Math.max(0, prev.redirectAnalytics.totalRules - 1),
836
+ },
837
+ }));
838
+ return { ok: true };
839
+ }, [update]);
840
+ const getRobots = useCallback((brandId) => data.robots[brandId] ?? {
841
+ allowPaths: ["/blog"],
842
+ disallowPaths: ["/admin"],
843
+ includeSitemap: true,
844
+ extraRules: "",
845
+ }, [data.robots]);
846
+ const saveRobots = useCallback((brandId, config) => {
847
+ update((prev) => ({ ...prev, robots: { ...prev.robots, [brandId]: config } }));
848
+ return { ok: true };
849
+ }, [update]);
850
+ const saveGa4 = useCallback((brandId, ga4MeasurementId) => {
851
+ update((prev) => ({
852
+ ...prev,
853
+ brands: prev.brands.map((b) => (b.id === brandId ? { ...b, ga4MeasurementId } : b)),
854
+ }));
855
+ return { ok: true };
856
+ }, [update]);
857
+ const saveGsc = useCallback((brandId, gscVerification) => {
858
+ update((prev) => ({
859
+ ...prev,
860
+ brands: prev.brands.map((b) => (b.id === brandId ? { ...b, gscVerification } : b)),
861
+ }));
862
+ return { ok: true };
863
+ }, [update]);
864
+ const saveSettings = useCallback((next) => {
865
+ update((prev) => ({ ...prev, settings: next }));
866
+ return { ok: true };
867
+ }, [update]);
868
+ const exportPayload = useCallback((kind, format, brandId) => {
869
+ const brand = brandId ?? activeBrandId;
870
+ const posts = data.posts.filter((p) => (brand ? p.brandId === brand : true) && !p.trashed);
871
+ const media = data.media.filter((m) => (brand ? m.brandId === brand : true));
872
+ const payload = kind === "posts" ? { posts } : kind === "media" ? { media } : { posts, media };
873
+ if (format === "json")
874
+ return JSON.stringify(payload, null, 2);
875
+ if (format === "csv") {
876
+ const lines = ["recordType,id,title"];
877
+ if (kind === "all" || kind === "posts") {
878
+ for (const p of posts)
879
+ lines.push(`post,${p.id},"${p.title.replace(/"/g, '""')}"`);
880
+ }
881
+ if (kind === "all" || kind === "media") {
882
+ for (const m of media)
883
+ lines.push(`media,${m.id},"${m.filename.replace(/"/g, '""')}"`);
884
+ }
885
+ return lines.join("\n");
886
+ }
887
+ return `<export>${JSON.stringify(payload)}</export>`;
888
+ }, [data, activeBrandId]);
889
+ const importPayload = useCallback((content, kind, brandId) => {
890
+ const result = {
891
+ postsCreated: 0,
892
+ postsSkipped: 0,
893
+ commentsCreated: 0,
894
+ commentsSkipped: 0,
895
+ errors: [],
896
+ };
897
+ try {
898
+ const parsed = JSON.parse(content);
899
+ if (kind === "all" || kind === "posts") {
900
+ for (const row of parsed.posts ?? []) {
901
+ if (!row.title) {
902
+ result.postsSkipped += 1;
903
+ continue;
904
+ }
905
+ const slug = row.slug || slugify(row.title);
906
+ if (data.posts.some((p) => p.slug === slug && p.brandId === brandId)) {
907
+ result.postsSkipped += 1;
908
+ continue;
909
+ }
910
+ savePost({
911
+ title: row.title,
912
+ slug,
913
+ brandId,
914
+ contentHtml: row.contentHtml ?? "",
915
+ status: "draft",
916
+ reviewState: "writing",
917
+ });
918
+ result.postsCreated += 1;
919
+ }
920
+ }
921
+ if (kind === "all" || kind === "comments") {
922
+ for (const row of parsed.comments ?? []) {
923
+ if (!row.body || !row.postSlug) {
924
+ result.commentsSkipped += 1;
925
+ continue;
926
+ }
927
+ const post = data.posts.find((p) => p.slug === row.postSlug && p.brandId === brandId);
928
+ if (!post) {
929
+ result.commentsSkipped += 1;
930
+ result.errors.push(`No post for slug ${row.postSlug}`);
931
+ continue;
932
+ }
933
+ update((prev) => ({
934
+ ...prev,
935
+ comments: [
936
+ {
937
+ id: nextId("cmt"),
938
+ authorName: row.authorName || "Imported",
939
+ authorEmail: null,
940
+ body: row.body,
941
+ status: "pending",
942
+ createdAt: new Date().toISOString(),
943
+ postId: post.id,
944
+ postTitle: post.title,
945
+ postOwnerId: prev.profile.id,
946
+ brandId,
947
+ brandName: prev.brands.find((b) => b.id === brandId)?.name ?? null,
948
+ },
949
+ ...prev.comments,
950
+ ],
951
+ }));
952
+ result.commentsCreated += 1;
953
+ }
954
+ }
955
+ }
956
+ catch {
957
+ result.errors.push("Could not parse import file as JSON.");
958
+ }
959
+ return result;
960
+ }, [data.posts, savePost, update]);
961
+ const value = useMemo(() => ({
962
+ data,
963
+ profile: data.profile,
964
+ activeBrandId,
965
+ setActiveBrandId,
966
+ brands,
967
+ activeBrand,
968
+ filterPosts,
969
+ postCounts,
970
+ getPost,
971
+ savePost,
972
+ bulkPostAction,
973
+ submitForReview,
974
+ approve,
975
+ sendBack,
976
+ publishNow,
977
+ unpublish,
978
+ schedulePost,
979
+ duplicatePost,
980
+ quickEditPost,
981
+ terms,
982
+ saveTerm,
983
+ deleteTerm,
984
+ listMedia,
985
+ uploadMedia,
986
+ updateMedia,
987
+ deleteMedia,
988
+ comments,
989
+ setCommentStatus,
990
+ deleteComment,
991
+ users,
992
+ saveUser,
993
+ deleteUser,
994
+ saveBrand,
995
+ redirects,
996
+ getRedirect,
997
+ saveRedirect,
998
+ deleteRedirect,
999
+ redirectAnalytics: data.redirectAnalytics,
1000
+ getRobots,
1001
+ saveRobots,
1002
+ saveGa4,
1003
+ saveGsc,
1004
+ settings: data.settings,
1005
+ saveSettings,
1006
+ exportPayload,
1007
+ importPayload,
1008
+ live,
1009
+ bootStatus,
1010
+ bootError,
1011
+ refreshFromApi,
1012
+ }), [
1013
+ data,
1014
+ activeBrandId,
1015
+ brands,
1016
+ activeBrand,
1017
+ filterPosts,
1018
+ postCounts,
1019
+ getPost,
1020
+ savePost,
1021
+ bulkPostAction,
1022
+ submitForReview,
1023
+ approve,
1024
+ sendBack,
1025
+ publishNow,
1026
+ unpublish,
1027
+ schedulePost,
1028
+ duplicatePost,
1029
+ quickEditPost,
1030
+ terms,
1031
+ saveTerm,
1032
+ deleteTerm,
1033
+ listMedia,
1034
+ uploadMedia,
1035
+ updateMedia,
1036
+ deleteMedia,
1037
+ comments,
1038
+ setCommentStatus,
1039
+ deleteComment,
1040
+ users,
1041
+ saveUser,
1042
+ deleteUser,
1043
+ saveBrand,
1044
+ redirects,
1045
+ getRedirect,
1046
+ saveRedirect,
1047
+ deleteRedirect,
1048
+ getRobots,
1049
+ saveRobots,
1050
+ saveGa4,
1051
+ saveGsc,
1052
+ saveSettings,
1053
+ exportPayload,
1054
+ importPayload,
1055
+ live,
1056
+ bootStatus,
1057
+ bootError,
1058
+ refreshFromApi,
1059
+ ]);
1060
+ return _jsx(AdminMockContext.Provider, { value: value, children: children });
1061
+ }
1062
+ export function useAdminMock() {
1063
+ const ctx = useContext(AdminMockContext);
1064
+ if (!ctx)
1065
+ throw new Error("useAdminMock must be used within AdminMockProvider");
1066
+ return ctx;
1067
+ }