camox 0.44.0 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (407) hide show
  1. package/dist/components/AuthGate.js +0 -6
  2. package/dist/components/DeviceSelector.js +96 -0
  3. package/dist/components/PlatformLabel.js +20 -24
  4. package/dist/core/components/lexical/HighlightNode.js +1 -1
  5. package/dist/core/components/lexical/InlineContentEditable.js +15 -19
  6. package/dist/core/components/lexical/InlineLexicalEditor.js +54 -74
  7. package/dist/core/components/lexical/InlineStylesPlugin.js +53 -53
  8. package/dist/core/components/lexical/MaxLengthPlugin.js +59 -0
  9. package/dist/core/components/lexical/SelectionBroadcaster.js +53 -54
  10. package/dist/core/components/lexical/SidebarLexicalEditor.js +322 -229
  11. package/dist/core/components/lexical/SummaryToggleGuard.js +42 -0
  12. package/dist/core/components/lexical/TextLinkPopover.js +169 -180
  13. package/dist/core/createApp.d.ts +241 -312
  14. package/dist/core/createApp.js +123 -29
  15. package/dist/core/createBlock.d.ts +5 -5
  16. package/dist/core/createBlock.js +385 -152
  17. package/dist/core/createCollection.d.ts +55 -0
  18. package/dist/core/createCollection.js +93 -0
  19. package/dist/core/createLayout.d.ts +197 -61
  20. package/dist/core/createLayout.js +114 -56
  21. package/dist/core/defineDocument.d.ts +3 -5
  22. package/dist/core/derivedRoutes.js +49 -1
  23. package/dist/core/dom.d.ts +13 -4
  24. package/dist/core/dom.js +44 -1
  25. package/dist/core/editing/BlockEditingRuntime.d.ts +16 -0
  26. package/dist/core/editing/BlockEditingRuntime.js +6 -15
  27. package/dist/core/editing/CompleteBlockEditingRuntime.js +28 -23
  28. package/dist/core/editing/createEditableBlock.d.ts +754 -633
  29. package/dist/core/editing/createEditableBlock.js +2113 -1066
  30. package/dist/core/editing/referenceWrites.js +51 -0
  31. package/dist/core/editing/useLatestRecord.js +90 -0
  32. package/dist/core/hooks/useArtifactHost.js +139 -0
  33. package/dist/core/hooks/useFieldSelection.js +43 -18
  34. package/dist/core/hooks/useIsEditable.js +12 -10
  35. package/dist/core/hooks/useOverlayMessage.js +15 -19
  36. package/dist/core/lib/artifact.d.ts +21 -0
  37. package/dist/core/lib/artifact.js +154 -0
  38. package/dist/core/lib/artifactColors.js +123 -0
  39. package/dist/core/lib/artifactData.d.ts +1 -0
  40. package/dist/core/lib/artifactData.js +131 -0
  41. package/dist/core/lib/artifactHost.js +205 -0
  42. package/dist/core/lib/artifactRuntime.js +36 -0
  43. package/dist/core/lib/artifactTheme.js +57 -0
  44. package/dist/core/lib/contentType.d.ts +302 -106
  45. package/dist/core/lib/contentType.js +201 -173
  46. package/dist/core/lib/fieldTypes.js +3 -0
  47. package/dist/core/lib/iconTypes.d.ts +3 -3
  48. package/dist/core/lib/icons.d.ts +4 -4
  49. package/dist/core/lib/icons.js +40 -44
  50. package/dist/core/lib/imagePlaceholder.js +177 -0
  51. package/dist/core/lib/imageTransform.js +1 -1
  52. package/dist/core/lib/lexicalReact.d.ts +3 -1
  53. package/dist/core/lib/lexicalState.js +1 -1
  54. package/dist/core/lib/previewPaused.js +9 -0
  55. package/dist/core/lib/recordScope.js +316 -0
  56. package/dist/core/lib/reference.d.ts +81 -0
  57. package/dist/core/lib/reference.js +29 -0
  58. package/dist/core/lib/textLinks.js +7 -5
  59. package/dist/core/lib/textStyles.d.ts +5 -7
  60. package/dist/core/lib/textStyles.js +2 -2
  61. package/dist/core/notFound.d.ts +7 -0
  62. package/dist/core/notFound.js +11 -0
  63. package/dist/core/pageDestinations.js +6 -3
  64. package/dist/core/recordItem.js +34 -0
  65. package/dist/core/requestContext.d.ts +26 -0
  66. package/dist/core/requestContext.js +20 -0
  67. package/dist/features/canvas/CamoxCanvas.js +1401 -0
  68. package/dist/features/canvas/CanvasLoadingScreen.js +35 -0
  69. package/dist/features/canvas/CanvasOverlays.js +254 -0
  70. package/dist/features/canvas/CanvasPageEdge.js +87 -0
  71. package/dist/features/canvas/CanvasPageFrame.js +333 -0
  72. package/dist/features/canvas/CanvasPageHeader.js +125 -0
  73. package/dist/features/canvas/CanvasPreviewPageSlot.js +123 -0
  74. package/dist/features/canvas/DerivedPagePathInput.js +238 -0
  75. package/dist/features/canvas/canvasCamera.js +229 -0
  76. package/dist/features/canvas/canvasFlight.js +104 -0
  77. package/dist/features/canvas/canvasFrameCapture.js +364 -0
  78. package/dist/features/canvas/canvasFrameDocument.js +302 -0
  79. package/dist/features/canvas/canvasFrameMode.js +53 -0
  80. package/dist/features/canvas/canvasInsertionSeams.js +44 -0
  81. package/dist/features/canvas/canvasItems.js +30 -0
  82. package/dist/features/canvas/canvasOverlayGeometry.js +240 -0
  83. package/dist/features/canvas/canvasPages.js +79 -0
  84. package/dist/features/canvas/canvasScreenSpace.js +26 -0
  85. package/dist/features/canvas/canvasSelection.js +18 -0
  86. package/dist/features/canvas/canvasStore.js +60 -0
  87. package/dist/features/canvas/canvasThumbnails.js +304 -0
  88. package/dist/features/canvas/canvasZoom.js +10 -0
  89. package/dist/features/canvas/sidebar/CanvasInspector.js +202 -0
  90. package/dist/features/canvas/sidebar/CanvasNavigator.js +124 -0
  91. package/dist/features/canvas/sidebar/CanvasSidebar.js +54 -0
  92. package/dist/features/canvas/sidebar/CanvasSidebarFrame.js +48 -0
  93. package/dist/features/canvas/sidebar/CanvasSidebarSkeleton.js +39 -0
  94. package/dist/features/canvas/sidebar/CuratedPageInspector.js +69 -0
  95. package/dist/features/canvas/sidebar/DerivedPageInspector.js +37 -0
  96. package/dist/features/canvas/sidebar/LayoutPageBlocks.js +78 -0
  97. package/dist/features/canvas/sidebar/LayoutPageOverview.js +71 -0
  98. package/dist/features/canvas/sidebar/PageInspector.js +157 -0
  99. package/dist/features/canvas/sidebar/PageInspectorSkeleton.js +90 -0
  100. package/dist/features/canvas/sidebar/PageOverview.js +27 -0
  101. package/dist/features/canvas/sidebar/SingletonPageInspector.js +31 -0
  102. package/dist/features/canvas/useCanvasCamera.js +783 -0
  103. package/dist/features/canvas/useCanvasFrame.js +148 -0
  104. package/dist/features/canvas/useCanvasFrameInput.js +97 -0
  105. package/dist/features/canvas/useCanvasNearness.js +57 -0
  106. package/dist/features/canvas/useDiscoveredPreviewPaths.js +62 -0
  107. package/dist/features/content/CamoxContent.d.ts +2 -5
  108. package/dist/features/content/CamoxContent.js +174 -271
  109. package/dist/features/content/CollectionItemSheetContext.js +106 -0
  110. package/dist/features/content/ContentAssets.js +315 -0
  111. package/dist/features/content/ContentCollection.js +663 -0
  112. package/dist/features/content/collection-form.js +58 -0
  113. package/dist/features/content/components/AssetCard.js +80 -84
  114. package/dist/features/content/components/AssetCardSkeleton.js +4 -8
  115. package/dist/features/content/components/ContentSidebar.js +129 -18
  116. package/dist/features/content/components/ContentSidebarGroup.js +37 -0
  117. package/dist/features/content/components/DeleteCollectionItemButton.js +202 -0
  118. package/dist/features/content/components/MissingFromLocale.js +282 -0
  119. package/dist/features/content/components/UploadDropZone.js +27 -31
  120. package/dist/features/content/components/UploadProgressDrawer.js +90 -98
  121. package/dist/features/navigation/navigation.d.ts +66 -20
  122. package/dist/features/navigation/navigation.js +257 -90
  123. package/dist/features/og/defaultFonts.js +8 -8
  124. package/dist/features/og/geist-variable-ttf-base64.js +1 -1
  125. package/dist/features/og/imageResponse.d.ts +8 -0
  126. package/dist/features/og/imageResponse.js +26 -0
  127. package/dist/features/page/CuratedPageContent.js +167 -0
  128. package/dist/features/page/DerivedPageContent.js +26 -30
  129. package/dist/features/page/SharedLayoutContent.js +25 -27
  130. package/dist/features/preview/CamoxPreview.d.ts +23 -61
  131. package/dist/features/preview/CamoxPreview.js +816 -537
  132. package/dist/features/preview/EditablePageContent.js +1 -1
  133. package/dist/features/preview/EditablePageExperience.js +16 -22
  134. package/dist/features/preview/components/AddBlockSheet.js +273 -0
  135. package/dist/features/preview/components/AssetFieldEditor.js +173 -154
  136. package/dist/features/preview/components/AssetLightbox.js +181 -134
  137. package/dist/features/preview/components/AssetPickerModal.js +153 -170
  138. package/dist/features/preview/components/BlockActionsPopover.js +150 -149
  139. package/dist/features/preview/components/BlockErrorBoundary.js +8 -12
  140. package/dist/features/preview/components/BlockThumbnail.js +172 -98
  141. package/dist/features/preview/components/CanvasPreview.js +243 -0
  142. package/dist/features/preview/components/CreatePageModal.js +128 -137
  143. package/dist/features/preview/components/DebouncedFieldEditor.js +29 -33
  144. package/dist/features/preview/components/DerivedLayoutDialog.js +21 -19
  145. package/dist/features/preview/components/DrillRow.js +150 -0
  146. package/dist/features/preview/components/FieldOverlayStyles.js +11 -8
  147. package/dist/features/preview/components/FieldToolbar.js +160 -110
  148. package/dist/features/preview/components/Frame.js +108 -20
  149. package/dist/features/preview/components/IconFieldEditor.js +62 -66
  150. package/dist/features/preview/components/ItemFieldsEditor.js +231 -205
  151. package/dist/features/preview/components/LinkFieldEditor.js +135 -139
  152. package/dist/features/preview/components/Metadata.js +22 -30
  153. package/dist/features/preview/components/MobilePreviewDrawer.js +89 -108
  154. package/dist/features/preview/components/MultipleAssetFieldEditor.js +334 -246
  155. package/dist/features/preview/components/OverlayTracker.js +9 -41
  156. package/dist/features/preview/components/Overlays.js +81 -69
  157. package/dist/features/preview/components/PageInfo.js +1748 -0
  158. package/dist/features/preview/components/PageInfoSkeleton.js +51 -0
  159. package/dist/features/preview/components/PageLocationFieldset.js +112 -116
  160. package/dist/features/preview/components/PageNavigatorHeader.js +24 -0
  161. package/dist/features/preview/components/PageNicknameField.js +22 -26
  162. package/dist/features/preview/components/PagePicker.js +128 -130
  163. package/dist/features/preview/components/PageTree.js +525 -532
  164. package/dist/features/preview/components/PreviewActivation.js +28 -32
  165. package/dist/features/preview/components/PreviewPanel.js +620 -319
  166. package/dist/features/preview/components/PreviewToolbar.js +105 -333
  167. package/dist/features/preview/components/RecordCard.js +80 -0
  168. package/dist/features/preview/components/RecordCombobox.js +178 -0
  169. package/dist/features/preview/components/ReferenceFieldEditor.js +149 -0
  170. package/dist/features/preview/components/ReferenceListFieldEditor.js +432 -0
  171. package/dist/features/preview/components/RemovedBlockPlaceholder.js +95 -0
  172. package/dist/features/preview/components/RepeatableItemsList.js +125 -138
  173. package/dist/features/preview/components/SelectionEditor.js +993 -0
  174. package/dist/features/preview/components/ShikiMarkdown.js +14 -18
  175. package/dist/features/preview/components/SidebarSection.js +52 -64
  176. package/dist/features/preview/components/StudioEditingFallback.js +56 -0
  177. package/dist/features/preview/components/UnlinkAssetButton.js +104 -107
  178. package/dist/features/preview/components/blockGridNavigation.js +15 -0
  179. package/dist/features/preview/components/contentFieldSchema.js +8 -0
  180. package/dist/features/preview/components/useFieldWriter.js +200 -0
  181. package/dist/features/preview/components/useRecordView.js +383 -0
  182. package/dist/features/preview/components/useRepeatableItemActions.js +35 -37
  183. package/dist/features/preview/components/useUpdateBlockPosition.js +37 -37
  184. package/dist/features/preview/editingFrame.js +197 -0
  185. package/dist/features/preview/overlayHighlights.js +17 -44
  186. package/dist/features/preview/overlayMessages.js +72 -1
  187. package/dist/features/preview/pageRecord.js +189 -0
  188. package/dist/features/preview/previewConstants.js +6 -2
  189. package/dist/features/preview/previewPageFrame.js +95 -0
  190. package/dist/features/preview/previewPreparation.js +7 -0
  191. package/dist/features/preview/previewSelection.js +32 -63
  192. package/dist/features/preview/previewStore.js +225 -123
  193. package/dist/features/preview/referencePickerFocus.js +29 -0
  194. package/dist/features/preview/repeatableItemTargets.js +56 -0
  195. package/dist/features/preview/selectionReveal.js +21 -0
  196. package/dist/features/preview/usePreviewViewportActions.js +114 -0
  197. package/dist/features/preview/viewportContinuity.js +109 -0
  198. package/dist/features/provider/AuthenticatedCamoxProvider.js +69 -44
  199. package/dist/features/provider/CamoxProvider.d.ts +3 -6
  200. package/dist/features/provider/CamoxProvider.js +38 -50
  201. package/dist/features/provider/CoreCamoxProvider.js +69 -50
  202. package/dist/features/provider/LocalhostPreviewProvider.js +78 -114
  203. package/dist/features/provider/PreviewSignInPage.js +54 -0
  204. package/dist/features/provider/components/CamoxAppContext.js +11 -11
  205. package/dist/features/provider/components/CommandPalette.js +75 -82
  206. package/dist/features/provider/useAdminShortcuts.js +7 -11
  207. package/dist/features/routes/pageRuntime.d.ts +44 -4
  208. package/dist/features/routes/pageRuntime.js +244 -137
  209. package/dist/features/runtime/RuntimeChrome.js +117 -115
  210. package/dist/features/runtime/alternates.js +64 -0
  211. package/dist/features/runtime/analytics.d.ts +7 -0
  212. package/dist/features/runtime/analytics.js +66 -0
  213. package/dist/features/runtime/artifactSources.js +87 -0
  214. package/dist/features/runtime/editingFallback.js +20 -0
  215. package/dist/features/runtime/linkPrefetch.js +97 -0
  216. package/dist/features/runtime/livePages.js +62 -0
  217. package/dist/features/runtime/llmsTxt.js +40 -0
  218. package/dist/features/runtime/loopbackFetch.js +18 -0
  219. package/dist/features/runtime/navigationAccessibility.js +51 -0
  220. package/dist/features/runtime/navigationTarget.js +23 -2
  221. package/dist/features/runtime/pageApp.js +229 -158
  222. package/dist/features/runtime/pageBlockTypes.js +20 -0
  223. package/dist/features/runtime/pageClient.d.ts +2 -4
  224. package/dist/features/runtime/pageClient.js +18 -3
  225. package/dist/features/runtime/pageNavigation.js +254 -32
  226. package/dist/features/runtime/pageServer.d.ts +2 -4
  227. package/dist/features/runtime/pageServer.js +6 -2
  228. package/dist/features/runtime/pageViewport.js +7 -0
  229. package/dist/features/runtime/runtime.d.ts +54 -24
  230. package/dist/features/runtime/runtime.js +766 -191
  231. package/dist/features/runtime/runtimeChromeLoader.js +58 -0
  232. package/dist/features/runtime/runtimeRoutes.d.ts +19 -0
  233. package/dist/features/runtime/runtimeRoutes.js +25 -0
  234. package/dist/features/runtime/scrollRestoration.js +133 -0
  235. package/dist/features/runtime/studioApp.d.ts +4 -3
  236. package/dist/features/runtime/studioApp.js +5 -9
  237. package/dist/features/runtime/studioClient.d.ts +2 -4
  238. package/dist/features/runtime/studioClient.js +12 -3
  239. package/dist/features/runtime/studioServer.d.ts +2 -4
  240. package/dist/features/runtime/studioServer.js +6 -1
  241. package/dist/features/runtime/worker.d.ts +6 -0
  242. package/dist/features/runtime/worker.js +23 -0
  243. package/dist/features/runtime/workerRequest.js +44 -0
  244. package/dist/features/studio/CamoxStudio.d.ts +2 -6
  245. package/dist/features/studio/CamoxStudio.js +34 -49
  246. package/dist/features/studio/FollowAgentProvider.js +327 -0
  247. package/dist/features/studio/components/ChatSidebar.js +356 -0
  248. package/dist/features/studio/components/DraftsControl.js +676 -0
  249. package/dist/features/studio/components/FaviconDialog.js +318 -0
  250. package/dist/features/studio/components/LocalePicker.js +785 -0
  251. package/dist/features/studio/components/Navbar.js +123 -103
  252. package/dist/features/studio/components/ProjectMenu.js +239 -260
  253. package/dist/features/studio/components/RenameDraftDialog.js +206 -0
  254. package/dist/features/studio/components/ReviewDraftSheet.js +1472 -0
  255. package/dist/features/studio/components/ThreadComposer.js +157 -0
  256. package/dist/features/studio/components/ThreadMarkdown.js +113 -0
  257. package/dist/features/studio/components/ThreadMessages.js +270 -0
  258. package/dist/features/studio/components/UserButton.js +34 -23
  259. package/dist/features/studio/draftLabel.js +33 -0
  260. package/dist/features/studio/draftNotice.js +13 -0
  261. package/dist/features/studio/followAgent.js +241 -0
  262. package/dist/features/studio/followAgentContext.js +7 -0
  263. package/dist/features/studio/localeOptions.js +118 -0
  264. package/dist/features/studio/localeSwitch.js +19 -0
  265. package/dist/features/studio/routes.js +26 -1
  266. package/dist/features/studio/studioStore.js +64 -1
  267. package/dist/features/studio/useTheme.js +24 -27
  268. package/dist/features/vite/artifactRuntimeMinification.js +36 -0
  269. package/dist/features/vite/blockBoilerplate.js +6 -5
  270. package/dist/features/vite/blockChunks.js +31 -0
  271. package/dist/features/vite/bundlerLogs.js +17 -0
  272. package/dist/features/vite/definitionsSync.js +158 -226
  273. package/dist/features/vite/devAuthentication.js +4 -16
  274. package/dist/features/vite/devSignIn.js +87 -0
  275. package/dist/features/vite/iconGeneration.js +1 -1
  276. package/dist/features/vite/layoutGeneration.js +11 -1
  277. package/dist/features/vite/publishSeededContent.js +30 -0
  278. package/dist/features/vite/routeGeneration.js +6 -7
  279. package/dist/features/vite/runtimeDev.js +80 -99
  280. package/dist/features/vite/vite.d.ts +51 -31
  281. package/dist/features/vite/vite.js +224 -127
  282. package/dist/features/vite/workerBuild.js +39 -0
  283. package/dist/hooks/use-debounced-field.js +116 -47
  284. package/dist/hooks/use-file-upload.js +114 -67
  285. package/dist/hooks/use-marquee-selection.js +32 -36
  286. package/dist/hooks/use-page-destinations.js +69 -37
  287. package/dist/lib/api-client-server.d.ts +5 -0
  288. package/dist/lib/api-client-server.js +10 -4
  289. package/dist/lib/api-client.d.ts +6 -0
  290. package/dist/lib/api-client.js +51 -16
  291. package/dist/lib/api-socket.js +17 -0
  292. package/dist/lib/auth-page-styles.js +39 -0
  293. package/dist/lib/auth.js +129 -61
  294. package/dist/lib/collection-cache.js +23 -0
  295. package/dist/lib/draft-scope.d.ts +4 -0
  296. package/dist/lib/draft-scope.js +222 -0
  297. package/dist/lib/html.js +12 -0
  298. package/dist/lib/link-pages.js +154 -0
  299. package/dist/lib/locale-path.d.ts +22 -0
  300. package/dist/lib/locale-path.js +57 -0
  301. package/dist/lib/normalized-data.js +252 -152
  302. package/dist/lib/preview-handoff.js +2 -2
  303. package/dist/lib/queries.d.ts +11 -0
  304. package/dist/lib/queries.js +70 -141
  305. package/dist/lib/studio-reads.d.ts +14 -0
  306. package/dist/lib/studio-reads.js +554 -0
  307. package/dist/lib/use-project-room.js +50 -50
  308. package/dist/lib/use-thread.js +310 -0
  309. package/dist/lib/utils.js +25 -29
  310. package/dist/lib/view-locale-context.js +22 -0
  311. package/dist/lib/view-locale.js +46 -0
  312. package/dist/package.js +5 -0
  313. package/dist/studio-overlays.css +41 -151
  314. package/dist/studio.css +2 -2
  315. package/package.json +70 -73
  316. package/skills/camox/SKILL.md +16 -11
  317. package/skills/camox/references/artifacts.md +179 -0
  318. package/skills/camox/references/block-definitions.md +75 -59
  319. package/skills/camox/references/cli-common.md +9 -11
  320. package/skills/camox/references/cli-content.md +92 -69
  321. package/skills/camox/references/cli-publishing.md +26 -0
  322. package/skills/camox/references/dom-integrations.md +27 -0
  323. package/skills/camox/references/field-styling.md +4 -4
  324. package/skills/camox/references/layout-definitions.md +16 -14
  325. package/skills/camox/references/localization.md +56 -0
  326. package/skills/camox/references/routed-layouts.md +133 -15
  327. package/skills/camox-expand/SKILL.md +70 -0
  328. package/skills/camox-expand/references/jobs.md +39 -0
  329. package/skills/camoxify/SKILL.md +29 -7
  330. package/dist/core/components/AddBlockControlBar.js +0 -78
  331. package/dist/core/hooks/useRequireDraftSource.js +0 -23
  332. package/dist/features/metadata/sitemap.d.ts +0 -8
  333. package/dist/features/metadata/sitemap.js +0 -17
  334. package/dist/features/og/imageResponse.node.d.ts +0 -12
  335. package/dist/features/og/imageResponse.node.js +0 -49
  336. package/dist/features/og/imageResponse.workerd.d.ts +0 -12
  337. package/dist/features/og/imageResponse.workerd.js +0 -40
  338. package/dist/features/page/PublishedPageContent.js +0 -205
  339. package/dist/features/page/PublishedPageExperience.js +0 -23
  340. package/dist/features/preview/DerivedPreview.js +0 -134
  341. package/dist/features/preview/commentsEnabled.js +0 -8
  342. package/dist/features/preview/components/AddBlockSidebar.js +0 -381
  343. package/dist/features/preview/components/AttachedComments.js +0 -331
  344. package/dist/features/preview/components/CommentHeader.js +0 -122
  345. package/dist/features/preview/components/CommentSidebar.js +0 -29
  346. package/dist/features/preview/components/CommentTargetQuote.js +0 -167
  347. package/dist/features/preview/components/DerivedLayoutSidebar.d.ts +0 -5
  348. package/dist/features/preview/components/DerivedLayoutSidebar.js +0 -179
  349. package/dist/features/preview/components/DerivedPageInfoSidebar.js +0 -69
  350. package/dist/features/preview/components/LeftSidebar.js +0 -68
  351. package/dist/features/preview/components/PageEditorSidebar.js +0 -563
  352. package/dist/features/preview/components/PageInfoSidebar.js +0 -1551
  353. package/dist/features/preview/components/PageNavigatorSidebar.js +0 -78
  354. package/dist/features/preview/components/PageStatusBadge.js +0 -97
  355. package/dist/features/preview/components/PeekedBlock.js +0 -217
  356. package/dist/features/preview/components/PreviewComments.js +0 -56
  357. package/dist/features/preview/components/PreviewToolbarSpacer.js +0 -43
  358. package/dist/features/preview/components/PublicationRow.js +0 -422
  359. package/dist/features/preview/components/PublishDialog.js +0 -194
  360. package/dist/features/preview/components/RightSidebar.js +0 -59
  361. package/dist/features/preview/components/SendFeedbackDialog.js +0 -83
  362. package/dist/features/preview/previewCommentsStore.js +0 -135
  363. package/dist/features/preview/publication.js +0 -81
  364. package/dist/features/preview/usePageComments.js +0 -39
  365. package/dist/features/runtime/SharedChromeContext.js +0 -7
  366. package/dist/features/studio/components/EnvironmentMenu.js +0 -425
  367. package/dist/features/vite/appGeneration.js +0 -89
  368. package/dist/lib/view-queries.js +0 -28
  369. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/Matches.d.ts +0 -114
  370. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/RouterProvider.d.ts +0 -25
  371. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/config.d.ts +0 -1
  372. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/defer.d.ts +0 -1
  373. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/fileRoute.d.ts +0 -20
  374. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/global.d.ts +0 -8
  375. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/hash-scroll.d.ts +0 -1
  376. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/index.d.ts +0 -18
  377. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/link.d.ts +0 -161
  378. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/load-matches.d.ts +0 -6
  379. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/location.d.ts +0 -54
  380. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/lru-cache.d.ts +0 -8
  381. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/manifest.d.ts +0 -32
  382. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/new-process-route-tree.d.ts +0 -115
  383. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/not-found.d.ts +0 -1
  384. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/redirect.d.ts +0 -49
  385. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/rewrite.d.ts +0 -1
  386. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/root.d.ts +0 -6
  387. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/route.d.ts +0 -343
  388. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/routeInfo.d.ts +0 -48
  389. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/router.d.ts +0 -695
  390. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/scroll-restoration.d.ts +0 -1
  391. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchMiddleware.d.ts +0 -1
  392. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchParams.d.ts +0 -5
  393. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/RawStream.d.ts +0 -38
  394. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/seroval-plugins.d.ts +0 -1
  395. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/transformer.d.ts +0 -65
  396. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/stores.d.ts +0 -69
  397. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/structuralSharing.d.ts +0 -1
  398. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/typePrimitives.d.ts +0 -1
  399. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderData.d.ts +0 -1
  400. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderDeps.d.ts +0 -1
  401. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useNavigate.d.ts +0 -10
  402. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useParams.d.ts +0 -1
  403. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useRouteContext.d.ts +0 -1
  404. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useSearch.d.ts +0 -1
  405. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/utils.d.ts +0 -28
  406. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/validators.d.ts +0 -49
  407. package/skills/camox/references/cli-environments.md +0 -37
