# Sprint 1.5 — Etapa 9: Badge ⚡ naranja en BpmnCanvas (web) > **Objetivo:** rediseñar el overlay del badge "automatizable" sobre los nodos del diagrama BPMN en el workspace web. Migrar de fondo blanco/ámbar con ícono Bot a fondo naranja sólido con símbolo ⚡, posición robusta basada en `left` (no `right`), y consistencia con la identidad InQ aplicada en Sprint 1.5. > > **Pre-requisitos:** Etapas 1-8 cerradas. Sistema de design tokens InQ disponible en `tailwind.config.ts`. Tokens `--inq-orange`, `--inq-orange-lighter`, etc., definidos. > > **Etapa siguiente:** Etapa 10 — Validación E2E final del Sprint 1.5 (suite completa, generación de artefactos de verificación, reporte de cobertura). --- ## 1. Alcance estricto ### Sí entra - ✅ Rediseño visual del badge en `BpmnCanvas.tsx`: fondo `#F59845` (inq-orange), símbolo ⚡ blanco - ✅ Cambio de posición del badge: de `{ top, right }` a `{ top, left: elementWidth - 12 }` para robustez con bpmn-js v18 - ✅ Migración de hex hardcodeados pendientes en `BpmnCanvas.tsx`: `#f59e0b`, `#fffbeb`, `#e2e8f0` a tokens CSS - ✅ Tests visuales del overlay con Playwright - ✅ Verificar que el badge aparece solo en actividades con `automatable === true` - ✅ Verificar que el badge se actualiza correctamente cuando se toggle del switch en ActivityPanel ### NO entra - ❌ Cambios en los PDFs (cerrados en Etapas 4-8) - ❌ Cambios en la lógica de detección de automatable (solo presentación) - ❌ Reemplazo del emoji ⚡ por `` de Lucide (anotado para Sprint 2-3 — requiere assets refinados) - ❌ Cambios en el panel de Automatización del ActivityPanel (cerrado en Etapa 3) - ❌ Cambios en otros overlays de bpmn-js (highlight de selección, gateways, etc.) --- ## 2. Decisiones ya tomadas (no consultar de nuevo) | Decisión | Justificación | |---|---| | Fondo del badge: `#F59845` (inq-orange sólido) | Brief sección 2.8, BRIEF.md Sprint 1.5 | | Símbolo: ⚡ blanco | Brief sección 2.8 | | Tamaño: 14px diameter | Brief sección 2.8 | | Border: 1.5px solid white | Brief sección 2.8 — para contraste sobre fondos claros | | Posición: `{ top: -8, left: elementWidth - 12 }` | Brief sección 2.8 — evita bug de `right` en bpmn-js v18 | | Emoji ⚡ se mantiene en Sprint 1.5 | Refinamiento a `` agendado para Sprint 2-3 | --- ## 3. Estado actual del componente `src/features/workspace/BpmnCanvas.tsx` tiene actualmente: ```tsx // Líneas aproximadas según audit Etapa 1: // Línea 24: stroke del ícono Bot en SVG inline stroke="#f59e0b" // amber-500 (hardcodeado) // Línea 40: fondo del badge backgroundColor: '#fffbeb', // amber-50 (hardcodeado) // Línea 41: borde del badge border: '1.5px solid #e2e8f0', // slate-200 (hardcodeado) ``` **Audit Etapa 1 dijo (entrada para `BpmnCanvas.tsx`):** > Etapa 9 (Badge ⚡): rediseño completo del badge a naranja sólido. Es decir, esta etapa es **el cumplimiento de un trabajo ya planificado**, no exploración nueva. --- ## 4. Especificación detallada del badge nuevo ### 4.1 Estructura visual ``` Badge automatizable (overlay sobre nodo BPMN): ┌────────────────┐ │ Nodo BPMN │ │ "task_recv" │ ← actividad automatizable │ ⚡ │ ← badge en esquina superior derecha │ │ (posicionado con left, no right) └────────────────┘ Estilo del badge: - Diámetro: 14px - Fondo: #F59845 (var(--inq-orange)) - Border: 1.5px solid white - Border-radius: 50% (círculo perfecto) - Box-shadow: 0 1px 2px rgba(0,0,0,0.1) (sutil elevación) Símbolo ⚡: - Color: white - Tamaño: 8px (font-size) - Font-weight: 700 - Text-align: center - Line-height: 14px (centrado vertical) Posición: - top: -8px (sale 8px por encima del nodo) - left: elementWidth - 12px (calculado dinámicamente desde bpmn-js) - z-index: 10 (sobre el nodo, debajo de tooltips) ``` ### 4.2 Implementación técnica bpmn-js usa el sistema de overlays para posicionar elementos sobre nodos del diagrama. La API relevante: ```typescript const overlays = modeler.get('overlays'); overlays.add(elementId, 'automatable-badge', { position: { top: -8, left: elementWidth - 12, // NO usar right (bug v18) }, html: `
`, }); ``` **CSS del badge** (en `BpmnCanvas.tsx` o archivo asociado): ```css .automatable-badge { width: 14px; height: 14px; background: var(--inq-orange); /* #F59845 */ border: 1.5px solid white; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: white; font-size: 8px; font-weight: 700; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); cursor: default; } ``` ### 4.3 Lifecycle del badge El badge debe: 1. **Aparecer** cuando una actividad se marca como `automatable === true` 2. **Desaparecer** cuando se desmarca (toggle del switch en ActivityPanel) 3. **Persistir** al hacer zoom, pan, o re-render del canvas 4. **Re-renderizar correctamente** después de hot-reload en desarrollo **Patrón recomendado:** ```typescript useEffect(() => { const overlays = modeler.get('overlays'); const overlayIds: Record = {}; activities.forEach(activity => { if (activity.automatable) { const element = elementRegistry.get(activity.bpmnElementId); if (!element) return; const id = overlays.add(activity.bpmnElementId, 'automatable-badge', { position: { top: -8, left: element.width - 12, }, html: '
', }); overlayIds[activity.bpmnElementId] = id; } }); return () => { Object.values(overlayIds).forEach(id => overlays.remove(id)); }; }, [activities, modeler]); ``` --- ## 5. Migración de hex hardcodeados pendientes Según audit Etapa 1, `BpmnCanvas.tsx` tiene 3 hex residuales que deben migrarse: | Línea aprox. | Hex actual | Significado actual | Nueva referencia | |---|---|---|---| | 24 | `#f59e0b` | stroke ícono Bot en SVG inline (legacy) | **ELIMINAR**: el ícono Bot se reemplaza por el badge ⚡ | | 40 | `#fffbeb` | fondo del badge (legacy amber-50) | **ELIMINAR**: el badge nuevo usa `var(--inq-orange)` | | 41 | `#e2e8f0` | borde del badge (legacy slate-200) | **ELIMINAR**: el badge nuevo usa border blanco | **El badge legacy se reemplaza completo.** No se trata de migrar colores, sino de rediseñar el componente. --- ## 6. Validaciones automatizadas mandatorias ``` Antes de present_files, ejecutá y confirmá: 1. El componente BpmnCanvas.tsx renderiza sin errores - npm run build limpio - npm run typecheck sin errores - Sin warnings nuevos de React 2. Tests unitarios: - El badge aparece cuando activity.automatable === true - El badge NO aparece cuando activity.automatable === false - El badge tiene fondo naranja InQ (#F59845) - El badge usa posición left, no right - Cleanup del badge al desmontar componente 3. Tests E2E (Playwright): - Cargar simple-linear, marcar primera actividad como automatable - Verificar que el badge ⚡ naranja aparece sobre el nodo correcto - Toggle del switch off — verificar que el badge desaparece - Toggle on de nuevo — verificar que el badge reaparece 4. Screenshot Playwright en tests/screenshots/etapa-9/: - workspace-badge-on.png: workspace con simple-linear y 2-3 actividades automatizables, badges naranja visibles - workspace-badge-detail.png: zoom in sobre un nodo automatizable mostrando el badge con detalle 5. Sin regresiones: - Otros tests del web app siguen verdes (~515+ del sprint) - PDFs no se regeneran en esta etapa (no aplica validación) ``` Si CUALQUIER validación falla, NO uses `present_files`. Reportá qué falló. --- ## 7. Entregables (Definition of Done) ``` [ ] BpmnCanvas.tsx rediseñado: badge ⚡ naranja sólido reemplaza al badge legacy amber con Bot [ ] Posición del badge usa left (no right) — robusto a bpmn-js v18 [ ] CSS del badge usa var(--inq-orange) y var(--inq-orange-lighter) según corresponda (sin hex hardcodeados) [ ] 3 hex hardcodeados pendientes del audit Etapa 1 eliminados [ ] Tests unitarios del overlay (al menos 5 casos) [ ] Tests E2E del lifecycle del badge (al menos 3 escenarios) [ ] 2 screenshots Playwright generados y commiteados [ ] 515+ tests previos siguen verdes [ ] Build limpio, typecheck limpio, lint limpio [ ] Screenshot presentado para validación visual [ ] Decisiones tomadas por iniciativa documentadas según política refinada (post-Etapa 8) de CLAUDE.md ``` --- ## 8. Validación visual del director Después de Claude Code presente los screenshots, abrí el dev server y validá: 1. Cargá un proceso (idealmente `simple-linear` o `medium-with-gateways`) 2. Marcá 2-3 actividades como automatizables desde el ActivityPanel 3. Mirá el canvas BPMN y verificá: ``` [ ] El badge ⚡ aparece sobre cada actividad marcada [ ] El badge tiene fondo naranja sólido (#F59845) [ ] El símbolo ⚡ se ve nítido en blanco [ ] El badge está en la esquina superior derecha del nodo [ ] El badge NO se sale del área del nodo al hacer zoom in/out [ ] El badge desaparece al desmarcar la actividad [ ] No hay badges huérfanos al cambiar de proceso o limpiar ``` **Tu impresión visceral:** ¿el badge se siente parte de la identidad InQ o se siente "agregado"? Es un detalle pequeño pero importante para coherencia visual. --- ## 9. Reporte final a entregar 1. **Tabla de archivos modificados** con líneas 2. **5 validaciones automatizadas confirmadas** (resultados específicos) 3. **Cantidad final de tests verdes** 4. **2 screenshots Playwright** presentados con paths absolutos 5. **Confirmación de migración de hex hardcodeados** (los 3 del audit Etapa 1) 6. **Hallazgos no esperados** 7. **Decisiones tomadas por iniciativa** clasificadas según política refinada de CLAUDE.md --- ## 10. Reglas operativas (recordatorios) 1. **NO TOCAR los PDFs.** Cerrados en Etapas 4-8. Esta etapa es solo web app. 2. **NO REEMPLAZAR el emoji ⚡ con `` u otro icono.** Está agendado para Sprint 2-3 cuando InQuality tenga assets refinados. 3. **NO CAMBIAR la lógica de detección de automatable.** Solo la presentación visual. 4. **USAR POSICIÓN basada en `left`, no `right`.** Está documentado como bug conocido de bpmn-js v18 en el brief (sección 5.3). El position calculado dinámicamente con `elementWidth - 12` es la solución probada. 5. **Política de iniciativa proactiva refinada (post-Etapa 8):** - Si el cambio resuelve un ítem listado en TECH_DEBT.md o BACKLOG.md → Nivel 3 (consultar previa) - Si choca con restricción explícita del prompt ("NO entra", "NO tocar") → Nivel 3 - Si modifica paginación, layout, estructura de salida, o contenido visible → Nivel 2 mínimo (reportar) - Si afecta marca, identidad, dependencias o configuración → Nivel 3 - Si nada aplica → Nivel 1 - Argumentos NO válidos: "mejora de legibilidad", "consistencia con etapa anterior", "trivial de revertir", "resuelve bug menor" 6. **Si encontrás que el badge actual usa Bot de Lucide en lugar de algún SVG genérico**, NO migres a `` ni a otro componente. **Reemplaza el badge completo** según especificación de §4. 7. **Validación visual del director es mandatoria.** No declarar etapa terminada sin que el director haya visto los screenshots y verificado el dev server. 8. **Si encontrás contradicción** entre prompt y código: PARÁ y consultá. --- ## 11. Contexto: por qué esta etapa importa El badge ⚡ es **el indicador visual más importante del workspace BPMN**. Cuando un consultor importa un proceso de 15 actividades y empieza a marcar automatizables, necesita ver de un vistazo cuáles ya marcó y cuáles faltan. Un badge legítimo, visible y consistente con la marca es la diferencia entre "herramienta profesional" y "prototipo". Hasta ahora el badge era ámbar tenue con un ícono Bot que pasaba desapercibido. Con esta etapa el badge se vuelve **el segundo elemento visual más identitario del producto** después del logo y los KPI Hero (los dos elementos donde aparece el naranja InQ con peso). Si el badge queda bien: - El workspace transmite "identidad de marca" sin texto - Las screenshots de pre-venta muestran un producto cohesivo - El consultor tiene feedback visual claro de qué activó Si queda mal: - Inconsistencia visual entre web y PDFs - Sensación de "componente legacy no actualizado" Apuntá al primero. --- ## 12. Esta etapa cierra el rediseño visual del Sprint 1.5 Después de Etapa 9, los componentes visuales clave del producto están todos rediseñados: - ✅ Web app workspace (Etapa 3) - ✅ Web app reporte ROI (Etapa 3) - ✅ PDFs header/footer compartidos (Etapa 4) - ✅ PDFs layout híbrido (Etapa 5) - ✅ PDF ROI página 1 completa (Etapa 6) - ✅ PDF ROI páginas 2-5 (Etapa 7) - ✅ PDFs Actual/Automatizado (Etapa 8) - ⏳ Badge ⚡ en BpmnCanvas (Etapa 9 — esta) Lo que queda después es **validación final** (Etapa 10) y **polish + documentación** (Etapa 11). El rediseño visual del producto está completo después de Etapa 9.