@dailies-studio/shot-editor 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (432) hide show
  1. package/dist/.vite/manifest.json +382 -0
  2. package/dist/assets/AgentPanel-CQejLbiX.js +2 -0
  3. package/dist/assets/AgentPanel-DJEphah0.css +1 -0
  4. package/dist/assets/AgentQuestionDialog-BqkD0kXF.js +1 -0
  5. package/dist/assets/CodeStudio-Dv4ihHpz.js +23 -0
  6. package/dist/assets/CommentsPanel-B4yhhT1T.js +1 -0
  7. package/dist/assets/ComponentLibraryRail-Ch_dsAru.js +1 -0
  8. package/dist/assets/ComponentStage-BRhRotyH.js +1 -0
  9. package/dist/assets/CurvePane-BjFVabKX.css +1 -0
  10. package/dist/assets/CurvePane-R22WzllJ.js +1 -0
  11. package/dist/assets/ExportDialog-CWLQWTmG.js +2 -0
  12. package/dist/assets/FontPicker-DWKaYL7F.js +1 -0
  13. package/dist/assets/FontPicker-v0IOIArM.css +1 -0
  14. package/dist/assets/GenerateDrawer-Bh3SqDKt.js +2 -0
  15. package/dist/assets/InsertDrawer-Ce1fod1L.js +1 -0
  16. package/dist/assets/LibraryBrowser-D9sEGz5w.js +2 -0
  17. package/dist/assets/MakeItYoursSection-CMO4319_.js +2 -0
  18. package/dist/assets/MaterialGraphCanvas-BFzl4wWR.js +23 -0
  19. package/dist/assets/MaterialGraphCanvas-BIUD59ik.css +1 -0
  20. package/dist/assets/MaterialWorkspace-CqTWqaRA.js +14 -0
  21. package/dist/assets/PreferencesDialog-CBf9_OoD.js +1 -0
  22. package/dist/assets/PresetsSection-CUEaoCVU.js +1 -0
  23. package/dist/assets/SoundHistory-BeS8EW1h.js +1 -0
  24. package/dist/assets/SoundMode-BmcZru3i.js +3 -0
  25. package/dist/assets/StockSounds-DdAUGRYK.js +1 -0
  26. package/dist/assets/TemplateFieldSection-CaeXpLFo.js +1 -0
  27. package/dist/assets/VersionHistoryPanel-CxG6XhNP.js +1 -0
  28. package/dist/assets/board-B88EPuLO.css +1 -0
  29. package/dist/assets/board-CL-he7SL.js +3 -0
  30. package/dist/assets/components-0oOSPN0l.js +1 -0
  31. package/dist/assets/googleFontRanges-gp32wJMo.js +1 -0
  32. package/dist/assets/googleFonts-BNon6M7X.js +1 -0
  33. package/dist/assets/iconsAndAliases-DL7gXP5j.js +1863 -0
  34. package/dist/assets/index-4F5NQmI8.css +1 -0
  35. package/dist/assets/index-BGHQGV5z.js +117 -0
  36. package/dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  37. package/dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  38. package/dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  39. package/dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  40. package/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  41. package/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  42. package/dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  43. package/dist/assets/libraryModel-CpIwfFha.js +1 -0
  44. package/dist/assets/lucide-6iK64tTB.js +9319 -0
  45. package/dist/assets/motionStamp-CH-Hew4E.js +1 -0
  46. package/dist/assets/takeMeasure-Tdg0TxEi.js +1 -0
  47. package/dist/assets/webmcp-BsB9gxWC.js +2 -0
  48. package/dist/index.html +34 -3
  49. package/package.json +12 -9
  50. package/src/addFamilies.ts +66 -0
  51. package/src/api.ts +1631 -55
  52. package/src/app/App.tsx +977 -198
  53. package/src/app/lazyPanel.tsx +137 -0
  54. package/src/app/lazySurfaces.tsx +203 -0
  55. package/src/audio/index.tsx +41 -10
  56. package/src/audio/meter.ts +485 -0
  57. package/src/audio/meterMath.ts +273 -0
  58. package/src/audio/meterStore.ts +155 -0
  59. package/src/audio/offlineMix.ts +289 -0
  60. package/src/audio/preview.ts +928 -118
  61. package/src/bridge.ts +15 -5
  62. package/src/bridgeTypes.ts +1611 -36
  63. package/src/channels.ts +17 -32
  64. package/src/fonts/googleFonts.ts +4 -0
  65. package/src/hostApi.ts +174 -0
  66. package/src/icons.tsx +770 -0
  67. package/src/layerWords.ts +61 -0
  68. package/src/main.tsx +56 -4
  69. package/src/panels/ResizeHandle.tsx +33 -43
  70. package/src/panels/agent/AgentDots.tsx +36 -0
  71. package/src/panels/agent/AgentPanel.tsx +119 -43
  72. package/src/panels/agent/AgentQuestionDialog.tsx +202 -0
  73. package/src/panels/agent/agent.css +113 -97
  74. package/src/panels/agent/agentGate.ts +35 -0
  75. package/src/panels/code/CodeDefaultsPanel.tsx +345 -0
  76. package/src/panels/code/CodeStudio.tsx +373 -0
  77. package/src/panels/code/FileTree.tsx +265 -0
  78. package/src/panels/code/codeBufferGuard.ts +52 -0
  79. package/src/panels/code/codeParts.tsx +321 -0
  80. package/src/panels/comments/CommentComposer.tsx +239 -0
  81. package/src/panels/comments/CommentThread.tsx +346 -0
  82. package/src/panels/comments/CommentsPanel.tsx +336 -0
  83. package/src/panels/comments/InboxButton.tsx +131 -0
  84. package/src/panels/comments/MentionMenu.tsx +98 -0
  85. package/src/panels/comments/parts.tsx +171 -0
  86. package/src/panels/export/ExportDialog.tsx +919 -96
  87. package/src/panels/export/ExportScrim.tsx +57 -0
  88. package/src/panels/files/AssetsTab.tsx +656 -0
  89. package/src/panels/files/FilePanel.tsx +1466 -216
  90. package/src/panels/files/LayerMarks.tsx +40 -0
  91. package/src/panels/files/LeftColumn.tsx +37 -0
  92. package/src/panels/files/McpSection.tsx +690 -47
  93. package/src/panels/files/MissingAssetsNotice.tsx +60 -0
  94. package/src/panels/files/assetDrag.ts +79 -0
  95. package/src/panels/files/resourceParts.tsx +255 -0
  96. package/src/panels/fonts/FontPicker.tsx +762 -0
  97. package/src/panels/fonts/faceCache.ts +207 -0
  98. package/src/panels/fonts/fontPicker.css +271 -0
  99. package/src/panels/fonts/pickerModel.ts +265 -0
  100. package/src/panels/fonts/pickerRequest.ts +46 -0
  101. package/src/panels/header/AccountAvatar.tsx +76 -0
  102. package/src/panels/header/AgentChip.tsx +77 -0
  103. package/src/panels/header/AppMenu.tsx +213 -0
  104. package/src/panels/header/Header.tsx +564 -84
  105. package/src/panels/header/HistoryControls.tsx +31 -5
  106. package/src/panels/header/PresenceStack.tsx +329 -0
  107. package/src/panels/header/ProjectTitle.tsx +232 -0
  108. package/src/panels/header/ShareButton.tsx +59 -0
  109. package/src/panels/header/StatusBadges.tsx +358 -27
  110. package/src/panels/header/SyncDeletedDialog.tsx +88 -0
  111. package/src/panels/header/ZoomControls.tsx +46 -15
  112. package/src/panels/header/agentHandoff.ts +52 -0
  113. package/src/panels/header/leave.ts +26 -0
  114. package/src/panels/help/HelpSection.tsx +189 -163
  115. package/src/panels/insert/InsertDrawer.tsx +723 -0
  116. package/src/panels/insert/iconSet.ts +109 -0
  117. package/src/panels/inspector/ExposeDot.tsx +117 -0
  118. package/src/panels/inspector/FramingRows.tsx +314 -44
  119. package/src/panels/inspector/InspectorFooter.tsx +91 -0
  120. package/src/panels/inspector/InspectorHead.tsx +425 -0
  121. package/src/panels/inspector/InspectorPanel.tsx +408 -124
  122. package/src/panels/inspector/KeyframeDot.tsx +373 -0
  123. package/src/panels/inspector/KeyframeSection.tsx +257 -0
  124. package/src/panels/inspector/MarkerSection.tsx +55 -11
  125. package/src/panels/inspector/ParamRow.tsx +84 -53
  126. package/src/panels/inspector/RightColumn.tsx +152 -0
  127. package/src/panels/inspector/TimeSection.tsx +866 -0
  128. package/src/panels/inspector/animate/EaseControl.tsx +244 -0
  129. package/src/panels/inspector/animate/PresetsSection.tsx +135 -0
  130. package/src/panels/inspector/animate/ShotSection.tsx +562 -48
  131. package/src/panels/inspector/design/AlignRow.tsx +95 -31
  132. package/src/panels/inspector/design/AppearanceSection.tsx +118 -9
  133. package/src/panels/inspector/design/ClonerSection.tsx +323 -62
  134. package/src/panels/inspector/design/ComponentSection.tsx +50 -43
  135. package/src/panels/inspector/design/CornerSection.tsx +45 -14
  136. package/src/panels/inspector/design/DefinitionProps.tsx +315 -0
  137. package/src/panels/inspector/design/DefinitionSection.tsx +136 -0
  138. package/src/panels/inspector/design/DeviceSection.tsx +210 -0
  139. package/src/panels/inspector/design/FillSection.tsx +83 -51
  140. package/src/panels/inspector/design/FontField.tsx +196 -0
  141. package/src/panels/inspector/design/HtmlSection.tsx +23 -12
  142. package/src/panels/inspector/design/InstanceSection.tsx +373 -154
  143. package/src/panels/inspector/design/MaskSection.tsx +84 -0
  144. package/src/panels/inspector/design/MaterialSection.tsx +177 -0
  145. package/src/panels/inspector/design/MediaSection.tsx +273 -120
  146. package/src/panels/inspector/design/MeshSection.tsx +910 -82
  147. package/src/panels/inspector/design/PaintRows.tsx +550 -0
  148. package/src/panels/inspector/design/PlateStyleSection.tsx +177 -0
  149. package/src/panels/inspector/design/ShadowSection.tsx +221 -48
  150. package/src/panels/inspector/design/SplineFollowSection.tsx +235 -0
  151. package/src/panels/inspector/design/StrokeSection.tsx +228 -43
  152. package/src/panels/inspector/design/TemplateFieldSection.tsx +57 -0
  153. package/src/panels/inspector/design/TransformSection.tsx +244 -50
  154. package/src/panels/inspector/design/TypographySection.tsx +679 -110
  155. package/src/panels/inspector/layout.ts +295 -0
  156. package/src/panels/inspector/propValue.ts +199 -0
  157. package/src/panels/inspector/scene/CameraSection.tsx +232 -22
  158. package/src/panels/inspector/scene/EffectsSection.tsx +722 -71
  159. package/src/panels/inspector/scene/MakeItYoursSection.tsx +180 -0
  160. package/src/panels/inspector/scene/SceneDocSection.tsx +191 -0
  161. package/src/panels/inspector/scene/SceneSection.tsx +219 -44
  162. package/src/panels/inspector/scene/TransitionSection.tsx +523 -72
  163. package/src/panels/inspector/storyboard/StoryboardReferenceSection.tsx +593 -0
  164. package/src/panels/inspector/storyboard/VideoStill.tsx +120 -0
  165. package/src/panels/inspector/timeModel.ts +190 -0
  166. package/src/panels/inspector/useDocWrite.ts +438 -146
  167. package/src/panels/library/LibraryBrowser.tsx +435 -0
  168. package/src/panels/library/LibraryGrid.tsx +190 -0
  169. package/src/panels/library/LibraryPreviewPanel.tsx +349 -0
  170. package/src/panels/library/LibraryRail.tsx +84 -0
  171. package/src/panels/library/LibrarySoundPanel.tsx +293 -0
  172. package/src/panels/library/SoundHistory.tsx +245 -0
  173. package/src/panels/library/StockSounds.tsx +390 -0
  174. package/src/panels/library/libraryModel.ts +147 -0
  175. package/src/panels/library/stockSearch.ts +77 -0
  176. package/src/panels/maskMarks.tsx +117 -0
  177. package/src/panels/material/MaterialCommentNode.tsx +54 -0
  178. package/src/panels/material/MaterialGraphCanvas.tsx +861 -0
  179. package/src/panels/material/MaterialGraphMenu.tsx +45 -0
  180. package/src/panels/material/MaterialGroupNode.tsx +56 -0
  181. package/src/panels/material/MaterialLibrary.tsx +253 -0
  182. package/src/panels/material/MaterialNode.tsx +453 -0
  183. package/src/panels/material/MaterialNodePalette.tsx +349 -0
  184. package/src/panels/material/MaterialParameterControls.tsx +525 -0
  185. package/src/panels/material/MaterialRerouteNode.tsx +42 -0
  186. package/src/panels/material/MaterialWorkspace.tsx +501 -0
  187. package/src/panels/material/NodePreview.tsx +70 -0
  188. package/src/panels/material/flowModel.ts +441 -0
  189. package/src/panels/material/parameterValues.ts +231 -0
  190. package/src/panels/material/previewScheduler.ts +235 -0
  191. package/src/panels/material/reactFlow.css +6 -0
  192. package/src/panels/material/socketGlyph.ts +85 -0
  193. package/src/panels/material/viewportMemory.ts +58 -0
  194. package/src/panels/preferences/PreferencesDialog.tsx +215 -0
  195. package/src/panels/share/ShareComponentDialog.tsx +247 -0
  196. package/src/panels/stage/StageMenu.tsx +35 -5
  197. package/src/panels/stage/StagePanel.tsx +338 -23
  198. package/src/panels/stage/cellSlots.tsx +70 -0
  199. package/src/panels/storyboard/BoardCanvas.tsx +739 -0
  200. package/src/panels/storyboard/BoardCursors.tsx +158 -0
  201. package/src/panels/storyboard/BoardDropDialog.tsx +161 -0
  202. package/src/panels/storyboard/BoardPlan.tsx +42 -0
  203. package/src/panels/storyboard/ComponentSheet.tsx +187 -0
  204. package/src/panels/storyboard/ComponentStage.tsx +235 -0
  205. package/src/panels/storyboard/MiniSketch.tsx +173 -0
  206. package/src/panels/storyboard/PartPicker.tsx +64 -0
  207. package/src/panels/storyboard/PlanPanel.tsx +617 -0
  208. package/src/panels/storyboard/ReferencePreview.tsx +217 -0
  209. package/src/panels/storyboard/ShotBrief.tsx +360 -0
  210. package/src/panels/storyboard/ShotCard.tsx +251 -0
  211. package/src/panels/storyboard/StagePreview.tsx +348 -0
  212. package/src/panels/storyboard/StillThumbs.tsx +162 -0
  213. package/src/panels/storyboard/StoryboardView.tsx +79 -0
  214. package/src/panels/storyboard/board.css +1065 -0
  215. package/src/panels/storyboard/board.ts +12 -0
  216. package/src/panels/storyboard/boardClipboard.ts +111 -0
  217. package/src/panels/storyboard/boardOrder.ts +68 -0
  218. package/src/panels/storyboard/boardRows.tsx +425 -0
  219. package/src/panels/storyboard/liveCap.ts +90 -0
  220. package/src/panels/storyboard/plan.css +295 -0
  221. package/src/panels/storyboard/posterCache.ts +133 -0
  222. package/src/panels/storyboard/shotboard/ComponentPicker.tsx +373 -0
  223. package/src/panels/storyboard/shotboard/ImagePicker.tsx +145 -0
  224. package/src/panels/storyboard/shotboard/ShotBoard.tsx +292 -0
  225. package/src/panels/storyboard/shotboard/SketchCanvas.tsx +443 -0
  226. package/src/panels/storyboard/shotboard/SketchInspector.tsx +471 -0
  227. package/src/panels/storyboard/shotboard/SketchItem.tsx +240 -0
  228. package/src/panels/storyboard/shotboard/SketchLayers.tsx +130 -0
  229. package/src/panels/storyboard/shotboard/SketchPlay.tsx +108 -0
  230. package/src/panels/storyboard/shotboard/SketchStrip.tsx +178 -0
  231. package/src/panels/storyboard/shotboard/SketchToolFooter.tsx +99 -0
  232. package/src/panels/storyboard/shotboard/sketch.css +1392 -0
  233. package/src/panels/storyboard/shotboard/sketchModel.ts +219 -0
  234. package/src/panels/storyboard/storyboardDrop.ts +164 -0
  235. package/src/panels/studio/ComponentLibraryRail.tsx +346 -0
  236. package/src/panels/studio/ComponentSidePanel.tsx +355 -0
  237. package/src/panels/studio/ComponentStudio.tsx +243 -0
  238. package/src/panels/studio/ComponentsHome.tsx +318 -0
  239. package/src/panels/studio/ComponentsPreview.tsx +179 -0
  240. package/src/panels/studio/EveryUse.tsx +244 -0
  241. package/src/panels/studio/ThisUsePanel.tsx +679 -0
  242. package/src/panels/studio/componentParts.tsx +341 -0
  243. package/src/panels/studio/components.ts +6 -0
  244. package/src/panels/studio/newCodeComponent.ts +66 -0
  245. package/src/panels/timeline/AudioFxButton.tsx +290 -0
  246. package/src/panels/timeline/AudioLane.tsx +674 -85
  247. package/src/panels/timeline/BlockRow.tsx +154 -85
  248. package/src/panels/timeline/ChannelRow.tsx +378 -129
  249. package/src/panels/timeline/CurvePane.tsx +508 -0
  250. package/src/panels/timeline/Filmstrip.tsx +361 -0
  251. package/src/panels/timeline/GenerateDrawer.tsx +407 -0
  252. package/src/panels/timeline/KeyStretch.tsx +115 -0
  253. package/src/panels/timeline/LifespanRow.tsx +730 -47
  254. package/src/panels/timeline/MarkerLane.tsx +46 -8
  255. package/src/panels/timeline/PlayButton.tsx +91 -0
  256. package/src/panels/timeline/PropertyPicker.tsx +254 -0
  257. package/src/panels/timeline/ShotRow.tsx +400 -0
  258. package/src/panels/timeline/SoundMode.tsx +1406 -0
  259. package/src/panels/timeline/TimelineDock.tsx +2338 -272
  260. package/src/panels/timeline/TransportVolume.tsx +163 -0
  261. package/src/panels/timeline/beatRuler.ts +74 -0
  262. package/src/panels/timeline/curveModel.ts +500 -0
  263. package/src/panels/timeline/duckUnderVoice.ts +68 -0
  264. package/src/panels/timeline/keyframeMenu.ts +138 -0
  265. package/src/panels/timeline/labelWidth.ts +49 -0
  266. package/src/panels/timeline/marquee.ts +155 -0
  267. package/src/panels/timeline/model.ts +1860 -199
  268. package/src/panels/timeline/snap.ts +125 -43
  269. package/src/panels/timeline/staggerPreview.tsx +92 -0
  270. package/src/panels/timeline/takeMeasure.ts +72 -0
  271. package/src/panels/timeline/useLive.ts +48 -0
  272. package/src/panels/timeline/viewport.ts +234 -0
  273. package/src/panels/toolbar/BackChip.tsx +116 -0
  274. package/src/panels/toolbar/CameraViewBar.tsx +118 -49
  275. package/src/panels/toolbar/CanvasBar.tsx +117 -0
  276. package/src/panels/toolbar/InsertButton.tsx +38 -0
  277. package/src/panels/toolbar/IsolationTrail.tsx +156 -0
  278. package/src/panels/toolbar/PanelToggles.tsx +86 -0
  279. package/src/panels/toolbar/ShadingBar.tsx +119 -26
  280. package/src/panels/toolbar/ToolDockBar.tsx +329 -80
  281. package/src/panels/toolbar/ToolFooter.tsx +102 -0
  282. package/src/panels/toolbar/ViewModeBar.tsx +247 -38
  283. package/src/panels/toolbar/WorkPlaneBar.tsx +94 -0
  284. package/src/panels/toolbar/useAddRows.tsx +326 -0
  285. package/src/panels/toolbar/useDismiss.ts +122 -0
  286. package/src/panels/versions/VersionHistoryPanel.tsx +274 -0
  287. package/src/panels/versions/versionModel.ts +103 -0
  288. package/src/panels/virtualWindow.ts +271 -0
  289. package/src/shotTokens.css +151 -60
  290. package/src/stage/FrustumGizmo.tsx +504 -84
  291. package/src/stage/GridPlane.tsx +225 -16
  292. package/src/stage/NodePreviews.tsx +628 -0
  293. package/src/stage/PerfHud.tsx +437 -47
  294. package/src/stage/SplitRenderer.tsx +816 -169
  295. package/src/stage/StageApp.tsx +4274 -486
  296. package/src/stage/StageRootBoundary.tsx +114 -0
  297. package/src/stage/StageTools.tsx +651 -151
  298. package/src/stage/TransformGizmo.tsx +696 -0
  299. package/src/stage/adaptivePresentation.ts +145 -0
  300. package/src/stage/bridgeClient.ts +2522 -41
  301. package/src/stage/exportWorker.ts +9 -0
  302. package/src/stage/feed.ts +305 -14
  303. package/src/stage/fontPreview.ts +176 -0
  304. package/src/stage/frustumGeometry.ts +319 -1
  305. package/src/stage/furnitureTokens.ts +33 -0
  306. package/src/stage/gizmoMath.ts +508 -16
  307. package/src/stage/gpuTimer.ts +276 -0
  308. package/src/stage/instanceModules.ts +194 -33
  309. package/src/stage/interactions/move.ts +24 -5
  310. package/src/stage/isolation.ts +291 -33
  311. package/src/stage/jsSelfProfiler.ts +325 -0
  312. package/src/stage/main.tsx +116 -16
  313. package/src/stage/modalState.ts +222 -23
  314. package/src/stage/moduleEpoch.ts +60 -0
  315. package/src/stage/motionPathStage.ts +279 -0
  316. package/src/stage/motionPreview.ts +74 -0
  317. package/src/stage/overlays/Overlays.tsx +1112 -159
  318. package/src/stage/overlays/Rulers.tsx +495 -0
  319. package/src/stage/panes.ts +159 -10
  320. package/src/stage/project.ts +68 -3
  321. package/src/stage/renderScaleController.ts +730 -0
  322. package/src/stage/rulers.ts +129 -0
  323. package/src/stage/sceneExtent.ts +75 -0
  324. package/src/stage/shading.ts +20 -0
  325. package/src/stage/splineStage.ts +632 -0
  326. package/src/stage/stagePerformanceTelemetry.ts +717 -0
  327. package/src/stage/stageTheme.ts +36 -0
  328. package/src/stage/stageWarmup.ts +11 -0
  329. package/src/stage/textAutoSize.ts +124 -0
  330. package/src/stage/tier1Export.ts +641 -0
  331. package/src/stage/tokenColor.ts +14 -9
  332. package/src/stage/view.ts +56 -9
  333. package/src/stage/workingView.ts +277 -33
  334. package/src/state/accountPrefs.ts +261 -0
  335. package/src/state/agentActions.ts +173 -15
  336. package/src/state/agentActivity.ts +198 -0
  337. package/src/state/agentQuestion.ts +239 -0
  338. package/src/state/bootOpen.ts +42 -0
  339. package/src/state/cameraVerbs.ts +139 -0
  340. package/src/state/clientId.ts +6 -1
  341. package/src/state/comments.ts +1099 -0
  342. package/src/state/context.tsx +19 -1
  343. package/src/state/editorPrefs.ts +220 -0
  344. package/src/state/errorReports.ts +121 -0
  345. package/src/state/fieldWrite.ts +161 -0
  346. package/src/state/fontRecents.ts +70 -0
  347. package/src/state/fonts.ts +656 -0
  348. package/src/state/graphClipboard.ts +414 -0
  349. package/src/state/imageThumbs.ts +216 -0
  350. package/src/state/insert.ts +444 -67
  351. package/src/state/isolationTrail.ts +92 -0
  352. package/src/state/keyMoves.ts +134 -0
  353. package/src/state/keyframeClipboard.ts +177 -0
  354. package/src/state/keymap.ts +1153 -117
  355. package/src/state/layoutPrefs.ts +272 -0
  356. package/src/state/layouts.ts +205 -0
  357. package/src/state/measureMedia.ts +167 -0
  358. package/src/state/menu.ts +2341 -28
  359. package/src/state/motionStamp.ts +7 -0
  360. package/src/state/panelSize.ts +375 -5
  361. package/src/state/pendingChanges.ts +119 -0
  362. package/src/state/playHold.ts +78 -0
  363. package/src/state/playbackPreparation.ts +562 -0
  364. package/src/state/posterCapture.ts +242 -0
  365. package/src/state/presence.ts +254 -0
  366. package/src/state/projectComponents.ts +160 -0
  367. package/src/state/renderEvents.ts +298 -18
  368. package/src/state/runtimeErrors.ts +46 -0
  369. package/src/state/selection.ts +12 -0
  370. package/src/state/shortcuts.ts +1606 -0
  371. package/src/state/sketchGuide.ts +51 -0
  372. package/src/state/splineRefs.ts +87 -0
  373. package/src/state/stageHealth.ts +259 -0
  374. package/src/state/stageWatchdog.ts +47 -0
  375. package/src/state/stillStage.ts +330 -0
  376. package/src/state/stillThumbs.ts +474 -0
  377. package/src/state/store.ts +23591 -2982
  378. package/src/state/storyboardModel.ts +528 -0
  379. package/src/state/sync.ts +1257 -0
  380. package/src/state/syncCache.ts +159 -0
  381. package/src/state/triangles.ts +13 -0
  382. package/src/state/types.ts +1698 -55
  383. package/src/state/unsavedGuard.ts +49 -0
  384. package/src/state/viewMode.ts +200 -0
  385. package/src/state/webmcp.ts +1128 -0
  386. package/src/state/workspace.ts +1147 -0
  387. package/src/styles/assets-tab.css +304 -0
  388. package/src/styles/canvas.css +545 -0
  389. package/src/styles/comments.css +1435 -0
  390. package/src/styles/controls.css +162 -0
  391. package/src/styles/dialogs.css +390 -0
  392. package/src/styles/insert-drawer.css +586 -0
  393. package/src/styles/inspector-board.css +207 -0
  394. package/src/styles/inspector-object.css +486 -0
  395. package/src/styles/inspector-shot.css +252 -0
  396. package/src/styles/inspector.css +360 -0
  397. package/src/styles/left-column.css +1628 -0
  398. package/src/styles/library-preview.css +575 -0
  399. package/src/styles/library.css +512 -0
  400. package/src/styles/modes/code.css +569 -0
  401. package/src/styles/modes/component.css +1561 -0
  402. package/src/styles/modes/material.css +1201 -0
  403. package/src/styles/modes/storyboard.css +518 -0
  404. package/src/styles/share-component.css +49 -0
  405. package/src/styles/shell.css +653 -0
  406. package/src/styles/shot-brief.css +360 -0
  407. package/src/styles/states.css +76 -0
  408. package/src/styles/sync.css +380 -0
  409. package/src/styles/timeline-graph.css +384 -0
  410. package/src/styles/timeline-meters.css +89 -0
  411. package/src/styles/timeline-rows.css +1959 -0
  412. package/src/styles/timeline-sound.css +1003 -0
  413. package/src/styles/timeline.css +754 -0
  414. package/src/styles/tool-footer.css +525 -0
  415. package/src/styles/topbar.css +886 -0
  416. package/src/styles/versions.css +262 -0
  417. package/src/styles.css +72 -2921
  418. package/src/tools.ts +108 -23
  419. package/dist/assets/index-B7notge7.css +0 -1
  420. package/dist/assets/index-BBE6Ta9L.js +0 -52
  421. package/src/panels/files/icons.tsx +0 -118
  422. package/src/panels/header/DocSwitcher.tsx +0 -85
  423. package/src/panels/header/TransportBar.tsx +0 -86
  424. package/src/panels/inspector/animate/BlockTiming.tsx +0 -341
  425. package/src/panels/inspector/animate/DuringBlocks.tsx +0 -85
  426. package/src/panels/inspector/animate/InOutPresets.tsx +0 -57
  427. package/src/panels/inspector/animate/ResolvedChannels.tsx +0 -150
  428. package/src/panels/inspector/animate/useBlocks.ts +0 -43
  429. package/src/panels/material/MaterialPicker.tsx +0 -172
  430. package/src/panels/timeline/SceneStrip.tsx +0 -145
  431. package/src/panels/toolbar/AddMenu.tsx +0 -230
  432. package/src/stage/MoveGizmo.tsx +0 -411
