pixelsrc 0.2.0

Pixelsrc - GenAI-native pixel art format and compiler
Documentation
<!-- Generated by scripts/generate-demos.sh -->
<!-- Do not edit manually - regenerate with: ./scripts/generate-demos.sh -->

# atlas Demos

## Godot Atlas Export

Export atlas metadata to Godot .tres resource files for game character sprites.

<div class="demo-source">

```jsonl
{"type": "palette", "name": "game", "colors": {"{_}": "#00000000", "{b}": "#2c3e50", "{s}": "#e74c3c", "{h}": "#f1c40f"}}
{"type": "sprite", "name": "player_idle", "palette": "game", "grid": ["{_}{b}{b}{_}", "{b}{s}{s}{b}", "{b}{b}{b}{b}", "{_}{b}{_}{b}"], "metadata": {"origin": [2, 3]}}
{"type": "sprite", "name": "player_walk_1", "palette": "game", "grid": ["{_}{b}{b}{_}", "{b}{s}{s}{b}", "{b}{b}{b}{b}", "{b}{_}{_}{b}"], "metadata": {"origin": [2, 3]}}
{"type": "sprite", "name": "player_walk_2", "palette": "game", "grid": ["{_}{b}{b}{_}", "{b}{s}{s}{b}", "{b}{b}{b}{b}", "{_}{b}{b}{_}"], "metadata": {"origin": [2, 3]}}
{"type": "sprite", "name": "coin", "palette": "game", "grid": ["{_}{h}{h}{_}", "{h}{h}{h}{h}", "{h}{h}{h}{h}", "{_}{h}{h}{_}"]}
{"type": "animation", "name": "walk", "frames": ["player_walk_1", "player_walk_2"], "duration": 200}
```

</div>

<div class="demo-container" data-demo="godot">
</div>

## Godot Export File Generation

Generates AtlasTexture, SpriteFrames, and AnimationLibrary .tres files.

<div class="demo-source">

```jsonl
{"type": "palette", "name": "game", "colors": {"{_}": "#00000000", "{b}": "#2c3e50", "{s}": "#e74c3c", "{h}": "#f1c40f"}}
{"type": "sprite", "name": "player_idle", "palette": "game", "grid": ["{_}{b}{b}{_}", "{b}{s}{s}{b}", "{b}{b}{b}{b}", "{_}{b}{_}{b}"], "metadata": {"origin": [2, 3]}}
{"type": "sprite", "name": "player_walk_1", "palette": "game", "grid": ["{_}{b}{b}{_}", "{b}{s}{s}{b}", "{b}{b}{b}{b}", "{b}{_}{_}{b}"], "metadata": {"origin": [2, 3]}}
{"type": "sprite", "name": "player_walk_2", "palette": "game", "grid": ["{_}{b}{b}{_}", "{b}{s}{s}{b}", "{b}{b}{b}{b}", "{_}{b}{b}{_}"], "metadata": {"origin": [2, 3]}}
{"type": "sprite", "name": "coin", "palette": "game", "grid": ["{_}{h}{h}{_}", "{h}{h}{h}{h}", "{h}{h}{h}{h}", "{_}{h}{h}{_}"]}
{"type": "animation", "name": "walk", "frames": ["player_walk_1", "player_walk_2"], "duration": 200}
```

</div>

<div class="demo-container" data-demo="godot_files">
</div>

## Godot Export Content Verification

Verify AtlasTexture contains correct Rect2 and resource references.

<div class="demo-source">

```jsonl
{"type": "palette", "name": "game", "colors": {"{_}": "#00000000", "{b}": "#2c3e50", "{s}": "#e74c3c", "{h}": "#f1c40f"}}
{"type": "sprite", "name": "player_idle", "palette": "game", "grid": ["{_}{b}{b}{_}", "{b}{s}{s}{b}", "{b}{b}{b}{b}", "{_}{b}{_}{b}"], "metadata": {"origin": [2, 3]}}
{"type": "sprite", "name": "player_walk_1", "palette": "game", "grid": ["{_}{b}{b}{_}", "{b}{s}{s}{b}", "{b}{b}{b}{b}", "{b}{_}{_}{b}"], "metadata": {"origin": [2, 3]}}
{"type": "sprite", "name": "player_walk_2", "palette": "game", "grid": ["{_}{b}{b}{_}", "{b}{s}{s}{b}", "{b}{b}{b}{b}", "{_}{b}{b}{_}"], "metadata": {"origin": [2, 3]}}
{"type": "sprite", "name": "coin", "palette": "game", "grid": ["{_}{h}{h}{_}", "{h}{h}{h}{h}", "{h}{h}{h}{h}", "{_}{h}{h}{_}"]}
{"type": "animation", "name": "walk", "frames": ["player_walk_1", "player_walk_2"], "duration": 200}
```

