@dailies-studio/shot-editor 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.vite/manifest.json +382 -0
- package/dist/assets/AgentPanel-CQejLbiX.js +2 -0
- package/dist/assets/AgentPanel-DJEphah0.css +1 -0
- package/dist/assets/AgentQuestionDialog-BqkD0kXF.js +1 -0
- package/dist/assets/CodeStudio-Dv4ihHpz.js +23 -0
- package/dist/assets/CommentsPanel-B4yhhT1T.js +1 -0
- package/dist/assets/ComponentLibraryRail-Ch_dsAru.js +1 -0
- package/dist/assets/ComponentStage-BRhRotyH.js +1 -0
- package/dist/assets/CurvePane-BjFVabKX.css +1 -0
- package/dist/assets/CurvePane-R22WzllJ.js +1 -0
- package/dist/assets/ExportDialog-CWLQWTmG.js +2 -0
- package/dist/assets/FontPicker-DWKaYL7F.js +1 -0
- package/dist/assets/FontPicker-v0IOIArM.css +1 -0
- package/dist/assets/GenerateDrawer-Bh3SqDKt.js +2 -0
- package/dist/assets/InsertDrawer-Ce1fod1L.js +1 -0
- package/dist/assets/LibraryBrowser-D9sEGz5w.js +2 -0
- package/dist/assets/MakeItYoursSection-CMO4319_.js +2 -0
- package/dist/assets/MaterialGraphCanvas-BFzl4wWR.js +23 -0
- package/dist/assets/MaterialGraphCanvas-BIUD59ik.css +1 -0
- package/dist/assets/MaterialWorkspace-CqTWqaRA.js +14 -0
- package/dist/assets/PreferencesDialog-CBf9_OoD.js +1 -0
- package/dist/assets/PresetsSection-CUEaoCVU.js +1 -0
- package/dist/assets/SoundHistory-BeS8EW1h.js +1 -0
- package/dist/assets/SoundMode-BmcZru3i.js +3 -0
- package/dist/assets/StockSounds-DdAUGRYK.js +1 -0
- package/dist/assets/TemplateFieldSection-CaeXpLFo.js +1 -0
- package/dist/assets/VersionHistoryPanel-CxG6XhNP.js +1 -0
- package/dist/assets/board-B88EPuLO.css +1 -0
- package/dist/assets/board-CL-he7SL.js +3 -0
- package/dist/assets/components-0oOSPN0l.js +1 -0
- package/dist/assets/googleFontRanges-gp32wJMo.js +1 -0
- package/dist/assets/googleFonts-BNon6M7X.js +1 -0
- package/dist/assets/iconsAndAliases-DL7gXP5j.js +1863 -0
- package/dist/assets/index-4F5NQmI8.css +1 -0
- package/dist/assets/index-BGHQGV5z.js +117 -0
- package/dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/dist/assets/libraryModel-CpIwfFha.js +1 -0
- package/dist/assets/lucide-6iK64tTB.js +9319 -0
- package/dist/assets/motionStamp-CH-Hew4E.js +1 -0
- package/dist/assets/takeMeasure-Tdg0TxEi.js +1 -0
- package/dist/assets/webmcp-BsB9gxWC.js +2 -0
- package/dist/index.html +34 -3
- package/package.json +12 -9
- package/src/addFamilies.ts +66 -0
- package/src/api.ts +1631 -55
- package/src/app/App.tsx +977 -198
- package/src/app/lazyPanel.tsx +137 -0
- package/src/app/lazySurfaces.tsx +203 -0
- package/src/audio/index.tsx +41 -10
- package/src/audio/meter.ts +485 -0
- package/src/audio/meterMath.ts +273 -0
- package/src/audio/meterStore.ts +155 -0
- package/src/audio/offlineMix.ts +289 -0
- package/src/audio/preview.ts +928 -118
- package/src/bridge.ts +15 -5
- package/src/bridgeTypes.ts +1611 -36
- package/src/channels.ts +17 -32
- package/src/fonts/googleFonts.ts +4 -0
- package/src/hostApi.ts +174 -0
- package/src/icons.tsx +770 -0
- package/src/layerWords.ts +61 -0
- package/src/main.tsx +56 -4
- package/src/panels/ResizeHandle.tsx +33 -43
- package/src/panels/agent/AgentDots.tsx +36 -0
- package/src/panels/agent/AgentPanel.tsx +119 -43
- package/src/panels/agent/AgentQuestionDialog.tsx +202 -0
- package/src/panels/agent/agent.css +113 -97
- package/src/panels/agent/agentGate.ts +35 -0
- package/src/panels/code/CodeDefaultsPanel.tsx +345 -0
- package/src/panels/code/CodeStudio.tsx +373 -0
- package/src/panels/code/FileTree.tsx +265 -0
- package/src/panels/code/codeBufferGuard.ts +52 -0
- package/src/panels/code/codeParts.tsx +321 -0
- package/src/panels/comments/CommentComposer.tsx +239 -0
- package/src/panels/comments/CommentThread.tsx +346 -0
- package/src/panels/comments/CommentsPanel.tsx +336 -0
- package/src/panels/comments/InboxButton.tsx +131 -0
- package/src/panels/comments/MentionMenu.tsx +98 -0
- package/src/panels/comments/parts.tsx +171 -0
- package/src/panels/export/ExportDialog.tsx +919 -96
- package/src/panels/export/ExportScrim.tsx +57 -0
- package/src/panels/files/AssetsTab.tsx +656 -0
- package/src/panels/files/FilePanel.tsx +1466 -216
- package/src/panels/files/LayerMarks.tsx +40 -0
- package/src/panels/files/LeftColumn.tsx +37 -0
- package/src/panels/files/McpSection.tsx +690 -47
- package/src/panels/files/MissingAssetsNotice.tsx +60 -0
- package/src/panels/files/assetDrag.ts +79 -0
- package/src/panels/files/resourceParts.tsx +255 -0
- package/src/panels/fonts/FontPicker.tsx +762 -0
- package/src/panels/fonts/faceCache.ts +207 -0
- package/src/panels/fonts/fontPicker.css +271 -0
- package/src/panels/fonts/pickerModel.ts +265 -0
- package/src/panels/fonts/pickerRequest.ts +46 -0
- package/src/panels/header/AccountAvatar.tsx +76 -0
- package/src/panels/header/AgentChip.tsx +77 -0
- package/src/panels/header/AppMenu.tsx +213 -0
- package/src/panels/header/Header.tsx +564 -84
- package/src/panels/header/HistoryControls.tsx +31 -5
- package/src/panels/header/PresenceStack.tsx +329 -0
- package/src/panels/header/ProjectTitle.tsx +232 -0
- package/src/panels/header/ShareButton.tsx +59 -0
- package/src/panels/header/StatusBadges.tsx +358 -27
- package/src/panels/header/SyncDeletedDialog.tsx +88 -0
- package/src/panels/header/ZoomControls.tsx +46 -15
- package/src/panels/header/agentHandoff.ts +52 -0
- package/src/panels/header/leave.ts +26 -0
- package/src/panels/help/HelpSection.tsx +189 -163
- package/src/panels/insert/InsertDrawer.tsx +723 -0
- package/src/panels/insert/iconSet.ts +109 -0
- package/src/panels/inspector/ExposeDot.tsx +117 -0
- package/src/panels/inspector/FramingRows.tsx +314 -44
- package/src/panels/inspector/InspectorFooter.tsx +91 -0
- package/src/panels/inspector/InspectorHead.tsx +425 -0
- package/src/panels/inspector/InspectorPanel.tsx +408 -124
- package/src/panels/inspector/KeyframeDot.tsx +373 -0
- package/src/panels/inspector/KeyframeSection.tsx +257 -0
- package/src/panels/inspector/MarkerSection.tsx +55 -11
- package/src/panels/inspector/ParamRow.tsx +84 -53
- package/src/panels/inspector/RightColumn.tsx +152 -0
- package/src/panels/inspector/TimeSection.tsx +866 -0
- package/src/panels/inspector/animate/EaseControl.tsx +244 -0
- package/src/panels/inspector/animate/PresetsSection.tsx +135 -0
- package/src/panels/inspector/animate/ShotSection.tsx +562 -48
- package/src/panels/inspector/design/AlignRow.tsx +95 -31
- package/src/panels/inspector/design/AppearanceSection.tsx +118 -9
- package/src/panels/inspector/design/ClonerSection.tsx +323 -62
- package/src/panels/inspector/design/ComponentSection.tsx +50 -43
- package/src/panels/inspector/design/CornerSection.tsx +45 -14
- package/src/panels/inspector/design/DefinitionProps.tsx +315 -0
- package/src/panels/inspector/design/DefinitionSection.tsx +136 -0
- package/src/panels/inspector/design/DeviceSection.tsx +210 -0
- package/src/panels/inspector/design/FillSection.tsx +83 -51
- package/src/panels/inspector/design/FontField.tsx +196 -0
- package/src/panels/inspector/design/HtmlSection.tsx +23 -12
- package/src/panels/inspector/design/InstanceSection.tsx +373 -154
- package/src/panels/inspector/design/MaskSection.tsx +84 -0
- package/src/panels/inspector/design/MaterialSection.tsx +177 -0
- package/src/panels/inspector/design/MediaSection.tsx +273 -120
- package/src/panels/inspector/design/MeshSection.tsx +910 -82
- package/src/panels/inspector/design/PaintRows.tsx +550 -0
- package/src/panels/inspector/design/PlateStyleSection.tsx +177 -0
- package/src/panels/inspector/design/ShadowSection.tsx +221 -48
- package/src/panels/inspector/design/SplineFollowSection.tsx +235 -0
- package/src/panels/inspector/design/StrokeSection.tsx +228 -43
- package/src/panels/inspector/design/TemplateFieldSection.tsx +57 -0
- package/src/panels/inspector/design/TransformSection.tsx +244 -50
- package/src/panels/inspector/design/TypographySection.tsx +679 -110
- package/src/panels/inspector/layout.ts +295 -0
- package/src/panels/inspector/propValue.ts +199 -0
- package/src/panels/inspector/scene/CameraSection.tsx +232 -22
- package/src/panels/inspector/scene/EffectsSection.tsx +722 -71
- package/src/panels/inspector/scene/MakeItYoursSection.tsx +180 -0
- package/src/panels/inspector/scene/SceneDocSection.tsx +191 -0
- package/src/panels/inspector/scene/SceneSection.tsx +219 -44
- package/src/panels/inspector/scene/TransitionSection.tsx +523 -72
- package/src/panels/inspector/storyboard/StoryboardReferenceSection.tsx +593 -0
- package/src/panels/inspector/storyboard/VideoStill.tsx +120 -0
- package/src/panels/inspector/timeModel.ts +190 -0
- package/src/panels/inspector/useDocWrite.ts +438 -146
- package/src/panels/library/LibraryBrowser.tsx +435 -0
- package/src/panels/library/LibraryGrid.tsx +190 -0
- package/src/panels/library/LibraryPreviewPanel.tsx +349 -0
- package/src/panels/library/LibraryRail.tsx +84 -0
- package/src/panels/library/LibrarySoundPanel.tsx +293 -0
- package/src/panels/library/SoundHistory.tsx +245 -0
- package/src/panels/library/StockSounds.tsx +390 -0
- package/src/panels/library/libraryModel.ts +147 -0
- package/src/panels/library/stockSearch.ts +77 -0
- package/src/panels/maskMarks.tsx +117 -0
- package/src/panels/material/MaterialCommentNode.tsx +54 -0
- package/src/panels/material/MaterialGraphCanvas.tsx +861 -0
- package/src/panels/material/MaterialGraphMenu.tsx +45 -0
- package/src/panels/material/MaterialGroupNode.tsx +56 -0
- package/src/panels/material/MaterialLibrary.tsx +253 -0
- package/src/panels/material/MaterialNode.tsx +453 -0
- package/src/panels/material/MaterialNodePalette.tsx +349 -0
- package/src/panels/material/MaterialParameterControls.tsx +525 -0
- package/src/panels/material/MaterialRerouteNode.tsx +42 -0
- package/src/panels/material/MaterialWorkspace.tsx +501 -0
- package/src/panels/material/NodePreview.tsx +70 -0
- package/src/panels/material/flowModel.ts +441 -0
- package/src/panels/material/parameterValues.ts +231 -0
- package/src/panels/material/previewScheduler.ts +235 -0
- package/src/panels/material/reactFlow.css +6 -0
- package/src/panels/material/socketGlyph.ts +85 -0
- package/src/panels/material/viewportMemory.ts +58 -0
- package/src/panels/preferences/PreferencesDialog.tsx +215 -0
- package/src/panels/share/ShareComponentDialog.tsx +247 -0
- package/src/panels/stage/StageMenu.tsx +35 -5
- package/src/panels/stage/StagePanel.tsx +338 -23
- package/src/panels/stage/cellSlots.tsx +70 -0
- package/src/panels/storyboard/BoardCanvas.tsx +739 -0
- package/src/panels/storyboard/BoardCursors.tsx +158 -0
- package/src/panels/storyboard/BoardDropDialog.tsx +161 -0
- package/src/panels/storyboard/BoardPlan.tsx +42 -0
- package/src/panels/storyboard/ComponentSheet.tsx +187 -0
- package/src/panels/storyboard/ComponentStage.tsx +235 -0
- package/src/panels/storyboard/MiniSketch.tsx +173 -0
- package/src/panels/storyboard/PartPicker.tsx +64 -0
- package/src/panels/storyboard/PlanPanel.tsx +617 -0
- package/src/panels/storyboard/ReferencePreview.tsx +217 -0
- package/src/panels/storyboard/ShotBrief.tsx +360 -0
- package/src/panels/storyboard/ShotCard.tsx +251 -0
- package/src/panels/storyboard/StagePreview.tsx +348 -0
- package/src/panels/storyboard/StillThumbs.tsx +162 -0
- package/src/panels/storyboard/StoryboardView.tsx +79 -0
- package/src/panels/storyboard/board.css +1065 -0
- package/src/panels/storyboard/board.ts +12 -0
- package/src/panels/storyboard/boardClipboard.ts +111 -0
- package/src/panels/storyboard/boardOrder.ts +68 -0
- package/src/panels/storyboard/boardRows.tsx +425 -0
- package/src/panels/storyboard/liveCap.ts +90 -0
- package/src/panels/storyboard/plan.css +295 -0
- package/src/panels/storyboard/posterCache.ts +133 -0
- package/src/panels/storyboard/shotboard/ComponentPicker.tsx +373 -0
- package/src/panels/storyboard/shotboard/ImagePicker.tsx +145 -0
- package/src/panels/storyboard/shotboard/ShotBoard.tsx +292 -0
- package/src/panels/storyboard/shotboard/SketchCanvas.tsx +443 -0
- package/src/panels/storyboard/shotboard/SketchInspector.tsx +471 -0
- package/src/panels/storyboard/shotboard/SketchItem.tsx +240 -0
- package/src/panels/storyboard/shotboard/SketchLayers.tsx +130 -0
- package/src/panels/storyboard/shotboard/SketchPlay.tsx +108 -0
- package/src/panels/storyboard/shotboard/SketchStrip.tsx +178 -0
- package/src/panels/storyboard/shotboard/SketchToolFooter.tsx +99 -0
- package/src/panels/storyboard/shotboard/sketch.css +1392 -0
- package/src/panels/storyboard/shotboard/sketchModel.ts +219 -0
- package/src/panels/storyboard/storyboardDrop.ts +164 -0
- package/src/panels/studio/ComponentLibraryRail.tsx +346 -0
- package/src/panels/studio/ComponentSidePanel.tsx +355 -0
- package/src/panels/studio/ComponentStudio.tsx +243 -0
- package/src/panels/studio/ComponentsHome.tsx +318 -0
- package/src/panels/studio/ComponentsPreview.tsx +179 -0
- package/src/panels/studio/EveryUse.tsx +244 -0
- package/src/panels/studio/ThisUsePanel.tsx +679 -0
- package/src/panels/studio/componentParts.tsx +341 -0
- package/src/panels/studio/components.ts +6 -0
- package/src/panels/studio/newCodeComponent.ts +66 -0
- package/src/panels/timeline/AudioFxButton.tsx +290 -0
- package/src/panels/timeline/AudioLane.tsx +674 -85
- package/src/panels/timeline/BlockRow.tsx +154 -85
- package/src/panels/timeline/ChannelRow.tsx +378 -129
- package/src/panels/timeline/CurvePane.tsx +508 -0
- package/src/panels/timeline/Filmstrip.tsx +361 -0
- package/src/panels/timeline/GenerateDrawer.tsx +407 -0
- package/src/panels/timeline/KeyStretch.tsx +115 -0
- package/src/panels/timeline/LifespanRow.tsx +730 -47
- package/src/panels/timeline/MarkerLane.tsx +46 -8
- package/src/panels/timeline/PlayButton.tsx +91 -0
- package/src/panels/timeline/PropertyPicker.tsx +254 -0
- package/src/panels/timeline/ShotRow.tsx +400 -0
- package/src/panels/timeline/SoundMode.tsx +1406 -0
- package/src/panels/timeline/TimelineDock.tsx +2338 -272
- package/src/panels/timeline/TransportVolume.tsx +163 -0
- package/src/panels/timeline/beatRuler.ts +74 -0
- package/src/panels/timeline/curveModel.ts +500 -0
- package/src/panels/timeline/duckUnderVoice.ts +68 -0
- package/src/panels/timeline/keyframeMenu.ts +138 -0
- package/src/panels/timeline/labelWidth.ts +49 -0
- package/src/panels/timeline/marquee.ts +155 -0
- package/src/panels/timeline/model.ts +1860 -199
- package/src/panels/timeline/snap.ts +125 -43
- package/src/panels/timeline/staggerPreview.tsx +92 -0
- package/src/panels/timeline/takeMeasure.ts +72 -0
- package/src/panels/timeline/useLive.ts +48 -0
- package/src/panels/timeline/viewport.ts +234 -0
- package/src/panels/toolbar/BackChip.tsx +116 -0
- package/src/panels/toolbar/CameraViewBar.tsx +118 -49
- package/src/panels/toolbar/CanvasBar.tsx +117 -0
- package/src/panels/toolbar/InsertButton.tsx +38 -0
- package/src/panels/toolbar/IsolationTrail.tsx +156 -0
- package/src/panels/toolbar/PanelToggles.tsx +86 -0
- package/src/panels/toolbar/ShadingBar.tsx +119 -26
- package/src/panels/toolbar/ToolDockBar.tsx +329 -80
- package/src/panels/toolbar/ToolFooter.tsx +102 -0
- package/src/panels/toolbar/ViewModeBar.tsx +247 -38
- package/src/panels/toolbar/WorkPlaneBar.tsx +94 -0
- package/src/panels/toolbar/useAddRows.tsx +326 -0
- package/src/panels/toolbar/useDismiss.ts +122 -0
- package/src/panels/versions/VersionHistoryPanel.tsx +274 -0
- package/src/panels/versions/versionModel.ts +103 -0
- package/src/panels/virtualWindow.ts +271 -0
- package/src/shotTokens.css +151 -60
- package/src/stage/FrustumGizmo.tsx +504 -84
- package/src/stage/GridPlane.tsx +225 -16
- package/src/stage/NodePreviews.tsx +628 -0
- package/src/stage/PerfHud.tsx +437 -47
- package/src/stage/SplitRenderer.tsx +816 -169
- package/src/stage/StageApp.tsx +4274 -486
- package/src/stage/StageRootBoundary.tsx +114 -0
- package/src/stage/StageTools.tsx +651 -151
- package/src/stage/TransformGizmo.tsx +696 -0
- package/src/stage/adaptivePresentation.ts +145 -0
- package/src/stage/bridgeClient.ts +2522 -41
- package/src/stage/exportWorker.ts +9 -0
- package/src/stage/feed.ts +305 -14
- package/src/stage/fontPreview.ts +176 -0
- package/src/stage/frustumGeometry.ts +319 -1
- package/src/stage/furnitureTokens.ts +33 -0
- package/src/stage/gizmoMath.ts +508 -16
- package/src/stage/gpuTimer.ts +276 -0
- package/src/stage/instanceModules.ts +194 -33
- package/src/stage/interactions/move.ts +24 -5
- package/src/stage/isolation.ts +291 -33
- package/src/stage/jsSelfProfiler.ts +325 -0
- package/src/stage/main.tsx +116 -16
- package/src/stage/modalState.ts +222 -23
- package/src/stage/moduleEpoch.ts +60 -0
- package/src/stage/motionPathStage.ts +279 -0
- package/src/stage/motionPreview.ts +74 -0
- package/src/stage/overlays/Overlays.tsx +1112 -159
- package/src/stage/overlays/Rulers.tsx +495 -0
- package/src/stage/panes.ts +159 -10
- package/src/stage/project.ts +68 -3
- package/src/stage/renderScaleController.ts +730 -0
- package/src/stage/rulers.ts +129 -0
- package/src/stage/sceneExtent.ts +75 -0
- package/src/stage/shading.ts +20 -0
- package/src/stage/splineStage.ts +632 -0
- package/src/stage/stagePerformanceTelemetry.ts +717 -0
- package/src/stage/stageTheme.ts +36 -0
- package/src/stage/stageWarmup.ts +11 -0
- package/src/stage/textAutoSize.ts +124 -0
- package/src/stage/tier1Export.ts +641 -0
- package/src/stage/tokenColor.ts +14 -9
- package/src/stage/view.ts +56 -9
- package/src/stage/workingView.ts +277 -33
- package/src/state/accountPrefs.ts +261 -0
- package/src/state/agentActions.ts +173 -15
- package/src/state/agentActivity.ts +198 -0
- package/src/state/agentQuestion.ts +239 -0
- package/src/state/bootOpen.ts +42 -0
- package/src/state/cameraVerbs.ts +139 -0
- package/src/state/clientId.ts +6 -1
- package/src/state/comments.ts +1099 -0
- package/src/state/context.tsx +19 -1
- package/src/state/editorPrefs.ts +220 -0
- package/src/state/errorReports.ts +121 -0
- package/src/state/fieldWrite.ts +161 -0
- package/src/state/fontRecents.ts +70 -0
- package/src/state/fonts.ts +656 -0
- package/src/state/graphClipboard.ts +414 -0
- package/src/state/imageThumbs.ts +216 -0
- package/src/state/insert.ts +444 -67
- package/src/state/isolationTrail.ts +92 -0
- package/src/state/keyMoves.ts +134 -0
- package/src/state/keyframeClipboard.ts +177 -0
- package/src/state/keymap.ts +1153 -117
- package/src/state/layoutPrefs.ts +272 -0
- package/src/state/layouts.ts +205 -0
- package/src/state/measureMedia.ts +167 -0
- package/src/state/menu.ts +2341 -28
- package/src/state/motionStamp.ts +7 -0
- package/src/state/panelSize.ts +375 -5
- package/src/state/pendingChanges.ts +119 -0
- package/src/state/playHold.ts +78 -0
- package/src/state/playbackPreparation.ts +562 -0
- package/src/state/posterCapture.ts +242 -0
- package/src/state/presence.ts +254 -0
- package/src/state/projectComponents.ts +160 -0
- package/src/state/renderEvents.ts +298 -18
- package/src/state/runtimeErrors.ts +46 -0
- package/src/state/selection.ts +12 -0
- package/src/state/shortcuts.ts +1606 -0
- package/src/state/sketchGuide.ts +51 -0
- package/src/state/splineRefs.ts +87 -0
- package/src/state/stageHealth.ts +259 -0
- package/src/state/stageWatchdog.ts +47 -0
- package/src/state/stillStage.ts +330 -0
- package/src/state/stillThumbs.ts +474 -0
- package/src/state/store.ts +23591 -2982
- package/src/state/storyboardModel.ts +528 -0
- package/src/state/sync.ts +1257 -0
- package/src/state/syncCache.ts +159 -0
- package/src/state/triangles.ts +13 -0
- package/src/state/types.ts +1698 -55
- package/src/state/unsavedGuard.ts +49 -0
- package/src/state/viewMode.ts +200 -0
- package/src/state/webmcp.ts +1128 -0
- package/src/state/workspace.ts +1147 -0
- package/src/styles/assets-tab.css +304 -0
- package/src/styles/canvas.css +545 -0
- package/src/styles/comments.css +1435 -0
- package/src/styles/controls.css +162 -0
- package/src/styles/dialogs.css +390 -0
- package/src/styles/insert-drawer.css +586 -0
- package/src/styles/inspector-board.css +207 -0
- package/src/styles/inspector-object.css +486 -0
- package/src/styles/inspector-shot.css +252 -0
- package/src/styles/inspector.css +360 -0
- package/src/styles/left-column.css +1628 -0
- package/src/styles/library-preview.css +575 -0
- package/src/styles/library.css +512 -0
- package/src/styles/modes/code.css +569 -0
- package/src/styles/modes/component.css +1561 -0
- package/src/styles/modes/material.css +1201 -0
- package/src/styles/modes/storyboard.css +518 -0
- package/src/styles/share-component.css +49 -0
- package/src/styles/shell.css +653 -0
- package/src/styles/shot-brief.css +360 -0
- package/src/styles/states.css +76 -0
- package/src/styles/sync.css +380 -0
- package/src/styles/timeline-graph.css +384 -0
- package/src/styles/timeline-meters.css +89 -0
- package/src/styles/timeline-rows.css +1959 -0
- package/src/styles/timeline-sound.css +1003 -0
- package/src/styles/timeline.css +754 -0
- package/src/styles/tool-footer.css +525 -0
- package/src/styles/topbar.css +886 -0
- package/src/styles/versions.css +262 -0
- package/src/styles.css +72 -2921
- package/src/tools.ts +108 -23
- package/dist/assets/index-B7notge7.css +0 -1
- package/dist/assets/index-BBE6Ta9L.js +0 -52
- package/src/panels/files/icons.tsx +0 -118
- package/src/panels/header/DocSwitcher.tsx +0 -85
- package/src/panels/header/TransportBar.tsx +0 -86
- package/src/panels/inspector/animate/BlockTiming.tsx +0 -341
- package/src/panels/inspector/animate/DuringBlocks.tsx +0 -85
- package/src/panels/inspector/animate/InOutPresets.tsx +0 -57
- package/src/panels/inspector/animate/ResolvedChannels.tsx +0 -150
- package/src/panels/inspector/animate/useBlocks.ts +0 -43
- package/src/panels/material/MaterialPicker.tsx +0 -172
- package/src/panels/timeline/SceneStrip.tsx +0 -145
- package/src/panels/toolbar/AddMenu.tsx +0 -230
- package/src/stage/MoveGizmo.tsx +0 -411
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
// "THE STORYBOARD IS READY. MAKE THE VIDEO?": the question an MCP agent asks between planning a
|
|
2
|
+
// video and making it (state/agentQuestion.ts, store agentQuestions.ts),
|
|
3
|
+
// answered here instead of in the agent's chat. An on-demand chunk
|
|
4
|
+
// (app/lazySurfaces.tsx): the shell's gate mounts it only while a question is
|
|
5
|
+
// open on screen.
|
|
6
|
+
//
|
|
7
|
+
// One primary, "Make the video". "Ask for changes" opens a required note.
|
|
8
|
+
// "Open storyboard" closes the dialog onto the board, unanswered; the agent's
|
|
9
|
+
// status chip opens it again. Escape closes it unanswered too. A Viewer sees
|
|
10
|
+
// the actions locked, with VIEW_ONLY in the error line. An answer refused
|
|
11
|
+
// because the question closed meanwhile stays on screen with why.
|
|
12
|
+
//
|
|
13
|
+
// An export question's primary is "Export the video": its yes opens the
|
|
14
|
+
// Export dialog with the agent's choices (ExportDialog reads `exportAsk`),
|
|
15
|
+
// which reports the saved video. A studio server render reports here, when
|
|
16
|
+
// its job ends: the Export dialog may be closed by then, and this chunk,
|
|
17
|
+
// latched once that render starts (app/lazySurfaces.tsx), is still mounted.
|
|
18
|
+
import { useEffect, useState, useSyncExternalStore } from "react";
|
|
19
|
+
import { Dialog } from "@dailies-studio/ui";
|
|
20
|
+
import type { AgentQuestion } from "../../api.js";
|
|
21
|
+
import type { AgentExportAsk, AgentQuestionState } from "../../state/agentQuestion.js";
|
|
22
|
+
import { useShotEditor, useStore } from "../../state/context.js";
|
|
23
|
+
import type { ShotEditorState } from "../../state/types.js";
|
|
24
|
+
import { VIEW_ONLY } from "../../state/workspace.js";
|
|
25
|
+
|
|
26
|
+
/** The server's role says view only. Not `readOnly` alone: a version preview
|
|
27
|
+
* or a live-sync hold makes an editor read only too, and an answer writes no
|
|
28
|
+
* document. Under a hold the role is unknown here, so the server judges, and
|
|
29
|
+
* its refusal shows in the error line. */
|
|
30
|
+
export const viewerOf = (s: Pick<ShotEditorState, "versionPreview" | "readOnly" | "syncStatus" | "syncDeleted">): boolean =>
|
|
31
|
+
s.versionPreview !== null ? s.versionPreview.roleReadOnly : s.readOnly && (s.syncStatus?.hold ?? null) === null && s.syncDeleted === null;
|
|
32
|
+
|
|
33
|
+
/** Report an export ask's studio server render once its job ends: the file
|
|
34
|
+
* it wrote, or nothing (a failure or a cancel), and the next export reports
|
|
35
|
+
* instead. Once: a refused report keeps the ask without that render. */
|
|
36
|
+
function useServerExportReport(ask: AgentExportAsk | null): void {
|
|
37
|
+
const store = useStore();
|
|
38
|
+
const job = useShotEditor((s) => s.renderJob);
|
|
39
|
+
const name = useShotEditor((s) => s.name);
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
if (ask?.serverJob === undefined || job === null || job.id !== ask.serverJob || job.phase === "running") return;
|
|
42
|
+
if (job.phase !== "done" || job.out === undefined || name === null) {
|
|
43
|
+
store.agentQuestion.exportOnServer(null);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const out = job.out;
|
|
47
|
+
store.agentQuestion.reportVideo(ask, name, { where: "project", path: out }).catch((e: unknown) => {
|
|
48
|
+
store.reportError(`${out} was rendered, but telling the agent failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
49
|
+
});
|
|
50
|
+
}, [ask, job, name, store]);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function AgentQuestionDialog() {
|
|
54
|
+
const store = useStore();
|
|
55
|
+
const q = useSyncExternalStore(store.agentQuestion.subscribe, store.agentQuestion.getState);
|
|
56
|
+
const docId = useShotEditor((s) => s.doc?.id ?? null);
|
|
57
|
+
useServerExportReport(q.exportAsk);
|
|
58
|
+
const question = q.question;
|
|
59
|
+
// The chunk stays mounted once loaded (the shell's latch): the store's
|
|
60
|
+
// `open` is what shows it, over the question's own Project only. A closed
|
|
61
|
+
// question shows only with the refusal of this tab's answer.
|
|
62
|
+
if (!q.open || question === null || question.projectId !== docId || (question.status !== "open" && q.error === null)) return null;
|
|
63
|
+
// Keyed by the question, so a new ask never inherits a note or the
|
|
64
|
+
// changes view written for the one before.
|
|
65
|
+
return <QuestionBody key={question.id} q={q} question={question} />;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function QuestionBody({ q, question }: { q: AgentQuestionState; question: AgentQuestion }) {
|
|
69
|
+
const store = useStore();
|
|
70
|
+
const viewer = useShotEditor(viewerOf);
|
|
71
|
+
const rev = useShotEditor((s) => s.rev);
|
|
72
|
+
// The Project's name now: a rename since the question was read still posts
|
|
73
|
+
// to the right Project.
|
|
74
|
+
const name = useShotEditor((s) => s.name);
|
|
75
|
+
const [asking, setAsking] = useState(false);
|
|
76
|
+
const [note, setNote] = useState("");
|
|
77
|
+
const close = (): void => store.agentQuestion.hide();
|
|
78
|
+
const closed = question.status !== "open";
|
|
79
|
+
const locked = viewer || closed || q.sending;
|
|
80
|
+
const stale = !closed && rev !== null && rev !== question.boardRev;
|
|
81
|
+
const asked = new Date(question.askedAt).toLocaleTimeString(undefined, { hour: "numeric", minute: "2-digit" });
|
|
82
|
+
const who = question.askedBy.member === null ? question.askedBy.client : `${question.askedBy.client} for ${question.askedBy.member}`;
|
|
83
|
+
|
|
84
|
+
return (
|
|
85
|
+
<Dialog
|
|
86
|
+
open
|
|
87
|
+
size="wide"
|
|
88
|
+
className="agent-question"
|
|
89
|
+
// The question is the title ("The storyboard is ready. Make the
|
|
90
|
+
// video?"), so it is said once.
|
|
91
|
+
title={<span data-testid="agent-question-text">{question.question}</span>}
|
|
92
|
+
onClose={close}
|
|
93
|
+
actions={
|
|
94
|
+
closed ? (
|
|
95
|
+
<button type="button" className="btn is-primary" data-testid="agent-question-close" onClick={close}>
|
|
96
|
+
Close
|
|
97
|
+
</button>
|
|
98
|
+
) : asking ? (
|
|
99
|
+
<>
|
|
100
|
+
<button type="button" className="btn" data-testid="agent-question-back" onClick={() => setAsking(false)}>
|
|
101
|
+
Back
|
|
102
|
+
</button>
|
|
103
|
+
<button
|
|
104
|
+
type="button"
|
|
105
|
+
className="btn is-primary"
|
|
106
|
+
data-testid="agent-question-send"
|
|
107
|
+
disabled={locked || name === null || note.trim() === ""}
|
|
108
|
+
onClick={() => {
|
|
109
|
+
if (name !== null) void store.agentQuestion.answer(name, "changes", note.trim());
|
|
110
|
+
}}
|
|
111
|
+
>
|
|
112
|
+
Send changes
|
|
113
|
+
</button>
|
|
114
|
+
</>
|
|
115
|
+
) : (
|
|
116
|
+
<>
|
|
117
|
+
<button
|
|
118
|
+
type="button"
|
|
119
|
+
className="btn"
|
|
120
|
+
data-testid="agent-question-board"
|
|
121
|
+
onClick={() => {
|
|
122
|
+
close();
|
|
123
|
+
store.setStoryboardOpen(true);
|
|
124
|
+
}}
|
|
125
|
+
>
|
|
126
|
+
Open storyboard
|
|
127
|
+
</button>
|
|
128
|
+
<button
|
|
129
|
+
type="button"
|
|
130
|
+
className="btn"
|
|
131
|
+
data-testid="agent-question-changes"
|
|
132
|
+
disabled={locked}
|
|
133
|
+
onClick={() => setAsking(true)}
|
|
134
|
+
>
|
|
135
|
+
Ask for changes
|
|
136
|
+
</button>
|
|
137
|
+
<button
|
|
138
|
+
type="button"
|
|
139
|
+
className="btn is-primary"
|
|
140
|
+
data-testid="agent-question-yes"
|
|
141
|
+
disabled={locked || name === null}
|
|
142
|
+
onClick={() => {
|
|
143
|
+
if (name === null) return;
|
|
144
|
+
void store.agentQuestion.answer(name, "yes").then((taken) => {
|
|
145
|
+
// The export the agent asked for, with its choices.
|
|
146
|
+
if (taken && question.export !== undefined) store.setExportOpen(true);
|
|
147
|
+
});
|
|
148
|
+
}}
|
|
149
|
+
>
|
|
150
|
+
{question.export === undefined ? "Make the video" : "Export the video"}
|
|
151
|
+
</button>
|
|
152
|
+
</>
|
|
153
|
+
)
|
|
154
|
+
}
|
|
155
|
+
>
|
|
156
|
+
{/* The agent's lines, as text: never markup. */}
|
|
157
|
+
<pre className="agent-question-summary" data-testid="agent-question-summary">
|
|
158
|
+
{question.summary}
|
|
159
|
+
</pre>
|
|
160
|
+
<p className="agent-question-who">
|
|
161
|
+
Asked by {who} at {asked}
|
|
162
|
+
</p>
|
|
163
|
+
{stale ? (
|
|
164
|
+
<p className="agent-question-stale" data-testid="agent-question-stale">
|
|
165
|
+
The storyboard changed after this was asked. Your answer tells the agent to read it again.
|
|
166
|
+
</p>
|
|
167
|
+
) : null}
|
|
168
|
+
{asking && !closed ? (
|
|
169
|
+
<label className="dialog-field">
|
|
170
|
+
<span className="dialog-label">What should change?</span>
|
|
171
|
+
<textarea
|
|
172
|
+
className="agent-question-note"
|
|
173
|
+
data-testid="agent-question-note"
|
|
174
|
+
rows={4}
|
|
175
|
+
maxLength={2048}
|
|
176
|
+
value={note}
|
|
177
|
+
disabled={viewer}
|
|
178
|
+
onChange={(e) => setNote(e.target.value)}
|
|
179
|
+
/>
|
|
180
|
+
</label>
|
|
181
|
+
) : null}
|
|
182
|
+
{viewer ? (
|
|
183
|
+
<p className="dialog-error" role="alert">
|
|
184
|
+
{VIEW_ONLY}
|
|
185
|
+
</p>
|
|
186
|
+
) : q.error !== null ? (
|
|
187
|
+
<p className="dialog-error" role="alert" data-testid="agent-question-error">
|
|
188
|
+
{closed ? `${closedLine(question)} Your answer was not sent.` : q.error}
|
|
189
|
+
</p>
|
|
190
|
+
) : null}
|
|
191
|
+
</Dialog>
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/** What closed the question, said plainly. */
|
|
196
|
+
function closedLine(question: AgentQuestion): string {
|
|
197
|
+
if (question.status === "answered" && question.answer !== undefined) {
|
|
198
|
+
const yes = question.export === undefined ? "make the video" : "export the video";
|
|
199
|
+
return `${question.answer.by.name} answered first: ${question.answer.choice === "yes" ? yes : "asked for changes"}.`;
|
|
200
|
+
}
|
|
201
|
+
return "The agent closed this question.";
|
|
202
|
+
}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/* Wrapped in the `component-sheets` cascade layer: this sheet is imported by
|
|
2
|
+
the component that uses it, and under the /scene index's layer order it
|
|
3
|
+
ranks below the house widgets and the chrome, which is where its source
|
|
4
|
+
position always put it. Outside /scene the layer is simply its own. */
|
|
5
|
+
@layer component-sheets {
|
|
1
6
|
/* Agent drawer: transcript, layer-tree + diff cards, BYOK setup, composer.
|
|
2
7
|
Shares the motion editor's class vocabulary on purpose — the two panels
|
|
3
8
|
render the same transcript model, and one visual language across chromes is
|
|
@@ -16,52 +21,53 @@
|
|
|
16
21
|
.agent-title {
|
|
17
22
|
display: flex;
|
|
18
23
|
align-items: center;
|
|
19
|
-
gap:
|
|
24
|
+
gap: var(--space-3);
|
|
20
25
|
}
|
|
21
26
|
|
|
22
|
-
|
|
27
|
+
/* The panel's error strip: a well tinted toward --danger, not an alert
|
|
28
|
+
block. It wraps, because the message is the only way out of the state. */
|
|
29
|
+
.agent-panel .error-strip {
|
|
23
30
|
flex: none;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
min-width: 0;
|
|
31
|
+
padding: var(--space-2) var(--space-4);
|
|
32
|
+
background: var(--danger-bg);
|
|
33
|
+
color: var(--danger-ink);
|
|
34
|
+
font-size: var(--type-sm);
|
|
35
|
+
line-height: var(--leading-body);
|
|
36
|
+
overflow-wrap: anywhere;
|
|
31
37
|
}
|
|
32
38
|
|
|
33
39
|
/* ---------- BYOK setup ---------------------------------------------------- */
|
|
34
40
|
|
|
35
41
|
.agent-setup {
|
|
36
|
-
padding:
|
|
37
|
-
border-bottom: 1px solid var(--
|
|
42
|
+
padding: var(--space-4);
|
|
43
|
+
border-bottom: 1px solid var(--line);
|
|
38
44
|
flex: none;
|
|
39
45
|
display: flex;
|
|
40
46
|
flex-direction: column;
|
|
41
|
-
gap:
|
|
47
|
+
gap: var(--space-3);
|
|
42
48
|
}
|
|
43
49
|
|
|
44
50
|
.agent-setup-blurb {
|
|
45
51
|
margin: 0;
|
|
46
|
-
color: var(--
|
|
47
|
-
font-size:
|
|
48
|
-
line-height:
|
|
52
|
+
color: var(--ink-2);
|
|
53
|
+
font-size: var(--type-md);
|
|
54
|
+
line-height: var(--leading-body);
|
|
49
55
|
}
|
|
50
56
|
|
|
51
57
|
.agent-setup-row {
|
|
52
58
|
display: flex;
|
|
53
|
-
gap:
|
|
59
|
+
gap: var(--space-2);
|
|
54
60
|
}
|
|
55
61
|
|
|
56
62
|
.agent-key-input {
|
|
57
63
|
flex: 1;
|
|
58
64
|
min-width: 0;
|
|
59
|
-
background: var(--
|
|
60
|
-
border: 1px solid var(--
|
|
61
|
-
border-radius: var(--radius);
|
|
62
|
-
color: var(--
|
|
63
|
-
padding:
|
|
64
|
-
font: var(--mono);
|
|
65
|
+
background: var(--fill-rest);
|
|
66
|
+
border: 1px solid var(--line);
|
|
67
|
+
border-radius: var(--radius-md);
|
|
68
|
+
color: var(--ink-1);
|
|
69
|
+
padding: var(--space-2) var(--space-3);
|
|
70
|
+
font: var(--type-micro)/var(--leading-none) var(--font-mono);
|
|
65
71
|
}
|
|
66
72
|
|
|
67
73
|
/* ---------- transcript ----------------------------------------------------- */
|
|
@@ -70,48 +76,48 @@
|
|
|
70
76
|
flex: 1;
|
|
71
77
|
min-height: 0;
|
|
72
78
|
overflow-y: auto;
|
|
73
|
-
padding:
|
|
79
|
+
padding: var(--space-4);
|
|
74
80
|
display: flex;
|
|
75
81
|
flex-direction: column;
|
|
76
|
-
gap:
|
|
82
|
+
gap: var(--space-3);
|
|
77
83
|
}
|
|
78
84
|
|
|
79
85
|
.agent-msg {
|
|
80
|
-
border-radius: var(--radius);
|
|
81
|
-
padding:
|
|
82
|
-
font-size:
|
|
83
|
-
line-height:
|
|
86
|
+
border-radius: var(--radius-md);
|
|
87
|
+
padding: var(--space-3) var(--space-4);
|
|
88
|
+
font-size: var(--type-md);
|
|
89
|
+
line-height: var(--leading-body);
|
|
84
90
|
white-space: pre-wrap;
|
|
85
91
|
overflow-wrap: anywhere;
|
|
86
92
|
}
|
|
87
93
|
|
|
88
94
|
.agent-msg-user {
|
|
89
95
|
background: var(--accent-soft);
|
|
90
|
-
color: var(--
|
|
96
|
+
color: var(--ink-1);
|
|
91
97
|
align-self: flex-end;
|
|
92
98
|
max-width: 90%;
|
|
93
99
|
}
|
|
94
100
|
|
|
95
101
|
.agent-msg-assistant {
|
|
96
|
-
background: var(--
|
|
97
|
-
color: var(--
|
|
102
|
+
background: var(--fill-rest);
|
|
103
|
+
color: var(--ink-1);
|
|
98
104
|
}
|
|
99
105
|
|
|
100
106
|
.agent-msg-error {
|
|
101
|
-
background: var(--
|
|
107
|
+
background: var(--fill-rest);
|
|
102
108
|
color: var(--danger);
|
|
103
109
|
}
|
|
104
110
|
|
|
105
111
|
.agent-msg-info {
|
|
106
|
-
color: var(--
|
|
112
|
+
color: var(--ink-3);
|
|
107
113
|
font-style: italic;
|
|
108
114
|
}
|
|
109
115
|
|
|
110
116
|
.agent-tool {
|
|
111
|
-
color: var(--
|
|
112
|
-
font: var(--mono);
|
|
113
|
-
font-size:
|
|
114
|
-
padding-left:
|
|
117
|
+
color: var(--ink-3);
|
|
118
|
+
font: var(--type-micro)/var(--leading-none) var(--font-mono);
|
|
119
|
+
font-size: var(--type-sm);
|
|
120
|
+
padding-left: var(--space-4);
|
|
115
121
|
}
|
|
116
122
|
.agent-tool::before {
|
|
117
123
|
content: "⚙ ";
|
|
@@ -129,9 +135,9 @@
|
|
|
129
135
|
/* ---------- proposal cards ------------------------------------------------- */
|
|
130
136
|
|
|
131
137
|
.agent-card {
|
|
132
|
-
border: 1px solid var(--
|
|
133
|
-
border-radius: var(--radius);
|
|
134
|
-
background: var(--
|
|
138
|
+
border: 1px solid var(--line);
|
|
139
|
+
border-radius: var(--radius-md);
|
|
140
|
+
background: var(--surface-panel);
|
|
135
141
|
overflow: hidden;
|
|
136
142
|
flex: none;
|
|
137
143
|
}
|
|
@@ -142,10 +148,10 @@
|
|
|
142
148
|
.agent-card-head {
|
|
143
149
|
display: flex;
|
|
144
150
|
align-items: center;
|
|
145
|
-
gap:
|
|
146
|
-
padding:
|
|
147
|
-
border-bottom: 1px solid var(--
|
|
148
|
-
background: var(--
|
|
151
|
+
gap: var(--space-3);
|
|
152
|
+
padding: var(--space-2) var(--space-3);
|
|
153
|
+
border-bottom: 1px solid var(--line);
|
|
154
|
+
background: var(--fill-rest);
|
|
149
155
|
}
|
|
150
156
|
|
|
151
157
|
.agent-card-path {
|
|
@@ -154,28 +160,28 @@
|
|
|
154
160
|
overflow: hidden;
|
|
155
161
|
text-overflow: ellipsis;
|
|
156
162
|
white-space: nowrap;
|
|
157
|
-
color: var(--
|
|
163
|
+
color: var(--ink-1);
|
|
158
164
|
}
|
|
159
165
|
/* File cards address a path; canvas cards address an intent sentence. */
|
|
160
166
|
.agent-card:not(.agent-card-canvas) .agent-card-path {
|
|
161
|
-
font: var(--mono);
|
|
167
|
+
font: var(--type-micro)/var(--leading-none) var(--font-mono);
|
|
162
168
|
}
|
|
163
169
|
|
|
164
170
|
.agent-card-status {
|
|
165
171
|
flex: none;
|
|
166
|
-
font-size:
|
|
172
|
+
font-size: var(--type-sm);
|
|
167
173
|
text-transform: uppercase;
|
|
168
|
-
letter-spacing:
|
|
174
|
+
letter-spacing: var(--tracking-caps);
|
|
169
175
|
}
|
|
170
176
|
.agent-card-status.is-applied {
|
|
171
|
-
color: var(--accent);
|
|
177
|
+
color: var(--accent-ink);
|
|
172
178
|
}
|
|
173
179
|
.agent-card-status.is-stale,
|
|
174
180
|
.agent-card-status.is-failed {
|
|
175
181
|
color: var(--danger);
|
|
176
182
|
}
|
|
177
183
|
.agent-card-status.is-applying {
|
|
178
|
-
color: var(--
|
|
184
|
+
color: var(--ink-2);
|
|
179
185
|
}
|
|
180
186
|
|
|
181
187
|
/* ---------- canvas card: doc + layer/track counts + the layer tree -------- */
|
|
@@ -184,16 +190,16 @@
|
|
|
184
190
|
display: flex;
|
|
185
191
|
align-items: center;
|
|
186
192
|
flex-wrap: wrap;
|
|
187
|
-
gap:
|
|
188
|
-
padding:
|
|
189
|
-
font-size:
|
|
190
|
-
color: var(--
|
|
193
|
+
gap: var(--space-2);
|
|
194
|
+
padding: var(--space-2) var(--space-4);
|
|
195
|
+
font-size: var(--type-sm);
|
|
196
|
+
color: var(--ink-3);
|
|
191
197
|
}
|
|
192
198
|
|
|
193
199
|
.agent-card-doc {
|
|
194
|
-
color: var(--
|
|
195
|
-
font: var(--mono);
|
|
196
|
-
font-size:
|
|
200
|
+
color: var(--ink-2);
|
|
201
|
+
font: var(--type-micro)/var(--leading-none) var(--font-mono);
|
|
202
|
+
font-size: var(--type-sm);
|
|
197
203
|
}
|
|
198
204
|
|
|
199
205
|
.agent-card-count::before {
|
|
@@ -202,16 +208,16 @@
|
|
|
202
208
|
|
|
203
209
|
.agent-tree {
|
|
204
210
|
margin: 0;
|
|
205
|
-
padding:
|
|
211
|
+
padding: var(--space-2) 0;
|
|
206
212
|
max-height: 260px;
|
|
207
213
|
overflow: auto;
|
|
208
|
-
font: var(--mono);
|
|
209
|
-
font-size:
|
|
210
|
-
line-height:
|
|
211
|
-
color: var(--
|
|
214
|
+
font: var(--type-micro)/var(--leading-none) var(--font-mono);
|
|
215
|
+
font-size: var(--type-sm);
|
|
216
|
+
line-height: var(--leading-body);
|
|
217
|
+
color: var(--ink-2);
|
|
212
218
|
}
|
|
213
219
|
.agent-tree-line {
|
|
214
|
-
padding: 0
|
|
220
|
+
padding: 0 var(--space-4);
|
|
215
221
|
white-space: pre;
|
|
216
222
|
}
|
|
217
223
|
|
|
@@ -219,36 +225,42 @@
|
|
|
219
225
|
|
|
220
226
|
.agent-diff {
|
|
221
227
|
margin: 0;
|
|
222
|
-
padding:
|
|
228
|
+
padding: var(--space-2) 0;
|
|
223
229
|
max-height: 260px;
|
|
224
230
|
overflow: auto;
|
|
225
|
-
font: var(--mono);
|
|
226
|
-
font-size:
|
|
227
|
-
line-height:
|
|
231
|
+
font: var(--type-micro)/var(--leading-none) var(--font-mono);
|
|
232
|
+
font-size: var(--type-sm);
|
|
233
|
+
line-height: var(--leading-body);
|
|
228
234
|
}
|
|
229
235
|
.agent-diff > div {
|
|
230
|
-
padding: 0
|
|
236
|
+
padding: 0 var(--space-4);
|
|
231
237
|
white-space: pre;
|
|
232
238
|
}
|
|
239
|
+
/* The diff hues are the palette's own --success / --danger, mixed rather than
|
|
240
|
+
restated: the tint is the colour at low alpha, and the ink is the same colour
|
|
241
|
+
lifted toward the page's white so it stays readable at 11px on a dark row.
|
|
242
|
+
The two literal greens and reds that used to sit here were neither token, so
|
|
243
|
+
the one place in this chrome that shows an ADD and a REMOVE spoke a palette
|
|
244
|
+
nothing else in the product used. */
|
|
233
245
|
.agent-diff-add {
|
|
234
|
-
background:
|
|
235
|
-
color:
|
|
246
|
+
background: color-mix(in srgb, var(--success) 16%, transparent);
|
|
247
|
+
color: color-mix(in srgb, var(--success) 60%, var(--ink-1));
|
|
236
248
|
}
|
|
237
249
|
.agent-diff-del {
|
|
238
|
-
background:
|
|
239
|
-
color:
|
|
250
|
+
background: color-mix(in srgb, var(--danger) 14%, transparent);
|
|
251
|
+
color: color-mix(in srgb, var(--danger) 60%, var(--ink-1));
|
|
240
252
|
}
|
|
241
253
|
.agent-diff-hunk {
|
|
242
|
-
color: var(--
|
|
254
|
+
color: var(--ink-3);
|
|
243
255
|
}
|
|
244
256
|
.agent-diff-ctx {
|
|
245
|
-
color: var(--
|
|
257
|
+
color: var(--ink-2);
|
|
246
258
|
}
|
|
247
259
|
|
|
248
260
|
.agent-card-note {
|
|
249
|
-
padding:
|
|
250
|
-
color: var(--
|
|
251
|
-
font-size:
|
|
261
|
+
padding: var(--space-2) var(--space-4);
|
|
262
|
+
color: var(--ink-3);
|
|
263
|
+
font-size: var(--type-sm);
|
|
252
264
|
}
|
|
253
265
|
|
|
254
266
|
.agent-card-error {
|
|
@@ -259,64 +271,68 @@
|
|
|
259
271
|
/* "Applied, but the generated component was not updated" — not a failure (the
|
|
260
272
|
document is saved), so not the error red; loud enough to be read. */
|
|
261
273
|
.agent-card-warning {
|
|
262
|
-
color: var(--warn
|
|
274
|
+
color: var(--warn);
|
|
263
275
|
white-space: normal;
|
|
264
276
|
}
|
|
265
277
|
|
|
278
|
+
/* "Copy prompt": the Add motion prompt, for pasting into another agent. */
|
|
279
|
+
.agent-copy-prompt {
|
|
280
|
+
margin: 0 var(--space-4) var(--space-2);
|
|
281
|
+
}
|
|
282
|
+
|
|
266
283
|
/* ---------- footer --------------------------------------------------------- */
|
|
267
284
|
|
|
268
285
|
.agent-strip {
|
|
269
286
|
flex: none;
|
|
270
287
|
display: flex;
|
|
271
288
|
align-items: center;
|
|
272
|
-
gap:
|
|
289
|
+
gap: var(--space-4);
|
|
273
290
|
}
|
|
274
291
|
|
|
292
|
+
/* Wraps beside Retry: a probe error cut to one line could not be read. */
|
|
275
293
|
.agent-strip-msg {
|
|
276
294
|
flex: 1;
|
|
277
295
|
min-width: 0;
|
|
278
|
-
overflow: hidden;
|
|
279
|
-
text-overflow: ellipsis;
|
|
280
|
-
white-space: nowrap;
|
|
281
296
|
}
|
|
282
297
|
|
|
283
298
|
.agent-cost {
|
|
284
299
|
flex: none;
|
|
285
|
-
padding:
|
|
286
|
-
color: var(--
|
|
287
|
-
font-size:
|
|
300
|
+
padding: var(--space-1) var(--space-4);
|
|
301
|
+
color: var(--ink-3);
|
|
302
|
+
font-size: var(--type-sm);
|
|
288
303
|
text-align: right;
|
|
289
304
|
}
|
|
290
305
|
|
|
291
306
|
.agent-composer {
|
|
292
307
|
display: flex;
|
|
293
308
|
align-items: flex-end;
|
|
294
|
-
gap:
|
|
295
|
-
padding:
|
|
296
|
-
border-top: 1px solid var(--
|
|
309
|
+
gap: var(--space-2);
|
|
310
|
+
padding: var(--space-4);
|
|
311
|
+
border-top: 1px solid var(--line);
|
|
297
312
|
flex: none;
|
|
298
313
|
flex-wrap: wrap;
|
|
299
314
|
}
|
|
300
315
|
|
|
301
316
|
.agent-pin {
|
|
302
317
|
flex: 0 0 100%;
|
|
303
|
-
color: var(--
|
|
304
|
-
font-size:
|
|
318
|
+
color: var(--ink-3);
|
|
319
|
+
font-size: var(--type-sm);
|
|
305
320
|
}
|
|
306
321
|
|
|
307
322
|
.agent-input {
|
|
308
323
|
flex: 1;
|
|
309
324
|
min-width: 0;
|
|
310
325
|
resize: none;
|
|
311
|
-
background: var(--
|
|
312
|
-
border: 1px solid var(--
|
|
313
|
-
border-radius: var(--radius);
|
|
314
|
-
color: var(--
|
|
315
|
-
padding:
|
|
326
|
+
background: var(--fill-rest);
|
|
327
|
+
border: 1px solid var(--line);
|
|
328
|
+
border-radius: var(--radius-md);
|
|
329
|
+
color: var(--ink-1);
|
|
330
|
+
padding: var(--space-3) var(--space-4);
|
|
316
331
|
font: inherit;
|
|
317
|
-
font-size:
|
|
318
|
-
line-height:
|
|
332
|
+
font-size: var(--type-md);
|
|
333
|
+
line-height: var(--leading-body);
|
|
319
334
|
}
|
|
320
335
|
.agent-input:focus {
|
|
321
336
|
outline: 1px solid var(--accent);
|
|
322
337
|
}
|
|
338
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Whether the agent can be opened, and the words for it.
|
|
2
|
+
//
|
|
3
|
+
// The credentials probe is the only thing that says this server has an agent
|
|
4
|
+
// lane at all: a `null` answer means the route has not replied, and the drawer
|
|
5
|
+
// would open onto a composer it disables itself. A server that answers with NO
|
|
6
|
+
// KEY still opens, because the drawer's key form is the only place a key can
|
|
7
|
+
// be entered. The right column's Agent tab and the header's Agent button both
|
|
8
|
+
// gate on this, so the two can never disagree.
|
|
9
|
+
import type { AgentCredentialsInfo } from "@dailies-studio/agent-client";
|
|
10
|
+
|
|
11
|
+
export interface AgentGate {
|
|
12
|
+
/** False until the probe answers. */
|
|
13
|
+
ready: boolean;
|
|
14
|
+
/** The reason while not ready, otherwise what opening it offers. */
|
|
15
|
+
title: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* THE EDITOR'S OWN AGENT IS HIDDEN (KAN-34) until it runs on Dailies credits:
|
|
20
|
+
* agents connect from outside, over MCP (the header's Agent chip). Every door
|
|
21
|
+
* to the drawer asks this first: its tab, View > Agent, Build planned shots,
|
|
22
|
+
* Add motion, the shot board's and the comments' Ask agent, and the probe.
|
|
23
|
+
* `?agent` in the page URL brings it all back, which is how its tests reach it.
|
|
24
|
+
*/
|
|
25
|
+
export function agentInEditor(): boolean {
|
|
26
|
+
return typeof window !== "undefined" && new URLSearchParams(window.location.search).has("agent");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function agentGate(credentials: AgentCredentialsInfo | null, probeError: string | null): AgentGate {
|
|
30
|
+
if (credentials === null) return { ready: false, title: probeError ?? "Checking for the agent backend…" };
|
|
31
|
+
return {
|
|
32
|
+
ready: true,
|
|
33
|
+
title: credentials.configured ? "Agent: describe the scene you want" : "Agent: add an API key to start",
|
|
34
|
+
};
|
|
35
|
+
}
|