feat(tahuantinsuyu): UX pass — splitter, light wheel, scroll, zoom/pan, dock lateral

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>
This commit is contained in:
sergio
2026-05-18 15:10:16 +00:00
parent d2b6b8b12e
commit e09207b152
5 changed files with 633 additions and 147 deletions
@@ -194,16 +194,24 @@ impl AstroPalette {
south_node: hsla(35.0 / 360.0, 0.20, 0.30, 1.0),
lilith: hsla(310.0 / 360.0, 0.50, 0.30, 1.0),
conjunction: hsla(45.0 / 360.0, 0.65, 0.40, 0.85),
sextile: hsla(195.0 / 360.0, 0.60, 0.38, 0.75),
square: hsla(8.0 / 360.0, 0.75, 0.40, 0.85),
trine: hsla(140.0 / 360.0, 0.55, 0.35, 0.80),
opposition: hsla(280.0 / 360.0, 0.55, 0.42, 0.85),
minor_aspect: hsla(220.0 / 360.0, 0.20, 0.45, 0.55),
// Aspectos en light: alpha alta y luminancia media-baja para
// que las líneas tengan presencia contra fondo claro. En dark
// las alphas pueden ser más bajas porque el contraste contra
// el fondo oscuro ya las hace destacar.
conjunction: hsla(45.0 / 360.0, 0.70, 0.38, 0.95),
sextile: hsla(195.0 / 360.0, 0.65, 0.36, 0.90),
square: hsla(8.0 / 360.0, 0.80, 0.38, 0.95),
trine: hsla(140.0 / 360.0, 0.60, 0.32, 0.92),
opposition: hsla(280.0 / 360.0, 0.60, 0.40, 0.95),
minor_aspect: hsla(220.0 / 360.0, 0.30, 0.38, 0.75),
dial_ring: hsla(40.0 / 360.0, 0.18, 0.32, 0.90),
house_cusp: hsla(40.0 / 360.0, 0.10, 0.45, 0.50),
angle_highlight: hsla(45.0 / 360.0, 0.85, 0.40, 1.0),
// dial_ring: luminancia baja (oscuro sobre blanco) para que
// el anillo de signos tenga peso. house_cusp: subimos alpha
// y bajamos luminancia para que las cúspides no se laven en
// un beige translúcido.
dial_ring: hsla(40.0 / 360.0, 0.20, 0.28, 0.95),
house_cusp: hsla(40.0 / 360.0, 0.15, 0.32, 0.80),
angle_highlight: hsla(38.0 / 360.0, 0.90, 0.38, 1.0),
}
}