# Iconos y fuentes

> Usa unos 2000 iconos de Lucide e iconos por tipo de archivo en GUIs de escritorio en Python con Pyzed, y carga tus propias fuentes como IBM Plex.

Source: https://albakore.github.io/pyzed/es/theming/icons-fonts/

## Iconos

Pyzed incluye la fuente de iconos de [Lucide](https://lucide.dev) (~2000 iconos, licencia ISC). Los iconos se dibujan
como texto, así que se ven nítidos a cualquier tamaño y aceptan cualquier color:

```python
pz.icon("folder", size=16, color="#74ade8")
ui.button("Abrir", self.abrir, icon="folder-open")
ui.list_item("Ajustes", self.ajustes, icon="settings")
```

Sin `color`, `pz.icon` toma el color del texto que lo rodea. Los iconos dentro de los componentes de `pyzed.ui` usan
los [tokens](https://albakore.github.io/pyzed/es/theming/tokens/#texto-iconos-y-acento) `icon` e `icon_muted` del tema, así que siguen el tema.

Busca nombres en [lucide.dev/icons](https://lucide.dev/icons) o desde la terminal:

**uv:**

```bash
uv run pyzed icons git
# git-branch, git-commit-horizontal, git-compare, git-fork, git-merge, git-pull-request, ...
```

**pip:**

```bash title="macOS y Linux"
pyzed icons git          # o: python3 -m pyzed icons git
```

```powershell title="Windows (PowerShell)"
pyzed icons git          # o: py -m pyzed icons git
```

`pyzed.icons.names()` devuelve la lista completa y `pyzed.icons.glyph("folder")` el carácter,
para mezclarlo con texto usando `font="icons"`.

### Buscar y elegir iconos

`icons.search` busca iconos por nombre y por las etiquetas de Lucide (en inglés), los mejores primero, e
`icons.category` los agrupa para explorarlos:

```python
from pyzed import icons

icons.search("person")      # ["person-standing", "user", "contact", ...]
icons.category("arrows")    # todas las flechas, chevrons, deshacer...
```

Para que el usuario elija uno, usa [`ui.IconPicker`](https://albakore.github.io/pyzed/es/library/icon-picker/), o `ui.icon_picker_dialog` en
una `ui.dialog_layer`: un buscador, categorías y una cuadrícula con todos los iconos.

### Iconos por tipo de archivo

```python
from pyzed import icons

icons.for_file("main.rs")       # ("file-code", "#dea584")
icons.for_file("Cargo.toml")    # ("file-cog", "#9c4221")
icons.language_for("main.py")   # "Python"
```

`ui.Tab.for_file` y `ui.tree` ya los usan.

## Fuentes

Fuentes incluidas:

| Nombre | Fuente |
| --- | --- |
| `"sans"` (por defecto) | IBM Plex Sans |
| `"mono"` | IBM Plex Mono |
| `"icons"` | Lucide |

`"serif"` usa la fuente serif del sistema. Elige una fuente para un texto, para un bloque (todo texto dentro la hereda)
o para toda la ventana:

```python
pz.text("fn main() {}").style(font="mono")                  # un texto
pz.column([...]).style(font="serif", size=15)                # todo texto dentro
class MiApp(pz.App):
    style = pz.Style(font="mono")                           # toda la ventana
```

### Tus propias fuentes

Carga un archivo `.ttf` u `.otf` antes de ejecutar la app y refiérete a él por su **nombre de familia** (el nombre que
declara la fuente, no el del archivo):

```python
pz.load_font("fonts/JetBrainsMono-Regular.ttf")

pz.text("fn main() {}", font="JetBrains Mono")
pz.code_editor("buf", texto, font="JetBrains Mono")
```

`load_font` también acepta los `bytes` del archivo. Carga cada peso que uses (Regular, Bold...) como su propio
archivo.

**Fuentes en una app empaquetada:**

Guarda los archivos de fuentes en tu proyecto (por ejemplo `assets/fonts/`), añade la carpeta a `include` en
`[tool.pyzed.build]` y resuelve la ruta desde el paquete como se muestra en
[Compilar y distribuir](https://albakore.github.io/pyzed/es/packaging/build/#opciones), para que la app empaquetada las encuentre.

**Licencias:**

Comprueba que la licencia de una fuente permita incluirla en una app que distribuyes. IBM Plex y Lucide, que Pyzed
incluye, lo permiten (SIL Open Font License e ISC).
