Skip to content
API 风格:

Notification ​

Carte de notification placée dans un angle (les quatre angles sont possibles), destinée aux retours demandant un temps de lecture : titre / corps / icône sémantique / fermeture manuelle / disparition automatique / empilement. API de service impérative (LhNotification.success(...)).

Utilisation de base ​

Utilisation de base
vue
<script setup lang="ts">
import { LhNotification } from '@lh-ui/vue3'

const showBasic = () => {
  LhNotification.info({ title: 'Synchronisation terminée', content: '3 modifications ont été synchronisées vers le cloud' })
}
</script>

<template>
  <LhButton @click="showBasic">Ouvrir une notification</LhButton>
</template>
vue
<script>
import { LhNotification } from '@lh-ui/vue3'

export default {
  methods: {
    showBasic() {
      LhNotification.info({ title: 'Synchronisation terminée', content: '3 modifications ont été synchronisées vers le cloud' })
    },
  },
}
</script>

<template>
  <LhButton @click="showBasic">Ouvrir une notification</LhButton>
</template>

Types sémantiques ​

Quatre types sémantiques
vue
<script setup lang="ts">
import { LhNotification } from '@lh-ui/vue3'

const showInfo = () => LhNotification.info({ title: 'Information', content: 'Contenu' })
const showSuccess = () => LhNotification.success({ title: 'Succès', content: 'La sauvegarde est terminée' })
const showWarning = () => LhNotification.warning({ title: 'Avertissement', content: 'Espace de stockage insuffisant' })
const showDanger = () => LhNotification.danger({ title: 'Échec', content: 'Connexion réseau interrompue' })
</script>

<template>
  <div class="demo-notification-row">
    <LhButton @click="showInfo">Information</LhButton>
    <LhButton @click="showSuccess">Succès</LhButton>
    <LhButton @click="showWarning">Avertissement</LhButton>
    <LhButton @click="showDanger">Danger</LhButton>
  </div>
</template>
vue
<script>
import { LhNotification } from '@lh-ui/vue3'

export default {
  methods: {
    showInfo() {
      LhNotification.info({ title: 'Information', content: 'Contenu' })
    },
    showSuccess() {
      LhNotification.success({ title: 'Succès', content: 'La sauvegarde est terminée' })
    },
    showWarning() {
      LhNotification.warning({ title: 'Avertissement', content: 'Espace de stockage insuffisant' })
    },
    showDanger() {
      LhNotification.danger({ title: 'Échec', content: 'Connexion réseau interrompue' })
    },
  },
}
</script>

<template>
  <div class="demo-notification-row">
    <LhButton @click="showInfo">Information</LhButton>
    <LhButton @click="showSuccess">Succès</LhButton>
    <LhButton @click="showWarning">Avertissement</LhButton>
    <LhButton @click="showDanger">Danger</LhButton>
  </div>
</template>

Position d'affichage ​

position prend en charge les quatre angles.

Position
vue
<script setup lang="ts">
import { LhNotification } from '@lh-ui/vue3'

const showAt = (position) => {
  LhNotification.info({ title: 'Exemple de position', content: position, duration: 3000, position })
}
</script>

<template>
  <div class="demo-notification-row">
    <LhButton @click="showAt('top-right')">En haut à droite</LhButton>
    <LhButton @click="showAt('top-left')">En haut à gauche</LhButton>
    <LhButton @click="showAt('bottom-right')">En bas à droite</LhButton>
    <LhButton @click="showAt('bottom-left')">En bas à gauche</LhButton>
  </div>
</template>
vue
<script>
import { LhNotification } from '@lh-ui/vue3'

export default {
  methods: {
    showAt(position) {
      LhNotification.info({ title: 'Exemple de position', content: position, duration: 3000, position })
    },
  },
}
</script>

<template>
  <div class="demo-notification-row">
    <LhButton @click="showAt('top-right')">En haut à droite</LhButton>
    <LhButton @click="showAt('top-left')">En haut à gauche</LhButton>
    <LhButton @click="showAt('bottom-right')">En bas à droite</LhButton>
    <LhButton @click="showAt('bottom-left')">En bas à gauche</LhButton>
  </div>
</template>

Notification cliquable ​

Lorsque onClick est fourni, la carte acquiert la sémantique d'un bouton : elle peut recevoir le focus via Tab et être déclenchée avec Enter / Space.

