@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
|
@@ -5,28 +5,58 @@
|
|
|
5
5
|
// would mean the panel could be showing the wrong tab for its own subject, and
|
|
6
6
|
// the author would click a diamond and see nothing.
|
|
7
7
|
//
|
|
8
|
-
// The FRAME field is a master frame, like every other number about a marker
|
|
9
|
-
//
|
|
10
|
-
|
|
8
|
+
// The FRAME field is a master frame, like every other number about a marker. It
|
|
9
|
+
// is the only place in this chrome where one can be TYPED, and it drags through
|
|
10
|
+
// the same scrub bracket the lane's pin does, so both routes are one undo entry
|
|
11
|
+
// and both land the mark on the same integer.
|
|
12
|
+
import { ColorField, InspectorRow, InspectorSection, NumberField, TextField, useLocked } from "@dailies-studio/ui";
|
|
13
|
+
import { updateMarker } from "@dailies-studio/shot/doc";
|
|
14
|
+
import type { MarkerRef } from "@dailies-studio/shot/doc";
|
|
11
15
|
import { useShotEditor, useStore } from "../../state/context.js";
|
|
12
16
|
import { timecode } from "../timeline/model.js";
|
|
13
|
-
import {
|
|
17
|
+
import { useScrub } from "./useDocWrite.js";
|
|
14
18
|
|
|
15
19
|
/** What a marker with no `color` is drawn in. The same value shotTokens.css
|
|
16
20
|
* gives `--marker-pin`, restated here because the swatch needs a concrete
|
|
17
21
|
* colour to show and a CSS variable is not one. */
|
|
18
22
|
const DEFAULT_MARKER_COLOR = "#ffffff";
|
|
19
23
|
|
|
24
|
+
type MarkerPatch = Partial<Omit<MarkerRef, "id">>;
|
|
25
|
+
|
|
20
26
|
export function MarkerSection() {
|
|
21
27
|
const store = useStore();
|
|
22
28
|
const doc = useShotEditor((s) => s.doc);
|
|
23
29
|
const selected = useShotEditor((s) => s.selectedMarker);
|
|
30
|
+
|
|
31
|
+
// ONE bracket for both dragged fields, DECLARED BEFORE THE EARLY RETURNS,
|
|
32
|
+
// because a hook after a conditional return changes the hook count between
|
|
33
|
+
// renders.
|
|
34
|
+
// The widget sends the patch it is pointing at; the mark is re-read from the
|
|
35
|
+
// store at capture time rather than closed over from this render, which is
|
|
36
|
+
// the live read `useSelectionScrub` makes for the same reason.
|
|
37
|
+
const drag = useScrub((d, raw) => {
|
|
38
|
+
const id = store.getState().selectedMarker;
|
|
39
|
+
const patch = raw as MarkerPatch;
|
|
40
|
+
const at = id === null ? undefined : d.markers?.find((m) => m.id === id);
|
|
41
|
+
if (id === null || at === undefined) return d;
|
|
42
|
+
// `updateMarker` rebuilds the array unconditionally, so a capture landing
|
|
43
|
+
// where the mark already is would leave an undo entry for a drag that
|
|
44
|
+
// travelled nowhere, and the colour picker emits one on press, before the
|
|
45
|
+
// pointer has moved at all. Same guard `dragMarker` keeps in the store.
|
|
46
|
+
const same = Object.entries(patch).every(([k, v]) => (at as unknown as Record<string, unknown>)[k] === v);
|
|
47
|
+
return same ? d : updateMarker(d, id, patch);
|
|
48
|
+
});
|
|
49
|
+
const move = (patch: MarkerPatch): void => drag.move(patch);
|
|
50
|
+
// Delete is a plain button, so it reads a viewer's lock itself; the fields
|
|
51
|
+
// read it on their own.
|
|
52
|
+
const locked = useLocked();
|
|
53
|
+
|
|
24
54
|
if (doc === null || selected === null) return null;
|
|
25
55
|
const marker = (doc.markers ?? []).find((m) => m.id === selected);
|
|
26
56
|
if (marker === undefined) return null;
|
|
27
57
|
|
|
28
58
|
return (
|
|
29
|
-
<InspectorSection title="Marker" persistKey="shot:marker" collapsible={false}>
|
|
59
|
+
<InspectorSection className="insp-object" title="Marker" persistKey="shot:marker" collapsible={false}>
|
|
30
60
|
<InspectorRow label="Label">
|
|
31
61
|
<TextField
|
|
32
62
|
value={marker.label ?? ""}
|
|
@@ -41,22 +71,36 @@ export function MarkerSection() {
|
|
|
41
71
|
ariaLabel="Marker frame"
|
|
42
72
|
min={0}
|
|
43
73
|
step={1}
|
|
74
|
+
onScrubStart={drag.start}
|
|
75
|
+
onScrub={(frame) => move({ frame: Math.max(0, Math.round(frame)) })}
|
|
76
|
+
onScrubEnd={drag.end}
|
|
44
77
|
onCommit={(frame) => store.setMarker(marker.id, { frame: Math.max(0, Math.round(frame)) })}
|
|
45
78
|
/>
|
|
46
|
-
|
|
79
|
+
</InspectorRow>
|
|
80
|
+
{/* THE SAME FRAME ON THE CLOCK, as its own readout row (`insp-readout`),
|
|
81
|
+
the Time section's shape: frames are what a marker is stored in, the
|
|
82
|
+
clock is what an author reads a cut against. It sat beside the field
|
|
83
|
+
as a 10px note, which narrowed the field and set a number in the
|
|
84
|
+
wrong face. */}
|
|
85
|
+
<InspectorRow label="Timecode" className="insp-readout">
|
|
86
|
+
<span className="insp-dim" data-testid="marker-timecode">
|
|
87
|
+
{timecode(marker.frame, doc.fps)}
|
|
88
|
+
</span>
|
|
47
89
|
</InspectorRow>
|
|
48
90
|
<InspectorRow label="Colour">
|
|
49
|
-
<
|
|
91
|
+
<ColorField
|
|
50
92
|
value={marker.color ?? DEFAULT_MARKER_COLOR}
|
|
51
93
|
ariaLabel="Marker colour"
|
|
52
|
-
scrub={
|
|
94
|
+
scrub={{ start: drag.start, move: (color) => move({ color: String(color) }), end: drag.end }}
|
|
53
95
|
commit={(color) => store.setMarker(marker.id, { color })}
|
|
54
96
|
/>
|
|
55
97
|
</InspectorRow>
|
|
56
98
|
<InspectorRow>
|
|
57
|
-
<
|
|
58
|
-
|
|
59
|
-
|
|
99
|
+
<div className="insp-buttons">
|
|
100
|
+
<button type="button" className="btn" disabled={locked} onClick={() => store.removeMarker(marker.id)}>
|
|
101
|
+
Delete marker
|
|
102
|
+
</button>
|
|
103
|
+
</div>
|
|
60
104
|
</InspectorRow>
|
|
61
105
|
</InspectorSection>
|
|
62
106
|
);
|
|
@@ -1,69 +1,100 @@
|
|
|
1
|
-
// One
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
1
|
+
// One transition param, spec-driven: a `TransitionParamSpec` turned into the
|
|
2
|
+
// `PropRow` every ControlSpec surface draws (a component's props, code
|
|
3
|
+
// defaults, material parameters), so a transition's knobs look and behave like
|
|
4
|
+
// every other contract's: the name in the label column, the control across the
|
|
5
|
+
// rest, a bounded number as a field plus its slider.
|
|
5
6
|
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
|
|
7
|
+
// ── WHY IT ADAPTS ONTO `PropControl` INSTEAD OF DISPATCHING ITSELF ─────
|
|
8
|
+
//
|
|
9
|
+
// It used to switch on the spec kind right here, on the argument that three
|
|
10
|
+
// arms cost less than a translation into `ControlSpec`. The argument was
|
|
11
|
+
// cheap and the bill was invisible: `PropControl` is where the drag-to-scrub
|
|
12
|
+
// route, the range slider and the searchable enum live, so a second dispatcher
|
|
13
|
+
// beside it does not stay merely smaller, it leaves every transition param
|
|
14
|
+
// permanently the poorer control.
|
|
15
|
+
//
|
|
16
|
+
// The adapter is total and lossless in the direction it runs: every
|
|
17
|
+
// `TransitionParamSpec` kind is a `ControlSpec` kind, carrying the same field
|
|
18
|
+
// names. Values come back through `resolveParams`, which is the lane's ONE
|
|
19
|
+
// param coercion path, for a commit and for every move of a drag alike: the
|
|
20
|
+
// inspector cannot invent a shape the stage, the exporter and the player would
|
|
21
|
+
// read differently.
|
|
22
|
+
import { PropRow } from "@dailies-studio/ui";
|
|
23
|
+
import type { ScrubHandlers } from "@dailies-studio/ui";
|
|
24
|
+
import { resolveParams } from "@dailies-studio/transitions";
|
|
12
25
|
import type { TransitionParamSpec } from "@dailies-studio/transitions";
|
|
26
|
+
import { humanizeKey } from "@dailies-studio/contract";
|
|
27
|
+
import type { ControlSpec } from "@dailies-studio/contract";
|
|
13
28
|
import type { Value, Vec2 } from "@dailies-studio/engine";
|
|
14
29
|
|
|
15
30
|
export function ParamRow(props: {
|
|
16
31
|
spec: TransitionParamSpec;
|
|
17
32
|
value: Value;
|
|
18
33
|
onCommit(next: Value): void;
|
|
34
|
+
/** The document scrub bracket for this param, so a drag previews on the
|
|
35
|
+
* stage under the pointer and is one undo entry. Its `move` is handed the
|
|
36
|
+
* COERCED value, as `onCommit` is. */
|
|
37
|
+
scrub: ScrubHandlers;
|
|
19
38
|
}) {
|
|
20
|
-
const { spec } = props;
|
|
21
|
-
const
|
|
22
|
-
const limits: { min?: number; max?: number } = {};
|
|
23
|
-
if (spec.min !== undefined) limits.min = spec.min;
|
|
24
|
-
if (spec.max !== undefined) limits.max = spec.max;
|
|
25
|
-
|
|
26
|
-
if (spec.kind === "boolean") {
|
|
27
|
-
return (
|
|
28
|
-
<InspectorRow label={label}>
|
|
29
|
-
<Toggle
|
|
30
|
-
checked={props.value === true}
|
|
31
|
-
ariaLabel={label}
|
|
32
|
-
onChange={(next) => props.onCommit(next)}
|
|
33
|
-
/>
|
|
34
|
-
</InspectorRow>
|
|
35
|
-
);
|
|
36
|
-
}
|
|
37
|
-
if (spec.kind === "vec2") {
|
|
38
|
-
const v = asVec2(props.value);
|
|
39
|
-
return (
|
|
40
|
-
<InspectorRow label={label}>
|
|
41
|
-
{([0, 1] as const).map((i) => (
|
|
42
|
-
<NumberField
|
|
43
|
-
key={i}
|
|
44
|
-
value={v[i]}
|
|
45
|
-
ariaLabel={`${label} ${i === 0 ? "X" : "Y"}`}
|
|
46
|
-
{...limits}
|
|
47
|
-
step={spec.step ?? 0.01}
|
|
48
|
-
onCommit={(next) => props.onCommit(i === 0 ? [next, v[1]] : [v[0], next])}
|
|
49
|
-
/>
|
|
50
|
-
))}
|
|
51
|
-
</InspectorRow>
|
|
52
|
-
);
|
|
53
|
-
}
|
|
39
|
+
const { spec, onCommit, scrub } = props;
|
|
40
|
+
const coerce = (raw: unknown): Value => resolveParams([spec], () => raw as Value)[spec.name]!;
|
|
54
41
|
return (
|
|
55
|
-
<
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
42
|
+
<PropRow
|
|
43
|
+
spec={toControlSpec(spec)}
|
|
44
|
+
value={props.value}
|
|
45
|
+
commit={(raw) => onCommit(coerce(raw))}
|
|
46
|
+
scrub={{ start: scrub.start, move: (raw) => scrub.move(coerce(raw)), end: scrub.end }}
|
|
47
|
+
// The param's name, which is its whole identity: a key in
|
|
48
|
+
// `transition.params`. A hook for tests and automation that does not
|
|
49
|
+
// depend on the words the row shows.
|
|
50
|
+
rowProps={{ "data-param": spec.name }}
|
|
51
|
+
// The one colour spelling this lane stores is `#rrggbb`, so the picker
|
|
52
|
+
// offers no alpha it would throw away: `resolveParams` refuses an
|
|
53
|
+
// 8-digit hex and puts the preset's default back.
|
|
54
|
+
{...(spec.kind === "color" ? { opaqueColor: true } : {})}
|
|
55
|
+
/>
|
|
64
56
|
);
|
|
65
57
|
}
|
|
66
58
|
|
|
59
|
+
/**
|
|
60
|
+
* `TransitionParamSpec` -> the `ControlSpec` `PropControl` speaks.
|
|
61
|
+
*
|
|
62
|
+
* `key` and `propName` are both the param NAME because that is the only
|
|
63
|
+
* identity a transition param has: it is a key in `transition.params`, never a
|
|
64
|
+
* prop on a component. The label is the preset's own when it gives one, and
|
|
65
|
+
* otherwise the name humanized ("smoothness" reads "Smoothness"), never the
|
|
66
|
+
* raw key. Humanized HERE rather than left to `controlLabel`, because
|
|
67
|
+
* `humanizeKey` splits camelCase only, and a GL preset's names keep the
|
|
68
|
+
* shader's snake_case: "zoom_quickness" read "Zoom_quickness".
|
|
69
|
+
*
|
|
70
|
+
* `animatable: false` is the truth in this lane rather than a shrug. No track
|
|
71
|
+
* path reaches `transition.params`, so a param is a static field on the
|
|
72
|
+
* transition; and `Animatable` is only ever read by the contract hasher, which
|
|
73
|
+
* nothing on this path goes through.
|
|
74
|
+
*/
|
|
75
|
+
function toControlSpec(spec: TransitionParamSpec): ControlSpec {
|
|
76
|
+
const base = {
|
|
77
|
+
key: spec.name,
|
|
78
|
+
propName: spec.name,
|
|
79
|
+
animatable: false as const,
|
|
80
|
+
label: spec.label ?? humanizeKey(spec.name.replace(/_/g, " ")),
|
|
81
|
+
};
|
|
82
|
+
if (spec.kind === "boolean") return { ...base, kind: "boolean", default: spec.default === true };
|
|
83
|
+
if (spec.kind === "color") {
|
|
84
|
+
return { ...base, kind: "color", default: typeof spec.default === "string" ? spec.default : "#ffffff" };
|
|
85
|
+
}
|
|
86
|
+
// A step only where the preset names one: absent, `PropControl` takes the
|
|
87
|
+
// range's own quantum for a bounded number and 0.01 for an open one.
|
|
88
|
+
const limits = {
|
|
89
|
+
...(spec.step === undefined ? {} : { step: spec.step }),
|
|
90
|
+
...(spec.min === undefined ? {} : { min: spec.min }),
|
|
91
|
+
...(spec.max === undefined ? {} : { max: spec.max }),
|
|
92
|
+
};
|
|
93
|
+
return spec.kind === "vec2"
|
|
94
|
+
? { ...base, kind: "vec2", default: asVec2(spec.default), ...limits }
|
|
95
|
+
: { ...base, kind: "number", default: typeof spec.default === "number" ? spec.default : 0, ...limits };
|
|
96
|
+
}
|
|
97
|
+
|
|
67
98
|
function asVec2(v: Value): Vec2 {
|
|
68
99
|
return Array.isArray(v) && typeof v[0] === "number" && typeof v[1] === "number"
|
|
69
100
|
? [v[0], v[1]]
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// The right column of the docked shell: the inspector, or the agent in its
|
|
2
|
+
// place. The column is the grid cell and paints the ground; its occupant fills
|
|
3
|
+
// it. The cell stands even with no document open, so the stage never shows
|
|
4
|
+
// through an empty right column.
|
|
5
|
+
//
|
|
6
|
+
// The head is the column's, not an occupant's: it names which one is showing
|
|
7
|
+
// and switches between them, at the bar height, so its bottom edge is the
|
|
8
|
+
// canvas bar's and the left column's. The inspector's status footer
|
|
9
|
+
// (InspectorFooter) pins under it at the same height.
|
|
10
|
+
//
|
|
11
|
+
// ON THE BOARD, ONE LADDER (`boardRightPanel`): the agent, then comments, then
|
|
12
|
+
// the component sheet (S3) while one component card is
|
|
13
|
+
// selected, then the inspector when the selection names a task (a card, a
|
|
14
|
+
// gap, a cut), then Project assets while the author has them open (the +
|
|
15
|
+
// menu), or the Plan panel while one shot card is selected (Paper SB1).
|
|
16
|
+
// Otherwise the board has no right cell at all: App draws the column at 0 and
|
|
17
|
+
// the canvas runs to the window's edge. On a shot board the Plan panel is the
|
|
18
|
+
// panel at rest and the item inspector (`"sketch"`) the panel for a pick. The
|
|
19
|
+
// component sheet, the Plan panel and the item inspector bring their own 40
|
|
20
|
+
// head, so the column head steps aside for them.
|
|
21
|
+
//
|
|
22
|
+
// IN COMPONENTS, the same ladder: the agent, comments, then the open
|
|
23
|
+
// component's inspector. The home (no component open) has nothing to
|
|
24
|
+
// inspect, so the column is empty there too, and App draws it at 0.
|
|
25
|
+
//
|
|
26
|
+
// THE TABS: Brief | Inspector | Comments | Agent (S4, Paper page 20). Brief is
|
|
27
|
+
// the Studio's only (ShotBrief): what the board planned for the Shot under the
|
|
28
|
+
// playhead, and "Mark shot built". The board's own column is task-led and
|
|
29
|
+
// Components inspects a component, not a Shot, so neither has a Brief.
|
|
30
|
+
// Comments is the Project's threads (CommentsPanel), on the board or off it,
|
|
31
|
+
// gated by `can.comment`; its badge counts the open threads.
|
|
32
|
+
//
|
|
33
|
+
// THE VERSION HISTORY TAKES THE WHOLE COLUMN while it is open, head and all
|
|
34
|
+
// (File > Version history, Cmd+S). The agent stays mounted under it, hidden.
|
|
35
|
+
//
|
|
36
|
+
// ON DEMAND (app/lazySurfaces.tsx): the agent, Comments, the Version history
|
|
37
|
+
// and the board's three panels are chunks fetched the first time they show.
|
|
38
|
+
// The agent mounts at its first open and stays mounted from then on.
|
|
39
|
+
import { Activity } from "react";
|
|
40
|
+
import { LockedControls, SegmentedControl } from "@dailies-studio/ui";
|
|
41
|
+
import { agentGate, agentInEditor } from "../agent/agentGate.js";
|
|
42
|
+
import { InspectorFooter } from "./InspectorFooter.js";
|
|
43
|
+
import { InspectorPanel } from "./InspectorPanel.js";
|
|
44
|
+
import { BoardAssets } from "../files/AssetsTab.js";
|
|
45
|
+
import { useOpenHere } from "../comments/parts.js";
|
|
46
|
+
import { ShotBrief } from "../storyboard/ShotBrief.js";
|
|
47
|
+
import { useLatch } from "../../app/lazyPanel.js";
|
|
48
|
+
import {
|
|
49
|
+
AgentPanel,
|
|
50
|
+
CommentsPanel,
|
|
51
|
+
ComponentSheet,
|
|
52
|
+
PlanOccupant,
|
|
53
|
+
SketchInspector,
|
|
54
|
+
VersionHistoryPanel,
|
|
55
|
+
} from "../../app/lazySurfaces.js";
|
|
56
|
+
import { useShotEditor, useStore } from "../../state/context.js";
|
|
57
|
+
import { NO_COMMENT, boardRightPanel, workspaceOf } from "../../state/workspace.js";
|
|
58
|
+
|
|
59
|
+
export function RightColumn() {
|
|
60
|
+
const store = useStore();
|
|
61
|
+
const agentOpen = useShotEditor((s) => s.agentOpen);
|
|
62
|
+
const credentials = useShotEditor((s) => s.agentCredentials);
|
|
63
|
+
const probeError = useShotEditor((s) => s.agentCredentialsError);
|
|
64
|
+
const gate = agentGate(credentials, probeError);
|
|
65
|
+
const panel = useShotEditor(boardRightPanel);
|
|
66
|
+
const readOnly = useShotEditor((s) => s.readOnly);
|
|
67
|
+
const canComment = useShotEditor((s) => s.canComment);
|
|
68
|
+
const open = useOpenHere();
|
|
69
|
+
const onBoard = useShotEditor((s) => s.storyboardOpen);
|
|
70
|
+
const inComponents = useShotEditor((s) => workspaceOf(s) === "components");
|
|
71
|
+
const tab = agentOpen ? "agent" : panel === "comments" ? "comments" : panel === "brief" ? "brief" : "inspector";
|
|
72
|
+
const versionsOpen = useShotEditor((s) => s.versionsOpen);
|
|
73
|
+
// Never opened, never fetched: the agent's chunk waits for its first open.
|
|
74
|
+
const agentMounted = useLatch(agentOpen);
|
|
75
|
+
// Under the Version history the column's own occupants step aside.
|
|
76
|
+
const occupant = versionsOpen ? null : panel;
|
|
77
|
+
// These bring their own head (`.panel-head`), in place of the tabs.
|
|
78
|
+
const ownHead = occupant === "component" || occupant === "plan" || occupant === "sketch";
|
|
79
|
+
return (
|
|
80
|
+
// EMPTY only with no occupant (the board with nothing picked, the
|
|
81
|
+
// Components home): the canvas takes the width (S1), and the 0 wide
|
|
82
|
+
// column must not draw its seam.
|
|
83
|
+
<section className="inspector-column" data-empty={!versionsOpen && panel === null ? "" : undefined}>
|
|
84
|
+
{/* One slot, so the agent below keeps its place (and its state). */}
|
|
85
|
+
{versionsOpen ? (
|
|
86
|
+
<VersionHistoryPanel />
|
|
87
|
+
) : ownHead ? null : (
|
|
88
|
+
<div className="panel-head column-head">
|
|
89
|
+
<SegmentedControl
|
|
90
|
+
ariaLabel="Right panel"
|
|
91
|
+
className="is-bar"
|
|
92
|
+
value={tab}
|
|
93
|
+
options={[
|
|
94
|
+
...(onBoard || inComponents ? [] : [{ value: "brief", label: "Brief", testId: "right-tab-brief" }]),
|
|
95
|
+
{ value: "inspector", label: "Inspector", testId: "right-tab-inspector" },
|
|
96
|
+
{
|
|
97
|
+
value: "comments",
|
|
98
|
+
label: (
|
|
99
|
+
<>
|
|
100
|
+
Comments
|
|
101
|
+
{open > 0 ? <span className="column-tab-count">{open}</span> : null}
|
|
102
|
+
</>
|
|
103
|
+
),
|
|
104
|
+
title: canComment ? "Comments" : NO_COMMENT,
|
|
105
|
+
disabled: !canComment && tab !== "comments",
|
|
106
|
+
testId: "right-tab-comments",
|
|
107
|
+
},
|
|
108
|
+
...(agentInEditor()
|
|
109
|
+
? [
|
|
110
|
+
{
|
|
111
|
+
value: "agent",
|
|
112
|
+
label: "Agent",
|
|
113
|
+
title: gate.title,
|
|
114
|
+
// Never disabled while it is the open tab: a selected segment
|
|
115
|
+
// that cannot take focus leaves the group unreachable by keyboard.
|
|
116
|
+
disabled: !gate.ready && !agentOpen,
|
|
117
|
+
testId: "right-tab-agent",
|
|
118
|
+
},
|
|
119
|
+
]
|
|
120
|
+
: []),
|
|
121
|
+
]}
|
|
122
|
+
onChange={(next) => store.setRightTab(next as typeof tab)}
|
|
123
|
+
/>
|
|
124
|
+
</div>
|
|
125
|
+
)}
|
|
126
|
+
{/* The agent stays mounted while the inspector shows, hidden with its
|
|
127
|
+
effects stopped, so a trip to the other tab keeps the unsent prompt.
|
|
128
|
+
The inspector remounts: its sections play no entrance on a mount. */}
|
|
129
|
+
{agentMounted ? (
|
|
130
|
+
<Activity mode={agentOpen && !versionsOpen ? "visible" : "hidden"}>
|
|
131
|
+
<AgentPanel />
|
|
132
|
+
</Activity>
|
|
133
|
+
) : null}
|
|
134
|
+
{occupant === "comments" ? <CommentsPanel /> : null}
|
|
135
|
+
{occupant === "brief" ? <ShotBrief /> : null}
|
|
136
|
+
{/* A VIEWER reads every row: each field shows its own locked state.
|
|
137
|
+
Section folds and the head's navigation stay live. */}
|
|
138
|
+
{occupant === "inspector" ? (
|
|
139
|
+
<LockedControls value={readOnly}>
|
|
140
|
+
<InspectorPanel />
|
|
141
|
+
</LockedControls>
|
|
142
|
+
) : null}
|
|
143
|
+
{/* The inspector's footer, not the column's: the agent pins its own
|
|
144
|
+
composer to the bottom and has no container to report. */}
|
|
145
|
+
{occupant === "inspector" ? <InspectorFooter /> : null}
|
|
146
|
+
{occupant === "component" ? <ComponentSheet /> : null}
|
|
147
|
+
{occupant === "plan" ? <PlanOccupant /> : null}
|
|
148
|
+
{occupant === "sketch" ? <SketchInspector /> : null}
|
|
149
|
+
{occupant === "assets" ? <BoardAssets /> : null}
|
|
150
|
+
</section>
|
|
151
|
+
);
|
|
152
|
+
}
|