camox 0.44.0 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (411) hide show
  1. package/dist/components/AuthGate.js +0 -6
  2. package/dist/components/DeviceSelector.js +96 -0
  3. package/dist/components/PlatformLabel.js +20 -24
  4. package/dist/core/components/lexical/HighlightNode.js +1 -1
  5. package/dist/core/components/lexical/InlineContentEditable.js +15 -19
  6. package/dist/core/components/lexical/InlineLexicalEditor.js +54 -74
  7. package/dist/core/components/lexical/InlineStylesPlugin.js +53 -53
  8. package/dist/core/components/lexical/MaxLengthPlugin.js +59 -0
  9. package/dist/core/components/lexical/SelectionBroadcaster.js +53 -54
  10. package/dist/core/components/lexical/SidebarLexicalEditor.js +322 -229
  11. package/dist/core/components/lexical/SummaryToggleGuard.js +42 -0
  12. package/dist/core/components/lexical/TextLinkPopover.js +169 -180
  13. package/dist/core/createApp.d.ts +241 -312
  14. package/dist/core/createApp.js +123 -29
  15. package/dist/core/createBlock.d.ts +5 -5
  16. package/dist/core/createBlock.js +385 -152
  17. package/dist/core/createCollection.d.ts +55 -0
  18. package/dist/core/createCollection.js +93 -0
  19. package/dist/core/createLayout.d.ts +197 -61
  20. package/dist/core/createLayout.js +114 -56
  21. package/dist/core/defineDocument.d.ts +3 -5
  22. package/dist/core/derivedRoutes.js +49 -1
  23. package/dist/core/dom.d.ts +13 -4
  24. package/dist/core/dom.js +44 -1
  25. package/dist/core/editing/BlockEditingRuntime.d.ts +16 -0
  26. package/dist/core/editing/BlockEditingRuntime.js +6 -15
  27. package/dist/core/editing/CompleteBlockEditingRuntime.js +28 -23
  28. package/dist/core/editing/createEditableBlock.d.ts +754 -633
  29. package/dist/core/editing/createEditableBlock.js +2113 -1066
  30. package/dist/core/editing/referenceWrites.js +51 -0
  31. package/dist/core/editing/useLatestRecord.js +90 -0
  32. package/dist/core/hooks/useArtifactHost.js +139 -0
  33. package/dist/core/hooks/useFieldSelection.js +43 -18
  34. package/dist/core/hooks/useIsEditable.js +12 -10
  35. package/dist/core/hooks/useOverlayMessage.js +15 -19
  36. package/dist/core/lib/artifact.d.ts +21 -0
  37. package/dist/core/lib/artifact.js +154 -0
  38. package/dist/core/lib/artifactColors.js +123 -0
  39. package/dist/core/lib/artifactData.d.ts +1 -0
  40. package/dist/core/lib/artifactData.js +131 -0
  41. package/dist/core/lib/artifactHost.js +205 -0
  42. package/dist/core/lib/artifactRuntime.js +36 -0
  43. package/dist/core/lib/artifactTheme.js +57 -0
  44. package/dist/core/lib/contentType.d.ts +302 -106
  45. package/dist/core/lib/contentType.js +201 -173
  46. package/dist/core/lib/fieldTypes.js +3 -0
  47. package/dist/core/lib/iconTypes.d.ts +3 -3
  48. package/dist/core/lib/icons.d.ts +4 -4
  49. package/dist/core/lib/icons.js +40 -44
  50. package/dist/core/lib/imagePlaceholder.js +177 -0
  51. package/dist/core/lib/imageTransform.js +1 -1
  52. package/dist/core/lib/lexicalReact.d.ts +3 -1
  53. package/dist/core/lib/lexicalState.js +1 -1
  54. package/dist/core/lib/previewPaused.js +9 -0
  55. package/dist/core/lib/recordScope.js +316 -0
  56. package/dist/core/lib/reference.d.ts +81 -0
  57. package/dist/core/lib/reference.js +29 -0
  58. package/dist/core/lib/textLinks.js +7 -5
  59. package/dist/core/lib/textStyles.d.ts +5 -7
  60. package/dist/core/lib/textStyles.js +2 -2
  61. package/dist/core/notFound.d.ts +7 -0
  62. package/dist/core/notFound.js +11 -0
  63. package/dist/core/pageDestinations.js +6 -3
  64. package/dist/core/recordItem.js +34 -0
  65. package/dist/core/requestContext.d.ts +26 -0
  66. package/dist/core/requestContext.js +20 -0
  67. package/dist/features/canvas/CamoxCanvas.js +1734 -0
  68. package/dist/features/canvas/CanvasBlockFrame.js +353 -0
  69. package/dist/features/canvas/CanvasBlockHeader.js +55 -0
  70. package/dist/features/canvas/CanvasLoadingScreen.js +35 -0
  71. package/dist/features/canvas/CanvasOverlays.js +254 -0
  72. package/dist/features/canvas/CanvasPageEdge.js +87 -0
  73. package/dist/features/canvas/CanvasPageFrame.js +335 -0
  74. package/dist/features/canvas/CanvasPageHeader.js +125 -0
  75. package/dist/features/canvas/CanvasPreviewPageSlot.js +103 -0
  76. package/dist/features/canvas/CanvasShelfMarker.js +255 -0
  77. package/dist/features/canvas/DerivedPagePathInput.js +238 -0
  78. package/dist/features/canvas/canvasCamera.js +229 -0
  79. package/dist/features/canvas/canvasFlight.js +104 -0
  80. package/dist/features/canvas/canvasFrameCapture.js +364 -0
  81. package/dist/features/canvas/canvasFrameDocument.js +317 -0
  82. package/dist/features/canvas/canvasFrameMode.js +53 -0
  83. package/dist/features/canvas/canvasInsertionSeams.js +44 -0
  84. package/dist/features/canvas/canvasItems.js +120 -0
  85. package/dist/features/canvas/canvasOverlayGeometry.js +240 -0
  86. package/dist/features/canvas/canvasPages.js +79 -0
  87. package/dist/features/canvas/canvasScreenSpace.js +26 -0
  88. package/dist/features/canvas/canvasSelection.js +18 -0
  89. package/dist/features/canvas/canvasStore.js +149 -0
  90. package/dist/features/canvas/canvasThumbnails.js +304 -0
  91. package/dist/features/canvas/canvasZoom.js +10 -0
  92. package/dist/features/canvas/sidebar/CanvasInspector.js +202 -0
  93. package/dist/features/canvas/sidebar/CanvasNavigator.js +226 -0
  94. package/dist/features/canvas/sidebar/CanvasSidebar.js +60 -0
  95. package/dist/features/canvas/sidebar/CanvasSidebarFrame.js +48 -0
  96. package/dist/features/canvas/sidebar/CanvasSidebarSkeleton.js +39 -0
  97. package/dist/features/canvas/sidebar/CatalogBlockInspector.js +189 -0
  98. package/dist/features/canvas/sidebar/CuratedPageInspector.js +69 -0
  99. package/dist/features/canvas/sidebar/DerivedPageInspector.js +37 -0
  100. package/dist/features/canvas/sidebar/LayoutPageBlocks.js +78 -0
  101. package/dist/features/canvas/sidebar/LayoutPageOverview.js +71 -0
  102. package/dist/features/canvas/sidebar/PageInspector.js +157 -0
  103. package/dist/features/canvas/sidebar/PageInspectorSkeleton.js +90 -0
  104. package/dist/features/canvas/sidebar/PageOverview.js +27 -0
  105. package/dist/features/canvas/sidebar/SingletonPageInspector.js +31 -0
  106. package/dist/features/canvas/useCanvasCamera.js +803 -0
  107. package/dist/features/canvas/useCanvasFrame.js +149 -0
  108. package/dist/features/canvas/useCanvasFrameInput.js +97 -0
  109. package/dist/features/canvas/useCanvasNearness.js +57 -0
  110. package/dist/features/canvas/useDiscoveredPreviewPaths.js +62 -0
  111. package/dist/features/content/CamoxContent.d.ts +2 -5
  112. package/dist/features/content/CamoxContent.js +174 -271
  113. package/dist/features/content/CollectionItemSheetContext.js +106 -0
  114. package/dist/features/content/ContentAssets.js +315 -0
  115. package/dist/features/content/ContentCollection.js +663 -0
  116. package/dist/features/content/collection-form.js +58 -0
  117. package/dist/features/content/components/AssetCard.js +80 -84
  118. package/dist/features/content/components/AssetCardSkeleton.js +4 -8
  119. package/dist/features/content/components/ContentSidebar.js +129 -18
  120. package/dist/features/content/components/ContentSidebarGroup.js +37 -0
  121. package/dist/features/content/components/DeleteCollectionItemButton.js +202 -0
  122. package/dist/features/content/components/MissingFromLocale.js +282 -0
  123. package/dist/features/content/components/UploadDropZone.js +27 -31
  124. package/dist/features/content/components/UploadProgressDrawer.js +90 -98
  125. package/dist/features/navigation/navigation.d.ts +66 -20
  126. package/dist/features/navigation/navigation.js +257 -90
  127. package/dist/features/og/defaultFonts.js +8 -8
  128. package/dist/features/og/geist-variable-ttf-base64.js +1 -1
  129. package/dist/features/og/imageResponse.d.ts +8 -0
  130. package/dist/features/og/imageResponse.js +26 -0
  131. package/dist/features/page/CuratedPageContent.js +167 -0
  132. package/dist/features/page/DerivedPageContent.js +26 -30
  133. package/dist/features/page/SharedLayoutContent.js +25 -27
  134. package/dist/features/preview/CamoxPreview.d.ts +23 -61
  135. package/dist/features/preview/CamoxPreview.js +816 -537
  136. package/dist/features/preview/EditablePageContent.js +1 -1
  137. package/dist/features/preview/EditablePageExperience.js +16 -22
  138. package/dist/features/preview/components/AddBlockDialog.js +270 -0
  139. package/dist/features/preview/components/AssetFieldEditor.js +173 -154
  140. package/dist/features/preview/components/AssetLightbox.js +181 -134
  141. package/dist/features/preview/components/AssetPickerModal.js +153 -170
  142. package/dist/features/preview/components/BlockActionsPopover.js +150 -149
  143. package/dist/features/preview/components/BlockErrorBoundary.js +8 -12
  144. package/dist/features/preview/components/BlockThumbnail.js +176 -100
  145. package/dist/features/preview/components/CanvasPreview.js +243 -0
  146. package/dist/features/preview/components/CreatePageModal.js +128 -137
  147. package/dist/features/preview/components/DebouncedFieldEditor.js +29 -33
  148. package/dist/features/preview/components/DerivedLayoutDialog.js +21 -19
  149. package/dist/features/preview/components/DrillRow.js +150 -0
  150. package/dist/features/preview/components/FieldOverlayStyles.js +11 -8
  151. package/dist/features/preview/components/FieldToolbar.js +160 -110
  152. package/dist/features/preview/components/Frame.js +108 -20
  153. package/dist/features/preview/components/IconFieldEditor.js +62 -66
  154. package/dist/features/preview/components/ItemFieldsEditor.js +231 -205
  155. package/dist/features/preview/components/LinkFieldEditor.js +135 -139
  156. package/dist/features/preview/components/Metadata.js +22 -30
  157. package/dist/features/preview/components/MobilePreviewDrawer.js +89 -108
  158. package/dist/features/preview/components/MultipleAssetFieldEditor.js +334 -246
  159. package/dist/features/preview/components/OverlayTracker.js +9 -41
  160. package/dist/features/preview/components/Overlays.js +81 -69
  161. package/dist/features/preview/components/PageInfo.js +1748 -0
  162. package/dist/features/preview/components/PageInfoSkeleton.js +51 -0
  163. package/dist/features/preview/components/PageLocationFieldset.js +112 -116
  164. package/dist/features/preview/components/PageNavigatorHeader.js +24 -0
  165. package/dist/features/preview/components/PageNicknameField.js +22 -26
  166. package/dist/features/preview/components/PagePicker.js +128 -130
  167. package/dist/features/preview/components/PageTree.js +525 -532
  168. package/dist/features/preview/components/PreviewActivation.js +28 -32
  169. package/dist/features/preview/components/PreviewPanel.js +620 -319
  170. package/dist/features/preview/components/PreviewToolbar.js +105 -333
  171. package/dist/features/preview/components/RecordCard.js +80 -0
  172. package/dist/features/preview/components/RecordCombobox.js +178 -0
  173. package/dist/features/preview/components/ReferenceFieldEditor.js +149 -0
  174. package/dist/features/preview/components/ReferenceListFieldEditor.js +432 -0
  175. package/dist/features/preview/components/RemovedBlockPlaceholder.js +95 -0
  176. package/dist/features/preview/components/RepeatableItemsList.js +125 -138
  177. package/dist/features/preview/components/SelectionEditor.js +993 -0
  178. package/dist/features/preview/components/ShikiMarkdown.js +14 -18
  179. package/dist/features/preview/components/SidebarSection.js +52 -64
  180. package/dist/features/preview/components/StudioEditingFallback.js +56 -0
  181. package/dist/features/preview/components/UnlinkAssetButton.js +104 -107
  182. package/dist/features/preview/components/blockGridNavigation.js +15 -0
  183. package/dist/features/preview/components/contentFieldSchema.js +8 -0
  184. package/dist/features/preview/components/useFieldWriter.js +200 -0
  185. package/dist/features/preview/components/useRecordView.js +383 -0
  186. package/dist/features/preview/components/useRepeatableItemActions.js +35 -37
  187. package/dist/features/preview/components/useUpdateBlockPosition.js +37 -37
  188. package/dist/features/preview/editingFrame.js +197 -0
  189. package/dist/features/preview/overlayHighlights.js +17 -44
  190. package/dist/features/preview/overlayMessages.js +72 -1
  191. package/dist/features/preview/pageRecord.js +189 -0
  192. package/dist/features/preview/previewConstants.js +6 -2
  193. package/dist/features/preview/previewPageFrame.js +95 -0
  194. package/dist/features/preview/previewPreparation.js +7 -0
  195. package/dist/features/preview/previewSelection.js +32 -63
  196. package/dist/features/preview/previewStore.js +225 -123
  197. package/dist/features/preview/referencePickerFocus.js +29 -0
  198. package/dist/features/preview/repeatableItemTargets.js +56 -0
  199. package/dist/features/preview/selectionReveal.js +21 -0
  200. package/dist/features/preview/usePreviewViewportActions.js +114 -0
  201. package/dist/features/preview/viewportContinuity.js +109 -0
  202. package/dist/features/provider/AuthenticatedCamoxProvider.js +69 -44
  203. package/dist/features/provider/CamoxProvider.d.ts +3 -6
  204. package/dist/features/provider/CamoxProvider.js +38 -50
  205. package/dist/features/provider/CoreCamoxProvider.js +66 -50
  206. package/dist/features/provider/LocalhostPreviewProvider.js +78 -114
  207. package/dist/features/provider/PreviewSignInPage.js +54 -0
  208. package/dist/features/provider/components/CamoxAppContext.js +11 -11
  209. package/dist/features/provider/components/CommandPalette.js +75 -82
  210. package/dist/features/provider/useAdminShortcuts.js +7 -11
  211. package/dist/features/routes/pageRuntime.d.ts +44 -4
  212. package/dist/features/routes/pageRuntime.js +244 -137
  213. package/dist/features/runtime/RuntimeChrome.js +117 -115
  214. package/dist/features/runtime/alternates.js +64 -0
  215. package/dist/features/runtime/analytics.d.ts +7 -0
  216. package/dist/features/runtime/analytics.js +66 -0
  217. package/dist/features/runtime/artifactSources.js +87 -0
  218. package/dist/features/runtime/editingFallback.js +20 -0
  219. package/dist/features/runtime/linkPrefetch.js +97 -0
  220. package/dist/features/runtime/livePages.js +62 -0
  221. package/dist/features/runtime/llmsTxt.js +40 -0
  222. package/dist/features/runtime/loopbackFetch.js +18 -0
  223. package/dist/features/runtime/navigationAccessibility.js +51 -0
  224. package/dist/features/runtime/navigationTarget.js +23 -2
  225. package/dist/features/runtime/pageApp.js +229 -158
  226. package/dist/features/runtime/pageBlockTypes.js +20 -0
  227. package/dist/features/runtime/pageClient.d.ts +2 -4
  228. package/dist/features/runtime/pageClient.js +18 -3
  229. package/dist/features/runtime/pageNavigation.js +254 -32
  230. package/dist/features/runtime/pageServer.d.ts +2 -4
  231. package/dist/features/runtime/pageServer.js +6 -2
  232. package/dist/features/runtime/pageViewport.js +7 -0
  233. package/dist/features/runtime/runtime.d.ts +59 -24
  234. package/dist/features/runtime/runtime.js +779 -191
  235. package/dist/features/runtime/runtimeChromeLoader.js +58 -0
  236. package/dist/features/runtime/runtimeRoutes.d.ts +19 -0
  237. package/dist/features/runtime/runtimeRoutes.js +25 -0
  238. package/dist/features/runtime/scrollRestoration.js +133 -0
  239. package/dist/features/runtime/studioApp.d.ts +4 -3
  240. package/dist/features/runtime/studioApp.js +5 -9
  241. package/dist/features/runtime/studioClient.d.ts +2 -4
  242. package/dist/features/runtime/studioClient.js +12 -3
  243. package/dist/features/runtime/studioServer.d.ts +2 -4
  244. package/dist/features/runtime/studioServer.js +6 -1
  245. package/dist/features/runtime/worker.d.ts +6 -0
  246. package/dist/features/runtime/worker.js +23 -0
  247. package/dist/features/runtime/workerRequest.js +44 -0
  248. package/dist/features/studio/CamoxStudio.d.ts +2 -6
  249. package/dist/features/studio/CamoxStudio.js +34 -49
  250. package/dist/features/studio/FollowAgentProvider.js +338 -0
  251. package/dist/features/studio/components/ChatSidebar.js +356 -0
  252. package/dist/features/studio/components/DraftsControl.js +676 -0
  253. package/dist/features/studio/components/FaviconDialog.js +318 -0
  254. package/dist/features/studio/components/LocalePicker.js +785 -0
  255. package/dist/features/studio/components/Navbar.js +123 -103
  256. package/dist/features/studio/components/ProjectMenu.js +239 -260
  257. package/dist/features/studio/components/RenameDraftDialog.js +206 -0
  258. package/dist/features/studio/components/ReviewDraftSheet.js +1472 -0
  259. package/dist/features/studio/components/ThreadComposer.js +157 -0
  260. package/dist/features/studio/components/ThreadMarkdown.js +113 -0
  261. package/dist/features/studio/components/ThreadMessages.js +270 -0
  262. package/dist/features/studio/components/UserButton.js +34 -23
  263. package/dist/features/studio/draftLabel.js +33 -0
  264. package/dist/features/studio/draftNotice.js +13 -0
  265. package/dist/features/studio/followAgent.js +250 -0
  266. package/dist/features/studio/followAgentContext.js +7 -0
  267. package/dist/features/studio/localeOptions.js +118 -0
  268. package/dist/features/studio/localeSwitch.js +19 -0
  269. package/dist/features/studio/routes.js +48 -1
  270. package/dist/features/studio/studioStore.js +64 -1
  271. package/dist/features/studio/useTheme.js +24 -27
  272. package/dist/features/vite/artifactRuntimeMinification.js +36 -0
  273. package/dist/features/vite/blockBoilerplate.js +6 -5
  274. package/dist/features/vite/blockChunks.js +31 -0
  275. package/dist/features/vite/bundlerLogs.js +17 -0
  276. package/dist/features/vite/definitionsSync.js +158 -226
  277. package/dist/features/vite/devAuthentication.js +4 -16
  278. package/dist/features/vite/devSignIn.js +87 -0
  279. package/dist/features/vite/iconGeneration.js +1 -1
  280. package/dist/features/vite/layoutGeneration.js +11 -1
  281. package/dist/features/vite/publishSeededContent.js +30 -0
  282. package/dist/features/vite/routeGeneration.js +6 -7
  283. package/dist/features/vite/runtimeDev.js +80 -99
  284. package/dist/features/vite/vite.d.ts +51 -31
  285. package/dist/features/vite/vite.js +224 -127
  286. package/dist/features/vite/workerBuild.js +39 -0
  287. package/dist/hooks/use-debounced-field.js +116 -47
  288. package/dist/hooks/use-file-upload.js +114 -67
  289. package/dist/hooks/use-marquee-selection.js +32 -36
  290. package/dist/hooks/use-page-destinations.js +69 -37
  291. package/dist/lib/api-client-server.d.ts +5 -0
  292. package/dist/lib/api-client-server.js +10 -4
  293. package/dist/lib/api-client.d.ts +6 -0
  294. package/dist/lib/api-client.js +51 -16
  295. package/dist/lib/api-socket.js +17 -0
  296. package/dist/lib/auth-page-styles.js +39 -0
  297. package/dist/lib/auth.js +117 -61
  298. package/dist/lib/collection-cache.js +23 -0
  299. package/dist/lib/draft-scope.d.ts +4 -0
  300. package/dist/lib/draft-scope.js +222 -0
  301. package/dist/lib/html.js +12 -0
  302. package/dist/lib/link-pages.js +154 -0
  303. package/dist/lib/locale-path.d.ts +22 -0
  304. package/dist/lib/locale-path.js +57 -0
  305. package/dist/lib/normalized-data.js +252 -152
  306. package/dist/lib/preview-handoff.js +2 -2
  307. package/dist/lib/queries.d.ts +11 -0
  308. package/dist/lib/queries.js +70 -141
  309. package/dist/lib/studio-reads.d.ts +14 -0
  310. package/dist/lib/studio-reads.js +574 -0
  311. package/dist/lib/use-project-room.js +50 -50
  312. package/dist/lib/use-thread.js +310 -0
  313. package/dist/lib/utils.js +25 -29
  314. package/dist/lib/view-locale-context.js +22 -0
  315. package/dist/lib/view-locale.js +46 -0
  316. package/dist/package.js +5 -0
  317. package/dist/studio-overlays.css +41 -151
  318. package/dist/studio.css +2 -2
  319. package/package.json +70 -73
  320. package/skills/camox/SKILL.md +16 -11
  321. package/skills/camox/references/artifacts.md +179 -0
  322. package/skills/camox/references/block-definitions.md +75 -59
  323. package/skills/camox/references/cli-common.md +9 -11
  324. package/skills/camox/references/cli-content.md +92 -69
  325. package/skills/camox/references/cli-publishing.md +26 -0
  326. package/skills/camox/references/dom-integrations.md +27 -0
  327. package/skills/camox/references/field-styling.md +4 -4
  328. package/skills/camox/references/layout-definitions.md +16 -14
  329. package/skills/camox/references/localization.md +56 -0
  330. package/skills/camox/references/routed-layouts.md +133 -15
  331. package/skills/camox-expand/SKILL.md +69 -0
  332. package/skills/camox-expand/references/jobs.md +39 -0
  333. package/skills/camoxify/SKILL.md +29 -7
  334. package/dist/core/components/AddBlockControlBar.js +0 -78
  335. package/dist/core/hooks/useRequireDraftSource.js +0 -23
  336. package/dist/features/metadata/sitemap.d.ts +0 -8
  337. package/dist/features/metadata/sitemap.js +0 -17
  338. package/dist/features/og/imageResponse.node.d.ts +0 -12
  339. package/dist/features/og/imageResponse.node.js +0 -49
  340. package/dist/features/og/imageResponse.workerd.d.ts +0 -12
  341. package/dist/features/og/imageResponse.workerd.js +0 -40
  342. package/dist/features/page/PublishedPageContent.js +0 -205
  343. package/dist/features/page/PublishedPageExperience.js +0 -23
  344. package/dist/features/preview/DerivedPreview.js +0 -134
  345. package/dist/features/preview/commentsEnabled.js +0 -8
  346. package/dist/features/preview/components/AddBlockSidebar.js +0 -381
  347. package/dist/features/preview/components/AttachedComments.js +0 -331
  348. package/dist/features/preview/components/CommentHeader.js +0 -122
  349. package/dist/features/preview/components/CommentSidebar.js +0 -29
  350. package/dist/features/preview/components/CommentTargetQuote.js +0 -167
  351. package/dist/features/preview/components/DerivedLayoutSidebar.d.ts +0 -5
  352. package/dist/features/preview/components/DerivedLayoutSidebar.js +0 -179
  353. package/dist/features/preview/components/DerivedPageInfoSidebar.js +0 -69
  354. package/dist/features/preview/components/LeftSidebar.js +0 -68
  355. package/dist/features/preview/components/PageEditorSidebar.js +0 -563
  356. package/dist/features/preview/components/PageInfoSidebar.js +0 -1551
  357. package/dist/features/preview/components/PageNavigatorSidebar.js +0 -78
  358. package/dist/features/preview/components/PageStatusBadge.js +0 -97
  359. package/dist/features/preview/components/PeekedBlock.js +0 -217
  360. package/dist/features/preview/components/PreviewComments.js +0 -56
  361. package/dist/features/preview/components/PreviewToolbarSpacer.js +0 -43
  362. package/dist/features/preview/components/PublicationRow.js +0 -422
  363. package/dist/features/preview/components/PublishDialog.js +0 -194
  364. package/dist/features/preview/components/RightSidebar.js +0 -59
  365. package/dist/features/preview/components/SendFeedbackDialog.js +0 -83
  366. package/dist/features/preview/previewCommentsStore.js +0 -135
  367. package/dist/features/preview/publication.js +0 -81
  368. package/dist/features/preview/usePageComments.js +0 -39
  369. package/dist/features/runtime/SharedChromeContext.js +0 -7
  370. package/dist/features/studio/components/EnvironmentMenu.js +0 -425
  371. package/dist/features/vite/appGeneration.js +0 -89
  372. package/dist/lib/view-queries.js +0 -28
  373. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/Matches.d.ts +0 -114
  374. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/RouterProvider.d.ts +0 -25
  375. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/config.d.ts +0 -1
  376. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/defer.d.ts +0 -1
  377. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/fileRoute.d.ts +0 -20
  378. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/global.d.ts +0 -8
  379. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/hash-scroll.d.ts +0 -1
  380. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/index.d.ts +0 -18
  381. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/link.d.ts +0 -161
  382. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/load-matches.d.ts +0 -6
  383. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/location.d.ts +0 -54
  384. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/lru-cache.d.ts +0 -8
  385. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/manifest.d.ts +0 -32
  386. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/new-process-route-tree.d.ts +0 -115
  387. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/not-found.d.ts +0 -1
  388. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/redirect.d.ts +0 -49
  389. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/rewrite.d.ts +0 -1
  390. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/root.d.ts +0 -6
  391. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/route.d.ts +0 -343
  392. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/routeInfo.d.ts +0 -48
  393. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/router.d.ts +0 -695
  394. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/scroll-restoration.d.ts +0 -1
  395. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchMiddleware.d.ts +0 -1
  396. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchParams.d.ts +0 -5
  397. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/RawStream.d.ts +0 -38
  398. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/seroval-plugins.d.ts +0 -1
  399. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/transformer.d.ts +0 -65
  400. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/stores.d.ts +0 -69
  401. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/structuralSharing.d.ts +0 -1
  402. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/typePrimitives.d.ts +0 -1
  403. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderData.d.ts +0 -1
  404. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderDeps.d.ts +0 -1
  405. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useNavigate.d.ts +0 -10
  406. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useParams.d.ts +0 -1
  407. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useRouteContext.d.ts +0 -1
  408. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useSearch.d.ts +0 -1
  409. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/utils.d.ts +0 -28
  410. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/validators.d.ts +0 -49
  411. package/skills/camox/references/cli-environments.md +0 -37
