feat(gioser/web): fix mobile swipe, taskbar agnóstica, trazos zodiacales
Mobile drag fix (vista-web):
- pointermove listener ahora con `AddEventListenerOptions { passive: false }`.
Sin esto, en navegadores móviles `preventDefault()` es no-op y el browser
se traga el gesto horizontal como pan/scroll antes de que JS pueda
detectar la dirección y capturar el pointer.
- CSS: `.deck-strip` y `.deck-strip *` y `.deck-page` con
`touch-action: pan-y`. El touch-action del target inmediato es lo que
el browser consulta; sin esto, sobre un <p> dentro del strip el browser
asume `auto` y reclama horizontal.
Taskbar agnóstica (barra-web):
- Nuevo crate `crates/modules/barra/barra-web` que maneja sólo el LIST
dinámico de tareas; el resto del layout (home, brand, credits) es del
host. Misma filosofía que vista-web: separar lo reusable.
- API: Task::new(id, label).active() builder; TaskList::mount(ul) +
set_tasks/on_click/task_center. Click delegado, callback recibe
(id, cx, cy) en CSS pixels para origin de animaciones.
- Sanitiza IDs a [a-zA-Z0-9_-] y HTML-escapa labels.
- 3 tests unitarios.
- gioser-web refactoreado para consumir TaskList: sync_taskbar arma
Vec<Task> y delega; on_click del taskbar dispara minimize/restore_from_tab
según estado. install_taskbar reducido a sólo home buttons.
Trazos zodiacales (gioser-shaders + canvas-web):
- 12 líneas radiales muy sutiles entre la chacana y el aro principal, una
por signo, con colores significativos:
Aries→fuego rojo, Tauro→tierra verde, Géminis→aire amarillo,
Cáncer→agua plata, Leo→fuego dorado, Virgo→tierra marrón,
Libra→aire rosa, Escorpio→agua rojo profundo, Sagitario→fuego púrpura,
Capricornio→tierra verde oscuro, Acuario→aire celeste, Piscis→agua
verde mar.
- Aries empieza en el norte, giran en sentido horario (rueda zodiacal
clásica). Banda radial r∈[1.05*L, 0.96*ringR_main], gauss angular
con σ=0.0042 rad (~0.24° de ancho), multiplier 0.55 → apenas visible.
- Uniform `vec3 u_zodiac[12]` subido como array plano de 36 floats vía
uniform3fv. Constante ZODIAC_COLORS expuesta en canvas-web por si otros
callers la quieren.
Workspace verde + 21 tests (geom 6 + palette 4 + physics 3 + pluma-md 5
+ barra-web 3).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -190,6 +190,7 @@ uniform vec3 u_aire_color;
|
||||
uniform vec3 u_fuego_color;
|
||||
uniform vec3 u_tierra_color;
|
||||
uniform vec3 u_agua_color;
|
||||
uniform vec3 u_zodiac[12];
|
||||
uniform float u_sun_pulse;
|
||||
|
||||
const float PI = 3.14159265;
|
||||
@@ -361,6 +362,43 @@ void main() {
|
||||
particles += element_particles(p, vec2(0.0, -L), vec2(0.0, -1.0), u_tierra_color, 2, 3.11);
|
||||
particles += element_particles(p, vec2(-L, 0.0), vec2(-1.0, 0.0), u_agua_color, 3, 5.97);
|
||||
|
||||
// === TRAZOS ZODIACALES ===
|
||||
// 12 líneas radiales muy sutiles entre la chacana y el aro principal,
|
||||
// una por signo, con sus colores significativos (Aries=fuego rojo,
|
||||
// Tauro=tierra verde, Géminis=aire amarillo, Cáncer=agua plata, ...).
|
||||
// Aries arranca en el norte y giran en sentido horario (rueda zodiacal
|
||||
// clásica).
|
||||
vec3 zodiac = vec3(0.0);
|
||||
{
|
||||
float seg = 2.0 * PI / 12.0;
|
||||
// delta = ángulo medido desde el norte, en sentido horario, en [0, 2π).
|
||||
float delta = (PI * 0.5) - ang;
|
||||
delta = mod(delta + 8.0 * PI, 2.0 * PI);
|
||||
// Índice del signo más cercano.
|
||||
float k_round = mod(floor(delta / seg + 0.5), 12.0);
|
||||
int k = int(k_round);
|
||||
// Distancia angular al centro del segmento de ese signo.
|
||||
float center_delta = k_round * seg;
|
||||
float ang_diff = delta - center_delta;
|
||||
// Wrap a (-π, π].
|
||||
if (ang_diff > PI) ang_diff -= 2.0 * PI;
|
||||
if (ang_diff < -PI) ang_diff += 2.0 * PI;
|
||||
float ang_dist = abs(ang_diff);
|
||||
|
||||
// Línea fina, gaussiana.
|
||||
float lineW = 0.0042;
|
||||
float line = exp(-(ang_dist * ang_dist) / (2.0 * lineW * lineW));
|
||||
|
||||
// Banda radial: arranca un poco fuera de la punta de la chacana y
|
||||
// termina antes del aro principal.
|
||||
float r_inner = u_arm_extent * 1.05;
|
||||
float r_outer = ringR_main * 0.96;
|
||||
float band = smoothstep(r_inner, r_inner + 0.035, r)
|
||||
* (1.0 - smoothstep(r_outer - 0.035, r_outer, r));
|
||||
|
||||
zodiac = u_zodiac[k] * line * band;
|
||||
}
|
||||
|
||||
// === COMPOSICIÓN ===
|
||||
vec3 col = vec3(0.0);
|
||||
// Sol detrás (clip a interior).
|
||||
@@ -375,10 +413,13 @@ void main() {
|
||||
col += u_rim_color * ring_inner * 1.05;
|
||||
col += u_line_color * dots * 1.85;
|
||||
col += particles * 1.25;
|
||||
col += zodiac * 0.55; // muy sutil — apenas visible.
|
||||
|
||||
float zodiac_lum = zodiac.r + zodiac.g + zodiac.b;
|
||||
float alpha = clamp(
|
||||
halo * inside + line + glow + ring_main + ring_inner + dots + inside * 0.12
|
||||
+ (particles.r + particles.g + particles.b) * 0.5,
|
||||
+ (particles.r + particles.g + particles.b) * 0.5
|
||||
+ zodiac_lum * 0.3,
|
||||
0.0, 1.0);
|
||||
fragColor = vec4(col, alpha);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user