</div>

<div class="demo-container" data-demo="godot_content">
</div>

## Godot Export with Sprite Origins

Sprites with origin metadata preserve positioning information.

<div class="demo-source">

```jsonl
{"type": "palette", "name": "game", "colors": {"{_}": "#00000000", "{b}": "#2c3e50", "{s}": "#e74c3c", "{h}": "#f1c40f"}}
{"type": "sprite", "name": "player_idle", "palette": "game", "grid": ["{_}{b}{b}{_}", "{b}{s}{s}{b}", "{b}{b}{b}{b}", "{_}{b}{_}{b}"], "metadata": {"origin": [2, 3]}}
{"type": "sprite", "name": "player_walk_1", "palette": "game", "grid": ["{_}{b}{b}{_}", "{b}{s}{s}{b}", "{b}{b}{b}{b}", "{b}{_}{_}{b}"], "metadata": {"origin": [2, 3]}}
{"type": "sprite", "name": "player_walk_2", "palette": "game", "grid": ["{_}{b}{b}{_}", "{b}{s}{s}{b}", "{b}{b}{b}{b}", "{_}{b}{b}{_}"], "metadata": {"origin": [2, 3]}}
{"type": "sprite", "name": "coin", "palette": "game", "grid": ["{_}{h}{h}{_}", "{h}{h}{h}{h}", "{h}{h}{h}{h}", "{_}{h}{h}{_}"]}
{"type": "animation", "name": "walk", "frames": ["player_walk_1", "player_walk_2"], "duration": 200}
```

</div>

<div class="demo-container" data-demo="godot_origin">
</div>

## libGDX Atlas Export

Export atlas metadata to libGDX TextureAtlas format for RPG game items.

<div class="demo-source">

```jsonl
{"type": "palette", "name": "rpg", "colors": {"{_}": "#00000000", "{b}": "#5D4E37", "{m}": "#8B4513", "{s}": "#C0C0C0", "{g}": "#FFD700"}}
{"type": "sprite", "name": "sword", "palette": "rpg", "grid": ["{_}{_}{s}{_}", "{_}{s}{s}{_}", "{b}{s}{_}{_}", "{m}{_}{_}{_}"], "metadata": {"origin": [0, 3]}}
{"type": "sprite", "name": "shield", "palette": "rpg", "grid": ["{b}{b}{b}{b}", "{b}{g}{g}{b}", "{b}{g}{g}{b}", "{_}{b}{b}{_}"], "metadata": {"origin": [2, 2]}}
{"type": "sprite", "name": "potion_1", "palette": "rpg", "grid": ["{_}{s}{s}{_}", "{_}{b}{b}{_}", "{g}{g}{g}{g}", "{_}{g}{g}{_}"]}
{"type": "sprite", "name": "potion_2", "palette": "rpg", "grid": ["{_}{s}{s}{_}", "{_}{b}{b}{_}", "{g}{_}{_}{g}", "{_}{g}{g}{_}"]}
{"type": "animation", "name": "potion_shimmer", "frames": ["potion_1", "potion_2"], "duration": 300}
```

</div>

<div class="demo-container" data-demo="libgdx">
</div>

## libGDX Atlas Format

Verify the text-based .atlas format structure.

<div class="demo-source">

```jsonl
{"type": "palette", "name": "rpg", "colors": {"{_}": "#00000000", "{b}": "#5D4E37", "{m}": "#8B4513", "{s}": "#C0C0C0", "{g}": "#FFD700"}}
{"type": "sprite", "name": "sword", "palette": "rpg", "grid": ["{_}{_}{s}{_}", "{_}{s}{s}{_}", "{b}{s}{_}{_}", "{m}{_}{_}{_}"], "metadata": {"origin": [0, 3]}}
{"type": "sprite", "name": "shield", "palette": "rpg", "grid": ["{b}{b}{b}{b}", "{b}{g}{g}{b}", "{b}{g}{g}{b}", "{_}{b}{b}{_}"], "metadata": {"origin": [2, 2]}}
{"type": "sprite", "name": "potion_1", "palette": "rpg", "grid": ["{_}{s}{s}{_}", "{_}{b}{b}{_}", "{g}{g}{g}{g}", "{_}{g}{g}{_}"]}
{"type": "sprite", "name": "potion_2", "palette": "rpg", "grid": ["{_}{s}{s}{_}", "{_}{b}{b}{_}", "{g}{_}{_}{g}", "{_}{g}{g}{_}"]}
{"type": "animation", "name": "potion_shimmer", "frames": ["potion_1", "potion_2"], "duration": 300}
```

