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,53 @@
1
+ import { canvasStore } from "./canvasStore.js";
2
+ import { CanvasWorkspaceContext } from "./canvasZoom.js";
3
+ import { c } from "react/compiler-runtime";
4
+ import { useContext, useState } from "react";
5
+ import { useSelector } from "@xstate/store-react";
6
+
7
+ //#region src/features/canvas/canvasFrameMode.ts
8
+ function canvasFrameMode({ near, selected, moving }) {
9
+ if (!near && !selected) return "resting";
10
+ if (moving || !selected) return "paused";
11
+ return "live";
12
+ }
13
+ /**
14
+ * A frame's mode as the camera moves. A frame that leaves the camera rests only
15
+ * once the camera is still: while it moves, every frame is paused anyway, and
16
+ * frames it passes by would otherwise stop and restart all their effects.
17
+ */
18
+ function useCanvasFrameMode(t0) {
19
+ const $ = c(8);
20
+ const { near, selected } = t0;
21
+ const workspaceKey = useContext(CanvasWorkspaceContext)?.workspaceKey;
22
+ let t1;
23
+ if ($[0] !== near || $[1] !== selected || $[2] !== workspaceKey) {
24
+ t1 = (state) => (selected || !near) && workspaceKey != null && !!state.context.moving[workspaceKey];
25
+ $[0] = near;
26
+ $[1] = selected;
27
+ $[2] = workspaceKey;
28
+ $[3] = t1;
29
+ } else t1 = $[3];
30
+ const moving = useSelector(canvasStore, t1);
31
+ const away = !near && !selected;
32
+ const [resting, setResting] = useState(away);
33
+ if (resting !== away && (!away || !moving)) setResting(away);
34
+ if (!away) {
35
+ let t2;
36
+ if ($[4] !== moving || $[5] !== near || $[6] !== selected) {
37
+ t2 = canvasFrameMode({
38
+ near,
39
+ selected,
40
+ moving
41
+ });
42
+ $[4] = moving;
43
+ $[5] = near;
44
+ $[6] = selected;
45
+ $[7] = t2;
46
+ } else t2 = $[7];
47
+ return t2;
48
+ }
49
+ return resting ? "resting" : "paused";
50
+ }
51
+
52
+ //#endregion
53
+ export { canvasFrameMode, useCanvasFrameMode };
@@ -0,0 +1,44 @@
1
+ //#region src/features/canvas/canvasInsertionSeams.ts
2
+ /** Main block wrappers publish insertion permissions, including layout boundaries.
3
+ * Detached block targets and fields deliberately do not publish this metadata. */
4
+ function readBlockInsertion(element) {
5
+ const value = element.getAttribute("data-camox-block-insertion");
6
+ if (!value) return;
7
+ try {
8
+ const insertion = JSON.parse(value);
9
+ if (!insertion || typeof insertion.position !== "string" || typeof insertion.before !== "boolean" || typeof insertion.after !== "boolean" || insertion.afterPosition !== void 0 && insertion.afterPosition !== null && typeof insertion.afterPosition !== "string") return;
10
+ return insertion;
11
+ } catch {
12
+ return;
13
+ }
14
+ }
15
+ /** Walk boundaries, not blocks: the bottom of one block and the top of its
16
+ * successor describe ONE insertion seam, even when both permit insertion. */
17
+ function canvasInsertionSeams(targets) {
18
+ const blocks = targets.filter((target) => target.insertion && target.bounds.width > 0 && target.bounds.height > 0);
19
+ const seams = [];
20
+ for (let index = 0; index <= blocks.length; index++) {
21
+ const previous = blocks[index - 1];
22
+ const next = blocks[index];
23
+ const anchor = previous?.insertion?.after ? previous : next?.insertion?.before ? next : null;
24
+ if (!anchor?.insertion) continue;
25
+ const insertPosition = anchor === previous ? "after" : "before";
26
+ const { position, afterPosition } = anchor.insertion;
27
+ const y = previous && next ? (previous.bounds.y + previous.bounds.height + next.bounds.y) / 2 : anchor.bounds.y + (insertPosition === "after" ? anchor.bounds.height : 0);
28
+ seams.push({
29
+ key: `${previous?.element.getAttribute("data-camox-block-id") ?? "start"}:${next?.element.getAttribute("data-camox-block-id") ?? "end"}`,
30
+ x: anchor.bounds.x + anchor.bounds.width / 2,
31
+ y,
32
+ request: {
33
+ type: "CAMOX_ADD_BLOCK_REQUEST",
34
+ blockPosition: position,
35
+ insertPosition,
36
+ ...afterPosition !== void 0 ? { afterPosition } : {}
37
+ }
38
+ });
39
+ }
40
+ return seams;
41
+ }
42
+
43
+ //#endregion
44
+ export { canvasInsertionSeams, readBlockInsertion };
@@ -0,0 +1,120 @@
1
+ import { CANVAS_DEVICES } from "./canvasPages.js";
2
+
3
+ //#region src/features/canvas/canvasItems.ts
4
+ const CANVAS_ITEM_GAP = 240;
5
+ const CANVAS_SHELF_GAP = 480;
6
+ const CANVAS_SLOT_WIDTH = CANVAS_DEVICES.desktop.width;
7
+ /** Per-kind layout and camera behavior. */
8
+ const CANVAS_ITEM_KINDS = {
9
+ page: {
10
+ width: CANVAS_SLOT_WIDTH,
11
+ snappable: true
12
+ },
13
+ block: {
14
+ width: CANVAS_SLOT_WIDTH,
15
+ snappable: true
16
+ }
17
+ };
18
+ /** The key of a block's item in the Canvas row. */
19
+ function canvasBlockKey(blockId) {
20
+ return `block:${blockId}`;
21
+ }
22
+ /** The Block Catalog: every page-content Block Definition, alphabetically by title. */
23
+ function getBlockCatalog(blocks) {
24
+ return blocks.filter((block) => !block._internal.layoutOnly).sort((a, b) => a._internal.title.localeCompare(b._internal.title));
25
+ }
26
+ function getCanvasShelves(pages, blocks) {
27
+ return [{
28
+ key: "shelf:pages",
29
+ label: "Pages",
30
+ items: pages.map((page) => ({
31
+ kind: "page",
32
+ key: page.key,
33
+ page
34
+ }))
35
+ }, {
36
+ key: "shelf:blocks",
37
+ label: "Blocks",
38
+ shownWhenEmpty: true,
39
+ collapsedByDefault: true,
40
+ unmountedWhenCollapsed: true,
41
+ items: getBlockCatalog(blocks).map((block) => ({
42
+ kind: "block",
43
+ key: canvasBlockKey(block._internal.id),
44
+ block
45
+ }))
46
+ }];
47
+ }
48
+ /**
49
+ * World-space positions of the Canvas row, matching its flex layout, and the
50
+ * markers above it. Items of collapsed shelves are left out of the row; each
51
+ * collapsed shelf, or empty one that is still shown, takes a zero-width slot
52
+ * instead, so its marker keeps a place and shows as collapsed.
53
+ */
54
+ function positionCanvasShelves(shelves, collapsed = /* @__PURE__ */ new Set()) {
55
+ const items = [];
56
+ const markers = [];
57
+ let left = 0;
58
+ for (const shelf of shelves) {
59
+ if (!isCanvasShelfShown(shelf)) continue;
60
+ const start = left;
61
+ const marker = {
62
+ key: shelf.key,
63
+ label: shelf.label,
64
+ count: shelf.items.length
65
+ };
66
+ if (collapsed.has(shelf.key) || shelf.items.length === 0) {
67
+ markers.push({
68
+ ...marker,
69
+ start,
70
+ end: start,
71
+ collapsed: true
72
+ });
73
+ left += 480;
74
+ continue;
75
+ }
76
+ for (const item of shelf.items) {
77
+ const { width } = CANVAS_ITEM_KINDS[item.kind];
78
+ items.push({
79
+ ...item,
80
+ left,
81
+ width
82
+ });
83
+ left += width + 240;
84
+ }
85
+ const end = left - 240;
86
+ markers.push({
87
+ ...marker,
88
+ start,
89
+ end,
90
+ collapsed: false
91
+ });
92
+ left = end + 480;
93
+ }
94
+ return {
95
+ items,
96
+ markers,
97
+ width: Math.max(0, left - 480)
98
+ };
99
+ }
100
+ /** The shelves collapsed when the Canvas first opens in a Studio session. */
101
+ function getDefaultCollapsedShelves(shelves) {
102
+ return shelves.filter((shelf) => shelf.collapsedByDefault).map(({ key }) => key);
103
+ }
104
+ /** Whether a shelf has a marker and a place in the row. */
105
+ function isCanvasShelfShown(shelf) {
106
+ return shelf.items.length > 0 || shelf.shownWhenEmpty === true;
107
+ }
108
+ function isCanvasBlock(item) {
109
+ return item.kind === "block";
110
+ }
111
+ function canvasSnapTargets(items) {
112
+ return items.filter((item) => CANVAS_ITEM_KINDS[item.kind].snappable).map(({ key, left, width }) => ({
113
+ key,
114
+ left,
115
+ width
116
+ }));
117
+ }
118
+
119
+ //#endregion
120
+ export { CANVAS_SLOT_WIDTH, canvasBlockKey, canvasSnapTargets, getBlockCatalog, getCanvasShelves, getDefaultCollapsedShelves, isCanvasBlock, isCanvasShelfShown, positionCanvasShelves };
@@ -0,0 +1,240 @@
1
+ import { PREVIEW_PAUSED_ATTRIBUTE } from "../../core/lib/previewPaused.js";
2
+ import { readBlockInsertion } from "./canvasInsertionSeams.js";
3
+ import { resolveOverlayHighlights } from "../preview/overlayHighlights.js";
4
+ import { repeatableItemElements, subscribeRepeatableItems } from "../preview/repeatableItemTargets.js";
5
+
6
+ //#region src/features/canvas/canvasOverlayGeometry.ts
7
+ const targetSelector = "[data-camox-field-id], [data-camox-block-id]";
8
+ const stateAttributes = /* @__PURE__ */ new Set([
9
+ "data-camox-hovered",
10
+ "data-camox-focused",
11
+ "data-camox-overlay-mode",
12
+ PREVIEW_PAUSED_ATTRIBUTE
13
+ ]);
14
+ function rectOf({ x, y, width, height }) {
15
+ return {
16
+ x,
17
+ y,
18
+ width,
19
+ height
20
+ };
21
+ }
22
+ function hasArea(rect) {
23
+ return rect.width > 0 && rect.height > 0;
24
+ }
25
+ function unionOf(rects) {
26
+ const left = Math.min(...rects.map((rect) => rect.x));
27
+ const top = Math.min(...rects.map((rect) => rect.y));
28
+ const right = Math.max(...rects.map((rect) => rect.x + rect.width));
29
+ const bottom = Math.max(...rects.map((rect) => rect.y + rect.height));
30
+ return {
31
+ x: left,
32
+ y: top,
33
+ width: right - left,
34
+ height: bottom - top
35
+ };
36
+ }
37
+ function depthOf(element) {
38
+ let depth = 0;
39
+ for (let parent = element.parentElement; parent; parent = parent.parentElement) depth++;
40
+ return depth;
41
+ }
42
+ function isVisible(element) {
43
+ return element.checkVisibility({
44
+ opacityProperty: true,
45
+ visibilityProperty: true
46
+ });
47
+ }
48
+ function inheritsSyncedMode(element) {
49
+ return ["synced", "reference"].includes(element.closest("[data-camox-overlay-mode]")?.getAttribute("data-camox-overlay-mode") ?? "");
50
+ }
51
+ function rawStateOf({ target, item }) {
52
+ if (item) return {
53
+ hovered: item.hovered,
54
+ focused: item.focused,
55
+ hoverGroup: item.hoverGroup,
56
+ synced: item.synced || inheritsSyncedMode(target.element)
57
+ };
58
+ return {
59
+ hovered: target.element.hasAttribute("data-camox-hovered"),
60
+ focused: target.element.hasAttribute("data-camox-focused"),
61
+ hoverGroup: null,
62
+ synced: inheritsSyncedMode(target.element)
63
+ };
64
+ }
65
+ function measureElement(element) {
66
+ const stringField = element.hasAttribute("data-camox-field-id") && !element.hasAttribute("data-camox-field-type");
67
+ const inline = stringField || element.localName === "svg" && element.getAttribute("data-camox-field-type") === "icon";
68
+ const bounds = rectOf(element.getBoundingClientRect());
69
+ const rects = stringField ? Array.from(element.getClientRects(), rectOf) : [bounds];
70
+ return {
71
+ depth: depthOf(element),
72
+ target: {
73
+ element,
74
+ bounds,
75
+ rects: rects.filter(hasArea),
76
+ visible: isVisible(element),
77
+ inline,
78
+ insertion: readBlockInsertion(element),
79
+ hovered: false,
80
+ focused: false,
81
+ synced: false
82
+ }
83
+ };
84
+ }
85
+ function measureItem(item, elements) {
86
+ const rects = Array.from(item.fragment.getClientRects(), rectOf).filter(hasArea);
87
+ return {
88
+ item,
89
+ depth: Math.min(...elements.map(depthOf)) - 1 / (item.nesting + 2),
90
+ target: {
91
+ element: elements[0],
92
+ item: {
93
+ blockId: item.blockId,
94
+ itemId: item.itemId
95
+ },
96
+ bounds: rects.length > 0 ? unionOf(rects) : rectOf(elements[0].getBoundingClientRect()),
97
+ rects,
98
+ visible: elements.some(isVisible),
99
+ inline: false,
100
+ hovered: false,
101
+ focused: false,
102
+ synced: false
103
+ }
104
+ };
105
+ }
106
+ function sameRect(a, b) {
107
+ return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;
108
+ }
109
+ function sameInsertion(a, b) {
110
+ if (!a || !b) return a === b;
111
+ return a.position === b.position && a.before === b.before && a.after === b.after && (a.afterPosition ?? null) === (b.afterPosition ?? null);
112
+ }
113
+ /** Whether a measurement found every target where it already was. */
114
+ function sameGeometry(previous, next) {
115
+ if (previous.length !== next.length) return false;
116
+ return next.every(({ target, depth, item }, index) => {
117
+ const before = previous[index];
118
+ return before.target.element === target.element && before.item === item && before.depth === depth && before.target.visible === target.visible && before.target.inline === target.inline && sameRect(before.target.bounds, target.bounds) && before.target.rects.length === target.rects.length && before.target.rects.every((rect, rectIndex) => sameRect(rect, target.rects[rectIndex])) && sameInsertion(before.target.insertion, target.insertion);
119
+ });
120
+ }
121
+ const isInlineStyleChange = (mutation) => mutation.type === "attributes" && mutation.attributeName === "style";
122
+ /**
123
+ * Animations rewrite inline styles every frame. Batches of only those measure at
124
+ * most this often, and always once more after the last one.
125
+ */
126
+ const INLINE_STYLE_MEASURE_INTERVAL = 100;
127
+ /**
128
+ * Coordinates stay in the non-scrolling iframe's viewport. The canvas camera
129
+ * transforms the iframe and its overlay layer together, without remeasurement.
130
+ * This owns highlight arbitration as well as its mutation observer.
131
+ */
132
+ function observeCanvasOverlays(document, onChange) {
133
+ let entries = [];
134
+ let targets = [];
135
+ let stopped = false;
136
+ let frame;
137
+ const window = document.defaultView;
138
+ const publish = (force) => {
139
+ const states = entries.map(rawStateOf);
140
+ const candidates = entries.flatMap((entry, index) => entry.target.visible ? [{
141
+ index,
142
+ depth: entry.depth,
143
+ ...states[index]
144
+ }] : []);
145
+ const winners = resolveOverlayHighlights(candidates);
146
+ const hovered = new Set(Array.from(winners.hovered, ({ index }) => index));
147
+ const focused = new Set(Array.from(winners.focused, ({ index }) => index));
148
+ let changed = force;
149
+ const next = entries.map((entry, index) => {
150
+ const state = {
151
+ hovered: hovered.has(index),
152
+ focused: focused.has(index),
153
+ synced: states[index].synced
154
+ };
155
+ const previous = force ? entry.target : targets[index];
156
+ if (!force && state.hovered === previous.hovered && state.focused === previous.focused && state.synced === previous.synced) return previous;
157
+ changed = true;
158
+ return {
159
+ ...entry.target,
160
+ ...state
161
+ };
162
+ });
163
+ if (!changed) return;
164
+ targets = next;
165
+ onChange(targets);
166
+ };
167
+ const measureAll = () => {
168
+ frame = void 0;
169
+ if (stopped) return;
170
+ const measured = Array.from(document.querySelectorAll(targetSelector), measureElement);
171
+ for (const [item, elements] of repeatableItemElements(document)) if (elements.length > 0) measured.push(measureItem(item, elements));
172
+ if (sameGeometry(entries, measured)) {
173
+ publish(false);
174
+ return;
175
+ }
176
+ entries = measured;
177
+ publish(true);
178
+ };
179
+ let styleTimer;
180
+ const scheduleStyleMeasurement = () => {
181
+ if (stopped || styleTimer !== void 0) return;
182
+ if (!window) {
183
+ scheduleMeasurement();
184
+ return;
185
+ }
186
+ styleTimer = window.setTimeout(() => {
187
+ styleTimer = void 0;
188
+ scheduleMeasurement();
189
+ }, INLINE_STYLE_MEASURE_INTERVAL);
190
+ };
191
+ const scheduleMeasurement = () => {
192
+ if (stopped || frame !== void 0) return;
193
+ if (!window) {
194
+ measureAll();
195
+ return;
196
+ }
197
+ frame = window.requestAnimationFrame(measureAll);
198
+ };
199
+ const Observer = document.defaultView?.MutationObserver;
200
+ const observer = Observer ? new Observer((mutations) => {
201
+ if (stopped) return;
202
+ if (mutations.some((mutation) => !isInlineStyleChange(mutation) && (mutation.type !== "attributes" || !stateAttributes.has(mutation.attributeName ?? "")))) {
203
+ scheduleMeasurement();
204
+ return;
205
+ }
206
+ if (mutations.some(isInlineStyleChange)) scheduleStyleMeasurement();
207
+ if (mutations.some((mutation) => !isInlineStyleChange(mutation))) publish(false);
208
+ }) : void 0;
209
+ observer?.observe(document, {
210
+ subtree: true,
211
+ childList: true,
212
+ characterData: true,
213
+ attributes: true
214
+ });
215
+ const unsubscribeItems = subscribeRepeatableItems(document, (kind) => {
216
+ if (stopped) return;
217
+ if (kind === "content") scheduleMeasurement();
218
+ else publish(false);
219
+ });
220
+ document.addEventListener("load", scheduleMeasurement, true);
221
+ document.addEventListener("error", scheduleMeasurement, true);
222
+ document.fonts?.addEventListener("loadingdone", scheduleMeasurement);
223
+ document.fonts?.ready.then(scheduleMeasurement);
224
+ scheduleMeasurement();
225
+ return () => {
226
+ stopped = true;
227
+ if (frame !== void 0) window?.cancelAnimationFrame(frame);
228
+ if (styleTimer !== void 0) window?.clearTimeout(styleTimer);
229
+ observer?.disconnect();
230
+ unsubscribeItems();
231
+ document.removeEventListener("load", scheduleMeasurement, true);
232
+ document.removeEventListener("error", scheduleMeasurement, true);
233
+ document.fonts?.removeEventListener("loadingdone", scheduleMeasurement);
234
+ entries = [];
235
+ targets = [];
236
+ };
237
+ }
238
+
239
+ //#endregion
240
+ export { observeCanvasOverlays };
@@ -0,0 +1,79 @@
1
+ import { UNNAMED_DEFAULT_LOCALE, localizedPath } from "../../lib/locale-path.js";
2
+ import { getPageDestinations } from "../../core/pageDestinations.js";
3
+
4
+ //#region src/features/canvas/canvasPages.ts
5
+ /** The page row a curated page edits. */
6
+ function canvasPageId(page) {
7
+ return page?.kind === "curated" ? page.pageId : void 0;
8
+ }
9
+ /** The layout a layout page edits, singleton or derived. */
10
+ function canvasLayoutId(page) {
11
+ return page && page.kind !== "curated" ? page.layoutId : void 0;
12
+ }
13
+ /** The derived layout a derived page's frame must render. */
14
+ function derivedLayoutIdOf(page) {
15
+ return page?.kind === "derived" ? page.layoutId : void 0;
16
+ }
17
+ /** A Page's path, or its route pattern while a derived page has no path yet. */
18
+ function canvasPagePath(page) {
19
+ return page.pathname ?? (page.kind === "derived" ? page.pattern : null);
20
+ }
21
+ const CANVAS_DEVICES = {
22
+ desktop: {
23
+ label: "Desktop",
24
+ width: 1366,
25
+ height: 900
26
+ },
27
+ tablet: {
28
+ label: "Tablet",
29
+ width: 768,
30
+ height: 1024
31
+ },
32
+ mobile: {
33
+ label: "Mobile",
34
+ width: 390,
35
+ height: 844
36
+ }
37
+ };
38
+ /**
39
+ * Concrete pages plus one frame per derived layout, never every generated URL.
40
+ * A derived frame previews its layout's first discovered page until a path is chosen.
41
+ * Paths are runtime paths in `locale`, under its prefix; `pages` are its localizations, and
42
+ * `discoveredPaths` the paths route discovery found in it, after its prefix.
43
+ */
44
+ function getCanvasPages(pages, layouts, discoveredPaths, locale = UNNAMED_DEFAULT_LOCALE) {
45
+ const inLocale = (path) => localizedPath(path, locale);
46
+ const discoveredPathIn = (layoutId) => {
47
+ const path = discoveredPaths?.get(layoutId);
48
+ return path ? inLocale(path) : null;
49
+ };
50
+ const concrete = getPageDestinations(pages, layouts).map((page) => page.kind === "curated" ? {
51
+ kind: "curated",
52
+ key: page.key,
53
+ title: page.title,
54
+ pathname: inLocale(page.fullPath),
55
+ pageId: page.pageId
56
+ } : {
57
+ kind: "singleton",
58
+ key: page.key,
59
+ title: page.title,
60
+ pathname: inLocale(page.fullPath),
61
+ layoutId: page.layoutId
62
+ });
63
+ const derivedLayouts = layouts.filter((layout) => layout._internal.kind === "derived").map(({ _internal: layout }) => {
64
+ const segments = layout.id.split(".");
65
+ const pattern = `/${segments.map((part) => part.startsWith("$") ? `:${part.slice(1)}` : encodeURIComponent(part)).join("/")}`;
66
+ return {
67
+ kind: "derived",
68
+ key: `derived:${layout.id}`,
69
+ title: layout.title,
70
+ pathname: segments.some((part) => part.startsWith("$")) ? discoveredPathIn(layout.id) : inLocale(pattern),
71
+ layoutId: layout.id,
72
+ pattern
73
+ };
74
+ });
75
+ return [...concrete, ...derivedLayouts];
76
+ }
77
+
78
+ //#endregion
79
+ export { CANVAS_DEVICES, canvasLayoutId, canvasPageId, canvasPagePath, derivedLayoutIdOf, getCanvasPages };
@@ -0,0 +1,26 @@
1
+ //#region src/features/canvas/canvasScreenSpace.ts
2
+ /**
3
+ * CSS projections from Canvas world space to the workspace's screen space,
4
+ * driven by the camera's CSS variables so overlays never rerender on pan/zoom.
5
+ * Fallbacks match the overview before the camera has mounted.
6
+ */
7
+ const CANVAS_X = "var(--canvas-x, 64px)";
8
+ const CANVAS_Y = "var(--canvas-y, 112px)";
9
+ const CANVAS_ZOOM = "var(--canvas-zoom, .4)";
10
+ /** Places and scales the world-space row. */
11
+ const CANVAS_WORLD_TRANSFORM = `translate(${CANVAS_X}, ${CANVAS_Y}) scale(${CANVAS_ZOOM})`;
12
+ /** Screen x of a world x. */
13
+ function canvasScreenX(worldX) {
14
+ return `calc(${CANVAS_X} + ${worldX}px * ${CANVAS_ZOOM})`;
15
+ }
16
+ /** Screen y a constant on-screen distance above the top of the row, e.g. for headers. */
17
+ function canvasScreenAbove(distance) {
18
+ return `calc(${CANVAS_Y} - ${distance}px)`;
19
+ }
20
+ /** On-screen length of a world length. */
21
+ function canvasScreenLength(worldLength) {
22
+ return `calc(${worldLength}px * ${CANVAS_ZOOM})`;
23
+ }
24
+
25
+ //#endregion
26
+ export { CANVAS_WORLD_TRANSFORM, canvasScreenAbove, canvasScreenLength, canvasScreenX };
@@ -0,0 +1,18 @@
1
+ import { parseLocalePath } from "../../lib/locale-path.js";
2
+ import { matchDerivedLayout } from "../../core/derivedRoutes.js";
3
+
4
+ //#region src/features/canvas/canvasSelection.ts
5
+ /**
6
+ * The Page a runtime path selects. With the scope's `locales`, derived routes match the path
7
+ * after its locale's prefix, as the runtime matches them.
8
+ */
9
+ function selectedCanvasPage(pages, layouts, pathname, locales) {
10
+ const concrete = pages.find((page) => page.kind !== "derived" && page.pathname === pathname);
11
+ if (concrete) return concrete;
12
+ const path = locales ? parseLocalePath(pathname, locales).path : pathname;
13
+ const derivedLayoutId = matchDerivedLayout(layouts, path)?.layout._internal.id;
14
+ return pages.find((page) => page.kind === "derived" && page.layoutId === derivedLayoutId);
15
+ }
16
+
17
+ //#endregion
18
+ export { selectedCanvasPage };