camox 0.44.0 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (411) hide show
  1. package/dist/components/AuthGate.js +0 -6
  2. package/dist/components/DeviceSelector.js +96 -0
  3. package/dist/components/PlatformLabel.js +20 -24
  4. package/dist/core/components/lexical/HighlightNode.js +1 -1
  5. package/dist/core/components/lexical/InlineContentEditable.js +15 -19
  6. package/dist/core/components/lexical/InlineLexicalEditor.js +54 -74
  7. package/dist/core/components/lexical/InlineStylesPlugin.js +53 -53
  8. package/dist/core/components/lexical/MaxLengthPlugin.js +59 -0
  9. package/dist/core/components/lexical/SelectionBroadcaster.js +53 -54
  10. package/dist/core/components/lexical/SidebarLexicalEditor.js +322 -229
  11. package/dist/core/components/lexical/SummaryToggleGuard.js +42 -0
  12. package/dist/core/components/lexical/TextLinkPopover.js +169 -180
  13. package/dist/core/createApp.d.ts +241 -312
  14. package/dist/core/createApp.js +123 -29
  15. package/dist/core/createBlock.d.ts +5 -5
  16. package/dist/core/createBlock.js +385 -152
  17. package/dist/core/createCollection.d.ts +55 -0
  18. package/dist/core/createCollection.js +93 -0
  19. package/dist/core/createLayout.d.ts +197 -61
  20. package/dist/core/createLayout.js +114 -56
  21. package/dist/core/defineDocument.d.ts +3 -5
  22. package/dist/core/derivedRoutes.js +49 -1
  23. package/dist/core/dom.d.ts +13 -4
  24. package/dist/core/dom.js +44 -1
  25. package/dist/core/editing/BlockEditingRuntime.d.ts +16 -0
  26. package/dist/core/editing/BlockEditingRuntime.js +6 -15
  27. package/dist/core/editing/CompleteBlockEditingRuntime.js +28 -23
  28. package/dist/core/editing/createEditableBlock.d.ts +754 -633
  29. package/dist/core/editing/createEditableBlock.js +2113 -1066
  30. package/dist/core/editing/referenceWrites.js +51 -0
  31. package/dist/core/editing/useLatestRecord.js +90 -0
  32. package/dist/core/hooks/useArtifactHost.js +139 -0
  33. package/dist/core/hooks/useFieldSelection.js +43 -18
  34. package/dist/core/hooks/useIsEditable.js +12 -10
  35. package/dist/core/hooks/useOverlayMessage.js +15 -19
  36. package/dist/core/lib/artifact.d.ts +21 -0
  37. package/dist/core/lib/artifact.js +154 -0
  38. package/dist/core/lib/artifactColors.js +123 -0
  39. package/dist/core/lib/artifactData.d.ts +1 -0
  40. package/dist/core/lib/artifactData.js +131 -0
  41. package/dist/core/lib/artifactHost.js +205 -0
  42. package/dist/core/lib/artifactRuntime.js +36 -0
  43. package/dist/core/lib/artifactTheme.js +57 -0
  44. package/dist/core/lib/contentType.d.ts +302 -106
  45. package/dist/core/lib/contentType.js +201 -173
  46. package/dist/core/lib/fieldTypes.js +3 -0
  47. package/dist/core/lib/iconTypes.d.ts +3 -3
  48. package/dist/core/lib/icons.d.ts +4 -4
  49. package/dist/core/lib/icons.js +40 -44
  50. package/dist/core/lib/imagePlaceholder.js +177 -0
  51. package/dist/core/lib/imageTransform.js +1 -1
  52. package/dist/core/lib/lexicalReact.d.ts +3 -1
  53. package/dist/core/lib/lexicalState.js +1 -1
  54. package/dist/core/lib/previewPaused.js +9 -0
  55. package/dist/core/lib/recordScope.js +316 -0
  56. package/dist/core/lib/reference.d.ts +81 -0
  57. package/dist/core/lib/reference.js +29 -0
  58. package/dist/core/lib/textLinks.js +7 -5
  59. package/dist/core/lib/textStyles.d.ts +5 -7
  60. package/dist/core/lib/textStyles.js +2 -2
  61. package/dist/core/notFound.d.ts +7 -0
  62. package/dist/core/notFound.js +11 -0
  63. package/dist/core/pageDestinations.js +6 -3
  64. package/dist/core/recordItem.js +34 -0
  65. package/dist/core/requestContext.d.ts +26 -0
  66. package/dist/core/requestContext.js +20 -0
  67. package/dist/features/canvas/CamoxCanvas.js +1734 -0
  68. package/dist/features/canvas/CanvasBlockFrame.js +353 -0
  69. package/dist/features/canvas/CanvasBlockHeader.js +55 -0
  70. package/dist/features/canvas/CanvasLoadingScreen.js +35 -0
  71. package/dist/features/canvas/CanvasOverlays.js +254 -0
  72. package/dist/features/canvas/CanvasPageEdge.js +87 -0
  73. package/dist/features/canvas/CanvasPageFrame.js +335 -0
  74. package/dist/features/canvas/CanvasPageHeader.js +125 -0
  75. package/dist/features/canvas/CanvasPreviewPageSlot.js +103 -0
  76. package/dist/features/canvas/CanvasShelfMarker.js +255 -0
  77. package/dist/features/canvas/DerivedPagePathInput.js +238 -0
  78. package/dist/features/canvas/canvasCamera.js +229 -0
  79. package/dist/features/canvas/canvasFlight.js +104 -0
  80. package/dist/features/canvas/canvasFrameCapture.js +364 -0
  81. package/dist/features/canvas/canvasFrameDocument.js +317 -0
  82. package/dist/features/canvas/canvasFrameMode.js +53 -0
  83. package/dist/features/canvas/canvasInsertionSeams.js +44 -0
  84. package/dist/features/canvas/canvasItems.js +120 -0
  85. package/dist/features/canvas/canvasOverlayGeometry.js +240 -0
  86. package/dist/features/canvas/canvasPages.js +79 -0
  87. package/dist/features/canvas/canvasScreenSpace.js +26 -0
  88. package/dist/features/canvas/canvasSelection.js +18 -0
  89. package/dist/features/canvas/canvasStore.js +149 -0
  90. package/dist/features/canvas/canvasThumbnails.js +304 -0
  91. package/dist/features/canvas/canvasZoom.js +10 -0
  92. package/dist/features/canvas/sidebar/CanvasInspector.js +202 -0
  93. package/dist/features/canvas/sidebar/CanvasNavigator.js +226 -0
  94. package/dist/features/canvas/sidebar/CanvasSidebar.js +60 -0
  95. package/dist/features/canvas/sidebar/CanvasSidebarFrame.js +48 -0
  96. package/dist/features/canvas/sidebar/CanvasSidebarSkeleton.js +39 -0
  97. package/dist/features/canvas/sidebar/CatalogBlockInspector.js +189 -0
  98. package/dist/features/canvas/sidebar/CuratedPageInspector.js +69 -0
  99. package/dist/features/canvas/sidebar/DerivedPageInspector.js +37 -0
  100. package/dist/features/canvas/sidebar/LayoutPageBlocks.js +78 -0
  101. package/dist/features/canvas/sidebar/LayoutPageOverview.js +71 -0
  102. package/dist/features/canvas/sidebar/PageInspector.js +157 -0
  103. package/dist/features/canvas/sidebar/PageInspectorSkeleton.js +90 -0
  104. package/dist/features/canvas/sidebar/PageOverview.js +27 -0
  105. package/dist/features/canvas/sidebar/SingletonPageInspector.js +31 -0
  106. package/dist/features/canvas/useCanvasCamera.js +803 -0
  107. package/dist/features/canvas/useCanvasFrame.js +149 -0
  108. package/dist/features/canvas/useCanvasFrameInput.js +97 -0
  109. package/dist/features/canvas/useCanvasNearness.js +57 -0
  110. package/dist/features/canvas/useDiscoveredPreviewPaths.js +62 -0
  111. package/dist/features/content/CamoxContent.d.ts +2 -5
  112. package/dist/features/content/CamoxContent.js +174 -271
  113. package/dist/features/content/CollectionItemSheetContext.js +106 -0
  114. package/dist/features/content/ContentAssets.js +315 -0
  115. package/dist/features/content/ContentCollection.js +663 -0
  116. package/dist/features/content/collection-form.js +58 -0
  117. package/dist/features/content/components/AssetCard.js +80 -84
  118. package/dist/features/content/components/AssetCardSkeleton.js +4 -8
  119. package/dist/features/content/components/ContentSidebar.js +129 -18
  120. package/dist/features/content/components/ContentSidebarGroup.js +37 -0
  121. package/dist/features/content/components/DeleteCollectionItemButton.js +202 -0
  122. package/dist/features/content/components/MissingFromLocale.js +282 -0
  123. package/dist/features/content/components/UploadDropZone.js +27 -31
  124. package/dist/features/content/components/UploadProgressDrawer.js +90 -98
  125. package/dist/features/navigation/navigation.d.ts +66 -20
  126. package/dist/features/navigation/navigation.js +257 -90
  127. package/dist/features/og/defaultFonts.js +8 -8
  128. package/dist/features/og/geist-variable-ttf-base64.js +1 -1
  129. package/dist/features/og/imageResponse.d.ts +8 -0
  130. package/dist/features/og/imageResponse.js +26 -0
  131. package/dist/features/page/CuratedPageContent.js +167 -0
  132. package/dist/features/page/DerivedPageContent.js +26 -30
  133. package/dist/features/page/SharedLayoutContent.js +25 -27
  134. package/dist/features/preview/CamoxPreview.d.ts +23 -61
  135. package/dist/features/preview/CamoxPreview.js +816 -537
  136. package/dist/features/preview/EditablePageContent.js +1 -1
  137. package/dist/features/preview/EditablePageExperience.js +16 -22
  138. package/dist/features/preview/components/AddBlockDialog.js +270 -0
  139. package/dist/features/preview/components/AssetFieldEditor.js +173 -154
  140. package/dist/features/preview/components/AssetLightbox.js +181 -134
  141. package/dist/features/preview/components/AssetPickerModal.js +153 -170
  142. package/dist/features/preview/components/BlockActionsPopover.js +150 -149
  143. package/dist/features/preview/components/BlockErrorBoundary.js +8 -12
  144. package/dist/features/preview/components/BlockThumbnail.js +176 -100
  145. package/dist/features/preview/components/CanvasPreview.js +243 -0
  146. package/dist/features/preview/components/CreatePageModal.js +128 -137
  147. package/dist/features/preview/components/DebouncedFieldEditor.js +29 -33
  148. package/dist/features/preview/components/DerivedLayoutDialog.js +21 -19
  149. package/dist/features/preview/components/DrillRow.js +150 -0
  150. package/dist/features/preview/components/FieldOverlayStyles.js +11 -8
  151. package/dist/features/preview/components/FieldToolbar.js +160 -110
  152. package/dist/features/preview/components/Frame.js +108 -20
  153. package/dist/features/preview/components/IconFieldEditor.js +62 -66
  154. package/dist/features/preview/components/ItemFieldsEditor.js +231 -205
  155. package/dist/features/preview/components/LinkFieldEditor.js +135 -139
  156. package/dist/features/preview/components/Metadata.js +22 -30
  157. package/dist/features/preview/components/MobilePreviewDrawer.js +89 -108
  158. package/dist/features/preview/components/MultipleAssetFieldEditor.js +334 -246
  159. package/dist/features/preview/components/OverlayTracker.js +9 -41
  160. package/dist/features/preview/components/Overlays.js +81 -69
  161. package/dist/features/preview/components/PageInfo.js +1748 -0
  162. package/dist/features/preview/components/PageInfoSkeleton.js +51 -0
  163. package/dist/features/preview/components/PageLocationFieldset.js +112 -116
  164. package/dist/features/preview/components/PageNavigatorHeader.js +24 -0
  165. package/dist/features/preview/components/PageNicknameField.js +22 -26
  166. package/dist/features/preview/components/PagePicker.js +128 -130
  167. package/dist/features/preview/components/PageTree.js +525 -532
  168. package/dist/features/preview/components/PreviewActivation.js +28 -32
  169. package/dist/features/preview/components/PreviewPanel.js +620 -319
  170. package/dist/features/preview/components/PreviewToolbar.js +105 -333
  171. package/dist/features/preview/components/RecordCard.js +80 -0
  172. package/dist/features/preview/components/RecordCombobox.js +178 -0
  173. package/dist/features/preview/components/ReferenceFieldEditor.js +149 -0
  174. package/dist/features/preview/components/ReferenceListFieldEditor.js +432 -0
  175. package/dist/features/preview/components/RemovedBlockPlaceholder.js +95 -0
  176. package/dist/features/preview/components/RepeatableItemsList.js +125 -138
  177. package/dist/features/preview/components/SelectionEditor.js +993 -0
  178. package/dist/features/preview/components/ShikiMarkdown.js +14 -18
  179. package/dist/features/preview/components/SidebarSection.js +52 -64
  180. package/dist/features/preview/components/StudioEditingFallback.js +56 -0
  181. package/dist/features/preview/components/UnlinkAssetButton.js +104 -107
  182. package/dist/features/preview/components/blockGridNavigation.js +15 -0
  183. package/dist/features/preview/components/contentFieldSchema.js +8 -0
  184. package/dist/features/preview/components/useFieldWriter.js +200 -0
  185. package/dist/features/preview/components/useRecordView.js +383 -0
  186. package/dist/features/preview/components/useRepeatableItemActions.js +35 -37
  187. package/dist/features/preview/components/useUpdateBlockPosition.js +37 -37
  188. package/dist/features/preview/editingFrame.js +197 -0
  189. package/dist/features/preview/overlayHighlights.js +17 -44
  190. package/dist/features/preview/overlayMessages.js +72 -1
  191. package/dist/features/preview/pageRecord.js +189 -0
  192. package/dist/features/preview/previewConstants.js +6 -2
  193. package/dist/features/preview/previewPageFrame.js +95 -0
  194. package/dist/features/preview/previewPreparation.js +7 -0
  195. package/dist/features/preview/previewSelection.js +32 -63
  196. package/dist/features/preview/previewStore.js +225 -123
  197. package/dist/features/preview/referencePickerFocus.js +29 -0
  198. package/dist/features/preview/repeatableItemTargets.js +56 -0
  199. package/dist/features/preview/selectionReveal.js +21 -0
  200. package/dist/features/preview/usePreviewViewportActions.js +114 -0
  201. package/dist/features/preview/viewportContinuity.js +109 -0
  202. package/dist/features/provider/AuthenticatedCamoxProvider.js +69 -44
  203. package/dist/features/provider/CamoxProvider.d.ts +3 -6
  204. package/dist/features/provider/CamoxProvider.js +38 -50
  205. package/dist/features/provider/CoreCamoxProvider.js +66 -50
  206. package/dist/features/provider/LocalhostPreviewProvider.js +78 -114
  207. package/dist/features/provider/PreviewSignInPage.js +54 -0
  208. package/dist/features/provider/components/CamoxAppContext.js +11 -11
  209. package/dist/features/provider/components/CommandPalette.js +75 -82
  210. package/dist/features/provider/useAdminShortcuts.js +7 -11
  211. package/dist/features/routes/pageRuntime.d.ts +44 -4
  212. package/dist/features/routes/pageRuntime.js +244 -137
  213. package/dist/features/runtime/RuntimeChrome.js +117 -115
  214. package/dist/features/runtime/alternates.js +64 -0
  215. package/dist/features/runtime/analytics.d.ts +7 -0
  216. package/dist/features/runtime/analytics.js +66 -0
  217. package/dist/features/runtime/artifactSources.js +87 -0
  218. package/dist/features/runtime/editingFallback.js +20 -0
  219. package/dist/features/runtime/linkPrefetch.js +97 -0
  220. package/dist/features/runtime/livePages.js +62 -0
  221. package/dist/features/runtime/llmsTxt.js +40 -0
  222. package/dist/features/runtime/loopbackFetch.js +18 -0
  223. package/dist/features/runtime/navigationAccessibility.js +51 -0
  224. package/dist/features/runtime/navigationTarget.js +23 -2
  225. package/dist/features/runtime/pageApp.js +229 -158
  226. package/dist/features/runtime/pageBlockTypes.js +20 -0
  227. package/dist/features/runtime/pageClient.d.ts +2 -4
  228. package/dist/features/runtime/pageClient.js +18 -3
  229. package/dist/features/runtime/pageNavigation.js +254 -32
  230. package/dist/features/runtime/pageServer.d.ts +2 -4
  231. package/dist/features/runtime/pageServer.js +6 -2
  232. package/dist/features/runtime/pageViewport.js +7 -0
  233. package/dist/features/runtime/runtime.d.ts +59 -24
  234. package/dist/features/runtime/runtime.js +779 -191
  235. package/dist/features/runtime/runtimeChromeLoader.js +58 -0
  236. package/dist/features/runtime/runtimeRoutes.d.ts +19 -0
  237. package/dist/features/runtime/runtimeRoutes.js +25 -0
  238. package/dist/features/runtime/scrollRestoration.js +133 -0
  239. package/dist/features/runtime/studioApp.d.ts +4 -3
  240. package/dist/features/runtime/studioApp.js +5 -9
  241. package/dist/features/runtime/studioClient.d.ts +2 -4
  242. package/dist/features/runtime/studioClient.js +12 -3
  243. package/dist/features/runtime/studioServer.d.ts +2 -4
  244. package/dist/features/runtime/studioServer.js +6 -1
  245. package/dist/features/runtime/worker.d.ts +6 -0
  246. package/dist/features/runtime/worker.js +23 -0
  247. package/dist/features/runtime/workerRequest.js +44 -0
  248. package/dist/features/studio/CamoxStudio.d.ts +2 -6
  249. package/dist/features/studio/CamoxStudio.js +34 -49
  250. package/dist/features/studio/FollowAgentProvider.js +338 -0
  251. package/dist/features/studio/components/ChatSidebar.js +356 -0
  252. package/dist/features/studio/components/DraftsControl.js +676 -0
  253. package/dist/features/studio/components/FaviconDialog.js +318 -0
  254. package/dist/features/studio/components/LocalePicker.js +785 -0
  255. package/dist/features/studio/components/Navbar.js +123 -103
  256. package/dist/features/studio/components/ProjectMenu.js +239 -260
  257. package/dist/features/studio/components/RenameDraftDialog.js +206 -0
  258. package/dist/features/studio/components/ReviewDraftSheet.js +1472 -0
  259. package/dist/features/studio/components/ThreadComposer.js +157 -0
  260. package/dist/features/studio/components/ThreadMarkdown.js +113 -0
  261. package/dist/features/studio/components/ThreadMessages.js +270 -0
  262. package/dist/features/studio/components/UserButton.js +34 -23
  263. package/dist/features/studio/draftLabel.js +33 -0
  264. package/dist/features/studio/draftNotice.js +13 -0
  265. package/dist/features/studio/followAgent.js +250 -0
  266. package/dist/features/studio/followAgentContext.js +7 -0
  267. package/dist/features/studio/localeOptions.js +118 -0
  268. package/dist/features/studio/localeSwitch.js +19 -0
  269. package/dist/features/studio/routes.js +48 -1
  270. package/dist/features/studio/studioStore.js +64 -1
  271. package/dist/features/studio/useTheme.js +24 -27
  272. package/dist/features/vite/artifactRuntimeMinification.js +36 -0
  273. package/dist/features/vite/blockBoilerplate.js +6 -5
  274. package/dist/features/vite/blockChunks.js +31 -0
  275. package/dist/features/vite/bundlerLogs.js +17 -0
  276. package/dist/features/vite/definitionsSync.js +158 -226
  277. package/dist/features/vite/devAuthentication.js +4 -16
  278. package/dist/features/vite/devSignIn.js +87 -0
  279. package/dist/features/vite/iconGeneration.js +1 -1
  280. package/dist/features/vite/layoutGeneration.js +11 -1
  281. package/dist/features/vite/publishSeededContent.js +30 -0
  282. package/dist/features/vite/routeGeneration.js +6 -7
  283. package/dist/features/vite/runtimeDev.js +80 -99
  284. package/dist/features/vite/vite.d.ts +51 -31
  285. package/dist/features/vite/vite.js +224 -127
  286. package/dist/features/vite/workerBuild.js +39 -0
  287. package/dist/hooks/use-debounced-field.js +116 -47
  288. package/dist/hooks/use-file-upload.js +114 -67
  289. package/dist/hooks/use-marquee-selection.js +32 -36
  290. package/dist/hooks/use-page-destinations.js +69 -37
  291. package/dist/lib/api-client-server.d.ts +5 -0
  292. package/dist/lib/api-client-server.js +10 -4
  293. package/dist/lib/api-client.d.ts +6 -0
  294. package/dist/lib/api-client.js +51 -16
  295. package/dist/lib/api-socket.js +17 -0
  296. package/dist/lib/auth-page-styles.js +39 -0
  297. package/dist/lib/auth.js +117 -61
  298. package/dist/lib/collection-cache.js +23 -0
  299. package/dist/lib/draft-scope.d.ts +4 -0
  300. package/dist/lib/draft-scope.js +222 -0
  301. package/dist/lib/html.js +12 -0
  302. package/dist/lib/link-pages.js +154 -0
  303. package/dist/lib/locale-path.d.ts +22 -0
  304. package/dist/lib/locale-path.js +57 -0
  305. package/dist/lib/normalized-data.js +252 -152
  306. package/dist/lib/preview-handoff.js +2 -2
  307. package/dist/lib/queries.d.ts +11 -0
  308. package/dist/lib/queries.js +70 -141
  309. package/dist/lib/studio-reads.d.ts +14 -0
  310. package/dist/lib/studio-reads.js +574 -0
  311. package/dist/lib/use-project-room.js +50 -50
  312. package/dist/lib/use-thread.js +310 -0
  313. package/dist/lib/utils.js +25 -29
  314. package/dist/lib/view-locale-context.js +22 -0
  315. package/dist/lib/view-locale.js +46 -0
  316. package/dist/package.js +5 -0
  317. package/dist/studio-overlays.css +41 -151
  318. package/dist/studio.css +2 -2
  319. package/package.json +70 -73
  320. package/skills/camox/SKILL.md +16 -11
  321. package/skills/camox/references/artifacts.md +179 -0
  322. package/skills/camox/references/block-definitions.md +75 -59
  323. package/skills/camox/references/cli-common.md +9 -11
  324. package/skills/camox/references/cli-content.md +92 -69
  325. package/skills/camox/references/cli-publishing.md +26 -0
  326. package/skills/camox/references/dom-integrations.md +27 -0
  327. package/skills/camox/references/field-styling.md +4 -4
  328. package/skills/camox/references/layout-definitions.md +16 -14
  329. package/skills/camox/references/localization.md +56 -0
  330. package/skills/camox/references/routed-layouts.md +133 -15
  331. package/skills/camox-expand/SKILL.md +69 -0
  332. package/skills/camox-expand/references/jobs.md +39 -0
  333. package/skills/camoxify/SKILL.md +29 -7
  334. package/dist/core/components/AddBlockControlBar.js +0 -78
  335. package/dist/core/hooks/useRequireDraftSource.js +0 -23
  336. package/dist/features/metadata/sitemap.d.ts +0 -8
  337. package/dist/features/metadata/sitemap.js +0 -17
  338. package/dist/features/og/imageResponse.node.d.ts +0 -12
  339. package/dist/features/og/imageResponse.node.js +0 -49
  340. package/dist/features/og/imageResponse.workerd.d.ts +0 -12
  341. package/dist/features/og/imageResponse.workerd.js +0 -40
  342. package/dist/features/page/PublishedPageContent.js +0 -205
  343. package/dist/features/page/PublishedPageExperience.js +0 -23
  344. package/dist/features/preview/DerivedPreview.js +0 -134
  345. package/dist/features/preview/commentsEnabled.js +0 -8
  346. package/dist/features/preview/components/AddBlockSidebar.js +0 -381
  347. package/dist/features/preview/components/AttachedComments.js +0 -331
  348. package/dist/features/preview/components/CommentHeader.js +0 -122
  349. package/dist/features/preview/components/CommentSidebar.js +0 -29
  350. package/dist/features/preview/components/CommentTargetQuote.js +0 -167
  351. package/dist/features/preview/components/DerivedLayoutSidebar.d.ts +0 -5
  352. package/dist/features/preview/components/DerivedLayoutSidebar.js +0 -179
  353. package/dist/features/preview/components/DerivedPageInfoSidebar.js +0 -69
  354. package/dist/features/preview/components/LeftSidebar.js +0 -68
  355. package/dist/features/preview/components/PageEditorSidebar.js +0 -563
  356. package/dist/features/preview/components/PageInfoSidebar.js +0 -1551
  357. package/dist/features/preview/components/PageNavigatorSidebar.js +0 -78
  358. package/dist/features/preview/components/PageStatusBadge.js +0 -97
  359. package/dist/features/preview/components/PeekedBlock.js +0 -217
  360. package/dist/features/preview/components/PreviewComments.js +0 -56
  361. package/dist/features/preview/components/PreviewToolbarSpacer.js +0 -43
  362. package/dist/features/preview/components/PublicationRow.js +0 -422
  363. package/dist/features/preview/components/PublishDialog.js +0 -194
  364. package/dist/features/preview/components/RightSidebar.js +0 -59
  365. package/dist/features/preview/components/SendFeedbackDialog.js +0 -83
  366. package/dist/features/preview/previewCommentsStore.js +0 -135
  367. package/dist/features/preview/publication.js +0 -81
  368. package/dist/features/preview/usePageComments.js +0 -39
  369. package/dist/features/runtime/SharedChromeContext.js +0 -7
  370. package/dist/features/studio/components/EnvironmentMenu.js +0 -425
  371. package/dist/features/vite/appGeneration.js +0 -89
  372. package/dist/lib/view-queries.js +0 -28
  373. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/Matches.d.ts +0 -114
  374. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/RouterProvider.d.ts +0 -25
  375. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/config.d.ts +0 -1
  376. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/defer.d.ts +0 -1
  377. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/fileRoute.d.ts +0 -20
  378. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/global.d.ts +0 -8
  379. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/hash-scroll.d.ts +0 -1
  380. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/index.d.ts +0 -18
  381. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/link.d.ts +0 -161
  382. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/load-matches.d.ts +0 -6
  383. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/location.d.ts +0 -54
  384. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/lru-cache.d.ts +0 -8
  385. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/manifest.d.ts +0 -32
  386. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/new-process-route-tree.d.ts +0 -115
  387. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/not-found.d.ts +0 -1
  388. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/redirect.d.ts +0 -49
  389. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/rewrite.d.ts +0 -1
  390. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/root.d.ts +0 -6
  391. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/route.d.ts +0 -343
  392. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/routeInfo.d.ts +0 -48
  393. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/router.d.ts +0 -695
  394. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/scroll-restoration.d.ts +0 -1
  395. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchMiddleware.d.ts +0 -1
  396. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchParams.d.ts +0 -5
  397. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/RawStream.d.ts +0 -38
  398. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/seroval-plugins.d.ts +0 -1
  399. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/transformer.d.ts +0 -65
  400. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/stores.d.ts +0 -69
  401. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/structuralSharing.d.ts +0 -1
  402. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/typePrimitives.d.ts +0 -1
  403. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderData.d.ts +0 -1
  404. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderDeps.d.ts +0 -1
  405. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useNavigate.d.ts +0 -10
  406. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useParams.d.ts +0 -1
  407. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useRouteContext.d.ts +0 -1
  408. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useSearch.d.ts +0 -1
  409. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/utils.d.ts +0 -28
  410. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/validators.d.ts +0 -49
  411. package/skills/camox/references/cli-environments.md +0 -37