</div>

<div class="demo-container" data-demo="libgdx_format">
</div>

## libGDX Animation Indices

Animation frames get sequential index values for sprite sheet animation.

<div class="demo-source">

```jsonl
{"type": "palette", "name": "rpg", "colors": {"{_}": "#00000000", "{b}": "#5D4E37", "{m}": "#8B4513", "{s}": "#C0C0C0", "{g}": "#FFD700"}}
{"type": "sprite", "name": "sword", "palette": "rpg", "grid": ["{_}{_}{s}{_}", "{_}{s}{s}{_}", "{b}{s}{_}{_}", "{m}{_}{_}{_}"], "metadata": {"origin": [0, 3]}}
{"type": "sprite", "name": "shield", "palette": "rpg", "grid": ["{b}{b}{b}{b}", "{b}{g}{g}{b}", "{b}{g}{g}{b}", "{_}{b}{b}{_}"], "metadata": {"origin": [2, 2]}}
{"type": "sprite", "name": "potion_1", "palette": "rpg", "grid": ["{_}{s}{s}{_}", "{_}{b}{b}{_}", "{g}{g}{g}{g}", "{_}{g}{g}{_}"]}
{"type": "sprite", "name": "potion_2", "palette": "rpg", "grid": ["{_}{s}{s}{_}", "{_}{b}{b}{_}", "{g}{_}{_}{g}", "{_}{g}{g}{_}"]}
{"type": "animation", "name": "potion_shimmer", "frames": ["potion_1", "potion_2"], "duration": 300}
```

</div>

<div class="demo-container" data-demo="libgdx_animation">
</div>

## libGDX Export with Offsets

Sprites with origin metadata export as offset values.

<div class="demo-source">

```jsonl
{"type": "palette", "name": "rpg", "colors": {"{_}": "#00000000", "{b}": "#5D4E37", "{m}": "#8B4513", "{s}": "#C0C0C0", "{g}": "#FFD700"}}
{"type": "sprite", "name": "sword", "palette": "rpg", "grid": ["{_}{_}{s}{_}", "{_}{s}{s}{_}", "{b}{s}{_}{_}", "{m}{_}{_}{_}"], "metadata": {"origin": [0, 3]}}
{"type": "sprite", "name": "shield", "palette": "rpg", "grid": ["{b}{b}{b}{b}", "{b}{g}{g}{b}", "{b}{g}{g}{b}", "{_}{b}{b}{_}"], "metadata": {"origin": [2, 2]}}
{"type": "sprite", "name": "potion_1", "palette": "rpg", "grid": ["{_}{s}{s}{_}", "{_}{b}{b}{_}", "{g}{g}{g}{g}", "{_}{g}{g}{_}"]}
{"type": "sprite", "name": "potion_2", "palette": "rpg", "grid": ["{_}{s}{s}{_}", "{_}{b}{b}{_}", "{g}{_}{_}{g}", "{_}{g}{g}{_}"]}
{"type": "animation", "name": "potion_shimmer", "frames": ["potion_1", "potion_2"], "duration": 300}
```

</div>

<div class="demo-container" data-demo="libgdx_origin">
</div>

## libGDX Export File Generation

Generate .atlas file to disk.

<div class="demo-source">

