@prenta/admin 2.6.1 → 2.8.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 (864) hide show
  1. package/CHANGELOG.md +132 -0
  2. package/design-system/tokens.css +196 -85
  3. package/design-system/tokens.json +310 -85
  4. package/design-system/tokens.scss +163 -44
  5. package/design-system/tokens.tailwind.cjs +64 -1
  6. package/dist/AdminRoot.d.ts.map +1 -1
  7. package/dist/AdminRoot.js +43 -21
  8. package/dist/AdminRoot.js.map +1 -1
  9. package/dist/LoginRoot.d.ts.map +1 -1
  10. package/dist/LoginRoot.js +2 -1
  11. package/dist/LoginRoot.js.map +1 -1
  12. package/dist/__tests__/components/author-avatar.test.js +3 -17
  13. package/dist/__tests__/components/author-avatar.test.js.map +1 -1
  14. package/dist/__tests__/components/notification-bell.test.js +86 -15
  15. package/dist/__tests__/components/notification-bell.test.js.map +1 -1
  16. package/dist/__tests__/components/responsive-tiers.render.test.d.ts +2 -0
  17. package/dist/__tests__/components/responsive-tiers.render.test.d.ts.map +1 -0
  18. package/dist/__tests__/components/responsive-tiers.render.test.js +313 -0
  19. package/dist/__tests__/components/responsive-tiers.render.test.js.map +1 -0
  20. package/dist/__tests__/components/serp-preview.render.test.js +6 -3
  21. package/dist/__tests__/components/serp-preview.render.test.js.map +1 -1
  22. package/dist/__tests__/components/shell-primitives.render.test.d.ts +2 -0
  23. package/dist/__tests__/components/shell-primitives.render.test.d.ts.map +1 -0
  24. package/dist/__tests__/components/shell-primitives.render.test.js +716 -0
  25. package/dist/__tests__/components/shell-primitives.render.test.js.map +1 -0
  26. package/dist/__tests__/components/theme-provider-accent.test.js +49 -7
  27. package/dist/__tests__/components/theme-provider-accent.test.js.map +1 -1
  28. package/dist/__tests__/components/toggle.test.js +10 -3
  29. package/dist/__tests__/components/toggle.test.js.map +1 -1
  30. package/dist/__tests__/components/ui-primitives.test.js +3 -7
  31. package/dist/__tests__/components/ui-primitives.test.js.map +1 -1
  32. package/dist/__tests__/layout/build-nav-items.test.js +1 -1
  33. package/dist/__tests__/layout/build-nav-items.test.js.map +1 -1
  34. package/dist/__tests__/layout/shell-nav.render.test.d.ts +2 -0
  35. package/dist/__tests__/layout/shell-nav.render.test.d.ts.map +1 -0
  36. package/dist/__tests__/layout/shell-nav.render.test.js +736 -0
  37. package/dist/__tests__/layout/shell-nav.render.test.js.map +1 -0
  38. package/dist/__tests__/layout/sidebar-forms-submenu.render.test.js +8 -4
  39. package/dist/__tests__/layout/sidebar-forms-submenu.render.test.js.map +1 -1
  40. package/dist/__tests__/layout/sidebar-groups.render.test.d.ts +2 -0
  41. package/dist/__tests__/layout/sidebar-groups.render.test.d.ts.map +1 -0
  42. package/dist/__tests__/layout/sidebar-groups.render.test.js +56 -0
  43. package/dist/__tests__/layout/sidebar-groups.render.test.js.map +1 -0
  44. package/dist/__tests__/layout/sidebar-menus.render.test.d.ts +2 -0
  45. package/dist/__tests__/layout/sidebar-menus.render.test.d.ts.map +1 -0
  46. package/dist/__tests__/layout/sidebar-menus.render.test.js +82 -0
  47. package/dist/__tests__/layout/sidebar-menus.render.test.js.map +1 -0
  48. package/dist/__tests__/layout/sidebar-plugin-nav.test.js +1 -1
  49. package/dist/__tests__/layout/sidebar-plugin-nav.test.js.map +1 -1
  50. package/dist/__tests__/layout/sidebar-posts.test.js +48 -38
  51. package/dist/__tests__/layout/sidebar-posts.test.js.map +1 -1
  52. package/dist/__tests__/layout/sidebar-submenu.render.test.js +26 -10
  53. package/dist/__tests__/layout/sidebar-submenu.render.test.js.map +1 -1
  54. package/dist/__tests__/layout/topbar.render.test.d.ts +2 -0
  55. package/dist/__tests__/layout/topbar.render.test.d.ts.map +1 -0
  56. package/dist/__tests__/layout/topbar.render.test.js +406 -0
  57. package/dist/__tests__/layout/topbar.render.test.js.map +1 -0
  58. package/dist/__tests__/lib/api.test.js +2 -0
  59. package/dist/__tests__/lib/api.test.js.map +1 -1
  60. package/dist/__tests__/lib/batch-wizard.test.d.ts +2 -0
  61. package/dist/__tests__/lib/batch-wizard.test.d.ts.map +1 -0
  62. package/dist/__tests__/lib/batch-wizard.test.js +144 -0
  63. package/dist/__tests__/lib/batch-wizard.test.js.map +1 -0
  64. package/dist/__tests__/lib/job-drawer.test.d.ts +2 -0
  65. package/dist/__tests__/lib/job-drawer.test.d.ts.map +1 -0
  66. package/dist/__tests__/lib/job-drawer.test.js +395 -0
  67. package/dist/__tests__/lib/job-drawer.test.js.map +1 -0
  68. package/dist/__tests__/lib/job-view.test.d.ts +2 -0
  69. package/dist/__tests__/lib/job-view.test.d.ts.map +1 -0
  70. package/dist/__tests__/lib/job-view.test.js +484 -0
  71. package/dist/__tests__/lib/job-view.test.js.map +1 -0
  72. package/dist/__tests__/lib/jobs-service.test.d.ts +2 -0
  73. package/dist/__tests__/lib/jobs-service.test.d.ts.map +1 -0
  74. package/dist/__tests__/lib/jobs-service.test.js +142 -0
  75. package/dist/__tests__/lib/jobs-service.test.js.map +1 -0
  76. package/dist/__tests__/router/admin-route-order.test.d.ts +2 -0
  77. package/dist/__tests__/router/admin-route-order.test.d.ts.map +1 -0
  78. package/dist/__tests__/router/admin-route-order.test.js +36 -0
  79. package/dist/__tests__/router/admin-route-order.test.js.map +1 -0
  80. package/dist/__tests__/styles/ai-gradient-contrast.test.d.ts +2 -0
  81. package/dist/__tests__/styles/ai-gradient-contrast.test.d.ts.map +1 -0
  82. package/dist/__tests__/styles/ai-gradient-contrast.test.js +110 -0
  83. package/dist/__tests__/styles/ai-gradient-contrast.test.js.map +1 -0
  84. package/dist/__tests__/styles/breakpoint-order.test.d.ts +2 -0
  85. package/dist/__tests__/styles/breakpoint-order.test.d.ts.map +1 -0
  86. package/dist/__tests__/styles/breakpoint-order.test.js +52 -0
  87. package/dist/__tests__/styles/breakpoint-order.test.js.map +1 -0
  88. package/dist/__tests__/styles/responsive-layer.test.js +303 -12
  89. package/dist/__tests__/styles/responsive-layer.test.js.map +1 -1
  90. package/dist/__tests__/styles/tailwind-preset.test.d.ts +2 -0
  91. package/dist/__tests__/styles/tailwind-preset.test.d.ts.map +1 -0
  92. package/dist/__tests__/styles/tailwind-preset.test.js +147 -0
  93. package/dist/__tests__/styles/tailwind-preset.test.js.map +1 -0
  94. package/dist/__tests__/styles/theme-token-scope.test.js +9 -3
  95. package/dist/__tests__/styles/theme-token-scope.test.js.map +1 -1
  96. package/dist/__tests__/styles/tiers.test.d.ts +2 -0
  97. package/dist/__tests__/styles/tiers.test.d.ts.map +1 -0
  98. package/dist/__tests__/styles/tiers.test.js +121 -0
  99. package/dist/__tests__/styles/tiers.test.js.map +1 -0
  100. package/dist/__tests__/styles/tokens-drift.test.js +57 -6
  101. package/dist/__tests__/styles/tokens-drift.test.js.map +1 -1
  102. package/dist/__tests__/views/admin-lazy-route.render.test.js +27 -1
  103. package/dist/__tests__/views/admin-lazy-route.render.test.js.map +1 -1
  104. package/dist/__tests__/views/ai-settings.render.test.js +4 -4
  105. package/dist/__tests__/views/appearance-chrome.render.test.d.ts +2 -0
  106. package/dist/__tests__/views/appearance-chrome.render.test.d.ts.map +1 -0
  107. package/dist/__tests__/views/appearance-chrome.render.test.js +688 -0
  108. package/dist/__tests__/views/appearance-chrome.render.test.js.map +1 -0
  109. package/dist/__tests__/views/appearance-menus-route.render.test.d.ts +2 -0
  110. package/dist/__tests__/views/appearance-menus-route.render.test.d.ts.map +1 -0
  111. package/dist/__tests__/views/appearance-menus-route.render.test.js +50 -0
  112. package/dist/__tests__/views/appearance-menus-route.render.test.js.map +1 -0
  113. package/dist/__tests__/views/appearance-settings.render.test.js +8 -6
  114. package/dist/__tests__/views/appearance-settings.render.test.js.map +1 -1
  115. package/dist/__tests__/views/appearance-theme-provider.render.test.d.ts +2 -0
  116. package/dist/__tests__/views/appearance-theme-provider.render.test.d.ts.map +1 -0
  117. package/dist/__tests__/views/appearance-theme-provider.render.test.js +286 -0
  118. package/dist/__tests__/views/appearance-theme-provider.render.test.js.map +1 -0
  119. package/dist/__tests__/views/dashboard.test.js +37 -0
  120. package/dist/__tests__/views/dashboard.test.js.map +1 -1
  121. package/dist/__tests__/views/document-edit-navigation.render.test.d.ts +2 -0
  122. package/dist/__tests__/views/document-edit-navigation.render.test.d.ts.map +1 -0
  123. package/dist/__tests__/views/document-edit-navigation.render.test.js +101 -0
  124. package/dist/__tests__/views/document-edit-navigation.render.test.js.map +1 -0
  125. package/dist/__tests__/views/document-edit-routes.render.test.d.ts +2 -0
  126. package/dist/__tests__/views/document-edit-routes.render.test.d.ts.map +1 -0
  127. package/dist/__tests__/views/document-edit-routes.render.test.js +113 -0
  128. package/dist/__tests__/views/document-edit-routes.render.test.js.map +1 -0
  129. package/dist/__tests__/views/email-settings.render.test.js +2 -2
  130. package/dist/__tests__/views/form-entries.render.test.js +15 -0
  131. package/dist/__tests__/views/form-entries.render.test.js.map +1 -1
  132. package/dist/__tests__/views/form-submissions.render.test.js +18 -0
  133. package/dist/__tests__/views/form-submissions.render.test.js.map +1 -1
  134. package/dist/__tests__/views/forms-list.render.test.js +12 -0
  135. package/dist/__tests__/views/forms-list.render.test.js.map +1 -1
  136. package/dist/__tests__/views/general-settings.render.test.js +26 -10
  137. package/dist/__tests__/views/general-settings.render.test.js.map +1 -1
  138. package/dist/__tests__/views/header-footer-form.test.d.ts +2 -0
  139. package/dist/__tests__/views/header-footer-form.test.d.ts.map +1 -0
  140. package/dist/__tests__/views/header-footer-form.test.js +266 -0
  141. package/dist/__tests__/views/header-footer-form.test.js.map +1 -0
  142. package/dist/__tests__/views/jobs-drawer.render.test.d.ts +2 -0
  143. package/dist/__tests__/views/jobs-drawer.render.test.d.ts.map +1 -0
  144. package/dist/__tests__/views/jobs-drawer.render.test.js +1348 -0
  145. package/dist/__tests__/views/jobs-drawer.render.test.js.map +1 -0
  146. package/dist/__tests__/views/jobs-list.render.test.d.ts +2 -0
  147. package/dist/__tests__/views/jobs-list.render.test.d.ts.map +1 -0
  148. package/dist/__tests__/views/jobs-list.render.test.js +697 -0
  149. package/dist/__tests__/views/jobs-list.render.test.js.map +1 -0
  150. package/dist/__tests__/views/jobs-wizard.render.test.d.ts +2 -0
  151. package/dist/__tests__/views/jobs-wizard.render.test.d.ts.map +1 -0
  152. package/dist/__tests__/views/jobs-wizard.render.test.js +588 -0
  153. package/dist/__tests__/views/jobs-wizard.render.test.js.map +1 -0
  154. package/dist/__tests__/views/kpi-grid.test.d.ts +2 -0
  155. package/dist/__tests__/views/kpi-grid.test.d.ts.map +1 -0
  156. package/dist/__tests__/views/kpi-grid.test.js +26 -0
  157. package/dist/__tests__/views/kpi-grid.test.js.map +1 -0
  158. package/dist/__tests__/views/post-section-editor.test.js +3 -1
  159. package/dist/__tests__/views/post-section-editor.test.js.map +1 -1
  160. package/dist/__tests__/views/script-tags.render.test.js +25 -0
  161. package/dist/__tests__/views/script-tags.render.test.js.map +1 -1
  162. package/dist/__tests__/views/security-settings.render.test.js +9 -8
  163. package/dist/__tests__/views/security-settings.render.test.js.map +1 -1
  164. package/dist/__tests__/views/seo-settings.render.test.js +7 -7
  165. package/dist/__tests__/views/seo-settings.render.test.js.map +1 -1
  166. package/dist/__tests__/views/settings-save-bar.render.test.d.ts +2 -0
  167. package/dist/__tests__/views/settings-save-bar.render.test.d.ts.map +1 -0
  168. package/dist/__tests__/views/settings-save-bar.render.test.js +68 -0
  169. package/dist/__tests__/views/settings-save-bar.render.test.js.map +1 -0
  170. package/dist/__tests__/views/settings-save-footer.render.test.js +23 -15
  171. package/dist/__tests__/views/settings-save-footer.render.test.js.map +1 -1
  172. package/dist/__tests__/views/settings-tabs.render.test.d.ts +2 -0
  173. package/dist/__tests__/views/settings-tabs.render.test.d.ts.map +1 -0
  174. package/dist/__tests__/views/settings-tabs.render.test.js +319 -0
  175. package/dist/__tests__/views/settings-tabs.render.test.js.map +1 -0
  176. package/dist/__tests__/views/updates-tab.render.test.js +4 -3
  177. package/dist/__tests__/views/updates-tab.render.test.js.map +1 -1
  178. package/dist/components/Breadcrumbs.d.ts +8 -1
  179. package/dist/components/Breadcrumbs.d.ts.map +1 -1
  180. package/dist/components/Breadcrumbs.js +6 -0
  181. package/dist/components/Breadcrumbs.js.map +1 -1
  182. package/dist/components/CommandPalette.d.ts.map +1 -1
  183. package/dist/components/CommandPalette.js +40 -4
  184. package/dist/components/CommandPalette.js.map +1 -1
  185. package/dist/components/LocaleSwitcher.d.ts.map +1 -1
  186. package/dist/components/LocaleSwitcher.js +1 -1
  187. package/dist/components/LocaleSwitcher.js.map +1 -1
  188. package/dist/components/NotificationBell.d.ts.map +1 -1
  189. package/dist/components/NotificationBell.js +44 -3
  190. package/dist/components/NotificationBell.js.map +1 -1
  191. package/dist/components/OfflineStatus.js +1 -1
  192. package/dist/components/OfflineStatus.js.map +1 -1
  193. package/dist/components/PresenceIndicator.d.ts.map +1 -1
  194. package/dist/components/PresenceIndicator.js +2 -1
  195. package/dist/components/PresenceIndicator.js.map +1 -1
  196. package/dist/components/ReflowMeter.js +2 -2
  197. package/dist/components/ReflowMeter.js.map +1 -1
  198. package/dist/components/SEOPanel.js +2 -2
  199. package/dist/components/SEOPanel.js.map +1 -1
  200. package/dist/components/ThemeProvider.d.ts +24 -4
  201. package/dist/components/ThemeProvider.d.ts.map +1 -1
  202. package/dist/components/ThemeProvider.js +80 -22
  203. package/dist/components/ThemeProvider.js.map +1 -1
  204. package/dist/components/TipTapEditor.d.ts.map +1 -1
  205. package/dist/components/TipTapEditor.js +3 -4
  206. package/dist/components/TipTapEditor.js.map +1 -1
  207. package/dist/components/forms/EmbedPanel.js +1 -1
  208. package/dist/components/forms/EmbedPanel.js.map +1 -1
  209. package/dist/components/forms/FormEntryDetailPane.js +6 -1
  210. package/dist/components/forms/FormEntryDetailPane.js.map +1 -1
  211. package/dist/components/forms/ShortcodeGlossary.d.ts.map +1 -1
  212. package/dist/components/forms/ShortcodeGlossary.js +6 -1
  213. package/dist/components/forms/ShortcodeGlossary.js.map +1 -1
  214. package/dist/components/forms/primitives.d.ts +15 -5
  215. package/dist/components/forms/primitives.d.ts.map +1 -1
  216. package/dist/components/forms/primitives.js +11 -11
  217. package/dist/components/forms/primitives.js.map +1 -1
  218. package/dist/components/pages/tag-badges.d.ts +2 -1
  219. package/dist/components/pages/tag-badges.d.ts.map +1 -1
  220. package/dist/components/pages/tag-badges.js +4 -3
  221. package/dist/components/pages/tag-badges.js.map +1 -1
  222. package/dist/components/seo/PageAuditPanel.js +2 -2
  223. package/dist/components/seo/PageAuditPanel.js.map +1 -1
  224. package/dist/components/seo/SerpPreview.d.ts +4 -4
  225. package/dist/components/seo/SerpPreview.js +1 -1
  226. package/dist/components/seo/SerpPreview.js.map +1 -1
  227. package/dist/components/seo/primitives.js +2 -2
  228. package/dist/components/seo/primitives.js.map +1 -1
  229. package/dist/components/ui/AuthorAvatar.d.ts +4 -4
  230. package/dist/components/ui/AuthorAvatar.d.ts.map +1 -1
  231. package/dist/components/ui/AuthorAvatar.js +11 -10
  232. package/dist/components/ui/AuthorAvatar.js.map +1 -1
  233. package/dist/components/ui/Badge.d.ts +1 -1
  234. package/dist/components/ui/Badge.js +1 -1
  235. package/dist/components/ui/Badge.js.map +1 -1
  236. package/dist/components/ui/Breadcrumb.d.ts +27 -0
  237. package/dist/components/ui/Breadcrumb.d.ts.map +1 -0
  238. package/dist/components/ui/Breadcrumb.js +41 -0
  239. package/dist/components/ui/Breadcrumb.js.map +1 -0
  240. package/dist/components/ui/Button.d.ts +2 -2
  241. package/dist/components/ui/Button.d.ts.map +1 -1
  242. package/dist/components/ui/Button.js +31 -16
  243. package/dist/components/ui/Button.js.map +1 -1
  244. package/dist/components/ui/Card.d.ts +8 -4
  245. package/dist/components/ui/Card.d.ts.map +1 -1
  246. package/dist/components/ui/Card.js +21 -13
  247. package/dist/components/ui/Card.js.map +1 -1
  248. package/dist/components/ui/CardListControls.d.ts +34 -0
  249. package/dist/components/ui/CardListControls.d.ts.map +1 -0
  250. package/dist/components/ui/CardListControls.js +25 -0
  251. package/dist/components/ui/CardListControls.js.map +1 -0
  252. package/dist/components/ui/CountChip.d.ts +20 -0
  253. package/dist/components/ui/CountChip.d.ts.map +1 -0
  254. package/dist/components/ui/CountChip.js +48 -0
  255. package/dist/components/ui/CountChip.js.map +1 -0
  256. package/dist/components/ui/FilterPill.d.ts +2 -1
  257. package/dist/components/ui/FilterPill.d.ts.map +1 -1
  258. package/dist/components/ui/FilterPill.js +3 -2
  259. package/dist/components/ui/FilterPill.js.map +1 -1
  260. package/dist/components/ui/Input.d.ts +1 -1
  261. package/dist/components/ui/InspectorPane.d.ts +1 -1
  262. package/dist/components/ui/InspectorPane.d.ts.map +1 -1
  263. package/dist/components/ui/InspectorPane.js +15 -4
  264. package/dist/components/ui/InspectorPane.js.map +1 -1
  265. package/dist/components/ui/Modal.d.ts.map +1 -1
  266. package/dist/components/ui/Modal.js +10 -2
  267. package/dist/components/ui/Modal.js.map +1 -1
  268. package/dist/components/ui/PageHeader.d.ts +28 -0
  269. package/dist/components/ui/PageHeader.d.ts.map +1 -0
  270. package/dist/components/ui/PageHeader.js +18 -0
  271. package/dist/components/ui/PageHeader.js.map +1 -0
  272. package/dist/components/ui/RowActions.d.ts +5 -0
  273. package/dist/components/ui/RowActions.d.ts.map +1 -1
  274. package/dist/components/ui/RowActions.js +7 -2
  275. package/dist/components/ui/RowActions.js.map +1 -1
  276. package/dist/components/ui/Segmented.d.ts +21 -0
  277. package/dist/components/ui/Segmented.d.ts.map +1 -0
  278. package/dist/components/ui/Segmented.js +41 -0
  279. package/dist/components/ui/Segmented.js.map +1 -0
  280. package/dist/components/ui/Toaster.d.ts +12 -0
  281. package/dist/components/ui/Toaster.d.ts.map +1 -0
  282. package/dist/components/ui/Toaster.js +103 -0
  283. package/dist/components/ui/Toaster.js.map +1 -0
  284. package/dist/components/ui/Toggle.d.ts +4 -3
  285. package/dist/components/ui/Toggle.d.ts.map +1 -1
  286. package/dist/components/ui/Toggle.js +16 -12
  287. package/dist/components/ui/Toggle.js.map +1 -1
  288. package/dist/components/ui/UnderlineTabs.d.ts +56 -0
  289. package/dist/components/ui/UnderlineTabs.d.ts.map +1 -0
  290. package/dist/components/ui/UnderlineTabs.js +205 -0
  291. package/dist/components/ui/UnderlineTabs.js.map +1 -0
  292. package/dist/components/ui/UnsavedBar.d.ts +25 -0
  293. package/dist/components/ui/UnsavedBar.d.ts.map +1 -0
  294. package/dist/components/ui/UnsavedBar.js +22 -0
  295. package/dist/components/ui/UnsavedBar.js.map +1 -0
  296. package/dist/components/ui/admin-links.d.ts +11 -0
  297. package/dist/components/ui/admin-links.d.ts.map +1 -0
  298. package/dist/components/ui/admin-links.js +10 -0
  299. package/dist/components/ui/admin-links.js.map +1 -0
  300. package/dist/components/ui/card-table.d.ts +43 -0
  301. package/dist/components/ui/card-table.d.ts.map +1 -0
  302. package/dist/components/ui/card-table.js +31 -0
  303. package/dist/components/ui/card-table.js.map +1 -0
  304. package/dist/components/virtual-window.d.ts +7 -0
  305. package/dist/components/virtual-window.d.ts.map +1 -1
  306. package/dist/components/virtual-window.js +5 -2
  307. package/dist/components/virtual-window.js.map +1 -1
  308. package/dist/fields/RelationshipField.js +1 -1
  309. package/dist/fields/RelationshipField.js.map +1 -1
  310. package/dist/files/dm-mono-latin-400-normal.woff +0 -0
  311. package/dist/files/dm-mono-latin-400-normal.woff2 +0 -0
  312. package/dist/files/dm-mono-latin-500-normal.woff +0 -0
  313. package/dist/files/dm-mono-latin-500-normal.woff2 +0 -0
  314. package/dist/files/dm-mono-latin-ext-400-normal.woff +0 -0
  315. package/dist/files/dm-mono-latin-ext-400-normal.woff2 +0 -0
  316. package/dist/files/dm-mono-latin-ext-500-normal.woff +0 -0
  317. package/dist/files/dm-mono-latin-ext-500-normal.woff2 +0 -0
  318. package/dist/files/dm-sans-latin-400-normal.woff +0 -0
  319. package/dist/files/dm-sans-latin-400-normal.woff2 +0 -0
  320. package/dist/files/dm-sans-latin-500-normal.woff +0 -0
  321. package/dist/files/dm-sans-latin-500-normal.woff2 +0 -0
  322. package/dist/files/dm-sans-latin-600-normal.woff +0 -0
  323. package/dist/files/dm-sans-latin-600-normal.woff2 +0 -0
  324. package/dist/files/dm-sans-latin-700-normal.woff +0 -0
  325. package/dist/files/dm-sans-latin-700-normal.woff2 +0 -0
  326. package/dist/files/dm-sans-latin-ext-400-normal.woff +0 -0
  327. package/dist/files/dm-sans-latin-ext-400-normal.woff2 +0 -0
  328. package/dist/files/dm-sans-latin-ext-500-normal.woff +0 -0
  329. package/dist/files/dm-sans-latin-ext-500-normal.woff2 +0 -0
  330. package/dist/files/dm-sans-latin-ext-600-normal.woff +0 -0
  331. package/dist/files/dm-sans-latin-ext-600-normal.woff2 +0 -0
  332. package/dist/files/dm-sans-latin-ext-700-normal.woff +0 -0
  333. package/dist/files/dm-sans-latin-ext-700-normal.woff2 +0 -0
  334. package/dist/hooks/useAppearanceBootstrap.d.ts.map +1 -1
  335. package/dist/hooks/useAppearanceBootstrap.js +9 -3
  336. package/dist/hooks/useAppearanceBootstrap.js.map +1 -1
  337. package/dist/index.d.ts +15 -0
  338. package/dist/index.d.ts.map +1 -1
  339. package/dist/index.js +8 -0
  340. package/dist/index.js.map +1 -1
  341. package/dist/layout/Header.d.ts +14 -5
  342. package/dist/layout/Header.d.ts.map +1 -1
  343. package/dist/layout/Header.js +78 -13
  344. package/dist/layout/Header.js.map +1 -1
  345. package/dist/layout/Layout.d.ts +5 -3
  346. package/dist/layout/Layout.d.ts.map +1 -1
  347. package/dist/layout/Layout.js +45 -54
  348. package/dist/layout/Layout.js.map +1 -1
  349. package/dist/layout/MobileTabBar.d.ts +20 -0
  350. package/dist/layout/MobileTabBar.d.ts.map +1 -0
  351. package/dist/layout/MobileTabBar.js +29 -0
  352. package/dist/layout/MobileTabBar.js.map +1 -0
  353. package/dist/layout/Sidebar.d.ts +8 -26
  354. package/dist/layout/Sidebar.d.ts.map +1 -1
  355. package/dist/layout/Sidebar.js +309 -345
  356. package/dist/layout/Sidebar.js.map +1 -1
  357. package/dist/layout/nav-config.d.ts +101 -0
  358. package/dist/layout/nav-config.d.ts.map +1 -0
  359. package/dist/layout/nav-config.js +297 -0
  360. package/dist/layout/nav-config.js.map +1 -0
  361. package/dist/layout/primitives/AdminShell.d.ts +10 -2
  362. package/dist/layout/primitives/AdminShell.d.ts.map +1 -1
  363. package/dist/layout/primitives/AdminShell.js +114 -6
  364. package/dist/layout/primitives/AdminShell.js.map +1 -1
  365. package/dist/layout/topbar-classes.d.ts +8 -0
  366. package/dist/layout/topbar-classes.d.ts.map +1 -0
  367. package/dist/layout/topbar-classes.js +8 -0
  368. package/dist/layout/topbar-classes.js.map +1 -0
  369. package/dist/layout/use-nav-items.d.ts +10 -0
  370. package/dist/layout/use-nav-items.d.ts.map +1 -0
  371. package/dist/layout/use-nav-items.js +39 -0
  372. package/dist/layout/use-nav-items.js.map +1 -0
  373. package/dist/lib/api.d.ts +8 -0
  374. package/dist/lib/api.d.ts.map +1 -1
  375. package/dist/lib/api.js +8 -1
  376. package/dist/lib/api.js.map +1 -1
  377. package/dist/lib/appearance-api.d.ts +3 -1
  378. package/dist/lib/appearance-api.d.ts.map +1 -1
  379. package/dist/lib/appearance-api.js +1 -0
  380. package/dist/lib/appearance-api.js.map +1 -1
  381. package/dist/lib/batch-wizard.d.ts +84 -0
  382. package/dist/lib/batch-wizard.d.ts.map +1 -0
  383. package/dist/lib/batch-wizard.js +122 -0
  384. package/dist/lib/batch-wizard.js.map +1 -0
  385. package/dist/lib/chrome-service.d.ts +69 -0
  386. package/dist/lib/chrome-service.d.ts.map +1 -0
  387. package/dist/lib/chrome-service.js +108 -0
  388. package/dist/lib/chrome-service.js.map +1 -0
  389. package/dist/lib/job-drawer.d.ts +128 -0
  390. package/dist/lib/job-drawer.d.ts.map +1 -0
  391. package/dist/lib/job-drawer.js +351 -0
  392. package/dist/lib/job-drawer.js.map +1 -0
  393. package/dist/lib/job-view.d.ts +230 -0
  394. package/dist/lib/job-view.d.ts.map +1 -0
  395. package/dist/lib/job-view.js +419 -0
  396. package/dist/lib/job-view.js.map +1 -0
  397. package/dist/lib/jobs-service.d.ts +152 -0
  398. package/dist/lib/jobs-service.d.ts.map +1 -0
  399. package/dist/lib/jobs-service.js +220 -0
  400. package/dist/lib/jobs-service.js.map +1 -0
  401. package/dist/lib/sheet-focus.d.ts +24 -0
  402. package/dist/lib/sheet-focus.d.ts.map +1 -0
  403. package/dist/lib/sheet-focus.js +61 -0
  404. package/dist/lib/sheet-focus.js.map +1 -0
  405. package/dist/lib/tiers.d.ts +30 -0
  406. package/dist/lib/tiers.d.ts.map +1 -0
  407. package/dist/lib/tiers.js +43 -0
  408. package/dist/lib/tiers.js.map +1 -0
  409. package/dist/prenta-admin.css +1 -1
  410. package/dist/router/admin-routes.d.ts.map +1 -1
  411. package/dist/router/admin-routes.js +8 -0
  412. package/dist/router/admin-routes.js.map +1 -1
  413. package/dist/router/index.d.ts +5 -1
  414. package/dist/router/index.d.ts.map +1 -1
  415. package/dist/router/index.js +7 -0
  416. package/dist/router/index.js.map +1 -1
  417. package/dist/views/ApiKeys.js +2 -2
  418. package/dist/views/ApiKeys.js.map +1 -1
  419. package/dist/views/AppearanceChrome.d.ts +24 -0
  420. package/dist/views/AppearanceChrome.d.ts.map +1 -0
  421. package/dist/views/AppearanceChrome.js +461 -0
  422. package/dist/views/AppearanceChrome.js.map +1 -0
  423. package/dist/views/CollectionList.d.ts.map +1 -1
  424. package/dist/views/CollectionList.js +73 -53
  425. package/dist/views/CollectionList.js.map +1 -1
  426. package/dist/views/Dashboard.d.ts.map +1 -1
  427. package/dist/views/Dashboard.js +14 -8
  428. package/dist/views/Dashboard.js.map +1 -1
  429. package/dist/views/DocumentEdit.d.ts +6 -1
  430. package/dist/views/DocumentEdit.d.ts.map +1 -1
  431. package/dist/views/DocumentEdit.js +44 -8
  432. package/dist/views/DocumentEdit.js.map +1 -1
  433. package/dist/views/FormDeliveries.d.ts.map +1 -1
  434. package/dist/views/FormDeliveries.js +7 -1
  435. package/dist/views/FormDeliveries.js.map +1 -1
  436. package/dist/views/FormEntries.d.ts.map +1 -1
  437. package/dist/views/FormEntries.js +11 -2
  438. package/dist/views/FormEntries.js.map +1 -1
  439. package/dist/views/FormSubmissions.d.ts +1 -1
  440. package/dist/views/FormSubmissions.d.ts.map +1 -1
  441. package/dist/views/FormSubmissions.js +15 -4
  442. package/dist/views/FormSubmissions.js.map +1 -1
  443. package/dist/views/Forms.d.ts.map +1 -1
  444. package/dist/views/Forms.js +6 -4
  445. package/dist/views/Forms.js.map +1 -1
  446. package/dist/views/FormsSettings.d.ts +2 -0
  447. package/dist/views/FormsSettings.d.ts.map +1 -0
  448. package/dist/views/FormsSettings.js +37 -0
  449. package/dist/views/FormsSettings.js.map +1 -0
  450. package/dist/views/Jobs/BusyButton.d.ts +15 -0
  451. package/dist/views/Jobs/BusyButton.d.ts.map +1 -0
  452. package/dist/views/Jobs/BusyButton.js +26 -0
  453. package/dist/views/Jobs/BusyButton.js.map +1 -0
  454. package/dist/views/Jobs/CancelJobDialog.d.ts +27 -0
  455. package/dist/views/Jobs/CancelJobDialog.d.ts.map +1 -0
  456. package/dist/views/Jobs/CancelJobDialog.js +76 -0
  457. package/dist/views/Jobs/CancelJobDialog.js.map +1 -0
  458. package/dist/views/Jobs/DrawerActivity.d.ts +16 -0
  459. package/dist/views/Jobs/DrawerActivity.d.ts.map +1 -0
  460. package/dist/views/Jobs/DrawerActivity.js +59 -0
  461. package/dist/views/Jobs/DrawerActivity.js.map +1 -0
  462. package/dist/views/Jobs/DrawerOverview.d.ts +28 -0
  463. package/dist/views/Jobs/DrawerOverview.d.ts.map +1 -0
  464. package/dist/views/Jobs/DrawerOverview.js +32 -0
  465. package/dist/views/Jobs/DrawerOverview.js.map +1 -0
  466. package/dist/views/Jobs/DrawerResults.d.ts +25 -0
  467. package/dist/views/Jobs/DrawerResults.d.ts.map +1 -0
  468. package/dist/views/Jobs/DrawerResults.js +50 -0
  469. package/dist/views/Jobs/DrawerResults.js.map +1 -0
  470. package/dist/views/Jobs/DrawerReview.d.ts +51 -0
  471. package/dist/views/Jobs/DrawerReview.d.ts.map +1 -0
  472. package/dist/views/Jobs/DrawerReview.js +110 -0
  473. package/dist/views/Jobs/DrawerReview.js.map +1 -0
  474. package/dist/views/Jobs/JobDrawer.d.ts +51 -0
  475. package/dist/views/Jobs/JobDrawer.d.ts.map +1 -0
  476. package/dist/views/Jobs/JobDrawer.js +378 -0
  477. package/dist/views/Jobs/JobDrawer.js.map +1 -0
  478. package/dist/views/Jobs/JobsTable.d.ts +21 -0
  479. package/dist/views/Jobs/JobsTable.d.ts.map +1 -0
  480. package/dist/views/Jobs/JobsTable.js +81 -0
  481. package/dist/views/Jobs/JobsTable.js.map +1 -0
  482. package/dist/views/Jobs/NewBatchJob.d.ts +34 -0
  483. package/dist/views/Jobs/NewBatchJob.d.ts.map +1 -0
  484. package/dist/views/Jobs/NewBatchJob.js +282 -0
  485. package/dist/views/Jobs/NewBatchJob.js.map +1 -0
  486. package/dist/views/Jobs/WorkerStrip.d.ts +24 -0
  487. package/dist/views/Jobs/WorkerStrip.d.ts.map +1 -0
  488. package/dist/views/Jobs/WorkerStrip.js +63 -0
  489. package/dist/views/Jobs/WorkerStrip.js.map +1 -0
  490. package/dist/views/Jobs/atoms.d.ts +19 -0
  491. package/dist/views/Jobs/atoms.d.ts.map +1 -0
  492. package/dist/views/Jobs/atoms.js +52 -0
  493. package/dist/views/Jobs/atoms.js.map +1 -0
  494. package/dist/views/Jobs/focus.d.ts +29 -0
  495. package/dist/views/Jobs/focus.d.ts.map +1 -0
  496. package/dist/views/Jobs/focus.js +64 -0
  497. package/dist/views/Jobs/focus.js.map +1 -0
  498. package/dist/views/Jobs/icons.d.ts +22 -0
  499. package/dist/views/Jobs/icons.d.ts.map +1 -0
  500. package/dist/views/Jobs/icons.js +23 -0
  501. package/dist/views/Jobs/icons.js.map +1 -0
  502. package/dist/views/Jobs/useJobDetail.d.ts +21 -0
  503. package/dist/views/Jobs/useJobDetail.d.ts.map +1 -0
  504. package/dist/views/Jobs/useJobDetail.js +39 -0
  505. package/dist/views/Jobs/useJobDetail.js.map +1 -0
  506. package/dist/views/Jobs/useJobsFeed.d.ts +35 -0
  507. package/dist/views/Jobs/useJobsFeed.d.ts.map +1 -0
  508. package/dist/views/Jobs/useJobsFeed.js +231 -0
  509. package/dist/views/Jobs/useJobsFeed.js.map +1 -0
  510. package/dist/views/Jobs/useReviewItems.d.ts +39 -0
  511. package/dist/views/Jobs/useReviewItems.d.ts.map +1 -0
  512. package/dist/views/Jobs/useReviewItems.js +140 -0
  513. package/dist/views/Jobs/useReviewItems.js.map +1 -0
  514. package/dist/views/Jobs.d.ts +19 -1
  515. package/dist/views/Jobs.d.ts.map +1 -1
  516. package/dist/views/Jobs.js +204 -35
  517. package/dist/views/Jobs.js.map +1 -1
  518. package/dist/views/MediaBrowser.d.ts.map +1 -1
  519. package/dist/views/MediaBrowser.js +37 -9
  520. package/dist/views/MediaBrowser.js.map +1 -1
  521. package/dist/views/Pages/PagesListView.d.ts +1 -1
  522. package/dist/views/Pages/PagesListView.d.ts.map +1 -1
  523. package/dist/views/Pages/PagesListView.js +34 -5
  524. package/dist/views/Pages/PagesListView.js.map +1 -1
  525. package/dist/views/Posts/NewPostTypeInstructions.d.ts.map +1 -1
  526. package/dist/views/Posts/NewPostTypeInstructions.js +12 -2
  527. package/dist/views/Posts/NewPostTypeInstructions.js.map +1 -1
  528. package/dist/views/Posts/PostTypesView.d.ts.map +1 -1
  529. package/dist/views/Posts/PostTypesView.js +10 -1
  530. package/dist/views/Posts/PostTypesView.js.map +1 -1
  531. package/dist/views/Posts/PostsListView.d.ts +1 -2
  532. package/dist/views/Posts/PostsListView.d.ts.map +1 -1
  533. package/dist/views/Posts/PostsListView.js +31 -3
  534. package/dist/views/Posts/PostsListView.js.map +1 -1
  535. package/dist/views/SEO.d.ts.map +1 -1
  536. package/dist/views/SEO.js +3 -3
  537. package/dist/views/SEO.js.map +1 -1
  538. package/dist/views/ScriptTags.d.ts.map +1 -1
  539. package/dist/views/ScriptTags.js +20 -15
  540. package/dist/views/ScriptTags.js.map +1 -1
  541. package/dist/views/Settings.d.ts.map +1 -1
  542. package/dist/views/Settings.js +115 -51
  543. package/dist/views/Settings.js.map +1 -1
  544. package/dist/views/SpamFolder.d.ts +2 -0
  545. package/dist/views/SpamFolder.d.ts.map +1 -0
  546. package/dist/views/SpamFolder.js +14 -0
  547. package/dist/views/SpamFolder.js.map +1 -0
  548. package/dist/views/Trash.d.ts +6 -1
  549. package/dist/views/Trash.d.ts.map +1 -1
  550. package/dist/views/Trash.js +7 -2
  551. package/dist/views/Trash.js.map +1 -1
  552. package/dist/views/Users.js +2 -2
  553. package/dist/views/Users.js.map +1 -1
  554. package/dist/views/WidgetsPlaceholder.d.ts +2 -0
  555. package/dist/views/WidgetsPlaceholder.d.ts.map +1 -0
  556. package/dist/views/WidgetsPlaceholder.js +15 -0
  557. package/dist/views/WidgetsPlaceholder.js.map +1 -0
  558. package/dist/views/dashboard/kpi-grid.d.ts +18 -0
  559. package/dist/views/dashboard/kpi-grid.d.ts.map +1 -0
  560. package/dist/views/dashboard/kpi-grid.js +36 -0
  561. package/dist/views/dashboard/kpi-grid.js.map +1 -0
  562. package/dist/views/header-footer/AnnouncementTab.d.ts +15 -0
  563. package/dist/views/header-footer/AnnouncementTab.d.ts.map +1 -0
  564. package/dist/views/header-footer/AnnouncementTab.js +43 -0
  565. package/dist/views/header-footer/AnnouncementTab.js.map +1 -0
  566. package/dist/views/header-footer/ChromeField.d.ts +25 -0
  567. package/dist/views/header-footer/ChromeField.d.ts.map +1 -0
  568. package/dist/views/header-footer/ChromeField.js +99 -0
  569. package/dist/views/header-footer/ChromeField.js.map +1 -0
  570. package/dist/views/header-footer/ChromePreview.d.ts +31 -0
  571. package/dist/views/header-footer/ChromePreview.d.ts.map +1 -0
  572. package/dist/views/header-footer/ChromePreview.js +195 -0
  573. package/dist/views/header-footer/ChromePreview.js.map +1 -0
  574. package/dist/views/header-footer/DeveloperTab.d.ts +17 -0
  575. package/dist/views/header-footer/DeveloperTab.d.ts.map +1 -0
  576. package/dist/views/header-footer/DeveloperTab.js +98 -0
  577. package/dist/views/header-footer/DeveloperTab.js.map +1 -0
  578. package/dist/views/header-footer/RegionTab.d.ts +27 -0
  579. package/dist/views/header-footer/RegionTab.d.ts.map +1 -0
  580. package/dist/views/header-footer/RegionTab.js +80 -0
  581. package/dist/views/header-footer/RegionTab.js.map +1 -0
  582. package/dist/views/header-footer/chrome-form.d.ts +137 -0
  583. package/dist/views/header-footer/chrome-form.d.ts.map +1 -0
  584. package/dist/views/header-footer/chrome-form.js +518 -0
  585. package/dist/views/header-footer/chrome-form.js.map +1 -0
  586. package/dist/views/header-footer/code-samples.d.ts +30 -0
  587. package/dist/views/header-footer/code-samples.d.ts.map +1 -0
  588. package/dist/views/header-footer/code-samples.js +127 -0
  589. package/dist/views/header-footer/code-samples.js.map +1 -0
  590. package/dist/views/header-footer/controls.d.ts +57 -0
  591. package/dist/views/header-footer/controls.d.ts.map +1 -0
  592. package/dist/views/header-footer/controls.js +43 -0
  593. package/dist/views/header-footer/controls.js.map +1 -0
  594. package/dist/views/lazy-views.d.ts +4 -0
  595. package/dist/views/lazy-views.d.ts.map +1 -1
  596. package/dist/views/lazy-views.js +4 -0
  597. package/dist/views/lazy-views.js.map +1 -1
  598. package/dist/views/page-editor/PageTab.js +1 -1
  599. package/dist/views/page-editor/PageTab.js.map +1 -1
  600. package/dist/views/page-editor/ReviewBar.js +1 -1
  601. package/dist/views/page-editor/ReviewBar.js.map +1 -1
  602. package/dist/views/page-editor/VersionHistoryPanel.js +1 -1
  603. package/dist/views/page-editor/VersionHistoryPanel.js.map +1 -1
  604. package/dist/views/seo/AuditTab.js +1 -1
  605. package/dist/views/seo/AuditTab.js.map +1 -1
  606. package/dist/views/seo/OverviewTab.d.ts.map +1 -1
  607. package/dist/views/seo/OverviewTab.js +2 -2
  608. package/dist/views/seo/OverviewTab.js.map +1 -1
  609. package/dist/views/seo/ProposalsTab.js +1 -1
  610. package/dist/views/seo/ProposalsTab.js.map +1 -1
  611. package/dist/views/settings/AISettingsTab.d.ts.map +1 -1
  612. package/dist/views/settings/AISettingsTab.js +4 -2
  613. package/dist/views/settings/AISettingsTab.js.map +1 -1
  614. package/dist/views/settings/AccessProtectionCard.js +1 -1
  615. package/dist/views/settings/AccessProtectionCard.js.map +1 -1
  616. package/dist/views/settings/AdminThemeCard.d.ts.map +1 -1
  617. package/dist/views/settings/AdminThemeCard.js +63 -15
  618. package/dist/views/settings/AdminThemeCard.js.map +1 -1
  619. package/dist/views/settings/AppearanceTab.d.ts.map +1 -1
  620. package/dist/views/settings/AppearanceTab.js +4 -2
  621. package/dist/views/settings/AppearanceTab.js.map +1 -1
  622. package/dist/views/settings/BrandPreviewCard.js +1 -1
  623. package/dist/views/settings/BrandPreviewCard.js.map +1 -1
  624. package/dist/views/settings/BrandVoiceCard.js +1 -1
  625. package/dist/views/settings/BrandVoiceCard.js.map +1 -1
  626. package/dist/views/settings/EmailSettingsTab.d.ts.map +1 -1
  627. package/dist/views/settings/EmailSettingsTab.js +5 -3
  628. package/dist/views/settings/EmailSettingsTab.js.map +1 -1
  629. package/dist/views/settings/GeneralSettingsTab.d.ts.map +1 -1
  630. package/dist/views/settings/GeneralSettingsTab.js +4 -2
  631. package/dist/views/settings/GeneralSettingsTab.js.map +1 -1
  632. package/dist/views/settings/ProviderConnectionCard.js +1 -1
  633. package/dist/views/settings/ProviderConnectionCard.js.map +1 -1
  634. package/dist/views/settings/SearchDataCard.js +1 -1
  635. package/dist/views/settings/SearchDataCard.js.map +1 -1
  636. package/dist/views/settings/SecurityStatusCard.js +2 -2
  637. package/dist/views/settings/SecurityStatusCard.js.map +1 -1
  638. package/dist/views/settings/SecurityTab.d.ts.map +1 -1
  639. package/dist/views/settings/SecurityTab.js +4 -2
  640. package/dist/views/settings/SecurityTab.js.map +1 -1
  641. package/dist/views/settings/SeoAutopilotCard.js +2 -2
  642. package/dist/views/settings/SeoAutopilotCard.js.map +1 -1
  643. package/dist/views/settings/SeoSettingsTab.d.ts.map +1 -1
  644. package/dist/views/settings/SeoSettingsTab.js +5 -3
  645. package/dist/views/settings/SeoSettingsTab.js.map +1 -1
  646. package/dist/views/settings/SiteIndexStatusCard.js +1 -1
  647. package/dist/views/settings/SiteIndexStatusCard.js.map +1 -1
  648. package/dist/views/settings/SiteThemeCard.js +1 -1
  649. package/dist/views/settings/UpdatesTab.d.ts.map +1 -1
  650. package/dist/views/settings/UpdatesTab.js +6 -5
  651. package/dist/views/settings/UpdatesTab.js.map +1 -1
  652. package/dist/views/settings/components.d.ts +7 -11
  653. package/dist/views/settings/components.d.ts.map +1 -1
  654. package/dist/views/settings/components.js +18 -12
  655. package/dist/views/settings/components.js.map +1 -1
  656. package/dist/views/settings/useAppearanceSettings.d.ts +7 -1
  657. package/dist/views/settings/useAppearanceSettings.d.ts.map +1 -1
  658. package/dist/views/settings/useAppearanceSettings.js +89 -22
  659. package/dist/views/settings/useAppearanceSettings.js.map +1 -1
  660. package/dist/views/users/UserDetailDrawer.js +1 -1
  661. package/dist/views/users/UserDetailDrawer.js.map +1 -1
  662. package/package.json +10 -8
  663. package/src/AdminRoot.tsx +103 -31
  664. package/src/LoginRoot.tsx +2 -1
  665. package/src/__tests__/components/author-avatar.test.tsx +3 -20
  666. package/src/__tests__/components/notification-bell.test.tsx +146 -14
  667. package/src/__tests__/components/responsive-tiers.render.test.tsx +461 -0
  668. package/src/__tests__/components/serp-preview.render.test.tsx +6 -3
  669. package/src/__tests__/components/shell-primitives.render.test.tsx +951 -0
  670. package/src/__tests__/components/theme-provider-accent.test.tsx +83 -8
  671. package/src/__tests__/components/toggle.test.tsx +11 -3
  672. package/src/__tests__/components/ui-primitives.test.tsx +5 -8
  673. package/src/__tests__/layout/build-nav-items.test.ts +1 -1
  674. package/src/__tests__/layout/shell-nav.render.test.tsx +983 -0
  675. package/src/__tests__/layout/sidebar-forms-submenu.render.test.tsx +8 -4
  676. package/src/__tests__/layout/sidebar-groups.render.test.tsx +116 -0
  677. package/src/__tests__/layout/sidebar-menus.render.test.tsx +116 -0
  678. package/src/__tests__/layout/sidebar-plugin-nav.test.ts +1 -1
  679. package/src/__tests__/layout/sidebar-posts.test.ts +48 -40
  680. package/src/__tests__/layout/sidebar-submenu.render.test.tsx +35 -10
  681. package/src/__tests__/layout/topbar.render.test.tsx +464 -0
  682. package/src/__tests__/lib/api.test.ts +2 -0
  683. package/src/__tests__/lib/batch-wizard.test.ts +199 -0
  684. package/src/__tests__/lib/job-drawer.test.ts +495 -0
  685. package/src/__tests__/lib/job-view.test.ts +558 -0
  686. package/src/__tests__/lib/jobs-service.test.ts +167 -0
  687. package/src/__tests__/router/admin-route-order.test.ts +39 -0
  688. package/src/__tests__/styles/ai-gradient-contrast.test.ts +135 -0
  689. package/src/__tests__/styles/breakpoint-order.test.ts +68 -0
  690. package/src/__tests__/styles/responsive-layer.test.ts +367 -12
  691. package/src/__tests__/styles/tailwind-preset.test.ts +154 -0
  692. package/src/__tests__/styles/theme-token-scope.test.ts +10 -3
  693. package/src/__tests__/styles/tiers.test.ts +136 -0
  694. package/src/__tests__/styles/tokens-drift.test.ts +67 -6
  695. package/src/__tests__/views/admin-lazy-route.render.test.tsx +41 -1
  696. package/src/__tests__/views/ai-settings.render.test.tsx +4 -4
  697. package/src/__tests__/views/appearance-chrome.render.test.tsx +818 -0
  698. package/src/__tests__/views/appearance-menus-route.render.test.tsx +58 -0
  699. package/src/__tests__/views/appearance-settings.render.test.tsx +10 -8
  700. package/src/__tests__/views/appearance-theme-provider.render.test.tsx +347 -0
  701. package/src/__tests__/views/dashboard.test.tsx +48 -0
  702. package/src/__tests__/views/document-edit-navigation.render.test.tsx +130 -0
  703. package/src/__tests__/views/document-edit-routes.render.test.tsx +130 -0
  704. package/src/__tests__/views/email-settings.render.test.tsx +2 -2
  705. package/src/__tests__/views/form-entries.render.test.tsx +22 -0
  706. package/src/__tests__/views/form-submissions.render.test.tsx +22 -0
  707. package/src/__tests__/views/forms-list.render.test.tsx +13 -0
  708. package/src/__tests__/views/general-settings.render.test.tsx +38 -11
  709. package/src/__tests__/views/header-footer-form.test.ts +333 -0
  710. package/src/__tests__/views/jobs-drawer.render.test.tsx +1553 -0
  711. package/src/__tests__/views/jobs-list.render.test.tsx +853 -0
  712. package/src/__tests__/views/jobs-wizard.render.test.tsx +707 -0
  713. package/src/__tests__/views/kpi-grid.test.ts +29 -0
  714. package/src/__tests__/views/post-section-editor.test.tsx +5 -1
  715. package/src/__tests__/views/script-tags.render.test.tsx +29 -0
  716. package/src/__tests__/views/security-settings.render.test.tsx +9 -10
  717. package/src/__tests__/views/seo-settings.render.test.tsx +7 -9
  718. package/src/__tests__/views/settings-save-bar.render.test.tsx +91 -0
  719. package/src/__tests__/views/settings-save-footer.render.test.tsx +25 -15
  720. package/src/__tests__/views/settings-tabs.render.test.tsx +371 -0
  721. package/src/__tests__/views/updates-tab.render.test.tsx +4 -3
  722. package/src/components/Breadcrumbs.tsx +7 -1
  723. package/src/components/CommandPalette.tsx +51 -3
  724. package/src/components/LocaleSwitcher.tsx +5 -6
  725. package/src/components/NotificationBell.tsx +74 -18
  726. package/src/components/OfflineStatus.tsx +1 -1
  727. package/src/components/PresenceIndicator.tsx +2 -1
  728. package/src/components/ReflowMeter.tsx +3 -3
  729. package/src/components/SEOPanel.tsx +2 -2
  730. package/src/components/ThemeProvider.tsx +122 -42
  731. package/src/components/TipTapEditor.tsx +3 -4
  732. package/src/components/forms/EmbedPanel.tsx +1 -1
  733. package/src/components/forms/FormEntryDetailPane.tsx +7 -1
  734. package/src/components/forms/ShortcodeGlossary.tsx +7 -1
  735. package/src/components/forms/primitives.tsx +37 -21
  736. package/src/components/pages/tag-badges.tsx +4 -3
  737. package/src/components/seo/PageAuditPanel.tsx +2 -2
  738. package/src/components/seo/SerpPreview.tsx +5 -5
  739. package/src/components/seo/primitives.tsx +2 -2
  740. package/src/components/ui/AuthorAvatar.tsx +11 -10
  741. package/src/components/ui/Badge.tsx +1 -1
  742. package/src/components/ui/Breadcrumb.tsx +109 -0
  743. package/src/components/ui/Button.tsx +40 -15
  744. package/src/components/ui/Card.tsx +35 -32
  745. package/src/components/ui/CardListControls.tsx +90 -0
  746. package/src/components/ui/CountChip.tsx +90 -0
  747. package/src/components/ui/FilterPill.tsx +5 -3
  748. package/src/components/ui/InspectorPane.tsx +21 -7
  749. package/src/components/ui/Modal.tsx +20 -6
  750. package/src/components/ui/PageHeader.tsx +63 -0
  751. package/src/components/ui/RowActions.tsx +7 -2
  752. package/src/components/ui/Segmented.tsx +97 -0
  753. package/src/components/ui/Toaster.tsx +139 -0
  754. package/src/components/ui/Toggle.tsx +18 -14
  755. package/src/components/ui/UnderlineTabs.tsx +373 -0
  756. package/src/components/ui/UnsavedBar.tsx +119 -0
  757. package/src/components/ui/admin-links.tsx +20 -0
  758. package/src/components/ui/card-table.ts +34 -0
  759. package/src/components/virtual-window.tsx +13 -2
  760. package/src/fields/RelationshipField.tsx +1 -1
  761. package/src/hooks/useAppearanceBootstrap.ts +9 -3
  762. package/src/index.ts +19 -0
  763. package/src/layout/Header.tsx +210 -135
  764. package/src/layout/Layout.tsx +61 -108
  765. package/src/layout/MobileTabBar.tsx +92 -0
  766. package/src/layout/Sidebar.tsx +555 -593
  767. package/src/layout/nav-config.tsx +425 -0
  768. package/src/layout/primitives/AdminShell.tsx +154 -6
  769. package/src/layout/topbar-classes.ts +8 -0
  770. package/src/layout/use-nav-items.ts +40 -0
  771. package/src/lib/api.ts +18 -1
  772. package/src/lib/appearance-api.ts +4 -0
  773. package/src/lib/batch-wizard.ts +188 -0
  774. package/src/lib/chrome-service.ts +200 -0
  775. package/src/lib/job-drawer.ts +424 -0
  776. package/src/lib/job-view.ts +550 -0
  777. package/src/lib/jobs-service.ts +345 -0
  778. package/src/lib/sheet-focus.ts +71 -0
  779. package/src/lib/tiers.ts +43 -0
  780. package/src/router/admin-routes.ts +8 -0
  781. package/src/router/index.ts +9 -1
  782. package/src/styles/prenta-tokens.css +280 -82
  783. package/src/styles/responsive.css +460 -22
  784. package/src/styles/theme.css +192 -28
  785. package/src/views/ApiKeys.tsx +2 -2
  786. package/src/views/AppearanceChrome.tsx +732 -0
  787. package/src/views/CollectionList.tsx +264 -205
  788. package/src/views/Dashboard.tsx +26 -13
  789. package/src/views/DocumentEdit.tsx +111 -56
  790. package/src/views/FormDeliveries.tsx +30 -17
  791. package/src/views/FormEntries.tsx +28 -20
  792. package/src/views/FormSubmissions.tsx +32 -34
  793. package/src/views/Forms.tsx +55 -34
  794. package/src/views/FormsSettings.tsx +94 -0
  795. package/src/views/Jobs/BusyButton.tsx +56 -0
  796. package/src/views/Jobs/CancelJobDialog.tsx +145 -0
  797. package/src/views/Jobs/DrawerActivity.tsx +142 -0
  798. package/src/views/Jobs/DrawerOverview.tsx +139 -0
  799. package/src/views/Jobs/DrawerResults.tsx +155 -0
  800. package/src/views/Jobs/DrawerReview.tsx +464 -0
  801. package/src/views/Jobs/JobDrawer.tsx +636 -0
  802. package/src/views/Jobs/JobsTable.tsx +267 -0
  803. package/src/views/Jobs/NewBatchJob.tsx +857 -0
  804. package/src/views/Jobs/WorkerStrip.tsx +149 -0
  805. package/src/views/Jobs/atoms.tsx +93 -0
  806. package/src/views/Jobs/focus.ts +67 -0
  807. package/src/views/Jobs/icons.tsx +111 -0
  808. package/src/views/Jobs/useJobDetail.ts +64 -0
  809. package/src/views/Jobs/useJobsFeed.ts +249 -0
  810. package/src/views/Jobs/useReviewItems.ts +187 -0
  811. package/src/views/Jobs.tsx +396 -105
  812. package/src/views/MediaBrowser.tsx +71 -21
  813. package/src/views/Pages/PagesListView.tsx +115 -39
  814. package/src/views/Posts/NewPostTypeInstructions.tsx +15 -10
  815. package/src/views/Posts/PostTypesView.tsx +28 -6
  816. package/src/views/Posts/PostsListView.tsx +130 -40
  817. package/src/views/SEO.tsx +23 -8
  818. package/src/views/ScriptTags.tsx +233 -153
  819. package/src/views/Settings.tsx +215 -256
  820. package/src/views/SpamFolder.tsx +32 -0
  821. package/src/views/Trash.tsx +12 -1
  822. package/src/views/Users.tsx +2 -2
  823. package/src/views/WidgetsPlaceholder.tsx +33 -0
  824. package/src/views/dashboard/kpi-grid.ts +38 -0
  825. package/src/views/header-footer/AnnouncementTab.tsx +231 -0
  826. package/src/views/header-footer/ChromeField.tsx +358 -0
  827. package/src/views/header-footer/ChromePreview.tsx +497 -0
  828. package/src/views/header-footer/DeveloperTab.tsx +331 -0
  829. package/src/views/header-footer/RegionTab.tsx +398 -0
  830. package/src/views/header-footer/chrome-form.ts +603 -0
  831. package/src/views/header-footer/code-samples.ts +146 -0
  832. package/src/views/header-footer/controls.tsx +166 -0
  833. package/src/views/lazy-views.tsx +12 -0
  834. package/src/views/page-editor/PageTab.tsx +2 -2
  835. package/src/views/page-editor/ReviewBar.tsx +1 -1
  836. package/src/views/page-editor/VersionHistoryPanel.tsx +1 -1
  837. package/src/views/seo/AuditTab.tsx +1 -1
  838. package/src/views/seo/OverviewTab.tsx +6 -5
  839. package/src/views/seo/ProposalsTab.tsx +1 -1
  840. package/src/views/settings/AISettingsTab.tsx +10 -6
  841. package/src/views/settings/AccessProtectionCard.tsx +1 -1
  842. package/src/views/settings/AdminThemeCard.tsx +228 -35
  843. package/src/views/settings/AppearanceTab.tsx +10 -6
  844. package/src/views/settings/BrandPreviewCard.tsx +1 -1
  845. package/src/views/settings/BrandVoiceCard.tsx +1 -1
  846. package/src/views/settings/EmailSettingsTab.tsx +11 -7
  847. package/src/views/settings/GeneralSettingsTab.tsx +10 -6
  848. package/src/views/settings/ProviderConnectionCard.tsx +1 -1
  849. package/src/views/settings/SearchDataCard.tsx +1 -1
  850. package/src/views/settings/SecurityStatusCard.tsx +2 -2
  851. package/src/views/settings/SecurityTab.tsx +10 -6
  852. package/src/views/settings/SeoAutopilotCard.tsx +2 -2
  853. package/src/views/settings/SeoSettingsTab.tsx +13 -9
  854. package/src/views/settings/SiteIndexStatusCard.tsx +1 -1
  855. package/src/views/settings/SiteThemeCard.tsx +1 -1
  856. package/src/views/settings/UpdatesTab.tsx +107 -101
  857. package/src/views/settings/components.tsx +26 -62
  858. package/src/views/settings/useAppearanceSettings.ts +116 -25
  859. package/src/views/users/UserDetailDrawer.tsx +1 -1
  860. package/dist/components/ui/StatPill.d.ts +0 -18
  861. package/dist/components/ui/StatPill.d.ts.map +0 -1
  862. package/dist/components/ui/StatPill.js +0 -5
  863. package/dist/components/ui/StatPill.js.map +0 -1
  864. package/src/components/ui/StatPill.tsx +0 -37
