@actuate-media/cms-admin 0.14.1 → 0.16.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 (304) hide show
  1. package/dist/AdminRoot.d.ts.map +1 -1
  2. package/dist/AdminRoot.js +148 -2
  3. package/dist/AdminRoot.js.map +1 -1
  4. package/dist/__tests__/components/posts-badges.test.d.ts +2 -0
  5. package/dist/__tests__/components/posts-badges.test.d.ts.map +1 -0
  6. package/dist/__tests__/components/posts-badges.test.js +68 -0
  7. package/dist/__tests__/components/posts-badges.test.js.map +1 -0
  8. package/dist/__tests__/layout/sidebar-posts.test.d.ts +2 -0
  9. package/dist/__tests__/layout/sidebar-posts.test.d.ts.map +1 -0
  10. package/dist/__tests__/layout/sidebar-posts.test.js +162 -0
  11. package/dist/__tests__/layout/sidebar-posts.test.js.map +1 -0
  12. package/dist/__tests__/lib/page-editor-service.test.d.ts +2 -0
  13. package/dist/__tests__/lib/page-editor-service.test.d.ts.map +1 -0
  14. package/dist/__tests__/lib/page-editor-service.test.js +137 -0
  15. package/dist/__tests__/lib/page-editor-service.test.js.map +1 -0
  16. package/dist/__tests__/lib/pages-service.test.d.ts +2 -0
  17. package/dist/__tests__/lib/pages-service.test.d.ts.map +1 -0
  18. package/dist/__tests__/lib/pages-service.test.js +140 -0
  19. package/dist/__tests__/lib/pages-service.test.js.map +1 -0
  20. package/dist/__tests__/lib/post-editor-service.test.d.ts +2 -0
  21. package/dist/__tests__/lib/post-editor-service.test.d.ts.map +1 -0
  22. package/dist/__tests__/lib/post-editor-service.test.js +185 -0
  23. package/dist/__tests__/lib/post-editor-service.test.js.map +1 -0
  24. package/dist/__tests__/lib/posts-service.test.d.ts +2 -0
  25. package/dist/__tests__/lib/posts-service.test.d.ts.map +1 -0
  26. package/dist/__tests__/lib/posts-service.test.js +244 -0
  27. package/dist/__tests__/lib/posts-service.test.js.map +1 -0
  28. package/dist/__tests__/views/posts-list-view.test.d.ts +2 -0
  29. package/dist/__tests__/views/posts-list-view.test.d.ts.map +1 -0
  30. package/dist/__tests__/views/posts-list-view.test.js +98 -0
  31. package/dist/__tests__/views/posts-list-view.test.js.map +1 -0
  32. package/dist/actuate-admin.css +1 -1
  33. package/dist/components/pages/tag-badges.d.ts +21 -0
  34. package/dist/components/pages/tag-badges.d.ts.map +1 -0
  35. package/dist/components/pages/tag-badges.js +56 -0
  36. package/dist/components/pages/tag-badges.js.map +1 -0
  37. package/dist/components/posts/badges.d.ts +25 -0
  38. package/dist/components/posts/badges.d.ts.map +1 -0
  39. package/dist/components/posts/badges.js +123 -0
  40. package/dist/components/posts/badges.js.map +1 -0
  41. package/dist/components/posts/icons.d.ts +12 -0
  42. package/dist/components/posts/icons.d.ts.map +1 -0
  43. package/dist/components/posts/icons.js +26 -0
  44. package/dist/components/posts/icons.js.map +1 -0
  45. package/dist/layout/Header.d.ts +14 -1
  46. package/dist/layout/Header.d.ts.map +1 -1
  47. package/dist/layout/Header.js +10 -3
  48. package/dist/layout/Header.js.map +1 -1
  49. package/dist/layout/Layout.d.ts.map +1 -1
  50. package/dist/layout/Layout.js +78 -2
  51. package/dist/layout/Layout.js.map +1 -1
  52. package/dist/layout/Sidebar.d.ts +16 -0
  53. package/dist/layout/Sidebar.d.ts.map +1 -1
  54. package/dist/layout/Sidebar.js +176 -49
  55. package/dist/layout/Sidebar.js.map +1 -1
  56. package/dist/lib/page-editor-service.d.ts +45 -0
  57. package/dist/lib/page-editor-service.d.ts.map +1 -0
  58. package/dist/lib/page-editor-service.js +153 -0
  59. package/dist/lib/page-editor-service.js.map +1 -0
  60. package/dist/lib/pages-service.d.ts +143 -0
  61. package/dist/lib/pages-service.d.ts.map +1 -0
  62. package/dist/lib/pages-service.js +444 -0
  63. package/dist/lib/pages-service.js.map +1 -0
  64. package/dist/lib/post-editor-service.d.ts +57 -0
  65. package/dist/lib/post-editor-service.d.ts.map +1 -0
  66. package/dist/lib/post-editor-service.js +234 -0
  67. package/dist/lib/post-editor-service.js.map +1 -0
  68. package/dist/lib/posts-service.d.ts +73 -0
  69. package/dist/lib/posts-service.d.ts.map +1 -0
  70. package/dist/lib/posts-service.js +245 -0
  71. package/dist/lib/posts-service.js.map +1 -0
  72. package/dist/lib/preview-link.d.ts +32 -0
  73. package/dist/lib/preview-link.d.ts.map +1 -0
  74. package/dist/lib/preview-link.js +40 -0
  75. package/dist/lib/preview-link.js.map +1 -0
  76. package/dist/router/index.d.ts +1 -0
  77. package/dist/router/index.d.ts.map +1 -1
  78. package/dist/router/index.js +9 -1
  79. package/dist/router/index.js.map +1 -1
  80. package/dist/views/Dashboard.d.ts.map +1 -1
  81. package/dist/views/Dashboard.js +147 -62
  82. package/dist/views/Dashboard.js.map +1 -1
  83. package/dist/views/Pages/PageTagManager.d.ts +14 -0
  84. package/dist/views/Pages/PageTagManager.d.ts.map +1 -0
  85. package/dist/views/Pages/PageTagManager.js +145 -0
  86. package/dist/views/Pages/PageTagManager.js.map +1 -0
  87. package/dist/views/Pages/PagesListView.d.ts +18 -0
  88. package/dist/views/Pages/PagesListView.d.ts.map +1 -0
  89. package/dist/views/Pages/PagesListView.js +287 -0
  90. package/dist/views/Pages/PagesListView.js.map +1 -0
  91. package/dist/views/Posts/NewPostPicker.d.ts +16 -0
  92. package/dist/views/Posts/NewPostPicker.d.ts.map +1 -0
  93. package/dist/views/Posts/NewPostPicker.js +59 -0
  94. package/dist/views/Posts/NewPostPicker.js.map +1 -0
  95. package/dist/views/Posts/NewPostTypeInstructions.d.ts +18 -0
  96. package/dist/views/Posts/NewPostTypeInstructions.d.ts.map +1 -0
  97. package/dist/views/Posts/NewPostTypeInstructions.js +147 -0
  98. package/dist/views/Posts/NewPostTypeInstructions.js.map +1 -0
  99. package/dist/views/Posts/PostTypesView.d.ts +26 -0
  100. package/dist/views/Posts/PostTypesView.d.ts.map +1 -0
  101. package/dist/views/Posts/PostTypesView.js +52 -0
  102. package/dist/views/Posts/PostTypesView.js.map +1 -0
  103. package/dist/views/Posts/PostsListView.d.ts +25 -0
  104. package/dist/views/Posts/PostsListView.d.ts.map +1 -0
  105. package/dist/views/Posts/PostsListView.js +239 -0
  106. package/dist/views/Posts/PostsListView.js.map +1 -0
  107. package/dist/views/Posts/post-type-presets.d.ts +32 -0
  108. package/dist/views/Posts/post-type-presets.d.ts.map +1 -0
  109. package/dist/views/Posts/post-type-presets.js +72 -0
  110. package/dist/views/Posts/post-type-presets.js.map +1 -0
  111. package/dist/views/page-builder/Widgets.d.ts +13 -0
  112. package/dist/views/page-builder/Widgets.d.ts.map +1 -0
  113. package/dist/views/page-builder/Widgets.js +15 -0
  114. package/dist/views/page-builder/Widgets.js.map +1 -0
  115. package/dist/views/page-editor/AddSectionModal.d.ts +20 -0
  116. package/dist/views/page-editor/AddSectionModal.d.ts.map +1 -0
  117. package/dist/views/page-editor/AddSectionModal.js +22 -0
  118. package/dist/views/page-editor/AddSectionModal.js.map +1 -0
  119. package/dist/views/page-editor/EditorCanvas.d.ts +18 -0
  120. package/dist/views/page-editor/EditorCanvas.d.ts.map +1 -0
  121. package/dist/views/page-editor/EditorCanvas.js +64 -0
  122. package/dist/views/page-editor/EditorCanvas.js.map +1 -0
  123. package/dist/views/page-editor/EditorTopBar.d.ts +30 -0
  124. package/dist/views/page-editor/EditorTopBar.d.ts.map +1 -0
  125. package/dist/views/page-editor/EditorTopBar.js +42 -0
  126. package/dist/views/page-editor/EditorTopBar.js.map +1 -0
  127. package/dist/views/page-editor/PagePreview.d.ts +13 -0
  128. package/dist/views/page-editor/PagePreview.d.ts.map +1 -0
  129. package/dist/views/page-editor/PagePreview.js +37 -0
  130. package/dist/views/page-editor/PagePreview.js.map +1 -0
  131. package/dist/views/page-editor/PageSectionEditor.d.ts +16 -0
  132. package/dist/views/page-editor/PageSectionEditor.d.ts.map +1 -0
  133. package/dist/views/page-editor/PageSectionEditor.js +272 -0
  134. package/dist/views/page-editor/PageSectionEditor.js.map +1 -0
  135. package/dist/views/page-editor/PageSettingsModal.d.ts +12 -0
  136. package/dist/views/page-editor/PageSettingsModal.d.ts.map +1 -0
  137. package/dist/views/page-editor/PageSettingsModal.js +52 -0
  138. package/dist/views/page-editor/PageSettingsModal.js.map +1 -0
  139. package/dist/views/page-editor/SectionInspector.d.ts +17 -0
  140. package/dist/views/page-editor/SectionInspector.d.ts.map +1 -0
  141. package/dist/views/page-editor/SectionInspector.js +98 -0
  142. package/dist/views/page-editor/SectionInspector.js.map +1 -0
  143. package/dist/views/page-editor/SectionsPanel.d.ts +15 -0
  144. package/dist/views/page-editor/SectionsPanel.d.ts.map +1 -0
  145. package/dist/views/page-editor/SectionsPanel.js +43 -0
  146. package/dist/views/page-editor/SectionsPanel.js.map +1 -0
  147. package/dist/views/page-editor/ValidationSummary.d.ts +9 -0
  148. package/dist/views/page-editor/ValidationSummary.d.ts.map +1 -0
  149. package/dist/views/page-editor/ValidationSummary.js +10 -0
  150. package/dist/views/page-editor/ValidationSummary.js.map +1 -0
  151. package/dist/views/page-editor/section-icons.d.ts +4 -0
  152. package/dist/views/page-editor/section-icons.d.ts.map +1 -0
  153. package/dist/views/page-editor/section-icons.js +20 -0
  154. package/dist/views/page-editor/section-icons.js.map +1 -0
  155. package/dist/views/page-editor/section-types.d.ts +11 -0
  156. package/dist/views/page-editor/section-types.d.ts.map +1 -0
  157. package/dist/views/page-editor/section-types.js +10 -0
  158. package/dist/views/page-editor/section-types.js.map +1 -0
  159. package/dist/views/page-editor/sections/ArticleBodySection.d.ts +13 -0
  160. package/dist/views/page-editor/sections/ArticleBodySection.d.ts.map +1 -0
  161. package/dist/views/page-editor/sections/ArticleBodySection.js +23 -0
  162. package/dist/views/page-editor/sections/ArticleBodySection.js.map +1 -0
  163. package/dist/views/page-editor/sections/AuthorBioSection.d.ts +8 -0
  164. package/dist/views/page-editor/sections/AuthorBioSection.d.ts.map +1 -0
  165. package/dist/views/page-editor/sections/AuthorBioSection.js +21 -0
  166. package/dist/views/page-editor/sections/AuthorBioSection.js.map +1 -0
  167. package/dist/views/page-editor/sections/ByTheNumbersSection.d.ts +5 -0
  168. package/dist/views/page-editor/sections/ByTheNumbersSection.d.ts.map +1 -0
  169. package/dist/views/page-editor/sections/ByTheNumbersSection.js +10 -0
  170. package/dist/views/page-editor/sections/ByTheNumbersSection.js.map +1 -0
  171. package/dist/views/page-editor/sections/CtaBannerSection.d.ts +5 -0
  172. package/dist/views/page-editor/sections/CtaBannerSection.d.ts.map +1 -0
  173. package/dist/views/page-editor/sections/CtaBannerSection.js +10 -0
  174. package/dist/views/page-editor/sections/CtaBannerSection.js.map +1 -0
  175. package/dist/views/page-editor/sections/FeatureHighlightSection.d.ts +5 -0
  176. package/dist/views/page-editor/sections/FeatureHighlightSection.d.ts.map +1 -0
  177. package/dist/views/page-editor/sections/FeatureHighlightSection.js +18 -0
  178. package/dist/views/page-editor/sections/FeatureHighlightSection.js.map +1 -0
  179. package/dist/views/page-editor/sections/GallerySection.d.ts +6 -0
  180. package/dist/views/page-editor/sections/GallerySection.d.ts.map +1 -0
  181. package/dist/views/page-editor/sections/GallerySection.js +17 -0
  182. package/dist/views/page-editor/sections/GallerySection.js.map +1 -0
  183. package/dist/views/page-editor/sections/HeroBannerSection.d.ts +5 -0
  184. package/dist/views/page-editor/sections/HeroBannerSection.d.ts.map +1 -0
  185. package/dist/views/page-editor/sections/HeroBannerSection.js +11 -0
  186. package/dist/views/page-editor/sections/HeroBannerSection.js.map +1 -0
  187. package/dist/views/page-editor/sections/MissionSection.d.ts +6 -0
  188. package/dist/views/page-editor/sections/MissionSection.d.ts.map +1 -0
  189. package/dist/views/page-editor/sections/MissionSection.js +12 -0
  190. package/dist/views/page-editor/sections/MissionSection.js.map +1 -0
  191. package/dist/views/page-editor/sections/PullQuoteSection.d.ts +6 -0
  192. package/dist/views/page-editor/sections/PullQuoteSection.d.ts.map +1 -0
  193. package/dist/views/page-editor/sections/PullQuoteSection.js +13 -0
  194. package/dist/views/page-editor/sections/PullQuoteSection.js.map +1 -0
  195. package/dist/views/page-editor/sections/RelatedPostsSection.d.ts +12 -0
  196. package/dist/views/page-editor/sections/RelatedPostsSection.d.ts.map +1 -0
  197. package/dist/views/page-editor/sections/RelatedPostsSection.js +23 -0
  198. package/dist/views/page-editor/sections/RelatedPostsSection.js.map +1 -0
  199. package/dist/views/page-editor/sections/SectionRenderer.d.ts +22 -0
  200. package/dist/views/page-editor/sections/SectionRenderer.d.ts.map +1 -0
  201. package/dist/views/page-editor/sections/SectionRenderer.js +52 -0
  202. package/dist/views/page-editor/sections/SectionRenderer.js.map +1 -0
  203. package/dist/views/page-editor/sections/index.d.ts +14 -0
  204. package/dist/views/page-editor/sections/index.d.ts.map +1 -0
  205. package/dist/views/page-editor/sections/index.js +12 -0
  206. package/dist/views/page-editor/sections/index.js.map +1 -0
  207. package/dist/views/page-editor/sections/parts.d.ts +55 -0
  208. package/dist/views/page-editor/sections/parts.d.ts.map +1 -0
  209. package/dist/views/page-editor/sections/parts.js +60 -0
  210. package/dist/views/page-editor/sections/parts.js.map +1 -0
  211. package/dist/views/page-editor/viewports.d.ts +14 -0
  212. package/dist/views/page-editor/viewports.d.ts.map +1 -0
  213. package/dist/views/page-editor/viewports.js +12 -0
  214. package/dist/views/page-editor/viewports.js.map +1 -0
  215. package/dist/views/post-editor/PostEditorCanvas.d.ts +21 -0
  216. package/dist/views/post-editor/PostEditorCanvas.d.ts.map +1 -0
  217. package/dist/views/post-editor/PostEditorCanvas.js +58 -0
  218. package/dist/views/post-editor/PostEditorCanvas.js.map +1 -0
  219. package/dist/views/post-editor/PostFieldsModal.d.ts +12 -0
  220. package/dist/views/post-editor/PostFieldsModal.d.ts.map +1 -0
  221. package/dist/views/post-editor/PostFieldsModal.js +53 -0
  222. package/dist/views/post-editor/PostFieldsModal.js.map +1 -0
  223. package/dist/views/post-editor/PostHeader.d.ts +15 -0
  224. package/dist/views/post-editor/PostHeader.d.ts.map +1 -0
  225. package/dist/views/post-editor/PostHeader.js +27 -0
  226. package/dist/views/post-editor/PostHeader.js.map +1 -0
  227. package/dist/views/post-editor/PostHeaderPanel.d.ts +11 -0
  228. package/dist/views/post-editor/PostHeaderPanel.d.ts.map +1 -0
  229. package/dist/views/post-editor/PostHeaderPanel.js +21 -0
  230. package/dist/views/post-editor/PostHeaderPanel.js.map +1 -0
  231. package/dist/views/post-editor/PostPreview.d.ts +14 -0
  232. package/dist/views/post-editor/PostPreview.d.ts.map +1 -0
  233. package/dist/views/post-editor/PostPreview.js +53 -0
  234. package/dist/views/post-editor/PostPreview.js.map +1 -0
  235. package/dist/views/post-editor/PostSectionEditor.d.ts +17 -0
  236. package/dist/views/post-editor/PostSectionEditor.d.ts.map +1 -0
  237. package/dist/views/post-editor/PostSectionEditor.js +290 -0
  238. package/dist/views/post-editor/PostSectionEditor.js.map +1 -0
  239. package/dist/views/post-editor/PostTemplateEditor.d.ts +9 -0
  240. package/dist/views/post-editor/PostTemplateEditor.d.ts.map +1 -0
  241. package/dist/views/post-editor/PostTemplateEditor.js +144 -0
  242. package/dist/views/post-editor/PostTemplateEditor.js.map +1 -0
  243. package/package.json +2 -2
  244. package/src/AdminRoot.tsx +213 -2
  245. package/src/__tests__/components/posts-badges.test.tsx +77 -0
  246. package/src/__tests__/layout/sidebar-posts.test.ts +179 -0
  247. package/src/__tests__/lib/page-editor-service.test.ts +173 -0
  248. package/src/__tests__/lib/pages-service.test.ts +157 -0
  249. package/src/__tests__/lib/post-editor-service.test.ts +215 -0
  250. package/src/__tests__/lib/posts-service.test.ts +279 -0
  251. package/src/__tests__/views/posts-list-view.test.ts +110 -0
  252. package/src/components/pages/tag-badges.tsx +104 -0
  253. package/src/components/posts/badges.tsx +170 -0
  254. package/src/components/posts/icons.ts +40 -0
  255. package/src/layout/Header.tsx +90 -43
  256. package/src/layout/Layout.tsx +166 -1
  257. package/src/layout/Sidebar.tsx +287 -101
  258. package/src/lib/page-editor-service.ts +233 -0
  259. package/src/lib/pages-service.ts +599 -0
  260. package/src/lib/post-editor-service.ts +342 -0
  261. package/src/lib/posts-service.ts +366 -0
  262. package/src/lib/preview-link.ts +63 -0
  263. package/src/router/index.ts +10 -1
  264. package/src/views/Dashboard.tsx +270 -131
  265. package/src/views/Pages/PageTagManager.tsx +436 -0
  266. package/src/views/Pages/PagesListView.tsx +944 -0
  267. package/src/views/Posts/NewPostPicker.tsx +147 -0
  268. package/src/views/Posts/NewPostTypeInstructions.tsx +344 -0
  269. package/src/views/Posts/PostTypesView.tsx +194 -0
  270. package/src/views/Posts/PostsListView.tsx +869 -0
  271. package/src/views/Posts/post-type-presets.ts +105 -0
  272. package/src/views/page-builder/Widgets.tsx +44 -0
  273. package/src/views/page-editor/AddSectionModal.tsx +56 -0
  274. package/src/views/page-editor/EditorCanvas.tsx +127 -0
  275. package/src/views/page-editor/EditorTopBar.tsx +233 -0
  276. package/src/views/page-editor/PagePreview.tsx +96 -0
  277. package/src/views/page-editor/PageSectionEditor.tsx +476 -0
  278. package/src/views/page-editor/PageSettingsModal.tsx +154 -0
  279. package/src/views/page-editor/SectionInspector.tsx +599 -0
  280. package/src/views/page-editor/SectionsPanel.tsx +270 -0
  281. package/src/views/page-editor/ValidationSummary.tsx +53 -0
  282. package/src/views/page-editor/section-icons.ts +33 -0
  283. package/src/views/page-editor/section-types.ts +27 -0
  284. package/src/views/page-editor/sections/ArticleBodySection.tsx +57 -0
  285. package/src/views/page-editor/sections/AuthorBioSection.tsx +61 -0
  286. package/src/views/page-editor/sections/ByTheNumbersSection.tsx +41 -0
  287. package/src/views/page-editor/sections/CtaBannerSection.tsx +29 -0
  288. package/src/views/page-editor/sections/FeatureHighlightSection.tsx +63 -0
  289. package/src/views/page-editor/sections/GallerySection.tsx +54 -0
  290. package/src/views/page-editor/sections/HeroBannerSection.tsx +44 -0
  291. package/src/views/page-editor/sections/MissionSection.tsx +22 -0
  292. package/src/views/page-editor/sections/PullQuoteSection.tsx +27 -0
  293. package/src/views/page-editor/sections/RelatedPostsSection.tsx +55 -0
  294. package/src/views/page-editor/sections/SectionRenderer.tsx +102 -0
  295. package/src/views/page-editor/sections/index.ts +13 -0
  296. package/src/views/page-editor/sections/parts.tsx +113 -0
  297. package/src/views/page-editor/viewports.ts +25 -0
  298. package/src/views/post-editor/PostEditorCanvas.tsx +123 -0
  299. package/src/views/post-editor/PostFieldsModal.tsx +196 -0
  300. package/src/views/post-editor/PostHeader.tsx +87 -0
  301. package/src/views/post-editor/PostHeaderPanel.tsx +107 -0
  302. package/src/views/post-editor/PostPreview.tsx +114 -0
  303. package/src/views/post-editor/PostSectionEditor.tsx +506 -0
  304. package/src/views/post-editor/PostTemplateEditor.tsx +347 -0
