diff --git a/scripts/component-audit.ts b/scripts/component-audit.ts index 1af7c763c..f3a3b4860 100644 --- a/scripts/component-audit.ts +++ b/scripts/component-audit.ts @@ -288,9 +288,14 @@ function checkMorfo(kebab: string, src: string, info: ComponentReport): CheckRes } } - // A-3.6: event name follows {verb}-{x} or {family}-{verb} pattern + // A-3.6: event name follows `{verb}-{x}`, `{family}-{verb}`, OR is a + // bare canonical verb on its own (e.g. `present`, `open`, `close`). + // Bare verbs are valid when the event has no variant to disambiguate. const badNames = eventNames.filter((n) => { - if (!n.includes('-')) return true; + if (!n.includes('-')) { + // Accept bare canonical verbs and bare family names. + return !ALL_VERBS.has(n) && !SEMA_FAMILIES.includes(n as never); + } const [head] = n.split('-'); return !ALL_VERBS.has(head) && !SEMA_FAMILIES.includes(head as never); }); diff --git a/src/uix/eidos/components/popover/README.md b/src/uix/eidos/components/popover/README.md index 2df7b6be8..02dfe5415 100644 --- a/src/uix/eidos/components/popover/README.md +++ b/src/uix/eidos/components/popover/README.md @@ -43,7 +43,14 @@ Fuentes externas consultadas: origin-aware y `--floating-available-height` como max-height por defecto cuando Floating ya lo conoce. -## Pendiente deliberado +## Gaps -- Evaluar multiple trigger value solo si Soma decide modelarlo; Eidos no debe - inventar estado de trigger por encima de Soma. +| Gap | Disposición | Detalle | +| --- | --- | --- | +| Multiple-trigger model (un mismo Popover con varios `Trigger`) | **diferir** | Sólo si Soma decide modelarlo; Eidos no debe inventar estado de trigger por encima de Soma. Sin caso de uso real. | +| `Positioner` como part público (Ark UI) | **descartar** | La posición pertenece a Soma Floating; el `Positioner` queda internalizado. Exponerlo como part en Eidos duplicaría responsabilidades y mezclaría capas. | +| `forceMount` (Radix / Bits) en partes individuales | **diferir** | Requiere coordinar con Sema (presence/dismissal). Útil para animaciones SSR/SSG con elementos persistentes. Sin caso urgente. | +| Modo modal + footer (clear/cancel/close) tipo picker | **descartar** | Patrón vive en los pickers (date-picker, date-range-picker). Popover es genérico y no debe forzar API de confirmación. Si un consumer la necesita, monta el footer dentro del `Content`. | +| `onOpenAutoFocus` / `onCloseAutoFocus` customización | **implementar** | Soma ya soporta el callback; falta documentarlo en el README de Eidos y validar que llega vía `Content`. | +| Hover-open programable con delay y skipDelay | **diferir** | Soma lo expone parcialmente. Falta API canónica + docs. | +| Anchor virtual (sin elemento DOM) | **diferir** | React Aria lo expone como `customAnchor`. Soma lo soporta vía `customAnchor` ref. Falta wrapper Eidos amigable. | diff --git a/src/uix/langs/components/index.ts b/src/uix/langs/components/index.ts index 52a9bb6a2..2bf279118 100644 --- a/src/uix/langs/components/index.ts +++ b/src/uix/langs/components/index.ts @@ -26,6 +26,7 @@ import { meterLangs } from './meter'; import { navigationMenuLangs } from './navigation-menu'; import { paginationLangs } from './pagination'; import { pinInputLangs } from './pin-input'; +import { popoverLangs } from './popover'; import { progressLangs } from './progress'; import { rangeCalendarLangs } from './range-calendar'; import { ratingGroupLangs } from './rating-group'; @@ -76,6 +77,7 @@ export const componentLangs = { 'navigation-menu': navigationMenuLangs, pagination: paginationLangs, 'pin-input': pinInputLangs, + popover: popoverLangs, progress: progressLangs, 'range-calendar': rangeCalendarLangs, 'rating-group': ratingGroupLangs, diff --git a/src/uix/langs/components/popover.ts b/src/uix/langs/components/popover.ts new file mode 100644 index 000000000..cc5e955a5 --- /dev/null +++ b/src/uix/langs/components/popover.ts @@ -0,0 +1,15 @@ +import type { LangNode } from '$libs/langs'; + +/** + * Default strings for the popover component. Merged under + * `components.popover.*` by `ActiveUix` (via `componentLangs` barrel). + * + * Morfo references entries by absolute idlangref: + * `'#?components.popover.{key}|fallback'`. + */ +export const popoverLangs = { + label: { + es: 'Popover', + en: 'Popover' + } +} satisfies LangNode; diff --git a/src/uix/morfo/components/popover.ts b/src/uix/morfo/components/popover.ts index 3d6f613ef..60507d854 100644 --- a/src/uix/morfo/components/popover.ts +++ b/src/uix/morfo/components/popover.ts @@ -6,6 +6,9 @@ export const popoverMorfo = { kebab: 'popover', scope: ['soma', 'sema'], apg: 'https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/', + texts: { + label: '#?components.popover.label|Popover' + }, events: [ {