swl-ses 3.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +425 -0
- package/_userland/agentes/.gitkeep +0 -0
- package/_userland/habilidades/.gitkeep +0 -0
- package/agentes/accesibilidad-wcag-swl.md +683 -0
- package/agentes/arquitecto-swl.md +210 -0
- package/agentes/auto-evolucion-swl.md +408 -0
- package/agentes/backend-api-swl.md +442 -0
- package/agentes/backend-node-swl.md +439 -0
- package/agentes/backend-python-swl.md +469 -0
- package/agentes/backend-workers-swl.md +444 -0
- package/agentes/cloud-infra-swl.md +466 -0
- package/agentes/consolidador-swl.md +487 -0
- package/agentes/datos-swl.md +568 -0
- package/agentes/depurador-swl.md +301 -0
- package/agentes/devops-ci-swl.md +352 -0
- package/agentes/disenador-ui-swl.md +546 -0
- package/agentes/documentador-swl.md +323 -0
- package/agentes/frontend-angular-swl.md +603 -0
- package/agentes/frontend-css-swl.md +700 -0
- package/agentes/frontend-react-swl.md +672 -0
- package/agentes/frontend-swl.md +483 -0
- package/agentes/frontend-tailwind-swl.md +808 -0
- package/agentes/implementador-swl.md +235 -0
- package/agentes/investigador-swl.md +274 -0
- package/agentes/investigador-ux-swl.md +482 -0
- package/agentes/migrador-swl.md +389 -0
- package/agentes/mobile-android-swl.md +473 -0
- package/agentes/mobile-cross-swl.md +501 -0
- package/agentes/mobile-ios-swl.md +464 -0
- package/agentes/notificador-swl.md +886 -0
- package/agentes/observabilidad-swl.md +408 -0
- package/agentes/orquestador-swl.md +490 -0
- package/agentes/planificador-swl.md +222 -0
- package/agentes/producto-prd-swl.md +565 -0
- package/agentes/release-manager-swl.md +545 -0
- package/agentes/rendimiento-swl.md +691 -0
- package/agentes/revisor-codigo-swl.md +254 -0
- package/agentes/revisor-seguridad-swl.md +316 -0
- package/agentes/tdd-qa-swl.md +323 -0
- package/agentes/ux-disenador-swl.md +498 -0
- package/bin/swl-ses.js +119 -0
- package/comandos/swl/actualizar.md +117 -0
- package/comandos/swl/aprender.md +348 -0
- package/comandos/swl/auditar-deps.md +390 -0
- package/comandos/swl/autoresearch.md +346 -0
- package/comandos/swl/checkpoint.md +296 -0
- package/comandos/swl/compactar.md +283 -0
- package/comandos/swl/crear-skill.md +609 -0
- package/comandos/swl/discutir-fase.md +230 -0
- package/comandos/swl/ejecutar-fase.md +302 -0
- package/comandos/swl/evolucionar.md +377 -0
- package/comandos/swl/instalar.md +220 -0
- package/comandos/swl/mapear-codebase.md +205 -0
- package/comandos/swl/nuevo-proyecto.md +154 -0
- package/comandos/swl/planear-fase.md +221 -0
- package/comandos/swl/release.md +405 -0
- package/comandos/swl/salud.md +382 -0
- package/comandos/swl/verificar.md +292 -0
- package/habilidades/accesibilidad-a11y/SKILL.md +584 -0
- package/habilidades/angular-avanzado/SKILL.md +491 -0
- package/habilidades/angular-moderno/SKILL.md +326 -0
- package/habilidades/api-rest-diseno/SKILL.md +302 -0
- package/habilidades/api-rest-diseno/recursos/openapi-template.yaml +506 -0
- package/habilidades/aprendizaje-continuo/SKILL.md +369 -0
- package/habilidades/async-python/SKILL.md +474 -0
- package/habilidades/auth-patrones/SKILL.md +488 -0
- package/habilidades/auto-evolucion-protocolo/SKILL.md +376 -0
- package/habilidades/autoresearch/SKILL.md +248 -0
- package/habilidades/autoresearch/recursos/checklist-template.md +191 -0
- package/habilidades/autoresearch/scripts/calcular-score.js +88 -0
- package/habilidades/checklist-calidad/SKILL.md +247 -0
- package/habilidades/checklist-calidad/recursos/quality-report-template.md +148 -0
- package/habilidades/checklist-seguridad/SKILL.md +224 -0
- package/habilidades/checkpoints-verificacion/SKILL.md +309 -0
- package/habilidades/checkpoints-verificacion/recursos/checkpoint-templates.md +360 -0
- package/habilidades/ci-cd-pipelines/SKILL.md +583 -0
- package/habilidades/ci-cd-pipelines/recursos/github-actions-template.yaml +403 -0
- package/habilidades/cloud-aws/SKILL.md +497 -0
- package/habilidades/compactacion-contexto/SKILL.md +201 -0
- package/habilidades/contenedores-docker/SKILL.md +453 -0
- package/habilidades/contenedores-docker/recursos/dockerfile-template.dockerfile +160 -0
- package/habilidades/css-moderno/SKILL.md +463 -0
- package/habilidades/datos-etl/SKILL.md +486 -0
- package/habilidades/dependencias-auditoria/SKILL.md +293 -0
- package/habilidades/deprecacion-migracion/SKILL.md +485 -0
- package/habilidades/design-tokens/SKILL.md +519 -0
- package/habilidades/discutir-fase/SKILL.md +167 -0
- package/habilidades/diseno-responsivo/SKILL.md +326 -0
- package/habilidades/django-experto/SKILL.md +395 -0
- package/habilidades/doc-sync/SKILL.md +259 -0
- package/habilidades/ejecutar-fase/SKILL.md +199 -0
- package/habilidades/estructura-proyecto-claude/SKILL.md +459 -0
- package/habilidades/estructura-proyecto-claude/recursos/claude-md-template.md +261 -0
- package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +213 -0
- package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +77 -0
- package/habilidades/estructura-proyecto-claude/recursos/variantes-por-stack.md +177 -0
- package/habilidades/event-driven/SKILL.md +580 -0
- package/habilidades/extractor-de-aprendizajes/SKILL.md +234 -0
- package/habilidades/fastapi-experto/SKILL.md +368 -0
- package/habilidades/frontend-avanzado/SKILL.md +555 -0
- package/habilidades/git-worktrees-paralelo/SKILL.md +246 -0
- package/habilidades/iam-secretos/SKILL.md +511 -0
- package/habilidades/instalar-sistema/SKILL.md +140 -0
- package/habilidades/kubernetes-orquestacion/SKILL.md +549 -0
- package/habilidades/manejo-errores/SKILL.md +512 -0
- package/habilidades/mapear-codebase/SKILL.md +199 -0
- package/habilidades/microservicios/SKILL.md +473 -0
- package/habilidades/mobile-flutter/SKILL.md +566 -0
- package/habilidades/mobile-react-native/SKILL.md +493 -0
- package/habilidades/monitoring-alertas/SKILL.md +447 -0
- package/habilidades/node-experto/SKILL.md +521 -0
- package/habilidades/notificaciones-multicanal/SKILL.md +448 -0
- package/habilidades/notificaciones-multicanal/recursos/config-template.json +115 -0
- package/habilidades/nuevo-proyecto/SKILL.md +183 -0
- package/habilidades/patrones-python/SKILL.md +381 -0
- package/habilidades/performance-baseline/SKILL.md +243 -0
- package/habilidades/planear-fase/SKILL.md +184 -0
- package/habilidades/postgresql-experto/SKILL.md +379 -0
- package/habilidades/react-experto/SKILL.md +434 -0
- package/habilidades/react-optimizacion/SKILL.md +328 -0
- package/habilidades/release-semver/SKILL.md +226 -0
- package/habilidades/release-semver/scripts/generar-changelog.sh +238 -0
- package/habilidades/sql-optimizacion/SKILL.md +314 -0
- package/habilidades/tailwind-experto/SKILL.md +412 -0
- package/habilidades/tdd-workflow/SKILL.md +267 -0
- package/habilidades/testing-python/SKILL.md +350 -0
- package/habilidades/threat-model-lite/SKILL.md +218 -0
- package/habilidades/typescript-avanzado/SKILL.md +454 -0
- package/habilidades/ux-diseno/SKILL.md +488 -0
- package/habilidades/validacion-ci-sistema/SKILL.md +543 -0
- package/habilidades/validacion-ci-sistema/scripts/validar-sistema.sh +286 -0
- package/habilidades/verificar-trabajo/SKILL.md +208 -0
- package/habilidades/wireframes-flujos/SKILL.md +396 -0
- package/habilidades/workflow-claude-code/SKILL.md +359 -0
- package/hooks/calidad-pre-commit.js +578 -0
- package/hooks/escaneo-secretos.js +302 -0
- package/hooks/extraccion-aprendizajes.js +550 -0
- package/hooks/linea-estado.js +249 -0
- package/hooks/monitor-contexto.js +230 -0
- package/hooks/proteccion-rutas.js +249 -0
- package/manifiestos/hooks-config.json +41 -0
- package/manifiestos/modulos.json +318 -0
- package/manifiestos/perfiles.json +189 -0
- package/package.json +45 -0
- package/plantillas/PROJECT.md +122 -0
- package/plantillas/REQUIREMENTS.md +132 -0
- package/plantillas/ROADMAP.md +143 -0
- package/plantillas/STATE.md +109 -0
- package/plantillas/research/ARCHITECTURE.md +220 -0
- package/plantillas/research/FEATURES.md +175 -0
- package/plantillas/research/PITFALLS.md +299 -0
- package/plantillas/research/STACK.md +233 -0
- package/plantillas/research/SUMMARY.md +165 -0
- package/plugin.json +144 -0
- package/reglas/accesibilidad.md +269 -0
- package/reglas/api-diseno.md +400 -0
- package/reglas/arquitectura.md +183 -0
- package/reglas/cloud-infra.md +247 -0
- package/reglas/docs.md +245 -0
- package/reglas/estilo-codigo.md +179 -0
- package/reglas/git-workflow.md +186 -0
- package/reglas/performance.md +195 -0
- package/reglas/pruebas.md +159 -0
- package/reglas/seguridad.md +151 -0
- package/reglas/skills-estandar.md +473 -0
- package/scripts/actualizar.js +51 -0
- package/scripts/desinstalar.js +86 -0
- package/scripts/doctor.js +222 -0
- package/scripts/inicializar.js +89 -0
- package/scripts/instalador.js +333 -0
- package/scripts/lib/detectar-runtime.js +177 -0
- package/scripts/lib/estado.js +112 -0
- package/scripts/lib/hooks-settings.js +283 -0
- package/scripts/lib/manifiestos.js +138 -0
- package/scripts/lib/seguridad.js +160 -0
- package/scripts/publicar.js +209 -0
- package/scripts/validar.js +120 -0
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ux-diseno
|
|
3
|
+
description: Principios de UX design para desarrolladores. Heurísticas de Nielsen, Fitts's Law, Ley de Miller, Gestalt, jerarquía visual, micro-interacciones, feedback visual, estados vacíos, error states, loading states.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# UX Design para Desarrolladores
|
|
7
|
+
|
|
8
|
+
Un desarrollador que entiende UX toma mejores decisiones de implementación sin necesitar
|
|
9
|
+
validación en cada detalle visual. Estos principios reducen fricción y aumentan la usabilidad
|
|
10
|
+
sin depender de un diseñador para cada componente.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 1. Las 10 Heurísticas de Nielsen
|
|
15
|
+
|
|
16
|
+
### H1 — Visibilidad del estado del sistema
|
|
17
|
+
|
|
18
|
+
El sistema debe siempre informar al usuario qué está pasando, en tiempo oportuno.
|
|
19
|
+
|
|
20
|
+
```html
|
|
21
|
+
<!-- MAL: botón que no indica que está procesando -->
|
|
22
|
+
<button onclick="enviar()">Enviar</button>
|
|
23
|
+
|
|
24
|
+
<!-- BIEN: feedback inmediato del estado -->
|
|
25
|
+
<button [disabled]="cargando" (click)="enviar()">
|
|
26
|
+
@if (cargando) {
|
|
27
|
+
<span class="spinner" aria-label="Enviando..."></span>
|
|
28
|
+
Enviando...
|
|
29
|
+
} @else {
|
|
30
|
+
Enviar
|
|
31
|
+
}
|
|
32
|
+
</button>
|
|
33
|
+
|
|
34
|
+
<!-- Loading states: skeleton > spinner > mensaje de texto -->
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### H2 — Match entre sistema y mundo real
|
|
38
|
+
|
|
39
|
+
Hablar el idioma del usuario, no el del desarrollador.
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
MAL: "Error 500: Internal Server Error. SQLAlchemy constraint violation."
|
|
43
|
+
BIEN: "No pudimos guardar los cambios. Por favor intenta de nuevo."
|
|
44
|
+
|
|
45
|
+
MAL: "Token JWT expirado"
|
|
46
|
+
BIEN: "Tu sesión ha expirado. Inicia sesión nuevamente para continuar."
|
|
47
|
+
|
|
48
|
+
MAL: Mostrar UUID en la interfaz: "ID: a3f2-4b1c-..."
|
|
49
|
+
BIEN: Mostrar número de folio amigable: "Solicitud #2024-0142"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### H3 — Control y libertad del usuario
|
|
53
|
+
|
|
54
|
+
Los usuarios cometen errores — darles salidas claras.
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
Siempre proveer:
|
|
58
|
+
- Botón "Cancelar" en formularios largos
|
|
59
|
+
- "Deshacer" en acciones destructivas (o soft-delete con tiempo límite)
|
|
60
|
+
- Confirmación antes de eliminar: "¿Eliminar expediente de Juan Pérez? Esta acción no se puede deshacer."
|
|
61
|
+
- Breadcrumbs para saber dónde están y poder regresar
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### H4 — Consistencia y estándares
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
Convenciones que NUNCA romper:
|
|
68
|
+
- Azul subrayado = enlace
|
|
69
|
+
- Logo (top-left) = regresa a inicio
|
|
70
|
+
- X en esquina superior = cerrar modal
|
|
71
|
+
- Enter en formulario = enviar
|
|
72
|
+
- Escape = cerrar/cancelar
|
|
73
|
+
|
|
74
|
+
En el sistema: un mismo patrón para la misma acción.
|
|
75
|
+
Si "Guardar" está a la izquierda en un formulario, que esté a la izquierda en todos.
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### H5 — Prevención de errores
|
|
79
|
+
|
|
80
|
+
```html
|
|
81
|
+
<!-- Mejor prevenir que mostrar mensajes de error -->
|
|
82
|
+
|
|
83
|
+
<!-- Deshabilitar botón hasta que el formulario sea válido -->
|
|
84
|
+
<button [disabled]="!formulario.valid" type="submit">
|
|
85
|
+
Guardar
|
|
86
|
+
</button>
|
|
87
|
+
|
|
88
|
+
<!-- Confirmar email peligroso antes de proceder -->
|
|
89
|
+
<input
|
|
90
|
+
type="email"
|
|
91
|
+
placeholder="correo@empresa.com.mx"
|
|
92
|
+
pattern="[a-z0-9._%+\-]+@empresa\.com\.mx"
|
|
93
|
+
/>
|
|
94
|
+
<small>Solo se aceptan correos @empresa.com.mx</small>
|
|
95
|
+
|
|
96
|
+
<!-- Formatear automáticamente mientras el usuario escribe -->
|
|
97
|
+
<!-- RFC: XXXX000000XXX — aplicar máscara de input -->
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### H6 — Reconocimiento antes que recuerdo
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
No forzar al usuario a recordar información entre pantallas.
|
|
104
|
+
- Mostrar qué archivo se seleccionó en paso anterior
|
|
105
|
+
- Mostrar nombre del empleado en todos los pasos de un flujo multi-paso
|
|
106
|
+
- Autocompletar con datos usados recientemente
|
|
107
|
+
- Mostrar progreso en formularios multi-paso (Step 2 de 4)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### H7 — Flexibilidad y eficiencia de uso
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
Atajos para usuarios expertos:
|
|
114
|
+
- Keyboard shortcuts documentados (Ctrl+S = guardar, Ctrl+F = buscar)
|
|
115
|
+
- Acciones en masa para usuarios frecuentes
|
|
116
|
+
- Filtros guardados / búsquedas favoritas
|
|
117
|
+
- "Crear otro" en formularios de alta frecuente
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### H8 — Diseño minimalista y estético
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
Cada elemento extra compite por atención del usuario.
|
|
124
|
+
Eliminar:
|
|
125
|
+
- Texto instructivo que nadie lee
|
|
126
|
+
- Campos opcionales que casi nadie llena
|
|
127
|
+
- Iconos sin texto en acciones no obvias
|
|
128
|
+
- Columnas de tabla que nadie usa
|
|
129
|
+
|
|
130
|
+
Regla: si dudas si incluir algo, no lo incluyas.
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### H9 — Ayudar a reconocer, diagnosticar y recuperarse de errores
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
Mensaje de error efectivo = Qué pasó + Por qué + Qué hacer
|
|
137
|
+
|
|
138
|
+
MAL: "Error de validación"
|
|
139
|
+
BIEN: "El RFC debe tener 13 caracteres. Ejemplo: PEGJ850101GR5"
|
|
140
|
+
|
|
141
|
+
MAL: "Operación fallida"
|
|
142
|
+
BIEN: "No se pudo conectar al servidor de nómina SAP.
|
|
143
|
+
Por favor intenta en 5 minutos. Si el problema persiste,
|
|
144
|
+
contacta a soporte@empresa.com.mx"
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### H10 — Ayuda y documentación
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
La mejor ayuda es que la interfaz sea autoexplicativa.
|
|
151
|
+
Cuando se necesita ayuda:
|
|
152
|
+
- Tooltips en campos técnicos (hover sobre el ícono ?)
|
|
153
|
+
- Links a artículos específicos ("¿Cómo calculo el IMSS?")
|
|
154
|
+
- Texto de ejemplo dentro del campo (placeholder)
|
|
155
|
+
- Ejemplos reales en mensajes de error
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## 2. Ley de Fitts — Tamaño y Distancia de Objetivos
|
|
161
|
+
|
|
162
|
+
**Principio**: El tiempo para alcanzar un objetivo depende de su tamaño y distancia.
|
|
163
|
+
Objetivos más grandes y más cercanos son más fáciles de alcanzar.
|
|
164
|
+
|
|
165
|
+
```css
|
|
166
|
+
/* MAL: botón de acción principal demasiado pequeño */
|
|
167
|
+
.btn-guardar {
|
|
168
|
+
padding: 4px 8px;
|
|
169
|
+
font-size: 12px;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/* BIEN: objetivo con área de toque adecuada */
|
|
173
|
+
.btn-guardar {
|
|
174
|
+
padding: 12px 24px; /* Mínimo 44x44px de área táctil (mobile) */
|
|
175
|
+
font-size: 16px;
|
|
176
|
+
min-height: 44px; /* Estándar de accesibilidad táctil */
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/* Acciones destructivas alejadas de las primarias */
|
|
180
|
+
.acciones-formulario {
|
|
181
|
+
display: flex;
|
|
182
|
+
gap: 16px;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.btn-cancelar {
|
|
186
|
+
/* Lejos y de menor prominencia visual que "Guardar" */
|
|
187
|
+
margin-right: auto;
|
|
188
|
+
color: #666;
|
|
189
|
+
background: transparent;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.btn-guardar {
|
|
193
|
+
/* Acción principal: grande, prominente, a la derecha */
|
|
194
|
+
background: #1a56db;
|
|
195
|
+
color: white;
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## 3. Ley de Miller — El número mágico 7±2
|
|
202
|
+
|
|
203
|
+
**Principio**: La memoria de trabajo puede retener entre 5 y 9 elementos simultáneamente.
|
|
204
|
+
|
|
205
|
+
```
|
|
206
|
+
Aplicaciones prácticas:
|
|
207
|
+
- Menú de navegación: máximo 7 opciones de primer nivel
|
|
208
|
+
- Pasos de wizard: máximo 5-7 pasos (si son más, revisar el flujo)
|
|
209
|
+
- Columnas en tabla: máximo 7 columnas visibles sin scroll horizontal
|
|
210
|
+
- Opciones en dropdown: si hay más de 7, agregar búsqueda
|
|
211
|
+
- Formulario: agrupar campos relacionados en secciones (máximo 7 por sección)
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
```html
|
|
215
|
+
<!-- MAL: 12 opciones de filtro sin agrupar -->
|
|
216
|
+
<select>
|
|
217
|
+
<option>Enero</option> <option>Febrero</option> <option>Marzo</option>
|
|
218
|
+
<!-- ... 9 opciones más -->
|
|
219
|
+
</select>
|
|
220
|
+
|
|
221
|
+
<!-- BIEN: agrupar opciones relacionadas -->
|
|
222
|
+
<select>
|
|
223
|
+
<optgroup label="2026">
|
|
224
|
+
<option>Enero 2026</option>
|
|
225
|
+
<option>Febrero 2026</option>
|
|
226
|
+
</optgroup>
|
|
227
|
+
<optgroup label="2025">
|
|
228
|
+
<option>Diciembre 2025</option>
|
|
229
|
+
<!-- ... -->
|
|
230
|
+
</optgroup>
|
|
231
|
+
</select>
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## 4. Principios Gestalt
|
|
237
|
+
|
|
238
|
+
### Proximidad — Elementos cercanos parecen relacionados
|
|
239
|
+
|
|
240
|
+
```css
|
|
241
|
+
/* Campos del mismo formulario: poco espacio entre ellos */
|
|
242
|
+
/* Secciones distintas: mucho espacio entre ellas */
|
|
243
|
+
.grupo-campo {
|
|
244
|
+
margin-bottom: 8px; /* Dentro del mismo grupo */
|
|
245
|
+
}
|
|
246
|
+
.seccion {
|
|
247
|
+
margin-bottom: 32px; /* Entre secciones distintas */
|
|
248
|
+
}
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### Similitud — Elementos similares parecen relacionados
|
|
252
|
+
|
|
253
|
+
```css
|
|
254
|
+
/* Mismo color + estilo = misma función */
|
|
255
|
+
/* Botones primarios: azul */
|
|
256
|
+
/* Botones destructivos: rojo */
|
|
257
|
+
/* Botones neutros: gris */
|
|
258
|
+
/* NUNCA mismo color para funciones distintas */
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### Continuidad — El ojo sigue líneas y curvas
|
|
262
|
+
|
|
263
|
+
```html
|
|
264
|
+
<!-- Usar alineación para guiar al ojo -->
|
|
265
|
+
<!-- Formulario: labels alineados a la izquierda, inputs alineados -->
|
|
266
|
+
<!-- Tabla: columnas numéricas alineadas a la derecha -->
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## 5. Jerarquía Visual
|
|
272
|
+
|
|
273
|
+
```css
|
|
274
|
+
/* Escala tipográfica clara */
|
|
275
|
+
:root {
|
|
276
|
+
--text-xs: 0.75rem; /* 12px — metadatos, badges */
|
|
277
|
+
--text-sm: 0.875rem; /* 14px — texto secundario */
|
|
278
|
+
--text-base: 1rem; /* 16px — cuerpo */
|
|
279
|
+
--text-lg: 1.125rem; /* 18px — subtítulos */
|
|
280
|
+
--text-xl: 1.25rem; /* 20px — títulos de sección */
|
|
281
|
+
--text-2xl: 1.5rem; /* 24px — títulos de página */
|
|
282
|
+
--text-3xl: 1.875rem; /* 30px — hero / KPIs */
|
|
283
|
+
|
|
284
|
+
/* Pesos */
|
|
285
|
+
--font-normal: 400;
|
|
286
|
+
--font-medium: 500;
|
|
287
|
+
--font-semibold: 600;
|
|
288
|
+
--font-bold: 700;
|
|
289
|
+
|
|
290
|
+
/* Color como jerarquía */
|
|
291
|
+
--color-text-primary: #111827; /* Contenido principal */
|
|
292
|
+
--color-text-secondary: #6b7280; /* Contenido de apoyo */
|
|
293
|
+
--color-text-disabled: #9ca3af; /* Deshabilitado */
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
## 6. Estados que Toda UI Debe Manejar
|
|
300
|
+
|
|
301
|
+
### Estado de Carga (Loading)
|
|
302
|
+
|
|
303
|
+
```html
|
|
304
|
+
<!-- Skeleton loader — mejor que spinner para listas -->
|
|
305
|
+
<div class="skeleton-card" aria-busy="true" aria-label="Cargando expedientes...">
|
|
306
|
+
<div class="skeleton-line w-3/4 h-4 mb-2"></div>
|
|
307
|
+
<div class="skeleton-line w-1/2 h-3 mb-1"></div>
|
|
308
|
+
<div class="skeleton-line w-2/3 h-3"></div>
|
|
309
|
+
</div>
|
|
310
|
+
|
|
311
|
+
<!-- Spinner inline para acciones puntuales -->
|
|
312
|
+
<button disabled>
|
|
313
|
+
<svg class="animate-spin h-4 w-4" viewBox="0 0 24 24" aria-hidden="true">...</svg>
|
|
314
|
+
Guardando...
|
|
315
|
+
</button>
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
```css
|
|
319
|
+
/* Skeleton con animación de shimmer */
|
|
320
|
+
.skeleton-line {
|
|
321
|
+
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
|
|
322
|
+
background-size: 200% 100%;
|
|
323
|
+
animation: shimmer 1.5s infinite;
|
|
324
|
+
border-radius: 4px;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
@keyframes shimmer {
|
|
328
|
+
0% { background-position: -200% 0; }
|
|
329
|
+
100% { background-position: 200% 0; }
|
|
330
|
+
}
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
### Estado Vacío (Empty State)
|
|
334
|
+
|
|
335
|
+
```html
|
|
336
|
+
<!-- MAL: tabla vacía sin explicación -->
|
|
337
|
+
<table>
|
|
338
|
+
<thead>...</thead>
|
|
339
|
+
<tbody><!-- nada --></tbody>
|
|
340
|
+
</table>
|
|
341
|
+
|
|
342
|
+
<!-- BIEN: empty state con contexto y acción -->
|
|
343
|
+
<div class="empty-state" role="status">
|
|
344
|
+
<img src="assets/empty-expedientes.svg" alt="" aria-hidden="true" />
|
|
345
|
+
<h3>No hay expedientes registrados</h3>
|
|
346
|
+
<p>Crea el primer expediente para comenzar a gestionar tu equipo.</p>
|
|
347
|
+
<a routerLink="/expedientes/nuevo" class="btn-primary">
|
|
348
|
+
Crear expediente
|
|
349
|
+
</a>
|
|
350
|
+
</div>
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### Estado de Error
|
|
354
|
+
|
|
355
|
+
```html
|
|
356
|
+
<!-- Error inline en formulario -->
|
|
357
|
+
<div class="error-message" role="alert">
|
|
358
|
+
<svg class="error-icon" aria-hidden="true">...</svg>
|
|
359
|
+
<div>
|
|
360
|
+
<strong>No se pudo guardar el expediente</strong>
|
|
361
|
+
<p>El número de empleado ya existe en el sistema. Verifica el campo e intenta nuevamente.</p>
|
|
362
|
+
</div>
|
|
363
|
+
<button onclick="reintentar()">Reintentar</button>
|
|
364
|
+
</div>
|
|
365
|
+
|
|
366
|
+
<!-- Error de página completa (403, 404, 500) -->
|
|
367
|
+
<div class="error-page">
|
|
368
|
+
<span class="error-code">404</span>
|
|
369
|
+
<h1>Página no encontrada</h1>
|
|
370
|
+
<p>La URL que buscas no existe o fue movida.</p>
|
|
371
|
+
<div class="acciones">
|
|
372
|
+
<a routerLink="/">Ir al inicio</a>
|
|
373
|
+
<button onclick="history.back()">Regresar</button>
|
|
374
|
+
</div>
|
|
375
|
+
</div>
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
---
|
|
379
|
+
|
|
380
|
+
## 7. Micro-interacciones
|
|
381
|
+
|
|
382
|
+
```css
|
|
383
|
+
/* Feedback visual en acciones */
|
|
384
|
+
|
|
385
|
+
/* Botón con confirmación visual de éxito */
|
|
386
|
+
.btn-guardar.exito {
|
|
387
|
+
background-color: #16a34a;
|
|
388
|
+
transition: background-color 0.3s ease;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/* Hover suave en cards clicables */
|
|
392
|
+
.card-empleado {
|
|
393
|
+
transition: transform 0.15s ease, box-shadow 0.15s ease;
|
|
394
|
+
cursor: pointer;
|
|
395
|
+
}
|
|
396
|
+
.card-empleado:hover {
|
|
397
|
+
transform: translateY(-2px);
|
|
398
|
+
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/* Animación de entrada para notificaciones */
|
|
402
|
+
@keyframes slide-in {
|
|
403
|
+
from { transform: translateX(100%); opacity: 0; }
|
|
404
|
+
to { transform: translateX(0); opacity: 1; }
|
|
405
|
+
}
|
|
406
|
+
.toast {
|
|
407
|
+
animation: slide-in 0.25s ease-out;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/* Reducir movimiento para usuarios con vestibular disorders */
|
|
411
|
+
@media (prefers-reduced-motion: reduce) {
|
|
412
|
+
*, *::before, *::after {
|
|
413
|
+
animation-duration: 0.01ms !important;
|
|
414
|
+
transition-duration: 0.01ms !important;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
---
|
|
420
|
+
|
|
421
|
+
## 8. Formularios — UX Específica
|
|
422
|
+
|
|
423
|
+
```
|
|
424
|
+
Orden de campos: del más familiar al más específico
|
|
425
|
+
1. Nombre → Apellido → Email (todos conocen esto)
|
|
426
|
+
2. Departamento → Puesto (contexto)
|
|
427
|
+
3. RFC → CURP → NSS (datos específicos de RRHH)
|
|
428
|
+
|
|
429
|
+
Reglas de campo:
|
|
430
|
+
- Label siempre visible (no solo placeholder)
|
|
431
|
+
- Hint text debajo del campo, no encima
|
|
432
|
+
- Error mensaje específico, no genérico
|
|
433
|
+
- Marcar REQUERIDO con asterisco (*) y leyenda al inicio
|
|
434
|
+
- Marcar OPCIONAL explícitamente (no asumir que el usuario lo sabe)
|
|
435
|
+
- Autocompletar habilitado para datos personales (autocomplete="name", etc.)
|
|
436
|
+
- Tab order lógico (de izquierda a derecha, arriba a abajo)
|
|
437
|
+
- Formato de fecha en contexto mexicano: dd/mm/aaaa
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
## 9. Mobile First
|
|
443
|
+
|
|
444
|
+
```css
|
|
445
|
+
/* Base: mobile (320px+) */
|
|
446
|
+
.grid-empleados {
|
|
447
|
+
display: grid;
|
|
448
|
+
grid-template-columns: 1fr;
|
|
449
|
+
gap: 16px;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
/* Tablet (768px+) */
|
|
453
|
+
@media (min-width: 768px) {
|
|
454
|
+
.grid-empleados {
|
|
455
|
+
grid-template-columns: repeat(2, 1fr);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
/* Desktop (1024px+) */
|
|
460
|
+
@media (min-width: 1024px) {
|
|
461
|
+
.grid-empleados {
|
|
462
|
+
grid-template-columns: repeat(3, 1fr);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/* Área táctil mínima en mobile */
|
|
467
|
+
@media (pointer: coarse) {
|
|
468
|
+
button, a, input[type="checkbox"], input[type="radio"] {
|
|
469
|
+
min-height: 44px;
|
|
470
|
+
min-width: 44px;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
---
|
|
476
|
+
|
|
477
|
+
## 10. Anti-patrones UX Comunes
|
|
478
|
+
|
|
479
|
+
| Anti-patrón | Efecto en usuario | Solución |
|
|
480
|
+
|-------------|------------------|----------|
|
|
481
|
+
| Dark pattern: pre-marcar checkboxes de suscripción | Suscripciones no deseadas | Checkboxes desmarcados por defecto |
|
|
482
|
+
| Confirmar con "OK" y "Cancelar" sin contexto | Usuario hace clic en el incorrecto | "Eliminar expediente" y "Cancelar" |
|
|
483
|
+
| Formulario pierde datos al navegar atrás | Frustración, trabajo perdido | Guardar borrador automáticamente |
|
|
484
|
+
| Paginación sin indicar cuántos resultados hay | Usuario no sabe cuánto falta | "Mostrando 1-20 de 347 expedientes" |
|
|
485
|
+
| Spinner que gira indefinidamente | Usuario no sabe si hay error | Timeout + mensaje de error |
|
|
486
|
+
| Botón de submit duplicado | Doble envío de formulario | Deshabilitar tras primer clic |
|
|
487
|
+
| Menú desplegable para 2-3 opciones | Fricción innecesaria | Radio buttons o tabs visibles |
|
|
488
|
+
| Placeholder como label (desaparece al escribir) | Usuario olvida qué debe ir ahí | Label real + placeholder como ejemplo |
|