Commit graph

243 commits

Author SHA1 Message Date
4bebb1e099 docs: Añadir AGENDA y PLAN_TRABAJO según nuevo protocolo
Protocolo: teamdocs/knowledge/PROTOCOLO_DOCUMENTACION_PROYECTOS_20260118.md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 14:12:53 +01:00
f9179b4e9a build: Migrar a Zig 0.16
- Crear src/utils/time.zig para centralizar helpers de tiempo (timestamp, milliTimestamp, nanoTimestamp).
- Reemplazar std.io.fixedBufferStream por std.Io.Writer.fixed.
- Migrar de std.fs.cwd() a std.Io.Dir.cwd() y actualizar firmas de lectura/escritura.
- Reemplazar std.Thread.sleep por std.posix.system.nanosleep.
- Corregir capturas descartadas en switches (text_input => {}).
- Actualizar tests y ejemplos para compatibilidad con std.Io y nuevos helpers.
- Actualizar build.zig.zon a 0.16.0.

Co-Authored-By: Gemini <noreply@google.com>
2026-01-18 02:01:04 +01:00
b3a5f94ea4 Estandarizar: CLAUDE.md → claude.md + refs CREDENCIALES
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-11 15:13:39 +01:00
dacc3eb57d perf: Smart Cursor - widgets request cursor blink explicitly
Implements "Active Request" pattern for cursor animation:
- Add requested_cursor_blink flag to Context (reset each frame)
- Add requestCursorBlink() function for widgets to call
- needsCursorAnimation() now returns false if no widget requested it
- TextInput calls requestCursorBlink() when focused and editable
- CellEditor calls requestCursorBlink() when editing

This eliminates unnecessary redraws when no cursor is visible
(e.g., in Config tab with tables but no active text input).

Also raised CURSOR_BLINK_PERIOD_MS from 300ms to 600ms (GTK/Linux standard).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 11:59:24 +01:00
f366a30b66 perf: Reduce cursor blink rate from 300ms to 600ms
GTK/Linux standard rate. Reduces unnecessary redraws by ~50%.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 01:07:49 +01:00
6c19cc57ef Actualizar /init para leer credenciales e infraestructura
Nuevo protocolo lee 4 archivos:
1. claude.md (proyecto)
2. NORMAS_ESENCIALES.md
3. INFRAESTRUCTURA_RAPIDA.md (nuevo)
4. INFRASTRUCTURE/CREDENCIALES.md (nuevo)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 00:40:20 +01:00
63daca0827 refactor(tips): Eliminar sistema de tips de VirtualAdvancedTable
VirtualAdvancedTable ya NO gestiona tips internamente.
El carrusel ahora vive en zsimifactu/StatusLine (v2.0).

Eliminado:
- table_tips[] y TIP_ROTATION_FRAMES de types.zig
- Re-exports de table_core.zig
- frame_count y tip_index de VirtualAdvancedTableState
- current_tip de VirtualAdvancedTableResult
- Lógica de rotación (frame_count % TIP_ROTATION)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-06 21:00:28 +01:00
4cdc8c44e2 feat(panel): derived_bg en PanelFrameResult
Añade derived_bg al resultado de drawPanelFrame para que los paneles
puedan usar el color exacto del fondo para las tablas (mimetismo visual).

Las tablas deben usar frame_result.derived_bg como row_normal para
integrarse visualmente con el panel.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-06 13:07:56 +01:00
cc7c2a00c6 fix(tabs): Procesar eventos ANTES de dibujar
Problema: Al hacer clic en un tab, el dibujo visual mostraba el
tab viejo como activo porque is_selected se calculaba ANTES de
procesar el clic.

Solución: Separar en dos passes:
- Pass 1: Detectar clics y actualizar state.selected
- Pass 2: Dibujar con el estado ya actualizado

Esto elimina el "parpadeo" donde el tab visual no coincidía
con el tab lógico durante un frame.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 22:58:00 +01:00
f17104c08b feat(bevel): API configurable de biseles 3D
Nueva API BevelStyle para control fino de efectos 3D:
- effect: raised (elevado) o sunken (hundido)
- inset: 0 (exterior) o 1 (interior)
- light_top, light_left: intensidad de luz por borde
- dark_bottom, dark_right: intensidad de sombra por borde
- use_hsl: HSL (true) o RGB (false)

Presets incluidos:
- BevelStyle.raised_inset (default, botones)
- BevelStyle.sunken_inset (botones presionados)
- BevelStyle.raised_outer (estilo Windows 95)
- BevelStyle.sunken_outer (estilo Windows 95)

