@dailies-studio/shot-editor 0.1.0 → 0.2.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 (432) hide show
  1. package/dist/.vite/manifest.json +382 -0
  2. package/dist/assets/AgentPanel-CQejLbiX.js +2 -0
  3. package/dist/assets/AgentPanel-DJEphah0.css +1 -0
  4. package/dist/assets/AgentQuestionDialog-BqkD0kXF.js +1 -0
  5. package/dist/assets/CodeStudio-Dv4ihHpz.js +23 -0
  6. package/dist/assets/CommentsPanel-B4yhhT1T.js +1 -0
  7. package/dist/assets/ComponentLibraryRail-Ch_dsAru.js +1 -0
  8. package/dist/assets/ComponentStage-BRhRotyH.js +1 -0
  9. package/dist/assets/CurvePane-BjFVabKX.css +1 -0
  10. package/dist/assets/CurvePane-R22WzllJ.js +1 -0
  11. package/dist/assets/ExportDialog-CWLQWTmG.js +2 -0
  12. package/dist/assets/FontPicker-DWKaYL7F.js +1 -0
  13. package/dist/assets/FontPicker-v0IOIArM.css +1 -0
  14. package/dist/assets/GenerateDrawer-Bh3SqDKt.js +2 -0
  15. package/dist/assets/InsertDrawer-Ce1fod1L.js +1 -0
  16. package/dist/assets/LibraryBrowser-D9sEGz5w.js +2 -0
  17. package/dist/assets/MakeItYoursSection-CMO4319_.js +2 -0
  18. package/dist/assets/MaterialGraphCanvas-BFzl4wWR.js +23 -0
  19. package/dist/assets/MaterialGraphCanvas-BIUD59ik.css +1 -0
  20. package/dist/assets/MaterialWorkspace-CqTWqaRA.js +14 -0
  21. package/dist/assets/PreferencesDialog-CBf9_OoD.js +1 -0
  22. package/dist/assets/PresetsSection-CUEaoCVU.js +1 -0
  23. package/dist/assets/SoundHistory-BeS8EW1h.js +1 -0
  24. package/dist/assets/SoundMode-BmcZru3i.js +3 -0
  25. package/dist/assets/StockSounds-DdAUGRYK.js +1 -0
  26. package/dist/assets/TemplateFieldSection-CaeXpLFo.js +1 -0
  27. package/dist/assets/VersionHistoryPanel-CxG6XhNP.js +1 -0
  28. package/dist/assets/board-B88EPuLO.css +1 -0
  29. package/dist/assets/board-CL-he7SL.js +3 -0
  30. package/dist/assets/components-0oOSPN0l.js +1 -0
  31. package/dist/assets/googleFontRanges-gp32wJMo.js +1 -0
  32. package/dist/assets/googleFonts-BNon6M7X.js +1 -0
  33. package/dist/assets/iconsAndAliases-DL7gXP5j.js +1863 -0
  34. package/dist/assets/index-4F5NQmI8.css +1 -0
  35. package/dist/assets/index-BGHQGV5z.js +117 -0
  36. package/dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  37. package/dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  38. package/dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  39. package/dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  40. package/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  41. package/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  42. package/dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  43. package/dist/assets/libraryModel-CpIwfFha.js +1 -0
  44. package/dist/assets/lucide-6iK64tTB.js +9319 -0
  45. package/dist/assets/motionStamp-CH-Hew4E.js +1 -0
  46. package/dist/assets/takeMeasure-Tdg0TxEi.js +1 -0
  47. package/dist/assets/webmcp-BsB9gxWC.js +2 -0
  48. package/dist/index.html +34 -3
  49. package/package.json +12 -9
  50. package/src/addFamilies.ts +66 -0
  51. package/src/api.ts +1631 -55
  52. package/src/app/App.tsx +977 -198
  53. package/src/app/lazyPanel.tsx +137 -0
  54. package/src/app/lazySurfaces.tsx +203 -0
  55. package/src/audio/index.tsx +41 -10
  56. package/src/audio/meter.ts +485 -0
  57. package/src/audio/meterMath.ts +273 -0
  58. package/src/audio/meterStore.ts +155 -0
  59. package/src/audio/offlineMix.ts +289 -0
  60. package/src/audio/preview.ts +928 -118
  61. package/src/bridge.ts +15 -5
  62. package/src/bridgeTypes.ts +1611 -36
  63. package/src/channels.ts +17 -32
  64. package/src/fonts/googleFonts.ts +4 -0
  65. package/src/hostApi.ts +174 -0
  66. package/src/icons.tsx +770 -0
  67. package/src/layerWords.ts +61 -0
  68. package/src/main.tsx +56 -4
  69. package/src/panels/ResizeHandle.tsx +33 -43
  70. package/src/panels/agent/AgentDots.tsx +36 -0
  71. package/src/panels/agent/AgentPanel.tsx +119 -43
  72. package/src/panels/agent/AgentQuestionDialog.tsx +202 -0
  73. package/src/panels/agent/agent.css +113 -97
  74. package/src/panels/agent/agentGate.ts +35 -0
  75. package/src/panels/code/CodeDefaultsPanel.tsx +345 -0
  76. package/src/panels/code/CodeStudio.tsx +373 -0
  77. package/src/panels/code/FileTree.tsx +265 -0
  78. package/src/panels/code/codeBufferGuard.ts +52 -0
  79. package/src/panels/code/codeParts.tsx +321 -0
  80. package/src/panels/comments/CommentComposer.tsx +239 -0
  81. package/src/panels/comments/CommentThread.tsx +346 -0
  82. package/src/panels/comments/CommentsPanel.tsx +336 -0
  83. package/src/panels/comments/InboxButton.tsx +131 -0
  84. package/src/panels/comments/MentionMenu.tsx +98 -0
  85. package/src/panels/comments/parts.tsx +171 -0
  86. package/src/panels/export/ExportDialog.tsx +919 -96
  87. package/src/panels/export/ExportScrim.tsx +57 -0
  88. package/src/panels/files/AssetsTab.tsx +656 -0
  89. package/src/panels/files/FilePanel.tsx +1466 -216
  90. package/src/panels/files/LayerMarks.tsx +40 -0
  91. package/src/panels/files/LeftColumn.tsx +37 -0
  92. package/src/panels/files/McpSection.tsx +690 -47
  93. package/src/panels/files/MissingAssetsNotice.tsx +60 -0
  94. package/src/panels/files/assetDrag.ts +79 -0
  95. package/src/panels/files/resourceParts.tsx +255 -0
  96. package/src/panels/fonts/FontPicker.tsx +762 -0
  97. package/src/panels/fonts/faceCache.ts +207 -0
  98. package/src/panels/fonts/fontPicker.css +271 -0
  99. package/src/panels/fonts/pickerModel.ts +265 -0
  100. package/src/panels/fonts/pickerRequest.ts +46 -0
  101. package/src/panels/header/AccountAvatar.tsx +76 -0
  102. package/src/panels/header/AgentChip.tsx +77 -0
  103. package/src/panels/header/AppMenu.tsx +213 -0
  104. package/src/panels/header/Header.tsx +564 -84
  105. package/src/panels/header/HistoryControls.tsx +31 -5
  106. package/src/panels/header/PresenceStack.tsx +329 -0
  107. package/src/panels/header/ProjectTitle.tsx +232 -0
  108. package/src/panels/header/ShareButton.tsx +59 -0
  109. package/src/panels/header/StatusBadges.tsx +358 -27
  110. package/src/panels/header/SyncDeletedDialog.tsx +88 -0
  111. package/src/panels/header/ZoomControls.tsx +46 -15
  112. package/src/panels/header/agentHandoff.ts +52 -0
  113. package/src/panels/header/leave.ts +26 -0
  114. package/src/panels/help/HelpSection.tsx +189 -163
  115. package/src/panels/insert/InsertDrawer.tsx +723 -0
  116. package/src/panels/insert/iconSet.ts +109 -0
  117. package/src/panels/inspector/ExposeDot.tsx +117 -0
  118. package/src/panels/inspector/FramingRows.tsx +314 -44
  119. package/src/panels/inspector/InspectorFooter.tsx +91 -0
  120. package/src/panels/inspector/InspectorHead.tsx +425 -0
  121. package/src/panels/inspector/InspectorPanel.tsx +408 -124
  122. package/src/panels/inspector/KeyframeDot.tsx +373 -0
  123. package/src/panels/inspector/KeyframeSection.tsx +257 -0
  124. package/src/panels/inspector/MarkerSection.tsx +55 -11
  125. package/src/panels/inspector/ParamRow.tsx +84 -53
  126. package/src/panels/inspector/RightColumn.tsx +152 -0
  127. package/src/panels/inspector/TimeSection.tsx +866 -0
  128. package/src/panels/inspector/animate/EaseControl.tsx +244 -0
  129. package/src/panels/inspector/animate/PresetsSection.tsx +135 -0
  130. package/src/panels/inspector/animate/ShotSection.tsx +562 -48
  131. package/src/panels/inspector/design/AlignRow.tsx +95 -31
  132. package/src/panels/inspector/design/AppearanceSection.tsx +118 -9
  133. package/src/panels/inspector/design/ClonerSection.tsx +323 -62
  134. package/src/panels/inspector/design/ComponentSection.tsx +50 -43
  135. package/src/panels/inspector/design/CornerSection.tsx +45 -14
  136. package/src/panels/inspector/design/DefinitionProps.tsx +315 -0
  137. package/src/panels/inspector/design/DefinitionSection.tsx +136 -0
  138. package/src/panels/inspector/design/DeviceSection.tsx +210 -0
  139. package/src/panels/inspector/design/FillSection.tsx +83 -51
  140. package/src/panels/inspector/design/FontField.tsx +196 -0
  141. package/src/panels/inspector/design/HtmlSection.tsx +23 -12
  142. package/src/panels/inspector/design/InstanceSection.tsx +373 -154
  143. package/src/panels/inspector/design/MaskSection.tsx +84 -0
  144. package/src/panels/inspector/design/MaterialSection.tsx +177 -0
  145. package/src/panels/inspector/design/MediaSection.tsx +273 -120
  146. package/src/panels/inspector/design/MeshSection.tsx +910 -82
  147. package/src/panels/inspector/design/PaintRows.tsx +550 -0
  148. package/src/panels/inspector/design/PlateStyleSection.tsx +177 -0
  149. package/src/panels/inspector/design/ShadowSection.tsx +221 -48
  150. package/src/panels/inspector/design/SplineFollowSection.tsx +235 -0
  151. package/src/panels/inspector/design/StrokeSection.tsx +228 -43
  152. package/src/panels/inspector/design/TemplateFieldSection.tsx +57 -0
  153. package/src/panels/inspector/design/TransformSection.tsx +244 -50
  154. package/src/panels/inspector/design/TypographySection.tsx +679 -110
  155. package/src/panels/inspector/layout.ts +295 -0
  156. package/src/panels/inspector/propValue.ts +199 -0
  157. package/src/panels/inspector/scene/CameraSection.tsx +232 -22
  158. package/src/panels/inspector/scene/EffectsSection.tsx +722 -71
  159. package/src/panels/inspector/scene/MakeItYoursSection.tsx +180 -0
  160. package/src/panels/inspector/scene/SceneDocSection.tsx +191 -0
  161. package/src/panels/inspector/scene/SceneSection.tsx +219 -44
  162. package/src/panels/inspector/scene/TransitionSection.tsx +523 -72
  163. package/src/panels/inspector/storyboard/StoryboardReferenceSection.tsx +593 -0
  164. package/src/panels/inspector/storyboard/VideoStill.tsx +120 -0
  165. package/src/panels/inspector/timeModel.ts +190 -0
  166. package/src/panels/inspector/useDocWrite.ts +438 -146
  167. package/src/panels/library/LibraryBrowser.tsx +435 -0
  168. package/src/panels/library/LibraryGrid.tsx +190 -0
  169. package/src/panels/library/LibraryPreviewPanel.tsx +349 -0
  170. package/src/panels/library/LibraryRail.tsx +84 -0
  171. package/src/panels/library/LibrarySoundPanel.tsx +293 -0
  172. package/src/panels/library/SoundHistory.tsx +245 -0
  173. package/src/panels/library/StockSounds.tsx +390 -0
  174. package/src/panels/library/libraryModel.ts +147 -0
  175. package/src/panels/library/stockSearch.ts +77 -0
  176. package/src/panels/maskMarks.tsx +117 -0
  177. package/src/panels/material/MaterialCommentNode.tsx +54 -0
  178. package/src/panels/material/MaterialGraphCanvas.tsx +861 -0
  179. package/src/panels/material/MaterialGraphMenu.tsx +45 -0
  180. package/src/panels/material/MaterialGroupNode.tsx +56 -0
  181. package/src/panels/material/MaterialLibrary.tsx +253 -0
  182. package/src/panels/material/MaterialNode.tsx +453 -0
  183. package/src/panels/material/MaterialNodePalette.tsx +349 -0
  184. package/src/panels/material/MaterialParameterControls.tsx +525 -0
  185. package/src/panels/material/MaterialRerouteNode.tsx +42 -0
  186. package/src/panels/material/MaterialWorkspace.tsx +501 -0
  187. package/src/panels/material/NodePreview.tsx +70 -0
  188. package/src/panels/material/flowModel.ts +441 -0
  189. package/src/panels/material/parameterValues.ts +231 -0
  190. package/src/panels/material/previewScheduler.ts +235 -0
  191. package/src/panels/material/reactFlow.css +6 -0
  192. package/src/panels/material/socketGlyph.ts +85 -0
  193. package/src/panels/material/viewportMemory.ts +58 -0
  194. package/src/panels/preferences/PreferencesDialog.tsx +215 -0
  195. package/src/panels/share/ShareComponentDialog.tsx +247 -0
  196. package/src/panels/stage/StageMenu.tsx +35 -5
  197. package/src/panels/stage/StagePanel.tsx +338 -23
  198. package/src/panels/stage/cellSlots.tsx +70 -0
  199. package/src/panels/storyboard/BoardCanvas.tsx +739 -0
  200. package/src/panels/storyboard/BoardCursors.tsx +158 -0
  201. package/src/panels/storyboard/BoardDropDialog.tsx +161 -0
  202. package/src/panels/storyboard/BoardPlan.tsx +42 -0
  203. package/src/panels/storyboard/ComponentSheet.tsx +187 -0
  204. package/src/panels/storyboard/ComponentStage.tsx +235 -0
  205. package/src/panels/storyboard/MiniSketch.tsx +173 -0
  206. package/src/panels/storyboard/PartPicker.tsx +64 -0
  207. package/src/panels/storyboard/PlanPanel.tsx +617 -0
  208. package/src/panels/storyboard/ReferencePreview.tsx +217 -0
  209. package/src/panels/storyboard/ShotBrief.tsx +360 -0
  210. package/src/panels/storyboard/ShotCard.tsx +251 -0
  211. package/src/panels/storyboard/StagePreview.tsx +348 -0
  212. package/src/panels/storyboard/StillThumbs.tsx +162 -0
  213. package/src/panels/storyboard/StoryboardView.tsx +79 -0
  214. package/src/panels/storyboard/board.css +1065 -0
  215. package/src/panels/storyboard/board.ts +12 -0
  216. package/src/panels/storyboard/boardClipboard.ts +111 -0
  217. package/src/panels/storyboard/boardOrder.ts +68 -0
  218. package/src/panels/storyboard/boardRows.tsx +425 -0
  219. package/src/panels/storyboard/liveCap.ts +90 -0
  220. package/src/panels/storyboard/plan.css +295 -0
  221. package/src/panels/storyboard/posterCache.ts +133 -0
  222. package/src/panels/storyboard/shotboard/ComponentPicker.tsx +373 -0
  223. package/src/panels/storyboard/shotboard/ImagePicker.tsx +145 -0
  224. package/src/panels/storyboard/shotboard/ShotBoard.tsx +292 -0
  225. package/src/panels/storyboard/shotboard/SketchCanvas.tsx +443 -0
  226. package/src/panels/storyboard/shotboard/SketchInspector.tsx +471 -0
  227. package/src/panels/storyboard/shotboard/SketchItem.tsx +240 -0
  228. package/src/panels/storyboard/shotboard/SketchLayers.tsx +130 -0
  229. package/src/panels/storyboard/shotboard/SketchPlay.tsx +108 -0
  230. package/src/panels/storyboard/shotboard/SketchStrip.tsx +178 -0
  231. package/src/panels/storyboard/shotboard/SketchToolFooter.tsx +99 -0
  232. package/src/panels/storyboard/shotboard/sketch.css +1392 -0
  233. package/src/panels/storyboard/shotboard/sketchModel.ts +219 -0
  234. package/src/panels/storyboard/storyboardDrop.ts +164 -0
  235. package/src/panels/studio/ComponentLibraryRail.tsx +346 -0
  236. package/src/panels/studio/ComponentSidePanel.tsx +355 -0
  237. package/src/panels/studio/ComponentStudio.tsx +243 -0
  238. package/src/panels/studio/ComponentsHome.tsx +318 -0
  239. package/src/panels/studio/ComponentsPreview.tsx +179 -0
  240. package/src/panels/studio/EveryUse.tsx +244 -0
  241. package/src/panels/studio/ThisUsePanel.tsx +679 -0
  242. package/src/panels/studio/componentParts.tsx +341 -0
  243. package/src/panels/studio/components.ts +6 -0
  244. package/src/panels/studio/newCodeComponent.ts +66 -0
  245. package/src/panels/timeline/AudioFxButton.tsx +290 -0
  246. package/src/panels/timeline/AudioLane.tsx +674 -85
  247. package/src/panels/timeline/BlockRow.tsx +154 -85
  248. package/src/panels/timeline/ChannelRow.tsx +378 -129
  249. package/src/panels/timeline/CurvePane.tsx +508 -0
  250. package/src/panels/timeline/Filmstrip.tsx +361 -0
  251. package/src/panels/timeline/GenerateDrawer.tsx +407 -0
  252. package/src/panels/timeline/KeyStretch.tsx +115 -0
  253. package/src/panels/timeline/LifespanRow.tsx +730 -47
  254. package/src/panels/timeline/MarkerLane.tsx +46 -8
  255. package/src/panels/timeline/PlayButton.tsx +91 -0
  256. package/src/panels/timeline/PropertyPicker.tsx +254 -0
  257. package/src/panels/timeline/ShotRow.tsx +400 -0
  258. package/src/panels/timeline/SoundMode.tsx +1406 -0
  259. package/src/panels/timeline/TimelineDock.tsx +2338 -272
  260. package/src/panels/timeline/TransportVolume.tsx +163 -0
  261. package/src/panels/timeline/beatRuler.ts +74 -0
  262. package/src/panels/timeline/curveModel.ts +500 -0
  263. package/src/panels/timeline/duckUnderVoice.ts +68 -0
  264. package/src/panels/timeline/keyframeMenu.ts +138 -0
  265. package/src/panels/timeline/labelWidth.ts +49 -0
  266. package/src/panels/timeline/marquee.ts +155 -0
  267. package/src/panels/timeline/model.ts +1860 -199
  268. package/src/panels/timeline/snap.ts +125 -43
  269. package/src/panels/timeline/staggerPreview.tsx +92 -0
  270. package/src/panels/timeline/takeMeasure.ts +72 -0
  271. package/src/panels/timeline/useLive.ts +48 -0
  272. package/src/panels/timeline/viewport.ts +234 -0
  273. package/src/panels/toolbar/BackChip.tsx +116 -0
  274. package/src/panels/toolbar/CameraViewBar.tsx +118 -49
  275. package/src/panels/toolbar/CanvasBar.tsx +117 -0
  276. package/src/panels/toolbar/InsertButton.tsx +38 -0
  277. package/src/panels/toolbar/IsolationTrail.tsx +156 -0
  278. package/src/panels/toolbar/PanelToggles.tsx +86 -0
  279. package/src/panels/toolbar/ShadingBar.tsx +119 -26
  280. package/src/panels/toolbar/ToolDockBar.tsx +329 -80
  281. package/src/panels/toolbar/ToolFooter.tsx +102 -0
  282. package/src/panels/toolbar/ViewModeBar.tsx +247 -38
  283. package/src/panels/toolbar/WorkPlaneBar.tsx +94 -0
  284. package/src/panels/toolbar/useAddRows.tsx +326 -0
  285. package/src/panels/toolbar/useDismiss.ts +122 -0
  286. package/src/panels/versions/VersionHistoryPanel.tsx +274 -0
  287. package/src/panels/versions/versionModel.ts +103 -0
  288. package/src/panels/virtualWindow.ts +271 -0
  289. package/src/shotTokens.css +151 -60
  290. package/src/stage/FrustumGizmo.tsx +504 -84
  291. package/src/stage/GridPlane.tsx +225 -16
  292. package/src/stage/NodePreviews.tsx +628 -0
  293. package/src/stage/PerfHud.tsx +437 -47
  294. package/src/stage/SplitRenderer.tsx +816 -169
  295. package/src/stage/StageApp.tsx +4274 -486
  296. package/src/stage/StageRootBoundary.tsx +114 -0
  297. package/src/stage/StageTools.tsx +651 -151
  298. package/src/stage/TransformGizmo.tsx +696 -0
  299. package/src/stage/adaptivePresentation.ts +145 -0
  300. package/src/stage/bridgeClient.ts +2522 -41
  301. package/src/stage/exportWorker.ts +9 -0
  302. package/src/stage/feed.ts +305 -14
  303. package/src/stage/fontPreview.ts +176 -0
  304. package/src/stage/frustumGeometry.ts +319 -1
  305. package/src/stage/furnitureTokens.ts +33 -0
  306. package/src/stage/gizmoMath.ts +508 -16
  307. package/src/stage/gpuTimer.ts +276 -0
  308. package/src/stage/instanceModules.ts +194 -33
  309. package/src/stage/interactions/move.ts +24 -5
  310. package/src/stage/isolation.ts +291 -33
  311. package/src/stage/jsSelfProfiler.ts +325 -0
  312. package/src/stage/main.tsx +116 -16
  313. package/src/stage/modalState.ts +222 -23
  314. package/src/stage/moduleEpoch.ts +60 -0
  315. package/src/stage/motionPathStage.ts +279 -0
  316. package/src/stage/motionPreview.ts +74 -0
  317. package/src/stage/overlays/Overlays.tsx +1112 -159
  318. package/src/stage/overlays/Rulers.tsx +495 -0
  319. package/src/stage/panes.ts +159 -10
  320. package/src/stage/project.ts +68 -3
  321. package/src/stage/renderScaleController.ts +730 -0
  322. package/src/stage/rulers.ts +129 -0
  323. package/src/stage/sceneExtent.ts +75 -0
  324. package/src/stage/shading.ts +20 -0
  325. package/src/stage/splineStage.ts +632 -0
  326. package/src/stage/stagePerformanceTelemetry.ts +717 -0
  327. package/src/stage/stageTheme.ts +36 -0
  328. package/src/stage/stageWarmup.ts +11 -0
  329. package/src/stage/textAutoSize.ts +124 -0
  330. package/src/stage/tier1Export.ts +641 -0
  331. package/src/stage/tokenColor.ts +14 -9
  332. package/src/stage/view.ts +56 -9
  333. package/src/stage/workingView.ts +277 -33
  334. package/src/state/accountPrefs.ts +261 -0
  335. package/src/state/agentActions.ts +173 -15
  336. package/src/state/agentActivity.ts +198 -0
  337. package/src/state/agentQuestion.ts +239 -0
  338. package/src/state/bootOpen.ts +42 -0
  339. package/src/state/cameraVerbs.ts +139 -0
  340. package/src/state/clientId.ts +6 -1
  341. package/src/state/comments.ts +1099 -0
  342. package/src/state/context.tsx +19 -1
  343. package/src/state/editorPrefs.ts +220 -0
  344. package/src/state/errorReports.ts +121 -0
  345. package/src/state/fieldWrite.ts +161 -0
  346. package/src/state/fontRecents.ts +70 -0
  347. package/src/state/fonts.ts +656 -0
  348. package/src/state/graphClipboard.ts +414 -0
  349. package/src/state/imageThumbs.ts +216 -0
  350. package/src/state/insert.ts +444 -67
  351. package/src/state/isolationTrail.ts +92 -0
  352. package/src/state/keyMoves.ts +134 -0
  353. package/src/state/keyframeClipboard.ts +177 -0
  354. package/src/state/keymap.ts +1153 -117
  355. package/src/state/layoutPrefs.ts +272 -0
  356. package/src/state/layouts.ts +205 -0
  357. package/src/state/measureMedia.ts +167 -0
  358. package/src/state/menu.ts +2341 -28
  359. package/src/state/motionStamp.ts +7 -0
  360. package/src/state/panelSize.ts +375 -5
  361. package/src/state/pendingChanges.ts +119 -0
  362. package/src/state/playHold.ts +78 -0
  363. package/src/state/playbackPreparation.ts +562 -0
  364. package/src/state/posterCapture.ts +242 -0
  365. package/src/state/presence.ts +254 -0
  366. package/src/state/projectComponents.ts +160 -0
  367. package/src/state/renderEvents.ts +298 -18
  368. package/src/state/runtimeErrors.ts +46 -0
  369. package/src/state/selection.ts +12 -0
  370. package/src/state/shortcuts.ts +1606 -0
  371. package/src/state/sketchGuide.ts +51 -0
  372. package/src/state/splineRefs.ts +87 -0
  373. package/src/state/stageHealth.ts +259 -0
  374. package/src/state/stageWatchdog.ts +47 -0
  375. package/src/state/stillStage.ts +330 -0
  376. package/src/state/stillThumbs.ts +474 -0
  377. package/src/state/store.ts +23591 -2982
  378. package/src/state/storyboardModel.ts +528 -0
  379. package/src/state/sync.ts +1257 -0
  380. package/src/state/syncCache.ts +159 -0
  381. package/src/state/triangles.ts +13 -0
  382. package/src/state/types.ts +1698 -55
  383. package/src/state/unsavedGuard.ts +49 -0
  384. package/src/state/viewMode.ts +200 -0
  385. package/src/state/webmcp.ts +1128 -0
  386. package/src/state/workspace.ts +1147 -0
  387. package/src/styles/assets-tab.css +304 -0
  388. package/src/styles/canvas.css +545 -0
  389. package/src/styles/comments.css +1435 -0
  390. package/src/styles/controls.css +162 -0
  391. package/src/styles/dialogs.css +390 -0
  392. package/src/styles/insert-drawer.css +586 -0
  393. package/src/styles/inspector-board.css +207 -0
  394. package/src/styles/inspector-object.css +486 -0
  395. package/src/styles/inspector-shot.css +252 -0
  396. package/src/styles/inspector.css +360 -0
  397. package/src/styles/left-column.css +1628 -0
  398. package/src/styles/library-preview.css +575 -0
  399. package/src/styles/library.css +512 -0
  400. package/src/styles/modes/code.css +569 -0
  401. package/src/styles/modes/component.css +1561 -0
  402. package/src/styles/modes/material.css +1201 -0
  403. package/src/styles/modes/storyboard.css +518 -0
  404. package/src/styles/share-component.css +49 -0
  405. package/src/styles/shell.css +653 -0
  406. package/src/styles/shot-brief.css +360 -0
  407. package/src/styles/states.css +76 -0
  408. package/src/styles/sync.css +380 -0
  409. package/src/styles/timeline-graph.css +384 -0
  410. package/src/styles/timeline-meters.css +89 -0
  411. package/src/styles/timeline-rows.css +1959 -0
  412. package/src/styles/timeline-sound.css +1003 -0
  413. package/src/styles/timeline.css +754 -0
  414. package/src/styles/tool-footer.css +525 -0
  415. package/src/styles/topbar.css +886 -0
  416. package/src/styles/versions.css +262 -0
  417. package/src/styles.css +72 -2921
  418. package/src/tools.ts +108 -23
  419. package/dist/assets/index-B7notge7.css +0 -1
  420. package/dist/assets/index-BBE6Ta9L.js +0 -52
  421. package/src/panels/files/icons.tsx +0 -118
  422. package/src/panels/header/DocSwitcher.tsx +0 -85
  423. package/src/panels/header/TransportBar.tsx +0 -86
  424. package/src/panels/inspector/animate/BlockTiming.tsx +0 -341
  425. package/src/panels/inspector/animate/DuringBlocks.tsx +0 -85
  426. package/src/panels/inspector/animate/InOutPresets.tsx +0 -57
  427. package/src/panels/inspector/animate/ResolvedChannels.tsx +0 -150
  428. package/src/panels/inspector/animate/useBlocks.ts +0 -43
  429. package/src/panels/material/MaterialPicker.tsx +0 -172
  430. package/src/panels/timeline/SceneStrip.tsx +0 -145
  431. package/src/panels/toolbar/AddMenu.tsx +0 -230
  432. package/src/stage/MoveGizmo.tsx +0 -411
