camox 0.44.0 → 0.46.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 (407) 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 +1401 -0
  68. package/dist/features/canvas/CanvasLoadingScreen.js +35 -0
  69. package/dist/features/canvas/CanvasOverlays.js +254 -0
  70. package/dist/features/canvas/CanvasPageEdge.js +87 -0
  71. package/dist/features/canvas/CanvasPageFrame.js +333 -0
  72. package/dist/features/canvas/CanvasPageHeader.js +125 -0
  73. package/dist/features/canvas/CanvasPreviewPageSlot.js +123 -0
  74. package/dist/features/canvas/DerivedPagePathInput.js +238 -0
  75. package/dist/features/canvas/canvasCamera.js +229 -0
  76. package/dist/features/canvas/canvasFlight.js +104 -0
  77. package/dist/features/canvas/canvasFrameCapture.js +364 -0
  78. package/dist/features/canvas/canvasFrameDocument.js +302 -0
  79. package/dist/features/canvas/canvasFrameMode.js +53 -0
  80. package/dist/features/canvas/canvasInsertionSeams.js +44 -0
  81. package/dist/features/canvas/canvasItems.js +30 -0
  82. package/dist/features/canvas/canvasOverlayGeometry.js +240 -0
  83. package/dist/features/canvas/canvasPages.js +79 -0
  84. package/dist/features/canvas/canvasScreenSpace.js +26 -0
  85. package/dist/features/canvas/canvasSelection.js +18 -0
  86. package/dist/features/canvas/canvasStore.js +60 -0
  87. package/dist/features/canvas/canvasThumbnails.js +304 -0
  88. package/dist/features/canvas/canvasZoom.js +10 -0
  89. package/dist/features/canvas/sidebar/CanvasInspector.js +202 -0
  90. package/dist/features/canvas/sidebar/CanvasNavigator.js +124 -0
  91. package/dist/features/canvas/sidebar/CanvasSidebar.js +54 -0
  92. package/dist/features/canvas/sidebar/CanvasSidebarFrame.js +48 -0
  93. package/dist/features/canvas/sidebar/CanvasSidebarSkeleton.js +39 -0
  94. package/dist/features/canvas/sidebar/CuratedPageInspector.js +69 -0
  95. package/dist/features/canvas/sidebar/DerivedPageInspector.js +37 -0
  96. package/dist/features/canvas/sidebar/LayoutPageBlocks.js +78 -0
  97. package/dist/features/canvas/sidebar/LayoutPageOverview.js +71 -0
  98. package/dist/features/canvas/sidebar/PageInspector.js +157 -0
  99. package/dist/features/canvas/sidebar/PageInspectorSkeleton.js +90 -0
  100. package/dist/features/canvas/sidebar/PageOverview.js +27 -0
  101. package/dist/features/canvas/sidebar/SingletonPageInspector.js +31 -0
  102. package/dist/features/canvas/useCanvasCamera.js +783 -0
  103. package/dist/features/canvas/useCanvasFrame.js +148 -0
  104. package/dist/features/canvas/useCanvasFrameInput.js +97 -0
  105. package/dist/features/canvas/useCanvasNearness.js +57 -0
  106. package/dist/features/canvas/useDiscoveredPreviewPaths.js +62 -0
  107. package/dist/features/content/CamoxContent.d.ts +2 -5
  108. package/dist/features/content/CamoxContent.js +174 -271
  109. package/dist/features/content/CollectionItemSheetContext.js +106 -0
  110. package/dist/features/content/ContentAssets.js +315 -0
  111. package/dist/features/content/ContentCollection.js +663 -0
  112. package/dist/features/content/collection-form.js +58 -0
  113. package/dist/features/content/components/AssetCard.js +80 -84
  114. package/dist/features/content/components/AssetCardSkeleton.js +4 -8
  115. package/dist/features/content/components/ContentSidebar.js +129 -18
  116. package/dist/features/content/components/ContentSidebarGroup.js +37 -0
  117. package/dist/features/content/components/DeleteCollectionItemButton.js +202 -0
  118. package/dist/features/content/components/MissingFromLocale.js +282 -0
  119. package/dist/features/content/components/UploadDropZone.js +27 -31
  120. package/dist/features/content/components/UploadProgressDrawer.js +90 -98
  121. package/dist/features/navigation/navigation.d.ts +66 -20
  122. package/dist/features/navigation/navigation.js +257 -90
  123. package/dist/features/og/defaultFonts.js +8 -8
  124. package/dist/features/og/geist-variable-ttf-base64.js +1 -1
  125. package/dist/features/og/imageResponse.d.ts +8 -0
  126. package/dist/features/og/imageResponse.js +26 -0
  127. package/dist/features/page/CuratedPageContent.js +167 -0
  128. package/dist/features/page/DerivedPageContent.js +26 -30
  129. package/dist/features/page/SharedLayoutContent.js +25 -27
  130. package/dist/features/preview/CamoxPreview.d.ts +23 -61
  131. package/dist/features/preview/CamoxPreview.js +816 -537
  132. package/dist/features/preview/EditablePageContent.js +1 -1
  133. package/dist/features/preview/EditablePageExperience.js +16 -22
  134. package/dist/features/preview/components/AddBlockSheet.js +273 -0
  135. package/dist/features/preview/components/AssetFieldEditor.js +173 -154
  136. package/dist/features/preview/components/AssetLightbox.js +181 -134
  137. package/dist/features/preview/components/AssetPickerModal.js +153 -170
  138. package/dist/features/preview/components/BlockActionsPopover.js +150 -149
  139. package/dist/features/preview/components/BlockErrorBoundary.js +8 -12
  140. package/dist/features/preview/components/BlockThumbnail.js +172 -98
  141. package/dist/features/preview/components/CanvasPreview.js +243 -0
  142. package/dist/features/preview/components/CreatePageModal.js +128 -137
  143. package/dist/features/preview/components/DebouncedFieldEditor.js +29 -33
  144. package/dist/features/preview/components/DerivedLayoutDialog.js +21 -19
  145. package/dist/features/preview/components/DrillRow.js +150 -0
  146. package/dist/features/preview/components/FieldOverlayStyles.js +11 -8
  147. package/dist/features/preview/components/FieldToolbar.js +160 -110
  148. package/dist/features/preview/components/Frame.js +108 -20
  149. package/dist/features/preview/components/IconFieldEditor.js +62 -66
  150. package/dist/features/preview/components/ItemFieldsEditor.js +231 -205
  151. package/dist/features/preview/components/LinkFieldEditor.js +135 -139
  152. package/dist/features/preview/components/Metadata.js +22 -30
  153. package/dist/features/preview/components/MobilePreviewDrawer.js +89 -108
  154. package/dist/features/preview/components/MultipleAssetFieldEditor.js +334 -246
  155. package/dist/features/preview/components/OverlayTracker.js +9 -41
  156. package/dist/features/preview/components/Overlays.js +81 -69
  157. package/dist/features/preview/components/PageInfo.js +1748 -0
  158. package/dist/features/preview/components/PageInfoSkeleton.js +51 -0
  159. package/dist/features/preview/components/PageLocationFieldset.js +112 -116
  160. package/dist/features/preview/components/PageNavigatorHeader.js +24 -0
  161. package/dist/features/preview/components/PageNicknameField.js +22 -26
  162. package/dist/features/preview/components/PagePicker.js +128 -130
  163. package/dist/features/preview/components/PageTree.js +525 -532
  164. package/dist/features/preview/components/PreviewActivation.js +28 -32
  165. package/dist/features/preview/components/PreviewPanel.js +620 -319
  166. package/dist/features/preview/components/PreviewToolbar.js +105 -333
  167. package/dist/features/preview/components/RecordCard.js +80 -0
  168. package/dist/features/preview/components/RecordCombobox.js +178 -0
  169. package/dist/features/preview/components/ReferenceFieldEditor.js +149 -0
  170. package/dist/features/preview/components/ReferenceListFieldEditor.js +432 -0
  171. package/dist/features/preview/components/RemovedBlockPlaceholder.js +95 -0
  172. package/dist/features/preview/components/RepeatableItemsList.js +125 -138
  173. package/dist/features/preview/components/SelectionEditor.js +993 -0
  174. package/dist/features/preview/components/ShikiMarkdown.js +14 -18
  175. package/dist/features/preview/components/SidebarSection.js +52 -64
  176. package/dist/features/preview/components/StudioEditingFallback.js +56 -0
  177. package/dist/features/preview/components/UnlinkAssetButton.js +104 -107
  178. package/dist/features/preview/components/blockGridNavigation.js +15 -0
  179. package/dist/features/preview/components/contentFieldSchema.js +8 -0
  180. package/dist/features/preview/components/useFieldWriter.js +200 -0
  181. package/dist/features/preview/components/useRecordView.js +383 -0
  182. package/dist/features/preview/components/useRepeatableItemActions.js +35 -37
  183. package/dist/features/preview/components/useUpdateBlockPosition.js +37 -37
  184. package/dist/features/preview/editingFrame.js +197 -0
  185. package/dist/features/preview/overlayHighlights.js +17 -44
  186. package/dist/features/preview/overlayMessages.js +72 -1
  187. package/dist/features/preview/pageRecord.js +189 -0
  188. package/dist/features/preview/previewConstants.js +6 -2
  189. package/dist/features/preview/previewPageFrame.js +95 -0
  190. package/dist/features/preview/previewPreparation.js +7 -0
  191. package/dist/features/preview/previewSelection.js +32 -63
  192. package/dist/features/preview/previewStore.js +225 -123
  193. package/dist/features/preview/referencePickerFocus.js +29 -0
  194. package/dist/features/preview/repeatableItemTargets.js +56 -0
  195. package/dist/features/preview/selectionReveal.js +21 -0
  196. package/dist/features/preview/usePreviewViewportActions.js +114 -0
  197. package/dist/features/preview/viewportContinuity.js +109 -0
  198. package/dist/features/provider/AuthenticatedCamoxProvider.js +69 -44
  199. package/dist/features/provider/CamoxProvider.d.ts +3 -6
  200. package/dist/features/provider/CamoxProvider.js +38 -50
  201. package/dist/features/provider/CoreCamoxProvider.js +69 -50
  202. package/dist/features/provider/LocalhostPreviewProvider.js +78 -114
  203. package/dist/features/provider/PreviewSignInPage.js +54 -0
  204. package/dist/features/provider/components/CamoxAppContext.js +11 -11
  205. package/dist/features/provider/components/CommandPalette.js +75 -82
  206. package/dist/features/provider/useAdminShortcuts.js +7 -11
  207. package/dist/features/routes/pageRuntime.d.ts +44 -4
  208. package/dist/features/routes/pageRuntime.js +244 -137
  209. package/dist/features/runtime/RuntimeChrome.js +117 -115
  210. package/dist/features/runtime/alternates.js +64 -0
  211. package/dist/features/runtime/analytics.d.ts +7 -0
  212. package/dist/features/runtime/analytics.js +66 -0
  213. package/dist/features/runtime/artifactSources.js +87 -0
  214. package/dist/features/runtime/editingFallback.js +20 -0
  215. package/dist/features/runtime/linkPrefetch.js +97 -0
  216. package/dist/features/runtime/livePages.js +62 -0
  217. package/dist/features/runtime/llmsTxt.js +40 -0
  218. package/dist/features/runtime/loopbackFetch.js +18 -0
  219. package/dist/features/runtime/navigationAccessibility.js +51 -0
  220. package/dist/features/runtime/navigationTarget.js +23 -2
  221. package/dist/features/runtime/pageApp.js +229 -158
  222. package/dist/features/runtime/pageBlockTypes.js +20 -0
  223. package/dist/features/runtime/pageClient.d.ts +2 -4
  224. package/dist/features/runtime/pageClient.js +18 -3
  225. package/dist/features/runtime/pageNavigation.js +254 -32
  226. package/dist/features/runtime/pageServer.d.ts +2 -4
  227. package/dist/features/runtime/pageServer.js +6 -2
  228. package/dist/features/runtime/pageViewport.js +7 -0
  229. package/dist/features/runtime/runtime.d.ts +54 -24
  230. package/dist/features/runtime/runtime.js +766 -191
  231. package/dist/features/runtime/runtimeChromeLoader.js +58 -0
  232. package/dist/features/runtime/runtimeRoutes.d.ts +19 -0
  233. package/dist/features/runtime/runtimeRoutes.js +25 -0
  234. package/dist/features/runtime/scrollRestoration.js +133 -0
  235. package/dist/features/runtime/studioApp.d.ts +4 -3
  236. package/dist/features/runtime/studioApp.js +5 -9
  237. package/dist/features/runtime/studioClient.d.ts +2 -4
  238. package/dist/features/runtime/studioClient.js +12 -3
  239. package/dist/features/runtime/studioServer.d.ts +2 -4
  240. package/dist/features/runtime/studioServer.js +6 -1
  241. package/dist/features/runtime/worker.d.ts +6 -0
  242. package/dist/features/runtime/worker.js +23 -0
  243. package/dist/features/runtime/workerRequest.js +44 -0
  244. package/dist/features/studio/CamoxStudio.d.ts +2 -6
  245. package/dist/features/studio/CamoxStudio.js +34 -49
  246. package/dist/features/studio/FollowAgentProvider.js +327 -0
  247. package/dist/features/studio/components/ChatSidebar.js +356 -0
  248. package/dist/features/studio/components/DraftsControl.js +676 -0
  249. package/dist/features/studio/components/FaviconDialog.js +318 -0
  250. package/dist/features/studio/components/LocalePicker.js +785 -0
  251. package/dist/features/studio/components/Navbar.js +123 -103
  252. package/dist/features/studio/components/ProjectMenu.js +239 -260
  253. package/dist/features/studio/components/RenameDraftDialog.js +206 -0
  254. package/dist/features/studio/components/ReviewDraftSheet.js +1472 -0
  255. package/dist/features/studio/components/ThreadComposer.js +157 -0
  256. package/dist/features/studio/components/ThreadMarkdown.js +113 -0
  257. package/dist/features/studio/components/ThreadMessages.js +270 -0
  258. package/dist/features/studio/components/UserButton.js +34 -23
  259. package/dist/features/studio/draftLabel.js +33 -0
  260. package/dist/features/studio/draftNotice.js +13 -0
  261. package/dist/features/studio/followAgent.js +241 -0
  262. package/dist/features/studio/followAgentContext.js +7 -0
  263. package/dist/features/studio/localeOptions.js +118 -0
  264. package/dist/features/studio/localeSwitch.js +19 -0
  265. package/dist/features/studio/routes.js +26 -1
  266. package/dist/features/studio/studioStore.js +64 -1
  267. package/dist/features/studio/useTheme.js +24 -27
  268. package/dist/features/vite/artifactRuntimeMinification.js +36 -0
  269. package/dist/features/vite/blockBoilerplate.js +6 -5
  270. package/dist/features/vite/blockChunks.js +31 -0
  271. package/dist/features/vite/bundlerLogs.js +17 -0
  272. package/dist/features/vite/definitionsSync.js +158 -226
  273. package/dist/features/vite/devAuthentication.js +4 -16
  274. package/dist/features/vite/devSignIn.js +87 -0
  275. package/dist/features/vite/iconGeneration.js +1 -1
  276. package/dist/features/vite/layoutGeneration.js +11 -1
  277. package/dist/features/vite/publishSeededContent.js +30 -0
  278. package/dist/features/vite/routeGeneration.js +6 -7
  279. package/dist/features/vite/runtimeDev.js +80 -99
  280. package/dist/features/vite/vite.d.ts +51 -31
  281. package/dist/features/vite/vite.js +224 -127
  282. package/dist/features/vite/workerBuild.js +39 -0
  283. package/dist/hooks/use-debounced-field.js +116 -47
  284. package/dist/hooks/use-file-upload.js +114 -67
  285. package/dist/hooks/use-marquee-selection.js +32 -36
  286. package/dist/hooks/use-page-destinations.js +69 -37
  287. package/dist/lib/api-client-server.d.ts +5 -0
  288. package/dist/lib/api-client-server.js +10 -4
  289. package/dist/lib/api-client.d.ts +6 -0
  290. package/dist/lib/api-client.js +51 -16
  291. package/dist/lib/api-socket.js +17 -0
  292. package/dist/lib/auth-page-styles.js +39 -0
  293. package/dist/lib/auth.js +129 -61
  294. package/dist/lib/collection-cache.js +23 -0
  295. package/dist/lib/draft-scope.d.ts +4 -0
  296. package/dist/lib/draft-scope.js +222 -0
  297. package/dist/lib/html.js +12 -0
  298. package/dist/lib/link-pages.js +154 -0
  299. package/dist/lib/locale-path.d.ts +22 -0
  300. package/dist/lib/locale-path.js +57 -0
  301. package/dist/lib/normalized-data.js +252 -152
  302. package/dist/lib/preview-handoff.js +2 -2
  303. package/dist/lib/queries.d.ts +11 -0
  304. package/dist/lib/queries.js +70 -141
  305. package/dist/lib/studio-reads.d.ts +14 -0
  306. package/dist/lib/studio-reads.js +554 -0
  307. package/dist/lib/use-project-room.js +50 -50
  308. package/dist/lib/use-thread.js +310 -0
  309. package/dist/lib/utils.js +25 -29
  310. package/dist/lib/view-locale-context.js +22 -0
  311. package/dist/lib/view-locale.js +46 -0
  312. package/dist/package.js +5 -0
  313. package/dist/studio-overlays.css +41 -151
  314. package/dist/studio.css +2 -2
  315. package/package.json +70 -73
  316. package/skills/camox/SKILL.md +16 -11
  317. package/skills/camox/references/artifacts.md +179 -0
  318. package/skills/camox/references/block-definitions.md +75 -59
  319. package/skills/camox/references/cli-common.md +9 -11
  320. package/skills/camox/references/cli-content.md +92 -69
  321. package/skills/camox/references/cli-publishing.md +26 -0
  322. package/skills/camox/references/dom-integrations.md +27 -0
  323. package/skills/camox/references/field-styling.md +4 -4
  324. package/skills/camox/references/layout-definitions.md +16 -14
  325. package/skills/camox/references/localization.md +56 -0
  326. package/skills/camox/references/routed-layouts.md +133 -15
  327. package/skills/camox-expand/SKILL.md +70 -0
  328. package/skills/camox-expand/references/jobs.md +39 -0
  329. package/skills/camoxify/SKILL.md +29 -7
  330. package/dist/core/components/AddBlockControlBar.js +0 -78
  331. package/dist/core/hooks/useRequireDraftSource.js +0 -23
  332. package/dist/features/metadata/sitemap.d.ts +0 -8
  333. package/dist/features/metadata/sitemap.js +0 -17
  334. package/dist/features/og/imageResponse.node.d.ts +0 -12
  335. package/dist/features/og/imageResponse.node.js +0 -49
  336. package/dist/features/og/imageResponse.workerd.d.ts +0 -12
  337. package/dist/features/og/imageResponse.workerd.js +0 -40
  338. package/dist/features/page/PublishedPageContent.js +0 -205
  339. package/dist/features/page/PublishedPageExperience.js +0 -23
  340. package/dist/features/preview/DerivedPreview.js +0 -134
  341. package/dist/features/preview/commentsEnabled.js +0 -8
  342. package/dist/features/preview/components/AddBlockSidebar.js +0 -381
  343. package/dist/features/preview/components/AttachedComments.js +0 -331
  344. package/dist/features/preview/components/CommentHeader.js +0 -122
  345. package/dist/features/preview/components/CommentSidebar.js +0 -29
  346. package/dist/features/preview/components/CommentTargetQuote.js +0 -167
  347. package/dist/features/preview/components/DerivedLayoutSidebar.d.ts +0 -5
  348. package/dist/features/preview/components/DerivedLayoutSidebar.js +0 -179
  349. package/dist/features/preview/components/DerivedPageInfoSidebar.js +0 -69
  350. package/dist/features/preview/components/LeftSidebar.js +0 -68
  351. package/dist/features/preview/components/PageEditorSidebar.js +0 -563
  352. package/dist/features/preview/components/PageInfoSidebar.js +0 -1551
  353. package/dist/features/preview/components/PageNavigatorSidebar.js +0 -78
  354. package/dist/features/preview/components/PageStatusBadge.js +0 -97
  355. package/dist/features/preview/components/PeekedBlock.js +0 -217
  356. package/dist/features/preview/components/PreviewComments.js +0 -56
  357. package/dist/features/preview/components/PreviewToolbarSpacer.js +0 -43
  358. package/dist/features/preview/components/PublicationRow.js +0 -422
  359. package/dist/features/preview/components/PublishDialog.js +0 -194
  360. package/dist/features/preview/components/RightSidebar.js +0 -59
  361. package/dist/features/preview/components/SendFeedbackDialog.js +0 -83
  362. package/dist/features/preview/previewCommentsStore.js +0 -135
  363. package/dist/features/preview/publication.js +0 -81
  364. package/dist/features/preview/usePageComments.js +0 -39
  365. package/dist/features/runtime/SharedChromeContext.js +0 -7
  366. package/dist/features/studio/components/EnvironmentMenu.js +0 -425
  367. package/dist/features/vite/appGeneration.js +0 -89
  368. package/dist/lib/view-queries.js +0 -28
  369. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/Matches.d.ts +0 -114
  370. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/RouterProvider.d.ts +0 -25
  371. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/config.d.ts +0 -1
  372. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/defer.d.ts +0 -1
  373. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/fileRoute.d.ts +0 -20
  374. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/global.d.ts +0 -8
  375. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/hash-scroll.d.ts +0 -1
  376. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/index.d.ts +0 -18
  377. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/link.d.ts +0 -161
  378. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/load-matches.d.ts +0 -6
  379. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/location.d.ts +0 -54
  380. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/lru-cache.d.ts +0 -8
  381. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/manifest.d.ts +0 -32
  382. 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
  383. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/not-found.d.ts +0 -1
  384. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/redirect.d.ts +0 -49
  385. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/rewrite.d.ts +0 -1
  386. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/root.d.ts +0 -6
  387. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/route.d.ts +0 -343
  388. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/routeInfo.d.ts +0 -48
  389. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/router.d.ts +0 -695
  390. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/scroll-restoration.d.ts +0 -1
  391. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchMiddleware.d.ts +0 -1
  392. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchParams.d.ts +0 -5
  393. 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
  394. 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
  395. 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
  396. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/stores.d.ts +0 -69
  397. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/structuralSharing.d.ts +0 -1
  398. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/typePrimitives.d.ts +0 -1
  399. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderData.d.ts +0 -1
  400. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderDeps.d.ts +0 -1
  401. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useNavigate.d.ts +0 -10
  402. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useParams.d.ts +0 -1
  403. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useRouteContext.d.ts +0 -1
  404. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useSearch.d.ts +0 -1
  405. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/utils.d.ts +0 -28
  406. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/validators.d.ts +0 -49
  407. 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,30 @@
