# Aura UI
Interfaces nativas aceleradas por GPU para **macOS, Windows, Linux, Android e iOS** con un solo código en Rust.
Estilo encadenado con los nombres de Tailwind, componentes tipo shadcn, sombras por capas y animaciones, pensado para
gastar poco: poca RAM, casi nada de CPU en reposo y binarios pequeños.
```bash
cargo add aura-gui
```
Un solo crate con un módulo por capa: `aura_ui::core` (entidades, tareas, geometría, color, animación y capa de
sistema), `::gpu` (renderizador), `::view` (elementos, estilo, layout), `::widgets` (componentes), `::app` (ventana
y bucle) y `::ai` (agentes de IA; feature `ai`, activa por defecto: `default-features = false` la quita).
```rust
use aura_ui::prelude::*;
struct Contador { clics: u32 }
impl Render for Contador {
fn render(&mut self, cx: &mut ViewContext<Self>) -> AnyElement {
div()
.size_full().flex_col().items_center().justify_center().gap_4()
.bg(Token::Canvas).text_color(Token::Text)
.child(div().p_6().rounded_lg().bg(Token::ElevatedSurface).shadow_md().child(format!("Clics: {}", self.clics)))
.child(Button::new("Sumar").variant(ButtonVariant::Primary).on_click(cx.listener(
|this: &mut Contador, _: &ClickEvent, cx| { this.clics += 1; cx.notify(); },
)))
.into_element()
}
}
// Genera `main` en escritorio e iOS y `android_main` en Android.
aura_ui::main!(AppOptions::new("Contador"), |window| window.set_root(Contador { clics: 0 }));
```
## Sombras y animaciones
```rust
div().shadow_lg() // presets xs, sm, md, lg, xl, 2xl
div().shadow(Shadows::one(BoxShadow::new(0., 4., 6.).spread(-1.)).with(BoxShadow::new(0., 12., 24.))) // capas
div().glow(Token::Accent, 16.0) // resplandor de color
let x = cx.transition("panel", if abierto { 180.0 } else { 0.0 }, Animation::new(ms(600)).easing(Easing::SPRING));
let t = cx.animate("pulso", Animation::new(ms(900)).ping_pong());
let c = cx.animate_between("fondo", Animation::new(ms(500)).easing(Easing::STANDARD), rojo, azul);
```
Curvas: `Linear`, `EaseIn`, `EaseOut`, `EaseInOut`, `CubicBezier(..)` (como CSS) y `Spring { bounce }`. Con retraso,
repetición y ida y vuelta. Una animación solo pide frames mientras corre.
## Eficiencia
Medido en macOS arm64 con el ejemplo `contador`, build release:
| Memoria (huella) | 25 MB |
| CPU en reposo | 0,00 s en 20 s |
| Binario | 7,0 MB (macOS) · 6,1 MB (iOS) · **4,2 MB** (iOS con `opt-level = "s"` y LTO completo) |
Cómo lo logra: el bucle duerme hasta que hay entrada, un temporizador o una animación; no pinta si no se ve; usa la GPU
de bajo consumo con un solo frame en cola; suelta cachés al pasar a segundo plano o ante un aviso de poca memoria; las
sombras son una sola primitiva analítica en el shader, sin pasadas de desenfoque.
Perfil recomendado para tus apps móviles:
```toml
[profile.release]
opt-level = "s"
lto = "fat"
codegen-units = 1
panic = "abort"
strip = "symbols"
```
## Móvil
Ver `docs/movil.md` del repositorio. Resumen: iOS compila para `aarch64-apple-ios` y el simulador; Android
para `aarch64-linux-android` con NativeActivity. Toque, deslizar con inercia, pulsación larga, teclado del sistema y
área segura están implementados. En iOS, añade el manifiesto UIScene al `Info.plist` (plantilla en `docs/ios/Info.plist`;
lo exige el SDK de iOS 27). Probado en el simulador de iPhone; **aún no en un iPhone ni un Android físicos.**
## Licencia
Aura UI tiene **doble licencia**, a tu elección (crates.io muestra la primera; la segunda va incluida en el paquete):
- **AGPL-3.0-only** (`LICENSE-AGPL`, <https://www.gnu.org/licenses/agpl-3.0.html>): gratis. Si la usas, tu app completa
debe publicarse bajo AGPL-3.0 con su código fuente.
- **Licencia comercial** (`LICENSE-COMMERCIAL.md`): para apps de código cerrado. Regalías del **10 % de los ingresos
brutos** de cada producto que use Aura UI. Para obtenerla escribe a <camiloghs1@gmail.com>.
Si no tienes la licencia comercial, aplica la AGPL-3.0. Los iconos de `src/widgets/svg` son de Lucide (ISC), con su
aviso en `src/widgets/svg/LICENSE-lucide`.
Copyright (C) 2026 Camilo Grajales Holguín.