@jblehm/super-list 1.0.29 → 1.0.30
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/README.md +1 -1
- package/dist/ListInputComponents/ItemList.vue.d.ts +0 -8
- package/dist/index.css +1 -1
- package/dist/super-list.js +128 -133
- package/dist/super-list.js.map +1 -1
- package/dist/super-list.umd.cjs +2 -2
- package/dist/super-list.umd.cjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"super-list.umd.cjs","sources":["../src/DropDownLibrary.ts","../src/ListInputComponents/ListTextInput.vue","../src/ListInputComponents/default-tick.vue","../src/ListInputComponents/ListItem.vue","../src/ListInputComponents/ItemList.vue","../src/ListInputComponents/default-arrow.vue","../src/ListInputComponents/ListButton.vue","../src/super-list.vue"],"sourcesContent":["export interface DocumentViewChangeListener {\n targetNode: HTMLElement\n observe(): void\n unobserve(): void\n pauseMutationObserver(): void\n unpauseMutationObserver(): void\n}\n\nexport class DocumentViewChangeListener implements DocumentViewChangeListener {\n private readonly eventsTypes: string[] = ['resize', 'load', 'scroll', 'wheel', 'touchmove']\n private readonly config: MutationObserverInit = {\n attributes: true,\n childList: true,\n subtree: true\n }\n private mutationObserver: MutationObserver\n private callbackFunction: EventListenerOrEventListenerObject\n\n constructor(targetFunction: Function, targetNode: any = document.body) {\n this.targetNode = targetNode\n this.callbackFunction = ((event: any) =>\n targetFunction(event)) as EventListenerOrEventListenerObject\n this.mutationObserver = new MutationObserver((() => targetFunction()) as MutationCallback)\n }\n\n public observe(): void {\n this.mutationObserver.observe(this.targetNode, this.config)\n for (const eventType of this.eventsTypes) this.addListener(eventType)\n this.addResizeListener()\n this.addTransitionEndListener()\n }\n\n pauseMutationObserver(): void {\n this.mutationObserver.disconnect()\n }\n\n unpauseMutationObserver(): void {\n this.mutationObserver.observe(this.targetNode, this.config)\n }\n\n public unobserve(): void {\n this.mutationObserver.disconnect()\n for (const eventType of this.eventsTypes) this.removeListener(eventType)\n this.removeResizeListener()\n this.removeTransitionEndListener()\n }\n\n private addListener(eventType: string): void {\n document.addEventListener(eventType, this.callbackFunction, true)\n }\n\n private removeListener(eventType: string): void {\n document.removeEventListener(eventType, this.callbackFunction, true)\n }\n\n private addTransitionEndListener(): void {\n this.targetNode.addEventListener('transitionend', this.callbackFunction)\n }\n\n private removeTransitionEndListener(): void {\n this.targetNode.removeEventListener('transitionend', this.callbackFunction)\n }\n\n private addResizeListener(): void {\n window.addEventListener('resize', this.callbackFunction)\n }\n\n private removeResizeListener(): void {\n window.removeEventListener('resize', this.callbackFunction)\n }\n}\n\nexport function getLabelString(\n value: string | number | object | null | undefined,\n customLabelGetFunction: Function | null | undefined,\n objectLabelKeyName: string | null,\n enumKeyToLabelObjectArray?: EnumType[]\n): string {\n if (customLabelGetFunction != null) return customLabelGetFunction(value)\n if (value == null) return ''\n if (typeof value === 'object') return value[objectLabelKeyName as keyof typeof value]\n if (enumKeyToLabelObjectArray) return getEnumLabel(value, enumKeyToLabelObjectArray)\n return '' + value\n}\n\nfunction getEnumLabel(value: string | number, enumKeyArray: EnumType[]): string {\n return (enumKeyArray.find((eT: EnumType): boolean => eT.type === value)?.label ?? '') as string\n}\n\nexport type ListRequest = (maxNumItems: number, stringFilter?: string) => Promise<DataSet<any>>\n\nexport type EnumType = { type: string; label: string }\n\nexport type DataSet<T> = { data: T[]; totalNum: number; modelName?: string }\n\nexport interface AbortablePromise {\n abortController: AbortController\n func: Function\n then: Function\n}\n\nexport class AbortablePromise implements AbortablePromise {\n constructor() {\n this.abortController = new AbortController()\n this.func = (): void => {}\n this.then = (): void => {}\n }\n\n async abortablePromise(signal: AbortSignal, asyncFunc: Function, then: Function): Promise<any> {\n const response = await asyncFunc()\n if (signal.aborted) return\n return then(response)\n }\n\n setFunc(func: Function): void {\n this.func = func\n }\n\n setThen(then: Function): void {\n this.then = then\n }\n\n execute(): Promise<any> {\n return this.abortablePromise(this.abortController.signal, this.func, this.then)\n }\n\n abort(reason?: string): void {\n this.abortController.abort(reason || 'Aborted By Controller.')\n this.abortController = new AbortController()\n }\n\n resetAndExecute(func: Function, then: Function): Promise<any> {\n this.abort('New Request From Controller.')\n this.setFunc(func)\n this.setThen(then)\n return this.execute()\n }\n}\n","<template>\n <input\n ref=\"textInputRef\"\n :tabindex=\"enableTextFilter ? 0 : -1\"\n @keydown.enter=\"parentMethods.press($event)\"\n @keydown.space=\"parentMethods.press()\"\n @keydown.esc=\"parentMethods.press($event)\"\n @keydown.up=\"parentMethods.press($event)\"\n @keydown.down=\"parentMethods.press($event)\"\n @focusin=\"focusInHandler($event)\"\n @focusout=\"focusOutHandler($event)\"\n @input=\"updateQuery($event as InputEvent)\"\n type=\"text\"\n aria-autocomplete=\"none\"\n autocomplete=\"off\"\n :placeholder=\"placeholder\"\n :size=\"textInputSize\"\n :class=\"[\n pointerEventsClass,\n textInputColourClass,\n { 'text-filter-disabled': !enableTextFilter }\n ]\"\n class=\"list-filter-text-input\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, type PropType, ref } from 'vue'\n\nconst emit = defineEmits({\n 'update:selected': null,\n 'update:query': null,\n 'update:press': null\n})\n\nconst props = defineProps({\n enableTextFilter: {\n type: Boolean as PropType<boolean | null>,\n required: true\n },\n placeholder: {\n type: String as PropType<string | undefined>,\n default: undefined\n },\n enableButtonClick: {\n type: Boolean as PropType<boolean | null>,\n default: true\n },\n parentMethods: {\n type: Object,\n required: true\n },\n showDropDown: {\n type: Boolean,\n required: true\n }\n})\nconst textInputRef = ref(null)\n\nfunction focusInHandler(e: FocusEvent) {\n if ('sourceCapabilities' in e && e.sourceCapabilities == null) props.parentMethods.closeList()\n else props.parentMethods.openList()\n}\n\nfunction focusOutHandler(event: FocusEvent) {\n props.parentMethods.unfocus(event)\n}\n\nfunction updateQuery(event: any) {\n if (event?.target?.value != undefined) emit('update:query', event.target.value)\n}\n\nconst textInputSize = computed(() => {\n const refLength: number = textInputRef?.value ? (textInputRef.value as string).length : 0\n const placeHolderLength: number = props.placeholder?.length || 0\n return refLength > 0 ? refLength : placeHolderLength > 0 ? placeHolderLength : 5\n})\n\nconst pointerEventsClass = computed(() => {\n const enable: boolean = props.enableButtonClick === true && props.enableTextFilter === true\n return enable ? '' : 'click-through'\n})\n\nconst textInputColourClass = computed(() => {\n const dark: boolean = (props.showDropDown && !props.enableTextFilter) || !props.showDropDown\n return dark ? 'dark-placeholder-text' : 'light-placeholder-text'\n})\n\nfunction blurInput() {\n if (textInputRef?.value) {\n const input: HTMLInputElement = textInputRef.value\n input.blur()\n input.value = ''\n }\n}\n\nfunction focusInput() {\n if (textInputRef?.value) (textInputRef.value as HTMLInputElement).focus()\n}\n\ndefineExpose({ blurInput, focusInput, textInputRef })\n</script>\n\n<style scoped>\n.list-filter-text-input {\n color: var(--superlist-text-colour, rgb(17, 24, 39));\n text-align: center;\n padding: 0.125rem 2rem 0.125rem 0.5rem !important;\n width: 100%;\n height: 100%;\n margin: 0;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n background-color: transparent;\n border: 0 none;\n pointer-events: auto;\n cursor: text;\n}\n\n.list-filter-text-input:focus,\n.list-filter-text-input:focus-visible,\n.list-filter-text-input:active {\n text-align: left;\n}\n\n.click-through {\n pointer-events: none;\n}\n\n.dark-placeholder-text::placeholder {\n color: var(--superlist-text-colour, rgb(17, 24, 39));\n}\n\n.light-placeholder-text::placeholder {\n color: var(--superlist-disabled-text-colour, rgb(120, 125, 130));\n}\n\n.text-filter-disabled {\n background-color: transparent;\n border: none;\n outline: none;\n box-shadow: none;\n filter: none;\n}\n\n@media (min-width: 640px) {\n .list-filter-text-input {\n font-size: 0.875rem;\n line-height: 1.5rem;\n }\n}\n</style>\n","<template>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n data-slot=\"icon\"\n viewBox=\"0 -16 16 17\"\n >\n <path\n shape-rendering=\"geometricPrecision\"\n d=\"M 6 -2.25 L 13.75 -14 A 0.5 0.5 90 0 1 15 -13 L 6.5 -0.5 A 2 1 90 0 1 5.5 -0.5 L 1 -6 A 0.5 0.5 90 0 1 2.25 -7 Z\"\n />\n </svg>\n</template>\n","<template>\n <li\n v-for=\"(listItem, index) in filteredListItems\"\n :key=\"index\"\n ref=\"items\"\n @keyup.enter=\"parentMethods.press($event)\"\n @keyup.space=\"parentMethods.press($event)\"\n @keyup.esc=\"parentMethods.press($event)\"\n @keydown.up=\"parentMethods.press($event)\"\n @keydown.down=\"parentMethods.press($event)\"\n @focusout=\"parentMethods.unfocus($event)\"\n tabindex=\"-1\"\n @mousedown.left=\"parentMethods.updatedSelected(listItem)\"\n :class=\"[\n { 'list-option-selected': selectedIndex === index },\n {\n 'list-option-active':\n filteredListItems.length === 1 || (focusedIndex === index && !mouseHoveringOnList)\n },\n 'list-option'\n ]\"\n >\n <span class=\"list-item-span\">{{ parentMethods.getLabel(listItem) }}</span>\n <default-tick v-if=\"selectedIndex === index\" class=\"list-item-icon\" aria-hidden=\"true\" />\n </li>\n <li\n v-if=\"filteredListItems.length === 0\"\n @keyup.enter=\"parentMethods.press($event)\"\n @keyup.space=\"parentMethods.press($event)\"\n @keyup.esc=\"parentMethods.press($event)\"\n @keydown.up=\"parentMethods.press($event)\"\n @keydown.down=\"parentMethods.press($event)\"\n @focusout=\"parentMethods.unfocus($event)\"\n @mousedown.left=\"parentMethods.closeList($event)\"\n tabindex=\"-1\"\n class=\"list-option-message\"\n >\n <span class=\"list-item-span\">No Items To Display.</span>\n </li>\n <li\n v-if=\"totalOptionsCount && totalOptionsCount > (filteredListItems?.length || 0)\"\n @keyup.enter=\"parentMethods.press($event)\"\n @keyup.space=\"parentMethods.press($event)\"\n @keyup.esc=\"parentMethods.press($event)\"\n @keydown.up=\"parentMethods.press($event)\"\n @keydown.down=\"parentMethods.press($event)\"\n @focusout=\"parentMethods.unfocus($event)\"\n @mousedown.left=\"parentMethods.closeList($event)\"\n tabindex=\"-1\"\n class=\"list-option-message\"\n >\n <span class=\"list-item-span\">\n +{{ totalOptionsCount - filteredListItems?.length || 0 }} More Items...</span\n >\n </li>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, type ShallowRef, useTemplateRef, watch } from 'vue'\nimport DefaultTick from './default-tick.vue'\nconst props = defineProps({\n mouseHoveringOnList: {\n type: Boolean,\n default: false\n },\n filteredListItems: {\n type: Array,\n default: () => []\n },\n focusedIndex: {\n type: Number,\n default: null\n },\n selectedIndex: {\n type: Number,\n default: null\n },\n listElementOpenAndVisible: {\n type: Boolean,\n default: false\n },\n parentMethods: {\n type: Object,\n required: true\n },\n showDropDown: {\n type: Boolean,\n default: false\n },\n totalOptionsCount: {\n type: Number,\n default: 0\n }\n})\ntype HTMLLIElementOrArray = HTMLLIElement | HTMLLIElement[] | null\nconst iRefs: Readonly<ShallowRef<HTMLLIElementOrArray>> = useTemplateRef('items')\n\nconst focusedLi = computed((): HTMLElement | null => {\n if (!iRefs?.value) return null\n const refs: Array<HTMLLIElement | null> = Array.isArray(iRefs.value) ? iRefs.value : [iRefs.value]\n const focused = refs[props.focusedIndex]\n if (!focused) return null\n const isObject: boolean = typeof focused == 'object'\n const hasScrollIntoView: boolean = isObject && 'scrollIntoView' in focused\n const hasScrollFunc: boolean = hasScrollIntoView && typeof focused['scrollIntoView'] == 'function'\n return hasScrollFunc ? focused : null\n})\n\nwatch(\n () => props.showDropDown,\n () => scrollHighlightedListItemToTop()\n)\nwatch(\n () => props.listElementOpenAndVisible,\n () => scrollHighlightedListItemIntoView()\n)\nwatch(\n () => focusedLi.value,\n () => scrollHighlightedListItemIntoView()\n)\n\nfunction scrollHighlightedListItemToTop(): void {\n if (!props.showDropDown || !focusedLi?.value?.parentElement?.parentElement) return\n focusedLi.value.parentElement.parentElement.scrollTop = focusedLi.value.offsetTop\n}\n\nfunction scrollHighlightedListItemIntoView(): void {\n const li = focusedLi.value\n const liParent = li?.parentElement?.parentElement\n if (!props.showDropDown || !li || !liParent) return\n const aboveTop = li.offsetTop - liParent.scrollTop < 0\n const belowBottom = li.offsetTop + li.offsetHeight - liParent.scrollTop > liParent.clientHeight\n if (aboveTop) liParent.scrollTop = li.offsetTop\n if (belowBottom) liParent.scrollTop = li.offsetTop + li.clientHeight - liParent.clientHeight\n}\n</script>\n\n<style scoped>\n.list-option {\n text-transform: capitalize;\n display: inline-flex;\n width: 100%;\n position: relative;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n background-color: transparent;\n color: var(--superlist-text-colour, rgb(55, 60, 65));\n transition-property: font-weight, background-color, color, text-shadow;\n transition-duration: 500ms;\n transition-timing-function: ease;\n font-weight: 400;\n text-shadow: 1px 1px 3px var(--superlist-background-colour, white);\n}\n\n.list-option:focus-visible,\n.list-option > span:focus-visible {\n outline: none;\n}\n\n.list-option-selected {\n font-weight: 600;\n}\n\n.list-option-message {\n text-shadow: 1px 1px 3px var(--superlist-background-colour, white);\n text-transform: capitalize;\n display: inline-flex;\n width: 100%;\n position: relative;\n cursor: default;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n background-color: transparent;\n color: var(--superlist-disabled-text-colour, rgb(120, 125, 130));\n}\n\n.list-option-active:hover,\n.list-option-active,\n.list-option-selected:hover,\n.list-option:hover {\n font-weight: 600;\n background-color: var(--superlist-theme-colour, rgb(77, 168, 11, 0.8));\n color: var(--superlist-background-colour, white);\n text-shadow: 1px 1px 3px var(--superlist-theme-colour, rgb(77, 168, 11, 0.8));\n transition-duration: 0s !important;\n}\n\n.list-item-icon {\n display: flex;\n height: 1rem;\n width: 1rem;\n position: absolute;\n right: 0.7rem;\n margin-top: -0.1rem;\n align-self: center;\n}\n\n.list-item-span {\n padding: 0.5rem 1.75rem 0.5rem 0.75rem;\n width: 100%;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n</style>\n","<template>\n <div ref=\"dropDownButtonContainer\" class=\"super-list-button-container\">\n <slot></slot>\n </div>\n <div\n id=\"super-list-select-list\"\n ref=\"listContainerRef\"\n @mouseenter=\"parentMethods.mouseOverList()\"\n tabindex=\"-1\"\n :class=\"[\n 'select-list',\n reverseList ? 'list-reverse' : 'list-normal',\n { 'select-list-open': showDropDown },\n { 'no-scroll': noScroll && listElementOpenAndVisible },\n { 'select-list-fixed': listElementOpenAndVisible },\n { 'select-list-scrollable': !noScroll }\n ]\"\n @keydown.space=\"preventSpaceScrollingList($event)\"\n @mouseup.left=\"refocusTextInput($event)\"\n >\n <ul tabindex=\"-1\" ref=\"dropDownListUL\" class=\"list-content\">\n <list-item\n :filteredListItems=\"listItemsToDisplay\"\n :mouseHoveringOnList=\"mouseHoveringOnList\"\n :focusedIndex=\"focusedIndex\"\n :selectedIndex=\"selectedIndex\"\n :listElementOpenAndVisible=\"listElementOpenAndVisible\"\n :parent-methods=\"parentMethods\"\n :show-drop-down=\"showDropDown\"\n :total-options-count=\"totalOptionsCount\"\n />\n </ul>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n computed,\n type ComputedRef,\n nextTick,\n onMounted,\n onUnmounted,\n type PropType,\n ref,\n watch\n} from 'vue'\nimport ListItem from '../ListInputComponents/ListItem.vue'\nimport { DocumentViewChangeListener } from '../DropDownLibrary'\n\nconst emit = defineEmits(['reverseDropDownList'])\n\nconst props = defineProps({\n mouseHoveringOnList: {\n type: Boolean,\n default: false\n },\n filteredListItems: {\n type: Array,\n default: () => []\n },\n focusedIndex: {\n type: Number,\n default: null\n },\n selectedIndex: {\n type: Number,\n default: null\n },\n parentMethods: {\n type: Object,\n required: true\n },\n showDropDown: {\n type: Boolean,\n required: true\n },\n maxListHeightPX: {\n type: Number,\n required: true\n },\n listAnimationDurationMs: {\n type: Number as PropType<number>,\n required: true\n },\n blockListChange: {\n type: Boolean,\n required: true\n },\n totalOptionsCount: {\n type: Number,\n default: 0\n },\n enableScrollClose: {\n type: Boolean,\n default: true\n },\n enableTextFilter: {\n type: Boolean as PropType<boolean | null>,\n required: true\n }\n})\n\nconst dropDownButtonContainer = ref<HTMLElement | null>(null)\nconst dropDownListUL = ref<HTMLElement | null>(null)\nconst listContainerRef = ref<HTMLElement | null>(null)\nconst offsetLeft = ref<number>(0)\nconst offsetTop = ref<number>(0)\nconst offsetBottom = ref<number>(0)\nconst listOffset = ref<number>(0)\nconst parentWidthPx = ref<string>('0px')\nconst listElementOpenAndVisible = ref<boolean>(false)\nconst listItemsToDisplay = ref<any[]>([])\nconst listHeightPx = ref<number>(0)\n\nconst reverseList = computed((): boolean => {\n if (!listElementOpenAndVisible.value || window?.innerHeight == null) return false\n return sufficientRoomAbove() && insufficientRoomBelow()\n})\n\nconst noScroll = computed((): boolean => {\n return props.maxListHeightPX >= listHeightPx.value\n})\n\nwatch(\n () => reverseList.value,\n (reverse: boolean) => emit('reverseDropDownList', reverse),\n { immediate: true }\n)\n\nconst parentXPx = computed((): string => offsetLeft.value + 'px')\nconst parentYPx = computed((): string => listOffset.value + 'px')\n\ndefineExpose({ listContainerRef })\n\nconst preventSpaceScrollingList = (event: any) => {\n if (event?.key && event.key === ' ') event.preventDefault()\n}\n\nconst refocusTextInput = (event: MouseEvent) => {\n const list = listContainerRef?.value as HTMLElement | null\n const target = event.target as HTMLElement | null\n if (!(list && target && list.contains(target)) || list.isEqualNode(target))\n props.parentMethods.focusInput()\n}\n\nfunction getListULHeight(): number {\n return dropDownListUL?.value ? (dropDownListUL?.value as HTMLElement).clientHeight : 0\n}\n\nfunction displayableListHeight(): number {\n if (!listElementOpenAndVisible.value || getListULHeight() === 0) return props.maxListHeightPX\n const ulHt: number = getListULHeight() === 0 ? props.maxListHeightPX : +getListULHeight()\n return props.maxListHeightPX && props.maxListHeightPX > ulHt ? ulHt : props.maxListHeightPX\n}\n\nfunction sufficientRoomAbove(): boolean {\n return offsetTop.value > displayableListHeight()\n}\n\nfunction insufficientRoomBelow(): boolean {\n return offsetBottom.value < displayableListHeight()\n}\n\nconst maxListHeightPx = computed((): string => (props.maxListHeightPX || 0) + 'px')\n\nconst animationDuration = computed((): string => (props.listAnimationDurationMs || 0) + 'ms')\n\nconst updatedListItemsToDisplay = computed((): any[] => {\n return !props.blockListChange ? props.filteredListItems : listItemsToDisplay.value\n})\n\nwatch(\n () => updatedListItemsToDisplay,\n (newVal: ComputedRef<any[]>) => {\n if (newVal) listItemsToDisplay.value = newVal.value\n },\n { immediate: false, deep: true }\n)\n\nlet unobserveTimeout = setTimeout(() => {}, 0)\n\nlet changeListener: DocumentViewChangeListener | null = null\n\nfunction openAndObserveChangeListener() {\n listHeightPx.value = getListULHeight()\n clearTimeout(unobserveTimeout)\n if (changeListener) changeListener.observe()\n listElementOpenAndVisible.value = true\n buttonRePositionCallback(undefined)\n}\n\nfunction closeAndUnobserveChangeListener() {\n clearTimeout(unobserveTimeout)\n unobserveTimeout = setTimeout(() => {\n if (!props.showDropDown) {\n listElementOpenAndVisible.value = false\n if (changeListener) changeListener.unobserve()\n }\n }, props.listAnimationDurationMs + 50)\n}\n\nwatch(\n () => props.showDropDown,\n (newV, oldV) => {\n if (newV !== oldV) {\n setOffsets()\n if (newV) openAndObserveChangeListener()\n else closeAndUnobserveChangeListener()\n }\n },\n { immediate: true }\n)\n\nfunction buttonRePositionCallback(e: any): void {\n setOffsets()\n nextTick(() => setOffsets())\n closeListOnScrollIfNecessary(e)\n}\n\nfunction closeListOnScrollIfNecessary(e: any) {\n if (!props.enableScrollClose || !props.showDropDown) return\n const notInitialized: boolean = typeof listContainerRef?.value?.contains !== 'function'\n if (notInitialized || e?.target?.nodeType == null || insideListOrOtherList(e)) return\n const isScrollEvent: boolean = ['scroll', 'wheel', 'touchmove'].includes(e?.type)\n if (props.showDropDown && isScrollEvent) props.parentMethods.closeList()\n}\n\nfunction insideListOrOtherList(e: any): boolean {\n const insideButton: boolean = !!dropDownButtonContainer.value?.contains(e?.target as Node)\n const insideList: boolean = !!listContainerRef.value?.contains(e.target as Node)\n const otherList: boolean = [e?.srcElement?.id, e?.target?.id].includes('super-list-select-list')\n return insideButton || insideList || otherList\n}\n\nfunction setOffsets(): void {\n setButtonOffset()\n setListOffset()\n}\n\nfunction setButtonOffset(): void {\n if (dropDownButtonContainer?.value == null) return\n const brc: DOMRect = (dropDownButtonContainer.value as HTMLElement).getBoundingClientRect()\n offsetTop.value = brc.top\n offsetBottom.value = window.innerHeight - brc.bottom\n parentWidthPx.value = brc.width + 'px'\n}\n\nfunction setListOffset(): void {\n /**\n * List container must be used when calculating position and not \"dropDownListUL\".\n * Position must be calculated as window viewport might not match list container viewport.\n **/\n if (dropDownButtonContainer?.value == null || listContainerRef?.value == null) return\n const brc: DOMRect = getButtonContainerElement().getBoundingClientRect()\n const slrc: DOMRect = (listContainerRef.value as HTMLElement).getBoundingClientRect()\n const currentListOffset: number = listOffset.value\n const currentOffsetLeft: number = offsetLeft.value\n if (reverseList.value) listOffset.value = currentListOffset - (brc.top - slrc.bottom)\n else listOffset.value = currentListOffset - (slrc.top - brc.bottom)\n offsetLeft.value = currentOffsetLeft - (slrc.left - brc.left)\n}\n\nfunction getButtonElement(): HTMLButtonElement {\n return (dropDownButtonContainer?.value as HTMLElement).getElementsByTagName('button')[0]\n}\n\nfunction getButtonContainerElement(): HTMLDivElement {\n return dropDownButtonContainer?.value as HTMLDivElement\n}\n\nonMounted(() => {\n changeListener = new DocumentViewChangeListener(buttonRePositionCallback, getButtonElement())\n setTimeout(() => buttonRePositionCallback(undefined), 250)\n})\n\nonUnmounted(() => {\n changeListener?.unobserve()\n})\n</script>\n\n<style scoped>\n.list-normal {\n top: var(--parent-y);\n}\n\n.list-reverse {\n bottom: var(--parent-y);\n}\n\n.select-list {\n --parent-width: v-bind(parentWidthPx);\n --parent-x: v-bind(parentXPx);\n --parent-y: v-bind(parentYPx);\n --duration: v-bind(animationDuration);\n --border-radius: var(--superlist-list-border-radius, 0);\n border-radius: var(--border-radius);\n width: var(--parent-width);\n min-width: var(--parent-width);\n left: var(--parent-x);\n display: block;\n transition-property: max-height, opacity, visibility, box-shadow;\n transition-duration: var(--duration, 300ms);\n transition-timing-function: cubic-bezier(0.1, 0.9, 0.35, 0.98);\n position: absolute;\n backdrop-filter: blur(3px);\n -webkit-backdrop-filter: blur(3px);\n background-color: rgb(255, 255, 255, 0.7);\n align-items: baseline;\n opacity: 0.25;\n z-index: 999;\n visibility: collapse;\n overflow: auto;\n max-height: 0;\n border: none !important; /* can't transition border */\n}\n\n.select-list:focus-visible,\n.select-list > ul:focus-visible,\n.super-list-button-container:focus-visible {\n outline: none;\n}\n\n.super-list-button-container {\n height: 100%;\n width: 100%;\n}\n\n.select-list.select-list-open {\n z-index: 999999;\n --max-height: v-bind(maxListHeightPx);\n max-height: var(--max-height, 0);\n}\n\n.select-list.no-scroll {\n overflow: hidden;\n}\n\n.select-list-fixed {\n position: fixed;\n opacity: 1;\n visibility: visible;\n}\n\n.list-content {\n --duration: v-bind(animationDuration);\n overflow: visible;\n margin: 0;\n padding: 0;\n border-style: none;\n color: var(--superlist-text-colour, rgb(55, 60, 65));\n list-style: none;\n max-width: 100%;\n}\n\n.select-list.select-list-scrollable {\n border-radius: var(--border-radius);\n}\n\n.select-list:not(.select-list-fixed) {\n transition: none;\n box-shadow: none !important;\n}\n\n@media (min-width: 640px) {\n .select-list.select-list-scrollable {\n border-radius: var(--border-radius) 0 0 var(--border-radius);\n }\n .list-content {\n font-size: 0.875rem;\n line-height: 1.25rem;\n }\n}\n</style>\n","<template>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n data-slot=\"icon\"\n viewBox=\"0 0 12 6\"\n >\n <path\n shape-rendering=\"geometricPrecision\"\n d=\"M 6 4 L 10 0.25 A 0.5 0.5 90 0 1 11 1.25 L 6.5 5.75 A 15 3 90 0 1 5.5 5.75 L 1 1.25 A 0.5 0.5 90 0 1 2 0.25 Z\"\n />\n </svg>\n</template>\n","<template>\n <button\n ref=\"buttonRef\"\n :tabindex=\"enableTextFilter ? -1 : 0\"\n @keydown.enter=\"enterHandler($event)\"\n @keydown.space=\"spaceHandler($event)\"\n @keydown.esc=\"parentMethods.press($event)\"\n @keydown.up=\"parentMethods.press($event)\"\n @keydown.down=\"parentMethods.press($event)\"\n @focusout=\"parentMethods.unfocus($event)\"\n @click=\"clickHandler()\"\n type=\"button\"\n :class=\"[{ 'click-through': props.enableTextFilter || props.showDropDown }]\"\n class=\"list-button\"\n >\n <slot></slot>\n <span class=\"list-button-icon-div\" :class=\"{ 'bigger-gap': props.showDropDown }\">\n <span\n v-if=\"!customIcon\"\n class=\"list-button-icon\"\n :class=\"[{ 'rotate-180': !props.showDropDown }]\"\n >\n <default-arrow aria-hidden=\"true\" />\n </span>\n <span\n v-if=\"!customIcon\"\n class=\"list-button-icon\"\n :class=\"[{ 'rotate-180': props.showDropDown }]\"\n >\n <default-arrow v-if=\"customIcon == null\" aria-hidden=\"true\" />\n </span>\n <span v-if=\"customIcon\" class=\"list-button-icon custom-icon\">\n <component aria-hidden=\"true\" :is=\"customIcon as object\" />\n </span>\n </span>\n </button>\n</template>\n\n<script setup lang=\"ts\">\nimport { type PropType, ref } from 'vue'\nimport DefaultArrow from './default-arrow.vue'\n\n// prettier-ignore\nconst props = defineProps({ // eslint-disable-line\n parentMethods: {\n type: Object,\n required: true\n },\n showDropDown: {\n type: Boolean,\n required: true\n },\n enableTextFilter: {\n type: Boolean,\n required: true\n },\n customIcon: {\n default: null,\n type: [Object, Function] as PropType<object | Function | null>\n },\n reverseDropDownList: {\n type: Boolean,\n required: true\n }\n})\n\nconst buttonRef = ref(null)\n\nfunction clickHandler() {\n if (props.enableTextFilter) return\n else props.parentMethods.openList()\n}\n\nfunction enterHandler(event: KeyboardEvent) {\n if (props.enableTextFilter) {\n props.parentMethods.focusInput()\n event.stopPropagation()\n event.preventDefault()\n } else {\n props.parentMethods.press(event)\n }\n}\n\nfunction spaceHandler(event: KeyboardEvent) {\n if (!props.enableTextFilter) props.parentMethods.press(event)\n}\n\nfunction blurInput() {\n if (buttonRef?.value) {\n const button: HTMLButtonElement = buttonRef.value\n button.blur()\n }\n}\n\nfunction focusInput() {\n if (buttonRef?.value) (buttonRef.value as HTMLButtonElement).focus()\n}\n\ndefineExpose({ blurInput, focusInput, buttonRef })\n</script>\n\n<style scoped>\n.list-button-icon {\n display: flex;\n transition-timing-function: ease-in-out;\n transition-duration: 200ms;\n transition-property: transform;\n width: 0.6rem;\n transform: rotate(0deg);\n color: var(--superlist-text-colour, rgb(17, 24, 39));\n justify-content: center;\n max-height: 18%;\n}\n\n.list-button-icon.custom-icon {\n max-height: 100%;\n width: 1.25rem;\n}\n\n.list-button-icon.rotate-180 {\n transform: rotate(180deg);\n}\n\n.list-button {\n position: relative;\n padding: 0;\n margin: 0;\n width: 100%;\n max-height: 100%;\n height: 100%;\n background-color: var(--superlist-background-colour, white);\n align-items: center;\n pointer-events: auto;\n cursor: pointer;\n}\n\n.list-button:focus,\n.list-button:focus-visible,\n.list-button:active {\n text-align: left;\n}\n\n.list-button-icon-div {\n pointer-events: none;\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding-right: 0.75rem;\n max-height: 100%;\n height: 100%;\n gap: max(0.15rem, calc(6.25% + 0.075rem));\n transition: gap 200ms;\n}\n\n.list-button-icon-div.bigger-gap {\n gap: calc(40% - 0.25rem);\n}\n\n.click-through {\n pointer-events: none;\n}\n</style>\n","<template>\n <div style=\"position: relative\" :class=\"$attrs.class\">\n <item-list\n ref=\"itemListRef\"\n :show-drop-down=\"showDropDown\"\n :filteredListItems=\"filteredListItems\"\n :mouseHoveringOnList=\"mouseHoveringOnList\"\n :focusedIndex=\"activeFocusedIndex\"\n :selectedIndex=\"selectedIndex\"\n :max-list-height-p-x=\"maxListHeightPX\"\n :list-animation-duration-ms=\"listAnimationDurationMs\"\n :parent-methods=\"parentMethods\"\n v-model:blockListChange=\"blockListUpdates\"\n :total-options-count=\"totalOptionsCount\"\n @reverseDropDownList=\"reverseDropDownList = $event\"\n :enableScrollClose=\"enableScrollClose\"\n :enable-text-filter=\"enableTextFilter\"\n >\n <list-button\n ref=\"dropDownButtonInput\"\n :parent-methods=\"parentMethods\"\n :show-drop-down=\"showDropDown\"\n :enable-text-filter=\"enableTextFilter\"\n :custom-icon=\"customIcon\"\n :reverse-drop-down-list=\"reverseDropDownList\"\n >\n <text-input\n ref=\"dropDownTextInput\"\n :enable-text-filter=\"enableTextFilter\"\n :show-drop-down=\"showDropDown\"\n :placeholder=\"placeholder\"\n :enable-button-click=\"enableButtonClick\"\n :parent-methods=\"parentMethods\"\n @update:query=\"query = $event\"\n />\n </list-button>\n </item-list>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, type PropType, ref, watch } from 'vue'\nimport {\n getLabelString,\n AbortablePromise,\n type DataSet,\n type EnumType,\n type ListRequest\n} from './DropDownLibrary'\nimport TextInput from './ListInputComponents/ListTextInput.vue'\nimport ItemList from './ListInputComponents/ItemList.vue'\nimport ListButton from './ListInputComponents/ListButton.vue'\n\nconst emit = defineEmits({ 'update:selected': null })\nconst props = defineProps({\n selected: {\n type: [String, Number, Object, null, undefined] as PropType<\n string | number | object | null | undefined\n >\n },\n options: {\n type: [Function, Array<string | number | object>] as PropType<\n ListRequest | Array<string | number | object>\n >,\n required: true\n },\n maxListOptions: {\n type: Number as PropType<number>,\n default: 50\n },\n maxListHeightPX: {\n type: Number as PropType<number>,\n default: 200\n },\n tooltip: {\n type: String,\n required: false\n },\n objectLabelKeyName: {\n type: String as PropType<string | null>,\n default: ''\n },\n enumKeyToLabelObjectArray: {\n type: Object as PropType<EnumType[]>,\n default: undefined\n },\n listAnimationDurationMs: {\n type: Number as PropType<number>,\n default: 300\n },\n customIcon: {\n default: null,\n type: [Object, Function] as PropType<object | Function | null>\n },\n forceTextFilterVisibilityTo: {\n type: Boolean as PropType<boolean>,\n default: undefined\n },\n customPlaceHolderFunction: {\n type: Function as PropType<Function | null>,\n default: null\n },\n colour: {\n type: String as PropType<string>,\n default: 'black'\n },\n scrollTextInputToTopOnMobile: {\n type: Boolean as PropType<boolean>,\n default: true\n }\n})\n\nconst listOptions = ref([] as Array<string | number | object>)\n\nconst abortablePromise = new AbortablePromise()\n\nconst totalOptionsCount = ref(0)\n\nconst enableTextFilter = computed((): boolean => {\n if (props.forceTextFilterVisibilityTo != undefined) return props.forceTextFilterVisibilityTo\n return totalOptionsCount.value > props.maxListOptions\n})\n\nconst showDropDown = ref<boolean>(false)\n\nconst blockListUpdates = ref<boolean>(false)\n\nconst reverseDropDownList = ref<boolean>(false)\n\nconst enableButtonClick = ref(true)\n\nconst loadingData = ref(false)\nconst errorState = ref(false)\n\nconst itemListRef = ref(ItemList)\nconst dropDownTextInput = ref(TextInput)\nconst dropDownButtonInput = ref(ListButton)\n\nconst query = ref('')\n\nwatch(\n () => query.value,\n (newV, oldV) => {\n if (newV !== oldV && typeof props.options === 'function') loadData(newV)\n }\n)\n\nconst blurInputIfNecessary = () => {\n if (enableTextFilter.value) dropDownTextInput?.value?.blurInput()\n}\n\nconst closeList = () => {\n clearTimeout(blockScrollCloseTimeout)\n blurInputIfNecessary()\n query.value = ''\n showDropDown.value = false\n enableButtonClick.value = true\n}\n\nconst placeholder = computed((): string => {\n if (errorState?.value === true) return 'Error loading data'\n if (loadingData?.value === true) return 'Loading...'\n return getLabel(props.selected)\n})\n\nconst updatedSelected = (newValue: any) => {\n if (newValue) emit('update:selected', newValue)\n closeList()\n}\n\nconst getLabel = (value?: string | number | object | null): string => {\n return getLabelString(\n value,\n props.customPlaceHolderFunction,\n props.objectLabelKeyName,\n props.enumKeyToLabelObjectArray\n )\n}\n\nfunction invalidArgumentError() {\n loadingData.value = true\n errorState.value = true\n throw new Error(`Invalid options argument provided to ListInputComponent`)\n}\n\nfunction invalidResponseError() {\n loadingData.value = true\n errorState.value = true\n throw new Error(`Invalid response provided to ListInputComponent, no total count key found`)\n}\n\nfunction invalidListValueKeyError() {\n loadingData.value = true\n errorState.value = true\n throw new Error('Invalid objectLabelKeyName for provided Dropdown list value.')\n}\n\nonMounted(() => {\n if (typeof props.options !== 'function' && !Array.isArray(props.options)) invalidArgumentError()\n else initializeOptions()\n})\n\nconst mouseHoveringOnList = ref(false)\n\nconst selectedIndex = ref(0)\nconst focusedIndex = ref(0)\nconst activeFocusedIndex = ref(0)\n\nwatch(\n () => focusedIndex.value,\n (newV, oldV) => {\n if (newV != oldV && !blockListUpdates.value) {\n activeFocusedIndex.value = newV\n }\n },\n { immediate: true }\n)\n\nwatch(\n () => blockListUpdates.value,\n (newV) => {\n if (!newV) {\n activeFocusedIndex.value = focusedIndex.value\n }\n },\n { immediate: true }\n)\n\nconst filteredListItems = computed(() => {\n // if is function, return listOptions variable which is set by function\n if (typeof props.options === 'function' && !Array.isArray(props.options)) return listOptions.value\n const qry = query.value\n const lo = listOptions.value\n // else, is array, return filtered array\n return qry === '' ? lo : lo.filter((v) => getLabel(v).toLowerCase().includes(qry.toLowerCase()))\n})\n\nwatch(\n () => filteredListItems.value,\n (newV, oldV) => {\n if (JSON.stringify(newV) !== JSON.stringify(oldV)) focusSelectedOrFirstListItem()\n },\n { immediate: false, deep: true }\n)\n\nconst mouseOverList = () => {\n mouseHoveringOnList.value = true\n}\n\nconst focusSelectedOrFirstListItem = () => {\n const existingIndex = getSelectedValueIndex()\n selectedIndex.value = existingIndex /* may not be in the filtered list, allowed to be -1 */\n focusedIndex.value = existingIndex > -1 ? existingIndex : 0 /* default to first value */\n}\n\nfunction getSelectedValueIndex() {\n if (props.selected == null) return -1\n const labelsArray = listOptions.value.map((v) => getLabel(v))\n const matchingLabelsArray = labelsArray.filter((v) => v === getLabel(props.selected))\n if (matchingLabelsArray.length > 1) {\n const matchingIndexes = matchingLabelsArray.map((v) => labelsArray.indexOf(v))\n for (let i = 0; i < matchingIndexes.length; i++) {\n const currentMatchingOptionString = JSON.stringify(listOptions.value[matchingIndexes[i]])\n const selectedOptionString = JSON.stringify(props.selected)\n if (currentMatchingOptionString === selectedOptionString) return matchingIndexes[i]\n }\n return -1\n }\n return labelsArray.indexOf(getLabel(props.selected))\n}\n\nconst openList = () => {\n if (loadingData.value) return\n if (!showDropDown.value) {\n blockListUpdates.value = false\n focusSelectedOrFirstListItem()\n scrollMobileTextInputToTop()\n showDropDown.value = true\n }\n mouseHoveringOnList.value = false\n enableButtonClick.value = false\n}\n\nconst scrollMobileTextInputToTop = () => {\n const mobileWindow: boolean = window?.innerWidth != null && window.innerWidth < 640\n const mobileScreen: boolean = screen?.width != null && screen.width < 640\n const textInput: HTMLElement | null = dropDownTextInput.value.textInputRef as HTMLElement | null\n if ((mobileWindow || mobileScreen) && enableTextFilter.value) {\n preventScrollClose()\n if (props.scrollTextInputToTopOnMobile)\n textInput?.scrollIntoView({ block: 'start', inline: 'center' })\n }\n}\n\nconst enableScrollClose = ref<boolean>(true)\nlet blockScrollCloseTimeout = setTimeout(() => {}, 0)\n\nfunction preventScrollClose() {\n const textInput: HTMLElement | null = dropDownTextInput.value.textInputRef as HTMLElement | null\n if (!textInput) return\n enableScrollClose.value = false\n let preventingScrollCloseInterval: NodeJS.Timeout | null = null\n\n const clearAll = () => {\n if (preventingScrollCloseInterval) clearInterval(preventingScrollCloseInterval)\n clearTimeout(blockScrollCloseTimeout)\n setTimeout(() => {\n enableScrollClose.value = true\n }, 100)\n }\n\n blockScrollCloseTimeout = setTimeout(clearAll, 5000)\n\n preventingScrollCloseInterval = setInterval(() => {\n if (\n showDropDown.value === false ||\n (textInput?.scrollTop === 0 && document.readyState === 'complete')\n )\n clearAll()\n }, 100)\n}\n\nconst focusInput = () => {\n if (enableTextFilter?.value == true) dropDownTextInput.value.focusInput()\n else if (dropDownButtonInput?.value?.focusInput) dropDownButtonInput?.value?.focusInput()\n}\n\nasync function initializeOptions(): Promise<void> {\n if (typeof props.options === 'function') {\n await loadData(query.value ? query.value : undefined, true)\n } else {\n validateListOptions(props.options as Array<string | number | object>)\n totalOptionsCount.value = listOptions.value.length\n }\n initializeSelected()\n}\n\ndefineExpose({ initializeOptions, getLabel })\n\nfunction initializeSelected() {\n const invalidSelection = getSelectedValueIndex() == -1\n const existingOptionNotSelected = invalidSelection && listOptions.value && !!listOptions.value[0]\n if (existingOptionNotSelected) updatedSelected(listOptions.value[0])\n}\n\nasync function loadData(stringFilter?: string, disableOnLoad: boolean = true) {\n loadingData.value = disableOnLoad\n const func = async () => (props.options as Function)(props.maxListOptions, stringFilter || '')\n const next = (response: DataSet<any>) => {\n if (!response || !('data' in response)) invalidArgumentError()\n validateListOptions(response.data)\n getOptionsCount(response?.data?.length ?? 0).then(() => {\n loadingData.value = false\n })\n }\n await abortablePromise.resetAndExecute(func, next)\n}\n\nasync function getOptionsCount(dataLength: number): Promise<void> {\n const func = async () => (props.options as Function)(1, '')\n const next = (response: DataSet<any>) => {\n if (!response || !('totalNum' in response)) invalidResponseError()\n totalOptionsCount.value = response.totalNum ?? dataLength\n }\n await abortablePromise.resetAndExecute(func, next)\n}\n\nconst getCurrentlyFocusedListItemElement = (): HTMLElement | null => {\n const listInput: HTMLElement | null = dropDownTextInput?.value?.textInputRef as HTMLElement | null\n return listInput?.getElementsByTagName('li')[focusedIndex.value] ?? null\n}\n\nconst press = (event?: any) => {\n if (showDropDown.value == false) {\n openList()\n } else if (event) {\n keypress(event)\n }\n}\n\nconst keypress = (event: any) => {\n const key: string = event.key || event.code\n if (key === 'Tab' || key === 'Escape') closeList()\n if (key === 'ArrowDown') down(event)\n if (key === 'ArrowUp') up(event)\n if (key === 'Enter' || key === ' ') updateSelectedFromTextQuery()\n event.preventDefault()\n event.stopPropagation()\n}\n\nconst updateSelectedFromTextQuery = () => {\n if (filteredListItems.value.length > 0) {\n blockListUpdates.value = true\n updatedSelected(filteredListItems.value[focusedIndex.value])\n } else {\n closeList()\n }\n}\n\nconst down = (event: any) => {\n enableButtonClick.value = true\n if (focusedIndex.value < filteredListItems.value.length - 1) {\n event.preventDefault()\n mouseHoveringOnList.value = false\n focusedIndex.value++\n getCurrentlyFocusedListItemElement()?.focus()\n }\n}\n\nconst up = (event: any) => {\n enableButtonClick.value = true\n if (focusedIndex.value > 0) {\n event.preventDefault()\n mouseHoveringOnList.value = false\n focusedIndex.value--\n getCurrentlyFocusedListItemElement()?.focus()\n }\n}\n\nconst unfocus = (event: any) => {\n if (showDropDown?.value === false) return\n if (query.value.length > 0) blockListUpdates.value = true\n const list: HTMLElement | null = itemListRef?.value?.listContainerRef as HTMLElement | null\n const listInput: HTMLElement | null = dropDownTextInput?.value?.textInputRef as HTMLElement | null\n const isListInput = event?.relatedTarget && listInput?.isEqualNode(event?.relatedTarget)\n const isList = event?.relatedTarget && list && list.contains(event?.relatedTarget)\n const isListItem = event?.relatedTarget && list && list.isEqualNode(event?.relatedTarget)\n if (isList || isListInput) return\n if (isListItem) {\n focusInput()\n return\n }\n closeList()\n}\n\nfunction validateListOptions(optns: Array<string | number | object>) {\n if (!Array.isArray(optns)) invalidArgumentError()\n if (optns.length > 0 && typeof optns[0] === 'object') validateObjectList(optns as Array<object>)\n listOptions.value = optns as Array<string | number | object>\n}\n\nfunction validateObjectList(values: Array<object>) {\n if (!props.objectLabelKeyName || props.objectLabelKeyName.length === 0) invalidListValueKeyError()\n const key: string = props.objectLabelKeyName as string\n for (let i = 0; i < values.length; i++) {\n if (typeof values[i] !== 'object' || !(key in values[i])) invalidListValueKeyError()\n }\n}\n\nconst parentMethods = {\n openList: openList,\n unfocus: unfocus,\n press: press,\n mouseOverList: mouseOverList,\n getLabel: getLabel,\n updatedSelected: updatedSelected,\n focusInput: focusInput,\n closeList: closeList\n}\n</script>\n\n<style scoped>\n* {\n box-sizing: border-box;\n}\n</style>\n"],"names":["DocumentViewChangeListener","targetFunction","targetNode","event","eventType","getLabelString","value","customLabelGetFunction","objectLabelKeyName","enumKeyToLabelObjectArray","getEnumLabel","enumKeyArray","eT","AbortablePromise","signal","asyncFunc","then","response","func","reason","emit","__emit","props","__props","textInputRef","ref","focusInHandler","e","focusOutHandler","updateQuery","textInputSize","computed","refLength","placeHolderLength","pointerEventsClass","textInputColourClass","blurInput","input","focusInput","__expose","_createElementBlock","$event","_cache","_withKeys","_normalizeClass","_openBlock","_hoisted_1","_createElementVNode","iRefs","useTemplateRef","focusedLi","focused","watch","scrollHighlightedListItemToTop","scrollHighlightedListItemIntoView","li","liParent","aboveTop","belowBottom","_Fragment","_renderList","listItem","index","_withModifiers","_hoisted_2","_toDisplayString","_createBlock","DefaultTick","_hoisted_3","dropDownButtonContainer","dropDownListUL","listContainerRef","offsetLeft","offsetTop","offsetBottom","listOffset","parentWidthPx","listElementOpenAndVisible","listItemsToDisplay","listHeightPx","reverseList","sufficientRoomAbove","insufficientRoomBelow","noScroll","reverse","parentXPx","parentYPx","preventSpaceScrollingList","refocusTextInput","list","target","getListULHeight","displayableListHeight","ulHt","maxListHeightPx","animationDuration","updatedListItemsToDisplay","newVal","unobserveTimeout","changeListener","openAndObserveChangeListener","buttonRePositionCallback","closeAndUnobserveChangeListener","newV","oldV","setOffsets","nextTick","closeListOnScrollIfNecessary","insideListOrOtherList","isScrollEvent","insideButton","insideList","otherList","setButtonOffset","setListOffset","brc","getButtonContainerElement","slrc","currentListOffset","currentOffsetLeft","getButtonElement","onMounted","onUnmounted","_renderSlot","_ctx","_createVNode","ListItem","buttonRef","clickHandler","enterHandler","spaceHandler","DefaultArrow","_resolveDynamicComponent","listOptions","abortablePromise","totalOptionsCount","enableTextFilter","showDropDown","blockListUpdates","reverseDropDownList","enableButtonClick","loadingData","errorState","itemListRef","ItemList","dropDownTextInput","TextInput","dropDownButtonInput","ListButton","query","blurInputIfNecessary","closeList","blockScrollCloseTimeout","placeholder","getLabel","updatedSelected","newValue","invalidArgumentError","invalidResponseError","invalidListValueKeyError","initializeOptions","mouseHoveringOnList","selectedIndex","focusedIndex","activeFocusedIndex","filteredListItems","qry","lo","v","focusSelectedOrFirstListItem","mouseOverList","existingIndex","getSelectedValueIndex","labelsArray","matchingLabelsArray","matchingIndexes","i","currentMatchingOptionString","selectedOptionString","openList","scrollMobileTextInputToTop","mobileWindow","mobileScreen","textInput","preventScrollClose","enableScrollClose","preventingScrollCloseInterval","clearAll","loadData","validateListOptions","initializeSelected","stringFilter","disableOnLoad","next","getOptionsCount","dataLength","getCurrentlyFocusedListItemElement","press","keypress","key","down","up","updateSelectedFromTextQuery","unfocus","listInput","isListInput","isList","isListItem","optns","validateObjectList","values","parentMethods","$attrs"],"mappings":";2CAQO,MAAMA,EAAiE,CAC3D,YAAwB,CAAC,SAAU,OAAQ,SAAU,QAAS,WAAW,EACzE,OAA+B,CAC9C,WAAY,GACZ,UAAW,GACX,QAAS,EACX,EACQ,iBACA,iBAER,YAAYC,EAA0BC,EAAkB,SAAS,KAAM,CACrE,KAAK,WAAaA,EAClB,KAAK,iBAAqBC,GACxBF,EAAeE,CAAK,EACtB,KAAK,iBAAmB,IAAI,iBAAkB,IAAMF,GAAqC,CAAA,CAGpF,SAAgB,CACrB,KAAK,iBAAiB,QAAQ,KAAK,WAAY,KAAK,MAAM,EAC1D,UAAWG,KAAa,KAAK,YAAa,KAAK,YAAYA,CAAS,EACpE,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,CAAA,CAGhC,uBAA8B,CAC5B,KAAK,iBAAiB,WAAW,CAAA,CAGnC,yBAAgC,CAC9B,KAAK,iBAAiB,QAAQ,KAAK,WAAY,KAAK,MAAM,CAAA,CAGrD,WAAkB,CACvB,KAAK,iBAAiB,WAAW,EACjC,UAAWA,KAAa,KAAK,YAAa,KAAK,eAAeA,CAAS,EACvE,KAAK,qBAAqB,EAC1B,KAAK,4BAA4B,CAAA,CAG3B,YAAYA,EAAyB,CAC3C,SAAS,iBAAiBA,EAAW,KAAK,iBAAkB,EAAI,CAAA,CAG1D,eAAeA,EAAyB,CAC9C,SAAS,oBAAoBA,EAAW,KAAK,iBAAkB,EAAI,CAAA,CAG7D,0BAAiC,CACvC,KAAK,WAAW,iBAAiB,gBAAiB,KAAK,gBAAgB,CAAA,CAGjE,6BAAoC,CAC1C,KAAK,WAAW,oBAAoB,gBAAiB,KAAK,gBAAgB,CAAA,CAGpE,mBAA0B,CACzB,OAAA,iBAAiB,SAAU,KAAK,gBAAgB,CAAA,CAGjD,sBAA6B,CAC5B,OAAA,oBAAoB,SAAU,KAAK,gBAAgB,CAAA,CAE9D,CAEO,SAASC,GACdC,EACAC,EACAC,EACAC,EACQ,CACR,OAAIF,GAA0B,KAAaA,EAAuBD,CAAK,EACnEA,GAAS,KAAa,GACtB,OAAOA,GAAU,SAAiBA,EAAME,CAAwC,EAChFC,EAAkCC,GAAaJ,EAAOG,CAAyB,EAC5E,GAAKH,CACd,CAEA,SAASI,GAAaJ,EAAwBK,EAAkC,CACtE,OAAAA,EAAa,KAAMC,GAA0BA,EAAG,OAASN,CAAK,GAAG,OAAS,EACpF,CAcO,MAAMO,EAA6C,CACxD,aAAc,CACP,KAAA,gBAAkB,IAAI,gBAC3B,KAAK,KAAO,IAAY,CAAC,EACzB,KAAK,KAAO,IAAY,CAAC,CAAA,CAG3B,MAAM,iBAAiBC,EAAqBC,EAAqBC,EAA8B,CACvF,MAAAC,EAAW,MAAMF,EAAU,EACjC,GAAI,CAAAD,EAAO,QACX,OAAOE,EAAKC,CAAQ,CAAA,CAGtB,QAAQC,EAAsB,CAC5B,KAAK,KAAOA,CAAA,CAGd,QAAQF,EAAsB,CAC5B,KAAK,KAAOA,CAAA,CAGd,SAAwB,CACf,OAAA,KAAK,iBAAiB,KAAK,gBAAgB,OAAQ,KAAK,KAAM,KAAK,IAAI,CAAA,CAGhF,MAAMG,EAAuB,CACtB,KAAA,gBAAgB,MAAMA,GAAU,wBAAwB,EACxD,KAAA,gBAAkB,IAAI,eAAgB,CAG7C,gBAAgBD,EAAgBF,EAA8B,CAC5D,YAAK,MAAM,8BAA8B,EACzC,KAAK,QAAQE,CAAI,EACjB,KAAK,QAAQF,CAAI,EACV,KAAK,QAAQ,CAAA,CAExB,oZC5GA,MAAMI,EAAOC,EAMPC,EAAQC,EAsBRC,EAAeC,MAAI,IAAI,EAE7B,SAASC,EAAeC,EAAe,CACjC,uBAAwBA,GAAKA,EAAE,oBAAsB,KAAML,EAAM,cAAc,UAAU,EACxFA,EAAM,cAAc,SAAS,CAAA,CAGpC,SAASM,EAAgBzB,EAAmB,CACpCmB,EAAA,cAAc,QAAQnB,CAAK,CAAA,CAGnC,SAAS0B,EAAY1B,EAAY,CAC3BA,GAAO,QAAQ,OAAS,QAAgB,eAAgBA,EAAM,OAAO,KAAK,CAAA,CAG1E,MAAA2B,EAAgBC,EAAAA,SAAS,IAAM,CACnC,MAAMC,EAAoBR,GAAc,MAASA,EAAa,MAAiB,OAAS,EAClFS,EAA4BX,EAAM,aAAa,QAAU,EAC/D,OAAOU,EAAY,EAAIA,EAAYC,EAAoB,EAAIA,EAAoB,CAAA,CAChF,EAEKC,EAAqBH,EAAAA,SAAS,IACVT,EAAM,oBAAsB,IAAQA,EAAM,mBAAqB,GACvE,GAAK,eACtB,EAEKa,EAAuBJ,EAAAA,SAAS,IACbT,EAAM,cAAgB,CAACA,EAAM,kBAAqB,CAACA,EAAM,aAClE,wBAA0B,wBACzC,EAED,SAASc,GAAY,CACnB,GAAIZ,GAAc,MAAO,CACvB,MAAMa,EAA0Bb,EAAa,MAC7Ca,EAAM,KAAK,EACXA,EAAM,MAAQ,EAAA,CAChB,CAGF,SAASC,GAAa,CAChBd,GAAc,OAAQA,EAAa,MAA2B,MAAM,CAAA,CAG1E,OAAAe,EAAa,CAAE,UAAAH,EAAW,WAAAE,EAAY,aAAAd,CAAA,CAAc,wBAnGlDgB,EAAA,mBAsBE,QAAA,SArBI,eAAJ,IAAIhB,EACH,SAAUD,EAAgB,iBAAA,EAAA,GAC1B,UAAO,2BAAQA,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,OAAA,CAAA,GAC1BC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,EAAAA,SAAAF,GAAAlB,EAAA,cAAc,MAAK,EAAA,CAAA,OAAA,CAAA,6BACrBA,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,KAAA,CAAA,6BAC3BlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,IAAA,CAAA,6BACxBlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,MAAA,CAAA,IACxC,UAAOC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAD,GAAEf,EAAee,CAAM,GAC9B,WAAQC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAD,GAAEb,EAAgBa,CAAM,GAChC,QAAKC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAD,GAAEZ,EAAYY,CAAM,GAC1B,KAAK,OACL,oBAAkB,OAClB,aAAa,MACZ,YAAalB,EAAW,YACxB,KAAMO,EAAa,MACnB,MAAKc,iBAAA,CAAA,CAAUV,EAAkB,MAAQC,EAAoB,+BAAmCZ,EAAgB,gBAAA,GAK3G,wBAAwB,CAAA,CAAA,4ICpB9B,MAAM,6BACN,KAAK,eACL,cAAY,OACZ,YAAU,OACV,QAAQ,gCALV,OAAAsB,EAAA,UAAA,EAAAL,EAAA,mBAWM,MAXNM,GAWMJ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAJJK,EAAAA,mBAGE,OAAA,CAFA,kBAAgB,qBAChB,EAAE,+nBCkDR,MAAMzB,EAAQC,EAmCRyB,EAAoDC,iBAAe,OAAO,EAE1EC,EAAYnB,EAAAA,SAAS,IAA0B,CAC/C,GAAA,CAACiB,GAAO,MAAc,OAAA,KAEpB,MAAAG,GADoC,MAAM,QAAQH,EAAM,KAAK,EAAIA,EAAM,MAAQ,CAACA,EAAM,KAAK,GAC5E1B,EAAM,YAAY,EACnC,OAAC6B,GACqB,OAAOA,GAAW,UACG,mBAAoBA,GACf,OAAOA,EAAQ,gBAAqB,WACjEA,EAJF,IAIY,CAClC,EAEDC,EAAA,MACE,IAAM9B,EAAM,aACZ,IAAM+B,EAA+B,CACvC,EACAD,EAAA,MACE,IAAM9B,EAAM,0BACZ,IAAMgC,EAAkC,CAC1C,EACAF,EAAA,MACE,IAAMF,EAAU,MAChB,IAAMI,EAAkC,CAC1C,EAEA,SAASD,GAAuC,CAC1C,CAAC/B,EAAM,cAAgB,CAAC4B,GAAW,OAAO,eAAe,gBAC7DA,EAAU,MAAM,cAAc,cAAc,UAAYA,EAAU,MAAM,UAAA,CAG1E,SAASI,GAA0C,CACjD,MAAMC,EAAKL,EAAU,MACfM,EAAWD,GAAI,eAAe,cACpC,GAAI,CAACjC,EAAM,cAAgB,CAACiC,GAAM,CAACC,EAAU,OAC7C,MAAMC,EAAWF,EAAG,UAAYC,EAAS,UAAY,EAC/CE,EAAcH,EAAG,UAAYA,EAAG,aAAeC,EAAS,UAAYA,EAAS,aAC/EC,IAAmBD,EAAA,UAAYD,EAAG,WAClCG,IAAsBF,EAAA,UAAYD,EAAG,UAAYA,EAAG,aAAeC,EAAS,aAAA,oEApIhFX,EAAAA,UAAA,EAAA,EAAAL,EAuBK,mBAAAmB,WAtByB,KAAAC,EAAA,WAAArC,EAAA,kBAApB,CAAAsC,EAAUC,mBADpBtB,EAAA,mBAuBK,KAAA,CArBF,IAAKsB,aACN,IAAI,QACH,QAAK,2BAAQvC,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,OAAA,CAAA,6BAC1BlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,OAAA,CAAA,6BAC5BlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,KAAA,CAAA,IACrC,UAAO,2BAAKlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,IAAA,CAAA,6BACxBlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,MAAA,CAAA,IACxC,WAAUC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAD,GAAAlB,EAAA,cAAc,QAAQkB,CAAM,GACvC,SAAS,KACR,YAAgBsB,EAAAA,cAAAtB,GAAAlB,EAAA,cAAc,gBAAgBsC,CAAQ,EAAA,CAAA,MAAA,CAAA,EACtD,MAAKjB,EAAAA,eAAA,CAAoC,CAAA,uBAAArB,EAAA,gBAAkBuC,CAAK,wBAAoDvC,EAAA,kBAAkB,SAAM,GAAWA,iBAAiBuC,IAAUvC,EAAmB,uCAStMwB,qBAA0E,OAA1EiB,GAA0EC,kBAA1C1C,gBAAc,SAASsC,CAAQ,CAAA,EAAA,CAAA,EAC3CtC,EAAA,gBAAkBuC,iBAAtCI,EAAAA,YAAyFC,GAAA,OAA5C,MAAM,iBAAiB,cAAY,MAAA,gDAG1E5C,EAAA,kBAAkB,SAAM,iBADhCiB,qBAaK,KAAA,OAXF,QAAK,2BAAQjB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,OAAA,CAAA,6BAC1BlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,OAAA,CAAA,6BAC5BlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,KAAA,CAAA,IACrC,UAAO,2BAAKlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,IAAA,CAAA,+BACxBlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,MAAA,CAAA,IACxC,WAAUC,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAD,GAAAlB,EAAA,cAAc,QAAQkB,CAAM,GACtC,YAAgBC,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAqB,gBAAAtB,GAAAlB,EAAA,cAAc,UAAUkB,CAAM,EAAA,CAAA,MAAA,CAAA,GAC/C,SAAS,KACT,MAAM,sCAENM,qBAAwD,OAAlD,CAAA,MAAM,kBAAiB,uBAAoB,EAAA,qCAG3CxB,EAAA,mBAAqBA,EAAA,mBAAqBA,EAAA,mBAAmB,QAAM,kBAD3EiB,EAAAA,mBAeK,KAAA,OAbF,QAAK,6BAAQjB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,OAAA,CAAA,+BAC1BlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,OAAA,CAAA,+BAC5BlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,KAAA,CAAA,IACrC,UAAO,6BAAKlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,IAAA,CAAA,+BACxBlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,MAAA,CAAA,IACxC,WAAUC,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAD,GAAAlB,EAAA,cAAc,QAAQkB,CAAM,GACtC,YAAgBC,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAqB,gBAAAtB,GAAAlB,EAAA,cAAc,UAAUkB,CAAM,EAAA,CAAA,MAAA,CAAA,GAC/C,SAAS,KACT,MAAM,qBAAA,GAENM,EAAAA,mBAEC,OAFDqB,GAA6B,KAC1BH,EAAG,gBAAA1C,EAAiB,kBAAGA,EAAiB,mBAAE,QAAM,CAAA,EAAQ,iBAAc,CAAA,qzBCH7E,MAAMH,EAAOC,EAEPC,EAAQC,EAmDR8C,EAA0B5C,MAAwB,IAAI,EACtD6C,EAAiB7C,MAAwB,IAAI,EAC7C8C,EAAmB9C,MAAwB,IAAI,EAC/C+C,EAAa/C,MAAY,CAAC,EAC1BgD,EAAYhD,MAAY,CAAC,EACzBiD,EAAejD,MAAY,CAAC,EAC5BkD,EAAalD,MAAY,CAAC,EAC1BmD,EAAgBnD,MAAY,KAAK,EACjCoD,EAA4BpD,MAAa,EAAK,EAC9CqD,EAAqBrD,EAAW,IAAA,EAAE,EAClCsD,EAAetD,MAAY,CAAC,EAE5BuD,EAAcjD,EAAAA,SAAS,IACvB,CAAC8C,EAA0B,OAAS,QAAQ,aAAe,KAAa,GACrEI,KAAyBC,EAAsB,CACvD,EAEKC,EAAWpD,EAAAA,SAAS,IACjBT,EAAM,iBAAmByD,EAAa,KAC9C,EAED3B,EAAA,MACE,IAAM4B,EAAY,MACjBI,GAAqBhE,EAAK,sBAAuBgE,CAAO,EACzD,CAAE,UAAW,EAAK,CACpB,EAEA,MAAMC,EAAYtD,EAAA,SAAS,IAAcyC,EAAW,MAAQ,IAAI,EAC1Dc,EAAYvD,EAAA,SAAS,IAAc4C,EAAW,MAAQ,IAAI,EAEnDpC,EAAA,CAAE,iBAAAgC,EAAkB,EAE3B,MAAAgB,EAA6BpF,GAAe,CAC5CA,GAAO,KAAOA,EAAM,MAAQ,OAAW,eAAe,CAC5D,EAEMqF,EAAoBrF,GAAsB,CAC9C,MAAMsF,EAAOlB,GAAkB,MACzBmB,EAASvF,EAAM,QACjB,EAAEsF,GAAQC,GAAUD,EAAK,SAASC,CAAM,IAAMD,EAAK,YAAYC,CAAM,IACvEpE,EAAM,cAAc,WAAW,CACnC,EAEA,SAASqE,GAA0B,CACjC,OAAOrB,GAAgB,OAASA,GAAgB,OAAsB,aAAe,CAAA,CAGvF,SAASsB,GAAgC,CACvC,GAAI,CAACf,EAA0B,OAASc,EAAsB,IAAA,SAAUrE,EAAM,gBAC9E,MAAMuE,EAAeF,MAAsB,EAAIrE,EAAM,gBAAkB,CAACqE,EAAgB,EACxF,OAAOrE,EAAM,iBAAmBA,EAAM,gBAAkBuE,EAAOA,EAAOvE,EAAM,eAAA,CAG9E,SAAS2D,GAA+B,CAC/B,OAAAR,EAAU,MAAQmB,EAAsB,CAAA,CAGjD,SAASV,GAAiC,CACjC,OAAAR,EAAa,MAAQkB,EAAsB,CAAA,CAGpD,MAAME,EAAkB/D,EAAAA,SAAS,KAAeT,EAAM,iBAAmB,GAAK,IAAI,EAE5EyE,EAAoBhE,EAAAA,SAAS,KAAeT,EAAM,yBAA2B,GAAK,IAAI,EAEtF0E,EAA4BjE,EAAAA,SAAS,IACjCT,EAAM,gBAA4CwD,EAAmB,MAA7CxD,EAAM,iBACvC,EAED8B,EAAA,MACE,IAAM4C,EACLC,GAA+B,CAC1BA,IAA2BnB,EAAA,MAAQmB,EAAO,MAChD,EACA,CAAE,UAAW,GAAO,KAAM,EAAK,CACjC,EAEI,IAAAC,EAAmB,WAAW,IAAM,GAAI,CAAC,EAEzCC,EAAoD,KAExD,SAASC,GAA+B,CACtCrB,EAAa,MAAQY,EAAgB,EACrC,aAAaO,CAAgB,EACzBC,KAA+B,QAAQ,EAC3CtB,EAA0B,MAAQ,GAClCwB,EAAyB,MAAS,CAAA,CAGpC,SAASC,GAAkC,CACzC,aAAaJ,CAAgB,EAC7BA,EAAmB,WAAW,IAAM,CAC7B5E,EAAM,eACTuD,EAA0B,MAAQ,GAC9BsB,KAA+B,UAAU,EAC/C,EACC7E,EAAM,wBAA0B,EAAE,CAAA,CAGvC8B,EAAA,MACE,IAAM9B,EAAM,aACZ,CAACiF,EAAMC,IAAS,CACVD,IAASC,IACAC,EAAA,EACPF,EAAmCH,EAAA,EACFE,EAAA,EAEzC,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,SAASD,EAAyB1E,EAAc,CACnC8E,EAAA,EACFC,EAAA,SAAA,IAAMD,GAAY,EAC3BE,EAA6BhF,CAAC,CAAA,CAGhC,SAASgF,EAA6BhF,EAAQ,CAG5C,GAFI,CAACL,EAAM,mBAAqB,CAACA,EAAM,cACP,OAAOiD,GAAkB,OAAO,UAAa,YACvD5C,GAAG,QAAQ,UAAY,MAAQiF,EAAsBjF,CAAC,EAAG,OACzE,MAAAkF,EAAyB,CAAC,SAAU,QAAS,WAAW,EAAE,SAASlF,GAAG,IAAI,EAC5EL,EAAM,cAAgBuF,GAAevF,EAAM,cAAc,UAAU,CAAA,CAGzE,SAASsF,EAAsBjF,EAAiB,CAC9C,MAAMmF,EAAwB,CAAC,CAACzC,EAAwB,OAAO,SAAS1C,GAAG,MAAc,EACnFoF,EAAsB,CAAC,CAACxC,EAAiB,OAAO,SAAS5C,EAAE,MAAc,EACzEqF,EAAqB,CAACrF,GAAG,YAAY,GAAIA,GAAG,QAAQ,EAAE,EAAE,SAAS,wBAAwB,EAC/F,OAAOmF,GAAgBC,GAAcC,CAAA,CAGvC,SAASP,GAAmB,CACVQ,EAAA,EACFC,EAAA,CAAA,CAGhB,SAASD,GAAwB,CAC3B,GAAA5C,GAAyB,OAAS,KAAM,OACtC,MAAA8C,EAAgB9C,EAAwB,MAAsB,sBAAsB,EAC1FI,EAAU,MAAQ0C,EAAI,IACTzC,EAAA,MAAQ,OAAO,YAAcyC,EAAI,OAChCvC,EAAA,MAAQuC,EAAI,MAAQ,IAAA,CAGpC,SAASD,GAAsB,CAK7B,GAAI7C,GAAyB,OAAS,MAAQE,GAAkB,OAAS,KAAM,OACzE,MAAA4C,EAAeC,EAA0B,EAAE,sBAAsB,EACjEC,EAAiB9C,EAAiB,MAAsB,sBAAsB,EAC9E+C,EAA4B3C,EAAW,MACvC4C,EAA4B/C,EAAW,MACzCQ,EAAY,MAAOL,EAAW,MAAQ2C,GAAqBH,EAAI,IAAME,EAAK,QAC9D1C,EAAA,MAAQ2C,GAAqBD,EAAK,IAAMF,EAAI,QAC5D3C,EAAW,MAAQ+C,GAAqBF,EAAK,KAAOF,EAAI,KAAA,CAG1D,SAASK,GAAsC,CAC7C,OAAQnD,GAAyB,OAAsB,qBAAqB,QAAQ,EAAE,CAAC,CAAA,CAGzF,SAAS+C,GAA4C,CACnD,OAAO/C,GAAyB,KAAA,CAGlCoD,OAAAA,EAAAA,UAAU,IAAM,CACdtB,EAAiB,IAAInG,GAA2BqG,EAA0BmB,EAAA,CAAkB,EAC5F,WAAW,IAAMnB,EAAyB,MAAS,EAAG,GAAG,CAAA,CAC1D,EAEDqB,EAAAA,YAAY,IAAM,CAChBvB,GAAgB,UAAU,CAAA,CAC3B,8DApRCpD,EAAAA,mBAEM,MAAA,SAFG,0BAAJ,IAAIsB,EAA0B,MAAM,6BAAA,GACvCsD,aAAaC,EAAA,OAAA,UAAA,CAAA,EAAA,OAAA,EAAA,QAEf7E,EAAAA,mBA4BM,MAAA,CA3BJ,GAAG,iCACC,mBAAJ,IAAIwB,EACH,aAAU7B,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAD,GAAElB,EAAa,cAAC,cAAa,GACxC,SAAS,KACR,MAAKqB,EAAAA,eAAA,eAA+BoC,EAAW,MAAA,eAAA,kCAA+DzD,EAAY,YAAA,EAAyB,CAAA,YAAA4D,EAAA,OAAYN,EAAyB,KAAA,uBAAiCA,EAAyB,KAAA,6BAAuCM,EAAQ,KAAA,CAAA,GAQjS,UAAOzC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,EAAAA,SAAAF,GAAQ8C,EAA0B9C,CAAM,EAAA,CAAA,OAAA,CAAA,GAC/C,UAAOC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAqB,gBAAAtB,GAAO+C,EAAiB/C,CAAM,EAAA,CAAA,MAAA,CAAA,EAAA,GAEtCM,EAAAA,mBAWK,KAAA,CAXD,SAAS,aAAS,iBAAJ,IAAIuB,EAAiB,MAAM,cAAA,GAC3CuD,EAAAA,YASEC,GAAA,CARC,kBAAmBhD,EAAkB,MACrC,oBAAqBvD,EAAmB,oBACxC,aAAcA,EAAY,aAC1B,cAAeA,EAAa,cAC5B,0BAA2BsD,EAAyB,MACpD,iBAAgBtD,EAAa,cAC7B,iBAAgBA,EAAY,aAC5B,sBAAqBA,EAAiB,2PC3B3C,MAAM,6BACN,KAAK,eACL,cAAY,OACZ,YAAU,OACV,QAAQ,6BALV,OAAAsB,EAAA,UAAA,EAAAL,EAAA,mBAWM,MAXNM,GAWMJ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAJJK,EAAAA,mBAGE,OAAA,CAFA,kBAAgB,qBAChB,EAAE,ggBCiCR,MAAMzB,EAAQC,EAuBRwG,EAAYtG,MAAI,IAAI,EAE1B,SAASuG,GAAe,CAClB1G,EAAM,kBACLA,EAAM,cAAc,SAAS,CAAA,CAGpC,SAAS2G,EAAa9H,EAAsB,CACtCmB,EAAM,kBACRA,EAAM,cAAc,WAAW,EAC/BnB,EAAM,gBAAgB,EACtBA,EAAM,eAAe,GAEfmB,EAAA,cAAc,MAAMnB,CAAK,CACjC,CAGF,SAAS+H,EAAa/H,EAAsB,CACrCmB,EAAM,kBAAwBA,EAAA,cAAc,MAAMnB,CAAK,CAAA,CAG9D,SAASiC,GAAY,CACf2F,GAAW,OACqBA,EAAU,MACrC,KAAK,CACd,CAGF,SAASzF,GAAa,CAChByF,GAAW,OAAQA,EAAU,MAA4B,MAAM,CAAA,CAGrE,OAAAxF,EAAa,CAAE,UAAAH,EAAW,WAAAE,EAAY,UAAAyF,CAAA,CAAW,wBAjG/CvF,EAAA,mBAkCS,SAAA,SAjCH,YAAJ,IAAIuF,EACH,SAAUxG,EAAgB,iBAAA,GAAA,EAC1B,UAAO,CAAQmB,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,EAAA,SAAAF,GAAAwF,EAAaxF,CAAM,EAAA,CAAA,OAAA,CAAA,GACnBC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,EAAA,SAAAF,GAAAyF,EAAazF,CAAM,EAAA,CAAA,OAAA,CAAA,6BACrBlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,KAAA,CAAA,6BAC3BlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,IAAA,CAAA,6BACxBlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,MAAA,CAAA,IACxC,WAAUC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAD,GAAAlB,EAAA,cAAc,QAAQkB,CAAM,GACtC,uBAAOuF,KACR,KAAK,SACJ,MAAKpF,EAAA,eAAA,CAAA,CAAA,CAAA,gBAAsBtB,EAAM,kBAAoBA,EAAM,aAAY,EAClE,aAAa,CAAA,CAAA,GAEnBqG,aAAaC,EAAA,OAAA,UAAA,CAAA,EAAA,OAAA,EAAA,EACb7E,EAAAA,mBAkBO,OAAA,CAlBD,MAAMH,iBAAA,CAAA,uBAA+C,CAAA,aAAAtB,EAAM,aAAY,CAAA,CAAA,GAElEC,EAAU,sDADnBiB,EAAAA,mBAMO,OAAA,OAJL,MAAMI,EAAAA,eAAA,CAAA,mBACoB,CAAA,CAAA,aAAA,CAAAtB,EAAM,YAAA,CAAY,CAAA,CAAA,CAAA,GAE5CuG,EAAAA,YAAoCM,GAAA,CAArB,cAAY,MAAM,CAAA,OAG1B5G,EAAU,sDADnBiB,EAAAA,mBAMO,OAAA,OAJL,MAAMI,EAAAA,eAAA,CAAA,mBACmB,CAAA,CAAA,aAAAtB,EAAM,YAAA,CAAY,CAAA,CAAA,CAAA,GAEtBC,EAAU,YAAA,oBAA/B2C,EAAAA,YAA8DiE,GAAA,OAArB,cAAY,MAAA,qCAE3C5G,EAAU,YAAtBsB,EAAA,UAAA,EAAAL,EAAAA,mBAEO,OAFPwB,GAEO,EADLnB,YAAA,EAAAqB,EAAA,YAA2DkE,0BAAxB7G,EAAA,UAAxB,EAAA,CAAA,cAAY,OAAM,EAAA,2yBCqBrC,MAAMH,EAAOC,EACPC,EAAQC,EA0DR8G,EAAc5G,EAAI,IAAA,EAAqC,EAEvD6G,EAAmB,IAAIzH,GAEvB0H,EAAoB9G,MAAI,CAAC,EAEzB+G,EAAmBzG,EAAAA,SAAS,IAC5BT,EAAM,6BAA+B,KAAkBA,EAAM,4BAC1DiH,EAAkB,MAAQjH,EAAM,cACxC,EAEKmH,EAAehH,MAAa,EAAK,EAEjCiH,EAAmBjH,MAAa,EAAK,EAErCkH,EAAsBlH,MAAa,EAAK,EAExCmH,EAAoBnH,MAAI,EAAI,EAE5BoH,EAAcpH,MAAI,EAAK,EACvBqH,EAAarH,MAAI,EAAK,EAEtBsH,EAActH,MAAIuH,EAAQ,EAC1BC,EAAoBxH,MAAIyH,EAAS,EACjCC,EAAsB1H,MAAI2H,EAAU,EAEpCC,EAAQ5H,MAAI,EAAE,EAEpB2B,EAAA,MACE,IAAMiG,EAAM,MACZ,CAAC9C,EAAMC,IAAS,CACVD,IAASC,GAAQ,OAAOlF,EAAM,SAAY,cAAqBiF,CAAI,CAAA,CAE3E,EAEA,MAAM+C,EAAuB,IAAM,CAC7Bd,EAAiB,OAA0BS,GAAA,OAAO,UAAU,CAClE,EAEMM,EAAY,IAAM,CACtB,aAAaC,CAAuB,EACfF,EAAA,EACrBD,EAAM,MAAQ,GACdZ,EAAa,MAAQ,GACrBG,EAAkB,MAAQ,EAC5B,EAEMa,EAAc1H,EAAAA,SAAS,IACvB+G,GAAY,QAAU,GAAa,qBACnCD,GAAa,QAAU,GAAa,aACjCa,EAASpI,EAAM,QAAQ,CAC/B,EAEKqI,EAAmBC,GAAkB,CACrCA,GAAexI,EAAA,kBAAmBwI,CAAQ,EACpCL,EAAA,CACZ,EAEMG,EAAYpJ,GACTD,GACLC,EACAgB,EAAM,0BACNA,EAAM,mBACNA,EAAM,yBACR,EAGF,SAASuI,GAAuB,CAC9B,MAAAhB,EAAY,MAAQ,GACpBC,EAAW,MAAQ,GACb,IAAI,MAAM,yDAAyD,CAAA,CAG3E,SAASgB,GAAuB,CAC9B,MAAAjB,EAAY,MAAQ,GACpBC,EAAW,MAAQ,GACb,IAAI,MAAM,2EAA2E,CAAA,CAG7F,SAASiB,GAA2B,CAClC,MAAAlB,EAAY,MAAQ,GACpBC,EAAW,MAAQ,GACb,IAAI,MAAM,8DAA8D,CAAA,CAGhFrB,EAAAA,UAAU,IAAM,CACV,OAAOnG,EAAM,SAAY,YAAc,CAAC,MAAM,QAAQA,EAAM,OAAO,EAAwBuI,EAAA,EACxEG,EAAA,CAAA,CACxB,EAEK,MAAAC,EAAsBxI,MAAI,EAAK,EAE/ByI,EAAgBzI,MAAI,CAAC,EACrB0I,EAAe1I,MAAI,CAAC,EACpB2I,EAAqB3I,MAAI,CAAC,EAEhC2B,EAAA,MACE,IAAM+G,EAAa,MACnB,CAAC5D,EAAMC,IAAS,CACVD,GAAQC,GAAQ,CAACkC,EAAiB,QACpC0B,EAAmB,MAAQ7D,EAE/B,EACA,CAAE,UAAW,EAAK,CACpB,EAEAnD,EAAA,MACE,IAAMsF,EAAiB,MACtBnC,GAAS,CACHA,IACH6D,EAAmB,MAAQD,EAAa,MAE5C,EACA,CAAE,UAAW,EAAK,CACpB,EAEM,MAAAE,EAAoBtI,EAAAA,SAAS,IAAM,CAEnC,GAAA,OAAOT,EAAM,SAAY,YAAc,CAAC,MAAM,QAAQA,EAAM,OAAO,EAAG,OAAO+G,EAAY,MAC7F,MAAMiC,EAAMjB,EAAM,MACZkB,EAAKlC,EAAY,MAEvB,OAAOiC,IAAQ,GAAKC,EAAKA,EAAG,OAAQC,GAAMd,EAASc,CAAC,EAAE,YAAc,EAAA,SAASF,EAAI,YAAA,CAAa,CAAC,CAAA,CAChG,EAEDlH,EAAA,MACE,IAAMiH,EAAkB,MACxB,CAAC9D,EAAMC,IAAS,CACV,KAAK,UAAUD,CAAI,IAAM,KAAK,UAAUC,CAAI,GAAgCiE,EAAA,CAClF,EACA,CAAE,UAAW,GAAO,KAAM,EAAK,CACjC,EAEA,MAAMC,EAAgB,IAAM,CAC1BT,EAAoB,MAAQ,EAC9B,EAEMQ,EAA+B,IAAM,CACzC,MAAME,EAAgBC,EAAsB,EAC5CV,EAAc,MAAQS,EACTR,EAAA,MAAQQ,EAAgB,GAAKA,EAAgB,CAC5D,EAEA,SAASC,GAAwB,CAC3B,GAAAtJ,EAAM,UAAY,KAAa,MAAA,GAC7B,MAAAuJ,EAAcxC,EAAY,MAAM,IAAKmC,GAAMd,EAASc,CAAC,CAAC,EACtDM,EAAsBD,EAAY,OAAQL,GAAMA,IAAMd,EAASpI,EAAM,QAAQ,CAAC,EAChF,GAAAwJ,EAAoB,OAAS,EAAG,CAC5B,MAAAC,EAAkBD,EAAoB,IAAKN,GAAMK,EAAY,QAAQL,CAAC,CAAC,EAC7E,QAASQ,EAAI,EAAGA,EAAID,EAAgB,OAAQC,IAAK,CACzC,MAAAC,EAA8B,KAAK,UAAU5C,EAAY,MAAM0C,EAAgBC,CAAC,CAAC,CAAC,EAClFE,GAAuB,KAAK,UAAU5J,EAAM,QAAQ,EAC1D,GAAI2J,IAAgCC,GAA6B,OAAAH,EAAgBC,CAAC,CAAA,CAE7E,MAAA,EAAA,CAET,OAAOH,EAAY,QAAQnB,EAASpI,EAAM,QAAQ,CAAC,CAAA,CAGrD,MAAM6J,EAAW,IAAM,CACjBtC,EAAY,QACXJ,EAAa,QAChBC,EAAiB,MAAQ,GACI+B,EAAA,EACFW,EAAA,EAC3B3C,EAAa,MAAQ,IAEvBwB,EAAoB,MAAQ,GAC5BrB,EAAkB,MAAQ,GAC5B,EAEMwC,EAA6B,IAAM,CACvC,MAAMC,EAAwB,QAAQ,YAAc,MAAQ,OAAO,WAAa,IAC1EC,EAAwB,QAAQ,OAAS,MAAQ,OAAO,MAAQ,IAChEC,EAAgCtC,EAAkB,MAAM,cACzDoC,GAAgBC,IAAiB9C,EAAiB,QAClCgD,EAAA,EACflK,EAAM,8BACRiK,GAAW,eAAe,CAAE,MAAO,QAAS,OAAQ,SAAU,EAEpE,EAEME,EAAoBhK,MAAa,EAAI,EACvC,IAAA+H,EAA0B,WAAW,IAAM,GAAI,CAAC,EAEpD,SAASgC,GAAqB,CACtB,MAAAD,EAAgCtC,EAAkB,MAAM,aAC9D,GAAI,CAACsC,EAAW,OAChBE,EAAkB,MAAQ,GAC1B,IAAIC,EAAuD,KAE3D,MAAMC,EAAW,IAAM,CACjBD,iBAA6CA,CAA6B,EAC9E,aAAalC,CAAuB,EACpC,WAAW,IAAM,CACfiC,EAAkB,MAAQ,IACzB,GAAG,CACR,EAE0BjC,EAAA,WAAWmC,EAAU,GAAI,EAEnDD,EAAgC,YAAY,IAAM,EAE9CjD,EAAa,QAAU,IACtB8C,GAAW,YAAc,GAAK,SAAS,aAAe,aAE9CI,EAAA,GACV,GAAG,CAAA,CAGR,MAAMrJ,EAAa,IAAM,CACnBkG,GAAkB,OAAS,GAAMS,EAAkB,MAAM,WAAW,EAC/DE,GAAqB,OAAO,YAAYA,GAAqB,OAAO,WAAW,CAC1F,EAEA,eAAea,GAAmC,CAC5C,OAAO1I,EAAM,SAAY,WAC3B,MAAMsK,EAASvC,EAAM,MAAQA,EAAM,MAAQ,OAAW,EAAI,GAE1DwC,GAAoBvK,EAAM,OAA0C,EAClDiH,EAAA,MAAQF,EAAY,MAAM,QAE3ByD,EAAA,CAAA,CAGRvJ,EAAA,CAAE,kBAAAyH,EAAmB,SAAAN,EAAU,EAE5C,SAASoC,GAAqB,CACHlB,KAA2B,IACEvC,EAAY,OAAS,CAAC,CAACA,EAAY,MAAM,CAAC,GACjEsB,EAAgBtB,EAAY,MAAM,CAAC,CAAC,CAAA,CAGtD,eAAAuD,EAASG,EAAuBC,EAAyB,GAAM,CAC5EnD,EAAY,MAAQmD,EACpB,MAAM9K,EAAO,SAAaI,EAAM,QAAqBA,EAAM,eAAgByK,GAAgB,EAAE,EACvFE,EAAQhL,GAA2B,EACnC,CAACA,GAAY,EAAE,SAAUA,KAAgC4I,EAAA,EAC7DgC,GAAoB5K,EAAS,IAAI,EACjCiL,EAAgBjL,GAAU,MAAM,QAAU,CAAC,EAAE,KAAK,IAAM,CACtD4H,EAAY,MAAQ,EAAA,CACrB,CACH,EACM,MAAAP,EAAiB,gBAAgBpH,EAAM+K,CAAI,CAAA,CAGnD,eAAeC,EAAgBC,EAAmC,CAChE,MAAMjL,EAAO,SAAaI,EAAM,QAAqB,EAAG,EAAE,EACpD2K,EAAQhL,GAA2B,EACnC,CAACA,GAAY,EAAE,aAAcA,KAAgC6I,EAAA,EAC/CvB,EAAA,MAAQtH,EAAS,UAAYkL,CACjD,EACM,MAAA7D,EAAiB,gBAAgBpH,EAAM+K,CAAI,CAAA,CAGnD,MAAMG,GAAqC,IACHnD,GAAmB,OAAO,cAC9C,qBAAqB,IAAI,EAAEkB,EAAa,KAAK,GAAK,KAGhEkC,GAASlM,GAAgB,CACzBsI,EAAa,OAAS,GACf0C,EAAA,EACAhL,GACTmM,GAASnM,CAAK,CAElB,EAEMmM,GAAYnM,GAAe,CACzB,MAAAoM,EAAcpM,EAAM,KAAOA,EAAM,MACnCoM,IAAQ,OAASA,IAAQ,WAAoBhD,EAAA,EAC7CgD,IAAQ,aAAaC,GAAKrM,CAAK,EAC/BoM,IAAQ,WAAWE,GAAGtM,CAAK,GAC3BoM,IAAQ,SAAWA,IAAQ,MAAiCG,GAAA,EAChEvM,EAAM,eAAe,EACrBA,EAAM,gBAAgB,CACxB,EAEMuM,GAA8B,IAAM,CACpCrC,EAAkB,MAAM,OAAS,GACnC3B,EAAiB,MAAQ,GACzBiB,EAAgBU,EAAkB,MAAMF,EAAa,KAAK,CAAC,GAEjDZ,EAAA,CAEd,EAEMiD,GAAQrM,GAAe,CAC3ByI,EAAkB,MAAQ,GACtBuB,EAAa,MAAQE,EAAkB,MAAM,OAAS,IACxDlK,EAAM,eAAe,EACrB8J,EAAoB,MAAQ,GACfE,EAAA,QACbiC,GAAA,GAAsC,MAAM,EAEhD,EAEMK,GAAMtM,GAAe,CACzByI,EAAkB,MAAQ,GACtBuB,EAAa,MAAQ,IACvBhK,EAAM,eAAe,EACrB8J,EAAoB,MAAQ,GACfE,EAAA,QACbiC,GAAA,GAAsC,MAAM,EAEhD,EAEMO,GAAWxM,GAAe,CAC1B,GAAAsI,GAAc,QAAU,GAAO,OAC/BY,EAAM,MAAM,OAAS,MAAoB,MAAQ,IAC/C,MAAA5D,EAA2BsD,GAAa,OAAO,iBAC/C6D,EAAgC3D,GAAmB,OAAO,aAC1D4D,EAAc1M,GAAO,eAAiByM,GAAW,YAAYzM,GAAO,aAAa,EACjF2M,EAAS3M,GAAO,eAAiBsF,GAAQA,EAAK,SAAStF,GAAO,aAAa,EAC3E4M,GAAa5M,GAAO,eAAiBsF,GAAQA,EAAK,YAAYtF,GAAO,aAAa,EACxF,GAAI,EAAA2M,GAAUD,GACd,IAAIE,GAAY,CACHzK,EAAA,EACX,MAAA,CAEQiH,EAAA,EACZ,EAEA,SAASsC,GAAoBmB,EAAwC,CAC9D,MAAM,QAAQA,CAAK,GAAwBnD,EAAA,EAC5CmD,EAAM,OAAS,GAAK,OAAOA,EAAM,CAAC,GAAM,UAAUC,GAAmBD,CAAsB,EAC/F3E,EAAY,MAAQ2E,CAAA,CAGtB,SAASC,GAAmBC,EAAuB,EAC7C,CAAC5L,EAAM,oBAAsBA,EAAM,mBAAmB,SAAW,IAA4ByI,EAAA,EACjG,MAAMwC,EAAcjL,EAAM,mBAC1B,QAAS0J,EAAI,EAAGA,EAAIkC,EAAO,OAAQlC,KAC7B,OAAOkC,EAAOlC,CAAC,GAAM,UAAY,EAAEuB,KAAOW,EAAOlC,CAAC,KAA6BjB,EAAA,CACrF,CAGF,MAAMoD,EAAgB,CACpB,SAAAhC,EACA,QAAAwB,GACA,MAAAN,GACA,cAAA3B,EACA,SAAAhB,EACA,gBAAAC,EACA,WAAArH,EACA,UAAAiH,CACF,8BAzcE/G,EAAA,mBAoCM,MAAA,CApCD,MAAA,CAA0B,SAAA,UAAA,EAAE,MAAKI,EAAA,eAAEwK,EAAM,OAAC,KAAK,CAAA,GAClDvF,EAAAA,YAkCYmB,GAAA,SAjCN,cAAJ,IAAID,EACH,iBAAgBN,EAAY,MAC5B,kBAAmB4B,EAAiB,MACpC,oBAAqBJ,EAAmB,MACxC,aAAcG,EAAkB,MAChC,cAAeF,EAAa,MAC5B,sBAAqB3I,EAAe,gBACpC,6BAA4BA,EAAuB,wBACnD,iBAAgB4L,EACT,gBAAiBzE,EAAgB,gDAAhBA,EAAgB,MAAAjG,GACxC,sBAAqB8F,EAAiB,MACtC,sBAAmB7F,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAD,GAAEkG,EAAmB,MAAGlG,GAC3C,kBAAmBgJ,EAAiB,MACpC,qBAAoBjD,EAAgB,KAAA,qBAErC,IAiBc,CAjBdX,EAAAA,YAiBcuB,GAAA,SAhBR,sBAAJ,IAAID,EACH,iBAAgBgE,EAChB,iBAAgB1E,EAAY,MAC5B,qBAAoBD,EAAgB,MACpC,cAAajH,EAAU,WACvB,yBAAwBoH,EAAmB,KAAA,qBAE5C,IAQE,CARFd,EAAAA,YAQEqB,GAAA,SAPI,oBAAJ,IAAID,EACH,qBAAoBT,EAAgB,MACpC,iBAAgBC,EAAY,MAC5B,YAAagB,EAAW,MACxB,sBAAqBb,EAAiB,MACtC,iBAAgBuE,EAChB,iBAAYzK,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAD,GAAE4G,EAAK,MAAG5G,EAAA"}
|
|
1
|
+
{"version":3,"file":"super-list.umd.cjs","sources":["../src/DropDownLibrary.ts","../src/ListInputComponents/ListTextInput.vue","../src/ListInputComponents/default-tick.vue","../src/ListInputComponents/ListItem.vue","../src/ListInputComponents/ItemList.vue","../src/ListInputComponents/default-arrow.vue","../src/ListInputComponents/ListButton.vue","../src/super-list.vue"],"sourcesContent":["export interface DocumentViewChangeListener {\n targetNode: HTMLElement\n observe(): void\n unobserve(): void\n pauseMutationObserver(): void\n unpauseMutationObserver(): void\n}\n\nexport class DocumentViewChangeListener implements DocumentViewChangeListener {\n private readonly eventsTypes: string[] = ['resize', 'load', 'scroll', 'wheel', 'touchmove']\n private readonly config: MutationObserverInit = {\n attributes: true,\n childList: true,\n subtree: true\n }\n private mutationObserver: MutationObserver\n private callbackFunction: EventListenerOrEventListenerObject\n\n constructor(targetFunction: Function, targetNode: any = document.body) {\n this.targetNode = targetNode\n this.callbackFunction = ((event: any) =>\n targetFunction(event)) as EventListenerOrEventListenerObject\n this.mutationObserver = new MutationObserver((() => targetFunction()) as MutationCallback)\n }\n\n public observe(): void {\n this.mutationObserver.observe(this.targetNode, this.config)\n for (const eventType of this.eventsTypes) this.addListener(eventType)\n this.addResizeListener()\n this.addTransitionEndListener()\n }\n\n pauseMutationObserver(): void {\n this.mutationObserver.disconnect()\n }\n\n unpauseMutationObserver(): void {\n this.mutationObserver.observe(this.targetNode, this.config)\n }\n\n public unobserve(): void {\n this.mutationObserver.disconnect()\n for (const eventType of this.eventsTypes) this.removeListener(eventType)\n this.removeResizeListener()\n this.removeTransitionEndListener()\n }\n\n private addListener(eventType: string): void {\n document.addEventListener(eventType, this.callbackFunction, true)\n }\n\n private removeListener(eventType: string): void {\n document.removeEventListener(eventType, this.callbackFunction, true)\n }\n\n private addTransitionEndListener(): void {\n this.targetNode.addEventListener('transitionend', this.callbackFunction)\n }\n\n private removeTransitionEndListener(): void {\n this.targetNode.removeEventListener('transitionend', this.callbackFunction)\n }\n\n private addResizeListener(): void {\n window.addEventListener('resize', this.callbackFunction)\n }\n\n private removeResizeListener(): void {\n window.removeEventListener('resize', this.callbackFunction)\n }\n}\n\nexport function getLabelString(\n value: string | number | object | null | undefined,\n customLabelGetFunction: Function | null | undefined,\n objectLabelKeyName: string | null,\n enumKeyToLabelObjectArray?: EnumType[]\n): string {\n if (customLabelGetFunction != null) return customLabelGetFunction(value)\n if (value == null) return ''\n if (typeof value === 'object') return value[objectLabelKeyName as keyof typeof value]\n if (enumKeyToLabelObjectArray) return getEnumLabel(value, enumKeyToLabelObjectArray)\n return '' + value\n}\n\nfunction getEnumLabel(value: string | number, enumKeyArray: EnumType[]): string {\n return (enumKeyArray.find((eT: EnumType): boolean => eT.type === value)?.label ?? '') as string\n}\n\nexport type ListRequest = (maxNumItems: number, stringFilter?: string) => Promise<DataSet<any>>\n\nexport type EnumType = { type: string; label: string }\n\nexport type DataSet<T> = { data: T[]; totalNum: number; modelName?: string }\n\nexport interface AbortablePromise {\n abortController: AbortController\n func: Function\n then: Function\n}\n\nexport class AbortablePromise implements AbortablePromise {\n constructor() {\n this.abortController = new AbortController()\n this.func = (): void => {}\n this.then = (): void => {}\n }\n\n async abortablePromise(signal: AbortSignal, asyncFunc: Function, then: Function): Promise<any> {\n const response = await asyncFunc()\n if (signal.aborted) return\n return then(response)\n }\n\n setFunc(func: Function): void {\n this.func = func\n }\n\n setThen(then: Function): void {\n this.then = then\n }\n\n execute(): Promise<any> {\n return this.abortablePromise(this.abortController.signal, this.func, this.then)\n }\n\n abort(reason?: string): void {\n this.abortController.abort(reason || 'Aborted By Controller.')\n this.abortController = new AbortController()\n }\n\n resetAndExecute(func: Function, then: Function): Promise<any> {\n this.abort('New Request From Controller.')\n this.setFunc(func)\n this.setThen(then)\n return this.execute()\n }\n}\n","<template>\n <input\n ref=\"textInputRef\"\n :tabindex=\"enableTextFilter ? 0 : -1\"\n @keydown.enter=\"parentMethods.press($event)\"\n @keydown.space=\"parentMethods.press()\"\n @keydown.esc=\"parentMethods.press($event)\"\n @keydown.up=\"parentMethods.press($event)\"\n @keydown.down=\"parentMethods.press($event)\"\n @focusin=\"focusInHandler($event)\"\n @focusout=\"focusOutHandler($event)\"\n @input=\"updateQuery($event as InputEvent)\"\n type=\"text\"\n aria-autocomplete=\"none\"\n autocomplete=\"off\"\n :placeholder=\"placeholder\"\n :size=\"textInputSize\"\n :class=\"[\n pointerEventsClass,\n textInputColourClass,\n { 'text-filter-disabled': !enableTextFilter }\n ]\"\n class=\"list-filter-text-input\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, type PropType, ref } from 'vue'\n\nconst emit = defineEmits({\n 'update:selected': null,\n 'update:query': null,\n 'update:press': null\n})\n\nconst props = defineProps({\n enableTextFilter: {\n type: Boolean as PropType<boolean | null>,\n required: true\n },\n placeholder: {\n type: String as PropType<string | undefined>,\n default: undefined\n },\n enableButtonClick: {\n type: Boolean as PropType<boolean | null>,\n default: true\n },\n parentMethods: {\n type: Object,\n required: true\n },\n showDropDown: {\n type: Boolean,\n required: true\n }\n})\nconst textInputRef = ref(null)\n\nfunction focusInHandler(e: FocusEvent) {\n if ('sourceCapabilities' in e && e.sourceCapabilities == null) props.parentMethods.closeList()\n else props.parentMethods.openList()\n}\n\nfunction focusOutHandler(event: FocusEvent) {\n props.parentMethods.unfocus(event)\n}\n\nfunction updateQuery(event: any) {\n if (event?.target?.value != undefined) emit('update:query', event.target.value)\n}\n\nconst textInputSize = computed(() => {\n const refLength: number = textInputRef?.value ? (textInputRef.value as string).length : 0\n const placeHolderLength: number = props.placeholder?.length || 0\n return refLength > 0 ? refLength : placeHolderLength > 0 ? placeHolderLength : 5\n})\n\nconst pointerEventsClass = computed(() => {\n const enable: boolean = props.enableButtonClick === true && props.enableTextFilter === true\n return enable ? '' : 'click-through'\n})\n\nconst textInputColourClass = computed(() => {\n const dark: boolean = (props.showDropDown && !props.enableTextFilter) || !props.showDropDown\n return dark ? 'dark-placeholder-text' : 'light-placeholder-text'\n})\n\nfunction blurInput() {\n if (textInputRef?.value) {\n const input: HTMLInputElement = textInputRef.value\n input.blur()\n input.value = ''\n }\n}\n\nfunction focusInput() {\n if (textInputRef?.value) (textInputRef.value as HTMLInputElement).focus()\n}\n\ndefineExpose({ blurInput, focusInput, textInputRef })\n</script>\n\n<style scoped>\n.list-filter-text-input {\n color: var(--superlist-text-colour, rgb(17, 24, 39));\n text-align: center;\n padding: 0.125rem 2rem 0.125rem 0.5rem !important;\n width: 100%;\n height: 100%;\n margin: 0;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n background-color: transparent;\n border: 0 none;\n pointer-events: auto;\n cursor: text;\n}\n\n.list-filter-text-input:focus,\n.list-filter-text-input:focus-visible,\n.list-filter-text-input:active {\n text-align: left;\n}\n\n.click-through {\n pointer-events: none;\n}\n\n.dark-placeholder-text::placeholder {\n color: var(--superlist-text-colour, rgb(17, 24, 39));\n}\n\n.light-placeholder-text::placeholder {\n color: var(--superlist-disabled-text-colour, rgb(120, 125, 130));\n}\n\n.text-filter-disabled {\n background-color: transparent;\n border: none;\n outline: none;\n box-shadow: none;\n filter: none;\n}\n\n@media (min-width: 640px) {\n .list-filter-text-input {\n font-size: 0.875rem;\n line-height: 1.5rem;\n }\n}\n</style>\n","<template>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n data-slot=\"icon\"\n viewBox=\"0 -16 16 17\"\n >\n <path\n shape-rendering=\"geometricPrecision\"\n d=\"M 6 -2.25 L 13.75 -14 A 0.5 0.5 90 0 1 15 -13 L 6.5 -0.5 A 2 1 90 0 1 5.5 -0.5 L 1 -6 A 0.5 0.5 90 0 1 2.25 -7 Z\"\n />\n </svg>\n</template>\n","<template>\n <li\n v-for=\"(listItem, index) in filteredListItems\"\n :key=\"index\"\n ref=\"items\"\n @keyup.enter=\"parentMethods.press($event)\"\n @keyup.space=\"parentMethods.press($event)\"\n @keyup.esc=\"parentMethods.press($event)\"\n @keydown.up=\"parentMethods.press($event)\"\n @keydown.down=\"parentMethods.press($event)\"\n @focusout=\"parentMethods.unfocus($event)\"\n tabindex=\"-1\"\n @mousedown.left=\"parentMethods.updatedSelected(listItem)\"\n :class=\"[\n { 'list-option-selected': selectedIndex === index },\n {\n 'list-option-active':\n filteredListItems.length === 1 || (focusedIndex === index && !mouseHoveringOnList)\n },\n 'list-option'\n ]\"\n >\n <span class=\"list-item-span\">{{ parentMethods.getLabel(listItem) }}</span>\n <default-tick v-if=\"selectedIndex === index\" class=\"list-item-icon\" aria-hidden=\"true\" />\n </li>\n <li\n v-if=\"filteredListItems.length === 0\"\n @keyup.enter=\"parentMethods.press($event)\"\n @keyup.space=\"parentMethods.press($event)\"\n @keyup.esc=\"parentMethods.press($event)\"\n @keydown.up=\"parentMethods.press($event)\"\n @keydown.down=\"parentMethods.press($event)\"\n @focusout=\"parentMethods.unfocus($event)\"\n @mousedown.left=\"parentMethods.closeList($event)\"\n tabindex=\"-1\"\n class=\"list-option-message\"\n >\n <span class=\"list-item-span\">No Items To Display.</span>\n </li>\n <li\n v-if=\"totalOptionsCount && totalOptionsCount > (filteredListItems?.length || 0)\"\n @keyup.enter=\"parentMethods.press($event)\"\n @keyup.space=\"parentMethods.press($event)\"\n @keyup.esc=\"parentMethods.press($event)\"\n @keydown.up=\"parentMethods.press($event)\"\n @keydown.down=\"parentMethods.press($event)\"\n @focusout=\"parentMethods.unfocus($event)\"\n @mousedown.left=\"parentMethods.closeList($event)\"\n tabindex=\"-1\"\n class=\"list-option-message\"\n >\n <span class=\"list-item-span\">\n +{{ totalOptionsCount - filteredListItems?.length || 0 }} More Items...</span\n >\n </li>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, type ShallowRef, useTemplateRef, watch } from 'vue'\nimport DefaultTick from './default-tick.vue'\nconst props = defineProps({\n mouseHoveringOnList: {\n type: Boolean,\n default: false\n },\n filteredListItems: {\n type: Array,\n default: () => []\n },\n focusedIndex: {\n type: Number,\n default: null\n },\n selectedIndex: {\n type: Number,\n default: null\n },\n listElementOpenAndVisible: {\n type: Boolean,\n default: false\n },\n parentMethods: {\n type: Object,\n required: true\n },\n showDropDown: {\n type: Boolean,\n default: false\n },\n totalOptionsCount: {\n type: Number,\n default: 0\n }\n})\ntype HTMLLIElementOrArray = HTMLLIElement | HTMLLIElement[] | null\nconst iRefs: Readonly<ShallowRef<HTMLLIElementOrArray>> = useTemplateRef('items')\n\nconst focusedLi = computed((): HTMLElement | null => {\n if (!iRefs?.value) return null\n const refs: Array<HTMLLIElement | null> = Array.isArray(iRefs.value) ? iRefs.value : [iRefs.value]\n const focused = refs[props.focusedIndex]\n if (!focused) return null\n const isObject: boolean = typeof focused == 'object'\n const hasScrollIntoView: boolean = isObject && 'scrollIntoView' in focused\n const hasScrollFunc: boolean = hasScrollIntoView && typeof focused['scrollIntoView'] == 'function'\n return hasScrollFunc ? focused : null\n})\n\nwatch(\n () => props.showDropDown,\n () => scrollHighlightedListItemToTop()\n)\nwatch(\n () => props.listElementOpenAndVisible,\n () => scrollHighlightedListItemIntoView()\n)\nwatch(\n () => focusedLi.value,\n () => scrollHighlightedListItemIntoView()\n)\n\nfunction scrollHighlightedListItemToTop(): void {\n if (!props.showDropDown || !focusedLi?.value?.parentElement?.parentElement) return\n focusedLi.value.parentElement.parentElement.scrollTop = focusedLi.value.offsetTop\n}\n\nfunction scrollHighlightedListItemIntoView(): void {\n const li = focusedLi.value\n const liParent = li?.parentElement?.parentElement\n if (!props.showDropDown || !li || !liParent) return\n const aboveTop = li.offsetTop - liParent.scrollTop < 0\n const belowBottom = li.offsetTop + li.offsetHeight - liParent.scrollTop > liParent.clientHeight\n if (aboveTop) liParent.scrollTop = li.offsetTop\n if (belowBottom) liParent.scrollTop = li.offsetTop + li.clientHeight - liParent.clientHeight\n}\n</script>\n\n<style scoped>\n.list-option {\n text-transform: capitalize;\n display: inline-flex;\n width: 100%;\n position: relative;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n background-color: transparent;\n color: var(--superlist-text-colour, rgb(55, 60, 65));\n transition-property: font-weight, background-color, color, text-shadow;\n transition-duration: 500ms;\n transition-timing-function: ease;\n font-weight: 400;\n text-shadow: 1px 1px 3px var(--superlist-background-colour, white);\n}\n\n.list-option:focus-visible,\n.list-option > span:focus-visible {\n outline: none;\n}\n\n.list-option-selected {\n font-weight: 600;\n}\n\n.list-option-message {\n text-shadow: 1px 1px 3px var(--superlist-background-colour, white);\n text-transform: capitalize;\n display: inline-flex;\n width: 100%;\n position: relative;\n cursor: default;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n background-color: transparent;\n color: var(--superlist-disabled-text-colour, rgb(120, 125, 130));\n}\n\n.list-option-active:hover,\n.list-option-active,\n.list-option-selected:hover,\n.list-option:hover {\n font-weight: 600;\n background-color: var(--superlist-theme-colour, rgb(77, 168, 11, 0.8));\n color: var(--superlist-background-colour, white);\n text-shadow: 1px 1px 3px var(--superlist-theme-colour, rgb(77, 168, 11, 0.8));\n transition-duration: 0s !important;\n}\n\n.list-item-icon {\n display: flex;\n height: 1rem;\n width: 1rem;\n position: absolute;\n right: 0.7rem;\n margin-top: -0.1rem;\n align-self: center;\n}\n\n.list-item-span {\n padding: 0.5rem 1.75rem 0.5rem 0.75rem;\n width: 100%;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n</style>\n","<template>\n <div ref=\"dropDownButtonContainer\" class=\"super-list-button-container\">\n <slot></slot>\n </div>\n <div\n id=\"super-list-select-list\"\n ref=\"listContainerRef\"\n @mouseenter=\"parentMethods.mouseOverList()\"\n tabindex=\"-1\"\n :class=\"[\n 'select-list',\n reverseList ? 'list-reverse' : 'list-normal',\n { 'select-list-open': showDropDown },\n { 'no-scroll': noScroll && listElementOpenAndVisible },\n { 'select-list-fixed': listElementOpenAndVisible },\n { 'select-list-scrollable': !noScroll }\n ]\"\n @keydown.space=\"preventSpaceScrollingList($event)\"\n @mouseup.left=\"refocusTextInput($event)\"\n >\n <ul tabindex=\"-1\" ref=\"dropDownListUL\" class=\"list-content\">\n <list-item\n :filteredListItems=\"listItemsToDisplay\"\n :mouseHoveringOnList=\"mouseHoveringOnList\"\n :focusedIndex=\"focusedIndex\"\n :selectedIndex=\"selectedIndex\"\n :listElementOpenAndVisible=\"listElementOpenAndVisible\"\n :parent-methods=\"parentMethods\"\n :show-drop-down=\"showDropDown\"\n :total-options-count=\"totalOptionsCount\"\n />\n </ul>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n computed,\n type ComputedRef,\n nextTick,\n onMounted,\n onUnmounted,\n type PropType,\n ref,\n watch\n} from 'vue'\nimport ListItem from '../ListInputComponents/ListItem.vue'\nimport { DocumentViewChangeListener } from '../DropDownLibrary'\n\nconst emit = defineEmits(['reverseDropDownList'])\n\nconst props = defineProps({\n mouseHoveringOnList: {\n type: Boolean,\n default: false\n },\n filteredListItems: {\n type: Array,\n default: () => []\n },\n focusedIndex: {\n type: Number,\n default: null\n },\n selectedIndex: {\n type: Number,\n default: null\n },\n parentMethods: {\n type: Object,\n required: true\n },\n showDropDown: {\n type: Boolean,\n required: true\n },\n maxListHeightPX: {\n type: Number,\n required: true\n },\n listAnimationDurationMs: {\n type: Number as PropType<number>,\n required: true\n },\n blockListChange: {\n type: Boolean,\n required: true\n },\n totalOptionsCount: {\n type: Number,\n default: 0\n },\n enableScrollClose: {\n type: Boolean,\n default: true\n }\n})\n\nconst dropDownButtonContainer = ref<HTMLElement | null>(null)\nconst dropDownListUL = ref<HTMLElement | null>(null)\nconst listContainerRef = ref<HTMLElement | null>(null)\nconst offsetLeft = ref<number>(0)\nconst offsetTop = ref<number>(0)\nconst offsetBottom = ref<number>(0)\nconst listOffset = ref<number>(0)\nconst parentWidthPx = ref<string>('0px')\nconst listElementOpenAndVisible = ref<boolean>(false)\nconst listItemsToDisplay = ref<any[]>([])\nconst listHeightPx = ref<number>(0)\n\nconst reverseList = computed((): boolean => {\n if (!listElementOpenAndVisible.value || window?.innerHeight == null) return false\n return sufficientRoomAbove() && insufficientRoomBelow()\n})\n\nconst noScroll = computed((): boolean => {\n return props.maxListHeightPX >= listHeightPx.value\n})\n\nwatch(\n () => reverseList.value,\n (reverse: boolean) => emit('reverseDropDownList', reverse),\n { immediate: true }\n)\n\nconst parentXPx = computed((): string => offsetLeft.value + 'px')\nconst parentYPx = computed((): string => listOffset.value + 'px')\n\ndefineExpose({ listContainerRef })\n\nconst preventSpaceScrollingList = (event: any) => {\n if (event?.key && event.key === ' ') event.preventDefault()\n}\n\nconst refocusTextInput = (event: MouseEvent) => {\n const list = listContainerRef?.value as HTMLElement | null\n const target = event.target as HTMLElement | null\n if (!(list && target && list.contains(target)) || list.isEqualNode(target))\n props.parentMethods.focusInput()\n}\n\nfunction getListULHeight(): number {\n return dropDownListUL?.value ? (dropDownListUL?.value as HTMLElement).clientHeight : 0\n}\n\nfunction displayableListHeight(): number {\n if (!listElementOpenAndVisible.value || getListULHeight() === 0) return props.maxListHeightPX\n const ulHt: number = getListULHeight() === 0 ? props.maxListHeightPX : +getListULHeight()\n return props.maxListHeightPX && props.maxListHeightPX > ulHt ? ulHt : props.maxListHeightPX\n}\n\nfunction sufficientRoomAbove(): boolean {\n return offsetTop.value > displayableListHeight()\n}\n\nfunction insufficientRoomBelow(): boolean {\n return offsetBottom.value < displayableListHeight()\n}\n\nconst maxListHeightPx = computed((): string => (props.maxListHeightPX || 0) + 'px')\n\nconst animationDuration = computed((): string => (props.listAnimationDurationMs || 0) + 'ms')\n\nconst updatedListItemsToDisplay = computed((): any[] => {\n return !props.blockListChange ? props.filteredListItems : listItemsToDisplay.value\n})\n\nwatch(\n () => updatedListItemsToDisplay,\n (newVal: ComputedRef<any[]>) => {\n if (newVal) listItemsToDisplay.value = newVal.value\n },\n { immediate: false, deep: true }\n)\n\nlet unobserveTimeout = setTimeout(() => {}, 0)\n\nlet changeListener: DocumentViewChangeListener | null = null\n\nfunction openAndObserveChangeListener() {\n listHeightPx.value = getListULHeight()\n clearTimeout(unobserveTimeout)\n if (changeListener) changeListener.observe()\n listElementOpenAndVisible.value = true\n buttonRePositionCallback(undefined)\n}\n\nfunction closeAndUnobserveChangeListener() {\n clearTimeout(unobserveTimeout)\n unobserveTimeout = setTimeout(() => {\n if (!props.showDropDown) {\n listElementOpenAndVisible.value = false\n if (changeListener) changeListener.unobserve()\n }\n }, props.listAnimationDurationMs + 50)\n}\n\nwatch(\n () => props.showDropDown,\n (newV, oldV) => {\n if (newV !== oldV) {\n setOffsets()\n if (newV) openAndObserveChangeListener()\n else closeAndUnobserveChangeListener()\n }\n },\n { immediate: true }\n)\n\nfunction buttonRePositionCallback(e: any): void {\n setOffsets()\n nextTick(() => setOffsets())\n closeListOnScrollIfNecessary(e)\n}\n\nfunction closeListOnScrollIfNecessary(e: any) {\n if (!props.enableScrollClose || !props.showDropDown) return\n const notInitialized: boolean = typeof listContainerRef?.value?.contains !== 'function'\n if (notInitialized || e?.target?.nodeType == null || insideListOrOtherList(e)) return\n const isScrollEvent: boolean = ['scroll', 'wheel', 'touchmove'].includes(e?.type)\n if (props.showDropDown && isScrollEvent) props.parentMethods.closeList()\n}\n\nfunction insideListOrOtherList(e: any): boolean {\n const insideButton: boolean = !!dropDownButtonContainer.value?.contains(e?.target as Node)\n const insideList: boolean = !!listContainerRef.value?.contains(e.target as Node)\n const otherList: boolean = [e?.srcElement?.id, e?.target?.id].includes('super-list-select-list')\n return insideButton || insideList || otherList\n}\n\nfunction setOffsets(): void {\n setButtonOffset()\n setListOffset()\n}\n\nfunction setButtonOffset(): void {\n if (dropDownButtonContainer?.value == null) return\n const brc: DOMRect = (dropDownButtonContainer.value as HTMLElement).getBoundingClientRect()\n offsetTop.value = brc.top\n offsetBottom.value = window.innerHeight - brc.bottom\n parentWidthPx.value = brc.width + 'px'\n}\n\nfunction setListOffset(): void {\n /**\n * List container must be used when calculating position and not \"dropDownListUL\".\n * Position must be calculated as window viewport might not match list container viewport.\n **/\n if (dropDownButtonContainer?.value == null || listContainerRef?.value == null) return\n const brc: DOMRect = getButtonContainerElement().getBoundingClientRect()\n const slrc: DOMRect = (listContainerRef.value as HTMLElement).getBoundingClientRect()\n const currentListOffset: number = listOffset.value\n const currentOffsetLeft: number = offsetLeft.value\n if (reverseList.value) listOffset.value = currentListOffset - (brc.top - slrc.bottom)\n else listOffset.value = currentListOffset - (slrc.top - brc.bottom)\n offsetLeft.value = currentOffsetLeft - (slrc.left - brc.left)\n}\n\nfunction getButtonElement(): HTMLButtonElement {\n return (dropDownButtonContainer?.value as HTMLElement).getElementsByTagName('button')[0]\n}\n\nfunction getButtonContainerElement(): HTMLDivElement {\n return dropDownButtonContainer?.value as HTMLDivElement\n}\n\nonMounted(() => {\n changeListener = new DocumentViewChangeListener(buttonRePositionCallback, getButtonElement())\n setTimeout(() => buttonRePositionCallback(undefined), 250)\n})\n\nonUnmounted(() => {\n changeListener?.unobserve()\n})\n</script>\n\n<style scoped>\n.list-normal {\n top: var(--parent-y);\n}\n\n.list-reverse {\n bottom: var(--parent-y);\n}\n\n.select-list {\n --parent-width: v-bind(parentWidthPx);\n --parent-x: v-bind(parentXPx);\n --parent-y: v-bind(parentYPx);\n --duration: v-bind(animationDuration);\n --border-radius: var(--superlist-list-border-radius, 0);\n border-radius: var(--border-radius);\n width: var(--parent-width);\n min-width: var(--parent-width);\n left: var(--parent-x);\n display: block;\n transition-property: max-height, opacity, visibility, box-shadow;\n transition-duration: var(--duration, 300ms);\n transition-timing-function: cubic-bezier(0.1, 0.9, 0.35, 0.98);\n position: absolute;\n backdrop-filter: blur(3px);\n -webkit-backdrop-filter: blur(3px);\n background-color: rgb(255, 255, 255, 0.7);\n align-items: baseline;\n opacity: 0.25;\n z-index: 999;\n visibility: collapse;\n overflow: auto;\n max-height: 0;\n border: none !important; /* can't transition border */\n}\n\n.select-list:focus-visible,\n.select-list > ul:focus-visible,\n.super-list-button-container:focus-visible {\n outline: none;\n}\n\n.super-list-button-container {\n height: 100%;\n width: 100%;\n}\n\n.select-list.select-list-open {\n z-index: 999999;\n --max-height: v-bind(maxListHeightPx);\n max-height: var(--max-height, 0);\n}\n\n.select-list.no-scroll {\n overflow: hidden;\n}\n\n.select-list-fixed {\n position: fixed;\n opacity: 1;\n visibility: visible;\n}\n\n.list-content {\n --duration: v-bind(animationDuration);\n overflow: visible;\n margin: 0;\n padding: 0;\n border-style: none;\n color: var(--superlist-text-colour, rgb(55, 60, 65));\n list-style: none;\n max-width: 100%;\n}\n\n.select-list.select-list-scrollable {\n border-radius: var(--border-radius);\n}\n\n.select-list:not(.select-list-fixed) {\n transition: none;\n box-shadow: none !important;\n}\n\n@media (min-width: 640px) {\n .select-list.select-list-scrollable {\n border-radius: var(--border-radius) 0 0 var(--border-radius);\n }\n .list-content {\n font-size: 0.875rem;\n line-height: 1.25rem;\n }\n}\n</style>\n","<template>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n data-slot=\"icon\"\n viewBox=\"0 0 12 6\"\n >\n <path\n shape-rendering=\"geometricPrecision\"\n d=\"M 6 4 L 10 0.25 A 0.5 0.5 90 0 1 11 1.25 L 6.5 5.75 A 15 3 90 0 1 5.5 5.75 L 1 1.25 A 0.5 0.5 90 0 1 2 0.25 Z\"\n />\n </svg>\n</template>\n","<template>\n <button\n ref=\"buttonRef\"\n :tabindex=\"enableTextFilter ? -1 : 0\"\n @keydown.enter=\"enterHandler($event)\"\n @keydown.space=\"spaceHandler($event)\"\n @keydown.esc=\"parentMethods.press($event)\"\n @keydown.up=\"parentMethods.press($event)\"\n @keydown.down=\"parentMethods.press($event)\"\n @focusout=\"parentMethods.unfocus($event)\"\n @click=\"clickHandler()\"\n type=\"button\"\n :class=\"[{ 'click-through': props.enableTextFilter || props.showDropDown }]\"\n class=\"list-button\"\n >\n <slot></slot>\n <span class=\"list-button-icon-div\" :class=\"{ 'bigger-gap': props.showDropDown }\">\n <span\n v-if=\"!customIcon\"\n class=\"list-button-icon\"\n :class=\"[{ 'rotate-180': !props.showDropDown }]\"\n >\n <default-arrow aria-hidden=\"true\" />\n </span>\n <span\n v-if=\"!customIcon\"\n class=\"list-button-icon\"\n :class=\"[{ 'rotate-180': props.showDropDown }]\"\n >\n <default-arrow v-if=\"customIcon == null\" aria-hidden=\"true\" />\n </span>\n <span v-if=\"customIcon\" class=\"list-button-icon custom-icon\">\n <component aria-hidden=\"true\" :is=\"customIcon as object\" />\n </span>\n </span>\n </button>\n</template>\n\n<script setup lang=\"ts\">\nimport { type PropType, ref } from 'vue'\nimport DefaultArrow from './default-arrow.vue'\n\n// prettier-ignore\nconst props = defineProps({ // eslint-disable-line\n parentMethods: {\n type: Object,\n required: true\n },\n showDropDown: {\n type: Boolean,\n required: true\n },\n enableTextFilter: {\n type: Boolean,\n required: true\n },\n customIcon: {\n default: null,\n type: [Object, Function] as PropType<object | Function | null>\n },\n reverseDropDownList: {\n type: Boolean,\n required: true\n }\n})\n\nconst buttonRef = ref(null)\n\nfunction clickHandler() {\n if (props.enableTextFilter) return\n else props.parentMethods.openList()\n}\n\nfunction enterHandler(event: KeyboardEvent) {\n if (props.enableTextFilter) {\n props.parentMethods.focusInput()\n event.stopPropagation()\n event.preventDefault()\n } else {\n props.parentMethods.press(event)\n }\n}\n\nfunction spaceHandler(event: KeyboardEvent) {\n if (!props.enableTextFilter) props.parentMethods.press(event)\n}\n\nfunction blurInput() {\n if (buttonRef?.value) {\n const button: HTMLButtonElement = buttonRef.value\n button.blur()\n }\n}\n\nfunction focusInput() {\n if (buttonRef?.value) (buttonRef.value as HTMLButtonElement).focus()\n}\n\ndefineExpose({ blurInput, focusInput, buttonRef })\n</script>\n\n<style scoped>\n.list-button-icon {\n display: flex;\n transition-timing-function: ease-in-out;\n transition-duration: 200ms;\n transition-property: transform;\n width: 0.6rem;\n transform: rotate(0deg);\n color: var(--superlist-text-colour, rgb(17, 24, 39));\n justify-content: center;\n max-height: 18%;\n}\n\n.list-button-icon.custom-icon {\n max-height: 100%;\n width: 1.25rem;\n}\n\n.list-button-icon.rotate-180 {\n transform: rotate(180deg);\n}\n\n.list-button {\n position: relative;\n padding: 0;\n margin: 0;\n width: 100%;\n max-height: 100%;\n height: 100%;\n background-color: var(--superlist-background-colour, white);\n align-items: center;\n pointer-events: auto;\n cursor: pointer;\n}\n\n.list-button:focus,\n.list-button:focus-visible,\n.list-button:active {\n text-align: left;\n}\n\n.list-button-icon-div {\n pointer-events: none;\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding-right: 0.75rem;\n max-height: 100%;\n height: 100%;\n gap: max(0.15rem, calc(6.25% + 0.075rem));\n transition: gap 200ms;\n}\n\n.list-button-icon-div.bigger-gap {\n gap: calc(40% - 0.25rem);\n}\n\n.click-through {\n pointer-events: none;\n}\n</style>\n","<template>\n <div style=\"position: relative\" :class=\"$attrs.class\">\n <item-list\n ref=\"itemListRef\"\n :show-drop-down=\"showDropDown\"\n :filteredListItems=\"filteredListItems\"\n :mouseHoveringOnList=\"mouseHoveringOnList\"\n :focusedIndex=\"activeFocusedIndex\"\n :selectedIndex=\"selectedIndex\"\n :max-list-height-p-x=\"maxListHeightPX\"\n :list-animation-duration-ms=\"listAnimationDurationMs\"\n :parent-methods=\"parentMethods\"\n v-model:blockListChange=\"blockListUpdates\"\n :total-options-count=\"totalOptionsCount\"\n @reverseDropDownList=\"reverseDropDownList = $event\"\n :enableScrollClose=\"enableScrollClose\"\n >\n <list-button\n ref=\"dropDownButtonInput\"\n :parent-methods=\"parentMethods\"\n :show-drop-down=\"showDropDown\"\n :enable-text-filter=\"enableTextFilter\"\n :custom-icon=\"customIcon\"\n :reverse-drop-down-list=\"reverseDropDownList\"\n >\n <text-input\n ref=\"dropDownTextInput\"\n :enable-text-filter=\"enableTextFilter\"\n :show-drop-down=\"showDropDown\"\n :placeholder=\"placeholder\"\n :enable-button-click=\"enableButtonClick\"\n :parent-methods=\"parentMethods\"\n @update:query=\"query = $event\"\n />\n </list-button>\n </item-list>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, type PropType, ref, watch } from 'vue'\nimport {\n getLabelString,\n AbortablePromise,\n type DataSet,\n type EnumType,\n type ListRequest\n} from './DropDownLibrary'\nimport TextInput from './ListInputComponents/ListTextInput.vue'\nimport ItemList from './ListInputComponents/ItemList.vue'\nimport ListButton from './ListInputComponents/ListButton.vue'\n\nconst emit = defineEmits({ 'update:selected': null })\nconst props = defineProps({\n selected: {\n type: [String, Number, Object, null, undefined] as PropType<\n string | number | object | null | undefined\n >\n },\n options: {\n type: [Function, Array<string | number | object>] as PropType<\n ListRequest | Array<string | number | object>\n >,\n required: true\n },\n maxListOptions: {\n type: Number as PropType<number>,\n default: 50\n },\n maxListHeightPX: {\n type: Number as PropType<number>,\n default: 200\n },\n tooltip: {\n type: String,\n required: false\n },\n objectLabelKeyName: {\n type: String as PropType<string | null>,\n default: ''\n },\n enumKeyToLabelObjectArray: {\n type: Object as PropType<EnumType[]>,\n default: undefined\n },\n listAnimationDurationMs: {\n type: Number as PropType<number>,\n default: 300\n },\n customIcon: {\n default: null,\n type: [Object, Function] as PropType<object | Function | null>\n },\n forceTextFilterVisibilityTo: {\n type: Boolean as PropType<boolean>,\n default: undefined\n },\n customPlaceHolderFunction: {\n type: Function as PropType<Function | null>,\n default: null\n },\n colour: {\n type: String as PropType<string>,\n default: 'black'\n },\n scrollTextInputToTopOnMobile: {\n type: Boolean as PropType<boolean>,\n default: true\n }\n})\n\nconst listOptions = ref([] as Array<string | number | object>)\n\nconst abortablePromise = new AbortablePromise()\n\nconst totalOptionsCount = ref(0)\n\nconst enableTextFilter = computed((): boolean => {\n if (props.forceTextFilterVisibilityTo != undefined) return props.forceTextFilterVisibilityTo\n return totalOptionsCount.value > props.maxListOptions\n})\n\nconst showDropDown = ref<boolean>(false)\n\nconst blockListUpdates = ref<boolean>(false)\n\nconst reverseDropDownList = ref<boolean>(false)\n\nconst enableButtonClick = ref(true)\n\nconst loadingData = ref(false)\nconst errorState = ref(false)\n\nconst itemListRef = ref(ItemList)\nconst dropDownTextInput = ref(TextInput)\nconst dropDownButtonInput = ref(ListButton)\n\nconst query = ref('')\n\nwatch(\n () => query.value,\n (newV, oldV) => {\n if (newV !== oldV && typeof props.options === 'function') loadData(newV)\n }\n)\n\nconst blurInputIfNecessary = () => {\n if (enableTextFilter.value) dropDownTextInput?.value?.blurInput()\n}\n\nconst closeList = () => {\n clearTimeout(blockScrollCloseTimeout)\n blurInputIfNecessary()\n query.value = ''\n showDropDown.value = false\n enableButtonClick.value = true\n}\n\nconst placeholder = computed((): string => {\n if (errorState?.value === true) return 'Error loading data'\n if (loadingData?.value === true) return 'Loading...'\n return getLabel(props.selected)\n})\n\nconst updatedSelected = (newValue: any) => {\n if (newValue) emit('update:selected', newValue)\n closeList()\n}\n\nconst getLabel = (value?: string | number | object | null): string => {\n return getLabelString(\n value,\n props.customPlaceHolderFunction,\n props.objectLabelKeyName,\n props.enumKeyToLabelObjectArray\n )\n}\n\nfunction invalidArgumentError() {\n loadingData.value = true\n errorState.value = true\n throw new Error(`Invalid options argument provided to ListInputComponent`)\n}\n\nfunction invalidResponseError() {\n loadingData.value = true\n errorState.value = true\n throw new Error(`Invalid response provided to ListInputComponent, no total count key found`)\n}\n\nfunction invalidListValueKeyError() {\n loadingData.value = true\n errorState.value = true\n throw new Error('Invalid objectLabelKeyName for provided Dropdown list value.')\n}\n\nonMounted(() => {\n if (typeof props.options !== 'function' && !Array.isArray(props.options)) invalidArgumentError()\n else initializeOptions()\n})\n\nconst mouseHoveringOnList = ref(false)\n\nconst selectedIndex = ref(0)\nconst focusedIndex = ref(0)\nconst activeFocusedIndex = ref(0)\n\nwatch(\n () => focusedIndex.value,\n (newV, oldV) => {\n if (newV != oldV && !blockListUpdates.value) {\n activeFocusedIndex.value = newV\n }\n },\n { immediate: true }\n)\n\nwatch(\n () => blockListUpdates.value,\n (newV) => {\n if (!newV) {\n activeFocusedIndex.value = focusedIndex.value\n }\n },\n { immediate: true }\n)\n\nconst filteredListItems = computed(() => {\n // if is function, return listOptions variable which is set by function\n if (typeof props.options === 'function' && !Array.isArray(props.options)) return listOptions.value\n const qry = query.value\n const lo = listOptions.value\n // else, is array, return filtered array\n return qry === '' ? lo : lo.filter((v) => getLabel(v).toLowerCase().includes(qry.toLowerCase()))\n})\n\nwatch(\n () => filteredListItems.value,\n (newV, oldV) => {\n if (JSON.stringify(newV) !== JSON.stringify(oldV)) focusSelectedOrFirstListItem()\n },\n { immediate: false, deep: true }\n)\n\nconst mouseOverList = () => {\n mouseHoveringOnList.value = true\n}\n\nconst focusSelectedOrFirstListItem = () => {\n const existingIndex = getSelectedValueIndex()\n selectedIndex.value = existingIndex /* may not be in the filtered list, allowed to be -1 */\n focusedIndex.value = existingIndex > -1 ? existingIndex : 0 /* default to first value */\n}\n\nfunction getSelectedValueIndex() {\n if (props.selected == null) return -1\n const labelsArray = listOptions.value.map((v) => getLabel(v))\n const matchingLabelsArray = labelsArray.filter((v) => v === getLabel(props.selected))\n if (matchingLabelsArray.length > 1) {\n const matchingIndexes = matchingLabelsArray.map((v) => labelsArray.indexOf(v))\n for (let i = 0; i < matchingIndexes.length; i++) {\n const currentMatchingOptionString = JSON.stringify(listOptions.value[matchingIndexes[i]])\n const selectedOptionString = JSON.stringify(props.selected)\n if (currentMatchingOptionString === selectedOptionString) return matchingIndexes[i]\n }\n return -1\n }\n return labelsArray.indexOf(getLabel(props.selected))\n}\n\nconst openList = () => {\n if (loadingData.value) return\n if (!showDropDown.value) {\n blockListUpdates.value = false\n focusSelectedOrFirstListItem()\n scrollMobileTextInputToTop()\n showDropDown.value = true\n }\n mouseHoveringOnList.value = false\n enableButtonClick.value = false\n}\n\nconst scrollMobileTextInputToTop = () => {\n const mobileWindow: boolean = window?.innerWidth != null && window.innerWidth < 640\n const mobileScreen: boolean = screen?.width != null && screen.width < 640\n const textInput: HTMLElement | null = dropDownTextInput.value.textInputRef as HTMLElement | null\n if ((mobileWindow || mobileScreen) && enableTextFilter.value) {\n preventScrollClose()\n if (props.scrollTextInputToTopOnMobile)\n textInput?.scrollIntoView({ block: 'start', inline: 'center' })\n }\n}\n\nconst enableScrollClose = ref<boolean>(true)\nlet blockScrollCloseTimeout = setTimeout(() => {}, 0)\n\nfunction preventScrollClose() {\n const textInput: HTMLElement | null = dropDownTextInput.value.textInputRef as HTMLElement | null\n if (!textInput) return\n enableScrollClose.value = false\n let preventingScrollCloseInterval: NodeJS.Timeout | null = null\n\n const clearAll = () => {\n if (preventingScrollCloseInterval) clearInterval(preventingScrollCloseInterval)\n clearTimeout(blockScrollCloseTimeout)\n setTimeout(() => {\n enableScrollClose.value = true\n }, 100)\n }\n\n blockScrollCloseTimeout = setTimeout(clearAll, 5000)\n\n preventingScrollCloseInterval = setInterval(() => {\n if (\n showDropDown.value === false ||\n (textInput?.scrollTop === 0 && document.readyState === 'complete')\n )\n clearAll()\n }, 100)\n}\n\nconst focusInput = () => {\n if (enableTextFilter?.value == true) dropDownTextInput.value.focusInput()\n else if (dropDownButtonInput?.value?.focusInput) dropDownButtonInput?.value?.focusInput()\n}\n\nasync function initializeOptions(): Promise<void> {\n if (typeof props.options === 'function') {\n await loadData(query.value ? query.value : undefined, true)\n } else {\n validateListOptions(props.options as Array<string | number | object>)\n totalOptionsCount.value = listOptions.value.length\n }\n initializeSelected()\n}\n\ndefineExpose({ initializeOptions, getLabel })\n\nfunction initializeSelected() {\n const invalidSelection = getSelectedValueIndex() == -1\n const existingOptionNotSelected = invalidSelection && listOptions.value && !!listOptions.value[0]\n if (existingOptionNotSelected) updatedSelected(listOptions.value[0])\n}\n\nasync function loadData(stringFilter?: string, disableOnLoad: boolean = true) {\n loadingData.value = disableOnLoad\n const func = async () => (props.options as Function)(props.maxListOptions, stringFilter || '')\n const next = (response: DataSet<any>) => {\n if (!response || !('data' in response)) invalidArgumentError()\n validateListOptions(response.data)\n getOptionsCount(response?.data?.length ?? 0).then(() => {\n loadingData.value = false\n })\n }\n await abortablePromise.resetAndExecute(func, next)\n}\n\nasync function getOptionsCount(dataLength: number): Promise<void> {\n const func = async () => (props.options as Function)(1, '')\n const next = (response: DataSet<any>) => {\n if (!response || !('totalNum' in response)) invalidResponseError()\n totalOptionsCount.value = response.totalNum ?? dataLength\n }\n await abortablePromise.resetAndExecute(func, next)\n}\n\nconst getCurrentlyFocusedListItemElement = (): HTMLElement | null => {\n const listInput: HTMLElement | null = dropDownTextInput?.value?.textInputRef as HTMLElement | null\n return listInput?.getElementsByTagName('li')[focusedIndex.value] ?? null\n}\n\nconst press = (event?: any) => {\n if (showDropDown.value == false) {\n openList()\n } else if (event) {\n keypress(event)\n }\n}\n\nconst keypress = (event: any) => {\n const key: string = event.key || event.code\n if (key === 'Tab' || key === 'Escape') closeList()\n if (key === 'ArrowDown') down(event)\n if (key === 'ArrowUp') up(event)\n if (key === 'Enter' || key === ' ') updateSelectedFromTextQuery()\n event.preventDefault()\n event.stopPropagation()\n}\n\nconst updateSelectedFromTextQuery = () => {\n if (filteredListItems.value.length > 0) {\n blockListUpdates.value = true\n updatedSelected(filteredListItems.value[focusedIndex.value])\n } else {\n closeList()\n }\n}\n\nconst down = (event: any) => {\n enableButtonClick.value = true\n if (focusedIndex.value < filteredListItems.value.length - 1) {\n event.preventDefault()\n mouseHoveringOnList.value = false\n focusedIndex.value++\n getCurrentlyFocusedListItemElement()?.focus()\n }\n}\n\nconst up = (event: any) => {\n enableButtonClick.value = true\n if (focusedIndex.value > 0) {\n event.preventDefault()\n mouseHoveringOnList.value = false\n focusedIndex.value--\n getCurrentlyFocusedListItemElement()?.focus()\n }\n}\n\nconst unfocus = (event: any) => {\n if (showDropDown?.value === false) return\n if (query.value.length > 0) blockListUpdates.value = true\n const list: HTMLElement | null = itemListRef?.value?.listContainerRef as HTMLElement | null\n const listInput: HTMLElement | null = dropDownTextInput?.value?.textInputRef as HTMLElement | null\n const isListInput = event?.relatedTarget && listInput?.isEqualNode(event?.relatedTarget)\n const isList = event?.relatedTarget && list && list.contains(event?.relatedTarget)\n const isListItem = event?.relatedTarget && list && list.isEqualNode(event?.relatedTarget)\n if (isList || isListInput) return\n if (isListItem) {\n focusInput()\n return\n }\n closeList()\n}\n\nfunction validateListOptions(optns: Array<string | number | object>) {\n if (!Array.isArray(optns)) invalidArgumentError()\n if (optns.length > 0 && typeof optns[0] === 'object') validateObjectList(optns as Array<object>)\n listOptions.value = optns as Array<string | number | object>\n}\n\nfunction validateObjectList(values: Array<object>) {\n if (!props.objectLabelKeyName || props.objectLabelKeyName.length === 0) invalidListValueKeyError()\n const key: string = props.objectLabelKeyName as string\n for (let i = 0; i < values.length; i++) {\n if (typeof values[i] !== 'object' || !(key in values[i])) invalidListValueKeyError()\n }\n}\n\nconst parentMethods = {\n openList: openList,\n unfocus: unfocus,\n press: press,\n mouseOverList: mouseOverList,\n getLabel: getLabel,\n updatedSelected: updatedSelected,\n focusInput: focusInput,\n closeList: closeList\n}\n</script>\n\n<style scoped>\n* {\n box-sizing: border-box;\n}\n</style>\n"],"names":["DocumentViewChangeListener","targetFunction","targetNode","event","eventType","getLabelString","value","customLabelGetFunction","objectLabelKeyName","enumKeyToLabelObjectArray","getEnumLabel","enumKeyArray","eT","AbortablePromise","signal","asyncFunc","then","response","func","reason","emit","__emit","props","__props","textInputRef","ref","focusInHandler","e","focusOutHandler","updateQuery","textInputSize","computed","refLength","placeHolderLength","pointerEventsClass","textInputColourClass","blurInput","input","focusInput","__expose","_createElementBlock","$event","_cache","_withKeys","_normalizeClass","_openBlock","_hoisted_1","_createElementVNode","iRefs","useTemplateRef","focusedLi","focused","watch","scrollHighlightedListItemToTop","scrollHighlightedListItemIntoView","li","liParent","aboveTop","belowBottom","_Fragment","_renderList","listItem","index","_withModifiers","_hoisted_2","_toDisplayString","_createBlock","DefaultTick","_hoisted_3","dropDownButtonContainer","dropDownListUL","listContainerRef","offsetLeft","offsetTop","offsetBottom","listOffset","parentWidthPx","listElementOpenAndVisible","listItemsToDisplay","listHeightPx","reverseList","sufficientRoomAbove","insufficientRoomBelow","noScroll","reverse","parentXPx","parentYPx","preventSpaceScrollingList","refocusTextInput","list","target","getListULHeight","displayableListHeight","ulHt","maxListHeightPx","animationDuration","updatedListItemsToDisplay","newVal","unobserveTimeout","changeListener","openAndObserveChangeListener","buttonRePositionCallback","closeAndUnobserveChangeListener","newV","oldV","setOffsets","nextTick","closeListOnScrollIfNecessary","insideListOrOtherList","isScrollEvent","insideButton","insideList","otherList","setButtonOffset","setListOffset","brc","getButtonContainerElement","slrc","currentListOffset","currentOffsetLeft","getButtonElement","onMounted","onUnmounted","_renderSlot","_ctx","_createVNode","ListItem","buttonRef","clickHandler","enterHandler","spaceHandler","DefaultArrow","_resolveDynamicComponent","listOptions","abortablePromise","totalOptionsCount","enableTextFilter","showDropDown","blockListUpdates","reverseDropDownList","enableButtonClick","loadingData","errorState","itemListRef","ItemList","dropDownTextInput","TextInput","dropDownButtonInput","ListButton","query","blurInputIfNecessary","closeList","blockScrollCloseTimeout","placeholder","getLabel","updatedSelected","newValue","invalidArgumentError","invalidResponseError","invalidListValueKeyError","initializeOptions","mouseHoveringOnList","selectedIndex","focusedIndex","activeFocusedIndex","filteredListItems","qry","lo","v","focusSelectedOrFirstListItem","mouseOverList","existingIndex","getSelectedValueIndex","labelsArray","matchingLabelsArray","matchingIndexes","i","currentMatchingOptionString","selectedOptionString","openList","scrollMobileTextInputToTop","mobileWindow","mobileScreen","textInput","preventScrollClose","enableScrollClose","preventingScrollCloseInterval","clearAll","loadData","validateListOptions","initializeSelected","stringFilter","disableOnLoad","next","getOptionsCount","dataLength","getCurrentlyFocusedListItemElement","press","keypress","key","down","up","updateSelectedFromTextQuery","unfocus","listInput","isListInput","isList","isListItem","optns","validateObjectList","values","parentMethods","$attrs"],"mappings":";2CAQO,MAAMA,EAAiE,CAC3D,YAAwB,CAAC,SAAU,OAAQ,SAAU,QAAS,WAAW,EACzE,OAA+B,CAC9C,WAAY,GACZ,UAAW,GACX,QAAS,EACX,EACQ,iBACA,iBAER,YAAYC,EAA0BC,EAAkB,SAAS,KAAM,CACrE,KAAK,WAAaA,EAClB,KAAK,iBAAqBC,GACxBF,EAAeE,CAAK,EACtB,KAAK,iBAAmB,IAAI,iBAAkB,IAAMF,GAAqC,CAAA,CAGpF,SAAgB,CACrB,KAAK,iBAAiB,QAAQ,KAAK,WAAY,KAAK,MAAM,EAC1D,UAAWG,KAAa,KAAK,YAAa,KAAK,YAAYA,CAAS,EACpE,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,CAAA,CAGhC,uBAA8B,CAC5B,KAAK,iBAAiB,WAAW,CAAA,CAGnC,yBAAgC,CAC9B,KAAK,iBAAiB,QAAQ,KAAK,WAAY,KAAK,MAAM,CAAA,CAGrD,WAAkB,CACvB,KAAK,iBAAiB,WAAW,EACjC,UAAWA,KAAa,KAAK,YAAa,KAAK,eAAeA,CAAS,EACvE,KAAK,qBAAqB,EAC1B,KAAK,4BAA4B,CAAA,CAG3B,YAAYA,EAAyB,CAC3C,SAAS,iBAAiBA,EAAW,KAAK,iBAAkB,EAAI,CAAA,CAG1D,eAAeA,EAAyB,CAC9C,SAAS,oBAAoBA,EAAW,KAAK,iBAAkB,EAAI,CAAA,CAG7D,0BAAiC,CACvC,KAAK,WAAW,iBAAiB,gBAAiB,KAAK,gBAAgB,CAAA,CAGjE,6BAAoC,CAC1C,KAAK,WAAW,oBAAoB,gBAAiB,KAAK,gBAAgB,CAAA,CAGpE,mBAA0B,CACzB,OAAA,iBAAiB,SAAU,KAAK,gBAAgB,CAAA,CAGjD,sBAA6B,CAC5B,OAAA,oBAAoB,SAAU,KAAK,gBAAgB,CAAA,CAE9D,CAEO,SAASC,GACdC,EACAC,EACAC,EACAC,EACQ,CACR,OAAIF,GAA0B,KAAaA,EAAuBD,CAAK,EACnEA,GAAS,KAAa,GACtB,OAAOA,GAAU,SAAiBA,EAAME,CAAwC,EAChFC,EAAkCC,GAAaJ,EAAOG,CAAyB,EAC5E,GAAKH,CACd,CAEA,SAASI,GAAaJ,EAAwBK,EAAkC,CACtE,OAAAA,EAAa,KAAMC,GAA0BA,EAAG,OAASN,CAAK,GAAG,OAAS,EACpF,CAcO,MAAMO,EAA6C,CACxD,aAAc,CACP,KAAA,gBAAkB,IAAI,gBAC3B,KAAK,KAAO,IAAY,CAAC,EACzB,KAAK,KAAO,IAAY,CAAC,CAAA,CAG3B,MAAM,iBAAiBC,EAAqBC,EAAqBC,EAA8B,CACvF,MAAAC,EAAW,MAAMF,EAAU,EACjC,GAAI,CAAAD,EAAO,QACX,OAAOE,EAAKC,CAAQ,CAAA,CAGtB,QAAQC,EAAsB,CAC5B,KAAK,KAAOA,CAAA,CAGd,QAAQF,EAAsB,CAC5B,KAAK,KAAOA,CAAA,CAGd,SAAwB,CACf,OAAA,KAAK,iBAAiB,KAAK,gBAAgB,OAAQ,KAAK,KAAM,KAAK,IAAI,CAAA,CAGhF,MAAMG,EAAuB,CACtB,KAAA,gBAAgB,MAAMA,GAAU,wBAAwB,EACxD,KAAA,gBAAkB,IAAI,eAAgB,CAG7C,gBAAgBD,EAAgBF,EAA8B,CAC5D,YAAK,MAAM,8BAA8B,EACzC,KAAK,QAAQE,CAAI,EACjB,KAAK,QAAQF,CAAI,EACV,KAAK,QAAQ,CAAA,CAExB,oZC5GA,MAAMI,EAAOC,EAMPC,EAAQC,EAsBRC,EAAeC,MAAI,IAAI,EAE7B,SAASC,EAAeC,EAAe,CACjC,uBAAwBA,GAAKA,EAAE,oBAAsB,KAAML,EAAM,cAAc,UAAU,EACxFA,EAAM,cAAc,SAAS,CAAA,CAGpC,SAASM,EAAgBzB,EAAmB,CACpCmB,EAAA,cAAc,QAAQnB,CAAK,CAAA,CAGnC,SAAS0B,EAAY1B,EAAY,CAC3BA,GAAO,QAAQ,OAAS,QAAgB,eAAgBA,EAAM,OAAO,KAAK,CAAA,CAG1E,MAAA2B,EAAgBC,EAAAA,SAAS,IAAM,CACnC,MAAMC,EAAoBR,GAAc,MAASA,EAAa,MAAiB,OAAS,EAClFS,EAA4BX,EAAM,aAAa,QAAU,EAC/D,OAAOU,EAAY,EAAIA,EAAYC,EAAoB,EAAIA,EAAoB,CAAA,CAChF,EAEKC,EAAqBH,EAAAA,SAAS,IACVT,EAAM,oBAAsB,IAAQA,EAAM,mBAAqB,GACvE,GAAK,eACtB,EAEKa,EAAuBJ,EAAAA,SAAS,IACbT,EAAM,cAAgB,CAACA,EAAM,kBAAqB,CAACA,EAAM,aAClE,wBAA0B,wBACzC,EAED,SAASc,GAAY,CACnB,GAAIZ,GAAc,MAAO,CACvB,MAAMa,EAA0Bb,EAAa,MAC7Ca,EAAM,KAAK,EACXA,EAAM,MAAQ,EAAA,CAChB,CAGF,SAASC,GAAa,CAChBd,GAAc,OAAQA,EAAa,MAA2B,MAAM,CAAA,CAG1E,OAAAe,EAAa,CAAE,UAAAH,EAAW,WAAAE,EAAY,aAAAd,CAAA,CAAc,wBAnGlDgB,EAAA,mBAsBE,QAAA,SArBI,eAAJ,IAAIhB,EACH,SAAUD,EAAgB,iBAAA,EAAA,GAC1B,UAAO,2BAAQA,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,OAAA,CAAA,GAC1BC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,EAAAA,SAAAF,GAAAlB,EAAA,cAAc,MAAK,EAAA,CAAA,OAAA,CAAA,6BACrBA,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,KAAA,CAAA,6BAC3BlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,IAAA,CAAA,6BACxBlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,MAAA,CAAA,IACxC,UAAOC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAD,GAAEf,EAAee,CAAM,GAC9B,WAAQC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAD,GAAEb,EAAgBa,CAAM,GAChC,QAAKC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAD,GAAEZ,EAAYY,CAAM,GAC1B,KAAK,OACL,oBAAkB,OAClB,aAAa,MACZ,YAAalB,EAAW,YACxB,KAAMO,EAAa,MACnB,MAAKc,iBAAA,CAAA,CAAUV,EAAkB,MAAQC,EAAoB,+BAAmCZ,EAAgB,gBAAA,GAK3G,wBAAwB,CAAA,CAAA,4ICpB9B,MAAM,6BACN,KAAK,eACL,cAAY,OACZ,YAAU,OACV,QAAQ,gCALV,OAAAsB,EAAA,UAAA,EAAAL,EAAA,mBAWM,MAXNM,GAWMJ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAJJK,EAAAA,mBAGE,OAAA,CAFA,kBAAgB,qBAChB,EAAE,+nBCkDR,MAAMzB,EAAQC,EAmCRyB,EAAoDC,iBAAe,OAAO,EAE1EC,EAAYnB,EAAAA,SAAS,IAA0B,CAC/C,GAAA,CAACiB,GAAO,MAAc,OAAA,KAEpB,MAAAG,GADoC,MAAM,QAAQH,EAAM,KAAK,EAAIA,EAAM,MAAQ,CAACA,EAAM,KAAK,GAC5E1B,EAAM,YAAY,EACnC,OAAC6B,GACqB,OAAOA,GAAW,UACG,mBAAoBA,GACf,OAAOA,EAAQ,gBAAqB,WACjEA,EAJF,IAIY,CAClC,EAEDC,EAAA,MACE,IAAM9B,EAAM,aACZ,IAAM+B,EAA+B,CACvC,EACAD,EAAA,MACE,IAAM9B,EAAM,0BACZ,IAAMgC,EAAkC,CAC1C,EACAF,EAAA,MACE,IAAMF,EAAU,MAChB,IAAMI,EAAkC,CAC1C,EAEA,SAASD,GAAuC,CAC1C,CAAC/B,EAAM,cAAgB,CAAC4B,GAAW,OAAO,eAAe,gBAC7DA,EAAU,MAAM,cAAc,cAAc,UAAYA,EAAU,MAAM,UAAA,CAG1E,SAASI,GAA0C,CACjD,MAAMC,EAAKL,EAAU,MACfM,EAAWD,GAAI,eAAe,cACpC,GAAI,CAACjC,EAAM,cAAgB,CAACiC,GAAM,CAACC,EAAU,OAC7C,MAAMC,EAAWF,EAAG,UAAYC,EAAS,UAAY,EAC/CE,EAAcH,EAAG,UAAYA,EAAG,aAAeC,EAAS,UAAYA,EAAS,aAC/EC,IAAmBD,EAAA,UAAYD,EAAG,WAClCG,IAAsBF,EAAA,UAAYD,EAAG,UAAYA,EAAG,aAAeC,EAAS,aAAA,oEApIhFX,EAAAA,UAAA,EAAA,EAAAL,EAuBK,mBAAAmB,WAtByB,KAAAC,EAAA,WAAArC,EAAA,kBAApB,CAAAsC,EAAUC,mBADpBtB,EAAA,mBAuBK,KAAA,CArBF,IAAKsB,aACN,IAAI,QACH,QAAK,2BAAQvC,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,OAAA,CAAA,6BAC1BlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,OAAA,CAAA,6BAC5BlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,KAAA,CAAA,IACrC,UAAO,2BAAKlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,IAAA,CAAA,6BACxBlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,MAAA,CAAA,IACxC,WAAUC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAD,GAAAlB,EAAA,cAAc,QAAQkB,CAAM,GACvC,SAAS,KACR,YAAgBsB,EAAAA,cAAAtB,GAAAlB,EAAA,cAAc,gBAAgBsC,CAAQ,EAAA,CAAA,MAAA,CAAA,EACtD,MAAKjB,EAAAA,eAAA,CAAoC,CAAA,uBAAArB,EAAA,gBAAkBuC,CAAK,wBAAoDvC,EAAA,kBAAkB,SAAM,GAAWA,iBAAiBuC,IAAUvC,EAAmB,uCAStMwB,qBAA0E,OAA1EiB,GAA0EC,kBAA1C1C,gBAAc,SAASsC,CAAQ,CAAA,EAAA,CAAA,EAC3CtC,EAAA,gBAAkBuC,iBAAtCI,EAAAA,YAAyFC,GAAA,OAA5C,MAAM,iBAAiB,cAAY,MAAA,gDAG1E5C,EAAA,kBAAkB,SAAM,iBADhCiB,qBAaK,KAAA,OAXF,QAAK,2BAAQjB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,OAAA,CAAA,6BAC1BlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,OAAA,CAAA,6BAC5BlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,KAAA,CAAA,IACrC,UAAO,2BAAKlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,IAAA,CAAA,+BACxBlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,MAAA,CAAA,IACxC,WAAUC,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAD,GAAAlB,EAAA,cAAc,QAAQkB,CAAM,GACtC,YAAgBC,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAqB,gBAAAtB,GAAAlB,EAAA,cAAc,UAAUkB,CAAM,EAAA,CAAA,MAAA,CAAA,GAC/C,SAAS,KACT,MAAM,sCAENM,qBAAwD,OAAlD,CAAA,MAAM,kBAAiB,uBAAoB,EAAA,qCAG3CxB,EAAA,mBAAqBA,EAAA,mBAAqBA,EAAA,mBAAmB,QAAM,kBAD3EiB,EAAAA,mBAeK,KAAA,OAbF,QAAK,6BAAQjB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,OAAA,CAAA,+BAC1BlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,OAAA,CAAA,+BAC5BlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,KAAA,CAAA,IACrC,UAAO,6BAAKlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,IAAA,CAAA,+BACxBlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,MAAA,CAAA,IACxC,WAAUC,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAD,GAAAlB,EAAA,cAAc,QAAQkB,CAAM,GACtC,YAAgBC,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAqB,gBAAAtB,GAAAlB,EAAA,cAAc,UAAUkB,CAAM,EAAA,CAAA,MAAA,CAAA,GAC/C,SAAS,KACT,MAAM,qBAAA,GAENM,EAAAA,mBAEC,OAFDqB,GAA6B,KAC1BH,EAAG,gBAAA1C,EAAiB,kBAAGA,EAAiB,mBAAE,QAAM,CAAA,EAAQ,iBAAc,CAAA,uwBCH7E,MAAMH,EAAOC,EAEPC,EAAQC,EA+CR8C,EAA0B5C,MAAwB,IAAI,EACtD6C,EAAiB7C,MAAwB,IAAI,EAC7C8C,EAAmB9C,MAAwB,IAAI,EAC/C+C,EAAa/C,MAAY,CAAC,EAC1BgD,EAAYhD,MAAY,CAAC,EACzBiD,EAAejD,MAAY,CAAC,EAC5BkD,EAAalD,MAAY,CAAC,EAC1BmD,EAAgBnD,MAAY,KAAK,EACjCoD,EAA4BpD,MAAa,EAAK,EAC9CqD,EAAqBrD,EAAW,IAAA,EAAE,EAClCsD,EAAetD,MAAY,CAAC,EAE5BuD,EAAcjD,EAAAA,SAAS,IACvB,CAAC8C,EAA0B,OAAS,QAAQ,aAAe,KAAa,GACrEI,KAAyBC,EAAsB,CACvD,EAEKC,EAAWpD,EAAAA,SAAS,IACjBT,EAAM,iBAAmByD,EAAa,KAC9C,EAED3B,EAAA,MACE,IAAM4B,EAAY,MACjBI,GAAqBhE,EAAK,sBAAuBgE,CAAO,EACzD,CAAE,UAAW,EAAK,CACpB,EAEA,MAAMC,EAAYtD,EAAA,SAAS,IAAcyC,EAAW,MAAQ,IAAI,EAC1Dc,EAAYvD,EAAA,SAAS,IAAc4C,EAAW,MAAQ,IAAI,EAEnDpC,EAAA,CAAE,iBAAAgC,EAAkB,EAE3B,MAAAgB,EAA6BpF,GAAe,CAC5CA,GAAO,KAAOA,EAAM,MAAQ,OAAW,eAAe,CAC5D,EAEMqF,EAAoBrF,GAAsB,CAC9C,MAAMsF,EAAOlB,GAAkB,MACzBmB,EAASvF,EAAM,QACjB,EAAEsF,GAAQC,GAAUD,EAAK,SAASC,CAAM,IAAMD,EAAK,YAAYC,CAAM,IACvEpE,EAAM,cAAc,WAAW,CACnC,EAEA,SAASqE,GAA0B,CACjC,OAAOrB,GAAgB,OAASA,GAAgB,OAAsB,aAAe,CAAA,CAGvF,SAASsB,GAAgC,CACvC,GAAI,CAACf,EAA0B,OAASc,EAAsB,IAAA,SAAUrE,EAAM,gBAC9E,MAAMuE,EAAeF,MAAsB,EAAIrE,EAAM,gBAAkB,CAACqE,EAAgB,EACxF,OAAOrE,EAAM,iBAAmBA,EAAM,gBAAkBuE,EAAOA,EAAOvE,EAAM,eAAA,CAG9E,SAAS2D,GAA+B,CAC/B,OAAAR,EAAU,MAAQmB,EAAsB,CAAA,CAGjD,SAASV,GAAiC,CACjC,OAAAR,EAAa,MAAQkB,EAAsB,CAAA,CAGpD,MAAME,EAAkB/D,EAAAA,SAAS,KAAeT,EAAM,iBAAmB,GAAK,IAAI,EAE5EyE,EAAoBhE,EAAAA,SAAS,KAAeT,EAAM,yBAA2B,GAAK,IAAI,EAEtF0E,EAA4BjE,EAAAA,SAAS,IACjCT,EAAM,gBAA4CwD,EAAmB,MAA7CxD,EAAM,iBACvC,EAED8B,EAAA,MACE,IAAM4C,EACLC,GAA+B,CAC1BA,IAA2BnB,EAAA,MAAQmB,EAAO,MAChD,EACA,CAAE,UAAW,GAAO,KAAM,EAAK,CACjC,EAEI,IAAAC,EAAmB,WAAW,IAAM,GAAI,CAAC,EAEzCC,EAAoD,KAExD,SAASC,GAA+B,CACtCrB,EAAa,MAAQY,EAAgB,EACrC,aAAaO,CAAgB,EACzBC,KAA+B,QAAQ,EAC3CtB,EAA0B,MAAQ,GAClCwB,EAAyB,MAAS,CAAA,CAGpC,SAASC,GAAkC,CACzC,aAAaJ,CAAgB,EAC7BA,EAAmB,WAAW,IAAM,CAC7B5E,EAAM,eACTuD,EAA0B,MAAQ,GAC9BsB,KAA+B,UAAU,EAC/C,EACC7E,EAAM,wBAA0B,EAAE,CAAA,CAGvC8B,EAAA,MACE,IAAM9B,EAAM,aACZ,CAACiF,EAAMC,IAAS,CACVD,IAASC,IACAC,EAAA,EACPF,EAAmCH,EAAA,EACFE,EAAA,EAEzC,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,SAASD,EAAyB1E,EAAc,CACnC8E,EAAA,EACFC,EAAA,SAAA,IAAMD,GAAY,EAC3BE,EAA6BhF,CAAC,CAAA,CAGhC,SAASgF,EAA6BhF,EAAQ,CAG5C,GAFI,CAACL,EAAM,mBAAqB,CAACA,EAAM,cACP,OAAOiD,GAAkB,OAAO,UAAa,YACvD5C,GAAG,QAAQ,UAAY,MAAQiF,EAAsBjF,CAAC,EAAG,OACzE,MAAAkF,EAAyB,CAAC,SAAU,QAAS,WAAW,EAAE,SAASlF,GAAG,IAAI,EAC5EL,EAAM,cAAgBuF,GAAevF,EAAM,cAAc,UAAU,CAAA,CAGzE,SAASsF,EAAsBjF,EAAiB,CAC9C,MAAMmF,EAAwB,CAAC,CAACzC,EAAwB,OAAO,SAAS1C,GAAG,MAAc,EACnFoF,EAAsB,CAAC,CAACxC,EAAiB,OAAO,SAAS5C,EAAE,MAAc,EACzEqF,EAAqB,CAACrF,GAAG,YAAY,GAAIA,GAAG,QAAQ,EAAE,EAAE,SAAS,wBAAwB,EAC/F,OAAOmF,GAAgBC,GAAcC,CAAA,CAGvC,SAASP,GAAmB,CACVQ,EAAA,EACFC,EAAA,CAAA,CAGhB,SAASD,GAAwB,CAC3B,GAAA5C,GAAyB,OAAS,KAAM,OACtC,MAAA8C,EAAgB9C,EAAwB,MAAsB,sBAAsB,EAC1FI,EAAU,MAAQ0C,EAAI,IACTzC,EAAA,MAAQ,OAAO,YAAcyC,EAAI,OAChCvC,EAAA,MAAQuC,EAAI,MAAQ,IAAA,CAGpC,SAASD,GAAsB,CAK7B,GAAI7C,GAAyB,OAAS,MAAQE,GAAkB,OAAS,KAAM,OACzE,MAAA4C,EAAeC,EAA0B,EAAE,sBAAsB,EACjEC,EAAiB9C,EAAiB,MAAsB,sBAAsB,EAC9E+C,EAA4B3C,EAAW,MACvC4C,EAA4B/C,EAAW,MACzCQ,EAAY,MAAOL,EAAW,MAAQ2C,GAAqBH,EAAI,IAAME,EAAK,QAC9D1C,EAAA,MAAQ2C,GAAqBD,EAAK,IAAMF,EAAI,QAC5D3C,EAAW,MAAQ+C,GAAqBF,EAAK,KAAOF,EAAI,KAAA,CAG1D,SAASK,GAAsC,CAC7C,OAAQnD,GAAyB,OAAsB,qBAAqB,QAAQ,EAAE,CAAC,CAAA,CAGzF,SAAS+C,GAA4C,CACnD,OAAO/C,GAAyB,KAAA,CAGlCoD,OAAAA,EAAAA,UAAU,IAAM,CACdtB,EAAiB,IAAInG,GAA2BqG,EAA0BmB,EAAA,CAAkB,EAC5F,WAAW,IAAMnB,EAAyB,MAAS,EAAG,GAAG,CAAA,CAC1D,EAEDqB,EAAAA,YAAY,IAAM,CAChBvB,GAAgB,UAAU,CAAA,CAC3B,8DAhRCpD,EAAAA,mBAEM,MAAA,SAFG,0BAAJ,IAAIsB,EAA0B,MAAM,6BAAA,GACvCsD,aAAaC,EAAA,OAAA,UAAA,CAAA,EAAA,OAAA,EAAA,QAEf7E,EAAAA,mBA4BM,MAAA,CA3BJ,GAAG,iCACC,mBAAJ,IAAIwB,EACH,aAAU7B,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAD,GAAElB,EAAa,cAAC,cAAa,GACxC,SAAS,KACR,MAAKqB,EAAAA,eAAA,eAA+BoC,EAAW,MAAA,eAAA,kCAA+DzD,EAAY,YAAA,EAAyB,CAAA,YAAA4D,EAAA,OAAYN,EAAyB,KAAA,uBAAiCA,EAAyB,KAAA,6BAAuCM,EAAQ,KAAA,CAAA,GAQjS,UAAOzC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,EAAAA,SAAAF,GAAQ8C,EAA0B9C,CAAM,EAAA,CAAA,OAAA,CAAA,GAC/C,UAAOC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAqB,gBAAAtB,GAAO+C,EAAiB/C,CAAM,EAAA,CAAA,MAAA,CAAA,EAAA,GAEtCM,EAAAA,mBAWK,KAAA,CAXD,SAAS,aAAS,iBAAJ,IAAIuB,EAAiB,MAAM,cAAA,GAC3CuD,EAAAA,YASEC,GAAA,CARC,kBAAmBhD,EAAkB,MACrC,oBAAqBvD,EAAmB,oBACxC,aAAcA,EAAY,aAC1B,cAAeA,EAAa,cAC5B,0BAA2BsD,EAAyB,MACpD,iBAAgBtD,EAAa,cAC7B,iBAAgBA,EAAY,aAC5B,sBAAqBA,EAAiB,2PC3B3C,MAAM,6BACN,KAAK,eACL,cAAY,OACZ,YAAU,OACV,QAAQ,6BALV,OAAAsB,EAAA,UAAA,EAAAL,EAAA,mBAWM,MAXNM,GAWMJ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAJJK,EAAAA,mBAGE,OAAA,CAFA,kBAAgB,qBAChB,EAAE,ggBCiCR,MAAMzB,EAAQC,EAuBRwG,EAAYtG,MAAI,IAAI,EAE1B,SAASuG,GAAe,CAClB1G,EAAM,kBACLA,EAAM,cAAc,SAAS,CAAA,CAGpC,SAAS2G,EAAa9H,EAAsB,CACtCmB,EAAM,kBACRA,EAAM,cAAc,WAAW,EAC/BnB,EAAM,gBAAgB,EACtBA,EAAM,eAAe,GAEfmB,EAAA,cAAc,MAAMnB,CAAK,CACjC,CAGF,SAAS+H,EAAa/H,EAAsB,CACrCmB,EAAM,kBAAwBA,EAAA,cAAc,MAAMnB,CAAK,CAAA,CAG9D,SAASiC,GAAY,CACf2F,GAAW,OACqBA,EAAU,MACrC,KAAK,CACd,CAGF,SAASzF,GAAa,CAChByF,GAAW,OAAQA,EAAU,MAA4B,MAAM,CAAA,CAGrE,OAAAxF,EAAa,CAAE,UAAAH,EAAW,WAAAE,EAAY,UAAAyF,CAAA,CAAW,wBAjG/CvF,EAAA,mBAkCS,SAAA,SAjCH,YAAJ,IAAIuF,EACH,SAAUxG,EAAgB,iBAAA,GAAA,EAC1B,UAAO,CAAQmB,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,EAAA,SAAAF,GAAAwF,EAAaxF,CAAM,EAAA,CAAA,OAAA,CAAA,GACnBC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,EAAA,SAAAF,GAAAyF,EAAazF,CAAM,EAAA,CAAA,OAAA,CAAA,6BACrBlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,KAAA,CAAA,6BAC3BlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,IAAA,CAAA,6BACxBlB,EAAa,cAAC,MAAMkB,CAAM,EAAA,CAAA,MAAA,CAAA,IACxC,WAAUC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAD,GAAAlB,EAAA,cAAc,QAAQkB,CAAM,GACtC,uBAAOuF,KACR,KAAK,SACJ,MAAKpF,EAAA,eAAA,CAAA,CAAA,CAAA,gBAAsBtB,EAAM,kBAAoBA,EAAM,aAAY,EAClE,aAAa,CAAA,CAAA,GAEnBqG,aAAaC,EAAA,OAAA,UAAA,CAAA,EAAA,OAAA,EAAA,EACb7E,EAAAA,mBAkBO,OAAA,CAlBD,MAAMH,iBAAA,CAAA,uBAA+C,CAAA,aAAAtB,EAAM,aAAY,CAAA,CAAA,GAElEC,EAAU,sDADnBiB,EAAAA,mBAMO,OAAA,OAJL,MAAMI,EAAAA,eAAA,CAAA,mBACoB,CAAA,CAAA,aAAA,CAAAtB,EAAM,YAAA,CAAY,CAAA,CAAA,CAAA,GAE5CuG,EAAAA,YAAoCM,GAAA,CAArB,cAAY,MAAM,CAAA,OAG1B5G,EAAU,sDADnBiB,EAAAA,mBAMO,OAAA,OAJL,MAAMI,EAAAA,eAAA,CAAA,mBACmB,CAAA,CAAA,aAAAtB,EAAM,YAAA,CAAY,CAAA,CAAA,CAAA,GAEtBC,EAAU,YAAA,oBAA/B2C,EAAAA,YAA8DiE,GAAA,OAArB,cAAY,MAAA,qCAE3C5G,EAAU,YAAtBsB,EAAA,UAAA,EAAAL,EAAAA,mBAEO,OAFPwB,GAEO,EADLnB,YAAA,EAAAqB,EAAA,YAA2DkE,0BAAxB7G,EAAA,UAAxB,EAAA,CAAA,cAAY,OAAM,EAAA,2yBCoBrC,MAAMH,EAAOC,EACPC,EAAQC,EA0DR8G,EAAc5G,EAAI,IAAA,EAAqC,EAEvD6G,EAAmB,IAAIzH,GAEvB0H,EAAoB9G,MAAI,CAAC,EAEzB+G,EAAmBzG,EAAAA,SAAS,IAC5BT,EAAM,6BAA+B,KAAkBA,EAAM,4BAC1DiH,EAAkB,MAAQjH,EAAM,cACxC,EAEKmH,EAAehH,MAAa,EAAK,EAEjCiH,EAAmBjH,MAAa,EAAK,EAErCkH,EAAsBlH,MAAa,EAAK,EAExCmH,EAAoBnH,MAAI,EAAI,EAE5BoH,EAAcpH,MAAI,EAAK,EACvBqH,EAAarH,MAAI,EAAK,EAEtBsH,EAActH,MAAIuH,EAAQ,EAC1BC,EAAoBxH,MAAIyH,EAAS,EACjCC,EAAsB1H,MAAI2H,EAAU,EAEpCC,EAAQ5H,MAAI,EAAE,EAEpB2B,EAAA,MACE,IAAMiG,EAAM,MACZ,CAAC9C,EAAMC,IAAS,CACVD,IAASC,GAAQ,OAAOlF,EAAM,SAAY,cAAqBiF,CAAI,CAAA,CAE3E,EAEA,MAAM+C,EAAuB,IAAM,CAC7Bd,EAAiB,OAA0BS,GAAA,OAAO,UAAU,CAClE,EAEMM,EAAY,IAAM,CACtB,aAAaC,CAAuB,EACfF,EAAA,EACrBD,EAAM,MAAQ,GACdZ,EAAa,MAAQ,GACrBG,EAAkB,MAAQ,EAC5B,EAEMa,EAAc1H,EAAAA,SAAS,IACvB+G,GAAY,QAAU,GAAa,qBACnCD,GAAa,QAAU,GAAa,aACjCa,EAASpI,EAAM,QAAQ,CAC/B,EAEKqI,EAAmBC,GAAkB,CACrCA,GAAexI,EAAA,kBAAmBwI,CAAQ,EACpCL,EAAA,CACZ,EAEMG,EAAYpJ,GACTD,GACLC,EACAgB,EAAM,0BACNA,EAAM,mBACNA,EAAM,yBACR,EAGF,SAASuI,GAAuB,CAC9B,MAAAhB,EAAY,MAAQ,GACpBC,EAAW,MAAQ,GACb,IAAI,MAAM,yDAAyD,CAAA,CAG3E,SAASgB,GAAuB,CAC9B,MAAAjB,EAAY,MAAQ,GACpBC,EAAW,MAAQ,GACb,IAAI,MAAM,2EAA2E,CAAA,CAG7F,SAASiB,GAA2B,CAClC,MAAAlB,EAAY,MAAQ,GACpBC,EAAW,MAAQ,GACb,IAAI,MAAM,8DAA8D,CAAA,CAGhFrB,EAAAA,UAAU,IAAM,CACV,OAAOnG,EAAM,SAAY,YAAc,CAAC,MAAM,QAAQA,EAAM,OAAO,EAAwBuI,EAAA,EACxEG,EAAA,CAAA,CACxB,EAEK,MAAAC,EAAsBxI,MAAI,EAAK,EAE/ByI,EAAgBzI,MAAI,CAAC,EACrB0I,EAAe1I,MAAI,CAAC,EACpB2I,EAAqB3I,MAAI,CAAC,EAEhC2B,EAAA,MACE,IAAM+G,EAAa,MACnB,CAAC5D,EAAMC,IAAS,CACVD,GAAQC,GAAQ,CAACkC,EAAiB,QACpC0B,EAAmB,MAAQ7D,EAE/B,EACA,CAAE,UAAW,EAAK,CACpB,EAEAnD,EAAA,MACE,IAAMsF,EAAiB,MACtBnC,GAAS,CACHA,IACH6D,EAAmB,MAAQD,EAAa,MAE5C,EACA,CAAE,UAAW,EAAK,CACpB,EAEM,MAAAE,EAAoBtI,EAAAA,SAAS,IAAM,CAEnC,GAAA,OAAOT,EAAM,SAAY,YAAc,CAAC,MAAM,QAAQA,EAAM,OAAO,EAAG,OAAO+G,EAAY,MAC7F,MAAMiC,EAAMjB,EAAM,MACZkB,EAAKlC,EAAY,MAEvB,OAAOiC,IAAQ,GAAKC,EAAKA,EAAG,OAAQC,GAAMd,EAASc,CAAC,EAAE,YAAc,EAAA,SAASF,EAAI,YAAA,CAAa,CAAC,CAAA,CAChG,EAEDlH,EAAA,MACE,IAAMiH,EAAkB,MACxB,CAAC9D,EAAMC,IAAS,CACV,KAAK,UAAUD,CAAI,IAAM,KAAK,UAAUC,CAAI,GAAgCiE,EAAA,CAClF,EACA,CAAE,UAAW,GAAO,KAAM,EAAK,CACjC,EAEA,MAAMC,EAAgB,IAAM,CAC1BT,EAAoB,MAAQ,EAC9B,EAEMQ,EAA+B,IAAM,CACzC,MAAME,EAAgBC,EAAsB,EAC5CV,EAAc,MAAQS,EACTR,EAAA,MAAQQ,EAAgB,GAAKA,EAAgB,CAC5D,EAEA,SAASC,GAAwB,CAC3B,GAAAtJ,EAAM,UAAY,KAAa,MAAA,GAC7B,MAAAuJ,EAAcxC,EAAY,MAAM,IAAKmC,GAAMd,EAASc,CAAC,CAAC,EACtDM,EAAsBD,EAAY,OAAQL,GAAMA,IAAMd,EAASpI,EAAM,QAAQ,CAAC,EAChF,GAAAwJ,EAAoB,OAAS,EAAG,CAC5B,MAAAC,EAAkBD,EAAoB,IAAKN,GAAMK,EAAY,QAAQL,CAAC,CAAC,EAC7E,QAASQ,EAAI,EAAGA,EAAID,EAAgB,OAAQC,IAAK,CACzC,MAAAC,EAA8B,KAAK,UAAU5C,EAAY,MAAM0C,EAAgBC,CAAC,CAAC,CAAC,EAClFE,GAAuB,KAAK,UAAU5J,EAAM,QAAQ,EAC1D,GAAI2J,IAAgCC,GAA6B,OAAAH,EAAgBC,CAAC,CAAA,CAE7E,MAAA,EAAA,CAET,OAAOH,EAAY,QAAQnB,EAASpI,EAAM,QAAQ,CAAC,CAAA,CAGrD,MAAM6J,EAAW,IAAM,CACjBtC,EAAY,QACXJ,EAAa,QAChBC,EAAiB,MAAQ,GACI+B,EAAA,EACFW,EAAA,EAC3B3C,EAAa,MAAQ,IAEvBwB,EAAoB,MAAQ,GAC5BrB,EAAkB,MAAQ,GAC5B,EAEMwC,EAA6B,IAAM,CACvC,MAAMC,EAAwB,QAAQ,YAAc,MAAQ,OAAO,WAAa,IAC1EC,EAAwB,QAAQ,OAAS,MAAQ,OAAO,MAAQ,IAChEC,EAAgCtC,EAAkB,MAAM,cACzDoC,GAAgBC,IAAiB9C,EAAiB,QAClCgD,EAAA,EACflK,EAAM,8BACRiK,GAAW,eAAe,CAAE,MAAO,QAAS,OAAQ,SAAU,EAEpE,EAEME,EAAoBhK,MAAa,EAAI,EACvC,IAAA+H,EAA0B,WAAW,IAAM,GAAI,CAAC,EAEpD,SAASgC,GAAqB,CACtB,MAAAD,EAAgCtC,EAAkB,MAAM,aAC9D,GAAI,CAACsC,EAAW,OAChBE,EAAkB,MAAQ,GAC1B,IAAIC,EAAuD,KAE3D,MAAMC,EAAW,IAAM,CACjBD,iBAA6CA,CAA6B,EAC9E,aAAalC,CAAuB,EACpC,WAAW,IAAM,CACfiC,EAAkB,MAAQ,IACzB,GAAG,CACR,EAE0BjC,EAAA,WAAWmC,EAAU,GAAI,EAEnDD,EAAgC,YAAY,IAAM,EAE9CjD,EAAa,QAAU,IACtB8C,GAAW,YAAc,GAAK,SAAS,aAAe,aAE9CI,EAAA,GACV,GAAG,CAAA,CAGR,MAAMrJ,EAAa,IAAM,CACnBkG,GAAkB,OAAS,GAAMS,EAAkB,MAAM,WAAW,EAC/DE,GAAqB,OAAO,YAAYA,GAAqB,OAAO,WAAW,CAC1F,EAEA,eAAea,GAAmC,CAC5C,OAAO1I,EAAM,SAAY,WAC3B,MAAMsK,EAASvC,EAAM,MAAQA,EAAM,MAAQ,OAAW,EAAI,GAE1DwC,GAAoBvK,EAAM,OAA0C,EAClDiH,EAAA,MAAQF,EAAY,MAAM,QAE3ByD,EAAA,CAAA,CAGRvJ,EAAA,CAAE,kBAAAyH,EAAmB,SAAAN,EAAU,EAE5C,SAASoC,GAAqB,CACHlB,KAA2B,IACEvC,EAAY,OAAS,CAAC,CAACA,EAAY,MAAM,CAAC,GACjEsB,EAAgBtB,EAAY,MAAM,CAAC,CAAC,CAAA,CAGtD,eAAAuD,EAASG,EAAuBC,EAAyB,GAAM,CAC5EnD,EAAY,MAAQmD,EACpB,MAAM9K,EAAO,SAAaI,EAAM,QAAqBA,EAAM,eAAgByK,GAAgB,EAAE,EACvFE,EAAQhL,GAA2B,EACnC,CAACA,GAAY,EAAE,SAAUA,KAAgC4I,EAAA,EAC7DgC,GAAoB5K,EAAS,IAAI,EACjCiL,EAAgBjL,GAAU,MAAM,QAAU,CAAC,EAAE,KAAK,IAAM,CACtD4H,EAAY,MAAQ,EAAA,CACrB,CACH,EACM,MAAAP,EAAiB,gBAAgBpH,EAAM+K,CAAI,CAAA,CAGnD,eAAeC,EAAgBC,EAAmC,CAChE,MAAMjL,EAAO,SAAaI,EAAM,QAAqB,EAAG,EAAE,EACpD2K,EAAQhL,GAA2B,EACnC,CAACA,GAAY,EAAE,aAAcA,KAAgC6I,EAAA,EAC/CvB,EAAA,MAAQtH,EAAS,UAAYkL,CACjD,EACM,MAAA7D,EAAiB,gBAAgBpH,EAAM+K,CAAI,CAAA,CAGnD,MAAMG,GAAqC,IACHnD,GAAmB,OAAO,cAC9C,qBAAqB,IAAI,EAAEkB,EAAa,KAAK,GAAK,KAGhEkC,GAASlM,GAAgB,CACzBsI,EAAa,OAAS,GACf0C,EAAA,EACAhL,GACTmM,GAASnM,CAAK,CAElB,EAEMmM,GAAYnM,GAAe,CACzB,MAAAoM,EAAcpM,EAAM,KAAOA,EAAM,MACnCoM,IAAQ,OAASA,IAAQ,WAAoBhD,EAAA,EAC7CgD,IAAQ,aAAaC,GAAKrM,CAAK,EAC/BoM,IAAQ,WAAWE,GAAGtM,CAAK,GAC3BoM,IAAQ,SAAWA,IAAQ,MAAiCG,GAAA,EAChEvM,EAAM,eAAe,EACrBA,EAAM,gBAAgB,CACxB,EAEMuM,GAA8B,IAAM,CACpCrC,EAAkB,MAAM,OAAS,GACnC3B,EAAiB,MAAQ,GACzBiB,EAAgBU,EAAkB,MAAMF,EAAa,KAAK,CAAC,GAEjDZ,EAAA,CAEd,EAEMiD,GAAQrM,GAAe,CAC3ByI,EAAkB,MAAQ,GACtBuB,EAAa,MAAQE,EAAkB,MAAM,OAAS,IACxDlK,EAAM,eAAe,EACrB8J,EAAoB,MAAQ,GACfE,EAAA,QACbiC,GAAA,GAAsC,MAAM,EAEhD,EAEMK,GAAMtM,GAAe,CACzByI,EAAkB,MAAQ,GACtBuB,EAAa,MAAQ,IACvBhK,EAAM,eAAe,EACrB8J,EAAoB,MAAQ,GACfE,EAAA,QACbiC,GAAA,GAAsC,MAAM,EAEhD,EAEMO,GAAWxM,GAAe,CAC1B,GAAAsI,GAAc,QAAU,GAAO,OAC/BY,EAAM,MAAM,OAAS,MAAoB,MAAQ,IAC/C,MAAA5D,EAA2BsD,GAAa,OAAO,iBAC/C6D,EAAgC3D,GAAmB,OAAO,aAC1D4D,EAAc1M,GAAO,eAAiByM,GAAW,YAAYzM,GAAO,aAAa,EACjF2M,EAAS3M,GAAO,eAAiBsF,GAAQA,EAAK,SAAStF,GAAO,aAAa,EAC3E4M,GAAa5M,GAAO,eAAiBsF,GAAQA,EAAK,YAAYtF,GAAO,aAAa,EACxF,GAAI,EAAA2M,GAAUD,GACd,IAAIE,GAAY,CACHzK,EAAA,EACX,MAAA,CAEQiH,EAAA,EACZ,EAEA,SAASsC,GAAoBmB,EAAwC,CAC9D,MAAM,QAAQA,CAAK,GAAwBnD,EAAA,EAC5CmD,EAAM,OAAS,GAAK,OAAOA,EAAM,CAAC,GAAM,UAAUC,GAAmBD,CAAsB,EAC/F3E,EAAY,MAAQ2E,CAAA,CAGtB,SAASC,GAAmBC,EAAuB,EAC7C,CAAC5L,EAAM,oBAAsBA,EAAM,mBAAmB,SAAW,IAA4ByI,EAAA,EACjG,MAAMwC,EAAcjL,EAAM,mBAC1B,QAAS0J,EAAI,EAAGA,EAAIkC,EAAO,OAAQlC,KAC7B,OAAOkC,EAAOlC,CAAC,GAAM,UAAY,EAAEuB,KAAOW,EAAOlC,CAAC,KAA6BjB,EAAA,CACrF,CAGF,MAAMoD,EAAgB,CACpB,SAAAhC,EACA,QAAAwB,GACA,MAAAN,GACA,cAAA3B,EACA,SAAAhB,EACA,gBAAAC,EACA,WAAArH,EACA,UAAAiH,CACF,8BAxcE/G,EAAA,mBAmCM,MAAA,CAnCD,MAAA,CAA0B,SAAA,UAAA,EAAE,MAAKI,EAAA,eAAEwK,EAAM,OAAC,KAAK,CAAA,GAClDvF,EAAAA,YAiCYmB,GAAA,SAhCN,cAAJ,IAAID,EACH,iBAAgBN,EAAY,MAC5B,kBAAmB4B,EAAiB,MACpC,oBAAqBJ,EAAmB,MACxC,aAAcG,EAAkB,MAChC,cAAeF,EAAa,MAC5B,sBAAqB3I,EAAe,gBACpC,6BAA4BA,EAAuB,wBACnD,iBAAgB4L,EACT,gBAAiBzE,EAAgB,gDAAhBA,EAAgB,MAAAjG,GACxC,sBAAqB8F,EAAiB,MACtC,sBAAmB7F,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAD,GAAEkG,EAAmB,MAAGlG,GAC3C,kBAAmBgJ,EAAiB,KAAA,qBAErC,IAiBc,CAjBd5D,EAAAA,YAiBcuB,GAAA,SAhBR,sBAAJ,IAAID,EACH,iBAAgBgE,EAChB,iBAAgB1E,EAAY,MAC5B,qBAAoBD,EAAgB,MACpC,cAAajH,EAAU,WACvB,yBAAwBoH,EAAmB,KAAA,qBAE5C,IAQE,CARFd,EAAAA,YAQEqB,GAAA,SAPI,oBAAJ,IAAID,EACH,qBAAoBT,EAAgB,MACpC,iBAAgBC,EAAY,MAC5B,YAAagB,EAAW,MACxB,sBAAqBb,EAAiB,MACtC,iBAAgBuE,EAChB,iBAAYzK,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAD,GAAE4G,EAAK,MAAG5G,EAAA"}
|