AgentSkillsCN

aurora-ux

评估并优化 Aurora 表单的用户体验。触发条件:当您需要评估 UX、重新排列字段,或审视表单流程时。

SKILL.md
--- frontmatter
name: aurora-ux
description: >
    Evalúa y mejora la experiencia de usuario de formularios Aurora. Trigger:
    Cuando necesites evaluar UX, reordenar campos, o revisar el flujo de un
    formulario.
license: MIT
metadata:
    author: aurora
    version: '1.0'
    auto_invoke: 'UX review, field ordering, form flow, user experience'
allowed-tools: Read, Edit, Glob, Grep

Aurora UX Skill

Reglas de experiencia de usuario para formularios Aurora. Este skill complementa aurora-layout (estructura visual) con el enfoque en el FLUJO COGNITIVO del usuario.

Cuándo Usar

  • Evaluar la experiencia de usuario de un formulario existente
  • Mejorar el flujo de completado de un formulario
  • Reordenar campos para optimizar la UX
  • Revisar si un formulario sigue buenas prácticas de usabilidad

Principios de Ordenación de Campos

1. Campos Requeridos Primero

Dentro de cada sección semántica, los campos required van ANTES que los opcionales.

code
✅ CORRECTO                    ❌ INCORRECTO
┌─────────────────────┐        ┌─────────────────────┐
│ Name* (required)    │        │ Description         │
│ Code* (required)    │        │ Notes               │
│ Description         │        │ Name* (required)    │
│ Notes               │        │ Code* (required)    │
└─────────────────────┘        └─────────────────────┘

2. Flujo Natural de Información

Orden lógico para el usuario - lo que "ya sabe" antes de lo que "debe decidir":

code
1. Identificadores     → Código, ID externo (lo trae de otro sistema)
2. Datos básicos       → Nombre, descripción (lo sabe de antemano)
3. Clasificación       → Tipo, categoría (debe elegir)
4. Detalles            → Campos específicos del dominio
5. Contacto            → Email, teléfono (si aplica)
6. Configuración       → Flags, opciones (decisiones finales)
7. Estado              → isActive (usualmente al final)

3. Progressive Disclosure

Campos avanzados u opcionales en expansion panels:

html
<!-- Campos principales visibles -->
<mat-form-field class="col-8">Nombre</mat-form-field>
<mat-form-field class="col-4">Código</mat-form-field>

<!-- Configuración avanzada colapsada -->
<mat-expansion-panel>
    <mat-expansion-panel-header>
        <mat-panel-title>Configuración avanzada</mat-panel-title>
    </mat-expansion-panel-header>
    <!-- Campos opcionales aquí -->
</mat-expansion-panel>

4. Dependencias de Campos

Campos dependientes DEBAJO o AL LADO de su "padre":

html
<!-- País primero (padre) -->
<mat-form-field class="col-4">
    <mat-select formControlName="countryId">...</mat-select>
</mat-form-field>

<!-- Estado/Provincia después (dependiente) -->
<mat-form-field class="col-4">
    <mat-select
        [disabled]="!fg.get('countryId').value"
        formControlName="stateId"
    >
        ...
    </mat-select>
</mat-form-field>

Matriz de Decisión: Orden de Campos

CriterioPesoEjemplo
Es requerido+3name (required) antes de description
Es identificador+2code antes de email
Usuario ya lo sabe+2type (elige) antes de calculatedField
Afecta otros campos+1country antes de state (dependencia)
Es configuración/setting-1isActive al final de su sección
Es campo de auditoría-2createdAt, updatedAt readonly o hidden

Aplicando la Matriz

code
Campo: name        → required (+3) + identificador (+2) = 5  → PRIMERO
Campo: code        → required (+3) + identificador (+2) = 5  → PRIMERO
Campo: type        → required (+3) = 3                       → SEGUNDO
Campo: description → opcional = 0                            → TERCERO
Campo: isActive    → config (-1) = -1                        → CUARTO
Campo: createdAt   → auditoría (-2) = -2                     → ÚLTIMO/HIDDEN

Reglas por Tipo de Formulario

Formulario de Alta (Create)

  • Autofocus en primer campo editable
  • Pre-llenar defaults sensatos (isActive = true)
  • Campos calculados ocultos o readonly
  • Validación en blur para campos críticos
typescript
// En ngOnInit o después de crear el form
this.fg.get('name')?.markAsTouched(); // O usar cdkFocusInitial en el input

Formulario de Edición (Edit)

  • Mostrar claramente qué campos son editables vs readonly
  • Preservar valores originales hasta guardar
  • Indicar cambios no guardados si hay modificaciones

Formulario de Filtros

  • Campos más usados primero
  • Permitir limpiar todos los filtros con un botón
  • Aplicar en tiempo real o con botón según cantidad de campos

Feedback de Validación

Cuándo Mostrar Errores

