brainrot-cli 0.1.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.
Files changed (162) hide show
  1. package/README.md +372 -0
  2. package/dist/AchievementNotification.d.ts +28 -0
  3. package/dist/AchievementNotification.d.ts.map +1 -0
  4. package/dist/AchievementNotification.js +74 -0
  5. package/dist/AchievementNotification.js.map +1 -0
  6. package/dist/GameSelector.d.ts +25 -0
  7. package/dist/GameSelector.d.ts.map +1 -0
  8. package/dist/GameSelector.js +105 -0
  9. package/dist/GameSelector.js.map +1 -0
  10. package/dist/HelpOverlay.d.ts +15 -0
  11. package/dist/HelpOverlay.d.ts.map +1 -0
  12. package/dist/HelpOverlay.js +134 -0
  13. package/dist/HelpOverlay.js.map +1 -0
  14. package/dist/Layout.d.ts +49 -0
  15. package/dist/Layout.d.ts.map +1 -0
  16. package/dist/Layout.js +83 -0
  17. package/dist/Layout.js.map +1 -0
  18. package/dist/Leaderboard.d.ts +46 -0
  19. package/dist/Leaderboard.d.ts.map +1 -0
  20. package/dist/Leaderboard.js +68 -0
  21. package/dist/Leaderboard.js.map +1 -0
  22. package/dist/LogViewer.d.ts +33 -0
  23. package/dist/LogViewer.d.ts.map +1 -0
  24. package/dist/LogViewer.js +179 -0
  25. package/dist/LogViewer.js.map +1 -0
  26. package/dist/LoopAlertOverlay.d.ts +15 -0
  27. package/dist/LoopAlertOverlay.d.ts.map +1 -0
  28. package/dist/LoopAlertOverlay.js +17 -0
  29. package/dist/LoopAlertOverlay.js.map +1 -0
  30. package/dist/LoopManagementPanel.d.ts +44 -0
  31. package/dist/LoopManagementPanel.d.ts.map +1 -0
  32. package/dist/LoopManagementPanel.js +220 -0
  33. package/dist/LoopManagementPanel.js.map +1 -0
  34. package/dist/SettingsMenu.d.ts +22 -0
  35. package/dist/SettingsMenu.d.ts.map +1 -0
  36. package/dist/SettingsMenu.js +367 -0
  37. package/dist/SettingsMenu.js.map +1 -0
  38. package/dist/SplitPane.d.ts +63 -0
  39. package/dist/SplitPane.d.ts.map +1 -0
  40. package/dist/SplitPane.js +104 -0
  41. package/dist/SplitPane.js.map +1 -0
  42. package/dist/StatsMenu.d.ts +15 -0
  43. package/dist/StatsMenu.d.ts.map +1 -0
  44. package/dist/StatsMenu.js +230 -0
  45. package/dist/StatsMenu.js.map +1 -0
  46. package/dist/StatusBar.d.ts +58 -0
  47. package/dist/StatusBar.d.ts.map +1 -0
  48. package/dist/StatusBar.js +106 -0
  49. package/dist/StatusBar.js.map +1 -0
  50. package/dist/__tests__/ralph-loop-parser.test.d.ts +2 -0
  51. package/dist/__tests__/ralph-loop-parser.test.d.ts.map +1 -0
  52. package/dist/__tests__/ralph-loop-parser.test.js +143 -0
  53. package/dist/__tests__/ralph-loop-parser.test.js.map +1 -0
  54. package/dist/claude-code-process.d.ts +76 -0
  55. package/dist/claude-code-process.d.ts.map +1 -0
  56. package/dist/claude-code-process.js +221 -0
  57. package/dist/claude-code-process.js.map +1 -0
  58. package/dist/cli.d.ts +42 -0
  59. package/dist/cli.d.ts.map +1 -0
  60. package/dist/cli.js +265 -0
  61. package/dist/cli.js.map +1 -0
  62. package/dist/config.d.ts +206 -0
  63. package/dist/config.d.ts.map +1 -0
  64. package/dist/config.js +270 -0
  65. package/dist/config.js.map +1 -0
  66. package/dist/game-types.d.ts +177 -0
  67. package/dist/game-types.d.ts.map +1 -0
  68. package/dist/game-types.js +55 -0
  69. package/dist/game-types.js.map +1 -0
  70. package/dist/games/MinesweeperGame.d.ts +15 -0
  71. package/dist/games/MinesweeperGame.d.ts.map +1 -0
  72. package/dist/games/MinesweeperGame.js +555 -0
  73. package/dist/games/MinesweeperGame.js.map +1 -0
  74. package/dist/games/PongGame.d.ts +15 -0
  75. package/dist/games/PongGame.d.ts.map +1 -0
  76. package/dist/games/PongGame.js +379 -0
  77. package/dist/games/PongGame.js.map +1 -0
  78. package/dist/games/SnakeGame.d.ts +15 -0
  79. package/dist/games/SnakeGame.d.ts.map +1 -0
  80. package/dist/games/SnakeGame.js +333 -0
  81. package/dist/games/SnakeGame.js.map +1 -0
  82. package/dist/games/TetrisGame.d.ts +15 -0
  83. package/dist/games/TetrisGame.d.ts.map +1 -0
  84. package/dist/games/TetrisGame.js +654 -0
  85. package/dist/games/TetrisGame.js.map +1 -0
  86. package/dist/games/index.d.ts +23 -0
  87. package/dist/games/index.d.ts.map +1 -0
  88. package/dist/games/index.js +47 -0
  89. package/dist/games/index.js.map +1 -0
  90. package/dist/high-scores.d.ts +57 -0
  91. package/dist/high-scores.d.ts.map +1 -0
  92. package/dist/high-scores.js +230 -0
  93. package/dist/high-scores.js.map +1 -0
  94. package/dist/index.d.ts +3 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +264 -0
  97. package/dist/index.js.map +1 -0
  98. package/dist/ralph-loop-parser.d.ts +58 -0
  99. package/dist/ralph-loop-parser.d.ts.map +1 -0
  100. package/dist/ralph-loop-parser.js +315 -0
  101. package/dist/ralph-loop-parser.js.map +1 -0
  102. package/dist/stats.d.ts +142 -0
  103. package/dist/stats.d.ts.map +1 -0
  104. package/dist/stats.js +521 -0
  105. package/dist/stats.js.map +1 -0
  106. package/dist/styled-components.d.ts +231 -0
  107. package/dist/styled-components.d.ts.map +1 -0
  108. package/dist/styled-components.js +192 -0
  109. package/dist/styled-components.js.map +1 -0
  110. package/dist/theme.d.ts +301 -0
  111. package/dist/theme.d.ts.map +1 -0
  112. package/dist/theme.js +372 -0
  113. package/dist/theme.js.map +1 -0
  114. package/dist/themes.d.ts +117 -0
  115. package/dist/themes.d.ts.map +1 -0
  116. package/dist/themes.js +296 -0
  117. package/dist/themes.js.map +1 -0
  118. package/dist/ui/index.d.ts +13 -0
  119. package/dist/ui/index.d.ts.map +1 -0
  120. package/dist/ui/index.js +29 -0
  121. package/dist/ui/index.js.map +1 -0
  122. package/dist/use-claude-code.d.ts +30 -0
  123. package/dist/use-claude-code.d.ts.map +1 -0
  124. package/dist/use-claude-code.js +84 -0
  125. package/dist/use-claude-code.js.map +1 -0
  126. package/dist/use-config.d.ts +58 -0
  127. package/dist/use-config.d.ts.map +1 -0
  128. package/dist/use-config.js +113 -0
  129. package/dist/use-config.js.map +1 -0
  130. package/dist/use-game-loop.d.ts +47 -0
  131. package/dist/use-game-loop.d.ts.map +1 -0
  132. package/dist/use-game-loop.js +136 -0
  133. package/dist/use-game-loop.js.map +1 -0
  134. package/dist/use-high-scores.d.ts +41 -0
  135. package/dist/use-high-scores.d.ts.map +1 -0
  136. package/dist/use-high-scores.js +94 -0
  137. package/dist/use-high-scores.js.map +1 -0
  138. package/dist/use-layout-state.d.ts +77 -0
  139. package/dist/use-layout-state.d.ts.map +1 -0
  140. package/dist/use-layout-state.js +160 -0
  141. package/dist/use-layout-state.js.map +1 -0
  142. package/dist/use-ralph-loop.d.ts +41 -0
  143. package/dist/use-ralph-loop.d.ts.map +1 -0
  144. package/dist/use-ralph-loop.js +106 -0
  145. package/dist/use-ralph-loop.js.map +1 -0
  146. package/dist/use-spinner.d.ts +46 -0
  147. package/dist/use-spinner.d.ts.map +1 -0
  148. package/dist/use-spinner.js +71 -0
  149. package/dist/use-spinner.js.map +1 -0
  150. package/dist/use-stats.d.ts +59 -0
  151. package/dist/use-stats.d.ts.map +1 -0
  152. package/dist/use-stats.js +150 -0
  153. package/dist/use-stats.js.map +1 -0
  154. package/dist/use-terminal-size.d.ts +29 -0
  155. package/dist/use-terminal-size.d.ts.map +1 -0
  156. package/dist/use-terminal-size.js +48 -0
  157. package/dist/use-terminal-size.js.map +1 -0
  158. package/dist/useTheme.d.ts +76 -0
  159. package/dist/useTheme.d.ts.map +1 -0
  160. package/dist/useTheme.js +136 -0
  161. package/dist/useTheme.js.map +1 -0
  162. package/package.json +58 -0
