@number10/phaserjsx 0.2.0 → 0.3.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../src/components/custom/Modal.tsx"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B;;;;GAIG;AACH,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,0BAA0B,CAAA;AAKjC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAI/C;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,0DAA0D;IAC1D,IAAI,EAAE,OAAO,CAAA;IACb,iEAAiE;IACjE,cAAc,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAA;IACzC,kEAAkE;IAClE,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAA;IACjC,gEAAgE;IAChE,QAAQ,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAA;IACnC,8CAA8C;IAC9C,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACrC,0CAA0C;IAC1C,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACnC,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,iEAAiE;IACjE,cAAc,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;IACrC,iEAAiE;IACjE,eAAe,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;IACtC,oBAAoB;IACpB,QAAQ,CAAC,EAAE,YAAY,CAAA;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,OAoLtC"}
1
+ {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../src/components/custom/Modal.tsx"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B;;;;GAIG;AACH,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,0BAA0B,CAAA;AAKjC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAI/C;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,0DAA0D;IAC1D,IAAI,EAAE,OAAO,CAAA;IACb,iEAAiE;IACjE,cAAc,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAA;IACzC,kEAAkE;IAClE,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAA;IACjC,gEAAgE;IAChE,QAAQ,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAA;IACnC,8CAA8C;IAC9C,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACrC,0CAA0C;IAC1C,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACnC,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,iEAAiE;IACjE,cAAc,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;IACrC,iEAAiE;IACjE,eAAe,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;IACtC,oBAAoB;IACpB,QAAQ,CAAC,EAAE,YAAY,CAAA;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,OAwKtC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Portal.d.ts","sourceRoot":"","sources":["../../../src/components/custom/Portal.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG/C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IACjC,kCAAkC;IAClC,QAAQ,EAAE,YAAY,CAAA;IACtB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,gCAAgC;IAChC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,iEAAiE;IACjE,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,QAsGxC"}
1
+ {"version":3,"file":"Portal.d.ts","sourceRoot":"","sources":["../../../src/components/custom/Portal.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG/C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IACjC,kCAAkC;IAClC,QAAQ,EAAE,YAAY,CAAA;IACtB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,gCAAgC;IAChC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,iEAAiE;IACjE,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,QAkJxC"}
@@ -26,6 +26,10 @@ export interface ScrollSliderProps {
26
26
  contentSize: number;
27
27
  /** Callback when slider is scrolled, returns new scroll position in pixels */
28
28
  onScroll: (scrollPosition: number) => void;
29
+ /** Enable momentum scrolling for thumb dragging */
30
+ momentum?: boolean;
31
+ /** Callback when momentum (or drag end without momentum) finishes */
32
+ onMomentumEnd?: () => void;
29
33
  }
30
34
  /**
31
35
  * ScrollSlider component providing slider functionality for ScrollView
@@ -1 +1 @@
1
- {"version":3,"file":"ScrollSlider.d.ts","sourceRoot":"","sources":["../../../src/components/custom/ScrollSlider.tsx"],"names":[],"mappings":"AAWA,0CAA0C;AAC1C,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAA;AAE1E;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,UAAU;;;;EAQnD;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,8BAA8B;IAC9B,SAAS,EAAE,UAAU,GAAG,YAAY,CAAA;IACpC,mDAAmD;IACnD,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,wCAAwC;IACxC,cAAc,EAAE,MAAM,CAAA;IACtB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAA;IACpB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,8EAA8E;IAC9E,QAAQ,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAA;CAC3C;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,OAyHpD"}
1
+ {"version":3,"file":"ScrollSlider.d.ts","sourceRoot":"","sources":["../../../src/components/custom/ScrollSlider.tsx"],"names":[],"mappings":"AAWA,0CAA0C;AAC1C,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAA;AAE1E;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,UAAU;;;;EAQnD;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,8BAA8B;IAC9B,SAAS,EAAE,UAAU,GAAG,YAAY,CAAA;IACpC,mDAAmD;IACnD,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,wCAAwC;IACxC,cAAc,EAAE,MAAM,CAAA;IACtB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAA;IACpB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,8EAA8E;IAC9E,QAAQ,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,mDAAmD;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;CAC3B;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,OAmLpD"}
@@ -21,6 +21,14 @@ export interface ScrollInfo {
21
21
  /** Maximum vertical scroll */
22
22
  maxScrollY: number;
23
23
  }
24
+ /**
25
+ * Snap configuration types
26
+ */
27
+ export type SnapMode = {
28
+ positions: number[];
29
+ threshold?: number;
30
+ };
31
+ export type SnapAlignment = 'start' | 'center' | 'end';
24
32
  /**
25
33
  * Props for ScrollView component
26
34
  */
@@ -38,6 +46,14 @@ export interface ScrollViewProps extends ViewProps {
38
46
  };
39
47
  /** Callback when scroll information changes */
40
48
  onScrollInfoChange?: (info: ScrollInfo) => void;
49
+ /** Snap behavior: false (disabled), 'auto' (to items), or manual positions */
50
+ snap?: SnapMode | undefined;
51
+ /** Alignment for snapping */
52
+ snapAlignment?: SnapAlignment;
53
+ /** Threshold for snap (pixels) */
54
+ snapThreshold?: number;
55
+ /** Enable momentum scrolling */
56
+ momentum?: boolean;
41
57
  }
