@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,207 @@
1
+ /* The transition's inspector rows (scene/TransitionSection.tsx), in Studio's
2
+ Shot & transition section and in the board's Between: the heading, the
3
+ preset tiles, the length's seconds, the direction stepper, the seam and
4
+ the handover notes. A sentence in a read-only row (a requirement's Status
5
+ reason, a card's Use for and Avoid for) wraps in the house readout
6
+ (`insp-readout`, widgets.css). Tokens only. */
7
+
8
+ /* "Transition · into Shot 02": the seam's heading in Studio's Shot &
9
+ transition section. The far shot is the quieter half. */
10
+ .insp-transition-head {
11
+ margin: var(--space-3) 0 0;
12
+ overflow: hidden;
13
+ text-overflow: ellipsis;
14
+ white-space: nowrap;
15
+ font: var(--weight-semibold) var(--type-md)/var(--leading-xs) var(--font-sans);
16
+ color: var(--ink-1);
17
+ }
18
+
19
+ .insp-transition-into {
20
+ font-weight: var(--weight-regular);
21
+ color: var(--ink-3);
22
+ }
23
+
24
+ /* Four preset tiles, two by two, the full width of the rail: a picture of
25
+ the blend over its name. */
26
+ .insp-tiles {
27
+ display: grid;
28
+ grid-template-columns: repeat(2, minmax(0, 1fr));
29
+ gap: var(--space-4);
30
+ width: 100%;
31
+ min-width: 0;
32
+ }
33
+
34
+ /* A NAME THAT DOES NOT FIT WRAPS. At a narrow rail "Directional Wipe" can
35
+ outgrow its tile. The `.btn` is a flex box, so its text would be an
36
+ anonymous flex item that never draws an ellipsis: the centred name was cut
37
+ at both edges. Two lines keep every word, and the row grows to hold them. */
38
+ .insp-tile {
39
+ flex-direction: column;
40
+ gap: var(--space-3);
41
+ min-width: 0;
42
+ height: auto;
43
+ min-height: var(--button-h);
44
+ padding: var(--space-6);
45
+ justify-content: center;
46
+ text-align: center;
47
+ white-space: normal;
48
+ overflow-wrap: anywhere;
49
+ line-height: var(--leading-tight);
50
+ font-size: var(--type-sm);
51
+ color: var(--ink-2);
52
+ background: var(--surface-secondary);
53
+ border: 1px solid var(--line);
54
+ border-radius: var(--radius-sm);
55
+ }
56
+
57
+ .insp-tile:hover:not(:disabled) {
58
+ color: var(--ink-1);
59
+ background: var(--fill-hover);
60
+ }
61
+
62
+ /* The lit preset: an accent border round a soft accent fill. */
63
+ .insp-tile[aria-pressed="true"],
64
+ .insp-tile[aria-pressed="true"]:hover:not(:disabled) {
65
+ color: var(--accent-ink);
66
+ background: var(--accent-quiet);
67
+ border-color: var(--accent);
68
+ }
69
+
70
+ .insp-tile-glyph {
71
+ flex: none;
72
+ width: 28px;
73
+ height: 14px;
74
+ fill: none;
75
+ stroke: currentColor;
76
+ stroke-width: 1.25;
77
+ stroke-linecap: round;
78
+ stroke-linejoin: round;
79
+ }
80
+
81
+ .insp-tile-glyph .is-b {
82
+ fill: currentColor;
83
+ fill-opacity: 0.55;
84
+ }
85
+
86
+ /* THE LENGTH'S SECONDS, after the frames inside the length's one box (the
87
+ house field, its NumberField flattened into it): what the frames last,
88
+ in the numeral face at the unit's size and in the third ink, so it reads
89
+ as a gloss on the value rather than a second value. Outside the field, so
90
+ a press on it is not the field's scrub. */
91
+ .insp-length-secs {
92
+ flex: none;
93
+ white-space: nowrap;
94
+ font: var(--type-sm)/var(--leading-xs) var(--font-numeric);
95
+ font-variant-numeric: var(--numeric);
96
+ color: var(--ink-3);
97
+ }
98
+
99
+ .insp-length-secs::before {
100
+ content: "· ";
101
+ }
102
+
103
+ /* The direction step: the arrow and the vector it points along, in the
104
+ numeral face, on the house 28px button row (`.insp-buttons`, widgets.css). */
105
+ .insp-direction {
106
+ gap: var(--space-3);
107
+ font-family: var(--font-mono);
108
+ font-size: var(--type-sm);
109
+ }
110
+
111
+ .insp-direction-arrow {
112
+ display: inline-block;
113
+ line-height: var(--leading-none);
114
+ }
115
+
116
+ /* THE SEAM, one readout line inside its row's box: the three spans (the
117
+ lead-in, the blend, the run-out) across what the label leaves, then the
118
+ reading. Stacked, the track over the reading made the box taller than
119
+ every other row's. */
120
+ .insp-seam {
121
+ display: flex;
122
+ align-items: center;
123
+ gap: var(--space-4);
124
+ width: 100%;
125
+ min-width: 0;
126
+ }
127
+
128
+ /* The rail in `--line`, the tick slider's rail colour: the box it sits in is
129
+ already the control ground, and a track on that ground would vanish. */
130
+ .insp-seam-track {
131
+ display: flex;
132
+ flex: 1 1 auto;
133
+ min-width: 0;
134
+ height: var(--space-3);
135
+ border-radius: var(--radius-2xs);
136
+ overflow: hidden;
137
+ background: var(--line);
138
+ }
139
+
140
+ .insp-seam-span {
141
+ flex: none;
142
+ height: 100%;
143
+ }
144
+
145
+ .insp-seam-span.is-blend {
146
+ background: var(--accent);
147
+ }
148
+
149
+ .insp-seam > .insp-dim {
150
+ flex: none;
151
+ }
152
+
153
+ /* The cut's handover notes (TransitionSection.tsx): the headings, the text
154
+ and the numbered beats. A beat's number wears the warm accent, the way the
155
+ Paper mock marks what an agent can animate. */
156
+ .notes-block-section {
157
+ display: flex;
158
+ flex-direction: column;
159
+ gap: var(--space-2);
160
+ }
161
+
162
+ .notes-block-heading {
163
+ margin: 0;
164
+ font-size: var(--type-micro);
165
+ font-weight: var(--weight-semibold);
166
+ letter-spacing: var(--tracking-caps);
167
+ text-transform: uppercase;
168
+ color: var(--ink-3);
169
+ }
170
+
171
+ .notes-block-text {
172
+ margin: 0;
173
+ font-size: var(--type-md);
174
+ line-height: var(--leading-body);
175
+ color: var(--ink-1);
176
+ white-space: pre-wrap;
177
+ }
178
+ .notes-block-beats {
179
+ display: flex;
180
+ flex-direction: column;
181
+ gap: var(--space-2);
182
+ margin: 0;
183
+ padding: 0;
184
+ list-style: none;
185
+ }
186
+
187
+ .notes-block-beat {
188
+ display: flex;
189
+ align-items: baseline;
190
+ gap: var(--space-3);
191
+ min-width: 0;
192
+ font-size: var(--type-md);
193
+ color: var(--ink-1);
194
+ }
195
+
196
+ .notes-block-number {
197
+ flex: 0 0 auto;
198
+ min-width: var(--space-6);
199
+ font-family: var(--font-numeric);
200
+ font-size: var(--type-sm);
201
+ color: var(--accent-warm);
202
+ }
203
+
204
+ .notes-block-beat-text {
205
+ flex: 1 1 auto;
206
+ min-width: 0;
207
+ }
@@ -0,0 +1,486 @@
1
+ /* The inspector's object context: align, paint (the gradient bar, the stops), a prose value's ink, the Animate panel's pad, the expose pin, plate styles, the mesh material rows, the stroke switch, the font field and the mask. The field geometry (the 28px box, the type scale, the 6px rhythm, the colour field, the accessory lane), the inspector's buttons (one in a pill, a row's own, a row of them) and the readout row are the house recipes in packages/ui/src/widgets.css, for every panel alike; nothing here restates them. `.insp-object` is on the root of every object section (the InspectorSection `className`). Imported right after inspector-shot.css, in the same layer. */
2
+
3
+ /* ---- align / distribute ------------------------------------------------- */
4
+ /* Two rows of five, one per axis: align, centre, align, distribute, flip.
5
+ Bordered buttons at the house 28px, each a 14px glyph in the second ink. */
6
+ .align-grid {
7
+ display: grid;
8
+ grid-template-columns: repeat(5, 1fr);
9
+ gap: var(--space-3);
10
+ margin: 0;
11
+ }
12
+
13
+ .align-button {
14
+ display: inline-flex;
15
+ align-items: center;
16
+ justify-content: center;
17
+ height: var(--control-h);
18
+ padding: 0;
19
+ color: var(--ink-2);
20
+ background: var(--fill-rest);
21
+ border: 1px solid var(--line-strong);
22
+ border-radius: var(--field-radius);
23
+ cursor: pointer;
24
+ transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
25
+ }
26
+
27
+ /* The glyph is drawn on the 24 grid and carries no size of its own. */
28
+ .align-button > svg {
29
+ width: 14px;
30
+ height: 14px;
31
+ }
32
+
33
+ .align-button:hover:not(:disabled) {
34
+ background: var(--fill-hover);
35
+ color: var(--ink-1);
36
+ }
37
+
38
+ .align-button:disabled {
39
+ opacity: var(--opacity-disabled);
40
+ cursor: default;
41
+ }
42
+
43
+ .align-button:focus-visible {
44
+ outline: none;
45
+ border-color: var(--accent);
46
+ box-shadow: var(--focus-ring);
47
+ }
48
+
49
+ /* ---- paint: the gradient bar and its stops ------------------------------ */
50
+ /* THE TYPE CHIPS are the one shared segmented control (ui/widgets.css
51
+ `.segmented`), and the colour field is the house one (ui ColorField): Fill
52
+ here, the scene's Background, the dock's Rows | Graph | Sound and the tool
53
+ footer's view switch all draw the same controls. Nothing below is scoped to
54
+ an object section, because the shot's Background renders the same
55
+ PaintRows, and one control drawn two ways would read as two controls. */
56
+
57
+ /* THE BAR'S RAMP IN THE CANVAS'S SPACE. GradientBar fills its track through
58
+ an OKLCH preview, and the rasterizer blends sRGB. PaintRows sets
59
+ `--paint-ramp` as a plain CSS gradient, and this layer covers the bar's
60
+ fill with it. It sits inside the track, over the checkerboard, so a
61
+ translucent stop still shows its alpha. */
62
+ .paint-gradient .gradient-bar-track::after {
63
+ content: "";
64
+ position: absolute;
65
+ inset: 0;
66
+ background: var(--paint-ramp);
67
+ pointer-events: none;
68
+ }
69
+
70
+ /* The stop the bar has selected: its box takes the accent wash and edge, so
71
+ the row and the marker read as one selection. A stop's remove is the house
72
+ accessory inside that box (`.insp-key.is-danger`), so it needs no look of
73
+ its own here. */
74
+ .paint-stop.is-selected .insp-pill {
75
+ background: var(--accent-soft);
76
+ border-color: var(--accent);
77
+ }
78
+
79
+ /* A stop's box holds two values, shared by what each holds: the colour is a
80
+ swatch, six digits and a chevron, and the position a two-letter prefix and
81
+ at most four characters (0 to 1 in steps of 0.05), about two to one, so the
82
+ At field grows at half the colour's rate. Shared evenly, the hex was cut to
83
+ "FF000" at the panel's 264px floor beside an At field holding empty space.
84
+ A ratio and not a content size: the At field's input would bring its own
85
+ intrinsic width of twenty characters. */
86
+ .paint-stop .insp-pill .numfield {
87
+ flex-grow: 0.5;
88
+ }
89
+
90
+ /* "+ Stop" is the gradient's one way to grow, drawn as Paper's accent chip:
91
+ the accent wash, an accent edge and accent ink, at the row's right
92
+ (`.insp-control` already ends its content there). Its 28px and its inset
93
+ are the house row button's (a row's own button, widgets.css). */
94
+ .paint-add-stop .btn {
95
+ background: var(--accent-soft);
96
+ border: 1px solid var(--accent);
97
+ color: var(--accent-ink);
98
+ font-size: var(--type-md);
99
+ font-weight: var(--weight-medium);
100
+ }
101
+
102
+ /* This layer outranks `.btn:hover`, so the hover is restated: the edge takes
103
+ the hover accent rather than the wash going grey. */
104
+ .paint-add-stop .btn:hover:not(:disabled) {
105
+ background: var(--accent-soft);
106
+ border-color: var(--accent-hover);
107
+ }
108
+
109
+ /* ---- a prose value ------------------------------------------------------- */
110
+ /* A value in a row that also holds a verb (a source file's name beside
111
+ Replace…, a module's name) is WORDS: the row's own sans face (`.is-text`)
112
+ in the second ink the house readout gives its values. The third ink was
113
+ dimmer than the label naming it. A row that only reads out a value is the
114
+ house readout (`insp-readout`), which inks its value itself. */
115
+ .insp-object .insp-dim.is-text {
116
+ color: var(--ink-2);
117
+ }
118
+
119
+ /* The bezier pad, sharing the shape the other two chromes draw so an ease
120
+ reads the same everywhere. */
121
+ .insp-pad {
122
+ display: block;
123
+ margin: var(--space-3) 0;
124
+ }
125
+
126
+ .insp-pad-box {
127
+ fill: none;
128
+ stroke: var(--line);
129
+ }
130
+
131
+ .insp-pad-curve {
132
+ fill: none;
133
+ stroke: var(--accent);
134
+ stroke-width: 1.5;
135
+ }
136
+
137
+ .insp-pad-arm {
138
+ stroke: var(--line);
139
+ stroke-width: 1;
140
+ }
141
+
142
+ .insp-pad-handle {
143
+ fill: var(--accent);
144
+ cursor: grab;
145
+ }
146
+
147
+
148
+ /* ---- the expose pin ------------------------------------------------------ */
149
+ /* `.insp-key` (ui/widgets.css) carries this button's box and its inks (16px,
150
+ the third ink at rest, the first under the pointer), because the pin and
151
+ the diamond sit in one accessory lane inside the field, and two
152
+ affordances there that rested at different sizes or strengths would read
153
+ as two kinds of control rather than two verbs on one value. So no ink is
154
+ set here: a chrome rule outranks the house at any specificity, and one
155
+ that held the pin at the third ink kept its glyph dark under the pointer
156
+ while the diamond beside it lit. What it must never take is `--kf`. That
157
+ token means "this property has a keyframe", and publishing a prop is the
158
+ opposite claim: the value belongs to whoever places the component, and
159
+ nothing in this definition animates it. The pin never wears the diamond's
160
+ tracked or keyed class, so it has no keyed state at all.
161
+
162
+ ITS GLYPH IS A CHARACTER, NOT AN SVG, so `.insp-key > svg` does not size
163
+ it and it took the font of whatever held it: 13px in a field's box, 11px
164
+ in a ControlSpec row's label column, where a vector's one pin sits. One
165
+ size wherever it sits, the box's. */
166
+ .insp-expose {
167
+ font-size: var(--type-lg);
168
+ }
169
+
170
+
171
+ /* ---- plate style shelf --------------------------------------------------- */
172
+ /* Six named looks over one grid of chips. A GRID and not a SegmentedControl,
173
+ because these are not the values of one field: nothing records which was
174
+ chosen, each is a write of ordinary paint fields the author then owns, and a
175
+ segmented control would claim a selected state this section cannot honestly
176
+ show. Two rows of three at the inspector's width, which keeps every label
177
+ readable without truncating "Outline". */
178
+ .plate-style-grid {
179
+ display: grid;
180
+ grid-template-columns: repeat(3, 1fr);
181
+ gap: var(--space-1);
182
+ width: 100%;
183
+ }
184
+
185
+ .plate-style-chip {
186
+ font: inherit;
187
+ font-size: var(--type-sm);
188
+ line-height: var(--leading-none);
189
+ color: var(--ink-2);
190
+ background: var(--fill-rest);
191
+ border: 1px solid var(--line);
192
+ border-radius: var(--radius-sm);
193
+ cursor: pointer;
194
+ /* A control's height, so the shelf's rows line up with the pills around it. */
195
+ height: var(--control-h);
196
+ padding: 0 var(--space-2);
197
+ text-align: center;
198
+ }
199
+
200
+ .plate-style-chip:hover:not(:disabled) {
201
+ color: var(--ink-1);
202
+ background: var(--fill-hover);
203
+ border-color: var(--line-strong);
204
+ }
205
+
206
+ /* A viewer's locked panel: every chip writes paint, so the shelf dims. */
207
+ .plate-style-chip:disabled {
208
+ opacity: var(--opacity-disabled);
209
+ cursor: default;
210
+ }
211
+
212
+ /* The capability's affordance stays visible at rest (design-system rule), so
213
+ this is a focus ring on top of a chip that is already legible, never the
214
+ thing that reveals it. */
215
+ .plate-style-chip:focus-visible {
216
+ outline: none;
217
+ box-shadow: var(--focus-ring);
218
+ }
219
+
220
+
221
+ /* ---- re-homed here from other region files (the component that renders
222
+ these lives in this region) ------------------------------------------ */
223
+
224
+ /* THE MATERIAL ROW's value: the material's name as a button that opens its
225
+ nodes, flattened into the row's pill by the house text-input rule like
226
+ every value in one, and read from the right like them. Its remove is the
227
+ house accessory in the pill's own lane. */
228
+ .mesh-material-name {
229
+ min-width: 0;
230
+ text-align: right;
231
+ overflow: hidden;
232
+ text-overflow: ellipsis;
233
+ white-space: nowrap;
234
+ cursor: pointer;
235
+ }
236
+
237
+ /* The model's own materials, one row each. A LIST rather than a dropdown: the
238
+ author is choosing what to go and edit, not setting a value, and a row can
239
+ carry the mesh and map counts that say which surface it is. */
240
+ .mesh-slot-list {
241
+ display: flex;
242
+ flex-direction: column;
243
+ gap: var(--space-1);
244
+ padding: var(--space-1) 0 var(--space-3);
245
+ }
246
+
247
+ .mesh-slot-row {
248
+ display: flex;
249
+ align-items: center;
250
+ gap: var(--space-3);
251
+ min-height: 24px;
252
+ padding: 0 var(--space-3);
253
+ color: var(--ink-1);
254
+ background: transparent;
255
+ border: 0;
256
+ border-radius: var(--radius-xs);
257
+ font: inherit;
258
+ text-align: left;
259
+ cursor: pointer;
260
+ }
261
+
262
+ .mesh-slot-row:hover {
263
+ background: var(--fill-rest);
264
+ }
265
+
266
+ .mesh-slot-index {
267
+ flex: none;
268
+ min-width: 14px;
269
+ color: var(--ink-3);
270
+ font-variant-numeric: var(--numeric);
271
+ }
272
+
273
+ .mesh-slot-name {
274
+ flex: 1 1 auto;
275
+ min-width: 0;
276
+ overflow: hidden;
277
+ text-overflow: ellipsis;
278
+ white-space: nowrap;
279
+ }
280
+
281
+ .mesh-slot-row small {
282
+ flex: none;
283
+ color: var(--ink-3);
284
+ font-size: var(--type-micro);
285
+ }
286
+
287
+ /* ---- Stroke ------------------------------------------------------------- */
288
+ /* The Stroke section's header switch (`Stroke.hidden`, schema v36). The
289
+ actions slot rests at 0.55 so a `+` sits quietly under its title, but a
290
+ switch's whole job is to show a state: at 0.55 the accent "on" and the grey
291
+ "off" are hard to tell apart without a hover a touch device cannot do. So
292
+ the slot that holds this switch stays at full strength. */
293
+ .insp-section-actions:has(> .insp-stroke-switch) {
294
+ opacity: 1;
295
+ }
296
+
297
+ /* THE FONT FIELD (FontField.tsx): the colour field's box (the house
298
+ `.color-field` recipe) is the font picker's trigger. One button fills it:
299
+ the family drawn in its own face, right-aligned as every value in a pill,
300
+ then the house caret. The box draws the edge and the ring for it (the
301
+ recipe's `:focus-within` and `:has(:focus-visible)`), so the button draws
302
+ none of its own. A font write in flight sits in the accessory lane. */
303
+ .font-field-open {
304
+ flex: 1;
305
+ min-width: 0;
306
+ display: flex;
307
+ align-items: center;
308
+ gap: var(--space-3);
309
+ padding: 0;
310
+ font: inherit;
311
+ color: var(--ink-2);
312
+ background: transparent;
313
+ border: 0;
314
+ outline: none;
315
+ cursor: pointer;
316
+ }
317
+
318
+ .font-field-open:hover:not(:disabled),
319
+ .font-field-open[aria-expanded="true"] {
320
+ color: var(--ink-1);
321
+ }
322
+
323
+ /* A viewer's locked panel opens no picker (a pick writes the Project). The
324
+ caret keeps its ink, as the colour field's does in a read-only box. */
325
+ .font-field-open:disabled {
326
+ cursor: default;
327
+ }
328
+
329
+ /* Its glyph is the house dropdown caret (`.field-caret`), the last thing in
330
+ the button, so it lands where every other caret does. The button is aimed
331
+ at, so the caret takes the button's ink: --ink-2 at rest, as every caret,
332
+ and --ink-1 while the field is hovered or its picker is open. */
333
+ .font-field-open .field-caret {
334
+ color: inherit;
335
+ }
336
+
337
+ /* The family keeps the UI's size and its own face (set inline once the face
338
+ has loaded, Inter until then). "Mixed" is the quiet ink a field's Mixed
339
+ placeholder takes; a locked box reads its value in the second ink. */
340
+ .font-field-name {
341
+ flex: 1;
342
+ min-width: 0;
343
+ overflow: hidden;
344
+ text-overflow: ellipsis;
345
+ white-space: nowrap;
346
+ text-align: right;
347
+ font-size: var(--type-md);
348
+ line-height: var(--leading-md);
349
+ color: var(--ink-1);
350
+ }
351
+
352
+ .font-field-name.is-mixed {
353
+ color: var(--ink-3);
354
+ }
355
+
356
+ .font-field.is-readonly .font-field-name {
357
+ color: var(--ink-2);
358
+ }
359
+
360
+ /* THE WRITE IN FLIGHT: a 12px ring whose lit arc is the level, in the meter
361
+ grey (a level, not a selection), with its percent in the numeral face in a
362
+ lane wide enough for "100%", so the caret never steps as it counts. A size
363
+ not known yet has no level: a short arc that turns where motion is wanted,
364
+ and a dashed ring where it is not (a still short arc would read as 25%).
365
+ The picker's skeleton, while its chunk loads, is the same ring in the
366
+ accessory lane. */
367
+ .font-field-apply {
368
+ gap: var(--space-2);
369
+ }
370
+
371
+ .font-field-ring {
372
+ flex: none;
373
+ width: 12px;
374
+ height: 12px;
375
+ }
376
+
377
+ .font-field-ring circle {
378
+ fill: none;
379
+ stroke-width: 1.5;
380
+ }
381
+
382
+ .font-field-ring-track {
383
+ stroke: var(--line-strong);
384
+ }
385
+
386
+ .font-field-ring-level {
387
+ stroke: var(--meter-lit);
388
+ }
389
+
390
+ .font-field-ring.is-indeterminate .font-field-ring-level {
391
+ stroke-dasharray: 8 4.5;
392
+ }
393
+
394
+ .font-field-percent {
395
+ min-width: 4ch;
396
+ font-family: var(--font-numeric);
397
+ font-variant-numeric: var(--numeric);
398
+ font-size: var(--type-sm);
399
+ line-height: var(--leading-xs);
400
+ color: var(--ink-2);
401
+ }
402
+
403
+ .font-field-wait {
404
+ flex: none;
405
+ width: 12px;
406
+ height: 12px;
407
+ border: 1.5px dashed var(--line-strong);
408
+ border-radius: var(--radius-full);
409
+ }
410
+
411
+ @media (prefers-reduced-motion: no-preference) {
412
+ .font-field-ring.is-indeterminate .font-field-ring-level {
413
+ stroke-dasharray: 25 100;
414
+ }
415
+
416
+ .font-field-wait {
417
+ border-style: solid;
418
+ border-top-color: var(--meter-lit);
419
+ }
420
+
421
+ .font-field-ring.is-indeterminate,
422
+ .font-field-wait {
423
+ animation: font-field-turn 900ms linear infinite;
424
+ }
425
+ }
426
+
427
+ @keyframes font-field-turn {
428
+ to {
429
+ transform: rotate(360deg);
430
+ }
431
+ }
432
+
433
+ /* A failed write's way back: the house button, sized in the lane at the
434
+ badge's height so the row keeps its 28. Its look and states stay `.btn`'s. */
435
+ .font-field-retry {
436
+ height: var(--badge-h);
437
+ padding: 0 var(--space-3);
438
+ }
439
+
440
+ /* The picker's chunk did not load: its crash card takes its own line in the
441
+ box, which grows to hold it, so the message reads and Try again is in
442
+ reach rather than spilling over the rows below. */
443
+ .font-field:has(> .panel-crash) {
444
+ flex-wrap: wrap;
445
+ height: auto;
446
+ min-height: var(--control-h);
447
+ }
448
+
449
+ .font-field > .panel-crash {
450
+ flex: 1 0 100%;
451
+ margin: 0 0 var(--space-3);
452
+ }
453
+
454
+ /* THE PICKER'S CHIPS share its 340 by their words, in one line: at the
455
+ house 10px a side the six wrapped, Mono alone on a second line. A context
456
+ sets a chip's width only (docs/design-system.md, Segmented), from the
457
+ chrome layer, since the picker's own sheet ranks under the widgets. */
458
+ .font-picker-chips .segmented-item {
459
+ flex: 1 1 auto;
460
+ padding-inline: var(--space-2);
461
+ }
462
+
463
+ /* ---- mask (gap 7, Paper page 25) ----------------------------------------
464
+ What the mask covers is the house readout (`insp-readout`: no hover lift,
465
+ the default cursor), its names in full ink rather than the readout's
466
+ second ink, and Release is one quiet full-width button under the rows:
467
+ the house row of buttons and the house outline button, at the house 28px.
468
+ This places the row only. */
469
+ .insp-object.insp-mask .insp-dim.is-text {
470
+ color: var(--ink-1);
471
+ }
472
+
473
+ .insp-mask-release {
474
+ padding: var(--space-2) 0 var(--space-6);
475
+ }
476
+
477
+ /* A notice of several sentences (an instance's drift: what moved, what the
478
+ stage renders now, what Accept does), one to a line so they never run
479
+ into each other. */
480
+ .insp-notice-line {
481
+ display: block;
482
+ }
483
+
484
+ .insp-notice-line + .insp-notice-line {
485
+ margin-top: var(--space-2);
486
+ }