@expressivecss/expressive 0.9.1 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +157 -1
- package/README.md +178 -25
- package/dist/css/expressive.css +365 -1222
- package/dist/css/expressive.css.map +1 -1
- package/dist/css/expressive.min.css +1 -1
- package/dist/css/expressive.min.css.map +1 -1
- package/dist/fonts/material-symbols-outlined.woff2 +0 -0
- package/dist/fonts/material-symbols-rounded.woff2 +0 -0
- package/dist/fonts/material-symbols-sharp.woff2 +0 -0
- package/dist/js/chunks/chunk-7MM4VJJO.mjs +509 -0
- package/dist/js/chunks/chunk-7MM4VJJO.mjs.map +7 -0
- package/dist/js/chunks/chunk-7UXHSYIA.mjs +183 -0
- package/dist/js/chunks/chunk-7UXHSYIA.mjs.map +7 -0
- package/dist/js/chunks/chunk-A3BJA7V4.mjs +28 -0
- package/dist/js/chunks/chunk-A3BJA7V4.mjs.map +7 -0
- package/dist/js/chunks/chunk-AOGFNMXS.mjs +691 -0
- package/dist/js/chunks/chunk-AOGFNMXS.mjs.map +7 -0
- package/dist/js/chunks/chunk-D4UZ4HFN.mjs +560 -0
- package/dist/js/chunks/chunk-D4UZ4HFN.mjs.map +7 -0
- package/dist/js/chunks/chunk-EP3CVKB5.mjs +88 -0
- package/dist/js/chunks/chunk-EP3CVKB5.mjs.map +7 -0
- package/dist/js/chunks/chunk-G576EP5O.mjs +459 -0
- package/dist/js/chunks/chunk-G576EP5O.mjs.map +7 -0
- package/dist/js/chunks/chunk-GY2Z5CJ2.mjs +320 -0
- package/dist/js/chunks/chunk-GY2Z5CJ2.mjs.map +7 -0
- package/dist/js/chunks/chunk-JKNPQQWY.mjs +191 -0
- package/dist/js/chunks/chunk-JKNPQQWY.mjs.map +7 -0
- package/dist/js/chunks/chunk-JNPIWFJT.mjs +365 -0
- package/dist/js/chunks/chunk-JNPIWFJT.mjs.map +7 -0
- package/dist/js/chunks/chunk-JODJAGFS.mjs +267 -0
- package/dist/js/chunks/chunk-JODJAGFS.mjs.map +7 -0
- package/dist/js/chunks/chunk-JR24UB4X.mjs +100 -0
- package/dist/js/chunks/chunk-JR24UB4X.mjs.map +7 -0
- package/dist/js/chunks/chunk-KR44BSYQ.mjs +55 -0
- package/dist/js/chunks/chunk-KR44BSYQ.mjs.map +7 -0
- package/dist/js/chunks/chunk-LZVBJ33S.mjs +102 -0
- package/dist/js/chunks/chunk-LZVBJ33S.mjs.map +7 -0
- package/dist/js/chunks/chunk-MISGHDUU.mjs +326 -0
- package/dist/js/chunks/chunk-MISGHDUU.mjs.map +7 -0
- package/dist/js/chunks/chunk-N3UHGN3N.mjs +175 -0
- package/dist/js/chunks/chunk-N3UHGN3N.mjs.map +7 -0
- package/dist/js/chunks/chunk-PB5L3EXF.mjs +7 -0
- package/dist/js/chunks/chunk-PB5L3EXF.mjs.map +7 -0
- package/dist/js/chunks/chunk-PIIAEYAJ.mjs +85 -0
- package/dist/js/chunks/chunk-PIIAEYAJ.mjs.map +7 -0
- package/dist/js/chunks/chunk-QSQ24FYT.mjs +59 -0
- package/dist/js/chunks/chunk-QSQ24FYT.mjs.map +7 -0
- package/dist/js/chunks/chunk-QYCYP443.mjs +1111 -0
- package/dist/js/chunks/chunk-QYCYP443.mjs.map +7 -0
- package/dist/js/chunks/chunk-SLFNPY5M.mjs +78 -0
- package/dist/js/chunks/chunk-SLFNPY5M.mjs.map +7 -0
- package/dist/js/chunks/chunk-TK6PX2GC.mjs +663 -0
- package/dist/js/chunks/chunk-TK6PX2GC.mjs.map +7 -0
- package/dist/js/chunks/chunk-TYM6U5DY.mjs +76 -0
- package/dist/js/chunks/chunk-TYM6U5DY.mjs.map +7 -0
- package/dist/js/chunks/chunk-TZZ24ZQS.mjs +154 -0
- package/dist/js/chunks/chunk-TZZ24ZQS.mjs.map +7 -0
- package/dist/js/chunks/chunk-VAS6JQ6P.mjs +94 -0
- package/dist/js/chunks/chunk-VAS6JQ6P.mjs.map +7 -0
- package/dist/js/chunks/chunk-WWPAPHMA.mjs +1 -0
- package/dist/js/chunks/chunk-WWPAPHMA.mjs.map +7 -0
- package/dist/js/chunks/chunk-XDB3G6RL.mjs +114 -0
- package/dist/js/chunks/chunk-XDB3G6RL.mjs.map +7 -0
- package/dist/js/chunks/chunk-XO5WX3TK.mjs +226 -0
- package/dist/js/chunks/chunk-XO5WX3TK.mjs.map +7 -0
- package/dist/js/chunks/chunk-YFXEJ7GR.mjs +286 -0
- package/dist/js/chunks/chunk-YFXEJ7GR.mjs.map +7 -0
- package/dist/js/chunks/chunk-ZIZVUWRL.mjs +120 -0
- package/dist/js/chunks/chunk-ZIZVUWRL.mjs.map +7 -0
- package/dist/js/chunks/chunk-ZZBZI2XN.mjs +338 -0
- package/dist/js/chunks/chunk-ZZBZI2XN.mjs.map +7 -0
- package/dist/js/expressive.cjs +747 -754
- package/dist/js/expressive.cjs.map +4 -4
- package/dist/js/expressive.js +747 -754
- package/dist/js/expressive.js.map +4 -4
- package/dist/js/expressive.min.js +11 -15
- package/dist/js/expressive.min.js.map +4 -4
- package/dist/js/expressive.mjs +83 -7490
- package/dist/js/expressive.mjs.map +4 -4
- package/dist/js/internal/behaviors/bottomSheets.mjs +9 -0
- package/dist/js/internal/behaviors/bottomSheets.mjs.map +7 -0
- package/dist/js/internal/behaviors/dialogs.mjs +8 -0
- package/dist/js/internal/behaviors/dialogs.mjs.map +7 -0
- package/dist/js/internal/behaviors/forms.mjs +8 -0
- package/dist/js/internal/behaviors/forms.mjs.map +7 -0
- package/dist/js/internal/behaviors/sheetDrag.mjs +8 -0
- package/dist/js/internal/behaviors/sheetDrag.mjs.map +7 -0
- package/dist/js/internal/behaviors/sideSheets.mjs +9 -0
- package/dist/js/internal/behaviors/sideSheets.mjs.map +7 -0
- package/dist/js/internal/components/appBar.mjs +8 -0
- package/dist/js/internal/components/appBar.mjs.map +7 -0
- package/dist/js/internal/components/autocomplete.mjs +10 -0
- package/dist/js/internal/components/autocomplete.mjs.map +7 -0
- package/dist/js/internal/components/buttonGroup.mjs +8 -0
- package/dist/js/internal/components/buttonGroup.mjs.map +7 -0
- package/dist/js/internal/components/buttons.mjs +9 -0
- package/dist/js/internal/components/buttons.mjs.map +7 -0
- package/dist/js/internal/components/cards.mjs +13 -0
- package/dist/js/internal/components/cards.mjs.map +7 -0
- package/dist/js/internal/components/carousel.mjs +9 -0
- package/dist/js/internal/components/carousel.mjs.map +7 -0
- package/dist/js/internal/components/characterCounter.mjs +8 -0
- package/dist/js/internal/components/characterCounter.mjs.map +7 -0
- package/dist/js/internal/components/chips.mjs +11 -0
- package/dist/js/internal/components/chips.mjs.map +7 -0
- package/dist/js/internal/components/datepicker.mjs +12 -0
- package/dist/js/internal/components/datepicker.mjs.map +7 -0
- package/dist/js/internal/components/expandingCard.mjs +11 -0
- package/dist/js/internal/components/expandingCard.mjs.map +7 -0
- package/dist/js/internal/components/index.mjs +88 -0
- package/dist/js/internal/components/index.mjs.map +7 -0
- package/dist/js/internal/components/lightbox.mjs +9 -0
- package/dist/js/internal/components/lightbox.mjs.map +7 -0
- package/dist/js/internal/components/menu.mjs +9 -0
- package/dist/js/internal/components/menu.mjs.map +7 -0
- package/dist/js/internal/components/navigationRail.mjs +8 -0
- package/dist/js/internal/components/navigationRail.mjs.map +7 -0
- package/dist/js/internal/components/registry.mjs +33 -0
- package/dist/js/internal/components/registry.mjs.map +7 -0
- package/dist/js/internal/components/scrollspy.mjs +8 -0
- package/dist/js/internal/components/scrollspy.mjs.map +7 -0
- package/dist/js/internal/components/select.mjs +10 -0
- package/dist/js/internal/components/select.mjs.map +7 -0
- package/dist/js/internal/components/slider.mjs +9 -0
- package/dist/js/internal/components/slider.mjs.map +7 -0
- package/dist/js/internal/components/snackbar.mjs +8 -0
- package/dist/js/internal/components/snackbar.mjs.map +7 -0
- package/dist/js/internal/components/tabs.mjs +10 -0
- package/dist/js/internal/components/tabs.mjs.map +7 -0
- package/dist/js/internal/components/timepicker.mjs +10 -0
- package/dist/js/internal/components/timepicker.mjs.map +7 -0
- package/dist/js/internal/components/tooltip.mjs +9 -0
- package/dist/js/internal/components/tooltip.mjs.map +7 -0
- package/dist/js/internal/core/component.mjs +7 -0
- package/dist/js/internal/core/component.mjs.map +7 -0
- package/dist/js/internal/core/utils.mjs +7 -0
- package/dist/js/internal/core/utils.mjs.map +7 -0
- package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +8 -0
- package/dist/js/internal/plugins/dockedDisplayPlugin.mjs.map +7 -0
- package/dist/js/modular.mjs +113 -0
- package/dist/js/modular.mjs.map +7 -0
- package/dist/types/behaviors/sheetDrag.d.ts +1 -1
- package/dist/types/components/appBar.d.ts +1 -1
- package/dist/types/components/autocomplete.d.ts +9 -0
- package/dist/types/components/buttons.d.ts +4 -39
- package/dist/types/components/carousel.d.ts +10 -1
- package/dist/types/components/chips.d.ts +1 -0
- package/dist/types/components/datepicker.d.ts +7 -0
- package/dist/types/components/index.d.ts +0 -2
- package/dist/types/components/lightbox.d.ts +12 -0
- package/dist/types/components/menu.d.ts +3 -0
- package/dist/types/components/registry.d.ts +0 -4
- package/dist/types/components/select.d.ts +4 -0
- package/dist/types/components/slider.d.ts +2 -1
- package/dist/types/components/snackbar.d.ts +4 -2
- package/dist/types/components/tabs.d.ts +2 -1
- package/dist/types/components/timepicker.d.ts +5 -3
- package/dist/types/components/tooltip.d.ts +5 -3
- package/dist/types/index.d.ts +1 -8
- package/dist/types/modular.d.ts +28 -0
- package/package.json +16 -4
- package/src/sass/README.md +8 -0
- package/src/sass/components/_badges.scss +1 -6
- package/src/sass/components/_button-groups.scss +5 -1
- package/src/sass/components/_buttons.scss +8 -287
- package/src/sass/components/_chips.scss +17 -2
- package/src/sass/components/_dialog.scss +9 -4
- package/src/sass/components/_fab-menu.scss +11 -9
- package/src/sass/components/_icon-buttons.scss +0 -5
- package/src/sass/components/_index.scss +0 -5
- package/src/sass/components/_menu.scss +2 -2
- package/src/sass/components/_navigation-rail.scss +1 -1
- package/src/sass/components/_panes.scss +50 -78
- package/src/sass/components/_progress.scss +73 -13
- package/src/sass/components/_scrim.scss +4 -4
- package/src/sass/components/_side-sheet.scss +22 -12
- package/src/sass/components/_toolbar.scss +1 -4
- package/src/sass/components/_tooltip.scss +20 -2
- package/src/sass/components/forms/_input-fields.scss +5 -1
- package/src/sass/components/forms/_select.scss +1 -0
- package/src/sass/components/forms/_slider.scss +81 -25
- package/src/sass/custom.scss +38 -0
- package/dist/types/components/navigationDrawer.d.ts +0 -110
- package/src/sass/components/_banners.scss +0 -298
- package/src/sass/components/_bottom-app-bar.scss +0 -180
- package/src/sass/components/_floating-sheet.scss +0 -86
- package/src/sass/components/_navigation-drawer.scss +0 -476
- package/src/sass/components/_segmented-buttons.scss +0 -188
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Component
|
|
3
|
+
} from "./chunk-QSQ24FYT.mjs";
|
|
4
|
+
|
|
5
|
+
// src/ts/components/appBar.ts
|
|
6
|
+
var _defaults = {};
|
|
7
|
+
var AppBar = class _AppBar extends Component {
|
|
8
|
+
constructor(el, options) {
|
|
9
|
+
super(el, options, _AppBar);
|
|
10
|
+
this._observer = null;
|
|
11
|
+
this._sentinel = null;
|
|
12
|
+
this._input = null;
|
|
13
|
+
this._view = null;
|
|
14
|
+
this._searchOpen = false;
|
|
15
|
+
this._onIntersect = (entries) => {
|
|
16
|
+
const entry = entries[0];
|
|
17
|
+
if (!entry) return;
|
|
18
|
+
this.el.classList.toggle("collapsed", !entry.isIntersecting);
|
|
19
|
+
};
|
|
20
|
+
this._onSearchViewClose = () => {
|
|
21
|
+
this._searchOpen = this._view.open;
|
|
22
|
+
};
|
|
23
|
+
this._onSearchFocus = () => {
|
|
24
|
+
if (!this._view || this._searchOpen) return;
|
|
25
|
+
if (this._view instanceof HTMLDialogElement) {
|
|
26
|
+
this._searchOpen = true;
|
|
27
|
+
if (!this._view.open) this._view.showModal();
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
this._view.hidden = false;
|
|
31
|
+
this._input?.setAttribute("aria-expanded", "true");
|
|
32
|
+
};
|
|
33
|
+
this.el["Expressive_AppBar"] = this;
|
|
34
|
+
this.options = { ..._AppBar.defaults, ...options };
|
|
35
|
+
this._setupCollapse();
|
|
36
|
+
this._setupSearch();
|
|
37
|
+
}
|
|
38
|
+
static get defaults() {
|
|
39
|
+
return _defaults;
|
|
40
|
+
}
|
|
41
|
+
static init(els, options = {}) {
|
|
42
|
+
return super.init(els, options, _AppBar);
|
|
43
|
+
}
|
|
44
|
+
static getInstance(el) {
|
|
45
|
+
return el["Expressive_AppBar"];
|
|
46
|
+
}
|
|
47
|
+
destroy() {
|
|
48
|
+
this._observer?.disconnect();
|
|
49
|
+
this._observer = null;
|
|
50
|
+
this._sentinel?.remove();
|
|
51
|
+
this._sentinel = null;
|
|
52
|
+
this._input?.removeEventListener("focus", this._onSearchFocus);
|
|
53
|
+
this._input?.removeEventListener("click", this._onSearchFocus);
|
|
54
|
+
this._view?.removeEventListener("close", this._onSearchViewClose);
|
|
55
|
+
this.el.classList.remove("collapsed");
|
|
56
|
+
this.el["Expressive_AppBar"] = void 0;
|
|
57
|
+
}
|
|
58
|
+
_setupCollapse() {
|
|
59
|
+
if (!this.el.classList.contains("medium") && !this.el.classList.contains("large")) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (typeof IntersectionObserver === "undefined") return;
|
|
63
|
+
this._sentinel = document.createElement("span");
|
|
64
|
+
this._sentinel.setAttribute("aria-hidden", "true");
|
|
65
|
+
this._sentinel.style.cssText = "display:block;width:100%;height:1px;margin-top:-1px;pointer-events:none;visibility:hidden";
|
|
66
|
+
this.el.insertAdjacentElement("beforebegin", this._sentinel);
|
|
67
|
+
this._observer = new IntersectionObserver(this._onIntersect);
|
|
68
|
+
this._observer.observe(this._sentinel);
|
|
69
|
+
}
|
|
70
|
+
_setupSearch() {
|
|
71
|
+
this._input = this.el.querySelector('input[type="search"]');
|
|
72
|
+
if (!this._input) return;
|
|
73
|
+
const id = this._input.getAttribute("aria-controls");
|
|
74
|
+
if (id) this._view = document.getElementById(id);
|
|
75
|
+
if (!this._view) this._view = this.el.querySelector(".search-view");
|
|
76
|
+
if (!this._view) return;
|
|
77
|
+
this._input.addEventListener("focus", this._onSearchFocus);
|
|
78
|
+
this._input.addEventListener("click", this._onSearchFocus);
|
|
79
|
+
if (this._view instanceof HTMLDialogElement) {
|
|
80
|
+
this._view.addEventListener("close", this._onSearchViewClose);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export {
|
|
86
|
+
AppBar
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=chunk-EP3CVKB5.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/appBar.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nconst _defaults: BaseOptions = {};\n\n/**\n * Collapse medium/large flexible app bars on scroll, and open the related\n * search view when the search field in a search app bar is selected.\n *\n * Observation is IntersectionObserver on a 1px sentinel ahead of the header.\n * A scroll listener would re-enter layout on every tick; this does not.\n */\nexport class AppBar extends Component<BaseOptions> {\n private _observer: IntersectionObserver | null = null;\n private _sentinel: HTMLElement | null = null;\n private _input: HTMLInputElement | null = null;\n private _view: HTMLElement | null = null;\n private _searchOpen = false;\n\n constructor(el: HTMLElement, options: Partial<BaseOptions>) {\n super(el, options, AppBar);\n this.el['Expressive_AppBar'] = this;\n this.options = { ...AppBar.defaults, ...options };\n this._setupCollapse();\n this._setupSearch();\n }\n\n static get defaults(): BaseOptions {\n return _defaults;\n }\n\n static init(el: HTMLElement, options?: Partial<BaseOptions>): AppBar;\n static init(els: InitElements<InitElement>, options?: Partial<BaseOptions>): AppBar[];\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<BaseOptions> = {}\n ): AppBar | AppBar[] {\n return super.init(els, options, AppBar);\n }\n\n static getInstance(el: HTMLElement): AppBar {\n return el['Expressive_AppBar'];\n }\n\n destroy() {\n this._observer?.disconnect();\n this._observer = null;\n this._sentinel?.remove();\n this._sentinel = null;\n this._input?.removeEventListener('focus', this._onSearchFocus);\n this._input?.removeEventListener('click', this._onSearchFocus);\n this._view?.removeEventListener('close', this._onSearchViewClose);\n this.el.classList.remove('collapsed');\n this.el['Expressive_AppBar'] = undefined;\n }\n\n private _setupCollapse() {\n if (!this.el.classList.contains('medium') && !this.el.classList.contains('large')) {\n return;\n }\n if (typeof IntersectionObserver === 'undefined') return;\n\n this._sentinel = document.createElement('span');\n this._sentinel.setAttribute('aria-hidden', 'true');\n this._sentinel.style.cssText =\n 'display:block;width:100%;height:1px;margin-top:-1px;pointer-events:none;visibility:hidden';\n this.el.insertAdjacentElement('beforebegin', this._sentinel);\n this._observer = new IntersectionObserver(this._onIntersect);\n this._observer.observe(this._sentinel);\n }\n\n private _onIntersect = (entries: IntersectionObserverEntry[]) => {\n const entry = entries[0];\n if (!entry) return;\n this.el.classList.toggle('collapsed', !entry.isIntersecting);\n };\n\n private _setupSearch() {\n this._input = this.el.querySelector('input[type=\"search\"]');\n if (!this._input) return;\n\n const id = this._input.getAttribute('aria-controls');\n if (id) this._view = document.getElementById(id);\n if (!this._view) this._view = this.el.querySelector('.search-view');\n if (!this._view) return;\n\n this._input.addEventListener('focus', this._onSearchFocus);\n this._input.addEventListener('click', this._onSearchFocus);\n if (this._view instanceof HTMLDialogElement) {\n this._view.addEventListener('close', this._onSearchViewClose);\n }\n }\n\n private _onSearchViewClose = () => {\n this._searchOpen = (this._view as HTMLDialogElement).open;\n };\n\n private _onSearchFocus = () => {\n if (!this._view || this._searchOpen) return;\n if (this._view instanceof HTMLDialogElement) {\n this._searchOpen = true;\n if (!this._view.open) this._view.showModal();\n return;\n }\n this._view.hidden = false;\n this._input?.setAttribute('aria-expanded', 'true');\n };\n}\n"],
|
|
5
|
+
"mappings": ";;;;;AAEA,IAAM,YAAyB,CAAC;AASzB,IAAM,SAAN,MAAM,gBAAe,UAAuB;AAAA,EAOjD,YAAY,IAAiB,SAA+B;AAC1D,UAAM,IAAI,SAAS,OAAM;AAP3B,SAAQ,YAAyC;AACjD,SAAQ,YAAgC;AACxC,SAAQ,SAAkC;AAC1C,SAAQ,QAA4B;AACpC,SAAQ,cAAc;AAsDtB,SAAQ,eAAe,CAAC,YAAyC;AAC/D,YAAM,QAAQ,QAAQ,CAAC;AACvB,UAAI,CAAC,MAAO;AACZ,WAAK,GAAG,UAAU,OAAO,aAAa,CAAC,MAAM,cAAc;AAAA,IAC7D;AAkBA,SAAQ,qBAAqB,MAAM;AACjC,WAAK,cAAe,KAAK,MAA4B;AAAA,IACvD;AAEA,SAAQ,iBAAiB,MAAM;AAC7B,UAAI,CAAC,KAAK,SAAS,KAAK,YAAa;AACrC,UAAI,KAAK,iBAAiB,mBAAmB;AAC3C,aAAK,cAAc;AACnB,YAAI,CAAC,KAAK,MAAM,KAAM,MAAK,MAAM,UAAU;AAC3C;AAAA,MACF;AACA,WAAK,MAAM,SAAS;AACpB,WAAK,QAAQ,aAAa,iBAAiB,MAAM;AAAA,IACnD;AArFE,SAAK,GAAG,mBAAmB,IAAI;AAC/B,SAAK,UAAU,EAAE,GAAG,QAAO,UAAU,GAAG,QAAQ;AAChD,SAAK,eAAe;AACpB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,WAAW,WAAwB;AACjC,WAAO;AAAA,EACT;AAAA,EAIA,OAAO,KACL,KACA,UAAgC,CAAC,GACd;AACnB,WAAO,MAAM,KAAK,KAAK,SAAS,OAAM;AAAA,EACxC;AAAA,EAEA,OAAO,YAAY,IAAyB;AAC1C,WAAO,GAAG,mBAAmB;AAAA,EAC/B;AAAA,EAEA,UAAU;AACR,SAAK,WAAW,WAAW;AAC3B,SAAK,YAAY;AACjB,SAAK,WAAW,OAAO;AACvB,SAAK,YAAY;AACjB,SAAK,QAAQ,oBAAoB,SAAS,KAAK,cAAc;AAC7D,SAAK,QAAQ,oBAAoB,SAAS,KAAK,cAAc;AAC7D,SAAK,OAAO,oBAAoB,SAAS,KAAK,kBAAkB;AAChE,SAAK,GAAG,UAAU,OAAO,WAAW;AACpC,SAAK,GAAG,mBAAmB,IAAI;AAAA,EACjC;AAAA,EAEQ,iBAAiB;AACvB,QAAI,CAAC,KAAK,GAAG,UAAU,SAAS,QAAQ,KAAK,CAAC,KAAK,GAAG,UAAU,SAAS,OAAO,GAAG;AACjF;AAAA,IACF;AACA,QAAI,OAAO,yBAAyB,YAAa;AAEjD,SAAK,YAAY,SAAS,cAAc,MAAM;AAC9C,SAAK,UAAU,aAAa,eAAe,MAAM;AACjD,SAAK,UAAU,MAAM,UACnB;AACF,SAAK,GAAG,sBAAsB,eAAe,KAAK,SAAS;AAC3D,SAAK,YAAY,IAAI,qBAAqB,KAAK,YAAY;AAC3D,SAAK,UAAU,QAAQ,KAAK,SAAS;AAAA,EACvC;AAAA,EAQQ,eAAe;AACrB,SAAK,SAAS,KAAK,GAAG,cAAc,sBAAsB;AAC1D,QAAI,CAAC,KAAK,OAAQ;AAElB,UAAM,KAAK,KAAK,OAAO,aAAa,eAAe;AACnD,QAAI,GAAI,MAAK,QAAQ,SAAS,eAAe,EAAE;AAC/C,QAAI,CAAC,KAAK,MAAO,MAAK,QAAQ,KAAK,GAAG,cAAc,cAAc;AAClE,QAAI,CAAC,KAAK,MAAO;AAEjB,SAAK,OAAO,iBAAiB,SAAS,KAAK,cAAc;AACzD,SAAK,OAAO,iBAAiB,SAAS,KAAK,cAAc;AACzD,QAAI,KAAK,iBAAiB,mBAAmB;AAC3C,WAAK,MAAM,iBAAiB,SAAS,KAAK,kBAAkB;AAAA,IAC9D;AAAA,EACF;AAgBF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Menu
|
|
3
|
+
} from "./chunk-TK6PX2GC.mjs";
|
|
4
|
+
import {
|
|
5
|
+
Utils
|
|
6
|
+
} from "./chunk-MISGHDUU.mjs";
|
|
7
|
+
import {
|
|
8
|
+
Component
|
|
9
|
+
} from "./chunk-QSQ24FYT.mjs";
|
|
10
|
+
|
|
11
|
+
// src/ts/components/select.ts
|
|
12
|
+
var _defaults = {
|
|
13
|
+
classes: "",
|
|
14
|
+
menuOptions: {}
|
|
15
|
+
};
|
|
16
|
+
var FormSelect = class _FormSelect extends Component {
|
|
17
|
+
constructor(el, options) {
|
|
18
|
+
super(el, options, _FormSelect);
|
|
19
|
+
this._handleSelectChange = () => {
|
|
20
|
+
this._setValueToInput();
|
|
21
|
+
this._setSelectedStates();
|
|
22
|
+
};
|
|
23
|
+
this._handleReset = (e) => {
|
|
24
|
+
clearTimeout(this._resetTimer);
|
|
25
|
+
this._resetTimer = setTimeout(() => {
|
|
26
|
+
if (!e.defaultPrevented) this._handleSelectChange();
|
|
27
|
+
}, 0);
|
|
28
|
+
};
|
|
29
|
+
// Named rather than inline so that _removeEventHandlers can actually detach
|
|
30
|
+
// it - an anonymous listener per option was unremovable.
|
|
31
|
+
this._handleOptionKeydown = (e) => {
|
|
32
|
+
if (e.key === " " || e.key === "Enter") this._handleOptionClick(e);
|
|
33
|
+
};
|
|
34
|
+
this._handleOptionClick = (e) => {
|
|
35
|
+
e.preventDefault();
|
|
36
|
+
const virtualOption = e.target.closest("li");
|
|
37
|
+
this._selectOptionElement(virtualOption);
|
|
38
|
+
e.stopPropagation();
|
|
39
|
+
};
|
|
40
|
+
this._handleOptionFocus = (e) => {
|
|
41
|
+
const target = e.target;
|
|
42
|
+
if (!(target instanceof Element)) return;
|
|
43
|
+
const li = target.closest('li[role="option"]');
|
|
44
|
+
if (li?.id) this.input.setAttribute("aria-activedescendant", li.id);
|
|
45
|
+
};
|
|
46
|
+
this._handleInputClick = () => {
|
|
47
|
+
if (this.menu && this.menu.isOpen) {
|
|
48
|
+
this._setValueToInput();
|
|
49
|
+
this._setSelectedStates();
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
if (this.el.classList.contains("browser-default")) return;
|
|
53
|
+
this.el["Expressive_FormSelect"] = this;
|
|
54
|
+
this.options = {
|
|
55
|
+
..._FormSelect.defaults,
|
|
56
|
+
...options
|
|
57
|
+
};
|
|
58
|
+
this.isMultiple = this.el.multiple;
|
|
59
|
+
this.nativeTabIndex = this.el.tabIndex ?? -1;
|
|
60
|
+
this.el.tabIndex = -1;
|
|
61
|
+
this._values = [];
|
|
62
|
+
this._createdWrapper = false;
|
|
63
|
+
this._originalLabelFor = null;
|
|
64
|
+
this._setupMenu();
|
|
65
|
+
this._setupEventHandlers();
|
|
66
|
+
}
|
|
67
|
+
static get defaults() {
|
|
68
|
+
return _defaults;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Initializes instances of FormSelect.
|
|
72
|
+
* @param els HTML elements.
|
|
73
|
+
* @param options Component options.
|
|
74
|
+
*/
|
|
75
|
+
static init(els, options = {}) {
|
|
76
|
+
return super.init(els, options, _FormSelect);
|
|
77
|
+
}
|
|
78
|
+
static getInstance(el) {
|
|
79
|
+
return el["Expressive_FormSelect"];
|
|
80
|
+
}
|
|
81
|
+
destroy() {
|
|
82
|
+
this._removeEventHandlers();
|
|
83
|
+
this.menu?.destroy();
|
|
84
|
+
this._removeMenu();
|
|
85
|
+
this.el.tabIndex = this.nativeTabIndex;
|
|
86
|
+
this.el["Expressive_FormSelect"] = void 0;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Re-read the native `<select>` and update the generated menu to match.
|
|
90
|
+
*
|
|
91
|
+
* Assigning `select.value` from script fires no `change` event, so nothing
|
|
92
|
+
* else syncs the visible input text or the `.selected` state on the virtual
|
|
93
|
+
* options. Adding or removing `<option>`s also requires this — the menu is
|
|
94
|
+
* rebuilt from the native list, the field and Menu instance stay put.
|
|
95
|
+
*/
|
|
96
|
+
refresh() {
|
|
97
|
+
if (!this.menuEl) return;
|
|
98
|
+
this._bindForm();
|
|
99
|
+
const root = this.menuEl.getRootNode();
|
|
100
|
+
const focused = this._values.find((value) => value.optionEl.contains(root.activeElement))?.el;
|
|
101
|
+
this.input.disabled = this.el.matches(":disabled");
|
|
102
|
+
this.wrapper.classList.toggle("disabled", this.input.disabled);
|
|
103
|
+
if (this.input.disabled) this.menu?.close();
|
|
104
|
+
else if (!this.menu) this._initMenu();
|
|
105
|
+
this.input.removeAttribute("aria-activedescendant");
|
|
106
|
+
this._rebuildOptions();
|
|
107
|
+
this._handleSelectChange();
|
|
108
|
+
if (this.menu) this.menu.focusedIndex = -1;
|
|
109
|
+
if (this.menu?.isOpen) {
|
|
110
|
+
this.menu.recalculateDimensions();
|
|
111
|
+
if (focused) (this._values.find((value) => value.el === focused)?.optionEl ?? this.input).focus();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
_setupEventHandlers() {
|
|
115
|
+
this._setupOptionHandlers();
|
|
116
|
+
this.el.addEventListener("change", this._handleSelectChange);
|
|
117
|
+
this.input.addEventListener("click", this._handleInputClick);
|
|
118
|
+
this.menuEl.addEventListener("focusin", this._handleOptionFocus);
|
|
119
|
+
this._bindForm();
|
|
120
|
+
}
|
|
121
|
+
_bindForm() {
|
|
122
|
+
this._form?.removeEventListener("reset", this._handleReset);
|
|
123
|
+
this._form = this.el.form;
|
|
124
|
+
this._form?.addEventListener("reset", this._handleReset);
|
|
125
|
+
}
|
|
126
|
+
_removeEventHandlers() {
|
|
127
|
+
this._removeOptionHandlers();
|
|
128
|
+
this.el.removeEventListener("change", this._handleSelectChange);
|
|
129
|
+
this.input?.removeEventListener("click", this._handleInputClick);
|
|
130
|
+
this.menuEl?.removeEventListener("focusin", this._handleOptionFocus);
|
|
131
|
+
this._form?.removeEventListener("reset", this._handleReset);
|
|
132
|
+
clearTimeout(this._resetTimer);
|
|
133
|
+
}
|
|
134
|
+
_setupOptionHandlers() {
|
|
135
|
+
this.menuEl.querySelectorAll("li:not(.optgroup)").forEach((el) => {
|
|
136
|
+
el.addEventListener("click", this._handleOptionClick);
|
|
137
|
+
el.addEventListener("keydown", this._handleOptionKeydown);
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
_removeOptionHandlers() {
|
|
141
|
+
this.menuEl?.querySelectorAll("li:not(.optgroup)").forEach((el) => {
|
|
142
|
+
el.removeEventListener("click", this._handleOptionClick);
|
|
143
|
+
el.removeEventListener("keydown", this._handleOptionKeydown);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
_arraysEqual(a, b) {
|
|
147
|
+
if (a === b) return true;
|
|
148
|
+
if (a == null || b == null) return false;
|
|
149
|
+
if (a.length !== b.length) return false;
|
|
150
|
+
for (let i = 0; i < a.length; ++i) if (a[i] !== b[i]) return false;
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
_selectOptionElement(virtualOption) {
|
|
154
|
+
if (this.el.matches(":disabled")) return;
|
|
155
|
+
if (!virtualOption.classList.contains("disabled") && !virtualOption.classList.contains("optgroup")) {
|
|
156
|
+
const value = this._values.find((value2) => value2.optionEl === virtualOption);
|
|
157
|
+
if (!value || value.el.matches(":disabled")) return;
|
|
158
|
+
const previousSelectedValues = this.getSelectedValues();
|
|
159
|
+
if (this.isMultiple) {
|
|
160
|
+
this._toggleEntryFromArray(value);
|
|
161
|
+
} else {
|
|
162
|
+
this._deselectAll();
|
|
163
|
+
this._selectValue(value);
|
|
164
|
+
}
|
|
165
|
+
this._handleSelectChange();
|
|
166
|
+
const actualSelectedValues = this.getSelectedValues();
|
|
167
|
+
const selectionHasChanged = !this._arraysEqual(previousSelectedValues, actualSelectedValues);
|
|
168
|
+
if (selectionHasChanged)
|
|
169
|
+
this.el.dispatchEvent(
|
|
170
|
+
new Event("change", { bubbles: true, cancelable: true, composed: true })
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
if (!this.isMultiple) this.menu?.close();
|
|
174
|
+
}
|
|
175
|
+
_setupMenu() {
|
|
176
|
+
this.labelEl = this.el.labels?.[0] ?? null;
|
|
177
|
+
this._setupWrapper();
|
|
178
|
+
this._hideNativeSelect();
|
|
179
|
+
if (this.el.matches(":disabled")) this.wrapper.classList.add("disabled");
|
|
180
|
+
this.menuEl = document.createElement("menu");
|
|
181
|
+
this.menuEl.id = `select-options-${Utils.guid()}`;
|
|
182
|
+
this.menuEl.setAttribute("popover", "auto");
|
|
183
|
+
this.menuEl.setAttribute("role", "listbox");
|
|
184
|
+
this.menuEl.ariaMultiSelectable = this.isMultiple.toString();
|
|
185
|
+
if (this.isMultiple) this.menuEl.classList.add("multiple-select-menu");
|
|
186
|
+
this._buildOptions();
|
|
187
|
+
this.wrapper.append(this.menuEl);
|
|
188
|
+
this._buildInput();
|
|
189
|
+
this._buildCaret();
|
|
190
|
+
this._initMenu();
|
|
191
|
+
this._setSelectedStates();
|
|
192
|
+
if (this.labelEl) this.input.after(this.labelEl);
|
|
193
|
+
}
|
|
194
|
+
_setupWrapper() {
|
|
195
|
+
const parent = this.el.parentElement;
|
|
196
|
+
const reuse = parent && parent.matches(".field") && !parent.querySelector(":scope > .hide-select") && !parent.querySelector(":scope > input, :scope > textarea");
|
|
197
|
+
if (reuse) {
|
|
198
|
+
this.wrapper = parent;
|
|
199
|
+
this._createdWrapper = false;
|
|
200
|
+
} else {
|
|
201
|
+
this.wrapper = document.createElement("div");
|
|
202
|
+
this.wrapper.classList.add("field");
|
|
203
|
+
this._createdWrapper = true;
|
|
204
|
+
this.el.before(this.wrapper);
|
|
205
|
+
}
|
|
206
|
+
if (this.options.classes.length > 0) {
|
|
207
|
+
this.wrapper.classList.add(...this.options.classes.split(" ").filter(Boolean));
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
_hideNativeSelect() {
|
|
211
|
+
const hiddenDiv = document.createElement("div");
|
|
212
|
+
hiddenDiv.classList.add("hide-select");
|
|
213
|
+
this.el.before(hiddenDiv);
|
|
214
|
+
hiddenDiv.appendChild(this.el);
|
|
215
|
+
this.wrapper.append(hiddenDiv);
|
|
216
|
+
}
|
|
217
|
+
_buildInput() {
|
|
218
|
+
this.input = document.createElement("input");
|
|
219
|
+
this.input.id = "select-input-" + Utils.guid();
|
|
220
|
+
this.input.classList.add("menu-trigger", "no-autoinit");
|
|
221
|
+
this.input.type = "text";
|
|
222
|
+
this.input.readOnly = true;
|
|
223
|
+
this.input.setAttribute("data-target", this.menuEl.id);
|
|
224
|
+
this.input.ariaReadOnly = "true";
|
|
225
|
+
this.input.ariaRequired = this.el.hasAttribute("required").toString();
|
|
226
|
+
this.input.disabled = this.el.matches(":disabled");
|
|
227
|
+
this.input.setAttribute("tabindex", this.nativeTabIndex.toString());
|
|
228
|
+
const attrs = this.el.attributes;
|
|
229
|
+
for (let i = 0; i < attrs.length; ++i) {
|
|
230
|
+
const attr = attrs[i];
|
|
231
|
+
if (attr.name.startsWith("aria-")) this.input.setAttribute(attr.name, attr.value);
|
|
232
|
+
}
|
|
233
|
+
this.input.setAttribute("role", "combobox");
|
|
234
|
+
this.input.setAttribute("aria-haspopup", "listbox");
|
|
235
|
+
this.input.ariaExpanded = "false";
|
|
236
|
+
this.input.setAttribute("aria-controls", this.menuEl.id);
|
|
237
|
+
this.input.placeholder = " ";
|
|
238
|
+
if (this.labelEl) {
|
|
239
|
+
this._originalLabelFor = this.labelEl.htmlFor;
|
|
240
|
+
this.labelEl.htmlFor = this.input.id;
|
|
241
|
+
}
|
|
242
|
+
this.wrapper.prepend(this.input);
|
|
243
|
+
this._setValueToInput();
|
|
244
|
+
}
|
|
245
|
+
_buildCaret() {
|
|
246
|
+
const caret = document.createElement("span");
|
|
247
|
+
caret.classList.add("caret");
|
|
248
|
+
caret.setAttribute("aria-hidden", "true");
|
|
249
|
+
this.wrapper.prepend(caret);
|
|
250
|
+
}
|
|
251
|
+
_initMenu() {
|
|
252
|
+
if (this.el.matches(":disabled")) return;
|
|
253
|
+
const menuOptions = { ...this.options.menuOptions };
|
|
254
|
+
menuOptions.coverTrigger = false;
|
|
255
|
+
const userOnOpenEnd = menuOptions.onOpenEnd;
|
|
256
|
+
const userOnCloseEnd = menuOptions.onCloseEnd;
|
|
257
|
+
menuOptions.onOpenEnd = () => {
|
|
258
|
+
const selectedOption = this.menuEl.querySelector(".selected");
|
|
259
|
+
if (selectedOption) {
|
|
260
|
+
this.menu.focusedIndex = [...selectedOption.parentNode.children].indexOf(selectedOption);
|
|
261
|
+
this.menu._focusFocusedItem();
|
|
262
|
+
if (this.menu.isScrollable) {
|
|
263
|
+
let scrollOffset = selectedOption.getBoundingClientRect().top - this.menuEl.getBoundingClientRect().top;
|
|
264
|
+
scrollOffset -= this.menuEl.clientHeight / 2;
|
|
265
|
+
this.menuEl.scrollTop = scrollOffset;
|
|
266
|
+
}
|
|
267
|
+
if (selectedOption.id) this.input.setAttribute("aria-activedescendant", selectedOption.id);
|
|
268
|
+
}
|
|
269
|
+
this.input.ariaExpanded = "true";
|
|
270
|
+
if (userOnOpenEnd && typeof userOnOpenEnd === "function")
|
|
271
|
+
userOnOpenEnd.call(this.menu, this.el);
|
|
272
|
+
};
|
|
273
|
+
menuOptions.onCloseEnd = () => {
|
|
274
|
+
this.input.ariaExpanded = "false";
|
|
275
|
+
this.input.removeAttribute("aria-activedescendant");
|
|
276
|
+
if (userOnCloseEnd && typeof userOnCloseEnd === "function")
|
|
277
|
+
userOnCloseEnd.call(this.menu, this.el);
|
|
278
|
+
};
|
|
279
|
+
menuOptions.closeOnClick = false;
|
|
280
|
+
this.menu = Menu.init(this.input, menuOptions);
|
|
281
|
+
}
|
|
282
|
+
_nativeOptions() {
|
|
283
|
+
return Array.from(this.el.children).filter((el) => ["OPTION", "OPTGROUP"].includes(el.tagName));
|
|
284
|
+
}
|
|
285
|
+
_buildOptions() {
|
|
286
|
+
this.selectOptions = this._nativeOptions();
|
|
287
|
+
this._values = [];
|
|
288
|
+
this.selectOptions.forEach((realOption) => {
|
|
289
|
+
if (realOption.tagName === "OPTION") {
|
|
290
|
+
const virtualOption = this._createAndAppendOptionWithIcon(
|
|
291
|
+
realOption,
|
|
292
|
+
this.isMultiple ? "multiple" : void 0
|
|
293
|
+
);
|
|
294
|
+
this._addOptionToValues(realOption, virtualOption);
|
|
295
|
+
} else if (realOption.tagName === "OPTGROUP") {
|
|
296
|
+
const groupId = "opt-group-" + Utils.guid();
|
|
297
|
+
const groupParent = document.createElement("li");
|
|
298
|
+
groupParent.classList.add("optgroup");
|
|
299
|
+
groupParent.tabIndex = -1;
|
|
300
|
+
groupParent.setAttribute("role", "group");
|
|
301
|
+
groupParent.setAttribute("aria-labelledby", groupId);
|
|
302
|
+
const groupLabel = document.createElement("span");
|
|
303
|
+
groupLabel.id = groupId;
|
|
304
|
+
groupLabel.setAttribute("role", "presentation");
|
|
305
|
+
groupLabel.textContent = realOption.getAttribute("label") ?? "";
|
|
306
|
+
groupParent.replaceChildren(groupLabel);
|
|
307
|
+
this.menuEl.append(groupParent);
|
|
308
|
+
const groupChildren = [];
|
|
309
|
+
const selectOptions = Array.from(realOption.children).filter((el) => el.tagName === "OPTION");
|
|
310
|
+
selectOptions.forEach((child) => {
|
|
311
|
+
const virtualOption = this._createAndAppendOptionWithIcon(child, "optgroup-option");
|
|
312
|
+
groupChildren.push(virtualOption.id);
|
|
313
|
+
this._addOptionToValues(child, virtualOption);
|
|
314
|
+
});
|
|
315
|
+
groupParent.setAttribute("aria-owns", groupChildren.join(" "));
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
_rebuildOptions() {
|
|
320
|
+
this._removeOptionHandlers();
|
|
321
|
+
this.menuEl.replaceChildren();
|
|
322
|
+
this._buildOptions();
|
|
323
|
+
this._setupOptionHandlers();
|
|
324
|
+
this.menu?._makeMenuFocusable();
|
|
325
|
+
}
|
|
326
|
+
_addOptionToValues(realOption, virtualOption) {
|
|
327
|
+
this._values.push({ el: realOption, optionEl: virtualOption });
|
|
328
|
+
}
|
|
329
|
+
_removeMenu() {
|
|
330
|
+
this.wrapper?.querySelector(":scope > .caret")?.remove();
|
|
331
|
+
this.input?.remove();
|
|
332
|
+
this.menuEl?.remove();
|
|
333
|
+
const hide = this.el.parentElement;
|
|
334
|
+
if (hide?.classList.contains("hide-select")) hide.replaceWith(this.el);
|
|
335
|
+
if (this.labelEl && this._originalLabelFor !== null) {
|
|
336
|
+
this.labelEl.htmlFor = this._originalLabelFor;
|
|
337
|
+
}
|
|
338
|
+
if (!this.wrapper) return;
|
|
339
|
+
if (this._createdWrapper) {
|
|
340
|
+
this.wrapper.replaceWith(this.el);
|
|
341
|
+
} else {
|
|
342
|
+
this.wrapper.classList.remove("disabled");
|
|
343
|
+
if (this.options.classes.length > 0) {
|
|
344
|
+
this.wrapper.classList.remove(...this.options.classes.split(" ").filter(Boolean));
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
_createAndAppendOptionWithIcon(realOption, type) {
|
|
349
|
+
const li = document.createElement("li");
|
|
350
|
+
li.id = "select-option-" + Utils.guid();
|
|
351
|
+
li.setAttribute("role", "option");
|
|
352
|
+
li.tabIndex = 0;
|
|
353
|
+
const disabled = this.el.matches(":disabled") || realOption.matches(":disabled");
|
|
354
|
+
if (disabled) {
|
|
355
|
+
li.classList.add("disabled");
|
|
356
|
+
li.ariaDisabled = "true";
|
|
357
|
+
li.tabIndex = -1;
|
|
358
|
+
}
|
|
359
|
+
if (type === "optgroup-option") li.classList.add(type);
|
|
360
|
+
const optionText = realOption.textContent;
|
|
361
|
+
const span = document.createElement("span");
|
|
362
|
+
if (this.isMultiple && !disabled) {
|
|
363
|
+
const label = document.createElement("label");
|
|
364
|
+
const checkbox = document.createElement("input");
|
|
365
|
+
checkbox.type = "checkbox";
|
|
366
|
+
checkbox.tabIndex = -1;
|
|
367
|
+
const labelText = document.createElement("span");
|
|
368
|
+
labelText.textContent = optionText;
|
|
369
|
+
label.append(checkbox, labelText);
|
|
370
|
+
span.appendChild(label);
|
|
371
|
+
} else {
|
|
372
|
+
span.textContent = optionText;
|
|
373
|
+
}
|
|
374
|
+
li.appendChild(span);
|
|
375
|
+
const iconUrl = realOption.getAttribute("data-icon");
|
|
376
|
+
let imageUrl;
|
|
377
|
+
if (iconUrl) {
|
|
378
|
+
try {
|
|
379
|
+
const url = new URL(iconUrl, this.el.ownerDocument.baseURI);
|
|
380
|
+
if (["http:", "https:", "blob:"].includes(url.protocol) || /^data:image\/(?:avif|bmp|gif|jpeg|png|svg\+xml|webp|x-icon)(?:;|,)/i.test(url.href)) {
|
|
381
|
+
imageUrl = url;
|
|
382
|
+
}
|
|
383
|
+
} catch {
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
const classes = realOption.getAttribute("class")?.split(" ").filter(Boolean);
|
|
387
|
+
if (imageUrl) {
|
|
388
|
+
const img = document.createElement("img");
|
|
389
|
+
if (classes?.length) img.classList.add(...classes);
|
|
390
|
+
img.src = imageUrl.href;
|
|
391
|
+
img.ariaHidden = "true";
|
|
392
|
+
li.prepend(img);
|
|
393
|
+
}
|
|
394
|
+
this.menuEl.append(li);
|
|
395
|
+
return li;
|
|
396
|
+
}
|
|
397
|
+
_selectValue(value) {
|
|
398
|
+
value.el.selected = true;
|
|
399
|
+
value.optionEl.classList.add("selected");
|
|
400
|
+
value.optionEl.ariaSelected = "true";
|
|
401
|
+
const checkbox = value.optionEl.querySelector('input[type="checkbox"]');
|
|
402
|
+
if (checkbox) checkbox.checked = true;
|
|
403
|
+
}
|
|
404
|
+
_deselectValue(value) {
|
|
405
|
+
value.el.selected = false;
|
|
406
|
+
value.optionEl.classList.remove("selected");
|
|
407
|
+
value.optionEl.ariaSelected = "false";
|
|
408
|
+
const checkbox = value.optionEl.querySelector('input[type="checkbox"]');
|
|
409
|
+
if (checkbox) checkbox.checked = false;
|
|
410
|
+
}
|
|
411
|
+
_deselectAll() {
|
|
412
|
+
this._values.forEach((value) => this._deselectValue(value));
|
|
413
|
+
}
|
|
414
|
+
_isValueSelected(value) {
|
|
415
|
+
const realValues = this.getSelectedValues();
|
|
416
|
+
return realValues.some((realValue) => realValue === value.el.value);
|
|
417
|
+
}
|
|
418
|
+
_toggleEntryFromArray(value) {
|
|
419
|
+
if (this._isValueSelected(value)) this._deselectValue(value);
|
|
420
|
+
else this._selectValue(value);
|
|
421
|
+
}
|
|
422
|
+
_getSelectedOptions() {
|
|
423
|
+
return Array.prototype.filter.call(
|
|
424
|
+
this.el.selectedOptions,
|
|
425
|
+
(realOption) => realOption
|
|
426
|
+
);
|
|
427
|
+
}
|
|
428
|
+
_setValueToInput() {
|
|
429
|
+
this.input.value = this._getSelectedOptions().map((option) => option.textContent.trim()).join(", ");
|
|
430
|
+
}
|
|
431
|
+
_setSelectedStates() {
|
|
432
|
+
this._values.forEach((value) => {
|
|
433
|
+
const optionIsSelected = value.el.selected;
|
|
434
|
+
const cb = value.optionEl.querySelector('input[type="checkbox"]');
|
|
435
|
+
if (cb) cb.checked = optionIsSelected;
|
|
436
|
+
if (optionIsSelected) {
|
|
437
|
+
this._activateOption(this.menuEl, value.optionEl);
|
|
438
|
+
} else {
|
|
439
|
+
value.optionEl.classList.remove("selected");
|
|
440
|
+
value.optionEl.ariaSelected = "false";
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
_activateOption(ul, li) {
|
|
445
|
+
if (!li) return;
|
|
446
|
+
if (!this.isMultiple)
|
|
447
|
+
ul.querySelectorAll("li.selected").forEach((row) => row.classList.remove("selected"));
|
|
448
|
+
li.classList.add("selected");
|
|
449
|
+
li.ariaSelected = "true";
|
|
450
|
+
}
|
|
451
|
+
getSelectedValues() {
|
|
452
|
+
return this._getSelectedOptions().map((realOption) => realOption.value);
|
|
453
|
+
}
|
|
454
|
+
};
|
|
455
|
+
|
|
456
|
+
export {
|
|
457
|
+
FormSelect
|
|
458
|
+
};
|
|
459
|
+
//# sourceMappingURL=chunk-G576EP5O.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/select.ts"],
|
|
4
|
+
"sourcesContent": ["import { Utils } from '../core/utils';\nimport { Menu, MenuOptions } from './menu';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface FormSelectOptions extends BaseOptions {\n /**\n * Classes to be added to the select wrapper element.\n * @default \"\"\n */\n classes: string;\n /**\n * Pass options object to select menu initialization.\n * @default {}\n */\n menuOptions: Partial<MenuOptions>;\n}\n\nconst _defaults: FormSelectOptions = {\n classes: '',\n menuOptions: {}\n};\n\ntype ValueStruct = {\n el: HTMLOptionElement;\n optionEl: HTMLElement;\n};\n\nexport class FormSelect extends Component<FormSelectOptions> {\n declare el: HTMLSelectElement;\n /** If this is a multiple select. */\n isMultiple: boolean;\n /**\n * Label associated with the current select element.\n * Is \"null\", if not detected.\n */\n labelEl: HTMLLabelElement;\n /** The generated menu element. */\n menuEl: HTMLElement;\n /** Text input that shows current selected option. */\n input: HTMLInputElement;\n /** Instance of the menu plugin for this select. */\n menu: Menu;\n /** The field wrapper around the native select. */\n wrapper: HTMLDivElement;\n selectOptions: (HTMLOptionElement | HTMLOptGroupElement)[];\n private _values: ValueStruct[];\n private _createdWrapper: boolean;\n private _originalLabelFor: string | null;\n private _form: HTMLFormElement | null;\n private _resetTimer: ReturnType<typeof setTimeout>;\n nativeTabIndex: number;\n\n constructor(el: HTMLSelectElement, options: FormSelectOptions) {\n super(el, options, FormSelect);\n if (this.el.classList.contains('browser-default')) return;\n this.el['Expressive_FormSelect'] = this;\n\n this.options = {\n ...FormSelect.defaults,\n ...options\n };\n\n this.isMultiple = this.el.multiple;\n this.nativeTabIndex = this.el.tabIndex ?? -1;\n this.el.tabIndex = -1;\n this._values = [];\n this._createdWrapper = false;\n this._originalLabelFor = null;\n this._setupMenu();\n this._setupEventHandlers();\n }\n\n static get defaults(): FormSelectOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of FormSelect.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLSelectElement, options?: Partial<FormSelectOptions>): FormSelect;\n /**\n * Initializes instances of FormSelect.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLSelectElement | InitElement>,\n options?: Partial<FormSelectOptions>\n ): FormSelect[];\n /**\n * Initializes instances of FormSelect.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLSelectElement | InitElements<HTMLSelectElement | InitElement>,\n options: Partial<FormSelectOptions> = {}\n ): FormSelect | FormSelect[] {\n return super.init(els, options, FormSelect);\n }\n\n static getInstance(el: HTMLElement): FormSelect {\n return el['Expressive_FormSelect'];\n }\n\n destroy() {\n this._removeEventHandlers();\n // The Menu holds itself in the static Menu._menus registry\n // until its own destroy() runs, so dropping the elements is not enough -\n // every rebuilt select used to leave an instance behind for good.\n this.menu?.destroy();\n this._removeMenu();\n this.el.tabIndex = this.nativeTabIndex;\n this.el['Expressive_FormSelect'] = undefined;\n }\n\n /**\n * Re-read the native `<select>` and update the generated menu to match.\n *\n * Assigning `select.value` from script fires no `change` event, so nothing\n * else syncs the visible input text or the `.selected` state on the virtual\n * options. Adding or removing `<option>`s also requires this \u2014 the menu is\n * rebuilt from the native list, the field and Menu instance stay put.\n */\n refresh() {\n if (!this.menuEl) return;\n this._bindForm();\n const root = this.menuEl.getRootNode() as Document | ShadowRoot;\n const focused = this._values.find(value => value.optionEl.contains(root.activeElement))?.el;\n this.input.disabled = this.el.matches(':disabled');\n this.wrapper.classList.toggle('disabled', this.input.disabled);\n if (this.input.disabled) this.menu?.close();\n else if (!this.menu) this._initMenu();\n this.input.removeAttribute('aria-activedescendant');\n this._rebuildOptions();\n this._handleSelectChange();\n if (this.menu) this.menu.focusedIndex = -1;\n if (this.menu?.isOpen) {\n this.menu.recalculateDimensions();\n if (focused) (this._values.find(value => value.el === focused)?.optionEl ?? this.input).focus();\n }\n }\n\n _setupEventHandlers() {\n this._setupOptionHandlers();\n this.el.addEventListener('change', this._handleSelectChange);\n this.input.addEventListener('click', this._handleInputClick);\n this.menuEl.addEventListener('focusin', this._handleOptionFocus);\n this._bindForm();\n }\n\n private _bindForm() {\n this._form?.removeEventListener('reset', this._handleReset);\n this._form = this.el.form;\n this._form?.addEventListener('reset', this._handleReset);\n }\n\n _removeEventHandlers() {\n this._removeOptionHandlers();\n this.el.removeEventListener('change', this._handleSelectChange);\n this.input?.removeEventListener('click', this._handleInputClick);\n this.menuEl?.removeEventListener('focusin', this._handleOptionFocus);\n this._form?.removeEventListener('reset', this._handleReset);\n clearTimeout(this._resetTimer);\n }\n\n private _setupOptionHandlers() {\n this.menuEl.querySelectorAll('li:not(.optgroup)').forEach((el) => {\n el.addEventListener('click', this._handleOptionClick);\n el.addEventListener('keydown', this._handleOptionKeydown);\n });\n }\n\n private _removeOptionHandlers() {\n this.menuEl?.querySelectorAll('li:not(.optgroup)').forEach((el) => {\n el.removeEventListener('click', this._handleOptionClick);\n el.removeEventListener('keydown', this._handleOptionKeydown);\n });\n }\n\n _handleSelectChange = () => {\n this._setValueToInput();\n this._setSelectedStates();\n };\n\n private _handleReset = (e: Event) => {\n clearTimeout(this._resetTimer);\n this._resetTimer = setTimeout(() => {\n if (!e.defaultPrevented) this._handleSelectChange();\n }, 0);\n };\n\n // Named rather than inline so that _removeEventHandlers can actually detach\n // it - an anonymous listener per option was unremovable.\n _handleOptionKeydown = (e: KeyboardEvent) => {\n if (e.key === ' ' || e.key === 'Enter') this._handleOptionClick(e);\n };\n\n _handleOptionClick = (e: MouseEvent | KeyboardEvent) => {\n e.preventDefault();\n const virtualOption = (e.target as HTMLLIElement).closest('li');\n this._selectOptionElement(virtualOption);\n e.stopPropagation();\n };\n\n private _handleOptionFocus = (e: FocusEvent) => {\n const target = e.target;\n if (!(target instanceof Element)) return;\n const li = target.closest('li[role=\"option\"]');\n if (li?.id) this.input.setAttribute('aria-activedescendant', li.id);\n };\n\n _arraysEqual<T, E>(a: T[], b: (E | T)[]) {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; ++i) if (a[i] !== b[i]) return false;\n return true;\n }\n\n _selectOptionElement(virtualOption: HTMLElement) {\n if (this.el.matches(':disabled')) return;\n if (\n !virtualOption.classList.contains('disabled') &&\n !virtualOption.classList.contains('optgroup')\n ) {\n const value = this._values.find((value) => value.optionEl === virtualOption);\n if (!value || value.el.matches(':disabled')) return;\n const previousSelectedValues = this.getSelectedValues();\n if (this.isMultiple) {\n this._toggleEntryFromArray(value);\n } else {\n this._deselectAll();\n this._selectValue(value);\n }\n this._handleSelectChange();\n const actualSelectedValues = this.getSelectedValues();\n const selectionHasChanged = !this._arraysEqual(previousSelectedValues, actualSelectedValues);\n if (selectionHasChanged)\n this.el.dispatchEvent(\n new Event('change', { bubbles: true, cancelable: true, composed: true })\n );\n }\n if (!this.isMultiple) this.menu?.close();\n }\n\n _handleInputClick = () => {\n if (this.menu && this.menu.isOpen) {\n this._setValueToInput();\n this._setSelectedStates();\n }\n };\n\n _setupMenu() {\n // The DOM already knows which labels belong to this control. Building a\n // selector out of the id instead meant an id with any CSS-special\n // character either threw or matched something else entirely.\n this.labelEl = this.el.labels?.[0] ?? null;\n\n this._setupWrapper();\n this._hideNativeSelect();\n if (this.el.matches(':disabled')) this.wrapper.classList.add('disabled');\n\n this.menuEl = document.createElement('menu');\n this.menuEl.id = `select-options-${Utils.guid()}`;\n this.menuEl.setAttribute('popover', 'auto');\n this.menuEl.setAttribute('role', 'listbox');\n this.menuEl.ariaMultiSelectable = this.isMultiple.toString();\n if (this.isMultiple) this.menuEl.classList.add('multiple-select-menu');\n this._buildOptions();\n this.wrapper.append(this.menuEl);\n\n this._buildInput();\n this._buildCaret();\n this._initMenu();\n this._setSelectedStates();\n if (this.labelEl) this.input.after(this.labelEl);\n }\n\n private _setupWrapper() {\n const parent = this.el.parentElement;\n const reuse =\n parent &&\n parent.matches('.field') &&\n !parent.querySelector(':scope > .hide-select') &&\n !parent.querySelector(':scope > input, :scope > textarea');\n if (reuse) {\n this.wrapper = parent as HTMLDivElement;\n this._createdWrapper = false;\n } else {\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('field');\n this._createdWrapper = true;\n this.el.before(this.wrapper);\n }\n if (this.options.classes.length > 0) {\n this.wrapper.classList.add(...this.options.classes.split(' ').filter(Boolean));\n }\n }\n\n private _hideNativeSelect() {\n const hiddenDiv = document.createElement('div');\n hiddenDiv.classList.add('hide-select');\n this.el.before(hiddenDiv);\n hiddenDiv.appendChild(this.el);\n this.wrapper.append(hiddenDiv);\n }\n\n private _buildInput() {\n this.input = document.createElement('input');\n this.input.id = 'select-input-' + Utils.guid();\n // FormSelect owns this Menu. A later AutoInit must not replace it before\n // FormSelect can destroy its own instance during reinitialization.\n this.input.classList.add('menu-trigger', 'no-autoinit');\n this.input.type = 'text';\n this.input.readOnly = true;\n this.input.setAttribute('data-target', this.menuEl.id);\n this.input.ariaReadOnly = 'true';\n this.input.ariaRequired = this.el.hasAttribute('required').toString();\n this.input.disabled = this.el.matches(':disabled');\n this.input.setAttribute('tabindex', this.nativeTabIndex.toString());\n\n const attrs = this.el.attributes;\n for (let i = 0; i < attrs.length; ++i) {\n const attr = attrs[i];\n if (attr.name.startsWith('aria-')) this.input.setAttribute(attr.name, attr.value);\n }\n\n this.input.setAttribute('role', 'combobox');\n this.input.setAttribute('aria-haspopup', 'listbox');\n this.input.ariaExpanded = 'false';\n this.input.setAttribute('aria-controls', this.menuEl.id);\n this.input.placeholder = ' ';\n\n if (this.labelEl) {\n this._originalLabelFor = this.labelEl.htmlFor;\n this.labelEl.htmlFor = this.input.id;\n }\n\n this.wrapper.prepend(this.input);\n this._setValueToInput();\n }\n\n private _buildCaret() {\n const caret = document.createElement('span');\n caret.classList.add('caret');\n caret.setAttribute('aria-hidden', 'true');\n this.wrapper.prepend(caret);\n }\n\n private _initMenu() {\n if (this.el.matches(':disabled')) return;\n const menuOptions = { ...this.options.menuOptions };\n menuOptions.coverTrigger = false;\n const userOnOpenEnd = menuOptions.onOpenEnd;\n const userOnCloseEnd = menuOptions.onCloseEnd;\n menuOptions.onOpenEnd = () => {\n const selectedOption = this.menuEl.querySelector('.selected');\n if (selectedOption) {\n this.menu.focusedIndex = [...selectedOption.parentNode.children].indexOf(selectedOption);\n this.menu._focusFocusedItem();\n if (this.menu.isScrollable) {\n let scrollOffset =\n selectedOption.getBoundingClientRect().top -\n this.menuEl.getBoundingClientRect().top;\n scrollOffset -= this.menuEl.clientHeight / 2;\n this.menuEl.scrollTop = scrollOffset;\n }\n if (selectedOption.id) this.input.setAttribute('aria-activedescendant', selectedOption.id);\n }\n this.input.ariaExpanded = 'true';\n if (userOnOpenEnd && typeof userOnOpenEnd === 'function')\n userOnOpenEnd.call(this.menu, this.el);\n };\n menuOptions.onCloseEnd = () => {\n this.input.ariaExpanded = 'false';\n this.input.removeAttribute('aria-activedescendant');\n if (userOnCloseEnd && typeof userOnCloseEnd === 'function')\n userOnCloseEnd.call(this.menu, this.el);\n };\n menuOptions.closeOnClick = false;\n this.menu = Menu.init(this.input, menuOptions);\n }\n\n private _nativeOptions(): (HTMLOptGroupElement | HTMLOptionElement)[] {\n return <(HTMLOptGroupElement | HTMLOptionElement)[]>(\n Array.from(this.el.children).filter((el) => ['OPTION', 'OPTGROUP'].includes(el.tagName))\n );\n }\n\n private _buildOptions() {\n this.selectOptions = this._nativeOptions();\n this._values = [];\n this.selectOptions.forEach((realOption) => {\n if (realOption.tagName === 'OPTION') {\n const virtualOption = this._createAndAppendOptionWithIcon(\n realOption,\n this.isMultiple ? 'multiple' : undefined\n );\n this._addOptionToValues(realOption as HTMLOptionElement, virtualOption);\n } else if (realOption.tagName === 'OPTGROUP') {\n const groupId = 'opt-group-' + Utils.guid();\n const groupParent = document.createElement('li');\n groupParent.classList.add('optgroup');\n groupParent.tabIndex = -1;\n groupParent.setAttribute('role', 'group');\n groupParent.setAttribute('aria-labelledby', groupId);\n // Built as nodes, not markup: the optgroup's label attribute is\n // author content that may come from a server, and interpolating it\n // into innerHTML let it close the span and inject an element.\n const groupLabel = document.createElement('span');\n groupLabel.id = groupId;\n groupLabel.setAttribute('role', 'presentation');\n groupLabel.textContent = realOption.getAttribute('label') ?? '';\n groupParent.replaceChildren(groupLabel);\n this.menuEl.append(groupParent);\n\n const groupChildren = [];\n const selectOptions = <HTMLOptionElement[]>(\n Array.from(realOption.children).filter((el) => el.tagName === 'OPTION')\n );\n selectOptions.forEach((child) => {\n const virtualOption = this._createAndAppendOptionWithIcon(child, 'optgroup-option');\n groupChildren.push(virtualOption.id);\n this._addOptionToValues(child, virtualOption);\n });\n groupParent.setAttribute('aria-owns', groupChildren.join(' '));\n }\n });\n }\n\n private _rebuildOptions() {\n this._removeOptionHandlers();\n this.menuEl.replaceChildren();\n this._buildOptions();\n this._setupOptionHandlers();\n this.menu?._makeMenuFocusable();\n }\n\n _addOptionToValues(realOption: HTMLOptionElement, virtualOption: HTMLElement) {\n this._values.push({ el: realOption, optionEl: virtualOption });\n }\n\n _removeMenu() {\n this.wrapper?.querySelector(':scope > .caret')?.remove();\n this.input?.remove();\n this.menuEl?.remove();\n const hide = this.el.parentElement;\n if (hide?.classList.contains('hide-select')) hide.replaceWith(this.el);\n if (this.labelEl && this._originalLabelFor !== null) {\n this.labelEl.htmlFor = this._originalLabelFor;\n }\n if (!this.wrapper) return;\n if (this._createdWrapper) {\n this.wrapper.replaceWith(this.el);\n } else {\n this.wrapper.classList.remove('disabled');\n if (this.options.classes.length > 0) {\n this.wrapper.classList.remove(...this.options.classes.split(' ').filter(Boolean));\n }\n }\n }\n\n _createAndAppendOptionWithIcon(\n realOption: HTMLOptionElement | HTMLOptGroupElement,\n type: string\n ) {\n const li = document.createElement('li');\n li.id = 'select-option-' + Utils.guid();\n li.setAttribute('role', 'option');\n li.tabIndex = 0;\n const disabled = this.el.matches(':disabled') || realOption.matches(':disabled');\n if (disabled) {\n li.classList.add('disabled');\n li.ariaDisabled = 'true';\n li.tabIndex = -1;\n }\n if (type === 'optgroup-option') li.classList.add(type);\n\n // Text / Checkbox. An <option>'s content model is text, so its markup is\n // its text - copying it as nodes rather than through innerHTML keeps it\n // that way instead of handing it back to the parser.\n const optionText = realOption.textContent;\n const span = document.createElement('span');\n if (this.isMultiple && !disabled) {\n const label = document.createElement('label');\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.tabIndex = -1;\n const labelText = document.createElement('span');\n labelText.textContent = optionText;\n label.append(checkbox, labelText);\n span.appendChild(label);\n } else {\n span.textContent = optionText;\n }\n li.appendChild(span);\n\n const iconUrl = realOption.getAttribute('data-icon');\n let imageUrl: URL | undefined;\n if (iconUrl) {\n try {\n const url = new URL(iconUrl, this.el.ownerDocument.baseURI);\n if (['http:', 'https:', 'blob:'].includes(url.protocol) ||\n /^data:image\\/(?:avif|bmp|gif|jpeg|png|svg\\+xml|webp|x-icon)(?:;|,)/i.test(url.href)) {\n imageUrl = url;\n }\n } catch { /* Invalid icons must not prevent selection. */ }\n }\n // filter(Boolean): a doubled or trailing space yields an empty string,\n // and classList.add('') throws.\n const classes = realOption.getAttribute('class')?.split(' ').filter(Boolean);\n if (imageUrl) {\n const img = document.createElement('img');\n if (classes?.length) img.classList.add(...classes);\n img.src = imageUrl.href;\n img.ariaHidden = 'true';\n li.prepend(img);\n }\n this.menuEl.append(li);\n return li;\n }\n\n _selectValue(value: ValueStruct) {\n value.el.selected = true;\n value.optionEl.classList.add('selected');\n value.optionEl.ariaSelected = 'true';\n const checkbox = <HTMLInputElement>value.optionEl.querySelector('input[type=\"checkbox\"]');\n if (checkbox) checkbox.checked = true;\n }\n\n _deselectValue(value: ValueStruct) {\n value.el.selected = false;\n value.optionEl.classList.remove('selected');\n value.optionEl.ariaSelected = 'false';\n const checkbox = <HTMLInputElement>value.optionEl.querySelector('input[type=\"checkbox\"]');\n if (checkbox) checkbox.checked = false;\n }\n\n _deselectAll() {\n this._values.forEach((value) => this._deselectValue(value));\n }\n\n _isValueSelected(value: ValueStruct) {\n const realValues = this.getSelectedValues();\n return realValues.some((realValue) => realValue === value.el.value);\n }\n\n _toggleEntryFromArray(value: ValueStruct) {\n if (this._isValueSelected(value)) this._deselectValue(value);\n else this._selectValue(value);\n }\n\n _getSelectedOptions(): HTMLOptionElement[] {\n return Array.prototype.filter.call(\n this.el.selectedOptions,\n (realOption: HTMLOptionElement) => realOption\n );\n }\n\n _setValueToInput() {\n this.input.value = this._getSelectedOptions().map(option => option.textContent.trim()).join(', ');\n }\n\n _setSelectedStates() {\n this._values.forEach((value) => {\n const optionIsSelected = value.el.selected;\n const cb = <HTMLInputElement>value.optionEl.querySelector('input[type=\"checkbox\"]');\n if (cb) cb.checked = optionIsSelected;\n if (optionIsSelected) {\n this._activateOption(this.menuEl, value.optionEl);\n } else {\n value.optionEl.classList.remove('selected');\n value.optionEl.ariaSelected = 'false';\n }\n });\n }\n\n _activateOption(ul: HTMLElement, li: HTMLElement) {\n if (!li) return;\n if (!this.isMultiple)\n ul.querySelectorAll('li.selected').forEach((row) => row.classList.remove('selected'));\n li.classList.add('selected');\n li.ariaSelected = 'true';\n }\n\n getSelectedValues() {\n return this._getSelectedOptions().map((realOption) => realOption.value);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["value"]
|
|
7
|
+
}
|