@@ -0,0 +1,145 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useMemo, useState } from 'react';
4
+ import { ArrowLeft, GitMerge, Loader2, Pencil, Plus, Trash2, X } from 'lucide-react';
5
+ import { toast } from 'sonner';
6
+ import { createPageTag, deletePageTagWithDetach, fetchPages, mergePageTags, updatePageTag, } from '../../lib/pages-service.js';
7
+ import { PageTagPill, tagDotColor } from '../../components/pages/tag-badges.js';
8
+ import { ConfirmDialog } from '../../components/ui/ConfirmDialog.js';
9
+ const TAG_COLORS = ['purple', 'green', 'orange', 'red', 'blue', 'pink', 'gray'];
10
+ /**
11
+ * /pages/tags — create, rename, recolor, merge, and delete page tags.
12
+ *
13
+ * Tags are documents in the hidden `page-tags` collection; pages
14
+ * reference them by slug in `data.tags`. Deleting a tag detaches it
15
+ * from every page first so no dangling slugs remain.
16
+ */
17
+ export function PageTagManager({ onNavigate, startCreating = false }) {
18
+ const [tags, setTags] = useState([]);
19
+ const [loading, setLoading] = useState(true);
20
+ const [error, setError] = useState(null);
21
+ const [refreshToken, setRefreshToken] = useState(0);
22
+ const [creating, setCreating] = useState(startCreating);
23
+ const [pendingDelete, setPendingDelete] = useState(null);
24
+ const existingSlugs = useMemo(() => new Set(tags.map((t) => t.slug)), [tags]);
25
+ const load = useCallback(async () => {
26
+ setLoading(true);
27
+ setError(null);
28
+ try {
29
+ // fetchPages returns tags with accurate page counts.
30
+ const res = await fetchPages({ pageSize: 1 });
31
+ setTags(res.tags);
32
+ }
33
+ catch (err) {
34
+ setError(err instanceof Error ? err.message : 'Failed to load tags');
35
+ }
36
+ finally {
37
+ setLoading(false);
38
+ }
39
+ }, []);
40
+ useEffect(() => {
41
+ void load();
42
+ }, [load, refreshToken]);
43
+ const refresh = () => setRefreshToken((t) => t + 1);
44
+ const handleDelete = async (tag) => {
45
+ const promise = deletePageTagWithDetach(tag);
46
+ toast.promise(promise, {
47
+ loading: `Deleting "${tag.name}"…`,
48
+ success: () => `Deleted "${tag.name}"`,
49
+ error: 'Failed to delete tag',
50
+ });
51
+ await promise;
52
+ setPendingDelete(null);
53
+ refresh();
54
+ };
55
+ return (_jsxs("div", { className: "p-4 pr-8 sm:p-6", children: [_jsxs("button", { type: "button", onClick: () => onNavigate('/pages'), className: "text-muted-foreground hover:text-foreground mb-4 inline-flex items-center gap-1.5 text-sm", children: [_jsx(ArrowLeft, { className: "h-4 w-4", "aria-hidden": true }), "Back to Pages"] }), _jsxs("div", { className: "mb-5 flex items-center justify-between", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-foreground mb-1 text-xl font-medium tracking-tight sm:text-2xl", children: "Page Tags" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Organize pages with reusable, color-coded labels." })] }), !creating && (_jsxs("button", { type: "button", onClick: () => setCreating(true), className: "bg-primary text-primary-foreground hover:bg-primary/90 inline-flex items-center gap-1.5 rounded-lg px-3.5 py-1.5 text-sm font-medium shadow-sm transition-colors", children: [_jsx(Plus, { className: "h-3.5 w-3.5", "aria-hidden": true }), "New tag"] }))] }), creating && (_jsx(CreateTagForm, { existingSlugs: existingSlugs, onCancel: () => setCreating(false), onCreated: () => {
56
+ setCreating(false);
57
+ refresh();
58
+ } })), loading ? (_jsxs("div", { className: "flex h-48 items-center justify-center", role: "status", "aria-live": "polite", children: [_jsx(Loader2, { className: "text-primary h-6 w-6 animate-spin", "aria-hidden": true }), _jsx("span", { className: "sr-only", children: "Loading tags" })] })) : error ? (_jsxs("div", { className: "border-border bg-card flex items-center gap-3 rounded-lg border p-3", children: [_jsx("span", { className: "text-foreground flex-1 text-sm", children: error }), _jsx("button", { type: "button", onClick: refresh, className: "border-border text-foreground hover:bg-accent rounded-md border px-3 py-1 text-sm", children: "Retry" })] })) : tags.length === 0 ? (_jsxs("div", { className: "border-border bg-card rounded-lg border p-8 text-center", children: [_jsx("h2", { className: "text-foreground mb-1 text-lg font-medium", children: "No tags yet" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Create a tag to start organizing pages." })] })) : (_jsx("div", { className: "bg-card border-border divide-border divide-y overflow-hidden rounded-xl border shadow-sm", children: tags.map((tag) => (_jsx(TagRow, { tag: tag, allTags: tags, onChanged: refresh, onRequestDelete: () => setPendingDelete(tag) }, tag.docId))) })), _jsx(ConfirmDialog, { open: pendingDelete !== null, title: `Delete "${pendingDelete?.name ?? ''}"?`, description: pendingDelete && pendingDelete.pageCount > 0
59
+ ? `This tag is used on ${pendingDelete.pageCount} page${pendingDelete.pageCount === 1 ? '' : 's'}. It will be removed from those pages. This cannot be undone.`
60
+ : 'This tag has no pages. Deleting it cannot be undone.', confirmLabel: "Delete tag", destructive: true, onClose: () => setPendingDelete(null), onConfirm: () => {
61
+ if (pendingDelete)
62
+ void handleDelete(pendingDelete);
63
+ } })] }));
64
+ }
65
+ // ─── Create form ─────────────────────────────────────────────────────
66
+ function CreateTagForm({ existingSlugs, onCancel, onCreated, }) {
67
+ const [name, setName] = useState('');
68
+ const [color, setColor] = useState('purple');
69
+ const [submitting, setSubmitting] = useState(false);
70
+ const slug = name
71
+ .toLowerCase()
72
+ .trim()
73
+ .replace(/[^a-z0-9]+/g, '-')
74
+ .replace(/^-+|-+$/g, '');
75
+ const duplicate = slug.length > 0 && existingSlugs.has(slug);
76
+ const canSubmit = slug.length > 0 && !duplicate && !submitting;
77
+ const submit = async () => {
78
+ if (!canSubmit)
79
+ return;
80
+ setSubmitting(true);
81
+ const res = await createPageTag({ name: name.trim(), color });
82
+ setSubmitting(false);
83
+ if (res.error) {
84
+ toast.error(res.error);
85
+ return;
86
+ }
87
+ toast.success(`Created "${name.trim()}"`);
88
+ onCreated();
89
+ };
90
+ return (_jsxs("div", { className: "border-border bg-card mb-5 rounded-xl border p-4 shadow-sm", children: [_jsxs("div", { className: "flex flex-wrap items-end gap-3", children: [_jsxs("label", { className: "flex-1", children: [_jsx("span", { className: "text-foreground mb-1 block text-sm font-medium", children: "Tag name" }), _jsx("input", { type: "text", value: name, autoFocus: true, onChange: (e) => setName(e.target.value), onKeyDown: (e) => {
91
+ if (e.key === 'Enter')
92
+ void submit();
93
+ }, placeholder: "e.g. Marketing", className: "border-border bg-input-background text-foreground focus:border-primary focus:ring-primary/30 w-full rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none" })] }), _jsx(ColorPicker, { value: color, onChange: setColor }), _jsxs("button", { type: "button", onClick: () => void submit(), disabled: !canSubmit, className: "bg-primary text-primary-foreground hover:bg-primary/90 inline-flex items-center gap-1.5 rounded-lg px-3.5 py-2 text-sm font-medium shadow-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: [submitting ? _jsx(Loader2, { className: "h-4 w-4 animate-spin", "aria-hidden": true }) : null, "Create"] }), _jsxs("button", { type: "button", onClick: onCancel, className: "text-muted-foreground hover:text-foreground inline-flex items-center gap-1 px-2 py-2 text-sm", children: [_jsx(X, { className: "h-4 w-4", "aria-hidden": true }), "Cancel"] })] }), duplicate && (_jsx("p", { className: "text-destructive mt-2 text-xs", children: "A tag with that name already exists." }))] }));
94
+ }
95
+ function ColorPicker({ value, onChange }) {
96
+ return (_jsxs("div", { children: [_jsx("span", { className: "text-foreground mb-1 block text-sm font-medium", children: "Color" }), _jsx("div", { className: "flex items-center gap-1.5", role: "radiogroup", "aria-label": "Tag color", children: TAG_COLORS.map((c) => (_jsx("button", { type: "button", role: "radio", "aria-checked": value === c, "aria-label": c, onClick: () => onChange(c), className: `h-7 w-7 rounded-full ${tagDotColor(c)} ring-offset-background transition-shadow ${value === c ? 'ring-ring ring-2 ring-offset-2' : ''}` }, c))) })] }));
97
+ }
98
+ // ─── Tag row ─────────────────────────────────────────────────────────
99
+ function TagRow({ tag, allTags, onChanged, onRequestDelete, }) {
100
+ const [editing, setEditing] = useState(false);
101
+ const [name, setName] = useState(tag.name);
102
+ const [color, setColor] = useState(tag.color ?? 'gray');
103
+ const [merging, setMerging] = useState(false);
104
+ const save = async () => {
105
+ const res = await updatePageTag(tag.docId, { name: name.trim(), color });
106
+ if (res.error) {
107
+ toast.error(res.error);
108
+ return;
109
+ }
110
+ toast.success('Tag updated');
111
+ setEditing(false);
112
+ onChanged();
113
+ };
114
+ const merge = async (targetSlug) => {
115
+ const target = allTags.find((t) => t.slug === targetSlug);
116
+ if (!target)
117
+ return;
118
+ const promise = mergePageTags(tag, target);
119
+ toast.promise(promise, {
120
+ loading: `Merging "${tag.name}" into "${target.name}"…`,
121
+ success: () => `Merged into "${target.name}"`,
122
+ error: 'Merge failed',
123
+ });
124
+ await promise;
125
+ setMerging(false);
126
+ onChanged();
127
+ };
128
+ if (editing) {
129
+ return (_jsxs("div", { className: "flex flex-wrap items-end gap-3 p-4", children: [_jsxs("label", { className: "flex-1", children: [_jsx("span", { className: "sr-only", children: "Tag name" }), _jsx("input", { type: "text", value: name, onChange: (e) => setName(e.target.value), className: "border-border bg-input-background text-foreground focus:border-primary focus:ring-primary/30 w-full rounded-lg border px-3 py-2 text-sm focus:ring-2 focus:outline-none" })] }), _jsx(ColorPicker, { value: color, onChange: setColor }), _jsx("button", { type: "button", onClick: () => void save(), className: "bg-primary text-primary-foreground hover:bg-primary/90 rounded-lg px-3.5 py-2 text-sm font-medium", children: "Save" }), _jsx("button", { type: "button", onClick: () => {
130
+ setEditing(false);
131
+ setName(tag.name);
132
+ setColor(tag.color ?? 'gray');
133
+ }, className: "text-muted-foreground hover:text-foreground px-2 py-2 text-sm", children: "Cancel" })] }));
134
+ }
135
+ return (_jsxs("div", { className: "flex items-center gap-3 p-4", children: [_jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-3", children: [_jsx(PageTagPill, { name: tag.name, color: tag.color }), _jsxs("span", { className: "text-muted-foreground text-sm tabular-nums", children: [tag.pageCount, " page", tag.pageCount === 1 ? '' : 's'] })] }), merging ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("label", { className: "text-foreground inline-flex items-center gap-1.5 text-sm", children: [_jsx("span", { className: "text-muted-foreground", children: "Merge into:" }), _jsxs("select", { defaultValue: "", onChange: (e) => {
136
+ if (e.target.value)
137
+ void merge(e.target.value);
138
+ }, className: "border-border bg-card text-foreground rounded-lg border px-2.5 py-1.5 text-sm", children: [_jsx("option", { value: "", disabled: true, children: "Choose tag\u2026" }), allTags
139
+ .filter((t) => t.slug !== tag.slug)
140
+ .map((t) => (_jsx("option", { value: t.slug, children: t.name }, t.slug)))] })] }), _jsx("button", { type: "button", onClick: () => setMerging(false), className: "text-muted-foreground hover:text-foreground px-2 py-1 text-sm", children: "Cancel" })] })) : (_jsxs("div", { className: "flex items-center gap-1", children: [_jsx(IconAction, { label: `Edit ${tag.name}`, onClick: () => setEditing(true), children: _jsx(Pencil, { className: "h-4 w-4", "aria-hidden": true }) }), allTags.length > 1 && (_jsx(IconAction, { label: `Merge ${tag.name}`, onClick: () => setMerging(true), children: _jsx(GitMerge, { className: "h-4 w-4", "aria-hidden": true }) })), _jsx(IconAction, { label: `Delete ${tag.name}`, onClick: onRequestDelete, destructive: true, children: _jsx(Trash2, { className: "h-4 w-4", "aria-hidden": true }) })] }))] }));
141
+ }
142
+ function IconAction({ label, onClick, destructive, children, }) {
143
+ return (_jsx("button", { type: "button", onClick: onClick, "aria-label": label, className: `hover:bg-accent inline-flex h-8 w-8 items-center justify-center rounded-md transition-colors ${destructive ? 'text-destructive hover:bg-destructive/10' : 'text-muted-foreground'}`, children: children }));
144
+ }
145
+ //# sourceMappingURL=PageTagManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageTagManager.js","sourceRoot":"","sources":["../../../src/views/Pages/PageTagManager.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Pages management surface — table with a tag-chip filter bar, group-by,
3
+ * status filter, sortable headers, bulk actions, and pagination. Data
4
+ * flows through pages-service so a future server-side aggregate only
5
+ * touches the service file.
6
+ *
7
+ * Routing:
8
+ * - Row click → /pages/:id/edit (the page builder).
9
+ * - "+ New page" lives in the top bar (computePageActions).
10
+ * - "Manage tags" (in the tag bar) → /pages/tags.
11
+ */
12
+ interface PagesListViewProps {
13
+ onNavigate: (path: string) => void;
14
+ }
15
+ export declare function PagesListView({ onNavigate }: PagesListViewProps): import("react/jsx-runtime").JSX.Element;
16
+ export declare function pageNumbers(current: number, total: number): Array<number | '…'>;
17
+ export {};
18
+ //# sourceMappingURL=PagesListView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PagesListView.d.ts","sourceRoot":"","sources":["../../../src/views/Pages/PagesListView.tsx"],"names":[],"mappings":"AA+BA;;;;;;;;;;GAUG;AAEH,UAAU,kBAAkB;IAC1B,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC;AAOD,wBAAgB,aAAa,CAAC,EAAE,UAAU,EAAE,EAAE,kBAAkB,2CA6b/D;AAobD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAU/E"}
@@ -0,0 +1,287 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
4
+ import { ChevronDown, ChevronLeft, ChevronRight, ChevronUp, Plus, Search, Tag as TagIcon, Trash2, X, } from 'lucide-react';
5
+ import { toast } from 'sonner';
6
+ import { bulkChangePageTags, bulkDeletePages, bulkUpdatePages, fetchPages, groupPages, } from '../../lib/pages-service.js';
7
+ import { PostStatusBadge, SeoScoreIndicator } from '../../components/posts/badges.js';
8
+ import { PageTagChip, PageTagsCell } from '../../components/pages/tag-badges.js';
9
+ import { ConfirmDialog } from '../../components/ui/ConfirmDialog.js';
10
+ const PAGE_SIZE = 25;
11
+ export function PagesListView({ onNavigate }) {
12
+ const [search, setSearch] = useState('');
13
+ const [debouncedSearch, setDebouncedSearch] = useState('');
14
+ const [status, setStatus] = useState('all');
15
+ const [groupBy, setGroupBy] = useState('none');
16
+ const [selectedTags, setSelectedTags] = useState(new Set());
17
+ const [sortBy, setSortBy] = useState('title');
18
+ const [dir, setDir] = useState('asc');
19
+ const [page, setPage] = useState(1);
20
+ const [selected, setSelected] = useState(new Set());
21
+ const [data, setData] = useState(null);
22
+ const [loading, setLoading] = useState(true);
23
+ const [error, setError] = useState(null);
24
+ const [refreshToken, setRefreshToken] = useState(0);
25
+ const [pendingDelete, setPendingDelete] = useState(false);
26
+ const debounceTimer = useRef(null);
27
+ useEffect(() => {
28
+ if (debounceTimer.current)
29
+ clearTimeout(debounceTimer.current);
30
+ debounceTimer.current = setTimeout(() => {
31
+ setDebouncedSearch(search.trim());
32
+ setPage(1);
33
+ }, 250);
34
+ return () => {
35
+ if (debounceTimer.current)
36
+ clearTimeout(debounceTimer.current);
37
+ };
38
+ }, [search]);
39
+ const tagIds = useMemo(() => [...selectedTags], [selectedTags]);
40
+ useEffect(() => {
41
+ let cancelled = false;
42
+ setLoading(true);
43
+ setError(null);
44
+ fetchPages({
45
+ status,
46
+ tagIds,
47
+ search: debouncedSearch,
48
+ groupBy,
49
+ sortBy,
50
+ sortDirection: dir,
51
+ page,
52
+ pageSize: PAGE_SIZE,
53
+ })
54
+ .then((res) => {
55
+ if (cancelled)
56
+ return;
57
+ setData(res);
58
+ setLoading(false);
59
+ })
60
+ .catch((err) => {
61
+ if (cancelled)
62
+ return;
63
+ setError(err instanceof Error ? err.message : 'Failed to load pages');
64
+ setLoading(false);
65
+ });
66
+ return () => {
67
+ cancelled = true;
68
+ };
69
+ }, [status, tagIds, debouncedSearch, groupBy, sortBy, dir, page, refreshToken]);
70
+ // Reset paging/selection when the result set changes shape.
71
+ useEffect(() => {
72
+ setPage(1);
73
+ setSelected(new Set());
74
+ }, [debouncedSearch, status, tagIds, groupBy]);
75
+ const pages = data?.pages ?? [];
76
+ const tags = data?.tags ?? [];
77
+ const total = data?.total ?? 0;
78
+ const totalAll = useMemo(() => tags.reduce((sum, t) => sum + t.pageCount, 0), [tags]);
79
+ const totalPages = Math.max(1, Math.ceil(total / PAGE_SIZE));
80
+ const grouped = groupBy !== 'none';
81
+ const tagBySlug = useMemo(() => {
82
+ const m = new Map();
83
+ for (const t of tags)
84
+ m.set(t.slug, t);
85
+ return m;
86
+ }, [tags]);
87
+ const displayGroups = useMemo(() => groupPages(pages, groupBy, tags), [pages, groupBy, tags]);
88
+ const handleSort = useCallback((field) => {
89
+ if (sortBy === field) {
90
+ setDir((d) => (d === 'asc' ? 'desc' : 'asc'));
91
+ }
92
+ else {
93
+ setSortBy(field);
94
+ setDir(field === 'modified' || field === 'seo' ? 'desc' : 'asc');
95
+ }
96
+ }, [sortBy]);
97
+ const filtersAreActive = debouncedSearch !== '' || status !== 'all' || selectedTags.size > 0;
98
+ const clearFilters = () => {
99
+ setSearch('');
100
+ setStatus('all');
101
+ setSelectedTags(new Set());
102
+ setPage(1);
103
+ };
104
+ const toggleTag = (slug) => setSelectedTags((s) => {
105
+ const next = new Set(s);
106
+ if (next.has(slug))
107
+ next.delete(slug);
108
+ else
109
+ next.add(slug);
110
+ return next;
111
+ });
112
+ // ─── Selection ─────────────────────────────────────────────────────
113
+ const toggleOne = (id) => setSelected((s) => {
114
+ const next = new Set(s);
115
+ if (next.has(id))
116
+ next.delete(id);
117
+ else
118
+ next.add(id);
119
+ return next;
120
+ });
121
+ const allOnPageSelected = pages.length > 0 && pages.every((p) => selected.has(p.id));
122
+ const toggleAllOnPage = (checked) => setSelected((s) => {
123
+ const next = new Set(s);
124
+ if (checked)
125
+ for (const p of pages)
126
+ next.add(p.id);
127
+ else
128
+ for (const p of pages)
129
+ next.delete(p.id);
130
+ return next;
131
+ });
132
+ const selectedPages = useMemo(() => pages.filter((p) => selected.has(p.id)), [pages, selected]);
133
+ const deletablePages = useMemo(() => selectedPages.filter((p) => !p.isHomepage), [selectedPages]);
134
+ const blockedHomepage = selectedPages.length !== deletablePages.length;
135
+ // ─── Bulk actions ──────────────────────────────────────────────────
136
+ const afterBulk = () => {
137
+ setSelected(new Set());
138
+ setRefreshToken((t) => t + 1);
139
+ };
140
+ const runBulkStatus = async (target) => {
141
+ const ids = selectedPages.map((p) => p.id);
142
+ if (ids.length === 0)
143
+ return;
144
+ const verb = target === 'PUBLISHED' ? 'Publishing' : 'Updating';
145
+ const promise = bulkUpdatePages(ids, { status: target });
146
+ toast.promise(promise, {
147
+ loading: `${verb} ${ids.length} page${ids.length === 1 ? '' : 's'}…`,
148
+ success: (r) => `${r.ok} updated${r.failed ? `, ${r.failed} failed` : ''}`,
149
+ error: 'Bulk update failed',
150
+ });
151
+ await promise;
152
+ afterBulk();
153
+ };
154
+ const runBulkTag = async (slug, mode) => {
155
+ if (selectedPages.length === 0)
156
+ return;
157
+ const promise = bulkChangePageTags(selectedPages.map((p) => ({ id: p.id, tags: p.tags, primaryTagId: p.primaryTagId })), mode === 'add' ? { add: [slug] } : { remove: [slug] });
158
+ const tagName = tagBySlug.get(slug)?.name ?? slug;
159
+ toast.promise(promise, {
160
+ loading: `${mode === 'add' ? 'Adding' : 'Removing'} "${tagName}"…`,
161
+ success: (r) => `${r.ok} page${r.ok === 1 ? '' : 's'} updated${r.failed ? `, ${r.failed} failed` : ''}`,
162
+ error: 'Bulk tag change failed',
163
+ });
164
+ await promise;
165
+ afterBulk();
166
+ };
167
+ const runBulkDelete = async () => {
168
+ const ids = deletablePages.map((p) => p.id);
169
+ if (ids.length === 0)
170
+ return;
171
+ const promise = bulkDeletePages(ids);
172
+ toast.promise(promise, {
173
+ loading: `Deleting ${ids.length} page${ids.length === 1 ? '' : 's'}…`,
174
+ success: (r) => `${r.ok} deleted${r.failed ? `, ${r.failed} failed` : ''}`,
175
+ error: 'Bulk delete failed',
176
+ });
177
+ await promise;
178
+ afterBulk();
179
+ };
180
+ // ─── Render ────────────────────────────────────────────────────────
181
+ return (_jsxs("div", { className: "flex h-full flex-col gap-4 p-4 sm:p-6", children: [_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("h1", { className: "text-foreground text-xl font-medium tracking-tight sm:text-2xl", children: "Pages" }), _jsxs("p", { className: "text-muted-foreground text-sm", children: [totalAll, " page", totalAll === 1 ? '' : 's', " \u00B7 organized by tags"] })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs("div", { className: "relative max-w-sm flex-1", children: [_jsx(Search, { className: "text-muted-foreground absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2", "aria-hidden": true }), _jsx("input", { type: "search", value: search, onChange: (e) => setSearch(e.target.value), "aria-label": "Search pages", placeholder: "Search pages\u2026", className: "border-border bg-card text-foreground placeholder:text-muted-foreground focus:border-primary focus:ring-primary/30 w-full rounded-lg border py-2 pr-3 pl-9 text-sm shadow-sm focus:ring-2 focus:outline-none" })] }), _jsx(FilterSelect, { label: "Group by", value: groupBy, onChange: (v) => setGroupBy(v), options: [
182
+ { value: 'none', label: 'None' },
183
+ { value: 'tag', label: 'Tag' },
184
+ { value: 'status', label: 'Status' },
185
+ { value: 'author', label: 'Author' },
186
+ ] }), _jsx(FilterSelect, { label: "Status", value: status, onChange: (v) => {
187
+ setStatus(v);
188
+ setPage(1);
189
+ }, options: [
190
+ { value: 'all', label: 'All statuses' },
191
+ { value: 'PUBLISHED', label: 'Published' },
192
+ { value: 'DRAFT', label: 'Draft' },
193
+ { value: 'SCHEDULED', label: 'Scheduled' },
194
+ ] }), _jsxs("span", { className: "text-muted-foreground ml-auto text-sm tabular-nums", children: [total, " of ", totalAll] })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("span", { className: "text-muted-foreground text-[10px] font-semibold tracking-wider uppercase", children: "Tags" }), tags.map((t) => (_jsx(PageTagChip, { name: t.name, color: t.color, count: t.pageCount, selected: selectedTags.has(t.slug), onToggle: () => toggleTag(t.slug) }, t.slug))), selectedTags.size > 0 && (_jsxs("button", { type: "button", onClick: () => setSelectedTags(new Set()), className: "text-muted-foreground hover:text-foreground inline-flex items-center gap-1 text-xs", children: [_jsx(X, { className: "h-3 w-3", "aria-hidden": true }), "Clear tags"] })), _jsxs("button", { type: "button", onClick: () => onNavigate('/pages/tags'), className: "text-primary ml-auto inline-flex items-center gap-1 text-xs font-medium hover:underline", children: [_jsx(TagIcon, { className: "h-3 w-3", "aria-hidden": true }), "Manage tags"] })] }), selected.size > 0 && (_jsx(BulkActionBar, { count: selected.size, tags: tags, blockedHomepage: blockedHomepage, onClear: () => setSelected(new Set()), onPublish: () => runBulkStatus('PUBLISHED'), onDraft: () => runBulkStatus('DRAFT'), onAddTag: (slug) => runBulkTag(slug, 'add'), onRemoveTag: (slug) => runBulkTag(slug, 'remove'), onDelete: () => setPendingDelete(true), deletableCount: deletablePages.length })), _jsxs("div", { className: "bg-card border-border overflow-hidden rounded-xl border shadow-sm", children: [_jsxs("table", { className: "w-full table-fixed", role: "table", "aria-label": "Pages", children: [_jsxs("colgroup", { children: [_jsx("col", { style: { width: '40px' } }), _jsx("col", {}), _jsx("col", { style: { width: '200px' } }), _jsx("col", { style: { width: '170px' } }), _jsx("col", { style: { width: '120px' } }), _jsx("col", { style: { width: '130px' } }), _jsx("col", { style: { width: '80px' } })] }), _jsx("thead", { className: "border-border bg-muted/40 border-b", children: _jsxs("tr", { className: "text-muted-foreground text-xs", children: [_jsx("th", { scope: "col", className: "px-3 py-2.5 text-left", children: _jsx("input", { type: "checkbox", "aria-label": "Select all pages on this page", checked: allOnPageSelected, onChange: (e) => toggleAllOnPage(e.target.checked), className: "border-border accent-primary rounded" }) }), _jsx("th", { scope: "col", className: "px-3 py-2.5 text-left", children: _jsx(SortHeader, { label: "Title", field: "title", current: sortBy, dir: dir, onSort: handleSort }) }), _jsx("th", { scope: "col", className: "px-3 py-2.5 text-left", children: _jsx("span", { className: "text-xs font-medium tracking-wider uppercase", children: "Tags" }) }), _jsx("th", { scope: "col", className: "px-3 py-2.5 text-left", children: _jsx(SortHeader, { label: "Author", field: "author", current: sortBy, dir: dir, onSort: handleSort }) }), _jsx("th", { scope: "col", className: "px-3 py-2.5 text-left", children: _jsx(SortHeader, { label: "Status", field: "status", current: sortBy, dir: dir, onSort: handleSort }) }), _jsx("th", { scope: "col", className: "px-3 py-2.5 text-left", children: _jsx(SortHeader, { label: "Last Modified", field: "modified", current: sortBy, dir: dir, onSort: handleSort }) }), _jsx("th", { scope: "col", className: "px-3 py-2.5 text-left", children: _jsx(SortHeader, { label: "SEO", field: "seo", current: sortBy, dir: dir, onSort: handleSort }) })] }) }), _jsxs("tbody", { children: [loading && pages.length === 0 && _jsx(LoadingRows, {}), !loading && error && (_jsx("tr", { children: _jsxs("td", { colSpan: 7, className: "px-3 py-12 text-center", children: [_jsx("div", { className: "text-foreground mb-2 text-sm font-medium", children: error }), _jsx("button", { onClick: () => setRefreshToken((t) => t + 1), className: "text-primary text-sm hover:underline", children: "Try again" })] }) })), !loading && !error && pages.length === 0 && (_jsx(EmptyRow, { filtersActive: filtersAreActive, onClear: clearFilters, onNewPage: () => onNavigate('/pages/new') })), !loading &&
195
+ !error &&
196
+ displayGroups.map((group) => (_jsx(GroupBlock, { showHeader: grouped, label: group.label, color: group.color, count: group.pages.length, children: group.pages.map((p) => (_jsx(PageRow, { page: p, selected: selected.has(p.id), resolveTag: (slug) => tagBySlug.get(slug), onSelect: () => toggleOne(p.id), onOpen: () => onNavigate(`/pages/${p.id}/edit`) }, p.id))) }, group.key)))] })] }), !grouped && (_jsx(PaginationFooter, { page: page, totalPages: totalPages, total: total, pageSize: PAGE_SIZE, onPage: setPage }))] }), _jsx(ConfirmDialog, { open: pendingDelete, title: `Delete ${deletablePages.length} page${deletablePages.length === 1 ? '' : 's'}?`, description: blockedHomepage
197
+ ? 'The homepage cannot be deleted and will be skipped. The remaining pages move to trash and can be restored for 30 days.'
198
+ : 'The selected pages move to trash and can be restored for 30 days.', confirmLabel: "Delete", destructive: true, onClose: () => setPendingDelete(false), onConfirm: () => {
199
+ void runBulkDelete();
200
+ } })] }));
201
+ }
202
+ // ─── Sub-components ──────────────────────────────────────────────────
203
+ function SortHeader({ label, field, current, dir, onSort, }) {
204
+ const active = current === field;
205
+ const ariaSort = active ? (dir === 'asc' ? 'ascending' : 'descending') : 'none';
206
+ return (_jsxs("button", { type: "button", onClick: () => onSort(field), "aria-sort": ariaSort, className: `hover:text-foreground inline-flex items-center gap-1 text-xs font-medium tracking-wider uppercase transition-colors ${active ? 'text-foreground' : 'text-muted-foreground'}`, children: [_jsx("span", { children: label }), active &&
207
+ (dir === 'asc' ? (_jsx(ChevronUp, { className: "h-3 w-3", "aria-hidden": true })) : (_jsx(ChevronDown, { className: "h-3 w-3", "aria-hidden": true })))] }));
208
+ }
209
+ function FilterSelect({ label, value, onChange, options, }) {
210
+ return (_jsxs("label", { className: "text-foreground inline-flex items-center gap-1.5 text-sm", children: [_jsxs("span", { className: "text-muted-foreground", children: [label, ":"] }), _jsx("select", { value: value, onChange: (e) => onChange(e.target.value), className: "border-border bg-card text-foreground focus:border-primary focus:ring-primary/30 rounded-lg border px-2.5 py-1.5 text-sm shadow-sm focus:ring-2 focus:outline-none", children: options.map((o) => (_jsx("option", { value: o.value, children: o.label }, o.value))) })] }));
211
+ }
212
+ function GroupBlock({ showHeader, label, color, count, children, }) {
213
+ return (_jsxs(_Fragment, { children: [showHeader && (_jsx("tr", { className: "bg-muted/30 border-border border-b", children: _jsx("td", { colSpan: 7, className: "px-3 py-2", children: _jsxs("span", { className: "text-foreground inline-flex items-center gap-2 text-xs font-semibold tracking-wider uppercase", children: [color && _jsx("span", { "aria-hidden": true, className: `h-2 w-2 rounded-full ${dotFor(color)}` }), label, _jsx("span", { className: "text-muted-foreground tabular-nums", children: count })] }) }) })), children] }));
214
+ }
215
+ function dotFor(color) {
216
+ const map = {
217
+ purple: 'bg-violet-500',
218
+ green: 'bg-emerald-500',
219
+ orange: 'bg-amber-500',
220
+ red: 'bg-red-500',
221
+ blue: 'bg-blue-500',
222
+ pink: 'bg-pink-500',
223
+ };
224
+ return map[color] ?? 'bg-muted-foreground';
225
+ }
226
+ function BulkActionBar({ count, tags, blockedHomepage, deletableCount, onClear, onPublish, onDraft, onAddTag, onRemoveTag, onDelete, }) {
227
+ return (_jsxs("div", { className: "border-primary/30 bg-primary/5 flex flex-wrap items-center gap-2 rounded-lg border px-4 py-2", children: [_jsxs("span", { className: "text-foreground text-sm font-medium", children: [count, " selected"] }), _jsx("div", { className: "bg-border h-4 w-px", "aria-hidden": true }), _jsx("button", { type: "button", onClick: onPublish, className: "text-foreground hover:bg-accent rounded-md px-2 py-1 text-sm transition-colors", children: "Publish" }), _jsx("button", { type: "button", onClick: onDraft, className: "text-foreground hover:bg-accent rounded-md px-2 py-1 text-sm transition-colors", children: "Move to draft" }), _jsx(TagMenu, { label: "Add tag", tags: tags, onPick: onAddTag }), _jsx(TagMenu, { label: "Remove tag", tags: tags, onPick: onRemoveTag }), _jsxs("button", { type: "button", onClick: onDelete, disabled: deletableCount === 0, title: blockedHomepage ? 'The homepage is excluded from deletion' : undefined, className: "text-destructive hover:bg-destructive/10 inline-flex items-center gap-1 rounded-md px-2 py-1 text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-40", children: [_jsx(Trash2, { className: "h-3.5 w-3.5", "aria-hidden": true }), "Delete"] }), _jsxs("button", { type: "button", onClick: onClear, className: "text-muted-foreground hover:text-foreground ml-auto inline-flex items-center gap-1 rounded-md px-2 py-1 text-sm transition-colors", children: [_jsx(X, { className: "h-3.5 w-3.5", "aria-hidden": true }), "Clear"] })] }));
228
+ }
229
+ function TagMenu({ label, tags, onPick, }) {
230
+ const [open, setOpen] = useState(false);
231
+ const ref = useRef(null);
232
+ useEffect(() => {
233
+ if (!open)
234
+ return;
235
+ const onDoc = (e) => {
236
+ if (ref.current && !ref.current.contains(e.target))
237
+ setOpen(false);
238
+ };
239
+ document.addEventListener('mousedown', onDoc);
240
+ return () => document.removeEventListener('mousedown', onDoc);
241
+ }, [open]);
242
+ return (_jsxs("div", { className: "relative", ref: ref, children: [_jsxs("button", { type: "button", onClick: () => setOpen((o) => !o), "aria-haspopup": "menu", "aria-expanded": open, className: "text-foreground hover:bg-accent inline-flex items-center gap-1 rounded-md px-2 py-1 text-sm transition-colors", children: [label, _jsx(ChevronDown, { className: "h-3 w-3", "aria-hidden": true })] }), open && (_jsxs("div", { role: "menu", className: "border-border bg-popover absolute z-20 mt-1 max-h-64 w-44 overflow-auto rounded-lg border p-1 shadow-lg", children: [tags.length === 0 && (_jsx("div", { className: "text-muted-foreground px-2 py-1.5 text-xs", children: "No tags yet" })), tags.map((t) => (_jsxs("button", { type: "button", role: "menuitem", onClick: () => {
243
+ onPick(t.slug);
244
+ setOpen(false);
245
+ }, className: "text-foreground hover:bg-accent flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm", children: [_jsx("span", { "aria-hidden": true, className: `h-2 w-2 rounded-full ${dotFor(t.color ?? 'gray')}` }), t.name] }, t.slug)))] }))] }));
246
+ }
247
+ function PageRow({ page, selected, resolveTag, onSelect, onOpen, }) {
248
+ return (_jsxs("tr", { className: `border-border hover:bg-muted/30 group border-b transition-colors last:border-b-0 ${selected ? 'bg-primary/5' : ''}`, children: [_jsx("td", { className: "px-3 py-3", onClick: (e) => e.stopPropagation(), children: _jsx("input", { type: "checkbox", "aria-label": `Select "${page.title}"`, checked: selected, onChange: onSelect, className: "border-border accent-primary rounded" }) }), _jsx("td", { className: "px-3 py-3", children: _jsxs("button", { type: "button", onClick: onOpen, className: "flex w-full items-center gap-3 text-left", children: [_jsx("span", { "aria-hidden": true, className: "bg-muted block h-9 w-9 shrink-0 rounded-md" }), _jsxs("span", { className: "min-w-0", children: [_jsx("span", { className: "text-foreground group-hover:text-primary block truncate text-sm font-medium", children: page.title }), _jsx("span", { className: "text-muted-foreground block truncate text-xs", children: page.path })] })] }) }), _jsx("td", { className: "px-3 py-3", children: _jsx(PageTagsCell, { tagSlugs: page.tags, primaryTagId: page.primaryTagId, resolve: resolveTag }) }), _jsx("td", { className: "px-3 py-3", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { "aria-hidden": true, className: "bg-muted text-muted-foreground inline-flex h-7 w-7 items-center justify-center rounded-full text-[11px] font-semibold", children: page.authorInitials }), _jsx("span", { className: "text-foreground truncate text-sm", children: page.authorName })] }) }), _jsx("td", { className: "px-3 py-3", children: _jsx(PostStatusBadge, { status: page.status }) }), _jsx("td", { className: "text-muted-foreground px-3 py-3 text-sm tabular-nums", children: formatDateShort(page.lastModified) }), _jsx("td", { className: "px-3 py-3", children: _jsx(SeoScoreIndicator, { score: page.seoScore }) })] }));
249
+ }
250
+ function LoadingRows() {
251
+ return (_jsx(_Fragment, { children: Array.from({ length: 8 }).map((_, i) => (_jsx("tr", { className: "border-border border-b last:border-b-0", children: Array.from({ length: 7 }).map((__, j) => (_jsx("td", { className: "px-3 py-3", children: _jsx("div", { className: "bg-muted h-4 w-full animate-pulse rounded" }) }, j))) }, i))) }));
252
+ }
253
+ function EmptyRow({ filtersActive, onClear, onNewPage, }) {
254
+ return (_jsx("tr", { children: _jsxs("td", { colSpan: 7, className: "px-3 py-16 text-center", children: [_jsx("div", { className: "text-foreground mb-2 text-sm font-medium", children: filtersActive ? 'No pages match your filters' : 'No pages yet' }), _jsx("div", { className: "text-muted-foreground mb-4 text-sm", children: filtersActive
255
+ ? 'Try clearing the search, tags, or status filter above.'
256
+ : 'Create your first page to get started.' }), filtersActive ? (_jsx("button", { type: "button", onClick: onClear, className: "text-primary text-sm hover:underline", children: "Clear filters" })) : (_jsxs("button", { type: "button", onClick: onNewPage, className: "bg-primary text-primary-foreground hover:bg-primary/90 inline-flex items-center gap-1.5 rounded-lg px-3.5 py-1.5 text-sm font-medium shadow-sm transition-colors", children: [_jsx(Plus, { className: "h-3.5 w-3.5", "aria-hidden": true }), "New page"] }))] }) }));
257
+ }
258
+ function PaginationFooter({ page, totalPages, total, pageSize, onPage, }) {
259
+ const start = total === 0 ? 0 : (page - 1) * pageSize + 1;
260
+ const end = Math.min(total, page * pageSize);
261
+ return (_jsxs("div", { className: "border-border flex items-center justify-between border-t px-4 py-3 text-sm", children: [_jsxs("span", { className: "text-muted-foreground tabular-nums", children: [start, "\u2013", end, " of ", total, " page", total === 1 ? '' : 's'] }), _jsxs("nav", { className: "flex items-center gap-1", "aria-label": "Pages pagination", children: [_jsx("button", { type: "button", onClick: () => onPage(Math.max(1, page - 1)), disabled: page === 1, "aria-label": "Previous page", className: "border-border bg-background text-foreground hover:bg-accent inline-flex h-8 w-8 items-center justify-center rounded-md border transition-colors disabled:cursor-not-allowed disabled:opacity-40", children: _jsx(ChevronLeft, { className: "h-4 w-4", "aria-hidden": true }) }), pageNumbers(page, totalPages).map((p, idx) => p === '…' ? (_jsx("span", { "aria-hidden": true, className: "text-muted-foreground inline-flex h-8 w-8 items-center justify-center text-sm", children: "\u2026" }, `gap-${idx}`)) : (_jsx("button", { type: "button", onClick: () => onPage(p), "aria-current": p === page ? 'page' : undefined, className: `inline-flex h-8 w-8 items-center justify-center rounded-md text-sm tabular-nums transition-colors ${p === page
262
+ ? 'bg-primary text-primary-foreground'
263
+ : 'border-border bg-background text-foreground hover:bg-accent border'}`, children: p }, p))), _jsx("button", { type: "button", onClick: () => onPage(Math.min(totalPages, page + 1)), disabled: page === totalPages, "aria-label": "Next page", className: "border-border bg-background text-foreground hover:bg-accent inline-flex h-8 w-8 items-center justify-center rounded-md border transition-colors disabled:cursor-not-allowed disabled:opacity-40", children: _jsx(ChevronRight, { className: "h-4 w-4", "aria-hidden": true }) })] })] }));
264
+ }
265
+ // ─── Helpers ─────────────────────────────────────────────────────────
266
+ function formatDateShort(input) {
267
+ const d = new Date(input);
268
+ if (Number.isNaN(d.getTime()))
269
+ return '—';
270
+ return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' });
271
+ }
272
+ export function pageNumbers(current, total) {
273
+ if (total <= 7)
274
+ return Array.from({ length: total }, (_, i) => i + 1);
275
+ const out = [1];
276
+ const start = Math.max(2, current - 1);
277
+ const end = Math.min(total - 1, current + 1);
278
+ if (start > 2)
279
+ out.push('…');
280
+ for (let i = start; i <= end; i++)
281
+ out.push(i);
282
+ if (end < total - 1)
283
+ out.push('…');
284
+ out.push(total);
285
+ return out;
286
+ }
287
+ //# sourceMappingURL=PagesListView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PagesListView.js","sourceRoot":"","sources":["../../../src/views/Pages/PagesListView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Type-picker landing page for "+ New Post".
3
+ *
4
+ * When zero or one post type is configured we'd ordinarily auto-route
5
+ * to the per-collection editor, but the spec calls out always showing
6
+ * a chooser when "+ New Post" is clicked. We keep that behavior so
7
+ * the experience is consistent regardless of how many types exist.
8
+ *
9
+ * Picking a card navigates to the section-based Post editor's new-post
10
+ * route (`/posts/<slug>/new`), which seeds the post from that type's
11
+ * template so the author starts from the type's default layout.
12
+ */
13
+ export declare function NewPostPicker({ onNavigate }: {
14
+ onNavigate: (path: string) => void;
15
+ }): import("react/jsx-runtime").JSX.Element;
16
+ //# sourceMappingURL=NewPostPicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NewPostPicker.d.ts","sourceRoot":"","sources":["../../../src/views/Posts/NewPostPicker.tsx"],"names":[],"mappings":"AAQA;;;;;;;;;;;GAWG;AAEH,wBAAgB,aAAa,CAAC,EAAE,UAAU,EAAE,EAAE;IAAE,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,2CA0GnF"}