camox 0.44.0 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (411) hide show
  1. package/dist/components/AuthGate.js +0 -6
  2. package/dist/components/DeviceSelector.js +96 -0
  3. package/dist/components/PlatformLabel.js +20 -24
  4. package/dist/core/components/lexical/HighlightNode.js +1 -1
  5. package/dist/core/components/lexical/InlineContentEditable.js +15 -19
  6. package/dist/core/components/lexical/InlineLexicalEditor.js +54 -74
  7. package/dist/core/components/lexical/InlineStylesPlugin.js +53 -53
  8. package/dist/core/components/lexical/MaxLengthPlugin.js +59 -0
  9. package/dist/core/components/lexical/SelectionBroadcaster.js +53 -54
  10. package/dist/core/components/lexical/SidebarLexicalEditor.js +322 -229
  11. package/dist/core/components/lexical/SummaryToggleGuard.js +42 -0
  12. package/dist/core/components/lexical/TextLinkPopover.js +169 -180
  13. package/dist/core/createApp.d.ts +241 -312
  14. package/dist/core/createApp.js +123 -29
  15. package/dist/core/createBlock.d.ts +5 -5
  16. package/dist/core/createBlock.js +385 -152
  17. package/dist/core/createCollection.d.ts +55 -0
  18. package/dist/core/createCollection.js +93 -0
  19. package/dist/core/createLayout.d.ts +197 -61
  20. package/dist/core/createLayout.js +114 -56
  21. package/dist/core/defineDocument.d.ts +3 -5
  22. package/dist/core/derivedRoutes.js +49 -1
  23. package/dist/core/dom.d.ts +13 -4
  24. package/dist/core/dom.js +44 -1
  25. package/dist/core/editing/BlockEditingRuntime.d.ts +16 -0
  26. package/dist/core/editing/BlockEditingRuntime.js +6 -15
  27. package/dist/core/editing/CompleteBlockEditingRuntime.js +28 -23
  28. package/dist/core/editing/createEditableBlock.d.ts +754 -633
  29. package/dist/core/editing/createEditableBlock.js +2113 -1066
  30. package/dist/core/editing/referenceWrites.js +51 -0
  31. package/dist/core/editing/useLatestRecord.js +90 -0
  32. package/dist/core/hooks/useArtifactHost.js +139 -0
  33. package/dist/core/hooks/useFieldSelection.js +43 -18
  34. package/dist/core/hooks/useIsEditable.js +12 -10
  35. package/dist/core/hooks/useOverlayMessage.js +15 -19
  36. package/dist/core/lib/artifact.d.ts +21 -0
  37. package/dist/core/lib/artifact.js +154 -0
  38. package/dist/core/lib/artifactColors.js +123 -0
  39. package/dist/core/lib/artifactData.d.ts +1 -0
  40. package/dist/core/lib/artifactData.js +131 -0
  41. package/dist/core/lib/artifactHost.js +205 -0
  42. package/dist/core/lib/artifactRuntime.js +36 -0
  43. package/dist/core/lib/artifactTheme.js +57 -0
  44. package/dist/core/lib/contentType.d.ts +302 -106
  45. package/dist/core/lib/contentType.js +201 -173
  46. package/dist/core/lib/fieldTypes.js +3 -0
  47. package/dist/core/lib/iconTypes.d.ts +3 -3
  48. package/dist/core/lib/icons.d.ts +4 -4
  49. package/dist/core/lib/icons.js +40 -44
  50. package/dist/core/lib/imagePlaceholder.js +177 -0
  51. package/dist/core/lib/imageTransform.js +1 -1
  52. package/dist/core/lib/lexicalReact.d.ts +3 -1
  53. package/dist/core/lib/lexicalState.js +1 -1
  54. package/dist/core/lib/previewPaused.js +9 -0
  55. package/dist/core/lib/recordScope.js +316 -0
  56. package/dist/core/lib/reference.d.ts +81 -0
  57. package/dist/core/lib/reference.js +29 -0
  58. package/dist/core/lib/textLinks.js +7 -5
  59. package/dist/core/lib/textStyles.d.ts +5 -7
  60. package/dist/core/lib/textStyles.js +2 -2
  61. package/dist/core/notFound.d.ts +7 -0
  62. package/dist/core/notFound.js +11 -0
  63. package/dist/core/pageDestinations.js +6 -3
  64. package/dist/core/recordItem.js +34 -0
  65. package/dist/core/requestContext.d.ts +26 -0
  66. package/dist/core/requestContext.js +20 -0
  67. package/dist/features/canvas/CamoxCanvas.js +1734 -0
  68. package/dist/features/canvas/CanvasBlockFrame.js +353 -0
  69. package/dist/features/canvas/CanvasBlockHeader.js +55 -0
  70. package/dist/features/canvas/CanvasLoadingScreen.js +35 -0
  71. package/dist/features/canvas/CanvasOverlays.js +254 -0
  72. package/dist/features/canvas/CanvasPageEdge.js +87 -0
  73. package/dist/features/canvas/CanvasPageFrame.js +335 -0
  74. package/dist/features/canvas/CanvasPageHeader.js +125 -0
  75. package/dist/features/canvas/CanvasPreviewPageSlot.js +103 -0
  76. package/dist/features/canvas/CanvasShelfMarker.js +255 -0
  77. package/dist/features/canvas/DerivedPagePathInput.js +238 -0
  78. package/dist/features/canvas/canvasCamera.js +229 -0
  79. package/dist/features/canvas/canvasFlight.js +104 -0
  80. package/dist/features/canvas/canvasFrameCapture.js +364 -0
  81. package/dist/features/canvas/canvasFrameDocument.js +317 -0
  82. package/dist/features/canvas/canvasFrameMode.js +53 -0
  83. package/dist/features/canvas/canvasInsertionSeams.js +44 -0
  84. package/dist/features/canvas/canvasItems.js +120 -0
  85. package/dist/features/canvas/canvasOverlayGeometry.js +240 -0
  86. package/dist/features/canvas/canvasPages.js +79 -0
  87. package/dist/features/canvas/canvasScreenSpace.js +26 -0
  88. package/dist/features/canvas/canvasSelection.js +18 -0
  89. package/dist/features/canvas/canvasStore.js +149 -0
  90. package/dist/features/canvas/canvasThumbnails.js +304 -0
  91. package/dist/features/canvas/canvasZoom.js +10 -0
  92. package/dist/features/canvas/sidebar/CanvasInspector.js +202 -0
  93. package/dist/features/canvas/sidebar/CanvasNavigator.js +226 -0
  94. package/dist/features/canvas/sidebar/CanvasSidebar.js +60 -0
  95. package/dist/features/canvas/sidebar/CanvasSidebarFrame.js +48 -0
  96. package/dist/features/canvas/sidebar/CanvasSidebarSkeleton.js +39 -0
  97. package/dist/features/canvas/sidebar/CatalogBlockInspector.js +189 -0
  98. package/dist/features/canvas/sidebar/CuratedPageInspector.js +69 -0
  99. package/dist/features/canvas/sidebar/DerivedPageInspector.js +37 -0
  100. package/dist/features/canvas/sidebar/LayoutPageBlocks.js +78 -0
  101. package/dist/features/canvas/sidebar/LayoutPageOverview.js +71 -0
  102. package/dist/features/canvas/sidebar/PageInspector.js +157 -0
  103. package/dist/features/canvas/sidebar/PageInspectorSkeleton.js +90 -0
  104. package/dist/features/canvas/sidebar/PageOverview.js +27 -0
  105. package/dist/features/canvas/sidebar/SingletonPageInspector.js +31 -0
  106. package/dist/features/canvas/useCanvasCamera.js +803 -0
  107. package/dist/features/canvas/useCanvasFrame.js +149 -0
  108. package/dist/features/canvas/useCanvasFrameInput.js +97 -0
  109. package/dist/features/canvas/useCanvasNearness.js +57 -0
  110. package/dist/features/canvas/useDiscoveredPreviewPaths.js +62 -0
  111. package/dist/features/content/CamoxContent.d.ts +2 -5
  112. package/dist/features/content/CamoxContent.js +174 -271
  113. package/dist/features/content/CollectionItemSheetContext.js +106 -0
  114. package/dist/features/content/ContentAssets.js +315 -0
  115. package/dist/features/content/ContentCollection.js +663 -0
  116. package/dist/features/content/collection-form.js +58 -0
  117. package/dist/features/content/components/AssetCard.js +80 -84
  118. package/dist/features/content/components/AssetCardSkeleton.js +4 -8
  119. package/dist/features/content/components/ContentSidebar.js +129 -18
  120. package/dist/features/content/components/ContentSidebarGroup.js +37 -0
  121. package/dist/features/content/components/DeleteCollectionItemButton.js +202 -0
  122. package/dist/features/content/components/MissingFromLocale.js +282 -0
  123. package/dist/features/content/components/UploadDropZone.js +27 -31
  124. package/dist/features/content/components/UploadProgressDrawer.js +90 -98
  125. package/dist/features/navigation/navigation.d.ts +66 -20
  126. package/dist/features/navigation/navigation.js +257 -90
  127. package/dist/features/og/defaultFonts.js +8 -8
  128. package/dist/features/og/geist-variable-ttf-base64.js +1 -1
  129. package/dist/features/og/imageResponse.d.ts +8 -0
  130. package/dist/features/og/imageResponse.js +26 -0
  131. package/dist/features/page/CuratedPageContent.js +167 -0
  132. package/dist/features/page/DerivedPageContent.js +26 -30
  133. package/dist/features/page/SharedLayoutContent.js +25 -27
  134. package/dist/features/preview/CamoxPreview.d.ts +23 -61
  135. package/dist/features/preview/CamoxPreview.js +816 -537
  136. package/dist/features/preview/EditablePageContent.js +1 -1
  137. package/dist/features/preview/EditablePageExperience.js +16 -22
  138. package/dist/features/preview/components/AddBlockDialog.js +270 -0
  139. package/dist/features/preview/components/AssetFieldEditor.js +173 -154
  140. package/dist/features/preview/components/AssetLightbox.js +181 -134
  141. package/dist/features/preview/components/AssetPickerModal.js +153 -170
  142. package/dist/features/preview/components/BlockActionsPopover.js +150 -149
  143. package/dist/features/preview/components/BlockErrorBoundary.js +8 -12
  144. package/dist/features/preview/components/BlockThumbnail.js +176 -100
  145. package/dist/features/preview/components/CanvasPreview.js +243 -0
  146. package/dist/features/preview/components/CreatePageModal.js +128 -137
  147. package/dist/features/preview/components/DebouncedFieldEditor.js +29 -33
  148. package/dist/features/preview/components/DerivedLayoutDialog.js +21 -19
  149. package/dist/features/preview/components/DrillRow.js +150 -0
  150. package/dist/features/preview/components/FieldOverlayStyles.js +11 -8
  151. package/dist/features/preview/components/FieldToolbar.js +160 -110
  152. package/dist/features/preview/components/Frame.js +108 -20
  153. package/dist/features/preview/components/IconFieldEditor.js +62 -66
  154. package/dist/features/preview/components/ItemFieldsEditor.js +231 -205
  155. package/dist/features/preview/components/LinkFieldEditor.js +135 -139
  156. package/dist/features/preview/components/Metadata.js +22 -30
  157. package/dist/features/preview/components/MobilePreviewDrawer.js +89 -108
  158. package/dist/features/preview/components/MultipleAssetFieldEditor.js +334 -246
  159. package/dist/features/preview/components/OverlayTracker.js +9 -41
  160. package/dist/features/preview/components/Overlays.js +81 -69
  161. package/dist/features/preview/components/PageInfo.js +1748 -0
  162. package/dist/features/preview/components/PageInfoSkeleton.js +51 -0
  163. package/dist/features/preview/components/PageLocationFieldset.js +112 -116
  164. package/dist/features/preview/components/PageNavigatorHeader.js +24 -0
  165. package/dist/features/preview/components/PageNicknameField.js +22 -26
  166. package/dist/features/preview/components/PagePicker.js +128 -130
  167. package/dist/features/preview/components/PageTree.js +525 -532
  168. package/dist/features/preview/components/PreviewActivation.js +28 -32
  169. package/dist/features/preview/components/PreviewPanel.js +620 -319
  170. package/dist/features/preview/components/PreviewToolbar.js +105 -333
  171. package/dist/features/preview/components/RecordCard.js +80 -0
  172. package/dist/features/preview/components/RecordCombobox.js +178 -0
  173. package/dist/features/preview/components/ReferenceFieldEditor.js +149 -0
  174. package/dist/features/preview/components/ReferenceListFieldEditor.js +432 -0
  175. package/dist/features/preview/components/RemovedBlockPlaceholder.js +95 -0
  176. package/dist/features/preview/components/RepeatableItemsList.js +125 -138
  177. package/dist/features/preview/components/SelectionEditor.js +993 -0
  178. package/dist/features/preview/components/ShikiMarkdown.js +14 -18
  179. package/dist/features/preview/components/SidebarSection.js +52 -64
  180. package/dist/features/preview/components/StudioEditingFallback.js +56 -0
  181. package/dist/features/preview/components/UnlinkAssetButton.js +104 -107
  182. package/dist/features/preview/components/blockGridNavigation.js +15 -0
  183. package/dist/features/preview/components/contentFieldSchema.js +8 -0
  184. package/dist/features/preview/components/useFieldWriter.js +200 -0
  185. package/dist/features/preview/components/useRecordView.js +383 -0
  186. package/dist/features/preview/components/useRepeatableItemActions.js +35 -37
  187. package/dist/features/preview/components/useUpdateBlockPosition.js +37 -37
  188. package/dist/features/preview/editingFrame.js +197 -0
  189. package/dist/features/preview/overlayHighlights.js +17 -44
  190. package/dist/features/preview/overlayMessages.js +72 -1
  191. package/dist/features/preview/pageRecord.js +189 -0
  192. package/dist/features/preview/previewConstants.js +6 -2
  193. package/dist/features/preview/previewPageFrame.js +95 -0
  194. package/dist/features/preview/previewPreparation.js +7 -0
  195. package/dist/features/preview/previewSelection.js +32 -63
  196. package/dist/features/preview/previewStore.js +225 -123
  197. package/dist/features/preview/referencePickerFocus.js +29 -0
  198. package/dist/features/preview/repeatableItemTargets.js +56 -0
  199. package/dist/features/preview/selectionReveal.js +21 -0
  200. package/dist/features/preview/usePreviewViewportActions.js +114 -0
  201. package/dist/features/preview/viewportContinuity.js +109 -0
  202. package/dist/features/provider/AuthenticatedCamoxProvider.js +69 -44
  203. package/dist/features/provider/CamoxProvider.d.ts +3 -6
  204. package/dist/features/provider/CamoxProvider.js +38 -50
  205. package/dist/features/provider/CoreCamoxProvider.js +66 -50
  206. package/dist/features/provider/LocalhostPreviewProvider.js +78 -114
  207. package/dist/features/provider/PreviewSignInPage.js +54 -0
  208. package/dist/features/provider/components/CamoxAppContext.js +11 -11
  209. package/dist/features/provider/components/CommandPalette.js +75 -82
  210. package/dist/features/provider/useAdminShortcuts.js +7 -11
  211. package/dist/features/routes/pageRuntime.d.ts +44 -4
  212. package/dist/features/routes/pageRuntime.js +244 -137
  213. package/dist/features/runtime/RuntimeChrome.js +117 -115
  214. package/dist/features/runtime/alternates.js +64 -0
  215. package/dist/features/runtime/analytics.d.ts +7 -0
  216. package/dist/features/runtime/analytics.js +66 -0
  217. package/dist/features/runtime/artifactSources.js +87 -0
  218. package/dist/features/runtime/editingFallback.js +20 -0
  219. package/dist/features/runtime/linkPrefetch.js +97 -0
  220. package/dist/features/runtime/livePages.js +62 -0
  221. package/dist/features/runtime/llmsTxt.js +40 -0
  222. package/dist/features/runtime/loopbackFetch.js +18 -0
  223. package/dist/features/runtime/navigationAccessibility.js +51 -0
  224. package/dist/features/runtime/navigationTarget.js +23 -2
  225. package/dist/features/runtime/pageApp.js +229 -158
  226. package/dist/features/runtime/pageBlockTypes.js +20 -0
  227. package/dist/features/runtime/pageClient.d.ts +2 -4
  228. package/dist/features/runtime/pageClient.js +18 -3
  229. package/dist/features/runtime/pageNavigation.js +254 -32
  230. package/dist/features/runtime/pageServer.d.ts +2 -4
  231. package/dist/features/runtime/pageServer.js +6 -2
  232. package/dist/features/runtime/pageViewport.js +7 -0
  233. package/dist/features/runtime/runtime.d.ts +59 -24
  234. package/dist/features/runtime/runtime.js +779 -191
  235. package/dist/features/runtime/runtimeChromeLoader.js +58 -0
  236. package/dist/features/runtime/runtimeRoutes.d.ts +19 -0
  237. package/dist/features/runtime/runtimeRoutes.js +25 -0
  238. package/dist/features/runtime/scrollRestoration.js +133 -0
  239. package/dist/features/runtime/studioApp.d.ts +4 -3
  240. package/dist/features/runtime/studioApp.js +5 -9
  241. package/dist/features/runtime/studioClient.d.ts +2 -4
  242. package/dist/features/runtime/studioClient.js +12 -3
  243. package/dist/features/runtime/studioServer.d.ts +2 -4
  244. package/dist/features/runtime/studioServer.js +6 -1
  245. package/dist/features/runtime/worker.d.ts +6 -0
  246. package/dist/features/runtime/worker.js +23 -0
  247. package/dist/features/runtime/workerRequest.js +44 -0
  248. package/dist/features/studio/CamoxStudio.d.ts +2 -6
  249. package/dist/features/studio/CamoxStudio.js +34 -49
  250. package/dist/features/studio/FollowAgentProvider.js +338 -0
  251. package/dist/features/studio/components/ChatSidebar.js +356 -0
  252. package/dist/features/studio/components/DraftsControl.js +676 -0
  253. package/dist/features/studio/components/FaviconDialog.js +318 -0
  254. package/dist/features/studio/components/LocalePicker.js +785 -0
  255. package/dist/features/studio/components/Navbar.js +123 -103
  256. package/dist/features/studio/components/ProjectMenu.js +239 -260
  257. package/dist/features/studio/components/RenameDraftDialog.js +206 -0
  258. package/dist/features/studio/components/ReviewDraftSheet.js +1472 -0
  259. package/dist/features/studio/components/ThreadComposer.js +157 -0
  260. package/dist/features/studio/components/ThreadMarkdown.js +113 -0
  261. package/dist/features/studio/components/ThreadMessages.js +270 -0
  262. package/dist/features/studio/components/UserButton.js +34 -23
  263. package/dist/features/studio/draftLabel.js +33 -0
  264. package/dist/features/studio/draftNotice.js +13 -0
  265. package/dist/features/studio/followAgent.js +250 -0
  266. package/dist/features/studio/followAgentContext.js +7 -0
  267. package/dist/features/studio/localeOptions.js +118 -0
  268. package/dist/features/studio/localeSwitch.js +19 -0
  269. package/dist/features/studio/routes.js +48 -1
  270. package/dist/features/studio/studioStore.js +64 -1
  271. package/dist/features/studio/useTheme.js +24 -27
  272. package/dist/features/vite/artifactRuntimeMinification.js +36 -0
  273. package/dist/features/vite/blockBoilerplate.js +6 -5
  274. package/dist/features/vite/blockChunks.js +31 -0
  275. package/dist/features/vite/bundlerLogs.js +17 -0
  276. package/dist/features/vite/definitionsSync.js +158 -226
  277. package/dist/features/vite/devAuthentication.js +4 -16
  278. package/dist/features/vite/devSignIn.js +87 -0
  279. package/dist/features/vite/iconGeneration.js +1 -1
  280. package/dist/features/vite/layoutGeneration.js +11 -1
  281. package/dist/features/vite/publishSeededContent.js +30 -0
  282. package/dist/features/vite/routeGeneration.js +6 -7
  283. package/dist/features/vite/runtimeDev.js +80 -99
  284. package/dist/features/vite/vite.d.ts +51 -31
  285. package/dist/features/vite/vite.js +224 -127
  286. package/dist/features/vite/workerBuild.js +39 -0
  287. package/dist/hooks/use-debounced-field.js +116 -47
  288. package/dist/hooks/use-file-upload.js +114 -67
  289. package/dist/hooks/use-marquee-selection.js +32 -36
  290. package/dist/hooks/use-page-destinations.js +69 -37
  291. package/dist/lib/api-client-server.d.ts +5 -0
  292. package/dist/lib/api-client-server.js +10 -4
  293. package/dist/lib/api-client.d.ts +6 -0
  294. package/dist/lib/api-client.js +51 -16
  295. package/dist/lib/api-socket.js +17 -0
  296. package/dist/lib/auth-page-styles.js +39 -0
  297. package/dist/lib/auth.js +117 -61
  298. package/dist/lib/collection-cache.js +23 -0
  299. package/dist/lib/draft-scope.d.ts +4 -0
  300. package/dist/lib/draft-scope.js +222 -0
  301. package/dist/lib/html.js +12 -0
  302. package/dist/lib/link-pages.js +154 -0
  303. package/dist/lib/locale-path.d.ts +22 -0
  304. package/dist/lib/locale-path.js +57 -0
  305. package/dist/lib/normalized-data.js +252 -152
  306. package/dist/lib/preview-handoff.js +2 -2
  307. package/dist/lib/queries.d.ts +11 -0
  308. package/dist/lib/queries.js +70 -141
  309. package/dist/lib/studio-reads.d.ts +14 -0
  310. package/dist/lib/studio-reads.js +574 -0
  311. package/dist/lib/use-project-room.js +50 -50
  312. package/dist/lib/use-thread.js +310 -0
  313. package/dist/lib/utils.js +25 -29
  314. package/dist/lib/view-locale-context.js +22 -0
  315. package/dist/lib/view-locale.js +46 -0
  316. package/dist/package.js +5 -0
  317. package/dist/studio-overlays.css +41 -151
  318. package/dist/studio.css +2 -2
  319. package/package.json +70 -73
  320. package/skills/camox/SKILL.md +16 -11
  321. package/skills/camox/references/artifacts.md +179 -0
  322. package/skills/camox/references/block-definitions.md +75 -59
  323. package/skills/camox/references/cli-common.md +9 -11
  324. package/skills/camox/references/cli-content.md +92 -69
  325. package/skills/camox/references/cli-publishing.md +26 -0
  326. package/skills/camox/references/dom-integrations.md +27 -0
  327. package/skills/camox/references/field-styling.md +4 -4
  328. package/skills/camox/references/layout-definitions.md +16 -14
  329. package/skills/camox/references/localization.md +56 -0
  330. package/skills/camox/references/routed-layouts.md +133 -15
  331. package/skills/camox-expand/SKILL.md +69 -0
  332. package/skills/camox-expand/references/jobs.md +39 -0
  333. package/skills/camoxify/SKILL.md +29 -7
  334. package/dist/core/components/AddBlockControlBar.js +0 -78
  335. package/dist/core/hooks/useRequireDraftSource.js +0 -23
  336. package/dist/features/metadata/sitemap.d.ts +0 -8
  337. package/dist/features/metadata/sitemap.js +0 -17
  338. package/dist/features/og/imageResponse.node.d.ts +0 -12
  339. package/dist/features/og/imageResponse.node.js +0 -49
  340. package/dist/features/og/imageResponse.workerd.d.ts +0 -12
  341. package/dist/features/og/imageResponse.workerd.js +0 -40
  342. package/dist/features/page/PublishedPageContent.js +0 -205
  343. package/dist/features/page/PublishedPageExperience.js +0 -23
  344. package/dist/features/preview/DerivedPreview.js +0 -134
  345. package/dist/features/preview/commentsEnabled.js +0 -8
  346. package/dist/features/preview/components/AddBlockSidebar.js +0 -381
  347. package/dist/features/preview/components/AttachedComments.js +0 -331
  348. package/dist/features/preview/components/CommentHeader.js +0 -122
  349. package/dist/features/preview/components/CommentSidebar.js +0 -29
  350. package/dist/features/preview/components/CommentTargetQuote.js +0 -167
  351. package/dist/features/preview/components/DerivedLayoutSidebar.d.ts +0 -5
  352. package/dist/features/preview/components/DerivedLayoutSidebar.js +0 -179
  353. package/dist/features/preview/components/DerivedPageInfoSidebar.js +0 -69
  354. package/dist/features/preview/components/LeftSidebar.js +0 -68
  355. package/dist/features/preview/components/PageEditorSidebar.js +0 -563
  356. package/dist/features/preview/components/PageInfoSidebar.js +0 -1551
  357. package/dist/features/preview/components/PageNavigatorSidebar.js +0 -78
  358. package/dist/features/preview/components/PageStatusBadge.js +0 -97
  359. package/dist/features/preview/components/PeekedBlock.js +0 -217
  360. package/dist/features/preview/components/PreviewComments.js +0 -56
  361. package/dist/features/preview/components/PreviewToolbarSpacer.js +0 -43
  362. package/dist/features/preview/components/PublicationRow.js +0 -422
  363. package/dist/features/preview/components/PublishDialog.js +0 -194
  364. package/dist/features/preview/components/RightSidebar.js +0 -59
  365. package/dist/features/preview/components/SendFeedbackDialog.js +0 -83
  366. package/dist/features/preview/previewCommentsStore.js +0 -135
  367. package/dist/features/preview/publication.js +0 -81
  368. package/dist/features/preview/usePageComments.js +0 -39
  369. package/dist/features/runtime/SharedChromeContext.js +0 -7
  370. package/dist/features/studio/components/EnvironmentMenu.js +0 -425
  371. package/dist/features/vite/appGeneration.js +0 -89
  372. package/dist/lib/view-queries.js +0 -28
  373. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/Matches.d.ts +0 -114
  374. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/RouterProvider.d.ts +0 -25
  375. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/config.d.ts +0 -1
  376. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/defer.d.ts +0 -1
  377. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/fileRoute.d.ts +0 -20
  378. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/global.d.ts +0 -8
  379. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/hash-scroll.d.ts +0 -1
  380. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/index.d.ts +0 -18
  381. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/link.d.ts +0 -161
  382. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/load-matches.d.ts +0 -6
  383. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/location.d.ts +0 -54
  384. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/lru-cache.d.ts +0 -8
  385. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/manifest.d.ts +0 -32
  386. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/new-process-route-tree.d.ts +0 -115
  387. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/not-found.d.ts +0 -1
  388. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/redirect.d.ts +0 -49
  389. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/rewrite.d.ts +0 -1
  390. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/root.d.ts +0 -6
  391. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/route.d.ts +0 -343
  392. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/routeInfo.d.ts +0 -48
  393. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/router.d.ts +0 -695
  394. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/scroll-restoration.d.ts +0 -1
  395. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchMiddleware.d.ts +0 -1
  396. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/searchParams.d.ts +0 -5
  397. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/RawStream.d.ts +0 -38
  398. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/seroval-plugins.d.ts +0 -1
  399. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/ssr/serializer/transformer.d.ts +0 -65
  400. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/stores.d.ts +0 -69
  401. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/structuralSharing.d.ts +0 -1
  402. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/typePrimitives.d.ts +0 -1
  403. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderData.d.ts +0 -1
  404. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useLoaderDeps.d.ts +0 -1
  405. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useNavigate.d.ts +0 -10
  406. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useParams.d.ts +0 -1
  407. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useRouteContext.d.ts +0 -1
  408. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/useSearch.d.ts +0 -1
  409. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/utils.d.ts +0 -28
  410. package/dist/node_modules/.pnpm/@tanstack_router-core@1.168.14/node_modules/@tanstack/router-core/dist/esm/validators.d.ts +0 -49
  411. package/skills/camox/references/cli-environments.md +0 -37
@@ -1,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 };