@@ -1,71 +1,72 @@
1
1
  import { getAuthCookieHeader, getAuthRequestCredentials } from "../../../lib/auth.js";
2
- import { getApiUrl, getEnvironmentName } from "../../../lib/api-client.js";
2
+ import { getApiUrl, getContentWriteHeaders } from "../../../lib/api-client.js";
3
+ import { reads, useReadQuery } from "../../../lib/studio-reads.js";
3
4
  import { isRasterImage, transformImageUrl } from "../../../core/lib/imageTransform.js";
4
- import { fileMutations, fileQueries } from "../../../lib/queries.js";
5
5
  import { UploadDropZone } from "../../content/components/UploadDropZone.js";
6
+ import { fileMutations } from "../../../lib/queries.js";
6
7
  import { DebouncedFieldEditor } from "./DebouncedFieldEditor.js";
7
8
  import { Metadata, MetadataRow, formatRelativeTime } from "./Metadata.js";
8
9
  import { c } from "react/compiler-runtime";
9
- import { useMutation, useQuery } from "@tanstack/react-query";
10
10
  import { useCallback, useEffect, useRef, useState } from "react";
11
11
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
12
+ import { useMutation } from "@tanstack/react-query";
12
13
  import { Button } from "@camox/ui/button";
14
+ import { Label } from "@camox/ui/label";
15
+ import { Switch } from "@camox/ui/switch";
13
16
  import { Check, Download, FileIcon, Info, Link, Loader2, Trash2, X } from "lucide-react";
