camox 0.43.0 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (412) hide show
  1. package/bin/camox.mjs +9 -1
  2. package/dist/components/AuthGate.js +0 -6
  3. package/dist/components/DeviceSelector.js +96 -0
  4. package/dist/components/PlatformLabel.js +20 -24
  5. package/dist/core/components/lexical/HighlightNode.js +1 -1
  6. package/dist/core/components/lexical/InlineContentEditable.js +15 -19
  7. package/dist/core/components/lexical/InlineLexicalEditor.js +54 -74
  8. package/dist/core/components/lexical/InlineStylesPlugin.js +57 -41
  9. package/dist/core/components/lexical/MaxLengthPlugin.js +59 -0
  10. package/dist/core/components/lexical/SelectionBroadcaster.js +55 -56
  11. package/dist/core/components/lexical/SidebarLexicalEditor.js +327 -234
  12. package/dist/core/components/lexical/SummaryToggleGuard.js +42 -0
  13. package/dist/core/components/lexical/TextLinkPopover.js +169 -180
  14. package/dist/core/createApp.d.ts +254 -299
  15. package/dist/core/createApp.js +123 -29
  16. package/dist/core/createBlock.d.ts +5 -5
  17. package/dist/core/createBlock.js +399 -152
  18. package/dist/core/createCollection.d.ts +55 -0
  19. package/dist/core/createCollection.js +93 -0
  20. package/dist/core/createLayout.d.ts +197 -61
  21. package/dist/core/createLayout.js +114 -56
  22. package/dist/core/defineDocument.d.ts +3 -5
  23. package/dist/core/derivedRoutes.js +49 -1
  24. package/dist/core/dom.d.ts +13 -4
  25. package/dist/core/dom.js +44 -1
  26. package/dist/core/editing/BlockEditingRuntime.d.ts +16 -0
  27. package/dist/core/editing/BlockEditingRuntime.js +6 -15
  28. package/dist/core/editing/CompleteBlockEditingRuntime.js +28 -23
  29. package/dist/core/editing/createEditableBlock.d.ts +820 -565
  30. package/dist/core/editing/createEditableBlock.js +2153 -971
  31. package/dist/core/editing/referenceWrites.js +51 -0
  32. package/dist/core/editing/useLatestRecord.js +90 -0
  33. package/dist/core/hooks/useArtifactHost.js +139 -0
  34. package/dist/core/hooks/useFieldSelection.js +43 -18
  35. package/dist/core/hooks/useIsEditable.js +12 -10
  36. package/dist/core/hooks/useOverlayMessage.js +15 -19
  37. package/dist/core/lib/artifact.d.ts +21 -0
  38. package/dist/core/lib/artifact.js +154 -0
  39. package/dist/core/lib/artifactColors.js +123 -0
  40. package/dist/core/lib/artifactData.d.ts +1 -0
  41. package/dist/core/lib/artifactData.js +131 -0
  42. package/dist/core/lib/artifactHost.js +205 -0
  43. package/dist/core/lib/artifactRuntime.js +36 -0
  44. package/dist/core/lib/artifactTheme.js +57 -0
  45. package/dist/core/lib/contentType.d.ts +304 -103
  46. package/dist/core/lib/contentType.js +207 -168
  47. package/dist/core/lib/fieldTypes.js +4 -0
  48. package/dist/core/lib/iconTypes.d.ts +13 -0
  49. package/dist/core/lib/icons.d.ts +6 -0
  50. package/dist/core/lib/icons.js +126 -0
  51. package/dist/core/lib/imagePlaceholder.js +177 -0
  52. package/dist/core/lib/imageTransform.js +1 -1
  53. package/dist/core/lib/lexicalReact.d.ts +3 -1
  54. package/dist/core/lib/lexicalState.js +7 -7
  55. package/dist/core/lib/modifierFormats.js +1 -1
  56. package/dist/core/lib/previewPaused.js +9 -0
  57. package/dist/core/lib/recordScope.js +316 -0
  58. package/dist/core/lib/reference.d.ts +81 -0
  59. package/dist/core/lib/reference.js +29 -0
  60. package/dist/core/lib/textLinks.js +7 -5
  61. package/dist/core/lib/textStyles.d.ts +6 -8
  62. package/dist/core/lib/textStyles.js +5 -5
  63. package/dist/core/notFound.d.ts +7 -0
  64. package/dist/core/notFound.js +11 -0
  65. package/dist/core/pageDestinations.js +6 -3
  66. package/dist/core/recordItem.js +34 -0
  67. package/dist/core/requestContext.d.ts +26 -0
  68. package/dist/core/requestContext.js +20 -0
  69. package/dist/features/canvas/CamoxCanvas.js +1734 -0
  70. package/dist/features/canvas/CanvasBlockFrame.js +353 -0
  71. package/dist/features/canvas/CanvasBlockHeader.js +55 -0
  72. package/dist/features/canvas/CanvasLoadingScreen.js +35 -0
  73. package/dist/features/canvas/CanvasOverlays.js +254 -0
  74. package/dist/features/canvas/CanvasPageEdge.js +87 -0
  75. package/dist/features/canvas/CanvasPageFrame.js +335 -0
  76. package/dist/features/canvas/CanvasPageHeader.js +125 -0
  77. package/dist/features/canvas/CanvasPreviewPageSlot.js +103 -0
  78. package/dist/features/canvas/CanvasShelfMarker.js +255 -0
  79. package/dist/features/canvas/DerivedPagePathInput.js +238 -0
  80. package/dist/features/canvas/canvasCamera.js +229 -0
  81. package/dist/features/canvas/canvasFlight.js +104 -0
  82. package/dist/features/canvas/canvasFrameCapture.js +364 -0
  83. package/dist/features/canvas/canvasFrameDocument.js +317 -0
  84. package/dist/features/canvas/canvasFrameMode.js +53 -0
  85. package/dist/features/canvas/canvasInsertionSeams.js +44 -0
  86. package/dist/features/canvas/canvasItems.js +120 -0
  87. package/dist/features/canvas/canvasOverlayGeometry.js +240 -0
  88. package/dist/features/canvas/canvasPages.js +79 -0
  89. package/dist/features/canvas/canvasScreenSpace.js +26 -0
  90. package/dist/features/canvas/canvasSelection.js +18 -0
  91. package/dist/features/canvas/canvasStore.js +149 -0
  92. package/dist/features/canvas/canvasThumbnails.js +304 -0
  93. package/dist/features/canvas/canvasZoom.js +10 -0
  94. package/dist/features/canvas/sidebar/CanvasInspector.js +202 -0
  95. package/dist/features/canvas/sidebar/CanvasNavigator.js +226 -0
  96. package/dist/features/canvas/sidebar/CanvasSidebar.js +60 -0
  97. package/dist/features/canvas/sidebar/CanvasSidebarFrame.js +48 -0
  98. package/dist/features/canvas/sidebar/CanvasSidebarSkeleton.js +39 -0
  99. package/dist/features/canvas/sidebar/CatalogBlockInspector.js +189 -0
  100. package/dist/features/canvas/sidebar/CuratedPageInspector.js +69 -0
  101. package/dist/features/canvas/sidebar/DerivedPageInspector.js +37 -0
  102. package/dist/features/canvas/sidebar/LayoutPageBlocks.js +78 -0
  103. package/dist/features/canvas/sidebar/LayoutPageOverview.js +71 -0
  104. package/dist/features/canvas/sidebar/PageInspector.js +157 -0
  105. package/dist/features/canvas/sidebar/PageInspectorSkeleton.js +90 -0
  106. package/dist/features/canvas/sidebar/PageOverview.js +27 -0
  107. package/dist/features/canvas/sidebar/SingletonPageInspector.js +31 -0
  108. package/dist/features/canvas/useCanvasCamera.js +803 -0
  109. package/dist/features/canvas/useCanvasFrame.js +149 -0
  110. package/dist/features/canvas/useCanvasFrameInput.js +97 -0
  111. package/dist/features/canvas/useCanvasNearness.js +57 -0
  112. package/dist/features/canvas/useDiscoveredPreviewPaths.js +62 -0
  113. package/dist/features/content/CamoxContent.d.ts +2 -5
  114. package/dist/features/content/CamoxContent.js +174 -271
  115. package/dist/features/content/CollectionItemSheetContext.js +106 -0
  116. package/dist/features/content/ContentAssets.js +315 -0
  117. package/dist/features/content/ContentCollection.js +663 -0
  118. package/dist/features/content/collection-form.js +58 -0
  119. package/dist/features/content/components/AssetCard.js +101 -69
  120. package/dist/features/content/components/AssetCardSkeleton.js +4 -8
  121. package/dist/features/content/components/ContentSidebar.js +129 -18
  122. package/dist/features/content/components/ContentSidebarGroup.js +37 -0
  123. package/dist/features/content/components/DeleteCollectionItemButton.js +202 -0
  124. package/dist/features/content/components/MissingFromLocale.js +282 -0
  125. package/dist/features/content/components/UploadDropZone.js +27 -31
  126. package/dist/features/content/components/UploadProgressDrawer.js +90 -98
  127. package/dist/features/navigation/navigation.d.ts +66 -20
  128. package/dist/features/navigation/navigation.js +257 -90
  129. package/dist/features/og/defaultFonts.js +8 -8
  130. package/dist/features/og/geist-variable-ttf-base64.js +1 -1
  131. package/dist/features/og/imageResponse.d.ts +8 -0
  132. package/dist/features/og/imageResponse.js +26 -0
  133. package/dist/features/page/CuratedPageContent.js +167 -0
  134. package/dist/features/page/DerivedPageContent.js +26 -30
  135. package/dist/features/page/SharedLayoutContent.js +25 -27
  136. package/dist/features/preview/CamoxPreview.d.ts +23 -61
  137. package/dist/features/preview/CamoxPreview.js +811 -507
  138. package/dist/features/preview/EditablePageContent.js +1 -1
  139. package/dist/features/preview/EditablePageExperience.js +16 -22
  140. package/dist/features/preview/components/AddBlockDialog.js +270 -0
  141. package/dist/features/preview/components/AssetFieldEditor.js +173 -154
  142. package/dist/features/preview/components/AssetLightbox.js +194 -136
  143. package/dist/features/preview/components/AssetPickerModal.js +153 -170
  144. package/dist/features/preview/components/BlockActionsPopover.js +150 -149
  145. package/dist/features/preview/components/BlockErrorBoundary.js +8 -12
  146. package/dist/features/preview/components/BlockThumbnail.js +176 -100
  147. package/dist/features/preview/components/CanvasPreview.js +243 -0
  148. package/dist/features/preview/components/CreatePageModal.js +128 -137
  149. package/dist/features/preview/components/DebouncedFieldEditor.js +29 -33
  150. package/dist/features/preview/components/DerivedLayoutDialog.js +46 -29
  151. package/dist/features/preview/components/DrillRow.js +150 -0
  152. package/dist/features/preview/components/FieldOverlayStyles.js +33 -10
  153. package/dist/features/preview/components/FieldToolbar.js +166 -116
  154. package/dist/features/preview/components/Frame.js +108 -20
  155. package/dist/features/preview/components/IconFieldEditor.js +227 -0
  156. package/dist/features/preview/components/ItemFieldsEditor.js +238 -205
  157. package/dist/features/preview/components/LinkFieldEditor.js +135 -139
  158. package/dist/features/preview/components/Metadata.js +22 -30
  159. package/dist/features/preview/components/MobilePreviewDrawer.js +89 -108
  160. package/dist/features/preview/components/MultipleAssetFieldEditor.js +334 -246
  161. package/dist/features/preview/components/OverlayTracker.js +10 -42
  162. package/dist/features/preview/components/Overlays.js +81 -69
  163. package/dist/features/preview/components/PageInfo.js +1748 -0
  164. package/dist/features/preview/components/PageInfoSkeleton.js +51 -0
  165. package/dist/features/preview/components/PageLocationFieldset.js +112 -116
  166. package/dist/features/preview/components/PageNavigatorHeader.js +24 -0
  167. package/dist/features/preview/components/PageNicknameField.js +22 -26
  168. package/dist/features/preview/components/PagePicker.js +145 -147
  169. package/dist/features/preview/components/PageTree.js +525 -532
  170. package/dist/features/preview/components/PreviewActivation.js +28 -32
  171. package/dist/features/preview/components/PreviewPanel.js +620 -319
  172. package/dist/features/preview/components/PreviewToolbar.js +111 -340
  173. package/dist/features/preview/components/RecordCard.js +80 -0
  174. package/dist/features/preview/components/RecordCombobox.js +178 -0
  175. package/dist/features/preview/components/ReferenceFieldEditor.js +149 -0
  176. package/dist/features/preview/components/ReferenceListFieldEditor.js +432 -0
  177. package/dist/features/preview/components/RemovedBlockPlaceholder.js +95 -0
  178. package/dist/features/preview/components/RepeatableItemsList.js +125 -138
  179. package/dist/features/preview/components/SelectionEditor.js +993 -0
  180. package/dist/features/preview/components/ShikiMarkdown.js +14 -18
  181. package/dist/features/preview/components/SidebarSection.js +52 -64
  182. package/dist/features/preview/components/StudioEditingFallback.js +56 -0
  183. package/dist/features/preview/components/UnlinkAssetButton.js +104 -107
  184. package/dist/features/preview/components/blockGridNavigation.js +15 -0
  185. package/dist/features/preview/components/contentFieldSchema.js +8 -0
  186. package/dist/features/preview/components/useFieldWriter.js +200 -0
  187. package/dist/features/preview/components/useRecordView.js +383 -0
  188. package/dist/features/preview/components/useRepeatableItemActions.js +35 -37
  189. package/dist/features/preview/components/useUpdateBlockPosition.js +37 -37
  190. package/dist/features/preview/editingFrame.js +197 -0
  191. package/dist/features/preview/overlayHighlights.js +27 -0
  192. package/dist/features/preview/overlayMessages.js +72 -1
  193. package/dist/features/preview/pageRecord.js +189 -0
  194. package/dist/features/preview/previewConstants.js +6 -2
  195. package/dist/features/preview/previewPageFrame.js +95 -0
  196. package/dist/features/preview/previewPreparation.js +7 -0
  197. package/dist/features/preview/previewSelection.js +33 -59
  198. package/dist/features/preview/previewStore.js +225 -123
  199. package/dist/features/preview/referencePickerFocus.js +29 -0
  200. package/dist/features/preview/repeatableItemTargets.js +56 -0
  201. package/dist/features/preview/selectionReveal.js +21 -0
  202. package/dist/features/preview/usePreviewViewportActions.js +114 -0
  203. package/dist/features/preview/viewportContinuity.js +109 -0
  204. package/dist/features/provider/AuthenticatedCamoxProvider.js +69 -44
  205. package/dist/features/provider/CamoxProvider.d.ts +3 -6
  206. package/dist/features/provider/CamoxProvider.js +38 -50
  207. package/dist/features/provider/CoreCamoxProvider.js +71 -23
  208. package/dist/features/provider/LocalhostPreviewProvider.js +73 -73
  209. package/dist/features/provider/PreviewSignInPage.js +54 -0
  210. package/dist/features/provider/components/CamoxAppContext.js +11 -11
  211. package/dist/features/provider/components/CommandPalette.js +87 -143
  212. package/dist/features/provider/useAdminShortcuts.js +7 -11
  213. package/dist/features/routes/pageRuntime.d.ts +44 -4
  214. package/dist/features/routes/pageRuntime.js +244 -137
  215. package/dist/features/runtime/RuntimeChrome.js +117 -115
  216. package/dist/features/runtime/alternates.js +64 -0
  217. package/dist/features/runtime/analytics.d.ts +7 -0
  218. package/dist/features/runtime/analytics.js +66 -0
  219. package/dist/features/runtime/artifactSources.js +87 -0
  220. package/dist/features/runtime/editingFallback.js +20 -0
  221. package/dist/features/runtime/linkPrefetch.js +97 -0
  222. package/dist/features/runtime/livePages.js +62 -0
  223. package/dist/features/runtime/llmsTxt.js +40 -0
  224. package/dist/features/runtime/loopbackFetch.js +18 -0
  225. package/dist/features/runtime/navigationAccessibility.js +51 -0
  226. package/dist/features/runtime/navigationTarget.js +23 -2
  227. package/dist/features/runtime/pageApp.js +216 -141
  228. package/dist/features/runtime/pageBlockTypes.js +20 -0
  229. package/dist/features/runtime/pageClient.d.ts +2 -4
  230. package/dist/features/runtime/pageClient.js +18 -3
  231. package/dist/features/runtime/pageNavigation.js +254 -32
  232. package/dist/features/runtime/pageServer.d.ts +2 -4
  233. package/dist/features/runtime/pageServer.js +8 -1
  234. package/dist/features/runtime/pageViewport.js +7 -0
  235. package/dist/features/runtime/runtime.d.ts +60 -23
  236. package/dist/features/runtime/runtime.js +779 -166
  237. package/dist/features/runtime/runtimeChromeLoader.js +58 -0
  238. package/dist/features/runtime/runtimeRoutes.d.ts +19 -0
  239. package/dist/features/runtime/runtimeRoutes.js +25 -0
  240. package/dist/features/runtime/scrollRestoration.js +133 -0
  241. package/dist/features/runtime/studioApp.d.ts +4 -3
  242. package/dist/features/runtime/studioApp.js +5 -9
  243. package/dist/features/runtime/studioClient.d.ts +2 -4
  244. package/dist/features/runtime/studioClient.js +12 -3
  245. package/dist/features/runtime/studioServer.d.ts +2 -4
  246. package/dist/features/runtime/studioServer.js +6 -1
  247. package/dist/features/runtime/worker.d.ts +6 -0
  248. package/dist/features/runtime/worker.js +23 -0
  249. package/dist/features/runtime/workerRequest.js +44 -0
  250. package/dist/features/studio/CamoxStudio.d.ts +2 -6
  251. package/dist/features/studio/CamoxStudio.js +34 -49
  252. package/dist/features/studio/FollowAgentProvider.js +338 -0
  253. package/dist/features/studio/components/ChatSidebar.js +356 -0
  254. package/dist/features/studio/components/DraftsControl.js +676 -0
  255. package/dist/features/studio/components/FaviconDialog.js +318 -0
  256. package/dist/features/studio/components/LocalePicker.js +785 -0
  257. package/dist/features/studio/components/Navbar.js +123 -103
  258. package/dist/features/studio/components/ProjectMenu.js +239 -260
  259. package/dist/features/studio/components/RenameDraftDialog.js +206 -0
  260. package/dist/features/studio/components/ReviewDraftSheet.js +1472 -0
  261. package/dist/features/studio/components/ThreadComposer.js +157 -0
  262. package/dist/features/studio/components/ThreadMarkdown.js +113 -0
  263. package/dist/features/studio/components/ThreadMessages.js +270 -0
  264. package/dist/features/studio/components/UserButton.js +34 -23
  265. package/dist/features/studio/draftLabel.js +33 -0
  266. package/dist/features/studio/draftNotice.js +13 -0
  267. package/dist/features/studio/followAgent.js +250 -0
  268. package/dist/features/studio/followAgentContext.js +7 -0
  269. package/dist/features/studio/localeOptions.js +118 -0
  270. package/dist/features/studio/localeSwitch.js +19 -0
  271. package/dist/features/studio/routes.js +48 -1
  272. package/dist/features/studio/studioStore.js +64 -1
  273. package/dist/features/studio/useTheme.js +24 -27
  274. package/dist/features/vite/artifactRuntimeMinification.js +36 -0
  275. package/dist/features/vite/auth.js +1 -50
  276. package/dist/features/vite/blockBoilerplate.js +6 -5
  277. package/dist/features/vite/blockChunks.js +31 -0
  278. package/dist/features/vite/bundlerLogs.js +17 -0
  279. package/dist/features/vite/definitionsSync.js +158 -226
  280. package/dist/features/vite/devAuthentication.js +4 -16
  281. package/dist/features/vite/devSignIn.js +87 -0
  282. package/dist/features/vite/iconGeneration.js +16 -0
  283. package/dist/features/vite/layoutGeneration.js +11 -1
  284. package/dist/features/vite/publishSeededContent.js +30 -0
  285. package/dist/features/vite/routeGeneration.js +6 -7
  286. package/dist/features/vite/runtimeDev.js +80 -99
  287. package/dist/features/vite/vite.d.ts +53 -31
  288. package/dist/features/vite/vite.js +230 -116
  289. package/dist/features/vite/workerBuild.js +39 -0
  290. package/dist/hooks/use-debounced-field.js +116 -47
  291. package/dist/hooks/use-file-upload.js +114 -67
  292. package/dist/hooks/use-marquee-selection.js +32 -36
  293. package/dist/hooks/use-page-destinations.js +69 -37
  294. package/dist/lib/api-client-server.d.ts +5 -0
  295. package/dist/lib/api-client-server.js +10 -4
  296. package/dist/lib/api-client.d.ts +6 -0
  297. package/dist/lib/api-client.js +51 -16
  298. package/dist/lib/api-socket.js +17 -0
  299. package/dist/lib/auth-page-styles.js +39 -0
  300. package/dist/lib/auth.js +139 -60
  301. package/dist/lib/collection-cache.js +23 -0
  302. package/dist/lib/draft-scope.d.ts +4 -0
  303. package/dist/lib/draft-scope.js +222 -0
  304. package/dist/lib/html.js +12 -0
  305. package/dist/lib/link-pages.js +154 -0
  306. package/dist/lib/locale-path.d.ts +22 -0
  307. package/dist/lib/locale-path.js +57 -0
  308. package/dist/lib/normalized-data.js +252 -152
  309. package/dist/lib/preview-handoff.js +13 -0
  310. package/dist/lib/queries.d.ts +11 -0
  311. package/dist/lib/queries.js +71 -131
  312. package/dist/lib/studio-reads.d.ts +14 -0
  313. package/dist/lib/studio-reads.js +574 -0
  314. package/dist/lib/use-project-room.js +50 -47
  315. package/dist/lib/use-thread.js +310 -0
  316. package/dist/lib/utils.js +25 -29
  317. package/dist/lib/view-locale-context.js +22 -0
  318. package/dist/lib/view-locale.js +46 -0
  319. package/dist/package.js +5 -0
  320. package/dist/studio-overlays.css +41 -147
  321. package/dist/studio.css +2 -2
  322. package/package.json +70 -72
  323. package/skills/camox/SKILL.md +16 -5
  324. package/skills/camox/references/artifacts.md +179 -0
  325. package/skills/camox/references/block-definitions.md +98 -55
  326. package/skills/camox/references/cli-common.md +18 -6
  327. package/skills/camox/references/cli-content.md +92 -58
  328. package/skills/camox/references/cli-publishing.md +26 -0
  329. package/skills/camox/references/dom-integrations.md +27 -0
  330. package/skills/camox/references/field-styling.md +7 -7
  331. package/skills/camox/references/layout-definitions.md +16 -14
  332. package/skills/camox/references/localization.md +56 -0
  333. package/skills/camox/references/routed-layouts.md +133 -15
  334. package/skills/camox-expand/SKILL.md +69 -0
  335. package/skills/camox-expand/references/jobs.md +39 -0
  336. package/skills/camoxify/SKILL.md +38 -2
  337. package/dist/core/components/AddBlockControlBar.js +0 -78
  338. package/dist/core/hooks/useRequireDraftSource.js +0 -23
  339. package/dist/features/metadata/sitemap.d.ts +0 -8
  340. package/dist/features/metadata/sitemap.js +0 -17
  341. package/dist/features/og/imageResponse.node.d.ts +0 -12
  342. package/dist/features/og/imageResponse.node.js +0 -49
  343. package/dist/features/og/imageResponse.workerd.d.ts +0 -12
  344. package/dist/features/og/imageResponse.workerd.js +0 -40
  345. package/dist/features/page/PublishedPageContent.js +0 -205
  346. package/dist/features/page/PublishedPageExperience.js +0 -23
  347. package/dist/features/preview/DerivedPreview.js +0 -134
  348. package/dist/features/preview/commentsEnabled.js +0 -8
  349. package/dist/features/preview/components/AddBlockSidebar.js +0 -381
  350. package/dist/features/preview/components/AttachedComments.js +0 -194
  351. package/dist/features/preview/components/CommentHeader.js +0 -122
  352. package/dist/features/preview/components/CommentSidebar.js +0 -29
  353. package/dist/features/preview/components/CommentTargetQuote.js +0 -166
  354. package/dist/features/preview/components/DerivedLayoutSidebar.d.ts +0 -5
  355. package/dist/features/preview/components/DerivedLayoutSidebar.js +0 -179
  356. package/dist/features/preview/components/DerivedPageInfoSidebar.js +0 -69
  357. package/dist/features/preview/components/LeftSidebar.js +0 -68
  358. package/dist/features/preview/components/PageEditorSidebar.js +0 -563
  359. package/dist/features/preview/components/PageInfoSidebar.js +0 -1551
  360. package/dist/features/preview/components/PageNavigatorSidebar.js +0 -78
  361. package/dist/features/preview/components/PageStatusBadge.js +0 -97
  362. package/dist/features/preview/components/PeekedBlock.js +0 -217
  363. package/dist/features/preview/components/PreviewComments.js +0 -56
  364. package/dist/features/preview/components/PreviewToolbarSpacer.js +0 -43
  365. package/dist/features/preview/components/PublicationRow.js +0 -422
  366. package/dist/features/preview/components/PublishDialog.js +0 -194
  367. package/dist/features/preview/components/RightSidebar.js +0 -59
  368. package/dist/features/preview/previewCommentsStore.js +0 -115
  369. package/dist/features/preview/publication.js +0 -81
  370. package/dist/features/runtime/SharedChromeContext.js +0 -7
  371. package/dist/features/studio/components/EnvironmentMenu.js +0 -413
  372. package/dist/features/vite/appGeneration.js +0 -89
  373. package/dist/lib/view-queries.js +0 -28
  374. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/Matches.d.ts +0 -114
  375. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/RouterProvider.d.ts +0 -25
  376. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/config.d.ts +0 -1
  377. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/defer.d.ts +0 -1
  378. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/fileRoute.d.ts +0 -20
  379. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/global.d.ts +0 -8
  380. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/hash-scroll.d.ts +0 -1
  381. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/index.d.ts +0 -18
  382. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/link.d.ts +0 -161
  383. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/load-matches.d.ts +0 -6
  384. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/location.d.ts +0 -54
  385. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/lru-cache.d.ts +0 -8
  386. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/manifest.d.ts +0 -32
  387. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/new-process-route-tree.d.ts +0 -115
  388. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/not-found.d.ts +0 -1
  389. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/redirect.d.ts +0 -49
  390. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/rewrite.d.ts +0 -1
  391. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/root.d.ts +0 -6
  392. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/route.d.ts +0 -343
  393. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/routeInfo.d.ts +0 -48
  394. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/router.d.ts +0 -695
  395. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/scroll-restoration.d.ts +0 -1
  396. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchMiddleware.d.ts +0 -1
  397. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchParams.d.ts +0 -5
  398. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/RawStream.d.ts +0 -38
  399. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/seroval-plugins.d.ts +0 -1
  400. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/transformer.d.ts +0 -65
  401. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/stores.d.ts +0 -69
  402. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/structuralSharing.d.ts +0 -1
  403. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/typePrimitives.d.ts +0 -1
  404. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderData.d.ts +0 -1
  405. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderDeps.d.ts +0 -1
  406. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useNavigate.d.ts +0 -10
  407. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useParams.d.ts +0 -1
  408. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useRouteContext.d.ts +0 -1
  409. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useSearch.d.ts +0 -1
  410. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/utils.d.ts +0 -28
  411. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/validators.d.ts +0 -49
  412. package/skills/camox/references/cli-environments.md +0 -37
