@dailies-studio/shot-editor 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.vite/manifest.json +382 -0
- package/dist/assets/AgentPanel-CQejLbiX.js +2 -0
- package/dist/assets/AgentPanel-DJEphah0.css +1 -0
- package/dist/assets/AgentQuestionDialog-BqkD0kXF.js +1 -0
- package/dist/assets/CodeStudio-Dv4ihHpz.js +23 -0
- package/dist/assets/CommentsPanel-B4yhhT1T.js +1 -0
- package/dist/assets/ComponentLibraryRail-Ch_dsAru.js +1 -0
- package/dist/assets/ComponentStage-BRhRotyH.js +1 -0
- package/dist/assets/CurvePane-BjFVabKX.css +1 -0
- package/dist/assets/CurvePane-R22WzllJ.js +1 -0
- package/dist/assets/ExportDialog-CWLQWTmG.js +2 -0
- package/dist/assets/FontPicker-DWKaYL7F.js +1 -0
- package/dist/assets/FontPicker-v0IOIArM.css +1 -0
- package/dist/assets/GenerateDrawer-Bh3SqDKt.js +2 -0
- package/dist/assets/InsertDrawer-Ce1fod1L.js +1 -0
- package/dist/assets/LibraryBrowser-D9sEGz5w.js +2 -0
- package/dist/assets/MakeItYoursSection-CMO4319_.js +2 -0
- package/dist/assets/MaterialGraphCanvas-BFzl4wWR.js +23 -0
- package/dist/assets/MaterialGraphCanvas-BIUD59ik.css +1 -0
- package/dist/assets/MaterialWorkspace-CqTWqaRA.js +14 -0
- package/dist/assets/PreferencesDialog-CBf9_OoD.js +1 -0
- package/dist/assets/PresetsSection-CUEaoCVU.js +1 -0
- package/dist/assets/SoundHistory-BeS8EW1h.js +1 -0
- package/dist/assets/SoundMode-BmcZru3i.js +3 -0
- package/dist/assets/StockSounds-DdAUGRYK.js +1 -0
- package/dist/assets/TemplateFieldSection-CaeXpLFo.js +1 -0
- package/dist/assets/VersionHistoryPanel-CxG6XhNP.js +1 -0
- package/dist/assets/board-B88EPuLO.css +1 -0
- package/dist/assets/board-CL-he7SL.js +3 -0
- package/dist/assets/components-0oOSPN0l.js +1 -0
- package/dist/assets/googleFontRanges-gp32wJMo.js +1 -0
- package/dist/assets/googleFonts-BNon6M7X.js +1 -0
- package/dist/assets/iconsAndAliases-DL7gXP5j.js +1863 -0
- package/dist/assets/index-4F5NQmI8.css +1 -0
- package/dist/assets/index-BGHQGV5z.js +117 -0
- package/dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/dist/assets/libraryModel-CpIwfFha.js +1 -0
- package/dist/assets/lucide-6iK64tTB.js +9319 -0
- package/dist/assets/motionStamp-CH-Hew4E.js +1 -0
- package/dist/assets/takeMeasure-Tdg0TxEi.js +1 -0
- package/dist/assets/webmcp-BsB9gxWC.js +2 -0
- package/dist/index.html +34 -3
- package/package.json +12 -9
- package/src/addFamilies.ts +66 -0
- package/src/api.ts +1631 -55
- package/src/app/App.tsx +977 -198
- package/src/app/lazyPanel.tsx +137 -0
- package/src/app/lazySurfaces.tsx +203 -0
- package/src/audio/index.tsx +41 -10
- package/src/audio/meter.ts +485 -0
- package/src/audio/meterMath.ts +273 -0
- package/src/audio/meterStore.ts +155 -0
- package/src/audio/offlineMix.ts +289 -0
- package/src/audio/preview.ts +928 -118
- package/src/bridge.ts +15 -5
- package/src/bridgeTypes.ts +1611 -36
- package/src/channels.ts +17 -32
- package/src/fonts/googleFonts.ts +4 -0
- package/src/hostApi.ts +174 -0
- package/src/icons.tsx +770 -0
- package/src/layerWords.ts +61 -0
- package/src/main.tsx +56 -4
- package/src/panels/ResizeHandle.tsx +33 -43
- package/src/panels/agent/AgentDots.tsx +36 -0
- package/src/panels/agent/AgentPanel.tsx +119 -43
- package/src/panels/agent/AgentQuestionDialog.tsx +202 -0
- package/src/panels/agent/agent.css +113 -97
- package/src/panels/agent/agentGate.ts +35 -0
- package/src/panels/code/CodeDefaultsPanel.tsx +345 -0
- package/src/panels/code/CodeStudio.tsx +373 -0
- package/src/panels/code/FileTree.tsx +265 -0
- package/src/panels/code/codeBufferGuard.ts +52 -0
- package/src/panels/code/codeParts.tsx +321 -0
- package/src/panels/comments/CommentComposer.tsx +239 -0
- package/src/panels/comments/CommentThread.tsx +346 -0
- package/src/panels/comments/CommentsPanel.tsx +336 -0
- package/src/panels/comments/InboxButton.tsx +131 -0
- package/src/panels/comments/MentionMenu.tsx +98 -0
- package/src/panels/comments/parts.tsx +171 -0
- package/src/panels/export/ExportDialog.tsx +919 -96
- package/src/panels/export/ExportScrim.tsx +57 -0
- package/src/panels/files/AssetsTab.tsx +656 -0
- package/src/panels/files/FilePanel.tsx +1466 -216
- package/src/panels/files/LayerMarks.tsx +40 -0
- package/src/panels/files/LeftColumn.tsx +37 -0
- package/src/panels/files/McpSection.tsx +690 -47
- package/src/panels/files/MissingAssetsNotice.tsx +60 -0
- package/src/panels/files/assetDrag.ts +79 -0
- package/src/panels/files/resourceParts.tsx +255 -0
- package/src/panels/fonts/FontPicker.tsx +762 -0
- package/src/panels/fonts/faceCache.ts +207 -0
- package/src/panels/fonts/fontPicker.css +271 -0
- package/src/panels/fonts/pickerModel.ts +265 -0
- package/src/panels/fonts/pickerRequest.ts +46 -0
- package/src/panels/header/AccountAvatar.tsx +76 -0
- package/src/panels/header/AgentChip.tsx +77 -0
- package/src/panels/header/AppMenu.tsx +213 -0
- package/src/panels/header/Header.tsx +564 -84
- package/src/panels/header/HistoryControls.tsx +31 -5
- package/src/panels/header/PresenceStack.tsx +329 -0
- package/src/panels/header/ProjectTitle.tsx +232 -0
- package/src/panels/header/ShareButton.tsx +59 -0
- package/src/panels/header/StatusBadges.tsx +358 -27
- package/src/panels/header/SyncDeletedDialog.tsx +88 -0
- package/src/panels/header/ZoomControls.tsx +46 -15
- package/src/panels/header/agentHandoff.ts +52 -0
- package/src/panels/header/leave.ts +26 -0
- package/src/panels/help/HelpSection.tsx +189 -163
- package/src/panels/insert/InsertDrawer.tsx +723 -0
- package/src/panels/insert/iconSet.ts +109 -0
- package/src/panels/inspector/ExposeDot.tsx +117 -0
- package/src/panels/inspector/FramingRows.tsx +314 -44
- package/src/panels/inspector/InspectorFooter.tsx +91 -0
- package/src/panels/inspector/InspectorHead.tsx +425 -0
- package/src/panels/inspector/InspectorPanel.tsx +408 -124
- package/src/panels/inspector/KeyframeDot.tsx +373 -0
- package/src/panels/inspector/KeyframeSection.tsx +257 -0
- package/src/panels/inspector/MarkerSection.tsx +55 -11
- package/src/panels/inspector/ParamRow.tsx +84 -53
- package/src/panels/inspector/RightColumn.tsx +152 -0
- package/src/panels/inspector/TimeSection.tsx +866 -0
- package/src/panels/inspector/animate/EaseControl.tsx +244 -0
- package/src/panels/inspector/animate/PresetsSection.tsx +135 -0
- package/src/panels/inspector/animate/ShotSection.tsx +562 -48
- package/src/panels/inspector/design/AlignRow.tsx +95 -31
- package/src/panels/inspector/design/AppearanceSection.tsx +118 -9
- package/src/panels/inspector/design/ClonerSection.tsx +323 -62
- package/src/panels/inspector/design/ComponentSection.tsx +50 -43
- package/src/panels/inspector/design/CornerSection.tsx +45 -14
- package/src/panels/inspector/design/DefinitionProps.tsx +315 -0
- package/src/panels/inspector/design/DefinitionSection.tsx +136 -0
- package/src/panels/inspector/design/DeviceSection.tsx +210 -0
- package/src/panels/inspector/design/FillSection.tsx +83 -51
- package/src/panels/inspector/design/FontField.tsx +196 -0
- package/src/panels/inspector/design/HtmlSection.tsx +23 -12
- package/src/panels/inspector/design/InstanceSection.tsx +373 -154
- package/src/panels/inspector/design/MaskSection.tsx +84 -0
- package/src/panels/inspector/design/MaterialSection.tsx +177 -0
- package/src/panels/inspector/design/MediaSection.tsx +273 -120
- package/src/panels/inspector/design/MeshSection.tsx +910 -82
- package/src/panels/inspector/design/PaintRows.tsx +550 -0
- package/src/panels/inspector/design/PlateStyleSection.tsx +177 -0
- package/src/panels/inspector/design/ShadowSection.tsx +221 -48
- package/src/panels/inspector/design/SplineFollowSection.tsx +235 -0
- package/src/panels/inspector/design/StrokeSection.tsx +228 -43
- package/src/panels/inspector/design/TemplateFieldSection.tsx +57 -0
- package/src/panels/inspector/design/TransformSection.tsx +244 -50
- package/src/panels/inspector/design/TypographySection.tsx +679 -110
- package/src/panels/inspector/layout.ts +295 -0
- package/src/panels/inspector/propValue.ts +199 -0
- package/src/panels/inspector/scene/CameraSection.tsx +232 -22
- package/src/panels/inspector/scene/EffectsSection.tsx +722 -71
- package/src/panels/inspector/scene/MakeItYoursSection.tsx +180 -0
- package/src/panels/inspector/scene/SceneDocSection.tsx +191 -0
- package/src/panels/inspector/scene/SceneSection.tsx +219 -44
- package/src/panels/inspector/scene/TransitionSection.tsx +523 -72
- package/src/panels/inspector/storyboard/StoryboardReferenceSection.tsx +593 -0
- package/src/panels/inspector/storyboard/VideoStill.tsx +120 -0
- package/src/panels/inspector/timeModel.ts +190 -0
- package/src/panels/inspector/useDocWrite.ts +438 -146
- package/src/panels/library/LibraryBrowser.tsx +435 -0
- package/src/panels/library/LibraryGrid.tsx +190 -0
- package/src/panels/library/LibraryPreviewPanel.tsx +349 -0
- package/src/panels/library/LibraryRail.tsx +84 -0
- package/src/panels/library/LibrarySoundPanel.tsx +293 -0
- package/src/panels/library/SoundHistory.tsx +245 -0
- package/src/panels/library/StockSounds.tsx +390 -0
- package/src/panels/library/libraryModel.ts +147 -0
- package/src/panels/library/stockSearch.ts +77 -0
- package/src/panels/maskMarks.tsx +117 -0
- package/src/panels/material/MaterialCommentNode.tsx +54 -0
- package/src/panels/material/MaterialGraphCanvas.tsx +861 -0
- package/src/panels/material/MaterialGraphMenu.tsx +45 -0
- package/src/panels/material/MaterialGroupNode.tsx +56 -0
- package/src/panels/material/MaterialLibrary.tsx +253 -0
- package/src/panels/material/MaterialNode.tsx +453 -0
- package/src/panels/material/MaterialNodePalette.tsx +349 -0
- package/src/panels/material/MaterialParameterControls.tsx +525 -0
- package/src/panels/material/MaterialRerouteNode.tsx +42 -0
- package/src/panels/material/MaterialWorkspace.tsx +501 -0
- package/src/panels/material/NodePreview.tsx +70 -0
- package/src/panels/material/flowModel.ts +441 -0
- package/src/panels/material/parameterValues.ts +231 -0
- package/src/panels/material/previewScheduler.ts +235 -0
- package/src/panels/material/reactFlow.css +6 -0
- package/src/panels/material/socketGlyph.ts +85 -0
- package/src/panels/material/viewportMemory.ts +58 -0
- package/src/panels/preferences/PreferencesDialog.tsx +215 -0
- package/src/panels/share/ShareComponentDialog.tsx +247 -0
- package/src/panels/stage/StageMenu.tsx +35 -5
- package/src/panels/stage/StagePanel.tsx +338 -23
- package/src/panels/stage/cellSlots.tsx +70 -0
- package/src/panels/storyboard/BoardCanvas.tsx +739 -0
- package/src/panels/storyboard/BoardCursors.tsx +158 -0
- package/src/panels/storyboard/BoardDropDialog.tsx +161 -0
- package/src/panels/storyboard/BoardPlan.tsx +42 -0
- package/src/panels/storyboard/ComponentSheet.tsx +187 -0
- package/src/panels/storyboard/ComponentStage.tsx +235 -0
- package/src/panels/storyboard/MiniSketch.tsx +173 -0
- package/src/panels/storyboard/PartPicker.tsx +64 -0
- package/src/panels/storyboard/PlanPanel.tsx +617 -0
- package/src/panels/storyboard/ReferencePreview.tsx +217 -0
- package/src/panels/storyboard/ShotBrief.tsx +360 -0
- package/src/panels/storyboard/ShotCard.tsx +251 -0
- package/src/panels/storyboard/StagePreview.tsx +348 -0
- package/src/panels/storyboard/StillThumbs.tsx +162 -0
- package/src/panels/storyboard/StoryboardView.tsx +79 -0
- package/src/panels/storyboard/board.css +1065 -0
- package/src/panels/storyboard/board.ts +12 -0
- package/src/panels/storyboard/boardClipboard.ts +111 -0
- package/src/panels/storyboard/boardOrder.ts +68 -0
- package/src/panels/storyboard/boardRows.tsx +425 -0
- package/src/panels/storyboard/liveCap.ts +90 -0
- package/src/panels/storyboard/plan.css +295 -0
- package/src/panels/storyboard/posterCache.ts +133 -0
- package/src/panels/storyboard/shotboard/ComponentPicker.tsx +373 -0
- package/src/panels/storyboard/shotboard/ImagePicker.tsx +145 -0
- package/src/panels/storyboard/shotboard/ShotBoard.tsx +292 -0
- package/src/panels/storyboard/shotboard/SketchCanvas.tsx +443 -0
- package/src/panels/storyboard/shotboard/SketchInspector.tsx +471 -0
- package/src/panels/storyboard/shotboard/SketchItem.tsx +240 -0
- package/src/panels/storyboard/shotboard/SketchLayers.tsx +130 -0
- package/src/panels/storyboard/shotboard/SketchPlay.tsx +108 -0
- package/src/panels/storyboard/shotboard/SketchStrip.tsx +178 -0
- package/src/panels/storyboard/shotboard/SketchToolFooter.tsx +99 -0
- package/src/panels/storyboard/shotboard/sketch.css +1392 -0
- package/src/panels/storyboard/shotboard/sketchModel.ts +219 -0
- package/src/panels/storyboard/storyboardDrop.ts +164 -0
- package/src/panels/studio/ComponentLibraryRail.tsx +346 -0
- package/src/panels/studio/ComponentSidePanel.tsx +355 -0
- package/src/panels/studio/ComponentStudio.tsx +243 -0
- package/src/panels/studio/ComponentsHome.tsx +318 -0
- package/src/panels/studio/ComponentsPreview.tsx +179 -0
- package/src/panels/studio/EveryUse.tsx +244 -0
- package/src/panels/studio/ThisUsePanel.tsx +679 -0
- package/src/panels/studio/componentParts.tsx +341 -0
- package/src/panels/studio/components.ts +6 -0
- package/src/panels/studio/newCodeComponent.ts +66 -0
- package/src/panels/timeline/AudioFxButton.tsx +290 -0
- package/src/panels/timeline/AudioLane.tsx +674 -85
- package/src/panels/timeline/BlockRow.tsx +154 -85
- package/src/panels/timeline/ChannelRow.tsx +378 -129
- package/src/panels/timeline/CurvePane.tsx +508 -0
- package/src/panels/timeline/Filmstrip.tsx +361 -0
- package/src/panels/timeline/GenerateDrawer.tsx +407 -0
- package/src/panels/timeline/KeyStretch.tsx +115 -0
- package/src/panels/timeline/LifespanRow.tsx +730 -47
- package/src/panels/timeline/MarkerLane.tsx +46 -8
- package/src/panels/timeline/PlayButton.tsx +91 -0
- package/src/panels/timeline/PropertyPicker.tsx +254 -0
- package/src/panels/timeline/ShotRow.tsx +400 -0
- package/src/panels/timeline/SoundMode.tsx +1406 -0
- package/src/panels/timeline/TimelineDock.tsx +2338 -272
- package/src/panels/timeline/TransportVolume.tsx +163 -0
- package/src/panels/timeline/beatRuler.ts +74 -0
- package/src/panels/timeline/curveModel.ts +500 -0
- package/src/panels/timeline/duckUnderVoice.ts +68 -0
- package/src/panels/timeline/keyframeMenu.ts +138 -0
- package/src/panels/timeline/labelWidth.ts +49 -0
- package/src/panels/timeline/marquee.ts +155 -0
- package/src/panels/timeline/model.ts +1860 -199
- package/src/panels/timeline/snap.ts +125 -43
- package/src/panels/timeline/staggerPreview.tsx +92 -0
- package/src/panels/timeline/takeMeasure.ts +72 -0
- package/src/panels/timeline/useLive.ts +48 -0
- package/src/panels/timeline/viewport.ts +234 -0
- package/src/panels/toolbar/BackChip.tsx +116 -0
- package/src/panels/toolbar/CameraViewBar.tsx +118 -49
- package/src/panels/toolbar/CanvasBar.tsx +117 -0
- package/src/panels/toolbar/InsertButton.tsx +38 -0
- package/src/panels/toolbar/IsolationTrail.tsx +156 -0
- package/src/panels/toolbar/PanelToggles.tsx +86 -0
- package/src/panels/toolbar/ShadingBar.tsx +119 -26
- package/src/panels/toolbar/ToolDockBar.tsx +329 -80
- package/src/panels/toolbar/ToolFooter.tsx +102 -0
- package/src/panels/toolbar/ViewModeBar.tsx +247 -38
- package/src/panels/toolbar/WorkPlaneBar.tsx +94 -0
- package/src/panels/toolbar/useAddRows.tsx +326 -0
- package/src/panels/toolbar/useDismiss.ts +122 -0
- package/src/panels/versions/VersionHistoryPanel.tsx +274 -0
- package/src/panels/versions/versionModel.ts +103 -0
- package/src/panels/virtualWindow.ts +271 -0
- package/src/shotTokens.css +151 -60
- package/src/stage/FrustumGizmo.tsx +504 -84
- package/src/stage/GridPlane.tsx +225 -16
- package/src/stage/NodePreviews.tsx +628 -0
- package/src/stage/PerfHud.tsx +437 -47
- package/src/stage/SplitRenderer.tsx +816 -169
- package/src/stage/StageApp.tsx +4274 -486
- package/src/stage/StageRootBoundary.tsx +114 -0
- package/src/stage/StageTools.tsx +651 -151
- package/src/stage/TransformGizmo.tsx +696 -0
- package/src/stage/adaptivePresentation.ts +145 -0
- package/src/stage/bridgeClient.ts +2522 -41
- package/src/stage/exportWorker.ts +9 -0
- package/src/stage/feed.ts +305 -14
- package/src/stage/fontPreview.ts +176 -0
- package/src/stage/frustumGeometry.ts +319 -1
- package/src/stage/furnitureTokens.ts +33 -0
- package/src/stage/gizmoMath.ts +508 -16
- package/src/stage/gpuTimer.ts +276 -0
- package/src/stage/instanceModules.ts +194 -33
- package/src/stage/interactions/move.ts +24 -5
- package/src/stage/isolation.ts +291 -33
- package/src/stage/jsSelfProfiler.ts +325 -0
- package/src/stage/main.tsx +116 -16
- package/src/stage/modalState.ts +222 -23
- package/src/stage/moduleEpoch.ts +60 -0
- package/src/stage/motionPathStage.ts +279 -0
- package/src/stage/motionPreview.ts +74 -0
- package/src/stage/overlays/Overlays.tsx +1112 -159
- package/src/stage/overlays/Rulers.tsx +495 -0
- package/src/stage/panes.ts +159 -10
- package/src/stage/project.ts +68 -3
- package/src/stage/renderScaleController.ts +730 -0
- package/src/stage/rulers.ts +129 -0
- package/src/stage/sceneExtent.ts +75 -0
- package/src/stage/shading.ts +20 -0
- package/src/stage/splineStage.ts +632 -0
- package/src/stage/stagePerformanceTelemetry.ts +717 -0
- package/src/stage/stageTheme.ts +36 -0
- package/src/stage/stageWarmup.ts +11 -0
- package/src/stage/textAutoSize.ts +124 -0
- package/src/stage/tier1Export.ts +641 -0
- package/src/stage/tokenColor.ts +14 -9
- package/src/stage/view.ts +56 -9
- package/src/stage/workingView.ts +277 -33
- package/src/state/accountPrefs.ts +261 -0
- package/src/state/agentActions.ts +173 -15
- package/src/state/agentActivity.ts +198 -0
- package/src/state/agentQuestion.ts +239 -0
- package/src/state/bootOpen.ts +42 -0
- package/src/state/cameraVerbs.ts +139 -0
- package/src/state/clientId.ts +6 -1
- package/src/state/comments.ts +1099 -0
- package/src/state/context.tsx +19 -1
- package/src/state/editorPrefs.ts +220 -0
- package/src/state/errorReports.ts +121 -0
- package/src/state/fieldWrite.ts +161 -0
- package/src/state/fontRecents.ts +70 -0
- package/src/state/fonts.ts +656 -0
- package/src/state/graphClipboard.ts +414 -0
- package/src/state/imageThumbs.ts +216 -0
- package/src/state/insert.ts +444 -67
- package/src/state/isolationTrail.ts +92 -0
- package/src/state/keyMoves.ts +134 -0
- package/src/state/keyframeClipboard.ts +177 -0
- package/src/state/keymap.ts +1153 -117
- package/src/state/layoutPrefs.ts +272 -0
- package/src/state/layouts.ts +205 -0
- package/src/state/measureMedia.ts +167 -0
- package/src/state/menu.ts +2341 -28
- package/src/state/motionStamp.ts +7 -0
- package/src/state/panelSize.ts +375 -5
- package/src/state/pendingChanges.ts +119 -0
- package/src/state/playHold.ts +78 -0
- package/src/state/playbackPreparation.ts +562 -0
- package/src/state/posterCapture.ts +242 -0
- package/src/state/presence.ts +254 -0
- package/src/state/projectComponents.ts +160 -0
- package/src/state/renderEvents.ts +298 -18
- package/src/state/runtimeErrors.ts +46 -0
- package/src/state/selection.ts +12 -0
- package/src/state/shortcuts.ts +1606 -0
- package/src/state/sketchGuide.ts +51 -0
- package/src/state/splineRefs.ts +87 -0
- package/src/state/stageHealth.ts +259 -0
- package/src/state/stageWatchdog.ts +47 -0
- package/src/state/stillStage.ts +330 -0
- package/src/state/stillThumbs.ts +474 -0
- package/src/state/store.ts +23591 -2982
- package/src/state/storyboardModel.ts +528 -0
- package/src/state/sync.ts +1257 -0
- package/src/state/syncCache.ts +159 -0
- package/src/state/triangles.ts +13 -0
- package/src/state/types.ts +1698 -55
- package/src/state/unsavedGuard.ts +49 -0
- package/src/state/viewMode.ts +200 -0
- package/src/state/webmcp.ts +1128 -0
- package/src/state/workspace.ts +1147 -0
- package/src/styles/assets-tab.css +304 -0
- package/src/styles/canvas.css +545 -0
- package/src/styles/comments.css +1435 -0
- package/src/styles/controls.css +162 -0
- package/src/styles/dialogs.css +390 -0
- package/src/styles/insert-drawer.css +586 -0
- package/src/styles/inspector-board.css +207 -0
- package/src/styles/inspector-object.css +486 -0
- package/src/styles/inspector-shot.css +252 -0
- package/src/styles/inspector.css +360 -0
- package/src/styles/left-column.css +1628 -0
- package/src/styles/library-preview.css +575 -0
- package/src/styles/library.css +512 -0
- package/src/styles/modes/code.css +569 -0
- package/src/styles/modes/component.css +1561 -0
- package/src/styles/modes/material.css +1201 -0
- package/src/styles/modes/storyboard.css +518 -0
- package/src/styles/share-component.css +49 -0
- package/src/styles/shell.css +653 -0
- package/src/styles/shot-brief.css +360 -0
- package/src/styles/states.css +76 -0
- package/src/styles/sync.css +380 -0
- package/src/styles/timeline-graph.css +384 -0
- package/src/styles/timeline-meters.css +89 -0
- package/src/styles/timeline-rows.css +1959 -0
- package/src/styles/timeline-sound.css +1003 -0
- package/src/styles/timeline.css +754 -0
- package/src/styles/tool-footer.css +525 -0
- package/src/styles/topbar.css +886 -0
- package/src/styles/versions.css +262 -0
- package/src/styles.css +72 -2921
- package/src/tools.ts +108 -23
- package/dist/assets/index-B7notge7.css +0 -1
- package/dist/assets/index-BBE6Ta9L.js +0 -52
- package/src/panels/files/icons.tsx +0 -118
- package/src/panels/header/DocSwitcher.tsx +0 -85
- package/src/panels/header/TransportBar.tsx +0 -86
- package/src/panels/inspector/animate/BlockTiming.tsx +0 -341
- package/src/panels/inspector/animate/DuringBlocks.tsx +0 -85
- package/src/panels/inspector/animate/InOutPresets.tsx +0 -57
- package/src/panels/inspector/animate/ResolvedChannels.tsx +0 -150
- package/src/panels/inspector/animate/useBlocks.ts +0 -43
- package/src/panels/material/MaterialPicker.tsx +0 -172
- package/src/panels/timeline/SceneStrip.tsx +0 -145
- package/src/panels/toolbar/AddMenu.tsx +0 -230
- package/src/stage/MoveGizmo.tsx +0 -411
|
@@ -0,0 +1,1201 @@
|
|
|
1
|
+
/* The material nodes: the graph and the object's hole in the canvas cell, the Project's graphs in the left column, the way back and the graph's verbs in the canvas bar, then the node cards, the source view and the setup screen. */
|
|
2
|
+
|
|
3
|
+
/* ---- the material nodes -------------------------------------------------- */
|
|
4
|
+
/* A SHADER IS THE WORK, FOR AS LONG AS YOU ARE DOING IT, so the graph takes
|
|
5
|
+
* the canvas. It lives in the docked frame like every mode (cellSlots.tsx):
|
|
6
|
+
* the Project's graphs in the left column's mode slot, the graph and the
|
|
7
|
+
* object in the canvas cell, the way back and the graph's verbs in the canvas
|
|
8
|
+
* bar. The inspector shows the material's own rows and the timeline stays
|
|
9
|
+
* under the graph, so an exposed control can be keyed and scrubbed against.
|
|
10
|
+
* Nothing here hides a cell and nothing here floats.
|
|
11
|
+
*
|
|
12
|
+
* ── HOW THE OBJECT IS STILL THE REAL ONE ────────────────────────────────
|
|
13
|
+
*
|
|
14
|
+
* The preview is not a picture of the mesh, it IS the mesh: the stage iframe
|
|
15
|
+
* is pinned `inset: 0` behind the shell and keeps rendering the isolated
|
|
16
|
+
* layer, which is what makes "preview === export" hold here as everywhere
|
|
17
|
+
* else. So the right of the canvas cell is a HOLE (`.stage-window`,
|
|
18
|
+
* shell.css): it paints nothing and takes no pointer, and `measureInset` hands
|
|
19
|
+
* the stage its rect as the box to frame into. */
|
|
20
|
+
|
|
21
|
+
/* ---- the canvas cell ------------------------------------------------------- */
|
|
22
|
+
/* The cell's one row: the graph, then the hole. TRANSPARENT and pointer-less,
|
|
23
|
+
the canvas cell's own recipe, because its box spans the hole: hit testing
|
|
24
|
+
follows the box, so a press over the object would land here and the drag
|
|
25
|
+
that orbits it (StageApp's `orbits`) would never reach the stage. The graph
|
|
26
|
+
opts back in; the hole stays out.
|
|
27
|
+
|
|
28
|
+
THE HOLE'S WIDTH is the stored preview width (`--material-col-w`, which App
|
|
29
|
+
writes from `materialColumnWidth`), never more than half the cell. The hole
|
|
30
|
+
and the seam's handle read the one variable, and both resolve its 50%
|
|
31
|
+
against this box (the hole's containing block, and the handle's), so the
|
|
32
|
+
edge the author grabs and the edge they see cannot part. */
|
|
33
|
+
.material-workspace {
|
|
34
|
+
--material-preview-w: min(var(--material-col-w, 560px), 50%);
|
|
35
|
+
--material-grid-dot: var(--line);
|
|
36
|
+
position: relative;
|
|
37
|
+
flex: 1 1 auto;
|
|
38
|
+
display: flex;
|
|
39
|
+
min-width: 0;
|
|
40
|
+
min-height: 0;
|
|
41
|
+
pointer-events: none;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* The graph paints its own ground and takes the pointer. Its right border is
|
|
45
|
+
the seam, one hairline against the hole. */
|
|
46
|
+
.material-graph-region {
|
|
47
|
+
position: relative;
|
|
48
|
+
flex: 1 1 auto;
|
|
49
|
+
min-width: 0;
|
|
50
|
+
min-height: 0;
|
|
51
|
+
background: var(--surface-app);
|
|
52
|
+
border-right: 1px solid var(--line);
|
|
53
|
+
pointer-events: auto;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/* The compile error strip (`.code-studio-strip`, modes/code.css) over the top
|
|
57
|
+
of the graph, which fills the region absolutely. Above React Flow's own
|
|
58
|
+
panels, below the node palette. */
|
|
59
|
+
.material-graph-region > .code-studio-strip {
|
|
60
|
+
position: absolute;
|
|
61
|
+
inset: 0 0 auto;
|
|
62
|
+
z-index: 6;
|
|
63
|
+
overflow-wrap: anywhere;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/* THE HOLE. No background, no backdrop, nothing: anything opaque here,
|
|
67
|
+
including a "subtle" tint, is a lid on the only live thing on screen. The
|
|
68
|
+
material's own fields are inspector rows, so the hole is the whole right of
|
|
69
|
+
the cell: a shader editor shows the shader and the thing it is on. */
|
|
70
|
+
.material-preview-hole {
|
|
71
|
+
flex: none;
|
|
72
|
+
width: var(--material-preview-w);
|
|
73
|
+
min-width: 0;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/* THE SEAM'S HANDLE: 8px centred on the hole's left edge, which is the
|
|
77
|
+
graph's border, from the right like the hole. It paints only on hover and
|
|
78
|
+
is the one thing over the hole's edge that takes a pointer. A local order
|
|
79
|
+
inside the canvas cell: over the graph, under the node palette (8). */
|
|
80
|
+
.material-workspace-resize {
|
|
81
|
+
position: absolute;
|
|
82
|
+
top: 0;
|
|
83
|
+
bottom: 0;
|
|
84
|
+
right: var(--material-preview-w);
|
|
85
|
+
z-index: 3;
|
|
86
|
+
width: 8px;
|
|
87
|
+
margin-right: calc(-1 * var(--space-2));
|
|
88
|
+
cursor: col-resize;
|
|
89
|
+
touch-action: none;
|
|
90
|
+
pointer-events: auto;
|
|
91
|
+
background: transparent;
|
|
92
|
+
transition: background var(--dur-fast) var(--ease);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.material-workspace-resize:hover {
|
|
96
|
+
background: var(--accent-soft);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/* ---- the canvas bar ---------------------------------------------------------- */
|
|
100
|
+
/* The bar slot's whole row, laid out like the canvas bar: the way out, the
|
|
101
|
+
trail, the slot and the compile status lead, and the TSL toggle, the graph's
|
|
102
|
+
zoom and Recenter are pushed right. The trail is the part that gives; no
|
|
103
|
+
control shrinks. */
|
|
104
|
+
.material-bar {
|
|
105
|
+
flex: 1 1 auto;
|
|
106
|
+
display: flex;
|
|
107
|
+
align-items: center;
|
|
108
|
+
gap: var(--canvas-bar-gap);
|
|
109
|
+
min-width: 0;
|
|
110
|
+
height: 100%;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/* The back chip's look with only its chevron, so the inset is even on both
|
|
114
|
+
sides. Two classes, so it outranks `.back-chip` on specificity. */
|
|
115
|
+
.back-chip.material-back {
|
|
116
|
+
flex: none;
|
|
117
|
+
padding: 0 var(--space-2);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/* The trail: Project › Shot › Mesh › Material › functions. The last crumb is
|
|
121
|
+
where you are, the ones before it are one click away. One line that
|
|
122
|
+
ellipsizes each rung. */
|
|
123
|
+
.material-workspace-crumbs {
|
|
124
|
+
display: flex;
|
|
125
|
+
align-items: center;
|
|
126
|
+
gap: var(--space-1);
|
|
127
|
+
min-width: 0;
|
|
128
|
+
overflow: hidden;
|
|
129
|
+
white-space: nowrap;
|
|
130
|
+
font-size: var(--type-sm);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.material-bar > .material-workspace-crumbs {
|
|
134
|
+
flex: 0 1 auto;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.material-workspace-crumbs .crumb {
|
|
138
|
+
flex: 0 1 auto;
|
|
139
|
+
min-width: 0;
|
|
140
|
+
max-width: 180px;
|
|
141
|
+
padding: var(--space-1) var(--space-2);
|
|
142
|
+
border: 0;
|
|
143
|
+
border-radius: var(--radius-xs);
|
|
144
|
+
background: transparent;
|
|
145
|
+
color: var(--ink-2);
|
|
146
|
+
overflow: hidden;
|
|
147
|
+
text-overflow: ellipsis;
|
|
148
|
+
white-space: nowrap;
|
|
149
|
+
cursor: pointer;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.material-workspace-crumbs .crumb + .crumb::before {
|
|
153
|
+
content: "›";
|
|
154
|
+
margin-right: var(--space-2);
|
|
155
|
+
color: var(--ink-3);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.material-workspace-crumbs .crumb:hover {
|
|
159
|
+
color: var(--ink-1);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.material-workspace-crumbs .crumb.is-current {
|
|
163
|
+
color: var(--ink-1);
|
|
164
|
+
cursor: default;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.material-slot-picker {
|
|
168
|
+
flex: none;
|
|
169
|
+
min-width: 132px;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.material-compile-status,
|
|
173
|
+
.material-add-parameter {
|
|
174
|
+
display: flex;
|
|
175
|
+
align-items: center;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.material-compile-status {
|
|
179
|
+
flex: none;
|
|
180
|
+
gap: var(--space-2);
|
|
181
|
+
padding: 0 var(--space-2);
|
|
182
|
+
color: var(--ink-2);
|
|
183
|
+
font-size: var(--type-micro);
|
|
184
|
+
white-space: nowrap;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.material-compile-status > span {
|
|
188
|
+
width: 6px;
|
|
189
|
+
height: 6px;
|
|
190
|
+
border-radius: var(--radius-full);
|
|
191
|
+
background: var(--ink-3);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.material-compile-status.is-error {
|
|
195
|
+
color: var(--danger-ink);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
.material-compile-status.is-error > span {
|
|
199
|
+
background: var(--danger);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.material-compile-status.is-compiling > span {
|
|
203
|
+
background: var(--accent);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.material-bar-end {
|
|
207
|
+
flex: none;
|
|
208
|
+
display: flex;
|
|
209
|
+
align-items: center;
|
|
210
|
+
gap: var(--canvas-bar-gap);
|
|
211
|
+
margin-left: auto;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/* The graph canvas portals its zoom in here (MaterialGraphCanvas.tsx). The
|
|
215
|
+
slot is no box of its own, so while the graph is off screen (the TSL view,
|
|
216
|
+
the canvas still loading) it costs the bar no gap. */
|
|
217
|
+
.material-zoom-slot {
|
|
218
|
+
display: contents;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/* ---- the library, in the left column ---------------------------------------- */
|
|
222
|
+
/* The slot's one flexible row (left-column.css), bounded down to the list's
|
|
223
|
+
`.rail-scroll` so the list scrolls inside the column. */
|
|
224
|
+
.material-library {
|
|
225
|
+
flex: 1 1 0;
|
|
226
|
+
min-height: 0;
|
|
227
|
+
display: flex;
|
|
228
|
+
flex-direction: column;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/* THE COLUMN HEAD, one panel head tall with its hairline, so its bottom edge
|
|
232
|
+
runs on with the canvas bar's and the right column head's. */
|
|
233
|
+
.material-library-head {
|
|
234
|
+
flex: none;
|
|
235
|
+
display: flex;
|
|
236
|
+
align-items: center;
|
|
237
|
+
height: var(--panel-head-h);
|
|
238
|
+
padding: 0 var(--space-6);
|
|
239
|
+
border-bottom: 1px solid var(--line);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
.material-library-title {
|
|
243
|
+
flex: 1;
|
|
244
|
+
min-width: 0;
|
|
245
|
+
margin: 0;
|
|
246
|
+
font-size: var(--type-md);
|
|
247
|
+
font-weight: var(--weight-semibold);
|
|
248
|
+
color: var(--ink-1);
|
|
249
|
+
white-space: nowrap;
|
|
250
|
+
overflow: hidden;
|
|
251
|
+
text-overflow: ellipsis;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/* A group's name: caps micro in the third ink, inset like the rows. */
|
|
255
|
+
.material-library-group {
|
|
256
|
+
margin: 0;
|
|
257
|
+
padding: var(--space-5) var(--space-6) var(--space-2);
|
|
258
|
+
font-size: var(--type-micro);
|
|
259
|
+
font-weight: var(--weight-semibold);
|
|
260
|
+
letter-spacing: var(--tracking-caps);
|
|
261
|
+
line-height: var(--leading-tight);
|
|
262
|
+
text-transform: uppercase;
|
|
263
|
+
color: var(--ink-3);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/* The inspector's one empty state, inset like every row of the column. */
|
|
267
|
+
.material-library .insp-empty {
|
|
268
|
+
padding: var(--space-1) var(--space-6) var(--space-3);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
.material-library-list {
|
|
272
|
+
margin: 0;
|
|
273
|
+
padding: 0;
|
|
274
|
+
list-style: none;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/* FULL-BLEED ROWS, the column's: hover one fill step, the graph on the canvas
|
|
278
|
+
the accent band with its name in accent ink. The current row carries a
|
|
279
|
+
`:hover` twin so it outranks the hover by a class. */
|
|
280
|
+
.material-saved-row {
|
|
281
|
+
display: flex;
|
|
282
|
+
align-items: stretch;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
.material-saved-row:hover {
|
|
286
|
+
background: var(--fill-hover);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
.material-saved-row.is-current,
|
|
290
|
+
.material-saved-row.is-current:hover {
|
|
291
|
+
background: var(--accent-soft);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
.material-saved-row.is-current strong {
|
|
295
|
+
color: var(--accent-ink);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
.material-saved-apply {
|
|
299
|
+
flex: 1 1 auto;
|
|
300
|
+
min-width: 0;
|
|
301
|
+
min-height: var(--row-h);
|
|
302
|
+
display: grid;
|
|
303
|
+
grid-template-columns: 18px minmax(0, 1fr);
|
|
304
|
+
align-items: center;
|
|
305
|
+
gap: var(--space-3);
|
|
306
|
+
padding: var(--space-2) var(--space-2) var(--space-2) var(--space-6);
|
|
307
|
+
color: var(--ink-1);
|
|
308
|
+
background: transparent;
|
|
309
|
+
border: 0;
|
|
310
|
+
text-align: left;
|
|
311
|
+
cursor: pointer;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/* A row a press would not change (MaterialLibrary.tsx): the graph on the
|
|
315
|
+
canvas, or the one the whole model already wears. It stays focusable, so
|
|
316
|
+
its name and title still read; it just offers no press. */
|
|
317
|
+
.material-saved-apply[aria-disabled="true"] {
|
|
318
|
+
cursor: default;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/* Inset, because the rows run edge to edge in a column that clips. */
|
|
322
|
+
.material-saved-apply:focus-visible,
|
|
323
|
+
.material-saved-delete:focus-visible {
|
|
324
|
+
outline: none;
|
|
325
|
+
box-shadow: inset 0 0 0 var(--ring-width) var(--ring-color);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
.material-saved-text {
|
|
329
|
+
display: flex;
|
|
330
|
+
flex-direction: column;
|
|
331
|
+
gap: var(--space-1);
|
|
332
|
+
min-width: 0;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
.material-saved-text strong {
|
|
336
|
+
overflow: hidden;
|
|
337
|
+
text-overflow: ellipsis;
|
|
338
|
+
white-space: nowrap;
|
|
339
|
+
font-size: var(--type-md);
|
|
340
|
+
font-weight: var(--weight-medium);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
.material-saved-text small {
|
|
344
|
+
overflow: hidden;
|
|
345
|
+
text-overflow: ellipsis;
|
|
346
|
+
white-space: nowrap;
|
|
347
|
+
color: var(--ink-3);
|
|
348
|
+
font-size: var(--type-micro);
|
|
349
|
+
line-height: var(--leading-tight);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/* The mark or the orb sits centred in the row's 18px icon column; the orb is
|
|
353
|
+
drawn for a card and comes down to the icon size here. */
|
|
354
|
+
.material-saved-apply > .material-model-mark,
|
|
355
|
+
.material-saved-apply > .material-starter-orb {
|
|
356
|
+
justify-self: center;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
.material-saved-apply > .material-starter-orb {
|
|
360
|
+
width: 16px;
|
|
361
|
+
height: 16px;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
.material-saved-delete {
|
|
365
|
+
flex: none;
|
|
366
|
+
display: inline-flex;
|
|
367
|
+
align-items: center;
|
|
368
|
+
justify-content: center;
|
|
369
|
+
width: var(--control-h);
|
|
370
|
+
margin-right: var(--space-2);
|
|
371
|
+
color: var(--ink-3);
|
|
372
|
+
background: transparent;
|
|
373
|
+
border: 0;
|
|
374
|
+
border-radius: var(--radius-xs);
|
|
375
|
+
cursor: pointer;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
.material-saved-delete:hover {
|
|
379
|
+
color: var(--danger-ink);
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/* ---- the material's rows, in the inspector (MaterialSection.tsx) ------------ */
|
|
383
|
+
.material-section-heading {
|
|
384
|
+
display: flex;
|
|
385
|
+
align-items: center;
|
|
386
|
+
justify-content: space-between;
|
|
387
|
+
gap: var(--space-4);
|
|
388
|
+
min-width: 0;
|
|
389
|
+
margin-bottom: var(--space-4);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
.material-eyebrow {
|
|
393
|
+
color: var(--ink-3);
|
|
394
|
+
font-size: var(--type-micro);
|
|
395
|
+
font-weight: 600;
|
|
396
|
+
letter-spacing: var(--tracking-caps);
|
|
397
|
+
line-height: var(--leading-tight);
|
|
398
|
+
text-transform: uppercase;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
.material-empty-copy,
|
|
402
|
+
.material-legacy-note {
|
|
403
|
+
margin: 0;
|
|
404
|
+
color: var(--ink-2);
|
|
405
|
+
font-size: var(--type-sm);
|
|
406
|
+
line-height: var(--leading-body);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
.material-add-parameter {
|
|
410
|
+
flex: 0 0 auto;
|
|
411
|
+
gap: var(--space-2);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
.material-add-parameter .material-parameter-type {
|
|
415
|
+
height: var(--control-h);
|
|
416
|
+
max-width: 82px;
|
|
417
|
+
min-width: 82px;
|
|
418
|
+
padding-left: var(--space-3);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/* The per-mesh rows and each definition's fields are PropRows, 6px apart: the
|
|
422
|
+
inspector's row rhythm. */
|
|
423
|
+
.material-parameter-list {
|
|
424
|
+
display: flex;
|
|
425
|
+
flex-direction: column;
|
|
426
|
+
gap: var(--space-3);
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
.material-parameter-definitions {
|
|
430
|
+
display: flex;
|
|
431
|
+
flex-direction: column;
|
|
432
|
+
gap: var(--space-2);
|
|
433
|
+
margin-bottom: var(--space-5);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
.material-parameter-definition {
|
|
437
|
+
overflow: hidden;
|
|
438
|
+
background: var(--surface-secondary);
|
|
439
|
+
border: 1px solid var(--line-soft);
|
|
440
|
+
border-radius: var(--radius-md);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
.material-parameter-definition summary {
|
|
444
|
+
min-height: var(--control-h);
|
|
445
|
+
display: flex;
|
|
446
|
+
align-items: center;
|
|
447
|
+
gap: var(--space-3);
|
|
448
|
+
padding: 0 var(--space-4);
|
|
449
|
+
cursor: pointer;
|
|
450
|
+
list-style: none;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
.material-parameter-definition summary::-webkit-details-marker {
|
|
454
|
+
display: none;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
.material-parameter-definition summary::before {
|
|
458
|
+
content: "›";
|
|
459
|
+
color: var(--ink-3);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
.material-parameter-definition[open] summary::before {
|
|
463
|
+
content: "⌄";
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
.material-parameter-definition summary > span {
|
|
467
|
+
flex: 1 1 auto;
|
|
468
|
+
min-width: 0;
|
|
469
|
+
overflow: hidden;
|
|
470
|
+
text-overflow: ellipsis;
|
|
471
|
+
white-space: nowrap;
|
|
472
|
+
font-size: var(--type-sm);
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
.material-parameter-definition summary small {
|
|
476
|
+
color: var(--ink-3);
|
|
477
|
+
font-size: var(--type-micro);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
.material-parameter-definition-body {
|
|
481
|
+
display: flex;
|
|
482
|
+
flex-direction: column;
|
|
483
|
+
gap: var(--space-3);
|
|
484
|
+
padding: var(--space-4);
|
|
485
|
+
border-top: 1px solid var(--line-soft);
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
/* The card's one destructive verb, on the house row of buttons
|
|
489
|
+
(`.insp-buttons`, widgets.css); this places the row only. */
|
|
490
|
+
.material-delete-parameter {
|
|
491
|
+
margin-top: var(--space-2);
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
/* The clamp offer's two answers, under its sentence. The row itself is the
|
|
495
|
+
house row of buttons (`.insp-buttons`, widgets.css); this places it only. */
|
|
496
|
+
.material-parameter-clamp-actions {
|
|
497
|
+
margin-top: var(--space-2);
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
.material-problem-list {
|
|
501
|
+
padding: var(--space-5);
|
|
502
|
+
color: var(--danger-ink);
|
|
503
|
+
font-size: var(--type-micro);
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
.material-problem-list p {
|
|
507
|
+
margin: 0 0 var(--space-3);
|
|
508
|
+
line-height: var(--leading-body);
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
.material-problem-list code {
|
|
512
|
+
color: inherit;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
/* Graph canvas furniture. React Flow owns pan/zoom; the cards and sockets use
|
|
516
|
+
the same border/surface ladder as the rest of the editor. */
|
|
517
|
+
.material-graph-canvas {
|
|
518
|
+
position: absolute;
|
|
519
|
+
inset: 0;
|
|
520
|
+
overflow: hidden;
|
|
521
|
+
outline: none;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
.material-graph-canvas.is-loading {
|
|
525
|
+
display: grid;
|
|
526
|
+
place-items: center;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
.material-graph-canvas:focus-visible {
|
|
530
|
+
box-shadow: inset 0 0 0 1px var(--accent);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
/* AT THE CURSOR. `left`/`top` are written inline by the palette from the point
|
|
534
|
+
the request carried, so the only thing left here is the box it draws. The
|
|
535
|
+
translate keeps it from opening directly under the pointer, where its first
|
|
536
|
+
row would be armed by the release of the click that opened it. */
|
|
537
|
+
.material-node-palette {
|
|
538
|
+
position: absolute;
|
|
539
|
+
z-index: 8;
|
|
540
|
+
transform: translate(6px, 6px);
|
|
541
|
+
width: 228px;
|
|
542
|
+
max-height: min(480px, calc(100% - 54px));
|
|
543
|
+
display: flex;
|
|
544
|
+
flex-direction: column;
|
|
545
|
+
overflow: hidden;
|
|
546
|
+
background: var(--surface-raised);
|
|
547
|
+
border: 1px solid var(--line-strong);
|
|
548
|
+
border-radius: var(--radius-md);
|
|
549
|
+
box-shadow: var(--shadow-float);
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
.material-node-search {
|
|
553
|
+
flex: 0 0 34px;
|
|
554
|
+
width: 100%;
|
|
555
|
+
padding: 0 var(--space-5);
|
|
556
|
+
font: inherit;
|
|
557
|
+
color: var(--ink-1);
|
|
558
|
+
background: var(--fill-rest);
|
|
559
|
+
border: 0;
|
|
560
|
+
border-bottom: 1px solid var(--line);
|
|
561
|
+
outline: 0;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
.material-node-palette-scroll {
|
|
565
|
+
overflow: auto;
|
|
566
|
+
padding: var(--space-3);
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
.material-node-category h3 {
|
|
570
|
+
margin: var(--space-4) 0 var(--space-1);
|
|
571
|
+
padding: 0 var(--space-2);
|
|
572
|
+
color: var(--ink-3);
|
|
573
|
+
font-size: var(--type-micro);
|
|
574
|
+
letter-spacing: var(--tracking-caps);
|
|
575
|
+
text-transform: uppercase;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
.material-node-category:first-child h3 {
|
|
579
|
+
margin-top: 0;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
/* The keyboard's row and the pointer's row are ONE state, so ArrowDown and a
|
|
583
|
+
hover cannot both look current at the same time. */
|
|
584
|
+
.material-node-category button.is-active {
|
|
585
|
+
background: var(--fill-rest);
|
|
586
|
+
box-shadow: inset 2px 0 0 var(--accent);
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
.material-node-category button {
|
|
590
|
+
width: 100%;
|
|
591
|
+
min-height: 30px;
|
|
592
|
+
display: flex;
|
|
593
|
+
align-items: center;
|
|
594
|
+
justify-content: space-between;
|
|
595
|
+
padding: 0 var(--space-3);
|
|
596
|
+
color: var(--ink-1);
|
|
597
|
+
background: transparent;
|
|
598
|
+
border: 0;
|
|
599
|
+
border-radius: var(--radius-sm);
|
|
600
|
+
font: inherit;
|
|
601
|
+
text-align: left;
|
|
602
|
+
cursor: pointer;
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
.material-node-category button:hover:not(:disabled) {
|
|
606
|
+
background: var(--fill-rest);
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
.material-node-category button:disabled {
|
|
610
|
+
opacity: var(--opacity-disabled);
|
|
611
|
+
cursor: default;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
.material-node-category button small {
|
|
615
|
+
color: var(--ink-3);
|
|
616
|
+
font-size: var(--type-micro);
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
.material-node {
|
|
620
|
+
min-width: 168px;
|
|
621
|
+
overflow: hidden;
|
|
622
|
+
color: var(--ink-1);
|
|
623
|
+
background: var(--surface-raised);
|
|
624
|
+
border: 1px solid var(--line-strong);
|
|
625
|
+
border-radius: var(--radius-md);
|
|
626
|
+
box-shadow: 0 4px 12px color-mix(in srgb, var(--surface-app) 65%, transparent);
|
|
627
|
+
font-family: var(--font-sans);
|
|
628
|
+
font-size: var(--type-micro);
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
.material-node.is-selected {
|
|
632
|
+
border-color: var(--accent);
|
|
633
|
+
box-shadow: 0 0 0 2px var(--accent-soft);
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
.material-node-title {
|
|
637
|
+
display: flex;
|
|
638
|
+
align-items: center;
|
|
639
|
+
justify-content: space-between;
|
|
640
|
+
gap: var(--space-4);
|
|
641
|
+
height: 30px;
|
|
642
|
+
padding: 0 var(--space-4);
|
|
643
|
+
background: var(--fill-rest);
|
|
644
|
+
border-bottom: 1px solid var(--line);
|
|
645
|
+
font-weight: 600;
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
.material-node-title small {
|
|
649
|
+
color: var(--ink-3);
|
|
650
|
+
font-size: var(--type-micro);
|
|
651
|
+
font-weight: 600;
|
|
652
|
+
letter-spacing: var(--tracking-caps);
|
|
653
|
+
text-transform: uppercase;
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
/* The validator's one sentence, on the card it is about. The panel below the
|
|
657
|
+
canvas still lists them all; this is the half that says WHICH card. */
|
|
658
|
+
.material-node.is-problem {
|
|
659
|
+
border-color: var(--danger);
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
.material-node-problem {
|
|
663
|
+
margin: 0;
|
|
664
|
+
padding: var(--space-3) var(--space-4);
|
|
665
|
+
color: var(--danger-ink);
|
|
666
|
+
border-bottom: 1px solid var(--line);
|
|
667
|
+
line-height: var(--leading-tight);
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
/* The inline widgets. `nodrag nowheel` are on the element in TSX, not here:
|
|
671
|
+
React Flow reads them as class names off the event target. The card's
|
|
672
|
+
inset is the socket rows' 8px, so a field, a title and a socket label
|
|
673
|
+
start on one edge. */
|
|
674
|
+
.material-node-fields {
|
|
675
|
+
display: flex;
|
|
676
|
+
flex-direction: column;
|
|
677
|
+
gap: var(--space-2);
|
|
678
|
+
padding: var(--space-3) var(--space-4) var(--space-1);
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
.material-node-field {
|
|
682
|
+
display: flex;
|
|
683
|
+
align-items: center;
|
|
684
|
+
gap: var(--space-2);
|
|
685
|
+
min-width: 0;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
.material-node-field > * {
|
|
689
|
+
min-width: 0;
|
|
690
|
+
flex: 1 1 auto;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
.material-node-field.is-vector {
|
|
694
|
+
gap: var(--space-1);
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
.material-node-preview {
|
|
698
|
+
display: grid;
|
|
699
|
+
place-items: center;
|
|
700
|
+
padding: var(--space-3) var(--space-4) var(--space-1);
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
.material-node-preview-canvas {
|
|
704
|
+
width: 96px;
|
|
705
|
+
height: 96px;
|
|
706
|
+
border: 1px solid var(--line);
|
|
707
|
+
border-radius: var(--radius-sm);
|
|
708
|
+
background: var(--fill-rest);
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
/* A thumbnail that has been asked for and not yet answered reads as a plate
|
|
712
|
+
rather than as a hole — the request is one GPU readback away, and a card
|
|
713
|
+
that blinked empty for it would be worse than one that waits quietly. */
|
|
714
|
+
.material-node-preview-canvas.is-waiting {
|
|
715
|
+
opacity: 0.4;
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
.material-node-preview-message {
|
|
719
|
+
max-width: 150px;
|
|
720
|
+
color: var(--danger-ink);
|
|
721
|
+
font-size: var(--type-micro);
|
|
722
|
+
line-height: var(--leading-tight);
|
|
723
|
+
text-align: center;
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
.material-node-sockets {
|
|
727
|
+
display: grid;
|
|
728
|
+
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
|
|
729
|
+
gap: var(--space-5);
|
|
730
|
+
padding: var(--space-3) 0 var(--space-4);
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
.material-node-inputs:empty,
|
|
734
|
+
.material-node-outputs:empty {
|
|
735
|
+
display: none;
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
.material-socket-row {
|
|
739
|
+
position: relative;
|
|
740
|
+
min-height: 24px;
|
|
741
|
+
display: flex;
|
|
742
|
+
align-items: center;
|
|
743
|
+
gap: var(--space-2);
|
|
744
|
+
padding: 0 var(--space-4);
|
|
745
|
+
white-space: nowrap;
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
.material-socket-row.is-output {
|
|
749
|
+
justify-content: flex-end;
|
|
750
|
+
text-align: right;
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
/* ── the three non-card node kinds ─────────────────────────────────────────
|
|
754
|
+
A group is a React Flow SUBFLOW, so its box is sized by the inline style
|
|
755
|
+
`flowModel.ts` writes and this only paints it. `pointer-events` stays on so
|
|
756
|
+
the box itself can be grabbed; its members sit above it in the subflow's own
|
|
757
|
+
stacking, which is what makes dragging the box carry them and dragging a
|
|
758
|
+
member move only that one. */
|
|
759
|
+
.material-group {
|
|
760
|
+
width: 100%;
|
|
761
|
+
height: 100%;
|
|
762
|
+
border: 1px dashed var(--line-strong);
|
|
763
|
+
border-radius: var(--radius-md);
|
|
764
|
+
background: var(--surface-panel);
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
.material-group-title {
|
|
768
|
+
padding: var(--space-2) var(--space-3);
|
|
769
|
+
color: var(--ink-2);
|
|
770
|
+
font-size: var(--type-micro);
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
.material-comment {
|
|
774
|
+
width: 100%;
|
|
775
|
+
height: 100%;
|
|
776
|
+
overflow: hidden;
|
|
777
|
+
background: var(--surface-raised);
|
|
778
|
+
border: 1px solid var(--line);
|
|
779
|
+
border-left: 2px solid var(--ink-3);
|
|
780
|
+
border-radius: var(--radius-md);
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
.material-comment-body {
|
|
784
|
+
width: 100%;
|
|
785
|
+
height: 100%;
|
|
786
|
+
padding: var(--space-3);
|
|
787
|
+
color: var(--ink-2);
|
|
788
|
+
font-size: var(--type-micro);
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
.material-comment-body textarea {
|
|
792
|
+
width: 100%;
|
|
793
|
+
height: 100%;
|
|
794
|
+
resize: none;
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
/* PUNCTUATION, not a card: 14px, no title bar, nothing to look inside. */
|
|
798
|
+
.material-reroute {
|
|
799
|
+
position: relative;
|
|
800
|
+
width: 14px;
|
|
801
|
+
height: 14px;
|
|
802
|
+
border-radius: var(--radius-full);
|
|
803
|
+
background: var(--surface-raised);
|
|
804
|
+
border: 1px solid var(--line-strong);
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
/* ── SOCKETS: SHAPE IS THE TYPE, INK IS THE STATE ──────────────────────────
|
|
808
|
+
The per-type COLOURS that used to live here are gone, and deliberately: this
|
|
809
|
+
design system is monochrome plus one blue, and nine socket types would be
|
|
810
|
+
nine hues none of which is a studio colour. `socketGlyph.ts` carries the
|
|
811
|
+
argument in full and `materialSocketGlyph.test.ts` holds this file to it —
|
|
812
|
+
every class below paints from `--text*`, `--border*` or `--accent*` and
|
|
813
|
+
nothing else.
|
|
814
|
+
|
|
815
|
+
Scoped under the canvas rather than doubled with `.react-flow__handle`,
|
|
816
|
+
which is a shorter way to win the same specificity. */
|
|
817
|
+
.material-graph-canvas .material-socket {
|
|
818
|
+
width: 10px;
|
|
819
|
+
height: 10px;
|
|
820
|
+
box-sizing: border-box;
|
|
821
|
+
color: var(--ink-2);
|
|
822
|
+
background: currentColor;
|
|
823
|
+
border: 0;
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
.material-graph-canvas .material-socket.is-connected {
|
|
827
|
+
color: var(--ink-1);
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
.material-graph-canvas .material-socket-circle {
|
|
831
|
+
border-radius: var(--radius-full);
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
.material-graph-canvas .material-socket-circle-dotted {
|
|
835
|
+
border-radius: var(--radius-full);
|
|
836
|
+
background: transparent;
|
|
837
|
+
border: 1.5px dotted currentColor;
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
.material-graph-canvas .material-socket-triangle {
|
|
841
|
+
clip-path: polygon(0 0, 100% 50%, 0 100%);
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
.material-graph-canvas .material-socket-diamond {
|
|
845
|
+
clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
.material-graph-canvas .material-socket-square {
|
|
849
|
+
border-radius: var(--radius-2xs);
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
.material-graph-canvas .material-socket-square-round {
|
|
853
|
+
border-radius: var(--radius-2xs);
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
.material-graph-canvas .material-socket-ring {
|
|
857
|
+
border-radius: var(--radius-full);
|
|
858
|
+
background: transparent;
|
|
859
|
+
border: 2px solid currentColor;
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
/* The second ring is an `outline`, not an inset shadow: a shadow would need the
|
|
863
|
+
card's surface colour to draw the gap, and a surface token is not one of the
|
|
864
|
+
three families a socket may paint from. */
|
|
865
|
+
.material-graph-canvas .material-socket-ring-double {
|
|
866
|
+
border-radius: var(--radius-full);
|
|
867
|
+
background: transparent;
|
|
868
|
+
border: 1.5px solid currentColor;
|
|
869
|
+
outline: 1.5px solid currentColor;
|
|
870
|
+
outline-offset: 1px;
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
.material-graph-canvas .material-socket-circle-dashed {
|
|
874
|
+
border-radius: var(--radius-full);
|
|
875
|
+
background: transparent;
|
|
876
|
+
border: 1.5px dashed currentColor;
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
/* The two live-drag answers. Ringed means "let go here"; dimmed means the type
|
|
880
|
+
index already refused it, said before the drop rather than after. */
|
|
881
|
+
.material-graph-canvas .material-socket.is-droppable {
|
|
882
|
+
color: var(--accent-ink);
|
|
883
|
+
box-shadow: 0 0 0 3px var(--accent-soft);
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
.material-graph-canvas .material-socket.is-blocked {
|
|
887
|
+
opacity: 0.45;
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
/* HOVER, BEFORE ANY DRAG. The two rules above answer a wire already in hand;
|
|
891
|
+
this one answers the pointer merely resting on a socket, which is where an
|
|
892
|
+
author asks "can I grab this". Ink and a ring, no hue: the drag-time answers
|
|
893
|
+
own `--accent`, and a socket that lit up blue on hover would say "droppable"
|
|
894
|
+
to an author holding nothing. The cursor is the other half of the sentence. */
|
|
895
|
+
.material-graph-canvas .material-socket:hover {
|
|
896
|
+
color: var(--ink-1);
|
|
897
|
+
box-shadow: 0 0 0 3px var(--line);
|
|
898
|
+
cursor: crosshair;
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
.material-graph-canvas .react-flow__edge-path {
|
|
902
|
+
stroke: var(--ink-3);
|
|
903
|
+
stroke-width: 1.5;
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
/* A WIRE UNDER THE POINTER. React Flow already draws a 20px invisible
|
|
907
|
+
interaction path down every edge, so the target was never the problem — the
|
|
908
|
+
answer was. One ink step and half a pixel is enough to say "this one", and
|
|
909
|
+
leaves `--accent` to mean selected. */
|
|
910
|
+
.material-graph-canvas .react-flow__edge.material-edge:hover .react-flow__edge-path {
|
|
911
|
+
stroke: var(--ink-2);
|
|
912
|
+
stroke-width: 2;
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
/* A wire reached by KEYBOARD gets the hover's step. React Flow's own focus
|
|
916
|
+
grey used to paint it, and that rule now ranks below the chrome (vendor
|
|
917
|
+
layer), so without this a tabbed-to wire showed no cue at all. */
|
|
918
|
+
.material-graph-canvas .react-flow__edge.material-edge:focus-visible .react-flow__edge-path {
|
|
919
|
+
stroke: var(--ink-2);
|
|
920
|
+
stroke-width: 2;
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
/* The wire a dragged card would SPLICE INTO if it were dropped now. Full ink
|
|
924
|
+
and visibly thicker, because this one predicts an edit rather than reporting
|
|
925
|
+
a hover, and the author is looking at the card they are dragging. */
|
|
926
|
+
.material-graph-canvas .react-flow__edge.material-edge.is-splice-target .react-flow__edge-path {
|
|
927
|
+
stroke: var(--ink-1);
|
|
928
|
+
stroke-width: 2.5;
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
.material-graph-canvas .react-flow__edge.selected .react-flow__edge-path,
|
|
932
|
+
.material-graph-canvas .react-flow__edge.material-edge.is-selected .react-flow__edge-path {
|
|
933
|
+
stroke: var(--accent);
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
/* The box a dragged card would JOIN. Its border is dashed at rest, so going
|
|
937
|
+
solid is the whole signal — no fill, because a group box tinting under a
|
|
938
|
+
card the author is still holding reads as a drop that already happened. */
|
|
939
|
+
.material-graph-canvas .react-flow__node.is-drop-target .material-group {
|
|
940
|
+
border-style: solid;
|
|
941
|
+
border-color: var(--ink-2);
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
/* The one resize corner on a selected box or note. Deliberately small and
|
|
945
|
+
quiet: it is a grip, not a control, and there is exactly one of it. */
|
|
946
|
+
.material-graph-canvas .material-resize-handle {
|
|
947
|
+
width: 9px;
|
|
948
|
+
height: 9px;
|
|
949
|
+
background: var(--surface-raised);
|
|
950
|
+
border: 1px solid var(--line-strong);
|
|
951
|
+
border-radius: var(--radius-2xs);
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
/* The overview. Furniture under a graph being read, so it is the same panel
|
|
955
|
+
surface as everything else and its cards are ink rather than colour: a
|
|
956
|
+
minimap in a second palette is a second thing competing for the eye. Docked
|
|
957
|
+
furniture, not a floating island: a hairline and a small radius, no shadow,
|
|
958
|
+
inset from the corner by the cell's own 12px. */
|
|
959
|
+
.material-graph-canvas .react-flow__minimap {
|
|
960
|
+
margin: var(--space-6);
|
|
961
|
+
overflow: hidden;
|
|
962
|
+
background: var(--surface-panel);
|
|
963
|
+
border: 1px solid var(--line);
|
|
964
|
+
border-radius: var(--radius-sm);
|
|
965
|
+
box-shadow: none;
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
.material-graph-canvas .react-flow__minimap-node {
|
|
969
|
+
fill: var(--ink-3);
|
|
970
|
+
stroke: none;
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
.material-graph-canvas .react-flow__minimap-node.selected {
|
|
974
|
+
fill: var(--accent);
|
|
975
|
+
}
|
|
976
|
+
|
|
977
|
+
.material-graph-canvas .react-flow__minimap-mask {
|
|
978
|
+
fill: var(--surface-app);
|
|
979
|
+
fill-opacity: 0.55;
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
/* React Flow's own selection rectangle, in the one signal colour. */
|
|
983
|
+
.material-graph-canvas .react-flow__selection {
|
|
984
|
+
background: var(--accent-quiet);
|
|
985
|
+
border: 1px solid var(--accent);
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
.material-source-view {
|
|
989
|
+
position: absolute;
|
|
990
|
+
inset: 0;
|
|
991
|
+
display: flex;
|
|
992
|
+
flex-direction: column;
|
|
993
|
+
min-height: 0;
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
.material-source-heading {
|
|
997
|
+
flex: 0 0 52px;
|
|
998
|
+
display: flex;
|
|
999
|
+
align-items: center;
|
|
1000
|
+
justify-content: space-between;
|
|
1001
|
+
gap: var(--space-4);
|
|
1002
|
+
padding: 0 var(--space-5) 0 var(--space-6);
|
|
1003
|
+
border-bottom: 1px solid var(--line);
|
|
1004
|
+
background: var(--surface-panel);
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
.material-source-heading > div {
|
|
1008
|
+
display: flex;
|
|
1009
|
+
flex-direction: column;
|
|
1010
|
+
gap: var(--space-1);
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
.material-source-heading strong {
|
|
1014
|
+
font-size: var(--type-md);
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
.material-source-heading span {
|
|
1018
|
+
color: var(--ink-3);
|
|
1019
|
+
font-size: var(--type-micro);
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
.material-source-view pre {
|
|
1023
|
+
flex: 1 1 auto;
|
|
1024
|
+
min-height: 0;
|
|
1025
|
+
margin: 0;
|
|
1026
|
+
padding: var(--space-7);
|
|
1027
|
+
overflow: auto;
|
|
1028
|
+
color: var(--ink-2);
|
|
1029
|
+
font: var(--type-micro)/var(--leading-none) var(--font-mono);
|
|
1030
|
+
line-height: var(--leading-body);
|
|
1031
|
+
tab-size: 2;
|
|
1032
|
+
white-space: pre;
|
|
1033
|
+
background: var(--surface-app);
|
|
1034
|
+
}
|
|
1035
|
+
|
|
1036
|
+
.material-source-error {
|
|
1037
|
+
margin: var(--space-6);
|
|
1038
|
+
padding: var(--space-5);
|
|
1039
|
+
color: var(--danger-ink);
|
|
1040
|
+
background: color-mix(in srgb, var(--danger) 8%, var(--surface-panel));
|
|
1041
|
+
border: 1px solid color-mix(in srgb, var(--danger) 35%, var(--line));
|
|
1042
|
+
border-radius: var(--radius-md);
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
/* ---- the setup screen ------------------------------------------------------ */
|
|
1046
|
+
/* The canvas cell while the mesh has no graph: a focused decision surface
|
|
1047
|
+
with its own ground, taking the pointer back from the cell. There is no
|
|
1048
|
+
hole yet, because there is no material to preview. A size container, so
|
|
1049
|
+
the starters stack by the cell's width rather than the window's. */
|
|
1050
|
+
.material-setup {
|
|
1051
|
+
flex: 1 1 auto;
|
|
1052
|
+
min-width: 0;
|
|
1053
|
+
min-height: 0;
|
|
1054
|
+
overflow: auto;
|
|
1055
|
+
padding: var(--space-8);
|
|
1056
|
+
background: var(--surface-app);
|
|
1057
|
+
pointer-events: auto;
|
|
1058
|
+
container-type: inline-size;
|
|
1059
|
+
}
|
|
1060
|
+
|
|
1061
|
+
.material-setup-intro {
|
|
1062
|
+
max-width: 620px;
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1065
|
+
.material-setup-intro h2 {
|
|
1066
|
+
margin: var(--space-3) 0 var(--space-3);
|
|
1067
|
+
font-size: var(--type-xl);
|
|
1068
|
+
line-height: var(--leading-tight);
|
|
1069
|
+
font-weight: 600;
|
|
1070
|
+
}
|
|
1071
|
+
|
|
1072
|
+
.material-setup-intro > p:not(.material-legacy-note) {
|
|
1073
|
+
margin: 0;
|
|
1074
|
+
max-width: 580px;
|
|
1075
|
+
color: var(--ink-2);
|
|
1076
|
+
font-size: var(--type-md);
|
|
1077
|
+
line-height: var(--leading-body);
|
|
1078
|
+
}
|
|
1079
|
+
|
|
1080
|
+
/* Two classes, so its air outranks the shared `margin: 0` above on
|
|
1081
|
+
specificity rather than on position. */
|
|
1082
|
+
.material-setup-intro > .material-legacy-note {
|
|
1083
|
+
margin-top: var(--space-6);
|
|
1084
|
+
padding: var(--space-4) var(--space-5);
|
|
1085
|
+
border-left: 2px solid var(--warn);
|
|
1086
|
+
background: var(--surface-panel);
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1089
|
+
.material-starters {
|
|
1090
|
+
display: grid;
|
|
1091
|
+
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
1092
|
+
gap: var(--space-4);
|
|
1093
|
+
max-width: 760px;
|
|
1094
|
+
margin-top: var(--space-8);
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
.material-starter-card {
|
|
1098
|
+
min-height: 136px;
|
|
1099
|
+
display: flex;
|
|
1100
|
+
flex-direction: column;
|
|
1101
|
+
align-items: flex-start;
|
|
1102
|
+
justify-content: space-between;
|
|
1103
|
+
gap: var(--space-6);
|
|
1104
|
+
padding: var(--space-6);
|
|
1105
|
+
color: var(--ink-1);
|
|
1106
|
+
background: var(--surface-panel);
|
|
1107
|
+
border: 1px solid var(--line);
|
|
1108
|
+
border-radius: var(--radius-md);
|
|
1109
|
+
font: inherit;
|
|
1110
|
+
text-align: left;
|
|
1111
|
+
cursor: pointer;
|
|
1112
|
+
}
|
|
1113
|
+
|
|
1114
|
+
.material-starter-card:hover {
|
|
1115
|
+
background: var(--surface-secondary);
|
|
1116
|
+
border-color: var(--line-strong);
|
|
1117
|
+
}
|
|
1118
|
+
|
|
1119
|
+
.material-starter-card > span:last-child {
|
|
1120
|
+
display: flex;
|
|
1121
|
+
flex-direction: column;
|
|
1122
|
+
gap: var(--space-2);
|
|
1123
|
+
}
|
|
1124
|
+
|
|
1125
|
+
.material-starter-card strong {
|
|
1126
|
+
font-size: var(--type-md);
|
|
1127
|
+
font-weight: 600;
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1130
|
+
.material-starter-card small {
|
|
1131
|
+
color: var(--ink-3);
|
|
1132
|
+
font-size: var(--type-micro);
|
|
1133
|
+
line-height: var(--leading-body);
|
|
1134
|
+
}
|
|
1135
|
+
|
|
1136
|
+
.material-starter-orb {
|
|
1137
|
+
width: 30px;
|
|
1138
|
+
height: 30px;
|
|
1139
|
+
border-radius: var(--radius-full);
|
|
1140
|
+
background: var(--ink-2);
|
|
1141
|
+
box-shadow: inset -7px -8px 12px color-mix(in srgb, var(--surface-app) 48%, transparent);
|
|
1142
|
+
}
|
|
1143
|
+
|
|
1144
|
+
.material-starter-orb.is-standard {
|
|
1145
|
+
background: var(--ink-3);
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
.material-starter-orb.is-glass {
|
|
1149
|
+
background: var(--surface-secondary);
|
|
1150
|
+
border: 1px solid var(--ink-2);
|
|
1151
|
+
}
|
|
1152
|
+
|
|
1153
|
+
.material-model-mark {
|
|
1154
|
+
width: 7px;
|
|
1155
|
+
height: 7px;
|
|
1156
|
+
border-radius: var(--radius-full);
|
|
1157
|
+
background: var(--ink-3);
|
|
1158
|
+
}
|
|
1159
|
+
|
|
1160
|
+
.material-model-mark.is-standard {
|
|
1161
|
+
background: var(--ink-2);
|
|
1162
|
+
}
|
|
1163
|
+
|
|
1164
|
+
.material-model-mark.is-physical {
|
|
1165
|
+
border: 1px solid var(--ink-2);
|
|
1166
|
+
background: var(--surface-secondary);
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1169
|
+
@container (max-width: 560px) {
|
|
1170
|
+
.material-starters {
|
|
1171
|
+
grid-template-columns: 1fr;
|
|
1172
|
+
}
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1175
|
+
/* The model's triangle count, on its outline row. Muted until the scene as a
|
|
1176
|
+
whole crosses the soft budget, at which point every measured row tints — the
|
|
1177
|
+
claim is about the SCENE, so highlighting one row would name the wrong
|
|
1178
|
+
subject. */
|
|
1179
|
+
.layer-tris {
|
|
1180
|
+
flex: 0 0 auto;
|
|
1181
|
+
padding: 0 var(--space-2);
|
|
1182
|
+
font-size: var(--type-micro);
|
|
1183
|
+
font-variant-numeric: var(--numeric);
|
|
1184
|
+
color: var(--ink-3);
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
.layer-tris.is-over-budget {
|
|
1188
|
+
color: var(--warn);
|
|
1189
|
+
}
|
|
1190
|
+
|
|
1191
|
+
.material-badge {
|
|
1192
|
+
position: absolute;
|
|
1193
|
+
top: 4px;
|
|
1194
|
+
right: 4px;
|
|
1195
|
+
padding: 1px var(--space-2);
|
|
1196
|
+
border-radius: var(--radius-full);
|
|
1197
|
+
background: var(--warn);
|
|
1198
|
+
color: var(--surface-app);
|
|
1199
|
+
font-size: var(--type-micro);
|
|
1200
|
+
font-weight: var(--weight-semibold);
|
|
1201
|
+
}
|