Aller au contenu

Design system Osmose (@pms/ui)

Le design system Osmose est le package @pms/ui (version 0.1.0), partagé par les 5 fronts Angular 20. Il contient 12 composants standalone zoneless, les tokens visuels et le système de thèmes.

Important : @pms/ui est consommé en source — pas de build dédié (ng-packagr non utilisé). Chaque app Angular configure deux points de jonction obligatoires :

  1. paths tsconfig : "@pms/ui": ["../../packages/ui/src/index.ts"]
  2. @source Tailwind dans styles.css : @source "../../../packages/ui/src"

Si l’un des deux est absent : respectivement imports cassés ou classes Tailwind purgées.

Tous OnPush, zoneless, accessibles (WCAG AA) :

ComposantDescription
osm-avatarAvatar utilisateur (initiales ou photo)
osm-badgeBadge de comptage/statut
osm-buttonBouton avec variants (primary/secondary/ghost/danger) + états loading/disabled
osm-cardCarte conteneur avec variantes d’élévation
osm-confirm-dialogDialog de confirmation accessible : inert siblings, focus-trap, Escape, restauration focus ; ConfirmDialogService (montage programmatique createComponent())
osm-date-range-pickerSélecteur de plage de dates
osm-drawerPanneau latéral (focus-trap, Escape)
osm-fieldWrapper de champ de formulaire (label, error, hint)
osm-inputInput accessible
osm-kpi-cardCarte KPI (valeur + libellé + tendance)
osm-section-titleTitre de section sémantique
osm-status-badgeBadge de statut : texte et couleur (jamais couleur seule — WCAG 1.4.1)

provideOsmoseIcons() — provider pour les icônes Lucide.

Définis dans packages/ui/src/styles/osmose.css via @theme (Tailwind v4) :

  • Primary — teal (--color-primary-*)
  • Sand/Clay — surfaces neutres
  • Accent — couleur d’accentuation
  • Sémantique — success/warning/danger/info avec niveaux -50/-500/-600
    • Les tokens -600 sont la référence pour le texte (contraste AA garanti)
    • Ne jamais utiliser les tokens -500 seuls pour du texte
  • Statuts chambrers-* (room status : available, occupied, dirty, OOO…)
  • Statuts réservationbs-* (booking status : tentative, confirmed, checked-in…)

Mode sombre : classe .dark + prefers-color-scheme: dark (media query). White-label : variables CSS surchargeable par tenant.

osmose-tokens.spec.ts vérifie que tout token référencé par un composant existe dans osmose.css. Empêche les tokens orphelins qui passeraient sans erreur TS mais seraient invisibles au runtime.

  • osm-confirm-dialog : role="alertdialog", inert sur les siblings, focus-trap au montage, restauration du focus à la fermeture
  • osm-drawer : focus-trap, Escape ferme
  • osm-status-badge : texte + couleur (jamais couleur seule)
  • osm-button : aria-label transmis, états disabled/loading correctement signalés
  • Contraste AA : tokens -600 pour le texte sur fond clair
  • window.confirm() est interdit — utiliser ConfirmDialogService
  • Les lignes de folio voidées s’affichent avec la classe line-through (barrées), jamais retirées du DOM (NF203 : inaltérabilité visuelle)
  • osm-status-badge obligatoire pour tout statut — jamais un simple <span> coloré
  • @pms/ui est agnostique i18n et money : l’app fournit les chaînes traduites et les montants pré-formatés (pas d’@ngx-translate ni de eurosToCents dans ui)

232 tests (gate 2026-06-11) :

  • Tests composants : Vitest + jsdom (sans TestBed — logique extraite pure)
  • Spec de garde tokens
  • E2e Playwright par app consommatrice (axe-core violations critical/serious bloquantes)