```jsonl
{"type": "palette", "name": "rpg", "colors": {"{_}": "#00000000", "{b}": "#5D4E37", "{m}": "#8B4513", "{s}": "#C0C0C0", "{g}": "#FFD700"}}
{"type": "sprite", "name": "sword", "palette": "rpg", "grid": ["{_}{_}{s}{_}", "{_}{s}{s}{_}", "{b}{s}{_}{_}", "{m}{_}{_}{_}"], "metadata": {"origin": [0, 3]}}
{"type": "sprite", "name": "shield", "palette": "rpg", "grid": ["{b}{b}{b}{b}", "{b}{g}{g}{b}", "{b}{g}{g}{b}", "{_}{b}{b}{_}"], "metadata": {"origin": [2, 2]}}
{"type": "sprite", "name": "potion_1", "palette": "rpg", "grid": ["{_}{s}{s}{_}", "{_}{b}{b}{_}", "{g}{g}{g}{g}", "{_}{g}{g}{_}"]}
{"type": "sprite", "name": "potion_2", "palette": "rpg", "grid": ["{_}{s}{s}{_}", "{_}{b}{b}{_}", "{g}{_}{_}{g}", "{_}{g}{g}{_}"]}
{"type": "animation", "name": "potion_shimmer", "frames": ["potion_1", "potion_2"], "duration": 300}
```

</div>

<div class="demo-container" data-demo="libgdx_file">
</div>

## libGDX Filter Modes

Configure texture filtering for different rendering styles.

<div class="demo-source">

```jsonl
{"type": "palette", "name": "rpg", "colors": {"{_}": "#00000000", "{b}": "#5D4E37", "{m}": "#8B4513", "{s}": "#C0C0C0", "{g}": "#FFD700"}}
{"type": "sprite", "name": "sword", "palette": "rpg", "grid": ["{_}{_}{s}{_}", "{_}{s}{s}{_}", "{b}{s}{_}{_}", "{m}{_}{_}{_}"], "metadata": {"origin": [0, 3]}}
{"type": "sprite", "name": "shield", "palette": "rpg", "grid": ["{b}{b}{b}{b}", "{b}{g}{g}{b}", "{b}{g}{g}{b}", "{_}{b}{b}{_}"], "metadata": {"origin": [2, 2]}}
{"type": "sprite", "name": "potion_1", "palette": "rpg", "grid": ["{_}{s}{s}{_}", "{_}{b}{b}{_}", "{g}{g}{g}{g}", "{_}{g}{g}{_}"]}
{"type": "sprite", "name": "potion_2", "palette": "rpg", "grid": ["{_}{s}{s}{_}", "{_}{b}{b}{_}", "{g}{_}{_}{g}", "{_}{g}{g}{_}"]}
{"type": "animation", "name": "potion_shimmer", "frames": ["potion_1", "potion_2"], "duration": 300}
```

</div>

<div class="demo-container" data-demo="libgdx_filter">
</div>

## libGDX Repeat Modes

Configure texture wrapping for tiling textures.

<div class="demo-source">

```jsonl
{"type": "palette", "name": "rpg", "colors": {"{_}": "#00000000", "{b}": "#5D4E37", "{m}": "#8B4513", "{s}": "#C0C0C0", "{g}": "#FFD700"}}
{"type": "sprite", "name": "sword", "palette": "rpg", "grid": ["{_}{_}{s}{_}", "{_}{s}{s}{_}", "{b}{s}{_}{_}", "{m}{_}{_}{_}"], "metadata": {"origin": [0, 3]}}
{"type": "sprite", "name": "shield", "palette": "rpg", "grid": ["{b}{b}{b}{b}", "{b}{g}{g}{b}", "{b}{g}{g}{b}", "{_}{b}{b}{_}"], "metadata": {"origin": [2, 2]}}
{"type": "sprite", "name": "potion_1", "palette": "rpg", "grid": ["{_}{s}{s}{_}", "{_}{b}{b}{_}", "{g}{g}{g}{g}", "{_}{g}{g}{_}"]}
{"type": "sprite", "name": "potion_2", "palette": "rpg", "grid": ["{_}{s}{s}{_}", "{_}{b}{b}{_}", "{g}{_}{_}{g}", "{_}{g}{g}{_}"]}
{"type": "animation", "name": "potion_shimmer", "frames": ["potion_1", "potion_2"], "duration": 300}
```

</div>

<div class="demo-container" data-demo="libgdx_repeat">
</div>

## libGDX Export via Trait

Use the Exporter trait for generic export handling.

<div class="demo-source">

