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,87 @@
1
+ import { createPreviewSignInUrl, isLoopbackUrl } from "@camox/cli/auth";
2
+ import childProcess from "node:child_process";
3
+ import { open } from "node:fs/promises";
4
+ import { setTimeout } from "node:timers/promises";
5
+
6
+ //#region src/features/vite/devSignIn.ts
7
+ const openedKey = Symbol.for("camox.devSignIn.opened");
8
+ const processState = globalThis;
9
+ const opened = processState[openedKey] ??= /* @__PURE__ */ new Set();
10
+ function openBrowser(url, onError) {
11
+ const command = process.platform === "darwin" ? "open" : process.platform === "win32" ? "rundll32.exe" : "xdg-open";
12
+ const args = process.platform === "win32" ? ["url.dll,FileProtocolHandler", url] : [url];
13
+ try {
14
+ const child = childProcess.spawn(command, args, {
15
+ stdio: "ignore",
16
+ detached: true
17
+ });
18
+ child.once("error", onError);
19
+ child.once("exit", (code) => {
20
+ if (code !== 0) onError();
21
+ });
22
+ child.unref();
23
+ } catch {
24
+ onError();
25
+ }
26
+ }
27
+ /** Mint only after Vite has resolved its actual port, including port fallback. */
28
+ function installDevSignInLink(server, options) {
29
+ const controller = new AbortController();
30
+ server.httpServer?.once("close", () => controller.abort());
31
+ const printUrls = server.printUrls.bind(server);
32
+ let started = false;
33
+ server.printUrls = () => {
34
+ printUrls();
35
+ if (started) return;
36
+ const urls = server.resolvedUrls;
37
+ const destination = [...urls?.local ?? [], ...urls?.network ?? []].find((url) => isLoopbackUrl(new URL(url)));
38
+ if (!destination) return;
39
+ started = true;
40
+ printSignInLink(destination);
41
+ };
42
+ async function printSignInLink(destination) {
43
+ const signal = AbortSignal.any([controller.signal, AbortSignal.timeout(3e4)]);
44
+ while (!signal.aborted) try {
45
+ const url = await createPreviewSignInUrl(destination, {
46
+ projectUuid: options.projectUuid,
47
+ apiUrl: options.apiUrl
48
+ }, options.authToken, signal);
49
+ if (signal.aborted) return;
50
+ server.config.logger.info(` ➜ Camox sign in (single-use, expires in 3 minutes; do not share): ${url}`);
51
+ if (options.open) await openSignInLink(url);
52
+ return;
53
+ } catch {
54
+ try {
55
+ await setTimeout(1e3, void 0, { signal });
56
+ } catch {
57
+ break;
58
+ }
59
+ }
60
+ if (controller.signal.aborted) return;
61
+ server.config.logger.warn("Camox sign-in link unavailable. Use the normal local URL to sign in, or run camox preview for a fresh link.");
62
+ }
63
+ async function openSignInLink(url) {
64
+ let warned = false;
65
+ const warn = () => {
66
+ if (warned || controller.signal.aborted) return;
67
+ warned = true;
68
+ server.config.logger.warn("Camox could not open your browser. Use the sign-in link printed above.");
69
+ };
70
+ try {
71
+ if (options.openOnceFile) await (await open(options.openOnceFile, "wx", 384)).close();
72
+ else {
73
+ const key = JSON.stringify([server.config.root, options.projectUuid]);
74
+ if (opened.has(key)) return;
75
+ opened.add(key);
76
+ }
77
+ if (controller.signal.aborted) return;
78
+ openBrowser(url, warn);
79
+ } catch (error) {
80
+ if (error.code === "EEXIST") return;
81
+ warn();
82
+ }
83
+ }
84
+ }
85
+
86
+ //#endregion
87
+ export { installDevSignInLink };
@@ -0,0 +1,16 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { iconCollectionIds, loadIconCollection } from "@camox/api-contract/icon-catalog";
4
+
5
+ //#region src/features/vite/iconGeneration.ts
6
+ async function generateIconTypes(root, prefix) {
7
+ const ids = prefix ? iconCollectionIds(await loadIconCollection(prefix)) : [];
8
+ mkdirSync(resolve(root, "src/camox"), { recursive: true });
9
+ const union = ids.map((id) => JSON.stringify(id));
10
+ const type = union.length > 1 ? `\n | ${union.join("\n | ")}` : union[0] ?? "never";
11
+ writeFileSync(resolve(root, "src/camox/icons.gen.d.ts"), `// Generated by Camox. Do not edit.\nexport {};\ndeclare global {\n interface CamoxIconRegistry {\n ids:${union.length > 1 ? "" : " "}${type};\n }\n}\n`);
12
+ return ids;
13
+ }
14
+
15
+ //#endregion
16
+ export { generateIconTypes };
@@ -37,6 +37,16 @@ export const Layout = createLayout(${JSON.stringify(id)})({
37
37
  }
38
38
  writeIfChanged(resolve(appRoot, "src/camox/layouts.gen.d.ts"), `// Generated by Camox.\nimport "camox/createLayout";\ndeclare module "camox/createLayout" {\n interface LayoutFileRoutes ${declarations.length ? `{\n${declarations.join("\n")}\n }` : "{}"}\n}\n`);
39
39
  }