@@ -1,10 +1,12 @@
1
1
  import "../../provider/components/CamoxAppContext.js";
2
+ import "../../../lib/studio-reads.js";
2
3
  import { repeatableItemMutations } from "../../../lib/queries.js";
3
- import { previewStore } from "../previewStore.js";
4
- import { useRequireDraftSource } from "../../../core/hooks/useRequireDraftSource.js";
4
+ import { previewStore, sameEditingOwner } from "../previewStore.js";
5
+ import { PreviewEditingOwnerContext } from "../previewSelection.js";
5
6
  import { c } from "react/compiler-runtime";
6
- import { useMutation, useQuery } from "@tanstack/react-query";
7
+ import * as React from "react";
7
8
  import { generateKeyBetween } from "fractional-indexing";
9
+ import { useMutation } from "@tanstack/react-query";
8
10
 
9
11
  //#region src/features/preview/components/useRepeatableItemActions.ts
10
12
  const buildDefaultContent = (itemProperties) => {
@@ -51,32 +53,28 @@ const buildNestedItemSeeds = (itemProperties) => {
51
53
  return seeds;
52
54
  };
53
55
  const useRepeatableItemActions = (t0) => {
54
- const $ = c(18);
55
- if ($[0] !== "16e9f8f4b1a1e8d41d093c0930e510d6bea72e481f78c01b1ca1e595bec9f4cb") {
56
- for (let $i = 0; $i < 18; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
57
- $[0] = "16e9f8f4b1a1e8d41d093c0930e510d6bea72e481f78c01b1ca1e595bec9f4cb";
58
- }
56
+ const $ = c(16);
59
57
  const { blockId, fieldName, parentItemId, arraySchema, siblingCount } = t0;
58
+ const owner = React.useContext(PreviewEditingOwnerContext);
60
59
  let t1;
61
- if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
60
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
62
61
  t1 = repeatableItemMutations.create();
63
- $[1] = t1;
64
- } else t1 = $[1];
62
+ $[0] = t1;
63
+ } else t1 = $[0];
65
64
  const createRepeatableItem = useMutation(t1);
66
65
  let t2;
67
- if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
66
+ if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
68
67
  t2 = repeatableItemMutations.delete();
69
- $[2] = t2;
70
- } else t2 = $[2];
68
+ $[1] = t2;
69
+ } else t2 = $[1];
71
70
  const deleteRepeatableItem = useMutation(t2);
