@vived/component-pneumatic-panel 1.1.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +60 -19
  2. package/dist/Domain/Adapters/pneumaticPanelPMAdapter.d.ts.map +1 -1
  3. package/dist/Domain/Controllers/applyPanelState.d.ts +4 -0
  4. package/dist/Domain/Controllers/applyPanelState.d.ts.map +1 -0
  5. package/dist/Domain/Controllers/getPanelState.d.ts +4 -0
  6. package/dist/Domain/Controllers/getPanelState.d.ts.map +1 -0
  7. package/dist/Domain/Controllers/panelStateDefaults.d.ts +7 -0
  8. package/dist/Domain/Controllers/panelStateDefaults.d.ts.map +1 -0
  9. package/dist/Domain/Entities/PneumaticPanelEntity.d.ts +0 -4
  10. package/dist/Domain/Entities/PneumaticPanelEntity.d.ts.map +1 -1
  11. package/dist/Domain/Mocks/MockPneumaticPanelSelectUC.d.ts +1 -1
  12. package/dist/Domain/Mocks/MockPneumaticPanelSelectUC.d.ts.map +1 -1
  13. package/dist/Domain/PMs/PneumaticPanelPM.d.ts +0 -3
  14. package/dist/Domain/PMs/PneumaticPanelPM.d.ts.map +1 -1
  15. package/dist/Domain/makeDomainForTesting.d.ts +6 -0
  16. package/dist/Domain/makeDomainForTesting.d.ts.map +1 -0
  17. package/dist/Frameworks/Babylon/PneumaticPanelBabylonView.d.ts +9 -12
  18. package/dist/Frameworks/Babylon/PneumaticPanelBabylonView.d.ts.map +1 -1
  19. package/dist/Frameworks/Babylon/PneumaticPanelExhaustView.d.ts +2 -2
  20. package/dist/Frameworks/Babylon/PneumaticPanelExhaustView.d.ts.map +1 -1
  21. package/dist/Frameworks/Babylon/PneumaticPanelGaugeView.d.ts +2 -2
  22. package/dist/Frameworks/Babylon/PneumaticPanelGaugeView.d.ts.map +1 -1
  23. package/dist/Frameworks/Babylon/PneumaticPanelHitboxView.d.ts +5 -6
  24. package/dist/Frameworks/Babylon/PneumaticPanelHitboxView.d.ts.map +1 -1
  25. package/dist/Frameworks/Babylon/PneumaticPanelLockView.d.ts +2 -2
  26. package/dist/Frameworks/Babylon/PneumaticPanelLockView.d.ts.map +1 -1
  27. package/dist/PneumaticPanelFacade.d.ts +116 -0
  28. package/dist/PneumaticPanelFacade.d.ts.map +1 -0
  29. package/dist/index.d.ts +4 -3
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +1691 -1714
  32. package/package.json +1 -1
  33. package/dist/Domain/Controllers/clearAllHighlights.d.ts +0 -9
  34. package/dist/Domain/Controllers/clearAllHighlights.d.ts.map +0 -1
  35. package/dist/Domain/Controllers/setHighlightedObject.d.ts +0 -11
  36. package/dist/Domain/Controllers/setHighlightedObject.d.ts.map +0 -1
  37. package/dist/Frameworks/Babylon/OutlinePulseController.d.ts +0 -18
  38. package/dist/Frameworks/Babylon/OutlinePulseController.d.ts.map +0 -1
  39. package/dist/Frameworks/Babylon/OverlayPulseController.d.ts +0 -17
  40. package/dist/Frameworks/Babylon/OverlayPulseController.d.ts.map +0 -1
  41. package/dist/Frameworks/Babylon/ScreenSpaceOutlinePulseController.d.ts +0 -17
  42. package/dist/Frameworks/Babylon/ScreenSpaceOutlinePulseController.d.ts.map +0 -1
package/README.md CHANGED
@@ -15,13 +15,15 @@ A 3D interactive pneumatic control panel for VIVED slide applications. Features
15
15
  npm install @vived/component-pneumatic-panel @vived/core @babylonjs/core
16
16
  ```
17
17
 
18
+ The host-facing surface is the **`PneumaticPanelFacade`** — a single typed object (Smart
19
+ Component Facade Contract v1) that drives an instance through commands, typed events,
20
+ lifecycle, and persisted state.
21
+
18
22
  ```typescript
19
23
  import { makeAppObjectRepo, makeDomainFactoryRepo } from "@vived/core";
20
24
  import {
21
25
  makePneumaticPanelFeatureFactory,
22
- createBabylonPneumaticPanel,
23
- tryToggleExhaust,
24
- tryToggleLock,
26
+ PneumaticPanelFacade,
25
27
  } from "@vived/component-pneumatic-panel";
26
28
 
27
29
  const appObjects = makeAppObjectRepo();
@@ -29,32 +31,71 @@ const factoryRepo = makeDomainFactoryRepo(appObjects);
29
31
  makePneumaticPanelFeatureFactory(appObjects);
30
32
  factoryRepo.setupDomain();
31
33
 
32
- const appObject = await createBabylonPneumaticPanel("panel-1", appObjects);
34
+ const panel = new PneumaticPanelFacade("panel-1", appObjects); // wires the domain stack (sync)
35
+ await panel.load(); // attaches and loads the Babylon view
36
+
37
+ panel.toggleExhaust(); // open exhaust
38
+ panel.toggleLock(); // engage lock
39
+ panel.toggleExhaust(); // false — blocked by lock
33
40
 
