@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,131 @@
1
+ // THE INBOX (Paper page 20, "Inbox"): a tray in the header with the unread
2
+ // count, and a dropdown of what happened to the caller's threads in every
3
+ // Project. HOSTED ONLY, like the avatar beside it: the local CLI has no
4
+ // accounts and so no one to notify.
5
+ //
6
+ // An item on THIS Project opens its thread in place (`store.openThread`); one
7
+ // on another Project leaves for it with `?thread=`, through `leaveFor` so the
8
+ // last edit lands first.
9
+ import { useEffect, useRef, useState } from "react";
10
+ import { Popover, sceneHref } from "@dailies-studio/ui";
11
+ import type { InboxItem } from "../../api.js";
12
+ import { useShotEditor, useStore } from "../../state/context.js";
13
+ import { isCloudWorkspace } from "../../state/posterCapture.js";
14
+ import { leaveFor } from "../header/leave.js";
15
+ import { INBOX_ICON, PersonAvatar, shortAgo, sparkle, useComments } from "./parts.js";
16
+
17
+ const VERB: Record<InboxItem["kind"], string> = {
18
+ mention: "mentioned you",
19
+ reply: "replied",
20
+ assigned: "assigned you",
21
+ resolved: "resolved a thread",
22
+ reopened: "reopened a thread",
23
+ };
24
+
25
+ export function InboxButton() {
26
+ return isCloudWorkspace() ? <Inbox /> : null;
27
+ }
28
+
29
+ function Inbox() {
30
+ const store = useStore();
31
+ const { comments } = store;
32
+ const { inbox } = useComments();
33
+ const projectId = useShotEditor((s) => s.doc?.id ?? null);
34
+ const anchor = useRef<HTMLButtonElement>(null);
35
+ const [open, setOpen] = useState(false);
36
+ const [unreadOnly, setUnreadOnly] = useState(true);
37
+
38
+ // The first read; `inbox-changed` and focus read it again (renderEvents.ts).
39
+ useEffect(() => {
40
+ void comments.loadInbox();
41
+ }, [comments]);
42
+
43
+ const items = unreadOnly ? inbox.items.filter((item) => item.readAt === null) : inbox.items;
44
+ const go = (item: InboxItem): void => {
45
+ setOpen(false);
46
+ void comments.markInboxRead([item.id]);
47
+ if (item.projectId === projectId) void store.openThread(item.threadId);
48
+ else if (item.projectName !== null) {
49
+ leaveFor(store, `${sceneHref(item.projectName)}&thread=${encodeURIComponent(item.threadId)}`);
50
+ }
51
+ };
52
+
53
+ return (
54
+ <>
55
+ <button
56
+ ref={anchor}
57
+ type="button"
58
+ className="inbox-button"
59
+ data-testid="inbox-button"
60
+ aria-label={inbox.unread > 0 ? `Inbox, ${inbox.unread} unread` : "Inbox"}
61
+ aria-expanded={open}
62
+ title="Inbox"
63
+ onClick={() => setOpen((v) => !v)}
64
+ >
65
+ {INBOX_ICON}
66
+ {inbox.unread > 0 ? <span className="inbox-badge">{inbox.unread > 99 ? "99+" : inbox.unread}</span> : null}
67
+ </button>
68
+ <Popover open={open} anchor={anchor} onClose={() => setOpen(false)} align="right" className="inbox-pop">
69
+ <div className="inbox" data-testid="inbox">
70
+ <div className="inbox-head">
71
+ <span className="inbox-title">Inbox</span>
72
+ <div className="inbox-toggle" role="radiogroup" aria-label="Show">
73
+ <button type="button" role="radio" aria-checked={unreadOnly} onClick={() => setUnreadOnly(true)}>
74
+ Unread{inbox.unread > 0 ? ` ${inbox.unread}` : ""}
75
+ </button>
76
+ <button type="button" role="radio" aria-checked={!unreadOnly} onClick={() => setUnreadOnly(false)}>
77
+ All
78
+ </button>
79
+ </div>
80
+ <span className="comment-thread-spacer" />
81
+ <button
82
+ type="button"
83
+ className="inbox-mark-all"
84
+ disabled={inbox.unread === 0}
85
+ onClick={() => void comments.markInboxRead()}
86
+ >
87
+ Mark all read
88
+ </button>
89
+ </div>
90
+ <div className="inbox-list">
91
+ {items.length === 0 ? (
92
+ <p className="inbox-empty">{unreadOnly ? "You are all caught up." : "Nothing here yet."}</p>
93
+ ) : (
94
+ items.map((item) => (
95
+ <button
96
+ key={item.id}
97
+ type="button"
98
+ className={`inbox-item${item.readAt === null ? " is-unread" : ""}`}
99
+ data-testid="inbox-item"
100
+ onClick={() => go(item)}
101
+ >
102
+ {item.viaAgent ? (
103
+ <span className="inbox-agent" aria-hidden="true">
104
+ {sparkle(12)}
105
+ </span>
106
+ ) : (
107
+ <PersonAvatar userId={item.actorId} label={item.actorLabel} size={26} className="is-tailed" />
108
+ )}
109
+ <span className="inbox-item-main">
110
+ <span className="inbox-item-title">
111
+ {item.actorLabel} {VERB[item.kind]}
112
+ </span>
113
+ {item.excerpt === "" ? null : <span className="inbox-item-quote">"{item.excerpt}"</span>}
114
+ <span className="inbox-item-where">
115
+ {[item.projectTitle ?? item.projectName, item.frameLabel].filter((s) => s !== null).join(" · ")}
116
+ </span>
117
+ </span>
118
+ <span className="inbox-item-side">
119
+ <span className="inbox-item-time">{shortAgo(item.createdAt)}</span>
120
+ {item.readAt === null ? <span className="comments-unread-dot" aria-label="Unread" /> : null}
121
+ </span>
122
+ </button>
123
+ ))
124
+ )}
125
+ </div>
126
+ <div className="inbox-foot">Email digest: every 5 minutes</div>
127
+ </div>
128
+ </Popover>
129
+ </>
130
+ );
131
+ }
@@ -0,0 +1,98 @@
1
+ // THE @ MENU (Paper page 20, "Mention menu"): the listbox half of the
2
+ // composer's ARIA combobox. The textarea owns focus and the keys
3
+ // (CommentComposer); this draws the options and takes pointer picks.
4
+ //
5
+ // Two sections: the people on the Project, then workspace members with no
6
+ // access. Those can be mentioned only through a share, which only someone who
7
+ // can share the Project may start (the server lists them to no one else);
8
+ // anyone else is told why a name is missing.
9
+ import type { Mentionable, MentionablePerson } from "../../api.js";
10
+ import { personLabel } from "../../state/comments.js";
11
+ import { PersonAvatar } from "./parts.js";
12
+
13
+ /** One pickable row: a Project person, or a share-and-mention. */
14
+ export interface MentionOption {
15
+ person: MentionablePerson;
16
+ share: boolean;
17
+ }
18
+
19
+ /** The rows the keys walk, in drawn order. Workspace members count only when
20
+ * the caller can share. */
21
+ export function mentionOptions(result: Mentionable): MentionOption[] {
22
+ return [
23
+ ...result.people.map((person) => ({ person, share: false })),
24
+ ...(result.canShare ? result.others.map((person) => ({ person, share: true })) : []),
25
+ ];
26
+ }
27
+
28
+ export const optionId = (menuId: string, i: number): string => `${menuId}-opt-${i}`;
29
+
30
+ export function MentionMenu(props: {
31
+ id: string;
32
+ result: Mentionable;
33
+ active: number;
34
+ onPick: (option: MentionOption) => void;
35
+ onActive: (i: number) => void;
36
+ }) {
37
+ const { result } = props;
38
+ const options = mentionOptions(result);
39
+ const roleOf = new Map(result.people.map((p) => [p.id, p.role]));
40
+ const row = (option: MentionOption, i: number) => {
41
+ const label = personLabel(option.person);
42
+ return (
43
+ <div
44
+ key={option.person.id}
45
+ id={optionId(props.id, i)}
46
+ role="option"
47
+ aria-selected={i === props.active}
48
+ className={`mention-row${i === props.active ? " is-active" : ""}${option.share ? " is-outside" : ""}`}
49
+ data-testid="mention-option"
50
+ // A press must not take focus off the textarea: the caret is where
51
+ // the chip goes.
52
+ onPointerDown={(e) => e.preventDefault()}
53
+ onPointerEnter={() => props.onActive(i)}
54
+ onClick={() => props.onPick(option)}
55
+ >
56
+ <PersonAvatar userId={option.person.id} label={label} size={24} />
57
+ <span className="mention-name">{label}</span>
58
+ {option.person.guest ? <span className="comment-guest">GUEST</span> : null}
59
+ {option.share ? (
60
+ <span className="mention-share">Share and mention</span>
61
+ ) : (
62
+ <span className="mention-role">{roleWord(roleOf.get(option.person.id))}</span>
63
+ )}
64
+ </div>
65
+ );
66
+ };
67
+ return (
68
+ <div id={props.id} role="listbox" aria-label="People to mention" className="mention-menu" data-testid="mention-menu">
69
+ <div className="mention-section" role="presentation">
70
+ People on this project
71
+ </div>
72
+ {result.people.length === 0 ? (
73
+ result.canShare ? (
74
+ <div className="mention-empty">No one on this Project matches.</div>
75
+ ) : (
76
+ // The server lists members without access only to someone who can
77
+ // share, so anyone else hears why the person they want is missing.
78
+ <p className="mention-note" data-testid="mention-no-share">
79
+ No one on this Project matches. To mention someone else, ask a Project admin to share it with them.
80
+ </p>
81
+ )
82
+ ) : null}
83
+ {options.filter((o) => !o.share).map((o, i) => row(o, i))}
84
+ {result.canShare && result.others.length > 0 ? (
85
+ <div className="mention-outside" role="presentation">
86
+ <div className="mention-section">In the workspace, no access</div>
87
+ {options.map((o, i) => (o.share ? row(o, i) : null))}
88
+ </div>
89
+ ) : null}
90
+ </div>
91
+ );
92
+ }
93
+
94
+ function roleWord(role: string | undefined): string {
95
+ if (role === undefined) return "";
96
+ if (role === "project_admin") return "Admin";
97
+ return role.charAt(0).toUpperCase() + role.slice(1);
98
+ }
@@ -0,0 +1,171 @@
1
+ // Small shared pieces of the comment chrome (Paper page 20): the store hook,
2
+ // a person's avatar, a body with its mention chips, short times, and the
3
+ // 16px glyphs the page draws.
4
+ import { useSyncExternalStore } from "react";
5
+ import type { ReactElement, ReactNode } from "react";
6
+ import { initialsOf } from "@dailies-studio/ui";
7
+ import { useShotEditor, useStore } from "../../state/context.js";
8
+ import {
9
+ boardThreads,
10
+ bodySegments,
11
+ cardCommentCounts,
12
+ cardCountWords,
13
+ personColor,
14
+ studioThreads,
15
+ } from "../../state/comments.js";
16
+ import type { CommentsState } from "../../state/comments.js";
17
+
18
+ /** The comments store's state. One snapshot per change, so a component reads
19
+ * it whole and derives what it needs. */
20
+ export function useComments(): CommentsState {
21
+ const { comments } = useStore();
22
+ return useSyncExternalStore(comments.subscribe, comments.getState);
23
+ }
24
+
25
+ /** The open threads of the place on screen (S5): the board's on the board,
26
+ * the Studio's off it. The Comments tab's count, which matches its list. */
27
+ export function useOpenHere(): number {
28
+ const { threads } = useComments();
29
+ const onBoard = useShotEditor((s) => s.storyboardOpen);
30
+ return (onBoard ? boardThreads(threads) : studioThreads(threads)).filter((t) => t.status === "open").length;
31
+ }
32
+
33
+ /** A person's initials on their colour. `size` is the diameter in px. */
34
+ export function PersonAvatar(props: { userId: string; label: string; size: number; className?: string }): ReactElement {
35
+ return (
36
+ <span
37
+ className={`comment-avatar${props.className === undefined ? "" : ` ${props.className}`}`}
38
+ aria-hidden="true"
39
+ style={{
40
+ width: props.size,
41
+ height: props.size,
42
+ fontSize: Math.round(props.size * 0.4),
43
+ background: personColor(props.userId),
44
+ }}
45
+ >
46
+ {initialsOf(props.label)}
47
+ </span>
48
+ );
49
+ }
50
+
51
+ /** A board card's open comment counts (S5): "2 board" for its own threads,
52
+ * "1 Studio" for the open Studio threads about it. Nothing with none. The
53
+ * card mounts it; the Comments panel's card headers do too. */
54
+ export function CardCommentCounts(props: { target: { partId: string } | { referenceId: string } }) {
55
+ const { threads } = useComments();
56
+ const doc = useShotEditor((s) => s.doc);
57
+ if (doc === null) return null;
58
+ const count = cardCommentCounts(doc, threads, props.target);
59
+ if (count.board === 0 && count.studio === 0) return null;
60
+ return (
61
+ <span className="card-comment-counts" data-testid="card-comment-counts" aria-label={`Comments: ${cardCountWords(count)}`}>
62
+ {count.board > 0 ? <span className="card-comment-chip is-board">{count.board} board</span> : null}
63
+ {count.studio > 0 ? <span className="card-comment-chip is-studio">{count.studio} Studio</span> : null}
64
+ </span>
65
+ );
66
+ }
67
+
68
+ /** A stored body: its text, with each `<@id>` as a chip. */
69
+ export function CommentBody(props: { body: string; names: Readonly<Record<string, string>>; className: string }) {
70
+ return (
71
+ <p className={props.className}>
72
+ {bodySegments(props.body, props.names).map((segment, i) =>
73
+ segment.kind === "text" ? (
74
+ segment.text
75
+ ) : (
76
+ <span key={i} className="comment-mention">
77
+ @{segment.label}
78
+ </span>
79
+ ),
80
+ )}
81
+ </p>
82
+ );
83
+ }
84
+
85
+ const MINUTE = 60_000;
86
+ const HOUR = 60 * MINUTE;
87
+ const DAY = 24 * HOUR;
88
+
89
+ /** "now", "5m", "3h", "2d", then the date. */
90
+ export function shortAgo(ms: number, now = Date.now()): string {
91
+ const gap = Math.max(0, now - ms);
92
+ if (gap < MINUTE) return "now";
93
+ if (gap < HOUR) return `${Math.floor(gap / MINUTE)}m`;
94
+ if (gap < DAY) return `${Math.floor(gap / HOUR)}h`;
95
+ if (gap < 7 * DAY) return `${Math.floor(gap / DAY)}d`;
96
+ return new Date(ms).toLocaleDateString(undefined, { month: "short", day: "numeric" });
97
+ }
98
+
99
+ function glyph(size: number, children: ReactNode, viewBox = 16): ReactElement {
100
+ return (
101
+ <svg
102
+ width={size}
103
+ height={size}
104
+ viewBox={`0 0 ${viewBox} ${viewBox}`}
105
+ fill="none"
106
+ stroke="currentColor"
107
+ strokeLinecap="round"
108
+ strokeLinejoin="round"
109
+ aria-hidden="true"
110
+ >
111
+ {children}
112
+ </svg>
113
+ );
114
+ }
115
+
116
+ /** The rail's Comment tool. */
117
+ export const COMMENT_ICON = glyph(
118
+ 16,
119
+ <path strokeWidth={1.5} d="M3 3.5h10a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1H8.5L5.5 14v-2.5H3a1 1 0 0 1-1-1v-6a1 1 0 0 1 1-1z" />,
120
+ );
121
+
122
+ export const RESOLVE_ICON = glyph(
123
+ 14,
124
+ <>
125
+ <circle cx="7" cy="7" r="5.6" strokeWidth={1.2} />
126
+ <path strokeWidth={1.3} d="M4.6 7.1 L6.3 8.7 L9.4 5.4" />
127
+ </>,
128
+ 14,
129
+ );
130
+
131
+ /** The filled green check of a resolved thread. */
132
+ export const RESOLVED_ICON = (
133
+ <svg width={14} height={14} viewBox="0 0 14 14" aria-hidden="true">
134
+ <circle cx="7" cy="7" r="5.6" fill="var(--success)" />
135
+ <path d="M4.6 7.1 L6.3 8.7 L9.4 5.4" fill="none" stroke="#0A0A0A" strokeWidth={1.4} strokeLinecap="round" strokeLinejoin="round" />
136
+ </svg>
137
+ );
138
+
139
+ export function sparkle(size: number): ReactElement {
140
+ return (
141
+ <svg width={size} height={size} viewBox="0 0 14 14" aria-hidden="true">
142
+ <path d="M7 1.5 L8.2 5.8 L12.5 7 L8.2 8.2 L7 12.5 L5.8 8.2 L1.5 7 L5.8 5.8 Z" fill="var(--accent-ink)" />
143
+ </svg>
144
+ );
145
+ }
146
+
147
+ export const CHEVRON_ICON = glyph(10, <path strokeWidth={1.3} d="M2.5 4 L5 6.5 L7.5 4" />, 10);
148
+
149
+ export const INBOX_ICON = glyph(
150
+ 16,
151
+ <>
152
+ <path strokeWidth={1.4} d="M2 9 L4 3 H12 L14 9 V12.5 Q14 13.5 13 13.5 H3 Q2 13.5 2 12.5 Z" />
153
+ <path strokeWidth={1.4} d="M2 9 H5.5 L6.5 10.5 H9.5 L10.5 9 H14" />
154
+ </>,
155
+ );
156
+
157
+ export const EYE_ICON = (
158
+ <svg width={14} height={14} viewBox="0 0 16 16" aria-hidden="true">
159
+ <path d="M1.5 8 Q8 1.5 14.5 8 Q8 14.5 1.5 8 Z" fill="none" stroke="currentColor" strokeWidth={1.4} strokeLinejoin="round" />
160
+ <circle cx="8" cy="8" r="2.2" fill="currentColor" />
161
+ </svg>
162
+ );
163
+
164
+ /** The strip badges' speech bubble. */
165
+ export function bubble(size: number): ReactElement {
166
+ return (
167
+ <svg width={size} height={size} viewBox="0 0 14 14" aria-hidden="true">
168
+ <path d="M2 3 Q2 1.5 3.5 1.5 H10.5 Q12 1.5 12 3 V8.5 Q12 10 10.5 10 H6 L3 12.5 V10 Q2 10 2 8.5 Z" fill="currentColor" />
169
+ </svg>
170
+ );
171
+ }