@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
package/src/tools.ts CHANGED
@@ -12,8 +12,8 @@
12
12
  // an edit MEANS, not what a drag DOES. As a member of this union every arm of
13
13
  // every switch would have to answer "and what does select do while animate is
14
14
  // armed?", which has no answer. It is `animateMode: boolean`, toggled by ⇧A,
15
- // and it is the one bit that decides whether a gesture writes base or authors a
16
- // block.
15
+ // and it is the one bit that decides whether a gesture writes base or records
16
+ // keyframes.
17
17
  //
18
18
  // ── THE `shift` FIELD, WHICH THE 2D LANE'S TABLE DOES NOT HAVE ──────────
19
19
  //
@@ -25,14 +25,24 @@
25
25
  /** Every tool that changes what a canvas press does. */
26
26
  export type ShotTool =
27
27
  | "select"
28
- | "move"
29
28
  | "text"
30
29
  | "image"
31
30
  | "rect"
32
31
  | "ellipse"
33
32
  | "line"
34
33
  | "arrow"
35
- | "path";
34
+ | "path"
35
+ | "spline";
36
+
37
+ /** The pane a tool can author in. `any` is reserved for non-creating tools. */
38
+ export type ToolPane = "any" | "camera" | "working";
39
+
40
+ /** The pointer grammar owned by a tool. */
41
+ export type ToolGesture = "none" | "box" | "points-2d" | "points-3d";
42
+
43
+ /** What a press with the tool is FOR: `pick` addresses what is already there,
44
+ * `draw` makes something new. The dock's rules are drawn on this boundary. */
45
+ export type ToolGroup = "pick" | "draw";
36
46
 
