metis-desk/docs/auditoria-ayuda-contextual-dialogos.md
David ddebfadc1c feat: add contextual help components and dialog support
- Introduced `ContextHelpContent` for displaying contextual help with title, description, examples, and guidance.
- Created `DialogHelp` component to manage help dialogs, including popover and panel presentations.
- Implemented `useDialogHelpLayout` hook for handling dialog layout and state management.
- Added context for dialog help management with `DialogHelpContext` and `DialogHelpLabelsContext`.
- Developed utility functions for determining dialog help presentation modes.
- Included tests for dialog help functionality and layout behavior.
- Created a Python script for auditing contextual help in real forms.
2026-10-25 17:47:54 +01:00

57 KiB
Raw Blame History

Auditoría de ayuda contextual en diálogos

Fecha: 25 de octubre de 2026. Alcance: código frontend activo de modules/*/src/web y componentes propios de packages/rdx-ui/src. Se excluyen vendor, archive y fixtures de navegador.

Resultado e infraestructura

Se han auditado 95 componentes modales de módulos y 7 constructores/adaptadores compartidos (102 unidades). El recuento es por componente, no por variantes de alta/edición ni por diálogos anidados. 59 componentes de módulo contienen ayuda: 58 adoptan el patrón bajo demanda y 1 conserva su consulta de ayuda dedicada. Además, el constructor compartido FieldPickerDialog migra su ayuda breve y cubre los dos adaptadores de catálogo ya contabilizados. Las demás 36 unidades de módulos y 6 compartidas no tienen ayuda complementaria propia.

La búsqueda incluye FormDialog, DialogContent, ConfirmDeleteDialog, AlertDialog, Sheet, Drawer, formularios, wizards, pickers, bloques de información y claves de traducción. Se contrastó el inventario previo de modales con las fuentes actuales; los nombres de fichero no determinaron el alcance. Se siguieron imports y reexports de componentes para localizar ayuda en formularios descendientes, deteniendo el recorrido en diálogos anidados. Las variantes suministradas mediante callbacks se revisaron en sus consumidores.

Encontrados: FormDialog, FormBody, FormActions, ContextHelp, FormHelp, PickerHelp, EntityHelp, CatalogHelp, SupportHelp y ProcessHelp. Las primitivas instaladas son shadcn Base UI 1.8.0, estilo Vega. No existe un segundo sistema Radix que deba integrarse ni se ha modificado vendor.

Decisiones

  • Se amplía FormDialog mediante contexto y slots DOM. DialogHelp declara contenido traducido o React en cualquier descendiente. Los portales sitúan el botón en la cabecera y el contenido en el mismo diálogo, conservando sus contextos. No se registra contenido React mediante efectos ni se replica en estado.
  • ContextHelp y FormHelp aprovechan el slot cuando están dentro de FormDialog; fuera conservan el contenido visible. Así se migran todos sus consumidores sin elevar traducciones ni duplicar configuraciones en cada editor/alta rápida. PickerHelp declara compact explícitamente.
  • Auto significa ayuda estructurada (descripción, ámbito, ejemplos y orientación), equivalente a expanded. Compact se declara para una explicación breve; no se mide texto del DOM.
  • ResizeObserver mide la superficie efectiva. Compact usa Popover desde 30rem; auto/expanded usan panel desde 60rem (40rem de formulario + 20rem de ayuda). En menor capacidad se usa vista interna. Las comparaciones usan el tamaño raíz de fuente; no dependen solo del viewport. Un diálogo pequeño en escritorio también utiliza vista interna.
  • El formulario sigue montado en vista interna, con visibility:hidden, inert y aria-hidden; mantiene su geometría y sus datos. La ayuda ocupa esa misma región. Sus acciones no están disponibles mientras se consulta la vista interna. El panel no ensancha el diálogo ni crea otra capa modal.
  • Escape se intercepta en el contrato onOpenChange de Base UI mediante reason=escape-key y cancel(); cierra la ayuda antes que el diálogo. X conserva el cierre de Base UI. El cierre de ayuda devuelve foco al botón; al abrir o cambiar de modalidad se enfoca el encabezado de ayuda.
  • Las etiquetas genéricas se traducen en apps/web a través de core.dialogHelp y se suministran a rdx-ui, que permanece independiente de i18next y del dominio.

Criterios y excepciones

Se migran exclusivamente bloques complementarios de ContextHelp/FormHelp y la ayuda general de PickerHelp. Se conserva íntegramente descripción, ámbito, listas plegables, ejemplos, orientación e iconos personalizados. No se modifica ninguna traducción de ayuda previa ni contratos HTTP, modelos o persistencia.

Categoría Decisión y ejemplos
Ayuda general complementaria Bajo demanda: ContextHelp/FormHelp, EntityHelp, CatalogHelp, ProcessHelp y SupportHelp.
Instrucciones de campo Visibles: choicesHelp, addressHelp, instrucciones de plantilla/resolución, licencia, límites de nombre, fecha de alta y estado técnico, carga de imágenes y formatos.
Consecuencias y seguridad Visibles: desactivación de personas/sedes/departamentos, retirada de identidad local, avisos de alta global/local y datos creados aunque se cancele la relación.
Validación y transporte Visibles: InventoryFeedback, CompanyFeedback, errores de campo, concurrencia, permisos, reintento y fallos de guardado/refresco.
Confirmaciones destructivas Se conserva descripción/confirmación visible en ConfirmDeleteDialog y editores de cierre.
Vacío y orientación operativa Se conservan EmptyState, selección/destino, contadores y restricciones de selección.
Consulta dedicada de ayuda AccessHelpDialog mantiene EntityHelp placement=inline visible: ocultarlo tras otro ? dejaría vacía su tarea principal. Es la única excepción a la migración de bloques generales.

Los títulos y descripciones de los diálogos de consulta, historiales, selección de compañía y software del puesto son contenido funcional. El texto requiredColumnHelp de configuración de columnas explica una restricción activa y continúa visible. No se añade ? por el mero hecho de contener texto informativo.

Inventario final

“Migrado” acredita integración en el sistema compartido y revisión estática; la validación interactiva representativa se detalla aparte y no implica haber abierto todas las variantes. Las columnas de contenido apuntan a las declaraciones originales con sus claves conservadas.

assets

Componente / archivo Composición Ayuda y ubicación anterior Longitud y propuesta Particularidades / estado
EndRelationshipDialog FormDialog Sin ayuda complementaria propia — acciones de formulario · Auditado · conserva contenido funcional
RelationshipEditorDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario · Migrado · contenido conservado
WorkstationAssetCreateDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
AssetDetailDialog FormDialog Sin ayuda complementaria propia — altura estable, tamaño variable/amplio · Auditado · conserva contenido funcional
AssetPickerDialog FormDialog Sin ayuda complementaria propia — altura estable, acciones de formulario, tamaño variable/amplio · Auditado · conserva contenido funcional
AssetEditorDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista altura estable, acciones de formulario · Migrado · contenido conservado
DeleteAssetDialog ConfirmDeleteDialog Sin ayuda complementaria propia — Auditado · conserva contenido funcional
DeleteBrandDialog FormDialog Sin ayuda complementaria propia — acciones de formulario · Auditado · conserva contenido funcional
BrandEditorDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario · Migrado · contenido conservado
DeleteCatalogDefinitionDialog FormDialog Sin ayuda complementaria propia — acciones de formulario · Auditado · conserva contenido funcional
CatalogDefinitionDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista tamaño variable/amplio · Migrado · contenido conservado
CatalogEditorDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
CatalogFieldCreateDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario · Migrado · contenido conservado
CatalogFieldPickerDialog FieldPickerDialog PickerHelp · bloque en cuerpo o antes de acciones Breve · Popover / vista Migrado · contenido conservado
CatalogRelationCreateDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario · Migrado · contenido conservado
CatalogTemplateCreateDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
DirectoryMembershipEditor FormDialog FormHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista altura estable, acciones de formulario · Migrado · contenido conservado
EndDirectoryMembershipDialog ConfirmDeleteDialog Sin ayuda complementaria propia — altura estable · Auditado · conserva contenido funcional
DirectoryDomainPicker FormDialog Sin ayuda complementaria propia — altura estable · Auditado · conserva contenido funcional
InfrastructureEditorDialog FormDialog FormHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista altura estable, acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
PublicationEditor FormDialog FormHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista altura estable, acciones de formulario · Migrado · contenido conservado
DeleteRecordDialog ConfirmDeleteDialog Sin ayuda complementaria propia — Auditado · conserva contenido funcional
SupportHistoryDialog FormDialog Sin ayuda complementaria propia — Auditado · conserva contenido funcional
AssetSupportManagementDialog FormDialog Sin ayuda complementaria propia — altura estable · Auditado · conserva contenido funcional
SupportConnectionEditorDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario · Migrado · contenido conservado
SupportResourceCreateDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
WorkstationAssetAddDialog FormDialog PickerHelp · bloque en cuerpo o antes de acciones Breve · Popover / vista altura estable, acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
WorkstationHistoryDialog FormDialog Sin ayuda complementaria propia — altura estable, tamaño variable/amplio · Auditado · conserva contenido funcional
WorkstationEditorDialog FormDialog FormHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista altura estable, acciones de formulario · Migrado · contenido conservado
WorkstationLifecycleDialog ConfirmDeleteDialog Sin ayuda complementaria propia — Auditado · conserva contenido funcional

companies

Componente / archivo Composición Ayuda y ubicación anterior Longitud y propuesta Particularidades / estado
AccessQuickEditor FormDialog EntityHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
QuickCreateDialog FormDialog EntityHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario · Migrado · contenido conservado
AccessHelpDialog FormDialog EntityHelp · bloque en cuerpo o antes de acciones Contenido principal visible Consulta dedicada visible · excepción justificada
AccessHistory FormDialog Sin ayuda complementaria propia — Auditado · conserva contenido funcional
AccessEditorDialog FormDialog ContextHelp; EntityHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista altura estable, acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
ApplicationQuickEditor FormDialog FormHelp; ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
ApplicationHistoryDialog FormDialog Sin ayuda complementaria propia — tamaño variable/amplio · Auditado · conserva contenido funcional
ApplicationConfigurationEditorDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista altura estable, acciones de formulario · Migrado · contenido conservado
AssignmentHistoryDialog FormDialog Sin ayuda complementaria propia — Auditado · conserva contenido funcional
AssignmentEditorDialog FormDialog EntityHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario · Migrado · contenido conservado
CertificateQuickEditor FormDialog FormHelp; ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
CertificateHistoryDialog FormDialog Sin ayuda complementaria propia — tamaño variable/amplio · Auditado · conserva contenido funcional
CertificateConfigurationEditorDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
InventoryQuickCreateDialog FormDialog EntityHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario · Migrado · contenido conservado
CompanyEditorDialog FormDialog EntityHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario · Migrado · contenido conservado
DashboardQuickCreate FormDialog EntityHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario · Migrado · contenido conservado
DashboardDetailsDialog FormDialog Sin ayuda complementaria propia — altura estable, tamaño variable/amplio · Auditado · conserva contenido funcional
DepartmentEditorDialog FormDialog EntityHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario · Migrado · contenido conservado
FolderQuickEditor FormDialog FormHelp; ContextHelp; EntityHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
FolderMappingHistoryDialog FormDialog Sin ayuda complementaria propia — altura estable, tamaño variable/amplio · Auditado · conserva contenido funcional
FolderMappingEditorDialog FormDialog FormHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista altura estable, acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
LocalIdentityEditor FormDialog FormHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista altura estable, acciones de formulario · Migrado · contenido conservado
MailQuickEditor FormDialog ContextHelp; FormHelp; ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
MailConfigurationHistoryDialog FormDialog Sin ayuda complementaria propia — tamaño variable/amplio · Auditado · conserva contenido funcional
MailConfigurationEditorDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
MailboxUseEditorDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario · Migrado · contenido conservado
MailboxCreateDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario · Migrado · contenido conservado
PersonEditorDialog FormDialog EntityHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario · Migrado · contenido conservado
PrinterProfileCreateDialog FormDialog FormHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
PrinterHistoryDialog FormDialog Sin ayuda complementaria propia — tamaño variable/amplio · Auditado · conserva contenido funcional
PrinterConfigurationEditorDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
ProcessTemplateEditorDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
ProcessQuickCreateDialog FormDialog EntityHelp; ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
ProcessStartDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
ProcessEditDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
RemoteQuickEditor FormDialog EntityHelp; ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
RemoteConnectionHistoryDialog FormDialog Sin ayuda complementaria propia — tamaño variable/amplio · Auditado · conserva contenido funcional
RemoteConnectionEditorDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
ConfigurationQuickEditor FormDialog EntityHelp; ContextHelp; ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
DeleteRecordDialog ConfirmDeleteDialog Sin ayuda complementaria propia — Auditado · conserva contenido funcional
SiteDeleteDialog ConfirmDeleteDialog Sin ayuda complementaria propia — Auditado · conserva contenido funcional
SiteEditorDialog FormDialog EntityHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario · Migrado · contenido conservado
SoftwareResourceCreateDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
SoftwareHistoryDialog FormDialog Sin ayuda complementaria propia — tamaño variable/amplio · Auditado · conserva contenido funcional
SoftwareInstallationEditorDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista altura estable, acciones de formulario · Migrado · contenido conservado
TeleworkAuthorizationHistoryDialog FormDialog Sin ayuda complementaria propia — Auditado · conserva contenido funcional
TeleworkAuthorizationEditorDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario · Migrado · contenido conservado
WorkProfileHistoryDialog FormDialog Sin ayuda complementaria propia — tamaño variable/amplio · Auditado · conserva contenido funcional
WorkProfileEditorDialog FormDialog FormHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista altura estable, acciones de formulario · Migrado · contenido conservado
WorkProfileLifecycleDialog ConfirmDeleteDialog Sin ayuda complementaria propia — Auditado · conserva contenido funcional
WorkspaceSettingsDialog FormDialog Sin ayuda complementaria propia — Auditado · conserva contenido funcional
WorkspaceMobileSheet SheetContent Sin ayuda complementaria propia — Auditado · conserva contenido funcional
WorkstationSoftwareDialog FormDialog Sin ayuda complementaria propia — altura estable, tamaño variable/amplio · Auditado · conserva contenido funcional

resources

Componente / archivo Composición Ayuda y ubicación anterior Longitud y propuesta Particularidades / estado
ApplicationCoincidencesDialog FormDialog Sin ayuda complementaria propia — altura estable · Auditado · conserva contenido funcional
CatalogDefinitionDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista tamaño variable/amplio · Migrado · contenido conservado
CatalogEditorDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
CatalogFieldCreateDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario · Migrado · contenido conservado
CatalogFieldPickerDialog FieldPickerDialog PickerHelp · bloque en cuerpo o antes de acciones Breve · Popover / vista Migrado · contenido conservado
CatalogTemplateCreateDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
GlobalApplicationEditorDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista altura estable, acciones de formulario · Migrado · contenido conservado
ResourceDetailDialog FormDialog Sin ayuda complementaria propia — altura estable, tamaño variable/amplio · Auditado · conserva contenido funcional
DeleteResourceDialog ConfirmDeleteDialog Sin ayuda complementaria propia — Auditado · conserva contenido funcional
ResourceEditorDialog FormDialog ContextHelp · bloque en cuerpo o antes de acciones Extensa · panel / vista altura estable, acciones de formulario · Migrado · contenido conservado

identity

Componente / archivo Composición Ayuda y ubicación anterior Longitud y propuesta Particularidades / estado
AccountPasswordDialog FormDialog Sin ayuda complementaria propia — acciones de formulario · Auditado · conserva contenido funcional
UserEditorDialog FormDialog Sin ayuda complementaria propia — acciones de formulario · Auditado · conserva contenido funcional

rdx-ui

Componente / archivo Composición Ayuda y ubicación anterior Longitud y propuesta Particularidades / estado
ConfirmDeleteDialog FormDialog Sin ayuda complementaria propia — acciones de formulario · Auditado · conserva contenido funcional
EntityTableColumnsDialog FormDialog Sin ayuda complementaria propia — altura estable · Auditado · conserva contenido funcional
FieldPickerDialog FormDialog PickerHelp · bloque en cuerpo o antes de acciones Breve · Popover / vista altura estable, acciones de formulario, tamaño variable/amplio · Migrado · contenido conservado
FormDialog DialogContent Sin ayuda complementaria propia — acciones de formulario, tamaño variable/amplio · Auditado · conserva contenido funcional
OptionPickerDialog FormDialog Sin ayuda complementaria propia — altura estable, acciones de formulario · Auditado · conserva contenido funcional
OptionSelectionField OptionPickerDialog Sin ayuda complementaria propia — Auditado · conserva contenido funcional
RemoteOptionPicker FormDialog Sin ayuda complementaria propia — altura estable, acciones de formulario · Auditado · conserva contenido funcional

En AccessQuickEditor, el callback NestedAccessForm lo aporta AccessForm: las variantes de cuenta/acceso utilizan EntityHelp y la variante recurso utiliza ResourceEditor/ContextHelp. Comparten el contexto del diálogo activo; sus altas anidadas reciben otro FormDialog.

Declaraciones y claves conservadas

Las traducciones existentes se siguen resolviendo en sus namespaces originales (assets, companies, access, resources). Los títulos, descripciones, ámbitos, ejemplos y orientación se conservan en las mismas expresiones JSX.

Archivo de declaración Expresiones de contenido
modules/assets/src/web/asset-relationships/shared/ui/relationship-form.tsx t("relationshipHelp"); t("relationshipExample"); t("examplesLabel"); t("relationshipGuidance"); t("helpTitle")
modules/assets/src/web/assets/shared/ui/asset-form.tsx t("assetDescription"); t("assetExamples"); t("examplesLabel"); t("assetGuidance"); t("assetScope"); t("helpTitle")
modules/assets/src/web/brands/shared/ui/brand-form.tsx t("brands.help"); t("brands.examples"); t("examplesLabel"); t("brands.guidance"); t("globalHelp"); t("helpTitle")
modules/assets/src/web/catalog/shared/ui/catalog-help.tsx t(`${kind}Description`); t(`${kind}Examples`); t("examplesLabel"); t(`${kind}Guidance`); t(scope === "global" ? "globalHelp" : "companyHelp"); t("helpTitle")
modules/assets/src/web/directory-memberships/manage/ui/directory-membership-editor.tsx t("directoryUi.help"); t("directoryUi.example"); t("directoryUi.examples"); t("directoryUi.guidance"); t("directoryUi.helpTitle")
modules/assets/src/web/infrastructure/shared/ui/infrastructure-editor-dialog.tsx t("infrastructure.help"); t("infrastructure.examples"); t("infrastructure.examplesLabel"); t("infrastructure.guidance"); t("infrastructure.helpTitle")
modules/assets/src/web/network-share-publications/manage/ui/publication-editor.tsx t("shareUi.help"); t("shareUi.example"); t("shareUi.examples"); t( operation.action === "transfer" ? "shareUi.transferHelp" : operation.action === "end" ? "shareUi.endHelp" : "shareUi.publishHelp" ); t("shareUi.documentary"); t("shareUi.helpTitle")
modules/assets/src/web/support-connections/shared/ui/support-help.tsx t("support.description"); t("support.examples"); t("support.examplesLabel"); t("support.guidance"); t("support.scope"); t("support.help")
modules/assets/src/web/workstations/associate-assets/ui/workstation-asset-add-dialog.tsx t("workstationAdd.help"); t("workstationAdd.helpLabel"); t("workstationAdd.title")
modules/assets/src/web/workstations/shared/ui/workstation-form.tsx t("workstationDescription"); t("workstationExamples"); t("examplesLabel"); t("workstationGuidance"); t("workstationScope"); t("helpTitle")
modules/companies/src/web/access/help/ui/entity-help.tsx t(`helpContent.${kind}.description`); t(`helpContent.${kind}.examples`); t("helpExamples"); t(`helpContent.${kind}.guidance`); catalogue && scope ? t(scope === "global" ? "helpGlobalScope" : "helpCompanyScope") : undefined; t("helpTitle")
modules/companies/src/web/application-configurations/shared/ui/application-configuration-form.tsx t("applications.description"); t("applications.examples"); t("mail.examplesLabel"); t("applications.guidance"); t("applications.scope"); t("applications.help")
modules/companies/src/web/certificate-configurations/shared/ui/certificate-configuration-form.tsx t("certificates.description"); t("certificates.examples"); t("mail.examplesLabel"); t("certificates.guidance"); t("certificates.scope"); t("certificates.help")
modules/companies/src/web/folder-mappings/shared/ui/folder-mapping-form.tsx t("folders.description"); t("folders.examples"); t("mail.examplesLabel"); t("folders.guidance"); ```${t("folders.scope"); t("folders.help")``
modules/companies/src/web/local-identity-environments/manage/ui/local-identity-editor.tsx t("localIdentity.description"); t("localIdentity.examples"); t("mail.examplesLabel"); t("localIdentity.immutable"); t("localIdentity.scope"); t("localIdentity.help")
modules/companies/src/web/mail-configurations/shared/ui/mail-configuration-form.tsx t("mail.description"); t("mail.examples"); t("mail.examplesLabel"); t("mail.guidance"); t("mail.scope"); t("mail.help")
modules/companies/src/web/mailbox-uses/shared/ui/mailbox-use-form.tsx t("mailbox.useDescription"); t("mailbox.useExamples"); t("mail.examplesLabel"); t("mailbox.useGuidance"); t("mailbox.useHelp")
modules/companies/src/web/printer-configurations/shared/ui/printer-configuration-form.tsx t("printers.description"); t("printers.examples"); t("mail.examplesLabel"); t("printers.guidance"); t("printers.scope"); t("printers.help")
modules/companies/src/web/processes/shared/ui/process-help.tsx t(`${prefix}.description`); t(`${prefix}.examples`); t("mail.examplesLabel"); t(`${prefix}.guidance`); t(`${prefix}.scope`); t(`${prefix}.title`)
modules/companies/src/web/remote-connections/shared/ui/remote-connection-form.tsx t("remote.description"); t("remote.examples"); t("mail.examplesLabel"); t("remote.guidance"); t("remote.scope"); t("remote.help")
modules/companies/src/web/software-installations/shared/ui/software-installation-form.tsx t("software.description"); t("software.examples"); t("mail.examplesLabel"); t("software.help"); t("applications.help")
modules/companies/src/web/telework-authorizations/shared/ui/telework-authorization-form.tsx t("telework.description"); t("telework.examples"); t("mail.examplesLabel"); t("telework.guidance"); t("telework.scope"); t("telework.help")
modules/companies/src/web/work-profiles/shared/ui/work-profile-form.tsx t("profiles.description"); t("profiles.examples"); t("profiles.examplesLabel"); t("profiles.guidance"); t("profiles.scope"); t("profiles.help")
modules/resources/src/web/catalog/shared/ui/catalog-help.tsx t(`${kind}Description`); t(`${kind}Examples`); t("examplesLabel"); t(`${kind}Guidance`); t(scope === "global" ? "globalHelp" : "companyHelp"); t("helpTitle")
modules/resources/src/web/global-applications/shared/ui/global-application-form.tsx t("global.formDescription"); t("global.formExamples"); t("examplesLabel"); t("global.formGuidance"); t("global.formScope"); t("helpTitle")
modules/resources/src/web/resources/shared/ui/resource-form.tsx t(`${helpPrefix}Description`); t(`${helpPrefix}Examples`); t("examplesLabel"); t(`${helpPrefix}Guidance`); t(`${helpPrefix}Scope`); t("helpTitle")
packages/rdx-ui/src/components/field-picker-dialog.tsx props.labels.help; props.labels.helpLabel; props.labels.destination

Skills consultadas

Principal: ui-ux-pro-max (búsqueda local sobre foco, teclado y responsive). Complementarias: shadcn (Base UI, composición y estilos), vercel-composition-patterns (slots y contexto con consumidores reales), vercel-react-best-practices (estado mínimo y formularios montados), rdx-solid (contratos y pruebas). Se consultaron sus referencias aplicables junto a DESIGN, patrón de diálogos y procedimiento MCP. La CLI shadcn docs falló por DNS; se consultaron las páginas oficiales de Dialog y Popover y las APIs instaladas. No se instalaron dependencias externas ni auditores. Solo se añadió el enlace workspace de apps/web a rdx-ui.

Pruebas técnicas ejecutadas

Comprobación Resultado
pnpm typecheck Falla en packages/shadcn-ui/src/components/calendar.tsx:165, TS2375 por locale opcional con exactOptionalPropertyTypes. Reproducido ejecutando el typecheck aislado del vendor; no hay diferencias en vendor respecto a HEAD. No se modifica por instrucción expresa del repositorio.
Typecheck dirigido de @repo/rdx-ui, @metis/web, @metis/assets, @metis/resources y @metis/companies Correctos.
pnpm test (con sockets locales disponibles) 671 pruebas correctas y 2 fallos, ambos en companies-page.test.tsx: expectativas antiguas de «Personas (1)» y «Esta persona no tiene acceso a Metis Desk». Se reprodujeron los mismos dos fallos en una copia temporal de git archive del commit 91f1d07, sin los cambios de ayuda.
Suites de recursos, activos y rdx-ui en la ejecución global 105, 149 y 82 pruebas correctas, respectivamente.
pnpm --filter @metis/web test 3 archivos correctos: aplicación, traducciones y redirección. Incluye paridad completa es/en. Turbo no alcanzaba esta suite tras los fallos de compañías; se ejecutó expresamente.
pnpm --filter @repo/rdx-ui test 14 archivos correctos, incluidas las nuevas pruebas de política y conservación de contenido.
python3 scripts/visual-audit.test.py 10 pruebas correctas del preparador, aislamiento y diagnóstico.
pnpm lint / pnpm check Fallan fuera del diff: 15 errores de lint y 166 diagnósticos de error en check (incluye formato). Entre las fuentes: implementación previa de fotos de personas, migraciones y archivos locales de skills/diagnóstico. No se reformatean ni corrigen en esta tarea.
Biome check y ESLint de espaciado sobre los 19 archivos TS/TSX/JSON modificados o nuevos Correctos, sin diagnósticos.
pnpm build Correcto; conserva el aviso de tamaño de chunks de la aplicación.
git diff --check Correcto.

La primera ejecución de pnpm test dentro del sandbox falló al probar HTTP en resource-scope.test.ts. Con sockets locales autorizados, esa suite pasó. No se contabiliza ese fallo de entorno como regresión del código. La prueba de perfiles que exigía la antigua clase max-h-[40%] se actualizó: comprueba pasos y conservación de ejemplos/orientación, sin exigir el pie retirado.

Validación interactiva y evidencias

Procedimiento reproducible: bash scripts/setup-playwright-wsl.sh y python3 scripts/visual-audit.py --dialog-help --check. Usa la imagen MCP fijada por digest, Chromium 155, build de producción en Vite preview y HTTP real con usuario ordinario. El runner confirma el origen y puerto libres antes de navegar. No se utiliza la base local: crea y retira un contenedor exclusivo con metis_desk_test.

Volumen preparado en cada ejecución: 15 compañías; en la principal, 50 personas, 51 activos, 66 recursos (16 fixtures y 50 aplicaciones), 50 puestos y 50 perfiles. Las escrituras de prueba se limitan a esa instalación desechable. Las sesiones y credenciales se retiran al finalizar, también tras fallos.

La matriz representativa principal terminó correctamente en .artifacts/playwright/authenticated-u53obiy7/: edición real de activo con valores modificados, validación y selector; ayuda extensa y breve en selector real de activos del puesto. Se comprobaron siete anchos (320, 375, 390, 768, 1024, 1280 y 1440), ausencia de desbordamiento del diálogo, alineación ?/X, foco al abrir y cerrar, Escape, mismo nodo de input tras regresar, datos y validaciones conservados, cambio panel→vista y Popover→vista, retorno explícito y cierre X. La consola de ese recorrido registró cero errores y cero warnings.

Se abrieron e inspeccionaron las capturas de 320 y 1440, Popover y tema oscuro. El manifiesto dialog-help-report.json conserva medidas y SHA-256 de cada captura. Son artefactos locales excluidos de Git.

Accesibilidad, correcciones y límites

  • La comprobación real de Escape detectó el cierre del modal completo; se corrigió utilizando el contrato de cancelación de Base UI. No se añadió un listener global ni un focus trap propio.
  • Se mantiene la misma instancia del formulario, sus validaciones y selector. La vista interna desactiva su interacción con inert y lo oculta del árbol accesible. Los botones de ayuda son type=button.
  • El título del panel/vista recibe foco y etiqueta la región. Cerrar devuelve foco al trigger incluso si el cambio de modalidad sustituye su composición con Popover. Se conserva la navegación de teclado de Base UI.
  • La auditoría adicional de movimiento reducido detectó precedencia de animaciones vendor sobre la clase inicial. Se corrigió mediante utilidades important limitadas a prefers-reduced-motion en los wrappers propios. Vendor permanece intacto.
  • Se midió el color calculado de texto y fondos compuestos con canvas. El desplegable de ejemplos daba 4,28:1 en claro; dentro de los diálogos se cambió a text-foreground, conservando íntegro el texto. La verificación posterior se detalla en el resultado ampliado.
  • No se han probado lectores de pantalla reales ni se certifica conformidad WCAG 2.2 AA completa. La inspección de capturas y las medidas programáticas no sustituyen esas pruebas.
  • La matriz no implica abrir cada variante de los 102 componentes ni volver a probar todos sus estados de red, permisos o confirmaciones destructivas. Esas descripciones y controles no se migraron.
  • El zoom nativo del navegador al 200 % y 400 % no se considera verificado mediante cambios de viewport o tamaño de fuente: se documentan como pruebas de reflow y ampliación de texto, por separado.

Recorrido ampliado completado

Ejecución completa correcta en .artifacts/playwright/authenticated-q920cqcu/ mediante python3 scripts/visual-audit.py --dialog-help --check:

  • 28 comprobaciones: aislamiento del inventario de otra compañía, usuario ordinario, cabecera única, ayuda inicialmente oculta, formulario inválido real, siete anchos, panel/vista, Enter/Escape, foco de retorno, identidad del input, datos/validación/selector, ausencia de overflow, redimensionamiento, oscuro, cierre X, movimiento reducido y Tab en Popover, cierre Popover sin cerrar el selector, conservación de búsqueda y radio, diálogo de columnas sin ?, contraste, reflow/texto ampliado, título largo sintético, guardado tras consultar ayuda, cancelación sin escritura y etiquetas en inglés.
  • Se cambió el estado técnico a Averiado y se conservó la pestaña Hardware durante las aperturas/cierres; no se comprueba solo el valor inicial de un selector.
  • Contrastes calculados después de la corrección: texto secundario 4,83:1 en claro y 6,85:1 en oscuro; el desplegable de ejemplos 17,42:1 / 16,68:1.
  • Reflow a 720 y 360 CSS px, equivalente a reducir el espacio de una ventana de 1440 al 200 % y 400 %. Por separado, ampliación de fuente raíz al 200 % y 400 % en 1440 px. Son comprobaciones de capacidad y texto; no una prueba de zoom nativo del navegador.
  • El título largo es una modificación DOM sintética y reversible de la cabecera del formulario real; no se guardó un nombre de negocio ni se inventó una pantalla.
  • La consola no registró errores ni warnings React. Aparecieron dos avisos de rendimiento de Canvas2D generados por el propio medidor de contraste, sin relación con el producto. El comprobador posterior utiliza willReadFrequently para evitarlos.

La inspección de la captura con fuente al 400 % motivó además un fallback de scroll en la región de ayuda, con un mínimo de tres líneas para su contenido; conserva acceso al botón de retorno cuando el espacio vertical resulta insuficiente.

Comprobación final completa: 28 verificaciones correctas, 14 capturas y consola sin errores ni warnings en .artifacts/playwright/authenticated-a0gc2ghb/. Se repitió el recorrido con la región legible y el retorno mediante scroll. Se abrieron e inspeccionaron las capturas finales de panel a 1440, vista a 320, Popover, título largo y texto al 400 %. El informe local de navegador registra todas las mediciones y las huellas SHA-256; dialog-help-console.json conserva la salida de consola. Los archivos son locales y están excluidos de Git. El contenedor y su sesión se retiraron al finalizar. La compilación y las comprobaciones dirigidas se repitieron correctamente después del último ajuste.

Ampliación: animación CSS del panel lateral

El panel compartido incorpora entrada con fundido y desplazamiento corto desde la derecha, 200 ms y ease-out, reutilizando las utilidades CSS existentes. Se anima únicamente opacity/transform, también al reabrir; prefers-reduced-motion desactiva la animación. Criterios consultados: UI/UX Pro Max (movimiento reducido, movimiento limitado y duración adecuada a la distancia) y las convenciones shadcn del proyecto.

Verificación correcta mediante python3 scripts/visual-audit.py --dialog-help --check: 30 comprobaciones, 14 capturas y consola sin errores ni warnings. El comprobador captura la animación en la misma operación que abre el panel y controla su timeline con Web Animations API, sin esperas arbitrarias: opacidad 0 al inicio, intermedia entre 0 y 1 a los 100 ms y 1 al finalizar; duración calculada 0,2 s. Se verificó también animationName=none con movimiento reducido y se repitió el recorrido de foco, formulario y responsive. Evidencia: .artifacts/playwright/authenticated-ft29wong/dialog-help-report.json. El entorno desechable y su sesión se retiraron al terminar. Typecheck de rdx-ui, Biome, ESLint de espaciado y git diff --check correctos; la auditoría ejecutó además el build.

Pendientes reales

Pruebas con lectores de pantalla, zoom nativo 200/400 %, revisión manual completa de todos los diálogos y escenarios de altura baja como 320×640. No se instalan auditores ausentes. Los fallos globales de tipos, lint/formato y las dos expectativas previas de compañías permanecen fuera de esta migración y se han detallado con sus comprobaciones de aislamiento.