@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
@@ -6,25 +6,41 @@
6
6
  // a second GL context doubles a budget this lane already owns outright (the
7
7
  // shot runtime owns the present, see the lane note in CLAUDE.md). Not two
8
8
  // iframes: the stage iframe may never remount. So the pane boundary exists only
9
- // as numbers, and it has exactly two readers — the renderer's scissor rect and
10
- // the pointer lane's hit test.
9
+ // as numbers, and every reader takes them from here: the renderer's scissor
10
+ // rect, the pointer lane's hit test, and the chrome's split handle (`splitX`).
11
11
  //
12
12
  // They must read the SAME numbers. If the divider the renderer draws to and the
13
13
  // divider the pointer tests against differ by even one column, a press in that
14
14
  // column is answered by the other pane's camera, and the symptom is "picking is
15
15
  // off by half a screen" rather than anything that looks like a layout bug.
16
16
  //
17
- // THREE-FREE ON PURPOSE. The chrome lays out the divider handle from these same
18
- // rects, and the chrome may not import three (test/sourceHygiene.test.ts).
17
+ // THREE-FREE ON PURPOSE. App.tsx places the divider handle and writes
18
+ // `--split-x` (where the canvas bar's camera group starts) through `splitX`,
19
+ // and the chrome may not import three (test/sourceHygiene.test.ts).
20
+ import type { StageInset } from "../bridgeTypes.js";
19
21
  import type { Viewport } from "./view.js";
20
22
 
23
+ /** The two panes, as a VALUE as well as a type: the chrome's layout table is a
24
+ * `Record` over these, so a third pane would fail to compile there rather than
25
+ * arriving with no word for it. */
26
+ export const STAGE_PANES = ["camera", "working"] as const;
27
+
21
28
  /** Which of the two views a coordinate, a camera or a query belongs to. */
22
- export type StagePane = "camera" | "working";
29
+ export type StagePane = (typeof STAGE_PANES)[number];
30
+
31
+ /** The three layouts the stage can be in. ONE WRITTEN FORM: the union below is
32
+ * derived from this list, and `state/layouts.ts` keys its table on the union,
33
+ * so the members exist in exactly one place across the whole chrome. */
34
+ export const STAGE_LAYOUT_MODES = ["camera", "split", "working"] as const;
35
+
36
+ /** Which editor is on screen. The chrome's words, keys and menu ids for these
37
+ * are in `state/layouts.ts`; this is only the vocabulary itself. */
38
+ export type StageLayoutMode = (typeof STAGE_LAYOUT_MODES)[number];
23
39
 
24
40
  /** What the stage is showing. Editor state: it is never written to the document
25
41
  * and never reaches an export. */
26
42
  export interface StageLayout {
27
- mode: "camera" | "split" | "working";
43
+ mode: StageLayoutMode;
28
44
  /** The WORKING pane's fraction of the viewport WIDTH. Read only in "split". */
29
45
  splitRatio: number;
30
46
  }
@@ -55,6 +71,53 @@ export function clampSplitRatio(ratio: number): number {
55
71
  return Math.max(MIN_SPLIT_RATIO, Math.min(MAX_SPLIT_RATIO, ratio));
56
72
  }
57
73
 
