feat(sprint-5/etapa-3): heatmap gradiente 4 stops + modo percentil + localStorage + fix zoom

- colors.ts: gradiente continuo verde→amarillo→naranja→rojo (interpolación N-stops genérica)
- Renombra modos: relative→percentile (rank-based), absolute→minmax
- Hook useHeatmapMode(): persiste selección en localStorage con clave inq-roi:heatmap-mode
- HeatmapLegend: barra de 4 stops, labels P0/P50/P100 en modo percentil
- HeatmapModeToggle: etiquetas "Percentil" / "Min-max"
- pdf-sections.ts: leyenda PDF con 4 stops interpolados
- BpmnCanvas: controles de zoom movidos a esquina inferior izquierda (evita logo bpmn.io)
- Tests: 528 unitarios pasan; E2E recalibrados con vecino más cercano (distancia euclidiana)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-19 18:28:10 -03:00
parent 889929329e
commit a65bec45c3
15 changed files with 593 additions and 176 deletions

View File

@@ -146,7 +146,7 @@ describe('ActivitiesTable', () => {
render(
<ActivitiesTable
perActivity={mockActivities}
mode="relative"
mode="percentile"
currency="USD"
highlightedId={null}
onRowClick={vi.fn()}
@@ -161,7 +161,7 @@ describe('ActivitiesTable', () => {
render(
<ActivitiesTable
perActivity={mockActivities}
mode="relative"
mode="percentile"
currency="USD"
highlightedId={null}
onRowClick={vi.fn()}
@@ -177,7 +177,7 @@ describe('ActivitiesTable', () => {
render(
<ActivitiesTable
perActivity={mockActivities}
mode="relative"
mode="percentile"
currency="USD"
highlightedId={null}
onRowClick={onRowClick}
@@ -193,7 +193,7 @@ describe('ActivitiesTable', () => {
render(
<ActivitiesTable
perActivity={mockActivities}
mode="relative"
mode="percentile"
currency="USD"
highlightedId="task1"
onRowClick={vi.fn()}
@@ -208,7 +208,7 @@ describe('ActivitiesTable', () => {
render(
<ActivitiesTable
perActivity={[]}
mode="relative"
mode="percentile"
currency="USD"
highlightedId={null}
onRowClick={vi.fn()}