/*! DSFR v1.11.2 | SPDX-License-Identifier: MIT | License-Filename: LICENSE.md | restricted use (see terms and conditions) */ const config = { prefix: 'fr', namespace: 'dsfr', organisation: '@gouvfr', version: '1.11.2' }; const api = window[config.namespace]; const ITEM = api.internals.ns.selector('nav__item'); const COLLAPSE = api.internals.ns.selector('collapse'); const NavigationSelector = { NAVIGATION: api.internals.ns.selector('nav'), COLLAPSE: `${ITEM} > ${COLLAPSE}, ${ITEM} > *:not(${ITEM}):not(${COLLAPSE}) > ${COLLAPSE}, ${ITEM} > *:not(${ITEM}):not(${COLLAPSE}) > *:not(${ITEM}):not(${COLLAPSE}) > ${COLLAPSE}`, COLLAPSE_LEGACY: `${ITEM} ${COLLAPSE}`, ITEM: ITEM, ITEM_RIGHT: `${ITEM}--align-right`, MENU: api.internals.ns.selector('menu'), BUTTON: api.internals.ns.selector('nav__btn'), TRANSLATE_BUTTON: api.internals.ns.selector('translate__btn') }; class NavigationItem extends api.core.Instance { constructor () { super(); this._isRightAligned = false; } static get instanceClassName () { return 'NavigationItem'; } init () { this.addAscent(api.core.DisclosureEmission.ADDED, this.calculate.bind(this)); this.addAscent(api.core.DisclosureEmission.REMOVED, this.calculate.bind(this)); this.isResizing = true; this.calculate(); } resize () { this.calculate(); } calculate () { const collapse = this.element.getDescendantInstances(api.core.Collapse.instanceClassName, null, true)[0]; if (collapse && this.isBreakpoint(api.core.Breakpoints.LG) && collapse.element.node.matches(NavigationSelector.MENU)) { const right = this.element.node.parentElement.getBoundingClientRect().right; // todo: ne fonctionne que si la nav fait 100% du container const width = collapse.element.node.getBoundingClientRect().width; const left = this.element.node.getBoundingClientRect().left; this.isRightAligned = left + width > right; } else this.isRightAligned = false; } get isRightAligned () { return this._isRightAligned; } set isRightAligned (value) { if (this._isRightAligned === value) return; this._isRightAligned = value; if (value) api.internals.dom.addClass(this.element.node, NavigationSelector.ITEM_RIGHT); else api.internals.dom.removeClass(this.element.node, NavigationSelector.ITEM_RIGHT); } get collapsePrimary () { const buttons = this.element.children.map(child => child.getInstance('CollapseButton')).filter(button => button !== null && (button.hasClass(NavigationSelector.BUTTON) || button.hasClass(NavigationSelector.TRANSLATE_BUTTON))); return buttons[0]; } } const NavigationMousePosition = { NONE: -1, INSIDE: 0, OUTSIDE: 1 }; class Navigation extends api.core.CollapsesGroup { static get instanceClassName () { return 'Navigation'; } init () { super.init(); this.clicked = false; this.out = false; this.addEmission(api.core.RootEmission.CLICK, this._handleRootClick.bind(this)); this.listen('mousedown', this.handleMouseDown.bind(this)); this.listenClick({ capture: true }); this.isResizing = true; } validate (member) { return super.validate(member) && member.element.node.matches(api.internals.legacy.isLegacy ? NavigationSelector.COLLAPSE_LEGACY : NavigationSelector.COLLAPSE); } handleMouseDown (e) { if (!this.isBreakpoint(api.core.Breakpoints.LG) || this.index === -1 || !this.current) return; this.position = this.current.node.contains(e.target) ? NavigationMousePosition.INSIDE : NavigationMousePosition.OUTSIDE; this.requestPosition(); } handleClick (e) { if (e.target.matches('a, button') && !e.target.matches('[aria-controls]') && !e.target.matches(api.core.DisclosureSelector.PREVENT_CONCEAL)) { this.index = -1; } } _handleRootClick (target) { if (!this.isBreakpoint(api.core.Breakpoints.LG)) return; if (!this.node.contains(target)) { this.out = true; this.requestPosition(); } } requestPosition () { if (this.isRequesting) return; this.isRequesting = true; this.request(this.getPosition.bind(this)); } getPosition () { if (this.out) { switch (this.position) { case NavigationMousePosition.OUTSIDE: this.index = -1; break; case NavigationMousePosition.INSIDE: if (this.current && !this.current.node.contains(document.activeElement)) this.current.focus(); break; default: if (this.index > -1 && !this.current.hasFocus) this.index = -1; } } this.request(this.requested.bind(this)); } requested () { this.position = NavigationMousePosition.NONE; this.out = false; this.isRequesting = false; } get index () { return super.index; } set index (value) { if (value === -1 && this.current && this.current.hasFocus) this.current.focus(); super.index = value; } get canUngroup () { return !this.isBreakpoint(api.core.Breakpoints.LG); } resize () { this.update(); } } api.navigation = { Navigation: Navigation, NavigationItem: NavigationItem, NavigationMousePosition: NavigationMousePosition, NavigationSelector: NavigationSelector }; api.internals.register(api.navigation.NavigationSelector.NAVIGATION, api.navigation.Navigation); api.internals.register(api.navigation.NavigationSelector.ITEM, api.navigation.NavigationItem); //# sourceMappingURL=navigation.module.js.map