@volter/editor-game 0.5.65 → 0.5.67

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 (281) hide show
  1. package/contributions/audio-unlock.service.ts +2 -2
  2. package/contributions/autoplay.service.ts +1 -1
  3. package/contributions/bridge.command.ts +3 -3
  4. package/contributions/canvas/component-board.service.ts +16 -0
  5. package/contributions/canvas/design-time-mount.service.ts +45 -0
  6. package/contributions/canvas-story-capture.service.ts +12 -0
  7. package/contributions/edit-mode-audio.service.ts +2 -2
  8. package/contributions/edit-mode-networking.service.ts +1 -1
  9. package/contributions/gameplay.command.ts +4 -4
  10. package/contributions/generation.service.ts +3 -3
  11. package/contributions/generations.status.tsx +1 -1
  12. package/contributions/godot.palette.json +99 -0
  13. package/contributions/godot.style.ts +82 -0
  14. package/contributions/godot.view.ts +75 -0
  15. package/contributions/ingest.service.ts +4 -4
  16. package/contributions/instances.command.ts +1 -1
  17. package/contributions/navmesh.menu.ts +1 -1
  18. package/contributions/network-observer.service.ts +14 -0
  19. package/contributions/play.command.ts +11 -5
  20. package/contributions/react/component-board.service.ts +1 -1
  21. package/contributions/react/design-time-mount.service.ts +1 -1
  22. package/contributions/react/react-inspector.service.ts +2 -2
  23. package/contributions/scene-document.service.ts +5 -5
  24. package/contributions/state-watch.menu.ts +1 -1
  25. package/contributions/state-watch.utility.tsx +1 -1
  26. package/contributions/team-playtest.service.ts +4 -4
  27. package/contributions/three/component-board.service.ts +1 -1
  28. package/contributions/three/component-verbs.command.ts +8 -8
  29. package/contributions/three/three-authoring.service.ts +8 -5
  30. package/contributions/three-story-capture.service.ts +12 -0
  31. package/contributions/unity.palette.json +102 -0
  32. package/contributions/unity.style.ts +72 -0
  33. package/contributions/unity.view.ts +82 -0
  34. package/contributions/unreal.palette.json +105 -0
  35. package/contributions/unreal.style.ts +66 -0
  36. package/contributions/unreal.view.ts +93 -0
  37. package/dist-node/serving.mjs +16 -0
  38. package/package.json +33 -16
  39. package/serving/index.ts +27 -0
  40. package/src/asset-budget/AssetBudgetPanel.tsx +1 -1
  41. package/src/asset-budget/asset-budget-model.ts +4 -4
  42. package/src/asset-budget/optimize-apply.ts +7 -7
  43. package/src/audio/AudioDebuggerPanel.tsx +1 -1
  44. package/src/bridge/dispatch.ts +16 -16
  45. package/src/bridge/live-frames.ts +1 -1
  46. package/src/bridge/screenshot.ts +6 -6
  47. package/src/build/BuildProfilesPanel.tsx +3 -3
  48. package/src/canvas/canvas-board/CanvasBoardDocument.tsx +676 -0
  49. package/src/canvas/canvas-board/canvas-board-model.ts +407 -0
  50. package/src/canvas/canvas-board/canvas-component-board.ts +56 -0
  51. package/src/canvas/canvas-design-mount.ts +524 -0
  52. package/src/canvas/design-time-canvas-mount.ts +79 -0
  53. package/src/coverage/live-authoring-surface.ts +6 -6
  54. package/src/coverage/live-project-verbs.ts +2 -2
  55. package/src/coverage/native-system-coverage.ts +6 -6
  56. package/src/coverage/root-coverage.ts +1 -1
  57. package/src/coverage/session-coverage.ts +5 -5
  58. package/src/design-system-stories/ApplicationChrome.stories.tsx +5 -5
  59. package/src/design-system-stories/InspectorNarrowBodies.stories.tsx +13 -53
  60. package/src/edit-mode/edit-mode-audio.ts +4 -4
  61. package/src/edit-mode/edit-mode-networking.ts +2 -2
  62. package/src/game-document/GameCaptureFrameButton.tsx +2 -2
  63. package/src/game-document/GameDocument.tsx +2 -2
  64. package/src/game-document/GamePanel.tsx +8 -8
  65. package/src/game-document/InstanceInspectorPicker.tsx +2 -2
  66. package/src/game-document/crowd-debug.ts +1 -1
  67. package/src/game-document/device-preview.ts +10 -11
  68. package/src/game-document/physics-debug.ts +1 -1
  69. package/src/generation/GenerationActivity.tsx +6 -8
  70. package/src/generation/generation-documents.tsx +8 -8
  71. package/src/generation/generation-jobs.ts +2 -2
  72. package/src/generation/generation-presentation.ts +1 -1
  73. package/src/host/adapter-reach.ts +1 -1
  74. package/src/host/adapter-runtime-bindings.ts +97 -6
  75. package/src/host/api/configurations.ts +2 -2
  76. package/src/host/authoring/babylon-authoring-adapter.ts +8 -8
  77. package/src/host/authoring/contract-hierarchy-authoring.ts +1 -1
  78. package/src/host/authoring/contract-scenes-stories.ts +1 -1
  79. package/src/host/authoring/creation-site-related.ts +2 -2
  80. package/src/host/authoring/ephemeral-persistence.ts +1 -1
  81. package/src/host/authoring/gesture-persist.ts +2 -2
  82. package/src/host/authoring/ingest-data-writer.ts +1 -1
  83. package/src/host/authoring/ingest-source-persistence.ts +8 -8
  84. package/src/host/authoring/mount-isolated-pixi-screen.ts +1 -1
  85. package/src/host/authoring/mounted-authoring.ts +4 -4
  86. package/src/host/authoring/phaser-live-authoring-adapter.ts +4 -4
  87. package/src/host/authoring/pixi-authoring-adapter.ts +42 -17
  88. package/src/host/authoring/pixi-creation-site-write-target.ts +2 -2
  89. package/src/host/authoring/pixi-live-write-target.ts +7 -7
  90. package/src/host/authoring/pixi-source-identity.ts +3 -3
  91. package/src/host/authoring/pixi-source-write-target.ts +1614 -0
  92. package/src/host/authoring/pixi-still-presentation.ts +2 -2
  93. package/src/host/authoring/pixi-structure-history.ts +3 -3
  94. package/src/host/authoring/pixi-transform-channels.ts +16 -14
  95. package/src/host/authoring/source-persistence-backend.ts +6 -6
  96. package/src/host/authoring/struct-write-pipe.ts +3 -3
  97. package/src/host/binding-resolver.ts +8 -9
  98. package/src/host/browser-transpile.ts +2 -2
  99. package/src/host/canvas-entry-runtime.ts +59 -48
  100. package/src/host/canvas-preview-frames.ts +482 -0
  101. package/src/host/components/CameraAuthoringOverlay.tsx +1 -1
  102. package/src/host/components/HeaderTelemetry.tsx +9 -16
  103. package/src/host/components/PixiIsolationSceneContent.tsx +17 -16
  104. package/src/host/components/ThreeIsolationSceneContent.tsx +5 -5
  105. package/src/host/components/frame-debugger-model.ts +2 -2
  106. package/src/host/components/header-telemetry-model.ts +2 -2
  107. package/src/host/components/scene-document.tsx +29 -61
  108. package/src/host/components/utility-view-state.ts +1 -1
  109. package/src/host/components/world-root-stage-binding.tsx +17 -26
  110. package/src/host/components/world-root-stage.ts +130 -63
  111. package/src/host/coverage/capability-coverage.ts +13 -1
  112. package/src/host/coverage/game-contract-seam-evidence.ts +1 -1
  113. package/src/host/coverage/project-verb-coverage.ts +2 -17
  114. package/src/host/coverage/system-adapter-coverage.ts +4 -5
  115. package/src/host/design-system-stories/fixtures/editor-runtime.tsx +14 -8
  116. package/src/host/document-preview-three.ts +2 -2
  117. package/src/host/entry-adjudication.ts +6 -6
  118. package/src/host/game-css-scope-transform.ts +4 -0
  119. package/src/host/game-module-access.ts +1 -1
  120. package/src/host/game-realm-page.ts +16 -8
  121. package/src/host/game-realm-reclaim.ts +1 -1
  122. package/src/host/gameplay-export.ts +25 -14
  123. package/src/host/gameplay-recording.ts +5 -5
  124. package/src/host/gated-globals.ts +6 -6
  125. package/src/host/history/json-history-resource.ts +3 -3
  126. package/src/host/instance-extract-actions.ts +1 -1
  127. package/src/host/instance-fork-actions.ts +1 -1
  128. package/src/host/projection/dom.ts +2 -2
  129. package/src/host/projection/pixi.ts +25 -3
  130. package/src/host/r3f-entry-runtime.ts +65 -34
  131. package/src/host/react-mount-runtime.ts +8 -49
  132. package/src/host/realm-services.ts +2 -2
  133. package/src/host/roots/canvas-root.tsx +361 -0
  134. package/src/host/roots/module-root.ts +1 -1
  135. package/src/host/roots/r3f-root.tsx +473 -0
  136. package/src/host/roots/react-root.ts +9 -43
  137. package/src/host/scene-view-drawability.ts +2 -2
  138. package/src/host/served-bundle-runtime-modules.ts +1 -19
  139. package/src/host/server-log-bridge.ts +3 -3
  140. package/src/host/stories/mounted-story-viewport-source.ts +1 -1
  141. package/src/host/stories/pixi-story-model.ts +30 -0
  142. package/src/host/stories/story-media-captures.ts +46 -0
  143. package/src/host/stories/story-media-presence.ts +3 -3
  144. package/src/host/stories/story-pixi-preview.ts +408 -0
  145. package/src/host/stories/story-three-preview.ts +806 -0
  146. package/src/host/stories/three-story-captures.ts +35 -0
  147. package/src/host/story-three-preview-runtime.ts +56 -0
  148. package/src/host/three-ingest-runtime.ts +1 -1
  149. package/src/host/use-active-performance-source.ts +3 -3
  150. package/src/host/viewport-pose-memory.ts +1 -1
  151. package/src/host/viewport-root-presentation.ts +6 -5
  152. package/src/ingest/active-ingest.ts +2 -2
  153. package/src/ingest/authoring/ingest-dom-surface-authoring.ts +4 -4
  154. package/src/ingest/authoring/ingest-root-adapter.ts +13 -13
  155. package/src/ingest/capture-wait-report.ts +1 -1
  156. package/src/ingest/deferred-ingest-play.ts +11 -10
  157. package/src/ingest/discovery-public-ingest.ts +2 -2
  158. package/src/ingest/ingest-boot-viewport.ts +6 -8
  159. package/src/ingest/ingest-canvas-scene-document.tsx +17 -16
  160. package/src/ingest/ingest-canvas-scene.ts +5 -8
  161. package/src/ingest/ingest-evidence-hook.ts +1 -1
  162. package/src/ingest/ingest-frame-snapshot.ts +1 -1
  163. package/src/ingest/ingest-play-control.ts +4 -4
  164. package/src/ingest/ingest-render-debug.ts +11 -11
  165. package/src/ingest/ingest-siblings.ts +16 -28
  166. package/src/ingest/module-mode.ts +18 -19
  167. package/src/ingest/mount-canvas-ingest-root.ts +27 -27
  168. package/src/ingest/mount-coverage.ts +4 -4
  169. package/src/ingest/mount-dom-ingest-root.ts +16 -16
  170. package/src/ingest/mount-ingest-root.ts +14 -14
  171. package/src/ingest/mount-three-ingest-root.ts +12 -12
  172. package/src/ingest/resolve-canvas.ts +1 -1
  173. package/src/ingest/served-html-boot.ts +1 -1
  174. package/src/ingest/surface-canvas.ts +1 -1
  175. package/src/ingest/unmount-ingest-root.ts +7 -7
  176. package/src/navmesh/navmesh-handler.ts +24 -16
  177. package/src/network/NetworkInspectorPanel.tsx +449 -14
  178. package/src/network/network-inspector-model.ts +14 -2
  179. package/src/play/play-log-events.ts +1 -1
  180. package/src/play/play-mode.ts +99 -142
  181. package/src/play/play-recording.ts +2 -2
  182. package/src/play/react-play-live-authoring.ts +3 -3
  183. package/src/play/run-selection.ts +93 -0
  184. package/src/play-bar/PlayBar.tsx +20 -39
  185. package/src/profiler/FrameDebuggerPanel.tsx +1 -1
  186. package/src/profiler/PerformancePanel.tsx +4 -4
  187. package/src/react/design-time-react-mount.ts +37 -85
  188. package/src/react/dom-authoring-adapter.ts +11 -11
  189. package/src/react/react-inspector-section.tsx +13 -13
  190. package/src/react/react-world-authoring-adapter.ts +31 -143
  191. package/src/react/story-documents/story-documents.tsx +18 -22
  192. package/src/react/ui-board-document.tsx +10 -11
  193. package/src/react/ui-component-board.ts +5 -5
  194. package/src/runtime/adapter/audio-meter.ts +21 -0
  195. package/src/runtime/adapter/first-party-audio-system.ts +230 -0
  196. package/src/runtime/adapter/ingest/contract-debug-adapter.ts +114 -0
  197. package/src/runtime/adapter/ingest/contract-system-adapters.ts +256 -0
  198. package/src/runtime/adapter/ingest/merge-debug-adapters.ts +197 -0
  199. package/src/runtime/adapter/ingest/observation-debug-adapter.ts +162 -0
  200. package/src/runtime/adapter/ingest/upstream-pin.ts +51 -0
  201. package/src/runtime/adapter/native-debug-module.ts +498 -0
  202. package/src/runtime/audio/bus-mixer.ts +161 -0
  203. package/src/runtime/audio/pose-guard.ts +80 -0
  204. package/src/runtime/core/frame-pacing.ts +126 -0
  205. package/src/runtime/core/game-loop.ts +225 -0
  206. package/src/runtime/core/game-scoped-slot.ts +28 -0
  207. package/src/runtime/core/seeded-random.ts +162 -0
  208. package/src/runtime/core/sim-clock.ts +391 -0
  209. package/src/runtime/core/system-runner.ts +269 -0
  210. package/src/runtime/core/types.ts +104 -0
  211. package/src/runtime/create-runtime.ts +1128 -0
  212. package/src/runtime/debug-bridge.ts +570 -0
  213. package/src/runtime/debug-registry.ts +899 -0
  214. package/src/runtime/dev/chrome-trace.ts +153 -0
  215. package/src/runtime/dev/instruments.ts +403 -0
  216. package/src/runtime/dev/logger.ts +119 -0
  217. package/src/runtime/dev/performance-profiler.ts +367 -0
  218. package/src/runtime/dev/register-render-vitals.ts +276 -0
  219. package/src/runtime/dev/render-census.ts +354 -0
  220. package/src/runtime/dev/render-debug-adapter.ts +218 -0
  221. package/src/runtime/dev/render-memory.ts +226 -0
  222. package/src/runtime/dev/render-vitals.ts +338 -0
  223. package/src/runtime/dev/static-batch-advisor.ts +188 -0
  224. package/src/runtime/dev/webgl-frame-capture.ts +366 -0
  225. package/src/runtime/dev/webgl-gpu-timer.ts +53 -0
  226. package/src/runtime/dev-build.ts +47 -0
  227. package/src/runtime/game.ts +1636 -0
  228. package/src/runtime/gameplay-rng-trap.ts +135 -0
  229. package/src/runtime/host-context.ts +64 -0
  230. package/src/runtime/input-router.ts +169 -0
  231. package/src/runtime/mount-manifest.ts +480 -0
  232. package/src/runtime/pixi/authoring.ts +706 -0
  233. package/src/runtime/pixi/ingest.ts +116 -0
  234. package/src/runtime/pixi/physics-registry.ts +49 -0
  235. package/src/runtime/pixi/render-pass-bracket.ts +117 -0
  236. package/src/runtime/pixi/scene-capture.ts +179 -0
  237. package/src/runtime/pixi/system-adapters.ts +69 -0
  238. package/src/runtime/playtest.ts +22 -0
  239. package/src/runtime/presentation.ts +141 -0
  240. package/src/runtime/render-control.ts +642 -0
  241. package/src/runtime/render-seed.ts +77 -0
  242. package/src/runtime/run-ticks-settled.ts +73 -0
  243. package/src/runtime/setup/setup-audio.ts +72 -0
  244. package/src/services/audio-pose-guard.ts +2 -2
  245. package/src/services/game-audio.ts +152 -0
  246. package/src/services/game-network.ts +657 -0
  247. package/src/services/game-physics.ts +334 -0
  248. package/src/state-watch/StateWatchPanel.tsx +1 -1
  249. package/src/three/authoring/camera-runtime-inspector-section.tsx +4 -3
  250. package/src/three/authoring/constraint-inspector-section.tsx +8 -7
  251. package/src/three/authoring/model-asset-inspector-section.tsx +14 -17
  252. package/src/three/authoring/oid-source-persistence.ts +13 -13
  253. package/src/three/authoring/r3f-design-session.ts +79 -61
  254. package/src/three/authoring/r3f-source-authoring-adapter.ts +112 -108
  255. package/src/three/authoring/reflection-probe-inspector-section.tsx +5 -4
  256. package/src/three/authoring/spatial-joint-handles.ts +1 -1
  257. package/src/three/authoring/spatial-lod-handles.ts +1 -1
  258. package/src/three/authoring/spatial-particle-handles.ts +1 -1
  259. package/src/three/authoring/three-authoring-adapter.ts +33 -33
  260. package/src/three/component-verbs/extract-menu.ts +8 -7
  261. package/src/three/component-verbs/fork-menu.ts +8 -7
  262. package/src/three/component-verbs/internals-menu.ts +3 -3
  263. package/src/three/drei-asset-caches.ts +13 -0
  264. package/src/three/story-documents/three-story-documents.tsx +24 -34
  265. package/src/three/three-board/ThreeBoardDocument.tsx +25 -25
  266. package/src/three/three-board/board-scene.ts +7 -7
  267. package/src/three/three-board/three-component-board.ts +5 -5
  268. package/contributions/react/pasteboard.action.ts +0 -41
  269. package/contributions/xstate-behavior.action.ts +0 -42
  270. package/contributions/xstate-behavior.document.tsx +0 -73
  271. package/contributions/xstate-behavior.inspector.tsx +0 -28
  272. package/contributions/xstate-behavior.menu.ts +0 -23
  273. package/src/react/pasteboard-materialize.ts +0 -154
  274. package/src/services/game-audio-unlock.ts +0 -48
  275. package/src/xstate/XStateBehaviorSection.tsx +0 -130
  276. package/src/xstate/XStateMachineInspector.tsx +0 -566
  277. package/src/xstate/character-animation-machine.fixture.ts +0 -74
  278. package/src/xstate/live-behaviors.ts +0 -106
  279. package/src/xstate/use-live-actor-state.ts +0 -44
  280. package/src/xstate/xstate-graph.ts +0 -235
  281. package/src/xstate/xstate-layout.ts +0 -76