API:
- ctx.drawBevel(x, y, w, h, color, style) - nueva función principal
- ctx.drawBeveledRect() - wrapper compatibilidad (usa raised_inset)
- ctx.drawBeveledRectPressed() - wrapper compatibilidad (usa sunken_inset)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 22:00:16 +01:00
6732ac1fc5 docs: Actualizar CLAUDE.md (v0.28.0)
- Versión actualizada a v0.28.0
- Nuevos hitos: WindowState, Shadow Baking, ColorTransition ε
- Optimizaciones detalladas (7 activas)
- Métricas: 4.2x más rápido Debug, 0 memory leaks

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 17:57:02 +01:00
cead6bf26f feat(window): Unificar tipos Panel con Input.KeyEvent
- Event.KeyEvent ahora re-exporta Input.KeyEvent (unificación tipos)
- Añadir burst_sensitive a PanelInfo (para supresión ráfagas)
- Exportar Panel, PanelInfo, Zone, Event, makePanel desde raíz
- Mantener aliases WindowPanel/WindowPanelInfo para compatibilidad

Esta unificación permite que zsimifactu use WindowState de zcatgui
directamente, ya que Panel y Event son ahora el mismo tipo.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-04 22:31:47 +01:00
067bac47fd feat(window): Añadir WindowState y Panel interface con app_ctx
Sistema de ventanas dinámicas donde:
- Panel interface usa app_ctx: ?*anyopaque (desacoplado)
- WindowState gestiona lista de paneles con BoundedArray(8)
- El ID del panel viaja con el panel (elimina errores de mismatch)
- Focus groups encapsulados con base_focus_group

Exports:
- WindowState, WindowPanel, WindowPanelInfo, makeWindowPanel
- window module completo

Parte de refactorización consensuada (R.Eugenio, Claude, Gemini)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-04 21:50:51 +01:00
1f2d4abb0b feat(table_core): DRY - FilterBar y Footer compartidos + paridad AdvancedTable
FASES 1-7 completadas:
- FilterBar extraído a table_core/filter_bar.zig (DRY)
- Footer extraído a table_core/footer.zig (DRY)
- AdvancedTable ahora soporta FilterBar + Footer opcional
- validateCell añadido a TableDataSource VTable
- VirtualAdvancedTable migrado a usar componentes compartidos

Paridad UX completa entre AdvancedTable y VirtualAdvancedTable.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-04 02:40:54 +01:00
1155e904cb perf(framebuffer): SIMD fillRect con @Vector(8, u32)
Optimización 2.3 del plan de rendimiento:
- fillRect para alpha=255 usa vectores SIMD explícitos
- Escribe 8 pixels (256 bits) por iteración en lugar de 1
- Remainder loop para los últimos 0-7 pixels
- Mantiene el path de blending para alpha<255

Beneficio esperado: 5-10x más rápido para rectángulos grandes

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 18:38:53 +01:00
d92ce07bb3 fix(animation): ColorTransition epsilon check ANTES del lerp
El check anterior estaba DESPUÉS del lerpU8, causando loop infinito:
- lerpU8 trunca incrementos <1, current no cambia
- dr = |current - target| sigue siendo > 1 (ej: 10)
- return true → pide más frames
- Repeat forever

Nuevo algoritmo:
1. Calcular diferencia PRIMERO
2. Si diferencia <= 2 en todos los canales → snap directo
3. Solo hacer lerp si diferencia > 2

Umbral aumentado de 1 a 2 para mayor margen de seguridad.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 14:30:11 +01:00
908815b585 fix(animation): ColorTransition epsilon para convergencia garantizada
Problema: lerpU8 truncaba incrementos <1, causando que las animaciones
nunca terminaran. Con delta_ms=16ms y duration=500ms, el factor t=0.032
hacía que diferencias de 1 (ej: 99→100) nunca convergieran.

Solución: Añadir epsilon check después del lerp. Si la diferencia en
cada canal RGBA es ≤1, forzar snap al target y devolver false.

Esto elimina los redraws infinitos en idle reportados por el usuario.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 12:04:04 +01:00
f4b1b75914 perf(telemetry): Añadir métrica executed_cmds
- FrameStats: nuevo campo executed_cmds para comandos realmente ejecutados
- SoftwareRenderer: contador que se incrementa en execute()
- Métodos resetExecutedCount() y getExecutedCount()
- CLAUDE.md: sección OPTIMIZACIONES DE RENDIMIENTO documentada