74
+ /** No chrome at all: the identity inset, so a caller with nothing to subtract
75
+ * can pass a value rather than a special case. */
76
+ export const NO_INSET: StageInset = { top: 0, right: 0, bottom: 0, left: 0 };
77
+
78
+ /**
79
+ * Where the split's seam falls, in canvas px from the left.
80
+ *
81
+ * ── WHY THE INSET IS AN ARGUMENT ────────────────────────────────────────
82
+ *
83
+ * The ratio is the WORKING pane's share of the width, and the width it used to
84
+ * be a share of was the whole window. But the window's left edge is under the
85
+ * rail and its right edge is under the inspector, so at 1366 with the panels
86
+ * open a 0.5 split put the seam at 683 while the visible canvas ran from 212 to
87
+ * 1066 — the working pane got 471 visible px against the camera pane's 383, and
88
+ * a fifth of the working pane was behind the rail. The ratio has to divide the
89
+ * part the author can SEE, or it is not the thing they think they are dragging.
90
+ *
91
+ * The pane RECTS still partition the whole viewport (the scissor draws
92
+ * full-bleed under the chrome, see `insetRect`); only where the seam lands
93
+ * moves. Both readers of the seam — the renderer's scissor and the chrome's
94
+ * divider handle — call this, so they cannot disagree by a column.
95
+ *
96
+ * A degenerate inset (more chrome than window, which a mid-animation panel
97
+ * width can briefly report) falls back to dividing the whole width: a seam
98
+ * somewhere is recoverable, a NaN seam is a scissor that draws nothing.
99
+ */
100
+ export function splitX(ratio: number, width: number, inset: StageInset = NO_INSET): number {
101
+ const left = Math.max(0, inset.left);
102
+ const clear = width - left - Math.max(0, inset.right);
103
+ const x =
104
+ Number.isFinite(clear) && clear > 1
105
+ ? left + Math.round(clampSplitRatio(ratio) * clear)
106
+ : Math.round(width * clampSplitRatio(ratio));
107
+ return Math.min(Math.max(1, x), width - 1);
108
+ }
109
+
110
+ /** The inverse of `splitX`: what ratio a seam at `x` represents. The drag
111
+ * handle's `onChange` reads a pixel and has to store a ratio, and doing that
112
+ * arithmetic at the call site is how the two ends drift apart. */
113
+ export function splitRatioAt(x: number, width: number, inset: StageInset = NO_INSET): number {
114
+ const left = Math.max(0, inset.left);
115
+ const clear = width - left - Math.max(0, inset.right);
116
+ return clampSplitRatio(
117
+ Number.isFinite(clear) && clear > 1 ? (x - left) / clear : x / Math.max(1, width),
118
+ );
119
+ }
120
+
58
121
  /**
59
122
  * The two panes' rectangles.
60
123
  *
@@ -65,10 +128,17 @@ export function clampSplitRatio(ratio: number): number {
65
128
  * A pane that is not on screen is `null`, not a zero-sized rect. Null cannot be
66
129
  * scissored by accident and cannot be hit-tested by accident; a 0x0 rect can be
67
130
  * both, silently.
131
+ *
132
+ * THE RECTS PARTITION THE WHOLE VIEWPORT even with an inset. The scissor draws
133
+ * full-bleed under the docked chrome on purpose, so a pane never shrinks; the
134
+ * inset only moves where the SEAM lands, via `splitX`. Which pixels are visible
135
+ * is `insetRect`'s question, and it is asked separately by the two things that
136
+ * have to be seen rather than drawn.
68
137
  */
