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,1401 @@
1
+ import { useAuthContext, useProjectUuid } from "../../lib/auth.js";
2
+ import { parseLocalePath } from "../../lib/locale-path.js";
3
+ import { useOptionalDraftScope } from "../../lib/draft-scope.js";
4
+ import { useViewLocale } from "../../lib/view-locale-context.js";
5
+ import { NavigationProvider, useLocation, useNavigate } from "../navigation/navigation.js";
6
+ import { useCamoxApp } from "../provider/components/CamoxAppContext.js";
7
+ import { reads, useReadQuery, useStudioCache } from "../../lib/studio-reads.js";
8
+ import { pageMutations } from "../../lib/queries.js";
9
+ import { useLocalizedPath } from "../../lib/view-locale.js";
10
+ import { canvasStore } from "./canvasStore.js";
11
+ import { STUDIO_CANVAS_PATH } from "../studio/routes.js";
12
+ import { previewStore } from "../preview/previewStore.js";
13
+ import { PREVIEW_PAGE_SLOT_ATTRIBUTE, PreviewPageFrameContext } from "../preview/previewPageFrame.js";
14
+ import { PreviewPreparationContext } from "../preview/previewPreparation.js";
15
+ import { canvasBlockOverlap } from "./canvasFrameDocument.js";
16
+ import { CanvasWorkspaceContext } from "./canvasZoom.js";
17
+ import { PageRecordContext, getPageRecord } from "../preview/pageRecord.js";
18
+ import { CuratedBlockShortcuts } from "../preview/components/PreviewPanel.js";
19
+ import { FollowAgentContext } from "../studio/followAgentContext.js";
20
+ import { useCanvasFrameMode } from "./canvasFrameMode.js";
21
+ import { CANVAS_DEVICES, canvasLayoutId, canvasPageId, derivedLayoutIdOf, getCanvasPages } from "./canvasPages.js";
22
+ import { CANVAS_SLOT_WIDTH, canvasSnapTargets, positionCanvasPages } from "./canvasItems.js";
23
+ import { CanvasOverlaysShownContext } from "./CanvasOverlays.js";
24
+ import { CanvasPageEdge } from "./CanvasPageEdge.js";
25
+ import { CANVAS_THUMBNAIL_MAX_ZOOM, CanvasThumbnailsContext, canvasThumbnailsSupported, createCanvasThumbnails, useCanvasThumbnail } from "./canvasThumbnails.js";
26
+ import { CanvasPageFrame } from "./CanvasPageFrame.js";
27
+ import { CanvasPageHeader } from "./CanvasPageHeader.js";
28
+ import { CanvasPreviewPageSlot } from "./CanvasPreviewPageSlot.js";
29
+ import { CANVAS_WORLD_TRANSFORM, canvasScreenAbove, canvasScreenLength, canvasScreenX } from "./canvasScreenSpace.js";
30
+ import { selectedCanvasPage } from "./canvasSelection.js";
31
+ import { CanvasSidebar } from "./sidebar/CanvasSidebar.js";
32
+ import { useCanvasCamera } from "./useCanvasCamera.js";
33
+ import { useCanvasNearness } from "./useCanvasNearness.js";
34
+ import { useDiscoveredPreviewPaths } from "./useDiscoveredPreviewPaths.js";
35
+ import { c } from "react/compiler-runtime";
36
+ import * as React from "react";
37
+ import { useSelector } from "@xstate/store-react";
38
+ import { jsx, jsxs } from "react/jsx-runtime";
39
+ import { useMutation, useQueryClient } from "@tanstack/react-query";
40
+ import { createStore as createStore$1 } from "@xstate/store";
41
+
42
+ //#region src/features/canvas/CamoxCanvas.tsx
43
+ function usePreparationFailure(error, t0) {
44
+ const $ = c(5);
45
+ const selected = t0 === void 0 ? true : t0;
46
+ const preparation = React.useContext(PreviewPreparationContext);
47
+ let t1;
48
+ let t2;
49
+ if ($[0] !== error || $[1] !== preparation || $[2] !== selected) {
50
+ t1 = () => {
51
+ if (error && selected) preparation?.fail(error);
52
+ };
53
+ t2 = [
54
+ error,
55
+ selected,
56
+ preparation
57
+ ];
58
+ $[0] = error;
59
+ $[1] = preparation;
60
+ $[2] = selected;
61
+ $[3] = t1;
62
+ $[4] = t2;
63
+ } else {
64
+ t1 = $[3];
65
+ t2 = $[4];
66
+ }
67
+ React.useEffect(t1, t2);
68
+ }
69
+ function PreparationFailure(t0) {
70
+ const { error, selected } = t0;
71
+ usePreparationFailure(error, selected);
72
+ return null;
73
+ }
74
+ function CanvasMessage(t0) {
75
+ const $ = c(2);
76
+ const { children } = t0;
77
+ let t1;
78
+ if ($[0] !== children) {
79
+ t1 = /* @__PURE__ */ jsx("div", {
80
+ className: "text-muted-foreground grid min-h-64 place-items-center p-8 text-center text-sm",
81
+ children
82
+ });
83
+ $[0] = children;
84
+ $[1] = t1;
85
+ } else t1 = $[1];
86
+ return t1;
87
+ }
88
+ /** A per-card error boundary, so a failing frame never takes the Canvas down. */
89
+ var CanvasFrameBoundary = class extends React.Component {
90
+ state = { error: null };
91
+ static getDerivedStateFromError(error) {
92
+ return { error };
93
+ }
94
+ render() {
95
+ if (!this.state.error) return this.props.children;
96
+ return /* @__PURE__ */ jsxs(CanvasMessage, { children: [/* @__PURE__ */ jsx(PreparationFailure, {
97
+ error: this.state.error,
98
+ selected: this.props.selected
99
+ }), /* @__PURE__ */ jsxs("div", {
100
+ role: "alert",
101
+ children: [
102
+ /* @__PURE__ */ jsx("p", { children: "This page could not be rendered." }),
103
+ /* @__PURE__ */ jsx("p", {
104
+ className: "mt-2",
105
+ children: this.state.error.message
106
+ }),
107
+ /* @__PURE__ */ jsx("button", {
108
+ className: "mt-4 underline",
109
+ onClick: () => this.setState({ error: null }),
110
+ children: "Try again"
111
+ })
112
+ ]
113
+ })] });
114
+ }
115
+ };
116
+ /**
117
+ * A Page loads its frame once it first comes near the Canvas viewport, and the
118
+ * selected Page right away, wherever the camera is. The frame then stays
119
+ * mounted, but only runs while selected and the camera is still.
120
+ *
121
+ * Zoomed out, or away from the camera, a Page shows a still image of its frame
122
+ * instead, once it has one: the frame unmounts. Its frame comes back near the
123
+ * camera when zoomed in, out of sight until it settles, so the swap doesn't show.
124
+ * Frames come and go only while the camera is still.
125
+ */
126
+ function CanvasPagePreview(props) {
127
+ const $ = c(53);
128
+ const ref = React.useRef(null);
129
+ const { near, reached } = useCanvasNearness(ref);
130
+ let t0;
131
+ if ($[0] !== near || $[1] !== props.selected) {
132
+ t0 = {
133
+ near,
134
+ selected: props.selected
135
+ };
136
+ $[0] = near;
137
+ $[1] = props.selected;
138
+ $[2] = t0;
139
+ } else t0 = $[2];
140
+ const mode = useCanvasFrameMode(t0);
141
+ const workspaceKey = React.use(CanvasWorkspaceContext)?.workspaceKey;
142
+ const draftId = useOptionalDraftScope().draftId;
143
+ const { locale } = useViewLocale();
144
+ let t1;
145
+ if ($[3] !== draftId || $[4] !== locale || $[5] !== props.derivedLayoutId || $[6] !== props.pathname || $[7] !== props.runtimeBasePath || $[8] !== props.viewport.width) {
146
+ t1 = JSON.stringify([
147
+ draftId,
148
+ locale,
149
+ props.runtimeBasePath,
150
+ props.pathname,
151
+ props.derivedLayoutId ?? null,
152
+ props.viewport.width
153
+ ]);
154
+ $[3] = draftId;
155
+ $[4] = locale;
156
+ $[5] = props.derivedLayoutId;
157
+ $[6] = props.pathname;
158
+ $[7] = props.runtimeBasePath;
159
+ $[8] = props.viewport.width;
160
+ $[9] = t1;
161
+ } else t1 = $[9];
162
+ const key = t1;
163
+ const { thumbnails, thumbnail, refreshing } = useCanvasThumbnail(key);
164
+ let t2;
165
+ if ($[10] !== thumbnails || $[11] !== workspaceKey) {
166
+ t2 = (state) => {
167
+ if (!thumbnails || workspaceKey == null) return false;
168
+ return (state.context.views[workspaceKey]?.camera.scale ?? .4) < CANVAS_THUMBNAIL_MAX_ZOOM;
169
+ };
170
+ $[10] = thumbnails;
171
+ $[11] = workspaceKey;
172
+ $[12] = t2;
173
+ } else t2 = $[12];
174
+ const zoomedOut = useSelector(canvasStore, t2);
175
+ const [loaded, setLoaded] = React.useState(false);
176
+ if ((reached || props.selected) && !loaded) setLoaded(true);
177
+ const wantsLive = props.selected || near && !zoomedOut;
178
+ const wantsFrame = loaded && (wantsLive || refreshing || !thumbnail);
179
+ const [frameShown, setFrameShown] = React.useState(false);
180
+ const [settledFrame, setSettledFrame] = React.useState(null);
181
+ const [settles, setSettles] = React.useState(0);
182
+ const [captured, setCaptured] = React.useState(0);
183
+ const captureRequested = settles > captured;
184
+ const waiting = frameShown !== wantsFrame || captureRequested;
185
+ let t3;
186
+ if ($[13] !== thumbnails || $[14] !== waiting || $[15] !== workspaceKey) {
187
+ t3 = (state_0) => !!thumbnails && waiting && workspaceKey != null && !!state_0.context.moving[workspaceKey];
188
+ $[13] = thumbnails;
189
+ $[14] = waiting;
190
+ $[15] = workspaceKey;
191
+ $[16] = t3;
192
+ } else t3 = $[16];
193
+ const moving = useSelector(canvasStore, t3);
194
+ if (frameShown !== wantsFrame && (!moving || !thumbnail)) {
195
+ setFrameShown(wantsFrame);
196
+ if (!wantsFrame) {
197
+ setSettledFrame(null);
198
+ setCaptured(settles);
199
+ }
200
+ }
201
+ const imageShown = !!thumbnail && !(frameShown && settledFrame && wantsLive);
202
+ const stale = !!thumbnail?.stale && near && !wantsLive;
203
+ let t4;
204
+ let t5;
205
+ if ($[17] !== key || $[18] !== stale || $[19] !== thumbnails) {
206
+ t4 = () => {
207
+ if (!stale || !thumbnails) return;
208
+ return thumbnails.requestRefresh(key);
209
+ };
210
+ t5 = [
211
+ stale,
212
+ thumbnails,
213
+ key
214
+ ];
215
+ $[17] = key;
216
+ $[18] = stale;
217
+ $[19] = thumbnails;
218
+ $[20] = t4;
219
+ $[21] = t5;
220
+ } else {
221
+ t4 = $[20];
222
+ t5 = $[21];
223
+ }
224
+ React.useEffect(t4, t5);
225
+ let t6;
226
+ if ($[22] === Symbol.for("react.memo_cache_sentinel")) {
227
+ t6 = (frame) => {
228
+ setSettledFrame(frame);
229
+ setSettles(_temp);
230
+ };
231
+ $[22] = t6;
232
+ } else t6 = $[22];
233
+ const onSettled = t6;
234
+ const resting = mode === "resting";
235
+ const started = React.useRef(0);
236
+ let t7;
237
+ let t8;
238
+ if ($[23] !== captureRequested || $[24] !== key || $[25] !== moving || $[26] !== props.derivedLayoutId || $[27] !== props.pageId || $[28] !== props.pathname || $[29] !== resting || $[30] !== settledFrame || $[31] !== settles || $[32] !== thumbnails) {
239
+ t7 = () => {
240
+ if (!captureRequested || moving || resting || !settledFrame || !thumbnails) return;
241
+ if (started.current >= settles) return;
242
+ const request = settles;
243
+ started.current = request;
244
+ const pixelRatio = window.devicePixelRatio;
245
+ const options = {
246
+ scale: Math.min(1, CANVAS_THUMBNAIL_MAX_ZOOM * pixelRatio),
247
+ blockOverlap: canvasBlockOverlap(CANVAS_THUMBNAIL_MAX_ZOOM, pixelRatio)
248
+ };
249
+ const tokens = [
250
+ props.pathname,
251
+ props.pageId,
252
+ props.derivedLayoutId
253
+ ].filter(_temp2);
254
+ thumbnails.capture(key, settledFrame, tokens, options).catch((error) => {
255
+ thumbnails.abandon(key);
256
+ console.warn(`[camox] Could not capture ${props.pathname} for the Canvas.`, error);
257
+ }).finally(() => setCaptured((count_0) => Math.max(count_0, request)));
258
+ };
259
+ t8 = [
260
+ captureRequested,
261
+ settles,
262
+ moving,
263
+ resting,
264
+ settledFrame,
265
+ thumbnails,
266
+ key,
267
+ props.pathname,
268
+ props.pageId,
269
+ props.derivedLayoutId
270
+ ];
271
+ $[23] = captureRequested;
272
+ $[24] = key;
273
+ $[25] = moving;
274
+ $[26] = props.derivedLayoutId;
275
+ $[27] = props.pageId;
276
+ $[28] = props.pathname;
277
+ $[29] = resting;
278
+ $[30] = settledFrame;
279
+ $[31] = settles;
280
+ $[32] = thumbnails;
281
+ $[33] = t7;
282
+ $[34] = t8;
283
+ } else {
284
+ t7 = $[33];
285
+ t8 = $[34];
286
+ }
287
+ React.useEffect(t7, t8);
288
+ const t9 = near || props.selected ? void 0 : "hidden";
289
+ let t10;
290
+ if ($[35] !== props.viewport.height || $[36] !== t9) {
291
+ t10 = {
292
+ position: "relative",
293
+ minHeight: props.viewport.height,
294
+ visibility: t9
295
+ };
296
+ $[35] = props.viewport.height;
297
+ $[36] = t9;
298
+ $[37] = t10;
299
+ } else t10 = $[37];
300
+ let t11;
301
+ if ($[38] !== frameShown || $[39] !== imageShown || $[40] !== mode || $[41] !== props || $[42] !== thumbnails) {
302
+ t11 = frameShown && /* @__PURE__ */ jsx("div", {
303
+ style: { visibility: imageShown ? "hidden" : void 0 },
304
+ children: /* @__PURE__ */ jsx(CanvasPageFrameLoader, {
305
+ ...props,
306
+ mode,
307
+ onSettled: thumbnails ? onSettled : void 0
308
+ })
309
+ });
310
+ $[38] = frameShown;
311
+ $[39] = imageShown;
312
+ $[40] = mode;
313
+ $[41] = props;
314
+ $[42] = thumbnails;
315
+ $[43] = t11;
316
+ } else t11 = $[43];
317
+ let t12;
318
+ if ($[44] !== frameShown || $[45] !== imageShown || $[46] !== props || $[47] !== thumbnail) {
319
+ t12 = imageShown && thumbnail && /* @__PURE__ */ jsx("img", {
320
+ src: thumbnail.url,
321
+ alt: "",
322
+ draggable: false,
323
+ "data-canvas-thumbnail": "",
324
+ onClick: (event) => {
325
+ if (!event.currentTarget.closest("[data-canvas-pan]")) props.onSelect();
326
+ },
327
+ style: {
328
+ display: "block",
329
+ width: thumbnail.width,
330
+ height: thumbnail.height,
331
+ ...frameShown ? {
332
+ position: "absolute",
333
+ top: 0,
334
+ left: 0
335
+ } : {}
336
+ }
337
+ });
338
+ $[44] = frameShown;
339
+ $[45] = imageShown;
340
+ $[46] = props;
341
+ $[47] = thumbnail;
342
+ $[48] = t12;
343
+ } else t12 = $[48];
344
+ let t13;
345
+ if ($[49] !== t10 || $[50] !== t11 || $[51] !== t12) {
346
+ t13 = /* @__PURE__ */ jsxs("div", {
347
+ ref,
348
+ style: t10,
349
+ children: [t11, t12]
350
+ });
351
+ $[49] = t10;
352
+ $[50] = t11;
353
+ $[51] = t12;
354
+ $[52] = t13;
355
+ } else t13 = $[52];
356
+ return t13;
357
+ }
358
+ function _temp2(token) {
359
+ return !!token;
360
+ }
361
+ function _temp(count) {
362
+ return count + 1;
363
+ }
364
+ function CanvasPageFrameLoader(t0) {
365
+ const $ = c(23);
366
+ const { pathname, runtimeBasePath, derivedLayoutId, pageId, viewport, selected, hovered, mode, onActivate, onSettled } = t0;
367
+ const projectUuid = useProjectUuid();
368
+ let t1;
369
+ if ($[0] !== derivedLayoutId || $[1] !== pathname || $[2] !== projectUuid || $[3] !== runtimeBasePath) {
370
+ t1 = reads.canvasFrame({
371
+ projectUuid,
372
+ runtimeBasePath,
373
+ pathname,
374
+ derivedLayoutId
375
+ });
376
+ $[0] = derivedLayoutId;
377
+ $[1] = pathname;
378
+ $[2] = projectUuid;
379
+ $[3] = runtimeBasePath;
380
+ $[4] = t1;
381
+ } else t1 = $[4];
382
+ const { data, error, isPending, isFetching, refetch } = useReadQuery(t1);
383
+ usePreparationFailure(isFetching ? null : error, selected);
384
+ if (isPending) {
385
+ let t2;
386
+ if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
387
+ t2 = /* @__PURE__ */ jsx(CanvasMessage, { children: /* @__PURE__ */ jsx("span", {
388
+ role: "status",
389
+ children: "Loading page…"
390
+ }) });
391
+ $[5] = t2;
392
+ } else t2 = $[5];
393
+ return t2;
394
+ }
395
+ if (error) {
396
+ let t2;
397
+ if ($[6] !== error.message) {
398
+ t2 = /* @__PURE__ */ jsx("p", { children: error.message });
399
+ $[6] = error.message;
400
+ $[7] = t2;
401
+ } else t2 = $[7];
402
+ let t3;
403
+ if ($[8] !== refetch) {
404
+ t3 = /* @__PURE__ */ jsx("button", {
405
+ className: "mt-4 underline",
406
+ onClick: () => void refetch(),
407
+ children: "Try again"
408
+ });
409
+ $[8] = refetch;
410
+ $[9] = t3;
411
+ } else t3 = $[9];
412
+ let t4;
413
+ if ($[10] !== t2 || $[11] !== t3) {
414
+ t4 = /* @__PURE__ */ jsx(CanvasMessage, { children: /* @__PURE__ */ jsxs("div", {
415
+ role: "alert",
416
+ children: [t2, t3]
417
+ }) });
418
+ $[10] = t2;
419
+ $[11] = t3;
420
+ $[12] = t4;
421
+ } else t4 = $[12];
422
+ return t4;
423
+ }
424
+ let t2;
425
+ if ($[13] !== data || $[14] !== hovered || $[15] !== mode || $[16] !== onActivate || $[17] !== onSettled || $[18] !== pageId || $[19] !== selected || $[20] !== viewport.height || $[21] !== viewport.width) {
426
+ t2 = /* @__PURE__ */ jsx(CanvasPageFrame, {
427
+ input: data,
428
+ width: viewport.width,
429
+ viewportHeight: viewport.height,
430
+ pageId,
431
+ selected,
432
+ hovered,
433
+ mode,
434
+ onActivate,
435
+ onSettled
436
+ });
437
+ $[13] = data;
438
+ $[14] = hovered;
439
+ $[15] = mode;
440
+ $[16] = onActivate;
441
+ $[17] = onSettled;
442
+ $[18] = pageId;
443
+ $[19] = selected;
444
+ $[20] = viewport.height;
445
+ $[21] = viewport.width;
446
+ $[22] = t2;
447
+ } else t2 = $[22];
448
+ return t2;
449
+ }
450
+ const SNAP_FLASH_KEYFRAMES = [
451
+ { opacity: 0 },
452
+ {
453
+ opacity: 1,
454
+ offset: .15
455
+ },
456
+ { opacity: 0 }
457
+ ];
458
+ const SNAP_FLASH_TIMING = {
459
+ duration: 600,
460
+ easing: "ease-out"
461
+ };
462
+ /** A frame header above an item's slot, at a constant on-screen height. */
463
+ function CanvasHeaderSlot(t0) {
464
+ const $ = c(10);
465
+ const { itemKey, left, children } = t0;
466
+ let t1;
467
+ if ($[0] !== left) {
468
+ t1 = canvasScreenX(left);
469
+ $[0] = left;
470
+ $[1] = t1;
471
+ } else t1 = $[1];
472
+ let t2;
473
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
474
+ t2 = canvasScreenAbove(52);
475
+ $[2] = t2;
476
+ } else t2 = $[2];
477
+ const t3 = `translate(${t1}, ${t2})`;
478
+ let t4;
479
+ if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
480
+ t4 = canvasScreenLength(CANVAS_SLOT_WIDTH);
481
+ $[3] = t4;
482
+ } else t4 = $[3];
483
+ let t5;
484
+ if ($[4] !== t3) {
485
+ t5 = {
486
+ height: 52,
487
+ transform: t3,
488
+ width: t4,
489
+ willChange: "transform",
490
+ zIndex: 2
491
+ };
492
+ $[4] = t3;
493
+ $[5] = t5;
494
+ } else t5 = $[5];
495
+ let t6;
496
+ if ($[6] !== children || $[7] !== itemKey || $[8] !== t5) {
497
+ t6 = /* @__PURE__ */ jsx("div", {
498
+ "data-canvas-header": itemKey,
499
+ className: "@container/canvas-header absolute top-0 left-0 pb-3",
500
+ style: t5,
501
+ children
502
+ });
503
+ $[6] = children;
504
+ $[7] = itemKey;
505
+ $[8] = t5;
506
+ $[9] = t6;
507
+ } else t6 = $[9];
508
+ return t6;
509
+ }
510
+ /** World-space room above and below a frame narrower than its area. */
511
+ const CANVAS_FRAMED_PADDING = 40;
512
+ /**
513
+ * An item's area in the Canvas row, which the camera snaps to, with the item's
514
+ * frame centered in it. A frame narrower than its area shows the area in a
515
+ * shade of its own, with room above and below the frame.
516
+ */
517
+ function CanvasSlot(t0) {
518
+ const $ = c(7);
519
+ const { itemKey, framed, children } = t0;
520
+ const t1 = framed || void 0;
521
+ const t2 = framed ? CANVAS_FRAMED_PADDING : 0;
522
+ let t3;
523
+ if ($[0] !== t2) {
524
+ t3 = {
525
+ width: CANVAS_SLOT_WIDTH,
526
+ paddingBlock: t2
527
+ };
528
+ $[0] = t2;
529
+ $[1] = t3;
530
+ } else t3 = $[1];
531
+ let t4;
532
+ if ($[2] !== children || $[3] !== itemKey || $[4] !== t1 || $[5] !== t3) {
533
+ t4 = /* @__PURE__ */ jsx("div", {
534
+ "data-canvas-slot": itemKey,
535
+ "data-canvas-slot-shaded": t1,
536
+ className: "data-canvas-slot-shaded:bg-foreground/5 flex shrink-0 justify-center",
537
+ style: t3,
538
+ children
539
+ });
540
+ $[2] = children;
541
+ $[3] = itemKey;
542
+ $[4] = t1;
543
+ $[5] = t3;
544
+ $[6] = t4;
545
+ } else t4 = $[6];
546
+ return t4;
547
+ }
548
+ /**
549
+ * The Page whose header the pointer is over, which outlines its frame. Kept out
550
+ * of the Canvas's state, so hovering re-renders only the frames it outlines.
551
+ */
552
+ function createCanvasHover() {
553
+ return createStore$1({
554
+ context: { pageKey: null },
555
+ on: { set: (context, event) => context.pageKey === event.pageKey ? context : { pageKey: event.pageKey } }
556
+ });
557
+ }
558
+ /** A Page's area in the Canvas row, with its frame. */
559
+ function CanvasPageItem(t0) {
560
+ const $ = c(39);
561
+ const { page, pathname, selected, previewed, framed, viewport, runtimeBasePath, onActivate, selectPage, hover } = t0;
562
+ let t1;
563
+ if ($[0] !== page.key) {
564
+ t1 = (state) => state.context.pageKey === page.key;
565
+ $[0] = page.key;
566
+ $[1] = t1;
567
+ } else t1 = $[1];
568
+ const hovered = useSelector(hover, t1);
569
+ let t2;
570
+ if ($[2] !== onActivate || $[3] !== pathname || $[4] !== selectPage) {
571
+ t2 = (owner, source, release) => {
572
+ if (!pathname) return;
573
+ onActivate(pathname, owner, release);
574
+ if (source === "interaction") selectPage(pathname);
575
+ };
576
+ $[2] = onActivate;
577
+ $[3] = pathname;
578
+ $[4] = selectPage;
579
+ $[5] = t2;
580
+ } else t2 = $[5];
581
+ const onPageActivate = t2;
582
+ let t3;
583
+ if ($[6] !== previewed) {
584
+ t3 = previewed ? { [PREVIEW_PAGE_SLOT_ATTRIBUTE]: "" } : {};
585
+ $[6] = previewed;
586
+ $[7] = t3;
587
+ } else t3 = $[7];
588
+ let t4;
589
+ if ($[8] !== viewport.height || $[9] !== viewport.width) {
590
+ t4 = {
591
+ width: viewport.width,
592
+ minHeight: viewport.height
593
+ };
594
+ $[8] = viewport.height;
595
+ $[9] = viewport.width;
596
+ $[10] = t4;
597
+ } else t4 = $[10];
598
+ let t5;
599
+ if ($[11] !== framed || $[12] !== hovered || $[13] !== onPageActivate || $[14] !== page || $[15] !== pathname || $[16] !== previewed || $[17] !== runtimeBasePath || $[18] !== selectPage || $[19] !== selected || $[20] !== viewport) {
600
+ t5 = previewed ? /* @__PURE__ */ jsx(CanvasPreviewPageSlot, {
601
+ pageId: canvasPageId(page),
602
+ layoutId: canvasLayoutId(page),
603
+ width: viewport.width,
604
+ viewportHeight: viewport.height,
605
+ selected,
606
+ hovered,
607
+ shaded: framed,
608
+ onActivate: onPageActivate
609
+ }) : pathname ? /* @__PURE__ */ jsx(CanvasPagePreview, {
610
+ hovered,
611
+ pathname,
612
+ runtimeBasePath,
613
+ derivedLayoutId: derivedLayoutIdOf(page),
614
+ pageId: canvasPageId(page),
615
+ viewport,
616
+ selected,
617
+ onActivate: onPageActivate,
618
+ onSelect: () => selectPage(pathname)
619
+ }) : /* @__PURE__ */ jsx(CanvasMessage, { children: "Choose a page path above to preview this layout." });
620
+ $[11] = framed;
621
+ $[12] = hovered;
622
+ $[13] = onPageActivate;
623
+ $[14] = page;
624
+ $[15] = pathname;
625
+ $[16] = previewed;
626
+ $[17] = runtimeBasePath;
627
+ $[18] = selectPage;
628
+ $[19] = selected;
629
+ $[20] = viewport;
630
+ $[21] = t5;
631
+ } else t5 = $[21];
632
+ let t6;
633
+ if ($[22] !== pathname || $[23] !== selected || $[24] !== t5) {
634
+ t6 = /* @__PURE__ */ jsx(CanvasFrameBoundary, {
635
+ selected,
636
+ children: t5
637
+ }, pathname);
638
+ $[22] = pathname;
639
+ $[23] = selected;
640
+ $[24] = t5;
641
+ $[25] = t6;
642
+ } else t6 = $[25];
643
+ let t7;
644
+ if ($[26] !== framed) {
645
+ t7 = /* @__PURE__ */ jsx(CanvasPageEdge, { shaded: framed });
646
+ $[26] = framed;
647
+ $[27] = t7;
648
+ } else t7 = $[27];
649
+ let t8;
650
+ if ($[28] !== page.key || $[29] !== pathname || $[30] !== t3 || $[31] !== t4 || $[32] !== t6 || $[33] !== t7) {
651
+ t8 = /* @__PURE__ */ jsxs("div", {
652
+ "data-canvas-page": page.key,
653
+ "data-canvas-pathname": pathname,
654
+ ...t3,
655
+ className: "bg-background relative shrink-0 shadow-xl ring-1 ring-black/10",
656
+ style: t4,
657
+ children: [t6, t7]
658
+ });
659
+ $[28] = page.key;
660
+ $[29] = pathname;
661
+ $[30] = t3;
662
+ $[31] = t4;
663
+ $[32] = t6;
664
+ $[33] = t7;
665
+ $[34] = t8;
666
+ } else t8 = $[34];
667
+ let t9;
668
+ if ($[35] !== framed || $[36] !== page.key || $[37] !== t8) {
669
+ t9 = /* @__PURE__ */ jsx(CanvasSlot, {
670
+ itemKey: page.key,
671
+ framed,
672
+ children: t8
673
+ });
674
+ $[35] = framed;
675
+ $[36] = page.key;
676
+ $[37] = t8;
677
+ $[38] = t9;
678
+ } else t9 = $[38];
679
+ return t9;
680
+ }
681
+ /** Gives a Page a new nickname, keeping its path. */
682
+ function useRenamePage() {
683
+ const $ = c(4);
684
+ const studioCache = useStudioCache();
685
+ let t0;
686
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
687
+ t0 = pageMutations.update();
688
+ $[0] = t0;
689
+ } else t0 = $[0];
690
+ const updatePage = useMutation(t0);
691
+ let t1;
692
+ if ($[1] !== studioCache || $[2] !== updatePage) {
693
+ t1 = async (pageId, nickname) => {
694
+ const page = await studioCache.ensure(reads.page({ id: pageId }));
695
+ await updatePage.mutateAsync({
696
+ id: pageId,
697
+ nickname,
698
+ pathSegment: page.pathSegment,
699
+ parentPageId: page.parentPageId
700
+ });
701
+ };
702
+ $[1] = studioCache;
703
+ $[2] = updatePage;
704
+ $[3] = t1;
705
+ } else t1 = $[3];
706
+ return t1;
707
+ }
708
+ /**
709
+ * The still images of a workspace's Pages, where the browser draws them faithfully. They refresh
710
+ * while the camera is still, and all go stale when the website's code changes.
711
+ */
712
+ function useWorkspaceThumbnails(workspaceKey) {
713
+ const $ = c(13);
714
+ const queryClient = useQueryClient();
715
+ const app = useCamoxApp();
716
+ let t0;
717
+ if ($[0] !== queryClient) {
718
+ t0 = () => canvasThumbnailsSupported() ? createCanvasThumbnails(queryClient) : null;
719
+ $[0] = queryClient;
720
+ $[1] = t0;
721
+ } else t0 = $[1];
722
+ const [thumbnails] = React.useState(t0);
723
+ let t1;
724
+ let t2;
725
+ if ($[2] !== thumbnails) {
726
+ t1 = () => thumbnails?.connect();
727
+ t2 = [thumbnails];
728
+ $[2] = thumbnails;
729
+ $[3] = t1;
730
+ $[4] = t2;
731
+ } else {
732
+ t1 = $[3];
733
+ t2 = $[4];
734
+ }
735
+ React.useEffect(t1, t2);
736
+ let t3;
737
+ let t4;
738
+ if ($[5] !== thumbnails || $[6] !== workspaceKey) {
739
+ t3 = () => {
740
+ if (!thumbnails) return;
741
+ const update = () => thumbnails.setMoving(!!canvasStore.getSnapshot().context.moving[workspaceKey]);
742
+ update();
743
+ const subscription = canvasStore.subscribe(update);
744
+ return () => subscription.unsubscribe();
745
+ };
746
+ t4 = [thumbnails, workspaceKey];
747
+ $[5] = thumbnails;
748
+ $[6] = workspaceKey;
749
+ $[7] = t3;
750
+ $[8] = t4;
751
+ } else {
752
+ t3 = $[7];
753
+ t4 = $[8];
754
+ }
755
+ React.useEffect(t3, t4);
756
+ const previousApp = React.useRef(app);
757
+ let t5;
758
+ let t6;
759
+ if ($[9] !== app || $[10] !== thumbnails) {
760
+ t5 = () => {
761
+ if (previousApp.current === app) return;
762
+ previousApp.current = app;
763
+ thumbnails?.markAllStale();
764
+ };
765
+ t6 = [app, thumbnails];
766
+ $[9] = app;
767
+ $[10] = thumbnails;
768
+ $[11] = t5;
769
+ $[12] = t6;
770
+ } else {
771
+ t5 = $[11];
772
+ t6 = $[12];
773
+ }
774
+ React.useEffect(t5, t6);
775
+ return thumbnails;
776
+ }
777
+ function CanvasWorkspace(t0) {
778
+ const $ = c(44);
779
+ const { ref, pages, selectedPage, previewedPage, intendedPageKey, runtimeBasePath, viewport, onActivate, onSelectionIntent } = t0;
780
+ const { apiUrl, projectUuid } = useAuthContext();
781
+ const renamePage = useRenamePage();
782
+ const location = useLocation();
783
+ const navigate = useNavigate();
784
+ const previewPageFrame = React.use(PreviewPageFrameContext);
785
+ const localized = useLocalizedPath();
786
+ const [hover] = React.useState(createCanvasHover);
787
+ const selectedPath = location.pathname;
788
+ const previewedPath = previewPageFrame?.pathname;
789
+ const follow = React.use(FollowAgentContext);
790
+ let t1;
791
+ if ($[0] !== location.hash || $[1] !== location.search || $[2] !== navigate || $[3] !== onSelectionIntent) {
792
+ t1 = (pathname) => {
793
+ onSelectionIntent(pathname);
794
+ navigate({
795
+ to: `${pathname}${location.search}${location.hash}`,
796
+ source: "canvas"
797
+ });
798
+ };
799
+ $[0] = location.hash;
800
+ $[1] = location.search;
801
+ $[2] = navigate;
802
+ $[3] = onSelectionIntent;
803
+ $[4] = t1;
804
+ } else t1 = $[4];
805
+ const goTo = t1;
806
+ let t2;
807
+ if ($[5] !== follow || $[6] !== goTo) {
808
+ t2 = (pathname_0) => {
809
+ follow?.takeOver();
810
+ goTo(pathname_0);
811
+ };
812
+ $[5] = follow;
813
+ $[6] = goTo;
814
+ $[7] = t2;
815
+ } else t2 = $[7];
816
+ const selectPage = t2;
817
+ const latestSelectPage = React.useRef(selectPage);
818
+ let t3;
819
+ if ($[8] !== selectPage) {
820
+ t3 = () => {
821
+ latestSelectPage.current = selectPage;
822
+ };
823
+ $[8] = selectPage;
824
+ $[9] = t3;
825
+ } else t3 = $[9];
826
+ React.useLayoutEffect(t3);
827
+ const selectFramePage = (pathname_1) => latestSelectPage.current(pathname_1);
828
+ let t4;
829
+ if ($[10] !== apiUrl || $[11] !== projectUuid || $[12] !== runtimeBasePath) {
830
+ t4 = JSON.stringify([
831
+ apiUrl,
832
+ projectUuid,
833
+ runtimeBasePath
834
+ ]);
835
+ $[10] = apiUrl;
836
+ $[11] = projectUuid;
837
+ $[12] = runtimeBasePath;
838
+ $[13] = t4;
839
+ } else t4 = $[13];
840
+ const workspaceKey = t4;
841
+ let t5;
842
+ if ($[14] === Symbol.for("react.memo_cache_sentinel")) {
843
+ t5 = {};
844
+ $[14] = t5;
845
+ } else t5 = $[14];
846
+ const [previewPathnames, setPreviewPathnames] = React.useState(t5);
847
+ const { items, width } = positionCanvasPages(pages);
848
+ let t6;
849
+ if ($[15] !== previewPathnames || $[16] !== previewedPage?.key || $[17] !== previewedPath || $[18] !== selectedPage?.key || $[19] !== selectedPath) {
850
+ t6 = (t7) => {
851
+ const { key, page, left } = t7;
852
+ return [key, {
853
+ page,
854
+ left,
855
+ pathname: key === selectedPage?.key ? selectedPath : previewedPath && key === previewedPage?.key ? previewedPath : previewPathnames[key] ?? page.pathname
856
+ }];
857
+ };
858
+ $[15] = previewPathnames;
859
+ $[16] = previewedPage?.key;
860
+ $[17] = previewedPath;
861
+ $[18] = selectedPage?.key;
862
+ $[19] = selectedPath;
863
+ $[20] = t6;
864
+ } else t6 = $[20];
865
+ const pageSlots = new Map(items.map(t6));
866
+ const framed = viewport.width < CANVAS_SLOT_WIDTH;
867
+ const snapTargets = canvasSnapTargets(items);
868
+ const snapRingRef = React.useRef(null);
869
+ const snapFlash = React.useRef(null);
870
+ let t7;
871
+ if ($[21] !== selectedPage?.key) {
872
+ t7 = (t8) => {
873
+ const { key: key_0 } = t8;
874
+ return key_0 === selectedPage?.key;
875
+ };
876
+ $[21] = selectedPage?.key;
877
+ $[22] = t7;
878
+ } else t7 = $[22];
879
+ let t8;
880
+ if ($[23] !== goTo || $[24] !== localized) {
881
+ t8 = () => goTo(localized(STUDIO_CANVAS_PATH));
882
+ $[23] = goTo;
883
+ $[24] = localized;
884
+ $[25] = t8;
885
+ } else t8 = $[25];
886
+ let t9;
887
+ if ($[26] !== follow) {
888
+ t9 = () => follow?.takeOver();
889
+ $[26] = follow;
890
+ $[27] = t9;
891
+ } else t9 = $[27];
892
+ const { viewportRef, contentRef, flyTo, mirrorCamera, reveal, fitAll } = useCanvasCamera(workspaceKey, snapTargets.find(t7), {
893
+ targets: snapTargets,
894
+ width,
895
+ onSelect: (key_1) => {
896
+ const pathname_2 = pageSlots.get(key_1)?.pathname;
897
+ if (pathname_2) selectPage(pathname_2);
898
+ },
899
+ selected: intendedPageKey && pageSlots.has(intendedPageKey) ? intendedPageKey : null,
900
+ onDeselect: t8,
901
+ onSnap: () => {
902
+ snapFlash.current = snapRingRef.current?.animate(SNAP_FLASH_KEYFRAMES, SNAP_FLASH_TIMING) ?? null;
903
+ },
904
+ onSnapStretched: () => snapFlash.current?.cancel(),
905
+ onEditorMove: t9
906
+ });
907
+ let t10;
908
+ if ($[28] !== mirrorCamera || $[29] !== reveal || $[30] !== workspaceKey) {
909
+ t10 = {
910
+ workspaceKey,
911
+ mirrorCamera,
912
+ reveal
913
+ };
914
+ $[28] = mirrorCamera;
915
+ $[29] = reveal;
916
+ $[30] = workspaceKey;
917
+ $[31] = t10;
918
+ } else t10 = $[31];
919
+ const workspace = t10;
920
+ const thumbnails = useWorkspaceThumbnails(workspaceKey);
921
+ const instructionsId = React.useId();
922
+ let t11;
923
+ let t12;
924
+ if ($[32] !== fitAll) {
925
+ t11 = () => {
926
+ let answered = canvasStore.getSnapshot().context.overviewRequests;
927
+ const subscription = canvasStore.subscribe((t13) => {
928
+ const { context } = t13;
929
+ if (context.overviewRequests === answered) return;
930
+ answered = context.overviewRequests;
931
+ fitAll();
932
+ });
933
+ return () => subscription.unsubscribe();
934
+ };
935
+ t12 = [fitAll];
936
+ $[32] = fitAll;
937
+ $[33] = t11;
938
+ $[34] = t12;
939
+ } else {
940
+ t11 = $[33];
941
+ t12 = $[34];
942
+ }
943
+ React.useEffect(t11, t12);
944
+ React.useImperativeHandle(ref, () => ({
945
+ showPage(key_2) {
946
+ const slot = pageSlots.get(key_2);
947
+ if (!slot) return;
948
+ if (slot.pathname && slot.pathname !== selectedPath) {
949
+ navigate({ to: `${slot.pathname}${location.search}${location.hash}` });
950
+ return;
951
+ }
952
+ flyTo(key_2);
953
+ },
954
+ showWholeCanvas() {
955
+ selectPage(localized(STUDIO_CANVAS_PATH));
956
+ fitAll();
957
+ }
958
+ }));
959
+ let t13;
960
+ if ($[35] === Symbol.for("react.memo_cache_sentinel")) {
961
+ t13 = {
962
+ userSelect: "none",
963
+ overscrollBehavior: "none"
964
+ };
965
+ $[35] = t13;
966
+ } else t13 = $[35];
967
+ let t14;
968
+ if ($[36] === Symbol.for("react.memo_cache_sentinel")) {
969
+ t14 = {
970
+ gap: 240,
971
+ transform: CANVAS_WORLD_TRANSFORM,
972
+ transformOrigin: "0 0"
973
+ };
974
+ $[36] = t14;
975
+ } else t14 = $[36];
976
+ let t17;
977
+ if ($[37] !== pages.length) {
978
+ t17 = !pages.length && /* @__PURE__ */ jsx(CanvasMessage, { children: "No pages to preview yet." });
979
+ $[37] = pages.length;
980
+ $[38] = t17;
981
+ } else t17 = $[38];
982
+ let t18;
983
+ if ($[39] !== instructionsId) {
984
+ t18 = /* @__PURE__ */ jsx("p", {
985
+ id: instructionsId,
986
+ className: "sr-only",
987
+ children: "Scroll, or hold Space and drag, to pan. Pinch or Ctrl/⌘ + scroll to zoom. Click a page to edit it. Focus the canvas and use plus or minus to zoom, arrow keys to pan, 0 for 100%, or Home / Shift+1 to fit all pages."
988
+ });
989
+ $[39] = instructionsId;
990
+ $[40] = t18;
991
+ } else t18 = $[40];
992
+ let t19;
993
+ if ($[41] === Symbol.for("react.memo_cache_sentinel")) {
994
+ t19 = { zIndex: 2 };
995
+ $[41] = t19;
996
+ } else t19 = $[41];
997
+ let t20;
998
+ if ($[42] !== snapRingRef) {
999
+ t20 = /* @__PURE__ */ jsx("div", {
1000
+ ref: snapRingRef,
1001
+ "aria-hidden": true,
1002
+ "data-canvas-snap-ring": true,
1003
+ className: "ring-primary pointer-events-none absolute inset-0 opacity-0 ring-3 ring-inset",
1004
+ style: t19
1005
+ });
1006
+ $[42] = snapRingRef;
1007
+ $[43] = t20;
1008
+ } else t20 = $[43];
1009
+ return /* @__PURE__ */ jsxs("div", {
1010
+ ref: viewportRef,
1011
+ role: "region",
1012
+ "aria-label": "Page canvas",
1013
+ "aria-describedby": instructionsId,
1014
+ tabIndex: 0,
1015
+ "data-camox-canvas": true,
1016
+ className: "bg-muted relative min-h-0 min-w-0 flex-1 touch-none overflow-clip outline-none *:*:[--canvas-x:initial] *:*:[--canvas-y:initial] data-[canvas-pan]:cursor-grab data-[canvas-pan]:**:cursor-[inherit]! data-[canvas-pan=dragging]:cursor-grabbing data-[canvas-pan]:[&_iframe]:pointer-events-none",
1017
+ style: t13,
1018
+ children: [
1019
+ /* @__PURE__ */ jsx(CanvasWorkspaceContext, {
1020
+ value: workspace,
1021
+ children: /* @__PURE__ */ jsx(CanvasThumbnailsContext, {
1022
+ value: thumbnails,
1023
+ children: /* @__PURE__ */ jsx(CanvasOverlaysShownContext, {
1024
+ value: !!intendedPageKey,
1025
+ children: /* @__PURE__ */ jsx("div", {
1026
+ ref: contentRef,
1027
+ "data-canvas-items": true,
1028
+ className: "absolute top-0 left-0 flex w-max items-start in-data-[canvas-promoted]:will-change-transform",
1029
+ style: t14,
1030
+ children: [...pageSlots.values()].map((t15) => {
1031
+ const { page: page_0, pathname: pathname_3 } = t15;
1032
+ return /* @__PURE__ */ jsx(CanvasPageItem, {
1033
+ page: page_0,
1034
+ pathname: pathname_3,
1035
+ selected: page_0.key === selectedPage?.key,
1036
+ hover,
1037
+ previewed: !!previewPageFrame && page_0.key === previewedPage?.key && pathname_3 === previewedPath,
1038
+ framed,
1039
+ viewport,
1040
+ runtimeBasePath,
1041
+ onActivate,
1042
+ selectPage: selectFramePage
1043
+ }, page_0.key);
1044
+ })
1045
+ })
1046
+ })
1047
+ })
1048
+ }),
1049
+ [...pageSlots.values()].map((t16) => {
1050
+ const { page: page_1, pathname: pathname_4, left: left_0 } = t16;
1051
+ return /* @__PURE__ */ jsx(CanvasHeaderSlot, {
1052
+ itemKey: page_1.key,
1053
+ left: left_0,
1054
+ children: /* @__PURE__ */ jsx(CanvasPageHeader, {
1055
+ page: page_1,
1056
+ pathname: pathname_4,
1057
+ onRename: page_1.kind === "curated" ? (nickname) => renamePage(page_1.pageId, nickname) : void 0,
1058
+ selected: page_1.key === selectedPage?.key,
1059
+ onHoverChange: (hovered) => hover.send({
1060
+ type: "set",
1061
+ pageKey: hovered ? page_1.key : null
1062
+ }),
1063
+ onSelect: () => {
1064
+ if (!pathname_4) return;
1065
+ selectPage(pathname_4);
1066
+ },
1067
+ onChange: (path) => {
1068
+ const inLocale = localized(path);
1069
+ setPreviewPathnames((current) => ({
1070
+ ...current,
1071
+ [page_1.key]: inLocale
1072
+ }));
1073
+ selectPage(inLocale);
1074
+ }
1075
+ })
1076
+ }, page_1.key);
1077
+ }),
1078
+ t17,
1079
+ t18,
1080
+ t20
1081
+ ]
1082
+ });
1083
+ }
1084
+ function CamoxCanvas(t0) {
1085
+ const $ = c(68);
1086
+ const { runtimeBasePath } = t0;
1087
+ const app = useCamoxApp();
1088
+ const renamePage = useRenamePage();
1089
+ const location = useLocation();
1090
+ const viewportMode = useSelector(previewStore, _temp3);
1091
+ const viewport = CANVAS_DEVICES[viewportMode === "full" ? "desktop" : viewportMode];
1092
+ const [activeFrame, setActiveFrame] = React.useState(null);
1093
+ const selectedPath = location.pathname;
1094
+ const previousPath = React.useRef(selectedPath);
1095
+ let t1;
1096
+ let t2;
1097
+ if ($[0] !== activeFrame || $[1] !== selectedPath) {
1098
+ t1 = () => {
1099
+ if (previousPath.current === selectedPath) return;
1100
+ previousPath.current = selectedPath;
1101
+ if (!activeFrame || activeFrame.pathname === selectedPath) return;
1102
+ activeFrame.release();
1103
+ setActiveFrame(null);
1104
+ };
1105
+ t2 = [activeFrame, selectedPath];
1106
+ $[0] = activeFrame;
1107
+ $[1] = selectedPath;
1108
+ $[2] = t1;
1109
+ $[3] = t2;
1110
+ } else {
1111
+ t1 = $[2];
1112
+ t2 = $[3];
1113
+ }
1114
+ React.useLayoutEffect(t1, t2);
1115
+ let t3;
1116
+ if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
1117
+ t3 = [];
1118
+ $[4] = t3;
1119
+ } else t3 = $[4];
1120
+ React.useEffect(_temp5, t3);
1121
+ const projectUuid = useProjectUuid();
1122
+ let t4;
1123
+ if ($[5] !== projectUuid) {
1124
+ t4 = reads.project({ projectUuid });
1125
+ $[5] = projectUuid;
1126
+ $[6] = t4;
1127
+ } else t4 = $[6];
1128
+ const project = useReadQuery(t4);
1129
+ let t5;
1130
+ if ($[7] !== projectUuid) {
1131
+ t5 = reads.pageList({ projectUuid });
1132
+ $[7] = projectUuid;
1133
+ $[8] = t5;
1134
+ } else t5 = $[8];
1135
+ const t6 = !!project.data;
1136
+ let t7;
1137
+ if ($[9] !== t6) {
1138
+ t7 = { enabled: t6 };
1139
+ $[9] = t6;
1140
+ $[10] = t7;
1141
+ } else t7 = $[10];
1142
+ const pages = useReadQuery(t5, t7);
1143
+ const discoveredPaths = useDiscoveredPreviewPaths(runtimeBasePath);
1144
+ const viewLocale = useViewLocale();
1145
+ const canvasPages = pages.data ? getCanvasPages(pages.data, app.getLayouts(), discoveredPaths, viewLocale.locale) : [];
1146
+ let t8;
1147
+ if ($[11] !== viewLocale.locales) {
1148
+ t8 = (runtimePath) => parseLocalePath(runtimePath, viewLocale.locales).path === STUDIO_CANVAS_PATH;
1149
+ $[11] = viewLocale.locales;
1150
+ $[12] = t8;
1151
+ } else t8 = $[12];
1152
+ const isCanvasPath = t8;
1153
+ const pageAt = (runtimePath_0) => isCanvasPath(runtimePath_0) ? void 0 : selectedCanvasPage(canvasPages, app.getLayouts(), runtimePath_0, viewLocale.locales);
1154
+ const selectedPage = pageAt(location.pathname);
1155
+ const previewedPath = React.use(PreviewPageFrameContext)?.pathname;
1156
+ const previewedPage = previewedPath ? pageAt(previewedPath) : void 0;
1157
+ const [intent, setIntent] = React.useState(null);
1158
+ if (intent && intent.from !== location.pathname) setIntent(null);
1159
+ const intended = intent?.from === location.pathname ? intent.to : location;
1160
+ const intendedPage = pageAt(intended.pathname);
1161
+ const navigate = useNavigate();
1162
+ const workspace = React.useRef(null);
1163
+ let t9;
1164
+ if ($[13] === Symbol.for("react.memo_cache_sentinel")) {
1165
+ t9 = { enabled: false };
1166
+ $[13] = t9;
1167
+ } else t9 = $[13];
1168
+ const { data: intendedFrameInput } = useReadQuery(reads.canvasFrame({
1169
+ projectUuid,
1170
+ runtimeBasePath,
1171
+ pathname: intended.pathname,
1172
+ derivedLayoutId: derivedLayoutIdOf(intendedPage)
1173
+ }), t9);
1174
+ const recordResult = derivedLayoutIdOf(intendedPage) ? intendedFrameInput?.derived?.result : void 0;
1175
+ let t10;
1176
+ if ($[14] !== recordResult) {
1177
+ t10 = getPageRecord(recordResult);
1178
+ $[14] = recordResult;
1179
+ $[15] = t10;
1180
+ } else t10 = $[15];
1181
+ const pageRecord = t10;
1182
+ usePreparationFailure((!project.isFetching ? project.error : null) ?? (!pages.isFetching ? pages.error : null));
1183
+ const preparation = React.useContext(PreviewPreparationContext);
1184
+ let t11;
1185
+ let t12;
1186
+ if ($[16] !== location.pathname || $[17] !== pages.error || $[18] !== pages.isPending || $[19] !== preparation || $[20] !== project.error || $[21] !== project.isPending || $[22] !== selectedPage || $[23] !== viewLocale.locales) {
1187
+ t11 = () => {
1188
+ if (project.isPending || pages.isPending || project.error || pages.error) return;
1189
+ if (parseLocalePath(location.pathname, viewLocale.locales).path === "/camox/canvas") {
1190
+ preparation?.ready();
1191
+ return;
1192
+ }
1193
+ if (selectedPage) return;
1194
+ preparation?.fail(/* @__PURE__ */ new Error(`No canvas page matches ${location.pathname}.`));
1195
+ };
1196
+ t12 = [
1197
+ project.isPending,
1198
+ pages.isPending,
1199
+ project.error,
1200
+ pages.error,
1201
+ selectedPage,
1202
+ location.pathname,
1203
+ viewLocale.locales,
1204
+ preparation
1205
+ ];
1206
+ $[16] = location.pathname;
1207
+ $[17] = pages.error;
1208
+ $[18] = pages.isPending;
1209
+ $[19] = preparation;
1210
+ $[20] = project.error;
1211
+ $[21] = project.isPending;
1212
+ $[22] = selectedPage;
1213
+ $[23] = viewLocale.locales;
1214
+ $[24] = t11;
1215
+ $[25] = t12;
1216
+ } else {
1217
+ t11 = $[24];
1218
+ t12 = $[25];
1219
+ }
1220
+ React.useEffect(t11, t12);
1221
+ if (project.error || pages.error) {
1222
+ let t13;
1223
+ if ($[26] === Symbol.for("react.memo_cache_sentinel")) {
1224
+ t13 = /* @__PURE__ */ jsx("p", { children: "Could not load the site’s pages." });
1225
+ $[26] = t13;
1226
+ } else t13 = $[26];
1227
+ let t14;
1228
+ if ($[27] !== pages || $[28] !== project) {
1229
+ t14 = /* @__PURE__ */ jsx(CanvasMessage, { children: /* @__PURE__ */ jsxs("div", {
1230
+ role: "alert",
1231
+ children: [t13, /* @__PURE__ */ jsx("button", {
1232
+ className: "mt-4 underline",
1233
+ onClick: () => {
1234
+ if (project.error) project.refetch();
1235
+ else pages.refetch();
1236
+ },
1237
+ children: "Try again"
1238
+ })]
1239
+ }) });
1240
+ $[27] = pages;
1241
+ $[28] = project;
1242
+ $[29] = t14;
1243
+ } else t14 = $[29];
1244
+ return t14;
1245
+ }
1246
+ if (project.isPending || pages.isPending) {
1247
+ let t13;
1248
+ if ($[30] === Symbol.for("react.memo_cache_sentinel")) {
1249
+ t13 = /* @__PURE__ */ jsx(CanvasMessage, { children: /* @__PURE__ */ jsx("span", {
1250
+ role: "status",
1251
+ children: "Loading canvas…"
1252
+ }) });
1253
+ $[30] = t13;
1254
+ } else t13 = $[30];
1255
+ return t13;
1256
+ }
1257
+ const editingOwner = activeFrame?.pathname === intended.pathname ? activeFrame.owner : null;
1258
+ let t13;
1259
+ if ($[31] !== selectedPage?.kind) {
1260
+ t13 = selectedPage?.kind === "curated" && /* @__PURE__ */ jsx(CuratedBlockShortcuts, {});
1261
+ $[31] = selectedPage?.kind;
1262
+ $[32] = t13;
1263
+ } else t13 = $[32];
1264
+ const t14 = intendedPage?.key;
1265
+ let t15;
1266
+ if ($[33] === Symbol.for("react.memo_cache_sentinel")) {
1267
+ t15 = (key) => workspace.current?.showPage(key);
1268
+ $[33] = t15;
1269
+ } else t15 = $[33];
1270
+ let t16;
1271
+ if ($[34] !== canvasPages || $[35] !== t14) {
1272
+ t16 = {
1273
+ pages: canvasPages,
1274
+ selectedKey: t14,
1275
+ onShowPage: t15
1276
+ };
1277
+ $[34] = canvasPages;
1278
+ $[35] = t14;
1279
+ $[36] = t16;
1280
+ } else t16 = $[36];
1281
+ let t17;
1282
+ if ($[37] === Symbol.for("react.memo_cache_sentinel")) {
1283
+ t17 = () => workspace.current?.showWholeCanvas();
1284
+ $[37] = t17;
1285
+ } else t17 = $[37];
1286
+ let t18;
1287
+ if ($[38] !== editingOwner || $[39] !== intendedPage || $[40] !== pageRecord || $[41] !== renamePage || $[42] !== t16) {
1288
+ t18 = /* @__PURE__ */ jsx(CanvasSidebar, {
1289
+ page: intendedPage,
1290
+ navigator: t16,
1291
+ onShowWholeCanvas: t17,
1292
+ onRenamePage: renamePage,
1293
+ owner: editingOwner,
1294
+ pageRecord
1295
+ });
1296
+ $[38] = editingOwner;
1297
+ $[39] = intendedPage;
1298
+ $[40] = pageRecord;
1299
+ $[41] = renamePage;
1300
+ $[42] = t16;
1301
+ $[43] = t18;
1302
+ } else t18 = $[43];
1303
+ let t19;
1304
+ if ($[44] !== recordResult || $[45] !== t18) {
1305
+ t19 = /* @__PURE__ */ jsx(PageRecordContext, {
1306
+ value: recordResult,
1307
+ children: t18
1308
+ });
1309
+ $[44] = recordResult;
1310
+ $[45] = t18;
1311
+ $[46] = t19;
1312
+ } else t19 = $[46];
1313
+ let t20;
1314
+ if ($[47] !== intended || $[48] !== navigate || $[49] !== t19) {
1315
+ t20 = /* @__PURE__ */ jsx(NavigationProvider, {
1316
+ location: intended,
1317
+ navigate,
1318
+ children: t19
1319
+ });
1320
+ $[47] = intended;
1321
+ $[48] = navigate;
1322
+ $[49] = t19;
1323
+ $[50] = t20;
1324
+ } else t20 = $[50];
1325
+ const t21 = intendedPage?.key;
1326
+ let t22;
1327
+ if ($[51] === Symbol.for("react.memo_cache_sentinel")) {
1328
+ t22 = (pathname, owner, release) => setActiveFrame({
1329
+ pathname,
1330
+ owner,
1331
+ release
1332
+ });
1333
+ $[51] = t22;
1334
+ } else t22 = $[51];
1335
+ let t23;
1336
+ if ($[52] !== location || $[53] !== setIntent) {
1337
+ t23 = (pathname_0) => setIntent({
1338
+ from: location.pathname,
1339
+ to: {
1340
+ ...location,
1341
+ pathname: pathname_0,
1342
+ href: new URL(`${pathname_0}${location.search}${location.hash}`, window.location.href).href
1343
+ }
1344
+ });
1345
+ $[52] = location;
1346
+ $[53] = setIntent;
1347
+ $[54] = t23;
1348
+ } else t23 = $[54];
1349
+ let t24;
1350
+ if ($[55] !== canvasPages || $[56] !== previewedPage || $[57] !== project.data.id || $[58] !== runtimeBasePath || $[59] !== selectedPage || $[60] !== t21 || $[61] !== t23 || $[62] !== viewport) {
1351
+ t24 = /* @__PURE__ */ jsx(CanvasWorkspace, {
1352
+ ref: workspace,
1353
+ pages: canvasPages,
1354
+ selectedPage,
1355
+ previewedPage,
1356
+ intendedPageKey: t21,
1357
+ runtimeBasePath,
1358
+ viewport,
1359
+ onActivate: t22,
1360
+ onSelectionIntent: t23
1361
+ }, project.data.id);
1362
+ $[55] = canvasPages;
1363
+ $[56] = previewedPage;
1364
+ $[57] = project.data.id;
1365
+ $[58] = runtimeBasePath;
1366
+ $[59] = selectedPage;
1367
+ $[60] = t21;
1368
+ $[61] = t23;
1369
+ $[62] = viewport;
1370
+ $[63] = t24;
1371
+ } else t24 = $[63];
1372
+ let t25;
1373
+ if ($[64] !== t13 || $[65] !== t20 || $[66] !== t24) {
1374
+ t25 = /* @__PURE__ */ jsxs("div", {
1375
+ className: "flex min-h-0 flex-1 overflow-hidden",
1376
+ children: [
1377
+ t13,
1378
+ t20,
1379
+ t24
1380
+ ]
1381
+ });
1382
+ $[64] = t13;
1383
+ $[65] = t20;
1384
+ $[66] = t24;
1385
+ $[67] = t25;
1386
+ } else t25 = $[67];
1387
+ return t25;
1388
+ }
1389
+ function _temp5() {
1390
+ previewStore.send({ type: "clearSelection" });
1391
+ return _temp4;
1392
+ }
1393
+ function _temp4() {
1394
+ previewStore.send({ type: "clearSelection" });
1395
+ }
1396
+ function _temp3(state) {
1397
+ return state.context.viewportMode;
1398
+ }
1399
+
1400
+ //#endregion
1401
+ export { CamoxCanvas };