import { Diagnostic } from '@codemirror/lint';
import { Extension } from '@codemirror/state';
export declare const htmlDiagnostics: (code: string) => Diagnostic[];
/**
 * Retourne les diagnostics CSS pour un code donné.
 * Utilise l'API Constructable Stylesheets (`CSSStyleSheet.replaceSync`).
 *
 * Comportement attendu :
 * - Chaîne vide → aucun diagnostic
 * - CSS valide (`.foo { color: red; }`) → aucun diagnostic
 * - CSS invalide → diagnostic avec message du navigateur
 * - Environnements sans `CSSStyleSheet.replaceSync` (SSR, jsdom) → aucun diagnostic
 *   (la validation est silencieusement désactivée)
 */
export declare const cssDiagnostics: (code: string) => Diagnostic[];
/**
 * Retourne les diagnostics JavaScript pour un code donné.
 * Détecte les erreurs de syntaxe via `new Function(code)`.
 *
 * Comportement attendu :
 * - Chaîne vide → aucun diagnostic
 * - JS syntaxiquement valide (`const x = 1;`) → aucun diagnostic
 * - Accolade mal formée (`const x = {;`) → diagnostic « JavaScript invalide »
 * - Bloc non fermé (`function foo() {`) → diagnostic « JavaScript invalide »
 *
 * Limitation : valide uniquement la syntaxe, pas la sémantique ni les types.
 * Les erreurs runtime (variable inexistante, etc.) ne sont pas détectées.
 */
export declare const jsDiagnostics: (code: string) => Diagnostic[];
/**
 * Linter syntaxique HTML pour BmsInputCode.
 * À passer via la prop `extraExtensions`, combiné avec `lintGutter()`.
 *
 * @example
 * <BmsInputCode type="html" :extra-extensions="[lintGutter(), htmlSyntaxLinter()]" />
 */
export declare const htmlSyntaxLinter: () => Extension;
/**
 * Linter syntaxique CSS pour BmsInputCode.
 * À passer via la prop `extraExtensions`, combiné avec `lintGutter()`.
 *
 * @example
 * <BmsInputCode type="css" :extra-extensions="[lintGutter(), cssSyntaxLinter()]" />
 */
export declare const cssSyntaxLinter: () => Extension;
/**
 * Linter syntaxique JavaScript pour BmsInputCode.
 * À passer via la prop `extraExtensions`, combiné avec `lintGutter()`.
 *
 * @example
 * <BmsInputCode type="javascript" :extra-extensions="[lintGutter(), jsSyntaxLinter()]" />
 */
export declare const jsSyntaxLinter: () => Extension;
/**
 * Extension CodeMirror qui appelle `onValidation` à chaque fois que le résultat
 * des linters change, en passant `true` si aucun diagnostic n'est présent.
 *
 * Utile pour synchroniser l'état de validation du linter avec un état Vue externe
 * (ex: désactiver un bouton de soumission).
 *
 * Comportement attendu :
 * - Appelé après chaque cycle de lint (asynchrone, après le debounce du linter)
 * - `valid: true`  → aucun diagnostic actif dans l'éditeur
 * - `valid: false` → au moins un diagnostic présent
 *
 * Note : démarre à `true` (avant le premier lint). Combiner avec une validation
 * côté formulaire (champ non vide) pour éviter de soumettre avant le premier lint.
 *
 * @example
 * const sourceValid = ref(true);
 * const extensions = [lintGutter(), htmlSyntaxLinter(), lintValidationListener((v) => { sourceValid.value = v; })];
 */
/**
 * Crée un linter qui exécute `fn` et appelle `onHasErrors` lorsque la présence
 * de diagnostics de la sévérité donnée change. À utiliser pour les linters bloquants
 * (désactiver le bouton de soumission sur `error`, ou avertir sur `warning`).
 * Pour les linters purement informatifs, utiliser `linter()` directement.
 *
 * @example
 * const htmlValid = ref(true);
 * const extensions = [
 *   lintGutter(),
 *   createLinterWithCallback(htmlDiagnostics, (hasErrors) => { htmlValid.value = !hasErrors; }, 'error'),
 * ];
 */
export declare const createLinterWithCallback: (fn: (code: string) => Diagnostic[], onHasDiagnostics: (hasDiagnostics: boolean) => void, severity?: Diagnostic['severity']) => Extension;
export declare const lintValidationListener: (onValidation: (valid: boolean) => void) => Extension;
export { linter, lintGutter } from '@codemirror/lint';
