@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,886 @@
1
+ /* The top bar: the app menu, the breadcrumb, history, the workspace switch, save state, Export, the Agent chip and the avatar, plus the status chip both bars wear. */
2
+
3
+ /* ---- header ------------------------------------------------------------- */
4
+ /* The top row of the grid, edge to edge, on the panel ground. Its seam is its
5
+ own bottom border.
6
+
7
+ THREE TRACKS, `1fr auto 1fr`: the workspace switch is the middle one, so it
8
+ is centred on the WINDOW whatever the two ends hold, which a flex row with
9
+ spacers only manages when both ends happen to be the same width. The ends
10
+ are `minmax(0, 1fr)` so a long Project name shrinks its own end instead of
11
+ pushing the switch off centre.
12
+
13
+ Paper's 44px bar (`--topbar-h`, 2026-10-13 design review): 12px sides and
14
+ 28px controls, so every button sits 8px off the bar's two edges. */
15
+ .shell-header {
16
+ grid-column: edge-l / edge-r;
17
+ grid-row: edge-t / main-t;
18
+ display: grid;
19
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
20
+ align-items: center;
21
+ gap: var(--space-6);
22
+ padding: 0 var(--space-6);
23
+ background: var(--surface-panel);
24
+ border-bottom: 1px solid var(--line);
25
+ }
26
+
27
+ .header-start,
28
+ .header-end {
29
+ display: flex;
30
+ align-items: center;
31
+ gap: var(--space-7);
32
+ min-width: 0;
33
+ }
34
+
35
+ .header-end {
36
+ justify-content: flex-end;
37
+ }
38
+
39
+ /* EVERY BUTTON IN THE BAR IS 28 (`--control-h`), the house 32 a step down so
40
+ the 44px bar keeps 8px above and below each one. In the header's own
41
+ context, so the house `.btn` keeps its 32 everywhere else. */
42
+ .shell-header .btn {
43
+ height: var(--control-h);
44
+ }
45
+
46
+ .shell-header .btn.is-icon {
47
+ width: var(--control-h);
48
+ }
49
+
50
+ .header-center {
51
+ display: flex;
52
+ justify-content: center;
53
+ }
54
+
55
+ /* The group divider: Paper's 1x20 hairline between the menu, the crumbs and
56
+ history. */
57
+ .header-sep {
58
+ flex: none;
59
+ width: 1px;
60
+ height: 20px;
61
+ background: var(--line);
62
+ }
63
+
64
+ /* THE APP MENU'S BUTTON carries `.btn`, so hover, disabled and the
65
+ `.is-active` fill all come from the one recipe; only its mark and caret are
66
+ styled here. NO `transform`, `filter` or `will-change` on anything in this
67
+ file: a hover lift is exactly how the stage iframe's containing block gets
68
+ broken.
69
+
70
+ Paper's workspace trigger: a 48x28 box with the mark and a caret. The mark
71
+ is `DailiesMark` in `currentColor`, so it takes the ink, never a gradient. */
72
+ .app-menu-trigger {
73
+ flex: none;
74
+ width: 48px;
75
+ gap: var(--space-2);
76
+ padding: 0 var(--space-3);
77
+ border-radius: var(--field-radius);
78
+ }
79
+
80
+ .app-menu-mark {
81
+ width: 20px;
82
+ height: 20px;
83
+ color: var(--ink-1);
84
+ }
85
+
86
+ .app-menu-caret {
87
+ display: inline-flex;
88
+ color: var(--ink-2);
89
+ }
90
+
91
+ .app-menu-caret svg {
92
+ width: 12px;
93
+ height: 12px;
94
+ display: block;
95
+ }
96
+ .app-menu-trigger.is-active .app-menu-caret {
97
+ color: inherit;
98
+ }
99
+
100
+ .project-identity {
101
+ display: flex;
102
+ align-items: center;
103
+ gap: var(--space-3);
104
+ min-width: 0;
105
+ }
106
+
107
+ /* The root crumb: a link out to the Projects dashboard, quiet until hovered. */
108
+ .project-home {
109
+ flex: none;
110
+ font-size: var(--type-lg);
111
+ color: var(--ink-2);
112
+ text-decoration: none;
113
+ border-radius: var(--radius-xs);
114
+ }
115
+
116
+ .project-home:hover {
117
+ color: var(--ink-1);
118
+ }
119
+
120
+ .project-home:focus-visible {
121
+ outline: none;
122
+ box-shadow: var(--focus-ring);
123
+ }
124
+
125
+ /* The title is the only Project mutation in the editor. Resting it directly on
126
+ the header keeps it label-like; focus reveals the inset field without moving
127
+ anything around it.
128
+
129
+ ── IT SIZES TO ITS TEXT, IT DOES NOT RESERVE 260px ──────────────────
130
+ The width was a flat `min(260px, 24vw)`, so a project called "Demo" held
131
+ the same sixth of the header as one with a sentence for a name — and with
132
+ the shot crumb after it the identity block measured 435px whatever it was
133
+ naming. `field-sizing: content` makes the box the text's width, which is
134
+ what every other label in this bar already is. The cap is what keeps a long
135
+ name from pushing the view switch into the status badges, and the floor is
136
+ what keeps an EMPTY title (mid-rename, everything selected and deleted)
137
+ from collapsing to a slit nobody can click back into. */
138
+ .project-title-input {
139
+ field-sizing: content;
140
+ width: auto;
141
+ max-width: min(200px, 18vw);
142
+ height: var(--control-h);
143
+ min-width: 56px;
144
+ padding: 0 var(--space-4);
145
+ font: inherit;
146
+ font-size: var(--type-title);
147
+ font-weight: var(--weight-medium);
148
+ color: var(--ink-1);
149
+ background: transparent;
150
+ border: 1px solid transparent;
151
+ border-radius: var(--control-radius);
152
+ text-overflow: ellipsis;
153
+ /* The hover-reveal was a hard cut while every button beside it eased. */
154
+ transition:
155
+ background var(--dur-fast) var(--ease),
156
+ border-color var(--dur-fast) var(--ease);
157
+ }
158
+
159
+ .project-title-input:hover:not(:disabled) {
160
+ background: var(--fill-rest);
161
+ }
162
+
163
+ .project-title-input:focus {
164
+ outline: none;
165
+ background: var(--fill-rest);
166
+ border-color: var(--accent);
167
+ box-shadow: var(--focus-ring);
168
+ text-overflow: clip;
169
+ }
170
+
171
+ .project-title-input:disabled {
172
+ color: var(--ink-disabled);
173
+ }
174
+
175
+
176
+ .history-controls,
177
+ .status-badges {
178
+ display: flex;
179
+ align-items: center;
180
+ gap: var(--space-2);
181
+ }
182
+
183
+ /* The 24-grid set sizes by CSS, never by attribute. */
184
+ .history-controls svg {
185
+ width: 16px;
186
+ height: 16px;
187
+ display: block;
188
+ }
189
+
190
+ /* Nothing to say is silence, not an empty slot costing the bar a gap. */
191
+ .status-badges:empty {
192
+ display: none;
193
+ }
194
+
195
+ /* The status pills: save state and a codegen warning up here, the frame rate
196
+ and the preview backend in the canvas bar (StatusBadges.tsx has both). The
197
+ chrome's own component, not the house `.badge` (a 16px tag), because these
198
+ are a row of rounded pills of one height. */
199
+ .status-chip {
200
+ display: inline-flex;
201
+ align-items: center;
202
+ height: 22px;
203
+ padding: 0 var(--space-4);
204
+ border: 1px solid var(--line);
205
+ border-radius: var(--radius-full);
206
+ font-size: var(--type-micro);
207
+ line-height: 16px;
208
+ color: var(--ink-2);
209
+ background: var(--fill-hover);
210
+ white-space: nowrap;
211
+ }
212
+
213
+ /* The digits must not reflow the bar as the rate moves between 9 and 10 or 59
214
+ and 60, which on a proportional face they would. No tone rule: the adaptive
215
+ presentation policy already ACTS on lag by stepping quality rungs, so a red
216
+ pill would be an alarm with no action attached to it. */
217
+ .status-chip-fps {
218
+ font-variant-numeric: var(--numeric);
219
+ }
220
+
221
+ .status-chip-quiet {
222
+ color: var(--ink-3);
223
+ border-color: transparent;
224
+ }
225
+
226
+ /* `saved` had no rule, so a document fully on disk wore the same weight as an
227
+ alert. It is the quietest thing the chip can say, so it gets the ambient
228
+ posture — the same one `.status-chip-quiet` gives the backend word.
229
+
230
+ ONLY `saved`. `.status-chip-saving` would be a no-op (the base pill is already
231
+ `--text-dim`, and the ellipsis carries the activity, not a pulse), and
232
+ `.status-chip-idle` is the tone SaveBadges hands "unsaved": the one state an
233
+ author must be able to catch, which is exactly the base weight. */
234
+ .status-chip-saved {
235
+ gap: var(--space-3);
236
+ padding: 0;
237
+ color: var(--ink-3);
238
+ background: transparent;
239
+ border-color: transparent;
240
+ }
241
+
242
+ /* Paper's saved state: a check and the word, no pill. */
243
+ .status-chip-saved svg {
244
+ width: 14px;
245
+ height: 14px;
246
+ display: block;
247
+ }
248
+
249
+ .status-chip-warn {
250
+ border-color: color-mix(in srgb, var(--warn) 40%, transparent);
251
+ color: var(--warn);
252
+ }
253
+
254
+ .status-chip-error {
255
+ border-color: color-mix(in srgb, var(--danger) 45%, transparent);
256
+ color: var(--danger-ink);
257
+ }
258
+
259
+ /* A badge APPEARING is the whole event — "saving…" arrives, the backend chip
260
+ lands after onReady, "unsaved" shows up on the first edit — and these now
261
+ come and go rather than sitting there permanently, so the arrival wants the
262
+ softest possible landing. Opacity only: no geometry moves, and nothing above
263
+ `.stage-frame` may take a transform. Exits stay instant; disappearing is the
264
+ quiet outcome and does not need announcing. */
265
+ @keyframes status-chip-in {
266
+ from { opacity: 0; }
267
+ }
268
+
269
+ @media (prefers-reduced-motion: no-preference) {
270
+ .status-chip { animation: status-chip-in var(--dur-fast) var(--ease); }
271
+ }
272
+
273
+
274
+ /* ---- the workspace switch ----------------------------------------------- */
275
+ /* Studio | Storyboard, Paper's centred switch: a 32 tall track with 26 tall
276
+ chips, the selected one in the quiet accent wash with an accent edge. It
277
+ is the house `.segmented.is-accent`; only the sizes are the top bar's.
278
+ The chips are centred in the track, so the 3px Paper leaves above and
279
+ below a 26 chip is the track's own arithmetic, not a literal here. */
280
+ .workspace-switch {
281
+ flex: none;
282
+ align-items: center;
283
+ height: var(--button-h);
284
+ padding: var(--space-1);
285
+ gap: var(--space-1);
286
+ border-radius: var(--radius-tab);
287
+ }
288
+
289
+ .workspace-switch .segmented-item,
290
+ .workspace-switch .segmented-item:first-child,
291
+ .workspace-switch .segmented-item:last-child {
292
+ flex: none;
293
+ height: 26px;
294
+ gap: var(--space-3);
295
+ padding: 0 var(--space-6);
296
+ font-size: var(--type-md);
297
+ border: 1px solid transparent;
298
+ border-radius: var(--radius-sm);
299
+ }
300
+
301
+ .workspace-switch .segmented-item.is-active,
302
+ .workspace-switch .segmented-item.is-active:hover:not(:disabled) {
303
+ border-color: var(--accent);
304
+ font-weight: var(--weight-semibold);
305
+ }
306
+
307
+ .workspace-switch .header-glyph {
308
+ margin-right: 0;
309
+ }
310
+
311
+ /* ---- the Agent chip ------------------------------------------------------ */
312
+ /* A `.btn` (hover, focus and the pressed fill come from the recipe): a dot,
313
+ "Agent" and the health word in the secondary ink. The dot is the state, so
314
+ the word never needs a colour: green for writes on, a quiet ink for read
315
+ only and for an unanswered probe, the warning tone for off. */
316
+ .agent-chip {
317
+ flex: none;
318
+ gap: var(--space-3);
319
+ padding: 0 var(--space-5);
320
+ }
321
+
322
+ .agent-chip[aria-expanded="true"] {
323
+ background: var(--fill-state-soft);
324
+ }
325
+
326
+ .agent-chip-dot {
327
+ flex: none;
328
+ width: 8px;
329
+ height: 8px;
330
+ border-radius: var(--radius-full);
331
+ background: var(--ink-3);
332
+ }
333
+
334
+ .agent-chip.is-write .agent-chip-dot {
335
+ background: var(--success);
336
+ }
337
+
338
+ .agent-chip.is-read .agent-chip-dot {
339
+ background: var(--ink-2);
340
+ }
341
+
342
+ .agent-chip.is-off .agent-chip-dot {
343
+ background: var(--warn);
344
+ }
345
+
346
+ .agent-chip-word {
347
+ color: var(--ink-2);
348
+ font-weight: var(--weight-regular);
349
+ }
350
+
351
+ /* Under 1280 the word gives way: the dot still says the state, and the title
352
+ and the popover say it in full. */
353
+ @media (max-width: 1279px) {
354
+ .agent-chip-word {
355
+ display: none;
356
+ }
357
+ }
358
+
359
+ /* ---- the account avatar ------------------------------------------------- */
360
+ .header-avatar {
361
+ flex: none;
362
+ width: var(--control-h);
363
+ height: var(--control-h);
364
+ margin-left: var(--space-4);
365
+ padding: 0;
366
+ font: inherit;
367
+ font-size: var(--type-md);
368
+ font-weight: var(--weight-semibold);
369
+ color: var(--ink-1);
370
+ background: var(--fill-rest);
371
+ border: 0;
372
+ border-radius: var(--radius-full);
373
+ cursor: pointer;
374
+ }
375
+
376
+ .header-avatar:hover {
377
+ background: var(--fill-hover);
378
+ }
379
+
380
+ .header-avatar:focus-visible {
381
+ outline: none;
382
+ box-shadow: var(--focus-ring);
383
+ }
384
+
385
+ /* A guest in this workspace: a text note, not a control, so it reads the
386
+ same to a screen reader and needs no colour to mean anything. */
387
+ .header-guest {
388
+ flex: none;
389
+ margin-left: var(--space-4);
390
+ padding: var(--space-1) var(--space-3);
391
+ font-size: var(--type-md);
392
+ font-weight: var(--weight-medium);
393
+ color: var(--ink-2);
394
+ border: 1px solid var(--line);
395
+ border-radius: var(--radius-full);
396
+ }
397
+
398
+
399
+ /* ---- the header's breadcrumb -------------------------------------------- */
400
+ /* The way back, visible from any panel state — including a collapsed rail and
401
+ a collapsed dock, which is exactly when the other three heads are gone. */
402
+ /* A `.btn`, so a filled chip like every control in the bar; this only keeps
403
+ a long title inside it. */
404
+ /* THE SHOT CRUMB GIVES WAY FIRST. Flex shrinks by basis, so a long shot name
405
+ (220px) used to take the room and leave the Project title at "Do…". The
406
+ crumb shrinks four times faster and stops at a few letters plus its caret.
407
+ 56px with 8px sides, so a squeezed crumb still shows a letter and its
408
+ ellipsis, and the title and the crumb still fit a 1024 window without
409
+ running into the history buttons. */
410
+ .project-crumb {
411
+ flex-shrink: 4;
412
+ min-width: 56px;
413
+ padding: 0 var(--space-4);
414
+ max-width: 220px;
415
+ overflow: hidden;
416
+ text-overflow: ellipsis;
417
+ }
418
+
419
+ /* Under 1280 the bar cannot fit the root crumb and a readable title: drop the
420
+ root crumb, since the app menu's "Go to Projects" row is the same exit, and
421
+ tighten the groups from 16 to 8. */
422
+ @media (max-width: 1279px) {
423
+ .header-start,
424
+ .header-end {
425
+ gap: var(--space-4);
426
+ }
427
+
428
+ .project-home,
429
+ .project-home + .project-crumb-sep {
430
+ display: none;
431
+ }
432
+ }
433
+
434
+ .project-crumb svg {
435
+ flex: none;
436
+ width: 12px;
437
+ height: 12px;
438
+ opacity: 0.7;
439
+ }
440
+
441
+ .project-crumb-menu {
442
+ display: flex;
443
+ flex-direction: column;
444
+ gap: 1px;
445
+ padding: var(--space-2);
446
+ min-width: 180px;
447
+ max-height: 320px;
448
+ overflow: auto;
449
+ }
450
+
451
+ .project-crumb-item {
452
+ display: flex;
453
+ align-items: center;
454
+ gap: var(--space-2);
455
+ font: inherit;
456
+ text-align: left;
457
+ color: var(--ink-1);
458
+ background: transparent;
459
+ border: 0;
460
+ border-radius: var(--radius-xs);
461
+ padding: var(--space-2);
462
+ cursor: pointer;
463
+ white-space: nowrap;
464
+ }
465
+
466
+ .project-crumb-item:hover {
467
+ background: var(--fill-rest);
468
+ }
469
+
470
+ .project-crumb-item.is-current {
471
+ color: var(--accent-ink);
472
+ }
473
+
474
+ .project-crumb-item:disabled {
475
+ color: var(--ink-3);
476
+ background: transparent;
477
+ cursor: default;
478
+ }
479
+
480
+ .project-crumb-item svg {
481
+ flex: none;
482
+ width: 14px;
483
+ height: 14px;
484
+ color: var(--ink-2);
485
+ }
486
+
487
+ .project-crumb-sep {
488
+ display: inline-flex;
489
+ flex: none;
490
+ color: var(--ink-3);
491
+ user-select: none;
492
+ }
493
+
494
+ .project-crumb-sep svg {
495
+ width: 12px;
496
+ height: 12px;
497
+ display: block;
498
+ }
499
+
500
+ /* ---- re-homed here from other region files (the component that renders
501
+ these lives in this region) ------------------------------------------ */
502
+
503
+ .header-glyph svg {
504
+ width: 16px;
505
+ height: 16px;
506
+ display: block;
507
+ }
508
+
509
+ .header-glyph {
510
+ display: inline-flex;
511
+ margin-right: var(--space-2);
512
+ }
513
+
514
+ /* The percentage is already in the label; this puts it in the BUTTON, so the
515
+ render's progress is legible at a glance from across the room instead of
516
+ only by reading a number that ticks.
517
+
518
+ Two stops off the SAME accent, never a second hue: this is still the one
519
+ primary control on the surface, showing its own state. `--export-pct` is set
520
+ inline by ExportButton (0-100, unitless, so `calc()` can take a percentage
521
+ of it). The chrome layer sits above the house `.btn.is-primary:hover`, so
522
+ the fill holds under the cursor without borrowing the widget's classes. */
523
+ /* Paper's Export: 28 tall, radius 8, a download glyph, flat. */
524
+ .header-export {
525
+ flex: none;
526
+ height: var(--control-h);
527
+ gap: var(--space-3);
528
+ padding: 0 var(--space-6);
529
+ border-radius: var(--radius-tab);
530
+ box-shadow: none;
531
+ }
532
+
533
+ .header-export .header-glyph {
534
+ margin-right: 0;
535
+ }
536
+
537
+ /* Share (ShareButton.tsx): Export's size, the quiet house button. */
538
+ .header-share {
539
+ flex: none;
540
+ height: var(--control-h);
541
+ gap: var(--space-3);
542
+ padding: 0 var(--space-6);
543
+ border-radius: var(--radius-tab);
544
+ }
545
+
546
+ .header-export.is-running {
547
+ font-variant-numeric: var(--numeric);
548
+ background: linear-gradient(
549
+ to right,
550
+ var(--accent-hover) calc(var(--export-pct, 0) * 1%),
551
+ var(--accent) 0
552
+ );
553
+ }
554
+
555
+ /* WHO ELSE IS HERE (Paper page 21): 30px faces in each person's peer colour,
556
+ ringed in the bar's own colour so an overlap reads as two faces, stepping
557
+ 24px. Three faces, then "+N". */
558
+ .presence-stack {
559
+ position: relative;
560
+ display: flex;
561
+ flex: none;
562
+ align-items: center;
563
+ padding-left: var(--space-3);
564
+ }
565
+
566
+ .presence-face {
567
+ position: relative;
568
+ display: inline-grid;
569
+ flex: none;
570
+ place-items: center;
571
+ width: 30px;
572
+ height: 30px;
573
+ margin-left: calc(-1 * var(--space-3));
574
+ padding: 0;
575
+ font: inherit;
576
+ font-family: var(--font-sans);
577
+ font-size: var(--type-sm);
578
+ font-weight: 600;
579
+ line-height: 14px;
580
+ color: #0b0b0b;
581
+ border: 2px solid #080808;
582
+ border-radius: var(--radius-full);
583
+ cursor: pointer;
584
+ }
585
+
586
+ .presence-face > img {
587
+ width: 100%;
588
+ height: 100%;
589
+ border-radius: inherit;
590
+ object-fit: cover;
591
+ }
592
+
593
+ .presence-face:focus-visible {
594
+ outline: none;
595
+ box-shadow: var(--focus-ring);
596
+ }
597
+
598
+ .presence-face-agent {
599
+ cursor: default;
600
+ }
601
+
602
+ .presence-more {
603
+ color: #b5b5b5;
604
+ background: #1c1c1c;
605
+ cursor: default;
606
+ }
607
+
608
+ /* The hover card: who, where, and how to follow. */
609
+ .presence-card {
610
+ position: absolute;
611
+ top: calc(100% + var(--space-4));
612
+ right: calc(-1 * var(--space-4));
613
+ z-index: var(--z-menu);
614
+ display: flex;
615
+ flex-direction: column;
616
+ gap: var(--space-5);
617
+ width: 280px;
618
+ padding: var(--space-6);
619
+ font-family: var(--font-sans);
620
+ font-size: var(--type-md);
621
+ font-weight: 500;
622
+ line-height: 16px;
623
+ color: var(--ink-1);
624
+ text-align: left;
625
+ white-space: nowrap;
626
+ cursor: default;
627
+ background: #1c1c1c;
628
+ border: 1px solid #3d3d3d;
629
+ border-radius: var(--radius-md);
630
+ box-shadow: var(--shadow-menu, 0 8px 24px rgb(0 0 0 / 40%));
631
+ }
632
+
633
+ .presence-card-who {
634
+ display: flex;
635
+ gap: var(--space-5);
636
+ align-items: center;
637
+ }
638
+
639
+ .presence-card-avatar {
640
+ display: inline-grid;
641
+ flex: none;
642
+ place-items: center;
643
+ width: 32px;
644
+ height: 32px;
645
+ overflow: hidden;
646
+ font-size: var(--type-md);
647
+ font-weight: 600;
648
+ color: #0b0b0b;
649
+ border-radius: var(--radius-full);
650
+ }
651
+
652
+ .presence-card-avatar > img {
653
+ width: 100%;
654
+ height: 100%;
655
+ object-fit: cover;
656
+ }
657
+
658
+ .presence-card-name {
659
+ display: flex;
660
+ flex-direction: column;
661
+ min-width: 0;
662
+ font-size: var(--type-lg);
663
+ font-weight: 600;
664
+ }
665
+
666
+ .presence-card-role {
667
+ font-size: var(--type-md);
668
+ font-weight: 500;
669
+ color: var(--ink-3);
670
+ }
671
+
672
+ .presence-card-where {
673
+ display: flex;
674
+ gap: var(--space-3);
675
+ align-items: center;
676
+ min-width: 0;
677
+ color: var(--ink-2);
678
+ }
679
+
680
+ .presence-card-number {
681
+ font-family: var(--font-mono);
682
+ color: var(--ink-3);
683
+ }
684
+
685
+ .presence-card-shot,
686
+ .presence-card-layer {
687
+ overflow: hidden;
688
+ text-overflow: ellipsis;
689
+ }
690
+
691
+ .presence-card-slash {
692
+ color: var(--ink-3);
693
+ }
694
+
695
+ .presence-card-swatch {
696
+ flex: none;
697
+ width: 8px;
698
+ height: 8px;
699
+ border: 1.5px solid;
700
+ border-radius: var(--radius-2xs);
701
+ }
702
+
703
+ .presence-card-foot {
704
+ display: flex;
705
+ justify-content: space-between;
706
+ padding-top: var(--space-5);
707
+ font-size: var(--type-sm);
708
+ color: var(--ink-3);
709
+ border-top: 1px solid var(--line);
710
+ }
711
+
712
+ /* FOLLOWING: the whole editor framed in the followed person's colour, and a
713
+ pill at the top centre that says whose view this is and how to leave it.
714
+ Neither takes a click. */
715
+ .presence-follow-frame {
716
+ position: fixed;
717
+ inset: 0;
718
+ z-index: var(--z-menu);
719
+ pointer-events: none;
720
+ border: 2px solid;
721
+ }
722
+
723
+ .presence-follow-pill {
724
+ position: fixed;
725
+ top: 72px;
726
+ left: 50%;
727
+ z-index: var(--z-menu);
728
+ display: flex;
729
+ gap: var(--space-4);
730
+ align-items: center;
731
+ padding: var(--space-3) var(--space-6);
732
+ font-family: var(--font-sans);
733
+ font-size: var(--type-md);
734
+ font-weight: 600;
735
+ color: var(--ink-1);
736
+ pointer-events: none;
737
+ background: #1c1c1c;
738
+ border: 1px solid #3d3d3d;
739
+ border-radius: var(--radius-full);
740
+ transform: translateX(-50%);
741
+ }
742
+
743
+ .presence-follow-dot {
744
+ width: 8px;
745
+ height: 8px;
746
+ border-radius: var(--radius-full);
747
+ }
748
+
749
+ /* An MCP agent editing the Project as a whole: the follow frame in the Agent's
750
+ colour, breathing so it reads as work in progress, not a mode. */
751
+ .presence-follow-frame.is-agent {
752
+ border-color: var(--agent);
753
+ border-style: dashed;
754
+ }
755
+
756
+ @media (prefers-reduced-motion: no-preference) {
757
+ .presence-follow-frame.is-agent {
758
+ animation: agent-frame-breathe 1.6s ease-in-out infinite;
759
+ }
760
+ }
761
+
762
+ @keyframes agent-frame-breathe {
763
+ 50% {
764
+ opacity: 0.4;
765
+ }
766
+ }
767
+
768
+ /* WHAT THE AGENT IS DOING: its step beside its face, and Follow. One line, it
769
+ ellipses before it pushes the bar. */
770
+ .agent-status-chip {
771
+ display: inline-flex;
772
+ flex: 0 1 auto;
773
+ gap: var(--space-3);
774
+ align-items: center;
775
+ min-width: 0;
776
+ max-width: 320px;
777
+ height: 24px;
778
+ margin-right: var(--space-4);
779
+ padding: 0 var(--space-2) 0 var(--space-4);
780
+ font-size: var(--type-sm);
781
+ color: var(--ink-2);
782
+ border: 1px solid var(--line);
783
+ border-radius: var(--radius-full);
784
+ }
785
+
786
+ .agent-status-text {
787
+ min-width: 0;
788
+ overflow: hidden;
789
+ text-overflow: ellipsis;
790
+ white-space: nowrap;
791
+ }
792
+
793
+ .agent-status-name {
794
+ color: var(--ink-1);
795
+ font-weight: var(--weight-semibold);
796
+ }
797
+
798
+ .agent-status-dot {
799
+ flex: none;
800
+ width: 6px;
801
+ height: 6px;
802
+ background: var(--agent);
803
+ border-radius: var(--radius-full);
804
+ }
805
+
806
+ .agent-status-follow {
807
+ flex: none;
808
+ height: 18px;
809
+ padding: 0 var(--space-3);
810
+ font: inherit;
811
+ font-weight: var(--weight-semibold);
812
+ color: var(--ink-1);
813
+ cursor: pointer;
814
+ background: var(--fill-rest);
815
+ border: 0;
816
+ border-radius: var(--radius-full);
817
+ }
818
+
819
+ .agent-status-follow:hover,
820
+ .agent-status-follow:focus-visible {
821
+ background: var(--fill-hover);
822
+ }
823
+
824
+ /* THE AGENT'S DOTS: three 4px dots in its colour, rising in turn while it
825
+ works (still for reduced motion). Shared by the chip, the component card,
826
+ the code tab and the layer row. */
827
+ .agent-dots {
828
+ display: inline-flex;
829
+ flex: none;
830
+ gap: var(--space-1);
831
+ align-items: center;
832
+ margin-left: var(--space-2);
833
+ vertical-align: middle;
834
+ }
835
+
836
+ .agent-dots > span {
837
+ width: 4px;
838
+ height: 4px;
839
+ background: var(--agent);
840
+ border-radius: var(--radius-full);
841
+ }
842
+
843
+ @media (prefers-reduced-motion: no-preference) {
844
+ .agent-dots > span {
845
+ animation: agent-dot 1.2s ease-in-out infinite;
846
+ }
847
+
848
+ .agent-dots > span:nth-child(2) {
849
+ animation-delay: 0.15s;
850
+ }
851
+
852
+ .agent-dots > span:nth-child(3) {
853
+ animation-delay: 0.3s;
854
+ }
855
+ }
856
+
857
+ @keyframes agent-dot {
858
+ 0%,
859
+ 60%,
860
+ 100% {
861
+ opacity: 0.35;
862
+ transform: translateY(0);
863
+ }
864
+
865
+ 30% {
866
+ opacity: 1;
867
+ transform: translateY(-2px);
868
+ }
869
+ }
870
+
871
+ /* A person's place on a row or a frame card: a 6px dot in their colour after
872
+ the label. Shared by the strip, the Layers rows and the timeline rows. */
873
+ .peer-dots {
874
+ display: inline-flex;
875
+ flex: none;
876
+ gap: var(--space-1);
877
+ align-items: center;
878
+ margin-left: var(--space-3);
879
+ vertical-align: middle;
880
+ }
881
+
882
+ .peer-dot {
883
+ width: 6px;
884
+ height: 6px;
885
+ border-radius: var(--radius-full);
886
+ }