---
name: button
kind: component
lang: cpp
domain: core
version: "1.0.0"
purity: pure
signature: "bool fn_ui::button(const char* label, fn_ui::ButtonVariant variant = Secondary, fn_ui::ButtonSize size = Md)"
description: "Boton ImGui con variantes (primary/secondary/subtle/danger) y tamanos (sm/md/lg) usando fn_tokens. Replica Mantine Button / fn_library Button."
tags: [imgui, button, ui, form, tokens]
uses_functions: ["tokens_cpp_core"]
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: [imgui]
tested: true
tests:
  - "compiles and links against Catch2 (placeholder, visual cubierto en 0048)"
test_file_path: "cpp/tests/test_button.cpp"
file_path: "cpp/functions/core/button.cpp"
framework: imgui
params:
  - name: label
    desc: "Texto visible del boton (tambien se usa como id ImGui; prefijar con ## para solo-id)"
  - name: variant
    desc: "ButtonVariant: Primary (indigo), Secondary (surface+border, default), Subtle (transparente), Danger (rojo)"
  - name: size
    desc: "ButtonSize: Sm (compacto), Md (default), Lg (grande, font x1.1)"
output: "true el frame en que se hace click, false en caso contrario"
---

# button

Boton con variantes semanticas y tamanos fijos. Usa tokens (`primary`, `surface`, `error`, `border`, `text`) y padding/radius consistentes — mismo estilo visual en cualquier app C++ que lo use.

## Variantes

| Variant | Uso | Colores |
|---------|-----|---------|
| `Primary` | Accion principal (Save, Submit) | `colors::primary` + hover |
| `Secondary` | Accion neutra (Cancel) | `surface` + `border` |
| `Subtle` | Accion discreta (ver mas) | transparente + hover surface |
| `Danger` | Accion destructiva (Delete) | `colors::error` |

## Ejemplo

```cpp
#include "core/button.h"
using fn_ui::button;
using V = fn_ui::ButtonVariant;

if (button("Reindex", V::Primary)) { ... }
if (button("Cancel",  V::Subtle))  { ... }
if (button("Delete",  V::Danger))  { ... }
```

## Notas

- No gestiona layout: usar `ImGui::SameLine()` o `toolbar` para alinear varios.
- Para botones solo-icono sin texto, usar `icon_button`.
