{"version":3,"file":"edugouvfr-ngx-dsfr-ext.mjs","sources":["../../../projects/ngx-dsfr-ext/src/lib/shared/directives/click-outside.directive.ts","../../../projects/ngx-dsfr-ext/src/lib/shared/components/list-toolbar/list-toolbar.utils.ts","../../../projects/ngx-dsfr-ext/src/lib/shared/components/dropdown-container/dropdown.utils.ts","../../../projects/ngx-dsfr-ext/src/lib/shared/components/dropdown-container/dropdown-position.directive.ts","../../../projects/ngx-dsfr-ext/src/lib/shared/components/dropdown-container/dropdown-container.component.ts","../../../projects/ngx-dsfr-ext/src/lib/shared/components/dropdown-container/dropdown-container.component.html","../../../projects/ngx-dsfr-ext/src/lib/shared/directives/message-severity.directive.ts","../../../projects/ngx-dsfr-ext/src/lib/spinner/i18n/messages.en.ts","../../../projects/ngx-dsfr-ext/src/lib/spinner/i18n/messages.fr.ts","../../../projects/ngx-dsfr-ext/src/lib/spinner/spinner.component.ts","../../../projects/ngx-dsfr-ext/src/lib/spinner/spinner.component.html","../../../projects/ngx-dsfr-ext/src/lib/autocomplete/i18n/messages.en.ts","../../../projects/ngx-dsfr-ext/src/lib/autocomplete/i18n/messages.fr.ts","../../../projects/ngx-dsfr-ext/src/lib/autocomplete/autocomplete.component.ts","../../../projects/ngx-dsfr-ext/src/lib/autocomplete/autocomplete.component.html","../../../projects/ngx-dsfr-ext/src/lib/shared/utils/date/date-utils.ts","../../../projects/ngx-dsfr-ext/src/lib/shared/utils/range/range-utils.ts","../../../projects/ngx-dsfr-ext/src/lib/calendar/i18n/messages.en.ts","../../../projects/ngx-dsfr-ext/src/lib/calendar/i18n/messages.fr.ts","../../../projects/ngx-dsfr-ext/src/lib/calendar/calendar.component.ts","../../../projects/ngx-dsfr-ext/src/lib/calendar/calendar.component.html","../../../projects/ngx-dsfr-ext/src/lib/calendar/calendar-modal/calendar-modal.component.ts","../../../projects/ngx-dsfr-ext/src/lib/calendar/calendar-modal/calendar-modal.component.html","../../../projects/ngx-dsfr-ext/src/lib/shared/models/point.ts","../../../projects/ngx-dsfr-ext/src/lib/carousel/i18n/messages.en.ts","../../../projects/ngx-dsfr-ext/src/lib/carousel/i18n/messages.fr.ts","../../../projects/ngx-dsfr-ext/src/lib/carousel/carousel.component.ts","../../../projects/ngx-dsfr-ext/src/lib/carousel/carousel.component.html","../../../projects/ngx-dsfr-ext/src/lib/shared/models/selection-mode.type.ts","../../../projects/ngx-dsfr-ext/src/lib/shared/components/abstract-select/i18n/messages.en.ts","../../../projects/ngx-dsfr-ext/src/lib/shared/components/abstract-select/i18n/messages.fr.ts","../../../projects/ngx-dsfr-ext/src/lib/shared/components/abstract-select/abstract-select.component.ts","../../../projects/ngx-dsfr-ext/src/lib/datepicker/i18n/messages.en.ts","../../../projects/ngx-dsfr-ext/src/lib/datepicker/i18n/messages.fr.ts","../../../projects/ngx-dsfr-ext/src/lib/datepicker/mask/date-format.directive.ts","../../../projects/ngx-dsfr-ext/src/lib/datepicker/mask/date-mask.directive.ts","../../../projects/ngx-dsfr-ext/src/lib/datepicker/datepicker.component.ts","../../../projects/ngx-dsfr-ext/src/lib/datepicker/datepicker.component.html","../../../projects/ngx-dsfr-ext/src/lib/dropdownmenu/component/dropdownmenu-group.component.ts","../../../projects/ngx-dsfr-ext/src/lib/dropdownmenu/component/dropdownmenu-item.component.ts","../../../projects/ngx-dsfr-ext/src/lib/dropdownmenu/dropdownmenu.component.ts","../../../projects/ngx-dsfr-ext/src/lib/dropdownmenu/dropdownmenu.component.html","../../../projects/ngx-dsfr-ext/src/lib/multiselect/select-focus.utils.ts","../../../projects/ngx-dsfr-ext/src/lib/shared/components/list-options/list-options.component.ts","../../../projects/ngx-dsfr-ext/src/lib/shared/components/list-options/list-options.component.html","../../../projects/ngx-dsfr-ext/src/lib/shared/components/list-toolbar/list-toolbar.component.ts","../../../projects/ngx-dsfr-ext/src/lib/shared/components/list-toolbar/list-toolbar.component.html","../../../projects/ngx-dsfr-ext/src/lib/shared/components/select-input-label/select-input-label.component.ts","../../../projects/ngx-dsfr-ext/src/lib/shared/components/select-input-label/select-input-label.component.html","../../../projects/ngx-dsfr-ext/src/lib/shared/utils/option/option-utils.ts","../../../projects/ngx-dsfr-ext/src/lib/multiselect/multiselect.component.ts","../../../projects/ngx-dsfr-ext/src/lib/multiselect/multiselect.component.html","../../../projects/ngx-dsfr-ext/src/lib/panel/i18n/messages.en.ts","../../../projects/ngx-dsfr-ext/src/lib/panel/i18n/messages.fr.ts","../../../projects/ngx-dsfr-ext/src/lib/panel/panel.component.ts","../../../projects/ngx-dsfr-ext/src/lib/panel/panel.component.html","../../../projects/ngx-dsfr-ext/src/lib/picklist/i18n/messages.en.ts","../../../projects/ngx-dsfr-ext/src/lib/picklist/i18n/messages.fr.ts","../../../projects/ngx-dsfr-ext/src/lib/picklist/picklist.model.ts","../../../projects/ngx-dsfr-ext/src/lib/picklist/unit/picklist-unit.component.ts","../../../projects/ngx-dsfr-ext/src/lib/picklist/unit/picklist-unit.component.html","../../../projects/ngx-dsfr-ext/src/lib/picklist/picklist.component.ts","../../../projects/ngx-dsfr-ext/src/lib/picklist/picklist.component.html","../../../projects/ngx-dsfr-ext/src/lib/progressbar/i18n/messages.en.ts","../../../projects/ngx-dsfr-ext/src/lib/progressbar/i18n/messages.fr.ts","../../../projects/ngx-dsfr-ext/src/lib/progressbar/progressbar.component.ts","../../../projects/ngx-dsfr-ext/src/lib/progressbar/progressbar.component.html","../../../projects/ngx-dsfr-ext/src/lib/timeline/timeline.component.ts","../../../projects/ngx-dsfr-ext/src/lib/timeline/timeline.component.html","../../../projects/ngx-dsfr-ext/src/lib/toast/i18n/messages.en.ts","../../../projects/ngx-dsfr-ext/src/lib/toast/i18n/messages.fr.ts","../../../projects/ngx-dsfr-ext/src/lib/toast/item/toast-item.component.ts","../../../projects/ngx-dsfr-ext/src/lib/toast/item/toast-item.component.html","../../../projects/ngx-dsfr-ext/src/lib/toast/toast.model.ts","../../../projects/ngx-dsfr-ext/src/lib/toast/toast.service.ts","../../../projects/ngx-dsfr-ext/src/lib/toast/toast.component.ts","../../../projects/ngx-dsfr-ext/src/lib/toast/toast.component.html","../../../projects/ngx-dsfr-ext/src/lib/shared/utils/tree/tree.model.ts","../../../projects/ngx-dsfr-ext/src/lib/shared/utils/tree/tree-focus-manager.ts","../../../projects/ngx-dsfr-ext/src/lib/shared/utils/tree/tree-select-manager.ts","../../../projects/ngx-dsfr-ext/src/lib/tree/tree.component.ts","../../../projects/ngx-dsfr-ext/src/lib/tree/tree.component.html","../../../projects/ngx-dsfr-ext/src/lib/treeselect/treeselect.component.ts","../../../projects/ngx-dsfr-ext/src/lib/treeselect/treeselect.component.html","../../../projects/ngx-dsfr-ext/src/lib/treetable/component/expand-arrow-node.component.ts","../../../projects/ngx-dsfr-ext/src/lib/treetable/treetable.context.ts","../../../projects/ngx-dsfr-ext/src/lib/treetable/directive/row-node.directive.ts","../../../projects/ngx-dsfr-ext/src/lib/treetable/directive/row-node-select.directive.ts","../../../projects/ngx-dsfr-ext/src/lib/treetable/base-treetable.component.ts","../../../projects/ngx-dsfr-ext/src/lib/treetable/i18n/messages.en.ts","../../../projects/ngx-dsfr-ext/src/lib/treetable/i18n/messages.fr.ts","../../../projects/ngx-dsfr-ext/src/lib/treetable/treetable.component.ts","../../../projects/ngx-dsfr-ext/src/lib/treetable/treetable.component.html","../../../projects/ngx-dsfr-ext/src/lib/upload-dnd/directives/file-actions.directive.ts","../../../projects/ngx-dsfr-ext/src/lib/upload-dnd/directives/file-delete-button.directive.ts","../../../projects/ngx-dsfr-ext/src/lib/upload-dnd/file-size-unit.model.ts","../../../projects/ngx-dsfr-ext/src/lib/upload-dnd/file-details.pipe.ts","../../../projects/ngx-dsfr-ext/src/lib/upload-dnd/i18n/messages.en.ts","../../../projects/ngx-dsfr-ext/src/lib/upload-dnd/i18n/messages.fr.ts","../../../projects/ngx-dsfr-ext/src/lib/upload-dnd/upload-dnd.component.ts","../../../projects/ngx-dsfr-ext/src/lib/upload-dnd/upload-dnd.component.html","../../../projects/ngx-dsfr-ext/src/lib/profilemenu/component/toolslinks.component.ts","../../../projects/ngx-dsfr-ext/src/lib/profilemenu/component/toolslinks.component.html","../../../projects/ngx-dsfr-ext/src/public-api.ts","../../../projects/ngx-dsfr-ext/src/edugouvfr-ngx-dsfr-ext.ts"],"sourcesContent":["import {\n  Directive,\n  ElementRef,\n  EventEmitter,\n  NgZone,\n  OnDestroy,\n  OnInit,\n  Output,\n  Renderer2,\n  inject,\n} from '@angular/core';\n\n/**\n * Directive pour détecter un click en dehors du composant (ex. pour fermer une liste déroulante)\n * Nécessite l'ajout d'un attribut data-expanded sur le composant possedant clickOutside\n */\n@Directive({\n  selector: '[clickOutside]',\n  standalone: true,\n})\nexport class EduClickOutsideDirective implements OnInit, OnDestroy {\n  @Output() clickOutsideEvent = new EventEmitter<void>();\n\n  private _unlisten: { (): void }[] = [];\n  private readonly _elementRef = inject(ElementRef);\n  private readonly ngZone = inject(NgZone);\n  private readonly renderer2 = inject(Renderer2);\n\n  ngOnInit() {\n    this.ngZone.runOutsideAngular(() => {\n      this._unlisten.push(\n        this.renderer2.listen('window', 'mouseup', (e) => {\n          this.onDocumentClick(e);\n        }),\n        this.renderer2.listen('window', 'resize', (e) => {\n          this.onDocumentResize(e);\n        }),\n      );\n    });\n  }\n\n  ngOnDestroy() {\n    this._unlisten.forEach((unlistenFunc) => unlistenFunc());\n  }\n\n  /**\n   * En cas de redimensionnement ou de zoom de la fenetre\n   * Si on est en mode appendTo, on force la fermeture de la dropdown pour eviter son mauvais positionnement\n   *  @internal */\n  private onDocumentResize(e: Event): void {\n    if (\n      this._elementRef.nativeElement.hasAttribute('data-expanded') &&\n      !this._elementRef.nativeElement.querySelector('ul.dsfrx-treeselect__list') &&\n      !this._elementRef.nativeElement.querySelector('ul.dsfrx-select__list')\n    ) {\n      this.onNeedToCloseDropdown(e);\n    }\n  }\n\n  /**\n   * Emet l'evenement click outside en cas de clic en dehors du composant\n   *  @internal */\n  private onDocumentClick(e: MouseEvent): void {\n    const elem = e?.target as HTMLElement;\n    // positionnement d'un attribut data-expanded qui indique l'affiche de la liste sur le composant\n    if (\n      elem &&\n      this._elementRef.nativeElement.hasAttribute('data-expanded') &&\n      !this._elementRef.nativeElement.contains(elem) &&\n      !elem.closest('.dsfrx-dropdown')\n    ) {\n      this.onNeedToCloseDropdown(e);\n    }\n  }\n\n  /** Emet l'evenement clickOutsideEvent pour forcer la fermeture de la dropdown */\n  private onNeedToCloseDropdown(e: Event) {\n    this.ngZone.run(() => {\n      e.preventDefault();\n      this.clickOutsideEvent.emit();\n    });\n  }\n}\n","export class ListToolbarUtils {\n  private constructor() {}\n\n  /**\n   * cas TAB : L'élément est le dernier élément focusable de la toolbar :\n   * - l'élément est la croix pour vider la recherche\n   * - l'élément est la barre de recherche et la croix n'est pas présente\n   * - la barre de recherche n'est pas présente (un seul élément focusable : tout sélectionner)\n   */\n  static isLastFocusableOnToolBar(element: HTMLElement, toolBarWrapper: HTMLElement): boolean {\n    return (\n      element.className.includes('fr-icon-close-line') ||\n      (!toolBarWrapper.querySelector('.fr-icon-close-line') && element.className.includes('fr-input')) ||\n      !toolBarWrapper.querySelector('.fr-input')\n    );\n  }\n}\n","export class DropdownUtils {\n  private constructor() {}\n\n  /**\n   * Si appendTo est défini, trouver le container auquel le rattacher (element ou classe)\n   * Si le container parent ne correspond ni au body ni à une modale, le placer en position relative\n   *  */\n  static setParentContainer(appendTo: HTMLElement | string, comboBox: HTMLElement): HTMLElement | undefined {\n    let containerToAttach: HTMLElement | undefined = undefined;\n\n    if (appendTo === 'body') {\n      containerToAttach = document.querySelector('body')!;\n    } else {\n      if (typeof appendTo === 'string') {\n        const elem: HTMLElement | null = comboBox.closest(`.${appendTo}`);\n        containerToAttach = elem ?? undefined;\n      } else {\n        containerToAttach = appendTo;\n      }\n      if (!containerToAttach) {\n        console.warn('`appendTo` must be equal to `body`, an element ref or a class of an ancestor container');\n      }\n      if (containerToAttach && !DropdownUtils.isBodyOrFixedElement(containerToAttach)) {\n        // surcharge du style de l'élément parent avec position relative si appendTo !== body\n        containerToAttach.style.position = 'relative';\n      }\n    }\n\n    return containerToAttach;\n  }\n\n  /**\n   * Get viewport for overlay position\n   * From primeNG  */\n  static getViewport(): { width: number; height: number } {\n    const win = window,\n      d = document,\n      e = d.documentElement,\n      g = d.getElementsByTagName('body')[0],\n      w = win.innerWidth || e.clientWidth || g.clientWidth,\n      h = win.innerHeight || e.clientHeight || g.clientHeight;\n\n    return { width: w, height: h };\n  }\n\n  /**\n   * Get scroll from top for overlay position\n   * From primeNG */\n  static getWindowScrollTop(): number {\n    const doc = document.documentElement;\n\n    return (window.scrollY || doc.scrollTop) - (doc.clientTop || 0);\n  }\n\n  static isBodyOrFixedElement(container: HTMLElement): boolean {\n    return container.tagName === 'BODY' || container.tagName === 'DIALOG' || container.style.position === 'fixed';\n  }\n}\n","import {\n  afterNextRender,\n  Directive,\n  ElementRef,\n  EventEmitter,\n  inject,\n  Input,\n  input,\n  InputSignal,\n  OnDestroy,\n  Output,\n  Renderer2,\n} from '@angular/core';\nimport { DropdownUtils } from './dropdown.utils';\n\n@Directive({\n  selector: '[dsfrxDropdown]',\n  standalone: true,\n})\nexport class DsfrDropdownPositionDirective implements OnDestroy {\n  @Input() autoWidth: boolean = false;\n\n  /** Element auquel le dropdown est programmatiquement attaché en cas de appendTo ('body' ou  container relatif) */\n  @Input() parentContainer: HTMLElement | undefined;\n  /** Emission après attachement de la dropdown au parentContainer en appendTo */\n  @Output() appendDropdown: EventEmitter<void> = new EventEmitter();\n\n  comboBox: InputSignal<HTMLElement> = input.required();\n\n  private readonly dropdownRef = inject(ElementRef<HTMLElement>);\n  private readonly _renderer = inject(Renderer2);\n  private readonly _unlistenFn!: Function;\n\n  /**\n   * Ajoute l'élément dropdown et le repositionne\n   * /!\\ ne pas utiliser un effect() : le cycle de rendu est différent entre angular 17 et angular 19,\n   * le composant ne sera pas encore ajouté dans le DOM en angular 19.\n   */\n  constructor() {\n    afterNextRender(() => {\n      if (this.dropdownRef) {\n        if (this.parentContainer) {\n          this.appendElement(this.dropdownRef.nativeElement);\n        }\n\n        this.setPosition(this.dropdownRef.nativeElement);\n        this.appendDropdown.emit();\n      }\n    });\n  }\n\n  /** A la destruction du composant, supprimer l'élément listbox si il a été ajouté au parent ou body (appendTo) */\n  public ngOnDestroy(): void {\n    if (this.parentContainer && this.dropdownRef) {\n      this.destroyOverlayDropdown();\n    }\n  }\n\n  private setPosition(dropdownElement: HTMLElement) {\n    const viewport: { width: number; height: number } = DropdownUtils.getViewport();\n    let comboBox: HTMLElement = this.comboBox(); //box container to attach to\n\n    if (dropdownElement) {\n      const top: string = this.calcPositionY(dropdownElement, comboBox, viewport.height);\n      this._renderer.setStyle(dropdownElement, 'top', top);\n\n      // Ajuster la hauteur (marginTop) en cas d'éléments messages présents à l'interieur de la comboBox\n      const marginTopOffset = this.adjustMarginTop(comboBox);\n\n      this._renderer.setStyle(dropdownElement, 'margin-top', `${marginTopOffset}rem`);\n\n      // Calculer le positionnement en valeur absolue\n      if (this.autoWidth || this.parentContainer) {\n        const left: string = this.calcPositionX(dropdownElement, comboBox, viewport.width);\n        this._renderer.setStyle(dropdownElement, 'left', left);\n\n        if (this.parentContainer && marginTopOffset) {\n          this._renderer.setStyle(dropdownElement, 'margin-top', `${marginTopOffset}rem`);\n        }\n      }\n    }\n  }\n\n  /**\n   * Calcul de la position verticale de la dropdown\n   * - selon la place disponible (en dessous / au dessus)\n   * - en valeur absolue selon le container parent (si appendTo)\n   * @param dropdown dropdown a positionner\n   * @param comboBox container auquel rattacher la dropdown visuellement\n   * @param viewportHeight\n   * @returns nouvelle position en string (px/auto)\n   */\n  private calcPositionY(dropdown: HTMLElement, comboBox: HTMLElement, viewportHeight: number): string {\n    let top: string = 'auto';\n\n    const dropdownHeight = dropdown.offsetHeight; // hauteur de mon dropdownElement // ELEMENTOUTERHEIGHT\n    const comboBoxOffset = comboBox.getBoundingClientRect(); // position de ma box container (ex. select)\n    const windowScrollTop = DropdownUtils.getWindowScrollTop();\n\n    // si position de ma box container + hauteur de ma box container + hauteur de mon dropdownElement inférieur a hauteur disponible\n    const canDisplayBelow: boolean = comboBoxOffset.top + comboBox.offsetHeight + dropdownHeight < viewportHeight;\n    let calcPos: number = 0;\n\n    if (this.parentContainer) {\n      // calcul de la position si appendTo en fonction du container passé en parametre\n      calcPos = this.computeTopPositionRelative(comboBox, this.parentContainer);\n      top = `${calcPos}px`;\n    }\n\n    if (!canDisplayBelow) {\n      // si il n'y a pas assez de place pour afficher au-dessus, on laisse en dessous par défaut\n      const candisplayAbove = comboBoxOffset.top + windowScrollTop - dropdownHeight > 0;\n\n      // TODO FIX BETTER -- fix pour la hauteur de l'input qui n'est pas la bonne a cause de l'ensemble combobox\n      let diff = 0;\n      let input = comboBox.querySelector('.fr-input');\n      if (input) {\n        diff = comboBox.offsetHeight - input.getBoundingClientRect().height;\n      }\n      // ----------------------\n\n      if (candisplayAbove) {\n        // calcul de la position en fonction de appendTo (container to attach)\n        calcPos = this.parentContainer\n          ? calcPos + diff - dropdownHeight - comboBox.offsetHeight\n          : -dropdownHeight + diff;\n        top = `${calcPos}px`; // afficher au dessus du combobox\n      }\n    }\n\n    return top;\n  }\n\n  /**\n   * Calcul de la position horizontale de la dropdown\n   * - selon la place disponible (décalage à gauche éventuel)\n   * - en valeur absolue selon le container parent (si appendTo)\n   * @param dropdown dropdown a positionner\n   * @param comboBox container auquel rattacher la dropdown visuellement\n   * @param viewportWidth\n   * @returns nouvelle position en string (px/auto)\n   */\n  private calcPositionX(dropdown: HTMLElement, comboBox: HTMLElement, viewportWidth: number): string {\n    const elementOuterWidth = dropdown.offsetWidth;\n    const comboBoxOffset = comboBox.getBoundingClientRect(); // position de ma box container (ex. select)\n\n    if (this.autoWidth) {\n      if (comboBoxOffset.left + elementOuterWidth > viewportWidth) {\n        return this.parentContainer\n          ? Math.max(0, comboBoxOffset.left + comboBox.offsetWidth - elementOuterWidth) + 'px'\n          : comboBox.offsetWidth - elementOuterWidth + 'px';\n      }\n    }\n\n    if (this.parentContainer && DropdownUtils.isBodyOrFixedElement(this.parentContainer)) {\n      // decalage a droite en cas de body\n      return comboBox.getBoundingClientRect().left + 'px';\n    } else if (this.parentContainer && comboBox.offsetLeft > 0) {\n      return comboBox.offsetLeft + 'px';\n    }\n\n    return 'auto';\n  }\n\n  /**\n   * Compute top position relative to parent element (top position, margin/padding, scroll inside parent)\n   * @param element element to move relatively\n   * @param parentElement parent container\n   * @returns new top position\n   */\n  private computeTopPositionRelative(element: HTMLElement, parentElement: HTMLElement): number {\n    if (DropdownUtils.isBodyOrFixedElement(parentElement)) {\n      return (\n        element.getBoundingClientRect().top +\n        element.offsetHeight +\n        (parentElement.tagName === 'BODY' ? window.scrollY : 0)\n      );\n    }\n\n    return (\n      element.getBoundingClientRect().top +\n      element.offsetHeight +\n      parentElement.scrollTop -\n      parentElement.getBoundingClientRect().top\n    );\n  }\n\n  /**\n   * Ajouter l'element dropdown directement au body ou container spécifié dans le cas de appendTo\n   * Permet d'afficher la dropdown \"en dehors\" d'un container visuel type modale ou accordéon (pas de scroll)\n   * @param element dropdown\n   */\n  private appendElement(element: HTMLElement): void {\n    const box = this.comboBox() as HTMLElement;\n\n    if (!this.autoWidth) {\n      this._renderer.setStyle(element, 'width', `${box.offsetWidth}px`);\n    }\n    this._renderer.setStyle(element, 'top', `0px`); // obligatoire pour positionner correctement l'element ensuite\n\n    // Attach element to new parent\n    this._renderer.appendChild(this.parentContainer, element);\n  }\n\n  /** Suppression de la liste rattachée au container appendTo */\n  private destroyOverlayDropdown(): void {\n    if (this.dropdownRef.nativeElement?.parentElement === this.parentContainer) {\n      this._renderer.removeChild(this.parentContainer, this.dropdownRef.nativeElement);\n    }\n\n    if (this._unlistenFn) this._unlistenFn();\n  }\n\n  /**\n   * Réajuster la marge supérieure de la dropdown en cas de fieldset ou de messages groupe\n   */\n  private adjustMarginTop(comboBox: HTMLElement): number {\n    const hasInputGroupWithMessage = !!comboBox.querySelector('.fr-input-group .fr-message');\n    const hasFieldsetWithMessage = !!comboBox.querySelector('.fr-fieldset .fr-message');\n\n    if (!hasInputGroupWithMessage && !hasFieldsetWithMessage) return 0;\n\n    const messageElemList = comboBox.querySelectorAll('.fr-messages-group');\n    const messageElem = messageElemList[messageElemList.length - 1]; // on prend le dernier pour supporter le cas du fieldset\n    const heightMessagePx = messageElem ? messageElem.getBoundingClientRect().height : 0;\n    let heightMessageRem = this.pxToRem(heightMessagePx);\n\n    if (hasInputGroupWithMessage) {\n      // si on se trouve dans le cas d'un input-group on doit ajouter la valeur de la marge haute soit 1rem\n      heightMessageRem = 1 + heightMessageRem;\n    }\n\n    // et on bascule en négatif\n    return heightMessageRem * -1;\n  }\n\n  private pxToRem(pixelNumber: number, base: number = 16): number {\n    return (1 / base) * pixelNumber;\n  }\n}\n","import { ScrollingModule } from '@angular/cdk/scrolling';\nimport { CommonModule } from '@angular/common';\nimport {\n  afterNextRender,\n  booleanAttribute,\n  Component,\n  ContentChild,\n  ElementRef,\n  EventEmitter,\n  inject,\n  Input,\n  Output,\n  Renderer2,\n  ViewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { EduClickOutsideDirective } from '../../directives';\nimport { ListOptionsComponent } from '../list-options';\nimport { ListToolbarUtils } from '../list-toolbar/list-toolbar.utils';\nimport { DsfrDropdownPositionDirective } from './dropdown-position.directive';\nimport { DropdownUtils } from './dropdown.utils';\n\n@Component({\n  selector: 'edu-dropdown-container',\n  templateUrl: './dropdown-container.component.html',\n  encapsulation: ViewEncapsulation.None,\n  styleUrls: ['./dropdown-container.component.scss'],\n  imports: [\n    CommonModule,\n    FormsModule,\n    ReactiveFormsModule,\n    ScrollingModule,\n    EduClickOutsideDirective,\n    DsfrDropdownPositionDirective,\n  ],\n})\nexport class DropdownContainerComponent {\n  @ViewChild('combobox') comboBox?: ElementRef;\n  @ViewChild('toolbarWrapper') toolbarWrapper?: ElementRef;\n\n  @ContentChild('listbox') listbox?: ElementRef;\n  @ContentChild('listOptionsComponent') listOptionsComponent?: ListOptionsComponent;\n\n  /** Activer le virtual scroll  */\n  @Input({ transform: booleanAttribute }) virtualScroll: boolean = false;\n\n  /** Surcharger la hauteur d'un item dans le cas du virtual scroll. Par défaut 24px. */\n  @Input() virtualScrollItemHeight: number = 24;\n\n  /** Attacher l'élément de liste déroulante au 'body' ou a un container (réf. vers un élément #div ou nom de la classe du parent) */\n  @Input() appendTo?: 'body' | HTMLElement | string;\n\n  @Input({ transform: booleanAttribute }) hasOptions: boolean = false;\n\n  /** Propriété CSS z-index de la liste, par défaut supérieur aux composants 'lifted' DSFR */\n  @Input() zIndex?: number;\n\n  /** Hauteur maximale avant le scroll sur la liste déroulante. */\n  @Input() scrollHeight: string = '224px';\n\n  @Input() classToWrap?: string;\n\n  @Input({ transform: booleanAttribute }) hasToolBar: boolean = false;\n\n  @Input() indexFirstSelected: number | null = null;\n\n  /** Set focus on list on opening */\n  @Input({ transform: booleanAttribute }) autofocus: boolean = false;\n\n  /** La dropdown prend la taille des éléments qu'il contient (par défaut : taille du select) */\n  @Input({ transform: booleanAttribute }) autoWidthDropdown: boolean = false;\n\n  /**\n   * Élément optionnel, si positionné il remplacera comboBox.nativeElement pour le calcul de positionnement.\n   */\n  @Input() customControlElement?: HTMLElement;\n\n  @Output() hideList: EventEmitter<void> = new EventEmitter();\n  @Output() focusOnList: EventEmitter<HTMLElement> = new EventEmitter();\n  @Output() dropdownAttached: EventEmitter<void> = new EventEmitter(); // la box est append et positionnée\n\n  /** Element auquel la liste est attachée programmatiquement si appendTo défini */\n  protected containerToAttach: HTMLElement | undefined;\n\n  private _toolBarFirstElement: HTMLElement | undefined; // first focusable element on toolbar\n  private _displayDropdown: boolean = false;\n\n  private readonly _renderer = inject(Renderer2);\n\n  constructor() {\n    // Recherche du container parent apres initialisation complete du DOM (= afterViewInit non suffisant)\n    afterNextRender(() => {\n      if (!this.listbox && this.listOptionsComponent?.listbox) {\n        this.listbox = this.listOptionsComponent.listbox;\n      }\n\n      if (this.appendTo && this.controlElement) {\n        this.containerToAttach = DropdownUtils.setParentContainer(this.appendTo, this.controlElement);\n      }\n    });\n  }\n\n  get displayDropdown() {\n    return this._displayDropdown;\n  }\n\n  /* Element auquel attacher visuellement le container de la dropdown (ex. la combobox contenant le fr-select) */\n  get controlElement(): HTMLElement {\n    return this.customControlElement ? this.customControlElement : this.comboBox?.nativeElement;\n  }\n\n  @Input()\n  set displayDropdown(value: boolean) {\n    this._displayDropdown = value;\n    if (!this.displayDropdown && this.comboBox && this.autofocus) {\n      this.comboBox.nativeElement?.querySelector('.fr-select')?.focus();\n    }\n  }\n\n  /**\n   * Fermer la liste déroulante en cas de clic en dehors du composant et detruire le composant si il a été ajouté en appendTo\n   *  @internal */\n  public onClickOutside(): void {\n    this.hideList.emit();\n  }\n\n  /** La dropdown est visible et positionnée */\n  public onDropdownAttached(): void {\n    this.dropdownAttached.emit();\n    this.setFocus();\n  }\n\n  /**\n   * Positionne le focus sur la toolbar si elle existe ou un élément de la liste à l'ouverture de la dropdown\n   * @internal */\n  public setFocus() {\n    if (!this.autofocus) return;\n\n    if (this.hasToolBar && !this._toolBarFirstElement && this.toolbarWrapper) {\n      const elem = this.toolbarWrapper.nativeElement.querySelector('.fr-btn--select-all');\n      this._toolBarFirstElement = elem ? elem : this.toolbarWrapper.nativeElement.querySelector('.fr-input');\n    }\n\n    if (this.listbox && !this.hasToolBar) {\n      this.focusOnListElement();\n    } else if (this._toolBarFirstElement) {\n      this._toolBarFirstElement.focus();\n    }\n  }\n\n  /**\n   * Gestion des événements clavier sur la toolbar\n   * - \"flèche bas\" : le focus est positionné sur la liste.\n   * - \"TAB\" : si dernier élément focusable de la toolbar, fermer la dropdown et aller sur l'element suivant\n   * - \"SHIFT TAB\": si premier élément focusable de la toolbar, fermer la dropdown  et aller sur l'element suivant\n   * - \"ECHAP\" : fermer la dropdown et conserver le focus sur le select\n   */\n  protected onKeyDownToolbar(event: KeyboardEvent): void {\n    switch (event.key) {\n      case 'ArrowDown':\n        if (this.listbox) {\n          event.preventDefault();\n          this.focusOnListElement();\n        }\n        break;\n\n      case 'Tab':\n        if (\n          (event.shiftKey && event.target == this._toolBarFirstElement) ||\n          (!event.shiftKey &&\n            ListToolbarUtils.isLastFocusableOnToolBar(event.target as HTMLElement, this.toolbarWrapper?.nativeElement))\n        ) {\n          this.hideList.emit();\n        }\n        break;\n\n      case 'Escape':\n        event.preventDefault();\n        (this.controlElement.querySelector('.fr-select') as HTMLElement)?.focus();\n        this.hideList.emit();\n        break;\n    }\n  }\n\n  /**\n   * Positionne le focus sur un élément de la liste lors de l'ouverture ou après \"flèche bas\" depuis le champ de recherche.\n   * - Si un élément est déjà sélectionné, le focus est positionné sur celui-ci.\n   * - Sinon, le focus est placé sur le premier élément de la liste.\n   */\n  private focusOnListElement() {\n    if (!this.listbox) return;\n\n    // en virtualScroll le premier container est cdk-virtualscroll\n    const listboxNode = this.virtualScroll\n      ? this.listbox.nativeElement?.querySelector('ul')\n      : this.listbox.nativeElement;\n\n    let elementToFocus: HTMLElement = listboxNode?.firstElementChild;\n\n    if (this.indexFirstSelected && this.indexFirstSelected !== -1) {\n      elementToFocus = listboxNode?.children[this.indexFirstSelected] ?? listboxNode?.firstElementChild;\n    }\n\n    if (elementToFocus) {\n      this.setAriaActiveDescendant(listboxNode, elementToFocus.getAttribute('id'));\n      elementToFocus.focus();\n      this.focusOnList.emit(elementToFocus);\n    }\n  }\n\n  /**\n   * Attribut aria-activedescendant sur l'input égal à l'option qui a le focus\n   * @internal */\n  private setAriaActiveDescendant(listboxNode: HTMLElement, optionId: string | null) {\n    if (optionId && listboxNode.getAttribute('role')) {\n      this._renderer.setAttribute(listboxNode, 'aria-activedescendant', optionId);\n    }\n  }\n}\n","<div\n  #combobox\n  [attr.data-expanded]=\"displayDropdown ? displayDropdown : null\"\n  clickOutside\n  class=\"{{ classToWrap }}\"\n  (clickOutsideEvent)=\"onClickOutside()\">\n  <ng-content select=\"control\"></ng-content>\n\n  @if (displayDropdown) {\n    <div\n      #dropdown\n      dsfrxDropdown\n      (appendDropdown)=\"onDropdownAttached()\"\n      [comboBox]=\"controlElement\"\n      [parentContainer]=\"containerToAttach\"\n      [autoWidth]=\"autoWidthDropdown\"\n      [ngClass]=\"{ 'dsfrx-dropdown--auto-width': autoWidthDropdown }\"\n      class=\"dsfrx-dropdown\"\n      [ngStyle]=\"{ 'z-index': zIndex }\">\n      @if (hasToolBar) {\n        <div #toolbarWrapper (keydown)=\"onKeyDownToolbar($event)\" class=\"{{ classToWrap }}__toolbar\">\n          <ng-content select=\"[toolbar]\"></ng-content>\n        </div>\n      }\n      <ng-content select=\"empty\"> </ng-content>\n      <ng-content></ng-content>\n    </div>\n  }\n</div>\n","import { Directive, HostBinding, Input } from '@angular/core';\nimport { DsfrSeverity, DsfrSeverityConst } from '@edugouvfr/ngx-dsfr';\n\n/**\n */\n@Directive({ selector: '[eduMessageSeverity]', standalone: true })\nexport class EduMessageSeverityDirective {\n  private _severity: DsfrSeverity | null = null;\n\n  @HostBinding('class')\n  get className(): string {\n    switch (this._severity) {\n      case DsfrSeverityConst.ERROR:\n        return 'fr-message fr-message--error';\n      case DsfrSeverityConst.SUCCESS:\n      case DsfrSeverityConst.VALID:\n        return 'fr-message fr-message--valid';\n      case DsfrSeverityConst.INFO:\n        return 'fr-message fr-message--info';\n      case DsfrSeverityConst.WARNING:\n        return 'fr-message fr-message--warning';\n      default:\n        return 'fr-message ';\n    }\n  }\n\n  @Input('eduMessageSeverity')\n  set severity(value: DsfrSeverity | undefined) {\n    if (value) this._severity = value;\n  }\n}\n","// Ordre alphabétique requis\nexport const MESSAGES_EN = {\n  spinner: {\n    messageContext: 'Loading',\n  },\n};\n","// Ordre alphabétique requis\nexport const MESSAGES_FR = {\n  spinner: {\n    messageContext: 'Chargement en cours',\n  },\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, Input, ViewEncapsulation } from '@angular/core';\nimport { DsfrI18nPipe, DsfrI18nService, DsfrSize, DsfrSizeConst, Language } from '@edugouvfr/ngx-dsfr';\nimport { MESSAGES_EN } from './i18n/messages.en';\nimport { MESSAGES_FR } from './i18n/messages.fr';\n\n@Component({\n  selector: 'dsfr-ext-spinner, dsfrx-spinner',\n  templateUrl: './spinner.component.html',\n  styleUrls: ['./spinner.scss'],\n  encapsulation: ViewEncapsulation.None,\n  imports: [CommonModule, DsfrI18nPipe],\n})\nexport class DsfrSpinnerComponent {\n  /**\n   * Type de loader.\n   */\n  @Input() typeLoader: 'sun' | 'quarter' | 'line' = 'sun';\n\n  /**\n   * Message permettant de donner plus de contexte aux usagers visualisant le spinner de temporisation.\n   */\n  @Input() label?: string;\n\n  /**\n   * Permet de masquer visuellement le libellé fourni par la propriété `label`.\n   *\n   * ⚠️ Changement depuis 1.6.0, cette propriété ne sert plus à fournir le libellé accessible : les types `string` et\n   * `undefined` sont dépréciés au profit d'un type `boolean` permettant de masquer le libellé (par défaut à `true`).\n   */\n  @Input() labelSrOnly?: string | boolean = true;\n\n  /**\n   * Ajoute un overlay fullscreen.\n   */\n  @Input() overlay = false;\n\n  /**\n   * Permet le changement de taille du spinner.\n   */\n  @Input() spinnerSize: DsfrSize = `SM`;\n\n  private i18n = inject(DsfrI18nService);\n\n  constructor() {\n    this.i18n.extendsLabelsBundle(Language.EN, MESSAGES_EN);\n    this.i18n.extendsLabelsBundle(Language.FR, MESSAGES_FR);\n  }\n\n  protected getSpinnerClasses(): {} {\n    return {\n      'dsfrx-spinner': true,\n      'dsfrx-spinner--sun': this.typeLoader === 'sun',\n      'dsfrx-spinner--quarter': this.typeLoader === 'quarter',\n      'dsfrx-spinner--line': this.typeLoader === 'line',\n      'dsfrx-spinner--sm': this.spinnerSize === DsfrSizeConst.SM,\n      'dsfrx-spinner--md': this.spinnerSize === DsfrSizeConst.MD,\n      'dsfrx-spinner--lg': this.spinnerSize === DsfrSizeConst.LG,\n    };\n  }\n\n  protected isNonEmptyString(value: unknown): value is string {\n    return typeof value === 'string' && value.length > 0;\n  }\n}\n","@if (overlay) {\n  <div class=\"dsfrx-overlay\" aria-busy=\"true\">\n    <div class=\"content\">\n      <ng-container *ngTemplateOutlet=\"spinner\"></ng-container>\n    </div>\n  </div>\n} @else {\n  <ng-container *ngTemplateOutlet=\"spinner\"></ng-container>\n}\n\n<ng-template #spinner>\n  <div [ngClass]=\"getSpinnerClasses()\">\n    @switch (typeLoader) {\n      @default {\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n          <path\n            d=\"M11.9995 2C12.5518 2 12.9995 2.44772 12.9995 3V6C12.9995 6.55228 12.5518 7 11.9995 7C11.4472 7 10.9995 6.55228 10.9995 6V3C10.9995 2.44772 11.4472 2 11.9995 2ZM11.9995 17C12.5518 17 12.9995 17.4477 12.9995 18V21C12.9995 21.5523 12.5518 22 11.9995 22C11.4472 22 10.9995 21.5523 10.9995 21V18C10.9995 17.4477 11.4472 17 11.9995 17ZM20.6597 7C20.9359 7.47829 20.772 8.08988 20.2937 8.36602L17.6956 9.86602C17.2173 10.1422 16.6057 9.97829 16.3296 9.5C16.0535 9.02171 16.2173 8.41012 16.6956 8.13398L19.2937 6.63397C19.772 6.35783 20.3836 6.52171 20.6597 7ZM7.66935 14.5C7.94549 14.9783 7.78161 15.5899 7.30332 15.866L4.70525 17.366C4.22695 17.6422 3.61536 17.4783 3.33922 17C3.06308 16.5217 3.22695 15.9101 3.70525 15.634L6.30332 14.134C6.78161 13.8578 7.3932 14.0217 7.66935 14.5ZM20.6597 17C20.3836 17.4783 19.772 17.6422 19.2937 17.366L16.6956 15.866C16.2173 15.5899 16.0535 14.9783 16.3296 14.5C16.6057 14.0217 17.2173 13.8578 17.6956 14.134L20.2937 15.634C20.772 15.9101 20.9359 16.5217 20.6597 17ZM7.66935 9.5C7.3932 9.97829 6.78161 10.1422 6.30332 9.86602L3.70525 8.36602C3.22695 8.08988 3.06308 7.47829 3.33922 7C3.61536 6.52171 4.22695 6.35783 4.70525 6.63397L7.30332 8.13398C7.78161 8.41012 7.94549 9.02171 7.66935 9.5Z\" />\n        </svg>\n      }\n      @case ('quarter') {\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n          <path d=\"M12 3C16.9706 3 21 7.02944 21 12H19C19 8.13401 15.866 5 12 5V3Z\"></path>\n        </svg>\n      }\n      @case ('line') {\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n          <path\n            d=\"M18.364 5.63604L16.9497 7.05025C15.683 5.7835 13.933 5 12 5C8.13401 5 5 8.13401 5 12C5 15.866 8.13401 19 12 19C15.866 19 19 15.866 19 12H21C21 16.9706 16.9706 21 12 21C7.02944 21 3 16.9706 3 12C3 7.02944 7.02944 3 12 3C14.4853 3 16.7353 4.00736 18.364 5.63604Z\"></path>\n        </svg>\n      }\n    }\n  </div>\n  @if (label) {\n    <span [ngClass]=\"{ 'fr-sr-only': labelSrOnly === true }\">{{ label }}</span>\n  } @else {\n    <span class=\"fr-sr-only\">{{\n      isNonEmptyString(labelSrOnly) ? labelSrOnly : ('spinner.messageContext' | dsfrI18n)\n    }}</span>\n  }\n</ng-template>\n","export const MESSAGES_EN = {\n  autocomplete: {\n    loading: 'Loading',\n    deleteTag: 'Unselect option',\n    availableResults: 'options available',\n    noResults: 'No option available',\n    noSelect: 'No option selected',\n    alreadyExist: 'This value already exists in the list of selected values.',\n    maxSelection: 'The maximum number of selectable values has been reached.',\n  },\n};\n","// Ordre alphabétique requis\nexport const MESSAGES_FR = {\n  autocomplete: {\n    loading: 'Chargement',\n    deleteTag: \"Déselectionner l'option\",\n    availableResults: 'suggestions disponibles',\n    noResults: 'Aucune suggestion disponible',\n    noSelect: 'Aucune suggestion sélectionnée',\n    alreadyExist: 'Cette valeur existe déjà dans la liste des valeurs sélectionnées.',\n    maxSelection: 'Le nombre maximum de valeurs sélectionnables est atteint.',\n  },\n};\n","import { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { CommonModule } from '@angular/common';\nimport {\n  AfterViewInit,\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  computed,\n  ContentChild,\n  effect,\n  ElementRef,\n  EventEmitter,\n  forwardRef,\n  inject,\n  input,\n  Input,\n  numberAttribute,\n  OnDestroy,\n  OnInit,\n  Output,\n  Renderer2,\n  signal,\n  TemplateRef,\n  ViewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport {\n  DefaultControlComponent,\n  DsfrButtonModule,\n  DsfrButtonType,\n  DsfrButtonVariant,\n  DsfrFormInputModule,\n  DsfrI18nPipe,\n  DsfrI18nService,\n  DsfrTagModule,\n  Language,\n  newUniqueId,\n} from '@edugouvfr/ngx-dsfr';\nimport { debounceTime, distinctUntilChanged, Subject, takeUntil } from 'rxjs';\nimport { DropdownContainerComponent } from '../shared/components/dropdown-container/dropdown-container.component';\nimport { EduMessageSeverityDirective } from '../shared/directives/message-severity.directive';\nimport { DsfrSpinnerComponent } from '../spinner';\nimport { DsfrCompleteEvent, DsfrSuggestionContext } from './autocomplete.model';\nimport { MESSAGES_EN } from './i18n/messages.en';\nimport { MESSAGES_FR } from './i18n/messages.fr';\n\n@Component({\n  selector: 'dsfr-ext-autocomplete, dsfrx-autocomplete',\n  encapsulation: ViewEncapsulation.None,\n  templateUrl: './autocomplete.component.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    CommonModule,\n    FormsModule,\n    ScrollingModule,\n    DsfrFormInputModule,\n    DsfrButtonModule,\n    DropdownContainerComponent,\n    DsfrSpinnerComponent,\n    DsfrI18nPipe,\n    DsfrTagModule,\n    EduMessageSeverityDirective,\n  ],\n  providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DsfrAutocompleteComponent), multi: true }],\n  styleUrls: ['./autocomplete.component.scss'],\n})\n\n/**\n * Plus d'héritage de DsfrFormInputComponent afin de pouvoir utiliser le type de value (générique)\n * fixme : éviter la copie des différents inputs de DsfrFormInputComponent\n */\nexport class DsfrAutocompleteComponent\n  extends DefaultControlComponent<any>\n  implements OnInit, AfterViewInit, OnDestroy\n{\n  /** Template des suggestions, option en paramètre  */\n  @ContentChild('suggestionTemplate', { static: true }) suggestionTemplate?: TemplateRef<DsfrSuggestionContext>;\n\n  /** @internal viewport pour le virtualScroll */\n  @ViewChild(CdkVirtualScrollViewport) viewport?: CdkVirtualScrollViewport;\n\n  /** @internal le composant de saisie (<input>) */\n  @ViewChild('inputComponent', { read: ElementRef }) inputComponent?: ElementRef;\n\n  // Attributs c/c pour le dsfr-form-input -----------------------------------------------------------------------------\n\n  /** (form-input) type de l'input, 'text' ou 'search'. 'text' par défaut */\n  @Input() type: 'text' | 'search' = 'text';\n  /** (form-input) champ obligatoire ou non, faux par défaut. */\n  @Input() required = false;\n  /** (form-input) placeholder de l'input. */\n  @Input() placeholder?: string;\n  /***  (form-input) Attribut maxLength de l'input. */\n  @Input({ transform: numberAttribute }) maxLength?: number;\n  /** (form-input) ajoute un icone à droite dans le champ de saisie. */\n  @Input() icon?: string;\n  /** (form-input) pattern de l'input.*/\n  @Input() pattern?: string;\n  /** (form-input) ajout d'un style spécifique, permet par exemple de la limiter la largeur d'un input. */\n  @Input() customClass?: string;\n\n  /** Emission de l'événement si le type du bouton est différent de `submit`.  */\n  @Output() buttonSelect = new EventEmitter<Event>();\n\n  // Attributs pour le combo du dsfr-form-input\n\n  /*** (form-input) permet de désactiver le bouton d'action. 'false' par défaut. */\n  @Input() buttonDisabled = false;\n  /*** (form-input) crée un combo champ + bouton si buttonIcon est renseigné */\n  @Input() buttonIcon?: string;\n  /** (form-input) crée un combo champ + bouton si buttonLabel est renseigné */\n  @Input() buttonLabel?: string;\n  /*** (form-input) tooltip message sur le bouton s'il y a lieu. */\n  @Input() buttonTooltipMessage?: string;\n  /*** (form-input) type du button,'button' par défaut. */\n  @Input() buttonType: DsfrButtonType = 'button';\n  /** (form-input) style du bouton, 'primary' par défaut. */\n  @Input() buttonVariant: DsfrButtonVariant = 'primary';\n  /** (form-input) [accessibilité] Spécifie le libellé qui sera retranscrit par les narrateurs d'écran. */\n  @Input() buttonAriaLabel?: string;\n  /** (form-input) Change la mise en page d'un input accompagné d'un bouton.  */\n  @Input() inputWrapMode: 'addon' | 'action' = 'addon';\n  /**\n   * [accessibilité] Permet de masquer visuellement le libellé du bouton en le laissant accessible aux dispositifs d'assistance.\n   *\n   * A utiliser pour le bouton si  icône seule.\n   */\n  @Input({ transform: booleanAttribute }) buttonLabelSrOnly: boolean = false; // TODO\n\n  // -------------------------------------------------------------------------------------------------------------------\n\n  /** L'utilisateur doit traiter cet événement pour déclencher une méthode de recherche qui met à jour la propriété suggestions. */\n  @Output() filterChange = new EventEmitter<DsfrCompleteEvent>();\n\n  /** Emet la suggestion à la sélection de celle-ci */\n  @Output() suggestionSelect = new EventEmitter<any>();\n\n  /** Fermeture de la liste de suggestions */\n  @Output() listClose = new EventEmitter<void>();\n\n  /** Mode multiple : à la suppression d'une suggestion (tag) */\n  @Output() clearOptionSelect: EventEmitter<{ nativeEvent: Event; option: any }> = new EventEmitter();\n\n  /** Attacher l'élément de liste déroulante au 'body' ou a un container (réf. vers un élément #div ou nom de la classe du parent) */\n  appendTo = input<'body' | HTMLElement | string>();\n\n  /** Propriété CSS z-index de la liste, par défaut supérieur aux composants 'lifted' DSFR */\n  zIndex = input<number>();\n\n  /** Activer le filtre automatique sur l'autocomplete. Faux par défaut */\n  autoFilter = input(false); // FIXME v2 : valeur true par défaut\n\n  /** Supprime la valeur de l'input si elle ne provient pas directement de la liste de suggestion. */\n  requireSelection = input(false);\n\n  /** Mode sélection multiple de valeurs */\n  multiple = input(false);\n\n  /** Mode multiple: Nombre max. d'options sélectionnables */\n  maxSelectedOptions = input<number>();\n\n  /** Activer le virtual scroll */\n  virtualScroll = input(false);\n\n  /** Hauteur maximale avec unité avant le scroll sur la liste déroulante (correspond à la propriété css max-height) */\n  scrollHeight = input('224px');\n\n  /** Surcharger la hauteur en px d'un item dans le cas du virtual scroll. Par défaut 24 (px). */\n  virtualScrollItemHeight = input(24);\n\n  /** Nom de la propriété correspondant à la valeur (string) affichée dans l'objet suggestion */\n  suggestionValueKey = input<string>();\n\n  /** Optionnel : nom de la propriété correspond à la valeur de sélection dans l'objet suggestion.\n   * Sans définition la sélection concerne tout l'objet suggestion */\n  selectedValueKey = input<string>();\n\n  /** Afficher le spinner indiquant le chargement des suggestions */\n  loading = input(false);\n\n  /** Cache le label visuellement en le laissant disponible aux lecteurs d'écran.  */\n  labelSrOnly = input(false);\n\n  /** 👓 Correspond à l'attribut `aria-label` */\n  ariaLabel = input<string>();\n\n  /**  👓 Correspond à l'attribut `aria-invalid` */\n  ariaInvalid = input<string>();\n\n  /** 👓 Correspond à l'attribut `aria-describedby`  */\n  ariaDescribedby = input<string>();\n\n  /**\n   * Le délai (en millisecondes) pour déclencher l'événement de changement de saisie et de filtrage.\n   * Par défaut la valeur est 0\n   */\n  delay = input(0);\n\n  /** Minimum de caractères nécessaires au déclenchement des suggestions. 1 par défaut */\n  minLength = input(1);\n\n  /** Liste des suggestions */\n  suggestions = input<any[]>([]);\n\n  /** @internal value interne du dsfr-form-input */\n  valueInput = signal<string>('');\n\n  /**  @internal */\n  override readonly combinedAriaDescribedBy = computed<string | null>(() => {\n    const ariaDescribedBy = this.ariaDescribedBy();\n    const multiple = this.multiple();\n    const ids: string[] = [];\n\n    if (ariaDescribedBy) ids.push(ariaDescribedBy);\n    ids.push(this.messagesGroupId); // toujours présent meme si aucun message\n    if (multiple) ids.push(this.inputId + '-list');\n\n    return ids.length ? ids.join(' ') : null;\n  });\n\n  protected isExpanded = signal(false); // Etat de la liste dropdown\n  protected currentOptionIndex = signal<number>(-1); // Index courant de l'option ayant le focus\n  protected statusMessageMultiple = '';\n  protected listSelectedOptions: any[] = [];\n\n  /** Nombre de résultats après une recherche (pas de valeur initiale = a11y) */\n  protected nbSuggestions = computed(() => {\n    return this.filteredSuggestions()?.length;\n  });\n\n  /** Les suggestions filtrées en cas de autoFilter, égales aux suggestions sinon */\n  protected filteredSuggestions = signal<any[]>([]);\n\n  private inputChange$ = new Subject<Event>(); // Subject pour capturer les changements d'input\n  private notifyOnDestroy = new Subject<void>();\n\n  /** Container HTML <ul> de la liste des suggestions */\n  private containerListElement: HTMLElement | null = null;\n\n  private readonly _cd = inject(ChangeDetectorRef);\n  private readonly _i18n = inject(DsfrI18nService);\n  private readonly _renderer = inject(Renderer2);\n\n  constructor() {\n    super();\n    this._i18n.extendsLabelsBundle(Language.EN, MESSAGES_EN);\n    this._i18n.extendsLabelsBundle(Language.FR, MESSAGES_FR);\n\n    // Initialisation de filteredSuggestions selon suggestions\n    effect(() => {\n      const suggestions = this.suggestions();\n      this.filteredSuggestions.set(suggestions ?? []);\n    });\n  }\n\n  /** Fonction de formatage de la valeur affichée dans l'input à la sélection d'une suggestion */\n  @Input() formatOnSelect: (selectedSuggestion: any) => string = (selectedSuggestion) => {\n    const suggestionKey = this.suggestionValueKey();\n    return suggestionKey ? selectedSuggestion[suggestionKey] : selectedSuggestion;\n  };\n\n  public override ngOnInit() {\n    super.ngOnInit();\n    this.inputId ??= newUniqueId();\n\n    // Initialise le debounce lié à l'event input change\n    this.inputChange$\n      .pipe(debounceTime(this.delay()), distinctUntilChanged(), takeUntil(this.notifyOnDestroy))\n      .subscribe((event: Event) => {\n        this.handleInputChange(event);\n      });\n  }\n\n  public ngAfterViewInit(): void {\n    const inputElement: HTMLElement | undefined = this.inputComponent?.nativeElement;\n\n    if (inputElement) {\n      this._renderer.setAttribute(inputElement, 'aria-controls', `listbox-${this.inputId}`);\n    }\n  }\n\n  public ngOnDestroy() {\n    this.notifyOnDestroy.next();\n    this.notifyOnDestroy.complete();\n  }\n\n  /**\n   * Override writeValue pour setter la valeur de l'input programmatiquement à l'initialisation\n   * @internal\n   */\n  public override writeValue(value: any): void {\n    if (value) {\n      if (this.multiple()) {\n        this.initSelectedOptionsList(value);\n      } else {\n        const optionSelected = this.initSelectedOption(value);\n        this.valueInput.set(optionSelected);\n      }\n    } else {\n      this.listSelectedOptions = [];\n      this.valueInput.set('');\n    }\n\n    super.writeValue(value);\n    this._cd.markForCheck();\n  }\n\n  /** @internal */\n  public override setDisabledState(isDisabled: boolean) {\n    this.disabled = isDisabled;\n    this._cd.markForCheck();\n  }\n\n  /**\n   * Le blur qui ajoute le statut touched ne doit se déclencher que si la liste est fermée\n   * Pour éviter l'affichage d'erreurs de validation lorsque le clic est appuyé sur la selection d'une option\n   * (touched et donc validation déclenchés trop tot)\n   */\n  protected onFocusOut(): void {\n    if (!this.isExpanded() && this.requireSelection()) {\n      this.updateValueAndCloseList();\n    }\n  }\n\n  protected onToogleDisplayList(display: boolean): void {\n    this.isExpanded.set(display);\n  }\n\n  protected onInput(event: Event) {\n    this.inputChange$.next(event);\n  }\n\n  /** Ouverture de la liste des suggestions au focus si le minLength est de 0, ou si l'input comporte déjà une valeur */\n  protected onFocusInput() {\n    if (this.minLength() === 0 || (this.valueInput() && this.valueInput().length >= this.minLength())) {\n      this.isExpanded.set(true);\n      if (this.autoFilter()) {\n        this.doAutoFilter();\n      }\n    }\n  }\n\n  /** Gestion des touches de navigation. */\n  protected doKeyEvent(event: KeyboardEvent, options: any[]) {\n    if (!this.isExpanded()) return;\n    let newIndex = 0;\n\n    switch (event.key) {\n      case 'ArrowDown':\n        event.preventDefault();\n        const nextIndex = Math.min(this.currentOptionIndex() + 1, options?.length - 1);\n        // si on est focus sur la dernière option, on va sur la premiere de la liste\n        newIndex = nextIndex !== this.currentOptionIndex() ? nextIndex : 0;\n        this.activateFocusOption(newIndex);\n        break;\n\n      case 'ArrowUp':\n        event.preventDefault();\n        const prevIndex = Math.max(0, this.currentOptionIndex() - 1);\n        // si on est focus sur la premiere option, on va sur la derniere de la liste\n        newIndex = prevIndex !== this.currentOptionIndex() ? prevIndex : options.length - 1;\n        this.activateFocusOption(newIndex);\n        if (this.virtualScroll()) this.viewport?.scrollToIndex(this.currentOptionIndex(), 'smooth');\n\n        break;\n\n      case 'Enter':\n      case 'Tab':\n      case 'NumpadEnter':\n        // Si la touche ENTREE est pressée, empecher la soumission du form\n        if (event.key !== 'Tab') event.preventDefault();\n        if (this.currentOptionIndex() > -1) {\n          // Si une option est focus, sélection de l'option\n          this.onOptionSelect(this.filteredSuggestions()[this.currentOptionIndex()], this.currentOptionIndex(), false);\n          this.updateValueAndCloseList(true);\n        } else {\n          this.updateValueAndCloseList();\n        }\n        break;\n\n      case 'Escape':\n        event.preventDefault();\n        this.updateValueAndCloseList();\n        break;\n\n      default:\n    }\n  }\n\n  protected onClickOption(suggestion: any, i: number) {\n    this.onOptionSelect(suggestion, i, true);\n    this.updateValueAndCloseList(true);\n  }\n\n  /**\n   * Fermeture de la liste des suggestions à la sortie du champ\n   * Mise a jour de la valeur dans le cas de requireSelection ou multiple\n   * @param hasSelectOption l'utilisateur a cliqué ou sélectionné au clavier une option\n   * */\n  protected updateValueAndCloseList(hasSelectOption: boolean = false) {\n    const expanded = this.isExpanded();\n    this.isExpanded.set(false);\n\n    this.resetAriaActiveDescendant();\n\n    if (this.valueInput().length >= this.minLength()) {\n      const selectedSuggestion = this.filteredSuggestions().find(\n        (o: any) => this.formatOnSelect(o) === this.valueInput(),\n      );\n\n      if (selectedSuggestion) {\n        this.addSelectedSuggestion(selectedSuggestion);\n      } else if (!hasSelectOption) {\n        this.handleNoSelectedSuggestion();\n      }\n    }\n\n    if (expanded) this.listClose.emit();\n\n    this.onBlur(); // forcer le déclenchement du blur à la sortie du champ\n  }\n\n  /**\n   * Gestion de l'attribut aria-selected\n   * true: en mode multiple l'option est sélectionnée, en mode simple l'option est en focus\n   */\n  protected isOptionSelected(i: number, option?: any): boolean {\n    if (this.multiple() && this.value?.length) {\n      return this.listSelectedOptions.some((o: any) => o === option);\n    }\n\n    return this.currentOptionIndex() === i;\n  }\n\n  /** Méthode c/c de la même méthode qui existe du côté du composant form-input */\n  protected getWrapClasses(): string[] {\n    let classes = ['fr-input-wrap'];\n    if ((this.buttonLabel || this.buttonIcon) && this.inputWrapMode === 'addon') classes.push('fr-input-wrap--addon');\n    if ((this.buttonLabel || this.buttonIcon) && this.inputWrapMode === 'action') classes.push('fr-input-wrap--action');\n    if (this.icon) classes.push(this.icon);\n\n    return classes;\n  }\n\n  /**\n   * Gestion du focus à l'ouverture de la liste (evenement du dropdown-container)\n   * @param el element ul de liste ou li courant\n   */\n  protected handleListFocusOnOpen(listElement: HTMLElement): void {\n    this.containerListElement = this.virtualScroll() ? listElement.parentElement : listElement;\n    this.currentOptionIndex.set(-1);\n\n    if (this.virtualScroll()) {\n      this.viewport?.checkViewportSize();\n    }\n  }\n\n  /** Emission de buttonSelect au niveau de form-input, seulement si le type du bouton n'est pas `submit` */\n  protected onInputButtonSelect(e: Event) {\n    this.buttonSelect.emit(e);\n  }\n\n  /** Suppression d'une suggestion sélectionnée en mode multiple */\n  protected removeSuggestion(e: Event, optToRemove: any) {\n    this.listSelectedOptions = this.listSelectedOptions.filter(\n      (option: any) => this.getSelectedValue(optToRemove) !== this.getSelectedValue(option),\n    );\n\n    this.value = this.listSelectedOptions.map((o) => this.getSelectedValue(o));\n\n    this.clearOptionSelect.emit({ nativeEvent: e, option: optToRemove });\n  }\n\n  /** Sélection d'une suggestion (clavier ou souris) */\n  private onOptionSelect(suggestion: any, i: number, hasClickOnOption: boolean) {\n    if (!suggestion) {\n      this.currentOptionIndex.set(0);\n      this.suggestionSelect.emit(suggestion);\n      return;\n    }\n\n    this.activateFocusOption(i, hasClickOnOption);\n\n    if (this.multiple()) {\n      this.addSuggestionMultiple(suggestion);\n    } else {\n      this.value = this.getSelectedValue(suggestion);\n      this.valueInput.set(this.formatOnSelect(suggestion));\n    }\n\n    this.suggestionSelect.emit(suggestion);\n  }\n\n  /** Filtrage apres input change+debounce */\n  private handleInputChange(event: Event): void {\n    if (!this.multiple() && !this.requireSelection()) {\n      this.value = this.valueInput();\n    }\n\n    const shouldExpandList = this.valueInput()?.length >= this.minLength();\n    this.isExpanded.set(shouldExpandList);\n\n    if (!this.isExpanded()) {\n      this.updateValueAndCloseList();\n      return;\n    }\n\n    if (!this.autoFilter()) {\n      const completeEvent: DsfrCompleteEvent = { originalEvent: event, query: this.valueInput()! };\n      this.filterChange.emit(completeEvent);\n    } else {\n      this.doAutoFilter();\n    }\n\n    this.resetAriaActiveDescendant();\n  }\n\n  /**\n   * Filtre la liste avec la valeur\n   *\n   * La recherche se fait toujours à partir de : originalSuggestions\n   * On valorise directement la propriété privée _suggestions sans passer par le setter (réservé à l'utilisateur)\n   * afin de garder intact originalSuggestions\n   */\n  private doAutoFilter(): void {\n    let filteredSuggestions = [];\n    const originalSuggestions = this.suggestions();\n\n    if (originalSuggestions?.length > 0) {\n      if (!this.valueInput()) {\n        this.filteredSuggestions.set(originalSuggestions);\n        return;\n      }\n\n      const searchValue: string = this.valueInput()?.toLowerCase();\n      const suggestionKey: string | undefined = this.suggestionValueKey();\n\n      if (suggestionKey) {\n        // originalSuggestions liste d'objets\n        filteredSuggestions = originalSuggestions.filter((item: any) => {\n          return item[suggestionKey].toLowerCase().includes(searchValue);\n        });\n      } else if (typeof originalSuggestions[0] === 'string') {\n        // originalSuggestions liste de string\n        filteredSuggestions = originalSuggestions.filter((item: string) => item.toLowerCase().includes(searchValue));\n      }\n    }\n\n    this.filteredSuggestions.set(filteredSuggestions);\n  }\n\n  /**\n   * Affichage visuel de l'option active (class selected, aria-activedescendant) a la nav. clavier ou selection souris\n   * Scroll jusqu'a l'option en cas de navigation clavier\n   * @param index index courant option active\n   * @param hasClickOnOption selection a la souris\n   */\n  private activateFocusOption(newIndex: number, hasClickOnOption?: boolean): void {\n    // Sélection de l'indice courant\n    const activeOption: HTMLElement | null = this.queryOptionFromDataIndex(this.containerListElement, newIndex);\n\n    if (activeOption && this.inputComponent) {\n      this._renderer.setAttribute(this.inputComponent.nativeElement, 'aria-activedescendant', activeOption.id);\n\n      // scroll manuel sur l'élément lors de la navigation clavier (pas de focus automatique)\n      if (!this.virtualScroll() && !hasClickOnOption) {\n        activeOption.scrollIntoView({ block: 'nearest', inline: 'nearest', behavior: 'smooth' });\n      } else if (this.virtualScroll()) {\n        this.manageScrollForVirtualScroll(activeOption);\n      }\n    } else if (this.virtualScroll()) {\n      // si option active n'est pas dans le viewport, forcer le refresh de celui-ci\n      this.viewport?.scrollToIndex(newIndex, 'smooth');\n    }\n\n    this.currentOptionIndex.set(newIndex);\n  }\n\n  private addSelectedSuggestion(suggestion: any) {\n    if (this.multiple()) {\n      this.addSuggestionMultiple(suggestion);\n    } else {\n      this.value = this.getSelectedValue(suggestion);\n    }\n  }\n\n  private handleNoSelectedSuggestion() {\n    if (this.requireSelection()) {\n      this.resetValueAndIndex(); // Remise du champ input a vide\n    } else if (!this.requireSelection() && this.multiple() && this.valueInput() !== '') {\n      /* En mode multiple si sélection non requise on ajoute la valeur saisie en tant que tag (valeur libre) */\n      this.addSuggestionMultiple(this.valueInput());\n    }\n  }\n\n  /**\n   * Ajoute la suggestion dans la liste si elle n'est pas déja présente et si le nombre d'options sélectionnées est inférieur à maxSelectedOptions\n   * @param suggestion\n   */\n  private addSuggestionMultiple(suggestion: any): void {\n    this.statusMessageMultiple = '';\n    const suggestionValue = this.getSelectedValue(suggestion);\n\n    if (this.maxSelectedOptions() && this.value.length >= this.maxSelectedOptions()!) {\n      this.statusMessageMultiple = 'autocomplete.maxSelection';\n      return;\n    }\n\n    if (this.value?.includes(suggestionValue)) {\n      this.statusMessageMultiple = 'autocomplete.alreadyExist';\n      return;\n    }\n\n    this.listSelectedOptions.push(suggestion);\n\n    // Recréer entierement la liste pour une maj correcte de value (détection CVA)\n    this.value = this.listSelectedOptions.map((o) => this.getSelectedValue(o));\n    this.valueInput.set('');\n  }\n\n  /** Initialisation de la liste des options programmatiquement sélectionné depuis suggestions  */\n  private initSelectedOptionsList(value: any) {\n    if (Array.isArray(value)) {\n      const selectedKey = this.selectedValueKey();\n      this.listSelectedOptions = selectedKey\n        ? value.map((option: any) => this.suggestions()?.find((o) => option === o[selectedKey]))\n        : [...value];\n    } else {\n      throw Error('`value` must be an array.');\n    }\n  }\n\n  /** Initialisation de l'option sélectionnée programmatiquement depuis suggestions */\n  private initSelectedOption(value: any): any | string {\n    const selectedKey = this.selectedValueKey();\n    if (!selectedKey) return this.formatOnSelect(value);\n\n    const selectedOption = this.suggestions()?.find((o) => value === o[selectedKey]);\n\n    if (selectedOption) {\n      return this.formatOnSelect(selectedOption);\n    }\n  }\n\n  private resetValueAndIndex() {\n    this.currentOptionIndex.set(0);\n    this.valueInput.set('');\n    if (!this.multiple()) this.value = undefined;\n  }\n\n  /**\n   * En mode virtualScroll le scroll doit se faire par la methode scrollToIndex de CDK virtualscroll\n   * @param index index de l'option dans la liste gérée par cdkVirtualFor\n   */\n  private manageScrollForVirtualScroll(activeOption: HTMLElement) {\n    const index = Number(activeOption.getAttribute('data-index'));\n    this.viewport?.scrollToIndex(index, 'smooth');\n  }\n\n  /** Effacement de aria-activedescendant lorsque la liste est cachée ou l'input vide */\n  private resetAriaActiveDescendant() {\n    if (this.valueInput() === '' || !this.isExpanded()) {\n      this._renderer.setAttribute(this.inputComponent?.nativeElement, 'aria-activedescendant', '');\n    }\n  }\n\n  /** Get option dans la liste des options selon attribut HTML [data-index]  */\n  private queryOptionFromDataIndex(options: HTMLElement | null, dataIndexAttribute: number): HTMLElement | null {\n    return options ? options.querySelector(`li[data-index=\"${dataIndexAttribute}\"]`) : null;\n  }\n\n  private getSelectedValue(s: any): any {\n    const selectedKey = this.selectedValueKey();\n    return selectedKey ? s?.[selectedKey] : s;\n  }\n}\n","<div\n  class=\"fr-input-group dsfrx-autocomplete\"\n  [class]=\"messageViewModel() ? 'fr-input-group--' + severityViewModel() : ''\"\n  [ngClass]=\"{\n    'fr-input-group--disabled': disabled,\n  }\">\n  <!-- Label -->\n  <label [for]=\"inputId\" class=\"fr-label\" [ngClass]=\"{ 'fr-sr-only': labelSrOnly() }\">\n    @if (label) {\n      {{ label }}\n    } @else {\n      <ng-content select=\"[label]\"></ng-content>\n    }\n    @if (hint) {\n      <span class=\"fr-hint-text\">{{ hint }}</span>\n    }\n  </label>\n\n  <!-- Liste -->\n  @if (multiple()) {\n    <ng-container [ngTemplateOutlet]=\"tagsTemplate\"></ng-container>\n  }\n\n  <edu-dropdown-container\n    #comboboxBox\n    [displayDropdown]=\"isExpanded()\"\n    [classToWrap]=\"'dsfrx-autocomplete'\"\n    [hasToolBar]=\"false\"\n    [autofocus]=\"true\"\n    [appendTo]=\"appendTo()\"\n    [virtualScroll]=\"virtualScroll()\"\n    [zIndex]=\"zIndex()\"\n    (focusOnList)=\"handleListFocusOnOpen($event)\"\n    (hideList)=\"updateValueAndCloseList()\"\n    [hasOptions]=\"true\">\n    <!-- Control -->\n    <div ngProjectAs=\"control\" [class]=\"getWrapClasses()\">\n      @if (buttonIcon || buttonLabel) {\n        <ng-container [ngTemplateOutlet]=\"inputTemplate\"></ng-container>\n        <dsfr-button\n          [ariaLabel]=\"buttonAriaLabel\"\n          [disabled]=\"buttonDisabled\"\n          [icon]=\"buttonIcon\"\n          [label]=\"buttonLabel\"\n          [tooltipMessage]=\"buttonTooltipMessage\"\n          [type]=\"buttonType\"\n          [variant]=\"buttonVariant\"\n          [labelSrOnly]=\"buttonLabelSrOnly\"\n          (click)=\"onInputButtonSelect($event)\"></dsfr-button>\n      } @else {\n        <ng-container [ngTemplateOutlet]=\"inputTemplate\"></ng-container>\n      }\n    </div>\n\n    @if (virtualScroll()) {\n      <!-- Listebox avec virtualScroll-->\n      <div\n        #listbox\n        [ngStyle]=\"{ 'z-index': zIndex }\"\n        [style.max-height]=\"scrollHeight()\"\n        class=\"dsfrx-autocomplete__list dsfrx-autocomplete__list--has-viewport\">\n        @if (filteredSuggestions() && nbSuggestions() > 0) {\n          <cdk-virtual-scroll-viewport\n            #viewport\n            minBufferPx=\"200\"\n            maxBufferPx=\"600\"\n            [itemSize]=\"virtualScrollItemHeight()\"\n            class=\"viewport\">\n            <ul role=\"listbox\" id=\"listbox-{{ inputId }}\" [attr.aria-labelledby]=\"inputId\">\n              <li\n                *cdkVirtualFor=\"let suggestion of filteredSuggestions(); let i = index\"\n                role=\"option\"\n                [id]=\"inputId + '-option-' + i\"\n                [attr.aria-selected]=\"isOptionSelected(i, suggestion)\"\n                [attr.data-index]=\"i\"\n                [attr.data-dsfrx-option]=\"true\"\n                [class.selected]=\"currentOptionIndex() === i\"\n                class=\"option\"\n                (click)=\"onClickOption(suggestion, i)\">\n                <!-- Affichage suggestion ou template suggestion -->\n                <ng-container\n                  [ngTemplateOutlet]=\"sugestionTemplateDefault\"\n                  [ngTemplateOutletContext]=\"{ suggestion: suggestion, index: i }\"></ng-container>\n              </li>\n            </ul>\n          </cdk-virtual-scroll-viewport>\n        }\n        <ng-container [ngTemplateOutlet]=\"loadingTemplate\"></ng-container>\n      </div>\n    } @else {\n      <!-- Listebox sans virtualScroll-->\n      <div #listbox [ngStyle]=\"{ 'z-index': zIndex }\" class=\"dsfrx-autocomplete__list\">\n        @if (filteredSuggestions() && nbSuggestions()) {\n          <ul\n            id=\"listbox-{{ inputId }}\"\n            [ngStyle]=\"{ 'z-index': zIndex }\"\n            [attr.aria-labelledby]=\"inputId\"\n            role=\"listbox\">\n            @for (suggestion of filteredSuggestions(); track $index; let i = $index) {\n              <li\n                role=\"option\"\n                [id]=\"inputId + '-option-' + i\"\n                [attr.aria-selected]=\"isOptionSelected(i, suggestion)\"\n                [attr.data-index]=\"i\"\n                [attr.data-dsfrx-option]=\"true\"\n                [class.selected]=\"currentOptionIndex() === i\"\n                class=\"option\"\n                (click)=\"onClickOption(suggestion, i)\">\n                <!-- Affichage suggestion ou template suggestion -->\n                <ng-container\n                  [ngTemplateOutlet]=\"sugestionTemplateDefault\"\n                  [ngTemplateOutletContext]=\"{ suggestion: suggestion, index: i }\"></ng-container>\n              </li>\n            }\n          </ul>\n        }\n        <ng-container [ngTemplateOutlet]=\"loadingTemplate\"></ng-container>\n      </div>\n    }\n  </edu-dropdown-container>\n\n  <div class=\"fr-messages-group\" [id]=\"messagesGroupId\" aria-live=\"polite\">\n    @if (messageViewModel()) {\n      <p [eduMessageSeverity]=\"messageSeverity() ?? 'error'\">{{ messageViewModel() }}</p>\n    }\n  </div>\n  <span class=\"fr-sr-only\" aria-live=\"polite\">\n    @if (nbSuggestions() === 0) {\n      {{ 'autocomplete.noResults' | dsfrI18n }}\n    } @else if (nbSuggestions() > 0) {\n      {{ nbSuggestions() }} {{ 'autocomplete.availableResults' | dsfrI18n }}\n    }\n  </span>\n</div>\n\n<ng-template #tagsTemplate>\n  <div class=\"dsfrx-autocomplete__multiple-group\">\n    @if (value && value.length) {\n      <ul [id]=\"inputId + '-list'\" class=\"fr-tags-group\">\n        @for (opt of listSelectedOptions; track opt) {\n          @let suggestionKey = suggestionValueKey();\n          @let labelOpt = opt && suggestionKey ? (opt[suggestionKey] ?? opt) : opt;\n\n          <li>\n            <dsfr-tag\n              [disabled]=\"disabled\"\n              [mode]=\"'deletable'\"\n              [label]=\"labelOpt\"\n              [small]=\"true\"\n              [ariaLabel]=\"('autocomplete.deleteTag' | dsfrI18n) + ' ' + labelOpt\"\n              (click)=\"removeSuggestion($event, opt)\"></dsfr-tag>\n          </li>\n        }\n      </ul>\n    } @else {\n      <p class=\"fr-sr-only\" [id]=\"inputId + '-list'\">{{ 'autocomplete.noSelect' | dsfrI18n }}</p>\n    }\n    <div aria-live=\"polite\" class=\"fr-sr-only\">\n      @if (statusMessageMultiple) {\n        <p>{{ statusMessageMultiple | dsfrI18n }}</p>\n      }\n    </div>\n  </div>\n</ng-template>\n\n<ng-template #sugestionTemplateDefault let-suggestion=\"suggestion\" let-index=\"index\">\n  @if (suggestionTemplate) {\n    <!-- Slot -->\n    <ng-container\n      *ngTemplateOutlet=\"suggestionTemplate; context: { $implicit: suggestion, index: index }\"></ng-container>\n  } @else {\n    @let suggestionKey = suggestionValueKey();\n\n    {{ suggestion && suggestionKey ? suggestion[suggestionKey] : suggestion }}\n  }\n</ng-template>\n\n<ng-template #loadingTemplate>\n  <div aria-live=\"polite\" class=\"dsfrx-autocomplete--loading\">\n    @if (loading()) {\n      <p class=\"label fr-sr-only\">{{ 'autocomplete.loading' | dsfrI18n }}</p>\n    }\n  </div>\n</ng-template>\n\n<ng-template #inputTemplate>\n  <div class=\"edu-input-wrapper\">\n    <input\n      #inputComponent\n      class=\"fr-input\"\n      [ngClass]=\"customClass || null\"\n      [attr.aria-autocomplete]=\"'list'\"\n      [attr.autocomplete]=\"'off'\"\n      [attr.aria-describedby]=\"combinedAriaDescribedBy()\"\n      [attr.aria-disabled]=\"disabled || null\"\n      [attr.aria-expanded]=\"isExpanded()\"\n      [attr.aria-label]=\"ariaLabel() || null\"\n      [attr.aria-invalid]=\"ariaInvalid() || null\"\n      [attr.aria-required]=\"required || null\"\n      [attr.role]=\"'combobox'\"\n      [(ngModel)]=\"valueInput\"\n      [id]=\"inputId\"\n      [attr.name]=\"name || null\"\n      [attr.type]=\"type\"\n      [disabled]=\"disabled\"\n      [required]=\"required\"\n      [attr.pattern]=\"pattern || null\"\n      [attr.placeholder]=\"placeholder || null\"\n      [attr.maxLength]=\"maxLength || null\"\n      [attr.minLength]=\"minLength() || null\"\n      (buttonSelect)=\"onInputButtonSelect($event)\"\n      (focusin)=\"onFocusInput()\"\n      (keydown)=\"doKeyEvent($event, filteredSuggestions())\"\n      (focusout)=\"onFocusOut()\"\n      (input)=\"onInput($event)\" />\n    @if (loading()) {\n      <dsfr-ext-spinner typeLoader=\"line\"></dsfr-ext-spinner>\n    }\n  </div>\n</ng-template>\n","/**\n * @author pfontanet\n * @since 0.9\n */\n\nimport { DsfrI18nService, jsonPath2Value, LoggerService } from '@edugouvfr/ngx-dsfr';\n\n//TODO: à déplacer dans la lib ngx-dsfr\nexport class DateUtils {\n  private constructor() {}\n\n  /**\n   * Parse une chaine selon le format 'fr' si codeLang = 'fr', 'en'\n   * @returns Date ou undefined\n   */\n  static parse(codeLang: string, dateStr: string | undefined): Date | undefined {\n    if (!dateStr) return undefined;\n    return codeLang === 'fr' ? DateUtils.parseDateFr(dateStr) : DateUtils.parseDateEn(dateStr);\n  }\n\n  /**\n   * Parse une chaîne au format `'mm/dd/yyyy'` (1 digit pour mois et jour accepté)\n   * @returns Date ou undefined\n   */\n  static parseDateFr(dateStr: string): Date | undefined {\n    const regexp = /^(?<day>3[01]|0?[1-9]|[12][0-9])\\/(?<month>1[0-2]|0?[1-9])\\/(?<year>[0-9]{4})$/;\n    return DateUtils.parseDate(dateStr, regexp);\n  }\n\n  /**\n   * Parse une chaîne au format `'dd/mm/yyyy'` (1 digit pour mois et jour accepté)\n   * @returns Date ou undefined\n   */\n  static parseDateEn(dateStr: string): Date | undefined {\n    const regexp = /^(?<month>1[0-2]|0?[1-9])\\/(?<day>3[01]|0?[1-9]|[12][0-9])\\/(?<year>[0-9]{4})$/;\n    return DateUtils.parseDate(dateStr, regexp);\n  }\n\n  /**\n   * Parse une chaîne au format ISO 8601\n   * @returns Date ou undefined\n   */\n  static parseDateIso(dateStr: string): Date | undefined {\n    // https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch04s07.html\n    const regexp =\n      /^(?<year>-?(?:[1-9][0-9]*)?[0-9]{4})-(?<month>1[0-2]|0[1-9])-(?<day>3[01]|0[1-9]|[12][0-9])(T(?<hour>2[0-4]|[01][0-9]):(?<minute>[0-5][0-9]):(?<second>[0-5][0-9])(?<ms>\\.[0-9]+)?(?<timezone>Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?)?$/;\n\n    return DateUtils.parseDate(dateStr, regexp);\n  }\n\n  /**\n   * Retourne une Date UTC, sans heure, minute seconde, à partir d'une date\n   * @param date\n   */\n  static date2Utc(date: Date): Date {\n    return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n  }\n\n  /**\n   * Retourne une Date UTC, sans heure, minute seconde, selon plusieurs formats en entrée\n   * @param value\n   */\n  static dateUtcOf(value: Date | string | number | undefined | null): Date | undefined {\n    let date: Date | undefined = undefined;\n\n    if (typeof value === 'string') date = DateUtils.parseDateIso(value);\n    else if (typeof value === 'number') date = DateUtils.numberToDateUtc(value);\n    else if (value) date = DateUtils.date2Utc(value);\n\n    return date;\n  }\n\n  static format(codeLang: string, date: Date | undefined): string {\n    if (date === undefined) return '';\n    const code = codeLang === 'fr' ? codeLang : 'en';\n    return date.toLocaleDateString(code);\n  }\n\n  //FIXME: à relocaliser dans ngx-dsfr#I18nService\n  static arr(i18n: DsfrI18nService, logger: LoggerService, jsonPath: string): any[] {\n    let arr = <any[]>jsonPath2Value((<any>i18n).currentBundle, jsonPath);\n    if (!arr) {\n      logger.warn(`Aucune traduction pour '${jsonPath}'`);\n      arr = [];\n    }\n\n    return arr;\n  }\n\n  /** Date valide au format dd/mm/yyyy ou mm/dd/yyyy */\n  static isValidDefaultString(boundaryString: string): boolean {\n    const dateRegex = /^\\d{2}\\/\\d{2}\\/\\d{4}$/;\n\n    return dateRegex.test(boundaryString);\n  }\n\n  /**\n   * Compare deux dates et retourne true si ces dernières sont les même.\n   *\n   * @param day1 Date 1 à comparer\n   * @param day2 Date 2 à comparer\n   * @returns true si les deux dates sont les même\n   */\n  static isSameDay(day1: Date | undefined, day2: Date | undefined): boolean {\n    if (!day1 || !day2) {\n      return false;\n    }\n\n    return (\n      day1.getFullYear() === day2.getFullYear() &&\n      day1.getMonth() === day2.getMonth() &&\n      day1.getDate() === day2.getDate()\n    );\n  }\n\n  /**\n   * Parse la date en fonction d'une expression régulière\n   * @param dateStr String représentant la date\n   * @param regexp\n   * @return Date ou undefined si dateStr ne respecte pas la regexp\n   */\n  private static parseDate(dateStr: string, regexp: RegExp): Date | undefined {\n    if (!dateStr) return undefined;\n\n    const execArr = regexp.exec(dateStr);\n    const groups = execArr?.groups;\n    if (groups === undefined) return undefined;\n\n    let year = Number(groups['year']);\n    const month = Number(groups['month']);\n    const day = Number(groups['day']);\n    const valid = Number.isInteger(year) && Number.isInteger(month) && Number.isInteger(day);\n\n    return !valid ? undefined : new Date(Date.UTC(year, month - 1, day));\n  }\n\n  private static numberToDateUtc(n: number): Date {\n    const d = new Date(n);\n    return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()));\n  }\n}\n","import { DsfrDefinedRangeModel, DsfrRangeModel } from '../../../calendar';\nimport { DateUtils } from '../date/date-utils';\n\nexport class RangeUtils {\n  /**\n   * Vérifie que la date fournie entre bien dans la période passée en second paramètre\n   *\n   * @param day\n   * @param range\n   * @returns Un booléen signifiant l'appartenance de la date à la période donnée\n   */\n  static isInRange(day: Date | undefined, range: DsfrRangeModel, codeLang: string): boolean {\n    if (!day || !range || !range[0] || !range[1]) {\n      return false;\n    }\n\n    const reorderedRange = this.reorderRangeValues(range, codeLang);\n\n    if (reorderedRange) {\n      const currentDayTime = day.getTime();\n      const startDay = DateUtils.parse(codeLang, reorderedRange[0]);\n      const endDay = DateUtils.parse(codeLang, reorderedRange[1]);\n      const startDateTime = startDay!.getTime();\n      const endDateTime = endDay!.getTime();\n\n      return (\n        DateUtils.isSameDay(day, startDay) ||\n        DateUtils.isSameDay(day, endDay) ||\n        (currentDayTime >= startDateTime && currentDayTime <= endDateTime)\n      );\n    }\n\n    return false;\n  }\n\n  /**\n   * Vérifie que la date passée est strictement antérieure à la période donnée\n   *\n   * @param day Date dont on vérifie l'antériorité\n   * @param range Période vis à vis de laquelle on vérifie l'antériorité\n   * @returns true si la date passé est strictement antérieur à la période, et false dans les autres cas\n   */\n  static isBeforeRangeFirstDate(day: Date, range: DsfrRangeModel, codeLang: string): boolean {\n    const startDay = DateUtils.parse(codeLang, range[0]);\n\n    if (!day || !range || !startDay) {\n      return true;\n    }\n\n    const currentDayTime = day.getTime();\n    const startDateTime = startDay!.getTime();\n\n    return currentDayTime < startDateTime;\n  }\n\n  /**\n   * Réordonne les valeurs d'un range en mettant la date la plus reculée en index 0 et la seconde en index 1\n   *\n   * @param range Période à réordonner\n   * @returns Le range réordonné, ou undefined si le range n'est pas complet ou non-traitable\n   */\n  static reorderRangeValues(\n    range: DsfrRangeModel,\n    codeLang: string,\n    loggerService = console,\n  ): DsfrDefinedRangeModel | undefined {\n    const firstDate = DateUtils.parse(codeLang, range[0]);\n    const secondDate = DateUtils.parse(codeLang, range[1]);\n\n    if (firstDate === undefined || secondDate === undefined) {\n      loggerService.warn(\n        `Tried to reorder range values while range is not defined. index 0: ${range[0]}, index 1: ${range[1]}`,\n      );\n      return undefined;\n    }\n\n    const firstDateTime = firstDate.getTime();\n    const secondDateTime = secondDate.getTime();\n\n    if (firstDateTime > secondDateTime) {\n      return [range[1]!, range[0]!];\n    }\n\n    return range as DsfrDefinedRangeModel;\n  }\n}\n","// Ordre alphabétique requis\nexport const MESSAGES_EN = {\n  calendar: {\n    cancel: 'Cancel',\n    days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n    daysAbbr: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\n    months: [\n      'January',\n      'February',\n      'March',\n      'April',\n      'May',\n      'June',\n      'July',\n      'August',\n      'September',\n      'October',\n      'November',\n      'December',\n    ],\n    monthsAbbr: ['Jan.', 'Feb.', 'Mar.', 'Apr.', 'May', 'June', 'July', 'Aug.', 'Sept.', 'Oct.', 'Nov.', 'Dec.'],\n    prevMonth: 'Previous month',\n    nextMonth: 'Next month',\n    monthSelect: 'Select a month',\n    yearSelect: 'Select a year',\n    modal: {\n      ariaLabel: 'Date picker widget: ',\n      ariaLabelRange: 'Range picker widget: ',\n      title: 'Choose a date: ',\n      titleRange: 'Choose a period: ',\n    },\n  },\n};\n","// Ordre alphabétique requis\nexport const MESSAGES_FR = {\n  calendar: {\n    cancel: 'Annuler',\n    days: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],\n    daysAbbr: ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'],\n    months: [\n      'Janvier',\n      'Février',\n      'Mars',\n      'Avril',\n      'Mai',\n      'Juin',\n      'Juillet',\n      'Août',\n      'Septembre',\n      'Octobre',\n      'Novembre',\n      'Décembre',\n    ],\n    monthsAbbr: ['Janv.', 'Févr.', 'Mars', 'Avril', 'Mai', 'Juin', 'Juil.', 'Août', 'Sept.', 'Oct.', 'Nov.', 'Déc.'],\n    prevMonth: 'Mois précédent',\n    nextMonth: 'Mois suivant',\n    monthSelect: 'Sélectionner le mois',\n    yearSelect: `Sélectionner l'année`,\n    modal: {\n      ariaLabel: 'Widget de choix de date : ',\n      ariaLabelRange: 'Widget de choix de période : ',\n      title: 'Choisir une date : ',\n      titleRange: 'Choisir une période : ',\n    },\n  },\n};\n","import {\n  AfterViewInit,\n  Component,\n  ElementRef,\n  EventEmitter,\n  Input,\n  OnChanges,\n  OnDestroy,\n  OnInit,\n  Output,\n  ViewChild,\n  ViewEncapsulation,\n  booleanAttribute,\n  inject,\n} from '@angular/core';\nimport {\n  DsfrFormSelectModule,\n  DsfrI18nPipe,\n  DsfrI18nService,\n  DsfrSelectOption,\n  LangService,\n  Language,\n  LoggerService,\n} from '@edugouvfr/ngx-dsfr';\nimport { Subscription } from 'rxjs';\nimport { DsfrDateEvent } from '../shared/models/date-event';\nimport { DateUtils } from '../shared/utils/date/date-utils';\nimport { RangeUtils } from '../shared/utils/range/range-utils';\nimport { MESSAGES_EN } from './i18n/messages.en';\nimport { MESSAGES_FR } from './i18n/messages.fr';\n\n/**\n * Implémente la saisie d'une date via un input ou via un calendrier affichant les jours et les mois.\n * Validator est implémenté uniquement par rapport à min et max\n */\n@Component({\n  selector: 'dsfr-ext-calendar, dsfrx-calendar',\n  encapsulation: ViewEncapsulation.None,\n  templateUrl: './calendar.component.html',\n  styleUrls: ['./calendar.component.scss'],\n  imports: [DsfrFormSelectModule, DsfrI18nPipe],\n})\nexport class DsfrCalendarComponent implements AfterViewInit, OnDestroy, OnInit, OnChanges {\n  /**\n   * Valeur initial de la date.\n   * La valeur doit prendre la forme dd/mm/yyyy pour la locale fr et mm/dd/yyyy pour la locale en.\n   */\n  @Input() value?: string | DsfrRangeModel = '';\n\n  /** Force le focus sur la date courante à l'initialisation du composant */\n  @Input({ transform: booleanAttribute }) autofocus: boolean = false;\n\n  /** Id de l'élément correspondant au label de la grille de dates */\n  @Input() ariaLabelledBy: string = '';\n\n  /** Modifie le mode de sélection du calendrier, entre `single` et `range` */\n  @Input() mode: DsfrCalendarMode = 'single';\n\n  /**\n   * Permet d'ignorer la valeur initiale de l'input `value` si celle ci est erronée.\n   * (ex: date de début postérieure à date de fin)\n   */\n  @Input({ transform: booleanAttribute }) ignoreInitialValue = false;\n\n  /** Emission de la date au format DsfrDateEvent */\n  @Output() dateChange = new EventEmitter<DsfrDateEvent>();\n\n  /** Evènement au changement d'affichage du calendrier (changement mois ou année) */\n  @Output() calendarChange = new EventEmitter<Date>();\n\n  @ViewChild('previousMonth') protected previousMonth?: ElementRef<HTMLButtonElement>;\n  @ViewChild('nextMonth') protected nextMonth?: ElementRef<HTMLButtonElement>;\n  @ViewChild('monthSelect', { read: ElementRef }) protected monthSelect?: ElementRef<HTMLElement>;\n  @ViewChild('yearSelect', { read: ElementRef }) protected yearSelect?: ElementRef<HTMLElement>;\n  @ViewChild('tbody') protected tbody?: ElementRef<HTMLTableElement>;\n\n  protected monthSelectOptions: DsfrSelectOption[] = [];\n  protected yearSelectOptions: DsfrSelectOption[] = [];\n  protected currentMonthIndex: number = new Date().getMonth();\n  protected currentYear: number = new Date().getFullYear();\n  protected translatedMonthAbbreviations: string[] = [];\n  protected translatedMonths: string[] = [];\n  protected prevMonthLabel = '';\n  protected nextMonthLabel = '';\n  protected monthSelectLabel = '';\n  protected yearSelectLabel = '';\n  protected isMonoYear = false;\n  protected isMonoMonth = false;\n  protected readonly rows = new Array(6);\n  protected readonly columns = new Array(7);\n\n  /* Node */\n  private dayCells: HTMLTableCellElement[] = [];\n\n  private prevCodeLang: string;\n  private focusDay = new Date();\n  private selectedDay: Date | undefined = new Date(0, 0, 1);\n  private lastDate = -1;\n  private _min: string | undefined = '';\n  private _max: string | undefined = '';\n\n  private subscription = new Subscription();\n\n  // États permettant de gérer la prévisualisation du range en cours de sélection.\n  private firstDayOffset: number = 0;\n  private daysInMonth: number = 0;\n  private rangeStart: Date | null = null;\n  private rangeEnd: Date | null = null;\n  /**\n   * Date de fin potentielle du range en cours de sélection, utilisée uniquement pour gérer la prévisualisation du range.\n   */\n  private rangeEndPreview: Date | null = null;\n\n  private readonly i18n = inject(DsfrI18nService);\n  private readonly langService = inject(LangService);\n  private readonly loggerService = inject(LoggerService);\n\n  constructor() {\n    const i18n = this.i18n;\n    const langService = this.langService;\n\n    this.i18n.extendsLabelsBundle(Language.EN, MESSAGES_EN);\n    this.i18n.extendsLabelsBundle(Language.FR, MESSAGES_FR);\n    this.prevCodeLang = langService.lang;\n    const langChange$ = i18n.completeLangChange$.subscribe((code) => this.onLangChange(code));\n    this.subscription.add(langChange$);\n  }\n\n  /**\n   * @return Le code de la langue en cours\n   */\n  get codeLang() {\n    return this.langService.lang;\n  }\n\n  get min(): string | undefined {\n    return this._min;\n  }\n\n  get max(): string | undefined {\n    return this._max;\n  }\n\n  protected get isEnglishLocale(): boolean {\n    return this.langService.lang === 'en';\n  }\n\n  /**\n   * Date minimale inclue. Doit être au format IS0-8601 : AAAA-MM-JJ.\n   * Ce paramètre peut être utilisé seul ou avec la propriété max.\n   */\n  @Input()\n  set min(value: string | undefined) {\n    if (value && !this.isValidIso(value)) {\n      this.loggerService.warn(\n        `dsfr-date-picker: La propriété min a un format incorrect. Attendu: 'YYYY-MM-DD'. Reçu: ${value}`,\n      );\n    } else if (value && this.isValidIso(value)) {\n      this._min = value;\n      this.computeYearSelectOptions();\n    }\n  }\n\n  /**\n   * Date maximale inclue. Doit être au format IS0-8601 : AAAA-MM-JJ.\n   * Ce paramètre peut être utilisé seul ou avec la propriété min.\n   */\n  @Input()\n  set max(value: string | undefined) {\n    if (value && !this.isValidIso(value)) {\n      this.loggerService.warn(\n        `dsfr-date-picker: La propriété max a un format incorrect. Attendu: 'YYYY-MM-DD'. Reçu: ${value}`,\n      );\n    } else if (value && this.isValidIso(value)) {\n      this._max = value;\n      this.computeYearSelectOptions();\n    }\n  }\n\n  /** @internal */\n  ngOnInit(): void {\n    this.updateMonthAndYearSelects();\n    this.computeMonoYearAndMonoMonth();\n  }\n\n  /** @internal */\n  ngOnDestroy() {\n    this.subscription.unsubscribe();\n  }\n\n  /** @internal */\n  ngAfterViewInit() {\n    if (this.ignoreInitialValue) {\n      this.value = undefined;\n    }\n\n    const tableCells = this.tbody?.nativeElement.getElementsByTagName('td');\n    if (!tableCells) return;\n\n    this.dayCells = Array.from(tableCells);\n\n    this.computeMonthSelectOptions();\n    this.computeYearSelectOptions();\n\n    this.initializeCalendar();\n  }\n\n  /** @internal */\n  ngOnChanges() {\n    if (this.mode === 'single' && this.value) {\n      const validDate = this.reformatValue(this.value as string | undefined);\n\n      if (validDate) {\n        this.setSingleModeNewValue(validDate, true);\n      }\n    }\n\n    if (this.mode === 'range' && Array.isArray(this.value) && this.value.length === 2) {\n      const validPeriod = [this.reformatValue(this.value[0]), this.reformatValue(this.value[1])] as DsfrRangeModel;\n\n      if (validPeriod[0] && validPeriod[1]) {\n        this.setNewRangeValue(validPeriod, true);\n      } else if (validPeriod[0]) {\n        this.setRangeModeNewIndividualValue(validPeriod[0]);\n      }\n    }\n\n    this.computeMonoYearAndMonoMonth();\n    this.computeMonthSelectOptions();\n    this.computeYearSelectOptions();\n\n    this.initializeCalendar();\n  }\n\n  /**\n   * Permet de forcer le focus sur la date active, la dernière date focusée ou la date du jour par défaut.\n   *\n   * Cette méthode est notamment utilisée dans la gestion du calendrier embarqué dans une modale.\n   */\n  public focusDate(): void {\n    for (let i = 0; i < this.dayCells.length; i++) {\n      const dayNode = this.dayCells[i];\n      const day = this.getDayFromDataDateAttribute(dayNode);\n\n      if (DateUtils.isSameDay(day, this.focusDay) && this.inMinMaxRange(day)) {\n        dayNode.tabIndex = 0;\n        dayNode.focus();\n      }\n\n      if (DateUtils.isSameDay(day, new Date())) {\n        dayNode.setAttribute('aria-current', 'date');\n      }\n    }\n  }\n\n  /**********************\n   * Event Handlers\n   **********************/\n  protected handleCancelButton(event: Event): void {\n    let flagToPreventDefault = false;\n\n    switch (event.type) {\n      case 'keydown':\n        const keyEvent = <KeyboardEvent>event;\n        switch (keyEvent.key) {\n          case 'Tab':\n            const reachedBoundary = this.getReachedBoundary();\n\n            if (reachedBoundary !== undefined) {\n              this.autoFocusBoundaryDate(reachedBoundary);\n              flagToPreventDefault = true;\n              break;\n            }\n\n            if (!this.inMinMaxRange(this.focusDay)) {\n              this.nextMonth?.nativeElement.focus();\n              flagToPreventDefault = true;\n              break;\n            }\n            break;\n\n          default:\n            break;\n        }\n        break;\n\n      case 'click':\n        flagToPreventDefault = true;\n        break;\n\n      default:\n        break;\n    }\n\n    if (flagToPreventDefault) {\n      event.stopPropagation();\n      event.preventDefault();\n    }\n  }\n\n  protected handleNextMonthButton(event: Event): void {\n    let flagToPreventDefault = false;\n\n    switch (event.type) {\n      case 'keydown':\n        const keyEvent = <KeyboardEvent>event;\n        switch (keyEvent.key) {\n          case 'Enter':\n            this.moveToNextMonth();\n            this.updateTableCellsTabIndex(false);\n            flagToPreventDefault = true;\n            break;\n\n          case 'Tab':\n            const reachedBoundary = this.getReachedBoundary();\n\n            if (reachedBoundary !== undefined) {\n              this.autoFocusBoundaryDate(reachedBoundary);\n              flagToPreventDefault = true;\n            }\n\n            break;\n        }\n\n        break;\n\n      case 'click':\n        this.moveToNextMonth();\n        this.updateTableCellsTabIndex(false);\n        break;\n\n      default:\n        break;\n    }\n\n    if (flagToPreventDefault) {\n      event.stopPropagation();\n      event.preventDefault();\n    }\n  }\n\n  protected handlePreviousMonthButton(event: Event): void {\n    let flagToPreventDefault = false;\n\n    switch (event.type) {\n      case 'keydown':\n        const keyEvent = <KeyboardEvent>event;\n        switch (keyEvent.key) {\n          case 'Enter':\n            this.moveToPreviousMonth();\n            this.updateTableCellsTabIndex(false);\n            flagToPreventDefault = true;\n            break;\n        }\n\n        break;\n\n      case 'click':\n        this.moveToPreviousMonth();\n        this.updateTableCellsTabIndex(false);\n        flagToPreventDefault = true;\n        break;\n\n      default:\n        break;\n    }\n\n    if (flagToPreventDefault) {\n      event.stopPropagation();\n      event.preventDefault();\n    }\n  }\n\n  protected handleMonthSelectKeydown(event: KeyboardEvent): void {\n    let flagToPreventDefault = false;\n\n    switch (event.key) {\n      case 'Up':\n      case 'ArrowUp':\n        this.moveToPreviousMonth();\n        this.updateTableCellsTabIndex(false);\n        flagToPreventDefault = true;\n        break;\n\n      case 'Down':\n      case 'ArrowDown':\n        this.moveToNextMonth();\n        this.updateTableCellsTabIndex(false);\n        flagToPreventDefault = true;\n        break;\n\n      case 'Left':\n      case 'ArrowLeft':\n      case 'Right':\n      case 'ArrowRight':\n        flagToPreventDefault = true;\n    }\n\n    if (flagToPreventDefault) {\n      event.stopPropagation();\n      event.preventDefault();\n    }\n  }\n\n  protected handleYearSelectKeydown(event: KeyboardEvent): void {\n    let flagToPreventDefault = false;\n\n    switch (event.key) {\n      case 'Up':\n      case 'ArrowUp':\n        this.moveToPreviousYear();\n        this.updateTableCellsTabIndex(false);\n        flagToPreventDefault = true;\n        break;\n\n      case 'Down':\n      case 'ArrowDown':\n        this.moveToNextYear();\n        this.updateTableCellsTabIndex(false);\n        flagToPreventDefault = true;\n        break;\n\n      case 'Left':\n      case 'ArrowLeft':\n      case 'Right':\n      case 'ArrowRight':\n        flagToPreventDefault = true;\n    }\n\n    if (flagToPreventDefault) {\n      event.stopPropagation();\n      event.preventDefault();\n    }\n  }\n\n  protected handleDayClick(event: MouseEvent): void {\n    if (this.isDaySelectable(<HTMLElement>event.currentTarget)) {\n      this.updateCalendarValue(<HTMLTableCellElement>event.currentTarget);\n    }\n\n    event.stopPropagation();\n    event.preventDefault();\n  }\n\n  protected handleDayMouseEnter(event: MouseEvent) {\n    if (this.mode !== 'range' || !this.rangeStart || this.rangeEnd) return;\n\n    const date = this.getDayFromDataDateAttribute(<HTMLTableCellElement>event.currentTarget);\n    if (date && this.rangeStart && !this.rangeEnd && date > this.rangeStart) {\n      this.rangeEndPreview = date;\n    } else {\n      this.rangeEndPreview = null;\n    }\n  }\n\n  /**\n   * Permet d'éviter que la prévisualisation du range ne persiste lorsque le curseur de lasoursi est déplacé hors de\n   * la table\n   */\n  protected handleCalendarMouseLeave() {\n    this.rangeEndPreview = null;\n  }\n\n  protected handleDayKeyDown(event: KeyboardEvent): void {\n    let flagToPreventDefault = false;\n\n    switch (event.key) {\n      case ' ':\n      case 'Enter':\n        if (this.inMinMaxRange(this.focusDay)) {\n          this.updateCalendarValue(<HTMLTableCellElement>event.currentTarget);\n          flagToPreventDefault = true;\n        }\n        break;\n\n      case 'Right':\n      case 'ArrowRight':\n        this.moveFocusToNextDay();\n        flagToPreventDefault = true;\n        break;\n\n      case 'Left':\n      case 'ArrowLeft':\n        this.moveFocusToPreviousDay();\n        flagToPreventDefault = true;\n        break;\n\n      case 'Down':\n      case 'ArrowDown':\n        this.moveFocusToNextWeek();\n        flagToPreventDefault = true;\n        break;\n\n      case 'Up':\n      case 'ArrowUp':\n        this.moveFocusToPreviousWeek();\n        flagToPreventDefault = true;\n        break;\n\n      case 'PageUp':\n        if (event.shiftKey) {\n          this.moveToPreviousYear();\n        } else {\n          this.moveToPreviousMonth();\n        }\n        this.updateTableCellsTabIndex();\n        flagToPreventDefault = true;\n        break;\n\n      case 'PageDown':\n        if (event.shiftKey) {\n          this.moveToNextYear();\n        } else {\n          this.moveToNextMonth();\n        }\n        this.updateTableCellsTabIndex();\n        flagToPreventDefault = true;\n        break;\n\n      case 'Home':\n        this.moveFocusToFirstDayOfWeek();\n        flagToPreventDefault = true;\n        break;\n\n      case 'End':\n        this.moveFocusToLastDayOfWeek();\n        flagToPreventDefault = true;\n        break;\n    }\n\n    if (flagToPreventDefault) {\n      event.stopPropagation();\n      event.preventDefault();\n    }\n  }\n\n  /**\n   * Gestion de la sélection dans la liste déroulante des mois\n   *\n   * @param selectedMonthIndex Index du mois sélectionné (indexage commençant à 1)\n   */\n  protected handleMonthSelect(selectedMonthIndex: number): void {\n    const currentYear = this.focusDay.getFullYear();\n    const currentDay = this.focusDay.getDate();\n\n    const dayToFocus = this.computeDayToFocus(currentYear, selectedMonthIndex, currentDay);\n\n    const targetDate = new Date(currentYear, selectedMonthIndex, dayToFocus);\n\n    this.lastDate = targetDate.getDate();\n    this.focusDay = targetDate;\n\n    this.updateCalendar();\n    this.moveFocusToDay(targetDate);\n  }\n\n  /**\n   * Gestion de la sélection dans la liste déroulante des années\n   *\n   * @param selectedYear Année sélectionnée\n   */\n  protected handleYearSelect(selectedYear: number): void {\n    const currentMonth = this.focusDay.getMonth();\n    const currentDay = this.focusDay.getDate();\n\n    const dayToFocus = this.computeDayToFocus(selectedYear, currentMonth, currentDay);\n    const dateToFocus = new Date(selectedYear, currentMonth, dayToFocus);\n\n    this.lastDate = dateToFocus.getDate();\n    this.focusDay = dateToFocus;\n\n    this.updateCalendar();\n    this.moveFocusToDay(dateToFocus);\n  }\n\n  /**\n   * Détermine si le jour correspondant à la cellule appartient au range en cours de sélection.\n   */\n  //FIXME: à caculer dans un état plutôt\n  protected isInRangePreview(row: number, col: number): boolean {\n    if (this.mode !== 'range' || !this.rangeStart || !this.rangeEndPreview || this.rangeEnd) return false;\n\n    const date = this.getDateFromCell(row, col);\n    if (!date) return false;\n\n    const t = date.getTime();\n    const s = this.rangeStart.getTime();\n    const h = this.rangeEndPreview.getTime();\n\n    return t >= Math.min(s, h) && t <= Math.max(s, h);\n  }\n\n  private getDateFromCell(row: number, col: number): Date | null {\n    const cellIndex = row * 7 + col;\n    const dayNumber = cellIndex - this.firstDayOffset + 1;\n\n    if (dayNumber < 1 || dayNumber > this.daysInMonth) {\n      return null; // cellule hors mois courant\n    }\n    const currentMonth = this.focusDay.getMonth();\n    return new Date(this.currentYear, currentMonth, dayNumber);\n  }\n\n  /**\n   * Permet de calculer si le jour a focus est bien disponible dans le mois et l'année de destination après sélection\n   * dans la liste déroulante.\n   *\n   * Dans le cas où l'on se trouve le 29 Février 2024 et où l'on change d'année grâce à la liste déroulante à 2023,\n   * le jour a focus devrait être le 28 Février 2023.\n   *\n   * @param currentYear Année cible\n   * @param selectedMonthIndex Mois cible\n   * @param currentDay Jour courant dans le calendrier\n   * @returns Le numéro du jour à focus\n   */\n  private computeDayToFocus(currentYear: number, selectedMonthIndex: number, currentDay: number): number {\n    const numberOfDaysInMonth = this.getNumberOfDaysInMonth(currentYear, selectedMonthIndex);\n    const dayToFocus = numberOfDaysInMonth < currentDay ? numberOfDaysInMonth : currentDay;\n    return dayToFocus;\n  }\n\n  /**\n   * Formatage de la valeur dans la langue courante\n   * @param value Valeur au format ISO ou dans la langue courante\n   */\n  private reformatValue(value: string | undefined): string | undefined {\n    if (value === undefined || value === null) {\n      return undefined;\n    }\n\n    const parsedDate = DateUtils.parse(this.codeLang, value);\n\n    const parsedIsoDate = DateUtils.parseDateIso(value);\n\n    if (parsedIsoDate === undefined && parsedDate === undefined) {\n      return undefined;\n    }\n\n    return DateUtils.format(this.codeLang, parsedIsoDate ?? parsedDate);\n  }\n\n  /**\n   * Gestion du changement de langue dans le composant.\n   *\n   * @param code Code de la locale à prendre en compte\n   */\n  private onLangChange(code: string): void {\n    this.prevMonthLabel = this.i18n.t('calendar.prevMonth');\n    this.nextMonthLabel = this.i18n.t('calendar.nextMonth');\n    this.monthSelectLabel = this.i18n.t('calendar.monthSelect');\n    this.yearSelectLabel = this.i18n.t('calendar.yearSelect');\n\n    this.computeMonthSelectOptions();\n    this.computeYearSelectOptions();\n    this.updateMonthTranslations();\n\n    // Reformatage de l'input\n    if (this.mode === 'single') {\n      const date = DateUtils.parse(this.prevCodeLang, this.value as string | undefined);\n      const newValue = DateUtils.format(code, date);\n      this.setSingleModeNewValue(newValue);\n      this.prevCodeLang = code;\n      this.initializeCalendar();\n    } else if (this.mode === 'range') {\n    }\n  }\n\n  /**\n   * Mets à jour l'ensemble du Date Picker\n   */\n  private updateCalendar(): void {\n    this.updateMonthAndYearSelects();\n    // mise à jour des états requis pour la gestion du hover lors de la sélection d'un range\n    const firstDayOfMonth = new Date(this.focusDay.getFullYear(), this.focusDay.getMonth(), 1);\n    if (this.isEnglishLocale) {\n      // Sunday first\n      this.firstDayOffset = firstDayOfMonth.getDay();\n    } else {\n      // Monday first\n      this.firstDayOffset = (firstDayOfMonth.getDay() + 6) % 7;\n    }\n\n    const currentMonthStartingColumn = this.getCurrentMonthStartingColumn(firstDayOfMonth);\n    const firstDisplayedDayOnCalendar = firstDayOfMonth.setDate(firstDayOfMonth.getDate() - currentMonthStartingColumn);\n\n    let dateOfCellForGridLoop = new Date(firstDisplayedDayOnCalendar);\n\n    for (let i = 0; i < this.dayCells.length; i++) {\n      const isDayFromCurrentMonth = dateOfCellForGridLoop.getMonth() !== this.focusDay.getMonth();\n\n      this.updateCell(this.dayCells[i], isDayFromCurrentMonth, dateOfCellForGridLoop);\n\n      dateOfCellForGridLoop.setDate(dateOfCellForGridLoop.getDate() + 1);\n    }\n\n    this.calendarChange.emit(new Date(this.currentYear, this.currentMonthIndex));\n  }\n\n  /**\n   * Détermine la colonne à partir de laquelle le mois commence dans le calendrier.\n   *\n   * Cette colonne est dépendante du jour de la semaine mais également de la locale : le calendrier anglais a comme\n   * première colonne le dimanche, contrairement au calendrier français pour lequel la première colonne est le lundi.\n   *\n   * @param firstDayOfMonth Index du premier jour de la semaine\n   * @returns Index de la colonne où commence le mois\n   */\n  private getCurrentMonthStartingColumn(firstDayOfMonth: Date): number {\n    if (this.isEnglishLocale) {\n      return firstDayOfMonth.getDay();\n    } else if (firstDayOfMonth.getDay() - 1 === -1) {\n      return 6;\n    } else {\n      return firstDayOfMonth.getDay() - 1;\n    }\n  }\n\n  /**\n   * Mise à jour des valeurs des deux listes déroulantes, mois et année.\n   */\n  private updateMonthAndYearSelects(): void {\n    this.currentMonthIndex = this.focusDay.getMonth();\n    this.currentYear = this.focusDay.getFullYear();\n  }\n\n  /**\n   * Mise à jour de l'état d'une cellule de la table en fonction de :\n   * - si elle se trouve dans le mois,\n   * - si elle se trouve en dehors des dates limites,\n   * - si elle est sélectionnée.\n   *\n   * @param tdElement Une cellule td du tableau\n   * @param outsideOfCurrentMonth boolean true si le jour fait partie du mois ou non\n   * @param cellDate jour correspondant à la cellule\n   */\n  private updateCell(tdElement: HTMLTableCellElement, outsideOfCurrentMonth: boolean, cellDate: Date): void {\n    this.resetCellAttributes(tdElement);\n\n    this.setCellDataDate(cellDate, tdElement);\n\n    if (!this.inMinMaxRange(cellDate)) {\n      this.setCellAsDisabled(tdElement);\n    } else if (outsideOfCurrentMonth) {\n      this.setCellAsOutOfBounds(tdElement);\n    }\n\n    const firstDateOfPeriod = this.value ? DateUtils.parse(this.codeLang, this.value[0]) : undefined;\n    const lastDateOfPeriod = this.value ? DateUtils.parse(this.codeLang, this.value[1]) : undefined;\n    const isSingleModeSelectedDay = this.mode === 'single' && DateUtils.isSameDay(cellDate, this.selectedDay);\n    const isRangeModeSelectedDay =\n      this.mode === 'range' && DateUtils.isSameDay(cellDate, this.selectedDay) && this.value![1] === undefined;\n    const isInsideRange =\n      this.mode === 'range' && RangeUtils.isInRange(cellDate, this.value as DsfrRangeModel, this.codeLang);\n    const isFirstDayOfPeriod = this.mode === 'range' && DateUtils.isSameDay(cellDate, firstDateOfPeriod);\n    const isLastDayOfPeriod = this.mode === 'range' && DateUtils.isSameDay(cellDate, lastDateOfPeriod);\n    const isBeforeFirstDayOfPeriod =\n      this.mode === 'range' && RangeUtils.isBeforeRangeFirstDate(cellDate, this.value as DsfrRangeModel, this.codeLang);\n\n    if (isSingleModeSelectedDay || isRangeModeSelectedDay || isInsideRange) {\n      this.setCellAsSelected(tdElement);\n    }\n\n    if (DateUtils.isSameDay(cellDate, this.focusDay)) {\n      this.setCellAsFocusable(tdElement);\n    }\n\n    if (this.mode === 'single' || (this.mode === 'range' && isRangeModeSelectedDay)) {\n      this.setCellText(tdElement, cellDate);\n    }\n\n    if (isInsideRange && !isFirstDayOfPeriod && !isLastDayOfPeriod) {\n      this.setCellAsInsideRangeBoundary(tdElement);\n    }\n\n    if (this.mode === 'range' && !isRangeModeSelectedDay) {\n      const positionRelativeToRange = isBeforeFirstDayOfPeriod ? 'beforeStart' : 'afterStart';\n      this.setCellText(tdElement, cellDate, positionRelativeToRange);\n    }\n  }\n\n  private setCellAsFocusable(tdElement: HTMLTableCellElement) {\n    tdElement.tabIndex = 0;\n  }\n\n  private setCellAsSelected(tdElement: HTMLTableCellElement) {\n    tdElement.setAttribute('aria-selected', 'true');\n  }\n\n  private setCellAsInsideRangeBoundary(tdElement: HTMLTableCellElement) {\n    tdElement.setAttribute('data-range-inside-boundary', 'true');\n  }\n\n  private setCellDataDate(cellDate: Date, tdElement: HTMLTableCellElement) {\n    const numericDayOfTheMonth = cellDate.getDate();\n    const monthCalendarIndex = cellDate.getMonth() + 1;\n    const yyyy = cellDate.getFullYear().toString();\n    const mm = monthCalendarIndex <= 9 ? `0${monthCalendarIndex}` : monthCalendarIndex.toString();\n    const dd = numericDayOfTheMonth <= 9 ? `0${numericDayOfTheMonth}` : numericDayOfTheMonth.toString();\n\n    tdElement.setAttribute('data-date', `${yyyy}-${mm}-${dd}`);\n  }\n\n  private setCellText(\n    tdElement: HTMLTableCellElement,\n    cellDate: Date,\n    positionRelativeToRange?: 'beforeStart' | 'afterStart',\n  ) {\n    // daySpan est un span caché ('.fr-sr-only') permettant la vocalisation du jour de la semaine au focus d'une date.\n    // numberSpan est la partie visible dans la grille représentant le nombre du jour.\n    const [daySpan, numberSpan, rangeSpan] = [\n      tdElement.getElementsByTagName('span')[0],\n      tdElement.getElementsByTagName('span')[1],\n      tdElement.getElementsByTagName('span')[2],\n    ];\n\n    daySpan.textContent = `${this.i18n.t('calendar.days')[cellDate.getDay()]} `;\n    numberSpan.textContent = cellDate.getDate().toString();\n\n    if (positionRelativeToRange === 'beforeStart' || (this.value && this.value[0] && this.value[1])) {\n      rangeSpan.textContent = ' sélectionner comme date de début';\n    }\n\n    if (positionRelativeToRange === 'afterStart' && this.value && !!this.value[0] && !this.value[1]) {\n      rangeSpan.textContent = ' sélectionner comme date de fin';\n    }\n\n    if (!positionRelativeToRange) {\n      rangeSpan.textContent = '';\n    }\n  }\n\n  private setCellAsOutOfBounds(tdElement: HTMLTableCellElement) {\n    tdElement.classList.add('out-of-month');\n  }\n\n  private setCellAsDisabled(tdElement: HTMLTableCellElement) {\n    tdElement.classList.add('disabled');\n    tdElement.setAttribute('aria-disabled', 'true');\n  }\n\n  /**\n   * Suppression des éléments ayant pu être attribués durant le rendu de la grille\n   *\n   * @param tdElement\n   */\n  private resetCellAttributes(tdElement: HTMLTableCellElement): void {\n    tdElement.tabIndex = -1;\n    tdElement.removeAttribute('aria-selected');\n    tdElement.classList.remove('disabled', 'out-of-month', 'inside-range');\n    tdElement.removeAttribute('aria-disabled');\n    tdElement.removeAttribute('data-range-inside-boundary');\n  }\n\n  /**\n   * Initie le changement de focus de la date.\n   *\n   * @param targetDate Date cible attendue\n   */\n  private moveFocusToDay(targetDate: Date): void {\n    const focusDayMemory = this.focusDay;\n\n    this.focusDay = targetDate;\n\n    if (\n      focusDayMemory.getMonth() !== this.focusDay.getMonth() ||\n      focusDayMemory.getFullYear() !== this.focusDay.getFullYear()\n    ) {\n      this.updateCalendar();\n    }\n\n    // Gestion du hover sur la sélection d'un range\n    if (this.mode === 'range') {\n      if (this.focusDay && this.rangeStart && !this.rangeEnd && this.focusDay > this.rangeStart) {\n        this.rangeEndPreview = this.focusDay;\n      } else {\n        this.rangeEndPreview = null;\n      }\n    }\n\n    this.updateTableCellsTabIndex();\n  }\n\n  /**\n   * Met à jour le tabindex de toutes les cellules de la grille.\n   *\n   * Nécessaire pour rendre un élement de la table focusable.\n   *\n   * @param autofocus Permet de forcer le focus sur l'élément défini comme étant à tabindex 0. Valeur par défaut à true.\n   */\n  private updateTableCellsTabIndex(autofocus = true): void {\n    for (let i = 0; i < this.dayCells.length; i++) {\n      const dayNode = this.dayCells[i];\n      const day = this.getDayFromDataDateAttribute(dayNode);\n\n      dayNode.tabIndex = -1;\n\n      if (DateUtils.isSameDay(day, this.focusDay) && this.inMinMaxRange(day)) {\n        dayNode.tabIndex = 0;\n\n        if (autofocus) {\n          dayNode.focus();\n        }\n      }\n    }\n  }\n\n  /**\n   * Force le focus sur la limite min ou max d'un mois pour éviter que le focus soit indisponible.\n   *\n   * Exemple: L'utilisateur sélectionne le 17 Juillet 2024. Il décide ensuite de changer de mois via la liste\n   * déroulante et cible Octobre. Cependant, la date max donnée au date picker est le 10 Octobre 2024. Etant incapable\n   * de focus cette date au retour du focus dans la grille, la nouvelle date de focus bascule alors à la date max déterminée,\n   * cad. le 10 Octobre 2024.\n   *\n   * @param boundary type du boundary à prendre en compte, entre le min et le max\n   */\n  private autoFocusBoundaryDate(boundary: 'min' | 'max'): void {\n    const boundaryDate = boundary === 'min' ? DateUtils.parseDateIso(this.min!) : DateUtils.parseDateIso(this.max!);\n\n    for (let i = 0; i < this.dayCells.length; i++) {\n      const dayNode = this.dayCells[i];\n      const day = this.getDayFromDataDateAttribute(dayNode);\n\n      if (boundaryDate && DateUtils.isSameDay(day, boundaryDate)) {\n        dayNode.tabIndex = 0;\n\n        dayNode.focus();\n      }\n    }\n  }\n\n  private initializeCalendar(): void {\n    this.computeInitialDate();\n    this.lastDate = this.focusDay.getDate();\n    this.updateCalendar();\n\n    if (this.autofocus) {\n      this.focusDate();\n    }\n  }\n\n  private getNumberOfDaysInMonth(year: number, monthIndex: number): number {\n    return new Date(year, monthIndex + 1, 0).getDate();\n  }\n\n  /**\n   * Calcule la date cible en fonction de la date actuelle et du nombre de mois à ajouter ou enlever à cette dernière.\n   *\n   * @param currentDate Date actuelle\n   * @param monthsOffset Nombre de mois à ajouter ou enlever à la date actuelle\n   * @returns La date cible\n   */\n  private computeTargetDateWithMonthOffset(currentDate: Date, monthsOffset: number): Date {\n    const getDays = (year: number, month: number) => new Date(year, month, 0).getDate();\n\n    const isPrev = monthsOffset < 0;\n    const numYears = Math.trunc(Math.abs(monthsOffset) / 12);\n    monthsOffset = Math.abs(monthsOffset) % 12;\n\n    const newYear = isPrev ? currentDate.getFullYear() - numYears : currentDate.getFullYear() + numYears;\n\n    const newMonth = isPrev ? currentDate.getMonth() - monthsOffset : currentDate.getMonth() + monthsOffset;\n\n    const newDate = new Date(newYear, newMonth, 1);\n\n    const daysInMonth = getDays(newDate.getFullYear(), newDate.getMonth() + 1);\n\n    this.lastDate = this.lastDate ? this.lastDate : currentDate.getDate();\n\n    if (this.lastDate > daysInMonth) {\n      newDate.setDate(daysInMonth);\n    } else {\n      newDate.setDate(this.lastDate);\n    }\n\n    return newDate;\n  }\n\n  private moveToNextYear(): void {\n    this.focusDay = this.computeTargetDateWithMonthOffset(this.focusDay, 12);\n    this.updateCalendar();\n  }\n\n  private moveToPreviousYear(): void {\n    this.focusDay = this.computeTargetDateWithMonthOffset(this.focusDay, -12);\n    this.updateCalendar();\n  }\n\n  private moveToNextMonth(): void {\n    this.focusDay = this.computeTargetDateWithMonthOffset(this.focusDay, 1);\n    this.updateCalendar();\n  }\n\n  private moveToPreviousMonth(): void {\n    this.focusDay = this.computeTargetDateWithMonthOffset(this.focusDay, -1);\n    this.updateCalendar();\n  }\n\n  private moveFocusToNextDay(): void {\n    const d = new Date(this.focusDay);\n    d.setDate(d.getDate() + 1);\n\n    if (this.inMinMaxRange(d)) {\n      this.lastDate = d.getDate();\n      this.moveFocusToDay(d);\n    }\n  }\n\n  private moveFocusToNextWeek(): void {\n    const d = new Date(this.focusDay);\n    d.setDate(d.getDate() + 7);\n\n    if (this.inMinMaxRange(d)) {\n      this.lastDate = d.getDate();\n      this.moveFocusToDay(d);\n    }\n  }\n\n  private moveFocusToPreviousDay(): void {\n    const d = new Date(this.focusDay);\n    d.setDate(d.getDate() - 1);\n\n    if (this.inMinMaxRange(d)) {\n      this.lastDate = d.getDate();\n      this.moveFocusToDay(d);\n    }\n  }\n\n  private moveFocusToPreviousWeek(): void {\n    const d = new Date(this.focusDay);\n    d.setDate(d.getDate() - 7);\n\n    if (this.inMinMaxRange(d)) {\n      this.lastDate = d.getDate();\n      this.moveFocusToDay(d);\n    }\n  }\n\n  private moveFocusToFirstDayOfWeek(): void {\n    const d = new Date(this.focusDay);\n    d.setDate(d.getDate() - d.getDay());\n    this.lastDate = d.getDate();\n    this.moveFocusToDay(d);\n  }\n\n  private moveFocusToLastDayOfWeek(): void {\n    const d = new Date(this.focusDay);\n    d.setDate(d.getDate() + (6 - d.getDay()));\n    this.lastDate = d.getDate();\n    this.moveFocusToDay(d);\n  }\n\n  // Day methods\n\n  /**\n   * Vérifie que le jour cliqué est sélectionnable en fonction de si il est disabled et de si le jour cliqué est\n   * le même que celui en cours de sélection en mode \"range\".\n   *\n   * @param domNode La date cliquée\n   * @returns Un booléen confirmant que la date cliquée est sélectionnable\n   */\n  private isDaySelectable(domNode: HTMLElement): boolean {\n    const isDisabled = domNode.classList.contains('disabled');\n    const clickedDay = this.getDayFromDataDateAttribute(domNode);\n    const isRangeModeSameDayClick = this.mode === 'range' && DateUtils.isSameDay(clickedDay, this.selectedDay);\n\n    return !isDisabled && !isRangeModeSameDayClick;\n  }\n\n  private getDayFromDataDateAttribute(dayNode: HTMLElement): Date {\n    const dataDate = dayNode.getAttribute('data-date');\n    const parts = dataDate ? dataDate.split('-') : [];\n    return parts.length >= 3 ? new Date(parseInt(parts[0]), parseInt(parts[1]) - 1, parseInt(parts[2])) : new Date();\n  }\n\n  /**\n   * Mets à jour la valeur du composant et émets un événement de type DsfrDateEvent.\n   * Cette emission peut être omise via le paramètre booléen skipEmission, notamment à l'initialisation du composant.\n   * @param value\n   * @private\n   */\n  private setSingleModeNewValue(value: string | undefined, skipEmission = false): void {\n    this.value = value;\n    const date = DateUtils.parse(this.codeLang, this.value);\n\n    if (!skipEmission) {\n      this.dateChange.emit({ value: this.value, date: date });\n    }\n  }\n\n  /**\n   * Mets à jour la valeur de période du composant en fonction de la nouvelle date donnée, et émets un événement de type DsfrDateEvent.\n   * Cette emission peut être omise via le paramètre booléen skipEmission, notamment à l'initialisation du composant.\n   * @private\n   */\n  private setRangeModeNewIndividualValue(value: string, skipEmission = false): void {\n    const isFullRange = this.setIndividualRangeValue(value);\n\n    if (!skipEmission && isFullRange) {\n      this.dateChange.emit({ value: this.value, date: undefined });\n    }\n  }\n\n  /**\n   * Mets entièrement à jour la valeur de période du composant et émets un événement de type DsfrDateEvent.\n   * Cette emission peut être omise via le paramètre booléen skipEmission, notamment à l'initialisation du composant.\n   * @param value\n   * @private\n   */\n  private setNewRangeValue(value: DsfrRangeModel, skipEmission = false): void {\n    this.value = value;\n\n    if (!skipEmission && !this.value[0] && !this.value[1]) {\n      this.dateChange.emit({ value: this.value, date: undefined });\n    }\n  }\n\n  /**\n   * Valorise la date de l'input suite à la sélection d'une date dans le calendrier\n   * @param domNode cellule td du calendrier telle que 'data-date' contienne la date ISO, ex : data-date=\"2024-05-28\".\n   * - i18n : le code de formatage fait appel à DateUtils\n   */\n  private updateCalendarValue(domNode: HTMLTableCellElement): void {\n    this.selectedDay = this.getDayFromDataDateAttribute(domNode);\n\n    if (this.mode === 'range') {\n      // Gestion du hover lors de la saisie d'un range\n      if (!this.rangeStart || this.rangeEnd || this.selectedDay < this.rangeStart) {\n        // Nouvelle sélection\n        this.rangeStart = this.selectedDay;\n        this.rangeEnd = null;\n        this.rangeEndPreview = null;\n      } else {\n        // Fin du range\n        this.rangeEnd = this.selectedDay;\n        this.rangeEndPreview = null;\n      }\n    }\n\n    this.focusDay = this.selectedDay;\n\n    const newValue = DateUtils.format(this.codeLang, this.selectedDay);\n\n    if (this.mode === 'range') {\n      this.setRangeModeNewIndividualValue(newValue);\n    } else {\n      this.setSingleModeNewValue(newValue);\n    }\n\n    this.updateCalendar();\n  }\n\n  /**\n   * Positionne la date du calendrier à partir de\n   * - i18n : la date est obtenue à partir de DateUtils\n   */\n  private computeInitialDate(): void {\n    const hasInitialValueInRangeMode = this.value && this.value[0];\n\n    if (this.mode === 'single') {\n      const day = DateUtils.parse(this.codeLang, this.value as string | undefined);\n      const isOnBoundary = day ? this.isInBounds(day) : false;\n\n      this.initializeFocusAndSelectedDay(day, isOnBoundary);\n    } else if (this.mode === 'range' && hasInitialValueInRangeMode) {\n      const firstDay = DateUtils.parse(this.codeLang, this.value![0]);\n      const isOnBoundary = firstDay ? this.isInBounds(firstDay) : false;\n\n      this.initializeFocusAndSelectedDay(firstDay, isOnBoundary);\n    } else if (this.mode === 'range' && !hasInitialValueInRangeMode) {\n      this.focusDay = new Date();\n    }\n  }\n\n  private initializeFocusAndSelectedDay(day: Date | undefined, isOnBoundary: boolean): void {\n    if (day && isOnBoundary) {\n      this.focusDay = day;\n      this.selectedDay = new Date(this.focusDay);\n    } else if (day && !isOnBoundary) {\n      this.focusDay = new Date();\n      this.selectedDay = new Date(day);\n    } else {\n      // If not a valid date (MM/DD/YY) initialize with todays date\n      this.focusDay = new Date();\n      this.selectedDay = new Date(0, 0, 1);\n    }\n  }\n\n  /**\n   * @param date date\n   * @returns true si la data 'd' est dans l'intervalle [min, max] du cou\n   */\n  private inMinMaxRange(date: Date): boolean {\n    const minDate = this.min ? DateUtils.parseDateIso(this.min) : undefined;\n    const maxDate = this.max ? DateUtils.parseDateIso(this.max) : undefined;\n\n    return (\n      (minDate === undefined || minDate < date || DateUtils.isSameDay(date, minDate)) &&\n      (maxDate === undefined || date < maxDate || DateUtils.isSameDay(date, maxDate))\n    );\n  }\n\n  private computeMonthSelectOptions(): void {\n    const translatedMonths = DateUtils.arr(this.i18n, this.loggerService, 'calendar.months');\n\n    this.monthSelectOptions = translatedMonths.map((monthLabel, i) => ({\n      label: monthLabel,\n      value: i, // Pour information, en JS, les mois sont indexés à partir de 0 contrairement aux jours et années\n    }));\n  }\n\n  private computeYearSelectOptions(): void {\n    const currentYear = new Date().getFullYear();\n    const defaultMinOffset = 100;\n    const defaultMaxOffset = 100;\n    const minYear = this.min ? new Date(this.min).getFullYear() : undefined;\n    const maxYear = this.max ? new Date(this.max).getFullYear() : undefined;\n\n    const lowerBoundYear = minYear ?? currentYear - defaultMinOffset;\n    const higherBoundYear = maxYear ?? currentYear + defaultMaxOffset;\n\n    const options: DsfrSelectOption[] = [];\n\n    for (let year = lowerBoundYear; year <= higherBoundYear; year++) {\n      options.push({ label: year.toString(), value: year });\n    }\n\n    this.yearSelectOptions = options;\n  }\n\n  private updateMonthTranslations(): void {\n    this.translatedMonths = DateUtils.arr(this.i18n, this.loggerService, 'calendar.months');\n    this.translatedMonthAbbreviations = DateUtils.arr(this.i18n, this.loggerService, 'calendar.monthsAbbr');\n  }\n\n  private isValidIso(boundaryString: string): boolean {\n    const dateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n    return dateRegex.test(boundaryString);\n  }\n\n  /**\n   * Dans le cas d'un changement de mois ou d'année dans le calendrier, cette fonction détermine le type de butée atteinte\n   * dans le cas ou le nouveau focusDay se trouverait en dehors des dates min ou max, uniquement dans un mois contenant lesdits min ou max.\n   *\n   * Exemple: Le focusDay est le 20 Juin 2024 et la date max le 15 Juillet 2024. Si l'utilisateur navigue vers le mois de Juillet via la\n   * liste déroulante ou la flèche de \"Mois suivant\", getReachedBoundary retourne 'max', qui est le type de butée atteinte.\n   *\n   * @returns Retourne le type de butée atteinte (min ou max) ou undefined si aucune butée n'est atteinte ou qu'aucun focusDay n'est valide pour\n   * cette date.\n   */\n  private getReachedBoundary(): undefined | 'min' | 'max' {\n    const minDate = this.min ? DateUtils.parseDateIso(this.min) : undefined;\n    const maxDate = this.max ? DateUtils.parseDateIso(this.max) : undefined;\n\n    if (!this.min && !this.max) {\n      return undefined;\n    }\n\n    if (\n      minDate &&\n      this.focusDay.getFullYear() === minDate.getFullYear() &&\n      this.focusDay.getMonth() === minDate.getMonth() &&\n      this.focusDay.getDate() < minDate.getDate()\n    ) {\n      return 'min';\n    }\n\n    if (\n      maxDate &&\n      this.focusDay.getFullYear() === maxDate.getFullYear() &&\n      this.focusDay.getMonth() === maxDate.getMonth() &&\n      this.focusDay.getDate() > maxDate.getDate()\n    ) {\n      return 'max';\n    }\n\n    return undefined;\n  }\n\n  private computeMonoYearAndMonoMonth() {\n    const hasMinAndMax = !!this.min && !!this.max;\n\n    this.isMonoYear =\n      hasMinAndMax &&\n      DateUtils.parseDateIso(this.min!)?.getFullYear() === DateUtils.parseDateIso(this.max!)?.getFullYear();\n\n    this.isMonoMonth =\n      hasMinAndMax &&\n      this.isMonoYear &&\n      DateUtils.parseDateIso(this.min!)?.getMonth() === DateUtils.parseDateIso(this.max!)?.getMonth();\n  }\n\n  /**\n   * Vérifie si la date active du composant se trouve dans les limites données du composant.\n   *\n   * @param date\n   * @returns Un booléen indiquant si la date se trouve bien entre les limites minimum et maximum données.\n   */\n  private isInBounds(date: Date): boolean {\n    const minDate = this.min ? DateUtils.parseDateIso(this.min) : undefined;\n    const maxDate = this.max ? DateUtils.parseDateIso(this.max) : undefined;\n\n    if (!minDate && !maxDate) {\n      return true;\n    } else if (maxDate && !minDate) {\n      return date.getTime() <= maxDate.getTime();\n    } else if (minDate && !maxDate) {\n      return date.getTime() >= minDate.getTime();\n    } else {\n      return date.getTime() <= maxDate!.getTime() && date.getTime() >= minDate!.getTime();\n    }\n  }\n\n  /**\n   * Attribue la valeur sélectionnée à l'index correspondant dans `value`, en fonction de si il doit être remis\n   * à jour, et de si l'une des deux valeurs est déjà prise en compte.\n   *\n   * @param newValue\n   * @param reset\n   * @returns Un booléen indiquant si la plage de date est complètement formée.\n   */\n  private setIndividualRangeValue(newValue: string): boolean {\n    const newDate = DateUtils.parse(this.codeLang, newValue);\n\n    if (!newDate) {\n      this.value = [undefined, undefined];\n      this.loggerService.warn(`The provided range value cannot be handled: ${newValue}`);\n\n      return false;\n    }\n\n    if (!this.value || !this.value[0] || (Array.isArray(this.value) && this.value[0] && this.value[1])) {\n      this.value = [newValue, undefined];\n\n      return false;\n    }\n\n    const firstDate = DateUtils.parse(this.codeLang, this.value[0]);\n\n    if (Array.isArray(this.value) && firstDate!.getTime() < newDate!.getTime()) {\n      this.value[1] = newValue;\n\n      return true;\n    }\n\n    this.value = [newValue, undefined];\n\n    return false;\n  }\n}\n\nexport type DsfrRangeModel = [string | undefined, string | undefined];\nexport type DsfrDefinedRangeModel = [string, string];\nexport type DsfrCalendarMode = 'single' | 'range';\n","<header class=\"header\">\n  <button\n    type=\"button\"\n    class=\"prev-month fr-btn fr-btn--tertiary-no-outline fr-icon-arrow-left-line\"\n    [title]=\"prevMonthLabel\"\n    (click)=\"handlePreviousMonthButton($event)\"\n    (keydown)=\"handlePreviousMonthButton($event)\"\n    #previousMonth\n    data-testid=\"datepicker-prev-month\">\n    <span class=\"fr-sr-only\">{{ prevMonthLabel }}</span>\n  </button>\n\n  <div class=\"header__select-container\">\n    <dsfr-form-select\n      [value]=\"currentMonthIndex\"\n      [options]=\"monthSelectOptions\"\n      [label]=\"monthSelectLabel\"\n      [labelSrOnly]=\"true\"\n      [disabled]=\"isMonoMonth\"\n      (keydown)=\"handleMonthSelectKeydown($event)\"\n      (selectChange)=\"handleMonthSelect($event)\"\n      #monthSelect\n      data-testid=\"datepicker-month-select\"></dsfr-form-select>\n\n    <div class=\"select-displayer\" aria-hidden=\"true\">\n      {{ translatedMonthAbbreviations[currentMonthIndex] }}&nbsp;\n      @if (!isMonoMonth) {\n        <span aria-hidden=\"true\" class=\"fr-icon-arrow-down-s-line\"></span>\n      }\n    </div>\n    <span aria-live=\"polite\" class=\"fr-sr-only\">\n      {{ translatedMonths[currentMonthIndex] }}\n    </span>\n  </div>\n\n  <div class=\"header__select-container\">\n    <dsfr-form-select\n      [value]=\"currentYear\"\n      [options]=\"yearSelectOptions\"\n      [label]=\"yearSelectLabel\"\n      [labelSrOnly]=\"true\"\n      [disabled]=\"isMonoYear\"\n      (keydown)=\"handleYearSelectKeydown($event)\"\n      (selectChange)=\"handleYearSelect($event)\"\n      #yearSelect\n      data-testid=\"datepicker-year-select\"></dsfr-form-select>\n\n    <div class=\"select-displayer\" aria-live=\"polite\">\n      {{ currentYear }}&nbsp;\n      @if (!isMonoYear) {\n        <span aria-hidden=\"true\" class=\"fr-icon-arrow-down-s-line\"></span>\n      }\n    </div>\n  </div>\n\n  <button\n    type=\"button\"\n    class=\"next-month fr-btn fr-btn--tertiary-no-outline fr-icon-arrow-right-line\"\n    [title]=\"nextMonthLabel\"\n    (click)=\"handleNextMonthButton($event)\"\n    (keydown)=\"handleNextMonthButton($event)\"\n    #nextMonth\n    data-testid=\"datepicker-next-month\">\n    <span class=\"fr-sr-only\">{{ nextMonthLabel }}</span>\n  </button>\n</header>\n\n<div class=\"table-wrap\" (mouseleave)=\"handleCalendarMouseLeave()\">\n  <table class=\"dates\" role=\"grid\" [attr.aria-labelledby]=\"ariaLabelledBy\">\n    <thead>\n      <tr>\n        @if (isEnglishLocale) {\n          <th scope=\"col\" abbr=\"{{ 'calendar.days[0]' | dsfrI18n }}\">{{ 'calendar.daysAbbr[0]' | dsfrI18n }}</th>\n        }\n        <th scope=\"col\" abbr=\"{{ 'calendar.days[1]' | dsfrI18n }}\">{{ 'calendar.daysAbbr[1]' | dsfrI18n }}</th>\n        <th scope=\"col\" abbr=\"{{ 'calendar.days[2]' | dsfrI18n }}\">{{ 'calendar.daysAbbr[2]' | dsfrI18n }}</th>\n        <th scope=\"col\" abbr=\"{{ 'calendar.days[3]' | dsfrI18n }}\">{{ 'calendar.daysAbbr[3]' | dsfrI18n }}</th>\n        <th scope=\"col\" abbr=\"{{ 'calendar.days[4]' | dsfrI18n }}\">{{ 'calendar.daysAbbr[4]' | dsfrI18n }}</th>\n        <th scope=\"col\" abbr=\"{{ 'calendar.days[5]' | dsfrI18n }}\">{{ 'calendar.daysAbbr[5]' | dsfrI18n }}</th>\n        <th scope=\"col\" abbr=\"{{ 'calendar.days[6]' | dsfrI18n }}\">{{ 'calendar.daysAbbr[6]' | dsfrI18n }}</th>\n        @if (!isEnglishLocale) {\n          <th scope=\"col\" abbr=\"{{ 'calendar.days[0]' | dsfrI18n }}\">{{ 'calendar.daysAbbr[0]' | dsfrI18n }}</th>\n        }\n      </tr>\n    </thead>\n\n    <tbody #tbody>\n      @for (row of rows; track $index; let rowIndex = $index) {\n        <tr>\n          @for (column of columns; track $index; let colIndex = $index) {\n            <td\n              tabindex=\"-1\"\n              (click)=\"handleDayClick($event)\"\n              (keydown)=\"handleDayKeyDown($event)\"\n              (mouseenter)=\"handleDayMouseEnter($event)\"\n              [class.in-range-preview]=\"isInRangePreview(rowIndex, colIndex)\"\n              #td>\n              <!-- Annonce du jour -->\n              <span class=\"fr-sr-only\"></span>\n              <!-- Représentation visuelle du nombre de la semaine -->\n              <span></span>\n              <!-- Annonce de début ou fin de période en mode range -->\n              <span class=\"fr-sr-only\"></span>\n            </td>\n          }\n        </tr>\n      }\n    </tbody>\n  </table>\n</div>\n","import { A11yModule } from '@angular/cdk/a11y';\n\nimport {\n  AfterViewInit,\n  Component,\n  ElementRef,\n  EventEmitter,\n  Input,\n  OnDestroy,\n  Output,\n  ViewChild,\n  ViewEncapsulation,\n  inject,\n} from '@angular/core';\nimport {\n  DsfrButtonModule,\n  DsfrI18nPipe,\n  DsfrI18nService,\n  Language,\n  LoggerService,\n  newUniqueId,\n} from '@edugouvfr/ngx-dsfr';\nimport { Subscription } from 'rxjs';\nimport { EduClickOutsideDirective } from '../../shared';\nimport { DsfrDateEvent } from '../../shared/models/date-event';\nimport { DateUtils } from '../../shared/utils/date/date-utils';\nimport { DsfrCalendarComponent, DsfrCalendarMode, DsfrRangeModel } from '../calendar.component';\nimport { MESSAGES_EN } from '../i18n/messages.en';\nimport { MESSAGES_FR } from '../i18n/messages.fr';\n\n@Component({\n  selector: 'dsfr-ext-calendar-modal, dsfrx-calendar-modal',\n  encapsulation: ViewEncapsulation.None,\n  templateUrl: './calendar-modal.component.html',\n  styleUrls: ['./calendar-modal.component.scss'],\n  imports: [DsfrCalendarComponent, EduClickOutsideDirective, A11yModule, DsfrButtonModule, DsfrI18nPipe],\n})\nexport class DsfrCalendarModalComponent implements AfterViewInit, OnDestroy {\n  /**\n   * Date minimale inclue. Doit être au format IS0-8601 : AAAA-MM-JJ.\n   * Ce paramètre peut être utilisé seul ou avec la propriété max.\n   */\n  @Input() min = '';\n\n  /**\n   * Date maximale inclue. Doit être au format IS0-8601 : AAAA-MM-JJ.\n   * Ce paramètre peut être utilisé seul ou avec la propriété min.\n   */\n  @Input() max = '';\n\n  /**\n   * Valeur de l'attribut aria-label du bouton d'ouverture de la modale.\n   */\n  @Input({ required: true }) ariaLabel = '';\n\n  /**\n   * Message du `tooltip` (attribut `title` du bouton) ou ajout d'un `span` en `sr-only` si pas de label.\n   */\n  @Input({ required: true }) tooltipMessage = '';\n\n  /**\n   * Valeur de l'attribut disabled du bouton d'ouverture de la modale.\n   */\n  @Input() disabled = false;\n\n  /** Modifie le mode de sélection du calendrier, entre `single` et `range` */\n  @Input() mode: DsfrCalendarMode = 'single';\n\n  /**\n   * Permet d'ignorer la valeur initiale de l'input `value`si celle ci est erronée\n   * (ex: date de début postérieure à date de fin)\n   */\n  @Input() ignoreInitialValue = false;\n\n  /**\n   * Emission de la date au format DsfrDateEvent\n   */\n  @Output() dateChange = new EventEmitter<DsfrDateEvent>();\n\n  @ViewChild('modal') protected modal!: ElementRef<HTMLDivElement>;\n  @ViewChild('calendar') protected calendar!: DsfrCalendarComponent;\n\n  /**\n   * Id aléatoire, unique, de la modale (le calendrier)\n   */\n  protected modalId = newUniqueId();\n  protected ariaLabelTitleModal: string = '';\n  protected isOpen = false;\n  protected dialogTitle = '';\n  protected translatedMonths: string[] = [];\n  protected dialogTriggerBtnNode: HTMLButtonElement | undefined;\n\n  private _value: string | DsfrRangeModel | undefined = '';\n  private currentMonthIndex = 0;\n  private currentYear = 0;\n\n  private subscription = new Subscription();\n  private readonly elementRef = inject(ElementRef);\n  private readonly i18n = inject(DsfrI18nService);\n  private readonly logger = inject(LoggerService);\n\n  constructor() {\n    this.i18n.extendsLabelsBundle(Language.EN, MESSAGES_EN);\n    this.i18n.extendsLabelsBundle(Language.FR, MESSAGES_FR);\n    const langChange$ = this.i18n.completeLangChange$.subscribe(() => this.onLangChange());\n    this.updateMonthIndexAndYear();\n    this.updateDialogTitle();\n    this.ariaLabelTitleModal = this.modalId + '-title-modale';\n    this.subscription.add(langChange$);\n  }\n\n  get value(): string | DsfrRangeModel | undefined {\n    return this._value;\n  }\n\n  /**\n   * Valeur initial de la date.\n   * La valeur doit prendre la forme dd/mm/yyyy pour la locale fr et mm/dd/yyyy pour la locale en.\n   */\n  @Input() set value(value: string | DsfrRangeModel | undefined) {\n    const isValidSingleValue = this.mode === 'single' && value;\n    const isValidRangeValue = this.mode === 'range' && Array.isArray(value) && value.length === 2;\n\n    if (isValidSingleValue) {\n      this._value = value;\n      this.updateMonthIndexAndYear(value as string);\n    }\n\n    if (isValidRangeValue) {\n      this._value = value;\n      this.updateMonthIndexAndYear(value[0]);\n    }\n  }\n\n  ngAfterViewInit(): void {\n    const nativeElt = this.elementRef.nativeElement;\n    this.dialogTriggerBtnNode = nativeElt.querySelector('.fr-btn') as HTMLButtonElement;\n  }\n\n  ngOnDestroy(): void {\n    this.subscription.unsubscribe();\n  }\n\n  /**\n   * Gère le clic en dehors de la modale\n   */\n  protected onCalendarOutside(): void {\n    if (this.isOpen) {\n      this.close(false);\n    }\n  }\n\n  protected handleTriggerBtnClick(): void {\n    this.isOpen = true;\n  }\n\n  protected handleDataChange(dateEvent: DsfrDateEvent): void {\n    const isFullyFormedSingleValue = this.mode === 'single' && dateEvent.value;\n    const isFullyFormedRange = this.mode === 'range' && dateEvent.value && dateEvent.value[0] && dateEvent.value[1];\n\n    if (!isFullyFormedSingleValue && !isFullyFormedRange) {\n      return;\n    }\n\n    this.value = dateEvent.value as string;\n    this.dateChange.emit(dateEvent);\n\n    this.close();\n  }\n\n  protected handleModalKeydown(keyEvent: KeyboardEvent): void {\n    if (keyEvent.key === 'Escape') {\n      keyEvent.stopPropagation();\n      keyEvent.preventDefault();\n      this.close();\n    }\n  }\n\n  protected handleCancelButton(): void {\n    this.close();\n  }\n\n  /**\n   * Met à jour le titre de la dialog (visuellement caché) pour les besoins d'accessibilité.\n   */\n  private updateDialogTitle(): void {\n    this.dialogTitle = `${this.i18n.t('calendar.modal.title')}${this.translatedMonths[this.currentMonthIndex]} ${this.currentYear}`;\n  }\n\n  /**\n   * Ferme la modale.\n   *\n   * Positionne le focus sur le bouton d'ouverture de la modale si besoin.\n   *\n   * @param focusTriggerBtn Permet de savoir si le focus doit être donné au bouton d'ouverture de la modale\n   */\n  private close(focusTriggerBtn = true): void {\n    if (!this.modal) {\n      return;\n    }\n\n    // Pour être raccord avec la directive click-outside : on enlève 'data-expanded'\n    this.modal.nativeElement.removeAttribute('data-expanded');\n\n    this.isOpen = false;\n\n    if (focusTriggerBtn) {\n      this.dialogTriggerBtnNode?.focus();\n    }\n  }\n\n  private updateMonthTranslations(): void {\n    this.translatedMonths = DateUtils.arr(this.i18n, this.logger, 'calendar.months');\n  }\n\n  /**\n   * Gestion du changement de langue dans le composant.\n   *\n   * @param code Code de la locale à prendre en compte\n   */\n  private onLangChange(): void {\n    this.updateMonthTranslations();\n    this.updateDialogTitle();\n  }\n\n  /**\n   * Mise à jour des valeurs des deux listes déroulantes, mois et année.\n   */\n  private updateMonthIndexAndYear(date?: string): void {\n    this.currentMonthIndex = date ? new Date(date).getMonth() : new Date().getMonth();\n    this.currentYear = date ? new Date(date).getFullYear() : new Date().getFullYear();\n  }\n}\n","<dsfr-button\n  type=\"button\"\n  variant=\"primary\"\n  buttonSize=\"MD\"\n  icon=\"fr-icon-calendar-2-line\"\n  [tooltipMessage]=\"tooltipMessage\"\n  [disabled]=\"disabled\"\n  [ariaLabel]=\"ariaLabel\"\n  (click)=\"handleTriggerBtnClick()\"></dsfr-button>\n\n@if (isOpen) {\n  <div\n    data-expanded=\"true\"\n    class=\"dsfrx-datepicker-dialog\"\n    role=\"dialog\"\n    aria-modal=\"true\"\n    clickOutside\n    cdkTrapFocus\n    #modal\n    [id]=\"modalId\"\n    [attr.aria-label]=\"'calendar.modal.ariaLabel' | dsfrI18n\"\n    (keydown)=\"handleModalKeydown($event)\"\n    (clickOutsideEvent)=\"onCalendarOutside()\">\n    <h2 [id]=\"ariaLabelTitleModal\" class=\"fr-sr-only\" aria-live=\"polite\" [attr.aria-label]=\"dialogTitle\"></h2>\n    <dsfr-ext-calendar\n      [value]=\"value\"\n      [max]=\"max\"\n      [min]=\"min\"\n      [autofocus]=\"true\"\n      [mode]=\"mode\"\n      [ignoreInitialValue]=\"ignoreInitialValue\"\n      [ariaLabelledBy]=\"ariaLabelTitleModal\"\n      (dateChange)=\"handleDataChange($event)\"\n      #calendar></dsfr-ext-calendar>\n    <div class=\"dialog-ok-cancel-group\">\n      <button\n        type=\"button\"\n        class=\"dialog-button fr-btn fr-btn--secondary fr-btn--sm\"\n        value=\"cancel\"\n        data-testid=\"datepicker-cancel-btn\"\n        (click)=\"handleCancelButton()\">\n        {{ 'calendar.cancel' | dsfrI18n }}\n      </button>\n    </div>\n  </div>\n}\n","export class Point {\n  constructor(\n    public x = 0,\n    public y = 0,\n  ) {}\n\n  static fromEvent(event: TouchEvent): Point {\n    return new Point(event.changedTouches[0].clientX, event.changedTouches[0].clientY);\n  }\n}\n","// Ordre alphabétique requis\nexport const MESSAGES_EN = {\n  carousel: {\n    pause: 'Stop automatic slide show',\n    play: 'Start automatic slide show',\n    next: 'Next',\n    nextSlide: 'Next slide',\n    previous: 'Previous',\n    previousSlide: 'Previous slide',\n  },\n};\n","// Ordre alphabétique requis\nexport const MESSAGES_FR = {\n  carousel: {\n    next: 'Suivant',\n    nextSlide: 'Slide suivante',\n    pause: 'Stopper le défilement automatique du carousel',\n    play: 'Démarrer le défilement automatique du carousel',\n    previous: 'Précédent',\n    previousSlide: 'Slide précédente',\n  },\n};\n","import { CommonModule } from '@angular/common';\nimport {\n  AfterViewInit,\n  Component,\n  ContentChild,\n  ElementRef,\n  EventEmitter,\n  Input,\n  OnDestroy,\n  OnInit,\n  Output,\n  Renderer2,\n  TemplateRef,\n  ViewChild,\n  ViewEncapsulation,\n  booleanAttribute,\n  inject,\n} from '@angular/core';\nimport { DsfrI18nPipe, DsfrI18nService, Language, newUniqueId } from '@edugouvfr/ngx-dsfr';\nimport { Point } from '../shared/models/point';\nimport { DsfrSlide, DsfrSlideContext } from './carousel.model';\nimport { MESSAGES_EN } from './i18n/messages.en';\nimport { MESSAGES_FR } from './i18n/messages.fr';\n\nexport const DEFAULT_INTERVAL: number = 5000;\n\n// https://getbootstrap.com/docs/5.3/components/carousel/\n@Component({\n  selector: 'dsfrx-carousel, dsfr-ext-carousel',\n  imports: [CommonModule, DsfrI18nPipe],\n  templateUrl: './carousel.component.html',\n  styleUrls: ['./carousel.component.scss'],\n  encapsulation: ViewEncapsulation.None,\n})\nexport class DsfrCarouselComponent implements OnInit, OnDestroy, AfterViewInit {\n  /** @internal */\n  @ViewChild('slidesContainer', { static: true }) slidesContainer?: ElementRef;\n\n  /** @internal */\n  @ContentChild(TemplateRef) templateSlide?: TemplateRef<DsfrSlideContext>;\n\n  /** Identifiant du champ, généré automatiquement par défaut. */\n  @Input() carouselId?: string;\n\n  /** Attribut aria-label du composant */\n  @Input() ariaLabel?: string;\n\n  /** Défilement automatique, faux par défaut */\n  @Input({ transform: booleanAttribute }) autoplay: boolean = false;\n\n  /** Indique si le carrousel boucle ou non, vrai par défaut. */\n  @Input() circular = true;\n\n  /* Le délai entre chaque slide. */\n  @Input() interval: number = DEFAULT_INTERVAL;\n\n  /** Indique si le carrousel doit réagir aux événements du clavier, vrai par défaut. */\n  @Input() keyboard = true;\n\n  /** Tableau de slides. */\n  @Input() slides: DsfrSlide[] = [];\n\n  /** Taille maximale du container de slides (optionnel) */\n  @Input() maxWidth?: string;\n\n  /** Indique si le carrousel doit prendre en charge les interactions par balayage gauche/droite sur les appareils à écran tactile, vrai par défaut. */\n  @Input() touch = true;\n\n  /** Avec les contrôles de chaque côté des slides. */\n  @Input({ transform: booleanAttribute }) withControls: boolean = true;\n\n  /** Avec des indicateurs d'avancement. */\n  @Input({ transform: booleanAttribute }) withIndicators: boolean = true;\n\n  /** Avec des indicateurs d'avancement. */\n  @Input({ transform: booleanAttribute }) inverse: boolean = true;\n\n  /** Afficher les indicateur et contrôles à l'intérieur de l'image */\n  @Input({ transform: booleanAttribute }) withControlsInside: boolean = false;\n\n  /** Dans le cas de controlsInside à l'interieur, place les indicateur sur un fond noir en couleurs inversées */\n  @Input({ transform: booleanAttribute }) reverseColorsIndicators: boolean = false;\n\n  /** Avec des labels. */\n  @Input({ transform: booleanAttribute }) withCaptions: boolean = false;\n\n  /** Désactiver l'animation de transition */\n  @Input({ transform: booleanAttribute }) disableTransition: boolean = false;\n\n  /** Au changement de slide, emission de l'index du slide actif */\n  @Output() carouselChange = new EventEmitter<number>();\n\n  /** @internal Le carousel est en pause et ne restart que si l'utilisateur clique explicitement sur play */\n  public onPause: boolean = false;\n\n  /** @internal */\n  transition = true;\n\n  private i18n = inject(DsfrI18nService);\n\n  /** Slide courant. */\n  private _current = 0;\n\n  /** Id du timer */\n  private timeoutId: any;\n\n  /** Evénements touch */\n  private startPoint: Point | undefined;\n\n  private renderer = inject(Renderer2);\n  private transitionListener!: () => void;\n\n  constructor() {\n    this.i18n.extendsLabelsBundle(Language.EN, MESSAGES_EN);\n    this.i18n.extendsLabelsBundle(Language.FR, MESSAGES_FR);\n  }\n\n  /**\n   * @internal\n   * Duplique le premier et dernier slide pour l'effet de transition circulaire\n   */\n  get visibleSlides() {\n    return [\n      this.slides[this.slides.length - 1], // Ajoute le dernier slide au début\n      ...this.slides,\n      this.slides[0], // Ajoute le premier slide à la fin\n    ];\n  }\n\n  get current(): number {\n    return this._current;\n  }\n\n  private set current(value: number) {\n    if (value !== this._current) {\n      this._current = value;\n      this.carouselChange.emit(value);\n    }\n\n    if (this.disableTransition && this.circular) {\n      this.handleFirstLastTransition();\n    }\n  }\n\n  public ngOnInit(): void {\n    this.carouselId ??= newUniqueId();\n    if (this.circular) {\n      // Gestion de l'effet de transition pour le premier et le dernier slide en version circulaire\n      this.transitionListener = this.renderer.listen(this.slidesContainer?.nativeElement, 'transitionend', () => {\n        this.handleFirstLastTransition();\n      });\n    }\n\n    // Afficher le premier slide au chargement\n    this.renderer.setStyle(this.slidesContainer?.nativeElement, 'transform', this.getTransform());\n  }\n\n  public ngOnDestroy(): void {\n    // Nettoyer le listener à la destruction du composant\n    if (this.transitionListener) {\n      this.transitionListener();\n    }\n  }\n\n  public ngAfterViewInit(): void {\n    if (this.autoplay) this.startSlideshow();\n  }\n\n  /**\n   * Spécifique mobile\n   * @internal */\n  public onTouchStart(event: TouchEvent): void {\n    this.startPoint = Point.fromEvent(event);\n  }\n\n  /**\n   * Spécifique mobile\n   * @internal */\n  public onTouchEnd(event: TouchEvent): void {\n    if (this.touch && this.startPoint) {\n      const endPoint = Point.fromEvent(event);\n      if (endPoint.x < this.startPoint.x - 32) this.next();\n      else if (endPoint.x > this.startPoint.x + 32) this.previous();\n    }\n  }\n\n  /** @internal */\n  public onKeydown(event: KeyboardEvent): void {\n    // stop du défilement automatique pendant l'interaction utilisateur\n    if (this.autoplay) this.stopSlideshow();\n    this.onPause = true;\n\n    if (!this.keyboard) return;\n    event.stopPropagation();\n\n    switch (event.code) {\n      case 'ArrowLeft':\n        this.previous();\n        break;\n\n      case 'ArrowRight':\n        this.next();\n        break;\n\n      case 'Space':\n        this.toggleSlideshow();\n        break;\n\n      default:\n    }\n  }\n\n  /**\n   * Transition vers le slide précédent\n   *  @internal */\n  public previous(origin: 'user' | 'timer' = 'user'): void {\n    if (this.current > 0 || this.circular) {\n      this.current--;\n      this.transition = true;\n      this.renderer.setStyle(this.slidesContainer?.nativeElement, 'transform', this.getTransform());\n    }\n\n    if (origin === 'user' && this.autoplay) this.startSlideshow();\n  }\n\n  /**\n   * Transition vers le slide suivant\n   *  @internal */\n  public next(origin: 'user' | 'timer' = 'user'): void {\n    if (this.current < this.slides.length || this.circular) {\n      this.transition = true;\n      this.current++;\n      this.renderer.setStyle(this.slidesContainer?.nativeElement, 'transform', this.getTransform());\n    }\n\n    if (origin === 'user' && this.autoplay) this.startSlideshow();\n    if (!this.circular && (this.current === 0 || this.current === this.slides?.length - 1)) this.stopSlideshow();\n  }\n\n  /** @internal */\n  public togglePlayPause() {\n    this.onPause = !this.onPause;\n    if (!this.onPause) {\n      this.startSlideshow();\n    } else {\n      this.stopSlideshow();\n    }\n  }\n\n  /**\n   * @internal\n   * Lance le carousel si en autoplay et non explicitement sur pause\n   */\n  public startSlideshow(): void {\n    if (this.autoplay && !this.onPause) {\n      this.stopSlideshow();\n      this.timeoutId = setInterval(() => this.next('timer'), this.interval);\n    }\n  }\n\n  /**\n   * @internal\n   * Stoppe le carousel\n   */\n  public stopSlideshow(): void {\n    if (this.timeoutId && this.autoplay) {\n      clearTimeout(this.timeoutId);\n      this.timeoutId = undefined;\n    }\n  }\n\n  /** Effet de transition des slides */\n  private getTransform(): string {\n    return `translate3d(${-((this.current + 1) * 100)}%, 0, 0)`;\n  }\n\n  private toggleSlideshow(): void {\n    if (this.timeoutId) this.stopSlideshow();\n    else this.startSlideshow();\n  }\n\n  /**\n   * Gestion de l'affichage avant le premier et apres le dernier slide en mode circulaire\n   */\n  private handleFirstLastTransition() {\n    if (this.current >= this.slides.length) {\n      this.current = 0;\n      this.transition = false;\n      this.renderer.setStyle(this.slidesContainer?.nativeElement, 'transform', this.getTransform());\n    } else if (this.current < 0) {\n      this.current = this.slides.length - 1;\n      this.transition = false;\n      this.renderer.setStyle(this.slidesContainer?.nativeElement, 'transform', this.getTransform());\n    }\n  }\n}\n","<section\n  [id]=\"carouselId\"\n  [attr.aria-label]=\"ariaLabel || null\"\n  [ngStyle]=\"{ 'max-width': maxWidth ? maxWidth : '' }\"\n  class=\"dsfrx-carousel\"\n  [ngClass]=\"{ 'colors-reverse': reverseColorsIndicators && withControlsInside }\"\n  aria-roledescription=\"carousel\"\n  (keydown)=\"onKeydown($event)\"\n  (mouseenter)=\"stopSlideshow()\"\n  (mouseleave)=\"startSlideshow()\"\n  (touchstart)=\"onTouchStart($event)\"\n  (touchend)=\"onTouchEnd($event)\">\n  <!-- Slides --------------------------------------------------------------------------------------------------------->\n  <div\n    #slidesContainer\n    id=\"carousel-inner-{{ carouselId }}\"\n    class=\"carousel-inner\"\n    [attr.aria-live]=\"autoplay ? 'off' : 'polite'\"\n    [style.transition]=\"transition && !disableTransition ? 'transform 0.5s ease-in-out' : 'none'\">\n    @for (slide of visibleSlides; track i; let i = $index) {\n      <div\n        class=\"carousel-item\"\n        role=\"group\"\n        aria-roledescription=\"slide\"\n        [attr.aria-hidden]=\"i === 0 || i > slides.length ? true : null\"\n        [attr.aria-label]=\"i > 0 && !(i > slides.length) ? i + ' of ' + slides.length : null\"\n        class=\"slide\"\n        [attr.aria-labelledBy]=\"withCaptions ? carouselId + '-' + i + '-caption' : undefined\"\n        [class.active]=\"current + 1 === i\">\n        <!-- En l'absence de template, affichage des images et titres -->\n        @if (!templateSlide) {\n          <img [src]=\"slide.imagePath\" [alt]=\"slide.alt || null\" />\n          <!-- Captions ------------------------------------------------------------------------------------------------------->\n          @if (withCaptions) {\n            <div [id]=\"carouselId + '-' + i + '-caption'\" class=\"description\">\n              @if (slide.caption) {\n                <div class=\"caption\">{{ slide.caption }}</div>\n              }\n              @if (slide.content) {\n                <div class=\"content\">{{ slide.content }}</div>\n              }\n            </div>\n          }\n        }\n        <!-- Template -->\n        <ng-template\n          [ngTemplateOutlet]=\"templateSlide\"\n          [ngTemplateOutletContext]=\"{ $implicit: slide, index: i }\"></ng-template>\n      </div>\n    }\n  </div>\n\n  @if (withControlsInside) {\n    <!-- Contrôles ----->\n    @if (withControls) {\n      <div class=\"inside-controls\">\n        <button\n          type=\"button\"\n          class=\"fr-pagination__link--prev control control--prev\"\n          (click)=\"previous()\"\n          [disabled]=\"circular ? undefined : current === 0\"\n          [attr.aria-label]=\"'carousel.previousSlide' | dsfrI18n\"\n          [attr.aria-controls]=\"'carousel-inner-' + carouselId\">\n          <span class=\"control-prev-icon\" aria-hidden=\"true\"></span>\n        </button>\n        <button\n          type=\"button\"\n          class=\"fr-pagination__link--next control control--next\"\n          (click)=\"next()\"\n          [disabled]=\"circular ? undefined : current === slides.length - 1\"\n          [attr.aria-label]=\"'carousel.nextSlide' | dsfrI18n\"\n          [attr.aria-controls]=\"'carousel-inner-' + carouselId\">\n          <span class=\"control-next-icon\" aria-hidden=\"true\"></span>\n        </button>\n      </div>\n    }\n    <!--  Indicateurs ----->\n    @if (withIndicators) {\n      <div class=\"indicators inside-controls\">\n        <ng-container *ngTemplateOutlet=\"playPauseControl\"></ng-container>\n        @for (slide of slides; track i; let i = $index) {\n          <div class=\"button\" [class.active]=\"current === i\"></div>\n        }\n      </div>\n    }\n  } @else {\n    <!-- Controles bottom ------------------------------------------------------------------------------------------------>\n    <div class=\"controls\">\n      <ng-container *ngTemplateOutlet=\"playPauseControl\"></ng-container>\n      <button\n        (click)=\"previous()\"\n        [attr.aria-controls]=\"'carousel-inner-' + carouselId\"\n        [attr.aria-label]=\"'carousel.previousSlide' | dsfrI18n\"\n        [disabled]=\"circular ? undefined : current === 0\"\n        class=\"fr-pagination__link fr-pagination__link--prev fr-pagination__link--lg-label\">\n        <span class=\"label-sm\">{{ 'carousel.previous' | dsfrI18n }}</span>\n      </button>\n      <div class=\"indicators fr-pagination__link\">\n        @for (slide of slides; track i; let i = $index) {\n          <div class=\"button\" [class.active]=\"current === i\"></div>\n        }\n      </div>\n      <button\n        [disabled]=\"circular ? undefined : current === slides.length - 1\"\n        (click)=\"next()\"\n        [attr.aria-controls]=\"'carousel-inner-' + carouselId\"\n        [attr.aria-label]=\"'carousel.nextSlide' | dsfrI18n\"\n        class=\"fr-pagination__link fr-pagination__link--next fr-pagination__link--lg-label\">\n        <span class=\"label-sm\">{{ 'carousel.next' | dsfrI18n }}</span>\n      </button>\n    </div>\n  }\n</section>\n\n<!-- Controles play/pause ------------------------------------------------------------------------------------------------->\n<ng-template #playPauseControl>\n  @if (autoplay) {\n    <button\n      type=\"button\"\n      (click)=\"togglePlayPause()\"\n      [class.fr-icon-pause]=\"!onPause\"\n      [class.fr-icon-play]=\"onPause\"\n      class=\"fr-btn fr-btn--sm rotation fr-btn--tertiary\"\n      [attr.aria-label]=\"onPause ? ('carousel.play' | dsfrI18n) : ('carousel.pause' | dsfrI18n)\"></button>\n  }\n</ng-template>\n","export enum DsfrSelectionModeConst {\n  SINGLE = 'single',\n  MULTIPLE = 'multiple',\n  CHECKBOX = 'checkbox',\n}\nexport type DsfrSelectionMode = `${DsfrSelectionModeConst}` | undefined;\n","// Ordre alphabétique requis\nexport const MESSAGES_EN = {\n  multiselect: {\n    unselectAll: 'Unselect all',\n    search: 'Search',\n    selectAll: 'Select all',\n    selected: 'selected',\n    selectedPlural: 'selected',\n    resetSearch: 'Reset search field',\n    selectOption: 'Select an option',\n    noResult: 'No result',\n    availableResults: 'results',\n    searchList: 'Search on results list',\n    deleteTag: 'Unselect option',\n    loading: 'Loading',\n  },\n};\n","// Ordre alphabétique requis\nexport const MESSAGES_FR = {\n  multiselect: {\n    unselectAll: 'Tout désélectionner',\n    search: 'Rechercher',\n    selectAll: 'Tout sélectionner',\n    selected: 'sélectionné',\n    selectedPlural: 'sélectionnés',\n    resetSearch: 'Réinitialiser le champ de recherche',\n    selectOption: 'Sélectionner une option',\n    noResult: 'Aucun résultat',\n    availableResults: 'résultats',\n    searchList: 'Rechercher dans la liste',\n    deleteTag: \"Déselectionner l'option\",\n    loading: 'Chargement',\n  },\n};\n","import {\n  ChangeDetectorRef,\n  Component,\n  ContentChild,\n  EventEmitter,\n  Input,\n  OnInit,\n  Output,\n  TemplateRef,\n  WritableSignal,\n  booleanAttribute,\n  computed,\n  forwardRef,\n  inject,\n  input,\n  signal,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport {\n  DefaultValueAccessorComponent,\n  DsfrI18nService,\n  DsfrOption,\n  DsfrSeverity,\n  DsfrSeverityConst,\n  Language,\n  newUniqueId,\n} from '@edugouvfr/ngx-dsfr';\nimport { DsfrSelectionMode, DsfrSelectionModeConst } from '../../models/selection-mode.type';\nimport { DsfrOptionContext } from '../list-options';\nimport { MESSAGES_EN } from './i18n/messages.en';\nimport { MESSAGES_FR } from './i18n/messages.fr';\n\nexport interface DsfrMaxDisplayOptionsContext {\n  value: any[];\n}\n\nexport interface DsfrSelectedOptionContext {\n  value: any[];\n}\n\n@Component({\n  template: '',\n  styleUrls: ['./abstract-select.component.scss'],\n  imports: [],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => AbstractSelectComponent),\n      multi: true,\n    },\n  ],\n})\nexport abstract class AbstractSelectComponent<T>\n  extends DefaultValueAccessorComponent<any[] | any | undefined>\n  implements OnInit\n{\n  /** Template pour l'ensemble des valeurs sélectionnées lorsque maxDisplayOptions est atteint */\n  @ContentChild('maxDisplayOptionsTemplate', { static: true })\n  maxDisplayOptionsTemplate?: TemplateRef<DsfrMaxDisplayOptionsContext>;\n\n  /** Template pour chaque valeur sélectionnée */\n  @ContentChild('selectedOptionTemplate', { static: true }) selectedOptionTemplate?: TemplateRef<any>;\n\n  /** Template des labels des options */\n  @ContentChild('optionTemplate', { static: true }) optionTemplate?: TemplateRef<DsfrOptionContext>;\n\n  /** La liste prend une taille fluide selon la taille des options qu'elle contient (par défaut : taille du select) */\n  @Input() autoWidthDropdown = false;\n\n  /** Les options sélectionnées sont affichées sous forme de tags supprimables */\n  @Input({ transform: booleanAttribute }) clearableOptions: boolean = false;\n\n  /** Id du composant, généré par défaut */\n  @Input() selectId?: string;\n\n  /** Hauteur maximale avant le scroll sur la liste déroulante. */\n  @Input() scrollHeight: string = '224px';\n\n  /** Label du champ de sélection (prioritaire sur le slot label) */\n  @Input() label?: string;\n\n  /** Texte de description additionnel */\n  @Input() hint?: string;\n\n  /** Nombre max. d'options sélectionnées affichées. 5 par défaut */\n  @Input() maxDisplayOptions: number | undefined = 5;\n\n  /** Nombre max. d'options sélectionnables */\n  @Input() maxSelectedOptions?: number;\n\n  /** Afficher la case à cocher tout sélectionner */\n  @Input({ transform: booleanAttribute }) showSelectAll = false;\n\n  /** Attacher l'élément de liste déroulante au 'body' ou a un container (réf. vers un élément #div ou nom de la classe du parent) */\n  @Input() appendTo?: 'body' | HTMLElement | string;\n\n  /** Afficher la barre de recherche (filtre sur les options) */\n  @Input() showSearch = false;\n\n  /** Afficher un bouton pour vider le champ de la barre de recherche */\n  @Input({ transform: booleanAttribute }) showClearSearch = false;\n\n  /** Placeholder pour le champ de sélection */\n  @Input() placeHolder?: string;\n\n  /** Placeholder pour le champ de recherche */\n  @Input() searchMessage?: string;\n\n  /** Message d'accessibilité vocalisé lorsqu'il n'y a aucun résultat. */\n  @Input() noResultsMessage?: string;\n\n  /** Afficher un état de chargement */\n  @Input({ transform: booleanAttribute }) loading = false;\n\n  /** Activer le virtual scroll  */\n  @Input({ transform: booleanAttribute }) virtualScroll = false;\n\n  /** Surcharger la hauteur d'un item dans le cas du virtual scroll. Par défaut 32px. */\n  @Input() virtualScrollItemHeight: number = 32;\n\n  /** Propriété CSS z-index de la liste, par défaut supérieur aux composants 'lifted' DSFR */\n  @Input() zIndex?: number;\n\n  /** Vider le champ de recherche lorsque la liste est cachée */\n  @Input({ transform: booleanAttribute }) clearSearchOnHide = false;\n\n  /** 👓 Correspond à l'attribut `aria-invalid` */\n  @Input() ariaInvalid?: string;\n\n  /** 👓 Correspond à l'attribut `aria-required` */\n  @Input({ transform: booleanAttribute }) ariaRequired?: boolean;\n\n  /**\n   * Cache le label visuellement en le laissant disponible aux lecteurs d'écran.\n   */\n  @Input({ transform: booleanAttribute }) labelSrOnly = false;\n\n  /** Liste d'options sélectionnée modifiée */\n  @Output() selectionChange = new EventEmitter<any[] | undefined>();\n\n  /** @internal texte pour filtrer */\n  searchText = '';\n\n  /** @internal liste des options sélectionnées */\n  selectedOptions: T[] = [];\n\n  /** @internal toutes les options visibles sélectionnées */\n  isCheckedSelectAll = false;\n\n  /** @internal afficher le dropdown (recherche et liste déroulante) */\n  displayDropdown = signal(false);\n\n  /** @internal liste d'options filtrées */\n  optionsFilter: WritableSignal<T[]> = signal([]);\n\n  /** @internal Sauvegarder l'index de la premiere option sélectionnée pour la gestion du focus */\n  indexFirstSelected: number | null = null;\n\n  /**@internal le mode de sélection est single */\n  isSingleMode: boolean = false;\n\n  /**\n   * Message d'information lié au composant.\n   */\n  message = input<string>();\n\n  /**\n   * Représente la sévérité du message.\n   */\n  messageSeverity = input<DsfrSeverity>();\n\n  /**\n   * Message d'erreur, quand il est présent les couleurs du contrôle changent.\n   * @deprecated utiliser message/messageSeverity à la place\n   */\n  error = input<string>();\n\n  /**\n   * Message de validation, quand il est présent les couleurs du contrôle changent.\n   * @deprecated utiliser message/messageSeverity à la place\n   */\n  valid = input<string>();\n\n  /** @internal */\n  messagesGroupId: string = '';\n\n  /** @internal */\n  messageViewModel = computed<string | string[] | undefined>(() => {\n    if (this.error()) return this.error();\n    if (this.valid()) return this.valid();\n    return this.message();\n  });\n\n  /** @internal */\n  severityViewModel = computed<DsfrSeverity | undefined>(() => {\n    const message = this.messageViewModel();\n    if (!message?.length) return undefined;\n\n    if (this.error()) return DsfrSeverityConst.ERROR;\n    if (this.valid()) return DsfrSeverityConst.VALID;\n    if (this.messageSeverity() === DsfrSeverityConst.SUCCESS) return DsfrSeverityConst.VALID;\n\n    return this.messageSeverity();\n  });\n\n  ariaDescribedBy = input<string>();\n\n  /** @internal */\n  combinedAriaDescribedBy = computed<string | null>(() => {\n    const ariaDescribedBy = this.ariaDescribedBy();\n    const ids: string[] = [];\n\n    if (ariaDescribedBy) ids.push(ariaDescribedBy);\n    ids.push(this.messagesGroupId); // toujours présent meme si aucun message\n\n    return ids.length ? ids.join(' ') : null;\n  });\n\n  /* @internal */\n  protected cd = inject(ChangeDetectorRef);\n\n  /** @internal   Afin de pouvoir utiliser le type dans l'HTML*/\n  protected readonly severityConst = DsfrSeverityConst;\n\n  /** @internal */\n  protected _options: WritableSignal<T[]> = signal([]);\n\n  /** @internal */\n  protected _selectionMode: DsfrSelectionMode = DsfrSelectionModeConst.CHECKBOX;\n\n  /** @internal compareWith reprise de l'implémentation angular SelectControlValueAccessor */\n  protected _compareWith: (o1: any, o2: any) => boolean = Object.is;\n\n  private i18n = inject(DsfrI18nService);\n\n  /** @internal */\n  constructor() {\n    super();\n\n    this.i18n.extendsLabelsBundle(Language.EN, MESSAGES_EN);\n    this.i18n.extendsLabelsBundle(Language.FR, MESSAGES_FR);\n  }\n\n  /** @internal */\n  get showCheckboxes() {\n    return this.selectionMode === DsfrSelectionModeConst.CHECKBOX;\n  }\n\n  /** @internal */\n  get selectionMode() {\n    return this._selectionMode;\n  }\n  /** Liste des options disponibles. */\n  @Input()\n  set options(val: any[] | undefined) {\n    const value = val ?? [];\n    this.applyOptions(value);\n  }\n\n  /** Mode de sélection. Checkbox, multiple ou single */\n  @Input()\n  set selectionMode(mode: DsfrSelectionMode) {\n    this.setSelectionMode(mode);\n  }\n\n  /** Personnalisation de la comparaison. Fonction à 2 arguments: val1 et val2 (les values des deux options).\n  Si compareWith est fourni, sélection de l'option selon le retour de la fonction.*/\n  @Input()\n  set compareWith(fn: (v1: any, v2: any) => boolean) {\n    if (typeof fn !== 'function') {\n      throw Error('`compareWith` must be a function.');\n    }\n    this._compareWith = fn;\n  }\n\n  public ngOnInit(): void {\n    this.selectId ??= newUniqueId();\n    this.messagesGroupId = newUniqueId();\n  }\n\n  /**  @internal */\n  public getLabelKeyOptionsSelected(): string {\n    return this.selectedOptions.length === 1 ? 'multiselect.selected' : 'multiselect.selectedPlural';\n  }\n\n  /** @internal */\n  public override setDisabledState(isDisabled: boolean) {\n    this.disabled = isDisabled;\n    this.cd.markForCheck();\n  }\n\n  /** \n   * Réinitialiser le champ de recherche\n   @internal\n  */\n  public resetSearchInput(): void {\n    this.optionsFilter.set(this._options() ?? []);\n  }\n\n  /**\n   * Ouverture du multiselect sur arrow down\n   *  @internal */\n  public onButtonKeyDown(e: KeyboardEvent): void {\n    if ((e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') && !this.displayDropdown()) {\n      if ((e.target as HTMLElement).className.includes('fr-tag')) return; // dans le cas des clearableOptions, suppression du tag\n      e.preventDefault();\n      this.toggleDropdown();\n      return;\n    }\n\n    if ((e.key === 'ArrowUp' || e.key === 'Enter' || e.key === 'Escape') && this.displayDropdown()) {\n      this.toggleDropdown();\n      return;\n    }\n  }\n\n  /** @internal */\n  public toggleDropdown(e?: any): void {\n    if (e && e.target && (e.target as HTMLElement).className.includes('fr-tag ')) {\n      return;\n    }\n\n    this.displayDropdown.set(!this.displayDropdown());\n    if (!this.displayDropdown()) {\n      this.hide();\n    }\n  }\n\n  /** @internal */\n  public hide(): void {\n    this.displayDropdown.set(false);\n\n    if (this.clearSearchOnHide) {\n      this.searchText = '';\n      this.resetSearchInput();\n    }\n\n    this.fnOnTouched(); // déclencher touched a la fermeture de la modale\n  }\n\n  protected applyOptions(options: T[]): void {\n    this._options.set(options);\n    this.optionsFilter.set(options);\n\n    if (this.value !== undefined) {\n      this.writeValue(this.value);\n    }\n  }\n\n  /** @internal **/\n  protected setSelectionMode(mode: DsfrSelectionMode) {\n    this._selectionMode = mode ? mode : DsfrSelectionModeConst.CHECKBOX;\n    this.isSingleMode = this.selectionMode === DsfrSelectionModeConst.SINGLE;\n    if (this.isSingleMode) {\n      this.showSelectAll = false;\n    }\n  }\n\n  /** \n   * Sélectionner ou déselectionner toutes les options\n   * Si maxSelectedOptions est défini, sélection uniquement des (max) premières options\n   @internal\n  */\n  public abstract selectAll(): void;\n\n  /**\n   * Sélection ou désélection d'une option\n   * @internal */\n  public abstract onOptionClick(e: any, option: DsfrOption): void;\n\n  /**\n   * Filtrer les options selon la fonction de recherche\n   * @internal */\n  public abstract onSearch(): void;\n}\n","// Ordre alphabétique requis\nexport const MESSAGES_EN = {\n  datepicker: {\n    button: {\n      choose: { label: 'Choose Date' },\n      change: { label: 'Change Date' },\n      chooseRange: { label: 'Choose date range' },\n      changeRange: { label: 'Change date range' },\n    },\n    startDateLabel: 'Start date',\n    endDateLabel: 'End date',\n    placeholder: 'mm/dd/yyyy',\n    validationDate: `The entered date is not valid.`,\n    validationStartDate: `The start date is not valid.`,\n    validationEndDate: `The end date is not valid.`,\n    validationMin: 'The date must be later than or equal to the minimum date.',\n    validationMax: 'The date must be earlier than or equal to the maximum date.',\n    validationEndBeforeStart: `Start date must be earlier than end date`,\n    selectedDate: 'Selected date: ',\n    selectedRange: 'Selected range: ',\n  },\n};\n","// Ordre alphabétique requis\nexport const MESSAGES_FR = {\n  datepicker: {\n    button: {\n      choose: { label: 'Choisir une date' },\n      chooseRange: { label: 'Choisir une période' },\n      change: { label: 'Changer la date' },\n      changeRange: { label: 'Changer la période' },\n    },\n    startDateLabel: 'Date de début',\n    endDateLabel: 'Date de fin',\n    placeholder: 'jj/mm/aaaa',\n    validationDate: `La date saisie n'est pas valide.`,\n    validationStartDate: `La date de début n'est pas valide.`,\n    validationEndDate: `La date de fin n'est pas valide.`,\n    validationMin: 'La date doit être postérieure ou égale à la date minimum.',\n    validationMax: 'La date doit être antérieure ou égale à la date maximum.',\n    validationEndBeforeStart: `La date de début doit être antérieure à la date de fin`,\n    selectedDate: 'Date sélectionnée : ',\n    selectedRange: 'Période sélectionnée : ',\n  },\n};\n","import { Directive, HostListener, inject, Input } from '@angular/core';\nimport { DsfrFormInputComponent } from '@edugouvfr/ngx-dsfr';\n\n/**\n * Formate automatiquement en utilisant le pattern dd/mm/yyyy.\n *\n * @since 0.10\n */\n@Directive({\n  selector: '[dsfrDateFormat]',\n  standalone: true,\n})\nexport class DateFormatDirective {\n  @Input() dsfrDateFormat?: string;\n\n  private lastKeyWasBackspace = false;\n  private host = inject(DsfrFormInputComponent, { host: true });\n\n  constructor() {}\n\n  @HostListener('input', ['$event'])\n  onInput(event: Event) {\n    if (this.lastKeyWasBackspace) return;\n\n    const doFormat = !!this.dsfrDateFormat;\n    if (doFormat) {\n      const inputElt = event.target as HTMLInputElement;\n      const raw = inputElt.value;\n      const formatted = this.format(raw);\n      if (formatted !== raw) {\n        inputElt.value = formatted;\n        this.host.fnOnChange(formatted);\n      }\n    }\n  }\n\n  @HostListener('keydown', ['$event'])\n  onKeyDown(event: KeyboardEvent) {\n    this.lastKeyWasBackspace = event.key === 'Backspace';\n  }\n\n  /**\n   * Formate la saisie d'une date.\n   */\n  private format(val: string): string {\n    // On supprime tout ce n'est ni chiffre ni séparateur\n    let value = this.cleanup(val);\n\n    const regexp = /^(?<g1>[\\d]{0,2})?(?<s1>\\/)?(?<g2>[\\d]{0,2})?(?<s2>\\/)?(?<year>[\\d]{0,4})?/;\n    const reArr = regexp.exec(value);\n    const groups = reArr?.groups;\n    value = '';\n    if (groups) {\n      const g1 = groups['g1'] || '';\n      let s1 = groups['s1'] || '';\n      s1 = !s1 && g1.length === 2 ? '/' : s1;\n      const g2 = groups['g2'] || '';\n      let s2 = groups['s2'] || '';\n      s2 = !s2 && g2.length === 2 ? '/' : s2;\n      const year = groups['year'] || '';\n      value = g1 + s1 + g2 + s2 + year;\n    }\n\n    return value;\n  }\n\n  /**\n   * Ne conserve que les chiffres et les séparateurs.\n   */\n  private cleanup(value: String): string {\n    // Ne garde que les digits et slash\n    let cleaned = value.replace(/[^\\d/]/g, '');\n\n    // Remplace plusieurs \"/\" consécutifs par un seul\n    cleaned = cleaned.replace(/\\/{2,}/g, '/');\n\n    // Retire \"/\" si positionné au début ou à la fin\n    cleaned = cleaned.replace(/^\\/|\\/$/g, '');\n\n    return cleaned;\n  }\n}\n","import { AfterViewInit, Directive, ElementRef, inject, Input, OnDestroy, Renderer2 } from '@angular/core';\nimport { DsfrDatePickerComponent } from '../datepicker.component';\n\nconst MASK_DATE = '__/__/____';\n\n@Directive({\n  selector: '[dsfrDateMask]',\n  standalone: true,\n})\n/**\n * L'objectif de cette directive est de proposer un masque de saisie sous la forme dd/mm/yyyy.\n *\n * @since 0.10\n */\nexport class DateMaskDirective implements AfterViewInit, OnDestroy {\n  private _dsfrDateMask: string = '';\n\n  private listenKeyup: any;\n  private listenKeydown: any;\n\n  private readonly hostComponent: DsfrDatePickerComponent = inject(DsfrDatePickerComponent);\n  private readonly elementRef: ElementRef = inject(ElementRef);\n  private readonly renderer: Renderer2 = inject(Renderer2);\n\n  @Input() set dsfrDateMask(value: string) {\n    this._dsfrDateMask = value;\n    this.doHideShowMask();\n  }\n\n  /**\n   * NOTE : Pourquoi ngAfterViewInit plutôt que ngOnInit ?\n   * Et bien, parce que dans ngOnInit, le DOM n'est pas encore construit et que l'ajout de listeners en fonction\n   * de la valeur du masque ne marche pas car, this.elementRef.nativeElement.querySelector('.fr-input') === null\n   * et du coup rien ne marche !!!\n   */\n  ngAfterViewInit() {\n    this.doHideShowMask();\n  }\n\n  ngOnDestroy() {\n    this.removeListeners();\n  }\n\n  /**\n   * Cache / affiche le masque en fonction de la propriété `mask`.\n   */\n  private doHideShowMask() {\n    const showMask = this._dsfrDateMask !== '';\n    if (showMask) {\n      this.addListeners();\n    } else {\n      this.removeListeners();\n    }\n  }\n\n  private addListeners(): void {\n    // TODO: as string a enlever\n    if (this.hostComponent.mode === 'single') {\n      this.hostComponent.value = formatDateMaskValue(this.hostComponent.value as string);\n    }\n\n    if (this.hostComponent.mode === 'range') {\n      this.hostComponent.value = !this.hostComponent.value\n        ? [undefined, undefined]\n        : [\n            formatDateMaskValue(this.hostComponent.value[0] as string),\n            formatDateMaskValue(this.hostComponent.value[1] as string),\n          ];\n    }\n\n    // NOTE : Pourquoi ne pas utiliser renderer.selectRootElement() ?\n    // Parce que le setter de dsfrDateMask est invoqué lors de l'étape d'init, le DOM n'est pas construit\n    // et que selectRootElement affiche une exception dans la console, contrairement à querySelector\n    // A l'init inputElt === null\n    const inputElt = this.elementRef.nativeElement.querySelector('.fr-input');\n    if (inputElt) {\n      this.listenKeydown = this.renderer.listen(inputElt, 'keydown', onInputKeyDown);\n      this.listenKeyup = this.renderer.listen(inputElt, 'keyup', onInputKeyUp);\n    }\n  }\n\n  private removeListeners(): void {\n    if (this.listenKeydown) {\n      this.listenKeydown();\n    }\n    if (this.listenKeyup) {\n      this.listenKeyup();\n    }\n  }\n}\n\n/* -- Traitement du masque ------------------------------------------------------------------------------------------ */\n\n/**\n * Traite les événements du clavier dans le champ date.\n * - Permet la saisie des chiffres de 0 à 9\n * - Permet la tabulation avant / arrière dans les parties jour / mois / année\n * @param event\n */\nfunction onInputKeyDown(event: KeyboardEvent): void {\n  // Si ce n'est pas un nombre, on ne fait rien\n  const inputElt = <HTMLInputElement>event.currentTarget;\n  const isDigit = /\\d/.test(event.key);\n  if (isDigit) {\n    doDigitKeyDown(inputElt);\n  } else {\n    switch (event.key) {\n      case 'Tab':\n        const eventProcessed = event.shiftKey ? doShiftTabKey(inputElt) : doTabKey(inputElt);\n        if (eventProcessed) {\n          event.preventDefault();\n        }\n        break;\n      default: {\n        const isLetter = /[a-zA-Z]/.test(event.key);\n        if (isLetter) {\n          event.stopPropagation();\n        }\n      }\n    }\n  }\n}\n\n/**\n * Finalise le traitement du clavier après insertion d'un digit.\n */\nfunction onInputKeyUp(event: KeyboardEvent): void {\n  // Si ce n'est pas un nombre, on ne fait rien\n  const inputElt = <HTMLInputElement>event.currentTarget;\n  const isDigit = /\\d/.test(event.key);\n  if (isDigit) {\n    doDigitKeyUp(inputElt);\n  }\n\n  if (inputElt.value.length === 0) {\n    inputElt.value = formatDateMaskValue('');\n    inputElt.setSelectionRange(0, 0);\n  }\n}\n\n/**\n * Traitement AVANT insertion d'un digit dans le champ date\n * - Suppression de '_' qui sera remplacé par le digit (le champ ne dépasse pas 10 caractères)\n * - On replace le curseur où il était\n */\nfunction doDigitKeyDown(inputElt: HTMLInputElement) {\n  // Au cas où l'utilisateur a cliqué devant un séparateur, on le saute\n  // Et ben NON, car si on a 1/1^/2024 (le chapeau représentant le point d'insertion), on laisse faire\n  const value = inputElt.value || '';\n  let selStart = inputElt.selectionStart || 0;\n\n  // On supprime le '_' afin de pouvoir insérer le digit à la place\n  if (value[selStart] == '_') {\n    inputElt.value = value.slice(0, selStart) + value.slice(selStart + 1);\n    inputElt.selectionStart = selStart;\n    inputElt.selectionEnd = selStart;\n  }\n}\n\n/**\n * Traitement APRES insertion d'un caractère dans le champ date\n * - Saut d'un séparateur s'il y a lieu\n * - Reformatage du champ si l'utilisateur a supprimé des éléments du masque\n */\nfunction doDigitKeyUp(inputElt: HTMLInputElement): void {\n  // Au cas où l'utilisateur se retrouve devant un séparateur, on le saute\n  const value = inputElt.value || '';\n  let selStart = inputElt.selectionStart || 0;\n  if (value[selStart] === '/' && (selStart === 2 || selStart == 5)) {\n    inputElt.selectionStart = ++selStart;\n  }\n\n  // On reformate si nécessaire\n  if (value.length < 8) {\n    inputElt.value = formatDateMaskValue(inputElt.value);\n  }\n}\n\n/**\n * Tab AVANT dans le champ date\n * - Tabulation en avant de part en part (jour, mois, année), puis tabulation sur champ suivant\n */\nfunction doTabKey(inputElt: HTMLInputElement): boolean {\n  const value = inputElt.value || '';\n  const selEnd = inputElt.selectionEnd || 0;\n  const pos = value.indexOf('/', selEnd);\n  if (pos > -1) {\n    inputElt.selectionStart = pos + 1;\n    inputElt.selectionEnd = inputElt.selectionStart;\n  }\n  return pos > -1;\n}\n\n/**\n * Tab ARRIERE dans le champ date\n * - Tabulation en arrière de part en part (année, mois, jour), puis tabulation sur champ précédent\n */\nfunction doShiftTabKey(inputElt: HTMLInputElement): boolean {\n  const value = inputElt.value || '';\n  const selStart = inputElt.selectionStart || 0;\n  const pos = value.substring(0, selStart).lastIndexOf('/');\n  if (pos > -1) {\n    inputElt.selectionStart = pos;\n    inputElt.selectionEnd = inputElt.selectionStart;\n  }\n  return pos > -1;\n}\n\n/**\n * Reformatage de la valeur, quelle que soit la saisie\n * @param input\n */\nexport function formatDateMaskValue(input: string | undefined): string {\n  const regexp = /^(?<day>[\\d_]{0,2})(?<s1>\\/?)(?<month>[\\d_]{0,2})(?<s2>\\/?)(?<year>[\\d_]{0,4})$/;\n  const reArr = regexp.exec(input || '');\n  const groups = reArr?.groups;\n  let value = MASK_DATE;\n  if (groups) {\n    let day = groups['day'] || '__';\n    day = groups['s1'] ? day : day.padEnd(2, '_');\n    let month = groups['month'] || '__';\n    month = groups['s2'] ? month : month.padEnd(2, '_');\n    let year = groups['year'] || '____';\n    year = year.padEnd(4, '_');\n    value = day + '/' + month + '/' + year;\n  }\n\n  return value;\n}\n","import { A11yModule } from '@angular/cdk/a11y';\n\nimport { CommonModule } from '@angular/common';\nimport {\n  AfterViewInit,\n  booleanAttribute,\n  ChangeDetectorRef,\n  Component,\n  computed,\n  ElementRef,\n  EventEmitter,\n  forwardRef,\n  inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  Output,\n  Signal,\n  signal,\n  ViewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport {\n  AbstractControl,\n  FormsModule,\n  NG_VALIDATORS,\n  NG_VALUE_ACCESSOR,\n  ValidationErrors,\n  Validator,\n} from '@angular/forms';\nimport {\n  DefaultControlComponent,\n  DsfrButtonComponent,\n  DsfrFormFieldsetComponent,\n  DsfrFormFieldsetElementDirective,\n  DsfrFormInputModule,\n  DsfrFormSelectModule,\n  DsfrI18nPipe,\n  DsfrI18nService,\n  DsfrSeverity,\n  DsfrSeverityConst,\n  LangService,\n  Language,\n  LoggerService,\n  newUniqueId,\n} from '@edugouvfr/ngx-dsfr';\nimport { DsfrCalendarComponent, DsfrCalendarMode, DsfrRangeModel } from '../calendar/calendar.component';\nimport { MESSAGES_EN as CALENDAR_MESSAGES_EN } from '../calendar/i18n/messages.en';\nimport { MESSAGES_FR as CALENDAR_MESSAGES_FR } from '../calendar/i18n/messages.fr';\nimport { DropdownContainerComponent } from '../shared/components';\nimport { DsfrDateEvent } from '../shared/models/date-event';\nimport { DateUtils } from '../shared/utils/date/date-utils';\nimport { MESSAGES_EN } from './i18n/messages.en';\nimport { MESSAGES_FR } from './i18n/messages.fr';\nimport { DateFormatDirective } from './mask/date-format.directive';\nimport { DateMaskDirective } from './mask/date-mask.directive';\n\n// TODO: Dégrossir le composant en séparant les fonctions single et range\n\n/**\n * Réprésente un message + sévérité.\n */\ninterface MessageViewModel {\n  text?: string | string[];\n  severity?: DsfrSeverity;\n}\n\n/**\n * Implémente la saisie d'une date via un input ou via un calendrier affichant les jours et les mois.\n * Validator est implémenté uniquement par rapport à min et max\n * @since 0.10\n * @author pfontanet\n */\n@Component({\n  selector: 'dsfr-ext-datepicker, dsfrx-datepicker',\n  encapsulation: ViewEncapsulation.None,\n  templateUrl: './datepicker.component.html',\n  styleUrls: ['./datepicker.component.scss'],\n  imports: [\n    DsfrFormInputModule,\n    FormsModule,\n    DateFormatDirective,\n    DsfrFormSelectModule,\n    A11yModule,\n    DsfrCalendarComponent,\n    DsfrI18nPipe,\n    CommonModule,\n    DropdownContainerComponent,\n    DsfrFormFieldsetComponent,\n    forwardRef(() => DateMaskDirective),\n    DsfrFormFieldsetElementDirective,\n    DsfrButtonComponent,\n  ],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => DsfrDatePickerComponent),\n      multi: true,\n    },\n    {\n      provide: NG_VALIDATORS,\n      useExisting: forwardRef(() => DsfrDatePickerComponent),\n      multi: true,\n    },\n  ],\n})\nexport class DsfrDatePickerComponent\n  extends DefaultControlComponent<string | DsfrRangeModel>\n  implements OnInit, AfterViewInit, Validator, OnDestroy\n{\n  /**\n   * Indique si la date est obligatoire.\n   */\n  @Input() required = false;\n\n  /**\n   * Indique si le masque de saisie doit être affiché ou non.\n   */\n  @Input() showMask = false;\n\n  /**\n   * Cache le Label visuellement en le laissant disponible aux lecteurs d'écran.\n   */\n  @Input() labelSrOnly = false;\n\n  /**\n   * Indique la valeur de la propriété css z-index de la modale du composant.\n   */\n  @Input() zIndex?: number;\n\n  /** Attacher l'élément de liste déroulante au 'body' ou a un container (réf. vers un élément #div ou nom de la classe du parent) */\n  @Input() appendTo?: 'body' | HTMLElement | string;\n\n  /** Modifie le mode de sélection du datepicker, entre `single` et `range` */\n  @Input() mode: DsfrCalendarMode = 'single';\n\n  /** Force l'utilisation du mode regular pour la légende du fieldset en mode range */\n  @Input({ transform: booleanAttribute }) rangeLegendRegular: boolean = true;\n\n  /** Emission de la date.*/\n  @Output() dateChange = new EventEmitter<DsfrDateEvent>();\n\n  @ViewChild(DsfrCalendarComponent)\n  protected calendar?: DsfrCalendarComponent;\n\n  @ViewChild('controlSingle', { read: ElementRef })\n  protected controlSingle?: ElementRef;\n\n  @ViewChild('controlRange', { read: ElementRef })\n  protected controlRange?: ElementRef;\n\n  @ViewChild('modal')\n  protected modal?: ElementRef<HTMLDivElement>;\n\n  /**\n   * Presentation Model pour la priorisation des messages.\n   */\n  protected readonly messageDateViewModel: Signal<MessageViewModel> = computed(() => {\n    const internalError = this._internalError();\n    const message = this.messageViewModel();\n    const severity = this.severityViewModel();\n\n    return {\n      text: internalError || message,\n      severity: internalError ? DsfrSeverityConst.ERROR : severity,\n    };\n  });\n\n  protected currentMonthIndex: number = new Date().getMonth();\n  protected currentYear: number = new Date().getFullYear();\n  protected translatedMonthAbbreviations: string[] = [];\n  protected translatedMonths: string[] = [];\n  protected calendarHeading = '';\n  protected modalLabel = '';\n  protected startDate: string | undefined = undefined;\n  protected endDate: string | undefined = undefined;\n\n  /** Permet d'ignorer la valeur passée en input à l'ouverture de la modale, notamment si cette valeur est invalide */\n  protected ignoreCalendarInitialValue = false;\n\n  /** Gère l'annonce de la date/période sélectionnée à la fermeture de la modale (si sélection effective) */\n  protected statusMessage: string | undefined = undefined;\n\n  /**\n   * Placeholder par défaut de l'input. Dépend de la langue 'jj/mm/aaaa' ou 'mm/dd/yyyy'\n   */\n  protected placeholder: string | undefined;\n\n  /**\n   * Id aléatoire, unique, de la modale (le calendrier)\n   */\n  protected modalId = newUniqueId();\n\n  protected isOpen = false;\n  protected buttonLabelChoose: string = '';\n  protected buttonLabelRangeChoose: string = '';\n\n  protected dropdownContainerControlElement: HTMLElement | undefined;\n\n  /* Node */\n  private dialogTriggerBtnNode: HTMLElement | undefined;\n\n  private prevCodeLang: string;\n\n  /* Messages */\n  private dayLabels: string[] = [];\n  private monthLabels: string[] = [];\n\n  private _min: string | undefined = undefined;\n  private _max: string | undefined = undefined;\n\n  /**\n   * Message d'information lié au composant.\n   */\n  private readonly _message = signal<string | undefined>(undefined);\n\n  /**\n   * Représente la sévérité du message.\n   */\n  private readonly _messageSeverity = signal<DsfrSeverity>(DsfrSeverityConst.ERROR);\n\n  /**\n   * Messages d'erreurs relatifs à une validation interne spécifique au composant.\n   */\n  private readonly _internalError = signal<string | undefined>(undefined);\n\n  private readonly cdr = inject(ChangeDetectorRef);\n  private readonly elementRef = inject(ElementRef);\n  private readonly i18n = inject(DsfrI18nService);\n  private readonly langService = inject(LangService);\n  private readonly logger = inject(LoggerService);\n\n  /** @internal */\n  constructor() {\n    super();\n    const langService = this.langService;\n\n    this.i18n.extendsLabelsBundle(Language.EN, CALENDAR_MESSAGES_EN);\n    this.i18n.extendsLabelsBundle(Language.FR, CALENDAR_MESSAGES_FR);\n    this.i18n.extendsLabelsBundle(Language.EN, MESSAGES_EN);\n    this.i18n.extendsLabelsBundle(Language.FR, MESSAGES_FR);\n    this.prevCodeLang = langService.lang;\n    this.i18n.completeLangChange$.subscribe((code) => this.onLangChange(code));\n  }\n\n  override get value(): string | DsfrRangeModel | undefined {\n    return super.value;\n  }\n\n  /**\n   * @return Le code de la langue en cours\n   */\n  get codeLang() {\n    return this.langService.lang;\n  }\n\n  /**\n   * @internal\n   */\n  get min(): string | undefined {\n    return this._min;\n  }\n\n  /**\n   * @internal\n   */\n  get max(): string | undefined {\n    return this._max;\n  }\n\n  protected get isEnglishLocale(): boolean {\n    return this.langService.lang === 'en';\n  }\n\n  @Input()\n  override set value(value: string | DsfrRangeModel | undefined) {\n    super.value = this.formatValue(value);\n    // le principe est d'émettre dateChange si et seulement si la value courante est bien formée\n    if (this.handleInternalValidation() === null) {\n      const date = this.mode === 'single' ? DateUtils.parse(this.codeLang, value as string) : undefined;\n      this.dateChange.emit({ value: this.value, date: date });\n      this.updateCalendarHeading();\n    }\n  }\n\n  /**\n   * Date minimale inclue. Doit être au format IS0-8601 : AAAA-MM-JJ.\n   * Ce paramètre peut être utilisé seul ou avec la propriété max.\n   */\n  @Input()\n  set min(value: string | undefined) {\n    if (value && !this.isValidIso(value)) {\n      this.logger.warn(\n        `dsfr-date-picker: La propriété min a un format incorrect. Attendu: 'YYYY-MM-DD'. Reçu: ${value}`,\n      );\n\n      this._min = undefined;\n    } else {\n      this._min = value;\n    }\n  }\n\n  /**\n   * Date maximale inclue. Doit être au format IS0-8601 : AAAA-MM-JJ.\n   * Ce paramètre peut être utilisé seul ou avec la propriété min.\n   */\n  @Input()\n  set max(value: string | undefined) {\n    if (value && !this.isValidIso(value)) {\n      this.logger.warn(\n        `dsfr-date-picker: La propriété max a un format incorrect. Attendu: 'YYYY-MM-DD'. Reçu: ${value}`,\n      );\n\n      this._max = undefined;\n    } else {\n      this._max = value;\n    }\n  }\n\n  override ngOnInit(): void {\n    super.ngOnInit();\n    if (this.showMask) {\n      // si le masque est activé, on retire le placeholder par défaut pour éviter les artefacts visuels lorsque\n      // l'utilisateur vide le champ\n      //FIXME: à rendre dynamique ?\n      this.placeholder = '';\n    }\n  }\n\n  ngOnDestroy() {\n    this.dialogTriggerBtnNode?.removeEventListener('keydown', this.handleTriggerButtonKeydown);\n  }\n\n  ngAfterViewInit() {\n    if (this.mode === 'single') {\n      this.dialogTriggerBtnNode = this.elementRef.nativeElement.querySelector('dsfr-form-input .fr-btn');\n      this.dropdownContainerControlElement = this.controlSingle?.nativeElement;\n\n      // Listener ne pouvant pas être remplacé, car on ne reçoit pas cet événement depuis form-input\n      this.dialogTriggerBtnNode?.addEventListener('keydown', this.handleTriggerButtonKeydown.bind(this));\n      // this.setDateForTriggerButtonLabel();\n    }\n\n    if (this.mode === 'range') {\n      this.dropdownContainerControlElement = this.controlRange?.nativeElement;\n      this.dialogTriggerBtnNode = this.elementRef.nativeElement.querySelector('dsfr-fieldset .fr-btn');\n    }\n\n    this.close(false);\n    this.cdr.detectChanges(); // pour éviter l'erreur ExpressionChangedAfterItHasBeenCheckedError (non visible dans\n    // storybook) causée par la mise à jour de la propriété dropdownContainerControlElement qui est dépendante d'une\n    // injection @ViewChild qui n'est disponible qu'à partir de ngAfterViewInit\n  }\n\n  /**\n   * From Validator interface.\n   *\n   * @internal\n   */\n  validate(control: AbstractControl): ValidationErrors | null {\n    return this.handleInternalValidation(true);\n  }\n\n  /**\n   * Surcharge de ControlValueAccessor#writeValue permettant potentiellement de corriger le format de la valeur saisie\n   * avant enregistrement dans le modèle.\n   * @internal\n   */\n  override writeValue(value: string | DsfrRangeModel | undefined): void {\n    super.writeValue(this.formatValue(value));\n  }\n\n  /**\n   * Il faut écouter focusout et non blur car ce dernier ne bubble pas donc le composant parent ne le capte pas.\n   */\n  protected onInputSingleFocusout() {\n    this.handleSingleModeInternalValidation(true);\n    this.fnOnTouched();\n  }\n\n  /**\n   * Il faut écouter focusout et non blur car ce dernier ne bubble pas donc le composant parent ne le capte pas.\n   */\n  protected onInputRangeFocusout() {\n    this.handleRangeModeInternalValidation(true);\n    this.fnOnTouched();\n  }\n\n  /**\n   * La date de début ou de fin du range vient d'être modifiée. Il faut appeler la fonction enregistrée via\n   * registerOnChange pour indiquer à Angular que la value a changé et qu'il doit revalider le modèle.\n   */\n  protected onRangeModelChange() {\n    this.fnOnChange(this.value);\n  }\n\n  /**\n   * Mise a jour du titre lors de la navigation dans le calendrier.\n   */\n  protected onUpdateCalendarView(date: Date) {\n    this.currentMonthIndex = date ? new Date(date).getMonth() : new Date().getMonth();\n    this.currentYear = date ? new Date(date).getFullYear() : new Date().getFullYear();\n    this.calendarHeading = `${this.i18n.t('calendar.modal.title')}${this.translatedMonths[this.currentMonthIndex]} ${this.currentYear}`;\n  }\n\n  /**\n   * Gère le clic en dehors de la modale\n   */\n  protected onCalendarOutside() {\n    if (this.isOpen) {\n      this.close(false);\n      this.fnOnTouched();\n    }\n  }\n\n  protected handleTriggerButtonClick(event: Event): void {\n    if (this.isOpen) {\n      this.close();\n    } else {\n      this.open();\n    }\n\n    event.stopPropagation();\n    event.preventDefault();\n  }\n\n  protected handleTriggerButtonKeydown(event: KeyboardEvent): void {\n    if (event.key === 'Enter' || event.key === ' ') {\n      this.handleTriggerButtonClick(event);\n    }\n  }\n\n  protected handleCancelButton(event: Event): void {\n    let flagToPreventDefault = false;\n\n    switch (event.type) {\n      case 'keydown':\n        const keyEvent = <KeyboardEvent>event;\n        switch (keyEvent.key) {\n          case 'Esc':\n          case 'Escape':\n            this.close();\n            flagToPreventDefault = true;\n            break;\n\n          default:\n            break;\n        }\n        break;\n\n      case 'click':\n        this.close();\n        flagToPreventDefault = true;\n        break;\n\n      default:\n        break;\n    }\n\n    if (flagToPreventDefault) {\n      event.stopPropagation();\n      event.preventDefault();\n    }\n  }\n\n  protected handleModalKeydown(keyEvent: KeyboardEvent): void {\n    if (keyEvent.key === 'Escape') {\n      keyEvent.stopPropagation();\n      keyEvent.preventDefault();\n      this.close();\n    }\n  }\n\n  protected onCalendarVisible(): void {\n    if (this.calendar) {\n      this.calendar.focusDate();\n    }\n  }\n\n  protected onCalendarDateChange(dateEvent: DsfrDateEvent): void {\n    this.value = dateEvent.value;\n    this.handleInternalValidation();\n    this.announceNewValue();\n    this.close(true);\n  }\n\n  private formatValue(value: string | DsfrRangeModel | undefined): string | DsfrRangeModel | undefined {\n    if (this.mode === 'range') {\n      return value ? this.reformatRangeModeValue(value as DsfrRangeModel) : [undefined, undefined];\n    }\n\n    return this.reformatSingleModeValue(value as string);\n  }\n\n  private containsMaskLiteral(value: string): boolean {\n    if (!value) return false;\n\n    return /_+\\/_+\\/_+/.test(value);\n  }\n\n  /**\n   * Met à jour l'étiquette accessible du calendrier (visuellement cachée).\n   */\n  private updateCalendarHeading(): void {\n    this.updateMonthIndexAndYear();\n    const title =\n      this.mode === 'range' ? this.i18n.t('calendar.modal.titleRange') : this.i18n.t('calendar.modal.title');\n    this.calendarHeading = `${title}${this.translatedMonths[this.currentMonthIndex]} ${this.currentYear}`;\n  }\n\n  /**\n   * Gère la validation interne de la date pour les critères de date min et date max.\n   *\n   * @param showMessage\n   *\n   * @returns `true` en cas d'erreur, false sinon.\n   */\n  private handleInternalValidation(updateMessage = false): ValidationErrors | null {\n    if (this.mode === 'range') {\n      return this.handleRangeModeInternalValidation(updateMessage);\n    }\n\n    return this.handleSingleModeInternalValidation(updateMessage);\n  }\n\n  private handleSingleModeInternalValidation(updateMessage = false): ValidationErrors | null {\n    // si le masque est activé est que la valeur contient encore des éléments de masquage, on ne valide pas la saisie\n    if (this.showMask && this.containsMaskLiteral(this.value as string)) {\n      return null;\n    }\n\n    if (!this.value) {\n      //TODO: ne pas affecter directement this.messsage mais une propriété tenant les messages _internes_\n      // puis combiner les deux pour affichage en regardant ce qu'on a fait sur le pattern date\n      if (updateMessage) {\n        this._internalError.set(undefined);\n      }\n      return null;\n    }\n\n    const date = this.parseAsDateObject(this.value as string);\n    if (!date) {\n      return this.processError('err_date_invalid', 'datepicker.validationDate', updateMessage);\n    }\n\n    const minDate = this.min ? DateUtils.parseDateIso(this.min) : undefined;\n    const maxDate = this.max ? DateUtils.parseDateIso(this.max) : undefined;\n\n    if (minDate && date && date < minDate) {\n      return this.processError('err_date_min', 'datepicker.validationMin', updateMessage);\n    } else if (maxDate && date && maxDate < date) {\n      return this.processError('err_date_max', 'datepicker.validationMax', updateMessage);\n    }\n\n    if (updateMessage) {\n      this._internalError.set(undefined);\n    }\n    return null;\n  }\n\n  private handleRangeModeInternalValidation(updateMessage = false): ValidationErrors | null {\n    if (!this.value || !this.value[0] || !this.value[1]) {\n      if (updateMessage) {\n        this._internalError.set(undefined);\n      }\n      return null;\n    }\n\n    // si le masque est activé est que la valeur contient encore des éléments de masquage, on ne valide pas la saisie\n    if (this.mode === 'range' && (this.containsMaskLiteral(this.value[0]) || this.containsMaskLiteral(this.value[1]))) {\n      return null;\n    }\n\n    const startDate = this.parseAsDateObject(this.value[0] as string);\n    const endDate = this.parseAsDateObject(this.value[1] as string);\n\n    if (!startDate) {\n      return this.processError('err_range_start_date_invalid', 'datepicker.validationStartDate', updateMessage);\n    } else if (!endDate) {\n      return this.processError('err_range_end_date_invalid', 'datepicker.validationEndDate', updateMessage);\n    }\n\n    const minDate = this.min ? DateUtils.parseDateIso(this.min) : undefined;\n    const maxDate = this.max ? DateUtils.parseDateIso(this.max) : undefined;\n\n    if (startDate && endDate && startDate > endDate) {\n      this.ignoreCalendarInitialValue = true;\n      return this.processError('err_range_end_before_start', 'datepicker.validationEndBeforeStart', updateMessage);\n    } else if (maxDate && endDate && maxDate < endDate) {\n      return this.processError('err_range_date_max', 'datepicker.validationMax', updateMessage);\n    } else if (minDate && startDate && startDate < minDate) {\n      return this.processError('err_range_date_min', 'datepicker.validationMin', updateMessage);\n    }\n\n    if (updateMessage) {\n      this._internalError.set(undefined);\n    }\n    this.ignoreCalendarInitialValue = false;\n    return null;\n  }\n\n  private processError(errorKey: string, messageI18nKey: string, showMessage = false): ValidationErrors {\n    const msg = this.i18n.t(messageI18nKey);\n    if (showMessage) {\n      this._internalError.set(msg);\n    }\n    return { [errorKey]: msg };\n  }\n\n  private parseAsDateObject(value: string) {\n    return DateUtils.parse(this.codeLang, value) || DateUtils.parseDateIso(value);\n  }\n\n  /**\n   * Changement de la valeur de l'input et formatage dans la langue courante\n   * @param value Valeur au format ISO ou dans la langue courante\n   */\n  private reformatSingleModeValue(value: string | undefined): string | undefined {\n    if (!value) {\n      return value;\n    }\n\n    const parsedIsoDate = DateUtils.parseDateIso(value);\n\n    if (parsedIsoDate === undefined) {\n      return value;\n    }\n\n    return DateUtils.format(this.codeLang, parsedIsoDate);\n  }\n\n  /**\n   * Changement de la valeur de l'input et formatage dans la langue courante\n   * @param value Valeur au format ISO ou dans la langue courante\n   */\n  private reformatRangeModeValue(value: DsfrRangeModel | undefined): DsfrRangeModel | undefined {\n    if (!value) {\n      return value;\n    }\n\n    const parsedIsoStartDate = DateUtils.parseDateIso(value[0]!);\n    const parsedIsoEndDate = DateUtils.parseDateIso(value[1]!);\n\n    if (parsedIsoStartDate === undefined && parsedIsoEndDate === undefined) {\n      return value;\n    }\n\n    return [DateUtils.format(this.codeLang, parsedIsoStartDate), DateUtils.format(this.codeLang, parsedIsoEndDate)];\n  }\n\n  /**\n   * Gestion du changement de langue dans le composant.\n   *\n   * @param code Code de la locale à prendre en compte\n   */\n  private onLangChange(code: string): void {\n    this.placeholder = this.i18n.t('datepicker.placeholder');\n\n    this.buttonLabelChoose = this.i18n.t('datepicker.button.choose.label');\n    this.buttonLabelRangeChoose = this.i18n.t('datepicker.button.chooseRange.label');\n    this.dayLabels = DateUtils.arr(this.i18n, this.logger, 'calendar.days');\n    this.monthLabels = DateUtils.arr(this.i18n, this.logger, 'calendar.months');\n    this.modalLabel =\n      this.mode === 'single' ? this.i18n.t('calendar.modal.ariaLabel') : this.i18n.t('calendar.modal.ariaLabelRange');\n\n    this.updateMonthTranslations();\n    this.updateCalendarHeading();\n\n    // Reformatage de l'input\n    this.reformatForNewCodeLang(code);\n    this.prevCodeLang = code;\n  }\n\n  private reformatForNewCodeLang(code: string) {\n    if (this.mode === 'single') {\n      const date = DateUtils.parse(this.prevCodeLang, this.value as string);\n      const newValue = DateUtils.format(code, date);\n      this.value = newValue;\n    }\n\n    if (this.mode === 'range') {\n      const startDate = this.value ? DateUtils.parse(this.codeLang, this.value[0] as string) : undefined;\n      const endDate = this.value ? DateUtils.parse(this.codeLang, this.value[1] as string) : undefined;\n      const newStartValue = DateUtils.format(code, startDate);\n      const newEndValue = DateUtils.format(code, endDate);\n      this.value = [newStartValue, newEndValue];\n    }\n  }\n\n  /**\n   * Ouvre la modale.\n   */\n  private open(): void {\n    this.updateCalendarHeading();\n    this.isOpen = true;\n  }\n\n  /**\n   * Ferme la modale.\n   *\n   * Positionne le focus sur le bouton d'ouverture de la modale si besoin.\n   *\n   * @param focusTriggerBtn Permet de savoir si le focus doit être donné au bouton d'ouverture de la modale\n   */\n  private close(focusTriggerBtn = true): void {\n    if (!this.modal) {\n      return;\n    }\n    this.isOpen = false;\n\n    if (focusTriggerBtn) {\n      this.dialogTriggerBtnNode?.focus();\n    }\n  }\n\n  /**\n   * Méthode invoquée à la sortie de l'input text. Formate l'input et affecte la propriété 'aria-label' du bouton de\n   * sélection du calendrier. A noter que, si la date est exacte, 'aria-label' contient la date, ex :\n   * \"Changer la date, Lundi Mai 27, 2024\" ou =\"Change Date, Monday July 1, 2024\"\n   * - i18n : le code de parsing est remplacé par un appel à DateUtils\n   */\n  private announceNewValue(): void {\n    if (this.mode === 'single') {\n      this.announceNewValueInSingleMode();\n    }\n\n    if (this.mode === 'range') {\n      this.announceNewValueInRangeMode();\n    }\n  }\n\n  private announceNewValueInSingleMode() {\n    const day = DateUtils.parse(this.codeLang, this.value as string);\n\n    if (day) {\n      const selectedDate = this.i18n.t('datepicker.selectedDate');\n      const dayLabel = this.dayLabels[day.getDay()];\n      const dateLabel = day.getDate();\n      const monthLabel = this.monthLabels[day.getMonth()];\n      const fullYear = day.getFullYear();\n\n      this.statusMessage = `${selectedDate}${dayLabel} ${dateLabel} ${monthLabel}, ${fullYear}`;\n    }\n  }\n\n  private announceNewValueInRangeMode() {\n    const startDate = this.value ? DateUtils.parse(this.codeLang, this.value[0] as string) : undefined;\n    const endDate = this.value ? DateUtils.parse(this.codeLang, this.value[1] as string) : undefined;\n\n    if (startDate && endDate) {\n      const selectedRange = this.i18n.t('datepicker.selectedRange');\n      const startDayLabel = this.dayLabels[startDate.getDay()];\n      const startDateLabel = ' ' + startDate.getDate();\n      const startMonthLabel = ' ' + this.monthLabels[startDate.getMonth()];\n      const startFullYearLabel = ', ' + startDate.getFullYear();\n      const endDayLabel = ', ' + this.dayLabels[endDate.getDay()];\n      const endDateLabel = ' ' + endDate.getDate();\n      const endMonthLabel = ' ' + this.monthLabels[endDate.getMonth()];\n      const endFullYearLabel = ', ' + endDate.getFullYear();\n      this.statusMessage = `${selectedRange}${startDayLabel} ${startDateLabel} ${startMonthLabel}, ${startFullYearLabel}, ${endDayLabel} ${endDateLabel} ${endMonthLabel}, ${endFullYearLabel}`;\n    }\n  }\n\n  private updateMonthTranslations(): void {\n    this.translatedMonths = DateUtils.arr(this.i18n, this.logger, 'calendar.months');\n    this.translatedMonthAbbreviations = DateUtils.arr(this.i18n, this.logger, 'calendar.monthsAbbr');\n  }\n\n  private isValidIso(boundaryString: string): boolean {\n    const dateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n    return dateRegex.test(boundaryString);\n  }\n\n  /**\n   * Mise à jour du mois et de l'année pour le titre de la modale.\n   */\n  private updateMonthIndexAndYear(): void {\n    const rangeValue = this.value ? this.value[0] : undefined;\n    const value = this.mode === 'single' ? this.value : rangeValue;\n    const date = DateUtils.parse(this.codeLang, value as string);\n    this.currentMonthIndex = date ? new Date(date).getMonth() : new Date().getMonth();\n    this.currentYear = date ? new Date(date).getFullYear() : new Date().getFullYear();\n  }\n}\n\n//TODO:: utiliser la fonction exportée depuis ngx-dsfr@1.16.0\nexport function toArray(value: string | string[] | undefined): string[] {\n  if (Array.isArray(value)) {\n    return value;\n  } else {\n    return value ? [value] : [];\n  }\n}\n","<div class=\"dsfrx-datepicker\">\n  @if (mode === 'single') {\n    <dsfr-form-input\n      #controlSingle\n      [dsfrDateMask]=\"showMask ? codeLang : ''\"\n      [dsfrDateFormat]=\"showMask ? '' : codeLang\"\n      [(ngModel)]=\"value\"\n      [ngModelOptions]=\"{ updateOn: 'blur' }\"\n      (focusout)=\"onInputSingleFocusout()\"\n      [label]=\"label\"\n      [hint]=\"hint\"\n      [placeholder]=\"placeholder\"\n      [disabled]=\"disabled\"\n      [required]=\"required\"\n      [message]=\"messageDateViewModel().text\"\n      [messageSeverity]=\"messageDateViewModel().severity\"\n      [buttonIcon]=\"'fr-icon-calendar-2-line'\"\n      [buttonDisabled]=\"disabled\"\n      [labelSrOnly]=\"labelSrOnly\"\n      [buttonAriaLabel]=\"buttonLabelChoose\"\n      (buttonSelect)=\"handleTriggerButtonClick($event)\"\n      [maxLength]=\"10\"\n      data-testid=\"datepicker-input\">\n      <!-- Nécessaire pour projeter le slot label optionnel dans le composant enfant dsfr-form-input -->\n      <ng-container label> <ng-content select=\"[label]\"> </ng-content></ng-container>\n    </dsfr-form-input>\n  }\n\n  @if (mode === 'range') {\n    <dsfr-fieldset\n      #controlRange\n      class=\"dsfrx-range-fieldset\"\n      [ngClass]=\"{\n        'dsfrx-range-fieldset--error': messageDateViewModel().severity === 'error' && message(),\n        'dsfrx-range-fieldset--valid': messageDateViewModel().severity === 'valid' && message(),\n      }\"\n      [legend]=\"label\"\n      [legendRegular]=\"rangeLegendRegular\"\n      [hint]=\"hint!\"\n      [inline]=\"true\"\n      [message]=\"messageDateViewModel().text\"\n      [messageSeverity]=\"messageDateViewModel().severity\"\n      [fieldsetId]=\"inputId\">\n      <dsfr-form-input\n        *fieldsetElement\n        class=\"dsfrx-range-fieldset__start-input\"\n        [label]=\"'datepicker.startDateLabel' | dsfrI18n\"\n        [dsfrDateMask]=\"showMask ? codeLang : ''\"\n        [dsfrDateFormat]=\"showMask ? '' : codeLang\"\n        [(ngModel)]=\"value![0]\"\n        [ngModelOptions]=\"{ updateOn: 'blur' }\"\n        (ngModelChange)=\"onRangeModelChange()\"\n        (focusout)=\"onInputRangeFocusout()\"\n        [placeholder]=\"placeholder\"\n        [disabled]=\"disabled\"\n        [required]=\"required\"\n        [labelSrOnly]=\"true\"\n        [maxLength]=\"10\"\n        data-testid=\"datepicker-input-start\">\n        <!-- Nécessaire pour projeter le slot label optionnel dans le composant enfant dsfr-form-input -->\n        <ng-container label> <ng-content select=\"[label]\"> </ng-content></ng-container>\n      </dsfr-form-input>\n\n      <dsfr-form-input\n        *fieldsetElement\n        class=\"dsfrx-range-fieldset__end-input\"\n        [label]=\"'datepicker.endDateLabel' | dsfrI18n\"\n        [dsfrDateMask]=\"showMask ? codeLang : ''\"\n        [dsfrDateFormat]=\"showMask ? '' : codeLang\"\n        [(ngModel)]=\"value![1]\"\n        [ngModelOptions]=\"{ updateOn: 'blur' }\"\n        (ngModelChange)=\"onRangeModelChange()\"\n        (focusout)=\"onInputRangeFocusout()\"\n        [placeholder]=\"placeholder\"\n        [disabled]=\"disabled\"\n        [required]=\"required\"\n        [labelSrOnly]=\"true\"\n        [maxLength]=\"10\"\n        data-testid=\"datepicker-input-end\">\n        <!-- Nécessaire pour projeter le slot label optionnel dans le composant enfant dsfr-form-input -->\n        <ng-container label> <ng-content select=\"[label]\"> </ng-content></ng-container>\n      </dsfr-form-input>\n\n      <dsfr-button\n        *fieldsetElement\n        type=\"button\"\n        variant=\"tertiary-no-outline\"\n        buttonSize=\"MD\"\n        class=\"dsfrx-range-fieldset__btn\"\n        data-testid=\"datepicker-dialog-btn\"\n        [icon]=\"'fr-icon-calendar-2-line'\"\n        [disabled]=\"disabled\"\n        [ariaLabel]=\"buttonLabelRangeChoose\"\n        (click)=\"this.handleTriggerButtonClick($event)\">\n      </dsfr-button>\n    </dsfr-fieldset>\n  }\n\n  <edu-dropdown-container\n    [customControlElement]=\"dropdownContainerControlElement\"\n    [displayDropdown]=\"isOpen\"\n    [autoWidthDropdown]=\"true\"\n    [hasToolBar]=\"false\"\n    (dropdownAttached)=\"onCalendarVisible()\"\n    (hideList)=\"onCalendarOutside()\"\n    [appendTo]=\"appendTo\"\n    [zIndex]=\"zIndex\">\n    <!-- Modale -->\n    @if (isOpen) {\n      <!-- Div tampon permettant d'éviter une inconsistance de la directive cdkTrapFocus (ticket #300)-->\n      <div>\n        <div\n          class=\"dsfrx-datepicker-dialog\"\n          role=\"dialog\"\n          aria-modal=\"true\"\n          data-expanded=\"true\"\n          (keydown)=\"handleModalKeydown($event)\"\n          [id]=\"modalId\"\n          [attr.aria-label]=\"modalLabel\"\n          cdkTrapFocus\n          #modal>\n          <h2 id=\"calendar-label\" class=\"fr-sr-only\" aria-live=\"polite\">{{ calendarHeading }}</h2>\n          <dsfr-ext-calendar\n            [value]=\"value\"\n            [max]=\"max\"\n            [min]=\"min\"\n            [autofocus]=\"true\"\n            [mode]=\"mode\"\n            [ignoreInitialValue]=\"ignoreCalendarInitialValue\"\n            ariaLabelledBy=\"calendar-label\"\n            (calendarChange)=\"onUpdateCalendarView($event)\"\n            (dateChange)=\"onCalendarDateChange($event)\"\n            #calendar></dsfr-ext-calendar>\n          <div class=\"dialog-ok-cancel-group\">\n            <button\n              type=\"button\"\n              class=\"dialog-button fr-btn fr-btn--secondary fr-btn--sm\"\n              value=\"cancel\"\n              (click)=\"handleCancelButton($event)\"\n              (keydown)=\"handleCancelButton($event)\"\n              #cancelBtn\n              data-testid=\"datepicker-cancel-btn\">\n              {{ 'calendar.cancel' | dsfrI18n }}\n            </button>\n          </div>\n        </div>\n      </div>\n    }\n  </edu-dropdown-container>\n  <div aria-atomic=\"true\" aria-live=\"polite\" class=\"fr-sr-only\">\n    {{ statusMessage }}\n  </div>\n</div>\n","import {\n  AfterViewInit,\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  Component,\n  ElementRef,\n  inject,\n  Input,\n  ViewEncapsulation,\n} from '@angular/core';\n\n/**\n * Composant affichage d'un groupe de menu dropdown\n */\n@Component({\n  selector: 'dsfrx-dropdownmenu-group, dsfr-ext-dropdownmenu-group',\n  template: `\n    <ul role=\"group\">\n      <ng-content></ng-content>\n    </ul>\n  `,\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n})\nexport class DsfrDropdownMenuGroupComponent implements AfterViewInit {\n  @Input({ transform: booleanAttribute }) showSeparator: boolean = false;\n\n  protected element = inject(ElementRef);\n\n  /**\n   * Ajout d'un wrapper <li> avec role presentation\n   * si showSeparator, ajout d'un separateur apres ce li\n   */\n  public ngAfterViewInit(): void {\n    const elem = this.element.nativeElement;\n    const li = document.createElement('li');\n    li.setAttribute('role', 'presentation');\n    elem.replaceWith(li); // Ne remplace pas l'élément en lui même mais modifie la Node parent de l'élément\n    li.appendChild(elem);\n\n    if (this.showSeparator) {\n      li.insertAdjacentHTML('afterend', '<li role=\"separator\"></li>');\n    }\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n  AfterContentInit,\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  Component,\n  ContentChild,\n  ElementRef,\n  EventEmitter,\n  inject,\n  Input,\n  OnDestroy,\n  Output,\n  Renderer2,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { DsfrButtonComponent, DsfrLinkComponent } from '@edugouvfr/ngx-dsfr';\n\n/**\n * Composant affichage d'un menuitem ou d'un menuitemcheckbox du composant dropdown-menu\n */\n@Component({\n  selector: 'dsfrx-dropdownmenu-item, dsfr-ext-dropdownmenu-item',\n  imports: [CommonModule],\n  template: `<ng-content></ng-content>`,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n})\nexport class DsfrDropdownMenuItemComponent implements AfterViewInit, AfterContentInit, OnDestroy {\n  @Input() type: undefined | 'checkbox' | 'radio';\n  @Output() selectItem = new EventEmitter<Event>(); // Événement pour l'utilisateur\n\n  @ContentChild(DsfrButtonComponent, { static: false }) button: DsfrButtonComponent | undefined;\n  @ContentChild(DsfrLinkComponent, { static: false }) link: DsfrLinkComponent | undefined;\n\n  _anchorElement: HTMLElement | undefined; // élément focusable (role = menuitem / menuitemcheckbox)\n  _checked: boolean = false; // si type = checkbox\n\n  private readonly elementRef: ElementRef = inject(ElementRef);\n  private readonly renderer: Renderer2 = inject(Renderer2);\n  private _unlistenFn!: Function;\n\n  get checked() {\n    return this._checked;\n  }\n\n  @Input()\n  set checked(value: boolean) {\n    this._checked = value;\n    if (this._anchorElement && this.type === 'checkbox') {\n      this._anchorElement.setAttribute('aria-checked', '' + this._checked);\n    }\n  }\n\n  /**\n   * Positionner les classes CSS si dsfr-button ou dsfr-link\n   */\n  public ngAfterContentInit(): void {\n    if (this.button) {\n      this.button.customClass = this.button.customClass\n        ? this.button.customClass + ' dsfrx-menu-item'\n        : 'dsfrx-menu-item';\n      this.button.variant = 'tertiary';\n    }\n\n    if (this.link) {\n      this.link.customClass = this.link.customClass\n        ? this.link.customClass + ' fr-sidemenu__link'\n        : 'fr-sidemenu__link';\n    }\n  }\n\n  /**\n   * Positionnement des éléments dans le DOM pour l'accessibilité\n   * - ajout d'un élément wrapper li\n   * - récupération de l'élément _anchorElement comme élément focusable (dsfr-link, dsfr-button ou li)\n   * - ajout de l'attribut [role] menuitem sur l'élément focusable si type est undefined\n   * - ajout de [aria-checked] et [role] menuitemcheckbox sur sur l'élément focusable si le type est checkbox\n   */\n  public ngAfterViewInit(): void {\n    // surround element with li\n    const elem = this.elementRef.nativeElement;\n    const li = document.createElement('li');\n    li.setAttribute('role', 'presentation');\n    elem.replaceWith(li); // Ne remplace pas l'élément en lui même mais modifie la Node parent de l'élément\n    li.appendChild(elem);\n\n    this._unlistenFn = this.renderer.listen(li, 'click', (event) => {\n      this.selectItem.emit(event);\n    });\n\n    // get anchor element\n    if (this.link) {\n      this._anchorElement = this.elementRef.nativeElement.querySelector('a');\n    } else if (this.button) {\n      this._anchorElement = this.elementRef.nativeElement.querySelector('button');\n    } else {\n      li.className = 'interactive';\n      this._anchorElement = li;\n    }\n    if (!this._anchorElement) return;\n\n    // add role\n    if (this.type) {\n      this._anchorElement.setAttribute('role', this.type === 'checkbox' ? 'menuitemcheckbox' : 'menuitemradio');\n      this._anchorElement.setAttribute('aria-checked', '' + this._checked);\n    } else {\n      this._anchorElement.setAttribute('role', 'menuitem');\n    }\n\n    this._anchorElement.setAttribute('tabindex', '-1');\n  }\n\n  ngOnDestroy(): void {\n    if (this._unlistenFn) this._unlistenFn();\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  ContentChild,\n  contentChildren,\n  ElementRef,\n  EventEmitter,\n  Input,\n  OnInit,\n  Output,\n  signal,\n  TemplateRef,\n  viewChild,\n  viewChildren,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { DsfrButton, DsfrButtonModule, DsfrLink, DsfrLinkModule, DsfrSize, newUniqueId } from '@edugouvfr/ngx-dsfr';\nimport { DropdownContainerComponent } from '../shared/components';\nimport { DsfrDropdownMenuGroupComponent } from './component/dropdownmenu-group.component';\nimport { DsfrDropdownMenuItemComponent } from './component/dropdownmenu-item.component';\n\nexport interface DsfrMenuButton extends Omit<\n  DsfrButton,\n  'size' | 'variant' | 'iconPosition' | 'loader' | 'invertedOutlineContrast'\n> {\n  /** Action appelée lors du 'click' sur le bouton. */\n  callback?: () => void;\n}\n\n/** Définition des interfaces internes pour créer le view model de DsfrDropdownMenuItem */\ninterface MenuButtonViewModel extends DsfrMenuButton {\n  menuType: 'button' | 'link' | 'group';\n}\ninterface MenuLinkViewModel extends DsfrMenuButton {\n  menuType: 'button' | 'link' | 'group';\n}\n\ninterface MenuGroupViewModel {\n  menuType: 'button' | 'link' | 'group';\n  items: MenuButtonViewModel[] | MenuLinkViewModel[];\n}\n\n/** Alias pour le type d'entrée de menu */\nexport type DsfrDropdownMenuItem = (DsfrMenuButton | DsfrLink | (DsfrMenuButton | DsfrLink)[])[];\n\n@Component({\n  selector: 'dsfr-ext-dropdownmenu, dsfrx-dropdownmenu',\n  imports: [\n    CommonModule,\n    DsfrButtonModule,\n    DsfrLinkModule,\n    DropdownContainerComponent,\n    DsfrDropdownMenuItemComponent,\n    DsfrDropdownMenuGroupComponent,\n  ],\n  templateUrl: './dropdownmenu.component.html',\n  styleUrls: ['../shared/components/dropdown-button/dropdown-button.component.scss', './dropdownmenu.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n})\nexport class DsfrDropdownMenuComponent implements OnInit {\n  /** Libellé du bouton du menu déroulant */\n  @Input() labelMenu?: string;\n\n  /** Attribut aria-label du bouton du menu déroulant */\n  @Input() ariaLabelMenu?: string;\n\n  /** Identifiant du bouton du menu déroulant (généré si non renseigné) */\n  @Input() menuId?: string;\n\n  /** Icône optionnelle du menu déroulant  */\n  @Input() iconMenu?: string;\n\n  /** Taille du menu déroulant (SM, MD ou LG). MD par défaut. */\n  @Input() size: DsfrSize = 'MD';\n\n  /** Désactiver le menu */\n  @Input() disabled: boolean = false;\n\n  /** Fermer le menu après un clic sur bouton ou lien.  */\n  @Input() closeOnAction: boolean = false;\n\n  /** Evènement sélection d'un bouton */\n  @Output() buttonSelect: EventEmitter<DsfrButton> = new EventEmitter();\n\n  /** Evènement sélection d'un lien */\n  @Output() linkSelect: EventEmitter<DsfrLink> = new EventEmitter();\n\n  /** Cacher les séparateurs de groupe (dans le cas d'utilisation de menus) */\n  @Input() hideGroupSeparator: boolean = false;\n\n  /** Attacher l'élément de liste déroulante au 'body' ou a un container (réf. vers un élément #div ou nom de la classe du parent) */\n  @Input() appendTo?: 'body' | HTMLElement | string;\n\n  /**\n   * Indique la valeur de la propriété css z-index de la modale du composant.\n   */\n  @Input() zIndex?: number = undefined;\n\n  /** Contenu personnalisé du menu */\n  @ContentChild('contentTemplate', { static: true }) contentTemplate?: TemplateRef<void>;\n\n  /**@internal */\n  btnMenuRef = viewChild('btnMenu', { read: ElementRef });\n\n  /**@internal */\n  dropdownWidth = computed(() => {\n    return this.btnMenuRef()?.nativeElement.offsetWidth;\n  });\n\n  protected menusView: (MenuButtonViewModel | MenuLinkViewModel | MenuGroupViewModel)[] = [];\n  protected isOpen = signal(false);\n\n  protected itemsC = contentChildren(DsfrDropdownMenuItemComponent, { descendants: true }); // slot\n  protected itemsV = viewChildren(DsfrDropdownMenuItemComponent); // interne\n\n  /** Element auquel la liste est attachée programmatiquement si appendTo défini */\n  protected containerToAttach: HTMLElement | undefined;\n\n  private focusedElement: any; // élément de la liste possédant le focus\n  private indexFocusedElement: number = -1;\n\n  constructor() {}\n\n  /** Items de menu, liens, boutons ou groupe de liens ou boutons */\n  @Input()\n  set menus(value: DsfrDropdownMenuItem) {\n    this.menusView = [];\n    if (value && value.length) {\n      this.menusView = value.map((m) => {\n        if (Array.isArray(m)) {\n          // Type groupe\n          return {\n            menuType: 'group',\n            items: m.map((item) => {\n              if ((item as DsfrLink).link || (item as DsfrLink).route || (item as DsfrLink).routerLink) {\n                return { menuType: 'link', ...item } as MenuLinkViewModel; // Type lien\n              } else {\n                return { menuType: 'button', ...item } as MenuButtonViewModel; // Type bouton\n              }\n            }),\n          } as MenuGroupViewModel;\n        } else if ((m as DsfrLink).link || (m as DsfrLink).route || (m as DsfrLink).routerLink) {\n          return { menuType: 'link', ...m } as MenuLinkViewModel; // Type lien\n        } else {\n          return { menuType: 'button', ...m } as MenuButtonViewModel; // Type bouton\n        }\n      });\n    }\n  }\n\n  public ngOnInit(): void {\n    this.menuId ??= newUniqueId();\n  }\n\n  protected onDropdownAttached(): void {\n    this.setInitialFocusOnList();\n  }\n\n  protected toggleMenu() {\n    this.isOpen.set(!this.isOpen());\n    if (this.isOpen()) {\n      this.indexFocusedElement = -1;\n    }\n  }\n\n  protected onButtonClick(button: DsfrMenuButton): void {\n    if (button.callback) {\n      button.callback();\n    }\n\n    if (this.closeOnAction) {\n      this.isOpen.set(false);\n    }\n\n    this.buttonSelect.emit(button);\n  }\n\n  protected onClickOutside() {\n    this.isOpen.set(false);\n  }\n\n  protected onLinkSelect(link: DsfrLink): void {\n    if (link.route) {\n      this.linkSelect.emit(link);\n    }\n    if (this.closeOnAction) {\n      this.isOpen.set(false);\n    }\n  }\n\n  /**\n   * Gestion des interactions clavier sur la liste\n   * - positionnement du focus sur les éléments précédents/suivants à la navigation flèches\n   * - fermeture de la liste sur les touches définies, et repositonnement du focus sur le bouton d'ouverture\n   * @param event keyboard event\n   */\n  protected doKeyEvent(event: KeyboardEvent) {\n    switch (event.key) {\n      case 'ArrowDown':\n        this.focusToElement(1);\n        event.preventDefault();\n        break;\n\n      case 'ArrowUp':\n        this.focusToElement(-1);\n        event.preventDefault();\n        break;\n\n      case ' ':\n        this.emitKeyEventElement(event, true);\n        break;\n\n      case 'Enter':\n        this.emitKeyEventElement(event, false);\n        if (this.closeOnAction) {\n          event.preventDefault();\n          this.closeMenuAndFocusButton();\n        }\n        break;\n      case 'Tab':\n      case 'Escape':\n        event.preventDefault();\n        this.closeMenuAndFocusButton();\n        break;\n\n      default:\n    }\n  }\n\n  private closeMenuAndFocusButton(): void {\n    this.isOpen.set(false);\n    this.btnMenuRef()?.nativeElement.focus();\n  }\n\n  /** Focus sur le premier élément de la liste à l'ouverture de celle-ci */\n  private setInitialFocusOnList(): void {\n    this.focusedElement = this.itemsV().length > 0 ? this.itemsV()[0]._anchorElement : this.itemsC()[0]?._anchorElement;\n\n    if (this.focusedElement) {\n      this.focusedElement.setAttribute('tabIndex', '0');\n      this.focusedElement.focus();\n      this.indexFocusedElement = 0;\n    }\n  }\n\n  /**\n   * Si entrée est pressé / ou espace et que l'élément de liste est de type 'checkbox' ou 'radio'\n   * Envoi de l'evenement selectItem\n   */\n  private emitKeyEventElement(event: Event, onlySelection: boolean) {\n    if (!onlySelection || (this.focusedElement && this.focusedElement.getAttribute('aria-selected'))) {\n      const items = [...this.itemsC(), ...this.itemsV()];\n      items[this.indexFocusedElement].selectItem?.emit(event);\n    }\n  }\n\n  private focusToElement(direction: number) {\n    const items = [...this.itemsC(), ...this.itemsV()];\n    const totalItems = items.length;\n    if (items.length === 0) return;\n\n    let nextIndex = this.indexFocusedElement + direction;\n\n    if (nextIndex >= totalItems) {\n      nextIndex = 0;\n    } else if (nextIndex < 0) {\n      nextIndex = totalItems - 1;\n    }\n\n    this.indexFocusedElement = nextIndex;\n    this.setFocusElement(items[nextIndex]._anchorElement!);\n  }\n\n  /** Gestion des tabindex pour le focus sur le nouvel élément de la liste */\n  private setFocusElement(newElement: HTMLElement) {\n    this.focusedElement.setAttribute('tabIndex', '-1');\n    this.focusedElement = newElement;\n    this.focusedElement.setAttribute('tabIndex', '0');\n    this.focusedElement.focus();\n  }\n}\n","<edu-dropdown-container\n  #comboboxBox\n  [displayDropdown]=\"isOpen()\"\n  [autoWidthDropdown]=\"true\"\n  [hasToolBar]=\"false\"\n  [classToWrap]=\"'dsfrx-menu-dropdown'\"\n  (dropdownAttached)=\"onDropdownAttached()\"\n  (hideList)=\"onClickOutside()\"\n  [appendTo]=\"appendTo\"\n  [zIndex]=\"zIndex\">\n  <!-- ajouter ariaLabel ?-->\n  <button\n    #btnMenu\n    ngProjectAs=\"control\"\n    [id]=\"menuId\"\n    type=\"button\"\n    class=\"dsfrx-menu-dropdown__btn fr-btn--tertiary fr-btn {{ iconMenu }}\"\n    [ngClass]=\"{\n      'fr-btn--sm': size === 'SM',\n      'fr-btn--lg': size === 'LG',\n      'fr-btn--icon-left': !!iconMenu,\n    }\"\n    [disabled]=\"disabled || null\"\n    [attr.aria-haspopup]=\"true\"\n    [attr.aria-controls]=\"menuId + '-menu'\"\n    [attr.aria-label]=\"ariaLabelMenu ?? null\"\n    [attr.aria-expanded]=\"isOpen()\"\n    (click)=\"toggleMenu()\">\n    {{ labelMenu }}\n  </button>\n\n  @if (isOpen()) {\n    <ul\n      class=\"dsfrx-menu-dropdown__list\"\n      tabindex=\"-1\"\n      (keydown)=\"doKeyEvent($event)\"\n      [id]=\"menuId + '-menu'\"\n      role=\"menu\"\n      [attr.aria-labelledby]=\"menuId\"\n      [style.min-width.px]=\"dropdownWidth()\">\n      <!-- Affichage mode programmatique des items de menu  -->\n      @for (menu of menusView; track $index; let i = $index) {\n        @if (menu.menuType === 'group') {\n          @if (menusView[i - 1] && !hideGroupSeparator) {\n            <li role=\"separator\"></li>\n          }\n          <dsfrx-dropdownmenu-group>\n            @for (item of $any(menu).items; track item.label) {\n              @if (item.menuType === 'link') {\n                <ng-container\n                  [ngTemplateOutlet]=\"linkTemplate\"\n                  [ngTemplateOutletContext]=\"{ link: item }\"></ng-container>\n              } @else {\n                <ng-container\n                  [ngTemplateOutlet]=\"buttonTemplate\"\n                  [ngTemplateOutletContext]=\"{ action: item }\"></ng-container>\n              }\n            }\n          </dsfrx-dropdownmenu-group>\n        } @else if (menu.menuType === 'link') {\n          <ng-container [ngTemplateOutlet]=\"linkTemplate\" [ngTemplateOutletContext]=\"{ link: menu }\"></ng-container>\n        } @else {\n          <ng-container [ngTemplateOutlet]=\"buttonTemplate\" [ngTemplateOutletContext]=\"{ action: menu }\"></ng-container>\n        }\n      }\n\n      @if (menusView.length === 0 && contentTemplate) {\n        <!-- Affichage du slot -->\n        <ng-container *ngTemplateOutlet=\"contentTemplate\"></ng-container>\n      }\n    </ul>\n  }\n</edu-dropdown-container>\n\n<ng-template #linkTemplate let-link=\"link\">\n  <dsfrx-dropdownmenu-item>\n    <dsfr-link\n      [customClass]=\"'fr-sidemenu__link'\"\n      [tooltipMessage]=\"link.tooltipMessage\"\n      [ariaLabel]=\"link.label ? link.ariaLabel : link.label\"\n      [ariaControls]=\"link.ariaControls\"\n      [link]=\"link.link\"\n      [linkSize]=\"size\"\n      iconPosition=\"left\"\n      [ariaCurrent]=\"link.active\"\n      [icon]=\"link.icon\"\n      [linkTarget]=\"link.linkTarget\"\n      [route]=\"link.route\"\n      [routePath]=\"link.routerLink\"\n      [routerLinkActive]=\"link.routerLinkActive ?? ''\"\n      [routerLinkExtras]=\"link.routerLinkExtras\"\n      [label]=\"link.label\"\n      (linkSelect)=\"onLinkSelect(link)\"\n      [disabled]=\"disabled\">\n    </dsfr-link>\n  </dsfrx-dropdownmenu-item>\n</ng-template>\n\n<ng-template #buttonTemplate let-action=\"action\">\n  <dsfrx-dropdownmenu-item>\n    <dsfr-button\n      [customClass]=\"'dsfrx-menu-item'\"\n      [ariaLabel]=\"action.ariaLabel ?? ''\"\n      [ariaControls]=\"action.ariaControls\"\n      [ariaPressed]=\"action.ariaPressed\"\n      [disabled]=\"!!action.disabled\"\n      [icon]=\"action.icon\"\n      [label]=\"action.label\"\n      [type]=\"action.type ?? 'button'\"\n      [tooltipMessage]=\"action.tooltipMessage ?? ''\"\n      [disabled]=\"action.disabled ?? false\"\n      [uppercase]=\"action.uppercase ?? false\"\n      [buttonSize]=\"size\"\n      variant=\"tertiary\"\n      (click)=\"onButtonClick(action)\">\n    </dsfr-button>\n  </dsfrx-dropdownmenu-item>\n</ng-template>\n","/**\n * Classe utilitaire permettant de récupérer les éléments <li> concernés\n * dans le cadre de la gestion du focus à la navigation clavier du composant multiselect\n * selon la structure des options avec groupes éventuels\n */\nexport class SelectFocusUtils {\n  static readonly CONTAINER_LIST_CLASS = 'dsfrx-select__list';\n\n  private constructor() {}\n\n  /**\n   * Détermine l'élément suivant à focus (li role=option), en tenant compte des groupes et des éléments enfants.\n   */\n  static findNextListItem(\n    canFocusGroup: boolean,\n    elementToFocus: HTMLElement | null,\n    currentElement?: HTMLElement,\n  ): HTMLElement | null {\n    const indexFirstElement = canFocusGroup ? 0 : 1;\n    if (elementToFocus) {\n      return this.isGroupElement(elementToFocus)\n        ? (elementToFocus.children[indexFirstElement] as HTMLElement) // Premier élément du groupe\n        : elementToFocus; // Élément direct suivant\n    }\n\n    //  prochain element de la liste ou sous-liste\n    if (currentElement) {\n      // focus sur le prochain groupe\n      const nextGroup = currentElement.parentElement?.nextElementSibling;\n      if (nextGroup && this.isGroupElement(nextGroup)) {\n        return nextGroup.children[indexFirstElement] as HTMLElement; // Premier élément du groupe suivant\n      }\n\n      // Retour au début si fin de liste\n      return this.findNextListItem(canFocusGroup, this.getFirstListItem(currentElement));\n    }\n\n    return null;\n  }\n\n  /**\n   * Détermine l'élément précédent à focus (li role=option), en tenant compte des groupes et des éléments enfants.\n   */\n  static findPreviousListItem(\n    canFocusGroup: boolean,\n    elementToFocus: HTMLElement | null,\n    currentElement?: HTMLElement,\n  ): HTMLElement | null {\n    if (elementToFocus) {\n      // si c'est un groupe : récupérer le dernier element focusable du groupe\n      if (this.isGroupElement(elementToFocus)) {\n        return this.getLastFocusableChild(elementToFocus);\n      }\n\n      // vérifier qu'il s'agit bien de groupes\n      if (this.isGroupLabel(elementToFocus) && !canFocusGroup) {\n        const parentGroup = elementToFocus.parentElement;\n        const isFirstGroup = !parentGroup?.previousElementSibling;\n\n        // si debut de liste : aller en fin de la liste\n        if (isFirstGroup && currentElement) {\n          return this.findPreviousListItem(canFocusGroup, this.getLastListItem(currentElement));\n        }\n        // sinon aller au groupe précédent\n        return this.getPreviousGroupLastItem(parentGroup);\n      }\n      return elementToFocus;\n    }\n\n    if (!currentElement) return null;\n\n    return (\n      this.getPreviousGroupLastItem(currentElement.parentElement) ?? // si un groupe précédent existe : y aller\n      this.findPreviousListItem(canFocusGroup, this.getLastListItem(currentElement)) // sinon : aller en fin de liste\n    );\n  }\n\n  /**\n   * Récupère le dernier élément focusable du groupe précédent, ou null si pas de groupe précédent\n   */\n  static getPreviousGroupLastItem(group: Element | null): HTMLElement | null {\n    const prevGroup = group?.previousElementSibling;\n\n    if (prevGroup && this.isGroupElement(prevGroup)) {\n      return this.getLastFocusableChild(prevGroup as HTMLElement);\n    }\n\n    return null;\n  }\n\n  /**\n   * Récupère le dernier élément focusable d'un groupe (dernier enfant qui est un li role=option ou le groupe lui même si focusable)\n   */\n  static getLastFocusableChild(group: HTMLElement): HTMLElement | null {\n    const children = Array.from(group.children).filter((el): el is HTMLElement => el instanceof HTMLElement);\n    return children[children.length - 1];\n  }\n\n  static setFocusElementOnFirst(event: KeyboardEvent): HTMLElement {\n    let firstItem = this.getFirstListItem(event.target as HTMLElement);\n\n    firstItem = this.findPreviousListItem(false, firstItem) as HTMLElement;\n\n    return firstItem;\n  }\n\n  static setFocusElementOnLast(event: KeyboardEvent): HTMLElement {\n    let lastItem = this.getLastListItem(event.target as HTMLElement);\n    lastItem = this.findPreviousListItem(false, lastItem) as HTMLElement;\n\n    return lastItem;\n  }\n\n  static getFirstListItem(element: HTMLElement | null): HTMLElement | null {\n    return element?.closest(`.${this.CONTAINER_LIST_CLASS}`)?.firstElementChild as HTMLElement;\n  }\n\n  static getLastListItem(element: HTMLElement | null): HTMLElement | null {\n    return element?.closest(`.${this.CONTAINER_LIST_CLASS}`)?.lastElementChild as HTMLElement;\n  }\n\n  /** L'élément est le container du groupe */\n  static isGroupElement(el: Element | null | undefined): boolean {\n    return !!(el && el.getAttribute('role') === 'group');\n  }\n\n  /** L'élément est un élément correspondant au nom du groupe */\n  static isGroupLabel(el: Element | null | undefined): boolean {\n    return el?.getAttribute('data-role') === 'select-group-label';\n  }\n}\n","import { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { CommonModule } from '@angular/common';\nimport {\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  Component,\n  ContentChild,\n  ElementRef,\n  EventEmitter,\n  HostBinding,\n  Input,\n  input,\n  Output,\n  TemplateRef,\n  ViewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { DsfrButtonModule, DsfrI18nPipe, DsfrSelectOption, EduCheckboxLightComponent } from '@edugouvfr/ngx-dsfr';\nimport { SelectFocusUtils } from '../../../multiselect/select-focus.utils';\nimport { SelectOptionViewModel } from '../../models/options-view-model';\n\n/**\n * Interface utilisée pour le contexte du template optionTemplate\n */\nexport interface DsfrOptionContext {\n  $implicit: DsfrSelectOption;\n  /** Dans le cas cas du picklist, position du picklist-unit */\n  position?: 'left' | 'right';\n}\n\n@Component({\n  selector: 'edu-list-options',\n  templateUrl: './list-options.component.html',\n  styleUrls: ['./list-options.component.scss'],\n  encapsulation: ViewEncapsulation.None,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, DsfrI18nPipe, DsfrButtonModule, FormsModule, ScrollingModule, EduCheckboxLightComponent],\n})\nexport class ListOptionsComponent {\n  /** Template des labels des options */\n  @ContentChild('groupTemplate', { static: true }) groupTemplate?: TemplateRef<DsfrOptionContext>;\n\n  /** @internal */\n  @ViewChild(CdkVirtualScrollViewport) viewport?: CdkVirtualScrollViewport;\n\n  /**@internal */\n  @ViewChild('listbox') listbox?: ElementRef;\n\n  /** Activer le virtual scroll  */\n  @Input({ transform: booleanAttribute }) virtualScroll: boolean = false;\n\n  /** Id du composant */\n  @Input() selectId?: string;\n\n  /** Propriété CSS z-index de la liste, par défaut supérieur aux composants 'lifted' DSFR */\n  @Input() zIndex?: number;\n\n  /** Surcharger la hauteur d'un item dans le cas du virtual scroll. */\n  @Input() virtualScrollItemHeight?: number;\n\n  /** Le mode de sélection est single */\n  @Input({ transform: booleanAttribute }) isSingleMode: boolean = false;\n\n  /** Afficher le dropdown (recherche et liste déroulante) */\n  @Input({ transform: booleanAttribute }) displayDropdown = false;\n\n  /** La case à cocher tout sélectionner est affichée */\n  @Input({ transform: booleanAttribute }) showSelectAll = false;\n\n  /** La barre de recherche (filtre sur les options) est affichée */\n  @Input({ transform: booleanAttribute }) showSearch = false;\n\n  /** Afficher les cases à cocher permettant de sélectionner chaque élément de la liste */\n  @Input({ transform: booleanAttribute }) showCheckboxes = false;\n\n  /** Permet la sélection globale des groupes.\n   * Lorsqu'activé, une case à cocher apparaît sur le label du groupe, et permet de sélectionner ou désélectionner toutes les options qu'il contient.\n   */\n  @Input({ transform: booleanAttribute }) showGroupSelection = false;\n\n  /** Donne la position du slot dans le template */\n  @Input() listPosition: 'left' | 'right' = 'left';\n\n  /** Permet d'indiquer si le composant est désactivé ou non */\n  @HostBinding('class.dsfrx-select__list--disabled')\n  @Input({ transform: booleanAttribute })\n  disabled = false;\n\n  /** Message d'accessibilité vocalisé lorsqu'il n'y a aucun résultat. */\n  @Input() noResultsMessage?: string;\n\n  /** Template utilisé pour rendre une option complète\n   * Ce template est responsable du rendu du `<li>` et inclut toute la structure de l'option\n   * - option : l'option à afficher\n   * - index  : l'index de l'option\n   */\n  @Input() optionTemplate?: TemplateRef<DsfrOptionContext>;\n\n  /** Événement émis lors du clic sur une option */\n  @Output() optionClicked = new EventEmitter<{ e: any; option: SelectOptionViewModel }>();\n\n  /** Événement émis lors du clic sur une option */\n  @Output() optionKeyDown = new EventEmitter<{ e: any; option: SelectOptionViewModel; shouldCloseDropdown: boolean }>();\n\n  /** Options filtrées après recherche */\n  optionsFilter = input<SelectOptionViewModel[]>([]);\n\n  /** Afficher l'état de chargement */\n  loading = input<boolean>(false);\n\n  /** Hauteur maximale avant le scroll sur la liste déroulante. */\n  scrollMaxHeight = input<string>();\n\n  /** Hauteur avant le scroll sur la liste déroulante. */\n  scrollHeight = input<string>();\n\n  protected readonly containerListClass = SelectFocusUtils.CONTAINER_LIST_CLASS;\n\n  /**\n   * Sélection ou désélection d'une option\n   * @internal */\n  public onOptionClick(e: any, option: SelectOptionViewModel): void {\n    // Ne pas sélectionner l'option si jamais showGroupSelection n'est pas activé et que l'option est un label (donc contenant des sous-options)\n    if (this.showGroupSelection || (!this.showGroupSelection && !option.options)) {\n      this.optionClicked.emit({ e, option });\n    }\n  }\n\n  /**\n   * Interaction au clavier dans la liste déroulante\n   * Les flêches permettent de naviguer d'une option à l'autre en modifiant le focus.\n   * A la fin ou au début de la liste on boucle sur la première ou dernière option\n   * @internal */\n  public onOptionKeydown(event: KeyboardEvent, option: SelectOptionViewModel): void {\n    const el = event.target as Element;\n\n    // retour tab - gestion par défaut du focus sur la toolbar\n    if (event.shiftKey && event.key === 'Tab' && (this.showSelectAll || this.showSearch)) {\n      return;\n    }\n\n    switch (event.key) {\n      case 'ArrowDown':\n        this.optionKeyDown.emit({ e: event, option, shouldCloseDropdown: false });\n        event.preventDefault();\n        const nextItem = SelectFocusUtils.findNextListItem(\n          this.showGroupSelection,\n          el.nextElementSibling as HTMLElement,\n          el as HTMLElement,\n        );\n        this.setFocusElement(nextItem);\n        break;\n      case 'ArrowUp':\n        this.optionKeyDown.emit({ e: event, option, shouldCloseDropdown: false });\n        event.preventDefault();\n        const prevItem = SelectFocusUtils.findPreviousListItem(\n          this.showGroupSelection,\n          el.previousElementSibling as HTMLElement,\n          el as HTMLElement,\n        );\n        this.setFocusElement(prevItem);\n        break;\n      case 'End':\n        this.optionKeyDown.emit({ e: event, option, shouldCloseDropdown: false });\n        event.preventDefault();\n        const lastItem = SelectFocusUtils.setFocusElementOnLast(event);\n        this.setFocusElement(lastItem);\n        break;\n      case 'Home':\n        this.optionKeyDown.emit({ e: event, option, shouldCloseDropdown: false });\n        event.preventDefault();\n        const firstItem = SelectFocusUtils.setFocusElementOnFirst(event);\n        this.setFocusElement(firstItem);\n        break;\n      case 'Enter':\n        this.optionKeyDown.emit({ e: event, option, shouldCloseDropdown: true });\n        event.preventDefault();\n        this.onOptionClick(event, option);\n        break;\n      case ' ':\n        this.optionKeyDown.emit({ e: event, option, shouldCloseDropdown: false });\n        event.preventDefault();\n        this.onOptionClick(event, option);\n        break;\n      case 'Escape':\n        this.optionKeyDown.emit({ e: event, option, shouldCloseDropdown: true });\n        event.preventDefault();\n\n        break;\n      case 'Tab':\n        this.optionKeyDown.emit({ e: event, option, shouldCloseDropdown: true });\n        break;\n    }\n  }\n\n  public handleListFocus(el: HTMLElement): void {\n    const itemToFocus = SelectFocusUtils.findNextListItem(this.showGroupSelection, el);\n    if (itemToFocus) this.setFocusElement(itemToFocus);\n\n    if (this.virtualScroll) this.scrollForVirtualScroll(el);\n  }\n\n  /** Set focus on element and add aria-activedescendant attribute to parent */\n  private setFocusElement(optionEl: HTMLElement | null) {\n    if (!optionEl) return;\n\n    if (optionEl) {\n      optionEl.focus();\n      const optionId: string | null = optionEl.getAttribute('id');\n      if (optionId) optionEl.closest(`.${this.containerListClass}`)?.setAttribute('aria-activedescendant', optionId);\n\n      if (this.virtualScroll) {\n        this.scrollForVirtualScroll(optionEl);\n      }\n    }\n  }\n\n  /* *Gestion manuelle du scroll dans la liste dans le cas de la navigation clavier avec virtualScroll activé */\n  private scrollForVirtualScroll(optionEl: HTMLElement) {\n    const index: string = optionEl.getAttribute('data-index') ?? '0';\n\n    this.viewport?.scrollToIndex(Number(index), 'smooth');\n  }\n}\n","<!-- template de listbox (options) en virtual scroll -->\n@if (virtualScroll) {\n  <div\n    [ngStyle]=\"{ 'z-index': zIndex }\"\n    [style.max-height]=\"scrollMaxHeight()\"\n    [style.height]=\"optionsFilter().length > 0 ? scrollHeight() : ''\"\n    #listbox\n    class=\"dsfrx-select__list dsfrx-select__list--has-viewport\">\n    @if (optionsFilter().length > 0) {\n      <cdk-virtual-scroll-viewport\n        #viewport\n        minBufferPx=\"200\"\n        maxBufferPx=\"600\"\n        [itemSize]=\"virtualScrollItemHeight\"\n        class=\"viewport\">\n        <ul role=\"listbox\" [attr.aria-multiselectable]=\"!this.isSingleMode\" tabindex=\"-1\" id=\"{{ selectId }}-listbox\">\n          <li\n            *cdkVirtualFor=\"let option of optionsFilter(); let i = index\"\n            role=\"option\"\n            class=\"dsfrx-select__item\"\n            [attr.data-dsfrx-option]=\"true\"\n            id=\"{{ selectId }}-listbox-{{ i }}\"\n            [ngClass]=\"{ selected: option.selected() }\"\n            [attr.data-id]=\"option.value\"\n            [attr.data-index]=\"i\"\n            [attr.aria-selected]=\"option.selected()\"\n            tabindex=\"-1\"\n            (click)=\"onOptionClick($event, option)\"\n            (keydown)=\"onOptionKeydown($event, option)\">\n            <ng-container\n              [ngTemplateOutlet]=\"insideItemTemplate\"\n              [ngTemplateOutletContext]=\"{ option: option, index: i.toString() }\"></ng-container>\n          </li>\n        </ul>\n      </cdk-virtual-scroll-viewport>\n    }\n  </div>\n} @else {\n  <!-- template de listbox (options) sans virtual scroll -->\n  <ul\n    #listbox\n    id=\"{{ selectId }}-listbox\"\n    [ngStyle]=\"{ 'z-index': zIndex }\"\n    [attr.aria-labelledby]=\"selectId + '-label'\"\n    role=\"listbox\"\n    tabindex=\"-1\"\n    [style.max-height]=\"scrollMaxHeight()\"\n    [style.height]=\"optionsFilter().length > 0 ? scrollHeight() : ''\"\n    [attr.aria-multiselectable]=\"!this.isSingleMode\"\n    [class]=\"containerListClass\">\n    @for (option of optionsFilter(); track i; let i = $index) {\n      @if (option.options) {\n        <ul class=\"dsfrx-select__group\" role=\"group\" [attr.aria-labelledby]=\"selectId + '-group-' + i\">\n          <li\n            [attr.aria-selected]=\"showGroupSelection ? option.selected() : null\"\n            tabindex=\"-1\"\n            (keydown)=\"onOptionKeydown($event, option)\"\n            (click)=\"onOptionClick($event, option)\"\n            id=\"{{ selectId }}-group-{{ i }}\"\n            [attr.data-id]=\"option.value\"\n            [attr.role]=\"showGroupSelection ? 'option' : 'presentation'\"\n            class=\"dsfrx-select__group--label\"\n            data-role=\"select-group-label\">\n            @if (showGroupSelection) {\n              <ng-container\n                [ngTemplateOutlet]=\"insideGroupTemplate\"\n                [ngTemplateOutletContext]=\"{ option: option, index: i }\"></ng-container>\n            } @else if (groupTemplate) {\n              <ng-container *ngTemplateOutlet=\"groupTemplate; context: { $implicit: option }\"> </ng-container>\n            } @else {\n              <b>{{ option.label }}</b>\n            }\n          </li>\n          @for (optChild of option.options; track j; let j = $index) {\n            <!-- template option -->\n            <ng-container\n              [ngTemplateOutlet]=\"itemTemplate\"\n              [ngTemplateOutletContext]=\"{ option: optChild, index: i + '-' + j }\"></ng-container>\n          }\n        </ul>\n      } @else {\n        <!-- template option -->\n        <ng-container\n          [ngTemplateOutlet]=\"itemTemplate\"\n          [ngTemplateOutletContext]=\"{ option: option, index: i.toString() }\"></ng-container>\n      }\n    }\n  </ul>\n}\n<!-- Empty list after search filter -->\n<div\n  [style.height]=\"optionsFilter().length === 0 ? scrollHeight() : ''\"\n  role=\"status\"\n  aria-live=\"polite\"\n  ngProjectAs=\"empty\"\n  class=\"dsfrx-select__list dsfrx-select__list--empty\">\n  @if (loading()) {\n    <p>\n      <span class=\"label\"> {{ 'multiselect.loading' | dsfrI18n }}...</span>\n    </p>\n  } @else if (displayDropdown && optionsFilter().length === 0) {\n    <p>\n      {{ noResultsMessage ?? ('multiselect.noResult' | dsfrI18n) }}\n    </p>\n  }\n</div>\n\n<!-- template option -->\n<ng-template #itemTemplate let-option=\"option\" let-index=\"index\">\n  <li\n    role=\"option\"\n    class=\"dsfrx-select__item\"\n    [attr.data-dsfrx-option]=\"true\"\n    id=\"{{ selectId }}-listbox-{{ index }}\"\n    [ngClass]=\"{ selected: option.selected() }\"\n    [attr.data-id]=\"option.value\"\n    [attr.data-index]=\"index\"\n    [attr.aria-selected]=\"option.selected()\"\n    tabindex=\"-1\"\n    (click)=\"option.options ? onOptionClick($event, option) : onOptionClick($event, option)\"\n    (keydown)=\"onOptionKeydown($event, option)\">\n    <ng-container\n      [ngTemplateOutlet]=\"insideItemTemplate\"\n      [ngTemplateOutletContext]=\"{ option: option, index: index }\"></ng-container>\n  </li>\n</ng-template>\n\n<!-- template inside group option (showGroupSelection) -->\n<ng-template #insideGroupTemplate let-option=\"option\" let-index=\"index\">\n  <edu-checkbox-light\n    [id]=\"selectId + '-checkbox-item-' + index\"\n    [disabled]=\"disabled || option.disabled\"\n    [tabIndex]=\"-1\"\n    [label]=\"optionTemplate ? undefined : option.label\"\n    (checkboxClick)=\"onOptionClick($event, option)\"\n    [selected]=\"option.selected()\">\n    @if (groupTemplate) {\n      <ng-container label\n        ><ng-container *ngTemplateOutlet=\"groupTemplate; context: { $implicit: option }\"></ng-container\n      ></ng-container>\n    }\n  </edu-checkbox-light>\n</ng-template>\n\n<!-- template inside option -->\n<ng-template #insideItemTemplate let-option=\"option\" let-index=\"index\">\n  @if (showCheckboxes) {\n    <edu-checkbox-light\n      [id]=\"selectId + '-checkbox-item-' + index\"\n      [disabled]=\"disabled || option.disabled\"\n      [tabIndex]=\"-1\"\n      [label]=\"optionTemplate ? undefined : option.label\"\n      (checkboxClick)=\"onOptionClick($event, option)\"\n      [selected]=\"option.selected()\">\n      @if (optionTemplate) {\n        <ng-container label\n          ><ng-container\n            *ngTemplateOutlet=\"optionTemplate; context: { $implicit: option, position: listPosition }\"></ng-container\n        ></ng-container>\n      }\n    </edu-checkbox-light>\n  } @else {\n    @if (optionTemplate) {\n      <!-- Slot -->\n      <span\n        ><ng-container\n          *ngTemplateOutlet=\"optionTemplate; context: { $implicit: option, position: listPosition }\"></ng-container\n      ></span>\n    } @else {\n      <span>{{ option.label }} </span>\n    }\n  }\n</ng-template>\n","import { CommonModule } from '@angular/common';\nimport {\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  EventEmitter,\n  forwardRef,\n  HostBinding,\n  HostListener,\n  Input,\n  input,\n  Output,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport {\n  DefaultValueAccessorComponent,\n  DsfrButtonModule,\n  DsfrI18nPipe,\n  EduCheckboxLightComponent,\n} from '@edugouvfr/ngx-dsfr';\n\n@Component({\n  selector: 'edu-list-toolbar',\n  templateUrl: './list-toolbar.component.html',\n  styleUrls: ['./list-toolbar.component.scss'],\n  encapsulation: ViewEncapsulation.None,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, DsfrI18nPipe, DsfrButtonModule, FormsModule, EduCheckboxLightComponent],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => ListToolBarComponent),\n      multi: true,\n    },\n  ],\n})\nexport class ListToolBarComponent extends DefaultValueAccessorComponent<string> {\n  /** Id du composant */\n  @Input() selectId?: string;\n\n  /** Afficher la case à cocher tout sélectionner */\n  @Input({ transform: booleanAttribute }) showSelectAll = false;\n\n  /** Afficher la barre de recherche (filtre sur les options) */\n  @Input({ transform: booleanAttribute }) showSearch = false;\n\n  /** Afficher un bouton pour vider le champ de la barre de recherche */\n  @Input({ transform: booleanAttribute }) showClearSearch = false;\n\n  /** Placeholder pour le champ de recherche */\n  @Input() searchMessage?: string;\n\n  /** Événement émis lors du clic sur le bouton \"Tout sélectionner\" */\n  @Output() selectAll = new EventEmitter<void>();\n\n  /** Événement émis lors de la recherche */\n  @Output() valueChange = new EventEmitter<string>();\n\n  /** Événement émis lors du clic sur le bouton de réinitialisation du champ de recherche */\n  @Output() cleared = new EventEmitter<void>();\n\n  /** Événement émis lors du focus out */\n  @Output() focusOut = new EventEmitter<void>();\n\n  /** Événement émis lorsqu'une touche du clavier est pressée sur le composant. Permet de gérer notamment la tabulation */\n  @Output() keyDown: EventEmitter<KeyboardEvent> = new EventEmitter();\n\n  /** Permet d'afficher la case à cocher \"Tout sélectionner\" au lieu de bouton */\n  showCheckboxSelectAll = input(false, { transform: booleanAttribute });\n\n  /** Nombre max. d'options sélectionnables */\n  maxSelectedOptions = input<number>();\n\n  /** Indiquer si toutes les options sont sélectionnées */\n  isAllSelected = input(false, { transform: booleanAttribute });\n\n  /** Nombre de résultats après une recherche (pas de valeur initiale = a11y) */\n  nbFilterResults = input<number | null>(0);\n\n  countSelectedOptions = input<number>(0);\n\n  /**\n   * Etat de la checkbox tout sélectionner\n   * - true si isAllSelected\n   * - undefined si au moins une option sélectionnée => indéterminée\n   * - false si aucune option sélectionnée\n   * */\n  selectAllState = computed<boolean | undefined>(() => {\n    if (this.isAllSelected()) return true;\n    return this.countSelectedOptions && this.countSelectedOptions() > 0 ? undefined : false;\n  });\n\n  @HostBinding('class.has-show-checkbox-select-all')\n  get hasCheckboxSelectAll(): boolean {\n    return !this.showCheckboxSelectAll();\n  }\n\n  @HostListener('keydown', ['$event'])\n  onKeyDown(event: KeyboardEvent) {\n    this.keyDown.emit(event);\n  }\n\n  /** Sélectionner toutes les options\n   * @internal\n   */\n  selectAllOptions() {\n    this.selectAll.emit();\n  }\n\n  /**\n   * Réinitialiser le champ de recherche\n   * @internal\n   */\n  resetSearchInput(): void {\n    this.value = '';\n    this.cleared.emit();\n  }\n\n  onInput(event: Event) {\n    this.valueChange.emit(this.value);\n  }\n\n  onFocusOut() {\n    this.focusOut.emit();\n  }\n}\n","@if (showSelectAll && !maxSelectedOptions()) {\n  @if (showCheckboxSelectAll()) {\n    <div class=\"fr-checkbox--select-all\">\n      <edu-checkbox-light\n        [id]=\"selectId + '-checkbox-select-all'\"\n        (checkboxClick)=\"selectAllOptions()\"\n        [selected]=\"selectAllState()\"\n        [disabled]=\"disabled\"\n        [label]=\"isAllSelected() ? ('multiselect.unselectAll' | dsfrI18n) : ('multiselect.selectAll' | dsfrI18n)\"\n        [labelSrOnly]=\"true\">\n      </edu-checkbox-light>\n    </div>\n  } @else {\n    <dsfr-button\n      buttonSize=\"SM\"\n      variant=\"tertiary\"\n      customClass=\"fr-btn--select-all\"\n      (click)=\"selectAllOptions()\"\n      [label]=\"isAllSelected() ? ('multiselect.unselectAll' | dsfrI18n) : ('multiselect.selectAll' | dsfrI18n)\"\n      [disabled]=\"disabled\">\n    </dsfr-button>\n  }\n}\n\n@if (showSearch) {\n  <label for=\"{{ selectId }}-searchbox\" class=\"fr-sr-only\">{{ 'multiselect.searchList' | dsfrI18n }}</label>\n  <div class=\"fr-input-wrap fr-icon-search-line\" [class.fr-input-wrap--action]=\"showClearSearch\">\n    <input\n      #searchBox\n      class=\"fr-input\"\n      type=\"search\"\n      aria-invalid=\"false\"\n      id=\"{{ selectId }}-searchbox\"\n      role=\"combobox\"\n      [attr.aria-label]=\"searchMessage ?? ('multiselect.search' | dsfrI18n)\"\n      [placeholder]=\"searchMessage ?? ('multiselect.search' | dsfrI18n)\"\n      [disabled]=\"disabled\"\n      (input)=\"onInput($event)\"\n      (blur)=\"onBlur()\"\n      (focusout)=\"onFocusOut()\"\n      [attr.aria-controls]=\"selectId + '-listbox'\"\n      aria-expanded=\"true\"\n      aria-autocomplete=\"list\"\n      autocomplete=\"off\"\n      aria-haspopup=\"listbox\"\n      [(ngModel)]=\"value\" />\n    @if (showClearSearch) {\n      <button\n        type=\"button\"\n        class=\"fr-btn fr-icon-close-line fr-btn--tertiary\"\n        id=\"{{ selectId }}-reset\"\n        (click)=\"resetSearchInput()\"\n        [title]=\"'multiselect.resetSearch' | dsfrI18n\"\n        [disabled]=\"disabled\">\n        {{ 'multiselect.resetSearch' | dsfrI18n }}\n      </button>\n    }\n  </div>\n}\n<div aria-live=\"polite\" class=\"fr-sr-only\">\n  @if ((nbFilterResults() ?? 0) > 0) {\n    <p>{{ nbFilterResults() }}&nbsp;{{ 'multiselect.availableResults' | dsfrI18n }}</p>\n  }\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  EventEmitter,\n  inject,\n  input,\n  Input,\n  Output,\n  TemplateRef,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { DsfrI18nPipe, DsfrI18nService, DsfrTagModule } from '@edugouvfr/ngx-dsfr';\n\n@Component({\n  selector: 'edu-select-input-label',\n  templateUrl: './select-input-label.component.html',\n  encapsulation: ViewEncapsulation.None,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  styles: [\n    `\n      edu-select-input-label .fr-tag:not(.fr-tag--dismiss) {\n        color: var(--text-inverted-blue-france);\n        background: var(--background-action-high-grey-active);\n        cursor: default;\n      }\n\n      /* \n        Ajustement du style du tag unique en mode clearable (cas d'affichage lorsque le nb d'éléments max a été \n        dépassé). Cet ajustement permet de corriger le léger décalage du tag unique versus liste de tags.\n      */\n      edu-select-input-label > div[aria-live]:has(dsfr-tag) {\n        line-height: 1rem;\n        > dsfr-tag {\n          margin-left: 0.25rem;\n        }\n      }\n    `,\n  ],\n  imports: [CommonModule, FormsModule, DsfrTagModule, DsfrI18nPipe],\n})\nexport class SelectInputLabelComponent {\n  /** Les options sélectionnées se désactivent */\n  @Input({ transform: booleanAttribute }) disabled: boolean = false;\n\n  /** Placeholder pour le champ de sélection */\n  @Input() placeHolder?: string;\n\n  /** Nombre max. d'options sélectionnées affichées */\n  @Input() maxDisplayOptions: number | undefined = 5;\n\n  /** Template pour l'ensemble des valeurs sélectionnées lorsque maxDisplayOptions est atteint */\n  @Input() maxDisplayOptionsTemplate?: TemplateRef<any>;\n\n  /** Template pour chaque valeur sélectionnée */\n  @Input() selectedOptionTemplate?: TemplateRef<any>;\n\n  /** Les options sélectionnées sont affichées sous forme de tags supprimables */\n  @Input({ transform: booleanAttribute }) clearableOptions: boolean = false;\n\n  /** Clic sur toutes les options en mode tag supprimable. */\n  @Output() clearAllOptionsSelect: EventEmitter<void> = new EventEmitter();\n\n  /** Clic sur une option en mode tag supprimable. */\n  @Output() clearOptionSelect: EventEmitter<{ nativeEvent: Event; option: any }> = new EventEmitter();\n\n  /** @internal liste des options sélectionnées */\n  selectedOptions = input<any[]>([]);\n\n  /**\n   * En cas de clearableOptions, si au moins une option sélectionnée est disabled, ne pas afficher le tag permettant\n   * de supprimer toutes les options et afficher par tag. Ne s'applique pas si un template maxDisplayOptionsTemplate\n   * a été redéfini.\n   * @internal */\n  forceDisplayAtomicTag = computed(() => {\n    return (\n      !!this.selectedOptions()?.find((o) => o.disabled) && this.clearableOptions && !this.maxDisplayOptionsTemplate\n    );\n  });\n\n  protected i18n = inject(DsfrI18nService);\n\n  /**  @internal */\n  public getLabelKeyOptionsSelected(): string {\n    return this.selectedOptions().length === 1 ? 'multiselect.selected' : 'multiselect.selectedPlural';\n  }\n\n  /** Clic sur un tag représentant toutes les options */\n  public clearAllOptions(): void {\n    this.clearAllOptionsSelect.emit();\n  }\n\n  /** Clic sur une option en mode tag supprimable. */\n  public clearOption(event: Event, opt: any): void {\n    if (opt.disabled) return;\n\n    event.preventDefault();\n    this.clearOptionSelect.emit({ nativeEvent: event, option: opt });\n  }\n}\n","<div aria-live=\"polite\">\n  @if (selectedOptions().length && selectedOptions().length > 0) {\n    @if (!maxDisplayOptions || selectedOptions().length <= maxDisplayOptions || forceDisplayAtomicTag()) {\n      @if (clearableOptions) {\n        <!-- Template tags -->\n        <ul class=\"fr-tags-group\">\n          @for (opt of selectedOptions(); track opt; let i = $index) {\n            <li>\n              <dsfr-tag\n                [disabled]=\"disabled\"\n                [mode]=\"!opt.disabled ? 'deletable' : 'default'\"\n                [label]=\"opt.label\"\n                [small]=\"true\"\n                [ariaLabel]=\"(!opt.disabled ? ('multiselect.deleteTag' | dsfrI18n) + ' ' : '') + opt.label\"\n                (click)=\"clearOption($event, opt)\"></dsfr-tag>\n            </li>\n          }\n        </ul>\n      } @else {\n        @for (opt of selectedOptions(); track opt; let last = $last; let i = $index) {\n          <!-- Afficher chaque option sélectionnée, slot ou template défault -->\n          <ng-container\n            *ngTemplateOutlet=\"\n              selectedOptionTemplate || defaultselectedOptionTemplate;\n              context: { $implicit: opt, index: i, last: last }\n            \"></ng-container>\n        }\n      }\n    } @else {\n      @if (clearableOptions) {\n        <!-- Un tag pour toutes les options -->\n        <dsfr-tag\n          [disabled]=\"disabled\"\n          [mode]=\"'deletable'\"\n          [ariaLabel]=\"'multiselect.unselectAll' | dsfrI18n\"\n          [label]=\"selectedOptions()!.length + ' ' + (getLabelKeyOptionsSelected() | dsfrI18n)\"\n          [small]=\"true\"\n          (click)=\"clearAllOptions()\"></dsfr-tag>\n      } @else {\n        <!-- Affichager x options sélectionnées, slot ou template default -->\n        <ng-container\n          *ngTemplateOutlet=\"\n            maxDisplayOptionsTemplate || defaultmaxDisplayOptionsTemplate;\n            context: { $implicit: selectedOptions() }\n          \"></ng-container>\n      }\n    }\n  } @else {\n    <!-- Aucune option sélectionnée -->\n    <span> {{ placeHolder ?? ('multiselect.selectOption' | dsfrI18n) }}</span>\n  }\n</div>\n\n<!--  Template par défaut afficher x options sélectionnées  -->\n<ng-template #defaultmaxDisplayOptionsTemplate>\n  <span> {{ selectedOptions()!.length }} {{ getLabelKeyOptionsSelected() | dsfrI18n }} </span>\n</ng-template>\n\n<!-- Template par défaut affichage de chaque valeur -->\n<ng-template #defaultselectedOptionTemplate let-opt let-last=\"last\">\n  <span>{{ opt.label }}<ng-container *ngIf=\"!last\">, </ng-container></span>\n</ng-template>\n","import { signal } from '@angular/core';\nimport { DsfrOption, DsfrSelectOption } from '@edugouvfr/ngx-dsfr';\nimport { OptionsViewModel, SelectOptionViewModel } from '../../models/options-view-model';\n\nexport namespace OptionUtils {\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  export interface SearchResult {\n    optionsFilter: SelectOptionViewModel[];\n    countResults: number;\n  }\n}\n\nexport class OptionUtils {\n  /**\n   * Transforme un tableau hiérarchique d'options (avec groupes) en une liste à plat.\n   * @param options - tableau d'options hiérarchiques (DsfrSelectOption[])\n   * @returns tableau plat\n   */\n  static flattenOptions(options: SelectOptionViewModel[]): OptionsViewModel[] {\n    let indexGroup = 0;\n    const optionsViewModel: OptionsViewModel[] = options.flatMap((opt) =>\n      opt.options?.length\n        ? [\n            { label: opt.label, value: opt.value, isGroup: true, groupId: 1 + indexGroup++, selected: opt.selected },\n            ...opt.options.map((o) => {\n              o.groupId = indexGroup;\n              return o;\n            }),\n          ]\n        : [opt],\n    );\n\n    return optionsViewModel;\n  }\n\n  static initSelectedState(option: DsfrSelectOption): SelectOptionViewModel {\n    return {\n      ...option,\n      selected: signal(false),\n      options: option.options?.map((o) => this.initSelectedState(o)),\n    };\n  }\n\n  /**\n   * Récupère toutes les feuilles d'une liste à plat.\n   * */\n  static flattenLeaves(vm: OptionsViewModel[]): OptionsViewModel[] {\n    return vm.filter((o) => !o.isGroup && o.value !== undefined).map((o) => o.value);\n  }\n\n  /**\n   * Récupère toutes les feuilles non désactivées d'une liste à plat.\n   * */\n  static flattenLeavesNotDisabled(vm: OptionsViewModel[]): OptionsViewModel[] {\n    return vm.filter((o) => !o.isGroup && o.value !== undefined && !o.disabled).map((o) => o.value);\n  }\n\n  /**\n   * Récupère toutes les feuilles désactivées d'une liste à plat.\n   * */\n  static flattenLeavesDisabled(vm: OptionsViewModel[]): OptionsViewModel[] {\n    return vm.filter((o) => !o.isGroup && o.value !== undefined && o.disabled).map((o) => o.value);\n  }\n\n  /** Reconstruit un tableau hiérarchique d'options à partir d'un tableau plat.\n   * - Les groupes sont recréés et chaque enfant est replacé dans son groupe.\n   * - Les options sans groupe sont ajoutées directement.\n   * @param vm - tableau plat\n   * @returns tableau hiérarchique\n   */\n  static rebuildTreeFromViewModel(vm: OptionsViewModel[]): SelectOptionViewModel[] {\n    const result: SelectOptionViewModel[] = [];\n\n    const usedGroupIds = vm.filter((o) => o.groupId != null).map((o) => o.groupId!);\n\n    // créer les groupes\n    const groups = vm\n      .filter((o) => o.isGroup && usedGroupIds.includes(o.groupId!))\n      .map((o) => ({\n        groupId: o.groupId!,\n        option: {\n          label: o.label,\n          value: o.value,\n          selected: signal(false),\n          options: [] as SelectOptionViewModel[],\n        },\n      }));\n\n    // ajouter les groupes au résultat\n    groups.forEach((g) => result.push(g.option));\n\n    // ajouter les feuilles\n    vm.filter((o) => !o.isGroup).forEach((item) => {\n      const group = item.groupId ? groups.find((g) => g.groupId === item.groupId) : undefined;\n\n      const leaf: SelectOptionViewModel = {\n        label: item.label,\n        value: item.value,\n        disabled: item.disabled,\n        selected: signal(false),\n      };\n\n      group ? group.option.options!.push(leaf) : result.push(leaf);\n    });\n\n    return result;\n  }\n\n  /**\n   * Supprime certaines valeurs d'une liste à plat tout en conservant les groupes qui ont encore des enfants.\n   * @param sideOptions - tableau plat\n   * @param valuesToRemove - valeurs à retirer\n   * @returns tableau plat après suppression\n   */\n  static removeFlattenOptions(\n    sideOptions: OptionsViewModel[],\n    valuesToRemove: any[],\n    compareWithFn: (o1: any, o2: any) => boolean = Object.is,\n  ): any[] {\n    const sideFlattenWithparents = sideOptions.filter(\n      (o) => o.isGroup || !valuesToRemove.some((v) => compareWithFn(v, o.value)),\n    );\n\n    return sideFlattenWithparents.filter(\n      (o) => !o.isGroup || sideFlattenWithparents.some((child) => !child.isGroup && child.groupId === o.groupId),\n    );\n  }\n\n  /**\n   * Filtre un tableau plat pour ne conserver que certaines valeurs et leurs groupes parents.\n   * @param vm - tableau plat\n   * @param selectedValues - valeurs à conserver\n   * @param compareWithFn - fonction de comparaison\n   * @returns tableau plat filtré\n   */\n  static filterWithGroups(\n    vm: OptionsViewModel[],\n    selectedValues: any[],\n    compareWithFn: (o1: any, o2: any) => boolean = Object.is,\n  ): OptionsViewModel[] {\n    // récupérer tous les groupId des valeurs sélectionnées\n    const selectedGroupIds = vm\n      .filter((o) => selectedValues.some((v) => compareWithFn(v, o.value)) && !o.isGroup)\n      .map((o) => o.groupId);\n\n    // garder les objets sélectionnés + leurs groupes\n    return vm.filter(\n      (o) =>\n        // l'objet est sélectionné\n        selectedValues.some((v) => compareWithFn(v, o.value)) ||\n        // ou l'objet est un groupe parent d'une valeur sélectionnée\n        (o.isGroup && o.groupId && selectedGroupIds.includes(o.groupId)),\n    );\n  }\n\n  /**\n   * Filtrer les options selon la fonction de recherche et conserver la structure. Les labels des groupes sont ignorés.\n   * @return {filtered: options filtrés, countResults: nombre de résultats }\n   **/\n  static onSearch(\n    options: SelectOptionViewModel[] | undefined,\n    searchFn: (o: DsfrOption, searchText: string) => boolean,\n    searchText: string,\n  ): OptionUtils.SearchResult {\n    let countResults = 0;\n\n    if (!options || !options.length || !searchFn) return { optionsFilter: [], countResults: 0 };\n\n    const filtered: SelectOptionViewModel[] = [];\n\n    for (const option of options) {\n      // Ignorer les groupes dans la recherche\n      if (option.options?.length) {\n        const optionsChildren = option.options.filter((o) => searchFn(o, searchText));\n\n        if (optionsChildren?.length) {\n          filtered.push({ ...option, options: optionsChildren });\n          countResults = countResults + optionsChildren.length;\n        }\n      } else if (searchFn(option, searchText)) {\n        filtered.push(option);\n        countResults++;\n      }\n    }\n\n    return {\n      optionsFilter: filtered,\n      countResults: countResults,\n    };\n  }\n\n  /**\n   * Filtrer les options selon la fonction de recherche et conserver la structure. Les labels des groupes sont ignorés.\n   * Non utilisé */\n  static onSearchFlatten(\n    optionsFlatten: OptionsViewModel[],\n    optionsFilter: OptionsViewModel[],\n    searchFn: (o: DsfrOption, searchText: string) => boolean,\n    searchText: string,\n  ): void {\n    const groupIdsInserted: number[] = [];\n    let countResults = 0;\n\n    optionsFilter = [];\n\n    for (const option of optionsFlatten) {\n      // Ignorer les groupes dans la recherche\n      if (!option.isGroup && searchFn(option, searchText)) {\n        // Ajouter le groupe si il n'est pas déja présent\n        if (option.groupId && !groupIdsInserted.includes(option.groupId)) {\n          const group = optionsFlatten.find((o) => o.isGroup && o.groupId === option.groupId);\n\n          if (group) {\n            optionsFilter.push(group);\n            groupIdsInserted.push(option.groupId);\n          }\n        }\n\n        optionsFilter.push(option);\n        countResults++;\n      }\n    }\n  }\n}\n","import { ScrollingModule } from '@angular/cdk/scrolling';\nimport { CommonModule } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  ContentChild,\n  Input,\n  OnInit,\n  TemplateRef,\n  ViewChild,\n  ViewEncapsulation,\n  WritableSignal,\n  booleanAttribute,\n  computed,\n  forwardRef,\n  signal,\n} from '@angular/core';\nimport { FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\nimport { DsfrButtonModule, DsfrOption, DsfrTagModule } from '@edugouvfr/ngx-dsfr';\nimport { AbstractSelectComponent, DropdownContainerComponent } from '../shared/components';\nimport { DsfrOptionContext, ListOptionsComponent } from '../shared/components/list-options';\nimport { ListToolBarComponent } from '../shared/components/list-toolbar/list-toolbar.component';\nimport { SelectInputLabelComponent } from '../shared/components/select-input-label/select-input-label.component';\nimport { EduMessageSeverityDirective } from '../shared/directives/message-severity.directive';\nimport { OptionsViewModel, SelectOptionViewModel } from '../shared/models/options-view-model';\nimport { DsfrSelectionModeConst } from '../shared/models/selection-mode.type';\nimport { OptionUtils } from '../shared/utils/option/option-utils';\nimport { SelectFocusUtils } from './select-focus.utils';\n\n@Component({\n  selector: 'dsfr-ext-multiselect, dsfrx-multiselect,',\n  styleUrls: ['./multiselect.component.scss'],\n  templateUrl: './multiselect.component.html',\n  encapsulation: ViewEncapsulation.None,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    CommonModule,\n    FormsModule,\n    ScrollingModule,\n    ReactiveFormsModule,\n    DropdownContainerComponent,\n    DsfrTagModule,\n    DsfrButtonModule,\n    SelectInputLabelComponent,\n    EduMessageSeverityDirective,\n    ListToolBarComponent,\n    ListOptionsComponent,\n  ],\n  providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DsfrMultiselectComponent), multi: true }],\n})\nexport class DsfrMultiselectComponent extends AbstractSelectComponent<SelectOptionViewModel> implements OnInit {\n  /** @internal */\n  @ViewChild('listOptionsComponent') listOptionsComponent?: ListOptionsComponent;\n\n  /** Template des labels des options */\n  @ContentChild('groupTemplate', { static: true }) groupTemplate?: TemplateRef<DsfrOptionContext>;\n\n  /** Afficher des cases à cocher pour la sélection de groupes d'option */\n  @Input({ transform: booleanAttribute }) showGroupSelection = false;\n\n  /** @internal liste d'options filtrées */\n  public override optionsFilter: WritableSignal<SelectOptionViewModel[]> = signal([]);\n\n  readonly selectionModeConst = DsfrSelectionModeConst;\n\n  /** Nombre de résultats après une recherche (pas de valeur initiale = a11y) */\n  protected nbFilterResults = signal(0);\n\n  protected readonly containerListClass = SelectFocusUtils.CONTAINER_LIST_CLASS;\n\n  protected optionsFlatten: OptionsViewModel[] = [];\n\n  protected isAllSelected = computed(() => {\n    const optionsFilterFlatten = OptionUtils.flattenOptions(this.optionsFilter());\n\n    //liste des options non cochées et non disabled\n    const optionsNotSelected = optionsFilterFlatten.filter((option) => !option.selected() && !option.isGroup);\n\n    this.optionsToSelect = [...optionsNotSelected.filter((o) => !o.disabled)];\n\n    return optionsNotSelected.length === 0;\n  });\n\n  private optionsToSelect: SelectOptionViewModel[] = [];\n\n  /** Personnalisation de la fonction de recherche pour filtrer les options. Fonction à 2 arguments : option (DsfrSelectOption) et texte cherché (string) */\n  @Input()\n  set searchFn(fn: (o: DsfrOption, text: string) => boolean) {\n    if (typeof fn !== 'function') {\n      throw Error('`searchFn` must be a function.');\n    }\n    this._searchFn = fn;\n\n    this.searchText = '';\n    this.optionsFilter.set(this._options() ?? []);\n  }\n\n  /** Liste des options disponibles. */\n  @Input()\n  override set options(val: any[] | undefined) {\n    const options = val?.map((o) => OptionUtils.initSelectedState(o)) ?? [];\n\n    this.optionsFlatten = OptionUtils.flattenOptions(options);\n    this.applyOptions(options);\n  }\n\n  /**\n   * Mise a jour de la valeur de selectedOptions et value programmaticalement (ex. à l'init reactive form)\n   * @param value\n   * @internal\n   */\n  override writeValue(value: any) {\n    this.selectedOptions.map((o) => o.selected.set(false));\n\n    if (value) {\n      if (this.isSingleMode) {\n        this.selectedOptions =\n          this.optionsFlatten && this.optionsFlatten.length\n            ? ([this.optionsFlatten?.find((o) => this._compareWith(value, o.value))] as SelectOptionViewModel[])\n            : [];\n        this.selectedOptions[0]?.selected.set(true);\n      } else if (!(value instanceof Array)) {\n        throw Error('`value` must be an array.');\n      } else {\n        // Sélection des options en enlevant les doublons et valeurs nulles éventuelles\n        this.selectedOptions = Array.from(\n          new Set(\n            value\n              .map((val: SelectOptionViewModel) => this.optionsFlatten?.find((o) => this._compareWith(val, o.value)))\n              .filter((selectedOption) => {\n                if (selectedOption) {\n                  selectedOption.selected.set(true);\n                  return true;\n                }\n                return false;\n              }),\n          ),\n        ) as SelectOptionViewModel[];\n      }\n\n      this.indexFirstSelected = this.getFirstIndexSelected(value);\n    } else {\n      this.selectedOptions = [];\n      this.indexFirstSelected = null;\n    }\n\n    this.updateFilteredParentsSelectedState();\n    super.writeValue(value);\n    this.cd.markForCheck();\n  }\n\n  /**\n   * Sélection ou désélection d'une option\n   * @internal */\n  public onOptionClick(e: any, option: SelectOptionViewModel): void {\n    e.preventDefault();\n\n    if (option.disabled) return; // si l'option est désactivée on ne fait rien du tout\n\n    if (this.isSingleMode) {\n      this.optionClickSingle(option);\n    } else if (!this.showGroupSelection || this.selectionMode !== DsfrSelectionModeConst.CHECKBOX) {\n      this.optionClickMultiple(option);\n    } else {\n      this.optionClickMultipleWithGroupSelection(option);\n    }\n\n    this.indexFirstSelected = this.getFirstIndexSelected(this.value);\n    this.selectionChange.emit(this.value);\n  }\n\n  /**\n   * Gère les interactions clavier sur une option et déclenche, si nécessaire, la fermeture du dropdown.\n   * @internal */\n  public onOptionKeyDown(shouldCloseDropdown: boolean): void {\n    if (shouldCloseDropdown) {\n      this.hide();\n    }\n  }\n\n  /**\n   * Sélectionner ou déselectionner toutes les options\n   * Si maxSelectedOptions est défini, sélection uniquement des (max) premières options\n   @internal\n  */\n  public selectAll(): void {\n    if (this.optionsToSelect.length > 0) {\n      //Tout sélectionner\n      this.optionsToSelect.forEach((o) => {\n        o.selected.set(true);\n      });\n      this.selectedOptions = [...this.selectedOptions, ...this.optionsToSelect];\n    } else {\n      //Tout déselectionner excepté les options disabled selected\n      const filteredOptions = OptionUtils.flattenOptions(this.optionsFilter());\n      filteredOptions.forEach((o) => {\n        o.selected.set(false);\n      });\n\n      const allOptions = OptionUtils.flattenOptions(this._options());\n      this.selectedOptions = allOptions.filter((o) => {\n        if (o.isGroup) return false;\n        return o.selected();\n      });\n    }\n\n    this.updateFilteredParentsSelectedState();\n    this.value = this.selectedOptions.map((o) => o.value);\n    this.selectionChange.emit(this.value);\n  }\n\n  /**\n   * Filtrer les options selon la fonction de recherche et conserver la structure. Les labels des groupes sont ignorés.\n   * @internal */\n  public onSearch(): void {\n    const search: OptionUtils.SearchResult = OptionUtils.onSearch(this._options(), this._searchFn, this.searchText);\n\n    this.optionsFilter.set(search.optionsFilter);\n    this.nbFilterResults.set(search.countResults);\n  }\n\n  /** @internal */\n  public override toggleDropdown(event: Event) {\n    super.toggleDropdown(event);\n\n    if (this.virtualScroll && this.displayDropdown() && (this.showSearch || this.showSelectAll)) {\n      this.listOptionsComponent?.viewport?.checkViewportSize();\n    }\n  }\n\n  /**\n   * Mise à jour liste des options sélectionnées\n   * (suppression des nœuds non sélectionnés)\n   */\n  public updateSelectedNodes(): SelectOptionViewModel[] {\n    this.selectedOptions = Array.from(new Set(this.selectedOptions.filter((n: SelectOptionViewModel) => n.selected())));\n    return this.selectedOptions;\n  }\n\n  protected trackByIndex = (index: number): number => {\n    return index;\n  };\n\n  /** Suppression d'un tag option */\n  protected clearOption(event: { nativeEvent: Event; option: SelectOptionViewModel }): void {\n    event.nativeEvent.stopPropagation();\n    this.onOptionClick(event.nativeEvent, event.option);\n    this.fnOnTouched();\n  }\n\n  /** Suppression du tag contenant toutes les options */\n  protected clearAllOptions(): void {\n    this.selectedOptions.map((o) => o.selected.set(false));\n    this.selectedOptions = [];\n    this.value = [];\n\n    this.selectionChange.emit(this.value);\n    this.fnOnTouched();\n  }\n\n  protected handleListFocus(el: HTMLElement): void {\n    this.listOptionsComponent?.handleListFocus(el);\n  }\n\n  /** Permet de déterminer l'option à focus dans le cas d'une navigation avec les flêches depuis la combobox */\n  private getFirstIndexSelected(value: any): number {\n    if (!this.optionsFilter()?.length) {\n      return -1;\n    }\n\n    if (this.isSingleMode) {\n      return this.optionsFilter().findIndex((o) => this._compareWith(o.value, value));\n    }\n\n    if (Array.isArray(value) && value.length > 0) {\n      return this.getMinIndex(value);\n    }\n\n    return -1;\n  }\n\n  private getMinIndex(value: any[]): number {\n    let minIndex = -1;\n\n    for (const v of value) {\n      const index = this.optionsFilter().findIndex((o) => this._compareWith(o.value, v));\n\n      if (index !== -1) {\n        minIndex = minIndex === -1 ? index : Math.min(minIndex, index);\n      }\n    }\n\n    return minIndex;\n  }\n\n  /** Sélection ou déselection d'une option en mode multiple/checkbox */\n  private optionClickMultiple(option: OptionsViewModel): void {\n    if (!option.selected()) {\n      if (this.maxSelectedOptions && this.selectedOptions.length === this.maxSelectedOptions) {\n        // nothing here\n      } else {\n        option.selected.set(true);\n        this.selectedOptions.push(option);\n      }\n    } else {\n      // déselection\n      option.selected.set(false);\n      const i = this.selectedOptions.findIndex((o) => this._compareWith(option.value, o.value));\n      if (i !== -1) {\n        this.selectedOptions.splice(i, 1);\n      }\n    }\n    this.selectedOptions = [...this.selectedOptions];\n    this.value = this.selectedOptions.map((o) => o.value);\n  }\n\n  /** Sélection ou déselection d'une option en mode single */\n  private optionClickSingle(option: OptionsViewModel): void {\n    if (option.selected()) {\n      // Déselection de l'option\n      this.selectedOptions = [];\n      option.selected.set(false);\n    } else {\n      // Sélection d'une nouvelle option\n      this.selectedOptions[0]?.selected?.set(false);\n      this.selectedOptions = [option];\n      option.selected.set(true);\n    }\n\n    this.value = this.selectedOptions[0] ? this.selectedOptions[0].value : undefined;\n    this.hide();\n  }\n\n  /** Fonction de recherche par défaut */\n  private _searchFn: (o: DsfrOption, searchText: string) => boolean = function (o, searchText) {\n    return o.label?.toLowerCase().includes(searchText.toLowerCase());\n  };\n\n  /** Sélection ou déselection d'une option avec sélection de groupes activée */\n  private optionClickMultipleWithGroupSelection(option: SelectOptionViewModel): void {\n    if (option.options) {\n      // Clic sur un groupe\n      this.setSelectedStateChildren(option);\n    } else {\n      // Clic sur un enfant\n      option.selected.update((v) => !v);\n      this.selectedOptions.push(option);\n      this.setSelectedStateParent(option);\n    }\n\n    this.updateSelectedNodes();\n    this.value = this.selectedOptions.map((o) => o.value);\n  }\n\n  /** Mise a jour du statut selected d'une option de groupe et de ses enfants */\n  private setSelectedStateChildren(group: SelectOptionViewModel): void {\n    const selectableOptions = group.options!.filter((option) => !option.disabled);\n\n    if (selectableOptions.length === 0) return;\n\n    const allSelected = selectableOptions.every((c) => c.selected());\n\n    const nextState = !allSelected;\n\n    for (const child of group.options!) {\n      if (!child.disabled) {\n        child.selected.set(nextState);\n        this.selectedOptions.push(child);\n        this.selectedOptions = Array.from(new Set(this.selectedOptions));\n      }\n    }\n\n    this.setSelectedStateParent(group.options![0]);\n  }\n\n  /** Mise a jour du statut selected d'une option de groupe après sélection d'un de ses enfants */\n  private setSelectedStateParent(option: SelectOptionViewModel): void {\n    const parent = this.findParent(option);\n\n    if (parent?.options) {\n      const selectedCount = parent.options.filter((c) => c.selected()).length;\n      const stateSelected = selectedCount === 0 ? false : selectedCount === parent.options.length ? true : undefined;\n\n      parent.selected.set(stateSelected);\n    }\n  }\n\n  private findParent(option: SelectOptionViewModel): SelectOptionViewModel | undefined {\n    return this._options()?.find((group) =>\n      (group.options as SelectOptionViewModel[])?.some((opt) => {\n        return opt.groupId === option.groupId;\n      }),\n    );\n  }\n\n  /** Mise à jour du statut des parents de groupe prenant en compte le filtrage en cours */\n  private updateFilteredParentsSelectedState(): void {\n    this.optionsFilter().forEach((parent) => {\n      if (parent?.options) {\n        const reference = this._options().find((refOption) => refOption.label === parent.label);\n        const selectedCount = reference?.options?.filter((c) => c.selected()).length;\n        const stateSelected =\n          selectedCount === 0 ? false : selectedCount === reference?.options?.length ? true : undefined;\n\n        parent.selected.set(stateSelected);\n      }\n    });\n  }\n}\n","<div\n  class=\"fr-select-group dsfrx-select\"\n  [class]=\"messageViewModel() ? 'fr-select-group--' + severityViewModel() : ''\"\n  [ngClass]=\"{\n    'is-open': displayDropdown(),\n    'has-toolbar': showSearch || showSelectAll,\n    'fr-select-group--disabled': disabled,\n  }\">\n  <div\n    class=\"fr-label\"\n    [class]=\"message() ? 'fr-label--' + severityViewModel() : ''\"\n    [ngClass]=\"{ 'fr-sr-only': labelSrOnly }\"\n    id=\"{{ selectId }}-label\">\n    @if (label) {\n      {{ label }}\n    } @else {\n      <ng-content select=\"[label]\"></ng-content>\n    }\n    @if (hint) {\n      <span class=\"fr-hint-text\">{{ hint }}</span>\n    }\n  </div>\n\n  <edu-dropdown-container\n    [displayDropdown]=\"displayDropdown()\"\n    [appendTo]=\"appendTo\"\n    [classToWrap]=\"'dsfrx-select__combobox'\"\n    [autoWidthDropdown]=\"autoWidthDropdown\"\n    [autofocus]=\"true\"\n    [hasToolBar]=\"showSearch || showSelectAll\"\n    [zIndex]=\"zIndex\"\n    [scrollHeight]=\"scrollHeight\"\n    [indexFirstSelected]=\"indexFirstSelected\"\n    (focusOnList)=\"handleListFocus($event)\"\n    (hideList)=\"hide()\"\n    [id]=\"selectId\"\n    [virtualScroll]=\"virtualScroll\"\n    [hasOptions]=\"optionsFilter().length > 0\">\n    <!-- Control input -->\n    <div\n      ngProjectAs=\"control\"\n      ngDefaultControl\n      [(ngModel)]=\"value\"\n      id=\"{{ selectId }}\"\n      [attr.tabindex]=\"disabled ? -1 : 0\"\n      role=\"combobox\"\n      (click)=\"toggleDropdown($event)\"\n      (keydown)=\"onButtonKeyDown($event)\"\n      aria-haspopup=\"listbox\"\n      [ngClass]=\"{ 'fr-select--disabled': disabled }\"\n      [disabled]=\"disabled\"\n      [attr.aria-controls]=\"selectId + '-listbox'\"\n      [attr.aria-expanded]=\"displayDropdown()\"\n      [attr.aria-describedby]=\"combinedAriaDescribedBy()\"\n      [attr.aria-labelledby]=\"selectId + '-label'\"\n      [attr.aria-required]=\"ariaRequired || null\"\n      [attr.aria-invalid]=\"ariaInvalid || null\"\n      class=\"fr-select\">\n      <edu-select-input-label\n        [disabled]=\"disabled\"\n        [placeHolder]=\"placeHolder\"\n        [clearableOptions]=\"clearableOptions\"\n        [maxDisplayOptions]=\"maxDisplayOptions\"\n        [selectedOptionTemplate]=\"selectedOptionTemplate\"\n        [selectedOptions]=\"selectedOptions\"\n        [maxDisplayOptionsTemplate]=\"maxDisplayOptionsTemplate\"\n        (clearOptionSelect)=\"clearOption($event)\"\n        (clearAllOptionsSelect)=\"clearAllOptions()\">\n      </edu-select-input-label>\n    </div>\n\n    <!-- If toolbar is shown -->\n    <ng-container toolbar>\n      <edu-list-toolbar\n        [maxSelectedOptions]=\"maxSelectedOptions\"\n        [showSelectAll]=\"showSelectAll\"\n        [isAllSelected]=\"isAllSelected()\"\n        [showSearch]=\"showSearch\"\n        [selectId]=\"selectId\"\n        [showClearSearch]=\"showClearSearch\"\n        [searchMessage]=\"searchMessage\"\n        [nbFilterResults]=\"nbFilterResults()\"\n        [(ngModel)]=\"searchText\"\n        (selectAll)=\"selectAll()\"\n        (valueChange)=\"onSearch()\"\n        (cleared)=\"resetSearchInput()\">\n      </edu-list-toolbar>\n    </ng-container>\n\n    <edu-list-options\n      #listOptionsComponent\n      [virtualScroll]=\"virtualScroll\"\n      [selectId]=\"selectId\"\n      [zIndex]=\"zIndex\"\n      [scrollMaxHeight]=\"scrollHeight\"\n      [virtualScrollItemHeight]=\"virtualScrollItemHeight\"\n      [isSingleMode]=\"isSingleMode\"\n      [displayDropdown]=\"displayDropdown()\"\n      [noResultsMessage]=\"noResultsMessage\"\n      [optionsFilter]=\"optionsFilter()\"\n      [optionTemplate]=\"optionTemplate\"\n      [loading]=\"loading\"\n      [showSearch]=\"showSearch\"\n      [showSelectAll]=\"showSelectAll\"\n      [showCheckboxes]=\"showCheckboxes\"\n      [showGroupSelection]=\"showGroupSelection && selectionMode === selectionModeConst.CHECKBOX\"\n      (optionClicked)=\"onOptionClick($event.e, $event.option)\"\n      (optionKeyDown)=\"onOptionKeyDown($event.shouldCloseDropdown)\"></edu-list-options>\n  </edu-dropdown-container>\n  <div [id]=\"messagesGroupId\" class=\"fr-messages-group\" aria-live=\"polite\">\n    @if (messageViewModel()) {\n      <p [eduMessageSeverity]=\"severityViewModel()\">\n        {{ messageViewModel() }}\n      </p>\n    }\n  </div>\n</div>\n","export const MESSAGES_EN = {\n  panel: {\n    expand: 'Expand',\n    collapse: 'Collapse',\n  },\n};\n","// Ordre alphabétique requis\nexport const MESSAGES_FR = {\n  panel: {\n    expand: 'Étendre',\n    collapse: 'Réduire',\n  },\n};\n","import { Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation, inject } from '@angular/core';\n\nimport { CommonModule } from '@angular/common';\nimport { DsfrButtonModule, DsfrI18nPipe, DsfrI18nService, Language, newUniqueId } from '@edugouvfr/ngx-dsfr';\nimport { DsfrHeadingLevel } from '../shared/models/heading-level';\nimport { MESSAGES_EN } from './i18n/messages.en';\nimport { MESSAGES_FR } from './i18n/messages.fr';\n\n@Component({\n  selector: 'dsfr-ext-panel, dsfrx-panel',\n  templateUrl: './panel.component.html',\n  styleUrls: ['./panel.component.scss'],\n  imports: [CommonModule, DsfrButtonModule, DsfrI18nPipe],\n  encapsulation: ViewEncapsulation.None,\n})\nexport class DsfrPanelComponent implements OnInit {\n  /**\n   * Titre du panel.\n   */\n  @Input() heading?: string;\n\n  /** Le niveau de titre devant être utilisé. */\n  @Input() headingLevel?: DsfrHeadingLevel;\n\n  /**\n   *  Identifiant du panel sur la page. Identifiant unique généré par défaut si non renseigné.\n   */\n  @Input() panelId?: string;\n\n  /**\n   * Indique si le panel doit être fermé initialement.\n   * Si null le panel ne sera pas refermable.\n   */\n  @Input() expanded: boolean | null = true;\n\n  /**\n   * Événement présentant le nouvel état du panel.\n   */\n  @Output() expandedChange = new EventEmitter<boolean>();\n\n  protected messageExpandButton: string = '';\n\n  private i18n = inject(DsfrI18nService);\n\n  constructor() {\n    this.i18n.extendsLabelsBundle(Language.EN, MESSAGES_EN);\n    this.i18n.extendsLabelsBundle(Language.FR, MESSAGES_FR);\n  }\n\n  ngOnInit(): void {\n    this.panelId ??= newUniqueId();\n\n    if (this.expanded === undefined) {\n      this.expanded = true;\n    }\n    this.messageExpandButton = this.expanded ? 'panel.collapse' : 'panel.expand';\n  }\n\n  /** @Internal */\n  toggleExpand(e: Event) {\n    e.preventDefault();\n    e.stopPropagation();\n    this.expanded = !this.expanded;\n    this.expandedChange.emit(this.expanded);\n    this.messageExpandButton = this.expanded ? 'panel.collapse' : 'panel.expand';\n  }\n}\n","<div class=\"dsfrx-panel\">\n  <div class=\"dsfrx-panel__header fr-background-alt--grey\">\n    <ng-container *ngTemplateOutlet=\"dsfrPanelHeaderExpand\"></ng-container>\n  </div>\n  <!--content + footer-->\n  <div\n    [ngClass]=\"{ 'dsfrx-panel__collapse': true, 'dsfrx-panel__collapse--expanded': expanded || expanded === null }\"\n    [id]=\"panelId\">\n    <div class=\"dsfrx-panel__content\">\n      <ng-content></ng-content>\n    </div>\n    <div class=\"dsfrx-panel__footer fr-background-alt--grey\">\n      <ng-content select=\"[footer]\"></ng-content>\n    </div>\n  </div>\n</div>\n\n<ng-template #dsfrPanelHeaderExpand>\n  <ng-container *ngTemplateOutlet=\"dsfrPanelHeaderTitle\"></ng-container>\n  <ng-container *ngTemplateOutlet=\"dsfrPanelHeaderActions\"></ng-container>\n</ng-template>\n\n<!--TITRE-->\n<ng-template #dsfrPanelHeaderTitle>\n  <ng-container>\n    @switch (headingLevel) {\n      @default {\n        <h1 class=\"dsfrx-panel__title\">{{ heading }}</h1>\n      }\n      @case ('H2') {\n        <h2 class=\"dsfrx-panel__title\">{{ heading }}</h2>\n      }\n      @case ('H3') {\n        <h3 class=\"dsfrx-panel__title\">{{ heading }}</h3>\n      }\n      @case ('H4') {\n        <h4 class=\"dsfrx-panel__title\">{{ heading }}</h4>\n      }\n      @case ('H5') {\n        <h5 class=\"dsfrx-panel__title\">{{ heading }}</h5>\n      }\n      @case ('H6') {\n        <h6 class=\"dsfrx-panel__title\">{{ heading }}</h6>\n      }\n    }\n  </ng-container>\n</ng-template>\n\n<ng-template #dsfrPanelHeaderActions>\n  <div class=\"dsfrx-panel__actions\">\n    <ng-content select=\"[actions]\"></ng-content>\n    @if (expanded !== null) {\n      <button\n        type=\"button\"\n        (click)=\"toggleExpand($event)\"\n        class=\"dsfrx-panel__btn\"\n        [attr.aria-expanded]=\"expanded\"\n        [attr.aria-label]=\"expanded ? ('panel.collapse' | dsfrI18n) : ('panel.expand' | dsfrI18n)\"\n        [attr.aria-controls]=\"panelId\"\n        data-testid=\"expand-btn\">\n        <span class=\"fr-sr-only\">{{ messageExpandButton | dsfrI18n }}</span>\n        @if (expanded) {\n          <span class=\"fr-icon-subtract-line\" aria-hidden=\"true\"></span>\n        } @else {\n          <span class=\"fr-icon-add-line\" aria-hidden=\"true\"></span>\n        }\n      </button>\n    }\n  </div>\n</ng-template>\n","// Ordre alphabétique requis\nexport const MESSAGES_EN = {\n  pickList: {\n    addSelection: 'Add selection',\n    removeSelection: 'Remove selection',\n    addAll: 'Add all',\n    removeAll: 'Remove all',\n    elementsToAdd: 'Elements to add',\n    elementsAlreadyAdded: 'Elements already added',\n    availableElements: 'Available elements',\n    selectedElements: 'Selected elements',\n    listOfSourceElements: 'List of available elements',\n    listOfDestinationElements: 'List of selected elements',\n    addAllAvailableElements: 'Add all available elements',\n    addSelectedElements: 'Add selected elements',\n    removeAllElementsAlreadyAdded: 'Remove all elements already added',\n    removeSelectedElements: 'Remove selected elements',\n  },\n};\n","// Ordre alphabétique requis\nexport const MESSAGES_FR = {\n  pickList: {\n    addSelection: 'Ajouter la sélection',\n    removeSelection: 'Supprimer la sélection',\n    addAll: 'Tout ajouter',\n    removeAll: 'Tout supprimer',\n    elementsToAdd: 'Éléments à ajouter',\n    elementsAlreadyAdded: 'Éléments déjà ajoutés',\n    availableElements: 'Éléments disponibles',\n    selectedElements: 'Éléments sélectionnés',\n    listOfSourceElements: 'Liste des éléments disponibles',\n    listOfDestinationElements: 'Liste des éléments sélectionnés',\n    addAllAvailableElements: 'Ajouter tous les éléments disponibles',\n    addSelectedElements: 'Ajouter les éléments sélectionnés',\n    removeAllElementsAlreadyAdded: 'Supprimer tous les éléments déjà ajoutés',\n    removeSelectedElements: 'Supprimer les éléments sélectionnés',\n  },\n};\n","/**\n * Les valeurs possibles pour le format 'mode'.\n */\nexport enum ModeValue {\n  PICK_LIST = 'pick-list',\n  DUAL_LIST = 'dual-list',\n}\n","import { ScrollingModule } from '@angular/cdk/scrolling';\nimport { CommonModule } from '@angular/common';\nimport {\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  ContentChild,\n  ElementRef,\n  EventEmitter,\n  inject,\n  input,\n  Input,\n  Output,\n  Renderer2,\n  signal,\n  TemplateRef,\n  ViewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { DsfrButtonModule, DsfrOption, DsfrSelectOption, DsfrTagModule } from '@edugouvfr/ngx-dsfr';\nimport { SelectFocusUtils } from '../../multiselect/select-focus.utils';\nimport { DsfrOptionContext, ListOptionsComponent } from '../../shared/components/list-options';\nimport { ListToolBarComponent } from '../../shared/components/list-toolbar';\nimport { OptionsViewModel, SelectOptionViewModel } from '../../shared/models/options-view-model';\nimport { OptionUtils } from '../../shared/utils/option/option-utils';\n\n/**\n * Interface émise a chaque évènement de filtrage du picklist.\n */\nexport interface DsfrFilterChange {\n  /** Renvoie l'ensemble des options visible, ou undefined en cas d'absence de filtrage. */\n  filteredOptions?: DsfrSelectOption[];\n  /** Permet de discriminer les deux picklist en utilisant leur position. */\n  listPosition: 'left' | 'right';\n}\n\n@Component({\n  selector: 'edu-picklist-unit',\n  styleUrls: ['./picklist-unit.component.scss'],\n  templateUrl: './picklist-unit.component.html',\n  encapsulation: ViewEncapsulation.None,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    CommonModule,\n    FormsModule,\n    ScrollingModule,\n    ReactiveFormsModule,\n    DsfrTagModule,\n    DsfrButtonModule,\n    ListToolBarComponent,\n    ListOptionsComponent,\n  ],\n})\nexport class DsfrPickListUnitComponent {\n  /** @internal */\n  @ViewChild('listOptionsComponent') listOptionsComponent?: ListOptionsComponent;\n\n  /** @internal */\n  @ViewChild(ListToolBarComponent, { read: ElementRef })\n  toolbarWrapper?: ElementRef<HTMLElement>;\n\n  /** Template des labels des options */\n  @ContentChild('optionTemplate', { static: true }) optionTemplate?: TemplateRef<DsfrOptionContext>;\n\n  /** Template des options */\n  @Input() optionTemplateUnit?: TemplateRef<any>;\n\n  /** Id du composant, généré par défaut */\n  @Input({ required: true }) pickListUnitId!: string;\n\n  /** Activer le virtual scroll  */\n  @Input({ transform: booleanAttribute }) virtualScroll: boolean = false;\n\n  /** Donne la position du slot dans le template */\n  @Input({ required: true }) listPosition: 'left' | 'right' = 'left';\n\n  /**\n   * Afficher la barre de filtrage des options\n   */\n  @Input({ transform: booleanAttribute }) showSearch = false;\n\n  /** Afficher la case à cocher tout sélectionner */\n  @Input({ transform: booleanAttribute }) showSelectAll = false;\n\n  /** Afficher des cases à cocher pour la sélection de groupes d'option */\n  @Input({ transform: booleanAttribute }) showGroupSelection = false;\n\n  /** Afficher un bouton pour vider le champ de la barre de recherche */\n  @Input({ transform: booleanAttribute }) showClearSearch = false;\n\n  /** Placeholder pour le champ de recherche */\n  @Input() searchMessage?: string;\n\n  /** Surcharger la hauteur d'un item dans le cas du virtual scroll. Par défaut 32px. */\n  @Input() virtualScrollItemHeight: number = 32;\n\n  /** Message d'accessibilité vocalisé lorsqu'il n'y a aucun résultat. */\n  @Input() noResultsMessage?: string;\n\n  /** Afficher un état de chargement */\n  @Input() loading = false;\n\n  /** Permet de définir l'état désactivé du composant */\n  @Input({ transform: booleanAttribute }) disabled: boolean = false;\n\n  /** Permet de définir le label du header, s'il existe */\n  @Input() labelHeader?: string;\n\n  /** 👓 Attribut aria-label de la liste */\n  @Input() ariaLabelList?: string;\n\n  /** Liste d'options sélectionnée modifiée */\n  @Output() selectionChange = new EventEmitter<DsfrSelectOption[]>();\n\n  /** Émet un événement lorsque le composant est marqué comme \"touched\" */\n  @Output() touched = new EventEmitter<void>();\n\n  /** Liste des options filtrées */\n  @Output() filterChange = new EventEmitter<DsfrFilterChange>();\n\n  /** Hauteur avant le scroll sur la liste déroulante. */\n  scrollHeight = input<string>();\n\n  public optionsFlatten = signal<OptionsViewModel[]>([]);\n\n  /** compareWith reprise de l'implémentation angular SelectControlValueAccessor */\n  protected compareWithFn: (o1: any, o2: any) => boolean = Object.is;\n\n  /** Nombre de résultats après une recherche (pas de valeur initiale = a11y) */\n  protected nbFilterResults = signal(0);\n\n  /** texte pour filtrer */\n  protected searchText = '';\n\n  /** liste des options sélectionnées */\n  protected selectedOptions: SelectOptionViewModel[] = [];\n\n  /** liste d'options filtrées */\n  protected optionsFilter = signal<SelectOptionViewModel[]>([]);\n\n  protected nbSelectedFilteredOptions = computed(() => {\n    const optionsFilter = this.optionsFilter();\n\n    const selectedFilteredOptions = OptionUtils.flattenLeaves(\n      [...OptionUtils.flattenOptions(optionsFilter)].filter((option) => option.selected() && !option.disabled),\n    );\n\n    return selectedFilteredOptions.length;\n  });\n\n  protected isAllSelected = computed(() => {\n    const optionsFilterFlatten = OptionUtils.flattenOptions(this.optionsFilter());\n\n    //liste des options non cochées et non disabled\n    const optionsNotSelected = optionsFilterFlatten.filter((option) => !option.selected() && !option.isGroup);\n\n    this.optionsToSelect = [...optionsNotSelected.filter((o) => !o.disabled)];\n\n    return optionsNotSelected.length === 0 && optionsFilterFlatten.length > 0;\n  });\n\n  protected readonly containerListClass = SelectFocusUtils.CONTAINER_LIST_CLASS;\n\n  protected _options: SelectOptionViewModel[] | undefined;\n\n  private optionsToSelect: SelectOptionViewModel[] = [];\n\n  private readonly _renderer = inject(Renderer2);\n\n  /** @internal */\n  get optionsSelected(): any[] {\n    if (this.selectedOptions.length === 0) return [];\n    return this.selectedOptions.map((o) => o.value);\n  }\n\n  /**@internal */\n  public get options() {\n    return this._options;\n  }\n\n  @Input()\n  set compareWith(fn: (v1: any, v2: any) => boolean) {\n    if (typeof fn !== 'function') {\n      throw Error('`compareWith` must be a function.');\n    }\n    this.compareWithFn = fn;\n  }\n\n  /** Définit la liste des options disponibles pour le picklist */\n  @Input()\n  set options(value: SelectOptionViewModel[] | undefined) {\n    this._options = value ? value : [];\n    this.optionsFlatten.set(OptionUtils.flattenOptions(this._options));\n    this.optionsFilter.set(this._options ?? []);\n  }\n\n  /** Personnalisation de la fonction de recherche pour filtrer les options. Fonction à 2 arguments : option (DsfrSelectOption) et texte cherché (string) */\n  @Input()\n  set searchFn(fn: (o: DsfrOption, text: string) => boolean) {\n    if (typeof fn !== 'function') {\n      throw Error('`searchFn` must be a function.');\n    }\n    this._searchFn = fn;\n\n    this.searchText = '';\n    this.optionsFilter.set(this._options ?? []);\n  }\n\n  /**\n   * Sélection ou désélection d'une option\n   * En cas de correspondance multiple (même valeur dans plusieurs groupes), toutes les options correspondantes sont sélectionnées/désélectionnées.\n   * @internal */\n  public onOptionClick(e: any, option: SelectOptionViewModel): void {\n    e.preventDefault();\n\n    if (this.disabled || option.disabled) return;\n\n    const flattened = this.optionsFlatten();\n    const matches = flattened.filter((o) => !o.disabled && this.compareWithFn(o.value, option.value));\n\n    const targets = matches.length > 1 ? matches : [option];\n\n    for (const target of targets) {\n      if (!this.showGroupSelection) {\n        this.optionClickMultiple(target);\n      } else {\n        this.optionClickMultipleWithGroupSelection(target);\n      }\n    }\n\n    this.selectionChange.emit(this.optionsSelected);\n  }\n\n  /**\n   * Mise à jour liste des options sélectionnées\n   * (suppression des nœuds non sélectionnés)\n   */\n  updateSelectedNodes(): SelectOptionViewModel[] {\n    this.selectedOptions = Array.from(new Set(this.selectedOptions.filter((n: SelectOptionViewModel) => n.selected())));\n    return this.selectedOptions;\n  }\n\n  /** \n   * Réinitialiser le champ de recherche\n   @internal\n  */\n  public resetSearchInput(internal?: boolean): void {\n    if ((this.showSearch && this.searchText !== '') || internal) {\n      this.searchText = '';\n      this.onSearch();\n\n      this.touched.emit();\n    }\n  }\n\n  /**\n   * Sélectionner ou déselectionner toutes les options\n   @internal\n  */\n  public selectAll(): void {\n    if (this.optionsToSelect.length > 0) {\n      //Tout sélectionner\n      this.selectedOptions = [...this.selectedOptions, ...this.optionsToSelect];\n      this.selectedOptions.forEach((o) => {\n        o.selected.set(true);\n        this.setSelectedStateParent(o);\n      });\n    } else {\n      //Tout déselectionner sauf liste d'option disabled cochées\n      this.selectedOptions = this.unselectAllFilteredExceptDisabled();\n    }\n\n    this.selectionChange.emit(this.optionsSelected);\n  }\n\n  /**\n   * Filtrer les options selon la fonction de recherche et conserver la structure. Les labels des groupes sont ignorés.\n   * @internal */\n  public onSearch(): void {\n    const search: OptionUtils.SearchResult = OptionUtils.onSearch(this._options, this._searchFn, this.searchText);\n\n    this.optionsFilter.set(search.optionsFilter);\n    this.nbFilterResults.set(search.countResults);\n\n    const filteredOptions = this.searchText === '' ? undefined : search.optionsFilter;\n    this.filterChange.emit({ filteredOptions, listPosition: this.listPosition });\n  }\n\n  /** @internal */\n  public trackByIndex = (index: number): number => {\n    return index;\n  };\n\n  /** @internal */\n  public clearOption(event: { nativeEvent: Event; option: SelectOptionViewModel }): void {\n    event.nativeEvent.stopPropagation();\n    this.onOptionClick(event.nativeEvent, event.option);\n  }\n\n  /** @internal */\n  public clearAllOptions(): void {\n    this.options?.forEach((o) => {\n      o.selected.set(false);\n\n      if (o.options && o.options.length > 0) {\n        o.options.forEach((child) => {\n          child.selected.set(false);\n        });\n      }\n    });\n\n    this.selectedOptions = []; // reset des options sélectionnées\n\n    this.selectionChange.emit(this.optionsSelected);\n  }\n\n  protected onFocusOutToolbar(): void {\n    this.touched.emit(); // rendre le form on touched lorsque l'utilisateur focus out la toolbar\n  }\n\n  protected onKeyDownPickUnit(event: KeyboardEvent): void {\n    if (\n      !this.showSearch &&\n      event.target === event.currentTarget &&\n      event.key === 'ArrowDown' &&\n      this.listOptionsComponent?.listbox\n    ) {\n      event.preventDefault();\n      this.focusOnListElement();\n    }\n  }\n\n  protected onKeyDownToolbar(event: KeyboardEvent): void {\n    if (event.key === 'ArrowDown' && this.listOptionsComponent?.listbox) {\n      event.preventDefault();\n      this.focusOnListElement();\n    }\n  }\n\n  /**\n   * Positionne le focus sur un élément de la liste lors de l'ouverture ou après \"flèche bas\" depuis le champ de recherche.\n   * - Si un élément est déjà sélectionné, le focus est positionné sur celui-ci.\n   * - Sinon, le focus est placé sur le premier élément de la liste.\n   */\n  private focusOnListElement() {\n    // en virtualScroll le premier container est cdk-virtualscroll\n    const listboxNode = this.virtualScroll\n      ? this.listOptionsComponent?.listbox?.nativeElement?.querySelector('ul')\n      : this.listOptionsComponent?.listbox?.nativeElement;\n\n    let elementToFocus: HTMLElement | null = SelectFocusUtils.findNextListItem(\n      this.showGroupSelection,\n      listboxNode?.firstElementChild,\n    );\n\n    const indexFirstSelected = this.getFirstIndexSelected(this.optionsSelected);\n    if (indexFirstSelected && indexFirstSelected !== -1) {\n      elementToFocus = listboxNode?.children[indexFirstSelected] ?? listboxNode?.firstElementChild;\n    }\n\n    if (elementToFocus) {\n      this.setAriaActiveDescendant(listboxNode, elementToFocus.getAttribute('id'));\n      elementToFocus.focus();\n    }\n  }\n\n  /**\n   * Désélectionne toutes les options visibles (dans le filtre courant),\n   * sauf celles qui sont désactivées.\n   *\n   * Conserve également les options déjà sélectionnées mais non visibles\n   * (hors du filtre courant).\n   * @returns liste d'options désactivées sélectionnées\n   */\n  private unselectAllFilteredExceptDisabled(): OptionsViewModel[] {\n    const optionsFlatterFilter = OptionUtils.flattenOptions(this.optionsFilter());\n    const optionsFilteredSet = new Set(optionsFlatterFilter);\n    const optionsSelectedDisabled = [];\n\n    for (const option of optionsFlatterFilter) {\n      if (option.disabled === true && option.selected()) {\n        optionsSelectedDisabled.push(option);\n      } else {\n        option.selected.set(false);\n      }\n      this.setSelectedStateParent(option);\n    }\n\n    // Conserver les options sélectionnées hors du filtre actuel\n    const selectedOutsideFilter = this.selectedOptions.filter((option) => !optionsFilteredSet.has(option));\n\n    return [...optionsSelectedDisabled, ...selectedOutsideFilter];\n  }\n\n  /**\n   * Attribut aria-activedescendant sur l'input égal à l'option qui a le focus\n   * @internal */\n  private setAriaActiveDescendant(listboxNode: HTMLElement, optionId: string | null) {\n    if (optionId) {\n      this._renderer.setAttribute(listboxNode, 'aria-activedescendant', optionId);\n    }\n  }\n\n  /** Index du premier element sélectionné pour positionner le focus et aria */\n  private getFirstIndexSelected(value: any): number {\n    if (value && value[0]) {\n      // const firstOption = value ? value[0] : null;\n      return this.optionsFilter()?.findIndex((o) => o.selected());\n    }\n\n    return -1;\n  }\n\n  /** Sélection ou déselection d'une option en mode multiple/checkbox sans sélection de groupes */\n  private optionClickMultiple(option: SelectOptionViewModel): void {\n    if (!option.selected()) {\n      //sélection\n      option.selected.set(true);\n      this.selectedOptions.push(option);\n    } else {\n      // déselection\n      option.selected.set(false);\n      const i = this.selectedOptions.findIndex((o) => o.value === option.value);\n      if (i !== -1) this.selectedOptions.splice(i, 1);\n    }\n  }\n\n  /** Sélection ou déselection d'une option avec sélection de groupes activée */\n  private optionClickMultipleWithGroupSelection(option: SelectOptionViewModel): void {\n    if (option.options) {\n      // Clic sur un groupe\n      this.setSelectedStateChildren(option);\n    } else {\n      // Clic sur un enfant\n      option.selected.update((v) => !v);\n      this.selectedOptions.push(option);\n      this.setSelectedStateParent(option);\n    }\n\n    this.updateSelectedNodes();\n  }\n\n  /** Mise a jour du statut selected d'une option de groupe et de ses enfants */\n  private setSelectedStateChildren(group: SelectOptionViewModel): void {\n    const selectableOptions = group.options!.filter((option) => !option.disabled);\n\n    if (selectableOptions.length === 0) return;\n\n    const allSelected = selectableOptions.every((c) => c.selected());\n\n    const nextState = !allSelected;\n\n    for (const child of group.options!) {\n      child.selected.set(nextState);\n      this.selectedOptions.push(child);\n      this.selectedOptions = Array.from(new Set(this.selectedOptions));\n    }\n\n    this.setSelectedStateParent(group.options![0]);\n  }\n\n  /** Mise a jour du statut selected d'une option de groupe après sélection d'un de ses enfants */\n  private setSelectedStateParent(option: SelectOptionViewModel): void {\n    const parent = this.findParent(option);\n\n    if (parent?.options) {\n      const selectedCount = parent.options.filter((c) => c.selected()).length;\n      const stateSelected = selectedCount === 0 ? false : selectedCount === parent.options.length ? true : undefined;\n\n      parent.selected.set(stateSelected);\n    }\n  }\n\n  private findParent(option: SelectOptionViewModel): SelectOptionViewModel | undefined {\n    return this.options?.find((group) => group.options?.some((opt) => opt.value === option.value));\n  }\n\n  /** Fonction de recherche par défaut */\n  private _searchFn: (o: DsfrOption, searchText: string) => boolean = function (o, searchText) {\n    return o.label?.toLowerCase().includes(searchText.toLowerCase());\n  };\n}\n","<div\n  role=\"group\"\n  [id]=\"pickListUnitId + '-label'\"\n  [attr.aria-label]=\"ariaLabelList\"\n  [attr.aria-labelledby]=\"labelHeader ? pickListUnitId + '-label' : null\"\n  [attr.tabindex]=\"disabled ? '-1' : '0'\"\n  (keydown)=\"onKeyDownPickUnit($event)\">\n  @if (labelHeader) {\n    <p class=\"dsfrx-picklist__unit--header\" id=\"{{ pickListUnitId }}-label\">\n      {{ labelHeader }}\n    </p>\n  }\n\n  @if (showSearch) {\n    <edu-list-toolbar\n      [showSelectAll]=\"showSelectAll\"\n      [isAllSelected]=\"isAllSelected()\"\n      [disabled]=\"disabled\"\n      [showSearch]=\"true\"\n      [selectId]=\"pickListUnitId\"\n      [showClearSearch]=\"showClearSearch\"\n      [searchMessage]=\"searchMessage\"\n      [nbFilterResults]=\"nbFilterResults()\"\n      [showCheckboxSelectAll]=\"true\"\n      [countSelectedOptions]=\"nbSelectedFilteredOptions()\"\n      [(ngModel)]=\"searchText\"\n      (selectAll)=\"selectAll()\"\n      (valueChange)=\"onSearch()\"\n      (cleared)=\"resetSearchInput(true)\"\n      (focusOut)=\"onFocusOutToolbar()\"\n      (keyDown)=\"onKeyDownToolbar($event)\">\n    </edu-list-toolbar>\n  }\n\n  <edu-list-options\n    #listOptionsComponent\n    [virtualScroll]=\"virtualScroll\"\n    [disabled]=\"disabled\"\n    [selectId]=\"pickListUnitId\"\n    [scrollHeight]=\"scrollHeight()\"\n    [showGroupSelection]=\"showGroupSelection\"\n    [virtualScrollItemHeight]=\"virtualScrollItemHeight\"\n    [noResultsMessage]=\"noResultsMessage\"\n    [optionsFilter]=\"optionsFilter()\"\n    [optionTemplate]=\"optionTemplateUnit\"\n    [loading]=\"loading\"\n    [displayDropdown]=\"true\"\n    [showSearch]=\"true\"\n    [showSelectAll]=\"showSelectAll\"\n    [showCheckboxes]=\"true\"\n    [listPosition]=\"listPosition\"\n    (optionClicked)=\"onOptionClick($event.e, $event.option)\"></edu-list-options>\n</div>\n","import { ScrollingModule } from '@angular/cdk/scrolling';\nimport { CommonModule } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ContentChild,\n  EventEmitter,\n  Input,\n  OnInit,\n  Output,\n  TemplateRef,\n  ViewChild,\n  ViewEncapsulation,\n  WritableSignal,\n  afterNextRender,\n  booleanAttribute,\n  computed,\n  forwardRef,\n  inject,\n  input,\n  linkedSignal,\n  signal,\n} from '@angular/core';\nimport { FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\nimport {\n  DefaultValueAccessorComponent,\n  DsfrButtonModule,\n  DsfrI18nPipe,\n  DsfrI18nService,\n  DsfrOption,\n  DsfrSelectOption,\n  DsfrSeverity,\n  DsfrTagModule,\n  Language,\n  newUniqueId,\n} from '@edugouvfr/ngx-dsfr';\nimport { MESSAGES_EN as MULTISELECT_MESSAGES_EN } from '../shared/components/abstract-select/i18n/messages.en';\nimport { MESSAGES_FR as MULTISELECT_MESSAGES_FR } from '../shared/components/abstract-select/i18n/messages.fr';\nimport { EduMessageSeverityDirective } from '../shared/directives/message-severity.directive';\nimport { OptionsViewModel, SelectOptionViewModel } from '../shared/models/options-view-model';\nimport { OptionUtils } from '../shared/utils/option/option-utils';\nimport { MESSAGES_EN } from './i18n/messages.en';\nimport { MESSAGES_FR } from './i18n/messages.fr';\nimport { ModeValue } from './picklist.model';\nimport { DsfrFilterChange, DsfrPickListUnitComponent } from './unit/picklist-unit.component';\n@Component({\n  selector: 'dsfr-ext-picklist, dsfrx-picklist',\n  styleUrls: ['./picklist.component.scss'],\n  templateUrl: './picklist.component.html',\n  encapsulation: ViewEncapsulation.None,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    CommonModule,\n    FormsModule,\n    ScrollingModule,\n    ReactiveFormsModule,\n    DsfrTagModule,\n    DsfrButtonModule,\n    DsfrI18nPipe,\n    DsfrPickListUnitComponent,\n    EduMessageSeverityDirective,\n  ],\n  providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DsfrPickListComponent), multi: true }],\n})\nexport class DsfrPickListComponent extends DefaultValueAccessorComponent<any> implements OnInit {\n  /** @internal */\n  @ViewChild('pickListUnitLeft') pickListUnitLeft!: DsfrPickListUnitComponent;\n\n  /** @internal */\n  @ViewChild('pickListUnitRight') pickListUnitRight!: DsfrPickListUnitComponent;\n\n  /** Template des options */\n  @ContentChild('optionTemplate') optionTemplate?: TemplateRef<any>;\n\n  /** Id du composant, généré par défaut */\n  @Input() pickListId?: string;\n\n  /** Label du champ de sélection (prioritaire sur le slot label) */\n  @Input() label?: string;\n\n  /** Texte de description additionnel */\n  @Input() hint?: string;\n\n  /**\n   * Afficher la barre de recherche (filtre sur les options)\n   */\n  @Input() showSearch = false;\n\n  /** Afficher la case à cocher tout sélectionner */\n  @Input() showSelectAll = true;\n\n  /** Afficher un bouton pour vider le champ de la barre de recherche */\n  @Input() showClearSearch = false;\n\n  /** Afficher le header des unités de picklist */\n  @Input() showHeader = false;\n\n  /** Permet la sélection globale des groupes.\n   * Lorsqu'activé, une case à cocher apparaît sur le label de chaque groupe, et permet de sélectionner ou désélectionner toutes les options qu'ils contiennent.\n   */\n  @Input() showGroupSelection = false;\n\n  /** Intitulé du header de la liste source. Une valeur par défaut est utilisée lorsque `showHeader` est activé sans qu'un libellé spécifique ne soit fourni. */\n  @Input() labelHeaderSourceList?: string;\n\n  /** Intitulé du header de la liste destinataire. Une valeur par défaut est utilisée lorsque `showHeader` est activé sans qu'un libellé spécifique ne soit fourni. */\n  @Input() labelHeaderDestinationList?: string;\n\n  /** Placeholder pour le champ de recherche */\n  @Input() searchMessage?: string;\n\n  /** Message d'accessibilité vocalisé lorsqu'il n'y a aucun résultat. */\n  @Input() noResultsMessage?: string;\n\n  /** Afficher un état de chargement */\n  @Input() loading = false;\n\n  /** Activer le virtual scroll  */\n  @Input({ transform: booleanAttribute }) virtualScroll: boolean = false;\n\n  /** Surcharger la hauteur d'un item dans le cas du virtual scroll. Par défaut 32px. */\n  @Input() virtualScrollItemHeight: number = 32;\n\n  /**\n   * Cache le label visuellement en le laissant disponible aux lecteurs d'écran.\n   */\n  @Input() labelSrOnly = false;\n\n  /** 👓 Correspond à l'attribut `aria-label` du composant */\n  @Input() ariaLabel?: string;\n\n  /** 👓 Correspond à l'attribut `aria-describedby` du composant  */\n  @Input() ariaDescribedby?: string;\n\n  /** 👓 Correspond à l'attribut `aria-label` de la liste d'éléments source */\n  @Input() ariaLabelSourceList?: string;\n\n  /** 👓 Correspond à l'attribut `aria-label` de la liste d'élements destinataire */\n  @Input() ariaLabelDestinationList?: string;\n\n  /** Liste d'options sélectionnée modifiée */\n  @Output() selectionChange = new EventEmitter<any[] | undefined>();\n\n  /**\n   * Message d'information lié au composant.\n   */\n  message = input<string>();\n\n  /**\n   * Représente la sévérité du message.\n   */\n  messageSeverity = input<DsfrSeverity>();\n\n  /** Attribut aria-describedby référençant une description supplémentaire optionnelle */\n  ariaDescribedBy = input<string>();\n\n  /** @internal */\n  combinedAriaDescribedBy = computed<string | null>(() => {\n    const ariaDescribedBy = this.ariaDescribedBy();\n    const ids: string[] = [];\n\n    if (ariaDescribedBy) ids.push(ariaDescribedBy);\n    ids.push(this.messagesGroupId); // toujours présent meme si aucun message\n\n    return ids.length ? ids.join(' ') : null;\n  });\n\n  /** Mode : picklist ou dual list */\n  mode = input<ModeValue>(ModeValue.PICK_LIST);\n\n  /** Hauteur avant le scroll sur la liste déroulante. */\n  scrollHeight = input<string>();\n\n  /** @internal */\n  protected messagesGroupId: string = newUniqueId();\n\n  protected leftOptions: WritableSignal<SelectOptionViewModel[]> = signal([]);\n  protected rightOptions: WritableSignal<SelectOptionViewModel[]> = signal([]);\n\n  protected _options: SelectOptionViewModel[] = [];\n  protected _scrollHeight = linkedSignal(() => this.scrollHeight());\n\n  /** compareWith reprise de l'implémentation angular SelectControlValueAccessor */\n  protected compareWithFn: (o1: any, o2: any) => boolean = Object.is;\n\n  protected cd = inject(ChangeDetectorRef);\n\n  protected leftSelected: WritableSignal<any[] | undefined> = signal([]);\n  protected rightSelected: WritableSignal<any[] | undefined> = signal([]);\n\n  private optionsViewModel: WritableSignal<OptionsViewModel[]> = signal([]);\n\n  private rightFlatten = computed(() => this.pickListUnitRight?.optionsFlatten() ?? []);\n\n  private i18n = inject(DsfrI18nService);\n\n  private filteredLists: { left: DsfrSelectOption[] | undefined; right: DsfrSelectOption[] | undefined } = {\n    left: undefined,\n    right: undefined,\n  };\n\n  constructor() {\n    super();\n\n    this.i18n.extendsLabelsBundle(Language.EN, MULTISELECT_MESSAGES_EN);\n    this.i18n.extendsLabelsBundle(Language.FR, MULTISELECT_MESSAGES_FR);\n\n    this.i18n.extendsLabelsBundle(Language.EN, MESSAGES_EN);\n    this.i18n.extendsLabelsBundle(Language.FR, MESSAGES_FR);\n\n    afterNextRender(() => {\n      if (!this._scrollHeight()) {\n        const getListboxHeight = (unit: DsfrPickListUnitComponent) =>\n          unit.listOptionsComponent?.listbox?.nativeElement.offsetHeight;\n\n        this._scrollHeight.set(\n          `${Math.max(getListboxHeight(this.pickListUnitLeft), getListboxHeight(this.pickListUnitRight))}px`,\n        );\n      }\n    });\n  }\n\n  /** @internal */\n  get options() {\n    return this._options;\n  }\n\n  /** @internal */\n  get labelHeaderLeftInternal() {\n    if (!this.showHeader && !this.labelHeaderSourceList) return undefined;\n    return (\n      this.labelHeaderSourceList ||\n      (this.isDualListMode() ? this.i18n.t('pickList.elementsToAdd') : this.i18n.t('pickList.availableElements'))\n    );\n  }\n\n  /** @internal */\n  get labelHeaderRightInternal() {\n    if (!this.showHeader && !this.labelHeaderDestinationList) return undefined;\n    return (\n      this.labelHeaderDestinationList ||\n      (this.isDualListMode() ? this.i18n.t('pickList.elementsAlreadyAdded') : this.i18n.t('pickList.selectedElements'))\n    );\n  }\n\n  /** @internal */\n  get ariaLabelListLeft() {\n    return this.ariaLabelSourceList ?? this.i18n.t('pickList.listOfSourceElements');\n  }\n\n  /** @internal */\n  get ariaLabelListRight() {\n    return this.ariaLabelDestinationList ?? this.i18n.t('pickList.listOfDestinationElements');\n  }\n\n  /** Personnalisation de la comparaison. Fonction à 2 arguments: val1 et val2 (les values des deux options).\n  Si compareWith est fourni, sélection de l'option selon le retour de la fonction.*/\n  @Input()\n  set compareWith(fn: (v1: any, v2: any) => boolean) {\n    if (typeof fn !== 'function') {\n      throw Error('`compareWith` must be a function.');\n    }\n    this.compareWithFn = fn;\n  }\n\n  /** Liste des options disponibles. */\n  @Input()\n  set options(val: any[]) {\n    this._options = val?.map((o) => OptionUtils.initSelectedState(o)) ?? [];\n    this.optionsViewModel.set(OptionUtils.flattenOptions(this._options));\n\n    this.leftSelected.set([]);\n    this.rightSelected.set([]);\n\n    if (this.value && this.value.length > 0) {\n      this.writeValue(this.value);\n    } else {\n      this.leftOptions.set(this._options);\n    }\n  }\n\n  /** Personnalisation de la fonction de recherche pour filtrer les options. Fonction à 2 arguments : option (DsfrSelectOption) et texte cherché (string) */\n  @Input()\n  set searchFn(fn: (o: DsfrOption, text: string) => boolean) {\n    if (typeof fn !== 'function') {\n      throw Error('`searchFn` must be a function.');\n    }\n    this.searchFunction = fn;\n  }\n\n  public ngOnInit(): void {\n    this.pickListId ??= newUniqueId();\n  }\n\n  /** @internal */\n  public override setDisabledState(isDisabled: boolean) {\n    this.disabled = isDisabled;\n    this.cd.markForCheck();\n  }\n\n  /** @internal */\n  public override writeValue(value: any[]): void {\n    this._options = this._options?.map((o) => OptionUtils.initSelectedState(o)) ?? [];\n\n    if (!this._options?.length) {\n      super.writeValue(value);\n      return;\n    }\n    this.leftOptions.set(this._options);\n    this.setNewValuesRightSide(Array.isArray(value) ? value : [], false);\n\n    this.leftSelected.set([]);\n    this.rightSelected.set([]);\n\n    super.writeValue(value);\n    this.cd.markForCheck();\n  }\n\n  /** Indique si le mode est dual list, ou pick list */\n  protected isDualListMode(): boolean {\n    return this.mode() === ModeValue.DUAL_LIST;\n  }\n\n  /** Fonction de recherche par défaut */\n  protected searchFunction: (o: DsfrOption, searchText: string) => boolean = function (o, searchText) {\n    return o.label?.toLowerCase().includes(searchText.toLowerCase());\n  };\n\n  /** Enregistre les changements des options affichées après un filtrage d'une picklist-unit */\n  protected handleFilterChange(filterChange: DsfrFilterChange): void {\n    this.filteredLists[filterChange.listPosition] = filterChange.filteredOptions;\n  }\n\n  /**\n   * Déplacement de l'ensemble des élements de gauche vers la droite\n   * Les options désactivées ne doivent pas bouger\n   */\n  protected moveAllToRight(): void {\n    let newRightSideValues: OptionsViewModel[] = [];\n\n    if (this.filteredLists.left !== undefined) {\n      newRightSideValues = this.moveAllFilteredToRight(this.filteredLists.left);\n    } else {\n      const flatOptionsToAdd = OptionUtils.flattenLeavesNotDisabled(OptionUtils.flattenOptions(this._options));\n      const optionsDisabledOnRightToKeep = OptionUtils.flattenLeavesDisabled(this.rightFlatten());\n\n      newRightSideValues = [...flatOptionsToAdd, ...optionsDisabledOnRightToKeep];\n    }\n\n    this.setNewValuesRightSide(newRightSideValues);\n    this.clearOptionsLeftPickListUnit();\n    this.pickListUnitRight.resetSearchInput();\n  }\n\n  /**\n   * Déplacement de l'ensemble des élements de droite vers la gauche\n   * Les options désactivées ne doivent pas bouger\n   */\n  protected moveAllToLeft(): void {\n    let flatOptionsToKeep: OptionsViewModel[] = [];\n\n    if (this.filteredLists.right !== undefined) {\n      flatOptionsToKeep = this.moveAllFilteredToLeft(this.filteredLists.right);\n    } else {\n      flatOptionsToKeep = OptionUtils.flattenLeavesDisabled(this.rightFlatten());\n    }\n\n    this.setNewValuesRightSide(flatOptionsToKeep);\n    this.clearOptionsRightPickListUnit();\n    this.pickListUnitLeft.resetSearchInput();\n  }\n\n  /** Déplacement des éléments sélectionnés de gauche : de la gauche vers la droite */\n  protected moveToRight(): void {\n    if (!this._options || !this.leftSelected()?.length) return;\n\n    // valeurs à déplacer\n    const currentRightValues = OptionUtils.flattenLeaves(this.rightFlatten());\n    const newRightValues = [\n      ...currentRightValues,\n      ...(this.leftSelected() ?? []).filter((v) => !currentRightValues.includes(v)),\n    ];\n\n    this.setNewValuesRightSide(newRightValues);\n    this.clearOptionsLeftPickListUnit();\n    this.pickListUnitRight.resetSearchInput();\n  }\n\n  /** Déplacement des éléments sélectionnés de droite : de la droite vers la gauche */\n  protected moveToLeft(): void {\n    if (!this._options || !this.rightSelected()?.length) return;\n\n    // valeurs à déplacer\n    const currentRightValues = OptionUtils.flattenLeaves(this.rightFlatten());\n    const newRightValues = currentRightValues.filter((v) => !(this.rightSelected() ?? []).includes(v));\n\n    this.setNewValuesRightSide(newRightValues);\n    this.clearOptionsRightPickListUnit();\n    this.pickListUnitLeft.resetSearchInput();\n  }\n\n  protected setNewValuesRightSide(newRightsValues: any[], shouldUpdateValue: boolean = true): void {\n    this.fnOnTouched(); // rendre le form on touched lorsque l'utilisateur appuie sur l'un des boutons d'ajout (sans passer par le pick-list-unit)\n\n    if (this.isDualListMode()) {\n      // reconstruire le ViewModel gauche et l'arbre de gauche\n      this.leftOptions.set(this.removeValuesFromAllVm(newRightsValues));\n    }\n\n    // reconstruire le ViewModel droit et l'arbre de droite\n    this.rightOptions.set(this.filterAllVm(newRightsValues));\n\n    if (shouldUpdateValue) {\n      // valeur finale\n      this.updateValue(newRightsValues);\n      this.cd.markForCheck();\n    }\n  }\n\n  /** Mise à jour de la sélection de gauche */\n  protected onLeftSelectionChange(selection: DsfrSelectOption[] | undefined): void {\n    this.leftSelected.set(selection);\n    this.fnOnTouched();\n  }\n\n  /** Mise à jour de la sélection de droite */\n  protected onRightSelectionChange(selection: DsfrSelectOption[] | undefined): void {\n    this.rightSelected.set(selection);\n    this.fnOnTouched();\n  }\n\n  protected clearOptionsRightPickListUnit() {\n    this.pickListUnitRight.clearAllOptions();\n  }\n\n  protected clearOptionsLeftPickListUnit() {\n    this.pickListUnitLeft.clearAllOptions();\n  }\n\n  /** Supprime certaines valeurs du modèle complet et reconstruit l'arbre.\n   *\n   * @param valuesToRemove - Liste des valeurs à retirer du modèle complet.\n   * @returns Un tableau représentant le modèle après suppression.\n   *\n   */\n  private removeValuesFromAllVm(valuesToRemove: any[]): SelectOptionViewModel[] {\n    const sideFlatten = OptionUtils.removeFlattenOptions(this.optionsViewModel(), valuesToRemove, this.compareWithFn);\n    const sideOptions = OptionUtils.rebuildTreeFromViewModel(sideFlatten);\n    return sideOptions;\n  }\n\n  /** Filtre le modèle complet pour ne conserver que certaines valeurs,\n   * en incluant leurs groupes parents si nécessaire, puis reconstruit l'arbre.\n   *\n   * @param valuesToKeep - Liste des valeurs à conserver.\n   * @returns Un tableau représentant le modèle filtré.\n   *\n   */\n  private filterAllVm(valuesToKeep: any[]): SelectOptionViewModel[] {\n    const sideFlatten = OptionUtils.filterWithGroups(this.optionsViewModel(), valuesToKeep, this.compareWithFn);\n    const sideOptions = OptionUtils.rebuildTreeFromViewModel(sideFlatten);\n    return sideOptions;\n  }\n\n  /** Met à jour la valeur finale du composant */\n  private updateValue(newRightsValues: any[]): void {\n    this.value = newRightsValues;\n    this.selectionChange.emit(this.value);\n  }\n\n  private moveAllFilteredToRight(options: DsfrSelectOption[]): OptionsViewModel[] {\n    const selectOptions = options.map((option) => OptionUtils.initSelectedState(option));\n    const currentRightValues = OptionUtils.flattenLeaves(this.rightFlatten());\n    const flattenedOptionsLeft = OptionUtils.flattenOptions(selectOptions);\n    const newFlattenedLeaves = OptionUtils.flattenLeavesNotDisabled(flattenedOptionsLeft);\n\n    const rightValuesAfter = [\n      ...currentRightValues,\n      ...newFlattenedLeaves.filter((leave) => !currentRightValues.includes(leave)),\n    ];\n\n    return rightValuesAfter;\n  }\n\n  private moveAllFilteredToLeft(options: DsfrSelectOption[]): OptionsViewModel[] {\n    const selectOptions = options.map((option) => OptionUtils.initSelectedState(option));\n    const flattenedOptionsLeft = OptionUtils.flattenOptions(selectOptions);\n    const newLeftFlattenedLeaves = OptionUtils.flattenLeavesNotDisabled(flattenedOptionsLeft);\n    const currentRightValues = OptionUtils.flattenLeaves(this.rightFlatten());\n    const newRightValues = currentRightValues.filter((v) => !newLeftFlattenedLeaves.includes(v));\n\n    return newRightValues;\n  }\n}\n","<div\n  class=\"fr-select-group dsfrx-select\"\n  [class]=\"message() ? 'fr-select-group--' + (messageSeverity() === 'success' ? 'valid' : messageSeverity()) : ''\"\n  [ngClass]=\"{\n    'fr-select-group--disabled': disabled,\n  }\">\n  <div\n    class=\"fr-label\"\n    [class]=\"message() ? 'fr-label--' + messageSeverity() : ''\"\n    [ngClass]=\"{ 'fr-sr-only': labelSrOnly }\"\n    id=\"{{ pickListId }}-label\">\n    @if (label) {\n      {{ label }}\n    } @else {\n      <ng-content select=\"[label]\"></ng-content>\n    }\n    @if (hint) {\n      <span class=\"fr-hint-text\">{{ hint }}</span>\n    }\n  </div>\n\n  <div\n    class=\"dsfrx-picklist\"\n    role=\"group\"\n    [attr.aria-label]=\"ariaLabel || null\"\n    [attr.aria-labelledby]=\"ariaLabel ? null : pickListId + '-label'\"\n    [attr.aria-describedby]=\"combinedAriaDescribedBy()\"\n    [class.dsfrx-picklist--dual-list]=\"isDualListMode()\"\n    [class.dsfrx-picklist--picklist]=\"!isDualListMode()\">\n    <div class=\"dsfrx-picklist__content\">\n      <div class=\"dsfrx-picklist__unit\">\n        <edu-picklist-unit\n          #pickListUnitLeft\n          [noResultsMessage]=\"noResultsMessage\"\n          [optionTemplateUnit]=\"optionTemplate\"\n          [labelHeader]=\"labelHeaderLeftInternal\"\n          [ariaLabelList]=\"ariaLabelListLeft\"\n          [compareWith]=\"compareWithFn\"\n          [options]=\"leftOptions()\"\n          [disabled]=\"disabled\"\n          [virtualScroll]=\"virtualScroll\"\n          [showGroupSelection]=\"showGroupSelection\"\n          [showSelectAll]=\"showSelectAll\"\n          [searchMessage]=\"searchMessage\"\n          [pickListUnitId]=\"pickListId + '-left-unit'\"\n          [scrollHeight]=\"_scrollHeight()\"\n          [showSearch]=\"showSearch\"\n          [showClearSearch]=\"showClearSearch\"\n          [searchFn]=\"searchFunction\"\n          listPosition=\"left\"\n          (selectionChange)=\"onLeftSelectionChange($event)\"\n          (filterChange)=\"handleFilterChange($event)\"\n          (touched)=\"fnOnTouched()\"></edu-picklist-unit>\n      </div>\n    </div>\n    <div class=\"dsfrx-picklist__grid-position--left-bottom\">\n      @if (!isDualListMode()) {\n        <div class=\"fr-btn-group dsfrx-picklist-btn-group--picklist\">\n          <button\n            type=\"button\"\n            class=\"dialog-button fr-btn fr-btn--secondary fr-btn--sm\"\n            [ariaLabel]=\"'pickList.addSelectedElements' | dsfrI18n\"\n            [disabled]=\"disabled || !leftSelected()?.length\"\n            (click)=\"moveToRight()\">\n            {{ 'pickList.addSelection' | dsfrI18n }}\n          </button>\n\n          <button\n            type=\"button\"\n            class=\"dialog-button fr-btn fr-btn--secondary fr-btn--sm\"\n            [ariaLabel]=\"'pickList.addAllAvailableElements' | dsfrI18n\"\n            [disabled]=\"disabled || !leftOptions().length\"\n            (click)=\"moveAllToRight()\">\n            {{ 'pickList.addAll' | dsfrI18n }}\n          </button>\n        </div>\n      }\n    </div>\n\n    @if (isDualListMode()) {\n      <div class=\"fr-btn-group dsfrx-picklist-btn-group--dual-list\">\n        <button\n          type=\"button\"\n          class=\"fr-btn fr-icon-arrow-right-s-line-double fr-btn--tertiary\"\n          id=\"{{ pickListId }}-moveAllToRight\"\n          [ariaLabel]=\"'pickList.addAllAvailableElements' | dsfrI18n\"\n          [title]=\"'pickList.addAll' | dsfrI18n\"\n          [disabled]=\"disabled || !leftOptions().length\"\n          (click)=\"moveAllToRight()\"></button>\n\n        <button\n          type=\"button\"\n          class=\"fr-btn fr-icon-arrow-right-s-line fr-btn--tertiary\"\n          id=\"{{ pickListId }}-moveToRight\"\n          [ariaLabel]=\"'pickList.addSelectedElements' | dsfrI18n\"\n          [title]=\"'pickList.addSelection' | dsfrI18n\"\n          [disabled]=\"disabled || !leftSelected()?.length\"\n          (click)=\"moveToRight()\"></button>\n\n        <button\n          type=\"button\"\n          class=\"fr-btn fr-icon-arrow-left-s-line fr-btn--tertiary\"\n          id=\"{{ pickListId }}-moveToLeft\"\n          [ariaLabel]=\"'pickList.removeSelectedElements' | dsfrI18n\"\n          [title]=\"'pickList.removeSelection' | dsfrI18n\"\n          [disabled]=\"disabled || !rightSelected()?.length\"\n          (click)=\"moveToLeft()\"></button>\n\n        <button\n          type=\"button\"\n          class=\"fr-btn fr-icon-arrow-left-s-line-double fr-btn--tertiary\"\n          id=\"{{ pickListId }}-reset\"\n          [ariaLabel]=\"'pickList.removeAllElementsAlreadyAdded' | dsfrI18n\"\n          [title]=\"'pickList.removeAll' | dsfrI18n\"\n          [disabled]=\"disabled || !rightOptions().length\"\n          (click)=\"moveAllToLeft()\"></button>\n      </div>\n    }\n\n    <div class=\"dsfrx-picklist__content dsfrx-picklist__grid-position--right-bottom\">\n      <div class=\"dsfrx-picklist__unit\">\n        <edu-picklist-unit\n          #pickListUnitRight\n          [noResultsMessage]=\"noResultsMessage\"\n          [optionTemplateUnit]=\"optionTemplate\"\n          [labelHeader]=\"labelHeaderRightInternal\"\n          [ariaLabelList]=\"ariaLabelListRight\"\n          [compareWith]=\"compareWithFn\"\n          [options]=\"rightOptions()\"\n          [disabled]=\"disabled\"\n          [virtualScroll]=\"virtualScroll\"\n          [showSelectAll]=\"showSelectAll\"\n          [searchMessage]=\"searchMessage\"\n          [showSearch]=\"showSearch\"\n          [pickListUnitId]=\"pickListId + '-right-unit'\"\n          [scrollHeight]=\"_scrollHeight()\"\n          [showGroupSelection]=\"showGroupSelection\"\n          [showClearSearch]=\"showClearSearch\"\n          [searchFn]=\"searchFunction\"\n          listPosition=\"right\"\n          (selectionChange)=\"onRightSelectionChange($event)\"\n          (filterChange)=\"handleFilterChange($event)\"\n          (touched)=\"fnOnTouched()\"></edu-picklist-unit>\n      </div>\n    </div>\n\n    <div>\n      @if (!isDualListMode()) {\n        <div class=\"fr-btn-group dsfrx-picklist-btn-group--picklist\">\n          <button\n            type=\"button\"\n            class=\"dialog-button fr-btn fr-btn--secondary fr-btn--sm\"\n            [ariaLabel]=\"'pickList.removeSelectedElements' | dsfrI18n\"\n            [disabled]=\"disabled || !rightSelected()?.length\"\n            (click)=\"moveToLeft()\">\n            {{ 'pickList.removeSelection' | dsfrI18n }}\n          </button>\n\n          <button\n            type=\"button\"\n            class=\"dialog-button fr-btn fr-btn--secondary fr-btn--sm\"\n            [ariaLabel]=\"'pickList.removeAllElementsAlreadyAdded' | dsfrI18n\"\n            [disabled]=\"disabled || !rightOptions().length\"\n            (click)=\"moveAllToLeft()\">\n            {{ 'pickList.removeAll' | dsfrI18n }}\n          </button>\n        </div>\n      }\n    </div>\n  </div>\n  <div [id]=\"messagesGroupId\" class=\"fr-messages-group\" aria-live=\"polite\">\n    @if (message()) {\n      <p [eduMessageSeverity]=\"messageSeverity()\">\n        {{ message() }}\n      </p>\n    }\n  </div>\n</div>\n","// Ordre alphabétique requis\nexport const MESSAGES_EN = {\n  progressbar: {\n    defaultMessage: 'Loading. Please wait.',\n  },\n};\n","// Ordre alphabétique requis\nexport const MESSAGES_FR = {\n  progressbar: {\n    defaultMessage: 'Chargement en cours. Veuillez patienter.',\n  },\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnDestroy, ViewEncapsulation, inject } from '@angular/core';\nimport { DsfrI18nPipe, DsfrI18nService, Language, newUniqueId } from '@edugouvfr/ngx-dsfr';\nimport { Subscription } from 'rxjs';\nimport { MESSAGES_EN } from './i18n/messages.en';\nimport { MESSAGES_FR } from './i18n/messages.fr';\n\n@Component({\n  selector: 'dsfr-ext-progressbar, dsfrx-progressbar',\n  templateUrl: './progressbar.component.html',\n  styleUrls: ['./progressbar.component.scss'],\n  encapsulation: ViewEncapsulation.None,\n  imports: [CommonModule, DsfrI18nPipe],\n})\nexport class DsfrProgressBarComponent implements OnDestroy {\n  /**\n   * Label de la barre de progression.\n   */\n  @Input({ required: true }) label!: string;\n\n  /**\n   * Affiche ou masque la valeur de la barre de progression, vrai par défaut.\n   */\n  @Input() showValue = true;\n\n  /**\n   * Affiche ou masque le label de la barre de progression, vrai par défaut.\n   */\n  @Input() showLabel = true;\n\n  /**\n   * Determine la valeur minimale et la valeur maximale de la valeur représentée dans la progress bar.\n   */\n  @Input() range: DsfrProgressBarRange = { min: 0, max: 100 };\n\n  /**\n   * Signe d'unité ajouté à la valeur, '%' par défaut.\n   */\n  @Input() unit = '%';\n\n  /**\n   * Stoppe l'animation de la barre si la valeur de cette dernière est indéterminée.\n   */\n  @Input() stopIndeterminateAnimation = false;\n\n  /**\n   * 👓 Message permettant de contextualiser le processus décrit par la barre de progression en mode \"indéterminé\".\n   *\n   * Valeur par défaut : \"Chargement de l'agenda en cours. Veuillez patienter.\"\n   */\n  @Input() indeterminateContextMessage: string | undefined;\n\n  /**\n   * Id du conteneur\n   * @internal */\n  protected progressbarId: string = newUniqueId();\n\n  /** Id du label\n   * @internal\n   */\n  protected labelId: string = newUniqueId();\n\n  protected barLength: number = 0;\n\n  protected valueText: string | null = null;\n  protected readonly i18n = inject(DsfrI18nService);\n\n  private _value: number | undefined;\n  private subscription = new Subscription();\n\n  constructor() {\n    this.i18n.extendsLabelsBundle(Language.EN, MESSAGES_EN);\n    this.i18n.extendsLabelsBundle(Language.FR, MESSAGES_FR);\n  }\n\n  get indeterminate(): boolean {\n    return this.value === undefined;\n  }\n\n  get value(): number | undefined {\n    return this._value;\n  }\n\n  /**\n   * Valeur actuelle de la progression. La valeur `null` représente une valeur indéterminée.\n   */\n  @Input() set value(value: number | undefined) {\n    if (typeof value !== 'number') {\n      this._value = undefined;\n    } else {\n      this._value = Math.min(Math.max(this.range.min, value), this.range.max);\n    }\n\n    this.computeBarLength();\n    this.computeValueText();\n  }\n\n  ngOnDestroy() {\n    this.subscription.unsubscribe();\n  }\n\n  private computeBarLength(): void {\n    if (this.value !== undefined) {\n      const fullBarLength = this.range.max - this.range.min;\n      this.barLength = Math.round((this.value / fullBarLength) * 100);\n    } else {\n      this.barLength = 25;\n    }\n  }\n\n  private computeValueText(): void {\n    this.valueText = this.value !== null ? `${this.value} ${this.unit}` : null;\n  }\n}\n\nexport interface DsfrProgressBarRange {\n  min: number;\n  max: number;\n}\n","<p [id]=\"labelId\" class=\"fr-label\">{{ label }}</p>\n\n<div\n  role=\"progressbar\"\n  class=\"dsfrx-progressbar\"\n  [id]=\"progressbarId\"\n  [ngClass]=\"{ 'dsfrx-progressbar-indeterminate': indeterminate }\"\n  [attr.aria-labelledby]=\"labelId\"\n  [attr.aria-valuemin]=\"!indeterminate ? range.min : null\"\n  [attr.aria-valuemax]=\"!indeterminate ? range.max : null\"\n  [attr.aria-valuenow]=\"value\"\n  [attr.aria-valuetext]=\"valueText\">\n  <div class=\"dsfrx-progressbar-container\">\n    <div\n      class=\"dsfrx-progressbar-value\"\n      [ngStyle]=\"{ width: barLength + '%' }\"\n      [ngClass]=\"{ 'dsfrx-progressbar-value--stopped-animation': stopIndeterminateAnimation }\">\n      <div class=\"dsfrx-progressbar-label\">&nbsp;</div>\n    </div>\n  </div>\n</div>\n\n@if (indeterminate) {\n  <p class=\"fr-sr-only\">{{ indeterminateContextMessage ?? ('progressbar.defaultMessage' | dsfrI18n) }}</p>\n}\n\n@if (showValue && !indeterminate) {\n  <p class=\"dsfrx-progressbar-label\" aria-hidden=\"true\">{{ value }}&nbsp;{{ unit }}</p>\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, input, Input, ViewEncapsulation } from '@angular/core';\nimport {\n  DsfrBadge,\n  DsfrButtonModule,\n  DsfrButtonsGroupModule,\n  DsfrButtonVariantConst,\n  DsfrCardModule,\n  DsfrHeadingLevel,\n  DsfrModalAction,\n  DsfrPanelDescMarkup,\n} from '@edugouvfr/ngx-dsfr';\n\n//TODO: dans ngx-dsfr, sortir DsfrModalAction pour le partager entre la modale et la timeline (shared_bak + public-api).\nexport interface DsfrTimelineAction extends DsfrModalAction {\n  disabled?: boolean;\n  variant?: DsfrButtonVariantConst;\n}\n\nexport interface DsfrTimelineEvent {\n  heading: string;\n  headingLevel?: DsfrHeadingLevel;\n  description?: string;\n  detailBottom: string;\n  badges?: DsfrBadge[];\n  current: boolean;\n  actions?: DsfrTimelineAction[];\n}\n\nexport enum DsfrTimelineLayout {\n  VERTICAL = 'vertical',\n  HORIZONTAL = 'horizontal',\n}\n\n@Component({\n  selector: 'dsfr-ext-timeline, dsfrx-timeline',\n  templateUrl: './timeline.component.html',\n  styleUrls: ['./timeline.scss'],\n  encapsulation: ViewEncapsulation.None,\n  imports: [DsfrCardModule, DsfrButtonModule, DsfrButtonsGroupModule, CommonModule],\n})\nexport class DsfrTimelineComponent {\n  /**\n   * Liste d'évènements.\n   */\n  @Input() events: DsfrTimelineEvent[] = [];\n\n  /**\n   * Gestion du mode d'affichage : 'vertical' (par défaut) ou 'horizontal'.\n   */\n  @Input() layout: DsfrTimelineLayout = DsfrTimelineLayout.VERTICAL;\n\n  /**\n   * Type de balise HTML pour le conteneur des descriptions. <p> par défaut.\n   */\n  descriptionMarkup = input<DsfrPanelDescMarkup>('p');\n\n  /** @internal */\n  performAction(action: DsfrTimelineAction): void {\n    if (action.callback) {\n      action.callback();\n    }\n  }\n}\n","<div class=\"dsfrx-timeline-container\" [class.dsfrx-timeline-container--horizontal]=\"layout === 'horizontal'\">\n  @for (event of events; track $index) {\n    <div class=\"timeline--bloc\">\n      <dsfr-card\n        [horizontal]=\"layout === 'horizontal' ? true : false\"\n        [heading]=\"event.heading\"\n        [headingLevel]=\"event.headingLevel || ''\"\n        [description]=\"event.description ? event.description : ''\"\n        [badges]=\"event.badges ? event.badges : []\"\n        [descriptionMarkup]=\"descriptionMarkup()\"\n        [hasFooter]=\"true\"\n        [detailBottom]=\"event.detailBottom\"\n        [customBackground]=\"event.current === true ? 'grey' : 'default'\">\n        @if (event.actions && event.actions.length > 0) {\n          <dsfr-buttons-group footer inline=\"always\">\n            @for (action of event.actions; track action.label) {\n              <dsfr-button\n                [label]=\"action.label\"\n                [icon]=\"action?.icon\"\n                [variant]=\"action.variant || 'secondary'\"\n                [disabled]=\"action?.disabled || false\"\n                (click)=\"performAction(action)\"></dsfr-button>\n            }\n          </dsfr-buttons-group>\n        }\n      </dsfr-card>\n    </div>\n  }\n</div>\n","// Ordre alphabétique requis\nexport const MESSAGES_EN = {\n  toast: {\n    close: 'Close',\n  },\n};\n","// Ordre alphabétique requis\nexport const MESSAGES_FR = {\n  toast: {\n    close: 'Fermer',\n  },\n};\n","import { CommonModule } from '@angular/common';\nimport {\n  AfterViewInit,\n  Component,\n  EventEmitter,\n  inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  Output,\n  ViewEncapsulation,\n} from '@angular/core';\nimport {\n  DsfrButtonModule,\n  DsfrI18nPipe,\n  DsfrI18nService,\n  DsfrSeverity,\n  DsfrSeverityConst,\n  Language,\n  newUniqueId,\n} from '@edugouvfr/ngx-dsfr';\nimport { MESSAGES_EN } from '../i18n/messages.en';\nimport { MESSAGES_FR } from '../i18n/messages.fr';\nimport { DsfrToast } from '../toast.model';\n\nexport const DEFAULT_DURATION: number = 5000;\n\n@Component({\n  selector: 'edu-toast-item',\n  templateUrl: './toast-item.component.html',\n  styleUrls: ['./toast-item.component.scss'],\n  encapsulation: ViewEncapsulation.None,\n  imports: [CommonModule, DsfrButtonModule, DsfrI18nPipe],\n})\nexport class ToastItemComponent implements DsfrToast, OnInit, AfterViewInit, OnDestroy {\n  /** Identifiant de la notification. */\n  @Input() toastId?: string;\n\n  /** Titre de la notification. */\n  @Input() heading?: string;\n\n  /** Contenu de la notification. */\n  @Input() content?: string;\n\n  /** Sévérité de la notification (info par défaut). */\n  @Input() severity: DsfrSeverity = 'info';\n\n  /** La durée en ms avant qu'une notification soit fermée. */\n  @Input() duration?: number;\n\n  /**\n   * Notifie la fermeture d'une notification (que la fermeture soit automatique ou manuelle).\n   */\n  @Output() itemClose = new EventEmitter<string>();\n\n  protected headingTemplate: string | undefined;\n  protected contentTemplate: string | undefined;\n  protected readonly severityConst = DsfrSeverityConst;\n\n  private i18n = inject(DsfrI18nService);\n\n  /** Id du timer */\n  private timeoutId: any;\n\n  constructor() {\n    this.i18n.extendsLabelsBundle(Language.EN, MESSAGES_EN);\n    this.i18n.extendsLabelsBundle(Language.FR, MESSAGES_FR);\n  }\n\n  ngOnInit(): void {\n    this.toastId ??= newUniqueId();\n    this.duration ??= DEFAULT_DURATION;\n    this.severity ??= DsfrSeverityConst.INFO;\n  }\n\n  ngAfterViewInit() {\n    this.startTimeout();\n  }\n\n  ngOnDestroy() {\n    this.stopTimeout();\n  }\n\n  /**\n   * Fermeture du toast (suppression)\n   * Informe les observateurs de la fermeture du toast.\n   */\n  protected onClose(): void {\n    this.itemClose.emit(this.toastId);\n  }\n\n  protected onMouseOut(): void {\n    this.startTimeout();\n  }\n\n  protected onMouseOver(): void {\n    this.stopTimeout();\n  }\n\n  protected onTouchEnd(): void {\n    this.startTimeout();\n  }\n\n  protected onTouchStart(): void {\n    this.stopTimeout();\n  }\n\n  protected isError(): boolean {\n    return this.severity === 'error';\n  }\n\n  private startTimeout(): void {\n    this.stopTimeout();\n    this.timeoutId = setTimeout(() => this.onClose(), this.duration);\n  }\n\n  private stopTimeout(): void {\n    if (this.timeoutId) {\n      clearTimeout(this.timeoutId);\n      this.timeoutId = undefined;\n    }\n  }\n}\n","<div\n  [id]=\"toastId\"\n  class=\"dsfrx-toast fr-alert\"\n  [attr.data-delay]=\"duration\"\n  [ngClass]=\"{\n    'fr-alert--info': severity === severityConst.INFO,\n    'fr-alert--success': severity === severityConst.SUCCESS || severity === severityConst.VALID,\n    'fr-alert--warning': severity === severityConst.WARNING,\n    'fr-alert--error': severity === severityConst.ERROR,\n  }\"\n  (mouseover)=\"onMouseOver()\"\n  (mouseout)=\"onMouseOut()\"\n  (touchstart)=\"onTouchStart()\"\n  (touchend)=\"onTouchEnd()\">\n  @if (heading) {\n    <div class=\"toast--header\" [innerHTML]=\"heading\"></div>\n  }\n  @if (content) {\n    <div class=\"toast--content\" [innerHTML]=\"content\"></div>\n  }\n  <!-- élément en aria-hidden car il n'est pas atteignable facilement à la navigation clavier (recommendation Tanaguru) -->\n  <button\n    type=\"button\"\n    class=\"fr-btn fr-btn--close\"\n    [title]=\"'toast.close' | dsfrI18n\"\n    tabindex=\"-1\"\n    aria-hidden=\"true\"\n    (click)=\"onClose()\">\n    <span class=\"fr-sr-only\">{{ 'toast.close' | dsfrI18n }}</span>\n  </button>\n</div>\n","import { DsfrSeverity } from '@edugouvfr/ngx-dsfr';\n\n/**\n * Décrit une notification.\n */\nexport interface DsfrToast {\n  /**\n   * Identifiant unique de la notification (sera généré automatiquement si non valorisé).\n   */\n  toastId?: string;\n  /**\n   *  Titre de la notification dans une balise `div` de style `toast--header`, accepte le format HTML.\n   */\n  heading?: string;\n\n  /**\n   * Contenu de la notification dans une balise `div` de style `toast--content`, accepte le format HTML.\n   */\n  content?: string;\n\n  /**\n   *  Sévérité du toast ('info' par défaut).\n   */\n  severity?: DsfrSeverity;\n\n  /**\n   * Permet d'individualiser la durée d'affichage de cette notification (5000ms par défaut).\n   */\n  duration?: number;\n}\n\n/**\n * Définit les positions utilisables pour l'apparition des toasts.\n */\nexport enum DsfrToastPositionConst {\n  CENTER = 'center',\n  TOP_LEFT = 'top-left',\n  TOP_CENTER = 'top-center',\n  TOP_RIGHT = 'top-right',\n  BOTTOM_LEFT = 'bottom-left',\n  BOTTOM_CENTER = 'bottom-center',\n  BOTTOM_RIGHT = 'bottom-right',\n}\n\n/**\n * Type union correspondant aux valeurs de l'enum {@link DsfrToastPositionConst}.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button\n */\nexport type DsfrToastPosition = `${DsfrToastPositionConst}`;\n","import { Injectable } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { DsfrToast } from './toast.model';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class DsfrToastService {\n  private _toast: Subject<DsfrToast> = new Subject();\n\n  constructor() {}\n\n  /** Affiche la nouvelle notification. */\n  show(toast: DsfrToast): void {\n    this._toast.next(toast);\n  }\n\n  toasts(): Observable<DsfrToast> {\n    return this._toast;\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n  AfterViewInit,\n  Component,\n  EventEmitter,\n  Input,\n  OnDestroy,\n  Output,\n  ViewEncapsulation,\n  inject,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { DEFAULT_DURATION, ToastItemComponent } from './item/toast-item.component';\nimport { DsfrToast, DsfrToastPosition, DsfrToastPositionConst } from './toast.model';\nimport { DsfrToastService } from './toast.service';\n\nexport const DEFAULT_POSITION = DsfrToastPositionConst.BOTTOM_CENTER;\n\n@Component({\n  selector: 'dsfr-ext-toaster, dsfrx-toaster',\n  templateUrl: './toast.component.html',\n  styleUrls: ['./toast.component.scss'],\n  encapsulation: ViewEncapsulation.None,\n  imports: [CommonModule, ToastItemComponent],\n})\nexport class DsfrToastComponent implements AfterViewInit, OnDestroy {\n  /**\n   * La durée d'affichage en ms des notifications avant fermeture.\n   *\n   * Chaque notification peut recevoir elle même une durée d'affichage spécifique\n   * à l'appel de la méthode show du ToastService.\n   *\n   * Valeur par défaut: 5000 ms.\n   */\n  @Input() duration: number = DEFAULT_DURATION;\n\n  /**\n   * Position par défaut des notifications.\n   *\n   * Valeur par défaut: 'bottom-center'.\n   */\n  @Input() position: DsfrToastPosition = DEFAULT_POSITION;\n\n  /**\n   * Propriété z-index du toaster.\n   *\n   * Le toaster crée un nouveau contexte d'empilement qui peut nécessiter des\n   * ajustement en fonction des autres composants du contexte cible.\n   *\n   * Valeur par défaut: 2500\n   */\n  @Input() zIndex: number = 2500;\n\n  /**\n   * Notifie la fermeture d'une notification.\n   */\n  @Output() itemClose = new EventEmitter<DsfrToast>();\n\n  /**\n   * Liste des toasts.\n   */\n  protected toasts = new Array<DsfrToast>();\n\n  protected bottomPositions = [\n    DsfrToastPositionConst.BOTTOM_CENTER.toString(),\n    DsfrToastPositionConst.BOTTOM_LEFT.toString(),\n    DsfrToastPositionConst.BOTTOM_RIGHT.toString(),\n    DsfrToastPositionConst.CENTER.toString(),\n  ];\n\n  private subscription = new Subscription();\n  private readonly toastService = inject(DsfrToastService);\n\n  /** @internal */\n  ngAfterViewInit(): void {\n    const toast$ = this.toastService.toasts().subscribe((toast) => {\n      this.add(toast);\n    });\n\n    this.subscription.add(toast$);\n  }\n\n  /** @internal */\n  ngOnDestroy(): void {\n    this.subscription.unsubscribe();\n  }\n\n  protected add(toast: DsfrToast): void {\n    this.toasts.unshift(toast);\n  }\n\n  protected onToastClose(toast: DsfrToast) {\n    const index = this.toasts.indexOf(toast);\n    this.toasts.splice(index, 1);\n    this.itemClose.emit(toast);\n  }\n}\n","<div class=\"dsfrx-toast-container\" role=\"status\" [class]=\"position\" [ngStyle]=\"{ 'z-index': zIndex }\">\n  @for (toast of toasts; track toast) {\n    @if (bottomPositions.includes(position)) {\n      <div class=\"edu-slide-from-bottom\">\n        <ng-container [ngTemplateOutlet]=\"toastTemplate\" [ngTemplateOutletContext]=\"{ toast: toast }\"></ng-container>\n      </div>\n    } @else {\n      <div class=\"edu-slide-from-top\">\n        <ng-container [ngTemplateOutlet]=\"toastTemplate\" [ngTemplateOutletContext]=\"{ toast: toast }\"></ng-container>\n      </div>\n    }\n  }\n</div>\n\n<ng-template #toastTemplate let-toast=\"toast\">\n  <edu-toast-item\n    [toastId]=\"toast.toastId\"\n    [heading]=\"toast.heading\"\n    [content]=\"toast.content\"\n    [severity]=\"toast.severity ?? 'info'\"\n    [duration]=\"toast.duration ?? duration\"\n    (itemClose)=\"onToastClose(toast)\"></edu-toast-item>\n</ng-template>\n","import { signal, WritableSignal } from '@angular/core';\n\n/**\n * Description d'un item, nœud, d'un arbre.\n */\nexport interface DsfrNode {\n  /**\n   * Identifiant unique de l'élément. Obligatoire pour la mise à jour du contenu de l'arbre\n   */\n  id?: string;\n\n  /** Ouvert ou non à l'initialisation, `false` par défaut  */\n  expanded?: boolean;\n\n  /** Icône du nœud de l'arbre, préfix `fr-icon-` */\n  icon?: string;\n\n  /** Libellé du nœud de l'arbre, obligatoire. */\n  label: string;\n\n  /** Sélection du nœud désactivée */\n  disabled?: boolean;\n\n  /** Nœud sélectionné à l'initialisation, `false` par défaut. */\n  selected?: boolean;\n\n  /** Indique si le noeud doit être masqué, utilisé pour filtrer le contenu de l'arbre. */\n  hidden?: boolean;\n\n  /** Données associées, à disposition de l'utilisateur. */\n  data?: any;\n\n  /** Arborescences imbriquées, `undefined` par défaut. */\n  children?: DsfrNode[];\n}\n\n/**\n * Classe d'un noeud interne implémentant DsfrNode utilisé pour la visualisation.\n */\nexport class DsfrViewNode implements DsfrNode {\n  // DsfrNode ------------------------\n  id?: string;\n  readonly expanded?: boolean | undefined;\n  readonly selected?: boolean | undefined;\n\n  icon?: string;\n  label: string = '';\n  disabled?: boolean;\n  hidden?: boolean;\n  data?: any;\n  children?: DsfrViewNode[];\n  // --------------------------------------\n\n  /** Etat courant de l'état étendu / plié, initialisé à false dans le cas d'un noeud parent */\n  isExpanded: WritableSignal<boolean> = signal(false);\n\n  /** Etat courant de l'état sélectionné (coché / décoché / indéterminé), initialisé à undefinde */\n  isSelected: WritableSignal<boolean | undefined> = signal(undefined);\n\n  /** Attribut a11y. Niveau hiérarchique  */\n  ariaLevel: number = 1;\n\n  /** Attribut a11y. Nombre d'éléments dans le niveau */\n  ariaSize: number = 0;\n\n  /** Attribut a11y. Index de l'élément dans le niveau */\n  ariaPosinset: number = 0;\n}\n\n/**\n * Actions d'une arborescence\n */\nexport interface DsfrTree {\n  /** Mise a jour du contenu de l'arbre. Conserve l'état (nœuds étendus et sélectionnés) si l'id des nœuds est renseigné. */\n  updateContent(): void;\n\n  /**\n   * Ouvre tous les nœuds de l'arborescence.\n   */\n  expandAll(): void;\n\n  /**\n   * Ferme tous les nœuds de l'arborescence.\n   */\n  collapseAll(): void;\n\n  /**\n   * Sélectionne / désélectionne tous les nœuds en mode multiple ou checkbox\n   */\n  selectAll(selected: boolean): void;\n\n  /**\n   * Réinitialise l'état de l'arbre (nœuds étendus et sélectionnés)\n   */\n  reinitializeState(): void;\n}\n","import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';\nimport { WritableSignal } from '@angular/core';\nimport { DsfrNode, DsfrViewNode } from './tree.model';\n\n/**\n * Interface utilisée par TreeFocusManager\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport interface TreeFocusable {\n  /** Identifiant du noeud possédant le focus courant */\n  focusedNodeId: WritableSignal<string | undefined>;\n\n  /** Retourne la structure arborescente du composant. */\n  get nodes(): DsfrNode[];\n\n  /** Ouvre tous les nœuds de l'arborescence. */\n  expandAll(): void;\n\n  /** Etendre les noeuds de l'arborescence jusqu'au niveau précisé */\n  expandLevel(level: number): void;\n\n  /** Ferme tous les nœuds de l'arborescence. */\n  collapseAll(): void;\n\n  /** Effectue l'action par défaut (sélection / déselection) sur le nœud courant. */\n  doNodeDefaultAction(node: DsfrNode, event: Event): void;\n\n  /** Recherche la liste des nœuds visibles, ce sont les éléments qui posséderont le tabindex */\n  findVisibleNodesElt(): HTMLElement[];\n\n  /** Retourne l'élément avec focus ou undefined. */\n  findFocusElement(): HTMLElement | undefined;\n}\n\n/**\n * TreeFocusManager a pour objectif de :\n * - Gérer le focus dans un arbre lié aux événements clavier de navigation,\n * - Gérer l'ouverture la fermeture des nœuds\n */\nexport class TreeFocusManager {\n  currentElt: HTMLElement | undefined;\n\n  /** Composant géré par le manager. */\n  private treeFocusable: TreeFocusable;\n\n  constructor(treeFocusable: TreeFocusable) {\n    this.treeFocusable = treeFocusable;\n  }\n\n  /**\n   * Initialise le tabindex du 1er élément sur lequel placer un focus :\n   * - le 1er élément sélectionné (noeud feuille) si il est visible\n   * - ou le 1er element de la liste sinon (pas de sélection ou pas visible)\n   * Remise des autres tabindex à -1\n   * @returns id de l'element qui doit prendre le focus\n   */\n  public initTabindex(): string | undefined {\n    const elements = this.treeFocusable.findVisibleNodesElt();\n    if (!elements || elements.length === 0) return undefined;\n\n    let elementToFocus: HTMLElement | undefined;\n\n    for (const el of elements) {\n      el.tabIndex = -1;\n      if (!elementToFocus && el.getAttribute('aria-selected') === 'true' && !el.getAttribute('aria-expanded')) {\n        elementToFocus = el;\n      }\n    }\n\n    if (!elementToFocus) {\n      elementToFocus = elements[0];\n    }\n\n    this.currentElt = elementToFocus;\n    elementToFocus.tabIndex = 0;\n    this.setAriaActiveDescendant(elementToFocus);\n\n    return this.getIdCurrentElement();\n  }\n\n  /**\n   * Ouvre / ferme récursivement tous les nœuds nodes et leurs descendants\n   * Retourne une nouvelle structure immuable.\n   * @param nodes Liste de nœuds à ouvrir\n   * @param expand true : ouverture des nœuds, false : fermeture\n   * @param level optionnel, niveau hiérarchique max. à déplier\n   * @returns Nouvelle liste de nœuds avec propriété `expanded` mise à jour\n   */\n  public expandNodesRecursive(nodes: DsfrViewNode[], isExpand: boolean, level?: number): DsfrViewNode[] {\n    return nodes.map((n) => {\n      const shouldExpand = !level || n.ariaLevel <= level;\n      n.isExpanded.set(shouldExpand ? isExpand : false);\n\n      return {\n        ...n,\n        children: n.children ? this.expandNodesRecursive(n.children, isExpand, level) : undefined,\n      };\n    });\n  }\n\n  /**\n   * Répond à un événement clavier.\n   * @param currentNode nœud courant (qui possède le focus)\n   * @event event événement clavier\n   */\n  public doKeyEvent(\n    currentNode: DsfrViewNode,\n    event: KeyboardEvent,\n    isParentSelectable: boolean,\n    ignoreArrows?: boolean,\n  ): string | undefined {\n    switch (event.code) {\n      case 'Space':\n      case 'Enter':\n        if (!currentNode.disabled && (!currentNode.children || isParentSelectable))\n          this.treeFocusable.doNodeDefaultAction(currentNode, event);\n        break;\n\n      case 'ArrowLeft':\n        if (ignoreArrows) return;\n        this.doCollapseNode(currentNode);\n        break;\n\n      case 'ArrowRight':\n        if (ignoreArrows) return;\n        this.doExpandNode(currentNode);\n        break;\n\n      case 'ArrowDown':\n        if (ignoreArrows) return;\n        this.doFocusNext(currentNode);\n        break;\n\n      case 'ArrowUp':\n        if (ignoreArrows) return;\n        this.doFocusPrevious(currentNode);\n        break;\n\n      case 'Home':\n        this.doFocusFirst();\n        break;\n\n      case 'End':\n        this.doFocusLast();\n        break;\n\n      default:\n        return; // no prevent Default on others cases\n    }\n\n    event.preventDefault();\n    event.stopPropagation();\n\n    return this.getIdCurrentElement();\n  }\n\n  /** Bascule l'état ouvert / fermé du nœud. */\n  doToggleExpand(node: DsfrViewNode) {\n    node.isExpanded.update((state) => !state);\n  }\n\n  /**\n   * Gestion du scroll dans la liste lors de la navigation clavier avec virtualScroll activé\n   * @param viewport composant de virtualScroll CDK\n   */\n  public scrollForVirtualScroll(viewport: CdkVirtualScrollViewport): void {\n    const prevOffset = this.currentElt?.offsetTop ?? 0;\n\n    if (!this.currentElt?.offsetTop || prevOffset > this.currentElt?.offsetTop) {\n      viewport.scrollToOffset(prevOffset);\n    } else {\n      this.currentElt?.scrollIntoView({ behavior: 'smooth', block: 'center' });\n    }\n\n    this.currentElt = this.treeFocusable.findFocusElement();\n    this.currentElt?.focus();\n  }\n\n  /**\n   * Liste a plat des noeuds visibles\n   * @param nodes DsfrViewNode[] hiérarchisé\n   * @returns DsfrViewNode[]\n   */\n  public flattenTreeVisibleNodes(nodes: DsfrViewNode[]): DsfrViewNode[] {\n    const flattenTree: DsfrViewNode[] = [];\n\n    const build = (list: DsfrViewNode[]) => {\n      for (const node of list) {\n        flattenTree.push(node);\n\n        if (node.isExpanded() && node.children?.length) {\n          build(node.children);\n        }\n      }\n    };\n\n    build(nodes);\n\n    return flattenTree;\n  }\n\n  /** Place le focus sur le 1er élément visible. */\n  private doFocusFirst(): void {\n    const elements = this.treeFocusable.findVisibleNodesElt();\n    const count = elements.length;\n    if (count > 0) {\n      this.applyFocus(elements[0]);\n    }\n  }\n\n  private getIdCurrentElement(): string | undefined {\n    return this.currentElt?.dataset['id'];\n  }\n\n  /** Place le focus sur le dernier élément visible. */\n  private doFocusLast(): void {\n    const elements = this.treeFocusable.findVisibleNodesElt();\n    const count = elements.length;\n    if (count > 0) {\n      this.applyFocus(elements[count - 1]);\n    }\n  }\n\n  /** Place le focus sur l'élément suivant l'élément courant. */\n  private doFocusNext(currentNode: DsfrNode) {\n    this.moveFocus(currentNode, 1);\n  }\n\n  /** Place le focus sur l'élément précédant le nœud courant. */\n  private doFocusPrevious(currentNode: DsfrNode): void {\n    this.moveFocus(currentNode, -1);\n  }\n\n  /** Place le focus sur l'élément suivant ou précedent selon la direction (+1, -1) */\n  private moveFocus(currentNode: DsfrNode, direction: number): void {\n    const elements = this.treeFocusable.findVisibleNodesElt();\n    if (!elements.length) return;\n\n    const currentIndex = elements.findIndex((e: HTMLElement) => e.dataset['id'] === currentNode.id);\n    if (currentIndex === -1) return;\n\n    let targetIndex = currentIndex + direction;\n\n    // Si on est déjà sur le dernier ou premier élément, on y reste\n    if (targetIndex < 0 || targetIndex >= elements.length) {\n      targetIndex = currentIndex;\n    }\n\n    if (targetIndex !== currentIndex) {\n      this.applyFocus(elements[targetIndex]);\n    }\n  }\n\n  private applyFocus(targetElement: HTMLElement) {\n    this.currentElt = targetElement;\n    this.currentElt.focus();\n\n    this.setAriaActiveDescendant(this.currentElt);\n  }\n\n  /** Ferme le nœud. */\n  private doCollapseNode(node: DsfrViewNode): void {\n    node.isExpanded.set(false);\n  }\n\n  /** Ouvre le nœud. */\n  private doExpandNode(node: DsfrViewNode): void {\n    node.isExpanded.set(true);\n  }\n\n  /** Set focus on element and add aria-activedescendant attribute to parent */\n  private setAriaActiveDescendant(optionEl: HTMLElement): void {\n    const optionId: string | undefined | null = optionEl.getAttribute('id');\n    if (optionId) optionEl.closest('ul')?.setAttribute('aria-activedescendant', optionId);\n  }\n}\n","import { signal, WritableSignal } from '@angular/core';\nimport { newUniqueId } from '@edugouvfr/ngx-dsfr';\nimport { DsfrSelectionMode, DsfrSelectionModeConst } from '../../models/selection-mode.type';\nimport { DsfrNode, DsfrViewNode } from './tree.model';\n\n/**\n * Interface utilisée par TreeSelectManager\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport interface TreeSelectable {\n  /** Indique si toutes les options sont sélectionnées ou non. */\n  isAllSelected: WritableSignal<boolean>;\n\n  /** Retourne la structure arborescente du composant.  */\n  get nodes(): DsfrViewNode[];\n\n  /** Sélectionne / désélectionne tous les nœuds en mode multiple ou checkbox. */\n  selectAll(select: boolean): void;\n\n  /** Notifie le composant que node a changé d'état. */\n  notifySelectEvent(node: DsfrNode): void;\n\n  /** Mise à jour, graphique, du statut indeterminate. */\n  updateIndeterminate(node: DsfrNode): void;\n}\n\n/**\n\n * TreeSelectManager implémente les fonctionnalités de sélection des nœuds d'une arborescence.\n * - Gère le mode de sélection\n * - Gère les checkbox\n * - Ne gère pas l'apparence des libellés sélectionnés\n */\nexport class TreeSelectManager {\n  /**\n   * Mode de sélection géré par le manager. Accessible par les composants utilisant ce manager.\n   */\n  selectionMode: DsfrSelectionMode = undefined;\n\n  /** Stratégie de sélection : pouvoir sélectionner tous les noeuds ou uniquement les feuilles  */\n  selectionStrategy: 'leaf' | 'all' = 'leaf';\n\n  /** Liste des nœuds sélectionnés. Si le mode de sélection est 'checkbox', seul les noeuds feuilles sont sélectionnables. */\n  selectedNodes: DsfrViewNode[] = [];\n\n  /** Les noeuds feuilles doivent posséder un id défini à l'initialisation si compareWith n'est pas renseigné */\n  noGenericId: boolean = false;\n\n  /** Nombre total de feuilles de l'arbre */\n  countLeaves = 0;\n\n  /** Composant géré par le manager. */\n  private treeSelectable: TreeSelectable;\n\n  /**\n   * Attribut permettant de notifier qu'un noeud sélectionné à déjà été rencontré en mode single, permettant d'ignorer\n   * l'état sélectionné de tous les noeuds subséquents.\n   */\n  private singleModeSelectedSkip = false;\n\n  constructor(treeSelectable: TreeSelectable) {\n    this.treeSelectable = treeSelectable;\n  }\n\n  /**\n   * À appeler à chaque modification de l'arborescence.\n   * Initialisation des paramètres des noeuds\n   * @param nodes Nœuds à initialiser\n   */\n  init(nodes: DsfrNode[]): DsfrViewNode[] {\n    const nodesClone = this.initNodes(nodes, 1);\n    this.singleModeSelectedSkip = false;\n\n    return nodesClone;\n  }\n\n  /**\n   * Dans le cas d'utilisation des checkboxes, on met à jour la valeur de `selected` en fonction des enfants.\n   * Permet d'initialiser les états indéterminés des checkboxes des parents (nécessite le rendu de la vue préalable)\n   * @param nodes\n   */\n  finalizeCheckboxState(nodes: DsfrViewNode[]): void {\n    if (!this.isCheckboxMode()) return;\n    this.updateBranches(nodes);\n  }\n\n  /**\n   * Sélection / désélection du nœud suite à un clic.\n   * - Gestion des différents modes de sélection\n   * - Envoie d'une notification sur le changement d'état de node.selected\n   * Dans le cas du mode checkbox, il n'y a pas de modification suite aux changements d'états des enfants\n   */\n  public doSelectNode(node: DsfrViewNode, nodeElt: HTMLElement): void {\n    if (!this.isSelectable()) return;\n\n    if (this.isSingleMode()) this.handleSingleModeSelection(node);\n    else if (this.isMultipleMode()) this.handleMultipleModeSelection(node);\n    else if (this.isCheckboxMode()) this.handleCheckboxModeSelection(node);\n  }\n\n  public isSelectable(): boolean {\n    return this.selectionMode !== undefined;\n  }\n\n  public isCheckboxMode(): boolean {\n    return this.selectionMode === DsfrSelectionModeConst.CHECKBOX;\n  }\n\n  public isSingleMode(): boolean {\n    return this.selectionMode === DsfrSelectionModeConst.SINGLE;\n  }\n\n  public isMultipleMode(): boolean {\n    return this.selectionMode === DsfrSelectionModeConst.MULTIPLE;\n  }\n\n  /**\n   * Initialisation par défaut des propriétés d'un nœud : 'selected', 'id'.\n   *\n   * @param nodes Les noeuds à initialiser\n   * @param level Le niveau du noeud dans la hiérarchie\n   */\n  public initNodes(nodes: DsfrNode[], level: number): DsfrViewNode[] {\n    const size = nodes.length;\n\n    return nodes.map((n, index) => {\n      const nodeView: DsfrViewNode = {\n        ...n,\n        id: n.id || newUniqueId(),\n        ariaLevel: level,\n        ariaSize: size,\n        ariaPosinset: index + 1,\n        selected: n.selected,\n        isExpanded: n.children ? signal(!!n.expanded) : signal(false),\n        isSelected: signal(n.selected),\n        children: n.children ? this.initNodes(n.children, level + 1) : undefined,\n      };\n\n      if (!n.children && !n.disabled) {\n        this.countLeaves++;\n      }\n\n      if (!n.children && !n.id && this.noGenericId) {\n        console.warn(`La fonction compareWith doit être définie: \"${n.label}\" n'a pas d'attribut 'id'.`);\n      }\n\n      if (this.isSelectable()) {\n        this.handleNodeSelectedInitialization(n, nodeView);\n      }\n\n      return nodeView;\n    });\n  }\n\n  /**\n   * Mise à jour des propriétés des nœuds (label, data, id) sans modifier l'état (select, expand) et ajouts éventuels.\n   * @param nodes Nœuds d'entrée à mettre à jour.\n   * @param viewNodes Nœuds clonés représentant l'état actuel de l'arbre.\n   */\n  public updateNodesContent(nodes: DsfrNode[], viewNodes: DsfrViewNode[], level: number): DsfrViewNode[] {\n    const size = nodes.length;\n    return nodes.map((node, index) => {\n      // noeud correspondant dans l'arbre cloné\n      const matchingNodeView = viewNodes.find((n) => n.id === node.id);\n      if (matchingNodeView) {\n        return {\n          ...node, // on récupère les nouvelles valeurs transmises par l'utilisateur du composant\n          id: node.id || matchingNodeView.id, // si l'id n'a pas été positionné, on récupère celui qui a été généré\n          selected: matchingNodeView.selected, // on restaure l'état de sélection courant\n          expanded: !!matchingNodeView.expanded, // on restaure l'état d'expansion courant\n          ariaPosinset: index,\n          ariaLevel: (matchingNodeView as DsfrViewNode).ariaLevel ?? 1, // on restaure le niveau de hiérarchie\n          ariaSize: size, // mise à jour dey la taille, car elle a pu changer\n          isExpanded: matchingNodeView.isExpanded,\n          isSelected: matchingNodeView.isSelected,\n          children: node.children\n            ? this.updateNodesContent(node.children, matchingNodeView.children || [], level + 1)\n            : matchingNodeView.children,\n        };\n      } else {\n        //  aucun noeud correspondant, ajouter la nouvelle structure\n        const nodeView: DsfrViewNode = {\n          ...node,\n          id: node.id || newUniqueId(),\n          ariaLevel: level,\n          ariaSize: size,\n          ariaPosinset: index,\n          isExpanded: signal(!!node.expanded),\n          isSelected: signal(node.selected),\n          children: node.children ? this.initNodes(node.children, level + 1) : undefined,\n        };\n\n        return nodeView;\n      }\n    });\n  }\n\n  public selectAllNodes(nodes: DsfrViewNode[], select = true) {\n    const isMultiple =\n      this.selectionMode === DsfrSelectionModeConst.MULTIPLE || this.selectionMode === DsfrSelectionModeConst.CHECKBOX;\n    if (isMultiple || (this.isSingleMode() && !select)) {\n      // sélection/déselection des enfants\n      this.toggleNodesState(nodes, select);\n      // mise a jour de l'état des branches\n      this.updateBranches(this.treeSelectable.nodes);\n    }\n  }\n\n  /**\n   * Mise à jour liste des feuilles sélectionnées\n   * (suppression des nœuds non sélectionnés)\n   */\n  public updateSelectedNodes(): DsfrViewNode[] {\n    this.selectedNodes = this.selectedNodes.filter((n: DsfrViewNode) => n.isSelected());\n    return this.selectedNodes;\n  }\n\n  /**\n   * Calcule si toutes les noeuds finaux non désactivés sont sélectionnées\n   */\n  public areAllLeavesSelected(): boolean {\n    return this.selectedNodes.length === this.countLeaves;\n  }\n\n  /**\n   * Détermine l'état de l'attribut selected d'un noeud en fonction du mode courant et du model fournit.\n   *\n   * @param node Nœud du model fournit.\n   * @param viewNode Nœud cloné représentant l'état actuel de l'arbre.\n   */\n  private handleNodeSelectedInitialization(node: DsfrNode, viewNode: DsfrViewNode) {\n    if (this.singleModeSelectedSkip) {\n      viewNode.isSelected.set(false);\n      return;\n    }\n\n    if (!this.isCheckboxMode() || !node.children) {\n      viewNode.isSelected.set(node.selected || false);\n    }\n\n    if ((!viewNode.children || this.selectionStrategy === 'all') && viewNode.selected) {\n      // update list of selected nodes\n      this.selectedNodes.push(viewNode);\n    }\n\n    if (node.selected && this.isSingleMode()) {\n      this.singleModeSelectedSkip = true;\n    }\n  }\n\n  private toggleNodeSelectedState(node: DsfrViewNode) {\n    node.isSelected.update((state) => !state);\n\n    if (!node.isSelected()) {\n      this.treeSelectable.isAllSelected.set(false);\n    }\n  }\n\n  private handleSingleModeSelection(node: DsfrViewNode) {\n    const prevSingleNode: DsfrViewNode | undefined = this.findFirstNodeSelected(this.treeSelectable.nodes);\n\n    if (prevSingleNode && prevSingleNode !== node) {\n      prevSingleNode.isSelected.set(false);\n\n      // envoi de l'évènement notifiant la déselection du noeud précédant\n      this.treeSelectable.notifySelectEvent(prevSingleNode);\n    }\n\n    // ajout de l'unique nœud sélectionnable\n    if (!node.children || this.selectionStrategy !== 'leaf') this.selectedNodes = [node];\n\n    this.toggleNodeSelectedState(node);\n    this.treeSelectable.notifySelectEvent(node);\n  }\n\n  /**\n   * Mise a jour de la sélection en mode multiple (sans checkbox)\n   * - Modification de l'état du noeud et ajout dans la liste des noeud sélectionnés\n   * - Mise a jour de la liste des noeuds selectionnés\n   * - pas de propagation de l'état aux parents\n   * @param node noeud sélectionné/déselectionné\n   */\n  private handleMultipleModeSelection(node: DsfrViewNode) {\n    this.toggleNodeSelectedState(node);\n    this.selectedNodes.push(node);\n\n    this.updateSelectedNodes();\n\n    this.treeSelectable.notifySelectEvent(node);\n  }\n\n  private handleCheckboxModeSelection(node: DsfrViewNode) {\n    const firstState = node.isSelected();\n\n    // Mise a jour du noeud et propagation de la sélection\n    this.updateChildren(node, !firstState);\n    // Mise à jour des parents pour tout le model\n    this.updateBranches(this.treeSelectable.nodes);\n\n    // Cas particulier: l'état du parent n'a pas été modifié suite à un enfant disabled -- on recharge l'autre etat\n    this.forceStateParent(node, firstState);\n\n    this.updateSelectedNodes();\n    this.treeSelectable.notifySelectEvent(node);\n  }\n\n  /**\n   * Dans le cas ou un parent possède des enfants désactivés non sélectionnés\n   * L'état passe de indéterminé à non sélectionné au lieu de sélectionné\n   * @param node\n   * @param previousState\n   */\n  private forceStateParent(node: DsfrViewNode, previousState: boolean | undefined) {\n    if (node.children && node.isSelected() === previousState && previousState === undefined) {\n      // Propagation de la sélection\n      this.updateChildren(node, !!node.isSelected());\n      // Mise à jour des parents pour tout le model\n      this.updateBranches(this.treeSelectable.nodes);\n    }\n  }\n\n  /**\n   * Met à jour, récursivement, l'état de chaque nœud en parcourant l'arborescence de haut en bas.\n   */\n  private updateChildren(node: DsfrViewNode, selected: boolean): void {\n    if (node.disabled || node.hidden) return;\n    node.isSelected.set(selected);\n    // Dans le cas d'utilisation des checkboxes, on propage l'état aux enfants\n    if (this.isCheckboxMode()) {\n      node.children?.forEach((n) => this.updateChildren(n, selected));\n\n      if (!node.children && node.isSelected() && !this.selectedNodes.find((n) => n.id === node.id)) {\n        // Ajout du nœud (feuille) sélectionné dans la liste\n        this.selectedNodes.push(node);\n      }\n    }\n  }\n\n  /**\n   * Lance la mise à jour de l'état de sélection de chaque banche en parcourant l'arborescence de bas en haut de manière recursive.\n   *\n   * ex: Pour un model tel que le suivant:\n   *    B1\n   *   / \\\n   *  B2  B3\n   *  |   |\n   *  F1  F2\n   *\n   * La méthode updateBranches(B1) tentera de mettre à jour le noeud B2 qui recursivement mettra à jour la\n   * feuille F1 avant de se mettre elle même (B2) à jour. Ensuite, la méthode mettra à jour les noeuds suivants de\n   * la même façon, d'abord F2, puis B3. Enfin, une fois tous ses descendants à jour, B1 se mettra lui même à jour.\n   */\n  private updateBranches(nodes: DsfrViewNode[]) {\n    nodes?.forEach((n) => this.updateBranchState(n));\n  }\n\n  /**\n   * Met à jour l'état `selected` d'une branche en fonction de ses nœuds enfants ('true', 'false' ou 'undefined').\n   * Émet un événement si l'état du nœud change.\n   * Met à jour la propriété indeterminate de la checkbox\n   * @param node Nœud de l'arbre\n   */\n  private updateBranchState(node: DsfrViewNode): void {\n    if (!node.children || node.disabled) return;\n\n    /**\n     * Partie recursive de l'algorithme. La suite de cette méthode n'est prise en compte qu'après la mise à jour\n     * de tous les descendants de la branche en cours.\n     */\n    node.children.forEach((n) => this.updateBranchState(n));\n\n    let allDisabled = true;\n    let allSelected = true;\n    let noneSelected = true;\n\n    for (const child of node.children) {\n      if (child.disabled !== true) allDisabled = false;\n      if (child.isSelected() !== true) allSelected = false;\n      if (child.isSelected() !== false) noneSelected = false;\n\n      if (!allDisabled && !allSelected && !noneSelected) break;\n    }\n\n    const newState = allSelected ? true : noneSelected ? false : undefined;\n\n    if (node.isSelected() !== newState || node.isSelected() !== newState) {\n      node.isSelected.set(newState);\n      this.treeSelectable.updateIndeterminate(node);\n    }\n\n    if (allDisabled) {\n      node.disabled = true; // désactiver le parent dont tous les enfants sont désactivés\n    }\n  }\n\n  /**\n   * Retourne le 1er nœud sélectionné dans l'arborescence.\n   * @param nodes arborescence\n   * @return 1er nœud sélectionné ou undefined\n   */\n  private findFirstNodeSelected(nodes: DsfrViewNode[]): DsfrViewNode | undefined {\n    let node: DsfrNode | undefined = undefined;\n    nodes.find((n) => {\n      if (node) return;\n      node = n.isSelected() ? n : !n.children ? undefined : this.findFirstNodeSelected(n.children);\n    });\n\n    return node;\n  }\n\n  /**\n   * Sélectionne / déselectionne récursivement tous les nœuds nodes et leurs descendants\n   * @param nodes Liste de nœuds à sélectionner\n   * @param select true : selection des noeuds, false : fermeture\n   */\n  private toggleNodesState(nodes: DsfrViewNode[], select: boolean) {\n    nodes.forEach((node) => {\n      if (node.hidden || node.disabled) return;\n\n      if (node.children) {\n        this.toggleNodesState(node.children, select);\n      } else {\n        node.isSelected.set(select);\n        // Mise a jour liste des noeuds sélectionnés\n        if (select && !this.selectedNodes.find((n) => n.id === node.id) && !node.hidden) {\n          this.selectedNodes.push(node);\n        } else if (!select) {\n          // suppression des noeuds déselectionnés (on ne supprime pas toute la liste au cas ou un filtre est actif)\n          const i: number = this.selectedNodes.findIndex((n) => n.id === node.id);\n          if (i !== -1) this.selectedNodes.splice(i, 1);\n        }\n      }\n    });\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  ContentChild,\n  ElementRef,\n  EventEmitter,\n  Input,\n  Output,\n  TemplateRef,\n  ViewEncapsulation,\n  afterNextRender,\n  computed,\n  effect,\n  signal,\n  viewChildren,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { EduCheckboxLightComponent } from '@edugouvfr/ngx-dsfr';\nimport { DsfrSelectionMode } from '../shared/models/selection-mode.type';\nimport { TreeFocusManager, TreeFocusable } from '../shared/utils/tree/tree-focus-manager';\nimport { TreeSelectManager, TreeSelectable } from '../shared/utils/tree/tree-select-manager';\nimport { DsfrNode, DsfrViewNode } from '../shared/utils/tree/tree.model';\n\n/** Événement émis lors de la sélection d'un nœud. */\nexport interface DsfrNodeEvent extends Omit<DsfrNode, 'children'> {}\nexport interface DsfrTreeNodeEvent {\n  node: DsfrNodeEvent | null;\n  nodesSelected: DsfrNode[];\n}\n\n/**\n * Interface utilisée pour le contexte du template nodeTemplate\n */\nexport interface DsfrNodeContext {\n  $implicit: DsfrNode;\n}\n\n@Component({\n  selector: 'dsfr-ext-tree, dsfrx-tree',\n  templateUrl: './tree.component.html',\n  styleUrls: ['./tree.component.scss'],\n  encapsulation: ViewEncapsulation.None,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, FormsModule, EduCheckboxLightComponent],\n})\nexport class DsfrTreeComponent implements TreeFocusable, TreeSelectable {\n  /** Template pour personnaliser le contenu d'un noeud.\n   * Le slot s'ajoute après le label en mode checkbox et le remplace dans les autres modes.  */\n  @ContentChild('nodeTemplate', { static: true }) nodeTemplate?: TemplateRef<DsfrNodeContext>;\n\n  /** Indique le changement d'état d'un nœud. */\n  @Output() nodeSelect = new EventEmitter<DsfrNodeEvent>();\n\n  /** Indique un changement sur la sélection. Renvoie le noeud concerné et liste des noeuds (feuilles) sélectionnés */\n  @Output() selectionChange = new EventEmitter<DsfrTreeNodeEvent>();\n\n  /** Indique si toutes les options sont sélectionnées ou non. */\n  /** @internal */\n  isAllSelected = signal(false); // Géré par TreeSelectManager\n\n  /** @internal */\n  focusedNodeId = signal<string | undefined>(undefined); // Géré par TreeFocusManager\n\n  protected nodesElement = viewChildren<ElementRef<HTMLElement>>('treeNode');\n\n  protected isModeSelectable: boolean = false;\n  protected viewNodes = signal<DsfrViewNode[]>([]);\n\n  private _data: DsfrNode[] = []; // sauvegarde des données en entrée\n  private focusManager = new TreeFocusManager(this);\n  private selectManager = new TreeSelectManager(this);\n\n  /**\n   * Tous les HTMLElements correspondants aux noeuds visibles (expanded) et dans l'ordre du DOM\n   * (on ne peut pas récuprer directement viewNodes() => l'ordre du DOM n'est pas respecté)\n   */\n  private visibleNativeNodeElements = computed(() => {\n    const visibleNodes = this.focusManager.flattenTreeVisibleNodes(this.viewNodes());\n\n    const concatNativeNodesElement = visibleNodes\n      .map(\n        (node) =>\n          this.nodesElement()\n            .map((elem) => elem.nativeElement)\n            .find((el) => el.dataset['id'] === node.id), // attribut data-id des <li>\n      )\n      .filter((el): el is HTMLElement => !!el);\n\n    return concatNativeNodesElement;\n  });\n\n  constructor() {\n    // Maj des nodes apres initialisation de tous les parametres\n    afterNextRender(() => {\n      if (this.viewNodes().length === 0) {\n        this.viewNodes.set(this.selectManager.init(this._data));\n      }\n      if (this.isCheckboxMode()) this.selectManager.finalizeCheckboxState(this.viewNodes());\n    });\n\n    effect(() => {\n      // Initialisation de l'index et du focus sur le 1er élément\n      if (this.focusedNodeId() === undefined) {\n        const focusedNodeId = this.focusManager.initTabindex();\n        this.focusedNodeId.set(focusedNodeId);\n      }\n    });\n  }\n\n  get selectionMode(): DsfrSelectionMode {\n    return this.selectManager.selectionMode;\n  }\n\n  /** Noeuds affichés */\n  get nodes(): DsfrViewNode[] {\n    return this.viewNodes();\n  }\n\n  @Input() set selectionMode(value: DsfrSelectionMode) {\n    this.selectManager.selectionMode = value;\n    this.isModeSelectable = this.selectManager.isSelectable();\n  }\n\n  /** Données sous forme d'arbre DsfrNode[] */\n  @Input() set value(val: DsfrNode[]) {\n    this._data = val;\n    if (this.viewNodes().length > 0) {\n      // mise à jour avec conservation des états d'expansion et de sélection (si noeuds fournis avec identifiants)\n      this.viewNodes.set(this.selectManager.updateNodesContent(val, this.viewNodes(), 1));\n    }\n  }\n\n  /**\n   * Permet la récupération du modèle interne de l'arbre.\n   * @returns Un tableau de DsfrNode[].\n   */\n  public getTreeState(): DsfrViewNode[] {\n    return this.nodes;\n  }\n\n  /**\n   * Permet la récupération de la sélection courante de l'arbre.\n   * @returns Un tableau de DsfrNode[].\n   */\n  public getSelection(): DsfrNode[] {\n    return this.selectManager.selectedNodes;\n  }\n\n  /** @internal */\n  isCheckboxMode(): boolean {\n    return this.selectManager.isCheckboxMode();\n  }\n\n  /** @internal */\n  isSelectable(): boolean {\n    return this.selectManager.isSelectable();\n  }\n\n  /** @internal */\n  onNodeButton(node: DsfrViewNode) {\n    this.focusedNodeId.set(node.id);\n    this.focusManager.doToggleExpand(node);\n  }\n\n  /**\n   * Sélection du label d'un nœud lorsque que l'on a un label sans checkbox. Si le mode est `selectable` :\n   * - on inverse la sélection, uniquement du nœud, on émet un événement.\n   */\n  /** @internal */\n  onNodeSelect(node: DsfrViewNode, event: Event) {\n    const nodeElt = <HTMLElement>event.currentTarget;\n    this.focusedNodeId.set(node.id);\n\n    this.selectManager.doSelectNode(node, nodeElt);\n  }\n\n  /**\n   * Gestion des touches de navigation.\n   * On transfère la gestion au composant qui gère la liste.\n   */\n  /** @internal */\n  onNodeKeydown(node: DsfrViewNode, event: KeyboardEvent) {\n    const focusIndex = this.focusManager.doKeyEvent(node, event, true);\n    this.focusedNodeId.set(focusIndex);\n  }\n\n  // -- TreeFocusable --------------------------------------------------------------------------------------------------\n\n  /** Etendre tous les noeuds de l'arborescence. */\n  public expandAll(): void {\n    this.viewNodes.update((nodes) => this.focusManager.expandNodesRecursive(nodes, true));\n  }\n\n  /** Etendre les noeuds de l'arborescence jusqu'au niveau précisé */\n  public expandLevel(level: number): void {\n    this.viewNodes.update((nodes) => this.focusManager.expandNodesRecursive(nodes, true, level));\n  }\n\n  /** Fermer tous les nœuds de l'arborescence.  */\n  public collapseAll(): void {\n    this.viewNodes.update((nodes) => this.focusManager.expandNodesRecursive(nodes, false));\n  }\n\n  /** @internal */\n  doNodeDefaultAction(node: DsfrViewNode, event: Event) {\n    const nodeElt = <HTMLElement>event.currentTarget;\n    this.selectManager.doSelectNode(node, nodeElt);\n  }\n\n  /**\n   * Trouver tous les noeuds <li> visibles\n   * @internal\n   */\n  findVisibleNodesElt(): HTMLElement[] {\n    return this.visibleNativeNodeElements();\n  }\n\n  /** @internal */\n  findFocusElement(): HTMLElement | undefined {\n    return this.visibleNativeNodeElements().find((e) => e.dataset['id'] === this.focusedNodeId());\n  }\n\n  /**\n   * Mise a jour du contenu de l'arbre. Conserve l'état (nœuds étendus et sélectionnés) si l'id des nœuds est renseigné.\n   */\n  public updateContent(): void {\n    const updated = this.selectManager.updateNodesContent(this._data, this.viewNodes(), 1);\n    this.viewNodes.set(updated);\n  }\n\n  /**\n   * Réinitialise l'état de l'arbre (nœuds étendus et sélectionnés)\n   * @internal\n   */\n  reinitializeState(): void {\n    this.viewNodes.set(this.selectManager.init(this._data));\n    this.selectManager.finalizeCheckboxState(this.viewNodes());\n  }\n\n  // -- TreeSelectable -------------------------------------------------------------------------------------------------\n\n  /** Sélectionne / désélectionne tous les nœuds en mode multiple ou checkbox.\n   * @internal\n   */\n  selectAll(selected = true): void {\n    this.selectManager.selectAllNodes(this.nodes, selected);\n    this.selectionChange.emit({ node: null, nodesSelected: this.selectManager.selectedNodes });\n  }\n\n  /** Emission d'un événement pour un nœud.\n   * @internal\n   */\n  notifySelectEvent(node: DsfrViewNode): void {\n    // la variable 'nodeContent' correspond à node sans les enfants\n    const { children, ...nodeContent } = node;\n    this.nodeSelect.emit(<DsfrNodeEvent>nodeContent);\n    this.selectionChange.emit({\n      node: nodeContent,\n      nodesSelected: this.selectManager.selectedNodes.map((a) => a as DsfrNode),\n    });\n  }\n\n  /**\n   * Met à jour la propriété `indeterminate` de la checkbox `node.inputId` en fonction de la valeur de 'node.isSelected'.\n   * @param node Nœud de l'arbre\n   */\n  /** @internal */\n  updateIndeterminate(node: DsfrViewNode): void {\n    const element = this.visibleNativeNodeElements().find((el) => el.dataset['id'] === node.id);\n    const inputElt = <HTMLInputElement>element?.querySelector('#' + this.getCheckboxId(node));\n\n    if (inputElt) inputElt.indeterminate = node.isSelected() === undefined;\n  }\n\n  protected trackById(index: number, item: DsfrNode): string | undefined {\n    return item.id;\n  }\n\n  protected getCheckboxId(node: DsfrNode): string {\n    return 'cb-' + node.id;\n  }\n}\n","<div class=\"dsfrx-tree-component\">\n  <ng-container\n    [ngTemplateOutlet]=\"nodesTemplate\"\n    [ngTemplateOutletContext]=\"{ nodes: nodes || [], root: true }\"></ng-container>\n</div>\n\n<ng-template #nodesTemplate let-nodes=\"nodes\" let-root=\"root\">\n  <ul\n    class=\"tree-node\"\n    [attr.aria-multiselectable]=\"root ? selectionMode === 'multiple' || selectionMode === 'checkbox' : null\"\n    [attr.role]=\"root ? 'tree' : 'group'\">\n    @for (node of nodes; track trackById(i, node); let i = $index) {\n      @if (!node.hidden) {\n        <li\n          #treeNode\n          role=\"treeitem\"\n          [attr.tabindex]=\"focusedNodeId() === node.id ? 0 : -1\"\n          class=\"tree-node-content\"\n          (keydown)=\"onNodeKeydown(node, $event)\"\n          [attr.aria-selected]=\"isModeSelectable ? node.isSelected() : null\"\n          [attr.aria-level]=\"node.ariaLevel\"\n          [attr.aria-setsize]=\"node.ariaSize\"\n          [attr.data-id]=\"node.id\"\n          [attr.aria-posinset]=\"node.ariaPosinset ?? null\"\n          [class.leaf]=\"!node.children\"\n          [attr.aria-expanded]=\"node.children?.length ? node.isExpanded() : null\">\n          <ng-container\n            [ngTemplateOutlet]=\"defaultNodeTemplate\"\n            [ngTemplateOutletContext]=\"{ node: node }\"></ng-container>\n        </li>\n      }\n    }\n  </ul>\n</ng-template>\n\n<ng-template #defaultNodeTemplate let-node=\"node\">\n  <div class=\"tree-node-content-inside\" [class.selectable]=\"isModeSelectable\" [class.selected]=\"node.isSelected()\">\n    <!-- Bouton collapse / expand -->\n    @if (node.children) {\n      <span\n        class=\"tree-button\"\n        [class]=\"!node.isExpanded() ? 'fr-icon-arrow-right-s-line' : 'fr-icon-arrow-down-s-line'\"\n        (click)=\"onNodeButton(node)\"></span>\n    }\n\n    @if (!isCheckboxMode()) {\n      <div (click)=\"isModeSelectable ? onNodeSelect(node, $event) : onNodeButton(node)\" class=\"tree-node-label\">\n        <!-- Label seul -->\n        @if (!nodeTemplate) {\n          <span class=\"fr-label\">\n            @if (node.icon) {\n              <span aria-hidden=\"true\" [class]=\"node.icon + ' fr-icon--sm'\">&nbsp;</span>\n            }\n            {{ node.label }}\n          </span>\n        } @else {\n          <!-- Label seul et template custom -->\n          <ng-container *ngTemplateOutlet=\"nodeTemplate; context: { $implicit: node }\"></ng-container>\n        }\n      </div>\n    } @else {\n      <div class=\"tree-node-label\">\n        <!-- Checkbox + label -->\n        <edu-checkbox-light\n          [id]=\"getCheckboxId(node)\"\n          [disabled]=\"node.disabled\"\n          [tabIndex]=\"-1\"\n          [icon]=\"node.icon\"\n          [label]=\"node.label\"\n          (checkboxClick)=\"onNodeSelect(node, $event)\"\n          [selected]=\"node.isSelected()\"></edu-checkbox-light>\n        <!-- Template custom additionnel -->\n        <ng-container *ngTemplateOutlet=\"nodeTemplate; context: { $implicit: node }\"></ng-container>\n      </div>\n    }\n  </div>\n\n  <!-- Children -->\n  @if (node.children && node.isExpanded()) {\n    <ng-container\n      [ngTemplateOutlet]=\"nodesTemplate\"\n      [ngTemplateOutletContext]=\"{ nodes: node.children, root: false }\"></ng-container>\n  }\n</ng-template>\n","import { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { CommonModule } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  ContentChild,\n  ElementRef,\n  Input,\n  OnInit,\n  TemplateRef,\n  ViewChild,\n  ViewEncapsulation,\n  afterRenderEffect,\n  computed,\n  forwardRef,\n  signal,\n  viewChildren,\n} from '@angular/core';\nimport { FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\nimport { DsfrButtonModule, DsfrI18nPipe, DsfrTagModule, EduCheckboxLightComponent } from '@edugouvfr/ngx-dsfr';\nimport { AbstractSelectComponent, DropdownContainerComponent } from '../shared/components';\nimport { ListToolBarComponent } from '../shared/components/list-toolbar';\nimport { SelectInputLabelComponent } from '../shared/components/select-input-label/select-input-label.component';\nimport { EduMessageSeverityDirective } from '../shared/directives/message-severity.directive';\nimport { DsfrSelectionMode, DsfrSelectionModeConst } from '../shared/models/selection-mode.type';\nimport { TreeFocusManager, TreeFocusable } from '../shared/utils/tree/tree-focus-manager';\nimport { TreeSelectManager, TreeSelectable } from '../shared/utils/tree/tree-select-manager';\nimport { DsfrNode, DsfrViewNode } from '../shared/utils/tree/tree.model';\n\n/**\n * Interface utilisée pour le contexte du template optionTemplate\n */\nexport interface DsfrNodeContext {\n  $implicit: DsfrNode;\n}\n\n@Component({\n  selector: 'dsfr-ext-treeselect, dsfrx-treeselect',\n  styleUrls: ['./treeselect.component.scss'],\n  templateUrl: './treeselect.component.html',\n  encapsulation: ViewEncapsulation.None,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    CommonModule,\n    FormsModule,\n    ScrollingModule,\n    ReactiveFormsModule,\n    DropdownContainerComponent,\n    DsfrTagModule,\n    DsfrButtonModule,\n    EduCheckboxLightComponent,\n    DsfrI18nPipe,\n    EduMessageSeverityDirective,\n    SelectInputLabelComponent,\n    ListToolBarComponent,\n  ],\n  providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DsfrTreeselectComponent), multi: true }],\n})\nexport class DsfrTreeselectComponent\n  extends AbstractSelectComponent<DsfrViewNode>\n  implements OnInit, TreeFocusable, TreeSelectable\n{\n  /** Stratégie de sélection, uniquement en mode single. Par défaut seules les feuilles sont sélectionnables.*/\n  @Input() selectionStrategy: 'leaf' | 'all' = 'leaf';\n\n  /** Template des labels des options */\n  @ContentChild('optionTemplate', { static: true }) override optionTemplate?: TemplateRef<DsfrNodeContext>;\n\n  /** @internal */\n  @ViewChild(CdkVirtualScrollViewport) viewport?: CdkVirtualScrollViewport;\n\n  /** @internal*/\n  isAllSelected = signal(false);\n\n  /** @internal */\n  focusedNodeId = signal<string | undefined>(undefined); // Géré par TreeFocusManager\n\n  protected visibleNodes: DsfrViewNode[] = []; // clone de liste utilisé en cas de virtualScroll\n  protected countFilteredOptions = -1;\n  protected countLeaves = -1;\n  protected countFilteredLeaves = -1;\n\n  protected nodesElement = viewChildren<ElementRef<HTMLElement>>('treeNode');\n\n  private treeFocusManager = new TreeFocusManager(this);\n  private treeSelectManager = new TreeSelectManager(this);\n\n  /**\n   * Tous les HTMLElements correspondants aux noeuds visibles (expanded) et dans l'ordre du DOM\n   * (on ne peut pas récuprer directement viewNodes() => l'ordre du DOM n'est pas respecté)\n   */\n  private visibleNativeNodeElements = computed(() => {\n    const visibleNodes = this.treeFocusManager.flattenTreeVisibleNodes(this.optionsFilter());\n\n    const concatNativeNodesElement = visibleNodes\n      .map((node) =>\n        this.nodesElement()\n          .map((elem) => elem.nativeElement)\n          .find((el) => el.dataset['id'] === node.id),\n      )\n      .filter((el): el is HTMLElement => !!el);\n\n    return concatNativeNodesElement;\n  });\n\n  constructor() {\n    super();\n\n    afterRenderEffect(() => {\n      this.countLeaves = this.treeSelectManager.countLeaves;\n    });\n  }\n\n  /** @internal Equivalent a optionsFilter */\n  get nodes(): DsfrViewNode[] {\n    return this.optionsFilter();\n  }\n\n  /** @internal */\n  override get selectionMode() {\n    return this._selectionMode;\n  }\n\n  /** Personnalisation de la fonction de recherche pour filtrer les options. Fonction à 2 arguments : node (DsfrNode) et texte cherché (string) */\n  @Input()\n  set searchFn(fn: (n: DsfrNode, text: string) => boolean) {\n    if (typeof fn !== 'function') {\n      throw Error('`searchFn` must be a function.');\n    }\n    this._searchFn = fn;\n\n    // reset filter\n    this.searchText = '';\n    this.optionsFilter = this.optionsFilter ?? [];\n  }\n\n  /** Liste des options (DsfrNode[]) disponibles. */\n  @Input()\n  override set options(val: any[] | undefined) {\n    const nodes = val ?? [];\n\n    if (!this.treeSelectManager.selectionMode) this.treeSelectManager.selectionMode = this.selectionMode;\n    this.applyOptions(nodes);\n\n    if (this.value === undefined) {\n      const initNodes = this.treeSelectManager.init(nodes);\n\n      this.optionsFilter.set(initNodes);\n      this.treeSelectManager.finalizeCheckboxState(initNodes);\n\n      if (this.virtualScroll) {\n        this.visibleNodes = initNodes;\n      }\n    }\n  }\n\n  /** Mode de sélection. Checkbox par défaut. */\n  @Input()\n  override set selectionMode(mode: DsfrSelectionMode) {\n    super.setSelectionMode(mode);\n    this.treeSelectManager.selectionMode = this.selectionMode;\n  }\n\n  public override ngOnInit(): void {\n    super.ngOnInit();\n\n    if (!this._compareWith.name && this.options && this.options.length > 0) {\n      this.treeSelectManager.noGenericId = true; // TODO ?\n    }\n\n    this.treeSelectManager.selectionStrategy =\n      this.isSingleMode && this.selectionStrategy ? this.selectionStrategy : 'leaf';\n  }\n\n  /**\n   * Mise a jour de la valeur de selectedOptions et value programmatiquement (ex. à l'init reactive form)\n   * @param value\n   * @internal\n   */\n  override writeValue(value: any) {\n    this.treeSelectManager.selectedNodes = [];\n    if (value) {\n      if (!Array.isArray(value)) {\n        value = [value];\n      }\n      // Sélection dans l'arbre des valeurs sélectionnées programmatiquement\n      this.setSelectedNodes(this.optionsFilter(), value);\n    } else {\n      //si des options etaient sélectionnées, on vide la selection de l'arbre\n      if (this.selectedOptions.length > 0) this.treeSelectManager.selectAllNodes(this.optionsFilter(), false);\n      this.indexFirstSelected = null;\n    }\n    this.optionsFilter.set(this.treeSelectManager.init(this.optionsFilter()));\n\n    this.treeSelectManager.finalizeCheckboxState(this.optionsFilter());\n\n    if (this.virtualScroll) this.visibleNodes = this.optionsFilter();\n    this.selectedOptions = [...this.treeSelectManager.selectedNodes];\n    this.searchText = '';\n\n    super.writeValue(value);\n    this.cd.markForCheck();\n  }\n\n  /** @internal */\n  public override toggleDropdown(event: Event) {\n    super.toggleDropdown(event);\n\n    if (this.virtualScroll && this.displayDropdown() && (this.showSearch || this.showSelectAll)) {\n      this.viewport?.checkViewportSize();\n    }\n  }\n\n  /** @internal */\n  public notifySelectEvent(node: DsfrNode): void {\n    // nothing\n  }\n\n  /** Mise a jour de l'état des checkbox selon leur id, nécessaire avec le tri en virtualScroll (perte du binding)\n   * @internal */\n  public updateIndeterminate(node: DsfrViewNode): void {\n    if (this.virtualScroll) {\n      const element = this.visibleNativeNodeElements().find((el) => el.dataset['id'] === node.id);\n      const inputElt = <HTMLInputElement>element?.querySelector(`#cb-${node.id}`);\n\n      if (inputElt) {\n        inputElt.indeterminate = node.isSelected() === undefined;\n      }\n    }\n  }\n\n  /**\n   * Selection/Deselection du noeud\n   * Mise a jour de la liste des noeuds sélectionnés\n   * @internal */\n  public doNodeDefaultAction(node: DsfrViewNode, event: Event): void {\n    this.treeSelectManager.doSelectNode(node, <HTMLElement>event.currentTarget);\n\n    // Mise a jour de la value\n    this.selectedOptions = this.treeSelectManager.updateSelectedNodes();\n    this.value = this.selectedOptions;\n\n    this.selectionChange.emit(this.value);\n  }\n\n  /** @internal */\n  public findFocusElement(): HTMLElement | undefined {\n    return this.visibleNativeNodeElements().find((e) => e.dataset['id'] === this.focusedNodeId());\n  }\n\n  /**\n   * Clic sur une option en mode tag supprimable.\n   * Déselection option et mise a jour des parents.\n   * @internal */\n  public clearOption(event: { nativeEvent: Event; option: DsfrViewNode }) {\n    this.onOptionClick(event.nativeEvent, event.option);\n    this.updateValueSelected();\n\n    this.fnOnTouched();\n  }\n\n  /**\n   * Trouver tous les noeuds <li> visibles\n   * @internal\n   */\n  public findVisibleNodesElt(): HTMLElement[] {\n    return this.visibleNativeNodeElements();\n  }\n\n  /** @internal */\n  public selectAll(): void {\n    this.isAllSelected.update((state) => !state);\n    this.treeSelectManager.selectAllNodes(this.optionsFilter(), this.isAllSelected());\n    this.updateValueSelected();\n\n    this.selectionChange.emit(this.value);\n  }\n\n  /** @internal */\n  public clearAllOptions(): void {\n    this.isAllSelected.set(false);\n    this.treeSelectManager.selectAllNodes(this.optionsFilter(), this.isAllSelected());\n    this.updateValueSelected();\n\n    this.selectionChange.emit(this.value);\n    this.fnOnTouched();\n  }\n\n  /** Etendre tous les noeuds de l'arborescence. */\n  public expandAll(): void {\n    this.optionsFilter.update((nodes) => this.treeFocusManager.expandNodesRecursive(nodes, true));\n  }\n\n  /** Etendre les noeuds de l'arborescence jusqu'au niveau précisé */\n  public expandLevel(level: number): void {\n    this.optionsFilter.update((nodes) => this.treeFocusManager.expandNodesRecursive(nodes, true, level));\n  }\n\n  /** Fermer tous les nœuds de l'arborescence.  */\n  public collapseAll(): void {\n    this.optionsFilter.update((nodes) => this.treeFocusManager.expandNodesRecursive(nodes, false));\n  }\n\n  /**\n   * Gestion du focus à l'ouverture de la liste (evenement du dropdown-container)\n   * Focus le 1er element feuille sélectionne visible ou le 1er element du tree\n   */\n  public handleListFocus(): void {\n    const focusedNodeId = this.treeFocusManager.initTabindex();\n    this.focusedNodeId.set(focusedNodeId);\n\n    this.treeFocusManager.currentElt?.focus();\n  }\n\n  /**\n   * Au clic sur le label ou la checkbox\n   * Sélection ou déselection des noeuds\n   * @internal */\n  public override onOptionClick(event: Event, node: DsfrViewNode): void {\n    if (node.disabled) return;\n\n    this.treeSelectManager.doSelectNode(node, <HTMLElement>event.currentTarget);\n\n    if (this.selectionMode === DsfrSelectionModeConst.SINGLE && (!node.children || this.selectionStrategy === 'all')) {\n      // Cacher la liste a la selection si selection simple\n      this.hide();\n    }\n\n    this.selectedOptions = this.treeSelectManager.updateSelectedNodes();\n    this.value = this.selectedOptions;\n    this.isAllSelected.set(this.areAllOptionsSelected());\n\n    this.selectionChange.emit(this.value);\n  }\n\n  /**\n   * Filtrer les options selon la fonction de recherche\n   * @internal */\n  public onSearch(): void {\n    this.countFilteredOptions = 0;\n    this.countFilteredLeaves = 0;\n\n    if (!this.virtualScroll) {\n      // appliquer l'état hidden pour filtrer\n      this.optionsFilter().forEach((node) => this.updateNodeVisibility(node));\n    } else {\n      // Dans le cas du virtual scroll on est obligé de filtrer physiquement les noeuds\n      this.visibleNodes = this.optionsFilter()\n        .map((node) => this.filterNodes(node))\n        .filter((node) => node !== null) as DsfrViewNode[];\n    }\n\n    this.isAllSelected.set(this.areAllOptionsSelected());\n  }\n\n  /**\n   * Au clic sur les boutons flèches plier/déplier les noeuds\n   *  @internal */\n  public onNodeButton(node: DsfrViewNode): void {\n    this.treeFocusManager.doToggleExpand(node);\n  }\n\n  /**\n   * Interaction clavier avec un des noeuds\n   * @internal */\n  public onNodeKeydown(node: DsfrViewNode, event: KeyboardEvent): void {\n    //retour tab\n    if (event.shiftKey && event.key === 'Tab') {\n      return;\n    }\n\n    if (event.key === 'Escape' || event.key === 'Tab') {\n      this.hide();\n      return;\n    }\n\n    if (event.key === 'Enter') {\n      this.treeFocusManager.doKeyEvent(node, event, true);\n      this.hide();\n\n      return;\n    }\n\n    this.treeFocusManager.doKeyEvent(node, event, true);\n\n    if (!this.virtualScroll) {\n      this.treeFocusManager.currentElt?.scrollIntoView({ behavior: 'smooth', block: 'center' });\n    } else if (this.viewport) {\n      this.treeFocusManager.scrollForVirtualScroll(this.viewport);\n    }\n  }\n\n  /** @internal */\n  public isSelectable(): boolean {\n    return this.treeSelectManager.isSelectable();\n  }\n\n  protected trackById(index: number, item: DsfrNode): string | undefined {\n    return item?.id;\n  }\n\n  /** Surcharge de compareWith par défaut pour utiliser les id */\n  protected override _compareWith: (o1: any, o2: any) => boolean = (o1, o2) => o1?.id === o2?.id;\n\n  /** Mise a jour selectedOptions puis value */\n  private updateValueSelected() {\n    this.selectedOptions = [...this.treeSelectManager.selectedNodes];\n    this.value = this.selectedOptions;\n\n    this.cd.markForCheck();\n  }\n\n  /** Fonction de recherche par défaut */\n  private _searchFn: (n: DsfrNode, searchText: string) => boolean = function (o, searchText) {\n    return o.label?.toLowerCase().includes(searchText.toLowerCase());\n  };\n\n  /**\n   * Filtre visuellement les nœuds en appliquant `hidden` en fonction du résultat de la recherche.\n   * - nœud parent visible : correspond à la recherche ou au moins un de ses enfants est visible.\n   * - nœud enfant visible : correspond à la recherche ou un de ses ancêtres correspond à la recherche.\n   * @param node Le nœud à filtrer de manière récursive.\n   * @returns `true` si le nœud est visible, sinon `false`.\n   */\n  private updateNodeVisibility(node: DsfrViewNode, isAncestorVisible?: boolean): boolean {\n    const isMatch = this._searchFn(node, this.searchText);\n    // si un des ancètres est visible on conserve la visibilité\n    const isNodeVisible = isAncestorVisible || isMatch;\n\n    if (node.children) {\n      // Appliquer hidden récursivement aux enfants\n      const anyChildVisible = node.children.reduce((acc, child) => {\n        return this.updateNodeVisibility(child, isNodeVisible) || acc;\n      }, false);\n\n      node.hidden = !(isMatch || anyChildVisible);\n      if (!node.hidden && this.searchText.length > 1) node.isExpanded.set(true);\n    } else {\n      node.hidden = !isNodeVisible;\n    }\n\n    if (!node.hidden) {\n      this.countFilteredOptions++;\n    }\n\n    if (!node.hidden && !node.children) {\n      this.countFilteredLeaves++;\n    }\n\n    return !node.hidden;\n  }\n\n  /**\n   * Filtrer physiquement les noeuds dans le cadre du virtualScroll\n   * /!\\ Le virtualScroll ne permet pas d'utiliser la propriété hidden\n   * Identique à updateNodeVisibility mais supprime au lieu d'utiliser la propriété hidden\n   * @param node Le nœud à filtrer de manière récursive.\n   * @returns le noeud si match, null sinon\n   */\n  private filterNodes(node: DsfrViewNode): DsfrViewNode | null {\n    const isMatch = this._searchFn(node, this.searchText);\n\n    if (isMatch) {\n      this.countFilteredOptions++;\n    }\n\n    if (isMatch && !node.children) {\n      this.countFilteredLeaves++;\n    }\n\n    if (node.children) {\n      // Filtrer récursivement les enfants\n      const filteredChildren = node.children\n        .map((child) => this.filterNodes(child))\n        .filter((child) => child !== null) as DsfrViewNode[];\n\n      // match ou un des enfants match\n      if (isMatch || filteredChildren.length > 0) {\n        return { ...node, children: isMatch ? node.children : filteredChildren };\n      }\n      return null; // suppression du noeud\n    }\n\n    return isMatch ? node : null;\n  }\n\n  /**\n   * Parcours d'arbre pour mettre a jour la valeur selected des nodes à l'init (DsfrNode[]),\n   * selon les valeurs sélectionnées programmatiquement\n   * @param nodes arbre complet avec selected a mettre a jour\n   * @param value tableau non-vide des noeuds sélectionnés\n   */\n  private setSelectedNodes(nodes: DsfrNode[], value: DsfrNode[]) {\n    nodes.forEach((n) => {\n      // si le noeud courant n'est pas sur une feuille et si on ne peut pas sélectionner les parents, on passe aux enfants\n      if (n.children && this.selectionStrategy !== 'all') {\n        this.setSelectedNodes(n.children, value);\n        return;\n      }\n\n      // recherche du noeud correspondant dans la liste sélectionnée\n      if (this.isSingleMode) {\n        n.selected = this._compareWith(n, value[0]);\n        // n.isSelected.set(this._compareWith(n, value[0]));\n        if (n.selected) return;\n        if (n.children) this.setSelectedNodes(n.children, value);\n      } else {\n        const selected = value.find((o: DsfrNode) => this._compareWith(n, o)) ? true : false;\n        n.selected = selected;\n      }\n    });\n  }\n\n  /**\n   * Calcule si toutes les options visibles et non-disabled sont sélectionnées\n   */\n  private areAllOptionsSelected(): boolean {\n    return this.countFilteredLeaves > 0\n      ? this.selectedOptions.length >= this.countFilteredLeaves\n      : this.selectedOptions.length === this.countLeaves;\n  }\n}\n","<div\n  class=\"fr-select-group dsfrx-select\"\n  [class]=\"messageViewModel() ? 'fr-select-group--' + severityViewModel() : ''\"\n  [ngClass]=\"{\n    'is-open': displayDropdown(),\n    'has-toolbar': showSearch || showSelectAll,\n    'fr-select-group--disabled': disabled,\n  }\">\n  <div class=\"fr-label\" [ngClass]=\"{ 'fr-sr-only': labelSrOnly }\" id=\"{{ selectId }}-label\">\n    @if (label) {\n      {{ label }}\n    } @else {\n      <ng-content select=\"[label]\"></ng-content>\n    }\n    @if (hint) {\n      <span class=\"fr-hint-text\">{{ hint }}</span>\n    }\n  </div>\n\n  <edu-dropdown-container\n    [displayDropdown]=\"displayDropdown()\"\n    [appendTo]=\"appendTo\"\n    [classToWrap]=\"'dsfrx-select__combobox'\"\n    [autofocus]=\"true\"\n    [hasToolBar]=\"showSearch || showSelectAll\"\n    [zIndex]=\"zIndex\"\n    [scrollHeight]=\"scrollHeight\"\n    [autoWidthDropdown]=\"autoWidthDropdown\"\n    [indexFirstSelected]=\"indexFirstSelected\"\n    (hideList)=\"hide()\"\n    [id]=\"selectId\"\n    (focusOnList)=\"handleListFocus()\"\n    [virtualScroll]=\"virtualScroll\"\n    [hasOptions]=\"optionsFilter().length > 0\">\n    <!-- Control input -->\n    <div\n      ngProjectAs=\"control\"\n      ngDefaultControl\n      [(ngModel)]=\"value\"\n      id=\"{{ selectId }}\"\n      [attr.tabindex]=\"disabled ? -1 : 0\"\n      role=\"combobox\"\n      (click)=\"toggleDropdown($event)\"\n      (keydown)=\"onButtonKeyDown($event)\"\n      aria-haspopup=\"listbox\"\n      [ngClass]=\"{ 'fr-select--disabled': disabled }\"\n      [disabled]=\"disabled\"\n      [attr.aria-controls]=\"selectId + '-listbox'\"\n      [attr.aria-expanded]=\"displayDropdown()\"\n      [attr.aria-invalid]=\"ariaInvalid || null\"\n      [attr.aria-required]=\"ariaRequired || null\"\n      [attr.aria-labelledby]=\"selectId + '-label'\"\n      [attr.aria-describedby]=\"combinedAriaDescribedBy()\"\n      class=\"fr-select\">\n      <edu-select-input-label\n        [clearableOptions]=\"clearableOptions\"\n        [maxDisplayOptions]=\"maxDisplayOptions\"\n        [selectedOptionTemplate]=\"selectedOptionTemplate\"\n        [placeHolder]=\"placeHolder\"\n        [selectedOptions]=\"selectedOptions\"\n        [maxDisplayOptionsTemplate]=\"maxDisplayOptionsTemplate\"\n        (clearOptionSelect)=\"clearOption($event)\"\n        (clearAllOptionsSelect)=\"clearAllOptions()\">\n      </edu-select-input-label>\n    </div>\n\n    <!-- If toolbar is shown --------------------------------------------------------------------------->\n    <ng-container toolbar>\n      <edu-list-toolbar\n        [maxSelectedOptions]=\"maxSelectedOptions\"\n        [showSelectAll]=\"showSelectAll\"\n        [isAllSelected]=\"isAllSelected()\"\n        [showSearch]=\"showSearch\"\n        [selectId]=\"selectId\"\n        [showClearSearch]=\"showClearSearch\"\n        [searchMessage]=\"searchMessage\"\n        [nbFilterResults]=\"countFilteredOptions\"\n        [(ngModel)]=\"searchText\"\n        (selectAll)=\"selectAll()\"\n        (valueChange)=\"onSearch()\"\n        (cleared)=\"resetSearchInput()\">\n      </edu-list-toolbar>\n    </ng-container>\n\n    @if (virtualScroll) {\n      <!-- Template de listbox (options) en virtual scroll ----------------------------------------------------------->\n      <div\n        #listbox\n        id=\"{{ selectId }}-listbox\"\n        [ngStyle]=\"{ 'z-index': zIndex }\"\n        [style.max-height]=\"scrollHeight\"\n        class=\"dsfrx-treeselect__list dsfrx-treeselect__list--has-viewport\">\n        <cdk-virtual-scroll-viewport\n          #viewport\n          minBufferPx=\"200\"\n          maxBufferPx=\"600\"\n          [itemSize]=\"virtualScrollItemHeight\"\n          class=\"viewport\">\n          <ul role=\"tree\" [attr.aria-multiselectable]=\"!this.isSingleMode\">\n            <!-- add tree node-->\n            <li\n              #treeNode\n              role=\"treeitem\"\n              [id]=\"selectId + '-item-' + node.id\"\n              [class.leaf]=\"!node.children\"\n              [attr.aria-expanded]=\"node.children?.length ? node.isExpanded() : null\"\n              [class.selected]=\"node.isSelected()\"\n              [attr.aria-selected]=\"node.isSelected() ?? false\"\n              [attr.aria-disabled]=\"node.disabled\"\n              [attr.aria-level]=\"node.ariaLevel\"\n              [attr.aria-setsize]=\"node.ariaSize\"\n              [attr.aria-posinset]=\"node.ariaPosinset\"\n              [attr.data-id]=\"node.id\"\n              (keydown)=\"onNodeKeydown(node, $event)\"\n              tabindex=\"-1\"\n              class=\"tree-node-content tree-node-container\"\n              *cdkVirtualFor=\"let node of visibleNodes; let i = index; trackBy: trackById\">\n              <ng-container\n                [ngTemplateOutlet]=\"nodeContentTemplate\"\n                [ngTemplateOutletContext]=\"{ node: node }\"></ng-container>\n            </li>\n          </ul>\n        </cdk-virtual-scroll-viewport>\n      </div>\n    } @else {\n      <!-- Template de listbox (options) SANS virtual scroll ----------------------------------------------------------->\n      <ul\n        #listbox\n        id=\"{{ selectId }}-listbox\"\n        [ngStyle]=\"{ 'z-index': zIndex }\"\n        role=\"tree\"\n        tabindex=\"-1\"\n        [style.max-height]=\"scrollHeight\"\n        [attr.aria-multiselectable]=\"!this.isSingleMode\"\n        class=\"dsfrx-treeselect__list\"\n        [ngClass]=\"{ 'select-parent': selectionStrategy === 'all', 'expandable': selectionStrategy === 'leaf' }\">\n        @for (node of optionsFilter(); track trackById(i, node); let i = $index) {\n          @if (!node.hidden) {\n            <ng-container [ngTemplateOutlet]=\"nodeTemplate\" [ngTemplateOutletContext]=\"{ node: node }\"></ng-container>\n          }\n        }\n      </ul>\n    }\n\n    <!-- Empty list after search filter -->\n    <div aria-live=\"polite\" ngProjectAs=\"empty\" class=\"dsfrx-select__list dsfrx-select__list--empty\">\n      @if (loading) {\n        <p>\n          <span class=\"label\"> {{ 'multiselect.loading' | dsfrI18n }}...</span>\n        </p>\n      } @else if (displayDropdown() && (optionsFilter().length === 0 || countFilteredOptions === 0)) {\n        <p>\n          {{ noResultsMessage ?? ('multiselect.noResult' | dsfrI18n) }}\n        </p>\n      }\n    </div>\n  </edu-dropdown-container>\n  <div [id]=\"messagesGroupId\" class=\"fr-messages-group\" aria-live=\"polite\">\n    @if (messageViewModel()) {\n      <p [eduMessageSeverity]=\"severityViewModel()\">\n        {{ messageViewModel() }}\n      </p>\n    }\n  </div>\n</div>\n\n<!-- Liste of child nodes -->\n<ng-template #nodesTemplate let-nodes=\"nodes\">\n  <ul role=\"group\" class=\"tree-node\">\n    @for (nodeChild of nodes; track trackById(i, nodeChild); let i = $index) {\n      @if (!nodeChild.hidden) {\n        <ng-container\n          [ngTemplateOutlet]=\"nodeTemplate\"\n          [ngTemplateOutletContext]=\"{ node: nodeChild, index: i }\"></ng-container>\n      }\n    }\n  </ul>\n</ng-template>\n\n<!-- Template one node -->\n<ng-template #nodeTemplate let-node=\"node\" let-i=\"index\">\n  <li\n    #treeNode\n    role=\"treeitem\"\n    (keydown)=\"onNodeKeydown(node, $event)\"\n    [id]=\"selectId + '-item-' + node.id\"\n    class=\"tree-node-content tree-node-container\"\n    [class.leaf]=\"!node.children\"\n    tabindex=\"-1\"\n    [attr.aria-expanded]=\"node.children?.length ? node.isExpanded() : null\"\n    [class.selected]=\"node.isSelected()\"\n    [attr.aria-level]=\"node.ariaLevel\"\n    [attr.aria-setsize]=\"node.ariaSize\"\n    [attr.aria-posinset]=\"node.ariaPosinset\"\n    [attr.aria-selected]=\"node.isSelected() ?? false\"\n    [attr.aria-disabled]=\"node.disabled\"\n    [attr.data-id]=\"node.id\">\n    <ng-container [ngTemplateOutlet]=\"nodeContentTemplate\" [ngTemplateOutletContext]=\"{ node: node }\"></ng-container>\n  </li>\n</ng-template>\n\n<!-- Template inside content of node -->\n<ng-template #nodeContentTemplate let-node=\"node\">\n  <div\n    class=\"tree-node-content-inside\"\n    [class.selectable]=\"isSelectable()\"\n    [class.selected]=\"node.isSelected()\"\n    [class.disabled]=\"node.disabled\">\n    <!-- Bouton collapse / expand -->\n    @if (node.children) {\n      <span\n        (click)=\"onNodeButton(node)\"\n        class=\"tree-button\"\n        [class]=\"!node.isExpanded() ? 'fr-icon-arrow-right-s-line' : 'fr-icon-arrow-down-s-line'\"></span>\n    }\n\n    <div\n      class=\"tree-node-label\"\n      [ngClass]=\"{\n        hoverable: (node.children && selectionStrategy === 'all') || showCheckboxes || !node.children,\n      }\">\n      <!-- Label seul -->\n      @if (!showCheckboxes) {\n        <label\n          (click)=\"node.children && selectionStrategy === 'leaf' ? onNodeButton(node) : onOptionClick($event, node)\"\n          class=\"fr-label\"\n          [ngClass]=\"{ 'fr-label--disabled': node.disabled }\">\n          @if (optionTemplate) {\n            <!-- Slot -->\n            <span class=\"text-node\"\n              ><ng-container *ngTemplateOutlet=\"optionTemplate; context: { $implicit: node }\"></ng-container\n            ></span>\n          } @else {\n            @if (node.icon) {\n              <span [class]=\"node.icon + ' fr-icon--sm'\">&nbsp;</span>\n            }\n            <span class=\"text-node\">{{ node.label }}</span>\n          }\n        </label>\n      } @else {\n        <!-- Checkbox + label -->\n        <edu-checkbox-light\n          [id]=\"'cb-' + node.id\"\n          [disabled]=\"node.disabled\"\n          [tabIndex]=\"-1\"\n          [icon]=\"node.icon\"\n          [label]=\"optionTemplate ? undefined : node.label\"\n          (checkboxClick)=\"onOptionClick($event, node)\"\n          [selected]=\"node.isSelected()\">\n          @if (optionTemplate) {\n            <ng-container label\n              ><ng-container *ngTemplateOutlet=\"optionTemplate; context: { $implicit: node }\"></ng-container\n            ></ng-container>\n          }\n        </edu-checkbox-light>\n      }\n    </div>\n  </div>\n\n  <!-- Children -->\n  @if (node.children && node.isExpanded()) {\n    <ng-container\n      [ngTemplateOutlet]=\"nodesTemplate\"\n      [ngTemplateOutletContext]=\"{ nodes: node.children }\"></ng-container>\n  }\n</ng-template>\n","import { Component, EventEmitter, model, Output, ViewEncapsulation } from '@angular/core';\n\n/**\n * Composant d'affichage du bouton de tri pour une colonne (icônes flêche)\n */\n@Component({\n  selector: 'edu-expand-arrow-node',\n  encapsulation: ViewEncapsulation.None,\n  template: `\n    <span class=\"tree-button\" [class]=\"collapsed() ? 'fr-icon-arrow-down-s-line' : 'fr-icon-arrow-right-s-line'\"></span>\n  `,\n})\nexport class ExpandArrowNodeComponent {\n  @Output() expandChange = new EventEmitter<boolean>();\n  collapsed = model(false);\n\n  /**\n   * Clic déplacé sur le premier TD au lieu de la fleche\n   */\n  public onNodeButton() {\n    this.collapsed.set(!this.collapsed());\n    this.expandChange.emit(this.collapsed());\n  }\n}\n","import { InjectionToken } from '@angular/core';\nimport { DsfrViewNode } from '../shared/utils';\n\nexport interface DsfrTreeTableContext {\n  selectNode(node: DsfrViewNode, event: Event): void;\n  refreshRenderAfterExpand(): void;\n}\n\nexport const DSFR_TREETABLE_CONTEXT = new InjectionToken<DsfrTreeTableContext>('DSFR_TREETABLE_CONTEXT');\n","import {\n  ComponentRef,\n  DestroyRef,\n  Directive,\n  effect,\n  ElementRef,\n  HostBinding,\n  inject,\n  Input,\n  OnDestroy,\n  Renderer2,\n  ViewContainerRef,\n} from '@angular/core';\nimport { DsfrViewNode } from '../../shared/utils';\nimport { ExpandArrowNodeComponent } from '../component/expand-arrow-node.component';\nimport { DSFR_TREETABLE_CONTEXT } from '../treetable.context';\n\n/**\n * Directive row node sur une ligne <tr> correspondant à un noeud.\n * Gère l'etat collapse/expand (avec bouton flêche) et les attributs aria nécessaires au table\n */\n@Directive({\n  selector: '[dsfrRowNode]',\n  standalone: true,\n})\nexport class DsfrRowNodeDirective implements OnDestroy {\n  @Input({ required: true }) node!: DsfrViewNode;\n\n  protected viewContainer = inject(ViewContainerRef);\n  protected renderer = inject(Renderer2);\n  protected element = inject(ElementRef);\n  protected readonly destroyRef = inject(DestroyRef);\n\n  /** Dépendance vers la méthode onExpandedNode() de treeTableComponent */\n  protected readonly treeTableContext = inject(DSFR_TREETABLE_CONTEXT, { optional: false });\n\n  private firstTd: HTMLElement | undefined;\n\n  private _unlisten: { (): void }[] = [];\n  private componentExpandRef: ComponentRef<ExpandArrowNodeComponent> | undefined;\n\n  constructor() {\n    // A la modification de isExpanded sur le node\n    effect(() => {\n      if (this.componentExpandRef && this.node.children) {\n        this.updateExpansionButton(); // nécessaire pour la maj du bouton fleche sur tout déplier / tout replier\n      } else if (!this.componentExpandRef && this.node) {\n        this.firstTd = this.initFirstCell();\n\n        if (this.firstTd && this.node.children) {\n          this.firstTd.classList.add('is-parent');\n          this.createExpansionButton(this.firstTd);\n        }\n      }\n    });\n  }\n\n  @HostBinding('attr.aria-posinset')\n  get ariaPosinset(): number | null {\n    return this.node.ariaPosinset ?? null;\n  }\n\n  @HostBinding('attr.aria-level')\n  get ariaLevel(): number | null {\n    return this.node.ariaLevel ?? null;\n  }\n\n  @HostBinding('attr.aria-setsize')\n  get ariaSetsize(): number | null {\n    return this.node.ariaSize ?? null;\n  }\n\n  public ngOnDestroy(): void {\n    this._unlisten.forEach((unlistenFunc) => unlistenFunc());\n    this.destroyButton();\n  }\n\n  private updateExpansionButton() {\n    if (this.componentExpandRef?.instance && this.node.children?.length) {\n      this.componentExpandRef?.instance.collapsed.set(this.node.isExpanded());\n    }\n  }\n\n  private initFirstCell(): HTMLElement | undefined {\n    const firstTd: HTMLElement = this.element.nativeElement?.querySelector('td');\n    if (!firstTd) return undefined;\n    firstTd.style.setProperty('--tree-grid-level', '' + this.node.ariaLevel);\n    firstTd.classList.add('row-node');\n\n    return firstTd;\n  }\n\n  private createExpansionButton(firstTd: HTMLElement) {\n    this.componentExpandRef = this.viewContainer.createComponent<ExpandArrowNodeComponent>(ExpandArrowNodeComponent);\n    this.componentExpandRef.instance.collapsed.set(this.node.isExpanded()); // état initial du collapse\n\n    this._unlisten.push(\n      // Ajout des évènements expand/collapse au clavier sur le premier <td>\n      this.renderer.listen(firstTd, 'keydown', (e: KeyboardEvent) => {\n        if (e.code === 'Enter' || e.code === 'Space') {\n          e.preventDefault();\n          this.updateExpandedState();\n        }\n      }),\n\n      // Ajout des évènements expand/collapse au clic sur le premier <td>\n      this.renderer.listen(firstTd, 'click', (e: KeyboardEvent) => {\n        this.updateExpandedState();\n      }),\n    );\n\n    // Ajoute le bouton au début du premier <td>\n    const buttonArrowComp = this.componentExpandRef.location.nativeElement;\n    firstTd.setAttribute('tabindex', '0');\n    firstTd.setAttribute('aria-expanded', 'false');\n\n    this.renderer.insertBefore(firstTd, buttonArrowComp, firstTd.firstChild);\n  }\n\n  private updateExpandedState() {\n    if (this.node.children?.length) {\n      this.node.isExpanded.update((c) => !c);\n      this.componentExpandRef?.instance.collapsed.set(this.node.isExpanded());\n      if (this.firstTd) {\n        this.firstTd.setAttribute('aria-expanded', String(this.node.isExpanded()));\n      }\n      this.treeTableContext.refreshRenderAfterExpand();\n    } else {\n      this.firstTd?.setAttribute('aria-expanded', '');\n    }\n\n    this.firstTd?.setAttribute('tabindex', '0');\n  }\n\n  private destroyButton(): void {\n    this.componentExpandRef?.destroy();\n    this.componentExpandRef = undefined;\n  }\n}\n","import {\n  ComponentRef,\n  Directive,\n  effect,\n  EventEmitter,\n  HostBinding,\n  inputBinding,\n  OnDestroy,\n  Output,\n  outputBinding,\n} from '@angular/core';\nimport { EduCheckboxLightComponent } from '@edugouvfr/ngx-dsfr';\nimport { DsfrViewNode } from '../../shared/utils';\nimport { DsfrRowNodeDirective } from './row-node.directive';\n\n/**\n * Directive étendue de row node, select sur une ligne <tr> correspondant à un noeud.\n * Gère la sélection avec checkbox\n */\n@Directive({\n  selector: '[dsfrRowNodeSelect]',\n  standalone: true,\n})\nexport class DsfrRowNodeSelectDirective extends DsfrRowNodeDirective implements OnDestroy {\n  @Output() nodeSelect = new EventEmitter<{ node: DsfrViewNode; event: Event }>();\n\n  private componentCheckboxRef: ComponentRef<EduCheckboxLightComponent> | undefined;\n\n  constructor() {\n    super();\n    // A la création de la row\n    effect(() => {\n      if (!this.componentCheckboxRef && this.node) {\n        this.createCheckbox();\n      }\n    });\n  }\n\n  @HostBinding('attr.aria-selected')\n  get ariaSelected(): string {\n    return String(!!this.node.isSelected());\n  }\n\n  /**\n   * Creation du composant edu-checkbox dans la premiere cellule de ligne\n   * Ajout de l'evenement clic\n   */\n  private createCheckbox(): void {\n    this.componentCheckboxRef = this.createCheckboxComponent();\n    const checkboxEl: HTMLElement = this.componentCheckboxRef.location.nativeElement as HTMLElement;\n\n    // Creation de la cellule contenant la checkbox (th)\n    const th: HTMLElement = this.renderer.createElement('th');\n    this.renderer.setAttribute(th, 'scope', 'row');\n    this.renderer.addClass(th, 'fr-cell--fixed');\n    th.appendChild(checkboxEl);\n\n    // Ajout du th avec checkbox\n    const host = this.element.nativeElement;\n    host.insertBefore(th, host.firstChild);\n  }\n\n  private createCheckboxComponent(): ComponentRef<EduCheckboxLightComponent> {\n    return this.viewContainer.createComponent(EduCheckboxLightComponent, {\n      bindings: [\n        inputBinding('disabled', () => this.node.disabled),\n        inputBinding('tabIndex', () => -1),\n        inputBinding('labelSrOnly', () => true),\n        inputBinding('id', () => 'cb-' + this.node.id),\n        inputBinding('label', () => this.node.label),\n        inputBinding('selected', () => this.node.isSelected()),\n        outputBinding('checkboxClick', (event: Event) => this.treeTableContext.selectNode(this.node, event)),\n      ],\n    });\n  }\n}\n","import {\n  booleanAttribute,\n  Component,\n  ContentChild,\n  EventEmitter,\n  input,\n  Input,\n  Output,\n  TemplateRef,\n  ViewChild,\n} from '@angular/core';\nimport {\n  DsfrColumn,\n  DsfrOption,\n  DsfrSegmentedControl,\n  DsfrSortColumn,\n  DsfrTableOptions,\n  DsfrTablePaginationEvent,\n  DsfrTableState,\n} from '@edugouvfr/ngx-dsfr';\n\n/**\n * Classe abstraite permettant de copier les inputs/outputs publics de DsfrTable\n * Sert uniquement de classe tampon entre TreeTable et Table afin de générer une documentation propre\n * Etendre directement d'un BaseTable de la lib princ. casserait la génération des inputs/outputs dans la doc API de SB\n * /!\\ Ne pas utiliser pour autre chose que la copie directe\n */\n@Component({\n  template: '',\n})\nexport abstract class BaseTreeTableComponent {\n  /** Template pour les groupes de boutons d'actions du header. DOIT contenir un dsfr-buttons-group */\n  @ContentChild('headerActionsTemplate', { static: true }) headerActionsTemplate?: TemplateRef<void>;\n\n  /** Template du résumé dans le cas d'un tableau complexe */\n  @ContentChild('headerSummaryTemplate', { static: true }) headerSummaryTemplate?: TemplateRef<void>;\n\n  /** Template pour personnaliser l'affichage du nombre de lignes sélectionnées */\n  @ContentChild('headerSelectedRowCountTemplate', { static: true }) headerSelectedRowCountTemplate?: TemplateRef<void>;\n\n  /** Template de l'en-tête des colonnes du tableau. (contenu du thead) */\n  @ContentChild('tableHeaderTemplate', { static: true }) tableHeaderTemplate?: TemplateRef<void>;\n\n  /** Template du pied du tableau (contenu du tfoot) */\n  @ContentChild('tableFooterTemplate', { static: true }) tableFooterTemplate?: TemplateRef<void>;\n\n  /** Template personnalisé pour afficher le total de lignes */\n  @ContentChild('footerResultsTemplate', { static: true }) footerResultsTemplate?: TemplateRef<void>;\n\n  /** Template pour les groupes de boutons d'actions du footer */\n  @ContentChild('footerActionsTemplate', { static: true }) footerActionsTemplate?: TemplateRef<void>;\n\n  /** Template à afficher pendant le chargement des données */\n  @ContentChild('loadingTemplate', { static: true }) loadingTemplate?: TemplateRef<void>;\n\n  /** Template pour une vue alternative au tableau (ex. liste) */\n  @ContentChild('alternativeViewTemplate', { static: true }) alternativeViewTemplate?: TemplateRef<void>;\n\n  /** @internal template par défaut pour compter le nombre de lignes sélectionnées */\n  @ViewChild('defaultHeaderSelectedRowCountTemplate', { static: true })\n  defaultHeaderSelectedRowCountTemplate?: TemplateRef<void>;\n\n  /** Identifiant de la table */\n  @Input() tableId: string = '';\n\n  /** Titre du tableau. Obligatoire sauf si labelledBy est renseigné. */\n  @Input() caption?: string;\n\n  /** Hauteur maximale de la table, nombre en pixels ou valeur en string. Le contenu supplémentaire provoque un scroll vertical */\n  @Input() fixedHeight?: number | string;\n\n  /** Rend les th sticky en haut du tableau. */\n  @Input() thSticky = false;\n\n  /** Le composant se bloquera au top de l'écran et prendra toute sa hauteur.*/\n  @Input() tableHeaderSticky = false;\n\n  /** Options d'affichage du tableau  */\n  @Input() tableOptions: DsfrTableOptions = {};\n\n  /** Définition des colonnes */\n  @Input({ required: true }) columns!: DsfrColumn[];\n\n  /** Afficher le nombre de résultat total dans le footer */\n  @Input() showFooterResult = true;\n\n  /** Message affiché en cas de tableau vide ('Aucun résultat' par défaut) */\n  @Input() emptyResultsMessage?: string;\n\n  /** Indique que les données sont en cours de chargement */\n  @Input() loading = false;\n\n  /** Header: affiche la barre de recherche dans le header */\n  @Input() showSearch = false;\n\n  /** Valeur du placeholder de l'input de recherche, si showSearch est `true`. */\n  @Input() searchInputPlaceholder?: string;\n\n  /** Valeur du title du bouton de la barre de recherche, si showSearch est `true`. */\n  @Input() searchButtonTitle?: string;\n\n  /** Valeur de la barre de recherche, si `showSearch` est à `true`. */\n  @Input() searchInputValue?: string;\n\n  /** Label (pour les lecteurs d'écrans) de l'input de recherche. */\n  @Input() searchLabel?: string;\n\n  /** Header: affiche le changement de type de vue (tableau / liste) */\n  @Input() showHeaderViews = false;\n\n  /** Header: redéfinit les vues du contrôle segmenté (si showHeaderViews). Par défaut tableau/liste */\n  @Input() headerViewsOptions: DsfrSegmentedControl[] = [\n    {\n      label: 'Tableau',\n      value: 'TABLE',\n      checked: true,\n      icon: 'fr-icon-table-line',\n    },\n    {\n      label: 'Liste',\n      value: 'LIST',\n      icon: 'fr-icon-list-unordered',\n    },\n  ];\n\n  /** Etat initial de la table à appliquer (tri, page et nombre de lignes affichées par page) */\n  @Input() initialState: DsfrTableState | undefined;\n\n  /** Afficher la pagination */\n  @Input({ transform: booleanAttribute }) pagination: boolean = false;\n\n  /** Activer le mode serveur (pagination, tri et sélection côté serveur) */\n  @Input({ transform: booleanAttribute }) serverSide: boolean = false;\n\n  /** Choix de taille de page (par défaut 10, 20, 50, 100). Pas d'affichage du select si non défini */\n  @Input()\n  rowsPerPageOptions: DsfrOption[] = [\n    { label: '10 lignes par page', value: 10 },\n    { label: '20 lignes par page', value: 20 },\n    { label: '50 lignes par page', value: 50 },\n    { label: '100 lignes par page', value: 100 },\n  ];\n\n  /** Changement de pagination (page affichée ou taille de page) */\n  @Output() paginationChange: EventEmitter<DsfrTablePaginationEvent> = new EventEmitter<{\n    currentPage: number;\n    rowsPerPage: number;\n  }>();\n\n  /** Etat modifié */\n  @Output() readonly stateChange: EventEmitter<DsfrTableState> = new EventEmitter<DsfrTableState>();\n\n  /** Renvoie la vue sélectionnée au changement de vue (displayModes) */\n  @Output() readonly viewSelect: EventEmitter<string> = new EventEmitter<string>(); // ou displayList\n\n  /** Renvoie la valeur de l'input de la barre de recherche au changement.  */\n  @Output() readonly searchChange: EventEmitter<string> = new EventEmitter();\n\n  /** Renvoie la valeur de l'input de la barre de recherche au clic sur rechercher.  */\n  @Output() readonly searchSelect: EventEmitter<string> = new EventEmitter();\n\n  /** Renvoie la colonne triée au changement de tri de la table */\n  @Output() readonly sortChange: EventEmitter<DsfrSortColumn | null> = new EventEmitter<DsfrSortColumn | null>();\n\n  /** Total du nombre de résultats (utilisé si serverSide) */\n  serverResultsLength = input<number>(0);\n\n  /** @internal */\n  get resolvedHeaderSelectedRowCountTemplate(): TemplateRef<any> | undefined {\n    return this.headerSelectedRowCountTemplate ?? this.defaultHeaderSelectedRowCountTemplate;\n  }\n\n  /** @internal */\n  public onViewSelect(value: string): void {\n    this.viewSelect.emit(value);\n  }\n\n  /** @internal */\n  public onSortChange(value: any): void {\n    this.sortChange.emit(value);\n  }\n\n  /** @internal */\n  public onStateChange(value: DsfrTableState): void {\n    this.stateChange.emit(value);\n  }\n\n  /** @internal */\n  public onSearchChange(search: string): void {\n    this.searchChange.emit(search);\n  }\n\n  /** @internal */\n  public onSearchSelect(search: string): void {\n    this.searchSelect.emit(search);\n  }\n\n  /** @internal */\n  public onPaginationChange(event: DsfrTablePaginationEvent): void {\n    this.paginationChange.emit(event);\n  }\n}\n","export const MESSAGES_EN = {\n  treetable: {\n    noSelectedElements: 'No selected elements',\n    oneSelectedElement: 'selected element',\n    selectedElements: 'selected elements',\n  },\n};\n","// Ordre alphabétique requis\nexport const MESSAGES_FR = {\n  treetable: {\n    noSelectedElements: 'Aucun élément sélectionné',\n    oneSelectedElement: 'élément sélectionné',\n    selectedElements: 'éléments sélectionnés',\n  },\n};\n","import { CommonModule } from '@angular/common';\nimport {\n  afterNextRender,\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  Component,\n  ContentChild,\n  ElementRef,\n  EventEmitter,\n  inject,\n  Input,\n  OnInit,\n  Output,\n  signal,\n  TemplateRef,\n  viewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n  DsfrDataTableModule,\n  DsfrDataTableService,\n  DsfrI18nPipe,\n  DsfrI18nService,\n  DsfrTableComponent,\n  Language,\n} from '@edugouvfr/ngx-dsfr';\nimport { DsfrSelectionModeConst } from '../shared/models/selection-mode.type';\nimport { TreeFocusable, TreeFocusManager } from '../shared/utils/tree/tree-focus-manager';\nimport { TreeSelectable, TreeSelectManager } from '../shared/utils/tree/tree-select-manager';\nimport { DsfrNode, DsfrViewNode } from '../shared/utils/tree/tree.model';\nimport { DsfrNodeEvent, DsfrTreeNodeEvent } from '../tree/tree.component';\nimport { BaseTreeTableComponent } from './base-treetable.component';\nimport { DsfrRowNodeSelectDirective } from './directive/row-node-select.directive';\nimport { DsfrRowNodeDirective } from './directive/row-node.directive';\nimport { MESSAGES_EN } from './i18n/messages.en';\nimport { MESSAGES_FR } from './i18n/messages.fr';\nimport { DSFR_TREETABLE_CONTEXT } from './treetable.context';\n\n/**\n * Interface utilisée pour le contexte du template nodeRowTemplate\n */\nexport interface DsfrRowNodeContext {\n  $implicit: DsfrViewNode;\n  index: number;\n}\n\n@Component({\n  selector: 'dsfr-ext-treetable, dsfrx-treetable',\n  templateUrl: './treetable.component.html',\n  styleUrls: ['./treetable.component.scss'],\n  encapsulation: ViewEncapsulation.None,\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [\n    DsfrDataTableService,\n    {\n      provide: DSFR_TREETABLE_CONTEXT,\n      useExisting: DsfrTreetableComponent,\n    },\n  ],\n  imports: [\n    CommonModule,\n    FormsModule,\n    DsfrDataTableModule,\n    DsfrRowNodeDirective,\n    DsfrI18nPipe,\n    DsfrRowNodeSelectDirective,\n  ],\n})\nexport class DsfrTreetableComponent\n  extends BaseTreeTableComponent\n  implements TreeFocusable, TreeSelectable, AfterViewInit, OnInit\n{\n  /** Template pour personnaliser une ligne correspondant à un noeud. Doit représenter un <tr> */\n  @ContentChild('nodeRowTemplate', { static: true }) nodeRowTemplate?: TemplateRef<DsfrRowNodeContext>;\n\n  /** Indique un changement sur la sélection. Renvoie le noeud concerné et liste des noeuds (feuilles) sélectionnés */\n  @Output() selectionChange = new EventEmitter<DsfrTreeNodeEvent>();\n\n  /** Indique le changement d'état d'un nœud. */\n  @Output() nodeSelect = new EventEmitter<DsfrNodeEvent>();\n\n  /**@internal */\n  datatable = viewChild('datatable', { read: DsfrTableComponent });\n\n  /** @internal */\n  isAllSelected = signal(false);\n\n  /** @internal */\n  focusedNodeId = signal<string | undefined>(undefined); // Géré par TreeFocusManager\n\n  protected countSelectedNodes = signal(0);\n  protected viewNodes = signal<DsfrViewNode[]>([]);\n  protected countLeaves: number = 0;\n\n  private elementRef = inject(ElementRef);\n  private selectManager = new TreeSelectManager(this);\n  private focusManager = new TreeFocusManager(this);\n  private firstInit = true;\n  private hasFixedColumns = false;\n\n  private _data: DsfrNode[] = []; // sauvegarde des données en entrée\n\n  private i18n = inject(DsfrI18nService);\n\n  constructor() {\n    super();\n    this.i18n.extendsLabelsBundle(Language.EN, MESSAGES_EN);\n    this.i18n.extendsLabelsBundle(Language.FR, MESSAGES_FR);\n\n    afterNextRender(() => {\n      if (this.tableOptions.selectable) {\n        this.selectManager.finalizeCheckboxState(this.viewNodes());\n        this.countSelectedNodes.set(this.selectManager.selectedNodes.length);\n\n        if (this.tableOptions.showSelectAll && this.datatable() && this.firstInit) {\n          // Mise a jour de la checkbox select all (état indéterminé) a la premiere initialisation\n          this.setIsAllSelected();\n          this.firstInit = false;\n        }\n      }\n    });\n  }\n\n  /** Noeuds sélectionnés */\n  get selectedNodes(): DsfrViewNode[] {\n    return this.selectManager.selectedNodes;\n  }\n\n  /** Noeuds affichés */\n  get nodes(): DsfrViewNode[] {\n    return this.viewNodes();\n  }\n\n  /** Données sous forme d'arbre DsfrNode[] */\n  @Input() set data(val: DsfrNode[]) {\n    this._data = val;\n    if (this.viewNodes().length === 0) {\n      this.selectManager.selectionMode = this.tableOptions.selectable\n        ? (this.selectManager.selectionMode = DsfrSelectionModeConst.CHECKBOX)\n        : undefined;\n      this.viewNodes.set(this.selectManager.init(val));\n      this.countLeaves = this.selectManager.countLeaves;\n    } else {\n      // mise à jour avec conservation des états d'expansion et de sélection (si noeuds fournis avec identifiants)\n      this.viewNodes.set(this.selectManager.updateNodesContent(val, this.viewNodes(), 1));\n    }\n  }\n\n  ngOnInit(): void {\n    this.tableOptions.role = 'treegrid'; // forcer role\n    if (this.columns.some((c) => c.fixed)) {\n      this.hasFixedColumns = true;\n    }\n  }\n\n  ngAfterViewInit() {\n    // Mise à jour des tabindex\n    this.selectManager.selectionMode = DsfrSelectionModeConst.CHECKBOX;\n    this.focusManager.initTabindex();\n  }\n\n  // Méthodes exposées ------------------------------------------------------------------------------------------------/\n\n  /** Etendre tous les noeuds de l'arborescence. */\n  public expandAll(): void {\n    this.viewNodes.update((nodes) => this.focusManager.expandNodesRecursive(nodes, true));\n    this.refreshRenderAfterExpand();\n  }\n\n  /** Etendre les noeuds de l'arborescence jusqu'au niveau précisé */\n  public expandLevel(level: number): void {\n    this.viewNodes.update((nodes) => this.focusManager.expandNodesRecursive(nodes, true, level));\n    this.refreshRenderAfterExpand();\n  }\n\n  /** Fermer tous les nœuds de l'arborescence.  */\n  public collapseAll(): void {\n    this.viewNodes.update((nodes) => this.focusManager.expandNodesRecursive(nodes, false));\n    this.refreshRenderAfterExpand();\n  }\n\n  /**\n   * Mise a jour du contenu de l'arbre. Conserve l'état (nœuds étendus et sélectionnés) si l'id des nœuds est renseigné.\n   * Permet de forcer la mise à jour\n   */\n  public updateContent(): void {\n    const updated = this.selectManager.updateNodesContent(this._data, this.viewNodes(), 1);\n    this.viewNodes.set(updated);\n    this.refreshRenderAfterExpand();\n  }\n\n  /** Sélectionner ou déselectionner tous les noeuds\n   * @param selected sélectionner/déselectionner\n   */\n  public selectAll(selected: boolean): void {\n    this.selectManager.selectAllNodes(this.nodes, selected);\n    this.selectionChange.emit({ node: null, nodesSelected: this.selectManager.selectedNodes });\n    this.countSelectedNodes.set(this.selectManager.selectedNodes.length);\n\n    if (this.tableOptions.showSelectAll) this.setIsAllSelected();\n  }\n\n  //  Tree focusable manager ------------------------------------------------------------------------------------------/\n\n  /** @internal */\n  doNodeDefaultAction(node: DsfrViewNode, event: Event): void {\n    /*const nodeElt = <HTMLElement>event.currentTarget;\n    if (!node.children) {\n      this.selectManager.doSelectNode(node, nodeElt);\n    } else {\n      this.focusManager.doToggleExpand(node);\n    }*/\n  }\n\n  /**\n   * Trouver tous les noeuds <li> visibles (possèdent une hauteur minimale).\n   * @internal\n   */\n  findVisibleNodesElt(): HTMLElement[] {\n    const nativeElt = this.elementRef.nativeElement;\n    const nodeList = nativeElt.querySelectorAll('.tree-node-content');\n    const nodesArr: HTMLElement[] = [];\n\n    nodeList.forEach((n: HTMLElement) => nodesArr.push(n));\n\n    return nodesArr;\n  }\n\n  /** Retourne l'élément avec focus ou undefined.\n   * @internal */\n  findFocusElement(): HTMLElement | undefined {\n    return this.elementRef.nativeElement.querySelector('.tree-node-content:focus') || undefined;\n  }\n\n  // Tree select manager ----------------------------------------------------------------------------------------------/\n\n  /** @internal */\n  notifySelectEvent(node: DsfrNode): void {\n    const { children, ...nodeContent } = node;\n    this.nodeSelect.emit(<DsfrNodeEvent>nodeContent);\n    this.selectionChange.emit({\n      node: nodeContent,\n      nodesSelected: this.selectManager.selectedNodes.map((a) => a as DsfrNode),\n    });\n\n    this.countSelectedNodes.set(this.selectManager.selectedNodes.length);\n  }\n\n  /** @internal */\n  updateIndeterminate(node: DsfrViewNode): void {\n    const nativeElt = this.elementRef.nativeElement;\n    const checkboxId = this.getCheckboxId(node);\n    const inputElt = <HTMLInputElement>nativeElt?.querySelector('#' + checkboxId);\n\n    if (inputElt) inputElt.indeterminate = node.isSelected() === undefined;\n  }\n\n  // Methodes non exposées --------------------------------------------------------------------------------------------/\n\n  protected selectNode(node: DsfrViewNode, event: Event): void {\n    this.onNodeSelect(node, event);\n  }\n\n  protected refreshRenderAfterExpand(): void {\n    if (this.hasFixedColumns) {\n      this.datatable()?.dataTableService.forceRenderFixedColums();\n    }\n  }\n\n  /** Réinitialise l'état de l'arbre (nœuds étendus et sélectionnés) et le focus */\n  protected reinitializeState(): void {\n    this.viewNodes.set(this.selectManager.init(this.data));\n    this.selectManager.finalizeCheckboxState(this.viewNodes());\n    this.focusManager.initTabindex();\n  }\n\n  /**\n   * Sélection du label d'un nœud lorsque que l'on a un label sans checkbox. Si le mode est `selectable` :\n   * - on inverse la sélection, uniquement du nœud, on émet un événement.\n   * - maj de la checkbox selectAll\n   */\n  protected onNodeSelect(node: DsfrViewNode, event: Event): void {\n    const nodeElt = <HTMLElement>event.currentTarget;\n    this.selectManager.doSelectNode(node, nodeElt);\n\n    if (this.tableOptions.showSelectAll) {\n      this.setIsAllSelected();\n    }\n  }\n\n  protected onNodeButton(node: DsfrViewNode): void {\n    this.focusManager.doToggleExpand(node);\n  }\n\n  protected onClickSelectHeaderCheckbox(selectAll: boolean) {\n    this.selectAll(selectAll);\n  }\n\n  protected trackById(index: number, item: DsfrNode): string | undefined {\n    return item.id ?? '' + index;\n  }\n\n  protected getCheckboxId(node: DsfrNode): string {\n    return `cb-${node.id}`;\n  }\n\n  /** Mise a jour de la checkbox select all (état indéterminé) **/\n  private setIsAllSelected() {\n    this.isAllSelected.set(this.selectManager.areAllLeavesSelected());\n    this.datatable()?.manuallySetIsAllSelected(this.countSelectedNodes(), this.isAllSelected());\n  }\n}\n","<!-- Tableau fixme: dataKey assigné pour éviter le warning intempestif mais a ne pas utiliser (randomValue)  -->\n<dsfr-datatable\n  #datatable\n  [tableOptions]=\"tableOptions\"\n  [tableId]=\"tableId\"\n  [showFooterResult]=\"true\"\n  [columns]=\"columns\"\n  [caption]=\"caption\"\n  [tableOptions]=\"tableOptions\"\n  [showHeaderViews]=\"showHeaderViews\"\n  [showSearch]=\"showSearch\"\n  [pagination]=\"pagination\"\n  [serverSide]=\"serverSide\"\n  [loading]=\"loading\"\n  [searchButtonTitle]=\"searchButtonTitle\"\n  [searchInputPlaceholder]=\"searchInputPlaceholder\"\n  [searchLabel]=\"searchLabel\"\n  [serverResultsLength]=\"serverResultsLength()\"\n  [tableHeaderSticky]=\"tableHeaderSticky\"\n  [fixedHeight]=\"fixedHeight\"\n  [initialSelection]=\"selectedNodes\"\n  dataKey=\"randomlyAssignedValue\"\n  [thSticky]=\"thSticky\"\n  [headerActionsTemplateRef]=\"headerActionsTemplate\"\n  [headerSummaryTemplateRef]=\"headerSummaryTemplate\"\n  [headerSelectedRowCountTemplateRef]=\"resolvedHeaderSelectedRowCountTemplate\"\n  [tableHeaderTemplateRef]=\"tableHeaderTemplate\"\n  [tableFooterTemplateRef]=\"tableFooterTemplate\"\n  [footerActionsTemplateRef]=\"footerActionsTemplate\"\n  [footerResultsTemplateRef]=\"footerResultsTemplate\"\n  [alternativeViewTemplateRef]=\"alternativeViewTemplate\"\n  [loadingTemplateRef]=\"loadingTemplate\"\n  (viewSelect)=\"onViewSelect($event)\"\n  (stateChange)=\"onStateChange($event)\"\n  (sortChange)=\"onSortChange($event)\"\n  (paginationChange)=\"onPaginationChange($event)\"\n  (searchChange)=\"onSearchChange($event)\"\n  (searchSelect)=\"onSearchSelect($event)\"\n  (showSelectAllChange)=\"onClickSelectHeaderCheckbox($event)\"\n  [data]=\"viewNodes()\">\n  <!-- Template par défaut du nombre de noeuds sélectionnés -->\n  <ng-template #defaultHeaderSelectedRowCountTemplate>\n    @if (countSelectedNodes() === 0) {\n      {{ 'treetable.noSelectedElements' | dsfrI18n }}\n    } @else if (countSelectedNodes() === 1) {\n      {{ countSelectedNodes() }} {{ 'treetable.oneSelectedElement' | dsfrI18n }} / {{ countLeaves }}\n    } @else if (countSelectedNodes() && countSelectedNodes() > 1) {\n      {{ countSelectedNodes() }} {{ 'treetable.selectedElements' | dsfrI18n }} / {{ countLeaves }}\n    }\n  </ng-template>\n\n  <ng-template #tableBodyTemplate let-row let-rowOptions=\"rowOptions\">\n    <!-- Transformation de row en tableau pour réutiliser nodesTemplate -->\n    <ng-container [ngTemplateOutlet]=\"nodesTemplate\" [ngTemplateOutletContext]=\"{ nodes: [row], root: true }\">\n    </ng-container>\n  </ng-template>\n</dsfr-datatable>\n\n<!-- Template récursif pour l'affichage de tous les noeuds ------------------------------------------------------------>\n<ng-template #nodesTemplate let-nodes=\"nodes\" let-root=\"root\">\n  @for (node of nodes; track trackById(i, node); let i = $index) {\n    <ng-container\n      [ngTemplateOutlet]=\"defaultNodeTemplate\"\n      [ngTemplateOutletContext]=\"{ node: node, level: node.ariaLevel, index: i }\">\n    </ng-container>\n\n    @if (node.children && node.isExpanded()) {\n      <ng-container [ngTemplateOutlet]=\"nodesTemplate\" [ngTemplateOutletContext]=\"{ nodes: node.children }\">\n      </ng-container>\n    }\n  }\n</ng-template>\n\n<!-- Template pour l'affichage du contenu d'un noeud ------------------------------------------------------------------->\n<ng-template #defaultNodeTemplate let-node=\"node\" let-i=\"index\">\n  @if (nodeRowTemplate) {\n    <!-- Slot -->\n    <ng-container *ngTemplateOutlet=\"nodeRowTemplate; context: { $implicit: node, index: i }\"> </ng-container>\n  } @else {\n    @if (tableOptions.selectable) {\n      <tr dsfrRowNodeSelect [node]=\"node\">\n        @for (col of columns; track col.field) {\n          <td [dsfrCell]=\"col\">{{ node.data[col.field] }}</td>\n        }\n      </tr>\n    } @else {\n      <tr dsfrRowNode [node]=\"node\">\n        @for (col of columns; track col.field) {\n          <td [dsfrCell]=\"col\">{{ node.data[col.field] }}</td>\n        }\n      </tr>\n    }\n  }\n</ng-template>\n","import { Directive } from '@angular/core';\n\nexport interface DsfrFileActionsContext {\n  $implicit: File;\n  index: number;\n  disabled: boolean;\n}\n\n/**\n * Directive permettant le typage du template `dsfrFileActions`, situé à la fin de la description d'un fichier en cours de\n * téléversation. Le slot correspondant est seulement disponible quand le composant `DsfrUploadDnd` n'est pas en mode `inline`.\n */\n@Directive({\n  selector: 'ng-template[dsfrFileActions]',\n  standalone: true,\n})\nexport class DsfrFileActionsDirective {\n  static ngTemplateContextGuard(dir: DsfrFileActionsDirective, ctx: unknown): ctx is DsfrFileActionsContext {\n    return true;\n  }\n}\n","import { Directive, inject, Input, OnInit } from '@angular/core';\nimport { DsfrButtonComponent, DsfrI18nService } from '@edugouvfr/ngx-dsfr';\n\n/**\n * Directive permettant d'appliquer à un `DsfrButton` l'aspect du bouton de suppression de fichier placé à la fin de la description\n * d'un fichier en cours de téléversation du composant `DsfrUploadDnd`.\n *\n * Cette directive permet d'ajouter aisément ce bouton dans le cas de l'utilisation du slot `dsfrFileActions`.\n *\n * Attention: cette directive ne gère pas le comportement du bouton mais seulement son style. Pour supprimer le fichier,\n * utiliser la méthode `deleteFile` du composant `DsfrUploadDnd`\n */\n@Directive({\n  selector: 'dsfr-button[dsfrFileDeleteBtn]',\n  standalone: true,\n})\nexport class DsfrFileDeleteButtonDirective implements OnInit {\n  @Input({ required: true }) file!: File;\n  private button = inject(DsfrButtonComponent, { host: true });\n  private i18nService = inject(DsfrI18nService);\n\n  constructor() {\n    this.addStyle();\n  }\n\n  ngOnInit(): void {\n    this.addLabelInfo();\n  }\n\n  private addStyle(): void {\n    this.button.type = 'button';\n    this.button.labelSrOnly = true;\n    this.button.variant = 'tertiary-no-outline';\n    this.button.buttonSize = 'SM';\n    this.button.icon = 'fr-icon-delete-line';\n  }\n\n  private addLabelInfo(): void {\n    this.button.tooltipMessage = this.i18nService.t('uploadDnd.fileList.removeFile') + ' ' + this.file.name;\n    this.button.label = this.i18nService.t('uploadDnd.fileList.removeFile') + ' ' + this.file.name;\n  }\n}\n","export enum FileSizeUnitEnum {\n  'OCTETS' = 'octets',\n  'KO' = 'ko',\n  'MO' = 'Mo',\n  'GO' = 'Go',\n  'BYTES' = 'bytes',\n  'KB' = 'kB',\n  'MB' = 'MB',\n  'GB' = 'GB',\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { DsfrFileSizeUnit } from '@edugouvfr/ngx-dsfr';\nimport { FileSizeUnitEnum } from './file-size-unit.model';\n\n@Pipe({\n  name: 'fileDetails',\n  standalone: true,\n})\nexport class FileDetailsPipe implements PipeTransform {\n  kiloOctets = 1024;\n  megaOctets = this.kiloOctets * 1024;\n  gigaOctets = this.megaOctets * 1024;\n  fileSizeUnit = FileSizeUnitEnum;\n\n  transform(value: File, sizeUnit: DsfrFileSizeUnit): string {\n    return this.convertMimeType2FileFormat(value.type) + ' - ' + this.fileSizeToString(value.size, sizeUnit);\n  }\n\n  private convertMimeType2FileFormat(mineType: string): FileFormat | undefined {\n    return mimeType2FileFormat[mineType];\n  }\n\n  private fileSizeToString(bytes: number, sizeUnit?: DsfrFileSizeUnit): string {\n    if (!bytes) return '';\n\n    const bytesUnit = sizeUnit === 'bytes';\n\n    let fileSize: number;\n    let fileSizeUnit: string;\n\n    if (bytes < this.kiloOctets) {\n      fileSize = bytes;\n      fileSizeUnit = bytesUnit ? this.fileSizeUnit.BYTES : this.fileSizeUnit.OCTETS;\n    } else if (bytes < this.megaOctets) {\n      fileSize = bytes / 1024;\n      fileSizeUnit = bytesUnit ? this.fileSizeUnit.KB : this.fileSizeUnit.KO;\n    } else if (bytes < this.gigaOctets) {\n      fileSize = bytes / 1048576;\n      fileSizeUnit = bytesUnit ? this.fileSizeUnit.MB : this.fileSizeUnit.MO;\n    } else {\n      fileSize = bytes / 1073741824;\n      fileSizeUnit = bytesUnit ? this.fileSizeUnit.GB : this.fileSizeUnit.GO;\n    }\n\n    fileSize = Math.round(fileSize * 100) / 100;\n\n    // since 1.8, les options régionales sont prise en compte pour les décimales\n    //FIXME: ne devrait-ton pas transmettre la locale depuis l'extérieur de manière à pouvoir la transmettre depuis i18nService ?\n    const localSize = fileSize.toLocaleString();\n    return localSize + ' ' + fileSizeUnit;\n  }\n}\n\nexport enum DsfrMimeTypeConst {\n  // TEXT\n  TEXT_CSS = 'text/css',\n  TEXT_CSV = 'text/csv',\n  TEXT_HTML = 'text/html',\n  TEXT_CALENDAR = 'text/calendar',\n  TEXT_PLAIN = 'text/plain',\n  TEXT_XML = 'text/xml',\n\n  // FONT\n  FONT_OTF = 'font/otf',\n  FONT_TTF = 'font/ttf',\n  FONT_WOFF = 'font/woff',\n  FONT_WOFF2 = 'font/woff2',\n\n  // IMAGE\n  IMAGE_BMP = 'image/bmp',\n  IMAGE_GIF = 'image/gif',\n  IMAGE_ICON = 'image/x-icon',\n  IMAGE_JPEG = 'image/jpeg',\n  IMAGE_PNG = 'image/png',\n  IMAGE_SVG = 'image/svg+xml',\n  IMAGE_TIFF = 'image/tiff',\n  IMAGE_WEBP = 'image/webp',\n\n  // AUDIO\n  AUDIO_3GPP = 'audio/3gpp',\n  AUDIO_3GPP2 = 'audio/3gpp2',\n  AUDIO_ACC = 'audio/aac',\n  AUDIO_OGG = 'audio/ogg',\n  AUDIO_MIDI = 'audio/midi',\n  AUDIO_WAV = 'audio/x-wav',\n  AUDIO_WEBM = 'audio/webm',\n\n  // VIDEO\n  VIDEO_3GPP = 'video/3gpp',\n  VIDEO_3GPP2 = 'video/3gpp2',\n  VIDEO_MPEG = 'video/mpeg',\n  VIDEO_OGG = 'video/ogg',\n  VIDEO_WEBM = 'video/webm',\n\n  // APPLICATION\n  APPLICATION_ABIWORD = 'application/x-abiword',\n  APPLICATION_CSH = 'application/x-csh',\n  APPLICATION_EPUB = 'application/epub+zip',\n  APPLICATION_FLASH = 'application/x-shockwave-flash',\n  APPLICATION_FORM_URLENCODED = 'application/x-www-form-urlencoded',\n  APPLICATION_JAVASCRIPT = 'application/javascript',\n  APPLICATION_JSON = 'application/json',\n  APPLICATION_OCTET_STREAM = 'application/octet-stream',\n  APPLICATION_OGG = 'application/ogg',\n  APPLICATION_PDF = 'application/pdf',\n  APPLICATION_RTF = 'application/rtf',\n  APPLICATION_TYPESCRIPT = 'application/typescript',\n  APPLICATION_XML = 'application/xml',\n  APPLICATION_XML_ATOM = 'application/atom+xml',\n  APPLICATION_XML_SVG = 'application/svg+xml',\n  APPLICATION_XML_XHTML = 'application/xhtml+xml',\n  APPLICATION_XML_XUL = 'application/vnd.mozilla.xul+xml',\n\n  // ARCHIVE\n  ARCHIVE_7Z_COMPRESSED = 'application/x-7z-compressed',\n  ARCHIVE_BZIP = 'application/x-bzip',\n  ARCHIVE_BZIP2 = 'application/x-bzip2',\n  ARCHIVE_JAVA = 'application/java-archive',\n  ARCHIVE_GZIP = 'application/gzip',\n  ARCHIVE_RAR_COMPRESSED = 'application/x-rar-compressed',\n  ARCHIVE_TAR = 'application/x-tar',\n  ARCHIVE_RAR = 'application/vnd.rar',\n  ARCHIVE_ZIP = 'application/zip',\n  ARCHIVE_ZIP_COMPRESSED = 'application/x-zip-compressed',\n\n  // MICROSOFT\n  MS_FONT_OBJECT = 'application/vnd.ms-fontobject',\n  MS_EXCEL = 'application/vnd.ms-excel',\n  MS_EXCEL_XML = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n  MS_POWERPOINT = 'application/vnd.ms-powerpoint',\n  MS_POWERPOINT_XML = 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n  MS_VIDEO = 'video/x-msvideo',\n  MS_VISIO = 'application/vnd.visio',\n  MS_WORD = 'application/msword',\n  MS_WORD_XML = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n\n  // Autres\n  MULTIPART_FORM_DATA = 'multipart/form-data',\n  SCRIPT_SHELL = 'application/x-sh',\n  OPEN_PRESENTATION = 'application/vnd.oasis.opendocument.presentation',\n  OPEN_SPREADSHEET = 'application/vnd.oasis.opendocument.spreadsheet',\n  OPEN_TEXT = 'application/vnd.oasis.opendocument.text',\n}\n\nenum FileFormat {\n  XLS = 'XLS',\n  XLSX = 'XLSX',\n  PPT = 'PPT',\n  PPTX = 'PPTX',\n  DOC = 'DOC',\n  DOCX = 'DOCX',\n  ODS = 'ODS',\n  ODP = 'ODP',\n  ODT = 'ODT',\n  XML = 'XML',\n  JPG = 'JPG',\n  PNG = 'PNG',\n  PDF = 'PDF',\n  CSV = 'CSV',\n  HTML = 'HTML',\n  SVG = 'SVG',\n  TXT = 'TXT',\n  ZIP = 'ZIP',\n  SEVEN_ZIP = '7Z',\n  RAR = 'RAR',\n  XHTML = 'XHTML',\n  BMP = 'BMP',\n  GIF = 'GIF',\n  TIF = 'TIF',\n  RTF = 'RTF',\n  GZIP = 'GZIP',\n  TAR = 'TAR',\n}\n\nconst mimeType2FileFormat: Record<string, FileFormat> = {\n  [DsfrMimeTypeConst.APPLICATION_PDF]: FileFormat.PDF,\n  [DsfrMimeTypeConst.APPLICATION_RTF]: FileFormat.RTF,\n  [DsfrMimeTypeConst.APPLICATION_XML]: FileFormat.XML,\n  [DsfrMimeTypeConst.APPLICATION_XML_ATOM]: FileFormat.XML,\n  [DsfrMimeTypeConst.APPLICATION_XML_XHTML]: FileFormat.XHTML,\n\n  [DsfrMimeTypeConst.ARCHIVE_7Z_COMPRESSED]: FileFormat.SEVEN_ZIP,\n  [DsfrMimeTypeConst.ARCHIVE_GZIP]: FileFormat.GZIP,\n  [DsfrMimeTypeConst.ARCHIVE_RAR]: FileFormat.RAR,\n  [DsfrMimeTypeConst.ARCHIVE_TAR]: FileFormat.TAR,\n  [DsfrMimeTypeConst.ARCHIVE_ZIP]: FileFormat.ZIP,\n  [DsfrMimeTypeConst.ARCHIVE_ZIP_COMPRESSED]: FileFormat.ZIP,\n\n  [DsfrMimeTypeConst.IMAGE_BMP]: FileFormat.BMP,\n  [DsfrMimeTypeConst.IMAGE_GIF]: FileFormat.GIF,\n  [DsfrMimeTypeConst.IMAGE_JPEG]: FileFormat.JPG,\n  [DsfrMimeTypeConst.IMAGE_PNG]: FileFormat.PNG,\n  [DsfrMimeTypeConst.IMAGE_SVG]: FileFormat.SVG,\n  [DsfrMimeTypeConst.IMAGE_TIFF]: FileFormat.TIF,\n\n  [DsfrMimeTypeConst.MS_EXCEL]: FileFormat.XLS,\n  [DsfrMimeTypeConst.MS_EXCEL_XML]: FileFormat.XLSX,\n  [DsfrMimeTypeConst.MS_POWERPOINT]: FileFormat.PPT,\n  [DsfrMimeTypeConst.MS_POWERPOINT_XML]: FileFormat.PPTX,\n  [DsfrMimeTypeConst.MS_WORD]: FileFormat.DOC,\n  [DsfrMimeTypeConst.MS_WORD_XML]: FileFormat.DOCX,\n\n  [DsfrMimeTypeConst.OPEN_PRESENTATION]: FileFormat.ODP,\n  [DsfrMimeTypeConst.OPEN_SPREADSHEET]: FileFormat.ODS,\n  [DsfrMimeTypeConst.OPEN_TEXT]: FileFormat.ODT,\n\n  [DsfrMimeTypeConst.TEXT_CSV]: FileFormat.CSV,\n  [DsfrMimeTypeConst.TEXT_HTML]: FileFormat.HTML,\n  [DsfrMimeTypeConst.TEXT_PLAIN]: FileFormat.TXT,\n  [DsfrMimeTypeConst.TEXT_XML]: FileFormat.XML,\n};\n","// Ordre alphabétique requis\nexport const MESSAGES_EN = {\n  uploadDnd: {\n    buttonMultiple: 'Select files',\n    buttonSingle: 'Select file',\n    description: {\n      desktop: 'You can drag and drop file here',\n      desktopMultiple: 'You can drag and drop files here',\n      mobile: 'You can add multiple documents at once.',\n      or: 'or',\n    },\n    infos: {\n      format: 'Authorized formats',\n      size: 'File size: 500 Mo maximum',\n    },\n    inline: {\n      button: 'Browse',\n      drop: 'Drop here',\n    },\n    label: 'Add the file(s)',\n    fileList: {\n      noFile: 'No file chosen',\n      selectedFile: 'selected file',\n      selectedFiles: 'selected files',\n      formatSize: 'Formats and sizes',\n      removeAll: 'Remove all',\n      removeAllDetailed: 'Remove all previously selected files',\n      removeFile: 'Remove the file',\n    },\n    maxFiles: {\n      error: 'You have exceeded the number of files allowed. Please delete any files you have already uploaded.',\n    },\n  },\n};\n","// Ordre alphabétique requis\nexport const MESSAGES_FR = {\n  uploadDnd: {\n    buttonMultiple: 'Sélectionner des fichiers',\n    buttonSingle: 'Sélectionner un fichier',\n    description: {\n      desktop: 'Vous pouvez glisser/déposer le fichier ici',\n      desktopMultiple: 'Vous pouvez glisser/déposer des fichiers ici',\n      mobile: 'Vous pouvez ajouter plusieurs documents en une seule fois.',\n      or: 'ou',\n    },\n    infos: {\n      format: 'Formats autorisés',\n      size: 'Taille du fichier : 500 Mo maximum',\n    },\n    inline: {\n      button: 'Parcourir',\n      drop: 'Glisser ici',\n    },\n    label: 'Ajouter le(s) fichier(s)',\n    fileList: {\n      noFile: 'Aucun fichier choisi...',\n      selectedFile: 'fichier sélectionné',\n      selectedFiles: 'fichiers sélectionnés',\n      formatSize: 'Formats et poids',\n      removeAll: 'Tout supprimer',\n      removeAllDetailed: 'Supprimer tous les fichiers déjà sélectionnés',\n      removeFile: 'Supprimer le document',\n    },\n    maxFiles: {\n      error: 'Vous avez dépassé le nombre de fichiers autorisés. Supprimez des fichiers déjà uploadés.',\n    },\n  },\n};\n","import { BreakpointObserver } from '@angular/cdk/layout';\nimport {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ContentChild,\n  ElementRef,\n  EventEmitter,\n  Input,\n  OnInit,\n  Output,\n  Renderer2,\n  Signal,\n  TemplateRef,\n  ViewChild,\n  ViewEncapsulation,\n  computed,\n  forwardRef,\n  inject,\n  signal,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { map } from 'rxjs';\n\nimport { CommonModule } from '@angular/common';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport {\n  DefaultControlComponent,\n  DsfrButtonModule,\n  DsfrButtonsGroupModule,\n  DsfrFileSizeUnit,\n  DsfrI18nPipe,\n  DsfrI18nService,\n  DsfrSeverity,\n  DsfrSeverityConst,\n  DsfrUploadModule,\n  Language,\n  newUniqueId,\n} from '@edugouvfr/ngx-dsfr';\nimport { DsfrFileActionsDirective } from './directives/file-actions.directive';\nimport { DsfrFileDeleteButtonDirective } from './directives/file-delete-button.directive';\nimport { FileDetailsPipe } from './file-details.pipe';\nimport { MESSAGES_EN } from './i18n/messages.en';\nimport { MESSAGES_FR } from './i18n/messages.fr';\n\ninterface DisplayedMessageStatus {\n  message: string[] | undefined;\n  messageSeverity: DsfrSeverity | undefined;\n}\n\n@Component({\n  selector: 'dsfr-ext-upload-dnd, dsfrx-upload-dnd',\n  templateUrl: './upload-dnd.component.html',\n  styleUrls: [\n    './styles/inline-upload-dnd.component.scss',\n    './styles/file-list.component.scss',\n    './styles/full-upload-dnd.component.scss',\n  ],\n  imports: [\n    CommonModule,\n    DsfrUploadModule,\n    DsfrButtonModule,\n    DsfrButtonsGroupModule,\n    DsfrI18nPipe,\n    FileDetailsPipe,\n    DsfrFileDeleteButtonDirective,\n  ],\n  encapsulation: ViewEncapsulation.None,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => DsfrUploadDndComponent),\n      multi: true,\n    },\n  ],\n  styles: [\n    `\n      dsfr-ext-upload-dnd .edu-upload-dnd__container:not(.edu-upload-dnd__container--inline) .fr-message {\n        margin-top: 1rem;\n      }\n    `,\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DsfrUploadDndComponent extends DefaultControlComponent<File[]> implements OnInit {\n  /** @internal */\n  @ViewChild('inputFile') inputFile?: ElementRef<HTMLInputElement>;\n\n  /** @internal */\n  @ViewChild('inlineDeleteBtn', { read: ElementRef }) inlineDeleteBtn?: ElementRef<HTMLButtonElement>;\n\n  /**\n   * Slot custom pour personnaliser les boutons d'action relatifs à un fichier.\n   *\n   * Indisponible en mode inline.\n   */\n  @ContentChild(DsfrFileActionsDirective, { read: TemplateRef }) fileActions?: TemplateRef<DsfrFileActionsDirective>;\n\n  /** Version inline du composant. */\n  @Input() inline = false;\n\n  /** Label du button. */\n  @Input() buttonLabel?: string;\n\n  /** En mode full, n'affiche pas l'illustration. */\n  @Input() hideIllustration = false;\n\n  /** Texte indiquant le format de fichier accepté. Doit refléter la valeur donnée à l'attribut `accept` */\n  @Input() formatAsked?: string;\n\n  /** Texte indiquant le poids maximal autorisé du ou des fichiers. La valeur est seulement indicative et n'entraine aucune vérification interne au composant. */\n  @Input() maxSizeInfo?: string;\n\n  /** Unité de poids de fichier autorisé. */\n  @Input() sizeUnit: DsfrFileSizeUnit = 'octets';\n\n  /** Ajoute l'attribut `aria-invalid` sur le champ de formulaire. */\n  @Input() ariaInvalid?: string;\n\n  /**\n   * L'attribut `accept` prend comme valeur une chaîne de caractères contenant une ou plusieurs spécificateurs de type de fichier unique, séparées par des virgules.\n   * Ces spécificateurs décrivent les types de fichiers pouvant être sélectionnés par l'utilisateur.\n   *\n   * ex: .jpg,.png,audio/*...\n   */\n  @Input() accept = '.pdf, .jpg, .jpeg, .png';\n\n  /** Permet l'ajout de plusieurs fichiers à la fois. */\n  @Input() multiple = false;\n\n  /** Nombre maximum de fichiers pouvant être téléversés. */\n  @Input() maxFiles?: number;\n\n  /** Evénement émis à la sélection d'un ou plusieurs fichiers. */\n  @Output()\n  selectionChange = new EventEmitter<File[]>();\n\n  /** Evénement émis lorsque l'utilisateur annule la sélection. */\n  @Output()\n  fileBrowsingCancel = new EventEmitter<void>();\n\n  /** Renvoie les fichiers supprimés lorsque l'utilisateur retire un ou plusieurs fichiers */\n  @Output()\n  fileRemove = new EventEmitter<File[]>();\n\n  protected readonly i18n = inject(DsfrI18nService);\n  protected disabledDnd = false;\n\n  protected breakpointObserver = inject(BreakpointObserver);\n  protected customBreakpoint = '(max-width: 320px)';\n  protected restitutionSelectedFiles = '';\n  protected messageExpandButton: string | undefined;\n  protected formatAskedUniqueId = `formatAsked-${newUniqueId()}`;\n  protected ariaDescribedby = this.formatAskedUniqueId;\n\n  /** Gère l'affichage du bon markup en mode mobile. */\n  protected isMobile = toSignal(\n    this.breakpointObserver.observe([this.customBreakpoint]).pipe(map((result) => result.matches)),\n    {\n      initialValue: false,\n    },\n  );\n\n  /**\n   * Gestion de l'affichage de la combinaison des messages internes et externes du composant.\n   */\n  protected readonly newMessages = computed<string[]>(() => {\n    const internalError = this.internalError();\n    const message = this.message();\n\n    return this.handleMessagesConcat(internalError, message);\n  });\n\n  /**\n   * Gestion de l'affichage dans le cas où le composant serait dans un autre statut qu'en erreur,\n   * et qu'une erreur interne se manifeste. Dans ce cas, seules sont affichées les erreurs internes, et le statut\n   * affiché du composant est forcé en erreur.\n   */\n  protected readonly displayedMessageStatus: Signal<DisplayedMessageStatus> = computed(() => {\n    const newSeverity = this.messageSeverity();\n    const newMessages = this.newMessages();\n    const internalError = this.toArray(this.internalError());\n\n    // priorité erreur interne\n    if (newSeverity !== DsfrSeverityConst.ERROR && internalError.length > 0) {\n      return {\n        message: internalError,\n        messageSeverity: DsfrSeverityConst.ERROR,\n      };\n    }\n\n    if (newMessages.length > 0) {\n      return {\n        message: newMessages,\n        messageSeverity: newSeverity,\n      };\n    }\n\n    return {\n      message: [],\n      messageSeverity: undefined,\n    };\n  });\n\n  /** Gestion des classes CSS ajoutées selon la sévérité */\n  protected readonly uploadDndClasses: Signal<string | null> = computed(() => {\n    const status = this.displayedMessageStatus();\n\n    const inline = this.inline ? ' edu-upload-dnd__container--inline' : '';\n    const disabled = this.disabled ? ' edu-upload-dnd--disabled' : '';\n    const disabledDnd = this.disabledDnd ? ' edu-upload-dnd--disabledDnd' : '';\n\n    if (!status?.message || !status?.messageSeverity) return inline + disabled + disabledDnd;\n\n    const severityToClass: Record<DsfrSeverity, string> = {\n      [DsfrSeverityConst.ERROR]: 'edu-upload-dnd--error',\n      [DsfrSeverityConst.SUCCESS]: 'edu-upload-dnd--valid',\n      [DsfrSeverityConst.VALID]: 'edu-upload-dnd--valid',\n      [DsfrSeverityConst.INFO]: '',\n      [DsfrSeverityConst.WARNING]: '',\n    };\n\n    return severityToClass[status.messageSeverity] + inline + disabled + disabledDnd;\n  });\n\n  /** Gestion des classes CSS ajoutées selon la sévérité */\n  protected readonly uploadDndMessageClass: Signal<string | null> = computed(() => {\n    const status = this.displayedMessageStatus();\n\n    if (!status?.message || !status?.messageSeverity) return null;\n\n    const severityToClass: Record<DsfrSeverity, string> = {\n      [DsfrSeverityConst.ERROR]: 'fr-message fr-message--error',\n      [DsfrSeverityConst.SUCCESS]: 'fr-message fr-message--valid',\n      [DsfrSeverityConst.VALID]: 'fr-message fr-message--valid',\n      [DsfrSeverityConst.INFO]: 'fr-message fr-message--info',\n      [DsfrSeverityConst.WARNING]: 'fr-message fr-message--warning',\n    };\n\n    return severityToClass[status.messageSeverity];\n  });\n\n  private internalError = signal<string | undefined>(undefined, { equal: () => false });\n  private readonly _renderer = inject(Renderer2);\n  private readonly cdr = inject(ChangeDetectorRef);\n\n  constructor() {\n    super();\n    this.i18n.extendsLabelsBundle(Language.EN, MESSAGES_EN);\n    this.i18n.extendsLabelsBundle(Language.FR, MESSAGES_FR);\n  }\n\n  /**\n   * Surcharge permettant de gérer la mise à jour du DOM.\n   *\n   * @internal\n   */\n  override writeValue(value: File[] | undefined): void {\n    // afin de se prémunir des initialisations avec une chaîne de caractères (vide ou pas) il faut s'assurer du type\n    // d'argument transmis en entrée et forcer la chaîne vide le cas échéant\n    const isFileArray = value && value[0] && value[0].name !== undefined;\n\n    if (!isFileArray) {\n      value = [];\n    }\n\n    super.writeValue(value);\n\n    if (this.inputFile && value && value.length > 0) {\n      const fileList = this.convertFileArrayToFileList(value);\n      this._renderer.setProperty(this.inputFile.nativeElement, 'files', fileList);\n    } else if (this.inputFile) {\n      this._renderer.setProperty(this.inputFile.nativeElement, 'value', '');\n      this._renderer.setProperty(this.inputFile.nativeElement, 'files', null);\n    }\n\n    this.cdr.markForCheck();\n  }\n\n  /**@internal */\n  override setDisabledState(isDisabled: boolean): void {\n    super.setDisabledState!(isDisabled);\n    this.cdr.markForCheck();\n  }\n\n  /** @internal */\n  override ngOnInit(): void {\n    super.ngOnInit();\n    this.value = [];\n\n    if (this.messagesGroupId) this.ariaDescribedby += ` ${this.messagesGroupId}`;\n    if (this.message()) this.ariaDescribedby += ` ${this.inputId}-messages`;\n  }\n\n  /**\n   * Permet de programmatiquement réinitialiser le champ après une sélection de fichier(s).\n   * @deprecated utiliser directement value\n   */\n  reset(): void {\n    this.value = undefined;\n    super.writeValue(this.value);\n  }\n\n  /**\n   * Permet de supprimer le fichier se trouvant à l'index fournit.\n   */\n  deleteFile(index: number): void {\n    if (!this.value || !this.inputFile) return;\n\n    this.inputFile.nativeElement.value = ''; // a11y : supprimer la valeur précédente du nom de fichier\n    const fileDeleted: File | undefined = this.value[index];\n\n    this.value = this.value.filter((_, currentIndex) => {\n      return index !== currentIndex;\n    });\n\n    if (this.value.length === 0) {\n      this.inputFile.nativeElement.focus();\n    }\n\n    if (this.maxFiles && this.value && this.value.length < this.maxFiles) {\n      this.disabled = false;\n      this.disabledDnd = false;\n    }\n\n    if (this.maxFiles && this.value && this.value.length <= this.maxFiles) {\n      this.internalError.set(undefined);\n    }\n\n    this.fileRemove.emit([fileDeleted]);\n    this.selectionChange.emit(this.value);\n    this.fnOnTouched();\n  }\n\n  /**\n   * Fonction issue de la lib principale.\n   */\n  protected onFileBrowsingCancel(): void {\n    this.fileBrowsingCancel.emit();\n  }\n\n  /**\n   * Fonction issue de la lib principale.\n   */\n  /** TODO: en version inline, après la sélection d'un fichier forcer le focus sur le btn de suppressions (accessibility). */\n  protected onFileChange(event: Event): void {\n    const target = <HTMLInputElement>event.target;\n\n    const newFiles = target.files !== null ? Array.from(target.files) : undefined;\n\n    if (newFiles) {\n      if (this.multiple) {\n        if (this.maxFiles && this.value && this.value.length >= this.maxFiles) {\n          this.disabledDnd = true;\n        } else {\n          this.value = this.value?.concat(newFiles);\n          if (this.value?.length === this.maxFiles) {\n            this.disabledDnd = true;\n          }\n        }\n      } else {\n        this.value = newFiles;\n      }\n      if (this.maxFiles && this.value && this.value.length > this.maxFiles) {\n        this.disabledDnd = true;\n        this.internalError.set(this.i18n.t('uploadDnd.maxFiles.error'));\n      } else {\n        this.selectionChange.emit(this.value);\n        this.internalError.set(undefined);\n      }\n    }\n  }\n\n  protected deleteAllFiles(): void {\n    if (!this.inputFile) return;\n\n    const filesDeleted: File[] | undefined = this.value;\n    this.inputFile.nativeElement.value = ''; // a11y : supprimer la valeur précédente du nom de fichier\n    this.value = [];\n    if (this.disabled || this.disabledDnd) {\n      this.disabled = false;\n      this.disabledDnd = false;\n    }\n    this.internalError.set(undefined);\n\n    this.fileRemove.emit(filesDeleted);\n    this.selectionChange.emit(this.value);\n    this.fnOnTouched();\n\n    this.inputFile.nativeElement.focus();\n  }\n\n  private convertFileArrayToFileList(fileArray: File[]): FileList {\n    const dataTransfer = new DataTransfer();\n\n    fileArray.forEach((file) => {\n      dataTransfer.items.add(file);\n    });\n\n    return dataTransfer.files;\n  }\n\n  private handleMessagesConcat(\n    internalError: string | string[] | undefined,\n    message: string | string[] | undefined,\n  ): string[] {\n    const internal = this.toArray(internalError);\n    const external = this.toArray(message);\n\n    const messages = [...internal, ...external];\n\n    return messages;\n  }\n\n  private toArray(value: string | string[] | undefined): string[] {\n    if (!value) return [];\n    return Array.isArray(value) ? value : [value];\n  }\n}\n","<div class=\"edu-upload-dnd__container\" [ngClass]=\"uploadDndClasses()\">\n  <label class=\"fr-label\" [for]=\"inputId\">{{ label }}</label>\n\n  @if (!inline) {\n    <ng-container *ngTemplateOutlet=\"templateFull\"></ng-container>\n  } @else {\n    <ng-container *ngTemplateOutlet=\"templateInline\"></ng-container>\n  }\n\n  <div [attr.id]=\"inputId + '-messages'\" class=\"fr-messages-group\" aria-live=\"polite\">\n    @if (displayedMessageStatus().message) {\n      <p [ngClass]=\"uploadDndMessageClass()\">\n        {{ displayedMessageStatus().message }}\n      </p>\n    }\n  </div>\n</div>\n\n<!-- MARK: Template Full -->\n<ng-template #templateFull>\n  <div class=\"edu-upload-dnd__area\" [ngClass]=\"{ 'edu-upload-dnd__area--disabled': disabled }\">\n    @if (!hideIllustration && !isMobile()) {\n      <svg aria-hidden=\"true\" xmlns=\"http://www.w3.org/2000/svg\" width=\"80\" height=\"80\" viewBox=\"0 0 80 80\" fill=\"none\">\n        <rect width=\"80\" height=\"80\" fill=\"white\" />\n        <path\n          d=\"M38.4783 43.7609C40 39.4493 45.7826 30.8261 56.7391 30.8261C70.4348 30.8261 75 43 75 49.8478C75 56.6957 68.1522 67.5163 58.2609 67.5163C50.3478 67.5163 47.2572 67.5163 46 67.5163M34.5 67.5163H21.7391C16.1594 66.9529 5 62.6304 5 49.8478C5 37.0652 13.6232 32.3478 17.9348 31.587C17.9348 23.7246 22.3478 8 40 8C57.6522 8 61.558 20.6812 61.3043 27.0217\"\n          [attr.stroke]=\"disabled ? '#929292' : '#000091'\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\" />\n        <path\n          d=\"M39 71.3913C39 71.9436 39.4477 72.3913 40 72.3913C40.5523 72.3913 41 71.9436 41 71.3913H39ZM40.7071 56.6842C40.3166 56.2937 39.6834 56.2937 39.2929 56.6842L32.9289 63.0482C32.5384 63.4387 32.5384 64.0718 32.9289 64.4624C33.3195 64.8529 33.9526 64.8529 34.3431 64.4624L40 58.8055L45.6569 64.4624C46.0474 64.8529 46.6805 64.8529 47.0711 64.4624C47.4616 64.0718 47.4616 63.4387 47.0711 63.0482L40.7071 56.6842ZM41 71.3913V57.3913H39V71.3913H41Z\"\n          [attr.fill]=\"disabled ? '#929292' : '#E1000F'\" />\n        <path\n          d=\"M24.7827 30.0652C25.0363 24.9928 28.4349 14.8478 40.0001 14.8478M56.7392 36.1522C61.0508 36.1522 67.3914 39.1957 68.9131 45.2826\"\n          [attr.stroke]=\"disabled ? '#929292' : '#000091'\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\" />\n        <path\n          d=\"M34 53.3913H46\"\n          [attr.stroke]=\"disabled ? '#929292' : '#E1000F'\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\" />\n      </svg>\n    }\n\n    <div class=\"edu-upload-dnd__description\">\n      @if (multiple && isMobile()) {\n        <p class=\"edu-upload-dnd__description--mobile\">{{ 'uploadDnd.description.mobile' | dsfrI18n }}</p>\n      }\n      @if (!isMobile()) {\n        <p>{{ (multiple ? 'uploadDnd.description.desktopMultiple' : 'uploadDnd.description.desktop') | dsfrI18n }}</p>\n        <p class=\"fr-hint-text\">{{ 'uploadDnd.description.or' | dsfrI18n }}</p>\n      }\n    </div>\n\n    <div class=\"edu-upload-dnd__input fr-btn fr-btn--secondary\" [ngClass]=\"{ 'fr-btn--disabled': disabled }\">\n      <ng-container *ngTemplateOutlet=\"templateInput\"></ng-container>\n      @if (multiple) {\n        <span>{{ (buttonLabel ? buttonLabel : 'uploadDnd.buttonMultiple') | dsfrI18n }}</span>\n      } @else {\n        <span>{{ (buttonLabel ? buttonLabel : 'uploadDnd.buttonSingle') | dsfrI18n }}</span>\n      }\n    </div>\n\n    <p [id]=\"formatAskedUniqueId\" class=\"fr-hint-text\">\n      @if (hint) {\n        {{ hint }}\n      } @else {\n        {{ 'uploadDnd.infos.format' | dsfrI18n }} : {{ formatAsked ?? accept }}.\n        {{ maxSizeInfo ?? 'uploadDnd.infos.size' | dsfrI18n }}.\n      }\n    </p>\n  </div>\n  <!--Liste des résultats-->\n  @if (value && value.length > 0) {\n    <div class=\"edu-upload-dnd__resume\">\n      <p class=\"fr-sr-only\">\n        {{ (value.length > 1 ? 'uploadDnd.fileList.selectedFiles' : 'uploadDnd.fileList.selectedFile') | dsfrI18n }} :\n      </p>\n      @if (multiple && value.length >= 1) {\n        <div class=\"edu-upload-dnd__head\">\n          <p>\n            <span class=\"fr-icon-file-fill\" aria-hidden=\"true\"></span\n            ><span class=\"edu-upload-dnd__list-length\"\n              >{{ value.length }}\n              {{\n                (value.length > 1 ? 'uploadDnd.fileList.selectedFiles' : 'uploadDnd.fileList.selectedFile') | dsfrI18n\n              }}</span\n            >\n          </p>\n          <dsfr-button\n            [label]=\"'uploadDnd.fileList.removeAll' | dsfrI18n\"\n            [tooltipMessage]=\"'uploadDnd.fileList.removeAllDetailed' | dsfrI18n\"\n            [type]=\"'button'\"\n            [variant]=\"'tertiary'\"\n            buttonSize=\"SM\"\n            [iconPosition]=\"'right'\"\n            icon=\"fr-icon-delete-line\"\n            [disabled]=\"disabled\"\n            (click)=\"deleteAllFiles()\"></dsfr-button>\n        </div>\n      }\n      <ul>\n        @for (file of value; track $index) {\n          <li>\n            <div class=\"edu-upload-dnd__result-line\">\n              <span class=\"fr-icon-file-line\" aria-hidden=\"true\"></span>\n              <div>\n                <p class=\"edu-upload-dnd__name\">{{ file.name }}</p>\n                <p class=\"edu-upload-dnd__detail\">\n                  <span class=\"fr-sr-only\">{{ 'uploadDnd.fileList.formatSize' | dsfrI18n }}</span\n                  >{{ file | fileDetails: sizeUnit }}\n                </p>\n              </div>\n\n              @if (fileActions) {\n                <ng-container\n                  *ngTemplateOutlet=\"fileActions; context: { $implicit: file, index: $index, disabled }\"></ng-container>\n              } @else {\n                <dsfr-button\n                  dsfrFileDeleteBtn\n                  [file]=\"file\"\n                  [disabled]=\"disabled\"\n                  (click)=\"deleteFile($index)\"></dsfr-button>\n              }\n            </div>\n          </li>\n        }\n      </ul>\n    </div>\n    @if (isMobile()) {\n      <div class=\"edu-upload-dnd__resume--mobile\">\n        <ng-container *ngTemplateOutlet=\"templateFileList\"></ng-container>\n      </div>\n    }\n  }\n</ng-template>\n\n<!-- MARK: Template Inline -->\n<ng-template #templateInline>\n  <p [id]=\"formatAskedUniqueId\" class=\"fr-hint-text\">\n    @if (hint) {\n      {{ hint }}\n    } @else {\n      {{ 'uploadDnd.infos.format' | dsfrI18n }} : {{ formatAsked ?? accept }}.\n      {{ maxSizeInfo ?? 'uploadDnd.infos.size' | dsfrI18n }}.\n    }\n  </p>\n\n  <div class=\"edu-upload-dnd__input\">\n    <div class=\"edu-upload-dnd__area\">\n      <ng-container *ngTemplateOutlet=\"templateInput\"></ng-container>\n      <button tabindex=\"-1\" class=\"fr-btn fr-btn--secondary\" [disabled]=\"disabled\">\n        {{ 'uploadDnd.inline.button' | dsfrI18n }}\n      </button>\n      @if (!isMobile()) {\n        <span>{{ 'uploadDnd.description.or' | dsfrI18n }}</span>\n        <p class=\"edu-upload-dnd__drop-zone fr-btn fr-btn--tertiary\">{{ 'uploadDnd.inline.drop' | dsfrI18n }}</p>\n      }\n    </div>\n    <ng-container *ngTemplateOutlet=\"templateFileList\"></ng-container>\n  </div>\n</ng-template>\n\n<!-- MARK: Template Input -->\n<ng-template #templateInput>\n  <input\n    #inputFile\n    class=\"fr-upload\"\n    type=\"file\"\n    [attr.title]=\"\n      buttonLabel ?? (multiple ? ('uploadDnd.buttonMultiple' | dsfrI18n) : ('uploadDnd.buttonSingle' | dsfrI18n))\n    \"\n    [multiple]=\"multiple\"\n    [disabled]=\"disabled || disabledDnd\"\n    [attr.id]=\"inputId || null\"\n    [attr.name]=\"name || null\"\n    [attr.accept]=\"accept || null\"\n    [attr.aria-describedby]=\"ariaDescribedby\"\n    [attr.aria-invalid]=\"ariaInvalid || null\"\n    (blur)=\"onBlur()\"\n    (change)=\"onFileChange($event)\"\n    (cancel)=\"onFileBrowsingCancel()\" />\n</ng-template>\n\n<!-- MARK: Template File List (inline et mobile) -->\n<ng-template #templateFileList>\n  @if (value && value.length < 2) {\n    <div class=\"edu-upload-dnd__resume--single\">\n      <div class=\"fr-input\">\n        @if (value.length === 1) {\n          <span class=\"edu-upload-dnd__file-name\">{{ value[0].name }}</span>\n          <span class=\"edu-upload-dnd__file-size\">{{ value[0] | fileDetails: sizeUnit }}</span>\n        } @else {\n          {{ 'uploadDnd.fileList.noFile' | dsfrI18n }}\n        }\n      </div>\n      @if (value.length === 1) {\n        <dsfr-button\n          variant=\"secondary\"\n          [type]=\"'button'\"\n          [label]=\"('uploadDnd.fileList.removeFile' | dsfrI18n) + ' ' + value[0].name\"\n          [tooltipMessage]=\"('uploadDnd.fileList.removeFile' | dsfrI18n) + ' ' + value[0].name\"\n          [buttonSize]=\"'MD'\"\n          [icon]=\"'fr-icon-delete-line'\"\n          [labelSrOnly]=\"true\"\n          [disabled]=\"disabled\"\n          (click)=\"deleteAllFiles()\"></dsfr-button>\n      }\n    </div>\n  } @else {\n    <div class=\"edu-upload-dnd__resume\" [class.edu-upload-dnd__resume--mobile]=\"isMobile()\">\n      <p class=\"fr-sr-only\">{{ 'uploadDnd.fileList.selectedFiles' | dsfrI18n }} :</p>\n      @if (multiple && value && value.length > 1) {\n        <div class=\"edu-upload-dnd__head\">\n          <p>\n            <span class=\"fr-icon-file-fill\" aria-hidden=\"true\"></span>\n            <span class=\"edu-upload-dnd__list-length\"\n              >{{ value.length }} {{ 'uploadDnd.fileList.selectedFiles' | dsfrI18n }}</span\n            >\n          </p>\n          <dsfr-button\n            [labelSrOnly]=\"true\"\n            icon=\"fr-icon-delete-line\"\n            buttonSize=\"SM\"\n            [label]=\"'uploadDnd.fileList.removeAllDetailed' | dsfrI18n\"\n            [tooltipMessage]=\"'uploadDnd.fileList.removeAllDetailed' | dsfrI18n\"\n            [type]=\"'button'\"\n            [variant]=\"'tertiary'\"\n            [iconPosition]=\"'right'\"\n            [disabled]=\"disabled\"\n            (click)=\"deleteAllFiles()\"></dsfr-button>\n        </div>\n      }\n      <ul>\n        @for (file of value; track $index) {\n          <li>\n            <div class=\"edu-upload-dnd__result-line\">\n              <span class=\"fr-icon-file-line\" aria-hidden=\"true\"></span>\n              <div>\n                <p>{{ file.name }}</p>\n                <p class=\"edu-upload-dnd__detail\">\n                  <span class=\"fr-sr-only\">{{ 'uploadDnd.fileList.formatSize' | dsfrI18n }} : </span>\n                  {{ file | fileDetails: sizeUnit }}\n                </p>\n              </div>\n              <dsfr-button\n                [type]=\"'button'\"\n                [label]=\"('uploadDnd.fileList.removeFile' | dsfrI18n) + ' ' + file.name\"\n                [tooltipMessage]=\"('uploadDnd.fileList.removeFile' | dsfrI18n) + ' ' + file.name\"\n                [labelSrOnly]=\"true\"\n                variant=\"tertiary-no-outline\"\n                buttonSize=\"SM\"\n                icon=\"fr-icon-delete-line\"\n                [disabled]=\"disabled\"\n                (click)=\"deleteFile($index)\"></dsfr-button>\n            </div>\n          </li>\n        }\n      </ul>\n    </div>\n  }\n</ng-template>\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { DsfrButtonModule, DsfrButtonsGroupModule, DsfrLink, DsfrLinkModule } from '@edugouvfr/ngx-dsfr';\n\n/**\n * @deprecated\n */\n@Component({\n  selector: 'dsfr-ext-toolslinks, dsfrx-toolslinks',\n  templateUrl: './toolslinks.component.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  styles: [' .dsfrx-tools-links.fr-header__tools-links  { display: block}'],\n  imports: [CommonModule, DsfrLinkModule, RouterModule, DsfrButtonModule, DsfrLinkModule, DsfrButtonsGroupModule],\n})\nexport class DsfrToolslinksComponent {\n  /** Liste des liens rapides */\n  @Input({ required: true }) toolsLinks!: DsfrLink[];\n\n  /** Evènement émis au clic sur un lien */\n  @Output() readonly linkSelect = new EventEmitter<DsfrLink>();\n\n  protected onLinkSelect(link: DsfrLink) {\n    this.linkSelect.emit(link);\n  }\n}\n","<div class=\"fr-header__tools-links dsfrx-tools-links\">\n  @if (toolsLinks && toolsLinks.length > 0) {\n    <ul class=\"fr-btns-group\">\n      @for (item of toolsLinks; track item.label; let i = $index) {\n        <li>\n          <!-- TODO utiliser edu-item-link -->\n          <dsfr-link\n            [ariaLabel]=\"item.ariaLabel ?? ''\"\n            [ariaControls]=\"item.ariaControls\"\n            [link]=\"item.link\"\n            [ariaControls]=\"item.ariaControls\"\n            [ariaCurrent]=\"item.active ? 'page' : undefined\"\n            [linkTarget]=\"item.linkTarget\"\n            [routerLinkActive]=\"item.routerLinkActive ?? ''\"\n            [routerLinkExtras]=\"item.routerLinkExtras\"\n            [label]=\"item.label\"\n            [route]=\"item.route\"\n            [mode]=\"item.mode\"\n            [icon]=\"item.icon\"\n            [iconPosition]=\"item.iconPosition\"\n            [routePath]=\"item.routerLink\"\n            [tooltipMessage]=\"item.tooltipMessage\"\n            [customClass]=\"'fr-btn'\"\n            (linkSelect)=\"onLinkSelect(item)\">\n          </dsfr-link>\n        </li>\n      }\n    </ul>\n  }\n</div>\n","/**\n * API publique de la bibliothèque ngx-dsfr-ext.\n *\n * @module ngx-dsfr-ext\n */\n\nexport * from './lib/autocomplete';\nexport * from './lib/calendar';\nexport * from './lib/carousel';\nexport * from './lib/datepicker';\nexport * from './lib/dropdownmenu';\nexport * from './lib/multiselect';\nexport * from './lib/panel';\nexport * from './lib/picklist';\nexport * from './lib/progressbar';\nexport * from './lib/spinner';\nexport * from './lib/timeline';\nexport * from './lib/toast';\n\nexport * from './lib/shared/models';\nexport * from './lib/shared/utils';\nexport * from './lib/tree';\nexport * from './lib/treeselect';\nexport * from './lib/treetable';\nexport * from './lib/upload-dnd';\n\n/** @deprecated utiliser tool-link depuis ngx-dsfr */\nexport { DsfrToolslinksComponent } from './lib/profilemenu/component/toolslinks.component';\n\n/** @deprecated Utiliser les imports directement depuis @edugouvfr/ngx-dsfr */\nexport {\n  DsfrUserMenuComponent as DsfrProfileMenuComponent,\n  DsfrToolLinkMenuComponent as DsfrToolsMenuComponent,\n} from '@edugouvfr/ngx-dsfr';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["MESSAGES_EN","MESSAGES_FR","i4","i1","i2","CALENDAR_MESSAGES_EN","CALENDAR_MESSAGES_FR","i3","MULTISELECT_MESSAGES_EN","MULTISELECT_MESSAGES_FR"],"mappings":"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"}