@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
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
// COORDINATES ARE WORLD (three). The one mapping — design (x, y, z) is world
|
|
27
27
|
// (x, -y, -z) — is applied here and nowhere downstream, the same note
|
|
28
28
|
// workingView.ts carries.
|
|
29
|
+
import { rigPose as shotRigPose } from "@dailies-studio/shot/doc";
|
|
29
30
|
import type { Framing } from "@dailies-studio/shot/doc";
|
|
30
31
|
import type { FrameSize } from "./view.js";
|
|
31
32
|
|
|
@@ -79,7 +80,9 @@ export function frustumShape(rig: CameraRig, frame: FrameSize): FrustumShape {
|
|
|
79
80
|
// The framing's pan IS the camera's position on the plane, negated in y by
|
|
80
81
|
// the one mapping.
|
|
81
82
|
const cx = finite(rig.framing.x, 0);
|
|
82
|
-
|
|
83
|
+
// `+ 0` folds a negative zero, so this apex and `rigPose`'s eye are equal
|
|
84
|
+
// component by component and not only close.
|
|
85
|
+
const cy = -finite(rig.framing.y, 0) + 0;
|
|
83
86
|
const at = (u: number, v: number): Vec3 => [
|
|
84
87
|
cx + right[0] * u * halfW + up[0] * v * halfH,
|
|
85
88
|
cy + right[1] * u * halfW + up[1] * v * halfH,
|
|
@@ -104,6 +107,85 @@ export function frustumShape(rig: CameraRig, frame: FrameSize): FrustumShape {
|
|
|
104
107
|
};
|
|
105
108
|
}
|
|
106
109
|
|
|
110
|
+
/** A camera as three holds it: where it is, its world basis and its lens.
|
|
111
|
+
* `right`, `up` and `forward` are unit vectors. */
|
|
112
|
+
export interface CameraPose {
|
|
113
|
+
eye: Vec3;
|
|
114
|
+
right: Vec3;
|
|
115
|
+
up: Vec3;
|
|
116
|
+
forward: Vec3;
|
|
117
|
+
fovDeg: number;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* IS THE CAMERA STILL WHERE THE RIG PUT IT?
|
|
122
|
+
*
|
|
123
|
+
* `ShotCamera` places the render camera on the rig every frame: eye at
|
|
124
|
+
* `(x, -y, distance)`, looking down -z, rolled about it, at the rig's lens. An
|
|
125
|
+
* instance component may then write that same camera in its own `useFrame`
|
|
126
|
+
* (a flythrough drives eye, target and lens itself). The camera pane renders
|
|
127
|
+
* with whatever the camera ends up as, so the gizmo has to know which of the
|
|
128
|
+
* two it is looking at, and this is the one test that tells them apart. The
|
|
129
|
+
* tolerances are float noise only: a component that moves the camera moves
|
|
130
|
+
* it by far more than these.
|
|
131
|
+
*/
|
|
132
|
+
export function offTheRig(rig: CameraRig, pose: CameraPose): boolean {
|
|
133
|
+
const own = rigPose(rig);
|
|
134
|
+
const slack = 1e-4 * Math.max(1, Math.abs(finite(rig.distance, 1)));
|
|
135
|
+
for (let k = 0; k < 3; k++) {
|
|
136
|
+
if (Math.abs(pose.eye[k]! - own.eye[k]!) > slack) return true;
|
|
137
|
+
}
|
|
138
|
+
// A roll turns about the view axis, so the rig's forward is its own whatever
|
|
139
|
+
// the roll; only a component's `lookAt` can turn it away.
|
|
140
|
+
const along = pose.forward[0] * own.forward[0] + pose.forward[1] * own.forward[1] + pose.forward[2] * own.forward[2];
|
|
141
|
+
if (along < 1 - 1e-6) return true;
|
|
142
|
+
return Math.abs(pose.fovDeg - own.fovDeg) > 1e-3;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* IS SOMETHING ELSE DRIVING THE CAMERA? A declared driver (the runtime's
|
|
147
|
+
* camera claim) is the answer when there is one; `offTheRig` is the fallback
|
|
148
|
+
* for a component that writes the camera without claiming it.
|
|
149
|
+
*/
|
|
150
|
+
export function isDriven(driver: { name: string } | null, rig: CameraRig, pose: CameraPose | null): boolean {
|
|
151
|
+
if (driver !== null) return true;
|
|
152
|
+
return pose !== null && offTheRig(rig, pose);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* THE FRUSTUM OF A CAMERA SOMETHING ELSE IS DRIVING.
|
|
157
|
+
*
|
|
158
|
+
* There is no design plane to land the rectangle on: the component's world is
|
|
159
|
+
* its own scale and its camera looks wherever it likes. So the rectangle sits
|
|
160
|
+
* `distance` ahead of the eye along the view axis, sized by the lens exactly
|
|
161
|
+
* as the rig's is, and the caller picks the distance so the gizmo keeps a
|
|
162
|
+
* readable size on screen. Same winding, same up-marker, so the drawing reads
|
|
163
|
+
* as the same camera whoever is moving it.
|
|
164
|
+
*/
|
|
165
|
+
export function frustumShapeAhead(pose: CameraPose, distance: number, frame: FrameSize): FrustumShape {
|
|
166
|
+
const d = finite(distance, 1);
|
|
167
|
+
const halfH = Math.abs(d * Math.tan((finite(pose.fovDeg, 35) * DEG) / 2));
|
|
168
|
+
const aspect = frame.height > 0 ? frame.width / frame.height : 1;
|
|
169
|
+
const halfW = halfH * aspect;
|
|
170
|
+
const { eye, right, up, forward } = pose;
|
|
171
|
+
const centre: Vec3 = [eye[0] + forward[0] * d, eye[1] + forward[1] * d, eye[2] + forward[2] * d];
|
|
172
|
+
const from = (origin: Vec3, u: number, v: number): Vec3 => [
|
|
173
|
+
origin[0] + right[0] * u * halfW + up[0] * v * halfH,
|
|
174
|
+
origin[1] + right[1] * u * halfW + up[1] * v * halfH,
|
|
175
|
+
origin[2] + right[2] * u * halfW + up[2] * v * halfH,
|
|
176
|
+
];
|
|
177
|
+
const topMid = from(centre, 0, 1);
|
|
178
|
+
return {
|
|
179
|
+
apex: [eye[0], eye[1], eye[2]],
|
|
180
|
+
corners: [from(centre, -1, 1), from(centre, 1, 1), from(centre, 1, -1), from(centre, -1, -1)],
|
|
181
|
+
up: [
|
|
182
|
+
from(topMid, -UP_BASE_FRACTION, 0),
|
|
183
|
+
from(topMid, 0, UP_HEIGHT_FRACTION),
|
|
184
|
+
from(topMid, UP_BASE_FRACTION, 0),
|
|
185
|
+
],
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
107
189
|
/** Every segment as a flat xyz pair list, ready for a `LineSegments` position
|
|
108
190
|
* attribute: four pyramid edges, the base rectangle, then the up-marker. */
|
|
109
191
|
export function frustumSegments(shape: FrustumShape): number[] {
|
|
@@ -125,6 +207,88 @@ export function frustumSegments(shape: FrustumShape): number[] {
|
|
|
125
207
|
* the first call happened to produce. */
|
|
126
208
|
export const FRUSTUM_SEGMENT_FLOATS = 11 * 2 * 3;
|
|
127
209
|
|
|
210
|
+
// ── A PATH MOVE'S WAYPOINTS ─────────────────────────────────────────────────
|
|
211
|
+
//
|
|
212
|
+
// Same file, same reason as the frustum's own vertices: the marks are the only
|
|
213
|
+
// part that can be silently WRONG. A waypoint drawn at the wrong depth still
|
|
214
|
+
// looks like a waypoint, and the author would read the error as the camera
|
|
215
|
+
// travelling somewhere it does not.
|
|
216
|
+
//
|
|
217
|
+
// ONE MAPPING, THE SAME ONE. A waypoint is a `Framing`, so its eye is exactly
|
|
218
|
+
// where `cameraRigAt` would put the camera at that pose: `(x, -y, distance)`,
|
|
219
|
+
// with the distance derived from the scene's fov and the pose's own zoom. This
|
|
220
|
+
// file does not import `planeDistance` — it takes the distance as an argument,
|
|
221
|
+
// the same way `CameraRig` states what it needs rather than importing a shape
|
|
222
|
+
// it cannot check.
|
|
223
|
+
|
|
224
|
+
/** Half-extent of a waypoint's cross, as a fraction of the SCENE'S extent (the
|
|
225
|
+
* camera body's own rule below): 0.02 of a 1920-wide frame is the 38 design px
|
|
226
|
+
* the old frame-height fraction gave. */
|
|
227
|
+
export const WAYPOINT_CROSS_FRACTION = 0.02;
|
|
228
|
+
/** ...clamped on screen like the body, so a cross is never a dot from far away
|
|
229
|
+
* and a five-waypoint path never becomes a wall of crosses up close. */
|
|
230
|
+
export const WAYPOINT_CROSS_MIN_PX = 6;
|
|
231
|
+
export const WAYPOINT_CROSS_MAX_PX = 20;
|
|
232
|
+
|
|
233
|
+
/** A waypoint cross's half-extent in world units, for a world-per-pixel at
|
|
234
|
+
* that eye. `wpp` of zero (no camera on screen yet) leaves it unclamped. */
|
|
235
|
+
export function waypointCrossSize(extent: number, wpp: number): number {
|
|
236
|
+
const scene = finite(extent, 0);
|
|
237
|
+
let size = WAYPOINT_CROSS_FRACTION * (scene > 0 ? scene : 1);
|
|
238
|
+
const perPixel = finite(wpp, 0);
|
|
239
|
+
if (perPixel > 0) {
|
|
240
|
+
size = Math.min(Math.max(size, WAYPOINT_CROSS_MIN_PX * perPixel), WAYPOINT_CROSS_MAX_PX * perPixel);
|
|
241
|
+
}
|
|
242
|
+
return size > 0 && Number.isFinite(size) ? size : 1;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/** The eye of each waypoint, in WORLD coordinates. `distances[i]` is
|
|
246
|
+
* `planeDistance(frameHeight, fovDeg, waypoints[i].zoom)`. */
|
|
247
|
+
export function waypointEyes(
|
|
248
|
+
waypoints: readonly Framing[],
|
|
249
|
+
distances: readonly number[],
|
|
250
|
+
): Vec3[] {
|
|
251
|
+
return waypoints.map((pose, i) => [
|
|
252
|
+
finite(pose.x, 0),
|
|
253
|
+
-finite(pose.y, 0),
|
|
254
|
+
finite(distances[i] ?? 0, 0),
|
|
255
|
+
]);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* The marks: a three-axis cross at each eye, plus the polyline through them.
|
|
260
|
+
*
|
|
261
|
+
* The POLYLINE is not decoration — a path move curves through its middle poses
|
|
262
|
+
* with a centripetal spline, and without the line between them a reader cannot
|
|
263
|
+
* tell which waypoint comes after which. It is drawn straight rather than
|
|
264
|
+
* curved on purpose: the curve is what the resolver produces, and drawing a
|
|
265
|
+
* straight chord is honestly "these are the knots" rather than a second, wrong
|
|
266
|
+
* spline evaluated here.
|
|
267
|
+
*/
|
|
268
|
+
export function waypointSegments(eyes: readonly Vec3[], sizes: readonly number[]): number[] {
|
|
269
|
+
const out: number[] = [];
|
|
270
|
+
const seg = (a: Vec3, b: Vec3): void => {
|
|
271
|
+
out.push(a[0], a[1], a[2], b[0], b[1], b[2]);
|
|
272
|
+
};
|
|
273
|
+
for (let i = 0; i < eyes.length; i++) {
|
|
274
|
+
const eye = eyes[i]!;
|
|
275
|
+
// One size PER EYE: each cross is clamped against its own screen depth,
|
|
276
|
+
// and a missing size is a degenerate (but finite) cross rather than NaN.
|
|
277
|
+
const size = Math.max(0, finite(sizes[i] ?? 0, 0));
|
|
278
|
+
seg([eye[0] - size, eye[1], eye[2]], [eye[0] + size, eye[1], eye[2]]);
|
|
279
|
+
seg([eye[0], eye[1] - size, eye[2]], [eye[0], eye[1] + size, eye[2]]);
|
|
280
|
+
seg([eye[0], eye[1], eye[2] - size], [eye[0], eye[1], eye[2] + size]);
|
|
281
|
+
}
|
|
282
|
+
for (let i = 1; i < eyes.length; i++) seg(eyes[i - 1]!, eyes[i]!);
|
|
283
|
+
return out;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/** How many floats `waypointSegments` produces for `n` waypoints: three cross
|
|
287
|
+
* axes each plus `n - 1` chords, two vertices of three floats per segment. */
|
|
288
|
+
export function waypointSegmentFloats(n: number): number {
|
|
289
|
+
return (n * 3 + Math.max(0, n - 1)) * 2 * 3;
|
|
290
|
+
}
|
|
291
|
+
|
|
128
292
|
/** Did any vertex move enough to be worth re-uploading the buffer? Half a
|
|
129
293
|
* design pixel, mirroring `quadMoved`'s gate for the same reason: this runs on
|
|
130
294
|
* every committed frame and a still playhead must cost nothing. */
|
|
@@ -170,3 +334,157 @@ export function borderDistance(
|
|
|
170
334
|
function finite(value: number, fallback: number): number {
|
|
171
335
|
return Number.isFinite(value) ? value : fallback;
|
|
172
336
|
}
|
|
337
|
+
|
|
338
|
+
// ── THE CAMERA AS AN OBJECT ─────────────────────────────────────────────────
|
|
339
|
+
//
|
|
340
|
+
// The framed rectangle at the plane is the DOCUMENT's model and stays: it is
|
|
341
|
+
// what is in shot, from any angle. What it could never do is say "here is the
|
|
342
|
+
// camera" at a size an author can read. A wide shot's rectangle dwarfs the
|
|
343
|
+
// canvas, and a camera a component drives has no plane to land on at all, so
|
|
344
|
+
// its rectangle used to be sized off the VIEWER's distance instead: constant
|
|
345
|
+
// on screen, which reads as a camera that is huge from far away and shrinks as
|
|
346
|
+
// you approach, the opposite of every object around it.
|
|
347
|
+
//
|
|
348
|
+
// So the camera also gets a BODY: a short lens pyramid in front of the eye and
|
|
349
|
+
// a box behind it, sized against the SCENE it lives in (a fraction of the
|
|
350
|
+
// design frame, or of a driven component's own content bounds) and clamped in
|
|
351
|
+
// screen pixels so it never vanishes and never covers the pane. Blender's
|
|
352
|
+
// camera object at a fixed display size, with the clamp Blender leaves to the
|
|
353
|
+
// user. The rig case and the driven case draw through the same pose, so the
|
|
354
|
+
// two cannot drift apart.
|
|
355
|
+
|
|
356
|
+
/** The body's length (eye to lens rectangle) as a fraction of the scene's
|
|
357
|
+
* extent. 0.06 of a 1920 frame is ~115 design px: about 6% of the pane at the
|
|
358
|
+
* default working view. */
|
|
359
|
+
export const CAMERA_DISPLAY_FRACTION = 0.06;
|
|
360
|
+
/** The body never projects shorter than this, so it stays a readable object
|
|
361
|
+
* from far away... */
|
|
362
|
+
export const CAMERA_MIN_PX = 24;
|
|
363
|
+
/** ...nor longer than this fraction of the pane's height, so up close it never
|
|
364
|
+
* covers the picture. */
|
|
365
|
+
export const CAMERA_MAX_PANE_FRACTION = 0.35;
|
|
366
|
+
/** The box behind the eye: its depth as a fraction of the body's length, and
|
|
367
|
+
* its cross-section as a fraction of the lens rectangle's half-extents. */
|
|
368
|
+
export const BODY_DEPTH_FRACTION = 0.5;
|
|
369
|
+
export const BODY_CROSS_FRACTION = 0.5;
|
|
370
|
+
/** How close a press has to land to the body's projected box, or to the framed
|
|
371
|
+
* rectangle's drawn border, in CSS px. The arms' own 14. */
|
|
372
|
+
export const BODY_GRAB_PX = 14;
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* The pose `ShotCamera` writes for a rig, orbit angles and roll included: the
|
|
376
|
+
* shot package's own `rigPose`, re-exported so this file stays the one import
|
|
377
|
+
* the gizmo needs. THE ONE PLACE the rig becomes a pose, so the body, the
|
|
378
|
+
* framed rectangle, the runtime's camera and `offTheRig` all agree.
|
|
379
|
+
*/
|
|
380
|
+
export const rigPose: (rig: CameraRig) => CameraPose = shotRigPose;
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* How long the body is, in world units.
|
|
384
|
+
*
|
|
385
|
+
* A fixed fraction of the scene's extent, then clamped between a floor and a
|
|
386
|
+
* ceiling measured in SCREEN pixels at the apex (`wpp` is world units per CSS
|
|
387
|
+
* px there), so between the clamps the body shrinks and grows with the scene
|
|
388
|
+
* exactly as the layers around it do. `maxWorld` is the rig case's cap: the
|
|
389
|
+
* lens rectangle has to stay in front of the design plane.
|
|
390
|
+
*/
|
|
391
|
+
export function cameraDisplayLength(
|
|
392
|
+
extent: number,
|
|
393
|
+
wpp: number,
|
|
394
|
+
paneHeightPx: number,
|
|
395
|
+
maxWorld: number = Number.POSITIVE_INFINITY,
|
|
396
|
+
): number {
|
|
397
|
+
const scene = finite(extent, 0);
|
|
398
|
+
let length = CAMERA_DISPLAY_FRACTION * (scene > 0 ? scene : 1);
|
|
399
|
+
const perPixel = finite(wpp, 0);
|
|
400
|
+
if (perPixel > 0) {
|
|
401
|
+
const height = finite(paneHeightPx, 0);
|
|
402
|
+
const floor = CAMERA_MIN_PX * perPixel;
|
|
403
|
+
const ceiling = height > 0 ? CAMERA_MAX_PANE_FRACTION * height * perPixel : Number.POSITIVE_INFINITY;
|
|
404
|
+
length = Math.min(Math.max(length, floor), Math.max(floor, ceiling));
|
|
405
|
+
}
|
|
406
|
+
if (Number.isFinite(maxWorld) && maxWorld > 0) length = Math.min(length, maxWorld);
|
|
407
|
+
return length > 0 && Number.isFinite(length) ? length : 1;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/** The body's vertices: the eye, the lens rectangle `length` ahead, the box
|
|
411
|
+
* behind the eye (front ring then back ring, TL TR BR BL each) and the
|
|
412
|
+
* up-marker on the lens rectangle's top edge. */
|
|
413
|
+
export interface CameraBodyShape {
|
|
414
|
+
apex: Vec3;
|
|
415
|
+
near: [Vec3, Vec3, Vec3, Vec3];
|
|
416
|
+
box: [Vec3, Vec3, Vec3, Vec3, Vec3, Vec3, Vec3, Vec3];
|
|
417
|
+
up: [Vec3, Vec3, Vec3];
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
export function cameraBodyShape(pose: CameraPose, length: number, frame: FrameSize): CameraBodyShape {
|
|
421
|
+
const L = finite(length, 1);
|
|
422
|
+
// The lens rectangle IS the frustum's cross-section `L` ahead, so it comes
|
|
423
|
+
// out of the same function the driven rectangle always did.
|
|
424
|
+
const lens = frustumShapeAhead(pose, L, frame);
|
|
425
|
+
const halfH = Math.abs(L * Math.tan((finite(pose.fovDeg, 35) * DEG) / 2));
|
|
426
|
+
const aspect = frame.height > 0 ? frame.width / frame.height : 1;
|
|
427
|
+
const bw = BODY_CROSS_FRACTION * halfH * aspect;
|
|
428
|
+
const bh = BODY_CROSS_FRACTION * halfH;
|
|
429
|
+
const depth = BODY_DEPTH_FRACTION * L;
|
|
430
|
+
const { eye, right, up, forward } = pose;
|
|
431
|
+
const at = (d: number, u: number, v: number): Vec3 => [
|
|
432
|
+
eye[0] - forward[0] * d + right[0] * u * bw + up[0] * v * bh,
|
|
433
|
+
eye[1] - forward[1] * d + right[1] * u * bw + up[1] * v * bh,
|
|
434
|
+
eye[2] - forward[2] * d + right[2] * u * bw + up[2] * v * bh,
|
|
435
|
+
];
|
|
436
|
+
return {
|
|
437
|
+
apex: lens.apex,
|
|
438
|
+
near: lens.corners,
|
|
439
|
+
box: [
|
|
440
|
+
at(0, -1, 1),
|
|
441
|
+
at(0, 1, 1),
|
|
442
|
+
at(0, 1, -1),
|
|
443
|
+
at(0, -1, -1),
|
|
444
|
+
at(depth, -1, 1),
|
|
445
|
+
at(depth, 1, 1),
|
|
446
|
+
at(depth, 1, -1),
|
|
447
|
+
at(depth, -1, -1),
|
|
448
|
+
],
|
|
449
|
+
up: lens.up,
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
/** The body's segments: four short edges apex-first, the lens rectangle, the
|
|
454
|
+
* twelve box edges, then the up-marker. */
|
|
455
|
+
export function cameraBodySegments(shape: CameraBodyShape): number[] {
|
|
456
|
+
const { apex, near, box, up } = shape;
|
|
457
|
+
const out: number[] = [];
|
|
458
|
+
const seg = (a: Vec3, b: Vec3): void => {
|
|
459
|
+
out.push(a[0], a[1], a[2], b[0], b[1], b[2]);
|
|
460
|
+
};
|
|
461
|
+
for (const corner of near) seg(apex, corner);
|
|
462
|
+
for (let i = 0; i < 4; i++) seg(near[i]!, near[(i + 1) % 4]!);
|
|
463
|
+
for (let i = 0; i < 4; i++) seg(box[i]!, box[(i + 1) % 4]!);
|
|
464
|
+
for (let i = 0; i < 4; i++) seg(box[4 + i]!, box[4 + ((i + 1) % 4)]!);
|
|
465
|
+
for (let i = 0; i < 4; i++) seg(box[i]!, box[4 + i]!);
|
|
466
|
+
seg(up[0], up[1]);
|
|
467
|
+
seg(up[1], up[2]);
|
|
468
|
+
seg(up[2], up[0]);
|
|
469
|
+
return out;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
/** How many floats `cameraBodySegments` writes: 23 segments. */
|
|
473
|
+
export const CAMERA_BODY_SEGMENT_FLOATS = 23 * 2 * 3;
|
|
474
|
+
|
|
475
|
+
/** The reach from the eye to the framed rectangle at the plane: the four long
|
|
476
|
+
* pyramid edges and the rectangle itself. The first eight segments of
|
|
477
|
+
* `frustumSegments`, without the up-marker the body now carries. */
|
|
478
|
+
export function frameSegments(shape: FrustumShape): number[] {
|
|
479
|
+
const { apex, corners } = shape;
|
|
480
|
+
const out: number[] = [];
|
|
481
|
+
const seg = (a: Vec3, b: Vec3): void => {
|
|
482
|
+
out.push(a[0], a[1], a[2], b[0], b[1], b[2]);
|
|
483
|
+
};
|
|
484
|
+
for (const corner of corners) seg(apex, corner);
|
|
485
|
+
for (let i = 0; i < 4; i++) seg(corners[i]!, corners[(i + 1) % 4]!);
|
|
486
|
+
return out;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
/** How many floats `frameSegments` writes: 8 segments. */
|
|
490
|
+
export const FRAME_SEGMENT_FLOATS = 8 * 2 * 3;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// The design tokens, rescoped from the stage document's ROOT to its furniture.
|
|
2
|
+
//
|
|
3
|
+
// The stage mounts the author's real components, and its root is theirs. The
|
|
4
|
+
// house token files declare their names on `:root`, so imported as-is they put
|
|
5
|
+
// a hundred house custom properties on the authored root. That root is also
|
|
6
|
+
// where a project's own theme lives: an unlayered house `--accent` or
|
|
7
|
+
// `--font-sans` beats a framework's layered theme variable of the same name,
|
|
8
|
+
// so the authored content previews in house values and exports in its own,
|
|
9
|
+
// which is the preview-versus-export split this lane refuses.
|
|
10
|
+
//
|
|
11
|
+
// So the stage takes the SAME two files as text and rewrites their selectors
|
|
12
|
+
// onto `[data-dailies-stage-furniture]`, the attribute every Dailies-owned
|
|
13
|
+
// layer in the stage carries (the overlay SVG, the token probe, the crash
|
|
14
|
+
// card). The authored root declares no house token at all.
|
|
15
|
+
//
|
|
16
|
+
// A second win comes free: every furniture element now DECLARES the tokens,
|
|
17
|
+
// so a var()-derived token (a fill wash, an alias) resolves on that element
|
|
18
|
+
// in its own theme instead of arriving pre-resolved from a dark root.
|
|
19
|
+
|
|
20
|
+
export const FURNITURE = "[data-dailies-stage-furniture]";
|
|
21
|
+
export const LIGHT_FURNITURE = `:root[data-dailies-studio-theme="light"] ${FURNITURE}`;
|
|
22
|
+
|
|
23
|
+
/** One token sheet's text with every root selector moved onto the furniture:
|
|
24
|
+
* `:root` becomes the furniture attribute, and the chrome's light scope
|
|
25
|
+
* (`:root[data-theme="light"]`) becomes the stage's (the studio theme on the
|
|
26
|
+
* stage root, then the furniture). Comments are dropped; they are for the
|
|
27
|
+
* source file, not the page. */
|
|
28
|
+
export function scopeToFurniture(css: string): string {
|
|
29
|
+
return css
|
|
30
|
+
.replace(/\/\*[\s\S]*?\*\//g, "")
|
|
31
|
+
.replace(/:root\[data-theme="light"\]/g, LIGHT_FURNITURE)
|
|
32
|
+
.replace(/:root(?=\s*[{,])/g, FURNITURE);
|
|
33
|
+
}
|