Tablas Sticky y Scroll Global (Design System Alpura)
Esta guía documenta la arquitectura de clases de utilidad globales Cero-Boilerplate (Zero Boilerplate) integradas en el sistema de diseño del tema global de Alpura (_general.scss).
Con estas clases, cualquier desarrollador puede implementar encabezados fijos (Sticky Header), columnas fijas (Sticky Columns) y filas resaltadas con error (.row-error) en tablas de Angular Material sin necesidad de escribir código CSS adicional en las hojas de estilo del componente (.scss).
📌 Resumen de Clases de Utilidad
| Clase CSS | Elemento HTML recomendado | Descripción |
|---|---|---|
table-containertable-scroll-container | <div class="table-container"> | Contenedor principal que provee bordes redondeados, borde sutil y scroll interno (max-height: 480px; overflow: auto;). |
sticky-header | <table mat-table class="sticky-header">o <tr mat-header-row class="sticky-header"> | Fija los encabezados de la tabla en la parte superior durante el scroll vertical (position: sticky; top: 0; z-index: 10;). |
sticky-column-rightsticky-actions | <th class="sticky-column-right"><td class="sticky-column-right"> | Fija la columna en el borde derecho durante el scroll horizontal (position: sticky; right: 0; z-index: 5;). Incluye una sombra sutil de separación. |
sticky-column-left | <th class="sticky-column-left"><td class="sticky-column-left"> | Fija la columna en el borde izquierdo durante el scroll horizontal (position: sticky; left: 0; z-index: 5;). Incluye sombra sutil derecha. |
row-error | <tr mat-row class="row-error"> | Aplica fondo rojo suave (var(--alp-state-error-soft)) a todas las celdas de la fila (incluyendo celdas sticky) y añade un borde izquierdo de 4px rojo (var(--alp-state-error)). |
💡 Ejemplos Prácticos de Código HTML
Ejemplo 1: Tabla con Encabezado Fijo (Sticky Header)
Envuelve la tabla en un <div class="table-container"> y añade la clase sticky-header a la fila del encabezado <tr mat-header-row>:
<div class="table-container">
<table mat-table [dataSource]="listado">
<!-- Columna ID -->
<ng-container matColumnDef="id">
<th mat-header-cell *matHeaderCellDef>ID</th>
<td mat-cell *matCellDef="let row">{{ row.id }}</td>
</ng-container>
<!-- Columna Nombre -->
<ng-container matColumnDef="nombre">
<th mat-header-cell *matHeaderCellDef>Nombre</th>
<td mat-cell *matCellDef="let row">{{ row.nombre }}</td>
</ng-container>
<!-- Filas de la Tabla -->
<tr mat-header-row *matHeaderRowDef="['id', 'nombre']" class="sticky-header"></tr>
<tr mat-row *matRowDef="let row; columns: ['id', 'nombre']"></tr>
</table>
</div>
Ejemplo 2: Encabezado Fijo y Columna de Acciones Fija a la Derecha
Añade class="sticky-column-right" tanto al <th mat-header-cell> como al <td mat-cell> de la columna de acciones:
<div class="table-container">
<table mat-table [dataSource]="ejecuciones">
<!-- Columna Código -->
<ng-container matColumnDef="codigo">
<th mat-header-cell *matHeaderCellDef>Código</th>
<td mat-cell *matCellDef="let row">{{ row.codigo }}</td>
</ng-container>
<!-- Columna Estado -->
<ng-container matColumnDef="estado">
<th mat-header-cell *matHeaderCellDef>Estado</th>
<td mat-cell *matCellDef="let row">{{ row.estado }}</td>
</ng-container>
<!-- Columna Acciones Fija (Sticky Right) -->
<ng-container matColumnDef="acciones">
<th mat-header-cell *matHeaderCellDef class="sticky-column-right">Acciones</th>
<td mat-cell *matCellDef="let row" class="sticky-column-right">
<button mat-icon-button (click)="onVerDetalle(row)">
<mat-icon>visibility</mat-icon>
</button>
</td>
</ng-container>
<!-- Filas de la Tabla -->
<tr mat-header-row *matHeaderRowDef="['codigo', 'estado', 'acciones']" class="sticky-header"></tr>
<tr mat-row *matRowDef="let row; columns: ['codigo', 'estado', 'acciones']"></tr>
</table>
</div>
Ejemplo 3: Fila con Estado de Error (.row-error) y Columna Fija
Aplica la clase row-error condicionalmente en la fila de datos <tr mat-row>. Todas las celdas, incluyendo la celda fija de acciones, tomarán el color de fondo rojo suave sin parches blancos:
<tr
mat-row
*matRowDef="let row; columns: displayedColumns"
[class.row-error]="row.tieneError"
></tr>
🛠️ Reglas Técnicas Integradas en el Tema
Las clases globales en _general.scss y src/styles.scss gestionan automáticamente las siguientes propiedades CSS:
-
Z-Index Jerárquico:
z-index: 10: Encabezados de tabla (.sticky-header).z-index: 5: Celdas del cuerpo fijas (.sticky-column-right/.sticky-column-left).z-index: 11: Intersección de esquinas superiores (th.sticky-column-right/th.sticky-column-left) para evitar solapamientos durante el scroll diagonal.
-
Opacidad y Colores de Fondo:
background-color: var(--alp-color-gris-claro-3)en celdas de encabezado.background-color: var(--alp-bg, #ffffff)en celdas del cuerpo.background-color: var(--alp-state-error-soft)en filas y celdas sticky con estado.row-error.
-
Separación Visual por Sombra (Box Shadow):
- Sombra sutil izquierda en
.sticky-column-right(box-shadow: -3px 0 6px rgba(0, 0, 0, 0.06)). - Sombra sutil derecha en
.sticky-column-left(box-shadow: 3px 0 6px rgba(0, 0, 0, 0.06)).
- Sombra sutil izquierda en