@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
@@ -1,49 +1,258 @@
1
- // Which views the stage shows: working, split, or camera.
1
+ // THE VIEW TRACK: 3D | Split | Camera, then the Clean view eye, in the tool
2
+ // footer.
2
3
  //
3
- // A FLOATING SIBLING of the stage, never a wrapper. Every panel in this shell
4
- // is, and the reason is in App.tsx's header: the stage iframe must not remount
5
- // and no ancestor of it may create a containing block.
4
+ // Mounted by ToolFooter as the right half of the docked footer under the
5
+ // canvas, so it is on screen exactly where the stage is (no mode brings it)
6
+ // and never floats over the picture. The footer's left half is the tools, or
7
+ // the shot under the playhead in the Project context; this says what the
8
+ // canvas is showing.
6
9
  //
7
- // The three modes are a table for the same reason the tool dock's are — the
8
- // glyph, the label and the key belong beside the mode they describe, so adding
9
- // a fourth is one row and forgetting its shortcut is a compile error.
10
+ // ── TWO WORDS, AND THEY ARE NOT PANES ──────────────────────────────────────
11
+ //
12
+ // Edit | Video used to pick a stage layout: Edit meant the 3D viewport, Video
13
+ // meant the camera pane. That was wrong about the stage, and the way it was
14
+ // wrong is worth keeping written down, because the two-word control survived
15
+ // the correction and the mapping under it did not.
16
+ //
17
+ // The rect, ellipse, line, text, image and pen tools draw in the CAMERA pane
18
+ // and nowhere else, and so do the move, resize and rotate handles. The working
19
+ // pane is the 3D viewport: orbit, gizmo, frustum, the modal G/R/S. So "Video
20
+ // is the camera pane" made drawing impossible in the view that could not play
21
+ // and possible in the one that could.
22
+ //
23
+ // So Video is a FLAG OVER THE PICTURE (`state.video`, "Clean view" on every
24
+ // surface since the design review): the same frame with every piece of
25
+ // authoring furniture taken off it; the transport runs with it on or off. WHICH EDITOR Edit shows (the 3D view, the split, or the
26
+ // camera) is a separate setting on ⇧1 / ⇧2 / ⇧3 and in the View menu, and Video
27
+ // never writes it. `state/viewMode.ts` owns every direction of that.
28
+ //
29
+ // ── ONE TRACK AND ONE TOGGLE ───────────────────────────────────────────────
30
+ //
31
+ // The 2026-10-13 design review (Paper) splits the old five-chip track. The
32
+ // layouts stay a track, one `role="radiogroup"` with exactly one chip lit,
33
+ // because they are three answers to one question. The flag becomes what it
34
+ // is: an on/off, so a toggle button with `aria-pressed` (an eye, "Clean
35
+ // view") beside the track. Edit had no meaning of its own beyond "the flag is
36
+ // off", and a pressed-state button says that at rest without a chip for it.
37
+ // Video over a split still lights Split in the track (the editor waiting
38
+ // underneath) while the eye is pressed (what is on top), so nothing lies.
39
+ //
40
+ // ── NOTHING HERE IS THE ONLY WAY BACK ──────────────────────────────────────
41
+ //
42
+ // Pressing the eye again is one way out of Clean view and it is the least
43
+ // used one. Every selection, every edit, every armed tool and every door into
44
+ // a container calls the store's `enterEdit()`, so the ordinary way back is to
45
+ // click the thing you wanted to work on. Escape and ⇧4 do it too.
46
+ //
47
+ // ── GLYPHS AND WORDS, AS PAPER DRAWS THEM ──────────────────────────────────
48
+ //
49
+ // 3D and Camera are a glyph and a word; Split is a word alone (a split glyph
50
+ // is "◱ ▥ ▣" again, which nobody arrives knowing). The layouts keep their
51
+ // words at every width. The eye is a glyph with an `aria-label`, and every
52
+ // control has a `title` with its key, so nothing is taught by shape alone.
53
+ import { useRef, useState } from "react";
54
+ import type { ReactElement } from "react";
55
+ import { Popover, SegmentedControl } from "@dailies-studio/ui";
56
+ import { CAMERA_ICON, CUBE_ICON, EYE_ICON, EYE_OFF_ICON } from "../../icons.js";
10
57
  import { useShotEditor, useStore } from "../../state/context.js";