14
- import { toast } from "@camox/ui/toaster";
17
+ import { ButtonGroup } from "@camox/ui/button-group";
15
18
  import { Dialog, DialogContent, DialogTitle } from "@camox/ui/dialog";
16
- import { Label } from "@camox/ui/label";
19
+ import { toast } from "@camox/ui/toaster";
17
20
  import { Tooltip, TooltipContent, TooltipTrigger } from "@camox/ui/tooltip";
18
- import { ButtonGroup } from "@camox/ui/button-group";
19
- import { Switch } from "@camox/ui/switch";
20
21
 
21
22
  //#region src/features/preview/components/AssetLightbox.tsx
22
23
  function DeliveredSize(t0) {
23
- const $ = c(16);
24
- if ($[0] !== "a37322f6f4a0473903954c8afefb928b001d0a8beede19e05fe56bf7cdbe1ecf") {
25
- for (let $i = 0; $i < 16; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
26
- $[0] = "a37322f6f4a0473903954c8afefb928b001d0a8beede19e05fe56bf7cdbe1ecf";
27
- }
28
- const { bytes, raw } = t0;
24
+ const $ = c(17);
25
+ const { bytes, raw, estimated: t1 } = t0;
26
+ const estimated = t1 === void 0 ? true : t1;
29
27
  if (bytes == null) {
30
- let t1;
31
- if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
32
- t1 = /* @__PURE__ */ jsx(Fragment, { children: "…" });
33
- $[1] = t1;
34
- } else t1 = $[1];
35
- return t1;
36
- }
37
- let t1;
38
- if ($[2] !== bytes || $[3] !== raw) {
39
- t1 = raw != null && raw > 0 ? Math.round((raw - bytes) / raw * 100) : null;
40
- $[2] = bytes;
41
- $[3] = raw;
42
- $[4] = t1;
43
- } else t1 = $[4];
44
- const savingsPct = t1;
45
- if (savingsPct == null || savingsPct <= 0) {
46
28
  let t2;
47
- if ($[5] !== bytes) {
48
- t2 = formatFileSize(bytes);
49
- $[5] = bytes;
50
- $[6] = t2;
51
- } else t2 = $[6];
52
- let t3;
53
- if ($[7] !== t2) {
54
- t3 = /* @__PURE__ */ jsxs(Fragment, { children: ["≈", t2] });
55
- $[7] = t2;
56
- $[8] = t3;
57
- } else t3 = $[8];
58
- return t3;
29
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
30
+ t2 = /* @__PURE__ */ jsx(Fragment, { children: "…" });
31
+ $[0] = t2;
32
+ } else t2 = $[0];
33
+ return t2;
59
34
  }
