Éditeur riche

L'éditeur riche WYSIWYG permet la saisie et la mise en forme de contenu textuel directement dans le navigateur. Il fournit une barre d'outils complète pour le formatage, l'insertion de médias, de tableaux, de blocs de code et plus encore.

Structure complète

<div class="bj-rich-editor">
  <div class="bj-rich-editor__toolbar" role="toolbar" aria-label="Éditeur">
    <!-- Titres -->
    <div class="bj-rich-editor__toolbar-group">
      <select class="bj-rich-editor__toolbar-select" aria-label="Style de bloc">
        <option value="p">Paragraphe</option>
        <option value="h1">Titre 1</option>
        <option value="h2">Titre 2</option>
        <option value="h3">Titre 3</option>
      </select>
    </div>
    <div class="bj-rich-editor__toolbar-separator"></div>
    <!-- Formatage -->
    <div class="bj-rich-editor__toolbar-group">
      <button class="bj-rich-editor__toolbar-btn" aria-label="Gras"><i class="ri-bold"></i></button>
      <button class="bj-rich-editor__toolbar-btn" aria-label="Italique"><i class="ri-italic"></i></button>
      <button class="bj-rich-editor__toolbar-btn" aria-label="Souligné"><i class="ri-underline"></i></button>
      <button class="bj-rich-editor__toolbar-btn" aria-label="Barré"><i class="ri-strikethrough"></i></button>
    </div>
    <div class="bj-rich-editor__toolbar-separator"></div>
    <!-- Listes -->
    <div class="bj-rich-editor__toolbar-group">
      <button class="bj-rich-editor__toolbar-btn" aria-label="Liste à puces"><i class="ri-list-unordered"></i></button>
      <button class="bj-rich-editor__toolbar-btn" aria-label="Liste numérotée"><i class="ri-list-ordered"></i></button>
    </div>
    <!-- Retrait -->
    <div class="bj-rich-editor__toolbar-group">
      <button class="bj-rich-editor__toolbar-btn" aria-label="Retrait +"><i class="ri-indent-increase"></i></button>
      <button class="bj-rich-editor__toolbar-btn" aria-label="Retrait -"><i class="ri-indent-decrease"></i></button>
    </div>
    <div class="bj-rich-editor__toolbar-separator"></div>
    <!-- Alignement -->
    <div class="bj-rich-editor__toolbar-group">
      <button class="bj-rich-editor__toolbar-btn" aria-label="Gauche"><i class="ri-align-left"></i></button>
      <button class="bj-rich-editor__toolbar-btn" aria-label="Centre"><i class="ri-align-center"></i></button>
      <button class="bj-rich-editor__toolbar-btn" aria-label="Droite"><i class="ri-align-right"></i></button>
      <button class="bj-rich-editor__toolbar-btn" aria-label="Justifié"><i class="ri-align-justify"></i></button>
    </div>
    <div class="bj-rich-editor__toolbar-separator"></div>
    <!-- Insertion -->
    <div class="bj-rich-editor__toolbar-group">
      <button class="bj-rich-editor__toolbar-btn" aria-label="Lien"><i class="ri-link"></i></button>
      <button class="bj-rich-editor__toolbar-btn" aria-label="Supprimer le lien"><i class="ri-link-unlink"></i></button>
      <button class="bj-rich-editor__toolbar-btn" aria-label="Image"><i class="ri-image-line"></i></button>
      <button class="bj-rich-editor__toolbar-btn" aria-label="Vidéo"><i class="ri-video-line"></i></button>
      <button class="bj-rich-editor__toolbar-btn" aria-label="Tableau"><i class="ri-table-line"></i></button>
    </div>
    <div class="bj-rich-editor__toolbar-separator"></div>
    <!-- Blocs -->
    <div class="bj-rich-editor__toolbar-group">
      <button class="bj-rich-editor__toolbar-btn" aria-label="Citation"><i class="ri-double-quotes-l"></i></button>
      <button class="bj-rich-editor__toolbar-btn" aria-label="Code"><i class="ri-code-line"></i></button>
      <button class="bj-rich-editor__toolbar-btn" aria-label="Ligne"><i class="ri-separator"></i></button>
      <button class="bj-rich-editor__toolbar-btn" aria-label="Effacer"><i class="ri-format-clear"></i></button>
    </div>
    <div class="bj-rich-editor__toolbar-separator"></div>
    <!-- Couleurs -->
    <div class="bj-rich-editor__toolbar-group">
      <div class="bj-rich-editor__color-picker">
        <button class="bj-rich-editor__toolbar-btn" aria-label="Couleur du texte"><i class="ri-font-color"></i></button>
        <input type="color" value="#000000" aria-label="Couleur du texte">
      </div>
      <div class="bj-rich-editor__color-picker">
        <button class="bj-rich-editor__toolbar-btn" aria-label="Couleur de fond"><i class="ri-paint-fill"></i></button>
        <input type="color" value="#ffff00" aria-label="Couleur de fond">
      </div>
    </div>
    <div class="bj-rich-editor__toolbar-separator"></div>
    <!-- Historique -->
    <div class="bj-rich-editor__toolbar-group">
      <button class="bj-rich-editor__toolbar-btn" aria-label="Annuler"><i class="ri-arrow-go-back-line"></i></button>
      <button class="bj-rich-editor__toolbar-btn" aria-label="Rétablir"><i class="ri-arrow-go-forward-line"></i></button>
    </div>
  </div>
  <div class="bj-rich-editor__content"
       contenteditable="true"
       role="textbox"
       aria-multiline="true"
       data-placeholder="Saisissez votre texte...">
  </div>