@@ -1,16 +1,87 @@
1
- import { areCommentsEnabled } from "./commentsEnabled.js";
2
1
  import { createStore } from "@xstate/store-react";
3
- import { toast } from "@camox/ui/toaster";
4
2
 
5
3
  //#region src/features/preview/previewStore.ts
6
- /** Extract the blockId from any selection variant. */
4
+ /**
5
+ * Whether a block places the record. Checks `blockId` rather than `layoutId`, because editing
6
+ * events spread a layout editing owner's `layoutId` next to block-owned placements.
7
+ */
8
+ function isBlockPlacement(placement) {
9
+ return "blockId" in placement && placement.blockId != null;
10
+ }
11
+ function copyNested(placement) {
12
+ if (!placement.nested) return {};
13
+ return { nested: {
14
+ fieldName: placement.nested.fieldName,
15
+ recordId: placement.nested.recordId
16
+ } };
17
+ }
18
+ function recordPlacement(placement) {
19
+ if (!isBlockPlacement(placement)) return {
20
+ layoutId: placement.layoutId,
21
+ recordId: placement.recordId,
22
+ ...copyNested(placement)
23
+ };
24
+ return {
25
+ blockId: placement.blockId,
26
+ ...placement.itemId == null ? {} : { itemId: placement.itemId },
27
+ fieldName: placement.fieldName,
28
+ recordId: placement.recordId,
29
+ ...copyNested(placement)
30
+ };
31
+ }
32
+ /** Whether two placements are the same occurrence: same owner, field and record. */
33
+ function samePlacement(a, b) {
34
+ if (a.recordId !== b.recordId) return false;
35
+ if (a.nested?.fieldName !== b.nested?.fieldName) return false;
36
+ if (a.nested?.recordId !== b.nested?.recordId) return false;
37
+ if (!isBlockPlacement(a)) return !isBlockPlacement(b) && a.layoutId === b.layoutId;
38
+ if (!isBlockPlacement(b)) return false;
39
+ return a.blockId === b.blockId && (a.itemId ?? null) === (b.itemId ?? null) && a.fieldName === b.fieldName;
40
+ }
41
+ function sameEditingOwner(a, b) {
42
+ if (!a || !b) return a === b;
43
+ if (a.kind === "page") return b.kind === "page" && a.pageId === b.pageId;
44
+ return b.kind === "layout" && a.layoutId === b.layoutId;
45
+ }
46
+ function targetContext(owner, selection) {
47
+ if (owner.kind === "page") return {
48
+ kind: "page",
49
+ pageId: owner.pageId,
50
+ selection
51
+ };
52
+ return {
53
+ kind: "layout",
54
+ layoutId: owner.layoutId,
55
+ selection
56
+ };
57
+ }
58
+ function selectionForOwner(context, owner) {
59
+ if (!sameEditingOwner(context.editingContext, owner)) return null;
60
+ return context.editingContext?.selection ?? null;
61
+ }
62
+ /** Read a selection only in the page that contains the editor. */
63
+ function selectionForPage(context, pageId) {
64
+ return selectionForOwner(context, pageId === null ? null : {
65
+ kind: "page",
66
+ pageId
67
+ });
68
+ }
69
+ /** Narrows to selections inside a block, excluding records placed by a layout. */
70
+ function isBlockSelection(sel) {
71
+ if (!sel) return false;
72
+ if (sel.type === "record" || sel.type === "record-field") return isBlockPlacement(sel);
73
+ return true;
74
+ }
75
+ /** Extract the blockId from any selection variant; null for a record a layout places. */
7
76
  function selectionBlockId(sel) {
8
- return sel?.blockId ?? null;
77
+ if (!isBlockSelection(sel)) return null;
78
+ return sel.blockId;
9
79
  }