60
35
  let t2;
36
+ if ($[1] !== bytes || $[2] !== raw) {
37
+ t2 = raw != null && raw > 0 ? Math.round((raw - bytes) / raw * 100) : null;
38
+ $[1] = bytes;
39
+ $[2] = raw;
40
+ $[3] = t2;
41
+ } else t2 = $[3];
42
+ const savingsPct = t2;
43
+ if (savingsPct == null || savingsPct <= 0) {
44
+ const t3 = estimated ? "≈" : "";
45
+ let t4;
46
+ if ($[4] !== bytes) {
47
+ t4 = formatFileSize(bytes);
48
+ $[4] = bytes;
49
+ $[5] = t4;
50
+ } else t4 = $[5];
51
+ let t5;
52
+ if ($[6] !== t3 || $[7] !== t4) {
53
+ t5 = /* @__PURE__ */ jsxs(Fragment, { children: [t3, t4] });
54
+ $[6] = t3;
55
+ $[7] = t4;
56
+ $[8] = t5;
57
+ } else t5 = $[8];
58
+ return t5;
59
+ }
60
+ const t3 = estimated ? "≈" : "";
61
+ let t4;
61
62
  if ($[9] !== bytes) {
62
- t2 = formatFileSize(bytes);
63
+ t4 = formatFileSize(bytes);
63
64
  $[9] = bytes;
64
- $[10] = t2;
65
- } else t2 = $[10];
66
- let t3;
65
+ $[10] = t4;
66
+ } else t4 = $[10];
67
+ let t5;
67
68
  if ($[11] !== savingsPct) {
68
- t3 = /* @__PURE__ */ jsxs("span", {
69
+ t5 = /* @__PURE__ */ jsxs("span", {
69
70
  className: "text-muted-foreground",
70
71
  children: [
71
72
  "(−",
@@ -74,66 +75,91 @@ function DeliveredSize(t0) {
74
75
  ]
75
76
  });
76
77
  $[11] = savingsPct;
77
- $[12] = t3;
78
- } else t3 = $[12];
79
- let t4;
80
- if ($[13] !== t2 || $[14] !== t3) {
81
- t4 = /* @__PURE__ */ jsxs(Fragment, { children: [
82
- "≈",
83
- t2,
78
+ $[12] = t5;
79
+ } else t5 = $[12];
80
+ let t6;
81
+ if ($[13] !== t3 || $[14] !== t4 || $[15] !== t5) {
82
+ t6 = /* @__PURE__ */ jsxs(Fragment, { children: [
83
+ t3,
84
+ t4,
84
85
  " ",
85
- t3
86
+ t5
86
87
  ] });
87
- $[13] = t2;
88
- $[14] = t3;
89
- $[15] = t4;
90
- } else t4 = $[15];
91
- return t4;
88
+ $[13] = t3;
89
+ $[14] = t4;
90
+ $[15] = t5;
91
+ $[16] = t6;
92
+ } else t6 = $[16];
93
+ return t6;
92
94
  }
93
95
  function DeliveredLabel(t0) {
94
- const $ = c(4);
95
- if ($[0] !== "a37322f6f4a0473903954c8afefb928b001d0a8beede19e05fe56bf7cdbe1ecf") {
96
- for (let $i = 0; $i < 4; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
97
- $[0] = "a37322f6f4a0473903954c8afefb928b001d0a8beede19e05fe56bf7cdbe1ecf";
98
- }
99
- const { children } = t0;
100
- let t1;
101
- if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
102
- t1 = /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
103
- render: /* @__PURE__ */ jsx("button", {
104
- type: "button",
105
- className: "text-muted-foreground hover:text-foreground",
106
- "aria-label": "About image optimization"
107
- }),
108
- children: /* @__PURE__ */ jsx(Info, { className: "h-3.5 w-3.5" })
109
- }), /* @__PURE__ */ jsxs(TooltipContent, {
96
+ const $ = c(13);
97
+ const { children, video: t1 } = t0;
98
+ const video = t1 === void 0 ? false : t1;
99
+ const t2 = video ? "About video optimization" : "About image optimization";
100
+ let t3;
101
+ if ($[0] !== t2) {
102
+ t3 = /* @__PURE__ */ jsx("button", {
103
+ type: "button",
104
+ className: "text-muted-foreground hover:text-foreground",
105
+ "aria-label": t2
106
+ });
107
+ $[0] = t2;
108
+ $[1] = t3;
109
+ } else t3 = $[1];
110
+ let t4;
111
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
112
+ t4 = /* @__PURE__ */ jsx(Info, { className: "h-3.5 w-3.5" });
113
+ $[2] = t4;
114
+ } else t4 = $[2];
115
+ let t5;
116
+ if ($[3] !== t3) {
117
+ t5 = /* @__PURE__ */ jsx(TooltipTrigger, {
118
+ render: t3,
119
+ children: t4
120
+ });
121
+ $[3] = t3;
122
+ $[4] = t5;
123
+ } else t5 = $[4];
124
+ let t6;
125
+ if ($[5] !== video) {
126
+ t6 = /* @__PURE__ */ jsx(TooltipContent, {
110
127
  className: "max-w-xs",
111
- children: [
128
+ children: video ? /* @__PURE__ */ jsx(Fragment, { children: "Visitors receive the optimized video. The original is preserved." }) : /* @__PURE__ */ jsxs(Fragment, { children: [
112
129
  "Visitors automatically receive a compressed WebP/AVIF version sized to their device. Estimates use ",
113
130
  DELIVERED_PHONE_WIDTH,
114
131
  "px (phone) and ",
115
132
  DELIVERED_LAPTOP_WIDTH,
116
133
  "px (laptop) — the original is preserved."
117
- ]
118
- })] });
119
- $[1] = t1;
120
- } else t1 = $[1];
121
- let t2;
122
- if ($[2] !== children) {
123
- t2 = /* @__PURE__ */ jsxs("span", {
134
+ ] })
135
+ });
136
+ $[5] = video;
137
+ $[6] = t6;
138
+ } else t6 = $[6];
139
+ let t7;
140
+ if ($[7] !== t5 || $[8] !== t6) {
141
+ t7 = /* @__PURE__ */ jsxs(Tooltip, { children: [t5, t6] });
142
+ $[7] = t5;
143
+ $[8] = t6;
144
+ $[9] = t7;
145
+ } else t7 = $[9];
146
+ let t8;
147
+ if ($[10] !== children || $[11] !== t7) {
148
+ t8 = /* @__PURE__ */ jsxs("span", {
124
149
  className: "inline-flex items-center gap-1",
125
- children: [children, t1]
150
+ children: [children, t7]
126
151
  });
127
- $[2] = children;
128
- $[3] = t2;
129
- } else t2 = $[3];
130
- return t2;
152
+ $[10] = children;
153
+ $[11] = t7;
154
+ $[12] = t8;
155
+ } else t8 = $[12];
156
+ return t8;
131
157
  }
