# @vimazing/vim-sudoku Lightweight, typed **React hooks** and utilities for building interactive sudoku games with VIM-inspired controls. Part of the [VIMazing](https://github.com/andrepadez/vimazing-vimaze) project. --- ## Contents - [Features](#features) - [Installation](#installation) - [Quick Start](#quick-start) - [Core Hooks](#core-hooks) - [Utilities](#utilities) - [Example App](#example-app) - [Build & Release](#build--release) - [License](#license) --- ## Features - **Drop-in hooks** for sudoku game logic, player control, scoring, and key logging. - **Typed API** with generated declaration files for editor IntelliSense. - **VIM-style navigation** (`h`, `j`, `k`, `l`, counts, `i` to start, etc.). - **Composable architecture** – bring your own rendering and platform-specific bindings. - **Tree-shakeable exports** to keep bundles lean. --- ## Installation Using **npm**: ```bash npm install @vimazing/vim-sudoku ``` Or with **bun**: ```bash bun add @vimazing/vim-sudoku ``` --- ## Quick Start ```tsx import { useEffect } from "react"; import { useGame } from "@vimazing/vim-sudoku"; export function SudokuGame() { const { containerRef, gameStatus, startGame } = useGame(); useEffect(() => { startGame(); }, [startGame]); return (

VIMazing Sudoku

{gameStatus === "game-won" &&

🎉 You solved it!

}
); } ``` Default controls: | Key | Action | | ------------------- | --------------- | | `i` | Start game | | `h` / `j` / `k` / `l` | Move cursor | | `` | Enter number | | `x` / `d` | Clear cell | | `q` | Quit game | | `Esc` | Cancel / pause | --- ## Core Hooks | Hook | Description | | ---- | ----------- | | `useGame(platformHook?)` | One-stop hook that wires sudoku generation, rendering, player state, scoring, and keyboard bindings. Returns refs, status helpers, and managers you can compose with your UI. | | `useKeyBindings()` | Provides VIM-style key bindings, including repeat counts and movement helpers. | | `useScore()` | Tracks timers, moves, and final score calculation. | Each hook is exported individually, so you can cherry-pick only what you need: ```ts import { useScore } from "@vimazing/vim-sudoku/useScore"; ``` --- ## Utilities Besides the hooks, the library exports: - `SudokuGenerator` – procedural sudoku puzzle generation class. - `SudokuRenderer` – canvas renderer tailored for sudoku grids. - `types` – shared TypeScript types such as `GameStatus`, `SudokuCell`, and `KeyLogEntry`. ```ts import { SudokuGenerator, GameStatus } from "@vimazing/vim-sudoku"; ``` --- ## Example App A demo application lives under `example/` and consumes the package directly. ```bash cd example bun install bun run dev ``` During local development the Vite config aliases `@vimazing/vim-sudoku` to the source folder so you can iterate without rebuilding. When publishing, run the build first (see below) so editors consume the generated declarations in `dist/`. --- ## Build & Release Build the distributable bundle and type declarations: ```bash bun run build ``` This writes JavaScript, type definitions, and styles to `dist/`. The `prepublishOnly` hook reuses the same command to guarantee fresh artifacts before publishing. --- ## License MIT © [André Padez](https://github.com/andrepadez)