37
47
  export interface ToolSpec {
38
48
  label: string;
@@ -49,8 +59,25 @@ export interface ToolSpec {
49
59
  /** "dock" is the toolbar's own row; "flyout" is reached through the shape
50
60
  * button. Six buttons in a row is a row; ten is a different object. */
51
61
  surface: "dock" | "flyout";
52
- /** Does a press-drag-release with this tool INSERT a layer? False for select
53
- * (which picks) and move (which drags). */
62
+ /** The pane that can fulfil the tool's promise. `camera` means the FRAME:
63
+ * the camera pane over a Shot, and an open definition's one pane, which is
64
+ * its frame (`toolAcceptsPane`). */
65
+ pane: ToolPane;
66
+ /**
67
+ * Which run of the dock the button joins, and the rule beside it.
68
+ *
69
+ * IN THE TABLE and not in the JSX, for the reason every other field is here:
70
+ * `as const satisfies Record<ShotTool, ToolSpec>` below makes a row without a
71
+ * group a COMPILE ERROR, so a new tool has to answer "does a press with this
72
+ * pick something or make something" in the same place it answers what letter
73
+ * arms it. A JSX-side list of names would answer it silently — by dropping
74
+ * the button out of both groups.
75
+ */
76
+ group: ToolGroup;
77
+ /** The gesture grammar the stage routes for the tool. */
78
+ gesture: ToolGesture;
79
+ /** Does a press-drag-release with this tool INSERT a layer? False for select,
80
+ * which picks and drags. */
54
81
  draws: boolean;
55
82
  /** The CSS cursor while this tool is armed. A row here rather than a default
56
83
  * in the stage means a new tool has to answer "what does the pointer look
@@ -64,29 +91,33 @@ export interface ToolSpec {
64
91
  * The flyout rows sit beside the button they fly out of.
65
92
  */
66
93
  export const TOOL_SPECS = {
67
- select: { label: "Select", key: "v", surface: "dock", draws: false, cursor: "default" },
68
- // The flat-plane move. It is a TOOL and not a modifier because the plane it
69
- // unprojects onto is the whole difference between it and select — see
70
- // stage/interactions/move.ts.
71
- move: { label: "Move", key: "g", surface: "dock", draws: false, cursor: "move" },
94
+ // Select also moves. A drag slides the layer along its own plane, and an
95
+ // Alt-drag keeps it flat to the frame (stage/interactions/move.ts). There is
96
+ // no separate Move tool: G is the working pane's modal grab.
97
+ select: { label: "Select", key: "v", surface: "dock", pane: "any", group: "pick", gesture: "none", draws: false, cursor: "default" },
72
98
  // `draws: true` and a text cursor are not in tension: the box IS drawn, and
73
99
  // what the author gets for it is somewhere to type.
74
- text: { label: "Text", key: "t", surface: "dock", draws: true, cursor: "text" },
75
- // "Frame" and not "Image": the box the author draws takes an image OR a
100
+ text: { label: "Text", key: "t", surface: "dock", pane: "camera", group: "draw", gesture: "box", draws: true, cursor: "text" },
101
+ // "Media" and not "Image": the box the author draws takes an image OR a
76
102
  // video, and the server's sniff of the file they pick decides which layer
77
- // kind it becomes. The tool ID stays `image` because it is a persisted
78
- // vocabulary — the bridge, the keymap and the insert map all key on it — and
79
- // renaming a wire word to fix a button's caption is a schema break for a
80
- // string nobody sees.
81
- image: { label: "Frame", key: "i", surface: "dock", draws: true, cursor: "crosshair" },
82
- rect: { label: "Rect", key: "r", surface: "dock", draws: true, cursor: "crosshair" },
83
- ellipse: { label: "Ellipse", key: "o", surface: "flyout", draws: true, cursor: "crosshair" },
84
- line: { label: "Line", key: "l", surface: "flyout", draws: true, cursor: "crosshair" },
85
- arrow: { label: "Arrow", key: "l", shift: true, surface: "flyout", draws: true, cursor: "crosshair" },
103
+ // kind it becomes. It was "Frame", which is worse than vague — it is Figma's
104
+ // word for an ARTBOARD, so on a box that holds a file it is a false friend,
105
+ // and this editor has real frames (the timeline's) that it is not about. The
106
+ // tool ID stays `image` because it is a persisted vocabulary — the bridge,
107
+ // the keymap and the insert map all key on it — and renaming a wire word to
108
+ // fix a button's caption is a schema break for a string nobody sees.
109
+ image: { label: "Media", key: "i", surface: "dock", pane: "camera", group: "draw", gesture: "box", draws: true, cursor: "crosshair" },
110
+ rect: { label: "Rect", key: "r", surface: "dock", pane: "camera", group: "draw", gesture: "box", draws: true, cursor: "crosshair" },
111
+ ellipse: { label: "Ellipse", key: "o", surface: "flyout", pane: "camera", group: "draw", gesture: "box", draws: true, cursor: "crosshair" },
112
+ line: { label: "Line", key: "l", surface: "flyout", pane: "camera", group: "draw", gesture: "box", draws: true, cursor: "crosshair" },
113
+ arrow: { label: "Arrow", key: "l", shift: true, surface: "flyout", pane: "camera", group: "draw", gesture: "box", draws: true, cursor: "crosshair" },
86
114
  // The pen takes no drag at all and still shows the crosshair: what the cursor
87
115
  // announces is "a press here authors geometry", which is true of every press
88
116
  // it takes, not "a drag is about to start".
89
- path: { label: "Pen", key: "p", surface: "dock", draws: false, cursor: "crosshair" },
117
+ path: { label: "Pen", key: "p", surface: "dock", pane: "camera", group: "draw", gesture: "points-2d", draws: false, cursor: "crosshair" },
118
+ // A distinct working-pane tool. The 2D Pen keeps P; Shift+P authors points
119
+ // on the active 3D work plane and commits a mesh spline.
120
+ spline: { label: "Spline", key: "p", shift: true, surface: "dock", pane: "working", group: "draw", gesture: "points-3d", draws: false, cursor: "crosshair" },
90
121
  // NO `cut` ROW. It armed a crosshair and did nothing at all: the stage's
91
122
  // pointer lane has no branch for it, and ⌘B is the real split-at-playhead.
92
123
  // Deleting it is compile-checked by the `satisfies` below, and it frees `C`.
@@ -131,6 +162,9 @@ export type DrawTool = {
131
162
  */
132
163
  export type InsertTool = DrawTool | "path";
133
164
 
165
+ /** Every tool that creates a document layer, including the 3D spline lane. */
166
+ export type CreatingTool = InsertTool | "spline";
167
+
134
168
  /** The tools with a button in the dock's own row. The dock's icon map is keyed
135
169
  * on it, so a new dock tool without a glyph is a compile error. */
136
170
  export type DockTool = {
@@ -149,12 +183,63 @@ export function isDrawTool(tool: ShotTool): tool is DrawTool {
149
183
  return TOOL_SPECS[tool].draws;
150
184
  }
151
185
 
186
+ /**
187
+ * `InsertTool` as a RUNTIME test, which is what "does this tool need the camera
188
+ * pane" costs everywhere it is asked.
189
+ *
190
+ * Creating tools have an explicit pane in the table. Box tools and the 2D pen
191
+ * author on the frame (the camera pane over a Shot, a definition's one pane
192
+ * inside it); the 3D spline tool authors in the working pane.
193
+ * Three surfaces have to agree about that metadata (the dock, the keymap and
194
+ * the stage), rather than each carrying a hand-written creator list.
195
+ *
196
+ * A mapped type is not a value, so the `"path"` arm is written twice — once in
197
+ * the union above and once here. test/toolSurface.test.ts pins them together.
198
+ */
199
+ export function isInsertTool(tool: ShotTool): tool is CreatingTool {
200
+ return TOOL_SPECS[tool].gesture !== "none";
201
+ }
202
+
203
+ /**
204
+ * Does this tool accept input in this pane?
205
+ *
206
+ * `framePane` is the pane the frame is edited through: the camera pane over a
207
+ * Shot (the default), and inside a definition its one pane, the working one.
208
+ * A camera-pane tool draws on the frame, so it acts wherever the frame is.
209
+ * Null where no pane is a frame anything can be drawn into.
210
+ */
211
+ export function toolAcceptsPane(
212
+ tool: ShotTool,
213
+ pane: "camera" | "working",
214
+ framePane: "camera" | "working" | null = "camera",
215
+ ): boolean {
216
+ const target = specOf(tool).pane;
217
+ return target === "any" || target === pane || (target === "camera" && pane === framePane);
218
+ }
219
+
152
220
  const isDockTool = (tool: ShotTool): tool is DockTool => TOOL_SPECS[tool].surface === "dock";
153
221
  const isFlyoutTool = (tool: ShotTool): tool is FlyoutTool => TOOL_SPECS[tool].surface === "flyout";
154
222
 
155
223
  export const DOCK_TOOLS: readonly DockTool[] = SHOT_TOOLS.filter(isDockTool);
156
224
  export const FLYOUT_TOOLS: readonly FlyoutTool[] = SHOT_TOOLS.filter(isFlyoutTool);
157
225
 
226
+ /**
227
+ * The dock's row as the RULED GROUPS it is drawn in, in dock order inside each
228
+ * group and in group order between them.
229
+ *
230
+ * Derived here rather than filtered inline in the JSX, for the same reason
231
+ * `DOCK_TOOLS` is: the toolbar renders what the table says, so regrouping a
232
+ * tool is a one-word edit to its row and the group's `aria-label` cannot drift
233
+ * away from the set of buttons it actually wraps. The label is the group's own
234
+ * word, title-cased once, because that is what the screen reader is given.
235
+ */
236
+ const inGroup = (group: ToolGroup): readonly DockTool[] => DOCK_TOOLS.filter((t) => TOOL_SPECS[t].group === group);
237
+
238
+ export const DOCK_GROUPS: readonly { label: string; tools: readonly DockTool[] }[] = [
239
+ { label: "Pick", tools: inGroup("pick") },
240
+ { label: "Draw", tools: inGroup("draw") },
241
+ ];
242
+
158
243
  /** Keyed on `${letter}${shift ? "+" : ""}` so `l` and `l+` are different
159
244
  * entries rather than one entry with a branch beside it. */
160
245
  const TOOL_BY_KEY: ReadonlyMap<string, ShotTool> = new Map(
@@ -1 +0,0 @@
1
- .agent-panel{position:relative;display:flex;flex-direction:column;height:100%;min-width:0}.agent-title{display:flex;align-items:center;gap:6px}.agent-title-label{flex:none}.agent-models{display:flex;gap:2px;flex:1;min-width:0}.agent-setup{padding:8px;border-bottom:1px solid var(--border);flex:none;display:flex;flex-direction:column;gap:6px}.agent-setup-blurb{margin:0;color:var(--text-2);font-size:12px;line-height:1.5}.agent-setup-row{display:flex;gap:4px}.agent-key-input{flex:1;min-width:0;background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-1);padding:4px 6px;font:var(--mono)}.agent-transcript{flex:1;min-height:0;overflow-y:auto;padding:8px;display:flex;flex-direction:column;gap:6px}.agent-msg{border-radius:var(--radius);padding:5px 8px;font-size:12px;line-height:1.5;white-space:pre-wrap;overflow-wrap:anywhere}.agent-msg-user{background:var(--accent-soft);color:var(--text-1);align-self:flex-end;max-width:90%}.agent-msg-assistant{background:var(--bg-2);color:var(--text-1)}.agent-msg-error{background:var(--bg-2);color:var(--danger)}.agent-msg-info{color:var(--text-3);font-style:italic}.agent-tool{color:var(--text-3);font:var(--mono);font-size:11px;padding-left:8px}.agent-tool:before{content:"⚙ "}.agent-thinking{animation:agent-pulse 1.2s ease-in-out infinite}@keyframes agent-pulse{50%{opacity:.4}}.agent-card{border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-1);overflow:hidden;flex:none}.agent-card-applied{border-color:var(--accent)}.agent-card-head{display:flex;align-items:center;gap:6px;padding:4px 6px;border-bottom:1px solid var(--border);background:var(--bg-2)}.agent-card-path{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-1)}.agent-card:not(.agent-card-canvas) .agent-card-path{font:var(--mono)}.agent-card-status{flex:none;font-size:11px;text-transform:uppercase;letter-spacing:.04em}.agent-card-status.is-applied{color:var(--accent)}.agent-card-status.is-stale,.agent-card-status.is-failed{color:var(--danger)}.agent-card-status.is-applying{color:var(--text-2)}.agent-card-meta{display:flex;align-items:center;flex-wrap:wrap;gap:4px;padding:4px 8px;font-size:11px;color:var(--text-3)}.agent-card-doc{color:var(--text-2);font:var(--mono);font-size:11px}.agent-card-count:before{content:"· "}.agent-tree{margin:0;padding:4px 0;max-height:260px;overflow:auto;font:var(--mono);font-size:11px;line-height:1.45;color:var(--text-2)}.agent-tree-line{padding:0 8px;white-space:pre}.agent-diff{margin:0;padding:4px 0;max-height:260px;overflow:auto;font:var(--mono);font-size:11px;line-height:1.45}.agent-diff>div{padding:0 8px;white-space:pre}.agent-diff-add{background:#40a06029;color:#7fd79f}.agent-diff-del{background:#c8484824;color:#e79a9a}.agent-diff-hunk{color:var(--text-3)}.agent-diff-ctx{color:var(--text-2)}.agent-card-note{padding:4px 8px;color:var(--text-3);font-size:11px}.agent-card-error{margin:0;white-space:normal}.agent-card-warning{color:var(--warn, #e0a33e);white-space:normal}.agent-strip{flex:none;display:flex;align-items:center;gap:8px}.agent-strip-msg{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-cost{flex:none;padding:2px 8px;color:var(--text-3);font-size:11px;text-align:right}.agent-composer{display:flex;align-items:flex-end;gap:4px;padding:8px;border-top:1px solid var(--border);flex:none;flex-wrap:wrap}.agent-pin{flex:0 0 100%;color:var(--text-3);font-size:11px}.agent-input{flex:1;min-width:0;resize:none;background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-1);padding:5px 7px;font:inherit;font-size:12px;line-height:1.4}.agent-input:focus{outline:1px solid var(--accent)}:root{--bg-0: #0b0b0d;--bg-1: #141417;--bg-2: #1d1d21;--bg-3: #27272d;--border: #28282e;--border-strong: #3a3a42;--text-1: #f0f0f4;--text-2: #a4a4af;--text-3: #6e6e7a;--accent: #f43f5e;--accent-soft: #f43f5e33;--kf: #e8c34a;--spring: #a3e635;--warn: #ffb454;--danger: #ff5c69;--danger-bg: #2a1518;--danger-border: #5c2a31;--space-0: 0;--space-1: 2px;--space-2: 4px;--space-3: 6px;--space-4: 8px;--space-5: 10px;--space-6: 12px;--space-7: 16px;--space-8: 24px;--radius-sm: 6px;--radius-md: 8px;--radius-lg: 10px;--radius-xl: 16px;--radius: var(--radius-md);--control-radius: var(--radius-lg);--text-2xs: 9px;--text-xs: 10px;--text-sm: 11px;--text-md: 12px;--text-lg: 13px;--weight-regular: 400;--weight-medium: 500;--weight-semibold: 600;--tracking-caps: .05em;--font: 12px/1.45 system-ui, "Segoe UI", sans-serif;--mono: 11px/1.4 ui-monospace, Consolas, monospace;--control-h: 28px;--row-h: 28px;--section-header-h: 32px;--label-w: 64px;--slider-fill: color-mix(in srgb, var(--accent) 24%, transparent);--slider-thumb: var(--accent);--shadow-1: 0 1px 2px #0006;--shadow-2: 0 4px 12px #0008;--shadow-popover: 0 8px 28px -4px #000a, 0 2px 6px #0007;--ring-width: 2px;--ring-color: var(--accent-soft);--focus-ring: 0 0 0 var(--ring-width) var(--ring-color);--dur-fast: 80ms;--dur-med: .14s;--ease: cubic-bezier(.2, 0, 0, 1);--z-panel: 2;--z-dock: 3;--z-overlay: 10;--z-menu: 1000;--z-dialog: 1100;--panel-radius: var(--radius-xl);--panel-shadow: 0 8px 32px -8px #000c, 0 2px 8px #0008;--panel-bg: color-mix(in srgb, var(--bg-1) 92%, transparent);--panel-blur: 12px;--panel-gutter: var(--space-4);--dock-h-default: 240px;--dock-h-min: 120px;--dock-h-collapsed: 0px;--panel-w-left: 248px;--panel-w-inspector: 300px;--resize-hit: 6px;--canvas-bg: #0f0f11;--stage-guide: #ff9f2e;--stage-ruler-guide: #19b9d4;--stage-draw: #33c27f;--stage-selection: var(--accent);--stage-selection-soft: color-mix(in srgb, var(--accent) 55%, transparent);--stage-selection-fill: color-mix(in srgb, var(--accent) 8%, transparent);--stage-draw-fill: color-mix(in srgb, var(--stage-draw) 8%, transparent);--stage-handle: var(--text-1);--stage-artboard-shadow: 0 2px 16px #0006;--surface-app: var(--bg-0);--surface-panel: var(--bg-1);--surface-inset: var(--bg-2);--surface-hover: var(--bg-3);--control-bg: var(--bg-2);--control-bg-hover: var(--bg-3);--control-border: var(--border);--control-border-hover: var(--border-strong);--control-border-focus: var(--accent);--text-primary: var(--text-1);--text-secondary: var(--text-2);--text-tertiary: var(--text-3);--divider: var(--border);--divider-strong: var(--border-strong)}:root[data-theme=light]{--bg-0: #f5f5f7;--bg-1: #ffffff;--bg-2: #f0f0f3;--bg-3: #e6e6ea;--border: #e2e2e8;--border-strong: #cfcfd8;--text-1: #1c1c22;--text-2: #5b5b68;--text-3: #8a8a97;--accent-soft: #f43f5e26;--shadow-1: 0 1px 2px #0000001a;--shadow-2: 0 4px 12px #00000024;--shadow-popover: 0 8px 28px -4px #00000033, 0 2px 6px #0000001f;--canvas-bg: #e9e9ee;--danger-bg: #fdecee;--danger-border: #f3c2c8;--stage-artboard-shadow: 0 2px 16px #00000026}:root{color-scheme:dark}:root[data-theme=light]{color-scheme:light}button,input,select,textarea{font:inherit;color:inherit}.btn{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;background:var(--control-bg);border:1px solid transparent;border-radius:var(--radius);color:var(--text-1);cursor:pointer;transition:background var(--dur-fast) var(--ease),border-color var(--dur-fast) var(--ease),color var(--dur-fast) var(--ease)}.btn:hover:not(:disabled){background:var(--control-bg-hover)}.btn:disabled{opacity:.45;cursor:default}.btn.is-icon{padding:4px}.btn.is-active{background:var(--accent-soft);color:var(--accent)}.btn.is-danger:hover:not(:disabled){border-color:var(--danger);color:var(--danger)}.btn.is-primary{background:var(--accent);border-color:var(--accent);color:#fff}.btn.is-primary:hover:not(:disabled){background:var(--accent);border-color:var(--accent);filter:brightness(1.12)}.btn.is-primary.is-danger,.btn.is-primary.is-danger:hover:not(:disabled){background:var(--danger);border-color:var(--danger);color:#fff}.select{height:var(--control-h);padding:0 var(--space-4);background:var(--control-bg);border:1px solid transparent;border-radius:var(--control-radius);max-width:100%;transition:background var(--dur-fast) var(--ease),border-color var(--dur-fast) var(--ease),box-shadow var(--dur-fast) var(--ease)}.text-input{height:var(--control-h);padding:0 var(--space-5);background:var(--control-bg);border:1px solid transparent;border-radius:var(--control-radius);width:100%;min-width:0;transition:background var(--dur-fast) var(--ease),border-color var(--dur-fast) var(--ease),box-shadow var(--dur-fast) var(--ease)}textarea.text-input{height:auto;padding:var(--space-3) var(--space-5)}.text-input:hover,.select:hover{background:var(--control-bg-hover)}.text-input:focus,.select:focus{outline:none;background:var(--control-bg);border-color:var(--control-border-focus);box-shadow:var(--focus-ring)}.numfield{position:relative;display:inline-flex;align-items:center;gap:var(--space-2);min-width:0;height:var(--control-h);padding:0 var(--space-5);background:var(--control-bg);border:1px solid transparent;border-radius:var(--control-radius);overflow:hidden;transition:background var(--dur-fast) var(--ease),border-color var(--dur-fast) var(--ease),box-shadow var(--dur-fast) var(--ease)}.numfield:hover:not(.is-disabled){background:var(--control-bg-hover)}.numfield:focus-within{background:var(--control-bg);border-color:var(--control-border-focus);box-shadow:var(--focus-ring)}.numfield-fill{position:absolute;top:0;bottom:0;left:0;background:var(--slider-fill);border-right:2px solid var(--slider-thumb);pointer-events:none}.numfield-label{position:relative;flex:1 1 auto;min-width:14px;color:var(--text-2);cursor:ew-resize;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;user-select:none}.numfield-input{position:relative;flex:1 1 36px;min-width:24px;padding:0;background:none;border:none;text-align:right;color:var(--text-1);user-select:text}.numfield-input:focus{outline:none}.numfield-unit{position:relative;color:var(--text-3);flex:none;cursor:ew-resize;user-select:none}.numfield.is-disabled{opacity:.45}.numfield.is-disabled .numfield-label,.numfield.is-disabled .numfield-unit{cursor:default}.badge{display:inline-block;padding:0 5px;border-radius:var(--radius-sm);font-size:var(--text-xs);line-height:16px;background:var(--bg-3);color:var(--text-2);white-space:nowrap}.chevron{transition:transform var(--dur-fast) var(--ease)}.chevron.is-open{transform:rotate(90deg)}.popover{background:var(--surface-inset);border:1px solid var(--border-strong);border-radius:var(--radius-xl);box-shadow:var(--shadow-popover)}.popover-float{z-index:var(--z-menu)}.panel-crash{display:flex;flex-direction:column;align-items:flex-start;gap:var(--space-2);margin:var(--space-2);padding:var(--space-3);border:1px solid var(--danger);border-radius:var(--radius-md);background:var(--bg-2)}.panel-crash-title{color:var(--danger);font-weight:600}.panel-crash-message{color:var(--text-secondary);font-size:var(--text-xs);white-space:pre-wrap;overflow-wrap:anywhere}.insp-section{display:flex;flex-direction:column;gap:var(--space-2);padding:var(--space-6) var(--space-7);border-bottom:1px solid var(--divider)}.insp-heading{display:flex;align-items:center;gap:var(--space-3);min-height:var(--section-header-h);font-size:var(--text-md);font-weight:var(--weight-semibold);letter-spacing:0;color:var(--text-primary)}.insp-row{display:flex;align-items:center;gap:var(--space-3);min-height:var(--row-h)}.insp-row.is-align-start{align-items:flex-start}.insp-label{flex:none;width:var(--label-w);color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.insp-label.is-icon{width:auto;min-width:14px;display:inline-flex;align-items:center;justify-content:center;color:var(--text-tertiary)}.insp-control{flex:1;min-width:0;display:flex;align-items:center;gap:var(--space-2)}.insp-num{flex:1;min-width:0}.insp-vec{flex:1;min-width:0;display:flex;gap:4px}.insp-vec .numfield{flex:1;min-width:0}.insp-grid{flex:1;min-width:0;display:grid;grid-template-columns:repeat(var(--insp-cols, 2),minmax(0,1fr));gap:var(--space-2)}.insp-grid .numfield{min-width:0}.insp-dim{color:var(--text-tertiary);font:var(--mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.insp-inline-error{color:var(--danger);font-size:var(--text-xs);white-space:normal;user-select:text}.insp-notice{font-size:var(--text-xs);white-space:normal;user-select:text;color:var(--text-tertiary)}.insp-notice.is-warn{color:var(--warn)}.insp-textarea{resize:vertical;min-height:44px}.insp-color{flex:none;width:30px;height:var(--control-h);padding:1px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-2);cursor:pointer}.insp-check{accent-color:var(--accent);margin:0}.insp-section-headrow{display:flex;align-items:center;gap:var(--space-2)}.insp-section-header{flex:1;min-width:0;display:flex;align-items:center;gap:var(--space-3);height:var(--section-header-h);padding:0;background:none;border:none;cursor:pointer;font-size:var(--text-md);font-weight:var(--weight-semibold);letter-spacing:0;color:var(--text-primary)}.insp-section-header.is-static{cursor:default}.insp-section-header:hover:not(.is-static) .insp-section-disclosure{color:var(--text-secondary)}.insp-section-disclosure{flex:none;order:2;margin-left:auto;color:var(--text-tertiary)}.insp-section-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.insp-section-actions{flex:none;display:flex;align-items:center;gap:var(--space-1);opacity:0;transition:opacity var(--dur-fast) var(--ease)}.insp-section:hover .insp-section-actions,.insp-section-actions:focus-within{opacity:1}.insp-section-body{display:flex;flex-direction:column;gap:var(--space-3);padding-top:var(--space-3)}.insp-composite{flex:1;min-width:0;display:flex;flex-direction:column;align-items:flex-start;gap:4px}.insp-composite-toggle{cursor:pointer}.insp-composite-toggle:disabled{cursor:default;opacity:.55}.insp-composite-editor{align-self:stretch;display:flex;flex-direction:column;gap:var(--space-3);padding:var(--space-3);border:1px solid var(--border);border-radius:var(--radius-lg);background:var(--bg-2)}.insp-composite-curve{display:block;background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius)}.insp-composite-curve polyline{fill:none;stroke:var(--accent);stroke-width:1.5}.insp-composite-point{display:flex;flex-direction:column;gap:2px;padding-bottom:2px;border-bottom:1px solid var(--border)}.insp-composite-point .numfield,.insp-composite-handles .numfield{flex:1;min-width:0}.insp-gradient-preview{height:14px;border:1px solid var(--border);border-radius:var(--radius)}.segmented{display:inline-flex;flex:1;min-width:0;padding:2px;gap:2px;background:var(--control-bg);border-radius:var(--control-radius)}.segmented-item,.segmented-item:first-child,.segmented-item:last-child,.segmented-item:only-child{flex:1 1 0;min-width:0;min-height:calc(var(--control-h) - 8px);justify-content:center;margin-left:0;padding:1px 6px;background:transparent;border-radius:calc(var(--control-radius) - 2px);color:var(--text-2)}.segmented-item:hover:not(:disabled){background:color-mix(in srgb,var(--text-1) 6%,transparent);color:var(--text-1)}.segmented-item.is-active,.segmented-item.is-active:hover:not(:disabled){position:relative;z-index:1;background:var(--accent);color:#fff;box-shadow:var(--shadow-1)}.toggle{flex:none;width:32px;height:18px;padding:0;border:none;border-radius:999px;background:var(--bg-3);cursor:pointer;position:relative;transition:background var(--dur-fast) var(--ease)}.toggle:hover:not(:disabled):not(.is-on){background:var(--border-strong)}.toggle.is-on{background:var(--accent)}.toggle:disabled{opacity:.45;cursor:default}.toggle-knob{position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;background:var(--text-1);box-shadow:var(--shadow-1);transition:transform var(--dur-fast) var(--ease)}.toggle.is-on .toggle-knob{transform:translate(14px);background:#fff}.combobox-trigger{display:inline-flex;align-items:center;gap:var(--space-2);width:100%;text-align:left;cursor:pointer}.combobox-value{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.combobox-caret{flex:none;color:var(--text-3);transform:rotate(90deg)}.combobox-pop{padding:var(--space-2);max-height:280px;display:flex;flex-direction:column;gap:var(--space-2)}.combobox-search{display:flex;align-items:center;gap:var(--space-2);position:relative}.combobox-search-icon{position:absolute;left:6px;color:var(--text-3);pointer-events:none}.combobox-search .text-input{padding-left:22px}.combobox-list{list-style:none;margin:0;padding:0;overflow:auto;min-width:0}.combobox-option{padding:3px 8px;border-radius:var(--radius-sm);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.combobox-option.is-active{background:var(--surface-hover)}.combobox-option.is-selected{color:var(--accent)}.combobox-empty{padding:4px 8px;color:var(--text-3)}.angle-dial{flex:none;cursor:grab;touch-action:none}.angle-dial:active{cursor:grabbing}.angle-dial.is-disabled{opacity:.45;cursor:default}.angle-dial-ring{fill:var(--control-bg);stroke:var(--control-border);stroke-width:1}.angle-dial:hover .angle-dial-ring{stroke:var(--control-border-hover)}.angle-dial-arm{stroke:var(--accent);stroke-width:1.2}.angle-dial-handle{fill:var(--accent)}.colorpicker-swatch,.colorpicker-alpha{background-image:linear-gradient(45deg,#808080 25%,transparent 25%),linear-gradient(-45deg,#808080 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#808080 75%),linear-gradient(-45deg,transparent 75%,#808080 75%);background-size:8px 8px;background-position:0 0,0 4px,4px -4px,-4px 0}.colorpicker-swatch{padding:0;overflow:hidden;position:relative}.colorpicker-swatch-fill{position:absolute;inset:0}.colorpicker-pop{width:252px;padding:var(--space-4);display:flex;flex-direction:column;gap:var(--space-3)}.colorpicker-sv{position:relative;width:100%;height:140px;border-radius:var(--radius);cursor:crosshair;touch-action:none;background-image:linear-gradient(to top,#000,transparent),linear-gradient(to right,#fff,transparent)}.colorpicker-sv-thumb,.colorpicker-slider-thumb{position:absolute;width:12px;height:12px;border-radius:50%;border:2px solid #fff;box-shadow:0 0 0 1px #0008;transform:translate(-50%,-50%);pointer-events:none}.colorpicker-hue,.colorpicker-alpha{position:relative;height:12px;border-radius:999px;cursor:ew-resize;touch-action:none}.colorpicker-hue{background:linear-gradient(to right,red,#ff0 17%,#0f0 33%,#0ff,#00f 67%,#f0f 83%,red)}.colorpicker-alpha-bar{position:absolute;inset:0;border-radius:999px}.colorpicker-hue .colorpicker-slider-thumb,.colorpicker-alpha .colorpicker-slider-thumb{top:50%}.colorpicker-fields{display:grid;grid-template-columns:1fr auto auto auto auto;gap:var(--space-2);align-items:center}.colorpicker-hex{min-width:0}.colorpicker-ch{min-width:0;padding:0 var(--space-3)}.colorpicker-ch .numfield-input{min-width:20px}.colorpicker-swatches{display:grid;grid-template-columns:repeat(12,1fr);gap:3px}.colorpicker-swatch-chip{aspect-ratio:1;border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;padding:0}.colorpicker-swatch-chip:hover{border-color:var(--text-2)}.topbar{flex:1;min-width:0;display:flex;align-items:center;gap:8px}.topbar-tabs{display:flex;flex:none;padding:2px;gap:2px;background:var(--control-bg);border-radius:var(--control-radius)}.topbar-tabs .btn{text-decoration:none;margin-left:0;padding:2px 10px;background:transparent;border-radius:calc(var(--control-radius) - 2px);color:var(--text-2)}.topbar-tabs .btn:hover:not(:disabled){background:color-mix(in srgb,var(--text-1) 6%,transparent);color:var(--text-1)}.topbar-tabs .btn.is-active,.topbar-tabs .btn.is-active:hover:not(:disabled){position:relative;background:var(--accent);color:#fff;box-shadow:var(--shadow-1)}.topbar-rest{flex:1;min-width:0;display:flex;align-items:center;gap:8px;justify-content:flex-end}.menu{min-width:168px;max-width:320px;max-height:70vh;overflow:auto;padding:var(--space-2);background:var(--bg-2);border:1px solid var(--border-strong);border-radius:var(--radius-lg);box-shadow:var(--shadow-popover);z-index:var(--z-menu);outline:none}.menu-item{display:flex;align-items:center;gap:var(--space-6);min-height:var(--control-h);padding:0 var(--space-4);border-radius:var(--radius-md);color:var(--text-primary);cursor:default;user-select:none}.menu-item.is-active{background:var(--accent);color:#fff}.menu-item.is-danger{color:var(--danger)}.menu-item.is-danger.is-active{background:var(--danger);color:#fff}.menu-item.is-disabled{color:var(--text-tertiary)}.menu-item.is-disabled.is-active{background:transparent;color:var(--text-tertiary)}.menu-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.menu-shortcut{flex:none;color:var(--text-tertiary);font-size:var(--text-xs)}.menu-item.is-active .menu-shortcut{color:#ffffffb8}.menu-caret{flex:none;color:var(--text-tertiary)}.menu-item.is-active .menu-caret{color:inherit}.menu-separator{height:1px;margin:var(--space-1) var(--space-2);background:var(--divider)}.dialog-overlay{position:fixed;inset:0;z-index:var(--z-dialog);display:flex;align-items:center;justify-content:center;padding:var(--space-8);background:#000000a6}.dialog{width:320px;max-width:100%;max-height:100%;display:flex;flex-direction:column;gap:var(--space-5);padding:var(--space-6);background:var(--surface-panel);border:1px solid var(--border-strong);border-radius:var(--radius-xl);box-shadow:var(--shadow-2);outline:none}.dialog-title{font-size:var(--text-lg);font-weight:var(--weight-semibold);color:var(--text-primary)}.dialog-body{display:flex;flex-direction:column;gap:var(--space-4);min-height:0;overflow:auto;color:var(--text-secondary)}.dialog-message{margin:0;white-space:normal}.dialog-field{display:flex;flex-direction:column;gap:var(--space-2)}.dialog-label{color:var(--text-secondary)}.dialog-error{color:var(--danger);font-size:var(--text-xs)}.dialog-actions{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-3)}:root{--font-ui: system-ui, "Segoe UI", sans-serif;--bg: #000000;--panel: #0c0c0e;--panel-raised: #141417;--control: #1b1b1f;--control-hover: #26262c;--input-bg: #1b1b1f;--border: #232328;--border-soft: #1a1a1e;--text: #f2f2f5;--text-dim: #8e8e97;--text-faint: #5d5d66;--accent: #0a84ff;--accent-hover: #3d9dff;--accent-soft: rgba(10, 132, 255, .16);--accent-quiet: rgba(10, 132, 255, .12);--accent-warm: #f5a524;--danger: #ff4d4f;--danger-text: #ff8a8c;--warn: #f5a524;--guide: #f5a524;--frame-border: rgba(255, 255, 255, .22);--marquee: var(--accent);--frustum: #eab308;--grid: #2a2a31;--axis-x: #ef4444;--axis-y: #22c55e;--axis-z: #3b82f6;--stage-divider: var(--border);--block-in: #38bdf8;--block-during: #a78bfa;--block-out: #f472b6;--scene-bar: #34d399;--playhead: var(--accent);--audio-clip: #2dd4bf;--audio-line: #fef08a;--marker: #f97316;--marker-pin: #ffffff}:root{--control-bg: var(--control);--control-bg-hover: var(--control-hover);--control-border: transparent;--control-border-hover: var(--border);--control-border-focus: var(--accent);--control-radius: 8px;--control-h: 30px;--panel-bg: var(--panel);--divider: var(--border-soft);--focus-ring: 0 0 0 3px var(--accent-soft);--label-w: 76px;--slider-fill: rgba(255, 255, 255, .05);--slider-thumb: rgba(255, 255, 255, .14);--shadow-panel: 0 12px 40px rgba(0, 0, 0, .55), 0 2px 8px rgba(0, 0, 0, .4);--panel-radius: 12px;--rail-w: 232px;--inspector-w: 288px}.shell.is-rail-collapsed{--rail-w: 0px}.shell.is-inspector-collapsed{--inspector-w: 0px}.shell.is-rail-collapsed>.left-rail,.shell.is-inspector-collapsed>.inspector,.shell.is-inspector-collapsed>.agent-panel{display:none}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{font:var(--font);color:var(--text);background:var(--bg);-webkit-font-smoothing:antialiased}.shell{position:relative;height:100%}.stage-frame{position:fixed;inset:0;width:100%;height:100%;border:0;display:block}.shell-header,.left-rail,.inspector,.agent-panel,.timeline-dock,.tool-dock,.view-mode-bar,.camera-view-bar,.tool-flyout,.overlay-message{background:var(--panel);border:1px solid var(--border);border-radius:var(--panel-radius);box-shadow:var(--shadow-panel)}.btn,.shell-header button,.dock-head button,.export-dialog button{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:28px;padding:0 10px;font:inherit;font-weight:500;color:var(--text);background:var(--control);border:1px solid transparent;border-radius:8px;cursor:pointer;white-space:nowrap;transition:background .12s ease,color .12s ease,border-color .12s ease}.btn:hover:not(:disabled),.shell-header button:hover:not(:disabled),.dock-head button:hover:not(:disabled),.export-dialog button:hover:not(:disabled){background:var(--control-hover)}.btn:disabled,.shell-header button:disabled,.export-dialog button:disabled{opacity:.35;cursor:default}.btn.is-icon,.shell-header button.is-icon{width:28px;padding:0;font-size:13px}.btn.is-primary,.shell-header button.is-primary{background:var(--accent);border-color:transparent;color:#fff}.btn.is-primary:hover:not(:disabled){background:var(--accent-hover)}.btn.is-active,.btn[aria-pressed=true]{background:var(--accent-soft);color:#cfe4ff}.btn.is-danger{color:var(--danger-text)}.btn:focus-visible,.shell-header button:focus-visible{outline:none;box-shadow:var(--focus-ring)}.shell-header{position:fixed;top:12px;left:12px;right:12px;z-index:10;display:flex;align-items:center;gap:8px;height:48px;padding:0 10px}.shell-header-spacer{flex:1}.doc-switcher{display:flex;gap:6px;align-items:center}.doc-switcher-select,.doc-switcher-input,.select{appearance:none;-webkit-appearance:none;height:30px;min-width:156px;padding:0 28px 0 10px;font:inherit;font-weight:500;color:var(--text);background-color:var(--control);background-image:linear-gradient(45deg,transparent 50%,var(--text-dim) 50%),linear-gradient(135deg,var(--text-dim) 50%,transparent 50%);background-position:calc(100% - 15px) 13px,calc(100% - 10px) 13px;background-size:5px 5px,5px 5px;background-repeat:no-repeat;border:1px solid transparent;border-radius:8px;cursor:pointer}.doc-switcher-input{background-image:none;padding-right:10px;cursor:text}.doc-switcher-select:hover,.doc-switcher-input:hover{background-color:var(--control-hover)}.doc-switcher-select:focus-visible,.doc-switcher-input:focus{outline:none;border-color:var(--accent);box-shadow:var(--focus-ring)}.doc-switcher-select option{background:var(--panel-raised);color:var(--text)}.history-controls,.zoom-controls,.status-badges,.transport{display:flex;align-items:center;gap:4px}.transport{gap:8px;margin-left:4px}.transport-scrub{appearance:none;-webkit-appearance:none;width:240px;height:18px;background:transparent;cursor:pointer}.transport-scrub::-webkit-slider-runnable-track{height:4px;border-radius:999px;background:var(--control)}.transport-scrub::-webkit-slider-thumb{appearance:none;-webkit-appearance:none;width:12px;height:12px;margin-top:-4px;border-radius:999px;background:#fff;border:0;box-shadow:0 1px 3px #0009}.transport-scrub::-moz-range-track{height:4px;border-radius:999px;background:var(--control)}.transport-scrub::-moz-range-thumb{width:12px;height:12px;border:0;border-radius:999px;background:#fff}.transport-scrub:focus-visible{outline:none;box-shadow:var(--focus-ring);border-radius:999px}.transport-play{min-width:40px}.transport-readout,.zoom-readout,.dock-readout{font-variant-numeric:tabular-nums;color:var(--text-dim)}.transport-readout{min-width:64px}.zoom-readout{min-width:48px;text-align:center}.badge{display:inline-flex;align-items:center;height:22px;padding:0 8px;border-radius:999px;border:1px solid var(--border);color:var(--text-dim);white-space:nowrap}.badge-quiet{color:var(--text-faint);border-color:transparent}.badge-warn{border-color:#f5a52466;color:var(--warn)}.badge-error{border-color:#ff4d4f73;color:var(--danger-text)}.overlay-strip{position:fixed;left:50%;transform:translate(-50%);bottom:76px;z-index:20;display:flex;flex-direction:column;gap:6px;pointer-events:none;max-width:560px}.overlay-message{pointer-events:auto;display:flex;gap:10px;align-items:flex-start;padding:10px 12px;line-height:1.5;border-color:#ff4d4f80}.overlay-message button{font:inherit;font-size:14px;color:var(--text-dim);background:transparent;border:0;cursor:pointer;padding:0}.overlay-message button:hover{color:var(--text)}.empty-state{position:fixed;inset:0;z-index:5;display:grid;place-content:center;text-align:center;gap:6px;pointer-events:none;color:var(--text-faint)}.empty-state h1{font-size:20px;font-weight:600;margin:0;color:var(--text-dim)}.empty-state p{margin:0}.left-rail{position:fixed;top:72px;left:12px;bottom:12px;width:var(--rail-w);z-index:10;overflow:auto;display:flex;flex-direction:column;padding:10px}.left-rail:empty{display:none}.left-rail>*{flex-shrink:0}.help-section{margin-top:auto;padding-top:12px}.help-summary{cursor:pointer;user-select:none;list-style:none;margin:0}.help-summary::-webkit-details-marker{display:none}.help-summary:before{content:"▸ "}.help-section[open]>.help-summary:before{content:"▾ "}.help-basics{list-style:disc;margin:6px 0;padding:0 4px 0 18px;color:var(--text-dim);font-size:11px;line-height:1.5}.help-basics li+li{margin-top:4px}.help-rows{list-style:none;margin:0 0 4px;padding:0 4px}.help-row{display:flex;align-items:baseline;justify-content:space-between;gap:8px;padding:2px 0;color:var(--text-dim);font-size:11px}.help-row kbd,.help-note code{font:inherit;font-size:10px;color:var(--text);background:var(--control);border-radius:5px;padding:1px 5px;white-space:nowrap}.help-note{margin:0 0 6px;padding:0 4px;color:var(--text-faint);font-size:11px;line-height:1.45}.help-command{display:flex;align-items:flex-start;gap:6px;margin:0 0 6px;padding:0 4px}.help-command code{flex:1;font-size:10px;line-height:1.5;color:var(--text);background:var(--control);border-radius:5px;padding:4px 6px;word-break:break-all}.help-command button{font:inherit;font-size:10px;color:var(--text-dim);background:var(--control);border:0;border-radius:6px;padding:3px 7px;cursor:pointer;white-space:nowrap}.file-search{margin-bottom:4px}.file-search input{width:100%;height:30px;font:inherit;color:var(--text);background:var(--control);border:1px solid transparent;border-radius:8px;padding:0 10px}.file-search input::placeholder{color:var(--text-faint)}.file-search input:focus{outline:none;border-color:var(--accent);box-shadow:var(--focus-ring)}.file-section-label{margin:14px 0 6px;padding:0 4px;color:var(--text-faint);text-transform:uppercase;letter-spacing:.07em;font-size:10px;font-weight:600}.scene-list,.layer-list,.layer-children{list-style:none;margin:0;padding:0}.layer-children{padding-left:12px}.scene-row,.layer-name{font:inherit;font-weight:500;color:var(--text);background:transparent;border:0;padding:0 8px;height:28px;width:100%;text-align:left;cursor:pointer;border-radius:7px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.scene-row{display:flex;align-items:center;gap:6px;padding-left:6px}.row-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.scene-row:hover,.layer-row:hover{background:var(--control)}.scene-row.is-current{background:var(--accent-soft);color:#cfe4ff}.layer-row{display:flex;align-items:center;gap:2px;padding-right:4px;border-radius:7px}.layer-row.is-selected{background:var(--accent-soft)}.layer-row.is-selected .layer-name{color:#cfe4ff}.layer-kind{flex:none;width:16px;display:inline-flex;align-items:center;justify-content:center;color:var(--accent);user-select:none}.layer-kind svg{width:14px;height:14px}.layer-toggle{display:inline-flex;align-items:center;justify-content:center;color:var(--text-dim);background:transparent;border:0;cursor:pointer;border-radius:5px;padding:2px;flex:none;width:14px}.layer-toggle svg{width:10px;height:10px;transition:transform 80ms ease}.layer-toggle.is-open svg{transform:rotate(90deg)}.layer-toggle:hover{color:var(--text);background:var(--control-hover)}.layer-toggle-spacer{flex:none;width:14px}.layer-flag{display:inline-flex;align-items:center;justify-content:center;color:var(--text-dim);background:transparent;border:0;cursor:pointer;opacity:0;border-radius:5px;padding:3px 4px;flex:none}.layer-flag svg{width:13px;height:13px}.layer-row:hover .layer-flag,.layer-flag[aria-pressed=true],.layer-flag:focus-visible{opacity:.75}.layer-flag:hover{opacity:1!important;background:var(--control-hover)}.layer-rename{flex:1;min-width:0;font:inherit;color:var(--text);background:var(--input-bg);border:1px solid var(--accent);border-radius:6px;padding:3px 6px}.layer-rename:focus{outline:none;box-shadow:var(--focus-ring)}.mcp-section{margin-top:4px}.panel-title{font-weight:600;color:var(--text);margin:0 0 6px;padding:0 4px}.panel-empty{color:var(--text-faint);padding:8px 4px;line-height:1.5}.rail-resize,.dock-resize,.split-resize{z-index:12;touch-action:none;background:transparent;transition:background .12s ease}.rail-resize:hover,.dock-resize:hover,.split-resize:hover{background:var(--accent-soft)}.split-resize{position:fixed;top:128px;bottom:calc(var(--dock-h) + 24px);left:var(--split-x);width:8px;margin-left:-4px;cursor:col-resize}.rail-resize{position:fixed;top:72px;bottom:12px;left:calc(var(--rail-w) + 12px);width:8px;margin-left:-4px;cursor:col-resize}.dock-resize{position:absolute;top:0;left:0;right:0;height:8px;cursor:row-resize;border-top-left-radius:var(--panel-radius);border-top-right-radius:var(--panel-radius)}.panel-toggles{display:flex;align-items:center;gap:2px;padding:0 4px}.btn-icon{min-width:28px;padding:0 6px;justify-content:center}.control-strip{position:fixed;top:72px;left:calc(var(--rail-w) + 24px);right:calc(var(--inspector-w) + 24px);z-index:12;display:flex;align-items:flex-start;flex-wrap:wrap;gap:8px;pointer-events:none}.control-strip>*{pointer-events:auto}.tool-dock{display:flex;align-items:center;gap:2px;padding:5px;border-radius:12px}.view-mode-bar{display:flex;align-items:center;gap:2px;padding:4px;border-radius:10px}.camera-view-bar{display:flex;align-items:center;gap:4px;padding:4px;border-radius:10px}.camera-view-bar .btn.is-armed{background:#eab3082e;border-color:#eab30880;color:var(--frustum)}.tool-button{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;font:inherit;font-size:14px;color:var(--text-dim);background:transparent;border:0;border-radius:8px;cursor:pointer;transition:background .12s ease,color .12s ease}.tool-button:hover{background:var(--control);color:var(--text)}.tool-button.is-armed{background:var(--accent-soft);color:#cfe4ff}.tool-button.tool-animate[aria-pressed=true]{background:#f5a52429;color:var(--accent-warm)}.tool-separator{width:1px;align-self:stretch;margin:4px;background:var(--border)}.tool-flyout-anchor{position:relative}.tool-flyout{position:absolute;bottom:calc(100% + 8px);left:0;display:flex;flex-direction:column;gap:2px;padding:5px;border-radius:10px;white-space:nowrap;z-index:1}.tool-flyout .tool-button{width:auto;min-width:32px;justify-content:flex-start;gap:8px;padding:0 10px}.tool-flyout .tool-button:disabled{opacity:.4;cursor:default}.timeline-dock{position:fixed;left:calc(var(--rail-w) + 24px);right:calc(var(--inspector-w) + 24px);bottom:12px;z-index:11;display:flex;flex-direction:column;max-height:var(--dock-h, 42vh);overflow:hidden}.timeline-dock.is-collapsed{max-height:none}.dock-head{display:flex;align-items:center;gap:8px;height:34px;padding:0 10px;border-bottom:1px solid var(--border-soft);flex:none}.dock-collapse{font:inherit;color:var(--text-dim);background:transparent;border:0;cursor:pointer;padding:2px 4px;border-radius:5px}.dock-collapse:hover{color:var(--text);background:var(--control)}.dock-title{color:var(--text-dim);font-weight:500}.dock-play,.dock-fit{font:inherit;color:var(--text-dim);background:transparent;border:0;cursor:pointer;padding:2px 6px;border-radius:5px}.dock-play:hover,.dock-fit:hover{color:var(--text);background:var(--control)}.dock-time{font:var(--mono);font-size:12px;color:var(--text);min-width:56px}.dock-span{font:var(--mono);font-size:11px;color:var(--text-faint)}.dock-mute{font:inherit;font-size:11px;color:var(--text-dim);background:transparent;border:0;cursor:pointer;padding:2px 4px;border-radius:5px;margin-left:auto}.dock-mute:hover,.dock-mute[aria-pressed=true]{color:var(--text);background:var(--control)}.dock-volume{width:72px;accent-color:var(--accent)}.dock-readout{color:var(--text-faint)}.dock-body{display:flex;flex-direction:column;min-height:0}.dock-body[hidden]{display:none}.dock-scroll{overflow:auto;min-height:0;padding-bottom:6px}.dock-ruler{position:relative;height:24px}.tl-ruler{position:relative;height:100%;overflow:hidden;cursor:ew-resize}.tl-tick{position:absolute;top:0;bottom:0;padding-left:6px;font:var(--mono);font-size:10px;line-height:20px;color:var(--text-faint);pointer-events:none;white-space:nowrap}.tl-tick:before{content:"";position:absolute;left:0;bottom:4px;width:1px;height:6px;background:var(--border)}.dock-playhead,.scene-cut{position:absolute;top:50%;width:9px;height:9px;padding:0;transform:translate(-50%,-50%) rotate(45deg);border:1px solid var(--text-faint);border-radius:1px;background:var(--panel);cursor:pointer;z-index:3}.scene-cut:hover{border-color:var(--text)}.scene-cut.is-blend{border-color:var(--accent);background:var(--accent)}.scene-playhead{position:absolute;top:0;bottom:0;width:2px;background:var(--playhead);pointer-events:none;z-index:4}.dock-ruler .dock-playhead:after{content:"";position:absolute;top:0;left:50%;transform:translate(-50%);width:9px;height:9px;border-radius:3px;background:var(--playhead)}.dock-tracks{display:flex;flex-direction:column;position:relative}.dock-overlay{position:absolute;top:0;bottom:0;right:0;pointer-events:none;z-index:3}.dock-boundary{position:absolute;top:0;bottom:0;width:1px;background:var(--border)}.dock-snap-guide{position:absolute;top:0;bottom:0;width:1px;background:var(--accent);box-shadow:0 0 0 1px color-mix(in srgb,var(--accent) 30%,transparent)}.dock-scene-group+.dock-scene-group{border-top:1px solid var(--border)}.scene-strip{display:flex;align-items:stretch;height:26px;border-bottom:1px solid var(--border);flex:none}.scene-strip-label{display:flex;align-items:center;gap:6px;padding-left:10px;color:var(--text-faint);text-transform:uppercase;letter-spacing:.06em;font-size:10px;font-weight:600;flex:none}.scene-strip-add{font:inherit;font-size:13px;line-height:1;color:var(--text-faint);background:transparent;border:0;padding:2px 6px;border-radius:4px;cursor:pointer}.scene-strip-add:hover{color:var(--text);background:var(--control)}.scene-strip-lane{position:relative;flex:1}.scene-bar{position:absolute;top:4px;bottom:4px;display:flex;align-items:center;padding:0 8px;border-radius:6px;background:color-mix(in srgb,var(--scene-bar) 14%,transparent);border:1px solid color-mix(in srgb,var(--scene-bar) 55%,transparent);color:color-mix(in srgb,var(--scene-bar) 45%,#ffffff);cursor:pointer;overflow:hidden}.scene-bar:hover{background:color-mix(in srgb,var(--scene-bar) 22%,transparent)}.scene-bar.is-current{border-color:var(--scene-bar);background:color-mix(in srgb,var(--scene-bar) 26%,transparent);color:#fff}.scene-bar-name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:500}.scene-trim{position:absolute;right:0;top:0;bottom:0;width:7px;cursor:col-resize}.lifespan-row{display:flex;align-items:stretch;height:28px;border-bottom:1px solid var(--border-soft);contain:layout paint}.lifespan-row.is-selected{background:var(--accent-quiet)}.lifespan-label-cell{display:flex;align-items:center;flex:none;overflow:hidden}.lifespan-disclosure{font:inherit;font-size:9px;line-height:1;color:var(--text-faint);background:transparent;border:0;padding:4px;cursor:pointer;flex:none}.lifespan-disclosure:hover{color:var(--text)}.lifespan-name{font:inherit;color:var(--text-dim);background:transparent;border:0;text-align:left;padding:0 6px;cursor:pointer;flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.lifespan-name:hover,.lifespan-row.is-selected .lifespan-name{color:var(--text)}.lifespan-lane{position:relative;flex:1}.lifespan-bar{position:absolute;top:5px;bottom:5px;display:flex;align-items:center;padding:0 10px;border-radius:7px;background:color-mix(in srgb,var(--text) 10%,transparent);border:1px solid color-mix(in srgb,var(--text) 22%,transparent);color:var(--text-dim);cursor:grab;overflow:hidden;white-space:nowrap}.lifespan-bar:hover{background:color-mix(in srgb,var(--text) 16%,transparent)}.lifespan-bar.is-selected{background:color-mix(in srgb,var(--accent) 22%,transparent);border-color:var(--accent);color:#fff}.lifespan-bar-name{overflow:hidden;text-overflow:ellipsis;pointer-events:none;font-weight:500}.lifespan-handle{position:absolute;top:0;bottom:0;width:8px;cursor:col-resize}.lifespan-handle-in{left:0}.lifespan-handle-out{right:0}.block-row{display:flex;align-items:stretch;height:26px;border-bottom:1px solid var(--border-soft);contain:layout paint}.block-row.is-selected{background:var(--accent-quiet)}.block-row-label-cell{display:flex;align-items:stretch;flex:none;overflow:hidden}.block-row-label{font:inherit;color:var(--text-dim);background:transparent;border:0;text-align:left;padding:0 10px;cursor:pointer;flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.block-row-add{font:inherit;font-size:11px;color:var(--text-faint);background:transparent;border:0;padding:0 8px;cursor:pointer;flex:none;white-space:nowrap;opacity:0;transition:opacity .12s ease,color .12s ease}.block-row:hover .block-row-add,.block-row-add:focus-visible{opacity:1}.block-row-add:hover,.block-row-label:hover,.block-row.is-selected .block-row-label{color:var(--text)}.block-row-lane{position:relative;flex:1}.block-bar{position:absolute;top:4px;bottom:4px;display:flex;align-items:center;padding:0 8px;border-radius:6px;background:color-mix(in srgb,var(--block-during) 14%,transparent);border:1px solid color-mix(in srgb,var(--block-during) 60%,transparent);color:color-mix(in srgb,var(--block-during) 40%,#ffffff);cursor:grab;overflow:visible;white-space:nowrap;transition:background .12s ease}.block-bar:hover{background:color-mix(in srgb,var(--block-during) 24%,transparent)}.block-bar.slot-in{background:color-mix(in srgb,var(--block-in) 14%,transparent);border-color:color-mix(in srgb,var(--block-in) 60%,transparent);color:color-mix(in srgb,var(--block-in) 40%,#ffffff)}.block-bar.slot-in:hover{background:color-mix(in srgb,var(--block-in) 24%,transparent)}.block-bar.slot-out{background:color-mix(in srgb,var(--block-out) 14%,transparent);border-color:color-mix(in srgb,var(--block-out) 60%,transparent);color:color-mix(in srgb,var(--block-out) 40%,#ffffff)}.block-bar.slot-out:hover{background:color-mix(in srgb,var(--block-out) 24%,transparent)}.block-bar.is-selected{outline:1px solid #fff;outline-offset:1px;color:#fff}.block-bar.is-clipped{opacity:.5;border-style:dashed}.block-dead{position:absolute;top:0;bottom:0;pointer-events:none;background:repeating-linear-gradient(-45deg,color-mix(in srgb,var(--text) 16%,transparent) 0 3px,transparent 3px 6px)}.block-label{overflow:hidden;text-overflow:ellipsis;pointer-events:none;font-weight:500}.block-handle{position:absolute;top:0;bottom:0;width:7px;cursor:col-resize}.block-handle-in{left:-1px}.block-handle-out{right:-1px}.block-spring-tail{position:absolute;right:-18px;top:50%;width:18px;border-top:1px dashed currentColor;opacity:.6}.channel-row{display:flex;align-items:stretch;height:20px;border-bottom:1px solid var(--border-soft)}.channel-label-cell{display:flex;align-items:center;gap:6px;flex:none;overflow:hidden}.channel-name{color:var(--text-faint);font-size:10px;white-space:nowrap}.channel-value{margin-left:auto;padding-right:8px;color:var(--text-dim);font-size:10px;font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.channel-lane{position:relative;flex:1}.channel-span{position:absolute;top:0;bottom:0;--slot: var(--block-during);cursor:grab}.channel-span.slot-in{--slot: var(--block-in)}.channel-span.slot-out{--slot: var(--block-out)}.channel-connector{position:absolute;left:0;right:0;top:50%;border-top:1px solid color-mix(in srgb,var(--slot) 55%,transparent);pointer-events:none}.channel-span:hover .channel-connector{border-top-color:var(--slot)}.channel-key{position:absolute;top:50%;width:9px;height:9px;transform:translate(-50%,-50%) rotate(45deg);background:var(--slot);border:1px solid color-mix(in srgb,var(--slot) 55%,#000);border-radius:1px;cursor:col-resize}.channel-key:hover{background:color-mix(in srgb,var(--slot) 70%,#fff)}.channel-key-in{left:0}.channel-key-out{left:100%}.channel-span.is-selected .channel-key{background:#fff;border-color:#fff}.channel-span.is-selected .channel-connector{border-top-color:var(--slot)}.channel-span.is-clipped .channel-key{opacity:.55}.channel-dead{position:absolute;top:50%;border-top:1px dashed color-mix(in srgb,var(--text) 45%,transparent);pointer-events:none}.channel-spring-tail{position:absolute;left:100%;top:50%;width:14px;border-top:1px dashed color-mix(in srgb,var(--slot) 70%,transparent);pointer-events:none}.channel-empty-hint{display:flex;align-items:center;padding-left:10px;color:var(--text-faint);font-size:10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.audio-lane{display:flex;align-items:stretch;position:relative;height:38px;border-top:1px solid var(--border);background:color-mix(in srgb,var(--audio-clip) 4%,transparent)}.audio-lane.is-over{background:color-mix(in srgb,var(--audio-clip) 14%,transparent);outline:1px dashed var(--audio-clip);outline-offset:-1px}.audio-label-cell{display:flex;align-items:center;gap:6px;flex:none;padding-left:8px;overflow:hidden}.audio-lane-name{color:var(--text-dim);flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.audio-add{font:inherit;color:var(--text-dim);background:var(--control);border:0;border-radius:5px;padding:1px 7px;margin-right:6px;cursor:pointer;flex:none}.audio-add:hover:not(:disabled){color:var(--text);background:var(--control-hover)}.audio-track{position:relative;flex:1}.audio-empty{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-faint);pointer-events:none;white-space:nowrap}.audio-clip{position:absolute;top:5px;bottom:5px;border-radius:6px;background:color-mix(in srgb,var(--audio-clip) 16%,transparent);border:1px solid color-mix(in srgb,var(--audio-clip) 65%,transparent);color:color-mix(in srgb,var(--audio-clip) 35%,#ffffff);cursor:grab;overflow:hidden}.audio-clip:hover{background:color-mix(in srgb,var(--audio-clip) 26%,transparent)}.audio-clip.is-muted{opacity:.45;border-style:dashed}.audio-wave,.audio-fade-curve{position:absolute;inset:0;width:100%;height:100%;pointer-events:none}.audio-fade-curve polyline{stroke:var(--audio-line);stroke-width:1;vector-effect:non-scaling-stroke}.audio-clip-name{position:absolute;left:8px;top:1px;pointer-events:none;font-weight:500;max-width:calc(100% - 46px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-gain-band{position:absolute;left:0;right:0;height:9px;margin-bottom:-4px;cursor:ns-resize}.audio-gain-band:after{content:"";position:absolute;left:0;right:0;top:4px;height:1px;background:var(--audio-line);opacity:.8}.audio-handle{position:absolute;top:0;bottom:0;width:7px;cursor:col-resize}.audio-handle-in{left:-1px}.audio-handle-out{right:-1px}.audio-fade{position:absolute;top:-1px;width:11px;height:11px;margin-left:-5px;border-radius:50%;cursor:ew-resize;background:color-mix(in srgb,var(--audio-line) 70%,transparent)}.audio-clip-buttons{position:absolute;right:2px;top:1px;display:flex;gap:2px}.audio-clip-btn{font:inherit;font-size:10px;line-height:1;color:var(--text-dim);background:transparent;border:0;padding:2px 3px;border-radius:4px;cursor:pointer}.audio-clip-btn:hover{color:var(--text);background:var(--control)}.audio-error{position:absolute;left:8px;bottom:2px;margin:0;color:var(--danger-text);pointer-events:none}.marker-lane{display:flex;align-items:stretch;position:relative;height:20px;border-top:1px solid var(--border);background:color-mix(in srgb,var(--marker) 10%,transparent)}.marker-label-cell{display:flex;align-items:center;gap:6px;flex:none;padding-left:8px;overflow:hidden}.marker-lane-name{color:var(--text-dim);flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.marker-add{font:inherit;line-height:1;color:var(--text-dim);background:var(--control);border:0;border-radius:5px;padding:1px 7px;margin-right:6px;cursor:pointer;flex:none}.marker-add:hover{color:var(--text);background:var(--control-hover)}.marker-track{position:relative;flex:1}.marker-empty{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-faint);pointer-events:none;white-space:nowrap}.marker-pin{position:absolute;top:0;bottom:0;width:0;display:flex;align-items:center;cursor:grab}.marker-diamond{width:8px;height:8px;margin-left:-4px;background:var(--marker-pin);border:1px solid color-mix(in srgb,var(--marker) 70%,#000000);transform:rotate(45deg);flex:none}.marker-pin.is-selected .marker-diamond{background:var(--marker);border-color:var(--marker-pin);box-shadow:0 0 0 2px color-mix(in srgb,var(--marker) 45%,transparent)}.marker-pin.is-at-playhead .marker-diamond{border-color:var(--playhead)}.marker-pin-label{display:none;position:absolute;left:8px;white-space:nowrap;padding:0 4px;border-radius:3px;color:var(--text);background:var(--panel);border:1px solid var(--border);pointer-events:none;z-index:1}.marker-pin:hover .marker-pin-label,.marker-pin.is-selected .marker-pin-label{display:block}.inspector,.shell>.agent-panel{position:fixed;top:72px;right:12px;bottom:12px;width:var(--inspector-w);z-index:10}.inspector{overflow:auto;padding:12px}.shell>.agent-panel{position:fixed;height:auto;overflow:hidden;padding:0}.shell>.agent-panel>.agent-title{padding:10px 12px;border-bottom:1px solid var(--border-soft);flex:none;flex-wrap:wrap;row-gap:6px}.shell>.agent-panel .agent-models{flex:1 1 100%;order:1}.shell>.agent-panel .agent-title-label{font-weight:600}.shell>.agent-panel .agent-composer{padding:10px 12px;border-top:1px solid var(--border-soft);flex:none}.inspector>.segmented{margin-bottom:4px}.inspector-empty{margin:16px 4px;color:var(--text-faint);line-height:1.6}.section-action{font:inherit;font-size:14px;line-height:1;color:var(--text-dim);background:transparent;border:0;cursor:pointer;padding:4px 6px;border-radius:6px}.section-action:hover{color:var(--text);background:var(--control)}.align-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:3px;margin:2px 0 8px}.align-button{display:inline-flex;align-items:center;justify-content:center;height:28px;padding:0;color:var(--text-dim);background:var(--control);border:1px solid transparent;border-radius:7px;cursor:pointer;transition:background .12s ease,color .12s ease}.align-button:hover:not(:disabled){background:var(--control-hover);color:var(--text)}.align-button:disabled{opacity:.3;cursor:default}.align-button:focus-visible{outline:none;border-color:var(--accent);box-shadow:var(--focus-ring)}.align-icon-rule{fill:currentColor}.align-icon-box{fill:currentColor;opacity:.45}.effect-row+.effect-row{margin-top:1px}.effect-params{display:flex;gap:6px;padding:2px 0 10px 10px;border-left:1px solid var(--border-soft);margin-left:2px}.effect-params>*{flex:1 1 0;min-width:0}.insp-dim{color:var(--text-faint)}.resolved-list{margin:0;padding:2px 0 6px;display:flex;flex-direction:column;gap:1px}.resolved-row{display:grid;grid-template-columns:58px 1fr auto;align-items:baseline;gap:8px;padding:2px}.resolved-label{font-size:11px;color:var(--text-faint)}.resolved-value{margin:0;font-size:11px;color:var(--text);font-variant-numeric:tabular-nums;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.resolved-by{margin:0;font-size:10px;color:var(--accent);white-space:nowrap}.resolved-row[data-live=true] .resolved-label{color:var(--text-dim)}.animate-palette{display:flex;flex-wrap:wrap;gap:5px;padding:4px 0 8px}.animate-preset{font:inherit;font-size:11px;font-weight:500;color:var(--text-dim);padding:5px 10px;border-radius:999px;cursor:pointer;background:var(--control);border:1px solid transparent;transition:background .12s ease,color .12s ease}.animate-preset:hover{background:var(--control-hover);color:var(--text)}.animate-preset[aria-pressed=true]{background:var(--accent);border-color:transparent;color:#fff}.animate-blocks{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px}.animate-blocks li{display:flex;align-items:center;gap:2px}.animate-block-row{flex:1;min-width:0;display:flex;justify-content:space-between;align-items:center;gap:8px;font:inherit;font-size:11px;color:var(--text);text-align:left;padding:6px 8px;border-radius:7px;cursor:pointer;background:var(--control);border:1px solid transparent}.animate-block-row:hover{background:var(--control-hover)}.animate-block-row[aria-pressed=true]{background:var(--accent-soft);border-color:var(--accent)}.animate-block-name{font-weight:500;overflow:hidden;text-overflow:ellipsis}.animate-block-owner{font-style:normal;color:var(--text-faint)}.animate-block-span{color:var(--text-dim);font-variant-numeric:tabular-nums;flex:none}.animate-block-remove{font:inherit;font-size:12px;color:var(--text-faint);background:transparent;border:0;cursor:pointer;padding:4px 6px;border-radius:6px;flex:none}.animate-block-remove:hover{color:var(--danger-text);background:var(--control)}.insp-pad{display:block;margin:6px 0}.insp-pad-box{fill:none;stroke:var(--border)}.insp-pad-curve{fill:none;stroke:var(--accent);stroke-width:1.5}.insp-pad-arm{stroke:var(--border);stroke-width:1}.insp-pad-handle{fill:var(--accent);cursor:grab}.insp-preview{display:block;margin:4px 0}.insp-preview polyline{fill:none;stroke:var(--accent);stroke-width:1.5}.insp-preview polyline.is-spring{stroke:var(--accent-warm)}.insp-preview polyline.is-tail{stroke:var(--accent-warm);stroke-dasharray:3 3;opacity:.55}.animate-preview-edge{stroke:var(--border);stroke-width:1;stroke-dasharray:2 2}.animate-preview-note{display:block;font-size:10px;color:var(--text-faint);line-height:1.5}.component-row{display:flex;align-items:center;gap:4px;min-height:24px;padding-left:8px;border-radius:4px}.component-row.is-current{background:var(--control)}.component-count{margin-left:auto;color:var(--text-faint);font-variant-numeric:tabular-nums}.link-button{padding:0;border:0;background:transparent;color:var(--accent);cursor:pointer;text-align:left}.link-button:hover{text-decoration:underline}.isolation-crumbs{display:flex;flex-wrap:wrap;align-items:center;gap:2px;padding:2px 8px 6px;font-size:10px}.isolation-crumbs .crumb{padding:2px 4px;border:0;border-radius:4px;background:transparent;color:var(--text-dim);cursor:pointer}.isolation-crumbs .crumb+.crumb:before{content:"›";margin-right:4px;color:var(--text-faint)}.isolation-crumbs .crumb:hover{color:var(--text)}.isolation-crumbs .crumb.is-current{color:var(--text);cursor:default}.layer-row.is-drop-before{box-shadow:inset 0 2px 0 var(--accent)}.layer-row.is-drop-after{box-shadow:inset 0 -2px 0 var(--accent)}.layer-row.is-drop-into{box-shadow:inset 0 0 0 2px var(--accent)}.inspector-note{margin:0 0 2px;font-size:10px;color:var(--text-faint);line-height:1.5}.header-export.is-running{font-variant-numeric:tabular-nums}.dialog.shot-export-dialog{width:420px}.dialog.material-picker{width:520px;max-height:70vh}.material-search{width:100%;padding:6px 8px;background:var(--surface-sunken, #131316);border:1px solid var(--border-strong, #35353d);border-radius:var(--radius-md, 6px);color:var(--text-primary, #e7e7ea);font:inherit}.material-shelf{display:flex;flex-direction:column;gap:8px;margin-bottom:14px}.material-shelf h3{margin:0;font-size:var(--text-xs, 11px);font-weight:var(--weight-semibold, 600);letter-spacing:.06em;text-transform:uppercase;color:var(--text-secondary, #9a9aa5)}.material-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:8px}.material-card{position:relative;display:flex;flex-direction:column;gap:4px;padding:0;background:none;border:1px solid transparent;border-radius:var(--radius-md, 6px);cursor:pointer;text-align:left}.material-card:hover,.material-card:focus-visible{border-color:var(--accent, #3b82f6)}.material-thumb{display:block;width:100%;aspect-ratio:16 / 9;object-fit:cover;border-radius:var(--radius-sm, 4px);background:var(--surface-sunken, #131316)}.material-name{padding:0 2px 2px;font-size:var(--text-xs, 11px);color:var(--text-primary, #e7e7ea);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mesh-material-row{display:flex;align-items:center;gap:4px;min-width:0}.mesh-material-name{flex:1 1 auto;min-width:0;padding:4px 8px;background:var(--surface-sunken, #131316);border:1px solid var(--border-strong, #35353d);border-radius:var(--radius-md, 6px);color:var(--text-primary, #e7e7ea);font:inherit;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.mesh-material-clear{flex:0 0 auto;width:22px;padding:0;background:none;border:none;color:var(--text-secondary, #9a9aa5);cursor:pointer}.layer-tris{flex:0 0 auto;padding:0 4px;font-size:10px;font-variant-numeric:tabular-nums;color:var(--text-tertiary, #6b6b76)}.layer-tris.is-over-budget{color:var(--warn, #eab308)}.material-badge{position:absolute;top:4px;right:4px;padding:1px 5px;border-radius:999px;background:var(--warn, #eab308);color:#1c1c20;font-size:10px;font-weight:var(--weight-semibold, 600)}.export-dialog{display:flex;flex-direction:column;gap:10px;min-width:0}.export-row{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:30px}.export-row>span{color:var(--text-dim)}.export-note{margin:-2px 0 0;color:var(--text-faint);line-height:1.45}.export-estimate{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:6px 16px;margin:2px 0 0;padding:12px;border-radius:8px;background:var(--control)}.export-estimate dt{color:var(--text-faint)}.export-estimate dd{margin:0;min-width:0;text-align:right;font-variant-numeric:tabular-nums;overflow-wrap:anywhere}.export-progress{margin:0;color:var(--text-dim)}.export-progress.is-done{color:var(--text)}.export-progress code{word-break:break-all;color:var(--text-dim)}.export-error{margin:0;color:var(--danger-text)}.left-rail::-webkit-scrollbar,.inspector::-webkit-scrollbar,.agent-panel::-webkit-scrollbar,.dock-scroll::-webkit-scrollbar{width:10px;height:10px}.left-rail::-webkit-scrollbar-thumb,.inspector::-webkit-scrollbar-thumb,.agent-panel::-webkit-scrollbar-thumb,.dock-scroll::-webkit-scrollbar-thumb{background:#2a2a30;border:3px solid transparent;background-clip:content-box;border-radius:999px}.left-rail::-webkit-scrollbar-thumb:hover,.inspector::-webkit-scrollbar-thumb:hover,.agent-panel::-webkit-scrollbar-thumb:hover,.dock-scroll::-webkit-scrollbar-thumb:hover{background:#3a3a42;background-clip:content-box}.left-rail::-webkit-scrollbar-track,.inspector::-webkit-scrollbar-track,.agent-panel::-webkit-scrollbar-track,.dock-scroll::-webkit-scrollbar-track{background:transparent}