@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,474 @@
1
+ // The board's app-drawn stills: one picture per Shot and frame, and one per
2
+ // storyboard sketch, drawn on demand and kept only as object URLs in this
3
+ // page. Never stored as files.
4
+ //
5
+ // ── WHERE THEY ARE DRAWN ─────────────────────────────────────────────────
6
+ //
7
+ // On the tab's still stage (stillStage.ts `tabStillStage`), through that
8
+ // stage's own bridge `captureFrame`, at `storyboardStillSize`. A Shot is drawn
9
+ // from `sliceShotToScene` at the Shot-local frame (a slice's master frame is
10
+ // its local one). A SKETCH is drawn from `sketchStageDoc`, the converter the
11
+ // shot board's Play and the agent's `screenshot_shot { sketch }` run, at the
12
+ // sketch's own frame, its code components bound by the chrome's rule
13
+ // (`sketchBinding`): so a card shows the sketch as the stage draws it, the
14
+ // same picture the agent sees. Never on the author's stage: loading a slice
15
+ // there would swap what they look at. Never through
16
+ // `captureShotFrameToStoryboard`, which takes the export lock, and never
17
+ // through the capture HTTP route.
18
+ //
19
+ // ── ONE AT A TIME, AND ALWAYS LAST ───────────────────────────────────────
20
+ //
21
+ // One serial queue for both kinds. Each draw is a background capture, so a
22
+ // relayed agent still (store mcpRelay.ts gives it 90 s) never waits behind
23
+ // thumbnails: the thumbnail steps aside and is asked for again a moment
24
+ // later. Nothing is drawn while the author plays, exports or looks at another
25
+ // tab, and a draw in flight when they start is abandoned and queued again.
26
+ // Each draw is bounded by `STILL_READY_MS`; one that runs past it is a failed
27
+ // thumbnail.
28
+ //
29
+ // ── WHAT A PICTURE IS KEYED ON ───────────────────────────────────────────
30
+ //
31
+ // A Shot: the Shot, the frame, the size, and the Shot's drawn identity, a
32
+ // counter per Shot bumped whenever `changedShots` (drawn.ts) says a write may
33
+ // have changed its picture, or `shotsPlacing` says a code save reached it. A
34
+ // planning-only write (the storyboard, a still's frame list) bumps nothing,
35
+ // so the board keeps every picture it has.
36
+ //
37
+ // A sketch: the sketch itself, what it cites (its cards, their assets, a
38
+ // cited definition with every definition, asset and material graph it places,
39
+ // `defClosureOf`), the brand colour and font its text and accent read, the
40
+ // part's length and the Project's size and fps, and the same code-save signal
41
+ // for the modules its code components (`sketchCodeComponents`) and cited
42
+ // definitions, nested ones included, place. No content hash: the inputs are
43
+ // the key.
44
+ //
45
+ // A stale picture is still shown while its redraw waits, and draws wait for
46
+ // edits to settle.
47
+ //
48
+ // ── EVERY FAILURE IS SILENT ──────────────────────────────────────────────
49
+ //
50
+ // As with posters (posterCapture.ts), a thumbnail is decoration: a failure is
51
+ // a status the board may show, never a thrown error.
52
+ import {
53
+ changedShots,
54
+ defClosureOf,
55
+ instanceModuleOf,
56
+ shotsPlacing,
57
+ sketchCardOf,
58
+ sketchCodeComponents,
59
+ sketchStageDoc,
60
+ sliceShotToScene,
61
+ storyboardStillSize,
62
+ } from "@dailies-studio/shot/doc";
63
+ import type {
64
+ DefClosure,
65
+ Doc3D,
66
+ ReferenceItem3D,
67
+ SketchBindingFor,
68
+ StoryboardPart3D,
69
+ StoryboardSketch3D,
70
+ } from "@dailies-studio/shot/doc";
71
+ import { STILL_READY_MS, stillYielded, tabStillStage } from "./stillStage.js";
72
+ import type { StillStage } from "./stillStage.js";
73
+
74
+ /** Exactly what this module reads from the store, structural as in
75
+ * posterCapture.ts so a test double needs only these. */
76
+ export interface StillThumbsStore {
77
+ getState(): { doc: Doc3D | null; playing: boolean; exportLock: unknown };
78
+ /** The COLD lane: the document, Play and the export lock are never a
79
+ * transport tick. */
80
+ subscribeCold(listener: () => void): () => void;
81
+ }
82
+
83
+ export type StillThumb =
84
+ | { readonly status: "ready"; readonly url: string }
85
+ /** `url` is the older picture, shown while the redraw waits. */
86
+ | { readonly status: "pending"; readonly url?: string }
87
+ | { readonly status: "failed"; readonly message: string; readonly url?: string };
88
+
89
+ export interface StillThumbsDeps {
90
+ store: StillThumbsStore;
91
+ /** Default: the tab's still stage. */
92
+ stage?: () => StillStage;
93
+ /** A sketch's code components, bound as a placed one would be (the
94
+ * chrome's `contractBinding`), read when the sketch is drawn. Absent:
95
+ * unbound. */
96
+ sketchBinding?: SketchBindingFor;
97
+ /** Loads the contracts of a sketch's code components before it is staged,
98
+ * so `sketchBinding` has them. Absent: nothing to load. */
99
+ loadContracts?: (componentIds: readonly string[]) => Promise<unknown>;
100
+ setTimeout?: (fn: () => void, ms: number) => unknown;
101
+ clearTimeout?: (handle: unknown) => void;
102
+ hidden?: () => boolean;
103
+ onVisibilityChange?: (listener: () => void) => () => void;
104
+ createObjectURL?: (blob: Blob) => string;
105
+ revokeObjectURL?: (url: string) => void;
106
+ maxEntries?: number;
107
+ }
108
+
109
+ export interface StillThumbs {
110
+ /** The picture of `sceneId` at Shot-local `frame`, queueing a draw when it
111
+ * has none or an older one. Null with no document or no such Shot. */
112
+ thumb(sceneId: string, frame: number): StillThumb | null;
113
+ /** The picture of one storyboard sketch as the stage draws it, queueing a
114
+ * draw the same way. Null with no document or no such sketch. */
115
+ sketch(partId: string, sketchId: string): StillThumb | null;
116
+ /** Called after each change to what `thumb` answers. Returns the
117
+ * unsubscribe. */
118
+ subscribe(listener: () => void): () => void;
119
+ /** After a code save of `files`: every Shot and sketch placing them is
120
+ * redrawn. */
121
+ codeSaved(files: readonly string[]): void;
122
+ dispose(): void;
123
+ }
124
+
125
+ /** How long edits must stop before a redraw starts. */
126
+ const SETTLE_MS = 500;
127
+ /** How long a draw that stepped aside waits before it asks again. */
128
+ const YIELD_MS = 1_000;
129
+ // ponytail: a fixed cap; a board showing more pictures than this redraws the
130
+ // ones it evicted. Raise it, or size it from the board, if that shows.
131
+ const MAX_ENTRIES = 128;
132
+
133
+ /** What one picture shows: a Shot at a frame, or a sketch. */
134
+ type Target =
135
+ | { readonly kind: "shot"; readonly sceneId: string; readonly frame: number }
136
+ | { readonly kind: "sketch"; readonly partId: string; readonly sketchId: string };
137
+
138
+ interface Entry {
139
+ readonly target: Target;
140
+ url?: string;
141
+ /** The identity `url` was drawn at, null for none. */
142
+ drawn: string | null;
143
+ failed?: { readonly identity: string; readonly message: string };
144
+ }
145
+
146
+ interface Running {
147
+ readonly key: string;
148
+ readonly controller: AbortController;
149
+ /** Why it was abandoned, when it was. */
150
+ stopped?: "paused" | "timeout";
151
+ }
152
+
153
+ export function createStillThumbs(deps: StillThumbsDeps): StillThumbs {
154
+ const stage = deps.stage ?? tabStillStage;
155
+ const later = deps.setTimeout ?? ((fn, ms) => globalThis.setTimeout(fn, ms));
156
+ const cancel = deps.clearTimeout ?? ((h) => globalThis.clearTimeout(h as never));
157
+ const hidden = deps.hidden ?? (() => typeof document !== "undefined" && document.visibilityState === "hidden");
158
+ const onVisibilityChange =
159
+ deps.onVisibilityChange ??
160
+ ((listener: () => void) => {
161
+ if (typeof document === "undefined") return () => {};
162
+ document.addEventListener("visibilitychange", listener);
163
+ return () => document.removeEventListener("visibilitychange", listener);
164
+ });
165
+ const createUrl = deps.createObjectURL ?? ((blob: Blob) => URL.createObjectURL(blob));
166
+ const revokeUrl = deps.revokeObjectURL ?? ((url: string) => URL.revokeObjectURL(url));
167
+ const maxEntries = deps.maxEntries ?? MAX_ENTRIES;
168
+
169
+ /** Insertion order is recency: `thumb` moves an entry to the end. */
170
+ const entries = new Map<string, Entry>();
171
+ /** Keys owed a draw, oldest first. */
172
+ const queue = new Set<string>();
173
+ /** Each Shot's drawn identity. */
174
+ const identities = new Map<string, number>();
175
+ /** The code saves that reached each module, for the sketches placing it;
176
+ * `allCode` counts the saves of every module at once. */
177
+ const codeSaves = new Map<string, number>();
178
+ let allCode = 0;
179
+ const listeners = new Set<() => void>();
180
+ let doc = deps.store.getState().doc;
181
+ let running: Running | null = null;
182
+ let timer: unknown = null;
183
+
184
+ const sizeOf = (of: Doc3D): string => {
185
+ const size = storyboardStillSize(of.size);
186
+ return `${size.width}x${size.height}`;
187
+ };
188
+ const keyOf = (target: Target, of: Doc3D): string =>
189
+ target.kind === "shot" ? `${target.sceneId}:${target.frame}:${sizeOf(of)}` : `sketch:${target.sketchId}:${sizeOf(of)}`;
190
+
191
+ /** What a component card's definition draws: it, the definitions it places
192
+ * (nested ones too), their assets and material graphs (`defClosureOf`).
193
+ * Null for any other card. */
194
+ const closureOf = (of: Doc3D, card: ReferenceItem3D | null | undefined): DefClosure | null =>
195
+ card?.type === "component" && card.def !== undefined ? defClosureOf(of, card.def) : null;
196
+
197
+ /** The modules a sketch's picture places: its code components' and those
198
+ * of the definitions it cites, nested ones included. */
199
+ function sketchModules(of: Doc3D, sketch: StoryboardSketch3D): string[] {
200
+ const modules = new Set(sketchCodeComponents(of, sketch).map(instanceModuleOf));
201
+ for (const item of sketch.items) {
202
+ if (item.kind !== "ref") continue;
203
+ const closure = closureOf(of, sketchCardOf(of, item));
204
+ for (const def of closure === null ? [] : [closure.def, ...Object.values(closure.nested)]) {
205
+ for (const layer of Object.values(def.layersById)) {
206
+ if (layer.kind === "instance") modules.add(instanceModuleOf(layer.instance.component));
207
+ }
208
+ }
209
+ }
210
+ return [...modules].sort();
211
+ }
212
+
213
+ function sketchOf(of: Doc3D, partId: string, sketchId: string): { part: StoryboardPart3D; sketch: StoryboardSketch3D } | null {
214
+ const part = of.storyboard?.parts.find((p) => p.id === partId);
215
+ const sketch = part?.sketches?.find((s) => s.id === sketchId);
216
+ return part === undefined || sketch === undefined ? null : { part, sketch };
217
+ }
218
+
219
+ /** What `target`'s picture is drawn from, as a string, or null when it is
220
+ * gone. A Shot's is its counter; a sketch's is its inputs. */
221
+ function identityOf(target: Target, of: Doc3D): string | null {
222
+ if (target.kind === "shot") {
223
+ return of.scenesById[target.sceneId] === undefined ? null : String(identities.get(target.sceneId) ?? 0);
224
+ }
225
+ const found = sketchOf(of, target.partId, target.sketchId);
226
+ if (found === null) return null;
227
+ const { part, sketch } = found;
228
+ const cards = sketch.items.flatMap((item) => (item.kind === "ref" ? [sketchCardOf(of, item) ?? null] : []));
229
+ const assets = cards.map((card) => (card?.type === "asset" ? (of.assets[card.asset] ?? null) : null));
230
+ const defs = cards.map((card) => closureOf(of, card));
231
+ // The brand colour and font the ground, the accent and the text read.
232
+ const brand = (of.resources?.branding ?? []).filter((item) => item.type === "color" || item.type === "asset");
233
+ const modules = sketchModules(of, sketch);
234
+ const code = [modules.length === 0 ? 0 : allCode, ...modules.map((m) => codeSaves.get(m) ?? 0)];
235
+ return JSON.stringify([sketch, part.durationFrames, cards, assets, defs, brand, of.size, of.fps, code]);
236
+ }
237
+
238
+ const paused = (): boolean => {
239
+ const state = deps.store.getState();
240
+ return state.playing || state.exportLock !== null || hidden();
241
+ };
242
+ const notify = (): void => {
243
+ for (const listener of listeners) listener();
244
+ };
245
+
246
+ /** Draw next after `ms`. A later draw already armed is kept unless
247
+ * `reset`, which edits use so a draw waits for them to settle. */
248
+ function arm(ms: number, reset = false): void {
249
+ if (timer !== null) {
250
+ if (!reset) return;
251
+ cancel(timer);
252
+ }
253
+ timer = later(() => {
254
+ timer = null;
255
+ pump();
256
+ }, ms);
257
+ }
258
+
259
+ function drop(key: string): void {
260
+ const entry = entries.get(key);
261
+ if (entry?.url !== undefined) revokeUrl(entry.url);
262
+ entries.delete(key);
263
+ queue.delete(key);
264
+ }
265
+
266
+ function clear(): void {
267
+ if (running !== null) running.controller.abort();
268
+ running = null;
269
+ for (const key of [...entries.keys()]) drop(key);
270
+ identities.clear();
271
+ codeSaves.clear();
272
+ allCode = 0;
273
+ }
274
+
275
+ function invalidate(sceneIds: readonly string[]): void {
276
+ if (sceneIds.length === 0) return;
277
+ for (const id of sceneIds) identities.set(id, (identities.get(id) ?? 0) + 1);
278
+ arm(SETTLE_MS, true);
279
+ notify();
280
+ }
281
+
282
+ /** After a document change: redraw the sketches whose inputs moved, once
283
+ * the edits settle. */
284
+ function invalidateSketches(of: Doc3D): void {
285
+ const moved = [...entries.values()].some(
286
+ (entry) => entry.target.kind === "sketch" && entry.drawn !== null && identityOf(entry.target, of) !== entry.drawn,
287
+ );
288
+ if (!moved) return;
289
+ arm(SETTLE_MS, true);
290
+ notify();
291
+ }
292
+
293
+ function pump(): void {
294
+ if (running !== null || paused() || doc === null) return;
295
+ const still = stage();
296
+ for (const key of queue) {
297
+ queue.delete(key);
298
+ const entry = entries.get(key);
299
+ if (entry === undefined) continue;
300
+ const identity = identityOf(entry.target, doc);
301
+ if (identity === null) {
302
+ drop(key);
303
+ continue;
304
+ }
305
+ draw(still, doc, key, entry, identity);
306
+ return;
307
+ }
308
+ }
309
+
310
+ /** The document a picture is drawn from, its frame, and the code
311
+ * components to load first. */
312
+ function staged(target: Target, from: Doc3D): { doc: Doc3D; frame: number; load: readonly string[] } | null {
313
+ if (target.kind === "shot") {
314
+ const slice = sliceShotToScene(from, target.sceneId);
315
+ return slice === null ? null : { doc: slice, frame: target.frame, load: [] };
316
+ }
317
+ const found = sketchOf(from, target.partId, target.sketchId);
318
+ if (found === null) return null;
319
+ const load = sketchCodeComponents(from, found.sketch);
320
+ const length = Math.max(1, found.part.durationFrames);
321
+ return { doc: from, frame: Math.min(found.sketch.frame ?? 0, length - 1), load };
322
+ }
323
+
324
+ function draw(still: StillStage, from: Doc3D, key: string, entry: Entry, drawing: string): void {
325
+ const plan = staged(entry.target, from);
326
+ if (plan === null) {
327
+ drop(key);
328
+ return;
329
+ }
330
+ const size = storyboardStillSize(from.size);
331
+ const mine: Running = { key, controller: new AbortController() };
332
+ running = mine;
333
+ const bound = later(() => {
334
+ mine.stopped = "timeout";
335
+ mine.controller.abort();
336
+ }, STILL_READY_MS);
337
+ const target = entry.target;
338
+ // Non-null: `staged` just found the sketch in this very document.
339
+ const start = (): Promise<Blob> =>
340
+ still.capture(
341
+ target.kind === "sketch" ? sketchStageDoc(from, target.partId, target.sketchId, deps.sketchBinding)! : plan.doc,
342
+ plan.frame,
343
+ size.width,
344
+ size.height,
345
+ { format: "webp", background: true, signal: mine.controller.signal },
346
+ );
347
+ // A sketch's contracts load first, so its instances bind as a placed one
348
+ // would; it is staged only then, against the bindings that loaded.
349
+ const work =
350
+ plan.load.length === 0 || deps.loadContracts === undefined
351
+ ? start()
352
+ : deps.loadContracts(plan.load).catch(() => {}).then(start);
353
+ void work
354
+ .then(
355
+ (blob) => {
356
+ if (running !== mine || entries.get(key) !== entry) return;
357
+ if (doc === null || identityOf(target, doc) !== drawing) {
358
+ // An edit landed while it drew: drawn again once they settle.
359
+ queue.add(key);
360
+ return;
361
+ }
362
+ if (entry.url !== undefined) revokeUrl(entry.url);
363
+ entry.url = createUrl(blob);
364
+ entry.drawn = drawing;
365
+ delete entry.failed;
366
+ notify();
367
+ },
368
+ (error: unknown) => {
369
+ if (running !== mine || entries.get(key) !== entry) return;
370
+ if (mine.stopped === "paused" || stillYielded(error)) {
371
+ queue.add(key);
372
+ if (mine.stopped !== "paused") arm(YIELD_MS);
373
+ return;
374
+ }
375
+ const message =
376
+ mine.stopped === "timeout"
377
+ ? `the still took longer than ${STILL_READY_MS / 1000} s`
378
+ : error instanceof Error
379
+ ? error.message
380
+ : String(error);
381
+ entry.failed = { identity: drawing, message };
382
+ notify();
383
+ },
384
+ )
385
+ .finally(() => {
386
+ cancel(bound);
387
+ if (running !== mine) return;
388
+ running = null;
389
+ arm(0);
390
+ });
391
+ }
392
+
393
+ function pauseCheck(): void {
394
+ if (!paused()) {
395
+ if (queue.size > 0 && running === null) arm(0);
396
+ return;
397
+ }
398
+ if (running !== null && running.stopped === undefined) {
399
+ running.stopped = "paused";
400
+ running.controller.abort();
401
+ }
402
+ }
403
+
404
+ /** `target`'s picture, queueing a draw when it has none or an older one. */
405
+ function picture(target: Target, of: Doc3D): StillThumb | null {
406
+ const now = identityOf(target, of);
407
+ if (now === null) return null;
408
+ const key = keyOf(target, of);
409
+ let entry = entries.get(key);
410
+ if (entry === undefined) {
411
+ entry = { target, drawn: null };
412
+ } else {
413
+ entries.delete(key);
414
+ }
415
+ entries.set(key, entry);
416
+ for (const old of entries.keys()) {
417
+ if (entries.size <= maxEntries) break;
418
+ if (old !== key && old !== running?.key) drop(old);
419
+ }
420
+ const url = entry.url === undefined ? {} : { url: entry.url };
421
+ if (entry.url !== undefined && entry.drawn === now) return { status: "ready", url: entry.url };
422
+ if (entry.failed?.identity === now) return { status: "failed", message: entry.failed.message, ...url };
423
+ if (running?.key !== key && !queue.has(key)) {
424
+ queue.add(key);
425
+ arm(0);
426
+ }
427
+ return { status: "pending", ...url };
428
+ }
429
+
430
+ const unsubscribe = deps.store.subscribeCold(() => {
431
+ const next = deps.store.getState().doc;
432
+ if (next !== doc) {
433
+ const before = doc;
434
+ doc = next;
435
+ if (next === null || before === null || before.id !== next.id) {
436
+ clear();
437
+ notify();
438
+ } else {
439
+ invalidate(changedShots(before, next));
440
+ invalidateSketches(next);
441
+ }
442
+ }
443
+ pauseCheck();
444
+ });
445
+ const unwatchVisibility = onVisibilityChange(pauseCheck);
446
+
447
+ return {
448
+ thumb(sceneId, frame) {
449
+ return doc === null ? null : picture({ kind: "shot", sceneId, frame }, doc);
450
+ },
451
+ sketch(partId, sketchId) {
452
+ return doc === null ? null : picture({ kind: "sketch", partId, sketchId }, doc);
453
+ },
454
+ subscribe(listener) {
455
+ listeners.add(listener);
456
+ return () => listeners.delete(listener);
457
+ },
458
+ codeSaved(files) {
459
+ if (doc === null) return;
460
+ if (files.length === 0) allCode += 1;
461
+ for (const file of files) codeSaves.set(file, (codeSaves.get(file) ?? 0) + 1);
462
+ invalidate(shotsPlacing(doc, files));
463
+ invalidateSketches(doc);
464
+ },
465
+ dispose() {
466
+ unsubscribe();
467
+ unwatchVisibility();
468
+ if (timer !== null) cancel(timer);
469
+ timer = null;
470
+ clear();
471
+ listeners.clear();
472
+ },
473
+ };
474
+ }