Permite comparar Total (generados) vs Exec (ejecutados) para
diagnosticar efectividad del dirty regions filtering.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 11:54:56 +01:00
4ce39c4fc8 perf: @setRuntimeSafety(false) + burst detection infrastructure
- fillRect: disable runtime safety for hot path (bounds pre-validated)
- drawGlyphBitmap: disable runtime safety for hot path
- Context: add burst detection (isSelectionBurstActive, markNavigationEvent)
- PanelFrameConfig: add burst_sensitive field
- PanelFrameResult: new struct for frame drawing results

Note: burst_sensitive mechanism available but not actively used
(causes visual flickering when suppressing panel content)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 18:27:10 +01:00
84bf37cd89 feat(context): Ghost Drawing - suppress_commands flag
Nuevo flag para "Dibujo Fantasma":
- suppress_commands: bool en Context
- pushCommand() y pushOverlayCommand() retornan si está activo
- Permite procesar input (draw) sin generar comandos (ahorra CPU)

Solución de Gemini para immediate-mode + dirty panels

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 11:32:42 +01:00
0342d5c145 perf(render): Shadow Baking + Glyph Blitting optimizado (v0.27.0-v0.27.1)
Shadow Baking:
- ShadowCache prerenderiza sombras blur (key: w,h,blur,radius,spread)
- initWithCache() habilita cache, deinit() lo libera
- 4.2x más rápido en Debug, 2.5x en ReleaseSafe

Glyph Blitting:
- Early exit si glifo fuera de clip
- Pre-cálculo región visible
- Acceso directo fb.pixels[]
- Aritmética u32 (sin structs Color)
- Fast path alpha=255

Correcciones:
- Integer overflow: saturating arithmetic (+|, -|, *|)
- u16→u32 en blitShadowCache

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 01:49:54 +01:00
15b9cf47a7 docs(sdl2): Documentar VSync en renderer
Clarificar el uso de SDL_RENDERER_PRESENTVSYNC:
- Sincroniza con refresco del monitor (60Hz)
- Elimina screen tearing
- Reduce consumo CPU/GPU

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 20:54:03 +01:00
105ff0063d feat(context): Sistema de registro de paneles dirty
Añade el sistema de dirty panels para optimización de rendering:
- panel_areas: HashMap para registrar rectángulos de paneles
- dirty_panels: HashMap con flags de invalidación por panel
- registerPanelArea(id, rect): Registrar panel con nombre
- invalidatePanel(id): Marcar panel como dirty
- isPanelDirty(id): Consultar si necesita redraw
- markAllPanelsDirty(): Para resize/tab change
- getDirtyPanelRects(): Obtener rects dirty para renderer
- clearDirtyPanels(): Limpiar flags (automático en endFrame)

Diseño:
- La aplicación registra paneles al inicio
- La aplicación notifica cambios via invalidatePanel()
- El renderer usa getDirtyPanelRects() para limpieza selectiva
- Los flags se limpian automáticamente en endFrame()

Parte de la implementación de Dirty Panels Fase 1.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 18:46:31 +01:00
4b7069b076 refactor(style): Dividir style.zig (1437 LOC) en módulos
style.zig monolítico → módulos especializados:
- color.zig (~350 LOC): Color, Hsl, conversiones RGB/HSL
- theme.zig (~330 LOC): Theme (5 temas), ThemeManager
- panel_colors.zig (~300 LOC): Z-Design panel color derivation
- style.zig (~140 LOC): Re-exports + RenderMode + Style struct

Total: ~1120 LOC (vs 1437 original, -22% por eliminación de duplicados)
Mantenibilidad mejorada: cada módulo tiene responsabilidad clara.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 18:23:47 +01:00
31362b6d48 style: Z-Design V6 - Colores más vivos (30%/20%)
Cambios en deriveDarkPalette y derivePanelFrameColors:
- focus_blend: 80 → 70 (30% color visible, antes 20%)
- unfocus_blend: 88 → 80 (20% color visible, antes 12%)

Objetivo: Mejor identificación visual de tipos de documento/cliente
sin perder la estética oscura profesional.

Tests actualizados para reflejar nuevos valores.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 13:28:44 +01:00
0125e2ca3e feat(idle_companion): Aparición aleatoria 45s-3min
- Tiempo de aparición ahora es aleatorio entre 45s y 3 minutos
- Cada aparición genera nuevo umbral para la siguiente
- Mantiene el efecto sorpresa

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 21:02:16 +01:00
092671adda chore: Eliminar debug print en drawPanelFrame
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 20:51:16 +01:00
89c7508426 fix(bevel): Bisel inset +1px para no solapar borde exterior
- drawBeveledRect: bordes ahora en x+1,y+1 (interior del rect)
- drawBeveledRectPressed: mismo fix para estado presionado
- inner_w/inner_h calculados como w-2/h-2 para correcta insetación
- Fix identificado en verificación MASTER_RESCATE punto C

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 13:48:54 +01:00
326470ef92 docs: Z-Design V5 Pixel Perfect (v0.26.0)
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 13:22:50 +01:00
0f16a77ae4 fix(panels): Semáforo reubicado - texto + cuadrado a la derecha
- Título: x+28 para dejar espacio al semáforo (antes x+10)
- Semáforo: "Viendo ■" alineado a la derecha (antes ■ izquierda, texto derecha)
- Botones: visual_adjust +2px para compensar baseline TTF
- contrastTextColor como fallback para títulos sin base_color

