@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,1201 @@
1
+ /* The material nodes: the graph and the object's hole in the canvas cell, the Project's graphs in the left column, the way back and the graph's verbs in the canvas bar, then the node cards, the source view and the setup screen. */
2
+
3
+ /* ---- the material nodes -------------------------------------------------- */
4
+ /* A SHADER IS THE WORK, FOR AS LONG AS YOU ARE DOING IT, so the graph takes
5
+ * the canvas. It lives in the docked frame like every mode (cellSlots.tsx):
6
+ * the Project's graphs in the left column's mode slot, the graph and the
7
+ * object in the canvas cell, the way back and the graph's verbs in the canvas
8
+ * bar. The inspector shows the material's own rows and the timeline stays
9
+ * under the graph, so an exposed control can be keyed and scrubbed against.
10
+ * Nothing here hides a cell and nothing here floats.
11
+ *
12
+ * ── HOW THE OBJECT IS STILL THE REAL ONE ────────────────────────────────
13
+ *
14
+ * The preview is not a picture of the mesh, it IS the mesh: the stage iframe
15
+ * is pinned `inset: 0` behind the shell and keeps rendering the isolated
16
+ * layer, which is what makes "preview === export" hold here as everywhere
17
+ * else. So the right of the canvas cell is a HOLE (`.stage-window`,
18
+ * shell.css): it paints nothing and takes no pointer, and `measureInset` hands
19
+ * the stage its rect as the box to frame into. */
20
+
21
+ /* ---- the canvas cell ------------------------------------------------------- */
22
+ /* The cell's one row: the graph, then the hole. TRANSPARENT and pointer-less,
23
+ the canvas cell's own recipe, because its box spans the hole: hit testing
24
+ follows the box, so a press over the object would land here and the drag
25
+ that orbits it (StageApp's `orbits`) would never reach the stage. The graph
26
+ opts back in; the hole stays out.
27
+
28
+ THE HOLE'S WIDTH is the stored preview width (`--material-col-w`, which App
29
+ writes from `materialColumnWidth`), never more than half the cell. The hole
30
+ and the seam's handle read the one variable, and both resolve its 50%
31
+ against this box (the hole's containing block, and the handle's), so the
32
+ edge the author grabs and the edge they see cannot part. */
33
+ .material-workspace {
34
+ --material-preview-w: min(var(--material-col-w, 560px), 50%);
35
+ --material-grid-dot: var(--line);
36
+ position: relative;
37
+ flex: 1 1 auto;
38
+ display: flex;
39
+ min-width: 0;
40
+ min-height: 0;
41
+ pointer-events: none;
42
+ }
43
+
44
+ /* The graph paints its own ground and takes the pointer. Its right border is
45
+ the seam, one hairline against the hole. */
46
+ .material-graph-region {
47
+ position: relative;
48
+ flex: 1 1 auto;
49
+ min-width: 0;
50
+ min-height: 0;
51
+ background: var(--surface-app);
52
+ border-right: 1px solid var(--line);
53
+ pointer-events: auto;
54
+ }
55
+
56
+ /* The compile error strip (`.code-studio-strip`, modes/code.css) over the top
57
+ of the graph, which fills the region absolutely. Above React Flow's own
58
+ panels, below the node palette. */
59
+ .material-graph-region > .code-studio-strip {
60
+ position: absolute;
61
+ inset: 0 0 auto;
62
+ z-index: 6;
63
+ overflow-wrap: anywhere;
64
+ }
65
+
66
+ /* THE HOLE. No background, no backdrop, nothing: anything opaque here,
67
+ including a "subtle" tint, is a lid on the only live thing on screen. The
68
+ material's own fields are inspector rows, so the hole is the whole right of
69
+ the cell: a shader editor shows the shader and the thing it is on. */
70
+ .material-preview-hole {
71
+ flex: none;
72
+ width: var(--material-preview-w);
73
+ min-width: 0;
74
+ }
75
+
76
+ /* THE SEAM'S HANDLE: 8px centred on the hole's left edge, which is the
77
+ graph's border, from the right like the hole. It paints only on hover and
78
+ is the one thing over the hole's edge that takes a pointer. A local order
79
+ inside the canvas cell: over the graph, under the node palette (8). */
80
+ .material-workspace-resize {
81
+ position: absolute;
82
+ top: 0;
83
+ bottom: 0;
84
+ right: var(--material-preview-w);
85
+ z-index: 3;
86
+ width: 8px;
87
+ margin-right: calc(-1 * var(--space-2));
88
+ cursor: col-resize;
89
+ touch-action: none;
90
+ pointer-events: auto;
91
+ background: transparent;
92
+ transition: background var(--dur-fast) var(--ease);
93
+ }
94
+
95
+ .material-workspace-resize:hover {
96
+ background: var(--accent-soft);
97
+ }
98
+
99
+ /* ---- the canvas bar ---------------------------------------------------------- */
100
+ /* The bar slot's whole row, laid out like the canvas bar: the way out, the
101
+ trail, the slot and the compile status lead, and the TSL toggle, the graph's
102
+ zoom and Recenter are pushed right. The trail is the part that gives; no
103
+ control shrinks. */
104
+ .material-bar {
105
+ flex: 1 1 auto;
106
+ display: flex;
107
+ align-items: center;
108
+ gap: var(--canvas-bar-gap);
109
+ min-width: 0;
110
+ height: 100%;
111
+ }
112
+
113
+ /* The back chip's look with only its chevron, so the inset is even on both
114
+ sides. Two classes, so it outranks `.back-chip` on specificity. */
115
+ .back-chip.material-back {
116
+ flex: none;
117
+ padding: 0 var(--space-2);
118
+ }
119
+
120
+ /* The trail: Project › Shot › Mesh › Material › functions. The last crumb is
121
+ where you are, the ones before it are one click away. One line that
122
+ ellipsizes each rung. */
123
+ .material-workspace-crumbs {
124
+ display: flex;
125
+ align-items: center;
126
+ gap: var(--space-1);
127
+ min-width: 0;
128
+ overflow: hidden;
129
+ white-space: nowrap;
130
+ font-size: var(--type-sm);
131
+ }
132
+
133
+ .material-bar > .material-workspace-crumbs {
134
+ flex: 0 1 auto;
135
+ }
136
+
137
+ .material-workspace-crumbs .crumb {
138
+ flex: 0 1 auto;
139
+ min-width: 0;
140
+ max-width: 180px;
141
+ padding: var(--space-1) var(--space-2);
142
+ border: 0;
143
+ border-radius: var(--radius-xs);
144
+ background: transparent;
145
+ color: var(--ink-2);
146
+ overflow: hidden;
147
+ text-overflow: ellipsis;
148
+ white-space: nowrap;
149
+ cursor: pointer;
150
+ }
151
+
152
+ .material-workspace-crumbs .crumb + .crumb::before {
153
+ content: "›";
154
+ margin-right: var(--space-2);
155
+ color: var(--ink-3);
156
+ }
157
+
158
+ .material-workspace-crumbs .crumb:hover {
159
+ color: var(--ink-1);
160
+ }
161
+
162
+ .material-workspace-crumbs .crumb.is-current {
163
+ color: var(--ink-1);
164
+ cursor: default;
165
+ }
166
+
167
+ .material-slot-picker {
168
+ flex: none;
169
+ min-width: 132px;
170
+ }
171
+
172
+ .material-compile-status,
173
+ .material-add-parameter {
174
+ display: flex;
175
+ align-items: center;
176
+ }
177
+
178
+ .material-compile-status {
179
+ flex: none;
180
+ gap: var(--space-2);
181
+ padding: 0 var(--space-2);
182
+ color: var(--ink-2);
183
+ font-size: var(--type-micro);
184
+ white-space: nowrap;
185
+ }
186
+
187
+ .material-compile-status > span {
188
+ width: 6px;
189
+ height: 6px;
190
+ border-radius: var(--radius-full);
191
+ background: var(--ink-3);
192
+ }
193
+
194
+ .material-compile-status.is-error {
195
+ color: var(--danger-ink);
196
+ }
197
+
198
+ .material-compile-status.is-error > span {
199
+ background: var(--danger);
200
+ }
201
+
202
+ .material-compile-status.is-compiling > span {
203
+ background: var(--accent);
204
+ }
205
+
206
+ .material-bar-end {
207
+ flex: none;
208
+ display: flex;
209
+ align-items: center;
210
+ gap: var(--canvas-bar-gap);
211
+ margin-left: auto;
212
+ }
213
+
214
+ /* The graph canvas portals its zoom in here (MaterialGraphCanvas.tsx). The
215
+ slot is no box of its own, so while the graph is off screen (the TSL view,
216
+ the canvas still loading) it costs the bar no gap. */
217
+ .material-zoom-slot {
218
+ display: contents;
219
+ }
220
+
221
+ /* ---- the library, in the left column ---------------------------------------- */
222
+ /* The slot's one flexible row (left-column.css), bounded down to the list's
223
+ `.rail-scroll` so the list scrolls inside the column. */
224
+ .material-library {
225
+ flex: 1 1 0;
226
+ min-height: 0;
227
+ display: flex;
228
+ flex-direction: column;
229
+ }
230
+
231
+ /* THE COLUMN HEAD, one panel head tall with its hairline, so its bottom edge
232
+ runs on with the canvas bar's and the right column head's. */
233
+ .material-library-head {
234
+ flex: none;
235
+ display: flex;
236
+ align-items: center;
237
+ height: var(--panel-head-h);
238
+ padding: 0 var(--space-6);
239
+ border-bottom: 1px solid var(--line);
240
+ }
241
+
242
+ .material-library-title {
243
+ flex: 1;
244
+ min-width: 0;
245
+ margin: 0;
246
+ font-size: var(--type-md);
247
+ font-weight: var(--weight-semibold);
248
+ color: var(--ink-1);
249
+ white-space: nowrap;
250
+ overflow: hidden;
251
+ text-overflow: ellipsis;
252
+ }
253
+
254
+ /* A group's name: caps micro in the third ink, inset like the rows. */
255
+ .material-library-group {
256
+ margin: 0;
257
+ padding: var(--space-5) var(--space-6) var(--space-2);
258
+ font-size: var(--type-micro);
259
+ font-weight: var(--weight-semibold);
260
+ letter-spacing: var(--tracking-caps);
261
+ line-height: var(--leading-tight);
262
+ text-transform: uppercase;
263
+ color: var(--ink-3);
264
+ }
265
+
266
+ /* The inspector's one empty state, inset like every row of the column. */
267
+ .material-library .insp-empty {
268
+ padding: var(--space-1) var(--space-6) var(--space-3);
269
+ }
270
+
271
+ .material-library-list {
272
+ margin: 0;
273
+ padding: 0;
274
+ list-style: none;
275
+ }
276
+
277
+ /* FULL-BLEED ROWS, the column's: hover one fill step, the graph on the canvas
278
+ the accent band with its name in accent ink. The current row carries a
279
+ `:hover` twin so it outranks the hover by a class. */
280
+ .material-saved-row {
281
+ display: flex;
282
+ align-items: stretch;
283
+ }
284
+
285
+ .material-saved-row:hover {
286
+ background: var(--fill-hover);
287
+ }
288
+
289
+ .material-saved-row.is-current,
290
+ .material-saved-row.is-current:hover {
291
+ background: var(--accent-soft);
292
+ }
293
+
294
+ .material-saved-row.is-current strong {
295
+ color: var(--accent-ink);
296
+ }
297
+
298
+ .material-saved-apply {
299
+ flex: 1 1 auto;
300
+ min-width: 0;
301
+ min-height: var(--row-h);
302
+ display: grid;
303
+ grid-template-columns: 18px minmax(0, 1fr);
304
+ align-items: center;
305
+ gap: var(--space-3);
306
+ padding: var(--space-2) var(--space-2) var(--space-2) var(--space-6);
307
+ color: var(--ink-1);
308
+ background: transparent;
309
+ border: 0;
310
+ text-align: left;
311
+ cursor: pointer;
312
+ }
313
+
314
+ /* A row a press would not change (MaterialLibrary.tsx): the graph on the
315
+ canvas, or the one the whole model already wears. It stays focusable, so
316
+ its name and title still read; it just offers no press. */
317
+ .material-saved-apply[aria-disabled="true"] {
318
+ cursor: default;
319
+ }
320
+
321
+ /* Inset, because the rows run edge to edge in a column that clips. */
322
+ .material-saved-apply:focus-visible,
323
+ .material-saved-delete:focus-visible {
324
+ outline: none;
325
+ box-shadow: inset 0 0 0 var(--ring-width) var(--ring-color);
326
+ }
327
+
328
+ .material-saved-text {
329
+ display: flex;
330
+ flex-direction: column;
331
+ gap: var(--space-1);
332
+ min-width: 0;
333
+ }
334
+
335
+ .material-saved-text strong {
336
+ overflow: hidden;
337
+ text-overflow: ellipsis;
338
+ white-space: nowrap;
339
+ font-size: var(--type-md);
340
+ font-weight: var(--weight-medium);
341
+ }
342
+
343
+ .material-saved-text small {
344
+ overflow: hidden;
345
+ text-overflow: ellipsis;
346
+ white-space: nowrap;
347
+ color: var(--ink-3);
348
+ font-size: var(--type-micro);
349
+ line-height: var(--leading-tight);
350
+ }
351
+
352
+ /* The mark or the orb sits centred in the row's 18px icon column; the orb is
353
+ drawn for a card and comes down to the icon size here. */
354
+ .material-saved-apply > .material-model-mark,
355
+ .material-saved-apply > .material-starter-orb {
356
+ justify-self: center;
357
+ }
358
+
359
+ .material-saved-apply > .material-starter-orb {
360
+ width: 16px;
361
+ height: 16px;
362
+ }
363
+
364
+ .material-saved-delete {
365
+ flex: none;
366
+ display: inline-flex;
367
+ align-items: center;
368
+ justify-content: center;
369
+ width: var(--control-h);
370
+ margin-right: var(--space-2);
371
+ color: var(--ink-3);
372
+ background: transparent;
373
+ border: 0;
374
+ border-radius: var(--radius-xs);
375
+ cursor: pointer;
376
+ }
377
+
378
+ .material-saved-delete:hover {
379
+ color: var(--danger-ink);
380
+ }
381
+
382
+ /* ---- the material's rows, in the inspector (MaterialSection.tsx) ------------ */
383
+ .material-section-heading {
384
+ display: flex;
385
+ align-items: center;
386
+ justify-content: space-between;
387
+ gap: var(--space-4);
388
+ min-width: 0;
389
+ margin-bottom: var(--space-4);
390
+ }
391
+
392
+ .material-eyebrow {
393
+ color: var(--ink-3);
394
+ font-size: var(--type-micro);
395
+ font-weight: 600;
396
+ letter-spacing: var(--tracking-caps);
397
+ line-height: var(--leading-tight);
398
+ text-transform: uppercase;
399
+ }
400
+
401
+ .material-empty-copy,
402
+ .material-legacy-note {
403
+ margin: 0;
404
+ color: var(--ink-2);
405
+ font-size: var(--type-sm);
406
+ line-height: var(--leading-body);
407
+ }
408
+
409
+ .material-add-parameter {
410
+ flex: 0 0 auto;
411
+ gap: var(--space-2);
412
+ }
413
+
414
+ .material-add-parameter .material-parameter-type {
415
+ height: var(--control-h);
416
+ max-width: 82px;
417
+ min-width: 82px;
418
+ padding-left: var(--space-3);
419
+ }
420
+
421
+ /* The per-mesh rows and each definition's fields are PropRows, 6px apart: the
422
+ inspector's row rhythm. */
423
+ .material-parameter-list {
424
+ display: flex;
425
+ flex-direction: column;
426
+ gap: var(--space-3);
427
+ }
428
+
429
+ .material-parameter-definitions {
430
+ display: flex;
431
+ flex-direction: column;
432
+ gap: var(--space-2);
433
+ margin-bottom: var(--space-5);
434
+ }
435
+
436
+ .material-parameter-definition {
437
+ overflow: hidden;
438
+ background: var(--surface-secondary);
439
+ border: 1px solid var(--line-soft);
440
+ border-radius: var(--radius-md);
441
+ }
442
+
443
+ .material-parameter-definition summary {
444
+ min-height: var(--control-h);
445
+ display: flex;
446
+ align-items: center;
447
+ gap: var(--space-3);
448
+ padding: 0 var(--space-4);
449
+ cursor: pointer;
450
+ list-style: none;
451
+ }
452
+
453
+ .material-parameter-definition summary::-webkit-details-marker {
454
+ display: none;
455
+ }
456
+
457
+ .material-parameter-definition summary::before {
458
+ content: "›";
459
+ color: var(--ink-3);
460
+ }
461
+
462
+ .material-parameter-definition[open] summary::before {
463
+ content: "⌄";
464
+ }
465
+
466
+ .material-parameter-definition summary > span {
467
+ flex: 1 1 auto;
468
+ min-width: 0;
469
+ overflow: hidden;
470
+ text-overflow: ellipsis;
471
+ white-space: nowrap;
472
+ font-size: var(--type-sm);
473
+ }
474
+
475
+ .material-parameter-definition summary small {
476
+ color: var(--ink-3);
477
+ font-size: var(--type-micro);
478
+ }
479
+
480
+ .material-parameter-definition-body {
481
+ display: flex;
482
+ flex-direction: column;
483
+ gap: var(--space-3);
484
+ padding: var(--space-4);
485
+ border-top: 1px solid var(--line-soft);
486
+ }
487
+
488
+ /* The card's one destructive verb, on the house row of buttons
489
+ (`.insp-buttons`, widgets.css); this places the row only. */
490
+ .material-delete-parameter {
491
+ margin-top: var(--space-2);
492
+ }
493
+
494
+ /* The clamp offer's two answers, under its sentence. The row itself is the
495
+ house row of buttons (`.insp-buttons`, widgets.css); this places it only. */
496
+ .material-parameter-clamp-actions {
497
+ margin-top: var(--space-2);
498
+ }
499
+
500
+ .material-problem-list {
501
+ padding: var(--space-5);
502
+ color: var(--danger-ink);
503
+ font-size: var(--type-micro);
504
+ }
505
+
506
+ .material-problem-list p {
507
+ margin: 0 0 var(--space-3);
508
+ line-height: var(--leading-body);
509
+ }
510
+
511
+ .material-problem-list code {
512
+ color: inherit;
513
+ }
514
+
515
+ /* Graph canvas furniture. React Flow owns pan/zoom; the cards and sockets use
516
+ the same border/surface ladder as the rest of the editor. */
517
+ .material-graph-canvas {
518
+ position: absolute;
519
+ inset: 0;
520
+ overflow: hidden;
521
+ outline: none;
522
+ }
523
+
524
+ .material-graph-canvas.is-loading {
525
+ display: grid;
526
+ place-items: center;
527
+ }
528
+
529
+ .material-graph-canvas:focus-visible {
530
+ box-shadow: inset 0 0 0 1px var(--accent);
531
+ }
532
+
533
+ /* AT THE CURSOR. `left`/`top` are written inline by the palette from the point
534
+ the request carried, so the only thing left here is the box it draws. The
535
+ translate keeps it from opening directly under the pointer, where its first
536
+ row would be armed by the release of the click that opened it. */
537
+ .material-node-palette {
538
+ position: absolute;
539
+ z-index: 8;
540
+ transform: translate(6px, 6px);
541
+ width: 228px;
542
+ max-height: min(480px, calc(100% - 54px));
543
+ display: flex;
544
+ flex-direction: column;
545
+ overflow: hidden;
546
+ background: var(--surface-raised);
547
+ border: 1px solid var(--line-strong);
548
+ border-radius: var(--radius-md);
549
+ box-shadow: var(--shadow-float);
550
+ }
551
+
552
+ .material-node-search {
553
+ flex: 0 0 34px;
554
+ width: 100%;
555
+ padding: 0 var(--space-5);
556
+ font: inherit;
557
+ color: var(--ink-1);
558
+ background: var(--fill-rest);
559
+ border: 0;
560
+ border-bottom: 1px solid var(--line);
561
+ outline: 0;
562
+ }
563
+
564
+ .material-node-palette-scroll {
565
+ overflow: auto;
566
+ padding: var(--space-3);
567
+ }
568
+
569
+ .material-node-category h3 {
570
+ margin: var(--space-4) 0 var(--space-1);
571
+ padding: 0 var(--space-2);
572
+ color: var(--ink-3);
573
+ font-size: var(--type-micro);
574
+ letter-spacing: var(--tracking-caps);
575
+ text-transform: uppercase;
576
+ }
577
+
578
+ .material-node-category:first-child h3 {
579
+ margin-top: 0;
580
+ }
581
+
582
+ /* The keyboard's row and the pointer's row are ONE state, so ArrowDown and a
583
+ hover cannot both look current at the same time. */
584
+ .material-node-category button.is-active {
585
+ background: var(--fill-rest);
586
+ box-shadow: inset 2px 0 0 var(--accent);
587
+ }
588
+
589
+ .material-node-category button {
590
+ width: 100%;
591
+ min-height: 30px;
592
+ display: flex;
593
+ align-items: center;
594
+ justify-content: space-between;
595
+ padding: 0 var(--space-3);
596
+ color: var(--ink-1);
597
+ background: transparent;
598
+ border: 0;
599
+ border-radius: var(--radius-sm);
600
+ font: inherit;
601
+ text-align: left;
602
+ cursor: pointer;
603
+ }
604
+
605
+ .material-node-category button:hover:not(:disabled) {
606
+ background: var(--fill-rest);
607
+ }
608
+
609
+ .material-node-category button:disabled {
610
+ opacity: var(--opacity-disabled);
611
+ cursor: default;
612
+ }
613
+
614
+ .material-node-category button small {
615
+ color: var(--ink-3);
616
+ font-size: var(--type-micro);
617
+ }
618
+
619
+ .material-node {
620
+ min-width: 168px;
621
+ overflow: hidden;
622
+ color: var(--ink-1);
623
+ background: var(--surface-raised);
624
+ border: 1px solid var(--line-strong);
625
+ border-radius: var(--radius-md);
626
+ box-shadow: 0 4px 12px color-mix(in srgb, var(--surface-app) 65%, transparent);
627
+ font-family: var(--font-sans);
628
+ font-size: var(--type-micro);
629
+ }
630
+
631
+ .material-node.is-selected {
632
+ border-color: var(--accent);
633
+ box-shadow: 0 0 0 2px var(--accent-soft);
634
+ }
635
+
636
+ .material-node-title {
637
+ display: flex;
638
+ align-items: center;
639
+ justify-content: space-between;
640
+ gap: var(--space-4);
641
+ height: 30px;
642
+ padding: 0 var(--space-4);
643
+ background: var(--fill-rest);
644
+ border-bottom: 1px solid var(--line);
645
+ font-weight: 600;
646
+ }
647
+
648
+ .material-node-title small {
649
+ color: var(--ink-3);
650
+ font-size: var(--type-micro);
651
+ font-weight: 600;
652
+ letter-spacing: var(--tracking-caps);
653
+ text-transform: uppercase;
654
+ }
655
+
656
+ /* The validator's one sentence, on the card it is about. The panel below the
657
+ canvas still lists them all; this is the half that says WHICH card. */
658
+ .material-node.is-problem {
659
+ border-color: var(--danger);
660
+ }
661
+
662
+ .material-node-problem {
663
+ margin: 0;
664
+ padding: var(--space-3) var(--space-4);
665
+ color: var(--danger-ink);
666
+ border-bottom: 1px solid var(--line);
667
+ line-height: var(--leading-tight);
668
+ }
669
+
670
+ /* The inline widgets. `nodrag nowheel` are on the element in TSX, not here:
671
+ React Flow reads them as class names off the event target. The card's
672
+ inset is the socket rows' 8px, so a field, a title and a socket label
673
+ start on one edge. */
674
+ .material-node-fields {
675
+ display: flex;
676
+ flex-direction: column;
677
+ gap: var(--space-2);
678
+ padding: var(--space-3) var(--space-4) var(--space-1);
679
+ }
680
+
681
+ .material-node-field {
682
+ display: flex;
683
+ align-items: center;
684
+ gap: var(--space-2);
685
+ min-width: 0;
686
+ }
687
+
688
+ .material-node-field > * {
689
+ min-width: 0;
690
+ flex: 1 1 auto;
691
+ }
692
+
693
+ .material-node-field.is-vector {
694
+ gap: var(--space-1);
695
+ }
696
+
697
+ .material-node-preview {
698
+ display: grid;
699
+ place-items: center;
700
+ padding: var(--space-3) var(--space-4) var(--space-1);
701
+ }
702
+
703
+ .material-node-preview-canvas {
704
+ width: 96px;
705
+ height: 96px;
706
+ border: 1px solid var(--line);
707
+ border-radius: var(--radius-sm);
708
+ background: var(--fill-rest);
709
+ }
710
+
711
+ /* A thumbnail that has been asked for and not yet answered reads as a plate
712
+ rather than as a hole — the request is one GPU readback away, and a card
713
+ that blinked empty for it would be worse than one that waits quietly. */
714
+ .material-node-preview-canvas.is-waiting {
715
+ opacity: 0.4;
716
+ }
717
+
718
+ .material-node-preview-message {
719
+ max-width: 150px;
720
+ color: var(--danger-ink);
721
+ font-size: var(--type-micro);
722
+ line-height: var(--leading-tight);
723
+ text-align: center;
724
+ }
725
+
726
+ .material-node-sockets {
727
+ display: grid;
728
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
729
+ gap: var(--space-5);
730
+ padding: var(--space-3) 0 var(--space-4);
731
+ }
732
+
733
+ .material-node-inputs:empty,
734
+ .material-node-outputs:empty {
735
+ display: none;
736
+ }
737
+
738
+ .material-socket-row {
739
+ position: relative;
740
+ min-height: 24px;
741
+ display: flex;
742
+ align-items: center;
743
+ gap: var(--space-2);
744
+ padding: 0 var(--space-4);
745
+ white-space: nowrap;
746
+ }
747
+
748
+ .material-socket-row.is-output {
749
+ justify-content: flex-end;
750
+ text-align: right;
751
+ }
752
+
753
+ /* ── the three non-card node kinds ─────────────────────────────────────────
754
+ A group is a React Flow SUBFLOW, so its box is sized by the inline style
755
+ `flowModel.ts` writes and this only paints it. `pointer-events` stays on so
756
+ the box itself can be grabbed; its members sit above it in the subflow's own
757
+ stacking, which is what makes dragging the box carry them and dragging a
758
+ member move only that one. */
759
+ .material-group {
760
+ width: 100%;
761
+ height: 100%;
762
+ border: 1px dashed var(--line-strong);
763
+ border-radius: var(--radius-md);
764
+ background: var(--surface-panel);
765
+ }
766
+
767
+ .material-group-title {
768
+ padding: var(--space-2) var(--space-3);
769
+ color: var(--ink-2);
770
+ font-size: var(--type-micro);
771
+ }
772
+
773
+ .material-comment {
774
+ width: 100%;
775
+ height: 100%;
776
+ overflow: hidden;
777
+ background: var(--surface-raised);
778
+ border: 1px solid var(--line);
779
+ border-left: 2px solid var(--ink-3);
780
+ border-radius: var(--radius-md);
781
+ }
782
+
783
+ .material-comment-body {
784
+ width: 100%;
785
+ height: 100%;
786
+ padding: var(--space-3);
787
+ color: var(--ink-2);
788
+ font-size: var(--type-micro);
789
+ }
790
+
791
+ .material-comment-body textarea {
792
+ width: 100%;
793
+ height: 100%;
794
+ resize: none;
795
+ }
796
+
797
+ /* PUNCTUATION, not a card: 14px, no title bar, nothing to look inside. */
798
+ .material-reroute {
799
+ position: relative;
800
+ width: 14px;
801
+ height: 14px;
802
+ border-radius: var(--radius-full);
803
+ background: var(--surface-raised);
804
+ border: 1px solid var(--line-strong);
805
+ }
806
+
807
+ /* ── SOCKETS: SHAPE IS THE TYPE, INK IS THE STATE ──────────────────────────
808
+ The per-type COLOURS that used to live here are gone, and deliberately: this
809
+ design system is monochrome plus one blue, and nine socket types would be
810
+ nine hues none of which is a studio colour. `socketGlyph.ts` carries the
811
+ argument in full and `materialSocketGlyph.test.ts` holds this file to it —
812
+ every class below paints from `--text*`, `--border*` or `--accent*` and
813
+ nothing else.
814
+
815
+ Scoped under the canvas rather than doubled with `.react-flow__handle`,
816
+ which is a shorter way to win the same specificity. */
817
+ .material-graph-canvas .material-socket {
818
+ width: 10px;
819
+ height: 10px;
820
+ box-sizing: border-box;
821
+ color: var(--ink-2);
822
+ background: currentColor;
823
+ border: 0;
824
+ }
825
+
826
+ .material-graph-canvas .material-socket.is-connected {
827
+ color: var(--ink-1);
828
+ }
829
+
830
+ .material-graph-canvas .material-socket-circle {
831
+ border-radius: var(--radius-full);
832
+ }
833
+
834
+ .material-graph-canvas .material-socket-circle-dotted {
835
+ border-radius: var(--radius-full);
836
+ background: transparent;
837
+ border: 1.5px dotted currentColor;
838
+ }
839
+
840
+ .material-graph-canvas .material-socket-triangle {
841
+ clip-path: polygon(0 0, 100% 50%, 0 100%);
842
+ }
843
+
844
+ .material-graph-canvas .material-socket-diamond {
845
+ clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);
846
+ }
847
+
848
+ .material-graph-canvas .material-socket-square {
849
+ border-radius: var(--radius-2xs);
850
+ }
851
+
852
+ .material-graph-canvas .material-socket-square-round {
853
+ border-radius: var(--radius-2xs);
854
+ }
855
+
856
+ .material-graph-canvas .material-socket-ring {
857
+ border-radius: var(--radius-full);
858
+ background: transparent;
859
+ border: 2px solid currentColor;
860
+ }
861
+
862
+ /* The second ring is an `outline`, not an inset shadow: a shadow would need the
863
+ card's surface colour to draw the gap, and a surface token is not one of the
864
+ three families a socket may paint from. */
865
+ .material-graph-canvas .material-socket-ring-double {
866
+ border-radius: var(--radius-full);
867
+ background: transparent;
868
+ border: 1.5px solid currentColor;
869
+ outline: 1.5px solid currentColor;
870
+ outline-offset: 1px;
871
+ }
872
+
873
+ .material-graph-canvas .material-socket-circle-dashed {
874
+ border-radius: var(--radius-full);
875
+ background: transparent;
876
+ border: 1.5px dashed currentColor;
877
+ }
878
+
879
+ /* The two live-drag answers. Ringed means "let go here"; dimmed means the type
880
+ index already refused it, said before the drop rather than after. */
881
+ .material-graph-canvas .material-socket.is-droppable {
882
+ color: var(--accent-ink);
883
+ box-shadow: 0 0 0 3px var(--accent-soft);
884
+ }
885
+
886
+ .material-graph-canvas .material-socket.is-blocked {
887
+ opacity: 0.45;
888
+ }
889
+
890
+ /* HOVER, BEFORE ANY DRAG. The two rules above answer a wire already in hand;
891
+ this one answers the pointer merely resting on a socket, which is where an
892
+ author asks "can I grab this". Ink and a ring, no hue: the drag-time answers
893
+ own `--accent`, and a socket that lit up blue on hover would say "droppable"
894
+ to an author holding nothing. The cursor is the other half of the sentence. */
895
+ .material-graph-canvas .material-socket:hover {
896
+ color: var(--ink-1);
897
+ box-shadow: 0 0 0 3px var(--line);
898
+ cursor: crosshair;
899
+ }
900
+
901
+ .material-graph-canvas .react-flow__edge-path {
902
+ stroke: var(--ink-3);
903
+ stroke-width: 1.5;
904
+ }
905
+
906
+ /* A WIRE UNDER THE POINTER. React Flow already draws a 20px invisible
907
+ interaction path down every edge, so the target was never the problem — the
908
+ answer was. One ink step and half a pixel is enough to say "this one", and
909
+ leaves `--accent` to mean selected. */
910
+ .material-graph-canvas .react-flow__edge.material-edge:hover .react-flow__edge-path {
911
+ stroke: var(--ink-2);
912
+ stroke-width: 2;
913
+ }
914
+
915
+ /* A wire reached by KEYBOARD gets the hover's step. React Flow's own focus
916
+ grey used to paint it, and that rule now ranks below the chrome (vendor
917
+ layer), so without this a tabbed-to wire showed no cue at all. */
918
+ .material-graph-canvas .react-flow__edge.material-edge:focus-visible .react-flow__edge-path {
919
+ stroke: var(--ink-2);
920
+ stroke-width: 2;
921
+ }
922
+
923
+ /* The wire a dragged card would SPLICE INTO if it were dropped now. Full ink
924
+ and visibly thicker, because this one predicts an edit rather than reporting
925
+ a hover, and the author is looking at the card they are dragging. */
926
+ .material-graph-canvas .react-flow__edge.material-edge.is-splice-target .react-flow__edge-path {
927
+ stroke: var(--ink-1);
928
+ stroke-width: 2.5;
929
+ }
930
+
931
+ .material-graph-canvas .react-flow__edge.selected .react-flow__edge-path,
932
+ .material-graph-canvas .react-flow__edge.material-edge.is-selected .react-flow__edge-path {
933
+ stroke: var(--accent);
934
+ }
935
+
936
+ /* The box a dragged card would JOIN. Its border is dashed at rest, so going
937
+ solid is the whole signal — no fill, because a group box tinting under a
938
+ card the author is still holding reads as a drop that already happened. */
939
+ .material-graph-canvas .react-flow__node.is-drop-target .material-group {
940
+ border-style: solid;
941
+ border-color: var(--ink-2);
942
+ }
943
+
944
+ /* The one resize corner on a selected box or note. Deliberately small and
945
+ quiet: it is a grip, not a control, and there is exactly one of it. */
946
+ .material-graph-canvas .material-resize-handle {
947
+ width: 9px;
948
+ height: 9px;
949
+ background: var(--surface-raised);
950
+ border: 1px solid var(--line-strong);
951
+ border-radius: var(--radius-2xs);
952
+ }
953
+
954
+ /* The overview. Furniture under a graph being read, so it is the same panel
955
+ surface as everything else and its cards are ink rather than colour: a
956
+ minimap in a second palette is a second thing competing for the eye. Docked
957
+ furniture, not a floating island: a hairline and a small radius, no shadow,
958
+ inset from the corner by the cell's own 12px. */
959
+ .material-graph-canvas .react-flow__minimap {
960
+ margin: var(--space-6);
961
+ overflow: hidden;
962
+ background: var(--surface-panel);
963
+ border: 1px solid var(--line);
964
+ border-radius: var(--radius-sm);
965
+ box-shadow: none;
966
+ }
967
+
968
+ .material-graph-canvas .react-flow__minimap-node {
969
+ fill: var(--ink-3);
970
+ stroke: none;
971
+ }
972
+
973
+ .material-graph-canvas .react-flow__minimap-node.selected {
974
+ fill: var(--accent);
975
+ }
976
+
977
+ .material-graph-canvas .react-flow__minimap-mask {
978
+ fill: var(--surface-app);
979
+ fill-opacity: 0.55;
980
+ }
981
+
982
+ /* React Flow's own selection rectangle, in the one signal colour. */
983
+ .material-graph-canvas .react-flow__selection {
984
+ background: var(--accent-quiet);
985
+ border: 1px solid var(--accent);
986
+ }
987
+
988
+ .material-source-view {
989
+ position: absolute;
990
+ inset: 0;
991
+ display: flex;
992
+ flex-direction: column;
993
+ min-height: 0;
994
+ }
995
+
996
+ .material-source-heading {
997
+ flex: 0 0 52px;
998
+ display: flex;
999
+ align-items: center;
1000
+ justify-content: space-between;
1001
+ gap: var(--space-4);
1002
+ padding: 0 var(--space-5) 0 var(--space-6);
1003
+ border-bottom: 1px solid var(--line);
1004
+ background: var(--surface-panel);
1005
+ }
1006
+
1007
+ .material-source-heading > div {
1008
+ display: flex;
1009
+ flex-direction: column;
1010
+ gap: var(--space-1);
1011
+ }
1012
+
1013
+ .material-source-heading strong {
1014
+ font-size: var(--type-md);
1015
+ }
1016
+
1017
+ .material-source-heading span {
1018
+ color: var(--ink-3);
1019
+ font-size: var(--type-micro);
1020
+ }
1021
+
1022
+ .material-source-view pre {
1023
+ flex: 1 1 auto;
1024
+ min-height: 0;
1025
+ margin: 0;
1026
+ padding: var(--space-7);
1027
+ overflow: auto;
1028
+ color: var(--ink-2);
1029
+ font: var(--type-micro)/var(--leading-none) var(--font-mono);
1030
+ line-height: var(--leading-body);
1031
+ tab-size: 2;
1032
+ white-space: pre;
1033
+ background: var(--surface-app);
1034
+ }
1035
+
1036
+ .material-source-error {
1037
+ margin: var(--space-6);
1038
+ padding: var(--space-5);
1039
+ color: var(--danger-ink);
1040
+ background: color-mix(in srgb, var(--danger) 8%, var(--surface-panel));
1041
+ border: 1px solid color-mix(in srgb, var(--danger) 35%, var(--line));
1042
+ border-radius: var(--radius-md);
1043
+ }
1044
+
1045
+ /* ---- the setup screen ------------------------------------------------------ */
1046
+ /* The canvas cell while the mesh has no graph: a focused decision surface
1047
+ with its own ground, taking the pointer back from the cell. There is no
1048
+ hole yet, because there is no material to preview. A size container, so
1049
+ the starters stack by the cell's width rather than the window's. */
1050
+ .material-setup {
1051
+ flex: 1 1 auto;
1052
+ min-width: 0;
1053
+ min-height: 0;
1054
+ overflow: auto;
1055
+ padding: var(--space-8);
1056
+ background: var(--surface-app);
1057
+ pointer-events: auto;
1058
+ container-type: inline-size;
1059
+ }
1060
+
1061
+ .material-setup-intro {
1062
+ max-width: 620px;
1063
+ }
1064
+
1065
+ .material-setup-intro h2 {
1066
+ margin: var(--space-3) 0 var(--space-3);
1067
+ font-size: var(--type-xl);
1068
+ line-height: var(--leading-tight);
1069
+ font-weight: 600;
1070
+ }
1071
+
1072
+ .material-setup-intro > p:not(.material-legacy-note) {
1073
+ margin: 0;
1074
+ max-width: 580px;
1075
+ color: var(--ink-2);
1076
+ font-size: var(--type-md);
1077
+ line-height: var(--leading-body);
1078
+ }
1079
+
1080
+ /* Two classes, so its air outranks the shared `margin: 0` above on
1081
+ specificity rather than on position. */
1082
+ .material-setup-intro > .material-legacy-note {
1083
+ margin-top: var(--space-6);
1084
+ padding: var(--space-4) var(--space-5);
1085
+ border-left: 2px solid var(--warn);
1086
+ background: var(--surface-panel);
1087
+ }
1088
+
1089
+ .material-starters {
1090
+ display: grid;
1091
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1092
+ gap: var(--space-4);
1093
+ max-width: 760px;
1094
+ margin-top: var(--space-8);
1095
+ }
1096
+
1097
+ .material-starter-card {
1098
+ min-height: 136px;
1099
+ display: flex;
1100
+ flex-direction: column;
1101
+ align-items: flex-start;
1102
+ justify-content: space-between;
1103
+ gap: var(--space-6);
1104
+ padding: var(--space-6);
1105
+ color: var(--ink-1);
1106
+ background: var(--surface-panel);
1107
+ border: 1px solid var(--line);
1108
+ border-radius: var(--radius-md);
1109
+ font: inherit;
1110
+ text-align: left;
1111
+ cursor: pointer;
1112
+ }
1113
+
1114
+ .material-starter-card:hover {
1115
+ background: var(--surface-secondary);
1116
+ border-color: var(--line-strong);
1117
+ }
1118
+
1119
+ .material-starter-card > span:last-child {
1120
+ display: flex;
1121
+ flex-direction: column;
1122
+ gap: var(--space-2);
1123
+ }
1124
+
1125
+ .material-starter-card strong {
1126
+ font-size: var(--type-md);
1127
+ font-weight: 600;
1128
+ }
1129
+
1130
+ .material-starter-card small {
1131
+ color: var(--ink-3);
1132
+ font-size: var(--type-micro);
1133
+ line-height: var(--leading-body);
1134
+ }
1135
+
1136
+ .material-starter-orb {
1137
+ width: 30px;
1138
+ height: 30px;
1139
+ border-radius: var(--radius-full);
1140
+ background: var(--ink-2);
1141
+ box-shadow: inset -7px -8px 12px color-mix(in srgb, var(--surface-app) 48%, transparent);
1142
+ }
1143
+
1144
+ .material-starter-orb.is-standard {
1145
+ background: var(--ink-3);
1146
+ }
1147
+
1148
+ .material-starter-orb.is-glass {
1149
+ background: var(--surface-secondary);
1150
+ border: 1px solid var(--ink-2);
1151
+ }
1152
+
1153
+ .material-model-mark {
1154
+ width: 7px;
1155
+ height: 7px;
1156
+ border-radius: var(--radius-full);
1157
+ background: var(--ink-3);
1158
+ }
1159
+
1160
+ .material-model-mark.is-standard {
1161
+ background: var(--ink-2);
1162
+ }
1163
+
1164
+ .material-model-mark.is-physical {
1165
+ border: 1px solid var(--ink-2);
1166
+ background: var(--surface-secondary);
1167
+ }
1168
+
1169
+ @container (max-width: 560px) {
1170
+ .material-starters {
1171
+ grid-template-columns: 1fr;
1172
+ }
1173
+ }
1174
+
1175
+ /* The model's triangle count, on its outline row. Muted until the scene as a
1176
+ whole crosses the soft budget, at which point every measured row tints — the
1177
+ claim is about the SCENE, so highlighting one row would name the wrong
1178
+ subject. */
1179
+ .layer-tris {
1180
+ flex: 0 0 auto;
1181
+ padding: 0 var(--space-2);
1182
+ font-size: var(--type-micro);
1183
+ font-variant-numeric: var(--numeric);
1184
+ color: var(--ink-3);
1185
+ }
1186
+
1187
+ .layer-tris.is-over-budget {
1188
+ color: var(--warn);
1189
+ }
1190
+
1191
+ .material-badge {
1192
+ position: absolute;
1193
+ top: 4px;
1194
+ right: 4px;
1195
+ padding: 1px var(--space-2);
1196
+ border-radius: var(--radius-full);
1197
+ background: var(--warn);
1198
+ color: var(--surface-app);
1199
+ font-size: var(--type-micro);
1200
+ font-weight: var(--weight-semibold);
1201
+ }