@@ -0,0 +1,289 @@
1
+ // The shot lane's OFFLINE audio mix, for Tier-1 export: one deterministic
2
+ // OfflineAudioContext render of the document's clips, handed to the encode
3
+ // worker as planar f32. The browser-side sibling of the server render's mix
4
+ // (cli's mixCompositionAudio via shotRender's withShotAudio), and the same
5
+ // three engine functions the live preview schedules from — so what the author
6
+ // heard is what the file carries, on every path.
7
+ //
8
+ // ── TWO HOMES, ONE FLATTEN ──────────────────────────────────────────────
9
+ //
10
+ // Clips live in two places since schema v13: `doc.audio` (the master-timed bed)
11
+ // and `Scene3D.audio` (what a shot owns, on scene-local frames). Everything
12
+ // below reads `masterAudioClips`, never either record — see the note at the
13
+ // call. The rest of this file never learns that a second home exists.
14
+ //
15
+ // ── SCENE SCOPE IS THE SLICE'S PROBLEM, NOT OURS ────────────────────────
16
+ //
17
+ // A per-scene export mixes the audio of `sliceShotToScene(doc, sceneId)`.
18
+ // The slice has already done the master→scene retiming — dropping what falls
19
+ // outside the window, trimming a clip that starts before it and advancing its
20
+ // `offsetFrames` by the amount removed. That is the same call the server
21
+ // render's withShotAudio leans on, for the same reason: re-deriving the
22
+ // arithmetic here would be a second implementation of the one thing in this
23
+ // lane most likely to go subtly out of sync with the picture.
24
+ //
25
+ // ── ENVELOPE RULE (preview === export, non-negotiable) ──────────────────
26
+ //
27
+ // The point list comes verbatim from the engine's audioEnvelopePoints —
28
+ // setValueAtTime at the first point, linearRamp for the rest, source stopped
29
+ // at the last point's frame. Never hand-roll the fade maths here. Schema v13's
30
+ // `gainTrack` supplies the sampler argument, so a keyframed duck rides the same
31
+ // one list the live preview schedules from and the server render materialises
32
+ // as PCM; a clip with no automation supplies no sampler and the envelope falls
33
+ // back to the static gain, exactly as before.
34
+ //
35
+ // Everything Web-Audio-shaped is injectable so jsdom tests drive fakes; the
36
+ // real defaults are OfflineAudioContext + decodeAudioData + fetch.
37
+ import {
38
+ MIX_SAMPLE_RATE,
39
+ audioClipWindow,
40
+ audioEnvelopePoints,
41
+ audioSampleCount,
42
+ audioSourceTimeAt,
43
+ framesToSeconds,
44
+ measurePeak,
45
+ wirePan,
46
+ } from "@dailies-studio/engine";
47
+ import type { AudioClip, AudioPeak, Rational, ScheduledClip } from "@dailies-studio/engine";
48
+ import {
49
+ audioAnalysisFileName,
50
+ audioGainSampler,
51
+ audioPlayPath,
52
+ derivedGainTracks,
53
+ docDurationFrames,
54
+ duckSourceAssets,
55
+ masterAudioClips,
56
+ sliceShotToScene,
57
+ } from "@dailies-studio/shot/doc";
58
+ import type { AudioAnalysis, Doc3D } from "@dailies-studio/shot/doc";
59
+ import { asEngineClip } from "./preview.js";
60
+ import type { AudioBufferLike, AudioBufferSourceNodeLike, GainNodeLike, PanContextLike } from "./preview.js";
61
+
62
+ /** 48 kHz stereo, the studio's one mix layout — the ENGINE's constant, which
63
+ * is also the rate the server lane's graph and the import transcode run at.
64
+ * This used to be a local 48_000 with a comment pointing at cli's copy,
65
+ * because a package boundary stood between them; the clock moved into engine
66
+ * so the two mixes could stop describing the same number twice. */
67
+ export { MIX_SAMPLE_RATE };
68
+
69
+ export interface OfflineAudioContextLike extends PanContextLike {
70
+ destination: unknown;
71
+ createBufferSource(): AudioBufferSourceNodeLike;
72
+ createGain(): GainNodeLike;
73
+ startRendering(): Promise<{ getChannelData(channel: number): Float32Array }>;
74
+ }
75
+
76
+ export interface OfflineMixDeps {
77
+ fetchBytes(url: string): Promise<ArrayBuffer>;
78
+ decode(ctx: OfflineAudioContextLike, bytes: ArrayBuffer): Promise<AudioBufferLike>;
79
+ createContext(channels: number, length: number, sampleRate: number): OfflineAudioContextLike;
80
+ }
81
+
82
+ function defaultDeps(): OfflineMixDeps {
83
+ if (typeof OfflineAudioContext === "undefined") {
84
+ throw new Error("audio mixing needs OfflineAudioContext (a real browser)");
85
+ }
86
+ return {
87
+ fetchBytes: async (url) => {
88
+ const res = await fetch(url);
89
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
90
+ return res.arrayBuffer();
91
+ },
92
+ decode: (ctx, bytes) =>
93
+ (ctx as unknown as OfflineAudioContext).decodeAudioData(bytes) as Promise<AudioBufferLike>,
94
+ createContext: (channels, length, sampleRate) =>
95
+ new OfflineAudioContext(channels, length, sampleRate) as unknown as OfflineAudioContextLike,
96
+ };
97
+ }
98
+
99
+ const why = (e: unknown): string => (e instanceof Error ? e.message : String(e));
100
+
101
+ /** cli's audioMix.scheduleClip minus the gain-track sampler a Doc3D cannot
102
+ * have: absolute time axis, engine envelope, stop at the last point. */
103
+ function scheduleClip(
104
+ ctx: OfflineAudioContextLike,
105
+ clip: AudioClip,
106
+ buffer: AudioBufferLike,
107
+ endFrames: number,
108
+ fps: Rational,
109
+ /** The clip's gain automation, or undefined when it has none — handed
110
+ * straight to the engine, which falls back to the static gain. */
111
+ sampledGain?: (frame: number) => number | undefined,
112
+ ): { start: number; end: number } | null {
113
+ const pan = clip.pan ?? 0;
114
+ const window = audioClipWindow(clip);
115
+ // Trim starts past the decoded source: the whole clip is silence — legal
116
+ // (validation cannot know asset lengths), so no node at all.
117
+ const offset = audioSourceTimeAt(clip, window.start, fps);
118
+ if (offset >= buffer.duration) return null;
119
+ const points = audioEnvelopePoints(clip, window.start, endFrames, fps, sampledGain);
120
+ if (points.length === 0) return null;
121
+ const gain = ctx.createGain();
122
+ gain.gain.setValueAtTime(points[0]!.gain, framesToSeconds(points[0]!.frame, fps));
123
+ for (const p of points.slice(1)) {
124
+ gain.gain.linearRampToValueAtTime(p.gain, framesToSeconds(p.frame, fps));
125
+ }
126
+ const source = ctx.createBufferSource();
127
+ source.buffer = buffer;
128
+ source.connect(gain);
129
+ // A centred clip keeps the graph it always had. A panned one goes through
130
+ // the same splitter stage the preview uses, on the same engine law; a
131
+ // context without the splitter pair cannot honour it, and mixing it centred
132
+ // would be a file that disagrees with what the author heard.
133
+ if (pan === 0) gain.connect(ctx.destination);
134
+ else if (wirePan(ctx, gain, ctx.destination, pan) === null) {
135
+ throw new Error(`audio clip ${clip.name} is panned and this context has no ChannelSplitter`);
136
+ }
137
+ source.start(
138
+ framesToSeconds(window.start, fps),
139
+ offset,
140
+ framesToSeconds(points.at(-1)!.frame - window.start, fps),
141
+ );
142
+ // The span this clip ACTUALLY contributed, for the peak's attribution — the
143
+ // same shape cli's mixer reports, so a clip the scheduler skipped can never
144
+ // be blamed for a sample it did not make.
145
+ return { start: window.start, end: points.at(-1)!.frame };
146
+ }
147
+
148
+ /**
149
+ * Render the shot's audio clips into a 48 kHz stereo mix for the export
150
+ * scope. Null when the scope has no unmuted clips (a silent export carries
151
+ * no audio track). Missing and non-audio assets THROW — validateShotDoc
152
+ * refuses both at the gate, so reaching them here means the document
153
+ * bypassed validation, and a silent skip would be an export that looks
154
+ * successful and has no sound.
155
+ *
156
+ * The returned `peak` is measured HERE, on the float mix, because this is the
157
+ * last moment it still has its true amplitude: Web Audio sums gain nodes
158
+ * UNCLAMPED, so two clips that both peak at full scale reach +6.02 dBFS, and
159
+ * everything past ±1 is flattened on the way into the encoder. The dialog
160
+ * renders the engine's advisory from it, which is the same sentence the server
161
+ * render prints. A non-finite sample THROWS from the scan rather than becoming
162
+ * silence in the file.
163
+ */
164
+ export async function mixShotAudio(
165
+ doc: Doc3D,
166
+ /** A scene id, a master `{ start, frames }` window of the whole timeline
167
+ * (the work area), or undefined for the whole timeline. A window is the
168
+ * whole film's mix cut to its samples, so it sounds as the transport
169
+ * played it: a fade the window starts inside starts mid-fade. */
170
+ scope: string | { start: number; frames: number } | undefined,
171
+ deps: OfflineMixDeps = defaultDeps(),
172
+ ): Promise<{ sampleRate: number; channels: [Float32Array, Float32Array]; peak: AudioPeak } | null> {
173
+ const window = typeof scope === "object" ? scope : undefined;
174
+ const source = typeof scope === "string" ? (sliceShotToScene(doc, scope) ?? doc) : doc;
175
+ // THROUGH THE FLATTEN. `source.audio` has been the BED only since schema v13,
176
+ // so mixing from it exports a file missing every shot-owned clip — the
177
+ // preview would have played them and the MP4 would not, which breaks this
178
+ // lane's one rule. A slice re-zeroes on its scene, so the flatten is the
179
+ // identity over the clips that scene owns.
180
+ const flat = masterAudioClips(source);
181
+ const panOf = new Map(flat.map((m) => [m.clip.id, m.pan]));
182
+ const clips = flat
183
+ .map((m) => m.clip)
184
+ .filter(
185
+ (clip) =>
186
+ clip.muted !== true &&
187
+ (window === undefined ||
188
+ (clip.frame < window.start + window.frames && clip.frame + clip.durationFrames > window.start)),
189
+ );
190
+ if (clips.length === 0) return null;
191
+
192
+ // THE SIDECARS A DUCK NEEDS, fetched before a single node is scheduled.
193
+ //
194
+ // A THROW, not a fallback. The preview settles on the ducked envelope once
195
+ // the sidecar lands, so exporting the unducked one would ship a file quieter
196
+ // in the wrong places than the thing the author approved, with nothing on
197
+ // screen to say so. Refusal over corruption: the author re-runs the export
198
+ // after the analysis exists.
199
+ const analyses = new Map<string, AudioAnalysis>();
200
+ for (const asset of duckSourceAssets(source)) {
201
+ try {
202
+ const bytes = await deps.fetchBytes(`/studio/assets/${encodeURIComponent(audioAnalysisFileName(asset.path))}`);
203
+ analyses.set(asset.path, JSON.parse(new TextDecoder().decode(bytes)) as AudioAnalysis);
204
+ } catch (e) {
205
+ throw new Error(
206
+ `audio analysis for ${asset.path}: ${why(e)}. A ducked bed cannot be mixed until its voice is measured.`,
207
+ );
208
+ }
209
+ }
210
+ const derived = derivedGainTracks(source, (asset) => analyses.get(asset.path));
211
+
212
+ const endFrames = window === undefined ? docDurationFrames(source) : window.start + window.frames;
213
+ // The ENGINE's integer clock, not `Math.ceil(seconds * rate)`. That spelling
214
+ // is off by a sample at 30000/1001 (audioTiming.ts measures it: 248249
215
+ // against a true 248248 over five seconds), which is a mix one sample longer
216
+ // than the picture and a muxer left to resolve the difference however its
217
+ // container prefers.
218
+ const length = audioSampleCount(endFrames, source.fps);
219
+ if (length <= 0) return null;
220
+
221
+ const ctx = deps.createContext(2, length, MIX_SAMPLE_RATE);
222
+ // N clips of one asset decode once — buffers are shared read-only.
223
+ const decoded = new Map<string, AudioBufferLike>();
224
+ const scheduled: ScheduledClip[] = [];
225
+ for (const clip of clips) {
226
+ const asset = source.assets[clip.asset];
227
+ if (asset === undefined) {
228
+ throw new Error(`audio clip ${clip.id} references unknown asset ${clip.asset}`);
229
+ }
230
+ if (asset.kind !== "audio") {
231
+ throw new Error(`audio clip ${clip.id} references asset ${clip.asset}, which is a ${asset.kind}`);
232
+ }
233
+ // The file the clip PLAYS: its processed file when it has effects (schema
234
+ // v49), which the host makes on this request if it has not yet.
235
+ const file = audioPlayPath(clip, asset);
236
+ let buffer = decoded.get(file);
237
+ if (!buffer) {
238
+ let bytes: ArrayBuffer;
239
+ try {
240
+ bytes = await deps.fetchBytes(`/studio/assets/${encodeURIComponent(file)}`);
241
+ } catch (e) {
242
+ throw new Error(
243
+ file === asset.path ? `audio asset ${asset.path}: ${why(e)}` : `audio clip ${clip.id}: its effects could not be rendered (${why(e)})`,
244
+ );
245
+ }
246
+ try {
247
+ buffer = await deps.decode(ctx, bytes);
248
+ } catch (e) {
249
+ throw new Error(`audio asset ${file}: could not decode (${why(e)})`);
250
+ }
251
+ decoded.set(file, buffer);
252
+ }
253
+ // `clip.frame` is the MASTER start the flatten put it at, and the track's
254
+ // frames are local to exactly that — including after `clipToWindow` shifted
255
+ // them by whatever a window ate off the head.
256
+ const span = scheduleClip(
257
+ ctx,
258
+ asEngineClip(clip, panOf.get(clip.id)),
259
+ buffer,
260
+ endFrames,
261
+ source.fps,
262
+ // The derived duck outranks the authored track because it INCLUDES it:
263
+ // `duckedGainTrack` multiplies whatever gain/gainTrack resolve to.
264
+ audioGainSampler(derived.get(clip.id) ?? clip.gainTrack, clip.frame, source.fps),
265
+ );
266
+ // `name` is the clip id: `AudioClipRef` has no name of its own (asEngineClip
267
+ // fills the engine's field with the id), and the id is what the lane shows.
268
+ if (span) scheduled.push({ name: clip.id, ...span });
269
+ }
270
+
271
+ const rendered = await ctx.startRendering();
272
+ // A window keeps its own samples, on the same integer clock as the picture,
273
+ // and its peak is the file's: frames and spans counted from its start.
274
+ const from = window === undefined ? 0 : audioSampleCount(window.start, source.fps);
275
+ const channels: [Float32Array, Float32Array] = [
276
+ rendered.getChannelData(0).subarray(from),
277
+ rendered.getChannelData(1).subarray(from),
278
+ ];
279
+ const shift = window?.start ?? 0;
280
+ return {
281
+ sampleRate: MIX_SAMPLE_RATE,
282
+ channels,
283
+ peak: measurePeak(
284
+ channels,
285
+ scheduled.map((c) => ({ ...c, start: Math.max(0, c.start - shift), end: c.end - shift })),
286
+ source.fps,
287
+ ),
288
+ };
289
+ }