@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
|
@@ -1,49 +1,258 @@
|
|
|
1
|
-
//
|
|
1
|
+
// THE VIEW TRACK: 3D | Split | Camera, then the Clean view eye, in the tool
|
|
2
|
+
// footer.
|
|
2
3
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// and
|
|
4
|
+
// Mounted by ToolFooter as the right half of the docked footer under the
|
|
5
|
+
// canvas, so it is on screen exactly where the stage is (no mode brings it)
|
|
6
|
+
// and never floats over the picture. The footer's left half is the tools, or
|
|
7
|
+
// the shot under the playhead in the Project context; this says what the
|
|
8
|
+
// canvas is showing.
|
|
6
9
|
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
+
// ── TWO WORDS, AND THEY ARE NOT PANES ──────────────────────────────────────
|
|
11
|
+
//
|
|
12
|
+
// Edit | Video used to pick a stage layout: Edit meant the 3D viewport, Video
|
|
13
|
+
// meant the camera pane. That was wrong about the stage, and the way it was
|
|
14
|
+
// wrong is worth keeping written down, because the two-word control survived
|
|
15
|
+
// the correction and the mapping under it did not.
|
|
16
|
+
//
|
|
17
|
+
// The rect, ellipse, line, text, image and pen tools draw in the CAMERA pane
|
|
18
|
+
// and nowhere else, and so do the move, resize and rotate handles. The working
|
|
19
|
+
// pane is the 3D viewport: orbit, gizmo, frustum, the modal G/R/S. So "Video
|
|
20
|
+
// is the camera pane" made drawing impossible in the view that could not play
|
|
21
|
+
// and possible in the one that could.
|
|
22
|
+
//
|
|
23
|
+
// So Video is a FLAG OVER THE PICTURE (`state.video`, "Clean view" on every
|
|
24
|
+
// surface since the design review): the same frame with every piece of
|
|
25
|
+
// authoring furniture taken off it; the transport runs with it on or off. WHICH EDITOR Edit shows (the 3D view, the split, or the
|
|
26
|
+
// camera) is a separate setting on ⇧1 / ⇧2 / ⇧3 and in the View menu, and Video
|
|
27
|
+
// never writes it. `state/viewMode.ts` owns every direction of that.
|
|
28
|
+
//
|
|
29
|
+
// ── ONE TRACK AND ONE TOGGLE ───────────────────────────────────────────────
|
|
30
|
+
//
|
|
31
|
+
// The 2026-10-13 design review (Paper) splits the old five-chip track. The
|
|
32
|
+
// layouts stay a track, one `role="radiogroup"` with exactly one chip lit,
|
|
33
|
+
// because they are three answers to one question. The flag becomes what it
|
|
34
|
+
// is: an on/off, so a toggle button with `aria-pressed` (an eye, "Clean
|
|
35
|
+
// view") beside the track. Edit had no meaning of its own beyond "the flag is
|
|
36
|
+
// off", and a pressed-state button says that at rest without a chip for it.
|
|
37
|
+
// Video over a split still lights Split in the track (the editor waiting
|
|
38
|
+
// underneath) while the eye is pressed (what is on top), so nothing lies.
|
|
39
|
+
//
|
|
40
|
+
// ── NOTHING HERE IS THE ONLY WAY BACK ──────────────────────────────────────
|
|
41
|
+
//
|
|
42
|
+
// Pressing the eye again is one way out of Clean view and it is the least
|
|
43
|
+
// used one. Every selection, every edit, every armed tool and every door into
|
|
44
|
+
// a container calls the store's `enterEdit()`, so the ordinary way back is to
|
|
45
|
+
// click the thing you wanted to work on. Escape and ⇧4 do it too.
|
|
46
|
+
//
|
|
47
|
+
// ── GLYPHS AND WORDS, AS PAPER DRAWS THEM ──────────────────────────────────
|
|
48
|
+
//
|
|
49
|
+
// 3D and Camera are a glyph and a word; Split is a word alone (a split glyph
|
|
50
|
+
// is "◱ ▥ ▣" again, which nobody arrives knowing). The layouts keep their
|
|
51
|
+
// words at every width. The eye is a glyph with an `aria-label`, and every
|
|
52
|
+
// control has a `title` with its key, so nothing is taught by shape alone.
|
|
53
|
+
import { useRef, useState } from "react";
|
|
54
|
+
import type { ReactElement } from "react";
|
|
55
|
+
import { Popover, SegmentedControl } from "@dailies-studio/ui";
|
|
56
|
+
import { CAMERA_ICON, CUBE_ICON, EYE_ICON, EYE_OFF_ICON } from "../../icons.js";
|
|
10
57
|
import { useShotEditor, useStore } from "../../state/context.js";
|
|
11
|
-
import
|
|
58
|
+
import { LAYOUT_MODES, layoutRefusal, layoutSpec } from "../../state/layouts.js";
|
|
59
|
+
// The words, the keys and the order of the two modes, plus the reason their
|
|
60
|
+
// keys are not a pair. This bar is a reader of that table, never a second
|
|
61
|
+
// writer of it.
|
|
62
|
+
import { VIEW_MODE_SPECS, inDefinition, shownLayoutMode, viewModeOf } from "../../state/viewMode.js";
|
|
63
|
+
import type { StageLayout, StageLayoutMode } from "../../stage/panes.js";
|
|
64
|
+
import { TOOL_FOOTER_H } from "../../state/panelSize.js";
|
|
65
|
+
import { formatCombo } from "../../state/shortcuts.js";
|
|
66
|
+
|
|
67
|
+
/** The folded picker's height (`.view-picker`, tool-footer.css). */
|
|
68
|
+
const PICKER_H = 28;
|
|
12
69
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
70
|
+
// THE LOCAL HALF, and the only half: `state/` is JSX-free on purpose, so the
|
|
71
|
+
// glyphs cannot live beside the words they belong to. Everything else about
|
|
72
|
+
// these rows comes out of `VIEW_MODE_SPECS` and `LAYOUT_SPECS`.
|
|
73
|
+
const LAYOUT_ICONS: Record<StageLayoutMode, ReactElement | null> = {
|
|
74
|
+
working: CUBE_ICON,
|
|
75
|
+
split: null,
|
|
76
|
+
camera: CAMERA_ICON,
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Whether this bar is on screen, ONE SPELLING.
|
|
81
|
+
*
|
|
82
|
+
* The bar is the right half of the tool footer, and that footer is drawn even
|
|
83
|
+
* when this half is not (a definition keeps its tools). Keeping the answer
|
|
84
|
+
* here, where the reason lives, means the bar and its tests read one rule
|
|
85
|
+
* rather than two copies of two conditions.
|
|
86
|
+
*/
|
|
87
|
+
export function useViewModeBarVisible(): boolean {
|
|
88
|
+
const open = useShotEditor((s) => s.name !== null);
|
|
89
|
+
// A DEFINITION HAS NO SHOT CAMERA, so Video would be a view of nothing and
|
|
90
|
+
// Edit is simply where the author already is. `StageApp` forces the
|
|
91
|
+
// working-only layout while one is open, so a bar here would be reporting a
|
|
92
|
+
// state nothing could enter. The 4 key still carries the sentence
|
|
93
|
+
// (`layoutRefusal`), so the rule is taught somewhere.
|
|
94
|
+
const inDef = useShotEditor(inDefinition);
|
|
95
|
+
return open && !inDef;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** The chip's face: the glyph, then the word in its own box so the compact
|
|
99
|
+
* track can hide it without touching the name. */
|
|
100
|
+
function face(icon: ReactElement | null, word: string | null): ReactElement {
|
|
101
|
+
return (
|
|
102
|
+
<>
|
|
103
|
+
{icon === null ? null : (
|
|
104
|
+
<span className="view-chip-icon" aria-hidden="true">
|
|
105
|
+
{icon}
|
|
106
|
+
</span>
|
|
107
|
+
)}
|
|
108
|
+
{word === null ? null : <span className="view-chip-word">{word}</span>}
|
|
109
|
+
</>
|
|
110
|
+
);
|
|
111
|
+
}
|
|
25
112
|
|
|
26
113
|
export function ViewModeBar() {
|
|
27
114
|
const store = useStore();
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
|
|
115
|
+
// THE FLAG, through the one selector that also answers for the menu's tick.
|
|
116
|
+
const shown = useShotEditor(viewModeOf);
|
|
117
|
+
const layout = useShotEditor(shownLayoutMode);
|
|
118
|
+
const inDef = useShotEditor(inDefinition);
|
|
119
|
+
// Over the canvas either way: down when the toolbar sits on top of it.
|
|
120
|
+
const toolbarTop = useShotEditor((s) => s.toolbarPosition === "top");
|
|
121
|
+
const visible = useViewModeBarVisible();
|
|
122
|
+
const anchor = useRef<HTMLButtonElement>(null);
|
|
123
|
+
const [menuOpen, setMenuOpen] = useState(false);
|
|
124
|
+
if (!visible) {
|
|
125
|
+
// Returning null keeps this component's state, so a menu left open here
|
|
126
|
+
// would come back open with the bar (ShadingBar has the same gate).
|
|
127
|
+
if (menuOpen) setMenuOpen(false);
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
// THE ONE LAYOUT REFUSAL, the sentence the digits and the View menu refuse
|
|
131
|
+
// with. Only a definition refuses, and the bar is not drawn in one, so today
|
|
132
|
+
// this is always null; it is read anyway so a second refusal added to the
|
|
133
|
+
// rule greys these rows with no edit here.
|
|
134
|
+
const refusal = layoutRefusal(inDef);
|
|
135
|
+
const pick = (mode: StageLayout["mode"]): void => store.setViewLayout(mode);
|
|
136
|
+
const clean = shown === "video";
|
|
137
|
+
const CLEAN = VIEW_MODE_SPECS.video;
|
|
138
|
+
const cleanTitle = `${CLEAN.label} (${formatCombo(CLEAN.key)})`;
|
|
139
|
+
// THROUGH `setViewMode`, which is also what ⇧4, Escape's top rung and the
|
|
140
|
+
// View menu's row call. It is `setVideo` with the one refusal in front of
|
|
141
|
+
// it, and having that refusal in one place is why this goes through the
|
|
142
|
+
// verb rather than writing the flag.
|
|
143
|
+
const toggleClean = (): void => store.setViewMode(clean ? "edit" : "video");
|
|
31
144
|
return (
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
145
|
+
// The wrapper stays a `role="group"`: it is the footer's right half, and
|
|
146
|
+
// the testid on it is how the definition toolbars are proved absent.
|
|
147
|
+
<div className="view-mode-bar" role="group" aria-label="View" data-testid="view-mode-bar">
|
|
148
|
+
{/* WHICH EDITOR is under the picture. The rows are `state/layouts.ts` itself, which
|
|
149
|
+
is the table View ▸ Layout, the ⇧1 / ⇧2 / ⇧3 keys and every refusal
|
|
150
|
+
sentence read too, so the third layout cannot be called Camera here
|
|
151
|
+
and Frame two surfaces over.
|
|
152
|
+
|
|
153
|
+
Lit from `shownLayoutMode`, so Clean view lights Camera (that is
|
|
154
|
+
what is on screen), and any click here leaves Clean view through
|
|
155
|
+
`setViewLayout`, which is what the digits do too.
|
|
156
|
+
|
|
157
|
+
All three are live in BOTH contexts. Above a shot the working pane
|
|
158
|
+
draws the shot under the playhead, which is the scene the stage
|
|
159
|
+
resolves anyway; only a definition refuses. */}
|
|
160
|
+
<SegmentedControl
|
|
161
|
+
ariaLabel="Layout"
|
|
162
|
+
className="layout-switch"
|
|
163
|
+
value={layout}
|
|
164
|
+
onChange={(value) => pick(value as StageLayout["mode"])}
|
|
165
|
+
options={LAYOUT_MODES.map((mode) => {
|
|
166
|
+
const { label, key } = layoutSpec(mode);
|
|
167
|
+
return {
|
|
168
|
+
value: mode,
|
|
169
|
+
// No `ariaLabel`: the word is drawn at every width (the compact
|
|
170
|
+
// track takes these chips' glyphs, never their words), so the
|
|
171
|
+
// text is the name already.
|
|
172
|
+
label: face(LAYOUT_ICONS[mode], label),
|
|
173
|
+
title: refusal ?? `${label} (${formatCombo(key)})`,
|
|
174
|
+
disabled: refusal !== null,
|
|
175
|
+
};
|
|
176
|
+
})}
|
|
177
|
+
/>
|
|
178
|
+
{/* THE TRACK, FOLDED, for a footer too narrow for three chips.
|
|
179
|
+
tool-footer.css shows exactly one of the two (a container query on
|
|
180
|
+
the footer), so the footer fits the narrowest canvas the shell makes
|
|
181
|
+
without losing a choice: one trigger naming the layout on screen,
|
|
182
|
+
and the three a press away in its menu. The eye is not folded into
|
|
183
|
+
it: it stays beside, one square that never gives. */}
|
|
184
|
+
<button
|
|
185
|
+
ref={anchor}
|
|
186
|
+
type="button"
|
|
187
|
+
className="tool-button has-caret is-labelled view-picker"
|
|
188
|
+
aria-haspopup="menu"
|
|
189
|
+
aria-expanded={menuOpen}
|
|
190
|
+
aria-label={`Layout: ${layoutSpec(layout).label}`}
|
|
191
|
+
title={`Layout: ${layoutSpec(layout).label}`}
|
|
192
|
+
data-testid="view-picker"
|
|
193
|
+
onClick={() => setMenuOpen((v) => !v)}
|
|
194
|
+
>
|
|
195
|
+
{layoutSpec(layout).label}
|
|
196
|
+
<span className="tool-caret" aria-hidden="true" />
|
|
197
|
+
</button>
|
|
198
|
+
{/* UPWARD, OVER THE CANVAS, like every menu the footer opens: below it
|
|
199
|
+
is the timeline, which has the room and is the wrong place. Right
|
|
200
|
+
aligned to the picker, which only the eye follows. The gap is
|
|
201
|
+
from the FOOTER's edge, as the tool flyouts' is (tool-footer.css):
|
|
202
|
+
the 28px picker is centred in the footer, so the menu ends 8px above
|
|
203
|
+
the footer and never over its hairline. A footer that widens while
|
|
204
|
+
the menu is open hides the picker, and the Popover closes on a
|
|
205
|
+
hidden anchor rather than drifting to the window's corner. With the
|
|
206
|
+
toolbar on top (Preferences) the canvas is BELOW, so it drops. */}
|
|
207
|
+
<Popover
|
|
208
|
+
open={menuOpen}
|
|
209
|
+
anchor={anchor}
|
|
210
|
+
onClose={() => setMenuOpen(false)}
|
|
211
|
+
side={toolbarTop ? "below" : "above"}
|
|
212
|
+
align="right"
|
|
213
|
+
gap={8 + (TOOL_FOOTER_H - PICKER_H) / 2}
|
|
214
|
+
>
|
|
215
|
+
<div className="shading-menu" role="menu" aria-label="Layout" data-testid="view-menu">
|
|
216
|
+
{LAYOUT_MODES.map((mode) => {
|
|
217
|
+
const { label, key } = layoutSpec(mode);
|
|
218
|
+
return (
|
|
219
|
+
<button
|
|
220
|
+
key={mode}
|
|
221
|
+
type="button"
|
|
222
|
+
role="menuitemradio"
|
|
223
|
+
aria-checked={layout === mode}
|
|
224
|
+
className={`tool-button${layout === mode ? " is-armed" : ""}`}
|
|
225
|
+
title={refusal ?? `${label} (${formatCombo(key)})`}
|
|
226
|
+
disabled={refusal !== null}
|
|
227
|
+
onClick={() => {
|
|
228
|
+
setMenuOpen(false);
|
|
229
|
+
pick(mode);
|
|
230
|
+
}}
|
|
231
|
+
>
|
|
232
|
+
{label}
|
|
233
|
+
</button>
|
|
234
|
+
);
|
|
235
|
+
})}
|
|
236
|
+
</div>
|
|
237
|
+
</Popover>
|
|
238
|
+
{/* CLEAN VIEW, the flag as the on/off it is: a toggle button, pressed
|
|
239
|
+
while the authoring furniture is off the frame. The eye says "look
|
|
240
|
+
at the picture"; pressed, it shuts, because the handles are hidden.
|
|
241
|
+
On screen at every footer width, folded or not: it is one 32px
|
|
242
|
+
square, and the flag is the footer's most used view control. */}
|
|
243
|
+
<button
|
|
244
|
+
type="button"
|
|
245
|
+
className="clean-view-toggle"
|
|
246
|
+
aria-pressed={clean}
|
|
247
|
+
aria-label={CLEAN.label}
|
|
248
|
+
title={cleanTitle}
|
|
249
|
+
data-testid="clean-view-toggle"
|
|
250
|
+
onClick={toggleClean}
|
|
251
|
+
>
|
|
252
|
+
<span className="view-chip-icon" aria-hidden="true">
|
|
253
|
+
{clean ? EYE_OFF_ICON : EYE_ICON}
|
|
254
|
+
</span>
|
|
255
|
+
</button>
|
|
47
256
|
</div>
|
|
48
257
|
);
|
|
49
258
|
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { useShotEditor, useStore } from "../../state/context.js";
|
|
2
|
+
import { shownLayoutMode } from "../../state/viewMode.js";
|
|
3
|
+
import type { WorkPlaneTarget } from "../../bridgeTypes.js";
|
|
4
|
+
|
|
5
|
+
const OPTIONS = [
|
|
6
|
+
{ value: "xy", label: "XY" },
|
|
7
|
+
{ value: "xz", label: "XZ" },
|
|
8
|
+
{ value: "yz", label: "YZ" },
|
|
9
|
+
{ value: "view", label: "View" },
|
|
10
|
+
{ value: "selection", label: "Selection" },
|
|
11
|
+
] as const;
|
|
12
|
+
const XY_TARGET = { kind: "xy" } as const;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Editor-only construction plane for working-pane spline creation.
|
|
16
|
+
*
|
|
17
|
+
* ── THE WORDS CAME OFF, THE NAMES DID NOT ───────────────────────────────
|
|
18
|
+
*
|
|
19
|
+
* "Plane" and "Curve" used to be rendered beside their selects and cost more
|
|
20
|
+
* width than either select did, in a control strip that stopped wrapping and
|
|
21
|
+
* now has a real budget (see `.control-strip`). They were never the accessible
|
|
22
|
+
* name either: each select already carries its own `aria-label`, so a screen
|
|
23
|
+
* reader announced "Spline work plane", not the word beside it. The word moves
|
|
24
|
+
* into `title` instead, where it labels the control for a pointer the same way
|
|
25
|
+
* the `aria-label` labels it for a reader — one control, two audiences, no
|
|
26
|
+
* third copy of the word taking up the row.
|
|
27
|
+
*
|
|
28
|
+
* The selects are the house `.select`, the same 28px pill as every other
|
|
29
|
+
* control in the canvas bar, chevron lane included.
|
|
30
|
+
*
|
|
31
|
+
* ── ONLY WHILE THE SPLINE TOOL IS ARMED ─────────────────────────────────
|
|
32
|
+
*
|
|
33
|
+
* The plane is read by one gesture, so the bar shows it at that moment and
|
|
34
|
+
* gives the rest of the time back to the bar. Its permanent home is View ›
|
|
35
|
+
* Work plane (`state/menu.ts`), behind the same gate.
|
|
36
|
+
*/
|
|
37
|
+
export function WorkPlaneBar() {
|
|
38
|
+
const store = useStore();
|
|
39
|
+
const sceneId = useShotEditor((state) => state.sceneId);
|
|
40
|
+
const entered = useShotEditor((state) => state.enteredScene !== null);
|
|
41
|
+
const inDefinition = useShotEditor((state) => state.editingDef !== null);
|
|
42
|
+
// ON SCREEN, not chosen: see CameraViewBar.
|
|
43
|
+
const mode = useShotEditor(shownLayoutMode);
|
|
44
|
+
const tool = useShotEditor((state) => state.tool);
|
|
45
|
+
const basis = useShotEditor((state) => state.splineBasis);
|
|
46
|
+
const selected = useShotEditor((state) => state.selection);
|
|
47
|
+
const target = useShotEditor((state) =>
|
|
48
|
+
state.sceneId === null ? XY_TARGET : (state.workPlanes[state.sceneId] ?? XY_TARGET),
|
|
49
|
+
);
|
|
50
|
+
// A definition occupies the working pane even when the scene's stashed
|
|
51
|
+
// layout is camera-only, so its construction plane remains addressable.
|
|
52
|
+
if (tool !== "spline" || sceneId === null || !entered || (mode === "camera" && !inDefinition)) return null;
|
|
53
|
+
|
|
54
|
+
const set = (value: string): void => {
|
|
55
|
+
if (value === "selection") {
|
|
56
|
+
const layerId = selected.length === 1 ? selected[0] : undefined;
|
|
57
|
+
if (layerId !== undefined) store.setWorkPlane({ kind: "selection", layerId });
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
store.setWorkPlane({ kind: value as Exclude<WorkPlaneTarget["kind"], "selection"> });
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
return (
|
|
64
|
+
<div className="work-plane-bar" data-testid="work-plane-bar">
|
|
65
|
+
<select
|
|
66
|
+
className="select"
|
|
67
|
+
aria-label="Spline work plane"
|
|
68
|
+
value={target.kind}
|
|
69
|
+
title="Plane: the plane Shift+P draws spline anchors on"
|
|
70
|
+
onChange={(event) => set(event.currentTarget.value)}
|
|
71
|
+
>
|
|
72
|
+
{OPTIONS.map((option) => (
|
|
73
|
+
<option
|
|
74
|
+
key={option.value}
|
|
75
|
+
value={option.value}
|
|
76
|
+
disabled={option.value === "selection" && selected.length !== 1 && target.kind !== "selection"}
|
|
77
|
+
>
|
|
78
|
+
{option.label}
|
|
79
|
+
</option>
|
|
80
|
+
))}
|
|
81
|
+
</select>
|
|
82
|
+
<select
|
|
83
|
+
className="select"
|
|
84
|
+
aria-label="Spline basis for new curves"
|
|
85
|
+
value={basis}
|
|
86
|
+
title="Curve: the interpolation frozen when the first anchor is placed"
|
|
87
|
+
onChange={(event) => store.setSplineBasis(event.currentTarget.value as typeof basis)}
|
|
88
|
+
>
|
|
89
|
+
<option value="bezier">Bezier</option>
|
|
90
|
+
<option value="catmull-rom">Catmull</option>
|
|
91
|
+
</select>
|
|
92
|
+
</div>
|
|
93
|
+
);
|
|
94
|
+
}
|