40
+ /** Regenerate layout files whenever a layout file is added, changed or deleted. */
41
+ function watchLayoutFiles(server, appRoot) {
42
+ for (const event of [
43
+ "add",
44
+ "change",
45
+ "unlink"
46
+ ]) server.watcher.on(event, (path) => {
47
+ if (path.startsWith(resolve(appRoot, "src/layouts") + "/")) generateLayoutFiles(appRoot);
48
+ });
49
+ }
40
50
 
41
51
  //#endregion
42
- export { generateLayoutFiles };
52
+ export { generateLayoutFiles, watchLayoutFiles };
@@ -0,0 +1,30 @@
1
+ //#region src/features/vite/publishSeededContent.ts
2
+ /**
3
+ * Publishes the content dev mode seeded into the development draft, so a fresh database starts
4
+ * with it on Live and the draft only holds the developer's own changes. Failures are warnings:
5
+ * the content stays in the draft, where it can still be published by hand.
6
+ */
7
+ async function publishSeededContent(options) {
8
+ const { client, projectUuid, logger } = options;
9
+ try {
10
+ const project = await client.projects.getByUuid({ projectUuid });
11
+ const preview = await client.drafts.previewPublish({ projectId: project.id });
12
+ if (preview.changes.length === 0) return;
13
+ if (preview.blockers.length > 0) {
14
+ const blockers = preview.blockers.map((blocker) => blocker.message).join("; ");
15
+ logger.warn(`[camox] Seeded content stays in your development draft; publishing is blocked: ${blockers}`, { timestamp: true });
16
+ return;
17
+ }
18
+ await client.drafts.publish({
19
+ projectId: project.id,
20
+ token: preview.token,
21
+ publishAnyway: true
22
+ });
23
+ logger.info(`[camox] Published ${preview.changes.length} seeded change${preview.changes.length === 1 ? "" : "s"} to Live`, { timestamp: true });
24
+ } catch (error) {
25
+ logger.warn(`[camox] Publishing seeded content failed: ${String(error)}`, { timestamp: true });
26
+ }
27
+ }
28
+
29
+ //#endregion
30
+ export { publishSeededContent };
@@ -1,6 +1,6 @@
1
1
  import { STUDIO_ROUTE_SEGMENT } from "../studio/routes.js";
