@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,138 @@
|
|
|
1
|
+
// THE KEYFRAME CONTEXT MENU, once.
|
|
2
|
+
//
|
|
3
|
+
// A right-click on a keyframe means the same thing in both faces of the dock —
|
|
4
|
+
// the rows' diamonds and the graph's circles — and the rules it has to obey are
|
|
5
|
+
// not obvious ones: a spring on a non-springable kind THROWS inside the sampler,
|
|
6
|
+
// a discrete track holds structurally so every tween is a no-op wearing a label,
|
|
7
|
+
// and the last key's ease governs no segment at all. Three rules, two call
|
|
8
|
+
// sites; written once so the two cannot answer differently.
|
|
9
|
+
import { EASE_PRESETS, groupEasePresets, matchPreset } from "@dailies-studio/timeline";
|
|
10
|
+
import type { EasePreset } from "@dailies-studio/timeline";
|
|
11
|
+
import { DISCRETE_KINDS, SPRINGABLE_KINDS } from "@dailies-studio/engine";
|
|
12
|
+
import type { Ease, TrackKind } from "@dailies-studio/engine";
|
|
13
|
+
import type { MenuEntry } from "@dailies-studio/ui";
|
|
14
|
+
import type { KeyframeSel } from "../../state/types.js";
|
|
15
|
+
import type { ShotEditorStore } from "../../state/store.js";
|
|
16
|
+
import { gateForViewer } from "../../state/menu.js";
|
|
17
|
+
|
|
18
|
+
/** The one key the pointer is on, as the menu needs to describe it. */
|
|
19
|
+
export interface MenuKey {
|
|
20
|
+
kind: TrackKind;
|
|
21
|
+
ease: Ease;
|
|
22
|
+
/** Is this the LAST key on its track? Then its ease is never sampled. */
|
|
23
|
+
last: boolean;
|
|
24
|
+
/** Does the track curve its path (`spatialInterp`)? Then no spring: the
|
|
25
|
+
* engine refuses a spring on a curved track. */
|
|
26
|
+
curved?: boolean;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Which keys a menu opened on `at` is about.
|
|
31
|
+
*
|
|
32
|
+
* IN THE SELECTION = the whole set. Right-clicking one of four selected keys to
|
|
33
|
+
* ease all four is the gesture every timeline has, and collapsing to one here
|
|
34
|
+
* would silently drop three. Outside it, the menu points at what the pointer
|
|
35
|
+
* points at — and the caller focuses that key, so a following Backspace
|
|
36
|
+
* addresses the same thing the menu did.
|
|
37
|
+
*/
|
|
38
|
+
export function keyframeMenuTargets(
|
|
39
|
+
selection: readonly KeyframeSel[],
|
|
40
|
+
at: KeyframeSel,
|
|
41
|
+
): readonly KeyframeSel[] {
|
|
42
|
+
const inSet = selection.some(
|
|
43
|
+
(k) =>
|
|
44
|
+
k.containerId === at.containerId &&
|
|
45
|
+
k.layerId === at.layerId &&
|
|
46
|
+
k.path === at.path &&
|
|
47
|
+
k.frame === at.frame,
|
|
48
|
+
);
|
|
49
|
+
return inSet ? selection : [at];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function keyframeMenuEntries(args: {
|
|
53
|
+
store: ShotEditorStore;
|
|
54
|
+
key: MenuKey;
|
|
55
|
+
targets: readonly KeyframeSel[];
|
|
56
|
+
/** The track the menu opened on — "select all in this track" acts on it. */
|
|
57
|
+
at: KeyframeSel;
|
|
58
|
+
}): MenuEntry[] {
|
|
59
|
+
const { store, key, targets, at } = args;
|
|
60
|
+
const many = targets.length > 1;
|
|
61
|
+
const current = matchPreset(key.ease);
|
|
62
|
+
// ONLY WHAT THE ENGINE WILL SAMPLE, on `KeyframeEditor`'s rule (its own
|
|
63
|
+
// header states it): a spring on a non-springable kind THROWS inside
|
|
64
|
+
// `evaluateTrack`, so offering it here promises a document that refuses to
|
|
65
|
+
// play. Dropped rather than disabled, because `easeTrackError` means no valid
|
|
66
|
+
// track can already read as "spring" on such a kind — so removing the option
|
|
67
|
+
// can never leave the menu unable to show the current ease.
|
|
68
|
+
const springable = SPRINGABLE_KINDS.has(key.kind) && key.curved !== true;
|
|
69
|
+
// A discrete track holds STRUCTURALLY (`evaluateTrack` returns early on
|
|
70
|
+
// `DISCRETE_KINDS`), so every tween here is a no-op wearing a label. One
|
|
71
|
+
// disabled line says so instead of four buttons that do nothing.
|
|
72
|
+
const discrete = DISCRETE_KINDS.has(key.kind);
|
|
73
|
+
// THE LAST KEY'S EASE GOVERNS NO SEGMENT. Writing it is legal and utterly
|
|
74
|
+
// invisible, which is the silent inertness this lane refuses everywhere else —
|
|
75
|
+
// so the entries stay visible (the author can see which ease the key carries)
|
|
76
|
+
// and refuse with their reason on hover.
|
|
77
|
+
//
|
|
78
|
+
// SINGLE-KEY ONLY, and that is the whole of the rule: `key.last` describes the
|
|
79
|
+
// key the pointer landed on, and it cannot describe a SET. Over a selection it
|
|
80
|
+
// greyed out every preset because the author right-clicked the last member —
|
|
81
|
+
// which is the natural one to click after a left-to-right marquee, so easing a
|
|
82
|
+
// whole run was impossible from the obvious gesture.
|
|
83
|
+
const easeReason =
|
|
84
|
+
key.last && !many
|
|
85
|
+
? "the last keyframe has no segment leaving it, so its ease is never sampled"
|
|
86
|
+
: null;
|
|
87
|
+
const presets = EASE_PRESETS.filter(
|
|
88
|
+
(p) => (springable || p.ease.type !== "spring") && (!discrete || p.ease.type === "hold"),
|
|
89
|
+
);
|
|
90
|
+
const action = (preset: EasePreset): MenuEntry => ({
|
|
91
|
+
kind: "action" as const,
|
|
92
|
+
id: `ease-${preset.id}`,
|
|
93
|
+
label: preset.label,
|
|
94
|
+
// WHICH ONE IS ON, in the shortcut column rather than as a check mark:
|
|
95
|
+
// `MenuEntry` has no checked state, and adding one to the shared menu for
|
|
96
|
+
// a single call site would be a widget feature paid for by one caller. The
|
|
97
|
+
// column is right-aligned dim text, which is exactly the register this
|
|
98
|
+
// belongs in. The "current" marker only means something for ONE key — over
|
|
99
|
+
// a set it would name whichever the pointer happened to be on.
|
|
100
|
+
...(!many && current === preset.id ? { shortcut: "current" } : {}),
|
|
101
|
+
...(easeReason === null ? {} : { disabled: true, title: easeReason }),
|
|
102
|
+
onSelect: () => store.setKeyframesEase(targets, preset.ease),
|
|
103
|
+
});
|
|
104
|
+
return gateForViewer(store.getState(), [
|
|
105
|
+
...(discrete
|
|
106
|
+
? [
|
|
107
|
+
{
|
|
108
|
+
kind: "action" as const,
|
|
109
|
+
id: "ease-discrete",
|
|
110
|
+
label: `a ${key.kind} track always holds`,
|
|
111
|
+
disabled: true,
|
|
112
|
+
onSelect: () => {},
|
|
113
|
+
},
|
|
114
|
+
]
|
|
115
|
+
: []),
|
|
116
|
+
// The basic group stays flat where it always was; the named families fold
|
|
117
|
+
// into submenus, because ~25 top-level rows is not a menu anyone can scan.
|
|
118
|
+
...groupEasePresets(presets).flatMap((g): MenuEntry[] =>
|
|
119
|
+
g.group === "basic"
|
|
120
|
+
? g.presets.map(action)
|
|
121
|
+
: [{ kind: "submenu" as const, label: g.label, items: g.presets.map(action) }],
|
|
122
|
+
),
|
|
123
|
+
{ kind: "separator" as const },
|
|
124
|
+
{
|
|
125
|
+
kind: "action" as const,
|
|
126
|
+
id: "key-select-track",
|
|
127
|
+
label: "Select all keyframes in this track",
|
|
128
|
+
onSelect: () => store.selectTrackKeyframes(at.containerId, at.layerId, at.path),
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
kind: "action" as const,
|
|
132
|
+
id: "key-delete",
|
|
133
|
+
label: many ? `Delete ${targets.length} keyframes` : "Delete keyframe",
|
|
134
|
+
danger: true,
|
|
135
|
+
onSelect: () => store.deleteKeyframes(targets),
|
|
136
|
+
},
|
|
137
|
+
]);
|
|
138
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// THE TIMELINE'S NAME COLUMN IS THE LEFT COLUMN'S TRACK.
|
|
2
|
+
//
|
|
3
|
+
// The dock spans the shell's three column tracks, so its label column sits
|
|
4
|
+
// under the left column and has to be exactly as wide as the rail the grid
|
|
5
|
+
// DRAWS: the fitted width, not the stored one (a small window shrinks the rail
|
|
6
|
+
// first). `fitShell` is the same call App.tsx makes for `--rail-w`, so the two
|
|
7
|
+
// cannot disagree. A collapsed rail keeps its track, so collapse and Video
|
|
8
|
+
// never move a bar.
|
|
9
|
+
import { useCallback, useSyncExternalStore } from "react";
|
|
10
|
+
import { useStore } from "../../state/context.js";
|
|
11
|
+
import { fitShell } from "../../state/panelSize.js";
|
|
12
|
+
import type { ShellFit } from "../../state/panelSize.js";
|
|
13
|
+
|
|
14
|
+
type StoredSizes = Parameters<typeof fitShell>[2];
|
|
15
|
+
|
|
16
|
+
/** The label column's width for this window and these stored sizes. Read it
|
|
17
|
+
* from effects and handlers, which must never close over a stale width. */
|
|
18
|
+
export function labelWidthOf(stored: StoredSizes): number {
|
|
19
|
+
return fitShell(window.innerWidth, window.innerHeight, stored).railWidth;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* One value of the shell's fitted tracks, for rendering.
|
|
24
|
+
*
|
|
25
|
+
* On the COLD channel plus the window's resize: the stored sizes are cold
|
|
26
|
+
* fields, so a playback tick never re-evaluates this, and the snapshot is a
|
|
27
|
+
* primitive, so a notification that leaves it unchanged renders nothing.
|
|
28
|
+
*/
|
|
29
|
+
export function useShellFit<T extends number | boolean>(pick: (fit: ShellFit) => T): T {
|
|
30
|
+
const store = useStore();
|
|
31
|
+
const subscribe = useCallback(
|
|
32
|
+
(onChange: () => void) => {
|
|
33
|
+
const stop = store.subscribeCold(onChange);
|
|
34
|
+
window.addEventListener("resize", onChange);
|
|
35
|
+
return () => {
|
|
36
|
+
stop();
|
|
37
|
+
window.removeEventListener("resize", onChange);
|
|
38
|
+
};
|
|
39
|
+
},
|
|
40
|
+
[store],
|
|
41
|
+
);
|
|
42
|
+
const read = (): T => pick(fitShell(window.innerWidth, window.innerHeight, store.getState()));
|
|
43
|
+
return useSyncExternalStore(subscribe, read, read);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** The label column's width, for rendering. */
|
|
47
|
+
export function useLabelWidth(): number {
|
|
48
|
+
return useShellFit((fit) => fit.railWidth);
|
|
49
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
// THE DOCK'S RUBBER BAND: which bars a dragged rectangle takes.
|
|
2
|
+
//
|
|
3
|
+
// ── WHY THE LOGIC IS HERE AND NOT IN THE COMPONENT ──────────────────────
|
|
4
|
+
//
|
|
5
|
+
// The same argument model.ts makes for every other piece of this lane's
|
|
6
|
+
// geometry: "does a bar that merely touches the edge of the box count" is a
|
|
7
|
+
// question about two rectangles, and a question about two rectangles should be
|
|
8
|
+
// answerable without mounting a timeline. `TimelineDock` measures, this decides,
|
|
9
|
+
// and the test fixture below the fold in timelineMarquee.test.ts is four boxes
|
|
10
|
+
// and no DOM.
|
|
11
|
+
//
|
|
12
|
+
// ── ONE COORDINATE SPACE, AND IT IS `.dock-tracks` ──────────────────────
|
|
13
|
+
//
|
|
14
|
+
// Every number in this file is in the track area's OWN content pixels: a client
|
|
15
|
+
// x less `.dock-tracks`'s left edge. Not client coordinates, and deliberately:
|
|
16
|
+
// the first write of a marquee's selection can move the playhead into another
|
|
17
|
+
// shot (`focusScene`), and the lane's follow effect then scrolls horizontally
|
|
18
|
+
// under a pointer that has not moved. In content space the box stays pinned to
|
|
19
|
+
// the frames it was drawn over while the lane slides beneath it, which is what
|
|
20
|
+
// an author who drew a box around two bars means. It is also what the painted
|
|
21
|
+
// rect wants, since `.dock-marquee` is absolutely positioned inside the same
|
|
22
|
+
// element.
|
|
23
|
+
//
|
|
24
|
+
// ── AND MEMBERSHIP IS DECIDED PER BAR, EVERY MOVE ───────────────────────
|
|
25
|
+
//
|
|
26
|
+
// Nothing here accumulates. `marqueeHits` is asked again on every move with the
|
|
27
|
+
// live box, so a bar the band reached and then retreated past is simply not in
|
|
28
|
+
// the answer any more. A banked set would make the gesture one-way: overshoot
|
|
29
|
+
// by one row and the only recovery is to release and start again.
|
|
30
|
+
|
|
31
|
+
/** A point in `.dock-tracks` content pixels. */
|
|
32
|
+
export interface MarqueePoint {
|
|
33
|
+
x: number;
|
|
34
|
+
y: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** A box in `.dock-tracks` content pixels, edges normalised so `left <= right`
|
|
38
|
+
* and `top <= bottom`. */
|
|
39
|
+
export interface MarqueeRect {
|
|
40
|
+
left: number;
|
|
41
|
+
top: number;
|
|
42
|
+
right: number;
|
|
43
|
+
bottom: number;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** One lifespan bar's box, with the two ids the selection needs. */
|
|
47
|
+
export interface MarqueeBar extends MarqueeRect {
|
|
48
|
+
layerId: string;
|
|
49
|
+
/** The container the row's layer lives in: a scene, or the open definition. */
|
|
50
|
+
sceneId: string;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** What a gesture is selecting INTO, and inside which group.
|
|
54
|
+
*
|
|
55
|
+
* `add` is the selection frozen at the press, empty unless shift was held. It
|
|
56
|
+
* goes in front of the hits so a shift-marquee reads as an extension of what
|
|
57
|
+
* was already there rather than a reordering of it. */
|
|
58
|
+
export interface MarqueeScope {
|
|
59
|
+
sceneId: string;
|
|
60
|
+
add: readonly string[];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** The box between the press and the pointer, whichever way the drag ran. */
|
|
64
|
+
export function rectBetween(from: MarqueePoint, to: MarqueePoint): MarqueeRect {
|
|
65
|
+
return {
|
|
66
|
+
left: Math.min(from.x, to.x),
|
|
67
|
+
top: Math.min(from.y, to.y),
|
|
68
|
+
right: Math.max(from.x, to.x),
|
|
69
|
+
bottom: Math.max(from.y, to.y),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* The layer ids a box selects: every bar it touches, plus whatever it is adding
|
|
75
|
+
* to.
|
|
76
|
+
*
|
|
77
|
+
* ── TOUCHING COUNTS ─────────────────────────────────────────────────────
|
|
78
|
+
*
|
|
79
|
+
* The test is separation, not enclosure, and it is not strict: a band dragged
|
|
80
|
+
* up to a bar's edge has REACHED that bar, and no author can see the sub-pixel
|
|
81
|
+
* difference that a strict test would decide on. Enclosure is the other
|
|
82
|
+
* candidate and it is wrong for this lane: a bar can be wider than the dock, so
|
|
83
|
+
* "the box must contain it" would make the longest clips unselectable.
|
|
84
|
+
*
|
|
85
|
+
* ── AND THE SCOPE IS ONE SCENE GROUP ────────────────────────────────────
|
|
86
|
+
*
|
|
87
|
+
* Not a preference. `select` in store.ts orders the ids it is given against ONE
|
|
88
|
+
* container (the one `layerContainer()` names, then the playhead's scene) and
|
|
89
|
+
* DROPS everything that resolves in neither, so a list spanning two shots
|
|
90
|
+
* silently becomes a list of one shot's worth anyway. Better to decide that
|
|
91
|
+
* here, where the rule can be read, than to hand over a cross-shot list and
|
|
92
|
+
* discover which half survived. The group is the one the press began in, which
|
|
93
|
+
* is also the shot the caller pins with `focusScene` before it writes.
|
|
94
|
+
*
|
|
95
|
+
* Ids in `add` from another group are passed through untouched: they are the
|
|
96
|
+
* author's existing selection, not this box's business, and `select` is the one
|
|
97
|
+
* place that resolves a home.
|
|
98
|
+
*/
|
|
99
|
+
export function marqueeHits(
|
|
100
|
+
rect: MarqueeRect,
|
|
101
|
+
bars: readonly MarqueeBar[],
|
|
102
|
+
scope: MarqueeScope,
|
|
103
|
+
): string[] {
|
|
104
|
+
const out = [...scope.add];
|
|
105
|
+
const seen = new Set(out);
|
|
106
|
+
for (const bar of bars) {
|
|
107
|
+
if (bar.sceneId !== scope.sceneId) continue;
|
|
108
|
+
if (bar.right < rect.left || bar.left > rect.right) continue;
|
|
109
|
+
if (bar.bottom < rect.top || bar.top > rect.bottom) continue;
|
|
110
|
+
if (seen.has(bar.layerId)) continue;
|
|
111
|
+
seen.add(bar.layerId);
|
|
112
|
+
out.push(bar.layerId);
|
|
113
|
+
}
|
|
114
|
+
return out;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Every mounted lifespan bar's box, read off the DOM once at the press.
|
|
119
|
+
*
|
|
120
|
+
* THE DOM AND NOT THE MODEL, because the y here is flow layout: rows are 28 or
|
|
121
|
+
* 56 tall, a shot's disclosure adds a block of them, and past the window
|
|
122
|
+
* threshold spacers stand in for the rows that are not mounted. `TimelineDock`
|
|
123
|
+
* has prefix sums over exactly that (`groupHeights`), and rebuilding a second
|
|
124
|
+
* copy of them for this would be a second spelling of the layout that can drift
|
|
125
|
+
* from the first. The element positions cannot drift from themselves.
|
|
126
|
+
*
|
|
127
|
+
* ONCE, at the press: nothing in a marquee moves a row. The dock holds its
|
|
128
|
+
* collapse until the pointer is up (see `onPointerDownCapture` in
|
|
129
|
+
* TimelineDock), selection paints an outline rather than reflowing, and the
|
|
130
|
+
* boxes are content-relative so a follow scroll does not move them.
|
|
131
|
+
*
|
|
132
|
+
* ponytail: a row the virtual window has not mounted has no box and cannot be
|
|
133
|
+
* hit. There is no auto-scroll, so a box can only be drawn over rows that are
|
|
134
|
+
* on screen anyway; add the query per move if auto-scroll ever lands.
|
|
135
|
+
*/
|
|
136
|
+
export function marqueeBars(tracks: HTMLElement): MarqueeBar[] {
|
|
137
|
+
const origin = tracks.getBoundingClientRect();
|
|
138
|
+
const out: MarqueeBar[] = [];
|
|
139
|
+
for (const row of tracks.querySelectorAll<HTMLElement>("[data-lifespan]")) {
|
|
140
|
+
const layerId = row.dataset["lifespan"];
|
|
141
|
+
const sceneId = row.dataset["rowScene"];
|
|
142
|
+
const bar = row.querySelector<HTMLElement>("[data-bar]");
|
|
143
|
+
if (layerId === undefined || sceneId === undefined || bar === null) continue;
|
|
144
|
+
const box = bar.getBoundingClientRect();
|
|
145
|
+
out.push({
|
|
146
|
+
layerId,
|
|
147
|
+
sceneId,
|
|
148
|
+
left: box.left - origin.left,
|
|
149
|
+
top: box.top - origin.top,
|
|
150
|
+
right: box.right - origin.left,
|
|
151
|
+
bottom: box.bottom - origin.top,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
return out;
|
|
155
|
+
}
|