@@ -33,8 +33,10 @@ import { cmsApi } from '../lib/api.js'
33
33
  import { useVirtualWindow, VirtualTablePadding } from '../components/virtual-window.js'
34
34
  import { FolderTree, type FolderSelection } from '../components/FolderTree.js'
35
35
  import { Button } from '../components/ui/Button.js'
36
+ import { TIER_MEDIA } from '../lib/tiers.js'
37
+ import { useSheetFocus } from '../lib/sheet-focus.js'
36
38
  import { StatusBadge } from '../components/ui/StatusBadge.js'
37
- import { StatPill } from '../components/ui/StatPill.js'
39
+ import { CountChip } from '../components/ui/CountChip.js'
38
40
  import { hasLowQualityAlt, MediaSeoAudit, type MediaSeoAuditItem } from './MediaSeoAudit.js'
39
41
 
40
42
  interface MediaItem {
@@ -153,6 +155,13 @@ function buildMediaApiUrl(folderSel: FolderSelection): string {
153
155
  export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
154
156
  const [folderSel, setFolderSel] = useState<FolderSelection>({ type: 'smart', smart: 'all' })
155
157
  const [sidebarOpen, setSidebarOpen] = useState(true)
158
+ // Below 769px the folder tree stacks above the grid, so it starts closed
159
+ // there; the folder button opens it.
160
+ useEffect(() => {
161
+ if (typeof window.matchMedia === 'function' && window.matchMedia(TIER_MEDIA.mobile).matches) {
162
+ setSidebarOpen(false)
163
+ }
164
+ }, [])
156
165
 
157
166
  const apiUrl = useMemo(() => buildMediaApiUrl(folderSel), [folderSel])
158
167
  const { data, loading, error, refetch } = useApiData<{
@@ -213,6 +222,8 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
213
222
  const gridColumns = useGridColumns(activeItem !== null)
214
223
  const gridScrollRef = useRef<HTMLDivElement>(null)
215
224
  const listScrollRef = useRef<HTMLDivElement>(null)
225
+ /** The grid's or list's scroll position when a card opened the detail panel. */
226
+ const savedListScroll = useRef(0)
216
227
  const gridRowCount = gridColumns > 0 ? Math.ceil(filteredAndSorted.length / gridColumns) : 0
217
228
  const gridWindow = useVirtualWindow({
218
229
  count: gridRowCount,
@@ -243,6 +254,7 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
243
254
  }, [mediaItems])
244
255
 
245
256
  const openDetail = useCallback((item: MediaItem) => {
257
+ savedListScroll.current = (gridScrollRef.current ?? listScrollRef.current)?.scrollTop ?? 0
246
258
  setActiveItem(item)
247
259
  setEditAlt(item.altTag ?? '')
248
260
  setEditIsDecorative(item.isDecorative === true)
@@ -517,6 +529,21 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
517
529
  }
518
530
 
519
531
  const panelOpen = activeItem !== null
532
+ const detailPanelRef = useRef<HTMLDivElement>(null)
533
+ // Below 769px the detail panel is a sheet over the content column
534
+ // (`[data-inspector-open]` in responsive.css hides the grid, tabs and
535
+ // header), so the card that opened it leaves the screen. Focus moves into
536
+ // the panel and back when it closes. The hidden scroll box comes back at the
537
+ // top, and the virtualised window wouldn't follow (no scroll event), so its
538
+ // position, saved when a card opens the panel, goes back first. Grid cards
539
+ // aren't focusable, so focus lands on the list itself.
540
+ useSheetFocus(panelOpen, detailPanelRef, {
541
+ restore: () => {
542
+ const scroller = gridScrollRef.current ?? listScrollRef.current
543
+ if (scroller) scroller.scrollTop = savedListScroll.current
544
+ },
545
+ fallback: () => gridScrollRef.current ?? listScrollRef.current,
546
+ })
520
547
  const issues = activeItem
521
548
  ? [
522
549
  ...(!hasAccessibleAlt(activeItem) ? ['Missing alt tag'] : []),
@@ -574,7 +601,8 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
574
601
  </div>
575
602
  )}
576
603
 
577
- <div className="mb-4 flex items-center justify-between">
604
+ {/* Actions sit level with the title, as in Media.html (`.mc-hdr-row`). */}
605
+ <div className="mb-4 flex items-start justify-between">
578
606
  <div className="flex items-center gap-3">
579
607
  <button
580
608
  type="button"
@@ -586,17 +614,22 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
586
614
  <FolderInput className="text-muted-foreground h-5 w-5" aria-hidden />
587
615
  </button>
588
616
  <div>
589
- <h1 className="text-foreground mb-1">Media Library</h1>
590
- <div className="flex flex-wrap items-center gap-1.5">
591
- <StatPill value={mediaStats.total} label="Total Files" />
592
- <StatPill value={mediaStats.images} label="Images" />
593
- <StatPill value={mediaStats.videos} label="Videos" />
594
- <StatPill value={mediaStats.documents} label="Documents" />
595
- <StatPill value={formatStorage(mediaStats.bytes)} label="Storage used" />
617
+ {/* Title = sidebar label (SHELL.md §4); copy from Media.html. */}
618
+ <h1 className="text-foreground leading-[normal]">Media</h1>
619
+ <p className="text-body text-sub mt-[3px] leading-[normal]">
620
+ Manage and optimize all your media assets
621
+ </p>
622
+ <div className="mt-[18px] flex flex-wrap items-center gap-1.5">
623
+ <CountChip n={mediaStats.total} label="Total Files" />
624
+ <CountChip n={mediaStats.images} label="Images" />
625
+ <CountChip n={mediaStats.videos} label="Videos" />
626
+ <CountChip n={mediaStats.documents} label="Documents" />
627
+ <CountChip n={formatStorage(mediaStats.bytes)} label="Storage used" />
596
628
  </div>
597
629
  </div>
598
630
  </div>
599
- <div>
631
+ {/* Below 769px Upload floats above the tab bar. */}
632
+ <div data-header-actions="">
600
633
  <input
601
634
  ref={fileInputRef}
602
635
  type="file"
@@ -612,6 +645,7 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
612
645
  onClick={() => fileInputRef.current?.click()}
613
646
  loading={uploading}
614
647
  leftIcon={<Upload size={16} aria-hidden />}
648
+ data-fab=""
615
649
  >
616
650
  {uploading ? 'Uploading...' : 'Upload Files'}
617
651
  </Button>
@@ -671,9 +705,9 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
671
705
  onRetry={refetch}
672
706
  />
673
707
  ) : (
674
- <div className="flex min-h-0 flex-1 gap-4 overflow-hidden">
708
+ <div className="mobile:flex-col flex min-h-0 flex-1 gap-4 overflow-hidden">
675
709
  {sidebarOpen && (
676
- <div className="border-border bg-card flex w-56 shrink-0 flex-col overflow-hidden rounded-lg border">
710
+ <div className="border-border bg-card mobile:max-h-[40vh] mobile:w-full flex w-56 shrink-0 flex-col overflow-hidden rounded-lg border">
677
711
  <FolderTree
678
712
  scope="media"
679
713
  selected={folderSel}
@@ -688,7 +722,7 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
688
722
  </div>
689
723
  )}
690
724
 
691
- <div className="flex min-w-0 flex-1 flex-col">
725
+ <div className="mobile:min-h-0 flex min-w-0 flex-1 flex-col">
692
726
  <div className="border-border bg-card mb-4 rounded-lg border">
693
727
  <div className="flex items-center justify-between p-3">
694
728
  <div className="flex flex-1 items-center gap-3">
@@ -794,7 +828,11 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
794
828
  className={`border-border bg-card overflow-hidden rounded-lg border transition-all duration-200 ${panelOpen ? 'min-w-0 flex-1' : 'w-full'}`}
795
829
  >
796
830
  {viewMode === 'grid' ? (
797
- <div ref={gridScrollRef} className="h-full overflow-y-auto p-2 sm:p-3">
831
+ <div
832
+ ref={gridScrollRef}
833
+ tabIndex={-1}
834
+ className="h-full overflow-y-auto p-2 sm:p-3"
835
+ >
798
836
  <div className="relative" style={{ height: gridRowCount * 220 }}>
799
837
  {gridWindow.rows.map((virtualRow) => (
800
838
  <div
@@ -906,7 +944,11 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
906
944
  </div>
907
945
  </div>
908
946
  ) : (
909
- <div ref={listScrollRef} className="h-full overflow-auto">
947
+ <div
948
+ ref={listScrollRef}
949
+ tabIndex={-1}
950
+ className="h-full overflow-auto outline-none"
951
+ >
910
952
  {/* min-w keeps the list columns readable; narrow viewports scroll sideways. */}
911
953
  <table className="w-full min-w-[640px]">
912
954
  <thead className="border-border bg-muted sticky top-0 border-b">
@@ -1009,17 +1051,25 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
1009
1051
  </div>
1010
1052
 
1011
1053
  {panelOpen && activeItem && (
1012
- <div className="border-border bg-card flex w-80 shrink-0 flex-col overflow-y-auto rounded-lg border lg:w-96">
1054
+ <div
1055
+ ref={detailPanelRef}
1056
+ data-inspector-open=""
1057
+ tabIndex={-1}
1058
+ role="region"
1059
+ aria-label={`${activeItem.name} details`}
1060
+ className="border-border bg-card mobile:w-full flex w-80 shrink-0 flex-col overflow-y-auto rounded-lg border lg:w-96"
1061
+ >
1013
1062
  <div className="border-border bg-card sticky top-0 z-10 flex items-center justify-between border-b p-4">
1014
1063
  <h3 className="text-foreground truncate text-sm font-medium">
1015
1064
  {activeItem.name}
1016
1065
  </h3>
1017
1066
  <button
1067
+ type="button"
1018
1068
  onClick={closeDetail}
1019
- className="hover:bg-muted rounded p-1 transition-colors"
1069
+ className="hover:bg-muted prenta-touch-target mobile:-my-2.5 mobile:-mr-2.5 mobile:h-11 mobile:w-11 flex items-center justify-center rounded p-1 transition-colors"
1020
1070
  aria-label="Close panel"
1021
1071
  >
1022
- <X className="text-muted-foreground h-4 w-4" />
1072
+ <X className="text-muted-foreground h-4 w-4" aria-hidden />
1023
1073
  </button>
1024
1074
  </div>
1025
1075
 
@@ -1035,7 +1085,7 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
1035
1085
  </div>
1036
1086
 
1037
1087
  {issues.length > 0 && (
1038
- <div className="border-warning/30 bg-warning/10 mx-4 mt-4 rounded-lg border p-4">
1088
+ <div className="border-warning/30 bg-warn-l mx-4 mt-4 rounded-lg border p-4">
1039
1089
  <div className="flex items-start gap-2">
1040
1090
  <AlertTriangle className="text-warning mt-0.5 h-4 w-4 shrink-0" />
1041
1091
  <div>
@@ -1166,7 +1216,7 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
1166
1216
  {activeItem.aiAltSuggestion !== undefined &&
1167
1217
  editAlt !== activeItem.aiAltSuggestion &&
1168
1218
  !editIsDecorative && (
1169
- <div className="border-warning/40 bg-warning/10 mt-2 flex items-start justify-between gap-2 rounded-lg border p-4 text-xs">
1219
+ <div className="border-warning/40 bg-warn-l mt-2 flex items-start justify-between gap-2 rounded-lg border p-4 text-xs">
1170
1220
  <span className="text-foreground">
1171
1221
  AI suggestion:{' '}
1172
1222
  {activeItem.aiAltSuggestion.trim()
@@ -1301,7 +1351,7 @@ export function MediaBrowser({ onNavigate, currentPath }: MediaBrowserProps) {
1301
1351
  ))}
1302
1352
  </div>
1303
1353
  ) : (
1304
- <div className="border-warning/30 bg-warning/10 rounded-lg border p-4">
1354
+ <div className="border-warning/30 bg-warn-l rounded-lg border p-4">
1305
1355
  <div className="flex items-start gap-2">
1306
1356
  <AlertTriangle className="text-warning mt-0.5 h-4 w-4 shrink-0" />
1307
1357
  <div>
@@ -52,6 +52,15 @@ import { AuthorAvatar } from '../../components/ui/AuthorAvatar.js'
52
52
  import { Button } from '../../components/ui/Button.js'
53
53
  import { ConfirmDialog } from '../../components/ui/ConfirmDialog.js'
54
54
  import { RowActionButton, RowActions } from '../../components/ui/RowActions.js'
55
+ import {
56
+ cardCell,
57
+ cardColumnHeader,
58
+ cardRow,
59
+ cardRowGroup,
60
+ cardTable,
61
+ } from '../../components/ui/card-table.js'
62
+ import { TIER_MEDIA, useMediaQuery } from '../../lib/tiers.js'
63
+ import { CardListControls, type CardSortOption } from '../../components/ui/CardListControls.js'
55
64
  import { PagesTreeTable } from './PagesTreeTable.js'
56
65
 
57
66
  /**
@@ -62,7 +71,7 @@ import { PagesTreeTable } from './PagesTreeTable.js'
62
71
  *
63
72
  * Routing:
64
73
  * - Row click → /pages/:id/edit (the page builder).
65
- * - "+ New page" lives in the top bar (computePageActions).
74
+ * - "+ New page" sits on the right of the page header.
66
75
  * - "Manage tags" (in the tag bar) → /pages/tags.
67
76
  */
68
77
 
@@ -83,6 +92,15 @@ const TOGGLEABLE_COLUMNS: Array<{ key: ToggleableColumn; label: string }> = [
83
92
  ]
84
93
 
85
94
  const PAGE_SIZE = 25
95
+
96
+ /** The sortable columns, for the phone sort select (the header's labels). */
97
+ const PAGE_SORT_OPTIONS: CardSortOption<SortBy>[] = [
98
+ { field: 'title', label: 'Title' },
99
+ { field: 'author', label: 'Author' },
100
+ { field: 'status', label: 'Status' },
101
+ { field: 'modified', label: 'Last Modified' },
102
+ { field: 'seo', label: 'SEO' },
103
+ ]
86
104
  const VIEW_MODE_KEY = 'prenta.pages.viewMode'
87
105
  const HIDDEN_COLUMNS_KEY = 'prenta.pages.hiddenColumns'
88
106
 
@@ -228,10 +246,14 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
228
246
  return rows
229
247
  }, [displayGroups, grouped])
230
248
  const listScrollRef = useRef<HTMLDivElement>(null)
249
+ // Below 769px the rows are cards (`table[data-cards]`), taller than the
250
+ // 56px estimate the window places them by, so every row is mounted.
251
+ const cards = useMediaQuery(TIER_MEDIA.mobile)
231
252
  const listWindow = useVirtualWindow({
232
253
  count: tableRows.length,
233
254
  scrollRef: listScrollRef,
234
255
  estimateSize: 56,
256
+ enabled: !cards,
235
257
  })
236
258
 
237
259
  // ─── Tree mode ─────────────────────────────────────────────────────
@@ -535,7 +557,7 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
535
557
  // Fill the shell's <main> and scroll the table card internally so the
536
558
  // pagination footer stays reachable (h-full + main overflow-y-auto alone
537
559
  // clips the footer — see #736).
538
- <div className="flex h-full min-h-0 flex-col gap-4 p-4 sm:p-6">
560
+ <div className="mobile:h-auto flex h-full min-h-0 flex-col gap-4 p-4 sm:p-6">
539
561
  {/* Header — the "+ New page" primary action sits on the right, per
540
562
  the design's `.page-hdr` / `.hdr-r` layout. */}
541
563
  <div className="flex flex-wrap items-start justify-between gap-3">
@@ -547,16 +569,20 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
547
569
  : `${grandTotal} page${grandTotal === 1 ? '' : 's'} · organized by tags`}
548
570
  </p>
549
571
  </div>
550
- <Button
551
- type="button"
552
- variant="primary"
553
- size="sm"
554
- className="shadow-sm"
555
- onClick={() => onNavigate('/pages/new')}
556
- leftIcon={<Plus size={16} aria-hidden />}
557
- >
558
- New page
559
- </Button>
572
+ {/* Below 769px the create action floats above the tab bar. */}
573
+ <div data-header-actions="" className="flex items-center gap-2">
574
+ <Button
575
+ type="button"
576
+ variant="primary"
577
+ size="sm"
578
+ className="shadow-sm"
579
+ onClick={() => onNavigate('/pages/new')}
580
+ leftIcon={<Plus size={16} aria-hidden />}
581
+ data-fab=""
582
+ >
583
+ New page
584
+ </Button>
585
+ </div>
560
586
  </div>
561
587
 
562
588
  {/* Controls row */}
@@ -676,8 +702,38 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
676
702
  />
677
703
  )}
678
704
 
679
- {/* Table card — flex-1 + min-h-0 so the body scrolls; footer stays pinned. */}
680
- <div className="flex min-h-0 flex-1 flex-col overflow-hidden rounded-xl border border-[var(--bdr)] bg-[var(--card)] shadow-sm">
705
+ {/* Phones: the table header's sort and select-all, out of reach on cards. */}
706
+ {treeMode ? null : (
707
+ <CardListControls
708
+ selectAll={{
709
+ checked: allOnPageSelected,
710
+ onChange: toggleAllOnPage,
711
+ disabled: visiblePages.length === 0,
712
+ }}
713
+ sort={{
714
+ options: PAGE_SORT_OPTIONS.filter(
715
+ (option) =>
716
+ (option.field !== 'author' || showAuthor) && (option.field !== 'seo' || showSeo),
717
+ ),
718
+ field: sortBy,
719
+ dir,
720
+ onChange: (field, nextDir) => {
721
+ setSortBy(field)
722
+ setDir(nextDir)
723
+ },
724
+ }}
725
+ />
726
+ )}
727
+
728
+ {/* Table card — flex-1 + min-h-0 so the body scrolls; footer stays pinned.
729
+ On mobile the list rows are cards themselves, so this frame drops. */}
730
+ <div
731
+ className={`flex min-h-0 flex-1 flex-col overflow-hidden rounded-xl border border-[var(--bdr)] bg-[var(--card)] shadow-sm ${
732
+ treeMode
733
+ ? ''
734
+ : 'mobile:flex-none mobile:overflow-visible mobile:rounded-none mobile:border-0 mobile:bg-transparent mobile:shadow-none'
735
+ }`}
736
+ >
681
737
  {treeMode ? (
682
738
  <div className="min-h-0 flex-1 overflow-auto">
683
739
  <PagesTreeTable
@@ -705,11 +761,14 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
705
761
  <>
706
762
  {/* Both-axis scroll: tall lists scroll vertically; narrow viewports
707
763
  keep column widths and scroll sideways instead of crushing. */}
708
- <div ref={listScrollRef} className="min-h-0 flex-1 overflow-auto">
764
+ <div
765
+ ref={listScrollRef}
766
+ className="mobile:flex-none mobile:overflow-visible min-h-0 flex-1 overflow-auto"
767
+ >
709
768
  <table
710
769
  className="w-full table-fixed"
711
770
  style={{ minWidth: tableMinWidth }}
712
- role="table"
771
+ {...cardTable}
713
772
  aria-label="Pages"
714
773
  >
715
774
  <colgroup>
@@ -722,9 +781,9 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
722
781
  {showSeo && <col style={{ width: '80px' }} />}
723
782
  <col style={{ width: '110px' }} />
724
783
  </colgroup>
725
- <thead className="bg-muted/40 border-b border-[var(--bdr)]">
726
- <tr className="text-xs text-[var(--sub)]">
727
- <th scope="col" className="px-3 py-2.5 text-left">
784
+ <thead {...cardRowGroup} className="bg-muted/40 border-b border-[var(--bdr)]">
785
+ <tr {...cardRow} className="text-xs text-[var(--sub)]">
786
+ <th {...cardColumnHeader} scope="col" className="px-3 py-2.5 text-left">
728
787
  <input
729
788
  type="checkbox"
730
789
  aria-label="Select all pages on this page"
@@ -734,6 +793,7 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
734
793
  />
735
794
  </th>
736
795
  <th
796
+ {...cardColumnHeader}
737
797
  scope="col"
738
798
  aria-sort={ariaSortFor('title')}
739
799
  className="px-3 py-2.5 text-left"
@@ -747,12 +807,13 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
747
807
  />
748
808
  </th>
749
809
  {showTags && (
750
- <th scope="col" className="px-3 py-2.5 text-left">
810
+ <th {...cardColumnHeader} scope="col" className="px-3 py-2.5 text-left">
751
811
  <span className="text-xs font-medium tracking-wider uppercase">Tags</span>
752
812
  </th>
753
813
  )}
754
814
  {showAuthor && (
755
815
  <th
816
+ {...cardColumnHeader}
756
817
  scope="col"
757
818
  aria-sort={ariaSortFor('author')}
758
819
  className="px-3 py-2.5 text-left"
@@ -767,6 +828,7 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
767
828
  </th>
768
829
  )}
769
830
  <th
831
+ {...cardColumnHeader}
770
832
  scope="col"
771
833
  aria-sort={ariaSortFor('status')}
772
834
  className="px-3 py-2.5 text-left"
@@ -780,6 +842,7 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
780
842
  />
781
843
  </th>
782
844
  <th
845
+ {...cardColumnHeader}
783
846
  scope="col"
784
847
  aria-sort={ariaSortFor('modified')}
785
848
  className="px-3 py-2.5 text-left"
@@ -794,6 +857,7 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
794
857
  </th>
795
858
  {showSeo && (
796
859
  <th
860
+ {...cardColumnHeader}
797
861
  scope="col"
798
862
  aria-sort={ariaSortFor('seo')}
799
863
  className="px-3 py-2.5 text-left"
@@ -807,12 +871,12 @@ export function PagesListView({ onNavigate }: PagesListViewProps) {
807
871
  />
808
872
  </th>
809
873
  )}
810
- <th scope="col" className="px-3 py-2.5 text-right">
874
+ <th {...cardColumnHeader} scope="col" className="px-3 py-2.5 text-right">
811
875
  <span className="sr-only">Actions</span>
812
876
  </th>
813
877
  </tr>
814
878
  </thead>
815
- <tbody>
879
+ <tbody {...cardRowGroup}>
816
880
  {loading && pages.length === 0 && <LoadingRows columns={columnCount} />}
817
881
  {!loading && error && (
818
882
  <tr>
@@ -1119,8 +1183,8 @@ function GroupBlock({
1119
1183
  return (
1120
1184
  <>
1121
1185
  {showHeader && (
1122
- <tr className="bg-muted/30 border-b border-[var(--bdr)]">
1123
- <td colSpan={columns} className="px-3 py-2">
1186
+ <tr {...cardRow} className="bg-muted/30 border-b border-[var(--bdr)]">
1187
+ <td {...cardCell()} colSpan={columns} className="px-3 py-2">
1124
1188
  <span className="inline-flex items-center gap-2 text-xs font-medium tracking-wider text-[var(--txt)] uppercase">
1125
1189
  {color && <span aria-hidden className={`h-2 w-2 rounded-full ${dotFor(color)}`} />}
1126
1190
  {label}
@@ -1291,20 +1355,29 @@ function PageRow({
1291
1355
  }) {
1292
1356
  return (
1293
1357
  <tr
1358
+ {...cardRow}
1359
+ data-state={selected ? 'selected' : undefined}
1294
1360
  className={`group border-b border-[var(--bdr)] transition-colors last:border-b-0 hover:bg-[var(--acc-l)] ${
1295
1361
  selected ? 'bg-[var(--acc-l)]' : ''
1296
1362
  }`}
1297
1363
  >
1298
- <td className="px-3 py-3" onClick={(e) => e.stopPropagation()}>
1299
- <input
1300
- type="checkbox"
1301
- aria-label={`Select "${page.title}"`}
1302
- checked={selected}
1303
- onChange={onSelect}
1304
- className="accent-primary rounded border-[var(--bdr)]"
1305
- />
1364
+ <td
1365
+ {...cardCell({ role: 'check' })}
1366
+ className="px-3 py-3"
1367
+ onClick={(e) => e.stopPropagation()}
1368
+ >
1369
+ {/* The label is the card's 44px hit area on mobile (responsive.css). */}
1370
+ <label className="inline-flex cursor-pointer">
1371
+ <input
1372
+ type="checkbox"
1373
+ aria-label={`Select "${page.title}"`}
1374
+ checked={selected}
1375
+ onChange={onSelect}
1376
+ className="accent-primary rounded border-[var(--bdr)]"
1377
+ />
1378
+ </label>
1306
1379
  </td>
1307
- <td className="px-3 py-3">
1380
+ <td {...cardCell({ role: 'title' })} className="px-3 py-3">
1308
1381
  <button type="button" onClick={onOpen} className="block w-full min-w-0 text-left">
1309
1382
  <span className="block truncate text-sm font-medium text-[var(--txt)] group-hover:text-[var(--acc)]">
1310
1383
  {page.title}
@@ -1313,7 +1386,7 @@ function PageRow({
1313
1386
  </button>
1314
1387
  </td>
1315
1388
  {showTags && (
1316
- <td className="px-3 py-3">
1389
+ <td {...cardCell({ label: 'Tags' })} className="px-3 py-3">
1317
1390
  <PageTagsCell
1318
1391
  tagSlugs={page.tags}
1319
1392
  primaryTagId={page.primaryTagId}
@@ -1322,25 +1395,28 @@ function PageRow({
1322
1395
  </td>
1323
1396
  )}
1324
1397
  {showAuthor && (
1325
- <td className="px-3 py-3">
1398
+ <td {...cardCell({ label: 'Author' })} className="px-3 py-3">
1326
1399
  <div className="flex items-center gap-2">
1327
1400
  <AuthorAvatar name={page.authorName} size={28} />
1328
1401
  <span className="truncate text-sm text-[var(--txt)]">{page.authorName}</span>
1329
1402
  </div>
1330
1403
  </td>
1331
1404
  )}
1332
- <td className="px-3 py-3">
1405
+ <td {...cardCell({ label: 'Status' })} className="px-3 py-3">
1333
1406
  <PostStatusBadge status={page.status} />
1334
1407
  </td>
1335
- <td className="px-3 py-3 text-sm text-[var(--sub)] tabular-nums">
1408
+ <td
1409
+ {...cardCell({ label: 'Last Modified' })}
1410
+ className="px-3 py-3 text-sm text-[var(--sub)] tabular-nums"
1411
+ >
1336
1412
  {formatDateShort(page.lastModified)}
1337
1413
  </td>
1338
1414
  {showSeo && (
1339
- <td className="px-3 py-3">
1415
+ <td {...cardCell({ label: 'SEO' })} className="px-3 py-3">
1340
1416
  <SeoScoreIndicator score={page.seoScore} />
1341
1417
  </td>
1342
1418
  )}
1343
- <td className="px-3 py-3">
1419
+ <td {...cardCell({ role: 'actions' })} className="px-3 py-3">
1344
1420
  <RowActions>
1345
1421
  <RowActionButton aria-label={`Edit "${page.title}"`} title="Edit" onClick={onOpen}>
1346
1422
  <PenLine size={13} aria-hidden />
@@ -1,8 +1,9 @@
1
1
  'use client'
2
2
 
3
3
  import { useMemo, useState } from 'react'
4
- import { ArrowLeft, Check, Copy, Sparkles } from 'lucide-react'
4
+ import { Check, Copy, Sparkles } from 'lucide-react'
5
5
  import { toast } from 'sonner'
6
+ import { Breadcrumb } from '../../components/ui/Breadcrumb.js'
6
7
  import { resolvePostTypeIcon, type PostTypeIconName } from '../../components/posts/icons.js'
7
8
  import { paletteFor } from '../../components/posts/badges.js'
8
9
  import { POST_TYPE_PRESETS, type PresetColor, type QuickPreset } from './post-type-presets.js'
@@ -104,16 +105,20 @@ export function NewPostTypeInstructions({ onNavigate }: { onNavigate: (p: string
104
105
 
105
106
  return (
106
107
  <div className="mx-auto flex h-full max-w-3xl flex-col gap-6 p-4 sm:p-6">
107
- <button
108
- type="button"
109
- onClick={() => onNavigate('/posts/types')}
110
- className="text-muted-foreground hover:text-foreground inline-flex w-fit items-center gap-1.5 text-sm transition-colors"
111
- >
112
- <ArrowLeft className="h-3.5 w-3.5" aria-hidden />
113
- Back to Post Types
114
- </button>
115
-
116
108
  <div className="flex flex-col gap-1">
109
+ <Breadcrumb
110
+ className="mb-1"
111
+ items={[
112
+ { label: 'Dashboard', path: '/' },
113
+ { label: 'Posts', path: '/posts' },
114
+ {
115
+ label: 'Post Types',
116
+ path: '/posts/types',
117
+ onClick: () => onNavigate('/posts/types'),
118
+ },
119
+ { label: 'Add a Post Type' },
120
+ ]}
121
+ />
117
122
  <h1 className="text-foreground">Add a Post Type</h1>
118
123
  <p className="text-muted-foreground text-sm">
119
124
  Post Types are content models defined in{' '}
@@ -5,6 +5,9 @@ import { LayoutTemplate, Plus } from 'lucide-react'
5
5
  import { fetchPosts, type PostType } from '../../lib/posts-service.js'
6
6
  import { paletteFor } from '../../components/posts/badges.js'
7
7
  import { resolvePostTypeIcon } from '../../components/posts/icons.js'
8
+ import { Breadcrumb } from '../../components/ui/Breadcrumb.js'
9
+ import { PageHeader } from '../../components/ui/PageHeader.js'
10
+ import { Button } from '../../components/ui/Button.js'
8
11
 
9
12
  /**
10
13
  * Post Types — card grid that mirrors the reference screenshot. Each
@@ -61,12 +64,31 @@ export function PostTypesView({ onNavigate }: PostTypesViewProps) {
61
64
 
62
65
  return (
63
66
  <div className="flex h-full flex-col gap-6 p-4 sm:p-6">
64
- <div className="flex flex-col gap-1">
65
- <h1 className="text-foreground">Post Types</h1>
66
- <p className="text-muted-foreground text-sm">
67
- Define content models and their fields. All types share the same default fields.
68
- </p>
69
- </div>
67
+ <PageHeader
68
+ flush
69
+ title="Post Types"
70
+ subtitle="Define content models and their fields. All types share the same default fields."
71
+ breadcrumb={
72
+ <Breadcrumb
73
+ items={[
74
+ { label: 'Dashboard', path: '/' },
75
+ { label: 'Posts', path: '/posts' },
76
+ { label: 'Post Types' },
77
+ ]}
78
+ />
79
+ }
80
+ actions={
81
+ // Floats above the tab bar below 769px (data-fab).
82
+ <Button
83
+ type="button"
84
+ onClick={() => onNavigate('/posts/types/new')}
85
+ leftIcon={<Plus size={16} aria-hidden />}
86
+ data-fab=""
87
+ >
88
+ New Post Type
89
+ </Button>
90
+ }
91
+ />
70
92
 
71
93
  {loading && <CardGridSkeleton />}
72
94
  {!loading && error && (