camox 0.44.0 → 0.46.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 (407) 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 +1401 -0
  68. package/dist/features/canvas/CanvasLoadingScreen.js +35 -0
  69. package/dist/features/canvas/CanvasOverlays.js +254 -0
  70. package/dist/features/canvas/CanvasPageEdge.js +87 -0
  71. package/dist/features/canvas/CanvasPageFrame.js +333 -0
  72. package/dist/features/canvas/CanvasPageHeader.js +125 -0
  73. package/dist/features/canvas/CanvasPreviewPageSlot.js +123 -0
  74. package/dist/features/canvas/DerivedPagePathInput.js +238 -0
  75. package/dist/features/canvas/canvasCamera.js +229 -0
  76. package/dist/features/canvas/canvasFlight.js +104 -0
  77. package/dist/features/canvas/canvasFrameCapture.js +364 -0
  78. package/dist/features/canvas/canvasFrameDocument.js +302 -0
  79. package/dist/features/canvas/canvasFrameMode.js +53 -0
  80. package/dist/features/canvas/canvasInsertionSeams.js +44 -0
  81. package/dist/features/canvas/canvasItems.js +30 -0
  82. package/dist/features/canvas/canvasOverlayGeometry.js +240 -0
  83. package/dist/features/canvas/canvasPages.js +79 -0
  84. package/dist/features/canvas/canvasScreenSpace.js +26 -0
  85. package/dist/features/canvas/canvasSelection.js +18 -0
  86. package/dist/features/canvas/canvasStore.js +60 -0
  87. package/dist/features/canvas/canvasThumbnails.js +304 -0
  88. package/dist/features/canvas/canvasZoom.js +10 -0
  89. package/dist/features/canvas/sidebar/CanvasInspector.js +202 -0
  90. package/dist/features/canvas/sidebar/CanvasNavigator.js +124 -0
  91. package/dist/features/canvas/sidebar/CanvasSidebar.js +54 -0
  92. package/dist/features/canvas/sidebar/CanvasSidebarFrame.js +48 -0
  93. package/dist/features/canvas/sidebar/CanvasSidebarSkeleton.js +39 -0
  94. package/dist/features/canvas/sidebar/CuratedPageInspector.js +69 -0
  95. package/dist/features/canvas/sidebar/DerivedPageInspector.js +37 -0
  96. package/dist/features/canvas/sidebar/LayoutPageBlocks.js +78 -0
  97. package/dist/features/canvas/sidebar/LayoutPageOverview.js +71 -0
  98. package/dist/features/canvas/sidebar/PageInspector.js +157 -0
  99. package/dist/features/canvas/sidebar/PageInspectorSkeleton.js +90 -0
  100. package/dist/features/canvas/sidebar/PageOverview.js +27 -0
  101. package/dist/features/canvas/sidebar/SingletonPageInspector.js +31 -0
  102. package/dist/features/canvas/useCanvasCamera.js +783 -0
  103. package/dist/features/canvas/useCanvasFrame.js +148 -0
  104. package/dist/features/canvas/useCanvasFrameInput.js +97 -0
  105. package/dist/features/canvas/useCanvasNearness.js +57 -0
  106. package/dist/features/canvas/useDiscoveredPreviewPaths.js +62 -0
  107. package/dist/features/content/CamoxContent.d.ts +2 -5
  108. package/dist/features/content/CamoxContent.js +174 -271
  109. package/dist/features/content/CollectionItemSheetContext.js +106 -0
  110. package/dist/features/content/ContentAssets.js +315 -0
  111. package/dist/features/content/ContentCollection.js +663 -0
  112. package/dist/features/content/collection-form.js +58 -0
  113. package/dist/features/content/components/AssetCard.js +80 -84
  114. package/dist/features/content/components/AssetCardSkeleton.js +4 -8
  115. package/dist/features/content/components/ContentSidebar.js +129 -18
  116. package/dist/features/content/components/ContentSidebarGroup.js +37 -0
  117. package/dist/features/content/components/DeleteCollectionItemButton.js +202 -0
  118. package/dist/features/content/components/MissingFromLocale.js +282 -0
  119. package/dist/features/content/components/UploadDropZone.js +27 -31
  120. package/dist/features/content/components/UploadProgressDrawer.js +90 -98
  121. package/dist/features/navigation/navigation.d.ts +66 -20
  122. package/dist/features/navigation/navigation.js +257 -90
  123. package/dist/features/og/defaultFonts.js +8 -8
  124. package/dist/features/og/geist-variable-ttf-base64.js +1 -1
  125. package/dist/features/og/imageResponse.d.ts +8 -0
  126. package/dist/features/og/imageResponse.js +26 -0
  127. package/dist/features/page/CuratedPageContent.js +167 -0
  128. package/dist/features/page/DerivedPageContent.js +26 -30
  129. package/dist/features/page/SharedLayoutContent.js +25 -27
  130. package/dist/features/preview/CamoxPreview.d.ts +23 -61
  131. package/dist/features/preview/CamoxPreview.js +816 -537
  132. package/dist/features/preview/EditablePageContent.js +1 -1
  133. package/dist/features/preview/EditablePageExperience.js +16 -22
  134. package/dist/features/preview/components/AddBlockSheet.js +273 -0
  135. package/dist/features/preview/components/AssetFieldEditor.js +173 -154
  136. package/dist/features/preview/components/AssetLightbox.js +181 -134
  137. package/dist/features/preview/components/AssetPickerModal.js +153 -170
  138. package/dist/features/preview/components/BlockActionsPopover.js +150 -149
  139. package/dist/features/preview/components/BlockErrorBoundary.js +8 -12
  140. package/dist/features/preview/components/BlockThumbnail.js +172 -98
  141. package/dist/features/preview/components/CanvasPreview.js +243 -0
  142. package/dist/features/preview/components/CreatePageModal.js +128 -137
  143. package/dist/features/preview/components/DebouncedFieldEditor.js +29 -33
  144. package/dist/features/preview/components/DerivedLayoutDialog.js +21 -19
  145. package/dist/features/preview/components/DrillRow.js +150 -0
  146. package/dist/features/preview/components/FieldOverlayStyles.js +11 -8
  147. package/dist/features/preview/components/FieldToolbar.js +160 -110
  148. package/dist/features/preview/components/Frame.js +108 -20
  149. package/dist/features/preview/components/IconFieldEditor.js +62 -66
  150. package/dist/features/preview/components/ItemFieldsEditor.js +231 -205
  151. package/dist/features/preview/components/LinkFieldEditor.js +135 -139
  152. package/dist/features/preview/components/Metadata.js +22 -30
  153. package/dist/features/preview/components/MobilePreviewDrawer.js +89 -108
  154. package/dist/features/preview/components/MultipleAssetFieldEditor.js +334 -246
  155. package/dist/features/preview/components/OverlayTracker.js +9 -41
  156. package/dist/features/preview/components/Overlays.js +81 -69
  157. package/dist/features/preview/components/PageInfo.js +1748 -0
  158. package/dist/features/preview/components/PageInfoSkeleton.js +51 -0
  159. package/dist/features/preview/components/PageLocationFieldset.js +112 -116
  160. package/dist/features/preview/components/PageNavigatorHeader.js +24 -0
  161. package/dist/features/preview/components/PageNicknameField.js +22 -26
  162. package/dist/features/preview/components/PagePicker.js +128 -130
  163. package/dist/features/preview/components/PageTree.js +525 -532
  164. package/dist/features/preview/components/PreviewActivation.js +28 -32
  165. package/dist/features/preview/components/PreviewPanel.js +620 -319
  166. package/dist/features/preview/components/PreviewToolbar.js +105 -333
  167. package/dist/features/preview/components/RecordCard.js +80 -0
  168. package/dist/features/preview/components/RecordCombobox.js +178 -0
  169. package/dist/features/preview/components/ReferenceFieldEditor.js +149 -0
  170. package/dist/features/preview/components/ReferenceListFieldEditor.js +432 -0
  171. package/dist/features/preview/components/RemovedBlockPlaceholder.js +95 -0
  172. package/dist/features/preview/components/RepeatableItemsList.js +125 -138
  173. package/dist/features/preview/components/SelectionEditor.js +993 -0
  174. package/dist/features/preview/components/ShikiMarkdown.js +14 -18
  175. package/dist/features/preview/components/SidebarSection.js +52 -64
  176. package/dist/features/preview/components/StudioEditingFallback.js +56 -0
  177. package/dist/features/preview/components/UnlinkAssetButton.js +104 -107
  178. package/dist/features/preview/components/blockGridNavigation.js +15 -0
  179. package/dist/features/preview/components/contentFieldSchema.js +8 -0
  180. package/dist/features/preview/components/useFieldWriter.js +200 -0
  181. package/dist/features/preview/components/useRecordView.js +383 -0
  182. package/dist/features/preview/components/useRepeatableItemActions.js +35 -37
  183. package/dist/features/preview/components/useUpdateBlockPosition.js +37 -37
  184. package/dist/features/preview/editingFrame.js +197 -0
  185. package/dist/features/preview/overlayHighlights.js +17 -44
  186. package/dist/features/preview/overlayMessages.js +72 -1
  187. package/dist/features/preview/pageRecord.js +189 -0
  188. package/dist/features/preview/previewConstants.js +6 -2
  189. package/dist/features/preview/previewPageFrame.js +95 -0
  190. package/dist/features/preview/previewPreparation.js +7 -0
  191. package/dist/features/preview/previewSelection.js +32 -63
  192. package/dist/features/preview/previewStore.js +225 -123
  193. package/dist/features/preview/referencePickerFocus.js +29 -0
  194. package/dist/features/preview/repeatableItemTargets.js +56 -0
  195. package/dist/features/preview/selectionReveal.js +21 -0
  196. package/dist/features/preview/usePreviewViewportActions.js +114 -0
  197. package/dist/features/preview/viewportContinuity.js +109 -0
  198. package/dist/features/provider/AuthenticatedCamoxProvider.js +69 -44
  199. package/dist/features/provider/CamoxProvider.d.ts +3 -6
  200. package/dist/features/provider/CamoxProvider.js +38 -50
  201. package/dist/features/provider/CoreCamoxProvider.js +69 -50
  202. package/dist/features/provider/LocalhostPreviewProvider.js +78 -114
  203. package/dist/features/provider/PreviewSignInPage.js +54 -0
  204. package/dist/features/provider/components/CamoxAppContext.js +11 -11
  205. package/dist/features/provider/components/CommandPalette.js +75 -82
  206. package/dist/features/provider/useAdminShortcuts.js +7 -11
  207. package/dist/features/routes/pageRuntime.d.ts +44 -4
  208. package/dist/features/routes/pageRuntime.js +244 -137
  209. package/dist/features/runtime/RuntimeChrome.js +117 -115
  210. package/dist/features/runtime/alternates.js +64 -0
  211. package/dist/features/runtime/analytics.d.ts +7 -0
  212. package/dist/features/runtime/analytics.js +66 -0
  213. package/dist/features/runtime/artifactSources.js +87 -0
  214. package/dist/features/runtime/editingFallback.js +20 -0
  215. package/dist/features/runtime/linkPrefetch.js +97 -0
  216. package/dist/features/runtime/livePages.js +62 -0
  217. package/dist/features/runtime/llmsTxt.js +40 -0
  218. package/dist/features/runtime/loopbackFetch.js +18 -0
  219. package/dist/features/runtime/navigationAccessibility.js +51 -0
  220. package/dist/features/runtime/navigationTarget.js +23 -2
  221. package/dist/features/runtime/pageApp.js +229 -158
  222. package/dist/features/runtime/pageBlockTypes.js +20 -0
  223. package/dist/features/runtime/pageClient.d.ts +2 -4
  224. package/dist/features/runtime/pageClient.js +18 -3
  225. package/dist/features/runtime/pageNavigation.js +254 -32
  226. package/dist/features/runtime/pageServer.d.ts +2 -4
  227. package/dist/features/runtime/pageServer.js +6 -2
  228. package/dist/features/runtime/pageViewport.js +7 -0
  229. package/dist/features/runtime/runtime.d.ts +54 -24
  230. package/dist/features/runtime/runtime.js +766 -191
  231. package/dist/features/runtime/runtimeChromeLoader.js +58 -0
  232. package/dist/features/runtime/runtimeRoutes.d.ts +19 -0
  233. package/dist/features/runtime/runtimeRoutes.js +25 -0
  234. package/dist/features/runtime/scrollRestoration.js +133 -0
  235. package/dist/features/runtime/studioApp.d.ts +4 -3
  236. package/dist/features/runtime/studioApp.js +5 -9
  237. package/dist/features/runtime/studioClient.d.ts +2 -4
  238. package/dist/features/runtime/studioClient.js +12 -3
  239. package/dist/features/runtime/studioServer.d.ts +2 -4
  240. package/dist/features/runtime/studioServer.js +6 -1
  241. package/dist/features/runtime/worker.d.ts +6 -0
  242. package/dist/features/runtime/worker.js +23 -0
  243. package/dist/features/runtime/workerRequest.js +44 -0
  244. package/dist/features/studio/CamoxStudio.d.ts +2 -6
  245. package/dist/features/studio/CamoxStudio.js +34 -49
  246. package/dist/features/studio/FollowAgentProvider.js +327 -0
  247. package/dist/features/studio/components/ChatSidebar.js +356 -0
  248. package/dist/features/studio/components/DraftsControl.js +676 -0
  249. package/dist/features/studio/components/FaviconDialog.js +318 -0
  250. package/dist/features/studio/components/LocalePicker.js +785 -0
  251. package/dist/features/studio/components/Navbar.js +123 -103
  252. package/dist/features/studio/components/ProjectMenu.js +239 -260
  253. package/dist/features/studio/components/RenameDraftDialog.js +206 -0
  254. package/dist/features/studio/components/ReviewDraftSheet.js +1472 -0
  255. package/dist/features/studio/components/ThreadComposer.js +157 -0
  256. package/dist/features/studio/components/ThreadMarkdown.js +113 -0
  257. package/dist/features/studio/components/ThreadMessages.js +270 -0
  258. package/dist/features/studio/components/UserButton.js +34 -23
  259. package/dist/features/studio/draftLabel.js +33 -0
  260. package/dist/features/studio/draftNotice.js +13 -0
  261. package/dist/features/studio/followAgent.js +241 -0
  262. package/dist/features/studio/followAgentContext.js +7 -0
  263. package/dist/features/studio/localeOptions.js +118 -0
  264. package/dist/features/studio/localeSwitch.js +19 -0
  265. package/dist/features/studio/routes.js +26 -1
  266. package/dist/features/studio/studioStore.js +64 -1
  267. package/dist/features/studio/useTheme.js +24 -27
  268. package/dist/features/vite/artifactRuntimeMinification.js +36 -0
  269. package/dist/features/vite/blockBoilerplate.js +6 -5
  270. package/dist/features/vite/blockChunks.js +31 -0
  271. package/dist/features/vite/bundlerLogs.js +17 -0
  272. package/dist/features/vite/definitionsSync.js +158 -226
  273. package/dist/features/vite/devAuthentication.js +4 -16
  274. package/dist/features/vite/devSignIn.js +87 -0
  275. package/dist/features/vite/iconGeneration.js +1 -1
  276. package/dist/features/vite/layoutGeneration.js +11 -1
  277. package/dist/features/vite/publishSeededContent.js +30 -0
  278. package/dist/features/vite/routeGeneration.js +6 -7
  279. package/dist/features/vite/runtimeDev.js +80 -99
  280. package/dist/features/vite/vite.d.ts +51 -31
  281. package/dist/features/vite/vite.js +224 -127
  282. package/dist/features/vite/workerBuild.js +39 -0
  283. package/dist/hooks/use-debounced-field.js +116 -47
  284. package/dist/hooks/use-file-upload.js +114 -67
  285. package/dist/hooks/use-marquee-selection.js +32 -36
  286. package/dist/hooks/use-page-destinations.js +69 -37
  287. package/dist/lib/api-client-server.d.ts +5 -0
  288. package/dist/lib/api-client-server.js +10 -4
  289. package/dist/lib/api-client.d.ts +6 -0
  290. package/dist/lib/api-client.js +51 -16
  291. package/dist/lib/api-socket.js +17 -0
  292. package/dist/lib/auth-page-styles.js +39 -0
  293. package/dist/lib/auth.js +129 -61
  294. package/dist/lib/collection-cache.js +23 -0
  295. package/dist/lib/draft-scope.d.ts +4 -0
  296. package/dist/lib/draft-scope.js +222 -0
  297. package/dist/lib/html.js +12 -0
  298. package/dist/lib/link-pages.js +154 -0
  299. package/dist/lib/locale-path.d.ts +22 -0
  300. package/dist/lib/locale-path.js +57 -0
  301. package/dist/lib/normalized-data.js +252 -152
  302. package/dist/lib/preview-handoff.js +2 -2
  303. package/dist/lib/queries.d.ts +11 -0
  304. package/dist/lib/queries.js +70 -141
  305. package/dist/lib/studio-reads.d.ts +14 -0
  306. package/dist/lib/studio-reads.js +554 -0
  307. package/dist/lib/use-project-room.js +50 -50
  308. package/dist/lib/use-thread.js +310 -0
  309. package/dist/lib/utils.js +25 -29
  310. package/dist/lib/view-locale-context.js +22 -0
  311. package/dist/lib/view-locale.js +46 -0
  312. package/dist/package.js +5 -0
  313. package/dist/studio-overlays.css +41 -151
  314. package/dist/studio.css +2 -2
  315. package/package.json +70 -73
  316. package/skills/camox/SKILL.md +16 -11
  317. package/skills/camox/references/artifacts.md +179 -0
  318. package/skills/camox/references/block-definitions.md +75 -59
  319. package/skills/camox/references/cli-common.md +9 -11
  320. package/skills/camox/references/cli-content.md +92 -69
  321. package/skills/camox/references/cli-publishing.md +26 -0
  322. package/skills/camox/references/dom-integrations.md +27 -0
  323. package/skills/camox/references/field-styling.md +4 -4
  324. package/skills/camox/references/layout-definitions.md +16 -14
  325. package/skills/camox/references/localization.md +56 -0
  326. package/skills/camox/references/routed-layouts.md +133 -15
  327. package/skills/camox-expand/SKILL.md +70 -0
  328. package/skills/camox-expand/references/jobs.md +39 -0
  329. package/skills/camoxify/SKILL.md +29 -7
  330. package/dist/core/components/AddBlockControlBar.js +0 -78
  331. package/dist/core/hooks/useRequireDraftSource.js +0 -23
  332. package/dist/features/metadata/sitemap.d.ts +0 -8
  333. package/dist/features/metadata/sitemap.js +0 -17
  334. package/dist/features/og/imageResponse.node.d.ts +0 -12
  335. package/dist/features/og/imageResponse.node.js +0 -49
  336. package/dist/features/og/imageResponse.workerd.d.ts +0 -12
  337. package/dist/features/og/imageResponse.workerd.js +0 -40
  338. package/dist/features/page/PublishedPageContent.js +0 -205
  339. package/dist/features/page/PublishedPageExperience.js +0 -23
  340. package/dist/features/preview/DerivedPreview.js +0 -134
  341. package/dist/features/preview/commentsEnabled.js +0 -8
  342. package/dist/features/preview/components/AddBlockSidebar.js +0 -381
  343. package/dist/features/preview/components/AttachedComments.js +0 -331
  344. package/dist/features/preview/components/CommentHeader.js +0 -122
  345. package/dist/features/preview/components/CommentSidebar.js +0 -29
  346. package/dist/features/preview/components/CommentTargetQuote.js +0 -167
  347. package/dist/features/preview/components/DerivedLayoutSidebar.d.ts +0 -5
  348. package/dist/features/preview/components/DerivedLayoutSidebar.js +0 -179
  349. package/dist/features/preview/components/DerivedPageInfoSidebar.js +0 -69
  350. package/dist/features/preview/components/LeftSidebar.js +0 -68
  351. package/dist/features/preview/components/PageEditorSidebar.js +0 -563
  352. package/dist/features/preview/components/PageInfoSidebar.js +0 -1551
  353. package/dist/features/preview/components/PageNavigatorSidebar.js +0 -78
  354. package/dist/features/preview/components/PageStatusBadge.js +0 -97
  355. package/dist/features/preview/components/PeekedBlock.js +0 -217
  356. package/dist/features/preview/components/PreviewComments.js +0 -56
  357. package/dist/features/preview/components/PreviewToolbarSpacer.js +0 -43
  358. package/dist/features/preview/components/PublicationRow.js +0 -422
  359. package/dist/features/preview/components/PublishDialog.js +0 -194
  360. package/dist/features/preview/components/RightSidebar.js +0 -59
  361. package/dist/features/preview/components/SendFeedbackDialog.js +0 -83
  362. package/dist/features/preview/previewCommentsStore.js +0 -135
  363. package/dist/features/preview/publication.js +0 -81
  364. package/dist/features/preview/usePageComments.js +0 -39
  365. package/dist/features/runtime/SharedChromeContext.js +0 -7
  366. package/dist/features/studio/components/EnvironmentMenu.js +0 -425
  367. package/dist/features/vite/appGeneration.js +0 -89
  368. package/dist/lib/view-queries.js +0 -28
  369. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/Matches.d.ts +0 -114
  370. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/RouterProvider.d.ts +0 -25
  371. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/config.d.ts +0 -1
  372. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/defer.d.ts +0 -1
  373. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/fileRoute.d.ts +0 -20
  374. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/global.d.ts +0 -8
  375. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/hash-scroll.d.ts +0 -1
  376. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/index.d.ts +0 -18
  377. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/link.d.ts +0 -161
  378. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/load-matches.d.ts +0 -6
  379. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/location.d.ts +0 -54
  380. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/lru-cache.d.ts +0 -8
  381. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/manifest.d.ts +0 -32
  382. 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
  383. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/not-found.d.ts +0 -1
  384. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/redirect.d.ts +0 -49
  385. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/rewrite.d.ts +0 -1
  386. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/root.d.ts +0 -6
  387. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/route.d.ts +0 -343
  388. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/routeInfo.d.ts +0 -48
  389. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/router.d.ts +0 -695
  390. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/scroll-restoration.d.ts +0 -1
  391. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchMiddleware.d.ts +0 -1
  392. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchParams.d.ts +0 -5
  393. 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
  394. 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
  395. 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
  396. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/stores.d.ts +0 -69
  397. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/structuralSharing.d.ts +0 -1
  398. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/typePrimitives.d.ts +0 -1
  399. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderData.d.ts +0 -1
  400. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderDeps.d.ts +0 -1
  401. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useNavigate.d.ts +0 -10
  402. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useParams.d.ts +0 -1
  403. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useRouteContext.d.ts +0 -1
  404. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useSearch.d.ts +0 -1
  405. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/utils.d.ts +0 -28
  406. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/validators.d.ts +0 -49
  407. 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 };