42
58
  /**
43
59
  * ScrollView component providing a scrollable area with an optional vertical slider
@@ -1 +1 @@
1
- {"version":3,"file":"ScrollView.d.ts","sourceRoot":"","sources":["../../../src/components/custom/ScrollView.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAKnC,OAAO,EAAqC,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAEnF;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAA;IACV,uCAAuC;IACvC,EAAE,EAAE,MAAM,CAAA;IACV,qBAAqB;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,sBAAsB;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,oBAAoB;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,qBAAqB;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,SAAS;IAChD,iEAAiE;IACjE,kBAAkB,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAA;IACjD,iEAAiE;IACjE,oBAAoB,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAA;IACnD,0CAA0C;IAC1C,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,8BAA8B;IAC9B,MAAM,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAA;IACnC,+CAA+C;IAC/C,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAA;CAChD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,OAwQhD"}
1
+ {"version":3,"file":"ScrollView.d.ts","sourceRoot":"","sources":["../../../src/components/custom/ScrollView.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAKnC,OAAO,EAAqC,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAEnF;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAA;IACV,uCAAuC;IACvC,EAAE,EAAE,MAAM,CAAA;IACV,qBAAqB;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,sBAAsB;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,oBAAoB;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,qBAAqB;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAClE,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAA;AAEtD;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,SAAS;IAChD,iEAAiE;IACjE,kBAAkB,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAA;IACjD,iEAAiE;IACjE,oBAAoB,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAA;IACnD,0CAA0C;IAC1C,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,8BAA8B;IAC9B,MAAM,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAA;IACnC,+CAA+C;IAC/C,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAA;IAC/C,8EAA8E;IAC9E,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC3B,6BAA6B;IAC7B,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,kCAAkC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,OAqfhD"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const vdom = require("../../TransformOriginView-BDM6GE2F.cjs");
3
+ const vdom = require("../../TransformOriginView-KcTgaYRi.cjs");
4
4
  exports.Accordion = vdom.Accordion;
5
5
  exports.AlertDialog = vdom.AlertDialog;
6
6
  exports.Button = vdom.Button;
@@ -1,4 +1,4 @@
1
- import { A, a, B, C, b, D, c, d, I, f, M, N, g, P, R, h, m, i, S, k, l, n, T, o, W, j, e, u } from "../../TransformOriginView-CiFiQcku.js";
1
+ import { A, a, B, C, b, D, c, d, I, f, M, N, g, P, R, h, m, i, S, k, l, n, T, o, W, j, e, u } from "../../TransformOriginView-CzVjS16F.js";
2
2
  export {
3
3
  A as Accordion,
4
4
  a as AlertDialog,
@@ -1 +1 @@
1
- {"version":3,"file":"gesture-manager.d.ts","sourceRoot":"","sources":["../../src/gestures/gesture-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EAKd,MAAM,iBAAiB,CAAA;AAMxB;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,UAAU,CAAiE;IAGnF,OAAO,CAAC,oBAAoB,CAA8C;IAG1E,OAAO,CAAC,iBAAiB,CAKV;IAGf,OAAO,CAAC,uBAAuB,CAAuD;IAGtF,OAAO,CAAC,iBAAiB,CAAmD;IAG5E,OAAO,CAAC,eAAe,CAAoB;IAE3C,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,WAAW,CAAQ;gBAEf,KAAK,EAAE,MAAM,CAAC,KAAK;IAI/B;;OAEG;IACH,OAAO,CAAC,UAAU;IA4BlB;;;;;;OAMG;IACH,iBAAiB,CACf,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,SAAS,EACvC,SAAS,EAAE,gBAAgB,EAC3B,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,EAC9B,MAAM,GAAE,aAAkB,GACzB,IAAI;IAkBP;;;OAGG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,SAAS,GAAG,IAAI;IAoBlE;;;;OAIG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,SAAS,GAAG,OAAO;IAI9D;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe;IA+BvB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAazB;;;;;OAKG;IACH,OAAO,CAAC,SAAS;IAejB;;;;;;;;;OASG;IACH,OAAO,CAAC,WAAW;IAkEnB;;;;OAIG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI;IAO5F;;;;OAIG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,gBAAgB,GAAG,IAAI;IAO3F;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAwGzB;;OAEG;IACH,OAAO,CAAC,eAAe;IAsIvB;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IA+G7B;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAyFzB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAmB5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAiC1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAsB5B;;;OAGG;IACH,OAAO,CAAC,WAAW;IAyGnB;;OAEG;IACH,OAAO,CAAC,OAAO;CA2ChB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,cAAc,CAerE"}
1
+ {"version":3,"file":"gesture-manager.d.ts","sourceRoot":"","sources":["../../src/gestures/gesture-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EAKd,MAAM,iBAAiB,CAAA;AAMxB;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,UAAU,CAAiE;IAGnF,OAAO,CAAC,oBAAoB,CAA8C;IAG1E,OAAO,CAAC,iBAAiB,CAKV;IAGf,OAAO,CAAC,uBAAuB,CAAuD;IAGtF,OAAO,CAAC,iBAAiB,CAAmD;IAG5E,OAAO,CAAC,eAAe,CAAoB;IAE3C,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,WAAW,CAAQ;gBAEf,KAAK,EAAE,MAAM,CAAC,KAAK;IAI/B;;OAEG;IACH,OAAO,CAAC,UAAU;IA4BlB;;;;;;OAMG;IACH,iBAAiB,CACf,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,SAAS,EACvC,SAAS,EAAE,gBAAgB,EAC3B,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,EAC9B,MAAM,GAAE,aAAkB,GACzB,IAAI;IAkBP;;;OAGG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,SAAS,GAAG,IAAI;IAyBlE;;;;OAIG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,SAAS,GAAG,OAAO;IAI9D;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe;IA+BvB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAazB;;;;;OAKG;IACH,OAAO,CAAC,SAAS;IAejB;;;;;;;;;OASG;IACH,OAAO,CAAC,WAAW;IAkEnB;;;;OAIG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI;IAO5F;;;;OAIG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,gBAAgB,GAAG,IAAI;IAO3F;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAwGzB;;OAEG;IACH,OAAO,CAAC,eAAe;IAsIvB;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IA+G7B;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAyFzB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAmB5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAiC1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAsB5B;;;OAGG;IACH,OAAO,CAAC,WAAW;IAyGnB;;OAEG;IACH,OAAO,CAAC,OAAO;CA2ChB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,cAAc,CAerE"}
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const vdom = require("./TransformOriginView-BDM6GE2F.cjs");
3
+ const vdom = require("./TransformOriginView-KcTgaYRi.cjs");
4
4
  const jsxRuntime = require("./jsx-runtime.cjs");
5
5
  const signalsCore = require("@preact/signals-core");
6
6
  function useFX(ref) {
@@ -316,7 +316,7 @@ function setColorPreset(presetName, colorMode) {
316
316
  return;
317
317
  }
318
318
  setTimeout(() => {
319
- Promise.resolve().then(() => require("./TransformOriginView-BDM6GE2F.cjs")).then((n) => n.vdom).then(({ remountAll }) => {
319
+ Promise.resolve().then(() => require("./TransformOriginView-KcTgaYRi.cjs")).then((n) => n.vdom).then(({ remountAll }) => {
320
320
  remountAll();
321
321
  });
322
322
  }, 0);
@@ -529,6 +529,7 @@ exports.themeRegistry = vdom.themeRegistry;
529
529
  exports.tileSpriteCreator = vdom.tileSpriteCreator;
530
530
  exports.tileSpritePatcher = vdom.tileSpritePatcher;
531
531
  exports.unmount = vdom.unmount;
532
+ exports.unmountJSX = vdom.unmountJSX;
532
533
  exports.unwrapSignal = vdom.unwrapSignal;
533
534
  exports.useCallback = vdom.useCallback;
534
535
  exports.useEffect = vdom.useEffect;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/fx/use-fx.ts","../src/fx/fx-creators/blur.ts","../src/fx/fx-creators/color-matrix.ts","../src/fx/fx-creators/glow.ts","../src/fx/fx-creators/pixelate.ts","../src/fx/fx-creators/shadow.ts","../src/fx/fx-creators/vignette.ts","../src/fx/fx-registry.ts","../src/fx/convenience-hooks/use-blur.ts","../src/fx/convenience-hooks/use-glow.ts","../src/fx/convenience-hooks/use-shadow.ts","../src/memo.ts","../src/colors/use-color-mode.ts","../src/colors/use-colors.ts","../src/colors/color-theme-helpers.ts","../src/colors/preset-manager.ts","../src/design-tokens/use-theme-tokens.ts","../src/index.ts"],"sourcesContent":["/**\n * Hook for applying Phaser PostFX/PreFX pipeline effects\n * Manages FX lifecycle with proper cleanup\n */\nimport { useEffect, useRef } from '../hooks'\n\n/**\n * Ref object type\n */\ntype RefObject<T> = { current: T | null }\n\n/**\n * FX configuration base type\n */\nexport interface FXConfig {\n intensity?: number\n quality?: number\n onComplete?: () => void\n}\n\n/**\n * FX type discriminator (postFX vs preFX)\n */\nexport type FXType = 'post' | 'pre'\n\n/**\n * GameObject with FX pipeline support\n */\nexport type FXCapableGameObject =\n | Phaser.GameObjects.Image\n | Phaser.GameObjects.Sprite\n | Phaser.GameObjects.Container\n | Phaser.GameObjects.Text\n | Phaser.GameObjects.TileSprite\n | Phaser.GameObjects.NineSlice\n | Phaser.GameObjects.RenderTexture\n | Phaser.GameObjects.Video\n\n/**\n * FX creator function signature\n * @param obj - GameObject with FX pipeline\n * @param config - Effect-specific configuration\n * @param type - 'post' or 'pre' FX pipeline\n * @returns Cleanup function or FX controller (or any Phaser.FX effect)\n */\nexport type FXCreatorFn<TConfig extends FXConfig = FXConfig> = (\n obj: FXCapableGameObject,\n config: TConfig,\n type?: FXType\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n) => (() => void) | Phaser.FX.Controller | any | null\n\n/**\n * Hook for applying FX to GameObject\n * @param ref - Ref to GameObject\n * @returns Object with applyFX and clearFX methods\n *\n * @example\n * ```tsx\n * const ref = useRef(null)\n * const { applyFX, clearFX } = useFX(ref)\n *\n * const handleClick = () => {\n * applyFX(createShadowFX, { offsetX: 4, offsetY: 4, blur: 8 })\n * }\n *\n * return <View ref={ref} onClick={handleClick}>Click me</View>\n * ```\n */\nexport function useFX<T extends FXCapableGameObject>(ref: RefObject<T>) {\n const activeEffectsRef = useRef<Set<(() => void) | Phaser.FX.Controller>>(new Set())\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n activeEffectsRef.current.forEach((cleanup) => {\n if (typeof cleanup === 'function') {\n cleanup()\n } else if (cleanup?.destroy) {\n cleanup.destroy()\n }\n })\n activeEffectsRef.current.clear()\n }\n }, [])\n\n const applyFX = <TConfig extends FXConfig>(\n fxCreator: FXCreatorFn<TConfig>,\n config: TConfig,\n type: FXType = 'post'\n ) => {\n const obj = ref.current\n if (!obj) {\n console.warn('[useFX] No object found in ref')\n return\n }\n\n const cleanupOrController = fxCreator(obj, config, type)\n if (cleanupOrController) {\n activeEffectsRef.current.add(cleanupOrController)\n }\n }\n\n const clearFX = () => {\n activeEffectsRef.current.forEach((cleanup) => {\n if (typeof cleanup === 'function') {\n cleanup()\n } else if (cleanup?.destroy) {\n cleanup.destroy()\n }\n })\n activeEffectsRef.current.clear()\n\n // Clear FX pipeline\n const obj = ref.current\n if (obj && 'postFX' in obj && obj.postFX) {\n obj.postFX.clear()\n }\n if (obj && 'preFX' in obj && obj.preFX) {\n obj.preFX.clear()\n }\n }\n\n return { applyFX, clearFX }\n}\n","/**\n * Blur FX creator (Box & Gaussian Blur)\n */\nimport type { FXConfig, FXCreatorFn } from '../use-fx'\n\n/**\n * Blur FX configuration\n */\nexport interface BlurFXConfig extends FXConfig {\n /** The quality of the blur effect. Can be either 0 for Low Quality, 1 for Medium Quality or 2 for High Quality */\n quality?: number\n /** The horizontal offset of the blur effect */\n x?: number\n /** The vertical offset of the blur effect */\n y?: number\n /** The strength of the blur effect */\n strength?: number\n /** The color of the blur, as a hex value */\n color?: number\n /** The number of steps to run the blur effect for. This value should always be an integer */\n steps?: number\n}\n\n/**\n * Create blur FX\n * @param obj - GameObject\n * @param config - Blur configuration\n * @param type - 'post' or 'pre' FX\n * @returns Blur controller\n *\n * @example\n * ```tsx\n * applyFX(createBlurFX, {\n * quality: 1,\n * x: 4,\n * y: 4,\n * strength: 2\n * })\n * ```\n */\nexport const createBlurFX: FXCreatorFn<BlurFXConfig> = (obj, config, type = 'post') => {\n const { quality = 0, x = 2, y = 2, strength = 1, color = 0xffffff, steps = 4 } = config\n\n const pipeline = type === 'post' ? obj.postFX : obj.preFX\n if (!pipeline) {\n console.warn('[createBlurFX] FX pipeline not available on this GameObject')\n return null\n }\n\n // Phaser API: addBlur(quality, x, y, strength, color, steps)\n const blur = pipeline.addBlur(quality, x, y, strength, color, steps)\n\n return blur\n}\n","/**\n * Color Matrix FX creator (Grayscale, Sepia, Negative, etc.)\n */\nimport type { FXConfig, FXCreatorFn } from '../use-fx'\n\n/**\n * Color Matrix effect types\n */\nexport type ColorMatrixEffect =\n | 'grayscale'\n | 'sepia'\n | 'negative'\n | 'blackWhite'\n | 'brown'\n | 'kodachrome'\n | 'technicolor'\n | 'polaroid'\n\n/**\n * Color Matrix FX configuration\n */\nexport interface ColorMatrixFXConfig extends FXConfig {\n /** Effect type */\n effect?: ColorMatrixEffect\n /** Effect amount (0-1, for effects that support it like grayscale) */\n amount?: number\n}\n\n/**\n * Create color matrix FX\n * @param obj - GameObject\n * @param config - Color matrix configuration\n * @param type - 'post' or 'pre' FX\n * @returns Color matrix controller\n *\n * @example\n * ```tsx\n * applyFX(createColorMatrixFX, {\n * effect: 'grayscale',\n * amount: 1\n * })\n * ```\n */\nexport const createColorMatrixFX: FXCreatorFn<ColorMatrixFXConfig> = (\n obj,\n config,\n type = 'post'\n) => {\n const { effect = 'grayscale', amount = 1 } = config\n\n const pipeline = type === 'post' ? obj.postFX : obj.preFX\n if (!pipeline) {\n console.warn('[createColorMatrixFX] FX pipeline not available on this GameObject')\n return null\n }\n\n const colorMatrix = pipeline.addColorMatrix()\n\n // Apply the selected effect\n switch (effect) {\n case 'grayscale':\n colorMatrix.grayscale(amount)\n break\n case 'sepia':\n colorMatrix.sepia()\n break\n case 'negative':\n colorMatrix.negative()\n break\n case 'blackWhite':\n colorMatrix.blackWhite()\n break\n case 'brown':\n colorMatrix.brown()\n break\n case 'kodachrome':\n colorMatrix.kodachrome()\n break\n case 'technicolor':\n colorMatrix.technicolor()\n break\n case 'polaroid':\n colorMatrix.polaroid()\n break\n }\n\n return colorMatrix\n}\n","/**\n * Glow FX creator (Outer Glow)\n */\nimport type { FXConfig, FXCreatorFn } from '../use-fx'\n\n/**\n * Glow FX configuration\n */\nexport interface GlowFXConfig extends FXConfig {\n /** Glow color (hex number) */\n color?: number\n /** The strength of the glow outward from the edge */\n outerStrength?: number\n /** The strength of the glow inward from the edge */\n innerStrength?: number\n /** If true, only the glow is drawn, not the texture itself */\n knockout?: boolean\n /** Sets the quality of this Glow effect (PostFX only, cannot be changed post-creation) */\n quality?: number\n /** Sets the distance of this Glow effect (PostFX only, cannot be changed post-creation) */\n distance?: number\n}\n\n/**\n * Create glow FX\n * @param obj - GameObject\n * @param config - Glow configuration\n * @param type - 'post' or 'pre' FX\n * @returns Glow controller\n *\n * @example\n * ```tsx\n * applyFX(createGlowFX, {\n * color: 0xff6600,\n * outerStrength: 6,\n * innerStrength: 2\n * })\n * ```\n */\nexport const createGlowFX: FXCreatorFn<GlowFXConfig> = (obj, config, type = 'post') => {\n const {\n color = 0xffffff,\n outerStrength = 4,\n innerStrength = 0,\n knockout = false,\n quality = 0.1,\n distance = 10,\n } = config\n\n const pipeline = type === 'post' ? obj.postFX : obj.preFX\n if (!pipeline) {\n console.warn('[createGlowFX] FX pipeline not available on this GameObject')\n return null\n }\n\n // Phaser API: addGlow(color, outerStrength, innerStrength, knockout, quality, distance)\n const glow = pipeline.addGlow(color, outerStrength, innerStrength, knockout, quality, distance)\n\n return glow\n}\n","/**\n * Pixelate FX creator\n */\nimport type { FXConfig, FXCreatorFn } from '../use-fx'\n\n/**\n * Pixelate FX configuration\n */\nexport interface PixelateFXConfig extends FXConfig {\n /** The amount of pixelation to apply */\n amount?: number\n}\n\n/**\n * Create pixelate FX\n * @param obj - GameObject\n * @param config - Pixelate configuration\n * @param type - 'post' or 'pre' FX\n * @returns Pixelate controller\n *\n * @example\n * ```tsx\n * applyFX(createPixelateFX, {\n * amount: 8\n * })\n * ```\n */\nexport const createPixelateFX: FXCreatorFn<PixelateFXConfig> = (obj, config, type = 'post') => {\n const { amount = 1 } = config\n\n const pipeline = type === 'post' ? obj.postFX : obj.preFX\n if (!pipeline) {\n console.warn('[createPixelateFX] FX pipeline not available on this GameObject')\n return null\n }\n\n // Phaser API: addPixelate(amount)\n const pixelate = pipeline.addPixelate(amount)\n\n return pixelate\n}\n","/**\n * Shadow FX creator\n *\n * The shadow effect creates the illusion of depth by adding darker, offset silhouettes\n * beneath game objects, enhancing visual appeal and immersion.\n */\nimport type { FXConfig, FXCreatorFn } from '../use-fx'\n\n/**\n * Shadow FX configuration\n * Maps to Phaser's addShadow(x, y, decay, power, color, samples, intensity)\n */\nexport interface ShadowFXConfig extends FXConfig {\n /** Horizontal offset of the shadow effect (default: 0) */\n x?: number\n /** Vertical offset of the shadow effect (default: 0) */\n y?: number\n /** Amount of decay for shadow effect (default: 0.1) */\n decay?: number\n /** Power of the shadow effect (default: 1) */\n power?: number\n /** Color of the shadow (default: 0x000000) */\n color?: number\n /** Number of samples (1-12, higher = better quality, default: 6) */\n samples?: number\n /** Intensity of the shadow effect (default: 1) */\n intensity?: number\n}\n\n/**\n * Create shadow FX\n * @param obj - GameObject\n * @param config - Shadow configuration\n * @param type - 'post' or 'pre' FX\n * @returns Shadow controller\n *\n * @example\n * ```tsx\n * applyFX(createShadowFX, {\n * x: 0,\n * y: 0,\n * decay: 0.1,\n * power: 1,\n * color: 0x000000,\n * samples: 6,\n * intensity: 1\n * })\n * ```\n */\nexport const createShadowFX: FXCreatorFn<ShadowFXConfig> = (obj, config, type = 'post') => {\n const {\n x = 0,\n y = 1,\n decay = 0.05,\n power = 1,\n color = 0x000000,\n samples = 6,\n intensity = 1,\n } = config\n\n const pipeline = type === 'post' ? obj.postFX : obj.preFX\n if (!pipeline) {\n console.warn('[createShadowFX] FX pipeline not available on this GameObject')\n return null\n }\n\n // Phaser API: addShadow(x, y, decay, power, color, samples, intensity)\n const shadow = pipeline.addShadow(x, y, decay, power, color, samples, intensity)\n\n return shadow\n}\n","/**\n * Vignette FX creator\n */\nimport type { FXConfig, FXCreatorFn } from '../use-fx'\n\n/**\n * Vignette FX configuration\n */\nexport interface VignetteFXConfig extends FXConfig {\n /** The horizontal offset of the vignette effect. This value is normalized to the range 0 to 1 */\n x?: number\n /** The vertical offset of the vignette effect. This value is normalized to the range 0 to 1 */\n y?: number\n /** The radius of the vignette effect. This value is normalized to the range 0 to 1 */\n radius?: number\n /** The strength of the vignette effect */\n strength?: number\n}\n\n/**\n * Create vignette FX\n * @param obj - GameObject\n * @param config - Vignette configuration\n * @param type - 'post' or 'pre' FX\n * @returns Vignette controller\n *\n * @example\n * ```tsx\n * applyFX(createVignetteFX, {\n * x: 0.5,\n * y: 0.5,\n * radius: 0.5,\n * strength: 0.7\n * })\n * ```\n */\nexport const createVignetteFX: FXCreatorFn<VignetteFXConfig> = (obj, config, type = 'post') => {\n const { strength = 0.5, radius = 0.5, x = 0.5, y = 0.5 } = config\n\n const pipeline = type === 'post' ? obj.postFX : obj.preFX\n if (!pipeline) {\n console.warn('[createVignetteFX] FX pipeline not available on this GameObject')\n return null\n }\n\n // Phaser Vignette: addVignette(x, y, radius, strength)\n const vignette = pipeline.addVignette(x, y, radius, strength)\n\n return vignette\n}\n","/**\n * FX Registry - string-based FX lookup\n * Similar to effect-registry.ts for animation effects\n */\nimport {\n createBlurFX,\n createColorMatrixFX,\n createGlowFX,\n createPixelateFX,\n createShadowFX,\n createVignetteFX,\n type BlurFXConfig,\n type ColorMatrixFXConfig,\n type GlowFXConfig,\n type PixelateFXConfig,\n type ShadowFXConfig,\n type VignetteFXConfig,\n} from './fx-creators'\nimport type { FXConfig, FXCreatorFn } from './use-fx'\n\n/**\n * Built-in FX names\n */\nexport type BuiltInFXName =\n | 'shadow'\n | 'glow'\n | 'blur'\n | 'pixelate'\n | 'vignette'\n | 'grayscale'\n | 'sepia'\n | 'negative'\n | 'blackWhite'\n | 'brown'\n | 'kodachrome'\n | 'technicolor'\n | 'polaroid'\n\n/**\n * Extension point for custom FX (declaration merging)\n * @example\n * ```typescript\n * declare module '@number10/phaserjsx/fx' {\n * interface FXNameExtensions {\n * myCustomFX: 'myCustomFX'\n * }\n * }\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface FXNameExtensions {}\n\n/**\n * All available FX names (built-in + extensions)\n */\nexport type FXName =\n | BuiltInFXName\n | (keyof FXNameExtensions extends never ? never : keyof FXNameExtensions)\n\n/**\n * FX definition with name and config\n */\nexport interface FXDefinition {\n name: FXName\n config?: FXConfig\n}\n\n/**\n * FX Registry mapping names to creator functions\n */\nexport const FX_REGISTRY: Record<BuiltInFXName, FXCreatorFn> = {\n shadow: createShadowFX,\n glow: createGlowFX,\n blur: createBlurFX,\n pixelate: createPixelateFX,\n vignette: createVignetteFX,\n grayscale: (obj, config, type) =>\n createColorMatrixFX(obj, { ...config, effect: 'grayscale' }, type),\n sepia: (obj, config, type) => createColorMatrixFX(obj, { ...config, effect: 'sepia' }, type),\n negative: (obj, config, type) =>\n createColorMatrixFX(obj, { ...config, effect: 'negative' }, type),\n blackWhite: (obj, config, type) =>\n createColorMatrixFX(obj, { ...config, effect: 'blackWhite' }, type),\n brown: (obj, config, type) => createColorMatrixFX(obj, { ...config, effect: 'brown' }, type),\n kodachrome: (obj, config, type) =>\n createColorMatrixFX(obj, { ...config, effect: 'kodachrome' }, type),\n technicolor: (obj, config, type) =>\n createColorMatrixFX(obj, { ...config, effect: 'technicolor' }, type),\n polaroid: (obj, config, type) =>\n createColorMatrixFX(obj, { ...config, effect: 'polaroid' }, type),\n}\n\n/**\n * Default FX (none)\n */\nexport const DEFAULT_FX: FXName = 'grayscale'\n\n/**\n * Resolve FX by name or function\n * @param fxOrName - FX name string or creator function\n * @returns FX creator function or null\n */\nexport function resolveFX(fxOrName: FXName | FXCreatorFn): FXCreatorFn | null {\n if (typeof fxOrName === 'function') {\n return fxOrName\n }\n return FX_REGISTRY[fxOrName as BuiltInFXName] ?? null\n}\n\n/**\n * Apply FX by name (helper function)\n * @param applyFXFn - applyFX function from useFX hook\n * @param fxName - FX name\n * @param config - FX config\n *\n * @example\n * ```tsx\n * const { applyFX } = useFX(ref)\n * applyFXByName(applyFX, 'shadow', { offsetX: 4, offsetY: 4, blur: 8 })\n * ```\n */\nexport function applyFXByName(\n applyFXFn: ReturnType<typeof import('./use-fx').useFX>['applyFX'],\n fxName: FXName,\n config: FXConfig = {}\n) {\n const creator = resolveFX(fxName)\n if (creator) {\n applyFXFn(creator, config)\n } else {\n console.warn(`[applyFXByName] FX \"${fxName}\" not found in registry`)\n }\n}\n\n// Re-export config types for convenience\nexport type {\n BlurFXConfig,\n ColorMatrixFXConfig,\n GlowFXConfig,\n PixelateFXConfig,\n ShadowFXConfig,\n VignetteFXConfig,\n}\n","/**\n * Convenience hook for automatic blur FX\n * Applies blur on mount and updates on config changes\n */\nimport { useEffect } from '../../hooks'\nimport { createBlurFX, type BlurFXConfig } from '../fx-creators/blur'\nimport { useFX } from '../use-fx'\n\n/**\n * Hook for automatic blur FX\n * @param ref - GameObject ref\n * @param config - Blur config (updates reactively)\n * @returns FX controls\n *\n * @example\n * ```tsx\n * const ref = useRef(null)\n * useBlur(ref, { strength: 8, steps: 4 })\n *\n * return <View ref={ref}>Content</View>\n * ```\n */\nexport function useBlur(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ref: { current: any },\n config: BlurFXConfig = {}\n): { clearFX: () => void } {\n const { applyFX, clearFX } = useFX(ref)\n\n useEffect(() => {\n if (!ref.current) return\n\n // Clear previous FX\n clearFX()\n\n // Apply new blur\n applyFX(createBlurFX, config)\n\n return () => clearFX()\n }, [ref, config, applyFX, clearFX])\n\n return { clearFX }\n}\n","/**\n * Convenience hook for automatic glow FX\n * Applies glow on mount and updates on config changes\n */\nimport { useEffect } from '../../hooks'\nimport { createGlowFX, type GlowFXConfig } from '../fx-creators/glow'\nimport { useFX } from '../use-fx'\n\n/**\n * Hook for automatic glow FX\n * @param ref - GameObject ref\n * @param config - Glow config (updates reactively)\n * @returns FX controls\n *\n * @example\n * ```tsx\n * const ref = useRef(null)\n * useGlow(ref, { color: 0xff6600, outerStrength: 6, innerStrength: 2 })\n *\n * return <View ref={ref}>Content</View>\n * ```\n */\nexport function useGlow(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ref: { current: any },\n config: GlowFXConfig = {}\n): { clearFX: () => void } {\n const { applyFX, clearFX } = useFX(ref)\n\n useEffect(() => {\n if (!ref.current) return\n\n // Clear previous FX\n clearFX()\n\n // Apply new glow\n applyFX(createGlowFX, config)\n\n return () => clearFX()\n }, [ref, config, applyFX, clearFX])\n\n return { clearFX }\n}\n","/**\n * Convenience hook for automatic shadow FX\n * Applies shadow on mount and updates on config changes\n */\nimport { useEffect } from '../../hooks'\nimport { createShadowFX, type ShadowFXConfig } from '../fx-creators/shadow'\nimport { useFX } from '../use-fx'\n\n/**\n * Hook for automatic shadow FX\n * @param ref - GameObject ref\n * @param config - Shadow config (updates reactively)\n * @returns FX controls\n *\n * @example\n * ```tsx\n * const ref = useRef(null)\n * useShadow(ref, { x: 4, y: 4, decay: 0.1 })\n *\n * return <View ref={ref}>Content</View>\n * ```\n */\nexport function useShadow(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ref: { current: any },\n config: ShadowFXConfig = {}\n): { clearFX: () => void } {\n const { applyFX, clearFX } = useFX(ref)\n\n useEffect(() => {\n if (!ref.current) return\n\n // Clear previous FX\n clearFX()\n\n // Apply new shadow\n applyFX(createShadowFX, config)\n\n return () => clearFX()\n }, [ref, config, applyFX, clearFX])\n\n return { clearFX }\n}\n","/**\n * Component memoization utilities\n * Similar to React.memo() - prevents re-renders when props haven't changed\n */\nimport type { VNode } from './hooks'\n\n/**\n * Safely sets __memo on a VNode, handling frozen/sealed objects from bundlers\n * @param vnode - VNode to set __memo on\n * @param value - Memoization value\n * @returns Original VNode if extensible, or shallow copy with __memo\n */\nfunction setMemoSafe<T extends VNode>(vnode: T, value: boolean): T {\n if (Object.isExtensible(vnode)) {\n vnode.__memo = value\n return vnode\n }\n // VNode is frozen - create shallow copy\n return { ...vnode, __memo: value } as T\n}\n\n/**\n * Marks a component to skip memoization (always re-render on prop changes)\n * Use when component has side effects or needs to re-render every time\n *\n * @example\n * ```tsx\n * function AlwaysUpdate({ value }) {\n * console.log('Rendering with:', value)\n * return <Text text={value} />\n * }\n *\n * // Disable memoization\n * <AlwaysUpdate value={counter} __memo={false} />\n * ```\n *\n * @param vnode - VNode to mark\n * @returns Same VNode with memoization disabled (may be a copy if frozen)\n */\nexport function noMemo<T extends VNode>(vnode: T): T {\n return setMemoSafe(vnode, false)\n}\n\n/**\n * Explicitly enable memoization for a component (default behavior)\n * This is the default - you don't need to call this unless you want to be explicit\n *\n * @param vnode - VNode to mark\n * @returns Same VNode with memoization enabled (may be a copy if frozen)\n */\nexport function memo<T extends VNode>(vnode: T): T {\n return setMemoSafe(vnode, true)\n}\n","/**\n * Color mode management for dynamic theme switching\n */\nimport { useEffect, useState } from '../hooks'\nimport { themeRegistry } from '../theme'\n\n/**\n * Hook to manage color mode (light/dark) dynamically\n * @returns Object with current mode, toggle function, and setter\n * @example\n * ```typescript\n * function ThemeToggle() {\n * const { colorMode, toggleColorMode } = useColorMode()\n *\n * return (\n * <Button onClick={toggleColorMode}>\n * {colorMode === 'light' ? 'Dark' : 'Light'} Mode\n * </Button>\n * )\n * }\n * ```\n */\nexport function useColorMode(): {\n colorMode: 'light' | 'dark'\n setColorMode: (mode: 'light' | 'dark') => void\n toggleColorMode: () => void\n} {\n const [colorMode, setColorModeState] = useState<'light' | 'dark'>(themeRegistry.getColorMode())\n\n useEffect(() => {\n // Subscribe to theme registry changes\n const unsubscribe = themeRegistry.subscribe(() => {\n setColorModeState(themeRegistry.getColorMode())\n })\n\n return unsubscribe\n }, [])\n\n const setColorMode = (mode: 'light' | 'dark') => {\n themeRegistry.setColorMode(mode)\n }\n\n const toggleColorMode = () => {\n const newMode = colorMode === 'light' ? 'dark' : 'light'\n setColorMode(newMode)\n }\n\n return {\n colorMode,\n setColorMode,\n toggleColorMode,\n }\n}\n","/**\n * Color system hooks for component usage\n */\nimport { useEffect, useState, useTheme } from '../hooks'\nimport { themeRegistry } from '../theme'\nimport { getPresetWithMode } from './color-presets'\nimport type { ColorTokens } from './color-types'\n\n/**\n * Hook to access color tokens from theme context\n * Automatically updates when color mode or preset changes\n * @returns Current ColorTokens or undefined\n * @deprecated Use `useThemeTokens()` instead for access to colors, text styles, spacing, and more\n * @example\n * ```typescript\n * // Old way (deprecated):\n * const colors = useColors()\n *\n * // New way:\n * const tokens = useThemeTokens()\n * const colors = tokens?.colors\n *\n * // Access text styles, spacing, etc.:\n * <Text style={tokens.textStyles.DEFAULT} />\n * <View padding={tokens.spacing.lg} />\n * ```\n */\nexport function useColors(): ColorTokens | undefined {\n const localTheme = useTheme()\n\n // Initialize colors state\n const getInitialColors = (): ColorTokens | undefined => {\n // Check if local theme has color preset info\n if (localTheme?.__colorPreset) {\n const preset = getPresetWithMode(\n localTheme.__colorPreset.name as Parameters<typeof getPresetWithMode>[0],\n localTheme.__colorPreset.mode ?? 'light'\n )\n return preset.colors\n }\n\n // Fall back to global color tokens\n return themeRegistry.getColorTokens()\n }\n\n const [colors, setColors] = useState<ColorTokens | undefined>(getInitialColors())\n const [, forceUpdate] = useState(0)\n\n useEffect(() => {\n // Subscribe to theme changes (mode/preset switches)\n const unsubscribe = themeRegistry.subscribe(() => {\n // Check if local theme has preset\n if (localTheme?.__colorPreset) {\n const currentMode = themeRegistry.getColorMode()\n const preset = getPresetWithMode(\n localTheme.__colorPreset.name as Parameters<typeof getPresetWithMode>[0],\n currentMode\n )\n setColors(preset.colors)\n } else {\n // Use global tokens\n setColors(themeRegistry.getColorTokens())\n }\n // Force re-render when theme changes\n forceUpdate((n) => n + 1)\n })\n\n return unsubscribe\n }, [localTheme])\n\n return colors\n}\n\n/**\n * Hook to subscribe to theme changes without accessing colors\n * Use this in parent components that don't need colors themselves\n * but want to ensure children re-render when theme changes\n *\n * Note: Since useColors() now triggers re-renders automatically,\n * this hook is mainly useful if you don't need the colors themselves\n * but still want to react to theme changes.\n *\n * @example\n * ```typescript\n * function ParentComponent() {\n * useThemeSubscription() // Children will re-render on theme changes\n * return <ChildThatUsesColors />\n * }\n * ```\n */\nexport function useThemeSubscription(): void {\n const [, forceUpdate] = useState(0)\n\n useEffect(() => {\n const unsubscribe = themeRegistry.subscribe(() => {\n forceUpdate((n) => n + 1)\n })\n return unsubscribe\n }, [])\n}\n","/**\n * Helper functions for color system integration with theme\n */\nimport type { ColorTokens } from './color-types'\nimport { alpha } from './color-utils'\n\n/**\n * Convert ColorTokens to a theme-compatible object\n * Maps semantic color names to Phaser number format for View/Button components\n * @param colors - ColorTokens to convert\n * @returns Object with backgroundColor, borderColor, etc.\n * @example\n * ```typescript\n * const colors = getPreset('oceanBlue').colors\n * const buttonTheme = {\n * ...colorsToTheme(colors, 'primary'),\n * padding: 8,\n * }\n * // Returns: { backgroundColor: 0x2196f3, borderColor: 0x... }\n * ```\n */\nexport function colorsToTheme(\n colors: ColorTokens,\n colorKey: keyof Pick<\n ColorTokens,\n 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info'\n >,\n options: {\n /** Which shade to use for background (default: 'DEFAULT') */\n backgroundShade?: 'lightest' | 'light' | 'medium' | 'dark' | 'darkest' | 'DEFAULT'\n /** Which shade to use for border (default: 'dark') */\n borderShade?: 'lightest' | 'light' | 'medium' | 'dark' | 'darkest' | 'DEFAULT'\n /** Include border color (default: true) */\n includeBorder?: boolean\n } = {}\n): {\n backgroundColor: number\n borderColor?: number\n} {\n const { backgroundShade = 'DEFAULT', borderShade = 'dark', includeBorder = true } = options\n\n const result: { backgroundColor: number; borderColor?: number } = {\n backgroundColor: colors[colorKey][backgroundShade].toNumber(),\n }\n\n if (includeBorder) {\n result.borderColor = colors[colorKey][borderShade].toNumber()\n }\n\n return result\n}\n\n/**\n * Get text color from ColorTokens as hex string for Phaser Text style\n * @param colors - ColorTokens to use\n * @param shade - Which text shade to use (default: 'DEFAULT')\n * @param alphaValue - Optional alpha value (0-1)\n * @returns Hex string or rgba string for Text style\n * @example\n * ```typescript\n * const colors = getPreset('oceanBlue').colors\n * const textStyle = {\n * color: getTextColor(colors),\n * fontSize: '18px'\n * }\n * ```\n */\nexport function getTextColor(\n colors: ColorTokens,\n shade: 'lightest' | 'light' | 'medium' | 'dark' | 'darkest' | 'DEFAULT' = 'DEFAULT',\n alphaValue?: number\n): string {\n const color = colors.text[shade]\n return alphaValue !== undefined ? alpha(color.toNumber(), alphaValue) : color.toString()\n}\n\n/**\n * Get background color from ColorTokens\n * @param colors - ColorTokens to use\n * @param shade - Which shade to use (default: 'DEFAULT')\n * @returns Phaser color number\n */\nexport function getBackgroundColor(\n colors: ColorTokens,\n shade: 'lightest' | 'light' | 'medium' | 'dark' | 'darkest' | 'DEFAULT' = 'DEFAULT'\n): number {\n return colors.background[shade].toNumber()\n}\n\n/**\n * Get surface color from ColorTokens\n * @param colors - ColorTokens to use\n * @param shade - Which shade to use (default: 'DEFAULT')\n * @returns Phaser color number\n */\nexport function getSurfaceColor(\n colors: ColorTokens,\n shade: 'lightest' | 'light' | 'medium' | 'dark' | 'darkest' | 'DEFAULT' = 'DEFAULT'\n): number {\n return colors.surface[shade].toNumber()\n}\n\n/**\n * Get border color from ColorTokens\n * @param colors - ColorTokens to use\n * @param shade - Which shade to use (default: 'DEFAULT')\n * @returns Phaser color number\n */\nexport function getBorderColor(\n colors: ColorTokens,\n shade: 'lightest' | 'light' | 'medium' | 'dark' | 'darkest' | 'DEFAULT' = 'DEFAULT'\n): number {\n return colors.border[shade].toNumber()\n}\n","/**\n * Dynamic color preset management\n */\nimport { themeRegistry } from '../theme'\nimport type { PresetName } from './color-presets'\nimport { getPresetWithMode } from './color-presets'\n\n/**\n * Set the active color preset globally\n * Applies the preset with the current color mode and updates all components\n * Triggers complete remount of all active mountJSX instances\n * @param presetName - Name of the preset to apply\n * @param colorMode - Optional color mode to apply together with the preset\n * @example\n * ```typescript\n * // Switch to forest green theme\n * setColorPreset('forestGreen')\n *\n * // Apply preset and force dark mode in one go\n * setColorPreset('midnight', 'dark')\n *\n * // Current mode (light/dark) is preserved\n * ```\n */\nexport function setColorPreset(presetName: PresetName, colorMode?: 'light' | 'dark'): void {\n const targetMode = colorMode ?? themeRegistry.getColorMode()\n const preset = getPresetWithMode(presetName, targetMode)\n\n // Update color tokens WITHOUT notifying listeners\n // We skip listener notifications to prevent unnecessary re-renders\n themeRegistry.setColorTokens(preset.colors)\n themeRegistry.setCurrentPresetName(presetName, true) // true = skip notify\n\n // If caller asked for a specific mode, update it here so we only remount once\n if (colorMode && themeRegistry.getColorMode() !== colorMode) {\n themeRegistry.setColorMode(colorMode)\n return\n }\n\n // Trigger complete remount of all VDOM trees to apply new preset\n // Using setTimeout(0) to ensure all synchronous state updates complete first\n setTimeout(() => {\n // Import remountAll lazily to avoid circular dependency\n import('../vdom').then(({ remountAll }) => {\n remountAll()\n })\n }, 0)\n}\n\n/**\n * Get the currently active preset name\n * @returns Current preset name or undefined\n */\nexport function getCurrentPreset(): string | undefined {\n return themeRegistry.getCurrentPresetName()\n}\n\n/**\n * Set the active color mode globally (without changing the preset)\n * @param mode - Color mode to apply\n */\nexport function setColorMode(mode: 'light' | 'dark'): void {\n themeRegistry.setColorMode(mode)\n}\n\n/**\n * Get all available preset names\n * @returns Array of preset names\n * @example\n * ```typescript\n * const presets = getAvailablePresets() // ['oceanBlue', 'forestGreen', 'midnight']\n * ```\n */\nexport function getAvailablePresets(): PresetName[] {\n return ['oceanBlue', 'forestGreen', 'midnight']\n}\n","/**\n * Hook to access complete design token system\n * Combines colors with text styles, spacing, sizes, and radius tokens\n */\nimport { getPresetWithMode } from '../colors/color-presets'\nimport { useEffect, useState, useTheme } from '../hooks'\nimport { themeRegistry } from '../theme'\nimport {\n createTextStyleTokens,\n defaultRadiusTokens,\n defaultSizeTokens,\n defaultSpacingTokens,\n} from './design-token-presets'\nimport type { DesignTokens } from './design-token-types'\n\n/**\n * Hook to access complete design token system from theme context\n * Provides colors, text styles, spacing, sizes, and radius tokens\n * Automatically updates when color mode or preset changes\n * @returns Current DesignTokens or undefined\n * @example\n * ```typescript\n * function MyComponent() {\n * const tokens = useThemeTokens()\n *\n * if (!tokens) return null\n *\n * return (\n * <View\n * backgroundColor={tokens.colors.surface.DEFAULT}\n * padding={tokens.spacing.lg}\n * cornerRadius={tokens.radius.md}\n * >\n * <Text text=\"Title\" style={tokens.textStyles.title} />\n * <Text text=\"Body text\" style={tokens.textStyles.DEFAULT} />\n * </View>\n * )\n * }\n * ```\n */\nexport function useThemeTokens(): DesignTokens | undefined {\n const localTheme = useTheme()\n\n // Initialize design tokens state\n const getInitialTokens = (): DesignTokens | undefined => {\n // Check if local theme has color preset info\n if (localTheme?.__colorPreset) {\n const preset = getPresetWithMode(\n localTheme.__colorPreset.name as Parameters<typeof getPresetWithMode>[0],\n localTheme.__colorPreset.mode ?? 'light'\n )\n return {\n colors: preset.colors,\n textStyles: createTextStyleTokens(preset.colors.text.DEFAULT.toString()),\n spacing: defaultSpacingTokens,\n sizes: defaultSizeTokens,\n radius: defaultRadiusTokens,\n }\n }\n\n // Fall back to global tokens\n const colors = themeRegistry.getColorTokens()\n if (!colors) return undefined\n\n return {\n colors,\n textStyles: createTextStyleTokens(colors.text.DEFAULT.toString()),\n spacing: defaultSpacingTokens,\n sizes: defaultSizeTokens,\n radius: defaultRadiusTokens,\n }\n }\n\n const [tokens, setTokens] = useState<DesignTokens | undefined>(getInitialTokens())\n const [, forceUpdate] = useState(0)\n\n useEffect(() => {\n // Subscribe to theme changes (mode/preset switches)\n const unsubscribe = themeRegistry.subscribe(() => {\n // Check if local theme has preset\n if (localTheme?.__colorPreset) {\n const currentMode = themeRegistry.getColorMode()\n const preset = getPresetWithMode(\n localTheme.__colorPreset.name as Parameters<typeof getPresetWithMode>[0],\n currentMode\n )\n setTokens({\n colors: preset.colors,\n textStyles: createTextStyleTokens(preset.colors.text.DEFAULT.toString()),\n spacing: defaultSpacingTokens,\n sizes: defaultSizeTokens,\n radius: defaultRadiusTokens,\n })\n } else {\n // Use global tokens\n const colors = themeRegistry.getColorTokens()\n if (colors) {\n setTokens({\n colors,\n textStyles: createTextStyleTokens(colors.text.DEFAULT.toString()),\n spacing: defaultSpacingTokens,\n sizes: defaultSizeTokens,\n radius: defaultRadiusTokens,\n })\n }\n }\n // Force re-render when theme changes\n forceUpdate((n) => n + 1)\n })\n\n return unsubscribe\n }, [localTheme])\n\n return tokens\n}\n","/**\n * PhaserJSX UI Library\n * Provides JSX + hooks + VDOM for Phaser 3 game development\n */\nimport { registerBuiltins } from './components'\nimport './jsx-types' // Import JSX type declarations\n\n// Register built-in components (View, Text) on module load\nregisterBuiltins()\n\nexport * from './core-types'\nexport * from './effects'\nexport * from './fx'\nexport * from './hooks'\nexport * from './hooks-svg'\nexport * from './host'\nexport * from './memo'\nexport * from './theme'\nexport * from './types'\nexport * from './vdom'\n\n// Export core prop utilities\nexport {\n normalizeCornerRadius,\n normalizeEdgeInsets,\n normalizeGap,\n type CornerRadiusInsets,\n type EdgeInsets,\n type GapInsets,\n} from './core-props'\n\n// Export gesture types explicitly for better IDE support\nexport type {\n Display,\n FlexBasisValue,\n FocusEventData,\n GestureEventData,\n GestureProps,\n InputEventData,\n KeyboardEventData,\n SizeValue,\n TouchMoveState,\n} from './core-props'\n\n// Export DOM input manager utility\nexport { DOMInputElement, type DOMInputConfig } from './utils/dom-input-manager'\nexport { KeyboardInputManager, type KeyboardInputManagerConfig } from './utils/KeyboardInputManager'\n\n// Explicit export for convenience functions\nexport { mountJSX as mountComponent, type MountComponentProps, type MountProps } from './vdom'\n\n// Re-export component creators/patchers for advanced usage\nexport * from './components'\n\n// Re-export custom components for convenience\nexport * from './components/custom'\n\n// Re-export portal system\nexport * from './portal'\n\n// Animation utilities for spring-based transitions\nexport * from './animation'\n\n// Explicitly export AnimationConfig for component themes\nexport type { AnimationConfig } from './animation/spring-physics'\n\n// Color system utilities and presets\nexport * from './colors'\n\n// Design token system - semantic tokens for colors, text styles, spacing, etc.\nexport * from './design-tokens'\n\n// Tooltip system - onTooltip property types\nexport type {\n TooltipCallback,\n TooltipConfig,\n TooltipNativeAnimation,\n TooltipPosition,\n} from './tooltip/tooltip-types'\n\n// Viewport context - provides screen dimensions for vw/vh units\nexport { viewportRegistry, type ViewportSize } from './viewport-context'\n\n// Render context - isolates global state per mount point (advanced usage)\nexport { getRenderContext, type RenderContext } from './render-context'\n\n/**\n * Consumers can import JSX runtime from here:\n * import { jsx, jsxs, Fragment } from \"@number10/phaserjsx/jsx-runtime\";\n */\nexport { Fragment, jsx, jsxs } from './jsx-runtime'\n\n// Development configuration and debugging utilities\nexport { DebugLogger, DevConfig, DevPresets } from './dev-config'\n\n// SVG to texture utilities\nexport type { SVGTextureConfig } from './hooks-svg'\nexport { svgToTexture } from './utils/svg-texture'\n"],"names":["useRef","useEffect","useState","themeRegistry","setColorMode","useTheme","getPresetWithMode","alpha","createTextStyleTokens","defaultSpacingTokens","defaultSizeTokens","defaultRadiusTokens","registerBuiltins"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/fx/use-fx.ts","../src/fx/fx-creators/blur.ts","../src/fx/fx-creators/color-matrix.ts","../src/fx/fx-creators/glow.ts","../src/fx/fx-creators/pixelate.ts","../src/fx/fx-creators/shadow.ts","../src/fx/fx-creators/vignette.ts","../src/fx/fx-registry.ts","../src/fx/convenience-hooks/use-blur.ts","../src/fx/convenience-hooks/use-glow.ts","../src/fx/convenience-hooks/use-shadow.ts","../src/memo.ts","../src/colors/use-color-mode.ts","../src/colors/use-colors.ts","../src/colors/color-theme-helpers.ts","../src/colors/preset-manager.ts","../src/design-tokens/use-theme-tokens.ts","../src/index.ts"],"sourcesContent":["/**\n * Hook for applying Phaser PostFX/PreFX pipeline effects\n * Manages FX lifecycle with proper cleanup\n */\nimport { useEffect, useRef } from '../hooks'\n\n/**\n * Ref object type\n */\ntype RefObject<T> = { current: T | null }\n\n/**\n * FX configuration base type\n */\nexport interface FXConfig {\n intensity?: number\n quality?: number\n onComplete?: () => void\n}\n\n/**\n * FX type discriminator (postFX vs preFX)\n */\nexport type FXType = 'post' | 'pre'\n\n/**\n * GameObject with FX pipeline support\n */\nexport type FXCapableGameObject =\n | Phaser.GameObjects.Image\n | Phaser.GameObjects.Sprite\n | Phaser.GameObjects.Container\n | Phaser.GameObjects.Text\n | Phaser.GameObjects.TileSprite\n | Phaser.GameObjects.NineSlice\n | Phaser.GameObjects.RenderTexture\n | Phaser.GameObjects.Video\n\n/**\n * FX creator function signature\n * @param obj - GameObject with FX pipeline\n * @param config - Effect-specific configuration\n * @param type - 'post' or 'pre' FX pipeline\n * @returns Cleanup function or FX controller (or any Phaser.FX effect)\n */\nexport type FXCreatorFn<TConfig extends FXConfig = FXConfig> = (\n obj: FXCapableGameObject,\n config: TConfig,\n type?: FXType\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n) => (() => void) | Phaser.FX.Controller | any | null\n\n/**\n * Hook for applying FX to GameObject\n * @param ref - Ref to GameObject\n * @returns Object with applyFX and clearFX methods\n *\n * @example\n * ```tsx\n * const ref = useRef(null)\n * const { applyFX, clearFX } = useFX(ref)\n *\n * const handleClick = () => {\n * applyFX(createShadowFX, { offsetX: 4, offsetY: 4, blur: 8 })\n * }\n *\n * return <View ref={ref} onClick={handleClick}>Click me</View>\n * ```\n */\nexport function useFX<T extends FXCapableGameObject>(ref: RefObject<T>) {\n const activeEffectsRef = useRef<Set<(() => void) | Phaser.FX.Controller>>(new Set())\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n activeEffectsRef.current.forEach((cleanup) => {\n if (typeof cleanup === 'function') {\n cleanup()\n } else if (cleanup?.destroy) {\n cleanup.destroy()\n }\n })\n activeEffectsRef.current.clear()\n }\n }, [])\n\n const applyFX = <TConfig extends FXConfig>(\n fxCreator: FXCreatorFn<TConfig>,\n config: TConfig,\n type: FXType = 'post'\n ) => {\n const obj = ref.current\n if (!obj) {\n console.warn('[useFX] No object found in ref')\n return\n }\n\n const cleanupOrController = fxCreator(obj, config, type)\n if (cleanupOrController) {\n activeEffectsRef.current.add(cleanupOrController)\n }\n }\n\n const clearFX = () => {\n activeEffectsRef.current.forEach((cleanup) => {\n if (typeof cleanup === 'function') {\n cleanup()\n } else if (cleanup?.destroy) {\n cleanup.destroy()\n }\n })\n activeEffectsRef.current.clear()\n\n // Clear FX pipeline\n const obj = ref.current\n if (obj && 'postFX' in obj && obj.postFX) {\n obj.postFX.clear()\n }\n if (obj && 'preFX' in obj && obj.preFX) {\n obj.preFX.clear()\n }\n }\n\n return { applyFX, clearFX }\n}\n","/**\n * Blur FX creator (Box & Gaussian Blur)\n */\nimport type { FXConfig, FXCreatorFn } from '../use-fx'\n\n/**\n * Blur FX configuration\n */\nexport interface BlurFXConfig extends FXConfig {\n /** The quality of the blur effect. Can be either 0 for Low Quality, 1 for Medium Quality or 2 for High Quality */\n quality?: number\n /** The horizontal offset of the blur effect */\n x?: number\n /** The vertical offset of the blur effect */\n y?: number\n /** The strength of the blur effect */\n strength?: number\n /** The color of the blur, as a hex value */\n color?: number\n /** The number of steps to run the blur effect for. This value should always be an integer */\n steps?: number\n}\n\n/**\n * Create blur FX\n * @param obj - GameObject\n * @param config - Blur configuration\n * @param type - 'post' or 'pre' FX\n * @returns Blur controller\n *\n * @example\n * ```tsx\n * applyFX(createBlurFX, {\n * quality: 1,\n * x: 4,\n * y: 4,\n * strength: 2\n * })\n * ```\n */\nexport const createBlurFX: FXCreatorFn<BlurFXConfig> = (obj, config, type = 'post') => {\n const { quality = 0, x = 2, y = 2, strength = 1, color = 0xffffff, steps = 4 } = config\n\n const pipeline = type === 'post' ? obj.postFX : obj.preFX\n if (!pipeline) {\n console.warn('[createBlurFX] FX pipeline not available on this GameObject')\n return null\n }\n\n // Phaser API: addBlur(quality, x, y, strength, color, steps)\n const blur = pipeline.addBlur(quality, x, y, strength, color, steps)\n\n return blur\n}\n","/**\n * Color Matrix FX creator (Grayscale, Sepia, Negative, etc.)\n */\nimport type { FXConfig, FXCreatorFn } from '../use-fx'\n\n/**\n * Color Matrix effect types\n */\nexport type ColorMatrixEffect =\n | 'grayscale'\n | 'sepia'\n | 'negative'\n | 'blackWhite'\n | 'brown'\n | 'kodachrome'\n | 'technicolor'\n | 'polaroid'\n\n/**\n * Color Matrix FX configuration\n */\nexport interface ColorMatrixFXConfig extends FXConfig {\n /** Effect type */\n effect?: ColorMatrixEffect\n /** Effect amount (0-1, for effects that support it like grayscale) */\n amount?: number\n}\n\n/**\n * Create color matrix FX\n * @param obj - GameObject\n * @param config - Color matrix configuration\n * @param type - 'post' or 'pre' FX\n * @returns Color matrix controller\n *\n * @example\n * ```tsx\n * applyFX(createColorMatrixFX, {\n * effect: 'grayscale',\n * amount: 1\n * })\n * ```\n */\nexport const createColorMatrixFX: FXCreatorFn<ColorMatrixFXConfig> = (\n obj,\n config,\n type = 'post'\n) => {\n const { effect = 'grayscale', amount = 1 } = config\n\n const pipeline = type === 'post' ? obj.postFX : obj.preFX\n if (!pipeline) {\n console.warn('[createColorMatrixFX] FX pipeline not available on this GameObject')\n return null\n }\n\n const colorMatrix = pipeline.addColorMatrix()\n\n // Apply the selected effect\n switch (effect) {\n case 'grayscale':\n colorMatrix.grayscale(amount)\n break\n case 'sepia':\n colorMatrix.sepia()\n break\n case 'negative':\n colorMatrix.negative()\n break\n case 'blackWhite':\n colorMatrix.blackWhite()\n break\n case 'brown':\n colorMatrix.brown()\n break\n case 'kodachrome':\n colorMatrix.kodachrome()\n break\n case 'technicolor':\n colorMatrix.technicolor()\n break\n case 'polaroid':\n colorMatrix.polaroid()\n break\n }\n\n return colorMatrix\n}\n","/**\n * Glow FX creator (Outer Glow)\n */\nimport type { FXConfig, FXCreatorFn } from '../use-fx'\n\n/**\n * Glow FX configuration\n */\nexport interface GlowFXConfig extends FXConfig {\n /** Glow color (hex number) */\n color?: number\n /** The strength of the glow outward from the edge */\n outerStrength?: number\n /** The strength of the glow inward from the edge */\n innerStrength?: number\n /** If true, only the glow is drawn, not the texture itself */\n knockout?: boolean\n /** Sets the quality of this Glow effect (PostFX only, cannot be changed post-creation) */\n quality?: number\n /** Sets the distance of this Glow effect (PostFX only, cannot be changed post-creation) */\n distance?: number\n}\n\n/**\n * Create glow FX\n * @param obj - GameObject\n * @param config - Glow configuration\n * @param type - 'post' or 'pre' FX\n * @returns Glow controller\n *\n * @example\n * ```tsx\n * applyFX(createGlowFX, {\n * color: 0xff6600,\n * outerStrength: 6,\n * innerStrength: 2\n * })\n * ```\n */\nexport const createGlowFX: FXCreatorFn<GlowFXConfig> = (obj, config, type = 'post') => {\n const {\n color = 0xffffff,\n outerStrength = 4,\n innerStrength = 0,\n knockout = false,\n quality = 0.1,\n distance = 10,\n } = config\n\n const pipeline = type === 'post' ? obj.postFX : obj.preFX\n if (!pipeline) {\n console.warn('[createGlowFX] FX pipeline not available on this GameObject')\n return null\n }\n\n // Phaser API: addGlow(color, outerStrength, innerStrength, knockout, quality, distance)\n const glow = pipeline.addGlow(color, outerStrength, innerStrength, knockout, quality, distance)\n\n return glow\n}\n","/**\n * Pixelate FX creator\n */\nimport type { FXConfig, FXCreatorFn } from '../use-fx'\n\n/**\n * Pixelate FX configuration\n */\nexport interface PixelateFXConfig extends FXConfig {\n /** The amount of pixelation to apply */\n amount?: number\n}\n\n/**\n * Create pixelate FX\n * @param obj - GameObject\n * @param config - Pixelate configuration\n * @param type - 'post' or 'pre' FX\n * @returns Pixelate controller\n *\n * @example\n * ```tsx\n * applyFX(createPixelateFX, {\n * amount: 8\n * })\n * ```\n */\nexport const createPixelateFX: FXCreatorFn<PixelateFXConfig> = (obj, config, type = 'post') => {\n const { amount = 1 } = config\n\n const pipeline = type === 'post' ? obj.postFX : obj.preFX\n if (!pipeline) {\n console.warn('[createPixelateFX] FX pipeline not available on this GameObject')\n return null\n }\n\n // Phaser API: addPixelate(amount)\n const pixelate = pipeline.addPixelate(amount)\n\n return pixelate\n}\n","/**\n * Shadow FX creator\n *\n * The shadow effect creates the illusion of depth by adding darker, offset silhouettes\n * beneath game objects, enhancing visual appeal and immersion.\n */\nimport type { FXConfig, FXCreatorFn } from '../use-fx'\n\n/**\n * Shadow FX configuration\n * Maps to Phaser's addShadow(x, y, decay, power, color, samples, intensity)\n */\nexport interface ShadowFXConfig extends FXConfig {\n /** Horizontal offset of the shadow effect (default: 0) */\n x?: number\n /** Vertical offset of the shadow effect (default: 0) */\n y?: number\n /** Amount of decay for shadow effect (default: 0.1) */\n decay?: number\n /** Power of the shadow effect (default: 1) */\n power?: number\n /** Color of the shadow (default: 0x000000) */\n color?: number\n /** Number of samples (1-12, higher = better quality, default: 6) */\n samples?: number\n /** Intensity of the shadow effect (default: 1) */\n intensity?: number\n}\n\n/**\n * Create shadow FX\n * @param obj - GameObject\n * @param config - Shadow configuration\n * @param type - 'post' or 'pre' FX\n * @returns Shadow controller\n *\n * @example\n * ```tsx\n * applyFX(createShadowFX, {\n * x: 0,\n * y: 0,\n * decay: 0.1,\n * power: 1,\n * color: 0x000000,\n * samples: 6,\n * intensity: 1\n * })\n * ```\n */\nexport const createShadowFX: FXCreatorFn<ShadowFXConfig> = (obj, config, type = 'post') => {\n const {\n x = 0,\n y = 1,\n decay = 0.05,\n power = 1,\n color = 0x000000,\n samples = 6,\n intensity = 1,\n } = config\n\n const pipeline = type === 'post' ? obj.postFX : obj.preFX\n if (!pipeline) {\n console.warn('[createShadowFX] FX pipeline not available on this GameObject')\n return null\n }\n\n // Phaser API: addShadow(x, y, decay, power, color, samples, intensity)\n const shadow = pipeline.addShadow(x, y, decay, power, color, samples, intensity)\n\n return shadow\n}\n","/**\n * Vignette FX creator\n */\nimport type { FXConfig, FXCreatorFn } from '../use-fx'\n\n/**\n * Vignette FX configuration\n */\nexport interface VignetteFXConfig extends FXConfig {\n /** The horizontal offset of the vignette effect. This value is normalized to the range 0 to 1 */\n x?: number\n /** The vertical offset of the vignette effect. This value is normalized to the range 0 to 1 */\n y?: number\n /** The radius of the vignette effect. This value is normalized to the range 0 to 1 */\n radius?: number\n /** The strength of the vignette effect */\n strength?: number\n}\n\n/**\n * Create vignette FX\n * @param obj - GameObject\n * @param config - Vignette configuration\n * @param type - 'post' or 'pre' FX\n * @returns Vignette controller\n *\n * @example\n * ```tsx\n * applyFX(createVignetteFX, {\n * x: 0.5,\n * y: 0.5,\n * radius: 0.5,\n * strength: 0.7\n * })\n * ```\n */\nexport const createVignetteFX: FXCreatorFn<VignetteFXConfig> = (obj, config, type = 'post') => {\n const { strength = 0.5, radius = 0.5, x = 0.5, y = 0.5 } = config\n\n const pipeline = type === 'post' ? obj.postFX : obj.preFX\n if (!pipeline) {\n console.warn('[createVignetteFX] FX pipeline not available on this GameObject')\n return null\n }\n\n // Phaser Vignette: addVignette(x, y, radius, strength)\n const vignette = pipeline.addVignette(x, y, radius, strength)\n\n return vignette\n}\n","/**\n * FX Registry - string-based FX lookup\n * Similar to effect-registry.ts for animation effects\n */\nimport {\n createBlurFX,\n createColorMatrixFX,\n createGlowFX,\n createPixelateFX,\n createShadowFX,\n createVignetteFX,\n type BlurFXConfig,\n type ColorMatrixFXConfig,\n type GlowFXConfig,\n type PixelateFXConfig,\n type ShadowFXConfig,\n type VignetteFXConfig,\n} from './fx-creators'\nimport type { FXConfig, FXCreatorFn } from './use-fx'\n\n/**\n * Built-in FX names\n */\nexport type BuiltInFXName =\n | 'shadow'\n | 'glow'\n | 'blur'\n | 'pixelate'\n | 'vignette'\n | 'grayscale'\n | 'sepia'\n | 'negative'\n | 'blackWhite'\n | 'brown'\n | 'kodachrome'\n | 'technicolor'\n | 'polaroid'\n\n/**\n * Extension point for custom FX (declaration merging)\n * @example\n * ```typescript\n * declare module '@number10/phaserjsx/fx' {\n * interface FXNameExtensions {\n * myCustomFX: 'myCustomFX'\n * }\n * }\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface FXNameExtensions {}\n\n/**\n * All available FX names (built-in + extensions)\n */\nexport type FXName =\n | BuiltInFXName\n | (keyof FXNameExtensions extends never ? never : keyof FXNameExtensions)\n\n/**\n * FX definition with name and config\n */\nexport interface FXDefinition {\n name: FXName\n config?: FXConfig\n}\n\n/**\n * FX Registry mapping names to creator functions\n */\nexport const FX_REGISTRY: Record<BuiltInFXName, FXCreatorFn> = {\n shadow: createShadowFX,\n glow: createGlowFX,\n blur: createBlurFX,\n pixelate: createPixelateFX,\n vignette: createVignetteFX,\n grayscale: (obj, config, type) =>\n createColorMatrixFX(obj, { ...config, effect: 'grayscale' }, type),\n sepia: (obj, config, type) => createColorMatrixFX(obj, { ...config, effect: 'sepia' }, type),\n negative: (obj, config, type) =>\n createColorMatrixFX(obj, { ...config, effect: 'negative' }, type),\n blackWhite: (obj, config, type) =>\n createColorMatrixFX(obj, { ...config, effect: 'blackWhite' }, type),\n brown: (obj, config, type) => createColorMatrixFX(obj, { ...config, effect: 'brown' }, type),\n kodachrome: (obj, config, type) =>\n createColorMatrixFX(obj, { ...config, effect: 'kodachrome' }, type),\n technicolor: (obj, config, type) =>\n createColorMatrixFX(obj, { ...config, effect: 'technicolor' }, type),\n polaroid: (obj, config, type) =>\n createColorMatrixFX(obj, { ...config, effect: 'polaroid' }, type),\n}\n\n/**\n * Default FX (none)\n */\nexport const DEFAULT_FX: FXName = 'grayscale'\n\n/**\n * Resolve FX by name or function\n * @param fxOrName - FX name string or creator function\n * @returns FX creator function or null\n */\nexport function resolveFX(fxOrName: FXName | FXCreatorFn): FXCreatorFn | null {\n if (typeof fxOrName === 'function') {\n return fxOrName\n }\n return FX_REGISTRY[fxOrName as BuiltInFXName] ?? null\n}\n\n/**\n * Apply FX by name (helper function)\n * @param applyFXFn - applyFX function from useFX hook\n * @param fxName - FX name\n * @param config - FX config\n *\n * @example\n * ```tsx\n * const { applyFX } = useFX(ref)\n * applyFXByName(applyFX, 'shadow', { offsetX: 4, offsetY: 4, blur: 8 })\n * ```\n */\nexport function applyFXByName(\n applyFXFn: ReturnType<typeof import('./use-fx').useFX>['applyFX'],\n fxName: FXName,\n config: FXConfig = {}\n) {\n const creator = resolveFX(fxName)\n if (creator) {\n applyFXFn(creator, config)\n } else {\n console.warn(`[applyFXByName] FX \"${fxName}\" not found in registry`)\n }\n}\n\n// Re-export config types for convenience\nexport type {\n BlurFXConfig,\n ColorMatrixFXConfig,\n GlowFXConfig,\n PixelateFXConfig,\n ShadowFXConfig,\n VignetteFXConfig,\n}\n","/**\n * Convenience hook for automatic blur FX\n * Applies blur on mount and updates on config changes\n */\nimport { useEffect } from '../../hooks'\nimport { createBlurFX, type BlurFXConfig } from '../fx-creators/blur'\nimport { useFX } from '../use-fx'\n\n/**\n * Hook for automatic blur FX\n * @param ref - GameObject ref\n * @param config - Blur config (updates reactively)\n * @returns FX controls\n *\n * @example\n * ```tsx\n * const ref = useRef(null)\n * useBlur(ref, { strength: 8, steps: 4 })\n *\n * return <View ref={ref}>Content</View>\n * ```\n */\nexport function useBlur(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ref: { current: any },\n config: BlurFXConfig = {}\n): { clearFX: () => void } {\n const { applyFX, clearFX } = useFX(ref)\n\n useEffect(() => {\n if (!ref.current) return\n\n // Clear previous FX\n clearFX()\n\n // Apply new blur\n applyFX(createBlurFX, config)\n\n return () => clearFX()\n }, [ref, config, applyFX, clearFX])\n\n return { clearFX }\n}\n","/**\n * Convenience hook for automatic glow FX\n * Applies glow on mount and updates on config changes\n */\nimport { useEffect } from '../../hooks'\nimport { createGlowFX, type GlowFXConfig } from '../fx-creators/glow'\nimport { useFX } from '../use-fx'\n\n/**\n * Hook for automatic glow FX\n * @param ref - GameObject ref\n * @param config - Glow config (updates reactively)\n * @returns FX controls\n *\n * @example\n * ```tsx\n * const ref = useRef(null)\n * useGlow(ref, { color: 0xff6600, outerStrength: 6, innerStrength: 2 })\n *\n * return <View ref={ref}>Content</View>\n * ```\n */\nexport function useGlow(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ref: { current: any },\n config: GlowFXConfig = {}\n): { clearFX: () => void } {\n const { applyFX, clearFX } = useFX(ref)\n\n useEffect(() => {\n if (!ref.current) return\n\n // Clear previous FX\n clearFX()\n\n // Apply new glow\n applyFX(createGlowFX, config)\n\n return () => clearFX()\n }, [ref, config, applyFX, clearFX])\n\n return { clearFX }\n}\n","/**\n * Convenience hook for automatic shadow FX\n * Applies shadow on mount and updates on config changes\n */\nimport { useEffect } from '../../hooks'\nimport { createShadowFX, type ShadowFXConfig } from '../fx-creators/shadow'\nimport { useFX } from '../use-fx'\n\n/**\n * Hook for automatic shadow FX\n * @param ref - GameObject ref\n * @param config - Shadow config (updates reactively)\n * @returns FX controls\n *\n * @example\n * ```tsx\n * const ref = useRef(null)\n * useShadow(ref, { x: 4, y: 4, decay: 0.1 })\n *\n * return <View ref={ref}>Content</View>\n * ```\n */\nexport function useShadow(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ref: { current: any },\n config: ShadowFXConfig = {}\n): { clearFX: () => void } {\n const { applyFX, clearFX } = useFX(ref)\n\n useEffect(() => {\n if (!ref.current) return\n\n // Clear previous FX\n clearFX()\n\n // Apply new shadow\n applyFX(createShadowFX, config)\n\n return () => clearFX()\n }, [ref, config, applyFX, clearFX])\n\n return { clearFX }\n}\n","/**\n * Component memoization utilities\n * Similar to React.memo() - prevents re-renders when props haven't changed\n */\nimport type { VNode } from './hooks'\n\n/**\n * Safely sets __memo on a VNode, handling frozen/sealed objects from bundlers\n * @param vnode - VNode to set __memo on\n * @param value - Memoization value\n * @returns Original VNode if extensible, or shallow copy with __memo\n */\nfunction setMemoSafe<T extends VNode>(vnode: T, value: boolean): T {\n if (Object.isExtensible(vnode)) {\n vnode.__memo = value\n return vnode\n }\n // VNode is frozen - create shallow copy\n return { ...vnode, __memo: value } as T\n}\n\n/**\n * Marks a component to skip memoization (always re-render on prop changes)\n * Use when component has side effects or needs to re-render every time\n *\n * @example\n * ```tsx\n * function AlwaysUpdate({ value }) {\n * console.log('Rendering with:', value)\n * return <Text text={value} />\n * }\n *\n * // Disable memoization\n * <AlwaysUpdate value={counter} __memo={false} />\n * ```\n *\n * @param vnode - VNode to mark\n * @returns Same VNode with memoization disabled (may be a copy if frozen)\n */\nexport function noMemo<T extends VNode>(vnode: T): T {\n return setMemoSafe(vnode, false)\n}\n\n/**\n * Explicitly enable memoization for a component (default behavior)\n * This is the default - you don't need to call this unless you want to be explicit\n *\n * @param vnode - VNode to mark\n * @returns Same VNode with memoization enabled (may be a copy if frozen)\n */\nexport function memo<T extends VNode>(vnode: T): T {\n return setMemoSafe(vnode, true)\n}\n","/**\n * Color mode management for dynamic theme switching\n */\nimport { useEffect, useState } from '../hooks'\nimport { themeRegistry } from '../theme'\n\n/**\n * Hook to manage color mode (light/dark) dynamically\n * @returns Object with current mode, toggle function, and setter\n * @example\n * ```typescript\n * function ThemeToggle() {\n * const { colorMode, toggleColorMode } = useColorMode()\n *\n * return (\n * <Button onClick={toggleColorMode}>\n * {colorMode === 'light' ? 'Dark' : 'Light'} Mode\n * </Button>\n * )\n * }\n * ```\n */\nexport function useColorMode(): {\n colorMode: 'light' | 'dark'\n setColorMode: (mode: 'light' | 'dark') => void\n toggleColorMode: () => void\n} {\n const [colorMode, setColorModeState] = useState<'light' | 'dark'>(themeRegistry.getColorMode())\n\n useEffect(() => {\n // Subscribe to theme registry changes\n const unsubscribe = themeRegistry.subscribe(() => {\n setColorModeState(themeRegistry.getColorMode())\n })\n\n return unsubscribe\n }, [])\n\n const setColorMode = (mode: 'light' | 'dark') => {\n themeRegistry.setColorMode(mode)\n }\n\n const toggleColorMode = () => {\n const newMode = colorMode === 'light' ? 'dark' : 'light'\n setColorMode(newMode)\n }\n\n return {\n colorMode,\n setColorMode,\n toggleColorMode,\n }\n}\n","/**\n * Color system hooks for component usage\n */\nimport { useEffect, useState, useTheme } from '../hooks'\nimport { themeRegistry } from '../theme'\nimport { getPresetWithMode } from './color-presets'\nimport type { ColorTokens } from './color-types'\n\n/**\n * Hook to access color tokens from theme context\n * Automatically updates when color mode or preset changes\n * @returns Current ColorTokens or undefined\n * @deprecated Use `useThemeTokens()` instead for access to colors, text styles, spacing, and more\n * @example\n * ```typescript\n * // Old way (deprecated):\n * const colors = useColors()\n *\n * // New way:\n * const tokens = useThemeTokens()\n * const colors = tokens?.colors\n *\n * // Access text styles, spacing, etc.:\n * <Text style={tokens.textStyles.DEFAULT} />\n * <View padding={tokens.spacing.lg} />\n * ```\n */\nexport function useColors(): ColorTokens | undefined {\n const localTheme = useTheme()\n\n // Initialize colors state\n const getInitialColors = (): ColorTokens | undefined => {\n // Check if local theme has color preset info\n if (localTheme?.__colorPreset) {\n const preset = getPresetWithMode(\n localTheme.__colorPreset.name as Parameters<typeof getPresetWithMode>[0],\n localTheme.__colorPreset.mode ?? 'light'\n )\n return preset.colors\n }\n\n // Fall back to global color tokens\n return themeRegistry.getColorTokens()\n }\n\n const [colors, setColors] = useState<ColorTokens | undefined>(getInitialColors())\n const [, forceUpdate] = useState(0)\n\n useEffect(() => {\n // Subscribe to theme changes (mode/preset switches)\n const unsubscribe = themeRegistry.subscribe(() => {\n // Check if local theme has preset\n if (localTheme?.__colorPreset) {\n const currentMode = themeRegistry.getColorMode()\n const preset = getPresetWithMode(\n localTheme.__colorPreset.name as Parameters<typeof getPresetWithMode>[0],\n currentMode\n )\n setColors(preset.colors)\n } else {\n // Use global tokens\n setColors(themeRegistry.getColorTokens())\n }\n // Force re-render when theme changes\n forceUpdate((n) => n + 1)\n })\n\n return unsubscribe\n }, [localTheme])\n\n return colors\n}\n\n/**\n * Hook to subscribe to theme changes without accessing colors\n * Use this in parent components that don't need colors themselves\n * but want to ensure children re-render when theme changes\n *\n * Note: Since useColors() now triggers re-renders automatically,\n * this hook is mainly useful if you don't need the colors themselves\n * but still want to react to theme changes.\n *\n * @example\n * ```typescript\n * function ParentComponent() {\n * useThemeSubscription() // Children will re-render on theme changes\n * return <ChildThatUsesColors />\n * }\n * ```\n */\nexport function useThemeSubscription(): void {\n const [, forceUpdate] = useState(0)\n\n useEffect(() => {\n const unsubscribe = themeRegistry.subscribe(() => {\n forceUpdate((n) => n + 1)\n })\n return unsubscribe\n }, [])\n}\n","/**\n * Helper functions for color system integration with theme\n */\nimport type { ColorTokens } from './color-types'\nimport { alpha } from './color-utils'\n\n/**\n * Convert ColorTokens to a theme-compatible object\n * Maps semantic color names to Phaser number format for View/Button components\n * @param colors - ColorTokens to convert\n * @returns Object with backgroundColor, borderColor, etc.\n * @example\n * ```typescript\n * const colors = getPreset('oceanBlue').colors\n * const buttonTheme = {\n * ...colorsToTheme(colors, 'primary'),\n * padding: 8,\n * }\n * // Returns: { backgroundColor: 0x2196f3, borderColor: 0x... }\n * ```\n */\nexport function colorsToTheme(\n colors: ColorTokens,\n colorKey: keyof Pick<\n ColorTokens,\n 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info'\n >,\n options: {\n /** Which shade to use for background (default: 'DEFAULT') */\n backgroundShade?: 'lightest' | 'light' | 'medium' | 'dark' | 'darkest' | 'DEFAULT'\n /** Which shade to use for border (default: 'dark') */\n borderShade?: 'lightest' | 'light' | 'medium' | 'dark' | 'darkest' | 'DEFAULT'\n /** Include border color (default: true) */\n includeBorder?: boolean\n } = {}\n): {\n backgroundColor: number\n borderColor?: number\n} {\n const { backgroundShade = 'DEFAULT', borderShade = 'dark', includeBorder = true } = options\n\n const result: { backgroundColor: number; borderColor?: number } = {\n backgroundColor: colors[colorKey][backgroundShade].toNumber(),\n }\n\n if (includeBorder) {\n result.borderColor = colors[colorKey][borderShade].toNumber()\n }\n\n return result\n}\n\n/**\n * Get text color from ColorTokens as hex string for Phaser Text style\n * @param colors - ColorTokens to use\n * @param shade - Which text shade to use (default: 'DEFAULT')\n * @param alphaValue - Optional alpha value (0-1)\n * @returns Hex string or rgba string for Text style\n * @example\n * ```typescript\n * const colors = getPreset('oceanBlue').colors\n * const textStyle = {\n * color: getTextColor(colors),\n * fontSize: '18px'\n * }\n * ```\n */\nexport function getTextColor(\n colors: ColorTokens,\n shade: 'lightest' | 'light' | 'medium' | 'dark' | 'darkest' | 'DEFAULT' = 'DEFAULT',\n alphaValue?: number\n): string {\n const color = colors.text[shade]\n return alphaValue !== undefined ? alpha(color.toNumber(), alphaValue) : color.toString()\n}\n\n/**\n * Get background color from ColorTokens\n * @param colors - ColorTokens to use\n * @param shade - Which shade to use (default: 'DEFAULT')\n * @returns Phaser color number\n */\nexport function getBackgroundColor(\n colors: ColorTokens,\n shade: 'lightest' | 'light' | 'medium' | 'dark' | 'darkest' | 'DEFAULT' = 'DEFAULT'\n): number {\n return colors.background[shade].toNumber()\n}\n\n/**\n * Get surface color from ColorTokens\n * @param colors - ColorTokens to use\n * @param shade - Which shade to use (default: 'DEFAULT')\n * @returns Phaser color number\n */\nexport function getSurfaceColor(\n colors: ColorTokens,\n shade: 'lightest' | 'light' | 'medium' | 'dark' | 'darkest' | 'DEFAULT' = 'DEFAULT'\n): number {\n return colors.surface[shade].toNumber()\n}\n\n/**\n * Get border color from ColorTokens\n * @param colors - ColorTokens to use\n * @param shade - Which shade to use (default: 'DEFAULT')\n * @returns Phaser color number\n */\nexport function getBorderColor(\n colors: ColorTokens,\n shade: 'lightest' | 'light' | 'medium' | 'dark' | 'darkest' | 'DEFAULT' = 'DEFAULT'\n): number {\n return colors.border[shade].toNumber()\n}\n","/**\n * Dynamic color preset management\n */\nimport { themeRegistry } from '../theme'\nimport type { PresetName } from './color-presets'\nimport { getPresetWithMode } from './color-presets'\n\n/**\n * Set the active color preset globally\n * Applies the preset with the current color mode and updates all components\n * Triggers complete remount of all active mountJSX instances\n * @param presetName - Name of the preset to apply\n * @param colorMode - Optional color mode to apply together with the preset\n * @example\n * ```typescript\n * // Switch to forest green theme\n * setColorPreset('forestGreen')\n *\n * // Apply preset and force dark mode in one go\n * setColorPreset('midnight', 'dark')\n *\n * // Current mode (light/dark) is preserved\n * ```\n */\nexport function setColorPreset(presetName: PresetName, colorMode?: 'light' | 'dark'): void {\n const targetMode = colorMode ?? themeRegistry.getColorMode()\n const preset = getPresetWithMode(presetName, targetMode)\n\n // Update color tokens WITHOUT notifying listeners\n // We skip listener notifications to prevent unnecessary re-renders\n themeRegistry.setColorTokens(preset.colors)\n themeRegistry.setCurrentPresetName(presetName, true) // true = skip notify\n\n // If caller asked for a specific mode, update it here so we only remount once\n if (colorMode && themeRegistry.getColorMode() !== colorMode) {\n themeRegistry.setColorMode(colorMode)\n return\n }\n\n // Trigger complete remount of all VDOM trees to apply new preset\n // Using setTimeout(0) to ensure all synchronous state updates complete first\n setTimeout(() => {\n // Import remountAll lazily to avoid circular dependency\n import('../vdom').then(({ remountAll }) => {\n remountAll()\n })\n }, 0)\n}\n\n/**\n * Get the currently active preset name\n * @returns Current preset name or undefined\n */\nexport function getCurrentPreset(): string | undefined {\n return themeRegistry.getCurrentPresetName()\n}\n\n/**\n * Set the active color mode globally (without changing the preset)\n * @param mode - Color mode to apply\n */\nexport function setColorMode(mode: 'light' | 'dark'): void {\n themeRegistry.setColorMode(mode)\n}\n\n/**\n * Get all available preset names\n * @returns Array of preset names\n * @example\n * ```typescript\n * const presets = getAvailablePresets() // ['oceanBlue', 'forestGreen', 'midnight']\n * ```\n */\nexport function getAvailablePresets(): PresetName[] {\n return ['oceanBlue', 'forestGreen', 'midnight']\n}\n","/**\n * Hook to access complete design token system\n * Combines colors with text styles, spacing, sizes, and radius tokens\n */\nimport { getPresetWithMode } from '../colors/color-presets'\nimport { useEffect, useState, useTheme } from '../hooks'\nimport { themeRegistry } from '../theme'\nimport {\n createTextStyleTokens,\n defaultRadiusTokens,\n defaultSizeTokens,\n defaultSpacingTokens,\n} from './design-token-presets'\nimport type { DesignTokens } from './design-token-types'\n\n/**\n * Hook to access complete design token system from theme context\n * Provides colors, text styles, spacing, sizes, and radius tokens\n * Automatically updates when color mode or preset changes\n * @returns Current DesignTokens or undefined\n * @example\n * ```typescript\n * function MyComponent() {\n * const tokens = useThemeTokens()\n *\n * if (!tokens) return null\n *\n * return (\n * <View\n * backgroundColor={tokens.colors.surface.DEFAULT}\n * padding={tokens.spacing.lg}\n * cornerRadius={tokens.radius.md}\n * >\n * <Text text=\"Title\" style={tokens.textStyles.title} />\n * <Text text=\"Body text\" style={tokens.textStyles.DEFAULT} />\n * </View>\n * )\n * }\n * ```\n */\nexport function useThemeTokens(): DesignTokens | undefined {\n const localTheme = useTheme()\n\n // Initialize design tokens state\n const getInitialTokens = (): DesignTokens | undefined => {\n // Check if local theme has color preset info\n if (localTheme?.__colorPreset) {\n const preset = getPresetWithMode(\n localTheme.__colorPreset.name as Parameters<typeof getPresetWithMode>[0],\n localTheme.__colorPreset.mode ?? 'light'\n )\n return {\n colors: preset.colors,\n textStyles: createTextStyleTokens(preset.colors.text.DEFAULT.toString()),\n spacing: defaultSpacingTokens,\n sizes: defaultSizeTokens,\n radius: defaultRadiusTokens,\n }\n }\n\n // Fall back to global tokens\n const colors = themeRegistry.getColorTokens()\n if (!colors) return undefined\n\n return {\n colors,\n textStyles: createTextStyleTokens(colors.text.DEFAULT.toString()),\n spacing: defaultSpacingTokens,\n sizes: defaultSizeTokens,\n radius: defaultRadiusTokens,\n }\n }\n\n const [tokens, setTokens] = useState<DesignTokens | undefined>(getInitialTokens())\n const [, forceUpdate] = useState(0)\n\n useEffect(() => {\n // Subscribe to theme changes (mode/preset switches)\n const unsubscribe = themeRegistry.subscribe(() => {\n // Check if local theme has preset\n if (localTheme?.__colorPreset) {\n const currentMode = themeRegistry.getColorMode()\n const preset = getPresetWithMode(\n localTheme.__colorPreset.name as Parameters<typeof getPresetWithMode>[0],\n currentMode\n )\n setTokens({\n colors: preset.colors,\n textStyles: createTextStyleTokens(preset.colors.text.DEFAULT.toString()),\n spacing: defaultSpacingTokens,\n sizes: defaultSizeTokens,\n radius: defaultRadiusTokens,\n })\n } else {\n // Use global tokens\n const colors = themeRegistry.getColorTokens()\n if (colors) {\n setTokens({\n colors,\n textStyles: createTextStyleTokens(colors.text.DEFAULT.toString()),\n spacing: defaultSpacingTokens,\n sizes: defaultSizeTokens,\n radius: defaultRadiusTokens,\n })\n }\n }\n // Force re-render when theme changes\n forceUpdate((n) => n + 1)\n })\n\n return unsubscribe\n }, [localTheme])\n\n return tokens\n}\n","/**\n * PhaserJSX UI Library\n * Provides JSX + hooks + VDOM for Phaser 3 game development\n */\nimport { registerBuiltins } from './components'\nimport './jsx-types' // Import JSX type declarations\n\n// Register built-in components (View, Text) on module load\nregisterBuiltins()\n\nexport * from './core-types'\nexport * from './effects'\nexport * from './fx'\nexport * from './hooks'\nexport * from './hooks-svg'\nexport * from './host'\nexport * from './memo'\nexport * from './theme'\nexport * from './types'\nexport * from './vdom'\n\n// Export core prop utilities\nexport {\n normalizeCornerRadius,\n normalizeEdgeInsets,\n normalizeGap,\n type CornerRadiusInsets,\n type EdgeInsets,\n type GapInsets,\n} from './core-props'\n\n// Export gesture types explicitly for better IDE support\nexport type {\n Display,\n FlexBasisValue,\n FocusEventData,\n GestureEventData,\n GestureProps,\n InputEventData,\n KeyboardEventData,\n SizeValue,\n TouchMoveState,\n} from './core-props'\n\n// Export DOM input manager utility\nexport { DOMInputElement, type DOMInputConfig } from './utils/dom-input-manager'\nexport { KeyboardInputManager, type KeyboardInputManagerConfig } from './utils/KeyboardInputManager'\n\n// Explicit export for convenience functions\nexport { mountJSX as mountComponent, type MountComponentProps, type MountProps } from './vdom'\n\n// Re-export component creators/patchers for advanced usage\nexport * from './components'\n\n// Re-export custom components for convenience\nexport * from './components/custom'\n\n// Re-export portal system\nexport * from './portal'\n\n// Animation utilities for spring-based transitions\nexport * from './animation'\n\n// Explicitly export AnimationConfig for component themes\nexport type { AnimationConfig } from './animation/spring-physics'\n\n// Color system utilities and presets\nexport * from './colors'\n\n// Design token system - semantic tokens for colors, text styles, spacing, etc.\nexport * from './design-tokens'\n\n// Tooltip system - onTooltip property types\nexport type {\n TooltipCallback,\n TooltipConfig,\n TooltipNativeAnimation,\n TooltipPosition,\n} from './tooltip/tooltip-types'\n\n// Viewport context - provides screen dimensions for vw/vh units\nexport { viewportRegistry, type ViewportSize } from './viewport-context'\n\n// Render context - isolates global state per mount point (advanced usage)\nexport { getRenderContext, type RenderContext } from './render-context'\n\n/**\n * Consumers can import JSX runtime from here:\n * import { jsx, jsxs, Fragment } from \"@number10/phaserjsx/jsx-runtime\";\n */\nexport { Fragment, jsx, jsxs } from './jsx-runtime'\n\n// Development configuration and debugging utilities\nexport { DebugLogger, DevConfig, DevPresets } from './dev-config'\n\n// SVG to texture utilities\nexport type { SVGTextureConfig } from './hooks-svg'\nexport { svgToTexture } from './utils/svg-texture'\n"],"names":["useRef","useEffect","useState","themeRegistry","setColorMode","useTheme","getPresetWithMode","alpha","createTextStyleTokens","defaultSpacingTokens","defaultSizeTokens","defaultRadiusTokens","registerBuiltins"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { p as useRef, q as useEffect, r as useState, t as themeRegistry, s as useTheme, v as getPresetWithMode, w as alpha, x as defaultRadiusTokens, y as defaultSizeTokens, z as defaultSpacingTokens, E as createTextStyleTokens, F as registerBuiltins } from "./TransformOriginView-CiFiQcku.js";
2
- import { A, a, B, C, b, $, bb, K, V, X, Y, D, c, d, a0, aR, bg, I, f, L, M, N, g, P, R, h, m, i, bc, S, k, l, n, bd, aQ, aT, aS, T, o, aU, W, b8, bt, a1, bu, j, a3, a4, aG, aM, a5, a6, a7, a8, a9, e, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, bq, aJ, ak, al, am, an, bl, bm, bB, aH, ax, br, bv, bw, bs, ao, bx, U, aK, b3, b4, bn, bh, aF, b1, b2, b9, bo, bp, aI, by, aN, O, O as O2, aZ, a_, aD, G, H, J, bi, bj, bz, aP, b7, bA, aE, aA, ay, az, aL, a2, bk, au, av, a$, b0, Z, aV, aW, b5, b6, aO, ba, as, aq, _, u, ar, aw, aB, aC, at, be, bf, aX, aY, Q, ap } from "./TransformOriginView-CiFiQcku.js";
1
+ import { p as useRef, q as useEffect, r as useState, t as themeRegistry, s as useTheme, v as getPresetWithMode, w as alpha, x as defaultRadiusTokens, y as defaultSizeTokens, z as defaultSpacingTokens, E as createTextStyleTokens, F as registerBuiltins } from "./TransformOriginView-CzVjS16F.js";
2
+ import { A, a, B, C, b, $, bc, K, V, X, Y, D, c, d, a0, aS, bh, I, f, L, M, N, g, P, R, h, m, i, bd, S, k, l, n, be, aR, aU, aT, T, o, aV, W, b9, bu, a1, bv, j, a3, a4, aG, aM, a5, a6, a7, a8, a9, e, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, br, aJ, ak, al, am, an, bm, bn, bC, aH, ax, bs, bw, bx, bt, ao, by, U, aK, b4, b5, bo, bi, aF, b2, b3, ba, bp, bq, aI, bz, aN, O, O as O2, a_, a$, aD, G, H, J, bj, bk, bA, aP, b8, bB, aE, aA, ay, az, aL, a2, bl, au, av, b0, b1, Z, aW, aX, b6, b7, aO, aQ, bb, as, aq, _, u, ar, aw, aB, aC, at, bf, bg, aY, aZ, Q, ap } from "./TransformOriginView-CzVjS16F.js";
3
3
  import { Fragment, jsx, jsxs } from "./jsx-runtime.js";
4
4
  import { computed } from "@preact/signals-core";
5
5
  function useFX(ref) {
@@ -315,7 +315,7 @@ function setColorPreset(presetName, colorMode) {
315
315
  return;
316
316
  }
317
317
  setTimeout(() => {
318
- import("./TransformOriginView-CiFiQcku.js").then((n2) => n2.bC).then(({ remountAll }) => {
318
+ import("./TransformOriginView-CzVjS16F.js").then((n2) => n2.bD).then(({ remountAll }) => {
319
319
  remountAll();
320
320
  });
321
321
  }, 0);
@@ -399,7 +399,7 @@ export {
399
399
  b as CharTextInput,
400
400
  $ as DEFAULT_EFFECT,
401
401
  DEFAULT_FX,
402
- bb as DEFAULT_SPRING_CONFIG,
402
+ bc as DEFAULT_SPRING_CONFIG,
403
403
  K as DOMInputElement,
404
404
  V as DebugLogger,
405
405
  X as DevConfig,
@@ -410,8 +410,8 @@ export {
410
410
  a0 as EFFECT_REGISTRY,
411
411
  FX_REGISTRY,
412
412
  Fragment,
413
- aR as Graphics,
414
- bg as HexColor,
413
+ aS as Graphics,
414
+ bh as HexColor,
415
415
  I as Icon,
416
416
  f as Image,
417
417
  L as KeyboardInputManager,
@@ -423,25 +423,25 @@ export {
423
423
  h as RadioGroup,
424
424
  m as RangeSlider,
425
425
  i as RefOriginView,
426
- bc as SPRING_PRESETS,
426
+ bd as SPRING_PRESETS,
427
427
  S as ScrollSlider,
428
428
  k as ScrollView,
429
429
  l as Sidebar,
430
430
  n as Slider,
431
- bd as SpringPhysics,
432
- aQ as Sprite,
433
- aT as Text,
434
- aS as TileSprite,
431
+ be as SpringPhysics,
432
+ aR as Sprite,
433
+ aU as Text,
434
+ aT as TileSprite,
435
435
  T as Toggle,
436
436
  o as TransformOriginView,
437
- aU as View,
437
+ aV as View,
438
438
  W as WrapText,
439
439
  alpha,
440
- b8 as animatedSignal,
441
- bt as applyDarkMode,
440
+ b9 as animatedSignal,
441
+ bu as applyDarkMode,
442
442
  a1 as applyEffectByName,
443
443
  applyFXByName,
444
- bu as applyLightMode,
444
+ bv as applyLightMode,
445
445
  j as calculateSliderSize,
446
446
  colorsToTheme,
447
447
  computed,
@@ -470,7 +470,7 @@ export {
470
470
  ah as createSpinEffect,
471
471
  ai as createSwingEffect,
472
472
  aj as createTadaEffect,
473
- bq as createTextStyle,
473
+ br as createTextStyle,
474
474
  createTextStyleTokens,
475
475
  aJ as createTheme,
476
476
  createVignetteFX,
@@ -478,60 +478,60 @@ export {
478
478
  al as createWobbleEffect,
479
479
  am as createZoomInEffect,
480
480
  an as createZoomOutEffect,
481
- bl as darken,
482
- bm as darkenHex,
481
+ bm as darken,
482
+ bn as darkenHex,
483
483
  defaultRadiusTokens,
484
484
  defaultSizeTokens,
485
485
  defaultSpacingTokens,
486
- bB as defaultTextStyleTokens,
486
+ bC as defaultTextStyleTokens,
487
487
  aH as defaultTheme,
488
488
  ax as disposeCtx,
489
- br as ensureContrast,
490
- bv as forestGreenPreset,
491
- bw as generateColorScale,
489
+ bs as ensureContrast,
490
+ bw as forestGreenPreset,
491
+ bx as generateColorScale,
492
492
  getAvailablePresets,
493
493
  getBackgroundColor,
494
494
  getBorderColor,
495
- bs as getContrastRatio,
495
+ bt as getContrastRatio,
496
496
  ao as getCurrent,
497
497
  getCurrentPreset,
498
- bx as getPreset,
498
+ by as getPreset,
499
499
  getPresetWithMode,
500
500
  U as getRenderContext,
501
501
  getSurfaceColor,
502
502
  getTextColor,
503
503
  aK as getThemedProps,
504
- b3 as graphicsCreator,
505
- b4 as graphicsPatcher,
506
- bn as hex,
507
- bh as hexToNumber,
504
+ b4 as graphicsCreator,
505
+ b5 as graphicsPatcher,
506
+ bo as hex,
507
+ bi as hexToNumber,
508
508
  aF as host,
509
- b1 as imageCreator,
510
- b2 as imagePatcher,
511
- b9 as isAnimatedSignal,
509
+ b2 as imageCreator,
510
+ b3 as imagePatcher,
511
+ ba as isAnimatedSignal,
512
512
  jsx,
513
513
  jsxs,
514
- bo as lighten,
515
- bp as lightenHex,
514
+ bp as lighten,
515
+ bq as lightenHex,
516
516
  memo,
517
517
  aI as mergeThemes,
518
- by as midnightPreset,
518
+ bz as midnightPreset,
519
519
  aN as mount,
520
520
  O as mountComponent,
521
521
  O2 as mountJSX,
522
- aZ as nineSliceCreator,
523
- a_ as nineSlicePatcher,
522
+ a_ as nineSliceCreator,
523
+ a$ as nineSlicePatcher,
524
524
  noMemo,
525
525
  aD as nodeRegistry,
526
526
  G as normalizeCornerRadius,
527
527
  H as normalizeEdgeInsets,
528
528
  J as normalizeGap,
529
- bi as numberToHex,
530
- bj as numberToRgb,
531
- bz as oceanBluePreset,
529
+ bj as numberToHex,
530
+ bk as numberToRgb,
531
+ bA as oceanBluePreset,
532
532
  aP as patchVNode,
533
- b7 as portalRegistry,
534
- bA as presets,
533
+ b8 as portalRegistry,
534
+ bB as presets,
535
535
  aE as register,
536
536
  registerBuiltins,
537
537
  aA as releaseAllSVGTextures,
@@ -540,21 +540,22 @@ export {
540
540
  aL as remountAll,
541
541
  a2 as resolveEffect,
542
542
  resolveFX,
543
- bk as rgbToNumber,
543
+ bl as rgbToNumber,
544
544
  setColorMode,
545
545
  setColorPreset,
546
546
  au as shallowEqual,
547
547
  av as shouldComponentUpdate,
548
- a$ as spriteCreator,
549
- b0 as spritePatcher,
548
+ b0 as spriteCreator,
549
+ b1 as spritePatcher,
550
550
  Z as svgToTexture,
551
- aV as textCreator,
552
- aW as textPatcher,
551
+ aW as textCreator,
552
+ aX as textPatcher,
553
553
  themeRegistry,
554
- b5 as tileSpriteCreator,
555
- b6 as tileSpritePatcher,
554
+ b6 as tileSpriteCreator,
555
+ b7 as tileSpritePatcher,
556
556
  aO as unmount,
557
- ba as unwrapSignal,
557
+ aQ as unmountJSX,
558
+ bb as unwrapSignal,
558
559
  useBlur,
559
560
  as as useCallback,
560
561
  useColorMode,
@@ -572,14 +573,14 @@ export {
572
573
  aC as useSVGTextures,
573
574
  at as useScene,
574
575
  useShadow,
575
- be as useSpring,
576
- bf as useSprings,
576
+ bf as useSpring,
577
+ bg as useSprings,
577
578
  useState,
578
579
  useTheme,
579
580
  useThemeSubscription,
580
581
  useThemeTokens,
581
- aX as viewCreator,
582
- aY as viewPatcher,
582
+ aY as viewCreator,
583
+ aZ as viewPatcher,
583
584
  Q as viewportRegistry,
584
585
  ap as withHooks
585
586
  };
@@ -1 +1 @@
1
- {"version":3,"file":"size-resolver.d.ts","sourceRoot":"","sources":["../../../src/layout/utils/size-resolver.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAA+B,UAAU,EAAE,MAAM,UAAU,CAAA;AAGvE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAmH1C;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAiBvE;AA8JD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,UAAU,EAClB,UAAU,CAAC,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE,MAAM,EACtB,YAAY,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC/C,MAAM,CAuER;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAGtC;AAkBD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAW1D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAStD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EACzB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EACzB,UAAU,CAAC,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM,EACrB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAsBR"}
1
+ {"version":3,"file":"size-resolver.d.ts","sourceRoot":"","sources":["../../../src/layout/utils/size-resolver.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAA+B,UAAU,EAAE,MAAM,UAAU,CAAA;AAGvE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAmH1C;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAiBvE;AA0JD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,UAAU,EAClB,UAAU,CAAC,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE,MAAM,EACtB,YAAY,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC/C,MAAM,CAuER;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAGtC;AAkBD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAW1D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAStD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EACzB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EACzB,UAAU,CAAC,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM,EACrB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAsBR"}