11
- import type { StageLayout } from "../../bridgeTypes.js";
58
+ import { LAYOUT_MODES, layoutRefusal, layoutSpec } from "../../state/layouts.js";
59
+ // The words, the keys and the order of the two modes, plus the reason their
60
+ // keys are not a pair. This bar is a reader of that table, never a second
61
+ // writer of it.
62
+ import { VIEW_MODE_SPECS, inDefinition, shownLayoutMode, viewModeOf } from "../../state/viewMode.js";
63
+ import type { StageLayout, StageLayoutMode } from "../../stage/panes.js";
64
+ import { TOOL_FOOTER_H } from "../../state/panelSize.js";
65
+ import { formatCombo } from "../../state/shortcuts.js";
66
+
67
+ /** The folded picker's height (`.view-picker`, tool-footer.css). */
68
+ const PICKER_H = 28;
12
69
 
13
- const MODES: ReadonlyArray<{
14
- mode: StageLayout["mode"];
15
- glyph: string;
16
- label: string;
17
- key: string;
18
- }> = [
19
- // Left to right in the order the digits are, and in the order the panes
20
- // themselves sit: the working pane is on the left of a split.
21
- { mode: "working", glyph: "◱", label: "Working view", key: "1" },
22
- { mode: "split", glyph: "▥", label: "Split", key: "2" },
23
- { mode: "camera", glyph: "▣", label: "Camera view", key: "3" },
24
- ];
70
+ // THE LOCAL HALF, and the only half: `state/` is JSX-free on purpose, so the
71
+ // glyphs cannot live beside the words they belong to. Everything else about
72
+ // these rows comes out of `VIEW_MODE_SPECS` and `LAYOUT_SPECS`.
73
+ const LAYOUT_ICONS: Record<StageLayoutMode, ReactElement | null> = {
74
+ working: CUBE_ICON,
75
+ split: null,
76
+ camera: CAMERA_ICON,
77
+ };
78
+
79
+ /**
80
+ * Whether this bar is on screen, ONE SPELLING.
81
+ *
82
+ * The bar is the right half of the tool footer, and that footer is drawn even
83
+ * when this half is not (a definition keeps its tools). Keeping the answer
84
+ * here, where the reason lives, means the bar and its tests read one rule
85
+ * rather than two copies of two conditions.
86
+ */
87
+ export function useViewModeBarVisible(): boolean {
88
+ const open = useShotEditor((s) => s.name !== null);
89
+ // A DEFINITION HAS NO SHOT CAMERA, so Video would be a view of nothing and
90
+ // Edit is simply where the author already is. `StageApp` forces the
91
+ // working-only layout while one is open, so a bar here would be reporting a
92
+ // state nothing could enter. The 4 key still carries the sentence
93
+ // (`layoutRefusal`), so the rule is taught somewhere.
94
+ const inDef = useShotEditor(inDefinition);
95
+ return open && !inDef;
96
+ }
97
+
98
+ /** The chip's face: the glyph, then the word in its own box so the compact
99
+ * track can hide it without touching the name. */
100
+ function face(icon: ReactElement | null, word: string | null): ReactElement {
101
+ return (
102
+ <>
103
+ {icon === null ? null : (
104
+ <span className="view-chip-icon" aria-hidden="true">
105
+ {icon}
106
+ </span>
107
+ )}
108
+ {word === null ? null : <span className="view-chip-word">{word}</span>}
109
+ </>
110
+ );
111
+ }
25
112
 