34
- tryToggleExhaust("panel-1", appObjects); // open exhaust
35
- tryToggleLock("panel-1", appObjects); // engage lock
36
- tryToggleExhaust("panel-1", appObjects); // false — blocked by lock
41
+ const unsubscribe = panel.onEvent("exhaustOpened", () => console.log("opened"));
37
42
  ```
38
43
 
44
+ > Need the raw `AppObject` (e.g. to parent the root node or register shadow casters)? Use
45
+ > the `createBabylonPneumaticPanel(id, appObjects)` composition entry point, which creates
46
+ > the same domain stack and view and returns the `AppObject`.
47
+
39
48
  ## API
40
49
 
41
- | Controller | Returns | Description |
42
- | ------------------ | --------- | --------------------------------------------------------- |
43
- | `tryToggleExhaust` | `boolean` | Toggle exhaust valve. Returns `false` if locked. |
44
- | `tryToggleLock` | `boolean` | Toggle safety lock. Returns `false` if exhaust is closed. |
45
- | `checkPressure` | `void` | Shows current pressure in an alert dialog. |
50
+ `PneumaticPanelFacade` implements **Contract v1** — eight mandatory members shared by every
51
+ VIVED smart component, plus component-specific commands and a typed event catalog.
52
+
53
+ ### Contract members
54
+
55
+ | Member | Signature | Description |
56
+ | ------------------ | ------------------------------------------ | -------------------------------------------------------- |
57
+ | `id` | `readonly string` | Instance identifier. |
58
+ | `interfaceVersion` | `readonly number` | Contract version implemented (`1`). |
59
+ | `onEvent` | `(event, cb) => () => void` | Subscribe to a typed event; returns unsubscribe. |
60
+ | `onViewModel` | `(cb) => () => void` | Subscribe to the reactive VM (emits immediately). |
61
+ | `load` | `(variant?) => Promise<void>` | Attach and load the Babylon view. |
62
+ | `destroy` | `() => void` | Tear down and release resources. |
63
+ | `getState` | `() => PneumaticPanelState` | Versioned state snapshot. |
64
+ | `applyState` | `(state) => void` | Restore a snapshot. |
65
+
66
+ ### Commands
67
+
68
+ | Command | Returns | Description |
69
+ | ----------------------------- | --------- | --------------------------------------------------------- |
70
+ | `toggleExhaust()` | `boolean` | Toggle exhaust valve. Returns `false` if locked. |
71
+ | `toggleLock()` | `boolean` | Toggle safety lock. Returns `false` if exhaust is closed. |
72
+ | `checkPressure()` | `void` | Show current pressure in an alert dialog. |
73
+ | `setShowGhostLockHint(show)` | `void` | Toggle always-visible ghost-lock hint. |
74
+ | `enableHitbox()` / `disableHitbox()` | `void` | Toggle whole-panel selection mode. |
75
+
76
+ ### Events (`onEvent`)
77
+
78
+ `exhaustOpened`, `exhaustClosed`, `exhaustCloseBlockedByLock`, `panelLocked`,
79
+ `panelUnlocked`, `panelSelected`, `pressureChecked`.
80
+ All callbacks are `() => void` — read current state from `getState()` or `onViewModel`.
81
+
82
+ > Hover/hint/selection feedback is the Host's responsibility (ADR-0009). The component is
83
+ > presentation-free for interaction state — read `view.highlightGroupsByObjectId` to outline
84
+ > the panel from the invisible hitbox.
46
85
 
47
- ### View Model
86
+ ### Reactive view model
48
87
 
49
88
  ```typescript
