feat(tahuantinsuyu): fase 15 — badges de overlays activos en el footer
Cuando hay overlays activos, debajo del info_row aparecen pills con
los nombres de cada uno (Natal, Tránsito ahora, Progresión 38.2a,
Sinastría · Ana, Saturn return 29a) — el usuario ve de un vistazo qué
está mirando sin tener que mapear los anillos manualmente.
El border de cada pill toma color según a qué slot del wheel
pertenece: outer ring (transit/synastry/planetary_return) →
palette.angle_highlight (dorado), inner overlays (progression/
solar_arc) → palette.house_cusp (tono apagado), natal → neutro.
Permite leer la pila de izquierda a derecha y ubicar visualmente cada
glyph del wheel.
- engine: nuevo OverlayMeta { module_id, label } + campo overlays:
Vec<OverlayMeta> en RenderModel. build_render_model lo inicializa
vacío; bridge::compose pushea un OverlayMeta por cada
PipelineRequest después de su build_*_overlay correspondiente. Helper
push_overlay_meta(render, id, label). Labels: "Tránsito ahora",
"Progresión {age:.1}a", "Solar Arc {age:.1}a", "Sinastría · {name}"
(lee partner_chart.label antes de mover el Box al builder),
"{Body} return {age:.0}a" (usa eternal_sky body.name()).
- canvas: render_wheel separa el viejo footer en info_row (Asc/MC/ms +
offset + hotkeys) y un badges_row opcional. badges_row aparece solo
cuando render.overlays != empty. Pill helper centralizado: bg
panel_alt, border 1px, text size 10, rounded 10. Border color
decidido por module_id para correlacionar con el ring visual.
Compatible con compute_mock (que setea overlays = vec![] — ningún
mock badge). Persiste sin cambios — los configs siguen guardando su
estado, los OverlayMeta se reconstruyen en cada compose desde los
requests activos.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -626,7 +626,7 @@ fn render_wheel(
|
||||
} else {
|
||||
palette.angle_highlight
|
||||
};
|
||||
let footer = div()
|
||||
let info_row = div()
|
||||
.flex()
|
||||
.flex_row()
|
||||
.gap(px(10.0))
|
||||
@@ -652,6 +652,27 @@ fn render_wheel(
|
||||
.child("[D]ial [H]ouses as[X]pects [P]lanets [T]ransits [R]eset"),
|
||||
);
|
||||
|
||||
// Badges de overlays activos. Cada uno se pinta como pill con
|
||||
// background sutil y border tenue. Solo aparecen cuando hay
|
||||
// overlays — la carta natal pura ve solo el info_row.
|
||||
let badges_row = if render.overlays.is_empty() {
|
||||
None
|
||||
} else {
|
||||
let mut row = div().flex().flex_row().flex_wrap().gap(px(6.0));
|
||||
// Badge "natal" base, siempre presente cuando hay overlays —
|
||||
// ayuda al usuario a leer la pila de izquierda a derecha.
|
||||
row = row.child(badge(theme, palette, "natal", "Natal", true));
|
||||
for ov in &render.overlays {
|
||||
row = row.child(badge(theme, palette, &ov.module_id, &ov.label, false));
|
||||
}
|
||||
Some(row)
|
||||
};
|
||||
|
||||
let mut footer = div().flex().flex_col().items_center().gap(px(4.0)).child(info_row);
|
||||
if let Some(b) = badges_row {
|
||||
footer = footer.child(b);
|
||||
}
|
||||
|
||||
div()
|
||||
.flex()
|
||||
.flex_col()
|
||||
@@ -662,6 +683,33 @@ fn render_wheel(
|
||||
.child(footer)
|
||||
}
|
||||
|
||||
/// Pequeña pill con la etiqueta de un overlay activo. El borde toma
|
||||
/// color según el "tipo" del módulo para ayudar a mapear a su anillo
|
||||
/// en el wheel: natal = neutro, outer ring share (transit/synastry/
|
||||
/// planetary_return) = palette.angle_highlight, inner overlays
|
||||
/// (progression/solar_arc) = palette.house_cusp.
|
||||
fn badge(theme: &Theme, palette: &AstroPalette, module_id: &str, label: &str, is_natal: bool) -> gpui::Div {
|
||||
let border = if is_natal {
|
||||
theme.border
|
||||
} else {
|
||||
match module_id {
|
||||
"transit" | "synastry" | "planetary_return" => palette.angle_highlight,
|
||||
"progression" | "solar_arc" => palette.house_cusp,
|
||||
_ => theme.border,
|
||||
}
|
||||
};
|
||||
div()
|
||||
.px(px(8.0))
|
||||
.py(px(2.0))
|
||||
.rounded(px(10.0))
|
||||
.bg(theme.bg_panel_alt.clone())
|
||||
.border_1()
|
||||
.border_color(border)
|
||||
.text_size(px(10.0))
|
||||
.text_color(theme.fg_text)
|
||||
.child(SharedString::from(label.to_string()))
|
||||
}
|
||||
|
||||
fn format_offset(minutes: i64) -> String {
|
||||
if minutes == 0 {
|
||||
return "⏱ ahora".to_string();
|
||||
|
||||
Reference in New Issue
Block a user