@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 @@
1
+ @layer vendor{.react-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgba(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.react-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgba(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #555;--xy-background-pattern-lines-color-default: #333;--xy-background-pattern-cross-color-default: #333;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1;touch-action:none}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.react-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px) translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px) translateY(-50%)}.react-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.react-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.react-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.react-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.react-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.react-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.react-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) )}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:5px;height:5px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));translate:-50% -50%}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color, var(--xy-edge-label-color-default))}}
@@ -0,0 +1,14 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/MaterialGraphCanvas-BFzl4wWR.js","assets/index-BGHQGV5z.js","assets/index-4F5NQmI8.css","assets/MaterialGraphCanvas-BIUD59ik.css"])))=>i.map(i=>d[i]);
2
+ import{aw as ce,ax as pe,ay as Z,az as R,aA as ae,aB as ue,aC as he,aD as re,aE as de,aF as ge,aG as $e,aH as be,q as X,u as Q,A as P,B as D,h as ve,aI as oe,aJ as ye,v as l,ag as ee,aK as xe,aL as je,aM as Ne,aN as we,w as Se,aO as ke,a4 as Ie,aP as Me,F as _e}from"./index-BGHQGV5z.js";const Ce=Object.freeze({color:".rgb",alpha:".a",x:".x",y:".y",z:".z",w:".w"});function me(e,t){return t==="repeat"?`${e}.fract()`:t==="mirror"?`${e}.mul(0.5).fract().mul(2).sub(1).abs()`:e}function ne(e,t){return`textureByAsset(${JSON.stringify(e.assetId??"")}, ${JSON.stringify(t==="color"?"srgb":"linear")})`}function ie(e,t,a){const s=me(e.input(t,"uv","data"),t.wrap);return`${e.use("texture")}(${a}, ${s})`}function Oe(e,t,a){const s=ne(t,a),r=e.input(t,"scale","data"),f=e.input(t,"position","data"),i=`${e.use("normalize")}(${e.use("abs")}(${e.input(t,"normal","data")}))`,c=`${i}.div(${i}.dot(${e.use("vec3")}(1, 1, 1)))`,o=(p,u)=>`${e.use("texture")}(${s}, ${me(`${f}.${p}.mul(${r})`,t.wrap)}).mul(${c}.${u})`;return`${o("yz","x")}.add(${o("zx","y")}).add(${o("xy","z")})`}const Ee=Object.freeze({"source-color":e=>`${e.use("materialColor")}.rgb`,"source-alpha":e=>e.use("materialOpacity"),"source-roughness":e=>e.use("materialRoughness"),"source-metalness":e=>e.use("materialMetalness"),"source-emissive":e=>e.use("materialEmissive"),time:()=>"studioTime",float:null,int:null,bool:null,color:null,vec2:null,vec3:null,vec4:null,parameter:(e,t)=>e.parameterVar(t.parameterId??""),"position-local":null,"position-world":null,"position-view":null,"normal-local":null,"normal-world":null,"normal-view":null,"view-direction":null,"camera-position":null,"screen-uv":null,"vertex-color":(e,t)=>`${e.use("vertexColor")}(${t.index??0})`,uv:(e,t)=>`${e.use("uv")}(${t.index??0})`,abs:null,sign:null,floor:null,ceil:null,round:null,fract:null,sqrt:null,exp:null,log:null,saturate:null,"one-minus":null,negate:null,sin:null,cos:null,tan:null,asin:null,acos:null,atan:null,sinh:null,cosh:null,tanh:null,exp2:null,log2:null,trunc:null,degrees:null,radians:null,"inverse-sqrt":null,parabola:null,sinc:null,"safe-power":null,dfdx:null,dfdy:null,fwidth:null,aastep:null,add:null,subtract:null,multiply:null,divide:null,pow:null,mod:null,min:null,max:null,step:null,atan2:null,mix:null,clamp:null,smoothstep:null,remap:null,"remap-clamp":null,dot:null,cross:null,normalize:null,length:null,"length-sq":null,distance:null,reflect:null,refract:null,"face-forward":null,fresnel:(e,t)=>`${e.use("normalView")}.dot(${e.use("positionViewDirection")}).saturate().oneMinus().pow(${e.input(t,"power","data")})`,"combine-vec2":null,"combine-vec3":null,"combine-vec4":null,split:(e,t)=>e.input(t,"value","data"),swizzle:(e,t)=>`${e.input(t,"value","data")}.${t.mask??"x"}`,"to-int":null,"less-than":null,"greater-than":null,"less-equal":null,"greater-equal":null,equal:null,"not-equal":null,and:null,or:null,not:null,select:null,luminance:null,saturation:null,hue:null,grayscale:null,vibrance:null,contrast:null,posterize:null,"blend-screen":null,"blend-overlay":null,"blend-burn":null,"blend-dodge":null,"blend-color":null,"rgb-to-hsv":null,"hsv-to-rgb":null,noise:null,"noise-vec3":null,"fractal-noise":null,"fractal-noise-vec2":null,"fractal-noise-vec3":null,"worley-noise":null,"worley-noise-vec2":null,"worley-noise-vec3":null,"tri-noise":null,"gradient-noise":null,"cell-noise":null,hash:null,checker:null,"rotate-uv":null,"tile-uv":(e,t)=>`${e.input(t,"uv","data")}.mul(${e.input(t,"scale","data")}).add(${e.input(t,"offset","data")})`,"spherize-uv":null,"matcap-uv":null,"equirect-uv":null,texture:(e,t,a)=>ie(e,t,ne(t,a)),"texture-asset":(e,t,a)=>ne(t,a),"sample-texture":(e,t,a)=>ie(e,t,e.input(t,"texture",a)),"triplanar-texture":Oe,"tsl-texture":(e,t,a)=>{const s=t.generator??"",r=R($e,s);if(r===void 0)return"undefined";const f=r.inputs.map(i=>`${i.id}: ${e.input(t,i.id,a)}`);return`${e.useGenerator(s)}({ ${f.join(", ")} })`},subgraph:(e,t,a)=>{const s=R(e.graph.functions,t.functionId??"");if(s===void 0)return"undefined";const r=s.inputs.map(f=>e.input(t,f.id,a));return`${e.functionVar(s.id,a)}(${r.join(", ")})`},"fn-input":(e,t)=>e.argVar(t),"fn-output":null,reroute:(e,t)=>e.input(t,"value","data"),comment:null,group:null,"output-studio":null,"output-standard":null,"output-physical":null});function le(e,t,a){switch(t){case"float":return`${a("float")}(${JSON.stringify(typeof e=="number"?e:0)})`;case"int":return`${a("int")}(${JSON.stringify(typeof e=="number"?Math.trunc(e):0)})`;case"bool":return`${a("bool")}(${e===!0?"true":"false"})`;case"color":return`${a("color")}(${JSON.stringify(typeof e=="string"?e:"#ffffff")})`;case"vec2":case"vec3":case"vec4":{const r=Array.from({length:t==="vec2"?2:t==="vec3"?3:4},(f,i)=>JSON.stringify(Array.isArray(e)&&typeof e[i]=="number"?e[i]:0));return`${a(t)}(${r.join(", ")})`}}}function Re(e){return typeof e=="boolean"?"bool":typeof e=="string"?"color":Array.isArray(e)?e.length===2?"vec2":e.length===4?"vec4":"vec3":"float"}function fe(e,t){return be.has(e)?`${t(e)}()`:t(e)}function Te(e,t){if(e.defaultAccessor!==void 0)return fe(e.defaultAccessor,t);const a=e.type==="numeric"||e.type==="texture"?Re(e.defaultValue):e.type;return le(e.defaultValue,a,t)}function Ae(e){const t=new Map;for(const f of e.edges)t.set(U(f.target.nodeId,f.target.socket),f);const a={nodes:new Map,functions:new Map},s=(f,i)=>{const c=a.nodes.get(f)??new Set;if(c.has(i))return;c.add(i),a.nodes.set(f,c);const o=R(e.nodesById,f);if(o===void 0)return;for(const y of Z(e,o).inputs){const v=t.get(U(o.id,y.id));v!==void 0&&s(v.source.nodeId,de(y,i))}if(o.kind!=="subgraph"||typeof o.functionId!="string")return;const p=R(e.functions,o.functionId);if(p===void 0)return;const u=a.functions.get(p.id)??new Set;u.has(i)||(u.add(i),a.functions.set(p.id,u),s(p.outputNodeId,i))},r=R(e.nodesById,e.outputNodeId);if(r!==void 0)for(const f of Z(e,r).inputs){const i=t.get(U(e.outputNodeId,f.id));i!==void 0&&s(i.source.nodeId,ue(f.id))}return a}function U(e,t){return`${e}\0${t}`}function ze(e){const t=ce(e);if(t.length>0)throw new Error(`cannot emit invalid material graph: ${t[0].at}: ${t[0].message}`);const a=pe(e),s=new Map(a.map((n,m)=>[n.id,`n${m}`])),r=e.nodesById[e.outputNodeId],f=Z(e,r).inputs,i=new Map(e.edges.map(n=>[U(n.target.nodeId,n.target.socket),n])),c=Ae(e),o=Object.keys(e.parameters).sort(),p=new Map(o.map((n,m)=>[n,`p${m}`])),u=Object.keys(e.functions??{}).sort(),y=new Map(u.map((n,m)=>[n,m])),v=new Set,w=new Set,O=[],S=n=>(v.add(n),n),g=n=>(w.add(n),n),$=(n,m)=>{const d=s.get(n)??"undefined",h=R(e.nodesById,n),b=c.nodes.get(n);return h!==void 0&&re(h.kind)&&b?.size===2?`${d}${m==="color"?"Color":"Data"}`:d},C=(n,m)=>{const d=`f${y.get(n)??0}`,h=c.functions.get(n);return h!==void 0&&h.size===2?`${d}${m==="color"?"Color":"Data"}`:d},I=n=>{const d=(n.scope===void 0?void 0:R(e.functions,n.scope))?.inputs.findIndex(h=>h.id===n.socket)??-1;return d<0?"undefined":`a${d}`},M=(n,m,d)=>`${$(n,d)}${R(Ce,m)??""}`,k=(n,m,d)=>{const h=Z(e,n).inputs.find(x=>x.id===m),b=i.get(U(n.id,m));if(b!==void 0){const x=h===void 0?d:de(h,d);return M(b.source.nodeId,b.source.socket,x)}return h===void 0?"undefined":Te(h,S)},G={use:S,useGenerator:g,input:k,parameterVar:n=>p.get(n)??"undefined",functionVar:C,argVar:I,graph:e},T=(n,m)=>{const d=ge(n.kind);if(d===null||d.inert===!0)return null;const h=R(Ee,n.kind);if(h!=null)return h(G,n,m);if(d.compile.form==="accessor")return fe(d.compile.name,S);if(d.compile.form==="call"){const b=d.compile.args.map(x=>"socket"in x?k(n,x.socket,m):JSON.stringify(x.literal));return`${S(d.compile.fn)}(${b.join(", ")})`}return null},_=(n,m)=>{const d=[];for(const h of a){if((h.scope??void 0)!==n||h.id===e.outputNodeId||h.kind==="fn-output"||R(ae,h.kind)!==void 0)continue;const b=c.nodes.get(h.id);if(b===void 0||b.size===0)continue;const x=["color","data"].filter(E=>b.has(E)),A=re(h.kind)?x:x.slice(0,1);for(const E of A){const H=T(h,E);H!==null&&d.push(`${m}const ${$(h.id,E)} = ${H};`)}}return d},j=[];for(const n of o){const m=e.parameters[n],d=p.get(n);j.push(` const ${d} = ${S("uniform")}(${le(m.default,m.type,S)});`),O.push(`${JSON.stringify(n)}: ${d}`)}for(const n of a){const m=R(ae,n.kind);if(m===void 0||c.nodes.get(n.id)===void 0)continue;const d=$(n.id,"data");j.push(` const ${d} = ${S("uniform")}(${le(n.value,m,S)});`),O.push(`${JSON.stringify(n.id)}: ${d}`)}j.length>0&&j.push("");for(const n of u){const m=e.functions[n],d=c.functions.get(n);if(d!==void 0)for(const h of["color","data"].filter(b=>d.has(b))){const b=m.inputs.map((H,B)=>`a${B}`).join(", "),x=_(n," "),A=R(e.nodesById,m.outputNodeId),E=A===void 0?"undefined":k(A,"value",h);j.push(` const ${C(n,h)} = ${S("Fn")}(([${b}]) => {`),j.push(...x),j.push(` return ${E};`),j.push(" });")}}u.length>0&&c.functions.size>0&&j.push(""),j.push(..._(void 0," "));const N=e.model==="studio"?"MeshBasicNodeMaterial":e.model==="standard"?"MeshStandardNodeMaterial":"MeshPhysicalNodeMaterial",W=[];for(const n of f){const m=i.get(U(r.id,n.id));if(m===void 0)continue;const d=ue(n.id),h=M(m.source.nodeId,m.source.socket,d),b=n.id==="normal"?`${S("normalMap")}(${h})`:h;W.push(` material.${he(n.id)} = ${b};`)}const J=[...v].sort(),K=J.length===0?"":`import { ${J.join(", ")} } from "three/tsl";
3
+ `,z=[...w].sort(),V=z.length===0?"":`import { ${z.join(", ")} } from "@dailies-studio/tsl-textures";
4
+ `,F=j.filter((n,m)=>!(n===""&&(m===j.length-1||j[m-1]==="")));return`${K}import { ${N} } from "three/webgpu";
5
+ ${V}
6
+ export function createMaterialGraph({ studioTime, textureByAsset }) {
7
+ ${F.join(`
8
+ `)}${F.length===0?"":`
9
+ `} const material = new ${N}();
10
+ ${W.join(`
11
+ `)}${W.length===0?"":`
12
+ `} return { material, uniforms: { ${O.join(", ")} } };
13
+ }
14
+ `}const Le=D.lazy(async()=>({default:(await Ie(()=>import("./MaterialGraphCanvas-BFzl4wWR.js"),__vite__mapDeps([0,1,2,3]))).MaterialGraphCanvas}));function Ge(e){const t=e?.getBoundingClientRect().width??0;return t>0?t/2:void 0}function tt(){const e=X.c(72),t=Q(),a=P(De),s=P(qe),r=P(Je),f=P(He),i=P(Fe),c=P(We),o=P(Pe),p=P(Be),[u,y]=D.useState(!1),[v,w]=D.useState(null),O=D.useRef(null),S=D.useRef(null);if(!a||s===null||r===null)return null;let g,$,C,I;if(e[0]!==r||e[1]!==s.containerId||e[2]!==s.layerId||e[3]!==s.slot){I=Symbol.for("react.early_return_sentinel");e:{if($=ve(r,s.containerId)?.layersById[s.layerId],$?.kind!=="mesh"){I=null;break e}const L=oe($.mesh.material)?ye($.mesh.material,s.slot):null;g=L===null?void 0:r.materials?.[L.materialId],C=$.label?.trim()||"Mesh"}e[0]=r,e[1]=s.containerId,e[2]=s.layerId,e[3]=s.slot,e[4]=g,e[5]=$,e[6]=C,e[7]=I}else g=e[4],$=e[5],C=e[6],I=e[7];if(I!==Symbol.for("react.early_return_sentinel"))return I;const M=C,k=r.title??f??r.name,G=r.scenesById[s.containerId]?.name??r.components?.[s.containerId]?.name??"Shot";let T;e[8]!==r.assets||e[9]!==g?(T=g===void 0?[]:ce(g,r.assets),e[8]=r.assets,e[9]=g,e[10]=T):T=e[10];const _=T;let j;e[11]!==g||e[12]!==$.id||e[13]!==i?(j=g!==void 0&&i.status!=="idle"&&i.materialId===g.id&&i.layerId===$.id?i:{status:"idle"},e[11]=g,e[12]=$.id,e[13]=i,e[14]=j):j=e[14];const N=j,W=_.length>0?`${_.length} issue${_.length===1?"":"s"}`:N.status==="compiling"?"Compiling…":N.status==="error"?"GPU error":N.status==="ready"?"Live":"Waiting",J=_[0]?.message??(N.status==="error"?N.message:N.status==="compiling"?"The stage is compiling this material graph.":N.status==="ready"?"The stage compiled this graph and is previewing it on the isolated mesh.":"Waiting for the stage compiler to report this material."),K=g?.id??null;let z;e[15]!==$||e[16]!==M||e[17]!==K||e[18]!==s.slot?(z=l.jsx(ee,{name:"left",children:l.jsx(xe,{layer:$,layerName:M,currentId:K,slot:s.slot})}),e[15]=$,e[16]=M,e[17]=K,e[18]=s.slot,e[19]=z):z=e[19];let V;e[20]!==t?(V=()=>t.closeMaterialWorkspace(),e[20]=t,e[21]=V):V=e[21];let F;e[22]===Symbol.for("react.memo_cache_sentinel")?(F=l.jsx("span",{className:"tool-icon","aria-hidden":"true",children:Me}),e[22]=F):F=e[22];let n;e[23]!==V?(n=l.jsx("button",{type:"button",className:"back-chip material-back","data-testid":"material-back","aria-label":"Close material nodes",title:"Close material nodes (Esc)",onClick:V,children:F}),e[23]=V,e[24]=n):n=e[24];const m=g?.name??"Material";let d;if(e[25]!==g?.functions||e[26]!==c){let L;e[28]!==g?.functions?(L=se=>g?.functions?.[se]?.name??se,e[28]=g?.functions,e[29]=L):L=e[29],d=c.map(L),e[25]=g?.functions,e[26]=c,e[27]=d}else d=e[27];let h;e[30]!==G||e[31]!==M||e[32]!==k||e[33]!==d||e[34]!==m?(h=l.jsx(Ue,{projectName:k,contextName:G,layerName:M,graphName:m,functionNames:d}),e[30]=G,e[31]=M,e[32]=k,e[33]=d,e[34]=m,e[35]=h):h=e[35];let b;e[36]!==o||e[37]!==s.slot?(b=l.jsx(Ke,{slots:o,slot:s.slot}),e[36]=o,e[37]=s.slot,e[38]=b):b=e[38];let x;e[39]!==N||e[40]!==W||e[41]!==J||e[42]!==g||e[43]!==_.length?(x=g===void 0?null:l.jsxs("span",{className:`material-compile-status${_.length>0||N.status==="error"?" is-error":""}${N.status==="compiling"?" is-compiling":""}`,role:"status",title:J,children:[l.jsx("span",{"aria-hidden":"true"}),W]}),e[39]=N,e[40]=W,e[41]=J,e[42]=g,e[43]=_.length,e[44]=x):x=e[44];let A;e[45]!==g||e[46]!==p||e[47]!==u||e[48]!==t?(A=g===void 0?null:l.jsxs("div",{className:"material-bar-end",children:[l.jsx("button",{type:"button",className:"btn","data-testid":"material-add-node",title:`Add node${je("graph.add")}`,onClick:()=>t.openMaterialPalette(null),children:"Add node"}),l.jsx("button",{type:"button",className:`btn${u?" is-active":""}`,"aria-pressed":u,onClick:()=>y(Ve),children:"TSL"}),l.jsx("div",{className:"material-zoom-slot",ref:w}),p?l.jsx("button",{type:"button",className:"btn","data-testid":"material-refit",title:"Frame the object head-on again (Home)",onClick:()=>t.fitWorkingView(),children:"Recenter"}):null]}),e[45]=g,e[46]=p,e[47]=u,e[48]=t,e[49]=A):A=e[49];let E;e[50]!==h||e[51]!==b||e[52]!==x||e[53]!==A||e[54]!==n?(E=l.jsx(ee,{name:"bar",children:l.jsxs("div",{className:"material-bar",children:[n,h,b,x,A]})}),e[50]=h,e[51]=b,e[52]=x,e[53]=A,e[54]=n,e[55]=E):E=e[55];const H=`Material graph for ${M}`;let B;e[56]!==N||e[57]!==g||e[58]!==$.id||e[59]!==$.mesh||e[60]!==u||e[61]!==t||e[62]!==s.slot||e[63]!==v?(B=g===void 0?l.jsx(Ye,{layerId:$.id,legacy:$.mesh.material!==void 0&&!oe($.mesh.material)}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"material-graph-region",children:[N.status==="error"?l.jsx("div",{className:"code-studio-strip is-error",role:"alert","data-testid":"material-compile-error",children:N.message}):null,u?l.jsx(Ze,{graph:g}):l.jsx(D.Suspense,{fallback:l.jsx("section",{className:"material-graph-canvas is-loading","aria-label":"Loading material node graph",children:l.jsx("p",{className:"material-empty-copy",children:"Loading node canvas…"})}),children:l.jsx(Le,{graph:g,materialId:g.id,layerId:$.id,slot:s.slot,zoomSlot:v})})]}),l.jsx("div",{className:"stage-window material-preview-hole","aria-hidden":"true","data-testid":"material-preview-hole",ref:S}),l.jsx(Ne,{axis:"x",getValue:()=>S.current?.getBoundingClientRect().width||t.getState().materialColumnWidth,sign:-1,onChange:L=>t.setMaterialColumnWidth(L,Ge(O.current)),onReset:()=>t.setMaterialColumnWidth(we.default),className:"material-workspace-resize",label:"Resize the material preview"})]}),e[56]=N,e[57]=g,e[58]=$.id,e[59]=$.mesh,e[60]=u,e[61]=t,e[62]=s.slot,e[63]=v,e[64]=B):B=e[64];let q;e[65]!==H||e[66]!==B?(q=l.jsx(ee,{name:"centre",children:l.jsx("section",{className:"material-workspace","aria-label":H,ref:O,children:B})}),e[65]=H,e[66]=B,e[67]=q):q=e[67];let Y;return e[68]!==E||e[69]!==q||e[70]!==z?(Y=l.jsxs(l.Fragment,{children:[z,E,q]}),e[68]=E,e[69]=q,e[70]=z,e[71]=Y):Y=e[71],Y}function Ve(e){return!e}function Be(e){return e.isolationOrbit}function Pe(e){return e.materialWorkspace===null?void 0:e.meshMaterialSlots[e.materialWorkspace.layerId]}function We(e){return e.materialGraphPath}function Fe(e){return e.materialCompile}function He(e){return e.name}function Je(e){return e.doc}function qe(e){return e.materialWorkspace}function De(e){return Se(e)==="material"}function Ue(e){const t=X.c(35),{projectName:a,contextName:s,layerName:r,graphName:f,functionNames:i}=e,c=Q(),o=i.length;let p;t[0]!==c?(p=()=>c.closeMaterialWorkspace(),t[0]=c,t[1]=p):p=t[1];const u=p;let y;t[2]!==u||t[3]!==c?(y=()=>{u(),c.leaveScene()},t[2]=u,t[3]=c,t[4]=y):y=t[4];let v;t[5]!==a||t[6]!==y?(v=l.jsx("button",{type:"button",className:"crumb",title:"The whole Project",onClick:y,children:a}),t[5]=a,t[6]=y,t[7]=v):v=t[7];let w;t[8]!==s||t[9]!==u?(w=l.jsx("button",{type:"button",className:"crumb",onClick:u,children:s}),t[8]=s,t[9]=u,t[10]=w):w=t[10];let O;t[11]!==r||t[12]!==u?(O=l.jsx("button",{type:"button",className:"crumb",onClick:u,children:r}),t[11]=r,t[12]=u,t[13]=O):O=t[13];const S=`crumb${o===0?" is-current":""}`,g=o===0;let $;t[14]!==o||t[15]!==c?($=()=>{for(let k=0;k<o;k=k+1,k)c.exitMaterialSubgraph()},t[14]=o,t[15]=c,t[16]=$):$=t[16];let C;t[17]!==f||t[18]!==S||t[19]!==g||t[20]!==$?(C=l.jsx("button",{type:"button",className:S,"aria-current":g,onClick:$,children:f}),t[17]=f,t[18]=S,t[19]=g,t[20]=$,t[21]=C):C=t[21];let I;if(t[22]!==o||t[23]!==i||t[24]!==c){let k;t[26]!==o||t[27]!==c?(k=(G,T)=>l.jsx("button",{type:"button",className:`crumb${T===o-1?" is-current":""}`,"aria-current":T===o-1,onClick:()=>{for(let _=T;_<o-1;_=_+1,_)c.exitMaterialSubgraph()},children:G},`${T}:${G}`),t[26]=o,t[27]=c,t[28]=k):k=t[28],I=i.map(k),t[22]=o,t[23]=i,t[24]=c,t[25]=I}else I=t[25];let M;return t[29]!==I||t[30]!==v||t[31]!==w||t[32]!==O||t[33]!==C?(M=l.jsxs("nav",{className:"material-workspace-crumbs","data-testid":"material-crumbs",children:[v,w,O,C,I]}),t[29]=I,t[30]=v,t[31]=w,t[32]=O,t[33]=C,t[34]=M):M=t[34],M}const te="all";function Ke(e){const t=X.c(9),{slots:a,slot:s}=e,r=Q();if(a===void 0||a.length===0)return null;const f=s===null?te:String(s);let i;t[0]===Symbol.for("react.memo_cache_sentinel")?(i={value:te,label:"Whole model"},t[0]=i):i=t[0];let c;t[1]!==a?(c=[i,...a.map(Xe)],t[1]=a,t[2]=c):c=t[2];let o;t[3]!==r?(o=u=>r.setMaterialSlot(u===te?null:Number(u)),t[3]=r,t[4]=o):o=t[4];let p;return t[5]!==f||t[6]!==c||t[7]!==o?(p=l.jsx(_e,{className:"material-slot-picker",value:f,ariaLabel:"Material slot",options:c,onChange:o}),t[5]=f,t[6]=c,t[7]=o,t[8]=p):p=t[8],p}function Xe(e){return{value:String(e.index),label:`${e.index} · ${e.name.trim()===""?"Material":e.name}`}}function Ye(e){const t=X.c(15),{layerId:a,legacy:s}=e,r=Q();let f,i,c;t[0]===Symbol.for("react.memo_cache_sentinel")?(f=l.jsx("span",{className:"material-eyebrow",children:"Material nodes"}),i=l.jsx("h2",{children:"Build the surface on the real object."}),c=l.jsx("p",{children:"The mesh stays isolated on the stage while nodes describe its TSL material. Start from a neutral model here, or pick a graph this Project already has from the library on the left."}),t[0]=f,t[1]=i,t[2]=c):(f=t[0],i=t[1],c=t[2]);let o;t[3]!==s?(o=s?l.jsx("p",{className:"material-legacy-note",children:"This mesh uses a legacy catalog material. It will keep rendering until you replace it with a node graph."}):null,t[3]=s,t[4]=o):o=t[4];let p;t[5]!==o?(p=l.jsxs("div",{className:"material-setup-intro",children:[f,i,c,o]}),t[5]=o,t[6]=p):p=t[6];let u;t[7]!==a||t[8]!==r?(u=ke.map(w=>l.jsxs("button",{type:"button",className:"material-starter-card",onClick:()=>r.createMeshGraphMaterial(a,w.id),children:[l.jsx("span",{className:`material-starter-orb is-${w.id}`,"aria-hidden":"true"}),l.jsxs("span",{children:[l.jsx("strong",{children:w.name}),l.jsx("small",{children:w.detail})]})]},w.id)),t[7]=a,t[8]=r,t[9]=u):u=t[9];let y;t[10]!==u?(y=l.jsx("section",{className:"material-starters","aria-label":"Start a material",children:u}),t[10]=u,t[11]=y):y=t[11];let v;return t[12]!==p||t[13]!==y?(v=l.jsxs("div",{className:"material-setup",children:[p,y]}),t[12]=p,t[13]=y,t[14]=v):v=t[14],v}function Ze(e){const t=X.c(14),{graph:a}=e;let s;t[0]!==a?(s=Qe(a),t[0]=a,t[1]=s):s=t[1];const r=s;let f;t[2]===Symbol.for("react.memo_cache_sentinel")?(f=l.jsxs("div",{children:[l.jsx("strong",{children:"Generated TSL"}),l.jsx("span",{children:"Read-only reference · runtime compiles the data graph directly"})]}),t[2]=f):f=t[2];let i;t[3]!==r.text?(i=()=>void navigator.clipboard?.writeText(r.text),t[3]=r.text,t[4]=i):i=t[4];const c=r.error!==null;let o;t[5]!==i||t[6]!==c?(o=l.jsxs("div",{className:"material-source-heading",children:[f,l.jsx("button",{type:"button",className:"btn",onClick:i,disabled:c,children:"Copy"})]}),t[5]=i,t[6]=c,t[7]=o):o=t[7];let p;t[8]!==r.error||t[9]!==r.text?(p=r.error===null?l.jsx("pre",{tabIndex:0,children:r.text}):l.jsx("div",{className:"material-source-error",children:r.error}),t[8]=r.error,t[9]=r.text,t[10]=p):p=t[10];let u;return t[11]!==o||t[12]!==p?(u=l.jsxs("section",{className:"material-source-view","aria-label":"Generated TSL source",children:[o,p]}),t[11]=o,t[12]=p,t[13]=u):u=t[13],u}function Qe(e){try{return{text:ze(e),error:null}}catch(t){return{text:"",error:t instanceof Error?t.message:"Unable to generate TSL."}}}export{tt as MaterialWorkspace};
@@ -0,0 +1 @@
1
+ import{q as oe,u as de,A as o,J as fe,K as ce,v as t,L as he,N as z,T as f,O as be,P as ue}from"./index-BGHQGV5z.js";const me=[{value:"system",label:"System"},{value:"light",label:"Light"},{value:"dark",label:"Dark"}],xe=[{value:"auto",label:"Auto"},{value:"full",label:"Full"},{value:"fast",label:"Fast"}];function W(e){const l=oe.c(6);let a;l[0]!==e.label?(a=t.jsx("div",{className:"prefs-section-label",children:e.label}),l[0]=e.label,l[1]=a):a=l[1];let n;return l[2]!==e.children||l[3]!==e.label||l[4]!==a?(n=t.jsxs("section",{className:"prefs-section","aria-label":e.label,children:[a,e.children]}),l[2]=e.children,l[3]=e.label,l[4]=a,l[5]=n):n=l[5],n}function i(e){const l=oe.c(12);let a;l[0]!==e.label?(a=t.jsx("span",{className:"prefs-row-label",children:e.label}),l[0]=e.label,l[1]=a):a=l[1];let n;l[2]!==e.hint?(n=e.hint!==void 0&&t.jsx("span",{className:"prefs-row-hint",children:e.hint}),l[2]=e.hint,l[3]=n):n=l[3];let r;l[4]!==a||l[5]!==n?(r=t.jsxs("div",{className:"prefs-row-text",children:[a,n]}),l[4]=a,l[5]=n,l[6]=r):r=l[6];let c;l[7]!==e.children?(c=t.jsx("div",{className:"prefs-row-control",children:e.children}),l[7]=e.children,l[8]=c):c=l[8];let d;return l[9]!==r||l[10]!==c?(d=t.jsxs("div",{className:"prefs-row",children:[r,c]}),l[9]=r,l[10]=c,l[11]=d):d=l[11],d}function Ee(){const e=oe.c(96),l=de(),a=o(_e),{preference:n,setPreference:r}=fe(),c=o(Se),d=o(Le),X=o(Ce),Z=o(we),ee=o(ke),le=o(Pe),te=o(ye),se=o(ve),ae=o(ge),ne=o(je),ie=o(pe);let H;e[0]!==l?(H=()=>l.setPrefsOpen(!1),e[0]=l,e[1]=H):H=e[1];const h=H,re=ce("view.rulers");let U;e[2]===Symbol.for("react.memo_cache_sentinel")?(U=t.jsxs("span",{className:"prefs-title",children:["Preferences",t.jsx("kbd",{className:"prefs-kbd",children:ce("prefs.open")})]}),e[2]=U):U=e[2];let q;e[3]===Symbol.for("react.memo_cache_sentinel")?(q=t.jsx("span",{className:"prefs-footnote","data-testid":"prefs-footnote",children:he()?"Saved to your account. This browser keeps a copy.":"Saved in this browser."}),e[3]=q):q=e[3];let b;e[4]!==h?(b=t.jsxs(t.Fragment,{children:[q,t.jsx("button",{type:"button",className:"btn is-primary",onClick:h,children:"Done"})]}),e[4]=h,e[5]=b):b=e[5];let u;e[6]!==r?(u=s=>r(s),e[6]=r,e[7]=u):u=e[7];let m;e[8]!==n||e[9]!==u?(m=t.jsx(W,{label:"Appearance",children:t.jsx(i,{label:"Theme",children:t.jsx(z,{ariaLabel:"Theme",options:me,value:n,onChange:u})})}),e[8]=n,e[9]=u,e[10]=m):m=e[10];let x;e[11]!==l?(x=s=>l.setEditorPref("rulers",s),e[11]=l,e[12]=x):x=e[12];let p;e[13]!==c||e[14]!==x?(p=t.jsx(i,{label:"Rulers",hint:`On the camera view and inside a component.${re===void 0?"":` ${re}`}`,children:t.jsx(f,{ariaLabel:"Rulers",checked:c,onChange:x})}),e[13]=c,e[14]=x,e[15]=p):p=e[15];let j;e[16]!==l?(j=s=>{s!==l.getState().showGrid&&l.toggleGrid()},e[16]=l,e[17]=j):j=e[17];let g;e[18]!==d||e[19]!==j?(g=t.jsx(i,{label:"Grid",children:t.jsx(f,{ariaLabel:"Grid",checked:d,onChange:j})}),e[18]=d,e[19]=j,e[20]=g):g=e[20];let v;e[21]!==l?(v=s=>l.setEditorPref("smartGuides",s),e[21]=l,e[22]=v):v=e[22];let y;e[23]!==X||e[24]!==v?(y=t.jsx(i,{label:"Smart guides",hint:"Ctrl turns snapping off while you drag",children:t.jsx(f,{ariaLabel:"Smart guides",checked:X,onChange:v})}),e[23]=X,e[24]=v,e[25]=y):y=e[25];let P;e[26]!==l?(P=s=>l.setEditorPref("motionPaths",s),e[26]=l,e[27]=P):P=e[27];let k;e[28]!==Z||e[29]!==P?(k=t.jsx(i,{label:"Motion paths",hint:"Path of the selected layer's keys",children:t.jsx(f,{ariaLabel:"Motion paths",checked:Z,onChange:P})}),e[28]=Z,e[29]=P,e[30]=k):k=e[30];let J;e[31]===Symbol.for("react.memo_cache_sentinel")?(J=[{value:"bottom",label:"Bottom"},{value:"top",label:"Top"}],e[31]=J):J=e[31];let w;e[32]!==l?(w=s=>l.setEditorPref("toolbarPosition",s==="top"?"top":"bottom"),e[32]=l,e[33]=w):w=e[33];let C;e[34]!==w||e[35]!==ee?(C=t.jsx(i,{label:"Toolbar position",children:t.jsx(z,{ariaLabel:"Toolbar position",options:J,value:ee,onChange:w})}),e[34]=w,e[35]=ee,e[36]=C):C=e[36];let L;e[37]!==l?(L=s=>l.setEditorPref("playbackResolution",be(s)?s:"auto"),e[37]=l,e[38]=L):L=e[38];let S;e[39]!==le||e[40]!==L?(S=t.jsx(i,{label:"Playback resolution",hint:"Auto lowers it while playing only when the GPU falls behind. Paused frames and exports stay full.",children:t.jsx(z,{ariaLabel:"Playback resolution",options:xe,value:le,onChange:L})}),e[39]=le,e[40]=L,e[41]=S):S=e[41];let _;e[42]!==y||e[43]!==k||e[44]!==C||e[45]!==S||e[46]!==p||e[47]!==g?(_=t.jsxs(W,{label:"Canvas",children:[p,g,y,k,C,S]}),e[42]=y,e[43]=k,e[44]=C,e[45]=S,e[46]=p,e[47]=g,e[48]=_):_=e[48];let Y;e[49]===Symbol.for("react.memo_cache_sentinel")?(Y=[{value:"fit",label:"When they fit"},{value:"off",label:"Off"}],e[49]=Y):Y=e[49];let N;e[50]!==l?(N=s=>l.setEditorPref("blockLabels",s==="off"?"off":"fit"),e[50]=l,e[51]=N):N=e[51];let E;e[52]!==te||e[53]!==N?(E=t.jsx(i,{label:"Camera move labels",children:t.jsx(z,{ariaLabel:"Camera move labels",options:Y,value:te,onChange:N})}),e[52]=te,e[53]=N,e[54]=E):E=e[54];let R;e[55]!==l?(R=s=>l.setSelectMovesPlayhead(s),e[55]=l,e[56]=R):R=e[56];let T;e[57]!==se||e[58]!==R?(T=t.jsx(i,{label:"Move playhead to selection",children:t.jsx(f,{ariaLabel:"Move playhead to selection",checked:se,onChange:R})}),e[57]=se,e[58]=R,e[59]=T):T=e[59];let B;e[60]!==E||e[61]!==T?(B=t.jsxs(W,{label:"Timeline",children:[E,T]}),e[60]=E,e[61]=T,e[62]=B):B=e[62];let Q;e[63]===Symbol.for("react.memo_cache_sentinel")?(Q=[{value:"compact",label:"Compact"},{value:"named",label:"Named"}],e[63]=Q):Q=e[63];let F;e[64]!==l?(F=s=>l.setEditorPref("fieldLabels",s==="named"?"named":"compact"),e[64]=l,e[65]=F):F=e[65];let G;e[66]!==ae||e[67]!==F?(G=t.jsx(W,{label:"Inspector",children:t.jsx(i,{label:"Field labels",hint:"Compact shows a glyph. Named shows the word.",children:t.jsx(z,{ariaLabel:"Field labels",options:Q,value:ae,onChange:F})})}),e[66]=ae,e[67]=F,e[68]=G):G=e[68];let O;e[69]!==l?(O=s=>l.setFpsBadge(s),e[69]=l,e[70]=O):O=e[70];let M;e[71]!==ne||e[72]!==O?(M=t.jsx(i,{label:"FPS badge",children:t.jsx(f,{ariaLabel:"FPS badge",checked:ne,onChange:O})}),e[71]=ne,e[72]=O,e[73]=M):M=e[73];let A;e[74]!==l?(A=s=>l.setBackendBadge(s),e[74]=l,e[75]=A):A=e[75];let $;e[76]!==ie||e[77]!==A?($=t.jsx(i,{label:"Renderer badge",children:t.jsx(f,{ariaLabel:"Renderer badge",checked:ie,onChange:A})}),e[76]=ie,e[77]=A,e[78]=$):$=e[78];let D;e[79]!==M||e[80]!==$?(D=t.jsxs(W,{label:"Status",children:[M,$]}),e[79]=M,e[80]=$,e[81]=D):D=e[81];let I;e[82]!==l?(I=t.jsx(W,{label:"Layout",children:t.jsx(i,{label:"Panel sizes and docks",children:t.jsx("button",{type:"button",className:"btn",onClick:()=>l.resetLayout(window.innerWidth,window.innerHeight),children:"Reset panel layout"})})}),e[82]=l,e[83]=I):I=e[83];let K;e[84]!==_||e[85]!==B||e[86]!==G||e[87]!==D||e[88]!==I||e[89]!==m?(K=t.jsxs("div",{className:"prefs-body","data-testid":"prefs-dialog",children:[m,_,B,G,D,I]}),e[84]=_,e[85]=B,e[86]=G,e[87]=D,e[88]=I,e[89]=m,e[90]=K):K=e[90];let V;return e[91]!==h||e[92]!==a||e[93]!==b||e[94]!==K?(V=t.jsx(ue,{open:a,size:"wide",className:"prefs-dialog",onClose:h,title:U,actions:b,children:K}),e[91]=h,e[92]=a,e[93]=b,e[94]=K,e[95]=V):V=e[95],V}function pe(e){return e.showBackendBadge}function je(e){return e.showFpsBadge}function ge(e){return e.fieldLabels}function ve(e){return e.selectMovesPlayhead}function ye(e){return e.blockLabels}function Pe(e){return e.playbackResolution}function ke(e){return e.toolbarPosition}function we(e){return e.motionPaths}function Ce(e){return e.smartGuides}function Le(e){return e.showGrid}function Se(e){return e.rulers}function _e(e){return e.prefsOpen}export{Ee as PreferencesDialog};
@@ -0,0 +1 @@
1
+ import{u as I,z as A,A as u,B as d,h as N,E as v,C as k,D as C,v as s,y as R,I as p,F as b}from"./index-BGHQGV5z.js";import{M as T,m as B}from"./motionStamp-CH-Hew4E.js";const D=[{slot:"in",label:"In",placeholder:"Add an entrance"},{slot:"during",label:"During",placeholder:"Add a loop"},{slot:"out",label:"Out",placeholder:"Add an exit"}],F=[.2,.33,.5,.75,1,1.5,2],a="";function q(){const h=I(),E=A(),n=u(e=>e.doc),l=u(e=>e.editingDef??e.sceneId),f=u(e=>e.selection),g=u(e=>e.contracts),[m,L]=d.useState(a),[x,P]=d.useState(a),r=d.useMemo(()=>{if(n===null||l===null)return[];const e=N(n,l);return e===null?[]:f.map(t=>e.layersById[t]).filter(t=>t!==void 0)},[n,l,f]),j=d.useMemo(()=>{const e=new Map;if(n===null||l===null||r.length===0)return e;for(const t of T)r.every(o=>B(n,l,o,t.id,o.kind==="instance"?g[o.instance.component]:void 0)===null)&&e.set(t.slot,[...e.get(t.slot)??[],{value:t.id,label:t.label}]);return e},[n,l,r,g]);if(n===null||r.length===0)return null;const y=n.fps.num/n.fps.den,w=[{value:a,label:"Preset's own"},...v.map(e=>({value:e.id,label:e.label,group:k[e.group??"basic"]}))],M=[{value:a,label:"Preset's own"},...F.map(e=>({value:String(e),label:C(e)}))],S=e=>{const t=v.find(i=>i.id===x)?.ease;return{preset:e,...m===a?{}:{lengthFrames:Math.max(1,Math.round(Number(m)*y))},...t===void 0?{}:{ease:t}}},O=r.some(e=>e.kind==="text");return s.jsxs(R,{title:"Motion",persistKey:"shot:presets",note:"· writes keyframes",children:[D.map(({slot:e,label:t,placeholder:i})=>{const o=j.get(e)??[];return s.jsx(p,{label:t,children:s.jsx(b,{ariaLabel:`${t} preset`,options:o,value:"",placeholder:o.length===0?"None fits this selection":i,disabled:o.length===0,onChange:c=>void h.applyMotionPreset(S(c)),onActive:c=>h.previewMotion(c===null?null:S(c))})},e)}),s.jsx(p,{label:"Length",children:s.jsx(b,{ariaLabel:"Preset length",options:M,value:m,onChange:L})}),s.jsx(p,{label:"Ease",children:s.jsx(b,{ariaLabel:"Preset ease",options:w,value:x,onChange:P})}),O?s.jsx(p,{label:"Letters",children:s.jsx("div",{className:"insp-buttons",children:s.jsx("button",{type:"button",className:"btn",disabled:E,title:"Per-letter and per-word reveals are library components: typewriter-text, word-stream, rise-per-char",onClick:()=>h.setLibraryBrowserOpen(!0,"component"),children:"Per-letter effects in the Library"})})}):null]})}export{q as PresetsSection};
@@ -0,0 +1 @@
1
+ import{q as fe,u as ye,A as ne,B as i,v as t,Q as pe,R as be,D as ae,U as xe,W as ve,X as je,N as Ne}from"./index-BGHQGV5z.js";const ie={sfx:"Sound effect",music:"Music",voice:"Voice"};function ke(L){const e=fe.c(70),{canAdd:D}=L,y=ye(),c=ne(Se),u=ne(ge),[o,Z]=i.useState(null),[h,oe]=i.useState(null),[b,ee]=i.useState(!1),[Y,de]=i.useState(null),[m,ce]=i.useState("all"),[_,te]=i.useState(null),[x,z]=i.useState(null),[P,O]=i.useState(!1),[$,F]=i.useState(null),d=i.useRef(null);let G;e[0]===Symbol.for("react.memo_cache_sentinel")?(G=p=>{ee(!0),ve(p).then(a=>{Z(n=>p===void 0?a.takes:[...n??[],...a.takes]),oe(a.next)},a=>de(a instanceof Error?a.message:String(a))).finally(()=>ee(!1))},e[0]=G):G=e[0];const se=G;let R,B;e[1]===Symbol.for("react.memo_cache_sentinel")?(R=()=>(se(),()=>{d.current?.pause(),d.current=null}),B=[],e[1]=R,e[2]=B):(R=e[1],B=e[2]),i.useEffect(R,B);let I,K;e[3]!==c||e[4]!==u?(I=()=>{d.current!==null&&(d.current.muted=c,d.current.volume=u)},K=[c,u],e[3]=c,e[4]=u,e[5]=I,e[6]=K):(I=e[5],K=e[6]),i.useEffect(I,K);let v;e[7]!==o?(v=o??[],e[7]=o,e[8]=v):v=e[8];let j,f,N,g,S;if(e[9]!==P||e[10]!==D||e[11]!==$||e[12]!==Y||e[13]!==m||e[14]!==b||e[15]!==c||e[16]!==h||e[17]!==_||e[18]!==x||e[19]!==y||e[20]!==v||e[21]!==o||e[22]!==u){let p;e[28]!==m?(p=l=>m==="all"||l.kind===m,e[28]=m,e[29]=p):p=e[29];const a=v.filter(p),n=a.find(l=>l.id===_)??a[0]??null;let V;e[30]!==c||e[31]!==x||e[32]!==u?(V=l=>{if(te(l.id),d.current?.pause(),x===l.id){d.current=null,z(null);return}const s=new Audio(l.url);s.muted=c,s.volume=u;const r=()=>{d.current===s&&(d.current=null,z(null))};s.addEventListener("ended",r),s.addEventListener("error",r),d.current=s,z(l.id),s.play().catch(r)},e[30]=c,e[31]=x,e[32]=u,e[33]=V):V=e[33];const ue=V;let W;e[34]!==y?(W=l=>{O(!0),F(null),y.placeTake(l,void 0,l.scored===!0?0:void 0).then(()=>{y.getState().libraryBrowserOpen&&y.setLibraryBrowserOpen(!1)}).catch(s=>F(s instanceof Error?s.message:String(s))).finally(()=>O(!1))},e[34]=y,e[35]=W):W=e[35];const me=W;let H;e[36]===Symbol.for("react.memo_cache_sentinel")?(H=l=>{O(!0),F(null),je(l.id).then(()=>Z(s=>(s??[]).filter(r=>r.id!==l.id))).catch(s=>F(s instanceof Error?s.message:String(s))).finally(()=>O(!1))},e[36]=H):H=e[36];const he=H;let q;e[37]!==b||e[38]!==h?(q=h===null?null:t.jsx("button",{type:"button",className:"btn is-outline","data-testid":"history-more",disabled:b,onClick:()=>se(h),children:b?"Loading…":"Load more"}),e[37]=b,e[38]=h,e[39]=q):q=e[39];const E=q;let A;if(o===null){const l=Y??"Reading the sound history…";let s;e[40]!==l?(s=t.jsx("p",{className:"library-preview-note",role:"status",children:l}),e[40]=l,e[41]=s):s=e[41],A=s}else if(a.length===0){const l=o.length===0?h===null?"Nothing generated yet. Sound mode's Generate makes effects, music and voice lines.":"None of the newest takes is yours to see. Load more to look further back.":"No takes of this kind yet.";let s;e[42]!==l?(s=t.jsx("p",{className:"library-preview-note",role:"status",children:l}),e[42]=l,e[43]=s):s=e[43];let r;e[44]!==E||e[45]!==s?(r=t.jsxs(t.Fragment,{children:[s,E]}),e[44]=E,e[45]=s,e[46]=r):r=e[46],A=r}else{const l=t.jsx("ul",{className:"library-sound-list","aria-label":"Generated sounds","data-testid":"history-list",children:a.map(r=>{const le=x===r.id,re=r===n;return t.jsxs("li",{className:re?"library-sound-row is-selected":"library-sound-row","data-id":r.id,children:[t.jsx("button",{type:"button",className:"library-sound-play","aria-label":le?`Stop ${r.prompt}`:`Play ${r.prompt}`,onClick:()=>ue(r),children:le?pe:be}),t.jsxs("button",{type:"button",className:"library-sound-pick","aria-pressed":re,onClick:()=>te(r.id),children:[t.jsx("span",{className:"library-sound-name",children:r.prompt}),t.jsx("span",{className:"stock-sound-license",children:ie[r.kind]}),r.seconds===null?null:t.jsx("span",{className:"library-sound-length",children:ae(r.seconds)})]})]},r.id)})});let s;e[47]!==E||e[48]!==l?(s=t.jsxs(t.Fragment,{children:[l,E]}),e[47]=E,e[48]=l,e[49]=s):s=e[49],A=s}let Q;e[50]===Symbol.for("react.memo_cache_sentinel")?(Q=t.jsx("header",{className:"library-catalog-head",children:t.jsxs("div",{children:[t.jsx("h2",{children:"Generated sounds"}),t.jsx("p",{children:"Generated sounds you can open: every one added to a Project, and the rest for a day."})]})}),e[50]=Q):Q=e[50];let U,X;e[51]===Symbol.for("react.memo_cache_sentinel")?(U=[{value:"all",label:"All"},{value:"sfx",label:"Effects"},{value:"music",label:"Music"},{value:"voice",label:"Voice"}],X=l=>ce(l),e[51]=U,e[52]=X):(U=e[51],X=e[52]);let C;e[53]!==m?(C=t.jsx(Ne,{ariaLabel:"Kind of take",className:"stock-kind",value:m,options:U,onChange:X}),e[53]=m,e[54]=C):C=e[54],e[55]!==A||e[56]!==C?(f=t.jsxs("section",{className:"library-catalog","aria-label":"Generated sounds","data-testid":"sound-history",children:[Q,C,A]}),e[55]=A,e[56]=C,e[57]=f):f=e[57],N="library-preview is-sounds",g="Preview: generated sound",S="history-preview",j=n===null?t.jsx("p",{className:"library-preview-empty",children:"Pick a take to preview it here."}):t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"library-preview-purpose",children:[t.jsx("h2",{className:"library-preview-name",children:n.prompt}),t.jsxs("p",{className:"library-preview-note",children:[ie[n.kind],n.seconds===null?"":` · ${ae(n.seconds)}`," · ",new Date(n.createdAt).toLocaleDateString()]})]}),t.jsxs("div",{className:"library-sound-selected","data-testid":"history-selected",children:[t.jsxs("button",{type:"button",className:"btn is-primary is-lg","data-testid":"history-add",disabled:!D||P,title:D?n.scored===!0?"Scored to a film's cuts: added at frame 0, where its sections line up.":"Add this take at the playhead.":"Open a Project to add sounds.",onClick:()=>me(n),children:[xe,P?"Working…":n.scored===!0?"Add at the start":"Add at playhead"]}),t.jsx("button",{type:"button",className:"btn is-outline is-lg","data-testid":"history-delete",disabled:P,onClick:()=>he(n),children:"Delete from history"}),$===null?null:t.jsx("p",{className:"library-preview-error",role:"alert","data-testid":"history-error",children:$}),t.jsx("p",{className:"library-preview-hint",children:n.kept===!0?"Kept: it stays here until you delete it.":"Not added to a Project yet: it leaves the history a day after it was made."})]})]}),e[9]=P,e[10]=D,e[11]=$,e[12]=Y,e[13]=m,e[14]=b,e[15]=c,e[16]=h,e[17]=_,e[18]=x,e[19]=y,e[20]=v,e[21]=o,e[22]=u,e[23]=j,e[24]=f,e[25]=N,e[26]=g,e[27]=S}else j=e[23],f=e[24],N=e[25],g=e[26],S=e[27];let M;e[58]===Symbol.for("react.memo_cache_sentinel")?(M=t.jsx("span",{children:"Sound history"}),e[58]=M):M=e[58];const J=o===null?"":`${o.length}${h===null?"":"+"} take${o.length===1?"":"s"}`;let w;e[59]!==J?(w=t.jsxs("footer",{className:"library-preview-meta",children:[M,t.jsx("span",{children:J})]}),e[59]=J,e[60]=w):w=e[60];let k;e[61]!==j||e[62]!==w||e[63]!==N||e[64]!==g||e[65]!==S?(k=t.jsxs("aside",{className:N,"aria-label":g,"data-testid":S,children:[j,w]}),e[61]=j,e[62]=w,e[63]=N,e[64]=g,e[65]=S,e[66]=k):k=e[66];let T;return e[67]!==f||e[68]!==k?(T=t.jsxs(t.Fragment,{children:[f,k]}),e[67]=f,e[68]=k,e[69]=T):T=e[69],T}function ge(L){return L.previewVolume}function Se(L){return L.previewMuted}export{ke as SoundHistory};
@@ -0,0 +1,3 @@
1
+ import{q as L,A as W,B as C,c4 as Je,c5 as Xe,u as V,v as i,a1 as ze,c6 as Qe,c7 as Ze,$ as xe,Z as Pe,K as re,c8 as Q,c9 as et,a2 as tt,ca as Me,U as nt,cb as st,cc as Ee,cd as ee,ce as ot,T as it,cf as ke,a0 as ce,cg as Fe,ch as Se,ci as at,cj as $e,ck as Ae,cl as lt,cm as rt,cn as ct,co as me,cp as fe,cq as dt,cr as De,cs as ut,ct as mt,cu as ft,bU as ht,_ as pt,aX as bt,cv as gt}from"./index-BGHQGV5z.js";const xt={attackMs:5,releaseMs:300,holdMs:1200,holdReleaseMs:900},te=Object.freeze({rms:0,peak:0,hold:0,holdLeftMs:0});function Mt(t,e,n,o,s){const a=Number.isFinite(o)&&o>0?o:0,l=Number.isFinite(e)&&e>0?e:0,r=Number.isFinite(n)&&n>0?n:0,d=Number.isFinite(t.rms)&&t.rms>0?t.rms:0,f=Number.isFinite(t.peak)&&t.peak>0?t.peak:0,p=Math.exp(-a/(s.attackMs>0?s.attackMs:.001)),c=Math.exp(-a/(s.releaseMs>0?s.releaseMs:.001)),h=l+(d-l)*(l>d?p:c),b=r+(f-r)*(r>f?p:c);let g=Number.isFinite(t.hold)&&t.hold>0?t.hold:0,M=Number.isFinite(t.holdLeftMs)&&t.holdLeftMs>0?t.holdLeftMs:0;return r>=g?(g=r,M=s.holdMs>0?s.holdMs:0):M>a?M=M-a:(M=0,g=g*Math.exp(-a/(s.holdReleaseMs>0?s.holdReleaseMs:.001)),g<b&&(g=b)),{rms:h,peak:b,hold:g,holdLeftMs:M}}const kt=Mt.toString(),pe=-60,Z=10**(pe/20),St=.2,ye=10**(St/20);function ve(t,e,n,o,s,a){let l=t.rms>s?t.rms:0,r=e>s?e:0;return(l>r?l:r)>(l<r?l:r)*a||(l=t.peak>s?t.peak:0,r=n>s?n:0,(l>r?l:r)>(l<r?l:r)*a)?!0:(l=t.hold>s?t.hold:0,r=o>s?o:0,(l>r?l:r)>(l<r?l:r)*a)}const yt=ve.toString(),vt=16,ie=["L","R"],Ne=3,Nt=Ne*ie.length,H=new Map;function Le(t){return H.get(t)?.reading??te}function jt(t,e){let n=H.get(t);n===void 0&&(n={reading:te,listeners:new Set},H.set(t,n)),n.listeners.add(e);const o=n;return()=>{o.listeners.delete(e),o.listeners.size===0&&o.reading===te&&H.delete(t)}}function Be(t,e){const n=H.get(t),o=n===void 0?te:n.reading;if(!ve(o,e.rms,e.peak,e.hold,Z,ye))return;const s=e.rms<=Z&&e.peak<=Z&&e.hold<=Z?te:e;if(n===void 0){H.set(t,{reading:s,listeners:new Set});return}n.reading=s;for(const a of[...n.listeners])try{a()}catch{}}function Tt(t){const e=H.get(t);if(e!==void 0){if(e.listeners.size===0){H.delete(t);return}Be(t,te)}}const Ue="dailies-meter";function Et(){return["const __name = (fn) => fn;",`const meterStep = (${kt});`,`const meterVisiblyDiffers = (${yt});`,`const TUNING = ${JSON.stringify(xt)};`,`const POST_MS = ${JSON.stringify(vt)};`,`const FLOOR = ${JSON.stringify(Z)};`,`const RATIO = ${JSON.stringify(ye)};`,`const CHANNELS = ${JSON.stringify(ie.length)};`,`const FIELDS = ${JSON.stringify(Ne)};`,"class DailiesMeterProcessor extends AudioWorkletProcessor {"," constructor() {"," super();"," this.states = [];"," for (let c = 0; c < CHANNELS; c++) this.states.push({ rms: 0, peak: 0, hold: 0, holdLeftMs: 0 });"," this.posted = this.states.slice();"," this.sinceMs = 0;"," }"," process(inputs) {"," const input = inputs[0];"," const count = input ? input.length : 0;"," let frames = 0;"," for (let c = 0; c < count; c++) {"," const ch = input[c];"," if (ch && ch.length > frames) frames = ch.length;"," }"," if (frames === 0) frames = 128;"," const dtMs = (frames / sampleRate) * 1000;"," for (let c = 0; c < CHANNELS; c++) {"," const ch = count === 0 ? null : input[c < count ? c : count - 1];"," let sum = 0;"," let peak = 0;"," const n = ch ? ch.length : 0;"," for (let i = 0; i < n; i++) {"," const v = ch[i];"," sum += v * v;"," const a = v < 0 ? -v : v;"," if (a > peak) peak = a;"," }"," const rms = n > 0 ? Math.sqrt(sum / n) : 0;"," this.states[c] = meterStep(this.states[c], rms, peak, dtMs, TUNING);"," }"," this.sinceMs += dtMs;"," if (this.sinceMs < POST_MS) return true;"," let differs = false;"," for (let c = 0; c < CHANNELS && !differs; c++) {"," const s = this.states[c];"," differs = meterVisiblyDiffers(this.posted[c], s.rms, s.peak, s.hold, FLOOR, RATIO);"," }"," if (!differs) {"," this.sinceMs = POST_MS;"," return true;"," }"," this.sinceMs = 0;"," const out = new Float32Array(CHANNELS * FIELDS);"," for (let c = 0; c < CHANNELS; c++) {"," const s = this.states[c];"," if (meterVisiblyDiffers(this.posted[c], s.rms, s.peak, s.hold, FLOOR, RATIO)) this.posted[c] = s;"," out[c * FIELDS] = s.rms;"," out[c * FIELDS + 1] = s.peak;"," out[c * FIELDS + 2] = s.hold;"," }"," this.port.postMessage(out);"," return true;"," }","}",`registerProcessor(${JSON.stringify(Ue)}, DailiesMeterProcessor);`].join(`
2
+ `)}let he=null;function $t(){return he===null&&(he=URL.createObjectURL(new Blob([Et()],{type:"text/javascript"}))),he}const At={addModule:(t,e)=>t.audioWorklet.addModule(e),createNode:t=>new AudioWorkletNode(t,Ue,{numberOfOutputs:1,outputChannelCount:[1],channelCount:ie.length,channelCountMode:"explicit",channelInterpretation:"speakers"}),moduleUrl:$t},le=new WeakMap;function Dt(t,e){const n=le.get(t);if(n!==void 0)return n;const o=e.addModule(t,e.moduleUrl());return le.set(t,o),o.catch(()=>{le.get(t)===o&&le.delete(t)}),o}const be=new WeakMap,ge=new Set;function Rt(t,e,n,o=At){const s=be.get(n);if(s!==void 0)return s.key!==t?(console.error(`[audio] meter: this node is already published as ${JSON.stringify(s.key)}; refusing to also publish it as ${JSON.stringify(t)}`),()=>{}):(s.refs+=1,()=>Re(n,s));const a={key:t,refs:1,node:null,dead:!1};return be.set(n,a),Dt(e,o).then(()=>{if(a.dead)return;const l=o.createNode(e);l.onprocessorerror=d=>{const f=d?.message;ge.add(l),Je("audio-worklet",`the level meter's audio worklet processor threw and stopped${typeof f=="string"&&f!==""?`: ${f}`:" (the browser console has the error)"}`,!0)};const r=ie.map(d=>q(t,d));l.port.onmessage=d=>{const f=d.data;if(!(!(f instanceof Float32Array)||f.length<Nt))for(let p=0;p<r.length;p++){const c=p*Ne;ve(Le(r[p]),f[c],f[c+1],f[c+2],Z,ye)&&Be(r[p],Ct(f,c))}},n.connect(l),a.node=l}).catch(l=>{console.error("[audio] meter tap unavailable",l)}),()=>Re(n,a)}function Ct(t,e){return{rms:t[e],peak:t[e+1],hold:t[e+2],holdLeftMs:0}}function q(t,e){return`${t}:${e}`}function Re(t,e){if(e.dead||(e.refs-=1,e.refs>0))return;e.dead=!0,be.delete(t);const n=e.node;if(e.node=null,n!==null){n.port.onmessage=null,n.onprocessorerror=null;try{t.disconnect(n)}catch{}n.disconnect(),n.port.close?.(),ge.delete(n)&&ge.size===0&&Xe("audio-worklet")}for(const o of ie)Tt(q(e.key,o))}function se(t){const e=L.c(4);let n;e[0]!==t?(n=l=>jt(t,l),e[0]=t,e[1]=n):n=e[1];const o=n;let s;e[2]!==t?(s=()=>Le(t),e[2]=t,e[3]=s):s=e[3];const a=s;return C.useSyncExternalStore(o,a,a)}function We(t,e,n,o){const s=L.c(7),a=W(It);let l,r;s[0]!==e||s[1]!==o||s[2]!==a||s[3]!==t||s[4]!==n?(l=()=>{if(!(e===null||n===null||a))return Rt(t,e,n,o)},r=[t,e,n,a,o],s[0]=e,s[1]=o,s[2]=a,s[3]=t,s[4]=n,s[5]=l,s[6]=r):(l=s[5],r=s[6]),C.useEffect(l,r)}function It(t){return t.exportLock!==null}const wt=72,bn=24,Ge=wt-1-16-2,Ce=3,Ie="−",Ke=Math.log2(4/3),_t=.012;function He(t){return t>0?Math.min(1,(t/ke)**Ke):0}function Ot(t){const e=Math.min(1,Math.max(0,t));return e<=0?0:Math.abs(e-He(1))<_t?1:Math.round(ke*e**(1/Ke)*1e3)/1e3}function oe(t,e=!0){const n=e?" dB":"";if(!(t>0))return`${Ie}∞${n}`;let o=(20*Math.log10(t)).toFixed(1);return o==="-0.0"&&(o="0.0"),o.startsWith("-")?o=`${Ie}${o.slice(1)}`:o!=="0.0"&&(o=`+${o}`),`${o}${n}`}function Pt(t){return`${Math.round(t.bpm*100)/100} BPM · ${Math.max(1,Math.trunc(t.beatsPerBar??4))}/4`}function Ft(t){const e=new Map,n=(s,a)=>{const l=e.get(s);l===void 0?e.set(s,[a]):l.push(a)},o=(s,a)=>{const l=a+Math.trunc(s.frame);return{masterStart:l,masterEnd:l+Math.max(1,Math.trunc(s.durationFrames))}};for(const s of Object.values(t.audio))n(ce(t,s.track).id,{clip:s,offsetFrames:0,sceneId:null,...o(s,0)});for(const s of Pe(t))for(const a of Object.values(t.scenesById[s.id]?.audio??{}))n(ce(t,a.track).id,{clip:a,offsetFrames:s.start,sceneId:s.id,...o(a,s.start)});for(const s of Fe(t))s.layerId!==void 0&&n(s.trackId,{clip:s.clip,offsetFrames:0,sceneId:s.sceneId,layerId:s.layerId,...o(s.clip,0)});return e}function gn(t){const{ppf:e,labelWidth:n,timeW:o,origin:s,window:a,beginSnap:l,grid:r,overlay:d,openMenu:f,onGenerate:p}=t,c=V(),h=W(m=>m.doc),b=W(m=>m.editingDef),g=W(m=>m.soloTracks),M=W(m=>m.dockNotice),y=W(m=>m.dockReveal),S=Qe(m=>m.sceneId),u=C.useRef(null),[x,k]=C.useState(null),[$,N]=C.useState(null),{confirm:v,dialog:R}=Ze(),j=C.useMemo(()=>h===null?new Map:Ft(h),[h]);if(C.useEffect(()=>{const m=y?.audioIds;if(m===void 0||m.length===0)return;const E=u.current?.querySelector(`[data-audio-clip="${CSS.escape(m[0])}"]`);E!=null&&(E.scrollIntoView?.({block:"nearest",inline:"nearest"}),y?.flash&&N(E.closest("[data-sound-row]")?.dataset.soundRow??null))},[y]),h===null)return null;if(b!==null)return i.jsx("div",{className:"sound-lanes",style:{minWidth:n+o},children:i.jsx("p",{className:"sound-note",children:"A component has no master time, so it has no sound. Leave it to mix the film."})});const T=xe(h),I=m=>a===void 0||m.masterEnd>a.origin&&m.masterStart<a.origin+a.len,B=[...j.values()].reduce((m,A)=>m+A.length,0),O=Pe(h).filter(m=>a===void 0||m.end>a.origin&&m.start<a.origin+a.len),w=m=>{for(const A of u.current?.querySelectorAll("[data-sound-row]")??[]){const E=A.getBoundingClientRect();if(m>=E.top&&m<E.bottom)return A.dataset.soundRow}},_=m=>A=>{A.preventDefault(),A.stopPropagation(),c.getState().selectedAudio.includes(m.clip.id)||c.selectAudio([m.clip.id]),f({x:A.clientX,y:A.clientY},Ae(c.getState(),Lt(c,h,m)))},P=(m,A,E)=>D=>{D.preventDefault(),D.stopPropagation();const G=j.get(m.id)?.filter(J=>J.layerId===void 0).length??0,de=[{kind:"action",id:"track-add-above",label:"Add track above",onSelect:()=>c.addAudioTrackAt(A)},{kind:"action",id:"track-add-below",label:"Add track below",onSelect:()=>c.addAudioTrackAt(A+1)},{kind:"action",id:"track-rename",label:"Rename",onSelect:E},{kind:"action",id:"track-up",label:"Move up",disabled:A===0,onSelect:()=>c.reorderAudioTrack(m.id,A-1)},{kind:"action",id:"track-down",label:"Move down",disabled:A===T.length-1,onSelect:()=>c.reorderAudioTrack(m.id,A+1)},{kind:"separator"},{kind:"action",id:"track-delete",label:"Delete track",danger:!0,disabled:T.length<=1,title:T.length<=1?"A film keeps at least one track.":void 0,onSelect:()=>{if(G===0){c.removeAudioTrack(m.id);return}v({title:`Delete ${m.name}?`,message:`Its ${G} clip${G===1?"":"s"} go with it. Undo brings them back.`,confirmLabel:"Delete track",danger:!0}).then(J=>{J&&c.removeAudioTrack(m.id)})}}];f({x:D.clientX,y:D.clientY},Ae(c.getState(),de))},U=m=>{if(m.button!==0||!m.target.classList.contains("sound-lane"))return;m.preventDefault();const E=m.currentTarget,D=E.getBoundingClientRect(),G={x:m.clientX-D.left,y:m.clientY-D.top},de=[...E.querySelectorAll("[data-audio-clip]:not([data-readonly])")].map(K=>{const Y=K.getBoundingClientRect();return{id:K.dataset.audioClip,left:Y.left-D.left,right:Y.right-D.left,top:Y.top-D.top,bottom:Y.bottom-D.top}}),J=c.getState().selectedAudio,qe=m.shiftKey?J:[];let ue=!1,je=null;Se(m,{onMove(K){const Y=E.getBoundingClientRect(),X={x:K.clientX-Y.left,y:K.clientY-Y.top};if(!ue&&Math.abs(X.x-G.x)<Ce&&Math.abs(X.y-G.y)<Ce)return;ue=!0;const ne={left:Math.min(G.x,X.x),right:Math.max(G.x,X.x),top:Math.min(G.y,X.y),bottom:Math.max(G.y,X.y)};k(ne);const ae=[...qe];for(const z of de)z.right>ne.left&&z.left<ne.right&&z.bottom>ne.top&&z.top<ne.bottom&&(ae.includes(z.id)||ae.push(z.id));const Te=ae.join(`
3
+ `);Te!==je&&(je=Te,c.selectAudio(ae))},onEnd(K){if(k(null),!ue){K&&!m.shiftKey&&c.selectAudio([]);return}K||c.selectAudio(J)}})},F=re("edit.split");return i.jsxs("div",{ref:u,className:"sound-lanes","data-testid":"sound-lanes",style:{minWidth:n+o},onPointerDown:U,onAnimationEnd:m=>{m.animationName==="row-revealed"&&N(null)},children:[R,i.jsxs("div",{className:"dock-overlay sound-overlay",style:{left:n},"aria-hidden":"true",children:[r.map(m=>m.tier===2?i.jsx("span",{className:"sound-beat",style:{left:Q(m.frame,e)}},m.frame):i.jsx("span",{className:"sound-bar",style:{left:Q(m.frame,e)}},m.frame)),d]}),M===null?null:i.jsxs("div",{className:"sound-notice",role:"status","data-testid":"sound-notice",style:{left:n+8},children:[F===void 0?null:i.jsx("kbd",{className:"sound-notice-key",children:et(F)}),i.jsx("span",{children:M.text}),i.jsx("button",{type:"button",className:"btn is-icon is-ghost sound-notice-close","aria-label":"Dismiss",onClick:()=>c.dismissDockNotice(),children:tt})]}),i.jsxs("div",{className:"sound-row sound-shots-row",children:[i.jsx("div",{className:"sound-strip-cell sound-shots-label",style:{width:n},children:"Shots"}),i.jsx("div",{className:"sound-shots",children:O.map(m=>i.jsxs("button",{type:"button",className:`sound-shot-pill${m.id===S?" is-current":""}`,"aria-current":m.id===S?"true":void 0,style:{left:Q(m.start-s,e),width:Math.max(4,Q(m.end-m.start,e)-2)},title:h.scenesById[m.id]?.name??"",onPointerDown:A=>A.stopPropagation(),onClick:()=>{c.pauseForScrub(),c.seek(m.start)},children:["Shot ",Me(h,m.id)??String(h.scenes.indexOf(m.id)+1).padStart(2,"0")]},m.id))})]}),T.map((m,A)=>{const E=(j.get(m.id)??[]).filter(I),D=g.length>0&&!g.includes(m.id);return i.jsx(Bt,{track:m,index:A,rows:E,doc:h,ppf:e,labelWidth:n,origin:s,beginSnap:l,rowAt:w,dimmed:D,soloed:g.includes(m.id),flashed:$===m.id,empty:A===0&&B===0,onClipMenu:_,onTrackMenu:P,onGenerate:p},m.id)}),i.jsx("div",{className:"sound-row sound-add-row",children:i.jsx("div",{className:"sound-strip-cell",style:{width:n},children:i.jsxs("button",{type:"button",className:"btn is-ghost sound-add-track","data-testid":"sound-add-track",onClick:()=>c.addAudioTrackAt(),children:[nt,"Add track"]})})}),x===null?null:i.jsx("span",{className:"dock-marquee","aria-hidden":"true",style:{left:x.left,top:x.top,width:x.right-x.left,height:x.bottom-x.top}})]})}function Lt(t,e,n){const o=t.getState(),s=o.selectedAudio.includes(n.clip.id)?o.selectedAudio:[n.clip.id],a=ce(e,n.clip.track).id,l=h=>{t.edit(b=>s.reduce((g,M)=>De(g,M,h),b))},d={kind:"submenu",label:"Move to track",items:[...xe(e).map(h=>({kind:"action",id:`clip-track-${h.id}`,label:h.name,checked:n.layerId===void 0?h.id===a:h.id===ce(e,n.clip.track).id,onSelect:()=>l(h.id)})),{kind:"separator"},{kind:"action",id:"clip-track-new",label:"New track",onSelect:()=>t.edit(h=>{const b=dt(h,{});return s.reduce((g,M)=>De(g,M,b.id),b.doc)})}]};if(n.layerId!==void 0)return[d];const f=o.frame,p=f>n.masterStart&&f<n.masterEnd,c=n.sceneId===null?null:Me(e,n.sceneId)??null;return[{kind:"action",id:"clip-split",label:"Split at playhead",shortcut:re("edit.split"),disabled:!p,title:p?void 0:"Move the playhead inside the clip to split it.",onSelect:()=>t.splitAtPlayhead()},d,{kind:"action",id:"clip-duplicate",label:"Duplicate",shortcut:re("edit.duplicate"),onSelect:()=>t.duplicateSelection()},{kind:"action",id:"clip-home",label:n.sceneId===null?"Attach to shot":`Detach from Shot ${c??""}`.trim(),title:n.sceneId===null?"Attach to the shot it starts in: it moves, duplicates and ends with that shot.":"Move to the bed: it spans the cuts and stops following this shot.",onSelect:()=>t.moveAudioHome(n.clip.id)},{kind:"separator"},{kind:"action",id:"clip-delete",label:"Delete",shortcut:re("edit.delete"),danger:!0,onSelect:()=>t.deleteSelection()}]}function Bt(t){const e=L.c(50),{track:n,index:o,rows:s,doc:a,ppf:l,labelWidth:r,origin:d,beginSnap:f,rowAt:p}=t,c=V(),[h,b]=C.useState(!1),[g,M]=C.useState(!1),[y,S]=C.useState(null),[u,x]=C.useState(!1),k=C.useRef(null),N=`sound-row sound-track-row${n.muted===!0?" is-muted":""}${t.dimmed?" is-unsoloed":""}${h?" is-over":""}${t.flashed?" is-revealed":""}`,v=n.id,R=`sound-row-${n.id}`;let j,T;e[0]===Symbol.for("react.memo_cache_sentinel")?(j=E=>{E.dataTransfer.types.includes("Files")&&(E.preventDefault(),b(!0))},T=()=>b(!1),e[0]=j,e[1]=T):(j=e[0],T=e[1]);let I;e[2]!==c||e[3]!==n.id?(I=E=>{E.dataTransfer.types.includes("Files")&&(E.preventDefault(),b(!1),$e(c,E.dataTransfer.files,void 0,M,S,n.id))},e[2]=c,e[3]=n.id,e[4]=I):I=e[4];const B=t.soloed;let O;e[5]===Symbol.for("react.memo_cache_sentinel")?(O=()=>x(!0),e[5]=O):O=e[5];let w;e[6]!==o||e[7]!==t.onTrackMenu||e[8]!==n?(w=t.onTrackMenu(n,o,O),e[6]=o,e[7]=t.onTrackMenu,e[8]=n,e[9]=w):w=e[9];let _;e[10]!==r||e[11]!==t.soloed||e[12]!==u||e[13]!==w||e[14]!==n?(_=i.jsx(Yt,{track:n,width:r,soloed:B,renaming:u,setRenaming:x,onContextMenu:w}),e[10]=r,e[11]=t.soloed,e[12]=u,e[13]=w,e[14]=n,e[15]=_):_=e[15];let P;e[16]!==g||e[17]!==t.empty||e[18]!==t.onGenerate||e[19]!==c||e[20]!==n.id?(P=t.empty&&!g?i.jsxs("span",{className:"sound-empty","data-testid":"sound-empty",children:[i.jsx("span",{children:"Drop audio here, or"}),i.jsx("button",{type:"button",className:"btn is-ghost sound-empty-btn",onPointerDown:Gt,onClick:t.onGenerate,children:"+ Generate"}),i.jsx("button",{type:"button",className:"btn is-ghost sound-empty-btn",onPointerDown:Wt,onClick:()=>c.setLibraryBrowserOpen(!0,"sounds"),children:"Library"}),i.jsx("button",{type:"button",className:"btn is-ghost sound-empty-btn",onPointerDown:Ut,onClick:()=>k.current?.click(),children:"Import"}),i.jsx("input",{ref:k,type:"file",accept:at,multiple:!0,hidden:!0,"data-testid":"sound-file-input",onChange:E=>{$e(c,E.currentTarget.files,void 0,M,S,n.id),E.currentTarget.value=""}})]}):null,e[16]=g,e[17]=t.empty,e[18]=t.onGenerate,e[19]=c,e[20]=n.id,e[21]=P):P=e[21];let U;if(e[22]!==f||e[23]!==a||e[24]!==d||e[25]!==l||e[26]!==t||e[27]!==p||e[28]!==s){let E;e[30]!==f||e[31]!==a||e[32]!==d||e[33]!==l||e[34]!==t||e[35]!==p?(E=D=>D.layerId!==void 0?i.jsx(Kt,{row:D,doc:a,ppf:l,origin:d,onContextMenu:t.onClipMenu(D)},`v:${D.layerId}:${D.sceneId??""}`):i.jsx(ut,{clip:D.clip,asset:a.assets[D.clip.asset],fps:a.fps,ppf:l,offsetFrames:D.offsetFrames,originFrames:d,beginSnap:f,waveH:Ge,mix:!0,rowAt:p,onContextMenu:t.onClipMenu(D),...D.sceneId===null?{}:{ownedBy:D.sceneId,limitFrames:Math.max(0,Math.trunc(a.scenesById[D.sceneId]?.durationFrames??0)),badge:`Shot ${Me(a,D.sceneId)??""}`.trim()}},D.clip.id),e[30]=f,e[31]=a,e[32]=d,e[33]=l,e[34]=t,e[35]=p,e[36]=E):E=e[36],U=s.map(E),e[22]=f,e[23]=a,e[24]=d,e[25]=l,e[26]=t,e[27]=p,e[28]=s,e[29]=U}else U=e[29];let F;e[37]!==y?(F=y===null?null:i.jsx("p",{className:"audio-error",role:"status",children:y}),e[37]=y,e[38]=F):F=e[38];let m;e[39]!==P||e[40]!==U||e[41]!==F?(m=i.jsxs("div",{className:"sound-lane",children:[P,U,F]}),e[39]=P,e[40]=U,e[41]=F,e[42]=m):m=e[42];let A;return e[43]!==N||e[44]!==m||e[45]!==R||e[46]!==I||e[47]!==_||e[48]!==n.id?(A=i.jsxs("div",{className:N,"data-sound-row":v,"data-testid":R,onDragOver:j,onDragLeave:T,onDrop:I,children:[_,m]}),e[43]=N,e[44]=m,e[45]=R,e[46]=I,e[47]=_,e[48]=n.id,e[49]=A):A=e[49],A}function Ut(t){return t.stopPropagation()}function Wt(t){return t.stopPropagation()}function Gt(t){return t.stopPropagation()}function Kt(t){const e=L.c(28),{row:n,doc:o,ppf:s,origin:a}=t,l=n.masterStart-a;let r;e[0]!==s||e[1]!==l?(r=Q(l,s),e[0]=s,e[1]=l,e[2]=r):r=e[2];const d=r,f=n.masterEnd-n.masterStart;let p;e[3]!==s||e[4]!==f?(p=Q(f,s),e[3]=s,e[4]=f,e[5]=p):p=e[5];const c=Math.max(8,p),b=(n.sceneId===null?void 0:o.scenesById[n.sceneId]?.layersById[n.layerId])?.label??"Video",g=`audio-clip is-video${n.clip.muted===!0?" is-muted":""}`;let M;e[6]!==d||e[7]!==c?(M={left:d,width:c},e[6]=d,e[7]=c,e[8]=M):M=e[8];const y=`${b}: the recording's own sound. Trim it on the video's row in Rows.`,S=n.clip.offsetFrames??0;let u;e[9]!==n.clip.durationFrames||e[10]!==S?(u={offsetFrames:S,durationFrames:n.clip.durationFrames},e[9]=n.clip.durationFrames,e[10]=S,e[11]=u):u=e[11];const x=o.assets[n.clip.asset];let k;e[12]!==o.fps||e[13]!==u||e[14]!==x||e[15]!==c?(k=i.jsx(mt,{clip:u,asset:x,fps:o.fps,widthPx:c,heightPx:Ge}),e[12]=o.fps,e[13]=u,e[14]=x,e[15]=c,e[16]=k):k=e[16];let $;e[17]===Symbol.for("react.memo_cache_sentinel")?($=i.jsx("span",{className:"audio-clip-lock","aria-hidden":"true",children:gt}),e[17]=$):$=e[17];let N;e[18]!==b?(N=i.jsxs("span",{className:"audio-clip-name",children:[$,b," · video sound"]}),e[18]=b,e[19]=N):N=e[19];let v;return e[20]!==t.onContextMenu||e[21]!==n.clip.id||e[22]!==k||e[23]!==N||e[24]!==g||e[25]!==M||e[26]!==y?(v=i.jsxs("div",{className:g,"data-audio-clip":n.clip.id,"data-readonly":"",style:M,title:y,onPointerDown:Ht,onContextMenu:t.onContextMenu,children:[k,N]}),e[20]=t.onContextMenu,e[21]=n.clip.id,e[22]=k,e[23]=N,e[24]=g,e[25]=M,e[26]=y,e[27]=v):v=e[27],v}function Ht(t){return t.stopPropagation()}function Vt(t,e,n,o,s){n.button===0&&(n.preventDefault(),n.stopPropagation(),t.beginBlockDrag()&&Se(n,{onMove:a=>t.dragAudioTrack(e,o(a.clientX,a.clientY)),onEnd:a=>t.endBlockDrag(a)}))}function Ve(t,e){const n=t.key==="ArrowRight"||t.key==="ArrowUp"?1:t.key==="ArrowLeft"||t.key==="ArrowDown"?-1:0;n!==0&&(t.preventDefault(),t.stopPropagation(),e(n*(t.shiftKey?5:1)))}function Yt(t){const e=L.c(39),{track:n,width:o,soloed:s,renaming:a,setRenaming:l}=t,r=V(),d=n.muted===!0;let f;e[0]!==o?(f={width:o},e[0]=o,e[1]=f):f=e[1];const p=`sound-strip-${n.id}`;let c;e[2]===Symbol.for("react.memo_cache_sentinel")?(c=i.jsx("span",{className:"sound-strip-dot","aria-hidden":"true"}),e[2]=c):c=e[2];let h;e[3]!==a||e[4]!==l||e[5]!==r||e[6]!==n.id||e[7]!==n.name?(h=a?i.jsx("input",{className:"sound-strip-rename",defaultValue:n.name,"aria-label":"Track name",autoFocus:!0,onFocus:qt,onKeyDown:I=>{I.key==="Enter"&&I.currentTarget.blur(),I.key==="Escape"&&(I.currentTarget.value=n.name,I.currentTarget.blur()),I.stopPropagation()},onBlur:I=>{const B=I.currentTarget.value.trim();B!==""&&B!==n.name&&r.updateAudioTrack(n.id,{name:B}),l(!1)}}):i.jsx("span",{className:"sound-strip-name",title:`${n.name}: double-click to rename`,onDoubleClick:()=>l(!0),children:n.name}),e[3]=a,e[4]=l,e[5]=r,e[6]=n.id,e[7]=n.name,e[8]=h):h=e[8];const b=`sound-ms is-mute${d?" is-on":""}`,g=`Mute ${n.name}`,M=d?"Muted: saved with the film, so an export is silent here too":"Mute this track",y=`sound-mute-${n.id}`;let S;e[9]!==d||e[10]!==r||e[11]!==n.id?(S=()=>r.updateAudioTrack(n.id,{muted:!d}),e[9]=d,e[10]=r,e[11]=n.id,e[12]=S):S=e[12];let u;e[13]!==d||e[14]!==b||e[15]!==g||e[16]!==M||e[17]!==y||e[18]!==S?(u=i.jsx("button",{type:"button",className:b,"aria-pressed":d,"aria-label":g,title:M,"data-testid":y,onClick:S,children:"M"}),e[13]=d,e[14]=b,e[15]=g,e[16]=M,e[17]=y,e[18]=S,e[19]=u):u=e[19];const x=`sound-ms is-solo${s?" is-on":""}`,k=`Solo ${n.name}`,$=s?"Soloed in this tab only":"Solo: hear this track alone, in this tab only",N=`sound-solo-${n.id}`;let v;e[20]!==r||e[21]!==n.id?(v=()=>r.toggleSoloTrack(n.id),e[20]=r,e[21]=n.id,e[22]=v):v=e[22];let R;e[23]!==s||e[24]!==x||e[25]!==k||e[26]!==$||e[27]!==N||e[28]!==v?(R=i.jsx("button",{type:"button",className:x,"aria-pressed":s,"aria-label":k,title:$,"data-testid":N,onClick:v,children:"S"}),e[23]=s,e[24]=x,e[25]=k,e[26]=$,e[27]=N,e[28]=v,e[29]=R):R=e[29];let j;e[30]!==R||e[31]!==h||e[32]!==u?(j=i.jsxs("div",{className:"sound-strip-top",children:[c,h,u,R]}),e[30]=R,e[31]=h,e[32]=u,e[33]=j):j=e[33];let T;return e[34]!==t.onContextMenu||e[35]!==f||e[36]!==p||e[37]!==j?(T=i.jsx("div",{className:"sound-strip-cell sound-strip",style:f,"data-testid":p,onPointerDown:Jt,onContextMenu:t.onContextMenu,children:j}),e[34]=t.onContextMenu,e[35]=f,e[36]=p,e[37]=j,e[38]=T):T=e[38],T}function qt(t){return t.currentTarget.select()}function Jt(t){return t.stopPropagation()}function we(t){return Math.abs(t)<.005?"Centre":`${Math.round(Math.abs(t)*100)}% ${t<0?"left":"right"}`}function Xt(t){const e=L.c(26),{track:n}=t,o=V(),s=n.pan??0,a=s*135*Math.PI/180,l=zt,r=`Pan ${n.name}`;let d;e[0]!==s?(d=we(s),e[0]=s,e[1]=d):d=e[1];const f=`Pan: ${we(s)}. Drag up or down, double-click to centre.`,p=`sound-pan-${n.id}`;let c;e[2]!==s||e[3]!==o||e[4]!==n.id?(c=u=>{const x=u.clientY;Vt(o,n.id,u,(k,$)=>({pan:l(s-($-x)/100)}))},e[2]=s,e[3]=o,e[4]=n.id,e[5]=c):c=e[5];let h;e[6]!==o||e[7]!==n.id?(h=()=>o.updateAudioTrack(n.id,{pan:0}),e[6]=o,e[7]=n.id,e[8]=h):h=e[8];let b;e[9]!==s||e[10]!==o||e[11]!==n.id?(b=u=>Ve(u,x=>o.updateAudioTrack(n.id,{pan:l(s+x*.05)})),e[9]=s,e[10]=o,e[11]=n.id,e[12]=b):b=e[12];let g;e[13]===Symbol.for("react.memo_cache_sentinel")?(g=i.jsx("circle",{cx:"9",cy:"9",r:"7.5"}),e[13]=g):g=e[13];const M=`M9 9 L${(9+6*Math.sin(a)).toFixed(2)} ${(9-6*Math.cos(a)).toFixed(2)}`;let y;e[14]!==M?(y=i.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 18 18","aria-hidden":"true",children:[g,i.jsx("path",{d:M})]}),e[14]=M,e[15]=y):y=e[15];let S;return e[16]!==s||e[17]!==r||e[18]!==y||e[19]!==d||e[20]!==f||e[21]!==p||e[22]!==c||e[23]!==h||e[24]!==b?(S=i.jsx("span",{className:"sound-pan",role:"slider",tabIndex:0,"aria-label":r,"aria-valuemin":-1,"aria-valuemax":1,"aria-valuenow":s,"aria-valuetext":d,title:f,"data-testid":p,onPointerDown:c,onDoubleClick:h,onKeyDown:b,children:y}),e[16]=s,e[17]=r,e[18]=y,e[19]=d,e[20]=f,e[21]=p,e[22]=c,e[23]=h,e[24]=b,e[25]=S):S=e[25],S}function zt(t){const e=Math.max(-1,Math.min(1,t));return Math.abs(e)<.02?0:Math.round(e*100)/100}function xn(){const t=L.c(42),e=V(),n=W(en),o=W(Zt),s=W(Qt),a=C.useSyncExternalStore(st,Ee,Ee);if(We(ee,a?.ctx??null,a?.node??null),n===null)return null;let l,r,d,f,p;if(t[0]!==n||t[1]!==a||t[2]!==s||t[3]!==o||t[4]!==e){const y=xe(n);let S;t[10]!==n?(S=ot(n),t[10]=n,t[11]=S):S=t[11];const u=S;d="sound-mixer",f="sound-mixer";let x;t[12]===Symbol.for("react.memo_cache_sentinel")?(x=i.jsx("span",{className:"sound-mixer-title",children:"Mixer"}),t[12]=x):x=t[12];let k;t[13]!==s||t[14]!==o||t[15]!==e?(k=o.length>0?i.jsx("button",{type:"button",className:"sound-solo-chip",title:"Solo is this tab's alone. Exports hear every track. Press to hear every track again.",onClick:()=>{for(const T of o)e.toggleSoloTrack(T)},children:"Solo · clear"}):i.jsx(nn,{muted:s}),t[13]=s,t[14]=o,t[15]=e,t[16]=k):k=t[16];const $=!u.available,N=u.available?u.active?"The other tracks dip while the voice speaks. Press to stop.":"Dip the other tracks while the voice speaks":"Name a track Voice, with a clip on it, to duck the others under it";let v;t[17]!==u.active||t[18]!==e?(v=()=>e.setDuckUnderVoice(!u.active),t[17]=u.active,t[18]=e,t[19]=v):v=t[19];let R;t[20]!==u.active||t[21]!==v||t[22]!==$||t[23]!==N?(R=i.jsx("button",{type:"button",className:"sound-duck","data-testid":"sound-duck","aria-pressed":u.active,disabled:$,title:N,onClick:v,children:"Duck under voice"}),t[20]=u.active,t[21]=v,t[22]=$,t[23]=N,t[24]=R):R=t[24],t[25]!==R||t[26]!==k?(p=i.jsxs("div",{className:"sound-mixer-head",children:[x,k,R]}),t[25]=R,t[26]=k,t[27]=p):p=t[27],l="sound-mixer-strips";let j;t[28]!==a||t[29]!==o?(j=T=>i.jsx(sn,{track:T,graph:a,dimmed:o.length>0&&!o.includes(T.id),soloed:o.includes(T.id)},T.id),t[28]=a,t[29]=o,t[30]=j):j=t[30],r=y.map(j),t[0]=n,t[1]=a,t[2]=s,t[3]=o,t[4]=e,t[5]=l,t[6]=r,t[7]=d,t[8]=f,t[9]=p}else l=t[5],r=t[6],d=t[7],f=t[8],p=t[9];let c,h;t[31]===Symbol.for("react.memo_cache_sentinel")?(c=i.jsx("span",{className:"sound-pan-slot","aria-hidden":"true"}),h=i.jsx(tn,{}),t[31]=c,t[32]=h):(c=t[31],h=t[32]);let b;t[33]===Symbol.for("react.memo_cache_sentinel")?(b=i.jsxs("div",{className:"sound-mixer-strip is-master","data-testid":"mixer-strip-master",children:[c,h,i.jsx("div",{className:"sound-mixer-body",children:i.jsx(Ye,{meterKey:ee})}),i.jsx("span",{className:"sound-mixer-name",title:"Master: what the mix sends out, before the preview volume",children:"Master"})]}),t[33]=b):b=t[33];let g;t[34]!==l||t[35]!==r?(g=i.jsxs("div",{className:l,children:[r,b]}),t[34]=l,t[35]=r,t[36]=g):g=t[36];let M;return t[37]!==d||t[38]!==f||t[39]!==p||t[40]!==g?(M=i.jsxs("div",{className:d,"data-testid":f,children:[p,g]}),t[37]=d,t[38]=f,t[39]=p,t[40]=g,t[41]=M):M=t[41],M}function Qt(t){return t.previewMuted}function Zt(t){return t.soloTracks}function en(t){return t.doc}function tn(){const t=L.c(6);let e;t[0]===Symbol.for("react.memo_cache_sentinel")?(e=q(ee,"L"),t[0]=e):e=t[0];const n=se(e);let o;t[1]===Symbol.for("react.memo_cache_sentinel")?(o=q(ee,"R"),t[1]=o):o=t[1];const s=se(o),a=Math.max(n.hold,s.hold);let l;t[2]!==a?(l=oe(a,!1),t[2]=a,t[3]=l):l=t[3];let r;return t[4]!==l?(r=i.jsx("span",{className:"sound-mixer-db","data-testid":"mixer-master-hold",children:l}),t[4]=l,t[5]=r):r=t[5],r}function nn(t){const e=L.c(4),{muted:n}=t;let o;e[0]===Symbol.for("react.memo_cache_sentinel")?(o=q(ee,"L"),e[0]=o):o=e[0];const s=se(o);let a;e[1]===Symbol.for("react.memo_cache_sentinel")?(a=q(ee,"R"),e[1]=a):a=e[1];const l=se(a),r=n?"Preview muted":`${oe(Math.max(s.hold,l.hold))} peak`;let d;return e[2]!==r?(d=i.jsx("span",{className:"sound-mixer-peak","data-testid":"sound-mixer-peak",children:r}),e[2]=r,e[3]=d):d=e[3],d}function sn(t){const e=L.c(63),{track:n,graph:o}=t,s=V(),a=`track:${n.id}`;let l;e[0]!==o?.tracks||e[1]!==n.id?(l=o?.tracks.get(n.id)??null,e[0]=o?.tracks,e[1]=n.id,e[2]=l):l=e[2],We(a,o?.ctx??null,l);const r=n.gain??1,d=n.muted===!0,f=`sound-mixer-strip${d?" is-muted":""}${t.dimmed?" is-unsoloed":""}`,p=`mixer-strip-${n.id}`;let c;e[3]!==n?(c=i.jsx(Xt,{track:n}),e[3]=n,e[4]=c):c=e[4];let h;e[5]!==r?(h=oe(r,!1),e[5]=r,e[6]=h):h=e[6];let b;e[7]!==h?(b=i.jsx("span",{className:"sound-mixer-db",children:h}),e[7]=h,e[8]=b):b=e[8];let g;e[9]!==a?(g=i.jsx(Ye,{meterKey:a}),e[9]=a,e[10]=g):g=e[10];const M=`${n.name} level`;let y;e[11]!==s?(y=()=>s.beginBlockDrag(),e[11]=s,e[12]=y):y=e[12];let S;e[13]!==s||e[14]!==n.id?(S=F=>s.dragAudioTrack(n.id,{gain:F}),e[13]=s,e[14]=n.id,e[15]=S):S=e[15];let u;e[16]!==s?(u=F=>s.endBlockDrag(F),e[16]=s,e[17]=u):u=e[17];let x,k;e[18]!==s||e[19]!==n.id?(x=()=>s.updateAudioTrack(n.id,{gain:1}),k=F=>s.updateAudioTrack(n.id,{gain:F}),e[18]=s,e[19]=n.id,e[20]=x,e[21]=k):(x=e[20],k=e[21]);let $;e[22]!==r||e[23]!==u||e[24]!==x||e[25]!==k||e[26]!==M||e[27]!==y||e[28]!==S?($=i.jsx(on,{label:M,gain:r,onBegin:y,onDrag:S,onEnd:u,onReset:x,onStep:k}),e[22]=r,e[23]=u,e[24]=x,e[25]=k,e[26]=M,e[27]=y,e[28]=S,e[29]=$):$=e[29];let N;e[30]!==$||e[31]!==g?(N=i.jsxs("div",{className:"sound-mixer-body",children:[g,$]}),e[30]=$,e[31]=g,e[32]=N):N=e[32];const v=`sound-ms is-mute${d?" is-on":""}`,R=`Mute ${n.name}`;let j;e[33]!==d||e[34]!==s||e[35]!==n.id?(j=()=>s.updateAudioTrack(n.id,{muted:!d}),e[33]=d,e[34]=s,e[35]=n.id,e[36]=j):j=e[36];let T;e[37]!==d||e[38]!==v||e[39]!==R||e[40]!==j?(T=i.jsx("button",{type:"button",className:v,"aria-pressed":d,"aria-label":R,onClick:j,children:"M"}),e[37]=d,e[38]=v,e[39]=R,e[40]=j,e[41]=T):T=e[41];const I=`sound-ms is-solo${t.soloed?" is-on":""}`,B=`Solo ${n.name}`;let O;e[42]!==s||e[43]!==n.id?(O=()=>s.toggleSoloTrack(n.id),e[42]=s,e[43]=n.id,e[44]=O):O=e[44];let w;e[45]!==t.soloed||e[46]!==I||e[47]!==B||e[48]!==O?(w=i.jsx("button",{type:"button",className:I,"aria-pressed":t.soloed,"aria-label":B,onClick:O,children:"S"}),e[45]=t.soloed,e[46]=I,e[47]=B,e[48]=O,e[49]=w):w=e[49];let _;e[50]!==T||e[51]!==w?(_=i.jsxs("span",{className:"sound-mixer-ms",children:[T,w]}),e[50]=T,e[51]=w,e[52]=_):_=e[52];let P;e[53]!==n.name?(P=i.jsx("span",{className:"sound-mixer-name",title:n.name,children:n.name}),e[53]=n.name,e[54]=P):P=e[54];let U;return e[55]!==f||e[56]!==N||e[57]!==p||e[58]!==_||e[59]!==P||e[60]!==c||e[61]!==b?(U=i.jsxs("div",{className:f,"data-testid":p,children:[c,b,N,_,P]}),e[55]=f,e[56]=N,e[57]=p,e[58]=_,e[59]=P,e[60]=c,e[61]=b,e[62]=U):U=e[62],U}function _e(t){if(!Number.isFinite(t)||t<=0)return 0;const e=20*Math.log10(t);return e<=pe?0:Math.min(100,(1-e/pe)*100)}function Ye(t){const e=L.c(2),{meterKey:n}=t;let o;return e[0]!==n?(o=i.jsxs("span",{className:"sound-meter-pair","aria-hidden":"true",children:[i.jsx(Oe,{meterKey:n,channel:"L"}),i.jsx(Oe,{meterKey:n,channel:"R"})]}),e[0]=n,e[1]=o):o=e[1],o}function Oe(t){const e=L.c(13),{meterKey:n,channel:o}=t;let s;e[0]!==o||e[1]!==n?(s=q(n,o),e[0]=o,e[1]=n,e[2]=s):s=e[2];const a=se(s),l=_e(a.rms),r=_e(a.hold),d=`sound-meter-lit${l>95?" is-hot":""}`,f=`${l}%`;let p;e[3]!==f?(p={height:f},e[3]=f,e[4]=p):p=e[4];let c;e[5]!==d||e[6]!==p?(c=i.jsx("span",{className:d,style:p}),e[5]=d,e[6]=p,e[7]=c):c=e[7];let h;e[8]!==r?(h=r>0?i.jsx("span",{className:"sound-meter-hold",style:{bottom:`${r}%`}}):null,e[8]=r,e[9]=h):h=e[9];let b;return e[10]!==c||e[11]!==h?(b=i.jsxs("span",{className:"sound-meter",children:[c,h]}),e[10]=c,e[11]=h,e[12]=b):b=e[12],b}function on(t){const e=L.c(20),n=He(t.gain),o=an,s=t.label,a=t.gain;let l;e[0]!==t.gain?(l=oe(t.gain),e[0]=t.gain,e[1]=l):l=e[1];const r=`${oe(t.gain)}. Drag to set, double-click for 0 dB.`;let d;e[2]!==n||e[3]!==t?(d=b=>{if(b.button!==0||(b.preventDefault(),b.stopPropagation(),t.onBegin!==void 0&&!t.onBegin()))return;const g=b.currentTarget.getBoundingClientRect(),M=b.target.classList.contains("sound-vfader-thumb"),y=b.clientY,S=M?n:(g.bottom-b.clientY)/Math.max(1,g.height);M||t.onDrag(o(S)),Se(b,{onMove:u=>t.onDrag(o(S-(u.clientY-y)/Math.max(1,g.height))),onEnd:u=>t.onEnd?.(u)})},e[2]=n,e[3]=t,e[4]=d):d=e[4];let f;e[5]!==n||e[6]!==t.onDrag||e[7]!==t.onStep?(f=b=>Ve(b,g=>(t.onStep??t.onDrag)(o(n+g*.01))),e[5]=n,e[6]=t.onDrag,e[7]=t.onStep,e[8]=f):f=e[8];const p=`${n*100}%`;let c;e[9]!==p?(c=i.jsx("span",{className:"sound-vfader-thumb",style:{bottom:p}}),e[9]=p,e[10]=c):c=e[10];let h;return e[11]!==t.gain||e[12]!==t.label||e[13]!==t.onReset||e[14]!==l||e[15]!==r||e[16]!==d||e[17]!==f||e[18]!==c?(h=i.jsx("span",{className:"sound-vfader",role:"slider",tabIndex:0,"aria-orientation":"vertical","aria-label":s,"aria-valuemin":0,"aria-valuemax":ke,"aria-valuenow":a,"aria-valuetext":l,title:r,onPointerDown:d,onDoubleClick:t.onReset,onKeyDown:f,children:c}),e[11]=t.gain,e[12]=t.label,e[13]=t.onReset,e[14]=l,e[15]=r,e[16]=d,e[17]=f,e[18]=c,e[19]=h):h=e[19],h}function an(t){return Ot(t)}function Mn(){const t=L.c(18),e=W(rn),[n,o]=C.useState(!1),s=C.useRef(null),a=`sound-bpm-chip${e===void 0?" is-unset":""}`;let l;t[0]===Symbol.for("react.memo_cache_sentinel")?(l=()=>o(ln),t[0]=l):l=t[0];let r;t[1]!==e?(r=e===void 0?"Set tempo":Pt(e),t[1]=e,t[2]=r):r=t[2];let d;t[3]!==r?(d=i.jsx("span",{children:r}),t[3]=r,t[4]=d):d=t[4];let f;t[5]!==n||t[6]!==a||t[7]!==d?(f=i.jsxs("button",{ref:s,type:"button",className:a,"data-testid":"sound-bpm-chip","aria-expanded":n,title:"The film's tempo: bar lines, beat snap and the bar readout",onClick:l,children:[ft,d]}),t[5]=n,t[6]=a,t[7]=d,t[8]=f):f=t[8];let p;t[9]===Symbol.for("react.memo_cache_sentinel")?(p=()=>o(!1),t[9]=p):p=t[9];let c;t[10]!==n?(c=n?i.jsx(mn,{}):null,t[10]=n,t[11]=c):c=t[11];let h;t[12]!==n||t[13]!==c?(h=i.jsx(ht,{open:n,anchor:s,onClose:p,className:"sound-tempo-pop",children:c}),t[12]=n,t[13]=c,t[14]=h):h=t[14];let b;return t[15]!==f||t[16]!==h?(b=i.jsxs(i.Fragment,{children:[f,h]}),t[15]=f,t[16]=h,t[17]=b):b=t[17],b}function ln(t){return!t}function rn(t){return t.doc?.tempo}const cn=[3,4,6,7],dn=2e3,un=1500;function mn(){const t=V(),e=W(u=>u.doc),n=W(u=>u.snapBeats),o=e?.tempo,[s,a]=C.useState(o===void 0?"":String(Math.round(o.bpm*100)/100)),[l,r]=C.useState(null),[d,f]=C.useState(!1),p=C.useRef([]),c=C.useRef(null);C.useEffect(()=>{o!==void 0&&a(String(Math.round(o.bpm*100)/100))},[o?.bpm]);const h=u=>{const x=t.getState().doc?.tempo,k=u.bpm??x?.bpm??120;t.setTempo({...x??{},...u,bpm:k})},b=()=>{const u=c.current;u!==null&&(clearTimeout(u.timer),c.current=null,h({bpm:u.bpm}))};C.useEffect(()=>b,[]);const g=()=>{const u=Number(s);if(s.trim()===""||!Number.isFinite(u))return;const x=Math.min(me,Math.max(fe,Math.round(u*100)/100));a(String(x)),x!==o?.bpm&&h({bpm:x})},M=()=>{const u=performance.now(),x=p.current[p.current.length-1];p.current=x!==void 0&&u-x>dn?[u]:[...p.current,u].slice(-8);const k=p.current;if(k.length<2)return;const $=Math.round(6e4*(k.length-1)/(k[k.length-1]-k[0])),N=Math.min(me,Math.max(fe,$));a(String(N)),c.current!==null&&clearTimeout(c.current.timer),c.current={bpm:N,timer:setTimeout(b,un)}},y=async()=>{if(e===null)return;const u=t.getState(),x=Fe(e).filter(v=>v.layerId===void 0),k=x.find(v=>u.selectedAudio.includes(v.clip.id))??x.find(v=>u.frame>=v.clip.frame&&u.frame<v.clip.frame+v.clip.durationFrames)??x[0];if(k===void 0){r("Add a music clip first: the tempo is read from its beat analysis.");return}const $=e.assets[k.clip.asset],N=lt(k.clip,$);if($!==void 0){f(!0),r(null);try{const v=await rt(ct($.path)),j=JSON.parse(new TextDecoder().decode(v)).beats;if(j===void 0||j.bpm===null||!(j.bpm>0)){r(`${N} has no steady beat to read. Set the tempo by hand or tap it.`);return}const T=Math.min(me,Math.max(fe,Math.round(j.bpm*100)/100)),I=Math.max(1,Math.trunc(t.getState().doc?.tempo?.beatsPerBar??4)),B=e.fps.num/e.fps.den,O=k.clip.frame-(k.clip.offsetFrames??0)+(j.gridPhaseSeconds??0)*B,w=60*B/T*I,_=Math.round((O%w+w)%w);h({bpm:T,startFrame:_}),a(String(T)),j.reliable||r(`${N} reads as ${T} BPM, but its beat grid is not reliable. Check it by ear before you snap.`)}catch{r(`${N} has no beat analysis yet. Re-import it, or set the tempo by hand.`)}finally{f(!1)}}},S=Math.max(1,Math.trunc(o?.beatsPerBar??4));return i.jsxs("div",{className:"sound-tempo","data-testid":"sound-tempo",children:[i.jsxs("div",{className:"sound-tempo-head",children:[i.jsx("span",{className:"sound-tempo-title",children:"Tempo"}),i.jsx("span",{className:"sound-tempo-scope",children:"this doc"})]}),i.jsxs("div",{className:"sound-tempo-bpm",children:[i.jsx("input",{className:"text-input sound-tempo-input",inputMode:"decimal","aria-label":"Beats per minute","data-testid":"sound-tempo-bpm",value:s,placeholder:"120",onChange:u=>a(u.currentTarget.value),onBlur:g,onKeyDown:u=>{u.key==="Enter"&&g()}}),i.jsx("span",{className:"sound-tempo-unit",children:"BPM"}),i.jsx("button",{type:"button",className:"btn is-outline sound-tempo-tap","data-testid":"sound-tempo-tap",onClick:M,children:"Tap"})]}),i.jsxs("div",{className:"sound-tempo-field",children:[i.jsx("span",{className:"sound-tempo-label",children:"Beats per bar"}),i.jsx("span",{className:"sound-tempo-seg",role:"radiogroup","aria-label":"Beats per bar",children:cn.map(u=>i.jsx("button",{type:"button",role:"radio","aria-checked":S===u,className:`sound-tempo-seg-btn${S===u?" is-on":""}`,onClick:()=>h({beatsPerBar:u}),children:u},u))})]}),i.jsxs("div",{className:"sound-tempo-field",children:[i.jsxs("span",{className:"sound-tempo-label",children:["Snap to beats",i.jsx("span",{className:"sound-tempo-hint",children:"This tab only"})]}),i.jsx(it,{checked:n,onChange:u=>t.setSnapBeats(u),ariaLabel:"Snap to beats"})]}),i.jsx("span",{className:"sound-tempo-rule","aria-hidden":"true"}),i.jsxs("div",{className:"sound-tempo-actions",children:[i.jsx("button",{type:"button",className:"btn is-outline sound-tempo-detect","data-testid":"sound-tempo-detect",disabled:d,onClick:()=>void y(),children:d?"Reading…":"Detect from clip"}),o===void 0?null:i.jsx("button",{type:"button",className:"btn is-ghost",onClick:()=>t.setTempo(null),children:"Remove"})]}),l===null?null:i.jsx("p",{className:"sound-tempo-warn",role:"status","data-testid":"sound-tempo-warn",children:l})]})}function kn(t){const e=L.c(12),n=V(),o=W(hn),[s,a]=C.useState(!1);let l,r;e[0]!==o?(l=()=>{if(o===null)return;let c;return c=!0,pt(o).then(h=>{c&&a(h.needsKey!==void 0||Object.values(h.kinds).some(fn))},()=>{c&&a(!1)}),()=>{c=!1}},r=[o],e[0]=o,e[1]=l,e[2]=r):(l=e[1],r=e[2]),C.useEffect(l,r);let d;e[3]!==n?(d=i.jsxs("button",{type:"button",className:"btn is-outline sound-head-btn","data-testid":"sound-library",title:"Browse the library's sounds",onClick:()=>n.setLibraryBrowserOpen(!0,"sounds"),children:[bt,"Library"]}),e[3]=n,e[4]=d):d=e[4];let f;e[5]!==s||e[6]!==t.generateOpen||e[7]!==t.onGenerate?(f=s||t.generateOpen?i.jsxs("button",{type:"button",className:"btn sound-head-btn is-accent","data-testid":"sound-generate","aria-pressed":t.generateOpen,title:"Generate a sound effect, music or a voice",onClick:t.onGenerate,children:[ze,"Generate"]}):null,e[5]=s,e[6]=t.generateOpen,e[7]=t.onGenerate,e[8]=f):f=e[8];let p;return e[9]!==d||e[10]!==f?(p=i.jsxs(i.Fragment,{children:[d,f]}),e[9]=d,e[10]=f,e[11]=p):p=e[11],p}function fn(t){return t.ok}function hn(t){return t.name}export{wt as SOUND_ROW_H,bn as SOUND_SHOTS_ROW_H,kn as SoundHeadTools,gn as SoundLanes,xn as SoundMixer,Mn as TempoChip,mn as TempoPopover,oe as dbLabel,Ot as faderGain,He as faderPos,_e as meterPercent,Pt as tempoLabel};
@@ -0,0 +1 @@
1
+ import{bf as Je,bg as Ve,bh as We,bi as Ge,q as Qe,u as ze,A as ve,B as c,v as t,Q as Xe,R as Ze,bj as De,D as Fe,bk as et,bl as tt,bm as st,bn as nt,U as rt,bo as lt,bp as at,bq as it,aT as ot,N as ct}from"./index-BGHQGV5z.js";import{S as dt}from"./LibraryBrowser-D9sEGz5w.js";import"./libraryModel-CpIwfFha.js";import"./ComponentStage-BRhRotyH.js";class W extends Error{}async function ut(l,e,p,b=(i,o)=>fetch(i,o)){let i;try{i=await b(Ve({query:l,kind:e,page:p}),{credentials:"omit",referrerPolicy:"no-referrer",headers:{accept:"application/json"}})}catch{throw new W("Openverse could not be reached. Check your connection and try again.")}if(i.status===429){const g=Number(i.headers.get("retry-after"));throw new W(`Openverse's search limit was reached. Try again in ${Number.isFinite(g)&&g>0?`${Math.ceil(g)} seconds`:"a minute"}.`)}if(!i.ok)throw new W(`Openverse answered ${i.status}. Try again in a minute.`);const o=await i.json().catch(()=>null);if(o===null||!Array.isArray(o.results))throw new W("Openverse's answer could not be read.");return{rows:o.results.flatMap(g=>{const j=We(g);return j!==null&&Ge(j)===null?[j]:[]}),page:p,pageCount:typeof o.page_count=="number"?o.page_count:p}}const mt={sfx:[null,1,3,10,30],music:[null,30,60,180]};function ft(l,e){return l.filter(p=>Je(p,e??void 0))}function Ie(l){return l===null?"Any length":l<60?`Up to ${l}s`:`Up to ${l/60} min`}const Me={sfx:"Effects",music:"Music"},Ee="Adding stock sounds is not set up on this server yet. You can still search and listen.";function Nt(l){const e=Qe.c(107),{canAdd:p}=l,b=ze(),i=ve(kt),o=ve(gt),g=ve(yt),j=ve(bt),[S,Be]=c.useState(""),[m,Ue]=c.useState("sfx"),[E,Le]=c.useState(null),[f,Ae]=c.useState(null);let G;e[0]===Symbol.for("react.memo_cache_sentinel")?(G=[],e[0]=G):G=e[0];const[L,Ke]=c.useState(G);let Q;e[1]===Symbol.for("react.memo_cache_sentinel")?(Q={page:0,pageCount:0},e[1]=Q):Q=e[1];const[N,Ye]=c.useState(Q);let z;e[2]===Symbol.for("react.memo_cache_sentinel")?(z={kind:"idle"},e[2]=z):z=e[2];const[a,xe]=c.useState(z),[X,Z]=c.useState(null),[w,je]=c.useState(null),[Y,Pe]=c.useState(!1),[ee,Re]=c.useState(null),k=c.useRef(null),te=c.useRef(0),[O,He]=c.useState(!0);let se,ne;e[3]===Symbol.for("react.memo_cache_sentinel")?(se=()=>{let d;return d=!0,at().then(n=>{d&&He(n.imports)},pt),()=>{d=!1}},ne=[],e[3]=se,e[4]=ne):(se=e[3],ne=e[4]),c.useEffect(se,ne);let re,le;e[5]===Symbol.for("react.memo_cache_sentinel")?(re=()=>()=>{k.current?.pause(),k.current=null},le=[],e[5]=re,e[6]=le):(re=e[5],le=e[6]),c.useEffect(re,le);let ae,ie;e[7]!==i||e[8]!==o?(ae=()=>{k.current!==null&&(k.current.muted=i,k.current.volume=o)},ie=[i,o],e[7]=i,e[8]=o,e[9]=ae,e[10]=ie):(ae=e[9],ie=e[10]),c.useEffect(ae,ie);let oe;e[11]===Symbol.for("react.memo_cache_sentinel")?(oe=(d,n,C)=>{const fe=te.current=te.current+1;xe({kind:"loading"}),ut(d,n,C).then(y=>{fe===te.current&&(Ke(he=>C===1?y.rows:[...he,...y.rows.filter(D=>!he.some(pe=>pe.id===D.id))]),Ye({page:y.page,pageCount:y.pageCount}),xe({kind:"done"}))}).catch(y=>{fe===te.current&&xe({kind:"error",message:y instanceof W?y.message:"The search failed. Try again."})})},e[11]=oe):oe=e[11];const Ne=oe;let ce;e[12]!==S||e[13]!==m?(ce=d=>{d?.preventDefault();const n=S.trim();n!==""&&(Ae({query:n,kind:m}),Z(null),Ne(n,m,1))},e[12]=S,e[13]=m,e[14]=ce):ce=e[14];const H=ce;let de;e[15]!==f?(de=d=>{Ue(d),Le(null),f!==null&&(Ae({query:f.query,kind:d}),Z(null),Ne(f.query,d,1))},e[15]=f,e[16]=de):de=e[16];const J=de;let A,P,R,q,v;if(e[17]!==j||e[18]!==Y||e[19]!==p||e[20]!==S||e[21]!==ee||e[22]!==m||e[23]!==E||e[24]!==i||e[25]!==N||e[26]!==J||e[27]!==X||e[28]!==g||e[29]!==w||e[30]!==L||e[31]!==f||e[32]!==O||e[33]!==a.kind||e[34]!==a.message||e[35]!==b||e[36]!==H||e[37]!==o){const d=ft(L,E),n=d.find(s=>s.id===X)??d[0]??null;let C;e[43]===Symbol.for("react.memo_cache_sentinel")?(C=()=>{k.current?.pause(),k.current=null,je(null)},e[43]=C):C=e[43];const fe=C;let y;e[44]!==i||e[45]!==w||e[46]!==o?(y=s=>{if(Z(s.id),w===s.id){fe();return}k.current?.pause();const r=new Audio(s.url);r.muted=i,r.volume=o;const u=()=>{k.current===r&&(k.current=null,je(null))};r.addEventListener("ended",u),r.addEventListener("error",u),k.current=r,je(s.id),r.play().catch(u)},e[44]=i,e[45]=w,e[46]=o,e[47]=y):y=e[47];const he=y;let D;e[48]!==b?(D=(s,r)=>{r==="pin"&&!it(b)||(Pe(!0),Re(null),b.dismissError(),b.addStockSound(s.id,r).then(()=>{const u=b.getState().error;u!==null?Re(u):r==="place"&&b.getState().libraryBrowserOpen&&b.setLibraryBrowserOpen(!1)}).finally(()=>Pe(!1)))},e[48]=b,e[49]=D):D=e[49];const pe=D;let be;e[50]!==N||e[51]!==f||e[52]!==a.kind?(be=f!==null&&N.page<N.pageCount?t.jsx("button",{type:"button",className:"btn is-outline","data-testid":"stock-more",disabled:a.kind==="loading",onClick:()=>Ne(f.query,f.kind,N.page+1),children:a.kind==="loading"?"Loading…":"Load more"}):null,e[50]=N,e[51]=f,e[52]=a.kind,e[53]=be):be=e[53];const _=be;let x;if(a.kind==="idle"){let s;e[54]===Symbol.for("react.memo_cache_sentinel")?(s=t.jsx("p",{className:"library-preview-note",role:"status",children:"Search Freesound effects or Jamendo music. Only sounds you may use in a video are listed: CC0, public domain and CC BY."}),e[54]=s):s=e[54],x=s}else if(a.kind==="loading"&&L.length===0){let s;e[55]===Symbol.for("react.memo_cache_sentinel")?(s=t.jsx("p",{className:"library-preview-note",role:"status",children:"Searching Openverse…"}),e[55]=s):s=e[55],x=s}else if(a.kind==="error"&&L.length===0){let s;e[56]!==a.message?(s=t.jsx("p",{className:"library-preview-error",role:"alert","data-testid":"stock-error",children:a.message}),e[56]=a.message,e[57]=s):s=e[57],x=s}else if(d.length===0){const s=L.length===0?_===null?`No free ${Me[m].toLowerCase()} match ${JSON.stringify(f?.query??"")}. Try other words.`:"Nothing on this page may be used in a video. Load more to look further.":`None of these is ${Ie(E).toLowerCase()}.`;let r;e[58]!==s?(r=t.jsx("p",{className:"library-preview-note",role:"status",children:s}),e[58]=s,e[59]=r):r=e[59];let u;e[60]!==_||e[61]!==r?(u=t.jsxs(t.Fragment,{children:[r,_]}),e[60]=_,e[61]=r,e[62]=u):u=e[62],x=u}else{const s=t.jsx("ul",{className:"library-sound-list","aria-label":"Stock sounds","data-testid":"stock-list",children:d.map(h=>{const $e=w===h.id,Te=h===n;return t.jsxs("li",{className:Te?"library-sound-row is-selected":"library-sound-row","data-id":h.id,children:[t.jsx("button",{type:"button",className:"library-sound-play","aria-label":$e?`Stop ${h.title}`:`Play ${h.title}`,onClick:()=>he(h),children:$e?Xe:Ze}),t.jsxs("button",{type:"button",className:"library-sound-pick","aria-pressed":Te,onClick:()=>Z(h.id),children:[t.jsxs("span",{className:"library-sound-name",children:[h.title,h.creator===null?null:t.jsxs("span",{className:"stock-sound-creator",children:[" · ",h.creator]})]}),t.jsx("span",{className:"stock-sound-license",children:De(h.license,"")}),t.jsx("span",{className:"library-sound-length",children:Fe((h.durationMs??0)/1e3)})]})]},h.id)})});let r;e[63]!==a.kind||e[64]!==a.message?(r=a.kind==="error"?t.jsx("p",{className:"library-preview-error",role:"alert",children:a.message}):null,e[63]=a.kind,e[64]=a.message,e[65]=r):r=e[65];let u;e[66]!==_||e[67]!==s||e[68]!==r?(u=t.jsxs(t.Fragment,{children:[s,r,_]}),e[66]=_,e[67]=s,e[68]=r,e[69]=u):u=e[69],x=u}const V=n===null?null:et(n),qe=n===null?null:tt(n.source);let ye;e[70]===Symbol.for("react.memo_cache_sentinel")?(ye=t.jsx("header",{className:"library-catalog-head",children:t.jsxs("div",{children:[t.jsx("h2",{children:"Stock sounds"}),t.jsx("p",{children:"Free sounds from Openverse, safe to use in a video."})]})}),e[70]=ye):ye=e[70];const Oe=m==="sfx"?"Search effects, then press Enter":"Search music, then press Enter";let ge;e[71]===Symbol.for("react.memo_cache_sentinel")?(ge=s=>Be(s.target.value),e[71]=ge):ge=e[71];let F;e[72]!==S||e[73]!==Oe?(F=t.jsxs("label",{className:"search-field",children:[ot,t.jsx("input",{type:"search",value:S,placeholder:Oe,"aria-label":"Search stock sounds","data-testid":"stock-search",onChange:ge})]}),e[72]=S,e[73]=Oe,e[74]=F):F=e[74];const Ce=E===null?"":String(E);let ke;e[75]===Symbol.for("react.memo_cache_sentinel")?(ke=s=>Le(s.target.value===""?null:Number(s.target.value)),e[75]=ke):ke=e[75];const _e=mt[m];let M;e[76]!==_e?(M=_e.map(ht),e[76]=_e,e[77]=M):M=e[77];let I;e[78]!==Ce||e[79]!==M?(I=t.jsx("select",{className:"select is-quiet","aria-label":"Length","data-testid":"stock-length",value:Ce,onChange:ke,children:M}),e[78]=Ce,e[79]=M,e[80]=I):I=e[80];let B;e[81]!==H||e[82]!==F||e[83]!==I?(B=t.jsxs("form",{className:"library-search-row",role:"search",onSubmit:H,children:[F,I]}),e[81]=H,e[82]=F,e[83]=I,e[84]=B):B=e[84];let Se;e[85]===Symbol.for("react.memo_cache_sentinel")?(Se=[{value:"sfx",label:"Effects",testId:"stock-kind-sfx"},{value:"music",label:"Music",testId:"stock-kind-music"}],e[85]=Se):Se=e[85];let U;e[86]!==J?(U=s=>J(s),e[86]=J,e[87]=U):U=e[87];let K;e[88]!==m||e[89]!==U?(K=t.jsx(ct,{ariaLabel:"Kind of sound",className:"stock-kind",value:m,options:Se,onChange:U}),e[88]=m,e[89]=U,e[90]=K):K=e[90],e[91]!==x||e[92]!==B||e[93]!==K?(v=t.jsxs("section",{className:"library-catalog","aria-label":"Stock sounds","data-testid":"stock-sounds",children:[ye,B,K,x]}),e[91]=x,e[92]=B,e[93]=K,e[94]=v):v=e[94],A="library-preview is-sounds",P="Preview: stock sound",R="stock-preview",q=n===null||V===null?t.jsx("p",{className:"library-preview-empty",children:"Pick a sound to preview it here."}):t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"library-preview-purpose",children:[t.jsx("h2",{className:"library-preview-name",children:n.title}),t.jsxs("p",{className:"library-preview-note",children:[n.creator===null?"":`by ${n.creator} · `,qe?.name??n.source," · ",Fe((n.durationMs??0)/1e3)]})]}),t.jsxs("div",{className:"library-sound-selected","data-testid":"stock-selected",children:[n.source==="freesound"&&(X===n.id||w===n.id)?t.jsx(dt,{url:n.url}):null,t.jsxs("p",{className:"stock-sound-terms","data-testid":"stock-license",children:[t.jsx("strong",{children:De(V.license,V.licenseVersion)}),st(V.license)?" · Credit required. Dailies keeps the line and puts it in your export.":" · No credit needed."]}),t.jsx("p",{className:"stock-sound-credit","data-testid":"stock-credit",children:nt(V)}),t.jsxs("a",{className:"stock-sound-link",href:n.landingUrl,target:"_blank",rel:"noopener noreferrer",children:["Open on ",qe?.name??n.source]}),t.jsxs("button",{type:"button",className:"btn is-primary is-lg","data-testid":"stock-add",disabled:!p||Y||!O,"aria-disabled":g!==null||void 0,title:O?p?g??"Add this sound at the playhead of the open Shot.":"Open a Project to add sounds.":Ee,onClick:()=>{g===null&&pe(n,"place")},children:[rt,Y?"Adding…":"Add to shot"]}),t.jsx("button",{type:"button",className:"btn is-outline is-lg","data-testid":"stock-pin",disabled:!p||Y||!O,title:O?p?`Add this sound and pin it as a card the agent reads.${j?"":" Opens the storyboard."}`:"Open a Project to add sounds.":Ee,onClick:()=>pe(n,"pin"),children:"Pin to board"}),ee===null?null:t.jsx("p",{className:"library-preview-error",role:"alert","data-testid":"stock-add-error",children:ee}),t.jsx("p",{className:"library-preview-hint","data-testid":"stock-hint",children:O?n.source==="freesound"?"Freesound shares a preview-quality MP3, which is what is added.":"Add places it in the open Shot. Pin saves it for later.":Ee})]})]}),e[17]=j,e[18]=Y,e[19]=p,e[20]=S,e[21]=ee,e[22]=m,e[23]=E,e[24]=i,e[25]=N,e[26]=J,e[27]=X,e[28]=g,e[29]=w,e[30]=L,e[31]=f,e[32]=O,e[33]=a.kind,e[34]=a.message,e[35]=b,e[36]=H,e[37]=o,e[38]=A,e[39]=P,e[40]=R,e[41]=q,e[42]=v}else A=e[38],P=e[39],R=e[40],q=e[41],v=e[42];let ue;e[95]===Symbol.for("react.memo_cache_sentinel")?(ue=t.jsx("span",{children:"Openverse"}),e[95]=ue):ue=e[95];const we=Me[m];let $;e[96]!==we?($=t.jsxs("footer",{className:"library-preview-meta",children:[ue,t.jsx("span",{children:we})]}),e[96]=we,e[97]=$):$=e[97];let T;e[98]!==A||e[99]!==P||e[100]!==R||e[101]!==q||e[102]!==$?(T=t.jsxs("aside",{className:A,"aria-label":P,"data-testid":R,children:[q,$]}),e[98]=A,e[99]=P,e[100]=R,e[101]=q,e[102]=$,e[103]=T):T=e[103];let me;return e[104]!==v||e[105]!==T?(me=t.jsxs(t.Fragment,{children:[v,T]}),e[104]=v,e[105]=T,e[106]=me):me=e[106],me}function ht(l){return t.jsx("option",{value:l===null?"":String(l),children:Ie(l)},l??"any")}function pt(){}function bt(l){return l.storyboardOpen}function yt(l){return lt(l,"sound")}function gt(l){return l.previewVolume}function kt(l){return l.previewMuted}export{Nt as StockSounds};
@@ -0,0 +1 @@
1
+ import{q as b,u as w,t as x,S as L,v as n,I as h,T as j,x as v,y}from"./index-BGHQGV5z.js";const S={text:"Headline",image:"Screenshot",video:"Product video"};function g(e){const l=e.label.replace(/\p{Cc}+/gu," ").trim().slice(0,L).trim();return l===""?S[e.kind]:l}function A(){const e=b.c(16),l=w(),f=x(),t=f.length===1?f[0]:void 0;if(t===void 0)return null;const u=t.swap?.label,c=u!==void 0;let s;e[0]!==t||e[1]!==l?(s=m=>l.setLayerSwap(t.id,m?g(t):null),e[0]=t,e[1]=l,e[2]=s):s=e[2];let a;e[3]!==c||e[4]!==s?(a=n.jsx(h,{label:"Swappable",labelTitle:"People who start from this template swap this layer for their own",children:n.jsx(j,{checked:c,ariaLabel:"Swappable",onChange:s})}),e[3]=c,e[4]=s,e[5]=a):a=e[5];const p=u??"",d=S[t.kind];let i;e[6]!==t.id||e[7]!==l?(i=m=>l.setLayerSwap(t.id,m),e[6]=t.id,e[7]=l,e[8]=i):i=e[8];let o;e[9]!==p||e[10]!==d||e[11]!==i?(o=n.jsx(h,{label:"Name",children:n.jsx(v,{value:p,placeholder:d,ariaLabel:"Name, what the template field asks for",onCommit:i})}),e[9]=p,e[10]=d,e[11]=i,e[12]=o):o=e[12];let r;return e[13]!==a||e[14]!==o?(r=n.jsxs(y,{className:"insp-object",title:"Template field",persistKey:"shot:template-field",children:[a,o]}),e[13]=a,e[14]=o,e[15]=r):r=e[15],r}export{S as SWAP_PLACEHOLDER,A as TemplateFieldSection,g as defaultSwapLabel};
@@ -0,0 +1 @@
1
+ import{q as K,u as q,A as F,b5 as Q,af as X,v as t,V as M,B as D,K as Z,b6 as _}from"./index-BGHQGV5z.js";const ee="local";function G(e,s){return e===ee?"You":s[e]??"Former member"}function W(e,s){const n=e.map(i=>G(i,s));return n.length<=2?n.join(", "):`${n.slice(0,2).join(", ")} +${n.length-2}`}const B=new Intl.DateTimeFormat("en-US",{hour:"numeric",minute:"2-digit"});function se(e,s){const n=B.format(s),i=B.format(e);if(i===n)return n;const r=o=>o.slice(o.lastIndexOf(" ")+1);return`${r(i)===r(n)?i.slice(0,i.lastIndexOf(" ")):i} to ${n}`}const ne=new Intl.DateTimeFormat("en-US",{weekday:"short",month:"short",day:"numeric"}),te=new Intl.DateTimeFormat("en-US",{month:"short",day:"numeric",year:"numeric"});function ie(e,s){const n=new Date(e),i=new Date(s),r=l=>new Date(l.getFullYear(),l.getMonth(),l.getDate()).getTime(),o=Math.round((r(i)-r(n))/864e5);return o===0?"Today":o===1?"Yesterday":n.getFullYear()===i.getFullYear()?ne.format(n):te.format(n)}function re(e,s){const n=[];for(const i of e){const r=ie(i.at,s),o=n.at(-1);o?.day===r?o.versions.push(i):n.push({day:r,versions:[i]})}return n}function Y(e,s){if(e.name!==void 0)return e.name;if(e.restoredFrom!==void 0){const n=s.find(i=>i.id===e.restoredFrom);return n?.name===void 0?"Restored an earlier version":`Restored "${n.name}"`}return"Autosaved"}function U(e,s){const n=W(e.authors,s),i=se(e.from,e.at);return n===""?i:`${n} · ${i}`}function z(e){const s=e.trim();return s===""?"Give the version a name.":s.length>80?"A version name is at most 80 characters.":/[\u0000-\u001f\u007f]/.test(s)?"A version name is one line.":null}function oe(e){let s=0;for(let n=0;n<e.length;n++)s=s*31+e.charCodeAt(n)>>>0;return s%360}function me(){const e=K.c(52),s=q(),n=F(ce),i=F(le),r=F(ae),o=Q(),{prompt:l,dialog:u}=X();let v;e[0]!==n?.people?(v=n?.people??{},e[0]=n?.people,e[1]=v):v=e[1];const a=v;let c;e[2]!==n?.versions?(c=n?.versions??[],e[2]=n?.versions,e[3]=c):c=e[3];const h=c,f=n?.head??null,$=i?.version.id??null;let V;e[4]!==o||e[5]!==l||e[6]!==r||e[7]!==s?(V=(m,d)=>{const A=d.getBoundingClientRect(),I=r?{disabled:!0,title:M}:{},J=[{kind:"action",id:"version.rename",label:"Rename…",...I,onSelect:()=>{l({title:m.name===void 0?"Name this version":"Rename version",label:"Name",initialValue:m.name??"",confirmLabel:m.name===void 0?"Name":"Rename",validate:z}).then(O=>{O!==null&&s.renameVersion(m.id,O.trim())})}},{kind:"action",id:"version.preview",label:"Preview",onSelect:()=>void s.previewVersion(m.id)},{kind:"action",id:"version.restore",label:"Restore",...I,onSelect:()=>void s.restoreVersion(m.id)}];o.open({x:A.right,y:A.bottom+6},J)},e[4]=o,e[5]=l,e[6]=r,e[7]=s,e[8]=V):V=e[8];const L=V;let C;e[9]===Symbol.for("react.memo_cache_sentinel")?(C=t.jsx("h2",{className:"versions-title",children:"Version history"}),e[9]=C):C=e[9];let p;e[10]!==s?(p=t.jsxs("header",{className:"versions-head",children:[C,t.jsx("button",{type:"button",className:"btn is-icon","data-testid":"versions-close","aria-label":"Close the version history",title:"Close the version history",onClick:()=>s.openVersions(!1),children:"×"})]}),e[10]=s,e[11]=p):p=e[11];let x;e[12]!==r?(x=r?null:t.jsx(de,{}),e[12]=r,e[13]=x):x=e[13];const P=$===null;let b;e[14]!==s?(b=()=>s.exitVersionPreview(),e[14]=s,e[15]=b):b=e[15];let y;e[16]!==f?.authors?(y=f?.authors??[],e[16]=f?.authors,e[17]=y):y=e[17];let N;e[18]!==a||e[19]!==y?(N=t.jsx(H,{ids:y,people:a}),e[18]=a,e[19]=y,e[20]=N):N=e[20];let R;e[21]===Symbol.for("react.memo_cache_sentinel")?(R=t.jsx("span",{className:"version-name",children:"Current version"}),e[21]=R):R=e[21];const T=f===null||f.authors.length===0?"Editing now":`${W(f.authors,a)} · editing now`;let j;e[22]!==T?(j=t.jsxs("span",{className:"version-text",children:[R,t.jsx("span",{className:"version-sub",children:T})]}),e[22]=T,e[23]=j):j=e[23];let w;e[24]!==j||e[25]!==P||e[26]!==b||e[27]!==N?(w=t.jsxs("button",{type:"button",className:"version-row is-current","aria-pressed":P,"data-testid":"version-current",onClick:b,children:[N,j]}),e[24]=j,e[25]=P,e[26]=b,e[27]=N,e[28]=w):w=e[28];let g;e[29]!==n||e[30]!==L||e[31]!==a||e[32]!==$||e[33]!==s||e[34]!==h?(g=n===null?t.jsx("p",{className:"versions-note",children:"Loading versions…"}):h.length===0?t.jsx("p",{className:"versions-note",children:"No earlier versions yet. Autosaves gather here as you work."}):re(h,Date.now()).map(m=>t.jsxs("div",{className:"versions-day",role:"group","aria-label":m.day,children:[t.jsx("h3",{className:"versions-day-head",children:m.day}),m.versions.map(d=>t.jsxs("div",{className:"version-item","data-selected":d.id===$?"":void 0,children:[t.jsxs("button",{type:"button",className:`version-row${d.name===void 0?"":" is-named"}`,"aria-pressed":d.id===$,"data-testid":`version-row-${d.id}`,onClick:()=>void s.previewVersion(d.id),children:[t.jsx(H,{ids:d.authors,people:a}),t.jsxs("span",{className:"version-text",children:[t.jsx("span",{className:"version-name",children:Y(d,h)}),t.jsx("span",{className:"version-sub",children:U(d,a)})]}),d.name===void 0?null:t.jsx("span",{className:"version-badge",children:"Named"})]}),t.jsx("button",{type:"button",className:"btn is-icon version-more","data-testid":`version-more-${d.id}`,"aria-label":`More for ${Y(d,h)}`,title:"More",onClick:A=>L(d,A.currentTarget),children:"…"})]},d.id))]},m.day)),e[29]=n,e[30]=L,e[31]=a,e[32]=$,e[33]=s,e[34]=h,e[35]=g):g=e[35];let k;e[36]!==w||e[37]!==g?(k=t.jsxs("div",{className:"versions-list","data-testid":"versions-list",children:[w,g]}),e[36]=w,e[37]=g,e[38]=k):k=e[38];let S;e[39]!==a||e[40]!==i||e[41]!==r||e[42]!==s||e[43]!==h?(S=i===null?null:t.jsxs("footer",{className:"versions-preview","data-testid":"versions-preview",children:[t.jsx("span",{className:"versions-caps",children:"Previewing"}),t.jsx("span",{className:"versions-preview-what",children:`${i.version.name===void 0?Y(i.version,h):`"${i.version.name}"`} · ${U(i.version,a)}`}),t.jsxs("div",{className:"versions-preview-verbs",children:[t.jsx("button",{type:"button",className:"btn is-outline","data-testid":"versions-back",onClick:()=>s.exitVersionPreview(),children:"Back to current"}),t.jsx("button",{type:"button",className:"btn is-primary","data-testid":"versions-restore",disabled:r,title:r?M:"Restore this version. Undo takes it back.",onClick:()=>void s.restoreVersion(i.version.id),children:"Restore"})]})]}),e[39]=a,e[40]=i,e[41]=r,e[42]=s,e[43]=h,e[44]=S):S=e[44];let E;return e[45]!==u||e[46]!==o.menu||e[47]!==k||e[48]!==S||e[49]!==p||e[50]!==x?(E=t.jsxs("section",{className:"versions-panel","data-testid":"versions-panel","aria-label":"Version history",children:[u,o.menu,p,x,k,S]}),e[45]=u,e[46]=o.menu,e[47]=k,e[48]=S,e[49]=p,e[50]=x,e[51]=E):E=e[51],E}function ae(e){return e.versionPreview?.roleReadOnly??e.readOnly}function le(e){return e.versionPreview}function ce(e){return e.versionList}function de(){const e=q(),s=F(c=>c.versionNameAsk),[n,i]=D.useState(""),[r,o]=D.useState(!1),l=D.useRef(null);D.useEffect(()=>{s&&(l.current?.focus(),l.current?.select())},[s]);const u=n===""?null:z(n),v=async()=>{if(!(r||n.trim()===""||u!==null)){o(!0);try{await e.saveVersionNamed(n.trim())&&i("")}finally{o(!1)}}},a=Z("file.save");return s?t.jsxs("div",{className:"versions-save",children:[t.jsx("label",{className:"versions-caps",htmlFor:"versions-save-name",children:"Save version"}),t.jsxs("div",{className:"versions-save-field",children:[t.jsx("input",{ref:l,id:"versions-save-name",className:"text-input","data-testid":"versions-save-name",placeholder:"Name this version",value:n,maxLength:80,"aria-invalid":u!==null,onChange:c=>i(c.currentTarget.value),onKeyDown:c=>{c.key==="Enter"?(c.preventDefault(),v()):c.key==="Escape"&&(c.preventDefault(),c.stopPropagation(),e.setVersionNameAsk(!1))}}),t.jsx("button",{type:"button",className:"btn is-primary","data-testid":"versions-save",disabled:r||n.trim()===""||u!==null,onClick:()=>void v(),children:"Save"})]}),t.jsx("p",{className:"versions-hint",children:u??"Enter saves. Esc closes the field."})]}):t.jsx("div",{className:"versions-save",children:t.jsx("button",{type:"button",className:"btn is-outline","data-testid":"versions-save-open",title:a===void 0?void 0:`Save version (${a})`,onClick:()=>e.setVersionNameAsk(!0),children:"Save version…"})})}function H(e){const s=K.c(11),{ids:n,people:i}=e;let r,o,l;if(s[0]!==n||s[1]!==i){const v=n.slice(0,3);r="version-faces",o="true";let a;s[5]!==i?(a=c=>t.jsx("span",{className:"version-face",style:{background:`hsl(${oe(c)} 45% 45%)`},children:t.jsx(_,{url:null,label:G(c,i),className:"version-face-mark"})},c),s[5]=i,s[6]=a):a=s[6],l=v.map(a),s[0]=n,s[1]=i,s[2]=r,s[3]=o,s[4]=l}else r=s[2],o=s[3],l=s[4];let u;return s[7]!==r||s[8]!==o||s[9]!==l?(u=t.jsx("span",{className:r,"aria-hidden":o,children:l}),s[7]=r,s[8]=o,s[9]=l,s[10]=u):u=s[10],u}export{me as VersionHistoryPanel};
@@ -0,0 +1 @@
1
+ @layer component-sheets{.board-canvas{--shot-card-w: 348px;--shot-gutter-w: 88px;position:relative;flex:1 1 0;min-width:0;min-height:0;display:flex;flex-direction:column;overflow:hidden;outline:none;pointer-events:auto;background-color:var(--surface-board)}.board-canvas.is-drop{box-shadow:inset 0 0 0 2px var(--accent)}.board-bar-title{margin:0;font-size:var(--type-lg);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:var(--ink-1)}.board-bar-summary,.board-section-count{flex:none;font-family:var(--font-numeric);font-size:var(--type-md);line-height:var(--leading-xs);color:var(--ink-3);white-space:nowrap}.board-bar-spacer{flex:1 1 0}.board-desk{position:relative;flex:1 1 0;min-height:0;display:flex;flex-direction:column;gap:var(--space-8);padding:var(--space-8) var(--space-8) var(--space-7);overflow:auto;background-image:radial-gradient(circle,var(--board-dot) 1px,transparent 1px);background-size:20px 20px}.board-section-head{display:flex;align-items:center;gap:var(--space-6);min-width:0;min-height:var(--leading-xs)}.board-section-hint{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--type-md);line-height:var(--leading-xs);color:var(--ink-2)}.style-wall{flex:none;display:flex;flex-direction:column;gap:var(--space-5)}.style-wall-items{display:flex;gap:var(--space-5);height:calc(76px + 2 * var(--space-2));margin:calc(-1 * var(--space-2));padding:var(--space-2);overflow-x:auto;overflow-y:hidden}.style-card{position:relative;flex:none;display:flex;flex-direction:column;width:120px;height:100%;border-radius:var(--radius-tab);background:var(--surface-secondary);overflow:hidden;cursor:pointer;outline:none}.style-card.is-selected{outline:2px solid var(--accent);outline-offset:2px}.style-card:focus-visible{box-shadow:var(--focus-ring)}.style-card-media,.style-card>.reference-preview,.style-card>img{display:block;width:100%;height:100%;object-fit:cover}.style-card.is-font{justify-content:space-between;padding:var(--space-5);background:var(--specimen-paper)}.style-font-sample{font-size:var(--type-heading);line-height:var(--leading-lg);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-body);color:var(--specimen-ink)}.style-font-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--type-sm);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:color-mix(in srgb,var(--specimen-ink) 65%,var(--specimen-paper))}.style-card.is-palette{justify-content:space-between;padding:var(--space-5);border:1px solid var(--line)}.style-palette-swatches{display:flex;flex-wrap:wrap;gap:var(--space-2)}.style-palette-swatch{width:18px;height:18px;border-radius:var(--radius-full);box-shadow:inset 0 0 0 1px var(--line-strong)}.style-palette-name{font-size:var(--type-sm);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:var(--ink-2)}.style-card.is-note{justify-content:space-between;gap:var(--space-2);padding:var(--space-5);background:var(--note-paper)}.style-note-text{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-size:var(--type-sm);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:var(--note-ink);overflow-wrap:anywhere}.style-note-meta{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--type-micro);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:var(--note-meta)}.style-card.is-link{justify-content:flex-end;gap:var(--space-1);padding:var(--space-5);border:1px solid var(--line)}.style-link-host{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-mono);font-size:var(--type-micro);line-height:var(--leading-xs);color:var(--ink-3)}.style-link-title{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-size:var(--type-sm);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:var(--ink-1);overflow-wrap:anywhere}.style-card.is-component{border:1px solid var(--line)}.style-component-preview{position:relative;flex:1 1 0;min-height:0;overflow:hidden;background:var(--surface-sunken);pointer-events:none}.style-component-foot{flex:none;display:flex;align-items:center;height:var(--space-8);min-width:0;padding:0 var(--space-4)}.style-component-name{flex:1 1 0;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--type-sm);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:var(--ink-1)}.style-card-comment{position:absolute;top:var(--space-2);right:var(--space-2);display:grid;place-items:center;width:20px;height:20px;padding:0;border:0;border-radius:var(--radius-xs);background:var(--badge-scrim);color:var(--on-media);cursor:pointer}.style-card-comment>svg{width:12px;height:12px}.style-card-comment.is-pin{border-radius:var(--radius-tab) var(--radius-tab) var(--radius-tab) var(--radius-2xs);background:var(--accent);color:var(--on-accent);font-size:var(--type-sm);line-height:var(--leading-xs);font-weight:var(--weight-semibold)}span.style-card-comment{cursor:default}.style-card.is-note .style-note-text{padding-right:var(--space-7)}.style-card-comment:focus-visible{outline:none;box-shadow:var(--focus-ring)}.board-shots{flex:none;display:flex;flex-direction:column;gap:var(--space-6)}.board-shots-row{display:flex;flex-wrap:wrap;align-items:stretch;row-gap:var(--space-8)}.shot-cell{position:relative;flex:none;display:flex}.shot-gutter{position:relative;flex:none;width:var(--shot-gutter-w);display:flex;flex-direction:column;align-items:center;gap:var(--space-3);padding-top:calc(var(--shot-card-w) * 9 / 32 - var(--badge-h) / 2)}.shot-card{position:relative;flex:none;width:var(--shot-card-w);display:flex;flex-direction:column;background:var(--surface-panel);border:1px solid var(--line);border-radius:var(--radius-tab);overflow:hidden;cursor:pointer;outline:none;content-visibility:auto;contain-intrinsic-size:auto var(--shot-card-w) auto calc(var(--shot-card-w) * .85);transition:border-color var(--dur-fast) var(--ease)}.shot-card:hover{border-color:var(--line-strong)}.shot-card.is-selected{outline:2px solid var(--accent);outline-offset:-1px}.shot-card:focus-visible{box-shadow:var(--focus-ring)}.shot-card.is-drop{border-style:dashed;border-color:var(--accent)}.shot-card-picture{position:relative;flex:none;aspect-ratio:16 / 9;background:var(--surface-sunken);overflow:hidden}.shot-card-picture>img{display:block;width:100%;height:100%;object-fit:cover}.shot-card-picture.is-paper{background:var(--sketch-paper)}.shot-card-sketch-empty{position:absolute;inset:0;display:grid;place-items:center;font-size:var(--type-md);line-height:var(--leading-xs);color:var(--sketch-ink)}.shot-card-built{position:absolute;top:var(--space-4);left:var(--space-4);display:inline-flex;align-items:center;gap:var(--space-2);height:var(--badge-h);padding:0 var(--space-3);border-radius:var(--radius-xs);background:var(--badge-scrim);font-size:var(--type-sm);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:var(--on-media)}.shot-card-built>svg{width:12px;height:12px;color:var(--success)}.shot-card-dots{position:absolute;left:50%;bottom:var(--space-3);display:flex;translate:-50% 0}.shot-card-dot{width:5px;height:5px;padding:var(--space-1);box-sizing:content-box;border-radius:var(--radius-full);background:var(--sketch-line);background-clip:content-box}.shot-card-dot.is-shown{background-color:var(--sketch-ink)}.shot-card-grip{position:absolute;top:var(--space-4);left:var(--space-4);display:none;place-items:center;width:24px;height:24px;border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:color-mix(in srgb,var(--surface-panel) 90%,transparent);color:var(--ink-2);cursor:grab}.shot-card:hover>.shot-card-grip{display:grid}.shot-card:has(.shot-card-built)>.shot-card-grip{left:auto;right:var(--space-4)}.shot-card-body{display:flex;flex-direction:column;gap:var(--space-3);min-width:0;padding:var(--space-6)}.shot-card-title{display:flex;align-items:center;gap:var(--space-4);min-width:0;height:var(--badge-h)}.shot-card-number{flex:none;font-family:var(--font-numeric);font-size:var(--type-md);line-height:var(--leading-xs);color:var(--ink-3)}.shot-card-name{flex:1 1 0;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--type-lg);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:var(--ink-1)}.shot-card-voice,.shot-card-notes{margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--type-md);line-height:var(--leading-xs);color:var(--ink-2)}.shot-card-body:not(:has(.shot-card-voice,.shot-card-notes)):after{content:"";height:var(--leading-xs)}.shot-card-foot{display:flex;align-items:center;gap:var(--space-4);min-width:0;height:var(--button-h);margin-top:auto;padding:0 var(--space-6);border-top:1px solid var(--line-soft)}.shot-card-counts{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--type-sm);line-height:var(--leading-xs);color:var(--ink-3)}.shot-card-length{flex:none;margin-left:auto;font-family:var(--font-numeric);font-size:var(--type-md);line-height:var(--leading-xs);color:var(--ink-2)}.shot-transition-chip{flex:none;display:inline-flex;align-items:center;height:var(--badge-h);padding:0 var(--space-3);border:1px solid var(--line);border-radius:var(--radius-xs);background:var(--surface-secondary);color:var(--ink-2);font:inherit;font-size:var(--type-sm);line-height:var(--leading-xs);font-weight:var(--weight-medium);white-space:nowrap}button.shot-transition-chip{cursor:pointer}button.shot-transition-chip:hover{color:var(--ink-1)}.shot-transition-chip.is-selected{border-color:var(--accent);background:var(--accent-quiet);color:var(--accent-ink)}.shot-transition-chip:focus-visible{outline:none;box-shadow:var(--focus-ring)}.shot-gutter-wrap{font-size:var(--type-sm);line-height:var(--leading-xs);color:var(--ink-3);white-space:nowrap}.shot-insert{position:absolute;top:0;bottom:0;left:calc(50% - var(--space-2));z-index:0;width:8px;pointer-events:none;background:linear-gradient(var(--accent),var(--accent)) center / 2px 100% no-repeat}.shot-insert:before,.shot-insert:after{content:"";position:absolute;left:0;width:8px;height:8px;box-sizing:border-box;border:2px solid var(--accent);border-radius:var(--radius-xs);background:var(--surface-board)}.shot-insert:before{top:0}.shot-insert:after{bottom:0}.shot-insert.is-before{left:calc(-1 * var(--space-7) - var(--space-2))}.shot-gutter.is-insert>.shot-transition-chip,.shot-gutter.is-insert>.shot-gutter-wrap{position:relative;z-index:1;box-shadow:0 0 0 var(--space-2) var(--surface-board)}.board-shots-row.is-moving .shot-transition-chip{pointer-events:none}.shot-add-slot{flex:none;width:var(--shot-card-w);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-4);padding:var(--space-7);border:1px dashed var(--line-strong);border-radius:var(--radius-tab);background:transparent;color:var(--ink-2);font:inherit;cursor:pointer;transition:background var(--dur-fast) var(--ease),border-color var(--dur-fast) var(--ease)}.shot-add-slot:hover{background:var(--fill-rest);border-color:var(--ink-3)}.shot-add-slot:focus-visible{outline:none;box-shadow:var(--focus-ring)}.shot-add-slot>svg{width:16px;height:16px}.shot-add-slot-title{font-size:var(--type-lg);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:var(--ink-1)}.shot-add-slot-hint{font-size:var(--type-md);line-height:var(--leading-xs);color:var(--ink-3)}.board-drop-title{min-width:0;font-size:var(--type-xl);line-height:var(--leading-md);font-weight:var(--weight-semibold);color:var(--ink-1)}.board-drop-esc{flex:none;margin-left:auto;font-size:var(--type-lg);line-height:var(--leading-xs);font-weight:var(--weight-regular);color:var(--ink-3)}.board-drop-thumbs{display:flex;flex-wrap:wrap;gap:var(--space-4);padding:0 var(--space-7)}.board-drop-thumb{flex:none;width:112px;height:70px;border-radius:var(--radius-sm);object-fit:cover;background:var(--surface-secondary)}.board-drop-thumb.is-file,.board-drop-thumb.is-more{display:grid;place-items:center;padding:0 var(--space-4);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--type-sm);line-height:var(--leading-xs);color:var(--ink-2)}.board-drop-field{display:flex;flex-direction:column;gap:var(--space-3);padding:var(--space-7) var(--space-7) 0}.board-drop-label{font-size:var(--type-sm);line-height:var(--leading-xs);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-caps);text-transform:uppercase;color:var(--ink-2)}.board-drop-note{width:100%;min-height:0;padding:var(--space-4);border:1px solid transparent;border-radius:var(--radius-sm);background:var(--surface-secondary);color:var(--ink-1);font:inherit;font-size:var(--type-md);line-height:var(--leading-xs);resize:vertical;outline:none}.board-drop-note:focus{border-color:var(--accent)}.board-drop-note::placeholder{color:var(--ink-3)}.board-drop-scopes{display:flex;gap:var(--space-4)}.board-drop-scope{flex:1 1 0;min-width:0;display:flex;flex-direction:column;gap:var(--space-2);padding:var(--space-6);border:1px solid var(--line);border-radius:var(--radius-md);background:var(--surface-secondary);color:inherit;font:inherit;text-align:left;cursor:pointer;transition:border-color var(--dur-fast) var(--ease),background var(--dur-fast) var(--ease)}.board-drop-scope.is-selected{border-color:var(--accent);background:var(--accent-quiet);box-shadow:inset 0 0 0 .5px var(--accent)}.board-drop-scope:disabled{opacity:var(--opacity-disabled);cursor:default}.board-drop-scope:focus-visible{outline:none;box-shadow:var(--focus-ring)}.board-drop-scope-title{font-size:var(--type-title);line-height:var(--leading-sm);font-weight:var(--weight-semibold);color:var(--ink-1)}.board-drop-scope-desc{font-size:var(--type-md);line-height:var(--leading-sm);color:var(--ink-2)}.board-drop-agent{display:flex;align-items:flex-start;gap:var(--space-5);margin:var(--space-7) var(--space-7) 0;padding:var(--space-6);border:1px solid var(--success-line);border-radius:var(--radius-md);background:var(--success-wash);font-size:var(--type-lg);line-height:var(--leading-md);color:var(--ink-2)}.board-drop-agent-dot{flex:none;width:8px;height:8px;margin-top:var(--space-3);border-radius:var(--radius-full);background:var(--success)}.component-sheet{flex:1 1 0;min-height:0;display:flex;flex-direction:column}.component-sheet-body{flex:1 1 0;min-height:0;display:flex;flex-direction:column;overflow-y:auto;scrollbar-gutter:stable}.component-sheet-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--type-lg);line-height:var(--leading-xs);font-weight:var(--weight-semibold);color:var(--ink-1)}.component-sheet-author{min-width:0;margin-left:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-mono);font-size:var(--type-sm);line-height:var(--leading-xs);color:var(--ink-3)}.component-sheet-stage{position:relative;flex:none;height:200px;margin:var(--space-6) var(--space-6) 0;border-radius:var(--radius-tab);background:var(--surface-sunken);overflow:hidden}.component-sheet-loop{position:absolute;left:var(--space-5);bottom:var(--space-5);display:inline-flex;align-items:center;gap:var(--space-3);padding:var(--space-1) var(--space-4);border-radius:var(--radius-xs);background:var(--scrim-strong);font-family:var(--font-mono);font-size:var(--type-sm);line-height:var(--leading-xs);color:var(--on-accent);pointer-events:none}.component-sheet-loop-play{width:0;height:0;border-left:6px solid currentColor;border-top:4px solid transparent;border-bottom:4px solid transparent}.component-sheet-tweaks{flex:1 1 0;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-mono);font-size:var(--type-sm);line-height:var(--leading-xs);color:var(--ink-3)}.board-cursors{position:absolute;top:0;left:0;z-index:var(--z-float);overflow:hidden;pointer-events:none}.board-cursor{position:absolute;display:flex;align-items:flex-start;transition:left var(--dur-fast) linear,top var(--dur-fast) linear}.board-cursor>svg{flex:none}.board-cursor-tag{height:20px;margin-top:var(--space-6);margin-left:calc(-1 * var(--space-2));padding:0 var(--space-3);overflow:hidden;max-width:200px;font-family:var(--font-sans);font-size:var(--type-sm);font-weight:600;line-height:var(--leading-md);color:#0b0b0b;text-overflow:ellipsis;white-space:nowrap;border-radius:var(--radius-sm)}@media(prefers-reduced-motion:reduce){.board-cursor{transition:none}}}@layer component-sheets{.plan-panel{display:flex;flex-direction:column;min-width:0;min-height:0;height:100%;background:var(--surface-panel)}.plan-head-shot{margin-left:auto;font-size:var(--type-sm);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:var(--ink-3)}.plan-head-number{font-family:var(--font-numeric);font-variant-numeric:var(--numeric);font-size:var(--type-md);line-height:var(--leading-xs);color:var(--ink-3)}.plan-head-title{flex:1;min-width:0;margin:0;display:flex;font:inherit}.plan-head-name{min-width:0;max-width:100%;padding:0;overflow:hidden;text-align:left;text-overflow:ellipsis;white-space:nowrap;font-size:var(--type-lg);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:var(--ink-1);background:none;border:0;border-radius:var(--radius-xs);cursor:default}.plan-head-name:focus-visible{outline:none;box-shadow:var(--focus-ring)}.plan-rename{flex:1;min-width:0;display:flex}.plan-body{display:flex;flex-direction:column;flex:1;gap:var(--space-6);min-height:0;padding:var(--space-6);overflow-y:auto;scrollbar-gutter:stable}.plan-field{display:flex;flex-direction:column;gap:var(--space-3);min-width:0}.plan-field-head{display:flex;align-items:center;justify-content:space-between;gap:var(--space-4)}.plan-count{font-size:var(--type-sm);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:var(--ink-3)}.plan-count.is-numeric{font-family:var(--font-numeric);font-variant-numeric:var(--numeric);font-weight:var(--weight-regular)}.plan-beats{display:flex;flex-direction:column;gap:var(--space-1);margin:0;padding:0;list-style:none}.plan-beat{display:flex;align-items:center;gap:var(--space-3);min-height:var(--row-h)}.plan-beat[draggable=true]{cursor:grab}.plan-beat-number{display:inline-flex;align-items:center;justify-content:center;flex:none;width:var(--badge-h);height:var(--badge-h);border-radius:var(--radius-xs);background:var(--surface-secondary);font-family:var(--font-numeric);font-variant-numeric:var(--numeric);font-size:var(--type-sm);line-height:var(--leading-xs);color:var(--ink-2)}.plan-add-beat{display:inline-flex;align-items:center;align-self:flex-start;gap:var(--space-4);height:var(--row-h);padding:0;font-size:var(--type-md);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:var(--ink-2);background:none;border:none;border-radius:var(--radius-xs);cursor:pointer}.plan-add-beat:hover:not(:disabled){color:var(--ink-1)}.plan-add-beat-icon{display:inline-flex;align-items:center;justify-content:center;width:var(--badge-h);height:var(--badge-h);color:var(--ink-3)}.plan-add-beat-icon>svg{width:16px;height:16px}.plan-add-beat:disabled{opacity:var(--opacity-disabled);cursor:default}.plan-add-beat:focus-visible{outline:none;box-shadow:var(--focus-ring)}.plan-timing{display:flex;gap:var(--space-3)}.plan-length{flex:none;width:96px}.plan-cut{flex:1}.plan-cut-length{flex:none;font-family:var(--font-numeric);font-variant-numeric:var(--numeric);color:var(--ink-2)}.plan-cut-rows{display:flex;flex-direction:column;gap:var(--space-3);padding-top:var(--space-4);border-top:1px solid var(--line-soft)}.plan-swatch{display:inline-block;flex:none;width:10px;height:10px;margin-inline-end:var(--space-3);border-radius:var(--radius-2xs);vertical-align:middle}.plan-swatch.is-paper{background:var(--sketch-paper)}.plan-swatch.is-dark{background:var(--surface-app);box-shadow:inset 0 0 0 1px var(--line-strong)}.plan-swatch.is-brand{background:var(--accent)}.plan-pins{display:flex;flex-direction:column;gap:var(--space-1);margin:0;padding:0;list-style:none}.plan-pin{display:flex;align-items:center;gap:var(--space-4);min-height:var(--row-h);border-radius:var(--radius-sm)}.plan-pin[draggable=true]{cursor:grab}.plan-pin:hover{background:var(--fill-rest)}.plan-pin-thumb{display:inline-flex;align-items:center;justify-content:center;flex:none;width:var(--badge-h);height:var(--badge-h);overflow:hidden;border-radius:var(--radius-xs);background:var(--surface-secondary);font-size:var(--type-micro);line-height:var(--leading-xs);color:var(--ink-3)}.plan-pin-thumb>img{width:100%;height:100%;object-fit:cover}.plan-pin-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--type-md);line-height:var(--leading-xs);color:var(--ink-1)}.plan-pin-on{display:inline-flex;align-items:center;gap:var(--space-2);flex:none;font-size:var(--type-sm);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:var(--ink-2)}.plan-pin-on:before{content:"";width:6px;height:6px;border-radius:var(--radius-full);background:var(--success)}.plan-pin-kind{flex:none;width:64px;text-align:right;font-size:var(--type-sm);line-height:var(--leading-xs);color:var(--ink-3)}.plan-none{margin:0;font-size:var(--type-md);line-height:var(--leading-sm);color:var(--ink-3)}.plan-style{display:flex;flex-direction:column;gap:var(--space-3);padding-top:var(--space-6);border-top:1px solid var(--line-soft)}.plan-style-text{margin:0;min-width:0;font-size:var(--type-md);line-height:var(--leading-xs);color:var(--ink-2)}}@layer component-sheets{.shot-board{flex:1 1 0;display:flex;min-width:0;min-height:0;outline:none;pointer-events:auto;background:var(--surface-board)}.shot-board-main{flex:1 1 0;display:flex;flex-direction:column;min-width:0;min-height:0}.sketch-layers{flex:none;display:flex;flex-direction:column;width:224px;min-height:0;background:var(--surface-panel);border-right:1px solid var(--line)}.sketch-layers-head{justify-content:space-between}.sketch-count{font-family:var(--font-numeric);font-variant-numeric:var(--numeric);font-size:var(--type-sm);line-height:var(--leading-xs);color:var(--ink-3)}.sketch-layers-empty{margin:0;padding:var(--space-7);font-size:var(--type-md);line-height:var(--leading-sm);color:var(--ink-3)}.sketch-layer-list{flex:1 1 0;margin:0;padding:var(--space-3);list-style:none;overflow-y:auto}.sketch-layer{display:flex;align-items:center;gap:var(--space-4);height:var(--row-h);padding:0 var(--space-3);border-radius:var(--radius-sm);cursor:default;outline:none}.sketch-layer:hover{background:var(--fill-rest)}.sketch-layer:focus-visible{box-shadow:var(--focus-ring)}.sketch-layer[aria-selected=true]{background:var(--accent-quiet)}.sketch-layer-icon{flex:none;display:inline-flex;width:16px;height:16px;color:var(--ink-3)}.sketch-layer-icon svg{width:16px;height:16px}.sketch-layer[aria-selected=true] .sketch-layer-icon,.sketch-layer[aria-selected=true] .sketch-layer-name{color:var(--accent-ink)}.sketch-layer-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--type-md);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:var(--ink-1)}.sketch-layer-kind{flex:none;font-size:var(--type-sm);line-height:var(--leading-xs);color:var(--ink-3)}.sketch-bar{container:sketch-bar / inline-size;flex:none;display:flex;align-items:center;justify-content:space-between;gap:var(--space-4);height:var(--panel-head-h);padding:0 var(--space-4);background:var(--surface-panel);border-bottom:1px solid var(--line)}.sketch-bar-group{display:flex;align-items:center;gap:var(--space-4);min-width:0}.sketch-crumb{display:inline-flex;align-items:center;gap:var(--space-2);height:var(--control-h);padding:0 var(--space-4) 0 var(--space-2);font:inherit;font-size:var(--type-md);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:var(--ink-2);background:transparent;border:0;border-radius:var(--radius-tab);cursor:pointer}.sketch-crumb svg{width:16px;height:16px}.sketch-crumb:hover{background:var(--fill-rest);color:var(--ink-1)}.sketch-crumb:focus-visible{outline:none;box-shadow:var(--focus-ring)}.sketch-divider{flex:none;width:1px;height:16px;background:var(--line)}.sketch-bar-title{display:flex;align-items:center;gap:var(--space-4);min-width:0;padding:0 var(--space-2)}.sketch-bar-number{font-family:var(--font-numeric);font-variant-numeric:var(--numeric);font-size:var(--type-md);line-height:var(--leading-xs);color:var(--ink-3)}.sketch-bar-heading{display:flex;min-width:0;margin:0;font:inherit}.sketch-bar-name{margin:0;min-width:0;padding:0;overflow:hidden;text-align:left;text-overflow:ellipsis;white-space:nowrap;font-size:var(--type-lg);line-height:var(--leading-xs);font-weight:var(--weight-semibold);color:var(--ink-1);background:none;border:0;border-radius:var(--radius-xs);cursor:default}.sketch-bar-name:focus-visible{outline:none;box-shadow:var(--focus-ring)}.sketch-bar-nav,.sketch-zoom{display:flex;align-items:center;gap:var(--space-1)}.sketch-bar-playing{font-family:var(--font-numeric);font-variant-numeric:var(--numeric);font-size:var(--type-md);line-height:var(--leading-xs);color:var(--ink-2)}.sketch-bar .btn svg{width:16px;height:16px}.sketch-stop-square{width:9px;height:9px;border-radius:var(--radius-2xs);background:var(--accent-ink)}.sketch-stop-key{font-family:var(--font-numeric);font-size:var(--type-sm);line-height:var(--leading-xs);color:var(--accent-ink)}@container sketch-bar (width < 720px){.sketch-bar-word,.sketch-bar-playing,.sketch-stop-key{display:none}.sketch-crumb{padding:0 var(--space-2)}}.sketch-icon-button{display:inline-flex;align-items:center;justify-content:center;flex:none;width:var(--control-h);height:var(--control-h);padding:0;color:var(--ink-2);background:transparent;border:0;border-radius:var(--radius-xs);cursor:pointer}.sketch-icon-button svg{width:16px;height:16px}.sketch-icon-button:hover:not(:disabled){background:var(--fill-rest);color:var(--ink-1)}.sketch-icon-button:disabled{opacity:var(--opacity-disabled);cursor:default}.sketch-icon-button:focus-visible{outline:none;box-shadow:var(--focus-ring)}.sketch-desk{flex:1 1 0;display:flex;min-width:0;min-height:0;padding:var(--space-8);overflow:auto;background-color:var(--surface-board);background-image:radial-gradient(circle,var(--board-dot) 1px,transparent 1px);background-size:20px 20px}.sketch-desk-stack{flex:none;display:flex;flex-direction:column;gap:var(--space-8);margin:auto}.sketch-paper{position:relative;container-type:inline-size;flex:none;overflow:hidden;color:var(--sketch-ink);background:var(--sketch-paper);border-radius:var(--radius-2xs);box-shadow:var(--shadow-float);outline:none;touch-action:none;user-select:none}.sketch-paper[data-ground=dark]{color:var(--on-media);background:var(--surface-app)}.sketch-paper[data-ground=brand]{color:var(--on-accent);background:var(--accent)}.sketch-paper[data-tool=box],.sketch-paper[data-tool=text],.sketch-paper[data-tool=arrow]{cursor:crosshair}.sketch-item{position:absolute;box-sizing:border-box;outline:none}.sketch-item:focus-visible{box-shadow:var(--focus-ring)}.sketch-item.is-text{display:flex;align-items:flex-start;overflow:hidden;line-height:var(--leading-tight);font-weight:var(--weight-regular);white-space:pre-wrap;overflow-wrap:anywhere}.sketch-item.is-text.is-title{font-weight:var(--weight-semibold);letter-spacing:var(--tracking-display-md)}.sketch-item.is-title .sketch-text-editor{letter-spacing:var(--tracking-display-md)}.sketch-item.is-text[data-align=center]{justify-content:center;text-align:center}.sketch-item.is-text[data-align=end]{justify-content:flex-end;text-align:right}.sketch-text-editor{width:100%;height:100%;padding:0;resize:none;font:inherit;line-height:inherit;text-align:inherit;color:inherit;background:var(--fill-rest);border:0;outline:1px solid var(--accent)}.sketch-item.is-box{border-radius:var(--radius-xs);background:color-mix(in srgb,var(--sketch-paper) 80%,var(--sketch-line));border:1px solid var(--sketch-line)}.sketch-item.is-box[data-tone=dark]{background:color-mix(in srgb,var(--sketch-ink) 48%,black);border-color:transparent}.sketch-item.is-box[data-tone=accent]{background:var(--accent);border-color:transparent}.sketch-item-label{position:absolute;top:var(--space-4);left:var(--space-5);max-width:calc(100% - 2 * var(--space-5));overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:var(--leading-tight);font-weight:var(--weight-medium);color:var(--sketch-ink)}.sketch-item.is-box[data-tone=dark] .sketch-item-label{color:var(--sketch-line)}.sketch-item.is-box[data-tone=accent] .sketch-item-label{color:var(--on-accent)}.sketch-item-label.is-arrow{top:auto;left:auto;max-width:none;translate:-50% -50%;pointer-events:none}.sketch-item.is-image,.sketch-item.is-component,.sketch-item.is-missing{border-radius:var(--radius-2xs)}.sketch-item.is-image>img,.sketch-item-media,.sketch-item-poster{display:block;width:100%;height:100%;border-radius:var(--radius-2xs);box-shadow:0 0 0 1px var(--sketch-line);pointer-events:none}.sketch-item-media,.sketch-item-poster{object-fit:cover}.sketch-item.is-missing{background:color-mix(in srgb,var(--sketch-paper) 80%,var(--sketch-line));border:1px dashed var(--sketch-ink)}.sketch-item-tile{display:grid;place-items:center;width:100%;height:100%;overflow:hidden;font-size:var(--type-md);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:var(--on-media);background:var(--surface-secondary);border-radius:var(--radius-xs)}.sketch-item-caption,.sketch-item-tag{position:absolute;top:calc(100% + var(--space-3));left:0;display:inline-flex;align-items:center;gap:var(--space-2);max-width:100%;overflow:hidden;white-space:nowrap;font-family:var(--font-numeric);font-size:var(--type-micro);line-height:var(--leading-xs);color:var(--sketch-ink);pointer-events:none}.sketch-item-caption svg,.sketch-item-tag svg{flex:none;width:12px;height:12px}.sketch-item-tag{height:16px;padding:0 var(--space-2);background:var(--sketch-paper);border:1px solid var(--sketch-line);border-radius:var(--radius-2xs)}.sketch-item.is-arrow{inset:0;width:100%;height:100%;overflow:visible;pointer-events:none}.sketch-arrow-line{fill:none;stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;vector-effect:non-scaling-stroke}.sketch-arrow-hit{fill:none;stroke:transparent;stroke-width:12px;vector-effect:non-scaling-stroke;pointer-events:stroke;outline:none}.sketch-item.is-arrow[data-selected] .sketch-arrow-line{stroke:var(--accent)}.sketch-selection,.sketch-handles{position:absolute;box-sizing:border-box;pointer-events:none}.sketch-selection{border:1px solid var(--accent)}.sketch-handle{position:absolute;width:8px;height:8px;box-sizing:border-box;translate:-50% -50%;background:var(--on-accent);border:1px solid var(--accent);pointer-events:auto}.sketch-handle.is-nw{left:0;top:0;cursor:nwse-resize}.sketch-handle.is-ne{left:100%;top:0;cursor:nesw-resize}.sketch-handle.is-se{left:100%;top:100%;cursor:nwse-resize}.sketch-handle.is-sw{left:0;top:100%;cursor:nesw-resize}.sketch-handle.is-n{left:50%;top:0;cursor:ns-resize}.sketch-handle.is-e{left:100%;top:50%;cursor:ew-resize}.sketch-handle.is-s{left:50%;top:100%;cursor:ns-resize}.sketch-handle.is-w{left:0;top:50%;cursor:ew-resize}.sketch-handle.is-end{border-radius:var(--radius-full);cursor:move}.sketch-guide{position:absolute;background:var(--guide);pointer-events:none}.sketch-guide.is-x{top:0;bottom:0;width:1px}.sketch-guide.is-y{left:0;right:0;height:1px}.sketch-marquee,.sketch-draft{position:absolute;box-sizing:border-box;pointer-events:none}.sketch-marquee{background:var(--accent-quiet);border:1px solid var(--accent)}.sketch-draft{border:1px dashed var(--accent)}.sketch-draft.is-arrow{inset:0;width:100%;height:100%;border:0}.sketch-draft.is-arrow path{stroke:var(--accent);stroke-width:2px;vector-effect:non-scaling-stroke}.sketch-drop{position:absolute;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-3);width:240px;height:140px;translate:-50% -50%;color:var(--accent);background:var(--accent-quiet);border:1.5px dashed var(--accent);border-radius:var(--radius-xs);pointer-events:none}.sketch-drop>svg{width:16px;height:16px}.sketch-drop-chip{padding:0 var(--space-3);font-size:var(--type-sm);line-height:var(--leading-md);font-weight:var(--weight-medium);white-space:nowrap;color:var(--on-accent);background:var(--accent);border-radius:var(--radius-xs)}.sketch-empty{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-8);pointer-events:none}.sketch-empty-copy{display:flex;flex-direction:column;align-items:center;gap:var(--space-3);text-align:center}.sketch-empty-title{margin:0;font-size:var(--type-xl);line-height:var(--leading-md);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-body);color:var(--sketch-ink)}.sketch-empty-lead{margin:0;font-size:var(--type-lg);line-height:var(--leading-sm);color:color-mix(in srgb,var(--sketch-ink) 80%,transparent)}.sketch-empty-starts{display:flex;gap:var(--space-6);padding-top:var(--space-2)}.sketch-start{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-5);width:148px;height:88px;font:inherit;color:var(--sketch-ink);background:var(--sketch-paper);border:1px solid var(--sketch-line);border-radius:var(--radius-tab);cursor:pointer;pointer-events:auto}.sketch-start:hover:not(:disabled){border-color:var(--sketch-ink)}.sketch-start:focus-visible{outline:none;box-shadow:var(--focus-ring)}.sketch-start:disabled{opacity:var(--opacity-disabled);cursor:default}.sketch-start-icon svg{width:20px;height:20px}.sketch-start-label{display:inline-flex;align-items:center;gap:var(--space-3);font-size:var(--type-md);line-height:var(--leading-xs);font-weight:var(--weight-medium)}.sketch-start-key{padding:0 var(--space-2);font-family:var(--font-numeric);font-size:var(--type-micro);line-height:var(--leading-xs);border:1px solid var(--sketch-line);border-radius:var(--radius-xs)}.sketch-play-stage{position:absolute;inset:0}.sketch-play-overlay{position:absolute;inset:0;opacity:.5;pointer-events:none}.sketch-play-box{position:absolute;box-sizing:border-box;outline:1.5px dashed var(--sketch-ink);outline-offset:var(--space-2);border-radius:var(--radius-sm)}.sketch-play-chip{position:absolute;top:calc(-1 * var(--space-5));left:var(--space-5);padding:0 var(--space-3);font-size:var(--type-sm);line-height:var(--leading-md);font-weight:var(--weight-medium);white-space:nowrap;color:var(--sketch-ink);background:var(--sketch-paper);border-radius:var(--radius-xs)}.sketch-play-progress{position:absolute;left:0;right:0;bottom:0;height:3px;background:color-mix(in srgb,var(--sketch-ink) 12%,transparent)}.sketch-play-progress>span{display:block;height:100%;background:var(--accent)}.sketch-play-time{position:absolute;left:var(--space-6);bottom:var(--space-6);display:inline-flex;align-items:center;gap:var(--space-3);height:24px;padding:0 var(--space-4);font-family:var(--font-numeric);font-variant-numeric:var(--numeric);font-size:var(--type-md);line-height:var(--leading-xs);color:var(--ink-1);background:var(--surface-secondary);border:1px solid var(--line);border-radius:var(--radius-sm)}.sketch-play-total{font-size:var(--type-sm);color:var(--ink-3)}.sketch-play-dot,.sketch-live-dot,.sketch-stage-dot{flex:none;width:6px;height:6px;border-radius:var(--radius-full);background:var(--success)}.sketch-live-dot{box-shadow:0 0 0 3px var(--success-line)}.sketch-desk-strip[inert],.sketch-footer-cell[inert]{opacity:var(--opacity-disabled)}.sketch-strip{display:flex;align-items:flex-start;gap:var(--space-6)}.sketch-thumb-cell{display:flex;flex-direction:column;gap:var(--space-3);width:128px}.sketch-thumb{display:block;width:128px;padding:0;overflow:hidden;background:var(--sketch-paper);border:1px solid var(--line-strong);border-radius:var(--radius-xs);cursor:pointer}.sketch-thumb[aria-pressed=true]{border:2px solid var(--accent);box-shadow:var(--focus-ring)}.sketch-thumb:focus-visible{outline:none;box-shadow:var(--focus-ring)}.sketch-thumb-label{display:flex;align-items:center;gap:var(--space-3);min-height:var(--leading-xs);padding-top:var(--space-1)}.sketch-thumb-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--type-md);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:var(--ink-2)}.sketch-thumb-name.is-current{color:var(--accent-ink)}.sketch-thumb-time{flex:none;font-family:var(--font-numeric);font-variant-numeric:var(--numeric);font-size:var(--type-sm);line-height:var(--leading-xs);color:var(--ink-3)}.sketch-add{display:flex;align-items:center;justify-content:center;gap:var(--space-3);flex:none;width:128px;aspect-ratio:16 / 9;font:inherit;font-size:var(--type-md);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:var(--ink-2);background:transparent;border:1px dashed var(--line-strong);border-radius:var(--radius-xs);cursor:pointer}.sketch-add:hover:not(:disabled){background:var(--fill-rest);color:var(--ink-1)}.sketch-add:disabled{opacity:var(--opacity-disabled);cursor:default}.sketch-add-icon svg{width:16px;height:16px;color:var(--ink-3)}.sketch-footer{container:sketch-footer / inline-size;flex:none;display:flex;align-items:center;justify-content:space-between;gap:var(--space-7);height:var(--tool-footer-h);padding:0 var(--space-5);background:var(--surface-panel);border-top:1px solid var(--line)}.sketch-tools{display:flex;align-items:center;gap:var(--space-1);min-width:0;overflow:hidden}.sketch-tool{display:inline-flex;align-items:center;gap:var(--space-3);flex:none;height:var(--control-h);padding:0 var(--space-4);font:inherit;font-size:var(--type-md);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:var(--ink-2);background:transparent;border:0;border-radius:var(--radius-xs);cursor:pointer;transition:background var(--dur-fast) var(--ease),color var(--dur-fast) var(--ease)}.sketch-tool:hover:not(:disabled){background:var(--fill-rest);color:var(--ink-1)}.sketch-tool:disabled{opacity:var(--opacity-disabled);cursor:default}.sketch-tool:focus-visible{outline:none;box-shadow:var(--focus-ring)}.sketch-tool.is-armed{background:var(--accent-soft);color:var(--accent-ink)}.sketch-tool-icon{display:inline-flex}.sketch-tool-icon svg{width:16px;height:16px}.sketch-tool-key{font-family:var(--font-numeric);font-size:var(--type-micro);line-height:var(--leading-xs);color:var(--ink-3)}.sketch-tool.is-armed .sketch-tool-key{color:color-mix(in srgb,var(--accent-ink) 70%,transparent)}@container sketch-footer (width < 720px){.sketch-tool-label,.sketch-tool-key{display:none}.sketch-tool{padding:0 var(--space-3)}}.sketch-zoom-value{width:52px;text-align:center;font-family:var(--font-numeric);font-variant-numeric:var(--numeric);font-size:var(--type-md);line-height:var(--leading-xs);color:var(--ink-1)}.sketch-fit{height:var(--control-h);padding:0 var(--space-5);font:inherit;font-size:var(--type-md);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:var(--ink-2);background:transparent;border:0;border-radius:var(--radius-xs);cursor:pointer}.sketch-fit:hover{background:var(--fill-rest);color:var(--ink-1)}.sketch-fit:focus-visible{outline:none;box-shadow:var(--focus-ring)}.sketch-picker{width:360px;box-shadow:var(--shadow-float)}.sketch-picker-body{display:flex;flex-direction:column;gap:var(--space-5);padding:var(--space-6)}.sketch-picker-head{display:flex;align-items:center;justify-content:space-between;height:20px}.sketch-picker-title{margin:0;font-size:var(--type-lg);line-height:var(--leading-xs);font-weight:var(--weight-semibold);color:var(--ink-1)}.sketch-picker-search{display:flex;align-items:center;gap:var(--space-4);height:var(--control-h);padding:0 var(--space-4);color:var(--ink-3);background:var(--fill-rest);border:1px solid var(--line-strong);border-radius:var(--field-radius)}.sketch-picker-search:focus-within{border-color:var(--accent)}.sketch-picker-search svg{flex:none;width:16px;height:16px}.sketch-picker-search input{flex:1;min-width:0;padding:0;font:inherit;font-size:var(--type-md);line-height:var(--leading-xs);color:var(--ink-1);background:transparent;border:0;outline:none}.sketch-picker-count{font-family:var(--font-numeric);font-size:var(--type-sm);color:var(--ink-3)}.sketch-picker-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--space-4);max-height:240px;overflow-y:auto}.sketch-picker-tile{display:block;aspect-ratio:106 / 55;padding:0;overflow:hidden;background:var(--surface-secondary);border:0;border-radius:var(--radius-sm);cursor:pointer}.sketch-picker-tile:hover{box-shadow:0 0 0 1px var(--line-strong)}.sketch-picker-tile:focus-visible{outline:none;box-shadow:var(--focus-ring)}.sketch-picker-tile>img,.sketch-picker-media{display:block;width:100%;height:100%;object-fit:cover}.sketch-picker-none{margin:0;font-size:var(--type-md);line-height:var(--leading-sm);color:var(--ink-3)}.sketch-picker-foot{display:flex;align-items:center;gap:var(--space-5);padding-top:var(--space-5);border-top:1px solid var(--line)}.sketch-picker-foot.is-split{justify-content:space-between}.sketch-picker-foot .btn svg{width:16px;height:16px}.sketch-picker-hint{font-size:var(--type-sm);line-height:var(--leading-xs);color:var(--ink-3)}.sketch-picker-browse{display:inline-flex;align-items:center;gap:var(--space-2)}.sketch-picker-browse svg{width:16px;height:16px}.sketch-picker-sections{display:flex;flex-direction:column;gap:var(--space-5);max-height:360px;overflow-y:auto}.sketch-picker-section{display:flex;flex-direction:column;gap:var(--space-1)}.sketch-picker-section-head{display:flex;align-items:center;justify-content:space-between;height:20px}.sketch-picker-group{margin:var(--space-3) 0 var(--space-1);padding:0 var(--space-3);font-size:var(--type-sm);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:var(--ink-3)}.sketch-picker-rows{margin:0;padding:0;list-style:none}.sketch-picker-row-main{display:flex;align-items:center;gap:var(--space-5);width:100%;height:var(--button-h);padding:0 var(--space-3);font:inherit;text-align:left;background:transparent;border:0;border-radius:var(--radius-sm);cursor:pointer}.sketch-picker-row-main:hover:not(:disabled,[aria-disabled=true]){background:var(--fill-rest)}.sketch-picker-row-main:focus-visible{outline:none;box-shadow:var(--focus-ring)}.sketch-picker-row-main:disabled,.sketch-picker-row-main[aria-disabled=true]{opacity:var(--opacity-disabled);cursor:default}.sketch-picker-thumb{flex:none;display:grid;place-items:center;width:40px;height:24px;overflow:hidden;color:var(--ink-3);background:var(--surface-secondary);border-radius:var(--radius-xs)}.sketch-picker-thumb svg{width:16px;height:16px}.sketch-picker-thumb img{width:100%;height:100%;object-fit:cover}.sketch-picker-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--type-md);line-height:var(--leading-xs);font-weight:var(--weight-medium);color:var(--ink-1)}.sketch-picker-where{flex:none;max-width:96px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--type-sm);line-height:var(--leading-xs);color:var(--ink-3)}.sketch-picker-kind{display:flex;justify-content:flex-end;width:48px}.sketch-picker-add{display:grid;place-items:center;width:var(--control-h);height:var(--control-h);color:var(--ink-2)}.sketch-picker-add svg{width:16px;height:16px}.sketch-inspector{display:flex;flex-direction:column;min-width:0;min-height:0;height:100%;background:var(--surface-panel)}.sketch-inspector-icon{display:inline-flex;color:var(--ink-2)}.sketch-inspector-icon svg{width:16px;height:16px}.sketch-inspector-title{flex:1;min-width:0;margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--type-lg);line-height:var(--leading-xs);font-weight:var(--weight-semibold);color:var(--ink-1)}.sketch-inspector-playing{flex:none;display:flex;align-items:center;gap:var(--space-4);height:var(--panel-head-h);padding:0 var(--space-7);background:var(--success-wash);border-bottom:1px solid var(--line)}.sketch-inspector-playing-word{flex:1;font-size:var(--type-sm);line-height:var(--leading-xs);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-caps);text-transform:uppercase;color:var(--success)}.sketch-inspector-meta{font-family:var(--font-numeric);font-size:var(--type-sm);line-height:var(--leading-xs);color:var(--ink-3)}.sketch-inspector-body{flex:1 1 0;display:flex;flex-direction:column;min-height:0;overflow-y:auto;scrollbar-gutter:stable}.sketch-preview{width:100%;max-height:200px;overflow:hidden;background:var(--sketch-paper);border:1px solid var(--line);border-radius:var(--radius-sm)}.sketch-preview>img{display:block;width:100%;height:100%}.sketch-door svg{width:16px;height:16px;color:var(--ink-2)}.sketch-align{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--space-3)}.sketch-stage-list{display:flex;flex-direction:column;margin:0;padding:0;list-style:none}.sketch-stage-row{display:flex;align-items:center;gap:var(--space-4);height:var(--row-h)}.sketch-stage-row .sketch-stage-dot{background:var(--line-strong)}.sketch-stage-row.is-moving .sketch-stage-dot{background:var(--success)}.sketch-stage-name{flex:1;min-width:0;font-size:var(--type-md);line-height:var(--leading-xs);color:var(--ink-2)}.sketch-stage-row.is-moving .sketch-stage-name{color:var(--ink-1)}}