Segunda tanda de UX a partir de feedback de uso real:
- Zoom/pan reasignados: wheel = zoom puro (sin modifier). LMB drag
fuera del anillo de signos = pan; sobre el anillo = jog-dial
(rectificación). MMB sigue como pan secundario. Tecla `0`
resetea zoom + pan.
- Planetas legibles: el "dot rellenado" se reduce a 3 px (solo
marca el grado exacto). Encima va `planet_glyph` con disco-halo
del bg_panel y border del color del planeta — el glyph unicode
astronómico (☉☽☿♀♂♃♄♅♆♇) ahora se lee contra cualquier fondo.
- Aspectos hover-highlight: al hovear un planeta, sus líneas se
mantienen al 100 % y el resto cae a 18 %. Resuelve el "¿quién
contra quién?" sin desordenar la rueda.
- Ascensionales: cruz completa ASC-DESC + MC-IC (4 radios) con
α=0.55. Labels ASC/MC/DESC/IC como pills con bg-halo y border
`angle_highlight`, font 11 — antes eran texto chico que se
fundía con el dial.
- Universo: el wheel pierde su bg de cuadrado (que cortaba contra
el panel). El root del canvas pinta un starfield sutil ~130
puntos deterministas (xorshift32 con seed fija, sin parpadeo
entre frames). Solo activo en themes dark — sobre fondos claros
generaría ruido.
- Estilo 3D anillos: `stroke_circle_3d` (highlight +luma + base +
shadow -luma) reemplaza al stroke plano en sign_outer, sign_inner
y el outer ring. Más `paint_dial_bevel` con 10 strokes finos en
bell curve entre sign_inner y sign_outer — simula gradient radial
que gpui canvas no soporta nativo.
- Theme `Print Color`: papel crema, paleta astro con luminancia
0.26-0.34 y saturación alta, sin glow ni gradients.
- Theme `Print B&W`: monocromático sobre blanco puro. Aspectos
diferenciados por dash pattern en lugar de color:
conjunction/opposition sólidos, square dash medio, trine dash
largo, sextile dotted, minors dotted finísimo. `paint_segment`
con `dash: Option<(on,off)>` para implementar dashes (gpui
canvas no tiene stroke dash nativo).
Todos los tests siguen verdes (6 shell + 5 yahweh-theme +
2 tahuantinsuyu-theme).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Seis fixes derivados de testing real, ordenados por costo:
- Splitter (yahweh-widget-splitter): `flex-basis: 0` por item para que
el ratio flex-grow se respete sin importar el min-content de los
hijos. Sin esto, al cambiar el canvas de Empty→Wheel (WHEEL_SIZE
fijo de 580px) la suma de basis excedía el contenedor y flexbox
abandonaba el ratio 1:4, aplastando el tree a 0px (síntoma
reportado: "el tree desaparece al seleccionar carta"). También se
amplió la hit-zone del divider de 4px a 12px manteniendo una franja
visual de 4px centrada — la zona de pointer-capture y cursor es
ahora mucho más generosa, el visual sigue fino.
- Light mode wheel (tahuantinsuyu-canvas + tahuantinsuyu-theme): el
gradient del fondo del wheel pasa de alphas 0.06/0.03 (invisibles
contra fondo claro) a 0.18/0.10 cuando el theme es light. Cusps y
aspectos secundarios del light palette bajan luminancia y suben
alpha para no lavarse contra blanco.
- Panel scroll (tahuantinsuyu-panel): body del control panel agrega
`flex_grow + min_h(0) + overflow_y_scroll` para que cuando los
controles no caben aparezca scroll vertical en lugar de cortarse.
- Canvas zoom + pan (tahuantinsuyu-canvas): nuevo estado
view_scale / view_pan_x / view_pan_y. Ctrl+wheel zoomea
multiplicativo (clamp 0.5..3.0); wheel solo paneja. MMB drag para
pan libre. Hotkey `0` resetea zoom+pan. Hit-tests del jog-dial y
hover derivan ahora el `r_outer` del width actual del canvas, así
se autoescalan con el zoom.
- Panel dock lateral (shell.rs): nuevo `PanelDock { Bottom, Right,
Left }` configurable desde 3 botones en el header (◧ ▭ ◨). Bottom
mantiene el layout histórico (tree+canvas / panel); las variantes
laterales colapsan los splitters anidados en uno solo horizontal
de 3 columnas. El dock se persiste en `layout.panel_dock` y cada
layout guarda sus flex en una key distinta para no pisarse.
`load_split_flex_n` / `save_split_flex` generalizados a N hijos.
Tests: 6 pasan (incluye nuevo roundtrip de PanelDock y N-flex).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Módulo nuevo `modules/tahuantinsuyu/` con 9 crates reusables + app
`apps/tahuantinsuyu` ejecutable que abre la ventana del explorador y
coordina los widgets:
- tahuantinsuyu-card: Card Brahman + spawn_sidecar (flows
chart-request/chart-result).
- tahuantinsuyu-model: tipos agnósticos (Group/Contact/Chart,
StoredBirthData, StoredChartConfig, ChartKind, TreeSelection).
- tahuantinsuyu-store: persistencia SQLite (rusqlite) con migración v1,
CRUD por entidad y descenso recursivo `charts_under_group`.
- tahuantinsuyu-engine: bridge agnóstico al canvas vía `RenderModel`
(Layer/Glyph/Geometry). Feature `eternal-bridge` (off por default)
reservada para enchufar eternal-astrology desde ~/eternal.
- tahuantinsuyu-modules: registry de módulos pluggables (Module trait
+ Control schema) con `NatalModule` placeholder.
- tahuantinsuyu-theme: AstroPalette (elementos / modos / planetas /
aspectos) con variantes dark + light sobre yahweh-theme.
- tahuantinsuyu-canvas: widget GPUI con CanvasState (Empty / Wheel /
Thumbnails). Render placeholder hasta cablear la rueda real.
- tahuantinsuyu-tree: explorador izquierdo sobre yahweh-widget-tree,
prefijos g:/c:/h: para Group/Contact/Chart.
- tahuantinsuyu-panel: control panel inferior que lee Controls de los
módulos del registry y los pinta.
- apps/tahuantinsuyu: binario `tahuantinsuyu` (launch_app-style) con
Shell coordinador (tree↔canvas↔panel), DB en $XDG_DATA_HOME.
Workspace Cargo.toml actualizado con los 10 miembros. `cargo check`
verde, tests unitarios verdes (model/store/engine/modules/theme/card).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>