26
113
  export function ViewModeBar() {
27
114
  const store = useStore();
28
- const layout = useShotEditor((s) => s.stageLayout);
29
- const open = useShotEditor((s) => s.name !== null);
30
- if (!open) return null;
115
+ // THE FLAG, through the one selector that also answers for the menu's tick.
116
+ const shown = useShotEditor(viewModeOf);
117
+ const layout = useShotEditor(shownLayoutMode);
118
+ const inDef = useShotEditor(inDefinition);
119
+ // Over the canvas either way: down when the toolbar sits on top of it.
120
+ const toolbarTop = useShotEditor((s) => s.toolbarPosition === "top");
121
+ const visible = useViewModeBarVisible();
122
+ const anchor = useRef<HTMLButtonElement>(null);
123
+ const [menuOpen, setMenuOpen] = useState(false);
124
+ if (!visible) {
125
+ // Returning null keeps this component's state, so a menu left open here
126
+ // would come back open with the bar (ShadingBar has the same gate).
127
+ if (menuOpen) setMenuOpen(false);
128
+ return null;
129
+ }
130
+ // THE ONE LAYOUT REFUSAL, the sentence the digits and the View menu refuse
131
+ // with. Only a definition refuses, and the bar is not drawn in one, so today
132
+ // this is always null; it is read anyway so a second refusal added to the
133
+ // rule greys these rows with no edit here.
134
+ const refusal = layoutRefusal(inDef);
135
+ const pick = (mode: StageLayout["mode"]): void => store.setViewLayout(mode);
136
+ const clean = shown === "video";
137
+ const CLEAN = VIEW_MODE_SPECS.video;
138
+ const cleanTitle = `${CLEAN.label} (${formatCombo(CLEAN.key)})`;
139
+ // THROUGH `setViewMode`, which is also what ⇧4, Escape's top rung and the
140
+ // View menu's row call. It is `setVideo` with the one refusal in front of
141
+ // it, and having that refusal in one place is why this goes through the
142
+ // verb rather than writing the flag.
143
+ const toggleClean = (): void => store.setViewMode(clean ? "edit" : "video");
31
144
  return (
32
- <div className="view-mode-bar" role="group" aria-label="View mode" data-testid="view-mode-bar">
33
- {MODES.map(({ mode, glyph, label, key }) => (
34
- <button
35
- key={mode}
36
- type="button"
37
- className={`tool-button${layout.mode === mode ? " is-armed" : ""}`}
38
- aria-pressed={layout.mode === mode}
39
- title={`${label} (${key})`}
40
- // The RATIO is carried through, not reset: flipping to the camera and
41
- // back must return the split the author sized, not a fresh half.
42
- onClick={() => store.setStageLayout({ ...layout, mode })}
43
- >
44
- {glyph}
45
- </button>
46
- ))}
145
+ // The wrapper stays a `role="group"`: it is the footer's right half, and
146
+ // the testid on it is how the definition toolbars are proved absent.
147
+ <div className="view-mode-bar" role="group" aria-label="View" data-testid="view-mode-bar">
148
+ {/* WHICH EDITOR is under the picture. The rows are `state/layouts.ts` itself, which
149
+ is the table View ▸ Layout, the ⇧1 / ⇧2 / ⇧3 keys and every refusal
150
+ sentence read too, so the third layout cannot be called Camera here
151
+ and Frame two surfaces over.
152
+
153
+ Lit from `shownLayoutMode`, so Clean view lights Camera (that is
154
+ what is on screen), and any click here leaves Clean view through
155
+ `setViewLayout`, which is what the digits do too.
156
+
157
+ All three are live in BOTH contexts. Above a shot the working pane
158
+ draws the shot under the playhead, which is the scene the stage
159
+ resolves anyway; only a definition refuses. */}
160
+ <SegmentedControl
161
+ ariaLabel="Layout"
162
+ className="layout-switch"
163
+ value={layout}
164
+ onChange={(value) => pick(value as StageLayout["mode"])}
165
+ options={LAYOUT_MODES.map((mode) => {
166
+ const { label, key } = layoutSpec(mode);
167
+ return {
168
+ value: mode,
169
+ // No `ariaLabel`: the word is drawn at every width (the compact
170
+ // track takes these chips' glyphs, never their words), so the
171
+ // text is the name already.
172
+ label: face(LAYOUT_ICONS[mode], label),
173
+ title: refusal ?? `${label} (${formatCombo(key)})`,
174
+ disabled: refusal !== null,
175
+ };
176
+ })}
177
+ />
178
+ {/* THE TRACK, FOLDED, for a footer too narrow for three chips.
179
+ tool-footer.css shows exactly one of the two (a container query on
180
+ the footer), so the footer fits the narrowest canvas the shell makes
181
+ without losing a choice: one trigger naming the layout on screen,
182
+ and the three a press away in its menu. The eye is not folded into
183
+ it: it stays beside, one square that never gives. */}
184
+ <button
185
+ ref={anchor}
186
+ type="button"
187
+ className="tool-button has-caret is-labelled view-picker"
188
+ aria-haspopup="menu"
189
+ aria-expanded={menuOpen}
190
+ aria-label={`Layout: ${layoutSpec(layout).label}`}
191
+ title={`Layout: ${layoutSpec(layout).label}`}
192
+ data-testid="view-picker"
193
+ onClick={() => setMenuOpen((v) => !v)}
194
+ >
195
+ {layoutSpec(layout).label}
196
+ <span className="tool-caret" aria-hidden="true" />
197
+ </button>
198
+ {/* UPWARD, OVER THE CANVAS, like every menu the footer opens: below it
199
+ is the timeline, which has the room and is the wrong place. Right
200
+ aligned to the picker, which only the eye follows. The gap is
201
+ from the FOOTER's edge, as the tool flyouts' is (tool-footer.css):
202
+ the 28px picker is centred in the footer, so the menu ends 8px above
203
+ the footer and never over its hairline. A footer that widens while
204
+ the menu is open hides the picker, and the Popover closes on a
205
+ hidden anchor rather than drifting to the window's corner. With the
206
+ toolbar on top (Preferences) the canvas is BELOW, so it drops. */}
207
+ <Popover
208
+ open={menuOpen}
209
+ anchor={anchor}
210
+ onClose={() => setMenuOpen(false)}
211
+ side={toolbarTop ? "below" : "above"}
212
+ align="right"
213
+ gap={8 + (TOOL_FOOTER_H - PICKER_H) / 2}
214
+ >
215
+ <div className="shading-menu" role="menu" aria-label="Layout" data-testid="view-menu">
216
+ {LAYOUT_MODES.map((mode) => {
217
+ const { label, key } = layoutSpec(mode);
218
+ return (
219
+ <button
220
+ key={mode}
221
+ type="button"
222
+ role="menuitemradio"
223
+ aria-checked={layout === mode}
224
+ className={`tool-button${layout === mode ? " is-armed" : ""}`}
225
+ title={refusal ?? `${label} (${formatCombo(key)})`}
226
+ disabled={refusal !== null}
227
+ onClick={() => {
228
+ setMenuOpen(false);
229
+ pick(mode);
230
+ }}
231
+ >
232
+ {label}
233
+ </button>
234
+ );
235
+ })}
236
+ </div>
237
+ </Popover>
238
+ {/* CLEAN VIEW, the flag as the on/off it is: a toggle button, pressed
239
+ while the authoring furniture is off the frame. The eye says "look
240
+ at the picture"; pressed, it shuts, because the handles are hidden.
241
+ On screen at every footer width, folded or not: it is one 32px
242
+ square, and the flag is the footer's most used view control. */}
243
+ <button
244
+ type="button"
245
+ className="clean-view-toggle"
246
+ aria-pressed={clean}
247
+ aria-label={CLEAN.label}
248
+ title={cleanTitle}
249
+ data-testid="clean-view-toggle"
250
+ onClick={toggleClean}
251
+ >
252
+ <span className="view-chip-icon" aria-hidden="true">
253
+ {clean ? EYE_OFF_ICON : EYE_ICON}
254
+ </span>
255
+ </button>
47
256
  </div>
48
257
  );
49
258
  }
