# Plan de Refactoring: table.zig **Fecha:** 2025-12-11 **Motivo:** Archivo de 1770 líneas, difícil de manejar en sesiones de edición ## Estado Actual ``` src/widgets/table.zig (~1770 líneas) ├── Tipos (Column, TableConfig, TableColors, SortDirection, etc.) ├── TableState (estado completo con ~50 campos) ├── TableResult (resultado de interacción) ├── Funciones de renderizado (drawHeaders, drawRows, drawScrollbar) ├── handleKeyboard (navegación, edición, búsqueda) ├── API pública (table, tableRect, tableEx) └── Tests ``` ## Estructura Propuesta ``` src/widgets/table/ ├── table.zig # Re-exports + API pública (table, tableRect, tableEx) ├── types.zig # Column, TableConfig, TableColors, SortDirection, RowState ├── state.zig # TableState, TableResult ├── keyboard.zig # handleKeyboard, startsWithIgnoreCase ├── render.zig # drawHeaders, drawRows, drawCell, drawScrollbar └── tests.zig # Todos los tests ``` ## Estimación de Líneas por Archivo | Archivo | Contenido | Líneas Est. | |---------|-----------|-------------| | types.zig | Enums, configs, column def | ~150 | | state.zig | TableState, TableResult | ~400 | | keyboard.zig | Input handling | ~250 | | render.zig | Drawing functions | ~500 | | table.zig | API pública + re-exports | ~200 | | tests.zig | Unit tests | ~250 | ## Orden de Extracción 1. **types.zig** - Sin dependencias internas 2. **state.zig** - Depende de types.zig 3. **keyboard.zig** - Depende de types.zig, state.zig 4. **render.zig** - Depende de types.zig, state.zig 5. **table.zig** - Orquesta todo, re-exporta API pública 6. **tests.zig** - Al final, importa todo ## Dependencias Externas (se mantienen) - `../core/context.zig` - Context - `../core/command.zig` - Command - `../core/layout.zig` - Layout, Rect - `../core/style.zig` - Style, Color - `../core/input.zig` - Input ## Compatibilidad La API pública NO cambia: ```zig const table = @import("widgets").table; // Sigue funcionando igual: table.table(ctx, &state, &columns, getCellData); table.tableRect(ctx, rect, &state, &columns, getCellData, onEdit, validate, config, colors); ``` ## Rollback Si hay problemas, el commit anterior tiene table.zig completo y funcional.