feat(yahweh-widget-meta-form): paleta del chrome migrada a Theme::global(cx)
Iter 5 de integración. MetaApp::render tenía 7 vars con colors hardcoded (bg/panel/border/text/text_dim/accent/accent_active); ahora salen de Theme::global(cx) que el shell instala al boot. confirm_delete_banner usa themed_colors(Warning/Error) para sus colors base. render: - 7 let X = rgb(0x...) → theme.bg_app/bg_panel/border/fg_text/ fg_muted/accent/accent_strong. - toast_div / error_banner: banner() → banner_themed(cx). Firmas internas: - render_sidebar/main/list/entity_ref_selector/form cambian Rgba → Hsla (Background donde aplica para panel). gpui::Div acepta ambos via Into, uso interno no cambia. confirm_delete_banner: - 6 colors hardcoded → themed_colors(Warning) para banner base, themed_colors(Error) para Confirm, theme.bg_panel_alt+fg_text para Cancel. NO migra esta iter (ornament hardcoded para una pasada futura): row hovers, bordes sutiles entre filas, bg de inputs custom, bg de botones del EntityRef selector, color del icon ✕ de delete. Smoke test del binario verificado: bootstrap completo OK, panic esperado en open_window sin display. 115 tests verdes (sin cambio: los tests del widget no acceden al render). Beneficio: theme switcher (cuando llegue) cambia toda la paleta con 1 sola llamada Theme::set(cx, ...). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -34,7 +34,8 @@ use yahweh_meta_runtime::{
|
||||
MetaBackend, WriteOutcome,
|
||||
};
|
||||
use yahweh_meta_schema::{Action, FieldKind, FieldSpec, FormView, ListView, Module, View};
|
||||
use yahweh_widget_banner::{banner, Banner};
|
||||
use yahweh_theme::Theme;
|
||||
use yahweh_widget_banner::{banner_themed, themed_colors, Banner};
|
||||
use yahweh_widget_text_input::TextInput;
|
||||
|
||||
/// Estado del runtime de UI. Toda la persistencia/ejecución está
|
||||
@@ -440,25 +441,34 @@ fn lookup_field<'a>(v: &'a Value, path: &str) -> Option<&'a Value> {
|
||||
|
||||
impl<B: MetaBackend> Render for MetaApp<B> {
|
||||
fn render(&mut self, _w: &mut Window, cx: &mut Context<Self>) -> impl IntoElement {
|
||||
let bg = gpui::rgb(0x14171c);
|
||||
let panel = gpui::rgb(0x1d2128);
|
||||
let border = gpui::rgb(0x2a2f38);
|
||||
let text = gpui::rgb(0xe6e8ec);
|
||||
let text_dim = gpui::rgb(0x9ba1ad);
|
||||
let accent = gpui::rgb(0x88c0d0);
|
||||
let accent_active = gpui::rgb(0xa3be8c);
|
||||
// Paleta del chrome viene del Theme global. Derivamos los
|
||||
// 7 slots que las funciones render_* usan; las firmas
|
||||
// siguen tomando los colors individuales (Hsla / Background)
|
||||
// para preservar el shape del API interno.
|
||||
//
|
||||
// Si el caller no instaló un Theme, `Theme::global` panicea.
|
||||
// Convención: el binario shell instala el theme en main.
|
||||
let theme = Theme::global(cx).clone();
|
||||
let bg = theme.bg_app.clone();
|
||||
let panel = theme.bg_panel.clone();
|
||||
let border = theme.border;
|
||||
let text = theme.fg_text;
|
||||
let text_dim = theme.fg_muted;
|
||||
let accent = theme.accent;
|
||||
let accent_active = theme.accent_strong;
|
||||
|
||||
let sidebar = self.render_sidebar(cx, panel, border, text, text_dim, accent_active);
|
||||
let sidebar =
|
||||
self.render_sidebar(cx, panel.clone(), border, text, text_dim, accent_active);
|
||||
let main_panel = self.render_main(cx, panel, border, text, text_dim, accent);
|
||||
let confirm_banner = self.render_confirm_delete_banner(cx);
|
||||
let toast_div = self
|
||||
.toast
|
||||
.as_ref()
|
||||
.map(|t| banner(Banner::Success, t.clone()));
|
||||
.map(|t| banner_themed(cx, Banner::Success, t.clone()));
|
||||
let error_banner = self
|
||||
.load_error
|
||||
.as_ref()
|
||||
.map(|e| banner(Banner::Error, e.clone()));
|
||||
.map(|e| banner_themed(cx, Banner::Error, e.clone()));
|
||||
|
||||
div()
|
||||
.flex()
|
||||
@@ -511,12 +521,15 @@ impl<B: MetaBackend> MetaApp<B> {
|
||||
let id_short = short_uuid(&id_owned);
|
||||
let entity_for_confirm = entity_owned.clone();
|
||||
|
||||
let banner_bg = gpui::rgb(0x4a3a1a);
|
||||
let banner_text = gpui::rgb(0xf0e0a0);
|
||||
let confirm_bg = gpui::rgb(0x6a2222);
|
||||
let confirm_text = gpui::rgb(0xffd0d0);
|
||||
let cancel_bg = gpui::rgb(0x2a2f38);
|
||||
let cancel_text = gpui::rgb(0xc0c8d0);
|
||||
// Banner base usa los colors themed del kind Warning (amber
|
||||
// que sigue is_dark del theme actual). Los buttons confirm
|
||||
// (rojo) y cancel (gris) usan los colors themed del Error
|
||||
// y un derivative del border respectivamente.
|
||||
let theme = Theme::global(cx);
|
||||
let (banner_bg, banner_text) = themed_colors(Banner::Warning, theme);
|
||||
let (confirm_bg, confirm_text) = themed_colors(Banner::Error, theme);
|
||||
let cancel_bg: gpui::Background = theme.bg_panel_alt.clone();
|
||||
let cancel_text = theme.fg_text;
|
||||
|
||||
Some(
|
||||
div()
|
||||
@@ -605,11 +618,11 @@ impl<B: MetaBackend> MetaApp<B> {
|
||||
fn render_sidebar(
|
||||
&self,
|
||||
cx: &mut Context<Self>,
|
||||
panel: gpui::Rgba,
|
||||
border: gpui::Rgba,
|
||||
text: gpui::Rgba,
|
||||
text_dim: gpui::Rgba,
|
||||
accent_active: gpui::Rgba,
|
||||
panel: gpui::Background,
|
||||
border: gpui::Hsla,
|
||||
text: gpui::Hsla,
|
||||
text_dim: gpui::Hsla,
|
||||
accent_active: gpui::Hsla,
|
||||
) -> gpui::Div {
|
||||
let mut sidebar = div()
|
||||
.w(px(240.))
|
||||
@@ -694,11 +707,11 @@ impl<B: MetaBackend> MetaApp<B> {
|
||||
fn render_main(
|
||||
&mut self,
|
||||
cx: &mut Context<Self>,
|
||||
panel: gpui::Rgba,
|
||||
border: gpui::Rgba,
|
||||
text: gpui::Rgba,
|
||||
text_dim: gpui::Rgba,
|
||||
accent: gpui::Rgba,
|
||||
panel: gpui::Background,
|
||||
border: gpui::Hsla,
|
||||
text: gpui::Hsla,
|
||||
text_dim: gpui::Hsla,
|
||||
accent: gpui::Hsla,
|
||||
) -> gpui::Div {
|
||||
let main = div()
|
||||
.flex_grow()
|
||||
@@ -747,10 +760,10 @@ impl<B: MetaBackend> MetaApp<B> {
|
||||
mut main: gpui::Div,
|
||||
lv: &ListView,
|
||||
mod_idx: usize,
|
||||
border: gpui::Rgba,
|
||||
text: gpui::Rgba,
|
||||
text_dim: gpui::Rgba,
|
||||
accent: gpui::Rgba,
|
||||
border: gpui::Hsla,
|
||||
text: gpui::Hsla,
|
||||
text_dim: gpui::Hsla,
|
||||
accent: gpui::Hsla,
|
||||
) -> gpui::Div {
|
||||
let mut header = div()
|
||||
.flex()
|
||||
@@ -927,9 +940,9 @@ impl<B: MetaBackend> MetaApp<B> {
|
||||
cx: &mut Context<Self>,
|
||||
field_name: String,
|
||||
target_entity: String,
|
||||
text: gpui::Rgba,
|
||||
text_dim: gpui::Rgba,
|
||||
accent: gpui::Rgba,
|
||||
text: gpui::Hsla,
|
||||
text_dim: gpui::Hsla,
|
||||
accent: gpui::Hsla,
|
||||
) -> gpui::Div {
|
||||
let _ = text;
|
||||
let rows = self.list_rows(&target_entity);
|
||||
@@ -1004,10 +1017,10 @@ impl<B: MetaBackend> MetaApp<B> {
|
||||
mut main: gpui::Div,
|
||||
fv: &FormView,
|
||||
mod_idx: usize,
|
||||
_border: gpui::Rgba,
|
||||
text: gpui::Rgba,
|
||||
text_dim: gpui::Rgba,
|
||||
accent: gpui::Rgba,
|
||||
_border: gpui::Hsla,
|
||||
text: gpui::Hsla,
|
||||
text_dim: gpui::Hsla,
|
||||
accent: gpui::Hsla,
|
||||
) -> gpui::Div {
|
||||
// En modo edit, el título refleja eso para que el user no
|
||||
// se confunda creyendo que hace alta nueva.
|
||||
|
||||
Reference in New Issue
Block a user