@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,525 @@
1
+ /* The tool footer: the docked row under the canvas cell, the tool buttons, groups and flyouts, the shot's metadata and the view track. */
2
+
3
+ /* ---- the tool footer ---------------------------------------------------- */
4
+ /* THE TOOLS ARE DOCKED. They rode a floating pill over the bottom of the
5
+ picture; the Paper redesign gives them a row of their own under the canvas
6
+ cell, on the panel ground with a hairline on top, and nothing floats over
7
+ the stage any more. The row has two halves pushed apart: the tools (or, in
8
+ the Project context, the shot under the playhead) on the left and the view
9
+ track on the right (ToolFooter.tsx).
10
+
11
+ A GRID TRACK, NOT A MEASURED BOX. The row is `foot-t / main-b` in the
12
+ shell's grid (shell.css), so the footer follows every dock drag and
13
+ collapse with no arithmetic, and the canvas cell above it ends at its top
14
+ edge. The track is 0 until `.shell.has-tool-footer` opens it, and App mounts
15
+ this box in the same commit, so the two cannot disagree for a frame.
16
+
17
+ ON THE FLOAT TIER, not the panel tier, although it is docked: its flyouts
18
+ open UPWARD over the canvas cell, and they have to paint over the scrims
19
+ (`--z-scrim`) and the canvas cell's mode content, which sit above the panel
20
+ tier. A positioned box with a z-index is also what paints it above the
21
+ fixed stage iframe at all, which every docked cell needs.
22
+
23
+ It is one of the boxes `measureInset` reads (`insetPanels` in
24
+ App.tsx), so the stage frames the picture above it. */
25
+ .tool-footer {
26
+ grid-column: rail-r / insp-l;
27
+ grid-row: foot-t / main-b;
28
+ position: relative;
29
+ z-index: var(--z-float);
30
+ min-width: 0;
31
+ min-height: 0;
32
+ display: flex;
33
+ align-items: center;
34
+ justify-content: space-between;
35
+ /* The least air between the two halves when the row is full. */
36
+ gap: var(--space-7);
37
+ /* A size container, for the view track's give order (below). The footer's
38
+ width is its grid track's, never its content's, so containment changes
39
+ nothing else: the flyouts are absolutely positioned inside their own
40
+ anchors and the view menu portals to the body. */
41
+ container: tool-footer / inline-size;
42
+ /* THE ROW NEVER WRAPS, the canvas bar's rule and the canvas bar's reason:
43
+ the failure is vertical, and a second row is a row the track has no
44
+ height for. The view track gives way instead, and the tools never do
45
+ (the give order below). NO `overflow`: the flyouts hang out of the top of
46
+ this box, and a clip would cut them off (sourceHygiene pins both
47
+ halves). */
48
+ flex-wrap: nowrap;
49
+ /* Paper's 12px a side (2026-10-13 design review), which the canvas bar
50
+ shares so the column's two docked rows start on one line. The row is
51
+ `--tool-footer-h` (48) around 28px tools and the 28px view track. */
52
+ padding: 0 var(--space-6);
53
+ background: var(--surface-panel);
54
+ border-top: 1px solid var(--line);
55
+ }
56
+
57
+ /* NO SURFACE OF ITS OWN: the footer is the surface. A row inside it. */
58
+ .tool-dock {
59
+ display: flex;
60
+ align-items: center;
61
+ gap: var(--space-2);
62
+ }
63
+
64
+ /* 36px, not 32, and full-strength ink rather than --text-dim. This is the
65
+ BASE recipe, shared with the canvas bar's pane triggers and the menus that
66
+ drop off them (canvas.css), which size it for their own row. The footer
67
+ sizes it and inks it below. */
68
+ .tool-button {
69
+ display: inline-flex;
70
+ align-items: center;
71
+ justify-content: center;
72
+ width: 36px;
73
+ height: 36px;
74
+ font: inherit;
75
+ font-size: var(--type-lg);
76
+ color: var(--ink-1);
77
+ background: transparent;
78
+ border: 0;
79
+ border-radius: var(--radius-md);
80
+ cursor: pointer;
81
+ transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
82
+ }
83
+
84
+ /* THE FOOTER'S BUTTONS ARE THE HOUSE CONTROL: 28px squares with the small
85
+ radius and a 16px glyph, which is Paper's footer and the canvas bar's own
86
+ control size, so the two docked rows of the canvas column draw one control.
87
+ BEFORE `.is-labelled` and `.tool-flyout .tool-button`, which tie it on
88
+ specificity and must win their widths.
89
+
90
+ IDLE IS --ink-2, Paper's footer stroke: a row of nine full-ink glyphs read
91
+ as nine pressed controls, and the armed wash had nothing quiet to stand out
92
+ from. Hover, focus and an open menu lift to --ink-1 (below, and the base
93
+ hover), and the armed tool takes the accent ink.
94
+
95
+ BOTH COLOUR RULES ARE `:where()`-WRAPPED so they stay at this rule's
96
+ specificity, which `.is-armed` ties and beats by coming later: a plain
97
+ `:focus-visible` here would turn a focused armed tool back to ink. And the
98
+ idle dim skips the flyouts' rows, which are a MENU's labelled rows and read
99
+ at full ink like every other menu. */
100
+ .tool-footer .tool-button {
101
+ width: var(--control-h);
102
+ height: var(--control-h);
103
+ border-radius: var(--radius-xs);
104
+ }
105
+
106
+ .tool-footer .tool-button:where(:not(.tool-flyout *)) {
107
+ color: var(--ink-2);
108
+ }
109
+
110
+ .tool-footer .tool-button:where(:focus-visible, [aria-expanded="true"]) {
111
+ color: var(--ink-1);
112
+ }
113
+
114
+ .tool-footer .tool-icon svg {
115
+ width: 16px;
116
+ height: 16px;
117
+ }
118
+
119
+ .tool-button:hover:not(:disabled) {
120
+ background: var(--fill-rest);
121
+ color: var(--ink-1);
122
+ }
123
+
124
+ /* A tool the current layout cannot arm (see `toolRefusal`). Both halves matter:
125
+ the dim says it is dead, and `:not(:disabled)` on the hover above is what
126
+ stops it lifting under the pointer and promising otherwise. */
127
+ .tool-button:disabled {
128
+ opacity: var(--opacity-disabled);
129
+ cursor: default;
130
+ }
131
+
132
+ /* The armed tool is a soft accent wash, not a solid slab. A saturated fill on
133
+ a small button next to eight neutral ones reads as an error badge. */
134
+ .tool-button.is-armed {
135
+ background: var(--accent-soft);
136
+ color: var(--accent-ink);
137
+ }
138
+
139
+ /* Animate mode is a MODE, not a tool, so it gets the warm colour rather than
140
+ the accent — the whole point is that it does not look like an armed tool. */
141
+ .tool-button.tool-animate[aria-pressed="true"] {
142
+ background: color-mix(in srgb, var(--accent-warm) 16%, transparent);
143
+ color: var(--accent-warm);
144
+ }
145
+
146
+ /* A control that carries its own WORD. Animate is the one left: it is a MODE
147
+ rather than one of the mutually-exclusive tools, and a mode has to say so at
148
+ rest — an armed `⏺` among the glyphs said nothing. Add went back to a bare
149
+ icon with a caret, because a menu announces itself by opening. Auto width so
150
+ the label sizes it; the row's height is the footer's control height. */
151
+ .tool-button.is-labelled {
152
+ width: auto;
153
+ min-width: 36px;
154
+ gap: var(--space-3);
155
+ padding: 0 var(--space-4);
156
+ font-size: var(--type-md);
157
+ }
158
+
159
+ /* The word's glyph is 14px, Paper's Animate mark: a 16px record dot beside
160
+ the word outweighed it. After `.tool-footer .tool-icon svg`, which it must
161
+ beat. */
162
+ .tool-footer .tool-button.is-labelled .tool-icon svg {
163
+ width: 14px;
164
+ height: 14px;
165
+ }
166
+
167
+ /* ── THE DOCK IS GROUPS, NOT TEN BUTTONS ────────────────────────────────
168
+ A flat run of ten icons says every one of them is the same kind of thing,
169
+ and they are not: two of them say what a press MEANS (pick, move), six of
170
+ them make something, one is a menu and the last is a mode. The groups are
171
+ named for a screen reader and gapped as one run; the ONE rule, before the
172
+ mode, is Paper's footer (ToolDockBar.tsx). The grouping is data, see
173
+ `ToolSpec.group`, so a new tool joins a group rather than landing wherever
174
+ the JSX happened to put it. */
175
+ .tool-group {
176
+ display: flex;
177
+ align-items: center;
178
+ gap: var(--space-2);
179
+ }
180
+
181
+ /* Paper's rule: 1px by 20px, which is the 28px row less 4px each end. The
182
+ buttons either side carry their own air, so the margin is only the pixel
183
+ that keeps the rule off them. */
184
+ .tool-separator {
185
+ width: 1px;
186
+ align-self: stretch;
187
+ margin: var(--space-2) 1px;
188
+ background: var(--line);
189
+ }
190
+
191
+ /* A button that opens something as well as doing something: the shapes
192
+ trigger and Add. A corner triangle rather than a chevron beside the glyph,
193
+ which is the toolbar convention (Figma, Illustrator) and costs no width in
194
+ a row that has none to give. */
195
+ .tool-button.has-caret {
196
+ position: relative;
197
+ }
198
+
199
+ .tool-caret {
200
+ position: absolute;
201
+ right: 3px;
202
+ bottom: 3px;
203
+ width: 0;
204
+ height: 0;
205
+ border-left: 4px solid transparent;
206
+ border-bottom: 4px solid currentColor;
207
+ opacity: 0.55;
208
+ pointer-events: none;
209
+ }
210
+
211
+ .tool-flyout-anchor {
212
+ position: relative;
213
+ }
214
+
215
+ /* THE FLYOUT OPENS TOWARDS THE ROOM. The base rule is DOWNWARD, for an anchor
216
+ near the top of the window: an upward flyout there has ~64px of viewport
217
+ above it and the page cannot scroll, so every row past the first two sat
218
+ above y=0 and was unreachable by mouse. `.tool-footer` inverts it below.
219
+
220
+ The max-height + scroll is for a flyout whose row count is data-driven
221
+ (devices from the registry, components from the live library). */
222
+ .tool-flyout {
223
+ position: absolute;
224
+ top: calc(100% + 8px);
225
+ left: 0;
226
+ display: flex;
227
+ flex-direction: column;
228
+ gap: var(--space-1);
229
+ padding: var(--pill-pad);
230
+ border-radius: var(--radius-md);
231
+ white-space: nowrap;
232
+ z-index: 1;
233
+ max-height: calc(100vh - 140px);
234
+ overflow-y: auto;
235
+ }
236
+
237
+ /* ── AND UPWARD OUT OF THE FOOTER ──────────────────────────────────────────
238
+ The mirror of the rule above, and the same argument: open towards the room.
239
+ Under the footer is the timeline, so a menu that opens down is a menu drawn
240
+ over the dock. Up is the whole picture.
241
+
242
+ `top: auto` is not optional. `top` and `bottom` both set on an absolutely
243
+ positioned box stretches it between the two rather than letting the content
244
+ size it, so the flyout would be as tall as the viewport with its rows pinned
245
+ to the bottom of that box.
246
+
247
+ ── AND THE CAP IS MEASURED FROM THIS BAR, NOT FROM THE VIEWPORT ─────────
248
+ THE BUG THIS EXISTS TO STOP, caught in a browser and not by a test: the Add
249
+ menu's row count is data-driven (devices from the registry, 2D documents,
250
+ every component in the live library) and it renders 689px tall. Capped at
251
+ `100vh - 200px` it was ALLOWED to be 689px tall. And it opens upward from a
252
+ bar that is itself ~550px down the window, so its top landed at y=-141 and
253
+ the first rows were above the viewport with no way to scroll to them. That
254
+ is the same unreachable-menu failure the base rule above was written for,
255
+ arrived at from the opposite direction.
256
+
257
+ The room above this bar is the canvas cell: the window less the two bars,
258
+ the bottom row and this footer, all four of them real track sizes. Less
259
+ 32px of air: the flyout's 8px gap, and 24px so a full menu does not sit
260
+ flush against the canvas bar.
261
+
262
+ ── AND THE GAP IS FROM THE FOOTER'S EDGE, NOT THE TRIGGER'S ──────────────
263
+ The anchor is the 28px trigger, centred in the 48px row, so `100% + 8px`
264
+ alone ended the menu 2px INSIDE the footer, over its hairline and the row
265
+ it opened from. The half of the row the trigger leaves is added back, so
266
+ the menu ends 8px above the footer and lives wholly over the canvas cell,
267
+ where the cap above already assumes it is (dockedShellE2e pins it). The
268
+ folded view menu does the same sum from its 28px picker (ViewModeBar.tsx),
269
+ so every menu the footer opens ends on one line. */
270
+ .tool-footer .tool-flyout {
271
+ top: auto;
272
+ bottom: calc(100% + 8px + (var(--tool-footer-h) - var(--control-h)) / 2);
273
+ max-height: calc(100vh - var(--topbar-h) - var(--panel-head-h) - var(--dock-row-h) - var(--tool-footer-h) - 32px);
274
+ }
275
+
276
+ /* THE TOOLBAR ON TOP flips it back DOWN, over the canvas cell, which is now
277
+ below the footer. The same gap from the footer's edge and the same cap: the
278
+ room is still the canvas cell's height. */
279
+ .shell.tool-footer-top .tool-footer .tool-flyout {
280
+ top: calc(100% + 8px + (var(--tool-footer-h) - var(--control-h)) / 2);
281
+ bottom: auto;
282
+ }
283
+
284
+ /* The dock's SVG glyphs — CSS-sized like every other appearance of the set
285
+ (the icons.tsx rule: never by attributes). currentColor rides the button's
286
+ own states, so armed/disabled tint the icon for free. */
287
+ .tool-icon {
288
+ display: inline-flex;
289
+ align-items: center;
290
+ justify-content: center;
291
+ }
292
+ .tool-icon svg {
293
+ width: 18px;
294
+ height: 18px;
295
+ }
296
+
297
+ /* A flyout row is a LABELLED row, so it sizes to its text. The footer's 28px
298
+ square is for the dock's icon row, and a label inside one overflows its own
299
+ background. The 36px height is restated because `.tool-footer .tool-button`
300
+ ties this rule on specificity and would hand a menu row the icon row's
301
+ height. */
302
+ .tool-flyout .tool-button {
303
+ width: auto;
304
+ min-width: 36px;
305
+ height: 36px;
306
+ justify-content: flex-start;
307
+ gap: var(--space-4);
308
+ padding: 0 var(--space-5);
309
+ }
310
+
311
+ /* ---- the Project context's left half: the shot under the playhead ---------- */
312
+ /* Where the tools are inside a shot (ToolFooter.tsx): the shot's name over
313
+ its number, length and rate. Paper's two lines: the name at 13/18 and 600
314
+ in primary ink, the facts in mono 12/16 at 400 in secondary ink, 4px
315
+ apart. The block gives before the view track does: it is the one thing in
316
+ the row that can, and a long shot name ellipsizes rather than pushing the
317
+ track under the inspector. */
318
+ .shot-meta {
319
+ display: flex;
320
+ flex-direction: column;
321
+ gap: var(--space-2);
322
+ flex: 0 1 auto;
323
+ min-width: 0;
324
+ }
325
+
326
+ .shot-meta-name,
327
+ .shot-meta-line {
328
+ overflow: hidden;
329
+ text-overflow: ellipsis;
330
+ white-space: nowrap;
331
+ }
332
+
333
+ .shot-meta-name {
334
+ font-size: var(--type-lg);
335
+ line-height: var(--leading-sm);
336
+ font-weight: var(--weight-semibold);
337
+ color: var(--ink-1);
338
+ }
339
+
340
+ .shot-meta-line {
341
+ font-family: var(--font-mono);
342
+ font-size: var(--type-md);
343
+ line-height: var(--leading-xs);
344
+ font-weight: var(--weight-regular);
345
+ color: var(--ink-2);
346
+ }
347
+
348
+ /* ---- the view track: the footer's right half -------------------------------- */
349
+ /* 3D | Split | Camera, then the Clean view eye (ViewModeBar.tsx), 8px apart,
350
+ Paper's footer since the 2026-10-13 design review. The WRAPPER is only the
351
+ row: the layouts' `SegmentedControl` is the track, and the eye is a square
352
+ of its own on the same control ground. `margin-left: auto` keeps the row at
353
+ the right edge when the left half renders nothing (no shot under the
354
+ playhead).
355
+
356
+ The layouts are THE ONE SEGMENTED CONTROL (ui/widgets.css): the 28px
357
+ track on the control fill, 24px chips 2px apart, the flat lit tile and the
358
+ 2px accent focus ring all come from the house recipe. Only the chip width
359
+ is the footer's: each chip sits at its glyph and word, not an equal share.
360
+
361
+ Every rule is scoped by `.tool-footer`, so the canvas bar's and the
362
+ inspector's `.segmented` rules never meet these. */
363
+ .tool-footer .view-mode-bar {
364
+ display: flex;
365
+ align-items: center;
366
+ flex: none;
367
+ margin-left: auto;
368
+ gap: var(--space-4);
369
+ }
370
+
371
+ /* The track. `flex: none` overrides the house `flex: 1`, which is for the
372
+ inspector rows `.segmented` was drawn for. */
373
+ .tool-footer .view-mode-bar .segmented {
374
+ flex: none;
375
+ align-items: center;
376
+ }
377
+
378
+ /* A chip sized by its content: glyph and word 6px apart (the `.btn` gap),
379
+ 12px a side (the house chip). */
380
+ .tool-footer .view-mode-bar .segmented .segmented-item {
381
+ flex: none;
382
+ width: auto;
383
+ }
384
+
385
+ /* A GLYPH HAS TO BE GIVEN A SIZE. Every icon in this set is a bare
386
+ `svg viewBox`, sized by CSS or not at all; the pill once drew a switch here
387
+ as two 0x0 glyphs, correct, announced and invisible. 14px in the chips,
388
+ Paper's; the eye's is 16, below. */
389
+ .tool-footer .view-mode-bar .view-chip-icon {
390
+ display: inline-flex;
391
+ flex: none;
392
+ }
393
+
394
+ .tool-footer .view-mode-bar .view-chip-icon svg {
395
+ width: 14px;
396
+ height: 14px;
397
+ }
398
+
399
+ /* CLEAN VIEW: Paper's eye, a 28px square on the track's ground with the
400
+ field radius, the track's own box, so it reads as the track's neighbour and
401
+ not one of its chips.
402
+ Pressed is the armed tool's soft accent wash, the footer's one "on" look. */
403
+ .tool-footer .clean-view-toggle {
404
+ display: inline-flex;
405
+ align-items: center;
406
+ justify-content: center;
407
+ flex: none;
408
+ width: var(--control-h);
409
+ height: var(--control-h);
410
+ padding: 0;
411
+ border: 0;
412
+ border-radius: var(--field-radius);
413
+ background: var(--surface-secondary);
414
+ color: var(--ink-2);
415
+ cursor: pointer;
416
+ transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
417
+ }
418
+
419
+ .tool-footer .clean-view-toggle:hover {
420
+ background: var(--fill-rest);
421
+ color: var(--ink-1);
422
+ }
423
+
424
+ .tool-footer .clean-view-toggle:focus-visible {
425
+ outline: none;
426
+ box-shadow: var(--focus-ring);
427
+ }
428
+
429
+ .tool-footer .clean-view-toggle[aria-pressed="true"] {
430
+ background: var(--accent-soft);
431
+ color: var(--accent-ink);
432
+ }
433
+
434
+ .tool-footer .clean-view-toggle .view-chip-icon svg {
435
+ width: 16px;
436
+ height: 16px;
437
+ }
438
+
439
+ /* THE FOLDED TRACK: one labelled chip on the track's ground, naming the
440
+ layout on screen, with the three a press away. Hidden until the footer runs
441
+ short (below). Auto width, because `.tool-footer .tool-button` is the 28px
442
+ glyph square. Primary ink: it names the current state, as a lit chip does. */
443
+ .tool-footer .view-mode-bar .view-picker {
444
+ display: none;
445
+ width: auto;
446
+ height: var(--control-h);
447
+ padding: 0 var(--space-5);
448
+ gap: var(--space-3);
449
+ border-radius: var(--field-radius);
450
+ background: var(--surface-secondary);
451
+ font-size: var(--type-md);
452
+ color: var(--ink-1);
453
+ }
454
+
455
+ /* ── THE GIVE ORDER: FULL, THEN COMPACT, THEN FOLDED ────────────────────────
456
+ The tools never fold, and neither does the eye. The track is what gives,
457
+ in two steps:
458
+ 1. COMPACT: 3D and Camera drop their glyphs and keep their words; Split is
459
+ a word already.
460
+ 2. FOLDED: the track goes, and the one picker names the layout on screen,
461
+ the three a press away (its menu opens upward, over the canvas,
462
+ ViewModeBar.tsx).
463
+
464
+ Measured in Chromium (the widths are the widest case of each; the lit
465
+ chip is a flat tile and costs no width):
466
+ the tools row (ToolDockBar) 409.3 (377.3 + Comment)
467
+ the full track 205.7 (Split lit)
468
+ the compact track 165.7 (Split lit)
469
+ the folded picker on its ground 64.3 ("Camera")
470
+ the Clean view eye, after an 8px gap 36
471
+ the metadata block, "Shot 01 · 0:02 · 30 fps" 151.8 (its line)
472
+ Each sum below is the left half, the 16px gap, the track and the eye:
473
+ with the tools full fits from 667.0, compact from 627.0, folded from 525.6
474
+ with the shot full fits from 409.5, compact from 369.5
475
+ The thresholds round those up to the next 4px. They are the footer's
476
+ CONTENT width (a container query measures the content box), which is the
477
+ column less the footer's 12px padding a side:
478
+ window footer content with the tools in the Project
479
+ 1024 592 568 folded full
480
+ 1280 776 752 full full
481
+ 1366 862 838 full full
482
+ 1440 912 888 full full
483
+ 1600 1072 1048 full full
484
+ So the full track holds from a 1280 window in every layout, and only a
485
+ rail or inspector dragged wide compacts it there. At 1024, the narrowest
486
+ column `fitShell` makes, the folded row is 526 in 568, and the smallest
487
+ canvas a drag can reach (`CANVAS_MIN`, 640, 616 of content) folds it too.
488
+
489
+ The shot's metadata gives first and the track only after: the block
490
+ ellipsizes (`min-width: 0`), so in the Project the track compacts only once
491
+ the facts line could not show whole. The scopes are `:has()` on the footer,
492
+ read by its descendants (a container never queries itself). With neither
493
+ half on the left (no shot under the playhead) the track is alone and fits
494
+ any column `fitShell` makes. */
495
+ @container tool-footer (width < 668px) {
496
+ .tool-footer:has(.tool-dock) .view-mode-bar .layout-switch .view-chip-icon {
497
+ display: none;
498
+ }
499
+ }
500
+
501
+ @container tool-footer (width < 412px) {
502
+ .tool-footer:has(.shot-meta) .view-mode-bar .layout-switch .view-chip-icon {
503
+ display: none;
504
+ }
505
+ }
506
+
507
+ @container tool-footer (width < 628px) {
508
+ .tool-footer:has(.tool-dock) .view-mode-bar .segmented {
509
+ display: none;
510
+ }
511
+
512
+ .tool-footer:has(.tool-dock) .view-mode-bar .view-picker {
513
+ display: inline-flex;
514
+ }
515
+ }
516
+
517
+ @container tool-footer (width < 372px) {
518
+ .tool-footer:has(.shot-meta) .view-mode-bar .segmented {
519
+ display: none;
520
+ }
521
+
522
+ .tool-footer:has(.shot-meta) .view-mode-bar .view-picker {
523
+ display: inline-flex;
524
+ }
525
+ }