# Pipeline visual squircle — assets/_scripts/

Versionamento dos scripts que padronizam logos do catálogo NXT em squircles 512×512 com bg correto + desat 50%.

## Componentes

| Arquivo | Função |
|---|---|
| `squircle.py` | Pipeline core: raw PNG/SVG → resize 512×512 → bg detect → squircle mask → desat 50% |
| `regenerate-all.py` | Orquestrador: itera todos os slugs com `logoUrl: local:X` em `tool-logos.json`, aplica `squircle.py` |
| `lucide-render.py` | Para slugs sem brand: gera squircle a partir de Lucide icon SVG + cor da categoria |
| `category-colors.json` | Bg+icon hex por tipo (Skill, Agente, Plugin, etc) |
| `phosphor-lucide-map.json` | Map legacy `phosphor:X` → lucide name |
| `squircle-mask-512.png` | Mask alpha reusável (extracted de Apple iOS app icon shape) |
| `_lucide-cache/` | SVGs baixados de unpkg (gitignored) |

## Uso individual

```bash
# Único logo
python squircle.py raw.png output.png
python squircle.py raw.png output.png --bg "#fafafa"
python squircle.py raw.png output.png --no-desat
```

## Uso batch (todos os logos)

```bash
# 1. Re-processa todos os slugs com logo de marca real (~800)
python regenerate-all.py

# 2. Gera squircles Lucide pros slugs com fallback (~264)
python lucide-render.py

# 3. Re-build catalog (no pilot dir)
cd /root/nxt/terminal.net.br/projetos/terminal.net.br
python scripts/build-catalog.py
```

## Bg color detection

Prioridade:
1. **Override manual**: `pilot/src/tool-logos-chip-overrides.json` (35 hex curados)
2. **Edge ring sampling**: pixels da borda externa (8% margin) → median-cut k=2 → centroide do cluster maior
3. **Auto neutral**: luminance do logo > 0.5 → bg charcoal `#0a0a0a`; senão → cream `#fafafa`

## Adicionar logo novo

```bash
# 1. Drop raw PNG/SVG em recursos/assets/logos/<slug>.png
# 2. Add entry em tool-logos.json (humano):
#    "Display Name": { "logoUrl": "local:<slug>.png", "domain": "...", "fallback": "..." }
# 3. Run pipeline
python regenerate-all.py    # vai pegar e processar
```

## Saída

- `pilot/public/tool-logos/<slug>.png` — versão final (squircle + desat 50%)
- 512×512 PNG com alpha mask superellipse

## Dependências

- Python 3.11+
- `Pillow` (PIL) — instalado via system pip
- `cairosvg` — fallback pra SVGs com xmlns malformado
- `rsvg-convert` — preferred SVG rasterizer (libRsvg2)

Todas pré-instaladas no Hetzner.