69
138
  export function paneRects(
70
139
  layout: StageLayout,
71
140
  viewport: Viewport,
141
+ inset: StageInset = NO_INSET,
72
142
  ): { working: PaneRect | null; camera: PaneRect | null } {
73
143
  const { width, height } = viewport;
74
144
  // The same guard view.ts's `fitView` applies, for the same reason: the
@@ -82,16 +152,95 @@ export function paneRects(
82
152
  // A viewport too narrow to hold two panes shows the CAMERA one. It is the
83
153
  // pane that is the export, so it is the one worth keeping when only one fits.
84
154
  if (width < 2) return { working: null, camera: full };
85
- // ROUNDED, and the camera pane takes the remainder rather than its own
86
- // rounding: two independently rounded widths can leave a one-column seam that
87
- // neither pane owns, and a column nobody draws is a visible tear.
88
- const split = Math.min(Math.max(1, Math.round(width * clampSplitRatio(layout.splitRatio))), width - 1);
155
+ // THROUGH `splitX`, never inline: the chrome's divider handle positions
156
+ // itself from the same call, and a seam computed twice is a seam that drifts
157
+ // by a column — which reads as "picking is off" rather than as a layout bug.
158
+ const split = splitX(layout.splitRatio, width, inset);
89
159
  return {
90
160
  working: { x: 0, y: 0, width: split, height },
91
161
  camera: { x: split, y: 0, width: width - split, height },
92
162
  };
93
163
  }
94
164
 
165
+ /**
166
+ * The part of a pane the chrome is NOT covering.
167
+ *
168
+ * ── WHY THIS IS NOT `paneRects`' JOB ────────────────────────────────────
169
+ *
170
+ * The pane rect is the SCISSOR rect, and the stage draws full-bleed under the
171
+ * chrome on purpose: the docked panels sit over a picture that continues
172
+ * behind them, and insetting the scissor would leave dead gutters instead. So `inset`
173
+ * is paint information for everything that has to be SEEN rather than drawn —
174
+ * the overlay's furniture, and the derived head-on framing.
175
+ *
176
+ * That distinction is exactly the bug this was added for. An orbit rig framed
177
+ * to the whole canvas is fine, because the author pans and zooms to compensate.
178
+ * A DERIVED frame promises "this subject, whole, fitted", and the author has
179
+ * nothing to compensate with — so fitting it to a box a third of which is under
180
+ * the timeline dock breaks the promise silently. See `headOnCamera` and the
181
+ * camera pane's `fit`.
182
+ *
183
+ * ── AN INTERSECTION, NOT FOUR SUBTRACTIONS ──────────────────────────────
184
+ *
185
+ * The inset describes the WINDOW's clear band, not each pane's. Subtracting all
186
+ * four sides from a pane charges every pane for chrome it does not touch: in a
187
+ * split, the camera pane starts at the seam and is nowhere near the rail, yet
188
+ * it lost another `inset.left` off its left edge and slid right by that much,
189
+ * while the working pane ends at the seam and paid for an inspector on the far
190
+ * side of it. So this intersects the pane with the window's clear rect instead.
191
+ * For a pane that IS the whole viewport the two are the same arithmetic, which
192
+ * is why the head-on framing this was written for is unchanged.
193
+ *
194
+ * `viewport` defaults to the pane's own far corner, so a caller holding a
195
+ * full-viewport pane can still pass two arguments and mean it.
196
+ *
197
+ * DEGENERATE INSETS COLLAPSE TO THE PANE, never to a zero or negative box: a
198
+ * chrome that reported more furniture than there is canvas (a narrow window, a
199
+ * mid-animation panel width) would otherwise produce a zero-width frustum,
200
+ * which projects everything to NaN and draws nothing with no error anywhere.
201
+ * A pane that misses the clear band entirely collapses the same way.
202
+ */
203
+ export function insetRect(
204
+ pane: PaneRect,
205
+ inset: StageInset,
206
+ viewport: Viewport = { width: pane.x + pane.width, height: pane.y + pane.height },
207
+ ): PaneRect {
208
+ const x = Math.max(pane.x, Math.max(0, inset.left));
209
+ const y = Math.max(pane.y, Math.max(0, inset.top));
210
+ const width = Math.min(pane.x + pane.width, viewport.width - Math.max(0, inset.right)) - x;
211
+ const height = Math.min(pane.y + pane.height, viewport.height - Math.max(0, inset.bottom)) - y;
212
+ if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) return pane;
213
+ return { x, y, width, height };
214
+ }
215
+
216
+ /**
217
+ * The same visible rect as `insetRect`, in PANE-LOCAL px.
218
+ *
219
+ * ── WHY THE LOCAL ANSWER NEEDS ITS OWN FUNCTION ─────────────────────────
220
+ *
221
+ * `insetRect` answers in CANVAS coordinates, which is what a caller comparing
222
+ * panes to each other wants. But the two things that lay furniture out inside a
223
+ * pane — the overlay's `<g transform="translate(pane.x pane.y)">`, and
224
+ * `fitView`, which is handed the pane's SIZE and reads every screen coordinate
225
+ * from the pane's top-left — are already in the pane's own space. They need the
226
+ * canvas answer minus the pane origin, which is all this does.
227
+ *
228
+ * SUBTRACTING A RAW INSET EDGE INSTEAD IS THE DOUBLE-COUNT. The inset is the
229
+ * WINDOW's clear band, not any one pane's, so `working.width - inset.right`
230
+ * charges the working pane of a split for an inspector that is on the far side
231
+ * of the SEAM and covers none of it: that is what put the nav gizmo an
232
+ * inspector's width left of the pane edge, 300px into the middle of the
233
+ * picture. The mirror case is the camera pane, whose local x is measured from
234
+ * the seam, so `inset.left` there subtracts a rail that pane never touches.
235
+ * Going through `insetRect` avoids both, because it intersects the pane with
236
+ * the clear band rather than subtracting all four sides — and collapses to the
237
+ * whole pane on a degenerate inset, which here means a local rect at 0,0.
238
+ */
239
+ export function clearOf(pane: PaneRect, inset: StageInset, viewport: Viewport): PaneRect {
240
+ const clear = insetRect(pane, inset, viewport);
241
+ return { x: clear.x - pane.x, y: clear.y - pane.y, width: clear.width, height: clear.height };
242
+ }
243
+
95
244
  /**
96
245
  * Which pane a canvas-space point is in, and where it lands inside it.
97
246
  *
@@ -21,12 +21,14 @@
21
21
  // the layer up to a shadow-blur radius outside its own box.
22
22
  //
23
23
  // 2. DISTANCE IS NOT THE ORDER. Every layer draws with `depthTest: false` and
24
- // `renderOrder = layer.order`, so what covers what is DOCUMENT order and
25
- // not camera distance — a shot deliberately lets a layer sit further away
24
+ // `renderOrder = layer.order` (the layer lists' paint walk), so what
25
+ // covers what is DOCUMENT order and not camera distance: a shot
26
+ // deliberately lets a layer sit further away
26
27
  // yet on top. A raycaster sorts by distance, so its "first hit" is
27
28
  // routinely a layer the author cannot see. Ordering the hits by `order`
28
29
  // descending is what makes the front-most hit the one under the cursor.
29
30
  import { Matrix4, Ray, Vector3 } from "three";
31
+ import type { Camera, Object3D, OrthographicCamera, PerspectiveCamera } from "three";
30
32
 
31
33
  /** A layer's four world-space corners, in TL, TR, BR, BL order. */