72
- const requireDraft = useRequireDraftSource();
73
71
  const canAdd = arraySchema != null && (arraySchema.maxItems === void 0 || siblingCount < arraySchema.maxItems);
74
72
  const canRemove = arraySchema != null && (arraySchema.minItems === void 0 || siblingCount > arraySchema.minItems);
75
73
  let t3;
76
- if ($[3] !== arraySchema || $[4] !== blockId || $[5] !== createRepeatableItem || $[6] !== fieldName || $[7] !== parentItemId || $[8] !== requireDraft) {
74
+ if ($[2] !== arraySchema || $[3] !== blockId || $[4] !== createRepeatableItem || $[5] !== fieldName || $[6] !== owner || $[7] !== parentItemId) {
77
75
  t3 = (options) => {
76
+ if (owner === null) return;
78
77
  if (!arraySchema) return;
79
- if (!requireDraft()) return;
80
78
  const itemsSchema = arraySchema.items;
81
79
  const defaultContent = buildDefaultContent(itemsSchema?.properties);
82
80
  const defaultSettings = arraySchema.defaultItemSettings;
@@ -90,47 +88,47 @@ const useRepeatableItemActions = (t0) => {
90
88
  nestedItems: nestedItems.length > 0 ? nestedItems : void 0,
91
89
  afterPosition: options?.afterPosition
92
90
  }, { onSuccess: (created) => {
91
+ if (!sameEditingOwner(previewStore.getSnapshot().context.editingContext, owner)) return;
93
92
  previewStore.send({
94
93
  type: "selectItem",
94
+ ...owner,
95
95
  blockId,
96
96
  itemId: created.id
97
97
  });
98
98
  } });
99
99
  };
100
- $[3] = arraySchema;
101
- $[4] = blockId;
102
- $[5] = createRepeatableItem;
103
- $[6] = fieldName;
100
+ $[2] = arraySchema;
101
+ $[3] = blockId;
102
+ $[4] = createRepeatableItem;
103
+ $[5] = fieldName;
104
+ $[6] = owner;
104
105
  $[7] = parentItemId;
105
- $[8] = requireDraft;
106
- $[9] = t3;
107
- } else t3 = $[9];
106
+ $[8] = t3;
107
+ } else t3 = $[8];
108
108
  const addItem = t3;
