@scriptonita/chess-football-ui 0.7.0 → 0.9.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 +32 -0
- package/dist/{chunk-LTFNSTAQ.cjs → chunk-BSE4DUXM.cjs} +18 -5
- package/dist/chunk-BSE4DUXM.cjs.map +1 -0
- package/dist/{chunk-N24LGLLO.js → chunk-C5HCN7O5.js} +18 -6
- package/dist/chunk-C5HCN7O5.js.map +1 -0
- package/dist/index.cjs +382 -104
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +77 -7
- package/dist/index.d.ts +77 -7
- package/dist/index.js +378 -103
- package/dist/index.js.map +1 -1
- package/dist/store.cjs +7 -3
- package/dist/store.d.cts +9 -1
- package/dist/store.d.ts +9 -1
- package/dist/store.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-LTFNSTAQ.cjs.map +0 -1
- package/dist/chunk-N24LGLLO.js.map +0 -1
package/dist/index.d.cts
CHANGED
|
@@ -15,8 +15,9 @@ interface GameBoardProps {
|
|
|
15
15
|
* `KeyboardShortcutsList` itself (e.g. in a side panel) so nothing is shown twice.
|
|
16
16
|
*/
|
|
17
17
|
toolbar?: boolean;
|
|
18
|
+
className?: string;
|
|
18
19
|
}
|
|
19
|
-
declare function GameBoard({ userSide, showCoordinates, keyboardNav, toolbar }: GameBoardProps): react.JSX.Element | null;
|
|
20
|
+
declare function GameBoard({ userSide, showCoordinates, keyboardNav, toolbar, className }: GameBoardProps): react.JSX.Element | null;
|
|
20
21
|
|
|
21
22
|
interface GamePieceProps {
|
|
22
23
|
piece: Piece;
|
|
@@ -43,8 +44,9 @@ interface ScoreboardProps {
|
|
|
43
44
|
creatorAvatarUrl?: string;
|
|
44
45
|
opponentAvatarUrl?: string;
|
|
45
46
|
userSide?: 'white' | 'black' | null;
|
|
47
|
+
className?: string;
|
|
46
48
|
}
|
|
47
|
-
declare function Scoreboard({ creatorUsername, opponentUsername, creatorAvatarUrl, opponentAvatarUrl, userSide, }: ScoreboardProps): react.JSX.Element | null;
|
|
49
|
+
declare function Scoreboard({ creatorUsername, opponentUsername, creatorAvatarUrl, opponentAvatarUrl, userSide, className, }: ScoreboardProps): react.JSX.Element | null;
|
|
48
50
|
|
|
49
51
|
interface MiniScoreboardProps {
|
|
50
52
|
creatorUsername: string;
|
|
@@ -60,8 +62,9 @@ declare function MiniScoreboard({ creatorUsername, opponentUsername, userSide, c
|
|
|
60
62
|
|
|
61
63
|
interface GameControlsProps {
|
|
62
64
|
isMyTurn: boolean;
|
|
65
|
+
className?: string;
|
|
63
66
|
}
|
|
64
|
-
declare function GameControls({ isMyTurn }: GameControlsProps): react.JSX.Element | null;
|
|
67
|
+
declare function GameControls({ isMyTurn, className }: GameControlsProps): react.JSX.Element | null;
|
|
65
68
|
|
|
66
69
|
interface SelectedPieceDetailProps {
|
|
67
70
|
isMyTurn: boolean;
|
|
@@ -86,7 +89,34 @@ interface MoveHistoryProps {
|
|
|
86
89
|
*/
|
|
87
90
|
declare function MoveHistory({ scrollable, limit, className }: MoveHistoryProps): react.JSX.Element;
|
|
88
91
|
|
|
89
|
-
declare function StaticGameBoard(
|
|
92
|
+
declare function StaticGameBoard({ className }?: {
|
|
93
|
+
className?: string;
|
|
94
|
+
}): react.JSX.Element;
|
|
95
|
+
|
|
96
|
+
interface PlayerIdentityProps {
|
|
97
|
+
name: string;
|
|
98
|
+
team: string;
|
|
99
|
+
/**
|
|
100
|
+
* `full` — the side panels and the mobile scoreboard: name on its own line,
|
|
101
|
+
* team beneath it. `compact` — the tablet/desktop mini-scoreboard, where the
|
|
102
|
+
* pair shares one line.
|
|
103
|
+
*/
|
|
104
|
+
variant?: 'full' | 'compact';
|
|
105
|
+
isActive?: boolean;
|
|
106
|
+
align?: 'left' | 'right';
|
|
107
|
+
/** Rendered inline after the team label (e.g. the active-turn pulse dot). */
|
|
108
|
+
adornment?: React.ReactNode;
|
|
109
|
+
className?: string;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* One player's name and team.
|
|
113
|
+
*
|
|
114
|
+
* `Scoreboard` set this in Inter 13px semibold with the team in mono 10px, and
|
|
115
|
+
* `MiniScoreboard` in mono 10px uppercase joined by a middot — so the same
|
|
116
|
+
* player changed appearance on a viewport change. Both now render this, and the
|
|
117
|
+
* only difference left is the deliberate one: how much room there is.
|
|
118
|
+
*/
|
|
119
|
+
declare function PlayerIdentity({ name, team, variant, isActive, align, adornment, className, }: PlayerIdentityProps): react.JSX.Element;
|
|
90
120
|
|
|
91
121
|
declare const PITCH_COLS = 9;
|
|
92
122
|
declare const PITCH_ROWS = 12;
|
|
@@ -246,6 +276,27 @@ interface ConfirmDialogProps {
|
|
|
246
276
|
}
|
|
247
277
|
declare function ConfirmDialog({ open, title, description, confirmLabel, cancelLabel, onConfirm, onCancel }: ConfirmDialogProps): react.JSX.Element | null;
|
|
248
278
|
|
|
279
|
+
/**
|
|
280
|
+
* Every CSS custom property the package's Tailwind classes resolve against.
|
|
281
|
+
*
|
|
282
|
+
* A token the host app does not define fails *silently*: Tailwind emits the
|
|
283
|
+
* rule, the variable resolves to nothing, and the declaration is dropped. That
|
|
284
|
+
* is how `--last-move-highlight` went missing in the CrazyGames SPA — the
|
|
285
|
+
* last-move highlight and the bot's turn replay simply never rendered, with no
|
|
286
|
+
* error anywhere.
|
|
287
|
+
*
|
|
288
|
+
* This is the visual counterpart to `GAME_I18N_KEYS`: assert it in each app.
|
|
289
|
+
*
|
|
290
|
+
* ```ts
|
|
291
|
+
* import { REQUIRED_TOKENS } from '@scriptonita/chess-football-ui'
|
|
292
|
+
*
|
|
293
|
+
* const css = readFileSync('src/index.css', 'utf8')
|
|
294
|
+
* expect(REQUIRED_TOKENS.filter(t => !css.includes(`${t}:`))).toEqual([])
|
|
295
|
+
* ```
|
|
296
|
+
*/
|
|
297
|
+
declare const REQUIRED_TOKENS: readonly ["--bg-primary", "--bg-secondary", "--bg-surface", "--bg-surface-elevated", "--fg-primary", "--fg-secondary", "--fg-muted", "--accent-green", "--accent-green-light", "--accent-green-dark", "--border-subtle", "--danger", "--warning", "--field-green-1", "--field-green-2", "--field-frame", "--move-highlight", "--pass-highlight", "--last-move-highlight"];
|
|
298
|
+
type RequiredToken = (typeof REQUIRED_TOKENS)[number];
|
|
299
|
+
|
|
249
300
|
/**
|
|
250
301
|
* A translator scoped to the `game` namespace: `t('yourTurn')`, `t('move')`, …
|
|
251
302
|
* Each host app supplies one bound to its own i18n library:
|
|
@@ -259,11 +310,11 @@ type GameTranslator = (key: string, values?: Record<string, unknown>) => string;
|
|
|
259
310
|
* grep -rhoE "t\('[a-zA-Z0-9_.]+'" src/components | sed -E "s/t\('//;s/'//" | sort -u
|
|
260
311
|
* (the dynamic `pieces.*` / `eventToast.*` families are derived separately below).
|
|
261
312
|
*/
|
|
262
|
-
declare const STATIC_I18N_KEYS: readonly ["actionPointsAriaLabel", "actionPointsShort", "ballHolder", "endTurn", "endTurnConfirm", "endTurnConfirmDescription", "endTurnConfirmYes", "endTurnKeepPlaying", "history.empty", "history.goal", "history.interception", "history.move", "history.offside", "history.pass", "history.tackle", "history.title", "history.turn", "history.viewAll", "move", "offsideWarning", "pass", "selectedPiece.alreadyMoved", "selectedPiece.atSquare", "selectedPiece.empty", "selectedPiece.hasBall", "shortcuts.arrows", "shortcuts.buttonLabel", "shortcuts.cancel", "shortcuts.move", "shortcuts.pass", "shortcuts.select", "shortcuts.title", "teamBlack", "teamWhite", "waitingRival", "yourTurn"];
|
|
313
|
+
declare const STATIC_I18N_KEYS: readonly ["actionPointsAriaLabel", "actionPointsShort", "ballHolder", "boardAriaLabel", "endTurn", "endTurnConfirm", "endTurnConfirmDescription", "endTurnConfirmYes", "endTurnKeepPlaying", "history.empty", "history.goal", "history.interception", "history.move", "history.offside", "history.pass", "history.tackle", "history.title", "history.close", "history.turn", "history.viewAll", "move", "offsideWarning", "pass", "scoreAriaLabel", "selectedPiece.alreadyMoved", "selectedPiece.atSquare", "selectedPiece.empty", "selectedPiece.hasBall", "shortcuts.arrows", "shortcuts.buttonLabel", "shortcuts.cancel", "shortcuts.move", "shortcuts.pass", "shortcuts.select", "shortcuts.title", "square.empty", "square.emptyWithBall", "square.moveOrPassTarget", "square.moveTarget", "square.passTarget", "square.piece", "square.pieceWithBall", "square.selected", "teamBlack", "teamWhite", "waitingRival", "yourTurn"];
|
|
263
314
|
/** `pieces.*` — one key per short and long piece label the engine exposes (move-history, selected-piece-detail). */
|
|
264
315
|
type PieceI18nKey = `pieces.${PieceShortKey | PieceLongKey}`;
|
|
265
316
|
/** `eventToast.*` — one key per toastable event (see `ToastEvent` in `event-toast.tsx`). */
|
|
266
|
-
type EventToastI18nKey = `eventToast.${'interception' | 'offside' | 'tackle'}`;
|
|
317
|
+
type EventToastI18nKey = `eventToast.${'goal' | 'interception' | 'offside' | 'tackle'}`;
|
|
267
318
|
/** Union of every `game`-namespace key the package reads. */
|
|
268
319
|
type GameI18nKey = (typeof STATIC_I18N_KEYS)[number] | PieceI18nKey | EventToastI18nKey;
|
|
269
320
|
/**
|
|
@@ -283,4 +334,23 @@ declare function useGameT(): GameTranslator;
|
|
|
283
334
|
|
|
284
335
|
declare function cn(...inputs: ClassValue[]): string;
|
|
285
336
|
|
|
286
|
-
|
|
337
|
+
interface DialogA11yOptions {
|
|
338
|
+
open: boolean;
|
|
339
|
+
onClose: () => void;
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* The four behaviours `aria-modal="true"` promises but does not implement.
|
|
343
|
+
* Declaring `aria-modal` without them is worse than not declaring it at all:
|
|
344
|
+
* assistive tech stops exposing the page behind the dialog while the keyboard
|
|
345
|
+
* happily walks straight into it.
|
|
346
|
+
*
|
|
347
|
+
* 1. Initial focus — the first focusable control, or the panel itself.
|
|
348
|
+
* 2. Focus trap — Tab / Shift+Tab cycle inside the panel.
|
|
349
|
+
* 3. Escape closes.
|
|
350
|
+
* 4. Focus returns to whatever opened the dialog.
|
|
351
|
+
*
|
|
352
|
+
* Attach the returned ref to the dialog panel (the node carrying `role="dialog"`).
|
|
353
|
+
*/
|
|
354
|
+
declare function useDialogA11y({ open, onClose }: DialogA11yOptions): react.RefObject<HTMLDivElement | null>;
|
|
355
|
+
|
|
356
|
+
export { ActionPoints, Avatar, AvatarFallback, AvatarImage, BallHolderChip, Button, type ButtonProps, ConfirmDialog, EventToast, Football, GAME_I18N_KEYS, GOAL_AREA_SHADE_CLASS, GameBoard, GameControls, type GameI18nKey, GameI18nProvider, GamePiece, type GameTranslator, GrassOverlay, KeyboardShortcutsList, MiniScoreboard, MobileHistory, MoveHistory, PITCH_COLS, PITCH_ROWS, PitchMarkings, PitchSurface, PlayerIdentity, REQUIRED_TOKENS, type RequiredToken, Scoreboard, SelectedPieceDetail, StaticGameBoard, TurnBanner, cn, isGoalAreaSquare, pitchSquareClass, useDialogA11y, useGameT };
|
package/dist/index.d.ts
CHANGED
|
@@ -15,8 +15,9 @@ interface GameBoardProps {
|
|
|
15
15
|
* `KeyboardShortcutsList` itself (e.g. in a side panel) so nothing is shown twice.
|
|
16
16
|
*/
|
|
17
17
|
toolbar?: boolean;
|
|
18
|
+
className?: string;
|
|
18
19
|
}
|
|
19
|
-
declare function GameBoard({ userSide, showCoordinates, keyboardNav, toolbar }: GameBoardProps): react.JSX.Element | null;
|
|
20
|
+
declare function GameBoard({ userSide, showCoordinates, keyboardNav, toolbar, className }: GameBoardProps): react.JSX.Element | null;
|
|
20
21
|
|
|
21
22
|
interface GamePieceProps {
|
|
22
23
|
piece: Piece;
|
|
@@ -43,8 +44,9 @@ interface ScoreboardProps {
|
|
|
43
44
|
creatorAvatarUrl?: string;
|
|
44
45
|
opponentAvatarUrl?: string;
|
|
45
46
|
userSide?: 'white' | 'black' | null;
|
|
47
|
+
className?: string;
|
|
46
48
|
}
|
|
47
|
-
declare function Scoreboard({ creatorUsername, opponentUsername, creatorAvatarUrl, opponentAvatarUrl, userSide, }: ScoreboardProps): react.JSX.Element | null;
|
|
49
|
+
declare function Scoreboard({ creatorUsername, opponentUsername, creatorAvatarUrl, opponentAvatarUrl, userSide, className, }: ScoreboardProps): react.JSX.Element | null;
|
|
48
50
|
|
|
49
51
|
interface MiniScoreboardProps {
|
|
50
52
|
creatorUsername: string;
|
|
@@ -60,8 +62,9 @@ declare function MiniScoreboard({ creatorUsername, opponentUsername, userSide, c
|
|
|
60
62
|
|
|
61
63
|
interface GameControlsProps {
|
|
62
64
|
isMyTurn: boolean;
|
|
65
|
+
className?: string;
|
|
63
66
|
}
|
|
64
|
-
declare function GameControls({ isMyTurn }: GameControlsProps): react.JSX.Element | null;
|
|
67
|
+
declare function GameControls({ isMyTurn, className }: GameControlsProps): react.JSX.Element | null;
|
|
65
68
|
|
|
66
69
|
interface SelectedPieceDetailProps {
|
|
67
70
|
isMyTurn: boolean;
|
|
@@ -86,7 +89,34 @@ interface MoveHistoryProps {
|
|
|
86
89
|
*/
|
|
87
90
|
declare function MoveHistory({ scrollable, limit, className }: MoveHistoryProps): react.JSX.Element;
|
|
88
91
|
|
|
89
|
-
declare function StaticGameBoard(
|
|
92
|
+
declare function StaticGameBoard({ className }?: {
|
|
93
|
+
className?: string;
|
|
94
|
+
}): react.JSX.Element;
|
|
95
|
+
|
|
96
|
+
interface PlayerIdentityProps {
|
|
97
|
+
name: string;
|
|
98
|
+
team: string;
|
|
99
|
+
/**
|
|
100
|
+
* `full` — the side panels and the mobile scoreboard: name on its own line,
|
|
101
|
+
* team beneath it. `compact` — the tablet/desktop mini-scoreboard, where the
|
|
102
|
+
* pair shares one line.
|
|
103
|
+
*/
|
|
104
|
+
variant?: 'full' | 'compact';
|
|
105
|
+
isActive?: boolean;
|
|
106
|
+
align?: 'left' | 'right';
|
|
107
|
+
/** Rendered inline after the team label (e.g. the active-turn pulse dot). */
|
|
108
|
+
adornment?: React.ReactNode;
|
|
109
|
+
className?: string;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* One player's name and team.
|
|
113
|
+
*
|
|
114
|
+
* `Scoreboard` set this in Inter 13px semibold with the team in mono 10px, and
|
|
115
|
+
* `MiniScoreboard` in mono 10px uppercase joined by a middot — so the same
|
|
116
|
+
* player changed appearance on a viewport change. Both now render this, and the
|
|
117
|
+
* only difference left is the deliberate one: how much room there is.
|
|
118
|
+
*/
|
|
119
|
+
declare function PlayerIdentity({ name, team, variant, isActive, align, adornment, className, }: PlayerIdentityProps): react.JSX.Element;
|
|
90
120
|
|
|
91
121
|
declare const PITCH_COLS = 9;
|
|
92
122
|
declare const PITCH_ROWS = 12;
|
|
@@ -246,6 +276,27 @@ interface ConfirmDialogProps {
|
|
|
246
276
|
}
|
|
247
277
|
declare function ConfirmDialog({ open, title, description, confirmLabel, cancelLabel, onConfirm, onCancel }: ConfirmDialogProps): react.JSX.Element | null;
|
|
248
278
|
|
|
279
|
+
/**
|
|
280
|
+
* Every CSS custom property the package's Tailwind classes resolve against.
|
|
281
|
+
*
|
|
282
|
+
* A token the host app does not define fails *silently*: Tailwind emits the
|
|
283
|
+
* rule, the variable resolves to nothing, and the declaration is dropped. That
|
|
284
|
+
* is how `--last-move-highlight` went missing in the CrazyGames SPA — the
|
|
285
|
+
* last-move highlight and the bot's turn replay simply never rendered, with no
|
|
286
|
+
* error anywhere.
|
|
287
|
+
*
|
|
288
|
+
* This is the visual counterpart to `GAME_I18N_KEYS`: assert it in each app.
|
|
289
|
+
*
|
|
290
|
+
* ```ts
|
|
291
|
+
* import { REQUIRED_TOKENS } from '@scriptonita/chess-football-ui'
|
|
292
|
+
*
|
|
293
|
+
* const css = readFileSync('src/index.css', 'utf8')
|
|
294
|
+
* expect(REQUIRED_TOKENS.filter(t => !css.includes(`${t}:`))).toEqual([])
|
|
295
|
+
* ```
|
|
296
|
+
*/
|
|
297
|
+
declare const REQUIRED_TOKENS: readonly ["--bg-primary", "--bg-secondary", "--bg-surface", "--bg-surface-elevated", "--fg-primary", "--fg-secondary", "--fg-muted", "--accent-green", "--accent-green-light", "--accent-green-dark", "--border-subtle", "--danger", "--warning", "--field-green-1", "--field-green-2", "--field-frame", "--move-highlight", "--pass-highlight", "--last-move-highlight"];
|
|
298
|
+
type RequiredToken = (typeof REQUIRED_TOKENS)[number];
|
|
299
|
+
|
|
249
300
|
/**
|
|
250
301
|
* A translator scoped to the `game` namespace: `t('yourTurn')`, `t('move')`, …
|
|
251
302
|
* Each host app supplies one bound to its own i18n library:
|
|
@@ -259,11 +310,11 @@ type GameTranslator = (key: string, values?: Record<string, unknown>) => string;
|
|
|
259
310
|
* grep -rhoE "t\('[a-zA-Z0-9_.]+'" src/components | sed -E "s/t\('//;s/'//" | sort -u
|
|
260
311
|
* (the dynamic `pieces.*` / `eventToast.*` families are derived separately below).
|
|
261
312
|
*/
|
|
262
|
-
declare const STATIC_I18N_KEYS: readonly ["actionPointsAriaLabel", "actionPointsShort", "ballHolder", "endTurn", "endTurnConfirm", "endTurnConfirmDescription", "endTurnConfirmYes", "endTurnKeepPlaying", "history.empty", "history.goal", "history.interception", "history.move", "history.offside", "history.pass", "history.tackle", "history.title", "history.turn", "history.viewAll", "move", "offsideWarning", "pass", "selectedPiece.alreadyMoved", "selectedPiece.atSquare", "selectedPiece.empty", "selectedPiece.hasBall", "shortcuts.arrows", "shortcuts.buttonLabel", "shortcuts.cancel", "shortcuts.move", "shortcuts.pass", "shortcuts.select", "shortcuts.title", "teamBlack", "teamWhite", "waitingRival", "yourTurn"];
|
|
313
|
+
declare const STATIC_I18N_KEYS: readonly ["actionPointsAriaLabel", "actionPointsShort", "ballHolder", "boardAriaLabel", "endTurn", "endTurnConfirm", "endTurnConfirmDescription", "endTurnConfirmYes", "endTurnKeepPlaying", "history.empty", "history.goal", "history.interception", "history.move", "history.offside", "history.pass", "history.tackle", "history.title", "history.close", "history.turn", "history.viewAll", "move", "offsideWarning", "pass", "scoreAriaLabel", "selectedPiece.alreadyMoved", "selectedPiece.atSquare", "selectedPiece.empty", "selectedPiece.hasBall", "shortcuts.arrows", "shortcuts.buttonLabel", "shortcuts.cancel", "shortcuts.move", "shortcuts.pass", "shortcuts.select", "shortcuts.title", "square.empty", "square.emptyWithBall", "square.moveOrPassTarget", "square.moveTarget", "square.passTarget", "square.piece", "square.pieceWithBall", "square.selected", "teamBlack", "teamWhite", "waitingRival", "yourTurn"];
|
|
263
314
|
/** `pieces.*` — one key per short and long piece label the engine exposes (move-history, selected-piece-detail). */
|
|
264
315
|
type PieceI18nKey = `pieces.${PieceShortKey | PieceLongKey}`;
|
|
265
316
|
/** `eventToast.*` — one key per toastable event (see `ToastEvent` in `event-toast.tsx`). */
|
|
266
|
-
type EventToastI18nKey = `eventToast.${'interception' | 'offside' | 'tackle'}`;
|
|
317
|
+
type EventToastI18nKey = `eventToast.${'goal' | 'interception' | 'offside' | 'tackle'}`;
|
|
267
318
|
/** Union of every `game`-namespace key the package reads. */
|
|
268
319
|
type GameI18nKey = (typeof STATIC_I18N_KEYS)[number] | PieceI18nKey | EventToastI18nKey;
|
|
269
320
|
/**
|
|
@@ -283,4 +334,23 @@ declare function useGameT(): GameTranslator;
|
|
|
283
334
|
|
|
284
335
|
declare function cn(...inputs: ClassValue[]): string;
|
|
285
336
|
|
|
286
|
-
|
|
337
|
+
interface DialogA11yOptions {
|
|
338
|
+
open: boolean;
|
|
339
|
+
onClose: () => void;
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* The four behaviours `aria-modal="true"` promises but does not implement.
|
|
343
|
+
* Declaring `aria-modal` without them is worse than not declaring it at all:
|
|
344
|
+
* assistive tech stops exposing the page behind the dialog while the keyboard
|
|
345
|
+
* happily walks straight into it.
|
|
346
|
+
*
|
|
347
|
+
* 1. Initial focus — the first focusable control, or the panel itself.
|
|
348
|
+
* 2. Focus trap — Tab / Shift+Tab cycle inside the panel.
|
|
349
|
+
* 3. Escape closes.
|
|
350
|
+
* 4. Focus returns to whatever opened the dialog.
|
|
351
|
+
*
|
|
352
|
+
* Attach the returned ref to the dialog panel (the node carrying `role="dialog"`).
|
|
353
|
+
*/
|
|
354
|
+
declare function useDialogA11y({ open, onClose }: DialogA11yOptions): react.RefObject<HTMLDivElement | null>;
|
|
355
|
+
|
|
356
|
+
export { ActionPoints, Avatar, AvatarFallback, AvatarImage, BallHolderChip, Button, type ButtonProps, ConfirmDialog, EventToast, Football, GAME_I18N_KEYS, GOAL_AREA_SHADE_CLASS, GameBoard, GameControls, type GameI18nKey, GameI18nProvider, GamePiece, type GameTranslator, GrassOverlay, KeyboardShortcutsList, MiniScoreboard, MobileHistory, MoveHistory, PITCH_COLS, PITCH_ROWS, PitchMarkings, PitchSurface, PlayerIdentity, REQUIRED_TOKENS, type RequiredToken, Scoreboard, SelectedPieceDetail, StaticGameBoard, TurnBanner, cn, isGoalAreaSquare, pitchSquareClass, useDialogA11y, useGameT };
|