camox 0.43.0 → 0.45.0

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