10
- /** Extract the itemId from item or item-field selections. */
80
+ /** Extract the itemId from item and item-field selections, and records placed by an item. */
11
81
  function selectionItemId(sel) {
12
- if (!sel) return null;
82
+ if (!isBlockSelection(sel)) return null;
13
83
  if (sel.type === "item" || sel.type === "item-field") return sel.itemId;
84
+ if (sel.type === "record" || sel.type === "record-field") return sel.itemId ?? null;
14
85
  return null;
15
86
  }
16
87
  /** Check if the selection is viewing a terminal field (link, image, file, etc.). */
@@ -22,46 +93,33 @@ function selectionField(sel) {
22
93
  };
23
94
  return null;
24
95
  }
25
- const selectIsCommentMode = (state) => state.context.mode === "commenting-draft";
26
- /** Commenting is a draft-only editing submode. */
27
- const selectIsEditMode = (state) => state.context.mode === "editing-draft" || selectIsCommentMode(state);
28
- const selectPreviewSource = (state) => state.context.mode === "previewing-live" ? "live" : "draft";
96
+ const selectIsCanvasShown = (state) => state.context.view === "canvas";
97
+ const initialPreviewContext = {
98
+ view: "preview",
99
+ isToolbarHidden: false,
100
+ addBlockDialog: null,
101
+ isCreatePageModalOpen: false,
102
+ editingPageId: null,
103
+ viewportMode: "full",
104
+ editingContext: null
105
+ };
29
106
  const previewStore = createStore({
30
- context: {
31
- mode: "previewing-draft",
32
- isToolbarHidden: false,
33
- isAddBlockSidebarOpen: false,
34
- isCreatePageModalOpen: false,
35
- editingPageId: null,
36
- viewportMode: "full",
37
- peekedBlock: null,
38
- peekedBlockPosition: null,
39
- skipPeekedBlockExitAnimation: false,
40
- selection: null,
41
- iframeElement: null
42
- },
107
+ context: initialPreviewContext,
43
108
  on: {
44
- setCommentMode: (context, event) => {
45
- if (!selectIsEditMode({ context })) return context;
46
- const commenting = areCommentsEnabled() && event.enabled;
109
+ /** Starts over, as a new Studio session does. */
110
+ reset: () => initialPreviewContext,
111
+ hideCanvas: (context) => {
112
+ if (!selectIsCanvasShown({ context })) return context;
47
113
  return {
48
114
  ...context,
49
- mode: commenting ? "commenting-draft" : "editing-draft",
50
- selection: commenting ? null : context.selection
115
+ view: "preview"
51
116
  };
52
117
  },
53
- exitEditMode: (context) => {
54
- if (!selectIsEditMode({ context })) return context;
118
+ showCanvas: (context) => {
119
+ if (selectIsCanvasShown({ context })) return context;
55
120
  return {
56
121
  ...context,
57
- mode: "previewing-draft"
58
- };
59
- },
60
- enterEditMode: (context) => {
61
- if (selectIsEditMode({ context })) return context;
62
- return {
63
- ...context,
64
- mode: "editing-draft",
122
+ view: "canvas",
65
123
  isToolbarHidden: false
66
124
  };
67
125
  },
@@ -69,16 +127,6 @@ const previewStore = createStore({
69
127
  ...context,
70
128
  isToolbarHidden: true
71
129
  }),
72
- viewLivePage: (context, _, enqueue) => {
73
- enqueue.effect(() => {
74
- toast("Viewing live version of the site");
75
- });
76
- return {
77
- ...context,
78
- mode: "previewing-live",
79
- isToolbarHidden: true
80
- };
81
- },
82
130
  setViewportMode: (context, event) => {
83
131
  if (context.viewportMode === event.mode) return context;
84
132
  return {
@@ -93,123 +141,192 @@ const previewStore = createStore({
93
141
  viewportMode: nextMode
94
142
  };
95
143
  },
96
- setPeekedBlock: (context, event) => {
97
- if (!event.block) return context;
144
+ activatePage: (context, event) => {
145
+ const owner = event.pageId === null ? null : {
146
+ kind: "page",
147
+ pageId: event.pageId
148
+ };
149
+ if (sameEditingOwner(context.editingContext, owner)) return context;
98
150
  return {
99
151
  ...context,
100
- peekedBlock: event.block,
101
- peekedBlockPosition: event.afterPosition ?? null
152
+ editingContext: owner ? targetContext(owner, null) : null,
153
+ addBlockDialog: null
102
154
  };
103
155
  },
104
- exitPeekedBlock: (context) => ({
105
- ...context,
106
- peekedBlock: null,
107
- peekedBlockPosition: null,
108
- isAddBlockSidebarOpen: false
109
- }),
110
- clearPeekedBlock: (context) => ({
111
- ...context,
112
- peekedBlock: null,
113
- peekedBlockPosition: null
114
- }),
115
- setSelection: (context, event) => ({
156
+ activateLayout: (context, event) => {
157
+ const owner = {
158
+ kind: "layout",
159
+ layoutId: event.layoutId
160
+ };
161
+ if (sameEditingOwner(context.editingContext, owner)) return context;
162
+ return {
163
+ ...context,
164
+ editingContext: targetContext(owner, null),
165
+ addBlockDialog: null
166
+ };
167
+ },
168
+ selectTarget: (context, event) => ({
116
169
  ...context,
117
- selection: event.selection
170
+ editingContext: targetContext(event, event.selection)
118
171
  }),
119
172
  setFocusedBlock: (context, event) => ({
120
173
  ...context,
121
- selection: {
174
+ editingContext: targetContext(event, {
122
175
  type: "block",
123
176
  blockId: event.blockId
124
- },
125
- peekedBlock: null,
126
- peekedBlockPosition: null,
127
- isAddBlockSidebarOpen: false
177
+ }),
178
+ addBlockDialog: null
128
179
  }),
129
180
  selectItem: (context, event) => ({
130
181
  ...context,
131
- selection: {
182
+ editingContext: targetContext(event, {
132
183
  type: "item",
133
184
  blockId: event.blockId,
134
185
  itemId: event.itemId
135
- }
186
+ })
136
187
  }),
137
188
  selectBlockField: (context, event) => ({
138
189
  ...context,
139
- selection: {
190
+ editingContext: targetContext(event, {
140
191
  type: "block-field",
141
192
  blockId: event.blockId,
142
193
  fieldName: event.fieldName,
143
194
  fieldType: event.fieldType
144
- }
195
+ })
145
196
  }),
146
197
  selectItemField: (context, event) => ({
147
198
  ...context,
148
- selection: {
199
+ editingContext: targetContext(event, {
149
200
  type: "item-field",
150
201
  blockId: event.blockId,
151
202
  itemId: event.itemId,
152
203
  fieldName: event.fieldName,
153
204
  fieldType: event.fieldType
154
- }
205
+ })
206
+ }),
207
+ selectRecord: (context, event) => ({
208
+ ...context,
209
+ editingContext: targetContext(event, {
210
+ type: "record",
211
+ ...recordPlacement(event)
212
+ })
213
+ }),
214
+ selectRecordField: (context, event) => ({
215
+ ...context,
216
+ editingContext: targetContext(event, {
217
+ type: "record-field",
218
+ ...recordPlacement(event),
219
+ recordFieldName: event.recordFieldName,
220
+ recordFieldType: event.recordFieldType
221
+ })
155
222
  }),
156
223
  selectParent: (context) => {
157
- const sel = context.selection;
224
+ const editingContext = context.editingContext;
225
+ const sel = editingContext?.selection;
158
226
  if (!sel) return context;
227
+ if (sel.type === "record-field") return {
228
+ ...context,
229
+ editingContext: {
230
+ ...editingContext,
231
+ selection: {
232
+ type: "record",
233
+ ...recordPlacement(sel)
234
+ }
235
+ }
236
+ };
237
+ if (sel.type === "record" && sel.nested) {
238
+ const { nested: _nested, ...outer } = recordPlacement(sel);
239
+ return {
240
+ ...context,
241
+ editingContext: {
242
+ ...editingContext,
243
+ selection: {
244
+ type: "record-field",
245
+ ...outer,
246
+ recordFieldName: sel.nested.fieldName,
247
+ recordFieldType: "Reference"
248
+ }
249
+ }
250
+ };
251
+ }
252
+ if (sel.type === "record" && !isBlockPlacement(sel)) return context;
253
+ if (sel.type === "record") {
254
+ const field = {
255
+ fieldName: sel.fieldName,
256
+ fieldType: "Reference"
257
+ };
258
+ return {
259
+ ...context,
260
+ editingContext: {
261
+ ...editingContext,
262
+ selection: sel.itemId == null ? {
263
+ type: "block-field",
264
+ blockId: sel.blockId,
265
+ ...field
266
+ } : {
267
+ type: "item-field",
268
+ blockId: sel.blockId,
269
+ itemId: sel.itemId,
270
+ ...field
271
+ }
272
+ }
273
+ };
274
+ }
159
275
  if (sel.type === "block-field") return {
160
276
  ...context,
161
- selection: {
162
- type: "block",
163
- blockId: sel.blockId
277
+ editingContext: {
278
+ ...editingContext,
279
+ selection: {
280
+ type: "block",
281
+ blockId: sel.blockId
282
+ }
164
283
  }
165
284
  };
166
285
  if (sel.type === "item-field") return {
167
286
  ...context,
168
- selection: {
169
- type: "item",
170
- blockId: sel.blockId,
171
- itemId: sel.itemId
287
+ editingContext: {
288
+ ...editingContext,
289
+ selection: {
290
+ type: "item",
291
+ blockId: sel.blockId,
292
+ itemId: sel.itemId
293
+ }
172
294
  }
173
295
  };
174
296
  if (sel.type === "item") return {
175
297
  ...context,
176
- selection: {
177
- type: "block",
178
- blockId: sel.blockId
298
+ editingContext: {
299
+ ...editingContext,
300
+ selection: {
301
+ type: "block",
302
+ blockId: sel.blockId
303
+ }
179
304
  }
180
305
  };
181
306
  return context;
182
307
  },
183
308
  clearSelection: (context) => ({
184
309
  ...context,
185
- selection: null
310
+ editingContext: context.editingContext ? {
311
+ ...context.editingContext,
312
+ selection: null
313
+ } : null
186
314
  }),
187
- openAddBlockSidebar: (context, event) => ({
315
+ openAddBlockDialog: (context, event) => ({
188
316
  ...context,
189
- isAddBlockSidebarOpen: true,
190
- peekedBlock: null,
191
- peekedBlockPosition: event.afterPosition ?? null
317
+ addBlockDialog: { afterPosition: event.afterPosition }
192
318
  }),
193
- closeAddBlockSidebar: (context) => ({
319
+ closeAddBlockDialog: (context) => ({
194
320
  ...context,
195
- isAddBlockSidebarOpen: false,
196
- peekedBlock: null,
197
- peekedBlockPosition: null
321
+ addBlockDialog: null
198
322
  }),
199
323
  focusCreatedBlock: (context, event) => ({
200
324
  ...context,
201
- selection: {
325
+ editingContext: targetContext(event, {
202
326
  type: "block",
203
327
  blockId: event.blockId
204
- },
205
- isAddBlockSidebarOpen: false,
206
- peekedBlock: null,
207
- peekedBlockPosition: null,
208
- skipPeekedBlockExitAnimation: true
209
- }),
210
- clearSkipPeekedBlockExitAnimation: (context) => ({
211
- ...context,
212
- skipPeekedBlockExitAnimation: false
328
+ }),
329
+ addBlockDialog: null
213
330
  }),
214
331
  openCreatePageModal: (context) => ({
215
332
  ...context,
@@ -229,24 +346,9 @@ const previewStore = createStore({
229
346
  closeEditPageModal: (context) => ({
230
347
  ...context,
231
348
  editingPageId: null
232
- }),
233
- setIframeElement: (context, event) => ({
234
- ...context,
235
- iframeElement: event.element
236
- }),
237
- viewDraftPage: (context, _, enqueue) => {
238
- if (context.mode !== "previewing-live") return context;
239
- enqueue.effect(() => {
240
- toast("Previewing draft content", { duration: 2500 });
241
- });
242
- return {
243
- ...context,
244
- mode: "previewing-draft",
245
- isToolbarHidden: false
246
- };
247
- }
349
+ })
248
350
  }
249
351
  });
250
352
 
251
353
  //#endregion
252
- export { previewStore, selectIsCommentMode, selectIsEditMode, selectPreviewSource, selectionBlockId, selectionField, selectionItemId };
354
+ export { isBlockPlacement, isBlockSelection, previewStore, recordPlacement, sameEditingOwner, samePlacement, selectIsCanvasShown, selectionBlockId, selectionField, selectionForOwner, selectionForPage, selectionItemId };
@@ -0,0 +1,29 @@
1
+ import { c } from "react/compiler-runtime";
2
+ import { createStore, useSelector } from "@xstate/store-react";
3
+
4
+ //#region src/features/preview/referencePickerFocus.ts
5
+ /**
6
+ * One-shot request from the preview (an unset reference placeholder) to focus the record
7
+ * picker of that placement in the sidebar. Keyed by the placement's overlay field ID
8
+ * (`${blockId}__${fieldName}`), which the preview and sidebar already share.
9
+ */
10
+ const referencePickerFocus = createStore({
11
+ context: { fieldId: null },
12
+ on: {
13
+ request: (_context, event) => ({ fieldId: event.fieldId }),
14
+ consume: (context, event) => context.fieldId === event.fieldId ? { fieldId: null } : context
15
+ }
16
+ });
17
+ function useReferencePickerFocusRequested(fieldId) {
18
+ const $ = c(2);
19
+ let t0;
20
+ if ($[0] !== fieldId) {
21
+ t0 = (state) => fieldId !== void 0 && state.context.fieldId === fieldId;
22
+ $[0] = fieldId;
23
+ $[1] = t0;
24
+ } else t0 = $[1];
25
+ return useSelector(referencePickerFocus, t0);
26
+ }
27
+
28
+ //#endregion
29
+ export { referencePickerFocus, useReferencePickerFocusRequested };
@@ -0,0 +1,56 @@
1
+ //#region src/features/preview/repeatableItemTargets.ts
2
+ const registries = /* @__PURE__ */ new WeakMap();
3
+ function registryOf(document) {
4
+ let registry = registries.get(document);
5
+ if (registry) return registry;
6
+ registry = {
7
+ items: /* @__PURE__ */ new Set(),
8
+ listeners: /* @__PURE__ */ new Set()
9
+ };
10
+ registries.set(document, registry);
11
+ return registry;
12
+ }
13
+ function notify(registry, kind) {
14
+ for (const listener of registry.listeners) listener(kind);
15
+ }
16
+ function registerRepeatableItem(document, target) {
17
+ const registry = registryOf(document);
18
+ registry.items.add(target);
19
+ notify(registry, "content");
20
+ return {
21
+ update(state) {
22
+ if (target.hovered === state.hovered && target.focused === state.focused && target.hoverGroup === state.hoverGroup && target.synced === state.synced) return;
23
+ Object.assign(target, state);
24
+ notify(registry, "state");
25
+ },
26
+ unregister() {
27
+ registry.items.delete(target);
28
+ notify(registry, "content");
29
+ }
30
+ };
31
+ }
32
+ /** Membership changes move geometry; state changes never do. */
33
+ function subscribeRepeatableItems(document, listener) {
34
+ const { listeners } = registryOf(document);
35
+ listeners.add(listener);
36
+ return () => listeners.delete(listener);
37
+ }
38
+ function fragmentsOf(element) {
39
+ return element.reactFragments;
40
+ }
41
+ /** Each registered item with its first-level elements, in document order. */
42
+ function repeatableItemElements(document) {
43
+ const result = /* @__PURE__ */ new Map();
44
+ const items = registries.get(document)?.items;
45
+ if (!items?.size) return result;
46
+ for (const item of items) result.set(item, []);
47
+ for (const element of document.querySelectorAll("*")) {
48
+ const fragments = fragmentsOf(element);
49
+ if (!fragments) continue;
50
+ for (const item of items) if (fragments.has(item.fragment)) result.get(item).push(element);
51
+ }
52
+ return result;
53
+ }
54
+
55
+ //#endregion
56
+ export { registerRepeatableItem, repeatableItemElements, subscribeRepeatableItems };
@@ -0,0 +1,21 @@
1
+ //#region src/features/preview/selectionReveal.ts
2
+ /** Room kept between a revealed item and the edge it scrolls to. */
3
+ const REVEAL_MARGIN = 48;
4
+ /** An item counts as in view while this share of it, or of the view if it is taller, shows. */
5
+ const REVEAL_VISIBLE_SHARE = .5;
6
+ /**
7
+ * How far to scroll so a selected item shows: 0 while enough of it already does.
8
+ * Otherwise scroll the least: its top to the view's top, or its bottom to the view's
9
+ * bottom. An item too tall to fit shows from its top.
10
+ */
11
+ function revealScrollDelta(item, view) {
12
+ const height = item.bottom - item.top;
13
+ const viewHeight = view.bottom - view.top;
14
+ if (Math.max(0, Math.min(item.bottom, view.bottom) - Math.max(item.top, view.top)) >= Math.max(1, Math.min(height, viewHeight)) * .5) return 0;
15
+ const margin = Math.min(48, viewHeight / 4);
16
+ if (item.top < view.top || height > viewHeight - margin * 2) return item.top - view.top - margin;
17
+ return item.bottom - view.bottom + margin;
18
+ }
19
+
20
+ //#endregion
21
+ export { REVEAL_VISIBLE_SHARE, revealScrollDelta };
@@ -0,0 +1,114 @@
1
+ import { actionsStore } from "../provider/actionsStore.js";
2
+ import { previewStore } from "./previewStore.js";
3
+ import { c } from "react/compiler-runtime";
4
+ import { useEffect } from "react";
5
+
6
+ //#region src/features/preview/usePreviewViewportActions.ts
7
+ /** Preview commands stay available while switching between the site and Canvas. */
8
+ function usePreviewViewportActions() {
9
+ const $ = c(1);
10
+ let t0;
11
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
12
+ t0 = [];
13
+ $[0] = t0;
14
+ } else t0 = $[0];
15
+ useEffect(_temp10, t0);
16
+ }
17
+ function _temp10() {
18
+ const actions = [
19
+ {
20
+ id: "cycle-viewport-mode",
21
+ label: "Cycle viewport mode",
22
+ aliases: [
23
+ "Responsive preview",
24
+ "Viewport preview",
25
+ "Device preview"
26
+ ],
27
+ groupLabel: "Website",
28
+ checkIfAvailable: _temp,
29
+ execute: _temp2,
30
+ shortcut: { key: "m" }
31
+ },
32
+ {
33
+ id: "set-viewport-full",
34
+ label: "Set full viewport",
35
+ aliases: [
36
+ "Full preview",
37
+ "Desktop preview",
38
+ "Full width preview"
39
+ ],
40
+ groupLabel: "Website",
41
+ checkIfAvailable: _temp3,
42
+ execute: _temp4
43
+ },
44
+ {
45
+ id: "set-viewport-tablet",
46
+ label: "Set tablet viewport",
47
+ aliases: ["Tablet preview", "Responsive preview"],
48
+ groupLabel: "Website",
49
+ checkIfAvailable: _temp5,
50
+ execute: _temp6
51
+ },
52
+ {
53
+ id: "set-viewport-mobile",
54
+ label: "Set mobile viewport",
55
+ aliases: [
56
+ "Mobile preview",
57
+ "Phone preview",
58
+ "Responsive preview"
59
+ ],
60
+ groupLabel: "Website",
61
+ checkIfAvailable: _temp7,
62
+ execute: _temp8
63
+ }
64
+ ];
65
+ actionsStore.send({
66
+ type: "registerManyActions",
67
+ actions
68
+ });
69
+ return () => {
70
+ actionsStore.send({
71
+ type: "unregisterManyActions",
72
+ ids: actions.map(_temp9)
73
+ });
74
+ };
75
+ }
76
+ function _temp9(action) {
77
+ return action.id;
78
+ }
79
+ function _temp8() {
80
+ return previewStore.send({
81
+ type: "setViewportMode",
82
+ mode: "mobile"
83
+ });
84
+ }
85
+ function _temp7() {
86
+ return true;
87
+ }
88
+ function _temp6() {
89
+ return previewStore.send({
90
+ type: "setViewportMode",
91
+ mode: "tablet"
92
+ });
93
+ }
94
+ function _temp5() {
95
+ return true;
96
+ }
97
+ function _temp4() {
98
+ return previewStore.send({
99
+ type: "setViewportMode",
100
+ mode: "full"
101
+ });
102
+ }
103
+ function _temp3() {
104
+ return true;
105
+ }
106
+ function _temp2() {
107
+ return previewStore.send({ type: "cycleViewportMode" });
108
+ }
109
+ function _temp() {
110
+ return true;
111
+ }
112
+
113
+ //#endregion
114
+ export { usePreviewViewportActions };