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
@@ -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 };