{"version":3,"file":"edugouvfr-ngx-dsfr-ext-editor.mjs","sources":["../../../projects/ngx-dsfr-ext/editor/src/lib/components/toolbar/editor-toolbar.model.ts","../../../projects/ngx-dsfr-ext/editor/src/lib/components/toolbar/editor-toolbar-default-options.ts","../../../projects/ngx-dsfr-ext/editor/src/lib/i18n/messages.en.ts","../../../projects/ngx-dsfr-ext/editor/src/lib/i18n/messages.fr.ts","../../../projects/ngx-dsfr-ext/editor/src/lib/editor.service.ts","../../../projects/ngx-dsfr-ext/editor/src/lib/components/content/editor-content.component.ts","../../../projects/ngx-dsfr-ext/editor/src/lib/components/content/editor-content.component.html","../../../projects/ngx-dsfr-ext/editor/src/lib/directives/add-title.directive.ts","../../../projects/ngx-dsfr-ext/editor/src/lib/directives/unfocusable.directive.ts","../../../projects/ngx-dsfr-ext/editor/src/lib/components/toolbar/editor-toolbar.component.ts","../../../projects/ngx-dsfr-ext/editor/src/lib/components/toolbar/editor-toolbar.component.html","../../../projects/ngx-dsfr-ext/editor/src/lib/editor.component.ts","../../../projects/ngx-dsfr-ext/editor/src/lib/editor.component.html","../../../projects/ngx-dsfr-ext/editor/src/public-api.ts","../../../projects/ngx-dsfr-ext/editor/src/edugouvfr-ngx-dsfr-ext-editor.ts"],"sourcesContent":["/**\n * Constantes des identifiants d'actions de formatage supportés.\n */\nexport enum FormatConst {\n  ALIGN = 'align',\n  BACKGROUND = 'background',\n  BLOCKQUOTE = 'blockquote',\n  BOLD = 'bold',\n  CLEAN = 'clean',\n  CODE_BLOCK = 'code-block',\n  COLOR = 'color',\n  DIRECTION = 'direction',\n  HEADER = 'header',\n  IMAGE = 'image',\n  INDENT = 'indent',\n  ITALIC = 'italic',\n  LINK = 'link',\n  LIST = 'list',\n  SCRIPT = 'script',\n  SIZE = 'size',\n  STRIKE = 'strike',\n  UNDERLINE = 'underline',\n}\n\n/**\n * Type correspondant aux identifiants d'actions de formatage supportés.\n */\nexport type Format = `${FormatConst}`;\n\n/**\n * Mapping des clés d'internationalisation des libellés des actions de formatage.\n *\n * Selon le contexte, le libellé sera utilisé comme tooltip, libellé de champ ou transcription accessible.\n */\nexport const FORMAT_I18N_KEYS: Record<Format, string | Record<string, string>> = {\n  'align': {\n    label: 'editor.controls.align.label',\n    normal: 'editor.controls.align.left',\n    center: 'editor.controls.align.center',\n    right: 'editor.controls.align.right',\n    justify: 'editor.controls.align.justify',\n  },\n  'background': 'editor.controls.background',\n  'blockquote': 'editor.controls.blockquote',\n  'clean': 'editor.controls.clean',\n  'bold': 'editor.controls.bold',\n  'code-block': 'editor.controls.code',\n  'color': 'editor.controls.color',\n  'direction': { normal: 'editor.controls.direction.normal', rtl: 'editor.controls.direction.rtl' },\n  'header': {\n    'label': 'editor.controls.header.label',\n    '0': 'editor.controls.header.0',\n    '1': 'editor.controls.header.1',\n    '2': 'editor.controls.header.2',\n    '3': 'editor.controls.header.3',\n    '4': 'editor.controls.header.4',\n    '5': 'editor.controls.header.5',\n    '6': 'editor.controls.header.6',\n  },\n  'image': 'editor.controls.image.label',\n  'indent': { '-1': 'editor.controls.indent.-1', '+1': 'editor.controls.indent.+1' },\n  'italic': 'editor.controls.italic',\n  'link': 'editor.controls.link.label',\n  'list': {\n    label: 'editor.controls.list.label',\n    ordered: 'editor.controls.list.ordered',\n    bullet: 'editor.controls.list.bullet',\n    unchecked: 'editor.controls.list.checkbox',\n  },\n  'script': { sub: 'editor.controls.script.sub', super: 'editor.controls.script.super' },\n  'size': {\n    label: 'editor.controls.size.label',\n    small: 'editor.controls.size.small',\n    normal: 'editor.controls.size.normal',\n    large: 'editor.controls.size.large',\n    huge: 'editor.controls.size.huge',\n  },\n  'strike': 'editor.controls.strike',\n  'underline': 'editor.controls.underline',\n};\n\n/**\n * Mapping des icônes par défaut correspondant aux actions de formatage supportées.\n *\n * Note de conception (RPA+KGE) pour l'instant on décide de maintenir les icônes dans une structure à part afin de\n * verrouiller le modèle. Si demain on souhaite donner à l'utilisateur la possibilité de surcharger les icônes des\n * actions de formatage alors on pourra réintégrer les icônes au modèle en augmentant l'interface `BaseFormatControl`\n * d'une propriété `icon` (rétrocompatible car la propriété aura une valeur par défaut dans le modèle par défaut)\n */\nexport const FORMAT_ICON: Record<Format, string | Record<string, string> | undefined> = {\n  'align': {\n    normal: 'fr-icon-align-left',\n    center: 'fr-icon-align-center',\n    right: 'fr-icon-align-right',\n    justify: 'fr-icon-align-justify',\n  },\n  'background': 'fr-icon-brush-3-line',\n  'blockquote': 'fr-icon-quote-line',\n  'clean': 'fr-icon-clean',\n  'bold': 'fr-icon-bold',\n  'code-block': 'fr-icon-code-view',\n  'color': 'fr-icon-font-color',\n  'direction': 'fr-icon-direction-rtl',\n  'header': undefined,\n  'image': 'fr-icon-image-line',\n  'indent': { '-1': 'fr-icon-indent-decrease', '+1': 'fr-icon-indent-increase' },\n  'italic': 'fr-icon-italic',\n  'link': 'fr-icon-link',\n  'list': { ordered: 'fr-icon-list-ordered', bullet: 'fr-icon-list-unordered', unchecked: 'fr-icon-list-check' },\n  'script': { sub: 'fr-icon-subscript', super: 'fr-icon-superscript' },\n  'size': undefined,\n  'strike': 'fr-icon-strike',\n  'underline': 'fr-icon-underline',\n};\n\n/**\n * Les différents mode supportés par les contrôles de formatage à valeur unique.\n */\nexport enum ControlMode {\n  /**\n   * Active/désactive le format.\n   */\n  TOGGLE = 'toggle',\n  /**\n   * Le format dépend de la capture d'un paramètre utilisateur.\n   */\n  PROMPT = 'prompt',\n  /**\n   * Action issue d'une des options d'une action multivaluée érigée en action unique autonome.\n   * Ex. je veux un bouton permettant de formater en Titre de niveau 1 (H1)\n   */\n  CUSTOM = 'custom',\n  /**\n   * Permet de représenter l'une des options d'une action multivaluée.\n   */\n  VALUE = 'valued',\n  /**\n   * Dénote une action de formatage multivaluée à afficher sous forme de selecteur.\n   */\n  SELECT = 'select',\n  /**\n   * Dénote une action de formatage multivaluée à afficher sous de groupe de bouton exclusif.\n   */\n  RADIO = 'radio',\n  /**\n   * Mode spécial dénotant le contrôle de réinitialisation.\n   */\n  CLEAN = 'clean',\n}\n\n/**\n * Les valeurs possibles pour le format 'size'.\n */\nexport enum SizeValue {\n  SMALL = 'small',\n  NORMAL = 'normal',\n  LARGE = 'large',\n  HUGE = 'huge',\n}\n\n/**\n * Les valeurs possibles pour le format 'header'.\n */\nexport enum HeaderValue {\n  NORMAL = 0,\n  H1 = 1,\n  H2 = 2,\n  H3 = 3,\n  H4 = 4,\n  H5 = 5,\n  H6 = 6,\n}\n\n/**\n * Les valeurs possibles pour le format 'align'.\n */\nexport enum AlignValue {\n  LEFT = 'normal',\n  CENTER = 'center',\n  RIGHT = 'right',\n  JUSTIFY = 'justify',\n}\n\n/**\n * Les valeurs possibles pour le format 'list'.\n */\nexport enum ListValue {\n  ORDERED = 'ordered',\n  BULLET = 'bullet',\n  CHECKBOX = 'unchecked',\n}\n\n/**\n * Les valeurs possibles pour le format 'script'.\n */\nexport enum ScriptValue {\n  /**\n   * Subscript.\n   */\n  SUBSCRIPT = 'sub',\n  /**\n   * Superscript.\n   */\n  SUPERSCRIPT = 'super',\n}\n\n/**\n * Les valeurs possibles pour le format 'indent'.\n */\nexport enum IndentValue {\n  /**\n   * Decrease indent.\n   */\n  DECREASE = '-1',\n  /**\n   * Increase indent.\n   */\n  INCREASE = '+1',\n}\n\n/**\n * Les valeurs possibles pour le format 'direction'.\n */\nexport enum DirectionValue {\n  /**\n   * De gauche à droite.\n   */\n  NORMAL = 'normal',\n\n  /**\n   * De droite à gauche.\n   */\n  RTL = 'rtl',\n}\n\n/**\n * Représente une tâche de formatage de base.\n */\nexport interface DsfrBaseFormatControl {\n  /**\n   * L'identifiant Quill du format.\n   */\n  name: Format;\n\n  /**\n   * Le mode du contrôle de format.\n   */\n  mode: ControlMode;\n}\n\n/**\n * Représente une action simple (bouton).\n */\nexport interface DsfrSingleFormatControl extends DsfrBaseFormatControl {\n  /**\n   * Optionnel : permet de surcharger l'icône illustrative.\n   * Doit être une classe CSS Remix wrappée DSFR. Ex. 'fr-icon-bold'.\n   */\n  icon?: string;\n}\n\n/**\n * Permet de sortir une des options de formatage d'une action multivaluée et de l'ériger en action unique autonome.\n */\n//TODO: pas encore opérationnel, à re-travailler notamment sur la fourniture icône, libellés i18n, etc.\nexport class DsfrCustomFormatControl implements DsfrSingleFormatControl {\n  /**\n   * Le mode d'une action avec valeur prédéfinie est forcément 'valued'.\n   */\n  mode = ControlMode.CUSTOM;\n\n  /**\n   * Construit une action de formatage valuée.\n   *\n   * @param name le format de cette action\n   * @param value la valeur spécifique de cette action de formatage\n   */\n  constructor(\n    public name: Format,\n    public value: string | number | false,\n  ) {}\n}\n\n/**\n * Action de type interrupteur on/off avec valeur booléenne.\n */\nexport class DsfrToggleFormatControl implements DsfrSingleFormatControl {\n  /**\n   * Le mode d'une action avec valeur prédéfinie est forcément 'toggle'.\n   */\n  mode = ControlMode.TOGGLE;\n\n  constructor(public name: Format) {}\n}\n\n/**\n *\n */\nexport class DsfrPromptFormatControl implements DsfrSingleFormatControl {\n  /**\n   * Le mode d'une action avec valeur prédéfinie est forcément 'prompt'.\n   */\n  mode = ControlMode.PROMPT;\n\n  constructor(public name: Format) {}\n}\n\n/**\n * Représente une des actions possibles d'une méta-action multi-valuée.\n */\nexport class DsfrValueFormatControl implements Omit<DsfrSingleFormatControl, 'name'> {\n  /**\n   * Le mode d'une action avec valeur prédéfinie est forcément 'valued'.\n   */\n  mode = ControlMode.VALUE;\n\n  /**\n   * Construit une action de formatage valuée.\n   *\n   * @param value la valeur spécifique de cette action de formatage\n   */\n  constructor(public value: string | number | false) {}\n}\n\n/**\n * Représente une méta-tâche qui s'applique à travers la sélection d'une valeur concrète au sein d'une liste de valeurs.\n */\nexport interface DsfrMultivaluedFormatControl extends DsfrBaseFormatControl {\n  /**\n   * Permet d'indiquer si le contrôle multivalué doit s'afficher au sein d'un groupe dans la toolbar.\n   */\n  group: boolean;\n\n  /**\n   * Valeurs possibles pour cette action de formatage.\n   */\n  values: DsfrValueFormatControl[];\n}\n\n/**\n * Représente une action multi-valuée en mode radio.\n */\nexport class RadioFormatControl implements DsfrMultivaluedFormatControl {\n  mode = ControlMode.RADIO;\n\n  /**\n   * Construit un control de type radio.\n   *\n   * @param values les différentes valeurs possibles pour le control de type radio\n   */\n  constructor(\n    public name: Format,\n    public values: DsfrValueFormatControl[],\n    public group: boolean,\n  ) {}\n}\n\n/**\n * Représente une action multi-valuée en mode select.\n */\nexport class SelectFormatControl implements DsfrMultivaluedFormatControl {\n  mode = ControlMode.SELECT;\n  group = false;\n\n  /**\n   * Construit un control de type select.\n   *\n   * @param values les différentes valeurs possibles pour le control de type select.\n   */\n  constructor(\n    public name: Format,\n    public values: DsfrValueFormatControl[],\n  ) {}\n}\n\n/**\n * Représente un groupe d'actions.\n */\nexport class DsfrGroupFormatControl {\n  group = true;\n\n  /**\n   * Construit un control de type radio.\n   *\n   * @param values les différentes valeurs possibles pour le control de type radio\n   */\n  constructor(\n    public i18nLabelKey: string,\n    public controls: DsfrSingleFormatControl[],\n  ) {}\n}\n\n/**\n * Type générique encapsulant toutes les types de tâches de formatage.\n */\nexport type FormatControl = DsfrSingleFormatControl | DsfrMultivaluedFormatControl;\n\n/**\n * Tableau permettant de regrouper des contrôles uniques avec un libellé accessible.\n */\nexport class ControlArray extends Array<DsfrSingleFormatControl> {\n  name: string;\n  constructor(name: string, ...items: DsfrSingleFormatControl[]) {\n    super(...items);\n    this.name = name;\n  }\n}\n\n/**\n * Type décrivant un élément de la barre d'outil qui peut être soit une tâche unitaire soit un regroupement de tâches.\n */\nexport type ToolbarControl = FormatControl | ControlArray;\n","import {\n  AlignValue,\n  ControlArray,\n  ControlMode,\n  DsfrPromptFormatControl,\n  DsfrToggleFormatControl,\n  DsfrValueFormatControl,\n  FormatConst,\n  HeaderValue,\n  IndentValue,\n  ListValue,\n  RadioFormatControl,\n  ScriptValue,\n  SelectFormatControl,\n  SizeValue,\n  ToolbarControl,\n} from './editor-toolbar.model';\n\n/**\n * Options par défaut de la toolbar.\n */\nexport const DEFAULT_TOOLBAR_OPTIONS: ToolbarControl[] = [\n  // niveau de titre\n  new SelectFormatControl(FormatConst.HEADER, [\n    new DsfrValueFormatControl(HeaderValue.NORMAL),\n    new DsfrValueFormatControl(HeaderValue.H1),\n    new DsfrValueFormatControl(HeaderValue.H2),\n    new DsfrValueFormatControl(HeaderValue.H3),\n    new DsfrValueFormatControl(HeaderValue.H4),\n    new DsfrValueFormatControl(HeaderValue.H5),\n    new DsfrValueFormatControl(HeaderValue.H6),\n  ]),\n  // taille du texte\n  new SelectFormatControl(FormatConst.SIZE, [\n    new DsfrValueFormatControl(SizeValue.SMALL),\n    new DsfrValueFormatControl(SizeValue.NORMAL),\n    new DsfrValueFormatControl(SizeValue.LARGE),\n    new DsfrValueFormatControl(SizeValue.HUGE),\n  ]),\n  // mise en forme du texte (gras, italique, etc.)\n  new ControlArray(\n    'text',\n    new DsfrToggleFormatControl(FormatConst.BOLD),\n    new DsfrToggleFormatControl(FormatConst.ITALIC),\n    new DsfrToggleFormatControl(FormatConst.UNDERLINE),\n    new DsfrToggleFormatControl(FormatConst.STRIKE),\n  ),\n  new RadioFormatControl(\n    FormatConst.SCRIPT,\n    [new DsfrValueFormatControl(ScriptValue.SUPERSCRIPT), new DsfrValueFormatControl(ScriptValue.SUBSCRIPT)],\n    true,\n  ),\n  // couleurs\n  new ControlArray(\n    'palettes',\n    new DsfrPromptFormatControl(FormatConst.COLOR),\n    new DsfrPromptFormatControl(FormatConst.BACKGROUND),\n  ),\n  // mise en forme avancée\n  new ControlArray(\n    'advanced',\n    new DsfrToggleFormatControl(FormatConst.BLOCKQUOTE),\n    new DsfrToggleFormatControl(FormatConst.CODE_BLOCK),\n    new DsfrPromptFormatControl(FormatConst.LINK),\n    new DsfrPromptFormatControl(FormatConst.IMAGE),\n  ),\n  // listes\n  new RadioFormatControl(\n    FormatConst.LIST,\n    [\n      new DsfrValueFormatControl(ListValue.ORDERED),\n      new DsfrValueFormatControl(ListValue.BULLET),\n      // new ValueFormatControl(ListValue.CHECKBOX), //RPA: pas proposé par défaut car non standard au sens html\n    ],\n    true,\n  ),\n  // indentation des lignes de texte\n  new RadioFormatControl(\n    FormatConst.INDENT,\n    [new DsfrValueFormatControl(IndentValue.DECREASE), new DsfrValueFormatControl(IndentValue.INCREASE)],\n    true,\n  ),\n\n  // alignement des lignes de texte\n  new RadioFormatControl(\n    FormatConst.ALIGN,\n    [\n      new DsfrValueFormatControl(AlignValue.LEFT), // même effet que clean, faut-il le conserver ? ça fait un peu bizarre sans\n      new DsfrValueFormatControl(AlignValue.CENTER),\n      new DsfrValueFormatControl(AlignValue.RIGHT),\n      new DsfrValueFormatControl(AlignValue.JUSTIFY),\n    ],\n    true,\n  ),\n  // reset du format\n  {\n    name: FormatConst.CLEAN,\n    mode: ControlMode.CLEAN,\n  },\n];\n","export const MESSAGES_EN = {\n  editor: {\n    legend: `Editing area`,\n    hint: `Depending on the actions used, formatting will target either the current selection (e.g., text size or style,\n    script, colors, link) or the line on which the cursor is positioned (e.g., heading level, quotation, code, \n    indentation, lists, alignments).`,\n    announce: {\n      pre: `The `,\n      applied: ` formatting has been successfully applied`,\n      removed: ` formatting has been successfully removed`,\n      cleaned: 'All formatting has been successfully removed from the selection',\n    },\n    placeholder: 'Please edit your content',\n    controls: {\n      align: { label: 'Align', left: 'Left', center: 'Center', right: 'Right', justify: 'Justify' },\n      background: `Background color`,\n      blockquote: 'Quote',\n      clean: 'Remove all formatting from the selection',\n      bold: 'Bold',\n      code: 'Code block',\n      color: 'Text color',\n      direction: { normal: 'Left to right', rtl: 'Right to left' },\n      header: {\n        'label': 'Heading level',\n        '0': 'Normal',\n        '1': 'Heading 1',\n        '2': 'Heading 2',\n        '3': 'Heading 3',\n        '4': 'Heading 4',\n        '5': 'Heading 5',\n        '6': 'Heading 6',\n      },\n      image: { label: 'Image', prompt: `Image path:` },\n      indent: { '-1': `Decrease indentation`, '+1': `Increase indentation` },\n      italic: 'Italic',\n      link: { label: 'Link', prompt: `Link URL:` },\n      list: { label: 'List', ordered: 'Ordered', bullet: 'Unordered', checkbox: 'Checklist' },\n      script: { label: 'Script', sub: 'Subscript', super: 'Superscript' },\n      size: { label: 'Text size', small: 'Small', normal: 'Normal', large: 'Large', huge: 'Huge' },\n      strike: 'Strike',\n      underline: 'Underline',\n      text: 'Text style',\n      advanced: 'Advanced styles',\n      palettes: 'Palettes',\n    },\n  },\n};\n","export const MESSAGES_FR = {\n  editor: {\n    legend: `Zone d'édition`,\n    hint: `Selon les actions utilisées, la mise en forme ciblera soit la sélection courante (ex. : taille ou style du \n    texte, script, couleurs, lien) soit la ligne sur laquelle le curseur est positionné (ex. : niveau de titre, \n    citation, code, indentation, listes, alignements).`,\n    announce: {\n      pre: `La mise en forme `,\n      applied: ` a été appliquée avec succès`,\n      removed: ` a été supprimée avec succès`,\n      cleaned: 'Toutes les mises en forme ont été supprimées sur la sélection',\n    },\n    placeholder: 'Veuillez éditer votre contenu',\n    controls: {\n      align: {\n        label: 'Alignement',\n        left: 'Aligner à gauche',\n        center: 'Centrer',\n        right: 'Aligner à droite',\n        justify: 'Justifier',\n      },\n      background: `Couleur du fond`,\n      blockquote: 'Guillemets',\n      clean: 'Supprimer toutes les mises en forme sur la sélection',\n      bold: 'Gras',\n      code: 'Bloc de code',\n      color: 'Couleur du texte',\n      direction: { label: 'Direction', normal: 'De gauche à droite', rtl: 'De droite à gauche' },\n      header: {\n        'label': 'Niveau de titre',\n        '0': 'Normal',\n        '1': 'Titre 1',\n        '2': 'Titre 2',\n        '3': 'Titre 3',\n        '4': 'Titre 4',\n        '5': 'Titre 5',\n        '6': 'Titre 6',\n      },\n      image: { label: 'Image', prompt: `Chemin vers l'image :` },\n      indent: { 'label': 'Indentation', '-1': `Réduire l'indentation`, '+1': `Augmenter l'indentation` },\n      italic: 'Italique',\n      link: { label: 'Lien', prompt: `URL du lien :` },\n      list: { label: 'Liste', ordered: 'Liste numérotée', bullet: 'Liste à puces', checkbox: 'Liste à cocher' },\n      script: { label: 'Script', sub: 'Indice', super: 'Exposant' },\n      size: { label: 'Taille du texte', small: 'Petit', normal: 'Normal', large: 'Large', huge: 'Énorme' },\n      strike: 'Barré',\n      underline: 'Souligné',\n      text: 'Style du texte',\n      advanced: 'Styles avancés',\n      palettes: 'Palettes',\n    },\n  },\n};\n","import { Injectable } from '@angular/core';\nimport { Observable, ReplaySubject } from 'rxjs';\n\nexport declare type Formatting = { [format: string]: unknown } | undefined;\n\nexport declare type FormattingRequest = { action: string; value: any } | undefined;\n\n/**\n * Service permettant de gérer la communication bidirectionnelle entre la toolbar et son éditeur.\n */\n@Injectable()\nexport class DsfrEditorService {\n  /**\n   * Observable sur le formatage de la sélection courante.\n   */\n  readonly currentFormatting$: Observable<Formatting>;\n\n  /**\n   * Observable sur les demandes de mises en forme émise depuis la toolbar.\n   */\n  readonly formattingRequest$: Observable<FormattingRequest>;\n\n  /**\n   * Permet de notifier les changements opérés de l'extérieur sur le modèle HTML.\n   */\n  readonly modelChange$: Observable<string>;\n\n  /**\n   * Permet de notifier les changements au niveau du contenu de l'éditeur qui impacteront le modèle HTML.\n   */\n  readonly editorChange$: Observable<string>;\n\n  /**\n   * Permet d'émettre une demande de prise de focus sur le contenu de l'éditeur HTML.\n   */\n  readonly focusOnEditorRequest$: Observable<void>;\n\n  /**\n   * Observable permettant de notifier la prise en charge effective d'une action de formatage.\n   */\n  readonly editorActionPerformed$: Observable<FormattingRequest>;\n\n  /**\n   * Subject sur les formats de la sélection courante.\n   */\n  private _currentFormattingSubject: ReplaySubject<Formatting>;\n\n  /**\n   * Subject sur les demandes de formatage.\n   */\n  private _formattingRequestSubject: ReplaySubject<FormattingRequest>;\n\n  /**\n   * Subject sur les changements externes sur le modèle HTML.\n   */\n  private _modelChangeSubject: ReplaySubject<string>;\n\n  /**\n   * Subject sur les changements de la valeur de l'éditeur HTML.\n   */\n  private _editorChangeSubject: ReplaySubject<string>;\n\n  /**\n   * Subject sur les demandes de prise de focus sur l'éditeur.\n   */\n  private _focusOnEditorRequestSubject: ReplaySubject<void>;\n\n  /**\n   * Subject sur les demandes de prise de focus sur l'éditeur.\n   */\n  private _editorActionPerformedSubject: ReplaySubject<FormattingRequest>;\n\n  constructor() {\n    // RPA: j'utilise des ReplaySubject(1) pour ne pas être parasité par la première émission de la valeur initiale\n    // du BehaviorSubject, par contre comme pour ce dernier les souscripteurs seront notifiés de la dernière valeur\n    // émise _à partir du moment où une valeur a été explicitement émise_\n    // source: https://stackoverflow.com/a/43119768/8737817\n    this._currentFormattingSubject = new ReplaySubject<Formatting>(1);\n    this._formattingRequestSubject = new ReplaySubject<FormattingRequest>(1);\n    this._modelChangeSubject = new ReplaySubject<string>(1);\n    this._editorChangeSubject = new ReplaySubject<string>(1);\n    this._focusOnEditorRequestSubject = new ReplaySubject<void>(1);\n    this._editorActionPerformedSubject = new ReplaySubject<FormattingRequest>(1);\n\n    this.currentFormatting$ = this._currentFormattingSubject.asObservable();\n    this.formattingRequest$ = this._formattingRequestSubject.asObservable();\n    this.modelChange$ = this._modelChangeSubject.asObservable();\n    this.editorChange$ = this._editorChangeSubject.asObservable();\n    this.focusOnEditorRequest$ = this._focusOnEditorRequestSubject.asObservable();\n    this.editorActionPerformed$ = this._editorActionPerformedSubject.asObservable();\n  }\n\n  /**\n   * Permet de positionner la mise en forme de la sélection courante.\n   */\n  setCurrentFormatting(formats: Formatting) {\n    this._currentFormattingSubject.next(formats);\n  }\n\n  /**\n   * Permet de demander une nouvelle mise en forme sur la sélection courante.\n   */\n  requestFormatting(request: FormattingRequest) {\n    this._formattingRequestSubject.next(request);\n  }\n\n  /**\n   * Permet de demander la prise de focus sur l'éditeur.\n   */\n  requestFocusOnEditorContent() {\n    this._focusOnEditorRequestSubject.next();\n  }\n\n  /**\n   * Permet de notifier un changement externe sur le modèle HTML.\n   */\n  emitModelChange(value: string) {\n    this._modelChangeSubject.next(value);\n  }\n\n  /**\n   * Permet de notifier un changement interne du contenu de l'éditeur HTML.\n   */\n  emitEditorChange(value: string) {\n    this._editorChangeSubject.next(value);\n  }\n\n  /**\n   * Permet de notifier l'application effective d'uen action de formatage dans l'éditeur.\n   */\n  emitEditorActionPerformed(value: FormattingRequest) {\n    this._editorActionPerformedSubject.next(value);\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n  AfterViewInit,\n  Component,\n  CUSTOM_ELEMENTS_SCHEMA,\n  inject,\n  Input,\n  OnChanges,\n  OnDestroy,\n  SimpleChanges,\n  ViewEncapsulation,\n} from '@angular/core';\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nimport Quill, { QuillOptions, Range } from 'quill';\n\nimport { DsfrI18nPipe, DsfrI18nService, DsfrSeverity, DsfrSeverityConst, LangService } from '@edugouvfr/ngx-dsfr';\nimport { Delta } from 'quill/core';\n// eslint-disable-next-line @typescript-eslint/naming-convention\nimport Emitter from 'quill/core/emitter';\nimport { Subscription } from 'rxjs';\nimport { DsfrEditorService, FormattingRequest } from '../../editor.service';\n\ndeclare type Formatting = { [format: string]: unknown };\n\n@Component({\n  selector: 'edu-editor-content',\n  encapsulation: ViewEncapsulation.None,\n  templateUrl: './editor-content.component.html',\n  styleUrls: ['./editor-content.component.scss'],\n  imports: [CommonModule, DsfrI18nPipe],\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class EduEditorContentComponent implements AfterViewInit, OnDestroy, OnChanges {\n  /**\n   * L'identifiant du tag hôte pour le composant éditeur.\n   *\n   * Attention : cet input est statique et doit être connu à l'initialisation du composant.\n   */\n  @Input() editorId = 'editor';\n\n  /**\n   * Permet de masquer visuellement la légende en le réservant aux dispositifs de restitution.\n   */\n  @Input() legendSrOnly = true;\n\n  /**\n   * Active la lecure seule.\n   */\n  @Input() readOnly = false;\n\n  /**\n   * Message d'information associé au composant.\n   */\n  @Input() message?: string;\n\n  /**\n   * Représente la sévérité du message.\n   */\n  @Input() messageSeverity?: DsfrSeverity;\n\n  /**\n   * Id de l'élément affichant les messages associé à l'éditeur. A renseigner si vous souhaitez positionner un attribut\n   * `aria-describedby` référençant votre message au niveau de l'élément hôte de l'éditeur.\n   */\n  @Input() messagesGroupId?: string;\n\n  /**\n   * Dev/debug : permet d'afficher le code HTML interne de l'éditeur (i.e. celui qui sert pour l'affichage WYSIWYG).\n   */\n  @Input() showEditorHtmlDebugPanel = false;\n\n  /**\n   * Dev/debug : permet d'afficher le code HTML qui sera récupéré en sortie.\n   */\n  @Input() showSemanticHtmlDebugPanel = false;\n\n  /** @internal */\n  public i18n = inject(DsfrI18nService);\n\n  /** @internal */\n  public langSvc = inject(LangService);\n\n  /**\n   * Instance Quill.\n   */\n  protected _quill!: Quill;\n\n  /**\n   * Pour pouvoir utiliser DsfrSeverityConst côté template.\n   */\n  protected readonly severityConst = DsfrSeverityConst;\n\n  /**\n   * Options de configuration de l'éditeur Quill.\n   */\n  private _options: QuillOptions = {\n    readOnly: this.readOnly,\n    modules: {\n      toolbar: false,\n    },\n    placeholder: this.i18n.t('editor.placeholder'),\n    theme: 'snow',\n  };\n\n  private _subscriptions: Subscription[] = [];\n\n  private _editorSelectionHandler!: Emitter;\n\n  private _editorChangeHandler!: Emitter;\n\n  private readonly editorService = inject(DsfrEditorService);\n\n  constructor() {}\n\n  ngAfterViewInit(): void {\n    this._quill = new Quill('#' + this.editorId, this._options);\n    this._quill.root.setAttribute('role', 'textbox');\n    this._quill.root.setAttribute('aria-multiline', 'true');\n    this._quill.root.setAttribute('spellcheck', 'false');\n    this._quill.root.setAttribute('aria-labelledby', this.editorId + '-legend');\n    // fix a11y : par défaut, le key-binding Quill sur la touche Tab empêche de sortir de l'éditeur en utilisant Tab\n    delete (this._quill.getModule('keyboard') as any)?.bindings['Tab'];\n\n    if (this.message && this.message.length && this.messagesGroupId && this.messagesGroupId.length) {\n      this._quill.root.setAttribute('aria-describedby', this.messagesGroupId);\n    }\n    // On se met à l'écoute de la sélection utilisateur\n    this._editorSelectionHandler = this._quill.on(Emitter.events.SELECTION_CHANGE, (range) =>\n      this._onEditorSelectionChange(range),\n    );\n    // Détecte le changement de contenu de l'éditeur.\n    this._editorChangeHandler = this._quill.on(\n      Emitter.events.EDITOR_CHANGE,\n      (eventName: any, delta: Delta, oldContents: Delta, source: string) =>\n        this._onEditorChange(eventName, delta, oldContents, source),\n    );\n\n    this._subscriptions.push(\n      this.editorService.formattingRequest$.subscribe((req: FormattingRequest) => {\n        const range = this._quill.getSelection();\n        if (req === undefined) {\n          if (range) {\n            // remove formatting\n            this._quill.removeFormat(range.index, range.length);\n          }\n        } else if ('image' === req.action) {\n          // perform special image format\n          if (range) {\n            this._quill.uploader.upload(range, req.value);\n          }\n        } else {\n          // perform standart formatting\n          this._quill.format(req.action, req.value);\n        }\n        this.editorService.setCurrentFormatting(this._getCurrentFormatting());\n        this.editorService.emitEditorActionPerformed(req);\n      }),\n    );\n    // Écoute les mises à jour du modèle externe.\n    this._subscriptions.push(\n      this.editorService.modelChange$.subscribe((newValue: string) => {\n        this.setEditorContent(newValue);\n      }),\n    );\n    // Écoute les demandes de prise de focus\n    this._subscriptions.push(\n      this.editorService.focusOnEditorRequest$.subscribe(() => {\n        this._quill.focus();\n      }),\n    );\n    // Écoute les changements de langue pour maj le placeholder\n    this._subscriptions.push(\n      this.langSvc.langChange$.subscribe(() => {\n        this._quill.root.dataset['placeholder'] = this.i18n.t('editor.placeholder');\n      }),\n    );\n  }\n\n  ngOnDestroy(): void {\n    this._subscriptions.forEach((s) => s.unsubscribe());\n    this._quill.off(Emitter.events.SELECTION_CHANGE, this._editorSelectionHandler.off);\n    this._quill.off(Emitter.events.EDITOR_CHANGE, this._editorChangeHandler.off);\n  }\n\n  ngOnChanges({ message, messagesGroupId }: SimpleChanges): void {\n    if (message || messagesGroupId) {\n      if (this.message && this.message.length && this.messagesGroupId && this.messagesGroupId.length) {\n        this._quill?.root.setAttribute('aria-describedby', this.messagesGroupId);\n      } else {\n        this._quill?.root.removeAttribute('aria-describedby');\n      }\n    }\n  }\n\n  protected hasMessage(severity: DsfrSeverity): boolean {\n    return !this.isStringEmptyOrNull(this.message) && severity === this.messageSeverity;\n  }\n\n  private setEditorContent(newValue: string) {\n    this._quill.setContents(this._quill.clipboard.convert({ html: newValue }), 'silent');\n  }\n\n  //FIXME: utiliser les utils de la lib ngx-dsfr\n  private isStringEmptyOrNull(s: string | null | undefined): boolean {\n    return !s || s.trim() === '';\n  }\n\n  private _onEditorSelectionChange(range: { index: number; length: number }) {\n    // RPA: vu avec SAB le 25/09/2024 : on considère que la toolbar reflète l'état courant relatif à la position du\n    // curseur et/ou la sélection active dans l'éditeur\n    // si on change d'avis et qu'on on veut conserver l'état de la toolbar correspondant à la dernière position du\n    // curseur avant une perte de focus de l'éditeur alors il ne faut pas émettre d'event si range==null\n    this.editorService.setCurrentFormatting(this._getCurrentFormatting());\n  }\n\n  /**\n   * Permet de se mettre à l'écoute du contenu de l'éditeur afin de reset la toolbar si l'éditeur est vidé.\n   */\n  private _onEditorChange(eventName: string, delta: Delta, oldContents: Delta, source: string) {\n    if (eventName === 'text-change') {\n      // Note even when Quill is empty, there is still a blank line represented by '\\n', so getLength will return 1.\n      if (this._quill.getLength() === 1) {\n        this.editorService.setCurrentFormatting(undefined);\n      } else {\n        this.editorService.setCurrentFormatting(this._getCurrentFormatting());\n      }\n      // on signale le changement à l'extérieur\n      this.editorService.emitEditorChange(this._quill.getSemanticHTML());\n    }\n  }\n\n  private _getCurrentFormatting(): Formatting | undefined {\n    const range: Range | null = this._quill.getSelection();\n    return range ? this._quill.getFormat(range.index, range.length) : undefined;\n  }\n}\n","<fieldset role=\"presentation\">\n  <legend id=\"{{ editorId }}-legend\" [class.fr-sr-only]=\"legendSrOnly\">{{ 'editor.legend' | dsfrI18n }}</legend>\n  <div id=\"{{ editorId }}\"></div>\n</fieldset>\n\n<div class=\"fr-messages-group\" [attr.id]=\"messagesGroupId\" aria-live=\"polite\">\n  @if (message) {\n    <p\n      class=\"fr-message\"\n      [ngClass]=\"{\n        'fr-message--error': hasMessage(severityConst.ERROR),\n        'fr-message--valid': hasMessage(severityConst.SUCCESS),\n        'fr-message--info': hasMessage(severityConst.INFO),\n      }\">\n      {{ message }}\n    </p>\n  }\n</div>\n\n@if (showEditorHtmlDebugPanel) {\n  <div class=\"debug-panel\">\n    <p>Editor source</p>\n    <code>{{ _quill?.root?.innerHTML }}</code>\n  </div>\n}\n\n@if (showSemanticHtmlDebugPanel) {\n  <div class=\"debug-panel\">\n    <p>HTML output</p>\n    <code>{{ _quill?.getSemanticHTML() }}</code>\n  </div>\n}\n","import { AfterViewInit, Directive, ElementRef, Input, inject } from '@angular/core';\n\n@Directive({\n  selector: '[addTitle]',\n  standalone: true,\n})\nexport class AddTitleDirective implements AfterViewInit {\n  /**\n   * La texte du tooltip.\n   */\n  @Input('addTitle') text = '';\n\n  /**\n   * Le sélecteur à utilsier pour identifier l'élément cible sur lequel positionner l'attribut `title`.\n   */\n  @Input('addTitleSelector') selector?: string = undefined;\n\n  private host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n  ngAfterViewInit(): void {\n    if (this.text && this.text.length) {\n      this.applyTitle();\n    }\n  }\n\n  private applyTitle(): void {\n    const elem: Element | null = this.selector ? this.host.nativeElement.querySelector<Element>(this.selector) : null;\n    if (elem) {\n      elem.setAttribute('title', this.text);\n    }\n  }\n}\n","import { AfterViewInit, Directive, ElementRef, Input, Renderer2, inject } from '@angular/core';\n\n/**\n * Permet de rendre l'élément déonoté par le sélecteur explicitement non-focusable. Cela sert au niveau de la toolbar\n * sur les dsfr-bouton et les dsfr-form-select qui embarquent des éléments nativement focusable tels que button et\n * select.\n */\n//TODO: (RPA) à réfléchir s'il ne faudrait pas plutôt prévoir d'ajouter un input `'unfocusable' permettant de gérer ça\n// directement  aux niveaux des composants eux-même (?)\n@Directive({\n  selector: '[unfocusable]',\n  standalone: true,\n})\nexport class UnfocusableDirective implements AfterViewInit {\n  /**\n   * Le sélecteur à utiliser pour récupérer l'élément à rendre non focusable.\n   */\n  // RPA: j'utilise l'alias du même nom que la directive pour pouvoir paramétrer directement la directive elle-même\n  // tout en disposant d'un nom plus explicite (selector) en interne.\n  @Input('unfocusable')\n  public selector?: string;\n\n  private _elementRef = inject(ElementRef);\n  private _renderer = inject(Renderer2);\n\n  // RPA: Je me mets sur AfterViewInit car sur OnInit je n'ai pas encore le select lorsque je requête le DOM\n  // (pour le bouton par contre cela fonctionnait avec OnInit)\n  ngAfterViewInit(): void {\n    let el: HTMLElement = this._elementRef.nativeElement.querySelector(this.selector);\n    if (el) {\n      this._renderer.setAttribute(el, 'tabindex', '-1');\n    } else {\n      //FIXME: (RPA) utiliser LoggerService lorsque celui-ci sera exporté depuis ngx-dsfr\n      console.warn('UnfocusableDirective > aucun élément remontée par le sélecteur', this.selector);\n    }\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n  Component,\n  CUSTOM_ELEMENTS_SCHEMA,\n  ElementRef,\n  inject,\n  Input,\n  NgZone,\n  OnDestroy,\n  OnInit,\n  Renderer2,\n  ViewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport {\n  DsfrButtonModule,\n  DsfrFormSelectModule,\n  DsfrI18nPipe,\n  DsfrI18nService,\n  DsfrSelectOption,\n  DsfrSkiplinksModule,\n} from '@edugouvfr/ngx-dsfr';\n\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { Subscription } from 'rxjs';\nimport { AddTitleDirective } from '../../directives/add-title.directive';\nimport { UnfocusableDirective } from '../../directives/unfocusable.directive';\nimport { DsfrEditorService, Formatting } from '../../editor.service';\nimport { DEFAULT_TOOLBAR_OPTIONS } from './editor-toolbar-default-options';\nimport {\n  ControlArray,\n  ControlMode,\n  DsfrBaseFormatControl,\n  DsfrMultivaluedFormatControl,\n  DsfrValueFormatControl,\n  Format,\n  FORMAT_I18N_KEYS,\n  FORMAT_ICON,\n  FormatConst,\n  FormatControl,\n  ToolbarControl,\n} from './editor-toolbar.model';\n\n/**\n * Les quatre modalités de présentation supportées par la toolbar pour afficher les contrôles de format.\n */\ntype ControlViewType = 'btn' | 'array' | 'radio' | 'select';\n\n@Component({\n  selector: 'edu-editor-toolbar',\n  encapsulation: ViewEncapsulation.None,\n  templateUrl: './editor-toolbar.component.html',\n  styleUrls: ['./editor-toolbar.component.scss'],\n  imports: [\n    CommonModule,\n    FormsModule,\n    ReactiveFormsModule,\n    DsfrSkiplinksModule,\n    DsfrFormSelectModule,\n    DsfrButtonModule,\n    UnfocusableDirective,\n    DsfrI18nPipe,\n    AddTitleDirective,\n  ],\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class EduEditorToolbarComponent implements OnInit, OnDestroy {\n  /**\n   * L'identifiant du tag hôte pour le composant éditeur.\n   */\n  @Input() editorId = 'editor';\n\n  /**\n   * Active la lecure seule.\n   */\n  //TODO: @Input() readOnly = false;\n\n  /**\n   * Options de la toolbar.\n   */\n  @Input() toolbarOptions: ToolbarControl[] = DEFAULT_TOOLBAR_OPTIONS;\n\n  /** @internal */\n  @ViewChild('toolbar') toolbar!: ElementRef;\n\n  /**\n   * Modèle de présentation spécifique pour les select (header+size).\n   * RPA: je passe par un modèle de présentation spécifique et je n'utilise pas directement un binding sur\n   * currentSelectionFormats car j'ai besoin de reflêter l'état de sélection utilisateur sinon voici ce qui ce passe :\n   * l'utilisateur sélectionne une portion de texte et sélectionnz un niveau de titre H2, puis il place le curseur dans\n   * un paragraphe quelconque, le select reste sur H2 car la propriété interne 'value' n'est pas mise à jour lors de\n   * la sélection utilisateur (binding non bi-directionnel). C'est pourquoi il est nécessaire de passer par un modèle\n   * de présentation dédié à la gestion des select.\n   */\n  protected selectModel: any = { header: null, size: null };\n\n  /**\n   * Permet de gérer la valeur tabindex de la toolbar.\n   */\n  protected focusable = true;\n\n  /**\n   * Pointeur sur le dernier élément de contrôle actif, permet de restaurer le focus directement sur celui-ci au\n   * SHIFT+TAB.\n   */\n  protected lastActiveControlElement?: HTMLElement;\n\n  /**\n   * Modèle de présentation interne exposant les formats de la sélection courante.\n   */\n  private _currentSelectionFormats: Formatting | undefined;\n\n  private _unlistenFn!: Function;\n\n  private _sub: Subscription[] = [];\n\n  private readonly ngZone = inject(NgZone);\n  private readonly renderer2 = inject(Renderer2);\n  private readonly elementRef = inject(ElementRef);\n  private readonly i18n = inject(DsfrI18nService);\n  private readonly editorService = inject(DsfrEditorService);\n  private focusMonitor = inject(FocusMonitor);\n  private el = inject(ElementRef);\n\n  ngOnInit(): void {\n    this._sub.push(\n      this.editorService.currentFormatting$.subscribe((formatting: Formatting) => {\n        this._updateToolbar(formatting);\n      }),\n    );\n    // cdk permet de positionner des classes css sur l'hôte indiquant si l'utilisateur utilise la souris ou le clavier\n    this.focusMonitor.monitor(this.el, true);\n    // Hors zone Angular pour des raisons de perf\n    this.ngZone.runOutsideAngular(() => {\n      this._unlistenFn = this.renderer2.listen('document', 'click', (e) => {\n        this.clickOutside(e);\n      });\n    });\n  }\n\n  ngOnDestroy(): void {\n    this._sub.forEach((sub: Subscription) => sub.unsubscribe());\n    this._unlistenFn();\n  }\n\n  /**\n   * Retourne la clé du libellé internationalisé.\n   * @param control  le contôle de formatage\n   */\n  getI18nKey(format: Format, value: any = undefined): string {\n    let key = FORMAT_I18N_KEYS[format];\n    // si action multivaluée (radio ou select) il faut aller regarder la valeur pour obtenir la clé i18n\n    // sauf si la valeur est false ce qui correspond à une suppression et on ne peut pas connaître la valeur exacte\n    if (value !== undefined && this.isMultiValuedControl(format)) {\n      // console.log('getI18nKey', value);\n      key = key as Record<string, string>;\n      key = key[typeof value === 'boolean' ? 'label' : String(value)];\n    }\n\n    return key as string;\n  }\n\n  /**\n   * Construit la clé i18n correspondant au nom du tableau de contrôles passé en paramètre.\n   */\n  protected getArrayI18nKey(controlArray: ControlArray) {\n    return 'editor.controls.' + controlArray.name;\n  }\n\n  /**\n   * Construit la clé i18n correspondant au groupe de contrôles multivalués passé en paramètre.\n   */\n  protected getGroupI18nKey(format: Format) {\n    return 'editor.controls.' + format + '.label';\n  }\n\n  /**\n   * Handler sur l'input file associé à une inserion d'image.\n   */\n  //FIXME : erreur dans la console : ParchmentError: [Parchment] Cannot wrap imag\n  protected onImageInputFileChange(event: Event) {\n    this._uploadImage(event);\n  }\n\n  /**\n   * Permet de conditionner la structure HTML selon le type contrôle.\n   */\n  protected getButtonType(control: FormatControl | FormatControl[]): ControlViewType {\n    // Tableau de contrôles\n    if (Array.isArray(control)) {\n      return control.length ? 'array' : 'btn';\n    }\n\n    // Contrôle multivalué\n    if ('values' in control && control.values?.length) {\n      const mapping: Partial<Record<ControlMode, ControlViewType>> = {\n        [ControlMode.RADIO]: 'radio',\n        [ControlMode.SELECT]: 'select',\n      };\n\n      return mapping[control.mode] ?? 'btn';\n    }\n\n    return 'btn';\n  }\n\n  /**\n   * Retourne l'icône correspondant au format passé en paramètre.\n   *\n   * @param format le format à considérer\n   * @param value la vaaleur à prendre en compte le cas échéant\n   * @returns la classe css correspondant à l'icône\n   */\n  protected getIcon(format: Format, value = undefined): string | undefined {\n    let icon: any = FORMAT_ICON[format];\n    // la valeur peut être falsy d'où le test explicite sur not(undefined)\n    if (icon && value !== undefined) {\n      // on doit aller chercher l'icône en utilisant la valeur comme clé\n      icon = icon[value];\n    }\n\n    return icon;\n  }\n\n  /**\n   * Détermine si l'option de format doit être activée ou pas.\n   *\n   * @param format le nom de contrôle de format\n   * @param value la valeur de l'option considérée\n   * @returns vrai si le couple format/value fait partie des formats de la sélection courante, faux sinon\n   */\n  protected isValueActive(format: Format, value: string): boolean {\n    // @ts-ignore (RPA) le test sur currentSelectionFormats est effectué à l'intérieur de la fonction isFormatActive\n    return this.isFormatActive(format) ? this._currentSelectionFormats[format] === value : false;\n  }\n\n  /**\n   * Retourne la liste des optiosn à affichier au sein du contrôle multivalué (select).\n   *\n   * @param control le contrôle multivalué à considéré\n   */\n  protected getSelectOptions(control: DsfrMultivaluedFormatControl): DsfrSelectOption[] {\n    return control.values.map((v: DsfrValueFormatControl) => this._buildSelectOption(control.name, v));\n  }\n\n  /**\n   * Permet d'indiquer si le contrôle de ce format doit être activé au niveau de la barre d'outils.\n   *\n   * @param format le format à considérer vis-à-vis des formats de la sélection courante\n   * @returns vrai si ce format doit être actif, faux sinon\n   */\n  protected isFormatActive(format: Format): boolean {\n    return this._currentSelectionFormats ? format in this._currentSelectionFormats : false;\n  }\n\n  /**\n   * Permet de réagir aux actions utilisateur sur la toolbar.\n   */\n  protected onToolbarControlPerform(event: Event, format: FormatControl, value?: string) {\n    event.preventDefault();\n    this._applyFormat(format, value);\n  }\n\n  /**\n   * Permet d'écouter la capture d'une couleur par l'utilisateur.\n   */\n  protected onColorPickerChange(event: Event, action: string) {\n    const target = <HTMLInputElement>event.target;\n    const value = target.value ?? undefined;\n    if (value) {\n      this.performAction(action, value);\n    }\n  }\n\n  /**\n   * Permet d'écouter les changement sur le format \"list\".\n   *\n   * @param action\n   * @param event\n   */\n  protected onListSelect(action: string, event: Event) {\n    this.performAction(action, event);\n  }\n\n  /**\n   * Permet de forcer la prise de focus sur le premier élément focusable de la barre d'outil lorsque le conteneur de\n   * la toolbar reçoit le focus.\n   */\n  protected onToolbarFocus(event: FocusEvent) {\n    if (this.lastActiveControlElement) {\n      this.lastActiveControlElement.focus();\n    } else {\n      const nextElem: HTMLElement = this.elementRef.nativeElement.querySelector('.item-editor, .fr-select');\n      nextElem?.focus();\n    }\n  }\n\n  /**\n   * Handler sur la prise de focus d'un élément de la toolbar (gestion du tabindex de la toolbar).\n   */\n  protected onToolbarFocusIn(event: FocusEvent): void {\n    // lorsqu'un élément de la toolbar obtient le focus alors la toolbar ne doit plus être focusable\n    this.focusable = false;\n  }\n\n  /**\n   * Handler sur la perte de focus d'un élément de la toolbar (gestion du tabindex de la toolbar).\n   */\n  protected onToolbarFocusOut(event: FocusEvent): void {\n    // lorsqu'un élément de la toolbar perd le focus\n    // il faut regarder si le focus a été positionné sur un autre élément de la toolbar\n    // si ce n'est pas le cas la toolbar doit être de nouveau focusable\n    this.focusable = !this.toolbar.nativeElement.contains(document.activeElement);\n  }\n\n  /**\n   * Permet de se mettre à l'écoute des actions utilisateur sur la barre d'outils.\n   */\n  protected onToolbarKeydown(event: KeyboardEvent) {\n    const key = event.key;\n    switch (key) {\n      case 'Tab':\n        if (!event.shiftKey) {\n          event.preventDefault(); // évite la perte de focus asynchrone sur l'éditeur due à la propagation de l'event\n          this.editorService.requestFocusOnEditorContent();\n        }\n        break;\n\n      case 'ArrowRight':\n      case 'ArrowLeft':\n        event.preventDefault(); // évite la prise de focus sur l'éditeur suite propagation event\n        let focusableElt = key === 'ArrowRight' ? this.findNextSiblingControl() : this.findPrevSiblingControl();\n        if (focusableElt) {\n          focusableElt.focus();\n          this.lastActiveControlElement = focusableElt;\n        }\n        break;\n\n      default:\n        break;\n    }\n  }\n\n  /**\n   * Retourne vrai si le format correspond à un contrôle d'action multivaluée, faux sinon.\n   *\n   * @param format le descripteur de format à considérer\n   */\n  private isMultiValuedControl(format: Format): boolean {\n    let control: any | undefined = this.toolbarOptions.flat(Infinity).find((c) => c.name === format);\n\n    return control && control.values && control.values.length;\n  }\n\n  private getOptionLabel(format: Format, value: any): string {\n    const record: Record<string, string> = FORMAT_I18N_KEYS[format] as Record<string, string>;\n    const key = record[String(value)];\n\n    return this.i18n.t(key);\n  }\n\n  private performAction(action: any, value?: any) {\n    if (action) {\n      this.editorService.requestFormatting({ action: action, value: value });\n    } else {\n      this.editorService.requestFormatting(undefined);\n    }\n  }\n\n  /**\n   * Détecte le clic en dehors du composant pour retirer le marqueur de focus custom sur la toolbar.\n   */\n  private clickOutside(event: any) {\n    // comme on s'est mis à l'écoute de l'event hors Angular pour des raisons de perf, on doit mettre à jour l'input\n    // en s'exécutant dans la zone Angular\n    this.ngZone.run(() => {\n      if (!this.elementRef.nativeElement.contains(event.target)) {\n        this.focusable = true;\n      }\n    });\n  }\n\n  private _buildSelectOption(format: Format, control: DsfrValueFormatControl) {\n    return { label: this.getOptionLabel(format, control.value), value: control.value };\n  }\n\n  private findNextSiblingControl(): HTMLElement | null {\n    return this.findSiblingControl('nextElementSibling', () => this.getFirstToolbarControl());\n  }\n\n  private findPrevSiblingControl(): HTMLElement | null {\n    return this.findSiblingControl('previousElementSibling', () => this.getLastToolbarControl());\n  }\n\n  /**\n   * Recherche l'élément de contrôle focusable adjaçant à l'élément de contrôle actif.\n   *\n   * Cette fonction est utilisée pour pouvoir déplacer le focus lors de la navigation au clavier.\n   *\n   * @param siblingProperty La propriété permettant de récupérer le voisin suivant ou précédent (selon)\n   * @param failoverFunction La fonction permettant de récupérer un élément focusable lorsqu'il n'y plus de suivant\n   * @returns Une élément HTML sur lequel il sera possible de prendre le focus\n   */\n  private findSiblingControl(\n    siblingProperty: 'nextElementSibling' | 'previousElementSibling',\n    failoverFunction: () => HTMLElement | null,\n  ): HTMLElement | null {\n    const activeElt = document.activeElement as HTMLElement | null;\n    if (!activeElt) return failoverFunction();\n\n    let sibling: Element | null = null;\n\n    // Cas 1 — action simple ou groupe d'actions simples\n    let controlParent: Element | null = activeElt.closest('span.control') as Element | null;\n    if (controlParent) {\n      sibling = this.findSiblingControlParent(controlParent, siblingProperty);\n    }\n    // Cas 2 — action multi-valuée (radio)\n    if (sibling === null && activeElt.closest('fieldset.group')) {\n      // controlParent = activeElt.parentElement;\n      //FIXME: (RPA) reprendre la ligne du dessus au rétablissement des dsfr-button\n      controlParent = activeElt;\n      // directly try to get next dsfr-button\n      sibling = this.findSiblingControlParent(controlParent, siblingProperty);\n    }\n    // Cas 3 - Pas de suivant immédiat > on doit remonter au groupe racine\n    if (sibling === null) {\n      const rootContainer = this.getRootContainer(activeElt);\n      if (rootContainer) {\n        sibling = rootContainer[siblingProperty] as HTMLElement;\n      }\n    }\n\n    // L'idée est d'aller récupérer l'élément de contrôle focusable\n    // Selon la direction indiquée ce sera soit le premier du groupe soit le dernier\n    if (sibling) {\n      return this.getFocusableControl(sibling, siblingProperty === 'previousElementSibling');\n    }\n\n    return failoverFunction();\n  }\n\n  /**\n   * Recherche du conteneur de contrôle suivant.\n   */\n  private findSiblingControlParent(node: any, siblingProperty: string): Element | null {\n    const sibling: Element | null = node ? (node[siblingProperty] as Element) : null;\n    const isValidControlParent =\n      sibling &&\n      //(sibling.tagName === 'DSFR-BUTTON' || (sibling.tagName === 'SPAN' && sibling.classList.contains('control')));\n      //FIXME: (RPA) reprendre la ligne du dessus au rétablissement des dsfr-button\n      (sibling.tagName === 'BUTTON' || (sibling.tagName === 'SPAN' && sibling.classList.contains('control')));\n\n    return isValidControlParent ? sibling : null;\n  }\n\n  private getRootContainer(node: Element): Element | null {\n    const toolbar = this.toolbar.nativeElement;\n    if (!toolbar.contains(node)) return null;\n\n    let current: Element | null = node;\n    while (current && current.parentElement && current.parentElement !== toolbar) {\n      current = current.parentElement;\n    }\n    return current && current.parentElement === toolbar ? current : null;\n  }\n\n  /**\n   * Search focusable control (depth first traversal).\n   */\n  private getFocusableControl(elt: Element, reverse = false): HTMLElement | null {\n    if (elt.tagName === 'BUTTON' || elt.tagName === 'SELECT') {\n      return elt as HTMLElement;\n    } else if (elt.children.length !== 0) {\n      let children = Array.from(elt.children);\n      if (reverse) {\n        children = children.reverse();\n      }\n      for (const c of children) {\n        const focusable = this.getFocusableControl(c);\n        if (focusable) {\n          return focusable;\n        }\n      }\n    }\n    return null;\n  }\n\n  private getFirstToolbarControl(): HTMLElement | null {\n    return this.getFocusableControl(this.toolbar.nativeElement);\n  }\n\n  private getLastToolbarControl(): HTMLElement | null {\n    let lastOne = this.toolbar.nativeElement.lastElementChild;\n    return this.getFocusableControl(lastOne, true);\n  }\n\n  /**\n   * Répercute les formats actifs de la sélection courante vers la toolbar.\n   */\n  private _updateToolbar(formats: Formatting) {\n    // on force l'exécution dans zonejs car l'événement provient de Quill et n'est pas géré par Angular\n    this.ngZone.run(() => {\n      this._currentSelectionFormats = formats;\n      this.selectModel.header = this._getSelectedOption(FormatConst.HEADER);\n      this.selectModel.size = this._getSelectedOption(FormatConst.SIZE);\n    });\n  }\n\n  /**\n   * Retourne la valeur à sélectionner dans le cas de contôle multivalué (select).\n   *\n   * @internal\n   */\n  private _getSelectedOption(format: Format): unknown | null {\n    return this._currentSelectionFormats && this._currentSelectionFormats[format]\n      ? this._currentSelectionFormats[format]\n      : null;\n  }\n\n  /**\n   * Supprime toutes les mises en forme sur la sélection courante.\n   */\n  private _removeSelectionFormats() {\n    this.performAction(undefined);\n  }\n\n  /**\n   * Applique le format défini par l'utilisateur via la toolbar sur la sélection courante de l'éditeur.\n   */\n  private _applyFormat(control: FormatControl, value?: any) {\n    // Cas particulier du clean\n    if (control.name === FormatConst.CLEAN) {\n      this._removeSelectionFormats();\n    } else {\n      const baseControl: DsfrBaseFormatControl = control as DsfrBaseFormatControl;\n      switch (baseControl.mode) {\n        case ControlMode.TOGGLE:\n          // cas d'une toggle action, on détermine la valeur à transmettre à l'éditeur\n          value = this._currentSelectionFormats && control.name in this._currentSelectionFormats ? false : true;\n          break;\n\n        case ControlMode.RADIO:\n          // si l'action envoyée est déjà présente dans la sélection il faut envoyer \"false\" comme valeur\n          value =\n            this._currentSelectionFormats &&\n            control.name in this._currentSelectionFormats &&\n            this._currentSelectionFormats[control.name] === value\n              ? false\n              : value;\n          break;\n\n        case ControlMode.PROMPT:\n          switch (baseControl.name) {\n            case FormatConst.IMAGE:\n              //TODO: à remplacer par quelque chose de plus sexy\n              this._displayPromptElement('#prompt-' + FormatConst.IMAGE);\n              break;\n\n            case FormatConst.LINK:\n              //TODO: à remplacer par quelque chose de plus sexy\n              value = window.prompt(this.i18n.t('editor.controls.link.prompt'));\n              break;\n\n            case FormatConst.COLOR:\n              this._displayPromptElement('#picker-' + FormatConst.COLOR);\n              break;\n\n            case FormatConst.BACKGROUND:\n              this._displayPromptElement('#picker-' + FormatConst.BACKGROUND);\n              break;\n\n            default:\n              break;\n          }\n          break;\n\n        default:\n          break;\n      }\n\n      // si on a pu déterminer une valeur, on demande l'application du format à l'éditeur\n      if (value !== undefined) {\n        this.performAction(control.name, value);\n      }\n    }\n  }\n\n  /**\n   * Permet de capturer une couleur depuis un color-picker natif.\n   *\n   * @param selector le sélecteur permettant de requêter l'élément de contrôle complémentaire\n   */\n  private _displayPromptElement(selector: string) {\n    const elem: HTMLElement = document.querySelector(selector) as HTMLElement;\n    if (elem) elem.click();\n  }\n\n  /**\n   * Positionne l'image Base64 dans l'editeur.\n   */\n  private _uploadImage = async (event: Event) => {\n    const target = <HTMLInputElement>event.target;\n    if (target?.files) {\n      this.performAction('image', target.files);\n    }\n  };\n}\n","<div\n  #toolbar\n  role=\"toolbar\"\n  class=\"editor-toolbar\"\n  [tabindex]=\"focusable ? 0 : -1\"\n  [attr.aria-controls]=\"editorId\"\n  (focus)=\"onToolbarFocus($event)\"\n  (focusin)=\"onToolbarFocusIn($event)\"\n  (focusout)=\"onToolbarFocusOut($event)\"\n  (keydown)=\"onToolbarKeydown($event)\">\n  @for (control of toolbarOptions; track $index) {\n    <ng-container\n      [ngTemplateOutlet]=\"tplcontrol\"\n      [ngTemplateOutletContext]=\"{ type: getButtonType(control), control: control }\">\n    </ng-container>\n  }\n</div>\n\n<ng-template #tplcontrol let-type=\"type\" let-control=\"control\">\n  @if (type === 'btn') {\n    <ng-container [ngTemplateOutlet]=\"btn\" [ngTemplateOutletContext]=\"{ control: control }\"></ng-container>\n  } @else if (type === 'array') {\n    <fieldset class=\"group\">\n      <legend class=\"fr-sr-only\">{{ getArrayI18nKey(control) | dsfrI18n }}</legend>\n      @for (item of control; track $index) {\n        <ng-container [ngTemplateOutlet]=\"btn\" [ngTemplateOutletContext]=\"{ control: item }\"></ng-container>\n      }\n    </fieldset>\n  } @else if (type === 'radio') {\n    <fieldset class=\"group\">\n      <legend class=\"fr-sr-only\">{{ getGroupI18nKey(control.name) | dsfrI18n }}</legend>\n      @for (elem of control.values; track $index) {\n        <button\n          type=\"button\"\n          tabindex=\"-1\"\n          class=\"fr-btn item-editor fr-btn--tertiary-no-outline fr-btn--sm\"\n          [ngClass]=\"getIcon(control.name, elem.value)\"\n          [attr.title]=\"getI18nKey(control.name, elem.value) | dsfrI18n\"\n          [attr.aria-pressed]=\"isValueActive(control.name, elem.value)\"\n          [attr.data-testid]=\"control.name + '-' + elem.value\"\n          (click)=\"onToolbarControlPerform($event, control, elem.value)\"\n          (keydown.enter)=\"onToolbarControlPerform($event, control, elem.value)\">\n          {{ getI18nKey(control.name, elem.value) | dsfrI18n }}\n        </button>\n        <!-- <dsfr-button\n          unfocusable=\"button\"\n          type=\"button\"\n          variant=\"tertiary-no-outline\"\n          size=\"SM\"\n          customClass=\"item-editor\"\n          [icon]=\"getIcon(control.name, elem.value)\"\n          [label]=\"getI18nKey(control.name, elem.value) | dsfrI18n\"\n          [labelSrOnly]=\"true\"\n          [tooltipMessage]=\"getI18nKey(control.name, elem.value) | dsfrI18n\"\n          [attr.aria-pressed]=\"isValueActive(control.name, elem.value) || null\"\n          (click)=\"onToolbarControlPerform($event, control, elem.value)\"\n          (keydown.enter)=\"onToolbarControlPerform($event, control, elem.value)\"\n          [attr.data-testid]=\"control.name + '-' + elem.value\">\n        </dsfr-button> -->\n      }\n    </fieldset>\n  } @else if (type === 'select') {\n    <dsfr-form-select\n      unfocusable=\"select\"\n      [label]=\"getI18nKey(control.name, 'label') | dsfrI18n\"\n      [addTitle]=\"getI18nKey(control.name, 'label') | dsfrI18n\"\n      addTitleSelector=\"select\"\n      [labelSrOnly]=\"true\"\n      [(ngModel)]=\"selectModel[control.name]\"\n      [placeholder]=\"getI18nKey(control.name, 'label') | dsfrI18n\"\n      [options]=\"getSelectOptions(control)\"\n      (selectChange)=\"onListSelect(control.name, $event)\"\n      [attr.data-testid]=\"control.name\"></dsfr-form-select>\n  }\n</ng-template>\n\n<!--TODO: RPA: remplacer les attributs tooltipMessage par des vrais tooltips dsfr -->\n<ng-template #btn let-control=\"control\">\n  <span\n    [ngClass]=\"{\n      control: true,\n      prompt: control.mode === 'prompt',\n    }\">\n    <button\n      type=\"button\"\n      tabindex=\"-1\"\n      class=\"fr-btn item-editor fr-btn--tertiary-no-outline fr-btn--sm\"\n      [ngClass]=\"getIcon(control.name)\"\n      [attr.title]=\"getI18nKey(control.name) | dsfrI18n\"\n      [attr.aria-pressed]=\"isFormatActive(control.name)\"\n      [attr.data-testid]=\"control.name\"\n      [attr.aria-haspopup]=\"control.mode === 'prompt' ? 'dialog' : null\"\n      (click)=\"onToolbarControlPerform($event, control)\"\n      (keydown.enter)=\"onToolbarControlPerform($event, control)\">\n      {{ getI18nKey(control.name) | dsfrI18n }}\n    </button>\n    <!-- <dsfr-button\n      unfocusable=\"button\"\n      type=\"button\"\n      variant=\"tertiary-no-outline\"\n      buttonSize=\"SM\"\n      customClass=\"item-editor\"\n      [icon]=\"getIcon(control.name)\"\n      [label]=\"getI18nKey(control.name) | dsfrI18n\"\n      [labelSrOnly]=\"true\"\n      [tooltipMessage]=\"getI18nKey(control.name) | dsfrI18n\"\n      [attr.aria-pressed]=\"isFormatActive(control.name)\"\n      (click)=\"onToolbarControlPerform($event, control)\"\n      (keydown.enter)=\"onToolbarControlPerform($event, control)\"\n      [attr.data-testid]=\"control.name\">\n    </dsfr-button> -->\n    @if (control.name === 'color' || control.name === 'background') {\n      <input\n        [attr.id]=\"'picker-' + control.name\"\n        class=\"item-editor prompt-color\"\n        type=\"color\"\n        tabindex=\"-1\"\n        (change)=\"onColorPickerChange($event, control.name)\"\n        [attr.aria-label]=\"getI18nKey(control.name) | dsfrI18n\" />\n    } @else if (control.name === 'image') {\n      <input\n        [attr.id]=\"'prompt-' + control.name\"\n        class=\"item-editor prompt-file\"\n        type=\"file\"\n        accept=\"image/*\"\n        tabindex=\"-1\"\n        (change)=\"onImageInputFileChange($event)\"\n        [attr.aria-label]=\"getI18nKey(control.name) | dsfrI18n\" />\n    }\n  </span>\n</ng-template>\n","import {\n  Component,\n  CUSTOM_ELEMENTS_SCHEMA,\n  ElementRef,\n  EventEmitter,\n  forwardRef,\n  inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  Output,\n  ViewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\nimport {\n  DefaultValueAccessorComponent,\n  DsfrButtonModule,\n  DsfrFormSelectModule,\n  DsfrI18nPipe,\n  DsfrI18nService,\n  DsfrSeverity,\n  DsfrSkiplinksModule,\n  Language,\n} from '@edugouvfr/ngx-dsfr';\n\nimport { MESSAGES_EN } from './i18n/messages.en';\nimport { MESSAGES_FR } from './i18n/messages.fr';\n\nimport { Subscription } from 'rxjs';\nimport { EduEditorContentComponent } from './components/content/editor-content.component';\nimport { DEFAULT_TOOLBAR_OPTIONS } from './components/toolbar/editor-toolbar-default-options';\nimport { EduEditorToolbarComponent } from './components/toolbar/editor-toolbar.component';\nimport { Format, ToolbarControl } from './components/toolbar/editor-toolbar.model';\nimport { DsfrEditorService, FormattingRequest } from './editor.service';\n\n// Basé sur https://github.com/KillerCodeMonkey/ngx-quill\n// Demo sur https://killercodemonkey.github.io/ngx-quill-example/\n\n@Component({\n  selector: 'dsfr-ext-editor, dsfrx-editor',\n  encapsulation: ViewEncapsulation.None,\n  templateUrl: './editor.component.html',\n  styleUrls: ['./editor.component.scss'],\n  imports: [\n    FormsModule,\n    ReactiveFormsModule,\n    DsfrSkiplinksModule,\n    DsfrFormSelectModule,\n    DsfrButtonModule,\n    DsfrI18nPipe,\n    EduEditorToolbarComponent,\n    EduEditorContentComponent,\n  ],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => DsfrEditorComponent),\n      multi: true,\n    },\n    DsfrEditorService,\n  ],\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class DsfrEditorComponent extends DefaultValueAccessorComponent<string> implements OnInit, OnDestroy {\n  /**\n   * Options de la toolbar.\n   */\n  @Input() toolbarOptions: ToolbarControl[] = DEFAULT_TOOLBAR_OPTIONS;\n\n  /**\n   * Permet de spécifier l'identifiant à utiliser pour le composant d'édition.\n   * C'est utile si vous souhaitez disposer de plusieurs éditeurs sur un même écran.\n   *\n   * Attention : cet input est statique et doit être connu à l'initialisation du composant.\n   */\n  @Input() editorId = 'editor';\n\n  /**\n   * Libellé du champ de saisie riche.\n   *\n   * Obligatoire si vous ne gérez pas un libellé accessible via aria-Labelledby.\n   *\n   * Il est possible de masquer visuellement ce libellé via la propriété `labelSrOnly`.\n   */\n  @Input() label?: string;\n\n  /**\n   * Permet de masquer visuellement le libellé en le réservant aux dispositifs de restitution.\n   */\n  @Input() labelSrOnly = false;\n\n  /**\n   * Renseigner cette propriété si vous souhaitez utiliser le texte d'un élément tiers comme légende du composant\n   * d'édition riche.\n   */\n  @Input() ariaLabelledBy?: string;\n\n  /**\n   * Optionnel : permet de surcharger le texte de description additionnel.\n   *\n   * - La valeur `undefined` permet d'obtenir la description par défaut\n   * - La valeur `null` permet de supprimer complètement la description\n   * - Toute autre valeur sera utilisée pour valoriser la description\n   */\n  @Input() hint?: string | null = undefined;\n\n  /**\n   * Permet de masquer visuellement le texte de description additionnel pour la réserver aux dispositifs de restitution.\n   */\n  @Input() hintSrOnly = false;\n\n  /**\n   * Permet de masquer visuellement la légende de l'éditeur pour la réserver aux dispositifs de restitution.\n   */\n  @Input() editorLegendSrOnly = false;\n\n  /**\n   * Active la lecture seule.\n   */\n  //TODO: @Input() readOnly = false;\n\n  /** Ajoute une validation comme étant un champs required */\n  //TODO: @Input() required = false;\n\n  /** Utilise DomSanitizer. Uniquement pour le format `html`. */\n  //TODO: @Input() sanitize = false;\n\n  /** Ajoute une valeur maximale de caractère pour validation. */\n  //TODO: @Input() maxLength: number;\n\n  /** Ajoute une valeur minimal de caractère pour validation. */\n  //TODO: @Input() minLength: number;\n\n  /**\n   * Message d'information associé au composant.\n   */\n  @Input() message?: string;\n\n  /**\n   * Représente la sévérité du message. 🔥 Le niveau `WARNING` n'est pas géré dans cette version.\n   */\n  @Input() messageSeverity?: DsfrSeverity;\n\n  /**\n   * Id de l'élément affichant les messages associé à l'éditeur. A renseigner si vous souhaitez positionner un attribut\n   * `aria-describedby` référençant votre message au niveau de l'élément hôte de l'éditeur.\n   *\n   * Attention : cet input est statique et doit être connu à l'initialisation du composant.\n   */\n  @Input() messagesGroupId?: string;\n\n  /**\n   * Dev/debug : permet d'afficher le code HTML interne de l'éditeur (i.e. celui qui sert pour l'affichage WYSIWYG).\n   */\n  @Input() showEditorHtmlDebugPanel = false;\n\n  /**\n   * Dev/debug : permet d'afficher le code HTML qui sera récupéré en sortie.\n   */\n  @Input() showSemanticHtmlDebugPanel = false;\n\n  /**\n   * Signale les changements sur le contenu HTML.\n   */\n  @Output() valueChange: EventEmitter<string> = new EventEmitter<string>();\n\n  /** @internal */\n  @ViewChild('toolbar') toolbar!: EduEditorToolbarComponent;\n\n  /** @internal */\n  @ViewChild('announcer') announcer!: ElementRef;\n\n  /**\n   * Gestion de l'identifiant du libellé accessible.\n   */\n  protected labelId: string;\n\n  /**\n   * Permet de vocaliser un feedback post-action de formatage.\n   */\n  protected announce: string | undefined;\n\n  private _sub: Subscription | undefined;\n\n  private readonly i18n = inject(DsfrI18nService);\n  private readonly editorService = inject(DsfrEditorService);\n\n  constructor() {\n    super();\n    this.labelId = 'label-' + this.editorId + 'legend';\n    this.i18n.extendsLabelsBundle(Language.EN, MESSAGES_EN);\n    this.i18n.extendsLabelsBundle(Language.FR, MESSAGES_FR);\n  }\n\n  ngOnInit() {\n    this._sub = this.editorService.editorChange$.subscribe((value: string) => {\n      if (this.value !== value) {\n        this.value = value && value.length ? value : '';\n        this.valueChange.emit(this.value);\n      }\n    });\n    // Si la valeur est non-nulle, on émet un changement de modèle pour forcer la mise à jour le contenu de l'éditeur\n    // car si l'utilisateur passe par une syntaxe [value]=\"<s>foo</s>\" et non par la directive [ngModel]\n    // le writeValue ne sera pas appelé, donc l'éditeur ne sera pas notifié et ne se mettra pas à jour\n    if (this.value) {\n      this.editorService.emitModelChange(this.value);\n    }\n\n    // On se met à l'écoute des mises en forme effective de l'éditeur pour restituer ce qui vient de se passer\n    this.editorService.editorActionPerformed$.subscribe((req: FormattingRequest) => {\n      let announce = '';\n      let i18nKey = undefined;\n      let actionLabel = undefined;\n      if (req) {\n        i18nKey = this.toolbar.getI18nKey(req.action as Format, req.value);\n\n        actionLabel = i18nKey ? this.i18n.t(i18nKey) : undefined;\n\n        if (actionLabel === undefined) return;\n\n        let actionInfo = this.i18n.t('editor.announce.applied');\n        if (typeof req.value === 'boolean' && req.value === false) {\n          actionInfo = this.i18n.t('editor.announce.removed');\n        }\n        announce = this.i18n.t('editor.announce.pre') + actionLabel + actionInfo;\n      } else if (req === undefined) {\n        // clean format action\n        announce = this.i18n.t('editor.announce.cleaned');\n      }\n      this.announce = announce;\n      setTimeout(() => {\n        this.announce = '';\n      }, 2000);\n    });\n  }\n\n  ngOnDestroy(): void {\n    this._sub?.unsubscribe();\n  }\n\n  /** @internal */\n  override writeValue(value: string | undefined): void {\n    super.writeValue(value);\n    if (value) {\n      this.editorService.emitModelChange(value);\n    }\n  }\n\n  /**\n   * Retourne l’entrée complète de l’enum (clé + valeur)\n   * correspondant à la valeur passée en paramètre.\n   */\n  private getEnumEntryByValue<T extends Record<string, string>, V extends T[keyof T]>(\n    enumObj: T,\n    value: V,\n  ): { key: keyof T; value: V } | undefined {\n    const entry = Object.entries(enumObj).find(([, v]) => v === value) as [keyof T, V] | undefined;\n\n    return entry ? { key: entry[0], value: entry[1] } : undefined;\n  }\n}\n","<fieldset [attr.aria-labelledby]=\"ariaLabelledBy || null\">\n  @if (label && !ariaLabelledBy) {\n    <legend class=\"fr-label\" [class.fr-sr-only]=\"labelSrOnly\">\n      {{ label }}\n    </legend>\n  }\n\n  @if (hint === undefined) {\n    <span class=\"fr-hint-text\" [class.fr-sr-only]=\"hintSrOnly\">{{ 'editor.hint' | dsfrI18n }}</span>\n  } @else if (hint !== null) {\n    <span class=\"fr-hint-text\" [class.fr-sr-only]=\"hintSrOnly\">{{ hint }}</span>\n  }\n\n  <edu-editor-toolbar #toolbar [toolbarOptions]=\"toolbarOptions\" [editorId]=\"editorId\"></edu-editor-toolbar>\n\n  <edu-editor-content\n    [editorId]=\"editorId\"\n    [message]=\"message\"\n    [legendSrOnly]=\"editorLegendSrOnly\"\n    [messageSeverity]=\"messageSeverity\"\n    [messagesGroupId]=\"messagesGroupId\"\n    [showEditorHtmlDebugPanel]=\"showEditorHtmlDebugPanel\"\n    [showSemanticHtmlDebugPanel]=\"showSemanticHtmlDebugPanel\"></edu-editor-content>\n</fieldset>\n\n<div aria-live=\"polite\" id=\"editor-announcer\" class=\"fr-sr-only\" #announcer>\n  @if (announce) {\n    <p>{{ announce }}</p>\n  }\n</div>\n","/**\n * API publique du module Editor.\n *\n * @module ngx-dsfr-ext/editor\n */\n\nexport * from './lib';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}