@codegouvfr/react-dsfr
Version:
French State Design System React integration library
1,469 lines (1,145 loc) • 118 kB
JavaScript
/*! DSFR v1.12.1 | SPDX-License-Identifier: MIT | License-Filename: LICENSE.md | restricted use (see terms and conditions) */
(function () {
'use strict';
var config = {
prefix: 'fr',
namespace: 'dsfr',
organisation: '@gouvfr',
version: '1.12.1'
};
var api = window[config.namespace];
var ACCORDION = api.internals.ns.selector('accordion');
var COLLAPSE$2 = api.internals.ns.selector('collapse');
var AccordionSelector = {
GROUP: api.internals.ns.selector('accordions-group'),
ACCORDION: ACCORDION,
COLLAPSE: (ACCORDION + " > " + COLLAPSE$2 + ", " + ACCORDION + " > *:not(" + ACCORDION + "):not(" + COLLAPSE$2 + ") > " + COLLAPSE$2 + ", " + ACCORDION + " > *:not(" + ACCORDION + "):not(" + COLLAPSE$2 + ") > *:not(" + ACCORDION + "):not(" + COLLAPSE$2 + ") > " + COLLAPSE$2),
COLLAPSE_LEGACY: (ACCORDION + " " + COLLAPSE$2),
BUTTON: (ACCORDION + "__btn")
};
var Accordion = /*@__PURE__*/(function (superclass) {
function Accordion () {
superclass.apply(this, arguments);
}
if ( superclass ) Accordion.__proto__ = superclass;
Accordion.prototype = Object.create( superclass && superclass.prototype );
Accordion.prototype.constructor = Accordion;
var prototypeAccessors = { collapsePrimary: { configurable: true } };
var staticAccessors = { instanceClassName: { configurable: true } };
staticAccessors.instanceClassName.get = function () {
return 'Accordion';
};
prototypeAccessors.collapsePrimary.get = function () {
var buttons = this.element.children.map(function (child) { return child.getInstance('CollapseButton'); }).filter(function (button) { return button !== null && button.hasClass(AccordionSelector.BUTTON); });
return buttons[0];
};
Object.defineProperties( Accordion.prototype, prototypeAccessors );
Object.defineProperties( Accordion, staticAccessors );
return Accordion;
}(api.core.Instance));
var AccordionsGroup = /*@__PURE__*/(function (superclass) {
function AccordionsGroup () {
superclass.apply(this, arguments);
}
if ( superclass ) AccordionsGroup.__proto__ = superclass;
AccordionsGroup.prototype = Object.create( superclass && superclass.prototype );
AccordionsGroup.prototype.constructor = AccordionsGroup;
var staticAccessors = { instanceClassName: { configurable: true } };
staticAccessors.instanceClassName.get = function () {
return 'AccordionsGroup';
};
AccordionsGroup.prototype.validate = function validate (member) {
var match = member.node.matches(api.internals.legacy.isLegacy ? AccordionSelector.COLLAPSE_LEGACY : AccordionSelector.COLLAPSE);
return superclass.prototype.validate.call(this, member) && match;
};
Object.defineProperties( AccordionsGroup, staticAccessors );
return AccordionsGroup;
}(api.core.CollapsesGroup));
api.accordion = {
Accordion: Accordion,
AccordionSelector: AccordionSelector,
AccordionsGroup: AccordionsGroup
};
api.internals.register(api.accordion.AccordionSelector.GROUP, api.accordion.AccordionsGroup);
api.internals.register(api.accordion.AccordionSelector.ACCORDION, api.accordion.Accordion);
var ButtonSelector = {
EQUISIZED_BUTTON: ((api.internals.ns.selector('btns-group--equisized')) + " " + (api.internals.ns.selector('btn'))),
EQUISIZED_GROUP: api.internals.ns.selector('btns-group--equisized')
};
api.button = {
ButtonSelector: ButtonSelector
};
api.internals.register(api.button.ButtonSelector.EQUISIZED_BUTTON, api.core.Equisized);
api.internals.register(api.button.ButtonSelector.EQUISIZED_GROUP, api.core.EquisizedsGroup);
var CardDownload = /*@__PURE__*/(function (superclass) {
function CardDownload () {
superclass.apply(this, arguments);
}
if ( superclass ) CardDownload.__proto__ = superclass;
CardDownload.prototype = Object.create( superclass && superclass.prototype );
CardDownload.prototype.constructor = CardDownload;
var staticAccessors = { instanceClassName: { configurable: true } };
staticAccessors.instanceClassName.get = function () {
return 'CardDownload';
};
CardDownload.prototype.init = function init () {
var this$1$1 = this;
this.addAscent(api.core.AssessEmission.UPDATE, function (details) {
this$1$1.descend(api.core.AssessEmission.UPDATE, details);
});
this.addAscent(api.core.AssessEmission.ADDED, function () {
this$1$1.descend(api.core.AssessEmission.ADDED);
});
};
Object.defineProperties( CardDownload, staticAccessors );
return CardDownload;
}(api.core.Instance));
var CardSelector = {
DOWNLOAD: api.internals.ns.selector('card--download'),
DOWNLOAD_DETAIL: ((api.internals.ns.selector('card--download')) + " " + (api.internals.ns.selector('card__end')) + " " + (api.internals.ns.selector('card__detail')))
};
api.card = {
CardSelector: CardSelector,
CardDownload: CardDownload
};
api.internals.register(api.card.CardSelector.DOWNLOAD, api.card.CardDownload);
api.internals.register(api.card.CardSelector.DOWNLOAD_DETAIL, api.core.AssessDetail);
var CheckboxSelector = {
INPUT: ((api.internals.ns.selector('checkbox-group')) + " input[type=\"checkbox\"]")
};
var CheckboxEmission = {
CHANGE: api.internals.ns.emission('checkbox', 'change'),
RETRIEVE: api.internals.ns.emission('checkbox', 'retrieve')
};
var CheckboxInput = /*@__PURE__*/(function (superclass) {
function CheckboxInput () {
superclass.call(this);
this._handlingChange = this.handleChange.bind(this);
}
if ( superclass ) CheckboxInput.__proto__ = superclass;
CheckboxInput.prototype = Object.create( superclass && superclass.prototype );
CheckboxInput.prototype.constructor = CheckboxInput;
var prototypeAccessors = { isChecked: { configurable: true } };
var staticAccessors = { instanceClassName: { configurable: true } };
staticAccessors.instanceClassName.get = function () {
return 'CheckboxInput';
};
CheckboxInput.prototype.init = function init () {
this.node.addEventListener('change', this._handlingChange);
this.addDescent(CheckboxEmission.RETRIEVE, this._handlingChange);
this.handleChange();
};
prototypeAccessors.isChecked.get = function () {
return this.node.checked;
};
CheckboxInput.prototype.handleChange = function handleChange () {
this.ascend(CheckboxEmission.CHANGE, this.node);
};
Object.defineProperties( CheckboxInput.prototype, prototypeAccessors );
Object.defineProperties( CheckboxInput, staticAccessors );
return CheckboxInput;
}(api.core.Instance));
api.checkbox = {
CheckboxSelector: CheckboxSelector,
CheckboxEmission: CheckboxEmission,
CheckboxInput: CheckboxInput
};
api.internals.register(api.checkbox.CheckboxSelector.INPUT, api.checkbox.CheckboxInput);
var SegmentedSelector = {
SEGMENTED: api.internals.ns.selector('segmented'),
SEGMENTED_ELEMENTS: api.internals.ns.selector('segmented__elements'),
SEGMENTED_ELEMENT: api.internals.ns.selector('segmented__element input'),
SEGMENTED_LEGEND: api.internals.ns.selector('segmented__legend')
};
var SegmentedEmission = {
ADDED: api.internals.ns.emission('segmented', 'added'),
REMOVED: api.internals.ns.emission('segmented', 'removed')
};
var Segmented = /*@__PURE__*/(function (superclass) {
function Segmented () {
superclass.apply(this, arguments);
}
if ( superclass ) Segmented.__proto__ = superclass;
Segmented.prototype = Object.create( superclass && superclass.prototype );
Segmented.prototype.constructor = Segmented;
var staticAccessors = { instanceClassName: { configurable: true } };
staticAccessors.instanceClassName.get = function () {
return 'Segmented';
};
Segmented.prototype.init = function init () {
this.elements = this.node.querySelector(SegmentedSelector.SEGMENTED_ELEMENTS);
this.legend = this.node.querySelector(SegmentedSelector.SEGMENTED_LEGEND);
this.addAscent(SegmentedEmission.ADDED, this.resize.bind(this));
this.addAscent(SegmentedEmission.REMOVED, this.resize.bind(this));
this._isLegendInline = this.legend && this.legend.classList.contains(((api.prefix) + "-segmented__legend--inline"));
this.isResizing = true;
};
Segmented.prototype.resize = function resize () {
var SEGMENTED_VERTICAL = (api.prefix) + "-segmented--vertical";
var LEGEND_INLINE = (api.prefix) + "-segmented__legend--inline";
var gapOffset = 16;
this.removeClass(SEGMENTED_VERTICAL);
if (this._isLegendInline) {
this.legend.classList.add(LEGEND_INLINE);
if (this.node.offsetWidth > this.node.parentNode.offsetWidth || (this.elements.scrollWidth + this.legend.offsetWidth + gapOffset) > this.node.parentNode.offsetWidth) {
this.legend.classList.remove(LEGEND_INLINE);
}
}
if (this.elements.offsetWidth > this.node.parentNode.offsetWidth || this.elements.scrollWidth > this.node.parentNode.offsetWidth) {
this.addClass(SEGMENTED_VERTICAL);
} else {
this.removeClass(SEGMENTED_VERTICAL);
}
};
Object.defineProperties( Segmented, staticAccessors );
return Segmented;
}(api.core.Instance));
var SegmentedElement = /*@__PURE__*/(function (superclass) {
function SegmentedElement () {
superclass.apply(this, arguments);
}
if ( superclass ) SegmentedElement.__proto__ = superclass;
SegmentedElement.prototype = Object.create( superclass && superclass.prototype );
SegmentedElement.prototype.constructor = SegmentedElement;
var staticAccessors = { instanceClassName: { configurable: true } };
staticAccessors.instanceClassName.get = function () {
return 'SegmentedElement';
};
SegmentedElement.prototype.init = function init () {
this.ascend(SegmentedEmission.ADDED);
};
SegmentedElement.prototype.dispose = function dispose () {
this.ascend(SegmentedEmission.REMOVED);
};
Object.defineProperties( SegmentedElement, staticAccessors );
return SegmentedElement;
}(api.core.Instance));
api.segmented = {
SegmentedSelector: SegmentedSelector,
SegmentedEmission: SegmentedEmission,
SegmentedElement: SegmentedElement,
Segmented: Segmented
};
api.internals.register(api.segmented.SegmentedSelector.SEGMENTED, api.segmented.Segmented);
api.internals.register(api.segmented.SegmentedSelector.SEGMENTED_ELEMENT, api.segmented.SegmentedElement);
var BreadcrumbSelector = {
BREADCRUMB: api.internals.ns.selector('breadcrumb'),
BUTTON: api.internals.ns.selector('breadcrumb__button')
};
var Breadcrumb = /*@__PURE__*/(function (superclass) {
function Breadcrumb () {
superclass.call(this);
this.count = 0;
this.focusing = this.focus.bind(this);
}
if ( superclass ) Breadcrumb.__proto__ = superclass;
Breadcrumb.prototype = Object.create( superclass && superclass.prototype );
Breadcrumb.prototype.constructor = Breadcrumb;
var prototypeAccessors = { proxy: { configurable: true },links: { configurable: true },collapse: { configurable: true },collapsePrimary: { configurable: true } };
var staticAccessors = { instanceClassName: { configurable: true } };
staticAccessors.instanceClassName.get = function () {
return 'Breadcrumb';
};
Breadcrumb.prototype.init = function init () {
this.getCollapse();
this.isResizing = true;
};
prototypeAccessors.proxy.get = function () {
var scope = this;
return Object.assign.call(this, superclass.prototype.proxy, {
focus: scope.focus.bind(scope),
disclose: scope.collapse.disclose.bind(scope.collapse)
});
};
Breadcrumb.prototype.getCollapse = function getCollapse () {
var collapse = this.collapse;
if (collapse) {
collapse.listen(api.core.DisclosureEvent.DISCLOSE, this.focusing);
} else {
this.addAscent(api.core.DisclosureEmission.ADDED, this.getCollapse.bind(this));
}
};
Breadcrumb.prototype.resize = function resize () {
var collapse = this.collapse;
var links = this.links;
if (!collapse || !links.length) { return; }
if (this.isBreakpoint(api.core.Breakpoints.MD)) {
if (collapse.buttonHasFocus) { links[0].focus(); }
} else {
if (links.indexOf(document.activeElement) > -1) { collapse.focus(); }
}
};
prototypeAccessors.links.get = function () {
return [].concat( this.querySelectorAll('a[href]') );
};
prototypeAccessors.collapse.get = function () {
return this.element.getDescendantInstances(api.core.Collapse.instanceClassName, null, true)[0];
};
Breadcrumb.prototype.focus = function focus () {
this.count = 0;
this._focus();
};
Breadcrumb.prototype._focus = function _focus () {
var link = this.links[0];
if (!link) { return; }
link.focus();
this.request(this.verify.bind(this));
};
Breadcrumb.prototype.verify = function verify () {
this.count++;
if (this.count > 100) { return; }
var link = this.links[0];
if (!link) { return; }
if (document.activeElement !== link) { this._focus(); }
};
prototypeAccessors.collapsePrimary.get = function () {
var buttons = this.element.children.map(function (child) { return child.getInstance('CollapseButton'); }).filter(function (button) { return button !== null && button.hasClass(BreadcrumbSelector.BUTTON); });
return buttons[0];
};
Object.defineProperties( Breadcrumb.prototype, prototypeAccessors );
Object.defineProperties( Breadcrumb, staticAccessors );
return Breadcrumb;
}(api.core.Instance));
api.breadcrumb = {
BreadcrumbSelector: BreadcrumbSelector,
Breadcrumb: Breadcrumb
};
api.internals.register(api.breadcrumb.BreadcrumbSelector.BREADCRUMB, api.breadcrumb.Breadcrumb);
var TooltipSelector = {
TOOLTIP: api.internals.ns.selector('tooltip'),
SHOWN: api.internals.ns.selector('tooltip--shown'),
BUTTON: api.internals.ns.selector('btn--tooltip')
};
var TooltipReferentState = {
FOCUS: 1 << 0,
HOVER: 1 << 1
};
var TooltipReferent = /*@__PURE__*/(function (superclass) {
function TooltipReferent () {
superclass.call(this);
this._state = 0;
}
if ( superclass ) TooltipReferent.__proto__ = superclass;
TooltipReferent.prototype = Object.create( superclass && superclass.prototype );
TooltipReferent.prototype.constructor = TooltipReferent;
var prototypeAccessors = { state: { configurable: true } };
var staticAccessors = { instanceClassName: { configurable: true } };
staticAccessors.instanceClassName.get = function () {
return 'TooltipReferent';
};
TooltipReferent.prototype.init = function init () {
superclass.prototype.init.call(this);
this.listen('focusin', this.focusIn.bind(this));
this.listen('focusout', this.focusOut.bind(this));
if (!this.matches(TooltipSelector.BUTTON)) {
var mouseover = this.mouseover.bind(this);
this.listen('mouseover', mouseover);
this.placement.listen('mouseover', mouseover);
var mouseout = this.mouseout.bind(this);
this.listen('mouseout', mouseout);
this.placement.listen('mouseout', mouseout);
}
this.addEmission(api.core.RootEmission.KEYDOWN, this._keydown.bind(this));
this.listen('click', this._click.bind(this));
this.addEmission(api.core.RootEmission.CLICK, this._clickOut.bind(this));
};
TooltipReferent.prototype._click = function _click () {
this.focus();
};
TooltipReferent.prototype._clickOut = function _clickOut (target) {
if (!this.node.contains(target)) { this.blur(); }
};
TooltipReferent.prototype._keydown = function _keydown (keyCode) {
switch (keyCode) {
case api.core.KeyCodes.ESCAPE:
this.blur();
this.close();
break;
}
};
TooltipReferent.prototype.close = function close () {
this.state = 0;
};
prototypeAccessors.state.get = function () {
return this._state;
};
prototypeAccessors.state.set = function (value) {
if (this._state === value) { return; }
this.isShown = value > 0;
this._state = value;
};
TooltipReferent.prototype.focusIn = function focusIn () {
this.state |= TooltipReferentState.FOCUS;
};
TooltipReferent.prototype.focusOut = function focusOut () {
this.state &= ~TooltipReferentState.FOCUS;
};
TooltipReferent.prototype.mouseover = function mouseover () {
this.state |= TooltipReferentState.HOVER;
};
TooltipReferent.prototype.mouseout = function mouseout () {
this.state &= ~TooltipReferentState.HOVER;
};
Object.defineProperties( TooltipReferent.prototype, prototypeAccessors );
Object.defineProperties( TooltipReferent, staticAccessors );
return TooltipReferent;
}(api.core.PlacementReferent));
var ns = function (name) { return ((config.prefix) + "-" + name); };
ns.selector = function (name, notation) {
if (notation === undefined) { notation = '.'; }
return ("" + notation + (ns(name)));
};
ns.attr = function (name) { return ("data-" + (ns(name))); };
ns.attr.selector = function (name, value) {
var result = ns.attr(name);
if (value !== undefined) { result += "=\"" + value + "\""; }
return ("[" + result + "]");
};
ns.event = function (type) { return ((config.namespace) + "." + type); };
ns.emission = function (domain, type) { return ("emission:" + domain + "." + type); };
var TooltipEvent = {
SHOW: ns.event('show'),
HIDE: ns.event('hide')
};
var TooltipState = {
HIDDEN: 'hidden',
SHOWN: 'shown',
HIDING: 'hiding'
};
var Tooltip = /*@__PURE__*/(function (superclass) {
function Tooltip () {
superclass.call(this, api.core.PlacementMode.AUTO, [api.core.PlacementPosition.TOP, api.core.PlacementPosition.BOTTOM], [api.core.PlacementAlign.CENTER, api.core.PlacementAlign.START, api.core.PlacementAlign.END]);
this.modifier = '';
this._state = TooltipState.HIDDEN;
}
if ( superclass ) Tooltip.__proto__ = superclass;
Tooltip.prototype = Object.create( superclass && superclass.prototype );
Tooltip.prototype.constructor = Tooltip;
var prototypeAccessors = { isShown: { configurable: true } };
var staticAccessors = { instanceClassName: { configurable: true } };
staticAccessors.instanceClassName.get = function () {
return 'Tooltip';
};
Tooltip.prototype.init = function init () {
superclass.prototype.init.call(this);
this.register(("[aria-describedby=\"" + (this.id) + "\"]"), TooltipReferent);
this.listen('transitionend', this.transitionEnd.bind(this));
};
Tooltip.prototype.transitionEnd = function transitionEnd () {
if (this._state === TooltipState.HIDING) {
this._state = TooltipState.HIDDEN;
this.isShown = false;
}
};
prototypeAccessors.isShown.get = function () {
return superclass.prototype.isShown;
};
prototypeAccessors.isShown.set = function (value) {
if (!this.isEnabled) { return; }
switch (true) {
case value:
this._state = TooltipState.SHOWN;
this.addClass(TooltipSelector.SHOWN);
this.dispatch(TooltipEvent.SHOW);
superclass.prototype.isShown = true;
break;
case this.isShown && !value && this._state === TooltipState.SHOWN:
this._state = TooltipState.HIDING;
this.removeClass(TooltipSelector.SHOWN);
break;
case this.isShown && !value && this._state === TooltipState.HIDDEN:
this.dispatch(TooltipEvent.HIDE);
superclass.prototype.isShown = false;
break;
}
};
Tooltip.prototype.render = function render () {
superclass.prototype.render.call(this);
var x = this.referentRect.center - this.rect.center;
var limit = this.rect.width * 0.5 - 8;
if (x < -limit) { x = -limit; }
if (x > limit) { x = limit; }
this.setProperty('--arrow-x', ((x.toFixed(2)) + "px"));
};
Object.defineProperties( Tooltip.prototype, prototypeAccessors );
Object.defineProperties( Tooltip, staticAccessors );
return Tooltip;
}(api.core.Placement));
api.tooltip = {
Tooltip: Tooltip,
TooltipSelector: TooltipSelector,
TooltipEvent: TooltipEvent
};
api.internals.register(api.tooltip.TooltipSelector.TOOLTIP, api.tooltip.Tooltip);
var ToggleInput = /*@__PURE__*/(function (superclass) {
function ToggleInput () {
superclass.apply(this, arguments);
}
if ( superclass ) ToggleInput.__proto__ = superclass;
ToggleInput.prototype = Object.create( superclass && superclass.prototype );
ToggleInput.prototype.constructor = ToggleInput;
var prototypeAccessors = { isChecked: { configurable: true } };
var staticAccessors = { instanceClassName: { configurable: true } };
staticAccessors.instanceClassName.get = function () {
return 'ToggleInput';
};
prototypeAccessors.isChecked.get = function () {
return this.node.checked;
};
Object.defineProperties( ToggleInput.prototype, prototypeAccessors );
Object.defineProperties( ToggleInput, staticAccessors );
return ToggleInput;
}(api.core.Instance));
var ToggleStatusLabel = /*@__PURE__*/(function (superclass) {
function ToggleStatusLabel () {
superclass.apply(this, arguments);
}
if ( superclass ) ToggleStatusLabel.__proto__ = superclass;
ToggleStatusLabel.prototype = Object.create( superclass && superclass.prototype );
ToggleStatusLabel.prototype.constructor = ToggleStatusLabel;
var prototypeAccessors = { proxy: { configurable: true },input: { configurable: true } };
var staticAccessors = { instanceClassName: { configurable: true } };
staticAccessors.instanceClassName.get = function () {
return 'ToggleStatusLabel';
};
ToggleStatusLabel.prototype.init = function init () {
this.register(("input[id=\"" + (this.getAttribute('for')) + "\"]"), ToggleInput);
this.update();
this.isSwappingFont = true;
};
prototypeAccessors.proxy.get = function () {
var scope = this;
return Object.assign.call(this, superclass.prototype.proxy, {
update: scope.update.bind(scope)
});
};
prototypeAccessors.input.get = function () {
return this.getRegisteredInstances('ToggleInput')[0];
};
ToggleStatusLabel.prototype.update = function update () {
this.node.style.removeProperty('--toggle-status-width');
var checked = this.input.isChecked;
var style = getComputedStyle(this.node, ':before');
var maxWidth = parseFloat(style.width);
this.input.node.checked = !checked;
var style2 = getComputedStyle(this.node, ':before');
var width = parseFloat(style2.width);
if (width > maxWidth) { maxWidth = width; }
this.input.node.checked = checked;
this.node.style.setProperty('--toggle-status-width', (maxWidth / 16) + 'rem');
};
ToggleStatusLabel.prototype.swapFont = function swapFont (families) {
this.update();
};
Object.defineProperties( ToggleStatusLabel.prototype, prototypeAccessors );
Object.defineProperties( ToggleStatusLabel, staticAccessors );
return ToggleStatusLabel;
}(api.core.Instance));
var ToggleSelector = {
STATUS_LABEL: ("" + (api.internals.ns.selector('toggle__label')) + (api.internals.ns.attr.selector('checked-label')) + (api.internals.ns.attr.selector('unchecked-label')))
};
// import { ToggleInput } from './script/toggle/toggle-input.js';
api.toggle = {
ToggleStatusLabel: ToggleStatusLabel,
ToggleSelector: ToggleSelector
};
api.internals.register(api.toggle.ToggleSelector.STATUS_LABEL, api.toggle.ToggleStatusLabel);
var ITEM$1 = api.internals.ns.selector('sidemenu__item');
var COLLAPSE$1 = api.internals.ns.selector('collapse');
var SidemenuSelector = {
LIST: api.internals.ns.selector('sidemenu__list'),
COLLAPSE: (ITEM$1 + " > " + COLLAPSE$1 + ", " + ITEM$1 + " > *:not(" + ITEM$1 + "):not(" + COLLAPSE$1 + ") > " + COLLAPSE$1 + ", " + ITEM$1 + " > *:not(" + ITEM$1 + "):not(" + COLLAPSE$1 + ") > *:not(" + ITEM$1 + "):not(" + COLLAPSE$1 + ") > " + COLLAPSE$1),
COLLAPSE_LEGACY: (ITEM$1 + " " + COLLAPSE$1),
ITEM: api.internals.ns.selector('sidemenu__item'),
BUTTON: api.internals.ns.selector('sidemenu__btn')
};
var SidemenuList = /*@__PURE__*/(function (superclass) {
function SidemenuList () {
superclass.apply(this, arguments);
}
if ( superclass ) SidemenuList.__proto__ = superclass;
SidemenuList.prototype = Object.create( superclass && superclass.prototype );
SidemenuList.prototype.constructor = SidemenuList;
var staticAccessors = { instanceClassName: { configurable: true } };
staticAccessors.instanceClassName.get = function () {
return 'SidemenuList';
};
SidemenuList.prototype.validate = function validate (member) {
return superclass.prototype.validate.call(this, member) && member.node.matches(api.internals.legacy.isLegacy ? SidemenuSelector.COLLAPSE_LEGACY : SidemenuSelector.COLLAPSE);
};
Object.defineProperties( SidemenuList, staticAccessors );
return SidemenuList;
}(api.core.CollapsesGroup));
var SidemenuItem = /*@__PURE__*/(function (superclass) {
function SidemenuItem () {
superclass.apply(this, arguments);
}
if ( superclass ) SidemenuItem.__proto__ = superclass;
SidemenuItem.prototype = Object.create( superclass && superclass.prototype );
SidemenuItem.prototype.constructor = SidemenuItem;
var prototypeAccessors = { collapsePrimary: { configurable: true } };
var staticAccessors = { instanceClassName: { configurable: true } };
staticAccessors.instanceClassName.get = function () {
return 'SidemenuItem';
};
prototypeAccessors.collapsePrimary.get = function () {
var buttons = this.element.children.map(function (child) { return child.getInstance('CollapseButton'); }).filter(function (button) { return button !== null && button.hasClass(SidemenuSelector.BUTTON); });
return buttons[0];
};
Object.defineProperties( SidemenuItem.prototype, prototypeAccessors );
Object.defineProperties( SidemenuItem, staticAccessors );
return SidemenuItem;
}(api.core.Instance));
api.sidemenu = {
SidemenuList: SidemenuList,
SidemenuItem: SidemenuItem,
SidemenuSelector: SidemenuSelector
};
api.internals.register(api.sidemenu.SidemenuSelector.LIST, api.sidemenu.SidemenuList);
api.internals.register(api.sidemenu.SidemenuSelector.ITEM, api.sidemenu.SidemenuItem);
var ModalSelector = {
MODAL: api.internals.ns.selector('modal'),
SCROLL_DIVIDER: api.internals.ns.selector('scroll-divider'),
BODY: api.internals.ns.selector('modal__body'),
TITLE: api.internals.ns.selector('modal__title')
};
var ModalButton = /*@__PURE__*/(function (superclass) {
function ModalButton () {
superclass.call(this, api.core.DisclosureType.OPENED);
}
if ( superclass ) ModalButton.__proto__ = superclass;
ModalButton.prototype = Object.create( superclass && superclass.prototype );
ModalButton.prototype.constructor = ModalButton;
var staticAccessors = { instanceClassName: { configurable: true } };
staticAccessors.instanceClassName.get = function () {
return 'ModalButton';
};
Object.defineProperties( ModalButton, staticAccessors );
return ModalButton;
}(api.core.DisclosureButton));
var ModalAttribute = {
CONCEALING_BACKDROP: api.internals.ns.attr('concealing-backdrop')
};
var Modal = /*@__PURE__*/(function (superclass) {
function Modal () {
superclass.call(this, api.core.DisclosureType.OPENED, ModalSelector.MODAL, ModalButton, 'ModalsGroup');
this._isActive = false;
this.scrolling = this.resize.bind(this, false);
this.resizing = this.resize.bind(this, true);
}
if ( superclass ) Modal.__proto__ = superclass;
Modal.prototype = Object.create( superclass && superclass.prototype );
Modal.prototype.constructor = Modal;
var prototypeAccessors = { body: { configurable: true },isDialog: { configurable: true } };
var staticAccessors = { instanceClassName: { configurable: true } };
staticAccessors.instanceClassName.get = function () {
return 'Modal';
};
Modal.prototype.init = function init () {
superclass.prototype.init.call(this);
this._isDialog = this.node.tagName === 'DIALOG';
this.isScrolling = false;
this.listenClick();
this.addEmission(api.core.RootEmission.KEYDOWN, this._keydown.bind(this));
};
Modal.prototype._keydown = function _keydown (keyCode) {
switch (keyCode) {
case api.core.KeyCodes.ESCAPE:
this._escape();
break;
}
};
// TODO v2 : passer les tagName d'action en constante
Modal.prototype._escape = function _escape () {
var tagName = document.activeElement ? document.activeElement.tagName : undefined;
switch (tagName) {
case 'INPUT':
case 'LABEL':
case 'TEXTAREA':
case 'SELECT':
case 'AUDIO':
case 'VIDEO':
break;
default:
if (this.isDisclosed) {
this.conceal();
this.focus();
}
}
};
Modal.prototype.retrieved = function retrieved () {
this._ensureAccessibleName();
};
prototypeAccessors.body.get = function () {
return this.element.getDescendantInstances('ModalBody', 'Modal')[0];
};
Modal.prototype.handleClick = function handleClick (e) {
if (e.target === this.node && this.getAttribute(ModalAttribute.CONCEALING_BACKDROP) !== 'false') { this.conceal(); }
};
Modal.prototype.disclose = function disclose (withhold) {
if (!superclass.prototype.disclose.call(this, withhold)) { return false; }
if (this.body) { this.body.activate(); }
this.isScrollLocked = true;
this.setAttribute('aria-modal', 'true');
this.setAttribute('open', 'true');
if (!this._isDialog) {
this.activateModal();
}
return true;
};
Modal.prototype.conceal = function conceal (withhold, preventFocus) {
if (!superclass.prototype.conceal.call(this, withhold, preventFocus)) { return false; }
this.isScrollLocked = false;
this.removeAttribute('aria-modal');
this.removeAttribute('open');
if (this.body) { this.body.deactivate(); }
if (!this._isDialog) {
this.deactivateModal();
}
return true;
};
prototypeAccessors.isDialog.get = function () {
return this._isDialog;
};
prototypeAccessors.isDialog.set = function (value) {
this._isDialog = value;
};
Modal.prototype.activateModal = function activateModal () {
if (this._isActive) { return; }
this._isActive = true;
this._hasDialogRole = this.getAttribute('role') === 'dialog';
if (!this._hasDialogRole) { this.setAttribute('role', 'dialog'); }
};
Modal.prototype.deactivateModal = function deactivateModal () {
if (!this._isActive) { return; }
this._isActive = false;
if (!this._hasDialogRole) { this.removeAttribute('role'); }
};
Modal.prototype._setAccessibleName = function _setAccessibleName (node, append) {
var id = this.retrieveNodeId(node, append);
this.warn(("add reference to " + append + " for accessible name (aria-labelledby)"));
this.setAttribute('aria-labelledby', id);
};
Modal.prototype._ensureAccessibleName = function _ensureAccessibleName () {
if (this.hasAttribute('aria-labelledby') || this.hasAttribute('aria-label')) { return; }
this.warn('missing accessible name');
var title = this.node.querySelector(ModalSelector.TITLE);
var primary = this.primaryButtons[0];
switch (true) {
case title !== null:
this._setAccessibleName(title, 'title');
break;
case primary !== undefined:
this.warn('missing required title, fallback to primary button');
this._setAccessibleName(primary, 'primary');
break;
}
};
Object.defineProperties( Modal.prototype, prototypeAccessors );
Object.defineProperties( Modal, staticAccessors );
return Modal;
}(api.core.Disclosure));
var unordereds = [
'[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'
];
var UNORDEREDS = unordereds.join();
var ordereds = [
'[tabindex]:not([tabindex="-1"]):not([tabindex="0"])'
];
var ORDEREDS = ordereds.join();
var isFocusable = function (element, container) {
if (!(element instanceof Element)) { return false; }
var style = window.getComputedStyle(element);
if (!style) { return false; }
if (style.visibility === 'hidden') { return false; }
if (container === undefined) { container = element; }
while (container.contains(element)) {
if (style.display === 'none') { return false; }
element = element.parentElement;
}
return true;
};
var FocusTrap = function FocusTrap (onTrap, onUntrap) {
this.element = null;
this.activeElement = null;
this.onTrap = onTrap;
this.onUntrap = onUntrap;
this.waiting = this.wait.bind(this);
this.handling = this.handle.bind(this);
this.focusing = this.maintainFocus.bind(this);
this.current = null;
};
var prototypeAccessors$2 = { trapped: { configurable: true },focusables: { configurable: true } };
prototypeAccessors$2.trapped.get = function () { return this.element !== null; };
FocusTrap.prototype.trap = function trap (element) {
if (this.trapped) { this.untrap(); }
this.element = element;
this.isTrapping = true;
this.wait();
if (this.onTrap) { this.onTrap(); }
};
FocusTrap.prototype.wait = function wait () {
if (!isFocusable(this.element)) {
window.requestAnimationFrame(this.waiting);
return;
}
this.trapping();
};
FocusTrap.prototype.trapping = function trapping () {
if (!this.isTrapping) { return; }
this.isTrapping = false;
var focusables = this.focusables;
if (focusables.length && focusables.indexOf(document.activeElement) === -1) { focusables[0].focus(); }
this.element.setAttribute('aria-modal', true);
window.addEventListener('keydown', this.handling);
document.body.addEventListener('focus', this.focusing, true);
};
FocusTrap.prototype.stun = function stun (node) {
for (var i = 0, list = node.children; i < list.length; i += 1) {
var child = list[i];
if (child === this.element) { continue; }
if (child.contains(this.element)) {
this.stun(child);
continue;
}
this.stunneds.push(new Stunned(child));
}
};
FocusTrap.prototype.maintainFocus = function maintainFocus (event) {
if (!this.element.contains(event.target)) {
var focusables = this.focusables;
if (focusables.length === 0) { return; }
var first = focusables[0];
event.preventDefault();
first.focus();
}
};
FocusTrap.prototype.handle = function handle (e) {
if (e.keyCode !== 9) { return; }
var focusables = this.focusables;
if (focusables.length === 0) { return; }
var first = focusables[0];
var last = focusables[focusables.length - 1];
var index = focusables.indexOf(document.activeElement);
if (e.shiftKey) {
if (!this.element.contains(document.activeElement) || index < 1) {
e.preventDefault();
last.focus();
} else if (document.activeElement.tabIndex > 0 || focusables[index - 1].tabIndex > 0) {
e.preventDefault();
focusables[index - 1].focus();
}
} else {
if (!this.element.contains(document.activeElement) || index === focusables.length - 1 || index === -1) {
e.preventDefault();
first.focus();
} else if (document.activeElement.tabIndex > 0) {
e.preventDefault();
focusables[index + 1].focus();
}
}
};
prototypeAccessors$2.focusables.get = function () {
var this$1$1 = this;
var unordereds = api.internals.dom.querySelectorAllArray(this.element, UNORDEREDS);
/**
*filtrage des radiobutttons de même name (la navigations d'un groupe de radio se fait à la flèche et non pas au tab
**/
var radios = api.internals.dom.querySelectorAllArray(document.documentElement, 'input[type="radio"]');
if (radios.length) {
var groups = {};
for (var i = 0, list = radios; i < list.length; i += 1) {
var radio = list[i];
var name = radio.getAttribute('name');
if (groups[name] === undefined) { groups[name] = new RadioButtonGroup(name); }
groups[name].push(radio);
}
unordereds = unordereds.filter(function (unordered) {
if (unordered.tagName.toLowerCase() !== 'input' || unordered.getAttribute('type').toLowerCase() !== 'radio') { return true; }
var name = unordered.getAttribute('name');
return groups[name].keep(unordered);
});
}
var ordereds = api.internals.dom.querySelectorAllArray(this.element, ORDEREDS);
ordereds.sort(function (a, b) { return a.tabIndex - b.tabIndex; });
var noDuplicates = unordereds.filter(function (element) { return ordereds.indexOf(element) === -1; });
var concateneds = ordereds.concat(noDuplicates);
return concateneds.filter(function (element) { return element.tabIndex !== '-1' && isFocusable(element, this$1$1.element); });
};
FocusTrap.prototype.untrap = function untrap () {
if (!this.trapped) { return; }
this.isTrapping = false;
this.element.removeAttribute('aria-modal');
window.removeEventListener('keydown', this.handling);
document.body.removeEventListener('focus', this.focusing, true);
this.element = null;
if (this.onUntrap) { this.onUntrap(); }
};
FocusTrap.prototype.dispose = function dispose () {
this.untrap();
};
Object.defineProperties( FocusTrap.prototype, prototypeAccessors$2 );
var Stunned = function Stunned (element) {
this.element = element;
// this.hidden = element.getAttribute('aria-hidden');
this.inert = element.getAttribute('inert');
// this.element.setAttribute('aria-hidden', true);
this.element.setAttribute('inert', '');
};
Stunned.prototype.unstun = function unstun () {
/*
if (this.hidden === null) this.element.removeAttribute('aria-hidden');
else this.element.setAttribute('aria-hidden', this.hidden);
*/
if (this.inert === null) { this.element.removeAttribute('inert'); }
else { this.element.setAttribute('inert', this.inert); }
};
var RadioButtonGroup = function RadioButtonGroup (name) {
this.name = name;
this.buttons = [];
};
RadioButtonGroup.prototype.push = function push (button) {
this.buttons.push(button);
if (button === document.activeElement || button.checked || this.selected === undefined) { this.selected = button; }
};
RadioButtonGroup.prototype.keep = function keep (button) {
return this.selected === button;
};
var ModalsGroup = /*@__PURE__*/(function (superclass) {
function ModalsGroup () {
superclass.call(this, 'Modal', false);
this.focusTrap = new FocusTrap();
}
if ( superclass ) ModalsGroup.__proto__ = superclass;
ModalsGroup.prototype = Object.create( superclass && superclass.prototype );
ModalsGroup.prototype.constructor = ModalsGroup;
var staticAccessors = { instanceClassName: { configurable: true } };
staticAccessors.instanceClassName.get = function () {
return 'ModalsGroup';
};
ModalsGroup.prototype.apply = function apply (value, initial) {
superclass.prototype.apply.call(this, value, initial);
if (this.current === null) { this.focusTrap.untrap(); }
else { this.focusTrap.trap(this.current.node); }
};
Object.defineProperties( ModalsGroup, staticAccessors );
return ModalsGroup;
}(api.core.DisclosuresGroup));
var OFFSET = 32; // 32px => 8v => 2rem
var ModalBody = /*@__PURE__*/(function (superclass) {
function ModalBody () {
superclass.apply(this, arguments);
}
if ( superclass ) ModalBody.__proto__ = superclass;
ModalBody.prototype = Object.create( superclass && superclass.prototype );
ModalBody.prototype.constructor = ModalBody;
var staticAccessors = { instanceClassName: { configurable: true } };
staticAccessors.instanceClassName.get = function () {
return 'ModalBody';
};
ModalBody.prototype.init = function init () {
this.listen('scroll', this.divide.bind(this));
};
ModalBody.prototype.activate = function activate () {
this.isResizing = true;
this.resize();
};
ModalBody.prototype.deactivate = function deactivate () {
this.isResizing = false;
};
ModalBody.prototype.divide = function divide () {
if (this.node.scrollHeight > this.node.clientHeight) {
if (this.node.offsetHeight + this.node.scrollTop >= this.node.scrollHeight) {
this.removeClass(ModalSelector.SCROLL_DIVIDER);
} else {
this.addClass(ModalSelector.SCROLL_DIVIDER);
}
} else {
this.removeClass(ModalSelector.SCROLL_DIVIDER);
}
};
ModalBody.prototype.resize = function resize () {
this.adjust();
this.request(this.adjust.bind(this));
};
ModalBody.prototype.adjust = function adjust () {
var offset = OFFSET * (this.isBreakpoint(api.core.Breakpoints.MD) ? 2 : 1);
if (this.isLegacy) { this.style.maxHeight = (window.innerHeight - offset) + "px"; }
else { this.style.setProperty('--modal-max-height', ((window.innerHeight - offset) + "px")); }
this.divide();
};
Object.defineProperties( ModalBody, staticAccessors );
return ModalBody;
}(api.core.Instance));
api.modal = {
Modal: Modal,
ModalButton: ModalButton,
ModalBody: ModalBody,
ModalsGroup: ModalsGroup,
ModalSelector: ModalSelector
};
api.internals.register(api.modal.ModalSelector.MODAL, api.modal.Modal);
api.internals.register(api.modal.ModalSelector.BODY, api.modal.ModalBody);
api.internals.register(api.core.RootSelector.ROOT, api.modal.ModalsGroup);
var PasswordEmission = {
TOGGLE: api.internals.ns.emission('password', 'toggle'),
ADJUST: api.internals.ns.emission('password', 'adjust')
};
var PasswordToggle = /*@__PURE__*/(function (superclass) {
function PasswordToggle () {
superclass.apply(this, arguments);
}
if ( superclass ) PasswordToggle.__proto__ = superclass;
PasswordToggle.prototype = Object.create( superclass && superclass.prototype );
PasswordToggle.prototype.constructor = PasswordToggle;
var prototypeAccessors = { width: { configurable: true },isChecked: { configurable: true } };
var staticAccessors = { instanceClassName: { configurable: true } };
staticAccessors.instanceClassName.get = function () {
return 'PasswordToggle';
};
PasswordToggle.prototype.init = function init () {
this.listenClick();
this.ascend(PasswordEmission.ADJUST, this.width);
this.isSwappingFont = true;
this._isChecked = this.isChecked;
};
prototypeAccessors.width.get = function () {
var style = getComputedStyle(this.node.parentNode);
return parseInt(style.width);
};
prototypeAccessors.isChecked.get = function () {
return this.node.checked;
};
prototypeAccessors.isChecked.set = function (value) {
this._isChecked = value;
this.ascend(PasswordEmission.TOGGLE, value);
};
PasswordToggle.prototype.handleClick = function handleClick () {
this.isChecked = !this._isChecked;
};
PasswordToggle.prototype.swapFont = function swapFont (families) {
this.ascend(PasswordEmission.ADJUST, this.width);
};
Object.defineProperties( PasswordToggle.prototype, prototypeAccessors );
Object.defineProperties( PasswordToggle, staticAccessors );
return PasswordToggle;
}(api.core.Instance));
var Password = /*@__PURE__*/(function (superclass) {
function Password () {
superclass.apply(this, arguments);
}
if ( superclass ) Password.__proto__ = superclass;
Password.prototype = Object.create( superclass && superclass.prototype );
Password.prototype.constructor = Password;
var staticAccessors = { instanceClassName: { configurable: true } };
staticAccessors.instanceClassName.get = function () {
return 'Password';
};
Password.prototype.init = function init () {
this.addAscent(PasswordEmission.TOGGLE, this.toggle.bind(this));
this.addAscent(PasswordEmission.ADJUST, this.adjust.bind(this));
};
Password.prototype.toggle = function toggle (value) {
this.descend(PasswordEmission.TOGGLE, value);
};
Password.prototype.adjust = function adjust (value) {
this.descend(PasswordEmission.ADJUST, value);
};
Object.defineProperties( Password, staticAccessors );
return Password;
}(api.core.Instance));
var PasswordSelector = {
PASSWORD: api.internals.ns.selector('password'),
INPUT: api.internals.ns.selector('password__input'),
LABEL: api.internals.ns.selector('password__label'),
TOOGLE: ((api.internals.ns.selector('password__checkbox')) + " input[type=\"checkbox\"]")
};
var PasswordInput = /*@__PURE__*/(function (superclass) {
function PasswordInput () {
superclass.apply(this, arguments);
}
if ( superclass ) PasswordInput.__proto__ = superclass;
PasswordInput.prototype = Object.create( superclass && superclass.prototype );
PasswordInput.prototype.constructor = PasswordInput;
var prototypeAccessors = { isRevealed: { configurable: true } };
var staticAccessors = { instanceClassName: { configurable: true } };
staticAccessors.instanceClassName.get = function () {
return 'PasswordInput';
};
PasswordInput.prototype.init = function init () {
this.addDescent(PasswordEmission.TOGGLE, this.toggle.bind(this));
this._isRevealed = this.hasAttribute('type') === 'password';
this.listen('keydown', this.capslock.bind(this)); // for capslock enabled
this.listen('keyup', this.capslock.bind(this)); // for capslock desabled
};
PasswordInput.prototype.toggle = function toggle (value) {
this.isRevealed = value;
this.setAttribute('type', value ? 'text' : 'password');
};
prototypeAccessors.isRevealed.get = function () {
return this._isRevealed;
};
PasswordInput.prototype.capslock = function capslock (event) {
if (event && typeof event.getModifierState !== 'function') { return; }
if (event.getModifierState('CapsLock')) {
this.node.parentNode.setAttribute(api.internals.ns.attr('capslock'), '');
} else {
this.node.parentNode.removeAttribute(api.internals.ns.attr('capslock'));
}
};
prototypeAccessors.isRevealed.set = function (value) {
this._isRevealed = value;
this.setAttribute('type', value ? 'text' : 'password');
};
Object.defineProperties( PasswordInput.prototype, prototypeAccessors );
Object.defineProperties( PasswordInput, staticAccessors );
return PasswordInput;
}(api.core.Instance));
var PasswordLabel = /*@__PURE__*/(function (superclass) {
function PasswordLabel () {
superclass.apply(this, arguments);
}
if ( superclass ) PasswordLabel.__proto__ = superclass;
PasswordLabel.prototype = Object.create( superclass && superclass.prototype );
PasswordLabel.prototype.constructor = PasswordLabel;
var staticAccessors = { instanceClassName: { configurable: true } };
staticAccessors.instanceClassName.get = function () {
return 'PasswordLabel';
};
PasswordLabel.prototype.init = function init () {
this.addDescent(PasswordEmission.ADJUST, this.adjust.bind(this));
};
PasswordLabel.prototype.adjust = function adjust (value) {
var valueREM = Math.ceil(value / 16);
this.node.style.paddingRight = valueREM + 'rem';
};
Object.defineProperties( PasswordLabel, staticAccessors );
return PasswordLabel;
}(api.core.Instance));
api.password = {
Password: Password,
PasswordToggle: PasswordToggle,
PasswordSelector: PasswordSelector,
PasswordInput: PasswordInput,
PasswordLabel: PasswordLabel
};
api.internals.register(api.password.PasswordSelector.INPUT, api.password.PasswordInput);
api.internals.register(api.password.PasswordSelector.PASSWORD, api.password.Password);
api.internals.register(api.password.PasswordSelector.TOOGLE, api.password.PasswordToggle);
api.internals.register(api.password.PasswordSelector.LABEL, api.password.PasswordLabel);
var ITEM = api.internals.ns.selector('nav__item');
var COLLAPSE = api.internals.ns.selector('collapse');
var NavigationSelector = {
NAVIGATION: api.internals.ns.selector('nav'),
COLLAPSE: (ITEM + " > " + COLLAPSE + ", " + ITEM + " > *:not(" + ITEM + "):not(" + COLLAPSE + ") > " + COLLAPSE + ", " + ITEM + " > *:not(" + ITEM + "):no