132
158
  function formatFileSize(bytes) {
133
159
  if (bytes < 1024) return `${bytes} B`;
134
- if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
135
- if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
136
- return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
160
+ if (bytes < 1048576) return `${(bytes / 1024).toFixed(1)} KB`;
161
+ if (bytes < 1073741824) return `${(bytes / 1048576).toFixed(1)} MB`;
162
+ return `${(bytes / 1073741824).toFixed(1)} GB`;
137
163
  }
138
164
  const DELIVERED_PHONE_WIDTH = 640;
139
165
  const DELIVERED_LAPTOP_WIDTH = 1280;
@@ -149,14 +175,24 @@ async function measureContentLength(url, signal) {
149
175
  return null;
150
176
  }
151
177
  }
178
+ /**
179
+ * What to tell an editor before replacing a file in use with one of another kind (an image with
180
+ * a PDF, say): a field using it may not accept the new type, which blocks publishing, even for
181
+ * content the draft never touched. Undefined when there's nothing to warn about.
182
+ */
183
+ function replacementTypeWarning(currentType, nextType, uses) {
184
+ if (!currentType || uses === 0) return void 0;
185
+ const kind = (mimeType) => mimeType.split("/")[0] || mimeType;
186
+ if (kind(currentType) === kind(nextType)) return void 0;
187
+ return `${uses === 1 ? "1 block uses" : `${uses} blocks use`} this ${kind(currentType)}, and their fields may not accept a ${nextType || "file of unknown type"}. Publishing is blocked until each one accepts the new file. Replace anyway?`;
188
+ }
152
189
  const AssetLightbox = ({ open, onOpenChange, fileId }) => {
153
- const replaceFile = useMutation(fileMutations.replace());
154
190
  const deleteFile = useMutation(fileMutations.delete());
155
191
  const setAiMetadata = useMutation(fileMutations.setAiMetadata());
156
192
  const setFilename = useMutation(fileMutations.setFilename());
157
193
  const setAlt = useMutation(fileMutations.setAlt());
158
- const { data: file } = useQuery(fileQueries.get(fileId));
159
- const { data: usageCount } = useQuery(fileQueries.getUsageCount(fileId));
194
+ const { data: file } = useReadQuery(reads.file(fileId));
195
+ const { data: usageCount } = useReadQuery(reads.fileUsageCount(fileId));
160
196
  const [uploadState, setUploadState] = useState(null);
161
197
  const replaceInputRef = useRef(null);
162
198
  const containerRef = useRef(null);
@@ -164,17 +200,21 @@ const AssetLightbox = ({ open, onOpenChange, fileId }) => {
164
200
  const [zoomedWidth, setZoomedWidth] = useState(null);
165
201
  const clickFractionRef = useRef(null);
166
202
  const [deliveredSizes, setDeliveredSizes] = useState(null);
167
- useEffect(() => {
203
+ const [previousOpen, setPreviousOpen] = useState(open);
204
+ if (open !== previousOpen) {
205
+ setPreviousOpen(open);
168
206
  if (!open) {
169
207
  setZoomed(false);
170
208
  setZoomedWidth(null);
171
209
  }
172
- }, [open]);
210
+ }
173
211
  const isImage = file?.mimeType?.startsWith("image/") ?? false;
174
212
  const isVideo = file?.mimeType?.startsWith("video/") ?? false;
175
213
  const canUseAiMetadata = isRasterImage(file?.mimeType);
176
214
  const fileUrl = file?.url;
177
215
  const fileMimeType = file?.mimeType;
216
+ const fileSize = file?.size;
217
+ const fileProjectId = file?.projectId;
178
218
  useEffect(() => {
179
219
  if (!open || !isImage || !fileUrl) {
180
220
  setDeliveredSizes(null);
@@ -183,12 +223,12 @@ const AssetLightbox = ({ open, onOpenChange, fileId }) => {
183
223
  const phoneUrl = transformImageUrl(fileUrl, {
184
224
  width: DELIVERED_PHONE_WIDTH,
185
225
  mimeType: fileMimeType,
186
- size: file?.size
226
+ size: fileSize
187
227
  });
188
228
  const laptopUrl = transformImageUrl(fileUrl, {
189
229
  width: DELIVERED_LAPTOP_WIDTH,
190
230
  mimeType: fileMimeType,
191
- size: file?.size
231
+ size: fileSize
192
232
  });
193
233
  if (phoneUrl === fileUrl && laptopUrl === fileUrl) {
194
234
  setDeliveredSizes(null);
@@ -213,7 +253,8 @@ const AssetLightbox = ({ open, onOpenChange, fileId }) => {
213
253
  open,
214
254
  isImage,
215
255
  fileUrl,
216
- fileMimeType
256
+ fileMimeType,
257
+ fileSize
217
258
  ]);
218
259
  useEffect(() => {
219
260
  if (!zoomed || !zoomedWidth || !containerRef.current || !clickFractionRef.current) return;
@@ -231,47 +272,41 @@ const AssetLightbox = ({ open, onOpenChange, fileId }) => {
231
272
  const handleReplaceDrop = useCallback(async (files) => {
232
273
  const droppedFile = files[0];
233
274
  if (!droppedFile) return;
275
+ const warning = replacementTypeWarning(fileMimeType, droppedFile.type, usageCount ?? 0);
276
+ if (warning && !window.confirm(warning)) return;
234
277
  setUploadState({
235
278
  status: "uploading",
236
279
  progress: 0,
237
280
  filename: droppedFile.name
238
281
  });
282
+ const draft = getContentWriteHeaders();
239
283
  try {
240
284
  const formData = new FormData();
241
285
  formData.append("file", droppedFile);
242
- formData.append("projectId", String(file?.projectId ?? 0));
243
- const envName = getEnvironmentName();
286
+ formData.append("projectId", String(fileProjectId ?? 0));
244
287
  const authCookieHeader = getAuthCookieHeader();
245
- const uploadRes = await fetch(`${getApiUrl()}/files/upload`, {
288
+ const uploadRes = await fetch(`${getApiUrl()}/files/${fileId}/content`, {
246
289
  method: "POST",
247
290
  body: formData,
248
291
  credentials: getAuthRequestCredentials(authCookieHeader),
249
292
  headers: {
250
293
  ...authCookieHeader ? { "Better-Auth-Cookie": authCookieHeader } : {},
251
- ...envName ? { "x-environment-name": envName } : {}
294
+ ...draft.headers
252
295
  }
253
296
  });
297
+ draft.settle(uploadRes.ok);
254
298
  if (!uploadRes.ok) throw new Error(`Upload failed: ${uploadRes.status}`);
255
- setUploadState((prev_0) => prev_0 ? {
256
- ...prev_0,
257
- status: "committing",
258
- progress: 100
259
- } : prev_0);
260
- const { id: newFileId } = await uploadRes.json();
261
- await replaceFile.mutateAsync({
262
- id: fileId,
263
- newFileId
264
- });
265
- setUploadState((prev_1) => prev_1 ? {
266
- ...prev_1,
299
+ setUploadState((prev) => prev ? {
300
+ ...prev,
267
301
  status: "complete"
268
- } : prev_1);
302
+ } : prev);
269
303
  toast.success("File replaced");
270
304
  setTimeout(() => {
271
305
  setUploadState(null);
272
306
  onOpenChange(false);
273
307
  }, 600);
274
308
  } catch (err) {
309
+ draft.settle(false);
275
310
  const message = err instanceof Error ? err.message : "Upload failed";
276
311
  setUploadState((prev) => prev ? {
277
312
  ...prev,
@@ -282,8 +317,9 @@ const AssetLightbox = ({ open, onOpenChange, fileId }) => {
282
317
  setTimeout(() => setUploadState(null), 3e3);
283
318
  }
284
319
  }, [
285
- replaceFile,
286
- file?.projectId,
320
+ fileProjectId,
321
+ fileMimeType,
322
+ usageCount,
287
323
  fileId,
288
324
  onOpenChange
289
325
  ]);
@@ -334,18 +370,18 @@ const AssetLightbox = ({ open, onOpenChange, fileId }) => {
334
370
  ref: containerRef,
335
371
  className: `checkered absolute inset-0 ${zoomed ? "overflow-auto" : "flex items-center justify-center overflow-hidden p-6"}`,
336
372
  onClick: (e) => {
337
- const img_0 = containerRef.current?.querySelector("img");
338
- if (!img_0) return;
373
+ const img = containerRef.current?.querySelector("img");
374
+ if (!img) return;
339
375
  if (!zoomed) {
340
- const rect = img_0.getBoundingClientRect();
376
+ const rect = img.getBoundingClientRect();
341
377
  clickFractionRef.current = {
342
378
  x: (e.clientX - rect.left) / rect.width,
343
379
  y: (e.clientY - rect.top) / rect.height
344
380
  };
345
- const container_0 = containerRef.current;
346
- const scaleForWidth = container_0.clientWidth * 2.5 / img_0.clientWidth;
347
- const scaleForHeight = container_0.clientHeight * 2.5 / img_0.clientHeight;
348
- setZoomedWidth(img_0.clientWidth * Math.max(scaleForWidth, scaleForHeight));
381
+ const container = containerRef.current;
382
+ const scaleForWidth = container.clientWidth * 2.5 / img.clientWidth;
383
+ const scaleForHeight = container.clientHeight * 2.5 / img.clientHeight;
384
+ setZoomedWidth(img.clientWidth * Math.max(scaleForWidth, scaleForHeight));
349
385
  setZoomed(true);
350
386
  } else {
351
387
  setZoomed(false);
@@ -464,7 +500,7 @@ const AssetLightbox = ({ open, onOpenChange, fileId }) => {
464
500
  children: [/* @__PURE__ */ jsx(Switch, {
465
501
  id: "ai-metadata",
466
502
  disabled: !canUseAiMetadata,
467
- checked: canUseAiMetadata && file.aiMetadataEnabled !== false,
503
+ checked: canUseAiMetadata && file.aiMetadata,
468
504
  onCheckedChange: (checked) => {
469
505
  setAiMetadata.mutate({
470
506
  id: fileId,
@@ -481,7 +517,7 @@ const AssetLightbox = ({ open, onOpenChange, fileId }) => {
481
517
  label: "File name",
482
518
  placeholder: "File name...",
483
519
  initialValue: file.filename,
484
- disabled: canUseAiMetadata && file.aiMetadataEnabled !== false,
520
+ disabled: canUseAiMetadata && file.aiMetadata,
485
521
  onSave: (value) => setFilename.mutate({
486
522
  id: fileId,
487
523
  filename: value
@@ -491,11 +527,11 @@ const AssetLightbox = ({ open, onOpenChange, fileId }) => {
491
527
  label: "Alt text",
492
528
  placeholder: "Describe this file...",
493
529
  initialValue: file.alt,
494
- disabled: canUseAiMetadata && file.aiMetadataEnabled !== false,
530
+ disabled: canUseAiMetadata && file.aiMetadata,
495
531
  rows: 2,
496
- onSave: (value_0) => setAlt.mutate({
532
+ onSave: (value) => setAlt.mutate({
497
533
  id: fileId,
498
- alt: value_0
534
+ alt: value
499
535
  })
500
536
  }),
501
537
  /* @__PURE__ */ jsxs(Metadata, { children: [
@@ -520,6 +556,17 @@ const AssetLightbox = ({ open, onOpenChange, fileId }) => {
520
556
  raw: file.size
521
557
  })
522
558
  })] }),
559
+ isVideo && file.optimizedSize != null && /* @__PURE__ */ jsx(MetadataRow, {
560
+ label: /* @__PURE__ */ jsx(DeliveredLabel, {
561
+ video: true,
562
+ children: "Delivered"
563
+ }),
564
+ children: /* @__PURE__ */ jsx(DeliveredSize, {
565
+ bytes: file.optimizedSize,
566
+ raw: file.size,
567
+ estimated: false
568
+ })
569
+ }),
523
570
  /* @__PURE__ */ jsx(MetadataRow, {
524
571
  label: "Created",
525
572
  children: formatRelativeTime(file.createdAt)
@@ -542,9 +589,9 @@ const AssetLightbox = ({ open, onOpenChange, fileId }) => {
542
589
  type: "file",
543
590
  className: "hidden",
544
591
  accept: isImage ? "image/*" : isVideo ? "video/*" : "*/*",
545
- onChange: (e_0) => {
546
- if (e_0.target.files) handleReplaceDrop(e_0.target.files);
547
- e_0.target.value = "";
592
+ onChange: (e) => {
593
+ if (e.target.files) handleReplaceDrop(e.target.files);
594
+ e.target.value = "";
548
595
  }
549
596
  }),
550
597
  /* @__PURE__ */ jsx(Button, {
@@ -563,4 +610,4 @@ const AssetLightbox = ({ open, onOpenChange, fileId }) => {
563
610
  };
564
611
 
565
612
  //#endregion
566
- export { AssetLightbox };
613
+ export { AssetLightbox, replacementTypeWarning };