@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.
- package/dist/.vite/manifest.json +382 -0
- package/dist/assets/AgentPanel-CQejLbiX.js +2 -0
- package/dist/assets/AgentPanel-DJEphah0.css +1 -0
- package/dist/assets/AgentQuestionDialog-BqkD0kXF.js +1 -0
- package/dist/assets/CodeStudio-Dv4ihHpz.js +23 -0
- package/dist/assets/CommentsPanel-B4yhhT1T.js +1 -0
- package/dist/assets/ComponentLibraryRail-Ch_dsAru.js +1 -0
- package/dist/assets/ComponentStage-BRhRotyH.js +1 -0
- package/dist/assets/CurvePane-BjFVabKX.css +1 -0
- package/dist/assets/CurvePane-R22WzllJ.js +1 -0
- package/dist/assets/ExportDialog-CWLQWTmG.js +2 -0
- package/dist/assets/FontPicker-DWKaYL7F.js +1 -0
- package/dist/assets/FontPicker-v0IOIArM.css +1 -0
- package/dist/assets/GenerateDrawer-Bh3SqDKt.js +2 -0
- package/dist/assets/InsertDrawer-Ce1fod1L.js +1 -0
- package/dist/assets/LibraryBrowser-D9sEGz5w.js +2 -0
- package/dist/assets/MakeItYoursSection-CMO4319_.js +2 -0
- package/dist/assets/MaterialGraphCanvas-BFzl4wWR.js +23 -0
- package/dist/assets/MaterialGraphCanvas-BIUD59ik.css +1 -0
- package/dist/assets/MaterialWorkspace-CqTWqaRA.js +14 -0
- package/dist/assets/PreferencesDialog-CBf9_OoD.js +1 -0
- package/dist/assets/PresetsSection-CUEaoCVU.js +1 -0
- package/dist/assets/SoundHistory-BeS8EW1h.js +1 -0
- package/dist/assets/SoundMode-BmcZru3i.js +3 -0
- package/dist/assets/StockSounds-DdAUGRYK.js +1 -0
- package/dist/assets/TemplateFieldSection-CaeXpLFo.js +1 -0
- package/dist/assets/VersionHistoryPanel-CxG6XhNP.js +1 -0
- package/dist/assets/board-B88EPuLO.css +1 -0
- package/dist/assets/board-CL-he7SL.js +3 -0
- package/dist/assets/components-0oOSPN0l.js +1 -0
- package/dist/assets/googleFontRanges-gp32wJMo.js +1 -0
- package/dist/assets/googleFonts-BNon6M7X.js +1 -0
- package/dist/assets/iconsAndAliases-DL7gXP5j.js +1863 -0
- package/dist/assets/index-4F5NQmI8.css +1 -0
- package/dist/assets/index-BGHQGV5z.js +117 -0
- package/dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/dist/assets/libraryModel-CpIwfFha.js +1 -0
- package/dist/assets/lucide-6iK64tTB.js +9319 -0
- package/dist/assets/motionStamp-CH-Hew4E.js +1 -0
- package/dist/assets/takeMeasure-Tdg0TxEi.js +1 -0
- package/dist/assets/webmcp-BsB9gxWC.js +2 -0
- package/dist/index.html +34 -3
- package/package.json +12 -9
- package/src/addFamilies.ts +66 -0
- package/src/api.ts +1631 -55
- package/src/app/App.tsx +977 -198
- package/src/app/lazyPanel.tsx +137 -0
- package/src/app/lazySurfaces.tsx +203 -0
- package/src/audio/index.tsx +41 -10
- package/src/audio/meter.ts +485 -0
- package/src/audio/meterMath.ts +273 -0
- package/src/audio/meterStore.ts +155 -0
- package/src/audio/offlineMix.ts +289 -0
- package/src/audio/preview.ts +928 -118
- package/src/bridge.ts +15 -5
- package/src/bridgeTypes.ts +1611 -36
- package/src/channels.ts +17 -32
- package/src/fonts/googleFonts.ts +4 -0
- package/src/hostApi.ts +174 -0
- package/src/icons.tsx +770 -0
- package/src/layerWords.ts +61 -0
- package/src/main.tsx +56 -4
- package/src/panels/ResizeHandle.tsx +33 -43
- package/src/panels/agent/AgentDots.tsx +36 -0
- package/src/panels/agent/AgentPanel.tsx +119 -43
- package/src/panels/agent/AgentQuestionDialog.tsx +202 -0
- package/src/panels/agent/agent.css +113 -97
- package/src/panels/agent/agentGate.ts +35 -0
- package/src/panels/code/CodeDefaultsPanel.tsx +345 -0
- package/src/panels/code/CodeStudio.tsx +373 -0
- package/src/panels/code/FileTree.tsx +265 -0
- package/src/panels/code/codeBufferGuard.ts +52 -0
- package/src/panels/code/codeParts.tsx +321 -0
- package/src/panels/comments/CommentComposer.tsx +239 -0
- package/src/panels/comments/CommentThread.tsx +346 -0
- package/src/panels/comments/CommentsPanel.tsx +336 -0
- package/src/panels/comments/InboxButton.tsx +131 -0
- package/src/panels/comments/MentionMenu.tsx +98 -0
- package/src/panels/comments/parts.tsx +171 -0
- package/src/panels/export/ExportDialog.tsx +919 -96
- package/src/panels/export/ExportScrim.tsx +57 -0
- package/src/panels/files/AssetsTab.tsx +656 -0
- package/src/panels/files/FilePanel.tsx +1466 -216
- package/src/panels/files/LayerMarks.tsx +40 -0
- package/src/panels/files/LeftColumn.tsx +37 -0
- package/src/panels/files/McpSection.tsx +690 -47
- package/src/panels/files/MissingAssetsNotice.tsx +60 -0
- package/src/panels/files/assetDrag.ts +79 -0
- package/src/panels/files/resourceParts.tsx +255 -0
- package/src/panels/fonts/FontPicker.tsx +762 -0
- package/src/panels/fonts/faceCache.ts +207 -0
- package/src/panels/fonts/fontPicker.css +271 -0
- package/src/panels/fonts/pickerModel.ts +265 -0
- package/src/panels/fonts/pickerRequest.ts +46 -0
- package/src/panels/header/AccountAvatar.tsx +76 -0
- package/src/panels/header/AgentChip.tsx +77 -0
- package/src/panels/header/AppMenu.tsx +213 -0
- package/src/panels/header/Header.tsx +564 -84
- package/src/panels/header/HistoryControls.tsx +31 -5
- package/src/panels/header/PresenceStack.tsx +329 -0
- package/src/panels/header/ProjectTitle.tsx +232 -0
- package/src/panels/header/ShareButton.tsx +59 -0
- package/src/panels/header/StatusBadges.tsx +358 -27
- package/src/panels/header/SyncDeletedDialog.tsx +88 -0
- package/src/panels/header/ZoomControls.tsx +46 -15
- package/src/panels/header/agentHandoff.ts +52 -0
- package/src/panels/header/leave.ts +26 -0
- package/src/panels/help/HelpSection.tsx +189 -163
- package/src/panels/insert/InsertDrawer.tsx +723 -0
- package/src/panels/insert/iconSet.ts +109 -0
- package/src/panels/inspector/ExposeDot.tsx +117 -0
- package/src/panels/inspector/FramingRows.tsx +314 -44
- package/src/panels/inspector/InspectorFooter.tsx +91 -0
- package/src/panels/inspector/InspectorHead.tsx +425 -0
- package/src/panels/inspector/InspectorPanel.tsx +408 -124
- package/src/panels/inspector/KeyframeDot.tsx +373 -0
- package/src/panels/inspector/KeyframeSection.tsx +257 -0
- package/src/panels/inspector/MarkerSection.tsx +55 -11
- package/src/panels/inspector/ParamRow.tsx +84 -53
- package/src/panels/inspector/RightColumn.tsx +152 -0
- package/src/panels/inspector/TimeSection.tsx +866 -0
- package/src/panels/inspector/animate/EaseControl.tsx +244 -0
- package/src/panels/inspector/animate/PresetsSection.tsx +135 -0
- package/src/panels/inspector/animate/ShotSection.tsx +562 -48
- package/src/panels/inspector/design/AlignRow.tsx +95 -31
- package/src/panels/inspector/design/AppearanceSection.tsx +118 -9
- package/src/panels/inspector/design/ClonerSection.tsx +323 -62
- package/src/panels/inspector/design/ComponentSection.tsx +50 -43
- package/src/panels/inspector/design/CornerSection.tsx +45 -14
- package/src/panels/inspector/design/DefinitionProps.tsx +315 -0
- package/src/panels/inspector/design/DefinitionSection.tsx +136 -0
- package/src/panels/inspector/design/DeviceSection.tsx +210 -0
- package/src/panels/inspector/design/FillSection.tsx +83 -51
- package/src/panels/inspector/design/FontField.tsx +196 -0
- package/src/panels/inspector/design/HtmlSection.tsx +23 -12
- package/src/panels/inspector/design/InstanceSection.tsx +373 -154
- package/src/panels/inspector/design/MaskSection.tsx +84 -0
- package/src/panels/inspector/design/MaterialSection.tsx +177 -0
- package/src/panels/inspector/design/MediaSection.tsx +273 -120
- package/src/panels/inspector/design/MeshSection.tsx +910 -82
- package/src/panels/inspector/design/PaintRows.tsx +550 -0
- package/src/panels/inspector/design/PlateStyleSection.tsx +177 -0
- package/src/panels/inspector/design/ShadowSection.tsx +221 -48
- package/src/panels/inspector/design/SplineFollowSection.tsx +235 -0
- package/src/panels/inspector/design/StrokeSection.tsx +228 -43
- package/src/panels/inspector/design/TemplateFieldSection.tsx +57 -0
- package/src/panels/inspector/design/TransformSection.tsx +244 -50
- package/src/panels/inspector/design/TypographySection.tsx +679 -110
- package/src/panels/inspector/layout.ts +295 -0
- package/src/panels/inspector/propValue.ts +199 -0
- package/src/panels/inspector/scene/CameraSection.tsx +232 -22
- package/src/panels/inspector/scene/EffectsSection.tsx +722 -71
- package/src/panels/inspector/scene/MakeItYoursSection.tsx +180 -0
- package/src/panels/inspector/scene/SceneDocSection.tsx +191 -0
- package/src/panels/inspector/scene/SceneSection.tsx +219 -44
- package/src/panels/inspector/scene/TransitionSection.tsx +523 -72
- package/src/panels/inspector/storyboard/StoryboardReferenceSection.tsx +593 -0
- package/src/panels/inspector/storyboard/VideoStill.tsx +120 -0
- package/src/panels/inspector/timeModel.ts +190 -0
- package/src/panels/inspector/useDocWrite.ts +438 -146
- package/src/panels/library/LibraryBrowser.tsx +435 -0
- package/src/panels/library/LibraryGrid.tsx +190 -0
- package/src/panels/library/LibraryPreviewPanel.tsx +349 -0
- package/src/panels/library/LibraryRail.tsx +84 -0
- package/src/panels/library/LibrarySoundPanel.tsx +293 -0
- package/src/panels/library/SoundHistory.tsx +245 -0
- package/src/panels/library/StockSounds.tsx +390 -0
- package/src/panels/library/libraryModel.ts +147 -0
- package/src/panels/library/stockSearch.ts +77 -0
- package/src/panels/maskMarks.tsx +117 -0
- package/src/panels/material/MaterialCommentNode.tsx +54 -0
- package/src/panels/material/MaterialGraphCanvas.tsx +861 -0
- package/src/panels/material/MaterialGraphMenu.tsx +45 -0
- package/src/panels/material/MaterialGroupNode.tsx +56 -0
- package/src/panels/material/MaterialLibrary.tsx +253 -0
- package/src/panels/material/MaterialNode.tsx +453 -0
- package/src/panels/material/MaterialNodePalette.tsx +349 -0
- package/src/panels/material/MaterialParameterControls.tsx +525 -0
- package/src/panels/material/MaterialRerouteNode.tsx +42 -0
- package/src/panels/material/MaterialWorkspace.tsx +501 -0
- package/src/panels/material/NodePreview.tsx +70 -0
- package/src/panels/material/flowModel.ts +441 -0
- package/src/panels/material/parameterValues.ts +231 -0
- package/src/panels/material/previewScheduler.ts +235 -0
- package/src/panels/material/reactFlow.css +6 -0
- package/src/panels/material/socketGlyph.ts +85 -0
- package/src/panels/material/viewportMemory.ts +58 -0
- package/src/panels/preferences/PreferencesDialog.tsx +215 -0
- package/src/panels/share/ShareComponentDialog.tsx +247 -0
- package/src/panels/stage/StageMenu.tsx +35 -5
- package/src/panels/stage/StagePanel.tsx +338 -23
- package/src/panels/stage/cellSlots.tsx +70 -0
- package/src/panels/storyboard/BoardCanvas.tsx +739 -0
- package/src/panels/storyboard/BoardCursors.tsx +158 -0
- package/src/panels/storyboard/BoardDropDialog.tsx +161 -0
- package/src/panels/storyboard/BoardPlan.tsx +42 -0
- package/src/panels/storyboard/ComponentSheet.tsx +187 -0
- package/src/panels/storyboard/ComponentStage.tsx +235 -0
- package/src/panels/storyboard/MiniSketch.tsx +173 -0
- package/src/panels/storyboard/PartPicker.tsx +64 -0
- package/src/panels/storyboard/PlanPanel.tsx +617 -0
- package/src/panels/storyboard/ReferencePreview.tsx +217 -0
- package/src/panels/storyboard/ShotBrief.tsx +360 -0
- package/src/panels/storyboard/ShotCard.tsx +251 -0
- package/src/panels/storyboard/StagePreview.tsx +348 -0
- package/src/panels/storyboard/StillThumbs.tsx +162 -0
- package/src/panels/storyboard/StoryboardView.tsx +79 -0
- package/src/panels/storyboard/board.css +1065 -0
- package/src/panels/storyboard/board.ts +12 -0
- package/src/panels/storyboard/boardClipboard.ts +111 -0
- package/src/panels/storyboard/boardOrder.ts +68 -0
- package/src/panels/storyboard/boardRows.tsx +425 -0
- package/src/panels/storyboard/liveCap.ts +90 -0
- package/src/panels/storyboard/plan.css +295 -0
- package/src/panels/storyboard/posterCache.ts +133 -0
- package/src/panels/storyboard/shotboard/ComponentPicker.tsx +373 -0
- package/src/panels/storyboard/shotboard/ImagePicker.tsx +145 -0
- package/src/panels/storyboard/shotboard/ShotBoard.tsx +292 -0
- package/src/panels/storyboard/shotboard/SketchCanvas.tsx +443 -0
- package/src/panels/storyboard/shotboard/SketchInspector.tsx +471 -0
- package/src/panels/storyboard/shotboard/SketchItem.tsx +240 -0
- package/src/panels/storyboard/shotboard/SketchLayers.tsx +130 -0
- package/src/panels/storyboard/shotboard/SketchPlay.tsx +108 -0
- package/src/panels/storyboard/shotboard/SketchStrip.tsx +178 -0
- package/src/panels/storyboard/shotboard/SketchToolFooter.tsx +99 -0
- package/src/panels/storyboard/shotboard/sketch.css +1392 -0
- package/src/panels/storyboard/shotboard/sketchModel.ts +219 -0
- package/src/panels/storyboard/storyboardDrop.ts +164 -0
- package/src/panels/studio/ComponentLibraryRail.tsx +346 -0
- package/src/panels/studio/ComponentSidePanel.tsx +355 -0
- package/src/panels/studio/ComponentStudio.tsx +243 -0
- package/src/panels/studio/ComponentsHome.tsx +318 -0
- package/src/panels/studio/ComponentsPreview.tsx +179 -0
- package/src/panels/studio/EveryUse.tsx +244 -0
- package/src/panels/studio/ThisUsePanel.tsx +679 -0
- package/src/panels/studio/componentParts.tsx +341 -0
- package/src/panels/studio/components.ts +6 -0
- package/src/panels/studio/newCodeComponent.ts +66 -0
- package/src/panels/timeline/AudioFxButton.tsx +290 -0
- package/src/panels/timeline/AudioLane.tsx +674 -85
- package/src/panels/timeline/BlockRow.tsx +154 -85
- package/src/panels/timeline/ChannelRow.tsx +378 -129
- package/src/panels/timeline/CurvePane.tsx +508 -0
- package/src/panels/timeline/Filmstrip.tsx +361 -0
- package/src/panels/timeline/GenerateDrawer.tsx +407 -0
- package/src/panels/timeline/KeyStretch.tsx +115 -0
- package/src/panels/timeline/LifespanRow.tsx +730 -47
- package/src/panels/timeline/MarkerLane.tsx +46 -8
- package/src/panels/timeline/PlayButton.tsx +91 -0
- package/src/panels/timeline/PropertyPicker.tsx +254 -0
- package/src/panels/timeline/ShotRow.tsx +400 -0
- package/src/panels/timeline/SoundMode.tsx +1406 -0
- package/src/panels/timeline/TimelineDock.tsx +2338 -272
- package/src/panels/timeline/TransportVolume.tsx +163 -0
- package/src/panels/timeline/beatRuler.ts +74 -0
- package/src/panels/timeline/curveModel.ts +500 -0
- package/src/panels/timeline/duckUnderVoice.ts +68 -0
- package/src/panels/timeline/keyframeMenu.ts +138 -0
- package/src/panels/timeline/labelWidth.ts +49 -0
- package/src/panels/timeline/marquee.ts +155 -0
- package/src/panels/timeline/model.ts +1860 -199
- package/src/panels/timeline/snap.ts +125 -43
- package/src/panels/timeline/staggerPreview.tsx +92 -0
- package/src/panels/timeline/takeMeasure.ts +72 -0
- package/src/panels/timeline/useLive.ts +48 -0
- package/src/panels/timeline/viewport.ts +234 -0
- package/src/panels/toolbar/BackChip.tsx +116 -0
- package/src/panels/toolbar/CameraViewBar.tsx +118 -49
- package/src/panels/toolbar/CanvasBar.tsx +117 -0
- package/src/panels/toolbar/InsertButton.tsx +38 -0
- package/src/panels/toolbar/IsolationTrail.tsx +156 -0
- package/src/panels/toolbar/PanelToggles.tsx +86 -0
- package/src/panels/toolbar/ShadingBar.tsx +119 -26
- package/src/panels/toolbar/ToolDockBar.tsx +329 -80
- package/src/panels/toolbar/ToolFooter.tsx +102 -0
- package/src/panels/toolbar/ViewModeBar.tsx +247 -38
- package/src/panels/toolbar/WorkPlaneBar.tsx +94 -0
- package/src/panels/toolbar/useAddRows.tsx +326 -0
- package/src/panels/toolbar/useDismiss.ts +122 -0
- package/src/panels/versions/VersionHistoryPanel.tsx +274 -0
- package/src/panels/versions/versionModel.ts +103 -0
- package/src/panels/virtualWindow.ts +271 -0
- package/src/shotTokens.css +151 -60
- package/src/stage/FrustumGizmo.tsx +504 -84
- package/src/stage/GridPlane.tsx +225 -16
- package/src/stage/NodePreviews.tsx +628 -0
- package/src/stage/PerfHud.tsx +437 -47
- package/src/stage/SplitRenderer.tsx +816 -169
- package/src/stage/StageApp.tsx +4274 -486
- package/src/stage/StageRootBoundary.tsx +114 -0
- package/src/stage/StageTools.tsx +651 -151
- package/src/stage/TransformGizmo.tsx +696 -0
- package/src/stage/adaptivePresentation.ts +145 -0
- package/src/stage/bridgeClient.ts +2522 -41
- package/src/stage/exportWorker.ts +9 -0
- package/src/stage/feed.ts +305 -14
- package/src/stage/fontPreview.ts +176 -0
- package/src/stage/frustumGeometry.ts +319 -1
- package/src/stage/furnitureTokens.ts +33 -0
- package/src/stage/gizmoMath.ts +508 -16
- package/src/stage/gpuTimer.ts +276 -0
- package/src/stage/instanceModules.ts +194 -33
- package/src/stage/interactions/move.ts +24 -5
- package/src/stage/isolation.ts +291 -33
- package/src/stage/jsSelfProfiler.ts +325 -0
- package/src/stage/main.tsx +116 -16
- package/src/stage/modalState.ts +222 -23
- package/src/stage/moduleEpoch.ts +60 -0
- package/src/stage/motionPathStage.ts +279 -0
- package/src/stage/motionPreview.ts +74 -0
- package/src/stage/overlays/Overlays.tsx +1112 -159
- package/src/stage/overlays/Rulers.tsx +495 -0
- package/src/stage/panes.ts +159 -10
- package/src/stage/project.ts +68 -3
- package/src/stage/renderScaleController.ts +730 -0
- package/src/stage/rulers.ts +129 -0
- package/src/stage/sceneExtent.ts +75 -0
- package/src/stage/shading.ts +20 -0
- package/src/stage/splineStage.ts +632 -0
- package/src/stage/stagePerformanceTelemetry.ts +717 -0
- package/src/stage/stageTheme.ts +36 -0
- package/src/stage/stageWarmup.ts +11 -0
- package/src/stage/textAutoSize.ts +124 -0
- package/src/stage/tier1Export.ts +641 -0
- package/src/stage/tokenColor.ts +14 -9
- package/src/stage/view.ts +56 -9
- package/src/stage/workingView.ts +277 -33
- package/src/state/accountPrefs.ts +261 -0
- package/src/state/agentActions.ts +173 -15
- package/src/state/agentActivity.ts +198 -0
- package/src/state/agentQuestion.ts +239 -0
- package/src/state/bootOpen.ts +42 -0
- package/src/state/cameraVerbs.ts +139 -0
- package/src/state/clientId.ts +6 -1
- package/src/state/comments.ts +1099 -0
- package/src/state/context.tsx +19 -1
- package/src/state/editorPrefs.ts +220 -0
- package/src/state/errorReports.ts +121 -0
- package/src/state/fieldWrite.ts +161 -0
- package/src/state/fontRecents.ts +70 -0
- package/src/state/fonts.ts +656 -0
- package/src/state/graphClipboard.ts +414 -0
- package/src/state/imageThumbs.ts +216 -0
- package/src/state/insert.ts +444 -67
- package/src/state/isolationTrail.ts +92 -0
- package/src/state/keyMoves.ts +134 -0
- package/src/state/keyframeClipboard.ts +177 -0
- package/src/state/keymap.ts +1153 -117
- package/src/state/layoutPrefs.ts +272 -0
- package/src/state/layouts.ts +205 -0
- package/src/state/measureMedia.ts +167 -0
- package/src/state/menu.ts +2341 -28
- package/src/state/motionStamp.ts +7 -0
- package/src/state/panelSize.ts +375 -5
- package/src/state/pendingChanges.ts +119 -0
- package/src/state/playHold.ts +78 -0
- package/src/state/playbackPreparation.ts +562 -0
- package/src/state/posterCapture.ts +242 -0
- package/src/state/presence.ts +254 -0
- package/src/state/projectComponents.ts +160 -0
- package/src/state/renderEvents.ts +298 -18
- package/src/state/runtimeErrors.ts +46 -0
- package/src/state/selection.ts +12 -0
- package/src/state/shortcuts.ts +1606 -0
- package/src/state/sketchGuide.ts +51 -0
- package/src/state/splineRefs.ts +87 -0
- package/src/state/stageHealth.ts +259 -0
- package/src/state/stageWatchdog.ts +47 -0
- package/src/state/stillStage.ts +330 -0
- package/src/state/stillThumbs.ts +474 -0
- package/src/state/store.ts +23591 -2982
- package/src/state/storyboardModel.ts +528 -0
- package/src/state/sync.ts +1257 -0
- package/src/state/syncCache.ts +159 -0
- package/src/state/triangles.ts +13 -0
- package/src/state/types.ts +1698 -55
- package/src/state/unsavedGuard.ts +49 -0
- package/src/state/viewMode.ts +200 -0
- package/src/state/webmcp.ts +1128 -0
- package/src/state/workspace.ts +1147 -0
- package/src/styles/assets-tab.css +304 -0
- package/src/styles/canvas.css +545 -0
- package/src/styles/comments.css +1435 -0
- package/src/styles/controls.css +162 -0
- package/src/styles/dialogs.css +390 -0
- package/src/styles/insert-drawer.css +586 -0
- package/src/styles/inspector-board.css +207 -0
- package/src/styles/inspector-object.css +486 -0
- package/src/styles/inspector-shot.css +252 -0
- package/src/styles/inspector.css +360 -0
- package/src/styles/left-column.css +1628 -0
- package/src/styles/library-preview.css +575 -0
- package/src/styles/library.css +512 -0
- package/src/styles/modes/code.css +569 -0
- package/src/styles/modes/component.css +1561 -0
- package/src/styles/modes/material.css +1201 -0
- package/src/styles/modes/storyboard.css +518 -0
- package/src/styles/share-component.css +49 -0
- package/src/styles/shell.css +653 -0
- package/src/styles/shot-brief.css +360 -0
- package/src/styles/states.css +76 -0
- package/src/styles/sync.css +380 -0
- package/src/styles/timeline-graph.css +384 -0
- package/src/styles/timeline-meters.css +89 -0
- package/src/styles/timeline-rows.css +1959 -0
- package/src/styles/timeline-sound.css +1003 -0
- package/src/styles/timeline.css +754 -0
- package/src/styles/tool-footer.css +525 -0
- package/src/styles/topbar.css +886 -0
- package/src/styles/versions.css +262 -0
- package/src/styles.css +72 -2921
- package/src/tools.ts +108 -23
- package/dist/assets/index-B7notge7.css +0 -1
- package/dist/assets/index-BBE6Ta9L.js +0 -52
- package/src/panels/files/icons.tsx +0 -118
- package/src/panels/header/DocSwitcher.tsx +0 -85
- package/src/panels/header/TransportBar.tsx +0 -86
- package/src/panels/inspector/animate/BlockTiming.tsx +0 -341
- package/src/panels/inspector/animate/DuringBlocks.tsx +0 -85
- package/src/panels/inspector/animate/InOutPresets.tsx +0 -57
- package/src/panels/inspector/animate/ResolvedChannels.tsx +0 -150
- package/src/panels/inspector/animate/useBlocks.ts +0 -43
- package/src/panels/material/MaterialPicker.tsx +0 -172
- package/src/panels/timeline/SceneStrip.tsx +0 -145
- package/src/panels/toolbar/AddMenu.tsx +0 -230
- package/src/stage/MoveGizmo.tsx +0 -411
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
// The shot lane's OFFLINE audio mix, for Tier-1 export: one deterministic
|
|
2
|
+
// OfflineAudioContext render of the document's clips, handed to the encode
|
|
3
|
+
// worker as planar f32. The browser-side sibling of the server render's mix
|
|
4
|
+
// (cli's mixCompositionAudio via shotRender's withShotAudio), and the same
|
|
5
|
+
// three engine functions the live preview schedules from — so what the author
|
|
6
|
+
// heard is what the file carries, on every path.
|
|
7
|
+
//
|
|
8
|
+
// ── TWO HOMES, ONE FLATTEN ──────────────────────────────────────────────
|
|
9
|
+
//
|
|
10
|
+
// Clips live in two places since schema v13: `doc.audio` (the master-timed bed)
|
|
11
|
+
// and `Scene3D.audio` (what a shot owns, on scene-local frames). Everything
|
|
12
|
+
// below reads `masterAudioClips`, never either record — see the note at the
|
|
13
|
+
// call. The rest of this file never learns that a second home exists.
|
|
14
|
+
//
|
|
15
|
+
// ── SCENE SCOPE IS THE SLICE'S PROBLEM, NOT OURS ────────────────────────
|
|
16
|
+
//
|
|
17
|
+
// A per-scene export mixes the audio of `sliceShotToScene(doc, sceneId)`.
|
|
18
|
+
// The slice has already done the master→scene retiming — dropping what falls
|
|
19
|
+
// outside the window, trimming a clip that starts before it and advancing its
|
|
20
|
+
// `offsetFrames` by the amount removed. That is the same call the server
|
|
21
|
+
// render's withShotAudio leans on, for the same reason: re-deriving the
|
|
22
|
+
// arithmetic here would be a second implementation of the one thing in this
|
|
23
|
+
// lane most likely to go subtly out of sync with the picture.
|
|
24
|
+
//
|
|
25
|
+
// ── ENVELOPE RULE (preview === export, non-negotiable) ──────────────────
|
|
26
|
+
//
|
|
27
|
+
// The point list comes verbatim from the engine's audioEnvelopePoints —
|
|
28
|
+
// setValueAtTime at the first point, linearRamp for the rest, source stopped
|
|
29
|
+
// at the last point's frame. Never hand-roll the fade maths here. Schema v13's
|
|
30
|
+
// `gainTrack` supplies the sampler argument, so a keyframed duck rides the same
|
|
31
|
+
// one list the live preview schedules from and the server render materialises
|
|
32
|
+
// as PCM; a clip with no automation supplies no sampler and the envelope falls
|
|
33
|
+
// back to the static gain, exactly as before.
|
|
34
|
+
//
|
|
35
|
+
// Everything Web-Audio-shaped is injectable so jsdom tests drive fakes; the
|
|
36
|
+
// real defaults are OfflineAudioContext + decodeAudioData + fetch.
|
|
37
|
+
import {
|
|
38
|
+
MIX_SAMPLE_RATE,
|
|
39
|
+
audioClipWindow,
|
|
40
|
+
audioEnvelopePoints,
|
|
41
|
+
audioSampleCount,
|
|
42
|
+
audioSourceTimeAt,
|
|
43
|
+
framesToSeconds,
|
|
44
|
+
measurePeak,
|
|
45
|
+
wirePan,
|
|
46
|
+
} from "@dailies-studio/engine";
|
|
47
|
+
import type { AudioClip, AudioPeak, Rational, ScheduledClip } from "@dailies-studio/engine";
|
|
48
|
+
import {
|
|
49
|
+
audioAnalysisFileName,
|
|
50
|
+
audioGainSampler,
|
|
51
|
+
audioPlayPath,
|
|
52
|
+
derivedGainTracks,
|
|
53
|
+
docDurationFrames,
|
|
54
|
+
duckSourceAssets,
|
|
55
|
+
masterAudioClips,
|
|
56
|
+
sliceShotToScene,
|
|
57
|
+
} from "@dailies-studio/shot/doc";
|
|
58
|
+
import type { AudioAnalysis, Doc3D } from "@dailies-studio/shot/doc";
|
|
59
|
+
import { asEngineClip } from "./preview.js";
|
|
60
|
+
import type { AudioBufferLike, AudioBufferSourceNodeLike, GainNodeLike, PanContextLike } from "./preview.js";
|
|
61
|
+
|
|
62
|
+
/** 48 kHz stereo, the studio's one mix layout — the ENGINE's constant, which
|
|
63
|
+
* is also the rate the server lane's graph and the import transcode run at.
|
|
64
|
+
* This used to be a local 48_000 with a comment pointing at cli's copy,
|
|
65
|
+
* because a package boundary stood between them; the clock moved into engine
|
|
66
|
+
* so the two mixes could stop describing the same number twice. */
|
|
67
|
+
export { MIX_SAMPLE_RATE };
|
|
68
|
+
|
|
69
|
+
export interface OfflineAudioContextLike extends PanContextLike {
|
|
70
|
+
destination: unknown;
|
|
71
|
+
createBufferSource(): AudioBufferSourceNodeLike;
|
|
72
|
+
createGain(): GainNodeLike;
|
|
73
|
+
startRendering(): Promise<{ getChannelData(channel: number): Float32Array }>;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface OfflineMixDeps {
|
|
77
|
+
fetchBytes(url: string): Promise<ArrayBuffer>;
|
|
78
|
+
decode(ctx: OfflineAudioContextLike, bytes: ArrayBuffer): Promise<AudioBufferLike>;
|
|
79
|
+
createContext(channels: number, length: number, sampleRate: number): OfflineAudioContextLike;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function defaultDeps(): OfflineMixDeps {
|
|
83
|
+
if (typeof OfflineAudioContext === "undefined") {
|
|
84
|
+
throw new Error("audio mixing needs OfflineAudioContext (a real browser)");
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
fetchBytes: async (url) => {
|
|
88
|
+
const res = await fetch(url);
|
|
89
|
+
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
|
90
|
+
return res.arrayBuffer();
|
|
91
|
+
},
|
|
92
|
+
decode: (ctx, bytes) =>
|
|
93
|
+
(ctx as unknown as OfflineAudioContext).decodeAudioData(bytes) as Promise<AudioBufferLike>,
|
|
94
|
+
createContext: (channels, length, sampleRate) =>
|
|
95
|
+
new OfflineAudioContext(channels, length, sampleRate) as unknown as OfflineAudioContextLike,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const why = (e: unknown): string => (e instanceof Error ? e.message : String(e));
|
|
100
|
+
|
|
101
|
+
/** cli's audioMix.scheduleClip minus the gain-track sampler a Doc3D cannot
|
|
102
|
+
* have: absolute time axis, engine envelope, stop at the last point. */
|
|
103
|
+
function scheduleClip(
|
|
104
|
+
ctx: OfflineAudioContextLike,
|
|
105
|
+
clip: AudioClip,
|
|
106
|
+
buffer: AudioBufferLike,
|
|
107
|
+
endFrames: number,
|
|
108
|
+
fps: Rational,
|
|
109
|
+
/** The clip's gain automation, or undefined when it has none — handed
|
|
110
|
+
* straight to the engine, which falls back to the static gain. */
|
|
111
|
+
sampledGain?: (frame: number) => number | undefined,
|
|
112
|
+
): { start: number; end: number } | null {
|
|
113
|
+
const pan = clip.pan ?? 0;
|
|
114
|
+
const window = audioClipWindow(clip);
|
|
115
|
+
// Trim starts past the decoded source: the whole clip is silence — legal
|
|
116
|
+
// (validation cannot know asset lengths), so no node at all.
|
|
117
|
+
const offset = audioSourceTimeAt(clip, window.start, fps);
|
|
118
|
+
if (offset >= buffer.duration) return null;
|
|
119
|
+
const points = audioEnvelopePoints(clip, window.start, endFrames, fps, sampledGain);
|
|
120
|
+
if (points.length === 0) return null;
|
|
121
|
+
const gain = ctx.createGain();
|
|
122
|
+
gain.gain.setValueAtTime(points[0]!.gain, framesToSeconds(points[0]!.frame, fps));
|
|
123
|
+
for (const p of points.slice(1)) {
|
|
124
|
+
gain.gain.linearRampToValueAtTime(p.gain, framesToSeconds(p.frame, fps));
|
|
125
|
+
}
|
|
126
|
+
const source = ctx.createBufferSource();
|
|
127
|
+
source.buffer = buffer;
|
|
128
|
+
source.connect(gain);
|
|
129
|
+
// A centred clip keeps the graph it always had. A panned one goes through
|
|
130
|
+
// the same splitter stage the preview uses, on the same engine law; a
|
|
131
|
+
// context without the splitter pair cannot honour it, and mixing it centred
|
|
132
|
+
// would be a file that disagrees with what the author heard.
|
|
133
|
+
if (pan === 0) gain.connect(ctx.destination);
|
|
134
|
+
else if (wirePan(ctx, gain, ctx.destination, pan) === null) {
|
|
135
|
+
throw new Error(`audio clip ${clip.name} is panned and this context has no ChannelSplitter`);
|
|
136
|
+
}
|
|
137
|
+
source.start(
|
|
138
|
+
framesToSeconds(window.start, fps),
|
|
139
|
+
offset,
|
|
140
|
+
framesToSeconds(points.at(-1)!.frame - window.start, fps),
|
|
141
|
+
);
|
|
142
|
+
// The span this clip ACTUALLY contributed, for the peak's attribution — the
|
|
143
|
+
// same shape cli's mixer reports, so a clip the scheduler skipped can never
|
|
144
|
+
// be blamed for a sample it did not make.
|
|
145
|
+
return { start: window.start, end: points.at(-1)!.frame };
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Render the shot's audio clips into a 48 kHz stereo mix for the export
|
|
150
|
+
* scope. Null when the scope has no unmuted clips (a silent export carries
|
|
151
|
+
* no audio track). Missing and non-audio assets THROW — validateShotDoc
|
|
152
|
+
* refuses both at the gate, so reaching them here means the document
|
|
153
|
+
* bypassed validation, and a silent skip would be an export that looks
|
|
154
|
+
* successful and has no sound.
|
|
155
|
+
*
|
|
156
|
+
* The returned `peak` is measured HERE, on the float mix, because this is the
|
|
157
|
+
* last moment it still has its true amplitude: Web Audio sums gain nodes
|
|
158
|
+
* UNCLAMPED, so two clips that both peak at full scale reach +6.02 dBFS, and
|
|
159
|
+
* everything past ±1 is flattened on the way into the encoder. The dialog
|
|
160
|
+
* renders the engine's advisory from it, which is the same sentence the server
|
|
161
|
+
* render prints. A non-finite sample THROWS from the scan rather than becoming
|
|
162
|
+
* silence in the file.
|
|
163
|
+
*/
|
|
164
|
+
export async function mixShotAudio(
|
|
165
|
+
doc: Doc3D,
|
|
166
|
+
/** A scene id, a master `{ start, frames }` window of the whole timeline
|
|
167
|
+
* (the work area), or undefined for the whole timeline. A window is the
|
|
168
|
+
* whole film's mix cut to its samples, so it sounds as the transport
|
|
169
|
+
* played it: a fade the window starts inside starts mid-fade. */
|
|
170
|
+
scope: string | { start: number; frames: number } | undefined,
|
|
171
|
+
deps: OfflineMixDeps = defaultDeps(),
|
|
172
|
+
): Promise<{ sampleRate: number; channels: [Float32Array, Float32Array]; peak: AudioPeak } | null> {
|
|
173
|
+
const window = typeof scope === "object" ? scope : undefined;
|
|
174
|
+
const source = typeof scope === "string" ? (sliceShotToScene(doc, scope) ?? doc) : doc;
|
|
175
|
+
// THROUGH THE FLATTEN. `source.audio` has been the BED only since schema v13,
|
|
176
|
+
// so mixing from it exports a file missing every shot-owned clip — the
|
|
177
|
+
// preview would have played them and the MP4 would not, which breaks this
|
|
178
|
+
// lane's one rule. A slice re-zeroes on its scene, so the flatten is the
|
|
179
|
+
// identity over the clips that scene owns.
|
|
180
|
+
const flat = masterAudioClips(source);
|
|
181
|
+
const panOf = new Map(flat.map((m) => [m.clip.id, m.pan]));
|
|
182
|
+
const clips = flat
|
|
183
|
+
.map((m) => m.clip)
|
|
184
|
+
.filter(
|
|
185
|
+
(clip) =>
|
|
186
|
+
clip.muted !== true &&
|
|
187
|
+
(window === undefined ||
|
|
188
|
+
(clip.frame < window.start + window.frames && clip.frame + clip.durationFrames > window.start)),
|
|
189
|
+
);
|
|
190
|
+
if (clips.length === 0) return null;
|
|
191
|
+
|
|
192
|
+
// THE SIDECARS A DUCK NEEDS, fetched before a single node is scheduled.
|
|
193
|
+
//
|
|
194
|
+
// A THROW, not a fallback. The preview settles on the ducked envelope once
|
|
195
|
+
// the sidecar lands, so exporting the unducked one would ship a file quieter
|
|
196
|
+
// in the wrong places than the thing the author approved, with nothing on
|
|
197
|
+
// screen to say so. Refusal over corruption: the author re-runs the export
|
|
198
|
+
// after the analysis exists.
|
|
199
|
+
const analyses = new Map<string, AudioAnalysis>();
|
|
200
|
+
for (const asset of duckSourceAssets(source)) {
|
|
201
|
+
try {
|
|
202
|
+
const bytes = await deps.fetchBytes(`/studio/assets/${encodeURIComponent(audioAnalysisFileName(asset.path))}`);
|
|
203
|
+
analyses.set(asset.path, JSON.parse(new TextDecoder().decode(bytes)) as AudioAnalysis);
|
|
204
|
+
} catch (e) {
|
|
205
|
+
throw new Error(
|
|
206
|
+
`audio analysis for ${asset.path}: ${why(e)}. A ducked bed cannot be mixed until its voice is measured.`,
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
const derived = derivedGainTracks(source, (asset) => analyses.get(asset.path));
|
|
211
|
+
|
|
212
|
+
const endFrames = window === undefined ? docDurationFrames(source) : window.start + window.frames;
|
|
213
|
+
// The ENGINE's integer clock, not `Math.ceil(seconds * rate)`. That spelling
|
|
214
|
+
// is off by a sample at 30000/1001 (audioTiming.ts measures it: 248249
|
|
215
|
+
// against a true 248248 over five seconds), which is a mix one sample longer
|
|
216
|
+
// than the picture and a muxer left to resolve the difference however its
|
|
217
|
+
// container prefers.
|
|
218
|
+
const length = audioSampleCount(endFrames, source.fps);
|
|
219
|
+
if (length <= 0) return null;
|
|
220
|
+
|
|
221
|
+
const ctx = deps.createContext(2, length, MIX_SAMPLE_RATE);
|
|
222
|
+
// N clips of one asset decode once — buffers are shared read-only.
|
|
223
|
+
const decoded = new Map<string, AudioBufferLike>();
|
|
224
|
+
const scheduled: ScheduledClip[] = [];
|
|
225
|
+
for (const clip of clips) {
|
|
226
|
+
const asset = source.assets[clip.asset];
|
|
227
|
+
if (asset === undefined) {
|
|
228
|
+
throw new Error(`audio clip ${clip.id} references unknown asset ${clip.asset}`);
|
|
229
|
+
}
|
|
230
|
+
if (asset.kind !== "audio") {
|
|
231
|
+
throw new Error(`audio clip ${clip.id} references asset ${clip.asset}, which is a ${asset.kind}`);
|
|
232
|
+
}
|
|
233
|
+
// The file the clip PLAYS: its processed file when it has effects (schema
|
|
234
|
+
// v49), which the host makes on this request if it has not yet.
|
|
235
|
+
const file = audioPlayPath(clip, asset);
|
|
236
|
+
let buffer = decoded.get(file);
|
|
237
|
+
if (!buffer) {
|
|
238
|
+
let bytes: ArrayBuffer;
|
|
239
|
+
try {
|
|
240
|
+
bytes = await deps.fetchBytes(`/studio/assets/${encodeURIComponent(file)}`);
|
|
241
|
+
} catch (e) {
|
|
242
|
+
throw new Error(
|
|
243
|
+
file === asset.path ? `audio asset ${asset.path}: ${why(e)}` : `audio clip ${clip.id}: its effects could not be rendered (${why(e)})`,
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
try {
|
|
247
|
+
buffer = await deps.decode(ctx, bytes);
|
|
248
|
+
} catch (e) {
|
|
249
|
+
throw new Error(`audio asset ${file}: could not decode (${why(e)})`);
|
|
250
|
+
}
|
|
251
|
+
decoded.set(file, buffer);
|
|
252
|
+
}
|
|
253
|
+
// `clip.frame` is the MASTER start the flatten put it at, and the track's
|
|
254
|
+
// frames are local to exactly that — including after `clipToWindow` shifted
|
|
255
|
+
// them by whatever a window ate off the head.
|
|
256
|
+
const span = scheduleClip(
|
|
257
|
+
ctx,
|
|
258
|
+
asEngineClip(clip, panOf.get(clip.id)),
|
|
259
|
+
buffer,
|
|
260
|
+
endFrames,
|
|
261
|
+
source.fps,
|
|
262
|
+
// The derived duck outranks the authored track because it INCLUDES it:
|
|
263
|
+
// `duckedGainTrack` multiplies whatever gain/gainTrack resolve to.
|
|
264
|
+
audioGainSampler(derived.get(clip.id) ?? clip.gainTrack, clip.frame, source.fps),
|
|
265
|
+
);
|
|
266
|
+
// `name` is the clip id: `AudioClipRef` has no name of its own (asEngineClip
|
|
267
|
+
// fills the engine's field with the id), and the id is what the lane shows.
|
|
268
|
+
if (span) scheduled.push({ name: clip.id, ...span });
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
const rendered = await ctx.startRendering();
|
|
272
|
+
// A window keeps its own samples, on the same integer clock as the picture,
|
|
273
|
+
// and its peak is the file's: frames and spans counted from its start.
|
|
274
|
+
const from = window === undefined ? 0 : audioSampleCount(window.start, source.fps);
|
|
275
|
+
const channels: [Float32Array, Float32Array] = [
|
|
276
|
+
rendered.getChannelData(0).subarray(from),
|
|
277
|
+
rendered.getChannelData(1).subarray(from),
|
|
278
|
+
];
|
|
279
|
+
const shift = window?.start ?? 0;
|
|
280
|
+
return {
|
|
281
|
+
sampleRate: MIX_SAMPLE_RATE,
|
|
282
|
+
channels,
|
|
283
|
+
peak: measurePeak(
|
|
284
|
+
channels,
|
|
285
|
+
scheduled.map((c) => ({ ...c, start: Math.max(0, c.start - shift), end: c.end - shift })),
|
|
286
|
+
source.fps,
|
|
287
|
+
),
|
|
288
|
+
};
|
|
289
|
+
}
|