react-tetris2
v0.1.3
Published
Classic Tetris game as a reusable React 18+ component, fully typed with TypeScript and controllable via ref.
Maintainers
Readme
react‑tetris2
react‑tetris2 – Plug-and-play
<Tetris2/>component for React 18+, built with TypeScript.
✨ Features
- Fully typed API – Strictly typed props and methods with TypeScript 5.
- Modular architecture – Use as a component with optional ref control.
- Keyboard controls – Playable entirely via keyboard input.
- Imperative API – Call
start(),restart()viareffor external control.
🚀 Installation
# npm
npm i react-tetris2
# pnpm
pnpm add react-tetris2Note:
reactandreact-domare required as peer dependencies.
Make sure your project includes them (React 18+ supported).
🤖 Quick start
Use the component right after installation — no additional setup required.
Example: main.tsx (Vite)
💡 Make sure to comment out global CSS imports (e.g.,
index.css) to avoid style conflicts.
// src/main.tsx
import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import Tetris2 from 'react-tetris2';
// import './index.css'; // optional: comment this out to avoid conflicts
createRoot(document.getElementById('root')!).render(
<StrictMode>
<Tetris2 />
</StrictMode>
);🔧 Customized usage
For advanced control and customization, use a ref and props:
// src/main.tsx
import React, { StrictMode, useRef } from 'react';
import { createRoot } from 'react-dom/client';
import Tetris2, { Tetris2Handle } from 'react-tetris2';
function App() {
const game = useRef<Tetris2Handle>(null);
return (
<>
<Tetris2
ref={game}
credits={3}
manageCredits={true}
showModals={true}
soundEnabled={true}
showControlsLegend={true}
onGameOver={() => alert('Game Over!')}
onScoreChange={(score) => console.log('Score:', score)}
onLevelChange={(level) => console.log('Level:', level)}
/>
<div style={{ marginTop: '1rem' }}>
<button onClick={() => game.current?.start()}>Start</button>
<button onClick={() => game.current?.restart()}>Restart</button>
</div>
</>
);
}
createRoot(document.getElementById('root')!).render(
<StrictMode>
<App />
</StrictMode>
);📝 API
Props
| Prop | Type | Default | Description |
| -------------------- | ------------------------- | ------- | ------------------------------------- |
| credits | number | — | Number of available game credits |
| manageCredits | boolean | false | Enable credit-based game start |
| showModals | boolean | true | Show start/pause/game over modals |
| soundEnabled | boolean | true | Enable background music |
| showControlsLegend | boolean | true | Show control instructions below board |
| onGameOver | () => void | — | Callback when the player loses |
| onScoreChange | (score: number) => void | — | Callback when score updates |
| onLevelChange | (level: number) => void | — | Callback when level updates |
Imperative API
| Method | Description |
| ----------- | ------------------------ |
| start() | Start or resume the game |
| restart() | Restart the game |
Consult index.d.ts for the full API surface.
🎵 Audio
This component includes background music: a string-quartet arrangement of
“Korobeiniki (Tetris Theme)” by Gregor Quendel, licensed under the Pixabay License.
🧪 Contributing
We welcome contributions! Follow the steps below to get started:
Clone the repository and install dependencies
git clone https://github.com/Ingenarte/react-tetris2.git cd react-tetris2 npm installStart the local playground
This will launch a development environment with hot reload:
npm devRun the full test suite (unit + E2E)
Make sure your changes don't break anything:
npm test # or: npm fulltestCreate a feature branch
Avoid working directly on
master:git checkout -b your-feature-nameCommit and push your changes
Follow Conventional Commits if possible:
git commit -m "feat: add new animation for line clear" git push origin your-feature-nameOpen a Pull Request
Submit your PR against the
masterbranch at:
https://github.com/Ingenarte/react-tetris2/pulls
💡 Tip: You can also run Storybook locally with:
npm run storybook
🛠️ Internal tools like
lint,typecheck, andbuildare available via npm scripts.
Always runnpm fulltestbefore pushing.
🛣️ Roadmap (posible)
- [ ] Enhanced accessibility (ARIA roles, focus trapping, high-contrast mode)
- [ ] Multiplayer LAN
- [ ] AI opponent
- [ ] Replay export / import
📜 License
MIT – see LICENSE for details.
Original work © 2015 Matthew Brandly.
Additions & refactor © 2025 INGENARTE.
Audio © 2024 Gregor Quendel.
TETRIS® is a registered trademark of Tetris Holding LLC. This project is not affiliated with or endorsed by Tetris Holding LLC, Nintendo, or The Tetris Company.
