@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.
- 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 +12 -2
- package/dist/screens/GameOverScreen.d.ts.map +1 -1
- package/dist/screens/GameOverScreen.js +12 -11
- 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 +9 -1
- package/dist/screens/TitleScreen.d.ts.map +1 -1
- package/dist/screens/TitleScreen.js +4 -11
- 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,11 +1,20 @@
|
|
|
1
1
|
import type { JSX } from 'preact';
|
|
2
2
|
export type ActionButtonSize = 'small' | 'medium' | 'large';
|
|
3
|
+
/** Icon prop — component ref for button icon. */
|
|
4
|
+
export type ActionButtonIconProp = ((props: {
|
|
5
|
+
size?: number;
|
|
6
|
+
color?: string;
|
|
7
|
+
fill?: string;
|
|
8
|
+
strokeWidth?: number;
|
|
9
|
+
}) => JSX.Element);
|
|
3
10
|
export interface ActionButtonProps {
|
|
4
11
|
position: 'bottom-left' | 'bottom-right' | 'fullscreen';
|
|
5
12
|
label: string;
|
|
6
13
|
action?: string;
|
|
7
14
|
size?: ActionButtonSize;
|
|
8
15
|
opacity?: number;
|
|
16
|
+
/** Optional icon to display inside the button. */
|
|
17
|
+
icon?: ActionButtonIconProp;
|
|
9
18
|
/**
|
|
10
19
|
* When rendered inside an ActionButtonGroup, positioning is managed by the
|
|
11
20
|
* parent. Setting `_managed` suppresses fixed positioning and the media
|
|
@@ -14,5 +23,5 @@ export interface ActionButtonProps {
|
|
|
14
23
|
*/
|
|
15
24
|
_managed?: boolean;
|
|
16
25
|
}
|
|
17
|
-
export declare function ActionButton({ position, label, action, size, opacity, _managed, }: ActionButtonProps): JSX.Element;
|
|
26
|
+
export declare function ActionButton({ position, label, action, size, opacity, icon, _managed, }: ActionButtonProps): JSX.Element;
|
|
18
27
|
//# sourceMappingURL=ActionButton.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionButton.d.ts","sourceRoot":"","sources":["../../src/controls/ActionButton.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAKlC,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE5D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,aAAa,GAAG,cAAc,GAAG,YAAY,CAAC;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA6BD,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,KAAK,EACL,MAAiB,EACjB,IAAe,EACf,OAAa,EACb,QAAgB,GACjB,EAAE,iBAAiB,GAAG,GAAG,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"ActionButton.d.ts","sourceRoot":"","sources":["../../src/controls/ActionButton.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAKlC,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE5D,iDAAiD;AACjD,MAAM,MAAM,oBAAoB,GAC5B,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,iBAAiB;IAChC,QAAQ,EAAE,aAAa,GAAG,cAAc,GAAG,YAAY,CAAC;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,IAAI,CAAC,EAAE,oBAAoB,CAAC;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA6BD,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,KAAK,EACL,MAAiB,EACjB,IAAe,EACf,OAAa,EACb,IAAI,EACJ,QAAgB,GACjB,EAAE,iBAAiB,GAAG,GAAG,CAAC,OAAO,CAqHjC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx } from "preact/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
|
|
2
2
|
// ---------------------------------------------------------------------------
|
|
3
3
|
// @joydle/ui — Single action button (touch)
|
|
4
4
|
// ---------------------------------------------------------------------------
|
|
@@ -26,7 +26,7 @@ function injectStyle() {
|
|
|
26
26
|
document.head.appendChild(el);
|
|
27
27
|
}
|
|
28
28
|
// ---- Component ------------------------------------------------------------
|
|
29
|
-
export function ActionButton({ position, label, action = 'action', size = 'medium', opacity = 0.6, _managed = false, }) {
|
|
29
|
+
export function ActionButton({ position, label, action = 'action', size = 'medium', opacity = 0.6, icon, _managed = false, }) {
|
|
30
30
|
const ctx = useContext(GameContext);
|
|
31
31
|
const inputManager = ctx?.inputManager ?? null;
|
|
32
32
|
const pressedRef = useRef(false);
|
|
@@ -103,6 +103,6 @@ export function ActionButton({ position, label, action = 'action', size = 'mediu
|
|
|
103
103
|
else {
|
|
104
104
|
baseStyle.opacity = opacity;
|
|
105
105
|
}
|
|
106
|
-
return (_jsx("div", { class: _managed ? undefined : 'joydle-action-btn', style: baseStyle, onTouchStart: handleTouchStart, onTouchEnd: handleTouchEnd, onTouchCancel: handleTouchEnd, children: label }));
|
|
106
|
+
return (_jsx("div", { class: _managed ? undefined : 'joydle-action-btn', style: baseStyle, onTouchStart: handleTouchStart, onTouchEnd: handleTouchEnd, onTouchCancel: handleTouchEnd, children: icon ? (_jsxs("span", { style: { lineHeight: 0, display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 2 }, children: [icon({ size: Math.round(px * 0.4), color: 'white', strokeWidth: 2 }), label && _jsx("span", { style: { fontSize: Math.round(px * 0.18), lineHeight: 1 }, children: label })] })) : (label) }));
|
|
107
107
|
}
|
|
108
108
|
//# sourceMappingURL=ActionButton.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionButton.js","sourceRoot":"","sources":["../../src/controls/ActionButton.tsx"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,6CAA6C;AAC7C,8EAA8E;AAE9E,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE/D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"ActionButton.js","sourceRoot":"","sources":["../../src/controls/ActionButton.tsx"],"names":[],"mappings":"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"}
|
package/dist/controls/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { TouchDPad, type TouchDPadProps } from './TouchDPad.js';
|
|
2
2
|
export { Joystick, type JoystickProps } from './Joystick.js';
|
|
3
|
-
export { ActionButton, type ActionButtonProps, type ActionButtonSize, } from './ActionButton.js';
|
|
3
|
+
export { ActionButton, type ActionButtonProps, type ActionButtonSize, type ActionButtonIconProp, } from './ActionButton.js';
|
|
4
4
|
export { ActionButtonGroup, type ActionButtonGroupProps, type ActionButtonConfig, } from './ActionButtonGroup.js';
|
|
5
5
|
export { SwipeZone, type SwipeZoneProps, type SwipeDirection, } from './SwipeZone.js';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/controls/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/controls/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,GACxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,SAAS,EACT,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,gBAAgB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/controls/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,uCAAuC;AACvC,8EAA8E;AAE9E,OAAO,EAAE,SAAS,EAAuB,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAsB,MAAM,eAAe,CAAC;AAC7D,OAAO,EACL,YAAY,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/controls/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,uCAAuC;AACvC,8EAA8E;AAE9E,OAAO,EAAE,SAAS,EAAuB,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAsB,MAAM,eAAe,CAAC;AAC7D,OAAO,EACL,YAAY,GAIb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,iBAAiB,GAGlB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,SAAS,GAGV,MAAM,gBAAgB,CAAC"}
|
package/dist/deps.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
type GsapCore = typeof import('gsap').default;
|
|
2
|
+
/**
|
|
3
|
+
* Provide peer dependencies for @joydle/ui.
|
|
4
|
+
* Call once at app startup before rendering any UI components.
|
|
5
|
+
*/
|
|
6
|
+
export declare function configure(deps: {
|
|
7
|
+
gsap?: GsapCore;
|
|
8
|
+
}): void;
|
|
9
|
+
export declare function getGsap(): GsapCore;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=deps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../src/deps.ts"],"names":[],"mappings":"AAIA,KAAK,QAAQ,GAAG,cAAc,MAAM,EAAE,OAAO,CAAC;AAI9C;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,QAAQ,CAAA;CAAE,GAAG,IAAI,CAEzD;AAED,wBAAgB,OAAO,IAAI,QAAQ,CAOlC"}
|
package/dist/deps.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// @joydle/ui — Centralized dependency injection
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
let _gsap = null;
|
|
5
|
+
/**
|
|
6
|
+
* Provide peer dependencies for @joydle/ui.
|
|
7
|
+
* Call once at app startup before rendering any UI components.
|
|
8
|
+
*/
|
|
9
|
+
export function configure(deps) {
|
|
10
|
+
if (deps.gsap)
|
|
11
|
+
_gsap = deps.gsap;
|
|
12
|
+
}
|
|
13
|
+
export function getGsap() {
|
|
14
|
+
if (!_gsap) {
|
|
15
|
+
throw new Error('[@joydle/ui] gsap not configured. Call configure({ gsap }) first.');
|
|
16
|
+
}
|
|
17
|
+
return _gsap;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=deps.js.map
|
package/dist/deps.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deps.js","sourceRoot":"","sources":["../src/deps.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,iDAAiD;AACjD,8EAA8E;AAI9E,IAAI,KAAK,GAAoB,IAAI,CAAC;AAElC;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAyB;IACjD,IAAI,IAAI,CAAC,IAAI;QAAE,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import type { JSX } from 'preact';
|
|
2
|
+
import type { AlertState, BannerState, KillState, BeamState } from './hooks.js';
|
|
3
|
+
export interface DamageFlashProps {
|
|
4
|
+
/** Trigger a flash on every truthy change. */
|
|
5
|
+
active: boolean;
|
|
6
|
+
/** Flash color. Default: `var(--joydle-danger, #ff0033)`. */
|
|
7
|
+
color?: string;
|
|
8
|
+
/** Flash duration in ms. Default: 250. */
|
|
9
|
+
duration?: number;
|
|
10
|
+
/** Peak opacity (0–1). Default: 0.7. */
|
|
11
|
+
intensity?: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Full-screen color flash — ideal for taking damage, screen hit, health critical.
|
|
15
|
+
*
|
|
16
|
+
* ```tsx
|
|
17
|
+
* <DamageFlash active={playerHit} color="#ff0033" duration={250} />
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare function DamageFlash({ active, color, duration, intensity, }: DamageFlashProps): JSX.Element;
|
|
21
|
+
export interface VignetteProps {
|
|
22
|
+
/** Current health value (0–maxHp). */
|
|
23
|
+
hp: number;
|
|
24
|
+
/** Maximum health value. Default: 100. */
|
|
25
|
+
maxHp?: number;
|
|
26
|
+
/** HP threshold below which vignette appears (0–1 fraction). Default: 0.3. */
|
|
27
|
+
threshold?: number;
|
|
28
|
+
/** Vignette color. Default: `var(--joydle-danger, #ff0033)`. */
|
|
29
|
+
color?: string;
|
|
30
|
+
/** Pulse the vignette opacity when active. Default: true. */
|
|
31
|
+
pulse?: boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Health-state edge vignette — darkens/tints screen edges as HP drops.
|
|
35
|
+
*
|
|
36
|
+
* ```tsx
|
|
37
|
+
* <Vignette hp={hp} maxHp={100} threshold={0.3} color="#ff0000" />
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare function Vignette({ hp, maxHp, threshold, color, pulse, }: VignetteProps): JSX.Element;
|
|
41
|
+
export interface CRTOverlayProps {
|
|
42
|
+
/** Scanline opacity multiplier. Default: 0.06. */
|
|
43
|
+
opacity?: number;
|
|
44
|
+
/** Vignette strength (0–1). Default: 0.35. */
|
|
45
|
+
vignetteStrength?: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* CRT monitor effect — scanlines + edge vignette.
|
|
49
|
+
* Place above the canvas layer for an authentic retro look.
|
|
50
|
+
*
|
|
51
|
+
* ```tsx
|
|
52
|
+
* <CRTOverlay opacity={0.06} vignetteStrength={0.35} />
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare function CRTOverlay({ opacity, vignetteStrength, }: CRTOverlayProps): JSX.Element;
|
|
56
|
+
export interface AlertBannerProps {
|
|
57
|
+
/** Alert state from useAlerts(). */
|
|
58
|
+
alert: AlertState | null;
|
|
59
|
+
/** Vertical position (CSS value). Default: `'32%'`. */
|
|
60
|
+
position?: string;
|
|
61
|
+
/** Main text font size in px. Default: 42. */
|
|
62
|
+
fontSize?: number;
|
|
63
|
+
/** Main text color. Default: `var(--joydle-danger, #ff0033)`. */
|
|
64
|
+
color?: string;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Cinematic alert banner — large text reveal with auto-dismiss.
|
|
68
|
+
*
|
|
69
|
+
* ```tsx
|
|
70
|
+
* const { alert, showAlert } = useAlerts();
|
|
71
|
+
* <AlertBanner alert={alert} color="#ff0033" />
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export declare function AlertBanner({ alert, position, fontSize, color, }: AlertBannerProps): JSX.Element;
|
|
75
|
+
export interface WaveBannerProps {
|
|
76
|
+
/** Banner state from useWaveBanner(). */
|
|
77
|
+
banner: BannerState | null;
|
|
78
|
+
/** Title color. Default: `var(--joydle-danger, #ff0033)`. */
|
|
79
|
+
color?: string;
|
|
80
|
+
/** Sub-label text after count. Default: `'ENEMIES INCOMING'`. */
|
|
81
|
+
countLabel?: string;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Full-screen wave announcement overlay.
|
|
85
|
+
*
|
|
86
|
+
* ```tsx
|
|
87
|
+
* const { banner, showWave } = useWaveBanner();
|
|
88
|
+
* showWave(3, 8);
|
|
89
|
+
* <WaveBanner banner={banner} />
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
export declare function WaveBanner({ banner, color, countLabel, }: WaveBannerProps): JSX.Element;
|
|
93
|
+
export interface MuzzleFlashProps {
|
|
94
|
+
/** Trigger a flash on every truthy change. */
|
|
95
|
+
active: boolean;
|
|
96
|
+
/** Flash color. Default: `var(--joydle-accent, #ff6a00)`. */
|
|
97
|
+
color?: string;
|
|
98
|
+
/** Bottom offset (CSS value). Default: `'18%'`. */
|
|
99
|
+
position?: string;
|
|
100
|
+
/** Size in px. Default: 80. */
|
|
101
|
+
size?: number;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Muzzle / weapon flash overlay at screen bottom-center.
|
|
105
|
+
*
|
|
106
|
+
* ```tsx
|
|
107
|
+
* <MuzzleFlash active={firing} color="#ff6a00" />
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
export declare function MuzzleFlash({ active, color, position, size, }: MuzzleFlashProps): JSX.Element;
|
|
111
|
+
export interface KillConfirmProps {
|
|
112
|
+
/** Kill states from useKillConfirm(). */
|
|
113
|
+
kills: KillState[];
|
|
114
|
+
/** Icon/symbol to display. Default: `'×'`. */
|
|
115
|
+
icon?: string;
|
|
116
|
+
/** Marker color. Default: `var(--joydle-accent, #ff6a00)`. */
|
|
117
|
+
color?: string;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Animated kill confirmation markers that appear at random screen positions.
|
|
121
|
+
*
|
|
122
|
+
* ```tsx
|
|
123
|
+
* const { kills, addKill } = useKillConfirm();
|
|
124
|
+
* <KillConfirm kills={kills} icon="×" />
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
export declare function KillConfirm({ kills, icon, color, }: KillConfirmProps): JSX.Element;
|
|
128
|
+
export interface WarningStripesProps {
|
|
129
|
+
/** Show the stripes. */
|
|
130
|
+
active: boolean;
|
|
131
|
+
/** Stripe color. Default: `var(--joydle-gold, #ffd600)`. */
|
|
132
|
+
color?: string;
|
|
133
|
+
/** Stripe height in px. Default: 3. */
|
|
134
|
+
height?: number;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Animated hazard-stripe bars at screen top and bottom.
|
|
138
|
+
* Great for wave start, danger zones, time pressure.
|
|
139
|
+
*
|
|
140
|
+
* ```tsx
|
|
141
|
+
* <WarningStripes active={wavePending} color="#ffd600" />
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
export declare function WarningStripes({ active, color, height, }: WarningStripesProps): JSX.Element;
|
|
145
|
+
export interface ScreenBeamProps {
|
|
146
|
+
/** Beam states from useBeamEffect(). */
|
|
147
|
+
beams: BeamState[];
|
|
148
|
+
/** Beam color. Default: `var(--joydle-danger, #ff0033)`. */
|
|
149
|
+
color?: string;
|
|
150
|
+
/** Beam height in px. Default: 4. */
|
|
151
|
+
height?: number;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Horizontal beam / energy ray flashes across the screen.
|
|
155
|
+
* Use for enemy attacks, explosions, special effects.
|
|
156
|
+
*
|
|
157
|
+
* ```tsx
|
|
158
|
+
* const { beams, addBeam } = useBeamEffect();
|
|
159
|
+
* <ScreenBeam beams={beams} color="#ff0033" />
|
|
160
|
+
* ```
|
|
161
|
+
*/
|
|
162
|
+
export declare function ScreenBeam({ beams, color, height, }: ScreenBeamProps): JSX.Element;
|
|
163
|
+
//# sourceMappingURL=effects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effects.d.ts","sourceRoot":"","sources":["../../src/fx/effects.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// @joydle/ui/fx — Composable screen effects
|
|
4
|
+
// All effects default to theme CSS vars but accept overrides for full variety.
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
import { useState, useEffect } from 'preact/hooks';
|
|
7
|
+
// ---- CSS injection (shared keyframes) -------------------------------------
|
|
8
|
+
const FX_CSS = `
|
|
9
|
+
@keyframes joydle-damage-flash {
|
|
10
|
+
0% { opacity: var(--joydle-fx-intensity, 0.7); }
|
|
11
|
+
100% { opacity: 0; }
|
|
12
|
+
}
|
|
13
|
+
@keyframes joydle-vignette-pulse {
|
|
14
|
+
0%, 100% { opacity: 0.6; }
|
|
15
|
+
50% { opacity: 0.3; }
|
|
16
|
+
}
|
|
17
|
+
@keyframes joydle-muzzle-flash {
|
|
18
|
+
0% { opacity: 1; transform: translateX(-50%) scale(0.5); }
|
|
19
|
+
100% { opacity: 0; transform: translateX(-50%) scale(1.2); }
|
|
20
|
+
}
|
|
21
|
+
@keyframes joydle-alert-reveal {
|
|
22
|
+
0% { opacity: 0; letter-spacing: 30px; }
|
|
23
|
+
15% { opacity: 1; letter-spacing: 12px; }
|
|
24
|
+
75% { opacity: 1; }
|
|
25
|
+
100% { opacity: 0; transform: translateX(-50%) translateY(-15px); }
|
|
26
|
+
}
|
|
27
|
+
@keyframes joydle-wave-banner {
|
|
28
|
+
0% { opacity: 0; }
|
|
29
|
+
8% { opacity: 1; }
|
|
30
|
+
65% { opacity: 1; }
|
|
31
|
+
100% { opacity: 0; }
|
|
32
|
+
}
|
|
33
|
+
@keyframes joydle-kill-cross {
|
|
34
|
+
0% { transform: scale(0.2); opacity: 1; }
|
|
35
|
+
30% { transform: scale(1.6); opacity: 0.8; }
|
|
36
|
+
100% { transform: scale(3); opacity: 0; }
|
|
37
|
+
}
|
|
38
|
+
@keyframes joydle-warning-scroll {
|
|
39
|
+
from { background-position: 0; }
|
|
40
|
+
to { background-position: 16px; }
|
|
41
|
+
}
|
|
42
|
+
@keyframes joydle-beam-flash {
|
|
43
|
+
0% { opacity: 0; transform: scaleX(0); }
|
|
44
|
+
10% { opacity: 1; transform: scaleX(1); }
|
|
45
|
+
70% { opacity: 1; }
|
|
46
|
+
100% { opacity: 0; }
|
|
47
|
+
}
|
|
48
|
+
`;
|
|
49
|
+
let fxStyleInjected = false;
|
|
50
|
+
function injectFxStyle() {
|
|
51
|
+
if (fxStyleInjected)
|
|
52
|
+
return;
|
|
53
|
+
fxStyleInjected = true;
|
|
54
|
+
const el = document.createElement('style');
|
|
55
|
+
el.textContent = FX_CSS;
|
|
56
|
+
document.head.appendChild(el);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Full-screen color flash — ideal for taking damage, screen hit, health critical.
|
|
60
|
+
*
|
|
61
|
+
* ```tsx
|
|
62
|
+
* <DamageFlash active={playerHit} color="#ff0033" duration={250} />
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export function DamageFlash({ active, color = 'var(--joydle-danger, #ff0033)', duration = 250, intensity = 0.7, }) {
|
|
66
|
+
injectFxStyle();
|
|
67
|
+
const [show, setShow] = useState(false);
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
if (!active)
|
|
70
|
+
return;
|
|
71
|
+
setShow(true);
|
|
72
|
+
const t = setTimeout(() => setShow(false), duration);
|
|
73
|
+
return () => clearTimeout(t);
|
|
74
|
+
}, [active, duration]);
|
|
75
|
+
if (!show)
|
|
76
|
+
return _jsx(_Fragment, {});
|
|
77
|
+
return (_jsx("div", { style: {
|
|
78
|
+
position: 'fixed',
|
|
79
|
+
inset: 0,
|
|
80
|
+
zIndex: 45,
|
|
81
|
+
pointerEvents: 'none',
|
|
82
|
+
background: `radial-gradient(ellipse, transparent 20%, ${color} 100%)`,
|
|
83
|
+
opacity: intensity,
|
|
84
|
+
animation: `joydle-damage-flash ${duration / 1000}s ease-out forwards`,
|
|
85
|
+
} }));
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Health-state edge vignette — darkens/tints screen edges as HP drops.
|
|
89
|
+
*
|
|
90
|
+
* ```tsx
|
|
91
|
+
* <Vignette hp={hp} maxHp={100} threshold={0.3} color="#ff0000" />
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export function Vignette({ hp, maxHp = 100, threshold = 0.3, color = 'var(--joydle-danger, #ff0033)', pulse = true, }) {
|
|
95
|
+
injectFxStyle();
|
|
96
|
+
const pct = hp / maxHp;
|
|
97
|
+
if (pct >= threshold)
|
|
98
|
+
return _jsx(_Fragment, {});
|
|
99
|
+
return (_jsx("div", { style: {
|
|
100
|
+
position: 'fixed',
|
|
101
|
+
inset: 0,
|
|
102
|
+
zIndex: 44,
|
|
103
|
+
pointerEvents: 'none',
|
|
104
|
+
background: `radial-gradient(ellipse, transparent 40%, ${color}40 100%)`,
|
|
105
|
+
animation: pulse ? 'joydle-vignette-pulse 1.5s infinite' : 'none',
|
|
106
|
+
transition: 'opacity 0.5s',
|
|
107
|
+
} }));
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* CRT monitor effect — scanlines + edge vignette.
|
|
111
|
+
* Place above the canvas layer for an authentic retro look.
|
|
112
|
+
*
|
|
113
|
+
* ```tsx
|
|
114
|
+
* <CRTOverlay opacity={0.06} vignetteStrength={0.35} />
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
export function CRTOverlay({ opacity = 0.06, vignetteStrength = 0.35, }) {
|
|
118
|
+
return (_jsx("div", { style: {
|
|
119
|
+
position: 'fixed',
|
|
120
|
+
top: 0,
|
|
121
|
+
left: 0,
|
|
122
|
+
width: '100%',
|
|
123
|
+
height: '100%',
|
|
124
|
+
zIndex: 100,
|
|
125
|
+
pointerEvents: 'none',
|
|
126
|
+
background: `repeating-linear-gradient(0deg, rgba(0,0,0,${opacity}) 0px, rgba(0,0,0,${opacity}) 1px, transparent 1px, transparent 3px)`,
|
|
127
|
+
mixBlendMode: 'multiply',
|
|
128
|
+
}, children: _jsx("div", { style: {
|
|
129
|
+
position: 'absolute',
|
|
130
|
+
inset: 0,
|
|
131
|
+
background: `radial-gradient(ellipse at center, transparent 55%, rgba(0,0,0,${vignetteStrength}) 100%)`,
|
|
132
|
+
} }) }));
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Cinematic alert banner — large text reveal with auto-dismiss.
|
|
136
|
+
*
|
|
137
|
+
* ```tsx
|
|
138
|
+
* const { alert, showAlert } = useAlerts();
|
|
139
|
+
* <AlertBanner alert={alert} color="#ff0033" />
|
|
140
|
+
* ```
|
|
141
|
+
*/
|
|
142
|
+
export function AlertBanner({ alert, position = '32%', fontSize = 42, color = 'var(--joydle-danger, #ff0033)', }) {
|
|
143
|
+
injectFxStyle();
|
|
144
|
+
if (!alert)
|
|
145
|
+
return _jsx(_Fragment, {});
|
|
146
|
+
return (_jsxs("div", { style: {
|
|
147
|
+
position: 'fixed',
|
|
148
|
+
top: position,
|
|
149
|
+
left: '50%',
|
|
150
|
+
transform: 'translateX(-50%)',
|
|
151
|
+
zIndex: 55,
|
|
152
|
+
textAlign: 'center',
|
|
153
|
+
pointerEvents: 'none',
|
|
154
|
+
animation: 'joydle-alert-reveal 1.8s ease-out forwards',
|
|
155
|
+
}, children: [_jsx("div", { style: {
|
|
156
|
+
fontFamily: 'var(--joydle-font, sans-serif)',
|
|
157
|
+
fontSize,
|
|
158
|
+
fontWeight: 900,
|
|
159
|
+
color,
|
|
160
|
+
letterSpacing: 12,
|
|
161
|
+
textShadow: `0 0 35px ${color}`,
|
|
162
|
+
}, children: alert.main }), alert.sub && (_jsx("div", { style: {
|
|
163
|
+
fontFamily: 'var(--joydle-font, sans-serif)',
|
|
164
|
+
fontSize: fontSize * 0.3,
|
|
165
|
+
color: 'var(--joydle-accent, #ff6a00)',
|
|
166
|
+
letterSpacing: 8,
|
|
167
|
+
marginTop: 6,
|
|
168
|
+
opacity: 0.7,
|
|
169
|
+
}, children: alert.sub })), alert.jp && (_jsx("div", { style: {
|
|
170
|
+
fontSize: fontSize * 0.38,
|
|
171
|
+
color: 'rgba(255,255,255,0.18)',
|
|
172
|
+
marginTop: 10,
|
|
173
|
+
letterSpacing: 6,
|
|
174
|
+
}, children: alert.jp }))] }, alert.id));
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Full-screen wave announcement overlay.
|
|
178
|
+
*
|
|
179
|
+
* ```tsx
|
|
180
|
+
* const { banner, showWave } = useWaveBanner();
|
|
181
|
+
* showWave(3, 8);
|
|
182
|
+
* <WaveBanner banner={banner} />
|
|
183
|
+
* ```
|
|
184
|
+
*/
|
|
185
|
+
export function WaveBanner({ banner, color = 'var(--joydle-danger, #ff0033)', countLabel = 'ENEMIES INCOMING', }) {
|
|
186
|
+
injectFxStyle();
|
|
187
|
+
if (!banner)
|
|
188
|
+
return _jsx(_Fragment, {});
|
|
189
|
+
return (_jsxs("div", { style: {
|
|
190
|
+
position: 'fixed',
|
|
191
|
+
top: '50%',
|
|
192
|
+
left: '50%',
|
|
193
|
+
transform: 'translate(-50%,-50%)',
|
|
194
|
+
zIndex: 70,
|
|
195
|
+
textAlign: 'center',
|
|
196
|
+
pointerEvents: 'none',
|
|
197
|
+
animation: 'joydle-wave-banner 2.8s ease-out forwards',
|
|
198
|
+
}, children: [_jsxs("div", { style: {
|
|
199
|
+
fontFamily: 'var(--joydle-font, sans-serif)',
|
|
200
|
+
fontSize: 64,
|
|
201
|
+
fontWeight: 900,
|
|
202
|
+
color,
|
|
203
|
+
textShadow: `0 0 50px ${color}`,
|
|
204
|
+
letterSpacing: 14,
|
|
205
|
+
}, children: ["WAVE ", banner.wave] }), banner.count != null && (_jsxs("div", { style: {
|
|
206
|
+
fontSize: 13,
|
|
207
|
+
color: 'var(--joydle-accent, #ff6a00)',
|
|
208
|
+
letterSpacing: 8,
|
|
209
|
+
}, children: [banner.count, " ", countLabel] }))] }, banner.id));
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Muzzle / weapon flash overlay at screen bottom-center.
|
|
213
|
+
*
|
|
214
|
+
* ```tsx
|
|
215
|
+
* <MuzzleFlash active={firing} color="#ff6a00" />
|
|
216
|
+
* ```
|
|
217
|
+
*/
|
|
218
|
+
export function MuzzleFlash({ active, color = 'var(--joydle-accent, #ff6a00)', position = '18%', size = 80, }) {
|
|
219
|
+
injectFxStyle();
|
|
220
|
+
const [show, setShow] = useState(false);
|
|
221
|
+
useEffect(() => {
|
|
222
|
+
if (!active)
|
|
223
|
+
return;
|
|
224
|
+
setShow(true);
|
|
225
|
+
const t = setTimeout(() => setShow(false), 70);
|
|
226
|
+
return () => clearTimeout(t);
|
|
227
|
+
}, [active]);
|
|
228
|
+
if (!show)
|
|
229
|
+
return _jsx(_Fragment, {});
|
|
230
|
+
return (_jsx("div", { style: {
|
|
231
|
+
position: 'fixed',
|
|
232
|
+
bottom: position,
|
|
233
|
+
left: '50%',
|
|
234
|
+
transform: 'translateX(-50%)',
|
|
235
|
+
width: size,
|
|
236
|
+
height: size,
|
|
237
|
+
zIndex: 42,
|
|
238
|
+
pointerEvents: 'none',
|
|
239
|
+
borderRadius: '50%',
|
|
240
|
+
background: `radial-gradient(circle, ${color}e5, ${color}4d, transparent)`,
|
|
241
|
+
animation: `joydle-muzzle-flash 0.07s ease-out`,
|
|
242
|
+
} }));
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Animated kill confirmation markers that appear at random screen positions.
|
|
246
|
+
*
|
|
247
|
+
* ```tsx
|
|
248
|
+
* const { kills, addKill } = useKillConfirm();
|
|
249
|
+
* <KillConfirm kills={kills} icon="×" />
|
|
250
|
+
* ```
|
|
251
|
+
*/
|
|
252
|
+
export function KillConfirm({ kills, icon = '×', color = 'var(--joydle-accent, #ff6a00)', }) {
|
|
253
|
+
injectFxStyle();
|
|
254
|
+
return (_jsx("div", { style: { position: 'fixed', inset: 0, zIndex: 55, pointerEvents: 'none' }, children: kills.map(k => (_jsxs("div", { style: {
|
|
255
|
+
position: 'fixed',
|
|
256
|
+
left: `${k.x}%`,
|
|
257
|
+
top: `${k.y}%`,
|
|
258
|
+
animation: 'joydle-kill-cross 1.2s ease-out forwards',
|
|
259
|
+
}, children: [_jsx("div", { style: {
|
|
260
|
+
position: 'absolute',
|
|
261
|
+
width: 5,
|
|
262
|
+
height: 100,
|
|
263
|
+
left: '50%',
|
|
264
|
+
top: -50,
|
|
265
|
+
transform: 'translateX(-50%)',
|
|
266
|
+
background: `linear-gradient(to bottom, ${color}, transparent)`,
|
|
267
|
+
opacity: 0.85,
|
|
268
|
+
} }), _jsx("div", { style: {
|
|
269
|
+
position: 'absolute',
|
|
270
|
+
width: 70,
|
|
271
|
+
height: 3,
|
|
272
|
+
top: 0,
|
|
273
|
+
left: -35,
|
|
274
|
+
background: color,
|
|
275
|
+
opacity: 0.85,
|
|
276
|
+
} }), _jsx("div", { style: {
|
|
277
|
+
position: 'absolute',
|
|
278
|
+
left: '50%',
|
|
279
|
+
top: '50%',
|
|
280
|
+
transform: 'translate(-50%, -50%)',
|
|
281
|
+
fontSize: 20,
|
|
282
|
+
fontWeight: 900,
|
|
283
|
+
color,
|
|
284
|
+
fontFamily: 'var(--joydle-font, sans-serif)',
|
|
285
|
+
}, children: icon })] }, k.id))) }));
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Animated hazard-stripe bars at screen top and bottom.
|
|
289
|
+
* Great for wave start, danger zones, time pressure.
|
|
290
|
+
*
|
|
291
|
+
* ```tsx
|
|
292
|
+
* <WarningStripes active={wavePending} color="#ffd600" />
|
|
293
|
+
* ```
|
|
294
|
+
*/
|
|
295
|
+
export function WarningStripes({ active, color = 'var(--joydle-gold, #ffd600)', height = 3, }) {
|
|
296
|
+
injectFxStyle();
|
|
297
|
+
const stripeStyle = {
|
|
298
|
+
left: 0,
|
|
299
|
+
right: 0,
|
|
300
|
+
height,
|
|
301
|
+
opacity: active ? 0.7 : 0,
|
|
302
|
+
transition: 'opacity 0.2s',
|
|
303
|
+
zIndex: 45,
|
|
304
|
+
pointerEvents: 'none',
|
|
305
|
+
background: `repeating-linear-gradient(90deg, ${color} 0px, ${color} 8px, transparent 8px, transparent 16px)`,
|
|
306
|
+
animation: active ? 'joydle-warning-scroll 0.4s linear infinite' : 'none',
|
|
307
|
+
position: 'fixed',
|
|
308
|
+
};
|
|
309
|
+
return (_jsxs(_Fragment, { children: [_jsx("div", { style: { ...stripeStyle, top: 48 } }), _jsx("div", { style: { ...stripeStyle, bottom: 160 } })] }));
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Horizontal beam / energy ray flashes across the screen.
|
|
313
|
+
* Use for enemy attacks, explosions, special effects.
|
|
314
|
+
*
|
|
315
|
+
* ```tsx
|
|
316
|
+
* const { beams, addBeam } = useBeamEffect();
|
|
317
|
+
* <ScreenBeam beams={beams} color="#ff0033" />
|
|
318
|
+
* ```
|
|
319
|
+
*/
|
|
320
|
+
export function ScreenBeam({ beams, color = 'var(--joydle-danger, #ff0033)', height = 4, }) {
|
|
321
|
+
injectFxStyle();
|
|
322
|
+
return (_jsx("div", { style: { position: 'fixed', inset: 0, zIndex: 43, pointerEvents: 'none' }, children: beams.map(b => (_jsx("div", { style: {
|
|
323
|
+
position: 'absolute',
|
|
324
|
+
top: `${b.top}%`,
|
|
325
|
+
left: 0,
|
|
326
|
+
right: 0,
|
|
327
|
+
animation: 'joydle-beam-flash 0.6s ease-out forwards',
|
|
328
|
+
}, children: _jsx("div", { style: {
|
|
329
|
+
height,
|
|
330
|
+
width: b.width,
|
|
331
|
+
margin: '0 auto',
|
|
332
|
+
background: `linear-gradient(90deg, transparent, ${color}, rgba(255,0,51,0.8), ${color}, transparent)`,
|
|
333
|
+
boxShadow: `0 0 15px ${color}, 0 0 30px ${color}4d`,
|
|
334
|
+
borderRadius: 2,
|
|
335
|
+
} }) }, b.id))) }));
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=effects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effects.js","sourceRoot":"","sources":["../../src/fx/effects.tsx"],"names":[],"mappings":"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"}
|