@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
@@ -5,28 +5,58 @@
5
5
  // would mean the panel could be showing the wrong tab for its own subject, and
6
6
  // the author would click a diamond and see nothing.
7
7
  //
8
- // The FRAME field is a master frame, like every other number about a marker, and
9
- // it is the only place in this chrome where one is typed rather than dragged.
10
- import { ColorPicker, InspectorRow, InspectorSection, NumberField, TextField } from "@dailies-studio/ui";
8
+ // The FRAME field is a master frame, like every other number about a marker. It
9
+ // is the only place in this chrome where one can be TYPED, and it drags through
10
+ // the same scrub bracket the lane's pin does, so both routes are one undo entry
11
+ // and both land the mark on the same integer.
12
+ import { ColorField, InspectorRow, InspectorSection, NumberField, TextField, useLocked } from "@dailies-studio/ui";
13
+ import { updateMarker } from "@dailies-studio/shot/doc";
14
+ import type { MarkerRef } from "@dailies-studio/shot/doc";
11
15
  import { useShotEditor, useStore } from "../../state/context.js";
12
16
  import { timecode } from "../timeline/model.js";
13
- import { NO_SCRUB } from "./useDocWrite.js";
17
+ import { useScrub } from "./useDocWrite.js";
14
18
 
15
19
  /** What a marker with no `color` is drawn in. The same value shotTokens.css
16
20
  * gives `--marker-pin`, restated here because the swatch needs a concrete
17
21
  * colour to show and a CSS variable is not one. */
18
22
  const DEFAULT_MARKER_COLOR = "#ffffff";
19
23
 