1
+ import { CANVAS_DEVICES } from "./canvasPages.js";
2
+
3
+ //#region src/features/canvas/canvasItems.ts
4
+ const CANVAS_ITEM_GAP = 240;
5
+ const CANVAS_SLOT_WIDTH = CANVAS_DEVICES.desktop.width;
6
+ /**
7
+ * World-space positions of the Canvas row, matching its flex layout: every Page
8
+ * side by side, in Canvas order.
9
+ */
10
+ function positionCanvasPages(pages) {
11
+ return {
12
+ items: pages.map((page, index) => ({
13
+ key: page.key,
14
+ page,
15
+ left: index * (CANVAS_SLOT_WIDTH + 240),
16
+ width: CANVAS_SLOT_WIDTH
17
+ })),
18
+ width: Math.max(0, pages.length * (CANVAS_SLOT_WIDTH + 240) - 240)
19
+ };
20
+ }
21
+ function canvasSnapTargets(items) {
22
+ return items.map(({ key, left, width }) => ({
23
+ key,
24
+ left,
25
+ width
26
+ }));
27
+ }
28
+
29
+ //#endregion
30
+ export { CANVAS_SLOT_WIDTH, canvasSnapTargets, positionCanvasPages };
@@ -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 };
@@ -0,0 +1,60 @@
1
+ import { createStore } from "@xstate/store";
2
+
3
+ //#region src/features/canvas/canvasStore.ts
4
+ /**
5
+ * What each workspace shows, for the Studio session: it outlives the Canvas, so leaving the
6
+ * Website Section or switching drafts or locales, which mount it afresh, lands where it was.
7
+ */
8
+ const canvasStore = createStore({
9
+ context: {
10
+ views: {},
11
+ /** Workspaces whose camera is moving, until it has been still for a moment. */
12
+ moving: {},
13
+ /** Counts requests to zoom out to the whole Canvas; a mounted Canvas answers each new one. */
14
+ overviewRequests: 0
15
+ },
16
+ on: {
17
+ reset: () => ({
18
+ views: {},
19
+ moving: {},
20
+ overviewRequests: 0
21
+ }),
22
+ requestOverview: (context) => ({
23
+ ...context,
24
+ overviewRequests: context.overviewRequests + 1
25
+ }),
26
+ setCameraMoving: (context, event) => {
27
+ if (!!context.moving[event.workspaceKey] === event.moving) return context;
28
+ return {
29
+ ...context,
30
+ moving: {
31
+ ...context.moving,
32
+ [event.workspaceKey]: event.moving
33
+ }
34
+ };
35
+ },
36
+ rememberView: (context, event) => {
37
+ const previous = context.views[event.workspaceKey];
38
+ const { camera, fitted } = event.view;
39
+ const { x, y, scale } = camera;
40
+ if (previous?.camera.x === x && previous.camera.y === y && previous.camera.scale === scale && previous.fitted === fitted) return context;
41
+ return {
42
+ ...context,
43
+ views: {
44
+ ...context.views,
45
+ [event.workspaceKey]: {
46
+ camera: {
47
+ x,
48
+ y,
49
+ scale
50
+ },
51
+ fitted
52
+ }
53
+ }
54
+ };
55
+ }
56
+ }
57
+ });
58
+
59
+ //#endregion
60
+ export { canvasStore };