@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,45 @@
1
+ // The canvas's right-click menu, as a hook.
2
+ //
3
+ // `StageMenu.tsx`'s shape exactly: the ENTRIES are data and live in
4
+ // `state/menu.ts` beside every other menu in this chrome, and this file is only
5
+ // the part that has to be React — the portal, the anchor point, and turning a
6
+ // hit on the canvas into the `MaterialNodeMenuTargets` the entry builder takes.
7
+ //
8
+ // The split is what keeps `materialGraphMenu.test.ts` able to assert that every
9
+ // row is an existing store verb without mounting a canvas: a menu that built
10
+ // its own JSX would also be a menu that could quietly implement its own edit.
11
+ import { useCallback } from "react";
12
+ import { useContextMenu } from "@dailies-studio/ui";
13
+ import type { MenuPoint } from "@dailies-studio/ui";
14
+ import { useStore } from "../../state/context.js";
15
+ import { materialNodeMenuEntries } from "../../state/menu.js";
16
+ import type { MaterialNodeMenuTargets } from "../../state/menu.js";
17
+
18
+ export interface MaterialGraphMenuHandle {
19
+ /** Render this inside the canvas; it portals to `<body>`. */
20
+ menu: ReturnType<typeof useContextMenu>["menu"];
21
+ /** Open at a CLIENT point, about what the press landed on. */
22
+ open(at: MenuPoint, targets: MaterialNodeMenuTargets): void;
23
+ close(): void;
24
+ }
25
+
26
+ export function useMaterialGraphMenu(): MaterialGraphMenuHandle {
27
+ const store = useStore();
28
+ const menu = useContextMenu();
29
+ const openMenu = menu.open;
30
+ // STABLE, because the canvas's context-menu handlers close over it and React
31
+ // Flow hands those down to every node wrapper: a fresh identity per render
32
+ // would re-render the whole node layer for a callback nobody called.
33
+ const open = useCallback(
34
+ (at: MenuPoint, targets: MaterialNodeMenuTargets) => {
35
+ // Read at OPEN time, `StageMenu`'s rule: the press has already applied
36
+ // its own selection policy by the time this runs, so the entries describe
37
+ // what is actually selected rather than what was when this last rendered.
38
+ const entries = materialNodeMenuEntries(store, store.getState(), targets);
39
+ if (entries.length === 0) return;
40
+ openMenu(at, entries);
41
+ },
42
+ [store, openMenu],
43
+ );
44
+ return { menu: menu.menu, open, close: menu.close };
45
+ }
@@ -0,0 +1,56 @@
1
+ // A group box, drawn as a React Flow SUBFLOW.
2
+ //
3
+ // The document stores group membership as `node.groupId` and every position
4
+ // absolute; `flowModel.ts` converts that into React Flow's `parentId` plus a
5
+ // parent-relative position on the way in, and `graphPositionOf` converts it back
6
+ // on the way out. The reason to pay for that conversion at all is that a subflow
7
+ // is the only thing that makes dragging the BOX carry its members: without it,
8
+ // a group is a rectangle drawn behind cards that stay where they were, which is
9
+ // a decoration rather than a way to move a region of a graph.
10
+ //
11
+ // The title is editable in place, and so is the SIZE. The box is born around
12
+ // the members it was built from, but a graph keeps growing after that, and the
13
+ // alternative to a handle was ungrouping and grouping again.
14
+ //
15
+ // ONE HANDLE, bottom-right, not a full `NodeResizer`. A top or left handle
16
+ // moves the box's POSITION as well as its size, which is a second write and so
17
+ // a second undo entry for what the author felt as one drag. The bottom-right
18
+ // corner only ever changes `size`, which `setMaterialComment` commits whole.
19
+ import { memo } from "react";
20
+ import { NodeResizeControl } from "@xyflow/react";
21
+ import type { NodeProps } from "@xyflow/react";
22
+ import { TextField } from "@dailies-studio/ui";
23
+ import { useStore } from "../../state/context.js";
24
+ import type { MaterialFlowNode } from "./flowModel.js";
25
+
26
+ export const MaterialGroupNode = memo(function MaterialGroupNode({
27
+ data,
28
+ selected,
29
+ }: NodeProps<MaterialFlowNode>) {
30
+ const store = useStore();
31
+ const { node, materialId, path } = data;
32
+ return (
33
+ <div className="material-group" data-testid={`material-node-${node.id}`}>
34
+ <div className="material-group-title nodrag nowheel">
35
+ <TextField
36
+ value={node.label ?? "Group"}
37
+ ariaLabel="Group name"
38
+ onCommit={(label) => store.setMaterialComment(materialId, path, node.id, { label })}
39
+ />
40
+ </div>
41
+ {selected === true ? (
42
+ <NodeResizeControl
43
+ className="material-resize-handle"
44
+ position="bottom-right"
45
+ minWidth={160}
46
+ minHeight={120}
47
+ onResizeEnd={(_event, params) =>
48
+ store.setMaterialComment(materialId, path, node.id, {
49
+ size: [Math.round(params.width), Math.round(params.height)],
50
+ })
51
+ }
52
+ />
53
+ ) : null}
54
+ </div>
55
+ );
56
+ });
@@ -0,0 +1,253 @@
1
+ // THE MATERIAL NODES' LEFT COLUMN: the graphs this Project already has, and
2
+ // the starters a new one is made from.
3
+ //
4
+ // It shows in the docked left column's mode slot (MaterialWorkspace portals it
5
+ // there), so it wears the column's vocabulary: a head one bar tall with the
6
+ // bar's hairline under it, then ONE scroller (`.rail-scroll`) with full-bleed
7
+ // rows. Every row ends at a store verb the rest of the chrome already uses:
8
+ // `assignMeshGraphMaterial` (the inspector's Graph row), `deleteProjectMaterial`
9
+ // and `createMeshGraphMaterial` (the setup screen's starters).
10
+ //
11
+ // THE OPEN SLOT, OR THE WHOLE MODEL. With a submesh open (a model whose whole
12
+ // model already wears a graph), a row binds that submesh alone: the model's
13
+ // own graph puts the submesh back on it, and only that submesh's keyed
14
+ // controls go (`bindGraph` in the store). Otherwise a row binds the whole
15
+ // mesh, which drops every per-slot graph and every keyed material control.
16
+ // Either way:
17
+ //
18
+ // - a row names what it does;
19
+ // - the row marked current (the graph on the canvas) does nothing, and on
20
+ // the whole model neither does the graph it already wears;
21
+ // - a press that would take slot graphs or keyed controls with it asks
22
+ // first, through the house confirm, and names what goes. Undo still
23
+ // brings it back; the confirm is so it never goes unseen.
24
+ import { IconTrash, useConfirm } from "@dailies-studio/ui";
25
+ import {
26
+ isGraphMaterial,
27
+ isMaterialGraphParamPath,
28
+ materialGraphParamAddressOf,
29
+ materialGraphUseCount,
30
+ } from "@dailies-studio/shot/doc";
31
+ import type { Layer3D, MaterialGraph3D, MaterialGraphStarterKind } from "@dailies-studio/shot/doc";
32
+ import { useShotEditor, useStore } from "../../state/context.js";
33
+
34
+ /** The three graphs a new material can start from. The setup screen shows
35
+ * them as cards and this column as rows; one list, so the two cannot offer
36
+ * different starters. */
37
+ export const MATERIAL_STARTERS: readonly {
38
+ id: MaterialGraphStarterKind;
39
+ name: string;
40
+ detail: string;
41
+ }[] = [
42
+ {
43
+ id: "studio",
44
+ name: "Preserve Current",
45
+ detail: "Studio/unlit colour and opacity wired to the mesh's current surface.",
46
+ },
47
+ {
48
+ id: "standard",
49
+ name: "Standard",
50
+ detail: "A lit PBR surface with roughness, metalness, emissive and normals.",
51
+ },
52
+ {
53
+ id: "glass",
54
+ name: "Glass",
55
+ detail: "Physical transmission with exposed roughness, thickness, IOR and dispersion.",
56
+ },
57
+ ];
58
+
59
+ type MeshLayer = Extract<Layer3D, { kind: "mesh" }>;
60
+
61
+ /** What a rebind takes with it, as phrases for the confirm. On one submesh,
62
+ * its own keyed controls; on the whole model, the submeshes' own graphs and
63
+ * every keyed material control. Empty when nothing would go. */
64
+ function rebindLosses(layer: MeshLayer, slot: number | null): string[] {
65
+ const material = layer.mesh.material;
66
+ if (slot !== null) {
67
+ const keyedHere = Object.keys(layer.tracks ?? {}).filter(
68
+ (path) => materialGraphParamAddressOf(path)?.slot === slot,
69
+ ).length;
70
+ return keyedHere === 0 ? [] : [`${keyedHere} keyed material ${keyedHere === 1 ? "control" : "controls"} on it`];
71
+ }
72
+ const slots = isGraphMaterial(material) ? Object.keys(material.slots ?? {}).length : 0;
73
+ const keyed = Object.keys(layer.tracks ?? {}).filter((path) => isMaterialGraphParamPath(path)).length;
74
+ const losses: string[] = [];
75
+ if (slots > 0) {
76
+ losses.push(slots === 1 ? "the graph on 1 submesh" : `the graphs on ${slots} submeshes`);
77
+ }
78
+ if (keyed > 0) {
79
+ losses.push(`${keyed} keyed material ${keyed === 1 ? "control" : "controls"}`);
80
+ }
81
+ return losses;
82
+ }
83
+
84
+ /** The slot a rebind lands on: the open submesh only on top of a whole-model
85
+ * graph (`bindGraph` in the store), otherwise the whole model. */
86
+ export function rebindTarget(layer: MeshLayer, slot: number | null): number | null {
87
+ return slot !== null && isGraphMaterial(layer.mesh.material) ? slot : null;
88
+ }
89
+
90
+ /** A rebind for every surface that swaps a mesh's graph (this column and the
91
+ * inspector's Graph row): straight through when it takes nothing with it,
92
+ * otherwise asked first through the house confirm, naming what goes. `run`
93
+ * gets the slot the rebind lands on. Render `dialog`. */
94
+ export function useRebindGraph() {
95
+ const { confirm, dialog } = useConfirm();
96
+ const rebind = (
97
+ layer: MeshLayer,
98
+ layerName: string,
99
+ slot: number | null,
100
+ what: string,
101
+ run: (target: number | null) => void,
102
+ ): void => {
103
+ const target = rebindTarget(layer, slot);
104
+ const losses = rebindLosses(layer, target);
105
+ if (losses.length === 0) {
106
+ run(target);
107
+ return;
108
+ }
109
+ const where = target === null ? `all of ${layerName}` : "this submesh";
110
+ void confirm({
111
+ title: "Replace the material",
112
+ message: `Put ${what} on ${where}? This also removes ${losses.join(" and ")}. Undo brings them back.`,
113
+ confirmLabel: "Replace",
114
+ danger: true,
115
+ }).then((yes) => {
116
+ if (yes) run(target);
117
+ });
118
+ };
119
+ return { rebind, confirm, dialog };
120
+ }
121
+
122
+ export function MaterialLibrary({
123
+ layer,
124
+ layerName,
125
+ currentId,
126
+ slot,
127
+ }: {
128
+ layer: MeshLayer;
129
+ layerName: string;
130
+ /** The graph the open slot resolves to, or null while the mesh has none. */
131
+ currentId: string | null;
132
+ /** The submesh the workspace is open on, or null for the whole model. */
133
+ slot: number | null;
134
+ }) {
135
+ const store = useStore();
136
+ const doc = useShotEditor((state) => state.doc);
137
+ const { rebind, confirm, dialog } = useRebindGraph();
138
+ if (doc === null) return null;
139
+ const saved: MaterialGraph3D[] = Object.values(doc.materials ?? {}).sort((a, b) =>
140
+ a.name.localeCompare(b.name),
141
+ );
142
+ /** The graph the whole model wears. */
143
+ const wholeId = isGraphMaterial(layer.mesh.material) ? layer.mesh.material.materialId : null;
144
+ const target = rebindTarget(layer, slot);
145
+ const where = target === null ? `all of ${layerName}` : "this submesh";
146
+
147
+ return (
148
+ <section className="material-library" aria-label="Materials">
149
+ <div className="material-library-head">
150
+ <h2 className="material-library-title">Materials</h2>
151
+ </div>
152
+ <div className="rail-scroll">
153
+ <h3 className="material-library-group">In this Project</h3>
154
+ {saved.length === 0 ? (
155
+ <p className="insp-empty">No saved graphs yet. Start one from the list below.</p>
156
+ ) : (
157
+ <ul className="material-library-list" aria-label="Saved graphs">
158
+ {saved.map((material) => {
159
+ const usage = materialGraphUseCount(doc, material.id);
160
+ const current = material.id === currentId;
161
+ // A press that would change nothing: the graph on the canvas, or
162
+ // on the whole model the one it already wears (the verb skips it).
163
+ // On a submesh the model's own graph is a real press: it puts the
164
+ // submesh back on it.
165
+ const inert = current || (target === null && material.id === wholeId);
166
+ return (
167
+ <li key={material.id} className={`material-saved-row${current ? " is-current" : ""}`}>
168
+ <button
169
+ type="button"
170
+ className="material-saved-apply"
171
+ aria-current={current}
172
+ aria-disabled={inert || undefined}
173
+ title={
174
+ current
175
+ ? `${target === null ? layerName : "This submesh"} wears this graph`
176
+ : target !== null && material.id === wholeId
177
+ ? `Put this submesh back on ${layerName}'s own graph`
178
+ : `Put this graph on ${where}`
179
+ }
180
+ onClick={
181
+ inert
182
+ ? undefined
183
+ : () =>
184
+ rebind(layer, layerName, slot, `“${material.name}”`, (to) =>
185
+ store.assignMeshGraphMaterial(layer.id, material.id, to),
186
+ )
187
+ }
188
+ >
189
+ <span className={`material-model-mark is-${material.model}`} aria-hidden="true" />
190
+ <span className="material-saved-text">
191
+ <strong>{material.name}</strong>
192
+ <small>
193
+ {material.model} · {Object.keys(material.nodesById).length} nodes · {usage}{" "}
194
+ {usage === 1 ? "use" : "uses"}
195
+ </small>
196
+ </span>
197
+ </button>
198
+ {/* Only an unused graph offers a delete: `deleteProjectMaterial`
199
+ refuses one a mesh still wears, and a button that always
200
+ refuses is furniture. */}
201
+ {usage === 0 ? (
202
+ <button
203
+ type="button"
204
+ className="material-saved-delete"
205
+ aria-label={`Delete ${material.name}`}
206
+ title="Delete this unused graph from the Project"
207
+ onClick={() =>
208
+ void confirm({
209
+ title: "Delete material",
210
+ message: `Delete “${material.name}” from this Project? No mesh uses it.`,
211
+ confirmLabel: "Delete",
212
+ danger: true,
213
+ }).then((yes) => {
214
+ if (yes) store.deleteProjectMaterial(material.id);
215
+ })
216
+ }
217
+ >
218
+ <IconTrash />
219
+ </button>
220
+ ) : null}
221
+ </li>
222
+ );
223
+ })}
224
+ </ul>
225
+ )}
226
+ <h3 className="material-library-group">New from</h3>
227
+ <ul className="material-library-list" aria-label="New material starters">
228
+ {MATERIAL_STARTERS.map((starter) => (
229
+ <li key={starter.id} className="material-saved-row">
230
+ <button
231
+ type="button"
232
+ className="material-saved-apply"
233
+ title={starter.detail}
234
+ onClick={() =>
235
+ rebind(layer, layerName, slot, `a new ${starter.name} graph`, (to) =>
236
+ store.createMeshGraphMaterial(layer.id, starter.id, to),
237
+ )
238
+ }
239
+ >
240
+ <span className={`material-starter-orb is-${starter.id}`} aria-hidden="true" />
241
+ <span className="material-saved-text">
242
+ <strong>{starter.name}</strong>
243
+ <small>{starter.detail}</small>
244
+ </span>
245
+ </button>
246
+ </li>
247
+ ))}
248
+ </ul>
249
+ </div>
250
+ {dialog}
251
+ </section>
252
+ );
253
+ }