{"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/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/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/shared/components/checkbox/checkbox.component.ts","../../../projects/ngx-dsfr-ext/src/lib/shared/components/checkbox/checkbox.component.html","../../../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/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/multiselect/select-focus.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/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-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/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 { Directive, ElementRef, EventEmitter, NgZone, OnDestroy, OnInit, Output, Renderer2 } 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 listener: Function;\n\n  constructor(\n    private _elementRef: ElementRef,\n    private ngZone: NgZone,\n    private renderer2: Renderer2,\n  ) {}\n\n  ngOnInit() {\n    this.ngZone.runOutsideAngular(() => {\n      this.listener = this.renderer2.listen('window', 'mouseup', (e) => {\n        this.onDocumentClick(e);\n      });\n      this.listener = this.renderer2.listen('window', 'resize', (e) => {\n        this.onDocumentResize(e);\n      });\n    });\n  }\n\n  ngOnDestroy() {\n    if (this.listener) this.listener();\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-multiselect__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\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 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    const 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      if (this.autoWidth || this.parentContainer) {\n        const left: string = this.calcPositionX(dropdownElement, comboBox, viewport.width);\n        this._renderer.setStyle(dropdownElement, 'left', left);\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    this._renderer.setStyle(element, 'width', `${box.offsetWidth}px`);\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","import { ScrollingModule } from '@angular/cdk/scrolling';\nimport { CommonModule } from '@angular/common';\nimport {\n  afterNextRender,\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 { 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  standalone: true,\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\n  /** Activer le virtual scroll  */\n  @Input() 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 | undefined;\n\n  @Input() 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 | undefined;\n\n  /** Hauteur maximale avant le scroll sur la liste déroulante. */\n  @Input() scrollHeight: string = '224px';\n\n  @Input() classToWrap: string = 'dsfrx-multiselect';\n\n  @Input() hasToolBar: boolean = false;\n\n  @Input() indexFirstSelected: number | null;\n\n  /** Set focus on list on opening */\n  @Input() autofocus: boolean = false;\n\n  /** La dropdown prend la taille des éléments qu'il contient (par défaut : taille du select) */\n  @Input() autoWidthDropdown: boolean = false;\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; // 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.appendTo && this.comboBoxElement) {\n        this.containerToAttach = DropdownUtils.setParentContainer(this.appendTo, this.comboBoxElement);\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 box contenant le fr-select) */\n  get comboBoxElement(): HTMLElement {\n    return 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) {\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            this.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.comboBoxElement.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    // 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   * 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  private 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  /**\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","<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]=\"comboBoxElement\"\n      [parentContainer]=\"containerToAttach\"\n      [autoWidth]=\"autoWidthDropdown\"\n      [ngClass]=\"{ 'dsfrx-dropdown--auto-width': autoWidthDropdown }\"\n      class=\"dsfrx-dropdown {{ classToWrap ? classToWrap + '__wrapper' : '' }} \"\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--error';\n      case DsfrSeverityConst.SUCCESS:\n      case DsfrSeverityConst.VALID:\n        return 'fr-message--valid';\n      case DsfrSeverityConst.INFO:\n        return 'fr-message--info';\n      case DsfrSeverityConst.WARNING:\n        return 'fr-message--warning';\n      default:\n        return '';\n    }\n  }\n\n  @Input('eduMessageSeverity')\n  set severity(value: DsfrSeverity | null) {\n    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, 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',\n  templateUrl: './spinner.component.html',\n  styleUrls: ['./spinner.scss'],\n  encapsulation: ViewEncapsulation.None,\n  standalone: true,\n  imports: [CommonModule, DsfrI18nPipe],\n})\nexport class DsfrSpinnerComponent {\n  /**\n   * Type de loader.\n   */\n  @Input() typeLoader: 'sun' | 'quarter' | 'line' = 'sun';\n\n  /**\n   * Conditionne un overlay fullscreen.\n   */\n  @Input() overlay = false;\n\n  /**\n   *  Message permettant de donner plus de contexte aux usagers utilisant un lecteur d'écran.\n   * (ex : \"En attente de la validation de l'inscription.\")\n   */\n  @Input() labelSrOnly: string | undefined;\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  /** @internal */\n  getClasses(): {} {\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    };\n  }\n}\n","@if (overlay) {\n  <div class=\"dsfrx-overlay\">\n    <div [ngClass]=\"getClasses()\">\n      <ng-container *ngTemplateOutlet=\"dsfrSpinner\"></ng-container>\n    </div>\n  </div>\n} @else {\n  <div [ngClass]=\"getClasses()\">\n    <ng-container *ngTemplateOutlet=\"dsfrSpinner\"></ng-container>\n  </div>\n}\n\n<ng-template #dsfrSpinner>\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</ng-template>\n\n<span class=\"fr-sr-only\">{{ labelSrOnly ?? ('spinner.messageContext' | dsfrI18n) }}</span>\n","export const MESSAGES_EN = {\n  autocomplete: {\n    loading: 'Loading',\n    deleteTag: 'Unselect option',\n    availableResults: 'options available',\n    noResults: 'No option available',\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    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  ChangeDetectionStrategy,\n  Component,\n  computed,\n  ContentChild,\n  ElementRef,\n  EventEmitter,\n  forwardRef,\n  inject,\n  Input,\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  DsfrSeverity,\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 } from './autocomplete.model';\nimport { MESSAGES_EN } from './i18n/messages.en';\nimport { MESSAGES_FR } from './i18n/messages.fr';\n\nconst OPTION_SELECTED_CLASS = 'selected';\nconst OPTION_SELECTED_SELECTOR = '.' + OPTION_SELECTED_CLASS;\n\n@Component({\n  selector: 'dsfr-ext-autocomplete, dsfrx-autocomplete',\n  encapsulation: ViewEncapsulation.None,\n  templateUrl: './autocomplete.component.html',\n  standalone: true,\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<any>;\n\n  /** @internal */\n  @ViewChild(CdkVirtualScrollViewport) viewport: CdkVirtualScrollViewport;\n\n  /** @internal */\n  // Le composant de saisie\n  @ViewChild('inputComponent', { read: ElementRef }) inputComponent: ElementRef;\n\n  /** @internal */\n  // Le container Dropdown\n  @ViewChild(DropdownContainerComponent, { read: ElementRef }) listBox: ElementRef;\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  /** 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 | undefined;\n\n  /** Propriété CSS z-index de la liste, par défaut supérieur aux composants 'lifted' DSFR */\n  @Input() zIndex: number | undefined;\n\n  /** Activer le filtre automatique sur l'autocomplete. Faux par défaut */\n  @Input() autoFilter = false;\n\n  /** Supprime la valeur de l'input si elle ne provient pas directement de la liste de suggestion. */\n  @Input() requireSelection = false;\n\n  /** Mode sélection multiple de valeurs */\n  @Input() multiple = false;\n\n  /** Mode multiple: Nombre max. d'options sélectionnables */\n  @Input() maxSelectedOptions: number | undefined;\n\n  /** Activer le virtual scroll */\n  @Input() virtualScroll = false;\n\n  /** Hauteur maximale avec unité avant le scroll sur la liste déroulante (correspond à la propriété css max-height)*/\n  @Input() scrollHeight: string = '224px';\n\n  /** Surcharger la hauteur en px d'un item dans le cas du virtual scroll. Par défaut 24 (px). */\n  @Input() virtualScrollItemHeight: number = 24;\n\n  /** Nom de la propriété correspond à la valeur (string) dans l'objet suggestion */\n  @Input() suggestionValueKey: string;\n\n  /** Afficher le spinner indiquant le chargement des suggestions */\n  @Input() loading = false;\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` */\n  @Input() ariaLabel: string;\n\n  /**  👓 Correspond à l'attribut `aria-invalid` */\n  @Input() ariaInvalid: string;\n\n  /** 👓 Correspond à l'attribut `aria-describedby`  */\n  @Input() ariaDescribedby: 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  @Input() delay: number = 0;\n\n  /** minimum de caractères nécessaires au déclenchement des suggestions. 1 par défaut */\n  @Input() minLength: number = 1;\n\n  // Attributs pour le dsfr-form-input ----------------------------------------------------------- */\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() 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  /** (form-input) message d'information lié au composant */\n  @Input() message: string | undefined;\n  /** (form-input) représente la sévérité du message.  */\n  @Input() messageSeverity: DsfrSeverity;\n\n  /** (form-input) 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 | undefined;\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;\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  /** Mode multiple : à la suppression d'une suggestion (tag) */\n  @Output() clearOptionSelect: EventEmitter<{ nativeEvent: Event; option: any }> = new EventEmitter();\n\n  /** @internal */\n  valueInput: string; // value interne du dsfr-form-input\n\n  protected isExpanded = false;\n  protected currentOptionIndex: number;\n  protected statusMessageMultiple = '';\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 manipulées par la fonction de filtrage de l'utilisateur. */\n  protected filteredSuggestions = signal<any[]>([]);\n\n  private i18n = inject(DsfrI18nService);\n\n  /** Les suggestions originales utilisées lorsqu'on est en autoFilter. */\n  private originalSuggestions: any[];\n\n  private inputChange$ = new Subject<Event>(); // Subject pour capturer les changements d'input\n  private notifyOnDestroy = new Subject<void>();\n\n  /** Indique si l'utilisateur a tapé au moins un caractère */\n  private hasUserTyped = false;\n\n  constructor(private readonly _renderer: Renderer2) {\n    super();\n    this.i18n.extendsLabelsBundle(Language.EN, MESSAGES_EN);\n    this.i18n.extendsLabelsBundle(Language.FR, MESSAGES_FR);\n  }\n\n  /** Liste des suggestions */\n  @Input() set suggestions(suggestions: any[]) {\n    this.originalSuggestions = suggestions;\n    this.filteredSuggestions.set(suggestions);\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    this.suggestionValueKey ? selectedSuggestion[this.suggestionValueKey] : selectedSuggestion;\n\n  /** @internal */\n  override ngOnInit() {\n    super.ngOnInit();\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    this.minLength ??= 1;\n    this.inputId ??= newUniqueId();\n    this.currentOptionIndex = 0;\n\n    if (this.multiple && !this.value) this.value = [];\n  }\n\n  public ngAfterViewInit(): void {\n    const inputElement = 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  /** @internal */\n  public onToogleDisplayList(display: boolean): void {\n    this.isExpanded = display;\n  }\n\n  /** @internal */\n  public onInput(event: Event) {\n    if (!this.hasUserTyped) this.hasUserTyped = true;\n    this.inputChange$.next(event);\n  }\n\n  /** @internal Ouverture de la liste des suggestions au focus si le minLength est de 0 */\n  public onFocusInput() {\n    if (this.minLength === 0) {\n      this.isExpanded = true;\n    }\n  }\n\n  /** Gestion des touches de navigation. */\n  /** @internal */\n  public doKeyEvent(event: KeyboardEvent, options: any[]) {\n    switch (event.key) {\n      case 'ArrowDown':\n        const nextIndex = Math.min(this.currentOptionIndex + 1, options?.length);\n        // si on est focus sur la dernire option, on va sur la premiere de la liste\n        this.currentOptionIndex =\n          nextIndex !== this.currentOptionIndex ? this.activateOption(nextIndex) : this.activateOption(1);\n        event.preventDefault();\n        break;\n\n      case 'ArrowUp':\n        const prevIndex = Math.max(1, this.currentOptionIndex - 1);\n        // si on est focus sur la premiere option, on va sur la derniere de la liste\n        this.currentOptionIndex =\n          prevIndex !== this.currentOptionIndex ? this.activateOption(prevIndex) : this.activateOption(options?.length);\n        event.preventDefault();\n        break;\n\n      case 'Enter':\n      case 'Tab':\n      case 'NumpadEnter':\n        /* If the ENTER key is pressed, prevent the form from being submitted, */\n        if (event.key !== 'Tab') event.preventDefault();\n        if (this.currentOptionIndex > 0) {\n          this.onOptionSelect(this.filteredSuggestions()[this.currentOptionIndex - 1], this.currentOptionIndex, false);\n        } else {\n          this.updateValueAndCloseList();\n        }\n        break;\n\n      case 'Escape':\n        this.updateValueAndCloseList();\n        event.preventDefault();\n        break;\n\n      default:\n    }\n  }\n\n  /**\n   * On ferme la liste des suggestions quand on sort du champ.\n   * Mise a jour de la valeur dans le cas de requireSelection ou multiple\n   * */\n  /** @internal */\n  public updateValueAndCloseList(hasSelectOption?: boolean) {\n    this.isExpanded = false;\n    this.resetAriaActiveDescendant();\n\n    if (this.requireSelection) {\n      // Vérifie si la valeur saisie correspond à une suggestion existante\n      const selectedSuggestion = this.filteredSuggestions()?.find(\n        (o: any) => this.formatOnSelect(o) === this.valueInput,\n      );\n\n      if (selectedSuggestion) {\n        this.multiple ? this.addSuggestionMultiple(selectedSuggestion) : (this.value = selectedSuggestion);\n      } else if (this.hasUserTyped) {\n        this.resetValueAndIndex();\n      }\n    } else if (this.multiple && this.valueInput && !hasSelectOption) {\n      // En mode multiple si sélection non requise on ajoute la valeur saisie en tant que tag (suggestion ou valeur libre)\n      // Seulement si l'utilisateur n'a pas cliqué sur une option\n      const selectedSuggestion = this.filteredSuggestions()?.find(\n        (o: any) => this.formatOnSelect(o) === this.valueInput,\n      );\n      this.addSuggestionMultiple(selectedSuggestion ?? this.valueInput);\n    }\n\n    this.listClose.emit();\n  }\n\n  /** Sélection d'une suggestion */\n  /** @internal */\n  public onOptionSelect(suggestion: any, i: number, hasClickOnOption: boolean) {\n    if (suggestion) {\n      this.activateOption(i);\n      if (this.multiple) {\n        this.addSuggestionMultiple(suggestion);\n      } else {\n        this.value = suggestion;\n        this.valueInput = this.formatOnSelect(this.value);\n      }\n      /* insert the value for the autocomplete text field: */\n      this.currentOptionIndex = i;\n    } else {\n      this.currentOptionIndex = 0;\n    }\n    this.suggestionSelect.emit(suggestion);\n    /* close the list of autocompleted values */\n    this.updateValueAndCloseList(hasClickOnOption);\n  }\n\n  /**\n   * Ajout de l'attribut aria-activedescendant correspond à l'option qui a le focus\n   * @internal */\n  public onOptionFocus(optionId: string) {\n    this._renderer.setAttribute(this.inputComponent.nativeElement, 'aria-activedescendant', optionId);\n  }\n\n  /** Override writeValue pour setter la valeur de l'input programmatiquement à l'initialisation\n   * @internal\n   */\n  override writeValue(value: any): void {\n    super.writeValue(value);\n    if (this.multiple) {\n      if (!this.value) this.value = [];\n      return;\n    }\n\n    if (this.value) {\n      this.valueInput = this.formatOnSelect(this.value);\n    } else {\n      this.valueInput = this.value;\n    }\n  }\n\n  /** @internal */\n  public isOptionSelected(i: number, option?: any): boolean {\n    if (this.multiple && this.value?.length) {\n      return this.value.some((o: any) => o === option);\n    }\n\n    return this.currentOptionIndex === i;\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, opt: any) {\n    const i = this.value.findIndex((o: any) => o === opt);\n    if (i !== -1) {\n      this.value.splice(i, 1);\n    }\n\n    this.clearOptionSelect.emit({ nativeEvent: e, option: opt });\n  }\n\n  /** Filtrage apres input change+debounce */\n  private handleInputChange(event: Event) {\n    if (!this.multiple) this.value = this.valueInput;\n    this.isExpanded =\n      this.valueInput !== null && this.valueInput !== undefined && this.valueInput.length >= this.minLength;\n\n    if (!this.isExpanded) {\n      this.updateValueAndCloseList();\n      return;\n    }\n\n    if (this.isExpanded) {\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      this.resetAriaActiveDescendant();\n    }\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\n    // Ici, on est sûr que 'this.value' soit valorisée\n    if (this.originalSuggestions?.length > 0) {\n      const searchValue: string = this.valueInput!.toLowerCase();\n\n      if (this.suggestionValueKey) {\n        // originalSuggestions liste d'objets et suggestionValueKey définie\n        filteredSuggestions = this.originalSuggestions.filter((item: any) => {\n          return item[this.suggestionValueKey].toLowerCase().includes(searchValue);\n        });\n      } else if (typeof this.originalSuggestions[0] === 'string') {\n        // originalSuggestions liste de string\n        filteredSuggestions = this.originalSuggestions.filter((item: string) =>\n          item.toLowerCase().includes(searchValue),\n        );\n      }\n    }\n\n    this.filteredSuggestions.set(filteredSuggestions);\n  }\n\n  private activateOption(index: number): number {\n    const nativeElt = this.listBox?.nativeElement;\n    let options = nativeElt?.querySelector('ul');\n\n    // Selection de l'element de liste si ajouté au body\n    if (this.appendTo) {\n      options = document.getElementById(`listbox-${this.inputId}`);\n    }\n\n    // Dé-sélection de l'option active s'il y a lieu\n    const previousOption: HTMLElement = options?.querySelector(OPTION_SELECTED_SELECTOR);\n    previousOption?.classList.remove(OPTION_SELECTED_CLASS);\n\n    // Sélection de l'indice courant\n    const activeOption: HTMLElement = options?.querySelector(`li:nth-child(${index})`);\n\n    if (activeOption) {\n      this.onOptionFocus(activeOption.id);\n      activeOption.classList.add(OPTION_SELECTED_CLASS); // hover sur l'élément\n      // comme on ne déplace pas le focus, scroll manuel sur l'élément\n      if (!this.virtualScroll) activeOption.scrollIntoView({ behavior: 'smooth', block: 'end' });\n      else this.manageScrollForVirtualScroll(index);\n    }\n\n    return index;\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(index: number) {\n    const indexToScroll = index > this.nbSuggestions() ? 0 : index - 2; // decalage de 2 pour ne pas avoir le viewport collé à l'input\n    this.viewport.scrollToIndex(indexToScroll, 'smooth');\n  }\n\n  // Effacement de aria-activedescendant lorsque la liste est cachée ou une lettre tapée\n  private resetAriaActiveDescendant() {\n    this._renderer.setAttribute(this.inputComponent.nativeElement, 'aria-activedescendant', '');\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 matchOnValue = this.value.find((s: any) => s === suggestion);\n\n    if (!matchOnValue && (!this.maxSelectedOptions || this.value.length < this.maxSelectedOptions)) {\n      this.value.push(suggestion);\n      this.valueInput = '';\n    } else if (matchOnValue) {\n      this.statusMessageMultiple = 'autocomplete.alreadyExist';\n    } else if (this.maxSelectedOptions && this.value.length >= this.maxSelectedOptions) {\n      this.statusMessageMultiple = 'autocomplete.maxSelection';\n    }\n  }\n\n  private resetValueAndIndex() {\n    this.valueInput = '';\n    if (!this.multiple) this.value = undefined;\n    this.currentOptionIndex = 0;\n  }\n}\n","<div\n  class=\"fr-input-group dsfrx-autocomplete\"\n  [class]=\"message ? 'fr-input-group--' + messageSeverity : ''\"\n  [ngClass]=\"{\n    'fr-input-group--disabled': disabled,\n    'fr-input-group--valid': message && messageSeverity === 'success',\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    <div class=\"dsfrx-autocomplete__multiple-group\">\n      @if (value && value.length) {\n        <ul [id]=\"inputId + '-list'\" class=\"fr-tags-group\">\n          @for (opt of value; track opt) {\n            <li>\n              <dsfr-tag\n                [mode]=\"'deletable'\"\n                [label]=\"suggestionValueKey && opt[suggestionValueKey] ? opt[suggestionValueKey] : opt\"\n                [small]=\"true\"\n                [ariaLabel]=\"\n                  ('autocomplete.deleteTag' | dsfrI18n) +\n                  ' ' +\n                  (suggestionValueKey && opt[suggestionValueKey] ? opt[suggestionValueKey] : opt)\n                \"\n                (click)=\"removeSuggestion($event, opt)\"></dsfr-tag>\n            </li>\n          }\n        </ul>\n      }\n      <div role=\"status\" aria-live=\"polite\" class=\"fr-sr-only\">\n        @if (statusMessageMultiple) {\n          <p>{{ statusMessageMultiple | dsfrI18n }}</p>\n        }\n      </div>\n    </div>\n  }\n\n  <edu-dropdown-container\n    #comboboxBox\n    [displayDropdown]=\"isExpanded\"\n    [classToWrap]=\"'dsfrx-autocomplete'\"\n    [hasToolBar]=\"false\"\n    [appendTo]=\"appendTo\"\n    [virtualScroll]=\"virtualScroll\"\n    [zIndex]=\"zIndex\"\n    (hideList)=\"updateValueAndCloseList()\"\n    [hasOptions]=\"true\">\n    <!-- Control -->\n    <!-- todo mode action ou icon-->\n    <div\n      ngProjectAs=\"control\"\n      [class.fr-input-wrap--addon]=\"inputWrapMode === 'addon' && (buttonIcon || buttonLabel)\"\n      [class.fr-input-wrap--action]=\"inputWrapMode === 'action' && (buttonIcon || buttonLabel)\">\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          [labelSrOnly]=\"true\"\n          [tooltipMessage]=\"buttonTooltipMessage\"\n          [type]=\"buttonType\"\n          [variant]=\"buttonVariant\"\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=\"option\"\n                (click)=\"onOptionSelect(suggestion, i, true)\">\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 suggestion; 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=\"option\"\n                (click)=\"onOptionSelect(suggestion, i, true)\">\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]=\"inputId + 'messages'\" aria-live=\"polite\">\n    @if (message) {\n      <p class=\"fr-message\" [eduMessageSeverity]=\"messageSeverity\">{{ message }}</p>\n    }\n  </div>\n  <span class=\"fr-sr-only\" role=\"status\" 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 #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    {{ suggestion && suggestionValueKey ? suggestion[suggestionValueKey] : suggestion }}\n  }\n</ng-template>\n\n<ng-template #loadingTemplate>\n  <div role=\"status\" aria-live=\"polite\" class=\"dsfrx-autocomplete--loading\">\n    @if (loading) {\n      <p>\n        <dsfr-ext-spinner typeLoader=\"quarter\"></dsfr-ext-spinner>\n        <span class=\"label\"> {{ 'autocomplete.loading' | dsfrI18n }}...</span>\n      </p>\n    }\n  </div>\n</ng-template>\n\n<ng-template #inputTemplate>\n  <input\n    #inputComponent\n    class=\"fr-input\"\n    [ngClass]=\"customClass || null\"\n    [attr.autocomplete]=\"'list'\"\n    [attr.autocomplete]=\"'off'\"\n    [attr.aria-describedby]=\"\n      (ariaDescribedby + ' ' || '') + (multiple ? inputId + '-list ' : '') + (message ? inputId + 'messages' : '')\n    \"\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    (input)=\"onInput($event)\" />\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 === undefined) 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   * 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","// 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: 'Choose Date',\n      title: 'Date picker widget: ',\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: 'Choisir une date',\n      title: 'Widget de choix de date : ',\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} 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 { 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 * @since 0.10\n * @author pfontanet\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  standalone: true,\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 | undefined = '';\n\n  /** Force le focus sur la date courante à l'initialisation du composant */\n  @Input() autofocus: boolean = false;\n\n  /** Id de l'élément correspondant au label de la grille de dates */\n  @Input({ required: true }) ariaLabelledBy: string = '';\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  /** @internal */\n  constructor(\n    private i18n: DsfrI18nService,\n    private langService: LangService,\n    private loggerService: LoggerService,\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 incorrecte. 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 incorrecte. 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    const tableCells = this.tbody.nativeElement.getElementsByTagName('td');\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    const validDate = this.reformatValue(this.value);\n\n    if (validDate) {\n      this.setNewValue(validDate, true);\n\n      this.computeMonoYearAndMonoMonth();\n      this.computeMonthSelectOptions();\n      this.computeYearSelectOptions();\n\n      this.initializeCalendar();\n    }\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 (this.isSameDay(day, this.focusDay) && this.inMinMaxRange(day)) {\n        dayNode.tabIndex = 0;\n        dayNode.focus();\n      }\n      if (this.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.isDayDisabled(<HTMLElement>event.currentTarget)) {\n      this.updateCalendarValue(<HTMLTableCellElement>event.currentTarget);\n    }\n\n    event.stopPropagation();\n    event.preventDefault();\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   * 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    const date = DateUtils.parse(this.prevCodeLang, this.value);\n    const newValue = DateUtils.format(code, date);\n    this.setNewValue(newValue);\n    this.prevCodeLang = code;\n    this.initializeCalendar();\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  private isSameDay(day1: Date | undefined, day2: Date | undefined): boolean {\n    if (day1 === undefined || day2 === undefined) {\n      return false;\n    } else {\n      return (\n        day1.getFullYear() === day2.getFullYear() &&\n        day1.getMonth() === day2.getMonth() &&\n        day1.getDate() === day2.getDate()\n      );\n    }\n  }\n\n  /**\n   * Mets à jour l'ensemble du Date Picker\n   */\n  private updateCalendar(): void {\n    this.updateMonthAndYearSelects();\n\n    const firstDayOfMonth = new Date(this.focusDay.getFullYear(), this.focusDay.getMonth(), 1);\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    const numericDayOfTheMonth = cellDate.getDate();\n    const monthCalendarIndex = cellDate.getMonth() + 1;\n\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.tabIndex = -1;\n    tdElement.removeAttribute('aria-selected');\n    tdElement.classList.remove('disabled', 'out-of-month');\n    tdElement.removeAttribute('aria-disabled');\n    tdElement.setAttribute('data-date', `${yyyy}-${mm}-${dd}`);\n\n    if (!this.inMinMaxRange(cellDate)) {\n      tdElement.classList.add('disabled');\n      tdElement.setAttribute('aria-disabled', 'true');\n    } else if (outsideOfCurrentMonth) {\n      tdElement.classList.add('out-of-month');\n    }\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] = [\n      tdElement.getElementsByTagName('span')[0],\n      tdElement.getElementsByTagName('span')[1],\n    ];\n\n    daySpan.textContent = `${this.i18n.t('calendar.days')[cellDate.getDay()]} `;\n    numberSpan.textContent = cellDate.getDate().toString();\n\n    if (this.isSameDay(cellDate, this.selectedDay)) {\n      tdElement.setAttribute('aria-selected', 'true');\n    }\n\n    if (this.isSameDay(cellDate, this.focusDay)) {\n      tdElement.tabIndex = 0;\n    }\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    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 (this.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 && this.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   * Calcul la date cible en fonction de la date actuelle et du nombre de mois à ajouter ou enlever\n   * à 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  private isDayDisabled(domNode: HTMLElement): boolean {\n    return domNode.classList.contains('disabled');\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  // Textbox methods\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 setNewValue(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   * 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    this.focusDay = this.getDayFromDataDateAttribute(domNode);\n    this.updateCalendar();\n\n    const newValue = DateUtils.format(this.codeLang, this.selectedDay);\n    this.setNewValue(newValue);\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 day = DateUtils.parse(this.codeLang, this.value);\n    const isOnBoundary = day ? this.isInBounds(day) : false;\n\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 || this.isSameDay(date, minDate)) &&\n      (maxDate === undefined || date < maxDate || this.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","<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    [attr.aria-label]=\"prevMonthLabel\"\n    (click)=\"handlePreviousMonthButton($event)\"\n    (keydown)=\"handlePreviousMonthButton($event)\"\n    #previousMonth\n    data-testid=\"datepicker-prev-month\"></button>\n\n  <div class=\"header__select-container\">\n    <dsfr-form-select\n      placeHolder=\"Mois\"\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-live=\"polite\">\n      {{ translatedMonthAbbreviations[currentMonthIndex] }}&nbsp;\n      @if (!isMonoMonth) {\n        <span aria-hidden=\"true\" class=\"fr-icon-arrow-down-s-line\"></span>\n      }\n    </div>\n  </div>\n\n  <div class=\"header__select-container\">\n    <dsfr-form-select\n      ariaLabel=\"Année\"\n      placeHolder=\"Année\"\n      [value]=\"currentYear\"\n      [options]=\"yearSelectOptions\"\n      [label]=\"monthSelectLabel\"\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    [attr.aria-label]=\"nextMonthLabel\"\n    (keydown)=\"handleNextMonthButton($event)\"\n    #nextMonth\n    data-testid=\"datepicker-next-month\"></button>\n</header>\n\n<div class=\"table-wrap\">\n  <table class=\"dates\" role=\"grid\" aria-labelledby=\"id-grid-label\">\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) {\n        <tr>\n          @for (column of columns; track $index) {\n            <td tabindex=\"-1\" (click)=\"handleDayClick($event)\" (keydown)=\"handleDayKeyDown($event)\" #td>\n              <span class=\"fr-sr-only\"></span>\n              <span>-1</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} 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 } 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  standalone: true,\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  /**\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 isOpen = false;\n  protected dialogTitle = '';\n  protected translatedMonths: string[] = [];\n  protected dialogTriggerBtnNode: HTMLButtonElement;\n\n  private _value: string | undefined = '';\n  private currentMonthIndex = 0;\n  private currentYear = 0;\n\n  private subscription = new Subscription();\n\n  constructor(\n    private elementRef: ElementRef,\n    private i18n: DsfrI18nService,\n    private logger: LoggerService,\n  ) {\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\n    this.subscription.add(langChange$);\n  }\n\n  get value(): string | 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 | undefined) {\n    if (value && DateUtils.isValidDefaultString(value)) {\n      this._value = value;\n      this.updateMonthIndexAndYear(value);\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    if (!dateEvent.date || !dateEvent.value) {\n      return;\n    }\n\n    this.value = dateEvent.value;\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  size=\"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=\"id-grid-label\" 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      ariaLabelledBy=\"id-grid-label\"\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  inject,\n} from '@angular/core';\nimport { DsfrI18nPipe, DsfrI18nService, Language, newUniqueId } from '@edugouvfr/ngx-dsfr';\nimport { Point } from '../shared/models/point';\nimport { DsfrSlide } 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  standalone: true,\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<any>;\n\n  /** Identifiant du champ, généré automatiquement par défaut. */\n  @Input() carouselId: string | undefined;\n\n  /** Attribut aria-label du composant */\n  @Input() ariaLabel: string | undefined;\n\n  /** Défilement automatique, faux par défaut */\n  @Input() 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() withControls: boolean = true;\n\n  /** Avec des indicateurs d'avancement. */\n  @Input() withIndicators: boolean = true;\n\n  /** Avec des indicateurs d'avancement. */\n  @Input() inverse: boolean = true;\n\n  /** Afficher les indicateur et contrôles à l'intérieur de l'image */\n  @Input() 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() reverseColorsIndicators: boolean = false;\n\n  /** Avec des labels. */\n  @Input() withCaptions: boolean = false;\n\n  /** Désactiver l'animation de transition */\n  @Input() disableTransition: boolean;\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;\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) {\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 slide; 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 slide; 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 slide; 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  forwardRef,\n  inject,\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 { MESSAGES_EN } from './i18n/messages.en';\nimport { MESSAGES_FR } from './i18n/messages.fr';\n\n@Component({\n  template: '',\n  styleUrls: ['./abstract-select.component.scss'],\n  standalone: true,\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 }) maxDisplayOptionsTemplate: TemplateRef<any>;\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<any>;\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() clearableOptions: boolean;\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 */\n  @Input() maxDisplayOptions = 5;\n\n  /** Nombre max. d'options sélectionnables */\n  @Input() maxSelectedOptions: number | undefined;\n\n  /** Afficher la case à cocher tout sélectionner */\n  @Input() 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 | undefined;\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() showClearSearch = false;\n\n  /** Placeholder pour le champ de sélection */\n  @Input() placeHolder: string | undefined;\n\n  /** Placeholder pour le champ de recherche */\n  @Input() searchMessage: string | undefined;\n\n  /** Placeholder pour le champ de recherche */\n  @Input() noResultsMessage: string | undefined;\n\n  /** Afficher un état de chargement */\n  @Input() loading = false;\n\n  /**\n   * Message d'information lié au composant\n   */\n  @Input() message: string;\n\n  /**\n   * Représente la sévérité du message\n   */\n  @Input() messageSeverity: DsfrSeverity;\n\n  /** Activer le virtual scroll  */\n  @Input() 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  /** 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() clearSearchOnHide: boolean;\n\n  /** 👓 Correspond à l'attribut `aria-invalid` */\n  @Input() ariaInvalid: boolean;\n\n  /** 👓 Correspond à l'attribut `aria-required` */\n  @Input() ariaRequired: boolean;\n\n  /**\n   * Cache le label visuellement en le laissant disponible aux lecteurs d'écran.\n   */\n  @Input() 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 = false;\n\n  /** @internal liste d'options filtrées */\n  optionsFilter: T[] = [];\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  /* @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: T[] | undefined;\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 options() {\n    return this._options;\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\n  /**\n   * Positionne un message d'erreur\n   * @deprecated utiliser message et messageSeverity\n   */\n  @Input() set error(value: string) {\n    this.message = value;\n    this.messageSeverity = DsfrSeverityConst.ERROR;\n  }\n\n  /**\n   * Positionne un message de validation\n   * @deprecated utiliser message et messageSeverity\n   */\n  @Input() set valid(value: string) {\n    this.message = value;\n    this.messageSeverity = DsfrSeverityConst.SUCCESS;\n  }\n\n  /** Liste des options disponibles. */\n  @Input()\n  set options(val: any[] | undefined) {\n    this._options = val;\n    this.optionsFilter = this.options ?? [];\n    if (this.value && this.value.length > 0) {\n      this.writeValue(this.value);\n    }\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  }\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    if (this.showSearch) {\n      this.searchText = '';\n      this.onSearch();\n    } else {\n      this.value = this.isSingleMode ? undefined : [];\n      this.selectedOptions = [];\n    }\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 = !this.displayDropdown;\n  }\n\n  /** @internal */\n  public hide(): void {\n    this.displayDropdown = false;\n    if (this.clearSearchOnHide) {\n      this.searchText = '';\n      this.optionsFilter = this.options && this.options.length ? this.options : [];\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","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';\n\n@Component({\n  selector: 'dsfr-ext-checkbox, dsfrx-checkbox',\n  styleUrls: ['./checkbox.component.scss'],\n  templateUrl: './checkbox.component.html',\n  encapsulation: ViewEncapsulation.None,\n  standalone: true,\n  imports: [CommonModule],\n})\nexport class EduCheckboxComponent {\n  /* Identifiant de la checkbox (obligatoire) */\n  @Input() id: string;\n\n  /* Label associé à la checkbox */\n  @Input() label: string;\n\n  /* Etat de la checkbox */\n  @Input() selected = false;\n\n  /* Surcharge de la propriété tabIndex  (optionnel) */\n  @Input() tabIndex: number;\n\n  /* Checkbox désactivée, faux par défaut */\n  @Input() disabled = false;\n\n  /* Icone affichée à gauche du label (optionnel) */\n  @Input() icon: string;\n\n  /* Evenement émis lors du clic sur la checkbox */\n  @Output() checkboxClick: EventEmitter<Event> = new EventEmitter();\n\n  /**@internal */\n  public onClick(event: Event): void {\n    this.checkboxClick.emit(event);\n  }\n\n  /**@internal */\n  public isIndeterminate(): boolean {\n    return this.selected === undefined;\n  }\n}\n","<span class=\"fr-checkbox-group fr-checkbox-group--sm\">\n  <input\n    [attr.tabindex]=\"tabIndex || null\"\n    [checked]=\"selected\"\n    (click)=\"onClick($event)\"\n    [disabled]=\"disabled\"\n    [indeterminate]=\"isIndeterminate()\"\n    [id]=\"id\"\n    type=\"checkbox\" />\n  <label class=\"fr-label\" [for]=\"id\" [ngClass]=\"{ 'fr-label--disabled': disabled }\">\n    @if (icon) {\n      <span [class]=\"icon + ' fr-icon--sm'\">&nbsp;</span>\n    }\n    @if (label) {\n      <span class=\"text-node\">{{ label }}</span>\n    } @else {\n      <ng-content select=\"[label]\"></ng-content>\n    }\n  </label>\n</span>\n","// Ordre alphabétique requis\nexport const MESSAGES_EN = {\n  datepicker: {\n    button: {\n      choose: { label: 'Choose Date' },\n      change: { label: 'Change Date' },\n    },\n    placeholder: 'mm/dd/yyyy',\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  },\n};\n","// Ordre alphabétique requis\nexport const MESSAGES_FR = {\n  datepicker: {\n    button: {\n      choose: { label: 'Choisir une date' },\n      change: { label: 'Changer la date' },\n    },\n    placeholder: 'jj/mm/aaaa',\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  },\n};\n","import { Directive, HostListener, Input } from '@angular/core';\n\n/**\n * L'objective de cette directive est d'implémenter un masque de saisie en fonction de plusieurs entrées :\n * - On peut considérer le `placeholder`, le `pattern` de l'input ou tout simplement un attribut `mask`.\n * - Dans cette première version, on gère tout simplement une date\n */\n@Directive({\n  selector: '[dsfrDateFormat]',\n  standalone: true,\n})\n/**\n * L'objectif de cette directive est de proposer, en l'absence de masque de saisie un formatage par défaut\n * @author pfontanet\n * @since 0.10\n */\nexport class DateFormatDirective {\n  @Input() dsfrDateFormat: string;\n\n  constructor() {}\n\n  @HostListener('input', ['$event'])\n  onInput(event: Event) {\n    const doFormat = !!this.dsfrDateFormat;\n    if (doFormat) {\n      const inputElt = event.target as HTMLInputElement;\n      inputElt.value = completeDateValue(inputElt.value);\n    }\n  }\n}\n\n/* -- Functions ----------------------------------------------------------------------------------------------------- */\n\n/**\n * Compléte la valeur d'une date\n */\nexport function completeDateValue(val: string): string {\n  // On supprime tout ce n'est ni chiffre ni séparateur\n  let value = filtreDigitSep(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 * Compléte la valeur d'une date en langue 'fr'\n * (export pour les tests)\n */\nexport function completeDateValueFr(val: string): string {\n  // On supprime tout ce n'est ni chiffre ni séparateur\n  let value = filtreDigitSep(val);\n\n  // const regexpFr = /^(?<day>3[01]|0?[1-9]|[12][0-9])?(?<s1>\\/)?(?<month>1[0-2]|0?[1-9])?(?<s2>\\/)?(?<year>[\\d]{0,4})?/;\n  const regexp = /^(?<day>[\\d]{0,2})?(?<s1>\\/)?(?<month>[\\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 day = groups['day'] || '';\n    let s1 = groups['s1'] || '';\n    s1 = !s1 && day.length === 2 ? '/' : s1;\n    const month = groups['month'] || '';\n    let s2 = groups['s2'] || '';\n    s2 = !s2 && month.length === 2 ? '/' : s2;\n    const year = groups['year'] || '';\n    value = day + s1 + month + s2 + year;\n  }\n\n  return value;\n}\n\n/**\n * Ne conserve que les chiffres et les séparateurs\n */\nfunction filtreDigitSep(value: String): string {\n  return value.replace(/[^\\d^\\/]/g, '');\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/dd/ddddd.\n * @author pfontanet\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   * @private\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    this.hostComponent.value = formatDateMaskValue(this.hostComponent.value);\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\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  Component,\n  ElementRef,\n  EventEmitter,\n  forwardRef,\n  Input,\n  OnChanges,\n  OnDestroy,\n  Output,\n  SimpleChanges,\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  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 } 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/**\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  standalone: true,\n  imports: [\n    DsfrFormInputModule,\n    FormsModule,\n    DateFormatDirective,\n    DsfrFormSelectModule,\n    A11yModule,\n    DsfrCalendarComponent,\n    DsfrI18nPipe,\n    CommonModule,\n    DropdownContainerComponent,\n    forwardRef(() => DateMaskDirective),\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>\n  implements AfterViewInit, Validator, OnDestroy, OnChanges\n{\n  /** Message d'information lié au composant */\n  @Input() message: string | undefined = undefined;\n\n  /** Représente la sévérité du message. */\n  @Input() severity: DsfrSeverity;\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 | undefined = undefined;\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 | undefined;\n\n  /** Emission de la date.*/\n  @Output() dateChange = new EventEmitter<DsfrDateEvent>();\n  @ViewChild(DsfrCalendarComponent) calendar: DsfrCalendarComponent;\n\n  @ViewChild('combobox') comboBox: ElementRef;\n  @ViewChild('modal') protected modal: ElementRef<HTMLDivElement>;\n  @ViewChild('cancelBtn') protected cancelBtn: ElementRef<HTMLButtonElement>;\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 dialogTitle = '';\n  protected modalLabel = '';\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;\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\n  /* Node */\n  private dialogTriggerBtnNode: HTMLElement;\n\n  private prevCodeLang: string;\n\n  /* Messages */\n  private buttonLabelChange: string;\n  private dayLabels: string[];\n  private monthLabels: string[];\n\n  private _min: string | undefined = undefined;\n  private _max: string | undefined = undefined;\n\n  /** @internal */\n  constructor(\n    private elementRef: ElementRef,\n    private i18n: DsfrI18nService,\n    private langService: LangService,\n    private logger: LoggerService,\n  ) {\n    super();\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  /**\n   * Compatibilité ascendante avec l'ancien `datepicker`.\n   * @deprecated since 0.10 Utiliser `message` et `severity` à la place.\n   */\n  get error(): string | undefined {\n    return (this.severity = DsfrSeverityConst.ERROR) ? this.message : undefined;\n  }\n\n  /**\n   * Compatibilité ascendante avec l'ancien `datepicker`.\n   * @deprecated since 0.10 Utiliser `message` et `severity` à la place.\n   */\n  get valid(): string | undefined {\n    return (this.severity = DsfrSeverityConst.SUCCESS) ? this.message : undefined;\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  /**\n   * Compatibilité ascendante avec l'ancien `datepicker`.\n   * @deprecated since 0.10 Utiliser `message` et `severity` à la place.\n   */\n  @Input() set error(message: string | undefined) {\n    this.message = message;\n    this.severity = DsfrSeverityConst.ERROR;\n  }\n\n  /**\n   * Compatibilité ascendante avec l'ancien `datepicker`.\n   * @deprecated since 0.10 Utiliser `message` et `severity` à la place.\n   */\n  @Input() set valid(message: string | undefined) {\n    this.message = message;\n    this.severity = DsfrSeverityConst.SUCCESS;\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 incorrecte. 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 incorrecte. Attendu: 'YYYY-MM-DD'. Reçu: ${value}`,\n      );\n\n      this._max = undefined;\n    } else {\n      this._max = value;\n    }\n  }\n\n  ngOnChanges(simpleChanges: SimpleChanges) {\n    if (simpleChanges['value'] && simpleChanges['value'].previousValue !== simpleChanges['value'].currentValue) {\n      this.reformatValue(this.value);\n    }\n  }\n\n  /** @internal */\n  ngOnDestroy() {\n    this.dialogTriggerBtnNode?.removeEventListener('keydown', this.handleTriggerButtonKeydown);\n  }\n\n  /** @internal */\n  ngAfterViewInit() {\n    this.dialogTriggerBtnNode = this.elementRef.nativeElement.querySelector('dsfr-form-input .fr-btn');\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    this.close(false);\n  }\n\n  /**\n   * @internal\n   * Interface Validator\n   */\n  validate(control: AbstractControl): ValidationErrors | null {\n    const errors = [];\n    const date = DateUtils.parse(this.codeLang, control.value);\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      errors.push({ err_min_date: this.i18n.t('datepicker.validationMin') });\n    } else if (maxDate && date && maxDate < date) {\n      errors.push({ err_max_date: this.i18n.t('datepicker.validationMax') });\n    }\n\n    return errors.length === 0 ? null : errors;\n  }\n\n  /**\n   * Mise a jour du titre lors de la navigation dans le calendrier\n   * @internal\n   */\n  public 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.dialogTitle = `${this.i18n.t('calendar.modal.title')}${this.translatedMonths[this.currentMonthIndex]} ${this.currentYear}`;\n  }\n\n  override writeValue(value: string): void {\n    this.reformatValue(value);\n\n    super.writeValue(this.value);\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    }\n  }\n\n  /**\n   * Gère le changement de valeur de l'input\n   */\n  protected onInputChange() {\n    this.handleInternalValidation();\n    this.setNewValue(this.value);\n\n    this.setDateForTriggerButtonLabel();\n  }\n\n  /**********************\n   * Event Handlers\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 handleDataChange(dateEvent: DsfrDateEvent): void {\n    this.setNewValue(dateEvent.value);\n    this.handleInternalValidation();\n\n    this.close(true);\n  }\n\n  /**\n   * Met à jour le titre de la dialog (visuellement caché) pour les besoins d'accessibilité.\n   */\n  protected updateDialogTitle(): void {\n    this.updateMonthIndexAndYear();\n    this.dialogTitle = `${this.i18n.t('calendar.modal.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   * Retourne `true` en cas d'erreur.\n   */\n  private handleInternalValidation(): boolean {\n    const date = DateUtils.parse(this.codeLang, this.value);\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      this.message = this.i18n.t('datepicker.validationMin');\n      this.severity = DsfrSeverityConst.ERROR;\n      return true;\n    } else if (maxDate && date && maxDate < date) {\n      this.message = this.i18n.t('datepicker.validationMax');\n      this.severity = DsfrSeverityConst.ERROR;\n      return true;\n    } else {\n      this.message = '';\n      return false;\n    }\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 reformatValue(value: string | undefined): void {\n    if (value === undefined) {\n      return;\n    }\n\n    const parsedIsoDate = DateUtils.parseDateIso(value);\n\n    if (parsedIsoDate === undefined) {\n      this.value = value;\n      return;\n    }\n\n    this.value = DateUtils.format(this.codeLang, parsedIsoDate);\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.buttonLabelChange = this.i18n.t('datepicker.button.change.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 = this.i18n.t('calendar.modal.ariaLabel');\n\n    this.updateMonthTranslations();\n    this.updateDialogTitle();\n\n    // Reformatage de l'input\n    const date = DateUtils.parse(this.prevCodeLang, this.value);\n    const newValue = DateUtils.format(code, date);\n    this.setNewValue(newValue);\n    this.prevCodeLang = code;\n  }\n\n  /**\n   * Ouvre la modale.\n   */\n  private open(): void {\n    this.updateDialogTitle();\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\n    this.isOpen = false;\n\n    if (focusTriggerBtn) {\n      this.dialogTriggerBtnNode.focus();\n    }\n  }\n\n  // Textbox methods\n\n  /**\n   * Mets à jour la valeur du composant (donc normalement textboxNode.value) et émets un événement\n   * @param value\n   * @private\n   */\n  private setNewValue(value: string | undefined): void {\n    this.value = value;\n    const date = DateUtils.parse(this.codeLang, this.value);\n\n    if (value && DateUtils.isValidDefaultString(value)) {\n      this.dateChange.emit({ value: this.value, date: date });\n      this.updateDialogTitle();\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 setDateForTriggerButtonLabel(): void {\n    const day = DateUtils.parse(this.codeLang, this.value);\n    if (day) {\n      let label = this.buttonLabelChange;\n      label += ', ' + this.dayLabels[day.getDay()];\n      label += ' ' + this.monthLabels[day.getMonth()];\n      label += ' ' + day.getDate();\n      label += ', ' + day.getFullYear();\n      this.dialogTriggerBtnNode.setAttribute('aria-label', label);\n    } else {\n      // If not a valid date, initialize with \"Choose Date\"\n      this.dialogTriggerBtnNode.setAttribute('aria-label', this.buttonLabelChoose);\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 date = DateUtils.parse(this.codeLang, this.value);\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","<edu-dropdown-container\n  #comboboxBox\n  [displayDropdown]=\"isOpen\"\n  [autoWidthDropdown]=\"true\"\n  [hasToolBar]=\"false\"\n  [classToWrap]=\"'dsfrx-datepicker'\"\n  (dropdownAttached)=\"onCalendarVisible()\"\n  (hideList)=\"onCalendarOutside()\"\n  [appendTo]=\"appendTo\"\n  [zIndex]=\"zIndex\">\n  <dsfr-form-input\n    ngProjectAs=\"control\"\n    [dsfrDateMask]=\"showMask ? codeLang : ''\"\n    [dsfrDateFormat]=\"showMask ? '' : codeLang\"\n    [(ngModel)]=\"value\"\n    (change)=\"onInputChange()\"\n    [label]=\"label\"\n    [hint]=\"hint\"\n    [placeholder]=\"placeholder\"\n    [disabled]=\"disabled\"\n    [required]=\"required\"\n    [message]=\"message\"\n    [severity]=\"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  <!-- Modale -->\n  @if (isOpen) {\n    <div\n      class=\"dsfrx-datepicker-dialog\"\n      role=\"dialog\"\n      aria-modal=\"true\"\n      cdkTrapFocus\n      data-expanded=\"true\"\n      (keydown)=\"handleModalKeydown($event)\"\n      [id]=\"modalId\"\n      [attr.aria-label]=\"modalLabel\"\n      #modal>\n      <h2 id=\"id-grid-label\" class=\"fr-sr-only\" aria-live=\"polite\">{{ dialogTitle }}</h2>\n      <dsfr-ext-calendar\n        [value]=\"value\"\n        [max]=\"max\"\n        [min]=\"min\"\n        [autofocus]=\"true\"\n        ariaLabelledBy=\"id-grid-label\"\n        (calendarChange)=\"onUpdateCalendarView($event)\"\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          (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  }\n</edu-dropdown-container>\n","import {\n  AfterViewInit,\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() showSeparator: boolean;\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  standalone: true,\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; // é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\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  afterNextRender,\n  AfterViewInit,\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 { EduClickOutsideDirective } from '../shared';\nimport { DsfrDropdownPositionDirective } from '../shared/components/dropdown-container/dropdown-position.directive';\nimport { DropdownUtils } from '../shared/components/dropdown-container/dropdown.utils';\nimport { DsfrDropdownMenuGroupComponent } from './component/dropdownmenu-group.component';\nimport { DsfrDropdownMenuItemComponent } from './component/dropdownmenu-item.component';\n\nexport interface DsfrMenuButton\n  extends Omit<DsfrButton, 'size' | 'variant' | 'iconPosition' | 'loader' | 'invertedOutlineContrast'> {\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  standalone: true,\n  imports: [\n    CommonModule,\n    DsfrButtonModule,\n    DsfrLinkModule,\n    EduClickOutsideDirective,\n    DsfrDropdownMenuItemComponent,\n    DsfrDropdownMenuGroupComponent,\n    DsfrDropdownPositionDirective,\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 | undefined;\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;\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 | undefined;\n\n  /**\n   * Indique la valeur de la propriété css z-index de la modale du composant.\n   */\n  @Input() zIndex: number | undefined = undefined;\n\n  /** Contenu personnalisé du menu */\n  @ContentChild('contentTemplate', { static: true }) contentTemplate: TemplateRef<any>;\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    // Recherche du container parent apres initialisation complete du DOM (= afterViewInit non suffisant)\n    afterNextRender(() => {\n      if (this.appendTo && this.btnMenuRef()?.nativeElement) {\n        this.containerToAttach = DropdownUtils.setParentContainer(this.appendTo, this.btnMenuRef()?.nativeElement);\n      }\n    });\n  }\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-checked'))) {\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","<div clickOutside data-expanded=\"true\" class=\"dsfrx-menu-dropdown\" (clickOutsideEvent)=\"onClickOutside()\">\n  <!-- ajouter ariaLabel ?-->\n  <button\n    #btnMenu\n    [id]=\"menuId\"\n    type=\"button\"\n    class=\"dsfrx-menu-dropdown__btn fr-btn--tertiary fr-btn\"\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      dsfrxDropdown\n      [autoWidth]=\"true\"\n      [ngStyle]=\"{ 'z-index': zIndex }\"\n      [comboBox]=\"btnMenuRef()?.nativeElement\"\n      [parentContainer]=\"containerToAttach\"\n      (appendDropdown)=\"onDropdownAttached()\"\n      class=\"dsfrx-menu-dropdown__list\"\n      [ngClass]=\"containerToAttach ? 'dsfrx-menu-dropdown__list--attach' : ''\"\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 menu; 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) {\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</div>\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      [link]=\"link.link\"\n      [size]=\"size\"\n      iconPosition=\"left\"\n      [ariaCurrent]=\"link.active\"\n      [icon]=\"link.icon\"\n      [targetLink]=\"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      [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      [size]=\"size\"\n      variant=\"tertiary\"\n      (click)=\"onButtonClick(action)\">\n    </dsfr-button>\n  </dsfrx-dropdownmenu-item>\n</ng-template>\n","import { CommonModule } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\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  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, FormsModule, DsfrTagModule, DsfrI18nPipe],\n})\nexport class SelectInputLabelComponent {\n  /** Placeholder pour le champ de sélection */\n  @Input() placeHolder: string | undefined;\n\n  /** Nombre max. d'options sélectionnées affichées */\n  @Input() maxDisplayOptions = 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() clearableOptions: boolean;\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  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    event.preventDefault();\n    this.clearOptionSelect.emit({ nativeEvent: event, option: opt });\n  }\n}\n","<div role=\"status\" aria-live=\"polite\">\n  @if (selectedOptions().length && selectedOptions().length > 0) {\n    @if (selectedOptions().length <= maxDisplayOptions) {\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                [mode]=\"'deletable'\"\n                [label]=\"opt.label\"\n                [small]=\"true\"\n                [ariaLabel]=\"('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          [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","/**\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-multiselect__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(elementToFocus: HTMLElement | null, currentElement?: HTMLElement): HTMLElement | null {\n    if (elementToFocus) {\n      return this.isGroupElement(elementToFocus)\n        ? (elementToFocus.children[1] 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[1] as HTMLElement; // Premier élément du groupe suivant\n      }\n\n      // Retour au début si fin de liste\n      return this.findNextListItem(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(elementToFocus: HTMLElement | null, currentElement?: HTMLElement): HTMLElement | null {\n    // focus sur le nom du groupe,\n    if (this.isPresentationElement(elementToFocus)) {\n      const prevGroup = elementToFocus?.parentElement?.previousElementSibling;\n      if (prevGroup && this.isGroupElement(prevGroup)) {\n        return prevGroup.lastElementChild as HTMLElement; // Dernier élément du groupe précédent\n      }\n      if (currentElement) {\n        // premier groupe ou element de la liste, renvoyer au dernier élément\n        return this.findPreviousListItem(this.getLastListItem(currentElement));\n      }\n    }\n\n    if (elementToFocus && this.isGroupElement(elementToFocus)) {\n      return elementToFocus.lastElementChild as HTMLElement; // dernier element du groupe\n    }\n    if (!elementToFocus && currentElement) {\n      return this.findPreviousListItem(this.getLastListItem(currentElement));\n    }\n\n    return elementToFocus; // Élément direct précédent\n  }\n\n  static setFocusElementOnFirst(event: KeyboardEvent): HTMLElement {\n    let firstItem = this.getFirstListItem(event.target as HTMLElement);\n\n    firstItem = this.findPreviousListItem(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(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 de présentation correspondant au nom du groupe */\n  static isPresentationElement(el: Element | null | undefined): boolean {\n    return !!(el && el.getAttribute('role') === 'presentation');\n  }\n}\n","import { CdkVirtualScrollViewport, 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  forwardRef,\n  signal,\n} from '@angular/core';\nimport { FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\nimport { DsfrButtonModule, DsfrI18nPipe, DsfrOption, DsfrSelectOption, DsfrTagModule } from '@edugouvfr/ngx-dsfr';\nimport { AbstractSelectComponent, DropdownContainerComponent, EduCheckboxComponent } from '../shared/components';\nimport { SelectInputLabelComponent } from '../shared/components/select-input-label/select-input-label.component';\nimport { EduMessageSeverityDirective } from '../shared/directives/message-severity.directive';\nimport { SelectFocusUtils } from './select-focus.utils';\n\ninterface OptionsViewModel extends DsfrOption {\n  isGroup?: boolean;\n  groupId?: number;\n}\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  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    CommonModule,\n    FormsModule,\n    ScrollingModule,\n    ReactiveFormsModule,\n    DropdownContainerComponent,\n    DsfrTagModule,\n    EduCheckboxComponent,\n    DsfrButtonModule,\n    DsfrI18nPipe,\n    SelectInputLabelComponent,\n    EduMessageSeverityDirective,\n  ],\n  providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DsfrMultiselectComponent), multi: true }],\n})\nexport class DsfrMultiselectComponent extends AbstractSelectComponent<DsfrSelectOption> implements OnInit {\n  /** @internal */\n  @ViewChild(CdkVirtualScrollViewport) viewport: CdkVirtualScrollViewport;\n\n  /** Template des labels des options */\n  @ContentChild('groupTemplate', { static: true }) groupTemplate: TemplateRef<any>;\n\n  /** @internal liste d'options filtrées */\n  public override optionsFilter: DsfrSelectOption[] = [];\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  /**@internal */\n  public override get options() {\n    return 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 = this.options ?? [];\n  }\n\n  /** Liste des options disponibles. */\n  @Input()\n  override set options(val: DsfrSelectOption[] | undefined) {\n    this._options = val ? val : [];\n    this.optionsFlatten = this.flattenOptions(this._options);\n    this.optionsFilter = this.options ?? [];\n\n    if (this.value && this.value.length > 0) {\n      this.writeValue(this.value);\n    }\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    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 DsfrSelectOption[])\n            : [];\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: DsfrOption) => this.optionsFlatten?.find((o) => this._compareWith(val, o.value)))\n              .filter((selected: DsfrOption | undefined) => !!selected),\n          ),\n        ) as DsfrSelectOption[];\n      }\n      this.indexFirstSelected = this.getFirstIndexSelected(value);\n    } else {\n      this.selectedOptions = [];\n      this.indexFirstSelected = null;\n    }\n\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: DsfrOption): void {\n    if (this.isSingleMode) {\n      this.optionClickSingle(option);\n    } else {\n      this.optionClickMultiple(option);\n    }\n\n    this.indexFirstSelected = this.getFirstIndexSelected(this.value);\n    this.selectionChange.emit(this.value);\n\n    e.preventDefault();\n  }\n\n  /** @internal */\n  public isSelected(option: DsfrOption) {\n    if (this.isSingleMode) {\n      return this._compareWith(this.value, option.value);\n    }\n    if (this.value && !(this.value instanceof Array)) throw Error('`value` must be an array.');\n    return !!this.value?.find((o: any) => this._compareWith(o, option.value));\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: DsfrOption): 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        event.preventDefault();\n        const nextItem = SelectFocusUtils.findNextListItem(el.nextElementSibling as HTMLElement, el as HTMLElement);\n        this.setFocusElement(nextItem);\n        break;\n      case 'ArrowUp':\n        event.preventDefault();\n        const prevItem = SelectFocusUtils.findPreviousListItem(\n          el.previousElementSibling as HTMLElement,\n          el as HTMLElement,\n        );\n        this.setFocusElement(prevItem);\n        break;\n      case 'End':\n        event.preventDefault();\n        const lastItem = SelectFocusUtils.setFocusElementOnLast(event);\n        this.setFocusElement(lastItem);\n        break;\n      case 'Home':\n        event.preventDefault();\n        const firstItem = SelectFocusUtils.setFocusElementOnFirst(event);\n        this.setFocusElement(firstItem);\n        break;\n      case 'Enter':\n        event.preventDefault();\n        this.onOptionClick(event, option);\n        this.hide();\n        break;\n      case ' ':\n        event.preventDefault();\n        this.onOptionClick(event, option);\n        break;\n      case 'Escape':\n        event.preventDefault();\n        this.hide();\n        break;\n      case 'Tab':\n        this.hide();\n        break;\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.optionsFilter?.length === this.value?.length) {\n      this.selectedOptions = [];\n      this.value = [];\n    } else {\n      this.selectedOptions = [...this.flattenOptions(this.optionsFilter)];\n      this.value = this.selectedOptions.map((o) => o.value);\n    }\n\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    let countResults = 0;\n\n    if (!this.options || !this.options.length || !this._searchFn) return;\n    const filtered: DsfrSelectOption[] = [];\n\n    for (const option of this.options) {\n      // Ignorer les groupes dans la recherche\n      if (option.options?.length) {\n        const optionsChildren = option.options.filter((o) => this._searchFn(o, this.searchText));\n\n        if (optionsChildren?.length) {\n          filtered.push({ ...option, options: optionsChildren });\n          countResults = countResults + optionsChildren.length;\n        }\n      } else if (this._searchFn(option, this.searchText)) {\n        filtered.push(option);\n        countResults++;\n      }\n    }\n\n    this.optionsFilter = filtered;\n    this.nbFilterResults.set(countResults);\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 onSearchFlatten(): void {\n    const groupIdsInserted: number[] = [];\n    let countResults = 0;\n\n    if (!this.optionsFlatten || !this.optionsFlatten.length || !this._searchFn) return;\n    this.optionsFilter = [];\n\n    for (const option of this.optionsFlatten) {\n      // Ignorer les groupes dans la recherche\n      if (!option.isGroup && this._searchFn(option, this.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 = this.optionsFlatten.find((o) => o.isGroup && o.groupId === option.groupId);\n\n          if (group) {\n            this.optionsFilter.push(group);\n            groupIdsInserted.push(option.groupId);\n          }\n        }\n\n        this.optionsFilter.push(option);\n        countResults++;\n      }\n    }\n\n    this.nbFilterResults.set(countResults);\n  }\n\n  /** @internal */\n  public hasisAllSelected(): boolean {\n    return this.optionsFilter?.length > 0 && this.value?.length === this.optionsFilter.length;\n  }\n\n  /** @internal */\n  public trackByIndex = (index: number): number => {\n    return index;\n  };\n\n  /** @internal */\n  public clearOption(event: { nativeEvent: Event; option: DsfrOption }): void {\n    event.nativeEvent.stopPropagation();\n    this.onOptionClick(event.nativeEvent, event.option);\n  }\n\n  /** @internal */\n  public clearAllOptions(): void {\n    this.selectedOptions = [];\n    this.value = [];\n\n    this.selectionChange.emit(this.value);\n  }\n\n  protected handleListFocus(el: HTMLElement): void {\n    const itemToFocus = SelectFocusUtils.findNextListItem(el);\n    if (itemToFocus) this.setFocusElement(itemToFocus);\n\n    if (this.virtualScroll) this.scrollForVirtualScroll(el);\n  }\n\n  /** Index du premier element sélectionné pour positionner le focus et aria */\n  private getFirstIndexSelected(value: any): number {\n    if (this.isSingleMode) {\n      return this.optionsFilter?.findIndex((o) => this._compareWith(o.value, value));\n    }\n\n    if (value && value[0]) {\n      const firstOption = value ? value[0] : null;\n      return this.optionsFilter?.findIndex((o) => this._compareWith(o.value, firstOption));\n    }\n\n    return -1;\n  }\n\n  /** Sélection ou déselection d'une option en mode multiple/checkbox */\n  private optionClickMultiple(option: DsfrOption): void {\n    if (!this.isSelected(option)) {\n      if (this.maxSelectedOptions && this.selectedOptions.length === this.maxSelectedOptions) {\n        // nothing here\n      } else {\n        this.selectedOptions.push(option);\n      }\n    } else {\n      // déselection\n      const i = this.selectedOptions.findIndex((o) => o === option);\n      this.selectedOptions.splice(i, 1);\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: DsfrOption): void {\n    this.selectedOptions = this.isSelected(option) ? [] : [option];\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  /** 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  /** Gestion à plat du tableau des options en cas de groupe */\n  private flattenOptions(options: DsfrSelectOption[]): 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++ },\n            ...opt.options.map((o) => {\n              return { ...o, groupId: indexGroup };\n            }),\n          ]\n        : [opt],\n    );\n\n    return optionsViewModel;\n  }\n}\n","<div\n  class=\"fr-select-group dsfrx-select\"\n  [class]=\"message ? 'fr-select-group--' + messageSeverity : ''\"\n  [ngClass]=\"{\n    'fr-select-group--disabled': disabled,\n    'fr-select-group--valid': message && messageSeverity === severityConst.SUCCESS,\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-multiselect'\"\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]=\"message ? selectId + '-messages' : null\"\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        [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      @if (showSelectAll && !maxSelectedOptions) {\n        <dsfr-button\n          size=\"SM\"\n          variant=\"tertiary\"\n          customClass=\"fr-btn--select-all\"\n          (click)=\"selectAll()\"\n          [label]=\"hasisAllSelected() ? ('multiselect.unselectAll' | dsfrI18n) : ('multiselect.selectAll' | dsfrI18n)\">\n        </dsfr-button>\n      }\n\n      @if (showSearch) {\n        <label for=\"{{ selectId }}-searchbox\" class=\"fr-sr-only\">{{ 'multiselect.searchList' | dsfrI18n }}</label>\n        <div\n          class=\"fr-input-wrap\"\n          [class.fr-icon-search-line]=\"!showClearSearch\"\n          [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            (input)=\"onSearch()\"\n            aria-controls=\"listboxid\"\n            aria-expanded=\"true\"\n            aria-autocomplete=\"list\"\n            autocomplete=\"off\"\n            aria-haspopup=\"listbox\"\n            [(ngModel)]=\"searchText\" />\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              {{ 'multiselect.resetSearch' | dsfrI18n }}\n            </button>\n          }\n        </div>\n      }\n      <div role=\"status\" aria-live=\"polite\" class=\"fr-sr-only\">\n        @if (nbFilterResults() > 0) {\n          <p>{{ nbFilterResults() }}&nbsp;{{ 'multiselect.availableResults' | dsfrI18n }}</p>\n        }\n      </div>\n    </ng-container>\n\n    <!-- template de listbox (options) en virtual scroll -->\n    @if (virtualScroll) {\n      <div\n        [ngStyle]=\"{ 'z-index': zIndex }\"\n        [style.max-height]=\"scrollHeight\"\n        #listbox\n        class=\"dsfrx-multiselect__list dsfrx-multiselect__list--has-viewport\">\n        <cdk-virtual-scroll-viewport\n          #viewport\n          minBufferPx=\"200\"\n          maxBufferPx=\"600\"\n          [itemSize]=\"virtualScrollItemHeight\"\n          class=\"viewport\">\n          @if (optionsFilter.length > 0) {\n            <ul\n              role=\"listbox\"\n              [attr.aria-multiselectable]=\"!this.isSingleMode\"\n              tabindex=\"-1\"\n              id=\"{{ selectId }}-listbox\">\n              <li\n                *cdkVirtualFor=\"let option of optionsFilter; let i = index\"\n                role=\"option\"\n                class=\"dsfrx-multiselect__item\"\n                [attr.data-dsfrx-option]=\"true\"\n                id=\"{{ selectId }}-listbox-{{ i }}\"\n                [ngClass]=\"{ selected: isSelected(option) }\"\n                [attr.data-id]=\"option.value\"\n                [attr.data-index]=\"i\"\n                [attr.aria-selected]=\"this.isSingleMode ? isSelected(option) : null\"\n                [attr.aria-checked]=\"this.isSingleMode ? null : isSelected(option)\"\n                tabindex=\"-1\"\n                (click)=\"onOptionClick($event, option)\"\n                (keydown)=\"onOptionKeydown($event, option)\">\n                <ng-container\n                  [ngTemplateOutlet]=\"insideItem\"\n                  [ngTemplateOutletContext]=\"{ option: option, index: i }\"></ng-container>\n              </li>\n            </ul>\n          }\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=\"listbox\"\n        tabindex=\"-1\"\n        [style.max-height]=\"scrollHeight\"\n        [attr.aria-multiselectable]=\"!this.isSingleMode\"\n        [class]=\"containerListClass\">\n        @for (option of optionsFilter; track option; let i = $index) {\n          @if (option.options) {\n            <ul class=\"dsfrx-multiselect__group\" role=\"group\" [attr.aria-labelledby]=\"selectId + '-group-' + i\">\n              <li id=\"{{ selectId }}-group-{{ i }}\" role=\"presentation\" class=\"dsfrx-multiselect__group--label\">\n                @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 optChild; let j = $index) {\n                <!-- template option -->\n                <ng-container\n                  [ngTemplateOutlet]=\"item\"\n                  [ngTemplateOutletContext]=\"{ option: optChild, index: i + '-' + j }\"></ng-container>\n              }\n            </ul>\n          } @else {\n            <!-- template option -->\n            <ng-container\n              [ngTemplateOutlet]=\"item\"\n              [ngTemplateOutletContext]=\"{ option: option, index: i }\"></ng-container>\n          }\n        }\n      </ul>\n    }\n    <!-- Empty list after search filter -->\n    <div\n      role=\"status\"\n      aria-live=\"polite\"\n      ngProjectAs=\"empty\"\n      class=\"dsfrx-multiselect__list dsfrx-multiselect__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  </edu-dropdown-container>\n  <div id=\"{{ selectId }}-messages\" class=\"fr-messages-group\" aria-live=\"polite\">\n    @if (message) {\n      <p class=\"fr-message\" [eduMessageSeverity]=\"messageSeverity\">\n        {{ message }}\n      </p>\n    }\n  </div>\n</div>\n\n<!-- template option -->\n<ng-template #item let-option=\"option\" let-index=\"index\">\n  <li\n    role=\"option\"\n    class=\"dsfrx-multiselect__item\"\n    [attr.data-dsfrx-option]=\"true\"\n    id=\"{{ selectId }}-listbox-{{ index }}\"\n    [ngClass]=\"{ selected: isSelected(option) }\"\n    [attr.data-id]=\"option.value\"\n    [attr.data-index]=\"index\"\n    [attr.aria-selected]=\"this.isSingleMode ? isSelected(option) : null\"\n    [attr.aria-checked]=\"this.isSingleMode ? null : isSelected(option)\"\n    tabindex=\"-1\"\n    (click)=\"onOptionClick($event, option)\"\n    (keydown)=\"onOptionKeydown($event, option)\">\n    <ng-container\n      [ngTemplateOutlet]=\"insideItem\"\n      [ngTemplateOutletContext]=\"{ option: option, index: index }\"></ng-container>\n  </li>\n</ng-template>\n\n<!-- template inside option -->\n<ng-template #insideItem let-option=\"option\" let-index=\"index\">\n  @if (showCheckboxes) {\n    <dsfr-ext-checkbox\n      [id]=\"selectId + '-checkbox-item-' + index\"\n      [disabled]=\"option.disabled\"\n      [tabIndex]=\"-1\"\n      [icon]=\"option.icon\"\n      [label]=\"optionTemplate ? undefined : option.label\"\n      (checkboxClick)=\"onOptionClick($event, option)\"\n      [selected]=\"isSelected(option)\">\n      @if (optionTemplate) {\n        <ng-container label\n          ><ng-container *ngTemplateOutlet=\"optionTemplate; context: { $implicit: option }\"></ng-container\n        ></ng-container>\n      }\n    </dsfr-ext-checkbox>\n  } @else {\n    @if (optionTemplate) {\n      <!-- Slot -->\n      <span><ng-container *ngTemplateOutlet=\"optionTemplate; context: { $implicit: option }\"></ng-container></span>\n    } @else {\n      <span>{{ option.label }} </span>\n    }\n  }\n</ng-template>\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  standalone: true,\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  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 } 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  standalone: true,\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\n  private _value: number | undefined;\n  private subscription = new Subscription();\n\n  constructor(protected i18n: DsfrI18nService) {\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 { Component, Input, ViewEncapsulation } from '@angular/core';\nimport {\n  DsfrBadge,\n  DsfrButtonModule,\n  DsfrButtonsGroupModule,\n  DsfrCardModule,\n  DsfrHeadingLevel,\n  DsfrModalAction,\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 | undefined;\n}\n\nexport interface DsfrTimelineEvent {\n  heading: string;\n  headingLevel?: DsfrHeadingLevel;\n  description?: string;\n  badges?: DsfrBadge[];\n  actions?: DsfrTimelineAction[];\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  standalone: true,\n  imports: [DsfrCardModule, DsfrButtonModule, DsfrButtonsGroupModule],\n})\nexport class DsfrTimelineComponent {\n  /**\n   * Liste d'évènements.\n   */\n  @Input() events: DsfrTimelineEvent[] = [];\n\n  /** @internal */\n  performAction(action: DsfrTimelineAction): void {\n    if (action.callback) {\n      action.callback();\n    }\n  }\n}\n","<ol class=\"dsfrx-timeline-container\">\n  @for (event of events; track event) {\n    <li class=\"timeline--bloc\">\n      <dsfr-card\n        [heading]=\"event.heading\"\n        [headingLevel]=\"event.headingLevel || ''\"\n        [description]=\"event.description ? event.description : ''\"\n        [badges]=\"event.badges ? event.badges : []\"\n        [hasFooter]=\"true\">\n        @if (event.actions && event.actions.length > 0) {\n          <dsfr-buttons-group footer inline=\"always\">\n            @for (action of event.actions; track action) {\n              <dsfr-button\n                [label]=\"action.label\"\n                [icon]=\"action?.icon\"\n                variant=\"secondary\"\n                [disabled]=\"action?.disabled || false\"\n                (click)=\"performAction(action)\"></dsfr-button>\n            }\n          </dsfr-buttons-group>\n        }\n      </dsfr-card>\n    </li>\n  }\n</ol>\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 { animate, style, transition, trigger } from '@angular/animations';\nimport { 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  standalone: true,\n  imports: [CommonModule, DsfrButtonModule, DsfrI18nPipe],\n})\nexport class ToastItemComponent implements DsfrToast, OnInit, AfterViewInit, OnDestroy {\n  /** Identifiant de la notification. */\n  @Input() toastId: string | undefined;\n\n  /** Titre de la notification. */\n  @Input() heading: string | undefined;\n\n  /** Contenu de la notification. */\n  @Input() content: string | undefined;\n\n  /** Sévérité de la notification (info par défaut). */\n  @Input() severity: DsfrSeverity;\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;\n  protected contentTemplate: string;\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  [attr.data-delay]=\"duration\"\n  [ngClass]=\"{\n    'dsfrx-toast': true,\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  <button\n    type=\"button\"\n    class=\"fr-btn fr-btn--close\"\n    [title]=\"'toast.close' | dsfrI18n\"\n    [attr.aria-label]=\"'toast.close' | dsfrI18n\"\n    [attr.aria-controls]=\"toastId\"\n    (click)=\"onClose()\">\n    <span aria-hidden=\"true\" 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 { animate, style, transition, trigger } from '@angular/animations';\nimport { CommonModule } from '@angular/common';\nimport { AfterViewInit, Component, EventEmitter, Input, OnDestroy, Output, ViewEncapsulation } 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\nconst fromBottom = style({\n  opacity: 0,\n  transform: 'translateY(100%)',\n});\n\nconst fromTop = style({\n  opacity: 0,\n  transform: 'translateY(-100%)',\n});\n\nconst idle = style({\n  opacity: 1,\n  transform: 'translateY(0%)',\n});\n\nconst faded = style({\n  opacity: 0,\n  transform: 'translateY(0%)',\n});\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  standalone: true,\n  imports: [CommonModule, ToastItemComponent],\n  animations: [\n    trigger('slideFromBottom', [\n      transition(':enter', [fromBottom, animate('300ms ease-in-out', idle)]),\n      transition(':leave', [idle, animate('250ms ease-in-out', faded)]),\n    ]),\n    trigger('slideFromTop', [\n      transition(':enter', [fromTop, animate('300ms ease-in-out', idle)]),\n      transition(':leave', [idle, animate('250ms ease-in-out', faded)]),\n    ]),\n  ],\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\n  /** @internal */\n  constructor(private toastService: 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\n  class=\"dsfrx-toast-container\"\n  role=\"status\"\n  aria-live=\"polite\"\n  [class]=\"position\"\n  [ngStyle]=\"{ 'z-index': zIndex }\">\n  @for (toast of toasts; track toast) {\n    @if (bottomPositions.includes(position)) {\n      <div [@slideFromBottom]>\n        <ng-container [ngTemplateOutlet]=\"toastTemplate\" [ngTemplateOutletContext]=\"{ toast: toast }\"></ng-container>\n      </div>\n    } @else {\n      <div [@slideFromTop]>\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    [@slideFromTop]\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 { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';\nimport { DsfrNode } 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  /** 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  /** 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  private firstNodeElt: HTMLElement;\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   */\n  public initTabindex(): void {\n    const elements = this.treeFocusable.findVisibleNodesElt();\n    if (elements && elements.length > 0) {\n      elements[0].tabIndex = 0;\n      this.firstNodeElt = elements[0];\n      // Notre composant prend le focus. Est-ce ce que l'on veut par défaut ?\n      this.firstNodeElt.focus({ preventScroll: true });\n      this.setAriaActiveDescendant(this.firstNodeElt);\n    }\n  }\n\n  /** Ouvre tous les nœuds de l'arborescence. */\n  public expandAll(nodes: DsfrNode[]): void {\n    this.setNodesExpanded(nodes, true);\n  }\n\n  /** Ferme tous les nœuds de l'arborescence. */\n  public collapseAll(nodes: DsfrNode[]): void {\n    this.setNodesExpanded(nodes, false);\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(currentNode: DsfrNode, event: KeyboardEvent, isParentSelectable: boolean): void {\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        this.doCollapseNode(currentNode);\n        break;\n\n      case 'ArrowRight':\n        this.doExpandNode(currentNode);\n        break;\n\n      case 'ArrowDown':\n        this.doFocusNext();\n        break;\n\n      case 'ArrowUp':\n        this.doFocusPrevious();\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    event.preventDefault();\n    event.stopPropagation();\n  }\n\n  /** Bascule l'état ouvert / fermé du nœud. */\n  doToggleExpand(node: DsfrNode) {\n    node.expanded = !node.expanded;\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  /** 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      elements[0].focus();\n      this.setAriaActiveDescendant(elements[0]);\n    }\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      elements[count - 1].focus();\n      this.setAriaActiveDescendant(elements[count - 1]);\n    }\n  }\n\n  /** Place le focus sur l'élément suivant l'élément courant. */\n  private doFocusNext(): void {\n    const elements = this.treeFocusable.findVisibleNodesElt();\n    this.currentElt = this.treeFocusable.findFocusElement();\n    const index = elements.findIndex((elt: HTMLElement) => elt === this.currentElt);\n\n    // Si on est déjà sur le dernier élément, on y reste\n    const nextIndex = index === elements.length - 1 ? index : index + 1;\n    const nextElt = elements[nextIndex];\n    if (this.currentElt) this.currentElt.tabIndex = -1;\n\n    if (nextElt && nextElt !== this.currentElt) {\n      nextElt.tabIndex = 0;\n      nextElt.focus();\n      this.setAriaActiveDescendant(nextElt);\n    }\n  }\n\n  /** Place le focus sur l'élément précédant le nœud courant. */\n  private doFocusPrevious(): void {\n    const elements = this.treeFocusable.findVisibleNodesElt();\n    if (!elements) return;\n    this.currentElt = this.treeFocusable.findFocusElement();\n    const index = elements.findIndex((elt: HTMLElement) => elt === this.currentElt);\n    // Si on est déjà sur le premier élément, on y reste\n    const prevIndex = index === 0 ? index : index - 1;\n    const prevElt = elements[prevIndex];\n\n    if (this.currentElt) this.currentElt.tabIndex = -1;\n\n    if (prevElt && prevElt !== this.currentElt) {\n      prevElt.tabIndex = 0;\n      prevElt?.focus();\n      this.setAriaActiveDescendant(prevElt);\n    }\n  }\n\n  /** Ferme le nœud. */\n  private doCollapseNode(node: DsfrNode): void {\n    node.expanded = false;\n  }\n\n  /** Ouvre le nœud. */\n  private doExpandNode(node: DsfrNode): void {\n    node.expanded = true;\n  }\n\n  /**\n   * Ouvre / ferme récursivement tous les nœuds nodes et leurs descendants\n   * @param nodes Liste de nœuds à ouvrir\n   * @param expand true : ouverture des nœuds, false : fermeture\n   */\n  private setNodesExpanded(nodes: DsfrNode[], expand: boolean): void {\n    nodes.forEach((node) => {\n      if (node.children) {\n        node.expanded = expand;\n        this.setNodesExpanded(node.children, expand);\n      }\n    });\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 { 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: boolean;\n\n  /** Retourne la structure arborescente du composant.  */\n  get nodes(): DsfrNode[];\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: DsfrNode[] = [];\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   *\n   * @param nodes Nœuds à initialiser\n   */\n  init(nodes: DsfrNode[]): DsfrViewNode[] {\n    // Initialisation de selected et checkboxId\n    const nodesClone = this.initNodes(nodes, 1);\n    this.singleModeSelectedSkip = false;\n\n    // Dans le cas d'utilisation des checkboxes, on met à jour la valeur de `selected` en fonction des enfants.\n    if (this.isCheckboxMode()) this.updateBranches(nodesClone);\n\n    return nodesClone;\n  }\n\n  /**\n   * Sélection / désélection du nœud suite à un clic.\n   * - Le nœud devient le nœud courant en mettant tabIndex=0\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: DsfrNode, nodeElt: HTMLElement): void {\n    // Le nœud qui reçoit l'événement devient focusable\n    nodeElt.tabIndex = 0;\n\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) => {\n      const nodeView: DsfrViewNode = {\n        ...n,\n        id: n.id || newUniqueId(),\n        ariaLevel: level,\n        ariaSize: size,\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): DsfrNode[] {\n    const size = nodes.length;\n\n    return nodes.map((node) => {\n      // noeud correspondant dans l'arbre cloné\n      const matchingNodeView = viewNodes.find((n) => n.id === node.id);\n\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          ariaLevel: matchingNodeView.ariaLevel, // on restaure le niveau de hiérarchie\n          ariaSize: size, // on restaure la taille, car elle a pu changer\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          children: node.children ? this.initNodes(node.children, level + 1) : undefined,\n        };\n\n        return nodeView;\n      }\n    });\n  }\n\n  public selectAllNodes(nodes: DsfrNode[], select = true) {\n    const isMultiple =\n      this.selectionMode === DsfrSelectionModeConst.MULTIPLE || this.selectionMode === DsfrSelectionModeConst.CHECKBOX;\n    if (isMultiple || (this.isSingleMode() && !select)) this.toggleNodesState(nodes, select);\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(): DsfrNode[] {\n    this.selectedNodes = this.selectedNodes.filter((n) => n.selected);\n    return this.selectedNodes;\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.selected = false;\n      return;\n    }\n\n    if (!this.isCheckboxMode() || !node.children) {\n      viewNode.selected = node.selected || false;\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: DsfrNode) {\n    node.selected = !node.selected;\n\n    if (!node.selected) {\n      this.treeSelectable.isAllSelected = false;\n    }\n  }\n\n  private handleSingleModeSelection(node: DsfrNode) {\n    const prevSingleNode = this.findFirstNodeSelected(this.treeSelectable.nodes);\n\n    if (prevSingleNode && prevSingleNode !== node) {\n      prevSingleNode.selected = false;\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  private handleMultipleModeSelection(node: DsfrNode) {\n    this.selectedNodes.push(node);\n    this.updateSelectedNodes();\n    this.toggleNodeSelectedState(node);\n    this.treeSelectable.notifySelectEvent(node);\n  }\n\n  private handleCheckboxModeSelection(node: DsfrNode) {\n    this.toggleNodeSelectedState(node);\n\n    // Propagation de la sélection\n    this.updateChildren(node, <boolean>node.selected);\n    // Mise à jour des parents pour tout le model\n    this.updateBranches(this.treeSelectable.nodes);\n\n    this.updateSelectedNodes();\n    this.treeSelectable.notifySelectEvent(node);\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: DsfrNode, selected: boolean): void {\n    if (node.disabled || node.hidden) return;\n\n    node.selected = selected;\n\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.selected && !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   * 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: DsfrNode): void {\n    if (!node.children) return;\n\n    /**\n     * Partie recursive de l'algorythme. 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    const allSelected = !node.children.some((n) => !n.selected);\n    const noneSelected = !allSelected && !node.children.some((n) => n.selected || n.selected === undefined);\n    const newState = allSelected ? true : noneSelected ? false : undefined;\n\n    if (node.selected !== newState) {\n      node.selected = newState;\n      this.treeSelectable.updateIndeterminate(node);\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: DsfrNode[]) {\n    nodes?.forEach((n) => this.updateBranchState(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: DsfrNode[]): DsfrNode | undefined {\n    let node: DsfrNode | undefined = undefined;\n    nodes.find((n) => {\n      if (node) return;\n      node = n.selected ? n : !n.children ? undefined : this.findFirstNodeSelected(n.children);\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: DsfrNode[], select: boolean) {\n    nodes.forEach((node) => {\n      if (node.hidden) return;\n      node.selected = select;\n      if (node.children) {\n        this.toggleNodesState(node.children, select);\n      } else {\n        // Mise a jour liste des noeuds sélectionnés\n        if (select && !this.selectedNodes.find((n) => n === node) && !node.disabled && !node.hidden) {\n          this.selectedNodes.push(node);\n        } else if (!select && !node.disabled && !node.hidden) {\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 === node);\n          if (i !== -1) this.selectedNodes.splice(i, 1);\n        }\n      }\n    });\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ContentChild,\n  ElementRef,\n  EventEmitter,\n  Input,\n  OnChanges,\n  Output,\n  SimpleChanges,\n  TemplateRef,\n  ViewEncapsulation,\n  inject,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { EduCheckboxComponent } from '../shared/components/checkbox/checkbox.component';\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@Component({\n  selector: 'dsfr-ext-tree, dsfrx-tree',\n  templateUrl: './tree.component.html',\n  styleUrls: ['./tree.component.scss'],\n  encapsulation: ViewEncapsulation.None,\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, FormsModule, EduCheckboxComponent],\n})\nexport class DsfrTreeComponent implements TreeFocusable, TreeSelectable, AfterViewInit, OnChanges {\n  /** Un tableau de nœuds d'arbre */\n  @Input() value: DsfrNode[] = [];\n\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<any>;\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: boolean; // Géré par TreeSelectManager\n\n  protected isModeSelectable: boolean = false;\n\n  private cd = inject(ChangeDetectorRef);\n\n  private focusManager = new TreeFocusManager(this);\n  private selectManager = new TreeSelectManager(this);\n  private _viewNodes: DsfrViewNode[] = []; // noeuds internes avec état (selected, expand)\n\n  constructor(private elementRef: ElementRef) {}\n\n  get selectionMode(): DsfrSelectionMode {\n    return this.selectManager.selectionMode;\n  }\n\n  /** Synonyme de value, mais plus explicite. */\n  get nodes(): DsfrNode[] {\n    return this._viewNodes;\n  }\n\n  /** Mode de sélection, `undefined` par défaut. */\n  @Input() set selectionMode(value: DsfrSelectionMode) {\n    this.selectManager.selectionMode = value;\n    this.isModeSelectable = this.selectManager.isSelectable();\n  }\n\n  /**\n   * Permet la récupération du modèle interne de l'arbre.\n   *\n   * @returns Un tableau de DsfrNode[].\n   */\n  public getTreeState(): DsfrNode[] {\n    return this.nodes;\n  }\n\n  /**\n   * Permet la récupération de la sélection courante de l'arbre.\n   *\n   * @returns Un tableau de DsfrNode[].\n   */\n  public getSelection(): DsfrNode[] {\n    return this.selectManager.selectedNodes;\n  }\n\n  /** @internal */\n  ngAfterViewInit() {\n    // Mise à jour des tabindex\n    this.focusManager.initTabindex();\n  }\n\n  /** @internal */\n  ngOnChanges({ value }: SimpleChanges) {\n    if (value) {\n      if (this._viewNodes.length === 0) {\n        // première initialisation\n        this._viewNodes = this.selectManager.init(this.value);\n      } else {\n        // mise à jour avec conservation des états d'expansion et de sélection (si noeuds fournis avec identifiants)\n        this._viewNodes = this.selectManager.updateNodesContent(this.value, this._viewNodes, 1);\n      }\n    }\n  }\n\n  /** @internal */\n  getCheckboxId(node: DsfrNode): string {\n    return 'cb' + node.id;\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  /**\n   * Ouvre tous les nœuds de l'arborescence.\n   */\n  /** @internal */\n  onNodeButton(node: DsfrNode) {\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: DsfrNode, event: Event) {\n    // const targetElt = <HTMLElement>event.target;\n    // ne pas activer si la target est le bouton expand/collapse\n    //if (!targetElt.classList?.contains('tree-button')) {\n    const nodeElt = <HTMLElement>event.currentTarget;\n    this.selectManager.doSelectNode(node, nodeElt);\n    //}\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: DsfrNode, event: KeyboardEvent) {\n    this.focusManager.doKeyEvent(node, event, true);\n  }\n\n  // -- TreeFocusable --------------------------------------------------------------------------------------------------\n\n  /** Ouvre tous les nœuds de l'arborescence. */\n  /** @internal */\n  expandAll() {\n    this.focusManager.expandAll(this.nodes);\n    this.cd.markForCheck();\n  }\n\n  /** Ferme tous les nœuds de l'arborescence.  */\n  /** @internal */\n  collapseAll() {\n    this.focusManager.collapseAll(this.nodes);\n    this.cd.markForCheck();\n  }\n\n  /** @internal */\n  doNodeDefaultAction(node: DsfrNode, event: Event) {\n    const nodeElt = <HTMLElement>event.currentTarget;\n    this.selectManager.doSelectNode(node, nodeElt);\n  }\n\n  /**\n   * Trouver tous les noeuds <li> visibles (possèdent une hauteur minimale).\n   *\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  /**\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   * @internal\n   */\n  updateContent(): void {\n    this._viewNodes = this.selectManager.updateNodesContent(this.value, this._viewNodes, 1);\n    this.cd.markForCheck();\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 = this.selectManager.init(this.value);\n    this.cd.markForCheck();\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.cd.markForCheck();\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: DsfrNode): 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.selected'.\n   * @param node Nœud de l'arbre\n   */\n\n  /** @internal */\n  updateIndeterminate(node: DsfrNode) {\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.selected === undefined;\n  }\n\n  /** @internal */\n  trackById(index: number, item: DsfrNode): string | undefined {\n    return item.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          role=\"treeitem\"\n          tabindex=\"-1\"\n          class=\"tree-node-content\"\n          (keydown)=\"onNodeKeydown(node, $event)\"\n          [attr.aria-selected]=\"isModeSelectable ? node.selected : null\"\n          [attr.aria-level]=\"node.ariaLevel\"\n          [attr.aria-setsize]=\"node.ariaSize\"\n          [attr.aria-posinset]=\"i + 1\"\n          [class.leaf]=\"!node.children\"\n          [attr.aria-expanded]=\"node.children ? node.expanded ?? false : 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.selected\">\n    <!-- Bouton collapse / expand -->\n    @if (node.children) {\n      <span\n        class=\"tree-button\"\n        [class]=\"!node.expanded ? '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        <dsfr-ext-checkbox\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.selected\"></dsfr-ext-checkbox>\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.expanded) {\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  AfterViewInit,\n  ChangeDetectionStrategy,\n  Component,\n  ElementRef,\n  Input,\n  OnInit,\n  ViewChild,\n  ViewEncapsulation,\n  forwardRef,\n} from '@angular/core';\nimport { FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\nimport { DsfrButtonModule, DsfrI18nPipe, DsfrTagModule } from '@edugouvfr/ngx-dsfr';\nimport { AbstractSelectComponent, DropdownContainerComponent, EduCheckboxComponent } from '../shared/components';\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@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  standalone: true,\n  imports: [\n    CommonModule,\n    FormsModule,\n    ScrollingModule,\n    ReactiveFormsModule,\n    DropdownContainerComponent,\n    DsfrTagModule,\n    DsfrButtonModule,\n    EduCheckboxComponent,\n    DsfrI18nPipe,\n    EduMessageSeverityDirective,\n    SelectInputLabelComponent,\n  ],\n  providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DsfrTreeselectComponent), multi: true }],\n})\nexport class DsfrTreeselectComponent\n  extends AbstractSelectComponent<DsfrViewNode>\n  implements OnInit, AfterViewInit, 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  /** @internal */\n  @ViewChild(CdkVirtualScrollViewport) viewport: CdkVirtualScrollViewport;\n\n  /** @internal*/\n  @ViewChild('listbox') listbox: ElementRef;\n\n  /** @internal*/\n  isAllSelected: boolean = false;\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  private treeFocusManager = new TreeFocusManager(this);\n  private treeSelectManager = new TreeSelectManager(this);\n\n  // Element HTML correspondant à l'ensemble du composant qui possède un attribut tabindex. */\n  private firstNodeElt: HTMLElement;\n\n  /** @internal Equivalent a options */\n  get nodes(): DsfrNode[] {\n    return this.optionsFilter as DsfrNode[];\n  }\n\n  /** @internal Synonyme de value, mais plus explicite. */\n  override get options() {\n    return this._options;\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    this._options = val ?? [];\n    this.optionsFilter = this.options ? [...this.options] : [];\n\n    if (!this.treeSelectManager.selectionMode) this.treeSelectManager.selectionMode = this.selectionMode;\n    if (this.value !== undefined) {\n      this.writeValue(this.value);\n    } else {\n      this.optionsFilter = this.treeSelectManager.init(this.optionsFilter);\n      if (this.virtualScroll) this.visibleNodes = this.optionsFilter;\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;\n    }\n\n    this.treeSelectManager.selectionStrategy =\n      this.isSingleMode && this.selectionStrategy ? this.selectionStrategy : 'leaf';\n  }\n\n  /** Positionne un tabindex de 0 sur le premier élément de la liste si aucun n'est sélectionné */\n  public ngAfterViewInit(): void {\n    const firstElement: HTMLElement = this.listbox.nativeElement?.children[0];\n\n    if (this.treeSelectManager.selectedNodes.length === 0 && firstElement) {\n      firstElement.setAttribute('tabindex', '0');\n    }\n\n    this.countLeaves = this.treeSelectManager.countLeaves;\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      // ici value est un tableau non-vide\n      this.setSelectedNodes(this.nodes, 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 = this.treeSelectManager.init(this.optionsFilter);\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 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: DsfrNode): void {\n    if (this.virtualScroll) {\n      const checkboxId = `cb-${node.id}`;\n      const inputElt = <HTMLInputElement>this.listbox?.nativeElement?.querySelector('#' + checkboxId);\n      if (inputElt) {\n        if (node.selected !== undefined) inputElt.checked = node.selected;\n        inputElt.indeterminate = node.selected === 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: DsfrNode, event: Event): void {\n    const nodeElt = <HTMLElement>event.currentTarget;\n    this.treeSelectManager.doSelectNode(node, nodeElt);\n\n    // Mise a jour de la value\n    this.selectedOptions = this.treeSelectManager.updateSelectedNodes();\n    this.value = this.selectedOptions;\n    this.selectionChange.emit(this.value);\n  }\n\n  /** @internal */\n  public findFocusElement(): HTMLElement {\n    const nativeElt = this.listbox.nativeElement;\n    return nativeElt.querySelector('.tree-node-content:focus');\n  }\n\n  /** @internal */\n  public findFirstSelectedNode(): HTMLElement {\n    const nodes = this.listbox?.nativeElement?.querySelectorAll('.tree-node-content .selected');\n    if (nodes[0]) {\n      return nodes[0];\n    }\n\n    return this.findVisibleNodesElt()[0];\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: DsfrNode }) {\n    this.onOptionClick(event.nativeEvent, event.option);\n    this.updateValueSelected();\n  }\n\n  /**\n   * Trouver tous les noeuds <li> visibles\n   *  @internal */\n  public findVisibleNodesElt(): HTMLElement[] {\n    const nativeElt = this.listbox.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  /** @internal */\n  public selectAll(): void {\n    this.isAllSelected = !this.isAllSelected;\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 = false;\n    this.treeSelectManager.selectAllNodes(this.optionsFilter, this.isAllSelected);\n    this.updateValueSelected();\n\n    this.selectionChange.emit(this.value);\n  }\n\n  /** @internal */\n  public expandAll(): void {\n    this.treeFocusManager.expandAll(this.optionsFilter);\n  }\n\n  /** @internal */\n  public collapseAll(): void {\n    this.treeFocusManager.collapseAll(this.optionsFilter);\n  }\n\n  /** @internal */\n  public handleListFocus(): void {\n    this.firstNodeElt = this.listbox.nativeElement.querySelector('.tree-node-content');\n    this.firstNodeElt.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: DsfrNode): void {\n    if (node.disabled) return;\n\n    const nodeElt = <HTMLElement>event.currentTarget;\n    this.treeSelectManager.doSelectNode(node, nodeElt);\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 = 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 DsfrNode[];\n    }\n\n    this.isAllSelected = this.areAllOptionsSelected();\n  }\n\n  /**\n   * Au clic sur les boutons flèches plier/déplier les noeuds\n   *  @internal */\n  public onNodeButton(node: DsfrNode): void {\n    this.treeFocusManager.doToggleExpand(node);\n  }\n\n  /**\n   * Interaction clavier avec un des noeuds\n   * @internal */\n  public onNodeKeydown(node: DsfrNode, event: KeyboardEvent): void {\n    const isParentSelectable: boolean = this.isSingleMode && this.selectionStrategy === 'all';\n\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    if (event.key === 'Enter') {\n      this.treeFocusManager.doKeyEvent(node, event, isParentSelectable);\n      this.hide();\n      return;\n    }\n\n    this.treeFocusManager.doKeyEvent(node, event, isParentSelectable);\n\n    if (!this.virtualScroll) {\n      this.treeFocusManager.currentElt?.scrollIntoView({ behavior: 'smooth', block: 'center' });\n    } else {\n      this.treeFocusManager.scrollForVirtualScroll(this.viewport);\n    }\n  }\n\n  /** @internal */\n  trackById(index: number, item: DsfrNode): string | undefined {\n    return item?.id;\n  }\n\n  /** @internal */\n  public isCheckboxMode(): boolean {\n    return this.treeSelectManager.isCheckboxMode();\n  }\n\n  /** @internal */\n  public isSelectable(): boolean {\n    return this.treeSelectManager.isSelectable();\n  }\n\n  /** @internal */\n  public isSelected(n: DsfrNode) {\n    if (this.isSingleMode) {\n      return this._compareWith(this.value, n);\n    }\n    if (this.value && !(this.value instanceof Array)) throw Error('`value` must be an array.');\n    return !!this.value?.find((o: any) => this._compareWith(o, n));\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: DsfrNode, 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.expanded = 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: DsfrNode): DsfrNode | 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 DsfrNode[];\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,\n   * selon les valeurs sélectionnées programmatiquement\n   * @param nodes arbre complet\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        if (n.selected) return;\n        if (n.children) this.setSelectedNodes(n.children, value);\n      } else {\n        n.selected = value.find((o: DsfrNode) => this._compareWith(n, o)) ? true : false;\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]=\"message ? 'fr-select-group--' + messageSeverity : ''\"\n  [ngClass]=\"{\n    'fr-select-group--valid': message && messageSeverity === severityConst.SUCCESS,\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-multiselect'\"\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]=\"message ? selectId + '-messages' : null\"\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      @if (showSelectAll && !maxSelectedOptions && selectionMode !== 'single') {\n        <dsfr-button\n          size=\"SM\"\n          variant=\"tertiary\"\n          customClass=\"fr-btn--select-all\"\n          (click)=\"selectAll()\"\n          [label]=\"isAllSelected ? ('multiselect.unselectAll' | dsfrI18n) : ('multiselect.selectAll' | dsfrI18n)\">\n        </dsfr-button>\n      }\n      @if (showSearch) {\n        <label for=\"{{ selectId }}-searchbox\" class=\"fr-sr-only\">{{ 'multiselect.searchList' | dsfrI18n }}</label>\n        <div\n          class=\"fr-input-wrap\"\n          [class.fr-icon-search-line]=\"!showClearSearch\"\n          [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            [placeholder]=\"searchMessage ?? 'multiselect.search' | dsfrI18n\"\n            (input)=\"onSearch()\"\n            aria-controls=\"listboxid\"\n            aria-expanded=\"true\"\n            aria-autocomplete=\"list\"\n            aria-haspopup=\"listbox\"\n            autocomplete=\"off\"\n            [(ngModel)]=\"searchText\" />\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              {{ 'multiselect.resetSearch' | dsfrI18n }}\n            </button>\n          }\n        </div>\n      }\n      <div role=\"status\" aria-live=\"polite\" class=\"fr-sr-only\">\n        @if (optionsFilter && countFilteredOptions > 0) {\n          <p>{{ countFilteredOptions }}&nbsp;{{ 'multiselect.availableResults' | dsfrI18n }}</p>\n        }\n      </div>\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-multiselect__list dsfrx-multiselect__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              role=\"treeitem\"\n              [id]=\"selectId + '-item-' + node.id\"\n              [class.leaf]=\"!node.children\"\n              [attr.aria-expanded]=\"node.expanded ?? (node.children ? false : null)\"\n              [class.selected]=\"node.selected\"\n              [attr.aria-selected]=\"this.isSingleMode ? (node.selected ?? false) : null\"\n              [attr.aria-checked]=\"this.isSingleMode ? null : (node.selected ?? false)\"\n              [attr.aria-disabled]=\"node.disabled\"\n              [attr.aria-level]=\"node.ariaLevel\"\n              [attr.aria-setsize]=\"node.ariaSize\"\n              [attr.aria-posinset]=\"i + 1\"\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 [ngTemplateOutlet]=\"nodeTemplate\" [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-multiselect__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            <li\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.expanded ?? (node.children ? false : null)\"\n              [class.selected]=\"node.selected\"\n              [attr.aria-level]=\"node.ariaLevel\"\n              [attr.aria-setsize]=\"node.ariaSize\"\n              [attr.aria-posinset]=\"i + 1\"\n              [attr.aria-selected]=\"this.isSingleMode ? (node.selected ?? false) : null\"\n              [attr.aria-checked]=\"this.isSingleMode ? null : (node.selected ?? false)\"\n              [attr.aria-disabled]=\"node.disabled\">\n              <ng-container [ngTemplateOutlet]=\"nodeTemplate\" [ngTemplateOutletContext]=\"{ node: node }\"></ng-container>\n            </li>\n          }\n        }\n      </ul>\n    }\n\n    <!-- Empty list after search filter -->\n    <div\n      role=\"status\"\n      aria-live=\"polite\"\n      ngProjectAs=\"empty\"\n      class=\"dsfrx-multiselect__list dsfrx-multiselect__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=\"{{ selectId }}-messages\" class=\"fr-messages-group\" aria-live=\"polite\">\n    @if (message) {\n      <p class=\"fr-message\" [eduMessageSeverity]=\"messageSeverity\">\n        {{ message }}\n      </p>\n    }\n  </div>\n</div>\n\n<!-- Template one node -->\n<ng-template #nodeTemplate let-node=\"node\">\n  <div\n    class=\"tree-node-content-inside\"\n    [class.selectable]=\"isSelectable()\"\n    [class.selected]=\"node.selected\"\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.expanded ? '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        <dsfr-ext-checkbox\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.selected\">\n          @if (optionTemplate) {\n            <ng-container label\n              ><ng-container *ngTemplateOutlet=\"optionTemplate; context: { $implicit: node }\"></ng-container\n            ></ng-container>\n          }\n        </dsfr-ext-checkbox>\n      }\n    </div>\n  </div>\n\n  <!-- Children -->\n  @if (node.children && node.expanded) {\n    <ng-container\n      [ngTemplateOutlet]=\"nodesTemplate\"\n      [ngTemplateOutletContext]=\"{ nodes: node.children }\"></ng-container>\n  }\n</ng-template>\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        <li\n          [id]=\"selectId + '-item-' + nodeChild.id\"\n          [attr.aria-expanded]=\"nodeChild.expanded ?? false\"\n          [class.leaf]=\"!nodeChild.children\"\n          tabindex=\"-1\"\n          [class.leaf]=\"!nodeChild.children\"\n          class=\"tree-node-content\"\n          (keydown)=\"onNodeKeydown(nodeChild, $event)\"\n          [attr.aria-expanded]=\"nodeChild.expanded ?? (nodeChild.children ? false : null)\"\n          [attr.aria-selected]=\"this.isSingleMode ? nodeChild.selected : null\"\n          [attr.aria-checked]=\"this.isSingleMode ? null : nodeChild.selected\"\n          [attr.aria-level]=\"nodeChild.ariaLevel\"\n          [attr.aria-setsize]=\"nodeChild.ariaSize\"\n          [attr.aria-posinset]=\"i + 1\"\n          role=\"treeitem\">\n          <ng-container\n            [ngTemplateOutlet]=\"nodeTemplate\"\n            [ngTemplateOutletContext]=\"{ node: nodeChild, index: i }\"></ng-container>\n        </li>\n      }\n    }\n  </ul>\n</ng-template>\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 files',\n      selectedFiles: 'selected files',\n      formatSize: 'Formats and sizes',\n      removeAll: 'Remove all',\n      removeAllDetailed: 'Remove all previously selected files',\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    },\n  },\n};\n","import { BreakpointObserver } from '@angular/cdk/layout';\nimport {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  EventEmitter,\n  Input,\n  OnInit,\n  Output,\n  Renderer2,\n  ViewChild,\n  ViewEncapsulation,\n  forwardRef,\n  inject,\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  DsfrFileSizeUnit,\n  DsfrI18nPipe,\n  DsfrI18nService,\n  DsfrSeverity,\n  DsfrUploadModule,\n  Language,\n  newUniqueId,\n} from '@edugouvfr/ngx-dsfr';\nimport { EduMessageSeverityDirective } from '../shared/directives/message-severity.directive';\nimport { FileDetailsPipe } from './file-details.pipe';\nimport { MESSAGES_EN } from './i18n/messages.en';\nimport { MESSAGES_FR } from './i18n/messages.fr';\n\n@Component({\n  selector: 'dsfr-ext-upload-dnd, dsfrx-upload-dnd',\n  standalone: true,\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    DsfrI18nPipe,\n    FileDetailsPipe,\n    EduMessageSeverityDirective,\n  ],\n  encapsulation: ViewEncapsulation.None,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => DsfrUploadDndComponent),\n      multi: true,\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  /** 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 | undefined;\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 | undefined;\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  /** Message d'information lié au composant. */\n  @Input() message: string | undefined = undefined;\n\n  /** Représente la sévérité du message. */\n  @Input() messageSeverity: DsfrSeverity = 'info';\n\n  /**\n   * Id de l'élément affichant les messages associé à l'éditeur. A renseigner si vous souhaitez positionner un attribut\n   * `aria-describedby` référençant votre message au niveau de l'élément hôte de l'éditeur.\n   *\n   * Attention : cet input est statique et doit être connu à l'initialisation du composant.\n   */\n  @Input() messagesGroupId: string;\n\n  /** 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  /** @internal */\n  public i18n = inject(DsfrI18nService);\n\n  protected breakpointObserver = inject(BreakpointObserver);\n  protected customBreakpoint = '(max-width: 320px)';\n  protected restitutionSelectedFiles = '';\n  protected messageExpandButton: string;\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  private _renderer = inject(Renderer2);\n\n  constructor(private cdr: ChangeDetectorRef) {\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  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.message) {\n      this.ariaDescribedby = `${this.formatAskedUniqueId} ${this.messagesGroupId}`;\n    }\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   * 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        this.value = this.value!.concat(newFiles);\n      } else {\n        this.value = newFiles;\n      }\n\n      this.selectionChange.emit(this.value);\n    }\n  }\n\n  protected deleteFile(index: any): void {\n    this.value!.splice(index, 1);\n    if (this.value?.length === 0) {\n      this.inputFile.nativeElement.focus();\n    }\n  }\n\n  protected deleteAllFiles(): void {\n    this.value = [];\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","<div\n  class=\"edu-upload-dnd__container\"\n  [class]=\"{\n    'edu-upload-dnd--error': message && messageSeverity === 'error',\n    'edu-upload-dnd--valid': message && (messageSeverity === 'valid' || messageSeverity === 'success'),\n    'edu-upload-dnd--info': message && messageSeverity === 'info',\n    'edu-upload-dnd--warning': message && messageSeverity === 'warning',\n    'edu-upload-dnd__container--inline': inline,\n  }\">\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</div>\n\n<div aria-live=\"polite\">\n  @if (message) {\n    <p [attr.id]=\"messagesGroupId\" [eduMessageSeverity]=\"messageSeverity\">\n      {{ message }}\n    </p>\n  }\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 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            [ariaLabel]=\"'uploadDnd.fileList.removeAllDetailed' | dsfrI18n\"\n            [type]=\"'button'\"\n            [variant]=\"'tertiary'\"\n            size=\"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\">Formats et poids :</span>{{ file | fileDetails: sizeUnit }}\n                </p>\n              </div>\n              <dsfr-button\n                [type]=\"'button'\"\n                [tooltipMessage]=\"'Supprimer le document - ' + file.name\"\n                variant=\"tertiary-no-outline\"\n                size=\"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    @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    title=\"\"\n    [multiple]=\"multiple\"\n    [disabled]=\"disabled\"\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    (change)=\"onFileChange($event)\"\n    (cancel)=\"onFileBrowsingCancel()\" />\n  <p class=\"fr-sr-only\">\n    {{\n      !value || value.length === 0\n        ? ('uploadDnd.fileList.noFile' | dsfrI18n)\n        : 'Fichiers sélectionnés : ' + restitutionSelectedFiles\n    }}\n  </p>\n</ng-template>\n\n<!-- MARK: Template File List -->\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          [ariaLabel]=\"'uploadDnd.fileList.removeAllDetailed' | dsfrI18n\"\n          [size]=\"'MD'\"\n          [icon]=\"'fr-icon-delete-line'\"\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            label=\"\"\n            icon=\"fr-icon-delete-line\"\n            size=\"SM\"\n            [ariaLabel]=\"'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                [tooltipMessage]=\"'Supprimer ce document - ' + file.name\"\n                variant=\"tertiary-no-outline\"\n                size=\"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  standalone: true,\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() 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; 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/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/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","i1.DsfrToastService"],"mappings":"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"}