camox 0.44.0 → 0.45.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 (411) hide show
  1. package/dist/components/AuthGate.js +0 -6
  2. package/dist/components/DeviceSelector.js +96 -0
  3. package/dist/components/PlatformLabel.js +20 -24
  4. package/dist/core/components/lexical/HighlightNode.js +1 -1
  5. package/dist/core/components/lexical/InlineContentEditable.js +15 -19
  6. package/dist/core/components/lexical/InlineLexicalEditor.js +54 -74
  7. package/dist/core/components/lexical/InlineStylesPlugin.js +53 -53
  8. package/dist/core/components/lexical/MaxLengthPlugin.js +59 -0
  9. package/dist/core/components/lexical/SelectionBroadcaster.js +53 -54
  10. package/dist/core/components/lexical/SidebarLexicalEditor.js +322 -229
  11. package/dist/core/components/lexical/SummaryToggleGuard.js +42 -0
  12. package/dist/core/components/lexical/TextLinkPopover.js +169 -180
  13. package/dist/core/createApp.d.ts +241 -312
  14. package/dist/core/createApp.js +123 -29
  15. package/dist/core/createBlock.d.ts +5 -5
  16. package/dist/core/createBlock.js +385 -152
  17. package/dist/core/createCollection.d.ts +55 -0
  18. package/dist/core/createCollection.js +93 -0
  19. package/dist/core/createLayout.d.ts +197 -61
  20. package/dist/core/createLayout.js +114 -56
  21. package/dist/core/defineDocument.d.ts +3 -5
  22. package/dist/core/derivedRoutes.js +49 -1
  23. package/dist/core/dom.d.ts +13 -4
  24. package/dist/core/dom.js +44 -1
  25. package/dist/core/editing/BlockEditingRuntime.d.ts +16 -0
  26. package/dist/core/editing/BlockEditingRuntime.js +6 -15
  27. package/dist/core/editing/CompleteBlockEditingRuntime.js +28 -23
  28. package/dist/core/editing/createEditableBlock.d.ts +754 -633
  29. package/dist/core/editing/createEditableBlock.js +2113 -1066
  30. package/dist/core/editing/referenceWrites.js +51 -0
  31. package/dist/core/editing/useLatestRecord.js +90 -0
  32. package/dist/core/hooks/useArtifactHost.js +139 -0
  33. package/dist/core/hooks/useFieldSelection.js +43 -18
  34. package/dist/core/hooks/useIsEditable.js +12 -10
  35. package/dist/core/hooks/useOverlayMessage.js +15 -19
  36. package/dist/core/lib/artifact.d.ts +21 -0
  37. package/dist/core/lib/artifact.js +154 -0
  38. package/dist/core/lib/artifactColors.js +123 -0
  39. package/dist/core/lib/artifactData.d.ts +1 -0
  40. package/dist/core/lib/artifactData.js +131 -0
  41. package/dist/core/lib/artifactHost.js +205 -0
  42. package/dist/core/lib/artifactRuntime.js +36 -0
  43. package/dist/core/lib/artifactTheme.js +57 -0
  44. package/dist/core/lib/contentType.d.ts +302 -106
  45. package/dist/core/lib/contentType.js +201 -173
  46. package/dist/core/lib/fieldTypes.js +3 -0
  47. package/dist/core/lib/iconTypes.d.ts +3 -3
  48. package/dist/core/lib/icons.d.ts +4 -4
  49. package/dist/core/lib/icons.js +40 -44
  50. package/dist/core/lib/imagePlaceholder.js +177 -0
  51. package/dist/core/lib/imageTransform.js +1 -1
  52. package/dist/core/lib/lexicalReact.d.ts +3 -1
  53. package/dist/core/lib/lexicalState.js +1 -1
  54. package/dist/core/lib/previewPaused.js +9 -0
  55. package/dist/core/lib/recordScope.js +316 -0
  56. package/dist/core/lib/reference.d.ts +81 -0
  57. package/dist/core/lib/reference.js +29 -0
  58. package/dist/core/lib/textLinks.js +7 -5
  59. package/dist/core/lib/textStyles.d.ts +5 -7
  60. package/dist/core/lib/textStyles.js +2 -2
  61. package/dist/core/notFound.d.ts +7 -0
  62. package/dist/core/notFound.js +11 -0
  63. package/dist/core/pageDestinations.js +6 -3
  64. package/dist/core/recordItem.js +34 -0
  65. package/dist/core/requestContext.d.ts +26 -0
  66. package/dist/core/requestContext.js +20 -0
  67. package/dist/features/canvas/CamoxCanvas.js +1734 -0
  68. package/dist/features/canvas/CanvasBlockFrame.js +353 -0
  69. package/dist/features/canvas/CanvasBlockHeader.js +55 -0
  70. package/dist/features/canvas/CanvasLoadingScreen.js +35 -0
  71. package/dist/features/canvas/CanvasOverlays.js +254 -0
  72. package/dist/features/canvas/CanvasPageEdge.js +87 -0
  73. package/dist/features/canvas/CanvasPageFrame.js +335 -0
  74. package/dist/features/canvas/CanvasPageHeader.js +125 -0
  75. package/dist/features/canvas/CanvasPreviewPageSlot.js +103 -0
  76. package/dist/features/canvas/CanvasShelfMarker.js +255 -0
  77. package/dist/features/canvas/DerivedPagePathInput.js +238 -0
  78. package/dist/features/canvas/canvasCamera.js +229 -0
  79. package/dist/features/canvas/canvasFlight.js +104 -0
  80. package/dist/features/canvas/canvasFrameCapture.js +364 -0
  81. package/dist/features/canvas/canvasFrameDocument.js +317 -0
  82. package/dist/features/canvas/canvasFrameMode.js +53 -0
  83. package/dist/features/canvas/canvasInsertionSeams.js +44 -0
  84. package/dist/features/canvas/canvasItems.js +120 -0
  85. package/dist/features/canvas/canvasOverlayGeometry.js +240 -0
  86. package/dist/features/canvas/canvasPages.js +79 -0
  87. package/dist/features/canvas/canvasScreenSpace.js +26 -0
  88. package/dist/features/canvas/canvasSelection.js +18 -0
  89. package/dist/features/canvas/canvasStore.js +149 -0
  90. package/dist/features/canvas/canvasThumbnails.js +304 -0
  91. package/dist/features/canvas/canvasZoom.js +10 -0
  92. package/dist/features/canvas/sidebar/CanvasInspector.js +202 -0
  93. package/dist/features/canvas/sidebar/CanvasNavigator.js +226 -0
  94. package/dist/features/canvas/sidebar/CanvasSidebar.js +60 -0
  95. package/dist/features/canvas/sidebar/CanvasSidebarFrame.js +48 -0
  96. package/dist/features/canvas/sidebar/CanvasSidebarSkeleton.js +39 -0
  97. package/dist/features/canvas/sidebar/CatalogBlockInspector.js +189 -0
  98. package/dist/features/canvas/sidebar/CuratedPageInspector.js +69 -0
  99. package/dist/features/canvas/sidebar/DerivedPageInspector.js +37 -0
  100. package/dist/features/canvas/sidebar/LayoutPageBlocks.js +78 -0
  101. package/dist/features/canvas/sidebar/LayoutPageOverview.js +71 -0
  102. package/dist/features/canvas/sidebar/PageInspector.js +157 -0
  103. package/dist/features/canvas/sidebar/PageInspectorSkeleton.js +90 -0
  104. package/dist/features/canvas/sidebar/PageOverview.js +27 -0
  105. package/dist/features/canvas/sidebar/SingletonPageInspector.js +31 -0
  106. package/dist/features/canvas/useCanvasCamera.js +803 -0
  107. package/dist/features/canvas/useCanvasFrame.js +149 -0
  108. package/dist/features/canvas/useCanvasFrameInput.js +97 -0
  109. package/dist/features/canvas/useCanvasNearness.js +57 -0
  110. package/dist/features/canvas/useDiscoveredPreviewPaths.js +62 -0
  111. package/dist/features/content/CamoxContent.d.ts +2 -5
  112. package/dist/features/content/CamoxContent.js +174 -271
  113. package/dist/features/content/CollectionItemSheetContext.js +106 -0
  114. package/dist/features/content/ContentAssets.js +315 -0
  115. package/dist/features/content/ContentCollection.js +663 -0
  116. package/dist/features/content/collection-form.js +58 -0
  117. package/dist/features/content/components/AssetCard.js +80 -84
  118. package/dist/features/content/components/AssetCardSkeleton.js +4 -8
  119. package/dist/features/content/components/ContentSidebar.js +129 -18
  120. package/dist/features/content/components/ContentSidebarGroup.js +37 -0
  121. package/dist/features/content/components/DeleteCollectionItemButton.js +202 -0
  122. package/dist/features/content/components/MissingFromLocale.js +282 -0
  123. package/dist/features/content/components/UploadDropZone.js +27 -31
  124. package/dist/features/content/components/UploadProgressDrawer.js +90 -98
  125. package/dist/features/navigation/navigation.d.ts +66 -20
  126. package/dist/features/navigation/navigation.js +257 -90
  127. package/dist/features/og/defaultFonts.js +8 -8
  128. package/dist/features/og/geist-variable-ttf-base64.js +1 -1
  129. package/dist/features/og/imageResponse.d.ts +8 -0
  130. package/dist/features/og/imageResponse.js +26 -0
  131. package/dist/features/page/CuratedPageContent.js +167 -0
  132. package/dist/features/page/DerivedPageContent.js +26 -30
  133. package/dist/features/page/SharedLayoutContent.js +25 -27
  134. package/dist/features/preview/CamoxPreview.d.ts +23 -61
  135. package/dist/features/preview/CamoxPreview.js +816 -537
  136. package/dist/features/preview/EditablePageContent.js +1 -1
  137. package/dist/features/preview/EditablePageExperience.js +16 -22
  138. package/dist/features/preview/components/AddBlockDialog.js +270 -0
  139. package/dist/features/preview/components/AssetFieldEditor.js +173 -154
  140. package/dist/features/preview/components/AssetLightbox.js +181 -134
  141. package/dist/features/preview/components/AssetPickerModal.js +153 -170
  142. package/dist/features/preview/components/BlockActionsPopover.js +150 -149
  143. package/dist/features/preview/components/BlockErrorBoundary.js +8 -12
  144. package/dist/features/preview/components/BlockThumbnail.js +176 -100
  145. package/dist/features/preview/components/CanvasPreview.js +243 -0
  146. package/dist/features/preview/components/CreatePageModal.js +128 -137
  147. package/dist/features/preview/components/DebouncedFieldEditor.js +29 -33
  148. package/dist/features/preview/components/DerivedLayoutDialog.js +21 -19
  149. package/dist/features/preview/components/DrillRow.js +150 -0
  150. package/dist/features/preview/components/FieldOverlayStyles.js +11 -8
  151. package/dist/features/preview/components/FieldToolbar.js +160 -110
  152. package/dist/features/preview/components/Frame.js +108 -20
  153. package/dist/features/preview/components/IconFieldEditor.js +62 -66
  154. package/dist/features/preview/components/ItemFieldsEditor.js +231 -205
  155. package/dist/features/preview/components/LinkFieldEditor.js +135 -139
  156. package/dist/features/preview/components/Metadata.js +22 -30
  157. package/dist/features/preview/components/MobilePreviewDrawer.js +89 -108
  158. package/dist/features/preview/components/MultipleAssetFieldEditor.js +334 -246
  159. package/dist/features/preview/components/OverlayTracker.js +9 -41
  160. package/dist/features/preview/components/Overlays.js +81 -69
  161. package/dist/features/preview/components/PageInfo.js +1748 -0
  162. package/dist/features/preview/components/PageInfoSkeleton.js +51 -0
  163. package/dist/features/preview/components/PageLocationFieldset.js +112 -116
  164. package/dist/features/preview/components/PageNavigatorHeader.js +24 -0
  165. package/dist/features/preview/components/PageNicknameField.js +22 -26
  166. package/dist/features/preview/components/PagePicker.js +128 -130
  167. package/dist/features/preview/components/PageTree.js +525 -532
  168. package/dist/features/preview/components/PreviewActivation.js +28 -32
  169. package/dist/features/preview/components/PreviewPanel.js +620 -319
  170. package/dist/features/preview/components/PreviewToolbar.js +105 -333
  171. package/dist/features/preview/components/RecordCard.js +80 -0
  172. package/dist/features/preview/components/RecordCombobox.js +178 -0
  173. package/dist/features/preview/components/ReferenceFieldEditor.js +149 -0
  174. package/dist/features/preview/components/ReferenceListFieldEditor.js +432 -0
  175. package/dist/features/preview/components/RemovedBlockPlaceholder.js +95 -0
  176. package/dist/features/preview/components/RepeatableItemsList.js +125 -138
  177. package/dist/features/preview/components/SelectionEditor.js +993 -0
  178. package/dist/features/preview/components/ShikiMarkdown.js +14 -18
  179. package/dist/features/preview/components/SidebarSection.js +52 -64
  180. package/dist/features/preview/components/StudioEditingFallback.js +56 -0
  181. package/dist/features/preview/components/UnlinkAssetButton.js +104 -107
  182. package/dist/features/preview/components/blockGridNavigation.js +15 -0
  183. package/dist/features/preview/components/contentFieldSchema.js +8 -0
  184. package/dist/features/preview/components/useFieldWriter.js +200 -0
  185. package/dist/features/preview/components/useRecordView.js +383 -0
  186. package/dist/features/preview/components/useRepeatableItemActions.js +35 -37
  187. package/dist/features/preview/components/useUpdateBlockPosition.js +37 -37
  188. package/dist/features/preview/editingFrame.js +197 -0
  189. package/dist/features/preview/overlayHighlights.js +17 -44
  190. package/dist/features/preview/overlayMessages.js +72 -1
  191. package/dist/features/preview/pageRecord.js +189 -0
  192. package/dist/features/preview/previewConstants.js +6 -2
  193. package/dist/features/preview/previewPageFrame.js +95 -0
  194. package/dist/features/preview/previewPreparation.js +7 -0
  195. package/dist/features/preview/previewSelection.js +32 -63
  196. package/dist/features/preview/previewStore.js +225 -123
  197. package/dist/features/preview/referencePickerFocus.js +29 -0
  198. package/dist/features/preview/repeatableItemTargets.js +56 -0
  199. package/dist/features/preview/selectionReveal.js +21 -0
  200. package/dist/features/preview/usePreviewViewportActions.js +114 -0
  201. package/dist/features/preview/viewportContinuity.js +109 -0
  202. package/dist/features/provider/AuthenticatedCamoxProvider.js +69 -44
  203. package/dist/features/provider/CamoxProvider.d.ts +3 -6
  204. package/dist/features/provider/CamoxProvider.js +38 -50
  205. package/dist/features/provider/CoreCamoxProvider.js +66 -50
  206. package/dist/features/provider/LocalhostPreviewProvider.js +78 -114
  207. package/dist/features/provider/PreviewSignInPage.js +54 -0
  208. package/dist/features/provider/components/CamoxAppContext.js +11 -11
  209. package/dist/features/provider/components/CommandPalette.js +75 -82
  210. package/dist/features/provider/useAdminShortcuts.js +7 -11
  211. package/dist/features/routes/pageRuntime.d.ts +44 -4
  212. package/dist/features/routes/pageRuntime.js +244 -137
  213. package/dist/features/runtime/RuntimeChrome.js +117 -115
  214. package/dist/features/runtime/alternates.js +64 -0
  215. package/dist/features/runtime/analytics.d.ts +7 -0
  216. package/dist/features/runtime/analytics.js +66 -0
  217. package/dist/features/runtime/artifactSources.js +87 -0
  218. package/dist/features/runtime/editingFallback.js +20 -0
  219. package/dist/features/runtime/linkPrefetch.js +97 -0
  220. package/dist/features/runtime/livePages.js +62 -0
  221. package/dist/features/runtime/llmsTxt.js +40 -0
  222. package/dist/features/runtime/loopbackFetch.js +18 -0
  223. package/dist/features/runtime/navigationAccessibility.js +51 -0
  224. package/dist/features/runtime/navigationTarget.js +23 -2
  225. package/dist/features/runtime/pageApp.js +229 -158
  226. package/dist/features/runtime/pageBlockTypes.js +20 -0
  227. package/dist/features/runtime/pageClient.d.ts +2 -4
  228. package/dist/features/runtime/pageClient.js +18 -3
  229. package/dist/features/runtime/pageNavigation.js +254 -32
  230. package/dist/features/runtime/pageServer.d.ts +2 -4
  231. package/dist/features/runtime/pageServer.js +6 -2
  232. package/dist/features/runtime/pageViewport.js +7 -0
  233. package/dist/features/runtime/runtime.d.ts +59 -24
  234. package/dist/features/runtime/runtime.js +779 -191
  235. package/dist/features/runtime/runtimeChromeLoader.js +58 -0
  236. package/dist/features/runtime/runtimeRoutes.d.ts +19 -0
  237. package/dist/features/runtime/runtimeRoutes.js +25 -0
  238. package/dist/features/runtime/scrollRestoration.js +133 -0
  239. package/dist/features/runtime/studioApp.d.ts +4 -3
  240. package/dist/features/runtime/studioApp.js +5 -9
  241. package/dist/features/runtime/studioClient.d.ts +2 -4
  242. package/dist/features/runtime/studioClient.js +12 -3
  243. package/dist/features/runtime/studioServer.d.ts +2 -4
  244. package/dist/features/runtime/studioServer.js +6 -1
  245. package/dist/features/runtime/worker.d.ts +6 -0
  246. package/dist/features/runtime/worker.js +23 -0
  247. package/dist/features/runtime/workerRequest.js +44 -0
  248. package/dist/features/studio/CamoxStudio.d.ts +2 -6
  249. package/dist/features/studio/CamoxStudio.js +34 -49
  250. package/dist/features/studio/FollowAgentProvider.js +338 -0
  251. package/dist/features/studio/components/ChatSidebar.js +356 -0
  252. package/dist/features/studio/components/DraftsControl.js +676 -0
  253. package/dist/features/studio/components/FaviconDialog.js +318 -0
  254. package/dist/features/studio/components/LocalePicker.js +785 -0
  255. package/dist/features/studio/components/Navbar.js +123 -103
  256. package/dist/features/studio/components/ProjectMenu.js +239 -260
  257. package/dist/features/studio/components/RenameDraftDialog.js +206 -0
  258. package/dist/features/studio/components/ReviewDraftSheet.js +1472 -0
  259. package/dist/features/studio/components/ThreadComposer.js +157 -0
  260. package/dist/features/studio/components/ThreadMarkdown.js +113 -0
  261. package/dist/features/studio/components/ThreadMessages.js +270 -0
  262. package/dist/features/studio/components/UserButton.js +34 -23
  263. package/dist/features/studio/draftLabel.js +33 -0
  264. package/dist/features/studio/draftNotice.js +13 -0
  265. package/dist/features/studio/followAgent.js +250 -0
  266. package/dist/features/studio/followAgentContext.js +7 -0
  267. package/dist/features/studio/localeOptions.js +118 -0
  268. package/dist/features/studio/localeSwitch.js +19 -0
  269. package/dist/features/studio/routes.js +48 -1
  270. package/dist/features/studio/studioStore.js +64 -1
  271. package/dist/features/studio/useTheme.js +24 -27
  272. package/dist/features/vite/artifactRuntimeMinification.js +36 -0
  273. package/dist/features/vite/blockBoilerplate.js +6 -5
  274. package/dist/features/vite/blockChunks.js +31 -0
  275. package/dist/features/vite/bundlerLogs.js +17 -0
  276. package/dist/features/vite/definitionsSync.js +158 -226
  277. package/dist/features/vite/devAuthentication.js +4 -16
  278. package/dist/features/vite/devSignIn.js +87 -0
  279. package/dist/features/vite/iconGeneration.js +1 -1
  280. package/dist/features/vite/layoutGeneration.js +11 -1
  281. package/dist/features/vite/publishSeededContent.js +30 -0
  282. package/dist/features/vite/routeGeneration.js +6 -7
  283. package/dist/features/vite/runtimeDev.js +80 -99
  284. package/dist/features/vite/vite.d.ts +51 -31
  285. package/dist/features/vite/vite.js +224 -127
  286. package/dist/features/vite/workerBuild.js +39 -0
  287. package/dist/hooks/use-debounced-field.js +116 -47
  288. package/dist/hooks/use-file-upload.js +114 -67
  289. package/dist/hooks/use-marquee-selection.js +32 -36
  290. package/dist/hooks/use-page-destinations.js +69 -37
  291. package/dist/lib/api-client-server.d.ts +5 -0
  292. package/dist/lib/api-client-server.js +10 -4
  293. package/dist/lib/api-client.d.ts +6 -0
  294. package/dist/lib/api-client.js +51 -16
  295. package/dist/lib/api-socket.js +17 -0
  296. package/dist/lib/auth-page-styles.js +39 -0
  297. package/dist/lib/auth.js +117 -61
  298. package/dist/lib/collection-cache.js +23 -0
  299. package/dist/lib/draft-scope.d.ts +4 -0
  300. package/dist/lib/draft-scope.js +222 -0
  301. package/dist/lib/html.js +12 -0
  302. package/dist/lib/link-pages.js +154 -0
  303. package/dist/lib/locale-path.d.ts +22 -0
  304. package/dist/lib/locale-path.js +57 -0
  305. package/dist/lib/normalized-data.js +252 -152
  306. package/dist/lib/preview-handoff.js +2 -2
  307. package/dist/lib/queries.d.ts +11 -0
  308. package/dist/lib/queries.js +70 -141
  309. package/dist/lib/studio-reads.d.ts +14 -0
  310. package/dist/lib/studio-reads.js +574 -0
  311. package/dist/lib/use-project-room.js +50 -50
  312. package/dist/lib/use-thread.js +310 -0
  313. package/dist/lib/utils.js +25 -29
  314. package/dist/lib/view-locale-context.js +22 -0
  315. package/dist/lib/view-locale.js +46 -0
  316. package/dist/package.js +5 -0
  317. package/dist/studio-overlays.css +41 -151
  318. package/dist/studio.css +2 -2
  319. package/package.json +70 -73
  320. package/skills/camox/SKILL.md +16 -11
  321. package/skills/camox/references/artifacts.md +179 -0
  322. package/skills/camox/references/block-definitions.md +75 -59
  323. package/skills/camox/references/cli-common.md +9 -11
  324. package/skills/camox/references/cli-content.md +92 -69
  325. package/skills/camox/references/cli-publishing.md +26 -0
  326. package/skills/camox/references/dom-integrations.md +27 -0
  327. package/skills/camox/references/field-styling.md +4 -4
  328. package/skills/camox/references/layout-definitions.md +16 -14
  329. package/skills/camox/references/localization.md +56 -0
  330. package/skills/camox/references/routed-layouts.md +133 -15
  331. package/skills/camox-expand/SKILL.md +69 -0
  332. package/skills/camox-expand/references/jobs.md +39 -0
  333. package/skills/camoxify/SKILL.md +29 -7
  334. package/dist/core/components/AddBlockControlBar.js +0 -78
  335. package/dist/core/hooks/useRequireDraftSource.js +0 -23
  336. package/dist/features/metadata/sitemap.d.ts +0 -8
  337. package/dist/features/metadata/sitemap.js +0 -17
  338. package/dist/features/og/imageResponse.node.d.ts +0 -12
  339. package/dist/features/og/imageResponse.node.js +0 -49
  340. package/dist/features/og/imageResponse.workerd.d.ts +0 -12
  341. package/dist/features/og/imageResponse.workerd.js +0 -40
  342. package/dist/features/page/PublishedPageContent.js +0 -205
  343. package/dist/features/page/PublishedPageExperience.js +0 -23
  344. package/dist/features/preview/DerivedPreview.js +0 -134
  345. package/dist/features/preview/commentsEnabled.js +0 -8
  346. package/dist/features/preview/components/AddBlockSidebar.js +0 -381
  347. package/dist/features/preview/components/AttachedComments.js +0 -331
  348. package/dist/features/preview/components/CommentHeader.js +0 -122
  349. package/dist/features/preview/components/CommentSidebar.js +0 -29
  350. package/dist/features/preview/components/CommentTargetQuote.js +0 -167
  351. package/dist/features/preview/components/DerivedLayoutSidebar.d.ts +0 -5
  352. package/dist/features/preview/components/DerivedLayoutSidebar.js +0 -179
  353. package/dist/features/preview/components/DerivedPageInfoSidebar.js +0 -69
  354. package/dist/features/preview/components/LeftSidebar.js +0 -68
  355. package/dist/features/preview/components/PageEditorSidebar.js +0 -563
  356. package/dist/features/preview/components/PageInfoSidebar.js +0 -1551
  357. package/dist/features/preview/components/PageNavigatorSidebar.js +0 -78
  358. package/dist/features/preview/components/PageStatusBadge.js +0 -97
  359. package/dist/features/preview/components/PeekedBlock.js +0 -217
  360. package/dist/features/preview/components/PreviewComments.js +0 -56
  361. package/dist/features/preview/components/PreviewToolbarSpacer.js +0 -43
  362. package/dist/features/preview/components/PublicationRow.js +0 -422
  363. package/dist/features/preview/components/PublishDialog.js +0 -194
  364. package/dist/features/preview/components/RightSidebar.js +0 -59
  365. package/dist/features/preview/components/SendFeedbackDialog.js +0 -83
  366. package/dist/features/preview/previewCommentsStore.js +0 -135
  367. package/dist/features/preview/publication.js +0 -81
  368. package/dist/features/preview/usePageComments.js +0 -39
  369. package/dist/features/runtime/SharedChromeContext.js +0 -7
  370. package/dist/features/studio/components/EnvironmentMenu.js +0 -425
  371. package/dist/features/vite/appGeneration.js +0 -89
  372. package/dist/lib/view-queries.js +0 -28
  373. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/Matches.d.ts +0 -114
  374. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/RouterProvider.d.ts +0 -25
  375. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/config.d.ts +0 -1
  376. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/defer.d.ts +0 -1
  377. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/fileRoute.d.ts +0 -20
  378. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/global.d.ts +0 -8
  379. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/hash-scroll.d.ts +0 -1
  380. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/index.d.ts +0 -18
  381. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/link.d.ts +0 -161
  382. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/load-matches.d.ts +0 -6
  383. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/location.d.ts +0 -54
  384. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/lru-cache.d.ts +0 -8
  385. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/manifest.d.ts +0 -32
  386. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/new-process-route-tree.d.ts +0 -115
  387. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/not-found.d.ts +0 -1
  388. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/redirect.d.ts +0 -49
  389. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/rewrite.d.ts +0 -1
  390. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/root.d.ts +0 -6
  391. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/route.d.ts +0 -343
  392. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/routeInfo.d.ts +0 -48
  393. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/router.d.ts +0 -695
  394. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/scroll-restoration.d.ts +0 -1
  395. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchMiddleware.d.ts +0 -1
  396. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchParams.d.ts +0 -5
  397. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/RawStream.d.ts +0 -38
  398. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/seroval-plugins.d.ts +0 -1
  399. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/transformer.d.ts +0 -65
  400. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/stores.d.ts +0 -69
  401. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/structuralSharing.d.ts +0 -1
  402. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/typePrimitives.d.ts +0 -1
  403. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderData.d.ts +0 -1
  404. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderDeps.d.ts +0 -1
  405. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useNavigate.d.ts +0 -10
  406. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useParams.d.ts +0 -1
  407. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useRouteContext.d.ts +0 -1
  408. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useSearch.d.ts +0 -1
  409. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/utils.d.ts +0 -28
  410. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/validators.d.ts +0 -49
  411. package/skills/camox/references/cli-environments.md +0 -37
