@joydle/ui 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/dist/controls/ActionButton.d.ts +10 -1
  2. package/dist/controls/ActionButton.d.ts.map +1 -1
  3. package/dist/controls/ActionButton.js +3 -3
  4. package/dist/controls/ActionButton.js.map +1 -1
  5. package/dist/controls/index.d.ts +1 -1
  6. package/dist/controls/index.d.ts.map +1 -1
  7. package/dist/controls/index.js.map +1 -1
  8. package/dist/deps.d.ts +11 -0
  9. package/dist/deps.d.ts.map +1 -0
  10. package/dist/deps.js +19 -0
  11. package/dist/deps.js.map +1 -0
  12. package/dist/fx/effects.d.ts +163 -0
  13. package/dist/fx/effects.d.ts.map +1 -0
  14. package/dist/fx/effects.js +337 -0
  15. package/dist/fx/effects.js.map +1 -0
  16. package/dist/fx/hooks.d.ts +100 -0
  17. package/dist/fx/hooks.d.ts.map +1 -0
  18. package/dist/fx/hooks.js +116 -0
  19. package/dist/fx/hooks.js.map +1 -0
  20. package/dist/fx/index.d.ts +15 -0
  21. package/dist/fx/index.d.ts.map +1 -0
  22. package/dist/fx/index.js +22 -0
  23. package/dist/fx/index.js.map +1 -0
  24. package/dist/hud/BottomHint.d.ts.map +1 -1
  25. package/dist/hud/BottomHint.js +1 -9
  26. package/dist/hud/BottomHint.js.map +1 -1
  27. package/dist/hud/ComboLabel.d.ts.map +1 -1
  28. package/dist/hud/ComboLabel.js +1 -9
  29. package/dist/hud/ComboLabel.js.map +1 -1
  30. package/dist/hud/Crosshair.d.ts +28 -0
  31. package/dist/hud/Crosshair.d.ts.map +1 -0
  32. package/dist/hud/Crosshair.js +93 -0
  33. package/dist/hud/Crosshair.js.map +1 -0
  34. package/dist/hud/EntityLabel.d.ts +46 -0
  35. package/dist/hud/EntityLabel.d.ts.map +1 -0
  36. package/dist/hud/EntityLabel.js +59 -0
  37. package/dist/hud/EntityLabel.js.map +1 -0
  38. package/dist/hud/FloatingNumbers.d.ts +43 -0
  39. package/dist/hud/FloatingNumbers.d.ts.map +1 -0
  40. package/dist/hud/FloatingNumbers.js +93 -0
  41. package/dist/hud/FloatingNumbers.js.map +1 -0
  42. package/dist/hud/HUD.d.ts +2 -0
  43. package/dist/hud/HUD.d.ts.map +1 -1
  44. package/dist/hud/HUD.js +11 -0
  45. package/dist/hud/HUD.js.map +1 -1
  46. package/dist/hud/Lives.d.ts +26 -5
  47. package/dist/hud/Lives.d.ts.map +1 -1
  48. package/dist/hud/Lives.js +30 -31
  49. package/dist/hud/Lives.js.map +1 -1
  50. package/dist/hud/Meter.d.ts +10 -1
  51. package/dist/hud/Meter.d.ts.map +1 -1
  52. package/dist/hud/Meter.js +3 -11
  53. package/dist/hud/Meter.js.map +1 -1
  54. package/dist/hud/ResourceDisplay.d.ts +30 -0
  55. package/dist/hud/ResourceDisplay.d.ts.map +1 -0
  56. package/dist/hud/ResourceDisplay.js +49 -0
  57. package/dist/hud/ResourceDisplay.js.map +1 -0
  58. package/dist/hud/Score.d.ts +12 -1
  59. package/dist/hud/Score.d.ts.map +1 -1
  60. package/dist/hud/Score.js +15 -12
  61. package/dist/hud/Score.js.map +1 -1
  62. package/dist/hud/StatDisplay.d.ts +33 -0
  63. package/dist/hud/StatDisplay.d.ts.map +1 -0
  64. package/dist/hud/StatDisplay.js +56 -0
  65. package/dist/hud/StatDisplay.js.map +1 -0
  66. package/dist/hud/Timer.d.ts.map +1 -1
  67. package/dist/hud/Timer.js +1 -9
  68. package/dist/hud/Timer.js.map +1 -1
  69. package/dist/hud/WaveLabel.d.ts.map +1 -1
  70. package/dist/hud/WaveLabel.js +1 -9
  71. package/dist/hud/WaveLabel.js.map +1 -1
  72. package/dist/hud/index.d.ts +8 -3
  73. package/dist/hud/index.d.ts.map +1 -1
  74. package/dist/hud/index.js +5 -0
  75. package/dist/hud/index.js.map +1 -1
  76. package/dist/index.d.ts +1 -0
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +2 -0
  79. package/dist/index.js.map +1 -1
  80. package/dist/screens/GameOverScreen.d.ts +12 -2
  81. package/dist/screens/GameOverScreen.d.ts.map +1 -1
  82. package/dist/screens/GameOverScreen.js +12 -11
  83. package/dist/screens/GameOverScreen.js.map +1 -1
  84. package/dist/screens/LoadingScreen.d.ts.map +1 -1
  85. package/dist/screens/LoadingScreen.js +1 -9
  86. package/dist/screens/LoadingScreen.js.map +1 -1
  87. package/dist/screens/LobbyScreen.d.ts.map +1 -1
  88. package/dist/screens/LobbyScreen.js +1 -9
  89. package/dist/screens/LobbyScreen.js.map +1 -1
  90. package/dist/screens/PauseOverlay.d.ts.map +1 -1
  91. package/dist/screens/PauseOverlay.js +1 -9
  92. package/dist/screens/PauseOverlay.js.map +1 -1
  93. package/dist/screens/TitleScreen.d.ts +9 -1
  94. package/dist/screens/TitleScreen.d.ts.map +1 -1
  95. package/dist/screens/TitleScreen.js +4 -11
  96. package/dist/screens/TitleScreen.js.map +1 -1
  97. package/dist/screens/index.d.ts +1 -0
  98. package/dist/screens/index.d.ts.map +1 -1
  99. package/dist/screens/index.js +1 -0
  100. package/dist/screens/index.js.map +1 -1
  101. package/dist/screens/primitives.d.ts +101 -0
  102. package/dist/screens/primitives.d.ts.map +1 -0
  103. package/dist/screens/primitives.js +239 -0
  104. package/dist/screens/primitives.js.map +1 -0
  105. package/dist/transitions/ScreenTransition.d.ts.map +1 -1
  106. package/dist/transitions/ScreenTransition.js +31 -40
  107. package/dist/transitions/ScreenTransition.js.map +1 -1
  108. package/package.json +13 -2
