Passer au contenu principal

Configuration

EditorConfig et RendererConfig sont les points d'entrée de toute personnalisation. Passez l'un ou l'autre à Editor.create() ou Renderer.render() respectivement. Seuls containerId (et data pour le renderer) sont obligatoires ; toutes les autres options ont des valeurs par défaut sûres.

EditorConfig

Passez EditorConfig comme seul argument à Editor.create(). Le containerId requis doit correspondre à un id d'élément DOM existant.

OptionTypeRequisDescription
containerIdstringOuiIdentifiant de l'élément DOM qui hébergera l'éditeur. Doit exister dans le DOM avant l'appel à Editor.create().
maxHeightnumberNonHauteur maximale de l'éditeur en pixels. Définissez à 0 (la valeur par défaut) pour ne pas limiter la hauteur.
minHeightnumberNonHauteur minimale de l'éditeur en pixels. Vaut 300 par défaut.
onChange(data: EditorData) => voidNonRappel déclenché à chaque modification du document. Reçoit la capture complète de l'EditorData.
onReady() => voidNonRappel déclenché une fois que l'éditeur est entièrement initialisé et prêt à recevoir des appels API.
placeholderstringNonTexte de remplacement affiché quand l'éditeur est vide. Vaut « Start writing... » par défaut.
initialDataEditorDataNonEditorData préremplie à charger lors du montage de l'éditeur.
initialView'edit' | 'preview' | 'json'NonMode d'affichage initial. L'une des valeurs : edit, preview, json. Vaut 'edit' par défaut.
allowJsonViewEditingbooleanNonLorsque true, la vue JSON est modifiable et les modifications se propagent dans le document. Vaut false par défaut.
hasViewSwitcherbooleanNonLorsque false, les boutons modifier, aperçu et JSON sont retirés de la barre d'actions. Vaut true par défaut.
hasDocumentActionsbooleanNonLorsque false, les boutons copier, télécharger et vider sont retirés de la barre d'actions. Si hasViewSwitcher vaut aussi false, aucune barre d'actions n'est dessinée. Vaut true par défaut.
onClearRequest() => Promise<boolean>NonAppelé quand on appuie sur Vider. La page n'est vidée que si la promesse se résout à true ; un rejet laisse la page intacte. Absent, Vider vide aussitôt.
marginsBlockMarginsNonMarge supérieure et inférieure globale (en pixels) appliquée à chaque bloc. Les configurations par bloc ont la priorité.
stylesEditorStylesNonObjet EditorStyles pour une personnalisation CSS fine de l'interface de l'éditeur (barres d'outils, boîtes de dialogue, contrôles).
classNamesEditorClassNamesNonObjet EditorClassNames pour attacher des noms de classes CSS aux éléments de l'interface de l'éditeur.
imageUploaderUploadFunctionNonFonction asynchrone qui télécharge un fichier image et renvoie une URL publique sous forme de chaîne.
audioUploaderUploadFunctionNonFonction asynchrone qui télécharge un fichier audio et renvoie une URL publique sous forme de chaîne.
videoUploaderUploadFunctionNonFonction asynchrone qui télécharge un fichier vidéo et renvoie une URL publique sous forme de chaîne.
fileUploaderUploadFunctionNonFonction d'upload qui déplace les pièces jointes du bloc fichier vers votre stockage.
localestringNonL'unique locale que l'éditeur édite. Les blocs multilingues sont aplatis vers cette locale.
defaultLocalestringNonLocale de repli utilisée quand un bloc n'a pas de contenu pour la locale demandée.
onLocaleFallback(info: { blockId: string; locale: string }) => voidNonAppelé quand un bloc retombe sur une autre locale, pour que l'hôte affiche un indicateur.
onInlineRewrite(selection: string, action: InlineRewriteAction) => Promise<string | null>NonFonction qui réécrit le texte sélectionné avec l'IA ; si définie, la barre d'outils affiche le bouton de réécriture.
inlineRewriteLabelsPartial<Record<InlineRewriteAction, string>>NonRemplace les libellés des actions du menu de réécriture, pour la localisation.
inlineRewriteTooltipstringNonRemplace l’infobulle de la baguette de réécriture de la barre d’outils en ligne, pour la localisation.
blockToolLabelsPartial<Record<BlockToolType, string>>NonRemplace les libellés des outils de bloc dans la boîte à outils et le menu slash, pour la localisation.
blockToolbarLabelsPartial<Record<BlockToolbarLabel, string>>NonRemplace les textes de la barre d'outils de bloc (ajouter, déplacer, supprimer, etc.) et les indications affichées dans les champs de bloc vides, pour la localisation.
controlLabelsPartial<Record<ControlLabel, string>>NonRemplace les noms des boutons de la barre d'actions (modifier, aperçu, JSON, copier, télécharger, vider), utilisés comme noms accessibles et infobulles, pour la localisation.
dialogLabelsPartial<Record<DialogLabel, string>>NonLes mots des boîtes de dialogue lien, info-bulle et statut, indexés par nom : titres, libellés des champs, textes indicatifs, styles de statut, Annuler et Appliquer. En anglais s'ils sont absents.
resolveLink(url: string) => Promise<Partial<EmbedData>>NonRemplit l’instantané d’un embed collé depuis votre serveur : titre, fichier Drive, fichiers du gist ou raison pour laquelle la vue en direct est impossible. Une recherche qui échoue dessine la carte comme si l’outil n’avait pas répondu, avec Réessayer à côté.
onEmbedAction(action: EmbedAction, blockId: string) => voidNonLe correctif à côté de la raison d’une carte que seul l’hôte peut effectuer : connectGoogle envoie le membre connecter son compte Google ; retry est géré par l’éditeur lui-même.
disabledEmbedProvidersreadonly string[]NonLes outils d’intégration désactivés par l’espace de travail, par clé (figma, miro, loom, google_drive, github_gist) ; leurs liens s’affichent en cartes qui en donnent la raison.
pasteEmbeds'live' | 'offer' | 'card'NonCe que fait le collage d’un lien pris en charge : l’afficher en direct (par défaut), le proposer, ou afficher une carte.
embedLabelsPartial<Record<EmbedLabel, string>>NonMots traduits pour les lignes de raison, les actions et les libellés de gist du bloc embed, indexés par EmbedLabel ; anglais par défaut sinon.
resolveIssues(urls: string[]) => Promise<Record<string, IssueSnapshot>>NonRépond aux liens de tickets d’une page par leurs instantanés, indexés par URL. Absent, puces et cartes gardent ce que le document a stocké et rien ne se rafraîchit.
onIssueAction(action: IssueAction, tool: string) => voidNonLe correctif à côté d’une raison de ticket que seul l’hôte peut effectuer : connecter l’outil, ce qui mène à la page Intégrations de l’hôte.
issueCards'off' | 'on'NonSi un lien de ticket collé sur sa propre ligne devient une carte ; off par défaut. Une puce dans une phrase reste toujours une puce.
issueChip{ assignee: boolean; status: boolean }NonLes deux interrupteurs de puce du membre : la pastille de statut et le responsable. Les deux actifs par défaut.
issueLabelsPartial<Record<IssueLabel, string>>NonMots traduits pour la puce de ticket, la carte et le tableau des tickets liés, indexés par IssueLabel ; anglais par défaut sinon.
jiraSitesreadonly string[]NonLes URL des sites Jira que les connexions de l’espace de travail atteignent, pour qu’un lien sur le domaine propre d’un site soit reconnu comme ticket.
allowedBlockToolsreadonly BlockToolType[]NonLes types de blocs que l’éditeur propose dans le menu des blocs, sa recherche, le menu de conversion et au collage. Chaque bloc enregistré en son absence ; un bloc stocké hors de la liste s’affiche toujours.
allowedInlineToolsreadonly InlineToolType[]NonLes marques que la barre d’outils en ligne propose. Chaque marque enregistrée en son absence.
theme'auto' | 'light' | 'dark'NonSchéma de couleurs. L'une des valeurs : auto (suit le système), light, dark. Vaut auto par défaut.
themeOverrides{ light?: ThemeTokens; dark?: ThemeTokens }NonSubstitutions de jetons par mode. Fournissez des cartes de jetons light et/ou dark pour personnaliser les couleurs sans remplacer le thème complet.
TypeScript
import { Editor } from '@clepit/core';

const editor = Editor.create({
  containerId: 'editor',
  minHeight: 400,
  placeholder: 'Start writing...',
  theme: 'auto',
  onChange: data => console.log(data),
  onReady: () => console.log('Editor ready'),
  imageUploader: async file => {
    const form = new FormData();
    form.append('file', file);
    const res = await fetch('/api/upload', { body: form, method: 'POST' });
    const { url } = await res.json();
    return url;
  },
});

RendererConfig

Passez RendererConfig comme seul argument à Renderer.render(). containerId et data sont tous les deux obligatoires.

OptionTypeRequisDescription
containerIdstringOuiIdentifiant de l'élément DOM où sera injecté le rendu.
dataEditorDataOuiLe document EditorData à rendre. Obligatoire.
marginsBlockMarginsNonMarge supérieure et inférieure globale (en pixels) appliquée à chaque bloc rendu.
stylesBlockStylesNonCarte BlockStyles pour la personnalisation CSS par type de bloc du rendu.
classNamesBlockClassNamesNonCarte BlockClassNames pour les noms de classes CSS par type de bloc dans le rendu.
editorClassNamesEditorClassNamesNonEditorClassNames transmis aux blocs qui rendent des composants interactifs (ex. : noms de classes tooltip pour les paragraphes).
configsPartial<BlockTypeOutputConfigs>NonCarte partielle d'objets OutputConfig par bloc. Chaque entrée peut définir des marges au niveau du bloc et des noms de classes tooltip.
theme'auto' | 'light' | 'dark'NonSchéma de couleurs. L'une des valeurs : auto, light, dark.
themeOverrides{ light?: ThemeTokens; dark?: ThemeTokens }NonSubstitutions de jetons par mode pour le rendu.
TypeScript
import { Renderer } from '@clepit/core';
import type { EditorData } from '@clepit/core';

const data: EditorData = await fetch('/api/content/123').then(r => r.json());

Renderer.render({
  containerId: 'output',
  data,
  theme: 'auto',
  margins: { bottom: 16, top: 16 },
});

Style au niveau du bloc

EditorConfig et RendererConfig acceptent tous les deux styles, classNames et configs indexés par type de bloc. Utilisez-les pour des substitutions ciblées ; consultez la page Thèmes pour la référence complète par jeton.

TypeScript
import { Editor, Renderer } from '@clepit/core';
import type { BlockStyles, BlockClassNames, EditorStyles } from '@clepit/core';

const editorStyles: EditorStyles = {
  blockToolbar: { container: { borderRadius: '8px' } },
};

const blockStyles: BlockStyles = {
  header: { h1: { fontFamily: 'Georgia, serif' } },
  paragraph: { lineHeight: '1.75' },
  table: { cell: { padding: '8px 12px' } },
};

const blockClassNames: BlockClassNames = {
  paragraph: 'prose-paragraph',
  header: { h1: 'prose-h1', h2: 'prose-h2' },
  alert: { info: 'alert-info', error: 'alert-error' },
};

Editor.create({
  containerId: 'editor',
  styles: editorStyles,
});

Renderer.render({
  containerId: 'output',
  data,
  styles: blockStyles,
  classNames: blockClassNames,
});