@vived/component-pneumatic-panel 1.2.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.
Files changed (80) hide show
  1. package/CHANGELOG.md +212 -0
  2. package/COMPONENT_KNOWLEDGE.md +642 -0
  3. package/LICENSE +15 -0
  4. package/README.md +62 -23
  5. package/dist/Domain/Adapters/pneumaticPanelPMAdapter.d.ts.map +1 -1
  6. package/dist/Domain/Controllers/applyPanelState.d.ts.map +1 -1
  7. package/dist/Domain/Controllers/getPanelState.d.ts.map +1 -1
  8. package/dist/Domain/Controllers/panelStateDefaults.d.ts +0 -1
  9. package/dist/Domain/Controllers/panelStateDefaults.d.ts.map +1 -1
  10. package/dist/Domain/Entities/PneumaticPanelEntity.d.ts +0 -4
  11. package/dist/Domain/Entities/PneumaticPanelEntity.d.ts.map +1 -1
  12. package/dist/Domain/Mocks/MockPneumaticPanelSelectUC.d.ts +0 -4
  13. package/dist/Domain/Mocks/MockPneumaticPanelSelectUC.d.ts.map +1 -1
  14. package/dist/Domain/PMs/PneumaticPanelPM.d.ts +0 -3
  15. package/dist/Domain/PMs/PneumaticPanelPM.d.ts.map +1 -1
  16. package/dist/Domain/UCs/PneumaticPanelCheckPressureUC.d.ts +4 -3
  17. package/dist/Domain/UCs/PneumaticPanelCheckPressureUC.d.ts.map +1 -1
  18. package/dist/Domain/UCs/PneumaticPanelSelectUC.d.ts +0 -14
  19. package/dist/Domain/UCs/PneumaticPanelSelectUC.d.ts.map +1 -1
  20. package/dist/Frameworks/Babylon/PneumaticPanelBabylonView.d.ts +9 -12
  21. package/dist/Frameworks/Babylon/PneumaticPanelBabylonView.d.ts.map +1 -1
  22. package/dist/Frameworks/Babylon/PneumaticPanelExhaustView.d.ts +2 -2
  23. package/dist/Frameworks/Babylon/PneumaticPanelExhaustView.d.ts.map +1 -1
  24. package/dist/Frameworks/Babylon/PneumaticPanelGaugeView.d.ts +2 -2
  25. package/dist/Frameworks/Babylon/PneumaticPanelGaugeView.d.ts.map +1 -1
  26. package/dist/Frameworks/Babylon/PneumaticPanelHitboxView.d.ts +5 -7
  27. package/dist/Frameworks/Babylon/PneumaticPanelHitboxView.d.ts.map +1 -1
  28. package/dist/Frameworks/Babylon/PneumaticPanelLockView.d.ts +2 -2
  29. package/dist/Frameworks/Babylon/PneumaticPanelLockView.d.ts.map +1 -1
  30. package/dist/PneumaticPanelFacade.d.ts +1 -13
  31. package/dist/PneumaticPanelFacade.d.ts.map +1 -1
  32. package/dist/index.d.ts +1 -7
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +1257 -51
  35. package/package.json +9 -2
  36. package/dist/.gitkeep +0 -0
  37. package/dist/Domain/Controllers/clearAllHighlights.d.ts +0 -9
  38. package/dist/Domain/Controllers/clearAllHighlights.d.ts.map +0 -1
  39. package/dist/Domain/Controllers/onPanelHoverEnter.d.ts +0 -7
  40. package/dist/Domain/Controllers/onPanelHoverEnter.d.ts.map +0 -1
  41. package/dist/Domain/Controllers/onPanelHoverExit.d.ts +0 -7
  42. package/dist/Domain/Controllers/onPanelHoverExit.d.ts.map +0 -1
  43. package/dist/Domain/Controllers/panelHitboxHoverEnter.d.ts +0 -7
  44. package/dist/Domain/Controllers/panelHitboxHoverEnter.d.ts.map +0 -1
  45. package/dist/Domain/Controllers/panelHitboxHoverExit.d.ts +0 -7
  46. package/dist/Domain/Controllers/panelHitboxHoverExit.d.ts.map +0 -1
  47. package/dist/Domain/Controllers/setHighlightedObject.d.ts +0 -11
  48. package/dist/Domain/Controllers/setHighlightedObject.d.ts.map +0 -1
  49. package/dist/Frameworks/Babylon/OutlinePulseController.d.ts +0 -18
  50. package/dist/Frameworks/Babylon/OutlinePulseController.d.ts.map +0 -1
  51. package/dist/Frameworks/Babylon/OverlayPulseController.d.ts +0 -17
  52. package/dist/Frameworks/Babylon/OverlayPulseController.d.ts.map +0 -1
  53. package/dist/Frameworks/Babylon/PanelOutlineController.d.ts +0 -32
  54. package/dist/Frameworks/Babylon/PanelOutlineController.d.ts.map +0 -1
  55. package/dist/Frameworks/Babylon/ScreenSpaceOutlinePulseController.d.ts +0 -17
  56. package/dist/Frameworks/Babylon/ScreenSpaceOutlinePulseController.d.ts.map +0 -1
  57. package/dist/clipPlaneFragment-BRmzi2tV.js +0 -55
  58. package/dist/clipPlaneFragment-CDdVuU0n.js +0 -55
  59. package/dist/clipPlaneVertex-CIEg9nQi.js +0 -358
  60. package/dist/clipPlaneVertex-CIarPzTc.js +0 -391
  61. package/dist/dumpTools-BUC-AUZt.js +0 -110
  62. package/dist/glowBlurPostProcess.fragment-DDhSDO38.js +0 -13
  63. package/dist/glowBlurPostProcess.fragment-fpk0xJVe.js +0 -13
  64. package/dist/glowMapGeneration.fragment-BBSNxu8K.js +0 -193
  65. package/dist/glowMapGeneration.fragment-Cl-xwsZp.js +0 -161
  66. package/dist/glowMapGeneration.vertex-CzQHgJdT.js +0 -85
  67. package/dist/glowMapGeneration.vertex-DErxE57o.js +0 -85
  68. package/dist/glowMapMerge.vertex-BQosy0g5.js +0 -14
  69. package/dist/glowMapMerge.vertex-tVYqLRGm.js +0 -13
  70. package/dist/index-CmNnQLDH.js +0 -36863
  71. package/dist/pass.fragment-D3pYn4R1.js +0 -10
  72. package/dist/pneumaticPanel.glb +0 -0
  73. package/dist/selection.fragment-CGZK1kVt.js +0 -45
  74. package/dist/selection.fragment-DjWRsu7R.js +0 -45
  75. package/dist/selection.vertex-DY_1B2lX.js +0 -84
  76. package/dist/selection.vertex-PhS5tOTA.js +0 -83
  77. package/dist/selectionOutline.fragment-Bp__J_pC.js +0 -53
  78. package/dist/selectionOutline.fragment-DmyQJACa.js +0 -54
  79. package/dist/studio.env +0 -0
  80. package/dist/thinEngine-dZnz-Owz.js +0 -4
