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,4 +1,6 @@
1
1
  import { getAuthCookieHeader, getAuthRequestCredentials } from "./auth.js";
2
+ import { localeHeaders } from "./locale-path.js";
3
+ import { DRAFT_HEADER, isContentWrite } from "@camox/api-contract/drafts";
2
4
  import { createORPCClient } from "@orpc/client";
3
5
  import { RPCLink } from "@orpc/client/fetch";
4
6
  import { createTanstackQueryUtils } from "@orpc/tanstack-query";
@@ -7,29 +9,57 @@ import { createTanstackQueryUtils } from "@orpc/tanstack-query";
7
9
  let _client = null;
8
10
  let _orpc = null;
9
11
  let _apiUrl = null;
10
- let _environmentName = null;
11
- function initApiClient(apiUrl, environmentName) {
12
+ let _draftScope = null;
13
+ const _readClients = /* @__PURE__ */ new Map();
14
+ /** Creates the window's API client, whose requests read and write the draft `draftScope` views. */
15
+ function initApiClient(apiUrl, draftScope) {
12
16
  _apiUrl = apiUrl;
13
- _environmentName = environmentName ?? null;
17
+ _draftScope = draftScope;
18
+ _readClients.clear();
19
+ _client = createStudioClient(apiUrl, (path) => draftScope.requestHeaders(isContentWrite(path)));
20
+ _orpc = createTanstackQueryUtils(_client);
21
+ return _client;
22
+ }
23
+ /**
24
+ * A client of the window's API whose requests name `draft` (null for Live) and `locale` (the
25
+ * default locale without it), whatever the studio views by the time they're sent. The studio's
26
+ * reads fetch through it, so a read caches only the draft and locale its key names.
27
+ */
28
+ function getDraftReadClient(draft, locale) {
29
+ const headers = {
30
+ ...draft && { [DRAFT_HEADER]: draft },
31
+ ...localeHeaders(locale)
32
+ };
33
+ const cacheKey = JSON.stringify(headers);
34
+ let client = _readClients.get(cacheKey);
35
+ if (client) return client;
36
+ client = createStudioClient(getApiUrl(), () => ({
37
+ headers,
38
+ settle: () => {}
39
+ }));
40
+ _readClients.set(cacheKey, client);
41
+ return client;
42
+ }
43
+ function createStudioClient(apiUrl, draftHeaders) {
14
44
  const headers = { "x-camox-client": "studio" };
15
- if (environmentName) headers["x-environment-name"] = environmentName;
16
45
  if (__CAMOX_TELEMETRY_DISABLED__) headers["x-camox-telemetry-disabled"] = "1";
17
- _client = createORPCClient(new RPCLink({
46
+ const link = new RPCLink({
18
47
  url: `${apiUrl}/rpc`,
19
48
  headers,
20
- fetch: (request, init) => {
49
+ fetch: async (request, init, _options, path) => {
21
50
  const authCookieHeader = getAuthCookieHeader();
22
- if (request instanceof Request) {
23
- if (authCookieHeader) request.headers.set("Better-Auth-Cookie", authCookieHeader);
24
- }
25
- return fetch(request, {
51
+ if (authCookieHeader) request.headers.set("Better-Auth-Cookie", authCookieHeader);
52
+ const draft = draftHeaders(path);
53
+ for (const [name, value] of Object.entries(draft.headers)) request.headers.set(name, value);
54
+ const response = await fetch(request, {
26
55
  ...init,
27
56
  credentials: getAuthRequestCredentials(authCookieHeader)
28
57
  });
58
+ draft.settle(response.ok);
59
+ return response;
29
60
  }
30
- }));
31
- _orpc = createTanstackQueryUtils(_client);
32
- return _client;
61
+ });
62
+ return createORPCClient(link);
33
63
  }
34
64
  function getApiClient() {
35
65
  if (!_client) throw new Error("API client not initialized — call initApiClient first");
@@ -43,9 +73,14 @@ function getApiUrl() {
43
73
  if (!_apiUrl) throw new Error("API client not initialized — call initApiClient first");
44
74
  return _apiUrl;
45
75
  }
46
- function getEnvironmentName() {
47
- return _environmentName;
76
+ /**
77
+ * Headers for a content write sent outside oRPC, such as a file upload: on Live it starts a draft
78
+ * like any other content write. Report the outcome through `settle`.
79
+ */
80
+ function getContentWriteHeaders() {
81
+ if (!_draftScope) throw new Error("API client not initialized — call initApiClient first");
82
+ return _draftScope.requestHeaders(true);
48
83
  }
49
84
 
50
85
  //#endregion
51
- export { getApiClient, getApiUrl, getEnvironmentName, getOrpc, initApiClient };
86
+ export { getApiClient, getApiUrl, getContentWriteHeaders, getDraftReadClient, getOrpc, initApiClient };
@@ -0,0 +1,17 @@
1
+ import { getAuthCookieHeader } from "./auth.js";
2
+
3
+ //#region src/lib/api-socket.ts
4
+ /**
5
+ * PartySocket options reaching the API at `apiUrl` as the signed-in editor. WebSocket upgrades
6
+ * can't carry custom headers, so the session is relayed in the query.
7
+ */
8
+ function apiSocketOptions(apiUrl) {
9
+ return {
10
+ host: apiUrl.replace(/^https?:\/\//, "").replace(/\/+$/, ""),
11
+ protocol: new URL(apiUrl).protocol === "http:" ? "ws" : "wss",
12
+ query: () => ({ _authCookie: getAuthCookieHeader() })
13
+ };
14
+ }
15
+
16
+ //#endregion
17
+ export { apiSocketOptions };
@@ -0,0 +1,39 @@
1
+ //#region src/lib/auth-page-styles.ts
2
+ const authPageStyles = `
3
+ .camox-auth-page {
4
+ align-items: center;
5
+ background: #09090b;
6
+ box-sizing: border-box;
7
+ color: #fafafa;
8
+ color-scheme: dark;
9
+ display: flex;
10
+ flex-direction: column;
11
+ font: 16px/1.5 Inter, ui-sans-serif, system-ui, sans-serif;
12
+ gap: 16px;
13
+ inset: 0;
14
+ justify-content: center;
15
+ margin: 0;
16
+ overflow: auto;
17
+ padding: 24px;
18
+ position: fixed;
19
+ text-align: center;
20
+ }
21
+ .camox-auth-page .camox-auth-spinner {
22
+ animation: camox-auth-spin 800ms linear infinite;
23
+ border: 2px solid #3f3f46;
24
+ border-radius: 999px;
25
+ border-top-color: #fafafa;
26
+ box-sizing: content-box;
27
+ flex-shrink: 0;
28
+ height: 24px;
29
+ width: 24px;
30
+ }
31
+ .camox-auth-page p { color: #a1a1aa; margin: 0; max-width: 32rem; }
32
+ @keyframes camox-auth-spin { to { transform: rotate(360deg); } }
33
+ @media (prefers-reduced-motion: reduce) {
34
+ .camox-auth-page .camox-auth-spinner { animation: none; }
35
+ }
36
+ `;
37
+
38
+ //#endregion
39
+ export { authPageStyles };
package/dist/lib/auth.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { actionsStore } from "../features/provider/actionsStore.js";
2
+ import { validatePreviewTarget } from "./preview-handoff.js";
2
3
  import { SERVER_AUTH_COOKIE_NAME, buildClearServerAuthCookieHeader, getServerAuthCookieHeader } from "./server-auth-cookie.js";
3
4
  import { c } from "react/compiler-runtime";
4
5
  import * as React from "react";
@@ -181,23 +182,46 @@ function createCamoxAuthClient(apiUrl) {
181
182
  * Process a `?ott=` one-time token from the URL before the provider mounts.
182
183
  * Verifies the token against the API backend and notifies the session store.
183
184
  *
184
- * Returns `true` once processing is complete (or if there was no OTT).
185
+ * Reports completion and explicit handoff failures instead of silently showing live content.
186
+ * Keeps the handoff marker until SSR confirms authentication on the subsequent load.
185
187
  */
186
- function useProcessOtt(authClient) {
188
+ function useProcessOtt(authClient, target, initialAuthenticated = false) {
189
+ const { projectUuid, apiUrl } = target;
190
+ const [error, setError] = React.useState(null);
191
+ const processing = React.useRef(false);
187
192
  const [ready, setReady] = React.useState(() => {
188
193
  if (typeof window === "undefined") return true;
189
194
  return !new URL(window.location.href).searchParams.has("ott");
190
195
  });
191
196
  React.useEffect(() => {
192
- if (ready) return;
193
197
  const url = new URL(window.location.href);
198
+ const targetError = validatePreviewTarget(url.searchParams.get("camox-preview"), {
199
+ projectUuid,
200
+ apiUrl
201
+ });
202
+ if (targetError) {
203
+ url.searchParams.delete("ott");
204
+ window.history.replaceState(window.history.state, "", url);
205
+ setError(targetError);
206
+ setReady(true);
207
+ return;
208
+ }
209
+ if (ready) {
210
+ if (initialAuthenticated && !error && url.searchParams.has("camox-preview")) {
211
+ url.searchParams.delete("camox-preview");
212
+ window.history.replaceState(window.history.state, "", url);
213
+ }
214
+ return;
215
+ }
216
+ if (processing.current) return;
194
217
  const ott = url.searchParams.get("ott");
195
218
  if (!ott) {
196
219
  setReady(true);
197
220
  return;
198
221
  }
222
+ processing.current = true;
199
223
  url.searchParams.delete("ott");
200
- window.history.replaceState({}, "", url);
224
+ window.history.replaceState(window.history.state, "", url);
201
225
  (async () => {
202
226
  try {
203
227
  const verification = await authClient.oneTimeToken.verify({ token: ott });
@@ -205,84 +229,139 @@ function useProcessOtt(authClient) {
205
229
  if (!verification.data) throw new Error("OTT verification returned no session");
206
230
  window.location.reload();
207
231
  return;
208
- } catch {}
232
+ } catch {
233
+ setError("Preview sign-in failed. The link may have expired or already been used. Run camox preview again for a fresh link.");
234
+ }
209
235
  setReady(true);
210
236
  })();
211
- }, [authClient, ready]);
212
- return ready;
237
+ }, [
238
+ authClient,
239
+ ready,
240
+ error,
241
+ initialAuthenticated,
242
+ projectUuid,
243
+ apiUrl
244
+ ]);
245
+ return {
246
+ ready,
247
+ error
248
+ };
213
249
  }
214
250
  const AuthContext = React.createContext(null);
215
251
  function useAuthContext() {
216
- const $ = c(1);
217
- if ($[0] !== "49cbba734e7826ee7cc1d1d95d5d7895a7a71f25806548ac312288b5b8a802f3") {
218
- for (let $i = 0; $i < 1; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
219
- $[0] = "49cbba734e7826ee7cc1d1d95d5d7895a7a71f25806548ac312288b5b8a802f3";
220
- }
221
252
  const ctx = React.useContext(AuthContext);
222
253
  if (!ctx) throw new Error("Missing CamoxProvider");
223
254
  return ctx;
224
255
  }
225
- function useProjectSlug() {
226
- const $ = c(1);
227
- if ($[0] !== "49cbba734e7826ee7cc1d1d95d5d7895a7a71f25806548ac312288b5b8a802f3") {
228
- for (let $i = 0; $i < 1; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
229
- $[0] = "49cbba734e7826ee7cc1d1d95d5d7895a7a71f25806548ac312288b5b8a802f3";
230
- }
231
- return useAuthContext().projectSlug;
256
+ function useProjectUuid() {
257
+ return useAuthContext().projectUuid;
232
258
  }
233
259
  const subscribeToHydration = () => () => {};
260
+ function hasStoredAuthCookie() {
261
+ return getCookie(localStorage.getItem("better-auth_cookie") || "{}") !== "";
262
+ }
263
+ const noSubscription = () => () => {};
264
+ /**
265
+ * The session, from the client's session store. Listening to the store fetches the session from
266
+ * the API, so an untracked session stays unfetched.
267
+ */
268
+ function useSessionState(authClient, track) {
269
+ const $ = c(4);
270
+ const sessionAtom = authClient.$store.atoms.session;
271
+ let t0;
272
+ if ($[0] !== sessionAtom) {
273
+ t0 = () => sessionAtom.value;
274
+ $[0] = sessionAtom;
275
+ $[1] = t0;
276
+ } else t0 = $[1];
277
+ const getSnapshot = t0;
278
+ let t1;
279
+ if ($[2] !== sessionAtom) {
280
+ t1 = (onChange) => sessionAtom.listen(onChange);
281
+ $[2] = sessionAtom;
282
+ $[3] = t1;
283
+ } else t1 = $[3];
284
+ const subscribe = t1;
285
+ return React.useSyncExternalStore(track ? subscribe : noSubscription, getSnapshot, getSnapshot);
286
+ }
234
287
  function useAuthState() {
235
- const { authClient, initialAuthenticated = false } = useAuthContext();
236
- const { data: session, isPending } = authClient.useSession();
237
- const useInitial = !React.useSyncExternalStore(subscribeToHydration, () => true, () => false) || isPending;
238
- return {
239
- isAuthenticated: useInitial ? initialAuthenticated : !!session,
240
- isLoading: useInitial && !initialAuthenticated
241
- };
288
+ const $ = c(8);
289
+ const { authClient, initialAuthenticated: t0 } = useAuthContext();
290
+ const initialAuthenticated = t0 === void 0 ? false : t0;
291
+ const hydrated = React.useSyncExternalStore(subscribeToHydration, _temp2, _temp3);
292
+ let t1;
293
+ if ($[0] !== hydrated || $[1] !== initialAuthenticated) {
294
+ t1 = initialAuthenticated || hydrated && hasStoredAuthCookie();
295
+ $[0] = hydrated;
296
+ $[1] = initialAuthenticated;
297
+ $[2] = t1;
298
+ } else t1 = $[2];
299
+ const tracksSession = t1;
300
+ const { data: session, isPending } = useSessionState(authClient, tracksSession);
301
+ if (!tracksSession) {
302
+ const t2 = !hydrated;
303
+ let t3;
304
+ if ($[3] !== t2) {
305
+ t3 = {
306
+ isAuthenticated: false,
307
+ isLoading: t2
308
+ };
309
+ $[3] = t2;
310
+ $[4] = t3;
311
+ } else t3 = $[4];
312
+ return t3;
313
+ }
314
+ const useInitial = !hydrated || isPending;
315
+ const t2 = useInitial ? initialAuthenticated : !!session;
316
+ const t3 = useInitial && !initialAuthenticated;
317
+ let t4;
318
+ if ($[5] !== t2 || $[6] !== t3) {
319
+ t4 = {
320
+ isAuthenticated: t2,
321
+ isLoading: t3
322
+ };
323
+ $[5] = t2;
324
+ $[6] = t3;
325
+ $[7] = t4;
326
+ } else t4 = $[7];
327
+ return t4;
328
+ }
329
+ function _temp3() {
330
+ return false;
331
+ }
332
+ function _temp2() {
333
+ return true;
242
334
  }
243
335
  function useIsAuthenticated() {
244
- const $ = c(1);
245
- if ($[0] !== "49cbba734e7826ee7cc1d1d95d5d7895a7a71f25806548ac312288b5b8a802f3") {
246
- for (let $i = 0; $i < 1; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
247
- $[0] = "49cbba734e7826ee7cc1d1d95d5d7895a7a71f25806548ac312288b5b8a802f3";
248
- }
249
336
  const { isAuthenticated } = useAuthState();
250
337
  return isAuthenticated;
251
338
  }
252
339
  function useSignInRedirect(callbackHref) {
253
- const $ = c(4);
254
- if ($[0] !== "49cbba734e7826ee7cc1d1d95d5d7895a7a71f25806548ac312288b5b8a802f3") {
255
- for (let $i = 0; $i < 4; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
256
- $[0] = "49cbba734e7826ee7cc1d1d95d5d7895a7a71f25806548ac312288b5b8a802f3";
257
- }
340
+ const $ = c(3);
258
341
  const { authenticationUrl } = useAuthContext();
259
342
  let t0;
260
- if ($[1] !== authenticationUrl || $[2] !== callbackHref) {
343
+ if ($[0] !== authenticationUrl || $[1] !== callbackHref) {
261
344
  t0 = () => {
262
345
  if (typeof window === "undefined") return;
263
346
  const href = typeof callbackHref === "function" ? callbackHref() : callbackHref;
264
347
  const callback = encodeURIComponent(href ?? window.location.href);
265
348
  window.location.href = `${authenticationUrl}/studio-authorize?callback=${callback}`;
266
349
  };
267
- $[1] = authenticationUrl;
268
- $[2] = callbackHref;
269
- $[3] = t0;
270
- } else t0 = $[3];
350
+ $[0] = authenticationUrl;
351
+ $[1] = callbackHref;
352
+ $[2] = t0;
353
+ } else t0 = $[2];
271
354
  return t0;
272
355
  }
273
356
  /**
274
357
  * Registers sign-out and manage-account actions in the command palette.
275
358
  */
276
359
  function useAuthActions() {
277
- const $ = c(5);
278
- if ($[0] !== "49cbba734e7826ee7cc1d1d95d5d7895a7a71f25806548ac312288b5b8a802f3") {
279
- for (let $i = 0; $i < 5; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
280
- $[0] = "49cbba734e7826ee7cc1d1d95d5d7895a7a71f25806548ac312288b5b8a802f3";
281
- }
360
+ const $ = c(4);
282
361
  const { authClient, authenticationUrl } = useAuthContext();
283
362
  let t0;
284
363
  let t1;
285
- if ($[1] !== authClient || $[2] !== authenticationUrl) {
364
+ if ($[0] !== authClient || $[1] !== authenticationUrl) {
286
365
  t0 = () => {
287
366
  actionsStore.send({
288
367
  type: "registerManyActions",
@@ -295,7 +374,7 @@ function useAuthActions() {
295
374
  "User settings"
296
375
  ],
297
376
  groupLabel: "Studio",
298
- checkIfAvailable: _temp,
377
+ checkIfAvailable: _temp4,
299
378
  execute: () => {
300
379
  window.open(`${authenticationUrl}/profile`, "_blank");
301
380
  }
@@ -304,35 +383,35 @@ function useAuthActions() {
304
383
  label: "Log out",
305
384
  aliases: ["Sign out", "Logout"],
306
385
  groupLabel: "Studio",
307
- checkIfAvailable: _temp2,
386
+ checkIfAvailable: _temp5,
308
387
  execute: () => authClient.signOut()
309
388
  }]
310
389
  });
311
- return _temp3;
390
+ return _temp6;
312
391
  };
313
392
  t1 = [authClient, authenticationUrl];
314
- $[1] = authClient;
315
- $[2] = authenticationUrl;
316
- $[3] = t0;
317
- $[4] = t1;
393
+ $[0] = authClient;
394
+ $[1] = authenticationUrl;
395
+ $[2] = t0;
396
+ $[3] = t1;
318
397
  } else {
319
- t0 = $[3];
320
- t1 = $[4];
398
+ t0 = $[2];
399
+ t1 = $[3];
321
400
  }
322
401
  React.useEffect(t0, t1);
323
402
  }
324
- function _temp3() {
403
+ function _temp6() {
325
404
  actionsStore.send({
326
405
  type: "unregisterManyActions",
327
406
  ids: ["manage-account", "log-out"]
328
407
  });
329
408
  }
330
- function _temp2() {
409
+ function _temp5() {
331
410
  return true;
332
411
  }
333
- function _temp() {
412
+ function _temp4() {
334
413
  return true;
335
414
  }
336
415
 
337
416
  //#endregion
338
- export { AuthContext, createCamoxAuthClient, getAuthCookieHeader, getAuthRequestCredentials, useAuthActions, useAuthContext, useAuthState, useIsAuthenticated, useProcessOtt, useProjectSlug, useSignInRedirect };
417
+ export { AuthContext, createCamoxAuthClient, getAuthCookieHeader, getAuthRequestCredentials, useAuthActions, useAuthContext, useAuthState, useIsAuthenticated, useProcessOtt, useProjectUuid, useSignInRedirect };
@@ -0,0 +1,23 @@
1
+ import { queryKeys } from "@camox/api-contract/query-keys";
2
+
3
+ //#region src/lib/collection-cache.ts
4
+ /**
5
+ * Refreshes a collection's records in every placement, in every scope, as the API's broadcast
6
+ * after a record edit does, so the edit shows even without a realtime connection.
7
+ */
8
+ function invalidateCollectionRecordViews(studioCache, projectUuid, collectionId) {
9
+ return studioCache.receive({
10
+ type: "invalidate",
11
+ draftId: null,
12
+ targets: [
13
+ queryKeys.collections.records(projectUuid, collectionId),
14
+ ["camox", "blocks"],
15
+ queryKeys.pages.getByPathAll,
16
+ queryKeys.pages.list,
17
+ queryKeys.layouts.all
18
+ ]
19
+ }, 0);
20
+ }
21
+
22
+ //#endregion
23
+ export { invalidateCollectionRecordViews };
@@ -0,0 +1,4 @@
1
+ import "../features/routes/pageRuntime.js";
2
+ import "react";
3
+ import { EndedDraft } from "@camox/api-contract/drafts";
4
+ import { QueryClient } from "@tanstack/react-query";