MomentoUsar para
On blurCampos críticos (email, código único)
On submitValidaciones complejas, campos cruzados
En tiempo realContadores de caracteres, formatos

Patrón de Error

html
<mat-form-field class="col-6">
    <mat-label>Email</mat-label>
    <input
        type="email"
        matInput
        formControlName="email"
    />
    <mat-error>
        @if (fg.get('email')?.hasError('required')) { {{
        t('validation.Required') }} } @if (fg.get('email')?.hasError('email')) {
        {{ t('validation.InvalidEmail') }} }
    </mat-error>
</mat-form-field>

Checklist de Revisión UX

Antes de aprobar un formulario, verificar:

Estructura y Orden

  • ¿Los campos requeridos están primero en cada sección?
  • ¿El flujo sigue un orden lógico para el usuario?
  • ¿Los campos relacionados están agrupados?
  • ¿Las dependencias están claras (padre → hijo)?

Interacción

  • ¿Hay feedback claro de errores de validación?
  • ¿Los campos con dependencias se habilitan/deshabilitan correctamente?
  • ¿El formulario es navegable con Tab?
  • ¿El primer campo tiene autofocus en modo Create?

Claridad

  • ¿Los labels son claros y concisos?
  • ¿Hay hints/placeholders donde ayudan?
  • ¿Los campos required están marcados visualmente?
  • ¿Los campos readonly se distinguen de los editables?

Opcionales

  • ¿Los campos avanzados están en expansion panel?
  • ¿Hay defaults sensatos pre-llenados?

Anti-patrones a Evitar

Anti-patrónPor qué es maloSolución
Campos required al finalUsuario completa todo y luego vuelve atrásRequeridos primero en cada sección
Todo en una sola columnaDesperdicia espacio, scroll excesivoUsar grid de 12 columnas
Campos sin relación juntosConfunde al usuarioAgrupar por dominio semántico
Labels ambiguosEl usuario no sabe qué ponerLabels descriptivos + hints
Validación solo al submitFrustración al finalValidar en blur para campos críticos
Campos ocultos sin contextoUsuario no sabe que existenMostrar disabled o en panel colapsable
Dependencias sin feedbackUsuario no entiende por qué está disabledTooltip o texto explicativo
Tabs order incorrectoNavegación por teclado confusaRevisar orden natural de campos

Gestión de Foco

Autofocus en Create

html
<input
    matInput
    formControlName="name"
    cdkFocusInitial
/>

Tab Order

El orden de Tab debe seguir el orden visual. Si usas CSS para reordenar visualmente, asegúrate de que el HTML mantenga el orden lógico.

html
<!-- ✅ CORRECTO: orden HTML = orden visual = orden Tab -->
<input formControlName="name" />
<!-- Tab 1 -->
<input formControlName="code" />
<!-- Tab 2 -->
<input formControlName="email" />
<!-- Tab 3 -->

Estados de Campos

Campo Deshabilitado por Dependencia

html
<mat-form-field class="col-4">
    <mat-label>Estado/Provincia</mat-label>
    <mat-select formControlName="stateId">
        @for (state of filteredStates; track state.id) {
        <mat-option [value]="state.id">{{ state.name }}</mat-option>
        }
    </mat-select>
    @if (!fg.get('countryId')?.value) {
    <mat-hint>Seleccione un país primero</mat-hint>
    }
</mat-form-field>

Campo Calculado

html
<mat-form-field class="col-4">
    <mat-label>Total</mat-label>
    <input
        [value]="calculatedTotal"
        matInput
        readonly
    />
    <mat-hint>Calculado automáticamente</mat-hint>
</mat-form-field>

Relación con Otros Skills

SkillQué cubreCuándo usarlo con aurora-ux
aurora-layoutGrid, anchos, seccionesSIEMPRE - UX define orden, layout define estructura
aurora-componentsComponentes específicosCuando elijas qué componente usar
aurora-developmentLógica de formulariosPara implementar las reglas de UX

Ejemplo de Evaluación UX

Formulario Original (problemas)

code
┌─────────────────────────────────────────────────────────┐
│ [Description: col-12]              ← Opcional primero   │
│ [isActive: col-4] [Notes: col-8]   ← Config mezclada    │
│ [Name*: col-8] [Code*: col-4]      ← Required al final  │
└─────────────────────────────────────────────────────────┘

Formulario Corregido

code
┌─────────────────────────────────────────────────────────┐
│ [Code*: col-4] [Name*: col-8]      ← Required primero   │
│ [Description: col-12]              ← Opcional después   │
│ [Notes: col-12]                    ← Opcional después   │
│ [isActive: col-4]                  ← Config al final    │
└─────────────────────────────────────────────────────────┘

Recursos

  • Layout: Consultar aurora-layout para reglas de grid y secciones
  • Componentes: Consultar aurora-components para inputs específicos