@@ -0,0 +1,43 @@
1
+ import type { JSX } from 'preact';
2
+ export interface FloatNum {
3
+ id: number;
4
+ value: string | number;
5
+ x: number;
6
+ y: number;
7
+ crit?: boolean;
8
+ }
9
+ export interface FloatingNumbersProps {
10
+ numbers: FloatNum[];
11
+ /** Critical-hit color. Default: var(--joydle-gold, #ffd700) */
12
+ critColor?: string;
13
+ /** Normal number color. Default: var(--joydle-text, #fff) */
14
+ normalColor?: string;
15
+ /** Duration before removal in ms. Default: 900 */
16
+ duration?: number;
17
+ }
18
+ /**
19
+ * Manages a pool of floating numbers. Call `addNumber` whenever damage
20
+ * or healing occurs.
21
+ *
22
+ * ```tsx
23
+ * const { numbers, addNumber } = useFloatingNumbers();
24
+ * // on hit:
25
+ * addNumber(damage, screenX, screenY, isCrit);
26
+ * // render:
27
+ * <FloatingNumbers numbers={numbers} />
28
+ * ```
29
+ */
30
+ export declare function useFloatingNumbers(maxItems?: number): {
31
+ numbers: FloatNum[];
32
+ addNumber: (value: string | number, x: number, y: number, crit?: boolean) => void;
33
+ };
34
+ /**
35
+ * Renders the pool of floating numbers returned by `useFloatingNumbers`.
36
+ * Each number animates upward and fades out.
37
+ *
38
+ * ```tsx
39
+ * <FloatingNumbers numbers={numbers} critColor="#ffd700" />
40
+ * ```
41
+ */
42
+ export declare function FloatingNumbers({ numbers, critColor, normalColor, }: FloatingNumbersProps): JSX.Element;
43
+ //# sourceMappingURL=FloatingNumbers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FloatingNumbers.d.ts","sourceRoot":"","sources":["../../src/hud/FloatingNumbers.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAIlC,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,SAAK,GAAG;IACjD,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CACnF,CA8BA;AAsBD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EACP,SAAyC,EACzC,WAAwC,GACzC,EAAE,oBAAoB,GAAG,GAAG,CAAC,OAAO,CAsCpC"}
@@ -0,0 +1,93 @@
1
+ import { jsx as _jsx } from "preact/jsx-runtime";
2
+ // ---------------------------------------------------------------------------
3
+ // @joydle/ui — FloatingNumbers: pooled damage/heal number overlays
4
+ // ---------------------------------------------------------------------------
5
+ import { useState, useCallback, useRef, useEffect } from 'preact/hooks';
6
+ // ---- Hook -----------------------------------------------------------------
7
+ let _floatId = 0;
8
+ /**
9
+ * Manages a pool of floating numbers. Call `addNumber` whenever damage
10
+ * or healing occurs.
11
+ *
12
+ * ```tsx
13
+ * const { numbers, addNumber } = useFloatingNumbers();
14
+ * // on hit:
15
+ * addNumber(damage, screenX, screenY, isCrit);
16
+ * // render:
17
+ * <FloatingNumbers numbers={numbers} />
18
+ * ```
19
+ */
20
+ export function useFloatingNumbers(maxItems = 24) {
21
+ const [numbers, setNumbers] = useState([]);
22
+ const timersRef = useRef(new Map());
23
+ const addNumber = useCallback((value, x, y, crit = false) => {
24
+ const id = ++_floatId;
25
+ setNumbers(prev => {
26
+ const next = [...prev, { id, value, x, y, crit }];
27
+ // Cap pool size
28
+ return next.length > maxItems ? next.slice(next.length - maxItems) : next;
29
+ });
30
+ const t = setTimeout(() => {
31
+ setNumbers(prev => prev.filter(n => n.id !== id));
32
+ timersRef.current.delete(id);
33
+ }, 900);
34
+ timersRef.current.set(id, t);
35
+ }, [maxItems]);
36
+ useEffect(() => {
37
+ return () => {
38
+ timersRef.current.forEach(t => clearTimeout(t));
39
+ timersRef.current.clear();
40
+ };
41
+ }, []);
42
+ return { numbers, addNumber };
43
+ }
44
+ // ---- CSS injection --------------------------------------------------------
45
+ const FLOAT_CSS = `
46
+ @keyframes joydle-float-up {
47
+ 0% { opacity: 1; transform: translate(-50%, 0); }
48
+ 100% { opacity: 0; transform: translate(-50%, -48px); }
49
+ }
50
+ `;
51
+ let _floatStyleInjected = false;
52
+ function injectFloatStyle() {
53
+ if (_floatStyleInjected)
54
+ return;
55
+ _floatStyleInjected = true;
56
+ const el = document.createElement('style');
57
+ el.textContent = FLOAT_CSS;
58
+ document.head.appendChild(el);
59
+ }
60
+ // ---- Component ------------------------------------------------------------
61
+ /**
62
+ * Renders the pool of floating numbers returned by `useFloatingNumbers`.
63
+ * Each number animates upward and fades out.
64
+ *
65
+ * ```tsx
66
+ * <FloatingNumbers numbers={numbers} critColor="#ffd700" />
67
+ * ```
68
+ */
69
+ export function FloatingNumbers({ numbers, critColor = 'var(--joydle-gold, #ffd700)', normalColor = 'var(--joydle-text, #fff)', }) {
70
+ injectFloatStyle();
71
+ return (_jsx("div", { class: "joydle-floating-numbers", style: {
72
+ position: 'absolute',
73
+ inset: 0,
74
+ pointerEvents: 'none',
75
+ overflow: 'hidden',
76
+ zIndex: 13,
77
+ }, children: numbers.map(n => (_jsx("span", { style: {
78
+ position: 'absolute',
79
+ left: n.x,
80
+ top: n.y,
81
+ color: n.crit ? critColor : normalColor,
82
+ fontSize: n.crit ? '1.3rem' : '1rem',
83
+ fontWeight: 900,
84
+ textShadow: n.crit
85
+ ? `0 0 8px ${critColor}`
86
+ : '0 1px 4px rgba(0,0,0,0.8)',
87
+ animation: 'joydle-float-up 0.9s ease-out forwards',
88
+ whiteSpace: 'nowrap',
89
+ pointerEvents: 'none',
90
+ userSelect: 'none',
91
+ }, children: n.crit ? `${n.value}!` : n.value }, n.id))) }));
92
+ }
93
+ //# sourceMappingURL=FloatingNumbers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FloatingNumbers.js","sourceRoot":"","sources":["../../src/hud/FloatingNumbers.tsx"],"names":[],"mappings":"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"}
package/dist/hud/HUD.d.ts CHANGED
@@ -5,6 +5,7 @@ interface SlotProps {
5
5
  declare const Left: FunctionComponent<SlotProps>;
6
6
  declare const Center: FunctionComponent<SlotProps>;
7
7
  declare const Right: FunctionComponent<SlotProps>;
8
+ declare const Bottom: FunctionComponent<SlotProps>;
8
9
  export interface HUDProps {
9
10
  children?: ComponentChildren;
10
11
  }
@@ -12,6 +13,7 @@ interface HUDComponent extends FunctionComponent<HUDProps> {
12
13
  Left: typeof Left;
13
14
  Center: typeof Center;
14
15
  Right: typeof Right;
16
+ Bottom: typeof Bottom;
15
17
  }
16
18
  export declare const HUD: HUDComponent;
17
19
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"HUD.d.ts","sourceRoot":"","sources":["../../src/hud/HUD.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAInE,UAAU,SAAS;IACjB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAiDD,QAAA,MAAM,IAAI,EAAE,iBAAiB,CAAC,SAAS,CAItC,CAAC;AAEF,QAAA,MAAM,MAAM,EAAE,iBAAiB,CAAC,SAAS,CAIxC,CAAC;AAEF,QAAA,MAAM,KAAK,EAAE,iBAAiB,CAAC,SAAS,CAIvC,CAAC;AAIF,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAID,UAAU,YAAa,SAAQ,iBAAiB,CAAC,QAAQ,CAAC;IACxD,IAAI,EAAE,OAAO,IAAI,CAAC;IAClB,MAAM,EAAE,OAAO,MAAM,CAAC;IACtB,KAAK,EAAE,OAAO,KAAK,CAAC;CACrB;AA4BD,eAAO,MAAM,GAAG,EAAE,YAIhB,CAAC"}
1
+ {"version":3,"file":"HUD.d.ts","sourceRoot":"","sources":["../../src/hud/HUD.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAInE,UAAU,SAAS;IACjB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AA2DD,QAAA,MAAM,IAAI,EAAE,iBAAiB,CAAC,SAAS,CAItC,CAAC;AAEF,QAAA,MAAM,MAAM,EAAE,iBAAiB,CAAC,SAAS,CAIxC,CAAC;AAEF,QAAA,MAAM,KAAK,EAAE,iBAAiB,CAAC,SAAS,CAIvC,CAAC;AAEF,QAAA,MAAM,MAAM,EAAE,iBAAiB,CAAC,SAAS,CAIxC,CAAC;AAIF,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAID,UAAU,YAAa,SAAQ,iBAAiB,CAAC,QAAQ,CAAC;IACxD,IAAI,EAAE,OAAO,IAAI,CAAC;IAClB,MAAM,EAAE,OAAO,MAAM,CAAC;IACtB,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,MAAM,EAAE,OAAO,MAAM,CAAC;CACvB;AA4BD,eAAO,MAAM,GAAG,EAAE,YAKhB,CAAC"}
package/dist/hud/HUD.js CHANGED
@@ -39,10 +39,20 @@ const RIGHT_STYLE = {
39
39
  alignItems: 'flex-end',
40
40
  gap: 8,
41
41
  };
42
+ const BOTTOM_STYLE = {
43
+ gridColumn: '1 / -1',
44
+ gridRow: '3',
45
+ display: 'flex',
46
+ flexDirection: 'row',
47
+ alignItems: 'flex-end',
48
+ justifyContent: 'center',
49
+ gap: 16,
50
+ };
42
51
  // ---- Sub-components -------------------------------------------------------
43
52
  const Left = ({ children }) => (_jsx("div", { class: "joydle-hud-left", style: LEFT_STYLE, children: children }));
44
53
  const Center = ({ children }) => (_jsx("div", { class: "joydle-hud-center", style: CENTER_STYLE, children: children }));
45
54
  const Right = ({ children }) => (_jsx("div", { class: "joydle-hud-right", style: RIGHT_STYLE, children: children }));
55
+ const Bottom = ({ children }) => (_jsx("div", { class: "joydle-hud-bottom", style: BOTTOM_STYLE, children: children }));
46
56
  /**
47
57
  * HUD layout container with Left, Center, Right slot sub-components.
48
58
  *
@@ -68,5 +78,6 @@ export const HUD = Object.assign(HUDBase, {
68
78
  Left,
69
79
  Center,
70
80
  Right,
81
+ Bottom,
71
82
  });
72
83
  //# sourceMappingURL=HUD.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HUD.js","sourceRoot":"","sources":["../../src/hud/HUD.tsx"],"names":[],"mappings":";AAYA,8EAA8E;AAE9E,MAAM,SAAS,GAAoC;IACjD,QAAQ,EAAE,UAAU;IACpB,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,EAAE;IACV,aAAa,EAAE,MAAM;IACrB,OAAO,EAAE,MAAM;IACf,mBAAmB,EAAE,cAAc;IACnC,gBAAgB,EAAE,eAAe;IACjC,OAAO,EAAE,EAAE;IACX,SAAS,EAAE,YAAY;IACvB,UAAU,EAAE,gCAAgC;CAC7C,CAAC;AAEF,MAAM,UAAU,GAAoC;IAClD,UAAU,EAAE,GAAG;IACf,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,MAAM;IACf,aAAa,EAAE,QAAQ;IACvB,UAAU,EAAE,YAAY;IACxB,GAAG,EAAE,CAAC;CACP,CAAC;AAEF,MAAM,YAAY,GAAoC;IACpD,UAAU,EAAE,GAAG;IACf,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,MAAM;IACf,aAAa,EAAE,QAAQ;IACvB,UAAU,EAAE,QAAQ;IACpB,GAAG,EAAE,CAAC;CACP,CAAC;AAEF,MAAM,WAAW,GAAoC;IACnD,UAAU,EAAE,GAAG;IACf,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,MAAM;IACf,aAAa,EAAE,QAAQ;IACvB,UAAU,EAAE,UAAU;IACtB,GAAG,EAAE,CAAC;CACP,CAAC;AAEF,8EAA8E;AAE9E,MAAM,IAAI,GAAiC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAC3D,cAAK,KAAK,EAAC,iBAAiB,EAAC,KAAK,EAAE,UAAU,YAC3C,QAAQ,GACL,CACP,CAAC;AAEF,MAAM,MAAM,GAAiC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAC7D,cAAK,KAAK,EAAC,mBAAmB,EAAC,KAAK,EAAE,YAAY,YAC/C,QAAQ,GACL,CACP,CAAC;AAEF,MAAM,KAAK,GAAiC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAC5D,cAAK,KAAK,EAAC,kBAAkB,EAAC,KAAK,EAAE,WAAW,YAC7C,QAAQ,GACL,CACP,CAAC;AAgBF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,GAAgC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAC7D,cAAK,KAAK,EAAC,YAAY,EAAC,KAAK,EAAE,SAAS,YACrC,QAAQ,GACL,CACP,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAAiB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE;IACtD,IAAI;IACJ,MAAM;IACN,KAAK;CACN,CAAC,CAAC"}
1
+ {"version":3,"file":"HUD.js","sourceRoot":"","sources":["../../src/hud/HUD.tsx"],"names":[],"mappings":";AAYA,8EAA8E;AAE9E,MAAM,SAAS,GAAoC;IACjD,QAAQ,EAAE,UAAU;IACpB,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,EAAE;IACV,aAAa,EAAE,MAAM;IACrB,OAAO,EAAE,MAAM;IACf,mBAAmB,EAAE,cAAc;IACnC,gBAAgB,EAAE,eAAe;IACjC,OAAO,EAAE,EAAE;IACX,SAAS,EAAE,YAAY;IACvB,UAAU,EAAE,gCAAgC;CAC7C,CAAC;AAEF,MAAM,UAAU,GAAoC;IAClD,UAAU,EAAE,GAAG;IACf,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,MAAM;IACf,aAAa,EAAE,QAAQ;IACvB,UAAU,EAAE,YAAY;IACxB,GAAG,EAAE,CAAC;CACP,CAAC;AAEF,MAAM,YAAY,GAAoC;IACpD,UAAU,EAAE,GAAG;IACf,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,MAAM;IACf,aAAa,EAAE,QAAQ;IACvB,UAAU,EAAE,QAAQ;IACpB,GAAG,EAAE,CAAC;CACP,CAAC;AAEF,MAAM,WAAW,GAAoC;IACnD,UAAU,EAAE,GAAG;IACf,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,MAAM;IACf,aAAa,EAAE,QAAQ;IACvB,UAAU,EAAE,UAAU;IACtB,GAAG,EAAE,CAAC;CACP,CAAC;AAEF,MAAM,YAAY,GAAoC;IACpD,UAAU,EAAE,QAAQ;IACpB,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,MAAM;IACf,aAAa,EAAE,KAAK;IACpB,UAAU,EAAE,UAAU;IACtB,cAAc,EAAE,QAAQ;IACxB,GAAG,EAAE,EAAE;CACR,CAAC;AAEF,8EAA8E;AAE9E,MAAM,IAAI,GAAiC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAC3D,cAAK,KAAK,EAAC,iBAAiB,EAAC,KAAK,EAAE,UAAU,YAC3C,QAAQ,GACL,CACP,CAAC;AAEF,MAAM,MAAM,GAAiC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAC7D,cAAK,KAAK,EAAC,mBAAmB,EAAC,KAAK,EAAE,YAAY,YAC/C,QAAQ,GACL,CACP,CAAC;AAEF,MAAM,KAAK,GAAiC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAC5D,cAAK,KAAK,EAAC,kBAAkB,EAAC,KAAK,EAAE,WAAW,YAC7C,QAAQ,GACL,CACP,CAAC;AAEF,MAAM,MAAM,GAAiC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAC7D,cAAK,KAAK,EAAC,mBAAmB,EAAC,KAAK,EAAE,YAAY,YAC/C,QAAQ,GACL,CACP,CAAC;AAiBF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,GAAgC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAC7D,cAAK,KAAK,EAAC,YAAY,EAAC,KAAK,EAAE,SAAS,YACrC,QAAQ,GACL,CACP,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAAiB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE;IACtD,IAAI;IACJ,MAAM;IACN,KAAK;IACL,MAAM;CACP,CAAC,CAAC"}
@@ -1,21 +1,42 @@
1
1
  import type { JSX } from 'preact';
2
+ /** @deprecated Use `LivesIconProp` or `IconProp` from `@joydle/icons`. */
2
3
  export type LivesIcon = 'heart' | 'shield' | 'diamond' | 'star';
4
+ /**
5
+ * Icon prop — accepts a Preact component or a string name.
6
+ * When `@joydle/icons` is installed, pass any `IconProp` value.
7
+ * Falls back to built-in Unicode glyphs for basic names.
8
+ */
9
+ export type LivesIconProp = ((props: {
10
+ size?: number;
11
+ color?: string;
12
+ fill?: string;
13
+ strokeWidth?: number;
14
+ }) => JSX.Element) | string;
3
15
  export interface LivesProps {
4
16
  /** Number of lives remaining. */
5
17
  current: number;
6
18
  /** Maximum number of lives. */
7
19
  max: number;
8
- /** Icon character to display (default: `"heart"`). */
9
- icon?: LivesIcon;
20
+ /** Icon to display — component ref or string name (default: `"heart"`). */
21
+ icon?: LivesIconProp;
22
+ /** Color for filled (alive) icons. Default: `"var(--joydle-danger, #ff4444)"` */
23
+ filledColor?: string;
24
+ /** Color for empty (lost) icons. Default: `"var(--joydle-text-dim, rgba(255,255,255,0.3))"` */
25
+ emptyColor?: string;
10
26
  }
11
27
  /**
12
- * Renders a row of life icons. Filled icons represent remaining lives,
13
- * faded icons represent lost ones. A GSAP elastic shake plays on the
28
+ * Renders a row of life icons. Filled icons represent remaining lives,
29
+ * faded icons represent lost ones. A GSAP elastic shake plays on the
14
30
  * container when lives decrease.
15
31
  *
16
32
  * ```tsx
33
+ * // With @joydle/icons (recommended):
34
+ * import { Heart, Shield } from '@joydle/icons';
35
+ * <Lives current={3} max={5} icon={Heart} />
36
+ *
37
+ * // String shorthand (falls back to Unicode without @joydle/icons):
17
38
  * <Lives current={3} max={5} icon="heart" />
18
39
  * ```
19
40
  */
20
- export declare function Lives({ current, max, icon, }: LivesProps): JSX.Element;
41
+ export declare function Lives({ current, max, icon, filledColor, emptyColor, }: LivesProps): JSX.Element;
21
42
  //# sourceMappingURL=Lives.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Lives.d.ts","sourceRoot":"","sources":["../../src/hud/Lives.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAclC,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAEhE,MAAM,WAAW,UAAU;IACzB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,sDAAsD;IACtD,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAiCD;;;;;;;;GAQG;AACH,wBAAgB,KAAK,CAAC,EACpB,OAAO,EACP,GAAG,EACH,IAAc,GACf,EAAE,UAAU,GAAG,GAAG,CAAC,OAAO,CAgE1B"}
1
+ {"version":3,"file":"Lives.d.ts","sourceRoot":"","sources":["../../src/hud/Lives.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAKlC,0EAA0E;AAC1E,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAEhE;;;;GAIG;AACH,MAAM,MAAM,aAAa,GACrB,CAAC,CAAC,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,GAAG,CAAC,OAAO,CAAC,GAChG,MAAM,CAAC;AAEX,MAAM,WAAW,UAAU;IACzB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,2EAA2E;IAC3E,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,iFAAiF;IACjF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+FAA+F;IAC/F,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAuBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,KAAK,CAAC,EACpB,OAAO,EACP,GAAG,EACH,IAAc,EACd,WAA6C,EAC7C,UAA4D,GAC7D,EAAE,UAAU,GAAG,GAAG,CAAC,OAAO,CAoF1B"}
package/dist/hud/Lives.js CHANGED
@@ -3,21 +3,13 @@ import { jsx as _jsx } from "preact/jsx-runtime";
3
3
  // @joydle/ui — Icon-based lives display with GSAP shake on decrease
4
4
  // ---------------------------------------------------------------------------
5
5
  import { useRef, useEffect } from 'preact/hooks';
6
- // ---- GSAP helper ----------------------------------------------------------
7
- function getGsap() {
8
- try {
9
- return globalThis.gsap ?? require('gsap').default;
10
- }
11
- catch {
12
- return null;
13
- }
14
- }
15
- // ---- Icon map -------------------------------------------------------------
16
- const ICON_MAP = {
17
- heart: '\u2665', // black heart suit
18
- shield: '\uD83D\uDEE1', // shield emoji
19
- diamond: '\u25C6', // black diamond
20
- star: '\u2605', // black star
6
+ import { getGsap } from '../deps.js';
7
+ // ---- Fallback Unicode map (when @joydle/icons not installed) ---------------
8
+ const UNICODE_FALLBACK = {
9
+ heart: '\u2665',
10
+ shield: '\u25C6',
11
+ diamond: '\u25C6',
12
+ star: '\u2605',
21
13
  };
22
14
  // ---- Styles ---------------------------------------------------------------
23
15
  const ROW_STYLE = {
@@ -25,27 +17,24 @@ const ROW_STYLE = {
25
17
  gap: 4,
26
18
  lineHeight: 1,
27
19
  userSelect: 'none',
28
- };
29
- const ICON_STYLE_FILLED = {
30
- color: 'var(--joydle-danger, #ff4444)',
31
- fontSize: '1.2em',
32
- transition: 'opacity 0.15s',
33
- };
34
- const ICON_STYLE_EMPTY = {
35
- ...ICON_STYLE_FILLED,
36
- opacity: 0.3,
20
+ alignItems: 'center',
37
21
  };
38
22
  // ---- Component ------------------------------------------------------------
39
23
  /**
40
- * Renders a row of life icons. Filled icons represent remaining lives,
41
- * faded icons represent lost ones. A GSAP elastic shake plays on the
24
+ * Renders a row of life icons. Filled icons represent remaining lives,
25
+ * faded icons represent lost ones. A GSAP elastic shake plays on the
42
26
  * container when lives decrease.
43
27
  *
44
28
  * ```tsx
29
+ * // With @joydle/icons (recommended):
30
+ * import { Heart, Shield } from '@joydle/icons';
31
+ * <Lives current={3} max={5} icon={Heart} />
32
+ *
33
+ * // String shorthand (falls back to Unicode without @joydle/icons):
45
34
  * <Lives current={3} max={5} icon="heart" />
46
35
  * ```
47
36
  */
48
- export function Lives({ current, max, icon = 'heart', }) {
37
+ export function Lives({ current, max, icon = 'heart', filledColor = 'var(--joydle-danger, #ff4444)', emptyColor = 'var(--joydle-text-dim, rgba(255,255,255,0.3))', }) {
49
38
  const rowRef = useRef(null);
50
39
  const prevRef = useRef(current);
51
40
  const tweenRef = useRef(null);
@@ -53,7 +42,6 @@ export function Lives({ current, max, icon = 'heart', }) {
53
42
  const el = rowRef.current;
54
43
  if (!el)
55
44
  return;
56
- // Only animate on decrease.
57
45
  if (current < prevRef.current) {
58
46
  const gsap = getGsap();
59
47
  if (gsap) {
@@ -72,7 +60,6 @@ export function Lives({ current, max, icon = 'heart', }) {
72
60
  }
73
61
  prevRef.current = current;
74
62
  }, [current]);
75
- // Cleanup on unmount.
76
63
  useEffect(() => {
77
64
  return () => {
78
65
  if (tweenRef.current) {
@@ -81,11 +68,23 @@ export function Lives({ current, max, icon = 'heart', }) {
81
68
  }
82
69
  };
83
70
  }, []);
84
- const glyph = ICON_MAP[icon];
71
+ const isComponent = typeof icon === 'function';
85
72
  const icons = [];
86
73
  for (let i = 0; i < max; i++) {
87
74
  const filled = i < current;
88
- icons.push(_jsx("span", { style: filled ? ICON_STYLE_FILLED : ICON_STYLE_EMPTY, children: glyph }, i));
75
+ if (isComponent) {
76
+ const IconComp = icon;
77
+ icons.push(_jsx("span", { style: { lineHeight: 0, opacity: filled ? 1 : 0.3 }, children: _jsx(IconComp, { size: 16, color: filled ? filledColor : emptyColor, fill: filled ? filledColor : 'none', strokeWidth: 2 }) }, i));
78
+ }
79
+ else {
80
+ const glyph = UNICODE_FALLBACK[icon] ?? icon;
81
+ icons.push(_jsx("span", { style: {
82
+ color: filled ? filledColor : emptyColor,
83
+ fontSize: '1.2em',
84
+ opacity: filled ? 1 : 0.3,
85
+ transition: 'opacity 0.15s',
86
+ }, children: glyph }, i));
87
+ }
89
88
  }
90
89
  return (_jsx("div", { ref: rowRef, class: "joydle-lives", style: ROW_STYLE, children: icons }));
91
90
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Lives.js","sourceRoot":"","sources":["../../src/hud/Lives.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Lives.js","sourceRoot":"","sources":["../../src/hud/Lives.tsx"],"names":[],"mappings":"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"}
@@ -1,4 +1,11 @@
1
1
  import type { JSX } from 'preact';
2
+ /** Icon prop — component ref, same pattern as Lives. */
3
+ export type MeterIconProp = ((props: {
4
+ size?: number;
5
+ color?: string;
6
+ fill?: string;
7
+ strokeWidth?: number;
8
+ }) => JSX.Element);
2
9
  export interface MeterProps {
3
10
  /** Current value. */
4
11
  value: number;
@@ -10,6 +17,8 @@ export interface MeterProps {
10
17
  label?: string;
11
18
  /** Bar width in pixels (default: `60`). */
12
19
  width?: number;
20
+ /** Optional icon displayed alongside the label. */
21
+ icon?: MeterIconProp;
13
22
  }
14
23
  /**
15
24
  * A horizontal fill-bar meter. The fill width is animated with GSAP on
@@ -20,5 +29,5 @@ export interface MeterProps {
20
29
  * <Meter value={hp} max={100} label="HP" color="--joydle-danger" />
21
30
  * ```
22
31
  */
23
- export declare function Meter({ value, max, color, label, width, }: MeterProps): JSX.Element;
32
+ export declare function Meter({ value, max, color, label, width, icon, }: MeterProps): JSX.Element;
24
33
  //# sourceMappingURL=Meter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Meter.d.ts","sourceRoot":"","sources":["../../src/hud/Meter.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAclC,MAAM,WAAW,UAAU;IACzB,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID;;;;;;;;GAQG;AACH,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,GAAG,EACH,KAA0B,EAC1B,KAAK,EACL,KAAU,GACX,EAAE,UAAU,GAAG,GAAG,CAAC,OAAO,CA0I1B"}
1
+ {"version":3,"file":"Meter.d.ts","sourceRoot":"","sources":["../../src/hud/Meter.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAKlC,wDAAwD;AACxD,MAAM,MAAM,aAAa,GACrB,CAAC,CAAC,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC;AAErG,MAAM,WAAW,UAAU;IACzB,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB;AAID;;;;;;;;GAQG;AACH,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,GAAG,EACH,KAA0B,EAC1B,KAAK,EACL,KAAU,EACV,IAAI,GACL,EAAE,UAAU,GAAG,GAAG,CAAC,OAAO,CA+I1B"}
package/dist/hud/Meter.js CHANGED
@@ -3,15 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
3
3
  // @joydle/ui — Fill bar meter with GSAP tween and flash on deplete
4
4
  // ---------------------------------------------------------------------------
5
5
  import { useRef, useEffect } from 'preact/hooks';
6
- // ---- GSAP helper ----------------------------------------------------------
7
- function getGsap() {
8
- try {
9
- return globalThis.gsap ?? require('gsap').default;
10
- }
11
- catch {
12
- return null;
13
- }
14
- }
6
+ import { getGsap } from '../deps.js';
15
7
  // ---- Component ------------------------------------------------------------
16
8
  /**
17
9
  * A horizontal fill-bar meter. The fill width is animated with GSAP on
@@ -22,7 +14,7 @@ function getGsap() {
22
14
  * <Meter value={hp} max={100} label="HP" color="--joydle-danger" />
23
15
  * ```
24
16
  */
25
- export function Meter({ value, max, color = '--joydle-primary', label, width = 60, }) {
17
+ export function Meter({ value, max, color = '--joydle-primary', label, width = 60, icon, }) {
26
18
  const fillRef = useRef(null);
27
19
  const flashRef = useRef(null);
28
20
  const prevRef = useRef(value);
@@ -128,6 +120,6 @@ export function Meter({ value, max, color = '--joydle-primary', label, width = 6
128
120
  borderRadius: 3,
129
121
  pointerEvents: 'none',
130
122
  };
131
- return (_jsxs("div", { class: "joydle-meter", style: containerStyle, children: [label && _jsx("span", { style: labelStyle, children: label }), _jsxs("div", { style: outerStyle, children: [_jsx("div", { ref: fillRef, style: fillStyle }), _jsx("div", { ref: flashRef, style: flashStyle })] })] }));
123
+ return (_jsxs("div", { class: "joydle-meter", style: containerStyle, children: [(label || icon) && (_jsxs("span", { style: { ...labelStyle, display: 'inline-flex', alignItems: 'center', gap: 3 }, children: [icon && _jsx("span", { style: { lineHeight: 0 }, children: icon({ size: 12, color: `var(${color}, #00f5ff)`, strokeWidth: 2 }) }), label] })), _jsxs("div", { style: outerStyle, children: [_jsx("div", { ref: fillRef, style: fillStyle }), _jsx("div", { ref: flashRef, style: flashStyle })] })] }));
132
124
  }
133
125
  //# sourceMappingURL=Meter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Meter.js","sourceRoot":"","sources":["../../src/hud/Meter.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Meter.js","sourceRoot":"","sources":["../../src/hud/Meter.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { JSX } from 'preact';
2
+ export interface ResourceDisplayProps {
3
+ /** Current resource amount. */
4
+ current: number;
5
+ /** Maximum resource amount. */
6
+ max: number;
7
+ /** Optional label (e.g. "AMMO", "MANA"). */
8
+ label?: string;
9
+ /** Render individual pip indicators instead of a numeric display. Default: false */
10
+ pips?: boolean;
11
+ /** Fraction below which the low-resource warning state activates (0–1). Default: 0.25 */
12
+ warnThreshold?: number;
13
+ /** Fill color for bars and pips. Default: var(--joydle-primary, #00f5ff) */
14
+ color?: string;
15
+ /** Color when in warn state. Default: var(--joydle-danger, #ff4444) */
16
+ warnColor?: string;
17
+ /** Font size in px for numeric display. Default: 22 */
18
+ fontSize?: number;
19
+ }
20
+ /**
21
+ * Ammo / mana / energy display with optional pip-bar visualization
22
+ * and automatic low-resource warning state.
23
+ *
24
+ * ```tsx
25
+ * <ResourceDisplay current={ammo} max={30} label="AMMO" pips />
26
+ * <ResourceDisplay current={mana} max={100} label="MP" warnThreshold={0.3} />
27
+ * ```
28
+ */
29
+ export declare function ResourceDisplay({ current, max, label, pips, warnThreshold, color, warnColor, fontSize, }: ResourceDisplayProps): JSX.Element;
30
+ //# sourceMappingURL=ResourceDisplay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResourceDisplay.d.ts","sourceRoot":"","sources":["../../src/hud/ResourceDisplay.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAIlC,MAAM,WAAW,oBAAoB;IACnC,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oFAAoF;IACpF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yFAAyF;IACzF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EACP,GAAG,EACH,KAAK,EACL,IAAY,EACZ,aAAoB,EACpB,KAAwC,EACxC,SAA2C,EAC3C,QAAa,GACd,EAAE,oBAAoB,GAAG,GAAG,CAAC,OAAO,CA0EpC"}
@@ -0,0 +1,49 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
+ // ---- Component ------------------------------------------------------------
3
+ /**
4
+ * Ammo / mana / energy display with optional pip-bar visualization
5
+ * and automatic low-resource warning state.
6
+ *
7
+ * ```tsx
8
+ * <ResourceDisplay current={ammo} max={30} label="AMMO" pips />
9
+ * <ResourceDisplay current={mana} max={100} label="MP" warnThreshold={0.3} />
10
+ * ```
11
+ */
12
+ export function ResourceDisplay({ current, max, label, pips = false, warnThreshold = 0.25, color = 'var(--joydle-primary, #00f5ff)', warnColor = 'var(--joydle-danger, #ff4444)', fontSize = 22, }) {
13
+ const ratio = max > 0 ? current / max : 0;
14
+ const isLow = ratio <= warnThreshold && current < max;
15
+ const activeColor = isLow ? warnColor : color;
16
+ return (_jsxs("div", { class: "joydle-resource-display", style: {
17
+ display: 'inline-flex',
18
+ flexDirection: 'column',
19
+ alignItems: 'flex-start',
20
+ gap: 3,
21
+ userSelect: 'none',
22
+ }, children: [label && (_jsx("span", { style: {
23
+ fontSize: '0.6rem',
24
+ letterSpacing: '0.1em',
25
+ color: 'var(--joydle-text-dim, rgba(255,255,255,0.4))',
26
+ textTransform: 'uppercase',
27
+ }, children: label })), pips ? (_jsx("div", { style: { display: 'flex', gap: 3, flexWrap: 'wrap', maxWidth: 120 }, children: Array.from({ length: max }, (_, i) => (_jsx("div", { style: {
28
+ width: 6,
29
+ height: 12,
30
+ borderRadius: 2,
31
+ background: i < current ? activeColor : 'rgba(255,255,255,0.1)',
32
+ boxShadow: i < current && isLow
33
+ ? `0 0 4px ${activeColor}`
34
+ : undefined,
35
+ transition: 'background 0.1s ease',
36
+ } }, i))) })) : (_jsxs("div", { style: { display: 'inline-flex', alignItems: 'baseline', gap: 4 }, children: [_jsx("span", { style: {
37
+ fontSize,
38
+ fontWeight: 900,
39
+ color: activeColor,
40
+ textShadow: isLow ? `0 0 8px ${activeColor}` : 'none',
41
+ lineHeight: 1,
42
+ transition: 'color 0.2s ease, text-shadow 0.2s ease',
43
+ }, children: current }), _jsxs("span", { style: {
44
+ fontSize: fontSize * 0.55,
45
+ color: 'var(--joydle-text-dim, rgba(255,255,255,0.3))',
46
+ lineHeight: 1,
47
+ }, children: ["/ ", max] })] }))] }));
48
+ }
49
+ //# sourceMappingURL=ResourceDisplay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResourceDisplay.js","sourceRoot":"","sources":["../../src/hud/ResourceDisplay.tsx"],"names":[],"mappings":";AA2BA,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,OAAO,EACP,GAAG,EACH,KAAK,EACL,IAAI,GAAG,KAAK,EACZ,aAAa,GAAG,IAAI,EACpB,KAAK,GAAG,gCAAgC,EACxC,SAAS,GAAG,+BAA+B,EAC3C,QAAQ,GAAG,EAAE,GACQ;IACrB,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,KAAK,IAAI,aAAa,IAAI,OAAO,GAAG,GAAG,CAAC;IACtD,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;IAE9C,OAAO,CACL,eACE,KAAK,EAAC,yBAAyB,EAC/B,KAAK,EAAE;YACL,OAAO,EAAE,aAAa;YACtB,aAAa,EAAE,QAAQ;YACvB,UAAU,EAAE,YAAY;YACxB,GAAG,EAAE,CAAC;YACN,UAAU,EAAE,MAAM;SACnB,aAEA,KAAK,IAAI,CACR,eACE,KAAK,EAAE;oBACL,QAAQ,EAAE,QAAQ;oBAClB,aAAa,EAAE,OAAO;oBACtB,KAAK,EAAE,+CAA+C;oBACtD,aAAa,EAAE,WAAW;iBAC3B,YAEA,KAAK,GACD,CACR,EAEA,IAAI,CAAC,CAAC,CAAC,CACN,cAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,YACrE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACrC,cAEE,KAAK,EAAE;wBACL,KAAK,EAAE,CAAC;wBACR,MAAM,EAAE,EAAE;wBACV,YAAY,EAAE,CAAC;wBACf,UAAU,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,uBAAuB;wBAC/D,SAAS,EAAE,CAAC,GAAG,OAAO,IAAI,KAAK;4BAC7B,CAAC,CAAC,WAAW,WAAW,EAAE;4BAC1B,CAAC,CAAC,SAAS;wBACb,UAAU,EAAE,sBAAsB;qBACnC,IAVI,CAAC,CAWN,CACH,CAAC,GACE,CACP,CAAC,CAAC,CAAC,CACF,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,aACpE,eACE,KAAK,EAAE;4BACL,QAAQ;4BACR,UAAU,EAAE,GAAG;4BACf,KAAK,EAAE,WAAW;4BAClB,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,WAAW,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM;4BACrD,UAAU,EAAE,CAAC;4BACb,UAAU,EAAE,wCAAwC;yBACrD,YAEA,OAAO,GACH,EACP,gBACE,KAAK,EAAE;4BACL,QAAQ,EAAE,QAAQ,GAAG,IAAI;4BACzB,KAAK,EAAE,+CAA+C;4BACtD,UAAU,EAAE,CAAC;yBACd,mBAEE,GAAG,IACD,IACH,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -1,7 +1,18 @@
1
1
  import type { JSX } from 'preact';
2
+ /** Icon prop — component ref or string name, same as Lives. */
3
+ export type ScoreIconProp = ((props: {
4
+ size?: number;
5
+ color?: string;
6
+ fill?: string;
7
+ strokeWidth?: number;
8
+ }) => JSX.Element) | string;
2
9
  export interface ScoreProps {
3
10
  /** Current score value. */
4
11
  value: number;
12
+ /** Optional icon displayed before the score value. */
13
+ icon?: ScoreIconProp;
14
+ /** Icon color override. Default: inherits from score color. */
15
+ iconColor?: string;
5
16
  }
6
17
  /**
7
18
  * Displays a formatted numeric score with a GSAP scale-pop animation
@@ -11,5 +22,5 @@ export interface ScoreProps {
11
22
  * <Score value={12500} />
12
23
  * ```
13
24
  */
14
- export declare function Score({ value }: ScoreProps): JSX.Element;
25
+ export declare function Score({ value, icon, iconColor }: ScoreProps): JSX.Element;
15
26
  //# sourceMappingURL=Score.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Score.d.ts","sourceRoot":"","sources":["../../src/hud/Score.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAclC,MAAM,WAAW,UAAU;IACzB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf;AAmBD;;;;;;;GAOG;AACH,wBAAgB,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,UAAU,GAAG,GAAG,CAAC,OAAO,CAkDxD"}
1
+ {"version":3,"file":"Score.d.ts","sourceRoot":"","sources":["../../src/hud/Score.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAKlC,+DAA+D;AAC/D,MAAM,MAAM,aAAa,GACrB,CAAC,CAAC,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,GAAG,CAAC,OAAO,CAAC,GAChG,MAAM,CAAC;AAEX,MAAM,WAAW,UAAU;IACzB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmBD;;;;;;;GAOG;AACH,wBAAgB,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,GAAG,CAAC,OAAO,CAkEzE"}