```jsonl
{"type": "palette", "name": "rpg", "colors": {"{_}": "#00000000", "{b}": "#5D4E37", "{m}": "#8B4513", "{s}": "#C0C0C0", "{g}": "#FFD700"}}
{"type": "sprite", "name": "sword", "palette": "rpg", "grid": ["{_}{_}{s}{_}", "{_}{s}{s}{_}", "{b}{s}{_}{_}", "{m}{_}{_}{_}"], "metadata": {"origin": [0, 3]}}
{"type": "sprite", "name": "shield", "palette": "rpg", "grid": ["{b}{b}{b}{b}", "{b}{g}{g}{b}", "{b}{g}{g}{b}", "{_}{b}{b}{_}"], "metadata": {"origin": [2, 2]}}
{"type": "sprite", "name": "potion_1", "palette": "rpg", "grid": ["{_}{s}{s}{_}", "{_}{b}{b}{_}", "{g}{g}{g}{g}", "{_}{g}{g}{_}"]}
{"type": "sprite", "name": "potion_2", "palette": "rpg", "grid": ["{_}{s}{s}{_}", "{_}{b}{b}{_}", "{g}{_}{_}{g}", "{_}{g}{g}{_}"]}
{"type": "animation", "name": "potion_shimmer", "frames": ["potion_1", "potion_2"], "duration": 300}
```

</div>

<div class="demo-container" data-demo="libgdx_trait">
</div>

## Unity Atlas Export

Export atlas metadata to Unity JSON format for UI sprite components.

<div class="demo-source">

```jsonl
{"type": "palette", "name": "ui", "colors": {"{_}": "#00000000", "{w}": "#FFFFFF", "{g}": "#4CAF50", "{r}": "#F44336", "{d}": "#212121"}}
{"type": "sprite", "name": "button_normal", "palette": "ui", "grid": ["{d}{d}{d}{d}{d}{d}", "{d}{w}{w}{w}{w}{d}", "{d}{w}{w}{w}{w}{d}", "{d}{d}{d}{d}{d}{d}"], "metadata": {"origin": [3, 2]}}
{"type": "sprite", "name": "button_hover", "palette": "ui", "grid": ["{g}{g}{g}{g}{g}{g}", "{g}{w}{w}{w}{w}{g}", "{g}{w}{w}{w}{w}{g}", "{g}{g}{g}{g}{g}{g}"], "metadata": {"origin": [3, 2]}}
{"type": "sprite", "name": "button_pressed", "palette": "ui", "grid": ["{r}{r}{r}{r}{r}{r}", "{r}{d}{d}{d}{d}{r}", "{r}{d}{d}{d}{d}{r}", "{r}{r}{r}{r}{r}{r}"], "metadata": {"origin": [3, 2]}}
{"type": "sprite", "name": "icon_check", "palette": "ui", "grid": ["{_}{_}{_}{g}", "{_}{_}{g}{_}", "{g}{g}{_}{_}", "{_}{g}{_}{_}"]}
```

</div>

<div class="demo-container" data-demo="unity">
</div>

## Unity Export File Generation

Generates JSON metadata, .meta import settings, and .anim clips.

<div class="demo-source">

```jsonl
{"type": "palette", "name": "ui", "colors": {"{_}": "#00000000", "{w}": "#FFFFFF", "{g}": "#4CAF50", "{r}": "#F44336", "{d}": "#212121"}}
{"type": "sprite", "name": "button_normal", "palette": "ui", "grid": ["{d}{d}{d}{d}{d}{d}", "{d}{w}{w}{w}{w}{d}", "{d}{w}{w}{w}{w}{d}", "{d}{d}{d}{d}{d}{d}"], "metadata": {"origin": [3, 2]}}
{"type": "sprite", "name": "button_hover", "palette": "ui", "grid": ["{g}{g}{g}{g}{g}{g}", "{g}{w}{w}{w}{w}{g}", "{g}{w}{w}{w}{w}{g}", "{g}{g}{g}{g}{g}{g}"], "metadata": {"origin": [3, 2]}}
{"type": "sprite", "name": "button_pressed", "palette": "ui", "grid": ["{r}{r}{r}{r}{r}{r}", "{r}{d}{d}{d}{d}{r}", "{r}{d}{d}{d}{d}{r}", "{r}{r}{r}{r}{r}{r}"], "metadata": {"origin": [3, 2]}}
{"type": "sprite", "name": "icon_check", "palette": "ui", "grid": ["{_}{_}{_}{g}", "{_}{_}{g}{_}", "{g}{g}{_}{_}", "{_}{g}{_}{_}"]}
```

</div>

<div class="demo-container" data-demo="unity_files">
</div>

## Unity JSON Metadata Content

Verify JSON contains sprite rects with Unity coordinate system (Y-flipped).

<div class="demo-source">

