# sprite Demos
## Minimal Valid Sprite
A 3x3 sprite with an inline palette demonstrating the minimum required fields.
<div class="demo-source">
```jsonl
{"type": "sprite", "name": "square", "size": [3, 3], "palette": {"{_}": "#00000000", "{r}": "#FF0000"}, "grid": ["{r}{r}{r}", "{r}{_}{r}", "{r}{r}{r}"]}
```
</div>
<div class="demo-container" data-demo="basic">
</div>
## Sprite Color Count
Verifies palette color count is correctly reported.
<div class="demo-source">
```jsonl
{"type": "sprite", "name": "square", "size": [3, 3], "palette": {"{_}": "#00000000", "{r}": "#FF0000"}, "grid": ["{r}{r}{r}", "{r}{_}{r}", "{r}{r}{r}"]}
```
</div>
<div class="demo-container" data-demo="colors">
</div>
## Sprite Dimension Verification
Uses assert_dimensions helper for explicit dimension checks.
<div class="demo-source">
```jsonl
{"type": "sprite", "name": "square", "size": [3, 3], "palette": {"{_}": "#00000000", "{r}": "#FF0000"}, "grid": ["{r}{r}{r}", "{r}{_}{r}", "{r}{r}{r}"]}
```
</div>
<div class="demo-container" data-demo="dimensions">
</div>
## Inline Palette Definition
Sprite with colors defined inline rather than referencing a named palette.
<div class="demo-source">
```jsonl
{"type": "sprite", "name": "heart", "palette": {"{_}": "#00000000", "{r}": "#e43b44", "{p}": "#f77622"}, "grid": ["{_}{r}{_}{r}{_}", "{r}{p}{r}{p}{r}", "{r}{p}{p}{p}{r}", "{_}{r}{p}{r}{_}", "{_}{_}{r}{_}{_}"]}
```
</div>
<div class="demo-container" data-demo="inline_palette">
</div>
## Inline Color Count
Heart sprite with 3 colors: transparent, red, and orange.
<div class="demo-source">
```jsonl
{"type": "sprite", "name": "heart", "palette": {"{_}": "#00000000", "{r}": "#e43b44", "{p}": "#f77622"}, "grid": ["{_}{r}{_}{r}{_}", "{r}{p}{r}{p}{r}", "{r}{p}{p}{p}{r}", "{_}{r}{p}{r}{_}", "{_}{_}{r}{_}{_}"]}
```
</div>
<div class="demo-container" data-demo="inline_colors">
</div>
## Inline Palette Dimensions
Verifies heart sprite renders at expected 5x5 dimensions.
<div class="demo-source">
```jsonl
{"type": "sprite", "name": "heart", "palette": {"{_}": "#00000000", "{r}": "#e43b44", "{p}": "#f77622"}, "grid": ["{_}{r}{_}{r}{_}", "{r}{p}{r}{p}{r}", "{r}{p}{p}{p}{r}", "{_}{r}{p}{r}{_}", "{_}{_}{r}{_}{_}"]}
```
</div>
<div class="demo-container" data-demo="inline_dimensions">
</div>
## No Named Palette
Verifies inline palette sprites have no palette_name set.
<div class="demo-source">
```jsonl
{"type": "sprite", "name": "heart", "palette": {"{_}": "#00000000", "{r}": "#e43b44", "{p}": "#f77622"}, "grid": ["{_}{r}{_}{r}{_}", "{r}{p}{r}{p}{r}", "{r}{p}{p}{p}{r}", "{_}{r}{p}{r}{_}", "{_}{_}{r}{_}{_}"]}
```
</div>
<div class="demo-container" data-demo="inline_no_palette_ref">
</div>
## Origin Point
Sprite with an origin point `[x, y]` for positioning and rotation.
<div class="demo-source">
```jsonl
{"type": "sprite", "name": "player", "palette": {"{_}": "#00000000", "{b}": "#3a4466", "{s}": "#ffcd75"}, "grid": ["{_}{b}{b}{b}{_}", "{b}{s}{b}{s}{b}", "{b}{b}{b}{b}{b}", "{_}{b}{_}{b}{_}"], "metadata": {"origin": [2, 3], "boxes": {"hurt": {"x": 0, "y": 0, "w": 5, "h": 4}, "hit": {"x": 1, "y": 1, "w": 3, "h": 2}}, "attach_in": [2, 0], "attach_out": [2, 4]}}
```
</div>
<div class="demo-container" data-demo="origin">
</div>
## Collision Boxes
Sprite with named collision boxes for hitbox detection.
<div class="demo-source">
```jsonl
{"type": "sprite", "name": "player", "palette": {"{_}": "#00000000", "{b}": "#3a4466", "{s}": "#ffcd75"}, "grid": ["{_}{b}{b}{b}{_}", "{b}{s}{b}{s}{b}", "{b}{b}{b}{b}{b}", "{_}{b}{_}{b}{_}"], "metadata": {"origin": [2, 3], "boxes": {"hurt": {"x": 0, "y": 0, "w": 5, "h": 4}, "hit": {"x": 1, "y": 1, "w": 3, "h": 2}}, "attach_in": [2, 0], "attach_out": [2, 4]}}
```
</div>
<div class="demo-container" data-demo="collision">
</div>
## Attachment Points
Sprite with attach_in and attach_out points for chaining sprites.
<div class="demo-source">
```jsonl
{"type": "sprite", "name": "player", "palette": {"{_}": "#00000000", "{b}": "#3a4466", "{s}": "#ffcd75"}, "grid": ["{_}{b}{b}{b}{_}", "{b}{s}{b}{s}{b}", "{b}{b}{b}{b}{b}", "{_}{b}{_}{b}{_}"], "metadata": {"origin": [2, 3], "boxes": {"hurt": {"x": 0, "y": 0, "w": 5, "h": 4}, "hit": {"x": 1, "y": 1, "w": 3, "h": 2}}, "attach_in": [2, 0], "attach_out": [2, 4]}}
```
</div>
<div class="demo-container" data-demo="attachments">
</div>
## Metadata Sprite Dimensions
Verifies sprite with metadata renders at expected dimensions.
<div class="demo-source">
```jsonl
{"type": "sprite", "name": "player", "palette": {"{_}": "#00000000", "{b}": "#3a4466", "{s}": "#ffcd75"}, "grid": ["{_}{b}{b}{b}{_}", "{b}{s}{b}{s}{b}", "{b}{b}{b}{b}{b}", "{_}{b}{_}{b}{_}"], "metadata": {"origin": [2, 3], "boxes": {"hurt": {"x": 0, "y": 0, "w": 5, "h": 4}, "hit": {"x": 1, "y": 1, "w": 3, "h": 2}}, "attach_in": [2, 0], "attach_out": [2, 4]}}
```
</div>
<div class="demo-container" data-demo="metadata_dimensions">
</div>
## Named Palette Reference
Sprite referencing a separately-defined palette by name.
<div class="demo-source">
```jsonl
{"type": "palette", "name": "retro", "colors": {"{_}": "#00000000", "{bg}": "#1a1c2c", "{fg}": "#f4f4f4", "{accent}": "#ffcd75"}}
{"type": "sprite", "name": "icon", "palette": "retro", "grid": ["{bg}{fg}{bg}", "{fg}{accent}{fg}", "{bg}{fg}{bg}"]}
```
</div>
<div class="demo-container" data-demo="named_palette">
</div>
## Palette Reference Verification
Verifies sprite correctly references its named palette.
<div class="demo-source">
```jsonl
{"type": "palette", "name": "retro", "colors": {"{_}": "#00000000", "{bg}": "#1a1c2c", "{fg}": "#f4f4f4", "{accent}": "#ffcd75"}}
{"type": "sprite", "name": "icon", "palette": "retro", "grid": ["{bg}{fg}{bg}", "{fg}{accent}{fg}", "{bg}{fg}{bg}"]}
```
</div>
<div class="demo-container" data-demo="palette_reference">
</div>
## Palette Color Count
Named palette with 4 colors: transparent, bg, fg, accent.
<div class="demo-source">
```jsonl
{"type": "palette", "name": "retro", "colors": {"{_}": "#00000000", "{bg}": "#1a1c2c", "{fg}": "#f4f4f4", "{accent}": "#ffcd75"}}
{"type": "sprite", "name": "icon", "palette": "retro", "grid": ["{bg}{fg}{bg}", "{fg}{accent}{fg}", "{bg}{fg}{bg}"]}
```
</div>
<div class="demo-container" data-demo="palette_colors">
</div>
## Horizontal Flip (Mirror)
Sprite mirrored horizontally using transform: ["mirror-h"].
<div class="demo-source">
```jsonl
{"type": "sprite", "name": "arrow_right", "palette": {"{_}": "#00000000", "{a}": "#5fcde4"}, "grid": ["{_}{_}{a}", "{a}{a}{a}", "{_}{_}{a}"]}
{"type": "sprite", "name": "arrow_left", "source": "arrow_right", "palette": {"{_}": "#00000000", "{a}": "#5fcde4"}, "transform": ["mirror-h"]}
{"type": "sprite", "name": "arrow_down", "source": "arrow_right", "palette": {"{_}": "#00000000", "{a}": "#5fcde4"}, "transform": ["rotate:90"]}
{"type": "sprite", "name": "arrow_scaled", "source": "arrow_right", "palette": {"{_}": "#00000000", "{a}": "#5fcde4"}, "transform": ["scale:2.0,2.0"]}
```
</div>
<div class="demo-container" data-demo="flip_horizontal">
</div>
## Rotation Transform
Sprite rotated 90 degrees using transform: ["rotate:90"].
<div class="demo-source">
```jsonl
{"type": "sprite", "name": "arrow_right", "palette": {"{_}": "#00000000", "{a}": "#5fcde4"}, "grid": ["{_}{_}{a}", "{a}{a}{a}", "{_}{_}{a}"]}
{"type": "sprite", "name": "arrow_left", "source": "arrow_right", "palette": {"{_}": "#00000000", "{a}": "#5fcde4"}, "transform": ["mirror-h"]}
{"type": "sprite", "name": "arrow_down", "source": "arrow_right", "palette": {"{_}": "#00000000", "{a}": "#5fcde4"}, "transform": ["rotate:90"]}
{"type": "sprite", "name": "arrow_scaled", "source": "arrow_right", "palette": {"{_}": "#00000000", "{a}": "#5fcde4"}, "transform": ["scale:2.0,2.0"]}
```
</div>
<div class="demo-container" data-demo="rotate">
</div>
## Scale Transform
Sprite scaled 2x using transform: ["scale:2.0,2.0"].
<div class="demo-source">
```jsonl
{"type": "sprite", "name": "arrow_right", "palette": {"{_}": "#00000000", "{a}": "#5fcde4"}, "grid": ["{_}{_}{a}", "{a}{a}{a}", "{_}{_}{a}"]}
{"type": "sprite", "name": "arrow_left", "source": "arrow_right", "palette": {"{_}": "#00000000", "{a}": "#5fcde4"}, "transform": ["mirror-h"]}
{"type": "sprite", "name": "arrow_down", "source": "arrow_right", "palette": {"{_}": "#00000000", "{a}": "#5fcde4"}, "transform": ["rotate:90"]}
{"type": "sprite", "name": "arrow_scaled", "source": "arrow_right", "palette": {"{_}": "#00000000", "{a}": "#5fcde4"}, "transform": ["scale:2.0,2.0"]}
```
</div>
<div class="demo-container" data-demo="scale">
</div>
## Source Reference
Transformed sprite referencing another sprite via "source" field.
<div class="demo-source">
```jsonl
{"type": "sprite", "name": "arrow_right", "palette": {"{_}": "#00000000", "{a}": "#5fcde4"}, "grid": ["{_}{_}{a}", "{a}{a}{a}", "{_}{_}{a}"]}
{"type": "sprite", "name": "arrow_left", "source": "arrow_right", "palette": {"{_}": "#00000000", "{a}": "#5fcde4"}, "transform": ["mirror-h"]}
{"type": "sprite", "name": "arrow_down", "source": "arrow_right", "palette": {"{_}": "#00000000", "{a}": "#5fcde4"}, "transform": ["rotate:90"]}
{"type": "sprite", "name": "arrow_scaled", "source": "arrow_right", "palette": {"{_}": "#00000000", "{a}": "#5fcde4"}, "transform": ["scale:2.0,2.0"]}
```
</div>
<div class="demo-container" data-demo="source_ref">
</div>
## Transform Chain Verification
Verifies parsed transform specs match expected operations.
<div class="demo-source">
```jsonl
{"type": "sprite", "name": "arrow_right", "palette": {"{_}": "#00000000", "{a}": "#5fcde4"}, "grid": ["{_}{_}{a}", "{a}{a}{a}", "{_}{_}{a}"]}
{"type": "sprite", "name": "arrow_left", "source": "arrow_right", "palette": {"{_}": "#00000000", "{a}": "#5fcde4"}, "transform": ["mirror-h"]}
{"type": "sprite", "name": "arrow_down", "source": "arrow_right", "palette": {"{_}": "#00000000", "{a}": "#5fcde4"}, "transform": ["rotate:90"]}
{"type": "sprite", "name": "arrow_scaled", "source": "arrow_right", "palette": {"{_}": "#00000000", "{a}": "#5fcde4"}, "transform": ["scale:2.0,2.0"]}
```
</div>
<div class="demo-container" data-demo="transform_chain">
</div>