@codegouvfr/react-dsfr
Version:
French State Design System React integration library
4 lines (3 loc) • 35.3 kB
JavaScript
/*! DSFR v1.10.0 | SPDX-License-Identifier: MIT | License-Filename: LICENSE.md | restricted use (see terms and conditions) */
const e="fr",t="dsfr",s=window[t],i=s.internals.ns.selector("accordion"),n=s.internals.ns.selector("collapse"),r={GROUP:s.internals.ns.selector("accordions-group"),ACCORDION:i,COLLAPSE:`${i} > ${n}, ${i} > *:not(${i}, ${n}) > ${n}, ${i} > *:not(${i}, ${n}) > *:not(${i}, ${n}) > ${n}`,COLLAPSE_LEGACY:`${i} ${n}`,BUTTON:`${i}__btn`};class a extends s.core.Instance{static get instanceClassName(){return"Accordion"}get collapsePrimary(){return this.element.children.map((e=>e.getInstance("CollapseButton"))).filter((e=>null!==e&&e.hasClass(r.BUTTON)))[0]}}class o extends s.core.CollapsesGroup{static get instanceClassName(){return"AccordionsGroup"}validate(e){const t=e.node.matches(s.internals.legacy.isLegacy?r.COLLAPSE_LEGACY:r.COLLAPSE);return super.validate(e)&&t}}s.accordion={Accordion:a,AccordionSelector:r,AccordionsGroup:o},s.internals.register(s.accordion.AccordionSelector.GROUP,s.accordion.AccordionsGroup),s.internals.register(s.accordion.AccordionSelector.ACCORDION,s.accordion.Accordion);const l={EQUISIZED_BUTTON:`${s.internals.ns.selector("btns-group--equisized")} ${s.internals.ns.selector("btn")}`,EQUISIZED_GROUP:s.internals.ns.selector("btns-group--equisized")};s.button={ButtonSelector:l},s.internals.register(s.button.ButtonSelector.EQUISIZED_BUTTON,s.core.Equisized),s.internals.register(s.button.ButtonSelector.EQUISIZED_GROUP,s.core.EquisizedsGroup);class c extends s.core.Instance{static get instanceClassName(){return"CardDownload"}init(){this.addAscent(s.core.AssessEmission.UPDATE,(e=>{this.descend(s.core.AssessEmission.UPDATE,e)})),this.addAscent(s.core.AssessEmission.ADDED,(()=>{this.descend(s.core.AssessEmission.ADDED)}))}}const h={DOWNLOAD:s.internals.ns.selector("card--download"),DOWNLOAD_DETAIL:`${s.internals.ns.selector("card--download")} ${s.internals.ns.selector("card__end")} ${s.internals.ns.selector("card__detail")}`};s.card={CardSelector:h,CardDownload:c},s.internals.register(s.card.CardSelector.DOWNLOAD,s.card.CardDownload),s.internals.register(s.card.CardSelector.DOWNLOAD_DETAIL,s.core.AssessDetail);const d={BREADCRUMB:s.internals.ns.selector("breadcrumb"),BUTTON:s.internals.ns.selector("breadcrumb__button")};class u extends s.core.Instance{constructor(){super(),this.count=0,this.focusing=this.focus.bind(this)}static get instanceClassName(){return"Breadcrumb"}init(){this.getCollapse(),this.isResizing=!0}get proxy(){const e=this;return Object.assign(super.proxy,{focus:e.focus.bind(e),disclose:e.collapse.disclose.bind(e.collapse)})}getCollapse(){const e=this.collapse;e?e.listen(s.core.DisclosureEvent.DISCLOSE,this.focusing):this.addAscent(s.core.DisclosureEmission.ADDED,this.getCollapse.bind(this))}resize(){const e=this.collapse,t=this.links;e&&t.length&&(this.isBreakpoint(s.core.Breakpoints.MD)?e.buttonHasFocus&&t[0].focus():t.indexOf(document.activeElement)>-1&&e.focus())}get links(){return[...this.querySelectorAll("a[href]")]}get collapse(){return this.element.getDescendantInstances(s.core.Collapse.instanceClassName,null,!0)[0]}focus(){this.count=0,this._focus()}_focus(){const e=this.links[0];e&&(e.focus(),this.request(this.verify.bind(this)))}verify(){if(this.count++,this.count>100)return;const e=this.links[0];e&&document.activeElement!==e&&this._focus()}get collapsePrimary(){return this.element.children.map((e=>e.getInstance("CollapseButton"))).filter((e=>null!==e&&e.hasClass(d.BUTTON)))[0]}}s.breadcrumb={BreadcrumbSelector:d,Breadcrumb:u},s.internals.register(s.breadcrumb.BreadcrumbSelector.BREADCRUMB,s.breadcrumb.Breadcrumb);const g={TOOLTIP:s.internals.ns.selector("tooltip"),SHOWN:s.internals.ns.selector("tooltip--shown"),BUTTON:s.internals.ns.selector("btn--tooltip")},m=1,p=2;class b extends s.core.PlacementReferent{constructor(){super(),this._state=0}static get instanceClassName(){return"TooltipReferent"}init(){if(super.init(),this.listen("focusin",this.focusIn.bind(this)),this.listen("focusout",this.focusOut.bind(this)),!this.matches(g.BUTTON)){const e=this.mouseover.bind(this);this.listen("mouseover",e),this.placement.listen("mouseover",e);const t=this.mouseout.bind(this);this.listen("mouseout",t),this.placement.listen("mouseout",t)}this.addEmission(s.core.RootEmission.KEYDOWN,this._keydown.bind(this)),this.listen("click",this._click.bind(this)),this.addEmission(s.core.RootEmission.CLICK,this._clickOut.bind(this))}_click(){this.focus()}_clickOut(e){this.node.contains(e)||this.blur()}_keydown(e){if(e===s.core.KeyCodes.ESCAPE)this.blur(),this.close()}close(){this.state=0}get state(){return this._state}set state(e){this._state!==e&&(this.isShown=e>0,this._state=e)}focusIn(){this.state|=m}focusOut(){this.state&=~m}mouseover(){this.state|=p}mouseout(){this.state&=~p}}const T=t=>`${e}-${t}`;T.selector=(e,t)=>(void 0===t&&(t="."),`${t}${T(e)}`),(T.attr=e=>`data-${T(e)}`).selector=(e,t)=>{let s=T.attr(e);return void 0!==t&&(s+=`="${t}"`),`[${s}]`},T.event=e=>`${t}.${e}`,T.emission=(e,t)=>`emission:${e}.${t}`;const S={SHOW:T.event("show"),HIDE:T.event("hide")},E="hidden",A="shown",_="hiding";class D extends s.core.Placement{constructor(){super(s.core.PlacementMode.AUTO,[s.core.PlacementPosition.TOP,s.core.PlacementPosition.BOTTOM],[s.core.PlacementAlign.CENTER,s.core.PlacementAlign.START,s.core.PlacementAlign.END]),this.modifier="",this._state=E}static get instanceClassName(){return"Tooltip"}init(){super.init(),this.register(`[aria-describedby="${this.id}"]`,b),this.listen("transitionend",this.transitionEnd.bind(this))}transitionEnd(){this._state===_&&(this._state=E,this.isShown=!1)}get isShown(){return super.isShown}set isShown(e){if(this.isEnabled)switch(!0){case e:this._state=A,this.addClass(g.SHOWN),this.dispatch(S.SHOW),super.isShown=!0;break;case this.isShown&&!e&&this._state===A:this._state=_,this.removeClass(g.SHOWN);break;case this.isShown&&!e&&this._state===E:this.dispatch(S.HIDE),super.isShown=!1}}render(){super.render();let e=this.referentRect.center-this.rect.center;const t=.5*this.rect.width-8;e<-t&&(e=-t),e>t&&(e=t),this.setProperty("--arrow-x",`${e.toFixed(2)}px`)}}s.tooltip={Tooltip:D,TooltipSelector:g,TooltipEvent:S},s.internals.register(s.tooltip.TooltipSelector.TOOLTIP,s.tooltip.Tooltip);class C extends s.core.Instance{static get instanceClassName(){return"ToggleInput"}get isChecked(){return this.node.checked}}class L extends s.core.Instance{static get instanceClassName(){return"ToggleStatusLabel"}init(){this.register(`input[id="${this.getAttribute("for")}"]`,C),this.update(),this.isSwappingFont=!0}get proxy(){return Object.assign(super.proxy,{update:this.update.bind(this)})}get input(){return this.getRegisteredInstances("ToggleInput")[0]}update(){this.node.style.removeProperty("--toggle-status-width");const e=this.input.isChecked,t=getComputedStyle(this.node,":before");let s=parseFloat(t.width);this.input.node.checked=!e;const i=getComputedStyle(this.node,":before"),n=parseFloat(i.width);n>s&&(s=n),this.input.node.checked=e,this.node.style.setProperty("--toggle-status-width",s/16+"rem")}swapFont(e){this.update()}}const f={STATUS_LABEL:`${s.internals.ns.selector("toggle__label")}${s.internals.ns.attr.selector("checked-label")}${s.internals.ns.attr.selector("unchecked-label")}`};s.toggle={ToggleStatusLabel:L,ToggleSelector:f},s.internals.register(s.toggle.ToggleSelector.STATUS_LABEL,s.toggle.ToggleStatusLabel);const I=s.internals.ns.selector("sidemenu__item"),O=s.internals.ns.selector("collapse"),N={LIST:s.internals.ns.selector("sidemenu__list"),COLLAPSE:`${I} > ${O}, ${I} > *:not(${I}, ${O}) > ${O}, ${I} > *:not(${I}, ${O}) > *:not(${I}, ${O}) > ${O}`,COLLAPSE_LEGACY:`${I} ${O}`,ITEM:s.internals.ns.selector("sidemenu__item"),BUTTON:s.internals.ns.selector("sidemenu__btn")};class v extends s.core.CollapsesGroup{static get instanceClassName(){return"SidemenuList"}validate(e){return super.validate(e)&&e.node.matches(s.internals.legacy.isLegacy?N.COLLAPSE_LEGACY:N.COLLAPSE)}}class y extends s.core.Instance{static get instanceClassName(){return"SidemenuItem"}get collapsePrimary(){return this.element.children.map((e=>e.getInstance("CollapseButton"))).filter((e=>null!==e&&e.hasClass(N.BUTTON)))[0]}}s.sidemenu={SidemenuList:v,SidemenuItem:y,SidemenuSelector:N},s.internals.register(s.sidemenu.SidemenuSelector.LIST,s.sidemenu.SidemenuList),s.internals.register(s.sidemenu.SidemenuSelector.ITEM,s.sidemenu.SidemenuItem);const w={MODAL:s.internals.ns.selector("modal"),SCROLL_DIVIDER:s.internals.ns.selector("scroll-divider"),BODY:s.internals.ns.selector("modal__body"),TITLE:s.internals.ns.selector("modal__title")};class P extends s.core.DisclosureButton{constructor(){super(s.core.DisclosureType.OPENED)}static get instanceClassName(){return"ModalButton"}}const R={CONCEALING_BACKDROP:s.internals.ns.attr("concealing-backdrop")};class k extends s.core.Disclosure{constructor(){super(s.core.DisclosureType.OPENED,w.MODAL,P,"ModalsGroup"),this._isActive=!1,this.scrolling=this.resize.bind(this,!1),this.resizing=this.resize.bind(this,!0)}static get instanceClassName(){return"Modal"}init(){super.init(),this._isDialog="DIALOG"===this.node.tagName,this.isScrolling=!1,this.listenClick(),this.addEmission(s.core.RootEmission.KEYDOWN,this._keydown.bind(this))}_keydown(e){if(e===s.core.KeyCodes.ESCAPE)this._escape()}_escape(){switch(document.activeElement?document.activeElement.tagName:void 0){case"INPUT":case"LABEL":case"TEXTAREA":case"SELECT":case"AUDIO":case"VIDEO":break;default:this.isDisclosed&&(this.conceal(),this.focus())}}retrieved(){this._ensureAccessibleName()}get body(){return this.element.getDescendantInstances("ModalBody","Modal")[0]}handleClick(e){e.target===this.node&&"false"!==this.getAttribute(R.CONCEALING_BACKDROP)&&this.conceal()}disclose(e){return!!super.disclose(e)&&(this.body&&this.body.activate(),this.isScrollLocked=!0,this.setAttribute("aria-modal","true"),this.setAttribute("open","true"),this._isDialog||this.activateModal(),!0)}conceal(e,t){return!!super.conceal(e,t)&&(this.isScrollLocked=!1,this.removeAttribute("aria-modal"),this.removeAttribute("open"),this.body&&this.body.deactivate(),this._isDialog||this.deactivateModal(),!0)}get isDialog(){return this._isDialog}set isDialog(e){this._isDialog=e}activateModal(){this._isActive||(this._isActive=!0,this._hasDialogRole="dialog"===this.getAttribute("role"),this._hasDialogRole||this.setAttribute("role","dialog"))}deactivateModal(){this._isActive&&(this._isActive=!1,this._hasDialogRole||this.removeAttribute("role"))}_setAccessibleName(e,t){const s=this.retrieveNodeId(e,t);this.warn(`add reference to ${t} for accessible name (aria-labelledby)`),this.setAttribute("aria-labelledby",s)}_ensureAccessibleName(){if(this.hasAttribute("aria-labelledby")||this.hasAttribute("aria-label"))return;this.warn("missing accessible name");const e=this.node.querySelector(w.TITLE),t=this.primaryButtons[0];switch(!0){case null!==e:this._setAccessibleName(e,"title");break;case void 0!==t:this.warn("missing required title, fallback to primary button"),this._setAccessibleName(t,"primary")}}}const H=['[tabindex="0"]',"a[href]","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])","audio[controls]","video[controls]",'[contenteditable]:not([contenteditable="false"])',"details>summary:first-of-type","details","iframe"].join(),$=['[tabindex]:not([tabindex="-1"]):not([tabindex="0"])'].join(),x=(e,t)=>{if(!(e instanceof Element))return!1;const s=window.getComputedStyle(e);if(!s)return!1;if("hidden"===s.visibility)return!1;for(void 0===t&&(t=e);t.contains(e);){if("none"===s.display)return!1;e=e.parentElement}return!0};class M{constructor(e,t){this.element=null,this.activeElement=null,this.onTrap=e,this.onUntrap=t,this.waiting=this.wait.bind(this),this.handling=this.handle.bind(this),this.focusing=this.maintainFocus.bind(this),this.current=null}get trapped(){return null!==this.element}trap(e){this.trapped&&this.untrap(),this.element=e,this.isTrapping=!0,this.wait(),this.onTrap&&this.onTrap()}wait(){x(this.element)?this.trapping():window.requestAnimationFrame(this.waiting)}trapping(){if(!this.isTrapping)return;this.isTrapping=!1;const e=this.focusables;e.length&&-1===e.indexOf(document.activeElement)&&e[0].focus(),this.element.setAttribute("aria-modal",!0),window.addEventListener("keydown",this.handling),document.body.addEventListener("focus",this.focusing,!0)}stun(e){for(const t of e.children)t!==this.element&&(t.contains(this.element)?this.stun(t):this.stunneds.push(new B(t)))}maintainFocus(e){if(!this.element.contains(e.target)){const t=this.focusables;if(0===t.length)return;const s=t[0];e.preventDefault(),s.focus()}}handle(e){if(9!==e.keyCode)return;const t=this.focusables;if(0===t.length)return;const s=t[0],i=t[t.length-1],n=t.indexOf(document.activeElement);e.shiftKey?!this.element.contains(document.activeElement)||n<1?(e.preventDefault(),i.focus()):(document.activeElement.tabIndex>0||t[n-1].tabIndex>0)&&(e.preventDefault(),t[n-1].focus()):this.element.contains(document.activeElement)&&n!==t.length-1&&-1!==n?document.activeElement.tabIndex>0&&(e.preventDefault(),t[n+1].focus()):(e.preventDefault(),s.focus())}get focusables(){let e=s.internals.dom.querySelectorAllArray(this.element,H);const t=s.internals.dom.querySelectorAllArray(document.documentElement,'input[type="radio"]');if(t.length){const s={};for(const e of t){const t=e.getAttribute("name");void 0===s[t]&&(s[t]=new G(t)),s[t].push(e)}e=e.filter((e=>{if("input"!==e.tagName.toLowerCase()||"radio"!==e.getAttribute("type").toLowerCase())return!0;const t=e.getAttribute("name");return s[t].keep(e)}))}const i=s.internals.dom.querySelectorAllArray(this.element,$);i.sort(((e,t)=>e.tabIndex-t.tabIndex));const n=e.filter((e=>-1===i.indexOf(e)));return i.concat(n).filter((e=>"-1"!==e.tabIndex&&x(e,this.element)))}untrap(){this.trapped&&(this.isTrapping=!1,this.element.removeAttribute("aria-modal"),window.removeEventListener("keydown",this.handling),document.body.removeEventListener("focus",this.focusing,!0),this.element=null,this.onUntrap&&this.onUntrap())}dispose(){this.untrap()}}class B{constructor(e){this.element=e,this.inert=e.getAttribute("inert"),this.element.setAttribute("inert","")}unstun(){null===this.inert?this.element.removeAttribute("inert"):this.element.setAttribute("inert",this.inert)}}class G{constructor(e){this.name=e,this.buttons=[]}push(e){this.buttons.push(e),(e===document.activeElement||e.checked||void 0===this.selected)&&(this.selected=e)}keep(e){return this.selected===e}}class U extends s.core.DisclosuresGroup{constructor(){super("Modal",!1),this.focusTrap=new M}static get instanceClassName(){return"ModalsGroup"}apply(e,t){super.apply(e,t),null===this.current?this.focusTrap.untrap():this.focusTrap.trap(this.current.node)}}class W extends s.core.Instance{static get instanceClassName(){return"ModalBody"}init(){this.listen("scroll",this.divide.bind(this))}activate(){this.isResizing=!0,this.resize()}deactivate(){this.isResizing=!1}divide(){this.node.scrollHeight>this.node.clientHeight?this.node.offsetHeight+this.node.scrollTop>=this.node.scrollHeight?this.removeClass(w.SCROLL_DIVIDER):this.addClass(w.SCROLL_DIVIDER):this.removeClass(w.SCROLL_DIVIDER)}resize(){this.adjust(),this.request(this.adjust.bind(this))}adjust(){const e=32*(this.isBreakpoint(s.core.Breakpoints.MD)?2:1);this.isLegacy?this.style.maxHeight=window.innerHeight-e+"px":this.style.setProperty("--modal-max-height",window.innerHeight-e+"px"),this.divide()}}s.modal={Modal:k,ModalButton:P,ModalBody:W,ModalsGroup:U,ModalSelector:w},s.internals.register(s.modal.ModalSelector.MODAL,s.modal.Modal),s.internals.register(s.modal.ModalSelector.BODY,s.modal.ModalBody),s.internals.register(s.core.RootSelector.ROOT,s.modal.ModalsGroup);const K={TOGGLE:s.internals.ns.emission("password","toggle"),ADJUST:s.internals.ns.emission("password","adjust")};class q extends s.core.Instance{static get instanceClassName(){return"PasswordToggle"}init(){this.listenClick(),this.ascend(K.ADJUST,this.width),this.isSwappingFont=!0,this._isChecked=this.isChecked}get width(){const e=getComputedStyle(this.node.parentNode);return parseInt(e.width)}get isChecked(){return this.node.checked}set isChecked(e){this._isChecked=e,this.ascend(K.TOGGLE,e)}handleClick(){this.isChecked=!this._isChecked}swapFont(e){this.ascend(K.ADJUST,this.width)}}class F extends s.core.Instance{static get instanceClassName(){return"Password"}init(){this.addAscent(K.TOGGLE,this.toggle.bind(this)),this.addAscent(K.ADJUST,this.adjust.bind(this))}toggle(e){this.descend(K.TOGGLE,e)}adjust(e){this.descend(K.ADJUST,e)}}const z={PASSWORD:s.internals.ns.selector("password"),INPUT:s.internals.ns.selector("password__input"),LABEL:s.internals.ns.selector("password__label"),TOOGLE:`${s.internals.ns.selector("password__checkbox")} input[type="checkbox"]`};class Y extends s.core.Instance{static get instanceClassName(){return"PasswordInput"}init(){this.addDescent(K.TOGGLE,this.toggle.bind(this)),this._isRevealed="password"===this.hasAttribute("type"),this.listen("keydown",this.capslock.bind(this)),this.listen("keyup",this.capslock.bind(this))}toggle(e){this.isRevealed=e,this.setAttribute("type",e?"text":"password")}get isRevealed(){return this._isRevealed}capslock(e){e&&"function"!=typeof e.getModifierState||(e.getModifierState("CapsLock")?this.node.parentNode.setAttribute(s.internals.ns.attr("capslock"),""):this.node.parentNode.removeAttribute(s.internals.ns.attr("capslock")))}set isRevealed(e){this._isRevealed=e,this.setAttribute("type",e?"text":"password")}}class V extends s.core.Instance{static get instanceClassName(){return"PasswordLabel"}init(){this.addDescent(K.ADJUST,this.adjust.bind(this))}adjust(e){const t=Math.ceil(e/16);this.node.style.paddingRight=t+"rem"}}s.password={Password:F,PasswordToggle:q,PasswordSelector:z,PasswordInput:Y,PasswordLabel:V},s.internals.register(s.password.PasswordSelector.INPUT,s.password.PasswordInput),s.internals.register(s.password.PasswordSelector.PASSWORD,s.password.Password),s.internals.register(s.password.PasswordSelector.TOOGLE,s.password.PasswordToggle),s.internals.register(s.password.PasswordSelector.LABEL,s.password.PasswordLabel);const j=s.internals.ns.selector("nav__item"),J=s.internals.ns.selector("collapse"),Q={NAVIGATION:s.internals.ns.selector("nav"),COLLAPSE:`${j} > ${J}, ${j} > *:not(${j}, ${J}) > ${J}, ${j} > *:not(${j}, ${J}) > *:not(${j}, ${J}) > ${J}`,COLLAPSE_LEGACY:`${j} ${J}`,ITEM:j,ITEM_RIGHT:`${j}--align-right`,MENU:s.internals.ns.selector("menu"),BUTTON:s.internals.ns.selector("nav__btn"),TRANSLATE_BUTTON:s.internals.ns.selector("translate__btn")};class Z extends s.core.Instance{constructor(){super(),this._isRightAligned=!1}static get instanceClassName(){return"NavigationItem"}init(){this.addAscent(s.core.DisclosureEmission.ADDED,this.calculate.bind(this)),this.addAscent(s.core.DisclosureEmission.REMOVED,this.calculate.bind(this)),this.isResizing=!0,this.calculate()}resize(){this.calculate()}calculate(){const e=this.element.getDescendantInstances(s.core.Collapse.instanceClassName,null,!0)[0];if(e&&this.isBreakpoint(s.core.Breakpoints.LG)&&e.element.node.matches(Q.MENU)){const t=this.element.node.parentElement.getBoundingClientRect().right,s=e.element.node.getBoundingClientRect().width,i=this.element.node.getBoundingClientRect().left;this.isRightAligned=i+s>t}else this.isRightAligned=!1}get isRightAligned(){return this._isRightAligned}set isRightAligned(e){this._isRightAligned!==e&&(this._isRightAligned=e,e?s.internals.dom.addClass(this.element.node,Q.ITEM_RIGHT):s.internals.dom.removeClass(this.element.node,Q.ITEM_RIGHT))}get collapsePrimary(){return this.element.children.map((e=>e.getInstance("CollapseButton"))).filter((e=>null!==e&&(e.hasClass(Q.BUTTON)||e.hasClass(Q.TRANSLATE_BUTTON))))[0]}}const X={NONE:-1,INSIDE:0,OUTSIDE:1};class ee extends s.core.CollapsesGroup{static get instanceClassName(){return"Navigation"}init(){super.init(),this.clicked=!1,this.out=!1,this.listen("focusout",this.focusOutHandler.bind(this)),this.listen("mousedown",this.mouseDownHandler.bind(this)),this.listenClick({capture:!0})}validate(e){return super.validate(e)&&e.element.node.matches(s.internals.legacy.isLegacy?Q.COLLAPSE_LEGACY:Q.COLLAPSE)}mouseDownHandler(e){this.isBreakpoint(s.core.Breakpoints.LG)&&-1!==this.index&&this.current&&(this.position=this.current.node.contains(e.target)?X.INSIDE:X.OUTSIDE,this.requestPosition())}clickHandler(e){!e.target.matches("a, button")||e.target.matches("[aria-controls]")||e.target.matches(s.core.DisclosureSelector.PREVENT_CONCEAL)||(this.index=-1)}focusOutHandler(e){this.isBreakpoint(s.core.Breakpoints.LG)&&(this.out=!0,this.requestPosition())}requestPosition(){this.isRequesting||(this.isRequesting=!0,this.request(this.getPosition.bind(this)))}getPosition(){if(this.out)switch(this.position){case X.OUTSIDE:this.index=-1;break;case X.INSIDE:this.current&&!this.current.node.contains(document.activeElement)&&this.current.focus();break;default:this.index>-1&&!this.current.hasFocus&&(this.index=-1)}this.request(this.requested.bind(this))}requested(){this.position=X.NONE,this.out=!1,this.isRequesting=!1}get index(){return super.index}set index(e){-1===e&&this.current&&this.current.hasFocus&&this.current.focus(),super.index=e}}s.navigation={Navigation:ee,NavigationItem:Z,NavigationMousePosition:X,NavigationSelector:Q},s.internals.register(s.navigation.NavigationSelector.NAVIGATION,s.navigation.Navigation),s.internals.register(s.navigation.NavigationSelector.ITEM,s.navigation.NavigationItem);class te extends s.core.DisclosureButton{constructor(){super(s.core.DisclosureType.SELECT)}static get instanceClassName(){return"TabButton"}handleClick(e){super.handleClick(e),this.focus()}apply(e){super.apply(e),this.isPrimary&&(this.setAttribute("tabindex",e?"0":"-1"),e&&this.list&&this.list.focalize(this))}get list(){return this.element.getAscendantInstance("TabsList","TabsGroup")}}const se={TAB:s.internals.ns.selector("tabs__tab"),GROUP:s.internals.ns.selector("tabs"),PANEL:s.internals.ns.selector("tabs__panel"),LIST:s.internals.ns.selector("tabs__list"),SHADOW:s.internals.ns.selector("tabs__shadow"),SHADOW_LEFT:s.internals.ns.selector("tabs__shadow--left"),SHADOW_RIGHT:s.internals.ns.selector("tabs__shadow--right"),PANEL_START:s.internals.ns.selector("tabs__panel--direction-start"),PANEL_END:s.internals.ns.selector("tabs__panel--direction-end")},ie="direction-start",ne="direction-end",re="none";class ae extends s.core.Disclosure{constructor(){super(s.core.DisclosureType.SELECT,se.PANEL,te,"TabsGroup"),this._direction=re,this._isPreventingTransition=!1}static get instanceClassName(){return"TabPanel"}get direction(){return this._direction}set direction(e){if(e!==this._direction){switch(this._direction){case ie:this.removeClass(se.PANEL_START);break;case ne:this.removeClass(se.PANEL_END);break;case re:break;default:return}switch(this._direction=e,this._direction){case ie:this.addClass(se.PANEL_START);break;case ne:this.addClass(se.PANEL_END)}}}get isPreventingTransition(){return this._isPreventingTransition}set isPreventingTransition(e){this._isPreventingTransition!==e&&(e?this.addClass(s.internals.motion.TransitionSelector.NONE):this.removeClass(s.internals.motion.TransitionSelector.NONE),this._isPreventingTransition=!0===e)}translate(e,t){this.isPreventingTransition=t,this.direction=e}reset(){this.group&&this.group.retrieve(!0)}_electPrimaries(e){return this.group&&this.group.list?super._electPrimaries(e).filter((e=>this.group.list.node.contains(e.node))):[]}}const oe="tab_keys_left",le="tab_keys_right",ce="tab_keys_home",he="tab_keys_end",de={PRESS_KEY:s.internals.ns.emission("tab","press_key"),LIST_HEIGHT:s.internals.ns.emission("tab","list_height")};class ue extends s.core.DisclosuresGroup{constructor(){super("TabPanel")}static get instanceClassName(){return"TabsGroup"}init(){super.init(),this.listen("transitionend",this.transitionend.bind(this)),this.addAscent(de.PRESS_KEY,this.pressKey.bind(this)),this.addAscent(de.LIST_HEIGHT,this.setListHeight.bind(this)),this.isRendering=!0}getIndex(e=0){super.getIndex(e)}get list(){return this.element.getDescendantInstances("TabsList","TabsGroup",!0)[0]}setListHeight(e){this.listHeight=e}transitionend(e){this.isPreventingTransition=!0}get buttonHasFocus(){return this.members.some((e=>e.buttonHasFocus))}pressKey(e){switch(e){case oe:this.pressLeft();break;case le:this.pressRight();break;case ce:this.pressHome();break;case he:this.pressEnd()}}pressRight(){this.buttonHasFocus&&(this.index<this.length-1?this.index++:this.index=0,this.focus())}pressLeft(){this.buttonHasFocus&&(this.index>0?this.index--:this.index=this.length-1,this.focus())}pressHome(){this.buttonHasFocus&&(this.index=0,this.focus())}pressEnd(){this.buttonHasFocus&&(this.index=this.length-1,this.focus())}focus(){this.current&&this.current.focus()}apply(){for(let e=0;e<this._index;e++)this.members[e].translate(ie);this.current&&this.current.translate(re);for(let e=this._index+1;e<this.length;e++)this.members[e].translate(ne);this.isPreventingTransition=!1}get isPreventingTransition(){return this._isPreventingTransition}set isPreventingTransition(e){this._isPreventingTransition!==e&&(e?this.addClass(s.internals.motion.TransitionSelector.NONE):this.removeClass(s.internals.motion.TransitionSelector.NONE),this._isPreventingTransition=!0===e)}render(){if(null===this.current)return;this.node.scrollTop=0,this.node.scrollLeft=0;const e=Math.round(this.current.node.offsetHeight);this.panelHeight!==e&&(this.panelHeight=e,this.style.setProperty("--tabs-height",this.panelHeight+this.listHeight+"px"))}}class ge extends s.core.Instance{static get instanceClassName(){return"TabsList"}init(){this.listen("scroll",this.scroll.bind(this)),this.listenKey(s.core.KeyCodes.RIGHT,this.ascend.bind(this,de.PRESS_KEY,le),!0,!0),this.listenKey(s.core.KeyCodes.LEFT,this.ascend.bind(this,de.PRESS_KEY,oe),!0,!0),this.listenKey(s.core.KeyCodes.HOME,this.ascend.bind(this,de.PRESS_KEY,ce),!0,!0),this.listenKey(s.core.KeyCodes.END,this.ascend.bind(this,de.PRESS_KEY,he),!0,!0),this.isResizing=!0}focalize(e){const t=e.getRect(),s=this.getRect(),i=this.node.scrollLeft;t.left<s.left?this.node.scrollTo(i-s.left+t.left-16,0):t.right>s.right&&this.node.scrollTo(i-s.right+t.right+16,0)}get isScrolling(){return this._isScrolling}set isScrolling(e){this._isScrolling!==e&&(this._isScrolling=e,this.apply())}apply(){this._isScrolling?(this.addClass(se.SHADOW),this.scroll()):(this.removeClass(se.SHADOW_RIGHT),this.removeClass(se.SHADOW_LEFT),this.removeClass(se.SHADOW))}scroll(){const e=this.node.scrollLeft,t=e<=16,s=this.node.scrollWidth-this.node.clientWidth-16,i=Math.abs(e)>=s,n="rtl"===document.documentElement.getAttribute("dir"),r=n?se.SHADOW_RIGHT:se.SHADOW_LEFT,a=n?se.SHADOW_LEFT:se.SHADOW_RIGHT;t?this.removeClass(r):this.addClass(r),i?this.removeClass(a):this.addClass(a)}resize(){this.isScrolling=this.node.scrollWidth>this.node.clientWidth+16;const e=this.getRect().height;this.setProperty("--tabs-list-height",`${e}px`),this.ascend(de.LIST_HEIGHT,e)}dispose(){this.isScrolling=!1}}s.tab={TabPanel:ae,TabButton:te,TabsGroup:ue,TabsList:ge,TabSelector:se,TabEmission:de},s.internals.register(s.tab.TabSelector.PANEL,s.tab.TabPanel),s.internals.register(s.tab.TabSelector.GROUP,s.tab.TabsGroup),s.internals.register(s.tab.TabSelector.LIST,s.tab.TabsList);const me={SCROLLABLE:s.internals.ns.emission("table","scrollable"),CHANGE:s.internals.ns.emission("table","change"),CAPTION_HEIGHT:s.internals.ns.emission("table","captionheight")};class pe extends s.core.Instance{static get instanceClassName(){return"Table"}init(){this.addAscent(me.CAPTION_HEIGHT,this.setCaptionHeight.bind(this))}setCaptionHeight(e){this.setProperty("--table-offset",`calc(${e}px + 1rem)`)}}const be={TABLE:s.internals.ns.selector("table"),SHADOW:s.internals.ns.selector("table__shadow"),SHADOW_LEFT:s.internals.ns.selector("table__shadow--left"),SHADOW_RIGHT:s.internals.ns.selector("table__shadow--right"),ELEMENT:`${s.internals.ns.selector("table")}:not(${s.internals.ns.selector("table--no-scroll")}) table`,CAPTION:`${s.internals.ns.selector("table")} table caption`};class Te extends s.core.Instance{static get instanceClassName(){return"TableElement"}init(){this.listen("scroll",this.scroll.bind(this)),this.content=this.querySelector("tbody"),this.isResizing=!0}get isScrolling(){return this._isScrolling}set isScrolling(e){this._isScrolling!==e&&(this._isScrolling=e,e?(this.addClass(be.SHADOW),this.scroll()):(this.removeClass(be.SHADOW),this.removeClass(be.SHADOW_LEFT),this.removeClass(be.SHADOW_RIGHT)))}scroll(){const e=this.node.scrollLeft<=8,t=this.content.offsetWidth-this.node.offsetWidth-8,s=Math.abs(this.node.scrollLeft)>=t,i="rtl"===document.documentElement.getAttribute("dir"),n=i?be.SHADOW_RIGHT:be.SHADOW_LEFT,r=i?be.SHADOW_LEFT:be.SHADOW_RIGHT;e?this.removeClass(n):this.addClass(n),s?this.removeClass(r):this.addClass(r)}resize(){this.isScrolling=this.content.offsetWidth>this.node.offsetWidth}dispose(){this.isScrolling=!1}}class Se extends s.core.Instance{static get instanceClassName(){return"TableCaption"}init(){this.height=0,this.isResizing=!0}resize(){const e=this.getRect().height;this.height!==e&&(this.height=e,this.ascend(me.CAPTION_HEIGHT,e))}}s.table={Table:pe,TableElement:Te,TableCaption:Se,TableSelector:be},s.internals.register(s.table.TableSelector.TABLE,s.table.Table),s.internals.register(s.table.TableSelector.ELEMENT,s.table.TableElement),s.internals.register(s.table.TableSelector.CAPTION,s.table.TableCaption);const Ee={DISMISS:s.internals.ns.event("dismiss")};class Ae extends s.core.Instance{static get instanceClassName(){return"TagDismissible"}init(){this.listenClick()}handleClick(){switch(this.focusClosest(),s.mode){case s.Modes.ANGULAR:case s.Modes.REACT:case s.Modes.VUE:this.request(this.verify.bind(this));break;default:this.remove()}this.dispatch(Ee.DISMISS)}verify(){document.body.contains(this.node)&&this.warn(`a TagDismissible has just been dismissed and should be removed from the dom. In ${s.mode} mode, the api doesn't handle dom modification. An event ${Ee.DISMISS} is dispatched by the element to trigger the removal`)}}const _e={PRESSABLE:`${s.internals.ns.selector("tag")}[aria-pressed]`,DISMISSIBLE:`${s.internals.ns.selector("tag--dismiss")}`};s.tag={TagDismissible:Ae,TagSelector:_e,TagEvent:Ee},s.internals.register(s.tag.TagSelector.PRESSABLE,s.core.Toggle),s.internals.register(s.tag.TagSelector.DISMISSIBLE,s.tag.TagDismissible);const De=s.internals.ns.selector("transcription"),Ce={TRANSCRIPTION:De,BUTTON:`${De}__btn`};class Le extends s.core.Instance{static get instanceClassName(){return"Transcription"}get collapsePrimary(){return this.element.children.map((e=>e.getInstance("CollapseButton"))).filter((e=>null!==e&&e.hasClass(Ce.BUTTON)))[0]}}s.transcription={Transcription:Le,TranscriptionSelector:Ce},s.internals.register(s.transcription.TranscriptionSelector.TRANSCRIPTION,s.transcription.Transcription);class fe extends s.core.Instance{static get instanceClassName(){return"TileDownload"}init(){this.addAscent(s.core.AssessEmission.UPDATE,(e=>{this.descend(s.core.AssessEmission.UPDATE,e)})),this.addAscent(s.core.AssessEmission.ADDED,(()=>{this.descend(s.core.AssessEmission.ADDED)}))}}const Ie={DOWNLOAD:s.internals.ns.selector("tile--download"),DOWNLOAD_DETAIL:`${s.internals.ns.selector("tile--download")} ${s.internals.ns.selector("tile__detail")}`};s.tile={TileSelector:Ie,TileDownload:fe},s.internals.register(s.tile.TileSelector.DOWNLOAD,s.tile.TileDownload),s.internals.register(s.tile.TileSelector.DOWNLOAD_DETAIL,s.core.AssessDetail);const Oe={HEADER:s.internals.ns.selector("header"),TOOLS_LINKS:s.internals.ns.selector("header__tools-links"),MENU_LINKS:s.internals.ns.selector("header__menu-links"),BUTTONS:`${s.internals.ns.selector("header__tools-links")} ${s.internals.ns.selector("btns-group")}, ${s.internals.ns.selector("header__tools-links")} ${s.internals.ns.selector("links-group")}`,MODALS:`${s.internals.ns.selector("header__search")}${s.internals.ns.selector("modal")}, ${s.internals.ns.selector("header__menu")}${s.internals.ns.selector("modal")}`};class Ne extends s.core.Instance{static get instanceClassName(){return"HeaderLinks"}init(){const e=this.queryParentSelector(Oe.HEADER);this.toolsLinks=e.querySelector(Oe.TOOLS_LINKS),this.menuLinks=e.querySelector(Oe.MENU_LINKS);const t="-mobile",i=this.toolsLinks.innerHTML.replace(/ +/g," "),n=this.menuLinks.innerHTML.replace(/ +/g," ");let r=i.replace(/id="(.*?)"/gm,'id="$1'+t+'"');if(r=r.replace(/(<nav[.\s\S]*-translate [.\s\S]*) aria-controls="(.*?)"([.\s\S]*<\/nav>)/gm,'$1 aria-controls="$2'+t+'"$3'),r!==n)switch(s.mode){case s.Modes.ANGULAR:case s.Modes.REACT:case s.Modes.VUE:this.warn(`header__tools-links content is different from header__menu-links content.\nAs you're using a dynamic framework, you should handle duplication of this content yourself, please refer to documentation:\n${s.header.doc}`);break;default:this.menuLinks.innerHTML=r}}}class ve extends s.core.Instance{constructor(){super(),this._clickHandling=this.clickHandler.bind(this)}static get instanceClassName(){return"HeaderModal"}init(){this.isResizing=!0}resize(){this.isBreakpoint(s.core.Breakpoints.LG)?this.deactivateModal():this.activateModal()}activateModal(){const e=this.element.getInstance("Modal");e&&(e.isEnabled=!0,this.listen("click",this._clickHandling,{capture:!0}))}deactivateModal(){const e=this.element.getInstance("Modal");e&&(e.conceal(),e.isEnabled=!1,this.unlisten("click",this._clickHandling,{capture:!0}))}clickHandler(e){if(e.target.matches("a, button")&&!e.target.matches("[aria-controls]")&&!e.target.matches(s.core.DisclosureSelector.PREVENT_CONCEAL)){this.element.getInstance("Modal").conceal()}}}s.header={HeaderLinks:Ne,HeaderModal:ve,HeaderSelector:Oe,doc:"https://www.systeme-de-design.gouv.fr/elements-d-interface/composants/en-tete"},s.internals.register(s.header.HeaderSelector.TOOLS_LINKS,s.header.HeaderLinks),s.internals.register(s.header.HeaderSelector.MODALS,s.header.HeaderModal);const ye={DISPLAY:s.internals.ns.selector("display"),RADIO_BUTTONS:`input[name="${s.internals.ns("radios-theme")}"]`,FIELDSET:s.internals.ns.selector("fieldset")};class we extends s.core.Instance{static get instanceClassName(){return"Display"}init(){if(this.radios=this.querySelectorAll(ye.RADIO_BUTTONS),s.scheme){this.changing=this.change.bind(this);for(const e of this.radios)e.addEventListener("change",this.changing);this.addDescent(s.scheme.SchemeEmission.SCHEME,this.apply.bind(this)),this.ascend(s.scheme.SchemeEmission.ASK)}else this.querySelector(ye.FIELDSET).setAttribute("disabled","")}get scheme(){return this._scheme}set scheme(e){if(this._scheme!==e&&s.scheme)switch(e){case s.scheme.SchemeValue.SYSTEM:case s.scheme.SchemeValue.LIGHT:case s.scheme.SchemeValue.DARK:this._scheme=e;for(const t of this.radios)t.checked=t.value===e;this.ascend(s.scheme.SchemeEmission.SCHEME,e)}}change(){for(const e of this.radios)if(e.checked)return void(this.scheme=e.value)}apply(e){this.scheme=e}dispose(){for(const e of this.radios)e.removeEventListener("change",this.changing)}}s.display={Display:we,DisplaySelector:ye},s.internals.register(s.display.DisplaySelector.DISPLAY,s.display.Display);
//# sourceMappingURL=component.module.min.js.map