@freegamestore/games 0.16.0 → 0.19.0
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/README.md +106 -8
- package/TOKENS.md +132 -0
- package/dist/Confetti.d.ts +18 -0
- package/dist/Confetti.d.ts.map +1 -0
- package/dist/Confetti.js +43 -0
- package/dist/Confetti.js.map +1 -0
- package/dist/GameAuth.d.ts.map +1 -1
- package/dist/GameAuth.js +5 -87
- package/dist/GameAuth.js.map +1 -1
- package/dist/GameButton.d.ts +2 -1
- package/dist/GameButton.d.ts.map +1 -1
- package/dist/GameButton.js +16 -67
- package/dist/GameButton.js.map +1 -1
- package/dist/GameConfirm.d.ts +1 -1
- package/dist/GameConfirm.d.ts.map +1 -1
- package/dist/GameConfirm.js +1 -7
- package/dist/GameConfirm.js.map +1 -1
- package/dist/GameModal.d.ts +3 -2
- package/dist/GameModal.d.ts.map +1 -1
- package/dist/GameModal.js +3 -40
- package/dist/GameModal.js.map +1 -1
- package/dist/GameOverScreen.d.ts +3 -2
- package/dist/GameOverScreen.d.ts.map +1 -1
- package/dist/GameOverScreen.js +3 -37
- package/dist/GameOverScreen.js.map +1 -1
- package/dist/GameResultScreen.d.ts +41 -0
- package/dist/GameResultScreen.d.ts.map +1 -0
- package/dist/GameResultScreen.js +25 -0
- package/dist/GameResultScreen.js.map +1 -0
- package/dist/GameShell.d.ts +3 -0
- package/dist/GameShell.d.ts.map +1 -1
- package/dist/GameShell.js +4 -43
- package/dist/GameShell.js.map +1 -1
- package/dist/GameTextSizeToggle.d.ts +1 -1
- package/dist/GameTextSizeToggle.d.ts.map +1 -1
- package/dist/GameTextSizeToggle.js +1 -16
- package/dist/GameTextSizeToggle.js.map +1 -1
- package/dist/GameThemeToggle.d.ts +1 -1
- package/dist/GameThemeToggle.d.ts.map +1 -1
- package/dist/GameThemeToggle.js +44 -21
- package/dist/GameThemeToggle.js.map +1 -1
- package/dist/GameTopbar.d.ts +12 -7
- package/dist/GameTopbar.d.ts.map +1 -1
- package/dist/GameTopbar.js +54 -188
- package/dist/GameTopbar.js.map +1 -1
- package/dist/GameTopbar.module.css +201 -0
- package/dist/Leaderboard.d.ts.map +1 -1
- package/dist/Leaderboard.js +2 -5
- package/dist/Leaderboard.js.map +1 -1
- package/dist/StartScreen.d.ts +41 -0
- package/dist/StartScreen.d.ts.map +1 -0
- package/dist/StartScreen.js +30 -0
- package/dist/StartScreen.js.map +1 -0
- package/dist/feel/ScorePopup.d.ts +20 -0
- package/dist/feel/ScorePopup.d.ts.map +1 -0
- package/dist/feel/ScorePopup.js +51 -0
- package/dist/feel/ScorePopup.js.map +1 -0
- package/dist/feel/easing.d.ts +14 -0
- package/dist/feel/easing.d.ts.map +1 -0
- package/dist/feel/easing.js +12 -0
- package/dist/feel/easing.js.map +1 -0
- package/dist/feel/haptics.d.ts +19 -0
- package/dist/feel/haptics.d.ts.map +1 -0
- package/dist/feel/haptics.js +24 -0
- package/dist/feel/haptics.js.map +1 -0
- package/dist/feel/index.d.ts +17 -0
- package/dist/feel/index.d.ts.map +1 -0
- package/dist/feel/index.js +17 -0
- package/dist/feel/index.js.map +1 -0
- package/dist/feel/particles.d.ts +46 -0
- package/dist/feel/particles.d.ts.map +1 -0
- package/dist/feel/particles.js +61 -0
- package/dist/feel/particles.js.map +1 -0
- package/dist/feel/reducedMotion.d.ts +6 -0
- package/dist/feel/reducedMotion.d.ts.map +1 -0
- package/dist/feel/reducedMotion.js +10 -0
- package/dist/feel/reducedMotion.js.map +1 -0
- package/dist/feel/shake.d.ts +6 -0
- package/dist/feel/shake.d.ts.map +1 -0
- package/dist/feel/shake.js +17 -0
- package/dist/feel/shake.js.map +1 -0
- package/dist/feel/tween.d.ts +9 -0
- package/dist/feel/tween.d.ts.map +1 -0
- package/dist/feel/tween.js +15 -0
- package/dist/feel/tween.js.map +1 -0
- package/dist/feel/useHaptics.d.ts +12 -0
- package/dist/feel/useHaptics.d.ts.map +1 -0
- package/dist/feel/useHaptics.js +16 -0
- package/dist/feel/useHaptics.js.map +1 -0
- package/dist/feel/useParticles.d.ts +18 -0
- package/dist/feel/useParticles.d.ts.map +1 -0
- package/dist/feel/useParticles.js +79 -0
- package/dist/feel/useParticles.js.map +1 -0
- package/dist/feel/useShake.d.ts +14 -0
- package/dist/feel/useShake.d.ts.map +1 -0
- package/dist/feel/useShake.js +17 -0
- package/dist/feel/useShake.js.map +1 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -2
- package/dist/index.js.map +1 -1
- package/dist/theme.css +93 -0
- package/dist/tokens.d.ts +112 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +106 -0
- package/dist/tokens.js.map +1 -0
- package/dist/useGameSounds.d.ts.map +1 -1
- package/dist/useGameSounds.js +37 -15
- package/dist/useGameSounds.js.map +1 -1
- package/dist/useLeaderboard.d.ts +8 -1
- package/dist/useLeaderboard.d.ts.map +1 -1
- package/dist/useLeaderboard.js +21 -11
- package/dist/useLeaderboard.js.map +1 -1
- package/package.json +23 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GameConfirm.d.ts","sourceRoot":"","sources":["../src/GameConfirm.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,KAAK,EACL,OAAO,EACP,YAAwB,EACxB,WAAsB,EACtB,SAAS,EACT,QAAQ,EACR,OAAmB,GACpB,EAAE,gBAAgB
|
|
1
|
+
{"version":3,"file":"GameConfirm.d.ts","sourceRoot":"","sources":["../src/GameConfirm.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,KAAK,EACL,OAAO,EACP,YAAwB,EACxB,WAAsB,EACtB,SAAS,EACT,QAAQ,EACR,OAAmB,GACpB,EAAE,gBAAgB,+BAkBlB"}
|
package/dist/GameConfirm.js
CHANGED
|
@@ -6,12 +6,6 @@ import { GameModal } from './GameModal.js';
|
|
|
6
6
|
* Use for: quit game, restart, delete save, etc.
|
|
7
7
|
*/
|
|
8
8
|
export function GameConfirm({ open, title, message, confirmLabel = 'Confirm', cancelLabel = 'Cancel', onConfirm, onCancel, variant = 'default', }) {
|
|
9
|
-
return (_jsxs(GameModal, { open: open, onClose: onCancel, title: title, children: [_jsx("p", {
|
|
10
|
-
fontSize: '0.9rem',
|
|
11
|
-
color: 'var(--muted, #64748b)',
|
|
12
|
-
margin: '0 0 1.25rem',
|
|
13
|
-
lineHeight: 1.5,
|
|
14
|
-
fontFamily: '"Manrope", system-ui, sans-serif',
|
|
15
|
-
}, children: message }), _jsxs("div", { style: { display: 'flex', gap: '0.5rem', justifyContent: 'flex-end' }, children: [_jsx(GameButton, { onClick: onCancel, variant: "secondary", size: "md", children: cancelLabel }), _jsx(GameButton, { onClick: onConfirm, variant: variant === 'danger' ? 'danger' : 'primary', size: "md", children: confirmLabel })] })] }));
|
|
9
|
+
return (_jsxs(GameModal, { open: open, onClose: onCancel, title: title, children: [_jsx("p", { className: "m-0 mb-5 text-[0.9rem] leading-normal text-muted", children: message }), _jsxs("div", { className: "flex justify-end gap-2", children: [_jsx(GameButton, { onClick: onCancel, variant: "secondary", size: "md", children: cancelLabel }), _jsx(GameButton, { onClick: onConfirm, variant: variant === 'danger' ? 'danger' : 'primary', size: "md", children: confirmLabel })] })] }));
|
|
16
10
|
}
|
|
17
11
|
//# sourceMappingURL=GameConfirm.js.map
|
package/dist/GameConfirm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GameConfirm.js","sourceRoot":"","sources":["../src/GameConfirm.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAa3C;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,IAAI,EACJ,KAAK,EACL,OAAO,EACP,YAAY,GAAG,SAAS,EACxB,WAAW,GAAG,QAAQ,EACtB,SAAS,EACT,QAAQ,EACR,OAAO,GAAG,SAAS,GACF;IACjB,OAAO,CACL,MAAC,SAAS,IAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,aACpD,
|
|
1
|
+
{"version":3,"file":"GameConfirm.js","sourceRoot":"","sources":["../src/GameConfirm.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAa3C;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,IAAI,EACJ,KAAK,EACL,OAAO,EACP,YAAY,GAAG,SAAS,EACxB,WAAW,GAAG,QAAQ,EACtB,SAAS,EACT,QAAQ,EACR,OAAO,GAAG,SAAS,GACF;IACjB,OAAO,CACL,MAAC,SAAS,IAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,aACpD,YAAG,SAAS,EAAC,kDAAkD,YAAE,OAAO,GAAK,EAC7E,eAAK,SAAS,EAAC,wBAAwB,aACrC,KAAC,UAAU,IAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,IAAI,YACzD,WAAW,GACD,EACb,KAAC,UAAU,IACT,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EACpD,IAAI,EAAC,IAAI,YAER,YAAY,GACF,IACT,IACI,CACb,CAAC;AACJ,CAAC"}
|
package/dist/GameModal.d.ts
CHANGED
|
@@ -8,7 +8,8 @@ export interface GameModalProps {
|
|
|
8
8
|
/**
|
|
9
9
|
* Fullscreen modal overlay for games. Used for rules, settings, confirmations.
|
|
10
10
|
* Closes on backdrop click or Escape key.
|
|
11
|
-
* Styled with platform
|
|
11
|
+
* Styled with Tailwind utilities on the platform tokens. The dialog sits on an
|
|
12
|
+
* opaque surface (`bg-panel`); only the scrim behind it is translucent.
|
|
12
13
|
*/
|
|
13
|
-
export declare function GameModal({ open, onClose, title, children }: GameModalProps): import("react
|
|
14
|
+
export declare function GameModal({ open, onClose, title, children }: GameModalProps): import("react").JSX.Element | null;
|
|
14
15
|
//# sourceMappingURL=GameModal.d.ts.map
|
package/dist/GameModal.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GameModal.d.ts","sourceRoot":"","sources":["../src/GameModal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,OAAO,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED
|
|
1
|
+
{"version":3,"file":"GameModal.d.ts","sourceRoot":"","sources":["../src/GameModal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,OAAO,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,cAAc,sCAqC3E"}
|
package/dist/GameModal.js
CHANGED
|
@@ -3,7 +3,8 @@ import { useEffect } from 'react';
|
|
|
3
3
|
/**
|
|
4
4
|
* Fullscreen modal overlay for games. Used for rules, settings, confirmations.
|
|
5
5
|
* Closes on backdrop click or Escape key.
|
|
6
|
-
* Styled with platform
|
|
6
|
+
* Styled with Tailwind utilities on the platform tokens. The dialog sits on an
|
|
7
|
+
* opaque surface (`bg-panel`); only the scrim behind it is translucent.
|
|
7
8
|
*/
|
|
8
9
|
export function GameModal({ open, onClose, title, children }) {
|
|
9
10
|
useEffect(() => {
|
|
@@ -18,44 +19,6 @@ export function GameModal({ open, onClose, title, children }) {
|
|
|
18
19
|
}, [open, onClose]);
|
|
19
20
|
if (!open)
|
|
20
21
|
return null;
|
|
21
|
-
return (_jsx("div", { onClick: onClose,
|
|
22
|
-
position: 'fixed',
|
|
23
|
-
inset: 0,
|
|
24
|
-
zIndex: 900,
|
|
25
|
-
background: 'rgba(0,0,0,0.6)',
|
|
26
|
-
backdropFilter: 'blur(4px)',
|
|
27
|
-
display: 'flex',
|
|
28
|
-
alignItems: 'center',
|
|
29
|
-
justifyContent: 'center',
|
|
30
|
-
padding: '1rem',
|
|
31
|
-
}, children: _jsxs("div", { onClick: (e) => e.stopPropagation(), style: {
|
|
32
|
-
background: 'var(--panel, #ffffff)',
|
|
33
|
-
border: '1px solid var(--line, #e2e8f0)',
|
|
34
|
-
borderRadius: '1rem',
|
|
35
|
-
maxWidth: 400,
|
|
36
|
-
width: '100%',
|
|
37
|
-
maxHeight: '80dvh',
|
|
38
|
-
overflow: 'auto',
|
|
39
|
-
}, children: [title && (_jsxs("div", { style: {
|
|
40
|
-
display: 'flex',
|
|
41
|
-
alignItems: 'center',
|
|
42
|
-
justifyContent: 'space-between',
|
|
43
|
-
padding: '0.85rem 1rem',
|
|
44
|
-
borderBottom: '1px solid var(--line, #e2e8f0)',
|
|
45
|
-
}, children: [_jsx("span", { style: {
|
|
46
|
-
fontWeight: 700,
|
|
47
|
-
fontSize: '1rem',
|
|
48
|
-
color: 'var(--ink, #1e293b)',
|
|
49
|
-
fontFamily: '"Manrope", system-ui, sans-serif',
|
|
50
|
-
}, children: title }), _jsx("button", { onClick: onClose, "aria-label": "Close", style: {
|
|
51
|
-
background: 'none',
|
|
52
|
-
border: 'none',
|
|
53
|
-
cursor: 'pointer',
|
|
54
|
-
fontSize: '1.25rem',
|
|
55
|
-
lineHeight: 1,
|
|
56
|
-
color: 'var(--muted, #64748b)',
|
|
57
|
-
padding: '0.25rem',
|
|
58
|
-
fontFamily: 'inherit',
|
|
59
|
-
}, children: "\u00D7" })] })), _jsx("div", { style: { padding: '1rem' }, children: children })] }) }));
|
|
22
|
+
return (_jsx("div", { onClick: onClose, className: "fixed inset-0 z-[900] flex items-center justify-center bg-black/60 p-4 backdrop-blur-xs", children: _jsxs("div", { onClick: (e) => e.stopPropagation(), className: "max-h-[80dvh] w-full max-w-[400px] overflow-auto rounded-2xl border border-line bg-panel", children: [title && (_jsxs("div", { className: "flex items-center justify-between border-b border-line px-4 py-[0.85rem]", children: [_jsx("span", { className: "text-base font-bold text-ink", children: title }), _jsx("button", { onClick: onClose, "aria-label": "Close", className: "cursor-pointer border-0 bg-transparent p-1 text-xl leading-none text-muted", children: "\u00D7" })] })), _jsx("div", { className: "p-4", children: children })] }) }));
|
|
60
23
|
}
|
|
61
24
|
//# sourceMappingURL=GameModal.js.map
|
package/dist/GameModal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GameModal.js","sourceRoot":"","sources":["../src/GameModal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAkB,SAAS,EAAE,MAAM,OAAO,CAAC;AASlD
|
|
1
|
+
{"version":3,"file":"GameModal.js","sourceRoot":"","sources":["../src/GameModal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAkB,SAAS,EAAE,MAAM,OAAO,CAAC;AASlD;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAkB;IAC1E,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,OAAO,GAAG,CAAC,CAAgB,EAAE,EAAE;YACnC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC;QACpC,CAAC,CAAC;QACF,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAEpB,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,OAAO,CACL,cACE,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,yFAAyF,YAEnG,eACE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,EACnC,SAAS,EAAC,0FAA0F,aAEnG,KAAK,IAAI,CACR,eAAK,SAAS,EAAC,0EAA0E,aACvF,eAAM,SAAS,EAAC,8BAA8B,YAAE,KAAK,GAAQ,EAC7D,iBACE,OAAO,EAAE,OAAO,gBACL,OAAO,EAClB,SAAS,EAAC,4EAA4E,uBAG/E,IACL,CACP,EACD,cAAK,SAAS,EAAC,KAAK,YAAE,QAAQ,GAAO,IACjC,GACF,CACP,CAAC;AACJ,CAAC"}
|
package/dist/GameOverScreen.d.ts
CHANGED
|
@@ -12,7 +12,8 @@ export interface GameOverScreenProps {
|
|
|
12
12
|
/**
|
|
13
13
|
* Standard game-over overlay. Shows score, optional high score,
|
|
14
14
|
* play again button, and optional extra content.
|
|
15
|
-
* Renders as a centered overlay on top of the game board.
|
|
15
|
+
* Renders as a centered overlay on top of the game board. The text sits on a
|
|
16
|
+
* dark scrim, so it uses white rather than the page tokens.
|
|
16
17
|
*/
|
|
17
|
-
export declare function GameOverScreen({ score, highScore, onPlayAgain, children }: GameOverScreenProps): import("react
|
|
18
|
+
export declare function GameOverScreen({ score, highScore, onPlayAgain, children }: GameOverScreenProps): import("react").JSX.Element;
|
|
18
19
|
//# sourceMappingURL=GameOverScreen.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GameOverScreen.d.ts","sourceRoot":"","sources":["../src/GameOverScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,MAAM,WAAW,mBAAmB;IAClC,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED
|
|
1
|
+
{"version":3,"file":"GameOverScreen.d.ts","sourceRoot":"","sources":["../src/GameOverScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,MAAM,WAAW,mBAAmB;IAClC,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,mBAAmB,+BAgC9F"}
|
package/dist/GameOverScreen.js
CHANGED
|
@@ -3,45 +3,11 @@ import { GameButton } from './GameButton.js';
|
|
|
3
3
|
/**
|
|
4
4
|
* Standard game-over overlay. Shows score, optional high score,
|
|
5
5
|
* play again button, and optional extra content.
|
|
6
|
-
* Renders as a centered overlay on top of the game board.
|
|
6
|
+
* Renders as a centered overlay on top of the game board. The text sits on a
|
|
7
|
+
* dark scrim, so it uses white rather than the page tokens.
|
|
7
8
|
*/
|
|
8
9
|
export function GameOverScreen({ score, highScore, onPlayAgain, children }) {
|
|
9
10
|
const isNewHigh = highScore !== undefined && score >= highScore && score > 0;
|
|
10
|
-
return (_jsx("div", {
|
|
11
|
-
position: 'absolute',
|
|
12
|
-
inset: 0,
|
|
13
|
-
zIndex: 800,
|
|
14
|
-
background: 'rgba(0,0,0,0.65)',
|
|
15
|
-
backdropFilter: 'blur(6px)',
|
|
16
|
-
display: 'flex',
|
|
17
|
-
alignItems: 'center',
|
|
18
|
-
justifyContent: 'center',
|
|
19
|
-
padding: '1.5rem',
|
|
20
|
-
}, children: _jsxs("div", { style: {
|
|
21
|
-
textAlign: 'center',
|
|
22
|
-
maxWidth: 320,
|
|
23
|
-
width: '100%',
|
|
24
|
-
}, children: [_jsx("div", { style: {
|
|
25
|
-
fontSize: '0.75rem',
|
|
26
|
-
fontWeight: 700,
|
|
27
|
-
textTransform: 'uppercase',
|
|
28
|
-
letterSpacing: '0.1em',
|
|
29
|
-
color: 'rgba(255,255,255,0.6)',
|
|
30
|
-
marginBottom: '0.5rem',
|
|
31
|
-
fontFamily: '"Manrope", system-ui, sans-serif',
|
|
32
|
-
}, children: "Game Over" }), _jsx("div", { style: {
|
|
33
|
-
fontSize: '3rem',
|
|
34
|
-
fontWeight: 800,
|
|
35
|
-
color: '#ffffff',
|
|
36
|
-
lineHeight: 1,
|
|
37
|
-
marginBottom: '0.25rem',
|
|
38
|
-
fontFamily: '"Fraunces", serif',
|
|
39
|
-
}, children: score.toLocaleString() }), highScore !== undefined && (_jsx("div", { style: {
|
|
40
|
-
fontSize: '0.8rem',
|
|
41
|
-
fontWeight: 600,
|
|
42
|
-
color: isNewHigh ? 'var(--accent, #10b981)' : 'rgba(255,255,255,0.5)',
|
|
43
|
-
marginBottom: '1rem',
|
|
44
|
-
fontFamily: '"Manrope", system-ui, sans-serif',
|
|
45
|
-
}, children: isNewHigh ? 'New high score!' : `Best: ${highScore.toLocaleString()}` })), !highScore && _jsx("div", { style: { marginBottom: '1rem' } }), _jsx(GameButton, { onClick: onPlayAgain, variant: "primary", size: "lg", children: "Play Again" }), children && (_jsx("div", { style: { marginTop: '1rem', color: 'rgba(255,255,255,0.7)', fontSize: '0.85rem' }, children: children }))] }) }));
|
|
11
|
+
return (_jsx("div", { className: "absolute inset-0 z-[800] flex items-center justify-center bg-black/65 p-6 backdrop-blur-[6px]", children: _jsxs("div", { className: "w-full max-w-80 text-center", children: [_jsx("div", { className: "mb-2 text-xs font-bold uppercase tracking-widest text-white/60", children: "Game Over" }), _jsx("div", { className: "mb-1 font-display text-5xl font-extrabold leading-none text-white", children: score.toLocaleString() }), highScore !== undefined && (_jsx("div", { className: `mb-4 text-[0.8rem] font-semibold ${isNewHigh ? 'text-accent' : 'text-white/50'}`, children: isNewHigh ? 'New high score!' : `Best: ${highScore.toLocaleString()}` })), !highScore && _jsx("div", { className: "mb-4" }), _jsx(GameButton, { onClick: onPlayAgain, variant: "primary", size: "lg", children: "Play Again" }), children && _jsx("div", { className: "mt-4 text-[0.85rem] text-white/70", children: children })] }) }));
|
|
46
12
|
}
|
|
47
13
|
//# sourceMappingURL=GameOverScreen.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GameOverScreen.js","sourceRoot":"","sources":["../src/GameOverScreen.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAa7C
|
|
1
|
+
{"version":3,"file":"GameOverScreen.js","sourceRoot":"","sources":["../src/GameOverScreen.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAa7C;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAuB;IAC7F,MAAM,SAAS,GAAG,SAAS,KAAK,SAAS,IAAI,KAAK,IAAI,SAAS,IAAI,KAAK,GAAG,CAAC,CAAC;IAE7E,OAAO,CACL,cAAK,SAAS,EAAC,+FAA+F,YAC5G,eAAK,SAAS,EAAC,6BAA6B,aAC1C,cAAK,SAAS,EAAC,gEAAgE,0BAEzE,EAEN,cAAK,SAAS,EAAC,mEAAmE,YAC/E,KAAK,CAAC,cAAc,EAAE,GACnB,EAEL,SAAS,KAAK,SAAS,IAAI,CAC1B,cACE,SAAS,EAAE,oCAAoC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,EAAE,YAE3F,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,cAAc,EAAE,EAAE,GAClE,CACP,EAEA,CAAC,SAAS,IAAI,cAAK,SAAS,EAAC,MAAM,GAAG,EAEvC,KAAC,UAAU,IAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAC,SAAS,EAAC,IAAI,EAAC,IAAI,2BAEhD,EAEZ,QAAQ,IAAI,cAAK,SAAS,EAAC,mCAAmC,YAAE,QAAQ,GAAO,IAC5E,GACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type * as React from 'react';
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
|
+
export interface GameResultStat {
|
|
4
|
+
/** Short label, shown small and uppercase. */
|
|
5
|
+
label: string;
|
|
6
|
+
/** The value, shown large in the display face. */
|
|
7
|
+
value: string | number;
|
|
8
|
+
}
|
|
9
|
+
export interface GameResultScreenProps {
|
|
10
|
+
/** 'win' shows confetti and the accent title colour. 'lose' shows the card without confetti. */
|
|
11
|
+
tone: 'win' | 'lose';
|
|
12
|
+
/** Small line above the title, e.g. the level name. */
|
|
13
|
+
eyebrow?: string;
|
|
14
|
+
/** The headline, set large in the display face. */
|
|
15
|
+
title: string;
|
|
16
|
+
/** One line under the title. */
|
|
17
|
+
message?: string;
|
|
18
|
+
/** Stat rows shown in a two-column grid. Omit or pass [] for none. */
|
|
19
|
+
stats?: readonly GameResultStat[];
|
|
20
|
+
/** A highlight line under the stats, such as "New best!". */
|
|
21
|
+
badge?: ReactNode;
|
|
22
|
+
/** The primary action. It is focused when the screen opens. */
|
|
23
|
+
action: {
|
|
24
|
+
label: string;
|
|
25
|
+
onClick: () => void;
|
|
26
|
+
};
|
|
27
|
+
/** Extra content between the badge and the action, such as a leaderboard submit button. */
|
|
28
|
+
children?: ReactNode;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* An animated result screen for a finished level or game. It is a modal dialog
|
|
32
|
+
* with a title, optional stats and badge, optional extra content, and one
|
|
33
|
+
* action. A win adds falling confetti. The action is focused when the screen
|
|
34
|
+
* opens, so keyboard and screen-reader users land on the next step.
|
|
35
|
+
*
|
|
36
|
+
* It covers the viewport. The card sits on an opaque `bg-panel` surface; only
|
|
37
|
+
* the scrim behind it is translucent. Motion is the `animate-fgs-*` utilities
|
|
38
|
+
* from the SDK's `theme.css`, and it stops under prefers-reduced-motion.
|
|
39
|
+
*/
|
|
40
|
+
export declare function GameResultScreen({ tone, eyebrow, title, message, stats, badge, action, children, }: GameResultScreenProps): React.JSX.Element;
|
|
41
|
+
//# sourceMappingURL=GameResultScreen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GameResultScreen.d.ts","sourceRoot":"","sources":["../src/GameResultScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,MAAM,WAAW,cAAc;IAC7B,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,gGAAgG;IAChG,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,KAAK,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAClC,6DAA6D;IAC7D,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,+DAA+D;IAC/D,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;IAC/C,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,OAAO,EACP,KAAK,EACL,OAAO,EACP,KAAU,EACV,KAAK,EACL,MAAM,EACN,QAAQ,GACT,EAAE,qBAAqB,qBAqEvB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useId, useRef } from 'react';
|
|
3
|
+
import { Confetti } from './Confetti.js';
|
|
4
|
+
import { GameButton } from './GameButton.js';
|
|
5
|
+
/**
|
|
6
|
+
* An animated result screen for a finished level or game. It is a modal dialog
|
|
7
|
+
* with a title, optional stats and badge, optional extra content, and one
|
|
8
|
+
* action. A win adds falling confetti. The action is focused when the screen
|
|
9
|
+
* opens, so keyboard and screen-reader users land on the next step.
|
|
10
|
+
*
|
|
11
|
+
* It covers the viewport. The card sits on an opaque `bg-panel` surface; only
|
|
12
|
+
* the scrim behind it is translucent. Motion is the `animate-fgs-*` utilities
|
|
13
|
+
* from the SDK's `theme.css`, and it stops under prefers-reduced-motion.
|
|
14
|
+
*/
|
|
15
|
+
export function GameResultScreen({ tone, eyebrow, title, message, stats = [], badge, action, children, }) {
|
|
16
|
+
const titleId = useId();
|
|
17
|
+
const actionsRef = useRef(null);
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
actionsRef.current?.querySelector('button')?.focus();
|
|
20
|
+
}, []);
|
|
21
|
+
return (_jsxs("div", { "data-fgs": "result", "data-tone": tone, className: "fixed inset-0 z-[800] flex animate-fgs-fade items-center justify-center overflow-hidden bg-paper/70 p-4 backdrop-blur-[5px] motion-reduce:animate-none", role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, children: [tone === 'win' && _jsx(Confetti, {}), _jsxs("div", { className: "relative z-[1] flex w-[min(20rem,100%)] animate-fgs-enter flex-col items-center gap-2 rounded-fgs border border-line bg-panel px-[1.1rem] pb-[1.1rem] pt-5 text-center shadow-[inset_0_1px_0_rgb(255_255_255/0.4),0_1px_2px_rgb(0_0_0/0.06),0_22px_40px_-20px_rgb(0_0_0/0.45)] motion-reduce:animate-none", children: [eyebrow && (_jsx("p", { className: "m-0 text-[0.72rem] font-bold uppercase tracking-[0.12em] text-muted", children: eyebrow })), _jsx("h2", { id: titleId, className: `m-0 animate-fgs-enter-title text-balance font-display text-fgs-title font-extrabold leading-none tracking-[-0.02em] [font-optical-sizing:auto] [font-variation-settings:'opsz'_144] motion-reduce:animate-none ${tone === 'win' ? 'text-accent-ink' : 'text-ink'}`, children: title }), message && _jsx("p", { className: "m-0 text-[0.9rem] text-muted", children: message }), stats.length > 0 && (_jsx("dl", { className: "m-0 mt-2 grid w-full grid-cols-2 gap-2", children: stats.map((stat, i) => (_jsxs("div", { className: "animate-fgs-enter-stat rounded-xl border border-line bg-paper px-[0.4rem] py-2 shadow-[inset_0_-2px_0_rgb(0_0_0/0.04)] motion-reduce:animate-none last:odd:col-span-full",
|
|
22
|
+
// Dynamic: the entrance delay is staggered by the stat's index.
|
|
23
|
+
style: { '--i': i }, children: [_jsx("dt", { className: "text-[0.68rem] font-bold uppercase tracking-[0.08em] text-muted", children: stat.label }), _jsx("dd", { className: "m-0 mt-[0.15rem] font-display text-fgs-stat font-extrabold tabular-nums text-ink", children: stat.value })] }, stat.label))) })), badge ? (_jsx("div", { className: "m-0 mt-1 animate-fgs-enter-badge text-[0.85rem] font-bold text-accent-ink motion-reduce:animate-none", children: badge })) : null, children, _jsx("div", { ref: actionsRef, className: "mt-2 w-full animate-fgs-enter-actions motion-reduce:animate-none", children: _jsx(GameButton, { variant: "primary", size: "lg", block: true, onClick: action.onClick, children: action.label }) })] })] }));
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=GameResultScreen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GameResultScreen.js","sourceRoot":"","sources":["../src/GameResultScreen.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AA4B7C;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAC/B,IAAI,EACJ,OAAO,EACP,KAAK,EACL,OAAO,EACP,KAAK,GAAG,EAAE,EACV,KAAK,EACL,MAAM,EACN,QAAQ,GACc;IACtB,MAAM,OAAO,GAAG,KAAK,EAAE,CAAC;IACxB,MAAM,UAAU,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAEhD,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,OAAO,EAAE,aAAa,CAAoB,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC;IAC1E,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,2BACW,QAAQ,eACN,IAAI,EACf,SAAS,EAAC,wJAAwJ,EAClK,IAAI,EAAC,QAAQ,gBACF,MAAM,qBACA,OAAO,aAEvB,IAAI,KAAK,KAAK,IAAI,KAAC,QAAQ,KAAG,EAC/B,eAAK,SAAS,EAAC,2SAA2S,aACvT,OAAO,IAAI,CACV,YAAG,SAAS,EAAC,qEAAqE,YAC/E,OAAO,GACN,CACL,EACD,aACE,EAAE,EAAE,OAAO,EACX,SAAS,EAAE,kNACT,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,UACvC,EAAE,YAED,KAAK,GACH,EACJ,OAAO,IAAI,YAAG,SAAS,EAAC,8BAA8B,YAAE,OAAO,GAAK,EACpE,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CACnB,aAAI,SAAS,EAAC,wCAAwC,YACnD,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,eAEE,SAAS,EAAC,0KAA0K;4BACpL,gEAAgE;4BAChE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAyB,aAE1C,aAAI,SAAS,EAAC,iEAAiE,YAC5E,IAAI,CAAC,KAAK,GACR,EACL,aAAI,SAAS,EAAC,kFAAkF,YAC7F,IAAI,CAAC,KAAK,GACR,KAVA,IAAI,CAAC,KAAK,CAWX,CACP,CAAC,GACC,CACN,EACA,KAAK,CAAC,CAAC,CAAC,CACP,cAAK,SAAS,EAAC,sGAAsG,YAClH,KAAK,GACF,CACP,CAAC,CAAC,CAAC,IAAI,EACP,QAAQ,EACT,cACE,GAAG,EAAE,UAAU,EACf,SAAS,EAAC,kEAAkE,YAE5E,KAAC,UAAU,IAAC,OAAO,EAAC,SAAS,EAAC,IAAI,EAAC,IAAI,EAAC,KAAK,QAAC,OAAO,EAAE,MAAM,CAAC,OAAO,YAClE,MAAM,CAAC,KAAK,GACF,GACT,IACF,IACF,CACP,CAAC;AACJ,CAAC"}
|
package/dist/GameShell.d.ts
CHANGED
|
@@ -21,6 +21,9 @@ export interface GameShellProps {
|
|
|
21
21
|
* Why 100svh (small viewport units) and not 100vh: on iOS Safari, 100vh
|
|
22
22
|
* includes the URL bar's hidden area, which lets content overflow when
|
|
23
23
|
* the bar reveals. 100svh stays equal to the *visible* viewport.
|
|
24
|
+
*
|
|
25
|
+
* Styled with Tailwind utilities on the platform tokens (ADR-001): the game
|
|
26
|
+
* compiles them through `@source` on this package's `dist`.
|
|
24
27
|
*/
|
|
25
28
|
export declare function GameShell({ topbar, children }: GameShellProps): React.JSX.Element;
|
|
26
29
|
//# sourceMappingURL=GameShell.d.ts.map
|
package/dist/GameShell.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GameShell.d.ts","sourceRoot":"","sources":["../src/GameShell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,6DAA6D;IAC7D,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED
|
|
1
|
+
{"version":3,"file":"GameShell.d.ts","sourceRoot":"","sources":["../src/GameShell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,6DAA6D;IAC7D,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA0BjF"}
|
package/dist/GameShell.js
CHANGED
|
@@ -12,50 +12,11 @@ import { SoundProvider } from './SoundContext.js';
|
|
|
12
12
|
* Why 100svh (small viewport units) and not 100vh: on iOS Safari, 100vh
|
|
13
13
|
* includes the URL bar's hidden area, which lets content overflow when
|
|
14
14
|
* the bar reveals. 100svh stays equal to the *visible* viewport.
|
|
15
|
+
*
|
|
16
|
+
* Styled with Tailwind utilities on the platform tokens (ADR-001): the game
|
|
17
|
+
* compiles them through `@source` on this package's `dist`.
|
|
15
18
|
*/
|
|
16
19
|
export function GameShell({ topbar, children }) {
|
|
17
|
-
return (_jsx(SoundProvider, { children: _jsxs("div", {
|
|
18
|
-
position: 'fixed',
|
|
19
|
-
inset: 0,
|
|
20
|
-
display: 'flex',
|
|
21
|
-
flexDirection: 'column',
|
|
22
|
-
background: 'var(--paper)',
|
|
23
|
-
color: 'var(--ink)',
|
|
24
|
-
overflow: 'hidden',
|
|
25
|
-
// 100svh handles iOS URL-bar height changes correctly.
|
|
26
|
-
height: '100svh',
|
|
27
|
-
width: '100vw',
|
|
28
|
-
// Games are touch-first — prevent text selection, long-press menus,
|
|
29
|
-
// and the 300ms tap delay that makes games feel sluggish.
|
|
30
|
-
WebkitUserSelect: 'none',
|
|
31
|
-
userSelect: 'none',
|
|
32
|
-
WebkitTouchCallout: 'none',
|
|
33
|
-
touchAction: 'manipulation',
|
|
34
|
-
}, children: [topbar !== undefined && (_jsx("div", { style: {
|
|
35
|
-
flexShrink: 0,
|
|
36
|
-
borderBottom: '1px solid var(--line, #e5e5e5)',
|
|
37
|
-
background: 'var(--panel, var(--paper))',
|
|
38
|
-
}, children: topbar })), _jsx("div", { style: {
|
|
39
|
-
flex: 1,
|
|
40
|
-
minHeight: 0,
|
|
41
|
-
minWidth: 0,
|
|
42
|
-
position: 'relative',
|
|
43
|
-
overflow: 'hidden',
|
|
44
|
-
}, children: children }), _jsx("div", { style: {
|
|
45
|
-
flexShrink: 0,
|
|
46
|
-
paddingBottom: 'env(safe-area-inset-bottom, 0px)',
|
|
47
|
-
background: 'var(--panel, var(--paper))',
|
|
48
|
-
borderTop: '1px solid var(--line, #e5e5e5)',
|
|
49
|
-
textAlign: 'center',
|
|
50
|
-
}, children: _jsx("a", { href: "https://freegamestore.online", target: "_blank", rel: "noopener noreferrer", style: {
|
|
51
|
-
display: 'block',
|
|
52
|
-
padding: '0.15rem 0',
|
|
53
|
-
fontSize: '0.55rem',
|
|
54
|
-
fontFamily: '"Manrope", system-ui, sans-serif',
|
|
55
|
-
fontWeight: 600,
|
|
56
|
-
color: 'var(--muted, #999)',
|
|
57
|
-
textDecoration: 'none',
|
|
58
|
-
letterSpacing: '0.03em',
|
|
59
|
-
}, children: "freegamestore.online" }) })] }) }));
|
|
20
|
+
return (_jsx(SoundProvider, { children: _jsxs("div", { className: "fixed inset-0 flex h-svh w-screen touch-manipulation select-none flex-col overflow-hidden bg-paper text-ink [-webkit-touch-callout:none]", children: [topbar !== undefined && (_jsx("div", { className: "shrink-0 border-b border-line bg-panel", children: topbar })), _jsx("div", { className: "relative min-h-0 min-w-0 flex-1 overflow-hidden", children: children }), _jsx("div", { className: "shrink-0 border-t border-line bg-panel pb-[env(safe-area-inset-bottom,0px)] text-center", children: _jsx("a", { href: "https://freegamestore.online", target: "_blank", rel: "noopener noreferrer", className: "block py-[0.15rem] text-[0.55rem] font-semibold tracking-[0.03em] text-muted no-underline", children: "freegamestore.online" }) })] }) }));
|
|
60
21
|
}
|
|
61
22
|
//# sourceMappingURL=GameShell.js.map
|
package/dist/GameShell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GameShell.js","sourceRoot":"","sources":["../src/GameShell.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAYlD
|
|
1
|
+
{"version":3,"file":"GameShell.js","sourceRoot":"","sources":["../src/GameShell.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAYlD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAkB;IAC5D,OAAO,CACL,KAAC,aAAa,cAEZ,eAAK,SAAS,EAAC,0IAA0I,aACtJ,MAAM,KAAK,SAAS,IAAI,CACvB,cAAK,SAAS,EAAC,wCAAwC,YAAE,MAAM,GAAO,CACvE,EACD,cAAK,SAAS,EAAC,iDAAiD,YAAE,QAAQ,GAAO,EAKjF,cAAK,SAAS,EAAC,yFAAyF,YACtG,YACE,IAAI,EAAC,8BAA8B,EACnC,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAC,2FAA2F,qCAGnG,GACA,IACF,GACQ,CACjB,CAAC;AACJ,CAAC"}
|
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
* Compact text-size toggle for game topbars. 28px square, shows A/A+/A-.
|
|
3
3
|
* Designed to fit in GameTopbar's `actions` slot alongside GameThemeToggle.
|
|
4
4
|
*/
|
|
5
|
-
export declare function GameTextSizeToggle(): import("react
|
|
5
|
+
export declare function GameTextSizeToggle(): import("react").JSX.Element;
|
|
6
6
|
//# sourceMappingURL=GameTextSizeToggle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GameTextSizeToggle.d.ts","sourceRoot":"","sources":["../src/GameTextSizeToggle.tsx"],"names":[],"mappings":"AAsBA;;;GAGG;AACH,wBAAgB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"GameTextSizeToggle.d.ts","sourceRoot":"","sources":["../src/GameTextSizeToggle.tsx"],"names":[],"mappings":"AAsBA;;;GAGG;AACH,wBAAgB,kBAAkB,gCA2BjC"}
|
|
@@ -37,21 +37,6 @@ export function GameTextSizeToggle() {
|
|
|
37
37
|
setSize(next); // the effect applies it
|
|
38
38
|
}, [size]);
|
|
39
39
|
const label = size === 'lg' ? 'A+' : size === 'sm' ? 'A\u2212' : 'A';
|
|
40
|
-
return (_jsx("button", { onClick: cycle, "aria-label": `Text: ${size}`, title: `Text: ${size}`,
|
|
41
|
-
width: 28,
|
|
42
|
-
height: 28,
|
|
43
|
-
borderRadius: 8,
|
|
44
|
-
border: '1px solid var(--line, #e2e8f0)',
|
|
45
|
-
background: 'var(--panel, #ffffff)',
|
|
46
|
-
color: 'var(--ink, #1e293b)',
|
|
47
|
-
display: 'inline-flex',
|
|
48
|
-
alignItems: 'center',
|
|
49
|
-
justifyContent: 'center',
|
|
50
|
-
cursor: 'pointer',
|
|
51
|
-
padding: 0,
|
|
52
|
-
fontFamily: '"Manrope", system-ui, sans-serif',
|
|
53
|
-
fontSize: '0.7rem',
|
|
54
|
-
fontWeight: 700,
|
|
55
|
-
}, children: label }));
|
|
40
|
+
return (_jsx("button", { onClick: cycle, "aria-label": `Text: ${size}`, title: `Text: ${size}`, className: "inline-flex size-7 cursor-pointer items-center justify-center rounded-lg border border-line bg-panel p-0 text-ink text-[0.7rem] font-bold", children: label }));
|
|
56
41
|
}
|
|
57
42
|
//# sourceMappingURL=GameTextSizeToggle.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GameTextSizeToggle.js","sourceRoot":"","sources":["../src/GameTextSizeToggle.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEzD,MAAM,GAAG,GAAG,kBAAkB,CAAC;AAG/B,SAAS,OAAO;IACd,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IACpD,MAAM,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC;IACvC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,KAAK,CAAC,IAAU;IACvB,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO;IAC5C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAC/C,CAAC;IACD,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAO,OAAO,CAAC,CAAC;IAEhD,+EAA+E;IAC/E,qDAAqD;IACrD,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,CAAC,IAAI,CAAC,CAAC;IACd,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,MAAM,KAAK,GAAW,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAE,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB;IACzC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,MAAM,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;IAErE,OAAO,CACL,iBACE,OAAO,EAAE,KAAK,gBACF,SAAS,IAAI,EAAE,EAC3B,KAAK,EAAE,SAAS,IAAI,EAAE,EACtB,
|
|
1
|
+
{"version":3,"file":"GameTextSizeToggle.js","sourceRoot":"","sources":["../src/GameTextSizeToggle.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEzD,MAAM,GAAG,GAAG,kBAAkB,CAAC;AAG/B,SAAS,OAAO;IACd,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IACpD,MAAM,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC;IACvC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,KAAK,CAAC,IAAU;IACvB,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO;IAC5C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAC/C,CAAC;IACD,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAO,OAAO,CAAC,CAAC;IAEhD,+EAA+E;IAC/E,qDAAqD;IACrD,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,CAAC,IAAI,CAAC,CAAC;IACd,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,MAAM,KAAK,GAAW,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAE,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB;IACzC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,MAAM,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;IAErE,OAAO,CACL,iBACE,OAAO,EAAE,KAAK,gBACF,SAAS,IAAI,EAAE,EAC3B,KAAK,EAAE,SAAS,IAAI,EAAE,EACtB,SAAS,EAAC,2IAA2I,YAEpJ,KAAK,GACC,CACV,CAAC;AACJ,CAAC"}
|
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
* Compact theme toggle for game topbars. Sun/moon icon, 28px square.
|
|
3
3
|
* Designed to fit in GameTopbar's `actions` slot.
|
|
4
4
|
*/
|
|
5
|
-
export declare function GameThemeToggle(): import("react
|
|
5
|
+
export declare function GameThemeToggle(): import("react").JSX.Element;
|
|
6
6
|
//# sourceMappingURL=GameThemeToggle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GameThemeToggle.d.ts","sourceRoot":"","sources":["../src/GameThemeToggle.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GameThemeToggle.d.ts","sourceRoot":"","sources":["../src/GameThemeToggle.tsx"],"names":[],"mappings":"AAiDA;;;GAGG;AACH,wBAAgB,eAAe,gCA2E9B"}
|
package/dist/GameThemeToggle.js
CHANGED
|
@@ -1,20 +1,40 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useCallback, useEffect, useState } from 'react';
|
|
3
3
|
const THEME_KEY = 'stores-theme';
|
|
4
|
+
// Storage can be unavailable: privacy modes, blocked third-party storage in an
|
|
5
|
+
// iframe, or disabled cookies make even reading `window.localStorage` throw a
|
|
6
|
+
// SecurityError. This runs during render, so an unguarded access crashed the
|
|
7
|
+
// whole game (#99) — the toggle must degrade to an unsaved preference instead.
|
|
4
8
|
function getStoredPref() {
|
|
5
9
|
if (typeof window === 'undefined')
|
|
6
10
|
return 'system';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
11
|
+
try {
|
|
12
|
+
const s = window.localStorage.getItem(THEME_KEY);
|
|
13
|
+
if (s === 'light' || s === 'dark' || s === 'system')
|
|
14
|
+
return s;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
// Storage blocked — fall back to the default.
|
|
18
|
+
}
|
|
10
19
|
return 'system';
|
|
11
20
|
}
|
|
21
|
+
function storePref(pref) {
|
|
22
|
+
try {
|
|
23
|
+
window.localStorage.setItem(THEME_KEY, pref);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// Storage blocked or full — the theme still applies for this visit.
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function darkQuery() {
|
|
30
|
+
if (typeof window === 'undefined' || typeof window.matchMedia !== 'function')
|
|
31
|
+
return null;
|
|
32
|
+
return window.matchMedia('(prefers-color-scheme: dark)');
|
|
33
|
+
}
|
|
12
34
|
function resolve(pref) {
|
|
13
35
|
if (pref !== 'system')
|
|
14
36
|
return pref;
|
|
15
|
-
return
|
|
16
|
-
? 'dark'
|
|
17
|
-
: 'light';
|
|
37
|
+
return darkQuery()?.matches ? 'dark' : 'light';
|
|
18
38
|
}
|
|
19
39
|
function apply(pref) {
|
|
20
40
|
if (typeof document === 'undefined')
|
|
@@ -26,7 +46,7 @@ function apply(pref) {
|
|
|
26
46
|
else {
|
|
27
47
|
delete document.documentElement.dataset.theme;
|
|
28
48
|
}
|
|
29
|
-
|
|
49
|
+
storePref(pref);
|
|
30
50
|
}
|
|
31
51
|
/**
|
|
32
52
|
* Compact theme toggle for game topbars. Sun/moon icon, 28px square.
|
|
@@ -40,24 +60,27 @@ export function GameThemeToggle() {
|
|
|
40
60
|
useEffect(() => {
|
|
41
61
|
apply(pref);
|
|
42
62
|
}, [pref]);
|
|
63
|
+
// "system" follows the OS: re-apply when the OS theme changes, rather than
|
|
64
|
+
// only on reload.
|
|
65
|
+
const [, setOsTick] = useState(0);
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
if (pref !== 'system')
|
|
68
|
+
return;
|
|
69
|
+
const mq = darkQuery();
|
|
70
|
+
if (!mq)
|
|
71
|
+
return;
|
|
72
|
+
const onChange = () => {
|
|
73
|
+
apply('system');
|
|
74
|
+
setOsTick((n) => n + 1); // re-render so the icon matches
|
|
75
|
+
};
|
|
76
|
+
mq.addEventListener('change', onChange);
|
|
77
|
+
return () => mq.removeEventListener('change', onChange);
|
|
78
|
+
}, [pref]);
|
|
43
79
|
const cycle = useCallback(() => {
|
|
44
80
|
const order = ['system', 'light', 'dark'];
|
|
45
81
|
const next = order[(order.indexOf(pref) + 1) % order.length];
|
|
46
82
|
setPref(next); // the effect applies it
|
|
47
83
|
}, [pref]);
|
|
48
|
-
return (_jsx("button", { onClick: cycle, "aria-label": `Theme: ${pref}`, title: `Theme: ${pref}`,
|
|
49
|
-
width: 28,
|
|
50
|
-
height: 28,
|
|
51
|
-
borderRadius: 8,
|
|
52
|
-
border: '1px solid var(--line, #e2e8f0)',
|
|
53
|
-
background: 'var(--panel, #ffffff)',
|
|
54
|
-
color: 'var(--ink, #1e293b)',
|
|
55
|
-
display: 'inline-flex',
|
|
56
|
-
alignItems: 'center',
|
|
57
|
-
justifyContent: 'center',
|
|
58
|
-
cursor: 'pointer',
|
|
59
|
-
padding: 0,
|
|
60
|
-
fontFamily: 'inherit',
|
|
61
|
-
}, children: theme === 'dark' ? (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("circle", { cx: "12", cy: "12", r: "5" }), _jsx("line", { x1: "12", y1: "1", x2: "12", y2: "3" }), _jsx("line", { x1: "12", y1: "21", x2: "12", y2: "23" }), _jsx("line", { x1: "4.22", y1: "4.22", x2: "5.64", y2: "5.64" }), _jsx("line", { x1: "18.36", y1: "18.36", x2: "19.78", y2: "19.78" }), _jsx("line", { x1: "1", y1: "12", x2: "3", y2: "12" }), _jsx("line", { x1: "21", y1: "12", x2: "23", y2: "12" }), _jsx("line", { x1: "4.22", y1: "19.78", x2: "5.64", y2: "18.36" }), _jsx("line", { x1: "18.36", y1: "5.64", x2: "19.78", y2: "4.22" })] })) : (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" }) })) }));
|
|
84
|
+
return (_jsx("button", { onClick: cycle, "aria-label": `Theme: ${pref}`, title: `Theme: ${pref}`, className: "inline-flex size-7 cursor-pointer items-center justify-center rounded-lg border border-line bg-panel p-0 text-ink", children: theme === 'dark' ? (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("circle", { cx: "12", cy: "12", r: "5" }), _jsx("line", { x1: "12", y1: "1", x2: "12", y2: "3" }), _jsx("line", { x1: "12", y1: "21", x2: "12", y2: "23" }), _jsx("line", { x1: "4.22", y1: "4.22", x2: "5.64", y2: "5.64" }), _jsx("line", { x1: "18.36", y1: "18.36", x2: "19.78", y2: "19.78" }), _jsx("line", { x1: "1", y1: "12", x2: "3", y2: "12" }), _jsx("line", { x1: "21", y1: "12", x2: "23", y2: "12" }), _jsx("line", { x1: "4.22", y1: "19.78", x2: "5.64", y2: "18.36" }), _jsx("line", { x1: "18.36", y1: "5.64", x2: "19.78", y2: "4.22" })] })) : (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" }) })) }));
|
|
62
85
|
}
|
|
63
86
|
//# sourceMappingURL=GameThemeToggle.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GameThemeToggle.js","sourceRoot":"","sources":["../src/GameThemeToggle.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEzD,MAAM,SAAS,GAAG,cAAc,CAAC;AAGjC,SAAS,aAAa;IACpB,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,QAAQ,CAAC;IACnD,MAAM,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"GameThemeToggle.js","sourceRoot":"","sources":["../src/GameThemeToggle.tsx"],"names":[],"mappings":"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"}
|
package/dist/GameTopbar.d.ts
CHANGED
|
@@ -15,14 +15,19 @@ export interface GameTopbarProps {
|
|
|
15
15
|
/** The game's display name. Shows on the left in Manrope. */
|
|
16
16
|
title?: string;
|
|
17
17
|
/**
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* value: score, accent: true }]`.
|
|
18
|
+
* The live score shown in the score pill. Only rendered when `showScore` is
|
|
19
|
+
* true. Without `showScore`, the pill stays hidden (#348).
|
|
21
20
|
*/
|
|
22
21
|
score?: number;
|
|
23
22
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
23
|
+
* Show the live score pill (#348). Off by default, so the topbar stays clean
|
|
24
|
+
* for games that do not use it. Games that want the pill set this to true
|
|
25
|
+
* and pass `score`.
|
|
26
|
+
*/
|
|
27
|
+
showScore?: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Custom stat lineup, e.g. lives, level or time. Each entry renders as a
|
|
30
|
+
* stat pill in the topbar.
|
|
26
31
|
*/
|
|
27
32
|
stats?: GameTopbarStat[];
|
|
28
33
|
/**
|
|
@@ -60,10 +65,10 @@ export interface GameTopbarProps {
|
|
|
60
65
|
}
|
|
61
66
|
/**
|
|
62
67
|
* The single allowed topbar shape for FreeGameStore games. Brand
|
|
63
|
-
* consistency: same font, same paddings, same
|
|
68
|
+
* consistency: same font, same paddings, same colour tokens, same stat
|
|
64
69
|
* layout across every game on the storefront.
|
|
65
70
|
*
|
|
66
71
|
* Use inside <GameShell topbar={<GameTopbar … />}>.
|
|
67
72
|
*/
|
|
68
|
-
export declare function GameTopbar({ title, score, stats, actions, rules, about, onPlayPause, paused, onRestart, }: GameTopbarProps): React.JSX.Element;
|
|
73
|
+
export declare function GameTopbar({ title, score, showScore, stats, actions, rules, about, onPlayPause, paused, onRestart, }: GameTopbarProps): React.JSX.Element;
|
|
69
74
|
//# sourceMappingURL=GameTopbar.d.ts.map
|
package/dist/GameTopbar.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GameTopbar.d.ts","sourceRoot":"","sources":["../src/GameTopbar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"GameTopbar.d.ts","sourceRoot":"","sources":["../src/GameTopbar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,KAAK,EAAE,SAAS,CAAC;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IAEzB;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IAEpB;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAElB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAElB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IAEzB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAkED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,KAAK,EACL,SAAiB,EACjB,KAAK,EACL,OAAO,EACP,KAAK,EACL,KAAK,EACL,WAAW,EACX,MAAM,EACN,SAAS,GACV,EAAE,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAwKrC"}
|