@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,495 @@
1
+ // The rulers and the author's guides (gap 5, bridge v44), on the camera pane over a
2
+ // Shot and on the working pane inside a component definition.
3
+ //
4
+ // ITS OWN SVG, beside the overlay rather than inside it. The overlay is a
5
+ // memoised leaf that bails unless a prop changed, and the rulers read the live
6
+ // camera through `feed.paneAt`, which no prop sees move; this one is rendered
7
+ // by `OverlaysHost` on every `feed.onOverlay` repaint, so it follows a dolly.
8
+ //
9
+ // PAINT, plus three grab sites: the two ruler bands (a new guide) and each
10
+ // guide line (move it, double-click to type it). The gestures themselves live
11
+ // in StageApp, which owns the one pointer lane (`dragGesture`); this file only
12
+ // hands it the press. A viewer gets no grab sites at all.
13
+ //
14
+ // A READING IS THE INSPECTOR'S NUMBER: centre origin, y up (see rulers.ts).
15
+
16
+ import { useCallback, useRef } from "react";
17
+ import type { MutableRefObject, PointerEvent as ReactPointerEvent } from "react";
18
+ import type { Guide3D } from "@dailies-studio/shot/doc";
19
+ import { RULER_BAND_PX, rulerLabel, rulerTicks } from "../rulers.js";
20
+ import type { AxisMap } from "../rulers.js";
21
+ import type { PaneRect } from "../panes.js";
22
+
23
+ /** A guide drag in flight, as the stage draws it: the guide at its live
24
+ * reading, dashed, with a readout. `hide` names the document guides the drag
25
+ * stands in for (the one being moved, or the one the scrub has added). */
26
+ export interface GuideDrag {
27
+ axis: "x" | "y";
28
+ at: number;
29
+ /** The pointer is over the guide's own ruler band: a drop there removes. */
30
+ overRuler: boolean;
31
+ /** A placed guide (a drop on the ruler deletes it), not a new one. */
32
+ removes: boolean;
33
+ hide: { has(id: string): boolean };
34
+ }
35
+
36
+ /** The selection's screen bounds in the camera pane, for the extent marks. */
37
+ export interface ScreenExtent {
38
+ x0: number;
39
+ x1: number;
40
+ y0: number;
41
+ y1: number;
42
+ }
43
+
44
+ export interface RulersProps {
45
+ /** The pane they measure (the camera pane, or the working pane inside a
46
+ * definition), in area px. */
47
+ camera: PaneRect;
48
+ /** The part of it no docked panel covers, pane-local. */
49
+ clear: PaneRect;
50
+ /** The bands themselves. Guides draw either way. */
51
+ bands: boolean;
52
+ mapX: AxisMap;
53
+ mapY: AxisMap;
54
+ guides: readonly Guide3D[];
55
+ drag: GuideDrag | null;
56
+ selected: string | null;
57
+ extent: ScreenExtent | null;
58
+ /** The live snap guides in pane px: where one lands on a guide, the guide
59
+ * is HOLDING the dragged edge and draws its span. */
60
+ holds: readonly { axis: "x" | "y"; at: number }[];
61
+ readOnly: boolean;
62
+ /** Filled with the hairline's imperative setter, which StageApp calls from
63
+ * the hover it already handles (area px, or null when the pointer left). */
64
+ cursor: MutableRefObject<((at: readonly [number, number] | null) => void) | null>;
65
+ onGrabRuler: (axis: "x" | "y", e: ReactPointerEvent) => void;
66
+ onGrabGuide: (guide: Guide3D, e: ReactPointerEvent) => void;
67
+ }
68
+
69
+ const BAND = RULER_BAND_PX;
70
+ const MAJOR = 8;
71
+ const MINOR = 4;
72
+ const LABEL_CHAR_PX = 5.5;
73
+ const GUIDE = "var(--user-guide, #c46cff)";
74
+ const ACCENT = "var(--accent, #0099ff)";
75
+ const MONO = "var(--font-mono, ui-monospace, monospace)";
76
+
77
+ const labelWidth = (text: string): number => text.length * LABEL_CHAR_PX;
78
+
79
+ export function Rulers({
80
+ camera,
81
+ clear,
82
+ bands,
83
+ mapX,
84
+ mapY,
85
+ guides,
86
+ drag,
87
+ selected,
88
+ extent,
89
+ holds,
90
+ readOnly,
91
+ cursor,
92
+ onGrabRuler,
93
+ onGrabGuide,
94
+ }: RulersProps) {
95
+ const hairX = useRef<SVGLineElement | null>(null);
96
+ const hairY = useRef<SVGLineElement | null>(null);
97
+ // The hairline moves on every hover, so it is written to the two lines
98
+ // directly: a React commit per pointermove would be a stage commit per move.
99
+ const register = useCallback(
100
+ (el: SVGGElement | null) => {
101
+ if (el === null) {
102
+ cursor.current = null;
103
+ return;
104
+ }
105
+ cursor.current = (at) => {
106
+ const x = at === null ? -1 : at[0] - camera.x;
107
+ const y = at === null ? -1 : at[1] - camera.y;
108
+ const inside =
109
+ at !== null && x >= clear.x && x < clear.x + clear.width && y >= clear.y && y < clear.y + clear.height;
110
+ for (const [line, on, v] of [
111
+ [hairX.current, inside && x >= clear.x + BAND, x],
112
+ [hairY.current, inside && y >= clear.y + BAND, y],
113
+ ] as const) {
114
+ if (line === null) continue;
115
+ line.style.visibility = on ? "visible" : "hidden";
116
+ if (!on) continue;
117
+ if (line === hairX.current) {
118
+ line.setAttribute("x1", String(v + 0.5));
119
+ line.setAttribute("x2", String(v + 0.5));
120
+ } else {
121
+ line.setAttribute("y1", String(v + 0.5));
122
+ line.setAttribute("y2", String(v + 0.5));
123
+ }
124
+ }
125
+ };
126
+ },
127
+ [cursor, camera.x, camera.y, clear.x, clear.y, clear.width, clear.height],
128
+ );
129
+
130
+ const pxOf = (axis: "x" | "y", at: number): number => {
131
+ const map = axis === "x" ? mapX : mapY;
132
+ return map.origin + map.scale * at;
133
+ };
134
+ const shown = guides.filter((g) => drag === null || !drag.hide.has(g.id));
135
+ const right = clear.x + clear.width;
136
+ const bottom = clear.y + clear.height;
137
+ const top0 = clear.y;
138
+ const left0 = clear.x;
139
+
140
+ return (
141
+ <svg
142
+ className="stage-rulers"
143
+ data-dailies-stage-furniture=""
144
+ data-testid="stage-rulers"
145
+ width={camera.width}
146
+ height={camera.height}
147
+ style={{
148
+ position: "absolute",
149
+ left: camera.x,
150
+ top: camera.y,
151
+ overflow: "hidden",
152
+ pointerEvents: "none",
153
+ }}
154
+ >
155
+ {/* THE GUIDES, under the bands so a band covers the end of its line. */}
156
+ {shown.map((g) => {
157
+ const p = Math.round(pxOf(g.axis, g.at)) + 0.5;
158
+ const vertical = g.axis === "x";
159
+ const isSelected = g.id === selected;
160
+ const held = holds.some((h) => h.axis === g.axis && Math.abs(h.at - (p - 0.5)) <= 1);
161
+ return (
162
+ <g key={g.id} data-testid="stage-guide" data-guide={g.id}>
163
+ <line
164
+ x1={vertical ? p : 0}
165
+ y1={vertical ? 0 : p}
166
+ x2={vertical ? p : camera.width}
167
+ y2={vertical ? camera.height : p}
168
+ stroke={GUIDE}
169
+ strokeWidth={isSelected ? 2 : 1}
170
+ />
171
+ {held && extent !== null ? (
172
+ <rect
173
+ x={vertical ? p - 1.5 : extent.x0}
174
+ y={vertical ? extent.y0 : p - 1.5}
175
+ width={vertical ? 3 : Math.max(0, extent.x1 - extent.x0)}
176
+ height={vertical ? Math.max(0, extent.y1 - extent.y0) : 3}
177
+ rx={2}
178
+ fill={GUIDE}
179
+ />
180
+ ) : null}
181
+ {readOnly ? null : (
182
+ // The grab site: a wide invisible stroke over the clear area,
183
+ // so a 1px line is easy to catch.
184
+ <line
185
+ x1={vertical ? p : left0}
186
+ y1={vertical ? top0 : p}
187
+ x2={vertical ? p : right}
188
+ y2={vertical ? bottom : p}
189
+ stroke="transparent"
190
+ strokeWidth={9}
191
+ pointerEvents="stroke"
192
+ style={{ cursor: vertical ? "ew-resize" : "ns-resize" }}
193
+ onPointerDown={(e) => onGrabGuide(g, e)}
194
+ />
195
+ )}
196
+ </g>
197
+ );
198
+ })}
199
+
200
+ {drag === null ? null : <DragGuide drag={drag} pxOf={pxOf} camera={camera} clear={clear} />}
201
+
202
+ {bands ? (
203
+ <g data-testid="stage-ruler-bands">
204
+ <TopBand
205
+ map={mapX}
206
+ clear={clear}
207
+ extent={extent}
208
+ guides={shown.filter((g) => g.axis === "x").map((g) => pxOf("x", g.at))}
209
+ readOnly={readOnly}
210
+ onGrab={(e) => onGrabRuler("y", e)}
211
+ />
212
+ <LeftBand
213
+ map={mapY}
214
+ clear={clear}
215
+ extent={extent}
216
+ guides={shown.filter((g) => g.axis === "y").map((g) => pxOf("y", g.at))}
217
+ readOnly={readOnly}
218
+ onGrab={(e) => onGrabRuler("x", e)}
219
+ />
220
+ {/* The corner the two bands share: no ticks, just the surface. */}
221
+ <rect x={left0} y={top0} width={BAND} height={BAND} fill="var(--surface-panel, #111111)" />
222
+ <g ref={register}>
223
+ <line
224
+ ref={hairX}
225
+ x1={0}
226
+ x2={0}
227
+ y1={top0}
228
+ y2={top0 + BAND}
229
+ stroke="var(--ink-1, #f5f5f5)"
230
+ strokeWidth={1}
231
+ style={{ visibility: "hidden" }}
232
+ />
233
+ <line
234
+ ref={hairY}
235
+ x1={left0}
236
+ x2={left0 + BAND}
237
+ y1={0}
238
+ y2={0}
239
+ stroke="var(--ink-1, #f5f5f5)"
240
+ strokeWidth={1}
241
+ style={{ visibility: "hidden" }}
242
+ />
243
+ </g>
244
+ </g>
245
+ ) : null}
246
+ </svg>
247
+ );
248
+ }
249
+
250
+ /** The top band: x readings, the selection's x extent, the x guides' marks.
251
+ * A press here pulls out a HORIZONTAL guide (a y guide). */
252
+ function TopBand({
253
+ map,
254
+ clear,
255
+ extent,
256
+ guides,
257
+ readOnly,
258
+ onGrab,
259
+ }: {
260
+ map: AxisMap;
261
+ clear: PaneRect;
262
+ extent: ScreenExtent | null;
263
+ guides: number[];
264
+ readOnly: boolean;
265
+ onGrab: (e: ReactPointerEvent) => void;
266
+ }) {
267
+ const y = clear.y;
268
+ const from = clear.x + BAND;
269
+ const to = clear.x + clear.width;
270
+ const ticks = rulerTicks(map, from, to);
271
+ const edges =
272
+ extent === null
273
+ ? null
274
+ : {
275
+ a: Math.max(from, extent.x0),
276
+ b: Math.min(to, extent.x1),
277
+ la: rulerLabel((extent.x0 - map.origin) / map.scale),
278
+ lb: rulerLabel((extent.x1 - map.origin) / map.scale),
279
+ };
280
+ const blocked =
281
+ edges === null ? null : [edges.a - 3 - labelWidth(edges.la) - 4, edges.b + 3 + labelWidth(edges.lb) + 4];
282
+ return (
283
+ <g data-testid="stage-ruler-top">
284
+ <rect
285
+ x={clear.x}
286
+ y={y}
287
+ width={clear.width}
288
+ height={BAND}
289
+ fill="var(--surface-panel, #111111)"
290
+ pointerEvents={readOnly ? "none" : "auto"}
291
+ style={readOnly ? undefined : { cursor: "ns-resize" }}
292
+ onPointerDown={readOnly ? undefined : onGrab}
293
+ />
294
+ <line x1={clear.x} y1={y + BAND - 0.5} x2={to} y2={y + BAND - 0.5} stroke="var(--line, #2a2a2a)" />
295
+ {edges === null || edges.b < edges.a ? null : (
296
+ <rect x={edges.a} y={y} width={edges.b - edges.a} height={BAND} fill={ACCENT} fillOpacity={0.18} />
297
+ )}
298
+ {ticks.minor.map((px) => (
299
+ <line key={`m${px}`} x1={px} x2={px} y1={y + BAND - MINOR} y2={y + BAND} stroke="var(--line-strong, #3d3d3d)" />
300
+ ))}
301
+ {ticks.major.map((t) => {
302
+ const text = rulerLabel(t.value);
303
+ const hidden = blocked !== null && t.px + 3 + labelWidth(text) > blocked[0]! && t.px + 3 < blocked[1]!;
304
+ return (
305
+ <g key={`M${t.value}`}>
306
+ <line x1={t.px} x2={t.px} y1={y + BAND - MAJOR} y2={y + BAND} stroke="var(--line-strong, #3d3d3d)" />
307
+ {hidden ? null : (
308
+ <text x={t.px + 3} y={y + 10} fill="var(--ink-3, #9c9c9c)" fontFamily={MONO} fontSize={9}>
309
+ {text}
310
+ </text>
311
+ )}
312
+ </g>
313
+ );
314
+ })}
315
+ {edges === null || edges.b < edges.a ? null : (
316
+ <g>
317
+ <line x1={edges.a} x2={edges.a} y1={y} y2={y + BAND} stroke={ACCENT} />
318
+ <line x1={edges.b} x2={edges.b} y1={y} y2={y + BAND} stroke={ACCENT} />
319
+ <text x={edges.a - 3} y={y + 10} textAnchor="end" fill={ACCENT} fontFamily={MONO} fontSize={9}>
320
+ {edges.la}
321
+ </text>
322
+ <text x={edges.b + 3} y={y + 10} fill={ACCENT} fontFamily={MONO} fontSize={9}>
323
+ {edges.lb}
324
+ </text>
325
+ </g>
326
+ )}
327
+ {guides
328
+ .filter((px) => px >= from && px <= to)
329
+ .map((px, i) => (
330
+ <path
331
+ key={`g${i}`}
332
+ d={`M${px - 3} ${y + BAND - 8}h6l-3 8z`}
333
+ fill={GUIDE}
334
+ data-testid="stage-guide-mark"
335
+ />
336
+ ))}
337
+ </g>
338
+ );
339
+ }
340
+
341
+ /** The left band: y readings (up), the selection's y extent, the y guides'
342
+ * marks. A press here pulls out a VERTICAL guide (an x guide). */
343
+ function LeftBand({
344
+ map,
345
+ clear,
346
+ extent,
347
+ guides,
348
+ readOnly,
349
+ onGrab,
350
+ }: {
351
+ map: AxisMap;
352
+ clear: PaneRect;
353
+ extent: ScreenExtent | null;
354
+ guides: number[];
355
+ readOnly: boolean;
356
+ onGrab: (e: ReactPointerEvent) => void;
357
+ }) {
358
+ const x = clear.x;
359
+ const from = clear.y + BAND;
360
+ const to = clear.y + clear.height;
361
+ const ticks = rulerTicks(map, from, to);
362
+ // Rotated labels run UP from just above their tick, so on screen a label
363
+ // occupies [px - 3 - width, px - 3].
364
+ const edges =
365
+ extent === null
366
+ ? null
367
+ : {
368
+ a: Math.max(from, extent.y0),
369
+ b: Math.min(to, extent.y1),
370
+ la: rulerLabel((extent.y0 - map.origin) / map.scale),
371
+ lb: rulerLabel((extent.y1 - map.origin) / map.scale),
372
+ };
373
+ const blocked =
374
+ edges === null ? null : [edges.a - 3 - labelWidth(edges.la) - 4, edges.b + 3 + labelWidth(edges.lb) + 4];
375
+ const label = (px: number, text: string, fill: string, after: boolean) => {
376
+ const ax = x + 11;
377
+ const ay = after ? px + 3 : px - 3;
378
+ return (
379
+ <text
380
+ x={ax}
381
+ y={ay}
382
+ transform={`rotate(-90 ${ax} ${ay})`}
383
+ textAnchor={after ? "end" : "start"}
384
+ fill={fill}
385
+ fontFamily={MONO}
386
+ fontSize={9}
387
+ >
388
+ {text}
389
+ </text>
390
+ );
391
+ };
392
+ return (
393
+ <g data-testid="stage-ruler-left">
394
+ <rect
395
+ x={x}
396
+ y={clear.y}
397
+ width={BAND}
398
+ height={clear.height}
399
+ fill="var(--surface-panel, #111111)"
400
+ pointerEvents={readOnly ? "none" : "auto"}
401
+ style={readOnly ? undefined : { cursor: "ew-resize" }}
402
+ onPointerDown={readOnly ? undefined : onGrab}
403
+ />
404
+ <line x1={x + BAND - 0.5} y1={clear.y} x2={x + BAND - 0.5} y2={to} stroke="var(--line, #2a2a2a)" />
405
+ {edges === null || edges.b < edges.a ? null : (
406
+ <rect x={x} y={edges.a} width={BAND} height={edges.b - edges.a} fill={ACCENT} fillOpacity={0.18} />
407
+ )}
408
+ {ticks.minor.map((px) => (
409
+ <line key={`m${px}`} y1={px} y2={px} x1={x + BAND - MINOR} x2={x + BAND} stroke="var(--line-strong, #3d3d3d)" />
410
+ ))}
411
+ {ticks.major.map((t) => {
412
+ const text = rulerLabel(t.value);
413
+ const hidden = blocked !== null && t.px - 3 > blocked[0]! && t.px - 3 - labelWidth(text) < blocked[1]!;
414
+ return (
415
+ <g key={`M${t.value}`}>
416
+ <line y1={t.px} y2={t.px} x1={x + BAND - MAJOR} x2={x + BAND} stroke="var(--line-strong, #3d3d3d)" />
417
+ {hidden ? null : label(t.px, text, "var(--ink-3, #9c9c9c)", false)}
418
+ </g>
419
+ );
420
+ })}
421
+ {edges === null || edges.b < edges.a ? null : (
422
+ <g>
423
+ <line y1={edges.a} y2={edges.a} x1={x} x2={x + BAND} stroke={ACCENT} />
424
+ <line y1={edges.b} y2={edges.b} x1={x} x2={x + BAND} stroke={ACCENT} />
425
+ {label(edges.a, edges.la, ACCENT, false)}
426
+ {label(edges.b, edges.lb, ACCENT, true)}
427
+ </g>
428
+ )}
429
+ {guides
430
+ .filter((px) => px >= from && px <= to)
431
+ .map((px, i) => (
432
+ <path
433
+ key={`g${i}`}
434
+ d={`M${x + BAND - 8} ${px - 3}v6l8 -3z`}
435
+ fill={GUIDE}
436
+ data-testid="stage-guide-mark"
437
+ />
438
+ ))}
439
+ </g>
440
+ );
441
+ }
442
+
443
+ /** The guide being dragged: dashed, with its reading in a chip by the ruler
444
+ * band. Over its own ruler the line dims, and a placed guide's chip says
445
+ * the drop removes it. */
446
+ function DragGuide({
447
+ drag,
448
+ pxOf,
449
+ camera,
450
+ clear,
451
+ }: {
452
+ drag: GuideDrag;
453
+ pxOf: (axis: "x" | "y", at: number) => number;
454
+ camera: PaneRect;
455
+ clear: PaneRect;
456
+ }) {
457
+ const p = Math.round(pxOf(drag.axis, drag.at)) + 0.5;
458
+ const vertical = drag.axis === "x";
459
+ const value = drag.overRuler && drag.removes ? "remove" : `${drag.axis} ${rulerLabel(drag.at)}`;
460
+ const chipW = 6 + 8 + 38 + 6 + value.length * 6.6 + 8;
461
+ const cx = vertical ? p + 8 : clear.x + BAND + 8;
462
+ const cy = vertical ? clear.y + BAND + 8 : p + 8;
463
+ return (
464
+ <g data-testid="stage-guide-drag" opacity={drag.overRuler ? 0.5 : 1}>
465
+ <line
466
+ x1={vertical ? p : 0}
467
+ y1={vertical ? 0 : p}
468
+ x2={vertical ? p : camera.width}
469
+ y2={vertical ? camera.height : p}
470
+ stroke={GUIDE}
471
+ strokeWidth={1}
472
+ strokeDasharray="4 3"
473
+ opacity={0.85}
474
+ />
475
+ <g transform={`translate(${cx} ${cy})`}>
476
+ <rect
477
+ x={0.5}
478
+ y={0.5}
479
+ width={chipW}
480
+ height={22}
481
+ rx={4}
482
+ fill="var(--surface-panel, #111111)"
483
+ fillOpacity={0.88}
484
+ stroke={GUIDE}
485
+ />
486
+ <text x={8} y={15} fill={GUIDE} fontFamily="var(--font-sans, system-ui)" fontSize={11} fontWeight={600}>
487
+ GUIDE
488
+ </text>
489
+ <text x={8 + 38 + 6} y={15} fill="var(--ink-1, #f5f5f5)" fontFamily={MONO} fontSize={11}>
490
+ {value}
491
+ </text>
492
+ </g>
493
+ </g>
494
+ );
495
+ }