@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
package/src/stage/panes.ts
CHANGED
|
@@ -6,25 +6,41 @@
|
|
|
6
6
|
// a second GL context doubles a budget this lane already owns outright (the
|
|
7
7
|
// shot runtime owns the present, see the lane note in CLAUDE.md). Not two
|
|
8
8
|
// iframes: the stage iframe may never remount. So the pane boundary exists only
|
|
9
|
-
// as numbers, and
|
|
10
|
-
// the pointer lane's hit test.
|
|
9
|
+
// as numbers, and every reader takes them from here: the renderer's scissor
|
|
10
|
+
// rect, the pointer lane's hit test, and the chrome's split handle (`splitX`).
|
|
11
11
|
//
|
|
12
12
|
// They must read the SAME numbers. If the divider the renderer draws to and the
|
|
13
13
|
// divider the pointer tests against differ by even one column, a press in that
|
|
14
14
|
// column is answered by the other pane's camera, and the symptom is "picking is
|
|
15
15
|
// off by half a screen" rather than anything that looks like a layout bug.
|
|
16
16
|
//
|
|
17
|
-
// THREE-FREE ON PURPOSE.
|
|
18
|
-
//
|
|
17
|
+
// THREE-FREE ON PURPOSE. App.tsx places the divider handle and writes
|
|
18
|
+
// `--split-x` (where the canvas bar's camera group starts) through `splitX`,
|
|
19
|
+
// and the chrome may not import three (test/sourceHygiene.test.ts).
|
|
20
|
+
import type { StageInset } from "../bridgeTypes.js";
|
|
19
21
|
import type { Viewport } from "./view.js";
|
|
20
22
|
|
|
23
|
+
/** The two panes, as a VALUE as well as a type: the chrome's layout table is a
|
|
24
|
+
* `Record` over these, so a third pane would fail to compile there rather than
|
|
25
|
+
* arriving with no word for it. */
|
|
26
|
+
export const STAGE_PANES = ["camera", "working"] as const;
|
|
27
|
+
|
|
21
28
|
/** Which of the two views a coordinate, a camera or a query belongs to. */
|
|
22
|
-
export type StagePane =
|
|
29
|
+
export type StagePane = (typeof STAGE_PANES)[number];
|
|
30
|
+
|
|
31
|
+
/** The three layouts the stage can be in. ONE WRITTEN FORM: the union below is
|
|
32
|
+
* derived from this list, and `state/layouts.ts` keys its table on the union,
|
|
33
|
+
* so the members exist in exactly one place across the whole chrome. */
|
|
34
|
+
export const STAGE_LAYOUT_MODES = ["camera", "split", "working"] as const;
|
|
35
|
+
|
|
36
|
+
/** Which editor is on screen. The chrome's words, keys and menu ids for these
|
|
37
|
+
* are in `state/layouts.ts`; this is only the vocabulary itself. */
|
|
38
|
+
export type StageLayoutMode = (typeof STAGE_LAYOUT_MODES)[number];
|
|
23
39
|
|
|
24
40
|
/** What the stage is showing. Editor state: it is never written to the document
|
|
25
41
|
* and never reaches an export. */
|
|
26
42
|
export interface StageLayout {
|
|
27
|
-
mode:
|
|
43
|
+
mode: StageLayoutMode;
|
|
28
44
|
/** The WORKING pane's fraction of the viewport WIDTH. Read only in "split". */
|
|
29
45
|
splitRatio: number;
|
|
30
46
|
}
|
|
@@ -55,6 +71,53 @@ export function clampSplitRatio(ratio: number): number {
|
|
|
55
71
|
return Math.max(MIN_SPLIT_RATIO, Math.min(MAX_SPLIT_RATIO, ratio));
|
|
56
72
|
}
|
|
57
73
|
|
|
74
|
+
/** No chrome at all: the identity inset, so a caller with nothing to subtract
|
|
75
|
+
* can pass a value rather than a special case. */
|
|
76
|
+
export const NO_INSET: StageInset = { top: 0, right: 0, bottom: 0, left: 0 };
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Where the split's seam falls, in canvas px from the left.
|
|
80
|
+
*
|
|
81
|
+
* ── WHY THE INSET IS AN ARGUMENT ────────────────────────────────────────
|
|
82
|
+
*
|
|
83
|
+
* The ratio is the WORKING pane's share of the width, and the width it used to
|
|
84
|
+
* be a share of was the whole window. But the window's left edge is under the
|
|
85
|
+
* rail and its right edge is under the inspector, so at 1366 with the panels
|
|
86
|
+
* open a 0.5 split put the seam at 683 while the visible canvas ran from 212 to
|
|
87
|
+
* 1066 — the working pane got 471 visible px against the camera pane's 383, and
|
|
88
|
+
* a fifth of the working pane was behind the rail. The ratio has to divide the
|
|
89
|
+
* part the author can SEE, or it is not the thing they think they are dragging.
|
|
90
|
+
*
|
|
91
|
+
* The pane RECTS still partition the whole viewport (the scissor draws
|
|
92
|
+
* full-bleed under the chrome, see `insetRect`); only where the seam lands
|
|
93
|
+
* moves. Both readers of the seam — the renderer's scissor and the chrome's
|
|
94
|
+
* divider handle — call this, so they cannot disagree by a column.
|
|
95
|
+
*
|
|
96
|
+
* A degenerate inset (more chrome than window, which a mid-animation panel
|
|
97
|
+
* width can briefly report) falls back to dividing the whole width: a seam
|
|
98
|
+
* somewhere is recoverable, a NaN seam is a scissor that draws nothing.
|
|
99
|
+
*/
|
|
100
|
+
export function splitX(ratio: number, width: number, inset: StageInset = NO_INSET): number {
|
|
101
|
+
const left = Math.max(0, inset.left);
|
|
102
|
+
const clear = width - left - Math.max(0, inset.right);
|
|
103
|
+
const x =
|
|
104
|
+
Number.isFinite(clear) && clear > 1
|
|
105
|
+
? left + Math.round(clampSplitRatio(ratio) * clear)
|
|
106
|
+
: Math.round(width * clampSplitRatio(ratio));
|
|
107
|
+
return Math.min(Math.max(1, x), width - 1);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** The inverse of `splitX`: what ratio a seam at `x` represents. The drag
|
|
111
|
+
* handle's `onChange` reads a pixel and has to store a ratio, and doing that
|
|
112
|
+
* arithmetic at the call site is how the two ends drift apart. */
|
|
113
|
+
export function splitRatioAt(x: number, width: number, inset: StageInset = NO_INSET): number {
|
|
114
|
+
const left = Math.max(0, inset.left);
|
|
115
|
+
const clear = width - left - Math.max(0, inset.right);
|
|
116
|
+
return clampSplitRatio(
|
|
117
|
+
Number.isFinite(clear) && clear > 1 ? (x - left) / clear : x / Math.max(1, width),
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
|
|
58
121
|
/**
|
|
59
122
|
* The two panes' rectangles.
|
|
60
123
|
*
|
|
@@ -65,10 +128,17 @@ export function clampSplitRatio(ratio: number): number {
|
|
|
65
128
|
* A pane that is not on screen is `null`, not a zero-sized rect. Null cannot be
|
|
66
129
|
* scissored by accident and cannot be hit-tested by accident; a 0x0 rect can be
|
|
67
130
|
* both, silently.
|
|
131
|
+
*
|
|
132
|
+
* THE RECTS PARTITION THE WHOLE VIEWPORT even with an inset. The scissor draws
|
|
133
|
+
* full-bleed under the docked chrome on purpose, so a pane never shrinks; the
|
|
134
|
+
* inset only moves where the SEAM lands, via `splitX`. Which pixels are visible
|
|
135
|
+
* is `insetRect`'s question, and it is asked separately by the two things that
|
|
136
|
+
* have to be seen rather than drawn.
|
|
68
137
|
*/
|
|
69
138
|
export function paneRects(
|
|
70
139
|
layout: StageLayout,
|
|
71
140
|
viewport: Viewport,
|
|
141
|
+
inset: StageInset = NO_INSET,
|
|
72
142
|
): { working: PaneRect | null; camera: PaneRect | null } {
|
|
73
143
|
const { width, height } = viewport;
|
|
74
144
|
// The same guard view.ts's `fitView` applies, for the same reason: the
|
|
@@ -82,16 +152,95 @@ export function paneRects(
|
|
|
82
152
|
// A viewport too narrow to hold two panes shows the CAMERA one. It is the
|
|
83
153
|
// pane that is the export, so it is the one worth keeping when only one fits.
|
|
84
154
|
if (width < 2) return { working: null, camera: full };
|
|
85
|
-
//
|
|
86
|
-
//
|
|
87
|
-
//
|
|
88
|
-
const split =
|
|
155
|
+
// THROUGH `splitX`, never inline: the chrome's divider handle positions
|
|
156
|
+
// itself from the same call, and a seam computed twice is a seam that drifts
|
|
157
|
+
// by a column — which reads as "picking is off" rather than as a layout bug.
|
|
158
|
+
const split = splitX(layout.splitRatio, width, inset);
|
|
89
159
|
return {
|
|
90
160
|
working: { x: 0, y: 0, width: split, height },
|
|
91
161
|
camera: { x: split, y: 0, width: width - split, height },
|
|
92
162
|
};
|
|
93
163
|
}
|
|
94
164
|
|
|
165
|
+
/**
|
|
166
|
+
* The part of a pane the chrome is NOT covering.
|
|
167
|
+
*
|
|
168
|
+
* ── WHY THIS IS NOT `paneRects`' JOB ────────────────────────────────────
|
|
169
|
+
*
|
|
170
|
+
* The pane rect is the SCISSOR rect, and the stage draws full-bleed under the
|
|
171
|
+
* chrome on purpose: the docked panels sit over a picture that continues
|
|
172
|
+
* behind them, and insetting the scissor would leave dead gutters instead. So `inset`
|
|
173
|
+
* is paint information for everything that has to be SEEN rather than drawn —
|
|
174
|
+
* the overlay's furniture, and the derived head-on framing.
|
|
175
|
+
*
|
|
176
|
+
* That distinction is exactly the bug this was added for. An orbit rig framed
|
|
177
|
+
* to the whole canvas is fine, because the author pans and zooms to compensate.
|
|
178
|
+
* A DERIVED frame promises "this subject, whole, fitted", and the author has
|
|
179
|
+
* nothing to compensate with — so fitting it to a box a third of which is under
|
|
180
|
+
* the timeline dock breaks the promise silently. See `headOnCamera` and the
|
|
181
|
+
* camera pane's `fit`.
|
|
182
|
+
*
|
|
183
|
+
* ── AN INTERSECTION, NOT FOUR SUBTRACTIONS ──────────────────────────────
|
|
184
|
+
*
|
|
185
|
+
* The inset describes the WINDOW's clear band, not each pane's. Subtracting all
|
|
186
|
+
* four sides from a pane charges every pane for chrome it does not touch: in a
|
|
187
|
+
* split, the camera pane starts at the seam and is nowhere near the rail, yet
|
|
188
|
+
* it lost another `inset.left` off its left edge and slid right by that much,
|
|
189
|
+
* while the working pane ends at the seam and paid for an inspector on the far
|
|
190
|
+
* side of it. So this intersects the pane with the window's clear rect instead.
|
|
191
|
+
* For a pane that IS the whole viewport the two are the same arithmetic, which
|
|
192
|
+
* is why the head-on framing this was written for is unchanged.
|
|
193
|
+
*
|
|
194
|
+
* `viewport` defaults to the pane's own far corner, so a caller holding a
|
|
195
|
+
* full-viewport pane can still pass two arguments and mean it.
|
|
196
|
+
*
|
|
197
|
+
* DEGENERATE INSETS COLLAPSE TO THE PANE, never to a zero or negative box: a
|
|
198
|
+
* chrome that reported more furniture than there is canvas (a narrow window, a
|
|
199
|
+
* mid-animation panel width) would otherwise produce a zero-width frustum,
|
|
200
|
+
* which projects everything to NaN and draws nothing with no error anywhere.
|
|
201
|
+
* A pane that misses the clear band entirely collapses the same way.
|
|
202
|
+
*/
|
|
203
|
+
export function insetRect(
|
|
204
|
+
pane: PaneRect,
|
|
205
|
+
inset: StageInset,
|
|
206
|
+
viewport: Viewport = { width: pane.x + pane.width, height: pane.y + pane.height },
|
|
207
|
+
): PaneRect {
|
|
208
|
+
const x = Math.max(pane.x, Math.max(0, inset.left));
|
|
209
|
+
const y = Math.max(pane.y, Math.max(0, inset.top));
|
|
210
|
+
const width = Math.min(pane.x + pane.width, viewport.width - Math.max(0, inset.right)) - x;
|
|
211
|
+
const height = Math.min(pane.y + pane.height, viewport.height - Math.max(0, inset.bottom)) - y;
|
|
212
|
+
if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) return pane;
|
|
213
|
+
return { x, y, width, height };
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* The same visible rect as `insetRect`, in PANE-LOCAL px.
|
|
218
|
+
*
|
|
219
|
+
* ── WHY THE LOCAL ANSWER NEEDS ITS OWN FUNCTION ─────────────────────────
|
|
220
|
+
*
|
|
221
|
+
* `insetRect` answers in CANVAS coordinates, which is what a caller comparing
|
|
222
|
+
* panes to each other wants. But the two things that lay furniture out inside a
|
|
223
|
+
* pane — the overlay's `<g transform="translate(pane.x pane.y)">`, and
|
|
224
|
+
* `fitView`, which is handed the pane's SIZE and reads every screen coordinate
|
|
225
|
+
* from the pane's top-left — are already in the pane's own space. They need the
|
|
226
|
+
* canvas answer minus the pane origin, which is all this does.
|
|
227
|
+
*
|
|
228
|
+
* SUBTRACTING A RAW INSET EDGE INSTEAD IS THE DOUBLE-COUNT. The inset is the
|
|
229
|
+
* WINDOW's clear band, not any one pane's, so `working.width - inset.right`
|
|
230
|
+
* charges the working pane of a split for an inspector that is on the far side
|
|
231
|
+
* of the SEAM and covers none of it: that is what put the nav gizmo an
|
|
232
|
+
* inspector's width left of the pane edge, 300px into the middle of the
|
|
233
|
+
* picture. The mirror case is the camera pane, whose local x is measured from
|
|
234
|
+
* the seam, so `inset.left` there subtracts a rail that pane never touches.
|
|
235
|
+
* Going through `insetRect` avoids both, because it intersects the pane with
|
|
236
|
+
* the clear band rather than subtracting all four sides — and collapses to the
|
|
237
|
+
* whole pane on a degenerate inset, which here means a local rect at 0,0.
|
|
238
|
+
*/
|
|
239
|
+
export function clearOf(pane: PaneRect, inset: StageInset, viewport: Viewport): PaneRect {
|
|
240
|
+
const clear = insetRect(pane, inset, viewport);
|
|
241
|
+
return { x: clear.x - pane.x, y: clear.y - pane.y, width: clear.width, height: clear.height };
|
|
242
|
+
}
|
|
243
|
+
|
|
95
244
|
/**
|
|
96
245
|
* Which pane a canvas-space point is in, and where it lands inside it.
|
|
97
246
|
*
|
package/src/stage/project.ts
CHANGED
|
@@ -21,12 +21,14 @@
|
|
|
21
21
|
// the layer up to a shadow-blur radius outside its own box.
|
|
22
22
|
//
|
|
23
23
|
// 2. DISTANCE IS NOT THE ORDER. Every layer draws with `depthTest: false` and
|
|
24
|
-
// `renderOrder = layer.order
|
|
25
|
-
//
|
|
24
|
+
// `renderOrder = layer.order` (the layer lists' paint walk), so what
|
|
25
|
+
// covers what is DOCUMENT order and not camera distance: a shot
|
|
26
|
+
// deliberately lets a layer sit further away
|
|
26
27
|
// yet on top. A raycaster sorts by distance, so its "first hit" is
|
|
27
28
|
// routinely a layer the author cannot see. Ordering the hits by `order`
|
|
28
29
|
// descending is what makes the front-most hit the one under the cursor.
|
|
29
30
|
import { Matrix4, Ray, Vector3 } from "three";
|
|
31
|
+
import type { Camera, Object3D, OrthographicCamera, PerspectiveCamera } from "three";
|
|
30
32
|
|
|
31
33
|
/** A layer's four world-space corners, in TL, TR, BR, BL order. */
|
|
32
34
|
export type WorldQuad = readonly [Vector3, Vector3, Vector3, Vector3];
|
|
@@ -42,6 +44,9 @@ export interface LayerFrame {
|
|
|
42
44
|
/** Design px. */
|
|
43
45
|
size: readonly [number, number];
|
|
44
46
|
matrixWorld: Matrix4;
|
|
47
|
+
/** The group `matrixWorld` belongs to, so the overlay pass can bring it up
|
|
48
|
+
* to date (`updateWorldMatrix`) before reading it. Absent in tests. */
|
|
49
|
+
object?: Object3D;
|
|
45
50
|
/** Paint order. Higher is nearer the viewer, whatever the depth says. */
|
|
46
51
|
order: number;
|
|
47
52
|
/** Locked layers are skipped by picking and marquee, and by nothing else. */
|
|
@@ -169,13 +174,28 @@ export interface Projector {
|
|
|
169
174
|
* `setViewOffset`. So the working-area pan and zoom need no separate term here
|
|
170
175
|
* and cannot drift out of step with what the renderer drew.
|
|
171
176
|
*/
|
|
177
|
+
/**
|
|
178
|
+
* Scratch for `toScreen`. It NEVER escapes: the function returns a plain
|
|
179
|
+
* `[number, number]` built from `v.x`/`v.y`, so no caller can retain it, and
|
|
180
|
+
* the body is synchronous with no callback between the write and the read, so
|
|
181
|
+
* it cannot re-enter. Two panes projecting in one frame call this in sequence,
|
|
182
|
+
* each finishing before the next begins.
|
|
183
|
+
*
|
|
184
|
+
* Worth pooling rather than trusting the allocator: this is the most-called
|
|
185
|
+
* allocation in the stage's frame, roughly 90-120 times from TransformGizmo
|
|
186
|
+
* alone (75 arc points, 12 pad corners, 6 arm ends) plus four per quad per
|
|
187
|
+
* pane from StageTools. Same hoist `_guideA`/`_guideB` already take in
|
|
188
|
+
* StageApp, for the same reason.
|
|
189
|
+
*/
|
|
190
|
+
const _project = new Vector3();
|
|
191
|
+
|
|
172
192
|
export function toScreen(
|
|
173
193
|
point: Vector3,
|
|
174
194
|
camera: Projector,
|
|
175
195
|
width: number,
|
|
176
196
|
height: number,
|
|
177
197
|
): [number, number] {
|
|
178
|
-
const v =
|
|
198
|
+
const v = _project.copy(point).applyMatrix4(camera.matrixWorldInverse).applyMatrix4(
|
|
179
199
|
camera.projectionMatrix,
|
|
180
200
|
);
|
|
181
201
|
// Perspective divide is inside applyMatrix4 for a Vector3 (three divides by
|
|
@@ -183,6 +203,40 @@ export function toScreen(
|
|
|
183
203
|
return [((v.x + 1) / 2) * width, ((1 - v.y) / 2) * height];
|
|
184
204
|
}
|
|
185
205
|
|
|
206
|
+
const _depth = new Vector3();
|
|
207
|
+
const DEG = Math.PI / 180;
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* World units per CSS pixel AT A POINT, which is what turns a fixed screen
|
|
211
|
+
* length (the transform gizmo's `GIZMO_PX`, the camera body's clamps) into a
|
|
212
|
+
* world one.
|
|
213
|
+
*
|
|
214
|
+
* Both camera classes, because isolation swaps an ORTHOGRAPHIC camera into the
|
|
215
|
+
* working pane's slot (StageTools) and a perspective-only formula would size a
|
|
216
|
+
* gizmo off a `fov` that camera does not have — reading `undefined` and
|
|
217
|
+
* drawing arms of length NaN, which is a gizmo that silently disappears inside
|
|
218
|
+
* isolation.
|
|
219
|
+
*
|
|
220
|
+
* Perspective: the visible height at the point's own view depth, over the pane.
|
|
221
|
+
* Orthographic: its frustum height over the pane, which has no depth term at
|
|
222
|
+
* all — that is what orthographic means.
|
|
223
|
+
*/
|
|
224
|
+
export function worldPerPixel(camera: Camera, at: Vector3, paneHeight: number): number {
|
|
225
|
+
const height = Math.max(1, paneHeight);
|
|
226
|
+
const ortho = camera as OrthographicCamera;
|
|
227
|
+
if (ortho.isOrthographicCamera === true) {
|
|
228
|
+
const zoom = ortho.zoom > 0 ? ortho.zoom : 1;
|
|
229
|
+
return Math.abs(ortho.top - ortho.bottom) / zoom / height;
|
|
230
|
+
}
|
|
231
|
+
const perspective = camera as PerspectiveCamera;
|
|
232
|
+
const fov = Number.isFinite(perspective.fov) ? perspective.fov : 50;
|
|
233
|
+
// View-space z runs NEGATIVE in front of the camera, so the depth is its
|
|
234
|
+
// negation — and it is floored off zero, because a point sitting exactly at
|
|
235
|
+
// the eye would otherwise give every length zero.
|
|
236
|
+
const depth = Math.max(-_depth.copy(at).applyMatrix4(camera.matrixWorldInverse).z, 1e-3);
|
|
237
|
+
return (2 * Math.tan((fov * DEG) / 2) * depth) / height;
|
|
238
|
+
}
|
|
239
|
+
|
|
186
240
|
export function screenQuad(
|
|
187
241
|
frame: LayerFrame,
|
|
188
242
|
camera: Projector,
|
|
@@ -300,6 +354,17 @@ export function pickLayersByDistance(ray: Ray, frames: readonly LayerFrame[]): s
|
|
|
300
354
|
return hits.map((h) => h.id);
|
|
301
355
|
}
|
|
302
356
|
|
|
357
|
+
/**
|
|
358
|
+
* A hit list with every MASK after every other hit, each side in its own
|
|
359
|
+
* order. A mask draws nothing of its own (gap 7), so a click goes to what the
|
|
360
|
+
* author sees. It matters in the working pane, which sorts by distance and can
|
|
361
|
+
* put a mask in front of the content it mattes. A mask alone under the cursor
|
|
362
|
+
* is still picked.
|
|
363
|
+
*/
|
|
364
|
+
export function maskHitsLast(ids: readonly string[], isMask: (id: string) => boolean): string[] {
|
|
365
|
+
return [...ids.filter((id) => !isMask(id)), ...ids.filter(isMask)];
|
|
366
|
+
}
|
|
367
|
+
|
|
303
368
|
/**
|
|
304
369
|
* Layers whose quad intersects a screen-space rectangle — the marquee.
|
|
305
370
|
*
|