@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,545 @@
1
+ /* The canvas bar: the docked row over the canvas cell, its pane groups, the way back, the zoom and the camera menu. */
2
+
3
+ /* ---- the canvas bar ----------------------------------------------------- */
4
+ /* One docked row along the top of the canvas cell (CanvasBar.tsx): the way
5
+ out, one group per pane on screen, then the stage's badges, a definition's
6
+ face switch and the zoom. It names the PLACE and how each pane is drawn;
7
+ the tools and the view track are the docked footer under the canvas.
8
+
9
+ ONE ROW, ALWAYS. `nowrap` turns the width into a real budget; a wrapped bar
10
+ grows downward over the picture. AND NO `overflow` on the bar: a clip is how
11
+ two menus once went silently dead. The bar has a give order instead (in
12
+ full below, with its measurements): the badges, the back label's cap, the
13
+ split's spare room, then, where the bar is crowded, the back label and the
14
+ zoom steps. No control shrinks, and no choice goes
15
+ (each dropped button stays on the View menu and its key), so the bar fits
16
+ the narrowest canvas `fitShell` makes at a 1024px window. Past the right
17
+ edge is the inspector, which paints over it.
18
+
19
+ Opaque and catching its own clicks: it is a docked cell, and a
20
+ `pointer-events: none` bar would hand every press in its empty half to the
21
+ stage iframe behind it.
22
+
23
+ Its padding and gap are named because the split arithmetic below reads
24
+ them: the camera group lands on the seam only if both are counted. The
25
+ padding is 12px a side, the tool footer's own (2026-10-13 design review:
26
+ Paper draws the bar at 14, off the spacing scale, and the footer at 12), so
27
+ the two docked rows of the canvas column start their controls on one line.
28
+ The bar is one `--panel-head-h` row (40) around 28px controls.
29
+ Every width in the give order below is the bar's CONTENT width, which is
30
+ what a container query measures: the bar less this padding a side. */
31
+ .control-strip {
32
+ --canvas-bar-pad: var(--space-6);
33
+ --canvas-bar-gap: var(--space-3);
34
+ /* A size container, for the narrow bar's give order below. The bar's width
35
+ is its grid track's, never its content's, so containment changes nothing
36
+ else, and every menu in it portals to the body. */
37
+ container: canvas-bar / inline-size;
38
+ grid-column: rail-r / insp-l;
39
+ grid-row: main-t / stage-t;
40
+ display: flex;
41
+ align-items: center;
42
+ flex-wrap: nowrap;
43
+ gap: var(--canvas-bar-gap);
44
+ padding: 0 var(--canvas-bar-pad);
45
+ background: var(--surface-panel);
46
+ border-bottom: 1px solid var(--line);
47
+ }
48
+
49
+ /* A MODE'S BAR: the way back and its own verbs, portalled in
50
+ (cellSlots.tsx). The slot is the whole row, laid out like the bar itself;
51
+ empty in the stage workspace, where it takes no room. */
52
+ .canvas-bar-mode {
53
+ display: flex;
54
+ align-items: center;
55
+ flex: 1;
56
+ gap: var(--canvas-bar-gap);
57
+ min-width: 0;
58
+ height: 100%;
59
+ }
60
+
61
+ .canvas-bar-mode:empty {
62
+ display: none;
63
+ }
64
+
65
+ /* THE PANELS MENU, last in every workspace (PanelToggles.tsx): one glyph and
66
+ a chevron that open the Layers / Timeline / Inspector checks (Paper 27, "7 ·
67
+ Canvas bar"). `flex: none`, because a control never shrinks. */
68
+ .panel-toggles {
69
+ display: flex;
70
+ align-items: center;
71
+ flex: none;
72
+ }
73
+
74
+ /* Wider than the bar's 28px square (`.control-strip .tool-button` below): it
75
+ carries the chevron too. The extra class outranks that rule on specificity,
76
+ not on source order. */
77
+ .control-strip .tool-button.panel-menu-trigger,
78
+ .panel-menu-trigger {
79
+ width: auto;
80
+ height: var(--control-h);
81
+ gap: var(--space-2);
82
+ padding: 0 var(--space-3);
83
+ border-radius: var(--radius-sm);
84
+ }
85
+
86
+ .panel-menu-trigger > svg {
87
+ width: 16px;
88
+ height: 16px;
89
+ flex: none;
90
+ }
91
+
92
+ .panel-menu-trigger.is-open {
93
+ background: var(--line);
94
+ }
95
+
96
+ .panel-menu-caret {
97
+ display: inline-flex;
98
+ color: var(--ink-2);
99
+ }
100
+
101
+ .panel-menu-caret svg {
102
+ width: 12px;
103
+ height: 12px;
104
+ display: block;
105
+ }
106
+
107
+ /* ONE CONTROL SIZE IN THE BAR: the house 28px. The pane triggers are
108
+ `.tool-button`s, whose base 36px square (tool-footer.css) is the menu row's;
109
+ here they are the bar's, the same 28px the docked footer draws. */
110
+ .control-strip .tool-button {
111
+ width: var(--control-h);
112
+ height: var(--control-h);
113
+ }
114
+
115
+ /* ---- the lead: the way out and the first pane ----------------------------- */
116
+ /* `flex: none`: it holds controls, and a control never shrinks. Empty at the
117
+ Project level in the camera layout, where it would otherwise cost one gap. */
118
+ .canvas-bar-lead {
119
+ display: flex;
120
+ align-items: center;
121
+ gap: var(--canvas-bar-gap);
122
+ flex: none;
123
+ }
124
+
125
+ .canvas-bar-lead:empty {
126
+ display: none;
127
+ }
128
+
129
+ /* THE SPLIT: the camera group starts ON THE SEAM, so each group sits over the
130
+ pane it acts on. `--split-x` is the seam in window coordinates (App writes
131
+ it on the shell); the bar's own left edge is the rail's track, or 0 with the
132
+ rail collapsed. The width is the room up to one gap short of the seam.
133
+
134
+ NO CONTROL IS EVER CLIPPED. The seam is where the camera group SHOULD start,
135
+ not a wall. Near the left end the lead never gets narrower than its own
136
+ controls (`min-width`), so it pushes the camera group right of the seam.
137
+ Near the right end, once the badges are gone, the lead gives up its spare
138
+ room (`flex-shrink`), so the camera group slides left before the zoom
139
+ slides under the inspector. */
140
+ .canvas-bar-lead.is-split {
141
+ --canvas-bar-x: var(--rail-w);
142
+ flex: 0 1 auto;
143
+ width: calc(var(--split-x) - var(--canvas-bar-x) - var(--canvas-bar-pad) - var(--canvas-bar-gap));
144
+ min-width: max-content;
145
+ }
146
+
147
+ .shell.is-rail-collapsed .canvas-bar-lead.is-split {
148
+ --canvas-bar-x: 0px;
149
+ }
150
+
151
+ /* ---- a pane's group -------------------------------------------------------- */
152
+ .canvas-pane {
153
+ display: flex;
154
+ align-items: center;
155
+ gap: var(--space-3);
156
+ flex: none;
157
+ }
158
+
159
+ /* The pane's word, from LAYOUT_SPECS. The pane the zoom and the fit address
160
+ (`activePane`) is in accent ink; the other is quiet. Two classes against
161
+ one, so the active colour wins on specificity and not on source order. */
162
+ .canvas-pane-word {
163
+ font-size: var(--type-md);
164
+ font-weight: var(--weight-semibold);
165
+ white-space: nowrap;
166
+ color: var(--ink-2);
167
+ }
168
+
169
+ .canvas-pane.is-active .canvas-pane-word {
170
+ color: var(--accent-ink);
171
+ }
172
+
173
+ /* A hairline between the way out and the first pane, the top bar's
174
+ `.header-sep` recipe. Only BETWEEN two things: at the Project level there is
175
+ no back chip, and the first group starts clean. */
176
+ .canvas-bar-lead > * + .canvas-pane::before,
177
+ .canvas-bar-lead:not(.is-split):not(:empty) + .canvas-pane::before {
178
+ content: "";
179
+ flex: none;
180
+ width: 1px;
181
+ height: 16px;
182
+ background: var(--line);
183
+ }
184
+
185
+ /* In the split the camera group starts on the seam when the bar has room, so
186
+ its hairline runs the bar's full height and carries the seam the stage
187
+ draws up through the bar. It never shrinks: the lead is the part that
188
+ gives. */
189
+ .canvas-bar-lead.is-split + .canvas-pane {
190
+ align-self: stretch;
191
+ padding-left: var(--space-3);
192
+ border-left: 1px solid var(--line);
193
+ }
194
+
195
+ /* ---- the stage's badges and the zoom, pushed right ------------------------- */
196
+ .stage-badges,
197
+ .zoom-controls {
198
+ display: flex;
199
+ align-items: center;
200
+ gap: var(--space-2);
201
+ }
202
+
203
+ /* THE BADGES ARE THE BAR'S SPRING. They take the room the controls leave
204
+ (`flex: 1 1 0`), which pushes the zoom to the end, and they are the first
205
+ thing to give. The row is one chip tall and clips, so a chip that does not
206
+ fit wraps onto a second line, out of sight. A badge goes whole: a half-cut
207
+ "60 fps" would read "0 fps". The empty `::before` starts every first line,
208
+ so even the first chip can wrap away (a flex line keeps its first item). */
209
+ .stage-badges {
210
+ flex: 1 1 0;
211
+ min-width: 0;
212
+ height: 22px;
213
+ flex-wrap: wrap;
214
+ justify-content: flex-end;
215
+ overflow: hidden;
216
+ }
217
+
218
+ .stage-badges::before {
219
+ content: "";
220
+ height: 100%;
221
+ }
222
+
223
+ /* The row's height is the chip's, from one number. */
224
+ .stage-badges .status-chip {
225
+ height: 100%;
226
+ }
227
+
228
+ /* ── THE GIVE ORDER, NARROWEST LAST ──────────────────────────────────────
229
+ 1. The badges wrap away (`.stage-badges`, the spring).
230
+ 2. Under 712px the back label caps at 120px (`.back-chip` below).
231
+ 3. In the split, the lead gives its spare room (`.canvas-bar-lead.is-split`)
232
+ and the camera group slides left of the seam.
233
+ 4. Under 656px, where the bar is crowded: the back chip keeps its chevron
234
+ and loses its label (the `aria-label` and `title` keep the
235
+ destination), and where the spline's Curve select is on screen the zoom
236
+ keeps its readout (the fit) and loses Zoom out / Zoom in, which stay on
237
+ the View menu, on their keys and on the wheel.
238
+
239
+ WHAT CROWDS THE BAR, measured in Chromium. Each width is the CONTENT the
240
+ bar needs with every control at its own width and the badges gone: the
241
+ controls and their gaps, the 12px padding a side not counted. The bar fits
242
+ from that content width up (its outer width is 24 more):
243
+ the Project, any layout 232 to 325
244
+ a shot: Camera 338, Video 304, 3D 304, split 396
245
+ a shot with the spline armed (the work plane, its plane and Curve
246
+ selects, adds 198 and is on screen only then):
247
+ 3D 502, split 594
248
+ So with the view track in the footer, one case outgrows the narrowest
249
+ bar `fitShell` makes (592px at a 1024px window, 568 of content): the
250
+ split with the spline armed. Step 4 is keyed on the Curve select beside
251
+ the plane select, and measured at a 592px bar (568 of content) it leaves:
252
+ the split, spline armed 594 - 31 - 72 (the steps) 491
253
+ 3D, spline armed 502 - 31 - 72 399
254
+ An open definition is not a case: it is the Components workspace, which
255
+ brings its own bar (modes/component.css).
256
+ Every other state keeps its label and its zoom steps at every width.
257
+
258
+ No choice goes at any width: every zoom step and way back stays one press
259
+ or one key away. The widths are the bar's own (`canvas-bar`), so a rail or
260
+ inspector drag gives exactly as a narrower window does. The state scopes
261
+ are `:has()` on the bar, read by descendants only (a container never
262
+ queries itself). */
263
+ @container canvas-bar (width < 656px) {
264
+ .control-strip:has(.work-plane-bar > .select + .select) .back-chip {
265
+ justify-content: center;
266
+ width: var(--control-h);
267
+ padding: 0;
268
+ }
269
+
270
+ .control-strip:has(.work-plane-bar > .select + .select) .back-chip .back-chip-label {
271
+ display: none;
272
+ }
273
+
274
+ .control-strip:has(.work-plane-bar > .select + .select) .zoom-controls .btn.is-icon {
275
+ display: none;
276
+ }
277
+
278
+ /* The isolation trail's levels between the shot and the current layer.
279
+ The shot crumb, the current layer and Done stay; Escape still climbs. */
280
+ .control-strip:has(.work-plane-bar > .select + .select) .iso-trail-step {
281
+ display: none;
282
+ }
283
+ }
284
+
285
+ .zoom-readout {
286
+ font-variant-numeric: var(--numeric);
287
+ min-width: 48px;
288
+ text-align: center;
289
+ }
290
+
291
+ /* ---- the way back ---------------------------------------------------------- */
292
+ /* First in the bar, where a back control goes in every editor that has one.
293
+ ACCENT INK: being inside something is a state, and the way out of a state
294
+ is signal rather than furniture. It is the one way back in the working
295
+ area; the timeline's corner only names where you are. */
296
+ .back-chip {
297
+ display: inline-flex;
298
+ align-items: center;
299
+ gap: var(--space-2);
300
+ height: var(--control-h);
301
+ max-width: 180px;
302
+ padding: 0 var(--space-3) 0 var(--space-1);
303
+ border: 0;
304
+ border-radius: var(--control-radius);
305
+ background: transparent;
306
+ font: inherit;
307
+ font-size: var(--type-md);
308
+ font-weight: var(--weight-medium);
309
+ white-space: nowrap;
310
+ overflow: hidden;
311
+ text-overflow: ellipsis;
312
+ color: var(--accent-ink);
313
+ cursor: pointer;
314
+ transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
315
+ }
316
+
317
+ .back-chip:hover {
318
+ color: var(--ink-1);
319
+ background: var(--fill-rest);
320
+ }
321
+
322
+ .back-chip:focus-visible {
323
+ outline: none;
324
+ box-shadow: var(--focus-ring);
325
+ }
326
+
327
+ .back-chip .tool-icon {
328
+ flex: none;
329
+ display: inline-flex;
330
+ }
331
+
332
+ /* The name gives, the chevron never does: a bare text node in a flex button
333
+ cannot ellipsize, so the label is its own box. */
334
+ .back-chip-label {
335
+ min-width: 0;
336
+ overflow: hidden;
337
+ text-overflow: ellipsis;
338
+ white-space: nowrap;
339
+ }
340
+
341
+ /* A NARROW BAR shortens the way back's label first. Inside a definition the
342
+ label is the shot's name, as long as an author makes it, and at the 180px
343
+ cap a definition's bar needs 697px of content (the give order above has the
344
+ sums). The cap holds it to 637 under 712, and step 4 takes the label whole
345
+ where even that does not fit. The cap is the give, so no control ever shrinks. */
346
+ @container canvas-bar (width < 712px) {
347
+ .back-chip {
348
+ max-width: 120px;
349
+ }
350
+
351
+ /* The isolation trail caps its crumbs the same way. */
352
+ .iso-crumb {
353
+ max-width: 96px;
354
+ }
355
+ }
356
+
357
+ .back-chip .tool-icon svg {
358
+ width: 14px;
359
+ height: 14px;
360
+ }
361
+
362
+ /* ---- the isolation trail --------------------------------------------------- */
363
+ /* In place of the back chip while isolated (IsolationTrail.tsx): the shot,
364
+ the levels above, the isolated layer, then Done. Ancestors are quiet ink,
365
+ the current level is full ink, and Done carries the accent the back chip
366
+ carries: the way out of a state is signal. */
367
+ .iso-trail {
368
+ display: flex;
369
+ align-items: center;
370
+ gap: var(--space-1);
371
+ flex: none;
372
+ }
373
+
374
+ /* A separator and the crumb after it, one box so the give can drop both. */
375
+ .iso-trail-step {
376
+ display: contents;
377
+ }
378
+
379
+ .iso-trail-sep {
380
+ flex: none;
381
+ display: inline-flex;
382
+ color: var(--ink-3);
383
+ }
384
+
385
+ .iso-trail-sep svg {
386
+ width: 12px;
387
+ height: 12px;
388
+ }
389
+
390
+ .iso-crumb {
391
+ display: inline-flex;
392
+ align-items: center;
393
+ gap: var(--space-2);
394
+ height: var(--control-h);
395
+ max-width: 140px;
396
+ padding: 0 var(--space-2);
397
+ border: 0;
398
+ border-radius: var(--control-radius);
399
+ background: transparent;
400
+ font: inherit;
401
+ font-size: var(--type-md);
402
+ font-weight: var(--weight-medium);
403
+ white-space: nowrap;
404
+ overflow: hidden;
405
+ text-overflow: ellipsis;
406
+ color: var(--ink-2);
407
+ cursor: pointer;
408
+ transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
409
+ }
410
+
411
+ button.iso-crumb:hover,
412
+ .iso-crumb.is-open {
413
+ color: var(--ink-1);
414
+ background: var(--fill-rest);
415
+ }
416
+
417
+ .iso-crumb:focus-visible {
418
+ outline: none;
419
+ box-shadow: var(--focus-ring);
420
+ }
421
+
422
+ .iso-crumb.is-current {
423
+ color: var(--ink-1);
424
+ font-weight: var(--weight-semibold);
425
+ cursor: default;
426
+ }
427
+
428
+ .iso-crumb-icon {
429
+ flex: none;
430
+ display: inline-flex;
431
+ color: var(--ink-2);
432
+ }
433
+
434
+ .iso-crumb-icon.is-component {
435
+ color: var(--accent-ink);
436
+ }
437
+
438
+ .iso-crumb-icon svg {
439
+ width: 14px;
440
+ height: 14px;
441
+ }
442
+
443
+ .iso-crumb-label {
444
+ min-width: 0;
445
+ overflow: hidden;
446
+ text-overflow: ellipsis;
447
+ }
448
+
449
+ .iso-offscreen {
450
+ flex: none;
451
+ margin-left: var(--space-1);
452
+ }
453
+
454
+ .iso-done {
455
+ flex: none;
456
+ color: var(--accent-ink);
457
+ }
458
+
459
+ /* ---- the working pane's controls ------------------------------------------- */
460
+ .shading-bar,
461
+ .camera-view-bar {
462
+ display: flex;
463
+ align-items: center;
464
+ }
465
+
466
+ /* The shading modes, in a `Popover` rather than a `.tool-flyout`. It portals
467
+ to <body>, and that is the point: `Popover` closes on an outside pointerdown
468
+ and on Escape, flips above the anchor when the window is too short below it,
469
+ and clamps itself off the left and right edges. `.tool-flyout` does none of
470
+ those — it can only be dismissed from inside itself.
471
+ `.popover` already paints the surface, radius and shadow, so this is the
472
+ flyout's LAYOUT only — the same 5px/2px rhythm as `.tool-flyout`, minus the
473
+ positioning and the panel the popover brings. */
474
+ .shading-menu {
475
+ display: flex;
476
+ flex-direction: column;
477
+ gap: var(--space-1);
478
+ padding: var(--pill-pad);
479
+ white-space: nowrap;
480
+ }
481
+
482
+ /* A menu row is a LABELLED row, so it sizes to its text — the same exception
483
+ `.tool-flyout .tool-button` makes, for the same reason: `.tool-button`'s
484
+ 36px square is for an icon strip, and a label inside one overflows its own
485
+ background. */
486
+ .shading-menu .tool-button {
487
+ width: auto;
488
+ min-width: 36px;
489
+ justify-content: flex-start;
490
+ gap: var(--space-4);
491
+ padding: 0 var(--space-5);
492
+ }
493
+
494
+ /* The construction plane and the curve basis are house `.select`s: the same
495
+ 28px pill as the rest of the bar, chevron lane included. */
496
+ .work-plane-bar {
497
+ display: flex;
498
+ align-items: center;
499
+ gap: var(--space-2);
500
+ }
501
+
502
+ /* ---- the camera menu ------------------------------------------------------- */
503
+ /* Armed follow is the GIZMO's yellow and not the accent: it is the same subject
504
+ as the frustum and the in-pane badge, and an accent wash here would say
505
+ "selected" about a mode.
506
+
507
+ `border`, not `border-color`: `.tool-button` carries `border: 0`, where
508
+ `border-color` paints nothing and the armed state would lose the outline the
509
+ wash is half of. The global `box-sizing: border-box` keeps the button
510
+ square with it. */
511
+ .camera-view-bar .tool-button.is-armed,
512
+ .camera-menu .tool-button.is-armed {
513
+ background: color-mix(in srgb, var(--frustum) 18%, transparent);
514
+ border: 1px solid color-mix(in srgb, var(--frustum) 50%, transparent);
515
+ color: var(--frustum);
516
+ }
517
+
518
+ /* The caption names the two cameras once, above the verbs. It WRAPS: the menu
519
+ inherits `.shading-menu`'s nowrap for its rows, and a sentence is not a row. */
520
+ .camera-menu-caption {
521
+ max-width: 280px;
522
+ margin-bottom: var(--space-2);
523
+ padding: var(--space-2) var(--space-5) var(--space-4);
524
+ border-bottom: 1px solid var(--line);
525
+ color: var(--ink-2);
526
+ font-size: var(--type-sm);
527
+ line-height: var(--leading-body);
528
+ white-space: normal;
529
+ }
530
+
531
+ .camera-menu .tool-button {
532
+ width: 100%;
533
+ }
534
+
535
+ .camera-menu .tool-button:disabled {
536
+ opacity: var(--opacity-disabled);
537
+ cursor: default;
538
+ }
539
+
540
+ .camera-menu-key {
541
+ margin-left: auto;
542
+ padding-left: var(--space-7);
543
+ color: var(--ink-2);
544
+ font-size: var(--type-sm);
545
+ }