@@ -1,148 +1,150 @@
1
- import { getApiClient } from "../../lib/api-client.js";
2
- import { SharedChromeContext } from "./SharedChromeContext.js";
3
- import { previewStore, selectPreviewSource } from "../preview/previewStore.js";
1
+ import { previewStore, selectIsCanvasShown } from "../preview/previewStore.js";
2
+ import { shownRecordPage } from "../preview/pageRecord.js";
4
3
  import { Navbar } from "../studio/components/Navbar.js";
5
4
  import { PreviewToolbar } from "../preview/components/PreviewToolbar.js";
5
+ import { EditingFallbackContext } from "./editingFallback.js";
6
+ import { StudioEditingFallback } from "../preview/components/StudioEditingFallback.js";
7
+ import { ChatSidebar } from "../studio/components/ChatSidebar.js";
8
+ import { FollowAgentProvider } from "../studio/FollowAgentProvider.js";
6
9
  import { c } from "react/compiler-runtime";
7
- import { useQuery } from "@tanstack/react-query";
8
- import { jsx, jsxs } from "react/jsx-runtime";
9
10
  import { useSelector } from "@xstate/store-react";
10
- import { queryKeys } from "@camox/api-contract/query-keys";
11
+ import { jsx, jsxs } from "react/jsx-runtime";
11
12
  import studioCssUrl from "virtual:camox-studio-css";
