hudini 0.20.0 → 0.21.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 (156) hide show
  1. package/dist/components/alert/alert.d.ts +161 -0
  2. package/dist/components/alert/alert.d.ts.map +1 -0
  3. package/dist/components/alert/alert.js +304 -0
  4. package/dist/components/alert/alert.js.map +1 -0
  5. package/dist/components/alert/alert.spec.d.ts +2 -0
  6. package/dist/components/alert/alert.spec.d.ts.map +1 -0
  7. package/dist/components/alert/alert.spec.js +235 -0
  8. package/dist/components/alert/alert.spec.js.map +1 -0
  9. package/dist/components/alert/index.d.ts +2 -0
  10. package/dist/components/alert/index.d.ts.map +1 -0
  11. package/dist/components/alert/index.js +2 -0
  12. package/dist/components/alert/index.js.map +1 -0
  13. package/dist/components/badge/badge.spec.js +2 -0
  14. package/dist/components/badge/badge.spec.js.map +1 -1
  15. package/dist/components/card/card.d.ts +11 -15
  16. package/dist/components/card/card.d.ts.map +1 -1
  17. package/dist/components/card/card.js +37 -59
  18. package/dist/components/card/card.js.map +1 -1
  19. package/dist/components/checkbox/checkbox.d.ts +153 -0
  20. package/dist/components/checkbox/checkbox.d.ts.map +1 -0
  21. package/dist/components/checkbox/checkbox.js +329 -0
  22. package/dist/components/checkbox/checkbox.js.map +1 -0
  23. package/dist/components/checkbox/checkbox.spec.d.ts +2 -0
  24. package/dist/components/checkbox/checkbox.spec.d.ts.map +1 -0
  25. package/dist/components/checkbox/checkbox.spec.js +346 -0
  26. package/dist/components/checkbox/checkbox.spec.js.map +1 -0
  27. package/dist/components/checkbox/index.d.ts +2 -0
  28. package/dist/components/checkbox/index.d.ts.map +1 -0
  29. package/dist/components/checkbox/index.js +2 -0
  30. package/dist/components/checkbox/index.js.map +1 -0
  31. package/dist/components/circular-progress/circular-progress.d.ts.map +1 -1
  32. package/dist/components/circular-progress/circular-progress.js +2 -1
  33. package/dist/components/circular-progress/circular-progress.js.map +1 -1
  34. package/dist/components/circular-progress/circular-progress.spec.js +2 -0
  35. package/dist/components/circular-progress/circular-progress.spec.js.map +1 -1
  36. package/dist/components/dock/dock.d.ts +115 -0
  37. package/dist/components/dock/dock.d.ts.map +1 -0
  38. package/dist/components/dock/dock.js +168 -0
  39. package/dist/components/dock/dock.js.map +1 -0
  40. package/dist/components/dock/dock.spec.d.ts +2 -0
  41. package/dist/components/dock/dock.spec.d.ts.map +1 -0
  42. package/dist/components/dock/dock.spec.js +178 -0
  43. package/dist/components/dock/dock.spec.js.map +1 -0
  44. package/dist/components/dock/index.d.ts +2 -0
  45. package/dist/components/dock/index.d.ts.map +1 -0
  46. package/dist/components/dock/index.js +2 -0
  47. package/dist/components/dock/index.js.map +1 -0
  48. package/dist/components/icon-button/icon-button.d.ts +17 -2
  49. package/dist/components/icon-button/icon-button.d.ts.map +1 -1
  50. package/dist/components/icon-button/icon-button.js +51 -19
  51. package/dist/components/icon-button/icon-button.js.map +1 -1
  52. package/dist/components/index.d.ts +9 -1
  53. package/dist/components/index.d.ts.map +1 -1
  54. package/dist/components/index.js +9 -1
  55. package/dist/components/index.js.map +1 -1
  56. package/dist/components/linear-progress/linear-progress.d.ts.map +1 -1
  57. package/dist/components/linear-progress/linear-progress.js +4 -4
  58. package/dist/components/linear-progress/linear-progress.js.map +1 -1
  59. package/dist/components/linear-progress/linear-progress.spec.js +2 -0
  60. package/dist/components/linear-progress/linear-progress.spec.js.map +1 -1
  61. package/dist/components/modal/index.d.ts +2 -0
  62. package/dist/components/modal/index.d.ts.map +1 -0
  63. package/dist/components/modal/index.js +2 -0
  64. package/dist/components/modal/index.js.map +1 -0
  65. package/dist/components/modal/modal.d.ts +193 -0
  66. package/dist/components/modal/modal.d.ts.map +1 -0
  67. package/dist/components/modal/modal.js +382 -0
  68. package/dist/components/modal/modal.js.map +1 -0
  69. package/dist/components/modal/modal.spec.d.ts +2 -0
  70. package/dist/components/modal/modal.spec.d.ts.map +1 -0
  71. package/dist/components/modal/modal.spec.js +360 -0
  72. package/dist/components/modal/modal.spec.js.map +1 -0
  73. package/dist/components/overlay/index.d.ts +2 -0
  74. package/dist/components/overlay/index.d.ts.map +1 -0
  75. package/dist/components/overlay/index.js +2 -0
  76. package/dist/components/overlay/index.js.map +1 -0
  77. package/dist/components/overlay/overlay.d.ts +75 -0
  78. package/dist/components/overlay/overlay.d.ts.map +1 -0
  79. package/dist/components/overlay/overlay.js +106 -0
  80. package/dist/components/overlay/overlay.js.map +1 -0
  81. package/dist/components/overlay/overlay.spec.d.ts +2 -0
  82. package/dist/components/overlay/overlay.spec.d.ts.map +1 -0
  83. package/dist/components/overlay/overlay.spec.js +135 -0
  84. package/dist/components/overlay/overlay.spec.js.map +1 -0
  85. package/dist/components/radial-progress/radial-progress.d.ts.map +1 -1
  86. package/dist/components/radial-progress/radial-progress.js +3 -2
  87. package/dist/components/radial-progress/radial-progress.js.map +1 -1
  88. package/dist/components/radio/index.d.ts +2 -0
  89. package/dist/components/radio/index.d.ts.map +1 -0
  90. package/dist/components/radio/index.js +2 -0
  91. package/dist/components/radio/index.js.map +1 -0
  92. package/dist/components/radio/radio.d.ts +157 -0
  93. package/dist/components/radio/radio.d.ts.map +1 -0
  94. package/dist/components/radio/radio.js +312 -0
  95. package/dist/components/radio/radio.js.map +1 -0
  96. package/dist/components/radio/radio.spec.d.ts +2 -0
  97. package/dist/components/radio/radio.spec.d.ts.map +1 -0
  98. package/dist/components/radio/radio.spec.js +353 -0
  99. package/dist/components/radio/radio.spec.js.map +1 -0
  100. package/dist/components/radio-group/index.d.ts +2 -0
  101. package/dist/components/radio-group/index.d.ts.map +1 -0
  102. package/dist/components/radio-group/index.js +2 -0
  103. package/dist/components/radio-group/index.js.map +1 -0
  104. package/dist/components/radio-group/radio-group.d.ts +122 -0
  105. package/dist/components/radio-group/radio-group.d.ts.map +1 -0
  106. package/dist/components/radio-group/radio-group.js +165 -0
  107. package/dist/components/radio-group/radio-group.js.map +1 -0
  108. package/dist/components/radio-group/radio-group.spec.d.ts +2 -0
  109. package/dist/components/radio-group/radio-group.spec.d.ts.map +1 -0
  110. package/dist/components/radio-group/radio-group.spec.js +205 -0
  111. package/dist/components/radio-group/radio-group.spec.js.map +1 -0
  112. package/dist/components/stack/index.d.ts +2 -0
  113. package/dist/components/stack/index.d.ts.map +1 -0
  114. package/dist/components/stack/index.js +2 -0
  115. package/dist/components/stack/index.js.map +1 -0
  116. package/dist/components/stack/stack.d.ts +118 -0
  117. package/dist/components/stack/stack.d.ts.map +1 -0
  118. package/dist/components/stack/stack.js +137 -0
  119. package/dist/components/stack/stack.js.map +1 -0
  120. package/dist/components/stack/stack.spec.d.ts +2 -0
  121. package/dist/components/stack/stack.spec.d.ts.map +1 -0
  122. package/dist/components/stack/stack.spec.js +116 -0
  123. package/dist/components/stack/stack.spec.js.map +1 -0
  124. package/dist/components/text-button/text-button.d.ts +72 -10
  125. package/dist/components/text-button/text-button.d.ts.map +1 -1
  126. package/dist/components/text-button/text-button.js +176 -34
  127. package/dist/components/text-button/text-button.js.map +1 -1
  128. package/dist/components/text-button/text-button.spec.js +42 -0
  129. package/dist/components/text-button/text-button.spec.js.map +1 -1
  130. package/dist/components/toggle/index.d.ts +2 -0
  131. package/dist/components/toggle/index.d.ts.map +1 -0
  132. package/dist/components/toggle/index.js +2 -0
  133. package/dist/components/toggle/index.js.map +1 -0
  134. package/dist/components/toggle/toggle.d.ts +149 -0
  135. package/dist/components/toggle/toggle.d.ts.map +1 -0
  136. package/dist/components/toggle/toggle.js +378 -0
  137. package/dist/components/toggle/toggle.js.map +1 -0
  138. package/dist/components/toggle/toggle.spec.d.ts +2 -0
  139. package/dist/components/toggle/toggle.spec.d.ts.map +1 -0
  140. package/dist/components/toggle/toggle.spec.js +353 -0
  141. package/dist/components/toggle/toggle.spec.js.map +1 -0
  142. package/dist/hudini.js +7640 -4410
  143. package/dist/hudini.min.js +1 -1
  144. package/dist/utils/button-style.d.ts +11 -0
  145. package/dist/utils/button-style.d.ts.map +1 -1
  146. package/dist/utils/button-style.js +2 -0
  147. package/dist/utils/button-style.js.map +1 -1
  148. package/package.json +2 -2
  149. package/dist/components/panel/index.d.ts +0 -2
  150. package/dist/components/panel/index.d.ts.map +0 -1
  151. package/dist/components/panel/index.js +0 -2
  152. package/dist/components/panel/index.js.map +0 -1
  153. package/dist/components/panel/panel.d.ts +0 -78
  154. package/dist/components/panel/panel.d.ts.map +0 -1
  155. package/dist/components/panel/panel.js +0 -191
  156. package/dist/components/panel/panel.js.map +0 -1