109
109
  let t4;
110
- if ($[10] !== deleteRepeatableItem || $[11] !== requireDraft) {
110
+ if ($[9] !== deleteRepeatableItem) {
111
111
  t4 = (itemId, options_0) => {
112
- if (!requireDraft()) return;
113
112
  deleteRepeatableItem.mutate({ id: itemId }, { onSuccess: options_0?.onSuccess });
114
113
  };
115
- $[10] = deleteRepeatableItem;
116
- $[11] = requireDraft;
117
- $[12] = t4;
118
- } else t4 = $[12];
114
+ $[9] = deleteRepeatableItem;
115
+ $[10] = t4;
116
+ } else t4 = $[10];
119
117
  const removeItem = t4;
120
118
  let t5;
121
- if ($[13] !== addItem || $[14] !== canAdd || $[15] !== canRemove || $[16] !== removeItem) {
119
+ if ($[11] !== addItem || $[12] !== canAdd || $[13] !== canRemove || $[14] !== removeItem) {
122
120
  t5 = {
123
121
  canAdd,
124
122
  addItem,
125
123
  canRemove,
126
124
  removeItem
127
125
  };
128
- $[13] = addItem;
129
- $[14] = canAdd;
130
- $[15] = canRemove;
131
- $[16] = removeItem;
132
- $[17] = t5;
133
- } else t5 = $[17];
126
+ $[11] = addItem;
127
+ $[12] = canAdd;
128
+ $[13] = canRemove;
129
+ $[14] = removeItem;
130
+ $[15] = t5;
131
+ } else t5 = $[15];
134
132
  return t5;