32
34
  export type WorldQuad = readonly [Vector3, Vector3, Vector3, Vector3];
@@ -42,6 +44,9 @@ export interface LayerFrame {
42
44
  /** Design px. */
43
45
  size: readonly [number, number];
44
46
  matrixWorld: Matrix4;
47
+ /** The group `matrixWorld` belongs to, so the overlay pass can bring it up
48
+ * to date (`updateWorldMatrix`) before reading it. Absent in tests. */
49
+ object?: Object3D;
45
50
  /** Paint order. Higher is nearer the viewer, whatever the depth says. */
46
51
  order: number;
47
52
  /** Locked layers are skipped by picking and marquee, and by nothing else. */
@@ -169,13 +174,28 @@ export interface Projector {
169
174
  * `setViewOffset`. So the working-area pan and zoom need no separate term here
170
175
  * and cannot drift out of step with what the renderer drew.
171
176
  */
177
+ /**
178
+ * Scratch for `toScreen`. It NEVER escapes: the function returns a plain
179
+ * `[number, number]` built from `v.x`/`v.y`, so no caller can retain it, and
180
+ * the body is synchronous with no callback between the write and the read, so
181
+ * it cannot re-enter. Two panes projecting in one frame call this in sequence,
182
+ * each finishing before the next begins.
183
+ *
184
+ * Worth pooling rather than trusting the allocator: this is the most-called
185
+ * allocation in the stage's frame, roughly 90-120 times from TransformGizmo
186
+ * alone (75 arc points, 12 pad corners, 6 arm ends) plus four per quad per
187
+ * pane from StageTools. Same hoist `_guideA`/`_guideB` already take in
188
+ * StageApp, for the same reason.
189
+ */
190
+ const _project = new Vector3();
191
+
172
192
  export function toScreen(
173
193
  point: Vector3,
174
194
  camera: Projector,
175
195
  width: number,
176
196
  height: number,
177
197
  ): [number, number] {
178
- const v = new Vector3().copy(point).applyMatrix4(camera.matrixWorldInverse).applyMatrix4(
198
+ const v = _project.copy(point).applyMatrix4(camera.matrixWorldInverse).applyMatrix4(
179
199
  camera.projectionMatrix,
180
200
  );
181
201
  // Perspective divide is inside applyMatrix4 for a Vector3 (three divides by
@@ -183,6 +203,40 @@ export function toScreen(
183
203
  return [((v.x + 1) / 2) * width, ((1 - v.y) / 2) * height];
184
204
  }
185
205
 
206
+ const _depth = new Vector3();
207
+ const DEG = Math.PI / 180;
208
+
209
+ /**
210
+ * World units per CSS pixel AT A POINT, which is what turns a fixed screen
211
+ * length (the transform gizmo's `GIZMO_PX`, the camera body's clamps) into a
212
+ * world one.
213
+ *
214
+ * Both camera classes, because isolation swaps an ORTHOGRAPHIC camera into the
215
+ * working pane's slot (StageTools) and a perspective-only formula would size a
216
+ * gizmo off a `fov` that camera does not have — reading `undefined` and
217
+ * drawing arms of length NaN, which is a gizmo that silently disappears inside
218
+ * isolation.
219
+ *
220
+ * Perspective: the visible height at the point's own view depth, over the pane.
221
+ * Orthographic: its frustum height over the pane, which has no depth term at
222
+ * all — that is what orthographic means.
223
+ */
224
+ export function worldPerPixel(camera: Camera, at: Vector3, paneHeight: number): number {
225
+ const height = Math.max(1, paneHeight);
226
+ const ortho = camera as OrthographicCamera;
227
+ if (ortho.isOrthographicCamera === true) {
228
+ const zoom = ortho.zoom > 0 ? ortho.zoom : 1;
229
+ return Math.abs(ortho.top - ortho.bottom) / zoom / height;
230
+ }
231
+ const perspective = camera as PerspectiveCamera;
232
+ const fov = Number.isFinite(perspective.fov) ? perspective.fov : 50;
233
+ // View-space z runs NEGATIVE in front of the camera, so the depth is its
234
+ // negation — and it is floored off zero, because a point sitting exactly at
235
+ // the eye would otherwise give every length zero.
236
+ const depth = Math.max(-_depth.copy(at).applyMatrix4(camera.matrixWorldInverse).z, 1e-3);
237
+ return (2 * Math.tan((fov * DEG) / 2) * depth) / height;
238
+ }
239
+
186
240
  export function screenQuad(
187
241
  frame: LayerFrame,
188
242
  camera: Projector,
@@ -300,6 +354,17 @@ export function pickLayersByDistance(ray: Ray, frames: readonly LayerFrame[]): s
300
354
  return hits.map((h) => h.id);
301
355
  }
302
356
 
357
+ /**
358
+ * A hit list with every MASK after every other hit, each side in its own
359
+ * order. A mask draws nothing of its own (gap 7), so a click goes to what the
360
+ * author sees. It matters in the working pane, which sorts by distance and can
361
+ * put a mask in front of the content it mattes. A mask alone under the cursor
362
+ * is still picked.
363
+ */
364
+ export function maskHitsLast(ids: readonly string[], isMask: (id: string) => boolean): string[] {
365
+ return [...ids.filter((id) => !isMask(id)), ...ids.filter(isMask)];
366
+ }
367
+
303
368
  /**
304
369
  * Layers whose quad intersects a screen-space rectangle — the marquee.
305
370
  *