@joydle/ui 0.1.0 → 0.1.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.
- package/dist/controls/ActionButton.d.ts +10 -1
- package/dist/controls/ActionButton.d.ts.map +1 -1
- package/dist/controls/ActionButton.js +3 -3
- package/dist/controls/ActionButton.js.map +1 -1
- package/dist/controls/index.d.ts +1 -1
- package/dist/controls/index.d.ts.map +1 -1
- package/dist/controls/index.js.map +1 -1
- package/dist/deps.d.ts +11 -0
- package/dist/deps.d.ts.map +1 -0
- package/dist/deps.js +19 -0
- package/dist/deps.js.map +1 -0
- package/dist/fx/effects.d.ts +163 -0
- package/dist/fx/effects.d.ts.map +1 -0
- package/dist/fx/effects.js +337 -0
- package/dist/fx/effects.js.map +1 -0
- package/dist/fx/hooks.d.ts +100 -0
- package/dist/fx/hooks.d.ts.map +1 -0
- package/dist/fx/hooks.js +116 -0
- package/dist/fx/hooks.js.map +1 -0
- package/dist/fx/index.d.ts +15 -0
- package/dist/fx/index.d.ts.map +1 -0
- package/dist/fx/index.js +22 -0
- package/dist/fx/index.js.map +1 -0
- package/dist/hud/BottomHint.d.ts.map +1 -1
- package/dist/hud/BottomHint.js +1 -9
- package/dist/hud/BottomHint.js.map +1 -1
- package/dist/hud/ComboLabel.d.ts.map +1 -1
- package/dist/hud/ComboLabel.js +1 -9
- package/dist/hud/ComboLabel.js.map +1 -1
- package/dist/hud/Crosshair.d.ts +28 -0
- package/dist/hud/Crosshair.d.ts.map +1 -0
- package/dist/hud/Crosshair.js +93 -0
- package/dist/hud/Crosshair.js.map +1 -0
- package/dist/hud/EntityLabel.d.ts +46 -0
- package/dist/hud/EntityLabel.d.ts.map +1 -0
- package/dist/hud/EntityLabel.js +59 -0
- package/dist/hud/EntityLabel.js.map +1 -0
- package/dist/hud/FloatingNumbers.d.ts +43 -0
- package/dist/hud/FloatingNumbers.d.ts.map +1 -0
- package/dist/hud/FloatingNumbers.js +93 -0
- package/dist/hud/FloatingNumbers.js.map +1 -0
- package/dist/hud/HUD.d.ts +2 -0
- package/dist/hud/HUD.d.ts.map +1 -1
- package/dist/hud/HUD.js +11 -0
- package/dist/hud/HUD.js.map +1 -1
- package/dist/hud/Lives.d.ts +26 -5
- package/dist/hud/Lives.d.ts.map +1 -1
- package/dist/hud/Lives.js +30 -31
- package/dist/hud/Lives.js.map +1 -1
- package/dist/hud/Meter.d.ts +10 -1
- package/dist/hud/Meter.d.ts.map +1 -1
- package/dist/hud/Meter.js +3 -11
- package/dist/hud/Meter.js.map +1 -1
- package/dist/hud/ResourceDisplay.d.ts +30 -0
- package/dist/hud/ResourceDisplay.d.ts.map +1 -0
- package/dist/hud/ResourceDisplay.js +49 -0
- package/dist/hud/ResourceDisplay.js.map +1 -0
- package/dist/hud/Score.d.ts +12 -1
- package/dist/hud/Score.d.ts.map +1 -1
- package/dist/hud/Score.js +15 -12
- package/dist/hud/Score.js.map +1 -1
- package/dist/hud/StatDisplay.d.ts +33 -0
- package/dist/hud/StatDisplay.d.ts.map +1 -0
- package/dist/hud/StatDisplay.js +56 -0
- package/dist/hud/StatDisplay.js.map +1 -0
- package/dist/hud/Timer.d.ts.map +1 -1
- package/dist/hud/Timer.js +1 -9
- package/dist/hud/Timer.js.map +1 -1
- package/dist/hud/WaveLabel.d.ts.map +1 -1
- package/dist/hud/WaveLabel.js +1 -9
- package/dist/hud/WaveLabel.js.map +1 -1
- package/dist/hud/index.d.ts +8 -3
- package/dist/hud/index.d.ts.map +1 -1
- package/dist/hud/index.js +5 -0
- package/dist/hud/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/screens/GameOverScreen.d.ts.map +1 -1
- package/dist/screens/GameOverScreen.js +3 -10
- package/dist/screens/GameOverScreen.js.map +1 -1
- package/dist/screens/LoadingScreen.d.ts.map +1 -1
- package/dist/screens/LoadingScreen.js +1 -9
- package/dist/screens/LoadingScreen.js.map +1 -1
- package/dist/screens/LobbyScreen.d.ts.map +1 -1
- package/dist/screens/LobbyScreen.js +1 -9
- package/dist/screens/LobbyScreen.js.map +1 -1
- package/dist/screens/PauseOverlay.d.ts.map +1 -1
- package/dist/screens/PauseOverlay.js +1 -9
- package/dist/screens/PauseOverlay.js.map +1 -1
- package/dist/screens/TitleScreen.d.ts.map +1 -1
- package/dist/screens/TitleScreen.js +3 -10
- package/dist/screens/TitleScreen.js.map +1 -1
- package/dist/screens/index.d.ts +1 -0
- package/dist/screens/index.d.ts.map +1 -1
- package/dist/screens/index.js +1 -0
- package/dist/screens/index.js.map +1 -1
- package/dist/screens/primitives.d.ts +101 -0
- package/dist/screens/primitives.d.ts.map +1 -0
- package/dist/screens/primitives.js +239 -0
- package/dist/screens/primitives.js.map +1 -0
- package/dist/transitions/ScreenTransition.d.ts.map +1 -1
- package/dist/transitions/ScreenTransition.js +31 -40
- package/dist/transitions/ScreenTransition.js.map +1 -1
- package/package.json +13 -2
|
@@ -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: `var(--joydle-bg, #06060f)`. */
|
|
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,oEAAoE;IACpE,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,EAAgC,EAChC,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 = 'var(--joydle-bg, #06060f)', 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":"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"}
|
|
@@ -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;
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
87
|
-
const { from:
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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":";AAAA,8EAA8E;AAC9E,mDAAmD;AACnD,8EAA8E;AAE9E,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAyB,MAAM,WAAW,CAAC;
|
|
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.
|
|
3
|
+
"version": "0.1.1",
|
|
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": [
|
|
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",
|