@expressivecss/expressive 0.10.1 → 0.11.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 +77 -1
- package/README.md +22 -1
- package/dist/css/expressive.css +44 -10
- 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-QYCYP443.mjs → chunk-74N6U5JJ.mjs} +12 -6
- package/dist/js/chunks/chunk-74N6U5JJ.mjs.map +7 -0
- package/dist/js/chunks/{chunk-ZIZVUWRL.mjs → chunk-7GKXUG4B.mjs} +8 -8
- package/dist/js/chunks/{chunk-7MM4VJJO.mjs → chunk-AYYYWUJ4.mjs} +7 -5
- package/dist/js/chunks/chunk-AYYYWUJ4.mjs.map +7 -0
- package/dist/js/chunks/{chunk-ZZBZI2XN.mjs → chunk-CDW6WIRT.mjs} +2 -2
- package/dist/js/chunks/chunk-FRB7TOCS.mjs +135 -0
- package/dist/js/chunks/chunk-FRB7TOCS.mjs.map +7 -0
- package/dist/js/chunks/{chunk-AOGFNMXS.mjs → chunk-I5KR22BY.mjs} +2 -2
- package/dist/js/chunks/{chunk-AOGFNMXS.mjs.map → chunk-I5KR22BY.mjs.map} +2 -2
- package/dist/js/chunks/{chunk-YFXEJ7GR.mjs → chunk-IMUPRRI6.mjs} +6 -7
- package/dist/js/chunks/chunk-IMUPRRI6.mjs.map +7 -0
- package/dist/js/chunks/chunk-PMBPAFAS.mjs +7 -0
- package/dist/js/chunks/{chunk-ZAOYQ6SY.mjs.map → chunk-PMBPAFAS.mjs.map} +1 -1
- package/dist/js/chunks/{chunk-G576EP5O.mjs → chunk-XFJ452AZ.mjs} +74 -11
- package/dist/js/chunks/chunk-XFJ452AZ.mjs.map +7 -0
- package/dist/js/expressive.cjs +139 -88
- package/dist/js/expressive.cjs.map +2 -2
- package/dist/js/expressive.js +139 -88
- package/dist/js/expressive.js.map +2 -2
- package/dist/js/expressive.min.js +10 -10
- package/dist/js/expressive.min.js.map +3 -3
- package/dist/js/expressive.mjs +9 -9
- package/dist/js/internal/components/autocomplete.mjs +1 -1
- package/dist/js/internal/components/carousel.mjs +1 -1
- package/dist/js/internal/components/chips.mjs +2 -2
- package/dist/js/internal/components/datepicker.mjs +2 -2
- package/dist/js/internal/components/index.mjs +7 -7
- package/dist/js/internal/components/registry.mjs +8 -8
- package/dist/js/internal/components/scrollspy.mjs +1 -1
- package/dist/js/internal/components/select.mjs +1 -1
- package/dist/js/internal/components/tabs.mjs +2 -2
- package/dist/js/modular.mjs +9 -9
- package/dist/types/components/autocomplete.d.ts +2 -1
- package/dist/types/components/datepicker.d.ts +1 -0
- package/dist/types/components/scrollspy.d.ts +5 -4
- package/dist/types/components/select.d.ts +7 -1
- package/dist/types/modular.d.ts +1 -1
- package/package.json +1 -1
- package/src/sass/abstracts/_mixins.scss +19 -11
- package/src/sass/components/_buttons.scss +45 -0
- package/src/sass/components/_chips.scss +5 -9
- package/src/sass/components/_dialog.scss +0 -7
- package/src/sass/components/_navbar.scss +3 -3
- package/src/sass/components/forms/_fieldset.scss +20 -1
- package/src/sass/components/forms/_file-input.scss +11 -3
- package/src/sass/components/forms/_select.scss +3 -2
- package/src/sass/utilities/_visibility.scss +5 -0
- package/dist/js/chunks/chunk-7MM4VJJO.mjs.map +0 -7
- package/dist/js/chunks/chunk-G576EP5O.mjs.map +0 -7
- package/dist/js/chunks/chunk-QYCYP443.mjs.map +0 -7
- package/dist/js/chunks/chunk-TZZ24ZQS.mjs +0 -154
- package/dist/js/chunks/chunk-TZZ24ZQS.mjs.map +0 -7
- package/dist/js/chunks/chunk-YFXEJ7GR.mjs.map +0 -7
- package/dist/js/chunks/chunk-ZAOYQ6SY.mjs +0 -7
- /package/dist/js/chunks/{chunk-ZIZVUWRL.mjs.map → chunk-7GKXUG4B.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-ZZBZI2XN.mjs.map → chunk-CDW6WIRT.mjs.map} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Carousel
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-I5KR22BY.mjs";
|
|
4
4
|
import {
|
|
5
5
|
Component
|
|
6
6
|
} from "./chunk-QSQ24FYT.mjs";
|
|
@@ -39,14 +39,13 @@ var Tabs = class _Tabs extends Component {
|
|
|
39
39
|
}
|
|
40
40
|
if (tabLink.hasAttribute("target")) return;
|
|
41
41
|
if (this.options.swipeable) {
|
|
42
|
-
const panel = tabLink.hash && document.
|
|
42
|
+
const panel = tabLink.hash && document.getElementById(tabLink.hash.slice(1));
|
|
43
43
|
const index = this._tabsCarousel.images.indexOf(panel);
|
|
44
44
|
if (index >= 0) this._tabsCarousel.set(index);
|
|
45
45
|
e.preventDefault();
|
|
46
46
|
return;
|
|
47
47
|
}
|
|
48
48
|
const _oldContent = this._content;
|
|
49
|
-
if (tabLink.hash) this._content = document.querySelector(tabLink.hash);
|
|
50
49
|
this._tabLinks = this._queryTabLinks();
|
|
51
50
|
const prevIndex = this._index;
|
|
52
51
|
this._setActiveTabLink(tabLink);
|
|
@@ -73,7 +72,7 @@ var Tabs = class _Tabs extends Component {
|
|
|
73
72
|
this._tabLinks.forEach((link) => {
|
|
74
73
|
this._originalLinks.set(link, { active: link.classList.contains("active"), current: link.getAttribute("aria-current") });
|
|
75
74
|
if (link.hasAttribute("target")) return;
|
|
76
|
-
const panel = link.hash && document.
|
|
75
|
+
const panel = link.hash && document.getElementById(link.hash.slice(1));
|
|
77
76
|
if (panel) this._originalPanels.set(panel, {
|
|
78
77
|
display: panel.style.display,
|
|
79
78
|
priority: panel.style.getPropertyPriority("display"),
|
|
@@ -194,7 +193,7 @@ var Tabs = class _Tabs extends Component {
|
|
|
194
193
|
const tabsContent = [];
|
|
195
194
|
this._tabLinks.forEach((a) => {
|
|
196
195
|
if (a.hash && !a.hasAttribute("target")) {
|
|
197
|
-
const currContent = document.
|
|
196
|
+
const currContent = document.getElementById(a.hash.slice(1));
|
|
198
197
|
if (!currContent) return;
|
|
199
198
|
currContent.classList.add("carousel-item");
|
|
200
199
|
tabsContent.push(currContent);
|
|
@@ -234,7 +233,7 @@ var Tabs = class _Tabs extends Component {
|
|
|
234
233
|
Array.from(this._tabLinks).forEach((a) => {
|
|
235
234
|
if (a === this._activeTabLink || a.hasAttribute("target")) return;
|
|
236
235
|
if (a.hash) {
|
|
237
|
-
const currContent = document.
|
|
236
|
+
const currContent = document.getElementById(a.hash.slice(1));
|
|
238
237
|
if (currContent) currContent.style.display = "none";
|
|
239
238
|
}
|
|
240
239
|
});
|
|
@@ -283,4 +282,4 @@ var Tabs = class _Tabs extends Component {
|
|
|
283
282
|
export {
|
|
284
283
|
Tabs
|
|
285
284
|
};
|
|
286
|
-
//# sourceMappingURL=chunk-
|
|
285
|
+
//# sourceMappingURL=chunk-IMUPRRI6.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/tabs.ts"],
|
|
4
|
+
"sourcesContent": ["import { Carousel } from './carousel';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface TabsOptions extends BaseOptions {\n /**\n * Transition duration in milliseconds.\n * @default 300\n */\n duration: number;\n /**\n * Callback for when a new tab content is shown.\n * @default null\n */\n onShow: (newContent: Element) => void;\n /**\n * Set to true to enable swipeable tabs.\n * This also uses the responsiveThreshold option.\n * @default false\n */\n swipeable: boolean;\n /**\n * The maximum width of the screen, in pixels,\n * where the swipeable functionality initializes.\n * @default infinity\n */\n responsiveThreshold: number;\n}\n\nconst _defaults: TabsOptions = {\n duration: 300,\n onShow: null,\n swipeable: false,\n responsiveThreshold: Infinity // breakpoint for swipeable\n};\n\nexport class Tabs extends Component<TabsOptions> {\n _tabLinks: NodeListOf<HTMLAnchorElement>;\n _index: number;\n _indicator: HTMLElement;\n _tabWidth: number;\n _tabsWidth: number;\n _tabsCarousel: Carousel;\n _activeTabLink: HTMLAnchorElement;\n _content: HTMLElement;\n private _originalPanels = new Map<HTMLElement, { display: string; priority: string; active: boolean; carousel: boolean; marker?: Comment }>();\n private _originalLinks = new Map<HTMLAnchorElement, { active: boolean; current: string | null }>();\n\n constructor(el: HTMLElement, options: Partial<TabsOptions>) {\n super(el, options, Tabs);\n this.el['Expressive_Tabs'] = this;\n\n this.options = {\n ...Tabs.defaults,\n ...options\n };\n\n this._tabLinks = this._queryTabLinks();\n this._tabLinks.forEach(link => {\n this._originalLinks.set(link, { active: link.classList.contains('active'), current: link.getAttribute('aria-current') });\n if (link.hasAttribute('target')) return;\n const panel = link.hash && document.getElementById(link.hash.slice(1));\n if (panel) this._originalPanels.set(panel, {\n display: panel.style.display, priority: panel.style.getPropertyPriority('display'),\n active: panel.classList.contains('active'), carousel: panel.classList.contains('carousel-item')\n });\n });\n this.options.swipeable &&= window.innerWidth <= this.options.responsiveThreshold;\n this._index = 0;\n this._setupActiveTabLink();\n if (this.options.swipeable) {\n this._setupSwipeableTabs();\n } else {\n this._setupNormalTabs();\n }\n // Setup tabs indicator after content to ensure accurate widths\n this._setTabsAndTabWidth();\n this._createIndicator();\n this._setupEventHandlers();\n }\n\n static get defaults(): TabsOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Tabs.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<TabsOptions>): Tabs;\n /**\n * Initializes instances of Tabs.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<TabsOptions>): Tabs[];\n /**\n * Initializes instances of Tabs.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<TabsOptions> = {}\n ): Tabs | Tabs[] {\n return super.init(els, options, Tabs);\n }\n\n static getInstance(el: HTMLElement): Tabs {\n return el['Expressive_Tabs'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this._indicator.remove();\n if (this.options.swipeable) {\n this._teardownSwipeableTabs();\n }\n this._originalPanels.forEach((original, panel) => {\n panel.style.setProperty('display', original.display, original.priority);\n panel.classList.toggle('active', original.active);\n panel.classList.toggle('carousel-item', original.carousel);\n if (!panel.className) panel.removeAttribute('class');\n });\n this._originalLinks.forEach((original, link) => {\n link.classList.toggle('active', original.active);\n if (original.current === null) link.removeAttribute('aria-current');\n else link.setAttribute('aria-current', original.current);\n });\n this.el['Expressive_Tabs'] = undefined;\n }\n\n /**\n * The index of tab that is currently shown.\n */\n get index() {\n return this._index;\n }\n\n _setupEventHandlers() {\n window.addEventListener('resize', this._handleWindowResize);\n this.el.addEventListener('click', this._handleTabClick);\n }\n\n _removeEventHandlers() {\n window.removeEventListener('resize', this._handleWindowResize);\n this.el.removeEventListener('click', this._handleTabClick);\n }\n\n _handleWindowResize = () => {\n this._setTabsAndTabWidth();\n if (this._tabWidth !== 0 && this._tabsWidth !== 0) {\n this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + 'px';\n this._indicator.style.right = this._calcRightPos(this._activeTabLink) + 'px';\n }\n };\n\n _queryTabLinks() {\n return this.el.querySelectorAll<HTMLAnchorElement>(\n ':scope > a, :scope > .tab > a'\n );\n }\n\n _handleTabClick = (e: MouseEvent) => {\n const target = e.target as Element | null;\n if (!target) return;\n const tabLink = target.closest('a') as HTMLAnchorElement | null;\n if (!tabLink || !Array.from(this._tabLinks).includes(tabLink)) return;\n\n const tab = tabLink.parentElement;\n const disabled =\n tabLink.classList.contains('disabled') ||\n tabLink.getAttribute('aria-disabled') === 'true' ||\n tab?.classList.contains('disabled');\n if (disabled) {\n e.preventDefault();\n return;\n }\n // Act as regular link if target attribute is specified.\n if (tabLink.hasAttribute('target')) return;\n if (this.options.swipeable) {\n const panel = tabLink.hash && document.getElementById(tabLink.hash.slice(1));\n const index = this._tabsCarousel.images.indexOf(panel as HTMLElement);\n if (index >= 0) this._tabsCarousel.set(index);\n e.preventDefault();\n return;\n }\n const _oldContent = this._content;\n this._tabLinks = this._queryTabLinks();\n // Moves the class and aria-current together, off the old tab and onto this\n // one - they used to be able to disagree.\n const prevIndex = this._index;\n this._setActiveTabLink(tabLink);\n\n // Swap content\n if (this._content) {\n this._content.style.display = 'block';\n this._content.classList.add('active');\n if (typeof this.options.onShow === 'function')\n this.options.onShow.call(this, this._content);\n if (_oldContent && _oldContent !== this._content) {\n _oldContent.style.display = 'none';\n _oldContent.classList.remove('active');\n }\n }\n // Update widths after content is swapped (scrollbar bugfix)\n this._setTabsAndTabWidth();\n this._animateIndicator(prevIndex);\n e.preventDefault();\n };\n\n _createIndicator() {\n const tag = this.el.tagName === 'UL' || this.el.tagName === 'OL' ? 'li' : 'span';\n const indicator = document.createElement(tag);\n indicator.classList.add('indicator');\n this.el.appendChild(indicator);\n this._indicator = indicator;\n this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + 'px';\n this._indicator.style.right = this._calcRightPos(this._activeTabLink) + 'px';\n }\n\n /**\n * Which tab is current, for the eye and for assistive technology.\n *\n * The class alone is a colour. `aria-current` is the part a screen reader\n * reads, and because tabs are navigation rather than a tablist (rule 2 -\n * there is no keyboard model here to back a tablist), \"current\" is exactly\n * the right word for it. Its *value* changes as the user clicks, which makes\n * maintaining it the component's job, not the author's - see CONTEXT.md on\n * static semantics versus dynamic state. Writing it once in the markup and\n * never moving it left the old tab announcing itself as current.\n */\n private _setActiveTabLink(tabLink: HTMLAnchorElement) {\n Array.from(this._tabLinks).forEach((a: HTMLAnchorElement) => {\n a.classList.remove('active');\n a.removeAttribute('aria-current');\n });\n this._activeTabLink = tabLink;\n tabLink.classList.add('active');\n tabLink.setAttribute('aria-current', 'page');\n this._index = Array.from(this._tabLinks).indexOf(tabLink);\n this._content = tabLink.hasAttribute('target') ? null : document.getElementById(tabLink.hash.slice(1));\n }\n\n _setupActiveTabLink() {\n // If the location.hash matches one of the links, use that as the active tab.\n this._activeTabLink = Array.from(this._tabLinks).find(\n (a: HTMLAnchorElement) => a.getAttribute('href') === location.hash\n );\n // If no match is found, use the first link or any with class 'active' as the initial active tab.\n if (!this._activeTabLink) {\n let activeTabLink = this.el.querySelector('a.active');\n if (!activeTabLink) {\n activeTabLink = this._tabLinks[0];\n }\n this._activeTabLink = activeTabLink as HTMLAnchorElement;\n }\n this._setActiveTabLink(this._activeTabLink);\n\n this._originalPanels.forEach((_, panel) => panel.classList.toggle('active', panel === this._content));\n }\n\n _setupSwipeableTabs() {\n const tabsContent = [];\n this._tabLinks.forEach((a) => {\n if (a.hash && !a.hasAttribute('target')) {\n const currContent = document.getElementById(a.hash.slice(1));\n if (!currContent) return;\n currContent.classList.add('carousel-item');\n tabsContent.push(currContent);\n }\n });\n\n // Create Carousel-Wrapper around Tab-Contents\n const tabsWrapper = document.createElement('div');\n tabsWrapper.classList.add('tabs-content', 'carousel', 'flat');\n\n // Wrap around\n tabsContent[0].parentElement.insertBefore(tabsWrapper, tabsContent[0]);\n tabsContent.forEach((tabContent) => {\n const marker = document.createComment('');\n tabContent.before(marker);\n this._originalPanels.get(tabContent).marker = marker;\n tabsWrapper.appendChild(tabContent);\n tabContent.style.display = '';\n });\n\n this._tabsCarousel = Carousel.init(tabsWrapper, {\n fullWidth: true,\n noWrap: true,\n duration: this.options.duration,\n onCycleTo: (item) => {\n const prevIndex = this._index;\n this._setActiveTabLink(Array.from(this._tabLinks).find(a => !a.hasAttribute('target') && a.hash === '#' + item.id));\n this._setTabsAndTabWidth();\n this._animateIndicator(prevIndex);\n if (typeof this.options.onShow === 'function')\n this.options.onShow.call(this, this._content);\n }\n });\n }\n\n _teardownSwipeableTabs() {\n const tabsWrapper = this._tabsCarousel.el;\n this._tabsCarousel.destroy();\n this._originalPanels.forEach((original, panel) => original.marker?.replaceWith(panel));\n tabsWrapper.remove();\n }\n\n _setupNormalTabs() {\n // Hide Tabs Content\n Array.from(this._tabLinks).forEach((a) => {\n if (a === this._activeTabLink || a.hasAttribute('target')) return;\n if (a.hash) {\n const currContent = document.getElementById(a.hash.slice(1));\n if (currContent) currContent.style.display = 'none';\n }\n });\n }\n\n _setTabsAndTabWidth() {\n this._tabsWidth = this.el.getBoundingClientRect().width;\n this._tabWidth = Math.max(this._tabsWidth, this.el.scrollWidth) / this._tabLinks.length;\n }\n\n _calcRightPos(el) {\n return Math.ceil(this._tabsWidth - el.offsetLeft - el.getBoundingClientRect().width);\n }\n\n _calcLeftPos(el) {\n return Math.floor(el.offsetLeft);\n }\n\n /**\n * Recalculate tab indicator position. This is useful when\n * the indicator position is not correct.\n */\n updateTabIndicator() {\n this._setTabsAndTabWidth();\n this._animateIndicator(this._index);\n }\n\n _animateIndicator(prevIndex) {\n let leftDelay = 0,\n rightDelay = 0;\n\n const isMovingLeftOrStaying = this._index - prevIndex >= 0;\n if (isMovingLeftOrStaying) leftDelay = 90;\n else rightDelay = 90;\n\n // in v1: easeOutQuad\n this._indicator.style.transition = `\n left ${this.options.duration}ms ease-out ${leftDelay}ms,\n right ${this.options.duration}ms ease-out ${rightDelay}ms`;\n\n this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + 'px';\n this._indicator.style.right = this._calcRightPos(this._activeTabLink) + 'px';\n }\n\n /**\n * Show tab content that corresponds to the tab with the id.\n * @param tabId The id of the tab that you want to switch to.\n */\n select(tabId: string) {\n const tab = Array.from(this._tabLinks).find(\n (a: HTMLAnchorElement) => a.getAttribute('href') === '#' + tabId\n );\n if (tab) (<HTMLAnchorElement>tab).click();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/ts/modular.ts"],
|
|
4
|
-
"sourcesContent": ["export * from './components';\nexport { Dialogs } from './behaviors/dialogs';\nexport { BottomSheets } from './behaviors/bottomSheets';\nexport { SideSheets } from './behaviors/sideSheets';\nexport { Forms } from './behaviors/forms';\nexport { AutoInit } from './components/registry';\nexport type { AutoInitOptions } from './components/registry';\n\nexport const version = '0.
|
|
4
|
+
"sourcesContent": ["export * from './components';\nexport { Dialogs } from './behaviors/dialogs';\nexport { BottomSheets } from './behaviors/bottomSheets';\nexport { SideSheets } from './behaviors/sideSheets';\nexport { Forms } from './behaviors/forms';\nexport { AutoInit } from './components/registry';\nexport type { AutoInitOptions } from './components/registry';\n\nexport const version = '0.11.0';\n\nexport type * from './components/autocomplete';\nexport type * from './components/appBar';\nexport type * from './components/buttons';\nexport type * from './components/buttonGroup';\nexport type * from './components/cards';\nexport type * from './components/expandingCard';\nexport type * from './components/carousel';\nexport type * from './components/characterCounter';\nexport type * from './components/chips';\nexport type * from './components/datepicker';\nexport type * from './components/menu';\nexport type * from './components/lightbox';\nexport type * from './components/slider';\nexport type * from './components/scrollspy';\nexport type * from './components/select';\nexport type * from './components/navigationRail';\nexport type * from './components/tabs';\nexport type * from './components/timepicker';\nexport type * from './components/snackbar';\nexport type * from './components/tooltip';\n"],
|
|
5
5
|
"mappings": ";AAQO,IAAM,UAAU;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -16,14 +16,41 @@ var _defaults = {
|
|
|
16
16
|
var FormSelect = class _FormSelect extends Component {
|
|
17
17
|
constructor(el, options) {
|
|
18
18
|
super(el, options, _FormSelect);
|
|
19
|
+
this._originalLabels = /* @__PURE__ */ new Map();
|
|
20
|
+
this._validationMessage = null;
|
|
19
21
|
this._handleSelectChange = () => {
|
|
20
22
|
this._setValueToInput();
|
|
21
23
|
this._setSelectedStates();
|
|
24
|
+
this._syncValidationError();
|
|
22
25
|
};
|
|
26
|
+
this._handleInvalid = (e) => {
|
|
27
|
+
if (e.defaultPrevented) return;
|
|
28
|
+
if (!this._validationMessage) {
|
|
29
|
+
this._validationMessage = document.createElement("small");
|
|
30
|
+
this._validationMessage.id = this.input.id + "-error";
|
|
31
|
+
this._validationMessage.className = "supporting-text";
|
|
32
|
+
this._validationMessage.style.color = "var(--md-sys-color-error)";
|
|
33
|
+
this.wrapper.append(this._validationMessage);
|
|
34
|
+
this.input.setAttribute(
|
|
35
|
+
"aria-describedby",
|
|
36
|
+
[this.input.getAttribute("aria-describedby"), this._validationMessage.id].filter(Boolean).join(" ")
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
this.input.ariaInvalid = "true";
|
|
40
|
+
this._syncValidationError();
|
|
41
|
+
};
|
|
42
|
+
// Native reporting chooses the control; static checks never focus. Wait until
|
|
43
|
+
// reporting finishes so Firefox dismisses its native popup when focus moves.
|
|
44
|
+
this._handleNativeFocus = () => queueMicrotask(() => {
|
|
45
|
+
if (_FormSelect.getInstance(this.el) === this && this.el.matches(":focus")) this.input.focus();
|
|
46
|
+
});
|
|
23
47
|
this._handleReset = (e) => {
|
|
24
48
|
clearTimeout(this._resetTimer);
|
|
25
49
|
this._resetTimer = setTimeout(() => {
|
|
26
|
-
if (!e.defaultPrevented)
|
|
50
|
+
if (!e.defaultPrevented) {
|
|
51
|
+
this._handleSelectChange();
|
|
52
|
+
this._clearValidationError();
|
|
53
|
+
}
|
|
27
54
|
}, 0);
|
|
28
55
|
};
|
|
29
56
|
// Named rather than inline so that _removeEventHandlers can actually detach
|
|
@@ -60,7 +87,6 @@ var FormSelect = class _FormSelect extends Component {
|
|
|
60
87
|
this.el.tabIndex = -1;
|
|
61
88
|
this._values = [];
|
|
62
89
|
this._createdWrapper = false;
|
|
63
|
-
this._originalLabelFor = null;
|
|
64
90
|
this._setupMenu();
|
|
65
91
|
this._setupEventHandlers();
|
|
66
92
|
}
|
|
@@ -80,6 +106,7 @@ var FormSelect = class _FormSelect extends Component {
|
|
|
80
106
|
}
|
|
81
107
|
destroy() {
|
|
82
108
|
this._removeEventHandlers();
|
|
109
|
+
this._clearValidationError();
|
|
83
110
|
this.menu?.destroy();
|
|
84
111
|
this._removeMenu();
|
|
85
112
|
this.el.tabIndex = this.nativeTabIndex;
|
|
@@ -114,6 +141,8 @@ var FormSelect = class _FormSelect extends Component {
|
|
|
114
141
|
_setupEventHandlers() {
|
|
115
142
|
this._setupOptionHandlers();
|
|
116
143
|
this.el.addEventListener("change", this._handleSelectChange);
|
|
144
|
+
this.el.addEventListener("invalid", this._handleInvalid);
|
|
145
|
+
this.el.addEventListener("focus", this._handleNativeFocus);
|
|
117
146
|
this.input.addEventListener("click", this._handleInputClick);
|
|
118
147
|
this.menuEl.addEventListener("focusin", this._handleOptionFocus);
|
|
119
148
|
this._bindForm();
|
|
@@ -126,6 +155,8 @@ var FormSelect = class _FormSelect extends Component {
|
|
|
126
155
|
_removeEventHandlers() {
|
|
127
156
|
this._removeOptionHandlers();
|
|
128
157
|
this.el.removeEventListener("change", this._handleSelectChange);
|
|
158
|
+
this.el.removeEventListener("invalid", this._handleInvalid);
|
|
159
|
+
this.el.removeEventListener("focus", this._handleNativeFocus);
|
|
129
160
|
this.input?.removeEventListener("click", this._handleInputClick);
|
|
130
161
|
this.menuEl?.removeEventListener("focusin", this._handleOptionFocus);
|
|
131
162
|
this._form?.removeEventListener("reset", this._handleReset);
|
|
@@ -143,6 +174,21 @@ var FormSelect = class _FormSelect extends Component {
|
|
|
143
174
|
el.removeEventListener("keydown", this._handleOptionKeydown);
|
|
144
175
|
});
|
|
145
176
|
}
|
|
177
|
+
_syncValidationError() {
|
|
178
|
+
if (!this._validationMessage) return;
|
|
179
|
+
if (this.el.willValidate && !this.el.validity.valid) {
|
|
180
|
+
this._validationMessage.textContent = this.el.validationMessage;
|
|
181
|
+
} else this._clearValidationError();
|
|
182
|
+
}
|
|
183
|
+
_clearValidationError() {
|
|
184
|
+
if (!this._validationMessage) return;
|
|
185
|
+
const descriptions = this.input.getAttribute("aria-describedby")?.split(/\s+/).filter((id) => id !== this._validationMessage.id).join(" ");
|
|
186
|
+
if (descriptions) this.input.setAttribute("aria-describedby", descriptions);
|
|
187
|
+
else this.input.removeAttribute("aria-describedby");
|
|
188
|
+
this.input.ariaInvalid = this.el.ariaInvalid;
|
|
189
|
+
this._validationMessage.remove();
|
|
190
|
+
this._validationMessage = null;
|
|
191
|
+
}
|
|
146
192
|
_arraysEqual(a, b) {
|
|
147
193
|
if (a === b) return true;
|
|
148
194
|
if (a == null || b == null) return false;
|
|
@@ -174,6 +220,13 @@ var FormSelect = class _FormSelect extends Component {
|
|
|
174
220
|
}
|
|
175
221
|
_setupMenu() {
|
|
176
222
|
this.labelEl = this.el.labels?.[0] ?? null;
|
|
223
|
+
Array.from(this.el.labels ?? []).forEach((label) => {
|
|
224
|
+
this._originalLabels.set(label, { for: label.getAttribute("for"), id: label.getAttribute("id") });
|
|
225
|
+
});
|
|
226
|
+
if (this.labelEl && !this.el.closest("label")) {
|
|
227
|
+
this._labelPlaceholder = document.createComment("");
|
|
228
|
+
this.labelEl.before(this._labelPlaceholder);
|
|
229
|
+
}
|
|
177
230
|
this._setupWrapper();
|
|
178
231
|
this._hideNativeSelect();
|
|
179
232
|
if (this.el.matches(":disabled")) this.wrapper.classList.add("disabled");
|
|
@@ -189,7 +242,7 @@ var FormSelect = class _FormSelect extends Component {
|
|
|
189
242
|
this._buildCaret();
|
|
190
243
|
this._initMenu();
|
|
191
244
|
this._setSelectedStates();
|
|
192
|
-
if (this.
|
|
245
|
+
if (this._labelPlaceholder) this.input.after(this.labelEl);
|
|
193
246
|
}
|
|
194
247
|
_setupWrapper() {
|
|
195
248
|
const parent = this.el.parentElement;
|
|
@@ -210,9 +263,10 @@ var FormSelect = class _FormSelect extends Component {
|
|
|
210
263
|
_hideNativeSelect() {
|
|
211
264
|
const hiddenDiv = document.createElement("div");
|
|
212
265
|
hiddenDiv.classList.add("hide-select");
|
|
266
|
+
hiddenDiv.ariaHidden = "true";
|
|
213
267
|
this.el.before(hiddenDiv);
|
|
214
268
|
hiddenDiv.appendChild(this.el);
|
|
215
|
-
this.wrapper.append(hiddenDiv);
|
|
269
|
+
if (this._createdWrapper) this.wrapper.append(hiddenDiv);
|
|
216
270
|
}
|
|
217
271
|
_buildInput() {
|
|
218
272
|
this.input = document.createElement("input");
|
|
@@ -235,9 +289,14 @@ var FormSelect = class _FormSelect extends Component {
|
|
|
235
289
|
this.input.ariaExpanded = "false";
|
|
236
290
|
this.input.setAttribute("aria-controls", this.menuEl.id);
|
|
237
291
|
this.input.placeholder = " ";
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
292
|
+
this._originalLabels.forEach((_, label) => {
|
|
293
|
+
label.htmlFor = this.input.id;
|
|
294
|
+
});
|
|
295
|
+
if (this._labelPlaceholder && this._originalLabels.size > 1 && !this.input.getAttribute("aria-label") && !this.input.getAttribute("aria-labelledby")) {
|
|
296
|
+
this.input.setAttribute("aria-labelledby", Array.from(this._originalLabels.keys(), (label, index) => {
|
|
297
|
+
if (!label.id) label.id = `${this.input.id}-label-${index}`;
|
|
298
|
+
return label.id;
|
|
299
|
+
}).join(" "));
|
|
241
300
|
}
|
|
242
301
|
this.wrapper.prepend(this.input);
|
|
243
302
|
this._setValueToInput();
|
|
@@ -332,9 +391,13 @@ var FormSelect = class _FormSelect extends Component {
|
|
|
332
391
|
this.menuEl?.remove();
|
|
333
392
|
const hide = this.el.parentElement;
|
|
334
393
|
if (hide?.classList.contains("hide-select")) hide.replaceWith(this.el);
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
394
|
+
this._originalLabels.forEach((original, label) => {
|
|
395
|
+
for (const name of ["for", "id"]) {
|
|
396
|
+
if (original[name] === null) label.removeAttribute(name);
|
|
397
|
+
else label.setAttribute(name, original[name]);
|
|
398
|
+
}
|
|
399
|
+
});
|
|
400
|
+
this._labelPlaceholder?.replaceWith(this.labelEl);
|
|
338
401
|
if (!this.wrapper) return;
|
|
339
402
|
if (this._createdWrapper) {
|
|
340
403
|
this.wrapper.replaceWith(this.el);
|
|
@@ -456,4 +519,4 @@ var FormSelect = class _FormSelect extends Component {
|
|
|
456
519
|
export {
|
|
457
520
|
FormSelect
|
|
458
521
|
};
|
|
459
|
-
//# sourceMappingURL=chunk-
|
|
522
|
+
//# sourceMappingURL=chunk-XFJ452AZ.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 _originalLabels = new Map<HTMLLabelElement, { for: string | null; id: string | null }>();\n private _labelPlaceholder: Comment;\n private _form: HTMLFormElement | null;\n private _resetTimer: ReturnType<typeof setTimeout>;\n private _validationMessage: HTMLElement | null = null;\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._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 this._clearValidationError();\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.el.addEventListener('invalid', this._handleInvalid);\n this.el.addEventListener('focus', this._handleNativeFocus);\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.el.removeEventListener('invalid', this._handleInvalid);\n this.el.removeEventListener('focus', this._handleNativeFocus);\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 this._syncValidationError();\n };\n\n private _handleInvalid = (e: Event) => {\n if (e.defaultPrevented) return;\n if (!this._validationMessage) {\n this._validationMessage = document.createElement('small');\n this._validationMessage.id = this.input.id + '-error';\n this._validationMessage.className = 'supporting-text';\n this._validationMessage.style.color = 'var(--md-sys-color-error)';\n this.wrapper.append(this._validationMessage);\n this.input.setAttribute('aria-describedby',\n [this.input.getAttribute('aria-describedby'), this._validationMessage.id].filter(Boolean).join(' '));\n }\n this.input.ariaInvalid = 'true';\n this._syncValidationError();\n };\n\n // Native reporting chooses the control; static checks never focus. Wait until\n // reporting finishes so Firefox dismisses its native popup when focus moves.\n private _handleNativeFocus = () => queueMicrotask(() => {\n if (FormSelect.getInstance(this.el) === this && this.el.matches(':focus')) this.input.focus();\n });\n\n private _syncValidationError() {\n if (!this._validationMessage) return;\n if (this.el.willValidate && !this.el.validity.valid) {\n this._validationMessage.textContent = this.el.validationMessage;\n } else this._clearValidationError();\n }\n\n private _clearValidationError() {\n if (!this._validationMessage) return;\n const descriptions = this.input.getAttribute('aria-describedby')?.split(/\\s+/)\n .filter(id => id !== this._validationMessage.id).join(' ');\n if (descriptions) this.input.setAttribute('aria-describedby', descriptions);\n else this.input.removeAttribute('aria-describedby');\n this.input.ariaInvalid = this.el.ariaInvalid;\n this._validationMessage.remove();\n this._validationMessage = null;\n }\n\n private _handleReset = (e: Event) => {\n clearTimeout(this._resetTimer);\n this._resetTimer = setTimeout(() => {\n if (!e.defaultPrevented) {\n this._handleSelectChange();\n this._clearValidationError();\n }\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 Array.from(this.el.labels ?? []).forEach(label => {\n this._originalLabels.set(label, { for: label.getAttribute('for'), id: label.getAttribute('id') });\n });\n if (this.labelEl && !this.el.closest('label')) {\n this._labelPlaceholder = document.createComment('');\n this.labelEl.before(this._labelPlaceholder);\n }\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._labelPlaceholder) 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 hiddenDiv.ariaHidden = 'true';\n this.el.before(hiddenDiv);\n hiddenDiv.appendChild(this.el);\n if (this._createdWrapper) 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 this._originalLabels.forEach((_, label) => { label.htmlFor = this.input.id; });\n // Moving the first label can change DOM order. Preserve the original naming\n // order without overriding an author's explicit accessible name.\n if (this._labelPlaceholder && this._originalLabels.size > 1 && !this.input.getAttribute('aria-label') && !this.input.getAttribute('aria-labelledby')) {\n this.input.setAttribute('aria-labelledby', Array.from(this._originalLabels.keys(), (label, index) => {\n if (!label.id) label.id = `${this.input.id}-label-${index}`;\n return label.id;\n }).join(' '));\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 this._originalLabels.forEach((original, label) => {\n for (const name of ['for', 'id'] as const) {\n if (original[name] === null) label.removeAttribute(name);\n else label.setAttribute(name, original[name]);\n }\n });\n this._labelPlaceholder?.replaceWith(this.labelEl);\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": ";;;;;;;;;;;AAiBA,IAAM,YAA+B;AAAA,EACnC,SAAS;AAAA,EACT,aAAa,CAAC;AAChB;AAOO,IAAM,aAAN,MAAM,oBAAmB,UAA6B;AAAA,EA2B3D,YAAY,IAAuB,SAA4B;AAC7D,UAAM,IAAI,SAAS,WAAU;AAR/B,SAAQ,kBAAkB,oBAAI,IAAiE;AAI/F,SAAQ,qBAAyC;AAyIjD,+BAAsB,MAAM;AAC1B,WAAK,iBAAiB;AACtB,WAAK,mBAAmB;AACxB,WAAK,qBAAqB;AAAA,IAC5B;AAEA,SAAQ,iBAAiB,CAAC,MAAa;AACrC,UAAI,EAAE,iBAAkB;AACxB,UAAI,CAAC,KAAK,oBAAoB;AAC5B,aAAK,qBAAqB,SAAS,cAAc,OAAO;AACxD,aAAK,mBAAmB,KAAK,KAAK,MAAM,KAAK;AAC7C,aAAK,mBAAmB,YAAY;AACpC,aAAK,mBAAmB,MAAM,QAAQ;AACtC,aAAK,QAAQ,OAAO,KAAK,kBAAkB;AAC3C,aAAK,MAAM;AAAA,UAAa;AAAA,UACtB,CAAC,KAAK,MAAM,aAAa,kBAAkB,GAAG,KAAK,mBAAmB,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QAAC;AAAA,MACvG;AACA,WAAK,MAAM,cAAc;AACzB,WAAK,qBAAqB;AAAA,IAC5B;AAIA;AAAA;AAAA,SAAQ,qBAAqB,MAAM,eAAe,MAAM;AACtD,UAAI,YAAW,YAAY,KAAK,EAAE,MAAM,QAAQ,KAAK,GAAG,QAAQ,QAAQ,EAAG,MAAK,MAAM,MAAM;AAAA,IAC9F,CAAC;AAoBD,SAAQ,eAAe,CAAC,MAAa;AACnC,mBAAa,KAAK,WAAW;AAC7B,WAAK,cAAc,WAAW,MAAM;AAClC,YAAI,CAAC,EAAE,kBAAkB;AACvB,eAAK,oBAAoB;AACzB,eAAK,sBAAsB;AAAA,QAC7B;AAAA,MACF,GAAG,CAAC;AAAA,IACN;AAIA;AAAA;AAAA,gCAAuB,CAAC,MAAqB;AAC3C,UAAI,EAAE,QAAQ,OAAO,EAAE,QAAQ,QAAS,MAAK,mBAAmB,CAAC;AAAA,IACnE;AAEA,8BAAqB,CAAC,MAAkC;AACtD,QAAE,eAAe;AACjB,YAAM,gBAAiB,EAAE,OAAyB,QAAQ,IAAI;AAC9D,WAAK,qBAAqB,aAAa;AACvC,QAAE,gBAAgB;AAAA,IACpB;AAEA,SAAQ,qBAAqB,CAAC,MAAkB;AAC9C,YAAM,SAAS,EAAE;AACjB,UAAI,EAAE,kBAAkB,SAAU;AAClC,YAAM,KAAK,OAAO,QAAQ,mBAAmB;AAC7C,UAAI,IAAI,GAAI,MAAK,MAAM,aAAa,yBAAyB,GAAG,EAAE;AAAA,IACpE;AAoCA,6BAAoB,MAAM;AACxB,UAAI,KAAK,QAAQ,KAAK,KAAK,QAAQ;AACjC,aAAK,iBAAiB;AACtB,aAAK,mBAAmB;AAAA,MAC1B;AAAA,IACF;AAtPE,QAAI,KAAK,GAAG,UAAU,SAAS,iBAAiB,EAAG;AACnD,SAAK,GAAG,uBAAuB,IAAI;AAEnC,SAAK,UAAU;AAAA,MACb,GAAG,YAAW;AAAA,MACd,GAAG;AAAA,IACL;AAEA,SAAK,aAAa,KAAK,GAAG;AAC1B,SAAK,iBAAiB,KAAK,GAAG,YAAY;AAC1C,SAAK,GAAG,WAAW;AACnB,SAAK,UAAU,CAAC;AAChB,SAAK,kBAAkB;AACvB,SAAK,WAAW;AAChB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAA8B;AACvC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,OAAO,KACL,KACA,UAAsC,CAAC,GACZ;AAC3B,WAAO,MAAM,KAAK,KAAK,SAAS,WAAU;AAAA,EAC5C;AAAA,EAEA,OAAO,YAAY,IAA6B;AAC9C,WAAO,GAAG,uBAAuB;AAAA,EACnC;AAAA,EAEA,UAAU;AACR,SAAK,qBAAqB;AAC1B,SAAK,sBAAsB;AAI3B,SAAK,MAAM,QAAQ;AACnB,SAAK,YAAY;AACjB,SAAK,GAAG,WAAW,KAAK;AACxB,SAAK,GAAG,uBAAuB,IAAI;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,UAAU;AACR,QAAI,CAAC,KAAK,OAAQ;AAClB,SAAK,UAAU;AACf,UAAM,OAAO,KAAK,OAAO,YAAY;AACrC,UAAM,UAAU,KAAK,QAAQ,KAAK,WAAS,MAAM,SAAS,SAAS,KAAK,aAAa,CAAC,GAAG;AACzF,SAAK,MAAM,WAAW,KAAK,GAAG,QAAQ,WAAW;AACjD,SAAK,QAAQ,UAAU,OAAO,YAAY,KAAK,MAAM,QAAQ;AAC7D,QAAI,KAAK,MAAM,SAAU,MAAK,MAAM,MAAM;AAAA,aACjC,CAAC,KAAK,KAAM,MAAK,UAAU;AACpC,SAAK,MAAM,gBAAgB,uBAAuB;AAClD,SAAK,gBAAgB;AACrB,SAAK,oBAAoB;AACzB,QAAI,KAAK,KAAM,MAAK,KAAK,eAAe;AACxC,QAAI,KAAK,MAAM,QAAQ;AACrB,WAAK,KAAK,sBAAsB;AAChC,UAAI,QAAS,EAAC,KAAK,QAAQ,KAAK,WAAS,MAAM,OAAO,OAAO,GAAG,YAAY,KAAK,OAAO,MAAM;AAAA,IAChG;AAAA,EACF;AAAA,EAEA,sBAAsB;AACpB,SAAK,qBAAqB;AAC1B,SAAK,GAAG,iBAAiB,UAAU,KAAK,mBAAmB;AAC3D,SAAK,GAAG,iBAAiB,WAAW,KAAK,cAAc;AACvD,SAAK,GAAG,iBAAiB,SAAS,KAAK,kBAAkB;AACzD,SAAK,MAAM,iBAAiB,SAAS,KAAK,iBAAiB;AAC3D,SAAK,OAAO,iBAAiB,WAAW,KAAK,kBAAkB;AAC/D,SAAK,UAAU;AAAA,EACjB;AAAA,EAEQ,YAAY;AAClB,SAAK,OAAO,oBAAoB,SAAS,KAAK,YAAY;AAC1D,SAAK,QAAQ,KAAK,GAAG;AACrB,SAAK,OAAO,iBAAiB,SAAS,KAAK,YAAY;AAAA,EACzD;AAAA,EAEA,uBAAuB;AACrB,SAAK,sBAAsB;AAC3B,SAAK,GAAG,oBAAoB,UAAU,KAAK,mBAAmB;AAC9D,SAAK,GAAG,oBAAoB,WAAW,KAAK,cAAc;AAC1D,SAAK,GAAG,oBAAoB,SAAS,KAAK,kBAAkB;AAC5D,SAAK,OAAO,oBAAoB,SAAS,KAAK,iBAAiB;AAC/D,SAAK,QAAQ,oBAAoB,WAAW,KAAK,kBAAkB;AACnE,SAAK,OAAO,oBAAoB,SAAS,KAAK,YAAY;AAC1D,iBAAa,KAAK,WAAW;AAAA,EAC/B;AAAA,EAEQ,uBAAuB;AAC7B,SAAK,OAAO,iBAAiB,mBAAmB,EAAE,QAAQ,CAAC,OAAO;AAChE,SAAG,iBAAiB,SAAS,KAAK,kBAAkB;AACpD,SAAG,iBAAiB,WAAW,KAAK,oBAAoB;AAAA,IAC1D,CAAC;AAAA,EACH;AAAA,EAEQ,wBAAwB;AAC9B,SAAK,QAAQ,iBAAiB,mBAAmB,EAAE,QAAQ,CAAC,OAAO;AACjE,SAAG,oBAAoB,SAAS,KAAK,kBAAkB;AACvD,SAAG,oBAAoB,WAAW,KAAK,oBAAoB;AAAA,IAC7D,CAAC;AAAA,EACH;AAAA,EA6BQ,uBAAuB;AAC7B,QAAI,CAAC,KAAK,mBAAoB;AAC9B,QAAI,KAAK,GAAG,gBAAgB,CAAC,KAAK,GAAG,SAAS,OAAO;AACnD,WAAK,mBAAmB,cAAc,KAAK,GAAG;AAAA,IAChD,MAAO,MAAK,sBAAsB;AAAA,EACpC;AAAA,EAEQ,wBAAwB;AAC9B,QAAI,CAAC,KAAK,mBAAoB;AAC9B,UAAM,eAAe,KAAK,MAAM,aAAa,kBAAkB,GAAG,MAAM,KAAK,EAC1E,OAAO,QAAM,OAAO,KAAK,mBAAmB,EAAE,EAAE,KAAK,GAAG;AAC3D,QAAI,aAAc,MAAK,MAAM,aAAa,oBAAoB,YAAY;AAAA,QACrE,MAAK,MAAM,gBAAgB,kBAAkB;AAClD,SAAK,MAAM,cAAc,KAAK,GAAG;AACjC,SAAK,mBAAmB,OAAO;AAC/B,SAAK,qBAAqB;AAAA,EAC5B;AAAA,EAgCA,aAAmB,GAAQ,GAAc;AACvC,QAAI,MAAM,EAAG,QAAO;AACpB,QAAI,KAAK,QAAQ,KAAK,KAAM,QAAO;AACnC,QAAI,EAAE,WAAW,EAAE,OAAQ,QAAO;AAClC,aAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,EAAG,KAAI,EAAE,CAAC,MAAM,EAAE,CAAC,EAAG,QAAO;AAC7D,WAAO;AAAA,EACT;AAAA,EAEA,qBAAqB,eAA4B;AAC/C,QAAI,KAAK,GAAG,QAAQ,WAAW,EAAG;AAClC,QACE,CAAC,cAAc,UAAU,SAAS,UAAU,KAC5C,CAAC,cAAc,UAAU,SAAS,UAAU,GAC5C;AACA,YAAM,QAAQ,KAAK,QAAQ,KAAK,CAACA,WAAUA,OAAM,aAAa,aAAa;AAC3E,UAAI,CAAC,SAAS,MAAM,GAAG,QAAQ,WAAW,EAAG;AAC7C,YAAM,yBAAyB,KAAK,kBAAkB;AACtD,UAAI,KAAK,YAAY;AACnB,aAAK,sBAAsB,KAAK;AAAA,MAClC,OAAO;AACL,aAAK,aAAa;AAClB,aAAK,aAAa,KAAK;AAAA,MACzB;AACA,WAAK,oBAAoB;AACzB,YAAM,uBAAuB,KAAK,kBAAkB;AACpD,YAAM,sBAAsB,CAAC,KAAK,aAAa,wBAAwB,oBAAoB;AAC3F,UAAI;AACF,aAAK,GAAG;AAAA,UACN,IAAI,MAAM,UAAU,EAAE,SAAS,MAAM,YAAY,MAAM,UAAU,KAAK,CAAC;AAAA,QACzE;AAAA,IACJ;AACA,QAAI,CAAC,KAAK,WAAY,MAAK,MAAM,MAAM;AAAA,EACzC;AAAA,EASA,aAAa;AAIX,SAAK,UAAU,KAAK,GAAG,SAAS,CAAC,KAAK;AACtC,UAAM,KAAK,KAAK,GAAG,UAAU,CAAC,CAAC,EAAE,QAAQ,WAAS;AAChD,WAAK,gBAAgB,IAAI,OAAO,EAAE,KAAK,MAAM,aAAa,KAAK,GAAG,IAAI,MAAM,aAAa,IAAI,EAAE,CAAC;AAAA,IAClG,CAAC;AACD,QAAI,KAAK,WAAW,CAAC,KAAK,GAAG,QAAQ,OAAO,GAAG;AAC7C,WAAK,oBAAoB,SAAS,cAAc,EAAE;AAClD,WAAK,QAAQ,OAAO,KAAK,iBAAiB;AAAA,IAC5C;AAEA,SAAK,cAAc;AACnB,SAAK,kBAAkB;AACvB,QAAI,KAAK,GAAG,QAAQ,WAAW,EAAG,MAAK,QAAQ,UAAU,IAAI,UAAU;AAEvE,SAAK,SAAS,SAAS,cAAc,MAAM;AAC3C,SAAK,OAAO,KAAK,kBAAkB,MAAM,KAAK,CAAC;AAC/C,SAAK,OAAO,aAAa,WAAW,MAAM;AAC1C,SAAK,OAAO,aAAa,QAAQ,SAAS;AAC1C,SAAK,OAAO,sBAAsB,KAAK,WAAW,SAAS;AAC3D,QAAI,KAAK,WAAY,MAAK,OAAO,UAAU,IAAI,sBAAsB;AACrE,SAAK,cAAc;AACnB,SAAK,QAAQ,OAAO,KAAK,MAAM;AAE/B,SAAK,YAAY;AACjB,SAAK,YAAY;AACjB,SAAK,UAAU;AACf,SAAK,mBAAmB;AACxB,QAAI,KAAK,kBAAmB,MAAK,MAAM,MAAM,KAAK,OAAO;AAAA,EAC3D;AAAA,EAEQ,gBAAgB;AACtB,UAAM,SAAS,KAAK,GAAG;AACvB,UAAM,QACJ,UACA,OAAO,QAAQ,QAAQ,KACvB,CAAC,OAAO,cAAc,uBAAuB,KAC7C,CAAC,OAAO,cAAc,mCAAmC;AAC3D,QAAI,OAAO;AACT,WAAK,UAAU;AACf,WAAK,kBAAkB;AAAA,IACzB,OAAO;AACL,WAAK,UAAU,SAAS,cAAc,KAAK;AAC3C,WAAK,QAAQ,UAAU,IAAI,OAAO;AAClC,WAAK,kBAAkB;AACvB,WAAK,GAAG,OAAO,KAAK,OAAO;AAAA,IAC7B;AACA,QAAI,KAAK,QAAQ,QAAQ,SAAS,GAAG;AACnC,WAAK,QAAQ,UAAU,IAAI,GAAG,KAAK,QAAQ,QAAQ,MAAM,GAAG,EAAE,OAAO,OAAO,CAAC;AAAA,IAC/E;AAAA,EACF;AAAA,EAEQ,oBAAoB;AAC1B,UAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,cAAU,UAAU,IAAI,aAAa;AACrC,cAAU,aAAa;AACvB,SAAK,GAAG,OAAO,SAAS;AACxB,cAAU,YAAY,KAAK,EAAE;AAC7B,QAAI,KAAK,gBAAiB,MAAK,QAAQ,OAAO,SAAS;AAAA,EACzD;AAAA,EAEQ,cAAc;AACpB,SAAK,QAAQ,SAAS,cAAc,OAAO;AAC3C,SAAK,MAAM,KAAK,kBAAkB,MAAM,KAAK;AAG7C,SAAK,MAAM,UAAU,IAAI,gBAAgB,aAAa;AACtD,SAAK,MAAM,OAAO;AAClB,SAAK,MAAM,WAAW;AACtB,SAAK,MAAM,aAAa,eAAe,KAAK,OAAO,EAAE;AACrD,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,eAAe,KAAK,GAAG,aAAa,UAAU,EAAE,SAAS;AACpE,SAAK,MAAM,WAAW,KAAK,GAAG,QAAQ,WAAW;AACjD,SAAK,MAAM,aAAa,YAAY,KAAK,eAAe,SAAS,CAAC;AAElE,UAAM,QAAQ,KAAK,GAAG;AACtB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,EAAE,GAAG;AACrC,YAAM,OAAO,MAAM,CAAC;AACpB,UAAI,KAAK,KAAK,WAAW,OAAO,EAAG,MAAK,MAAM,aAAa,KAAK,MAAM,KAAK,KAAK;AAAA,IAClF;AAEA,SAAK,MAAM,aAAa,QAAQ,UAAU;AAC1C,SAAK,MAAM,aAAa,iBAAiB,SAAS;AAClD,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,aAAa,iBAAiB,KAAK,OAAO,EAAE;AACvD,SAAK,MAAM,cAAc;AAEzB,SAAK,gBAAgB,QAAQ,CAAC,GAAG,UAAU;AAAE,YAAM,UAAU,KAAK,MAAM;AAAA,IAAI,CAAC;AAG7E,QAAI,KAAK,qBAAqB,KAAK,gBAAgB,OAAO,KAAK,CAAC,KAAK,MAAM,aAAa,YAAY,KAAK,CAAC,KAAK,MAAM,aAAa,iBAAiB,GAAG;AACpJ,WAAK,MAAM,aAAa,mBAAmB,MAAM,KAAK,KAAK,gBAAgB,KAAK,GAAG,CAAC,OAAO,UAAU;AACnG,YAAI,CAAC,MAAM,GAAI,OAAM,KAAK,GAAG,KAAK,MAAM,EAAE,UAAU,KAAK;AACzD,eAAO,MAAM;AAAA,MACf,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,IACd;AAEA,SAAK,QAAQ,QAAQ,KAAK,KAAK;AAC/B,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEQ,cAAc;AACpB,UAAM,QAAQ,SAAS,cAAc,MAAM;AAC3C,UAAM,UAAU,IAAI,OAAO;AAC3B,UAAM,aAAa,eAAe,MAAM;AACxC,SAAK,QAAQ,QAAQ,KAAK;AAAA,EAC5B;AAAA,EAEQ,YAAY;AAClB,QAAI,KAAK,GAAG,QAAQ,WAAW,EAAG;AAClC,UAAM,cAAc,EAAE,GAAG,KAAK,QAAQ,YAAY;AAClD,gBAAY,eAAe;AAC3B,UAAM,gBAAgB,YAAY;AAClC,UAAM,iBAAiB,YAAY;AACnC,gBAAY,YAAY,MAAM;AAC5B,YAAM,iBAAiB,KAAK,OAAO,cAAc,WAAW;AAC5D,UAAI,gBAAgB;AAClB,aAAK,KAAK,eAAe,CAAC,GAAG,eAAe,WAAW,QAAQ,EAAE,QAAQ,cAAc;AACvF,aAAK,KAAK,kBAAkB;AAC5B,YAAI,KAAK,KAAK,cAAc;AAC1B,cAAI,eACF,eAAe,sBAAsB,EAAE,MACvC,KAAK,OAAO,sBAAsB,EAAE;AACtC,0BAAgB,KAAK,OAAO,eAAe;AAC3C,eAAK,OAAO,YAAY;AAAA,QAC1B;AACA,YAAI,eAAe,GAAI,MAAK,MAAM,aAAa,yBAAyB,eAAe,EAAE;AAAA,MAC3F;AACA,WAAK,MAAM,eAAe;AAC1B,UAAI,iBAAiB,OAAO,kBAAkB;AAC5C,sBAAc,KAAK,KAAK,MAAM,KAAK,EAAE;AAAA,IACzC;AACA,gBAAY,aAAa,MAAM;AAC7B,WAAK,MAAM,eAAe;AAC1B,WAAK,MAAM,gBAAgB,uBAAuB;AAClD,UAAI,kBAAkB,OAAO,mBAAmB;AAC9C,uBAAe,KAAK,KAAK,MAAM,KAAK,EAAE;AAAA,IAC1C;AACA,gBAAY,eAAe;AAC3B,SAAK,OAAO,KAAK,KAAK,KAAK,OAAO,WAAW;AAAA,EAC/C;AAAA,EAEQ,iBAA8D;AACpE,WACE,MAAM,KAAK,KAAK,GAAG,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,UAAU,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC;AAAA,EAE3F;AAAA,EAEQ,gBAAgB;AACtB,SAAK,gBAAgB,KAAK,eAAe;AACzC,SAAK,UAAU,CAAC;AAChB,SAAK,cAAc,QAAQ,CAAC,eAAe;AACzC,UAAI,WAAW,YAAY,UAAU;AACnC,cAAM,gBAAgB,KAAK;AAAA,UACzB;AAAA,UACA,KAAK,aAAa,aAAa;AAAA,QACjC;AACA,aAAK,mBAAmB,YAAiC,aAAa;AAAA,MACxE,WAAW,WAAW,YAAY,YAAY;AAC5C,cAAM,UAAU,eAAe,MAAM,KAAK;AAC1C,cAAM,cAAc,SAAS,cAAc,IAAI;AAC/C,oBAAY,UAAU,IAAI,UAAU;AACpC,oBAAY,WAAW;AACvB,oBAAY,aAAa,QAAQ,OAAO;AACxC,oBAAY,aAAa,mBAAmB,OAAO;AAInD,cAAM,aAAa,SAAS,cAAc,MAAM;AAChD,mBAAW,KAAK;AAChB,mBAAW,aAAa,QAAQ,cAAc;AAC9C,mBAAW,cAAc,WAAW,aAAa,OAAO,KAAK;AAC7D,oBAAY,gBAAgB,UAAU;AACtC,aAAK,OAAO,OAAO,WAAW;AAE9B,cAAM,gBAAgB,CAAC;AACvB,cAAM,gBACJ,MAAM,KAAK,WAAW,QAAQ,EAAE,OAAO,CAAC,OAAO,GAAG,YAAY,QAAQ;AAExE,sBAAc,QAAQ,CAAC,UAAU;AAC/B,gBAAM,gBAAgB,KAAK,+BAA+B,OAAO,iBAAiB;AAClF,wBAAc,KAAK,cAAc,EAAE;AACnC,eAAK,mBAAmB,OAAO,aAAa;AAAA,QAC9C,CAAC;AACD,oBAAY,aAAa,aAAa,cAAc,KAAK,GAAG,CAAC;AAAA,MAC/D;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,kBAAkB;AACxB,SAAK,sBAAsB;AAC3B,SAAK,OAAO,gBAAgB;AAC5B,SAAK,cAAc;AACnB,SAAK,qBAAqB;AAC1B,SAAK,MAAM,mBAAmB;AAAA,EAChC;AAAA,EAEA,mBAAmB,YAA+B,eAA4B;AAC5E,SAAK,QAAQ,KAAK,EAAE,IAAI,YAAY,UAAU,cAAc,CAAC;AAAA,EAC/D;AAAA,EAEA,cAAc;AACZ,SAAK,SAAS,cAAc,iBAAiB,GAAG,OAAO;AACvD,SAAK,OAAO,OAAO;AACnB,SAAK,QAAQ,OAAO;AACpB,UAAM,OAAO,KAAK,GAAG;AACrB,QAAI,MAAM,UAAU,SAAS,aAAa,EAAG,MAAK,YAAY,KAAK,EAAE;AACrE,SAAK,gBAAgB,QAAQ,CAAC,UAAU,UAAU;AAChD,iBAAW,QAAQ,CAAC,OAAO,IAAI,GAAY;AACzC,YAAI,SAAS,IAAI,MAAM,KAAM,OAAM,gBAAgB,IAAI;AAAA,YAClD,OAAM,aAAa,MAAM,SAAS,IAAI,CAAC;AAAA,MAC9C;AAAA,IACF,CAAC;AACD,SAAK,mBAAmB,YAAY,KAAK,OAAO;AAChD,QAAI,CAAC,KAAK,QAAS;AACnB,QAAI,KAAK,iBAAiB;AACxB,WAAK,QAAQ,YAAY,KAAK,EAAE;AAAA,IAClC,OAAO;AACL,WAAK,QAAQ,UAAU,OAAO,UAAU;AACxC,UAAI,KAAK,QAAQ,QAAQ,SAAS,GAAG;AACnC,aAAK,QAAQ,UAAU,OAAO,GAAG,KAAK,QAAQ,QAAQ,MAAM,GAAG,EAAE,OAAO,OAAO,CAAC;AAAA,MAClF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,+BACE,YACA,MACA;AACA,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,OAAG,KAAK,mBAAmB,MAAM,KAAK;AACtC,OAAG,aAAa,QAAQ,QAAQ;AAChC,OAAG,WAAW;AACd,UAAM,WAAW,KAAK,GAAG,QAAQ,WAAW,KAAK,WAAW,QAAQ,WAAW;AAC/E,QAAI,UAAU;AACZ,SAAG,UAAU,IAAI,UAAU;AAC3B,SAAG,eAAe;AAClB,SAAG,WAAW;AAAA,IAChB;AACA,QAAI,SAAS,kBAAmB,IAAG,UAAU,IAAI,IAAI;AAKrD,UAAM,aAAa,WAAW;AAC9B,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,QAAI,KAAK,cAAc,CAAC,UAAU;AAChC,YAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,YAAM,WAAW,SAAS,cAAc,OAAO;AAC/C,eAAS,OAAO;AAChB,eAAS,WAAW;AACpB,YAAM,YAAY,SAAS,cAAc,MAAM;AAC/C,gBAAU,cAAc;AACxB,YAAM,OAAO,UAAU,SAAS;AAChC,WAAK,YAAY,KAAK;AAAA,IACxB,OAAO;AACL,WAAK,cAAc;AAAA,IACrB;AACA,OAAG,YAAY,IAAI;AAEnB,UAAM,UAAU,WAAW,aAAa,WAAW;AACnD,QAAI;AACJ,QAAI,SAAS;AACX,UAAI;AACF,cAAM,MAAM,IAAI,IAAI,SAAS,KAAK,GAAG,cAAc,OAAO;AAC1D,YAAI,CAAC,SAAS,UAAU,OAAO,EAAE,SAAS,IAAI,QAAQ,KACpD,sEAAsE,KAAK,IAAI,IAAI,GAAG;AACtF,qBAAW;AAAA,QACb;AAAA,MACF,QAAQ;AAAA,MAAkD;AAAA,IAC5D;AAGA,UAAM,UAAU,WAAW,aAAa,OAAO,GAAG,MAAM,GAAG,EAAE,OAAO,OAAO;AAC3E,QAAI,UAAU;AACZ,YAAM,MAAM,SAAS,cAAc,KAAK;AACxC,UAAI,SAAS,OAAQ,KAAI,UAAU,IAAI,GAAG,OAAO;AACjD,UAAI,MAAM,SAAS;AACnB,UAAI,aAAa;AACjB,SAAG,QAAQ,GAAG;AAAA,IAChB;AACA,SAAK,OAAO,OAAO,EAAE;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,OAAoB;AAC/B,UAAM,GAAG,WAAW;AACpB,UAAM,SAAS,UAAU,IAAI,UAAU;AACvC,UAAM,SAAS,eAAe;AAC9B,UAAM,WAA6B,MAAM,SAAS,cAAc,wBAAwB;AACxF,QAAI,SAAU,UAAS,UAAU;AAAA,EACnC;AAAA,EAEA,eAAe,OAAoB;AACjC,UAAM,GAAG,WAAW;AACpB,UAAM,SAAS,UAAU,OAAO,UAAU;AAC1C,UAAM,SAAS,eAAe;AAC9B,UAAM,WAA6B,MAAM,SAAS,cAAc,wBAAwB;AACxF,QAAI,SAAU,UAAS,UAAU;AAAA,EACnC;AAAA,EAEA,eAAe;AACb,SAAK,QAAQ,QAAQ,CAAC,UAAU,KAAK,eAAe,KAAK,CAAC;AAAA,EAC5D;AAAA,EAEA,iBAAiB,OAAoB;AACnC,UAAM,aAAa,KAAK,kBAAkB;AAC1C,WAAO,WAAW,KAAK,CAAC,cAAc,cAAc,MAAM,GAAG,KAAK;AAAA,EACpE;AAAA,EAEA,sBAAsB,OAAoB;AACxC,QAAI,KAAK,iBAAiB,KAAK,EAAG,MAAK,eAAe,KAAK;AAAA,QACtD,MAAK,aAAa,KAAK;AAAA,EAC9B;AAAA,EAEA,sBAA2C;AACzC,WAAO,MAAM,UAAU,OAAO;AAAA,MAC5B,KAAK,GAAG;AAAA,MACR,CAAC,eAAkC;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,mBAAmB;AACjB,SAAK,MAAM,QAAQ,KAAK,oBAAoB,EAAE,IAAI,YAAU,OAAO,YAAY,KAAK,CAAC,EAAE,KAAK,IAAI;AAAA,EAClG;AAAA,EAEA,qBAAqB;AACnB,SAAK,QAAQ,QAAQ,CAAC,UAAU;AAC9B,YAAM,mBAAmB,MAAM,GAAG;AAClC,YAAM,KAAuB,MAAM,SAAS,cAAc,wBAAwB;AAClF,UAAI,GAAI,IAAG,UAAU;AACrB,UAAI,kBAAkB;AACpB,aAAK,gBAAgB,KAAK,QAAQ,MAAM,QAAQ;AAAA,MAClD,OAAO;AACL,cAAM,SAAS,UAAU,OAAO,UAAU;AAC1C,cAAM,SAAS,eAAe;AAAA,MAChC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,gBAAgB,IAAiB,IAAiB;AAChD,QAAI,CAAC,GAAI;AACT,QAAI,CAAC,KAAK;AACR,SAAG,iBAAiB,aAAa,EAAE,QAAQ,CAAC,QAAQ,IAAI,UAAU,OAAO,UAAU,CAAC;AACtF,OAAG,UAAU,IAAI,UAAU;AAC3B,OAAG,eAAe;AAAA,EACpB;AAAA,EAEA,oBAAoB;AAClB,WAAO,KAAK,oBAAoB,EAAE,IAAI,CAAC,eAAe,WAAW,KAAK;AAAA,EACxE;AACF;",
|
|
6
|
+
"names": ["value"]
|
|
7
|
+
}
|