Cliquable
vue
<script setup lang="ts">
import { LhNotification } from '@lh-ui/vue3'

const showClickable = () => {
  LhNotification.info({
    title: 'Nouvelle version disponible',
    content: 'Cliquez pour consulter le journal des modifications',
    duration: 0,
    onClick: () => window.open('#', '_blank'),
  })
}
</script>

<template>
  <LhButton @click="showClickable">Notification avec action</LhButton>
</template>
vue
<script>
import { LhNotification } from '@lh-ui/vue3'

export default {
  methods: {
    showClickable() {
      LhNotification.info({
        title: 'Nouvelle version disponible',
        content: 'Cliquez pour consulter le journal des modifications',
        duration: 0,
        onClick: () => window.open('#', '_blank'),
      })
    },
  },
}
</script>

<template>
  <LhButton @click="showClickable">Notification avec action</LhButton>
</template>

Bouton de fermeture ​

show-close contrôle l'affichage du bouton de fermeture (affiché par défaut) et close-label personnalise son nom accessible.

Bouton de fermeture
vue
<script setup lang="ts">
import { LhNotification } from '@lh-ui/vue3'

const notifyClosable = () => LhNotification.info({ title: 'Information', content: 'Fermeture manuelle possible', showClose: true, closeLabel: 'Compris, fermer' })
const notifyNoClose = () => LhNotification.info({ title: 'Information', content: 'Fermeture automatique uniquement', showClose: false })
</script>

<template>
  <LhButton @click="notifyClosable">Avec bouton de fermeture</LhButton>
  <LhButton @click="notifyNoClose">Sans bouton de fermeture</LhButton>
</template>
vue
<script>
import { LhNotification } from '@lh-ui/vue3'

export default {
  methods: {
    notifyClosable() {
      LhNotification.info({ title: 'Information', content: 'Fermeture manuelle possible', showClose: true, closeLabel: 'Compris, fermer' })
    },
    notifyNoClose() {
      LhNotification.info({ title: 'Information', content: 'Fermeture automatique uniquement', showClose: false })
    },
  },
}
</script>

<template>
  <LhButton @click="notifyClosable">Avec bouton de fermeture</LhButton>
  <LhButton @click="notifyNoClose">Sans bouton de fermeture</LhButton>
</template>

API ​

LhNotification Props ​

PropDescriptionTypeValeur par défaut
typeType sémantique"success" | "warning" | "error" | "info" | "danger"'info'
titleTitrestring—
contentCorps du messagestring—
showCloseAfficher le bouton de fermeturebooleantrue
closeLabelNom accessible du bouton de fermeture (par défaut, lit notification.close du paquet de langue)string—
onClickCallback de clic sur la carte (lorsqu'il est fourni, la carte est rendue avec la sémantique d'un bouton)() => void—
sxProps de mise en page sxLhSxProps—

Méthodes de service : LhNotification(options) / LhNotification.success/info/warning/danger(options), qui renvoient un handle { close } ; il existe également LhNotification.close(id), LhNotification.closeAll() et LhNotification.config({ duration, offset, appendTo }).

Events ​

ÉvénementDescriptionCallback
closeÉmis lors du clic sur le bouton de fermeture d'une notification—

Dans l'usage impératif, la fermeture (automatique ou manuelle) est perçue via la callback onClose des options.

Options ​

PropDescriptionTypeValeur par défaut
titleTitrestring—
contentCorps du messagestring—
typeType sémantique'success' | 'warning' | 'error' | 'info' | 'danger''info'
durationDélai de fermeture automatique en ms, 0 désactive la fermeture automatiquenumber4500
positionPosition d'affichage'top-right' | 'top-left' | 'bottom-right' | 'bottom-left''top-right'
showCloseAfficher le bouton de fermeturebooleantrue
sxProps de mise en page sxLhSxProps—
onClickCallback de clic sur la carte() => void—
onCloseCallback après fermeture() => void—

Accessibilité ​

  • Le conteneur de chaque position a role="region" + aria-live="polite" : les nouvelles notifications sont annoncées en douceur, sans captation de focus
  • Les cartes pourvues d'un onClick ont role="button", reçoivent le focus via Tab et sont déclenchées par Enter / Space
  • Le bouton de fermeture possède un aria-label (notification.close du paquet de langue, surchargeable via closeLabel)
  • Le déplacement à l'empilement est géré par une transition CSS ; l'animation respecte prefers-reduced-motion

