@volter/editor-core 0.5.57

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 (719) hide show
  1. package/BUNDLED_NOTICES +1527 -0
  2. package/LICENSE +686 -0
  3. package/LICENSE-APACHE +202 -0
  4. package/NOTICE +18 -0
  5. package/README.md +24 -0
  6. package/dist/build/chunk-JS4D4XZ3.js +175 -0
  7. package/dist/build/chunk-JS4D4XZ3.js.map +7 -0
  8. package/dist/build/vite-plugin-product-contributions.js +100 -0
  9. package/dist/build/vite-plugin-product-contributions.js.map +7 -0
  10. package/dist/build/vite-plugin-shared-react.js +25 -0
  11. package/dist/build/vite-plugin-shared-react.js.map +7 -0
  12. package/dist/build/vite-plugin-shared-three.js +86 -0
  13. package/dist/build/vite-plugin-shared-three.js.map +7 -0
  14. package/dist/server/chunk-KMJC7AGO.js +98 -0
  15. package/dist/server/chunk-KMJC7AGO.js.map +7 -0
  16. package/dist/server/chunk-PSILUMGS.js +46 -0
  17. package/dist/server/chunk-PSILUMGS.js.map +7 -0
  18. package/dist/server/frame-proxy.js +255 -0
  19. package/dist/server/frame-proxy.js.map +7 -0
  20. package/dist/server/open-browser.js +53 -0
  21. package/dist/server/open-browser.js.map +7 -0
  22. package/dist/server/process-shutdown.js +127 -0
  23. package/dist/server/process-shutdown.js.map +7 -0
  24. package/dist/server/session-registry.js +141 -0
  25. package/dist/server/session-registry.js.map +7 -0
  26. package/dist/server/spawn-opener.js +11 -0
  27. package/dist/server/spawn-opener.js.map +7 -0
  28. package/dist/server/worktree-identity.js +11 -0
  29. package/dist/server/worktree-identity.js.map +7 -0
  30. package/dist-server/packaged.mjs +88816 -0
  31. package/package.json +118 -0
  32. package/scripts/build-plugins.mjs +14 -0
  33. package/scripts/build-server.mjs +26 -0
  34. package/scripts/build-session.mjs +9 -0
  35. package/server/account-credentials.ts +60 -0
  36. package/server/account-service.ts +1434 -0
  37. package/server/adapter-region-includes.ts +47 -0
  38. package/server/asset-catalog-v2.ts +175 -0
  39. package/server/asset-history-snapshots.ts +196 -0
  40. package/server/asset-ledger-store.ts +195 -0
  41. package/server/asset-library-routes.ts +1595 -0
  42. package/server/blender-wasm-artifact.ts +430 -0
  43. package/server/boot-timings.ts +106 -0
  44. package/server/canonical-path.ts +50 -0
  45. package/server/checkout-workspace-preflight.ts +349 -0
  46. package/server/cloud-asset-catalog.ts +158 -0
  47. package/server/coding-inference-launch.ts +237 -0
  48. package/server/collaboration-account-client.ts +202 -0
  49. package/server/collaboration-attribution.ts +122 -0
  50. package/server/collaboration-session.ts +934 -0
  51. package/server/comfyui-bridge.ts +248 -0
  52. package/server/console-ledger.ts +499 -0
  53. package/server/creation-site-transform.ts +304 -0
  54. package/server/creation-site-write.ts +648 -0
  55. package/server/data-file-serialize.ts +158 -0
  56. package/server/editor-brand-html.ts +72 -0
  57. package/server/editor-control-socket.ts +366 -0
  58. package/server/editor-server-options.ts +190 -0
  59. package/server/editor-server.ts +1483 -0
  60. package/server/editor-sse.ts +352 -0
  61. package/server/engine-provenance.ts +169 -0
  62. package/server/engine-source-restart.ts +117 -0
  63. package/server/frame-bridge.ts +115 -0
  64. package/server/frame-proxy.ts +490 -0
  65. package/server/frame-workbench.ts +259 -0
  66. package/server/frontend-handoff.ts +229 -0
  67. package/server/game-globals-shadow.ts +113 -0
  68. package/server/gameplay-session-retention.ts +149 -0
  69. package/server/gameplay-sessions.ts +123 -0
  70. package/server/generation-jobs.ts +201 -0
  71. package/server/generation-reconciler.ts +137 -0
  72. package/server/generative-execution-context.ts +59 -0
  73. package/server/git-workflow.ts +612 -0
  74. package/server/harness-chat-caller.ts +36 -0
  75. package/server/harness-chat-service.ts +1681 -0
  76. package/server/idle-shutdown.ts +170 -0
  77. package/server/js-profiling-policy.ts +52 -0
  78. package/server/launcher-settings.ts +84 -0
  79. package/server/local-asset-catalog.ts +410 -0
  80. package/server/managed-account-defaults.ts +22 -0
  81. package/server/mock-control-plane.ts +540 -0
  82. package/server/model-import-conversion.ts +345 -0
  83. package/server/native-credential-store.ts +162 -0
  84. package/server/open-browser.ts +118 -0
  85. package/server/packaged.ts +1192 -0
  86. package/server/play-stall.ts +126 -0
  87. package/server/process-shutdown.ts +218 -0
  88. package/server/product-presets.ts +55 -0
  89. package/server/project-build-artifact.ts +95 -0
  90. package/server/project-components.ts +100 -0
  91. package/server/project-dependency-invalidation.ts +114 -0
  92. package/server/project-file-scan.ts +235 -0
  93. package/server/project-hmr-files.ts +215 -0
  94. package/server/project-install-roots.ts +210 -0
  95. package/server/project-kinds.ts +71 -0
  96. package/server/project-mcp-servers.ts +82 -0
  97. package/server/project-module-freshness.ts +109 -0
  98. package/server/project-module-instance.ts +375 -0
  99. package/server/project-optimize-deps-entries.ts +827 -0
  100. package/server/project-output-writer.ts +679 -0
  101. package/server/project-package-origin.ts +63 -0
  102. package/server/project-root-surface.ts +831 -0
  103. package/server/project-scratch-path.ts +47 -0
  104. package/server/project-script-hmr.ts +619 -0
  105. package/server/project-serving-plugins.ts +236 -0
  106. package/server/project-tools.ts +653 -0
  107. package/server/project-validation.ts +250 -0
  108. package/server/project-verbs.ts +127 -0
  109. package/server/project-view.ts +52 -0
  110. package/server/project-watch.ts +1134 -0
  111. package/server/project-work-coordinator.ts +288 -0
  112. package/server/provider-credentials.ts +331 -0
  113. package/server/recent-projects-store.ts +98 -0
  114. package/server/redact-secrets.ts +71 -0
  115. package/server/repository-presence.ts +267 -0
  116. package/server/routes/account.ts +357 -0
  117. package/server/routes/agents.ts +60 -0
  118. package/server/routes/assets.ts +154 -0
  119. package/server/routes/build.ts +13 -0
  120. package/server/routes/collaboration.ts +595 -0
  121. package/server/routes/configurations.ts +419 -0
  122. package/server/routes/context.ts +264 -0
  123. package/server/routes/control-plane.ts +1811 -0
  124. package/server/routes/logs.ts +272 -0
  125. package/server/routes/project-identity.ts +302 -0
  126. package/server/routes/project-open.ts +429 -0
  127. package/server/routes/project-source.ts +686 -0
  128. package/server/routes/project-state.ts +383 -0
  129. package/server/routes/relay.ts +1029 -0
  130. package/server/routes/route-helpers.ts +29 -0
  131. package/server/routes/served-modules.ts +138 -0
  132. package/server/routes/session-tabs.ts +196 -0
  133. package/server/routes/settings.ts +121 -0
  134. package/server/routes/share-control.ts +486 -0
  135. package/server/routes/themes.ts +116 -0
  136. package/server/routes/tools.ts +230 -0
  137. package/server/routes/worktrees.ts +595 -0
  138. package/server/scoped-game-css.ts +461 -0
  139. package/server/server-utils.ts +1194 -0
  140. package/server/session-product.ts +112 -0
  141. package/server/session-registry.ts +230 -0
  142. package/server/share-claims.ts +138 -0
  143. package/server/share-host.ts +526 -0
  144. package/server/share-session-gateway.ts +1362 -0
  145. package/server/share-tunnel.ts +123 -0
  146. package/server/spawn-opener.ts +74 -0
  147. package/server/support/play/log-format.ts +76 -0
  148. package/server/support/play/session-record.ts +199 -0
  149. package/server/support/project/build-discipline.ts +718 -0
  150. package/server/support/project/inspection-node.ts +119 -0
  151. package/server/support/project/log-naming.ts +54 -0
  152. package/server/support/project/provenance.ts +290 -0
  153. package/server/support/project/run-name.ts +18 -0
  154. package/server/support/project/session-journal.ts +830 -0
  155. package/server/support/project/shared.ts +327 -0
  156. package/server/tab-bootstrap.ts +62 -0
  157. package/server/tab-heartbeat.ts +477 -0
  158. package/server/tab-lifecycle.ts +550 -0
  159. package/server/tab-presence.ts +1508 -0
  160. package/server/team-agent-mirror.ts +95 -0
  161. package/server/twin-auth.ts +138 -0
  162. package/server/vendored-lock-recorder.ts +968 -0
  163. package/server/worktree-identity.ts +121 -0
  164. package/server/worktree-management.ts +398 -0
  165. package/server/worktree-retention.d.mts +13 -0
  166. package/server/worktree-retention.mjs +205 -0
  167. package/src/EditorContext.tsx +169 -0
  168. package/src/account.ts +333 -0
  169. package/src/action-registry.ts +532 -0
  170. package/src/active-product.ts +74 -0
  171. package/src/active-project.ts +155 -0
  172. package/src/adapter-editor-config.ts +25 -0
  173. package/src/adapter-observation.ts +49 -0
  174. package/src/animation/stage-transport.ts +379 -0
  175. package/src/animation/three-clips-subject.ts +172 -0
  176. package/src/api/asset-library-wire.ts +45 -0
  177. package/src/api/assets.ts +365 -0
  178. package/src/api/base.ts +10 -0
  179. package/src/api/build.ts +99 -0
  180. package/src/api/git-wire.ts +56 -0
  181. package/src/api/logs.ts +92 -0
  182. package/src/api/project-identity.ts +74 -0
  183. package/src/api/project-open.ts +355 -0
  184. package/src/api/project-source.ts +162 -0
  185. package/src/api/project-state.ts +107 -0
  186. package/src/api/relay.ts +268 -0
  187. package/src/api/settings.ts +36 -0
  188. package/src/api/themes.ts +45 -0
  189. package/src/api/worktrees.ts +257 -0
  190. package/src/asset-compare-core.ts +171 -0
  191. package/src/asset-compare.ts +294 -0
  192. package/src/asset-editor-context.tsx +100 -0
  193. package/src/asset-events.ts +97 -0
  194. package/src/asset-inspector-actions.ts +87 -0
  195. package/src/asset-preview-framing.ts +357 -0
  196. package/src/asset-preview.ts +2802 -0
  197. package/src/asset-selection-viewer-registry.ts +113 -0
  198. package/src/asset-selection.ts +133 -0
  199. package/src/asset-workflow/asset-capabilities.ts +344 -0
  200. package/src/asset-workflow/asset-import-jobs.ts +106 -0
  201. package/src/asset-workflow/asset-ledger-backend.ts +126 -0
  202. package/src/asset-workflow/asset-ledger.ts +156 -0
  203. package/src/asset-workflow/asset-materialization-report.ts +140 -0
  204. package/src/asset-workflow/asset-pack-manifest.ts +320 -0
  205. package/src/asset-workflow/asset-types.ts +142 -0
  206. package/src/asset-workflow/asset-workflow-quality.ts +61 -0
  207. package/src/asset-workflow/audio-preview-player.ts +193 -0
  208. package/src/asset-workflow/audio-waveform.ts +22 -0
  209. package/src/asset-workflow/cloud-asset-client.ts +263 -0
  210. package/src/asset-workflow/folder-preview.ts +345 -0
  211. package/src/asset-workflow/hosted-asset-materialization.ts +236 -0
  212. package/src/asset-workflow/image-view-scale.ts +32 -0
  213. package/src/asset-workflow/import-contract.ts +124 -0
  214. package/src/asset-workflow/ledger-write-lock.ts +244 -0
  215. package/src/asset-workflow/model-inspection.ts +818 -0
  216. package/src/asset-workflow/pixi-spritesheet.ts +197 -0
  217. package/src/asset-workflow/preview-resource-lifetime.ts +44 -0
  218. package/src/asset-workflow/project-asset-commands.ts +23 -0
  219. package/src/asset-workflow/project-asset-health.ts +139 -0
  220. package/src/asset-workflow/project-asset-operations.ts +154 -0
  221. package/src/asset-workflow/project-asset-roots.ts +68 -0
  222. package/src/asset-workflow/project-content.ts +288 -0
  223. package/src/asset-workflow/project-source-index.ts +550 -0
  224. package/src/asset-workflow/thumbnail-system.ts +256 -0
  225. package/src/authoring/active-adapter.ts +199 -0
  226. package/src/authoring/active-systems.ts +422 -0
  227. package/src/authoring/adapter-key.ts +18 -0
  228. package/src/authoring/authoring-asset-url.ts +27 -0
  229. package/src/authoring/bootstrap-state.ts +49 -0
  230. package/src/authoring/boundary-authoring-adapter.ts +184 -0
  231. package/src/authoring/breakpoint-state.ts +43 -0
  232. package/src/authoring/canvas-scene-guides.ts +76 -0
  233. package/src/authoring/component-instance-root.ts +171 -0
  234. package/src/authoring/composite-authoring-adapter.ts +2110 -0
  235. package/src/authoring/consumer-actions.ts +520 -0
  236. package/src/authoring/css-numeric-style.ts +97 -0
  237. package/src/authoring/design-time-layers.ts +849 -0
  238. package/src/authoring/design-time-mount-registry.ts +235 -0
  239. package/src/authoring/design-time-settle.ts +343 -0
  240. package/src/authoring/edit-mode-authoring.ts +619 -0
  241. package/src/authoring/eyedropper-session.ts +60 -0
  242. package/src/authoring/instance-source-menu-register.ts +13 -0
  243. package/src/authoring/instance-source-menu.ts +135 -0
  244. package/src/authoring/layered-pick.ts +183 -0
  245. package/src/authoring/live-gesture-lock.ts +50 -0
  246. package/src/authoring/live-object-transform.ts +62 -0
  247. package/src/authoring/mount-failure-report.ts +154 -0
  248. package/src/authoring/mounted-root-subjects.ts +144 -0
  249. package/src/authoring/no-authoring-adapter.ts +55 -0
  250. package/src/authoring/null-inspection-subjects.tsx +75 -0
  251. package/src/authoring/object3d-document-persistence.ts +106 -0
  252. package/src/authoring/object3d-document-session-registry.ts +120 -0
  253. package/src/authoring/object3d-document-session.ts +1326 -0
  254. package/src/authoring/object3d-gesture-controller.ts +113 -0
  255. package/src/authoring/panel-authoring.ts +121 -0
  256. package/src/authoring/prefab-instance-inspector-section.tsx +237 -0
  257. package/src/authoring/prefab-instance-section-model.ts +55 -0
  258. package/src/authoring/project-authoring-session.ts +105 -0
  259. package/src/authoring/provenance.ts +99 -0
  260. package/src/authoring/quarks-particle-systems.ts +19 -0
  261. package/src/authoring/react-canvas-navigation.ts +255 -0
  262. package/src/authoring/react-design-canvas-style.ts +20 -0
  263. package/src/authoring/react-story-board.ts +937 -0
  264. package/src/authoring/selection-scope.ts +195 -0
  265. package/src/authoring/shell-document-ops.ts +169 -0
  266. package/src/authoring/shell-object3d-document-write-policy.ts +108 -0
  267. package/src/authoring/shell-viewport-policy.ts +48 -0
  268. package/src/authoring/source-object3d-authoring-adapter.ts +526 -0
  269. package/src/authoring/stories-scope.ts +35 -0
  270. package/src/authoring/story-board-chrome-fit.ts +107 -0
  271. package/src/authoring/story-board-presentation.ts +111 -0
  272. package/src/authoring/three-projection-core.ts +226 -0
  273. package/src/authoring/viewport-pick-context.ts +40 -0
  274. package/src/authoring/viewport-raycast.ts +240 -0
  275. package/src/authoring/viewport-tool-context.ts +73 -0
  276. package/src/authoring/world-canvas-viewport-state.ts +35 -0
  277. package/src/authoring/world-hidden-viewport.ts +152 -0
  278. package/src/authoring/world-pan-state.ts +198 -0
  279. package/src/authoring/world-session-state.ts +101 -0
  280. package/src/authoring/write-pipe.ts +173 -0
  281. package/src/availability-tick.ts +66 -0
  282. package/src/bitmap-label.ts +120 -0
  283. package/src/blender-tab-metrics.ts +161 -0
  284. package/src/board-open-actions.ts +20 -0
  285. package/src/boot-routing.ts +391 -0
  286. package/src/build-identity.ts +15 -0
  287. package/src/bytes-codec.ts +62 -0
  288. package/src/camera-authoring.ts +175 -0
  289. package/src/cancellation-reason.ts +58 -0
  290. package/src/canvas-preview-frames.ts +482 -0
  291. package/src/capture-camera-pose.ts +77 -0
  292. package/src/chrome-registry.ts +159 -0
  293. package/src/chrome-slot-registry.ts +91 -0
  294. package/src/collaboration-client.ts +264 -0
  295. package/src/collaboration-presence.ts +41 -0
  296. package/src/command-dispatch.ts +19 -0
  297. package/src/command-listener.ts +2743 -0
  298. package/src/command-registry.ts +70 -0
  299. package/src/component-board-registry.ts +205 -0
  300. package/src/component-states-registry.ts +200 -0
  301. package/src/components/AgentPresentationNotice.tsx +75 -0
  302. package/src/components/AlignToolbar.tsx +204 -0
  303. package/src/components/AppRoot.tsx +394 -0
  304. package/src/components/ApplicationMenus.tsx +415 -0
  305. package/src/components/AssetBrowser.tsx +2843 -0
  306. package/src/components/AssetEditorShell.tsx +216 -0
  307. package/src/components/AssetInspectorToolSection.tsx +124 -0
  308. package/src/components/BoardRulers.tsx +354 -0
  309. package/src/components/CameraInfo.tsx +81 -0
  310. package/src/components/CanvasSceneViewport.tsx +556 -0
  311. package/src/components/CapabilityCoverageSection.tsx +185 -0
  312. package/src/components/CenterDocuments.tsx +22 -0
  313. package/src/components/ChromeSlot.tsx +20 -0
  314. package/src/components/CodeView.tsx +470 -0
  315. package/src/components/CollaborationHeaderControl.css +74 -0
  316. package/src/components/CompactInspectorCard.tsx +190 -0
  317. package/src/components/CompactInspectorShell.tsx +39 -0
  318. package/src/components/ConsolePanel.css +55 -0
  319. package/src/components/ConsolePanel.tsx +270 -0
  320. package/src/components/DefaultEditorLayout.tsx +106 -0
  321. package/src/components/DocumentHeaderStrip.tsx +96 -0
  322. package/src/components/DocumentShelfRail.tsx +45 -0
  323. package/src/components/DocumentThumbnail.tsx +345 -0
  324. package/src/components/EditorLeaseGuard.tsx +372 -0
  325. package/src/components/ErrorBanner.tsx +123 -0
  326. package/src/components/FolderPreviewTile.tsx +159 -0
  327. package/src/components/GameHierarchy.tsx +3842 -0
  328. package/src/components/GameplaySessionTimeline.tsx +295 -0
  329. package/src/components/InspectionProjection.tsx +968 -0
  330. package/src/components/Inspector.tsx +233 -0
  331. package/src/components/InspectorCanvasPreview.tsx +35 -0
  332. package/src/components/InspectorFieldsSection.tsx +290 -0
  333. package/src/components/InspectorObjectPreview.tsx +57 -0
  334. package/src/components/InspectorStoriesSection.tsx +92 -0
  335. package/src/components/InspectorToolSection.tsx +96 -0
  336. package/src/components/InspectorTransformSection.tsx +245 -0
  337. package/src/components/LightExplorerPanel.tsx +433 -0
  338. package/src/components/MediaProperties.tsx +145 -0
  339. package/src/components/NonThreeAuthoringBootstrap.tsx +19 -0
  340. package/src/components/Object3DDocumentToolbar.css +100 -0
  341. package/src/components/Object3DDocumentToolbar.tsx +454 -0
  342. package/src/components/Object3DDocumentViewport.tsx +58 -0
  343. package/src/components/ProjectHeader.css +617 -0
  344. package/src/components/ProjectHeader.tsx +328 -0
  345. package/src/components/ProjectLayout.tsx +249 -0
  346. package/src/components/ReactCanvasControls.tsx +284 -0
  347. package/src/components/RootSelectionOverlay.tsx +3162 -0
  348. package/src/components/RootTextEditor.tsx +79 -0
  349. package/src/components/SaveStatus.tsx +70 -0
  350. package/src/components/StageHost.tsx +1954 -0
  351. package/src/components/StageOverlays.tsx +21 -0
  352. package/src/components/StartupErrorScreen.tsx +76 -0
  353. package/src/components/StartupLoadingScreen.tsx +65 -0
  354. package/src/components/StatsOverlay.tsx +78 -0
  355. package/src/components/SurfaceStateOverlay.tsx +24 -0
  356. package/src/components/ToolContributionSurfaces.tsx +65 -0
  357. package/src/components/ToolHost.tsx +370 -0
  358. package/src/components/ToolObject3DPreview.tsx +39 -0
  359. package/src/components/Toolbar.tsx +595 -0
  360. package/src/components/TransientHint.tsx +44 -0
  361. package/src/components/TransportStrip.tsx +174 -0
  362. package/src/components/VersionControlSection.tsx +470 -0
  363. package/src/components/VgaiLogo.css +83 -0
  364. package/src/components/VgaiLogo.tsx +35 -0
  365. package/src/components/ViewportControlsHint.tsx +60 -0
  366. package/src/components/ViewportFurniture.tsx +401 -0
  367. package/src/components/ViewportOverlay.tsx +145 -0
  368. package/src/components/ViewportOverlaysMenu.tsx +153 -0
  369. package/src/components/ViewportShadingMenu.tsx +300 -0
  370. package/src/components/ViewportViewMenu.tsx +101 -0
  371. package/src/components/WorkspaceDocumentSurface.tsx +204 -0
  372. package/src/components/WorkspaceUtilitySurface.tsx +22 -0
  373. package/src/components/WorktreeSwitcher.css +239 -0
  374. package/src/components/WorktreeSwitcher.tsx +890 -0
  375. package/src/components/account-documents.tsx +1162 -0
  376. package/src/components/asset-documents.tsx +812 -0
  377. package/src/components/asset-editor-persistence.ts +216 -0
  378. package/src/components/asset-selection-section.tsx +535 -0
  379. package/src/components/asset-thumbnails.tsx +312 -0
  380. package/src/components/asset-viewers/AudioViewer.tsx +201 -0
  381. package/src/components/asset-viewers/EntityModelDocument.tsx +122 -0
  382. package/src/components/asset-viewers/EnvironmentAssetDocument.tsx +440 -0
  383. package/src/components/asset-viewers/GenericJsonViewer.tsx +102 -0
  384. package/src/components/asset-viewers/ImageViewer.tsx +300 -0
  385. package/src/components/asset-viewers/JsonAssetDocument.tsx +93 -0
  386. package/src/components/asset-viewers/LiveModuleDocument.tsx +417 -0
  387. package/src/components/asset-viewers/LutAssetDocument.tsx +444 -0
  388. package/src/components/asset-viewers/ModelAssetDocument.tsx +105 -0
  389. package/src/components/asset-viewers/Object3DPreview.tsx +359 -0
  390. package/src/components/asset-viewers/OnlineAssetDetail.tsx +421 -0
  391. package/src/components/asset-viewers/PasteboardModuleDocument.tsx +67 -0
  392. package/src/components/asset-viewers/QuarksAssetDocument.tsx +526 -0
  393. package/src/components/asset-viewers/ShaderAssetDocument.tsx +743 -0
  394. package/src/components/asset-viewers/SourceAssetViewer.tsx +281 -0
  395. package/src/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
  396. package/src/components/asset-viewers/VideoViewer.tsx +101 -0
  397. package/src/components/asset-viewers/shader-source.ts +144 -0
  398. package/src/components/asset-workflow.css +731 -0
  399. package/src/components/board-guides.ts +150 -0
  400. package/src/components/compact-inspector.css +539 -0
  401. package/src/components/core-utilities.tsx +90 -0
  402. package/src/components/editor-notifications.css +40 -0
  403. package/src/components/engine-workspace.css +274 -0
  404. package/src/components/inspector-preview-section.tsx +238 -0
  405. package/src/components/inspector-property-grouping.ts +64 -0
  406. package/src/components/inspector-revert-label.ts +20 -0
  407. package/src/components/inspector-selection.ts +42 -0
  408. package/src/components/inspector-stories-gating.ts +171 -0
  409. package/src/components/inspector-transform-subject.ts +11 -0
  410. package/src/components/inspector-transform.ts +75 -0
  411. package/src/components/kind-documents.tsx +500 -0
  412. package/src/components/palette-action-publisher.tsx +140 -0
  413. package/src/components/primitives/DraftColorInput.tsx +74 -0
  414. package/src/components/product-shell.css +1829 -0
  415. package/src/components/project-tool-documents.tsx +410 -0
  416. package/src/components/scene-documents.tsx +223 -0
  417. package/src/components/stage-keyboard.tsx +37 -0
  418. package/src/components/stage-overlay-set.tsx +107 -0
  419. package/src/components/stage-presence-markers.ts +478 -0
  420. package/src/components/standard-viewport-dressing.ts +417 -0
  421. package/src/components/status-contributions.tsx +403 -0
  422. package/src/components/tool-documents.tsx +309 -0
  423. package/src/components/tool-schema-form.tsx +262 -0
  424. package/src/components/use-after-paint.ts +41 -0
  425. package/src/components/use-project-image-assets.ts +86 -0
  426. package/src/components/viewport-header-controls.css +90 -0
  427. package/src/components/viewport-surface-status.tsx +55 -0
  428. package/src/components/workspace-history.ts +32 -0
  429. package/src/components/workspace-static-panel-registry.tsx +152 -0
  430. package/src/components/workspace-surfaces.css +621 -0
  431. package/src/components/world-documents.tsx +586 -0
  432. package/src/components/world-overlay-gestures.ts +1694 -0
  433. package/src/composite-screenshot.ts +1641 -0
  434. package/src/console-sync.ts +131 -0
  435. package/src/constraint-helper.ts +338 -0
  436. package/src/content-entry-source-registry.ts +184 -0
  437. package/src/coverage/authoring-seam-evidence.ts +300 -0
  438. package/src/coverage/canvas-reveal.ts +192 -0
  439. package/src/coverage/design-time-surfaces.ts +101 -0
  440. package/src/coverage/live-seam-evidence.ts +11 -0
  441. package/src/coverage/ontology-invariants.ts +466 -0
  442. package/src/coverage/session-vitals.ts +501 -0
  443. package/src/coverage/system-seam-evidence.ts +72 -0
  444. package/src/crash-null-boundary.ts +36 -0
  445. package/src/creation-site-edit.ts +1479 -0
  446. package/src/creation-site-registry.ts +160 -0
  447. package/src/delegate-harness-registry.ts +143 -0
  448. package/src/document-context-registry.ts +177 -0
  449. package/src/document-open-registry.ts +200 -0
  450. package/src/document-preview-source.ts +20 -0
  451. package/src/document-renderer-session.ts +138 -0
  452. package/src/editor-api.ts +46 -0
  453. package/src/editor-chrome-capture.ts +139 -0
  454. package/src/editor-commands.ts +164 -0
  455. package/src/editor-console.ts +563 -0
  456. package/src/editor-current-view.ts +82 -0
  457. package/src/editor-document-probe.ts +881 -0
  458. package/src/editor-git-client.ts +115 -0
  459. package/src/editor-host-door.ts +462 -0
  460. package/src/editor-hotkeys.ts +842 -0
  461. package/src/editor-lease-view.ts +39 -0
  462. package/src/editor-lease.ts +415 -0
  463. package/src/editor-mode.ts +19 -0
  464. package/src/editor-notifications.ts +140 -0
  465. package/src/editor-presence.ts +563 -0
  466. package/src/editor-presentation-activity.ts +50 -0
  467. package/src/editor-presentation-notice.ts +42 -0
  468. package/src/editor-runtime.tsx +145 -0
  469. package/src/editor-server-response.ts +86 -0
  470. package/src/editor-session-attribution.ts +75 -0
  471. package/src/editor-session-mode.ts +54 -0
  472. package/src/editor-shell-store.ts +1304 -0
  473. package/src/editor-state-facets.ts +74 -0
  474. package/src/editor-styles.css +33 -0
  475. package/src/editor-view-presentation.ts +810 -0
  476. package/src/editor-viewport.ts +5302 -0
  477. package/src/entity-lod.ts +31 -0
  478. package/src/entity-object.ts +91 -0
  479. package/src/files/file-provider.ts +62 -0
  480. package/src/files/project-files.ts +264 -0
  481. package/src/finders/index.ts +136 -0
  482. package/src/finders/scenes-from-entrypoint-selection.ts +387 -0
  483. package/src/frame/bridge.tsx +1408 -0
  484. package/src/frame/product.ts +77 -0
  485. package/src/gameplay-dom-recording.ts +319 -0
  486. package/src/gameplay-export-state.ts +14 -0
  487. package/src/gameplay-replay.ts +417 -0
  488. package/src/gameplay-session-time.ts +9 -0
  489. package/src/gameplay-sessions.ts +204 -0
  490. package/src/harness-chat-types.ts +253 -0
  491. package/src/hierarchy-component-marks.ts +298 -0
  492. package/src/hierarchy-drop.ts +91 -0
  493. package/src/hierarchy-expansion-state.ts +80 -0
  494. package/src/hierarchy-header-slot.ts +52 -0
  495. package/src/hierarchy-internals.ts +197 -0
  496. package/src/hierarchy-kind-icon.ts +217 -0
  497. package/src/hierarchy-mark-reader.ts +73 -0
  498. package/src/hierarchy-menu-registry.ts +67 -0
  499. package/src/hierarchy-node-rows.ts +307 -0
  500. package/src/hierarchy-panel-view.ts +280 -0
  501. package/src/hierarchy-projection.ts +76 -0
  502. package/src/hierarchy-row-cache.ts +243 -0
  503. package/src/hierarchy-row-model.ts +308 -0
  504. package/src/hierarchy-rows.ts +11 -0
  505. package/src/hierarchy-walk.ts +86 -0
  506. package/src/history/editor-session.ts +25 -0
  507. package/src/history/history-commands.ts +147 -0
  508. package/src/history/history-delegate.ts +163 -0
  509. package/src/history/history-limit-notices.ts +43 -0
  510. package/src/history/history-service.ts +1173 -0
  511. package/src/history/persistence-coordinator.ts +35 -0
  512. package/src/history/project-file-history.ts +386 -0
  513. package/src/history/project-root-history-backends.ts +139 -0
  514. package/src/history/resource-registry.ts +209 -0
  515. package/src/history/snapshot-store.ts +103 -0
  516. package/src/history/source-history-backend.ts +546 -0
  517. package/src/history/types.ts +124 -0
  518. package/src/hmr-registration-group.ts +67 -0
  519. package/src/hmr-stable-react-context.ts +23 -0
  520. package/src/hotkeys.ts +188 -0
  521. package/src/inference-diagnostics.ts +69 -0
  522. package/src/initial-project.ts +80 -0
  523. package/src/inspection/active-subject.ts +578 -0
  524. package/src/inspection/active-surface.ts +142 -0
  525. package/src/inspection/compose.ts +1064 -0
  526. package/src/inspection/display.ts +170 -0
  527. package/src/inspection/document-subject.ts +109 -0
  528. package/src/inspection/game-subject.ts +85 -0
  529. package/src/inspection/model.ts +542 -0
  530. package/src/inspection/null-subject.ts +115 -0
  531. package/src/inspection/serialize.ts +357 -0
  532. package/src/inspection/use-active-inspection.ts +180 -0
  533. package/src/inspector-presentation.ts +201 -0
  534. package/src/inspector-section-registry.ts +221 -0
  535. package/src/instance-source-actions.ts +163 -0
  536. package/src/instanced-presentation.ts +164 -0
  537. package/src/js-heap.ts +71 -0
  538. package/src/key-actions.ts +91 -0
  539. package/src/keymap-presets.ts +401 -0
  540. package/src/layout-policy.ts +31 -0
  541. package/src/learn-links.ts +73 -0
  542. package/src/light-explorer-model.ts +134 -0
  543. package/src/live-canvas-frame.ts +55 -0
  544. package/src/live-document.ts +279 -0
  545. package/src/live-module-source.ts +230 -0
  546. package/src/live-session-registry.ts +220 -0
  547. package/src/live-transition.ts +633 -0
  548. package/src/manifest-project.ts +107 -0
  549. package/src/model-thumbnail.ts +523 -0
  550. package/src/native-selection-style.ts +202 -0
  551. package/src/object3d-document-write-policy.ts +137 -0
  552. package/src/packaged-runtime.ts +108 -0
  553. package/src/palettes/maya.palette.json +57 -0
  554. package/src/palettes/substance.palette.json +57 -0
  555. package/src/pasteboard-module.ts +81 -0
  556. package/src/performance-profiler.ts +367 -0
  557. package/src/performance-sources.ts +69 -0
  558. package/src/play-boot-phase.ts +145 -0
  559. package/src/presentation-surface.ts +248 -0
  560. package/src/project-adapter.ts +1143 -0
  561. package/src/project-asset-refresh.ts +26 -0
  562. package/src/project-declaration-refresh.ts +31 -0
  563. package/src/project-local-state.ts +118 -0
  564. package/src/project-manager.ts +243 -0
  565. package/src/project-module-changes.ts +163 -0
  566. package/src/project-module-split.ts +266 -0
  567. package/src/project-provenance.ts +115 -0
  568. package/src/project-ready.ts +42 -0
  569. package/src/project-session-reset.ts +67 -0
  570. package/src/project-shape.ts +68 -0
  571. package/src/project-tool-discovery.ts +66 -0
  572. package/src/project-tools.ts +107 -0
  573. package/src/project-work-types.ts +149 -0
  574. package/src/projection/three.ts +898 -0
  575. package/src/projection/types.ts +44 -0
  576. package/src/readiness.ts +113 -0
  577. package/src/reflection-probe-helper.ts +142 -0
  578. package/src/reported-play-state.ts +90 -0
  579. package/src/resolve-relative-specifier.ts +33 -0
  580. package/src/scene-document-plan.ts +315 -0
  581. package/src/scene-framing.ts +315 -0
  582. package/src/scene-live-open.ts +210 -0
  583. package/src/scene-view-fog.ts +89 -0
  584. package/src/scoped-game-css.ts +152 -0
  585. package/src/session-orphan-record.ts +193 -0
  586. package/src/session-tombstone.ts +126 -0
  587. package/src/settings/settings-provider.ts +82 -0
  588. package/src/settings-store.ts +345 -0
  589. package/src/shared-view-restore.ts +42 -0
  590. package/src/shell-store-door.ts +45 -0
  591. package/src/source-conflict.ts +122 -0
  592. package/src/spatial-handle-visuals.ts +332 -0
  593. package/src/stage-context.ts +341 -0
  594. package/src/stage-store-registry.ts +63 -0
  595. package/src/stale-chunk-recovery.ts +34 -0
  596. package/src/state-report-deferral.ts +73 -0
  597. package/src/storage/host-files-storage.ts +97 -0
  598. package/src/storage/http-storage.ts +174 -0
  599. package/src/storage/index.ts +75 -0
  600. package/src/storage/mem-storage.ts +149 -0
  601. package/src/storage/path-lock.ts +44 -0
  602. package/src/storage/paths.ts +26 -0
  603. package/src/storage/types.ts +116 -0
  604. package/src/stories/StoryComponentThumbnail.tsx +184 -0
  605. package/src/stories/StoryPreviewMount.tsx +306 -0
  606. package/src/stories/component-content-source.tsx +106 -0
  607. package/src/stories/component-states-source.ts +78 -0
  608. package/src/stories/compose-project-stories.ts +255 -0
  609. package/src/stories/pixi-story-model.ts +30 -0
  610. package/src/stories/prefabs-finder.ts +54 -0
  611. package/src/stories/prefabs-from-stories.ts +182 -0
  612. package/src/stories/project-story-discovery.ts +78 -0
  613. package/src/stories/project-story-regions.ts +24 -0
  614. package/src/stories/story-actions.ts +54 -0
  615. package/src/stories/story-capture-command.ts +124 -0
  616. package/src/stories/story-capture.ts +584 -0
  617. package/src/stories/story-declared-medium.ts +126 -0
  618. package/src/stories/story-discovery.ts +176 -0
  619. package/src/stories/story-document-openers.ts +36 -0
  620. package/src/stories/story-dom-runtime.ts +78 -0
  621. package/src/stories/story-grouping.ts +111 -0
  622. package/src/stories/story-lane.ts +88 -0
  623. package/src/stories/story-mount-turn.ts +27 -0
  624. package/src/stories/story-opener.ts +260 -0
  625. package/src/stories/story-pixi-preview.ts +408 -0
  626. package/src/stories/story-presentation.ts +215 -0
  627. package/src/stories/story-registry.ts +517 -0
  628. package/src/stories/story-three-preview.ts +807 -0
  629. package/src/stories/three-story-model.ts +96 -0
  630. package/src/story-three-preview-runtime.ts +56 -0
  631. package/src/surface-keyboard.ts +112 -0
  632. package/src/surface-state.ts +124 -0
  633. package/src/tab-bootstrap.js +628 -0
  634. package/src/tab-census.ts +198 -0
  635. package/src/tab-lifecycle-client.ts +196 -0
  636. package/src/theme-library.ts +844 -0
  637. package/src/theme-preference.ts +378 -0
  638. package/src/theme.css +3437 -0
  639. package/src/three-viewport/bone-selection-highlight.ts +119 -0
  640. package/src/three-viewport/camera-fit.ts +41 -0
  641. package/src/three-viewport/interactive-renderer.ts +132 -0
  642. package/src/three-viewport/selection-brackets.ts +310 -0
  643. package/src/three-viewport/selection-outline.ts +183 -0
  644. package/src/three-viewport/skeleton-helper.ts +61 -0
  645. package/src/three-viewport/source-color.ts +167 -0
  646. package/src/three-viewport/studio-environment.ts +96 -0
  647. package/src/three-viewport-presentation.ts +23 -0
  648. package/src/tool-contribution-play.ts +74 -0
  649. package/src/tool-loader.ts +1798 -0
  650. package/src/transform-mode-request.ts +57 -0
  651. package/src/transient-hint.ts +78 -0
  652. package/src/trigger-volume-helper.ts +116 -0
  653. package/src/ui-source/adapter-region-includes.ts +241 -0
  654. package/src/ui-source/ensure-import.ts +132 -0
  655. package/src/ui-source/file-region-resolver.ts +302 -0
  656. package/src/ui-source/inspect.ts +775 -0
  657. package/src/ui-source/oid-transform.ts +1845 -0
  658. package/src/ui-source/plan-csf-story.ts +196 -0
  659. package/src/ui-source/plan-extract-component.ts +421 -0
  660. package/src/ui-source/plan-fork-component.ts +621 -0
  661. package/src/ui-source/plan-named-style.ts +95 -0
  662. package/src/ui-source/plan-source-edit.ts +353 -0
  663. package/src/ui-source/r3f-contract-resolver.ts +327 -0
  664. package/src/ui-source/r3f-diagnostic-index.ts +165 -0
  665. package/src/ui-source/r3f-environment-binding.ts +133 -0
  666. package/src/ui-source/r3f-joint-binding.ts +251 -0
  667. package/src/ui-source/r3f-lod-binding.ts +91 -0
  668. package/src/ui-source/r3f-particle-binding.ts +235 -0
  669. package/src/ui-source/r3f-physics-binding.ts +483 -0
  670. package/src/ui-source/r3f-project-contracts.ts +444 -0
  671. package/src/ui-source/relative-import-specifier.ts +34 -0
  672. package/src/ui-source/reparent-guard.ts +544 -0
  673. package/src/ui-source/source-edit-request.ts +97 -0
  674. package/src/ui-source/source-write-backend.ts +618 -0
  675. package/src/ui-source/syntactic-prop-specs.ts +296 -0
  676. package/src/ui-source/tier-source-write-backend.ts +279 -0
  677. package/src/ui-source/ts-ast.ts +171 -0
  678. package/src/ui-source/utility-class-support.ts +169 -0
  679. package/src/ui-source/write-component-default.ts +133 -0
  680. package/src/ui-source/writer.ts +1989 -0
  681. package/src/viewport-activation-timings.ts +840 -0
  682. package/src/viewport-authoring-policy.ts +186 -0
  683. package/src/viewport-controls-hint.ts +57 -0
  684. package/src/viewport-door.ts +237 -0
  685. package/src/viewport-shading-boundary.ts +12 -0
  686. package/src/vite-error-surface.ts +141 -0
  687. package/src/wait-until.ts +37 -0
  688. package/src/workspace-areas.ts +156 -0
  689. package/src/workspace-aux-commands.ts +11 -0
  690. package/src/workspace-available-documents.ts +127 -0
  691. package/src/workspace-core-utilities.ts +31 -0
  692. package/src/workspace-document-ids.ts +59 -0
  693. package/src/workspace-document-registry.ts +612 -0
  694. package/src/workspace-document-restore.ts +145 -0
  695. package/src/workspace-host-commands.ts +141 -0
  696. package/src/workspace-persistence-gate.ts +40 -0
  697. package/src/workspace-play-utilities.ts +44 -0
  698. package/src/workspace-presets.ts +425 -0
  699. package/src/workspace-regions.ts +294 -0
  700. package/src/workspace-state-persistence.ts +536 -0
  701. package/src/workspace-static-panels.ts +73 -0
  702. package/src/workspace-status-registry.ts +121 -0
  703. package/src/workspace-style.ts +239 -0
  704. package/src/workspace-utility-commands.ts +74 -0
  705. package/src/workspace-utility-registry.ts +263 -0
  706. package/src/workspace-viewport-rect.ts +97 -0
  707. package/src/world-adoption.ts +115 -0
  708. package/src/world-document-routing.ts +104 -0
  709. package/vite-plugin-creation-site-write.ts +184 -0
  710. package/vite-plugin-creation-site.ts +80 -0
  711. package/vite-plugin-game-static.ts +303 -0
  712. package/vite-plugin-module-doorways.ts +336 -0
  713. package/vite-plugin-product-contributions.ts +197 -0
  714. package/vite-plugin-project-game-static.ts +125 -0
  715. package/vite-plugin-project-jsx-js.ts +65 -0
  716. package/vite-plugin-project-root-absolute-assets.ts +359 -0
  717. package/vite-plugin-shared-react.ts +420 -0
  718. package/vite-plugin-shared-three.ts +203 -0
  719. package/vite-plugin-ui-oid.ts +2106 -0
