@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.
Files changed (432) hide show
  1. package/dist/.vite/manifest.json +382 -0
  2. package/dist/assets/AgentPanel-CQejLbiX.js +2 -0
  3. package/dist/assets/AgentPanel-DJEphah0.css +1 -0
  4. package/dist/assets/AgentQuestionDialog-BqkD0kXF.js +1 -0
  5. package/dist/assets/CodeStudio-Dv4ihHpz.js +23 -0
  6. package/dist/assets/CommentsPanel-B4yhhT1T.js +1 -0
  7. package/dist/assets/ComponentLibraryRail-Ch_dsAru.js +1 -0
  8. package/dist/assets/ComponentStage-BRhRotyH.js +1 -0
  9. package/dist/assets/CurvePane-BjFVabKX.css +1 -0
  10. package/dist/assets/CurvePane-R22WzllJ.js +1 -0
  11. package/dist/assets/ExportDialog-CWLQWTmG.js +2 -0
  12. package/dist/assets/FontPicker-DWKaYL7F.js +1 -0
  13. package/dist/assets/FontPicker-v0IOIArM.css +1 -0
  14. package/dist/assets/GenerateDrawer-Bh3SqDKt.js +2 -0
  15. package/dist/assets/InsertDrawer-Ce1fod1L.js +1 -0
  16. package/dist/assets/LibraryBrowser-D9sEGz5w.js +2 -0
  17. package/dist/assets/MakeItYoursSection-CMO4319_.js +2 -0
  18. package/dist/assets/MaterialGraphCanvas-BFzl4wWR.js +23 -0
  19. package/dist/assets/MaterialGraphCanvas-BIUD59ik.css +1 -0
  20. package/dist/assets/MaterialWorkspace-CqTWqaRA.js +14 -0
  21. package/dist/assets/PreferencesDialog-CBf9_OoD.js +1 -0
  22. package/dist/assets/PresetsSection-CUEaoCVU.js +1 -0
  23. package/dist/assets/SoundHistory-BeS8EW1h.js +1 -0
  24. package/dist/assets/SoundMode-BmcZru3i.js +3 -0
  25. package/dist/assets/StockSounds-DdAUGRYK.js +1 -0
  26. package/dist/assets/TemplateFieldSection-CaeXpLFo.js +1 -0
  27. package/dist/assets/VersionHistoryPanel-CxG6XhNP.js +1 -0
  28. package/dist/assets/board-B88EPuLO.css +1 -0
  29. package/dist/assets/board-CL-he7SL.js +3 -0
  30. package/dist/assets/components-0oOSPN0l.js +1 -0
  31. package/dist/assets/googleFontRanges-gp32wJMo.js +1 -0
  32. package/dist/assets/googleFonts-BNon6M7X.js +1 -0
  33. package/dist/assets/iconsAndAliases-DL7gXP5j.js +1863 -0
  34. package/dist/assets/index-4F5NQmI8.css +1 -0
  35. package/dist/assets/index-BGHQGV5z.js +117 -0
  36. package/dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  37. package/dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  38. package/dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  39. package/dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  40. package/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  41. package/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  42. package/dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  43. package/dist/assets/libraryModel-CpIwfFha.js +1 -0
  44. package/dist/assets/lucide-6iK64tTB.js +9319 -0
  45. package/dist/assets/motionStamp-CH-Hew4E.js +1 -0
  46. package/dist/assets/takeMeasure-Tdg0TxEi.js +1 -0
  47. package/dist/assets/webmcp-BsB9gxWC.js +2 -0
  48. package/dist/index.html +34 -3
  49. package/package.json +12 -9
  50. package/src/addFamilies.ts +66 -0
  51. package/src/api.ts +1631 -55
  52. package/src/app/App.tsx +977 -198
  53. package/src/app/lazyPanel.tsx +137 -0
  54. package/src/app/lazySurfaces.tsx +203 -0
  55. package/src/audio/index.tsx +41 -10
  56. package/src/audio/meter.ts +485 -0
  57. package/src/audio/meterMath.ts +273 -0
  58. package/src/audio/meterStore.ts +155 -0
  59. package/src/audio/offlineMix.ts +289 -0
  60. package/src/audio/preview.ts +928 -118
  61. package/src/bridge.ts +15 -5
  62. package/src/bridgeTypes.ts +1611 -36
  63. package/src/channels.ts +17 -32
  64. package/src/fonts/googleFonts.ts +4 -0
  65. package/src/hostApi.ts +174 -0
  66. package/src/icons.tsx +770 -0
  67. package/src/layerWords.ts +61 -0
  68. package/src/main.tsx +56 -4
  69. package/src/panels/ResizeHandle.tsx +33 -43
  70. package/src/panels/agent/AgentDots.tsx +36 -0
  71. package/src/panels/agent/AgentPanel.tsx +119 -43
  72. package/src/panels/agent/AgentQuestionDialog.tsx +202 -0
  73. package/src/panels/agent/agent.css +113 -97
  74. package/src/panels/agent/agentGate.ts +35 -0
  75. package/src/panels/code/CodeDefaultsPanel.tsx +345 -0
  76. package/src/panels/code/CodeStudio.tsx +373 -0
  77. package/src/panels/code/FileTree.tsx +265 -0
  78. package/src/panels/code/codeBufferGuard.ts +52 -0
  79. package/src/panels/code/codeParts.tsx +321 -0
  80. package/src/panels/comments/CommentComposer.tsx +239 -0
  81. package/src/panels/comments/CommentThread.tsx +346 -0
  82. package/src/panels/comments/CommentsPanel.tsx +336 -0
  83. package/src/panels/comments/InboxButton.tsx +131 -0
  84. package/src/panels/comments/MentionMenu.tsx +98 -0
  85. package/src/panels/comments/parts.tsx +171 -0
  86. package/src/panels/export/ExportDialog.tsx +919 -96
  87. package/src/panels/export/ExportScrim.tsx +57 -0
  88. package/src/panels/files/AssetsTab.tsx +656 -0
  89. package/src/panels/files/FilePanel.tsx +1466 -216
  90. package/src/panels/files/LayerMarks.tsx +40 -0
  91. package/src/panels/files/LeftColumn.tsx +37 -0
  92. package/src/panels/files/McpSection.tsx +690 -47
  93. package/src/panels/files/MissingAssetsNotice.tsx +60 -0
  94. package/src/panels/files/assetDrag.ts +79 -0
  95. package/src/panels/files/resourceParts.tsx +255 -0
  96. package/src/panels/fonts/FontPicker.tsx +762 -0
  97. package/src/panels/fonts/faceCache.ts +207 -0
  98. package/src/panels/fonts/fontPicker.css +271 -0
  99. package/src/panels/fonts/pickerModel.ts +265 -0
  100. package/src/panels/fonts/pickerRequest.ts +46 -0
  101. package/src/panels/header/AccountAvatar.tsx +76 -0
  102. package/src/panels/header/AgentChip.tsx +77 -0
  103. package/src/panels/header/AppMenu.tsx +213 -0
  104. package/src/panels/header/Header.tsx +564 -84
  105. package/src/panels/header/HistoryControls.tsx +31 -5
  106. package/src/panels/header/PresenceStack.tsx +329 -0
  107. package/src/panels/header/ProjectTitle.tsx +232 -0
  108. package/src/panels/header/ShareButton.tsx +59 -0
  109. package/src/panels/header/StatusBadges.tsx +358 -27
  110. package/src/panels/header/SyncDeletedDialog.tsx +88 -0
  111. package/src/panels/header/ZoomControls.tsx +46 -15
  112. package/src/panels/header/agentHandoff.ts +52 -0
  113. package/src/panels/header/leave.ts +26 -0
  114. package/src/panels/help/HelpSection.tsx +189 -163
  115. package/src/panels/insert/InsertDrawer.tsx +723 -0
  116. package/src/panels/insert/iconSet.ts +109 -0
  117. package/src/panels/inspector/ExposeDot.tsx +117 -0
  118. package/src/panels/inspector/FramingRows.tsx +314 -44
  119. package/src/panels/inspector/InspectorFooter.tsx +91 -0
  120. package/src/panels/inspector/InspectorHead.tsx +425 -0
  121. package/src/panels/inspector/InspectorPanel.tsx +408 -124
  122. package/src/panels/inspector/KeyframeDot.tsx +373 -0
  123. package/src/panels/inspector/KeyframeSection.tsx +257 -0
  124. package/src/panels/inspector/MarkerSection.tsx +55 -11
  125. package/src/panels/inspector/ParamRow.tsx +84 -53
  126. package/src/panels/inspector/RightColumn.tsx +152 -0
  127. package/src/panels/inspector/TimeSection.tsx +866 -0
  128. package/src/panels/inspector/animate/EaseControl.tsx +244 -0
  129. package/src/panels/inspector/animate/PresetsSection.tsx +135 -0
  130. package/src/panels/inspector/animate/ShotSection.tsx +562 -48
  131. package/src/panels/inspector/design/AlignRow.tsx +95 -31
  132. package/src/panels/inspector/design/AppearanceSection.tsx +118 -9
  133. package/src/panels/inspector/design/ClonerSection.tsx +323 -62
  134. package/src/panels/inspector/design/ComponentSection.tsx +50 -43
  135. package/src/panels/inspector/design/CornerSection.tsx +45 -14
  136. package/src/panels/inspector/design/DefinitionProps.tsx +315 -0
  137. package/src/panels/inspector/design/DefinitionSection.tsx +136 -0
  138. package/src/panels/inspector/design/DeviceSection.tsx +210 -0
  139. package/src/panels/inspector/design/FillSection.tsx +83 -51
  140. package/src/panels/inspector/design/FontField.tsx +196 -0
  141. package/src/panels/inspector/design/HtmlSection.tsx +23 -12
  142. package/src/panels/inspector/design/InstanceSection.tsx +373 -154
  143. package/src/panels/inspector/design/MaskSection.tsx +84 -0
  144. package/src/panels/inspector/design/MaterialSection.tsx +177 -0
  145. package/src/panels/inspector/design/MediaSection.tsx +273 -120
  146. package/src/panels/inspector/design/MeshSection.tsx +910 -82
  147. package/src/panels/inspector/design/PaintRows.tsx +550 -0
  148. package/src/panels/inspector/design/PlateStyleSection.tsx +177 -0
  149. package/src/panels/inspector/design/ShadowSection.tsx +221 -48
  150. package/src/panels/inspector/design/SplineFollowSection.tsx +235 -0
  151. package/src/panels/inspector/design/StrokeSection.tsx +228 -43
  152. package/src/panels/inspector/design/TemplateFieldSection.tsx +57 -0
  153. package/src/panels/inspector/design/TransformSection.tsx +244 -50
  154. package/src/panels/inspector/design/TypographySection.tsx +679 -110
  155. package/src/panels/inspector/layout.ts +295 -0
  156. package/src/panels/inspector/propValue.ts +199 -0
  157. package/src/panels/inspector/scene/CameraSection.tsx +232 -22
  158. package/src/panels/inspector/scene/EffectsSection.tsx +722 -71
  159. package/src/panels/inspector/scene/MakeItYoursSection.tsx +180 -0
  160. package/src/panels/inspector/scene/SceneDocSection.tsx +191 -0
  161. package/src/panels/inspector/scene/SceneSection.tsx +219 -44
  162. package/src/panels/inspector/scene/TransitionSection.tsx +523 -72
  163. package/src/panels/inspector/storyboard/StoryboardReferenceSection.tsx +593 -0
  164. package/src/panels/inspector/storyboard/VideoStill.tsx +120 -0
  165. package/src/panels/inspector/timeModel.ts +190 -0
  166. package/src/panels/inspector/useDocWrite.ts +438 -146
  167. package/src/panels/library/LibraryBrowser.tsx +435 -0
  168. package/src/panels/library/LibraryGrid.tsx +190 -0
  169. package/src/panels/library/LibraryPreviewPanel.tsx +349 -0
  170. package/src/panels/library/LibraryRail.tsx +84 -0
  171. package/src/panels/library/LibrarySoundPanel.tsx +293 -0
  172. package/src/panels/library/SoundHistory.tsx +245 -0
  173. package/src/panels/library/StockSounds.tsx +390 -0
  174. package/src/panels/library/libraryModel.ts +147 -0
  175. package/src/panels/library/stockSearch.ts +77 -0
  176. package/src/panels/maskMarks.tsx +117 -0
  177. package/src/panels/material/MaterialCommentNode.tsx +54 -0
  178. package/src/panels/material/MaterialGraphCanvas.tsx +861 -0
  179. package/src/panels/material/MaterialGraphMenu.tsx +45 -0
  180. package/src/panels/material/MaterialGroupNode.tsx +56 -0
  181. package/src/panels/material/MaterialLibrary.tsx +253 -0
  182. package/src/panels/material/MaterialNode.tsx +453 -0
  183. package/src/panels/material/MaterialNodePalette.tsx +349 -0
  184. package/src/panels/material/MaterialParameterControls.tsx +525 -0
  185. package/src/panels/material/MaterialRerouteNode.tsx +42 -0
  186. package/src/panels/material/MaterialWorkspace.tsx +501 -0
  187. package/src/panels/material/NodePreview.tsx +70 -0
  188. package/src/panels/material/flowModel.ts +441 -0
  189. package/src/panels/material/parameterValues.ts +231 -0
  190. package/src/panels/material/previewScheduler.ts +235 -0
  191. package/src/panels/material/reactFlow.css +6 -0
  192. package/src/panels/material/socketGlyph.ts +85 -0
  193. package/src/panels/material/viewportMemory.ts +58 -0
  194. package/src/panels/preferences/PreferencesDialog.tsx +215 -0
  195. package/src/panels/share/ShareComponentDialog.tsx +247 -0
  196. package/src/panels/stage/StageMenu.tsx +35 -5
  197. package/src/panels/stage/StagePanel.tsx +338 -23
  198. package/src/panels/stage/cellSlots.tsx +70 -0
  199. package/src/panels/storyboard/BoardCanvas.tsx +739 -0
  200. package/src/panels/storyboard/BoardCursors.tsx +158 -0
  201. package/src/panels/storyboard/BoardDropDialog.tsx +161 -0
  202. package/src/panels/storyboard/BoardPlan.tsx +42 -0
  203. package/src/panels/storyboard/ComponentSheet.tsx +187 -0
  204. package/src/panels/storyboard/ComponentStage.tsx +235 -0
  205. package/src/panels/storyboard/MiniSketch.tsx +173 -0
  206. package/src/panels/storyboard/PartPicker.tsx +64 -0
  207. package/src/panels/storyboard/PlanPanel.tsx +617 -0
  208. package/src/panels/storyboard/ReferencePreview.tsx +217 -0
  209. package/src/panels/storyboard/ShotBrief.tsx +360 -0
  210. package/src/panels/storyboard/ShotCard.tsx +251 -0
  211. package/src/panels/storyboard/StagePreview.tsx +348 -0
  212. package/src/panels/storyboard/StillThumbs.tsx +162 -0
  213. package/src/panels/storyboard/StoryboardView.tsx +79 -0
  214. package/src/panels/storyboard/board.css +1065 -0
  215. package/src/panels/storyboard/board.ts +12 -0
  216. package/src/panels/storyboard/boardClipboard.ts +111 -0
  217. package/src/panels/storyboard/boardOrder.ts +68 -0
  218. package/src/panels/storyboard/boardRows.tsx +425 -0
  219. package/src/panels/storyboard/liveCap.ts +90 -0
  220. package/src/panels/storyboard/plan.css +295 -0
  221. package/src/panels/storyboard/posterCache.ts +133 -0
  222. package/src/panels/storyboard/shotboard/ComponentPicker.tsx +373 -0
  223. package/src/panels/storyboard/shotboard/ImagePicker.tsx +145 -0
  224. package/src/panels/storyboard/shotboard/ShotBoard.tsx +292 -0
  225. package/src/panels/storyboard/shotboard/SketchCanvas.tsx +443 -0
  226. package/src/panels/storyboard/shotboard/SketchInspector.tsx +471 -0
  227. package/src/panels/storyboard/shotboard/SketchItem.tsx +240 -0
  228. package/src/panels/storyboard/shotboard/SketchLayers.tsx +130 -0
  229. package/src/panels/storyboard/shotboard/SketchPlay.tsx +108 -0
  230. package/src/panels/storyboard/shotboard/SketchStrip.tsx +178 -0
  231. package/src/panels/storyboard/shotboard/SketchToolFooter.tsx +99 -0
  232. package/src/panels/storyboard/shotboard/sketch.css +1392 -0
  233. package/src/panels/storyboard/shotboard/sketchModel.ts +219 -0
  234. package/src/panels/storyboard/storyboardDrop.ts +164 -0
  235. package/src/panels/studio/ComponentLibraryRail.tsx +346 -0
  236. package/src/panels/studio/ComponentSidePanel.tsx +355 -0
  237. package/src/panels/studio/ComponentStudio.tsx +243 -0
  238. package/src/panels/studio/ComponentsHome.tsx +318 -0
  239. package/src/panels/studio/ComponentsPreview.tsx +179 -0
  240. package/src/panels/studio/EveryUse.tsx +244 -0
  241. package/src/panels/studio/ThisUsePanel.tsx +679 -0
  242. package/src/panels/studio/componentParts.tsx +341 -0
  243. package/src/panels/studio/components.ts +6 -0
  244. package/src/panels/studio/newCodeComponent.ts +66 -0
  245. package/src/panels/timeline/AudioFxButton.tsx +290 -0
  246. package/src/panels/timeline/AudioLane.tsx +674 -85
  247. package/src/panels/timeline/BlockRow.tsx +154 -85
  248. package/src/panels/timeline/ChannelRow.tsx +378 -129
  249. package/src/panels/timeline/CurvePane.tsx +508 -0
  250. package/src/panels/timeline/Filmstrip.tsx +361 -0
  251. package/src/panels/timeline/GenerateDrawer.tsx +407 -0
  252. package/src/panels/timeline/KeyStretch.tsx +115 -0
  253. package/src/panels/timeline/LifespanRow.tsx +730 -47
  254. package/src/panels/timeline/MarkerLane.tsx +46 -8
  255. package/src/panels/timeline/PlayButton.tsx +91 -0
  256. package/src/panels/timeline/PropertyPicker.tsx +254 -0
  257. package/src/panels/timeline/ShotRow.tsx +400 -0
  258. package/src/panels/timeline/SoundMode.tsx +1406 -0
  259. package/src/panels/timeline/TimelineDock.tsx +2338 -272
  260. package/src/panels/timeline/TransportVolume.tsx +163 -0
  261. package/src/panels/timeline/beatRuler.ts +74 -0
  262. package/src/panels/timeline/curveModel.ts +500 -0
  263. package/src/panels/timeline/duckUnderVoice.ts +68 -0
  264. package/src/panels/timeline/keyframeMenu.ts +138 -0
  265. package/src/panels/timeline/labelWidth.ts +49 -0
  266. package/src/panels/timeline/marquee.ts +155 -0
  267. package/src/panels/timeline/model.ts +1860 -199
  268. package/src/panels/timeline/snap.ts +125 -43
  269. package/src/panels/timeline/staggerPreview.tsx +92 -0
  270. package/src/panels/timeline/takeMeasure.ts +72 -0
  271. package/src/panels/timeline/useLive.ts +48 -0
  272. package/src/panels/timeline/viewport.ts +234 -0
  273. package/src/panels/toolbar/BackChip.tsx +116 -0
  274. package/src/panels/toolbar/CameraViewBar.tsx +118 -49
  275. package/src/panels/toolbar/CanvasBar.tsx +117 -0
  276. package/src/panels/toolbar/InsertButton.tsx +38 -0
  277. package/src/panels/toolbar/IsolationTrail.tsx +156 -0
  278. package/src/panels/toolbar/PanelToggles.tsx +86 -0
  279. package/src/panels/toolbar/ShadingBar.tsx +119 -26
  280. package/src/panels/toolbar/ToolDockBar.tsx +329 -80
  281. package/src/panels/toolbar/ToolFooter.tsx +102 -0
  282. package/src/panels/toolbar/ViewModeBar.tsx +247 -38
  283. package/src/panels/toolbar/WorkPlaneBar.tsx +94 -0
  284. package/src/panels/toolbar/useAddRows.tsx +326 -0
  285. package/src/panels/toolbar/useDismiss.ts +122 -0
  286. package/src/panels/versions/VersionHistoryPanel.tsx +274 -0
  287. package/src/panels/versions/versionModel.ts +103 -0
  288. package/src/panels/virtualWindow.ts +271 -0
  289. package/src/shotTokens.css +151 -60
  290. package/src/stage/FrustumGizmo.tsx +504 -84
  291. package/src/stage/GridPlane.tsx +225 -16
  292. package/src/stage/NodePreviews.tsx +628 -0
  293. package/src/stage/PerfHud.tsx +437 -47
  294. package/src/stage/SplitRenderer.tsx +816 -169
  295. package/src/stage/StageApp.tsx +4274 -486
  296. package/src/stage/StageRootBoundary.tsx +114 -0
  297. package/src/stage/StageTools.tsx +651 -151
  298. package/src/stage/TransformGizmo.tsx +696 -0
  299. package/src/stage/adaptivePresentation.ts +145 -0
  300. package/src/stage/bridgeClient.ts +2522 -41
  301. package/src/stage/exportWorker.ts +9 -0
  302. package/src/stage/feed.ts +305 -14
  303. package/src/stage/fontPreview.ts +176 -0
  304. package/src/stage/frustumGeometry.ts +319 -1
  305. package/src/stage/furnitureTokens.ts +33 -0
  306. package/src/stage/gizmoMath.ts +508 -16
  307. package/src/stage/gpuTimer.ts +276 -0
  308. package/src/stage/instanceModules.ts +194 -33
  309. package/src/stage/interactions/move.ts +24 -5
  310. package/src/stage/isolation.ts +291 -33
  311. package/src/stage/jsSelfProfiler.ts +325 -0
  312. package/src/stage/main.tsx +116 -16
  313. package/src/stage/modalState.ts +222 -23
  314. package/src/stage/moduleEpoch.ts +60 -0
  315. package/src/stage/motionPathStage.ts +279 -0
  316. package/src/stage/motionPreview.ts +74 -0
  317. package/src/stage/overlays/Overlays.tsx +1112 -159
  318. package/src/stage/overlays/Rulers.tsx +495 -0
  319. package/src/stage/panes.ts +159 -10
  320. package/src/stage/project.ts +68 -3
  321. package/src/stage/renderScaleController.ts +730 -0
  322. package/src/stage/rulers.ts +129 -0
  323. package/src/stage/sceneExtent.ts +75 -0
  324. package/src/stage/shading.ts +20 -0
  325. package/src/stage/splineStage.ts +632 -0
  326. package/src/stage/stagePerformanceTelemetry.ts +717 -0
  327. package/src/stage/stageTheme.ts +36 -0
  328. package/src/stage/stageWarmup.ts +11 -0
  329. package/src/stage/textAutoSize.ts +124 -0
  330. package/src/stage/tier1Export.ts +641 -0
  331. package/src/stage/tokenColor.ts +14 -9
  332. package/src/stage/view.ts +56 -9
  333. package/src/stage/workingView.ts +277 -33
  334. package/src/state/accountPrefs.ts +261 -0
  335. package/src/state/agentActions.ts +173 -15
  336. package/src/state/agentActivity.ts +198 -0
  337. package/src/state/agentQuestion.ts +239 -0
  338. package/src/state/bootOpen.ts +42 -0
  339. package/src/state/cameraVerbs.ts +139 -0
  340. package/src/state/clientId.ts +6 -1
  341. package/src/state/comments.ts +1099 -0
  342. package/src/state/context.tsx +19 -1
  343. package/src/state/editorPrefs.ts +220 -0
  344. package/src/state/errorReports.ts +121 -0
  345. package/src/state/fieldWrite.ts +161 -0
  346. package/src/state/fontRecents.ts +70 -0
  347. package/src/state/fonts.ts +656 -0
  348. package/src/state/graphClipboard.ts +414 -0
  349. package/src/state/imageThumbs.ts +216 -0
  350. package/src/state/insert.ts +444 -67
  351. package/src/state/isolationTrail.ts +92 -0
  352. package/src/state/keyMoves.ts +134 -0
  353. package/src/state/keyframeClipboard.ts +177 -0
  354. package/src/state/keymap.ts +1153 -117
  355. package/src/state/layoutPrefs.ts +272 -0
  356. package/src/state/layouts.ts +205 -0
  357. package/src/state/measureMedia.ts +167 -0
  358. package/src/state/menu.ts +2341 -28
  359. package/src/state/motionStamp.ts +7 -0
  360. package/src/state/panelSize.ts +375 -5
  361. package/src/state/pendingChanges.ts +119 -0
  362. package/src/state/playHold.ts +78 -0
  363. package/src/state/playbackPreparation.ts +562 -0
  364. package/src/state/posterCapture.ts +242 -0
  365. package/src/state/presence.ts +254 -0
  366. package/src/state/projectComponents.ts +160 -0
  367. package/src/state/renderEvents.ts +298 -18
  368. package/src/state/runtimeErrors.ts +46 -0
  369. package/src/state/selection.ts +12 -0
  370. package/src/state/shortcuts.ts +1606 -0
  371. package/src/state/sketchGuide.ts +51 -0
  372. package/src/state/splineRefs.ts +87 -0
  373. package/src/state/stageHealth.ts +259 -0
  374. package/src/state/stageWatchdog.ts +47 -0
  375. package/src/state/stillStage.ts +330 -0
  376. package/src/state/stillThumbs.ts +474 -0
  377. package/src/state/store.ts +23591 -2982
  378. package/src/state/storyboardModel.ts +528 -0
  379. package/src/state/sync.ts +1257 -0
  380. package/src/state/syncCache.ts +159 -0
  381. package/src/state/triangles.ts +13 -0
  382. package/src/state/types.ts +1698 -55
  383. package/src/state/unsavedGuard.ts +49 -0
  384. package/src/state/viewMode.ts +200 -0
  385. package/src/state/webmcp.ts +1128 -0
  386. package/src/state/workspace.ts +1147 -0
  387. package/src/styles/assets-tab.css +304 -0
  388. package/src/styles/canvas.css +545 -0
  389. package/src/styles/comments.css +1435 -0
  390. package/src/styles/controls.css +162 -0
  391. package/src/styles/dialogs.css +390 -0
  392. package/src/styles/insert-drawer.css +586 -0
  393. package/src/styles/inspector-board.css +207 -0
  394. package/src/styles/inspector-object.css +486 -0
  395. package/src/styles/inspector-shot.css +252 -0
  396. package/src/styles/inspector.css +360 -0
  397. package/src/styles/left-column.css +1628 -0
  398. package/src/styles/library-preview.css +575 -0
  399. package/src/styles/library.css +512 -0
  400. package/src/styles/modes/code.css +569 -0
  401. package/src/styles/modes/component.css +1561 -0
  402. package/src/styles/modes/material.css +1201 -0
  403. package/src/styles/modes/storyboard.css +518 -0
  404. package/src/styles/share-component.css +49 -0
  405. package/src/styles/shell.css +653 -0
  406. package/src/styles/shot-brief.css +360 -0
  407. package/src/styles/states.css +76 -0
  408. package/src/styles/sync.css +380 -0
  409. package/src/styles/timeline-graph.css +384 -0
  410. package/src/styles/timeline-meters.css +89 -0
  411. package/src/styles/timeline-rows.css +1959 -0
  412. package/src/styles/timeline-sound.css +1003 -0
  413. package/src/styles/timeline.css +754 -0
  414. package/src/styles/tool-footer.css +525 -0
  415. package/src/styles/topbar.css +886 -0
  416. package/src/styles/versions.css +262 -0
  417. package/src/styles.css +72 -2921
  418. package/src/tools.ts +108 -23
  419. package/dist/assets/index-B7notge7.css +0 -1
  420. package/dist/assets/index-BBE6Ta9L.js +0 -52
  421. package/src/panels/files/icons.tsx +0 -118
  422. package/src/panels/header/DocSwitcher.tsx +0 -85
  423. package/src/panels/header/TransportBar.tsx +0 -86
  424. package/src/panels/inspector/animate/BlockTiming.tsx +0 -341
  425. package/src/panels/inspector/animate/DuringBlocks.tsx +0 -85
  426. package/src/panels/inspector/animate/InOutPresets.tsx +0 -57
  427. package/src/panels/inspector/animate/ResolvedChannels.tsx +0 -150
  428. package/src/panels/inspector/animate/useBlocks.ts +0 -43
  429. package/src/panels/material/MaterialPicker.tsx +0 -172
  430. package/src/panels/timeline/SceneStrip.tsx +0 -145
  431. package/src/panels/toolbar/AddMenu.tsx +0 -230
  432. 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
- const cy = -finite(rig.framing.y, 0);
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
+ }