1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
//! Todo lo que una aplicación de Aura necesita para tener una ventana, eficiente por defecto:
//!
//! - **Reposo a cero**: el bucle duerme (`Wait`) y solo se despierta por entrada, por un hilo de trabajo
//! (inbox), por un temporizador (`WaitUntil` hasta el más próximo) o mientras haya una animación.
//! - **Sin pintar lo que no se ve**: tapada, minimizada o con tamaño cero, la ventana no dibuja y suelta las
//! cachés de glifos y de GPU; al volver se redimensiona y repinta.
//! - **GPU de bajo consumo**: adaptador `LowPower`, sincronía vertical y un solo frame en cola (`aura_gpu`).
//! - **Sin GPU también**: si no hay una utilizable (equipos viejos, sin controladores, emulada por software) pinta la
//! CPU con la misma escena; `AURA_RENDERER=cpu` lo fuerza.
//! - **Memoria devuelta**: tras un rato ocioso, las páginas libres del asignador vuelven al sistema (macOS).
//! - **Accesibilidad sin coste**: el árbol de AccessKit solo se construye mientras haya un lector de pantalla.
//! - **Pruebas visuales**: `AURA_SNAPSHOT=salida.png` guarda un frame, con teclas y clics simulados.
//!
//! Lo mínimo es [`run`] con una vista raíz; un programa con varias ventanas o reglas propias (el editor) usa
//! [`Surface`] y las piezas sueltas.
pub use AndroidApp;
pub use ;
pub use ;
pub use ;
/// Punto de entrada de una app escrita como closure: `run_app("Contador", |ui| ...)`.
///
/// La closure se vuelve a llamar en cada frame y lee su estado con `ui.state("clave", valor)`. No hay `impl`,
/// ni `AppOptions`, ni `set_root` en el código de la app.
///
/// ```no_run
/// use aura_ui::prelude::*;
///
/// fn main() {
/// run_app("Contador", |ui| {
/// let clics = ui.state("clics", 0u32);
/// ui.page().center().gap_4()
/// .child(ui.card().child(format!("Clics: {}", clics.get())))
/// .child(ui.button("Sumar").on_click(clics.update(|n| *n += 1)))
/// });
/// }
/// ```