Skip to content

Transcription - DsfrTranscription

🏅 La documentation sur la transcription sur le DSFR

La story sur la transcription sur le storybook de VueDsfr

🌟 Introduction

Le composant DsfrTranscription est conçu pour afficher la transcription du contenu d'une vidéo. Il permet aux utilisateurs d'accéder facilement au texte de la vidéo, offrant ainsi une meilleure accessibilité. Le composant peut afficher la transcription dans une section extensible ou dans une fenêtre modale pour une lecture plus confortable.

Le DsfrTranscription peut afficher la transcription dans une section extensible ou la charger dans une fenêtre modale grâce à l'utilisation du composant DsfrModal et du Teleport pour un rendu à l'extérieur de la hiérarchie DOM parent.

📐 Structure

  • <DsfrTranscription> : Le composant principal.
    • Contient un bouton pour afficher ou masquer la transcription.
    • Affiche la transcription dans une section extensible ou une fenêtre modale.

🛠️ Props

PropriétéTypeDescriptionValeur par défaut
idstringID unique pour le composant, utilisé pour l'accessibilité.getRandomId('transcription')
titlestringTitre de la transcription.'Titre de la vidéo'
contentstringContenu de la transcription.'Transcription du contenu de la vidéo'

📡 Événements

Ce composant ne déclenche pas d'événements spécifiques.

🧩 Slots

  • default : Slot pour insérer du contenu personnalisé à la place de la transcription par défaut.

📝 Exemples

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

const title = 'Titre de la transcription'
const content = 'Contenu de la transcription'
</script>

<template>
  <DsfrTranscription
    :title="title"
    :content="content"
  />
</template>

⚙️ Code source du composant

vue
<script lang="ts" setup>
import { computed, ref, watch } from 'vue'

import { useCollapsable } from '../../composables'
import { getRandomId } from '../../utils/random-utils'

import DsfrModal from '../DsfrModal/DsfrModal.vue'

import type { DsfrTranscriptionProps } from './DsfrTranscription.types'

export type { DsfrTranscriptionProps }

const props = withDefaults(defineProps<DsfrTranscriptionProps>(), {
  id: () => getRandomId('transcription'),
  title: 'Titre de la vidéo',
  content: 'Transcription du contenu de la vidéo',
})

const {
  collapse,
  collapsing,
  cssExpanded,
  doExpand,
  onTransitionEnd,
} = useCollapsable()

const opened = ref(false)
const expanded = ref(false)

const modalId = computed(() => {
  return `fr-transcription__modal-${props.id}`
})
const collapseId = computed(() => {
  return `fr-transcription__collapse-${props.id}`
})

watch(expanded, (newValue, oldValue) => {
  if (newValue !== oldValue) {
    doExpand(newValue)
  }
})
</script>

<template>
  <div class="fr-transcription">
    <button
      class="fr-transcription__btn"
      :aria-expanded="expanded"
      :aria-controls="collapseId"
      @click="expanded = !expanded"
    >
      Transcription
    </button>
    <div
      :id="collapseId"
      ref="collapse"
      class="fr-collapse"
      :class="{ 'fr-collapse--expanded': cssExpanded, 'fr-collapsing': collapsing }"
      @transitionend="onTransitionEnd(expanded)"
    >
      <dialog
        :id="modalId"
        class="fr-modal"
        role="dialog"
        :aria-labelledby="`${modalId}-title`"
      >
        <div class="fr-container fr-container--fluid fr-container-md">
          <div class="fr-grid-row fr-grid-row--center">
            <div class="fr-col-12 fr-col-md-10 fr-col-lg-8">
              <div class="fr-modal__body">
                <div class="fr-modal__header">
                  <button
                    class="fr-btn--close fr-btn"
                    :aria-controls="modalId"
                    title="Fermer"
                  >
                    Fermer
                  </button>
                </div>
                <div class="fr-modal__content">
                  <h1
                    :id="`${modalId}-title`"
                    class="fr-modal__title"
                  >
                    {{ title }}
                  </h1>
                  {{ content }}
                </div>
                <div class="fr-transcription__footer">
                  <div class="fr-transcription__actions-group">
                    <button
                      class="fr-btn fr-btn--fullscreen"
                      :aria-controls="modalId"
                      data-fr-opened="false"
                      title=""
                      @click="opened = true"
                    >
                      Agrandir
                    </button>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </dialog>
    </div>
    <Teleport to="body">
      <DsfrModal
        :title="title"
        :opened="opened"
        @close="opened = false"
      >
        <slot>
          {{ content }}
        </slot>
      </DsfrModal>
    </Teleport>
  </div>
</template>
ts
export type DsfrTranscriptionProps = {
  id?: string
  title?: string
  content?: string
}