@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,349 @@
|
|
|
1
|
+
// The Add-node list, at the cursor.
|
|
2
|
+
//
|
|
3
|
+
// ── WHY IT MOVED OFF THE TOOLBAR ────────────────────────────────────────
|
|
4
|
+
//
|
|
5
|
+
// v1 pinned it under a button in the canvas's top-left corner. Every node
|
|
6
|
+
// therefore arrived in the top-left corner too, and the author's next gesture
|
|
7
|
+
// was always the same: drag it to where they had been looking. A palette that
|
|
8
|
+
// opens where the pointer is, and drops the node there, removes that gesture
|
|
9
|
+
// entirely — which is why every node editor an author has used works this way.
|
|
10
|
+
// The bar's Add node button came back as the DISCOVERABLE opener only: it asks
|
|
11
|
+
// with no point, like Tab, so its node lands in the middle, not the corner.
|
|
12
|
+
//
|
|
13
|
+
// ── THE FOUR OPENERS, AND WHY THE WIRE DROP IS THE IMPORTANT ONE ────────
|
|
14
|
+
//
|
|
15
|
+
// Tab / ⇧A / the bar's Add node — the keymap's `graphPalette` or
|
|
16
|
+
// `openMaterialPalette(null)`, with no point, so the node lands wherever
|
|
17
|
+
// the canvas considers the middle.
|
|
18
|
+
// Double-click on empty pane — the point is the pointer.
|
|
19
|
+
// A WIRE DROPPED IN EMPTY SPACE — the point is where it was let go, and the
|
|
20
|
+
// palette is FILTERED to the kinds that could actually take that wire, then
|
|
21
|
+
// auto-wires the one that is picked (`addMaterialNode`'s `from`).
|
|
22
|
+
//
|
|
23
|
+
// The wire drop is the one that makes a graph fast to build: "I want something that
|
|
24
|
+
// eats this vec3" is the question an author actually has, and answering it by
|
|
25
|
+
// listing 114 kinds and letting them find out by being refused is the failure
|
|
26
|
+
// this filter removes.
|
|
27
|
+
import { useEffect, useMemo, useRef, useState } from "react";
|
|
28
|
+
import {
|
|
29
|
+
MATERIAL_GRAPH_GENERATORS,
|
|
30
|
+
MATERIAL_GRAPH_NODE_SPECS,
|
|
31
|
+
socketAccepts,
|
|
32
|
+
} from "@dailies-studio/shot/doc";
|
|
33
|
+
import type {
|
|
34
|
+
MaterialGraphNodeCategory,
|
|
35
|
+
MaterialGraphNodeKind,
|
|
36
|
+
MaterialGraphNodeSpec,
|
|
37
|
+
MaterialGraphResolvedType,
|
|
38
|
+
MaterialGraphSocketSpec,
|
|
39
|
+
} from "@dailies-studio/shot/doc";
|
|
40
|
+
import { useStore } from "../../state/context.js";
|
|
41
|
+
import type { MaterialPaletteRequest, MaterialPaletteSource } from "../../state/types.js";
|
|
42
|
+
|
|
43
|
+
/** Shelf order. A category this build does not know cannot exist (the union is
|
|
44
|
+
* closed), so this is a total ordering rather than a preference with a
|
|
45
|
+
* fallback — but the sort still appends an unlisted one rather than dropping
|
|
46
|
+
* it, because a vanished node is a worse bug than a misplaced shelf. */
|
|
47
|
+
const CATEGORY_ORDER: readonly MaterialGraphNodeCategory[] = [
|
|
48
|
+
"input",
|
|
49
|
+
"source",
|
|
50
|
+
"geometry",
|
|
51
|
+
"uv",
|
|
52
|
+
"math",
|
|
53
|
+
"vector",
|
|
54
|
+
"construct",
|
|
55
|
+
"logic",
|
|
56
|
+
"color",
|
|
57
|
+
"noise",
|
|
58
|
+
"generator",
|
|
59
|
+
"texture",
|
|
60
|
+
"function",
|
|
61
|
+
"editor",
|
|
62
|
+
"output",
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
const CATEGORY_LABELS: Record<MaterialGraphNodeCategory, string> = {
|
|
66
|
+
source: "Surface",
|
|
67
|
+
input: "Input",
|
|
68
|
+
geometry: "Geometry",
|
|
69
|
+
math: "Math",
|
|
70
|
+
vector: "Vector",
|
|
71
|
+
construct: "Construct",
|
|
72
|
+
logic: "Logic",
|
|
73
|
+
color: "Colour",
|
|
74
|
+
noise: "Noise",
|
|
75
|
+
generator: "Materials",
|
|
76
|
+
uv: "UV",
|
|
77
|
+
texture: "Texture",
|
|
78
|
+
function: "Function",
|
|
79
|
+
editor: "Editor",
|
|
80
|
+
output: "Output",
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* The kinds a palette may ever offer.
|
|
85
|
+
*
|
|
86
|
+
* The output node is excluded because a graph has exactly one and already has
|
|
87
|
+
* it. The three FUNCTION kinds are excluded because each is half of a boundary
|
|
88
|
+
* that Collapse and Expand create together — one added on its own is a card
|
|
89
|
+
* whose sockets name a signature nothing declared. `group` is excluded because
|
|
90
|
+
* a box with nothing in it is not a thing an author wants; Group acts on a
|
|
91
|
+
* selection. Every one of those is also refused by `addMaterialNode`, so this
|
|
92
|
+
* is the menu agreeing with the door rather than a second rule.
|
|
93
|
+
*/
|
|
94
|
+
const HIDDEN: ReadonlySet<MaterialGraphNodeKind> = new Set<MaterialGraphNodeKind>([
|
|
95
|
+
"subgraph",
|
|
96
|
+
"fn-input",
|
|
97
|
+
"fn-output",
|
|
98
|
+
"group",
|
|
99
|
+
]);
|
|
100
|
+
|
|
101
|
+
export interface MaterialPaletteRow {
|
|
102
|
+
kind: MaterialGraphNodeKind;
|
|
103
|
+
label: string;
|
|
104
|
+
category: MaterialGraphNodeCategory;
|
|
105
|
+
/** Set only on the synthesised generator rows: which of the tsl-textures
|
|
106
|
+
* materials the `tsl-texture` card this row adds should run. */
|
|
107
|
+
generator?: string;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* `tsl-texture` is skipped here because the loop below offers it FORTY TIMES
|
|
112
|
+
* OVER, once per generator. Bare, it would be a card whose sockets appear only
|
|
113
|
+
* after the author works out that a dropdown decides them — the opposite of
|
|
114
|
+
* what a palette is for. Unlike `HIDDEN`, this is not a kind the door refuses;
|
|
115
|
+
* it is a kind that arrives by a better row.
|
|
116
|
+
*/
|
|
117
|
+
function offerable(spec: MaterialGraphNodeSpec): boolean {
|
|
118
|
+
return spec.category !== "output" && !HIDDEN.has(spec.kind) && spec.kind !== "tsl-texture";
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/** Does any of a row's searchable text contain what was typed? */
|
|
122
|
+
function matches(needle: string, terms: readonly (string | undefined)[]): boolean {
|
|
123
|
+
return (
|
|
124
|
+
needle === "" || terms.some((term) => term !== undefined && term.toLowerCase().includes(needle))
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Could a wire held at `from` land on these sockets at all?
|
|
130
|
+
*
|
|
131
|
+
* Takes the SOCKETS rather than the spec, because a generator row's sockets are
|
|
132
|
+
* its generator's parameter list — the `tsl-texture` spec's own inputs are
|
|
133
|
+
* empty until a generator is named, and judging forty rows by that would offer
|
|
134
|
+
* every one of them to a wire none of them could take.
|
|
135
|
+
*
|
|
136
|
+
* `"numeric"` on either side is the GENERIC and matches anything that is not a
|
|
137
|
+
* texture handle: `socketAccepts` takes a RESOLVED type as its second argument
|
|
138
|
+
* and `numeric` is not one, so asking it directly would be a type error dressed
|
|
139
|
+
* up as a filter that hid every generic node.
|
|
140
|
+
*/
|
|
141
|
+
function acceptsWire(
|
|
142
|
+
io: { inputs: readonly MaterialGraphSocketSpec[]; outputs: readonly MaterialGraphSocketSpec[] },
|
|
143
|
+
from: MaterialPaletteSource,
|
|
144
|
+
): boolean {
|
|
145
|
+
const generic = from.type === "numeric";
|
|
146
|
+
if (from.side === "source") {
|
|
147
|
+
// The author holds an OUTPUT and wants something to feed.
|
|
148
|
+
return io.inputs.some((input) =>
|
|
149
|
+
generic
|
|
150
|
+
? input.type !== "texture"
|
|
151
|
+
: socketAccepts(input.type, from.type as MaterialGraphResolvedType, input.accepts),
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
// The author holds an INPUT and wants something to produce.
|
|
155
|
+
return io.outputs.some((output) => {
|
|
156
|
+
if (output.type === "numeric") return from.type !== "texture";
|
|
157
|
+
if (generic) return output.type !== "texture";
|
|
158
|
+
return socketAccepts(from.type, output.type as MaterialGraphResolvedType);
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* The list, filtered. A pure function so `materialPalette.test.tsx` can check
|
|
164
|
+
* both halves — the keyword search and the socket filter — without a canvas.
|
|
165
|
+
*
|
|
166
|
+
* Search matches the LABEL, the kind's own id, its category and its declared
|
|
167
|
+
* keywords. The keywords are what an author would type: `1-x` finds One Minus,
|
|
168
|
+
* `voronoi` finds Worley, `if` finds Select.
|
|
169
|
+
*
|
|
170
|
+
* The second loop is the tsl-textures library. It is ONE node kind carrying a
|
|
171
|
+
* `generator` field, but an author looking for marble types "marble" and not
|
|
172
|
+
* "texture generator", so the palette synthesises a row per material and the
|
|
173
|
+
* pick carries the name through to the door. Each row also answers to the
|
|
174
|
+
* kind's own terms, so "procedural" still surfaces the whole shelf.
|
|
175
|
+
*/
|
|
176
|
+
export function materialPaletteRows(
|
|
177
|
+
query: string,
|
|
178
|
+
from?: MaterialPaletteSource,
|
|
179
|
+
): MaterialPaletteRow[] {
|
|
180
|
+
const needle = query.trim().toLowerCase();
|
|
181
|
+
const rows: MaterialPaletteRow[] = [];
|
|
182
|
+
for (const spec of Object.values(MATERIAL_GRAPH_NODE_SPECS)) {
|
|
183
|
+
if (!offerable(spec)) continue;
|
|
184
|
+
if (from !== undefined && !acceptsWire(spec, from)) continue;
|
|
185
|
+
if (!matches(needle, [spec.label, spec.kind, spec.category, ...(spec.keywords ?? [])])) continue;
|
|
186
|
+
rows.push({ kind: spec.kind, label: spec.label, category: spec.category });
|
|
187
|
+
}
|
|
188
|
+
const tsl = MATERIAL_GRAPH_NODE_SPECS["tsl-texture"];
|
|
189
|
+
for (const [generator, entry] of Object.entries(MATERIAL_GRAPH_GENERATORS)) {
|
|
190
|
+
if (from !== undefined && !acceptsWire({ inputs: entry.inputs, outputs: tsl.outputs }, from)) {
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
if (
|
|
194
|
+
!matches(needle, [
|
|
195
|
+
entry.label,
|
|
196
|
+
generator,
|
|
197
|
+
tsl.label,
|
|
198
|
+
tsl.category,
|
|
199
|
+
...(entry.keywords ?? []),
|
|
200
|
+
...(tsl.keywords ?? []),
|
|
201
|
+
])
|
|
202
|
+
) {
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
rows.push({ kind: "tsl-texture", label: entry.label, category: tsl.category, generator });
|
|
206
|
+
}
|
|
207
|
+
return rows.sort((a, b) => {
|
|
208
|
+
const ai = CATEGORY_ORDER.indexOf(a.category);
|
|
209
|
+
const bi = CATEGORY_ORDER.indexOf(b.category);
|
|
210
|
+
const ao = ai < 0 ? CATEGORY_ORDER.length : ai;
|
|
211
|
+
const bo = bi < 0 ? CATEGORY_ORDER.length : bi;
|
|
212
|
+
return ao === bo ? a.label.localeCompare(b.label) : ao - bo;
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
export interface MaterialNodePaletteProps {
|
|
217
|
+
materialId: string;
|
|
218
|
+
path: readonly string[];
|
|
219
|
+
request: MaterialPaletteRequest;
|
|
220
|
+
/** Where the list sits, in CLIENT px — the canvas converts the request's
|
|
221
|
+
* graph point, because only it knows the viewport transform. */
|
|
222
|
+
screenAt: { x: number; y: number };
|
|
223
|
+
/** Where the picked node lands, in GRAPH px. */
|
|
224
|
+
graphAt: readonly [number, number];
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
export function MaterialNodePalette({
|
|
228
|
+
materialId,
|
|
229
|
+
path,
|
|
230
|
+
request,
|
|
231
|
+
screenAt,
|
|
232
|
+
graphAt,
|
|
233
|
+
}: MaterialNodePaletteProps) {
|
|
234
|
+
const store = useStore();
|
|
235
|
+
const [query, setQuery] = useState("");
|
|
236
|
+
const [active, setActive] = useState(0);
|
|
237
|
+
const listRef = useRef<HTMLDivElement | null>(null);
|
|
238
|
+
const rows = useMemo(() => materialPaletteRows(query, request.from), [query, request.from]);
|
|
239
|
+
|
|
240
|
+
// A new request is a new palette. `materialPalette` is a fresh-identity
|
|
241
|
+
// mailbox, so this fires on the second Tab at the same point too — which is
|
|
242
|
+
// what makes re-opening feel like re-opening rather than like nothing.
|
|
243
|
+
useEffect(() => {
|
|
244
|
+
setQuery("");
|
|
245
|
+
setActive(0);
|
|
246
|
+
}, [request]);
|
|
247
|
+
|
|
248
|
+
useEffect(() => {
|
|
249
|
+
setActive((current) => (current >= rows.length ? Math.max(0, rows.length - 1) : current));
|
|
250
|
+
}, [rows.length]);
|
|
251
|
+
|
|
252
|
+
// The active row scrolled into view, so holding ArrowDown walks the list
|
|
253
|
+
// rather than walking off the bottom of it.
|
|
254
|
+
useEffect(() => {
|
|
255
|
+
const row = listRef.current?.querySelector<HTMLElement>("[data-active='true']");
|
|
256
|
+
// jsdom implements no `scrollIntoView`, and a runtime guard here is cheaper
|
|
257
|
+
// than a stub every suite that mounts a palette would have to install.
|
|
258
|
+
if (typeof row?.scrollIntoView === "function") row.scrollIntoView({ block: "nearest" });
|
|
259
|
+
}, [active]);
|
|
260
|
+
|
|
261
|
+
const pick = (row: MaterialPaletteRow): void => {
|
|
262
|
+
store.addMaterialNode(
|
|
263
|
+
materialId,
|
|
264
|
+
path,
|
|
265
|
+
row.kind,
|
|
266
|
+
[graphAt[0], graphAt[1]],
|
|
267
|
+
request.from,
|
|
268
|
+
row.generator,
|
|
269
|
+
);
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
let shelf: MaterialGraphNodeCategory | null = null;
|
|
273
|
+
return (
|
|
274
|
+
<div
|
|
275
|
+
className="material-node-palette nodrag nowheel"
|
|
276
|
+
role="dialog"
|
|
277
|
+
aria-label="Add shader node"
|
|
278
|
+
data-testid="material-node-palette"
|
|
279
|
+
style={{ left: `${screenAt.x}px`, top: `${screenAt.y}px` }}
|
|
280
|
+
>
|
|
281
|
+
<input
|
|
282
|
+
autoFocus
|
|
283
|
+
type="search"
|
|
284
|
+
className="material-node-search"
|
|
285
|
+
value={query}
|
|
286
|
+
placeholder={request.from === undefined ? "Search nodes" : "Search nodes that fit"}
|
|
287
|
+
aria-label="Search shader nodes"
|
|
288
|
+
onChange={(event) => setQuery(event.currentTarget.value)}
|
|
289
|
+
onKeyDown={(event) => {
|
|
290
|
+
if (event.key === "ArrowDown") {
|
|
291
|
+
event.preventDefault();
|
|
292
|
+
setActive((current) => (rows.length === 0 ? 0 : (current + 1) % rows.length));
|
|
293
|
+
} else if (event.key === "ArrowUp") {
|
|
294
|
+
event.preventDefault();
|
|
295
|
+
setActive((current) => (rows.length === 0 ? 0 : (current - 1 + rows.length) % rows.length));
|
|
296
|
+
} else if (event.key === "Enter") {
|
|
297
|
+
event.preventDefault();
|
|
298
|
+
const row = rows[active];
|
|
299
|
+
if (row !== undefined) pick(row);
|
|
300
|
+
} else if (event.key === "Escape") {
|
|
301
|
+
// STOPPED HERE. The shell's keymap listens on `window`, and letting
|
|
302
|
+
// Escape reach it would run the whole material ladder — closing the
|
|
303
|
+
// palette AND dropping the selection behind it, two rungs for one
|
|
304
|
+
// press.
|
|
305
|
+
event.preventDefault();
|
|
306
|
+
event.stopPropagation();
|
|
307
|
+
store.closeMaterialPalette();
|
|
308
|
+
}
|
|
309
|
+
}}
|
|
310
|
+
/>
|
|
311
|
+
<div className="material-node-palette-scroll" ref={listRef}>
|
|
312
|
+
{rows.length === 0 ? (
|
|
313
|
+
<p className="material-empty-copy">
|
|
314
|
+
{request.from === undefined
|
|
315
|
+
? `No node matches “${query.trim()}”.`
|
|
316
|
+
: "No node takes that connection."}
|
|
317
|
+
</p>
|
|
318
|
+
) : (
|
|
319
|
+
rows.map((row, index) => {
|
|
320
|
+
const heading = row.category === shelf ? null : (
|
|
321
|
+
<h3 key={`shelf-${row.category}`}>{CATEGORY_LABELS[row.category]}</h3>
|
|
322
|
+
);
|
|
323
|
+
shelf = row.category;
|
|
324
|
+
return (
|
|
325
|
+
<div className="material-node-category" key={row.generator ?? row.kind}>
|
|
326
|
+
{heading}
|
|
327
|
+
<button
|
|
328
|
+
type="button"
|
|
329
|
+
data-active={index === active}
|
|
330
|
+
className={index === active ? "is-active" : ""}
|
|
331
|
+
// POINTER-DOWN, not click. The search field has focus and a
|
|
332
|
+
// click fires after the blur, which is one more chance for
|
|
333
|
+
// the palette to close under the cursor before the pick lands.
|
|
334
|
+
onPointerDown={(event) => {
|
|
335
|
+
event.preventDefault();
|
|
336
|
+
pick(row);
|
|
337
|
+
}}
|
|
338
|
+
onMouseEnter={() => setActive(index)}
|
|
339
|
+
>
|
|
340
|
+
<span>{row.label}</span>
|
|
341
|
+
</button>
|
|
342
|
+
</div>
|
|
343
|
+
);
|
|
344
|
+
})
|
|
345
|
+
)}
|
|
346
|
+
</div>
|
|
347
|
+
</div>
|
|
348
|
+
);
|
|
349
|
+
}
|