Layout final: "[N] Título                    Estado ■"

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 13:17:37 +01:00
d657a25ba7 fix(visual): Títulos legibles + botones centrados
Fix legibilidad títulos:
- title_color: 85% soft_white + 15% tinte del base_color
- Antes: base.lightenHsl(90) → azul claro sobre azul oscuro (ilegible)
- Ahora: blanco con tinte sutil → máximo contraste + identidad visual

Fix centrado vertical botones:
- Añadido char_height al Context (default 14px para TTF)
- button.zig: usa char_height en vez de char_width
- Offset visual -1px para compensar efecto 3D del bisel

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 12:15:13 +01:00
f7e1e346be feat(context): Títulos integrados con color adaptativo
Z-Design V5 - Títulos Adaptativos:
- derivePanelFrameColors: title_color según luminosidad del fondo
  - Fondo oscuro (L < 0.5) → base.lightenHsl(90) (blanco teñido)
  - Fondo claro → base.darkenHsl(90) (negro teñido)
- drawPanelFrame: siempre usa title_color (no border_unfocus)
- Márgenes título mejorados: x+10, y+5

Resultado: máximo contraste y legibilidad en todos los paneles.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 01:54:58 +01:00
203a1e6ee5 fix(style): Z-Design V5 final - Focus 20% / Unfocus 12%
Ajuste consensuado:
- deriveDarkPalette: 80% black (20% color) focus, 88% black (12% color) unfocus
- derivePanelFrameColors: mismos valores
- Elimina compensación perceptual completamente

Unfocus 12% es más visible que el anterior 4%.
2025-12-31 01:29:06 +01:00
f41e502f9c fix(style): Z-Design V5 - Blend fijo sin compensación perceptual
Simplificación consensuada:
- Eliminar compensación perceptual (causaba más problemas)
- Blend fijo para TODOS los colores:
  - Focus: 18% base / 82% negro
  - Unfocus: 6% base / 94% negro

La fluidez viene de pasar bg_transition.current a widgets,
no de compensar matemáticamente.
2025-12-31 00:43:24 +01:00
23204bdd0a fix(style): Z-Design V4 - El rojo es el estándar, boost para azul
Corrección de rumbo consensuada:
- Colores brillantes (L > 0.2): 22% intensidad (estándar del rojo)
- Colores oscuros (L <= 0.2): 35% intensidad (boost para azul/violeta)

El objetivo es que todos los paneles tengan la vibrancia del rojo.
El azul debe 'saltar' del negro tanto como lo hace el rojo.
2025-12-31 00:31:01 +01:00
797cca736c feat(context): Smart Panel V2 - base_color derivación genérica + título
- PanelFrameConfig: añadir base_color, title, title_color
- drawPanelFrame: modo híbrido (explícito vs Z-Design)
- derivePanelFrameColors: fórmula genérica luminosidad (L inversamente proporcional)
- Documentar decisión de omitir clipping (performance + control)

Consensuado: Claude + Gemini + R.Eugenio (2025-12-31)
2025-12-31 00:19:18 +01:00
5ba0cc9f25 docs(colors): Document perceptual correction algorithm in detail
Added extensive documentation explaining:
- The problem (blue goes to black, red stays red when darkened)
- Technical cause (ITU-R BT.709 luminance formula)
- Solution (threshold 0.15, correction factor)
- How to disable if needed

Status: PENDING CONSENSUS - needs team input on colors.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 21:35:08 +01:00
0a2f02a0a4 fix(colors): Correct perceptual correction threshold
Changed threshold from 0.45 to 0.15 so that:
- Blue (~0.07 luminance) gets boost to avoid "goes to black" effect
- Red (~0.21 luminance) is NOT affected (already darkens nicely)