@@ -0,0 +1,94 @@
1
+ import { useShotEditor, useStore } from "../../state/context.js";
2
+ import { shownLayoutMode } from "../../state/viewMode.js";
3
+ import type { WorkPlaneTarget } from "../../bridgeTypes.js";
4
+
5
+ const OPTIONS = [
6
+ { value: "xy", label: "XY" },
7
+ { value: "xz", label: "XZ" },
8
+ { value: "yz", label: "YZ" },
9
+ { value: "view", label: "View" },
10
+ { value: "selection", label: "Selection" },
11
+ ] as const;
12
+ const XY_TARGET = { kind: "xy" } as const;
13
+
14
+ /**
15
+ * Editor-only construction plane for working-pane spline creation.
16
+ *
17
+ * ── THE WORDS CAME OFF, THE NAMES DID NOT ───────────────────────────────
18
+ *
19
+ * "Plane" and "Curve" used to be rendered beside their selects and cost more
20
+ * width than either select did, in a control strip that stopped wrapping and
21
+ * now has a real budget (see `.control-strip`). They were never the accessible
22
+ * name either: each select already carries its own `aria-label`, so a screen
23
+ * reader announced "Spline work plane", not the word beside it. The word moves
24
+ * into `title` instead, where it labels the control for a pointer the same way
25
+ * the `aria-label` labels it for a reader — one control, two audiences, no
26
+ * third copy of the word taking up the row.
27
+ *
28
+ * The selects are the house `.select`, the same 28px pill as every other
29
+ * control in the canvas bar, chevron lane included.
30
+ *
31
+ * ── ONLY WHILE THE SPLINE TOOL IS ARMED ─────────────────────────────────
32
+ *
33
+ * The plane is read by one gesture, so the bar shows it at that moment and
34
+ * gives the rest of the time back to the bar. Its permanent home is View ›
35
+ * Work plane (`state/menu.ts`), behind the same gate.
36
+ */
37
+ export function WorkPlaneBar() {
38
+ const store = useStore();
39
+ const sceneId = useShotEditor((state) => state.sceneId);
40
+ const entered = useShotEditor((state) => state.enteredScene !== null);
41
+ const inDefinition = useShotEditor((state) => state.editingDef !== null);
42
+ // ON SCREEN, not chosen: see CameraViewBar.
43
+ const mode = useShotEditor(shownLayoutMode);
44
+ const tool = useShotEditor((state) => state.tool);
45
+ const basis = useShotEditor((state) => state.splineBasis);
46
+ const selected = useShotEditor((state) => state.selection);
47
+ const target = useShotEditor((state) =>
48
+ state.sceneId === null ? XY_TARGET : (state.workPlanes[state.sceneId] ?? XY_TARGET),
49
+ );
50
+ // A definition occupies the working pane even when the scene's stashed
51
+ // layout is camera-only, so its construction plane remains addressable.
52
+ if (tool !== "spline" || sceneId === null || !entered || (mode === "camera" && !inDefinition)) return null;
53
+
54
+ const set = (value: string): void => {
55
+ if (value === "selection") {
56
+ const layerId = selected.length === 1 ? selected[0] : undefined;
57
+ if (layerId !== undefined) store.setWorkPlane({ kind: "selection", layerId });
58
+ return;
59
+ }
60
+ store.setWorkPlane({ kind: value as Exclude<WorkPlaneTarget["kind"], "selection"> });
61
+ };
62
+
63
+ return (
64
+ <div className="work-plane-bar" data-testid="work-plane-bar">
65
+ <select
66
+ className="select"
67
+ aria-label="Spline work plane"
68
+ value={target.kind}
69
+ title="Plane: the plane Shift+P draws spline anchors on"
70
+ onChange={(event) => set(event.currentTarget.value)}
71
+ >
72
+ {OPTIONS.map((option) => (
73
+ <option
74
+ key={option.value}
75
+ value={option.value}
76
+ disabled={option.value === "selection" && selected.length !== 1 && target.kind !== "selection"}
77
+ >
78
+ {option.label}
79
+ </option>
80
+ ))}
81
+ </select>
82
+ <select
83
+ className="select"
84
+ aria-label="Spline basis for new curves"
85
+ value={basis}
86
+ title="Curve: the interpolation frozen when the first anchor is placed"
87
+ onChange={(event) => store.setSplineBasis(event.currentTarget.value as typeof basis)}
88
+ >
89
+ <option value="bezier">Bezier</option>
90
+ <option value="catmull-rom">Catmull</option>
91
+ </select>
92
+ </div>
93
+ );
94
+ }