Add sprite library design doc
Documents the Sprite component API, CSS rendering approach, dev tool features, and project structure. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
commit
63b72079ea
138
docs/plans/2026-01-05-sprite-library-design.md
Normal file
138
docs/plans/2026-01-05-sprite-library-design.md
Normal file
|
|
@ -0,0 +1,138 @@
|
|||
# Tiny Sprites - Design
|
||||
|
||||
A CSS-based sprite library for Hono JSX with a dev tool for tuning animations.
|
||||
|
||||
## Sprite Component
|
||||
|
||||
### API
|
||||
|
||||
```tsx
|
||||
import { Sprite } from 'tiny-sprites'
|
||||
|
||||
<Sprite
|
||||
src="/warrior-idle.png"
|
||||
width={32}
|
||||
height={32}
|
||||
frames={6}
|
||||
frameDuration={100}
|
||||
/>
|
||||
|
||||
// Grid layout
|
||||
<Sprite
|
||||
src="/character.png"
|
||||
width={32}
|
||||
height={32}
|
||||
frames={12}
|
||||
columns={4}
|
||||
frameDuration={80}
|
||||
/>
|
||||
```
|
||||
|
||||
### Props
|
||||
|
||||
| Prop | Type | Required | Description |
|
||||
|------|------|----------|-------------|
|
||||
| src | string | yes | URL to spritesheet |
|
||||
| width | number | yes | Frame width in pixels |
|
||||
| height | number | yes | Frame height in pixels |
|
||||
| frames | number | yes | Total frame count |
|
||||
| frameDuration | number | yes | Milliseconds per frame |
|
||||
| columns | number | no | Columns in grid (omit for horizontal strip) |
|
||||
| class | string | no | Pass-through CSS class |
|
||||
| style | string | no | Pass-through inline styles |
|
||||
| playing | boolean | no | Animation state, default true |
|
||||
|
||||
### Rendering
|
||||
|
||||
The component outputs a `<div>` with inline styles plus a `<style>` block:
|
||||
|
||||
```html
|
||||
<div style="
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
background-image: url('/warrior-idle.png');
|
||||
background-size: 192px 32px;
|
||||
animation: sprite-abc123 600ms steps(6) infinite;
|
||||
"></div>
|
||||
|
||||
<style>
|
||||
@keyframes sprite-abc123 {
|
||||
from { background-position: 0 0; }
|
||||
to { background-position: -192px 0; }
|
||||
}
|
||||
</style>
|
||||
```
|
||||
|
||||
Keyframe names are hashed from props to avoid collisions. When `playing={false}`, sets `animation-play-state: paused`.
|
||||
|
||||
## Dev Tool
|
||||
|
||||
A Bun server for tuning sprite animations.
|
||||
|
||||
### Features
|
||||
|
||||
- Drag & drop spritesheet files
|
||||
- Form inputs: width, height, frames, columns, frameDuration
|
||||
- Live preview
|
||||
- Copy generated `<Sprite />` code
|
||||
- Download spritesheet
|
||||
|
||||
### Routes
|
||||
|
||||
```
|
||||
GET / → UI
|
||||
POST /upload → Accept spritesheet, return temp URL
|
||||
GET /sprites/:filename → Serve uploaded spritesheets
|
||||
```
|
||||
|
||||
No database. Files served from temp directory.
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
tiny-sprites/
|
||||
├── src/
|
||||
│ ├── sprite.tsx # <Sprite /> component
|
||||
│ ├── hash.ts # Hash function for keyframe names
|
||||
│ └── dev/
|
||||
│ ├── cli.ts # CLI entry point
|
||||
│ ├── server.tsx # Dev server (Bun.serve + Hono)
|
||||
│ ├── index.tsx # Dev tool UI page
|
||||
│ └── preview.tsx # Live preview component
|
||||
├── assets/ # Existing sprites
|
||||
├── docs/plans/
|
||||
├── package.json
|
||||
└── tsconfig.json
|
||||
```
|
||||
|
||||
## Package.json
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "tiny-sprites",
|
||||
"type": "module",
|
||||
"exports": {
|
||||
".": "./src/sprite.tsx"
|
||||
},
|
||||
"bin": {
|
||||
"tiny-sprites": "src/dev/cli.ts"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "bun --hot src/dev/server.tsx",
|
||||
"test": "bun test"
|
||||
},
|
||||
"dependencies": {
|
||||
"hono": "^4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"bun-types": "latest"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Dependencies
|
||||
|
||||
- Bun (runtime)
|
||||
- Hono (routing + JSX)
|
||||
|
||||
No other dependencies.
|
||||
Loading…
Reference in New Issue
Block a user