octocms 0.4.1 → 0.4.2

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 (327) hide show
  1. package/dist/admin/AdminApp.d.ts +18 -14
  2. package/dist/admin/AdminApp.d.ts.map +1 -1
  3. package/dist/admin/AdminApp.js +33 -20
  4. package/dist/admin/AdminApp.js.map +1 -1
  5. package/dist/admin/actions/entries.d.ts.map +1 -1
  6. package/dist/admin/actions/entries.js +38 -6
  7. package/dist/admin/actions/entries.js.map +1 -1
  8. package/dist/admin/index.d.ts +13 -0
  9. package/dist/admin/index.d.ts.map +1 -0
  10. package/dist/admin/index.js +12 -0
  11. package/dist/admin/index.js.map +1 -0
  12. package/dist/admin/pages/AdminErrorView.d.ts +32 -0
  13. package/dist/admin/pages/AdminErrorView.d.ts.map +1 -0
  14. package/dist/admin/pages/AdminErrorView.js +40 -0
  15. package/dist/admin/pages/AdminErrorView.js.map +1 -0
  16. package/dist/admin/pages/AdminLayout.d.ts.map +1 -1
  17. package/dist/admin/pages/AdminLayout.js +1 -1
  18. package/dist/admin/pages/AdminLayout.js.map +1 -1
  19. package/dist/admin/pages/CollectionPage.d.ts +1 -1
  20. package/dist/admin/pages/CollectionPage.d.ts.map +1 -1
  21. package/dist/admin/pages/CollectionPage.js +22 -16
  22. package/dist/admin/pages/CollectionPage.js.map +1 -1
  23. package/dist/admin/pages/ContentModelPage.d.ts +1 -1
  24. package/dist/admin/pages/ContentModelPage.d.ts.map +1 -1
  25. package/dist/admin/pages/ContentModelPage.js +1 -5
  26. package/dist/admin/pages/ContentModelPage.js.map +1 -1
  27. package/dist/admin/pages/ContentPage.d.ts +2 -0
  28. package/dist/admin/pages/ContentPage.d.ts.map +1 -0
  29. package/dist/admin/pages/ContentPage.js +21 -0
  30. package/dist/admin/pages/ContentPage.js.map +1 -0
  31. package/dist/admin/pages/ContentTypePage.d.ts +1 -1
  32. package/dist/admin/pages/ContentTypePage.d.ts.map +1 -1
  33. package/dist/admin/pages/ContentTypePage.js +3 -6
  34. package/dist/admin/pages/ContentTypePage.js.map +1 -1
  35. package/dist/admin/pages/DashboardPage.d.ts +1 -1
  36. package/dist/admin/pages/DashboardPage.d.ts.map +1 -1
  37. package/dist/admin/pages/DashboardPage.js +5 -15
  38. package/dist/admin/pages/DashboardPage.js.map +1 -1
  39. package/dist/admin/pages/EntryPage.d.ts +1 -1
  40. package/dist/admin/pages/EntryPage.d.ts.map +1 -1
  41. package/dist/admin/pages/EntryPage.js +12 -16
  42. package/dist/admin/pages/EntryPage.js.map +1 -1
  43. package/dist/admin/pages/MediaAssetPage.d.ts +4 -0
  44. package/dist/admin/pages/MediaAssetPage.d.ts.map +1 -0
  45. package/dist/admin/pages/MediaAssetPage.js +21 -0
  46. package/dist/admin/pages/MediaAssetPage.js.map +1 -0
  47. package/dist/admin/pages/MediaPage.d.ts +1 -3
  48. package/dist/admin/pages/MediaPage.d.ts.map +1 -1
  49. package/dist/admin/pages/MediaPage.js +3 -6
  50. package/dist/admin/pages/MediaPage.js.map +1 -1
  51. package/dist/agent/index.cjs +1 -2
  52. package/dist/agent/index.cjs.map +1 -1
  53. package/dist/agent/search.d.ts +1 -1
  54. package/dist/agent/search.js.map +1 -1
  55. package/dist/{agentDocs-YTR2WM5C.js → agentDocs-L4RLZCYK.js} +2 -2
  56. package/dist/{chunk-VTZ2KGUU.js → chunk-SJ3MPCWY.js} +24 -3
  57. package/dist/chunk-SJ3MPCWY.js.map +1 -0
  58. package/dist/cli/index.js +4 -4
  59. package/dist/cli/index.js.map +1 -1
  60. package/dist/components/Chat/ChatPage.d.ts.map +1 -1
  61. package/dist/components/Chat/ChatPage.js +6 -6
  62. package/dist/components/Chat/ChatPage.js.map +1 -1
  63. package/dist/components/Chat/ChatPage.skeleton.d.ts +3 -0
  64. package/dist/components/Chat/ChatPage.skeleton.d.ts.map +1 -0
  65. package/dist/components/Chat/ChatPage.skeleton.js +22 -0
  66. package/dist/components/Chat/ChatPage.skeleton.js.map +1 -0
  67. package/dist/components/CommandK/CommandK.d.ts +12 -0
  68. package/dist/components/CommandK/CommandK.d.ts.map +1 -0
  69. package/dist/components/CommandK/CommandK.js +229 -0
  70. package/dist/components/CommandK/CommandK.js.map +1 -0
  71. package/dist/components/CommandK/parts.d.ts +20 -0
  72. package/dist/components/CommandK/parts.d.ts.map +1 -0
  73. package/dist/components/CommandK/parts.js +34 -0
  74. package/dist/components/CommandK/parts.js.map +1 -0
  75. package/dist/components/ContentModel/ContentModelList.d.ts.map +1 -1
  76. package/dist/components/ContentModel/ContentModelList.js +11 -19
  77. package/dist/components/ContentModel/ContentModelList.js.map +1 -1
  78. package/dist/components/ContentModel/ContentModelList.skeleton.d.ts +5 -0
  79. package/dist/components/ContentModel/ContentModelList.skeleton.d.ts.map +1 -0
  80. package/dist/components/ContentModel/ContentModelList.skeleton.js +16 -0
  81. package/dist/components/ContentModel/ContentModelList.skeleton.js.map +1 -0
  82. package/dist/components/ContentModel/ContentTypeDetail.js +2 -2
  83. package/dist/components/ContentModel/ContentTypeDetail.js.map +1 -1
  84. package/dist/components/ContentModel/ContentTypeDetail.skeleton.d.ts +5 -0
  85. package/dist/components/ContentModel/ContentTypeDetail.skeleton.d.ts.map +1 -0
  86. package/dist/components/ContentModel/ContentTypeDetail.skeleton.js +22 -0
  87. package/dist/components/ContentModel/ContentTypeDetail.skeleton.js.map +1 -0
  88. package/dist/components/ContentModel/CreateContentTypeDialog.js +1 -1
  89. package/dist/components/ContentModel/CreateContentTypeDialog.js.map +1 -1
  90. package/dist/components/ContentModel/DeleteContentTypeDialog.js +1 -1
  91. package/dist/components/ContentModel/DeleteContentTypeDialog.js.map +1 -1
  92. package/dist/components/ContentModel/EditContentTypeDialog.js +1 -1
  93. package/dist/components/ContentModel/EditContentTypeDialog.js.map +1 -1
  94. package/dist/components/ContentModel/SchemaImpactList.js +1 -1
  95. package/dist/components/ContentModel/SchemaImpactList.js.map +1 -1
  96. package/dist/components/ContentTypes.js +2 -2
  97. package/dist/components/ContentTypes.js.map +1 -1
  98. package/dist/components/Dashboard/DashboardContent.collection.skeleton.d.ts +3 -0
  99. package/dist/components/Dashboard/DashboardContent.collection.skeleton.d.ts.map +1 -0
  100. package/dist/components/Dashboard/DashboardContent.collection.skeleton.js +10 -0
  101. package/dist/components/Dashboard/DashboardContent.collection.skeleton.js.map +1 -0
  102. package/dist/components/Dashboard/DashboardContent.d.ts +3 -1
  103. package/dist/components/Dashboard/DashboardContent.d.ts.map +1 -1
  104. package/dist/components/Dashboard/DashboardContent.js +269 -109
  105. package/dist/components/Dashboard/DashboardContent.js.map +1 -1
  106. package/dist/components/Dashboard/DashboardContent.list.skeleton.d.ts +7 -0
  107. package/dist/components/Dashboard/DashboardContent.list.skeleton.d.ts.map +1 -0
  108. package/dist/components/Dashboard/DashboardContent.list.skeleton.js +22 -0
  109. package/dist/components/Dashboard/DashboardContent.list.skeleton.js.map +1 -0
  110. package/dist/components/Dashboard/DashboardContent.skeleton.d.ts +2 -0
  111. package/dist/components/Dashboard/DashboardContent.skeleton.d.ts.map +1 -0
  112. package/dist/components/Dashboard/DashboardContent.skeleton.js +13 -0
  113. package/dist/components/Dashboard/DashboardContent.skeleton.js.map +1 -0
  114. package/dist/components/EditPost/EditPost.d.ts.map +1 -1
  115. package/dist/components/EditPost/EditPost.js +3 -2
  116. package/dist/components/EditPost/EditPost.js.map +1 -1
  117. package/dist/components/EditPost/EditPost.skeleton.d.ts +5 -0
  118. package/dist/components/EditPost/EditPost.skeleton.d.ts.map +1 -0
  119. package/dist/components/EditPost/EditPost.skeleton.js +34 -0
  120. package/dist/components/EditPost/EditPost.skeleton.js.map +1 -0
  121. package/dist/components/ErrorBoundary.d.ts +30 -0
  122. package/dist/components/ErrorBoundary.d.ts.map +1 -0
  123. package/dist/components/ErrorBoundary.js +73 -0
  124. package/dist/components/ErrorBoundary.js.map +1 -0
  125. package/dist/components/FileExplorer/FileExplorer.d.ts.map +1 -1
  126. package/dist/components/FileExplorer/FileExplorer.js +2 -1
  127. package/dist/components/FileExplorer/FileExplorer.js.map +1 -1
  128. package/dist/components/FormFields.d.ts.map +1 -1
  129. package/dist/components/FormFields.js +4 -4
  130. package/dist/components/FormFields.js.map +1 -1
  131. package/dist/components/FormMarkdownField.d.ts.map +1 -1
  132. package/dist/components/FormMarkdownField.js +3 -2
  133. package/dist/components/FormMarkdownField.js.map +1 -1
  134. package/dist/components/Layout/Layout.d.ts.map +1 -1
  135. package/dist/components/Layout/Layout.js +8 -4
  136. package/dist/components/Layout/Layout.js.map +1 -1
  137. package/dist/components/Layout/LeftNavItem.d.ts +20 -0
  138. package/dist/components/Layout/LeftNavItem.d.ts.map +1 -0
  139. package/dist/components/Layout/LeftNavItem.js +24 -0
  140. package/dist/components/Layout/LeftNavItem.js.map +1 -0
  141. package/dist/components/Layout/PageBar.d.ts +10 -0
  142. package/dist/components/Layout/PageBar.d.ts.map +1 -0
  143. package/dist/components/Layout/PageBar.js +43 -0
  144. package/dist/components/Layout/PageBar.js.map +1 -0
  145. package/dist/components/Layout/PageShell.d.ts +30 -0
  146. package/dist/components/Layout/PageShell.d.ts.map +1 -0
  147. package/dist/components/Layout/PageShell.js +33 -0
  148. package/dist/components/Layout/PageShell.js.map +1 -0
  149. package/dist/components/Layout/TopHeader.d.ts +6 -0
  150. package/dist/components/Layout/TopHeader.d.ts.map +1 -0
  151. package/dist/components/Layout/TopHeader.js +291 -0
  152. package/dist/components/Layout/TopHeader.js.map +1 -0
  153. package/dist/components/MediaAsset/MediaAsset.d.ts +7 -0
  154. package/dist/components/MediaAsset/MediaAsset.d.ts.map +1 -0
  155. package/dist/components/MediaAsset/MediaAsset.js +236 -0
  156. package/dist/components/MediaAsset/MediaAsset.js.map +1 -0
  157. package/dist/components/MediaAsset/MediaAsset.skeleton.d.ts +3 -0
  158. package/dist/components/MediaAsset/MediaAsset.skeleton.d.ts.map +1 -0
  159. package/dist/components/MediaAsset/MediaAsset.skeleton.js +42 -0
  160. package/dist/components/MediaAsset/MediaAsset.skeleton.js.map +1 -0
  161. package/dist/components/MediaAsset/findMediaFileByRequestedId.d.ts +4 -0
  162. package/dist/components/MediaAsset/findMediaFileByRequestedId.d.ts.map +1 -0
  163. package/dist/components/MediaAsset/findMediaFileByRequestedId.js +15 -0
  164. package/dist/components/MediaAsset/findMediaFileByRequestedId.js.map +1 -0
  165. package/dist/components/MediaManager/CreateFolderDialog.d.ts +9 -0
  166. package/dist/components/MediaManager/CreateFolderDialog.d.ts.map +1 -0
  167. package/dist/components/MediaManager/CreateFolderDialog.js +68 -0
  168. package/dist/components/MediaManager/CreateFolderDialog.js.map +1 -0
  169. package/dist/components/MediaManager/DeleteFolderDialog.d.ts +8 -0
  170. package/dist/components/MediaManager/DeleteFolderDialog.d.ts.map +1 -0
  171. package/dist/components/MediaManager/DeleteFolderDialog.js +42 -0
  172. package/dist/components/MediaManager/DeleteFolderDialog.js.map +1 -0
  173. package/dist/components/MediaManager/MediaLeftPanel.d.ts +13 -0
  174. package/dist/components/MediaManager/MediaLeftPanel.d.ts.map +1 -0
  175. package/dist/components/MediaManager/MediaLeftPanel.js +93 -0
  176. package/dist/components/MediaManager/MediaLeftPanel.js.map +1 -0
  177. package/dist/components/MediaManager/MediaListTable.d.ts +6 -0
  178. package/dist/components/MediaManager/MediaListTable.d.ts.map +1 -0
  179. package/dist/components/MediaManager/MediaListTable.js +52 -0
  180. package/dist/components/MediaManager/MediaListTable.js.map +1 -0
  181. package/dist/components/MediaManager/MediaManager.d.ts +1 -3
  182. package/dist/components/MediaManager/MediaManager.d.ts.map +1 -1
  183. package/dist/components/MediaManager/MediaManager.js +239 -495
  184. package/dist/components/MediaManager/MediaManager.js.map +1 -1
  185. package/dist/components/MediaManager/MediaManager.skeleton.d.ts +3 -0
  186. package/dist/components/MediaManager/MediaManager.skeleton.d.ts.map +1 -0
  187. package/dist/components/MediaManager/MediaManager.skeleton.js +30 -0
  188. package/dist/components/MediaManager/MediaManager.skeleton.js.map +1 -0
  189. package/dist/components/MediaManager/MediaUploadBar.d.ts +7 -0
  190. package/dist/components/MediaManager/MediaUploadBar.d.ts.map +1 -0
  191. package/dist/components/MediaManager/MediaUploadBar.js +75 -0
  192. package/dist/components/MediaManager/MediaUploadBar.js.map +1 -0
  193. package/dist/components/StatusBadge.d.ts +1 -8
  194. package/dist/components/StatusBadge.d.ts.map +1 -1
  195. package/dist/components/StatusBadge.js +2 -49
  196. package/dist/components/StatusBadge.js.map +1 -1
  197. package/dist/components/skeletons/AdminGenericSkeleton.d.ts +7 -0
  198. package/dist/components/skeletons/AdminGenericSkeleton.d.ts.map +1 -0
  199. package/dist/components/skeletons/AdminGenericSkeleton.js +14 -0
  200. package/dist/components/skeletons/AdminGenericSkeleton.js.map +1 -0
  201. package/dist/components/skeletons/SectionSkeleton.d.ts +11 -0
  202. package/dist/components/skeletons/SectionSkeleton.d.ts.map +1 -0
  203. package/dist/components/skeletons/SectionSkeleton.js +26 -0
  204. package/dist/components/skeletons/SectionSkeleton.js.map +1 -0
  205. package/dist/components/skeletons/index.d.ts +11 -0
  206. package/dist/components/skeletons/index.d.ts.map +1 -0
  207. package/dist/components/skeletons/index.js +12 -0
  208. package/dist/components/skeletons/index.js.map +1 -0
  209. package/dist/components/skeletons/primitives.d.ts +17 -0
  210. package/dist/components/skeletons/primitives.d.ts.map +1 -0
  211. package/dist/components/skeletons/primitives.js +34 -0
  212. package/dist/components/skeletons/primitives.js.map +1 -0
  213. package/dist/components/ui/avatar-stack.d.ts +13 -0
  214. package/dist/components/ui/avatar-stack.d.ts.map +1 -0
  215. package/dist/components/ui/avatar-stack.js +27 -0
  216. package/dist/components/ui/avatar-stack.js.map +1 -0
  217. package/dist/components/ui/banner.d.ts +13 -0
  218. package/dist/components/ui/banner.d.ts.map +1 -0
  219. package/dist/components/ui/banner.js +24 -0
  220. package/dist/components/ui/banner.js.map +1 -0
  221. package/dist/components/ui/branch-chip.d.ts +7 -0
  222. package/dist/components/ui/branch-chip.d.ts.map +1 -0
  223. package/dist/components/ui/branch-chip.js +58 -0
  224. package/dist/components/ui/branch-chip.js.map +1 -0
  225. package/dist/components/ui/button.d.ts +4 -2
  226. package/dist/components/ui/button.d.ts.map +1 -1
  227. package/dist/components/ui/button.js +30 -12
  228. package/dist/components/ui/button.js.map +1 -1
  229. package/dist/components/ui/chip.d.ts +7 -0
  230. package/dist/components/ui/chip.d.ts.map +1 -0
  231. package/dist/components/ui/chip.js +44 -0
  232. package/dist/components/ui/chip.js.map +1 -0
  233. package/dist/components/ui/dropdown-menu.d.ts.map +1 -1
  234. package/dist/components/ui/dropdown-menu.js +14 -8
  235. package/dist/components/ui/dropdown-menu.js.map +1 -1
  236. package/dist/components/ui/empty.d.ts +11 -0
  237. package/dist/components/ui/empty.d.ts.map +1 -0
  238. package/dist/components/ui/empty.js +24 -0
  239. package/dist/components/ui/empty.js.map +1 -0
  240. package/dist/components/ui/field.d.ts +17 -0
  241. package/dist/components/ui/field.d.ts.map +1 -0
  242. package/dist/components/ui/field.js +52 -0
  243. package/dist/components/ui/field.js.map +1 -0
  244. package/dist/components/ui/index.d.ts +16 -0
  245. package/dist/components/ui/index.d.ts.map +1 -1
  246. package/dist/components/ui/index.js +25 -0
  247. package/dist/components/ui/index.js.map +1 -1
  248. package/dist/components/ui/input.d.ts +5 -1
  249. package/dist/components/ui/input.d.ts.map +1 -1
  250. package/dist/components/ui/input.js +26 -3
  251. package/dist/components/ui/input.js.map +1 -1
  252. package/dist/components/ui/kbd.d.ts +3 -0
  253. package/dist/components/ui/kbd.d.ts.map +1 -0
  254. package/dist/components/ui/kbd.js +30 -0
  255. package/dist/components/ui/kbd.js.map +1 -0
  256. package/dist/components/ui/publish-button.d.ts +7 -0
  257. package/dist/components/ui/publish-button.d.ts.map +1 -0
  258. package/dist/components/ui/publish-button.js +50 -0
  259. package/dist/components/ui/publish-button.js.map +1 -0
  260. package/dist/components/ui/select.js +4 -4
  261. package/dist/components/ui/select.js.map +1 -1
  262. package/dist/components/ui/status-badge.d.ts +15 -0
  263. package/dist/components/ui/status-badge.d.ts.map +1 -0
  264. package/dist/components/ui/status-badge.js +60 -0
  265. package/dist/components/ui/status-badge.js.map +1 -0
  266. package/dist/components/ui/tabs-pill.d.ts +17 -0
  267. package/dist/components/ui/tabs-pill.d.ts.map +1 -0
  268. package/dist/components/ui/tabs-pill.js +67 -0
  269. package/dist/components/ui/tabs-pill.js.map +1 -0
  270. package/dist/components/ui/textarea.d.ts +6 -0
  271. package/dist/components/ui/textarea.d.ts.map +1 -0
  272. package/dist/components/ui/textarea.js +25 -0
  273. package/dist/components/ui/textarea.js.map +1 -0
  274. package/dist/components/ui/toast-card.d.ts +15 -0
  275. package/dist/components/ui/toast-card.d.ts.map +1 -0
  276. package/dist/components/ui/toast-card.js +90 -0
  277. package/dist/components/ui/toast-card.js.map +1 -0
  278. package/dist/components/ui/toast.js +1 -1
  279. package/dist/components/ui/toast.js.map +1 -1
  280. package/dist/globals.css +378 -131
  281. package/dist/hooks/useMediaCustomFolders.d.ts +13 -0
  282. package/dist/hooks/useMediaCustomFolders.d.ts.map +1 -0
  283. package/dist/hooks/useMediaCustomFolders.js +53 -0
  284. package/dist/hooks/useMediaCustomFolders.js.map +1 -0
  285. package/dist/{init-PSAF5XNZ.js → init-IKO4CU7H.js} +5 -2
  286. package/dist/init-IKO4CU7H.js.map +1 -0
  287. package/dist/lib/entryEditUrl.d.ts +10 -0
  288. package/dist/lib/entryEditUrl.d.ts.map +1 -0
  289. package/dist/lib/entryEditUrl.js +9 -0
  290. package/dist/lib/entryEditUrl.js.map +1 -0
  291. package/dist/lib/searchIndex.d.ts +13 -0
  292. package/dist/lib/searchIndex.d.ts.map +1 -1
  293. package/dist/lib/searchIndex.js +7 -2
  294. package/dist/lib/searchIndex.js.map +1 -1
  295. package/dist/types.cjs.map +1 -1
  296. package/dist/types.d.ts +7 -0
  297. package/dist/types.d.ts.map +1 -1
  298. package/dist/{update-B37MPMDP.js → update-GBKBWOJX.js} +72 -31
  299. package/dist/update-GBKBWOJX.js.map +1 -0
  300. package/dist/utils/formatUpdatedAt.d.ts +2 -0
  301. package/dist/utils/formatUpdatedAt.d.ts.map +1 -0
  302. package/dist/utils/formatUpdatedAt.js +16 -0
  303. package/dist/utils/formatUpdatedAt.js.map +1 -0
  304. package/docs/editing-schema.md +4 -4
  305. package/docs/overview.md +1 -1
  306. package/globals.css +378 -131
  307. package/package.json +6 -1
  308. package/dist/admin/pages/SearchPage.d.ts +0 -2
  309. package/dist/admin/pages/SearchPage.d.ts.map +0 -1
  310. package/dist/admin/pages/SearchPage.js +0 -20
  311. package/dist/admin/pages/SearchPage.js.map +0 -1
  312. package/dist/chunk-VTZ2KGUU.js.map +0 -1
  313. package/dist/components/CMSSidebar/CMSSidebar.d.ts +0 -2
  314. package/dist/components/CMSSidebar/CMSSidebar.d.ts.map +0 -1
  315. package/dist/components/CMSSidebar/CMSSidebar.js +0 -104
  316. package/dist/components/CMSSidebar/CMSSidebar.js.map +0 -1
  317. package/dist/components/Header/Header.d.ts +0 -6
  318. package/dist/components/Header/Header.d.ts.map +0 -1
  319. package/dist/components/Header/Header.js +0 -318
  320. package/dist/components/Header/Header.js.map +0 -1
  321. package/dist/components/SearchPage.d.ts +0 -2
  322. package/dist/components/SearchPage.d.ts.map +0 -1
  323. package/dist/components/SearchPage.js +0 -97
  324. package/dist/components/SearchPage.js.map +0 -1
  325. package/dist/init-PSAF5XNZ.js.map +0 -1
  326. package/dist/update-B37MPMDP.js.map +0 -1
  327. /package/dist/{agentDocs-YTR2WM5C.js.map → agentDocs-L4RLZCYK.js.map} +0 -0
