@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,474 @@
|
|
|
1
|
+
// The board's app-drawn stills: one picture per Shot and frame, and one per
|
|
2
|
+
// storyboard sketch, drawn on demand and kept only as object URLs in this
|
|
3
|
+
// page. Never stored as files.
|
|
4
|
+
//
|
|
5
|
+
// ── WHERE THEY ARE DRAWN ─────────────────────────────────────────────────
|
|
6
|
+
//
|
|
7
|
+
// On the tab's still stage (stillStage.ts `tabStillStage`), through that
|
|
8
|
+
// stage's own bridge `captureFrame`, at `storyboardStillSize`. A Shot is drawn
|
|
9
|
+
// from `sliceShotToScene` at the Shot-local frame (a slice's master frame is
|
|
10
|
+
// its local one). A SKETCH is drawn from `sketchStageDoc`, the converter the
|
|
11
|
+
// shot board's Play and the agent's `screenshot_shot { sketch }` run, at the
|
|
12
|
+
// sketch's own frame, its code components bound by the chrome's rule
|
|
13
|
+
// (`sketchBinding`): so a card shows the sketch as the stage draws it, the
|
|
14
|
+
// same picture the agent sees. Never on the author's stage: loading a slice
|
|
15
|
+
// there would swap what they look at. Never through
|
|
16
|
+
// `captureShotFrameToStoryboard`, which takes the export lock, and never
|
|
17
|
+
// through the capture HTTP route.
|
|
18
|
+
//
|
|
19
|
+
// ── ONE AT A TIME, AND ALWAYS LAST ───────────────────────────────────────
|
|
20
|
+
//
|
|
21
|
+
// One serial queue for both kinds. Each draw is a background capture, so a
|
|
22
|
+
// relayed agent still (store mcpRelay.ts gives it 90 s) never waits behind
|
|
23
|
+
// thumbnails: the thumbnail steps aside and is asked for again a moment
|
|
24
|
+
// later. Nothing is drawn while the author plays, exports or looks at another
|
|
25
|
+
// tab, and a draw in flight when they start is abandoned and queued again.
|
|
26
|
+
// Each draw is bounded by `STILL_READY_MS`; one that runs past it is a failed
|
|
27
|
+
// thumbnail.
|
|
28
|
+
//
|
|
29
|
+
// ── WHAT A PICTURE IS KEYED ON ───────────────────────────────────────────
|
|
30
|
+
//
|
|
31
|
+
// A Shot: the Shot, the frame, the size, and the Shot's drawn identity, a
|
|
32
|
+
// counter per Shot bumped whenever `changedShots` (drawn.ts) says a write may
|
|
33
|
+
// have changed its picture, or `shotsPlacing` says a code save reached it. A
|
|
34
|
+
// planning-only write (the storyboard, a still's frame list) bumps nothing,
|
|
35
|
+
// so the board keeps every picture it has.
|
|
36
|
+
//
|
|
37
|
+
// A sketch: the sketch itself, what it cites (its cards, their assets, a
|
|
38
|
+
// cited definition with every definition, asset and material graph it places,
|
|
39
|
+
// `defClosureOf`), the brand colour and font its text and accent read, the
|
|
40
|
+
// part's length and the Project's size and fps, and the same code-save signal
|
|
41
|
+
// for the modules its code components (`sketchCodeComponents`) and cited
|
|
42
|
+
// definitions, nested ones included, place. No content hash: the inputs are
|
|
43
|
+
// the key.
|
|
44
|
+
//
|
|
45
|
+
// A stale picture is still shown while its redraw waits, and draws wait for
|
|
46
|
+
// edits to settle.
|
|
47
|
+
//
|
|
48
|
+
// ── EVERY FAILURE IS SILENT ──────────────────────────────────────────────
|
|
49
|
+
//
|
|
50
|
+
// As with posters (posterCapture.ts), a thumbnail is decoration: a failure is
|
|
51
|
+
// a status the board may show, never a thrown error.
|
|
52
|
+
import {
|
|
53
|
+
changedShots,
|
|
54
|
+
defClosureOf,
|
|
55
|
+
instanceModuleOf,
|
|
56
|
+
shotsPlacing,
|
|
57
|
+
sketchCardOf,
|
|
58
|
+
sketchCodeComponents,
|
|
59
|
+
sketchStageDoc,
|
|
60
|
+
sliceShotToScene,
|
|
61
|
+
storyboardStillSize,
|
|
62
|
+
} from "@dailies-studio/shot/doc";
|
|
63
|
+
import type {
|
|
64
|
+
DefClosure,
|
|
65
|
+
Doc3D,
|
|
66
|
+
ReferenceItem3D,
|
|
67
|
+
SketchBindingFor,
|
|
68
|
+
StoryboardPart3D,
|
|
69
|
+
StoryboardSketch3D,
|
|
70
|
+
} from "@dailies-studio/shot/doc";
|
|
71
|
+
import { STILL_READY_MS, stillYielded, tabStillStage } from "./stillStage.js";
|
|
72
|
+
import type { StillStage } from "./stillStage.js";
|
|
73
|
+
|
|
74
|
+
/** Exactly what this module reads from the store, structural as in
|
|
75
|
+
* posterCapture.ts so a test double needs only these. */
|
|
76
|
+
export interface StillThumbsStore {
|
|
77
|
+
getState(): { doc: Doc3D | null; playing: boolean; exportLock: unknown };
|
|
78
|
+
/** The COLD lane: the document, Play and the export lock are never a
|
|
79
|
+
* transport tick. */
|
|
80
|
+
subscribeCold(listener: () => void): () => void;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export type StillThumb =
|
|
84
|
+
| { readonly status: "ready"; readonly url: string }
|
|
85
|
+
/** `url` is the older picture, shown while the redraw waits. */
|
|
86
|
+
| { readonly status: "pending"; readonly url?: string }
|
|
87
|
+
| { readonly status: "failed"; readonly message: string; readonly url?: string };
|
|
88
|
+
|
|
89
|
+
export interface StillThumbsDeps {
|
|
90
|
+
store: StillThumbsStore;
|
|
91
|
+
/** Default: the tab's still stage. */
|
|
92
|
+
stage?: () => StillStage;
|
|
93
|
+
/** A sketch's code components, bound as a placed one would be (the
|
|
94
|
+
* chrome's `contractBinding`), read when the sketch is drawn. Absent:
|
|
95
|
+
* unbound. */
|
|
96
|
+
sketchBinding?: SketchBindingFor;
|
|
97
|
+
/** Loads the contracts of a sketch's code components before it is staged,
|
|
98
|
+
* so `sketchBinding` has them. Absent: nothing to load. */
|
|
99
|
+
loadContracts?: (componentIds: readonly string[]) => Promise<unknown>;
|
|
100
|
+
setTimeout?: (fn: () => void, ms: number) => unknown;
|
|
101
|
+
clearTimeout?: (handle: unknown) => void;
|
|
102
|
+
hidden?: () => boolean;
|
|
103
|
+
onVisibilityChange?: (listener: () => void) => () => void;
|
|
104
|
+
createObjectURL?: (blob: Blob) => string;
|
|
105
|
+
revokeObjectURL?: (url: string) => void;
|
|
106
|
+
maxEntries?: number;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export interface StillThumbs {
|
|
110
|
+
/** The picture of `sceneId` at Shot-local `frame`, queueing a draw when it
|
|
111
|
+
* has none or an older one. Null with no document or no such Shot. */
|
|
112
|
+
thumb(sceneId: string, frame: number): StillThumb | null;
|
|
113
|
+
/** The picture of one storyboard sketch as the stage draws it, queueing a
|
|
114
|
+
* draw the same way. Null with no document or no such sketch. */
|
|
115
|
+
sketch(partId: string, sketchId: string): StillThumb | null;
|
|
116
|
+
/** Called after each change to what `thumb` answers. Returns the
|
|
117
|
+
* unsubscribe. */
|
|
118
|
+
subscribe(listener: () => void): () => void;
|
|
119
|
+
/** After a code save of `files`: every Shot and sketch placing them is
|
|
120
|
+
* redrawn. */
|
|
121
|
+
codeSaved(files: readonly string[]): void;
|
|
122
|
+
dispose(): void;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** How long edits must stop before a redraw starts. */
|
|
126
|
+
const SETTLE_MS = 500;
|
|
127
|
+
/** How long a draw that stepped aside waits before it asks again. */
|
|
128
|
+
const YIELD_MS = 1_000;
|
|
129
|
+
// ponytail: a fixed cap; a board showing more pictures than this redraws the
|
|
130
|
+
// ones it evicted. Raise it, or size it from the board, if that shows.
|
|
131
|
+
const MAX_ENTRIES = 128;
|
|
132
|
+
|
|
133
|
+
/** What one picture shows: a Shot at a frame, or a sketch. */
|
|
134
|
+
type Target =
|
|
135
|
+
| { readonly kind: "shot"; readonly sceneId: string; readonly frame: number }
|
|
136
|
+
| { readonly kind: "sketch"; readonly partId: string; readonly sketchId: string };
|
|
137
|
+
|
|
138
|
+
interface Entry {
|
|
139
|
+
readonly target: Target;
|
|
140
|
+
url?: string;
|
|
141
|
+
/** The identity `url` was drawn at, null for none. */
|
|
142
|
+
drawn: string | null;
|
|
143
|
+
failed?: { readonly identity: string; readonly message: string };
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
interface Running {
|
|
147
|
+
readonly key: string;
|
|
148
|
+
readonly controller: AbortController;
|
|
149
|
+
/** Why it was abandoned, when it was. */
|
|
150
|
+
stopped?: "paused" | "timeout";
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export function createStillThumbs(deps: StillThumbsDeps): StillThumbs {
|
|
154
|
+
const stage = deps.stage ?? tabStillStage;
|
|
155
|
+
const later = deps.setTimeout ?? ((fn, ms) => globalThis.setTimeout(fn, ms));
|
|
156
|
+
const cancel = deps.clearTimeout ?? ((h) => globalThis.clearTimeout(h as never));
|
|
157
|
+
const hidden = deps.hidden ?? (() => typeof document !== "undefined" && document.visibilityState === "hidden");
|
|
158
|
+
const onVisibilityChange =
|
|
159
|
+
deps.onVisibilityChange ??
|
|
160
|
+
((listener: () => void) => {
|
|
161
|
+
if (typeof document === "undefined") return () => {};
|
|
162
|
+
document.addEventListener("visibilitychange", listener);
|
|
163
|
+
return () => document.removeEventListener("visibilitychange", listener);
|
|
164
|
+
});
|
|
165
|
+
const createUrl = deps.createObjectURL ?? ((blob: Blob) => URL.createObjectURL(blob));
|
|
166
|
+
const revokeUrl = deps.revokeObjectURL ?? ((url: string) => URL.revokeObjectURL(url));
|
|
167
|
+
const maxEntries = deps.maxEntries ?? MAX_ENTRIES;
|
|
168
|
+
|
|
169
|
+
/** Insertion order is recency: `thumb` moves an entry to the end. */
|
|
170
|
+
const entries = new Map<string, Entry>();
|
|
171
|
+
/** Keys owed a draw, oldest first. */
|
|
172
|
+
const queue = new Set<string>();
|
|
173
|
+
/** Each Shot's drawn identity. */
|
|
174
|
+
const identities = new Map<string, number>();
|
|
175
|
+
/** The code saves that reached each module, for the sketches placing it;
|
|
176
|
+
* `allCode` counts the saves of every module at once. */
|
|
177
|
+
const codeSaves = new Map<string, number>();
|
|
178
|
+
let allCode = 0;
|
|
179
|
+
const listeners = new Set<() => void>();
|
|
180
|
+
let doc = deps.store.getState().doc;
|
|
181
|
+
let running: Running | null = null;
|
|
182
|
+
let timer: unknown = null;
|
|
183
|
+
|
|
184
|
+
const sizeOf = (of: Doc3D): string => {
|
|
185
|
+
const size = storyboardStillSize(of.size);
|
|
186
|
+
return `${size.width}x${size.height}`;
|
|
187
|
+
};
|
|
188
|
+
const keyOf = (target: Target, of: Doc3D): string =>
|
|
189
|
+
target.kind === "shot" ? `${target.sceneId}:${target.frame}:${sizeOf(of)}` : `sketch:${target.sketchId}:${sizeOf(of)}`;
|
|
190
|
+
|
|
191
|
+
/** What a component card's definition draws: it, the definitions it places
|
|
192
|
+
* (nested ones too), their assets and material graphs (`defClosureOf`).
|
|
193
|
+
* Null for any other card. */
|
|
194
|
+
const closureOf = (of: Doc3D, card: ReferenceItem3D | null | undefined): DefClosure | null =>
|
|
195
|
+
card?.type === "component" && card.def !== undefined ? defClosureOf(of, card.def) : null;
|
|
196
|
+
|
|
197
|
+
/** The modules a sketch's picture places: its code components' and those
|
|
198
|
+
* of the definitions it cites, nested ones included. */
|
|
199
|
+
function sketchModules(of: Doc3D, sketch: StoryboardSketch3D): string[] {
|
|
200
|
+
const modules = new Set(sketchCodeComponents(of, sketch).map(instanceModuleOf));
|
|
201
|
+
for (const item of sketch.items) {
|
|
202
|
+
if (item.kind !== "ref") continue;
|
|
203
|
+
const closure = closureOf(of, sketchCardOf(of, item));
|
|
204
|
+
for (const def of closure === null ? [] : [closure.def, ...Object.values(closure.nested)]) {
|
|
205
|
+
for (const layer of Object.values(def.layersById)) {
|
|
206
|
+
if (layer.kind === "instance") modules.add(instanceModuleOf(layer.instance.component));
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return [...modules].sort();
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function sketchOf(of: Doc3D, partId: string, sketchId: string): { part: StoryboardPart3D; sketch: StoryboardSketch3D } | null {
|
|
214
|
+
const part = of.storyboard?.parts.find((p) => p.id === partId);
|
|
215
|
+
const sketch = part?.sketches?.find((s) => s.id === sketchId);
|
|
216
|
+
return part === undefined || sketch === undefined ? null : { part, sketch };
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/** What `target`'s picture is drawn from, as a string, or null when it is
|
|
220
|
+
* gone. A Shot's is its counter; a sketch's is its inputs. */
|
|
221
|
+
function identityOf(target: Target, of: Doc3D): string | null {
|
|
222
|
+
if (target.kind === "shot") {
|
|
223
|
+
return of.scenesById[target.sceneId] === undefined ? null : String(identities.get(target.sceneId) ?? 0);
|
|
224
|
+
}
|
|
225
|
+
const found = sketchOf(of, target.partId, target.sketchId);
|
|
226
|
+
if (found === null) return null;
|
|
227
|
+
const { part, sketch } = found;
|
|
228
|
+
const cards = sketch.items.flatMap((item) => (item.kind === "ref" ? [sketchCardOf(of, item) ?? null] : []));
|
|
229
|
+
const assets = cards.map((card) => (card?.type === "asset" ? (of.assets[card.asset] ?? null) : null));
|
|
230
|
+
const defs = cards.map((card) => closureOf(of, card));
|
|
231
|
+
// The brand colour and font the ground, the accent and the text read.
|
|
232
|
+
const brand = (of.resources?.branding ?? []).filter((item) => item.type === "color" || item.type === "asset");
|
|
233
|
+
const modules = sketchModules(of, sketch);
|
|
234
|
+
const code = [modules.length === 0 ? 0 : allCode, ...modules.map((m) => codeSaves.get(m) ?? 0)];
|
|
235
|
+
return JSON.stringify([sketch, part.durationFrames, cards, assets, defs, brand, of.size, of.fps, code]);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const paused = (): boolean => {
|
|
239
|
+
const state = deps.store.getState();
|
|
240
|
+
return state.playing || state.exportLock !== null || hidden();
|
|
241
|
+
};
|
|
242
|
+
const notify = (): void => {
|
|
243
|
+
for (const listener of listeners) listener();
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
/** Draw next after `ms`. A later draw already armed is kept unless
|
|
247
|
+
* `reset`, which edits use so a draw waits for them to settle. */
|
|
248
|
+
function arm(ms: number, reset = false): void {
|
|
249
|
+
if (timer !== null) {
|
|
250
|
+
if (!reset) return;
|
|
251
|
+
cancel(timer);
|
|
252
|
+
}
|
|
253
|
+
timer = later(() => {
|
|
254
|
+
timer = null;
|
|
255
|
+
pump();
|
|
256
|
+
}, ms);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function drop(key: string): void {
|
|
260
|
+
const entry = entries.get(key);
|
|
261
|
+
if (entry?.url !== undefined) revokeUrl(entry.url);
|
|
262
|
+
entries.delete(key);
|
|
263
|
+
queue.delete(key);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
function clear(): void {
|
|
267
|
+
if (running !== null) running.controller.abort();
|
|
268
|
+
running = null;
|
|
269
|
+
for (const key of [...entries.keys()]) drop(key);
|
|
270
|
+
identities.clear();
|
|
271
|
+
codeSaves.clear();
|
|
272
|
+
allCode = 0;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
function invalidate(sceneIds: readonly string[]): void {
|
|
276
|
+
if (sceneIds.length === 0) return;
|
|
277
|
+
for (const id of sceneIds) identities.set(id, (identities.get(id) ?? 0) + 1);
|
|
278
|
+
arm(SETTLE_MS, true);
|
|
279
|
+
notify();
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/** After a document change: redraw the sketches whose inputs moved, once
|
|
283
|
+
* the edits settle. */
|
|
284
|
+
function invalidateSketches(of: Doc3D): void {
|
|
285
|
+
const moved = [...entries.values()].some(
|
|
286
|
+
(entry) => entry.target.kind === "sketch" && entry.drawn !== null && identityOf(entry.target, of) !== entry.drawn,
|
|
287
|
+
);
|
|
288
|
+
if (!moved) return;
|
|
289
|
+
arm(SETTLE_MS, true);
|
|
290
|
+
notify();
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
function pump(): void {
|
|
294
|
+
if (running !== null || paused() || doc === null) return;
|
|
295
|
+
const still = stage();
|
|
296
|
+
for (const key of queue) {
|
|
297
|
+
queue.delete(key);
|
|
298
|
+
const entry = entries.get(key);
|
|
299
|
+
if (entry === undefined) continue;
|
|
300
|
+
const identity = identityOf(entry.target, doc);
|
|
301
|
+
if (identity === null) {
|
|
302
|
+
drop(key);
|
|
303
|
+
continue;
|
|
304
|
+
}
|
|
305
|
+
draw(still, doc, key, entry, identity);
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/** The document a picture is drawn from, its frame, and the code
|
|
311
|
+
* components to load first. */
|
|
312
|
+
function staged(target: Target, from: Doc3D): { doc: Doc3D; frame: number; load: readonly string[] } | null {
|
|
313
|
+
if (target.kind === "shot") {
|
|
314
|
+
const slice = sliceShotToScene(from, target.sceneId);
|
|
315
|
+
return slice === null ? null : { doc: slice, frame: target.frame, load: [] };
|
|
316
|
+
}
|
|
317
|
+
const found = sketchOf(from, target.partId, target.sketchId);
|
|
318
|
+
if (found === null) return null;
|
|
319
|
+
const load = sketchCodeComponents(from, found.sketch);
|
|
320
|
+
const length = Math.max(1, found.part.durationFrames);
|
|
321
|
+
return { doc: from, frame: Math.min(found.sketch.frame ?? 0, length - 1), load };
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
function draw(still: StillStage, from: Doc3D, key: string, entry: Entry, drawing: string): void {
|
|
325
|
+
const plan = staged(entry.target, from);
|
|
326
|
+
if (plan === null) {
|
|
327
|
+
drop(key);
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
const size = storyboardStillSize(from.size);
|
|
331
|
+
const mine: Running = { key, controller: new AbortController() };
|
|
332
|
+
running = mine;
|
|
333
|
+
const bound = later(() => {
|
|
334
|
+
mine.stopped = "timeout";
|
|
335
|
+
mine.controller.abort();
|
|
336
|
+
}, STILL_READY_MS);
|
|
337
|
+
const target = entry.target;
|
|
338
|
+
// Non-null: `staged` just found the sketch in this very document.
|
|
339
|
+
const start = (): Promise<Blob> =>
|
|
340
|
+
still.capture(
|
|
341
|
+
target.kind === "sketch" ? sketchStageDoc(from, target.partId, target.sketchId, deps.sketchBinding)! : plan.doc,
|
|
342
|
+
plan.frame,
|
|
343
|
+
size.width,
|
|
344
|
+
size.height,
|
|
345
|
+
{ format: "webp", background: true, signal: mine.controller.signal },
|
|
346
|
+
);
|
|
347
|
+
// A sketch's contracts load first, so its instances bind as a placed one
|
|
348
|
+
// would; it is staged only then, against the bindings that loaded.
|
|
349
|
+
const work =
|
|
350
|
+
plan.load.length === 0 || deps.loadContracts === undefined
|
|
351
|
+
? start()
|
|
352
|
+
: deps.loadContracts(plan.load).catch(() => {}).then(start);
|
|
353
|
+
void work
|
|
354
|
+
.then(
|
|
355
|
+
(blob) => {
|
|
356
|
+
if (running !== mine || entries.get(key) !== entry) return;
|
|
357
|
+
if (doc === null || identityOf(target, doc) !== drawing) {
|
|
358
|
+
// An edit landed while it drew: drawn again once they settle.
|
|
359
|
+
queue.add(key);
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
if (entry.url !== undefined) revokeUrl(entry.url);
|
|
363
|
+
entry.url = createUrl(blob);
|
|
364
|
+
entry.drawn = drawing;
|
|
365
|
+
delete entry.failed;
|
|
366
|
+
notify();
|
|
367
|
+
},
|
|
368
|
+
(error: unknown) => {
|
|
369
|
+
if (running !== mine || entries.get(key) !== entry) return;
|
|
370
|
+
if (mine.stopped === "paused" || stillYielded(error)) {
|
|
371
|
+
queue.add(key);
|
|
372
|
+
if (mine.stopped !== "paused") arm(YIELD_MS);
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
const message =
|
|
376
|
+
mine.stopped === "timeout"
|
|
377
|
+
? `the still took longer than ${STILL_READY_MS / 1000} s`
|
|
378
|
+
: error instanceof Error
|
|
379
|
+
? error.message
|
|
380
|
+
: String(error);
|
|
381
|
+
entry.failed = { identity: drawing, message };
|
|
382
|
+
notify();
|
|
383
|
+
},
|
|
384
|
+
)
|
|
385
|
+
.finally(() => {
|
|
386
|
+
cancel(bound);
|
|
387
|
+
if (running !== mine) return;
|
|
388
|
+
running = null;
|
|
389
|
+
arm(0);
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
function pauseCheck(): void {
|
|
394
|
+
if (!paused()) {
|
|
395
|
+
if (queue.size > 0 && running === null) arm(0);
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
if (running !== null && running.stopped === undefined) {
|
|
399
|
+
running.stopped = "paused";
|
|
400
|
+
running.controller.abort();
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/** `target`'s picture, queueing a draw when it has none or an older one. */
|
|
405
|
+
function picture(target: Target, of: Doc3D): StillThumb | null {
|
|
406
|
+
const now = identityOf(target, of);
|
|
407
|
+
if (now === null) return null;
|
|
408
|
+
const key = keyOf(target, of);
|
|
409
|
+
let entry = entries.get(key);
|
|
410
|
+
if (entry === undefined) {
|
|
411
|
+
entry = { target, drawn: null };
|
|
412
|
+
} else {
|
|
413
|
+
entries.delete(key);
|
|
414
|
+
}
|
|
415
|
+
entries.set(key, entry);
|
|
416
|
+
for (const old of entries.keys()) {
|
|
417
|
+
if (entries.size <= maxEntries) break;
|
|
418
|
+
if (old !== key && old !== running?.key) drop(old);
|
|
419
|
+
}
|
|
420
|
+
const url = entry.url === undefined ? {} : { url: entry.url };
|
|
421
|
+
if (entry.url !== undefined && entry.drawn === now) return { status: "ready", url: entry.url };
|
|
422
|
+
if (entry.failed?.identity === now) return { status: "failed", message: entry.failed.message, ...url };
|
|
423
|
+
if (running?.key !== key && !queue.has(key)) {
|
|
424
|
+
queue.add(key);
|
|
425
|
+
arm(0);
|
|
426
|
+
}
|
|
427
|
+
return { status: "pending", ...url };
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
const unsubscribe = deps.store.subscribeCold(() => {
|
|
431
|
+
const next = deps.store.getState().doc;
|
|
432
|
+
if (next !== doc) {
|
|
433
|
+
const before = doc;
|
|
434
|
+
doc = next;
|
|
435
|
+
if (next === null || before === null || before.id !== next.id) {
|
|
436
|
+
clear();
|
|
437
|
+
notify();
|
|
438
|
+
} else {
|
|
439
|
+
invalidate(changedShots(before, next));
|
|
440
|
+
invalidateSketches(next);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
pauseCheck();
|
|
444
|
+
});
|
|
445
|
+
const unwatchVisibility = onVisibilityChange(pauseCheck);
|
|
446
|
+
|
|
447
|
+
return {
|
|
448
|
+
thumb(sceneId, frame) {
|
|
449
|
+
return doc === null ? null : picture({ kind: "shot", sceneId, frame }, doc);
|
|
450
|
+
},
|
|
451
|
+
sketch(partId, sketchId) {
|
|
452
|
+
return doc === null ? null : picture({ kind: "sketch", partId, sketchId }, doc);
|
|
453
|
+
},
|
|
454
|
+
subscribe(listener) {
|
|
455
|
+
listeners.add(listener);
|
|
456
|
+
return () => listeners.delete(listener);
|
|
457
|
+
},
|
|
458
|
+
codeSaved(files) {
|
|
459
|
+
if (doc === null) return;
|
|
460
|
+
if (files.length === 0) allCode += 1;
|
|
461
|
+
for (const file of files) codeSaves.set(file, (codeSaves.get(file) ?? 0) + 1);
|
|
462
|
+
invalidate(shotsPlacing(doc, files));
|
|
463
|
+
invalidateSketches(doc);
|
|
464
|
+
},
|
|
465
|
+
dispose() {
|
|
466
|
+
unsubscribe();
|
|
467
|
+
unwatchVisibility();
|
|
468
|
+
if (timer !== null) cancel(timer);
|
|
469
|
+
timer = null;
|
|
470
|
+
clear();
|
|
471
|
+
listeners.clear();
|
|
472
|
+
},
|
|
473
|
+
};
|
|
474
|
+
}
|