@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
@@ -3,15 +3,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
3
3
  // @joydle/ui — Title screen with GSAP entrance animations
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 { ScreenFrame } from './primitives.js';
7
+ import { getGsap } from '../deps.js';
15
8
  // ---- Style injection ------------------------------------------------------
16
9
  const TITLE_SCREEN_CSS = `
17
10
  .joydle-title-screen {
@@ -214,7 +207,7 @@ function runFadeEntrance(refs) {
214
207
  * <TitleScreen title={<>KAOS <accent>NET</accent></>} onPlay={start} />
215
208
  * ```
216
209
  */
217
- export function TitleScreen({ title, subtitle, hint, onPlay, bestScore, entrance = 'stagger', backgroundSlot, screen: _screen, }) {
210
+ export function TitleScreen({ title, subtitle, hint, onPlay, buttonLabel, bestScore, entrance = 'stagger', backgroundSlot, style: styleProp, screen: _screen, }) {
218
211
  injectStyle();
219
212
  const overlayRef = useRef(null);
220
213
  const titleRef = useRef(null);
@@ -258,6 +251,6 @@ export function TitleScreen({ title, subtitle, hint, onPlay, bestScore, entrance
258
251
  };
259
252
  }, [entrance]);
260
253
  const showBest = bestScore != null && bestScore > 0;
261
- return (_jsxs("div", { class: "joydle-title-screen", ref: overlayRef, children: [backgroundSlot && (_jsx("div", { class: "joydle-title-screen__bg-slot", children: backgroundSlot })), _jsx("div", { class: "joydle-title-screen__backdrop" }), _jsxs("div", { class: "joydle-title-screen__content", children: [_jsx("h1", { class: "joydle-title-screen__title", ref: titleRef, children: title }), subtitle && (_jsx("p", { class: "joydle-title-screen__subtitle", ref: subtitleRef, children: subtitle })), showBest && (_jsxs("p", { class: "joydle-title-screen__best", ref: bestRef, children: ["BEST: ", bestScore.toLocaleString()] })), _jsx("button", { class: "joydle-title-screen__play-btn", ref: buttonRef, onClick: onPlay, type: "button", children: "PLAY" }), hint && (_jsx("p", { class: "joydle-title-screen__hint", ref: hintRef, children: hint }))] })] }));
254
+ return (_jsxs(ScreenFrame, { screen: _screen, onKeyStart: ['Space', 'Enter'], onStart: onPlay, children: [backgroundSlot && (_jsx("div", { class: "joydle-title-screen__bg-slot", children: backgroundSlot })), _jsx("div", { class: "joydle-title-screen__backdrop" }), _jsxs("div", { class: "joydle-title-screen__content", ref: overlayRef, children: [_jsx("h1", { class: "joydle-title-screen__title", ref: titleRef, style: styleProp?.title, children: title }), subtitle && (_jsx("p", { class: "joydle-title-screen__subtitle", ref: subtitleRef, style: styleProp?.subtitle, children: subtitle })), showBest && (_jsxs("p", { class: "joydle-title-screen__best", ref: bestRef, children: ["BEST: ", bestScore.toLocaleString()] })), _jsx("button", { class: "joydle-title-screen__play-btn joydle-screen-btn", ref: buttonRef, onClick: onPlay, type: "button", style: styleProp?.button, children: buttonLabel ?? 'PLAY' }), hint && (_jsx("p", { class: "joydle-title-screen__hint", ref: hintRef, children: hint }))] })] }));
262
255
  }
263
256
  //# sourceMappingURL=TitleScreen.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TitleScreen.js","sourceRoot":"","sources":["../../src/screens/TitleScreen.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TitleScreen.js","sourceRoot":"","sources":["../../src/screens/TitleScreen.tsx"],"names":[],"mappings":"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"}
@@ -4,4 +4,5 @@ export { GameOverScreen, type GameOverScreenProps, type GameOverEntrance } from
4
4
  export { PauseOverlay, type PauseOverlayProps } from './PauseOverlay';
5
5
  export { LoadingScreen, type LoadingScreenProps } from './LoadingScreen';
6
6
  export { LobbyScreen, type LobbyScreenProps, type LobbyPlayer } from './LobbyScreen';