package/dist/index.js CHANGED
@@ -1,53 +1,1259 @@
1
- import { M as n, d as s, e as t, f as P, g as l, P as c, h as o, i, j as u, k as m, l as k, m as r, n as g, o as C, p as h, q as E, s as x, t as U, u as p, v as H, w as d, x as y, y as b, z as M, A as T, B as S, D as L, F as A, G as B, H as F, I as v, J as w, K as O, O as R, Q as V, R as f, U as I, V as N, W as _, X as j, Y as G, Z as q, $ as z, a0 as D, a1 as J, a2 as K, a3 as Q, a4 as W, a5 as X, a6 as Y } from "./index-CmNnQLDH.js";
1
+ import { AppObjectEntity as B, MemoizedBoolean as f, MemoizedNumber as S, AppObjectEntityRepo as H, getSingletonComponent as j, generateUniqueID as _, AppObjectUC as k, AppObjectPM as G, AppObjectView as g, DomainFactory as N } from "@vived/core";
2
+ import { getAssetBlobURL as K, BabylonEntity as z } from "@vived/app";
3
+ import { Color3 as F, ActionManager as r, ExecuteCodeAction as y, Animation as d, CubicEase as W, EasingFunction as R, Material as D, LoadAssetContainerAsync as $ } from "@babylonjs/core";
4
+ class c extends B {
5
+ static type = "PneumaticPanelEntity";
6
+ /**
7
+ * Retrieves the entity from an AppObject
8
+ */
9
+ static get(e) {
10
+ return e.getComponent(this.type);
11
+ }
12
+ /**
13
+ * Retrieves the entity by AppObject ID
14
+ */
15
+ static getById(e, t) {
16
+ return t.get(e)?.getComponent(this.type);
17
+ }
18
+ }
19
+ function I(n) {
20
+ return new q(n);
21
+ }
22
+ class q extends c {
23
+ memoizedExhaustOpen = new f(!1, this.notifyOnChange);
24
+ memoizedIsLocked = new f(!1, this.notifyOnChange);
25
+ memoizedPressure = new S(60, this.notifyOnChange);
26
+ memoizedShowGhostLockHint = new f(
27
+ !1,
28
+ this.notifyOnChange
29
+ );
30
+ memoizedPanelHitboxEnabled = new f(
31
+ !1,
32
+ this.notifyOnChange
33
+ );
34
+ get exhaustOpen() {
35
+ return this.memoizedExhaustOpen.val;
36
+ }
37
+ set exhaustOpen(e) {
38
+ this.memoizedExhaustOpen.val = e;
39
+ }
40
+ get isLocked() {
41
+ return this.memoizedIsLocked.val;
42
+ }
43
+ set isLocked(e) {
44
+ this.memoizedIsLocked.val = e;
45
+ }
46
+ get pressure() {
47
+ return this.memoizedPressure.val;
48
+ }
49
+ set pressure(e) {
50
+ this.memoizedPressure.val = e;
51
+ }
52
+ get showGhostLockHint() {
53
+ return this.memoizedShowGhostLockHint.val;
54
+ }
55
+ set showGhostLockHint(e) {
56
+ this.memoizedShowGhostLockHint.val = e;
57
+ }
58
+ get panelHitboxEnabled() {
59
+ return this.memoizedPanelHitboxEnabled.val;
60
+ }
61
+ set panelHitboxEnabled(e) {
62
+ this.memoizedPanelHitboxEnabled.val = e;
63
+ }
64
+ constructor(e) {
65
+ super(e, c.type);
66
+ }
67
+ }
68
+ class P extends H {
69
+ static type = "PneumaticPanelRepo";
70
+ /**
71
+ * Global accessor for the singleton repository
72
+ */
73
+ static get(e) {
74
+ return j(
75
+ P.type,
76
+ e
77
+ );
78
+ }
79
+ }
80
+ function Q(n) {
81
+ return new Y(n);
82
+ }
83
+ class Y extends P {
84
+ pneumaticPanelEntityFactory = (e) => {
85
+ const t = this.appObjects.getOrCreate(e);
86
+ return I(t);
87
+ };
88
+ createPneumaticPanelEntity(e) {
89
+ const t = e ?? _(), s = this.getForAppObject(t);
90
+ if (s)
91
+ return s;
92
+ const i = this.pneumaticPanelEntityFactory(t);
93
+ return this.add(i), i;
94
+ }
95
+ deletePneumaticPanelEntity(e) {
96
+ const t = this.getForAppObject(e);
97
+ if (!t) {
98
+ this.warn(`Cannot delete: entity with id '${e}' not found`);
99
+ return;
100
+ }
101
+ t.appObject.dispose(), this.removeForAppObject(e);
102
+ }
103
+ constructor(e) {
104
+ super(e, P.type);
105
+ }
106
+ }
107
+ class l extends k {
108
+ static type = "PneumaticPanelToggleExhaustUC";
109
+ static get(e) {
110
+ return e.getComponent(this.type);
111
+ }
112
+ static getById(e, t) {
113
+ return t.get(e)?.getComponent(this.type);
114
+ }
115
+ }
116
+ function J(n) {
117
+ return new X(n);
118
+ }
119
+ class X extends l {
120
+ _maxPressure = 60;
121
+ onExhaustOpenedCallbacks = /* @__PURE__ */ new Set();
122
+ onExhaustClosedCallbacks = /* @__PURE__ */ new Set();
123
+ onExhaustCloseBlockedByLockCallbacks = /* @__PURE__ */ new Set();
124
+ get entity() {
125
+ try {
126
+ return this.getCachedLocalComponent(
127
+ c.type
128
+ );
129
+ } catch {
130
+ return;
131
+ }
132
+ }
133
+ get maxPressure() {
134
+ return this._maxPressure;
135
+ }
136
+ set maxPressure(e) {
137
+ this._maxPressure = e;
138
+ }
139
+ toggleExhaust() {
140
+ const e = this.entity;
141
+ return e ? e.isLocked ? (e.exhaustOpen && this.notifyCallbacks(
142
+ this.onExhaustCloseBlockedByLockCallbacks,
143
+ "onExhaustCloseBlockedByLock callback"
144
+ ), !1) : (e.exhaustOpen = !e.exhaustOpen, e.pressure = e.exhaustOpen ? 0 : this._maxPressure, e.exhaustOpen ? this.notifyCallbacks(
145
+ this.onExhaustOpenedCallbacks,
146
+ "onExhaustOpened callback"
147
+ ) : this.notifyCallbacks(
148
+ this.onExhaustClosedCallbacks,
149
+ "onExhaustClosed callback"
150
+ ), !0) : (this.warn("Missing PneumaticPanelEntity"), !1);
151
+ }
152
+ subscribeOnExhaustOpened(e) {
153
+ return this.onExhaustOpenedCallbacks.add(e), () => {
154
+ this.onExhaustOpenedCallbacks.delete(e);
155
+ };
156
+ }
157
+ subscribeOnExhaustClosed(e) {
158
+ return this.onExhaustClosedCallbacks.add(e), () => {
159
+ this.onExhaustClosedCallbacks.delete(e);
160
+ };
161
+ }
162
+ subscribeOnExhaustCloseBlockedByLock(e) {
163
+ return this.onExhaustCloseBlockedByLockCallbacks.add(e), () => {
164
+ this.onExhaustCloseBlockedByLockCallbacks.delete(e);
165
+ };
166
+ }
167
+ notifyCallbacks(e, t) {
168
+ for (const s of e)
169
+ try {
170
+ s();
171
+ } catch {
172
+ this.warn(`${t} threw an error`);
173
+ }
174
+ }
175
+ constructor(e) {
176
+ super(e, l.type);
177
+ }
178
+ }
179
+ class h extends k {
180
+ static type = "PneumaticPanelToggleLockUC";
181
+ static get(e) {
182
+ return e.getComponent(this.type);
183
+ }
184
+ static getById(e, t) {
185
+ return t.get(e)?.getComponent(this.type);
186
+ }
187
+ }
188
+ function Z(n) {
189
+ return new ee(n);
190
+ }
191
+ class ee extends h {
192
+ onPanelLockedCallbacks = /* @__PURE__ */ new Set();
193
+ onPanelUnlockedCallbacks = /* @__PURE__ */ new Set();
194
+ get entity() {
195
+ try {
196
+ return this.getCachedLocalComponent(
197
+ c.type
198
+ );
199
+ } catch {
200
+ return;
201
+ }
202
+ }
203
+ toggleLock() {
204
+ const e = this.entity;
205
+ return e ? e.isLocked ? (e.isLocked = !1, this.notifyCallbacks(
206
+ this.onPanelUnlockedCallbacks,
207
+ "onPanelUnlocked callback"
208
+ ), !0) : e.exhaustOpen ? (e.isLocked = !0, this.notifyCallbacks(this.onPanelLockedCallbacks, "onPanelLocked callback"), !0) : !1 : (this.warn("Missing PneumaticPanelEntity"), !1);
209
+ }
210
+ subscribeOnPanelLocked(e) {
211
+ return this.onPanelLockedCallbacks.add(e), () => {
212
+ this.onPanelLockedCallbacks.delete(e);
213
+ };
214
+ }
215
+ subscribeOnPanelUnlocked(e) {
216
+ return this.onPanelUnlockedCallbacks.add(e), () => {
217
+ this.onPanelUnlockedCallbacks.delete(e);
218
+ };
219
+ }
220
+ notifyCallbacks(e, t) {
221
+ for (const s of e)
222
+ try {
223
+ s();
224
+ } catch {
225
+ this.warn(`${t} threw an error`);
226
+ }
227
+ }
228
+ constructor(e) {
229
+ super(e, h.type);
230
+ }
231
+ }
232
+ class b extends k {
233
+ static type = "PneumaticPanelCheckPressureUC";
234
+ static get(e) {
235
+ return e.getComponent(this.type);
236
+ }
237
+ static getById(e, t) {
238
+ return t.get(e)?.getComponent(this.type);
239
+ }
240
+ }
241
+ function te(n) {
242
+ return new ne(n);
243
+ }
244
+ class ne extends b {
245
+ onCheckPressureCallbacks = /* @__PURE__ */ new Set();
246
+ checkPressure() {
247
+ this.notifyCallbacks(
248
+ this.onCheckPressureCallbacks,
249
+ "onCheckPressure callback"
250
+ );
251
+ }
252
+ subscribeOnCheckPressure(e) {
253
+ return this.onCheckPressureCallbacks.add(e), () => {
254
+ this.onCheckPressureCallbacks.delete(e);
255
+ };
256
+ }
257
+ notifyCallbacks(e, t) {
258
+ for (const s of e)
259
+ try {
260
+ s();
261
+ } catch {
262
+ this.warn(`${t} threw an error`);
263
+ }
264
+ }
265
+ constructor(e) {
266
+ super(e, b.type);
267
+ }
268
+ }
269
+ class u extends k {
270
+ static type = "PneumaticPanelSelectUC";
271
+ static get(e) {
272
+ return e.getComponent(this.type);
273
+ }
274
+ static getById(e, t) {
275
+ return t.get(e)?.getComponent(this.type);
276
+ }
277
+ }
278
+ function se(n) {
279
+ return new ie(n);
280
+ }
281
+ class ie extends u {
282
+ onPanelSelectedCallbacks = /* @__PURE__ */ new Set();
283
+ get entity() {
284
+ try {
285
+ return this.getCachedLocalComponent(
286
+ c.type
287
+ );
288
+ } catch {
289
+ return;
290
+ }
291
+ }
292
+ enableHitbox() {
293
+ const e = this.entity;
294
+ if (!e) {
295
+ this.warn("Missing PneumaticPanelEntity");
296
+ return;
297
+ }
298
+ e.panelHitboxEnabled = !0;
299
+ }
300
+ disableHitbox() {
301
+ const e = this.entity;
302
+ if (!e) {
303
+ this.warn("Missing PneumaticPanelEntity");
304
+ return;
305
+ }
306
+ e.panelHitboxEnabled = !1;
307
+ }
308
+ subscribeOnPanelSelected(e) {
309
+ return this.onPanelSelectedCallbacks.add(e), () => {
310
+ this.onPanelSelectedCallbacks.delete(e);
311
+ };
312
+ }
313
+ notifyPanelSelected() {
314
+ for (const e of this.onPanelSelectedCallbacks)
315
+ try {
316
+ e();
317
+ } catch {
318
+ this.warn("onPanelSelected callback threw an error");
319
+ }
320
+ }
321
+ constructor(e) {
322
+ super(e, u.type);
323
+ }
324
+ }
325
+ function V(n, e) {
326
+ const t = l.getById(n, e);
327
+ return t ? t.toggleExhaust() : (e.submitWarning(
328
+ "tryToggleExhaust",
329
+ "Unable to find PneumaticPanelToggleExhaustUC"
330
+ ), !1);
331
+ }
332
+ function U(n, e) {
333
+ const t = h.getById(n, e);
334
+ return t ? t.toggleLock() : (e.submitWarning(
335
+ "tryToggleLock",
336
+ "Unable to find PneumaticPanelToggleLockUC"
337
+ ), !1);
338
+ }
339
+ function A(n, e) {
340
+ const t = b.getById(n, e);
341
+ if (!t) {
342
+ e.submitWarning(
343
+ "checkPressure",
344
+ "Unable to find PneumaticPanelCheckPressureUC"
345
+ );
346
+ return;
347
+ }
348
+ t.checkPressure();
349
+ }
350
+ function ae(n, e, t) {
351
+ const s = c.getById(n, e);
352
+ if (!s) {
353
+ e.submitWarning(
354
+ "setShowGhostLockHint",
355
+ "Unable to find PneumaticPanelEntity"
356
+ );
357
+ return;
358
+ }
359
+ s.showGhostLockHint = t;
360
+ }
361
+ const m = {
362
+ exhaustOpen: !1,
363
+ isLocked: !1,
364
+ showGhostLockHint: !1,
365
+ panelHitboxEnabled: !1
366
+ };
367
+ function oe(n, e, t) {
368
+ const s = c.getById(n, e);
369
+ return s ? {
370
+ version: t,
371
+ exhaustOpen: s.exhaustOpen,
372
+ isLocked: s.isLocked,
373
+ showGhostLockHint: s.showGhostLockHint,
374
+ panelHitboxEnabled: s.panelHitboxEnabled
375
+ } : (e.submitWarning(
376
+ "getPanelState",
377
+ "Unable to find PneumaticPanelEntity"
378
+ ), {
379
+ version: t,
380
+ ...m
381
+ });
382
+ }
383
+ function ce(n, e, t) {
384
+ const s = c.getById(n, e);
385
+ if (!s) {
386
+ e.submitWarning(
387
+ "applyPanelState",
388
+ "Unable to find PneumaticPanelEntity"
389
+ );
390
+ return;
391
+ }
392
+ s.exhaustOpen = t.exhaustOpen ?? m.exhaustOpen, s.isLocked = t.isLocked ?? m.isLocked, s.showGhostLockHint = t.showGhostLockHint ?? m.showGhostLockHint, s.panelHitboxEnabled = t.panelHitboxEnabled ?? m.panelHitboxEnabled;
393
+ }
394
+ function re(n, e, t) {
395
+ const s = l.getById(n, e);
396
+ return s ? s.subscribeOnExhaustOpened(t) : (e.submitWarning(
397
+ "onExhaustOpened",
398
+ "Unable to find PneumaticPanelToggleExhaustUC"
399
+ ), () => {
400
+ });
401
+ }
402
+ function le(n, e, t) {
403
+ const s = l.getById(n, e);
404
+ return s ? s.subscribeOnExhaustClosed(t) : (e.submitWarning(
405
+ "onExhaustClosed",
406
+ "Unable to find PneumaticPanelToggleExhaustUC"
407
+ ), () => {
408
+ });
409
+ }
410
+ function ue(n, e, t) {
411
+ const s = l.getById(n, e);
412
+ return s ? s.subscribeOnExhaustCloseBlockedByLock(t) : (e.submitWarning(
413
+ "onExhaustCloseBlockedByLock",
414
+ "Unable to find PneumaticPanelToggleExhaustUC"
415
+ ), () => {
416
+ });
417
+ }
418
+ function he(n, e, t) {
419
+ const s = h.getById(n, e);
420
+ return s ? s.subscribeOnPanelLocked(t) : (e.submitWarning(
421
+ "onPanelLocked",
422
+ "Unable to find PneumaticPanelToggleLockUC"
423
+ ), () => {
424
+ });
425
+ }
426
+ function de(n, e, t) {
427
+ const s = h.getById(n, e);
428
+ return s ? s.subscribeOnPanelUnlocked(t) : (e.submitWarning(
429
+ "onPanelUnlocked",
430
+ "Unable to find PneumaticPanelToggleLockUC"
431
+ ), () => {
432
+ });
433
+ }
434
+ function be(n, e) {
435
+ const t = u.getById(n, e);
436
+ if (!t) {
437
+ e.submitWarning(
438
+ "enablePanelHitbox",
439
+ "Unable to find PneumaticPanelSelectUC"
440
+ );
441
+ return;
442
+ }
443
+ t.enableHitbox();
444
+ }
445
+ function pe(n, e) {
446
+ const t = u.getById(n, e);
447
+ if (!t) {
448
+ e.submitWarning(
449
+ "disablePanelHitbox",
450
+ "Unable to find PneumaticPanelSelectUC"
451
+ );
452
+ return;
453
+ }
454
+ t.disableHitbox();
455
+ }
456
+ function me(n, e, t) {
457
+ const s = u.getById(n, e);
458
+ return s ? s.subscribeOnPanelSelected(t) : (e.submitWarning(
459
+ "onPanelSelected",
460
+ "Unable to find PneumaticPanelSelectUC"
461
+ ), () => {
462
+ });
463
+ }
464
+ function Pe(n, e, t) {
465
+ const s = b.getById(n, e);
466
+ return s ? s.subscribeOnCheckPressure(t) : (e.submitWarning(
467
+ "onCheckPressure",
468
+ "Unable to find PneumaticPanelCheckPressureUC"
469
+ ), () => {
470
+ });
471
+ }
472
+ function ge(n, e) {
473
+ const t = u.getById(n, e);
474
+ if (!t) {
475
+ e.submitWarning(
476
+ "panelHitboxClicked",
477
+ "Unable to find PneumaticPanelSelectUC"
478
+ );
479
+ return;
480
+ }
481
+ t.notifyPanelSelected();
482
+ }
483
+ class p extends G {
484
+ static type = "PneumaticPanelPM";
485
+ static get(e) {
486
+ return e.getComponent(this.type);
487
+ }
488
+ static getById(e, t) {
489
+ return t.get(e)?.getComponent(this.type);
490
+ }
491
+ }
492
+ function fe(n) {
493
+ return new ke(n);
494
+ }
495
+ class ke extends p {
496
+ get entity() {
497
+ return this.getCachedLocalComponent(
498
+ c.type
499
+ );
500
+ }
501
+ vmsAreEqual(e, t) {
502
+ return e.exhaustOpen === t.exhaustOpen && e.isLocked === t.isLocked && e.pressure === t.pressure && e.showGhostLockHint === t.showGhostLockHint && e.panelHitboxEnabled === t.panelHitboxEnabled && e.subComponentsInteractive === t.subComponentsInteractive;
503
+ }
504
+ onEntityChange = () => {
505
+ const e = this.entity;
506
+ e && this.doUpdateView({
507
+ exhaustOpen: e.exhaustOpen,
508
+ isLocked: e.isLocked,
509
+ pressure: e.pressure,
510
+ showGhostLockHint: e.showGhostLockHint,
511
+ panelHitboxEnabled: e.panelHitboxEnabled,
512
+ subComponentsInteractive: !e.panelHitboxEnabled
513
+ });
514
+ };
515
+ constructor(e) {
516
+ super(e, p.type), this.entity?.addChangeObserver(this.onEntityChange), this.onEntityChange();
517
+ }
518
+ }
519
+ const o = {
520
+ defaultVM: {
521
+ exhaustOpen: !1,
522
+ isLocked: !1,
523
+ pressure: 60,
524
+ showGhostLockHint: !1,
525
+ panelHitboxEnabled: !1,
526
+ subComponentsInteractive: !0
527
+ },
528
+ subscribe: (n, e, t) => {
529
+ if (!n) return;
530
+ const s = p.getById(n, e);
531
+ if (!s) {
532
+ e.submitWarning(
533
+ "pneumaticPanelPMAdapter",
534
+ "Unable to find PneumaticPanelPM"
535
+ );
536
+ return;
537
+ }
538
+ s.addView(t);
539
+ },
540
+ unsubscribe: (n, e, t) => {
541
+ if (!n) return;
542
+ const s = p.getById(n, e);
543
+ s && s.removeView(t);
544
+ }
545
+ }, ye = {
546
+ /** Machine-friendly name (used in package name, imports) */
547
+ name: "PneumaticPanel",
548
+ /** Human-friendly display name */
549
+ displayName: "Pneumatic Panel",
550
+ /** Semantic version */
551
+ version: "0.1.0",
552
+ /** Whether multiple instances can exist in a scene */
553
+ multiInstance: !0,
554
+ /** 3D asset files to include in the build */
555
+ assets: [
556
+ {
557
+ name: "default",
558
+ id: "db90a1dd-8cb9-4f56-954d-7a72610281a7",
559
+ file: "pneumaticPanel.glb"
560
+ }
561
+ ]
562
+ }, xe = "lock", Ce = "ghost_lock";
563
+ class x extends g {
564
+ static type = "PneumaticPanelLockView";
565
+ static get(e) {
566
+ return e.getComponent(this.type);
567
+ }
568
+ }
569
+ function we(n) {
570
+ return new Me(n);
571
+ }
572
+ class Me extends x {
573
+ lockTransform;
574
+ ghostLockMesh;
575
+ currentVM = o.defaultVM;
576
+ flashTimer;
577
+ bindMeshes(e) {
578
+ this.lockTransform = this.resolveLockTransform(e), this.ghostLockMesh = this.resolveGhostLockMesh(e), this.lockTransform || this.warn("Unable to find lock transform from provided nodes"), this.ghostLockMesh || this.warn("Unable to find ghost lock mesh from provided nodes"), this.bindClickActionsOnLockChildren(), this.bindClickAction(this.ghostLockMesh), this.applyMeshes();
579
+ }
580
+ applyView = (e) => {
581
+ this.currentVM = e, this.applyMeshes();
582
+ };
583
+ applyMeshes() {
584
+ this.setLockVisible(this.currentVM.isLocked), this.setGhostLockVisible(this.shouldShowGhostLock());
585
+ }
586
+ flash() {
587
+ if (!this.lockTransform) return;
588
+ this.flashTimer !== void 0 && clearTimeout(this.flashTimer);
589
+ const e = this.lockTransform.getChildMeshes(!1);
590
+ for (const t of e)
591
+ t.overlayColor = new F(1, 0, 0), t.overlayAlpha = 0.3, t.renderOverlay = !0;
592
+ this.flashTimer = setTimeout(() => {
593
+ this.flashTimer = void 0;
594
+ for (const t of e)
595
+ t.renderOverlay = !1;
596
+ }, 400);
597
+ }
598
+ shouldShowGhostLock() {
599
+ return this.currentVM.exhaustOpen && !this.currentVM.isLocked;
600
+ }
601
+ setLockVisible(e) {
602
+ if (this.lockTransform) {
603
+ this.lockTransform.setEnabled(e);
604
+ for (const t of this.lockTransform.getChildMeshes(!1))
605
+ t.isPickable = e && this.currentVM.subComponentsInteractive, t.setEnabled(e);
606
+ }
607
+ }
608
+ /**
609
+ * Ghost lock visibility is driven by authored domain state only. The mesh
610
+ * stays enabled and pickable so the Host can reach it via
611
+ * `highlightGroupsByObjectId` and reveal it on hover itself (ADR-0010).
612
+ */
613
+ setGhostLockVisible(e) {
614
+ this.ghostLockMesh && (this.ghostLockMesh.setEnabled(e), this.ghostLockMesh.isPickable = e && this.currentVM.subComponentsInteractive, this.ghostLockMesh.visibility = e && this.currentVM.showGhostLockHint ? 1 : 0);
615
+ }
616
+ bindClickActionsOnLockChildren() {
617
+ if (this.lockTransform)
618
+ for (const e of this.lockTransform.getChildMeshes(!1))
619
+ this.bindClickAction(e);
620
+ }
621
+ bindClickAction(e) {
622
+ if (!e) return;
623
+ const t = e.getScene();
624
+ if (!t) {
625
+ this.warn("Unable to wire lock mesh without a scene");
626
+ return;
627
+ }
628
+ e.isPickable = !0, e.actionManager ??= new r(t), e.actionManager.registerAction(
629
+ new y(r.OnPickTrigger, () => {
630
+ U(this.appObject.id, this.appObjects);
631
+ })
632
+ );
633
+ }
634
+ resolveLockTransform(e) {
635
+ const t = e.get(xe), s = t?.getClassName();
636
+ if (!(!t || s !== "TransformNode" && s !== "Mesh"))
637
+ return t;
638
+ }
639
+ resolveGhostLockMesh(e) {
640
+ const t = e.get(Ce);
641
+ if (t)
642
+ return t;
643
+ }
644
+ dispose() {
645
+ this.flashTimer !== void 0 && clearTimeout(this.flashTimer), o.unsubscribe(
646
+ this.appObject.id,
647
+ this.appObjects,
648
+ this.applyView
649
+ ), super.dispose();
650
+ }
651
+ constructor(e) {
652
+ super(e, x.type), o.subscribe(
653
+ this.appObject.id,
654
+ this.appObjects,
655
+ this.applyView
656
+ );
657
+ }
658
+ }
659
+ const Oe = "exhaust_knob";
660
+ class M extends g {
661
+ static type = "PneumaticPanelExhaustView";
662
+ static get(e) {
663
+ return e.getComponent(this.type);
664
+ }
665
+ }
666
+ function Ee(n) {
667
+ return new Le(n);
668
+ }
669
+ class Le extends M {
670
+ exhaustKnobMesh;
671
+ currentVM = o.defaultVM;
672
+ currentAnimation;
673
+ bindMeshes(e) {
674
+ this.exhaustKnobMesh = e.get(
675
+ Oe
676
+ ), this.exhaustKnobMesh || this.warn("Unable to find exhaust knob mesh from provided nodes"), this.exhaustKnobMesh?.rotationQuaternion && (this.exhaustKnobMesh.rotationQuaternion = null), this.bindClickAction(this.exhaustKnobMesh), this.exhaustKnobMesh && (this.exhaustKnobMesh.isPickable = this.currentVM.subComponentsInteractive), this.snapKnobRotation(this.currentVM.exhaustOpen);
677
+ }
678
+ applyView = (e) => {
679
+ const t = this.currentVM;
680
+ this.currentVM = e, this.animateKnobRotation(this.currentVM.exhaustOpen), e.subComponentsInteractive !== t.subComponentsInteractive && this.exhaustKnobMesh && (this.exhaustKnobMesh.isPickable = e.subComponentsInteractive);
681
+ };
682
+ snapKnobRotation(e) {
683
+ this.exhaustKnobMesh && (this.exhaustKnobMesh.rotation.z = e ? -Math.PI / 2 : 0);
684
+ }
685
+ animateKnobRotation(e) {
686
+ if (!this.exhaustKnobMesh) return;
687
+ const t = e ? -Math.PI / 2 : 0;
688
+ if (Math.abs(this.exhaustKnobMesh.rotation.z - t) < 1e-3) return;
689
+ this.stopCurrentAnimation();
690
+ const s = this.exhaustKnobMesh.getScene();
691
+ if (!s) {
692
+ this.exhaustKnobMesh.rotation.z = t;
693
+ return;
694
+ }
695
+ const i = new d(
696
+ "exhaustKnobRotation",
697
+ "rotation.z",
698
+ 60,
699
+ d.ANIMATIONTYPE_FLOAT,
700
+ d.ANIMATIONLOOPMODE_CONSTANT
701
+ ), a = new W();
702
+ a.setEasingMode(R.EASINGMODE_EASEINOUT), i.setEasingFunction(a), i.setKeys([
703
+ { frame: 0, value: this.exhaustKnobMesh.rotation.z },
704
+ { frame: 15, value: t }
705
+ ]), this.currentAnimation = s.beginDirectAnimation(
706
+ this.exhaustKnobMesh,
707
+ [i],
708
+ 0,
709
+ 15,
710
+ !1
711
+ );
712
+ }
713
+ shakeKnob() {
714
+ if (!this.exhaustKnobMesh) return;
715
+ const e = this.exhaustKnobMesh.getScene();
716
+ if (!e) return;
717
+ this.stopCurrentAnimation();
718
+ const t = this.currentVM.exhaustOpen ? -Math.PI / 2 : 0, s = Math.PI / 36, i = new d(
719
+ "exhaustKnobShake",
720
+ "rotation.z",
721
+ 60,
722
+ d.ANIMATIONTYPE_FLOAT,
723
+ d.ANIMATIONLOOPMODE_CONSTANT
724
+ );
725
+ i.setKeys([
726
+ { frame: 0, value: t },
727
+ { frame: 4, value: t + s },
728
+ { frame: 12, value: t - s },
729
+ { frame: 18, value: t + s * 0.6 },
730
+ { frame: 22, value: t - s * 0.6 },
731
+ { frame: 26, value: t }
732
+ ]), this.currentAnimation = e.beginDirectAnimation(
733
+ this.exhaustKnobMesh,
734
+ [i],
735
+ 0,
736
+ 26,
737
+ !1
738
+ );
739
+ }
740
+ stopCurrentAnimation() {
741
+ this.currentAnimation && (this.currentAnimation.stop(), this.currentAnimation = void 0);
742
+ }
743
+ bindClickAction(e) {
744
+ if (!e) return;
745
+ const t = e.getScene();
746
+ if (!t) {
747
+ this.warn("Unable to wire exhaust knob mesh without a scene");
748
+ return;
749
+ }
750
+ e.isPickable = !0, e.actionManager ??= new r(t), e.actionManager.registerAction(
751
+ new y(r.OnPickTrigger, () => {
752
+ V(this.appObject.id, this.appObjects) || (this.shakeKnob(), x.get(this.appObject)?.flash());
753
+ })
754
+ );
755
+ }
756
+ dispose() {
757
+ this.stopCurrentAnimation(), o.unsubscribe(
758
+ this.appObject.id,
759
+ this.appObjects,
760
+ this.applyView
761
+ ), super.dispose();
762
+ }
763
+ constructor(e) {
764
+ super(e, M.type), o.subscribe(
765
+ this.appObject.id,
766
+ this.appObjects,
767
+ this.applyView
768
+ );
769
+ }
770
+ }
771
+ const Ie = "gauge";
772
+ class O extends g {
773
+ static type = "PneumaticPanelGaugeView";
774
+ static get(e) {
775
+ return e.getComponent(this.type);
776
+ }
777
+ }
778
+ function Ve(n) {
779
+ return new Ue(n);
780
+ }
781
+ class Ue extends O {
782
+ gaugeMesh;
783
+ currentVM = o.defaultVM;
784
+ bindMeshes(e) {
785
+ this.gaugeMesh = e.get(Ie), this.gaugeMesh || this.warn("Unable to find gauge mesh from provided nodes"), this.bindClickAction(this.gaugeMesh), this.gaugeMesh && (this.gaugeMesh.isPickable = this.currentVM.subComponentsInteractive);
786
+ }
787
+ applyView = (e) => {
788
+ const t = this.currentVM;
789
+ this.currentVM = e, e.subComponentsInteractive !== t.subComponentsInteractive && this.gaugeMesh && (this.gaugeMesh.isPickable = e.subComponentsInteractive);
790
+ };
791
+ bindClickAction(e) {
792
+ if (!e) return;
793
+ const t = e.getScene();
794
+ if (!t) {
795
+ this.warn("Unable to wire gauge mesh without a scene");
796
+ return;
797
+ }
798
+ e.isPickable = !0, e.actionManager ??= new r(t), e.actionManager.registerAction(
799
+ new y(r.OnPickTrigger, () => {
800
+ A(this.appObject.id, this.appObjects);
801
+ })
802
+ );
803
+ }
804
+ constructor(e) {
805
+ super(e, O.type), o.subscribe(
806
+ this.appObject.id,
807
+ this.appObjects,
808
+ this.applyView
809
+ );
810
+ }
811
+ dispose() {
812
+ o.unsubscribe(
813
+ this.appObject.id,
814
+ this.appObjects,
815
+ this.applyView
816
+ ), super.dispose();
817
+ }
818
+ }
819
+ const Ae = "panel_hitbox";
820
+ class E extends g {
821
+ static type = "PneumaticPanelHitboxView";
822
+ static get(e) {
823
+ return e.getComponent(this.type);
824
+ }
825
+ }
826
+ function ve(n) {
827
+ return new Te(n);
828
+ }
829
+ class Te extends E {
830
+ hitboxMesh;
831
+ currentVM = o.defaultVM;
832
+ bindMeshes(e) {
833
+ if (this.hitboxMesh = e.get(Ae), !this.hitboxMesh) {
834
+ this.warn("Unable to find panel hitbox mesh from provided nodes");
835
+ return;
836
+ }
837
+ const t = this.hitboxMesh.material;
838
+ t && (t.transparencyMode = D.MATERIAL_ALPHABLEND, t.alpha = 0), this.hitboxMesh.visibility = 0, this.hitboxMesh.isPickable = this.currentVM.panelHitboxEnabled, this.bindActions(this.hitboxMesh);
839
+ }
840
+ applyView = (e) => {
841
+ const t = this.currentVM;
842
+ this.currentVM = e, e.panelHitboxEnabled !== t.panelHitboxEnabled && this.hitboxMesh && (this.hitboxMesh.isPickable = e.panelHitboxEnabled);
843
+ };
844
+ bindActions(e) {
845
+ const t = e.getScene();
846
+ if (!t) {
847
+ this.warn("Unable to wire hitbox mesh without a scene");
848
+ return;
849
+ }
850
+ e.actionManager ??= new r(t), e.actionManager.registerAction(
851
+ new y(r.OnPickTrigger, () => {
852
+ ge(this.appObject.id, this.appObjects);
853
+ })
854
+ );
855
+ }
856
+ constructor(e) {
857
+ super(e, E.type), o.subscribe(
858
+ this.appObject.id,
859
+ this.appObjects,
860
+ this.applyView
861
+ );
862
+ }
863
+ dispose() {
864
+ o.unsubscribe(
865
+ this.appObject.id,
866
+ this.appObjects,
867
+ this.applyView
868
+ ), super.dispose();
869
+ }
870
+ }
871
+ let L = /* @__PURE__ */ new WeakMap();
872
+ function Be(n) {
873
+ let e = L.get(n);
874
+ return e || (e = /* @__PURE__ */ new Map(), L.set(n, e)), e;
875
+ }
876
+ async function Se(n, e, t) {
877
+ const s = Be(n);
878
+ let i = s.get(t);
879
+ i || (i = K(t, e).then(
880
+ (a) => $(a, n, {
881
+ pluginExtension: ".glb"
882
+ })
883
+ ), s.set(t, i));
884
+ try {
885
+ return await i;
886
+ } catch (a) {
887
+ throw s.delete(t), a;
888
+ }
889
+ }
890
+ class C extends g {
891
+ static type = "PneumaticPanelBabylonView";
892
+ static get(e) {
893
+ return e.getComponent(this.type);
894
+ }
895
+ }
896
+ function v(n) {
897
+ return new He(n);
898
+ }
899
+ class He extends C {
900
+ lockView;
901
+ exhaustView;
902
+ gaugeView;
903
+ hitboxView;
904
+ meshes = [];
905
+ _nodesByObjectId = /* @__PURE__ */ new Map();
906
+ _highlightGroupsByObjectId = /* @__PURE__ */ new Map();
907
+ instantiatedEntries;
908
+ _rootTransformNode;
909
+ loadPromise;
910
+ async load() {
911
+ this.meshes.length > 0 || (this.loadPromise || (this.loadPromise = this.loadInternal().catch((e) => {
912
+ throw this.loadPromise = void 0, e;
913
+ })), await this.loadPromise);
914
+ }
915
+ async loadInternal() {
916
+ const e = this.getScene(), t = ye.assets[0]?.id;
917
+ if (!t) {
918
+ this.appObjects.submitError(
919
+ "PneumaticPanelBabylonView.load",
920
+ "Missing PneumaticPanel default asset configuration"
921
+ );
922
+ return;
923
+ }
924
+ const s = await Se(
925
+ e,
926
+ this.appObjects,
927
+ t
928
+ );
929
+ this.instantiatedEntries = s.instantiateModelsToScene(
930
+ (a) => a
931
+ ), this._rootTransformNode = this.instantiatedEntries.rootNodes[0], this.meshes = this.collectMeshesFromRoots(
932
+ this.instantiatedEntries.rootNodes
933
+ ), this._nodesByObjectId = this.buildNodeLookup(
934
+ this.instantiatedEntries.rootNodes
935
+ );
936
+ const i = this.meshes.filter(
937
+ (a) => a.metadata?.gltf?.extras?.objectId?.toLowerCase() !== "panel_hitbox"
938
+ );
939
+ this._highlightGroupsByObjectId = this.buildHighlightGroups(
940
+ this._nodesByObjectId,
941
+ i
942
+ ), this.lockView.bindMeshes(this._nodesByObjectId), this.exhaustView.bindMeshes(this._nodesByObjectId), this.gaugeView.bindMeshes(this._nodesByObjectId), this.hitboxView.bindMeshes(this._nodesByObjectId);
943
+ }
944
+ buildHighlightGroups(e, t) {
945
+ const s = /* @__PURE__ */ new Map();
946
+ s.set("panel_hitbox", t);
947
+ for (const [i, a] of e)
948
+ i !== "panel_hitbox" && a.getClassName() === "Mesh" && s.set(i, [a]);
949
+ return s;
950
+ }
951
+ buildNodeLookup(e) {
952
+ const t = /* @__PURE__ */ new Map(), s = (i) => {
953
+ const a = i.metadata?.gltf?.extras?.objectId;
954
+ if (typeof a == "string") {
955
+ const w = a.toLowerCase();
956
+ t.has(w) || t.set(w, i);
957
+ }
958
+ };
959
+ for (const i of e) {
960
+ s(i);
961
+ for (const a of i.getDescendants(
962
+ !1
963
+ ))
964
+ s(a);
965
+ }
966
+ return t;
967
+ }
968
+ collectMeshesFromRoots(e) {
969
+ const t = /* @__PURE__ */ new Set();
970
+ for (const s of e) {
971
+ s.getClassName() === "Mesh" && t.add(s);
972
+ for (const i of s.getChildMeshes(!1))
973
+ t.add(i);
974
+ }
975
+ return [...t];
976
+ }
977
+ getScene() {
978
+ const e = z.get(this.appObjects);
979
+ if (!e?.scene)
980
+ throw new Error("BabylonEntity scene is not available");
981
+ return e.scene;
982
+ }
983
+ get nodesByObjectId() {
984
+ return this._nodesByObjectId;
985
+ }
986
+ get rootTransformNode() {
987
+ return this._rootTransformNode;
988
+ }
989
+ get shadowCasters() {
990
+ return this.meshes;
991
+ }
992
+ get highlightGroupsByObjectId() {
993
+ return this._highlightGroupsByObjectId;
994
+ }
995
+ dispose() {
996
+ this.instantiatedEntries?.dispose(), this.instantiatedEntries = void 0, this.meshes = [], this._nodesByObjectId = /* @__PURE__ */ new Map(), this._highlightGroupsByObjectId = /* @__PURE__ */ new Map(), this._rootTransformNode = void 0, this.loadPromise = void 0, this.lockView.dispose(), this.exhaustView.dispose(), this.gaugeView.dispose(), super.dispose();
997
+ }
998
+ constructor(e) {
999
+ super(e, C.type), this.lockView = we(e), this.exhaustView = Ee(e), this.gaugeView = Ve(e), this.hitboxView = ve(e);
1000
+ }
1001
+ }
1002
+ const je = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1003
+ __proto__: null,
1004
+ PneumaticPanelBabylonView: C,
1005
+ makePneumaticPanelBabylonView: v
1006
+ }, Symbol.toStringTag, { value: "Module" }));
1007
+ class _e extends N {
1008
+ factoryName = "PneumaticPanelFeatureFactory";
1009
+ repo = null;
1010
+ setupEntities() {
1011
+ this.repo = Q(this.appObject), this.repo.pneumaticPanelEntityFactory = Ge(
1012
+ this.appObjects
1013
+ );
1014
+ }
1015
+ setupUCs() {
1016
+ }
1017
+ setupPMs() {
1018
+ }
1019
+ finalSetup() {
1020
+ }
1021
+ }
1022
+ function We(n) {
1023
+ const e = n.getOrCreate("PneumaticPanels");
1024
+ return new _e(e);
1025
+ }
1026
+ function Ge(n) {
1027
+ return function(e) {
1028
+ const t = n.getOrCreate(e), s = I(t);
1029
+ return J(t), Z(t), te(t), se(t), fe(t), s;
1030
+ };
1031
+ }
1032
+ function T(n, e) {
1033
+ const t = P.get(e);
1034
+ if (!t) {
1035
+ e.submitWarning(
1036
+ "createPneumaticPanel",
1037
+ "Unable to find PneumaticPanelRepo"
1038
+ );
1039
+ return;
1040
+ }
1041
+ return t.createPneumaticPanelEntity(n).appObject;
1042
+ }
1043
+ async function Re(n, e) {
1044
+ const t = T(n, e);
1045
+ return t ? (await v(t).load(), t) : void 0;
1046
+ }
1047
+ class De extends p {
1048
+ vmsAreEqual = () => !0;
1049
+ constructor(e) {
1050
+ super(e, p.type);
1051
+ }
1052
+ }
1053
+ class $e extends l {
1054
+ maxPressure = 60;
1055
+ toggleExhaust = () => !0;
1056
+ subscribeOnExhaustOpened = (e) => () => {
1057
+ };
1058
+ subscribeOnExhaustClosed = (e) => () => {
1059
+ };
1060
+ subscribeOnExhaustCloseBlockedByLock = (e) => () => {
1061
+ };
1062
+ constructor(e) {
1063
+ super(e, l.type);
1064
+ }
1065
+ }
1066
+ class qe extends h {
1067
+ toggleLock = () => !0;
1068
+ subscribeOnPanelLocked = (e) => () => {
1069
+ };
1070
+ subscribeOnPanelUnlocked = (e) => () => {
1071
+ };
1072
+ constructor(e) {
1073
+ super(e, h.type);
1074
+ }
1075
+ }
1076
+ class Qe extends b {
1077
+ checkPressure = () => {
1078
+ };
1079
+ subscribeOnCheckPressure = (e) => () => {
1080
+ };
1081
+ constructor(e) {
1082
+ super(e, b.type);
1083
+ }
1084
+ }
1085
+ class Ye extends u {
1086
+ enableHitbox = () => {
1087
+ };
1088
+ disableHitbox = () => {
1089
+ };
1090
+ subscribeOnPanelSelected = () => () => {
1091
+ };
1092
+ notifyPanelSelected = () => {
1093
+ };
1094
+ constructor(e) {
1095
+ super(e, u.type);
1096
+ }
1097
+ }
1098
+ const Ne = 2;
1099
+ class Je {
1100
+ id;
1101
+ interfaceVersion = 1;
1102
+ appObjects;
1103
+ /**
1104
+ * Dispatch map: event key → subscribe controller
1105
+ * Each controller has signature: (id, appObjects, cb: () => void) => () => void
1106
+ */
1107
+ eventDispatchMap = {
1108
+ exhaustOpened: re,
1109
+ exhaustClosed: le,
1110
+ exhaustCloseBlockedByLock: ue,
1111
+ panelLocked: he,
1112
+ panelUnlocked: de,
1113
+ panelSelected: me,
1114
+ pressureChecked: Pe
1115
+ };
1116
+ /**
1117
+ * Constructor: synchronously wire the domain instance.
1118
+ * No Babylon dependency; fully headless and testable.
1119
+ *
1120
+ * @param id - The instance identifier
1121
+ * @param appObjects - The AppObject repository
1122
+ */
1123
+ constructor(e, t) {
1124
+ this.id = e, this.appObjects = t, T(e, t);
1125
+ }
1126
+ /**
1127
+ * Asynchronously load and attach the Babylon view.
1128
+ * Required before the component renders in a 3D scene.
1129
+ */
1130
+ /**
1131
+ * Asynchronously load and attach the Babylon view.
1132
+ *
1133
+ * @param variant - Optional asset variant. No variants are implemented yet,
1134
+ * so an omitted or unrecognized variant loads the default asset
1135
+ * (best-effort, per Contract v1).
1136
+ */
1137
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
1138
+ async load(e) {
1139
+ const { makePneumaticPanelBabylonView: t } = await Promise.resolve().then(() => je), s = this.appObjects.get(this.id);
1140
+ s && await t(s).load();
1141
+ }
1142
+ /**
1143
+ * Tear down the component and release all resources.
1144
+ */
1145
+ destroy() {
1146
+ this.appObjects.get(this.id)?.dispose();
1147
+ }
1148
+ /**
1149
+ * Toggle the exhaust valve open/closed.
1150
+ * @returns true if toggle succeeded, false if blocked (e.g., by lock)
1151
+ */
1152
+ toggleExhaust() {
1153
+ return V(this.id, this.appObjects);
1154
+ }
1155
+ /**
1156
+ * Toggle the lock state.
1157
+ * @returns true if toggle succeeded, false if blocked (e.g., exhaust open)
1158
+ */
1159
+ toggleLock() {
1160
+ return U(this.id, this.appObjects);
1161
+ }
1162
+ /**
1163
+ * Trigger a pressure check.
1164
+ */
1165
+ checkPressure() {
1166
+ return A(this.id, this.appObjects);
1167
+ }
1168
+ /**
1169
+ * Show or hide the ghost lock hint.
1170
+ */
1171
+ setShowGhostLockHint(e) {
1172
+ return ae(this.id, this.appObjects, e);
1173
+ }
1174
+ /**
1175
+ * Enable the whole-panel hitbox for single-target selection.
1176
+ */
1177
+ enableHitbox() {
1178
+ return be(this.id, this.appObjects);
1179
+ }
1180
+ /**
1181
+ * Disable the whole-panel hitbox, restoring sub-component interactivity.
1182
+ */
1183
+ disableHitbox() {
1184
+ return pe(this.id, this.appObjects);
1185
+ }
1186
+ getState() {
1187
+ return oe(
1188
+ this.id,
1189
+ this.appObjects,
1190
+ Ne
1191
+ );
1192
+ }
1193
+ applyState(e) {
1194
+ return ce(this.id, this.appObjects, e);
1195
+ }
1196
+ /**
1197
+ * Subscribe to a typed event.
1198
+ * @param event - The event key (typed by PneumaticPanelEvents)
1199
+ * @param cb - The callback function
1200
+ * @returns An unsubscribe function
1201
+ */
1202
+ onEvent(e, t) {
1203
+ const s = this.eventDispatchMap[e];
1204
+ return s(this.id, this.appObjects, t);
1205
+ }
1206
+ /**
1207
+ * Subscribe to the reactive view model. Emits the current VM immediately,
1208
+ * then on every change. Returns an unsubscribe function.
1209
+ */
1210
+ onViewModel(e) {
1211
+ return o.subscribe(this.id, this.appObjects, e), () => o.unsubscribe(this.id, this.appObjects, e);
1212
+ }
1213
+ }
2
1214
  export {
3
- n as MockPneumaticPanelCheckPressureUC,
4
- s as MockPneumaticPanelPM,
5
- t as MockPneumaticPanelSelectUC,
6
- P as MockPneumaticPanelToggleExhaustUC,
7
- l as MockPneumaticPanelToggleLockUC,
8
- c as PNEUMATIC_PANEL_STATE_VERSION,
9
- o as PneumaticPanelBabylonView,
10
- i as PneumaticPanelCheckPressureUC,
11
- u as PneumaticPanelEntity,
12
- m as PneumaticPanelFacade,
13
- k as PneumaticPanelFeatureFactory,
14
- r as PneumaticPanelPM,
15
- g as PneumaticPanelRepo,
16
- C as PneumaticPanelSelectUC,
17
- h as PneumaticPanelToggleExhaustUC,
18
- E as PneumaticPanelToggleLockUC,
19
- x as applyPanelState,
20
- U as checkPressure,
21
- p as clearAllHighlights,
22
- H as componentConfig,
23
- d as createBabylonPneumaticPanel,
24
- y as disablePanelHitbox,
25
- b as enablePanelHitbox,
26
- M as getPanelState,
27
- T as makePneumaticPanelBabylonView,
28
- S as makePneumaticPanelCheckPressureUC,
29
- L as makePneumaticPanelEntity,
30
- A as makePneumaticPanelFeatureFactory,
31
- B as makePneumaticPanelPM,
32
- F as makePneumaticPanelRepo,
33
- v as makePneumaticPanelSelectUC,
34
- w as makePneumaticPanelToggleExhaustUC,
35
- O as makePneumaticPanelToggleLockUC,
36
- R as onCheckPressure,
37
- V as onExhaustCloseBlockedByLock,
38
- f as onExhaustClosed,
39
- I as onExhaustOpened,
40
- N as onPanelHoverEnter,
41
- _ as onPanelHoverExit,
42
- j as onPanelLocked,
43
- G as onPanelSelected,
44
- q as onPanelUnlocked,
45
- z as panelHitboxClicked,
46
- D as panelHitboxHoverEnter,
47
- J as panelHitboxHoverExit,
48
- K as pneumaticPanelPMAdapter,
49
- Q as setHighlightedObject,
50
- W as setShowGhostLockHint,
51
- X as tryToggleExhaust,
52
- Y as tryToggleLock
1215
+ Qe as MockPneumaticPanelCheckPressureUC,
1216
+ De as MockPneumaticPanelPM,
1217
+ Ye as MockPneumaticPanelSelectUC,
1218
+ $e as MockPneumaticPanelToggleExhaustUC,
1219
+ qe as MockPneumaticPanelToggleLockUC,
1220
+ Ne as PNEUMATIC_PANEL_STATE_VERSION,
1221
+ C as PneumaticPanelBabylonView,
1222
+ b as PneumaticPanelCheckPressureUC,
1223
+ c as PneumaticPanelEntity,
1224
+ Je as PneumaticPanelFacade,
1225
+ _e as PneumaticPanelFeatureFactory,
1226
+ p as PneumaticPanelPM,
1227
+ P as PneumaticPanelRepo,
1228
+ u as PneumaticPanelSelectUC,
1229
+ l as PneumaticPanelToggleExhaustUC,
1230
+ h as PneumaticPanelToggleLockUC,
1231
+ ce as applyPanelState,
1232
+ A as checkPressure,
1233
+ ye as componentConfig,
1234
+ Re as createBabylonPneumaticPanel,
1235
+ pe as disablePanelHitbox,
1236
+ be as enablePanelHitbox,
1237
+ oe as getPanelState,
1238
+ v as makePneumaticPanelBabylonView,
1239
+ te as makePneumaticPanelCheckPressureUC,
1240
+ I as makePneumaticPanelEntity,
1241
+ We as makePneumaticPanelFeatureFactory,
1242
+ fe as makePneumaticPanelPM,
1243
+ Q as makePneumaticPanelRepo,
1244
+ se as makePneumaticPanelSelectUC,
1245
+ J as makePneumaticPanelToggleExhaustUC,
1246
+ Z as makePneumaticPanelToggleLockUC,
1247
+ Pe as onCheckPressure,
1248
+ ue as onExhaustCloseBlockedByLock,
1249
+ le as onExhaustClosed,
1250
+ re as onExhaustOpened,
1251
+ he as onPanelLocked,
1252
+ me as onPanelSelected,
1253
+ de as onPanelUnlocked,
1254
+ ge as panelHitboxClicked,
1255
+ o as pneumaticPanelPMAdapter,
1256
+ ae as setShowGhostLockHint,
1257
+ V as tryToggleExhaust,
1258
+ U as tryToggleLock
53
1259
  };