@@ -0,0 +1,360 @@
1
+ /* eslint-disable no-magic-numbers */
2
+ /* eslint-disable max-lines-per-function */
3
+ /* eslint-disable max-lines */
4
+ /* eslint-disable sonarjs/no-identical-functions */
5
+ import { Scene } from 'phaser';
6
+ import { describe, expect, it, vi } from 'vitest';
7
+ vi.mock('phaser-wind', () => {
8
+ class MockColumn {
9
+ width = 400;
10
+ height = 200;
11
+ children;
12
+ // eslint-disable-next-line no-unused-vars
13
+ constructor(params) {
14
+ this.children = params.children ?? [];
15
+ }
16
+ setPosition() {
17
+ return this;
18
+ }
19
+ layout() {
20
+ /* noop */
21
+ }
22
+ }
23
+ class MockRow {
24
+ width = 200;
25
+ height = 40;
26
+ // eslint-disable-next-line no-unused-vars
27
+ constructor(_params) { }
28
+ }
29
+ return {
30
+ Color: {
31
+ rgb: vi.fn((c) => `rgb-${c}`),
32
+ hex: vi.fn(() => 0xffffff),
33
+ },
34
+ Ease: { value: vi.fn(() => 'Linear') },
35
+ Column: MockColumn,
36
+ Row: MockRow,
37
+ };
38
+ });
39
+ vi.mock('../../utils/get-pw-from-scene', () => ({
40
+ getPWFromScene: vi.fn(() => ({
41
+ spacing: { px: vi.fn(() => 24) },
42
+ radius: { px: vi.fn(() => 12) },
43
+ depth: {
44
+ value: vi.fn((key) => ({ overlay: 1000, modal: 2000 })[key] ?? 0),
45
+ },
46
+ font: { family: vi.fn(() => 'Fredoka') },
47
+ fontSize: { px: vi.fn(() => 16) },
48
+ color: {
49
+ rgb: vi.fn((c) => `rgb-${c}`),
50
+ hex: vi.fn(() => 0x000000),
51
+ },
52
+ })),
53
+ }));
54
+ vi.mock('../overlay', () => {
55
+ class Overlay {
56
+ onClick;
57
+ // eslint-disable-next-line no-unused-vars
58
+ constructor(params) {
59
+ this.onClick = params.onClick;
60
+ }
61
+ open() {
62
+ return Promise.resolve();
63
+ }
64
+ close() {
65
+ return Promise.resolve();
66
+ }
67
+ destroy() {
68
+ /* noop */
69
+ }
70
+ setOnClick(cb) {
71
+ this.onClick = cb;
72
+ return this;
73
+ }
74
+ }
75
+ return { Overlay };
76
+ });
77
+ vi.mock('../icon-button', () => {
78
+ class IconButton {
79
+ onClickCb;
80
+ // eslint-disable-next-line no-unused-vars
81
+ constructor(params) {
82
+ this.onClickCb = params.onClick;
83
+ }
84
+ }
85
+ return { IconButton };
86
+ });
87
+ vi.mock('../text-button', () => {
88
+ class TextButton {
89
+ onClickCb;
90
+ label;
91
+ // eslint-disable-next-line no-unused-vars
92
+ constructor(params) {
93
+ this.label = params.text;
94
+ this.onClickCb = params.onClick;
95
+ }
96
+ }
97
+ return { TextButton };
98
+ });
99
+ vi.mock('../text', () => {
100
+ class Text {
101
+ text;
102
+ // eslint-disable-next-line no-unused-vars
103
+ constructor(params) {
104
+ this.text = params.text;
105
+ }
106
+ setColor() {
107
+ return this;
108
+ }
109
+ setOrigin() {
110
+ return this;
111
+ }
112
+ getBounds() {
113
+ return { width: this.text.length * 10, height: 22 };
114
+ }
115
+ }
116
+ return { Text };
117
+ });
118
+ vi.mock('phaser', () => {
119
+ class MockSprite {
120
+ width = 0;
121
+ height = 0;
122
+ // eslint-disable-next-line no-unused-vars
123
+ constructor(_x, _y, _t) { }
124
+ setOrigin() {
125
+ return this;
126
+ }
127
+ }
128
+ class MockGraphics {
129
+ fillStyle() {
130
+ return this;
131
+ }
132
+ fillRoundedRect() {
133
+ return this;
134
+ }
135
+ generateTexture() {
136
+ return this;
137
+ }
138
+ destroy() {
139
+ return this;
140
+ }
141
+ }
142
+ class Container {
143
+ scene;
144
+ list = [];
145
+ alpha = 1;
146
+ scaleX = 1;
147
+ scaleY = 1;
148
+ // eslint-disable-next-line no-unused-vars
149
+ constructor(_scene, _x, _y) {
150
+ this.scene = _scene;
151
+ }
152
+ add() {
153
+ return this;
154
+ }
155
+ addAt() {
156
+ return this;
157
+ }
158
+ setAlpha(a) {
159
+ this.alpha = a;
160
+ return this;
161
+ }
162
+ setScale(s) {
163
+ this.scaleX = s;
164
+ this.scaleY = s;
165
+ return this;
166
+ }
167
+ setDepth() {
168
+ return this;
169
+ }
170
+ setScrollFactor() {
171
+ return this;
172
+ }
173
+ destroy() {
174
+ /* noop */
175
+ }
176
+ }
177
+ class Scene {
178
+ cameras = { main: { width: 800, height: 600 } };
179
+ tweens = {
180
+ add: vi.fn((config) => {
181
+ if (config.alpha !== undefined)
182
+ config.targets.alpha = config.alpha;
183
+ if (config.scaleX !== undefined)
184
+ config.targets.scaleX = config.scaleX;
185
+ if (config.scaleY !== undefined)
186
+ config.targets.scaleY = config.scaleY;
187
+ config.onComplete?.();
188
+ return { stop: vi.fn() };
189
+ }),
190
+ };
191
+ input = {
192
+ keyboard: {
193
+ listeners: new Map(),
194
+ on(event, fn) {
195
+ this.listeners.set(event, fn);
196
+ },
197
+ off(event) {
198
+ this.listeners.delete(event);
199
+ },
200
+ emit(event, keyboardEvent) {
201
+ this.listeners.get(event)?.(keyboardEvent);
202
+ },
203
+ },
204
+ };
205
+ add = {
206
+ existing: vi.fn(),
207
+ sprite: vi.fn((x, y, t) => new MockSprite(x, y, t)),
208
+ graphics: vi.fn(() => new MockGraphics()),
209
+ };
210
+ textures = {
211
+ exists: vi.fn(() => false),
212
+ };
213
+ }
214
+ const GameObjects = { Container };
215
+ return { GameObjects, Scene };
216
+ });
217
+ // eslint-disable-next-line import/first
218
+ import { Modal } from './modal';
219
+ describe('Modal', () => {
220
+ it('creates with only title/description (95% case)', () => {
221
+ const scene = new Scene();
222
+ const modal = new Modal({ scene, title: 'Hi', description: 'World' });
223
+ expect(modal).toBeInstanceOf(Modal);
224
+ expect(modal.overlay).toBeDefined();
225
+ expect(modal.backgroundSprite).toBeDefined();
226
+ });
227
+ it('starts invisible (alpha 0, scaled down)', () => {
228
+ const scene = new Scene();
229
+ const modal = new Modal({ scene, title: 'Hi' });
230
+ expect(modal.alpha).toBe(0);
231
+ expect(modal.scaleX).toBe(0.9);
232
+ });
233
+ it('open() fades in to alpha 1 at scale 1', async () => {
234
+ const scene = new Scene();
235
+ const modal = new Modal({ scene, title: 'Hi' });
236
+ await modal.open();
237
+ expect(modal.alpha).toBe(1);
238
+ expect(modal.scaleX).toBe(1);
239
+ expect(modal.opened).toBe(true);
240
+ });
241
+ it('close() runs onClose and marks modal as no longer opened', async () => {
242
+ const scene = new Scene();
243
+ const onClose = vi.fn();
244
+ const modal = new Modal({ scene, title: 'Hi', onClose });
245
+ await modal.open();
246
+ await modal.close();
247
+ expect(onClose).toHaveBeenCalledTimes(1);
248
+ expect(modal.opened).toBe(false);
249
+ });
250
+ it('shows a close button by default', () => {
251
+ const scene = new Scene();
252
+ const modal = new Modal({ scene, title: 'Hi' });
253
+ expect(modal.closeButton).toBeDefined();
254
+ });
255
+ it('omits the close button when showCloseButton is false', () => {
256
+ const scene = new Scene();
257
+ const modal = new Modal({ scene, title: 'Hi', showCloseButton: false });
258
+ expect(modal.closeButton).toBeUndefined();
259
+ });
260
+ it('overlay click triggers close by default', async () => {
261
+ const scene = new Scene();
262
+ const onClose = vi.fn();
263
+ const modal = new Modal({ scene, title: 'Hi', onClose });
264
+ await modal.open();
265
+ // Simulate overlay click
266
+ modal.overlay.onClick();
267
+ await Promise.resolve();
268
+ await Promise.resolve();
269
+ expect(onClose).toHaveBeenCalledTimes(1);
270
+ });
271
+ it('overlay click does NOT close when closeOnOverlayClick is false', async () => {
272
+ const scene = new Scene();
273
+ const onClose = vi.fn();
274
+ const modal = new Modal({
275
+ scene,
276
+ title: 'Hi',
277
+ closeOnOverlayClick: false,
278
+ onClose,
279
+ });
280
+ await modal.open();
281
+ modal.overlay.onClick();
282
+ await Promise.resolve();
283
+ expect(onClose).not.toHaveBeenCalled();
284
+ expect(modal.opened).toBe(true);
285
+ });
286
+ it('closes on ESC by default', async () => {
287
+ const scene = new Scene();
288
+ const onClose = vi.fn();
289
+ const modal = new Modal({ scene, title: 'Hi', onClose });
290
+ await modal.open();
291
+ scene.input.keyboard?.emit('keydown', {
292
+ key: 'Escape',
293
+ preventDefault: vi.fn(),
294
+ });
295
+ // Await promise chain for close() to finish.
296
+ await Promise.resolve();
297
+ await Promise.resolve();
298
+ await Promise.resolve();
299
+ expect(onClose).toHaveBeenCalledTimes(1);
300
+ });
301
+ it('does NOT close on ESC when keysToClose is []', async () => {
302
+ const scene = new Scene();
303
+ const onClose = vi.fn();
304
+ const modal = new Modal({ scene, title: 'Hi', keysToClose: [], onClose });
305
+ await modal.open();
306
+ scene.input.keyboard?.emit('keydown', {
307
+ key: 'Escape',
308
+ preventDefault: vi.fn(),
309
+ });
310
+ await Promise.resolve();
311
+ expect(onClose).not.toHaveBeenCalled();
312
+ });
313
+ it('accepts custom keysToClose (e.g., "C")', async () => {
314
+ const scene = new Scene();
315
+ const onClose = vi.fn();
316
+ const modal = new Modal({
317
+ scene,
318
+ title: 'Hi',
319
+ keysToClose: ['C'],
320
+ onClose,
321
+ });
322
+ await modal.open();
323
+ scene.input.keyboard?.emit('keydown', {
324
+ key: 'C',
325
+ preventDefault: vi.fn(),
326
+ });
327
+ await Promise.resolve();
328
+ await Promise.resolve();
329
+ await Promise.resolve();
330
+ expect(onClose).toHaveBeenCalledTimes(1);
331
+ });
332
+ it('open() is idempotent while already open', async () => {
333
+ const scene = new Scene();
334
+ const modal = new Modal({ scene, title: 'Hi' });
335
+ await modal.open();
336
+ const tweenAdd = scene.tweens.add;
337
+ const tweenCallsAfterFirstOpen = tweenAdd.mock.calls.length;
338
+ await modal.open();
339
+ // No new tween added on second open
340
+ expect(tweenAdd.mock.calls.length).toBe(tweenCallsAfterFirstOpen);
341
+ });
342
+ it('renders actions and does not auto-close them', async () => {
343
+ const scene = new Scene();
344
+ const cancel = vi.fn();
345
+ const confirm = vi.fn();
346
+ const modal = new Modal({
347
+ scene,
348
+ title: 'Delete?',
349
+ actions: [
350
+ { label: 'Cancel', onClick: cancel },
351
+ { label: 'Delete', onClick: confirm },
352
+ ],
353
+ });
354
+ await modal.open();
355
+ // Modal itself just wires the click handler through; verify nothing throws
356
+ // and the modal is still open (no auto-close on action click).
357
+ expect(modal.opened).toBe(true);
358
+ });
359
+ });
360
+ //# sourceMappingURL=modal.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modal.spec.js","sourceRoot":"","sources":["../../../src/components/modal/modal.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './overlay';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/overlay/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './overlay';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/overlay/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
@@ -0,0 +1,75 @@
1
+ import { GameObjects, Scene } from 'phaser';
2
+ import { type ColorKey } from 'phaser-wind';
3
+ export type OverlayParams = {
4
+ /** Phaser scene where the overlay will be added. */
5
+ scene: Scene;
6
+ /**
7
+ * Dim color. Accepts a palette family (`'black'`), a full token
8
+ * (`'gray-900'`), a theme key, or a CSS hex string. Defaults to `'black'`.
9
+ */
10
+ color?: ColorKey | string;
11
+ /**
12
+ * Final alpha after fade-in. Values in the range 0..1. Defaults to `0.6` —
13
+ * enough to darken the background without hiding it entirely.
14
+ */
15
+ alpha?: number;
16
+ /**
17
+ * setDepth() value applied to the overlay rectangle. Defaults to
18
+ * `pw.depth.value('overlay')`.
19
+ */
20
+ depth?: number;
21
+ /**
22
+ * If `true`, clicking the overlay calls `onClick`. Defaults to `true`.
23
+ * Set to `false` for non-dismissable overlays (loading screens,
24
+ * transitions).
25
+ */
26
+ interactive?: boolean;
27
+ /** Click handler. Only invoked when `interactive` is `true`. */
28
+ onClick?: () => void;
29
+ /** Fade-in duration in ms. Defaults to `Duration.ms('200')` (200ms). */
30
+ fadeInDuration?: number;
31
+ /** Fade-out duration in ms. Defaults to `Duration.ms('200')` (200ms). */
32
+ fadeOutDuration?: number;
33
+ };
34
+ /**
35
+ * Overlay — a fullscreen dim rectangle anchored to the camera. Used as the
36
+ * backdrop for modals, drawers, loading screens, tutorial dims, and any
37
+ * "interrupt the world" moment.
38
+ *
39
+ * Overlay sits at `depth.overlay` by default so it stays above HUD content
40
+ * but below modals/tooltips. Fade-in/out animation is built in — call
41
+ * `open()` after construction to fade to the target alpha, and `close()`
42
+ * to fade back to 0.
43
+ *
44
+ * @example
45
+ * const overlay = new Overlay({ scene, onClick: () => overlay.close() });
46
+ * await overlay.open();
47
+ *
48
+ * @example
49
+ * // Loading screen dim — non-dismissable.
50
+ * const loading = new Overlay({ scene, alpha: 0.8, interactive: false });
51
+ * await loading.open();
52
+ * // ...load assets...
53
+ * await loading.close();
54
+ * loading.destroy();
55
+ */
56
+ export declare class Overlay extends GameObjects.Container {
57
+ /** The underlying dim rectangle. */
58
+ rect: GameObjects.Rectangle;
59
+ private pw;
60
+ private targetAlpha;
61
+ private fadeInMs;
62
+ private fadeOutMs;
63
+ private onClickCallback;
64
+ private activeTween;
65
+ constructor({ scene, color, alpha, depth, interactive, onClick, fadeInDuration, fadeOutDuration, }: OverlayParams);
66
+ /** Fade in to the target alpha. Resolves when the tween finishes. */
67
+ open(): Promise<void>;
68
+ /** Fade back to 0. Resolves when the tween finishes. */
69
+ close(): Promise<void>;
70
+ /** Replace the click handler. Pass `undefined` to clear it. */
71
+ setOnClick(callback: (() => void) | undefined): this;
72
+ destroy(): void;
73
+ private killActiveTween;
74
+ }
75
+ //# sourceMappingURL=overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../../src/components/overlay/overlay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAKL,KAAK,QAAQ,EACd,MAAM,aAAa,CAAC;AAIrB,MAAM,MAAM,aAAa,GAAG;IAC1B,oDAAoD;IACpD,KAAK,EAAE,KAAK,CAAC;IACb;;;OAGG;IACH,KAAK,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC1B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAIF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,OAAQ,SAAQ,WAAW,CAAC,SAAS;IAChD,oCAAoC;IAC7B,IAAI,EAAG,WAAW,CAAC,SAAS,CAAC;IAEpC,OAAO,CAAC,EAAE,CAAuB;IACjC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,eAAe,CAA2B;IAClD,OAAO,CAAC,WAAW,CAAkC;gBAEzC,EACV,KAAK,EACL,KAAe,EACf,KAAqB,EACrB,KAAK,EACL,WAAkB,EAClB,OAAO,EACP,cAAc,EACd,eAAe,GAChB,EAAE,aAAa;IAkChB,qEAAqE;IAC9D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB5B,wDAAwD;IACjD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB7B,+DAA+D;IACxD,UAAU,CAAC,QAAQ,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,GAAG,IAAI;IAK3C,OAAO,IAAI,IAAI;IAK/B,OAAO,CAAC,eAAe;CAMxB"}
@@ -0,0 +1,106 @@
1
+ import { GameObjects } from 'phaser';
2
+ import { Color, Duration, Ease, } from 'phaser-wind';
3
+ import { getPWFromScene } from '../../utils/get-pw-from-scene';
4
+ const DEFAULT_ALPHA = 0.6;
5
+ /**
6
+ * Overlay — a fullscreen dim rectangle anchored to the camera. Used as the
7
+ * backdrop for modals, drawers, loading screens, tutorial dims, and any
8
+ * "interrupt the world" moment.
9
+ *
10
+ * Overlay sits at `depth.overlay` by default so it stays above HUD content
11
+ * but below modals/tooltips. Fade-in/out animation is built in — call
12
+ * `open()` after construction to fade to the target alpha, and `close()`
13
+ * to fade back to 0.
14
+ *
15
+ * @example
16
+ * const overlay = new Overlay({ scene, onClick: () => overlay.close() });
17
+ * await overlay.open();
18
+ *
19
+ * @example
20
+ * // Loading screen dim — non-dismissable.
21
+ * const loading = new Overlay({ scene, alpha: 0.8, interactive: false });
22
+ * await loading.open();
23
+ * // ...load assets...
24
+ * await loading.close();
25
+ * loading.destroy();
26
+ */
27
+ export class Overlay extends GameObjects.Container {
28
+ /** The underlying dim rectangle. */
29
+ rect;
30
+ pw;
31
+ targetAlpha;
32
+ fadeInMs;
33
+ fadeOutMs;
34
+ onClickCallback;
35
+ activeTween;
36
+ constructor({ scene, color = 'black', alpha = DEFAULT_ALPHA, depth, interactive = true, onClick, fadeInDuration, fadeOutDuration, }) {
37
+ super(scene, 0, 0);
38
+ this.pw = getPWFromScene(scene);
39
+ this.targetAlpha = alpha;
40
+ this.fadeInMs = fadeInDuration ?? Duration.ms('200');
41
+ this.fadeOutMs = fadeOutDuration ?? Duration.ms('200');
42
+ this.onClickCallback = onClick;
43
+ const cam = scene.cameras.main;
44
+ this.rect = scene.add.rectangle(cam.width / 2, cam.height / 2, cam.width, cam.height, Color.hex(color));
45
+ this.rect.setScrollFactor(0);
46
+ this.rect.setAlpha(0);
47
+ this.add(this.rect);
48
+ const resolvedDepth = depth ?? this.pw.depth.value('overlay');
49
+ this.setDepth(resolvedDepth);
50
+ if (interactive) {
51
+ this.rect.setInteractive({ useHandCursor: false });
52
+ this.rect.on('pointerdown', () => {
53
+ this.onClickCallback?.();
54
+ });
55
+ }
56
+ scene.add.existing(this);
57
+ }
58
+ /** Fade in to the target alpha. Resolves when the tween finishes. */
59
+ open() {
60
+ this.killActiveTween();
61
+ return new Promise((resolve) => {
62
+ this.activeTween = this.scene.tweens.add({
63
+ targets: this.rect,
64
+ alpha: this.targetAlpha,
65
+ duration: this.fadeInMs,
66
+ ease: Ease.value('out'),
67
+ onComplete: () => {
68
+ this.activeTween = undefined;
69
+ resolve();
70
+ },
71
+ });
72
+ });
73
+ }
74
+ /** Fade back to 0. Resolves when the tween finishes. */
75
+ close() {
76
+ this.killActiveTween();
77
+ return new Promise((resolve) => {
78
+ this.activeTween = this.scene.tweens.add({
79
+ targets: this.rect,
80
+ alpha: 0,
81
+ duration: this.fadeOutMs,
82
+ ease: Ease.value('out'),
83
+ onComplete: () => {
84
+ this.activeTween = undefined;
85
+ resolve();
86
+ },
87
+ });
88
+ });
89
+ }
90
+ /** Replace the click handler. Pass `undefined` to clear it. */
91
+ setOnClick(callback) {
92
+ this.onClickCallback = callback;
93
+ return this;
94
+ }
95
+ destroy() {
96
+ this.killActiveTween();
97
+ super.destroy();
98
+ }
99
+ killActiveTween() {
100
+ if (this.activeTween) {
101
+ this.activeTween.stop();
102
+ this.activeTween = undefined;
103
+ }
104
+ }
105
+ }
106
+ //# sourceMappingURL=overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../../src/components/overlay/overlay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=overlay.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.spec.d.ts","sourceRoot":"","sources":["../../../src/components/overlay/overlay.spec.ts"],"names":[],"mappings":""}