24
+ type MarkerPatch = Partial<Omit<MarkerRef, "id">>;
25
+
20
26
  export function MarkerSection() {
21
27
  const store = useStore();
22
28
  const doc = useShotEditor((s) => s.doc);
23
29
  const selected = useShotEditor((s) => s.selectedMarker);
30
+
31
+ // ONE bracket for both dragged fields, DECLARED BEFORE THE EARLY RETURNS,
32
+ // because a hook after a conditional return changes the hook count between
33
+ // renders.
34
+ // The widget sends the patch it is pointing at; the mark is re-read from the
35
+ // store at capture time rather than closed over from this render, which is
36
+ // the live read `useSelectionScrub` makes for the same reason.
37
+ const drag = useScrub((d, raw) => {
38
+ const id = store.getState().selectedMarker;
39
+ const patch = raw as MarkerPatch;
40
+ const at = id === null ? undefined : d.markers?.find((m) => m.id === id);
41
+ if (id === null || at === undefined) return d;
42
+ // `updateMarker` rebuilds the array unconditionally, so a capture landing
43
+ // where the mark already is would leave an undo entry for a drag that
44
+ // travelled nowhere, and the colour picker emits one on press, before the
45
+ // pointer has moved at all. Same guard `dragMarker` keeps in the store.
46
+ const same = Object.entries(patch).every(([k, v]) => (at as unknown as Record<string, unknown>)[k] === v);
47
+ return same ? d : updateMarker(d, id, patch);
48
+ });
49
+ const move = (patch: MarkerPatch): void => drag.move(patch);
50
+ // Delete is a plain button, so it reads a viewer's lock itself; the fields
51
+ // read it on their own.
52
+ const locked = useLocked();
53
+
24
54
  if (doc === null || selected === null) return null;
25
55
  const marker = (doc.markers ?? []).find((m) => m.id === selected);
26
56
  if (marker === undefined) return null;
27
57
 
28
58
  return (
29
- <InspectorSection title="Marker" persistKey="shot:marker" collapsible={false}>
59
+ <InspectorSection className="insp-object" title="Marker" persistKey="shot:marker" collapsible={false}>
30
60
  <InspectorRow label="Label">
31
61
  <TextField
32
62
  value={marker.label ?? ""}
@@ -41,22 +71,36 @@ export function MarkerSection() {
41
71
  ariaLabel="Marker frame"
42
72
  min={0}
43
73
  step={1}
74
+ onScrubStart={drag.start}
75
+ onScrub={(frame) => move({ frame: Math.max(0, Math.round(frame)) })}
76
+ onScrubEnd={drag.end}
44
77
  onCommit={(frame) => store.setMarker(marker.id, { frame: Math.max(0, Math.round(frame)) })}
45
78
  />
46
- <span className="insp-dim">{timecode(marker.frame, doc.fps)}</span>
79
+ </InspectorRow>
80
+ {/* THE SAME FRAME ON THE CLOCK, as its own readout row (`insp-readout`),
81
+ the Time section's shape: frames are what a marker is stored in, the
82
+ clock is what an author reads a cut against. It sat beside the field
83
+ as a 10px note, which narrowed the field and set a number in the
84
+ wrong face. */}
85
+ <InspectorRow label="Timecode" className="insp-readout">
86
+ <span className="insp-dim" data-testid="marker-timecode">
87
+ {timecode(marker.frame, doc.fps)}
88
+ </span>
47
89
  </InspectorRow>
48
90
  <InspectorRow label="Colour">
49
- <ColorPicker
91
+ <ColorField
50
92
  value={marker.color ?? DEFAULT_MARKER_COLOR}
51
93
  ariaLabel="Marker colour"
52
- scrub={NO_SCRUB}
94
+ scrub={{ start: drag.start, move: (color) => move({ color: String(color) }), end: drag.end }}
53
95
  commit={(color) => store.setMarker(marker.id, { color })}
54
96
  />
55
97
  </InspectorRow>
56
98
  <InspectorRow>
57
- <button type="button" className="btn" onClick={() => store.removeMarker(marker.id)}>
58
- Delete marker
59
- </button>
99
+ <div className="insp-buttons">
100
+ <button type="button" className="btn" disabled={locked} onClick={() => store.removeMarker(marker.id)}>
101
+ Delete marker
102
+ </button>
103
+ </div>
60
104
  </InspectorRow>
61
105
  </InspectorSection>
62
106
  );
@@ -1,69 +1,100 @@
1
- // One preset param, spec-driven. Shared by the motion-block panel and the
2
- // transition panel — both drive a `TransitionParamSpec`, and two copies of a
3
- // widget that turns a spec into a control is two places for "vec2 means two
4
- // fields" to be decided differently.
1
+ // One transition param, spec-driven: a `TransitionParamSpec` turned into the
2
+ // `PropRow` every ControlSpec surface draws (a component's props, code
3
+ // defaults, material parameters), so a transition's knobs look and behave like
4
+ // every other contract's: the name in the label column, the control across the
5
+ // rest, a bounded number as a field plus its slider.
5
6
  //
6
- // Written here rather than through `PropControl`, because that widget
7
- // dispatches a `ControlSpec` from @dailies-studio/contract and these are
8
- // `TransitionParamSpec`s — a deliberately smaller vocabulary of exactly three
9
- // kinds. Adapting the one into the other would be more code than the three
10
- // arms, and would put a lossy translation between the author and the value.
11
- import { InspectorRow, NumberField, Toggle } from "@dailies-studio/ui";
7
+ // ── WHY IT ADAPTS ONTO `PropControl` INSTEAD OF DISPATCHING ITSELF ─────
8
+ //
9
+ // It used to switch on the spec kind right here, on the argument that three
10
+ // arms cost less than a translation into `ControlSpec`. The argument was
11
+ // cheap and the bill was invisible: `PropControl` is where the drag-to-scrub
12
+ // route, the range slider and the searchable enum live, so a second dispatcher
13
+ // beside it does not stay merely smaller, it leaves every transition param
14
+ // permanently the poorer control.
15
+ //
16
+ // The adapter is total and lossless in the direction it runs: every
17
+ // `TransitionParamSpec` kind is a `ControlSpec` kind, carrying the same field
18
+ // names. Values come back through `resolveParams`, which is the lane's ONE
19
+ // param coercion path, for a commit and for every move of a drag alike: the
20
+ // inspector cannot invent a shape the stage, the exporter and the player would
21
+ // read differently.
22
+ import { PropRow } from "@dailies-studio/ui";
23
+ import type { ScrubHandlers } from "@dailies-studio/ui";
24
+ import { resolveParams } from "@dailies-studio/transitions";
12
25
  import type { TransitionParamSpec } from "@dailies-studio/transitions";
26
+ import { humanizeKey } from "@dailies-studio/contract";
27
+ import type { ControlSpec } from "@dailies-studio/contract";
13
28
  import type { Value, Vec2 } from "@dailies-studio/engine";
14
29
 
15
30
  export function ParamRow(props: {
16
31
  spec: TransitionParamSpec;
17
32
  value: Value;
18
33
  onCommit(next: Value): void;
34
+ /** The document scrub bracket for this param, so a drag previews on the
35
+ * stage under the pointer and is one undo entry. Its `move` is handed the
36
+ * COERCED value, as `onCommit` is. */
37
+ scrub: ScrubHandlers;
19
38
  }) {
20
- const { spec } = props;
21
- const label = spec.label ?? spec.name;
22
- const limits: { min?: number; max?: number } = {};
23
- if (spec.min !== undefined) limits.min = spec.min;
24
- if (spec.max !== undefined) limits.max = spec.max;
25
-
26
- if (spec.kind === "boolean") {
27
- return (
28
- <InspectorRow label={label}>
29
- <Toggle
30
- checked={props.value === true}
31
- ariaLabel={label}
32
- onChange={(next) => props.onCommit(next)}
33
- />
34
- </InspectorRow>
35
- );
36
- }
37
- if (spec.kind === "vec2") {
38
- const v = asVec2(props.value);
39
- return (
40
- <InspectorRow label={label}>
41
- {([0, 1] as const).map((i) => (
42
- <NumberField
43
- key={i}
44
- value={v[i]}
45
- ariaLabel={`${label} ${i === 0 ? "X" : "Y"}`}
46
- {...limits}
47
- step={spec.step ?? 0.01}
48
- onCommit={(next) => props.onCommit(i === 0 ? [next, v[1]] : [v[0], next])}
49
- />
50
- ))}
51
- </InspectorRow>
52
- );
53
- }
39
+ const { spec, onCommit, scrub } = props;
40
+ const coerce = (raw: unknown): Value => resolveParams([spec], () => raw as Value)[spec.name]!;
54
41
  return (
55
- <InspectorRow label={label}>
56
- <NumberField
57
- value={typeof props.value === "number" ? props.value : 0}
58
- ariaLabel={label}
59
- {...limits}
60
- step={spec.step ?? 0.01}
61
- onCommit={(next) => props.onCommit(next)}
62
- />
63
- </InspectorRow>
42
+ <PropRow
43
+ spec={toControlSpec(spec)}
44
+ value={props.value}
45
+ commit={(raw) => onCommit(coerce(raw))}
46
+ scrub={{ start: scrub.start, move: (raw) => scrub.move(coerce(raw)), end: scrub.end }}
47
+ // The param's name, which is its whole identity: a key in
48
+ // `transition.params`. A hook for tests and automation that does not
49
+ // depend on the words the row shows.
50
+ rowProps={{ "data-param": spec.name }}
51
+ // The one colour spelling this lane stores is `#rrggbb`, so the picker
52
+ // offers no alpha it would throw away: `resolveParams` refuses an
53
+ // 8-digit hex and puts the preset's default back.
54
+ {...(spec.kind === "color" ? { opaqueColor: true } : {})}
55
+ />
64
56
  );
65
57
  }
66
58
 
59
+ /**
60
+ * `TransitionParamSpec` -> the `ControlSpec` `PropControl` speaks.
61
+ *
62
+ * `key` and `propName` are both the param NAME because that is the only
63
+ * identity a transition param has: it is a key in `transition.params`, never a
64
+ * prop on a component. The label is the preset's own when it gives one, and
65
+ * otherwise the name humanized ("smoothness" reads "Smoothness"), never the
66
+ * raw key. Humanized HERE rather than left to `controlLabel`, because
67
+ * `humanizeKey` splits camelCase only, and a GL preset's names keep the
68
+ * shader's snake_case: "zoom_quickness" read "Zoom_quickness".
69
+ *
70
+ * `animatable: false` is the truth in this lane rather than a shrug. No track
71
+ * path reaches `transition.params`, so a param is a static field on the
72
+ * transition; and `Animatable` is only ever read by the contract hasher, which
73
+ * nothing on this path goes through.
74
+ */
75
+ function toControlSpec(spec: TransitionParamSpec): ControlSpec {
76
+ const base = {
77
+ key: spec.name,
78
+ propName: spec.name,
79
+ animatable: false as const,
80
+ label: spec.label ?? humanizeKey(spec.name.replace(/_/g, " ")),
81
+ };
82
+ if (spec.kind === "boolean") return { ...base, kind: "boolean", default: spec.default === true };
83
+ if (spec.kind === "color") {
84
+ return { ...base, kind: "color", default: typeof spec.default === "string" ? spec.default : "#ffffff" };
85
+ }
86
+ // A step only where the preset names one: absent, `PropControl` takes the
87
+ // range's own quantum for a bounded number and 0.01 for an open one.
88
+ const limits = {
89
+ ...(spec.step === undefined ? {} : { step: spec.step }),
90
+ ...(spec.min === undefined ? {} : { min: spec.min }),
91
+ ...(spec.max === undefined ? {} : { max: spec.max }),
92
+ };
93
+ return spec.kind === "vec2"
94
+ ? { ...base, kind: "vec2", default: asVec2(spec.default), ...limits }
95
+ : { ...base, kind: "number", default: typeof spec.default === "number" ? spec.default : 0, ...limits };
96
+ }
97
+
67
98
  function asVec2(v: Value): Vec2 {
68
99
  return Array.isArray(v) && typeof v[0] === "number" && typeof v[1] === "number"
69
100
  ? [v[0], v[1]]
@@ -0,0 +1,152 @@
1
+ // The right column of the docked shell: the inspector, or the agent in its
2
+ // place. The column is the grid cell and paints the ground; its occupant fills
3
+ // it. The cell stands even with no document open, so the stage never shows
4
+ // through an empty right column.
5
+ //
6
+ // The head is the column's, not an occupant's: it names which one is showing
7
+ // and switches between them, at the bar height, so its bottom edge is the
8
+ // canvas bar's and the left column's. The inspector's status footer
9
+ // (InspectorFooter) pins under it at the same height.
10
+ //
11
+ // ON THE BOARD, ONE LADDER (`boardRightPanel`): the agent, then comments, then
12
+ // the component sheet (S3) while one component card is
13
+ // selected, then the inspector when the selection names a task (a card, a
14
+ // gap, a cut), then Project assets while the author has them open (the +
15
+ // menu), or the Plan panel while one shot card is selected (Paper SB1).
16
+ // Otherwise the board has no right cell at all: App draws the column at 0 and
17
+ // the canvas runs to the window's edge. On a shot board the Plan panel is the
18
+ // panel at rest and the item inspector (`"sketch"`) the panel for a pick. The
19
+ // component sheet, the Plan panel and the item inspector bring their own 40
20
+ // head, so the column head steps aside for them.
21
+ //
22
+ // IN COMPONENTS, the same ladder: the agent, comments, then the open
23
+ // component's inspector. The home (no component open) has nothing to
24
+ // inspect, so the column is empty there too, and App draws it at 0.
25
+ //
26
+ // THE TABS: Brief | Inspector | Comments | Agent (S4, Paper page 20). Brief is
27
+ // the Studio's only (ShotBrief): what the board planned for the Shot under the
28
+ // playhead, and "Mark shot built". The board's own column is task-led and
29
+ // Components inspects a component, not a Shot, so neither has a Brief.
30
+ // Comments is the Project's threads (CommentsPanel), on the board or off it,
31
+ // gated by `can.comment`; its badge counts the open threads.
32
+ //
33
+ // THE VERSION HISTORY TAKES THE WHOLE COLUMN while it is open, head and all
34
+ // (File > Version history, Cmd+S). The agent stays mounted under it, hidden.
35
+ //
36
+ // ON DEMAND (app/lazySurfaces.tsx): the agent, Comments, the Version history
37
+ // and the board's three panels are chunks fetched the first time they show.
38
+ // The agent mounts at its first open and stays mounted from then on.
39
+ import { Activity } from "react";
40
+ import { LockedControls, SegmentedControl } from "@dailies-studio/ui";
41
+ import { agentGate, agentInEditor } from "../agent/agentGate.js";
42
+ import { InspectorFooter } from "./InspectorFooter.js";
43
+ import { InspectorPanel } from "./InspectorPanel.js";
44
+ import { BoardAssets } from "../files/AssetsTab.js";
45
+ import { useOpenHere } from "../comments/parts.js";
46
+ import { ShotBrief } from "../storyboard/ShotBrief.js";
47
+ import { useLatch } from "../../app/lazyPanel.js";
48
+ import {
49
+ AgentPanel,
50
+ CommentsPanel,
51
+ ComponentSheet,
52
+ PlanOccupant,
53
+ SketchInspector,
54
+ VersionHistoryPanel,
55
+ } from "../../app/lazySurfaces.js";
56
+ import { useShotEditor, useStore } from "../../state/context.js";
57
+ import { NO_COMMENT, boardRightPanel, workspaceOf } from "../../state/workspace.js";
58
+
59
+ export function RightColumn() {
60
+ const store = useStore();
61
+ const agentOpen = useShotEditor((s) => s.agentOpen);
62
+ const credentials = useShotEditor((s) => s.agentCredentials);
63
+ const probeError = useShotEditor((s) => s.agentCredentialsError);
64
+ const gate = agentGate(credentials, probeError);
65
+ const panel = useShotEditor(boardRightPanel);
66
+ const readOnly = useShotEditor((s) => s.readOnly);
67
+ const canComment = useShotEditor((s) => s.canComment);
68
+ const open = useOpenHere();
69
+ const onBoard = useShotEditor((s) => s.storyboardOpen);
70
+ const inComponents = useShotEditor((s) => workspaceOf(s) === "components");
71
+ const tab = agentOpen ? "agent" : panel === "comments" ? "comments" : panel === "brief" ? "brief" : "inspector";
72
+ const versionsOpen = useShotEditor((s) => s.versionsOpen);
73
+ // Never opened, never fetched: the agent's chunk waits for its first open.
74
+ const agentMounted = useLatch(agentOpen);
75
+ // Under the Version history the column's own occupants step aside.
76
+ const occupant = versionsOpen ? null : panel;
77
+ // These bring their own head (`.panel-head`), in place of the tabs.
78
+ const ownHead = occupant === "component" || occupant === "plan" || occupant === "sketch";
79
+ return (
80
+ // EMPTY only with no occupant (the board with nothing picked, the
81
+ // Components home): the canvas takes the width (S1), and the 0 wide
82
+ // column must not draw its seam.
83
+ <section className="inspector-column" data-empty={!versionsOpen && panel === null ? "" : undefined}>
84
+ {/* One slot, so the agent below keeps its place (and its state). */}
85
+ {versionsOpen ? (
86
+ <VersionHistoryPanel />
87
+ ) : ownHead ? null : (
88
+ <div className="panel-head column-head">
89
+ <SegmentedControl
90
+ ariaLabel="Right panel"
91
+ className="is-bar"
92
+ value={tab}
93
+ options={[
94
+ ...(onBoard || inComponents ? [] : [{ value: "brief", label: "Brief", testId: "right-tab-brief" }]),
95
+ { value: "inspector", label: "Inspector", testId: "right-tab-inspector" },
96
+ {
97
+ value: "comments",
98
+ label: (
99
+ <>
100
+ Comments
101
+ {open > 0 ? <span className="column-tab-count">{open}</span> : null}
102
+ </>
103
+ ),
104
+ title: canComment ? "Comments" : NO_COMMENT,
105
+ disabled: !canComment && tab !== "comments",
106
+ testId: "right-tab-comments",
107
+ },
108
+ ...(agentInEditor()
109
+ ? [
110
+ {
111
+ value: "agent",
112
+ label: "Agent",
113
+ title: gate.title,
114
+ // Never disabled while it is the open tab: a selected segment
115
+ // that cannot take focus leaves the group unreachable by keyboard.
116
+ disabled: !gate.ready && !agentOpen,
117
+ testId: "right-tab-agent",
118
+ },
119
+ ]
120
+ : []),
121
+ ]}
122
+ onChange={(next) => store.setRightTab(next as typeof tab)}
123
+ />
124
+ </div>
125
+ )}
126
+ {/* The agent stays mounted while the inspector shows, hidden with its
127
+ effects stopped, so a trip to the other tab keeps the unsent prompt.
128
+ The inspector remounts: its sections play no entrance on a mount. */}
129
+ {agentMounted ? (
130
+ <Activity mode={agentOpen && !versionsOpen ? "visible" : "hidden"}>
131
+ <AgentPanel />
132
+ </Activity>
133
+ ) : null}
134
+ {occupant === "comments" ? <CommentsPanel /> : null}
135
+ {occupant === "brief" ? <ShotBrief /> : null}
136
+ {/* A VIEWER reads every row: each field shows its own locked state.
137
+ Section folds and the head's navigation stay live. */}
138
+ {occupant === "inspector" ? (
139
+ <LockedControls value={readOnly}>
140
+ <InspectorPanel />
141
+ </LockedControls>
142
+ ) : null}
143
+ {/* The inspector's footer, not the column's: the agent pins its own
144
+ composer to the bottom and has no container to report. */}
145
+ {occupant === "inspector" ? <InspectorFooter /> : null}
146
+ {occupant === "component" ? <ComponentSheet /> : null}
147
+ {occupant === "plan" ? <PlanOccupant /> : null}
148
+ {occupant === "sketch" ? <SketchInspector /> : null}
149
+ {occupant === "assets" ? <BoardAssets /> : null}
150
+ </section>
151
+ );
152
+ }