@dailies-studio/shot-editor 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.vite/manifest.json +382 -0
- package/dist/assets/AgentPanel-CQejLbiX.js +2 -0
- package/dist/assets/AgentPanel-DJEphah0.css +1 -0
- package/dist/assets/AgentQuestionDialog-BqkD0kXF.js +1 -0
- package/dist/assets/CodeStudio-Dv4ihHpz.js +23 -0
- package/dist/assets/CommentsPanel-B4yhhT1T.js +1 -0
- package/dist/assets/ComponentLibraryRail-Ch_dsAru.js +1 -0
- package/dist/assets/ComponentStage-BRhRotyH.js +1 -0
- package/dist/assets/CurvePane-BjFVabKX.css +1 -0
- package/dist/assets/CurvePane-R22WzllJ.js +1 -0
- package/dist/assets/ExportDialog-CWLQWTmG.js +2 -0
- package/dist/assets/FontPicker-DWKaYL7F.js +1 -0
- package/dist/assets/FontPicker-v0IOIArM.css +1 -0
- package/dist/assets/GenerateDrawer-Bh3SqDKt.js +2 -0
- package/dist/assets/InsertDrawer-Ce1fod1L.js +1 -0
- package/dist/assets/LibraryBrowser-D9sEGz5w.js +2 -0
- package/dist/assets/MakeItYoursSection-CMO4319_.js +2 -0
- package/dist/assets/MaterialGraphCanvas-BFzl4wWR.js +23 -0
- package/dist/assets/MaterialGraphCanvas-BIUD59ik.css +1 -0
- package/dist/assets/MaterialWorkspace-CqTWqaRA.js +14 -0
- package/dist/assets/PreferencesDialog-CBf9_OoD.js +1 -0
- package/dist/assets/PresetsSection-CUEaoCVU.js +1 -0
- package/dist/assets/SoundHistory-BeS8EW1h.js +1 -0
- package/dist/assets/SoundMode-BmcZru3i.js +3 -0
- package/dist/assets/StockSounds-DdAUGRYK.js +1 -0
- package/dist/assets/TemplateFieldSection-CaeXpLFo.js +1 -0
- package/dist/assets/VersionHistoryPanel-CxG6XhNP.js +1 -0
- package/dist/assets/board-B88EPuLO.css +1 -0
- package/dist/assets/board-CL-he7SL.js +3 -0
- package/dist/assets/components-0oOSPN0l.js +1 -0
- package/dist/assets/googleFontRanges-gp32wJMo.js +1 -0
- package/dist/assets/googleFonts-BNon6M7X.js +1 -0
- package/dist/assets/iconsAndAliases-DL7gXP5j.js +1863 -0
- package/dist/assets/index-4F5NQmI8.css +1 -0
- package/dist/assets/index-BGHQGV5z.js +117 -0
- package/dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/dist/assets/libraryModel-CpIwfFha.js +1 -0
- package/dist/assets/lucide-6iK64tTB.js +9319 -0
- package/dist/assets/motionStamp-CH-Hew4E.js +1 -0
- package/dist/assets/takeMeasure-Tdg0TxEi.js +1 -0
- package/dist/assets/webmcp-BsB9gxWC.js +2 -0
- package/dist/index.html +34 -3
- package/package.json +12 -9
- package/src/addFamilies.ts +66 -0
- package/src/api.ts +1631 -55
- package/src/app/App.tsx +977 -198
- package/src/app/lazyPanel.tsx +137 -0
- package/src/app/lazySurfaces.tsx +203 -0
- package/src/audio/index.tsx +41 -10
- package/src/audio/meter.ts +485 -0
- package/src/audio/meterMath.ts +273 -0
- package/src/audio/meterStore.ts +155 -0
- package/src/audio/offlineMix.ts +289 -0
- package/src/audio/preview.ts +928 -118
- package/src/bridge.ts +15 -5
- package/src/bridgeTypes.ts +1611 -36
- package/src/channels.ts +17 -32
- package/src/fonts/googleFonts.ts +4 -0
- package/src/hostApi.ts +174 -0
- package/src/icons.tsx +770 -0
- package/src/layerWords.ts +61 -0
- package/src/main.tsx +56 -4
- package/src/panels/ResizeHandle.tsx +33 -43
- package/src/panels/agent/AgentDots.tsx +36 -0
- package/src/panels/agent/AgentPanel.tsx +119 -43
- package/src/panels/agent/AgentQuestionDialog.tsx +202 -0
- package/src/panels/agent/agent.css +113 -97
- package/src/panels/agent/agentGate.ts +35 -0
- package/src/panels/code/CodeDefaultsPanel.tsx +345 -0
- package/src/panels/code/CodeStudio.tsx +373 -0
- package/src/panels/code/FileTree.tsx +265 -0
- package/src/panels/code/codeBufferGuard.ts +52 -0
- package/src/panels/code/codeParts.tsx +321 -0
- package/src/panels/comments/CommentComposer.tsx +239 -0
- package/src/panels/comments/CommentThread.tsx +346 -0
- package/src/panels/comments/CommentsPanel.tsx +336 -0
- package/src/panels/comments/InboxButton.tsx +131 -0
- package/src/panels/comments/MentionMenu.tsx +98 -0
- package/src/panels/comments/parts.tsx +171 -0
- package/src/panels/export/ExportDialog.tsx +919 -96
- package/src/panels/export/ExportScrim.tsx +57 -0
- package/src/panels/files/AssetsTab.tsx +656 -0
- package/src/panels/files/FilePanel.tsx +1466 -216
- package/src/panels/files/LayerMarks.tsx +40 -0
- package/src/panels/files/LeftColumn.tsx +37 -0
- package/src/panels/files/McpSection.tsx +690 -47
- package/src/panels/files/MissingAssetsNotice.tsx +60 -0
- package/src/panels/files/assetDrag.ts +79 -0
- package/src/panels/files/resourceParts.tsx +255 -0
- package/src/panels/fonts/FontPicker.tsx +762 -0
- package/src/panels/fonts/faceCache.ts +207 -0
- package/src/panels/fonts/fontPicker.css +271 -0
- package/src/panels/fonts/pickerModel.ts +265 -0
- package/src/panels/fonts/pickerRequest.ts +46 -0
- package/src/panels/header/AccountAvatar.tsx +76 -0
- package/src/panels/header/AgentChip.tsx +77 -0
- package/src/panels/header/AppMenu.tsx +213 -0
- package/src/panels/header/Header.tsx +564 -84
- package/src/panels/header/HistoryControls.tsx +31 -5
- package/src/panels/header/PresenceStack.tsx +329 -0
- package/src/panels/header/ProjectTitle.tsx +232 -0
- package/src/panels/header/ShareButton.tsx +59 -0
- package/src/panels/header/StatusBadges.tsx +358 -27
- package/src/panels/header/SyncDeletedDialog.tsx +88 -0
- package/src/panels/header/ZoomControls.tsx +46 -15
- package/src/panels/header/agentHandoff.ts +52 -0
- package/src/panels/header/leave.ts +26 -0
- package/src/panels/help/HelpSection.tsx +189 -163
- package/src/panels/insert/InsertDrawer.tsx +723 -0
- package/src/panels/insert/iconSet.ts +109 -0
- package/src/panels/inspector/ExposeDot.tsx +117 -0
- package/src/panels/inspector/FramingRows.tsx +314 -44
- package/src/panels/inspector/InspectorFooter.tsx +91 -0
- package/src/panels/inspector/InspectorHead.tsx +425 -0
- package/src/panels/inspector/InspectorPanel.tsx +408 -124
- package/src/panels/inspector/KeyframeDot.tsx +373 -0
- package/src/panels/inspector/KeyframeSection.tsx +257 -0
- package/src/panels/inspector/MarkerSection.tsx +55 -11
- package/src/panels/inspector/ParamRow.tsx +84 -53
- package/src/panels/inspector/RightColumn.tsx +152 -0
- package/src/panels/inspector/TimeSection.tsx +866 -0
- package/src/panels/inspector/animate/EaseControl.tsx +244 -0
- package/src/panels/inspector/animate/PresetsSection.tsx +135 -0
- package/src/panels/inspector/animate/ShotSection.tsx +562 -48
- package/src/panels/inspector/design/AlignRow.tsx +95 -31
- package/src/panels/inspector/design/AppearanceSection.tsx +118 -9
- package/src/panels/inspector/design/ClonerSection.tsx +323 -62
- package/src/panels/inspector/design/ComponentSection.tsx +50 -43
- package/src/panels/inspector/design/CornerSection.tsx +45 -14
- package/src/panels/inspector/design/DefinitionProps.tsx +315 -0
- package/src/panels/inspector/design/DefinitionSection.tsx +136 -0
- package/src/panels/inspector/design/DeviceSection.tsx +210 -0
- package/src/panels/inspector/design/FillSection.tsx +83 -51
- package/src/panels/inspector/design/FontField.tsx +196 -0
- package/src/panels/inspector/design/HtmlSection.tsx +23 -12
- package/src/panels/inspector/design/InstanceSection.tsx +373 -154
- package/src/panels/inspector/design/MaskSection.tsx +84 -0
- package/src/panels/inspector/design/MaterialSection.tsx +177 -0
- package/src/panels/inspector/design/MediaSection.tsx +273 -120
- package/src/panels/inspector/design/MeshSection.tsx +910 -82
- package/src/panels/inspector/design/PaintRows.tsx +550 -0
- package/src/panels/inspector/design/PlateStyleSection.tsx +177 -0
- package/src/panels/inspector/design/ShadowSection.tsx +221 -48
- package/src/panels/inspector/design/SplineFollowSection.tsx +235 -0
- package/src/panels/inspector/design/StrokeSection.tsx +228 -43
- package/src/panels/inspector/design/TemplateFieldSection.tsx +57 -0
- package/src/panels/inspector/design/TransformSection.tsx +244 -50
- package/src/panels/inspector/design/TypographySection.tsx +679 -110
- package/src/panels/inspector/layout.ts +295 -0
- package/src/panels/inspector/propValue.ts +199 -0
- package/src/panels/inspector/scene/CameraSection.tsx +232 -22
- package/src/panels/inspector/scene/EffectsSection.tsx +722 -71
- package/src/panels/inspector/scene/MakeItYoursSection.tsx +180 -0
- package/src/panels/inspector/scene/SceneDocSection.tsx +191 -0
- package/src/panels/inspector/scene/SceneSection.tsx +219 -44
- package/src/panels/inspector/scene/TransitionSection.tsx +523 -72
- package/src/panels/inspector/storyboard/StoryboardReferenceSection.tsx +593 -0
- package/src/panels/inspector/storyboard/VideoStill.tsx +120 -0
- package/src/panels/inspector/timeModel.ts +190 -0
- package/src/panels/inspector/useDocWrite.ts +438 -146
- package/src/panels/library/LibraryBrowser.tsx +435 -0
- package/src/panels/library/LibraryGrid.tsx +190 -0
- package/src/panels/library/LibraryPreviewPanel.tsx +349 -0
- package/src/panels/library/LibraryRail.tsx +84 -0
- package/src/panels/library/LibrarySoundPanel.tsx +293 -0
- package/src/panels/library/SoundHistory.tsx +245 -0
- package/src/panels/library/StockSounds.tsx +390 -0
- package/src/panels/library/libraryModel.ts +147 -0
- package/src/panels/library/stockSearch.ts +77 -0
- package/src/panels/maskMarks.tsx +117 -0
- package/src/panels/material/MaterialCommentNode.tsx +54 -0
- package/src/panels/material/MaterialGraphCanvas.tsx +861 -0
- package/src/panels/material/MaterialGraphMenu.tsx +45 -0
- package/src/panels/material/MaterialGroupNode.tsx +56 -0
- package/src/panels/material/MaterialLibrary.tsx +253 -0
- package/src/panels/material/MaterialNode.tsx +453 -0
- package/src/panels/material/MaterialNodePalette.tsx +349 -0
- package/src/panels/material/MaterialParameterControls.tsx +525 -0
- package/src/panels/material/MaterialRerouteNode.tsx +42 -0
- package/src/panels/material/MaterialWorkspace.tsx +501 -0
- package/src/panels/material/NodePreview.tsx +70 -0
- package/src/panels/material/flowModel.ts +441 -0
- package/src/panels/material/parameterValues.ts +231 -0
- package/src/panels/material/previewScheduler.ts +235 -0
- package/src/panels/material/reactFlow.css +6 -0
- package/src/panels/material/socketGlyph.ts +85 -0
- package/src/panels/material/viewportMemory.ts +58 -0
- package/src/panels/preferences/PreferencesDialog.tsx +215 -0
- package/src/panels/share/ShareComponentDialog.tsx +247 -0
- package/src/panels/stage/StageMenu.tsx +35 -5
- package/src/panels/stage/StagePanel.tsx +338 -23
- package/src/panels/stage/cellSlots.tsx +70 -0
- package/src/panels/storyboard/BoardCanvas.tsx +739 -0
- package/src/panels/storyboard/BoardCursors.tsx +158 -0
- package/src/panels/storyboard/BoardDropDialog.tsx +161 -0
- package/src/panels/storyboard/BoardPlan.tsx +42 -0
- package/src/panels/storyboard/ComponentSheet.tsx +187 -0
- package/src/panels/storyboard/ComponentStage.tsx +235 -0
- package/src/panels/storyboard/MiniSketch.tsx +173 -0
- package/src/panels/storyboard/PartPicker.tsx +64 -0
- package/src/panels/storyboard/PlanPanel.tsx +617 -0
- package/src/panels/storyboard/ReferencePreview.tsx +217 -0
- package/src/panels/storyboard/ShotBrief.tsx +360 -0
- package/src/panels/storyboard/ShotCard.tsx +251 -0
- package/src/panels/storyboard/StagePreview.tsx +348 -0
- package/src/panels/storyboard/StillThumbs.tsx +162 -0
- package/src/panels/storyboard/StoryboardView.tsx +79 -0
- package/src/panels/storyboard/board.css +1065 -0
- package/src/panels/storyboard/board.ts +12 -0
- package/src/panels/storyboard/boardClipboard.ts +111 -0
- package/src/panels/storyboard/boardOrder.ts +68 -0
- package/src/panels/storyboard/boardRows.tsx +425 -0
- package/src/panels/storyboard/liveCap.ts +90 -0
- package/src/panels/storyboard/plan.css +295 -0
- package/src/panels/storyboard/posterCache.ts +133 -0
- package/src/panels/storyboard/shotboard/ComponentPicker.tsx +373 -0
- package/src/panels/storyboard/shotboard/ImagePicker.tsx +145 -0
- package/src/panels/storyboard/shotboard/ShotBoard.tsx +292 -0
- package/src/panels/storyboard/shotboard/SketchCanvas.tsx +443 -0
- package/src/panels/storyboard/shotboard/SketchInspector.tsx +471 -0
- package/src/panels/storyboard/shotboard/SketchItem.tsx +240 -0
- package/src/panels/storyboard/shotboard/SketchLayers.tsx +130 -0
- package/src/panels/storyboard/shotboard/SketchPlay.tsx +108 -0
- package/src/panels/storyboard/shotboard/SketchStrip.tsx +178 -0
- package/src/panels/storyboard/shotboard/SketchToolFooter.tsx +99 -0
- package/src/panels/storyboard/shotboard/sketch.css +1392 -0
- package/src/panels/storyboard/shotboard/sketchModel.ts +219 -0
- package/src/panels/storyboard/storyboardDrop.ts +164 -0
- package/src/panels/studio/ComponentLibraryRail.tsx +346 -0
- package/src/panels/studio/ComponentSidePanel.tsx +355 -0
- package/src/panels/studio/ComponentStudio.tsx +243 -0
- package/src/panels/studio/ComponentsHome.tsx +318 -0
- package/src/panels/studio/ComponentsPreview.tsx +179 -0
- package/src/panels/studio/EveryUse.tsx +244 -0
- package/src/panels/studio/ThisUsePanel.tsx +679 -0
- package/src/panels/studio/componentParts.tsx +341 -0
- package/src/panels/studio/components.ts +6 -0
- package/src/panels/studio/newCodeComponent.ts +66 -0
- package/src/panels/timeline/AudioFxButton.tsx +290 -0
- package/src/panels/timeline/AudioLane.tsx +674 -85
- package/src/panels/timeline/BlockRow.tsx +154 -85
- package/src/panels/timeline/ChannelRow.tsx +378 -129
- package/src/panels/timeline/CurvePane.tsx +508 -0
- package/src/panels/timeline/Filmstrip.tsx +361 -0
- package/src/panels/timeline/GenerateDrawer.tsx +407 -0
- package/src/panels/timeline/KeyStretch.tsx +115 -0
- package/src/panels/timeline/LifespanRow.tsx +730 -47
- package/src/panels/timeline/MarkerLane.tsx +46 -8
- package/src/panels/timeline/PlayButton.tsx +91 -0
- package/src/panels/timeline/PropertyPicker.tsx +254 -0
- package/src/panels/timeline/ShotRow.tsx +400 -0
- package/src/panels/timeline/SoundMode.tsx +1406 -0
- package/src/panels/timeline/TimelineDock.tsx +2338 -272
- package/src/panels/timeline/TransportVolume.tsx +163 -0
- package/src/panels/timeline/beatRuler.ts +74 -0
- package/src/panels/timeline/curveModel.ts +500 -0
- package/src/panels/timeline/duckUnderVoice.ts +68 -0
- package/src/panels/timeline/keyframeMenu.ts +138 -0
- package/src/panels/timeline/labelWidth.ts +49 -0
- package/src/panels/timeline/marquee.ts +155 -0
- package/src/panels/timeline/model.ts +1860 -199
- package/src/panels/timeline/snap.ts +125 -43
- package/src/panels/timeline/staggerPreview.tsx +92 -0
- package/src/panels/timeline/takeMeasure.ts +72 -0
- package/src/panels/timeline/useLive.ts +48 -0
- package/src/panels/timeline/viewport.ts +234 -0
- package/src/panels/toolbar/BackChip.tsx +116 -0
- package/src/panels/toolbar/CameraViewBar.tsx +118 -49
- package/src/panels/toolbar/CanvasBar.tsx +117 -0
- package/src/panels/toolbar/InsertButton.tsx +38 -0
- package/src/panels/toolbar/IsolationTrail.tsx +156 -0
- package/src/panels/toolbar/PanelToggles.tsx +86 -0
- package/src/panels/toolbar/ShadingBar.tsx +119 -26
- package/src/panels/toolbar/ToolDockBar.tsx +329 -80
- package/src/panels/toolbar/ToolFooter.tsx +102 -0
- package/src/panels/toolbar/ViewModeBar.tsx +247 -38
- package/src/panels/toolbar/WorkPlaneBar.tsx +94 -0
- package/src/panels/toolbar/useAddRows.tsx +326 -0
- package/src/panels/toolbar/useDismiss.ts +122 -0
- package/src/panels/versions/VersionHistoryPanel.tsx +274 -0
- package/src/panels/versions/versionModel.ts +103 -0
- package/src/panels/virtualWindow.ts +271 -0
- package/src/shotTokens.css +151 -60
- package/src/stage/FrustumGizmo.tsx +504 -84
- package/src/stage/GridPlane.tsx +225 -16
- package/src/stage/NodePreviews.tsx +628 -0
- package/src/stage/PerfHud.tsx +437 -47
- package/src/stage/SplitRenderer.tsx +816 -169
- package/src/stage/StageApp.tsx +4274 -486
- package/src/stage/StageRootBoundary.tsx +114 -0
- package/src/stage/StageTools.tsx +651 -151
- package/src/stage/TransformGizmo.tsx +696 -0
- package/src/stage/adaptivePresentation.ts +145 -0
- package/src/stage/bridgeClient.ts +2522 -41
- package/src/stage/exportWorker.ts +9 -0
- package/src/stage/feed.ts +305 -14
- package/src/stage/fontPreview.ts +176 -0
- package/src/stage/frustumGeometry.ts +319 -1
- package/src/stage/furnitureTokens.ts +33 -0
- package/src/stage/gizmoMath.ts +508 -16
- package/src/stage/gpuTimer.ts +276 -0
- package/src/stage/instanceModules.ts +194 -33
- package/src/stage/interactions/move.ts +24 -5
- package/src/stage/isolation.ts +291 -33
- package/src/stage/jsSelfProfiler.ts +325 -0
- package/src/stage/main.tsx +116 -16
- package/src/stage/modalState.ts +222 -23
- package/src/stage/moduleEpoch.ts +60 -0
- package/src/stage/motionPathStage.ts +279 -0
- package/src/stage/motionPreview.ts +74 -0
- package/src/stage/overlays/Overlays.tsx +1112 -159
- package/src/stage/overlays/Rulers.tsx +495 -0
- package/src/stage/panes.ts +159 -10
- package/src/stage/project.ts +68 -3
- package/src/stage/renderScaleController.ts +730 -0
- package/src/stage/rulers.ts +129 -0
- package/src/stage/sceneExtent.ts +75 -0
- package/src/stage/shading.ts +20 -0
- package/src/stage/splineStage.ts +632 -0
- package/src/stage/stagePerformanceTelemetry.ts +717 -0
- package/src/stage/stageTheme.ts +36 -0
- package/src/stage/stageWarmup.ts +11 -0
- package/src/stage/textAutoSize.ts +124 -0
- package/src/stage/tier1Export.ts +641 -0
- package/src/stage/tokenColor.ts +14 -9
- package/src/stage/view.ts +56 -9
- package/src/stage/workingView.ts +277 -33
- package/src/state/accountPrefs.ts +261 -0
- package/src/state/agentActions.ts +173 -15
- package/src/state/agentActivity.ts +198 -0
- package/src/state/agentQuestion.ts +239 -0
- package/src/state/bootOpen.ts +42 -0
- package/src/state/cameraVerbs.ts +139 -0
- package/src/state/clientId.ts +6 -1
- package/src/state/comments.ts +1099 -0
- package/src/state/context.tsx +19 -1
- package/src/state/editorPrefs.ts +220 -0
- package/src/state/errorReports.ts +121 -0
- package/src/state/fieldWrite.ts +161 -0
- package/src/state/fontRecents.ts +70 -0
- package/src/state/fonts.ts +656 -0
- package/src/state/graphClipboard.ts +414 -0
- package/src/state/imageThumbs.ts +216 -0
- package/src/state/insert.ts +444 -67
- package/src/state/isolationTrail.ts +92 -0
- package/src/state/keyMoves.ts +134 -0
- package/src/state/keyframeClipboard.ts +177 -0
- package/src/state/keymap.ts +1153 -117
- package/src/state/layoutPrefs.ts +272 -0
- package/src/state/layouts.ts +205 -0
- package/src/state/measureMedia.ts +167 -0
- package/src/state/menu.ts +2341 -28
- package/src/state/motionStamp.ts +7 -0
- package/src/state/panelSize.ts +375 -5
- package/src/state/pendingChanges.ts +119 -0
- package/src/state/playHold.ts +78 -0
- package/src/state/playbackPreparation.ts +562 -0
- package/src/state/posterCapture.ts +242 -0
- package/src/state/presence.ts +254 -0
- package/src/state/projectComponents.ts +160 -0
- package/src/state/renderEvents.ts +298 -18
- package/src/state/runtimeErrors.ts +46 -0
- package/src/state/selection.ts +12 -0
- package/src/state/shortcuts.ts +1606 -0
- package/src/state/sketchGuide.ts +51 -0
- package/src/state/splineRefs.ts +87 -0
- package/src/state/stageHealth.ts +259 -0
- package/src/state/stageWatchdog.ts +47 -0
- package/src/state/stillStage.ts +330 -0
- package/src/state/stillThumbs.ts +474 -0
- package/src/state/store.ts +23591 -2982
- package/src/state/storyboardModel.ts +528 -0
- package/src/state/sync.ts +1257 -0
- package/src/state/syncCache.ts +159 -0
- package/src/state/triangles.ts +13 -0
- package/src/state/types.ts +1698 -55
- package/src/state/unsavedGuard.ts +49 -0
- package/src/state/viewMode.ts +200 -0
- package/src/state/webmcp.ts +1128 -0
- package/src/state/workspace.ts +1147 -0
- package/src/styles/assets-tab.css +304 -0
- package/src/styles/canvas.css +545 -0
- package/src/styles/comments.css +1435 -0
- package/src/styles/controls.css +162 -0
- package/src/styles/dialogs.css +390 -0
- package/src/styles/insert-drawer.css +586 -0
- package/src/styles/inspector-board.css +207 -0
- package/src/styles/inspector-object.css +486 -0
- package/src/styles/inspector-shot.css +252 -0
- package/src/styles/inspector.css +360 -0
- package/src/styles/left-column.css +1628 -0
- package/src/styles/library-preview.css +575 -0
- package/src/styles/library.css +512 -0
- package/src/styles/modes/code.css +569 -0
- package/src/styles/modes/component.css +1561 -0
- package/src/styles/modes/material.css +1201 -0
- package/src/styles/modes/storyboard.css +518 -0
- package/src/styles/share-component.css +49 -0
- package/src/styles/shell.css +653 -0
- package/src/styles/shot-brief.css +360 -0
- package/src/styles/states.css +76 -0
- package/src/styles/sync.css +380 -0
- package/src/styles/timeline-graph.css +384 -0
- package/src/styles/timeline-meters.css +89 -0
- package/src/styles/timeline-rows.css +1959 -0
- package/src/styles/timeline-sound.css +1003 -0
- package/src/styles/timeline.css +754 -0
- package/src/styles/tool-footer.css +525 -0
- package/src/styles/topbar.css +886 -0
- package/src/styles/versions.css +262 -0
- package/src/styles.css +72 -2921
- package/src/tools.ts +108 -23
- package/dist/assets/index-B7notge7.css +0 -1
- package/dist/assets/index-BBE6Ta9L.js +0 -52
- package/src/panels/files/icons.tsx +0 -118
- package/src/panels/header/DocSwitcher.tsx +0 -85
- package/src/panels/header/TransportBar.tsx +0 -86
- package/src/panels/inspector/animate/BlockTiming.tsx +0 -341
- package/src/panels/inspector/animate/DuringBlocks.tsx +0 -85
- package/src/panels/inspector/animate/InOutPresets.tsx +0 -57
- package/src/panels/inspector/animate/ResolvedChannels.tsx +0 -150
- package/src/panels/inspector/animate/useBlocks.ts +0 -43
- package/src/panels/material/MaterialPicker.tsx +0 -172
- package/src/panels/timeline/SceneStrip.tsx +0 -145
- package/src/panels/toolbar/AddMenu.tsx +0 -230
- package/src/stage/MoveGizmo.tsx +0 -411
package/src/tools.ts
CHANGED
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
// an edit MEANS, not what a drag DOES. As a member of this union every arm of
|
|
13
13
|
// every switch would have to answer "and what does select do while animate is
|
|
14
14
|
// armed?", which has no answer. It is `animateMode: boolean`, toggled by ⇧A,
|
|
15
|
-
// and it is the one bit that decides whether a gesture writes base or
|
|
16
|
-
//
|
|
15
|
+
// and it is the one bit that decides whether a gesture writes base or records
|
|
16
|
+
// keyframes.
|
|
17
17
|
//
|
|
18
18
|
// ── THE `shift` FIELD, WHICH THE 2D LANE'S TABLE DOES NOT HAVE ──────────
|
|
19
19
|
//
|
|
@@ -25,14 +25,24 @@
|
|
|
25
25
|
/** Every tool that changes what a canvas press does. */
|
|
26
26
|
export type ShotTool =
|
|
27
27
|
| "select"
|
|
28
|
-
| "move"
|
|
29
28
|
| "text"
|
|
30
29
|
| "image"
|
|
31
30
|
| "rect"
|
|
32
31
|
| "ellipse"
|
|
33
32
|
| "line"
|
|
34
33
|
| "arrow"
|
|
35
|
-
| "path"
|
|
34
|
+
| "path"
|
|
35
|
+
| "spline";
|
|
36
|
+
|
|
37
|
+
/** The pane a tool can author in. `any` is reserved for non-creating tools. */
|
|
38
|
+
export type ToolPane = "any" | "camera" | "working";
|
|
39
|
+
|
|
40
|
+
/** The pointer grammar owned by a tool. */
|
|
41
|
+
export type ToolGesture = "none" | "box" | "points-2d" | "points-3d";
|
|
42
|
+
|
|
43
|
+
/** What a press with the tool is FOR: `pick` addresses what is already there,
|
|
44
|
+
* `draw` makes something new. The dock's rules are drawn on this boundary. */
|
|
45
|
+
export type ToolGroup = "pick" | "draw";
|
|
36
46
|
|
|
37
47
|
export interface ToolSpec {
|
|
38
48
|
label: string;
|
|
@@ -49,8 +59,25 @@ export interface ToolSpec {
|
|
|
49
59
|
/** "dock" is the toolbar's own row; "flyout" is reached through the shape
|
|
50
60
|
* button. Six buttons in a row is a row; ten is a different object. */
|
|
51
61
|
surface: "dock" | "flyout";
|
|
52
|
-
/**
|
|
53
|
-
*
|
|
62
|
+
/** The pane that can fulfil the tool's promise. `camera` means the FRAME:
|
|
63
|
+
* the camera pane over a Shot, and an open definition's one pane, which is
|
|
64
|
+
* its frame (`toolAcceptsPane`). */
|
|
65
|
+
pane: ToolPane;
|
|
66
|
+
/**
|
|
67
|
+
* Which run of the dock the button joins, and the rule beside it.
|
|
68
|
+
*
|
|
69
|
+
* IN THE TABLE and not in the JSX, for the reason every other field is here:
|
|
70
|
+
* `as const satisfies Record<ShotTool, ToolSpec>` below makes a row without a
|
|
71
|
+
* group a COMPILE ERROR, so a new tool has to answer "does a press with this
|
|
72
|
+
* pick something or make something" in the same place it answers what letter
|
|
73
|
+
* arms it. A JSX-side list of names would answer it silently — by dropping
|
|
74
|
+
* the button out of both groups.
|
|
75
|
+
*/
|
|
76
|
+
group: ToolGroup;
|
|
77
|
+
/** The gesture grammar the stage routes for the tool. */
|
|
78
|
+
gesture: ToolGesture;
|
|
79
|
+
/** Does a press-drag-release with this tool INSERT a layer? False for select,
|
|
80
|
+
* which picks and drags. */
|
|
54
81
|
draws: boolean;
|
|
55
82
|
/** The CSS cursor while this tool is armed. A row here rather than a default
|
|
56
83
|
* in the stage means a new tool has to answer "what does the pointer look
|
|
@@ -64,29 +91,33 @@ export interface ToolSpec {
|
|
|
64
91
|
* The flyout rows sit beside the button they fly out of.
|
|
65
92
|
*/
|
|
66
93
|
export const TOOL_SPECS = {
|
|
67
|
-
|
|
68
|
-
//
|
|
69
|
-
//
|
|
70
|
-
|
|
71
|
-
move: { label: "Move", key: "g", surface: "dock", draws: false, cursor: "move" },
|
|
94
|
+
// Select also moves. A drag slides the layer along its own plane, and an
|
|
95
|
+
// Alt-drag keeps it flat to the frame (stage/interactions/move.ts). There is
|
|
96
|
+
// no separate Move tool: G is the working pane's modal grab.
|
|
97
|
+
select: { label: "Select", key: "v", surface: "dock", pane: "any", group: "pick", gesture: "none", draws: false, cursor: "default" },
|
|
72
98
|
// `draws: true` and a text cursor are not in tension: the box IS drawn, and
|
|
73
99
|
// what the author gets for it is somewhere to type.
|
|
74
|
-
text: { label: "Text", key: "t", surface: "dock", draws: true, cursor: "text" },
|
|
75
|
-
// "
|
|
100
|
+
text: { label: "Text", key: "t", surface: "dock", pane: "camera", group: "draw", gesture: "box", draws: true, cursor: "text" },
|
|
101
|
+
// "Media" and not "Image": the box the author draws takes an image OR a
|
|
76
102
|
// video, and the server's sniff of the file they pick decides which layer
|
|
77
|
-
// kind it becomes.
|
|
78
|
-
//
|
|
79
|
-
//
|
|
80
|
-
//
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
103
|
+
// kind it becomes. It was "Frame", which is worse than vague — it is Figma's
|
|
104
|
+
// word for an ARTBOARD, so on a box that holds a file it is a false friend,
|
|
105
|
+
// and this editor has real frames (the timeline's) that it is not about. The
|
|
106
|
+
// tool ID stays `image` because it is a persisted vocabulary — the bridge,
|
|
107
|
+
// the keymap and the insert map all key on it — and renaming a wire word to
|
|
108
|
+
// fix a button's caption is a schema break for a string nobody sees.
|
|
109
|
+
image: { label: "Media", key: "i", surface: "dock", pane: "camera", group: "draw", gesture: "box", draws: true, cursor: "crosshair" },
|
|
110
|
+
rect: { label: "Rect", key: "r", surface: "dock", pane: "camera", group: "draw", gesture: "box", draws: true, cursor: "crosshair" },
|
|
111
|
+
ellipse: { label: "Ellipse", key: "o", surface: "flyout", pane: "camera", group: "draw", gesture: "box", draws: true, cursor: "crosshair" },
|
|
112
|
+
line: { label: "Line", key: "l", surface: "flyout", pane: "camera", group: "draw", gesture: "box", draws: true, cursor: "crosshair" },
|
|
113
|
+
arrow: { label: "Arrow", key: "l", shift: true, surface: "flyout", pane: "camera", group: "draw", gesture: "box", draws: true, cursor: "crosshair" },
|
|
86
114
|
// The pen takes no drag at all and still shows the crosshair: what the cursor
|
|
87
115
|
// announces is "a press here authors geometry", which is true of every press
|
|
88
116
|
// it takes, not "a drag is about to start".
|
|
89
|
-
path: { label: "Pen", key: "p", surface: "dock", draws: false, cursor: "crosshair" },
|
|
117
|
+
path: { label: "Pen", key: "p", surface: "dock", pane: "camera", group: "draw", gesture: "points-2d", draws: false, cursor: "crosshair" },
|
|
118
|
+
// A distinct working-pane tool. The 2D Pen keeps P; Shift+P authors points
|
|
119
|
+
// on the active 3D work plane and commits a mesh spline.
|
|
120
|
+
spline: { label: "Spline", key: "p", shift: true, surface: "dock", pane: "working", group: "draw", gesture: "points-3d", draws: false, cursor: "crosshair" },
|
|
90
121
|
// NO `cut` ROW. It armed a crosshair and did nothing at all: the stage's
|
|
91
122
|
// pointer lane has no branch for it, and ⌘B is the real split-at-playhead.
|
|
92
123
|
// Deleting it is compile-checked by the `satisfies` below, and it frees `C`.
|
|
@@ -131,6 +162,9 @@ export type DrawTool = {
|
|
|
131
162
|
*/
|
|
132
163
|
export type InsertTool = DrawTool | "path";
|
|
133
164
|
|
|
165
|
+
/** Every tool that creates a document layer, including the 3D spline lane. */
|
|
166
|
+
export type CreatingTool = InsertTool | "spline";
|
|
167
|
+
|
|
134
168
|
/** The tools with a button in the dock's own row. The dock's icon map is keyed
|
|
135
169
|
* on it, so a new dock tool without a glyph is a compile error. */
|
|
136
170
|
export type DockTool = {
|
|
@@ -149,12 +183,63 @@ export function isDrawTool(tool: ShotTool): tool is DrawTool {
|
|
|
149
183
|
return TOOL_SPECS[tool].draws;
|
|
150
184
|
}
|
|
151
185
|
|
|
186
|
+
/**
|
|
187
|
+
* `InsertTool` as a RUNTIME test, which is what "does this tool need the camera
|
|
188
|
+
* pane" costs everywhere it is asked.
|
|
189
|
+
*
|
|
190
|
+
* Creating tools have an explicit pane in the table. Box tools and the 2D pen
|
|
191
|
+
* author on the frame (the camera pane over a Shot, a definition's one pane
|
|
192
|
+
* inside it); the 3D spline tool authors in the working pane.
|
|
193
|
+
* Three surfaces have to agree about that metadata (the dock, the keymap and
|
|
194
|
+
* the stage), rather than each carrying a hand-written creator list.
|
|
195
|
+
*
|
|
196
|
+
* A mapped type is not a value, so the `"path"` arm is written twice — once in
|
|
197
|
+
* the union above and once here. test/toolSurface.test.ts pins them together.
|
|
198
|
+
*/
|
|
199
|
+
export function isInsertTool(tool: ShotTool): tool is CreatingTool {
|
|
200
|
+
return TOOL_SPECS[tool].gesture !== "none";
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Does this tool accept input in this pane?
|
|
205
|
+
*
|
|
206
|
+
* `framePane` is the pane the frame is edited through: the camera pane over a
|
|
207
|
+
* Shot (the default), and inside a definition its one pane, the working one.
|
|
208
|
+
* A camera-pane tool draws on the frame, so it acts wherever the frame is.
|
|
209
|
+
* Null where no pane is a frame anything can be drawn into.
|
|
210
|
+
*/
|
|
211
|
+
export function toolAcceptsPane(
|
|
212
|
+
tool: ShotTool,
|
|
213
|
+
pane: "camera" | "working",
|
|
214
|
+
framePane: "camera" | "working" | null = "camera",
|
|
215
|
+
): boolean {
|
|
216
|
+
const target = specOf(tool).pane;
|
|
217
|
+
return target === "any" || target === pane || (target === "camera" && pane === framePane);
|
|
218
|
+
}
|
|
219
|
+
|
|
152
220
|
const isDockTool = (tool: ShotTool): tool is DockTool => TOOL_SPECS[tool].surface === "dock";
|
|
153
221
|
const isFlyoutTool = (tool: ShotTool): tool is FlyoutTool => TOOL_SPECS[tool].surface === "flyout";
|
|
154
222
|
|
|
155
223
|
export const DOCK_TOOLS: readonly DockTool[] = SHOT_TOOLS.filter(isDockTool);
|
|
156
224
|
export const FLYOUT_TOOLS: readonly FlyoutTool[] = SHOT_TOOLS.filter(isFlyoutTool);
|
|
157
225
|
|
|
226
|
+
/**
|
|
227
|
+
* The dock's row as the RULED GROUPS it is drawn in, in dock order inside each
|
|
228
|
+
* group and in group order between them.
|
|
229
|
+
*
|
|
230
|
+
* Derived here rather than filtered inline in the JSX, for the same reason
|
|
231
|
+
* `DOCK_TOOLS` is: the toolbar renders what the table says, so regrouping a
|
|
232
|
+
* tool is a one-word edit to its row and the group's `aria-label` cannot drift
|
|
233
|
+
* away from the set of buttons it actually wraps. The label is the group's own
|
|
234
|
+
* word, title-cased once, because that is what the screen reader is given.
|
|
235
|
+
*/
|
|
236
|
+
const inGroup = (group: ToolGroup): readonly DockTool[] => DOCK_TOOLS.filter((t) => TOOL_SPECS[t].group === group);
|
|
237
|
+
|
|
238
|
+
export const DOCK_GROUPS: readonly { label: string; tools: readonly DockTool[] }[] = [
|
|
239
|
+
{ label: "Pick", tools: inGroup("pick") },
|
|
240
|
+
{ label: "Draw", tools: inGroup("draw") },
|
|
241
|
+
];
|
|
242
|
+
|
|
158
243
|
/** Keyed on `${letter}${shift ? "+" : ""}` so `l` and `l+` are different
|
|
159
244
|
* entries rather than one entry with a branch beside it. */
|
|
160
245
|
const TOOL_BY_KEY: ReadonlyMap<string, ShotTool> = new Map(
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.agent-panel{position:relative;display:flex;flex-direction:column;height:100%;min-width:0}.agent-title{display:flex;align-items:center;gap:6px}.agent-title-label{flex:none}.agent-models{display:flex;gap:2px;flex:1;min-width:0}.agent-setup{padding:8px;border-bottom:1px solid var(--border);flex:none;display:flex;flex-direction:column;gap:6px}.agent-setup-blurb{margin:0;color:var(--text-2);font-size:12px;line-height:1.5}.agent-setup-row{display:flex;gap:4px}.agent-key-input{flex:1;min-width:0;background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-1);padding:4px 6px;font:var(--mono)}.agent-transcript{flex:1;min-height:0;overflow-y:auto;padding:8px;display:flex;flex-direction:column;gap:6px}.agent-msg{border-radius:var(--radius);padding:5px 8px;font-size:12px;line-height:1.5;white-space:pre-wrap;overflow-wrap:anywhere}.agent-msg-user{background:var(--accent-soft);color:var(--text-1);align-self:flex-end;max-width:90%}.agent-msg-assistant{background:var(--bg-2);color:var(--text-1)}.agent-msg-error{background:var(--bg-2);color:var(--danger)}.agent-msg-info{color:var(--text-3);font-style:italic}.agent-tool{color:var(--text-3);font:var(--mono);font-size:11px;padding-left:8px}.agent-tool:before{content:"⚙ "}.agent-thinking{animation:agent-pulse 1.2s ease-in-out infinite}@keyframes agent-pulse{50%{opacity:.4}}.agent-card{border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-1);overflow:hidden;flex:none}.agent-card-applied{border-color:var(--accent)}.agent-card-head{display:flex;align-items:center;gap:6px;padding:4px 6px;border-bottom:1px solid var(--border);background:var(--bg-2)}.agent-card-path{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-1)}.agent-card:not(.agent-card-canvas) .agent-card-path{font:var(--mono)}.agent-card-status{flex:none;font-size:11px;text-transform:uppercase;letter-spacing:.04em}.agent-card-status.is-applied{color:var(--accent)}.agent-card-status.is-stale,.agent-card-status.is-failed{color:var(--danger)}.agent-card-status.is-applying{color:var(--text-2)}.agent-card-meta{display:flex;align-items:center;flex-wrap:wrap;gap:4px;padding:4px 8px;font-size:11px;color:var(--text-3)}.agent-card-doc{color:var(--text-2);font:var(--mono);font-size:11px}.agent-card-count:before{content:"· "}.agent-tree{margin:0;padding:4px 0;max-height:260px;overflow:auto;font:var(--mono);font-size:11px;line-height:1.45;color:var(--text-2)}.agent-tree-line{padding:0 8px;white-space:pre}.agent-diff{margin:0;padding:4px 0;max-height:260px;overflow:auto;font:var(--mono);font-size:11px;line-height:1.45}.agent-diff>div{padding:0 8px;white-space:pre}.agent-diff-add{background:#40a06029;color:#7fd79f}.agent-diff-del{background:#c8484824;color:#e79a9a}.agent-diff-hunk{color:var(--text-3)}.agent-diff-ctx{color:var(--text-2)}.agent-card-note{padding:4px 8px;color:var(--text-3);font-size:11px}.agent-card-error{margin:0;white-space:normal}.agent-card-warning{color:var(--warn, #e0a33e);white-space:normal}.agent-strip{flex:none;display:flex;align-items:center;gap:8px}.agent-strip-msg{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-cost{flex:none;padding:2px 8px;color:var(--text-3);font-size:11px;text-align:right}.agent-composer{display:flex;align-items:flex-end;gap:4px;padding:8px;border-top:1px solid var(--border);flex:none;flex-wrap:wrap}.agent-pin{flex:0 0 100%;color:var(--text-3);font-size:11px}.agent-input{flex:1;min-width:0;resize:none;background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-1);padding:5px 7px;font:inherit;font-size:12px;line-height:1.4}.agent-input:focus{outline:1px solid var(--accent)}:root{--bg-0: #0b0b0d;--bg-1: #141417;--bg-2: #1d1d21;--bg-3: #27272d;--border: #28282e;--border-strong: #3a3a42;--text-1: #f0f0f4;--text-2: #a4a4af;--text-3: #6e6e7a;--accent: #f43f5e;--accent-soft: #f43f5e33;--kf: #e8c34a;--spring: #a3e635;--warn: #ffb454;--danger: #ff5c69;--danger-bg: #2a1518;--danger-border: #5c2a31;--space-0: 0;--space-1: 2px;--space-2: 4px;--space-3: 6px;--space-4: 8px;--space-5: 10px;--space-6: 12px;--space-7: 16px;--space-8: 24px;--radius-sm: 6px;--radius-md: 8px;--radius-lg: 10px;--radius-xl: 16px;--radius: var(--radius-md);--control-radius: var(--radius-lg);--text-2xs: 9px;--text-xs: 10px;--text-sm: 11px;--text-md: 12px;--text-lg: 13px;--weight-regular: 400;--weight-medium: 500;--weight-semibold: 600;--tracking-caps: .05em;--font: 12px/1.45 system-ui, "Segoe UI", sans-serif;--mono: 11px/1.4 ui-monospace, Consolas, monospace;--control-h: 28px;--row-h: 28px;--section-header-h: 32px;--label-w: 64px;--slider-fill: color-mix(in srgb, var(--accent) 24%, transparent);--slider-thumb: var(--accent);--shadow-1: 0 1px 2px #0006;--shadow-2: 0 4px 12px #0008;--shadow-popover: 0 8px 28px -4px #000a, 0 2px 6px #0007;--ring-width: 2px;--ring-color: var(--accent-soft);--focus-ring: 0 0 0 var(--ring-width) var(--ring-color);--dur-fast: 80ms;--dur-med: .14s;--ease: cubic-bezier(.2, 0, 0, 1);--z-panel: 2;--z-dock: 3;--z-overlay: 10;--z-menu: 1000;--z-dialog: 1100;--panel-radius: var(--radius-xl);--panel-shadow: 0 8px 32px -8px #000c, 0 2px 8px #0008;--panel-bg: color-mix(in srgb, var(--bg-1) 92%, transparent);--panel-blur: 12px;--panel-gutter: var(--space-4);--dock-h-default: 240px;--dock-h-min: 120px;--dock-h-collapsed: 0px;--panel-w-left: 248px;--panel-w-inspector: 300px;--resize-hit: 6px;--canvas-bg: #0f0f11;--stage-guide: #ff9f2e;--stage-ruler-guide: #19b9d4;--stage-draw: #33c27f;--stage-selection: var(--accent);--stage-selection-soft: color-mix(in srgb, var(--accent) 55%, transparent);--stage-selection-fill: color-mix(in srgb, var(--accent) 8%, transparent);--stage-draw-fill: color-mix(in srgb, var(--stage-draw) 8%, transparent);--stage-handle: var(--text-1);--stage-artboard-shadow: 0 2px 16px #0006;--surface-app: var(--bg-0);--surface-panel: var(--bg-1);--surface-inset: var(--bg-2);--surface-hover: var(--bg-3);--control-bg: var(--bg-2);--control-bg-hover: var(--bg-3);--control-border: var(--border);--control-border-hover: var(--border-strong);--control-border-focus: var(--accent);--text-primary: var(--text-1);--text-secondary: var(--text-2);--text-tertiary: var(--text-3);--divider: var(--border);--divider-strong: var(--border-strong)}:root[data-theme=light]{--bg-0: #f5f5f7;--bg-1: #ffffff;--bg-2: #f0f0f3;--bg-3: #e6e6ea;--border: #e2e2e8;--border-strong: #cfcfd8;--text-1: #1c1c22;--text-2: #5b5b68;--text-3: #8a8a97;--accent-soft: #f43f5e26;--shadow-1: 0 1px 2px #0000001a;--shadow-2: 0 4px 12px #00000024;--shadow-popover: 0 8px 28px -4px #00000033, 0 2px 6px #0000001f;--canvas-bg: #e9e9ee;--danger-bg: #fdecee;--danger-border: #f3c2c8;--stage-artboard-shadow: 0 2px 16px #00000026}:root{color-scheme:dark}:root[data-theme=light]{color-scheme:light}button,input,select,textarea{font:inherit;color:inherit}.btn{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;background:var(--control-bg);border:1px solid transparent;border-radius:var(--radius);color:var(--text-1);cursor:pointer;transition:background var(--dur-fast) var(--ease),border-color var(--dur-fast) var(--ease),color var(--dur-fast) var(--ease)}.btn:hover:not(:disabled){background:var(--control-bg-hover)}.btn:disabled{opacity:.45;cursor:default}.btn.is-icon{padding:4px}.btn.is-active{background:var(--accent-soft);color:var(--accent)}.btn.is-danger:hover:not(:disabled){border-color:var(--danger);color:var(--danger)}.btn.is-primary{background:var(--accent);border-color:var(--accent);color:#fff}.btn.is-primary:hover:not(:disabled){background:var(--accent);border-color:var(--accent);filter:brightness(1.12)}.btn.is-primary.is-danger,.btn.is-primary.is-danger:hover:not(:disabled){background:var(--danger);border-color:var(--danger);color:#fff}.select{height:var(--control-h);padding:0 var(--space-4);background:var(--control-bg);border:1px solid transparent;border-radius:var(--control-radius);max-width:100%;transition:background var(--dur-fast) var(--ease),border-color var(--dur-fast) var(--ease),box-shadow var(--dur-fast) var(--ease)}.text-input{height:var(--control-h);padding:0 var(--space-5);background:var(--control-bg);border:1px solid transparent;border-radius:var(--control-radius);width:100%;min-width:0;transition:background var(--dur-fast) var(--ease),border-color var(--dur-fast) var(--ease),box-shadow var(--dur-fast) var(--ease)}textarea.text-input{height:auto;padding:var(--space-3) var(--space-5)}.text-input:hover,.select:hover{background:var(--control-bg-hover)}.text-input:focus,.select:focus{outline:none;background:var(--control-bg);border-color:var(--control-border-focus);box-shadow:var(--focus-ring)}.numfield{position:relative;display:inline-flex;align-items:center;gap:var(--space-2);min-width:0;height:var(--control-h);padding:0 var(--space-5);background:var(--control-bg);border:1px solid transparent;border-radius:var(--control-radius);overflow:hidden;transition:background var(--dur-fast) var(--ease),border-color var(--dur-fast) var(--ease),box-shadow var(--dur-fast) var(--ease)}.numfield:hover:not(.is-disabled){background:var(--control-bg-hover)}.numfield:focus-within{background:var(--control-bg);border-color:var(--control-border-focus);box-shadow:var(--focus-ring)}.numfield-fill{position:absolute;top:0;bottom:0;left:0;background:var(--slider-fill);border-right:2px solid var(--slider-thumb);pointer-events:none}.numfield-label{position:relative;flex:1 1 auto;min-width:14px;color:var(--text-2);cursor:ew-resize;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;user-select:none}.numfield-input{position:relative;flex:1 1 36px;min-width:24px;padding:0;background:none;border:none;text-align:right;color:var(--text-1);user-select:text}.numfield-input:focus{outline:none}.numfield-unit{position:relative;color:var(--text-3);flex:none;cursor:ew-resize;user-select:none}.numfield.is-disabled{opacity:.45}.numfield.is-disabled .numfield-label,.numfield.is-disabled .numfield-unit{cursor:default}.badge{display:inline-block;padding:0 5px;border-radius:var(--radius-sm);font-size:var(--text-xs);line-height:16px;background:var(--bg-3);color:var(--text-2);white-space:nowrap}.chevron{transition:transform var(--dur-fast) var(--ease)}.chevron.is-open{transform:rotate(90deg)}.popover{background:var(--surface-inset);border:1px solid var(--border-strong);border-radius:var(--radius-xl);box-shadow:var(--shadow-popover)}.popover-float{z-index:var(--z-menu)}.panel-crash{display:flex;flex-direction:column;align-items:flex-start;gap:var(--space-2);margin:var(--space-2);padding:var(--space-3);border:1px solid var(--danger);border-radius:var(--radius-md);background:var(--bg-2)}.panel-crash-title{color:var(--danger);font-weight:600}.panel-crash-message{color:var(--text-secondary);font-size:var(--text-xs);white-space:pre-wrap;overflow-wrap:anywhere}.insp-section{display:flex;flex-direction:column;gap:var(--space-2);padding:var(--space-6) var(--space-7);border-bottom:1px solid var(--divider)}.insp-heading{display:flex;align-items:center;gap:var(--space-3);min-height:var(--section-header-h);font-size:var(--text-md);font-weight:var(--weight-semibold);letter-spacing:0;color:var(--text-primary)}.insp-row{display:flex;align-items:center;gap:var(--space-3);min-height:var(--row-h)}.insp-row.is-align-start{align-items:flex-start}.insp-label{flex:none;width:var(--label-w);color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.insp-label.is-icon{width:auto;min-width:14px;display:inline-flex;align-items:center;justify-content:center;color:var(--text-tertiary)}.insp-control{flex:1;min-width:0;display:flex;align-items:center;gap:var(--space-2)}.insp-num{flex:1;min-width:0}.insp-vec{flex:1;min-width:0;display:flex;gap:4px}.insp-vec .numfield{flex:1;min-width:0}.insp-grid{flex:1;min-width:0;display:grid;grid-template-columns:repeat(var(--insp-cols, 2),minmax(0,1fr));gap:var(--space-2)}.insp-grid .numfield{min-width:0}.insp-dim{color:var(--text-tertiary);font:var(--mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.insp-inline-error{color:var(--danger);font-size:var(--text-xs);white-space:normal;user-select:text}.insp-notice{font-size:var(--text-xs);white-space:normal;user-select:text;color:var(--text-tertiary)}.insp-notice.is-warn{color:var(--warn)}.insp-textarea{resize:vertical;min-height:44px}.insp-color{flex:none;width:30px;height:var(--control-h);padding:1px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-2);cursor:pointer}.insp-check{accent-color:var(--accent);margin:0}.insp-section-headrow{display:flex;align-items:center;gap:var(--space-2)}.insp-section-header{flex:1;min-width:0;display:flex;align-items:center;gap:var(--space-3);height:var(--section-header-h);padding:0;background:none;border:none;cursor:pointer;font-size:var(--text-md);font-weight:var(--weight-semibold);letter-spacing:0;color:var(--text-primary)}.insp-section-header.is-static{cursor:default}.insp-section-header:hover:not(.is-static) .insp-section-disclosure{color:var(--text-secondary)}.insp-section-disclosure{flex:none;order:2;margin-left:auto;color:var(--text-tertiary)}.insp-section-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.insp-section-actions{flex:none;display:flex;align-items:center;gap:var(--space-1);opacity:0;transition:opacity var(--dur-fast) var(--ease)}.insp-section:hover .insp-section-actions,.insp-section-actions:focus-within{opacity:1}.insp-section-body{display:flex;flex-direction:column;gap:var(--space-3);padding-top:var(--space-3)}.insp-composite{flex:1;min-width:0;display:flex;flex-direction:column;align-items:flex-start;gap:4px}.insp-composite-toggle{cursor:pointer}.insp-composite-toggle:disabled{cursor:default;opacity:.55}.insp-composite-editor{align-self:stretch;display:flex;flex-direction:column;gap:var(--space-3);padding:var(--space-3);border:1px solid var(--border);border-radius:var(--radius-lg);background:var(--bg-2)}.insp-composite-curve{display:block;background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius)}.insp-composite-curve polyline{fill:none;stroke:var(--accent);stroke-width:1.5}.insp-composite-point{display:flex;flex-direction:column;gap:2px;padding-bottom:2px;border-bottom:1px solid var(--border)}.insp-composite-point .numfield,.insp-composite-handles .numfield{flex:1;min-width:0}.insp-gradient-preview{height:14px;border:1px solid var(--border);border-radius:var(--radius)}.segmented{display:inline-flex;flex:1;min-width:0;padding:2px;gap:2px;background:var(--control-bg);border-radius:var(--control-radius)}.segmented-item,.segmented-item:first-child,.segmented-item:last-child,.segmented-item:only-child{flex:1 1 0;min-width:0;min-height:calc(var(--control-h) - 8px);justify-content:center;margin-left:0;padding:1px 6px;background:transparent;border-radius:calc(var(--control-radius) - 2px);color:var(--text-2)}.segmented-item:hover:not(:disabled){background:color-mix(in srgb,var(--text-1) 6%,transparent);color:var(--text-1)}.segmented-item.is-active,.segmented-item.is-active:hover:not(:disabled){position:relative;z-index:1;background:var(--accent);color:#fff;box-shadow:var(--shadow-1)}.toggle{flex:none;width:32px;height:18px;padding:0;border:none;border-radius:999px;background:var(--bg-3);cursor:pointer;position:relative;transition:background var(--dur-fast) var(--ease)}.toggle:hover:not(:disabled):not(.is-on){background:var(--border-strong)}.toggle.is-on{background:var(--accent)}.toggle:disabled{opacity:.45;cursor:default}.toggle-knob{position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;background:var(--text-1);box-shadow:var(--shadow-1);transition:transform var(--dur-fast) var(--ease)}.toggle.is-on .toggle-knob{transform:translate(14px);background:#fff}.combobox-trigger{display:inline-flex;align-items:center;gap:var(--space-2);width:100%;text-align:left;cursor:pointer}.combobox-value{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.combobox-caret{flex:none;color:var(--text-3);transform:rotate(90deg)}.combobox-pop{padding:var(--space-2);max-height:280px;display:flex;flex-direction:column;gap:var(--space-2)}.combobox-search{display:flex;align-items:center;gap:var(--space-2);position:relative}.combobox-search-icon{position:absolute;left:6px;color:var(--text-3);pointer-events:none}.combobox-search .text-input{padding-left:22px}.combobox-list{list-style:none;margin:0;padding:0;overflow:auto;min-width:0}.combobox-option{padding:3px 8px;border-radius:var(--radius-sm);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.combobox-option.is-active{background:var(--surface-hover)}.combobox-option.is-selected{color:var(--accent)}.combobox-empty{padding:4px 8px;color:var(--text-3)}.angle-dial{flex:none;cursor:grab;touch-action:none}.angle-dial:active{cursor:grabbing}.angle-dial.is-disabled{opacity:.45;cursor:default}.angle-dial-ring{fill:var(--control-bg);stroke:var(--control-border);stroke-width:1}.angle-dial:hover .angle-dial-ring{stroke:var(--control-border-hover)}.angle-dial-arm{stroke:var(--accent);stroke-width:1.2}.angle-dial-handle{fill:var(--accent)}.colorpicker-swatch,.colorpicker-alpha{background-image:linear-gradient(45deg,#808080 25%,transparent 25%),linear-gradient(-45deg,#808080 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#808080 75%),linear-gradient(-45deg,transparent 75%,#808080 75%);background-size:8px 8px;background-position:0 0,0 4px,4px -4px,-4px 0}.colorpicker-swatch{padding:0;overflow:hidden;position:relative}.colorpicker-swatch-fill{position:absolute;inset:0}.colorpicker-pop{width:252px;padding:var(--space-4);display:flex;flex-direction:column;gap:var(--space-3)}.colorpicker-sv{position:relative;width:100%;height:140px;border-radius:var(--radius);cursor:crosshair;touch-action:none;background-image:linear-gradient(to top,#000,transparent),linear-gradient(to right,#fff,transparent)}.colorpicker-sv-thumb,.colorpicker-slider-thumb{position:absolute;width:12px;height:12px;border-radius:50%;border:2px solid #fff;box-shadow:0 0 0 1px #0008;transform:translate(-50%,-50%);pointer-events:none}.colorpicker-hue,.colorpicker-alpha{position:relative;height:12px;border-radius:999px;cursor:ew-resize;touch-action:none}.colorpicker-hue{background:linear-gradient(to right,red,#ff0 17%,#0f0 33%,#0ff,#00f 67%,#f0f 83%,red)}.colorpicker-alpha-bar{position:absolute;inset:0;border-radius:999px}.colorpicker-hue .colorpicker-slider-thumb,.colorpicker-alpha .colorpicker-slider-thumb{top:50%}.colorpicker-fields{display:grid;grid-template-columns:1fr auto auto auto auto;gap:var(--space-2);align-items:center}.colorpicker-hex{min-width:0}.colorpicker-ch{min-width:0;padding:0 var(--space-3)}.colorpicker-ch .numfield-input{min-width:20px}.colorpicker-swatches{display:grid;grid-template-columns:repeat(12,1fr);gap:3px}.colorpicker-swatch-chip{aspect-ratio:1;border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;padding:0}.colorpicker-swatch-chip:hover{border-color:var(--text-2)}.topbar{flex:1;min-width:0;display:flex;align-items:center;gap:8px}.topbar-tabs{display:flex;flex:none;padding:2px;gap:2px;background:var(--control-bg);border-radius:var(--control-radius)}.topbar-tabs .btn{text-decoration:none;margin-left:0;padding:2px 10px;background:transparent;border-radius:calc(var(--control-radius) - 2px);color:var(--text-2)}.topbar-tabs .btn:hover:not(:disabled){background:color-mix(in srgb,var(--text-1) 6%,transparent);color:var(--text-1)}.topbar-tabs .btn.is-active,.topbar-tabs .btn.is-active:hover:not(:disabled){position:relative;background:var(--accent);color:#fff;box-shadow:var(--shadow-1)}.topbar-rest{flex:1;min-width:0;display:flex;align-items:center;gap:8px;justify-content:flex-end}.menu{min-width:168px;max-width:320px;max-height:70vh;overflow:auto;padding:var(--space-2);background:var(--bg-2);border:1px solid var(--border-strong);border-radius:var(--radius-lg);box-shadow:var(--shadow-popover);z-index:var(--z-menu);outline:none}.menu-item{display:flex;align-items:center;gap:var(--space-6);min-height:var(--control-h);padding:0 var(--space-4);border-radius:var(--radius-md);color:var(--text-primary);cursor:default;user-select:none}.menu-item.is-active{background:var(--accent);color:#fff}.menu-item.is-danger{color:var(--danger)}.menu-item.is-danger.is-active{background:var(--danger);color:#fff}.menu-item.is-disabled{color:var(--text-tertiary)}.menu-item.is-disabled.is-active{background:transparent;color:var(--text-tertiary)}.menu-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.menu-shortcut{flex:none;color:var(--text-tertiary);font-size:var(--text-xs)}.menu-item.is-active .menu-shortcut{color:#ffffffb8}.menu-caret{flex:none;color:var(--text-tertiary)}.menu-item.is-active .menu-caret{color:inherit}.menu-separator{height:1px;margin:var(--space-1) var(--space-2);background:var(--divider)}.dialog-overlay{position:fixed;inset:0;z-index:var(--z-dialog);display:flex;align-items:center;justify-content:center;padding:var(--space-8);background:#000000a6}.dialog{width:320px;max-width:100%;max-height:100%;display:flex;flex-direction:column;gap:var(--space-5);padding:var(--space-6);background:var(--surface-panel);border:1px solid var(--border-strong);border-radius:var(--radius-xl);box-shadow:var(--shadow-2);outline:none}.dialog-title{font-size:var(--text-lg);font-weight:var(--weight-semibold);color:var(--text-primary)}.dialog-body{display:flex;flex-direction:column;gap:var(--space-4);min-height:0;overflow:auto;color:var(--text-secondary)}.dialog-message{margin:0;white-space:normal}.dialog-field{display:flex;flex-direction:column;gap:var(--space-2)}.dialog-label{color:var(--text-secondary)}.dialog-error{color:var(--danger);font-size:var(--text-xs)}.dialog-actions{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-3)}:root{--font-ui: system-ui, "Segoe UI", sans-serif;--bg: #000000;--panel: #0c0c0e;--panel-raised: #141417;--control: #1b1b1f;--control-hover: #26262c;--input-bg: #1b1b1f;--border: #232328;--border-soft: #1a1a1e;--text: #f2f2f5;--text-dim: #8e8e97;--text-faint: #5d5d66;--accent: #0a84ff;--accent-hover: #3d9dff;--accent-soft: rgba(10, 132, 255, .16);--accent-quiet: rgba(10, 132, 255, .12);--accent-warm: #f5a524;--danger: #ff4d4f;--danger-text: #ff8a8c;--warn: #f5a524;--guide: #f5a524;--frame-border: rgba(255, 255, 255, .22);--marquee: var(--accent);--frustum: #eab308;--grid: #2a2a31;--axis-x: #ef4444;--axis-y: #22c55e;--axis-z: #3b82f6;--stage-divider: var(--border);--block-in: #38bdf8;--block-during: #a78bfa;--block-out: #f472b6;--scene-bar: #34d399;--playhead: var(--accent);--audio-clip: #2dd4bf;--audio-line: #fef08a;--marker: #f97316;--marker-pin: #ffffff}:root{--control-bg: var(--control);--control-bg-hover: var(--control-hover);--control-border: transparent;--control-border-hover: var(--border);--control-border-focus: var(--accent);--control-radius: 8px;--control-h: 30px;--panel-bg: var(--panel);--divider: var(--border-soft);--focus-ring: 0 0 0 3px var(--accent-soft);--label-w: 76px;--slider-fill: rgba(255, 255, 255, .05);--slider-thumb: rgba(255, 255, 255, .14);--shadow-panel: 0 12px 40px rgba(0, 0, 0, .55), 0 2px 8px rgba(0, 0, 0, .4);--panel-radius: 12px;--rail-w: 232px;--inspector-w: 288px}.shell.is-rail-collapsed{--rail-w: 0px}.shell.is-inspector-collapsed{--inspector-w: 0px}.shell.is-rail-collapsed>.left-rail,.shell.is-inspector-collapsed>.inspector,.shell.is-inspector-collapsed>.agent-panel{display:none}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{font:var(--font);color:var(--text);background:var(--bg);-webkit-font-smoothing:antialiased}.shell{position:relative;height:100%}.stage-frame{position:fixed;inset:0;width:100%;height:100%;border:0;display:block}.shell-header,.left-rail,.inspector,.agent-panel,.timeline-dock,.tool-dock,.view-mode-bar,.camera-view-bar,.tool-flyout,.overlay-message{background:var(--panel);border:1px solid var(--border);border-radius:var(--panel-radius);box-shadow:var(--shadow-panel)}.btn,.shell-header button,.dock-head button,.export-dialog button{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:28px;padding:0 10px;font:inherit;font-weight:500;color:var(--text);background:var(--control);border:1px solid transparent;border-radius:8px;cursor:pointer;white-space:nowrap;transition:background .12s ease,color .12s ease,border-color .12s ease}.btn:hover:not(:disabled),.shell-header button:hover:not(:disabled),.dock-head button:hover:not(:disabled),.export-dialog button:hover:not(:disabled){background:var(--control-hover)}.btn:disabled,.shell-header button:disabled,.export-dialog button:disabled{opacity:.35;cursor:default}.btn.is-icon,.shell-header button.is-icon{width:28px;padding:0;font-size:13px}.btn.is-primary,.shell-header button.is-primary{background:var(--accent);border-color:transparent;color:#fff}.btn.is-primary:hover:not(:disabled){background:var(--accent-hover)}.btn.is-active,.btn[aria-pressed=true]{background:var(--accent-soft);color:#cfe4ff}.btn.is-danger{color:var(--danger-text)}.btn:focus-visible,.shell-header button:focus-visible{outline:none;box-shadow:var(--focus-ring)}.shell-header{position:fixed;top:12px;left:12px;right:12px;z-index:10;display:flex;align-items:center;gap:8px;height:48px;padding:0 10px}.shell-header-spacer{flex:1}.doc-switcher{display:flex;gap:6px;align-items:center}.doc-switcher-select,.doc-switcher-input,.select{appearance:none;-webkit-appearance:none;height:30px;min-width:156px;padding:0 28px 0 10px;font:inherit;font-weight:500;color:var(--text);background-color:var(--control);background-image:linear-gradient(45deg,transparent 50%,var(--text-dim) 50%),linear-gradient(135deg,var(--text-dim) 50%,transparent 50%);background-position:calc(100% - 15px) 13px,calc(100% - 10px) 13px;background-size:5px 5px,5px 5px;background-repeat:no-repeat;border:1px solid transparent;border-radius:8px;cursor:pointer}.doc-switcher-input{background-image:none;padding-right:10px;cursor:text}.doc-switcher-select:hover,.doc-switcher-input:hover{background-color:var(--control-hover)}.doc-switcher-select:focus-visible,.doc-switcher-input:focus{outline:none;border-color:var(--accent);box-shadow:var(--focus-ring)}.doc-switcher-select option{background:var(--panel-raised);color:var(--text)}.history-controls,.zoom-controls,.status-badges,.transport{display:flex;align-items:center;gap:4px}.transport{gap:8px;margin-left:4px}.transport-scrub{appearance:none;-webkit-appearance:none;width:240px;height:18px;background:transparent;cursor:pointer}.transport-scrub::-webkit-slider-runnable-track{height:4px;border-radius:999px;background:var(--control)}.transport-scrub::-webkit-slider-thumb{appearance:none;-webkit-appearance:none;width:12px;height:12px;margin-top:-4px;border-radius:999px;background:#fff;border:0;box-shadow:0 1px 3px #0009}.transport-scrub::-moz-range-track{height:4px;border-radius:999px;background:var(--control)}.transport-scrub::-moz-range-thumb{width:12px;height:12px;border:0;border-radius:999px;background:#fff}.transport-scrub:focus-visible{outline:none;box-shadow:var(--focus-ring);border-radius:999px}.transport-play{min-width:40px}.transport-readout,.zoom-readout,.dock-readout{font-variant-numeric:tabular-nums;color:var(--text-dim)}.transport-readout{min-width:64px}.zoom-readout{min-width:48px;text-align:center}.badge{display:inline-flex;align-items:center;height:22px;padding:0 8px;border-radius:999px;border:1px solid var(--border);color:var(--text-dim);white-space:nowrap}.badge-quiet{color:var(--text-faint);border-color:transparent}.badge-warn{border-color:#f5a52466;color:var(--warn)}.badge-error{border-color:#ff4d4f73;color:var(--danger-text)}.overlay-strip{position:fixed;left:50%;transform:translate(-50%);bottom:76px;z-index:20;display:flex;flex-direction:column;gap:6px;pointer-events:none;max-width:560px}.overlay-message{pointer-events:auto;display:flex;gap:10px;align-items:flex-start;padding:10px 12px;line-height:1.5;border-color:#ff4d4f80}.overlay-message button{font:inherit;font-size:14px;color:var(--text-dim);background:transparent;border:0;cursor:pointer;padding:0}.overlay-message button:hover{color:var(--text)}.empty-state{position:fixed;inset:0;z-index:5;display:grid;place-content:center;text-align:center;gap:6px;pointer-events:none;color:var(--text-faint)}.empty-state h1{font-size:20px;font-weight:600;margin:0;color:var(--text-dim)}.empty-state p{margin:0}.left-rail{position:fixed;top:72px;left:12px;bottom:12px;width:var(--rail-w);z-index:10;overflow:auto;display:flex;flex-direction:column;padding:10px}.left-rail:empty{display:none}.left-rail>*{flex-shrink:0}.help-section{margin-top:auto;padding-top:12px}.help-summary{cursor:pointer;user-select:none;list-style:none;margin:0}.help-summary::-webkit-details-marker{display:none}.help-summary:before{content:"▸ "}.help-section[open]>.help-summary:before{content:"▾ "}.help-basics{list-style:disc;margin:6px 0;padding:0 4px 0 18px;color:var(--text-dim);font-size:11px;line-height:1.5}.help-basics li+li{margin-top:4px}.help-rows{list-style:none;margin:0 0 4px;padding:0 4px}.help-row{display:flex;align-items:baseline;justify-content:space-between;gap:8px;padding:2px 0;color:var(--text-dim);font-size:11px}.help-row kbd,.help-note code{font:inherit;font-size:10px;color:var(--text);background:var(--control);border-radius:5px;padding:1px 5px;white-space:nowrap}.help-note{margin:0 0 6px;padding:0 4px;color:var(--text-faint);font-size:11px;line-height:1.45}.help-command{display:flex;align-items:flex-start;gap:6px;margin:0 0 6px;padding:0 4px}.help-command code{flex:1;font-size:10px;line-height:1.5;color:var(--text);background:var(--control);border-radius:5px;padding:4px 6px;word-break:break-all}.help-command button{font:inherit;font-size:10px;color:var(--text-dim);background:var(--control);border:0;border-radius:6px;padding:3px 7px;cursor:pointer;white-space:nowrap}.file-search{margin-bottom:4px}.file-search input{width:100%;height:30px;font:inherit;color:var(--text);background:var(--control);border:1px solid transparent;border-radius:8px;padding:0 10px}.file-search input::placeholder{color:var(--text-faint)}.file-search input:focus{outline:none;border-color:var(--accent);box-shadow:var(--focus-ring)}.file-section-label{margin:14px 0 6px;padding:0 4px;color:var(--text-faint);text-transform:uppercase;letter-spacing:.07em;font-size:10px;font-weight:600}.scene-list,.layer-list,.layer-children{list-style:none;margin:0;padding:0}.layer-children{padding-left:12px}.scene-row,.layer-name{font:inherit;font-weight:500;color:var(--text);background:transparent;border:0;padding:0 8px;height:28px;width:100%;text-align:left;cursor:pointer;border-radius:7px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.scene-row{display:flex;align-items:center;gap:6px;padding-left:6px}.row-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.scene-row:hover,.layer-row:hover{background:var(--control)}.scene-row.is-current{background:var(--accent-soft);color:#cfe4ff}.layer-row{display:flex;align-items:center;gap:2px;padding-right:4px;border-radius:7px}.layer-row.is-selected{background:var(--accent-soft)}.layer-row.is-selected .layer-name{color:#cfe4ff}.layer-kind{flex:none;width:16px;display:inline-flex;align-items:center;justify-content:center;color:var(--accent);user-select:none}.layer-kind svg{width:14px;height:14px}.layer-toggle{display:inline-flex;align-items:center;justify-content:center;color:var(--text-dim);background:transparent;border:0;cursor:pointer;border-radius:5px;padding:2px;flex:none;width:14px}.layer-toggle svg{width:10px;height:10px;transition:transform 80ms ease}.layer-toggle.is-open svg{transform:rotate(90deg)}.layer-toggle:hover{color:var(--text);background:var(--control-hover)}.layer-toggle-spacer{flex:none;width:14px}.layer-flag{display:inline-flex;align-items:center;justify-content:center;color:var(--text-dim);background:transparent;border:0;cursor:pointer;opacity:0;border-radius:5px;padding:3px 4px;flex:none}.layer-flag svg{width:13px;height:13px}.layer-row:hover .layer-flag,.layer-flag[aria-pressed=true],.layer-flag:focus-visible{opacity:.75}.layer-flag:hover{opacity:1!important;background:var(--control-hover)}.layer-rename{flex:1;min-width:0;font:inherit;color:var(--text);background:var(--input-bg);border:1px solid var(--accent);border-radius:6px;padding:3px 6px}.layer-rename:focus{outline:none;box-shadow:var(--focus-ring)}.mcp-section{margin-top:4px}.panel-title{font-weight:600;color:var(--text);margin:0 0 6px;padding:0 4px}.panel-empty{color:var(--text-faint);padding:8px 4px;line-height:1.5}.rail-resize,.dock-resize,.split-resize{z-index:12;touch-action:none;background:transparent;transition:background .12s ease}.rail-resize:hover,.dock-resize:hover,.split-resize:hover{background:var(--accent-soft)}.split-resize{position:fixed;top:128px;bottom:calc(var(--dock-h) + 24px);left:var(--split-x);width:8px;margin-left:-4px;cursor:col-resize}.rail-resize{position:fixed;top:72px;bottom:12px;left:calc(var(--rail-w) + 12px);width:8px;margin-left:-4px;cursor:col-resize}.dock-resize{position:absolute;top:0;left:0;right:0;height:8px;cursor:row-resize;border-top-left-radius:var(--panel-radius);border-top-right-radius:var(--panel-radius)}.panel-toggles{display:flex;align-items:center;gap:2px;padding:0 4px}.btn-icon{min-width:28px;padding:0 6px;justify-content:center}.control-strip{position:fixed;top:72px;left:calc(var(--rail-w) + 24px);right:calc(var(--inspector-w) + 24px);z-index:12;display:flex;align-items:flex-start;flex-wrap:wrap;gap:8px;pointer-events:none}.control-strip>*{pointer-events:auto}.tool-dock{display:flex;align-items:center;gap:2px;padding:5px;border-radius:12px}.view-mode-bar{display:flex;align-items:center;gap:2px;padding:4px;border-radius:10px}.camera-view-bar{display:flex;align-items:center;gap:4px;padding:4px;border-radius:10px}.camera-view-bar .btn.is-armed{background:#eab3082e;border-color:#eab30880;color:var(--frustum)}.tool-button{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;font:inherit;font-size:14px;color:var(--text-dim);background:transparent;border:0;border-radius:8px;cursor:pointer;transition:background .12s ease,color .12s ease}.tool-button:hover{background:var(--control);color:var(--text)}.tool-button.is-armed{background:var(--accent-soft);color:#cfe4ff}.tool-button.tool-animate[aria-pressed=true]{background:#f5a52429;color:var(--accent-warm)}.tool-separator{width:1px;align-self:stretch;margin:4px;background:var(--border)}.tool-flyout-anchor{position:relative}.tool-flyout{position:absolute;bottom:calc(100% + 8px);left:0;display:flex;flex-direction:column;gap:2px;padding:5px;border-radius:10px;white-space:nowrap;z-index:1}.tool-flyout .tool-button{width:auto;min-width:32px;justify-content:flex-start;gap:8px;padding:0 10px}.tool-flyout .tool-button:disabled{opacity:.4;cursor:default}.timeline-dock{position:fixed;left:calc(var(--rail-w) + 24px);right:calc(var(--inspector-w) + 24px);bottom:12px;z-index:11;display:flex;flex-direction:column;max-height:var(--dock-h, 42vh);overflow:hidden}.timeline-dock.is-collapsed{max-height:none}.dock-head{display:flex;align-items:center;gap:8px;height:34px;padding:0 10px;border-bottom:1px solid var(--border-soft);flex:none}.dock-collapse{font:inherit;color:var(--text-dim);background:transparent;border:0;cursor:pointer;padding:2px 4px;border-radius:5px}.dock-collapse:hover{color:var(--text);background:var(--control)}.dock-title{color:var(--text-dim);font-weight:500}.dock-play,.dock-fit{font:inherit;color:var(--text-dim);background:transparent;border:0;cursor:pointer;padding:2px 6px;border-radius:5px}.dock-play:hover,.dock-fit:hover{color:var(--text);background:var(--control)}.dock-time{font:var(--mono);font-size:12px;color:var(--text);min-width:56px}.dock-span{font:var(--mono);font-size:11px;color:var(--text-faint)}.dock-mute{font:inherit;font-size:11px;color:var(--text-dim);background:transparent;border:0;cursor:pointer;padding:2px 4px;border-radius:5px;margin-left:auto}.dock-mute:hover,.dock-mute[aria-pressed=true]{color:var(--text);background:var(--control)}.dock-volume{width:72px;accent-color:var(--accent)}.dock-readout{color:var(--text-faint)}.dock-body{display:flex;flex-direction:column;min-height:0}.dock-body[hidden]{display:none}.dock-scroll{overflow:auto;min-height:0;padding-bottom:6px}.dock-ruler{position:relative;height:24px}.tl-ruler{position:relative;height:100%;overflow:hidden;cursor:ew-resize}.tl-tick{position:absolute;top:0;bottom:0;padding-left:6px;font:var(--mono);font-size:10px;line-height:20px;color:var(--text-faint);pointer-events:none;white-space:nowrap}.tl-tick:before{content:"";position:absolute;left:0;bottom:4px;width:1px;height:6px;background:var(--border)}.dock-playhead,.scene-cut{position:absolute;top:50%;width:9px;height:9px;padding:0;transform:translate(-50%,-50%) rotate(45deg);border:1px solid var(--text-faint);border-radius:1px;background:var(--panel);cursor:pointer;z-index:3}.scene-cut:hover{border-color:var(--text)}.scene-cut.is-blend{border-color:var(--accent);background:var(--accent)}.scene-playhead{position:absolute;top:0;bottom:0;width:2px;background:var(--playhead);pointer-events:none;z-index:4}.dock-ruler .dock-playhead:after{content:"";position:absolute;top:0;left:50%;transform:translate(-50%);width:9px;height:9px;border-radius:3px;background:var(--playhead)}.dock-tracks{display:flex;flex-direction:column;position:relative}.dock-overlay{position:absolute;top:0;bottom:0;right:0;pointer-events:none;z-index:3}.dock-boundary{position:absolute;top:0;bottom:0;width:1px;background:var(--border)}.dock-snap-guide{position:absolute;top:0;bottom:0;width:1px;background:var(--accent);box-shadow:0 0 0 1px color-mix(in srgb,var(--accent) 30%,transparent)}.dock-scene-group+.dock-scene-group{border-top:1px solid var(--border)}.scene-strip{display:flex;align-items:stretch;height:26px;border-bottom:1px solid var(--border);flex:none}.scene-strip-label{display:flex;align-items:center;gap:6px;padding-left:10px;color:var(--text-faint);text-transform:uppercase;letter-spacing:.06em;font-size:10px;font-weight:600;flex:none}.scene-strip-add{font:inherit;font-size:13px;line-height:1;color:var(--text-faint);background:transparent;border:0;padding:2px 6px;border-radius:4px;cursor:pointer}.scene-strip-add:hover{color:var(--text);background:var(--control)}.scene-strip-lane{position:relative;flex:1}.scene-bar{position:absolute;top:4px;bottom:4px;display:flex;align-items:center;padding:0 8px;border-radius:6px;background:color-mix(in srgb,var(--scene-bar) 14%,transparent);border:1px solid color-mix(in srgb,var(--scene-bar) 55%,transparent);color:color-mix(in srgb,var(--scene-bar) 45%,#ffffff);cursor:pointer;overflow:hidden}.scene-bar:hover{background:color-mix(in srgb,var(--scene-bar) 22%,transparent)}.scene-bar.is-current{border-color:var(--scene-bar);background:color-mix(in srgb,var(--scene-bar) 26%,transparent);color:#fff}.scene-bar-name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:500}.scene-trim{position:absolute;right:0;top:0;bottom:0;width:7px;cursor:col-resize}.lifespan-row{display:flex;align-items:stretch;height:28px;border-bottom:1px solid var(--border-soft);contain:layout paint}.lifespan-row.is-selected{background:var(--accent-quiet)}.lifespan-label-cell{display:flex;align-items:center;flex:none;overflow:hidden}.lifespan-disclosure{font:inherit;font-size:9px;line-height:1;color:var(--text-faint);background:transparent;border:0;padding:4px;cursor:pointer;flex:none}.lifespan-disclosure:hover{color:var(--text)}.lifespan-name{font:inherit;color:var(--text-dim);background:transparent;border:0;text-align:left;padding:0 6px;cursor:pointer;flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.lifespan-name:hover,.lifespan-row.is-selected .lifespan-name{color:var(--text)}.lifespan-lane{position:relative;flex:1}.lifespan-bar{position:absolute;top:5px;bottom:5px;display:flex;align-items:center;padding:0 10px;border-radius:7px;background:color-mix(in srgb,var(--text) 10%,transparent);border:1px solid color-mix(in srgb,var(--text) 22%,transparent);color:var(--text-dim);cursor:grab;overflow:hidden;white-space:nowrap}.lifespan-bar:hover{background:color-mix(in srgb,var(--text) 16%,transparent)}.lifespan-bar.is-selected{background:color-mix(in srgb,var(--accent) 22%,transparent);border-color:var(--accent);color:#fff}.lifespan-bar-name{overflow:hidden;text-overflow:ellipsis;pointer-events:none;font-weight:500}.lifespan-handle{position:absolute;top:0;bottom:0;width:8px;cursor:col-resize}.lifespan-handle-in{left:0}.lifespan-handle-out{right:0}.block-row{display:flex;align-items:stretch;height:26px;border-bottom:1px solid var(--border-soft);contain:layout paint}.block-row.is-selected{background:var(--accent-quiet)}.block-row-label-cell{display:flex;align-items:stretch;flex:none;overflow:hidden}.block-row-label{font:inherit;color:var(--text-dim);background:transparent;border:0;text-align:left;padding:0 10px;cursor:pointer;flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.block-row-add{font:inherit;font-size:11px;color:var(--text-faint);background:transparent;border:0;padding:0 8px;cursor:pointer;flex:none;white-space:nowrap;opacity:0;transition:opacity .12s ease,color .12s ease}.block-row:hover .block-row-add,.block-row-add:focus-visible{opacity:1}.block-row-add:hover,.block-row-label:hover,.block-row.is-selected .block-row-label{color:var(--text)}.block-row-lane{position:relative;flex:1}.block-bar{position:absolute;top:4px;bottom:4px;display:flex;align-items:center;padding:0 8px;border-radius:6px;background:color-mix(in srgb,var(--block-during) 14%,transparent);border:1px solid color-mix(in srgb,var(--block-during) 60%,transparent);color:color-mix(in srgb,var(--block-during) 40%,#ffffff);cursor:grab;overflow:visible;white-space:nowrap;transition:background .12s ease}.block-bar:hover{background:color-mix(in srgb,var(--block-during) 24%,transparent)}.block-bar.slot-in{background:color-mix(in srgb,var(--block-in) 14%,transparent);border-color:color-mix(in srgb,var(--block-in) 60%,transparent);color:color-mix(in srgb,var(--block-in) 40%,#ffffff)}.block-bar.slot-in:hover{background:color-mix(in srgb,var(--block-in) 24%,transparent)}.block-bar.slot-out{background:color-mix(in srgb,var(--block-out) 14%,transparent);border-color:color-mix(in srgb,var(--block-out) 60%,transparent);color:color-mix(in srgb,var(--block-out) 40%,#ffffff)}.block-bar.slot-out:hover{background:color-mix(in srgb,var(--block-out) 24%,transparent)}.block-bar.is-selected{outline:1px solid #fff;outline-offset:1px;color:#fff}.block-bar.is-clipped{opacity:.5;border-style:dashed}.block-dead{position:absolute;top:0;bottom:0;pointer-events:none;background:repeating-linear-gradient(-45deg,color-mix(in srgb,var(--text) 16%,transparent) 0 3px,transparent 3px 6px)}.block-label{overflow:hidden;text-overflow:ellipsis;pointer-events:none;font-weight:500}.block-handle{position:absolute;top:0;bottom:0;width:7px;cursor:col-resize}.block-handle-in{left:-1px}.block-handle-out{right:-1px}.block-spring-tail{position:absolute;right:-18px;top:50%;width:18px;border-top:1px dashed currentColor;opacity:.6}.channel-row{display:flex;align-items:stretch;height:20px;border-bottom:1px solid var(--border-soft)}.channel-label-cell{display:flex;align-items:center;gap:6px;flex:none;overflow:hidden}.channel-name{color:var(--text-faint);font-size:10px;white-space:nowrap}.channel-value{margin-left:auto;padding-right:8px;color:var(--text-dim);font-size:10px;font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.channel-lane{position:relative;flex:1}.channel-span{position:absolute;top:0;bottom:0;--slot: var(--block-during);cursor:grab}.channel-span.slot-in{--slot: var(--block-in)}.channel-span.slot-out{--slot: var(--block-out)}.channel-connector{position:absolute;left:0;right:0;top:50%;border-top:1px solid color-mix(in srgb,var(--slot) 55%,transparent);pointer-events:none}.channel-span:hover .channel-connector{border-top-color:var(--slot)}.channel-key{position:absolute;top:50%;width:9px;height:9px;transform:translate(-50%,-50%) rotate(45deg);background:var(--slot);border:1px solid color-mix(in srgb,var(--slot) 55%,#000);border-radius:1px;cursor:col-resize}.channel-key:hover{background:color-mix(in srgb,var(--slot) 70%,#fff)}.channel-key-in{left:0}.channel-key-out{left:100%}.channel-span.is-selected .channel-key{background:#fff;border-color:#fff}.channel-span.is-selected .channel-connector{border-top-color:var(--slot)}.channel-span.is-clipped .channel-key{opacity:.55}.channel-dead{position:absolute;top:50%;border-top:1px dashed color-mix(in srgb,var(--text) 45%,transparent);pointer-events:none}.channel-spring-tail{position:absolute;left:100%;top:50%;width:14px;border-top:1px dashed color-mix(in srgb,var(--slot) 70%,transparent);pointer-events:none}.channel-empty-hint{display:flex;align-items:center;padding-left:10px;color:var(--text-faint);font-size:10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.audio-lane{display:flex;align-items:stretch;position:relative;height:38px;border-top:1px solid var(--border);background:color-mix(in srgb,var(--audio-clip) 4%,transparent)}.audio-lane.is-over{background:color-mix(in srgb,var(--audio-clip) 14%,transparent);outline:1px dashed var(--audio-clip);outline-offset:-1px}.audio-label-cell{display:flex;align-items:center;gap:6px;flex:none;padding-left:8px;overflow:hidden}.audio-lane-name{color:var(--text-dim);flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.audio-add{font:inherit;color:var(--text-dim);background:var(--control);border:0;border-radius:5px;padding:1px 7px;margin-right:6px;cursor:pointer;flex:none}.audio-add:hover:not(:disabled){color:var(--text);background:var(--control-hover)}.audio-track{position:relative;flex:1}.audio-empty{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-faint);pointer-events:none;white-space:nowrap}.audio-clip{position:absolute;top:5px;bottom:5px;border-radius:6px;background:color-mix(in srgb,var(--audio-clip) 16%,transparent);border:1px solid color-mix(in srgb,var(--audio-clip) 65%,transparent);color:color-mix(in srgb,var(--audio-clip) 35%,#ffffff);cursor:grab;overflow:hidden}.audio-clip:hover{background:color-mix(in srgb,var(--audio-clip) 26%,transparent)}.audio-clip.is-muted{opacity:.45;border-style:dashed}.audio-wave,.audio-fade-curve{position:absolute;inset:0;width:100%;height:100%;pointer-events:none}.audio-fade-curve polyline{stroke:var(--audio-line);stroke-width:1;vector-effect:non-scaling-stroke}.audio-clip-name{position:absolute;left:8px;top:1px;pointer-events:none;font-weight:500;max-width:calc(100% - 46px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-gain-band{position:absolute;left:0;right:0;height:9px;margin-bottom:-4px;cursor:ns-resize}.audio-gain-band:after{content:"";position:absolute;left:0;right:0;top:4px;height:1px;background:var(--audio-line);opacity:.8}.audio-handle{position:absolute;top:0;bottom:0;width:7px;cursor:col-resize}.audio-handle-in{left:-1px}.audio-handle-out{right:-1px}.audio-fade{position:absolute;top:-1px;width:11px;height:11px;margin-left:-5px;border-radius:50%;cursor:ew-resize;background:color-mix(in srgb,var(--audio-line) 70%,transparent)}.audio-clip-buttons{position:absolute;right:2px;top:1px;display:flex;gap:2px}.audio-clip-btn{font:inherit;font-size:10px;line-height:1;color:var(--text-dim);background:transparent;border:0;padding:2px 3px;border-radius:4px;cursor:pointer}.audio-clip-btn:hover{color:var(--text);background:var(--control)}.audio-error{position:absolute;left:8px;bottom:2px;margin:0;color:var(--danger-text);pointer-events:none}.marker-lane{display:flex;align-items:stretch;position:relative;height:20px;border-top:1px solid var(--border);background:color-mix(in srgb,var(--marker) 10%,transparent)}.marker-label-cell{display:flex;align-items:center;gap:6px;flex:none;padding-left:8px;overflow:hidden}.marker-lane-name{color:var(--text-dim);flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.marker-add{font:inherit;line-height:1;color:var(--text-dim);background:var(--control);border:0;border-radius:5px;padding:1px 7px;margin-right:6px;cursor:pointer;flex:none}.marker-add:hover{color:var(--text);background:var(--control-hover)}.marker-track{position:relative;flex:1}.marker-empty{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-faint);pointer-events:none;white-space:nowrap}.marker-pin{position:absolute;top:0;bottom:0;width:0;display:flex;align-items:center;cursor:grab}.marker-diamond{width:8px;height:8px;margin-left:-4px;background:var(--marker-pin);border:1px solid color-mix(in srgb,var(--marker) 70%,#000000);transform:rotate(45deg);flex:none}.marker-pin.is-selected .marker-diamond{background:var(--marker);border-color:var(--marker-pin);box-shadow:0 0 0 2px color-mix(in srgb,var(--marker) 45%,transparent)}.marker-pin.is-at-playhead .marker-diamond{border-color:var(--playhead)}.marker-pin-label{display:none;position:absolute;left:8px;white-space:nowrap;padding:0 4px;border-radius:3px;color:var(--text);background:var(--panel);border:1px solid var(--border);pointer-events:none;z-index:1}.marker-pin:hover .marker-pin-label,.marker-pin.is-selected .marker-pin-label{display:block}.inspector,.shell>.agent-panel{position:fixed;top:72px;right:12px;bottom:12px;width:var(--inspector-w);z-index:10}.inspector{overflow:auto;padding:12px}.shell>.agent-panel{position:fixed;height:auto;overflow:hidden;padding:0}.shell>.agent-panel>.agent-title{padding:10px 12px;border-bottom:1px solid var(--border-soft);flex:none;flex-wrap:wrap;row-gap:6px}.shell>.agent-panel .agent-models{flex:1 1 100%;order:1}.shell>.agent-panel .agent-title-label{font-weight:600}.shell>.agent-panel .agent-composer{padding:10px 12px;border-top:1px solid var(--border-soft);flex:none}.inspector>.segmented{margin-bottom:4px}.inspector-empty{margin:16px 4px;color:var(--text-faint);line-height:1.6}.section-action{font:inherit;font-size:14px;line-height:1;color:var(--text-dim);background:transparent;border:0;cursor:pointer;padding:4px 6px;border-radius:6px}.section-action:hover{color:var(--text);background:var(--control)}.align-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:3px;margin:2px 0 8px}.align-button{display:inline-flex;align-items:center;justify-content:center;height:28px;padding:0;color:var(--text-dim);background:var(--control);border:1px solid transparent;border-radius:7px;cursor:pointer;transition:background .12s ease,color .12s ease}.align-button:hover:not(:disabled){background:var(--control-hover);color:var(--text)}.align-button:disabled{opacity:.3;cursor:default}.align-button:focus-visible{outline:none;border-color:var(--accent);box-shadow:var(--focus-ring)}.align-icon-rule{fill:currentColor}.align-icon-box{fill:currentColor;opacity:.45}.effect-row+.effect-row{margin-top:1px}.effect-params{display:flex;gap:6px;padding:2px 0 10px 10px;border-left:1px solid var(--border-soft);margin-left:2px}.effect-params>*{flex:1 1 0;min-width:0}.insp-dim{color:var(--text-faint)}.resolved-list{margin:0;padding:2px 0 6px;display:flex;flex-direction:column;gap:1px}.resolved-row{display:grid;grid-template-columns:58px 1fr auto;align-items:baseline;gap:8px;padding:2px}.resolved-label{font-size:11px;color:var(--text-faint)}.resolved-value{margin:0;font-size:11px;color:var(--text);font-variant-numeric:tabular-nums;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.resolved-by{margin:0;font-size:10px;color:var(--accent);white-space:nowrap}.resolved-row[data-live=true] .resolved-label{color:var(--text-dim)}.animate-palette{display:flex;flex-wrap:wrap;gap:5px;padding:4px 0 8px}.animate-preset{font:inherit;font-size:11px;font-weight:500;color:var(--text-dim);padding:5px 10px;border-radius:999px;cursor:pointer;background:var(--control);border:1px solid transparent;transition:background .12s ease,color .12s ease}.animate-preset:hover{background:var(--control-hover);color:var(--text)}.animate-preset[aria-pressed=true]{background:var(--accent);border-color:transparent;color:#fff}.animate-blocks{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px}.animate-blocks li{display:flex;align-items:center;gap:2px}.animate-block-row{flex:1;min-width:0;display:flex;justify-content:space-between;align-items:center;gap:8px;font:inherit;font-size:11px;color:var(--text);text-align:left;padding:6px 8px;border-radius:7px;cursor:pointer;background:var(--control);border:1px solid transparent}.animate-block-row:hover{background:var(--control-hover)}.animate-block-row[aria-pressed=true]{background:var(--accent-soft);border-color:var(--accent)}.animate-block-name{font-weight:500;overflow:hidden;text-overflow:ellipsis}.animate-block-owner{font-style:normal;color:var(--text-faint)}.animate-block-span{color:var(--text-dim);font-variant-numeric:tabular-nums;flex:none}.animate-block-remove{font:inherit;font-size:12px;color:var(--text-faint);background:transparent;border:0;cursor:pointer;padding:4px 6px;border-radius:6px;flex:none}.animate-block-remove:hover{color:var(--danger-text);background:var(--control)}.insp-pad{display:block;margin:6px 0}.insp-pad-box{fill:none;stroke:var(--border)}.insp-pad-curve{fill:none;stroke:var(--accent);stroke-width:1.5}.insp-pad-arm{stroke:var(--border);stroke-width:1}.insp-pad-handle{fill:var(--accent);cursor:grab}.insp-preview{display:block;margin:4px 0}.insp-preview polyline{fill:none;stroke:var(--accent);stroke-width:1.5}.insp-preview polyline.is-spring{stroke:var(--accent-warm)}.insp-preview polyline.is-tail{stroke:var(--accent-warm);stroke-dasharray:3 3;opacity:.55}.animate-preview-edge{stroke:var(--border);stroke-width:1;stroke-dasharray:2 2}.animate-preview-note{display:block;font-size:10px;color:var(--text-faint);line-height:1.5}.component-row{display:flex;align-items:center;gap:4px;min-height:24px;padding-left:8px;border-radius:4px}.component-row.is-current{background:var(--control)}.component-count{margin-left:auto;color:var(--text-faint);font-variant-numeric:tabular-nums}.link-button{padding:0;border:0;background:transparent;color:var(--accent);cursor:pointer;text-align:left}.link-button:hover{text-decoration:underline}.isolation-crumbs{display:flex;flex-wrap:wrap;align-items:center;gap:2px;padding:2px 8px 6px;font-size:10px}.isolation-crumbs .crumb{padding:2px 4px;border:0;border-radius:4px;background:transparent;color:var(--text-dim);cursor:pointer}.isolation-crumbs .crumb+.crumb:before{content:"›";margin-right:4px;color:var(--text-faint)}.isolation-crumbs .crumb:hover{color:var(--text)}.isolation-crumbs .crumb.is-current{color:var(--text);cursor:default}.layer-row.is-drop-before{box-shadow:inset 0 2px 0 var(--accent)}.layer-row.is-drop-after{box-shadow:inset 0 -2px 0 var(--accent)}.layer-row.is-drop-into{box-shadow:inset 0 0 0 2px var(--accent)}.inspector-note{margin:0 0 2px;font-size:10px;color:var(--text-faint);line-height:1.5}.header-export.is-running{font-variant-numeric:tabular-nums}.dialog.shot-export-dialog{width:420px}.dialog.material-picker{width:520px;max-height:70vh}.material-search{width:100%;padding:6px 8px;background:var(--surface-sunken, #131316);border:1px solid var(--border-strong, #35353d);border-radius:var(--radius-md, 6px);color:var(--text-primary, #e7e7ea);font:inherit}.material-shelf{display:flex;flex-direction:column;gap:8px;margin-bottom:14px}.material-shelf h3{margin:0;font-size:var(--text-xs, 11px);font-weight:var(--weight-semibold, 600);letter-spacing:.06em;text-transform:uppercase;color:var(--text-secondary, #9a9aa5)}.material-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:8px}.material-card{position:relative;display:flex;flex-direction:column;gap:4px;padding:0;background:none;border:1px solid transparent;border-radius:var(--radius-md, 6px);cursor:pointer;text-align:left}.material-card:hover,.material-card:focus-visible{border-color:var(--accent, #3b82f6)}.material-thumb{display:block;width:100%;aspect-ratio:16 / 9;object-fit:cover;border-radius:var(--radius-sm, 4px);background:var(--surface-sunken, #131316)}.material-name{padding:0 2px 2px;font-size:var(--text-xs, 11px);color:var(--text-primary, #e7e7ea);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mesh-material-row{display:flex;align-items:center;gap:4px;min-width:0}.mesh-material-name{flex:1 1 auto;min-width:0;padding:4px 8px;background:var(--surface-sunken, #131316);border:1px solid var(--border-strong, #35353d);border-radius:var(--radius-md, 6px);color:var(--text-primary, #e7e7ea);font:inherit;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.mesh-material-clear{flex:0 0 auto;width:22px;padding:0;background:none;border:none;color:var(--text-secondary, #9a9aa5);cursor:pointer}.layer-tris{flex:0 0 auto;padding:0 4px;font-size:10px;font-variant-numeric:tabular-nums;color:var(--text-tertiary, #6b6b76)}.layer-tris.is-over-budget{color:var(--warn, #eab308)}.material-badge{position:absolute;top:4px;right:4px;padding:1px 5px;border-radius:999px;background:var(--warn, #eab308);color:#1c1c20;font-size:10px;font-weight:var(--weight-semibold, 600)}.export-dialog{display:flex;flex-direction:column;gap:10px;min-width:0}.export-row{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:30px}.export-row>span{color:var(--text-dim)}.export-note{margin:-2px 0 0;color:var(--text-faint);line-height:1.45}.export-estimate{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:6px 16px;margin:2px 0 0;padding:12px;border-radius:8px;background:var(--control)}.export-estimate dt{color:var(--text-faint)}.export-estimate dd{margin:0;min-width:0;text-align:right;font-variant-numeric:tabular-nums;overflow-wrap:anywhere}.export-progress{margin:0;color:var(--text-dim)}.export-progress.is-done{color:var(--text)}.export-progress code{word-break:break-all;color:var(--text-dim)}.export-error{margin:0;color:var(--danger-text)}.left-rail::-webkit-scrollbar,.inspector::-webkit-scrollbar,.agent-panel::-webkit-scrollbar,.dock-scroll::-webkit-scrollbar{width:10px;height:10px}.left-rail::-webkit-scrollbar-thumb,.inspector::-webkit-scrollbar-thumb,.agent-panel::-webkit-scrollbar-thumb,.dock-scroll::-webkit-scrollbar-thumb{background:#2a2a30;border:3px solid transparent;background-clip:content-box;border-radius:999px}.left-rail::-webkit-scrollbar-thumb:hover,.inspector::-webkit-scrollbar-thumb:hover,.agent-panel::-webkit-scrollbar-thumb:hover,.dock-scroll::-webkit-scrollbar-thumb:hover{background:#3a3a42;background-clip:content-box}.left-rail::-webkit-scrollbar-track,.inspector::-webkit-scrollbar-track,.agent-panel::-webkit-scrollbar-track,.dock-scroll::-webkit-scrollbar-track{background:transparent}
|