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