@@ -0,0 +1,333 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Snake Game
4
+ *
5
+ * Classic snake game implemented with the game framework.
6
+ * Demonstrates game loop, input handling, and rendering patterns.
7
+ */
8
+ import { Box, Text, useInput } from "ink";
9
+ import { useState, useCallback, useEffect, useRef } from "react";
10
+ import { directionToVector, pointsEqual, addVectors, } from "../game-types.js";
11
+ import { useGameLoop } from "../use-game-loop.js";
12
+ import { useHighScores } from "../use-high-scores.js";
13
+ import { useGameSession } from "../use-stats.js";
14
+ import { Leaderboard, NewHighScoreBanner } from "../Leaderboard.js";
15
+ import { LoopAlertOverlay } from "../LoopAlertOverlay.js";
16
+ /** Snake game metadata */
17
+ export const snakeGameInfo = {
18
+ id: "snake",
19
+ name: "Snake",
20
+ description: "Classic snake game - eat food to grow, avoid walls and yourself!",
21
+ controls: "Arrow keys/WASD to move, P to pause, R to restart",
22
+ minWidth: 20,
23
+ minHeight: 10,
24
+ };
25
+ function createInitialState(width, height) {
26
+ const centerX = Math.floor(width / 2);
27
+ const centerY = Math.floor(height / 2);
28
+ return {
29
+ snake: [
30
+ { x: centerX, y: centerY },
31
+ { x: centerX - 1, y: centerY },
32
+ { x: centerX - 2, y: centerY },
33
+ ],
34
+ direction: "right",
35
+ nextDirection: "right",
36
+ food: spawnFood(width, height, [{ x: centerX, y: centerY }]),
37
+ score: 0,
38
+ status: "playing",
39
+ speed: 150, // ms per move
40
+ leaderboardPosition: 0,
41
+ };
42
+ }
43
+ function spawnFood(width, height, snake) {
44
+ let food;
45
+ let attempts = 0;
46
+ const maxAttempts = 100;
47
+ do {
48
+ food = {
49
+ x: Math.floor(Math.random() * (width - 2)) + 1,
50
+ y: Math.floor(Math.random() * (height - 2)) + 1,
51
+ };
52
+ attempts++;
53
+ } while (snake.some((segment) => pointsEqual(segment, food)) &&
54
+ attempts < maxAttempts);
55
+ return food;
56
+ }
57
+ function GameBoard({ snake, food, width, height }) {
58
+ // Build the board as a 2D array
59
+ const board = [];
60
+ for (let y = 0; y < height; y++) {
61
+ const row = [];
62
+ for (let x = 0; x < width; x++) {
63
+ // Border
64
+ if (y === 0 || y === height - 1) {
65
+ row.push("─");
66
+ }
67
+ else if (x === 0 || x === width - 1) {
68
+ row.push("│");
69
+ }
70
+ else {
71
+ row.push(" ");
72
+ }
73
+ }
74
+ board.push(row);
75
+ }
76
+ // Corners
77
+ if (height > 0 && width > 0) {
78
+ board[0][0] = "┌";
79
+ board[0][width - 1] = "┐";
80
+ board[height - 1][0] = "└";
81
+ board[height - 1][width - 1] = "┘";
82
+ }
83
+ // Place food
84
+ if (food.y > 0 && food.y < height - 1 && food.x > 0 && food.x < width - 1) {
85
+ board[food.y][food.x] = "●";
86
+ }
87
+ // Place snake
88
+ snake.forEach((segment, index) => {
89
+ if (segment.y > 0 &&
90
+ segment.y < height - 1 &&
91
+ segment.x > 0 &&
92
+ segment.x < width - 1) {
93
+ board[segment.y][segment.x] = index === 0 ? "█" : "▓";
94
+ }
95
+ });
96
+ return (_jsx(Box, { flexDirection: "column", children: board.map((row, y) => (_jsx(Box, { children: row.map((cell, x) => {
97
+ let color;
98
+ const isSnakeHead = snake[0] && snake[0].x === x && snake[0].y === y;
99
+ const isSnakeBody = snake
100
+ .slice(1)
101
+ .some((s) => s.x === x && s.y === y);
102
+ const isFood = food.x === x && food.y === y;
103
+ if (isSnakeHead) {
104
+ color = "green";
105
+ }
106
+ else if (isSnakeBody) {
107
+ color = "greenBright";
108
+ }
109
+ else if (isFood) {
110
+ color = "red";
111
+ }
112
+ else if (cell !== " ") {
113
+ color = "gray";
114
+ }
115
+ return (_jsx(Text, { color: color, children: cell }, x));
116
+ }) }, y))) }));
117
+ }
118
+ function GameOverOverlay({ score, leaderboardPosition, }) {
119
+ return (_jsxs(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", padding: 1, children: [_jsx(Text, { bold: true, color: "red", children: "GAME OVER" }), _jsxs(Text, { children: ["Score: ", _jsx(Text, { color: "yellow", children: score })] }), leaderboardPosition > 0 && (_jsx(NewHighScoreBanner, { position: leaderboardPosition, score: score })), _jsx(Text, { dimColor: true, children: "Press R to restart | H for leaderboard" })] }));
120
+ }
121
+ function PausedOverlay() {
122
+ return (_jsxs(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", padding: 1, children: [_jsx(Text, { bold: true, color: "yellow", children: "PAUSED" }), _jsx(Text, { dimColor: true, children: "Press P to resume" })] }));
123
+ }
124
+ function GameHUD({ score, highScore, fps, }) {
125
+ return (_jsxs(Box, { justifyContent: "space-between", paddingX: 1, children: [_jsxs(Box, { children: [_jsx(Text, { children: "Score: " }), _jsx(Text, { color: "yellow", bold: true, children: score })] }), _jsx(Box, { children: _jsxs(Text, { dimColor: true, children: ["High: ", highScore] }) }), _jsx(Box, { children: _jsxs(Text, { dimColor: true, children: [fps, " FPS"] }) })] }));
126
+ }
127
+ /**
128
+ * Snake game component
129
+ */
130
+ export function SnakeGame({ hasFocus, dimensions, onExit, loopAttention, onLoopAlertDismiss, onGameStateChange }) {
131
+ // Calculate game board size (leaving room for HUD and controls)
132
+ const boardWidth = Math.max(dimensions.width - 2, 15);
133
+ const boardHeight = Math.max(dimensions.height - 5, 8);
134
+ const [state, setState] = useState(() => createInitialState(boardWidth, boardHeight));
135
+ const [lastMoveTime, setLastMoveTime] = useState(0);
136
+ const scoreSubmittedRef = useRef(false);
137
+ const statsSubmittedRef = useRef(false);
138
+ const [showLoopAlert, setShowLoopAlert] = useState(false);
139
+ const [wasPlayingBeforeAlert, setWasPlayingBeforeAlert] = useState(false);
140
+ // High score persistence
141
+ const { highScore, leaderboard, submitScore } = useHighScores("snake");
142
+ // Report game state changes to status bar
143
+ useEffect(() => {
144
+ const mappedStatus = state.status === "leaderboard" ? "game_over" : state.status;
145
+ onGameStateChange?.({
146
+ score: state.score,
147
+ status: mappedStatus,
148
+ highScore,
149
+ });
150
+ }, [state.score, state.status, highScore, onGameStateChange]);
151
+ // Stats tracking
152
+ const { startSession, endSession, isSessionActive } = useGameSession("snake");
153
+ // Auto-pause when loop needs attention
154
+ useEffect(() => {
155
+ if (loopAttention?.needsAttention && state.status === "playing") {
156
+ setWasPlayingBeforeAlert(true);
157
+ setShowLoopAlert(true);
158
+ setState((prev) => ({ ...prev, status: "paused" }));
159
+ }
160
+ else if (!loopAttention?.needsAttention && showLoopAlert) {
161
+ setShowLoopAlert(false);
162
+ // Auto-resume if we were playing before the alert
163
+ if (wasPlayingBeforeAlert) {
164
+ setState((prev) => {
165
+ if (prev.status === "paused") {
166
+ return { ...prev, status: "playing" };
167
+ }
168
+ return prev;
169
+ });
170
+ setWasPlayingBeforeAlert(false);
171
+ }
172
+ }
173
+ }, [loopAttention?.needsAttention, state.status, showLoopAlert, wasPlayingBeforeAlert]);
174
+ // Reset game when dimensions change significantly
175
+ useEffect(() => {
176
+ setState((prev) => ({
177
+ ...createInitialState(boardWidth, boardHeight),
178
+ leaderboardPosition: prev.leaderboardPosition,
179
+ }));
180
+ }, [boardWidth, boardHeight]);
181
+ // Start session when game starts
182
+ useEffect(() => {
183
+ if (state.status === "playing" && !isSessionActive) {
184
+ startSession();
185
+ }
186
+ }, [state.status, isSessionActive, startSession]);
187
+ // Submit score and stats when game ends
188
+ useEffect(() => {
189
+ if (state.status === "game_over" && !scoreSubmittedRef.current && state.score > 0) {
190
+ scoreSubmittedRef.current = true;
191
+ submitScore(state.score).then((position) => {
192
+ if (position > 0) {
193
+ setState((prev) => ({ ...prev, leaderboardPosition: position }));
194
+ }
195
+ });
196
+ }
197
+ // Record stats when game ends
198
+ if (state.status === "game_over" && !statsSubmittedRef.current) {
199
+ statsSubmittedRef.current = true;
200
+ void endSession(state.score);
201
+ }
202
+ }, [state.status, state.score, submitScore, endSession]);
203
+ const moveSnake = useCallback(() => {
204
+ setState((prev) => {
205
+ if (prev.status !== "playing")
206
+ return prev;
207
+ // Apply the queued direction
208
+ const direction = prev.nextDirection;
209
+ const head = prev.snake[0];
210
+ const delta = directionToVector(direction);
211
+ const newHead = addVectors(head, delta);
212
+ // Check wall collision
213
+ if (newHead.x <= 0 ||
214
+ newHead.x >= boardWidth - 1 ||
215
+ newHead.y <= 0 ||
216
+ newHead.y >= boardHeight - 1) {
217
+ return {
218
+ ...prev,
219
+ status: "game_over",
220
+ };
221
+ }
222
+ // Check self collision
223
+ if (prev.snake.some((segment) => pointsEqual(segment, newHead))) {
224
+ return {
225
+ ...prev,
226
+ status: "game_over",
227
+ };
228
+ }
229
+ // Check food collision
230
+ const ateFood = pointsEqual(newHead, prev.food);
231
+ const newSnake = [newHead, ...prev.snake];
232
+ if (!ateFood) {
233
+ newSnake.pop(); // Remove tail if didn't eat
234
+ }
235
+ // Calculate new speed (gets faster as score increases)
236
+ const newSpeed = Math.max(50, 150 - prev.score * 2);
237
+ return {
238
+ ...prev,
239
+ snake: newSnake,
240
+ direction,
241
+ score: ateFood ? prev.score + 10 : prev.score,
242
+ food: ateFood
243
+ ? spawnFood(boardWidth, boardHeight, newSnake)
244
+ : prev.food,
245
+ speed: newSpeed,
246
+ };
247
+ });
248
+ }, [boardWidth, boardHeight]);
249
+ // Game loop
250
+ const { loopInfo } = useGameLoop({
251
+ targetFps: 30,
252
+ isActive: hasFocus && state.status === "playing",
253
+ onTick: (info) => {
254
+ // Move snake based on speed
255
+ if (info.elapsedTime - lastMoveTime >= state.speed) {
256
+ moveSnake();
257
+ setLastMoveTime(info.elapsedTime);
258
+ }
259
+ },
260
+ });
261
+ // Handle input
262
+ useInput((input, key) => {
263
+ if (!hasFocus)
264
+ return;
265
+ // Exit to menu
266
+ if (input === "q" || input === "Q" || key.escape) {
267
+ onExit();
268
+ return;
269
+ }
270
+ // Restart
271
+ if (input === "r" || input === "R") {
272
+ scoreSubmittedRef.current = false;
273
+ statsSubmittedRef.current = false;
274
+ setState(createInitialState(boardWidth, boardHeight));
275
+ setLastMoveTime(0);
276
+ return;
277
+ }
278
+ // Show leaderboard (when game over or paused)
279
+ if ((input === "h" || input === "H") && state.status !== "playing") {
280
+ setState((prev) => ({
281
+ ...prev,
282
+ status: prev.status === "leaderboard" ? "game_over" : "leaderboard",
283
+ }));
284
+ return;
285
+ }
286
+ // Dismiss loop alert with Enter key
287
+ if (key.return && showLoopAlert) {
288
+ setShowLoopAlert(false);
289
+ onLoopAlertDismiss?.();
290
+ return;
291
+ }
292
+ // Pause/unpause
293
+ if (input === "p" || input === "P") {
294
+ // If we're showing loop alert, dismiss it and resume
295
+ if (showLoopAlert) {
296
+ setShowLoopAlert(false);
297
+ setWasPlayingBeforeAlert(false);
298
+ }
299
+ setState((prev) => ({
300
+ ...prev,
301
+ status: prev.status === "playing" ? "paused" : "playing",
302
+ }));
303
+ return;
304
+ }
305
+ // Direction changes (only while playing)
306
+ if (state.status !== "playing")
307
+ return;
308
+ // Prevent 180-degree turns
309
+ const currentDir = state.direction;
310
+ if ((key.upArrow || input === "w" || input === "W") && currentDir !== "down") {
311
+ setState((prev) => ({ ...prev, nextDirection: "up" }));
312
+ }
313
+ else if ((key.downArrow || input === "s" || input === "S") &&
314
+ currentDir !== "up") {
315
+ setState((prev) => ({ ...prev, nextDirection: "down" }));
316
+ }
317
+ else if ((key.leftArrow || input === "a" || input === "A") &&
318
+ currentDir !== "right") {
319
+ setState((prev) => ({ ...prev, nextDirection: "left" }));
320
+ }
321
+ else if ((key.rightArrow || input === "d" || input === "D") &&
322
+ currentDir !== "left") {
323
+ setState((prev) => ({ ...prev, nextDirection: "right" }));
324
+ }
325
+ }, { isActive: hasFocus });
326
+ return (_jsxs(Box, { flexDirection: "column", height: "100%", children: [_jsx(GameHUD, { score: state.score, highScore: highScore, fps: loopInfo.fps }), _jsx(Box, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: state.status === "leaderboard" ? (_jsx(Leaderboard, { title: "Snake High Scores", scores: leaderboard, highlightPosition: state.leaderboardPosition })) : state.status === "game_over" ? (_jsx(GameOverOverlay, { score: state.score, leaderboardPosition: state.leaderboardPosition })) : state.status === "paused" && showLoopAlert && loopAttention ? (_jsx(LoopAlertOverlay, { attention: loopAttention, onDismiss: onLoopAlertDismiss })) : state.status === "paused" ? (_jsx(PausedOverlay, {})) : (_jsx(GameBoard, { snake: state.snake, food: state.food, width: boardWidth, height: boardHeight })) }), _jsx(Box, { paddingX: 1, children: _jsx(Text, { dimColor: true, children: hasFocus
327
+ ? state.status === "leaderboard"
328
+ ? "H: Back | R: Restart | Q: Exit"
329
+ : "Arrow/WASD: Move | P: Pause | R: Restart | H: Scores | Q: Exit"
330
+ : "Press Tab to focus" }) })] }));
331
+ }
332
+ export default SnakeGame;
333
+ //# sourceMappingURL=SnakeGame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SnakeGame.js","sourceRoot":"","sources":["../../src/games/SnakeGame.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Tetris Game
3
+ *
4
+ * Classic Tetris game implemented with the game framework.
5
+ * Features: 7 standard pieces, rotation, line clearing, scoring, next piece preview.
6
+ */
7
+ import type { GameComponentProps, GameInfo } from "../game-types.js";
8
+ /** Tetris game metadata */
9
+ export declare const tetrisGameInfo: GameInfo;
10
+ /**
11
+ * Tetris game component
12
+ */
13
+ export declare function TetrisGame({ hasFocus, onExit, loopAttention, onLoopAlertDismiss, onGameStateChange }: GameComponentProps): import("react/jsx-runtime").JSX.Element;
14
+ export default TetrisGame;
15
+ //# sourceMappingURL=TetrisGame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TetrisGame.d.ts","sourceRoot":"","sources":["../../src/games/TetrisGame.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAS,MAAM,kBAAkB,CAAC;AAO5E,2BAA2B;AAC3B,eAAO,MAAM,cAAc,EAAE,QAO5B,CAAC;AA4eF;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,EAAE,kBAAkB,2CAqbxH;AAED,eAAe,UAAU,CAAC"}