@@ -0,0 +1,55 @@
1
+ import { LayoutRequestContext } from "./requestContext.js";
2
+ import { LayoutCollectionItemResult, LayoutRoutesResult, RecordPages } from "./createLayout.js";
3
+ import { CollectionFieldBuilder, StringField } from "./lib/contentType.js";
4
+ import { SystemOrderKey } from "@camox/api-contract";
5
+ import { Static, TObject, TSchema } from "@sinclair/typebox";
6
+ //#region src/core/createCollection.d.ts
7
+ /** Record metadata names, reserved so query `orderBy` keys stay unambiguous. */
8
+ type ReservedFieldNames = { [K in SystemOrderKey]?: never; };
9
+ type TextKey<T extends Record<string, TSchema>> = { [K in keyof T & string]: T[K] extends {
10
+ fieldType: "String";
11
+ } ? K : never; }[keyof T & string];
12
+ /**
13
+ * A definition only: record authoring and querying are not public SDK APIs.
14
+ * `label` is checked against `content`'s return type: typing it against `T` directly would fix
15
+ * `T` before the `content` callback is inferred.
16
+ */
17
+ export declare function createCollection<const T extends Record<string, TSchema> & ReservedFieldNames, const L extends string>(options: {
18
+ id: string;
19
+ title: string;
20
+ description: string;
21
+ content: (field: CollectionFieldBuilder) => T & Record<NoInfer<L>, StringField>;
22
+ label: L;
23
+ }): Collection<T>;
24
+ /** The pages of a derived layout, one per record, found by the record's `by` field. */
25
+ export interface CollectionPages<T extends Record<string, TSchema>, Param extends string> {
26
+ loader: (input: {
27
+ params: { [K in Param]: string; };
28
+ context: LayoutRequestContext;
29
+ }) => Promise<LayoutCollectionItemResult<Static<TObject<T>>, string, T>>;
30
+ routes: (input: {
31
+ context: LayoutRequestContext;
32
+ }) => Promise<LayoutRoutesResult<{ [K in Param]: string; }>>;
33
+ /** Synced to the API, which checks no two records share the value pages are found by. */
34
+ recordPages: RecordPages;
35
+ }
36
+ /** The default erases the schema for heterogeneous app registries. */
37
+ export type Collection<T extends Record<string, TSchema> = any> = {
38
+ /**
39
+ * A record page's `loader` and `routes`, to spread into a derived layout whose route has
40
+ * `param`. Each page renders the record whose String field `by` equals the param.
41
+ */
42
+ pages: <const Param extends string>(options: {
43
+ by: TextKey<T>;
44
+ param: Param;
45
+ }) => CollectionPages<T, Param>;
46
+ _internal: {
47
+ id: string;
48
+ title: string;
49
+ description: string;
50
+ label: TextKey<T>;
51
+ contentSchema: TObject<T>;
52
+ };
53
+ };
54
+ //#endregion
55
+ export type { CollectionFieldBuilder };
@@ -0,0 +1,93 @@
1
+ import { collectionFieldBuilder } from "./lib/contentType.js";
2
+ import { notFound } from "./notFound.js";
3
+ import { getRecordLookup } from "./requestContext.js";
4
+ import { SYSTEM_ORDER_KEYS } from "@camox/api-contract";
5
+ import { Type } from "@sinclair/typebox";
6
+
7
+ //#region src/core/createCollection.ts
8
+ /**
9
+ * A definition only: record authoring and querying are not public SDK APIs.
10
+ * `label` is checked against `content`'s return type: typing it against `T` directly would fix
11
+ * `T` before the `content` callback is inferred.
12
+ */
13
+ function createCollection(options) {
14
+ if (!options.id.trim()) throw new Error("Collection id is required");
15
+ const content = options.content(collectionFieldBuilder);
16
+ for (const key of SYSTEM_ORDER_KEYS) if (Object.hasOwn(content, key)) throw new Error(`Collection "${options.id}" field "${key}": reserved field name`);
17
+ const supported = /* @__PURE__ */ new Set([
18
+ "String",
19
+ "Boolean",
20
+ "Enum",
21
+ "Embed",
22
+ "Image",
23
+ "File",
24
+ "ImageList",
25
+ "FileList",
26
+ "Reference",
27
+ "ReferenceList"
28
+ ]);
29
+ for (const [key, field] of Object.entries(content)) if (!supported.has(field.fieldType)) throw new Error(`Collection "${options.id}" field "${key}": ${String(field.fieldType)} storage is not supported yet`);
30
+ if (content[options.label]?.fieldType !== "String") throw new Error("Collection label must name a String field");
31
+ const id = options.id;
32
+ return {
33
+ pages({ by, param }) {
34
+ const ambiguousValue = (ids, value) => /* @__PURE__ */ new Error(`Collection "${id}": records ${ids.join(", ")} all have ${by} "${value}"`);
35
+ return {
36
+ async loader({ params, context }) {
37
+ const value = params[param];
38
+ if (!value || value.includes("/")) throw notFound();
39
+ const records = await getRecordLookup(context).findByField({
40
+ collectionId: id,
41
+ field: by,
42
+ value
43
+ });
44
+ if (records.length > 1) throw ambiguousValue(records.map((record) => record.id), value);
45
+ const [record] = records;
46
+ if (!record) throw notFound();
47
+ return {
48
+ kind: "collection-item",
49
+ collectionId: id,
50
+ data: {
51
+ id: record.id,
52
+ content: record.content,
53
+ ...record.references && { references: record.references },
54
+ ...record.updatedAt != null && { updatedAt: record.updatedAt }
55
+ }
56
+ };
57
+ },
58
+ async routes({ context }) {
59
+ const records = await getRecordLookup(context).listPageValues({
60
+ collectionId: id,
61
+ field: by
62
+ });
63
+ const idsByValue = /* @__PURE__ */ new Map();
64
+ for (const record of records) idsByValue.set(record.value, [...idsByValue.get(record.value) ?? [], record.id]);
65
+ for (const [value, ids] of idsByValue) if (ids.length > 1) throw ambiguousValue(ids, value);
66
+ return { data: records.map((record) => ({
67
+ params: { [param]: record.value },
68
+ target: {
69
+ kind: "collection-item",
70
+ collectionId: id,
71
+ id: record.id,
72
+ label: record.label
73
+ }
74
+ })) };
75
+ },
76
+ recordPages: {
77
+ collectionId: id,
78
+ field: by
79
+ }
80
+ };
81
+ },
82
+ _internal: {
83
+ id,
84
+ title: options.title,
85
+ description: options.description,
86
+ label: options.label,
87
+ contentSchema: Type.Object(content, { additionalProperties: false })
88
+ }
89
+ };
90
+ }
91
+
92
+ //#endregion
93
+ export { createCollection };
@@ -1,14 +1,17 @@
1
+ import { ReferenceScope } from "./lib/reference.js";
2
+ import { CollectionRecordId, LayoutRequestContext, LoadedRecord } from "./requestContext.js";
3
+ import { notFound } from "./notFound.js";
4
+ import { ContentProxy } from "./lib/contentType.js";
1
5
  import * as React from "react";