</div>

Placeholder et hauteur

Le composant Vue fixe le texte fantôme via l’attribut data-placeholder sur bj-rich-editor__content (style CSS ::before). La hauteur minimale éditable correspond à la prop height, rendue en min-height inline sur la même zone. Une barre d’outils réduite correspond à la prop toolbar (sous-ensemble de TOOLBAR_ALL).

<div class="bj-rich-editor" style="max-width: 40rem">
  <div class="bj-rich-editor__toolbar" role="toolbar" aria-label="Éditeur">
    <div class="bj-rich-editor__toolbar-group">
      <button type="button" class="bj-rich-editor__toolbar-btn" aria-label="Gras"><i class="ri-bold" aria-hidden="true"></i></button>
      <button type="button" class="bj-rich-editor__toolbar-btn" aria-label="Italique"><i class="ri-italic" aria-hidden="true"></i></button>
    </div>
  </div>
  <div class="bj-rich-editor__content"
       contenteditable="true"
       role="textbox"
       aria-multiline="true"
       data-placeholder="Saisissez votre message…"
       style="min-height: 12rem">
  </div>
</div>

Barre d’outils partielle

En HTML/CSS, reproduisez seulement les groupes nécessaires ; chaque bouton reste un bj-rich-editor__toolbar-btn dans un bj-rich-editor__toolbar-group.

Barre d'outils

<!-- Bouton normal -->
<button class="bj-rich-editor__toolbar-btn" aria-label="Gras">
  <i class="ri-bold"></i>
</button>

<!-- Bouton actif -->
<button class="bj-rich-editor__toolbar-btn bj-rich-editor__toolbar-btn--active" aria-label="Gras">
  <i class="ri-bold"></i>
</button>

<!-- Sélecteur de couleur -->
<div class="bj-rich-editor__color-picker">
  <button class="bj-rich-editor__toolbar-btn" aria-label="Couleur du texte">
    <i class="ri-font-color"></i>
  </button>
  <input type="color" value="#000000" aria-label="Choisir la couleur">
</div>

État désactivé

Contenu en lecture seule
<div class="bj-rich-editor bj-rich-editor--disabled">
  <div class="bj-rich-editor__toolbar" role="toolbar" aria-label="Éditeur">
    <div class="bj-rich-editor__toolbar-group">
      <button class="bj-rich-editor__toolbar-btn" aria-label="Gras"><i class="ri-bold"></i></button>
      <button class="bj-rich-editor__toolbar-btn" aria-label="Italique"><i class="ri-italic"></i></button>
    </div>
  </div>
  <div class="bj-rich-editor__content"
       contenteditable="false"
       role="textbox"
       aria-multiline="true">
    Contenu en lecture seule
  </div>
</div>

Contenu pré-rempli

Titre d'exemple

Un paragraphe avec du texte gras et italique.

  • Premier élément
  • Deuxième élément
Une citation importante.
<div class="bj-rich-editor">
  <div class="bj-rich-editor__toolbar" role="toolbar" aria-label="Éditeur">
    ...
  </div>
  <div class="bj-rich-editor__content"
       contenteditable="true"
       role="textbox"
       aria-multiline="true">
    <h2>Titre d'exemple</h2>
    <p>Un paragraphe avec du texte <strong>gras</strong> et <em>italique</em>.</p>
    <ul>
      <li>Premier élément</li>
      <li>Deuxième élément</li>
    </ul>
    <blockquote>Une citation importante.</blockquote>
  </div>
</div>

Raccourcis clavier

Ctrl/Cmd + B → Gras
Ctrl/Cmd + I → Italique
Ctrl/Cmd + U → Souligné
Ctrl/Cmd + Z → Annuler
Ctrl/Cmd + Shift + Z → Rétablir
Ctrl/Cmd + Y → Rétablir

Classes CSS

ClasseDescription
bj-rich-editorConteneur principal de l'éditeur.
bj-rich-editor--disabledÉtat désactivé (opacité réduite, interactions bloquées).
bj-rich-editor__toolbarBarre d'outils contenant les boutons de formatage.
bj-rich-editor__toolbar-groupGroupe de boutons dans la toolbar.
bj-rich-editor__toolbar-btnBouton individuel de la toolbar.
bj-rich-editor__toolbar-btn--activeÉtat actif d'un bouton de toolbar.
bj-rich-editor__toolbar-separatorSéparateur vertical entre groupes.
bj-rich-editor__toolbar-selectMenu déroulant dans la toolbar (ex: titres).
bj-rich-editor__contentZone de contenu éditable.
data-placeholder (content)Attribut <code>data-placeholder</code> sur la zone éditable (texte vide).
min-height / heightHauteur : <code>min-height</code> inline (équivalent prop <code>height</code> Vue).
bj-rich-editor__color-pickerConteneur du sélecteur de couleur.

Accessibilité

Le conteneur de la toolbar possède role="toolbar" et un aria-label. La zone éditable utilise role="textbox" et aria-multiline="true". Chaque bouton de la toolbar expose un aria-label descriptif. L'état désactivé utilise pointer-events: none et une opacité réduite. Le composant expose aria-busy si nécessaire lors de traitements asynchrones.