dialog: PASS audit + texts.label + Baseline/Gaps sections

Full walk of dialog (core modal pattern):

- Morfo: validated. 7 events (open with intent fromProp + 5 close
  variants + close-after-fail with threat intent). Focus policy:
  trap/return-to-trigger/restore. 9 parts (Provider/Trigger/Content/
  Overlay/Title/Description/Close, plus Header/Footer Eidos-only).
  data-last-action causal exit tinting + data-nested / data-depth
  for nested-dialog visual stacking.
- `texts.label` added with catalog entry.
- README: `## Baseline` added summarizing air → soma → morfo coverage
  (Dialog DOES have an air baseline at `glm-5:src/uix/air/components/
  dialog`). `## Gaps` section added with disposition markers — covers
  Positioner-as-part (descartar — Content.position owns it),
  per-part forceMount (diferir), drag-to-dismiss / bottom sheet
  handle (diferir), stacking visual for nested (implementar — soma
  emits data-depth but recipe is missing), AlertDialog separation
  (descartar — already lives in `alert-dialog`).

Audit: PASS 9 → 10.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
active-uix
dev 5 months ago
parent 42755cae23
commit f8c9734c00

@ -6,6 +6,21 @@ Air envolvia Terra y exponia `Root`, `Trigger`, `Portal`, `Overlay`, `Content`,
pero cambia la superficie publica a Option C: `<Dialog>` root con partes
attached, sin `Root` ni `Provider` publico.
## Baseline
- **air**: tenía `Dialog.Root` + parts compound. Cubría modal/non-modal,
focus trap/restore, escape/outside policies, scroll lock, force mount,
nested dialogs. Tamaños `sm/md/lg/full`.
- **soma actual**: cubre todo lo de Air en behavior (focus, dismissal,
scroll lock, modal/non-modal, alertdialog variant) más outcome-specific
close events (`close-save` / `close-cancel` / `close-dismiss` /
`close-dismiss-outside` / `close-after-fail`) que ningún competidor
expone.
- **morfo**: declara 7 events (open + 5 close variants + open intent
fromProp), focus policy con trap/return/restore, parts Provider /
Trigger / Content / Overlay / Title / Description / Close. Eidos
añade Header / Footer visuales y dimensiones / position.
## Superficie
```svelte
@ -93,6 +108,18 @@ Partes publicas: `Trigger`, `Portal`, `Overlay`, `Content`, `Title`,
| Small viewport | Full/dialog por CSS Air | auto sheet con `data-sheet` |
| Exit cause | No | `data-last-action` y eventos causales |
## Gaps
| Gap | Disposición | Detalle |
| --- | --- | --- |
| `Dialog.Positioner` como part público | **descartar** | Ark UI lo expone pero la posición en UIX es responsabilidad visual de `Content.position` (3x3 grid de posiciones). Exponerlo como part DOM duplicaría responsabilidad sin ARIA propia. |
| Animaciones SSR-safe con `forceMount` por part | **diferir** | Soma soporta forceMount global; falta el granular per-part. Sin caso de uso urgente. |
| Confirm / dismiss callbacks tipo Radix `onCloseAutoFocus` | **implementar** | Soma ya soporta los callbacks; falta documentación en README de Eidos y wireup en el demo. |
| Drag-to-dismiss en sheet móvil | **diferir** | Patrón móvil-only. Bibliotecas como vaul lo implementan. Sin demanda actual; cuando llegue, vive en una capa de interaction, no en Dialog. |
| Stacking visual de dialogs anidados | **implementar** | Soma ya emite `data-depth` y `data-nested`/`data-nested-open` en el morfo. Falta CSS canónica para inset/offset por depth en la recipe. |
| Bottom sheet drag handle | **diferir** | Composición de Drawer + indicator. Si llega un caso, Drawer es el dueño. |
| `Dialog.AlertDialog` como variante separada | **descartar** | Vivo como `alert-dialog` (componente aparte) por diferencias semánticas (intent, regime, role). No se duplica aquí. |
## Referencias
- Air anterior: `glm-5:src/uix/air/components/dialog`.

@ -8,14 +8,18 @@ import type { LangNode } from '$libs/langs';
* `'#?components.dialog.{key}|fallback'`.
*/
export const dialogLangs = {
label: {
es: 'Diálogo',
en: 'Dialog'
},
trigger: {
es: "Abrir diálogo",
en: "Open dialog"
es: 'Abrir diálogo',
en: 'Open dialog'
},
content: {
roledescription: {
es: "ventana de diálogo",
en: "dialog window"
es: 'ventana de diálogo',
en: 'dialog window'
}
}
} satisfies LangNode;

@ -18,6 +18,7 @@ export const dialogMorfo = {
scope: ['soma', 'sema'],
apg: 'https://www.w3.org/WAI/ARIA/apg/patterns/dialog/',
texts: {
label: '#?components.dialog.label|Dialog',
trigger: '#?components.dialog.trigger|Open dialog',
'content.roledescription': '#?components.dialog.content.roledescription|dialog window'
},

Loading…
Cancel
Save

Powered by TurnKey Linux.