```jsonl
{"type": "palette", "name": "ui", "colors": {"{_}": "#00000000", "{w}": "#FFFFFF", "{g}": "#4CAF50", "{r}": "#F44336", "{d}": "#212121"}}
{"type": "sprite", "name": "button_normal", "palette": "ui", "grid": ["{d}{d}{d}{d}{d}{d}", "{d}{w}{w}{w}{w}{d}", "{d}{w}{w}{w}{w}{d}", "{d}{d}{d}{d}{d}{d}"], "metadata": {"origin": [3, 2]}}
{"type": "sprite", "name": "button_hover", "palette": "ui", "grid": ["{g}{g}{g}{g}{g}{g}", "{g}{w}{w}{w}{w}{g}", "{g}{w}{w}{w}{w}{g}", "{g}{g}{g}{g}{g}{g}"], "metadata": {"origin": [3, 2]}}
{"type": "sprite", "name": "button_pressed", "palette": "ui", "grid": ["{r}{r}{r}{r}{r}{r}", "{r}{d}{d}{d}{d}{r}", "{r}{d}{d}{d}{d}{r}", "{r}{r}{r}{r}{r}{r}"], "metadata": {"origin": [3, 2]}}
{"type": "sprite", "name": "icon_check", "palette": "ui", "grid": ["{_}{_}{_}{g}", "{_}{_}{g}{_}", "{g}{g}{_}{_}", "{_}{g}{_}{_}"]}
```

</div>

<div class="demo-container" data-demo="unity_json">
</div>

## Unity Texture Meta File

Verify .meta file contains TextureImporter settings with sprite slices.

<div class="demo-source">

```jsonl
{"type": "palette", "name": "ui", "colors": {"{_}": "#00000000", "{w}": "#FFFFFF", "{g}": "#4CAF50", "{r}": "#F44336", "{d}": "#212121"}}
{"type": "sprite", "name": "button_normal", "palette": "ui", "grid": ["{d}{d}{d}{d}{d}{d}", "{d}{w}{w}{w}{w}{d}", "{d}{w}{w}{w}{w}{d}", "{d}{d}{d}{d}{d}{d}"], "metadata": {"origin": [3, 2]}}
{"type": "sprite", "name": "button_hover", "palette": "ui", "grid": ["{g}{g}{g}{g}{g}{g}", "{g}{w}{w}{w}{w}{g}", "{g}{w}{w}{w}{w}{g}", "{g}{g}{g}{g}{g}{g}"], "metadata": {"origin": [3, 2]}}
{"type": "sprite", "name": "button_pressed", "palette": "ui", "grid": ["{r}{r}{r}{r}{r}{r}", "{r}{d}{d}{d}{d}{r}", "{r}{d}{d}{d}{d}{r}", "{r}{r}{r}{r}{r}{r}"], "metadata": {"origin": [3, 2]}}
{"type": "sprite", "name": "icon_check", "palette": "ui", "grid": ["{_}{_}{_}{g}", "{_}{_}{g}{_}", "{g}{g}{_}{_}", "{_}{g}{_}{_}"]}
```

</div>

<div class="demo-container" data-demo="unity_meta">
</div>

## Unity Export with Pivot Points

Sprites with origin metadata are converted to Unity pivot points.

<div class="demo-source">

```jsonl
{"type": "palette", "name": "ui", "colors": {"{_}": "#00000000", "{w}": "#FFFFFF", "{g}": "#4CAF50", "{r}": "#F44336", "{d}": "#212121"}}
{"type": "sprite", "name": "button_normal", "palette": "ui", "grid": ["{d}{d}{d}{d}{d}{d}", "{d}{w}{w}{w}{w}{d}", "{d}{w}{w}{w}{w}{d}", "{d}{d}{d}{d}{d}{d}"], "metadata": {"origin": [3, 2]}}
{"type": "sprite", "name": "button_hover", "palette": "ui", "grid": ["{g}{g}{g}{g}{g}{g}", "{g}{w}{w}{w}{w}{g}", "{g}{w}{w}{w}{w}{g}", "{g}{g}{g}{g}{g}{g}"], "metadata": {"origin": [3, 2]}}
{"type": "sprite", "name": "button_pressed", "palette": "ui", "grid": ["{r}{r}{r}{r}{r}{r}", "{r}{d}{d}{d}{d}{r}", "{r}{d}{d}{d}{d}{r}", "{r}{r}{r}{r}{r}{r}"], "metadata": {"origin": [3, 2]}}
{"type": "sprite", "name": "icon_check", "palette": "ui", "grid": ["{_}{_}{_}{g}", "{_}{_}{g}{_}", "{g}{g}{_}{_}", "{_}{g}{_}{_}"]}
```