135
133
  };
136
134
 
@@ -1,39 +1,41 @@
1
- import { useLocation } from "../../navigation/navigation.js";
1
+ import { useProjectUuid } from "../../../lib/auth.js";
2
+ import { reads, useStudioCache } from "../../../lib/studio-reads.js";
2
3
  import { blockMutations } from "../../../lib/queries.js";
4
+ import { useLocalePath } from "../../../lib/view-locale.js";
3
5
  import { c } from "react/compiler-runtime";
4
- import { useMutation, useQueryClient } from "@tanstack/react-query";
5
6
  import { generateKeyBetween } from "fractional-indexing";
6
- import { queryKeys } from "@camox/api-contract/query-keys";
7
+ import { useMutation } from "@tanstack/react-query";
7
8
 
8
9
  //#region src/features/preview/components/useUpdateBlockPosition.ts
9
10
  function useUpdateBlockPosition() {
10
11
  const $ = c(5);
11
- if ($[0] !== "fed14916f5b55681b4a767606bad92ee9c3a074376e24f2981a9af1a6551ad97") {
12
- for (let $i = 0; $i < 5; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
13
- $[0] = "fed14916f5b55681b4a767606bad92ee9c3a074376e24f2981a9af1a6551ad97";
14
- }
15
- const queryClient = useQueryClient();
16
- const { pathname } = useLocation();
12
+ const studioCache = useStudioCache();
13
+ const projectUuid = useProjectUuid();
14
+ const pathname = useLocalePath();
17
15
  let t0;
18
- if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
16
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
19
17
  t0 = blockMutations.updatePosition();
20
- $[1] = t0;
21
- } else t0 = $[1];
18
+ $[0] = t0;
19
+ } else t0 = $[0];
22
20
  let t1;