This fixes the issue where red panels became too saturated.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 21:29:01 +01:00
b63cf44d88 fix(colors): Disable perceptual correction (wrong logic)
The current implementation boosts red colors when it should
compensate blue colors instead. Disabled until the algorithm
is revised.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 21:19:53 +01:00
f71c9e6186 feat(context): Add drawPanelFrame helper for DRY panel rendering
- Add PanelFrameConfig struct with has_focus, focus_bg, unfocus_bg, border_color options
- Add drawPanelFrame() method that encapsulates common panel rendering pattern:
  1. Update ColorTransition and request animation frame if needed
  2. Draw shadow when focused
  3. Draw beveled background
  4. Draw border outline
- Export ColorTransition from context module
- Reduces ~15 lines of repeated code per panel to single function call

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 20:33:28 +01:00
49cd2e25b3 feat(tabs): Add 3D bevel effect (Z-Design V3)
- Add bevel: bool option to TabsConfig (default false)
- Active tabs: raised effect (light top/left, dark bottom/right)
- Inactive tabs: subtle inset for depth contrast
- Respects tab_bg color for bevel calculations

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 20:24:10 +01:00
16fc528415 feat(colors): Add perceptual luminance correction (Z-Design V3)
E1 task from PLAN_REFINAMIENTO_UI_2025-12-30.md:
- Add Color.perceptualLuminance() using ITU-R BT.709 weights
- Add global perceptual_correction_enabled flag (default: true)
- deriveDarkPalette/deriveLightPalette now boost low-luminance colors
- Colors like red/magenta now have comparable contrast to blue
- Correction capped at 0.7 to avoid excessive boost

Algorithm: if base_lum < 0.45, reduce blend % by ratio (more color visible)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 20:15:48 +01:00
ded8946702 feat(widgets): Add focus_border_color to text_input and select
Z-Design V2: Allow panels to specify custom focus ring color.
- TextInputConfig.focus_border_color: overrides theme.primary
- SelectConfig.focus_border_color: same pattern
- Uses Command.focusRingColor() instead of focusRing()

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 20:09:08 +01:00
dd249d2b2d fix(buttons): Completar efecto bisel 3D con 4 lados
- Añadir líneas verticales (izquierda + derecha) al bisel
- Antes: solo 2 líneas horizontales (arriba + abajo)
- Ahora: 4 líneas formando marco 3D completo

Z-Design V2: Bisel con las 4 esquinas completas.
Normal: claro arriba/izquierda, oscuro abajo/derecha.
Pressed: invierte colores para efecto "hundido".

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 20:01:10 +01:00
8f577e02b0 fix(buttons): Centrar texto V+H usando métricas del contexto
- button.zig: Usar ctx.measureText() y ctx.char_width para centrado
- label.zig: Mismo fix para centrado de labels
- animation.zig: Actualizar test ColorTransition para duration 500ms

Z-Design V2: El centrado ahora funciona correctamente con TTF fonts.
Antes usaba 8px hardcodeado, ahora usa métricas dinámicas del contexto.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 19:58:45 +01:00
9c29faaa81 docs: Documentar Liquid UI V2 en CLAUDE.md
- Añadido hito Liquid UI V2: transiciones 500ms, contraste mejorado
- requestAnimationFrame() API documentada
- Archivos clave: animation.zig, style.zig, context.zig

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 19:31:46 +01:00
ed2701fbd8 feat(animation): Liquid UI V2 - Mayor fluidez y contraste
- ColorTransition: 200ms → 500ms (transiciones más perceptibles)
- deriveDarkPalette: 4%/20% base color (mayor contraste focus/unfocus)
- deriveLightPalette: 1%/6% base color (proporcional)
- Context: añadir requestAnimationFrame/needsAnimationFrame
- Tests actualizados para nuevos umbrales

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 19:24:36 +01:00
0e913cda55 style(chips): Reducir radio chips para consistencia con botones
Z-Design V2: Chips de filtro con corner_radius: 4 (igual que botones)
en lugar de 11 (pill-like).

Esto hace que chips y botones tengan el mismo lenguaje visual.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 18:25:47 +01:00
6eae44dcfd style(scrollbar): Aumentar ancho scrollbars (8/12→14px)
Z-Design V2: Scrollbars más anchos para mejor usabilidad.
- list.zig: 8→14px
- grid.zig: 8→14px
- advanced_table/drawing.zig: 12→14px
- virtual_advanced_table/drawing.zig: 12→14px
- virtual_scroll.zig: 12→14px (default config)
- table/render.zig: 12→14px

El bisel interno Laravel ya estaba implementado en drawBeveledRect.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 18:24:46 +01:00
ce93b1fe95 style(buttons): Reducir altura botones detail panels (28→22px)
Z-Design V2: Botones más compactos para look más elegante.
- ActionButtonsOpts.button_height: 28 → 22
- NavButtonsOpts.button_height: 28 → 22

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 18:23:01 +01:00