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.
Files changed (177) hide show
  1. package/CLAUDE.md +425 -0
  2. package/_userland/agentes/.gitkeep +0 -0
  3. package/_userland/habilidades/.gitkeep +0 -0
  4. package/agentes/accesibilidad-wcag-swl.md +683 -0
  5. package/agentes/arquitecto-swl.md +210 -0
  6. package/agentes/auto-evolucion-swl.md +408 -0
  7. package/agentes/backend-api-swl.md +442 -0
  8. package/agentes/backend-node-swl.md +439 -0
  9. package/agentes/backend-python-swl.md +469 -0
  10. package/agentes/backend-workers-swl.md +444 -0
  11. package/agentes/cloud-infra-swl.md +466 -0
  12. package/agentes/consolidador-swl.md +487 -0
  13. package/agentes/datos-swl.md +568 -0
  14. package/agentes/depurador-swl.md +301 -0
  15. package/agentes/devops-ci-swl.md +352 -0
  16. package/agentes/disenador-ui-swl.md +546 -0
  17. package/agentes/documentador-swl.md +323 -0
  18. package/agentes/frontend-angular-swl.md +603 -0
  19. package/agentes/frontend-css-swl.md +700 -0
  20. package/agentes/frontend-react-swl.md +672 -0
  21. package/agentes/frontend-swl.md +483 -0
  22. package/agentes/frontend-tailwind-swl.md +808 -0
  23. package/agentes/implementador-swl.md +235 -0
  24. package/agentes/investigador-swl.md +274 -0
  25. package/agentes/investigador-ux-swl.md +482 -0
  26. package/agentes/migrador-swl.md +389 -0
  27. package/agentes/mobile-android-swl.md +473 -0
  28. package/agentes/mobile-cross-swl.md +501 -0
  29. package/agentes/mobile-ios-swl.md +464 -0
  30. package/agentes/notificador-swl.md +886 -0
  31. package/agentes/observabilidad-swl.md +408 -0
  32. package/agentes/orquestador-swl.md +490 -0
  33. package/agentes/planificador-swl.md +222 -0
  34. package/agentes/producto-prd-swl.md +565 -0
  35. package/agentes/release-manager-swl.md +545 -0
  36. package/agentes/rendimiento-swl.md +691 -0
  37. package/agentes/revisor-codigo-swl.md +254 -0
  38. package/agentes/revisor-seguridad-swl.md +316 -0
  39. package/agentes/tdd-qa-swl.md +323 -0
  40. package/agentes/ux-disenador-swl.md +498 -0
  41. package/bin/swl-ses.js +119 -0
  42. package/comandos/swl/actualizar.md +117 -0
  43. package/comandos/swl/aprender.md +348 -0
  44. package/comandos/swl/auditar-deps.md +390 -0
  45. package/comandos/swl/autoresearch.md +346 -0
  46. package/comandos/swl/checkpoint.md +296 -0
  47. package/comandos/swl/compactar.md +283 -0
  48. package/comandos/swl/crear-skill.md +609 -0
  49. package/comandos/swl/discutir-fase.md +230 -0
  50. package/comandos/swl/ejecutar-fase.md +302 -0
  51. package/comandos/swl/evolucionar.md +377 -0
  52. package/comandos/swl/instalar.md +220 -0
  53. package/comandos/swl/mapear-codebase.md +205 -0
  54. package/comandos/swl/nuevo-proyecto.md +154 -0
  55. package/comandos/swl/planear-fase.md +221 -0
  56. package/comandos/swl/release.md +405 -0
  57. package/comandos/swl/salud.md +382 -0
  58. package/comandos/swl/verificar.md +292 -0
  59. package/habilidades/accesibilidad-a11y/SKILL.md +584 -0
  60. package/habilidades/angular-avanzado/SKILL.md +491 -0
  61. package/habilidades/angular-moderno/SKILL.md +326 -0
  62. package/habilidades/api-rest-diseno/SKILL.md +302 -0
  63. package/habilidades/api-rest-diseno/recursos/openapi-template.yaml +506 -0
  64. package/habilidades/aprendizaje-continuo/SKILL.md +369 -0
  65. package/habilidades/async-python/SKILL.md +474 -0
  66. package/habilidades/auth-patrones/SKILL.md +488 -0
  67. package/habilidades/auto-evolucion-protocolo/SKILL.md +376 -0
  68. package/habilidades/autoresearch/SKILL.md +248 -0
  69. package/habilidades/autoresearch/recursos/checklist-template.md +191 -0
  70. package/habilidades/autoresearch/scripts/calcular-score.js +88 -0
  71. package/habilidades/checklist-calidad/SKILL.md +247 -0
  72. package/habilidades/checklist-calidad/recursos/quality-report-template.md +148 -0
  73. package/habilidades/checklist-seguridad/SKILL.md +224 -0
  74. package/habilidades/checkpoints-verificacion/SKILL.md +309 -0
  75. package/habilidades/checkpoints-verificacion/recursos/checkpoint-templates.md +360 -0
  76. package/habilidades/ci-cd-pipelines/SKILL.md +583 -0
  77. package/habilidades/ci-cd-pipelines/recursos/github-actions-template.yaml +403 -0
  78. package/habilidades/cloud-aws/SKILL.md +497 -0
  79. package/habilidades/compactacion-contexto/SKILL.md +201 -0
  80. package/habilidades/contenedores-docker/SKILL.md +453 -0
  81. package/habilidades/contenedores-docker/recursos/dockerfile-template.dockerfile +160 -0
  82. package/habilidades/css-moderno/SKILL.md +463 -0
  83. package/habilidades/datos-etl/SKILL.md +486 -0
  84. package/habilidades/dependencias-auditoria/SKILL.md +293 -0
  85. package/habilidades/deprecacion-migracion/SKILL.md +485 -0
  86. package/habilidades/design-tokens/SKILL.md +519 -0
  87. package/habilidades/discutir-fase/SKILL.md +167 -0
  88. package/habilidades/diseno-responsivo/SKILL.md +326 -0
  89. package/habilidades/django-experto/SKILL.md +395 -0
  90. package/habilidades/doc-sync/SKILL.md +259 -0
  91. package/habilidades/ejecutar-fase/SKILL.md +199 -0
  92. package/habilidades/estructura-proyecto-claude/SKILL.md +459 -0
  93. package/habilidades/estructura-proyecto-claude/recursos/claude-md-template.md +261 -0
  94. package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +213 -0
  95. package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +77 -0
  96. package/habilidades/estructura-proyecto-claude/recursos/variantes-por-stack.md +177 -0
  97. package/habilidades/event-driven/SKILL.md +580 -0
  98. package/habilidades/extractor-de-aprendizajes/SKILL.md +234 -0
  99. package/habilidades/fastapi-experto/SKILL.md +368 -0
  100. package/habilidades/frontend-avanzado/SKILL.md +555 -0
  101. package/habilidades/git-worktrees-paralelo/SKILL.md +246 -0
  102. package/habilidades/iam-secretos/SKILL.md +511 -0
  103. package/habilidades/instalar-sistema/SKILL.md +140 -0
  104. package/habilidades/kubernetes-orquestacion/SKILL.md +549 -0
  105. package/habilidades/manejo-errores/SKILL.md +512 -0
  106. package/habilidades/mapear-codebase/SKILL.md +199 -0
  107. package/habilidades/microservicios/SKILL.md +473 -0
  108. package/habilidades/mobile-flutter/SKILL.md +566 -0
  109. package/habilidades/mobile-react-native/SKILL.md +493 -0
  110. package/habilidades/monitoring-alertas/SKILL.md +447 -0
  111. package/habilidades/node-experto/SKILL.md +521 -0
  112. package/habilidades/notificaciones-multicanal/SKILL.md +448 -0
  113. package/habilidades/notificaciones-multicanal/recursos/config-template.json +115 -0
  114. package/habilidades/nuevo-proyecto/SKILL.md +183 -0
  115. package/habilidades/patrones-python/SKILL.md +381 -0
  116. package/habilidades/performance-baseline/SKILL.md +243 -0
  117. package/habilidades/planear-fase/SKILL.md +184 -0
  118. package/habilidades/postgresql-experto/SKILL.md +379 -0
  119. package/habilidades/react-experto/SKILL.md +434 -0
  120. package/habilidades/react-optimizacion/SKILL.md +328 -0
  121. package/habilidades/release-semver/SKILL.md +226 -0
  122. package/habilidades/release-semver/scripts/generar-changelog.sh +238 -0
  123. package/habilidades/sql-optimizacion/SKILL.md +314 -0
  124. package/habilidades/tailwind-experto/SKILL.md +412 -0
  125. package/habilidades/tdd-workflow/SKILL.md +267 -0
  126. package/habilidades/testing-python/SKILL.md +350 -0
  127. package/habilidades/threat-model-lite/SKILL.md +218 -0
  128. package/habilidades/typescript-avanzado/SKILL.md +454 -0
  129. package/habilidades/ux-diseno/SKILL.md +488 -0
  130. package/habilidades/validacion-ci-sistema/SKILL.md +543 -0
  131. package/habilidades/validacion-ci-sistema/scripts/validar-sistema.sh +286 -0
  132. package/habilidades/verificar-trabajo/SKILL.md +208 -0
  133. package/habilidades/wireframes-flujos/SKILL.md +396 -0
  134. package/habilidades/workflow-claude-code/SKILL.md +359 -0
  135. package/hooks/calidad-pre-commit.js +578 -0
  136. package/hooks/escaneo-secretos.js +302 -0
  137. package/hooks/extraccion-aprendizajes.js +550 -0
  138. package/hooks/linea-estado.js +249 -0
  139. package/hooks/monitor-contexto.js +230 -0
  140. package/hooks/proteccion-rutas.js +249 -0
  141. package/manifiestos/hooks-config.json +41 -0
  142. package/manifiestos/modulos.json +318 -0
  143. package/manifiestos/perfiles.json +189 -0
  144. package/package.json +45 -0
  145. package/plantillas/PROJECT.md +122 -0
  146. package/plantillas/REQUIREMENTS.md +132 -0
  147. package/plantillas/ROADMAP.md +143 -0
  148. package/plantillas/STATE.md +109 -0
  149. package/plantillas/research/ARCHITECTURE.md +220 -0
  150. package/plantillas/research/FEATURES.md +175 -0
  151. package/plantillas/research/PITFALLS.md +299 -0
  152. package/plantillas/research/STACK.md +233 -0
  153. package/plantillas/research/SUMMARY.md +165 -0
  154. package/plugin.json +144 -0
  155. package/reglas/accesibilidad.md +269 -0
  156. package/reglas/api-diseno.md +400 -0
  157. package/reglas/arquitectura.md +183 -0
  158. package/reglas/cloud-infra.md +247 -0
  159. package/reglas/docs.md +245 -0
  160. package/reglas/estilo-codigo.md +179 -0
  161. package/reglas/git-workflow.md +186 -0
  162. package/reglas/performance.md +195 -0
  163. package/reglas/pruebas.md +159 -0
  164. package/reglas/seguridad.md +151 -0
  165. package/reglas/skills-estandar.md +473 -0
  166. package/scripts/actualizar.js +51 -0
  167. package/scripts/desinstalar.js +86 -0
  168. package/scripts/doctor.js +222 -0
  169. package/scripts/inicializar.js +89 -0
  170. package/scripts/instalador.js +333 -0
  171. package/scripts/lib/detectar-runtime.js +177 -0
  172. package/scripts/lib/estado.js +112 -0
  173. package/scripts/lib/hooks-settings.js +283 -0
  174. package/scripts/lib/manifiestos.js +138 -0
  175. package/scripts/lib/seguridad.js +160 -0
  176. package/scripts/publicar.js +209 -0
  177. 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 |