@@ -0,0 +1,93 @@
1
+ /**
2
+ * WHAT PLAY RUNS BESIDE THE HOST: the run configuration the person chose (kept per checkout in the
3
+ * project-local document, the way an IDE remembers its launch configuration), started before the
4
+ * game mounts and stopped with it. One module, so the Play button and the relayed `play` verb start
5
+ * the same thing — a multiplayer game's `play + server` brings its room server up either way.
6
+ */
7
+
8
+ import { editorHost } from '@volter/editor-sdk/host';
9
+ import {
10
+ type ConfigurationStatus,
11
+ listConfigurations,
12
+ startConfiguration,
13
+ stopConfiguration,
14
+ } from '../host/api/configurations';
15
+ import { setDesiredExtraInstances } from './play-mode';
16
+
17
+ /** The implicit configuration: mount every root in the host. */
18
+ export const PLAY_CONFIGURATION = 'play';
19
+ const RUN_SELECTION_SECTION = 'runSelection';
20
+
21
+ /** The configuration the person picked, or null when they have not. */
22
+ export function chosenRunConfiguration(): string | null {
23
+ return editorHost().projectLocalState.read<string>(RUN_SELECTION_SECTION) ?? null;
24
+ }
25
+
26
+ export function chooseRunConfiguration(id: string): void {
27
+ editorHost().projectLocalState.write(RUN_SELECTION_SECTION, id);
28
+ }
29
+
30
+ /**
31
+ * What Play starts: the person's pick, else the first declared compound that runs the host
32
+ * (`play + server`), as an IDE opens on its first launch configuration; a project with none plays
33
+ * alone.
34
+ */
35
+ export function selectedRunConfiguration(
36
+ declared: readonly ConfigurationStatus[],
37
+ chosen: string | null = chosenRunConfiguration(),
38
+ ): string {
39
+ return (
40
+ chosen ??
41
+ declared.find((c) => c.role === 'run' && c.kind === 'compound' && c.run?.includes(PLAY_CONFIGURATION))?.id ??
42
+ PLAY_CONFIGURATION
43
+ );
44
+ }
45
+
46
+ export type RunStart =
47
+ | { readonly ok: true; readonly started: string | null }
48
+ | { readonly ok: false; readonly title: string; readonly detail: string };
49
+
50
+ let running: string | null = null;
51
+
52
+ /** Start the selected configuration's processes (nothing for bare `play`), and say whether Play may
53
+ * go on. */
54
+ export async function startSelectedRunConfiguration(): Promise<RunStart> {
55
+ const declared = await listConfigurations().catch(() => [] as ConfigurationStatus[]);
56
+ const id = selectedRunConfiguration(declared);
57
+ const selected = declared.find((c) => c.id === id);
58
+ if (!selected || id === PLAY_CONFIGURATION) return { ok: true, started: null };
59
+ let outcome: Awaited<ReturnType<typeof startConfiguration>>;
60
+ try {
61
+ outcome = await startConfiguration(selected.id);
62
+ } catch (error) {
63
+ return { ok: false, title: `Run "${selected.id}"`, detail: error instanceof Error ? error.message : String(error) };
64
+ }
65
+ if (!outcome.ready) {
66
+ return {
67
+ ok: false,
68
+ title: `Run "${selected.id}" is not ready`,
69
+ detail: Object.entries(outcome.logs)
70
+ .map(([name, lines]) => `${name}: ${lines.slice(-3).join(' | ') || 'no output'}`)
71
+ .join('\n'),
72
+ };
73
+ }
74
+ if (selected.kind === 'compound' && selected.instances != null) {
75
+ setDesiredExtraInstances(Math.max(0, selected.instances - 1));
76
+ }
77
+ running = selected.id;
78
+ return { ok: true, started: selected.id };
79
+ }
80
+
81
+ /** Stop what the last Play started beside the host. */
82
+ export async function stopStartedRunConfiguration(): Promise<void> {
83
+ const id = running;
84
+ running = null;
85
+ if (!id) return;
86
+ await stopConfiguration(id).catch((error: unknown) =>
87
+ editorHost().notify({
88
+ tone: 'error',
89
+ title: `Stop "${id}"`,
90
+ detail: error instanceof Error ? error.message : String(error),
91
+ }),
92
+ );
93
+ }
@@ -1,10 +1,13 @@
1
+ import { type ConfigurationStatus, listConfigurations } from '../host/api/configurations';
1
2
  import {
2
- type ConfigurationStatus,
3
- listConfigurations,
4
- startConfiguration,
5
- stopConfiguration,
6
- } from '../host/api/configurations';
7
- import { isGameplayExportActive, subscribeGameplayExport } from '@volter/editor-core/gameplay-export-state';
3
+ chooseRunConfiguration,
4
+ chosenRunConfiguration,
5
+ PLAY_CONFIGURATION,
6
+ selectedRunConfiguration,
7
+ startSelectedRunConfiguration,
8
+ stopStartedRunConfiguration,
9
+ } from '../play/run-selection';
10
+ import { isGameplayExportActive, subscribeGameplayExport } from '@volter/editor-sdk/kit/gameplay-export-state';
8
11
  import { PLAY_CONTROL_TEST_ID } from '../host/play-control-hook';