@@ -0,0 +1,1003 @@
1
+ /* ── SOUND MODE: the dock as a small DAW ──────────────────────────────────
2
+ One row per audio track, a channel strip in the sticky label column, the
3
+ film's shots as a thin reference row on top, and the mixer (or the
4
+ Generate drawer) in the right column. SoundMode.tsx and GenerateDrawer.tsx
5
+ are the markup; Paper page 26 is the picture.
6
+
7
+ Track rows are 72px: an 8px inset above and below the clip leaves the
8
+ waveform `SOUND_WAVE_H` (72 - 1 border - 16 inset - 2 clip border). The
9
+ shots row is 24px. Both are mirrored in SoundMode.tsx. */
10
+
11
+ .sound-lanes {
12
+ position: relative;
13
+ display: flex;
14
+ flex-direction: column;
15
+ }
16
+
17
+ /* Beat and bar lines. UNDER the clips: the overlay comes first in the tree
18
+ and every row after it paints over it, so a grid line never crosses a
19
+ waveform. The sticky strip column (z 4) covers it on a horizontal scroll. */
20
+ .sound-overlay {
21
+ z-index: 0;
22
+ }
23
+
24
+ .sound-beat,
25
+ .sound-bar {
26
+ position: absolute;
27
+ top: 0;
28
+ bottom: 0;
29
+ width: 1px;
30
+ background: var(--line-soft);
31
+ }
32
+
33
+ .sound-bar {
34
+ background: var(--line);
35
+ }
36
+
37
+ /* The razor's one-time hint, floating over the lanes. */
38
+ .sound-notice {
39
+ position: absolute;
40
+ top: var(--space-2);
41
+ z-index: 5;
42
+ display: flex;
43
+ align-items: center;
44
+ gap: var(--space-3);
45
+ padding: var(--space-1) var(--space-1) var(--space-1) var(--space-4);
46
+ font: var(--type-sm)/var(--leading-xs) var(--font-sans);
47
+ color: var(--ink-1);
48
+ background: var(--surface-raised);
49
+ border: 1px solid var(--line-strong);
50
+ border-radius: var(--radius-tab);
51
+ box-shadow: var(--shadow-popover);
52
+ }
53
+
54
+ .sound-notice-key {
55
+ padding: 0 var(--space-2);
56
+ font: var(--type-micro)/var(--leading-xs) var(--font-mono);
57
+ color: var(--ink-2);
58
+ background: var(--fill-rest);
59
+ border: 1px solid var(--line-strong);
60
+ border-radius: var(--radius-xs);
61
+ }
62
+
63
+ /* ── ROWS ────────────────────────────────────────────────────────────── */
64
+ .sound-row {
65
+ display: flex;
66
+ align-items: stretch;
67
+ flex: none;
68
+ border-bottom: 1px solid var(--line);
69
+ }
70
+
71
+ /* The same sticky recipe as `.audio-label-cell`: above the clips and above
72
+ the dock overlay (3), so a scrolled lane slides under the strips. */
73
+ .sound-strip-cell {
74
+ position: sticky;
75
+ left: 0;
76
+ z-index: 4;
77
+ flex: none;
78
+ display: flex;
79
+ align-items: center;
80
+ min-width: 0;
81
+ background-color: var(--surface-panel);
82
+ border-right: 1px solid var(--line);
83
+ }
84
+
85
+ .sound-shots-row {
86
+ height: 24px;
87
+ }
88
+
89
+ .sound-shots-label {
90
+ padding: 0 var(--space-6) 0 var(--space-7);
91
+ font: var(--weight-semibold) var(--type-sm)/var(--leading-xs) var(--font-sans);
92
+ letter-spacing: var(--tracking-caps);
93
+ text-transform: uppercase;
94
+ color: var(--ink-3);
95
+ }
96
+
97
+ .sound-shots {
98
+ position: relative;
99
+ flex: 1;
100
+ min-width: 0;
101
+ }
102
+
103
+ .sound-shot-pill {
104
+ position: absolute;
105
+ top: 4px;
106
+ height: 16px;
107
+ padding: 0 var(--space-3);
108
+ border: 0;
109
+ cursor: pointer;
110
+ overflow: hidden;
111
+ text-overflow: ellipsis;
112
+ white-space: nowrap;
113
+ font: var(--type-micro)/16px var(--font-sans);
114
+ color: var(--ink-3);
115
+ background: var(--fill-rest);
116
+ border-radius: var(--radius-xs);
117
+ }
118
+
119
+ .sound-shot-pill:hover {
120
+ color: var(--ink-1);
121
+ }
122
+
123
+ /* The shot under the playhead. */
124
+ .sound-shot-pill.is-current {
125
+ color: var(--accent-ink);
126
+ background: var(--accent-quiet);
127
+ }
128
+
129
+ .sound-track-row {
130
+ height: 72px;
131
+ }
132
+
133
+ .sound-add-row {
134
+ height: 32px;
135
+ }
136
+
137
+ .sound-add-track {
138
+ gap: var(--space-3);
139
+ height: var(--control-h);
140
+ margin-left: var(--space-5);
141
+ padding-inline: var(--space-3);
142
+ font: var(--type-md)/var(--leading-xs) var(--font-sans);
143
+ color: var(--ink-2);
144
+ white-space: nowrap;
145
+ }
146
+
147
+ .sound-add-track svg {
148
+ flex: none;
149
+ width: 12px;
150
+ height: 12px;
151
+ }
152
+
153
+ .sound-note {
154
+ margin: 0;
155
+ padding: var(--space-6);
156
+ font: var(--type-md)/var(--leading-xs) var(--font-sans);
157
+ color: var(--ink-3);
158
+ }
159
+
160
+ .sound-lane {
161
+ position: relative;
162
+ flex: 1;
163
+ min-width: 0;
164
+ }
165
+
166
+ .sound-lane .audio-clip {
167
+ top: var(--space-4);
168
+ bottom: var(--space-4);
169
+ border-radius: var(--radius-sm);
170
+ }
171
+
172
+ /* An empty track says what it takes, at the lane's left edge. */
173
+ .sound-empty {
174
+ position: absolute;
175
+ inset: 0;
176
+ display: flex;
177
+ align-items: center;
178
+ gap: var(--space-1);
179
+ padding-left: var(--space-6);
180
+ font: var(--type-md)/var(--leading-xs) var(--font-sans);
181
+ color: var(--ink-3);
182
+ }
183
+
184
+ .sound-empty-btn {
185
+ color: var(--ink-2);
186
+ }
187
+
188
+ /* A muted track keeps its clips on screen, dimmed and dashed, as a muted
189
+ clip is: mute is a decision the author has to see to undo. */
190
+ .sound-track-row.is-muted .audio-clip {
191
+ opacity: 0.45;
192
+ border-style: dashed;
193
+ }
194
+
195
+ /* Another track is soloed: this one is out of the mix, so it recedes. */
196
+ .sound-track-row.is-unsoloed .sound-lane,
197
+ .sound-mixer-strip.is-unsoloed {
198
+ opacity: 0.4;
199
+ }
200
+
201
+ .sound-track-row.is-over .sound-lane {
202
+ background: color-mix(in srgb, var(--audio-clip) 14%, transparent);
203
+ outline: 1px dashed var(--audio-clip);
204
+ outline-offset: -1px;
205
+ }
206
+
207
+ @media (prefers-reduced-motion: no-preference) {
208
+ .sound-track-row.is-revealed .sound-lane { animation: row-revealed 900ms var(--ease); }
209
+ }
210
+
211
+ /* ── CLIPS ───────────────────────────────────────────────────────────── */
212
+ .audio-clip.is-selected {
213
+ outline: 1px solid var(--accent);
214
+ outline-offset: -1px;
215
+ }
216
+
217
+ .audio-clip.is-selected .audio-clip-name {
218
+ color: var(--accent-ink);
219
+ }
220
+
221
+ .audio-clip-badge {
222
+ margin-left: var(--space-2);
223
+ padding: 0 var(--space-2);
224
+ font: var(--type-micro)/var(--leading-xs) var(--font-mono);
225
+ color: var(--ink-2);
226
+ background: var(--fill-rest);
227
+ border-radius: var(--radius-2xs);
228
+ }
229
+
230
+ /* A video's own sound: read-only here, so it reads as a reference. */
231
+ .audio-clip.is-video {
232
+ cursor: default;
233
+ border-style: dashed;
234
+ background: color-mix(in srgb, var(--audio-clip) 8%, transparent);
235
+ }
236
+
237
+ .audio-clip.is-video:hover {
238
+ background: color-mix(in srgb, var(--audio-clip) 8%, transparent);
239
+ }
240
+
241
+ .audio-clip-lock {
242
+ display: inline-flex;
243
+ vertical-align: -2px;
244
+ margin-right: var(--space-1);
245
+ }
246
+
247
+ .audio-clip-lock svg {
248
+ width: 11px;
249
+ height: 11px;
250
+ }
251
+
252
+ /* ── THE CHANNEL STRIP: name, M, S. Level and pan live on the mixer ──── */
253
+ .sound-strip {
254
+ flex-direction: column;
255
+ align-items: stretch;
256
+ justify-content: center;
257
+ padding: 0 var(--space-6) 0 var(--space-7);
258
+ }
259
+
260
+ .sound-strip-top {
261
+ display: flex;
262
+ align-items: center;
263
+ gap: var(--space-2);
264
+ min-width: 0;
265
+ }
266
+
267
+ /* The track's colour: every track is audio, so every dot is the clip teal. */
268
+ .sound-strip-dot {
269
+ flex: none;
270
+ width: 8px;
271
+ height: 8px;
272
+ margin-right: var(--space-2);
273
+ background: var(--audio-clip);
274
+ border-radius: var(--radius-2xs);
275
+ }
276
+
277
+ .sound-strip-name {
278
+ flex: 1;
279
+ min-width: 0;
280
+ overflow: hidden;
281
+ text-overflow: ellipsis;
282
+ white-space: nowrap;
283
+ font: var(--weight-semibold) var(--type-md)/var(--leading-xs) var(--font-sans);
284
+ color: var(--ink-1);
285
+ cursor: default;
286
+ }
287
+
288
+ .sound-strip-rename {
289
+ flex: 1;
290
+ min-width: 0;
291
+ height: 20px;
292
+ padding: 0 var(--space-2);
293
+ font: var(--weight-medium) var(--type-md)/var(--leading-xs) var(--font-sans);
294
+ color: var(--ink-1);
295
+ background: var(--surface-panel);
296
+ border: 1px solid var(--accent);
297
+ border-radius: var(--radius-xs);
298
+ outline: none;
299
+ user-select: text;
300
+ }
301
+
302
+ .sound-ms {
303
+ flex: none;
304
+ display: inline-flex;
305
+ align-items: center;
306
+ justify-content: center;
307
+ width: 20px;
308
+ height: 18px;
309
+ padding: 0;
310
+ font: var(--weight-bold) var(--type-micro)/1 var(--font-mono);
311
+ color: var(--ink-2);
312
+ background: transparent;
313
+ border: 1px solid var(--line-strong);
314
+ border-radius: var(--radius-xs);
315
+ cursor: pointer;
316
+ transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
317
+ }
318
+
319
+ .sound-ms:hover {
320
+ background: var(--fill-hover);
321
+ }
322
+
323
+ .sound-ms.is-mute.is-on {
324
+ color: var(--surface-well);
325
+ background: var(--warn);
326
+ border-color: var(--warn);
327
+ }
328
+
329
+ .sound-ms.is-solo.is-on {
330
+ color: var(--on-accent);
331
+ background: var(--accent);
332
+ border-color: var(--accent);
333
+ }
334
+
335
+ /* The mixer strip's pan knob, above its level. The master keeps the slot
336
+ empty so every strip's meters start on one line. */
337
+ .sound-pan,
338
+ .sound-pan-slot {
339
+ flex: none;
340
+ width: 18px;
341
+ height: 18px;
342
+ }
343
+
344
+ .sound-pan {
345
+ cursor: ns-resize;
346
+ touch-action: none;
347
+ border-radius: var(--radius-full);
348
+ }
349
+
350
+ .sound-pan:focus-visible {
351
+ outline: none;
352
+ box-shadow: var(--focus-ring);
353
+ }
354
+
355
+ .sound-pan circle {
356
+ fill: var(--fill-rest);
357
+ stroke: var(--line-strong);
358
+ }
359
+
360
+ .sound-pan path {
361
+ fill: none;
362
+ stroke: var(--ink-1);
363
+ stroke-width: 1.5;
364
+ stroke-linecap: round;
365
+ }
366
+
367
+ /* ── THE MIXER: the right column in Sound mode ───────────────────────── */
368
+ .sound-mixer,
369
+ .sound-gen {
370
+ grid-column: 3;
371
+ grid-row: 2;
372
+ display: flex;
373
+ flex-direction: column;
374
+ min-width: 0;
375
+ min-height: 0;
376
+ border-left: 1px solid var(--line);
377
+ }
378
+
379
+ .sound-mixer {
380
+ overflow: hidden;
381
+ }
382
+
383
+ /* "Mixer -6.2 dB peak [Duck under voice]" over the strips. */
384
+ .sound-mixer-head {
385
+ flex: none;
386
+ display: flex;
387
+ align-items: center;
388
+ gap: var(--space-4);
389
+ height: var(--panel-head-h);
390
+ padding-inline: var(--space-6);
391
+ border-bottom: 1px solid var(--line);
392
+ }
393
+
394
+ .sound-mixer-title {
395
+ flex: none;
396
+ font: var(--weight-semibold) var(--type-lg)/var(--leading-sm) var(--font-sans);
397
+ color: var(--ink-1);
398
+ }
399
+
400
+ .sound-mixer-peak {
401
+ flex: 1;
402
+ min-width: 0;
403
+ overflow: hidden;
404
+ text-overflow: ellipsis;
405
+ white-space: nowrap;
406
+ font: var(--type-sm)/var(--leading-xs) var(--font-mono);
407
+ font-variant-numeric: var(--numeric);
408
+ color: var(--ink-3);
409
+ }
410
+
411
+ .sound-solo-chip {
412
+ flex: none;
413
+ height: 20px;
414
+ margin-right: auto;
415
+ padding: 0 var(--space-3);
416
+ font: var(--weight-medium) var(--type-micro)/1 var(--font-sans);
417
+ color: var(--on-accent);
418
+ background: var(--accent);
419
+ border: 0;
420
+ border-radius: var(--radius-pill);
421
+ white-space: nowrap;
422
+ cursor: pointer;
423
+ }
424
+
425
+ /* The duck. Disabled it still reads as a button: its tooltip says what turns
426
+ it on, so the capability is never hidden. */
427
+ .sound-duck {
428
+ flex: none;
429
+ height: 24px;
430
+ padding-inline: var(--space-4);
431
+ font: var(--weight-medium) var(--type-sm)/1 var(--font-sans);
432
+ color: var(--ink-2);
433
+ white-space: nowrap;
434
+ background: var(--fill-rest);
435
+ border: 0;
436
+ border-radius: var(--radius-sm);
437
+ cursor: pointer;
438
+ transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
439
+ }
440
+
441
+ .sound-duck:hover:not(:disabled) {
442
+ color: var(--ink-1);
443
+ background: var(--fill-hover);
444
+ }
445
+
446
+ .sound-duck[aria-pressed="true"] {
447
+ color: var(--accent-ink);
448
+ background: var(--accent-quiet);
449
+ }
450
+
451
+ .sound-duck:disabled {
452
+ color: var(--ink-3);
453
+ cursor: default;
454
+ }
455
+
456
+ .sound-duck:focus-visible {
457
+ outline: none;
458
+ box-shadow: var(--focus-ring);
459
+ }
460
+
461
+ /* The strips share the column's width and fill its height. Past a handful of
462
+ tracks they keep a 46px floor and the row scrolls. */
463
+ .sound-mixer-strips {
464
+ flex: 1;
465
+ display: flex;
466
+ gap: var(--space-3);
467
+ min-height: 0;
468
+ padding: var(--space-6);
469
+ overflow-x: auto;
470
+ overflow-y: hidden;
471
+ }
472
+
473
+ .sound-mixer-strip {
474
+ flex: 1 1 0;
475
+ display: flex;
476
+ flex-direction: column;
477
+ align-items: center;
478
+ gap: var(--space-4);
479
+ min-width: 46px;
480
+ min-height: 0;
481
+ padding: var(--space-5) var(--space-2);
482
+ background: var(--surface-raised);
483
+ border: 1px solid var(--line);
484
+ border-radius: var(--radius-tab);
485
+ }
486
+
487
+ .sound-mixer-strip.is-muted .sound-mixer-body {
488
+ opacity: 0.45;
489
+ }
490
+
491
+ /* The master: the one strip the whole mix passes through. */
492
+ .sound-mixer-strip.is-master {
493
+ background: color-mix(in srgb, var(--accent) 8%, transparent);
494
+ border-color: color-mix(in srgb, var(--accent) 33%, transparent);
495
+ }
496
+
497
+ .sound-mixer-db {
498
+ font: var(--type-micro)/var(--leading-xs) var(--font-mono);
499
+ font-variant-numeric: var(--numeric);
500
+ color: var(--ink-2);
501
+ }
502
+
503
+ .sound-mixer-strip.is-master .sound-mixer-db,
504
+ .sound-mixer-strip.is-master .sound-mixer-name {
505
+ color: var(--accent-ink);
506
+ }
507
+
508
+ .sound-mixer-body {
509
+ flex: 1;
510
+ display: flex;
511
+ justify-content: center;
512
+ gap: var(--space-3);
513
+ min-height: 0;
514
+ }
515
+
516
+ .sound-mixer-ms {
517
+ display: flex;
518
+ gap: var(--space-1);
519
+ }
520
+
521
+ .sound-mixer-ms .sound-ms {
522
+ width: 18px;
523
+ height: 16px;
524
+ font-size: var(--type-micro);
525
+ }
526
+
527
+ .sound-mixer-name {
528
+ max-width: 100%;
529
+ overflow: hidden;
530
+ text-overflow: ellipsis;
531
+ white-space: nowrap;
532
+ font: var(--weight-semibold) var(--type-sm)/var(--leading-xs) var(--font-sans);
533
+ color: var(--ink-2);
534
+ }
535
+
536
+ .sound-meter-pair {
537
+ display: flex;
538
+ gap: var(--space-1);
539
+ }
540
+
541
+ .sound-meter {
542
+ position: relative;
543
+ width: 6px;
544
+ height: 100%;
545
+ overflow: hidden;
546
+ background: var(--fill-rest);
547
+ border-radius: var(--radius-2xs);
548
+ }
549
+
550
+ .sound-meter-lit {
551
+ position: absolute;
552
+ left: 0;
553
+ right: 0;
554
+ bottom: 0;
555
+ background: var(--meter-lit);
556
+ }
557
+
558
+ .sound-meter-lit.is-hot {
559
+ background: var(--warn);
560
+ }
561
+
562
+ .sound-meter-hold {
563
+ position: absolute;
564
+ left: 0;
565
+ right: 0;
566
+ height: 1px;
567
+ background: var(--ink-1);
568
+ }
569
+
570
+ /* A 20px hit column around a 4px rail. */
571
+ .sound-vfader {
572
+ position: relative;
573
+ width: 20px;
574
+ height: 100%;
575
+ cursor: ns-resize;
576
+ touch-action: none;
577
+ }
578
+
579
+ .sound-vfader::before {
580
+ content: "";
581
+ position: absolute;
582
+ top: 0;
583
+ bottom: 0;
584
+ left: 8px;
585
+ width: 4px;
586
+ background: var(--fill-rest);
587
+ border-radius: var(--radius-2xs);
588
+ }
589
+
590
+ .sound-vfader-thumb {
591
+ position: absolute;
592
+ left: 0;
593
+ width: 20px;
594
+ height: 12px;
595
+ background: var(--ink-1);
596
+ border-radius: var(--radius-2xs);
597
+ transform: translateY(50%);
598
+ }
599
+
600
+ .sound-vfader:focus-visible {
601
+ outline: 1px solid var(--accent);
602
+ outline-offset: 2px;
603
+ }
604
+
605
+ /* ── HEAD TOOLS: the BPM chip, Library and Generate ──────────────────── */
606
+ /* All three sit in the dock head at the control height and never wrap. */
607
+ .sound-head-btn {
608
+ flex: none;
609
+ height: var(--control-h);
610
+ padding-inline: var(--space-5);
611
+ white-space: nowrap;
612
+ }
613
+
614
+ /* Generate is the head's one accent verb. */
615
+ .sound-head-btn.is-accent {
616
+ color: var(--accent-ink);
617
+ background: var(--accent-soft);
618
+ }
619
+
620
+ .sound-head-btn.is-accent:hover:not(:disabled),
621
+ .sound-head-btn.is-accent[aria-pressed="true"] {
622
+ background: var(--accent-quiet);
623
+ box-shadow: inset 0 0 0 1px var(--accent);
624
+ }
625
+
626
+ .sound-head-btn svg,
627
+ .sound-bpm-chip svg {
628
+ width: 13px;
629
+ height: 13px;
630
+ flex: none;
631
+ }
632
+
633
+ .sound-bpm-chip {
634
+ flex: none;
635
+ white-space: nowrap;
636
+ display: inline-flex;
637
+ align-items: center;
638
+ gap: var(--space-3);
639
+ height: 28px;
640
+ padding: 0 var(--space-5);
641
+ font: var(--type-sm)/var(--leading-xs) var(--font-mono);
642
+ font-variant-numeric: var(--numeric);
643
+ color: var(--ink-1);
644
+ background: transparent;
645
+ border: 1px solid var(--line);
646
+ border-radius: var(--radius-tab);
647
+ cursor: pointer;
648
+ transition: background var(--dur-fast) var(--ease);
649
+ }
650
+
651
+ .sound-bpm-chip svg {
652
+ color: var(--ink-2);
653
+ }
654
+
655
+ .sound-bpm-chip:hover,
656
+ .sound-bpm-chip[aria-expanded="true"] {
657
+ background: var(--fill-hover);
658
+ }
659
+
660
+ .sound-bpm-chip.is-unset {
661
+ color: var(--ink-2);
662
+ border-style: dashed;
663
+ }
664
+
665
+ /* ── THE TEMPO POPOVER ───────────────────────────────────────────────── */
666
+ .sound-tempo {
667
+ display: flex;
668
+ flex-direction: column;
669
+ gap: var(--space-6);
670
+ width: 296px;
671
+ padding: var(--space-6);
672
+ }
673
+
674
+ .sound-tempo-head,
675
+ .sound-tempo-bpm,
676
+ .sound-tempo-field,
677
+ .sound-tempo-actions {
678
+ display: flex;
679
+ align-items: center;
680
+ gap: var(--space-4);
681
+ }
682
+
683
+ .sound-tempo-head,
684
+ .sound-tempo-field {
685
+ justify-content: space-between;
686
+ }
687
+
688
+ .sound-tempo-title {
689
+ font: var(--weight-semibold) var(--type-lg)/var(--leading-sm) var(--font-sans);
690
+ color: var(--ink-1);
691
+ }
692
+
693
+ .sound-tempo-scope,
694
+ .sound-tempo-hint {
695
+ font: var(--type-sm)/var(--leading-xs) var(--font-sans);
696
+ color: var(--ink-3);
697
+ }
698
+
699
+ .sound-tempo-input {
700
+ width: 84px;
701
+ height: 28px;
702
+ font-family: var(--font-mono);
703
+ font-variant-numeric: var(--numeric);
704
+ user-select: text;
705
+ }
706
+
707
+ .sound-tempo-unit {
708
+ font: var(--type-sm)/var(--leading-xs) var(--font-mono);
709
+ color: var(--ink-2);
710
+ }
711
+
712
+ .sound-tempo-tap {
713
+ margin-left: auto;
714
+ }
715
+
716
+ .sound-tempo-label {
717
+ display: flex;
718
+ flex-direction: column;
719
+ font: var(--type-md)/var(--leading-xs) var(--font-sans);
720
+ color: var(--ink-1);
721
+ }
722
+
723
+ .sound-tempo-seg {
724
+ display: inline-flex;
725
+ gap: var(--space-1);
726
+ padding: var(--space-1);
727
+ background: var(--surface-well);
728
+ border-radius: var(--radius-tab);
729
+ }
730
+
731
+ .sound-tempo-seg-btn {
732
+ width: 26px;
733
+ height: 22px;
734
+ padding: 0;
735
+ font: var(--type-sm)/1 var(--font-mono);
736
+ color: var(--ink-2);
737
+ background: transparent;
738
+ border: 0;
739
+ border-radius: var(--radius-sm);
740
+ cursor: pointer;
741
+ }
742
+
743
+ .sound-tempo-seg-btn:hover {
744
+ color: var(--ink-1);
745
+ }
746
+
747
+ .sound-tempo-seg-btn.is-on {
748
+ color: var(--ink-1);
749
+ background: var(--fill-selected);
750
+ }
751
+
752
+ .sound-tempo-rule {
753
+ height: 1px;
754
+ background: var(--line);
755
+ }
756
+
757
+ .sound-tempo-detect {
758
+ flex: 1;
759
+ }
760
+
761
+ .sound-tempo-warn {
762
+ margin: 0;
763
+ padding: var(--space-3) var(--space-4);
764
+ font: var(--type-sm)/var(--leading-xs) var(--font-sans);
765
+ color: var(--ink-1);
766
+ background: color-mix(in srgb, var(--warn) 8%, transparent);
767
+ border: 1px solid color-mix(in srgb, var(--warn) 33%, transparent);
768
+ border-radius: var(--radius-sm);
769
+ }
770
+
771
+ /* ── THE GENERATE DRAWER: the mixer's column, swapped ────────────────── */
772
+ .sound-gen {
773
+ overflow: hidden;
774
+ }
775
+
776
+ .sound-gen-head {
777
+ flex: none;
778
+ display: flex;
779
+ align-items: center;
780
+ gap: var(--space-4);
781
+ height: var(--panel-head-h);
782
+ padding: 0 var(--space-2) 0 var(--space-6);
783
+ border-bottom: 1px solid var(--line);
784
+ }
785
+
786
+ .sound-gen-glyph {
787
+ display: inline-flex;
788
+ color: var(--accent);
789
+ }
790
+
791
+ .sound-gen-glyph svg {
792
+ width: 14px;
793
+ height: 14px;
794
+ }
795
+
796
+ .sound-gen-title {
797
+ flex: 1;
798
+ font: var(--weight-semibold) var(--type-lg)/var(--leading-sm) var(--font-sans);
799
+ color: var(--ink-1);
800
+ }
801
+
802
+ .sound-gen-body {
803
+ flex: 1;
804
+ display: flex;
805
+ flex-direction: column;
806
+ gap: var(--space-5);
807
+ min-height: 0;
808
+ padding: var(--space-6);
809
+ overflow-y: auto;
810
+ }
811
+
812
+ .sound-gen-kinds {
813
+ flex: none;
814
+ }
815
+
816
+ .sound-gen-prompt {
817
+ flex: none;
818
+ resize: vertical;
819
+ min-height: 52px;
820
+ font: var(--type-md)/var(--leading-xs) var(--font-sans);
821
+ color: var(--ink-1);
822
+ user-select: text;
823
+ }
824
+
825
+ .sound-gen-row {
826
+ display: flex;
827
+ align-items: flex-end;
828
+ gap: var(--space-5);
829
+ }
830
+
831
+ .sound-gen-field {
832
+ display: flex;
833
+ flex-direction: column;
834
+ gap: var(--space-2);
835
+ min-width: 0;
836
+ }
837
+
838
+ .sound-gen-row .sound-gen-field {
839
+ flex: 1;
840
+ }
841
+
842
+ .sound-gen-label {
843
+ font: var(--weight-semibold) var(--type-micro)/var(--leading-xs) var(--font-sans);
844
+ letter-spacing: var(--tracking-caps);
845
+ text-transform: uppercase;
846
+ color: var(--ink-3);
847
+ }
848
+
849
+ .sound-gen-select {
850
+ width: 100%;
851
+ }
852
+
853
+ .sound-gen-seconds {
854
+ font-family: var(--font-mono);
855
+ font-variant-numeric: var(--numeric);
856
+ user-select: text;
857
+ }
858
+
859
+ .sound-gen-check {
860
+ display: flex;
861
+ align-items: center;
862
+ gap: var(--space-2);
863
+ height: var(--control-h);
864
+ font: var(--type-md)/var(--leading-xs) var(--font-sans);
865
+ color: var(--ink-2);
866
+ cursor: pointer;
867
+ }
868
+
869
+ .sound-gen-check input {
870
+ margin: 0;
871
+ accent-color: var(--accent);
872
+ }
873
+
874
+ .sound-gen-price {
875
+ font: var(--type-sm)/var(--leading-xs) var(--font-mono);
876
+ font-variant-numeric: var(--numeric);
877
+ color: var(--ink-3);
878
+ }
879
+
880
+ /* No workspace key yet: where an Owner or Admin adds one. */
881
+ .sound-gen-key-link {
882
+ color: var(--accent-ink);
883
+ text-decoration: none;
884
+ border-radius: var(--radius-xs);
885
+ }
886
+
887
+ .sound-gen-key-link:hover {
888
+ text-decoration: underline;
889
+ }
890
+
891
+ .sound-gen-key-link:focus-visible {
892
+ outline: none;
893
+ box-shadow: var(--focus-ring);
894
+ }
895
+
896
+ .sound-gen-go {
897
+ flex: none;
898
+ width: 100%;
899
+ }
900
+
901
+ .sound-gen-error {
902
+ margin: 0;
903
+ padding: var(--space-3) var(--space-4);
904
+ font: var(--type-sm)/var(--leading-xs) var(--font-sans);
905
+ color: var(--danger-ink);
906
+ background: color-mix(in srgb, var(--danger) 8%, transparent);
907
+ border: 1px solid color-mix(in srgb, var(--danger) 33%, transparent);
908
+ border-radius: var(--radius-sm);
909
+ user-select: text;
910
+ }
911
+
912
+ .sound-gen-take {
913
+ display: flex;
914
+ flex-direction: column;
915
+ gap: var(--space-4);
916
+ padding: var(--space-5);
917
+ background: var(--surface-secondary);
918
+ border: 1px solid var(--line);
919
+ border-radius: var(--radius-md);
920
+ }
921
+
922
+ .sound-gen-take-name {
923
+ overflow: hidden;
924
+ text-overflow: ellipsis;
925
+ white-space: nowrap;
926
+ font: var(--weight-medium) var(--type-md)/var(--leading-xs) var(--font-sans);
927
+ color: var(--ink-1);
928
+ }
929
+
930
+ .sound-gen-audio {
931
+ width: 100%;
932
+ height: 32px;
933
+ }
934
+
935
+ .sound-gen-take-actions {
936
+ display: flex;
937
+ flex-wrap: wrap;
938
+ gap: var(--space-3);
939
+ }
940
+
941
+ /* One take: its name, its player and its Add, the kept one first. */
942
+ .sound-gen-take-row {
943
+ display: flex;
944
+ flex-direction: column;
945
+ gap: var(--space-3);
946
+ }
947
+
948
+ .sound-gen-take-row + .sound-gen-take-row {
949
+ padding-top: var(--space-4);
950
+ border-top: 1px solid var(--line);
951
+ }
952
+
953
+ /* Why the kept take was kept, and the tone check: measured, never heard. */
954
+ .sound-gen-why {
955
+ margin: 0;
956
+ font: var(--type-sm)/var(--leading-xs) var(--font-sans);
957
+ color: var(--ink-2);
958
+ user-select: text;
959
+ }
960
+
961
+ .sound-gen-take-actions .btn:last-child {
962
+ flex: 1;
963
+ }
964
+
965
+ .sound-gen-recent {
966
+ display: flex;
967
+ flex-direction: column;
968
+ gap: var(--space-2);
969
+ }
970
+
971
+ .sound-gen-list {
972
+ margin: 0;
973
+ padding: 0;
974
+ list-style: none;
975
+ }
976
+
977
+ .sound-gen-item {
978
+ display: flex;
979
+ align-items: center;
980
+ gap: var(--space-3);
981
+ height: var(--control-h);
982
+ border-bottom: 1px solid var(--line-soft);
983
+ }
984
+
985
+ .sound-gen-item-kind {
986
+ flex: none;
987
+ font: var(--type-micro)/var(--leading-xs) var(--font-mono);
988
+ color: var(--ink-3);
989
+ }
990
+
991
+ .sound-gen-item-prompt {
992
+ flex: 1;
993
+ min-width: 0;
994
+ overflow: hidden;
995
+ text-overflow: ellipsis;
996
+ white-space: nowrap;
997
+ font: var(--type-md)/var(--leading-xs) var(--font-sans);
998
+ color: var(--ink-2);
999
+ }
1000
+
1001
+ .sound-gen-item-add {
1002
+ flex: none;
1003
+ }