{"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/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    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    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 d el'é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 *\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 * Type générique encapsulant toutes les types de tâches de formatage.\n */\nexport type FormatControl = DsfrSingleFormatControl | DsfrMultivaluedFormatControl;\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 | FormatControl[];\n","import {\n  AlignValue,\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  [\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 DsfrPromptFormatControl(FormatConst.COLOR), new DsfrPromptFormatControl(FormatConst.BACKGROUND)],\n  // mise en forme avancée\n  [\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    placeholder: 'Veuillez éditer votre contenu',\n    controls: {\n      align: { left: 'Left', center: 'Center', right: 'Right', justify: 'Justify' },\n      background: `Background color`,\n      blockquote: 'Quote',\n      clean: 'Reset format',\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: { sub: 'Subscript', super: 'Superscript' },\n      size: { label: 'Text size', small: 'Small', normal: 'Normal', large: 'Large', huge: 'Huge' },\n      strike: 'Strike',\n      underline: 'Underline',\n    },\n  },\n};\n","// Ordre alphabétique requis\nexport const MESSAGES_FR = {\n  editor: {\n    placeholder: 'Veuillez éditer votre contenu',\n    controls: {\n      align: {\n        label: 'Alignement du texte',\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: 'Réinitialiser le formatage',\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: { 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    },\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   * 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  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\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  }\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","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 { DsfrI18nService, DsfrSeverity, DsfrSeverityConst } 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  standalone: true,\n  imports: [CommonModule],\n\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   * Renseigner cette proprité positionne un attribut aria-labelledby sur l'élément hôte de l'éditeur.\n   */\n  @Input() ariaLabelledBy: string;\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  /**\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    // 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.ariaLabelledBy && this.ariaLabelledBy.length) {\n      this._quill.root.setAttribute('aria-labelledby', this.ariaLabelledBy);\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      }),\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  }\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({ ariaLabelledBy, message, messagesGroupId }: SimpleChanges): void {\n    if (ariaLabelledBy) {\n      if (this.ariaLabelledBy && this.ariaLabelledBy.length) {\n        this._quill?.root.setAttribute('aria-labelledby', this.ariaLabelledBy);\n      } else {\n        this._quill?.root.removeAttribute('aria-labelledby');\n      }\n    }\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","<div id=\"{{ editorId }}\"></div>\n\n<div class=\"fr-messages-group\" [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, Renderer2 } 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  constructor(\n    private _elementRef: ElementRef,\n    private _renderer: Renderer2,\n  ) {}\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 { Subscription } from 'rxjs';\nimport { UnfocusableDirective } from '../../directives/unfocusable.directive';\nimport { DsfrEditorService, Formatting } from '../../editor.service';\nimport { DEFAULT_TOOLBAR_OPTIONS } from './editor-toolbar-default-options';\nimport {\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' | 'group' | '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  standalone: true,\n  imports: [\n    CommonModule,\n    FormsModule,\n    ReactiveFormsModule,\n    DsfrSkiplinksModule,\n    DsfrFormSelectModule,\n    DsfrButtonModule,\n    UnfocusableDirective,\n    DsfrI18nPipe,\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('controlsParent') controlsParent: 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 l'affichage d'un outline custom lorsque la toolbar prend le focus.\n   */\n  protected toolbarFocused = false;\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\n  constructor() {}\n\n  ngOnInit(): void {\n    this._sub = this.editorService.currentFormatting$.subscribe((formatting: Formatting) => {\n      this._updateToolbar(formatting);\n    });\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?.unsubscribe();\n    this._unlistenFn();\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    let result: ControlViewType = 'btn';\n    if (Array.isArray(control) && control.length) {\n      result = 'group';\n    } else if ('values' in control && control.values && control.values.length) {\n      switch ((control as DsfrBaseFormatControl).mode) {\n        case ControlMode.RADIO:\n          result = 'radio';\n          break;\n\n        case ControlMode.SELECT:\n          result = 'select';\n          break;\n\n        default:\n          break;\n      }\n    }\n\n    return result;\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   * Retourne la clé du libellé internationalisé.\n   * @param control  le contôle de formatage\n   */\n  protected getI18nKey(format: Format, value: string | boolean | undefined = undefined): string {\n    let key = FORMAT_I18N_KEYS[format];\n    if (value !== undefined) {\n      key = key as Record<string, string>;\n      key = key[String(value)];\n    }\n\n    return key as string;\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() {\n    this.toolbarFocused = true;\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   * Permet de gérer la sortie de focus\n   */\n  protected onToolbarBlur(event: any) {\n    // si le focus est pris par un élément de contrôle, on conserve l'outline custom\n    if (!event.currentTarget?.contains(event.relatedTarget)) {\n      this.toolbarFocused = false;\n    }\n  }\n\n  /**\n   * Permey 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        event.preventDefault(); // évite la perte de focus asynchrone sur l'éditeur due à la propagation de l'event\n        this.editorService.requestFocusOnEditorContent();\n        this.toolbarFocused = false;\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  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    this.toolbarFocused = false;\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.toolbarFocused = false;\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 _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    return this.i18n.t(key);\n  }\n\n  private findNextSiblingControl(): HTMLElement | undefined {\n    return this.findSiblingControl('nextElementSibling', () => this.getFirstToolbarControl());\n  }\n\n  private findPrevSiblingControl(): HTMLElement | undefined {\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   * @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: Function,\n  ): HTMLElement | undefined {\n    let result: HTMLElement | undefined = undefined;\n    let activeElt: Element | null = document.activeElement;\n    //TODO: imbrication conditionnelle complexe > à mettre sous harnais de tests pour ensuite tenter une simplification\n    if (activeElt) {\n      if (activeElt.tagName === 'BUTTON') {\n        if (activeElt.closest('dsfr-buttons-group')) {\n          const dsfrButtonsGroup = activeElt.parentElement;\n          if (dsfrButtonsGroup && dsfrButtonsGroup[siblingProperty])\n            // directly try to get next sibling\n            result = dsfrButtonsGroup[siblingProperty] as HTMLElement;\n        } else if (activeElt.closest('span.group')) {\n          const spanControl = activeElt.closest('span.control');\n          if (spanControl && spanControl[siblingProperty]) {\n            // directly try to get parent span to get next sibling\n            result = spanControl[siblingProperty] as HTMLElement;\n          }\n        }\n      }\n      if (result === undefined) {\n        while (activeElt.parentElement !== null && !activeElt.parentElement.classList.contains('editor-toolbar')) {\n          activeElt = activeElt.parentElement;\n        }\n        if (activeElt.parentElement?.classList.contains('editor-toolbar')) {\n          result = activeElt[siblingProperty] as HTMLElement;\n        }\n      }\n    }\n\n    return result ? this.getFocusableControl(result, siblingProperty === 'previousElementSibling') : failoverFunction();\n  }\n\n  private getFirstToolbarControl(): HTMLElement | undefined {\n    return this.getFocusableControl(this.controlsParent.nativeElement);\n  }\n\n  private getLastToolbarControl(): HTMLElement | undefined {\n    let lastOne = this.controlsParent.nativeElement.lastElementChild;\n    return this.getFocusableControl(lastOne, true);\n  }\n\n  /**\n   * Search focusable control (depth first traversal).\n   */\n  private getFocusableControl(elt: HTMLElement, reverse = false): HTMLElement | undefined {\n    if (elt.tagName === 'BUTTON' || elt.tagName === 'SELECT') {\n      return elt;\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 as HTMLElement);\n        if (focusable) {\n          return focusable;\n        }\n      }\n    }\n    return undefined;\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    // on met à jour les états aria-pressed sur les boutons\n    //TODO: à remplacer par un input ariaPressed sur dsfr-button cf. ngx-dsfr#\n    const dsfrButtons: NodeList = this.elementRef.nativeElement.querySelectorAll('dsfr-button');\n    dsfrButtons.forEach((n) => {\n      const e = n as HTMLElement;\n      const controlInfo = e.getAttribute('data-testid')?.split('-');\n      if (controlInfo) {\n        const pressed =\n          controlInfo.length === 1\n            ? this.isFormatActive(controlInfo[0] as Format)\n            : this.isValueActive(controlInfo[0] as Format, controlInfo[1] as string);\n\n        if (pressed) {\n          e.querySelector('button')?.setAttribute('aria-pressed', 'true');\n        } else {\n          e.querySelector('button')?.removeAttribute('aria-pressed');\n        }\n      }\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    const debug =\n      this._currentSelectionFormats && this._currentSelectionFormats[format]\n        ? this._currentSelectionFormats[format]\n        : null;\n    return debug;\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  #controlsParent\n  role=\"toolbar\"\n  class=\"editor-toolbar\"\n  tabindex=\"0\"\n  [attr.aria-controls]=\"editorId\"\n  [ngClass]=\"{ 'editor-toolbar--focus': toolbarFocused }\"\n  (focus)=\"onToolbarFocus()\"\n  (blur)=\"onToolbarBlur($event)\"\n  (keydown)=\"onToolbarKeydown($event)\">\n  @for (control of toolbarOptions; track control) {\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 === 'group') {\n    <span class=\"group\">\n      @for (item of control; track item) {\n        <ng-container [ngTemplateOutlet]=\"btn\" [ngTemplateOutletContext]=\"{ control: item }\"></ng-container>\n      }\n    </span>\n  } @else if (type === 'radio') {\n    <dsfr-buttons-group inline=\"always\" size=\"SM\" [ngClass]=\"{ group: control.group }\">\n      @for (elem of control.values; track elem) {\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          [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    </dsfr-buttons-group>\n  } @else if (type === 'select') {\n    <dsfr-form-select\n      unfocusable=\"select\"\n      [label]=\"getI18nKey(control.name, 'label') | dsfrI18n\"\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    <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)\"\n      [tooltipMessage]=\"getI18nKey(control.name) | dsfrI18n\"\n      [attr.aria-pressed]=\"isFormatActive(control.name) || null\"\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        [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        [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  EventEmitter,\n  forwardRef,\n  inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  Output,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\nimport {\n  DefaultValueAccessorComponent,\n  DsfrButtonModule,\n  DsfrFormSelectModule,\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 { ToolbarControl } from './components/toolbar/editor-toolbar.model';\nimport { DsfrEditorService } 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  standalone: true,\n  imports: [\n    FormsModule,\n    ReactiveFormsModule,\n    DsfrSkiplinksModule,\n    DsfrFormSelectModule,\n    DsfrButtonModule,\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 référencer un élément dénotant le champ d'édition au niveau de\n   * l'attribut aria-labelledby positionné au niveau de l'élément hôte de l'éditeur HTML.\n   */\n  @Input() ariaLabelledBy: string;\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. 🔥 `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  /**\n   * Gestion de l'identifiant du libellé accessible.\n   */\n  protected labelId: string;\n\n  private _sub: Subscription;\n\n  private readonly i18n = inject(DsfrI18nService);\n  private readonly editorService = inject(DsfrEditorService);\n\n  constructor() {\n    super();\n    this.labelId = 'label-' + this.editorId;\n    if (!this.ariaLabelledBy) {\n      this.ariaLabelledBy = this.labelId;\n    }\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\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","@if (label && label.length) {\n  <div [id]=\"labelId\" class=\"fr-label\" [class.fr-sr-only]=\"labelSrOnly\">{{ label }}</div>\n}\n\n<edu-editor-toolbar [toolbarOptions]=\"toolbarOptions\" [editorId]=\"editorId\"></edu-editor-toolbar>\n\n<edu-editor-content\n  [editorId]=\"editorId\"\n  [ariaLabelledBy]=\"ariaLabelledBy\"\n  [message]=\"message\"\n  [messageSeverity]=\"messageSeverity\"\n  [messagesGroupId]=\"messagesGroupId\"\n  [showEditorHtmlDebugPanel]=\"showEditorHtmlDebugPanel\"\n  [showSemanticHtmlDebugPanel]=\"showSemanticHtmlDebugPanel\"></edu-editor-content>\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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"}