2
- import { mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
3
- import { relative, resolve } from "node:path";
2
+ import { readFileSync, unlinkSync } from "node:fs";
3
+ import { resolve } from "node:path";
4
4
 
5
5
  //#region src/features/vite/routeGeneration.ts
6
6
  const HEADER = `/* ============================================================================
@@ -15,7 +15,8 @@ const HEADER = `/* =============================================================
15
15
  // @ts-nocheck
16
16
 
17
17
  `;
18
- function removeObsoleteRouteFiles(routesDir) {
18
+ /** Deletes the route files that the old TanStack integration generated. */
19
+ function cleanupGeneratedRouteFiles(routesDir) {
19
20
  const camoxDir = resolve(routesDir, "_camox");
20
21
  const studioDir = resolve(routesDir, "(camox)", "(_studio)");
21
22
  const obsoletePaths = [
@@ -34,7 +35,8 @@ function removeObsoleteRouteFiles(routesDir) {
34
35
  resolve(routesDir, "(camox)", "(_preview)", "og.tsx"),
35
36
  resolve(studioDir, `${STUDIO_ROUTE_SEGMENT}.tsx`),
36
37
  resolve(studioDir, `${STUDIO_ROUTE_SEGMENT}.$.tsx`),
37
- resolve(studioDir, `${STUDIO_ROUTE_SEGMENT}.content.tsx`)
38
+ resolve(studioDir, `${STUDIO_ROUTE_SEGMENT}.content.tsx`),
39
+ resolve(studioDir, `${STUDIO_ROUTE_SEGMENT}.content.assets.tsx`)
38
40
  ];
39
41
  for (const filePath of obsoletePaths) try {
40
42
  if (!readFileSync(filePath, "utf-8").startsWith(HEADER)) continue;
@@ -44,9 +46,6 @@ function removeObsoleteRouteFiles(routesDir) {
44
46
  throw error;
45
47
  }
46
48
  }
47
- function cleanupGeneratedRouteFiles(routesDir) {
48
- removeObsoleteRouteFiles(routesDir);
49
- }
50
49
 
51
50
  //#endregion
52
51
  export { cleanupGeneratedRouteFiles };
@@ -5,12 +5,11 @@ import { fileURLToPath } from "node:url";
5
5
  //#region src/features/vite/runtimeDev.ts
6
6
  const sdkRoot = resolve(dirname(fileURLToPath(import.meta.url)), "../../..");
7
7
  const VIRTUAL_CAMOX_APP = "virtual:camox/app";
8
- const RESOLVED_VIRTUAL_CAMOX_APP = "\0" + VIRTUAL_CAMOX_APP;
8
+ const RESOLVED_VIRTUAL_CAMOX_APP = "\0virtual:camox/app";
9
9
  const VIRTUAL_CAMOX_DOCUMENT = "virtual:camox/document";
10
- const RESOLVED_VIRTUAL_CAMOX_DOCUMENT = "\0" + VIRTUAL_CAMOX_DOCUMENT;
10
+ const RESOLVED_VIRTUAL_CAMOX_DOCUMENT = "\0virtual:camox/document";
11
11
  const VIRTUAL_CAMOX_SERVER = "virtual:camox/server";
12
- const RESOLVED_VIRTUAL_CAMOX_SERVER = "\0" + VIRTUAL_CAMOX_SERVER;
13
- const VIRTUAL_CAMOX_NITRO_HANDLER = "#camox/nitro-handler";
12
+ const RESOLVED_VIRTUAL_CAMOX_SERVER = "\0virtual:camox/server";
14
13
  const VIRTUAL_PAGE_SERVER = "virtual:camox/page-server";
15
14
  const RESOLVED_VIRTUAL_PAGE_SERVER = "\0" + VIRTUAL_PAGE_SERVER;
16
15
  const VIRTUAL_STUDIO_SERVER = "virtual:camox/studio-server";
@@ -23,12 +22,16 @@ const VIRTUAL_STUDIO_CLIENT = "virtual:camox/studio-client";
23
22
  const RESOLVED_VIRTUAL_STUDIO_CLIENT = "\0" + VIRTUAL_STUDIO_CLIENT;
24
23
  const VIRTUAL_STUDIO_CLIENT_URL = "virtual:camox/studio-client-url";
25
24
  const RESOLVED_VIRTUAL_STUDIO_CLIENT_URL = "\0" + VIRTUAL_STUDIO_CLIENT_URL;
25
+ const VIRTUAL_BLOCK_CHUNKS = "virtual:camox/block-chunks";
26
+ const RESOLVED_VIRTUAL_BLOCK_CHUNKS = "\0" + VIRTUAL_BLOCK_CHUNKS;
26
27
  const VIRTUAL_APP_STYLESHEET_URL = "virtual:camox/app-stylesheet-url";
27
28
  const RESOLVED_VIRTUAL_APP_STYLESHEET_URL = "\0" + VIRTUAL_APP_STYLESHEET_URL;
28
29
  const VIRTUAL_STUDIO_CSS = "virtual:camox-studio-css";
29
30
  const RESOLVED_VIRTUAL_STUDIO_CSS = "\0" + VIRTUAL_STUDIO_CSS;
30
31
  const VIRTUAL_OVERLAY_CSS = "virtual:camox-overlay-css";
31
32
  const RESOLVED_VIRTUAL_OVERLAY_CSS = "\0" + VIRTUAL_OVERLAY_CSS;
33
+ const VIRTUAL_DEV_HTML = "virtual:camox/dev-html";
34
+ const RESOLVED_VIRTUAL_DEV_HTML = "\0" + VIRTUAL_DEV_HTML;
32
35
  function normalizeImporterPath(importer) {
33
36
  if (!importer) return "";
34
37
  const [path] = importer.split("?");
@@ -62,27 +65,65 @@ function resolveCamoxSourceImport(id) {
62
65
  "camox/_internal/pageClient": resolve(sdkRoot, "src/features/runtime/pageClient.tsx"),
63
66
  "camox/_internal/studioClient": resolve(sdkRoot, "src/features/runtime/studioClient.tsx"),
64
67
  "camox/_internal/studioServer": resolve(sdkRoot, "src/features/runtime/studioServer.tsx"),
65
- "camox/_internal/runtime": resolve(sdkRoot, "src/features/runtime/runtime.ts")
68
+ "camox/_internal/runtime": resolve(sdkRoot, "src/features/runtime/runtime.ts"),
69
+ "camox/worker": resolve(sdkRoot, "src/features/runtime/worker.ts")
66
70
  }[id];
67
71
  if (!sourceImport || !existsSync(sourceImport)) return;
68
72
  return sourceImport;
69
73
  }
70
- function generateVirtualCamoxApp() {
74
+ /**
75
+ * The server loads every block. The browser loads blocks on demand, one module each, so
76
+ * visitors only download the blocks of the pages they see.
77
+ */
78
+ function generateVirtualCamoxApp(ssr) {
71
79
  return `import { createApp } from "camox/createApp";
80
+ import { camoxDocument } from "virtual:camox/document";
72
81
 
73
- const rootBlockModules = import.meta.glob("/src/blocks/*.{ts,tsx}", { eager: true });
74
- const legacyBlockModules = import.meta.glob("/src/camox/blocks/*.{ts,tsx}", { eager: true });
82
+ const rootCollectionModules = import.meta.glob("/src/collections/*.{ts,tsx}", { eager: true });
83
+ const legacyCollectionModules = import.meta.glob("/src/camox/collections/*.{ts,tsx}", { eager: true });
75
84
  const rootLayoutModules = import.meta.glob("/src/layouts/*.{ts,tsx}", { eager: true });
76
85
  const legacyLayoutModules = import.meta.glob("/src/camox/layouts/*.{ts,tsx}", { eager: true });
77
86
 
78
- const blocks = [...Object.values(rootBlockModules), ...Object.values(legacyBlockModules)]
79
- .map((mod) => mod.block)
80
- .filter(Boolean);
87
+ ${ssr ? `const rootBlockModules = import.meta.glob("/src/blocks/*.{ts,tsx}", { eager: true });
88
+ const legacyBlockModules = import.meta.glob("/src/camox/blocks/*.{ts,tsx}", { eager: true });
89
+ const blockEntries = Object.entries({ ...rootBlockModules, ...legacyBlockModules }).filter(
90
+ ([, mod]) => mod.block,
91
+ );
92
+ const blocks = blockEntries.map(([, mod]) => mod.block);
93
+ const lazyBlocks = {};
94
+
95
+ /** Each block's module, which the browser loads, so pages can preload it. */
96
+ export const blockModulePaths = Object.fromEntries(
97
+ blockEntries.map(([path, mod]) => [mod.block._internal.id, path]),
98
+ );` : `const blockLoaders = {
99
+ ...import.meta.glob("/src/blocks/*.{ts,tsx}", { import: "block" }),
100
+ ...import.meta.glob("/src/camox/blocks/*.{ts,tsx}", { import: "block" }),
101
+ };
102
+ const blocks = [];
103
+ // Keyed by file name, which is the block's id by convention.
104
+ const lazyBlocks = Object.fromEntries(
105
+ Object.entries(blockLoaders).map(([path, load]) => [
106
+ path.slice(path.lastIndexOf("/") + 1).replace(/\\.tsx?$/, ""),
107
+ load,
108
+ ]),
109
+ );`}
81
110
  const layouts = [...Object.values(rootLayoutModules), ...Object.values(legacyLayoutModules)]
82
111
  .map((mod) => mod.Layout ?? mod.layout)
83
112
  .filter(Boolean);
113
+ const collections = [
114
+ ...Object.values(rootCollectionModules),
115
+ ...Object.values(legacyCollectionModules),
116
+ ]
117
+ .map((mod) => mod.collection)
118
+ .filter(Boolean);
84
119
 
85
- export const camoxApp = createApp({ blocks, layouts });
120
+ export const camoxApp = createApp({
121
+ blocks,
122
+ lazyBlocks,
123
+ layouts,
124
+ collections,
125
+ document: camoxDocument,
126
+ });
86
127
  `;
87
128
  }
88
129
  function generateVirtualCamoxDocument() {
@@ -143,7 +184,8 @@ export default stylesheetUrl;
143
184
  }
144
185
  function generateVirtualCamoxServer(runtimeBasePath) {
145
186
  return `import { handleCamoxRequest as handleRuntimeRequest } from "camox/_internal/runtime";
146
- import { camoxApp } from "virtual:camox/app";
187
+ import { blockModulePaths, camoxApp } from "virtual:camox/app";
188
+ import blockChunks from "virtual:camox/block-chunks";
147
189
  import { camoxDocument } from "virtual:camox/document";
148
190
  import appStylesheetUrl from "virtual:camox/app-stylesheet-url";
149
191
  import studioStylesheetUrl from "virtual:camox-studio-css";
@@ -151,17 +193,22 @@ import pageClientEntryUrl from "virtual:camox/page-client-url";
151
193
  import studioClientEntryUrl from "virtual:camox/studio-client-url";
152
194
  import { renderPage } from "virtual:camox/page-server";
153
195
  import { renderStudio } from "virtual:camox/studio-server";
196
+ import devHtml from "virtual:camox/dev-html";
197
+
198
+ export { devHtml };
199
+ export const runtimeBasePath = ${JSON.stringify(normalizeRuntimeBasePath(runtimeBasePath))};
154
200
 
155
201
  export async function handleCamoxRequest(request) {
156
202
  return handleRuntimeRequest(request, {
157
203
  apiUrl: __CAMOX_API_URL__,
158
204
  authenticationUrl: __CAMOX_AUTHENTICATION_URL__,
205
+ blockPreloads: { modulePaths: blockModulePaths, chunks: blockChunks },
159
206
  pageClientEntryUrl,
160
207
  studioClientEntryUrl,
161
- environmentName: __CAMOX_ENVIRONMENT_NAME__,
208
+ developmentDraft: __CAMOX_DEVELOPMENT_DRAFT__,
162
209
  getCamoxApp: async () => camoxApp,
163
210
  getDocument: async () => camoxDocument,
164
- projectSlug: __CAMOX_PROJECT_SLUG__,
211
+ projectUuid: __CAMOX_PROJECT_ID__,
165
212
  renderPage,
166
213
  renderStudio,
167
214
  runtimeBasePath: ${JSON.stringify(runtimeBasePath)},
@@ -171,72 +218,6 @@ export async function handleCamoxRequest(request) {
171
218
  }
172
219
  `;
173
220
  }
174
- function generateVirtualCamoxNitroHandler(runtimeBasePath) {
175
- return `import { defineHandler } from "nitro";
176
- import { handleCamoxRequest } from "virtual:camox/server";
177
-
178
- const runtimeBasePath = ${JSON.stringify(normalizeRuntimeBasePath(runtimeBasePath))};
179
-
180
- function isDocumentRequest(request) {
181
- const accept = request.headers.get("Accept") ?? request.headers.get("accept") ?? "";
182
- return accept.includes("text/html") || accept.includes("*/*");
183
- }
184
-
185
- function getRuntimePathname(pathname) {
186
- if (!runtimeBasePath) return pathname;
187
- if (pathname === runtimeBasePath) return "/";
188
- if (!pathname.startsWith(runtimeBasePath + "/")) return null;
189
- return pathname.slice(runtimeBasePath.length) || "/";
190
- }
191
-
192
- function shouldHandleRequest(request) {
193
- const url = new URL(request.url);
194
- const pathname = getRuntimePathname(url.pathname);
195
- if (!pathname) return false;
196
- if (request.method !== "GET" && request.method !== "HEAD") return false;
197
- if (
198
- pathname === "/_camox/data" ||
199
- pathname === "/_camox/health" ||
200
- pathname === "/_camox/registry"
201
- ) {
202
- return true;
203
- }
204
- if (pathname === "/og" || pathname === "/sitemap.xml") return true;
205
- if (pathname === "/camox" || pathname.startsWith("/camox/")) return true;
206
- if (/\\.[a-z0-9]+$/i.test(pathname)) return false;
207
- if (pathname.startsWith("/@") || pathname.startsWith("/src/")) return false;
208
- if (pathname.startsWith("/__vite")) return false;
209
- if (pathname.startsWith("/node_modules/")) return false;
210
- return isDocumentRequest(request);
211
- }
212
-
213
- async function transformHtmlResponse(response) {
214
- const contentType = response.headers.get("Content-Type") ?? response.headers.get("content-type") ?? "";
215
- if (!contentType.includes("text/html")) return response;
216
- if (!globalThis.__transform_html__) return response;
217
-
218
- const headers = new Headers(response.headers);
219
- headers.delete("Content-Length");
220
- headers.delete("content-length");
221
-
222
- return new Response(await globalThis.__transform_html__(await response.text()), {
223
- headers,
224
- status: response.status,
225
- statusText: response.statusText,
226
- });
227
- }
228
-
229
- export default defineHandler(async (event) => {
230
- if (!shouldHandleRequest(event.req)) {
231
- return new Response("Not found", { status: 404 });
232
- }
233
-
234
- const response = await handleCamoxRequest(event.req);
235
- if (response) return transformHtmlResponse(response);
236
- return new Response("Not found", { status: 404 });
237
- });
238
- `;
239
- }
240
221
  function resolveRuntimeDevId(id, importer) {
241
222
  const camoxSourceImport = resolveCamoxSourceImport(id);
242
223
  if (camoxSourceImport) return camoxSourceImport;
@@ -252,14 +233,16 @@ function resolveRuntimeDevId(id, importer) {
252
233
  if (id === VIRTUAL_STUDIO_CLIENT) return RESOLVED_VIRTUAL_STUDIO_CLIENT;
253
234
  if (id === VIRTUAL_STUDIO_CLIENT_URL) return RESOLVED_VIRTUAL_STUDIO_CLIENT_URL;
254
235
  if (id === VIRTUAL_APP_STYLESHEET_URL) return RESOLVED_VIRTUAL_APP_STYLESHEET_URL;
236
+ if (id === VIRTUAL_BLOCK_CHUNKS) return RESOLVED_VIRTUAL_BLOCK_CHUNKS;
255
237
  if (id === VIRTUAL_STUDIO_CSS) return RESOLVED_VIRTUAL_STUDIO_CSS;
256
238
  if (id === VIRTUAL_OVERLAY_CSS) return RESOLVED_VIRTUAL_OVERLAY_CSS;
239
+ if (id === "virtual:camox/dev-html") return RESOLVED_VIRTUAL_DEV_HTML;
257
240
  }
258
241
  function loadRuntimeDevModule(id, options = {}) {
259
- if (id === RESOLVED_VIRTUAL_CAMOX_APP) return generateVirtualCamoxApp();
242
+ if (id === RESOLVED_VIRTUAL_CAMOX_APP) return generateVirtualCamoxApp(options.ssr !== false);
243
+ if (id === RESOLVED_VIRTUAL_BLOCK_CHUNKS) return "export default null;";
260
244
  if (id === RESOLVED_VIRTUAL_CAMOX_DOCUMENT) return generateVirtualCamoxDocument();
261
245
  if (id === RESOLVED_VIRTUAL_CAMOX_SERVER) return generateVirtualCamoxServer(options.runtimeBasePath);
262
- if (id === VIRTUAL_CAMOX_NITRO_HANDLER) return generateVirtualCamoxNitroHandler(options.runtimeBasePath);
263
246
  if (id === RESOLVED_VIRTUAL_PAGE_SERVER) return generateVirtualPageServer();
264
247
  if (id === RESOLVED_VIRTUAL_STUDIO_SERVER) return generateVirtualStudioServer();
265
248
  if (id === RESOLVED_VIRTUAL_PAGE_CLIENT) return generateVirtualPageClient();
@@ -273,26 +256,24 @@ function loadRuntimeDevModule(id, options = {}) {
273
256
  }
274
257
  if (id === RESOLVED_VIRTUAL_OVERLAY_CSS) return `export default ${JSON.stringify(readFileSync(resolve(sdkRoot, "dist/studio-overlays.css"), "utf-8"))};`;
275
258
  }
259
+ function createRuntimeRegistryPlugin(options = {}) {
260
+ return {
261
+ name: "camox-runtime-registry",
262
+ enforce: "pre",
263
+ resolveId: resolveRuntimeDevId,
264
+ load(id, loadOptions) {
265
+ return loadRuntimeDevModule(id, {
266
+ ...options,
267
+ ssr: loadOptions?.ssr
268
+ });
269
+ }
270
+ };
271
+ }
276
272
  function normalizeRuntimeBasePath(basePath) {
277
273
  if (basePath === void 0) return "";
278
274
  if (!basePath || basePath === "/") return "";
279
275
  return basePath.startsWith("/") ? basePath.replace(/\/+$/, "") : `/${basePath.replace(/\/+$/, "")}`;
280
276
  }
281
- function installRuntimeNitroRoutes(nitro, options) {
282
- const routes = options.runtimeBasePath && options.runtimeBasePath !== "/" ? [options.runtimeBasePath, `${options.runtimeBasePath}/**`] : [
283
- "/",
284
- "/_camox/data",
285
- "/_camox/health",
286
- "/_camox/registry",
287
- "/og",
288
- "/sitemap.xml",
289
- "/camox",
290
- "/camox/**",
291
- "/**"
292
- ];
293
- for (const route of routes) nitro.options.routes[route] = VIRTUAL_CAMOX_NITRO_HANDLER;
294
- nitro.options.virtual[VIRTUAL_CAMOX_NITRO_HANDLER] = generateVirtualCamoxNitroHandler(options.runtimeBasePath);
295
- }
296
277
 
297
278
  //#endregion
298
- export { installRuntimeNitroRoutes, loadRuntimeDevModule, resolveRuntimeDevId };
279
+ export { RESOLVED_VIRTUAL_DEV_HTML, VIRTUAL_DEV_HTML, createRuntimeRegistryPlugin, loadRuntimeDevModule, resolveRuntimeDevId };
@@ -1,40 +1,62 @@
1
- import { Plugin } from "vite-plus";
2
-
1
+ import { ServerApiClient } from "../../lib/api-client-server.js";
2
+ import { Logger, Plugin } from "vite-plus";
3
3
  //#region src/features/vite/vite.d.ts
4
- interface CamoxNitro {
5
- hooks: {
6
- hook: (name: "compiled", callback: (nitro: CamoxNitro) => void) => void;
7
- };
8
- options: {
9
- noExternals?: boolean | (string | RegExp)[];
10
- output: {
11
- publicDir: string;
12
- serverDir: string;
13
- };
14
- routes: Record<string, string>;
15
- virtual: Record<string, string>;
16
- };
4
+ /** What `_internal.afterSync` receives: an API client authenticated as the dev user. */
5
+ export interface CamoxAfterSyncContext {
6
+ /** Sends the dev session and reads and writes the developer's development draft. */
7
+ client: ServerApiClient;
8
+ /** The project's Project ID, which API inputs name `projectUuid`. */
9
+ projectUuid: string;
10
+ logger: Logger;
17
11
  }
18
- type CamoxVitePlugin = Plugin & {
19
- nitro?: {
20
- setup: (nitro: CamoxNitro) => void;
21
- };
22
- };
23
- interface CamoxPluginOptions {
24
- /** Stable, human-readable slug identifying this project (e.g. "prestigious-impala-84") */
25
- projectSlug: string;
12
+ export interface CamoxPluginOptions {
13
+ /**
14
+ * The project's Project ID, shown in the Camox dashboard: a lowercase UUIDv7 that never changes
15
+ * (e.g. "01a15fff-627b-7fa1-938b-93ab659c1acc").
16
+ */
17
+ projectId: string;
18
+ /** Iconify collection available to all icon fields. */
19
+ icons?: string;
26
20
  /** Disable telemetry collection (default: false) */
27
21
  disableTelemetry?: boolean;
28
22
  /** Internal options (intended for Camox contributors in development, not for public use) */
29
23
  _internal?: {
30
- /** URL of the Camox API backend, used for data fetching */apiUrl?: string; /** URL of the Camox authentication backend (default: https://app.camox.dev) */
31
- authenticationUrl?: string; /** Show Tanstack query devtools (default: false) */
32
- enableTanstackDevtools?: boolean; /** Enable the frontend-only comments prototype (default: false). */
33
- enableComments?: boolean; /** Disable automatic code generation (route files and app file) (default: false) */
34
- disableCodeGen?: boolean; /** Mount the Camox-owned dev runtime at this base path. Use "/" for root mode. */
24
+ /** URL of the Camox API backend, used for data fetching */
25
+ apiUrl?: string;
26
+ /** URL of the Camox authentication backend (default: https://app.camox.dev) */
27
+ authenticationUrl?: string;
28
+ /** Show Tanstack query devtools (default: false) */
29
+ enableTanstackDevtools?: boolean;
30
+ /** Enable experimental features (default: false). */
31
+ enableExperimentalFeatures?: boolean;
32
+ /** Disable automatic code generation (route and layout files) (default: false) */
33
+ disableCodeGen?: boolean;
34
+ /** Mount the Camox-owned dev runtime at this base path. Use "/" for root mode. */
35
35
  runtimeBasePath?: string;
36
+ /** Opt-in browser opening for this app's generated development sign-in link. */
37
+ devSignIn?: {
38
+ open?: boolean;
39
+ /** Empty marker file shared across restarts of one dev invocation. */
40
+ openOnceFile?: string;
41
+ };
42
+ /**
43
+ * Dev-only: runs once per dev server start, after the initial definition sync
44
+ * succeeds. A failure is logged as a warning and never breaks dev.
45
+ */
46
+ afterSync?: (context: CamoxAfterSyncContext) => void | Promise<void>;
47
+ /**
48
+ * Dev-only: a deploy token for seeding Live. When Live has no pages yet, the first sync
49
+ * releases the local definitions to Live, and the development draft is published after
50
+ * `afterSync`, so seeded content becomes Live instead of the draft's changes.
51
+ */
52
+ seedLiveDeployToken?: string;
36
53
  };
37
54
  }
38
- declare function camox(options: CamoxPluginOptions): CamoxVitePlugin;
39
- //#endregion
40
- export { CamoxPluginOptions, camox };
55
+ export declare const CAMOX_OPTIMIZED_DEPS: string[];
56
+ /**
57
+ * The Worker runs in workerd, so its dependencies are pre-bundled too. Discovering them one
58
+ * request at a time would reload the Worker for each, so start from the browser's list.
59
+ */
60
+ export declare const CAMOX_WORKER_OPTIMIZED_DEPS: string[];
61
+ export declare function camox(options: CamoxPluginOptions): Plugin;
62
+ //#endregion