Définitions de types ​

Ce composant exporte les structures de types TypeScript suivantes (extraites automatiquement de packages/components/notification/src/types.ts et des sources @lh-ui/share/core/* ; cliquez sur chaque entrée pour déplier la définition complète ; la description des props se trouve dans le tableau Props ci-dessus) :

LhNotificationOptions
ts
/** Options du service */
export interface LhNotificationOptions {
  /** Titre */
  title: string
  /** Corps du message */
  content?: string
  /** Type sémantique, info par défaut */
  type?: LhNotificationType
  /** Délai de fermeture automatique en ms, 0 désactive la fermeture automatique (4500 par défaut) */
  duration?: number
  /** Position d'affichage (top-right par défaut) */
  position?: LhNotificationPosition
  /** Afficher le bouton de fermeture (true par défaut) */
  showClose?: boolean
  /** Props de mise en page sx */
  sx?: LhSxProps
  /** Callback de clic sur la carte (lorsqu'il est fourni, la carte est focalisable et rendue avec la sémantique d'un bouton) */
  onClick?: () => void
  /** Callback après fermeture (automatique ou manuelle) */
  onClose?: () => void
}
LhNotificationHandle
ts
/** Handle du service */
export interface LhNotificationHandle {
  close: () => void
}
LhNotificationConfig
ts
/** Options de configuration globale par défaut (LhNotification.config) */
export interface LhNotificationConfig {
  duration?: number
  offset?: number
  /** Conteneur de montage (body par défaut) */
  appendTo?: string | HTMLElement
}
LhNotificationProps
ts
/** Props du composant notification (rendu interne du service ; utilisable aussi seul, de manière déclarative) */
export interface LhNotificationProps {
  type?: LhNotificationType
  title: string
  content?: string
  showClose?: boolean
  /** Nom accessible du bouton de fermeture (par défaut, lit notification.close du paquet de langue) */
  closeLabel?: string
  /** Lorsqu'il est fourni, la carte est cliquable */
  onClick?: () => void
  sx?: LhSxProps
}
LhNotificationType (provenant de @lh-ui/share/core/notification)
ts
/** Type sémantique de notification (quatre types, pas de loading) */
export type LhNotificationType =
  (typeof LH_TYPES_CONST)[keyof typeof LH_TYPES_CONST]
LhNotificationRecord (provenant de @lh-ui/share/core/notification)
ts
/** Forme d'enregistrement d'une notification dans la file du service */
export interface LhNotificationRecord {
  id: number
  type: LhNotificationType
  title: string
  content: string
  /** Délai de fermeture automatique en ms, 0 désactive la fermeture automatique */
  duration: number
  position: LhNotificationPosition
  showClose: boolean
  sx?: LhSxProps
  onClick?: () => void
  onClose?: () => void
}
LhNotificationPosition (provenant de @lh-ui/share/core/notification)
ts
/** Position d'affichage de la notification (quatre angles) */
export type LhNotificationPosition =
  | 'top-right'
  | 'top-left'
  | 'bottom-right'
  | 'bottom-left'

Constantes ​

Les constantes publiques utilisées par ce composant sont les suivantes (vous pouvez cliquer sur une entrée de même nom dans les colonnes « Type / Valeur par défaut » du tableau Props pour sauter jusqu'ici) :

LH_NOTIFICATION_POSITION_CONST (provenant de @lh-ui/share/core/notification)
ts
/** Constante de position */
export const LH_NOTIFICATION_POSITION_CONST = {
  'top-right': 'top-right',
  'top-left': 'top-left',
  'bottom-right': 'bottom-right',
  'bottom-left': 'bottom-left',
} as const
LH_NOTIFICATION_DURATION_DEFAULT (provenant de @lh-ui/share/core/notification)
ts
/** Durée de fermeture automatique par défaut (les notifications restent affichées plus longtemps que les messages) */
export const LH_NOTIFICATION_DURATION_DEFAULT = 4500
LH_NOTIFICATION_GAP_DEFAULT (provenant de @lh-ui/share/core/notification)
ts
/** Espacement d'empilement, en px */
export const LH_NOTIFICATION_GAP_DEFAULT = 16

La beauté de la tradition, la fondation du code