23
- if ($[2] !== pathname || $[3] !== queryClient) {
21
+ if ($[1] !== pathname || $[2] !== projectUuid || $[3] !== studioCache) {
24
22
  t1 = {
25
23
  ...t0,
26
24
  onMutate: (variables) => {
27
- const pageQueryKey = queryKeys.pages.getByPath(pathname, "draft");
28
- const previousPage = queryClient.getQueryData(pageQueryKey);
29
- if (!previousPage) return {};
25
+ const edit = studioCache.edit();
26
+ const page = reads.pageStructure({
27
+ path: pathname,
28
+ projectUuid
29
+ });
30
+ const previousPage = edit.get(page);
31
+ if (!previousPage) return { edit };
30
32
  const newPosition = generateKeyBetween(variables.afterPosition ?? null, variables.beforePosition ?? null);
31
- const blockKey = queryKeys.blocks.get(variables.id, "draft");
32
- const prevBundle = queryClient.getQueryData(blockKey);
33
- if (prevBundle) queryClient.setQueryData(blockKey, {
34
- ...prevBundle,
33
+ const moved = reads.blockBundle(variables.id);
34
+ const movedBundle = edit.get(moved);
35
+ if (movedBundle) edit.set(moved, {
36
+ ...movedBundle,
35
37
  block: {
36
- ...prevBundle.block,
38
+ ...movedBundle.block,
37
39
  position: newPosition
38
40
  }
39
41
  });
@@ -41,7 +43,7 @@ function useUpdateBlockPosition() {
41
43
  const positions = /* @__PURE__ */ new Map();
42
44
  for (const id of blockIds) if (id === variables.id) positions.set(id, newPosition);
43
45
  else {
44
- const bundle = queryClient.getQueryData(queryKeys.blocks.get(id, "draft"));
46
+ const bundle = edit.get(reads.blockBundle(id));
45
47
  if (bundle) positions.set(id, bundle.block.position);
46
48
  }
47
49
  const sortedIds = [...blockIds].sort((a, b) => {
@@ -49,33 +51,31 @@ function useUpdateBlockPosition() {
49
51
  const posB = positions.get(b) ?? "";
50
52
  return posA.localeCompare(posB);
51
53
  });
52
- queryClient.setQueryData(pageQueryKey, {
54
+ edit.set(page, {
53
55
  ...previousPage,
54
56
  page: {
55
57
  ...previousPage.page,
56
58
  blockIds: sortedIds
57
59
  }
58
60
  });
59
- queryClient.cancelQueries({ queryKey: pageQueryKey });
60
- return {
61
- previousPage,
62
- prevBundle
63
- };
64
- },
65
- onError: (_error, variables_0, context) => {
66
- if (context?.previousPage) queryClient.setQueryData(queryKeys.pages.getByPath(pathname, "draft"), context.previousPage);
67
- if (context?.prevBundle) queryClient.setQueryData(queryKeys.blocks.get(variables_0.id, "draft"), context.prevBundle);
61
+ return { edit };
68
62
  },
69
- onSettled: () => {
70
- queryClient.invalidateQueries({ queryKey: queryKeys.pages.getByPath(pathname, "draft") });
71
- }
63
+ onError: _temp,
64
+ onSettled: _temp2
72
65
  };
73
- $[2] = pathname;
74
- $[3] = queryClient;
66
+ $[1] = pathname;
67
+ $[2] = projectUuid;
68
+ $[3] = studioCache;
75
69
  $[4] = t1;
76
70
  } else t1 = $[4];
77
71
  return useMutation(t1);
78
72
  }
73
+ function _temp2(_data, _error_0, _variables_0, context_0) {
74
+ return context_0?.edit.settle();
75
+ }
76
+ function _temp(_error, _variables, context) {
77
+ return context?.edit.rollback();
78
+ }
79
79
 
80
80
  //#endregion
81
81
  export { useUpdateBlockPosition };
@@ -0,0 +1,197 @@
1
+ import { previewStore } from "./previewStore.js";
2
+ import { c } from "react/compiler-runtime";
3
+ import * as React from "react";
4
+ import { useSelector } from "@xstate/store-react";
5
+ import { createStore as createStore$1 } from "@xstate/store";
6
+
7
+ //#region src/features/preview/editingFrame.ts
8
+ const editingFrameStore = createStore$1({
9
+ context: { claim: null },
10
+ on: {
11
+ claim: (_, claim) => ({ claim }),
12
+ release: () => ({ claim: null })
13
+ }
14
+ });
15
+ function holds(holder) {
16
+ return editingFrameStore.getSnapshot().context.claim?.holder === holder;
17
+ }
18
+ function claim(holder, frame, owner) {
19
+ editingFrameStore.send({
20
+ type: "claim",
21
+ holder,
22
+ frame
23
+ });
24
+ if (owner?.kind === "layout") {
25
+ previewStore.send({
26
+ type: "activateLayout",
27
+ layoutId: owner.layoutId
28
+ });
29
+ return;
30
+ }
31
+ previewStore.send({
32
+ type: "activatePage",
33
+ pageId: owner?.pageId ?? null
34
+ });
35
+ }
36
+ function release(holder) {
37
+ if (!holds(holder)) return;
38
+ editingFrameStore.send({ type: "release" });
39
+ previewStore.send({ type: "clearSelection" });
40
+ }
41
+ /**
42
+ * The owner a frame edits. A derived layout's pages have no page row, so they edit
43
+ * their layout; any other Page edits itself.
44
+ */
45
+ function useEditingOwner(t0) {
46
+ const $ = c(4);
47
+ const { pageId, layoutId } = t0;
48
+ let t1;
49
+ bb0: {
50
+ if (layoutId != null) {
51
+ let t2;
52
+ if ($[0] !== layoutId) {
53
+ t2 = {
54
+ kind: "layout",
55
+ layoutId
56
+ };
57
+ $[0] = layoutId;
58
+ $[1] = t2;
59
+ } else t2 = $[1];
60
+ t1 = t2;
61
+ break bb0;
62
+ }
63
+ if (pageId != null) {
64
+ let t2;
65
+ if ($[2] !== pageId) {
66
+ t2 = {
67
+ kind: "page",
68
+ pageId
69
+ };
70
+ $[2] = pageId;
71
+ $[3] = t2;
72
+ } else t2 = $[3];
73
+ t1 = t2;
74
+ break bb0;
75
+ }
76
+ t1 = null;
77
+ }
78
+ return t1;
79
+ }
80
+ /**
81
+ * For the Preview and the Canvas: returns a stable `claim`, which makes `frame`
82
+ * the editing frame, for `owner`, and returns its release. Call it from effects
83
+ * and handlers, never while rendering.
84
+ *
85
+ * The claim follows `frame` while it is active, so it may be made before the frame
86
+ * loads. Unmounting releases it.
87
+ */
88
+ function useEditingFrameClaim(frame, owner) {
89
+ const $ = c(15);
90
+ const [holder] = React.useState(_temp);
91
+ let t0;
92
+ if ($[0] !== frame || $[1] !== owner) {
93
+ t0 = {
94
+ frame,
95
+ owner
96
+ };
97
+ $[0] = frame;
98
+ $[1] = owner;
99
+ $[2] = t0;
100
+ } else t0 = $[2];
101
+ const latest = React.useRef(t0);
102
+ let t1;
103
+ if ($[3] !== frame || $[4] !== owner) {
104
+ t1 = () => {
105
+ latest.current = {
106
+ frame,
107
+ owner
108
+ };
109
+ };
110
+ $[3] = frame;
111
+ $[4] = owner;
112
+ $[5] = t1;
113
+ } else t1 = $[5];
114
+ React.useLayoutEffect(t1);
115
+ let t2;
116
+ let t3;
117
+ if ($[6] !== frame || $[7] !== holder) {
118
+ t2 = () => {
119
+ if (!holds(holder)) return;
120
+ editingFrameStore.send({
121
+ type: "claim",
122
+ holder,
123
+ frame
124
+ });
125
+ };
126
+ t3 = [holder, frame];
127
+ $[6] = frame;
128
+ $[7] = holder;
129
+ $[8] = t2;
130
+ $[9] = t3;
131
+ } else {
132
+ t2 = $[8];
133
+ t3 = $[9];
134
+ }
135
+ React.useLayoutEffect(t2, t3);
136
+ let t4;
137
+ let t5;
138
+ if ($[10] !== holder) {
139
+ t4 = () => () => release(holder);
140
+ t5 = [holder];
141
+ $[10] = holder;
142
+ $[11] = t4;
143
+ $[12] = t5;
144
+ } else {
145
+ t4 = $[11];
146
+ t5 = $[12];
147
+ }
148
+ React.useLayoutEffect(t4, t5);
149
+ let t6;
150
+ if ($[13] !== holder) {
151
+ t6 = () => {
152
+ claim(holder, latest.current.frame, latest.current.owner);
153
+ return () => release(holder);
154
+ };
155
+ $[13] = holder;
156
+ $[14] = t6;
157
+ } else t6 = $[14];
158
+ return t6;
159
+ }
160
+ function _temp() {
161
+ return Symbol("editing frame claim");
162
+ }
163
+ /**
164
+ * For everything else: the editing frame's document, if any, and `send`, which
165
+ * posts an overlay message to it. Sending without an editing frame does nothing.
166
+ * `send` changes with the editing frame, so an effect's cleanup reaches the frame
167
+ * its effect sent to.
168
+ */
169
+ function useEditingFrame() {
170
+ const $ = c(5);
171
+ const frame = useSelector(editingFrameStore, _temp2);
172
+ let t0;
173
+ if ($[0] !== frame?.contentWindow) {
174
+ t0 = (message) => frame?.contentWindow?.postMessage(message, "*");
175
+ $[0] = frame?.contentWindow;
176
+ $[1] = t0;
177
+ } else t0 = $[1];
178
+ const send = t0;
179
+ const t1 = frame?.contentDocument ?? null;
180
+ let t2;
181
+ if ($[2] !== send || $[3] !== t1) {
182
+ t2 = {
183
+ document: t1,
184
+ send
185
+ };
186
+ $[2] = send;
187
+ $[3] = t1;
188
+ $[4] = t2;
189
+ } else t2 = $[4];
190
+ return t2;
191
+ }
192
+ function _temp2(state) {
193
+ return state.context.claim?.frame ?? null;
194
+ }
195
+
196
+ //#endregion
197
+ export { useEditingFrame, useEditingFrameClaim, useEditingOwner };
@@ -1,54 +1,27 @@
1
1
  //#region src/features/preview/overlayHighlights.ts
2
- const states = ["hovered", "focused"];
3
- /** Detached borders represent their parent, not the portal div's DOM depth. */
4
- function targetOf(element) {
5
- return element.hasAttribute("data-camox-detached") ? element.parentElement ?? element : element;
6
- }
7
- function depthOf(element) {
8
- let depth = 0;
9
- for (let parent = element.parentElement; parent; parent = parent.parentElement) depth++;
10
- return depth;
11
- }
12
2
  /**
13
- * Local and remote interactions publish the same candidate attributes. Resolve
3
+ * Local and remote interactions publish the same candidate state. Resolve
14
4
  * them together, independently for hover and selection, before the browser paints.
15
- * Equal-depth candidates (e.g. a sidebar-hovered list) use document order.
5
+ * A repeater-level hover represents all items in that group, not just its deepest
6
+ * item. Individual targets still resolve by depth, with candidate order breaking ties.
16
7
  */
17
- function observeOverlayHighlights(document) {
18
- const Observer = document.defaultView?.MutationObserver;
19
- if (!Observer) return () => {};
20
- const winners = /* @__PURE__ */ new Map();
21
- const update = () => {
22
- for (const state of states) {
23
- let winner;
24
- let deepest = -1;
25
- for (const candidate of document.querySelectorAll(`[data-camox-${state}]`)) {
26
- const depth = depthOf(targetOf(candidate));
27
- if (depth <= deepest) continue;
28
- deepest = depth;
29
- winner = candidate;
30
- }
31
- const previous = winners.get(state);
32
- if (previous === winner) continue;
33
- previous?.removeAttribute(`data-camox-highlight-${state}`);
34
- winner?.setAttribute(`data-camox-highlight-${state}`, "");
35
- if (winner) winners.set(state, winner);
36
- else winners.delete(state);
8
+ function resolveOverlayHighlights(candidates) {
9
+ const resolve = (state) => {
10
+ let winner;
11
+ for (const candidate of candidates) {
12
+ if (!candidate[state]) continue;
13
+ if (winner && candidate.depth <= winner.depth) continue;
14
+ winner = candidate;
37
15
  }
16
+ const group = state === "hovered" ? winner?.hoverGroup : null;
17
+ if (!group) return new Set(winner ? [winner] : []);
18
+ return new Set(candidates.filter((candidate) => candidate[state] && candidate.hoverGroup === group));
38
19
  };
39
- const observer = new Observer(update);
40
- observer.observe(document, {
41
- subtree: true,
42
- childList: true,
43
- attributes: true,
44
- attributeFilter: states.map((state) => `data-camox-${state}`)
45
- });
46
- update();
47
- return () => {
48
- observer.disconnect();
49
- for (const [state, winner] of winners) winner.removeAttribute(`data-camox-highlight-${state}`);
20
+ return {
21
+ hovered: resolve("hovered"),
22
+ focused: resolve("focused")
50
23
  };
51
24
  }
52
25
 
53
26
  //#endregion
54
- export { observeOverlayHighlights };
27
+ export { resolveOverlayHighlights };
@@ -1,4 +1,75 @@
1
+ import { isBlockPlacement } from "./previewStore.js";
2
+
1
3
  //#region src/features/preview/overlayMessages.ts
4
+ /**
5
+ * The field ID shared by the preview's editable fields and the sidebar's hover/focus messages:
6
+ * `block__field` for block fields, `block__item__field` for repeater item fields, and
7
+ * the placement's ID followed by `__recordField` for the fields of a placed collection record.
8
+ * Record field IDs carry the record ID so that each record of a reference list is its own target.
9
+ */
10
+ function overlayFieldId(blockId, fieldName, scope = {}) {
11
+ if (scope.placement) return recordFieldId(scope.placement, fieldName);
12
+ if (scope.itemId != null) return `${blockId}__${scope.itemId}__${fieldName}`;
13
+ return `${blockId}__${fieldName}`;
14
+ }
15
+ /** The field ID of one field of a placed collection record. */
16
+ function recordFieldId(placement, recordFieldName) {
17
+ return `${recordPlacementId(placement)}__${recordFieldName}`;
18
+ }
19
+ /**
20
+ * The overlay ID of one placement of a record: `block__referenceField__record`, or
21
+ * `block__item__referenceField__record` when a repeatable item places it, or
22
+ * `layout-layoutId__record` when a layout renders it on a record page. Followed by
23
+ * `__recordField__linkedRecord` for a record that record links. Unique per record
24
+ * within a reference list, and distinct from the same record placed elsewhere.
25
+ */
26
+ function recordPlacementId(placement) {
27
+ const id = isBlockPlacement(placement) ? `${blockPlacementOwnerId(placement)}__${placement.fieldName}__${placement.recordId}` : `layout-${placement.layoutId}__${placement.recordId}`;
28
+ if (!placement.nested) return id;
29
+ return `${id}__${placement.nested.fieldName}__${placement.nested.recordId}`;
30
+ }
31
+ function blockPlacementOwnerId(placement) {
32
+ if (placement.itemId == null) return String(placement.blockId);
33
+ return `${placement.blockId}__${placement.itemId}`;
34
+ }
35
+ /** Use the same preview targets for selection-path hover as the sidebar editors. */
36
+ function selectionHoverMessage(selection, hovered) {
37
+ if (!selection) return { type: hovered ? "CAMOX_HOVER_PAGE" : "CAMOX_HOVER_PAGE_END" };
38
+ if (selection.type === "record") {
39
+ const fieldId = recordPlacementId(selection);
40
+ return {
41
+ type: hovered ? "CAMOX_HOVER_FIELD" : "CAMOX_HOVER_FIELD_END",
42
+ fieldId
43
+ };
44
+ }
45
+ if (selection.type === "record-field") {
46
+ const fieldId = recordFieldId(selection, selection.recordFieldName);
47
+ return {
48
+ type: hovered ? "CAMOX_HOVER_FIELD" : "CAMOX_HOVER_FIELD_END",
49
+ fieldId
50
+ };
51
+ }
52
+ const blockId = String(selection.blockId);
53
+ if (selection.type === "block") return {
54
+ type: hovered ? "CAMOX_HOVER_BLOCK" : "CAMOX_HOVER_BLOCK_END",
55
+ blockId
56
+ };
57
+ if (selection.type === "item") return {
58
+ type: hovered ? "CAMOX_HOVER_REPEATABLE_ITEM" : "CAMOX_HOVER_REPEATABLE_ITEM_END",
59
+ blockId,
60
+ itemId: String(selection.itemId)
61
+ };
62
+ if (selection.fieldType === "Repeater") return {
63
+ type: hovered ? "CAMOX_HOVER_REPEATER" : "CAMOX_HOVER_REPEATER_END",
64
+ blockId,
65
+ fieldName: selection.fieldName
66
+ };
67
+ const fieldId = overlayFieldId(blockId, selection.fieldName, { itemId: selection.type === "item-field" ? selection.itemId : null });
68
+ return {
69
+ type: hovered ? "CAMOX_HOVER_FIELD" : "CAMOX_HOVER_FIELD_END",
70
+ fieldId
71
+ };
72
+ }
2
73
  function isOverlayMessage(data) {
3
74
  return typeof data === "object" && data !== null && "type" in data && typeof data.type === "string" && data.type.startsWith("CAMOX_");
4
75
  }
@@ -7,4 +78,4 @@ function postOverlayMessage(message) {
7
78
  }
8
79
 
9
80
  //#endregion
10
- export { isOverlayMessage, postOverlayMessage };
81
+ export { isOverlayMessage, overlayFieldId, postOverlayMessage, recordFieldId, recordPlacementId, selectionHoverMessage };