9
12
  import type { IconDefinition } from '@fortawesome/fontawesome-svg-core';
10
13
  import { faChevronDown } from '@fortawesome/free-solid-svg-icons';
@@ -31,7 +34,6 @@ import {
31
34
  getRestartRequiredReason,
32
35
  pausePlayMode,
33
36
  resumePlayMode,
34
- setDesiredExtraInstances,
35
37
  stepPlayMode,
36
38
  subscribeRestartRequired,
37
39
  } from '../play/play-mode';
@@ -288,36 +290,17 @@ export function PlayBar({ placement = 'launcher' }: { placement?: 'launcher' | '
288
290
  const selected = run.configurations.find((c) => c.id === run.selectedId) ?? null;
289
291
  const instances = selected?.kind === 'compound' ? (selected.instances ?? null) : null;
290
292
  const play = async () => {
291
- if (selected && selected.kind !== PLAY_ID) {
292
- const outcome = await startConfiguration(selected.id).catch((error: unknown) => {
293
- editorHost().notify({
294
- tone: 'error',
295
- title: `Run "${selected.id}"`,
296
- detail: error instanceof Error ? error.message : String(error),
297
- });
298
- return null;
299
- });
300
- if (!outcome) return;
301
- if (!outcome.ready) {
302
- editorHost().notify({
303
- tone: 'error',
304
- title: `Run "${selected.id}" is not ready`,
305
- detail: Object.entries(outcome.logs)
306
- .map(([id, lines]) => `${id}: ${lines.slice(-3).join(' | ') || 'no output'}`)
307
- .join('\n'),
308
- });
309
- return;
310
- }
311
- if (instances !== null) setDesiredExtraInstances(Math.max(0, instances - 1));
312
- void run.refresh();
293
+ const start = await startSelectedRunConfiguration();
294
+ if (!start.ok) {
295
+ editorHost().notify({ tone: 'error', title: start.title, detail: start.detail });
296
+ return;
313
297
  }
298
+ if (start.started) void run.refresh();
314
299
  await enterPlayMode();
315
300
  };
316
301
  const stop = () => {
317
302
  exitPlayMode();
318
- if (selected && selected.kind !== PLAY_ID) {
319
- void stopConfiguration(selected.id).then(() => run.refresh());
320
- }
303
+ void stopStartedRunConfiguration().then(() => run.refresh());
321
304
  };
322
305
  return (
323
306
  <PlayBarView
@@ -388,8 +371,7 @@ function PlayOptions() {
388
371
  }
389
372
 
390
373
  /** The implicit configuration: mount every root in the host. */
391
- const PLAY_ID = 'play';
392
- const RUN_SELECTION_SECTION = 'runSelection';
374
+ const PLAY_ID = PLAY_CONFIGURATION;
393
375
 
394
376
  interface RunState {
395
377
  readonly configurations: readonly ConfigurationStatus[];
@@ -403,9 +385,7 @@ interface RunState {
403
385
  * document, the way an IDE remembers the chosen launch configuration. */
404
386
  function useRunConfigurations(): RunState {
405
387
  const [declared, setDeclared] = useState<readonly ConfigurationStatus[]>([]);
406
- const [selectedId, setSelectedId] = useState<string>(
407
- () => editorHost().projectLocalState.read<string>(RUN_SELECTION_SECTION) ?? PLAY_ID,
408
- );
388
+ const [chosenId, setChosenId] = useState<string | null>(chosenRunConfiguration);
409
389
  const refresh = useCallback(async () => {
410
390
  const list = await listConfigurations().catch(() => []);
411
391
  setDeclared(list);
@@ -426,9 +406,10 @@ function useRunConfigurations(): RunState {
426
406
  ],
427
407
  [declared],
428
408
  );
409
+ const selectedId = selectedRunConfiguration(declared, chosenId);
429
410
  const select = useCallback((id: string) => {
430
- setSelectedId(id);
431
- editorHost().projectLocalState.write(RUN_SELECTION_SECTION, id);
411
+ setChosenId(id);
412
+ chooseRunConfiguration(id);
432
413
  }, []);
433
414
  return { configurations, selectedId, select, refresh };
434
415
  }
@@ -32,7 +32,7 @@ import { Button, themeVars } from '@volter/editor-sdk/widgets';
32
32
  import type {
33
33
  FrameCapture,
34
34
  FrameCaptureDrawCall,
35
- } from '@volter/game-runtime/dev/webgl-frame-capture';
35
+ } from '../runtime/dev/webgl-frame-capture';
36
36
  import { useEffect, useState, useSyncExternalStore } from 'react';
37
37
  import {
38
38
  captureFrame,
@@ -17,7 +17,7 @@ import {
17
17
  type TimeSpentRow,
18
18
  timeSpentRows,
19
19
  } from '../host/components/frame-debugger-model';
20
- import { isJsHeapReading, readJsHeap } from '@volter/editor-core/js-heap';
20
+ import { isJsHeapReading, readJsHeap } from '@volter/editor-sdk/kit/js-heap';
21
21
  import { useActivePerformanceSource } from '../host/use-active-performance-source';
22
22
  import { editorHost, useHostAvailabilitySelector } from '@volter/editor-sdk/host';
23
23
  import {
@@ -30,13 +30,13 @@ import {
30
30
  spaceVar,
31
31
  themeVars,
32
32
  } from '@volter/editor-sdk/widgets';
33
- import { buildChromeTrace } from '@volter/game-runtime/dev/chrome-trace';
33
+ import { buildChromeTrace } from '../runtime/dev/chrome-trace';
34
34
  import type {
35
35
  PerformanceFrame,
36
36
  PerformanceProfiler,
37
37
  PerformanceSnapshot,
38
- } from '@volter/game-runtime/dev/performance-profiler';
39
- import type { RenderMemorySnapshot } from '@volter/game-runtime/dev/render-memory';
38
+ } from '../runtime/dev/performance-profiler';
39
+ import type { RenderMemorySnapshot } from '../runtime/dev/render-memory';
40
40
  import { useEffect, useRef, useState } from 'react';
41
41
  import { createMainThreadBusySampler, type MainThreadBusySampler } from './main-thread-busy';
42
42
 
@@ -4,8 +4,7 @@
4
4
  * composed story of the project laid out as an isolated, labeled frame, with
5
5
  * the root entry's own story (derived, never labeled — the story whose CSF
6
6
  * `meta.component` is the entry's default export) as the frame it opens on.
7
- * A project with no stories, and the pasteboard document's `entryOnly`
8
- * descriptor, fall back to mounting the entry once against an inert Game.
7
+ * A project with no stories falls back to mounting the entry once, bare.
9
8
  *
10
9
  * ## Why this is a package and not the host's
11
10
  *
@@ -38,8 +37,7 @@
38
37
  * them as `@volter/editor-game/react/…` and declares the dependency.
39
38
  * - `@editor/authoring/react-story-board.ts` (the board geometry) —
40
39
  * `@editor/components/RootSelectionOverlay.tsx:98`,
41
- * `@editor/components/ReactCanvasControls.tsx:15`,
42
- * `@editor/pasteboard-materialize.ts:20` and
40
+ * `@editor/components/ReactCanvasControls.tsx:15` and
43
41
  * `@editor/canvas-board/CanvasBoardDocument.tsx:57` read its frame
44
42
  * placements. Host chrome drawn OVER the board, which is a different
45
43
  * question from how the board mounts.
@@ -59,36 +57,33 @@
59
57
  import type {
60
58
  DesignTimeRootDescriptor,
61
59
  LayerMountResult,
62
- } from '@volter/editor-core/authoring/design-time-layers';
60
+ } from '@volter/editor-sdk/kit/authoring/design-time-layers';
63
61
  import {
64
62
  rememberedPortableStory,
65
63
  rememberPortableStory,
66
- } from '@volter/editor-core/authoring/design-time-layers';
67
- import type { DesignTimeMountContext } from '@volter/editor-core/authoring/design-time-mount-registry';
68
- import { formatMountFailureMessage } from '@volter/editor-core/authoring/mount-failure-report';
69
- import type { ReactStoryBoardSelectionIntent } from '@volter/editor-core/authoring/react-story-board';
70
- import { createReactStoryBoard } from '@volter/editor-core/authoring/react-story-board';
64
+ } from '@volter/editor-sdk/kit/authoring/design-time-layers';
65
+ import type { DesignTimeMountContext } from '@volter/editor-sdk/kit/authoring/design-time-mount-registry';
66
+ import { formatMountFailureMessage } from '@volter/editor-sdk/kit/mount-failure-report';
67
+ import type { ReactStoryBoardSelectionIntent } from '@volter/editor-sdk/kit/authoring/react-story-board';
68
+ import { createReactStoryBoard } from '@volter/editor-sdk/kit/authoring/react-story-board';
71
69
  import {
72
70
  getRootCanvasViewport,
73
71
  setRootCanvasViewport,
74
- } from '@volter/editor-core/authoring/world-canvas-viewport-state';
75
- import { recordAuthoringConsumerUse } from '@volter/editor-core/coverage/authoring-seam-evidence';
76
- import { CrashNullBoundary } from '@volter/editor-core/crash-null-boundary';
77
- import { readProjectTextFile } from '@volter/editor-core/editor-api';
78
- import { editorConsole } from '@volter/editor-core/editor-console';
79
- import {
80
- resolveReactRootMountRuntime,
81
- resolveWorldProviderForProject,
82
- } from '../host/react-mount-runtime';
72
+ } from '@volter/editor-sdk/kit/world-canvas-viewport-state';
73
+ import { recordAuthoringConsumerUse } from '@volter/editor-sdk/kit/authoring-seam-evidence';
74
+ import { CrashNullBoundary } from '@volter/editor-sdk/kit/crash-null-boundary';
75
+ import { readProjectTextFile } from '@volter/editor-sdk/kit/editor-api';
76
+ import { editorConsole } from '@volter/editor-sdk/kit/editor-console';
77
+ import { resolveReactRootMountRuntime } from '../host/react-mount-runtime';
83
78
  import { activeRealmServices } from '../host/realm-services';
84
79
  import { resolveReactAdapterRootComponent } from '../host/roots/react-root';
85
- import { scopedGameStylesState } from '@volter/editor-core/scoped-game-css';
86
- import { componentIdentityName } from '@volter/editor-core/stories/compose-project-stories';
87
- import { mountIsolatedStory } from '@volter/editor-core/stories/StoryPreviewMount';
80
+ import { scopedGameStylesState } from '@volter/editor-sdk/kit/scoped-game-css';
81
+ import { componentIdentityName } from '@volter/editor-sdk/kit/stories/compose-project-stories';
82
+ import { mountIsolatedStory } from '@volter/editor-sdk/kit/stories/StoryPreviewMount';
88
83
  import {
89
84
  createStoryPresentationIndex,
90
85
  storyBoardPresentation,
91
- } from '@volter/editor-core/stories/story-presentation';
86
+ } from '@volter/editor-sdk/kit/stories/story-presentation';
92
87
  import {
93
88
  getComponentPreviewStory,
94
89
  getProjectPreviewStories,
@@ -97,15 +92,12 @@ import {
97
92
  projectStoriesReady,
98
93
  refreshProjectStories,
99
94
  subscribeProjectStoryModules,
100
- } from '@volter/editor-core/stories/story-registry';
101
- import { domStoryBoardMembers } from '@volter/editor-core/stories/three-story-model';
102
- import { getDesignTokens } from '@volter/editor-core/ui-source/inspect';
103
- import { tierSourceWriteBackend } from '@volter/editor-core/ui-source/tier-source-write-backend';
104
- import { recordViewportFirstFrame } from '@volter/editor-core/viewport-activation-timings';
105
- import { createAssetCache } from '@volter/threejs-runtime/assets';
106
- import { createGameLoop } from '@volter/game-runtime/core/game-loop';
95
+ } from '@volter/editor-sdk/kit/stories/story-registry';
96
+ import { domStoryBoardMembers } from '@volter/editor-threejs/kit/stories/three-story-model';
97
+ import { getDesignTokens } from '@volter/editor-sdk/kit/ui-source/inspect';
98
+ import { tierSourceWriteBackend } from '@volter/editor-sdk/kit/ui-source/tier-source-write-backend';
99
+ import { recordViewportFirstFrame } from '@volter/editor-sdk/kit/viewport-activation-timings';
107
100
  import type { ResolvedAdapterRoot } from '@volter/editor-project/manifest/load';
108
- import { createGame, type GameInternal } from '@volter/game-runtime/runtime/game';
109
101
  import { beginProjectMountEpoch } from '@volter/editor-sdk/session/project-module-url';
110
102
  import type { ComponentType } from 'react';
111
103
  import { type OidElementLike, ReactRootAuthoringAdapter } from './react-world-authoring-adapter';
@@ -168,35 +160,6 @@ async function seedRootViewportFromManifest(): Promise<void> {
168
160
  // An unreadable manifest declares nothing; Fill stands.
169
161
  }
170
162
  }
171
- /**
172
- * The inert design-time Game stand-in (B1's one genuine design
173
- * decision). A REAL `Game` — never a hand-typed duck-typed literal, mirroring
174
- * this repo's own test convention (`packages/editor/test/adapter-conformance-kit.ts`'s
175
- * `headlessGame()`) — built with a loop that is constructed but NEVER
176
- * started/ticked, and with NO roots ever registered. This satisfies
177
- * `useGame`/`useWorldState` (`@volter/game-runtime/react/world-state`, and any project's own
178
- * re-export of it) without throwing, genuinely inertly:
179
- * - `state.subscribe` never fires — nothing ever calls
180
- * `GameStateBridgeInternal.bump()` (only `GameInternal.runFrame` does, and
181
- * this Game's loop never runs a frame);
182
- * - `state.frameVersion` stays `0` forever;
183
- * - `queryByComponent`/`world()`/`roots` are empty/`null` because `roots`
184
- * stays `[]` (nothing ever calls `registerRoot`).
185
- * `defaultRoot`/`components`/`input`/`audio` throw descriptively if touched
186
- * (same as any fresh `createGame()` before a world registers) — a HUD that
187
- * reaches for those is out of scope for a design-time stand-in and SHOULD
188
- * throw loudly, caught by the crash-null boundary below, degrading to the
189
- * #18 error node rather than silently faking a value.
190
- *
191
- * B2 swaps this stand-in's DATA for story-sourced data (a `data`/services
192
- * seam) — this function is the seam B2 replaces/extends, not a permanent
193
- * fixture; it never constructs a live Game/sockets.
194
- */
195
- function createDesignTimeGame(): GameInternal {
196
- const loop = createGameLoop({ fixedTimestep: 1 / 60, maxSubSteps: 8, update: () => {} });
197
- return createGame({ loop, assets: createAssetCache() });
198
- }
199
-
200
163
  /**
201
164
  * A minimal `ResolvedAdapterRoot` satisfying `resolveReactAdapterRootComponent`
202
165
  * (`../binding-resolver.ts`, which reads only `id`/`kind`/`entry` off
@@ -232,7 +195,7 @@ type EntryResolution = { ok: true; Entry: ComponentType } | { ok: false; error:
232
195
  /**
233
196
  * Load a React root's entry component ONCE per layer mount, without throwing.
234
197
  * Both of this layer's paths need it: the derived default story is joined
235
- * against this component's identity, and the inert-Game fallback renders it.
198
+ * against this component's identity, and the no-story fallback renders it.
236
199
  * A failure is carried rather than thrown so the story board can still open
237
200
  * over a project whose entry is broken; only the fallback (which has nothing
238
201
  * else to render) rethrows it.
@@ -255,16 +218,14 @@ async function resolveEntryComponent(
255
218
  /**
256
219
  * React design-time mount — the entry
257
220
  * via the EXISTING #31 loader (`resolveReactAdapterRootComponent`, reused
258
- * verbatim), wrapped in the canonical engine `WorldProvider`
259
- * (`resolveWorldProviderForProject`) around the inert
260
- * `createDesignTimeGame()` stand-in and a React error boundary.
221
+ * verbatim), rendered inside a React error boundary.
261
222
  * `flushSync` forces the initial render/commit/error-boundary-recovery to
262
223
  * finish before this call returns (mirrors `ingest-siblings.ts`'s
263
224
  * `mountDefaultReactSibling`), so a throwing entry is caught HERE —
264
225
  * synchronously — rather than discovered later on react's own schedule.
265
226
  *
266
227
  * Portable CSF stories take the board path above. This branch is only the
267
- * explicit no-story fallback and mounts the entry once against the inert Game.
228
+ * explicit no-story fallback and mounts the entry once.
268
229
  * On success, it mints the world's live `ReactRootAuthoringAdapter` over this
269
230
  * layer's now-mounted DOM — the adapter reflects
270
231
  * an already-mounted root, it never mounts one itself; this function is the
@@ -298,8 +259,7 @@ export async function mountReactDesignLayer(
298
259
  // Edit mode lays EVERY composed story of the project out as an isolated,
299
260
  // labeled frame on one editor-only board — board membership is
300
261
  // project-global, the project's own component gallery. Play still tears
301
- // this entire surface down and mounts only the manifest entry against the
302
- // real Game.
262
+ // this entire surface down and mounts only the manifest entry.
303
263
  //
304
264
  // A remount that the registry's own publish requested already has fresh
305
265
  // stories: refreshing again would reload every story module in parallel —
@@ -316,7 +276,7 @@ export async function mountReactDesignLayer(
316
276
 
317
277
  // The root's composed default preview is DERIVED, never labeled: it is the
318
278
  // story whose CSF `meta.component` is this root entry's default-exported
319
- // component. Resolve that component first (the same loader the inert-Game
279
+ // component. Resolve that component first (the same loader the no-story
320
280
  // fallback below reuses), then ask the registry for its story.
321
281
  //
322
282
  // The join is by component NAME, not function identity, and that is
@@ -352,7 +312,7 @@ export async function mountReactDesignLayer(
352
312
  // is only what picks the INITIAL frame). Without this the derivation would
353
313
  // silently gate the entire design surface — a broken entry would take every
354
314
  // story down with it.
355
- if (portableStories.length > 0 && !candidate.entryOnly) {
315
+ if (portableStories.length > 0) {
356
316
  const rememberedStoryId = rememberedPortableStory(projectRoot, candidate.worldId);
357
317
  // Remembered choice, else the derived default, else discovery order —
358
318
  // the same "no explicit default falls back to first" rule the registry
@@ -612,21 +572,15 @@ export async function mountReactDesignLayer(
612
572
  // (the caller degrades it to a #18 disclosure node).
613
573
  if (!entry.ok) throw entry.error instanceof Error ? entry.error : new Error(String(entry.error));
614
574
 
615
- // An entryOnly mount (the pasteboard document) ASKED for exactly this
616
- // branch — the file is the canvas and its default export the one subject —
617
- // so "no CSF preview, falling back" would be noise about working-as-designed.
618
- if (!candidate.entryOnly) {
619
- editorConsole.warn(
620
- `[design-time-layers] React root "${candidate.worldId}" has no portable CSF preview — the ` +
621
- 'project declares no UI stories. Add a *.stories.tsx; give it a `meta.component` of ' +
622
- `this root's entry component${entryComponentName ? ` (${entryComponentName}, ${candidate.path})` : ''} ` +
623
- 'to make it this root’s default preview. Falling back to the inert-Game preview.',
624
- 'authoring',
625
- );
626
- }
575
+ editorConsole.warn(
576
+ `[design-time-layers] React root "${candidate.worldId}" has no portable CSF preview — the ` +
577
+ 'project declares no UI stories. Add a *.stories.tsx; give it a `meta.component` of ' +
578
+ `this root's entry component${entryComponentName ? ` (${entryComponentName}, ${candidate.path})` : ''} ` +
579
+ 'to make it this root’s default preview. Falling back to rendering the entry bare.',
580
+ 'authoring',
581
+ );
627
582
 
628
583
  const Entry = entry.Entry;
629
- const WorldProvider = await resolveWorldProviderForProject();
630
584
  // C1 (phase-b/c1-react-mount): this layer's own react-world mount is a
631
585
  // SECOND call site with the identical packaged-runtime dual-React-instance
632
586
  // exposure `binding-resolver.ts`'s `ReactRootAdapter.mount()` has — under
@@ -634,14 +588,13 @@ export async function mountReactDesignLayer(
634
588
  // from the PROJECT's own react, not this module's (removed) static
635
589
  // imports. See `resolveReactRootMountRuntime`'s doc comment.
636
590
  const { createElement, createRoot, flushSync } = await resolveReactRootMountRuntime();
637
- const game = createDesignTimeGame();
638
591
  const root = createRoot(layer);
639
592
  const render = (onCaught: (error: unknown) => void): void => {
640
593
  root.render(
641
594
  createElement(CrashNullBoundary, {
642
595
  key: '__entry__',
643
596
  onCaught,
644
- children: createElement(WorldProvider, { game }, createElement(Entry)),
597
+ children: createElement(Entry),
645
598
  }),
646
599
  );
647
600
  };
@@ -674,7 +627,6 @@ export async function mountReactDesignLayer(
674
627
  // but this keeps teardown clean).
675
628
  adapter.disposeReactRootAdapter();
676
629
  root.unmount();
677
- game.dispose();
678
630
  },
679
631
  };
680
632
  }
@@ -43,13 +43,13 @@
43
43
  * mount ends — which is also when the edits themselves expire.
44
44
  */
45
45
 
46
- import { numericStyleValue } from '@volter/editor-core/authoring/css-numeric-style';
46
+ import { numericStyleValue } from '@volter/editor-sdk/css-numeric-style';
47
47
  import { createEphemeralPersistence } from '../host/authoring/ephemeral-persistence';
48
- import { LIVE_ONLY_DESTINATION } from '@volter/editor-core/authoring/write-pipe';
49
- import type { EditorShellStore } from '@volter/editor-core/editor-shell-store';
48
+ import { LIVE_ONLY_DESTINATION } from '@volter/editor-sdk/kit/write-pipe';
49
+ import type { EditorShellStore } from '@volter/editor-threejs/kit/editor-shell-store';
50
50
  import { type JournalSubject, JsonHistoryResource } from '../host/history/json-history-resource';
51
51
  import { DomProjector, structuralDomIdentity } from '../host/projection/dom';
52
- import { browserOrInlineResolver, getComputedStyleValue } from '@volter/editor-core/ui-source/inspect';
52
+ import { browserOrInlineResolver, getComputedStyleValue } from '@volter/editor-sdk/kit/ui-source/inspect';
53
53
  import type {
54
54
  AssetSubjectProvider,
55
55
  AuthoringAdapter,
@@ -271,7 +271,7 @@ export class DomAuthoringAdapter implements AuthoringAdapter {
271
271
  private readonly store: EditorShellStore,
272
272
  opts: DomAuthoringOptions,
273
273
  ) {
274
- const history = store.projectHistory;
274
+ const history = store.shell.projectHistory;
275
275
  this.historyResource = history
276
276
  ? new JsonHistoryResource({
277
277
  history,
@@ -372,8 +372,8 @@ export class DomAuthoringAdapter implements AuthoringAdapter {
372
372
  };
373
373
 
374
374
  readonly selection: SelectionProvider = {
375
- get: () => [...this.store.selectedEntityIds],
376
- set: (ids) => this.store.selectMultiple(ids),
375
+ get: () => [...this.store.shell.selectedEntityIds],
376
+ set: (ids) => this.store.shell.selectMultiple(ids),
377
377
  };
378
378
 
379
379
  /**
@@ -650,7 +650,7 @@ export class DomAuthoringAdapter implements AuthoringAdapter {
650
650
  if (path === 'locked') {
651
651
  if (value) this.lockedIds.add(id);
652
652
  else this.lockedIds.delete(id);
653
- this.store.notifyIngestEdit();
653
+ this.store.shell.notifyIngestEdit();
654
654
  return;
655
655
  }
656
656
  if (path === 'visible') {
@@ -700,7 +700,7 @@ export class DomAuthoringAdapter implements AuthoringAdapter {
700
700
 
701
701
  this.applyStyleToElement(n.el, prop, value);
702
702
  this.recordStyleEdit(id, prop, value);
703
- this.store.notifyIngestEdit();
703
+ this.store.shell.notifyIngestEdit();
704
704
 
705
705
  return true;
706
706
  }
@@ -747,11 +747,11 @@ export class DomAuthoringAdapter implements AuthoringAdapter {
747
747
  this.applyStyleToElement(node.el, prop, values[prop] ?? '');
748
748
  }
749
749
  }
750
- this.store.notifyIngestEdit();
750
+ this.store.shell.notifyIngestEdit();
751
751
  }
752
752
 
753
753
  subscribe(listener: () => void): () => void {
754
- return this.store.subscribe(listener);
754
+ return this.store.shell.subscribe(listener);
755
755
  }
756
756
 
757
757
  /**
@@ -1,4 +1,4 @@
1
- import { setAuthoringSelection } from '@volter/editor-core/authoring/consumer-actions';
1
+ import { setAuthoringSelection } from '@volter/editor-sdk/kit/authoring/consumer-actions';
2
2
  import { faBookBookmark, faCode, faPalette } from '@fortawesome/free-solid-svg-icons';
3
3
  import {
4
4
  Button,
@@ -52,24 +52,24 @@ import {
52
52
  activeBreakpoint,
53
53
  setActiveBreakpoint,
54
54
  subscribeBreakpoint,
55
- } from '@volter/editor-core/authoring/breakpoint-state';
56
- import { CompositeAuthoringAdapter } from '@volter/editor-core/authoring/composite-authoring-adapter';
57
- import { numericStyleValue, UNITLESS_NUMBER_PROPS } from '@volter/editor-core/authoring/css-numeric-style';
58
- import { beginEyedropperSession } from '@volter/editor-core/authoring/eyedropper-session';
59
- import { groupProperties } from '@volter/editor-core/components/inspector-property-grouping';
60
- import { useEditorStore } from '@volter/editor-core/editor-runtime';
61
- import { createHmrRegistrationGroup } from '@volter/editor-core/hmr-registration-group';
62
- import { groupIcon } from '@volter/editor-core/inspection/compose';
55
+ } from '@volter/editor-sdk/kit/breakpoint-state';
56
+ import { CompositeAuthoringAdapter } from '@volter/editor-sdk/kit/authoring/composite-authoring-adapter';
57
+ import { numericStyleValue, UNITLESS_NUMBER_PROPS } from '@volter/editor-sdk/css-numeric-style';
58
+ import { beginEyedropperSession } from '@volter/editor-sdk/kit/eyedropper-session';
59
+ import { groupProperties } from '@volter/editor-sdk/kit/inspector-property-grouping';
60
+ import { useEditorStore } from '@volter/editor-sdk/kit/editor-runtime';
61
+ import { createHmrRegistrationGroup } from '@volter/editor-sdk/kit/hmr-registration-group';
62
+ import { groupIcon } from '@volter/editor-sdk/kit/inspection/compose';
63
63
  import {
64
64
  GROUP_SECTION_ORDER,
65
65
  groupSectionId,
66
66
  type InspectionSection,
67
67
  PROPERTIES_SECTION_ID,
68
68
  PROPERTIES_SECTION_ORDER,
69
- } from '@volter/editor-core/inspection/model';
70
- import { registerInspectorSections } from '@volter/editor-core/inspector-section-registry';
71
- import { effectiveColorFromChain, getAvailableFonts } from '@volter/editor-core/ui-source/inspect';
72
- import type { OidEntry } from '@volter/editor-core/ui-source/oid-transform';
69
+ } from '@volter/editor-sdk/kit/inspection-model';
70
+ import { registerInspectorSections } from '@volter/editor-sdk/kit/inspector-section-registry';
71
+ import { effectiveColorFromChain, getAvailableFonts } from '@volter/editor-sdk/kit/ui-source/inspect';
72
+ import type { OidEntry } from '@volter/editor-react/source/oid-transform';
73
73
  import type { AuthoringAdapter, EditorNode, PropertyDescriptor } from '@volter/editor-project/adapter';
74
74
  import {
75
75
  AlignmentGrid,