Skip to content

Price

Composant d'affichage de prix avec support multi-devises, variantes promotionnelles, et formatage accessible. Utilise le composable usePrice basé sur Intl.NumberFormat.

Exemples d'utilisation

Basique

Prix simple

vue
<SuPrice :amount="29.99" />

Tailles

sm / md / lg

vue
<SuPrice :amount="29.99" size="sm" />
<SuPrice :amount="29.99" size="md" />
<SuPrice :amount="29.99" size="lg" />

Variantes

default / highlight / muted

vue
<SuPrice :amount="29.99" variant="default" />
<SuPrice :amount="29.99" variant="highlight" />
<SuPrice :amount="29.99" variant="muted" />

Prix barré (promotion)

Ancien prix barré + nouveau prix

vue
<SuPrice
  :amount="29.99"
  :originalAmount="49.99"
  :showOriginal="true"
  size="lg"
/>

Prix promotionnel complet

Préfixe + barré + highlight + badge

vue
<SuPrice
  :amount="29.99"
  :originalAmount="49.99"
  :showOriginal="true"
  variant="highlight"
  size="lg"
>
  <template #prefix>
    <span>Dès</span>
  </template>
  <template #suffix>
    <SuBadge variant="error" size="sm">-40%</SuBadge>
  </template>
</SuPrice>

Entier uniquement

Sans décimales

vue
<SuPrice :amount="1299.99" :integerOnly="true" size="lg" />

Décimales en exposant

Style e-commerce

vue
<SuPrice :amount="29.99" :superscriptDecimals="true" size="lg" />

Multi-devises

EUR, USD, GBP, JPY

vue
<SuPrice :amount="1299.99" currency="EUR" locale="fr-FR" />
<SuPrice :amount="1299.99" currency="USD" locale="en-US" />
<SuPrice :amount="1299.99" currency="GBP" locale="en-GB" />
<SuPrice :amount="1299" currency="JPY" locale="ja-JP" />

Avec slots

Préfixe et suffixe

vue
<SuPrice :amount="9.99" size="lg">
  <template #prefix><span>À partir de</span></template>
</SuPrice>

<SuPrice :amount="9.99" size="lg">
  <template #suffix><span>/mois</span></template>
</SuPrice>

Composable usePrice

Le composable usePrice peut être utilisé indépendamment pour formater des prix dans vos composants :

vue
<script setup>
import { usePrice } from '@surgeui/ds-vue'

const { formatted, integerPart, decimalPart, currencySymbol } = usePrice({
  amount: 1299.99,
  currency: 'EUR',
  locale: 'fr-FR',
})
</script>

<template>
  <p>Prix complet : {{ formatted }}</p>
  <p>Entier : {{ integerPart }}{{ currencySymbol }}</p>
</template>

API

Props

PropTypeDéfautDescription
amountnumber— (requis)Montant numérique à afficher
originalAmountnumberMontant original pour le prix barré
currencystring'EUR'Code devise ISO 4217
localestring'fr-FR'Locale BCP 47
variant'default' | 'highlight' | 'muted''default'Variante visuelle
size'sm' | 'md' | 'lg''md'Taille
integerOnlybooleanfalseMasquer la partie décimale
showOriginalbooleanfalseAfficher le prix original barré
currencyDisplay'symbol' | 'narrowSymbol' | 'code' | 'name''symbol'Format du symbole de devise
currencyPosition'auto' | 'prefix' | 'suffix''auto'Position du symbole
formatValue(amount: number) => stringFormatter personnalisé
superscriptDecimalsbooleanfalseDécimales en exposant
ariaLabelstringLabel accessible (auto-généré si omis)

Slots

SlotPropsDescription
prefixContenu avant le prix (ex: "À partir de")
original{ formatted: string, amount: number }Rendu personnalisé du prix barré
suffixContenu après le prix (ex: "/mois", Badge)

usePrice — Options

OptionTypeDéfautDescription
amountnumber | Ref<number> | () => number— (requis)Montant réactif
currencystring'EUR'Code devise ISO 4217
localestring'fr-FR'Locale BCP 47
currencyDisplayCurrencyDisplay'symbol'Format du symbole
minimumFractionDigitsnumber2Chiffres décimaux min
maximumFractionDigitsnumber2Chiffres décimaux max
formatValue(amount, currency, locale) => stringFormatter personnalisé

usePrice — Retour

PropriétéTypeDescription
formattedReadonly<Ref<string>>Prix formaté complet
integerPartReadonly<Ref<string>>Partie entière
decimalPartReadonly<Ref<string>>Partie décimale
decimalSeparatorReadonly<Ref<string>>Séparateur décimal
currencySymbolReadonly<Ref<string>>Symbole de la devise
isSymbolPrefixReadonly<Ref<boolean>>true si symbole avant le montant
ariaLabelReadonly<Ref<string>>Texte accessible
rawAmountReadonly<Ref<number>>Montant brut

Accessibilité

  • role="text" sur l'élément racine pour grouper les morceaux visuels
  • aria-label auto-généré avec le nom complet de la devise (ex: "29,99 euros")
  • Tous les sous-éléments visuels marqués aria-hidden="true" pour éviter la lecture fragmentée
  • Support prefers-contrast: high : épaisseur du trait barré augmentée
  • Support prefers-reduced-motion: reduce : transitions désactivées
  • font-variant-numeric: tabular-nums pour l'alignement en grille

Publié sous licence MIT.