BjRichEditor

Composant Vue WYSIWYG pour la saisie de contenu riche. Basé sur contenteditable, sans dépendance externe. Supporte v-model, toolbar configurable et raccourcis clavier (Ctrl+B, Ctrl+I, Ctrl+U, Ctrl+Z, Ctrl+Y).

Utilisation

<script setup>
import { ref } from 'vue'
import { BjRichEditor } from '@flrxnt/dsbj/vue'

const content = ref('<p>Contenu initial</p>')
</script>

<template>
  <BjRichEditor v-model="content" placeholder="Saisissez votre texte..." />
</template>

v-model et contenu HTML

Le contenu éditable déclenche update:modelValue avec le HTML interne (sanitisé côté lecture de la prop).

<script setup lang="ts">
import { ref, watch } from 'vue'
import { BjRichEditor } from '@flrxnt/dsbj/vue'

const html = ref('<p>Départ</p>')
watch(html, (v) => console.log('update:modelValue', v))
</script>

<template>
  <BjRichEditor v-model="html" placeholder="Éditez ici…" />
</template>

Aperçu interactif (toolbar complète)

Toolbar personnalisée

<BjRichEditor
  v-model="content"
  :toolbar="['heading', 'bold', 'italic', 'underline', 'unorderedList', 'orderedList', 'link']"
  placeholder="Éditeur simplifié..."
/>

État désactivé

<BjRichEditor
  model-value="<p>Ce contenu est en lecture seule.</p>"
  :disabled="true"
/>

Contenu pré-rempli

<script setup>
import { ref } from 'vue'
import { BjRichEditor } from '@flrxnt/dsbj/vue'

const content = ref(`
  <h2>Mon article</h2>
  <p>Un paragraphe avec du <strong>gras</strong> et de l'<em>italique</em>.</p>
  <ul>
    <li>Premier point</li>
    <li>Deuxième point</li>
  </ul>
  <blockquote>Une citation remarquable.</blockquote>
  <pre><code>console.log('Hello DSBJ')</code></pre>
`)
</script>

<template>
  <BjRichEditor v-model="content" />
</template>

Hauteur personnalisée

<BjRichEditor
  v-model="content"
  height="24rem"
  placeholder="Éditeur plus haut..."
/>

Outils disponibles

// Tous les outils disponibles :
const TOOLBAR_ALL = [
  'heading',        // Sélecteur H1/H2/H3/P
  'bold',           // Gras (Ctrl+B)
  'italic',         // Italique (Ctrl+I)
  'underline',      // Souligné (Ctrl+U)
  'strikethrough',  // Barré
  'unorderedList',  // Liste à puces
  'orderedList',    // Liste numérotée
  'indent',         // Augmenter le retrait
  'outdent',        // Réduire le retrait
  'alignLeft',      // Aligner à gauche
  'alignCenter',    // Centrer
  'alignRight',     // Aligner à droite
  'alignJustify',   // Justifier
  'link',           // Insérer un lien
  'unlink',         // Supprimer le lien
  'image',          // Insérer une image (URL)
  'video',          // Insérer une vidéo (embed)
  'table',          // Insérer un tableau
  'blockquote',     // Citation
  'codeBlock',      // Bloc de code
  'removeFormat',   // Effacer le formatage
  'textColor',      // Couleur du texte
  'bgColor',        // Couleur de fond
  'horizontalRule', // Ligne horizontale
  'undo',           // Annuler (Ctrl+Z)
  'redo',           // Rétablir (Ctrl+Y)
]

Props

PropDescription
modelValueContenu HTML (v-model) ; le composant émet update:modelValue à chaque modification.
placeholderTexte indicatif quand l'éditeur est vide.
disabledDésactive l'éditeur.
toolbarListe des outils à afficher. Par défaut, tous sont affichés.
heightHauteur minimale de la zone éditable (ex: "20rem").

Accessibilité

Le composant expose role="textbox" et aria-multiline="true" sur la zone éditable. La toolbar a role="toolbar" avec aria-label. Chaque bouton a un aria-label descriptif. En état disabled, le composant passe contenteditable="false" et réduit l'opacité.