Skip to content

[FIR-290] Add FfToastService with positions, auto-dismiss and on-demand container#49

Merged
mfg1986 merged 10 commits into
developfrom
feature/FIR-290_toast-service
Jul 18, 2026
Merged

[FIR-290] Add FfToastService with positions, auto-dismiss and on-demand container#49
mfg1986 merged 10 commits into
developfrom
feature/FIR-290_toast-service

Conversation

@mfg1986

@mfg1986 mfg1986 commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Qué

Crea el servicio imperativo de toasts del DS (FIR-290 / FF-CAT-08, bloqueante P0 — ToastService de hub se usa en 29 ficheros de Flydocs):

  • FfToastService: show() + atajos success/error/info/warning, dismiss(id), clear(), signal toasts.
  • provideFfToasts(config?) con defaults (timeout 4000, top-right, dismissible).
  • Contenedor interno on-demand (createComponent + append a body): 6 regiones de posición con aria-live="polite", role="alert" en errores, barra de progreso y transiciones 100% CSS (pausa on hover sincronizada con el timer JS, prefers-reduced-motion respetado). Sin @angular/animations.
  • ff-toast (átomo) intacto; contrato con requiredProviders y cláusulas aria; demo imperativa en el catálogo.

Notas para review

  • Posible doble anuncio en algunos lectores (región polite + role=status del átomo) — documentado.
  • El JSDoc del átomo menciona un "AlertService" obsoleto; no tocado por scope guard (trivial de corregir).

Verificación

pnpm nx test design-system → 25 files / 448 ✓ (26 del servicio) · contract 13 ✓ · lint 0 errores · build playground ✓

Ref: FIR-290

@mfg1986

mfg1986 commented Jul 18, 2026

Copy link
Copy Markdown
Contributor Author

❌ Rework — la orquestación duplica una capacidad existente del framework. Objeciones numeradas:

  1. FfToastService/provideFfToasts duplican el AlertService de core (packages/core/src/lib/alerts/ — headless: señales activeToasts(), timers, dismiss, atajos success/error/warning/info; construido en PASO 2.4). Esperado: eliminar el servicio y el provider del DS y convertir la pieza en un ff-toast-container presentacional público: input [toasts] (tipo estructural DS-local compatible con el Toast de core — el DS no importa core por boundary; duck-typing documentado), output (dismissed). Conservar regiones por posición, aria-live/role alert y la barra de progreso CSS.
  2. Contrato: retirar la cláusula requiredProviders: [provideFfToasts] de toast.contract.ts y contratar el container presentacional (inputs estructurales + cláusulas aria).
  3. JSDoc de ff-toast: restaurar la referencia a AlertService como orquestador (el commit d900189 la sustituyó por el servicio ahora rechazado), con el ejemplo container + señales.
  4. Catálogo: la demo pasa a cablear provideAlerts() de core + el container (el playground es capa app y sí puede importar core).

Nota de alcance: el pause-on-hover del timer JS queda fuera de este rework — necesita que core exponga pausa (creado FIR-311). La barra de progreso puede mantenerse como visual ligada a duration, o pausarse solo en CSS.

(Se publica como comentario porque GitHub no permite request-changes sobre un PR propio; el estado formal de rework vive en Jira.)

mfg1986 added 5 commits July 18, 2026 13:54
…tainer pattern

The design system no longer duplicates core's AlertService: FfToastService,
provideFfToasts and the internal body-mounted container are removed. A new
public ff-toast-container pattern renders duck-typed FfToastItem entries
(core's Toast fits structurally) inside six always-present aria-live regions,
keeps the role=alert wrapper, CSS enter/progress animations and
prefers-reduced-motion support, and exposes dismissed/hoverStarted/hoverEnded
outputs so the app layer wires dismiss and pause/resume to the orchestrator.
The ff-toast JSDoc points back to core's AlertService as the orchestrator.
Reverts the ff-toast primitive contract to its pre-delivery form (no
requiredProviders, no service-rendered aria clauses) and adds the
ff-toast-container pattern contract: composes ff-toast, structural toasts
input, dismissed/hoverStarted/hoverEnded string outputs, always-present
polite regions, role=alert on errors and hover-driven external
pause/resume. Registered in the barrel and ALL_CONTRACTS (23 primitives +
2 patterns).
The playground registers provideAlerts() instead of provideFfToasts and the
toast page drives ff-toast-container from AlertService: activeToasts() as
input, dismiss on dismissed and pauseToast/resumeToast on the hover outputs
(exercising the FIR-311 pause/resume). Demos cover the semantic types
(destructive maps to the error variant), core toast positions and the
duration-bound progress bar.
@mfg1986
mfg1986 merged commit b876acf into develop Jul 18, 2026
4 checks passed
@mfg1986
mfg1986 deleted the feature/FIR-290_toast-service branch July 18, 2026 12:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant