Skip to content

Citation - DsfrQuote

🌟 Introduction

Le composant DsfrQuote permet d’afficher une citation stylisée, accompagnée d’un auteur, d’une source, et éventuellement d’une image illustrative. Ce composant respecte les standards du Design System de l'État Français (DSFR) pour offrir une présentation élégante et accessible.

🏅 La documentation sur les liens d’évitement le DSFR

La story sur les liens d’évitement sur le storybook de VueDsfr

📐 Structure

Le composant affiche :

  • Une citation (<blockquote>) avec un lien optionnel vers la source.
  • Une légende (<figcaption>) contenant :
    • Le nom de l’auteur.
    • La source de la citation, accompagnée d’un lien ou de détails supplémentaires.
  • Une image optionnelle, destinée à illustrer visuellement la citation.

🛠️ Props

NomTypeDéfautDescription
quotestringundefinedTexte de la citation.
authorstringundefinedNom de l’auteur de la citation.
details{ label: string, url: string }[][]Détails supplémentaires sous forme de liste (liens ou texte).
sourcestring''Nom de la source de la citation.
sourceUrlstring''URL de la source, utilisée pour l’attribut cite du bloc de citation.
quoteImagestring''URL de l’image illustrative associée à la citation.

📡 Événements

Aucun événement spécifique n'est émis par ce composant.

🧩 Slots

Aucun slot disponible pour ce composant.

📝 Exemples

Exemple de base

vue
<DsfrQuote
  quote="L'accessibilité numérique est un droit fondamental."
  author="Tim Berners-Lee"
  source="W3C"
  sourceUrl="https://www.w3.org/"
  :details="[
    { label: 'Voir le site officiel', url: 'https://www.w3.org/' }
  ]"
  quoteImage="https://www.example.com/image.jpg"
/>

Exemple complet

vue
<script lang="ts" setup>
import DsfrQuote from '../DsfrQuote.vue'

const quote = 'LA citation'
const author = 'Pierre-Louis EGAUD'
const details = [
  {
    url: 'https://www.wikipedia.fr',
    label: 'wikipedia',
  },
]
const source = 'Duckduckgo'
const sourceUrl = 'https://www.duckduckgo.com'
const quoteImage = 'https://loremflickr.com/g/150/150/cat?random=1'
</script>

<template>
  <DsfrQuote
    :quote="quote"
    :author="author"
    :details="details"
    :source="source"
    :source-url="sourceUrl"
    :quote-image="quoteImage"
  />
</template>

⚙️ Code source du composant

vue
<script lang="ts" setup>
import type { DsfrQuoteProps } from './DsfrQuote.types'

export type { DsfrQuoteProps }

withDefaults(defineProps<DsfrQuoteProps>(), {
  quote: undefined,
  author: undefined,
  details: () => [],
  source: '',
  sourceUrl: '',
  quoteImage: '',
})
</script>

<template>
  <figure class="fr-quote fr-quote--column">
    <blockquote
      v-if="source"
      :cite="sourceUrl"
    >
      <p>« {{ quote }} »</p>
    </blockquote>

    <figcaption>
      <p class="fr-quote__author">
        {{ author }}
      </p>

      <ul class="fr-quote__source">
        <li>
          <cite>{{ source }}</cite>
        </li>

        <li
          v-for="(detail, index) of details"
          :key="index"
        >
          <a
            v-if="typeof detail === 'object'"
            target="_blank"
            rel="noopener noreferrer"
            :href="detail.url"
          >
            {{ detail.label }}
          </a>
          <template v-else>
            {{ detail }}
          </template>
        </li>
      </ul>

      <div
        v-if="quoteImage"
        class="fr-quote__image"
      >
        <img
          :src="quoteImage"
          class="fr-responsive-img"
          alt=""
        >
        <!-- L’alternative de l’image (attribut alt) doit rester vide car l’image est illustrative et ne doit pas être restituée aux technologies d’assistance -->
      </div>
    </figcaption>
  </figure>
</template>
ts
export type DsfrQuoteProps = {
  quote?: string
  author?: string
  details: { label: string, url: string }[]
  source: string
  sourceUrl: string
  quoteImage: string
}