@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,45 @@
|
|
|
1
|
+
// The canvas's right-click menu, as a hook.
|
|
2
|
+
//
|
|
3
|
+
// `StageMenu.tsx`'s shape exactly: the ENTRIES are data and live in
|
|
4
|
+
// `state/menu.ts` beside every other menu in this chrome, and this file is only
|
|
5
|
+
// the part that has to be React — the portal, the anchor point, and turning a
|
|
6
|
+
// hit on the canvas into the `MaterialNodeMenuTargets` the entry builder takes.
|
|
7
|
+
//
|
|
8
|
+
// The split is what keeps `materialGraphMenu.test.ts` able to assert that every
|
|
9
|
+
// row is an existing store verb without mounting a canvas: a menu that built
|
|
10
|
+
// its own JSX would also be a menu that could quietly implement its own edit.
|
|
11
|
+
import { useCallback } from "react";
|
|
12
|
+
import { useContextMenu } from "@dailies-studio/ui";
|
|
13
|
+
import type { MenuPoint } from "@dailies-studio/ui";
|
|
14
|
+
import { useStore } from "../../state/context.js";
|
|
15
|
+
import { materialNodeMenuEntries } from "../../state/menu.js";
|
|
16
|
+
import type { MaterialNodeMenuTargets } from "../../state/menu.js";
|
|
17
|
+
|
|
18
|
+
export interface MaterialGraphMenuHandle {
|
|
19
|
+
/** Render this inside the canvas; it portals to `<body>`. */
|
|
20
|
+
menu: ReturnType<typeof useContextMenu>["menu"];
|
|
21
|
+
/** Open at a CLIENT point, about what the press landed on. */
|
|
22
|
+
open(at: MenuPoint, targets: MaterialNodeMenuTargets): void;
|
|
23
|
+
close(): void;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function useMaterialGraphMenu(): MaterialGraphMenuHandle {
|
|
27
|
+
const store = useStore();
|
|
28
|
+
const menu = useContextMenu();
|
|
29
|
+
const openMenu = menu.open;
|
|
30
|
+
// STABLE, because the canvas's context-menu handlers close over it and React
|
|
31
|
+
// Flow hands those down to every node wrapper: a fresh identity per render
|
|
32
|
+
// would re-render the whole node layer for a callback nobody called.
|
|
33
|
+
const open = useCallback(
|
|
34
|
+
(at: MenuPoint, targets: MaterialNodeMenuTargets) => {
|
|
35
|
+
// Read at OPEN time, `StageMenu`'s rule: the press has already applied
|
|
36
|
+
// its own selection policy by the time this runs, so the entries describe
|
|
37
|
+
// what is actually selected rather than what was when this last rendered.
|
|
38
|
+
const entries = materialNodeMenuEntries(store, store.getState(), targets);
|
|
39
|
+
if (entries.length === 0) return;
|
|
40
|
+
openMenu(at, entries);
|
|
41
|
+
},
|
|
42
|
+
[store, openMenu],
|
|
43
|
+
);
|
|
44
|
+
return { menu: menu.menu, open, close: menu.close };
|
|
45
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// A group box, drawn as a React Flow SUBFLOW.
|
|
2
|
+
//
|
|
3
|
+
// The document stores group membership as `node.groupId` and every position
|
|
4
|
+
// absolute; `flowModel.ts` converts that into React Flow's `parentId` plus a
|
|
5
|
+
// parent-relative position on the way in, and `graphPositionOf` converts it back
|
|
6
|
+
// on the way out. The reason to pay for that conversion at all is that a subflow
|
|
7
|
+
// is the only thing that makes dragging the BOX carry its members: without it,
|
|
8
|
+
// a group is a rectangle drawn behind cards that stay where they were, which is
|
|
9
|
+
// a decoration rather than a way to move a region of a graph.
|
|
10
|
+
//
|
|
11
|
+
// The title is editable in place, and so is the SIZE. The box is born around
|
|
12
|
+
// the members it was built from, but a graph keeps growing after that, and the
|
|
13
|
+
// alternative to a handle was ungrouping and grouping again.
|
|
14
|
+
//
|
|
15
|
+
// ONE HANDLE, bottom-right, not a full `NodeResizer`. A top or left handle
|
|
16
|
+
// moves the box's POSITION as well as its size, which is a second write and so
|
|
17
|
+
// a second undo entry for what the author felt as one drag. The bottom-right
|
|
18
|
+
// corner only ever changes `size`, which `setMaterialComment` commits whole.
|
|
19
|
+
import { memo } from "react";
|
|
20
|
+
import { NodeResizeControl } from "@xyflow/react";
|
|
21
|
+
import type { NodeProps } from "@xyflow/react";
|
|
22
|
+
import { TextField } from "@dailies-studio/ui";
|
|
23
|
+
import { useStore } from "../../state/context.js";
|
|
24
|
+
import type { MaterialFlowNode } from "./flowModel.js";
|
|
25
|
+
|
|
26
|
+
export const MaterialGroupNode = memo(function MaterialGroupNode({
|
|
27
|
+
data,
|
|
28
|
+
selected,
|
|
29
|
+
}: NodeProps<MaterialFlowNode>) {
|
|
30
|
+
const store = useStore();
|
|
31
|
+
const { node, materialId, path } = data;
|
|
32
|
+
return (
|
|
33
|
+
<div className="material-group" data-testid={`material-node-${node.id}`}>
|
|
34
|
+
<div className="material-group-title nodrag nowheel">
|
|
35
|
+
<TextField
|
|
36
|
+
value={node.label ?? "Group"}
|
|
37
|
+
ariaLabel="Group name"
|
|
38
|
+
onCommit={(label) => store.setMaterialComment(materialId, path, node.id, { label })}
|
|
39
|
+
/>
|
|
40
|
+
</div>
|
|
41
|
+
{selected === true ? (
|
|
42
|
+
<NodeResizeControl
|
|
43
|
+
className="material-resize-handle"
|
|
44
|
+
position="bottom-right"
|
|
45
|
+
minWidth={160}
|
|
46
|
+
minHeight={120}
|
|
47
|
+
onResizeEnd={(_event, params) =>
|
|
48
|
+
store.setMaterialComment(materialId, path, node.id, {
|
|
49
|
+
size: [Math.round(params.width), Math.round(params.height)],
|
|
50
|
+
})
|
|
51
|
+
}
|
|
52
|
+
/>
|
|
53
|
+
) : null}
|
|
54
|
+
</div>
|
|
55
|
+
);
|
|
56
|
+
});
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
// THE MATERIAL NODES' LEFT COLUMN: the graphs this Project already has, and
|
|
2
|
+
// the starters a new one is made from.
|
|
3
|
+
//
|
|
4
|
+
// It shows in the docked left column's mode slot (MaterialWorkspace portals it
|
|
5
|
+
// there), so it wears the column's vocabulary: a head one bar tall with the
|
|
6
|
+
// bar's hairline under it, then ONE scroller (`.rail-scroll`) with full-bleed
|
|
7
|
+
// rows. Every row ends at a store verb the rest of the chrome already uses:
|
|
8
|
+
// `assignMeshGraphMaterial` (the inspector's Graph row), `deleteProjectMaterial`
|
|
9
|
+
// and `createMeshGraphMaterial` (the setup screen's starters).
|
|
10
|
+
//
|
|
11
|
+
// THE OPEN SLOT, OR THE WHOLE MODEL. With a submesh open (a model whose whole
|
|
12
|
+
// model already wears a graph), a row binds that submesh alone: the model's
|
|
13
|
+
// own graph puts the submesh back on it, and only that submesh's keyed
|
|
14
|
+
// controls go (`bindGraph` in the store). Otherwise a row binds the whole
|
|
15
|
+
// mesh, which drops every per-slot graph and every keyed material control.
|
|
16
|
+
// Either way:
|
|
17
|
+
//
|
|
18
|
+
// - a row names what it does;
|
|
19
|
+
// - the row marked current (the graph on the canvas) does nothing, and on
|
|
20
|
+
// the whole model neither does the graph it already wears;
|
|
21
|
+
// - a press that would take slot graphs or keyed controls with it asks
|
|
22
|
+
// first, through the house confirm, and names what goes. Undo still
|
|
23
|
+
// brings it back; the confirm is so it never goes unseen.
|
|
24
|
+
import { IconTrash, useConfirm } from "@dailies-studio/ui";
|
|
25
|
+
import {
|
|
26
|
+
isGraphMaterial,
|
|
27
|
+
isMaterialGraphParamPath,
|
|
28
|
+
materialGraphParamAddressOf,
|
|
29
|
+
materialGraphUseCount,
|
|
30
|
+
} from "@dailies-studio/shot/doc";
|
|
31
|
+
import type { Layer3D, MaterialGraph3D, MaterialGraphStarterKind } from "@dailies-studio/shot/doc";
|
|
32
|
+
import { useShotEditor, useStore } from "../../state/context.js";
|
|
33
|
+
|
|
34
|
+
/** The three graphs a new material can start from. The setup screen shows
|
|
35
|
+
* them as cards and this column as rows; one list, so the two cannot offer
|
|
36
|
+
* different starters. */
|
|
37
|
+
export const MATERIAL_STARTERS: readonly {
|
|
38
|
+
id: MaterialGraphStarterKind;
|
|
39
|
+
name: string;
|
|
40
|
+
detail: string;
|
|
41
|
+
}[] = [
|
|
42
|
+
{
|
|
43
|
+
id: "studio",
|
|
44
|
+
name: "Preserve Current",
|
|
45
|
+
detail: "Studio/unlit colour and opacity wired to the mesh's current surface.",
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: "standard",
|
|
49
|
+
name: "Standard",
|
|
50
|
+
detail: "A lit PBR surface with roughness, metalness, emissive and normals.",
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: "glass",
|
|
54
|
+
name: "Glass",
|
|
55
|
+
detail: "Physical transmission with exposed roughness, thickness, IOR and dispersion.",
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
type MeshLayer = Extract<Layer3D, { kind: "mesh" }>;
|
|
60
|
+
|
|
61
|
+
/** What a rebind takes with it, as phrases for the confirm. On one submesh,
|
|
62
|
+
* its own keyed controls; on the whole model, the submeshes' own graphs and
|
|
63
|
+
* every keyed material control. Empty when nothing would go. */
|
|
64
|
+
function rebindLosses(layer: MeshLayer, slot: number | null): string[] {
|
|
65
|
+
const material = layer.mesh.material;
|
|
66
|
+
if (slot !== null) {
|
|
67
|
+
const keyedHere = Object.keys(layer.tracks ?? {}).filter(
|
|
68
|
+
(path) => materialGraphParamAddressOf(path)?.slot === slot,
|
|
69
|
+
).length;
|
|
70
|
+
return keyedHere === 0 ? [] : [`${keyedHere} keyed material ${keyedHere === 1 ? "control" : "controls"} on it`];
|
|
71
|
+
}
|
|
72
|
+
const slots = isGraphMaterial(material) ? Object.keys(material.slots ?? {}).length : 0;
|
|
73
|
+
const keyed = Object.keys(layer.tracks ?? {}).filter((path) => isMaterialGraphParamPath(path)).length;
|
|
74
|
+
const losses: string[] = [];
|
|
75
|
+
if (slots > 0) {
|
|
76
|
+
losses.push(slots === 1 ? "the graph on 1 submesh" : `the graphs on ${slots} submeshes`);
|
|
77
|
+
}
|
|
78
|
+
if (keyed > 0) {
|
|
79
|
+
losses.push(`${keyed} keyed material ${keyed === 1 ? "control" : "controls"}`);
|
|
80
|
+
}
|
|
81
|
+
return losses;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** The slot a rebind lands on: the open submesh only on top of a whole-model
|
|
85
|
+
* graph (`bindGraph` in the store), otherwise the whole model. */
|
|
86
|
+
export function rebindTarget(layer: MeshLayer, slot: number | null): number | null {
|
|
87
|
+
return slot !== null && isGraphMaterial(layer.mesh.material) ? slot : null;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** A rebind for every surface that swaps a mesh's graph (this column and the
|
|
91
|
+
* inspector's Graph row): straight through when it takes nothing with it,
|
|
92
|
+
* otherwise asked first through the house confirm, naming what goes. `run`
|
|
93
|
+
* gets the slot the rebind lands on. Render `dialog`. */
|
|
94
|
+
export function useRebindGraph() {
|
|
95
|
+
const { confirm, dialog } = useConfirm();
|
|
96
|
+
const rebind = (
|
|
97
|
+
layer: MeshLayer,
|
|
98
|
+
layerName: string,
|
|
99
|
+
slot: number | null,
|
|
100
|
+
what: string,
|
|
101
|
+
run: (target: number | null) => void,
|
|
102
|
+
): void => {
|
|
103
|
+
const target = rebindTarget(layer, slot);
|
|
104
|
+
const losses = rebindLosses(layer, target);
|
|
105
|
+
if (losses.length === 0) {
|
|
106
|
+
run(target);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const where = target === null ? `all of ${layerName}` : "this submesh";
|
|
110
|
+
void confirm({
|
|
111
|
+
title: "Replace the material",
|
|
112
|
+
message: `Put ${what} on ${where}? This also removes ${losses.join(" and ")}. Undo brings them back.`,
|
|
113
|
+
confirmLabel: "Replace",
|
|
114
|
+
danger: true,
|
|
115
|
+
}).then((yes) => {
|
|
116
|
+
if (yes) run(target);
|
|
117
|
+
});
|
|
118
|
+
};
|
|
119
|
+
return { rebind, confirm, dialog };
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function MaterialLibrary({
|
|
123
|
+
layer,
|
|
124
|
+
layerName,
|
|
125
|
+
currentId,
|
|
126
|
+
slot,
|
|
127
|
+
}: {
|
|
128
|
+
layer: MeshLayer;
|
|
129
|
+
layerName: string;
|
|
130
|
+
/** The graph the open slot resolves to, or null while the mesh has none. */
|
|
131
|
+
currentId: string | null;
|
|
132
|
+
/** The submesh the workspace is open on, or null for the whole model. */
|
|
133
|
+
slot: number | null;
|
|
134
|
+
}) {
|
|
135
|
+
const store = useStore();
|
|
136
|
+
const doc = useShotEditor((state) => state.doc);
|
|
137
|
+
const { rebind, confirm, dialog } = useRebindGraph();
|
|
138
|
+
if (doc === null) return null;
|
|
139
|
+
const saved: MaterialGraph3D[] = Object.values(doc.materials ?? {}).sort((a, b) =>
|
|
140
|
+
a.name.localeCompare(b.name),
|
|
141
|
+
);
|
|
142
|
+
/** The graph the whole model wears. */
|
|
143
|
+
const wholeId = isGraphMaterial(layer.mesh.material) ? layer.mesh.material.materialId : null;
|
|
144
|
+
const target = rebindTarget(layer, slot);
|
|
145
|
+
const where = target === null ? `all of ${layerName}` : "this submesh";
|
|
146
|
+
|
|
147
|
+
return (
|
|
148
|
+
<section className="material-library" aria-label="Materials">
|
|
149
|
+
<div className="material-library-head">
|
|
150
|
+
<h2 className="material-library-title">Materials</h2>
|
|
151
|
+
</div>
|
|
152
|
+
<div className="rail-scroll">
|
|
153
|
+
<h3 className="material-library-group">In this Project</h3>
|
|
154
|
+
{saved.length === 0 ? (
|
|
155
|
+
<p className="insp-empty">No saved graphs yet. Start one from the list below.</p>
|
|
156
|
+
) : (
|
|
157
|
+
<ul className="material-library-list" aria-label="Saved graphs">
|
|
158
|
+
{saved.map((material) => {
|
|
159
|
+
const usage = materialGraphUseCount(doc, material.id);
|
|
160
|
+
const current = material.id === currentId;
|
|
161
|
+
// A press that would change nothing: the graph on the canvas, or
|
|
162
|
+
// on the whole model the one it already wears (the verb skips it).
|
|
163
|
+
// On a submesh the model's own graph is a real press: it puts the
|
|
164
|
+
// submesh back on it.
|
|
165
|
+
const inert = current || (target === null && material.id === wholeId);
|
|
166
|
+
return (
|
|
167
|
+
<li key={material.id} className={`material-saved-row${current ? " is-current" : ""}`}>
|
|
168
|
+
<button
|
|
169
|
+
type="button"
|
|
170
|
+
className="material-saved-apply"
|
|
171
|
+
aria-current={current}
|
|
172
|
+
aria-disabled={inert || undefined}
|
|
173
|
+
title={
|
|
174
|
+
current
|
|
175
|
+
? `${target === null ? layerName : "This submesh"} wears this graph`
|
|
176
|
+
: target !== null && material.id === wholeId
|
|
177
|
+
? `Put this submesh back on ${layerName}'s own graph`
|
|
178
|
+
: `Put this graph on ${where}`
|
|
179
|
+
}
|
|
180
|
+
onClick={
|
|
181
|
+
inert
|
|
182
|
+
? undefined
|
|
183
|
+
: () =>
|
|
184
|
+
rebind(layer, layerName, slot, `“${material.name}”`, (to) =>
|
|
185
|
+
store.assignMeshGraphMaterial(layer.id, material.id, to),
|
|
186
|
+
)
|
|
187
|
+
}
|
|
188
|
+
>
|
|
189
|
+
<span className={`material-model-mark is-${material.model}`} aria-hidden="true" />
|
|
190
|
+
<span className="material-saved-text">
|
|
191
|
+
<strong>{material.name}</strong>
|
|
192
|
+
<small>
|
|
193
|
+
{material.model} · {Object.keys(material.nodesById).length} nodes · {usage}{" "}
|
|
194
|
+
{usage === 1 ? "use" : "uses"}
|
|
195
|
+
</small>
|
|
196
|
+
</span>
|
|
197
|
+
</button>
|
|
198
|
+
{/* Only an unused graph offers a delete: `deleteProjectMaterial`
|
|
199
|
+
refuses one a mesh still wears, and a button that always
|
|
200
|
+
refuses is furniture. */}
|
|
201
|
+
{usage === 0 ? (
|
|
202
|
+
<button
|
|
203
|
+
type="button"
|
|
204
|
+
className="material-saved-delete"
|
|
205
|
+
aria-label={`Delete ${material.name}`}
|
|
206
|
+
title="Delete this unused graph from the Project"
|
|
207
|
+
onClick={() =>
|
|
208
|
+
void confirm({
|
|
209
|
+
title: "Delete material",
|
|
210
|
+
message: `Delete “${material.name}” from this Project? No mesh uses it.`,
|
|
211
|
+
confirmLabel: "Delete",
|
|
212
|
+
danger: true,
|
|
213
|
+
}).then((yes) => {
|
|
214
|
+
if (yes) store.deleteProjectMaterial(material.id);
|
|
215
|
+
})
|
|
216
|
+
}
|
|
217
|
+
>
|
|
218
|
+
<IconTrash />
|
|
219
|
+
</button>
|
|
220
|
+
) : null}
|
|
221
|
+
</li>
|
|
222
|
+
);
|
|
223
|
+
})}
|
|
224
|
+
</ul>
|
|
225
|
+
)}
|
|
226
|
+
<h3 className="material-library-group">New from</h3>
|
|
227
|
+
<ul className="material-library-list" aria-label="New material starters">
|
|
228
|
+
{MATERIAL_STARTERS.map((starter) => (
|
|
229
|
+
<li key={starter.id} className="material-saved-row">
|
|
230
|
+
<button
|
|
231
|
+
type="button"
|
|
232
|
+
className="material-saved-apply"
|
|
233
|
+
title={starter.detail}
|
|
234
|
+
onClick={() =>
|
|
235
|
+
rebind(layer, layerName, slot, `a new ${starter.name} graph`, (to) =>
|
|
236
|
+
store.createMeshGraphMaterial(layer.id, starter.id, to),
|
|
237
|
+
)
|
|
238
|
+
}
|
|
239
|
+
>
|
|
240
|
+
<span className={`material-starter-orb is-${starter.id}`} aria-hidden="true" />
|
|
241
|
+
<span className="material-saved-text">
|
|
242
|
+
<strong>{starter.name}</strong>
|
|
243
|
+
<small>{starter.detail}</small>
|
|
244
|
+
</span>
|
|
245
|
+
</button>
|
|
246
|
+
</li>
|
|
247
|
+
))}
|
|
248
|
+
</ul>
|
|
249
|
+
</div>
|
|
250
|
+
{dialog}
|
|
251
|
+
</section>
|
|
252
|
+
);
|
|
253
|
+
}
|