@vived/component-pneumatic-panel 2.0.0 → 3.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.
package/CHANGELOG.md ADDED
@@ -0,0 +1,212 @@
1
+ # Changelog
2
+
3
+ ## [3.0.0] - 2026-09-02
4
+
5
+ Smart Component conformance train. Three violations found in the conformance audit
6
+ of `demo_automation_cell` on 2026-09-02, fixed together because each changes the
7
+ consumer contract.
8
+
9
+ ### Changed
10
+
11
+ - **BREAKING: `@vived/app` is now a required `peerDependency`** and is externalized
12
+ in the lib build instead of bundled. Its entire module graph was being inlined
13
+ into `dist/index.js` — 127 KB, 78% of the bundle — freezing a build-time copy
14
+ against which a host ran its own. Cross-copy resolution worked only because
15
+ `@vived/app` looks components up by string `type`; any `instanceof` check or
16
+ renamed `type` string would have failed silently. Hosts that relied on the
17
+ component carrying its own copy must install it; every VIVED host already
18
+ depends on it. `dist/index.js`: 163,144 → 34,714 bytes (gzip 29.58 → 7.29 kB).
19
+
20
+ ### Removed
21
+
22
+ - **BREAKING: the pressure dialog moves to the Host (ADR-0010).** `checkPressure()`
23
+ no longer resolves `ShowAlertUC` and no longer renders anything — it fires
24
+ `pressureChecked` and returns. The Host subscribes and reads `pressure` from
25
+ `PneumaticPanelVM`, exactly as `@vived/component-abb-controller` does for
26
+ `voltageChecked`. Removed the `ShowAlertUC` / `ShowAlertDTO` local interfaces,
27
+ the `showAlertUC` getter and the "Missing ShowAlertUC" warning. The UC no longer
28
+ reads `PneumaticPanelEntity` at all. A Host that does not subscribe now shows
29
+ the learner nothing when the gauge is clicked.
30
+ - **BREAKING: the ghost-lock hover reveal moves to the Host (ADR-0010).** Removed
31
+ `bindGhostHoverActions` and its `OnPointerOverTrigger` / `OnPointerOutTrigger`
32
+ actions from `PneumaticPanelLockView`. Ghost-lock visibility is now driven only
33
+ by authored domain state (`showGhostLockHint`); the mesh stays enabled and
34
+ pickable, and the Host reveals it on hover through the existing `ghost_lock`
35
+ entry in `highlightGroupsByObjectId`. This completes the hover removal that
36
+ ADR-0009 scoped to `PneumaticPanelHitboxView` only.
37
+
38
+ ### Unchanged
39
+
40
+ - Every `OnPickTrigger` handler — cutoff knob, lock children, ghost lock, hitbox.
41
+ A pick is domain intent and stays with the component.
42
+ - `setShowGhostLockHint()` and the `showGhostLockHint` VM field — authored domain
43
+ state, not interaction state.
44
+ - The facade's TypeScript surface. `checkPressure()`, `pressureChecked`,
45
+ `setShowGhostLockHint()` and `showGhostLockHint` all keep their shapes, which is
46
+ exactly why this is a major bump: the type checker will not flag it for
47
+ consumers, but two features go quiet until the Host wires them.
48
+
49
+ ### Notes
50
+
51
+ - Host companion work for `demo_automation_cell` is tracked at
52
+ vivedlearning/demo_automation_cell#320 and must land before this is consumed.
53
+ - The dev playground (`dev/main.ts`) now wires both Host seams itself, so it
54
+ demonstrates the expected integration rather than relying on removed behaviour.
55
+ - ADR-0010 records both boundary decisions and the options rejected.
56
+
57
+ ## [2.0.1] - 2026-09-02
58
+
59
+ ### Fixed
60
+
61
+ - **The published package no longer ships 3D assets.** The lib build inherited Vite's
62
+ default `publicDir`, so `pneumaticPanel.glb` (406 KB) and `studio.env` (207 KB) were
63
+ copied into `dist/` on every build. Those files exist for the dev playground only —
64
+ at runtime the component fetches its asset by id via `getAssetBlobURL` — so
65
+ `vite.config.ts` now sets `publicDir: false`. Install footprint drops from 777 KB to
66
+ ~165 KB. No runtime behaviour changes; hosts never loaded these files from the package.
67
+ - **Corrected the default asset id in `COMPONENT_KNOWLEDGE.md`.** The doc still carried
68
+ the pre-hitbox id `83790d2d-…`; the current GLB (which contains the `panel_hitbox`
69
+ mesh) is `db90a1dd-8cb9-4f56-954d-7a72610281a7`, as `src/component.config.ts` has had
70
+ since the hitbox feature landed.
71
+
72
+ ### Added
73
+
74
+ - `publishConfig.access: "public"` in `package.json`, completing the Smart Component
75
+ Packaging & Distribution Convention checklist.
76
+ - A note in `COMPONENT_KNOWLEDGE.md` recording that shipping no assets is deliberate.
77
+
78
+ ## [2.0.0] - 2026-07-07
79
+
80
+ ### Removed
81
+
82
+ - **BREAKING: presentation-free interaction state (ADR-0009).** The component no longer
83
+ self-renders hover outlines or hint glows, or detects hover — the Host owns all
84
+ hover/hint/selection feedback. Removed the facade commands `setHighlightedObject()` /
85
+ `clearAllHighlights()`; the events `panelHoverEnter` / `panelHoverExit` and their
86
+ `onPanelHoverEnter` / `onPanelHoverExit` / `panelHitboxHoverEnter` /
87
+ `panelHitboxHoverExit` controllers; the `highlightedObject` field from
88
+ `PneumaticPanelState` and `PneumaticPanelVM`; the `PneumaticPanelHighlightedObject`
89
+ type; `PanelOutlineController`, `OverlayPulseController`, `OutlinePulseController`,
90
+ `ScreenSpaceOutlinePulseController`, and the `HighlightLayer` / glow config surface.
91
+
92
+ ### Added
93
+
94
+ - **`highlightGroupsByObjectId`** on `PneumaticPanelBabylonView` — a
95
+ `ReadonlyMap<string, AbstractMesh[]>` from semantic `objectId` to the meshes the Host
96
+ should treat as one highlightable unit. The `panel_hitbox` entry maps to every visible
97
+ panel mesh, so the Host can outline the whole panel from the invisible hitbox.
98
+
99
+ ### Changed
100
+
101
+ - `PNEUMATIC_PANEL_STATE_VERSION` bumped `1 → 2` (removed `highlightedObject`). Older v1
102
+ snapshots still restore cleanly via ADR-0008 best-effort apply.
103
+ - The `panel_hitbox` mesh is now genuinely invisible (`visibility = 0`); the `0.001`
104
+ epsilon (ADR-0004, now superseded) is no longer needed.
105
+
106
+ ## [1.2.0] - 2026-06-26
107
+
108
+ ### Added
109
+
110
+ - **`PneumaticPanelFacade`** — a host-facing `SmartComponent` class (Smart Component
111
+ Facade Contract v1), now exported from the package entry point. It is the canonical
112
+ way for a host to drive an instance and wraps the flat controllers behind one typed
113
+ object: `id`, `interfaceVersion`, `onEvent(event, cb)`, `onViewModel(cb)`,
114
+ `load(variant?)`, `destroy()`, `getState()`, `applyState(state)`, plus the
115
+ component-specific commands `toggleExhaust()`, `toggleLock()`, `checkPressure()`,
116
+ `setHighlightedObject()`, `clearAllHighlights()`, `setShowGhostLockHint()`,
117
+ `enableHitbox()`, and `disableHitbox()`. Construction is synchronous, headless, and
118
+ idempotent (constructing for an existing id returns a handle to the same instance).
119
+ - Exported types `SmartComponent` (the structural contract) and `PneumaticPanelEvents`
120
+ (the typed event catalog).
121
+ - **Versioned panel state snapshot/restore** — `PNEUMATIC_PANEL_STATE_VERSION`,
122
+ `PneumaticPanelState`, and the `getPanelState` / `applyPanelState` controllers
123
+ (surfaced on the facade as `getState()` / `applyState()`).
124
+ - **Panel hover events** — `panelHoverEnter` / `panelHoverExit`, with
125
+ `onPanelHoverEnter` / `onPanelHoverExit` subscribe controllers and
126
+ `panelHitboxHoverEnter` / `panelHitboxHoverExit` notify controllers, wired through
127
+ `PneumaticPanelSelectUC` and the Babylon hitbox view.
128
+ - `onCheckPressure` subscribe controller (gauge-click / pressure-check requests).
129
+
130
+ ### Changed
131
+
132
+ - The reactive view model is now consumed through the facade's `onViewModel(cb)`. The
133
+ raw `pneumaticPanelPMAdapter` export remains for the framework/view boundary and
134
+ advanced use but is no longer the advertised consumer surface.
135
+ - Panel hover highlight now uses a `SelectionOutlineLayer` for a pixel-space,
136
+ see-through silhouette (`PanelOutlineController`), replacing the earlier
137
+ inverted-hull outline, which itself replaced the original hitbox glow.
138
+ - Panel construction is now idempotent (`getOrCreate` semantics in
139
+ `PneumaticPanelRepo`): creating an instance for an existing id returns the existing
140
+ entity instead of duplicating it.
141
+
142
+ ## [1.1.1] - 2026-06-15
143
+
144
+ ### Fixed
145
+
146
+ - `onCheckPressure` subscribe controller was missing — gauge click events now appear in the dev panel event log.
147
+ - Babylon Inspector is restored in the dev playground and opens automatically on load.
148
+
149
+ ### Added
150
+
151
+ - Clear button in the dev panel Events header — clears the event log on click.
152
+
153
+ ## [1.1.0] - 2026-06-15
154
+
155
+ ### Added
156
+
157
+ - **Panel hitbox** (`PneumaticPanelHitboxView`) — an invisible mesh covering the entire panel for whole-panel selection mode. When enabled, the panel acts as a single clickable target and all sub-component interactions are disabled.
158
+ - `enablePanelHitbox(id, appObjects)` — enables the panel hitbox.
159
+ - `disablePanelHitbox(id, appObjects)` — disables the hitbox and restores sub-component interactivity.
160
+ - `onPanelSelected(id, appObjects, callback)` — subscribes to panel-hitbox click events; returns an unsubscribe function.
161
+ - `panelHitboxEnabled` property on `PneumaticPanelEntity` and `PneumaticPanelVM`.
162
+ - `subComponentsInteractive` derived property on `PneumaticPanelVM` (always `!panelHitboxEnabled`).
163
+ - `"panelHitbox"` added as a valid value for `setHighlightedObject`.
164
+ - `PneumaticPanelSelectUC` — new use case managing hitbox lifecycle and panel-selected events.
165
+ - `MockPneumaticPanelSelectUC` — mock for consumer integration tests.
166
+ - PRD-as-executable-spec tests for panel operation (`docs/prd/panel-operation.test.ts`).
167
+
168
+ ### Changed
169
+
170
+ - Dev sandbox: replaced Babylon Inspector overlay with a lightweight HTML dev panel in the upper-right corner, exposing the three state controls and a live event log.
171
+ - Removed `@babylonjs/inspector` from dev dependencies.
172
+
173
+ ## [1.0.1] - 2026-06-05
174
+
175
+ ### Fixed
176
+
177
+ - Added `prepublishOnly` script to ensure the package is built before publishing, preventing accidental publishes of stale or missing `dist` output.
178
+
179
+ ## [1.0.0] - 2026-05-28
180
+
181
+ ### Added
182
+
183
+ - **Lock View** (`PneumaticPanelLockView`) — Manages lock/ghost-lock visibility, click-to-toggle, and ghost-lock hover preview.
184
+ - **Exhaust View** (`PneumaticPanelExhaustView`) — Manages exhaust knob interaction and rotation.
185
+ - **Gauge View** (`PneumaticPanelGaugeView`) — Click the gauge to trigger `checkPressure`.
186
+ - **Asset Cache** (`PneumaticPanelAssetCache`) — Caches loaded GLB assets to avoid redundant downloads across instances.
187
+ - Smooth animated rotation for exhaust knob open/close (cubic ease-in-out, ~250ms).
188
+ - Shake animation on the exhaust knob when toggling is blocked by a locked panel.
189
+ - Red overlay flash on lock meshes when a locked exhaust toggle is attempted.
190
+ - Ghost-lock hover preview: semi-transparent lock appears on pointer hover when exhaust is open and unlocked.
191
+ - `showGhostLockHint` property on `PneumaticPanelEntity` — when `true`, the ghost lock is shown immediately without requiring hover (training mode); when `false` (default), the ghost lock is only revealed on hover (assessment mode).
192
+ - Dev playground inspector setup (`setupInspector.ts`).
193
+ - Direct subscription hooks on domain UCs for Slide integration without a global event bus:
194
+ - `PneumaticPanelToggleLockUC.subscribeOnPanelLocked`
195
+ - `PneumaticPanelToggleLockUC.subscribeOnPanelUnlocked`
196
+ - `PneumaticPanelToggleExhaustUC.subscribeOnExhaustOpened`
197
+ - `PneumaticPanelToggleExhaustUC.subscribeOnExhaustClosed`
198
+ - `PneumaticPanelToggleExhaustUC.subscribeOnExhaustCloseBlockedByLock`
199
+ - `PneumaticPanelCheckPressureUC.subscribeOnCheckPressure`
200
+ - New dedicated UC test files:
201
+ - `PneumaticPanelToggleLockUC.test.ts`
202
+ - `PneumaticPanelToggleExhaustUC.test.ts`
203
+
204
+ ### Changed
205
+
206
+ - `PneumaticPanelBabylonView` refactored to delegate per-element behavior to dedicated view components (`ExhaustView`, `LockView`, `GageView`).
207
+ - `createBabylonPneumaticPanel` simplified; view composition now handled by `PneumaticPanelBabylonView`.
208
+ - `PneumaticPanelToggleLockUC` — lock can only be engaged when exhaust is open.
209
+ - `PneumaticPanelToggleLockUC` now dispatches subscribed callbacks after lock/unlock transitions.
210
+ - `PneumaticPanelToggleExhaustUC` now dispatches subscribed callbacks for open/close and blocked-close attempts.
211
+ - `PneumaticPanelCheckPressureUC` now dispatches subscribed callbacks after every `checkPressure()` invocation.
212
+ - Updated `COMPONENT_KNOWLEDGE.md` with full API reference, recipes, and constraints.