@@ -4,22 +4,26 @@ type AdminAppProps = {
4
4
  }>;
5
5
  };
6
6
  /**
7
- * Catch-all admin router component. Mount this as the default export of a
8
- * Next.js optional catch-all route at `src/app/cms/[[...path]]/page.tsx`:
9
- *
10
- * export { AdminApp as default } from 'octocms/admin/AdminApp';
7
+ * Catch-all admin router. Mounted via a single `src/app/cms/[[...path]]/page.tsx`
8
+ * file in the user app that re-exports this component as the default.
11
9
  *
12
10
  * Route segments map to admin pages:
13
- * /cms → DashboardPage
14
- * /cms/chat ChatPage (gated on `isAgentEnabled(agentConfig)`)
15
- * /cms/search SearchPage
16
- * /cms/media MediaPage (library)
17
- * /cms/media/<id> MediaPage with that asset selected (detail panel)
18
- * /cms/content-model ContentModelPage
19
- * /cms/content-model/<type>→ ContentTypePage
20
- * /cms/<type> CollectionPage
21
- * /cms/<type>/<id>→ EntryPage
11
+ * /cms → DashboardPage (empty home)
12
+ * /cms/content ContentPage (all entries)
13
+ * /cms/content/<type> CollectionPage
14
+ * /cms/content/<type>/<id> EntryPage
15
+ * /cms/chat ChatPage (gated on `isAgentEnabled(agentConfig)`)
16
+ * /cms/media MediaPage (library — grid + folders)
17
+ * /cms/media/<id> → MediaAssetPage (full-page asset editor)
18
+ * /cms/model ContentModelPage
19
+ * /cms/model/<type> → ContentTypePage
20
+ *
21
+ * Streaming model: each branch wraps its page in `<Suspense fallback={<MatchingSkeleton/>}>`.
22
+ * There is **no outer Suspense** around AdminApp itself — Next.js's
23
+ * navigation hold-over keeps the previous page rendered until the new one's
24
+ * `await params` resolves, so the user never sees a generic-shimmer flash
25
+ * between sub-routes. Only the inner per-page skeleton is ever visible.
22
26
  */
