Démo interactive
21 templates à charger dans l'éditeur
Article de blog
Titre, intro, liste à puces, blockquote et section code. Structure éditoriale classique.
Newsletter mensuelle
Header coloré, mise en page 2 colonnes (contenu + sidebar chiffres), bouton CTA.
Pipeline CI/CD
Flowchart LR complet : lint → tests → build → Docker → staging → approval → prod.
Flux Auth OAuth2
Diagramme de séquence : Frontend → API Gateway → Auth Service → Redis Cache.
Planning Gantt Q2
Roadmap 4 sprints avec tâches done/active/à venir et milestone de release.
Grille Pricing
3 colonnes flexbox (Starter / Pro / Enterprise) avec tarifs, features et CTA différenciés.
Rapport Dashboard
KPIs en 4 colonnes, pie chart sources de trafic, tableau top pages avec métriques.
Documentation API
Référence technique avec blocs code, tableau de props, notes blockquote et exemples.
Workflow commande
State diagram du cycle de vie e-commerce : panier → paiement → expédition → retour.
Schéma BDD SaaS
Diagramme ER multi-tenant : Organization → Workspace → Project + Users + AuditLog.
Menu gastronomique
Carte élégante avec photos Unsplash, entrées / plats / desserts, mise en page colonnes.
Bistrot parisien
Carte brasserie avec formule du jour, tableau de prix, galerie desserts et photos.
Physique — Équations fondamentales
E=mc², équation de Schrödinger, équations de Maxwell. Formules en mode bloc et inline.
Mathématiques — Analyse
Série de Taylor, intégrale de Gauss, formule d'Euler. Mix bloc / inline dans le texte.
Statistiques & Machine Learning
Distribution normale, régression linéaire, gradient descent — avec formules et explications.
Architecture microservices
Schéma d'architecture avec API Gateway, services, bases de données et queues de messages.
Wireframe landing page
Maquette basse fidélité avec header, hero, features, pricing et footer.
Mind map — Stratégie produit
Carte mentale avec branches : Vision, Roadmap, Personas, KPIs, Risques.
User flow — Onboarding
Parcours utilisateur de l'inscription à l'activation du compte, avec décisions et étapes.
Board Kanban Sprint
Tableau Kanban avec colonnes Todo / In Progress / Review / Done et cartes de tâches.
Sushi Bar japonais
Menu épuré dark-mode avec plateaux, ramen, photos de plats et section livraison.
Flux facturation électronique
Cycle de vie complet d'une facture : création, validation, envoi, paiement, relance — diagramme Mermaid interactif.
Processus commande B2B
Séquence complète Client → Commercial → ERP → Entrepôt → Logistique avec échanges de messages et validations.
Pipeline livraison e-commerce
Flux de traitement d'une commande en ligne : panier, paiement, préparation, expédition, livraison, retour.
Analyse de signal — Mix complet
Transformée de Fourier en KaTeX, pipeline FFT en Mermaid et signal sinusoïdal dessiné en SVG natif.
Carte de visite numérique
Profil dev avec 3 QR codes générés à la volée — site web, GitHub, npm. Éditable en un clic.
Presets toolbar — reconfigurer l'éditeur à la volée
Chaque preset correspond à une configuration toolbar utilisée dans l'ERP Adliss.
🚀 Installation
npm install @synapxlab/wysiwyg
yarn add @synapxlab/wysiwyg
Modules optionnels :
# Diagrammes Mermaid
npm install mermaid
# Formules mathématiques KaTeX
npm install katex
# Dessins Excalidraw (nécessite React 18)
npm install @excalidraw/excalidraw react react-dom --legacy-peer-deps
Ou via CDN (ESM) :
<script type="module">
import { WysiwygEditor } from 'https://cdn.jsdelivr.net/npm/@synapxlab/wysiwyg/dist/wysiwyg.es.js';
import 'https://cdn.jsdelivr.net/npm/@synapxlab/wysiwyg/dist/style.css';
</script>
⚡ Démarrage rapide
import { WysiwygEditor } from '@synapxlab/wysiwyg';
import '@synapxlab/wysiwyg/style.css';
const editor = new WysiwygEditor({
upload: async (file) => {
const fd = new FormData();
fd.append('file', file);
return (await (await fetch('/upload', { method:'POST', body:fd })).json()).url;
},
});
document.getElementById('app').appendChild(editor.el);
editor.setValue('<p>Bonjour <strong>monde</strong></p>');
editor.onChange = () => console.log(editor.getValue());
const { WysiwygEditor } = require('@synapxlab/wysiwyg');
const editor = new WysiwygEditor();
document.getElementById('app').appendChild(editor.el);
🔧 Options toolbar
Tous les groupes sont activés par défaut. Passez false pour désactiver.
new WysiwygEditor({
toolbar: { mermaid: true, math: true, draw: true, excalidraw: true, twig: false }, // opt-in
wordCount: true,
upload: async (file: File) => 'https://…/url.jpg',
mermaid: mermaidInstance, // requis si toolbar.mermaid: true
katex: katexInstance, // requis si toolbar.math: true
excalidraw: { Excalidraw, exportToSvg, React, ReactDOM }, // requis si toolbar.excalidraw: true
});
{
source, formatHtml, history, fullscreen,
lists, align, direction,
link, image, table, grid,
heading, font, textColor,
blockquote, divider, specialChars,
mermaid, // opt-in — passer opts.mermaid aussi
math, // opt-in — passer opts.katex aussi
draw, // opt-in — éditeur vectoriel natif, zéro dépendance
excalidraw, // opt-in — passer opts.excalidraw aussi
twig, // opt-in — 27 snippets Twig prêts
}
📖 API publique
editor.getValue(): string // HTML courant
editor.setValue(html: string) // Injecter du contenu
editor.focus(): void // Placer le curseur
editor.onChange?: () => void // Appelé à chaque modif
editor.el: HTMLElement // Élément racine à monter
Note : editor.el doit être monté dans le DOM avant d'appeler setValue().
Types TypeScript
import type { WysiwygOptions, WysiwygToolbarConfig } from '@synapxlab/wysiwyg';
🧩 Mermaid (opt-in)
Injectez votre propre instance Mermaid v10+. Zéro impact bundle si non utilisé.
import mermaid from 'mermaid';
mermaid.initialize({ startOnLoad: false });
new WysiwygEditor({ mermaid, toolbar: { mermaid: true } });
- Flowchart, sequence, gantt, pie, stateDiagram, erDiagram
- Cliquez un diagramme existant pour le ré-éditer
- Erreurs affichées inline dans la modale
- Blocs
```mermaid```dans le source HTML strippés automatiquement
∑ KaTeX — Formules mathématiques (opt-in)
Injectez votre propre instance KaTeX. Zéro impact bundle si non utilisé. Chargez le CSS KaTeX séparément.
import katex from 'katex';
import 'katex/dist/katex.min.css';
new WysiwygEditor({ katex, toolbar: { math: true } });
- Cliquez le bouton Σ → saisissez la formule LaTeX (ex.
\frac{a}{b}) - Mode bloc (centré,
$$...$$) ou mode inline (dans le texte,$...$) - Les délimiteurs
$$...$$/$...$sont retirés automatiquement - Cliquez une formule existante → rouvre la modale avec le code pré-rempli
- Stocké sous
<div|span class="be-math" data-math-code="...">
🖊️ Éditeur vectoriel natif (opt-in)
Dessinez et annotez directement dans le contenu. L'éditeur SVG est désormais un package autonome — installez-le séparément puis injectez-le comme dépendance.
Installation
npm install @synapxlab/draw
Intégration
import { WysiwygEditor } from '@synapxlab/wysiwyg';
import { DrawEditor } from '@synapxlab/draw';
import '@synapxlab/draw/style.css';
new WysiwygEditor({
draw: DrawEditor,
toolbar: { draw: true },
});
- 7 outils — sélection, crayon, rectangle, ellipse, ligne, flèche, texte multiligne
- Sélection → 8 poignées de redimensionnement + rotation libre
- Support tactile — fonctionne sur tablette et mobile
- Double-clic sur un texte → édition en place
- Panneau propriétés : couleur, arrière-plan, style texte, transparence, z-order
- Annuler
Ctrl+Z, supprimerSuppr - Clic sur un dessin inséré → panneau style + bouton Modifier le dessin
▣ QR Code (opt-in)
Insérez et modifiez des QR codes SVG directement dans le contenu — couleurs, taille, correction d'erreur. Basé sur @synapxlab/qrcode, zéro dépendance runtime.
Installation
npm install @synapxlab/qrcode
Intégration
import { WysiwygEditor } from '@synapxlab/wysiwyg';
import { QRCode } from '@synapxlab/qrcode';
new WysiwygEditor({
qrcode: QRCode,
toolbar: { qrcode: true },
});
- Génération SVG inline — retaillable à l'infini, zéro canvas
- Couleur des modules, couleur de fond, marge, niveau de correction L/M/Q/H
- Clic sur un QR inséré → modale de modification (toutes les options)
- Données stockées en
data-qr-*— re-générables côté serveur
🌿 Twig snippets (opt-in)
Activez le panneau de snippets Twig pour insérer rapidement des variables, structures et filtres dans le contenu. Les snippets sont insérés en texte brut — traités nativement par votre moteur Twig côté serveur.
new WysiwygEditor({
toolbar: { twig: true },
});
- Cliquez le bouton { } → panneau latéral avec snippets groupés par catégorie
- 6 catégories intégrées : Variable, Structure, Filtre, Client, Facture, Système
- Coloration syntaxique Twig en mode source (variables
{{ }}et blocs{% %}) - Snippets personnalisés injectables via
twigSnippets: [ { cat, label, code } ]
Variables & structures
Accès aux données du contexte, conditions et boucles :
{{ customer.company }} {# Société #}
{{ invoice.date|date('d/m/Y') }} {# Date formatée #}
{{ invoice.total_ttc|number_format(2, ',', ' ') }} €
{% if invoice.status == 'PAID' %}
Facture réglée ✓
{% else %}
En attente de paiement
{% endif %}
{% for line in invoice.lines %}
{{ line.label }} — {{ line.qty }} × {{ line.unit_price }} €
{% endfor %}
Filtres natifs Twig
{{ texte|upper }} {# MAJUSCULES #}
{{ texte|lower }} {# minuscules #}
{{ texte|nl2br }} {# Sauts de ligne →
#}
{{ variable|default('N/A') }} {# Valeur par défaut #}
{{ tableau|length }} {# Nombre d'éléments #}
{{ date|date('d/m/Y') }} {# Format date #}
{{ nombre|number_format(2,',',' ') }} {# 1 234,56 #}
Filtres d'extension Twig personnalisés
Injectez vos propres filtres métier via twigSnippets — ils restent dans votre projet et ne sont pas embarqués dans le package :
{# Montant en lettres → "MILLE DEUX CENTS EUROS" #}
{{ invoice.total_ttc|asLetters }}
{# Date en lettres → "le 24 mars 2026" #}
{{ invoice.date|asLetters }}
{# Expressions de date dynamiques résolues à l'exécution #}
{{ "Rapport de {{mount/year}}"|dateExpression(invoice.date) }}
{# → "Rapport de Mars 2026" #}
{# Traduction de valeurs BDD (DRAFT, PAID, BANK_TRANSFER…) #}
{{ "Statut : {{status}}"|Expression('status', invoice.status) }}
{# → "Statut : Payé" #}
{# JSON sécurisé pour attributs HTML #}
{# Traduction i18n #}
{{ __('invoice.title') }}
Injection de snippets personnalisés
Passez vos filtres métier via l'option twigSnippets — chaque entrée a une catégorie, un libellé et le code à insérer :
new WysiwygEditor({
toolbar: { twig: true },
twigSnippets: [
{ cat: 'Mon ERP', label: '|asLetters', code: 'montant en lettres' },
{ cat: 'Mon ERP', label: '|dateExpression', code: 'expression de date' },
{ cat: 'Mon ERP', label: '|jsonAttr', code: 'json pour attribut HTML' },
],
});
🎨 Thème CSS vars
Toutes les couleurs dans des variables CSS scopées à .be-wysiwyg.
.be-wysiwyg {
--be-primary: #4f46e5;
--be-bg: #f8f9fa;
--be-surface: #ffffff;
--be-border: #e5e7eb;
--be-text: #111827;
--be-radius: 6px;
--be-font: system-ui, sans-serif;
--be-font-mono: 'Courier New', monospace;
}
.be-wysiwyg {
--be-primary: #6366f1;
--be-bg: #0f172a;
--be-surface: #1e293b;
--be-border: #334155;
--be-text: #f1f5f9;
}
👁 Rendu final
Le bouton Afficher sous l'éditeur ouvre une modale qui affiche le HTML généré en rendu final,
encapsulé dans un conteneur .wysiwyg_view.
Ce rendu correspond à un affichage dans une page HTML classique — identique à ce que produirait
$twig->createTemplate($html) côté serveur.
- ✅ Typographie complète : titres, paragraphes, listes, blockquote, code
- ✅ Tableaux avec zebra-stripes
- ✅ Diagrammes Mermaid (SVG inline)
- ✅ Formules KaTeX (HTML déjà rendu + CSS chargé)
- ✅ QR codes (SVG inline)
- ✅ Dessins vectoriels (SVG inline)
- ✅ Grilles flexbox et mises en page multi-colonnes
Pour intégrer le rendu dans votre projet, ajoutez la classe .wysiwyg_view sur le conteneur
qui reçoit le HTML, et chargez le CSS KaTeX si des formules mathématiques sont présentes.
<div class="wysiwyg_view">
</div>
// PHP
$twig->createTemplate($html);
🌐 Compatibilité
- ✅ Navigateurs modernes (Chrome 90+, Firefox 88+, Safari 14+, Edge 90+)
- ✅ Node.js ≥ 18 (SSR : importez, n'instanciez pas côté serveur)
- ✅ React, Vue, Angular, Svelte — montez
editor.eldans un ref/onMount - ✅ Vite, Webpack, Rollup, ESBuild
- ❌ IE11 non supporté
Licence
MIT — Utilisez, modifiez, redistribuez librement.
Code source : github.com/synapxLab/wysiwyg