12
13
 
13
14
  //#region src/features/runtime/RuntimeChrome.tsx
15
+ const renderEditingFallback = ({ layoutPage, children }) => /* @__PURE__ */ jsx(StudioEditingFallback, {
16
+ layoutPage,
17
+ children
18
+ });
14
19
  function RuntimeChrome(t0) {
15
- const $ = c(34);
16
- if ($[0] !== "4f2448cdd08f7a2c7703fe11bfa7e45ebc2f0485d14029a9a68ae33e62958b54") {
17
- for (let $i = 0; $i < 34; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
18
- $[0] = "4f2448cdd08f7a2c7703fe11bfa7e45ebc2f0485d14029a9a68ae33e62958b54";
19
- }
20
+ const $ = c(32);
20
21
  const { input, children } = t0;
21
- const preview = !input.routeKind;
22
+ const website = !input.routeKind;
22
23
  const hidden = useSelector(previewStore, _temp);
23
- const source = useSelector(previewStore, selectPreviewSource);
24
- let t1;
25
- if ($[1] !== input.pathname || $[2] !== source) {
26
- t1 = queryKeys.pages.getByPath(input.pathname, source);
27
- $[1] = input.pathname;
28
- $[2] = source;
29
- $[3] = t1;
30
- } else t1 = $[3];
24
+ const isCanvasShown = useSelector(previewStore, selectIsCanvasShown);
25
+ const showChat = !website || isCanvasShown;
26
+ const t1 = input.runtimeBasePath;
31
27
  let t2;
32
- if ($[4] !== input.pathname || $[5] !== input.projectSlug || $[6] !== source) {
33
- t2 = () => getApiClient().pages.getStructure({
34
- path: input.pathname,
35
- projectSlug: input.projectSlug,
36
- source
37
- });
38
- $[4] = input.pathname;
39
- $[5] = input.projectSlug;
40
- $[6] = source;
41
- $[7] = t2;
42
- } else t2 = $[7];
43
- let t3;
44
- if ($[8] !== t1 || $[9] !== t2) {
45
- t3 = {
46
- queryKey: t1,
47
- queryFn: t2,
48
- enabled: false
49
- };
50
- $[8] = t1;
51
- $[9] = t2;
52
- $[10] = t3;
53
- } else t3 = $[10];
54
- const { data: page } = useQuery(t3);
55
- let t4;
56
- if ($[11] === Symbol.for("react.memo_cache_sentinel")) {
57
- t4 = /* @__PURE__ */ jsx("link", {
28
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
29
+ t2 = /* @__PURE__ */ jsx("link", {
58
30
  rel: "stylesheet",
59
31
  href: studioCssUrl,
60
32
  "data-camox-studio": true
61
33
  });
62
- $[11] = t4;
63
- } else t4 = $[11];
64
- const t5 = preview ? "max-md:hidden" : void 0;
65
- const t6 = preview && hidden;
34
+ $[0] = t2;
35
+ } else t2 = $[0];
36
+ const t3 = website ? "max-md:hidden" : void 0;
37
+ const t4 = website && hidden;
38
+ let t5;
39
+ if ($[1] !== input) {
40
+ t5 = shownRecordPage(input);
41
+ $[1] = input;
42
+ $[2] = t5;
43
+ } else t5 = $[2];
44
+ let t6;
45
+ if ($[3] !== t5 || $[4] !== website) {
46
+ t6 = /* @__PURE__ */ jsx(Navbar, {
47
+ isWebsite: website,
48
+ recordPage: t5
49
+ });
50
+ $[3] = t5;
51
+ $[4] = website;
52
+ $[5] = t6;
53
+ } else t6 = $[5];
66
54
  let t7;
67
- if ($[12] !== preview) {
68
- t7 = /* @__PURE__ */ jsx(Navbar, { isPreview: preview });
69
- $[12] = preview;
70
- $[13] = t7;
71
- } else t7 = $[13];
72
- let t8;
73
- if ($[14] !== t5 || $[15] !== t6 || $[16] !== t7) {
74
- t8 = /* @__PURE__ */ jsx("div", {
75
- className: t5,
76
- hidden: t6,
77
- children: t7
55
+ if ($[6] !== t3 || $[7] !== t4 || $[8] !== t6) {
56
+ t7 = /* @__PURE__ */ jsx("div", {
57
+ className: t3,
58
+ hidden: t4,
59
+ children: t6
78
60
  });
79
- $[14] = t5;
80
- $[15] = t6;
81
- $[16] = t7;
82
- $[17] = t8;
83
- } else t8 = $[17];
61
+ $[6] = t3;
62
+ $[7] = t4;
63
+ $[8] = t6;
64
+ $[9] = t7;
65
+ } else t7 = $[9];
66
+ const t8 = input.canvasOnly ? null : renderEditingFallback;
84
67
  let t9;
85
- if ($[18] !== children) {
68
+ if ($[10] !== children || $[11] !== t8) {
86
69
  t9 = /* @__PURE__ */ jsx("div", {
87
70
  className: "flex min-h-0 flex-1 flex-col overflow-auto",
88
- children
71
+ children: /* @__PURE__ */ jsx(EditingFallbackContext, {
72
+ value: t8,
73
+ children
74
+ })
89
75
  });
90
- $[18] = children;
91
- $[19] = t9;
92
- } else t9 = $[19];
93
- const t10 = !preview;
76
+ $[10] = children;
77
+ $[11] = t8;
78
+ $[12] = t9;
79
+ } else t9 = $[12];
80
+ const t10 = !website;
94
81
  const t11 = input.derived ? void 0 : "max-md:hidden";
95
- const t12 = page?.page.id;
96
- const t13 = preview && !input.derived ? page?.page.status : void 0;
97
- const t14 = !!page?.page.livePublishedCheckpointId;
98
- let t15;
99
- if ($[20] !== t12 || $[21] !== t13 || $[22] !== t14) {
100
- t15 = /* @__PURE__ */ jsx(PreviewToolbar, {
101
- pageId: t12,
102
- pageStatus: t13,
103
- hasLiveVersion: t14
104
- });
105
- $[20] = t12;
106
- $[21] = t13;
107
- $[22] = t14;
108
- $[23] = t15;
109
- } else t15 = $[23];
110
- let t16;
111
- if ($[24] !== t10 || $[25] !== t11 || $[26] !== t15) {
112
- t16 = /* @__PURE__ */ jsx("div", {
82
+ let t12;
83
+ if ($[13] === Symbol.for("react.memo_cache_sentinel")) {
84
+ t12 = /* @__PURE__ */ jsx(PreviewToolbar, {});
85
+ $[13] = t12;
86
+ } else t12 = $[13];
87
+ let t13;
88
+ if ($[14] !== t10 || $[15] !== t11) {
89
+ t13 = /* @__PURE__ */ jsx("div", {
113
90
  hidden: t10,
114
91
  className: t11,
115
- children: t15
92
+ children: t12
93
+ });
94
+ $[14] = t10;
95
+ $[15] = t11;
96
+ $[16] = t13;
97
+ } else t13 = $[16];
98
+ let t14;
99
+ if ($[17] !== t13 || $[18] !== t9) {
100
+ t14 = /* @__PURE__ */ jsxs("div", {
101
+ className: "relative flex min-h-0 min-w-0 flex-1 flex-col",
102
+ children: [t9, t13]
116
103
  });
117
- $[24] = t10;
118
- $[25] = t11;
119
- $[26] = t15;
120
- $[27] = t16;
121
- } else t16 = $[27];
104
+ $[17] = t13;
105
+ $[18] = t9;
106
+ $[19] = t14;
107
+ } else t14 = $[19];
108
+ const t15 = !showChat;
109
+ let t16;
110
+ if ($[20] !== t15) {
111
+ t16 = /* @__PURE__ */ jsx(ChatSidebar, { hidden: t15 });
112
+ $[20] = t15;
113
+ $[21] = t16;
114
+ } else t16 = $[21];
122
115
  let t17;
123
- if ($[28] !== t16 || $[29] !== t9) {
116
+ if ($[22] !== t14 || $[23] !== t16) {
124
117
  t17 = /* @__PURE__ */ jsxs("div", {
125
- className: "relative flex min-h-0 flex-1 flex-col",
126
- children: [t9, t16]
118
+ className: "flex min-h-0 flex-1",
119
+ children: [t14, t16]
127
120
  });
128
- $[28] = t16;
129
- $[29] = t9;
130
- $[30] = t17;
131
- } else t17 = $[30];
121
+ $[22] = t14;
122
+ $[23] = t16;
123
+ $[24] = t17;
124
+ } else t17 = $[24];
132
125
  let t18;
133
- if ($[31] !== t17 || $[32] !== t8) {
134
- t18 = /* @__PURE__ */ jsxs(SharedChromeContext.Provider, {
135
- value: true,
136
- children: [t4, /* @__PURE__ */ jsxs("div", {
137
- className: "bg-background flex h-screen flex-col overflow-hidden",
138
- children: [t8, t17]
139
- })]
126
+ if ($[25] !== t17 || $[26] !== t7) {
127
+ t18 = /* @__PURE__ */ jsxs("div", {
128
+ className: "bg-background flex h-screen flex-col overflow-hidden",
129
+ children: [t7, t17]
130
+ });
131
+ $[25] = t17;
132
+ $[26] = t7;
133
+ $[27] = t18;
134
+ } else t18 = $[27];
135
+ let t19;
136
+ if ($[28] !== input.runtimeBasePath || $[29] !== t18 || $[30] !== website) {
137
+ t19 = /* @__PURE__ */ jsxs(FollowAgentProvider, {
138
+ runtimeBasePath: t1,
139
+ website,
140
+ children: [t2, t18]
140
141
  });
141
- $[31] = t17;
142
- $[32] = t8;
143
- $[33] = t18;
144
- } else t18 = $[33];
145
- return t18;
142
+ $[28] = input.runtimeBasePath;
143
+ $[29] = t18;
144
+ $[30] = website;
145
+ $[31] = t19;
146
+ } else t19 = $[31];
147
+ return t19;
146
148
  }
147
149
  function _temp(state) {
148
150
  return state.context.isToolbarHidden;
@@ -0,0 +1,64 @@
1
+ import { localizedPath } from "../../lib/locale-path.js";
2
+ import { getPageDestinations } from "../../core/pageDestinations.js";
3
+ import { discoverLayoutPages } from "../../core/derivedRoutes.js";
4
+
5
+ //#region src/features/runtime/alternates.ts
6
+ /**
7
+ * The locales a page exists in, in the order of the scope's locales, with its path in each.
8
+ * `located` is where the render found it. A locale that can't be read leaves the page out of it
9
+ * rather than failing the render.
10
+ */
11
+ async function findAlternates({ identity, located: { locale, locales, path }, layouts, reads }) {
12
+ const pathIn = async (other) => {
13
+ if (other.tag === locale.tag) return path;
14
+ if (identity.kind === "code-owned") return path;
15
+ if (identity.kind === "curated") return getPageDestinations(await reads.pages(other), layouts).find((destination) => destination.key === `page:${identity.pageId}`)?.fullPath;
16
+ return (await discoverLayoutPages(identity.layout, reads.context(other))).find((page) => page.recordId === identity.recordId)?.path;
17
+ };
18
+ return (await Promise.all(locales.map(async (other) => {
19
+ try {
20
+ const otherPath = await pathIn(other);
21
+ return otherPath === void 0 ? void 0 : {
22
+ locale: other.tag,
23
+ path: localizedPath(otherPath, other)
24
+ };
25
+ } catch (error) {
26
+ console.error(`[camox] Couldn't find the page's alternate in "${other.tag}".`, error);
27
+ return;
28
+ }
29
+ }))).filter((alternate) => alternate !== void 0);
30
+ }
31
+ /** Each page's alternates by its key, from the pages of every locale. */
32
+ function alternatesByPage(localizations) {
33
+ const alternates = /* @__PURE__ */ new Map();
34
+ for (const { locale, pages } of localizations) for (const { key, fullPath } of pages) {
35
+ const found = alternates.get(key) ?? [];
36
+ found.push({
37
+ locale: locale.tag,
38
+ path: localizedPath(fullPath, locale)
39
+ });
40
+ alternates.set(key, found);
41
+ }
42
+ return alternates;
43
+ }
44
+ /**
45
+ * The `hreflang` links of a page's alternates, plus `x-default` for the default locale's page
46
+ * when it exists. None for a project with a single locale: there is nothing to tell apart.
47
+ */
48
+ function hreflangLinks(alternates, locales, url) {
49
+ if (locales.length < 2) return [];
50
+ const links = alternates.map(({ locale, path }) => ({
51
+ hreflang: locale,
52
+ href: url(path)
53
+ }));
54
+ const defaultTag = locales.find((locale) => locale.isDefault)?.tag;
55
+ const fallback = alternates.find(({ locale }) => locale === defaultTag);
56
+ if (fallback) links.push({
57
+ hreflang: "x-default",
58
+ href: url(fallback.path)
59
+ });
60
+ return links;
61
+ }
62
+
63
+ //#endregion
64
+ export { alternatesByPage, findAlternates, hreflangLinks };
@@ -0,0 +1,7 @@
1
+ import { PageStructure } from "../routes/pageRuntime.js";
2
+ //#region src/features/runtime/analytics.d.ts
3
+ /**
4
+ * The project's analytics providers, a Project Setting. Each provider is null when it isn't set up.
5
+ */
6
+ export type AnalyticsProviders = PageStructure["project"]["analytics"];
7
+ //#endregion
@@ -0,0 +1,66 @@
1
+ import { escapeAttribute, serializeJsonForHtml } from "../../lib/html.js";
2
+
3
+ //#region src/features/runtime/analytics.ts
4
+ /** `providers`, when at least one is set up. */
5
+ function configuredProviders(providers) {
6
+ return providers && PROVIDERS.some((provider) => providers[provider]) ? providers : void 0;
7
+ }
8
+ /**
9
+ * PostHog's standard snippet: it defines a `posthog` global that queues calls, and loads the SDK
10
+ * from the host passed to `init` without blocking the page.
11
+ */
12
+ const POSTHOG_SNIPPET = `!function(t,e){var o,n,p,r;e.__SV||(window.posthog && window.posthog.__loaded)||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}p||((p=t.createElement("script")).type="text/javascript",p.crossOrigin="anonymous",p.async=!0,p.src=s.api_host.replace(".i.posthog.com","-assets.i.posthog.com")+"/static/array.js",p.onerror=function(){p=null},(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r));var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],Object.defineProperty(u,"toString",{configurable:!0,enumerable:!0,writable:!0,value:function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e}}),Object.defineProperty(u.people,"toString",{configurable:!0,enumerable:!0,writable:!0,value:function(){return u.toString(1)+".people (stub)"}}),o="init capture register register_once register_for_session unregister unregister_for_session getFeatureFlag getFeatureFlagResult isFeatureEnabled reloadFeatureFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSessionId getSurveys getActiveMatchingSurveys renderSurvey canRenderSurvey getNextSurveyStep identify setPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException loadToolbar get_property getSessionProperty createPersonProfile opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing clear_opt_in_out_capturing debug".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);`;
13
+ /** The scripts that load each provider, with automatic page views off. */
14
+ const providerScripts = {
15
+ ga4: ({ measurementId }) => {
16
+ const src = `https://www.googletagmanager.com/gtag/js?id=${encodeURIComponent(measurementId)}`;
17
+ return `<script async src="${escapeAttribute(src)}"><\/script><script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}gtag("js",new Date());gtag("config",${serializeJsonForHtml(measurementId)},{send_page_view:false});<\/script>`;
18
+ },
19
+ posthog: ({ projectApiKey, region }) => {
20
+ const config = {
21
+ api_host: `https://${region}.i.posthog.com`,
22
+ defaults: "2026-05-30",
23
+ capture_pageview: false,
24
+ capture_pageleave: true
25
+ };
26
+ return `<script>${POSTHOG_SNIPPET}posthog.init(${serializeJsonForHtml(projectApiKey)},${serializeJsonForHtml(config)});<\/script>`;
27
+ }
28
+ };
29
+ const PROVIDERS = Object.keys(providerScripts);
30
+ /** The script loading `provider` with its `settings`, or nothing when it isn't set up. */
31
+ function providerScript(provider, settings) {
32
+ return settings ? providerScripts[provider](settings) : "";
33
+ }
34
+ /**
35
+ * The providers' scripts, loaded without blocking the page. They send no page view of their own:
36
+ * the page client does, once each page's title is in place.
37
+ */
38
+ function renderAnalyticsScripts(providers) {
39
+ if (!providers) return "";
40
+ return PROVIDERS.map((provider) => providerScript(provider, providers[provider])).join("");
41
+ }
42
+ /** How each provider receives a page view, through the global its script defines. */
43
+ const pageViewSenders = {
44
+ ga4: ({ url, path, title }, target) => target.gtag?.("event", "page_view", {
45
+ page_location: url,
46
+ page_path: path,
47
+ page_title: title
48
+ }),
49
+ posthog: ({ url, path, title }, target) => target.posthog?.capture("$pageview", {
50
+ $current_url: url,
51
+ $pathname: path,
52
+ title
53
+ })
54
+ };
55
+ /** Sends a page view of the page `target` shows to every provider the server loaded. */
56
+ function sendPageView(providers, target) {
57
+ const pageView = {
58
+ url: target.location.href,
59
+ path: target.location.pathname,
60
+ title: target.document.title
61
+ };
62
+ for (const provider of PROVIDERS) if (providers[provider]) pageViewSenders[provider](pageView, target);
63
+ }
64
+
65
+ //#endregion
66
+ export { configuredProviders, renderAnalyticsScripts, sendPageView };
@@ -0,0 +1,87 @@
1
+ import { artifactSourceOf } from "../../core/lib/artifact.js";
2
+
3
+ //#region src/features/runtime/artifactSources.ts
4
+ /**
5
+ * A page's HTML holds each rendered artifact source in its frame's `srcdoc`, so the server leaves
6
+ * them out of the hydration data, and the client takes them back from the frames before
7
+ * hydrating. Each source left out becomes a reference to it, made of this prefix and a key.
8
+ */
9
+ const REFERENCE = "\0camox-artifact-source:";
10
+ /**
11
+ * The HTML parser turns every CR LF and lone CR into LF, attribute values included, so sources
12
+ * are keyed with LF only.
13
+ */
14
+ const normalizeNewlines = (value) => value.replace(/\r\n?/g, "\n");
15
+ /** A key that tells a source apart from the others on its page: its length and FNV-1a hash. */
16
+ function referenceTo(source) {
17
+ let hash = 2166136261;
18
+ for (let index = 0; index < source.length; index++) {
19
+ hash ^= source.charCodeAt(index);
20
+ hash = Math.imul(hash, 16777619);
21
+ }
22
+ return `${REFERENCE}${source.length}:${(hash >>> 0).toString(36)}`;
23
+ }
24
+ function isPlainObject(value) {
25
+ if (typeof value !== "object" || value === null) return false;
26
+ const prototype = Object.getPrototypeOf(value);
27
+ return prototype === Object.prototype || prototype === null;
28
+ }
29
+ /** A copy of a JSON value with every string replaced. */
30
+ function mapStrings(value, replace) {
31
+ if (typeof value === "string") return replace(value);
32
+ if (Array.isArray(value)) return value.map((item) => mapStrings(item, replace));
33
+ if (!isPlainObject(value)) return value;
34
+ return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, mapStrings(item, replace)]));
35
+ }
36
+ const ENTITIES = {
37
+ amp: "&",
38
+ lt: "<",
39
+ gt: ">",
40
+ quot: "\"",
41
+ apos: "'"
42
+ };
43
+ function decodeAttribute(value) {
44
+ return value.replace(/&(#x[0-9a-f]+|#\d+|[a-z]+);/gi, (entity, name) => {
45
+ if (name[0] !== "#") return ENTITIES[name.toLowerCase()] ?? entity;
46
+ const code = name[1] === "x" || name[1] === "X" ? parseInt(name.slice(2), 16) : Number(name.slice(1));
47
+ return String.fromCodePoint(code);
48
+ });
49
+ }
50
+ /**
51
+ * The page's dehydrated state without the artifact sources its HTML already holds in frames,
52
+ * each replaced by a reference. Sources the HTML doesn't render stay, as the client couldn't
53
+ * take them back.
54
+ */
55
+ function omitArtifactSources(dehydratedState, html) {
56
+ const rendered = /* @__PURE__ */ new Set();
57
+ for (const [, srcdoc] of html.matchAll(/<iframe\b[^>]*?\ssrcdoc="([^"]*)"/gi)) {
58
+ const source = artifactSourceOf(normalizeNewlines(decodeAttribute(srcdoc)));
59
+ if (source) rendered.add(source);
60
+ }
61
+ if (rendered.size === 0) return dehydratedState;
62
+ return mapStrings(dehydratedState, (value) => {
63
+ const source = normalizeNewlines(value);
64
+ return rendered.has(source) ? referenceTo(source) : value;
65
+ });
66
+ }
67
+ /**
68
+ * The dehydrated state with the artifact sources that `omitArtifactSources` left out taken back
69
+ * from the frames under `root`, as the browser parsed them, so they hydrate the frames unchanged.
70
+ */
71
+ function restoreArtifactSources(dehydratedState, root) {
72
+ const sources = /* @__PURE__ */ new Map();
73
+ for (const frame of root.querySelectorAll("iframe[srcdoc]")) {
74
+ const source = artifactSourceOf(frame.getAttribute("srcdoc") ?? "");
75
+ if (source) sources.set(referenceTo(normalizeNewlines(source)), source);
76
+ }
77
+ return mapStrings(dehydratedState, (value) => {
78
+ if (!value.startsWith(REFERENCE)) return value;
79
+ const source = sources.get(value);
80
+ if (source !== void 0) return source;
81
+ console.error("Camox: an artifact's frame was missing from the page before hydration.");
82
+ return "";
83
+ });
84
+ }
85
+
86
+ //#endregion
87
+ export { omitArtifactSources, restoreArtifactSources };
@@ -0,0 +1,20 @@
1
+ import * as React from "react";
2
+
3
+ //#region src/features/runtime/editingFallback.tsx
4
+ /**
5
+ * Renders the read-only page while the editor is still loading. The Studio
6
+ * chrome provides it, so visitors never download it.
7
+ */
8
+ const EditingFallbackContext = React.createContext(null);
9
+ /** The read-only page shown until the editor activates, laid out for the Canvas when it shows. */
10
+ function EditingFallbackSlot({ layoutPage, children }) {
11
+ const render = React.use(EditingFallbackContext);
12
+ if (!render) return children;
13
+ return render({
14
+ layoutPage,
15
+ children
16
+ });
17
+ }
18
+
19
+ //#endregion
20
+ export { EditingFallbackContext, EditingFallbackSlot };
@@ -0,0 +1,97 @@
1
+ //#region src/features/runtime/linkPrefetch.ts
2
+ /**
3
+ * Loads a page before its link is followed: when the pointer rests on the link, when the link is
4
+ * focused, or when a finger touches it. The next navigation to that page uses what was loaded.
5
+ */
6
+ /** How long the pointer rests on a link before its page loads, so sweeping across links doesn't. */
7
+ const HOVER_INTENT_DELAY = 50;
8
+ /** How long a loaded page may serve a navigation. Later, the navigation reads it afresh. */
9
+ const PREFETCH_STALE_TIME = 3e4;
10
+ function createPrefetchCache({ staleTime = PREFETCH_STALE_TIME, now = Date.now } = {}) {
11
+ const entries = /* @__PURE__ */ new Map();
12
+ const fresh = (key) => {
13
+ const entry = entries.get(key);
14
+ if (entry && now() - entry.loadedAt < staleTime) return entry;
15
+ entries.delete(key);
16
+ };
17
+ return {
18
+ /** Starts `load`ing `key`, unless a fresh load of it is already there or under way. */
19
+ prefetch(key, load) {
20
+ if (fresh(key)) return;
21
+ const entry = {
22
+ promise: load(),
23
+ loadedAt: now()
24
+ };
25
+ entries.set(key, entry);
26
+ entry.promise.catch(() => {
27
+ if (entries.get(key) === entry) entries.delete(key);
28
+ });
29
+ },
30
+ /** The fresh load of `key`, which then no longer serves later navigations. */
31
+ take(key) {
32
+ const entry = fresh(key);
33
+ entries.delete(key);
34
+ return entry?.promise;
35
+ },
36
+ clear() {
37
+ entries.clear();
38
+ }
39
+ };
40
+ }
41
+ /** Whether the visitor asked to save data, or is on a connection too slow to spend on guesses. */
42
+ function savesData(win) {
43
+ const connection = win.navigator.connection;
44
+ return !!connection?.saveData || /(^|-)2g$/.test(connection?.effectiveType ?? "");
45
+ }
46
+ /**
47
+ * Calls `onIntent` with each link the visitor is about to follow. `doc` delegates for every link,
48
+ * including ones rendered later.
49
+ */
50
+ function listenForLinkIntent(doc, onIntent, { hoverDelay = 50 } = {}) {
51
+ const win = doc.defaultView;
52
+ let hovered = null;
53
+ const anchorOf = (target) => target instanceof win.Element ? target.closest("a") : null;
54
+ const intent = (anchor) => {
55
+ if (!anchor.href || savesData(win)) return;
56
+ onIntent(anchor);
57
+ };
58
+ const cancelHover = () => {
59
+ if (hovered) clearTimeout(hovered.timer);
60
+ hovered = null;
61
+ };
62
+ const onMouseOver = (event) => {
63
+ const anchor = anchorOf(event.target);
64
+ if (!anchor || hovered?.anchor === anchor) return;
65
+ cancelHover();
66
+ hovered = {
67
+ anchor,
68
+ timer: setTimeout(() => intent(anchor), hoverDelay)
69
+ };
70
+ };
71
+ const onMouseOut = (event) => {
72
+ if (!hovered || hovered.anchor.contains(event.relatedTarget)) return;
73
+ if (anchorOf(event.target) === hovered.anchor) cancelHover();
74
+ };
75
+ const onFocusIn = (event) => {
76
+ const anchor = anchorOf(event.target);
77
+ if (anchor) intent(anchor);
78
+ };
79
+ const onTouchStart = (event) => {
80
+ const anchor = anchorOf(event.target);
81
+ if (anchor) intent(anchor);
82
+ };
83
+ doc.addEventListener("mouseover", onMouseOver);
84
+ doc.addEventListener("mouseout", onMouseOut);
85
+ doc.addEventListener("focusin", onFocusIn);
86
+ doc.addEventListener("touchstart", onTouchStart, { passive: true });
87
+ return () => {
88
+ cancelHover();
89
+ doc.removeEventListener("mouseover", onMouseOver);
90
+ doc.removeEventListener("mouseout", onMouseOut);
91
+ doc.removeEventListener("focusin", onFocusIn);
92
+ doc.removeEventListener("touchstart", onTouchStart);
93
+ };
94
+ }
95
+
96
+ //#endregion
97
+ export { PREFETCH_STALE_TIME, createPrefetchCache, listenForLinkIntent };
@@ -0,0 +1,62 @@
1
+ import { createRequestContext } from "../../core/requestContext.js";
2
+ import { getPageDestinations } from "../../core/pageDestinations.js";
3
+ import { discoverLayoutPages } from "../../core/derivedRoutes.js";
4
+
5
+ //#region src/features/runtime/livePages.ts
6
+ /**
7
+ * The pages served on Live: curated pages and singletons (without pages missing their layout or
8
+ * shadowed by a singleton), then the pages derived layouts discover. `records` must read Live.
9
+ * Rejects when a layout's Route Discovery fails: an index silently missing pages is worse.
10
+ */
11
+ async function listLivePages({ pages, app, records }) {
12
+ const layouts = app?.getLayouts() ?? [];
13
+ const pagesById = new Map(pages.map((page) => [page.id, page]));
14
+ const destinations = getPageDestinations(pages, layouts).map((destination) => {
15
+ if (destination.kind === "singleton") {
16
+ const layout = layouts.find(({ _internal }) => _internal.id === destination.layoutId);
17
+ return {
18
+ key: destination.key,
19
+ fullPath: destination.fullPath,
20
+ layoutId: destination.layoutId,
21
+ title: layout._internal.title,
22
+ hasMarkdown: servesMarkdown(layout)
23
+ };
24
+ }
25
+ const page = pagesById.get(destination.pageId);
26
+ return {
27
+ key: destination.key,
28
+ fullPath: page.fullPath,
29
+ layoutId: page.layoutId,
30
+ title: page.metaTitle || page.nickname,
31
+ ...page.metaDescription && { description: page.metaDescription },
32
+ hasMarkdown: true,
33
+ updatedAt: page.updatedAt
34
+ };
35
+ });
36
+ const context = createRequestContext({ records });
37
+ const discovered = await Promise.all(layouts.filter((layout) => layout._internal.kind === "derived").map(async (layout) => {
38
+ return (await discoverLayoutPages(layout, context).catch((error) => {
39
+ throw new RouteDiscoveryError(error);
40
+ })).map((page) => ({
41
+ key: page.recordId ? `record:${layout._internal.id}:${page.recordId}` : `derived:${page.path}`,
42
+ fullPath: page.path,
43
+ layoutId: layout._internal.id,
44
+ title: page.label || page.path,
45
+ hasMarkdown: servesMarkdown(layout)
46
+ }));
47
+ }));
48
+ return [...destinations, ...discovered.flat()];
49
+ }
50
+ /** Whether a layout's pages serve a Markdown Representation. */
51
+ function servesMarkdown(layout) {
52
+ return layout._internal.toMarkdown !== void 0;
53
+ }
54
+ /** A derived layout's Route Discovery failed, so the Live pages can't all be listed. */
55
+ var RouteDiscoveryError = class extends Error {
56
+ constructor(cause) {
57
+ super(cause instanceof Error ? cause.message : String(cause), { cause });
58
+ }
59
+ };
60
+
61
+ //#endregion
62
+ export { RouteDiscoveryError, listLivePages };