23
- export declare function AdminApp({ params }: AdminAppProps): import("react/jsx-runtime").JSX.Element;
27
+ export declare function AdminApp({ params }: AdminAppProps): Promise<import("react/jsx-runtime").JSX.Element>;
24
28
  export {};
25
29
  //# sourceMappingURL=AdminApp.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdminApp.d.ts","sourceRoot":"","sources":["../../admin/AdminApp.tsx"],"names":[],"mappings":"AAWA,KAAK,aAAa,GAAG;IACnB,MAAM,EAAE,OAAO,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CACtC,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,aAAa,2CAMjD"}
1
+ {"version":3,"file":"AdminApp.d.ts","sourceRoot":"","sources":["../../admin/AdminApp.tsx"],"names":[],"mappings":"AAsBA,KAAK,aAAa,GAAG;IACnB,MAAM,EAAE,OAAO,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CACtC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,aAAa,oDAyEvD"}
@@ -1,46 +1,59 @@
1
1
  import "../chunk-B5LE2OEC.js";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  import { Suspense } from "react";
4
+ import { ChatPageSkeleton } from "../components/Chat/ChatPage.skeleton";
5
+ import { ContentModelListSkeleton } from "../components/ContentModel/ContentModelList.skeleton";
6
+ import { ContentTypeDetailSkeleton } from "../components/ContentModel/ContentTypeDetail.skeleton";
7
+ import { DashboardCollectionSkeleton } from "../components/Dashboard/DashboardContent.collection.skeleton";
8
+ import { DashboardContentSkeleton } from "../components/Dashboard/DashboardContent.skeleton";
9
+ import { DashboardListSkeleton } from "../components/Dashboard/DashboardContent.list.skeleton";
10
+ import { EditPostSkeleton } from "../components/EditPost/EditPost.skeleton";
11
+ import { MediaAssetSkeleton } from "../components/MediaAsset/MediaAsset.skeleton";
12
+ import { MediaManagerSkeleton } from "../components/MediaManager/MediaManager.skeleton";
4
13
  import { ChatPage } from "./pages/ChatPage";
5
14
  import { CollectionPage } from "./pages/CollectionPage";
6
15
  import { ContentModelPage } from "./pages/ContentModelPage";
16
+ import { ContentPage } from "./pages/ContentPage";
7
17
  import { ContentTypePage } from "./pages/ContentTypePage";
8
18
  import { DashboardPage } from "./pages/DashboardPage";
9
19
  import { EntryPage } from "./pages/EntryPage";
20
+ import { MediaAssetPage } from "./pages/MediaAssetPage";
10
21
  import { MediaPage } from "./pages/MediaPage";
11
- import { SearchPage } from "./pages/SearchPage";
12
- function AdminApp({ params }) {
13
- return /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(AdminAppRouter, { params }) });
14
- }
15
- async function AdminAppRouter({ params }) {
22
+ async function AdminApp({ params }) {
16
23
  const { path } = await params;
17
24
  const segments = path != null ? path : [];
18
25
  if (segments.length === 0) {
19
26
  return /* @__PURE__ */ jsx(DashboardPage, {});
20
27
  }
21
- if (segments[0] === "search") {
22
- return /* @__PURE__ */ jsx(SearchPage, {});
23
- }
24
28
  if (segments[0] === "chat") {
25
- return /* @__PURE__ */ jsx(ChatPage, {});
29
+ return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(ChatPageSkeleton, {}), children: /* @__PURE__ */ jsx(ChatPage, {}) });
26
30
  }
27
31
  if (segments[0] === "media") {
28
- const initialMediaId = segments.length >= 2 ? segments[1] : void 0;
29
- return /* @__PURE__ */ jsx(MediaPage, { initialMediaId });
32
+ if (segments.length === 1) {
33
+ return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(MediaManagerSkeleton, {}), children: /* @__PURE__ */ jsx(MediaPage, {}) });
34
+ }
35
+ const id = segments[1];
36
+ return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(MediaAssetSkeleton, {}), children: /* @__PURE__ */ jsx(MediaAssetPage, { id }) }, id);
30
37
  }
31
- if (segments[0] === "content-model") {
38
+ if (segments[0] === "model") {
32
39
  if (segments.length === 1) {
33
- return /* @__PURE__ */ jsx(ContentModelPage, {});
40
+ return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(ContentModelListSkeleton, {}), children: /* @__PURE__ */ jsx(ContentModelPage, {}) });
34
41
  }
35
- const [, type2] = segments;
36
- return /* @__PURE__ */ jsx(ContentTypePage, { type: type2 });
42
+ const [, type] = segments;
43
+ return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(ContentTypeDetailSkeleton, {}), children: /* @__PURE__ */ jsx(ContentTypePage, { type }) }, type);
37
44
  }
38
- if (segments.length === 1) {
39
- const [type2] = segments;
40
- return /* @__PURE__ */ jsx(CollectionPage, { params: Promise.resolve({ type: type2 }) });
45
+ if (segments[0] === "content") {
46
+ if (segments.length === 1) {
47
+ return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(DashboardListSkeleton, {}), children: /* @__PURE__ */ jsx(ContentPage, {}) });
48
+ }
49
+ if (segments.length === 2) {
50
+ const [, type2] = segments;
51
+ return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(DashboardCollectionSkeleton, {}), children: /* @__PURE__ */ jsx(CollectionPage, { params: Promise.resolve({ type: type2 }) }) }, type2);
52
+ }
53
+ const [, type, id] = segments;
54
+ return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(EditPostSkeleton, {}), children: /* @__PURE__ */ jsx(EntryPage, { params: Promise.resolve({ type, id }) }) }, `${type}/${id}`);
41
55
  }
42
- const [type, id] = segments;
43
- return /* @__PURE__ */ jsx(EntryPage, { params: Promise.resolve({ type, id }) });
56
+ return /* @__PURE__ */ jsx(DashboardContentSkeleton, {});
44
57
  }