@@ -0,0 +1,150 @@
1
+ /**
2
+ * PERSISTENT BOARD GUIDES (design ledger: snapping/guides — "persistent
3
+ * guides do not ship"). User-placed ruler guides on the DOM component board,
4
+ * in BOARD coordinates (the same space the frames are laid out in, so a
5
+ * guide stays put under pan/zoom).
6
+ *
7
+ * Persistence: per-project, per-document localStorage — the
8
+ * `device-preview.ts` idiom (keyed by `getCurrentProject().rootPath`; UI
9
+ * convenience, never project truth). A guide is a design AID: it has no
10
+ * rendered meaning in the game, so it must never be written into game
11
+ * source — the same reasoning that keeps the workspace layout and the device
12
+ * preset out of the project.
13
+ *
14
+ * The snap seam: `RootSelectionOverlay`'s gestures snap in HOST-relative
15
+ * space (a per-world frame inside the board), so the board registers its
16
+ * live transform here ({@link registerBoardGuideTransform}) and the overlay
17
+ * asks for guide edges in CLIENT space ({@link guideClientEdges}) to convert
18
+ * against its own host origin.
19
+ */
20
+
21
+ import { getCurrentProject } from '../project-manager';
22
+
23
+ export interface BoardGuide {
24
+ readonly id: string;
25
+ /** 'x' = vertical guide at a board X; 'y' = horizontal guide at a board Y. */
26
+ readonly axis: 'x' | 'y';
27
+ /** Board-space coordinate. */
28
+ readonly value: number;
29
+ }
30
+
31
+ const STORAGE_KEY = 'vgai:board-guides:v1';
32
+
33
+ type Stored = Record<string, Record<string, BoardGuide[]>>;
34
+
35
+ function storage(): Storage | null {
36
+ return typeof window === 'undefined' ? null : window.localStorage;
37
+ }
38
+
39
+ function projectKey(): string {
40
+ try {
41
+ return getCurrentProject()?.rootPath ?? '(no-project)';
42
+ } catch {
43
+ return '(no-project)';
44
+ }
45
+ }
46
+
47
+ function readAll(): Stored {
48
+ try {
49
+ return JSON.parse(storage()?.getItem(STORAGE_KEY) ?? '{}') as Stored;
50
+ } catch {
51
+ return {};
52
+ }
53
+ }
54
+
55
+ function writeAll(all: Stored): void {
56
+ try {
57
+ storage()?.setItem(STORAGE_KEY, JSON.stringify(all));
58
+ } catch {
59
+ // Quota/denied — guides silently stay session-only; the next write retries.
60
+ }
61
+ }
62
+
63
+ const listeners = new Set<() => void>();
64
+ let cache: Record<string, BoardGuide[]> | null = null;
65
+ let nextId = Date.now() % 1_000_000;
66
+
67
+ function docs(): Record<string, BoardGuide[]> {
68
+ if (!cache) cache = readAll()[projectKey()] ?? {};
69
+ return cache;
70
+ }
71
+
72
+ function persist(): void {
73
+ const all = readAll();
74
+ all[projectKey()] = docs();
75
+ writeAll(all);
76
+ for (const listener of listeners) listener();
77
+ }
78
+
79
+ const EMPTY_GUIDES: readonly BoardGuide[] = [];
80
+
81
+ export function boardGuides(docId: string): readonly BoardGuide[] {
82
+ // Referentially stable for a guide-less document: this is a
83
+ // `useSyncExternalStore` snapshot, and a fresh `[]` per call is an
84
+ // infinite re-render (measured: it crashed the whole editor surface with
85
+ // "Maximum update depth exceeded" on first mount).
86
+ return docs()[docId] ?? EMPTY_GUIDES;
87
+ }
88
+
89
+ export function subscribeBoardGuides(listener: () => void): () => void {
90
+ listeners.add(listener);
91
+ return () => listeners.delete(listener);
92
+ }
93
+
94
+ export function addBoardGuide(docId: string, axis: BoardGuide['axis'], value: number): string {
95
+ nextId += 1;
96
+ const id = `guide-${nextId}`;
97
+ docs()[docId] = [...boardGuides(docId), { id, axis, value }];
98
+ persist();
99
+ return id;
100
+ }
101
+
102
+ export function moveBoardGuide(docId: string, id: string, value: number): void {
103
+ docs()[docId] = boardGuides(docId).map((g) => (g.id === id ? { ...g, value } : g));
104
+ persist();
105
+ }
106
+
107
+ export function removeBoardGuide(docId: string, id: string): void {
108
+ docs()[docId] = boardGuides(docId).filter((g) => g.id !== id);
109
+ persist();
110
+ }
111
+
112
+ // --- The live board transform, for the overlay's snap conversion ---
113
+
114
+ export interface BoardGuideTransform {
115
+ /** The board container's client origin. */
116
+ readonly originX: number;
117
+ readonly originY: number;
118
+ /** The board pan/zoom (client = origin + pan + value * zoom). */
119
+ readonly panX: number;
120
+ readonly panY: number;
121
+ readonly zoom: number;
122
+ }
123
+
124
+ let activeTransform: { docId: string; transform: BoardGuideTransform } | null = null;
125
+
126
+ /** The mounted board registers its transform (and clears it on unmount) so
127
+ * guide coordinates can be answered in client space. One DOM board is
128
+ * active at a time; a second registration simply replaces the first. */
129
+ export function registerBoardGuideTransform(
130
+ docId: string,
131
+ transform: BoardGuideTransform | null,
132
+ ): void {
133
+ activeTransform = transform ? { docId, transform } : null;
134
+ }
135
+
136
+ /** Every guide of the registered board, as CLIENT-space edge coordinates —
137
+ * what a gesture overlay converts against its own host origin. Empty when
138
+ * no board is registered (nothing to snap to, honestly). */
139
+ export function guideClientEdges(): { x: number[]; y: number[] } {
140
+ if (!activeTransform) return { x: [], y: [] };
141
+ const { docId, transform } = activeTransform;
142
+ const x: number[] = [];
143
+ const y: number[] = [];
144
+ for (const guide of boardGuides(docId)) {
145
+ if (guide.axis === 'x')
146
+ x.push(transform.originX + transform.panX + guide.value * transform.zoom);
147
+ else y.push(transform.originY + transform.panY + guide.value * transform.zoom);
148
+ }
149
+ return { x, y };
150
+ }
@@ -0,0 +1,539 @@
1
+ /* The inspector's DEFAULT presentation is a NARROW COLUMN (owner, 2026-08-19):
2
+ * identity row, a SECTION-ICON STRIP that signposts what the subject has and
3
+ * jumps to a section, then the sections stacked. The `card` presentation is the
4
+ * space-tight fallback — a MINI card (preview, name, the same strip,
5
+ * open-for-edit) that collapses at the floor to a single-line PILL.
6
+ *
7
+ * This geometry is CSS rather than inline style because the strip RE-SCOPES a
8
+ * canonical control it does not own: the icon buttons are ghost icon buttons
9
+ * held one notch quieter than their resting paint. A product surface re-scopes
10
+ * those through the stylesheet, never by painting a `<Button>` inline.
11
+ */
12
+
13
+ /* The SECTION-ICON STRIP — one glyph per section, shared by the column and the
14
+ mini card. A horizontal, wrapping row of compact ghost icon buttons under a
15
+ hairline rule, so it reads as a table of contents rather than a toolbar of
16
+ commands. */
17
+ .vgai-inspector-icon-strip {
18
+ display: flex;
19
+ flex-wrap: wrap;
20
+ align-items: center;
21
+ gap: var(--vgai-space-1);
22
+ padding: var(--vgai-space-1) var(--vgai-space-2);
23
+ border-bottom: 1px solid var(--vgai-structural-divider);
24
+ }
25
+ .vgai-inspector-icon-strip .vgai-btn[data-variant="ghost"] {
26
+ color: var(--vgai-content-dim);
27
+ }
28
+ .vgai-inspector-icon-strip .vgai-btn[data-variant="ghost"]:hover:not(:disabled) {
29
+ color: var(--vgai-content-primary);
30
+ }
31
+
32
+ /* The PROPERTIES presentation — Blender's Properties editor: a vertical TAB
33
+ RAIL down the area's whole left edge, and everything else (the breadcrumb,
34
+ the datablock row, the one open section) in the column beside it. */
35
+ .vgai-inspector-properties {
36
+ display: flex;
37
+ align-items: stretch;
38
+ /* The rail runs the AREA's whole left edge in the reference, so the split
39
+ owns the full height and the identity rows live in the body beside it. */
40
+ min-height: 100%;
41
+ }
42
+ /* …AND `100%` OF WHAT. The line above is the intent and it was shipping as
43
+ prose only: driven cold 2026-09-19 in a models scaffold, the rail measured
44
+ 68 px tall in a 698.5 px dock panel, because a percentage min-height needs
45
+ a definite containing block and every ancestor between here and the dock
46
+ panel sized to its content. The rail stopped under the second tab and the
47
+ column below it painted `surface-panel` — the BODY's own fill — so the
48
+ rail did not read as a rail at all.
49
+ BLENDER'S RUNS THE WHOLE COLUMN, measured on `modeling-edit-none.png` down
50
+ x 2849: the last tab's cell ends at device y 1322 and `#171717` continues
51
+ for 377 more device rows (188.5 CSS) to the bottom of the editor. Below
52
+ its 14 tabs there is still rail.
53
+ SCOPED TO THE PRESENTATION THAT ASKED FOR IT. The panel already stamps
54
+ `data-vgai-inspector-presentation`, so the narrow column, the mini card
55
+ and the pill are untouched — the other three presentations have no rail
56
+ to stretch and a filling scroll container would change where their
57
+ content sits. */
58
+ [data-vgai-inspector-presentation="properties"] {
59
+ flex: 1 1 auto;
60
+ /* A scroll container in a column flex parent will not shrink past its
61
+ content without this, which is how the panel would gain the height and
62
+ lose the scroll in the same edit. */
63
+ min-height: 0;
64
+ }
65
+ [data-vgai-inspector-presentation="properties"] > .vgai-inspector-properties-fill {
66
+ flex: 1 1 auto;
67
+ min-height: 0;
68
+ display: flex;
69
+ flex-direction: column;
70
+ }
71
+ /* THE PROPERTIES TAB RAIL, re-measured on the native 2x `modeling.png` (the
72
+ earlier pass read a halved frame and got the boxes wrong). Source
73
+ coordinates are in the 2x frame; every number below is its half:
74
+
75
+ rail column x 2845..2900 = 28 CSS px wide, filled #171717 (y=1500, below
76
+ the last tab — the fill the tabs sit ON, which the earlier
77
+ reading mistook for the tab colour)
78
+ a tab x 2847..2900 = 27 CSS px, so the rail's only gutter is 1 px
79
+ on the LEFT and a tab runs flush to the body edge;
80
+ y 938..985 = 24 CSS px tall, filled #1c1c1c
81
+ the SELECTED takes the panel's own fill and merges with the body — at
82
+ tab y=1017 the Modifier tab is #1c1c1c for 1 px and #2f2f2f from
83
+ x 2849 on, with no seam against the panel beside it
84
+ glyph 28x28 device = 14 CSS px, centred (x 2861..2888 inside a tab
85
+ at 2847..2900, y 948..975 inside 938..985)
86
+ gap 4 CSS px between tabs of one GROUP (y 619..624 + its two
87
+ 1 px transitions), 11 between groups (y 548..568). We ship
88
+ one group, so only the 4 is spent.
89
+
90
+ RE-MEASURED 2026-09-18 down ONE COLUMN of the rail's own fill, x=2852 on
91
+ `modeling-edit-none.png` (the Modeling workspace in Edit Mode — the frame
92
+ this document is the sibling of), which reads the boxes rather than the
93
+ glyphs and corrects two of the numbers above:
94
+
95
+ a tab 27 CSS TALL, not 24 — `#1c1c1c` runs 54 device px per cell
96
+ (y 495..548, 567..620, 623..676, … , 1271..1324) on a 56 px
97
+ pitch, every cell the same.
98
+ gap 1 CSS, not 4 — the 2 device px between cells read `#1a1a1a`,
99
+ the exact blend of `#1c1c1c` and the rail's `#171717`, i.e.
100
+ a hairline, not a gutter. (The 4 came from reading a GROUP
101
+ boundary, which is 15 device px of rail fill plus its two
102
+ blend rows: 8.5 CSS. We ship one group, so it is unspent.)
103
+ the plate the SELECTED cell is 25 CSS, inset one pixel inside its 27:
104
+ `#2f2f2f` runs y 993..1042 with `#242424` single rows at 992
105
+ and 1043, inside a cell at 991..1044. Its LEFT corners round
106
+ over four device rows (x 2853 at y 992, 2851, 2850, 2849
107
+ from 996 on) — 2 CSS — and its right edge is flat, because
108
+ it merges into the body.
109
+ rail top the ground starts 17 device px above the first cell (y 478
110
+ under the editor's own header band, first cell at 495) —
111
+ 8.5 CSS.
112
+
113
+ The rail sticks to the top of the scrolling column so a long section body
114
+ never scrolls the tabs away. */
115
+ .vgai-inspector-properties-rail {
116
+ display: flex;
117
+ flex-direction: column;
118
+ gap: var(--vgai-stroke-resting);
119
+ padding-top: var(--vgai-space-4);
120
+ /* The rail's only gutter is one device-independent pixel on the LEFT: a tab
121
+ runs flush to the body edge (x 2847..2900 inside a 2845..2900 column). */
122
+ padding-left: var(--vgai-stroke-resting);
123
+ /* The open tab's plate rounds 2 CSS px on its leading corners and nothing on
124
+ its trailing ones. It is named here rather than written into the rule
125
+ below because it is a MEASURED constant of this frame with no rung in the
126
+ material's shape scale (Blender rounds every widget at 4). */
127
+ --vgai-properties-tab-plate-radius: 2px;
128
+ width: 28px;
129
+ box-sizing: border-box;
130
+ background: var(--vgai-surface-shell);
131
+ position: sticky;
132
+ top: 0;
133
+ align-self: stretch;
134
+ flex: 0 0 auto;
135
+ }
136
+ /* THE GROUP SEPARATOR. `ED_buttons_tabs_list` (`space_buttons.cc:201-255`)
137
+ appends a `BCONTEXT_SEPARATOR` between the tool tab, the scene group
138
+ (Render, Output, View Layer, Scene, World), Collection, the object group
139
+ (Object … Material) and Texture; the rail draws it as GROUND, not as a
140
+ rule. Measured on `modeling-edit-none.png` down x=2852: a group boundary is
141
+ 15 device px of the rail's own `#171717` plus its two blend rows — 8.5 CSS.
142
+ The rail's flex `gap` already contributes one device-independent pixel on
143
+ each side of this element, so it owns 6.5 of the 8.5 itself. No ink: the
144
+ gap IS the separator in the reference. */
145
+ .vgai-inspector-properties-rail-separator {
146
+ flex: 0 0 auto;
147
+ height: 6.5px;
148
+ }
149
+ /* The tab BOX, not the button's own size ramp: a Properties tab is 27x24 in
150
+ the frame regardless of which control height the density declares. The two
151
+ qualifiers are what it takes to outrank the canonical control's own box:
152
+ `[data-size="compact"]` sets the height and `[data-icon="true"][data-size]`
153
+ sets the width to the compact control height (20), which is why an earlier
154
+ cut of this rule left 20x20 tabs with 7 px of rail showing beside them. */
155
+ .vgai-inspector-properties-rail .vgai-btn[data-icon][data-size] {
156
+ width: 27px;
157
+ height: 27px;
158
+ min-width: 0;
159
+ min-height: 0;
160
+ padding: 0;
161
+ border-radius: 0;
162
+ }
163
+ .vgai-inspector-properties-rail .vgai-btn[data-variant="ghost"] {
164
+ color: var(--vgai-content-dim);
165
+ background: var(--vgai-surface-chrome);
166
+ }
167
+ .vgai-inspector-properties-rail .vgai-btn[data-variant="ghost"]:hover:not(:disabled) {
168
+ color: var(--vgai-content-primary);
169
+ }
170
+ /* The open tab IS the panel — Blender gives it the body's own fill so the two
171
+ read as one surface rather than as a lit tab. */
172
+ .vgai-inspector-properties-rail .vgai-btn[aria-selected="true"],
173
+ .vgai-inspector-properties-rail .vgai-btn[data-variant="ghost"][aria-selected="true"] {
174
+ color: var(--vgai-content-primary);
175
+ background: var(--vgai-surface-panel);
176
+ }
177
+ /* …AND IT IS A PLATE, not the whole cell: 25 CSS px inside the 27, rounded on
178
+ the LEFT and flat on the right where it runs into the body.
179
+
180
+ The inset is the canonical control's OWN transparent 1 px border, which
181
+ `.vgai-btn` already carries on every button — `background-clip: padding-box`
182
+ simply stops painting over it, and 27 - 2 is Blender's 25. (Clipping to the
183
+ CONTENT box instead paints 23: measured live, y 214..236 inside a cell at
184
+ 211.5..238.5, because block padding would take a second pixel off each end.)
185
+ `border-radius` is declared on the border box and the painting area's
186
+ corners come out one pixel tighter, which is why the measured 2 is written
187
+ as 2 plus the border it loses. Specificity has to outrank the tab-box rule
188
+ above, which zeroes the radius. */
189
+ .vgai-inspector-properties-rail .vgai-btn[data-icon][data-size][aria-selected="true"] {
190
+ --vgai-plate-corner: calc(var(--vgai-properties-tab-plate-radius) + var(--vgai-stroke-resting));
191
+ background-clip: padding-box;
192
+ border-radius: var(--vgai-plate-corner) 0 0 var(--vgai-plate-corner);
193
+ }
194
+ /* THE RAIL'S ALPHA, and why the open tab is the exception. A category token is
195
+ the glyph's INK at full opacity (`theme.ts`'s category docblock); Blender's
196
+ own rail dims every tab but the open one. Measured on the native 2x frames,
197
+ the same ink at both states: the Object tab is #e09557 open
198
+ (`properties-object.png`, src y 522-549, over its #2f2f2f plate) and
199
+ #b97d4b closed (`properties-modifier.png`, same rows, over #1c1c1c) — the
200
+ ink at 0.80. The Modifier tab does it the other way round (#73a1ff open in
201
+ `properties-modifier.png`, #6286d1 closed in `properties-object.png`), and
202
+ the Data tab a third time (#00d3a2 / #05ae87).
203
+
204
+ Keyed on `[data-vgai-tone]` rather than on the button, so it reaches ONLY a
205
+ glyph whose set gives it a category: Font Awesome carries no tone, so every
206
+ Classic rail is byte-identical to before this rule — its tabs already
207
+ separate open from closed through `--vgai-content-dim`/`-primary` above,
208
+ which a toned glyph's own `color` overrides. */
209
+ .vgai-inspector-properties-rail .vgai-btn [data-vgai-tone] {
210
+ opacity: 0.8;
211
+ }
212
+ .vgai-inspector-properties-rail .vgai-btn[aria-selected="true"] [data-vgai-tone] {
213
+ opacity: 1;
214
+ }
215
+ /* THE PROPERTIES IDENTITY — Blender's two opening rows (the component's own
216
+ docblock carries every coordinate). There is NO rule under it: in the frames
217
+ the datablock row is followed by panel fill and then the first card's own top
218
+ edge (`properties-object.png`, y 180..199 between the row at 140..179 and
219
+ the card at 200).
220
+
221
+ THE INSET IS THE BODY'S, ONCE. This row sits INSIDE
222
+ `.vgai-inspector-properties-body`, which already spends the measured 8 CSS
223
+ on every side, so its own 8 doubled it: measured live before this rule, the
224
+ body starts at x 1450.5 and the breadcrumb's glyph landed at 1466.5 — 16 —
225
+ while the cards below it landed at 1458.5. The same doubling the bands unit
226
+ found in `InspectorToolSection.tsx`, one level up.
227
+
228
+ THE VERTICAL RHYTHM, measured on `properties-object.png` at 2x (device px,
229
+ halve for CSS): area header bottom 47 → breadcrumb row 68..108 (20 CSS,
230
+ centred on its 14 px glyph at 74..101) → datablock row 140..179 → first card
231
+ 200. So 10.5 CSS above the breadcrumb, 16 between the two rows, 10.5 below
232
+ the pair. `modeling-edit-none.png`'s Modifier tab confirms the middle gap
233
+ from the other side: no datablock row there, and `Add Modifier` starts at
234
+ the same y=140. Ours ran 8 / 2 / 0. */
235
+ .vgai-inspector-identity[data-vgai-identity-layout="properties"] {
236
+ display: flex;
237
+ flex-direction: column;
238
+ gap: var(--vgai-space-8);
239
+ padding: var(--vgai-space-1) 0 var(--vgai-space-5);
240
+ }
241
+ /* Glyph to name, INK TO INK: `properties-modifier.png` runs the glyph out at
242
+ x=107 and starts `Cube` at x=127 — 20 device px, 10 CSS. Our glyph box
243
+ carries ~1.5 CSS of its own bearing each side, so the gap token that lands
244
+ on 10 is 8 (measured after: 9.5). It was 4. */
245
+ .vgai-inspector-breadcrumb {
246
+ display: flex;
247
+ align-items: center;
248
+ gap: var(--vgai-space-4);
249
+ min-height: var(--vgai-control-default-height);
250
+ }
251
+ /* THE CHAIN IS A NAME IN PLAIN INK. Blender's breadcrumb inks its glyph, its
252
+ datablock names and its `>` at 229 on every one of the three tab frames —
253
+ the muted grey we used belongs to the pin (155) and to nothing else on the
254
+ row. Tail ellipsis, like every other name in the chrome; the head-ellipsis
255
+ this rule carried was for the file path, which is now the row's tooltip. */
256
+ .vgai-inspector-breadcrumb-chain {
257
+ flex: 1;
258
+ min-width: 0;
259
+ overflow: hidden;
260
+ text-overflow: ellipsis;
261
+ white-space: nowrap;
262
+ font-size: var(--vgai-font-base);
263
+ color: var(--vgai-content-primary);
264
+ }
265
+ /* The datablock row is ONE composite: the wells share a border, so the pair
266
+ reads as a single 20 px control the way Blender's does rather than as two
267
+ floating boxes. */
268
+ .vgai-inspector-datablock {
269
+ display: flex;
270
+ align-items: stretch;
271
+ min-width: 0;
272
+ }
273
+ .vgai-inspector-datablock-kind {
274
+ display: flex;
275
+ flex: 0 0 auto;
276
+ align-items: center;
277
+ justify-content: center;
278
+ /* Blender's well is 30 CSS px on a 20 px row — wider than square, because it
279
+ holds a glyph AND the datablock caret. We draw no caret (nothing here
280
+ picks a datablock), so the width is stated as what the segment IS: the
281
+ row's own height plus the column the caret would occupy. */
282
+ min-width: calc(var(--vgai-control-default-height) + var(--vgai-space-5));
283
+ height: var(--vgai-control-default-height);
284
+ background: var(--vgai-widget-menu);
285
+ color: var(--vgai-content-primary);
286
+ border: var(--vgai-stroke-resting) solid var(--vgai-border-1);
287
+ border-radius: var(--vgai-radius-sm) 0 0 var(--vgai-radius-sm);
288
+ border-right: 0;
289
+ /* The well is a widget, so it takes the widget emboss like the name field
290
+ beside it — and it has to say so itself, because it is neither a
291
+ `.vgai-btn` nor an `.vgai-input`. Blender draws the pair's emboss as one
292
+ unbroken line (`properties-data-edit.png` y 180..181 runs the full width
293
+ of the row, well and field together). */
294
+ box-shadow: var(--vgai-widget-emboss-shadow);
295
+ }
296
+ .vgai-inspector-datablock .vgai-input,
297
+ .vgai-inspector-datablock [data-testid="ingest-name"] {
298
+ border-radius: 0 var(--vgai-radius-sm) var(--vgai-radius-sm) 0;
299
+ }
300
+ /* A READ-ONLY name still gets the well. `SubjectNameField` renders plain text
301
+ rather than an `<input>` there, on the standing rule that a readonly input
302
+ invites typing that vanishes — but Blender's datablock row always shows the
303
+ field, and a glyph well glued to bare text reads as a broken control rather
304
+ than as a name you cannot rename. Same box, no caret. */
305
+ .vgai-inspector-datablock [data-testid="ingest-name"][data-readonly="true"] {
306
+ display: flex;
307
+ align-items: center;
308
+ height: var(--vgai-control-default-height);
309
+ padding: 0 var(--vgai-space-3);
310
+ background: var(--vgai-input-surface, var(--vgai-bg-inset));
311
+ border: var(--vgai-stroke-resting) solid var(--vgai-input-border, var(--vgai-border-1));
312
+ box-sizing: border-box;
313
+ /* It is a `div` standing in for the field, so it restates the field's
314
+ paint — and the emboss is part of that paint. `--vgai-input-shadow`
315
+ already carries it for the real `<input>` (`theme.ts`'s
316
+ `inputShadowValue`); this rule reads the same token for the same reason
317
+ it restates `--vgai-input-surface` and `--vgai-input-border`. */
318
+ box-shadow: var(--vgai-input-shadow, none);
319
+ }
320
+
321
+ .vgai-inspector-properties-body {
322
+ flex: 1 1 auto;
323
+ min-width: 0;
324
+ /* THE PANEL REGION'S INSET. Blender's Properties editor lays its panels in
325
+ an inset column, not flush to the area edges: measured on
326
+ `properties-object.png` at 2x, the Transform card's left border sits at
327
+ x=74 with the body starting at x=58 (16 device px = 8 CSS), its right
328
+ border ends at x=592 with the body ending at x=605 (13 device px = 6.5
329
+ CSS), and the first card's top edge is 21 device px (10.5 CSS) below the
330
+ datablock row. We spend the space token on all four sides rather than
331
+ transcribe the 6.5: that half-pixel is Blender's own scroll gutter, and
332
+ our column scrolls through a different mechanism. The inset lives HERE
333
+ rather than on the card so a section that draws bare content (no
334
+ sub-panels) lands on the same column as one that draws cards. */
335
+ padding: var(--vgai-space-4);
336
+ }
337
+
338
+ /* EVERY SECTION IN THIS REGION IS A CARD. Blender draws a Properties panel as
339
+ an inset rounded box — one continuous fill for its header AND its body, a
340
+ 1 px lighter outline, 4 px corners, 2 px between boxes (measured on
341
+ `properties-object.png`: fill #3c3c3c over the #2f2f2f panel, outline
342
+ #494949 at x 74..75 / 591..592, the corner arc spanning y 200..207, and the
343
+ gap between the Location and Rotation cards y 1032..1035). Ours drew a
344
+ lifted header bar over a body that fell back to the panel — the "full-bleed
345
+ bar on a flush body" a fresh viewer reads as a settings list rather than as
346
+ Blender's panel stack.
347
+
348
+ Scoped to this presentation on purpose: the card is the PROPERTIES editor's
349
+ own shape in the reference (its Outliner and its viewport draw no such
350
+ box), and scoping it here leaves the narrow column — every other skin's
351
+ default, and every bounded design-system host — pixel-identical. */
352
+ .vgai-inspector-properties-body .vgai-section {
353
+ background: var(--vgai-surface-section);
354
+ border: var(--vgai-stroke-resting) solid var(--vgai-surface-section-edge);
355
+ border-radius: var(--vgai-radius-sm);
356
+ margin-bottom: var(--vgai-space-1);
357
+ overflow: hidden;
358
+ }
359
+ /* The header is part of the card, not a slab above it: one fill, and the
360
+ divider between stacked sections is the gap plus the outline. */
361
+ .vgai-inspector-properties-body .vgai-section-header {
362
+ background: transparent;
363
+ }
364
+ .vgai-inspector-properties-body .vgai-section:last-child {
365
+ margin-bottom: 0;
366
+ }
367
+
368
+ /* THE PANEL COLUMN IS INSET ONCE. A contributed section's own frame
369
+ (`theme.css`'s `.vgai-inspector-tool-section`) adds the narrow column's
370
+ 8 px pad, a 1 px rule and a 4 px lift — and in this presentation that
371
+ doubled the inset (measured live: the body starts at x 1450.5 with its own
372
+ 8 px pad, and the first card's border still landed at 1466.5) and drew a
373
+ rule Blender has nowhere. Measured on `properties-object.png` at 2x: the
374
+ Transform card's outline sits at x 74..75 with the editor's body starting
375
+ at x 58 — 16 device px, 8 CSS, symmetric about the column's centre 333 —
376
+ and y 180..199 between the datablock row and that card is plain panel
377
+ fill, no rule. */
378
+ .vgai-inspector-properties-body .vgai-inspector-tool-section {
379
+ padding: 0;
380
+ margin-top: 0;
381
+ border-top: 0;
382
+ }
383
+
384
+ /* THE BAND. Blender heads a panel with a chevron, its name in the UI's ONE
385
+ regular-weight face, and nothing else — no glyph. Measured on
386
+ `properties-object.png` (2x) and confirmed panel-for-panel on
387
+ `properties-data-edit.png`, whose Vertex Groups / Shape Keys / UV Maps are
388
+ this document's own panels:
389
+
390
+ title cap height 18 device px (the 'T' of Transform, x 130..145,
391
+ y 218..235) — 9 CSS, the SAME cap the chrome's other labels
392
+ measure ('A' of Add Modifier in `modeling-edit-none.png`,
393
+ y 578..595). So the size was never wrong; the WEIGHT was:
394
+ ours drew 600 where Blender's face has one weight.
395
+ no glyph the band holds chevron + name. Ours put a 14 px section icon
396
+ between them, which pushed the title from Blender's 25.5 CSS
397
+ off the card's fill to 48.5.
398
+ chevron ink x 91..110 open / 95..105 closed, i.e. 7.5..17 CSS from the
399
+ fill's left edge — so 4 px of lead-in before the 15 px
400
+ disclosure box, and 6 to the title, lands the pair at 7 and 25
401
+ against Blender's 7.5 and 25.5.
402
+ gap 4 device px of panel fill between cards (y 816..819 between
403
+ the Delta Transform and Relations bands) — 2 CSS. Ours drew 4,
404
+ because the card's own margin and the mesh panel's grid gap
405
+ each spent one; the card's margin is the single owner.
406
+
407
+ Not transcribed, and why: Blender's 4x2 dot GRIP at the band's right edge
408
+ (x 553..572, y 223..230, #909090 on a 3 CSS px pitch) is its panel-REORDER
409
+ handle. This stack does not reorder, and an inert handle promises a gesture
410
+ that does not exist. */
411
+ .vgai-inspector-properties-body .vgai-section-glyph {
412
+ display: none;
413
+ }
414
+ .vgai-inspector-properties-body .vgai-section-trigger {
415
+ gap: var(--vgai-space-3);
416
+ padding-inline: var(--vgai-space-2) var(--vgai-space-4);
417
+ font-weight: 400;
418
+ /* The band mark's INK measures 5.5x9.5 CSS in the reference (the closed
419
+ `>` on `properties-object.png`, x 95..105 / y 783..801 at 2x; the open
420
+ `v` is the same mark turned, x 91..110 / y 218..235). `DisclosureIcon`'s
421
+ own `xs` rung inked 4x6 here — the squat mark a 3x crop shows beside
422
+ Blender's. `lg` is the rung whose ink lands at 5.4x8.9; no skin that
423
+ declares nothing moves, because the fallback IS `xs`. */
424
+ --vgai-section-disclosure-size: var(--vgai-icon-lg);
425
+ }
426
+
427
+ /* The MINI card — the space-tight fallback. Preview (or kind glyph) on top,
428
+ then name + eye, then the icon strip, then the open-for-edit. It fills its
429
+ viewport-island host; the host owns WHERE it sits. */
430
+ .vgai-mini-inspector {
431
+ position: relative;
432
+ display: flex;
433
+ flex-direction: column;
434
+ width: 100%;
435
+ min-height: 0;
436
+ border-radius: inherit;
437
+ overflow-y: auto;
438
+ pointer-events: auto;
439
+ }
440
+
441
+ .vgai-mini-inspector-minimize {
442
+ position: absolute;
443
+ top: var(--vgai-space-1);
444
+ right: var(--vgai-space-1);
445
+ z-index: 1;
446
+ color: var(--vgai-content-dim);
447
+ }
448
+
449
+ /* The preview square — the primary EXPAND gesture (clicking the box restores
450
+ the column). A subject with no preview shows a quiet kind glyph in the same
451
+ footprint, so no-preview subjects do not reflow the card. */
452
+ .vgai-mini-inspector-preview {
453
+ position: relative;
454
+ width: 100%;
455
+ aspect-ratio: 1 / 1;
456
+ max-height: 180px;
457
+ display: flex;
458
+ align-items: center;
459
+ justify-content: center;
460
+ overflow: hidden;
461
+ background: var(--vgai-bg-inset);
462
+ color: var(--vgai-content-dim);
463
+ cursor: pointer;
464
+ }
465
+ .vgai-mini-inspector-preview[aria-label] {
466
+ cursor: pointer;
467
+ }
468
+ .vgai-mini-inspector-preview:focus-visible {
469
+ outline: var(--vgai-focus-ring);
470
+ outline-offset: -2px;
471
+ }
472
+ .vgai-mini-inspector-preview .vgai-editor-icon {
473
+ font-size: var(--vgai-font-xl, 24px);
474
+ }
475
+
476
+ .vgai-mini-inspector-identity {
477
+ display: flex;
478
+ align-items: center;
479
+ gap: var(--vgai-space-2);
480
+ padding: var(--vgai-space-2);
481
+ }
482
+
483
+ .vgai-mini-inspector-actions {
484
+ display: flex;
485
+ justify-content: flex-end;
486
+ padding: 0 var(--vgai-space-2) var(--vgai-space-2);
487
+ }
488
+
489
+ /* The PILL — the floor. One line: thumb-glyph + name + expand, plus a clear
490
+ affordance (the only deselect a minimized box can reach). */
491
+ .vgai-inspector-pill {
492
+ display: flex;
493
+ align-items: center;
494
+ gap: var(--vgai-space-1);
495
+ width: 100%;
496
+ height: 100%;
497
+ padding: var(--vgai-space-1);
498
+ }
499
+ .vgai-inspector-pill-open {
500
+ display: flex;
501
+ align-items: center;
502
+ gap: var(--vgai-space-2);
503
+ min-width: 0;
504
+ flex: 1;
505
+ height: 100%;
506
+ border: 0;
507
+ background: transparent;
508
+ color: var(--vgai-content-primary);
509
+ cursor: pointer;
510
+ text-align: left;
511
+ }
512
+ .vgai-inspector-pill-open:focus-visible {
513
+ outline: var(--vgai-focus-ring);
514
+ outline-offset: 2px;
515
+ border-radius: var(--vgai-radius-full);
516
+ }
517
+ .vgai-inspector-pill-thumb {
518
+ position: relative;
519
+ width: 42px;
520
+ height: 42px;
521
+ flex: 0 0 42px;
522
+ display: flex;
523
+ align-items: center;
524
+ justify-content: center;
525
+ overflow: hidden;
526
+ border-radius: var(--vgai-radius-full);
527
+ background: var(--vgai-bg-inset);
528
+ border: 1px solid var(--vgai-border-2);
529
+ color: var(--vgai-content-dim);
530
+ pointer-events: none;
531
+ }
532
+ .vgai-inspector-pill-name {
533
+ min-width: 0;
534
+ overflow: hidden;
535
+ text-overflow: ellipsis;
536
+ white-space: nowrap;
537
+ font-size: var(--vgai-font-md);
538
+ font-weight: 600;
539
+ }