feat(yahweh-widget-banner): widget compartido para toasts/errores cross-app
Patrón visual común a yahweh-widget-meta-form (toast success +
error banner) y nakui-explorer (error banner): div con bg + text
colored según severidad. Antes duplicado con colores hardcoded en
cada consumer.
Crate nuevo crates/modules/ui_engine/widgets/banner:
- pub enum Banner { Info, Success, Warning, Error } con bg()/fg()
hardcoded por variant.
- pub fn banner(kind, message) -> Div: padding/text_size defaults;
caller compone con .child()/.px()/.on_click()/etc.
- 2 tests sanity (no color collisions).
Migración:
- yahweh-widget-meta-form: 12 líneas hardcoded → 2 llamadas a
banner().
- nakui-explorer: error banner usa banner() + override de
padding custom del header.
Tests stack: 109 → 111 (+2). Cada crate compila individualmente.
Próximo natural: confirm_delete_banner (Warning + botones) puede
extraerse como modal-banner cuando emerja segundo consumer.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -6,6 +6,55 @@ ratio/diff ver `git show <sha>`.
|
||||
|
||||
## 2026-05-10
|
||||
|
||||
### feat(yahweh-widget-banner): widget compartido para toasts/errores cross-app
|
||||
Patrón visual común a `yahweh-widget-meta-form` (toast success +
|
||||
error_banner) y `nakui-explorer` (error_banner): un `div` con bg
|
||||
+ text colored según severidad. Antes vivía duplicado con colores
|
||||
hardcoded en cada consumer; ahora hay un widget yahweh con presets
|
||||
consistentes.
|
||||
|
||||
Crate nuevo: `crates/modules/ui_engine/widgets/banner/`
|
||||
(`yahweh-widget-banner`):
|
||||
- **Dep**: solo `gpui` (sin nakui, sin runtime). Reusable por
|
||||
cualquier app GPUI que necesite tiras de status.
|
||||
- **`pub enum Banner`** con 4 variants:
|
||||
- `Info` (azul tenue, mensajes neutros).
|
||||
- `Success` (verde, confirmaciones).
|
||||
- `Warning` (amber, llamadas de atención).
|
||||
- `Error` (rojo, errores fatales).
|
||||
- **Métodos `Banner::bg()` y `Banner::fg()`**: paleta hardcoded por
|
||||
variant (sin tema dinámico todavía — cuando emerja, se
|
||||
inyecta vía `yahweh-theme`).
|
||||
- **`pub fn banner(kind, message) -> Div`**: constructor que
|
||||
devuelve el div ya con padding/text_size defaults; el caller
|
||||
puede agregar children, override pads/sizes, attach handlers.
|
||||
- 2 tests sanity: ningún kind comparte bg, ningún kind comparte fg.
|
||||
|
||||
Migración de consumers:
|
||||
- **`yahweh-widget-meta-form`**: nueva dep `yahweh-widget-banner`.
|
||||
El `toast_div` (Success) y `error_banner` (Error) en
|
||||
`MetaApp::render` pasan de 2x6 líneas hardcoded a una llamada
|
||||
a `banner(...)` cada uno (~12 líneas → 2).
|
||||
- **`nakui-explorer`**: nueva dep. El error banner local pasa a
|
||||
`banner(Banner::Error, e).px(16).py(8).text_size(12)` —
|
||||
preserva el padding/size custom del header del explorer via
|
||||
override builder.
|
||||
|
||||
Tests stack: 109 → **111 verdes** (+2 del crate banner).
|
||||
|
||||
Beneficio operativo:
|
||||
- Si emerge un tercer consumer, importa la dep + 1 llamada.
|
||||
- Cambiar la paleta de un kind = un cambio en un solo lugar
|
||||
(ej. ajustar tono del Error o el contraste del Warning).
|
||||
- Composición preservada: el `banner()` devuelve un `Div` directo,
|
||||
el caller modifica con builder calls (`.child()`, `.px()`,
|
||||
`.on_click()`, etc.) sin rewrap.
|
||||
|
||||
Próximo candidato natural: el `confirm_delete_banner` de MetaApp
|
||||
es Banner::Warning + 2 botones embedded. Cuando emerja un segundo
|
||||
consumer de modal-style banners, extraer un widget compositivo
|
||||
arriba del `Banner` base.
|
||||
|
||||
### feat(yahweh): `MockBackend` público + tests E2E del widget con `gpui::TestAppContext`
|
||||
Cierra el ciclo de testabilidad del widget metainterfaz. Hasta
|
||||
ahora los tests del trait `MetaBackend` vivían como impl privada
|
||||
|
||||
Reference in New Issue
Block a user