50
- interface PneumaticPanelVM {
51
- exhaustOpen: boolean;
52
- isLocked: boolean;
53
- pressure: number;
54
- }
89
+ const unsubscribe = panel.onViewModel((vm) => {
90
+ console.log(vm.exhaustOpen, vm.isLocked, vm.pressure, vm.panelHitboxEnabled);
91
+ });
55
92
  ```
56
93
 
57
- Subscribe to state changes via `pneumaticPanelPMAdapter.subscribe(id, appObjects, callback)`.
94
+ The flat controllers and `pneumaticPanelPMAdapter` remain exported as the underlying
95
+ mechanism the facade delegates to (and which the Babylon view boundary calls directly),
96
+ but the facade is the canonical host-facing surface. See
97
+ [COMPONENT_KNOWLEDGE.md](COMPONENT_KNOWLEDGE.md) for the full API reference, recipes, and
98
+ the complete export list.
58
99
 
59
100
  ## Development
60
101
 
@@ -1 +1 @@
1
- {"version":3,"file":"pneumaticPanelPMAdapter.d.ts","sourceRoot":"","sources":["../../../src/Domain/Adapters/pneumaticPanelPMAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AAEjC;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAE,SAAS,CAAC,gBAAgB,CA0C/D,CAAC"}
1
+ {"version":3,"file":"pneumaticPanelPMAdapter.d.ts","sourceRoot":"","sources":["../../../src/Domain/Adapters/pneumaticPanelPMAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AAEjC;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAE,SAAS,CAAC,gBAAgB,CAyC/D,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { AppObjectRepo } from "@vived/core";
2
+ import type { PneumaticPanelState } from "../../PneumaticPanelFacade";
3
+ export declare function applyPanelState(id: string, appObjects: AppObjectRepo, state: Partial<PneumaticPanelState>): void;
4
+ //# sourceMappingURL=applyPanelState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applyPanelState.d.ts","sourceRoot":"","sources":["../../../src/Domain/Controllers/applyPanelState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGtE,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,aAAa,EACzB,KAAK,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAClC,IAAI,CAoBN"}
@@ -0,0 +1,4 @@
1
+ import { AppObjectRepo } from "@vived/core";
2
+ import type { PneumaticPanelState } from "../../PneumaticPanelFacade";
3
+ export declare function getPanelState(id: string, appObjects: AppObjectRepo, version: number): PneumaticPanelState;
4
+ //# sourceMappingURL=getPanelState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getPanelState.d.ts","sourceRoot":"","sources":["../../../src/Domain/Controllers/getPanelState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGtE,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,aAAa,EACzB,OAAO,EAAE,MAAM,GACd,mBAAmB,CAqBrB"}
@@ -0,0 +1,7 @@
1
+ export declare const PNEUMATIC_PANEL_DEFAULT_STATE_FIELDS: {
2
+ readonly exhaustOpen: false;
3
+ readonly isLocked: false;
4
+ readonly showGhostLockHint: false;
5
+ readonly panelHitboxEnabled: false;
6
+ };
7
+ //# sourceMappingURL=panelStateDefaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panelStateDefaults.d.ts","sourceRoot":"","sources":["../../../src/Domain/Controllers/panelStateDefaults.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oCAAoC;;;;;CAKvC,CAAC"}
@@ -1,5 +1,4 @@
1
1
  import { AppObject, AppObjectEntity, AppObjectRepo } from "@vived/core";
2
- export type PneumaticPanelHighlightedObject = "none" | "ghostLock" | "lock" | "exhaustKnob" | "gauge" | "panelHitbox";
3
2
  /**
4
3
  * Pneumatic Panel Entity
5
4
  *
@@ -23,9 +22,6 @@ export declare abstract class PneumaticPanelEntity extends AppObjectEntity {
23
22
  */
24
23
  abstract get showGhostLockHint(): boolean;
25
24
  abstract set showGhostLockHint(val: boolean);
26
- /** Which object should be highlighted in the scene. */
27
- abstract get highlightedObject(): PneumaticPanelHighlightedObject;
28
- abstract set highlightedObject(val: PneumaticPanelHighlightedObject);
29
25
  /** Whether the panel hitbox is enabled for whole-panel selection. */
30
26
  abstract get panelHitboxEnabled(): boolean;
31
27
  abstract set panelHitboxEnabled(val: boolean);
@@ -1 +1 @@
1
- {"version":3,"file":"PneumaticPanelEntity.d.ts","sourceRoot":"","sources":["../../../src/Domain/Entities/PneumaticPanelEntity.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,eAAe,EACf,aAAa,EAGd,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,+BAA+B,GACvC,MAAM,GACN,WAAW,GACX,MAAM,GACN,aAAa,GACb,OAAO,GACP,aAAa,CAAC;AAElB;;;;;GAKG;AACH,8BAAsB,oBAAqB,SAAQ,eAAe;IAChE,MAAM,CAAC,QAAQ,CAAC,IAAI,0BAA0B;IAE9C,wCAAwC;IACxC,QAAQ,KAAK,WAAW,IAAI,OAAO,CAAC;IACpC,QAAQ,KAAK,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE;IAEvC,gEAAgE;IAChE,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC;IACjC,QAAQ,KAAK,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE;IAEpC,+BAA+B;IAC/B,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC;IAChC,QAAQ,KAAK,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE;IAEnC;;;OAGG;IACH,QAAQ,KAAK,iBAAiB,IAAI,OAAO,CAAC;IAC1C,QAAQ,KAAK,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE;IAE7C,uDAAuD;IACvD,QAAQ,KAAK,iBAAiB,IAAI,+BAA+B,CAAC;IAClE,QAAQ,KAAK,iBAAiB,CAAC,GAAG,EAAE,+BAA+B,EAAE;IAErE,qEAAqE;IACrE,QAAQ,KAAK,kBAAkB,IAAI,OAAO,CAAC;IAC3C,QAAQ,KAAK,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE;IAE9C;;OAEG;IACH,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,oBAAoB,GAAG,SAAS;IAI/D;;OAEG;IACH,MAAM,CAAC,OAAO,CACZ,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,aAAa,GACxB,oBAAoB,GAAG,SAAS;CAGpC;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,SAAS,GACnB,oBAAoB,CAEtB"}
1
+ {"version":3,"file":"PneumaticPanelEntity.d.ts","sourceRoot":"","sources":["../../../src/Domain/Entities/PneumaticPanelEntity.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,eAAe,EACf,aAAa,EAGd,MAAM,aAAa,CAAC;AAErB;;;;;GAKG;AACH,8BAAsB,oBAAqB,SAAQ,eAAe;IAChE,MAAM,CAAC,QAAQ,CAAC,IAAI,0BAA0B;IAE9C,wCAAwC;IACxC,QAAQ,KAAK,WAAW,IAAI,OAAO,CAAC;IACpC,QAAQ,KAAK,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE;IAEvC,gEAAgE;IAChE,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC;IACjC,QAAQ,KAAK,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE;IAEpC,+BAA+B;IAC/B,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC;IAChC,QAAQ,KAAK,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE;IAEnC;;;OAGG;IACH,QAAQ,KAAK,iBAAiB,IAAI,OAAO,CAAC;IAC1C,QAAQ,KAAK,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE;IAE7C,qEAAqE;IACrE,QAAQ,KAAK,kBAAkB,IAAI,OAAO,CAAC;IAC3C,QAAQ,KAAK,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE;IAE9C;;OAEG;IACH,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,oBAAoB,GAAG,SAAS;IAI/D;;OAEG;IACH,MAAM,CAAC,OAAO,CACZ,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,aAAa,GACxB,oBAAoB,GAAG,SAAS;CAGpC;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,SAAS,GACnB,oBAAoB,CAEtB"}
@@ -6,7 +6,7 @@ import { PneumaticPanelSelectUC } from "../UCs/PneumaticPanelSelectUC";
6
6
  export declare class MockPneumaticPanelSelectUC extends PneumaticPanelSelectUC {
7
7
  enableHitbox: () => void;
8
8
  disableHitbox: () => void;
9
- subscribeOnPanelSelected: (_callback: () => void) => (() => void);
9
+ subscribeOnPanelSelected: () => (() => void);
10
10
  notifyPanelSelected: () => void;
11
11
  constructor(appObject: AppObject);
12
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MockPneumaticPanelSelectUC.d.ts","sourceRoot":"","sources":["../../../src/Domain/Mocks/MockPneumaticPanelSelectUC.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE;;GAEG;AACH,qBAAa,0BAA2B,SAAQ,sBAAsB;IACpE,YAAY,QAAO,IAAI,CAAO;IAC9B,aAAa,QAAO,IAAI,CAAO;IAC/B,wBAAwB,GACrB,WAAW,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC,CAC5B;IACX,mBAAmB,QAAO,IAAI,CAAO;gBAEzB,SAAS,EAAE,SAAS;CAGjC"}
1
+ {"version":3,"file":"MockPneumaticPanelSelectUC.d.ts","sourceRoot":"","sources":["../../../src/Domain/Mocks/MockPneumaticPanelSelectUC.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE;;GAEG;AACH,qBAAa,0BAA2B,SAAQ,sBAAsB;IACpE,YAAY,QAAO,IAAI,CAAO;IAC9B,aAAa,QAAO,IAAI,CAAO;IAC/B,wBAAwB,QAAO,CAAC,MAAM,IAAI,CAAC,CAAa;IACxD,mBAAmB,QAAO,IAAI,CAAO;gBAEzB,SAAS,EAAE,SAAS;CAGjC"}
@@ -1,5 +1,4 @@
1
1
  import { AppObject, AppObjectPM, AppObjectRepo } from "@vived/core";
2
- import { type PneumaticPanelHighlightedObject } from "../Entities/PneumaticPanelEntity";
3
2
  /**
4
3
  * View Model for Pneumatic Panel UI rendering.
5
4
  * Immutable snapshot of component state suitable for views.
@@ -16,8 +15,6 @@ export interface PneumaticPanelVM {
16
15
  * When false, reveal it only on hover (assessment mode).
17
16
  */
18
17
  showGhostLockHint: boolean;
19
- /** Which object should be highlighted in the scene. */
20
- highlightedObject: PneumaticPanelHighlightedObject;
21
18
  /** Whether the panel hitbox is enabled for whole-panel selection. */
22
19
  panelHitboxEnabled: boolean;
23
20
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"PneumaticPanelPM.d.ts","sourceRoot":"","sources":["../../../src/Domain/PMs/PneumaticPanelPM.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAEL,KAAK,+BAA+B,EACrC,MAAM,kCAAkC,CAAC;AAE1C;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,WAAW,EAAE,OAAO,CAAC;IACrB,oCAAoC;IACpC,QAAQ,EAAE,OAAO,CAAC;IAClB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,iBAAiB,EAAE,OAAO,CAAC;IAC3B,uDAAuD;IACvD,iBAAiB,EAAE,+BAA+B,CAAC;IACnD,qEAAqE;IACrE,kBAAkB,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,wBAAwB,EAAE,OAAO,CAAC;CACnC;AAED;;;;;;GAMG;AACH,8BAAsB,gBAAiB,SAAQ,WAAW,CAAC,gBAAgB,CAAC;IAC1E,MAAM,CAAC,QAAQ,CAAC,IAAI,sBAAsB;IAE1C,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,gBAAgB,GAAG,SAAS;IAI3D,MAAM,CAAC,OAAO,CACZ,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,aAAa,GACxB,gBAAgB,GAAG,SAAS;CAGhC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS,GAAG,gBAAgB,CAE3E"}
1
+ {"version":3,"file":"PneumaticPanelPM.d.ts","sourceRoot":"","sources":["../../../src/Domain/PMs/PneumaticPanelPM.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGpE;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,WAAW,EAAE,OAAO,CAAC;IACrB,oCAAoC;IACpC,QAAQ,EAAE,OAAO,CAAC;IAClB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,iBAAiB,EAAE,OAAO,CAAC;IAC3B,qEAAqE;IACrE,kBAAkB,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,wBAAwB,EAAE,OAAO,CAAC;CACnC;AAED;;;;;;GAMG;AACH,8BAAsB,gBAAiB,SAAQ,WAAW,CAAC,gBAAgB,CAAC;IAC1E,MAAM,CAAC,QAAQ,CAAC,IAAI,sBAAsB;IAE1C,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,gBAAgB,GAAG,SAAS;IAI3D,MAAM,CAAC,OAAO,CACZ,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,aAAa,GACxB,gBAAgB,GAAG,SAAS;CAGhC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS,GAAG,gBAAgB,CAE3E"}
@@ -0,0 +1,6 @@
1
+ import { AppObjectRepo } from "@vived/core";
2
+ export interface DomainForTesting {
3
+ appObjects: AppObjectRepo;
4
+ }
5
+ export declare function makeDomainForTesting(): DomainForTesting;
6
+ //# sourceMappingURL=makeDomainForTesting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makeDomainForTesting.d.ts","sourceRoot":"","sources":["../../src/Domain/makeDomainForTesting.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAGd,MAAM,aAAa,CAAC;AAGrB,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,aAAa,CAAC;CAC3B;AAED,wBAAgB,oBAAoB,IAAI,gBAAgB,CAMvD"}
@@ -2,14 +2,6 @@ import type { AbstractMesh } from "@babylonjs/core";
2
2
  import type { Node } from "@babylonjs/core";
3
3
  import type { TransformNode } from "@babylonjs/core";
4
4
  import { AppObject, AppObjectView } from "@vived/core";
5
- export type PneumaticPanelGlowConfig = {
6
- blurHorizontalSize: number;
7
- blurVerticalSize: number;
8
- innerGlow: boolean;
9
- isEnabled: boolean;
10
- neutralAlpha: number;
11
- outerGlow: boolean;
12
- };
13
5
  export declare abstract class PneumaticPanelBabylonView extends AppObjectView {
14
6
  static readonly type = "PneumaticPanelBabylonView";
15
7
  /** Resolves the Babylon scene, loads meshes, and subscribes to updates. */
@@ -20,10 +12,15 @@ export declare abstract class PneumaticPanelBabylonView extends AppObjectView {
20
12
  abstract get shadowCasters(): AbstractMesh[];
21
13
  /** Lookup of every scene node keyed by its objectId metadata. Populated after load() completes. */
22
14
  abstract get nodesByObjectId(): ReadonlyMap<string, Node>;
23
- /** Current runtime glow/highlight layer config used by this view. */
24
- abstract get glowConfig(): Readonly<PneumaticPanelGlowConfig>;
25
- /** Merge-and-apply a partial glow config at runtime. */
26
- abstract updateGlowConfig(patch: Partial<PneumaticPanelGlowConfig>): Readonly<PneumaticPanelGlowConfig>;
15
+ /**
16
+ * Meshes the Host should treat as one highlightable unit, keyed by semantic objectId.
17
+ * Populated after load() completes.
18
+ *
19
+ * The `panel_hitbox` entry maps to every visible panel mesh (all meshes except the
20
+ * invisible hitbox itself), so outlining the invisible hitbox outlines the visible panel.
21
+ * All other entries map to a single-element array for their respective mesh.
22
+ */
23
+ abstract get highlightGroupsByObjectId(): ReadonlyMap<string, AbstractMesh[]>;
27
24
  static get(appObj: AppObject): PneumaticPanelBabylonView | undefined;
28
25
  }
29
26
  export declare function makePneumaticPanelBabylonView(appObject: AppObject): PneumaticPanelBabylonView;
@@ -1 +1 @@
1
- {"version":3,"file":"PneumaticPanelBabylonView.d.ts","sourceRoot":"","sources":["../../../src/Frameworks/Babylon/PneumaticPanelBabylonView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIrD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAoBvD,MAAM,MAAM,wBAAwB,GAAG;IACrC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,8BAAsB,yBAA0B,SAAQ,aAAa;IACnE,MAAM,CAAC,QAAQ,CAAC,IAAI,+BAA+B;IAEnD,2EAA2E;IAC3E,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAE9B,gGAAgG;IAChG,QAAQ,KAAK,iBAAiB,IAAI,aAAa,GAAG,SAAS,CAAC;IAE5D,sEAAsE;IACtE,QAAQ,KAAK,aAAa,IAAI,YAAY,EAAE,CAAC;IAE7C,mGAAmG;IACnG,QAAQ,KAAK,eAAe,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAE1D,qEAAqE;IACrE,QAAQ,KAAK,UAAU,IAAI,QAAQ,CAAC,wBAAwB,CAAC,CAAC;IAE9D,wDAAwD;IACxD,QAAQ,CAAC,gBAAgB,CACvB,KAAK,EAAE,OAAO,CAAC,wBAAwB,CAAC,GACvC,QAAQ,CAAC,wBAAwB,CAAC;IAErC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,yBAAyB,GAAG,SAAS;CAGrE;AAED,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,SAAS,GACnB,yBAAyB,CAE3B"}
1
+ {"version":3,"file":"PneumaticPanelBabylonView.d.ts","sourceRoot":"","sources":["../../../src/Frameworks/Babylon/PneumaticPanelBabylonView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAoBvD,8BAAsB,yBAA0B,SAAQ,aAAa;IACnE,MAAM,CAAC,QAAQ,CAAC,IAAI,+BAA+B;IAEnD,2EAA2E;IAC3E,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAE9B,gGAAgG;IAChG,QAAQ,KAAK,iBAAiB,IAAI,aAAa,GAAG,SAAS,CAAC;IAE5D,sEAAsE;IACtE,QAAQ,KAAK,aAAa,IAAI,YAAY,EAAE,CAAC;IAE7C,mGAAmG;IACnG,QAAQ,KAAK,eAAe,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAE1D;;;;;;;OAOG;IACH,QAAQ,KAAK,yBAAyB,IAAI,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IAE9E,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,yBAAyB,GAAG,SAAS;CAGrE;AAED,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,SAAS,GACnB,yBAAyB,CAE3B"}
@@ -1,4 +1,4 @@
1
- import { HighlightLayer, Node } from "@babylonjs/core";
1
+ import { Node } from "@babylonjs/core";
2
2
  import { AppObject, AppObjectView } from "@vived/core";
3
3
  export declare const pneumaticPanelExhaustKnobMetadata = "exhaust_knob";
4
4
  /**
@@ -10,7 +10,7 @@ export declare const pneumaticPanelExhaustKnobMetadata = "exhaust_knob";
10
10
  */
11
11
  export declare abstract class PneumaticPanelExhaustView extends AppObjectView {
12
12
  static readonly type = "PneumaticPanelExhaustView";
13
- abstract bindMeshes(nodesByObjectId: ReadonlyMap<string, Node>, highlightLayer: HighlightLayer): void;
13
+ abstract bindMeshes(nodesByObjectId: ReadonlyMap<string, Node>): void;
14
14
  static get(appObj: AppObject): PneumaticPanelExhaustView | undefined;
15
15
  }
16
16
  export declare function makePneumaticPanelExhaustView(appObject: AppObject): PneumaticPanelExhaustView;
@@ -1 +1 @@
1
- {"version":3,"file":"PneumaticPanelExhaustView.d.ts","sourceRoot":"","sources":["../../../src/Frameworks/Babylon/PneumaticPanelExhaustView.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,cAAc,EACd,IAAI,EACL,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQvD,eAAO,MAAM,iCAAiC,iBAAiB,CAAC;AAEhE;;;;;;GAMG;AACH,8BAAsB,yBAA0B,SAAQ,aAAa;IACnE,MAAM,CAAC,QAAQ,CAAC,IAAI,+BAA+B;IAEnD,QAAQ,CAAC,UAAU,CACjB,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,EAC1C,cAAc,EAAE,cAAc,GAC7B,IAAI;IAEP,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,yBAAyB,GAAG,SAAS;CAGrE;AAED,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,SAAS,GACnB,yBAAyB,CAE3B"}
1
+ {"version":3,"file":"PneumaticPanelExhaustView.d.ts","sourceRoot":"","sources":["../../../src/Frameworks/Babylon/PneumaticPanelExhaustView.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,IAAI,EACL,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAMvD,eAAO,MAAM,iCAAiC,iBAAiB,CAAC;AAEhE;;;;;;GAMG;AACH,8BAAsB,yBAA0B,SAAQ,aAAa;IACnE,MAAM,CAAC,QAAQ,CAAC,IAAI,+BAA+B;IAEnD,QAAQ,CAAC,UAAU,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI;IAErE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,yBAAyB,GAAG,SAAS;CAGrE;AAED,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,SAAS,GACnB,yBAAyB,CAE3B"}
@@ -1,9 +1,9 @@
1
- import { HighlightLayer, Node } from "@babylonjs/core";
1
+ import { Node } from "@babylonjs/core";
2
2
  import { AppObject, AppObjectView } from "@vived/core";
3
3
  export declare const pneumaticPanelGaugeMetadata = "gauge";
4
4
  export declare abstract class PneumaticPanelGaugeView extends AppObjectView {
5
5
  static readonly type = "PneumaticPanelGaugeView";
6
- abstract bindMeshes(nodesByObjectId: ReadonlyMap<string, Node>, highlightLayer: HighlightLayer): void;
6
+ abstract bindMeshes(nodesByObjectId: ReadonlyMap<string, Node>): void;
7
7
  static get(appObj: AppObject): PneumaticPanelGaugeView | undefined;
8
8
  }
9
9
  export declare function makePneumaticPanelGaugeView(appObject: AppObject): PneumaticPanelGaugeView;
@@ -1 +1 @@
1
- {"version":3,"file":"PneumaticPanelGaugeView.d.ts","sourceRoot":"","sources":["../../../src/Frameworks/Babylon/PneumaticPanelGaugeView.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,cAAc,EACd,IAAI,EACL,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAOvD,eAAO,MAAM,2BAA2B,UAAU,CAAC;AAEnD,8BAAsB,uBAAwB,SAAQ,aAAa;IACjE,MAAM,CAAC,QAAQ,CAAC,IAAI,6BAA6B;IAEjD,QAAQ,CAAC,UAAU,CACjB,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,EAC1C,cAAc,EAAE,cAAc,GAC7B,IAAI;IAEP,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,uBAAuB,GAAG,SAAS;CAGnE;AAED,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,SAAS,GACnB,uBAAuB,CAEzB"}
1
+ {"version":3,"file":"PneumaticPanelGaugeView.d.ts","sourceRoot":"","sources":["../../../src/Frameworks/Babylon/PneumaticPanelGaugeView.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,IAAI,EACL,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKvD,eAAO,MAAM,2BAA2B,UAAU,CAAC;AAEnD,8BAAsB,uBAAwB,SAAQ,aAAa;IACjE,MAAM,CAAC,QAAQ,CAAC,IAAI,6BAA6B;IAEjD,QAAQ,CAAC,UAAU,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI;IAErE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,uBAAuB,GAAG,SAAS;CAGnE;AAED,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,SAAS,GACnB,uBAAuB,CAEzB"}
@@ -1,17 +1,16 @@
1
- import { HighlightLayer, Node } from "@babylonjs/core";
1
+ import { Node } from "@babylonjs/core";
2
2
  import { AppObject, AppObjectView } from "@vived/core";
3
3
  export declare const pneumaticPanelHitboxMetadata = "panel_hitbox";
4
4
  /**
5
- * Babylon view that owns panel hitbox interaction and visual feedback.
5
+ * Babylon view that owns panel hitbox click interaction.
6
6
  *
7
7
  * The hitbox is an invisible bounding mesh (objectId: "panel_hitbox") that
8
- * covers the entire panel. When enabled, it is pickable and responds to
9
- * pointer events with a hover outline. The Activity-authored hint glow is
10
- * driven by highlightedObject === "panelHitbox" via the domain VM.
8
+ * covers the entire panel. When enabled, it is pickable. The Host owns all
9
+ * hover detection and interaction-state presentation (ADR 0009).
11
10
  */
12
11
  export declare abstract class PneumaticPanelHitboxView extends AppObjectView {
13
12
  static readonly type = "PneumaticPanelHitboxView";
14
- abstract bindMeshes(nodesByObjectId: ReadonlyMap<string, Node>, highlightLayer: HighlightLayer): void;
13
+ abstract bindMeshes(nodesByObjectId: ReadonlyMap<string, Node>): void;
15
14
  static get(appObj: AppObject): PneumaticPanelHitboxView | undefined;
16
15
  }
17
16
  export declare function makePneumaticPanelHitboxView(appObject: AppObject): PneumaticPanelHitboxView;
@@ -1 +1 @@
1
- {"version":3,"file":"PneumaticPanelHitboxView.d.ts","sourceRoot":"","sources":["../../../src/Frameworks/Babylon/PneumaticPanelHitboxView.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,cAAc,EAEd,IAAI,EACL,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAOvD,eAAO,MAAM,4BAA4B,iBAAiB,CAAC;AAQ3D;;;;;;;GAOG;AACH,8BAAsB,wBAAyB,SAAQ,aAAa;IAClE,MAAM,CAAC,QAAQ,CAAC,IAAI,8BAA8B;IAElD,QAAQ,CAAC,UAAU,CACjB,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,EAC1C,cAAc,EAAE,cAAc,GAC7B,IAAI;IAEP,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,wBAAwB,GAAG,SAAS;CAGpE;AAED,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,SAAS,GACnB,wBAAwB,CAE1B"}
1
+ {"version":3,"file":"PneumaticPanelHitboxView.d.ts","sourceRoot":"","sources":["../../../src/Frameworks/Babylon/PneumaticPanelHitboxView.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,IAAI,EACL,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKvD,eAAO,MAAM,4BAA4B,iBAAiB,CAAC;AAE3D;;;;;;GAMG;AACH,8BAAsB,wBAAyB,SAAQ,aAAa;IAClE,MAAM,CAAC,QAAQ,CAAC,IAAI,8BAA8B;IAElD,QAAQ,CAAC,UAAU,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI;IAErE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,wBAAwB,GAAG,SAAS;CAGpE;AAED,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,SAAS,GACnB,wBAAwB,CAE1B"}
@@ -1,4 +1,4 @@
1
- import { HighlightLayer, Node } from "@babylonjs/core";
1
+ import { Node } from "@babylonjs/core";
2
2
  import { AppObject, AppObjectView } from "@vived/core";
3
3
  export declare const pneumaticPanelLockMetadata = "lock";
4
4
  export declare const pneumaticPanelGhostLockMetadata = "ghost_lock";
@@ -10,7 +10,7 @@ export declare const pneumaticPanelGhostLockMetadata = "ghost_lock";
10
10
  */
11
11
  export declare abstract class PneumaticPanelLockView extends AppObjectView {
12
12
  static readonly type = "PneumaticPanelLockView";
13
- abstract bindMeshes(nodesByObjectId: ReadonlyMap<string, Node>, highlightLayer: HighlightLayer): void;
13
+ abstract bindMeshes(nodesByObjectId: ReadonlyMap<string, Node>): void;
14
14
  abstract flash(): void;
15
15
  static get(appObj: AppObject): PneumaticPanelLockView | undefined;
16
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PneumaticPanelLockView.d.ts","sourceRoot":"","sources":["../../../src/Frameworks/Babylon/PneumaticPanelLockView.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,cAAc,EACd,IAAI,EAEL,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAOvD,eAAO,MAAM,0BAA0B,SAAS,CAAC;AACjD,eAAO,MAAM,+BAA+B,eAAe,CAAC;AAE5D;;;;;GAKG;AACH,8BAAsB,sBAAuB,SAAQ,aAAa;IAChE,MAAM,CAAC,QAAQ,CAAC,IAAI,4BAA4B;IAEhD,QAAQ,CAAC,UAAU,CACjB,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,EAC1C,cAAc,EAAE,cAAc,GAC7B,IAAI;IACP,QAAQ,CAAC,KAAK,IAAI,IAAI;IAEtB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,sBAAsB,GAAG,SAAS;CAGlE;AAED,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,SAAS,GACnB,sBAAsB,CAExB"}
1
+ {"version":3,"file":"PneumaticPanelLockView.d.ts","sourceRoot":"","sources":["../../../src/Frameworks/Babylon/PneumaticPanelLockView.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,IAAI,EAEL,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKvD,eAAO,MAAM,0BAA0B,SAAS,CAAC;AACjD,eAAO,MAAM,+BAA+B,eAAe,CAAC;AAE5D;;;;;GAKG;AACH,8BAAsB,sBAAuB,SAAQ,aAAa;IAChE,MAAM,CAAC,QAAQ,CAAC,IAAI,4BAA4B;IAEhD,QAAQ,CAAC,UAAU,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI;IACrE,QAAQ,CAAC,KAAK,IAAI,IAAI;IAEtB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,sBAAsB,GAAG,SAAS;CAGlE;AAED,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,SAAS,GACnB,sBAAsB,CAExB"}
@@ -0,0 +1,116 @@
1
+ import { AppObjectRepo } from "@vived/core";
2
+ import type { PneumaticPanelVM } from "./Domain/PMs/PneumaticPanelPM";
3
+ export declare const PNEUMATIC_PANEL_STATE_VERSION = 2;
4
+ export type PneumaticPanelState = {
5
+ version: number;
6
+ exhaustOpen: boolean;
7
+ isLocked: boolean;
8
+ showGhostLockHint: boolean;
9
+ panelHitboxEnabled: boolean;
10
+ };
11
+ /**
12
+ * SmartComponent structural convention (local definition per ADR-0006).
13
+ * Smart Component Facade Contract v1 — eight mandatory members. Copied
14
+ * per-project and satisfied by structural typing (no shared base class).
15
+ */
16
+ export interface SmartComponent {
17
+ readonly id: string;
18
+ readonly interfaceVersion: number;
19
+ onEvent(event: string, cb: (...args: never[]) => void): () => void;
20
+ onViewModel(cb: (vm: PneumaticPanelVM) => void): () => void;
21
+ load(variant?: string): Promise<void>;
22
+ destroy(): void;
23
+ getState(): PneumaticPanelState;
24
+ applyState(state: PneumaticPanelState): void;
25
+ }
26
+ /**
27
+ * Typed event catalog for PneumaticPanel events (per ADR-0006)
28
+ */
29
+ export type PneumaticPanelEvents = {
30
+ exhaustOpened: () => void;
31
+ exhaustClosed: () => void;
32
+ exhaustCloseBlockedByLock: () => void;
33
+ panelLocked: () => void;
34
+ panelUnlocked: () => void;
35
+ panelSelected: () => void;
36
+ pressureChecked: () => void;
37
+ };
38
+ /**
39
+ * Host-facing facade for Pneumatic Panel smart component.
40
+ * Wraps flat controllers behind a single typed class implementing SmartComponent.
41
+ */
42
+ export declare class PneumaticPanelFacade implements SmartComponent {
43
+ readonly id: string;
44
+ readonly interfaceVersion = 1;
45
+ private appObjects;
46
+ /**
47
+ * Dispatch map: event key → subscribe controller
48
+ * Each controller has signature: (id, appObjects, cb: () => void) => () => void
49
+ */
50
+ private eventDispatchMap;
51
+ /**
52
+ * Constructor: synchronously wire the domain instance.
53
+ * No Babylon dependency; fully headless and testable.
54
+ *
55
+ * @param id - The instance identifier
56
+ * @param appObjects - The AppObject repository
57
+ */
58
+ constructor(id: string, appObjects: AppObjectRepo);
59
+ /**
60
+ * Asynchronously load and attach the Babylon view.
61
+ * Required before the component renders in a 3D scene.
62
+ */
63
+ /**
64
+ * Asynchronously load and attach the Babylon view.
65
+ *
66
+ * @param variant - Optional asset variant. No variants are implemented yet,
67
+ * so an omitted or unrecognized variant loads the default asset
68
+ * (best-effort, per Contract v1).
69
+ */
70
+ load(variant?: string): Promise<void>;
71
+ /**
72
+ * Tear down the component and release all resources.
73
+ */
74
+ destroy(): void;
75
+ /**
76
+ * Toggle the exhaust valve open/closed.
77
+ * @returns true if toggle succeeded, false if blocked (e.g., by lock)
78
+ */
79
+ toggleExhaust(): boolean;
80
+ /**
81
+ * Toggle the lock state.
82
+ * @returns true if toggle succeeded, false if blocked (e.g., exhaust open)
83
+ */
84
+ toggleLock(): boolean;
85
+ /**
86
+ * Trigger a pressure check.
87
+ */
88
+ checkPressure(): void;
89
+ /**
90
+ * Show or hide the ghost lock hint.
91
+ */
92
+ setShowGhostLockHint(show: boolean): void;
93
+ /**
94
+ * Enable the whole-panel hitbox for single-target selection.
95
+ */
96
+ enableHitbox(): void;
97
+ /**
98
+ * Disable the whole-panel hitbox, restoring sub-component interactivity.
99
+ */
100
+ disableHitbox(): void;
101
+ getState(): PneumaticPanelState;
102
+ applyState(state: PneumaticPanelState): void;
103
+ /**
104
+ * Subscribe to a typed event.
105
+ * @param event - The event key (typed by PneumaticPanelEvents)
106
+ * @param cb - The callback function
107
+ * @returns An unsubscribe function
108
+ */
109
+ onEvent<K extends keyof PneumaticPanelEvents>(event: K, cb: PneumaticPanelEvents[K]): () => void;
110
+ /**
111
+ * Subscribe to the reactive view model. Emits the current VM immediately,
112
+ * then on every change. Returns an unsubscribe function.
113
+ */
114
+ onViewModel(cb: (vm: PneumaticPanelVM) => void): () => void;
115
+ }
116
+ //# sourceMappingURL=PneumaticPanelFacade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PneumaticPanelFacade.d.ts","sourceRoot":"","sources":["../src/PneumaticPanelFacade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAkB5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAE/C,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACnE,WAAW,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5D,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,IAAI,IAAI,CAAC;IAChB,QAAQ,IAAI,mBAAmB,CAAC;IAChC,UAAU,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,yBAAyB,EAAE,MAAM,IAAI,CAAC;IACtC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,eAAe,EAAE,MAAM,IAAI,CAAC;CAC7B,CAAC;AAEF;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,cAAc;IACzD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,gBAAgB,KAAK;IAC9B,OAAO,CAAC,UAAU,CAAgB;IAElC;;;OAGG;IACH,OAAO,CAAC,gBAAgB,CAWtB;IAEF;;;;;;OAMG;gBACS,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa;IASjD;;;OAGG;IACH;;;;;;OAMG;IAEG,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW3C;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;;OAGG;IACH,aAAa,IAAI,OAAO;IAIxB;;;OAGG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,aAAa,IAAI,IAAI;IAIrB;;OAEG;IACH,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAIzC;;OAEG;IACH,YAAY,IAAI,IAAI;IAIpB;;OAEG;IACH,aAAa,IAAI,IAAI;IAIrB,QAAQ,IAAI,mBAAmB;IAQ/B,UAAU,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IAI5C;;;;;OAKG;IACH,OAAO,CAAC,CAAC,SAAS,MAAM,oBAAoB,EAC1C,KAAK,EAAE,CAAC,EACR,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAC1B,MAAM,IAAI;IAKb;;;OAGG;IACH,WAAW,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI;CAI5D"}
package/dist/index.d.ts CHANGED
@@ -13,8 +13,8 @@ export { tryToggleExhaust } from "./Domain/Controllers/tryToggleExhaust";
13
13
  export { tryToggleLock } from "./Domain/Controllers/tryToggleLock";
14
14
  export { checkPressure } from "./Domain/Controllers/checkPressure";
15
15
  export { setShowGhostLockHint } from "./Domain/Controllers/setShowGhostLockHint";
16
- export { setHighlightedObject } from "./Domain/Controllers/setHighlightedObject";
17
- export { clearAllHighlights } from "./Domain/Controllers/clearAllHighlights";
16
+ export { getPanelState } from "./Domain/Controllers/getPanelState";
17
+ export { applyPanelState } from "./Domain/Controllers/applyPanelState";
18
18
  export { onExhaustOpened } from "./Domain/Controllers/onExhaustOpened";
19
19
  export { onExhaustClosed } from "./Domain/Controllers/onExhaustClosed";
20
20
  export { onExhaustCloseBlockedByLock } from "./Domain/Controllers/onExhaustCloseBlockedByLock";
@@ -27,7 +27,7 @@ export { onCheckPressure } from "./Domain/Controllers/onCheckPressure";
27
27
  export { panelHitboxClicked } from "./Domain/Controllers/panelHitboxClicked";
28
28
  export { PneumaticPanelPM, makePneumaticPanelPM, type PneumaticPanelVM, } from "./Domain/PMs/PneumaticPanelPM";
29
29
  export { pneumaticPanelPMAdapter } from "./Domain/Adapters/pneumaticPanelPMAdapter";
30
- export { PneumaticPanelBabylonView, makePneumaticPanelBabylonView, type PneumaticPanelGlowConfig, } from "./Frameworks/Babylon/PneumaticPanelBabylonView";
30
+ export { PneumaticPanelBabylonView, makePneumaticPanelBabylonView, } from "./Frameworks/Babylon/PneumaticPanelBabylonView";
31
31
  export { PneumaticPanelFeatureFactory, makePneumaticPanelFeatureFactory, } from "./Domain/Factory/PneumaticPanelFeatureFactory";
32
32
  export { createBabylonPneumaticPanel } from "./Frameworks/Babylon/createBabylonPneumaticPanel";
33
33
  export { MockPneumaticPanelPM } from "./Domain/Mocks/MockPneumaticPanelPM";
@@ -36,4 +36,5 @@ export { MockPneumaticPanelToggleLockUC } from "./Domain/Mocks/MockPneumaticPane
36
36
  export { MockPneumaticPanelCheckPressureUC } from "./Domain/Mocks/MockPneumaticPanelCheckPressureUC";
37
37
  export { MockPneumaticPanelSelectUC } from "./Domain/Mocks/MockPneumaticPanelSelectUC";
38
38
  export { default as componentConfig } from "./component.config";
39
+ export { PneumaticPanelFacade, PNEUMATIC_PANEL_STATE_VERSION, type PneumaticPanelState, type SmartComponent, type PneumaticPanelEvents, } from "./PneumaticPanelFacade";
39
40
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,KAAK,2BAA2B,GACjC,MAAM,sCAAsC,CAAC;AAG9C,OAAO,EACL,6BAA6B,EAC7B,iCAAiC,GAClC,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACL,0BAA0B,EAC1B,8BAA8B,GAC/B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,6BAA6B,EAC7B,iCAAiC,GAClC,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACL,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,qCAAqC,CAAC;AAG7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,kDAAkD,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAG7E,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,gBAAgB,GACtB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AAGpF,OAAO,EACL,yBAAyB,EACzB,6BAA6B,EAC7B,KAAK,wBAAwB,GAC9B,MAAM,gDAAgD,CAAC;AAGxD,OAAO,EACL,4BAA4B,EAC5B,gCAAgC,GACjC,MAAM,+CAA+C,CAAC;AAGvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,kDAAkD,CAAC;AAG/F,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,iCAAiC,EAAE,MAAM,kDAAkD,CAAC;AACrG,OAAO,EAAE,8BAA8B,EAAE,MAAM,+CAA+C,CAAC;AAC/F,OAAO,EAAE,iCAAiC,EAAE,MAAM,kDAAkD,CAAC;AACrG,OAAO,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AAGvF,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,KAAK,2BAA2B,GACjC,MAAM,sCAAsC,CAAC;AAG9C,OAAO,EACL,6BAA6B,EAC7B,iCAAiC,GAClC,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACL,0BAA0B,EAC1B,8BAA8B,GAC/B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,6BAA6B,EAC7B,iCAAiC,GAClC,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACL,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,qCAAqC,CAAC;AAG7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,kDAAkD,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAG7E,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,gBAAgB,GACtB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AAGpF,OAAO,EACL,yBAAyB,EACzB,6BAA6B,GAC9B,MAAM,gDAAgD,CAAC;AAGxD,OAAO,EACL,4BAA4B,EAC5B,gCAAgC,GACjC,MAAM,+CAA+C,CAAC;AAGvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,kDAAkD,CAAC;AAG/F,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,iCAAiC,EAAE,MAAM,kDAAkD,CAAC;AACrG,OAAO,EAAE,8BAA8B,EAAE,MAAM,+CAA+C,CAAC;AAC/F,OAAO,EAAE,iCAAiC,EAAE,MAAM,kDAAkD,CAAC;AACrG,OAAO,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AAGvF,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,EACL,oBAAoB,EACpB,6BAA6B,EAC7B,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,oBAAoB,GAC1B,MAAM,wBAAwB,CAAC"}