BjRichEditor

Composant React WYSIWYG pour la saisie de contenu riche. Basé sur contenteditable, sans dépendance externe. Raccourcis clavier intégrés (Ctrl+B, Ctrl+I, Ctrl+U, Ctrl+Z, Ctrl+Y).

Utilisation

import { useState } from 'react'
import { BjRichEditor } from '@flrxnt/dsbj/react'

export default function App() {
  const [content, setContent] = useState('<p>Contenu initial</p>')

  return (
    <BjRichEditor
      value={content}
      onChange={setContent}
      placeholder="Saisissez votre texte..."
    />
  )
}

Aperçu (toolbar complète)

Toolbar personnalisée

<BjRichEditor
  value={content}
  onChange={setContent}
  toolbar={['heading', 'bold', 'italic', 'underline', 'unorderedList', 'orderedList', 'link']}
  placeholder="Éditeur simplifié..."
/>

État désactivé

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

Contenu pré-rempli

import { useState } from 'react'
import { BjRichEditor } from '@flrxnt/dsbj/react'

export default function Article() {
  const [content, setContent] = useState(`
    <h2>Mon article</h2>
    <p>Texte 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>
  `)

  return <BjRichEditor value={content} onChange={setContent} />
}

Outils disponibles

// Tous les outils disponibles :
import { TOOLBAR_ALL } from '@flrxnt/dsbj/react'

// 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)
// ]

Combinaisons

toolbar réduite, hauteur fixe, placeholder et valeur initiale ensemble.

Brouillon

import { useState } from 'react'
import { BjRichEditor } from '@flrxnt/dsbj/react'

export default function App() {
  const [html, setHtml] = useState('<p><strong>Brouillon</strong></p>')
  return (
    <BjRichEditor
      className="article-editor"
      value={html}
      onChange={setHtml}
      placeholder="Rédigez ici…"
      height="220px"
      toolbar={['bold', 'italic', 'unorderedList', 'orderedList', 'link', 'removeFormat']}
    />
  )
}

Contenu contrôlé et onChange

value synchronise le HTML ; onChange(html) à chaque saisie ou action toolbar.

import { useState } from 'react'
import { BjRichEditor } from '@flrxnt/dsbj/react'

export default function App() {
  const [body, setBody] = useState('')
  return (
    <BjRichEditor
      value={body}
      onChange={(next) => {
        setBody(next)
        console.log('length', next.length)
      }}
      placeholder="Le HTML est mis à jour à chaque frappe."
    />
  )
}

Props

PropDescription
valueContenu HTML.
onChangeCallback appelé à chaque modification avec le HTML mis à jour.
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.
classNameClasse CSS sur le conteneur bj-rich-editor.

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= et réduit l'opacité.