npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

dsfr-tel

v1.0.25

Published

Un composant de saisie de téléphone pour Vue.js 3 reposant sur Libphonenumber et le DSFR.

Readme

Dsfr-tel

Qu'est-ce ?

Dsfr-tel est un composant VueJS permettant de formater et de valider la saisie d’un numéro de téléphone (portable, fixe…) grâce à la bibliothèque Libphonenumber de Google, tout en s'inscrivant dans le système de design de l'État.

Il offre notamment :

  • un champ de saisie du numéro de téléphone,
  • une liste déroulante permettant de sélectionner l'indicatif du pays correspondant,
  • un formatage automatique du numéro (passage de l'international au format national, par exemple) y compris lors de la saisie,
  • une validation du numéro (présence, longueur, validité, type…),
  • la détection automatique du pays à partir du fuseau horaire (optionnelle via la prop autoDetectCountry).

Ce composant n'est pas proposé par le Service d'information du Gouvernemnt.

Démonstration

Installation

npm i dsfr-tel

N'oubliez pas d'importer également la feuille de style nécessaire.

Utilisation

Vous pouvez utiliser le composant de deux manières :

Utilisation globale (plugin)

Installez le plugin dans le point d'entrée de votre application (par exemple dans main.ts ou main.js) :

// filepath: /src/main.ts
import { createApp } from 'vue';
import App from './App.vue';
import DsfrTelPlugin from 'dsfr-tel';

const app = createApp(App);
app.use(DsfrTelPlugin);
app.mount('#app');

Une fois installé globalement, vous pouvez directement utiliser le composant :

<template>
  <DsfrTel ref="dsfrTel" />
</template>

Utilisation locale

Si vous préférez enregistrer le composant uniquement dans certains composants, importez le composant nommé et enregistrez-le localement :

<template>
  <DsfrTel ref="dsfrTel" />
</template>

<script setup lang="ts">
import { ref } from 'vue';
import { DsfrTel } from 'dsfr-tel';

const dsfrTel = ref();

function onSubmit() {
  if(dsfrTel.value.validatePhoneNumber()){
    const formattedNumber = dsfrTel.value.getPhoneNumberFormatted('NATIONAL');
    // …
  }
}
</script>

Paramètres

Le composant accepte les paramètres suivants via des props :

  • expectedTypes (Array<string>)
    Définit les types de numéros autorisés.
    Default : ['MOBILE', 'FIXED_LINE_OR_MOBILE']

    Remarque : Les valeurs possibles pour les types sont celles retournées par la bibliothèque libphonenumber-js, par exemple :

    • MOBILE (Portable)
    • FIXED_LINE (Fixe)
    • FIXED_LINE_OR_MOBILE (Fixe ou portable)
    • TOLL_FREE (Numéro gratuit)
    • PREMIUM_RATE (Numéro surtaxé)
    • VOIP (Numéro de VoIP)
    • PERSONAL_NUMBER (Numéro personnel)
    • PAGER (Numéro de bipeur)
    • UAN (Numéro universel)
    • UNKNOWN (Type inconnu)
    • FAX (Fax)
    • SHARED_COST (Numéro à coût partagé)
    • SATELLITE (Numéro satellite)
    • EMERGENCY (Numéro d'urgence)
    • VOICEMAIL (Messagerie vocale)
    • SPARE (Numéro de rechange)

    Ces valeurs sont traduites automatiquement dans l'interface grâce à la table de concordance numberTypeLabels.

  • fieldsetLegend (string)
    Texte affiché dans la légende du regroupement de champs.
    Default : "Votre numéro de téléphone portable"

  • errorMessages (Object)
    Messages d'erreur généraux utilisés lors de la validation. Default :

    {
      "required": "La saisie du numéro de téléphone est requise.",
      "invalid": "Le numéro renseigné est incorrect. Veuillez le vérifier.",
      "incorrectType": "Le numéro doit être de type {types}.",
      "unknown": "Erreur lors de la validation du numéro.",
      "parse": "Erreur lors de l'analyse du numéro."
    }
  • placeholderPrefix (string)
    Préfixe utilisé pour l'emplacement de texte du champ de saisie.
    Default : "Exemple : "

  • reasonMessages (Object)
    Messages d'erreur spécifiques au format ou à la longueur du numéro de téléphone.
    Default :

    {
      "TOO_SHORT": "Le numéro de téléphone saisi est trop court.",
      "TOO_LONG": "Le numéro de téléphone saisi est trop long.",
      "INVALID_COUNTRY": "Le code du pays est invalide.",
      "INVALID_LENGTH": "La longueur du numéro de téléphone saisi n'est pas valide.",
      "NOT_A_NUMBER": "La valeur saisie n'est pas un numéro de téléphone."
    }
  • hint (string)
    Indication sur le format attendu.
    Default : "Au format national (ex : X"X est un exemple de format (au format national, fonction du pays sélectionné).

  • autoDetectCountry (boolean)
    Active la détection automatique du pays de l’usager à partir de son fuseau horaire.
    Default : true

Méthodes

Le composant expose plusieurs méthodes :

  • validatePhoneNumber() : boolean
    Valide le numéro de téléphone saisi en vérifiant :

    • Sa présence,
    • Son format (en utilisant Libphonenumber),
    • Son type (parmi ceux définis dans expectedTypes).
  • getPhoneNumberFormatted(format: 'E164' | 'NATIONAL' | 'INTERNATIONAL' | 'RFC3966') : string
    Retourne le numéro de téléphone au format demandé (national, international…).

  • getPhoneNumberType() : string
    Renvoie le type du numéro tel que retourné par Libphonenumber ("MOBILE", par exemple, pour un numéro de téléphone portable).

Note : La détection du pays via le fuseau horaire s'effectue automatiquement lors du montage du composant si la prop autoDetectCountry est activée. La méthode getDefaultCountryFromTimezone récupère le fuxeau horaire de l’usager pour définir le pays par défaut.

Propriétés exposées

Les propriétés accessibles sur le composant sont :

  • phoneNumber : le numéro de téléphone actuellement saisi.
  • selectedCountry : le code du pays sélectionné via la liste déroulante.

Personnalisation

Vous pouvez personnaliser l'apparence et le comportement du composant en lui passant des props. Par exemple :

<DsfrTel
  :expectedTypes="['MOBILE']"
  fieldsetLegend="Votre numéro de téléphone portable"
  :errorMessages="{
    required: 'La saisie de votre numéro de téléphone portable est obligatoire',
    invalid: 'Numéro de téléphone invalide',
    incorrectType: 'La saisie d\'un numéro de téléphone portable est attendue',
    unknown: 'Erreur inconnue',
    parse: 'Erreur d\'analyse'
  }"
  placeholderPrefix="Exemple : "
  :reasonMessages="{
    TOO_SHORT: 'Numéro trop court',
    TOO_LONG: 'Numéro trop long',
    INVALID_COUNTRY: 'Pays invalide',
    INVALID_LENGTH: 'Longueur invalide',
    NOT_A_NUMBER: 'Ce n’est pas un numéro'
  }"
  :autoDetectCountry="true"
/>