45
58
  export {
46
59
  AdminApp
@@ -1 +1 @@
1
- {"version":3,"sources":["../../admin/AdminApp.tsx"],"sourcesContent":["import React, { Suspense } from 'react';\n\nimport { ChatPage } from './pages/ChatPage';\nimport { CollectionPage } from './pages/CollectionPage';\nimport { ContentModelPage } from './pages/ContentModelPage';\nimport { ContentTypePage } from './pages/ContentTypePage';\nimport { DashboardPage } from './pages/DashboardPage';\nimport { EntryPage } from './pages/EntryPage';\nimport { MediaPage } from './pages/MediaPage';\nimport { SearchPage } from './pages/SearchPage';\n\ntype AdminAppProps = {\n params: Promise<{ path?: string[] }>;\n};\n\n/**\n * Catch-all admin router component. Mount this as the default export of a\n * Next.js optional catch-all route at `src/app/cms/[[...path]]/page.tsx`:\n *\n * export { AdminApp as default } from 'octocms/admin/AdminApp';\n *\n * Route segments map to admin pages:\n * /cms → DashboardPage\n * /cms/chat ChatPage (gated on `isAgentEnabled(agentConfig)`)\n * /cms/search SearchPage\n * /cms/media MediaPage (library)\n * /cms/media/<id> → MediaPage with that asset selected (detail panel)\n * /cms/content-model ContentModelPage\n * /cms/content-model/<type>→ ContentTypePage\n * /cms/<type> CollectionPage\n * /cms/<type>/<id>→ EntryPage\n */\nexport function AdminApp({ params }: AdminAppProps) {\n return (\n <Suspense fallback={null}>\n <AdminAppRouter params={params} />\n </Suspense>\n );\n}\n\nasync function AdminAppRouter({ params }: AdminAppProps) {\n const { path } = await params;\n const segments = path ?? [];\n\n if (segments.length === 0) {\n return <DashboardPage />;\n }\n\n if (segments[0] === 'search') {\n return <SearchPage />;\n }\n\n if (segments[0] === 'chat') {\n return <ChatPage />;\n }\n\n if (segments[0] === 'media') {\n const initialMediaId = segments.length >= 2 ? segments[1] : undefined;\n return <MediaPage initialMediaId={initialMediaId} />;\n }\n\n if (segments[0] === 'content-model') {\n if (segments.length === 1) {\n return <ContentModelPage />;\n }\n const [, type] = segments;\n return <ContentTypePage type={type} />;\n }\n\n if (segments.length === 1) {\n const [type] = segments;\n return <CollectionPage params={Promise.resolve({ type })} />;\n }\n\n const [type, id] = segments;\n return <EntryPage params={Promise.resolve({ type, id })} />;\n}\n"],"mappings":";AAmCM;AAnCN,SAAgB,gBAAgB;AAEhC,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AACjC,SAAS,uBAAuB;AAChC,SAAS,qBAAqB;AAC9B,SAAS,iBAAiB;AAC1B,SAAS,iBAAiB;AAC1B,SAAS,kBAAkB;AAuBpB,SAAS,SAAS,EAAE,OAAO,GAAkB;AAClD,SACE,oBAAC,YAAS,UAAU,MAClB,8BAAC,kBAAe,QAAgB,GAClC;AAEJ;AAEA,eAAe,eAAe,EAAE,OAAO,GAAkB;AACvD,QAAM,EAAE,KAAK,IAAI,MAAM;AACvB,QAAM,WAAW,sBAAQ,CAAC;AAE1B,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,oBAAC,iBAAc;AAAA,EACxB;AAEA,MAAI,SAAS,CAAC,MAAM,UAAU;AAC5B,WAAO,oBAAC,cAAW;AAAA,EACrB;AAEA,MAAI,SAAS,CAAC,MAAM,QAAQ;AAC1B,WAAO,oBAAC,YAAS;AAAA,EACnB;AAEA,MAAI,SAAS,CAAC,MAAM,SAAS;AAC3B,UAAM,iBAAiB,SAAS,UAAU,IAAI,SAAS,CAAC,IAAI;AAC5D,WAAO,oBAAC,aAAU,gBAAgC;AAAA,EACpD;AAEA,MAAI,SAAS,CAAC,MAAM,iBAAiB;AACnC,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO,oBAAC,oBAAiB;AAAA,IAC3B;AACA,UAAM,CAAC,EAAEA,KAAI,IAAI;AACjB,WAAO,oBAAC,mBAAgB,MAAMA,OAAM;AAAA,EACtC;AAEA,MAAI,SAAS,WAAW,GAAG;AACzB,UAAM,CAACA,KAAI,IAAI;AACf,WAAO,oBAAC,kBAAe,QAAQ,QAAQ,QAAQ,EAAE,MAAAA,MAAK,CAAC,GAAG;AAAA,EAC5D;AAEA,QAAM,CAAC,MAAM,EAAE,IAAI;AACnB,SAAO,oBAAC,aAAU,QAAQ,QAAQ,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG;AAC3D;","names":["type"]}
1
+ {"version":3,"sources":["../../admin/AdminApp.tsx"],"sourcesContent":["import React, { Suspense } from 'react';\n\nimport { ChatPageSkeleton } from '../components/Chat/ChatPage.skeleton';\nimport { ContentModelListSkeleton } from '../components/ContentModel/ContentModelList.skeleton';\nimport { ContentTypeDetailSkeleton } from '../components/ContentModel/ContentTypeDetail.skeleton';\nimport { DashboardCollectionSkeleton } from '../components/Dashboard/DashboardContent.collection.skeleton';\nimport { DashboardContentSkeleton } from '../components/Dashboard/DashboardContent.skeleton';\nimport { DashboardListSkeleton } from '../components/Dashboard/DashboardContent.list.skeleton';\nimport { EditPostSkeleton } from '../components/EditPost/EditPost.skeleton';\nimport { MediaAssetSkeleton } from '../components/MediaAsset/MediaAsset.skeleton';\nimport { MediaManagerSkeleton } from '../components/MediaManager/MediaManager.skeleton';\n\nimport { ChatPage } from './pages/ChatPage';\nimport { CollectionPage } from './pages/CollectionPage';\nimport { ContentModelPage } from './pages/ContentModelPage';\nimport { ContentPage } from './pages/ContentPage';\nimport { ContentTypePage } from './pages/ContentTypePage';\nimport { DashboardPage } from './pages/DashboardPage';\nimport { EntryPage } from './pages/EntryPage';\nimport { MediaAssetPage } from './pages/MediaAssetPage';\nimport { MediaPage } from './pages/MediaPage';\n\ntype AdminAppProps = {\n params: Promise<{ path?: string[] }>;\n};\n\n/**\n * Catch-all admin router. Mounted via a single `src/app/cms/[[...path]]/page.tsx`\n * file in the user app that re-exports this component as the default.\n *\n * Route segments map to admin pages:\n * /cms → DashboardPage (empty home)\n * /cms/content ContentPage (all entries)\n * /cms/content/<type> CollectionPage\n * /cms/content/<type>/<id> EntryPage\n * /cms/chat → ChatPage (gated on `isAgentEnabled(agentConfig)`)\n * /cms/media → MediaPage (library grid + folders)\n * /cms/media/<id> MediaAssetPage (full-page asset editor)\n * /cms/model ContentModelPage\n * /cms/model/<type> ContentTypePage\n *\n * Streaming model: each branch wraps its page in `<Suspense fallback={<MatchingSkeleton/>}>`.\n * There is **no outer Suspense** around AdminApp itself — Next.js's\n * navigation hold-over keeps the previous page rendered until the new one's\n * `await params` resolves, so the user never sees a generic-shimmer flash\n * between sub-routes. Only the inner per-page skeleton is ever visible.\n */\nexport async function AdminApp({ params }: AdminAppProps) {\n const { path } = await params;\n const segments = path ?? [];\n\n if (segments.length === 0) {\n return <DashboardPage />;\n }\n\n if (segments[0] === 'chat') {\n return (\n <Suspense fallback={<ChatPageSkeleton />}>\n <ChatPage />\n </Suspense>\n );\n }\n\n if (segments[0] === 'media') {\n if (segments.length === 1) {\n return (\n <Suspense fallback={<MediaManagerSkeleton />}>\n <MediaPage />\n </Suspense>\n );\n }\n const id = segments[1];\n return (\n <Suspense fallback={<MediaAssetSkeleton />} key={id}>\n <MediaAssetPage id={id} />\n </Suspense>\n );\n }\n\n if (segments[0] === 'model') {\n if (segments.length === 1) {\n return (\n <Suspense fallback={<ContentModelListSkeleton />}>\n <ContentModelPage />\n </Suspense>\n );\n }\n const [, type] = segments;\n return (\n <Suspense fallback={<ContentTypeDetailSkeleton />} key={type}>\n <ContentTypePage type={type} />\n </Suspense>\n );\n }\n\n if (segments[0] === 'content') {\n if (segments.length === 1) {\n return (\n <Suspense fallback={<DashboardListSkeleton />}>\n <ContentPage />\n </Suspense>\n );\n }\n if (segments.length === 2) {\n const [, type] = segments;\n return (\n <Suspense fallback={<DashboardCollectionSkeleton />} key={type}>\n <CollectionPage params={Promise.resolve({ type })} />\n </Suspense>\n );\n }\n const [, type, id] = segments;\n return (\n <Suspense fallback={<EditPostSkeleton />} key={`${type}/${id}`}>\n <EntryPage params={Promise.resolve({ type, id })} />\n </Suspense>\n );\n }\n\n return <DashboardContentSkeleton />;\n}\n"],"mappings":";AAoDW;AApDX,SAAgB,gBAAgB;AAEhC,SAAS,wBAAwB;AACjC,SAAS,gCAAgC;AACzC,SAAS,iCAAiC;AAC1C,SAAS,mCAAmC;AAC5C,SAAS,gCAAgC;AACzC,SAAS,6BAA6B;AACtC,SAAS,wBAAwB;AACjC,SAAS,0BAA0B;AACnC,SAAS,4BAA4B;AAErC,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AACjC,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAChC,SAAS,qBAAqB;AAC9B,SAAS,iBAAiB;AAC1B,SAAS,sBAAsB;AAC/B,SAAS,iBAAiB;AA2B1B,eAAsB,SAAS,EAAE,OAAO,GAAkB;AACxD,QAAM,EAAE,KAAK,IAAI,MAAM;AACvB,QAAM,WAAW,sBAAQ,CAAC;AAE1B,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,oBAAC,iBAAc;AAAA,EACxB;AAEA,MAAI,SAAS,CAAC,MAAM,QAAQ;AAC1B,WACE,oBAAC,YAAS,UAAU,oBAAC,oBAAiB,GACpC,8BAAC,YAAS,GACZ;AAAA,EAEJ;AAEA,MAAI,SAAS,CAAC,MAAM,SAAS;AAC3B,QAAI,SAAS,WAAW,GAAG;AACzB,aACE,oBAAC,YAAS,UAAU,oBAAC,wBAAqB,GACxC,8BAAC,aAAU,GACb;AAAA,IAEJ;AACA,UAAM,KAAK,SAAS,CAAC;AACrB,WACE,oBAAC,YAAS,UAAU,oBAAC,sBAAmB,GACtC,8BAAC,kBAAe,IAAQ,KADuB,EAEjD;AAAA,EAEJ;AAEA,MAAI,SAAS,CAAC,MAAM,SAAS;AAC3B,QAAI,SAAS,WAAW,GAAG;AACzB,aACE,oBAAC,YAAS,UAAU,oBAAC,4BAAyB,GAC5C,8BAAC,oBAAiB,GACpB;AAAA,IAEJ;AACA,UAAM,CAAC,EAAE,IAAI,IAAI;AACjB,WACE,oBAAC,YAAS,UAAU,oBAAC,6BAA0B,GAC7C,8BAAC,mBAAgB,MAAY,KADyB,IAExD;AAAA,EAEJ;AAEA,MAAI,SAAS,CAAC,MAAM,WAAW;AAC7B,QAAI,SAAS,WAAW,GAAG;AACzB,aACE,oBAAC,YAAS,UAAU,oBAAC,yBAAsB,GACzC,8BAAC,eAAY,GACf;AAAA,IAEJ;AACA,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,CAAC,EAAEA,KAAI,IAAI;AACjB,aACE,oBAAC,YAAS,UAAU,oBAAC,+BAA4B,GAC/C,8BAAC,kBAAe,QAAQ,QAAQ,QAAQ,EAAE,MAAAA,MAAK,CAAC,GAAG,KADKA,KAE1D;AAAA,IAEJ;AACA,UAAM,CAAC,EAAE,MAAM,EAAE,IAAI;AACrB,WACE,oBAAC,YAAS,UAAU,oBAAC,oBAAiB,GACpC,8BAAC,aAAU,QAAQ,QAAQ,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,KADL,GAAG,IAAI,IAAI,EAAE,EAE5D;AAAA,EAEJ;AAEA,SAAO,oBAAC,4BAAyB;AACnC;","names":["type"]}
@@ -1 +1 @@
1
- {"version":3,"file":"entries.d.ts","sourceRoot":"","sources":["../../../admin/actions/entries.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;AAM9D,eAAO,MAAM,YAAY,GAAU,aAAY,MAAa,KAAG,OAAO,CAAC,aAAa,EAAE,CAoDrF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAU,oBAAoB,MAAM,KAAG,OAAO,CAAC,aAAa,EAAE,CAgE3F,CAAC"}
1
+ {"version":3,"file":"entries.d.ts","sourceRoot":"","sources":["../../../admin/actions/entries.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;AAO9D,eAAO,MAAM,YAAY,GAAU,aAAY,MAAa,KAAG,OAAO,CAAC,aAAa,EAAE,CAsFrF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAU,oBAAoB,MAAM,KAAG,OAAO,CAAC,aAAa,EAAE,CAgE3F,CAAC"}
@@ -5,12 +5,31 @@ import path from "path";
5
5
  import { getConfig } from "../../lib/configStore";
6
6
  import { getContentFiles, getFile } from "./files";
7
7
  import { isProductionMode } from "../github";
8
+ import { getMediaEntries } from "./media";
8
9
  import { getEntryTitleField } from "./utils";
9
10
  const getEntryList = async (collection = "**") => {
10
- var _a, _b, _c;
11
+ var _a, _b, _c, _d, _e;
11
12
  const config = getConfig();
12
13
  const files = await getContentFiles(collection);
13
14
  const entries = [];
15
+ const mediaList = await getMediaEntries().catch(() => []);
16
+ const mediaById = /* @__PURE__ */ new Map();
17
+ for (const m of mediaList) {
18
+ mediaById.set(m.id, { ext: m.extension, publicUrl: m.publicUrl });
19
+ }
20
+ const imageFieldKeyByType = /* @__PURE__ */ new Map();
21
+ function firstImageFieldKey(type) {
22
+ var _a2, _b2;
23
+ if (imageFieldKeyByType.has(type)) return (_a2 = imageFieldKeyByType.get(type)) != null ? _a2 : null;
24
+ const collection2 = config.collections[type];
25
+ if (!collection2) {
26
+ imageFieldKeyByType.set(type, null);
27
+ return null;
28
+ }
29
+ const key = (_b2 = Object.keys(collection2.fields).find((k) => collection2.fields[k].format === "image")) != null ? _b2 : null;
30
+ imageFieldKeyByType.set(type, key);
31
+ return key;
32
+ }
14
33
  for (const file of files) {
15
34
  const nameWithoutFolder = file.replace(`${config.contentFolder}/`, "").replace(".json", "");
16
35
  const parts = nameWithoutFolder.split("/");
@@ -20,6 +39,7 @@ const getEntryList = async (collection = "**") => {
20
39
  let title = id;
21
40
  let status = "merged";
22
41
  let updatedAt;
42
+ let thumbnailUrl;
23
43
  try {
24
44
  const content = await getFile(file);
25
45
  if (type === "media") {
@@ -31,13 +51,25 @@ const getEntryList = async (collection = "**") => {
31
51
  if (typeof mediaTitle === "string" && mediaTitle.trim() !== "") {
32
52
  title = mediaTitle.trim();
33
53
  }
34
- } else if (titleField && ((_b = content == null ? void 0 : content.fields) == null ? void 0 : _b[titleField])) {
35
- title = content.fields[titleField];
54
+ const ext = typeof ((_b = content == null ? void 0 : content.fields) == null ? void 0 : _b.extension) === "string" ? content.fields.extension : "";
55
+ if (ext) thumbnailUrl = `/media/${id}.${ext}`;
56
+ } else {
57
+ if (titleField && ((_c = content == null ? void 0 : content.fields) == null ? void 0 : _c[titleField])) {
58
+ title = content.fields[titleField];
59
+ }
60
+ const imgKey = firstImageFieldKey(type);
61
+ if (imgKey) {
62
+ const value = (_d = content == null ? void 0 : content.fields) == null ? void 0 : _d[imgKey];
63
+ if (typeof value === "string" && value.trim()) {
64
+ const hit = mediaById.get(value.trim());
65
+ if (hit) thumbnailUrl = hit.publicUrl;
66
+ }
67
+ }
36
68
  }
37
- if ((_c = content == null ? void 0 : content.sys) == null ? void 0 : _c.status) {
69
+ if ((_e = content == null ? void 0 : content.sys) == null ? void 0 : _e.status) {
38
70
  status = content.sys.status;
39
71
  }
40
- } catch (_e) {
72
+ } catch (_e2) {
41
73
  }
42
74
  if (!isProductionMode()) {
43
75
  try {
@@ -46,7 +78,7 @@ const getEntryList = async (collection = "**") => {
46
78
  } catch (e) {
47
79
  }
48
80
  }
49
- entries.push({ type, id, path: file, title, status, updatedAt });
81
+ entries.push({ type, id, path: file, title, status, updatedAt, thumbnailUrl });
50
82
  }
51
83
  entries.sort((a, b) => a.title.localeCompare(b.title));
52
84
  return entries;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../admin/actions/entries.ts"],"sourcesContent":["'use server';\n\nimport fsPromises from 'fs/promises';\nimport path from 'path';\n\nimport { getConfig } from '../../lib/configStore';\nimport type { Config } from '../types';\nimport type { EntryListItem, EntryStatus } from '../../types';\n\nimport { getContentFiles, getFile } from './files';\nimport { isProductionMode } from '../github';\nimport { getEntryTitleField } from './utils';\n\nexport const getEntryList = async (collection: string = '**'): Promise<EntryListItem[]> => {\n const config = getConfig();\n const files = await getContentFiles(collection);\n const entries: EntryListItem[] = [];\n\n for (const file of files) {\n const nameWithoutFolder = file.replace(`${config.contentFolder}/`, '').replace('.json', '');\n const parts = nameWithoutFolder.split('/');\n const type = parts[0];\n let id = parts[parts.length - 1];\n const titleField = getEntryTitleField(type);\n\n let title = id;\n let status: EntryStatus = 'merged';\n let updatedAt: string | undefined;\n\n try {\n const content = await getFile(file);\n\n if (type === 'media') {\n const sysId = content?.sys && typeof content.sys === 'object' && 'id' in content.sys ? content.sys.id : null;\n if (typeof sysId === 'string' && sysId !== '') {\n id = sysId;\n }\n const mediaTitle = content?.fields?.title;\n if (typeof mediaTitle === 'string' && mediaTitle.trim() !== '') {\n title = mediaTitle.trim();\n }\n } else if (titleField && content?.fields?.[titleField]) {\n title = content.fields[titleField];\n }\n if (content?.sys?.status) {\n status = content.sys.status;\n }\n } catch (_e) {\n // Fall back to id as title\n }\n\n if (!isProductionMode()) {\n try {\n const stat = await fsPromises.stat(path.join(process.cwd(), file));\n updatedAt = stat.mtime.toISOString();\n } catch {\n // ignore\n }\n }\n\n entries.push({ type, id, path: file, title, status, updatedAt });\n }\n\n entries.sort((a, b) => a.title.localeCompare(b.title));\n return entries;\n};\n\n/**\n * Find all content entries that reference the given entry via reference fields.\n * Returns entries that contain `targetReferenceKey` in any reference field value.\n */\nexport const getEntryBacklinks = async (targetReferenceKey: string): Promise<EntryListItem[]> => {\n const config = getConfig();\n const allFiles = await getContentFiles('**');\n const backlinks: EntryListItem[] = [];\n\n for (const file of allFiles) {\n // Skip media entries\n if (file.includes('/media/')) continue;\n\n try {\n const content = await getFile(file);\n const type = content?.sys?.type;\n if (!type) continue;\n\n const collection = config.collections[type as keyof Config['collections']];\n if (!collection) continue;\n\n const referenceFieldKeys = Object.keys(collection.fields).filter(\n (k) => collection.fields[k].format === 'reference',\n );\n if (referenceFieldKeys.length === 0) continue;\n\n let found = false;\n for (const fieldKey of referenceFieldKeys) {\n const fieldValue = content?.fields?.[fieldKey];\n if (!fieldValue) continue;\n\n // Reference values can be a single string (cardinality 'one') or a JSON array string (cardinality 'many')\n let keys: string[] = [];\n if (typeof fieldValue === 'string') {\n try {\n const parsed = JSON.parse(fieldValue);\n keys = Array.isArray(parsed) ? parsed : [fieldValue];\n } catch {\n keys = [fieldValue];\n }\n } else if (Array.isArray(fieldValue)) {\n keys = fieldValue;\n }\n\n if (keys.includes(targetReferenceKey)) {\n found = true;\n break;\n }\n }\n\n if (found) {\n const nameWithoutFolder = file.replace(`${config.contentFolder}/`, '').replace('.json', '');\n const parts = nameWithoutFolder.split('/');\n const id = parts[parts.length - 1];\n const titleField = getEntryTitleField(type);\n let title = id;\n if (titleField && content?.fields?.[titleField]) {\n title = content.fields[titleField];\n }\n const status: EntryStatus = content?.sys?.status || 'merged';\n backlinks.push({ type, id, path: file, title, status });\n }\n } catch (_e) {\n // Skip files that can't be read\n }\n }\n\n return backlinks;\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../admin/actions/entries.ts"],"sourcesContent":["'use server';\n\nimport fsPromises from 'fs/promises';\nimport path from 'path';\n\nimport { getConfig } from '../../lib/configStore';\nimport type { Config } from '../types';\nimport type { EntryListItem, EntryStatus } from '../../types';\n\nimport { getContentFiles, getFile } from './files';\nimport { isProductionMode } from '../github';\nimport { getMediaEntries } from './media';\nimport { getEntryTitleField } from './utils';\n\nexport const getEntryList = async (collection: string = '**'): Promise<EntryListItem[]> => {\n const config = getConfig();\n const files = await getContentFiles(collection);\n const entries: EntryListItem[] = [];\n\n // Build a media lookup so we can resolve thumbnail URLs for any entry that\n // has an `image` field. One batched call regardless of entry count.\n const mediaList = await getMediaEntries().catch(() => []);\n const mediaById = new Map<string, { ext: string; publicUrl: string }>();\n for (const m of mediaList) {\n mediaById.set(m.id, { ext: m.extension, publicUrl: m.publicUrl });\n }\n\n const imageFieldKeyByType = new Map<string, string | null>();\n function firstImageFieldKey(type: string): string | null {\n if (imageFieldKeyByType.has(type)) return imageFieldKeyByType.get(type) ?? null;\n const collection = (config as Config).collections[type as keyof Config['collections']];\n if (!collection) {\n imageFieldKeyByType.set(type, null);\n return null;\n }\n const key = Object.keys(collection.fields).find((k) => collection.fields[k].format === 'image') ?? null;\n imageFieldKeyByType.set(type, key);\n return key;\n }\n\n for (const file of files) {\n const nameWithoutFolder = file.replace(`${config.contentFolder}/`, '').replace('.json', '');\n const parts = nameWithoutFolder.split('/');\n const type = parts[0];\n let id = parts[parts.length - 1];\n const titleField = getEntryTitleField(type);\n\n let title = id;\n let status: EntryStatus = 'merged';\n let updatedAt: string | undefined;\n let thumbnailUrl: string | undefined;\n\n try {\n const content = await getFile(file);\n\n if (type === 'media') {\n const sysId = content?.sys && typeof content.sys === 'object' && 'id' in content.sys ? content.sys.id : null;\n if (typeof sysId === 'string' && sysId !== '') {\n id = sysId;\n }\n const mediaTitle = content?.fields?.title;\n if (typeof mediaTitle === 'string' && mediaTitle.trim() !== '') {\n title = mediaTitle.trim();\n }\n const ext = typeof content?.fields?.extension === 'string' ? content.fields.extension : '';\n if (ext) thumbnailUrl = `/media/${id}.${ext}`;\n } else {\n if (titleField && content?.fields?.[titleField]) {\n title = content.fields[titleField];\n }\n const imgKey = firstImageFieldKey(type);\n if (imgKey) {\n const value = content?.fields?.[imgKey];\n if (typeof value === 'string' && value.trim()) {\n const hit = mediaById.get(value.trim());\n if (hit) thumbnailUrl = hit.publicUrl;\n }\n }\n }\n if (content?.sys?.status) {\n status = content.sys.status;\n }\n } catch (_e) {\n // Fall back to id as title\n }\n\n if (!isProductionMode()) {\n try {\n const stat = await fsPromises.stat(path.join(process.cwd(), file));\n updatedAt = stat.mtime.toISOString();\n } catch {\n // ignore\n }\n }\n\n entries.push({ type, id, path: file, title, status, updatedAt, thumbnailUrl });\n }\n\n entries.sort((a, b) => a.title.localeCompare(b.title));\n return entries;\n};\n\n/**\n * Find all content entries that reference the given entry via reference fields.\n * Returns entries that contain `targetReferenceKey` in any reference field value.\n */\nexport const getEntryBacklinks = async (targetReferenceKey: string): Promise<EntryListItem[]> => {\n const config = getConfig();\n const allFiles = await getContentFiles('**');\n const backlinks: EntryListItem[] = [];\n\n for (const file of allFiles) {\n // Skip media entries\n if (file.includes('/media/')) continue;\n\n try {\n const content = await getFile(file);\n const type = content?.sys?.type;\n if (!type) continue;\n\n const collection = config.collections[type as keyof Config['collections']];\n if (!collection) continue;\n\n const referenceFieldKeys = Object.keys(collection.fields).filter(\n (k) => collection.fields[k].format === 'reference',\n );\n if (referenceFieldKeys.length === 0) continue;\n\n let found = false;\n for (const fieldKey of referenceFieldKeys) {\n const fieldValue = content?.fields?.[fieldKey];\n if (!fieldValue) continue;\n\n // Reference values can be a single string (cardinality 'one') or a JSON array string (cardinality 'many')\n let keys: string[] = [];\n if (typeof fieldValue === 'string') {\n try {\n const parsed = JSON.parse(fieldValue);\n keys = Array.isArray(parsed) ? parsed : [fieldValue];\n } catch {\n keys = [fieldValue];\n }\n } else if (Array.isArray(fieldValue)) {\n keys = fieldValue;\n }\n\n if (keys.includes(targetReferenceKey)) {\n found = true;\n break;\n }\n }\n\n if (found) {\n const nameWithoutFolder = file.replace(`${config.contentFolder}/`, '').replace('.json', '');\n const parts = nameWithoutFolder.split('/');\n const id = parts[parts.length - 1];\n const titleField = getEntryTitleField(type);\n let title = id;\n if (titleField && content?.fields?.[titleField]) {\n title = content.fields[titleField];\n }\n const status: EntryStatus = content?.sys?.status || 'merged';\n backlinks.push({ type, id, path: file, title, status });\n }\n } catch (_e) {\n // Skip files that can't be read\n }\n }\n\n return backlinks;\n};\n"],"mappings":"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","names":["_a","_b","collection","_e"]}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Public admin barrel — the npm-style entry point that user apps import from.
3
+ *
4
+ * Wired in `src/app/cms/[[...path]]/page.tsx` (catch-all default export),
5
+ * `src/app/cms/layout.tsx` (default export + metadata), and
6
+ * `src/app/cms/error.tsx` (default export). The CLI scaffolds those three
7
+ * thin re-export files; everything else lives inside the package.
8
+ */
9
+ export { AdminApp } from './AdminApp';
10
+ export { AdminLayout, metadata } from './pages/AdminLayout';
11
+ export { AdminError, AdminErrorView } from './pages/AdminErrorView';
12
+ export type { AdminErrorViewProps } from './pages/AdminErrorView';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../admin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACpE,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import "../chunk-B5LE2OEC.js";
2
+ import { AdminApp } from "./AdminApp";
3
+ import { AdminLayout, metadata } from "./pages/AdminLayout";
4
+ import { AdminError, AdminErrorView } from "./pages/AdminErrorView";
5
+ export {
6
+ AdminApp,
7
+ AdminError,
8
+ AdminErrorView,
9
+ AdminLayout,
10
+ metadata
11
+ };
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../admin/index.ts"],"sourcesContent":["/**\n * Public admin barrel — the npm-style entry point that user apps import from.\n *\n * Wired in `src/app/cms/[[...path]]/page.tsx` (catch-all default export),\n * `src/app/cms/layout.tsx` (default export + metadata), and\n * `src/app/cms/error.tsx` (default export). The CLI scaffolds those three\n * thin re-export files; everything else lives inside the package.\n */\nexport { AdminApp } from './AdminApp';\nexport { AdminLayout, metadata } from './pages/AdminLayout';\nexport { AdminError, AdminErrorView } from './pages/AdminErrorView';\nexport type { AdminErrorViewProps } from './pages/AdminErrorView';\n"],"mappings":";AAQA,SAAS,gBAAgB;AACzB,SAAS,aAAa,gBAAgB;AACtC,SAAS,YAAY,sBAAsB;","names":[]}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Drop-in `error.tsx` body for the admin catch-all. Receives Next.js's
3
+ * standard `{ error, reset }` props and renders the shared `AdminErrorView`.
4
+ *
5
+ * Wired into the user app via a one-line re-export:
6
+ * `export { AdminError as default } from 'octocms/admin'`
7
+ */
8
+ export declare function AdminError({ error, reset }: {
9
+ error: Error & {
10
+ digest?: string;
11
+ };
12
+ reset: () => void;
13
+ }): import("react/jsx-runtime").JSX.Element;
14
+ export type AdminErrorViewProps = {
15
+ error: Error & {
16
+ digest?: string;
17
+ };
18
+ reset: () => void;
19
+ /** Section title shown above the message. Defaults to "Something went wrong". */
20
+ title?: string;
21
+ /** Optional href for the secondary "Back" button. Defaults to /cms. */
22
+ backHref?: string;
23
+ /** Optional label for the secondary button. Defaults to "Dashboard". */
24
+ backLabel?: string;
25
+ };
26
+ /**
27
+ * Shared admin error view used by every per-segment `error.tsx` file under
28
+ * `src/app/cms/`. Reuses the GitHub-aware copy logic from the existing root
29
+ * error boundary in `src/app/error.tsx`, but inside the admin chrome.
30
+ */
31
+ export declare function AdminErrorView({ error, reset, title, backHref, backLabel, }: AdminErrorViewProps): import("react/jsx-runtime").JSX.Element;
32
+ //# sourceMappingURL=AdminErrorView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminErrorView.d.ts","sourceRoot":"","sources":["../../../admin/pages/AdminErrorView.tsx"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,KAAK,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,2CAErG;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,KAAK,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,KAAK,EACL,KAA8B,EAC9B,QAAiB,EACjB,SAAuB,GACxB,EAAE,mBAAmB,2CAmCrB"}
@@ -0,0 +1,40 @@
1
+ "use client";
2
+ import "../../chunk-B5LE2OEC.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { Button } from "../../components/ui/button";
5
+ import { isContentSourceError, parseContentSourceFromMessage } from "../../lib/contentSourceError";
6
+ function AdminError({ error, reset }) {
7
+ return /* @__PURE__ */ jsx(AdminErrorView, { error, reset });
8
+ }
9
+ function AdminErrorView({
10
+ error,
11
+ reset,
12
+ title = "Something went wrong",
13
+ backHref = "/cms",
14
+ backLabel = "Dashboard"
15
+ }) {
16
+ var _a, _b;
17
+ const fromInstance = isContentSourceError(error) ? { userMessage: error.userMessage, code: error.code } : null;
18
+ const fromMessage = parseContentSourceFromMessage(error.message);
19
+ const userMessage = (_a = fromInstance == null ? void 0 : fromInstance.userMessage) != null ? _a : fromMessage == null ? void 0 : fromMessage.userMessage;
20
+ const code = (_b = fromInstance == null ? void 0 : fromInstance.code) != null ? _b : fromMessage == null ? void 0 : fromMessage.code;
21
+ const isAvailability = code === "github_unavailable" || code === "github_rate_limit";
22
+ return /* @__PURE__ */ jsx("div", { className: "flex flex-1 items-center justify-center bg-muted/20 p-6", children: /* @__PURE__ */ jsxs("div", { className: "w-full max-w-lg rounded-xl border border-border bg-background p-6 shadow-sm", children: [
23
+ /* @__PURE__ */ jsx("h2", { className: "text-base font-semibold tracking-tight text-foreground", children: title }),
24
+ userMessage ? /* @__PURE__ */ jsx("p", { className: "mt-2 text-sm leading-6 text-muted-foreground", children: userMessage }) : /* @__PURE__ */ jsx("p", { className: "mt-2 text-sm leading-6 text-muted-foreground", children: "An unexpected error occurred while loading this page." }),
25
+ isAvailability ? /* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "You can try again in a few minutes." }) : null,
26
+ /* @__PURE__ */ jsxs("div", { className: "mt-5 flex flex-wrap gap-2", children: [
27
+ /* @__PURE__ */ jsx(Button, { type: "button", size: "sm", onClick: () => reset(), children: "Try again" }),
28
+ /* @__PURE__ */ jsx(Button, { type: "button", size: "sm", variant: "outline", asChild: true, children: /* @__PURE__ */ jsx("a", { href: backHref, children: backLabel }) })
29
+ ] }),
30
+ error.digest ? /* @__PURE__ */ jsxs("p", { className: "mt-6 text-[11px] uppercase tracking-wide text-muted-foreground", children: [
31
+ "Reference: ",
32
+ error.digest
33
+ ] }) : null
34
+ ] }) });
35
+ }
36
+ export {
37
+ AdminError,
38
+ AdminErrorView
39
+ };
40
+ //# sourceMappingURL=AdminErrorView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../admin/pages/AdminErrorView.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\n\nimport { Button } from '../../components/ui/button';\nimport { isContentSourceError, parseContentSourceFromMessage } from '../../lib/contentSourceError';\n\n/**\n * Drop-in `error.tsx` body for the admin catch-all. Receives Next.js's\n * standard `{ error, reset }` props and renders the shared `AdminErrorView`.\n *\n * Wired into the user app via a one-line re-export:\n * `export { AdminError as default } from 'octocms/admin'`\n */\nexport function AdminError({ error, reset }: { error: Error & { digest?: string }; reset: () => void }) {\n return <AdminErrorView error={error} reset={reset} />;\n}\n\nexport type AdminErrorViewProps = {\n error: Error & { digest?: string };\n reset: () => void;\n /** Section title shown above the message. Defaults to \"Something went wrong\". */\n title?: string;\n /** Optional href for the secondary \"Back\" button. Defaults to /cms. */\n backHref?: string;\n /** Optional label for the secondary button. Defaults to \"Dashboard\". */\n backLabel?: string;\n};\n\n/**\n * Shared admin error view used by every per-segment `error.tsx` file under\n * `src/app/cms/`. Reuses the GitHub-aware copy logic from the existing root\n * error boundary in `src/app/error.tsx`, but inside the admin chrome.\n */\nexport function AdminErrorView({\n error,\n reset,\n title = 'Something went wrong',\n backHref = '/cms',\n backLabel = 'Dashboard',\n}: AdminErrorViewProps) {\n const fromInstance = isContentSourceError(error) ? { userMessage: error.userMessage, code: error.code } : null;\n const fromMessage = parseContentSourceFromMessage(error.message);\n const userMessage = fromInstance?.userMessage ?? fromMessage?.userMessage;\n const code = fromInstance?.code ?? fromMessage?.code;\n const isAvailability = code === 'github_unavailable' || code === 'github_rate_limit';\n\n return (\n <div className=\"flex flex-1 items-center justify-center bg-muted/20 p-6\">\n <div className=\"w-full max-w-lg rounded-xl border border-border bg-background p-6 shadow-sm\">\n <h2 className=\"text-base font-semibold tracking-tight text-foreground\">{title}</h2>\n {userMessage ? (\n <p className=\"mt-2 text-sm leading-6 text-muted-foreground\">{userMessage}</p>\n ) : (\n <p className=\"mt-2 text-sm leading-6 text-muted-foreground\">\n An unexpected error occurred while loading this page.\n </p>\n )}\n {isAvailability ? (\n <p className=\"mt-1 text-xs text-muted-foreground\">You can try again in a few minutes.</p>\n ) : null}\n <div className=\"mt-5 flex flex-wrap gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={() => reset()}>\n Try again\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" asChild>\n <a href={backHref}>{backLabel}</a>\n </Button>\n </div>\n {error.digest ? (\n <p className=\"mt-6 text-[11px] uppercase tracking-wide text-muted-foreground\">Reference: {error.digest}</p>\n ) : null}\n </div>\n </div>\n );\n}\n"],"mappings":";;AAeS,cA8CD,YA9CC;AAXT,SAAS,cAAc;AACvB,SAAS,sBAAsB,qCAAqC;AAS7D,SAAS,WAAW,EAAE,OAAO,MAAM,GAA8D;AACtG,SAAO,oBAAC,kBAAe,OAAc,OAAc;AACrD;AAkBO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,YAAY;AACd,GAAwB;AAxCxB;AAyCE,QAAM,eAAe,qBAAqB,KAAK,IAAI,EAAE,aAAa,MAAM,aAAa,MAAM,MAAM,KAAK,IAAI;AAC1G,QAAM,cAAc,8BAA8B,MAAM,OAAO;AAC/D,QAAM,eAAc,kDAAc,gBAAd,YAA6B,2CAAa;AAC9D,QAAM,QAAO,kDAAc,SAAd,YAAsB,2CAAa;AAChD,QAAM,iBAAiB,SAAS,wBAAwB,SAAS;AAEjE,SACE,oBAAC,SAAI,WAAU,2DACb,+BAAC,SAAI,WAAU,+EACb;AAAA,wBAAC,QAAG,WAAU,0DAA0D,iBAAM;AAAA,IAC7E,cACC,oBAAC,OAAE,WAAU,gDAAgD,uBAAY,IAEzE,oBAAC,OAAE,WAAU,gDAA+C,mEAE5D;AAAA,IAED,iBACC,oBAAC,OAAE,WAAU,sCAAqC,iDAAmC,IACnF;AAAA,IACJ,qBAAC,SAAI,WAAU,6BACb;AAAA,0BAAC,UAAO,MAAK,UAAS,MAAK,MAAK,SAAS,MAAM,MAAM,GAAG,uBAExD;AAAA,MACA,oBAAC,UAAO,MAAK,UAAS,MAAK,MAAK,SAAQ,WAAU,SAAO,MACvD,8BAAC,OAAE,MAAM,UAAW,qBAAU,GAChC;AAAA,OACF;AAAA,IACC,MAAM,SACL,qBAAC,OAAE,WAAU,kEAAiE;AAAA;AAAA,MAAY,MAAM;AAAA,OAAO,IACrG;AAAA,KACN,GACF;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"AdminLayout.d.ts","sourceRoot":"","sources":["../../../admin/pages/AdminLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,CAAC;AAC3B,OAAO,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,KAAmB,MAAM,OAAO,CAAC;AAQxC,eAAO,MAAM,QAAQ,EAAE,QAEtB,CAAC;AAyBF;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,cAAc,QAAQ,CAAC;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,CAAC,4CAMhF,CAAC"}
1
+ {"version":3,"file":"AdminLayout.d.ts","sourceRoot":"","sources":["../../../admin/pages/AdminLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,CAAC;AAC3B,OAAO,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,KAAmB,MAAM,OAAO,CAAC;AAQxC,eAAO,MAAM,QAAQ,EAAE,QAEtB,CAAC;AA6BF;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,cAAc,QAAQ,CAAC;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,CAAC,4CAMhF,CAAC"}
@@ -15,7 +15,7 @@ async function AdminLayoutInner({ children }) {
15
15
  const initialTheme = await getThemeCookie();
16
16
  const config = getConfig();
17
17
  return /* @__PURE__ */ jsxs(Provider, { initialTheme, config, children: [
18
- /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(Layout, { children }) }),
18
+ /* @__PURE__ */ jsx(Layout, { children }),
19
19
  /* @__PURE__ */ jsx(Toaster, {})
20
20
  ] });
21
21
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../admin/pages/AdminLayout.tsx"],"sourcesContent":["import '../../globals.css';\nimport '@mdxeditor/editor/style.css';\nimport type { Metadata } from 'next';\nimport React, { Suspense } from 'react';\n\nimport Provider from '../provider';\nimport { Toaster } from '../../components/ui/toaster';\nimport Layout from '../../components/Layout/Layout';\nimport { getThemeCookie } from '../actions/getThemeCookie';\nimport { getConfig } from '../../lib/configStore';\n\nexport const metadata: Metadata = {\n title: 'OctoCMS',\n};\n\n/**\n * Async inner component that reads the `cms-theme` cookie.\n *\n * Kept separate from `AdminLayout` so the `cookies()` call (uncached dynamic\n * data) happens inside a `<Suspense>` boundary. This satisfies the\n * `cacheComponents` experimental flag requirement: any uncached data access\n * must be wrapped in Suspense, and avoids the need for `force-dynamic` (which\n * is incompatible with `cacheComponents`).\n */\nasync function AdminLayoutInner({ children }: Readonly<{ children: React.ReactNode }>) {\n const initialTheme = await getThemeCookie();\n const config = getConfig();\n\n return (\n <Provider initialTheme={initialTheme} config={config}>\n <Suspense fallback={null}>\n <Layout>{children}</Layout>\n </Suspense>\n <Toaster />\n </Provider>\n );\n}\n\n/**\n * Synchronous CMS layout shell.\n * Wraps `AdminLayoutInner` in `<Suspense>` so the async cookie read is\n * inside the boundary and does not block the rest of the page.\n */\nexport const AdminLayout = ({ children }: Readonly<{ children: React.ReactNode }>) => {\n return (\n <Suspense fallback={null}>\n <AdminLayoutInner>{children}</AdminLayoutInner>\n </Suspense>\n );\n};\n"],"mappings":";AA6BI,SAEI,KAFJ;AA7BJ,OAAO;AACP,OAAO;AAEP,SAAgB,gBAAgB;AAEhC,OAAO,cAAc;AACrB,SAAS,eAAe;AACxB,OAAO,YAAY;AACnB,SAAS,sBAAsB;AAC/B,SAAS,iBAAiB;AAEnB,MAAM,WAAqB;AAAA,EAChC,OAAO;AACT;AAWA,eAAe,iBAAiB,EAAE,SAAS,GAA4C;AACrF,QAAM,eAAe,MAAM,eAAe;AAC1C,QAAM,SAAS,UAAU;AAEzB,SACE,qBAAC,YAAS,cAA4B,QACpC;AAAA,wBAAC,YAAS,UAAU,MAClB,8BAAC,UAAQ,UAAS,GACpB;AAAA,IACA,oBAAC,WAAQ;AAAA,KACX;AAEJ;AAOO,MAAM,cAAc,CAAC,EAAE,SAAS,MAA+C;AACpF,SACE,oBAAC,YAAS,UAAU,MAClB,8BAAC,oBAAkB,UAAS,GAC9B;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../admin/pages/AdminLayout.tsx"],"sourcesContent":["import '../../globals.css';\nimport '@mdxeditor/editor/style.css';\nimport type { Metadata } from 'next';\nimport React, { Suspense } from 'react';\n\nimport Provider from '../provider';\nimport { Toaster } from '../../components/ui/toaster';\nimport Layout from '../../components/Layout/Layout';\nimport { getThemeCookie } from '../actions/getThemeCookie';\nimport { getConfig } from '../../lib/configStore';\n\nexport const metadata: Metadata = {\n title: 'OctoCMS',\n};\n\n/**\n * Async inner component that reads the `cms-theme` cookie.\n *\n * Kept separate from `AdminLayout` so the `cookies()` call (uncached dynamic\n * data) happens inside a `<Suspense>` boundary. This satisfies the\n * `cacheComponents` experimental flag requirement: any uncached data access\n * must be wrapped in Suspense, and avoids the need for `force-dynamic` (which\n * is incompatible with `cacheComponents`).\n */\nasync function AdminLayoutInner({ children }: Readonly<{ children: React.ReactNode }>) {\n const initialTheme = await getThemeCookie();\n const config = getConfig();\n\n // No Suspense around `<Layout>{children}</Layout>` here on purpose: the\n // catch-all page (`AdminApp`) re-suspends on every back/forward navigation,\n // and a Suspense at this level would blank the entire layout chrome\n // (including the TopHeader). Layout itself owns the inner Suspense around\n // `{children}` so the chrome stays mounted and the generic admin skeleton\n // fills the main slot.\n return (\n <Provider initialTheme={initialTheme} config={config}>\n <Layout>{children}</Layout>\n <Toaster />\n </Provider>\n );\n}\n\n/**\n * Synchronous CMS layout shell.\n * Wraps `AdminLayoutInner` in `<Suspense>` so the async cookie read is\n * inside the boundary and does not block the rest of the page.\n */\nexport const AdminLayout = ({ children }: Readonly<{ children: React.ReactNode }>) => {\n return (\n <Suspense fallback={null}>\n <AdminLayoutInner>{children}</AdminLayoutInner>\n </Suspense>\n );\n};\n"],"mappings":";AAmCI,SACE,KADF;AAnCJ,OAAO;AACP,OAAO;AAEP,SAAgB,gBAAgB;AAEhC,OAAO,cAAc;AACrB,SAAS,eAAe;AACxB,OAAO,YAAY;AACnB,SAAS,sBAAsB;AAC/B,SAAS,iBAAiB;AAEnB,MAAM,WAAqB;AAAA,EAChC,OAAO;AACT;AAWA,eAAe,iBAAiB,EAAE,SAAS,GAA4C;AACrF,QAAM,eAAe,MAAM,eAAe;AAC1C,QAAM,SAAS,UAAU;AAQzB,SACE,qBAAC,YAAS,cAA4B,QACpC;AAAA,wBAAC,UAAQ,UAAS;AAAA,IAClB,oBAAC,WAAQ;AAAA,KACX;AAEJ;AAOO,MAAM,cAAc,CAAC,EAAE,SAAS,MAA+C;AACpF,SACE,oBAAC,YAAS,UAAU,MAClB,8BAAC,oBAAkB,UAAS,GAC9B;AAEJ;","names":[]}
@@ -2,5 +2,5 @@ export declare function CollectionPage({ params }: {
2
2
  params: Promise<{
3
3
  type: string;
4
4
  }>;
5
- }): import("react/jsx-runtime").JSX.Element;
5
+ }): Promise<import("react/jsx-runtime").JSX.Element | null>;
6
6
  //# sourceMappingURL=CollectionPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CollectionPage.d.ts","sourceRoot":"","sources":["../../../admin/pages/CollectionPage.tsx"],"names":[],"mappings":"AAUA,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,2CAM/E"}
1
+ {"version":3,"file":"CollectionPage.d.ts","sourceRoot":"","sources":["../../../admin/pages/CollectionPage.tsx"],"names":[],"mappings":"AAUA,wBAAsB,cAAc,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,2DA2BrF"}
@@ -1,30 +1,36 @@
1
1
  import "../../chunk-B5LE2OEC.js";
2
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { jsx } from "react/jsx-runtime";
3
3
  import { redirect } from "next/navigation";
4
4
  import { getServerSession } from "next-auth";
5
- import { Suspense } from "react";
6
- import ContentTypes from "../../components/ContentTypes";
7
- import { FileContextProvider } from "../../hooks/useFileState";
8
- import { CMSSidebar } from "../../components/CMSSidebar/CMSSidebar";
9
- import { getEntryList } from "../actions";
5
+ import DashboardContent from "../../components/Dashboard/DashboardContent";
6
+ import { getConfig } from "../../lib/configStore";
7
+ import { getEntryList, hasActiveBranch } from "../actions";
8
+ import { getBranch } from "../actions/git";
10
9
  import { authOptions } from "../auth";
11
- function CollectionPage({ params }) {
12
- return /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(CollectionPageContent, { params }) });
13
- }
14
- async function CollectionPageContent({ params }) {
10
+ async function CollectionPage({ params }) {
15
11
  const session = await getServerSession(authOptions);
16
12
  if (!session) {
17
13
  return null;
18
14
  }
19
15
  const { type } = await params;
20
- const entries = await getEntryList();
16
+ const [entries, hasBranch, activeBranch] = await Promise.all([getEntryList(), hasActiveBranch(), getBranch()]);
17
+ const collections = Object.keys(getConfig().collections);
21
18
  if (!type) {
22
- redirect(`/`);
19
+ redirect(`/cms/content`);
20
+ }
21
+ if (!collections.includes(type)) {
22
+ redirect("/cms/content");
23
23
  }
24
- return /* @__PURE__ */ jsxs(Fragment, { children: [
25
- /* @__PURE__ */ jsx(CMSSidebar, {}),
26
- /* @__PURE__ */ jsx(FileContextProvider, { defaultType: type, children: /* @__PURE__ */ jsx(ContentTypes, { entries }) })
27
- ] });
24
+ return /* @__PURE__ */ jsx(
25
+ DashboardContent,
26
+ {
27
+ entries,
28
+ collections,
29
+ hasBranch,
30
+ activeBranch,
31
+ selectedType: type
32
+ }
33
+ );
28
34
  }
29
35
  export {
30
36
  CollectionPage
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../admin/pages/CollectionPage.tsx"],"sourcesContent":["import { redirect } from 'next/navigation';\nimport { getServerSession } from 'next-auth';\nimport React, { Suspense } from 'react';\n\nimport ContentTypes from '../../components/ContentTypes';\nimport { FileContextProvider } from '../../hooks/useFileState';\nimport { CMSSidebar } from '../../components/CMSSidebar/CMSSidebar';\nimport { getEntryList } from '../actions';\nimport { authOptions } from '../auth';\n\nexport function CollectionPage({ params }: { params: Promise<{ type: string }> }) {\n return (\n <Suspense fallback={null}>\n <CollectionPageContent params={params} />\n </Suspense>\n );\n}\n\nasync function CollectionPageContent({ params }: { params: Promise<{ type: string }> }) {\n const session = await getServerSession(authOptions);\n\n if (!session) {\n return null;\n }\n\n const { type } = await params;\n const entries = await getEntryList();\n\n if (!type) {\n redirect(`/`);\n }\n\n return (\n <>\n <CMSSidebar />\n <FileContextProvider defaultType={type}>\n <ContentTypes entries={entries} />\n </FileContextProvider>\n </>\n );\n}\n"],"mappings":";AAaM,SAoBF,UApBE,KAoBF,YApBE;AAbN,SAAS,gBAAgB;AACzB,SAAS,wBAAwB;AACjC,SAAgB,gBAAgB;AAEhC,OAAO,kBAAkB;AACzB,SAAS,2BAA2B;AACpC,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAC7B,SAAS,mBAAmB;AAErB,SAAS,eAAe,EAAE,OAAO,GAA0C;AAChF,SACE,oBAAC,YAAS,UAAU,MAClB,8BAAC,yBAAsB,QAAgB,GACzC;AAEJ;AAEA,eAAe,sBAAsB,EAAE,OAAO,GAA0C;AACtF,QAAM,UAAU,MAAM,iBAAiB,WAAW;AAElD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,KAAK,IAAI,MAAM;AACvB,QAAM,UAAU,MAAM,aAAa;AAEnC,MAAI,CAAC,MAAM;AACT,aAAS,GAAG;AAAA,EACd;AAEA,SACE,iCACE;AAAA,wBAAC,cAAW;AAAA,IACZ,oBAAC,uBAAoB,aAAa,MAChC,8BAAC,gBAAa,SAAkB,GAClC;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../admin/pages/CollectionPage.tsx"],"sourcesContent":["import { redirect } from 'next/navigation';\nimport { getServerSession } from 'next-auth';\nimport React from 'react';\n\nimport DashboardContent from '../../components/Dashboard/DashboardContent';\nimport { getConfig } from '../../lib/configStore';\nimport { getEntryList, hasActiveBranch } from '../actions';\nimport { getBranch } from '../actions/git';\nimport { authOptions } from '../auth';\n\nexport async function CollectionPage({ params }: { params: Promise<{ type: string }> }) {\n const session = await getServerSession(authOptions);\n\n if (!session) {\n return null;\n }\n\n const { type } = await params;\n const [entries, hasBranch, activeBranch] = await Promise.all([getEntryList(), hasActiveBranch(), getBranch()]);\n const collections = Object.keys(getConfig().collections);\n\n if (!type) {\n redirect(`/cms/content`);\n }\n if (!collections.includes(type)) {\n redirect('/cms/content');\n }\n\n return (\n <DashboardContent\n entries={entries}\n collections={collections}\n hasBranch={hasBranch}\n activeBranch={activeBranch}\n selectedType={type}\n />\n );\n}\n"],"mappings":";AA6BI;AA7BJ,SAAS,gBAAgB;AACzB,SAAS,wBAAwB;AAGjC,OAAO,sBAAsB;AAC7B,SAAS,iBAAiB;AAC1B,SAAS,cAAc,uBAAuB;AAC9C,SAAS,iBAAiB;AAC1B,SAAS,mBAAmB;AAE5B,eAAsB,eAAe,EAAE,OAAO,GAA0C;AACtF,QAAM,UAAU,MAAM,iBAAiB,WAAW;AAElD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,KAAK,IAAI,MAAM;AACvB,QAAM,CAAC,SAAS,WAAW,YAAY,IAAI,MAAM,QAAQ,IAAI,CAAC,aAAa,GAAG,gBAAgB,GAAG,UAAU,CAAC,CAAC;AAC7G,QAAM,cAAc,OAAO,KAAK,UAAU,EAAE,WAAW;AAEvD,MAAI,CAAC,MAAM;AACT,aAAS,cAAc;AAAA,EACzB;AACA,MAAI,CAAC,YAAY,SAAS,IAAI,GAAG;AAC/B,aAAS,cAAc;AAAA,EACzB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA;AAAA,EAChB;AAEJ;","names":[]}
@@ -1,2 +1,2 @@
1
- export declare function ContentModelPage(): import("react/jsx-runtime").JSX.Element;
1
+ export declare function ContentModelPage(): Promise<import("react/jsx-runtime").JSX.Element | null>;
2
2
  //# sourceMappingURL=ContentModelPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ContentModelPage.d.ts","sourceRoot":"","sources":["../../../admin/pages/ContentModelPage.tsx"],"names":[],"mappings":"AAQA,wBAAgB,gBAAgB,4CAM/B"}
1
+ {"version":3,"file":"ContentModelPage.d.ts","sourceRoot":"","sources":["../../../admin/pages/ContentModelPage.tsx"],"names":[],"mappings":"AAQA,wBAAsB,gBAAgB,4DAUrC"}
@@ -1,15 +1,11 @@
1
1
  import "../../chunk-B5LE2OEC.js";
2
2
  import { jsx } from "react/jsx-runtime";
3
- import { Suspense } from "react";
4
3
  import { getServerSession } from "next-auth";
5
4
  import ContentModelList from "../../components/ContentModel/ContentModelList";
6
5
  import { getEntryList } from "../actions";
7
6
  import { getSchema } from "../actions/schema";
8
7
  import { authOptions } from "../auth";
9
- function ContentModelPage() {
10
- return /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(ContentModelPageContent, {}) });
11
- }
12
- async function ContentModelPageContent() {
8
+ async function ContentModelPage() {
13
9
  const session = await getServerSession(authOptions);
14
10
  if (!session) {
15
11
  return null;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../admin/pages/ContentModelPage.tsx"],"sourcesContent":["import React, { Suspense } from 'react';\nimport { getServerSession } from 'next-auth';\n\nimport ContentModelList from '../../components/ContentModel/ContentModelList';\nimport { getEntryList } from '../actions';\nimport { getSchema } from '../actions/schema';\nimport { authOptions } from '../auth';\n\nexport function ContentModelPage() {\n return (\n <Suspense fallback={null}>\n <ContentModelPageContent />\n </Suspense>\n );\n}\n\nasync function ContentModelPageContent() {\n const session = await getServerSession(authOptions);\n\n if (!session) {\n return null;\n }\n\n const [schema, entries] = await Promise.all([getSchema(), getEntryList()]);\n\n return <ContentModelList schema={schema} entries={entries} />;\n}\n"],"mappings":";AAWM;AAXN,SAAgB,gBAAgB;AAChC,SAAS,wBAAwB;AAEjC,OAAO,sBAAsB;AAC7B,SAAS,oBAAoB;AAC7B,SAAS,iBAAiB;AAC1B,SAAS,mBAAmB;AAErB,SAAS,mBAAmB;AACjC,SACE,oBAAC,YAAS,UAAU,MAClB,8BAAC,2BAAwB,GAC3B;AAEJ;AAEA,eAAe,0BAA0B;AACvC,QAAM,UAAU,MAAM,iBAAiB,WAAW;AAElD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,QAAQ,OAAO,IAAI,MAAM,QAAQ,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC,CAAC;AAEzE,SAAO,oBAAC,oBAAiB,QAAgB,SAAkB;AAC7D;","names":[]}
1
+ {"version":3,"sources":["../../../admin/pages/ContentModelPage.tsx"],"sourcesContent":["import React from 'react';\nimport { getServerSession } from 'next-auth';\n\nimport ContentModelList from '../../components/ContentModel/ContentModelList';\nimport { getEntryList } from '../actions';\nimport { getSchema } from '../actions/schema';\nimport { authOptions } from '../auth';\n\nexport async function ContentModelPage() {\n const session = await getServerSession(authOptions);\n\n if (!session) {\n return null;\n }\n\n const [schema, entries] = await Promise.all([getSchema(), getEntryList()]);\n\n return <ContentModelList schema={schema} entries={entries} />;\n}\n"],"mappings":";AAiBS;AAhBT,SAAS,wBAAwB;AAEjC,OAAO,sBAAsB;AAC7B,SAAS,oBAAoB;AAC7B,SAAS,iBAAiB;AAC1B,SAAS,mBAAmB;AAE5B,eAAsB,mBAAmB;AACvC,QAAM,UAAU,MAAM,iBAAiB,WAAW;AAElD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,QAAQ,OAAO,IAAI,MAAM,QAAQ,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC,CAAC;AAEzE,SAAO,oBAAC,oBAAiB,QAAgB,SAAkB;AAC7D;","names":[]}
@@ -0,0 +1,2 @@
1
+ export declare function ContentPage(): Promise<import("react/jsx-runtime").JSX.Element | null>;
2
+ //# sourceMappingURL=ContentPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContentPage.d.ts","sourceRoot":"","sources":["../../../admin/pages/ContentPage.tsx"],"names":[],"mappings":"AASA,wBAAsB,WAAW,4DAahC"}