2
- import * as _$react_jsx_runtime0 from "react/jsx-runtime";
3
-
6
+ import { TSchema } from "@sinclair/typebox";
4
7
  //#region src/core/createLayout.d.ts
5
- interface OgImageParams {
8
+ export interface OgImageParams {
6
9
  title: string;
7
10
  description: string;
8
11
  projectName: string;
9
12
  }
10
- interface LayoutBlockData {
11
- _id: number;
13
+ export interface LayoutBlockData {
14
+ _id: string;
12
15
  type: string;
13
16
  content: Record<string, unknown>;
14
17
  settings?: Record<string, unknown>;
@@ -47,54 +50,181 @@ interface LayoutBlock<TLayoutOnly extends boolean = boolean> {
47
50
  * `Type 'X' is not assignable to type '❌ Camox: ...'`
48
51
  * instead of the unreadable structural diff on the full Block shape.
49
52
  */
50
- type ValidateLayoutOnlyBlocks<T extends readonly LayoutBlock[]> = { [K in keyof T]: T[K] extends LayoutBlock<true> ? T[K] : "❌ Camox: blocks in `blocks.before` and `blocks.after` must be defined with `layoutOnly: true`. Add `layoutOnly: true` to this block's `createBlock` options." };
51
- type ValidatePageContentBlocks<T extends readonly LayoutBlock[]> = { [K in keyof T]: T[K] extends LayoutBlock<true> ? "❌ Camox: blocks in `blocks.initial` must NOT be `layoutOnly: true` — `initial` is for page-content blocks. Remove `layoutOnly: true` from this block's `createBlock` options." : T[K] };
52
- interface CreateLayoutOptions<TBefore extends readonly LayoutBlock[], TAfter extends readonly LayoutBlock[], TInitial extends readonly LayoutBlock[]> {
53
+ type ValidateLayoutOnlyBlocks<T extends readonly LayoutBlock[]> = { [K in keyof T]: T[K] extends LayoutBlock<true> ? T[K] : "❌ Camox: blocks in `blocks.before` and `blocks.after` must be defined with `layoutOnly: true`. Add `layoutOnly: true` to this block's `createBlock` options."; };
54
+ /**
55
+ * A block module, imported only when Camox seeds the initial page. A static import would put
56
+ * the block in every visitor's bundle, since layouts load on every page.
57
+ */
58
+ type InitialBlockImport = () => Promise<{
59
+ block: LayoutBlock;
60
+ }>;
61
+ declare const INITIAL_LAYOUT_ONLY_ERROR = "❌ Camox: blocks in `blocks.initial` must NOT be `layoutOnly: true` — `initial` is for page-content blocks. Remove `layoutOnly: true` from this block's `createBlock` options.";
62
+ type ValidatePageContentBlocks<T extends readonly InitialBlockImport[]> = { [K in keyof T]: Awaited<ReturnType<T[K]>>["block"] extends LayoutBlock<true> ? typeof INITIAL_LAYOUT_ONLY_ERROR : T[K]; };
63
+ /** Successful ordinary loader result. Data must be JSON-serializable. */
64
+ export interface LayoutLoaderResult<Data = unknown> {
65
+ kind: "data";
66
+ data: Data;
67
+ }
68
+ declare const collectionFields: unique symbol;
69
+ /**
70
+ * A loader result rendering one collection record, as `collection.pages()` returns it. Wrappers
71
+ * keep the page bound to its record by returning it unchanged.
72
+ */
73
+ export interface LayoutCollectionItemResult<Content = Record<string, unknown>, CollectionId extends string = string, Fields extends Record<string, TSchema> = any> {
74
+ kind: "collection-item";
75
+ collectionId: CollectionId;
76
+ data: LoadedRecord<Content>;
77
+ /**
78
+ * Type only, never set: the collection's fields, which type `layout.Item`. Invariant, so that
79
+ * records of two collections never merge into one.
80
+ */
81
+ readonly [collectionFields]?: (fields: Fields) => Fields;
82
+ }
83
+ /**
84
+ * What `loader` receives: the page's params, the request context to pass through, and the
85
+ * page's locale.
86
+ */
87
+ export interface LayoutLoaderContext<Params = Record<string, string>> {
88
+ params: Params;
89
+ context: LayoutRequestContext;
90
+ /**
91
+ * The tag of the locale the page renders in, such as `de`, to fetch localized data with when
92
+ * its source has it. Camox renders the data as returned and never translates it.
93
+ */
94
+ locale: string;
95
+ }
96
+ /** What `routes` receives: the request context to pass through. */
97
+ export interface LayoutRoutesContext {
98
+ context: LayoutRequestContext;
99
+ }
100
+ /** Every successful loader result, before `useData` unwraps it. */
101
+ export type AnyLayoutLoaderResult = LayoutLoaderResult | LayoutCollectionItemResult;
102
+ type LoaderReturn = AnyLayoutLoaderResult | PromiseLike<AnyLayoutLoaderResult>;
103
+ /** The record a discovered page renders, independent of its current params. */
104
+ export interface LayoutRouteTarget extends CollectionRecordId {
105
+ kind: "collection-item";
106
+ /** The record's Label, which names its page where pages are listed (llms.txt). */
107
+ label?: string;
108
+ }
109
+ /** Route discovery result: the params of each page a derived layout can render. */
110
+ export interface LayoutRoutesResult<Params = Record<string, string>> {
111
+ data: ReadonlyArray<{
112
+ params: Params;
113
+ target?: LayoutRouteTarget;
114
+ }>;
115
+ }
116
+ type RoutesReturn<Params> = LayoutRoutesResult<Params> | PromiseLike<LayoutRoutesResult<Params>>;
117
+ type LoaderData<Result extends LoaderReturn> = [Result] extends [never] ? undefined : Awaited<Result>["data"];
118
+ type ResultFields<R> = R extends LayoutCollectionItemResult<any, any, infer F> ? F : never;
119
+ type IsUnion<T, U = T> = T extends unknown ? ([U] extends [T] ? false : true) : never;
120
+ type IsAny<T> = 0 extends 1 & T ? true : false;
121
+ /**
122
+ * The fields of the one collection whose records every loader result renders. `never` for
123
+ * external data, mixed results, several collections, or an envelope typed without its fields.
124
+ */
125
+ type RecordFields<Result> = [Awaited<Result>] extends [never] ? never : [Awaited<Result>] extends [LayoutCollectionItemResult<any, any, any>] ? true extends IsUnion<ResultFields<Awaited<Result>>> ? never : IsAny<ResultFields<Awaited<Result>>> extends true ? never : ResultFields<Awaited<Result>> : never;
126
+ type StringFieldKeys<F> = { [K in keyof F & string]: F[K] extends {
127
+ fieldType: "String";
128
+ } ? K : never; }[keyof F & string];
129
+ /** Record pages' meta callbacks also get the record's String fields as plain text. */
130
+ type MetaItem<F> = [F] extends [never] ? {} : {
131
+ item: { [K in StringFieldKeys<F>]: string; };
132
+ };
133
+ /** Record pages' `toMarkdown` also gets `item`, the reference-list Markdown builder. */
134
+ type MarkdownItem<F> = [F] extends [never] ? {} : F extends Record<string, TSchema> ? {
135
+ item: ContentProxy<F>;
136
+ } : {};
137
+ /** `layout.Item` exists only on layouts whose loader renders records of one collection. */
138
+ type ItemScope<F> = [F] extends [never] ? {} : F extends Record<string, TSchema> ? {
139
+ /** The page's record, read-only, with typed fields and the records it links. */
140
+ Item: (props: {
141
+ children: (item: ReferenceScope<F>) => React.ReactNode;
142
+ }) => React.ReactNode;
143
+ } : {};
144
+ /** What a page's metadata callbacks know about it. Curated pages have no loader data or params. */
145
+ export interface PageMetaContext<Data = unknown, Params = Record<string, string>> {
146
+ projectName: string;
147
+ pageFullPath: string;
148
+ data: Data;
149
+ params: Params;
150
+ }
151
+ /** On singleton and derived pages, `pageMetaTitle` is the layout's `title`. */
152
+ type BuildMetaTitle<Data, Params, F = never> = (params: PageMetaContext<Data, Params> & {
153
+ pageMetaTitle: string;
154
+ } & MetaItem<F>) => string;
155
+ /** Without it, curated pages use the editor's description and other pages have none. */
156
+ type BuildMetaDescription<Data, Params, F = never> = (params: PageMetaContext<Data, Params> & {
157
+ pageMetaDescription: string | undefined;
158
+ } & MetaItem<F>) => string | undefined;
159
+ /** The Markdown Representation of a code-owned page, between its layout blocks. */
160
+ type LayoutToMarkdown<Data, Params, F = never> = (context: {
161
+ data: Data;
162
+ params: Params;
163
+ } & MarkdownItem<F>) => readonly string[];
164
+ /** The collection a layout's record pages render, and the field each record is found by. */
165
+ export type RecordPages = {
166
+ collectionId: string;
167
+ field: string;
168
+ };
169
+ interface CreateLayoutOptions<TBefore extends readonly LayoutBlock[], TAfter extends readonly LayoutBlock[], TInitial extends readonly InitialBlockImport[], Result extends LoaderReturn = LoaderReturn> {
53
170
  id: string;
54
171
  kind?: "curated" | "derived" | "singleton";
55
- loader?: (context: {
56
- params: Record<string, string>;
57
- }) => unknown;
172
+ loader?: (context: LayoutLoaderContext) => Result;
173
+ /** Lists the pages of a derived layout, for the sitemap and the Canvas. */
174
+ routes?: (context: LayoutRoutesContext) => RoutesReturn<Record<string, string>>;
175
+ /** A derived layout's record pages, set by spreading `collection.pages(...)`. */
176
+ recordPages?: RecordPages;
58
177
  title: string;
59
178
  description: string;
60
179
  blocks: {
61
180
  before: ValidateLayoutOnlyBlocks<TBefore>;
62
- after: ValidateLayoutOnlyBlocks<TAfter>; /** Ordered list of blocks to create on the initial page when a project is first set up. */
181
+ after: ValidateLayoutOnlyBlocks<TAfter>;
182
+ /**
183
+ * Ordered list of blocks to create on the initial page when a project is first set up, as
184
+ * imports of their modules: `[() => import("../blocks/hero")]`.
185
+ */
63
186
  initial?: ValidatePageContentBlocks<TInitial>;
64
187
  };
65
188
  component: React.ComponentType<{
66
189
  children: React.ReactNode;
67
190
  }>;
68
- buildMetaTitle: (params: {
69
- pageMetaTitle: string;
70
- projectName: string;
71
- pageFullPath: string;
72
- }) => string;
191
+ buildMetaTitle: BuildMetaTitle<LoaderData<Result>, Record<string, string>, RecordFields<Result>>;
192
+ buildMetaDescription?: BuildMetaDescription<LoaderData<Result>, Record<string, string>, RecordFields<Result>>;
193
+ /** Singleton and derived layouts only. */
194
+ toMarkdown?: LayoutToMarkdown<LoaderData<Result>, Record<string, string>, RecordFields<Result>>;
73
195
  buildOgImage?: (params: OgImageParams) => React.ReactElement;
74
196
  }
75
- declare function createLayoutDefinition<const TBefore extends readonly LayoutBlock[], const TAfter extends readonly LayoutBlock[], const TInitial extends readonly LayoutBlock[] = []>(options: CreateLayoutOptions<TBefore, TAfter, TInitial>): {
197
+ declare function createLayoutDefinition<const TBefore extends readonly LayoutBlock[], const TAfter extends readonly LayoutBlock[], const TInitial extends readonly InitialBlockImport[] = []>(options: CreateLayoutOptions<TBefore, TAfter, TInitial>): {
76
198
  BeforeBlocks: {
77
- (): _$react_jsx_runtime0.JSX.Element;
199
+ (): React.JSX.Element;
78
200
  displayName: string;
79
201
  };
80
202
  AfterBlocks: {
81
- (): _$react_jsx_runtime0.JSX.Element;
203
+ (): React.JSX.Element;
204
+ displayName: string;
205
+ };
206
+ Item: {
207
+ ({ children }: {
208
+ children: (item: any) => React.ReactNode;
209
+ }): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | React.JSX.Element | null | undefined;
82
210
  displayName: string;
83
211
  };
84
212
  useData(): unknown;
85
213
  _internal: {
86
214
  id: string;
87
215
  kind: "curated" | "derived" | "singleton";
88
- loader: ((context: {
89
- params: Record<string, string>;
90
- }) => unknown) | undefined;
216
+ loader: ((context: LayoutLoaderContext) => LoaderReturn) | undefined;
217
+ routes: ((context: LayoutRoutesContext) => RoutesReturn<Record<string, string>>) | undefined;
218
+ recordPages: RecordPages | undefined;
91
219
  title: string;
92
220
  description: string;
93
- buildMetaTitle: (params: {
94
- pageMetaTitle: string;
95
- projectName: string;
96
- pageFullPath: string;
97
- }) => string;
221
+ buildMetaTitle: BuildMetaTitle<unknown, unknown>;
222
+ buildMetaDescription: BuildMetaDescription<unknown, unknown> | undefined;
223
+ toMarkdown: ((context: {
224
+ data: unknown;
225
+ params: unknown;
226
+ item?: unknown;
227
+ }) => readonly string[]) | undefined;
98
228
  buildOgImage: ((params: OgImageParams) => Promise<Response>) | undefined;
99
229
  blockDefinitions: ({
100
230
  type: string;
@@ -107,7 +237,7 @@ declare function createLayoutDefinition<const TBefore extends readonly LayoutBlo
107
237
  content: Record<string, unknown>;
108
238
  position: string;
109
239
  }[];
110
- placement: "before";
240
+ slot: "before";
111
241
  } | {
112
242
  type: string;
113
243
  content: Record<string, unknown>;
@@ -119,9 +249,9 @@ declare function createLayoutDefinition<const TBefore extends readonly LayoutBlo
119
249
  content: Record<string, unknown>;
120
250
  position: string;
121
251
  }[];
122
- placement: "after";
252
+ slot: "after";
123
253
  })[];
124
- initialBlockBundles: {
254
+ loadInitialBlockBundles: (() => Promise<{
125
255
  type: string;
126
256
  content: Record<string, unknown>;
127
257
  settings: Record<string, unknown>;
@@ -132,30 +262,39 @@ declare function createLayoutDefinition<const TBefore extends readonly LayoutBlo
132
262
  content: Record<string, unknown>;
133
263
  position: string;
134
264
  }[];
135
- }[] | undefined;
265
+ }[]>) | undefined;
136
266
  component: React.ComponentType<{
137
267
  children: React.ReactNode;
138
268
  }>;
139
- Provider: ({
140
- layoutBlocks,
141
- children,
142
- data
143
- }: {
269
+ Provider: ({ layoutBlocks, children, result }: {
144
270
  layoutBlocks: Record<string, LayoutBlockData>;
145
271
  children: React.ReactNode;
146
- data?: unknown;
147
- }) => _$react_jsx_runtime0.JSX.Element;
272
+ result?: AnyLayoutLoaderResult;
273
+ }) => React.JSX.Element;
148
274
  };
149
275
  };
150
- type Layout = ReturnType<typeof createLayoutDefinition>;
151
- interface LayoutFileRoutes {}
152
- type Params<Id extends string> = Id extends `${infer Head}.${infer Tail}` ? Params<Head> & Params<Tail> : Id extends `$${infer Name}` ? { [K in Name]: string } : {};
153
- type FileOptions<Id extends string, Data, B extends readonly LayoutBlock[], A extends readonly LayoutBlock[], I extends readonly LayoutBlock[]> = Omit<CreateLayoutOptions<B, A, I>, "id" | "kind" | "loader" | "component"> & ({
276
+ /** Any layout. `Item` is typed per layout, and only exists on record layouts' types. */
277
+ export type Layout = Omit<ReturnType<typeof createLayoutDefinition>, "Item">;
278
+ /** A layout typed by its loader: `useData` returns the loaded data, `Item` renders its record. */
279
+ type LayoutFor<Result extends LoaderReturn> = Omit<Layout, "useData" | "Item"> & {
280
+ useData: () => LoaderData<Result>;
281
+ } & ItemScope<RecordFields<Result>>;
282
+ export interface LayoutFileRoutes {}
283
+ type Params<Id extends string> = Id extends `${infer Head}.${infer Tail}` ? Params<Head> & Params<Tail> : Id extends `$${infer Name}` ? { [K in Name]: string; } : {};
284
+ type RouteParams<Id extends string> = Id extends keyof LayoutFileRoutes ? LayoutFileRoutes[Id] extends {
285
+ params: infer P;
286
+ } ? P : Params<Id> : Params<Id>;
287
+ type FileOptions<Id extends string, Result extends LoaderReturn, B extends readonly LayoutBlock[], A extends readonly LayoutBlock[], I extends readonly InitialBlockImport[]> = Omit<CreateLayoutOptions<B, A, I>, "id" | "kind" | "loader" | "routes" | "recordPages" | "component" | "buildMetaTitle" | "buildMetaDescription" | "toMarkdown"> & ({
154
288
  kind: "curated";
155
289
  component: React.ComponentType<{
156
290
  children: React.ReactNode;
157
291
  }>;
158
292
  loader?: never;
293
+ routes?: never;
294
+ recordPages?: never;
295
+ toMarkdown?: never;
296
+ buildMetaTitle: BuildMetaTitle<undefined, Record<string, never>>;
297
+ buildMetaDescription?: BuildMetaDescription<undefined, Record<string, never>>;
159
298
  } | {
160
299
  kind: "singleton";
161
300
  blocks: {
@@ -163,12 +302,15 @@ type FileOptions<Id extends string, Data, B extends readonly LayoutBlock[], A ex
163
302
  after: ValidateLayoutOnlyBlocks<A>;
164
303
  initial?: never;
165
304
  };
166
- loader?: (context: {
167
- params: Record<string, never>;
168
- }) => Data;
305
+ loader?: (context: LayoutLoaderContext<Record<string, never>>) => Result;
306
+ routes?: never;
307
+ recordPages?: never;
308
+ toMarkdown?: LayoutToMarkdown<LoaderData<Result>, Record<string, never>, RecordFields<Result>>;
169
309
  component: React.ComponentType<{
170
310
  children?: never;
171
311
  }>;
312
+ buildMetaTitle: BuildMetaTitle<LoaderData<Result>, Record<string, never>, RecordFields<Result>>;
313
+ buildMetaDescription?: BuildMetaDescription<LoaderData<Result>, Record<string, never>, RecordFields<Result>>;
172
314
  } | {
173
315
  kind: "derived";
174
316
  blocks: {
@@ -176,23 +318,17 @@ type FileOptions<Id extends string, Data, B extends readonly LayoutBlock[], A ex
176
318
  after: ValidateLayoutOnlyBlocks<A>;
177
319
  initial?: never;
178
320
  };
179
- loader: (context: {
180
- params: Id extends keyof LayoutFileRoutes ? LayoutFileRoutes[Id] extends {
181
- params: infer P;
182
- } ? P : Params<Id> : Params<Id>;
183
- }) => Data;
321
+ loader: (context: LayoutLoaderContext<RouteParams<Id>>) => Result;
322
+ routes?: (context: LayoutRoutesContext) => RoutesReturn<RouteParams<Id>>;
323
+ recordPages?: RecordPages;
324
+ toMarkdown?: LayoutToMarkdown<LoaderData<Result>, RouteParams<Id>, RecordFields<Result>>;
184
325
  component: React.ComponentType<{
185
326
  children?: never;
186
327
  }>;
328
+ buildMetaTitle: BuildMetaTitle<LoaderData<Result>, RouteParams<Id>, RecordFields<Result>>;
329
+ buildMetaDescription?: BuildMetaDescription<LoaderData<Result>, RouteParams<Id>, RecordFields<Result>>;
187
330
  });
188
- declare function createLayout<const Id extends string>(id: Id): <Data = undefined, const B extends readonly LayoutBlock[] = [], const A extends readonly LayoutBlock[] = [], const I extends readonly LayoutBlock[] = []>(options: FileOptions<Id, Data, B, A, I>) => Omit<Layout, "useData"> & {
189
- useData: () => Awaited<Data>;
190
- };
191
- declare function createLayout<const B extends readonly LayoutBlock[], const A extends readonly LayoutBlock[], const I extends readonly LayoutBlock[] = []>(options: CreateLayoutOptions<B, A, I>): Layout;
192
- /** Signal a missing derived page; other loader failures remain server errors. */
193
- declare function notFound(): Error & {
194
- status: number;
195
- code: string;
196
- };
331
+ export declare function createLayout<const B extends readonly LayoutBlock[], const A extends readonly LayoutBlock[], const I extends readonly InitialBlockImport[] = [], Result extends LoaderReturn = never>(options: CreateLayoutOptions<B, A, I, Result>): LayoutFor<Result>;
332
+ export declare function createLayout<const Id extends string>(id: Id): <Result extends LoaderReturn = never, const B extends readonly LayoutBlock[] = [], const A extends readonly LayoutBlock[] = [], const I extends readonly InitialBlockImport[] = []>(options: FileOptions<Id, Result, B, A, I>) => LayoutFor<Result>;
197
333
  //#endregion
198
- export { Layout, LayoutBlockData, LayoutFileRoutes, OgImageParams, createLayout, notFound };
334
+ export { type LayoutRequestContext, notFound };