@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
package/src/icons.tsx ADDED
@@ -0,0 +1,770 @@
1
+ // THE icon set — one module, every surface (basics overhaul, Part F).
2
+ //
3
+ // Hand-drawn 24-viewBox strokes at 1.5, tinted by the CSS `color` of whatever
4
+ // wraps them; sized by CSS (`.layer-kind svg`, `.layer-flag svg`, the dock's
5
+ // own rule), never by attributes, so one rule owns the scale everywhere the
6
+ // set appears. Still no icon dependency.
7
+ //
8
+ // ── ONE OF A KIND, KEYED ON THE THING ────────────────────────────────────
9
+ //
10
+ // `iconFor(layer)` answers by what the layer IS to an author, not by its
11
+ // schema kind alone: a Box shows a box (kind "mesh", primitive "box"), a
12
+ // particle emitter shows its spark (kind "instance", a curated registry id),
13
+ // and everything else shows its kind glyph. The maps underneath are TYPED
14
+ // records over the schema's own unions, so a new kind or primitive without a
15
+ // glyph is a compile error rather than a fallback nobody notices — the
16
+ // guarantee the old `Record<string, …>` claimed and never had.
17
+ import type { ReactElement, ReactNode } from "react";
18
+ import type {
19
+ Layer3D,
20
+ Layer3DKind,
21
+ MeshPrimitiveKind,
22
+ } from "@dailies-studio/shot/doc";
23
+ import { meshPrimitiveOf } from "@dailies-studio/shot/doc";
24
+ import type { ElementFamily, PromotedBuiltinId } from "./addFamilies.js";
25
+ import type { CardKind } from "./state/storyboardModel.js";
26
+ import type { DockTool, FlyoutTool } from "./tools.js";
27
+
28
+ function icon(children: ReactNode): ReactElement {
29
+ return (
30
+ <svg
31
+ viewBox="0 0 24 24"
32
+ fill="none"
33
+ stroke="currentColor"
34
+ strokeWidth={1.5}
35
+ strokeLinecap="round"
36
+ strokeLinejoin="round"
37
+ aria-hidden="true"
38
+ >
39
+ {children}
40
+ </svg>
41
+ );
42
+ }
43
+
44
+ /** One icon per layer KIND. The Figma grammar for the component family: a
45
+ * lone diamond is a code-component instance, a diamond holding a smaller one
46
+ * is a placement of an AUTHORED definition, and the definition itself is the
47
+ * four-diamond `COMPONENT_ICON` below. */
48
+ const KIND_ICONS: Record<Layer3DKind, ReactElement> = {
49
+ text: icon(<path d="M6 6h12M12 6v13" />),
50
+ // ONE peak, not two, and a fatter sun: at 16px the second ridge and a 1.5
51
+ // radius closed into a smudge that read as "some rectangle".
52
+ image: icon(
53
+ <>
54
+ <rect x="3.5" y="5" width="17" height="14" rx="2" />
55
+ <circle cx="8.5" cy="9.5" r="2" />
56
+ <path d="m4.5 17.5 5.5-5.5 6.5 6.5" />
57
+ </>,
58
+ ),
59
+ video: icon(
60
+ <>
61
+ <rect x="3.5" y="5" width="17" height="14" rx="2" />
62
+ <path d="M10.5 9.5v5l4-2.5z" />
63
+ </>,
64
+ ),
65
+ rect: icon(<rect x="4.5" y="6.5" width="15" height="11" rx="1.5" />),
66
+ ellipse: icon(<circle cx="12" cy="12" r="7.5" />),
67
+ line: icon(<path d="M5.5 18.5 18.5 5.5" />),
68
+ arrow: icon(<path d="M6 18 18 6M9 6h9v9" />),
69
+ path: icon(<path d="M4.5 19.5c7 0 8-15 15-15" />),
70
+ // Angle brackets: the one glyph nobody has to be told means markup.
71
+ html: icon(<path d="m9 8-4 4 4 4M15 8l4 4-4 4" />),
72
+ group: icon(
73
+ <>
74
+ <rect x="4" y="4" width="12" height="12" rx="2" />
75
+ <path d="M20 9v9a2 2 0 0 1-2 2H9" />
76
+ </>,
77
+ ),
78
+ device: icon(
79
+ <>
80
+ <rect x="7" y="3.5" width="10" height="17" rx="2" />
81
+ {/* A 4-wide home bar. The 3-wide one was a dot at 16px, leaving a bare
82
+ rounded rectangle that could not be told from `rect`. */}
83
+ <path d="M10 17.5h4" />
84
+ </>,
85
+ ),
86
+ mesh: icon(<path d="M12 3.5 19.5 8v8L12 20.5 4.5 16V8z" />),
87
+ cloner: icon(
88
+ <>
89
+ <rect x="4.5" y="4.5" width="6" height="6" rx="1" />
90
+ <rect x="13.5" y="4.5" width="6" height="6" rx="1" />
91
+ <rect x="4.5" y="13.5" width="6" height="6" rx="1" />
92
+ <rect x="13.5" y="13.5" width="6" height="6" rx="1" />
93
+ </>,
94
+ ),
95
+ instance: icon(<path d="m12 4 8 8-8 8-8-8z" />),
96
+ // The glyph that DID NOT EXIST: a component layer wore the fallback lone
97
+ // diamond, visually the instance grammar. A diamond holding a diamond says
98
+ // "a placement of a definition" without a legend.
99
+ component: icon(
100
+ <>
101
+ <path d="m12 4 8 8-8 8-8-8z" />
102
+ {/* The inner diamond is 3.5 across, not 2.5: at a 1.5 stroke the two
103
+ outlines merged into one thick lozenge at small sizes, which is the
104
+ instance glyph with a heavier edge — the exact confusion it exists to
105
+ prevent. */}
106
+ <path d="m12 8.5 3.5 3.5-3.5 3.5-3.5-3.5z" />
107
+ </>,
108
+ ),
109
+ };
110
+
111
+ /** One icon per parametric shape (schema v11) — what the outliner shows in
112
+ * place of the mesh polyhedron when a mesh is a primitive. */
113
+ export const PRIMITIVE_ICONS: Record<MeshPrimitiveKind, ReactElement> = {
114
+ box: icon(
115
+ <>
116
+ <path d="M12 3.5 19.5 8v8L12 20.5 4.5 16V8z" />
117
+ <path d="M4.5 8 12 12.5 19.5 8M12 12.5V20.5" />
118
+ </>,
119
+ ),
120
+ sphere: icon(
121
+ <>
122
+ <circle cx="12" cy="12" r="8" />
123
+ <ellipse cx="12" cy="12" rx="8" ry="3" />
124
+ </>,
125
+ ),
126
+ cylinder: icon(
127
+ <>
128
+ <ellipse cx="12" cy="6.5" rx="6.5" ry="2.5" />
129
+ <path d="M5.5 6.5v11M18.5 6.5v11M5.5 17.5a6.5 2.5 0 0 0 13 0" />
130
+ </>,
131
+ ),
132
+ cone: icon(
133
+ <>
134
+ <path d="M12 4 18.5 17.5M12 4 5.5 17.5" />
135
+ <ellipse cx="12" cy="17.5" rx="6.5" ry="2.5" />
136
+ </>,
137
+ ),
138
+ capsule: icon(<rect x="7" y="3.5" width="10" height="17" rx="5" />),
139
+ torus: icon(
140
+ <>
141
+ <circle cx="12" cy="12" r="8" />
142
+ <circle cx="12" cy="12" r="3" />
143
+ </>,
144
+ ),
145
+ pyramid: icon(
146
+ <>
147
+ <path d="M12 4l7.5 13.5H4.5z" />
148
+ <path d="M12 4v13.5" />
149
+ </>,
150
+ ),
151
+ plane: icon(
152
+ <>
153
+ <path d="M4 15.5 14.5 5 20 10.5 9.5 21z" />
154
+ <path d="M4 15.5h5.5V21" />
155
+ </>,
156
+ ),
157
+ // Endpoint handles at r2: the curve is what names this glyph, and 1.5-radius
158
+ // dots on a 1.5 stroke stopped reading as handles at all.
159
+ spline: icon(
160
+ <>
161
+ <path d="M4 18c3-10 7-12 16-12" />
162
+ <circle cx="4" cy="18" r="2" />
163
+ <circle cx="20" cy="6" r="2" />
164
+ </>,
165
+ ),
166
+ };
167
+
168
+ /** The emitter's spark. */
169
+ const PARTICLES_ICON = icon(
170
+ <path d="M12 4.5v3M12 16.5v3M4.5 12h3M16.5 12h3M6.7 6.7l2.1 2.1M15.2 15.2l2.1 2.1M17.3 6.7l-2.1 2.1M8.8 15.2l-2.1 2.1" />,
171
+ );
172
+
173
+ /** The balloon cluster. */
174
+ const BALLOONS_ICON = icon(
175
+ <>
176
+ <circle cx="9.5" cy="8" r="4" />
177
+ <circle cx="16" cy="10.5" r="3" />
178
+ <path d="M9.5 12 11 20M16 13.5l-1 6.5" />
179
+ </>,
180
+ );
181
+
182
+ /**
183
+ * The curated Generate-shelf builtins, by registry id — the same ids the Add
184
+ * menu promotes, which is now a fact the compiler checks rather than a comment:
185
+ * the literal is `satisfies Record<PromotedBuiltinId, ReactElement>`, so a
186
+ * promotion nobody drew a glyph for, or a glyph for an id nothing promotes, is
187
+ * a build error here. Anything else keeps the instance diamond.
188
+ *
189
+ * Still a MAP over plain strings at the seam, because its readers hold a
190
+ * `layer.instance.component` that is any string at all (`isComponentGlyph` and
191
+ * `iconFor` below, and test/icons.test.tsx). A `PromotedBuiltinId`-keyed Record
192
+ * would refuse every one of those lookups.
193
+ */
194
+ export const PARTICLE_ICONS: ReadonlyMap<string, ReactElement> = new Map(
195
+ Object.entries({
196
+ "@dailies-studio/particles#ParticleEmitter": PARTICLES_ICON,
197
+ "@dailies-studio/particles#FoilBalloons": BALLOONS_ICON,
198
+ } satisfies Record<PromotedBuiltinId, ReactElement>),
199
+ );
200
+
201
+ const FALLBACK = icon(<path d="m12 6 6 6-6 6-6-6z" />);
202
+
203
+ /** The kind glyph alone, for callers that hold only a kind string. Total over
204
+ * garbage (an unknown kind is a fallback diamond, never a crash). */
205
+ export function kindIcon(kind: string): ReactElement {
206
+ return (KIND_ICONS as Record<string, ReactElement>)[kind] ?? FALLBACK;
207
+ }
208
+
209
+ /**
210
+ * Does this layer wear a COMPONENT glyph — one of the diamonds?
211
+ *
212
+ * The outliner paints kind icons in neutral ink and reserves the accent for the
213
+ * component family, so a tree of shapes reads as shapes and the components pop
214
+ * out of it. This is the predicate that decides which, and it keys on the same
215
+ * thing `iconFor` does: a promoted particle emitter draws its spark, not a
216
+ * diamond, so it is NOT in the family however much its layer kind says
217
+ * "instance". A bare instance falls through to the lone diamond and is.
218
+ */
219
+ export function isComponentGlyph(layer: Layer3D): boolean {
220
+ if (layer.kind === "component") return true;
221
+ return (
222
+ layer.kind === "instance" && !PARTICLE_ICONS.has(layer.instance.component)
223
+ );
224
+ }
225
+
226
+ /**
227
+ * The one-of-a-kind glyph for a LAYER: its primitive's for a shape mesh, its
228
+ * curated builtin's for a promoted instance, its kind's otherwise.
229
+ */
230
+ export function iconFor(layer: Layer3D): ReactElement {
231
+ if (layer.kind === "mesh") {
232
+ const primitive = meshPrimitiveOf(layer.mesh);
233
+ if (primitive !== null)
234
+ return PRIMITIVE_ICONS[primitive.kind] ?? KIND_ICONS.mesh;
235
+ }
236
+ if (layer.kind === "instance") {
237
+ return PARTICLE_ICONS.get(layer.instance.component) ?? KIND_ICONS.instance;
238
+ }
239
+ return kindIcon(layer.kind);
240
+ }
241
+
242
+ /** The Studio workspace: a video camera, Paper's switcher glyph. */
243
+ export const STUDIO_ICON = icon(
244
+ <>
245
+ <rect x="3" y="6" width="13" height="12" rx="2" />
246
+ <path d="m16 10 5-3v10l-5-3" />
247
+ </>,
248
+ );
249
+
250
+ /** The storyboard: a board with two dividers, the bar's three parts. */
251
+ export const STORYBOARD_ICON = icon(
252
+ <>
253
+ <rect x="3.5" y="5" width="17" height="14" rx="2" />
254
+ <path d="M9 5v14M15 5v14" />
255
+ </>,
256
+ );
257
+
258
+ /** A note card: a page with two lines. */
259
+ export const NOTE_ICON = icon(
260
+ <>
261
+ <path d="M6.5 4h8l4 4v12h-12z" />
262
+ <path d="M14.5 4v4h4M9 12h6M9 15.5h6" />
263
+ </>,
264
+ );
265
+
266
+ /** The board rail's Motion note: a curved path ending in an arrowhead, the
267
+ * "this moves like so" mark a storyboard artist draws over a frame. */
268
+ export const MOTION_NOTE_ICON = icon(<path d="M4 17c3-8 9-11 15-9m0 0-3.5-3M19 8l-3.5 3" />);
269
+
270
+ /** The shipped library: three spines on a shelf, the third leaning, which is
271
+ * what tells a shelf of books from the storyboard's board-with-dividers. */
272
+ export const LIBRARY_ICON = icon(
273
+ <>
274
+ <path d="M4 4.5h3v15H4zM9.5 4.5h3v15h-3z" />
275
+ <path d="m14.6 5.6 2.9-.8 3.9 14.4-2.9.8z" />
276
+ </>,
277
+ );
278
+
279
+ /** A sound card: a speaker with its wave. */
280
+ export const SOUND_ICON = icon(
281
+ <>
282
+ <path d="M4.5 9.5h3l4.5-4v13l-4.5-4h-3z" />
283
+ <path d="M15.5 9a4 4 0 0 1 0 6M18 6.5a7.5 7.5 0 0 1 0 11" />
284
+ </>,
285
+ );
286
+
287
+ /** Sound mode's tempo chip: a metronome, its arm off centre. */
288
+ export const METRONOME_ICON = icon(
289
+ <>
290
+ <path d="M9 3.5h6l4 17H5z" />
291
+ <path d="m12 15 5-8" />
292
+ </>,
293
+ );
294
+
295
+ /** A transition card: one frame sliding over the next. */
296
+ export const TRANSITION_ICON = icon(
297
+ <>
298
+ <rect x="3.5" y="6.5" width="11" height="11" rx="1.5" />
299
+ <path d="M14.5 8.5h4.5a1.5 1.5 0 0 1 1.5 1.5v6a1.5 1.5 0 0 1-1.5 1.5h-9" />
300
+ </>,
301
+ );
302
+
303
+ /** The camera bar's other two verbs, once the words came off them (they were
304
+ * three sentences costing 310px of a strip that stopped wrapping). The chain
305
+ * is "keep the shot camera tied to this view while I orbit"; the four corners
306
+ * are "frame the selection".
307
+ *
308
+ * Drawn here rather than reached for from @dailies-studio/ui's `IconLink` and
309
+ * `IconExpand`, which are the same two shapes: that set is a 12-unit grid at a
310
+ * 1.2 stroke, and beside this set's 24-unit 1.5-stroke glyphs in the SAME BAR
311
+ * the two families read as two families. Same geometry, this grid. */
312
+ export const LINK_ICON = icon(
313
+ <path d="M10 14 14 10M8.8 12.4 6.4 14.8a3.4 3.4 0 0 0 4.8 4.8l2.4-2.4M15.2 11.6l2.4-2.4a3.4 3.4 0 0 0-4.8-4.8L10.4 6.8" />,
314
+ );
315
+
316
+ /** The card kinds a reference draws as, reusing the layer glyphs where the
317
+ * thing is the same thing: an image is an image, a video a video, a text card
318
+ * the text tool, a native card the shape it names. TYPED over `CardKind`, so a
319
+ * new kind without a glyph is a compile error. */
320
+ export const REFERENCE_ICONS: Record<CardKind, ReactElement> = {
321
+ image: KIND_ICONS.image,
322
+ video: KIND_ICONS.video,
323
+ note: NOTE_ICON,
324
+ component: KIND_ICONS.instance,
325
+ library: LIBRARY_ICON,
326
+ text: KIND_ICONS.text,
327
+ transition: TRANSITION_ICON,
328
+ sound: SOUND_ICON,
329
+ native: KIND_ICONS.rect,
330
+ link: LINK_ICON,
331
+ };
332
+
333
+ /** A shot row: a clapperboard. */
334
+ export const SCENE_ICON = icon(
335
+ <>
336
+ <rect x="3.5" y="5" width="17" height="14" rx="2" />
337
+ <path d="M3.5 9.5h17M9 5.5l1.5 4M14 5.5l1.5 4" />
338
+ </>,
339
+ );
340
+
341
+ /** The board's seven element families, TYPED over `ElementFamily` so a new
342
+ * family without a glyph is a compile error. Each reuses the glyph its cards
343
+ * wear, so a button and the rows it adds read as one thing. */
344
+ export const ELEMENT_FAMILY_ICONS: Record<ElementFamily, ReactElement> = {
345
+ Text: KIND_ICONS.text,
346
+ Component: KIND_ICONS.instance,
347
+ Native: KIND_ICONS.rect,
348
+ Sound: SOUND_ICON,
349
+ Transition: TRANSITION_ICON,
350
+ Reference: KIND_ICONS.image,
351
+ Shot: SCENE_ICON,
352
+ };
353
+
354
+ /** A component DEFINITION: the four-diamond glyph (Figma's grammar). The gaps
355
+ * carry it — four diamonds that touch are one blob — so they are spaced a
356
+ * half-unit wider than the geometric packing at 3 units each. */
357
+ export const COMPONENT_ICON = icon(
358
+ <path d="M12 3 15 6 12 9 9 6zM18 9l3 3-3 3-3-3zM12 15l3 3-3 3-3-3zM6 9l3 3-3 3-3-3z" />,
359
+ );
360
+
361
+ /** The camera row in the dock, and the camera subject in the inspector head.
362
+ * NOT in `KIND_ICONS`: the camera is not a layer kind, it is the shot's own
363
+ * eye, so a typed record over `Layer3DKind` has no slot for it. */
364
+ export const CAMERA_ICON = icon(
365
+ <>
366
+ <path d="M3.5 8.5a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2h-6a2 2 0 0 1-2-2z" />
367
+ <path d="m13.5 12 5-3v6z" />
368
+ </>,
369
+ );
370
+
371
+ /**
372
+ * THE INSPECTOR'S SECTION GLYPHS, the leading 16px mark `InspectorSection`
373
+ * takes through its `icon` prop. Sized by `.insp-section-icon`, never here.
374
+ *
375
+ * Keyed on the section and not on the thing, because a section is a set of
376
+ * controls: "Shot & transition" holds the cut, so it wears the transition card
377
+ * the board's cards already wear for a cut. The camera is Paper's section
378
+ * glyph (a body and an open lens), redrawn on this 24 grid; it stays apart
379
+ * from `CAMERA_ICON`, the dock row's eye, because the section is the camera's
380
+ * settings and not the row. Blur is a drop, the image-editor mark for a blur
381
+ * tool; Postprocessing is the sparkle of an effect applied over the
382
+ * picture; the Project is a film strip, the whole cut.
383
+ */
384
+ export const SECTION_ICONS = {
385
+ camera: icon(
386
+ <>
387
+ <rect x="3" y="6" width="13.5" height="12" rx="3" />
388
+ <path d="M16.5 9.75 21 7.5v9l-4.5-2.25" />
389
+ </>,
390
+ ),
391
+ project: icon(
392
+ <>
393
+ <rect x="4" y="3.5" width="16" height="17" rx="2" />
394
+ <path d="M8 3.5v17M16 3.5v17M4 8h4M4 12h4M4 16h4M16 8h4M16 12h4M16 16h4" />
395
+ </>,
396
+ ),
397
+ shot: TRANSITION_ICON,
398
+ blur: icon(
399
+ <>
400
+ <path d="M12 3.5c3.5 4.2 6 7.4 6 10.5a6 6 0 0 1-12 0c0-3.1 2.5-6.3 6-10.5z" />
401
+ <path d="M9.5 14.5A2.5 2.5 0 0 0 12 17" />
402
+ </>,
403
+ ),
404
+ postprocessing: icon(
405
+ <>
406
+ <path d="m11 4 1.8 4.7 4.7 1.8-4.7 1.8L11 17l-1.8-4.7-4.7-1.8 4.7-1.8z" />
407
+ <path d="M18.5 15.5v5M16 18h5" />
408
+ </>,
409
+ ),
410
+ } as const satisfies Record<string, ReactElement>;
411
+
412
+ /** THE OTHER HALF OF Edit | Video, and `CAMERA_ICON` above is the Video
413
+ * half. The shot's own eye is already the glyph for "what the export sees".
414
+ *
415
+ * A PENCIL AND NOT A HAND. mo1 draws its pair as hand-versus-camera because
416
+ * its left mode is pan: the hand is literally what the pointer becomes. Ours
417
+ * is not a navigation mode (it is select, transform, arrange and draw, with
418
+ * panning available in both views), so a hand would name a gesture the mode
419
+ * does not own. The pencil is the one glyph for "making the thing" that needs
420
+ * no explaining.
421
+ *
422
+ * Same 24-unit grid and 1.5 stroke as the rest of this set, which is why it is
423
+ * drawn here rather than reached for from @dailies-studio/ui: that set is a
424
+ * 12-unit grid at 1.2, and the two families read as two families in one bar. */
425
+ export const EDIT_ICON = icon(
426
+ <>
427
+ <path d="M4.5 19.5h4l9.5-9.5-4-4L4.5 15.5z" />
428
+ <path d="m14 6 4 4" />
429
+ </>,
430
+ );
431
+
432
+ export const FIT_ICON = icon(
433
+ <path d="M8 3H3v5M16 3h5v5M8 21H3v-5M16 21h5v-5" />,
434
+ );
435
+
436
+ /** The way back, one level. Every back affordance in the chrome draws this:
437
+ * the rail's head, the dock's label-column corner, the header's crumbs. */
438
+ export const CHEVRON_LEFT_ICON = icon(<path d="M14.5 5.5 8 12l6.5 6.5" />);
439
+
440
+ /** The Add verb. A glyph on the same 18px grid as the tools it sits among,
441
+ * drawn here rather than left as a `+` character whose weight and baseline
442
+ * came from the font.
443
+ *
444
+ * IT IS A BARE GLYPH, which is what this comment used to deny. Its one call
445
+ * site is `AddMenu`'s dock trigger: this icon, a corner caret, and no word at
446
+ * all. The dock is ruled into groups now, so the rules and the caret say what
447
+ * "Add" would have, and a label there costs ~30px of a strip that must not
448
+ * wrap. The name is not lost — the trigger carries `aria-label="Add"` and a
449
+ * `title`, which is what a glyph in this set owes a reader either way. */
450
+ export const ADD_ICON = icon(<path d="M12 5.5v13M5.5 12h13" />);
451
+
452
+ /** More: the frame header's menu of the board's verbs. Three filled dots on
453
+ * the line. */
454
+ export const MORE_ICON = icon(
455
+ <>
456
+ <circle cx="6" cy="12" r="1.4" fill="currentColor" stroke="none" />
457
+ <circle cx="12" cy="12" r="1.4" fill="currentColor" stroke="none" />
458
+ <circle cx="18" cy="12" r="1.4" fill="currentColor" stroke="none" />
459
+ </>,
460
+ );
461
+
462
+ /** The side panel's fold: a column and an arrow towards it. The board rail's
463
+ * head draws it, and the folded rail's head flips it. */
464
+ export const FOLD_ICON = icon(<path d="M4 4.5v15M15 7l-5 5 5 5M10 12h10" />);
465
+
466
+ /** The search field's leading magnifier (the left column's outline filter).
467
+ * In this family rather than the ui package's 11-grid `IconSearch`, so the
468
+ * stroke matches the shot and layer glyphs in the rows under it. */
469
+ export const SEARCH_ICON = icon(
470
+ <>
471
+ <circle cx="10.5" cy="10.5" r="6" />
472
+ <path d="m15 15 4.5 4.5" />
473
+ </>,
474
+ );
475
+
476
+ /** Animate mode: a dot in a ring, the transport grammar for "this is being
477
+ * recorded". Deliberately NOT the accent — animate is a mode, not an armed
478
+ * tool, and the warm colour is what says so. */
479
+ export const RECORD_ICON = icon(
480
+ <>
481
+ <circle cx="12" cy="12" r="7.5" />
482
+ <circle cx="12" cy="12" r="3.5" fill="currentColor" stroke="none" />
483
+ </>,
484
+ );
485
+
486
+ export const EYE_ICON = icon(
487
+ <>
488
+ <path d="M3.5 12S6.5 6 12 6s8.5 6 8.5 6-3 6-8.5 6S3.5 12 3.5 12z" />
489
+ <circle cx="12" cy="12" r="2.5" />
490
+ </>,
491
+ );
492
+
493
+ export const EYE_OFF_ICON = icon(
494
+ <>
495
+ <path d="M3.5 12S6.5 6 12 6s8.5 6 8.5 6-3 6-8.5 6S3.5 12 3.5 12z" />
496
+ <path d="m5 4.5 14 15" />
497
+ </>,
498
+ );
499
+
500
+ /** A mask (gap 7, Paper page 25): a frame with the solid disc it cuts by.
501
+ * The outline tints it accent on the mask's own row and ink on its group. */
502
+ export const MASK_ICON = icon(
503
+ <>
504
+ <rect x="3" y="3" width="18" height="18" rx="3" />
505
+ <circle cx="12" cy="12" r="5" fill="currentColor" stroke="none" />
506
+ </>,
507
+ );
508
+
509
+ /** "Use as mask"'s two modes as what they read (Paper page 25): opacity
510
+ * fading out, and brightness running white to black. */
511
+ export const MASK_ALPHA_SWATCH = <span className="mask-swatch is-alpha" />;
512
+ export const MASK_LUMA_SWATCH = <span className="mask-swatch is-luma" />;
513
+
514
+ export const LOCK_ICON = icon(
515
+ <>
516
+ <rect x="5.5" y="10.5" width="13" height="9" rx="2" />
517
+ <path d="M8.5 10.5V8a3.5 3.5 0 0 1 7 0v2.5" />
518
+ </>,
519
+ );
520
+
521
+ export const UNLOCK_ICON = icon(
522
+ <>
523
+ <rect x="5.5" y="10.5" width="13" height="9" rx="2" />
524
+ <path d="M8.5 10.5V8a3.5 3.5 0 0 1 6.8-1.2" />
525
+ </>,
526
+ );
527
+
528
+ // ── the Paper redesign (2026-10-04) ──────────────────────────────────────────
529
+ // Geometry copied from the Paper boards, drawn at this set's 1.5 stroke (some
530
+ // boards say 1.6; one family, one weight). A Paper glyph that only redraws a
531
+ // role this set already covers (select, image, camera, eye, lock) did not
532
+ // replace the tuned one above; these are the roles the set lacked.
533
+
534
+ /** The header's history pair, replacing the 12-grid `IconUndo`/`IconRedo`. */
535
+ export const UNDO_ICON = icon(<path d="M9 5 4 10l5 5M4 10h9a6 6 0 0 1 0 12" />);
536
+ export const REDO_ICON = icon(<path d="m15 5 5 5-5 5m5-5h-9a6 6 0 0 0 0 12" />);
537
+
538
+ /** Export: an arrow down into a tray. */
539
+ export const DOWNLOAD_ICON = icon(<path d="M12 3v12m-5-5 5 5 5-5M4 17v4h16v-4" />);
540
+
541
+ /** Saved, and a confirmed row. */
542
+ export const CHECK_ICON = icon(<path d="m5 12 4 4L19 6" />);
543
+
544
+ export const CHEVRON_DOWN_ICON = icon(<path d="m6 9 6 6 6-6" />);
545
+ export const CHEVRON_RIGHT_ICON = icon(<path d="m9 6 6 6-6 6" />);
546
+
547
+ /** The Library's audition and preview play. The dock's transport draws the
548
+ * filled `IconPlay` from @dailies-studio/ui instead. */
549
+ export const PLAY_ICON = icon(<path d="m8 4 12 8-12 8z" />);
550
+ export const CUBE_ICON = icon(<path d="m12 3 9 5v9l-9 5-9-5V8zm0 10v9M3 8l9 5 9-5M7 5l10 6" />);
551
+
552
+ /** The transport's loop toggle. */
553
+ export const LOOP_ICON = icon(<path d="m18 3 3 4-3 4M3 7h18m-15 6-3 4 3 4m15-4H3" />);
554
+ /** An audition's other face (the Library's sound rows): a sound plays to its
555
+ * end or is stopped, it does not hold a place to resume from. */
556
+ export const STOP_ICON = icon(<rect x="6.5" y="6.5" width="11" height="11" rx="1.5" />);
557
+ /** `FIT_ICON`'s corners turned inward: leave the Library's expanded preview. */
558
+ export const COLLAPSE_ICON = icon(<path d="M3 8h5V3M16 3v5h5M8 21v-5H3M21 16h-5v5" />);
559
+ /** The zoom track's two ends. */
560
+ export const MINUS_ICON = icon(<path d="M5 12h14" />);
561
+
562
+ /** The tool footer's Shapes trigger. NOT the last-used shape's glyph, and not
563
+ * Paper's lone circle (the founder: "what is this icon for"): a circle, a
564
+ * triangle and a square say "the shapes" without naming one. The bottom-right
565
+ * quarter is left empty for the trigger's corner caret. */
566
+ export const SHAPES_ICON = icon(
567
+ <>
568
+ <circle cx="7.5" cy="7.5" r="4" />
569
+ <path d="M7.5 13.5 12 20.5H3z" />
570
+ <rect x="13.5" y="3.5" width="7" height="7" rx="1" />
571
+ </>,
572
+ );
573
+
574
+ /** The Library rail's categories, one per catalog kind plus "all". */
575
+ export const LIBRARY_CATEGORY_ICONS: Record<
576
+ "all" | "component" | "blueprint" | "material" | "shot" | "images" | "sounds" | "stock" | "generated",
577
+ ReactElement
578
+ > = {
579
+ all: icon(
580
+ <>
581
+ <rect x="3" y="3" width="7" height="7" rx="1" />
582
+ <rect x="14" y="3" width="7" height="7" rx="1" />
583
+ <rect x="3" y="14" width="7" height="7" rx="1" />
584
+ <rect x="14" y="14" width="7" height="7" rx="1" />
585
+ </>,
586
+ ),
587
+ component: icon(<path d="m12 3 9 9-9 9-9-9zm0 5 4 4-4 4-4-4z" />),
588
+ blueprint: icon(
589
+ <>
590
+ <rect x="3" y="3" width="5" height="5" rx="1" />
591
+ <rect x="16" y="16" width="5" height="5" rx="1" />
592
+ <path d="M8 5h9v11M5 8v9h11" />
593
+ </>,
594
+ ),
595
+ material: icon(
596
+ <>
597
+ <circle cx="12" cy="12" r="9" />
598
+ <path d="M12 3v18M4 8h8M3 12h9M4 16h8" />
599
+ </>,
600
+ ),
601
+ shot: icon(
602
+ <>
603
+ <rect x="3" y="5" width="18" height="15" rx="2" />
604
+ <path d="M3 9h18M7 5l3 4M14 5l3 4m-7 3 5 3-5 3z" />
605
+ </>,
606
+ ),
607
+ images: icon(
608
+ <>
609
+ <rect x="3" y="4" width="18" height="16" rx="2" />
610
+ <circle cx="8" cy="9" r="1.5" />
611
+ <path d="m4 18 5-5 4 3 3-5 4 7" />
612
+ </>,
613
+ ),
614
+ sounds: icon(<path d="M3 10v4M7 6v12M12 3v18M17 7v10M21 10v4" />),
615
+ // The sound history: what this workspace generated, a sparkle over a wave.
616
+ generated: icon(
617
+ <>
618
+ <path d="M3 14v3M7 11v9M11 13v5" />
619
+ <path d="M17 3l1.2 2.8L21 7l-2.8 1.2L17 11l-1.2-2.8L13 7l2.8-1.2z" />
620
+ </>,
621
+ ),
622
+ // Openverse's sounds, from the open web: a globe.
623
+ stock: icon(
624
+ <>
625
+ <circle cx="12" cy="12" r="9" />
626
+ <path d="M3 12h18M12 3c2.4 2.5 3.6 5.5 3.6 9s-1.2 6.5-3.6 9c-2.4-2.5-3.6-5.5-3.6-9S9.6 5.5 12 3Z" />
627
+ </>,
628
+ ),
629
+ };
630
+
631
+ // ── the tool dock ────────────────────────────────────────────────────────────
632
+ // SVGs where text glyphs used to be, keeping the typed-map compile guarantee:
633
+ // a dock tool added to tools.ts without a glyph here does not build.
634
+
635
+ const SELECT_ICON = icon(
636
+ <path d="M6.5 4.5 18 11.5l-5 .8 2.8 5.5-2.6 1.3-2.8-5.5-3.4 3.4z" />,
637
+ );
638
+
639
+ const PEN_ICON = icon(
640
+ <>
641
+ <path d="m4.5 19.5 2-6L15 5l4 4-8.5 8.5z" />
642
+ <path d="m13 7 4 4" />
643
+ </>,
644
+ );
645
+
646
+ const SPLINE_ICON = icon(
647
+ <>
648
+ <path d="M3.5 17.5C8 17.5 8 6.5 13 6.5s4 8 7.5 8" />
649
+ <circle cx="3.5" cy="17.5" r="1.5" />
650
+ <circle cx="13" cy="6.5" r="1.5" />
651
+ <circle cx="20.5" cy="14.5" r="1.5" />
652
+ </>,
653
+ );
654
+
655
+ export const DOCK_TOOL_ICONS: Record<DockTool, ReactElement> = {
656
+ select: SELECT_ICON,
657
+ text: KIND_ICONS.text,
658
+ image: KIND_ICONS.image,
659
+ rect: KIND_ICONS.rect,
660
+ path: PEN_ICON,
661
+ spline: SPLINE_ICON,
662
+ };
663
+
664
+ export const FLYOUT_TOOL_ICONS: Record<FlyoutTool, ReactElement> = {
665
+ ellipse: KIND_ICONS.ellipse,
666
+ line: KIND_ICONS.line,
667
+ arrow: KIND_ICONS.arrow,
668
+ };
669
+
670
+ /** An Add row's glyph, keyed on what the row makes (`AddRow.key`). Shared by
671
+ * the board's tool rail and the Insert drawer's Basics tiles. */
672
+ export function addRowIcon(key: string): ReactElement {
673
+ if (key === "media") return KIND_ICONS.image;
674
+ if (key.startsWith("shape:")) return PRIMITIVE_ICONS[key.slice(6) as MeshPrimitiveKind] ?? CUBE_ICON;
675
+ if (key === "mesh") return MODEL_FILE_ICON;
676
+ if (key === "device:browser") return BROWSER_ICON;
677
+ if (key.startsWith("device:")) return kindIcon("device");
678
+ if (key.startsWith("instance:")) return PARTICLE_ICONS.get(key.slice(9)) ?? kindIcon("instance");
679
+ if (key.startsWith("def:")) return COMPONENT_ICON;
680
+ return kindIcon(key);
681
+ }
682
+
683
+ // ── the Insert drawer ────────────────────────────────────────────────────────
684
+
685
+ export const CLOSE_ICON = icon(<path d="M18 6 6 18M6 6l12 12" />);
686
+
687
+ /** Lucide's `sparkles` (ISC), the inspector's "Shader background…" button. */
688
+ export const SPARKLES_ICON = icon(
689
+ <>
690
+ <path d="M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z" />
691
+ <path d="M20 2v4M22 4h-4" />
692
+ <circle cx="4" cy="20" r="2" />
693
+ </>,
694
+ );
695
+
696
+ /** Lucide's `file-box` (ISC): the Insert drawer's "3D model…", a file that
697
+ * holds a solid. */
698
+ const MODEL_FILE_ICON = icon(
699
+ <>
700
+ <path d="M14.5 22H18a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v4" />
701
+ <path d="M14 2v4a2 2 0 0 0 2 2h4" />
702
+ <path d="M3 13.1a2 2 0 0 0-1 1.76v3.24a2 2 0 0 0 .97 1.78L6 21.7a2 2 0 0 0 2.03.01L11 19.9a2 2 0 0 0 1-1.76V14.9a2 2 0 0 0-.97-1.78L8 11.3a2 2 0 0 0-2.03-.01Z" />
703
+ <path d="M7 17v5M11.7 14.2 7 17l-4.7-2.8" />
704
+ </>,
705
+ );
706
+
707
+ /** Lucide's `app-window` (ISC): the browser device preset. */
708
+ const BROWSER_ICON = icon(
709
+ <>
710
+ <rect x="2" y="4" width="20" height="16" rx="2" />
711
+ <path d="M10 4v4M2 8h20M6 4v4" />
712
+ </>,
713
+ );
714
+
715
+ /** Lucide's `image-up` (ISC): "Use as background", a picture sent behind. */
716
+ export const IMAGE_UP_ICON = icon(
717
+ <>
718
+ <path d="M10.3 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v10l-3.1-3.1a2 2 0 0 0-2.814.014L6 21" />
719
+ <path d="m14 19 3 3v-5.5M17 22l3-3" />
720
+ <circle cx="9" cy="9" r="2" />
721
+ </>,
722
+ );
723
+
724
+ /** A shader category's glyph, the tile a thumb-less effect shows. Keyed on
725
+ * the catalog's `EffectCategory`; an unknown one draws sparkles. */
726
+ const EFFECT_CATEGORY_ICONS: Readonly<Record<string, ReactElement>> = {
727
+ gradients: icon(
728
+ <>
729
+ <rect x="3" y="3" width="18" height="18" rx="2" />
730
+ <path d="M3 15 21 7M3 21 21 13" />
731
+ </>,
732
+ ),
733
+ noise: icon(<path d="M4 6h.01M9 4h.01M15 6h.01M20 4h.01M6 11h.01M12 10h.01M18 12h.01M4 17h.01M10 16h.01M15 19h.01M20 17h.01" />),
734
+ patterns: LIBRARY_CATEGORY_ICONS.all,
735
+ organic: icon(<path d="M12 21c-5-3-8-7-8-11a8 8 0 0 1 16 0c0 4-3 8-8 11Zm0-15v15" />),
736
+ space: icon(
737
+ <>
738
+ <circle cx="12" cy="12" r="4" />
739
+ <path d="M3.5 15.5C2 18 3 19.5 6 19c3.5-.6 8.2-3.4 11.6-6.8C21 8.8 22.3 5.8 20.2 5c-1.1-.4-2.8 0-4.7.8" />
740
+ </>,
741
+ ),
742
+ material: LIBRARY_CATEGORY_ICONS.material,
743
+ decor: SPARKLES_ICON,
744
+ };
745
+
746
+ export function effectCategoryIcon(category: string): ReactElement {
747
+ return EFFECT_CATEGORY_ICONS[category] ?? SPARKLES_ICON;
748
+ }
749
+
750
+ /** The canvas bar's Panels menu (Lucide `panels-top-left`): the window's
751
+ * three docked regions in one glyph, for the one trigger that shows them. */
752
+ export const PANELS_ICON = icon(
753
+ <>
754
+ <rect width="18" height="18" x="3" y="3" rx="2" />
755
+ <path d="M3 9h18M9 21V9" />
756
+ </>,
757
+ );
758
+
759
+ /** The Brief's "Open shot board" (Lucide `arrow-up-right`): it goes elsewhere. */
760
+ export const OPEN_ELSEWHERE_ICON = icon(<path d="M7 17 17 7M8 7h9v9" />);
761
+
762
+ /** The Brief's "Lay out Sketch N" (Paper SB6): two squares over a wide block,
763
+ * a sketch turned into layers. */
764
+ export const LAY_OUT_ICON = icon(
765
+ <>
766
+ <rect width="7" height="7" x="3" y="3" rx="1" />
767
+ <rect width="7" height="7" x="14" y="3" rx="1" />
768
+ <rect width="18" height="7" x="3" y="14" rx="1" />
769
+ </>,
770
+ );