7
+ export { ScreenFrame, type ScreenFrameProps, ScreenTitle, type ScreenTitleProps, ScreenButton, type ScreenButtonProps, ScreenHint, type ScreenHintProps, ScreenDivider, type ScreenDividerProps, ScreenMetrics, type ScreenMetricsProps } from './primitives.js';
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/screens/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACnG,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/screens/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACnG,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -7,4 +7,5 @@ export { GameOverScreen } from './GameOverScreen';
7
7
  export { PauseOverlay } from './PauseOverlay';
8
8
  export { LoadingScreen } from './LoadingScreen';
9
9
  export { LobbyScreen } from './LobbyScreen';
10
+ export { ScreenFrame, ScreenTitle, ScreenButton, ScreenHint, ScreenDivider, ScreenMetrics } from './primitives.js';
10
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/screens/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,sCAAsC;AACtC,8EAA8E;AAE9E,OAAO,EAAE,aAAa,EAA2B,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,WAAW,EAA6C,MAAM,eAAe,CAAC;AACvF,OAAO,EAAE,cAAc,EAAmD,MAAM,kBAAkB,CAAC;AACnG,OAAO,EAAE,YAAY,EAA0B,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,aAAa,EAA2B,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,WAAW,EAA2C,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/screens/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,sCAAsC;AACtC,8EAA8E;AAE9E,OAAO,EAAE,aAAa,EAA2B,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,WAAW,EAA6C,MAAM,eAAe,CAAC;AACvF,OAAO,EAAE,cAAc,EAAmD,MAAM,kBAAkB,CAAC;AACnG,OAAO,EAAE,YAAY,EAA0B,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,aAAa,EAA2B,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,WAAW,EAA2C,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,WAAW,EAAyB,WAAW,EAAyB,YAAY,EAA0B,UAAU,EAAwB,aAAa,EAA2B,aAAa,EAA2B,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,101 @@
1
+ import type { ComponentChildren, JSX } from 'preact';
2
+ export interface ScreenFrameProps {
3
+ /** Background color/value. Default: `'transparent'` (backdrop overlays handle darkening). */
4
+ bg?: string;
5
+ /** Keys that trigger onStart (e.g. `['Space', 'Enter']`). */
6
+ onKeyStart?: string[];
7
+ /** Called when a key from onKeyStart is pressed. */
8
+ onStart?: () => void;
9
+ /** Screen identifier for ScreenManager routing. */
10
+ screen?: string;
11
+ /** Additional class names. */
12
+ class?: string;
13
+ children?: ComponentChildren;
14
+ }
15
+ /**
16
+ * Composable screen frame — handles positioning, background, and keyboard shortcuts.
17
+ *
18
+ * Owns: container structure, keyboard handling, z-stacking.
19
+ * Does NOT own: layout of children, colors, fonts, animations.
20
+ *
21
+ * ```tsx
22
+ * <ScreenFrame onKeyStart={['Space']} onStart={startGame} bg="#0a0012">
23
+ * <ScreenTitle>MY GAME</ScreenTitle>
24
+ * <ScreenButton onClick={startGame}>PLAY</ScreenButton>
25
+ * </ScreenFrame>
26
+ * ```
27
+ */
28
+ export declare function ScreenFrame({ bg, onKeyStart, onStart, screen: _screen, class: className, children, }: ScreenFrameProps): JSX.Element;
29
+ export interface ScreenTitleProps {
30
+ /** Title color. Default: `var(--joydle-primary)`. */
31
+ color?: string;
32
+ /** Add a glow text-shadow. Default: true. */
33
+ glow?: boolean;
34
+ children?: ComponentChildren;
35
+ }
36
+ /**
37
+ * Screen title element — styled h1 matching the joydle title aesthetic.
38
+ * Supports `<accent>` children for secondary color highlights.
39
+ *
40
+ * ```tsx
41
+ * <ScreenTitle>DEAD FOREST</ScreenTitle>
42
+ * <ScreenTitle color="#8b0000">BLOOD <accent>RUNS</accent></ScreenTitle>
43
+ * ```
44
+ */
45
+ export declare function ScreenTitle({ color, glow, children, }: ScreenTitleProps): JSX.Element;
46
+ export interface ScreenButtonProps {
47
+ onClick: () => void;
48
+ /** Button background color. Default: `var(--joydle-accent)`. */
49
+ color?: string;
50
+ /** Button text color. Default: `var(--joydle-bg)`. */
51
+ textColor?: string;
52
+ type?: 'button' | 'submit';
53
+ children?: ComponentChildren;
54
+ }
55
+ /**
56
+ * Themed action button for screens.
57
+ *
58
+ * ```tsx
59
+ * <ScreenButton onClick={start}>PLAY</ScreenButton>
60
+ * <ScreenButton onClick={start} color="var(--joydle-danger)">RETRY</ScreenButton>
61
+ * ```
62
+ */
63
+ export declare function ScreenButton({ onClick, color, textColor, type, children, }: ScreenButtonProps): JSX.Element;
64
+ export interface ScreenHintProps {
65
+ /** Hint text color. Default: `var(--joydle-text-dim)`. */
66
+ color?: string;
67
+ children?: ComponentChildren;
68
+ }
69
+ /**
70
+ * Small hint/caption below the play button.
71
+ *
72
+ * ```tsx
73
+ * <ScreenHint>WASD move · CLICK fire</ScreenHint>
74
+ * ```
75
+ */
76
+ export declare function ScreenHint({ color, children }: ScreenHintProps): JSX.Element;
77
+ export interface ScreenDividerProps {
78
+ /** Line color. Default: `var(--joydle-primary)`. */
79
+ color?: string;
80
+ /** Line width (CSS value). Default: `'160px'`. */
81
+ width?: string;
82
+ }
83
+ /**
84
+ * Decorative horizontal divider with a gradient fade.
85
+ */
86
+ export declare function ScreenDivider({ color, width }: ScreenDividerProps): JSX.Element;
87
+ export interface ScreenMetricsProps {
88
+ /** Array of metric strings to display. */
89
+ items: string[];
90
+ /** Text color. Default: `var(--joydle-text-dim)`. */
91
+ color?: string;
92
+ }
93
+ /**
94
+ * Simple metric list for game-over or results screens.
95
+ *
96
+ * ```tsx
97
+ * <ScreenMetrics items={['Time: 1:23', 'Combo: 5x', 'Accuracy: 84%']} />
98
+ * ```
99
+ */
100
+ export declare function ScreenMetrics({ items, color }: ScreenMetricsProps): JSX.Element;
101
+ //# sourceMappingURL=primitives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../src/screens/primitives.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAyHrD,MAAM,WAAW,gBAAgB;IAC/B,6FAA6F;IAC7F,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,EAC1B,EAAkB,EAClB,UAAU,EACV,OAAO,EACP,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,SAAS,EAChB,QAAQ,GACT,EAAE,gBAAgB,GAAG,GAAG,CAAC,OAAO,CAuBhC;AAID,MAAM,WAAW,gBAAgB;IAC/B,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,IAAW,EACX,QAAQ,GACT,EAAE,gBAAgB,GAAG,GAAG,CAAC,OAAO,CAchC;AAID,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC3B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,KAAK,EACL,SAAS,EACT,IAAe,EACf,QAAQ,GACT,EAAE,iBAAiB,GAAG,GAAG,CAAC,OAAO,CAejC;AAID,MAAM,WAAW,eAAe;IAC9B,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,eAAe,GAAG,GAAG,CAAC,OAAO,CAQ5E;AAID,MAAM,WAAW,kBAAkB;IACjC,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,kBAAkB,GAAG,GAAG,CAAC,OAAO,CAQ/E;AAID,MAAM,WAAW,kBAAkB;IACjC,0CAA0C;IAC1C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,kBAAkB,GAAG,GAAG,CAAC,OAAO,CAc/E"}
@@ -0,0 +1,239 @@
1
+ import { jsx as _jsx, Fragment as _Fragment } from "preact/jsx-runtime";
2
+ // ---------------------------------------------------------------------------
3
+ // @joydle/ui/screens — Composable screen primitives
4
+ //
5
+ // Use these to build fully custom screens while getting keyboard shortcuts,
6
+ // entrance animation timing, and consistent joydle styling for free.
7
+ //
8
+ // Example (a horror game title screen):
9
+ // ```tsx
10
+ // <ScreenFrame onKeyStart={['Space','Enter']} onStart={startGame}>
11
+ // <img src="blood-logo.png" />
12
+ // <ScreenTitle color="#8b0000">DEAD FOREST</ScreenTitle>
13
+ // <ScreenHint>Find the key. Don't get caught.</ScreenHint>
14
+ // <ScreenButton onClick={startGame} color="var(--joydle-danger)">
15
+ // ENTER
16
+ // </ScreenButton>
17
+ // </ScreenFrame>
18
+ // ```
19
+ // ---------------------------------------------------------------------------
20
+ import { useEffect } from 'preact/hooks';
21
+ // ---- CSS injection ---------------------------------------------------------
22
+ const PRIMITIVES_CSS = `
23
+ .joydle-screen-frame {
24
+ position: absolute;
25
+ inset: 0;
26
+ z-index: 20;
27
+ overflow: hidden;
28
+ display: flex;
29
+ flex-direction: column;
30
+ align-items: center;
31
+ justify-content: center;
32
+ font-family: var(--joydle-font, sans-serif);
33
+ color: var(--joydle-text, #fff);
34
+ }
35
+
36
+ .joydle-screen-title {
37
+ font-size: clamp(2rem, 6vw, 4rem);
38
+ font-weight: 900;
39
+ letter-spacing: 0.04em;
40
+ color: var(--joydle-primary, #00f5ff);
41
+ text-transform: uppercase;
42
+ margin: 0;
43
+ line-height: 1.1;
44
+ text-align: center;
45
+ text-shadow: 0 0 var(--joydle-glow-blur, 0) var(--joydle-primary, #00f5ff);
46
+ }
47
+
48
+ .joydle-screen-title accent {
49
+ color: var(--joydle-accent, #ff2d7b);
50
+ text-shadow: 0 0 var(--joydle-glow-blur, 0) var(--joydle-accent, #ff2d7b);
51
+ }
52
+
53
+ .joydle-screen-hint {
54
+ font-size: 0.75rem;
55
+ color: var(--joydle-text-dim, rgba(255,255,255,0.5));
56
+ letter-spacing: 0.06em;
57
+ text-align: center;
58
+ margin: 0;
59
+ }
60
+
61
+ .joydle-screen-btn {
62
+ position: relative;
63
+ padding: 14px 48px;
64
+ font-size: 1.1rem;
65
+ font-weight: 700;
66
+ font-family: var(--joydle-font, sans-serif);
67
+ letter-spacing: 0.12em;
68
+ text-transform: uppercase;
69
+ color: var(--joydle-bg, #06060f);
70
+ background: var(--joydle-accent, #ff2d7b);
71
+ border: none;
72
+ border-radius: var(--joydle-border-radius, 4px);
73
+ cursor: pointer;
74
+ overflow: hidden;
75
+ transition: transform 0.15s ease, box-shadow 0.15s ease;
76
+ box-shadow: 0 0 var(--joydle-glow-blur, 0) var(--joydle-glow-spread, 0) var(--joydle-accent, #ff2d7b);
77
+ }
78
+
79
+ .joydle-screen-btn:hover {
80
+ transform: scale(1.05);
81
+ box-shadow: 0 0 16px 4px var(--joydle-accent, #ff2d7b);
82
+ }
83
+
84
+ .joydle-screen-btn:active {
85
+ transform: scale(0.97);
86
+ }
87
+
88
+ .joydle-screen-btn::after {
89
+ content: '';
90
+ position: absolute;
91
+ top: -50%;
92
+ left: -75%;
93
+ width: 50%;
94
+ height: 200%;
95
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,0.25), transparent);
96
+ transform: skewX(-20deg);
97
+ animation: joydle-btn-shine 3s ease-in-out infinite;
98
+ }
99
+
100
+ @keyframes joydle-btn-shine {
101
+ 0%, 100% { left: -75%; }
102
+ 50% { left: 125%; }
103
+ }
104
+
105
+ .joydle-screen-divider {
106
+ border: none;
107
+ height: 1px;
108
+ width: 160px;
109
+ background: linear-gradient(90deg, transparent, var(--joydle-primary, #00f5ff), transparent);
110
+ margin: 0;
111
+ opacity: 0.4;
112
+ }
113
+
114
+ .joydle-screen-metrics {
115
+ display: flex;
116
+ flex-direction: column;
117
+ align-items: center;
118
+ gap: 4px;
119
+ }
120
+
121
+ .joydle-screen-metric {
122
+ font-size: 0.85rem;
123
+ color: var(--joydle-text-dim, rgba(255,255,255,0.5));
124
+ letter-spacing: 0.04em;
125
+ }
126
+ `;
127
+ let primitivesStyleInjected = false;
128
+ function injectPrimitivesStyle() {
129
+ if (primitivesStyleInjected)
130
+ return;
131
+ primitivesStyleInjected = true;
132
+ const el = document.createElement('style');
133
+ el.textContent = PRIMITIVES_CSS;
134
+ document.head.appendChild(el);
135
+ }
136
+ /**
137
+ * Composable screen frame — handles positioning, background, and keyboard shortcuts.
138
+ *
139
+ * Owns: container structure, keyboard handling, z-stacking.
140
+ * Does NOT own: layout of children, colors, fonts, animations.
141
+ *
142
+ * ```tsx
143
+ * <ScreenFrame onKeyStart={['Space']} onStart={startGame} bg="#0a0012">
144
+ * <ScreenTitle>MY GAME</ScreenTitle>
145
+ * <ScreenButton onClick={startGame}>PLAY</ScreenButton>
146
+ * </ScreenFrame>
147
+ * ```
148
+ */
149
+ export function ScreenFrame({ bg = 'transparent', onKeyStart, onStart, screen: _screen, class: className, children, }) {
150
+ injectPrimitivesStyle();
151
+ useEffect(() => {
152
+ if (!onKeyStart?.length || !onStart)
153
+ return;
154
+ const handler = (e) => {
155
+ if (onKeyStart.includes(e.code)) {
156
+ e.preventDefault();
157
+ onStart();
158
+ }
159
+ };
160
+ window.addEventListener('keydown', handler);
161
+ return () => window.removeEventListener('keydown', handler);
162
+ }, [onKeyStart, onStart]);
163
+ return (_jsx("div", { class: `joydle-screen-frame${className ? ' ' + className : ''}`, style: { background: bg }, children: children }));
164
+ }
165
+ /**
166
+ * Screen title element — styled h1 matching the joydle title aesthetic.
167
+ * Supports `<accent>` children for secondary color highlights.
168
+ *
169
+ * ```tsx
170
+ * <ScreenTitle>DEAD FOREST</ScreenTitle>
171
+ * <ScreenTitle color="#8b0000">BLOOD <accent>RUNS</accent></ScreenTitle>
172
+ * ```
173
+ */
174
+ export function ScreenTitle({ color, glow = true, children, }) {
175
+ injectPrimitivesStyle();
176
+ const style = {};
177
+ if (color) {
178
+ style.color = color;
179
+ if (glow)
180
+ style.textShadow = `0 0 var(--joydle-glow-blur, 0) ${color}`;
181
+ }
182
+ return (_jsx("h1", { class: "joydle-screen-title", style: style, children: children }));
183
+ }
184
+ /**
185
+ * Themed action button for screens.
186
+ *
187
+ * ```tsx
188
+ * <ScreenButton onClick={start}>PLAY</ScreenButton>
189
+ * <ScreenButton onClick={start} color="var(--joydle-danger)">RETRY</ScreenButton>
190
+ * ```
191
+ */
192
+ export function ScreenButton({ onClick, color, textColor, type = 'button', children, }) {
193
+ injectPrimitivesStyle();
194
+ const style = {};
195
+ if (color) {
196
+ style.background = color;
197
+ style.boxShadow = `0 0 var(--joydle-glow-blur, 0) var(--joydle-glow-spread, 0) ${color}`;
198
+ }
199
+ if (textColor)
200
+ style.color = textColor;
201
+ return (_jsx("button", { class: "joydle-screen-btn", style: style, onClick: onClick, type: type, children: children }));
202
+ }
203
+ /**
204
+ * Small hint/caption below the play button.
205
+ *
206
+ * ```tsx
207
+ * <ScreenHint>WASD move · CLICK fire</ScreenHint>
208
+ * ```
209
+ */
210
+ export function ScreenHint({ color, children }) {
211
+ injectPrimitivesStyle();
212
+ return (_jsx("p", { class: "joydle-screen-hint", style: color ? { color } : {}, children: children }));
213
+ }
214
+ /**
215
+ * Decorative horizontal divider with a gradient fade.
216
+ */
217
+ export function ScreenDivider({ color, width }) {
218
+ injectPrimitivesStyle();
219
+ const style = {};
220
+ if (color)
221
+ style.background = `linear-gradient(90deg, transparent, ${color}, transparent)`;
222
+ if (width)
223
+ style.width = width;
224
+ return _jsx("hr", { class: "joydle-screen-divider", style: style });
225
+ }
226
+ /**
227
+ * Simple metric list for game-over or results screens.
228
+ *
229
+ * ```tsx
230
+ * <ScreenMetrics items={['Time: 1:23', 'Combo: 5x', 'Accuracy: 84%']} />
231
+ * ```
232
+ */
233
+ export function ScreenMetrics({ items, color }) {
234
+ injectPrimitivesStyle();
235
+ if (!items.length)
236
+ return _jsx(_Fragment, {});
237
+ return (_jsx("div", { class: "joydle-screen-metrics", children: items.map((m, i) => (_jsx("span", { class: "joydle-screen-metric", style: color ? { color } : {}, children: m }, i))) }));
238
+ }
239
+ //# sourceMappingURL=primitives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../src/screens/primitives.tsx"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,qDAAqD;AACrD,EAAE;AACF,6EAA6E;AAC7E,sEAAsE;AACtE,EAAE;AACF,yCAAyC;AACzC,UAAU;AACV,oEAAoE;AACpE,kCAAkC;AAClC,4DAA4D;AAC5D,8DAA8D;AAC9D,qEAAqE;AACrE,aAAa;AACb,qBAAqB;AACrB,kBAAkB;AAClB,OAAO;AACP,8EAA8E;AAE9E,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,+EAA+E;AAE/E,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwGtB,CAAC;AAEF,IAAI,uBAAuB,GAAG,KAAK,CAAC;AACpC,SAAS,qBAAqB;IAC5B,IAAI,uBAAuB;QAAE,OAAO;IACpC,uBAAuB,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC3C,EAAE,CAAC,WAAW,GAAG,cAAc,CAAC;IAChC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;AAChC,CAAC;AAkBD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,EAAE,GAAG,aAAa,EAClB,UAAU,EACV,OAAO,EACP,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,SAAS,EAChB,QAAQ,GACS;IACjB,qBAAqB,EAAE,CAAC;IAExB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,OAAO;YAAE,OAAO;QAC5C,MAAM,OAAO,GAAG,CAAC,CAAgB,EAAQ,EAAE;YACzC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,CAAC,CAAC,cAAc,EAAE,CAAC;gBACnB,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAE1B,OAAO,CACL,cACE,KAAK,EAAE,sBAAsB,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAC/D,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,YAExB,QAAQ,GACL,CACP,CAAC;AACJ,CAAC;AAYD;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,KAAK,EACL,IAAI,GAAG,IAAI,EACX,QAAQ,GACS;IACjB,qBAAqB,EAAE,CAAC;IAExB,MAAM,KAAK,GAAoC,EAAE,CAAC;IAClD,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QACpB,IAAI,IAAI;YAAE,KAAK,CAAC,UAAU,GAAG,kCAAkC,KAAK,EAAE,CAAC;IACzE,CAAC;IAED,OAAO,CACL,aAAI,KAAK,EAAC,qBAAqB,EAAC,KAAK,EAAE,KAAK,YACzC,QAAQ,GACN,CACN,CAAC;AACJ,CAAC;AAcD;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,OAAO,EACP,KAAK,EACL,SAAS,EACT,IAAI,GAAG,QAAQ,EACf,QAAQ,GACU;IAClB,qBAAqB,EAAE,CAAC;IAExB,MAAM,KAAK,GAAoC,EAAE,CAAC;IAClD,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;QACzB,KAAK,CAAC,SAAS,GAAG,+DAA+D,KAAK,EAAE,CAAC;IAC3F,CAAC;IACD,IAAI,SAAS;QAAE,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;IAEvC,OAAO,CACL,iBAAQ,KAAK,EAAC,mBAAmB,EAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,YACzE,QAAQ,GACF,CACV,CAAC;AACJ,CAAC;AAUD;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAmB;IAC7D,qBAAqB,EAAE,CAAC;IAExB,OAAO,CACL,YAAG,KAAK,EAAC,oBAAoB,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,YACxD,QAAQ,GACP,CACL,CAAC;AACJ,CAAC;AAWD;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,EAAsB;IAChE,qBAAqB,EAAE,CAAC;IAExB,MAAM,KAAK,GAAoC,EAAE,CAAC;IAClD,IAAI,KAAK;QAAE,KAAK,CAAC,UAAU,GAAG,uCAAuC,KAAK,gBAAgB,CAAC;IAC3F,IAAI,KAAK;QAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IAE/B,OAAO,aAAI,KAAK,EAAC,uBAAuB,EAAC,KAAK,EAAE,KAAK,GAAI,CAAC;AAC5D,CAAC;AAWD;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,EAAsB;IAChE,qBAAqB,EAAE,CAAC;IAExB,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,mBAAK,CAAC;IAEhC,OAAO,CACL,cAAK,KAAK,EAAC,uBAAuB,YAC/B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACnB,eAAc,KAAK,EAAC,sBAAsB,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,YACrE,CAAC,IADO,CAAC,CAEL,CACR,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ScreenTransition.d.ts","sourceRoot":"","sources":["../../src/transitions/ScreenTransition.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAehD,MAAM,WAAW,qBAAqB;IACpC,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAsBD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,UAAmB,EACnB,QAAQ,EACR,SAAS,EACT,QAAQ,GACT,EAAE,qBAAqB,gCAsFvB"}
1
+ {"version":3,"file":"ScreenTransition.d.ts","sourceRoot":"","sources":["../../src/transitions/ScreenTransition.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAMhD,MAAM,WAAW,qBAAqB;IACpC,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAsBD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,UAAmB,EACnB,QAAQ,EACR,SAAS,EACT,QAAQ,GACT,EAAE,qBAAqB,gCAiFvB"}
@@ -4,15 +4,7 @@ import { jsx as _jsx } from "preact/jsx-runtime";
4
4
  // ---------------------------------------------------------------------------
5
5
  import { useRef, useEffect } from 'preact/hooks';
6
6
  import { transitionPresets } from './presets';
7
- // ---- GSAP helper ----------------------------------------------------------
8
- function getGsap() {
9
- try {
10
- return globalThis.gsap ?? require('gsap').default;
11
- }
12
- catch {
13
- return null;
14
- }
15
- }
7
+ import { getGsap } from '../deps.js';
16
8
  // ---- Helpers --------------------------------------------------------------
17
9
  /**
18
10
  * Converts a `TransitionPreset` phase (enter or exit) into `gsap.fromTo`
@@ -49,30 +41,12 @@ export function ScreenTransition({ transition = 'fade', duration, activeKey, chi
49
41
  tlRef.current = null;
50
42
  }
51
43
  };
52
- // Enter animation on mount / key change.
44
+ // Animate on mount and on key change.
45
+ // When activeKey changes the children have already been swapped by the
46
+ // re-render, so we sequence: quick exit of the wrapper → enter with new
47
+ // content, all on the same element.
53
48
  useEffect(() => {
54
49
  const el = wrapperRef.current;
55
- if (!el || !preset)
56
- return;
57
- const gsap = getGsap();
58
- if (!gsap)
59
- return;
60
- killTimeline();
61
- const { from, to } = buildFromTo(preset.enter);
62
- const tl = gsap.timeline();
63
- tl.fromTo(el, from, { ...to, duration: dur, ease: 'power2.out' });
64
- tlRef.current = tl;
65
- return () => {
66
- killTimeline();
67
- };
68
- // Re-run when activeKey changes.
69
- // eslint-disable-next-line react-hooks/exhaustive-deps
70
- }, [activeKey]);
71
- // Handle key transitions: exit old, enter new.
72
- useEffect(() => {
73
- if (prevKeyRef.current === activeKey)
74
- return;
75
- const el = wrapperRef.current;
76
50
  if (!el || !preset) {
77
51
  prevKeyRef.current = activeKey;
78
52
  return;
@@ -83,15 +57,32 @@ export function ScreenTransition({ transition = 'fade', duration, activeKey, chi
83
57
  return;
84
58
  }
85
59
  killTimeline();
86
- // Quick exit of previous content.
87
- const { from: exitFrom, to: exitTo } = buildFromTo(preset.exit);
88
- const tl = gsap.timeline({
89
- onComplete: () => {
90
- prevKeyRef.current = activeKey;
91
- },
92
- });
93
- tl.fromTo(el, exitFrom, { ...exitTo, duration: dur * 0.4, ease: 'power2.in' });
94
- tlRef.current = tl;
60
+ const isInitial = prevKeyRef.current === activeKey;
61
+ const { from: enterFrom, to: enterTo } = buildFromTo(preset.enter);
62
+ if (isInitial) {
63
+ // First mount — just enter.
64
+ const tl = gsap.timeline();
65
+ tl.fromTo(el, enterFrom, { ...enterTo, duration: dur, ease: 'power2.out' });
66
+ tlRef.current = tl;
67
+ }
68
+ else {
69
+ // Key changed — exit then enter.
70
+ const { from: exitFrom, to: exitTo } = buildFromTo(preset.exit);
71
+ const tl = gsap.timeline({
72
+ onComplete: () => {
73
+ prevKeyRef.current = activeKey;
74
+ },
75
+ });
76
+ // Quick exit of previous visual state
77
+ tl.fromTo(el, exitFrom, { ...exitTo, duration: dur * 0.35, ease: 'power2.in' });
78
+ // Then enter with new content
79
+ tl.fromTo(el, enterFrom, { ...enterTo, duration: dur, ease: 'power2.out' });
80
+ tlRef.current = tl;
81
+ prevKeyRef.current = activeKey;
82
+ }
83
+ return () => {
84
+ killTimeline();
85
+ };
95
86
  // eslint-disable-next-line react-hooks/exhaustive-deps
96
87
  }, [activeKey]);
97
88
  // Cleanup on unmount.
@@ -1 +1 @@
1
- {"version":3,"file":"ScreenTransition.js","sourceRoot":"","sources":["../../src/transitions/ScreenTransition.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ScreenTransition.js","sourceRoot":"","sources":["../../src/transitions/ScreenTransition.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@joydle/ui",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -28,9 +28,15 @@
28
28
  "./transitions": {
29
29
  "types": "./dist/transitions/index.d.ts",
30
30
  "import": "./dist/transitions/index.js"
31
+ },
32
+ "./fx": {
33
+ "types": "./dist/fx/index.d.ts",
34
+ "import": "./dist/fx/index.js"
31
35
  }
32
36
  },
33
- "files": ["dist"],
37
+ "files": [
38
+ "dist"
39
+ ],
34
40
  "scripts": {
35
41
  "build": "tsc",
36
42
  "typecheck": "tsc --noEmit",
@@ -45,15 +51,20 @@
45
51
  "author": "Joydle <contact@joydle.dev>",
46
52
  "homepage": "https://joydle.dev",
47
53
  "peerDependencies": {
54
+ "@joydle/icons": "^0.1.0",
48
55
  "gsap": "^3.12",
49
56
  "preact": "^10.19"
50
57
  },
51
58
  "peerDependenciesMeta": {
59
+ "@joydle/icons": {
60
+ "optional": true
61
+ },
52
62
  "gsap": {
53
63
  "optional": true
54
64
  }
55
65
  },
56
66
  "devDependencies": {
67
+ "gsap": "^3.12",
57
68
  "jsdom": "^28.1.0",
58
69
  "preact": "^10.19.0",
59
70
  "typescript": "^5.4.0",