</div>

<div class="demo-container" data-demo="unity_pivot">
</div>

## Unity Export Filter Modes

Configure texture filtering for different use cases.

<div class="demo-source">

```jsonl
{"type": "palette", "name": "ui", "colors": {"{_}": "#00000000", "{w}": "#FFFFFF", "{g}": "#4CAF50", "{r}": "#F44336", "{d}": "#212121"}}
{"type": "sprite", "name": "button_normal", "palette": "ui", "grid": ["{d}{d}{d}{d}{d}{d}", "{d}{w}{w}{w}{w}{d}", "{d}{w}{w}{w}{w}{d}", "{d}{d}{d}{d}{d}{d}"], "metadata": {"origin": [3, 2]}}
{"type": "sprite", "name": "button_hover", "palette": "ui", "grid": ["{g}{g}{g}{g}{g}{g}", "{g}{w}{w}{w}{w}{g}", "{g}{w}{w}{w}{w}{g}", "{g}{g}{g}{g}{g}{g}"], "metadata": {"origin": [3, 2]}}
{"type": "sprite", "name": "button_pressed", "palette": "ui", "grid": ["{r}{r}{r}{r}{r}{r}", "{r}{d}{d}{d}{d}{r}", "{r}{d}{d}{d}{d}{r}", "{r}{r}{r}{r}{r}{r}"], "metadata": {"origin": [3, 2]}}
{"type": "sprite", "name": "icon_check", "palette": "ui", "grid": ["{_}{_}{_}{g}", "{_}{_}{g}{_}", "{g}{g}{_}{_}", "{_}{g}{_}{_}"]}
```

</div>

<div class="demo-container" data-demo="unity_filter">
</div>

## Aseprite JSON Atlas

Sprite atlas data for Aseprite-compatible JSON export format.

<div class="demo-source">

```jsonl
{"type": "palette", "name": "character", "colors": {"{_}": "#00000000", "{o}": "#2C3E50", "{s}": "#E74C3C", "{e}": "#3498DB", "{h}": "#F39C12"}}
{"type": "sprite", "name": "char_idle_1", "palette": "character", "grid": ["{_}{o}{o}{_}", "{o}{e}{e}{o}", "{o}{s}{s}{o}", "{_}{o}{_}{o}"], "metadata": {"origin": [2, 3]}}
{"type": "sprite", "name": "char_idle_2", "palette": "character", "grid": ["{_}{o}{o}{_}", "{o}{e}{e}{o}", "{o}{s}{s}{o}", "{o}{_}{_}{o}"], "metadata": {"origin": [2, 3]}}
{"type": "sprite", "name": "char_run_1", "palette": "character", "grid": ["{_}{o}{o}{_}", "{o}{e}{e}{o}", "{o}{s}{s}{o}", "{o}{_}{o}{_}"], "metadata": {"origin": [2, 3]}}
{"type": "sprite", "name": "char_run_2", "palette": "character", "grid": ["{_}{o}{o}{_}", "{o}{e}{e}{o}", "{o}{s}{s}{o}", "{_}{o}{_}{o}"], "metadata": {"origin": [2, 3]}}
{"type": "sprite", "name": "char_run_3", "palette": "character", "grid": ["{_}{o}{o}{_}", "{o}{e}{e}{o}", "{o}{s}{s}{o}", "{_}{o}{o}{_}"], "metadata": {"origin": [2, 3]}}
{"type": "sprite", "name": "char_run_4", "palette": "character", "grid": ["{_}{o}{o}{_}", "{o}{e}{e}{o}", "{o}{s}{s}{o}", "{o}{_}{_}{o}"], "metadata": {"origin": [2, 3]}}
{"type": "sprite", "name": "item_gem", "palette": "character", "grid": ["{_}{h}{_}", "{h}{h}{h}", "{_}{h}{_}"]}
{"type": "animation", "name": "idle", "frames": ["char_idle_1", "char_idle_2"], "duration": 500}
{"type": "animation", "name": "run", "frames": ["char_run_1", "char_run_2", "char_run_3", "char_run_4"], "duration": 100}
```

</div>

<div class="demo-container" data-demo="aseprite">
</div>