@wwtdev/bsds-components-vue3 2.21.1 → 2.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bsds-components.js","sources":["../src/composables/buttonOrLink.js","../src/composables/clickAway.js","../src/composables/clientRouter.js","../src/utils/strings.js","../src/composables/dynamicIcon.js","../src/composables/genId.js","../src/composables/keydown.js","../src/composables/mutationObserver.js","../src/composables/transitionHelper.js","../src/components/accordion/BsAccordion.vue","../src/components/circle-button/BsCircleButton.vue","../src/components/alert/BsAlert.vue","../src/components/badge/BsBadge.vue","../src/components/banner/BsBanner.vue","../src/components/button/BsButton.vue","../src/components/field-details/BsFieldDetails.vue","../src/components/input/BsInput.vue","../src/utils/debounce.js","../src/components/calendar/internal/BsInputDateRange.vue","../src/composables/calendarWorkaround.js","../src/composables/matchMedia.js","../src/constants/inputAttrs.js","../src/utils/filterAttrs.js","../src/components/calendar/BsCalendar.vue","../src/components/chart-table/BsChartTable.vue","../src/composables/chart.js","../src/components/chart-bar/BsChartBar.vue","../src/components/checkbox/BsCheckbox.vue","../src/components/dropdown/BsDropdownContainer.vue","../src/components/transition/BsEnhancedTransition.vue","../src/composables/breakout.js","../src/components/dropdown/BsDropdownNew.vue","../src/components/dropdown/BsDropdown.vue","../src/components/dropdown-combobox/internal/BsInputCombobox.vue","../src/components/filter-button/BsFilterButton.vue","../src/utils/dropdown.js","../src/components/dropdown-option/BsDropdownOption.vue","../src/components/profile-img/BsProfileImg.vue","../src/components/dropdown-option-builder/BsDropdownOptionBuilder.vue","../src/components/input-search/BsInputSearch.vue","../src/components/dropdown-option-list/BsDropdownOptionList.vue","../src/components/dropdown-multiselect/BsDropdownMultiselect.vue","../src/components/dropdown-with-toggle/BsDropdownWithToggle.vue","../src/components/dropdown-combobox/BsDropdownCombobox.vue","../src/components/dropdown-combobox-field/BsDropdownComboboxField.vue","../src/components/dropdown-with-options/BsDropdownWithOptionsNew.vue","../src/components/dropdown-with-options/BsDropdownWithOptions.vue","../src/components/empty-state/BsEmptyState.vue","../src/components/flyout/BsFlyout.vue","../src/components/icon-gradient-wrapper/BsIconGradientWrapper.vue","../src/components/input-field/BsInputField.vue","../src/components/input-phone/countryUtils.js","../src/components/input-phone/BsInputPhone.vue","../src/components/input-typeahead/BsInputTypeahead.vue","../src/components/overlay/BsOverlay.vue","../src/components/modal/BsModal.vue","../src/components/pagination/BsPagination.vue","../src/components/pill/BsPill.vue","../src/components/profile-details/BsProfileDetails.vue","../src/components/profile/BsProfile.vue","../src/composables/steps.js","../src/components/progress-bar/BsProgressBar.vue","../src/components/radio/BsRadio.vue","../src/components/select/BsSelect.vue","../src/components/select-field/BsSelectField.vue","../src/components/select-with-dropdown/BsSelectWithDropdown.vue","../src/components/switch/BsSwitch.vue","../src/components/tab/BsTab.vue","../src/components/tab-list/BsTabList.vue","../src/components/tab-panel/BsTabPanel.vue","../src/components/table/TableCol.vue","../src/components/table/table-provider-keys.js","../src/components/table/TableRowGroup.vue","../src/components/table/FrozenCols.vue","../src/components/table/TableRow.vue","../src/components/table/HeadCell.vue","../src/components/table/Cell.vue","../src/components/table/TableHeader.vue","../src/components/table/TableFooter.vue","../src/components/table/SortToggle.vue","../src/components/table/TableColResizer.vue","../src/components/table/Table.vue","../src/components/textarea/BsTextarea.vue","../src/components/textarea-field/BsTextareaField.vue","../src/utils/fmtTime.js","../src/components/time-picker/BsTimePicker.vue","../src/components/time-picker-field/BsTimePickerField.vue","../src/components/timeline/BsTimeline.vue","../src/components/toast/BsToast.vue","../src/components/toast-actions/BsToastActions.vue","../src/components/toast-body/BsToastBody.vue","../src/components/toast-header/BsToastHeader.vue","../src/components/toaster/BsToaster.vue","../src/components/tooltip/BsTooltip.vue","../src/components/BsSelectors.js"],"sourcesContent":["import { ref, computed } from 'vue'\n\nconst TAG_BY_PROP = {\n href: 'a',\n linkTo: 'a',\n onclick: 'button',\n onClick: 'button',\n type: 'button'\n}\n\n/**\n * Determines correct tag and attrs for components that can be rendered\n * as `<button>` OR `<a>` (OR another specified default) tag\n * (e.g. BsButton, BsCircleButton, BsPill)\n * @param {Object} props - Component props - return val of `defineProps`\n * @param {Object} attrs - Component attrs - return val of `useAttrs`\n * @param {String} defaultTag - Tag to use if no other tag is determined. Defaults to 'button'.\n*/\nexport function useButtonOrLink(props, attrs, defaultTag = 'button') {\n const rootTag = getTag(props, attrs, defaultTag)\n\n const additionalAttrs = computed(() => {\n const isButton = rootTag.value === 'button'\n const attrsRet = {}\n if (isButton) {\n attrsRet.type = attrs.type || 'button'\n attrsRet.autocomplete = \"off\"\n if (props.disabled) attrsRet.disabled = true\n } else if (props.disabled) {\n attrsRet['aria-disabled'] = 'true'\n attrsRet.tabindex = \"-1\"\n }\n return attrsRet\n })\n\n const attrsToBind = computed(() => {\n const toBind = { ...attrs, ...additionalAttrs.value }\n delete toBind.href\n return toBind\n })\n\n const hrefUrl = computed(() => props.linkTo || props.href)\n\n return { rootTag, attrsToBind, hrefUrl }\n}\n\nfunction getTag(props, attrs, defaultTag) {\n const foundProp = Object.keys(TAG_BY_PROP).find(key => getProp(props, attrs, key))\n return ref(TAG_BY_PROP[foundProp] || defaultTag)\n}\n\nfunction getProp(props, attrs, key) {\n return props[key] || attrs[key]\n}\n","import { onMounted, onUnmounted } from 'vue'\n\n/**\n * Listens for clicks outside of the given elements and calls the given\n * function.\n *\n * @param {(Ref|Computed)[]} elRefs Target refs considered as \"inside\" the click area.\n * @param {function} onClickAway Callback when a click happens outside of the\n * target ref.\n */\nconst useClickAway = (elRefs, onClickAway) => {\n const handler = (ev) => {\n if (!elRefs.some((elRef) => elRef.value?.contains(ev.target))) {\n onClickAway(ev)\n }\n }\n\n onMounted(() => {\n document.addEventListener('mouseup', handler)\n })\n\n onUnmounted(() => {\n document.removeEventListener('mouseup', handler)\n })\n}\nexport default useClickAway\n","import { computed } from 'vue'\n\nexport function useClientRouter(props) {\n const propUrl = computed(() => props.linkTo || props.href || '')\n const hrefIsRelative = computed(() => propUrl.value?.startsWith?.('/') || false)\n const routeTo = computed(() => hrefIsRelative.value && props.router?.navigateTo || props.router?.push || null)\n\n function onLinkClick(e) {\n if (props.disabled) {\n e.preventDefault()\n e.stopImmediatePropagation()\n return\n }\n if (!propUrl.value || !routeTo.value) return\n\n const anchorEl = e.target.closest('a')\n if (anchorEl.href === `${window.location.origin}${propUrl.value}`) {\n e.preventDefault()\n routeTo.value(propUrl.value)\n }\n }\n return { onLinkClick }\n}\n","export function kebabToPascal(kebabText) {\n const words = kebabText.split('-')\n const caps = words.map(word => word.charAt(0).toUpperCase() + word.slice(1))\n return caps.join('')\n}\n\nexport function kebabToTitle(kebabText) {\n const lower = kebabText.split('-')\n const capitalized = lower.map(word => word.charAt(0).toUpperCase() + word.slice(1))\n return capitalized.join(' ')\n}\n","import { defineAsyncComponent, shallowRef, watch } from 'vue'\nimport { kebabToPascal } from '../utils/strings.js'\n\n/**\n *\n * @param { object | import('vue').Ref} iconProps - either pass in the component props object or a ref w/ an object value\n * @param { string } iconKey\n * @returns { object } - returns object with key `icon` mapped to the icon component to be used in the template\n */\nexport const useDynamicIcon = (iconProps, iconKey) => {\n function importIcon(iconName) {\n if (!iconName) return null\n const importVar = iconName.startsWith('bs-') ? kebabToPascal(iconName) : `BsIcon${kebabToPascal(iconName)}`\n return defineAsyncComponent(async () => {\n const { [importVar]: importedIcon } = await import('@wwtdev/bsds-icons-vue3')\n return importedIcon\n })\n }\n\n const icon = shallowRef()\n const iconName = iconProps[iconKey] || iconProps?.value?.[iconKey]\n icon.value = importIcon(iconName)\n\n watch(\n [\n () => iconProps[iconKey],\n () => iconProps?.value?.[iconKey]\n ],\n async ([newProp, newRefVal]) => icon.value = newProp ? importIcon(newProp) : importIcon(newRefVal)\n )\n\n return { icon }\n}\n","import { onMounted, ref, useId } from 'vue'\n\n/**\n * Generates unique ids for use in component markup.\n * Refs are initialized with empty strings and populated with uuids on mount to avoid SSR / hydration mismatch issues.\n *\n * @param {number} quantity how many ids to generate - defaults to 1\n * @returns {Array} array of refs with generated ids\n */\nexport function useGenIdAttrs(quantity = 1) {\n const ids = []\n for (let i = 0; i < quantity; i++) {\n ids.push(ref(useId()))\n }\n\n return ids\n}\n","import { onMounted, onUnmounted } from 'vue'\n\n/**\n * Listens for keydown and calls the given function. Attaches the listener to\n * `document` by default unless `elRef` is given.\n *\n * @param {string[] | RegExp[]} keys Keys to listen for. This is the `key` property of the\n * KeyboardEvent (https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key).\n * @param {function} onKeydown Callback when keys are pressed.\n * @param {Ref} elRef Optional target ref where the listener will be\n * attached. If not given, will use `document`.\n */\nconst useKeydown = (keys, onKeydown, elRef = undefined) => {\n const handler = (ev) => {\n if (keys?.includes?.(ev.key) || keys?.some?.(k => k?.test?.(ev.key))) {\n onKeydown(ev)\n }\n }\n\n onMounted(() => {\n const element = elRef?.value ?? document\n element.addEventListener('keydown', handler)\n })\n\n onUnmounted(() => {\n const element = elRef?.value ?? document\n element.removeEventListener('keydown', handler)\n })\n}\nexport default useKeydown\n","import { onMounted, onUnmounted } from 'vue'\n\n/**\n * Creates a mutation observer for the target element.\n *\n * @param {Ref} targetRef Vue ref of the target element.\n * @param {function} callback The callback function to be called when a mutation\n * occurs.\n * @param {{}} options The MutationObserver options. See https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver/observe#options\n * for a list of these options.\n */\nconst useMutationObserver = (targetRef, callback, options) => {\n let observer = null\n\n onMounted(() => {\n observer = new MutationObserver(callback)\n observer.observe(targetRef.value, options)\n })\n\n onUnmounted(() => {\n observer?.disconnect()\n })\n}\nexport default useMutationObserver\n","import { ref, onMounted, watch } from 'vue'\n\nconst useTransitionHelper = (props) => {\n const transition = ref(false)\n\n onMounted(() => {\n // @Deprecated - Remove 'enterControlled' and 'enterTrigger' in future release\n if (props.enterControlled) {\n transition.value = props.enterTrigger\n } else {\n transition.value = props.shown\n }\n })\n\n watch(() => props.shown, (value) => {\n transition.value = value\n })\n\n // @Deprecated - Remove in future release\n watch(() => props.enterTrigger, (value) => {\n transition.value = value\n })\n\n // @Deprecated - Remove in future release\n watch(() => props.leaveTrigger, (value) => {\n // Nothing happened in previous version if 'leaveTrigger' is false\n if (value) {\n transition.value = false\n }\n })\n\n return { transition }\n}\nexport default useTransitionHelper\n","<template>\n<div :id=\"containerId\" ref=\"containerRef\" class=\"bs-accordion\" data-component=\"bs-accordion\" :data-stacked=\"stacked\">\n <header part=\"header\" :data-open=\"showContent\">\n <button\n :aria-controls=\"contentId\"\n :aria-expanded=\"showContent\"\n class=\"bs-accordion-toggle\"\n type=\"button\"\n @click=\"handleToggled\"\n >\n <span v-if=\"icon || $slots.icon\" data-position=\"start\" style=\"display: inline-flex;\">\n <slot name=\"icon\">\n <component v-if=\"icon\" :is=\"iconTag ? iconTag : 'span'\" />\n </slot>\n </span>\n <span :id=\"headingId\">\n <slot name=\"header\">\n {{ headerText }}\n </slot>\n </span>\n <BsIconCaretDown size=\"md\" data-position=\"end\" />\n </button>\n </header>\n <div\n :aria-labelledby=\"headingId\"\n class=\"bs-accordion-content\"\n :data-open=\"showContent\"\n :id=\"contentId\"\n part=\"content\"\n role=\"region\"\n >\n <div>\n <slot />\n </div>\n </div>\n</div>\n</template>\n<script setup>\nimport { computed, ref } from 'vue'\nimport { useDynamicIcon, useGenIdAttrs } from '../../composables/_composables.js'\nimport { BsIconCaretDown } from '@wwtdev/bsds-icons-vue3'\n\nconst props = defineProps({\n controlled: { type: Boolean, default: false },\n icon: { type: String },\n headerText: { type: String, default: '' },\n /** @Deprecated */\n headingLevel: {\n type: Number,\n validator: val => [2,3,4,5].includes(val)\n },\n openItem: { type: Boolean, default: false },\n openItemId: { type: String },\n stacked: { type: Boolean, default: false }\n})\nconst emit = defineEmits(['toggled'])\n\nconst containerRef = ref(null)\nconst isOpen = ref(false)\n\nconst { icon: iconTag } = useDynamicIcon(props, 'icon')\nconst [ containerId ] = useGenIdAttrs()\n\nconst contentId = computed(() => containerId.value + '-content')\nconst headingId = computed(() => containerId.value + '-title')\n\nconst openItemMatch = computed(() => {\n return (props.openItemId && props.openItemId === containerId.value) || props.openItem === true\n})\nconst showContent = computed(() => {\n return props.controlled ? openItemMatch.value : isOpen.value\n})\n\nfunction handleToggled() {\n emit('toggled', containerId.value)\n if (!props.controlled) isOpen.value = !isOpen.value\n}\n</script>\n","<script setup>\nimport { computed, useAttrs, useSlots } from 'vue'\nimport { useButtonOrLink } from '../../composables/buttonOrLink.js'\nimport { useClientRouter } from '../../composables/clientRouter.js'\nimport { useDynamicIcon } from '../../composables/dynamicIcon.js'\n\n// Props\nconst props = defineProps({\n disabled: {\n type: Boolean,\n default: false,\n },\n ghostBtn: {\n type: Boolean,\n default: false,\n },\n hoverEffect: {\n type: Boolean,\n default: false,\n },\n icon: {\n type: String,\n },\n iconPosition: {\n type: String,\n validator: val => [\"\", 'left', 'right'].includes(val),\n default: 'right',\n },\n label: {\n type: String,\n default: undefined\n },\n linkTo: {\n type: String\n },\n router: {},\n size: {\n type: String,\n validator: val => [\"\", \"sm\", \"xs\", \"xxs\"].includes(val),\n },\n textBtn: {\n type: Boolean,\n default: false,\n },\n variant: {\n type: String,\n validator: val => [\"\", \"blue\", \"pink\", \"purple\", \"orange\", \"red\", \"royal\", \"white\"].includes(val),\n },\n\n /** @DEPRECATED in favor of linkTo */\n href: {\n type: String\n },\n})\n\ndefineOptions({ inheritAttrs: false })\nconst $attrs = useAttrs()\nconst $slots = useSlots()\nconst { rootTag, attrsToBind, hrefUrl } = useButtonOrLink(props, $attrs)\nconst { onLinkClick } = useClientRouter(props)\n\n// Computed Properties\nconst accessibleLabelAttr = computed(() => {\n if (isTextBtn.value) return {};\n if (props.href) return { title: props.label }\n return { \"aria-label\": props.label }\n})\n\nconst hoverDirection = computed(() => {\n if (!props.hoverEffect) return undefined;\n return props.iconPosition\n})\n\nconst iconComputed = computed(() => {\n const defaultCaret = props.iconPosition === \"left\" ? \"caret-left\" : \"caret-right\"\n const icon = props.icon || (props.textBtn || props.size == 'sm' ? `small-${defaultCaret}` : defaultCaret)\n return {\n icon: icon,\n }\n})\n\nconst isTextBtn = computed(() => props.textBtn || !!$slots?.default)\n\nconst textLeft = computed(() => isTextBtn.value && props.iconPosition !== \"left\")\n\nconst textRight = computed(() => isTextBtn.value && props.iconPosition === \"left\")\n\nconst variantPrefixed = computed(() => props.variant ? `color-${props.variant}` : undefined)\n\nconst { icon } = useDynamicIcon(iconComputed, 'icon')\n</script>\n\n<template>\n <component\n :is=\"rootTag\"\n class=\"bs-circle-button\"\n :data-disabled=\"disabled\"\n :data-direction=\"hoverDirection\"\n :data-ghost=\"ghostBtn\"\n :data-size=\"size\"\n :data-text=\"isTextBtn\"\n :data-variant=\"variantPrefixed\"\n data-component=\"bs-circle-button\"\n :href.prop=\"hrefUrl\"\n v-bind=\"{ ...attrsToBind, ...accessibleLabelAttr }\"\n @click=\"onLinkClick\"\n >\n <span v-if=\"textLeft\">\n <slot>\n {{ label }}\n </slot>\n </span>\n <span class=\"bs-circle-button-icon\" role=\"presentation\">\n <slot name=\"icon\">\n <component :is=\"icon\" />\n </slot>\n </span>\n <span v-if=\"textRight\">\n <slot>\n {{ label }}\n </slot>\n </span>\n </component>\n</template>\n\n","<script setup>\nimport { BsIconCircleExclamation, BsIconClose } from '@wwtdev/bsds-icons-vue3'\nimport BsCaretTextButton from '../caret-text-button/BsCaretTextButton.vue'\nimport { computed } from 'vue'\n\nconst props = defineProps({\n actionLabel: {\n type: String,\n default: undefined\n },\n actionLinkTo: {\n type: String,\n default: undefined\n },\n actionRouter: {\n type: Object,\n default: undefined\n },\n description: {\n type: String,\n default: undefined\n },\n hideDismiss: {\n type: Boolean,\n default: false\n },\n horizontal: {\n type: Boolean,\n default: false\n },\n title: {\n type: String,\n default: undefined\n },\n variant: {\n type: String,\n default: undefined,\n validator (value) {\n return ['', 'success', 'warning', 'negative'].includes(value)\n }\n }\n})\n\nconst emit = defineEmits(['action-click', 'close'])\n\nconst buttonVariant = computed(() => {\n switch (props.variant) {\n case 'success':\n return 'purple'\n case 'warning':\n return 'orange'\n case 'negative':\n return 'red'\n default:\n return 'blue'\n }\n})\n</script>\n\n<template>\n<div\n class=\"bs-alert\"\n :data-horizontal=\"horizontal ? 'true' : undefined\"\n :data-variant=\"variant\"\n role=\"alert\"\n>\n <div class=\"bs-alert-icon\">\n <slot name=\"icon\">\n <BsIconCircleExclamation size=\"auto\" />\n </slot>\n </div>\n\n <div class=\"bs-alert-title\">\n <slot name=\"title\">\n {{ title }}\n </slot>\n </div>\n\n <div v-if=\"description || $slots.description\" class=\"bs-alert-description\">\n <slot name=\"description\">\n {{ description }}\n </slot>\n </div>\n\n <button\n v-if=\"!hideDismiss\"\n class=\"bs-alert-close\"\n aria-label=\"Close alert\"\n title=\"Close alert\"\n type=\"button\"\n @click=\"emit('close')\"\n >\n <BsIconClose />\n </button>\n\n <BsCaretTextButton\n v-if=\"actionLabel\"\n class=\"bs-alert-action\"\n :label=\"actionLabel\"\n :link-to=\"actionLinkTo\"\n :router=\"actionRouter\"\n size=\"sm\"\n :variant=\"buttonVariant\"\n @click=\"emit('action-click')\"\n />\n</div>\n</template>\n","<script setup>\nimport { ref, computed } from 'vue'\n\n// Props\nconst props = defineProps({\n /** Pass value to set `data-badge-color`. */\n color: {\n type: String,\n validator: val => ['red', 'blue', 'white'].includes(val)\n },\n /** Pass value to show \"count\" indicator. Do not use if you are passing \"dot.\" */\n count: {\n type: Number,\n },\n /** Sets the count limit after which the displayed count will stop incrementing and a \"+\" will be appended. Defaults to 99. */\n countMax: {\n type: Number,\n default: 99,\n },\n /** Pass \"true\" to show a simple dot indicator. Do not use if you are passing a \"count.\" */\n dot: {\n type: Boolean,\n default: false\n },\n /** Pass the singular name of the items that are being counted. e.g.\n * if we are counting unread notifications, pass \"unread notification\";\n * or if we are counting new messages, pass \"new message\".\n * This is required to ensure accessibility! */\n label: {\n type: String,\n default: 'item',\n },\n /** Sets the position of the badge in relation to the slotted content. By default, badge is positioned to the right. */\n position: {\n type: String,\n validator: val => ['left', 'right'].includes(val),\n default: 'right'\n },\n /** Pass \"true\" to show the badge even when the \"count\" value is zero. */\n showZero: {\n type: Boolean,\n default: false\n },\n variant: {\n type: String,\n validator: val => val === 'notext'\n }\n})\n\n// Element Ref\nconst hostRef= ref(null)\n\n// Computed Properties\nconst countFmt = computed(() => {\n if (props.count === 0) return \"0\";\n if (!props.count || props.dot) return null;\n return props.count > props.countMax ? props.countMax + \"+\" : props.count.toString();\n})\n\nconst labelFmt = computed(() => {\n const base = hostRef.value?.textContent?.trim() || \"\";\n const ct = countFmt.value ? countFmt.value + \" \" : \"\";\n if (!ct && !props.dot) return base;\n const sfx = props.count !== 1 ? \"s\" : \"\";\n return `${base ? `${base}, ` : ''}${ct}${props.label}${sfx}`;\n})\n\n</script>\n\n<template>\n <span\n ref=\"hostRef\"\n :aria-label=\"labelFmt\"\n :class=\"{ 'bs-badge': dot || countFmt }\"\n :data-badge-color=\"color\"\n data-component=\"bs-badge\"\n :data-count=\"countFmt\"\n :data-position=\"position\"\n :data-show-zero=\"showZero\"\n :data-variant=\"variant\"\n role=\"status\"\n >\n <slot v-if=\"variant !== 'notext'\"/>\n </span>\n</template>\n","<script setup>\nimport { ref } from 'vue'\nimport { BsIconWarning, BsIconClose } from '@wwtdev/bsds-icons-vue3'\n\nconst props = defineProps({\n variant: {\n type: String,\n default: '',\n validator: val => ['', 'negative'].includes(val),\n },\n})\nconst emit = defineEmits(['dismiss'])\n\nconst isDismissed = ref(false)\n\nfunction handleDismiss() {\n isDismissed.value = true\n emit('dismiss')\n}\n</script>\n\n<template>\n <div\n v-if=\"!isDismissed\"\n role=\"alert\"\n class=\"bs-banner\"\n data-component=\"bs-banner\"\n :data-variant=\"variant\"\n >\n <div class=\"bs-banner-content\">\n <div class=\"bs-banner-warning-icon\">\n <slot name=\"icon\">\n <BsIconWarning size=\"md\" />\n </slot>\n </div>\n <p>\n <slot />\n </p>\n <button type=\"button\" title=\"Close Banner\" @click=\"handleDismiss\">\n <BsIconClose />\n </button>\n </div>\n </div>\n</template>\n","<template>\n <component\n :is=\"rootTag\"\n class=\"bs-button\"\n data-component=\"bs-button\"\n :data-ghost=\"ghostBtn\"\n :data-size=\"size\"\n :data-text=\"textBtn\"\n :data-variant=\"variant\"\n :href.prop=\"hrefUrl\"\n v-bind=\"attrsToBind\"\n @click=\"onLinkClick\"\n >\n <slot></slot>\n </component>\n</template>\n<script setup>\nimport { useAttrs } from 'vue'\nimport { useButtonOrLink } from '../../composables/buttonOrLink.js'\nimport { useClientRouter } from '../../composables/clientRouter.js'\n\nconst props = defineProps({\n disabled: {\n type: Boolean,\n default: false\n },\n ghostBtn: {\n type: Boolean,\n default: false\n },\n linkTo: {\n type: String\n },\n router: {},\n size: {\n type: String,\n validator: (val) => ['sm', 'xs', 'xxs'].includes(val)\n },\n textBtn: {\n type: Boolean,\n default: false\n },\n variant: {\n type: String,\n validator: (val) => ['primary', 'secondary', 'positive', 'negative', 'warning', 'pink', 'royal', 'white'].includes(val),\n },\n\n /** @DEPRECATED in favor of linkTo */\n href: { type: String },\n})\n\ndefineOptions({ inheritAttrs: false })\nconst $attrs = useAttrs()\nconst { rootTag, attrsToBind, hrefUrl } = useButtonOrLink(props, $attrs)\nconst { onLinkClick } = useClientRouter(props)\n</script>\n","<script setup>\nimport { ref, computed } from 'vue'\n\n// Props\nconst props = defineProps({\n /** The number of characters that have been entered by the user. */\n charCount: Number,\n /** Pass value to show character count and set the maximum number of characters that are allowed to be submitted by the user. */\n charMax: Number,\n /** Applies error styles to the helper text. */\n error: {\n type: Boolean,\n default: false\n },\n /** Pass error text. Will be shown if `error` is `true`. */\n errorMsg: String,\n /** Pass single helper text. */\n hint: String,\n /** Adds an id to associate a hint to an input. */\n hintId: String\n})\n\n// Computed Properties\nconst hintMsg = computed(() => {\n return props.error ? (props.errorMsg || props.hint) : props.hint\n})\n\n</script>\n\n<template>\n<div class=\"bs-field-details\" data-component=\"bs-field-details\">\n <span v-if=\"hintMsg\"\n :id=\"hintId\"\n class=\"bs-hint\"\n :data-error=\"error\"\n >\n {{ hintMsg }}\n </span>\n\n <span v-if=\"charMax\"\n aria-description=\"character count over character limit for the preceding text field\"\n class=\"bs-character-count\"\n :data-error=\"props.charCount > props.charMax\"\n >\n {{ props.charCount || '0' }} / {{ props.charMax }}\n </span>\n</div>\n</template>\n","<script setup>\nimport { computed, useAttrs } from 'vue'\n\nconst props = defineProps({\n error: {\n type: Boolean,\n default: false\n },\n hintId: String,\n /** @Deprecated - Just set `id` since it will fall-through to the inner input element. */\n inputId: String,\n modelValue: [String, Number],\n value: [String, Number],\n})\nconst emit = defineEmits(['update:modelValue'])\nconst attrs = useAttrs()\n\nconst aria = computed(() => (\n { [props.error ? \"aria-errormessage\" : \"aria-describedby\"]: props.hintId }\n))\n\nfunction handleInput(e) {\n const val = attrs.type === 'number' ? parseInt(e.target['value']) : e.target['value']\n emit('update:modelValue', val)\n}\n</script>\n\n<template>\n<input\n class=\"bs-input\"\n data-component=\"bs-input\"\n :data-error=\"error\"\n :id=\"$attrs.id || inputId\"\n :value=\"value || modelValue\"\n @input=\"handleInput\"\n v-bind=\"aria\"\n/>\n</template>\n","/**\n * @typedef {(...args: any[]) => any} Func\n*/\n/**\n * @param {Func} func - function to debounce\n * @param {number} wait - milliseconds\n * @param {boolean} [immediate] - whether to run immediately\n * @returns {Func} debounced function\n */\nexport function debounce(func, wait, immediate) {\n let timeout;\n return function() {\n \tlet context = this, args = arguments;\n \tclearTimeout(timeout);\n \tif (immediate && !timeout) func.apply(context, args);\n \ttimeout = setTimeout(function() {\n \t\ttimeout = null;\n \t\tif (!immediate) func.apply(context, args);\n \t}, wait);\n };\n}\n// https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore#_debounce\n// this is a basic debounce function, it is not the same as lodash debounce but it should work for our use cases\n","<script setup>\nimport { ref, computed } from 'vue'\nimport { BsIconCalendar } from '@wwtdev/bsds-icons-vue3'\nimport BsInput from '@components/input/BsInput.vue'\nimport BsInputAddon from '@components/input-addon/BsInputAddon.vue'\nimport { debounce } from '@/utils/debounce.js'\n\nconst props = defineProps({\n disabled: {\n type: Boolean,\n default: false,\n },\n error: {\n type: Boolean,\n default: false,\n },\n inputId: {\n type: String,\n required: true\n },\n inputValue: {\n type: Object,\n default: null\n },\n inputValueFmt: {\n type: String,\n },\n listeners: {\n type: Object,\n default: () => ({})\n },\n placeholder: {\n type: String,\n default: 'Choose your date'\n },\n required: {\n type: Boolean,\n default: false,\n },\n})\n\nconst emit = defineEmits(['ui-focusin', 'ui-input'])\n\nconst hiddenStart = ref(null)\nconst hiddenEnd = ref(null)\n\nfunction dispatchRangeChange(el) {\n const ev = new Event('change', { bubbles: true, cancelable: true })\n el.dispatchEvent(ev)\n}\n\nfunction handleRangeChange(e) {\n const { value } = e.target\n const [ start, end ] = value.split(/ to | - /)\n\n hiddenStart.value.value = start || ''\n hiddenEnd.value.value = end || ''\n dispatchRangeChange(hiddenStart.value)\n dispatchRangeChange(hiddenEnd.value)\n}\n\nconst handleRangeChangeDebounced = debounce(handleRangeChange, 1000)\n\nfunction handleRangeInput(e) {\n emit('ui-input')\n handleRangeChangeDebounced(e)\n}\n\nconst startListener = computed(() => {\n if (props.listeners.start) {\n return props.listeners.start\n }\n return {}\n})\n\nconst endListener = computed(() => {\n if (props.listeners.end) {\n return props.listeners.end\n }\n return {}\n})\n</script>\n\n<template>\n <BsInputAddon\n :disabled=\"disabled\"\n :error=\"error\"\n >\n <BsIconCalendar />\n <BsInput\n data-autowidth\n :disabled=\"disabled\"\n :id=\"inputId\"\n :model-value=\"inputValueFmt\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n @focusin=\"$emit('ui-focusin')\"\n @input=\"handleRangeInput\"\n @change=\"handleRangeChange\"\n />\n <input\n ref=\"hiddenStart\"\n type=\"hidden\"\n :disabled=\"disabled\"\n :id=\"`${inputId}-start`\"\n :model-value=\"inputValue.start\"\n v-on=\"startListener\"\n />\n <input\n ref=\"hiddenEnd\"\n type=\"hidden\"\n :disabled=\"disabled\"\n :id=\"`${inputId}-end`\"\n :model-value=\"inputValue.end\"\n v-on=\"endListener\"\n />\n </BsInputAddon>\n</template>\n","import { onBeforeUnmount, onMounted } from 'vue'\n\n/** @param {import('vue').Ref<HTMLElement>} containerRef template ref on el wrapping VDatePicker */\nexport function useCalendarWorkaround(containerRef) {\n /**\n * @param {HTMLElement} el\n * @returns {boolean}\n */\n function isNavBtn(el) {\n return (\n el?.classList?.contains?.('vc-arrow') &&\n (el.classList.contains('vc-prev') || el.classList.contains('vc-next'))\n )\n }\n\n /**\n * @param {KeyboardEvent[\"key\"]} key\n * @returns {boolean}\n */\n function isSpaceOrEnter(key) {\n return key === ' ' || key === 'Spacebar' || key === 'Enter'\n }\n\n /** @param {KeyboardEvent} e */\n function keydownWorkaround(e) {\n if (isNavBtn(e?.target) && isSpaceOrEnter(e?.key)) {\n e.preventDefault()\n }\n }\n\n onMounted(() => {\n containerRef.value?.addEventListener?.('keydown', keydownWorkaround)\n })\n\n onBeforeUnmount(() => {\n containerRef.value?.removeEventListener?.('keydown', keydownWorkaround)\n })\n}\n","import { onBeforeMount, onBeforeUnmount, watch } from 'vue'\n\nexport function useMatchMedia(query, handlerFn, watchList = []) {\n let mediaQuery\n\n onBeforeMount(() => {\n mediaQuery = window.matchMedia(query)\n mediaQuery.addEventListener('change', handlerFn)\n handlerFn(mediaQuery)\n })\n\n onBeforeUnmount(() => {\n mediaQuery.removeEventListener('change', handlerFn)\n mediaQuery = null\n })\n\n if (watchList.length) {\n watch(watchList, () => handlerFn(mediaQuery))\n }\n}\n","export const boolAttrs = [\n 'aria-describedby',\n 'aria-label',\n 'data-cy',\n 'form',\n 'id',\n 'name',\n]\n\nexport const selectAttrs = [\n 'aria-describedby',\n 'aria-label',\n 'autocomplete',\n 'autofocus',\n 'data-cy',\n 'form',\n 'id',\n 'multiple',\n 'name',\n 'size',\n]\n\nexport const textareaAttrs = [\n 'aria-describedby',\n 'aria-label',\n 'autocapitalize',\n 'autocomplete',\n 'autofocus',\n 'cols',\n 'data-cy',\n 'dirname',\n 'form',\n 'id',\n 'maxlength',\n 'minlength',\n 'name',\n 'placeholder',\n 'readonly',\n 'rows',\n 'spellcheck',\n 'wrap',\n]\n\nexport const textlikeAttrs = [\n 'aria-describedby',\n 'aria-label',\n 'autocapitalize',\n 'autocomplete',\n 'data-cy',\n 'dirname',\n 'form',\n 'id',\n 'list',\n 'max',\n 'maxlength',\n 'min',\n 'minlength',\n 'multiple',\n 'name',\n 'pattern',\n 'placeholder',\n 'readonly',\n 'size',\n 'step',\n]\n","export * from '../constants/inputAttrs.js'\n\n/**\n * Handles filtering of fallthrough attributes. This function may be used on\n * setup or in the template to get on-demand filtering of attributes. E.g.:\n *\n * `v-bind=\"filterAttrs($attrs, attrFilter).filtered\"`\n *\n * @param {{[key]: value}} attrs Attributes to filter. Typically `useAttrs()` or\n * `$attrs`.\n * @param {string[]} filter Array of attribute names to filter.\n * @returns {{filtered: {[key]: value}, remaining: {[key]: value}}} Object\n * containing two objects: `filtered` (attributes that match the filter) and\n * `remaining` (attributes that do not match the filter).\n */\nexport function filterAttrs(attrs, filter = []) {\n const filtered = {}\n const remaining = {}\n Object.keys(attrs).forEach(key => {\n if (filter.includes(key)) {\n filtered[key] = attrs[key]\n } else {\n remaining[key] = attrs[key]\n }\n })\n return { filtered, remaining }\n}\n\n/**\n * Handles filtering of fallthrough attributes for components using `passAttrs`\n * props. This function may be used on setup or in the template to get on-demand\n * filtering of attributes. E.g.:\n *\n * `v-bind=\"filterPassAttrs(passAttrs, $attrs, attrFilter).filtered\"`\n *\n * @param {string} passAttrs Comma-separated list of attributes to pass through.\n * @param {{[key]: value}} attrs Attributes to filter. Typically `useAttrs()` or\n * `$attrs`.\n * @param {string[]} filter Array of attribute names to filter. This gets\n * combined with `passAttrs` to create a single filter.\n * @returns {{filtered: {[key]: value}, remaining: {[key]: value}}} Object\n * containing two objects: `filtered` (attributes that match the filter) and\n * `remaining` (attributes that do not match the filter).\n */\nexport function filterPassAttrs(passAttrs, attrs, filter = []) {\n const passAttrsFilter = passAttrs?.split?.(',') || []\n const combinedFilter = filter.concat(passAttrsFilter)\n return filterAttrs(attrs, combinedFilter)\n}\n","<script setup>\nimport { computed, onMounted, nextTick, ref, useAttrs, watch } from 'vue'\nimport { DatePicker as VDatePicker } from 'v-calendar'\nimport BsFieldDetails from '../field-details/BsFieldDetails.vue'\nimport BsLabel from '../label/BsLabel.vue'\nimport BsInputDateSingle from './internal/BsInputDateSingle.vue'\nimport BsInputDateRange from './internal/BsInputDateRange.vue'\nimport { useCalendarWorkaround } from '@composables/calendarWorkaround.js'\nimport { useGenIdAttrs } from '@composables/genId.js'\nimport { useMatchMedia } from '@composables/matchMedia.js'\nimport { filterAttrs } from '../../utils/filterAttrs.js'\nimport 'v-calendar/style.css'\n\nconst MQ = '(min-width: 752px)'\n\nconst props = defineProps({\n disabled: {\n type: Boolean,\n default: false,\n },\n /** Date[] */\n disabledDates: {\n type: [Array],\n default: null\n },\n error: {\n type: Boolean,\n default: false,\n },\n exclusiveDates: {\n type: [Array],\n default: null\n },\n errorMsg: {\n type: String,\n },\n hint: {\n type: String,\n },\n inputId: {\n type: String,\n },\n inputMode: {\n type: Boolean,\n default: true\n },\n isRange: {\n type: Boolean,\n default: false\n },\n label: {\n type: String,\n },\n maxDate: {\n type: Date\n },\n minDate: {\n type: Date\n },\n /** Date | { start: Date, end: Date } */\n modelValue: {\n type: [Date, Object],\n default: null\n },\n placeholder: {\n type: String,\n default: 'Choose your date'\n },\n required: {\n type: Boolean,\n default: false,\n },\n step: {\n type: Number,\n default: 1,\n validator: val => val === 1 || val === 2\n },\n variant: {\n type: String,\n validator: (value) => ['', '2-col'].includes(value),\n },\n})\nconst emit = defineEmits(['update:modelValue'])\n\nconst calendar = ref(null)\nconst columns = ref(1)\nconst container = ref(null)\nconst [ inputIdGen, hintId ] = useGenIdAttrs(2)\nconst steps = ref(1)\n\n// These fall outside the scope of this component's API but\n// can be passed through to v-calendar if needed... Do we need this? Not sure.\ndefineOptions({ inheritAttrs: false })\nconst { filtered: toChild, remaining: toRoot } = filterAttrs(useAttrs(), [\n 'attributes',\n 'data-cy',\n 'expanded',\n 'first-day-of-week',\n 'locale',\n 'masks',\n 'rows',\n 'trim-weeks',\n])\n\nconst disabledDatesComputed = computed(() =>\n props.exclusiveDates?.length\n ? getBlackoutDates(props.exclusiveDates)\n : props.disabledDates\n)\nconst inputIdAttr = computed(() => props.inputId || inputIdGen.value)\nconst modifiers = computed(() => ({ range: props.isRange }))\nconst showFieldDetails = computed(() => Boolean(props.error && props.errorMsg || props.hint))\nconst stepRef = computed(() => props.step)\nconst variantRef = computed(() => props.variant)\n\nuseCalendarWorkaround(container) // Workaround for v-calendar bug - remove when fixed\nuseMatchMedia(\n MQ,\n (e) => columns.value = e?.matches && variantRef.value == '2-col' ? 2 : 1,\n [ variantRef ]\n)\nuseMatchMedia(\n MQ,\n (e) => steps.value = e?.matches && variantRef.value == '2-col' ? stepRef.value : 1,\n [ stepRef, variantRef ]\n)\n\nonMounted(() => {\n if (!props.inputMode) setNavButtonLabels()\n})\n\nwatch(() => calendar.value?.popoverRef?.isVisible, (visible) => {\n if (visible) nextTick(setNavButtonLabels)\n})\n\nfunction formatInput(inputValue) {\n if (props.isRange && inputValue.start && inputValue.end) {\n return `${inputValue.start} to ${inputValue.end}`\n } else if (!props.isRange && inputValue) {\n return inputValue\n } else {\n return ''\n }\n}\n\nfunction getBlackoutDates(exclusiveDates) {\n const toDisable = []\n const ONE_DAY = 24 * 60 * 60 * 1000\n for (let i = 0; i < exclusiveDates.length; i++) {\n const date = exclusiveDates[i]\n if (i === 0) {\n toDisable.push({ start: null, end: new Date(date.getTime() - ONE_DAY) })\n }\n if (i > 0 && date.getTime() - exclusiveDates[i - 1].getTime() > ONE_DAY) {\n toDisable.push({\n start: new Date(exclusiveDates[i - 1].getTime() + ONE_DAY),\n end: new Date(date.getTime() - ONE_DAY),\n })\n }\n if (i === exclusiveDates.length - 1) {\n toDisable.push({ start: new Date(date.getTime() + ONE_DAY), end: null })\n }\n }\n return toDisable\n}\n\nfunction handleRangeBlur(e) {\n if (!props.isRange || container.value.contains(e.relatedTarget)) return\n calendar.value.hidePopover()\n}\n\nfunction setNavButtonLabels() {\n const prev = container.value.querySelector('button.vc-prev')\n const next = container.value.querySelector('button.vc-next')\n if (prev) prev.setAttribute('aria-label', 'Previous month')\n if (next) next.setAttribute('aria-label', 'Next month')\n}\n</script>\n<template>\n <div ref=\"container\"\n class=\"bs-calendar\"\n data-component=\"bs-calendar\"\n :data-range=\"isRange\"\n @focusout=\"handleRangeBlur\"\n v-bind=\"toRoot\"\n >\n <BsLabel v-if=\"label || $slots.label\"\n :for=\"inputIdAttr\"\n :disabled=\"disabled\"\n :required=\"required\"\n >\n <slot name=\"label\">\n {{ label }}\n </slot>\n </BsLabel>\n <VDatePicker\n ref=\"calendar\"\n :columns=\"columns\"\n :disabled-dates=\"disabledDatesComputed\"\n :max-date=\"maxDate\"\n :min-date=\"minDate\"\n mode=\"date\"\n :model-value=\"modelValue\"\n :model-modifiers=\"modifiers\"\n :popover=\"{ visibility: 'focus'}\"\n :rows=\"1\"\n :step=\"steps\"\n @update:model-value=\"$emit('update:modelValue', $event)\"\n v-bind=\"toChild\"\n >\n <template #default=\"{ inputValue, inputEvents, showPopover }\" v-if=\"inputMode\">\n\n <BsInputDateSingle v-if=\"!isRange\"\n :disabled=\"disabled\"\n :error=\"error\"\n :input-id=\"inputIdAttr\"\n :listeners=\"inputEvents\"\n :model-value=\"formatInput(inputValue)\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n />\n\n <BsInputDateRange v-else\n :disabled=\"disabled\"\n :error=\"error\"\n :input-id=\"inputIdAttr\"\n :input-value=\"inputValue\"\n :input-value-fmt=\"formatInput(inputValue)\"\n :listeners=\"inputEvents\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n @ui-focusin=\"showPopover\"\n @ui-input=\"showPopover\"\n />\n\n </template>\n </VDatePicker>\n <BsFieldDetails v-if=\"showFieldDetails\"\n :error=\"error\"\n :error-msg=\"errorMsg\"\n :hint=\"hint\"\n :hint-id=\"hintId\"\n />\n </div>\n</template>\n\n<style>\n/* ------------- Input/Toggle ------------- */\n\n.bs-calendar :where(.bs-input-addon .bs-icon) {\n padding-inline: .75rem .5rem;\n width: 2.25rem;\n}\n\n.bs-calendar :where(.bs-input-addon input) {\n padding-inline-start: 0;\n}\n\n/* ------------- Calendar Base + Container ------------- */\n\n.bs-calendar {\n --bs-cal-color: var(--bs-ink-base);\n --bs-cal-focus-ring-color: var(--bs-blue-400);\n --bs-cal-highlight-content-hover-color: var(--bs-gray-500);\n --bs-cal-radius: 0px;\n --bs-cal-text-sm: 0.875rem;\n --bs-cal-weekday-color: var(--bs-ink-light);\n --bs-cal-width-day: auto;\n --bs-cal-width: 100%;\n\n --bs-cal-day-padding: 0;\n --bs-cal-day-bg-selected: var(--bs-blue-400);\n --bs-cal-day-bg-betweens: var(--bs-blue-100);\n --bs-cal-day-bg-tentative-start: var(--bs-blue-400);\n --bs-cal-day-hover-bg: var(--bs-blue-100);\n --bs-cal-day-hover-bg-betweens: var(--bs-blue-200);\n --bs-cal-day-hover-bg-selected: var(--bs-blue-300);\n}\n\n.bs-calendar :is(.vc-popover-content-wrapper, .vc-light, .vc-dark),\n.bs-calendar :is(.vc-popover-content-wrapper, .vc-light, .vc-dark) * {\n --vc-bg: var(--bs-bg-base-to-light);\n --vc-color: var(--bs-cal-color); /* Text color */\n --vc-day-content-disabled-color: var(--bs-ink-disabled); /* Disabled date text color */\n --vc-day-content-hover-bg: var(--bs-cal-day-hover-bg); /* Day hover bg color */\n --vc-focus-ring: 0 0 0 2px var(--bs-cal-focus-ring-color); /* Focus ring box shadow */\n --vc-font-family: 'Roobert', sans-serif;\n --vc-font-medium: var(--vc-font-normal);\n --vc-header-arrow-color: var(--bs-ink-base); /* Nav Arrow color */\n --vc-header-arrow-hover-bg: var(--bs-bg-medium); /* Nav Arrow hover bg color */\n --vc-header-title-color: var(--bs-ink-base);\n --vc-highlight-light-bg: var(--bs-cal-day-bg-betweens); /* Bg Color for dates between start and end date */\n --vc-highlight-light-content-color: var(--bs-ink-base); /* Text color for dates between start and end date */\n --vc-highlight-outline-bg: var(--bs-cal-day-bg-tentative-start); /* Bg color for Start and End UNCONFIRMED dates */\n --vc-highlight-outline-border: transparent ;\n --vc-highlight-outline-color: var(--bs-ink-blue);\n --vc-highlight-outline-content-color: var(--bs-ink-white);\n --vc-highlight-solid-bg: var(--bs-cal-day-bg-selected); /* Bg Color for SELECTED day */\n --vc-popover-content-border: transparent;\n --vc-rounded-lg: var(--bs-cal-radius);\n --vc-shadow-lg: var(--bs-shadow-contentMedium);\n --vc-text-sm: var(--bs-cal-text-sm);\n --vc-weekday-color: var(--bs-cal-weekday-color);\n}\n\n.bs-calendar :where(.vc-popover-content-wrapper, .vc-container, .vc-pane-layout) {\n width: var(--bs-cal-width);\n}\n\n/* Override focus ring and implement our own -- needed to accommodate the offset */\n\n.bs-calendar :where(.vc-day-content):is(:focus-visible, :focus-within, :focus) {\n box-shadow: none;\n}\n\n.bs-calendar :where(.vc-day-content):is(:focus-visible, :focus-within, :focus)::after {\n border-radius: 50%;\n border: 2px solid var(--bs-cal-focus-ring-color);\n bottom: auto;\n content: '';\n height: 2.375rem;\n left: auto;\n position: absolute;\n right: auto;\n top: auto;\n width: 2.375rem;\n z-index: 9999;\n}\n\n\n/* ------------- Calendar Header Row ------------- */\n\n.bs-calendar :where(.vc-header) {\n margin-block-start: 1.5rem;\n padding-inline: 1.5rem;\n}\n\n.bs-calendar :where(.vc-title) {\n font-size: inherit;\n}\n\n/* ------------- Calendar Rows ------------- */\n\n.bs-calendar :where(.vc-weeks) {\n padding-block: 1rem 1.5rem;\n padding-inline: 1rem;\n}\n\n/* ------------- Calendar Cells (Days, Weekday Letters) ------------- */\n\n.bs-calendar :where(.vc-weekday, .vc-day) {\n height: 2rem;\n padding-inline: var(--bs-cal-day-padding);\n width: var(--bs-cal-width-day);\n}\n\n.bs-calendar :where(.vc-highlight-content-light) {\n font-weight: var(--vc-font-medium);\n}\n\n.bs-calendar :where(.vc-highlight-content-light:hover) {\n color: var(--bs-cal-highlight-content-hover-color);\n}\n\n.bs-calendar :where(.vc-day:focus-within) {\n z-index: 10;\n}\n\n/* ------------- Calendar Day Content Circle (appears on hover, selected, focus, etc) ------------- */\n.bs-calendar :where(.vc-day-content, .vc-highlight) {\n height: 2rem;\n line-height: 2rem;\n width: 2rem;\n}\n\n/* Hover bg color on SELECTED date */\n.bs-calendar .vc-highlights ~ :where(.vc-day-content) {\n --vc-day-content-hover-bg: var(--bs-cal-day-hover-bg-selected);\n}\n\n/* Hover bg color on dates between start and end date */\n.bs-calendar .vc-highlights:where(:has(.vc-highlight-base-middle)) ~ :where(.vc-day-content) {\n --vc-day-content-hover-bg: var(--bs-cal-day-hover-bg-betweens);\n}\n\n/* ------------- Disabled dates ------------- */\n.bs-calendar :where(.vc-disabled, [aria-disabled=\"true\"]) {\n --bs-cal-day-hover-bg: transparent;\n --bs-cal-focus-ring-color: var(--bs-ink-disabled); /* Maybe - clear this w/ design */\n}\n\n\n/* ------------- Dark mode ------------- */\n\n:where(.dark) .bs-calendar {\n --bs-cal-color: var(--bs-white);\n --bs-cal-day-bg-betweens: var(--bs-royal-200);\n --bs-cal-day-bg-selected: var(--bs-royal-400);\n --bs-cal-day-bg-tentative-start: var(--bs-royal-400);\n --bs-cal-day-hover-bg-betweens: var(--bs-royal-300);\n --bs-cal-day-hover-bg-selected: var(--bs-plum-400);\n --bs-cal-day-hover-bg: var(--bs-royal-300);\n --bs-cal-highlight-content-hover-color: var(--bs-ink-base);\n --bs-cal-weekday-color: var(--bs-white);\n}\n\n/* ------------- Tablet/Destkop styles ------------- */\n@media (min-width: 752px) {\n .bs-calendar {\n --bs-cal-day-padding: 0.5rem;\n --bs-cal-radius: 0.25rem;\n --bs-cal-text-sm: 1.125rem;\n --bs-cal-width: max-content;\n --bs-cal-width-day: 3rem;\n }\n}\n</style>\n","<script setup>\n/**\n * @typedef {import('../Types.vue').Chart.Dataset} ChartDataset\n *\n * @typedef {Object} ChartTableRow\n * @property {string} rowLabel\n * @property {string} [rowLabelFmt]\n * @property {ChartTableCell[]} dataCells\n *\n * @typedef {Object} ChartTableCell\n * @property {string} datasetLabel\n * @property {number | string | null} value\n */\n\nimport { computed, onMounted, ref } from 'vue'\n\nconst props = defineProps({\n chartType: {\n type: String,\n required: true\n },\n data: {\n type: Array,\n required: true,\n },\n dataIdxLabels: {\n type: Array,\n default: () => []\n },\n tableTitle: {\n type: String,\n default: '',\n },\n xAxisType: {\n type: String,\n default: 'category',\n validator: (value) => ['category', 'linear', 'time'].includes(value),\n },\n xLabel: {\n type: String,\n default: 'X'\n },\n yLabel: {\n type: String,\n default: 'Y'\n },\n})\n\nconst mounted = ref(false)\n\nconst formatTimeVal = (timeVal) => {\n const date = new Date(timeVal)\n const timeStr = date.toTimeString().split(' ')[0]\n const dateStr = date.toDateString().split(' ').slice(1, 3).join(' ')\n return `${timeStr} (${dateStr})`\n}\n\nconst altLayout = computed(() => !props.dataIdxLabels?.length)\n\n/**\n * @param {ChartDataset[]} datasets\n * @returns {ChartTableRow[]}\n */\nfunction getBasicRows(datasets) {\n try {\n return datasets.map(ds => {\n const rowLabel = ds.label\n let dataCells = []\n // e.g., { x: 'Jan', y: 140 } - not guaranteed to have 1 data pt for every x tick\n if (ds.data.some(it => it?.x && it?.y)) {\n const xTickToYValue = ds.data.reduce((acc, d) => {\n acc[d.x] = d.y\n return acc\n }, {})\n dataCells = props.dataIdxLabels.map((tickPtLabel) => {\n const yValue = xTickToYValue[tickPtLabel] ?? null\n return { value: yValue }\n })\n } else {\n // e.g. just a number - should be 1 data pt for every x tick\n dataCells = ds.data.map((d) => ({ value: d }))\n }\n return { rowLabel, dataCells }\n })\n } catch(err) {\n return []\n }\n}\n\n/**\n * @param {ChartDataset[]} datasets\n * @returns {ChartTableRow[]}\n */\nfunction getAltRows(datasets) {\n try {\n const consolidatedIndices = datasets.reduce((acc, ds) => {\n const toAdd = ds.data.map(d => d?.x)\n return [ ...acc, ...toAdd ]\n }, [])\n\n const uniqueIndices = Array.from(new Set(consolidatedIndices))\n if (props.xAxisType === 'time' || props.xAxisType === 'linear') {\n uniqueIndices.sort((a,b) => {\n if (typeof a === 'string' && typeof b === 'string') {\n a = a.toLowerCase()\n b = b.toLowerCase()\n }\n if (a < b) return -1\n if (a > b) return 1\n return 0\n })\n }\n\n const rows = uniqueIndices.map((idx) => {\n const row = { rowLabel: idx }\n const rowData = []\n datasets.forEach((ds) => {\n const cell = { datasetLabel: ds.label }\n const dataPt = ds.data.find((d) => d.x === idx)\n cell.value = dataPt ? dataPt.y : null\n rowData.push(cell)\n })\n row.dataCells = rowData\n if (props.xAxisType === 'time') {\n row.rowLabelFmt = formatTimeVal(idx)\n }\n return row\n })\n\n return rows\n } catch(err) {\n return []\n }\n}\n\nconst tableRows = computed(() => altLayout.value ? getAltRows(props.data) : getBasicRows(props.data))\nconst table = computed(() => ({\n colspan: altLayout.value ? props.data.length + 1 : props.dataIdxLabels.length + 1,\n title: props.tableTitle,\n colHeadingFirst: altLayout.value ? props.xLabel : 'Dataset',\n colHeadings: altLayout.value ? props.data.map((ds) => ds.label) : props.dataIdxLabels,\n rows: tableRows.value\n}))\nconst tableReady = computed(() => mounted.value && !!tableRows.value?.length)\n\nonMounted(() => {\n mounted.value = true\n})\n</script>\n\n<template>\n<div class=\"bs-chart-table\" data-component=\"bs-chart-table\">\n <table :summary=\"table.title\" v-if=\"tableReady\">\n <thead>\n <tr>\n <th :colspan=\"table.colspan\">\n {{ table.title }}\n </th>\n </tr>\n <tr>\n <th scope=\"col\">\n {{ table.colHeadingFirst }}\n </th>\n <th v-for=\"colHeading in table.colHeadings\"\n :key=\"colHeading\"\n scope=\"col\"\n >\n {{ colHeading }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"row in table.rows\" :key=\"row.rowLabelFmt || row.rowLabel\">\n <th scope=\"row\">\n {{ row.rowLabelFmt || row.rowLabel }}\n </th>\n <td v-for=\"(c) in row.dataCells\"\n :key=\"`${row.rowLabelFmt || row.rowLabel}${c.datasetLabel}${c.value}`\"\n >\n {{ c.value }}\n </td>\n </tr>\n </tbody>\n </table>\n</div>\n</template>\n","import { onMounted, onBeforeUnmount, ref, watch } from 'vue'\nimport { Chart, Filler } from 'chart.js'\nimport 'chartjs-adapter-date-fns'\nimport _merge from 'lodash.merge'\nimport useKeydown from '../composables/keydown.js'\nimport { useMatchMedia } from '../composables/matchMedia.js'\nimport { debounce } from '@utils/debounce.js';\n\n/**\n * @typedef {import('../components/Types.vue').Chart.ChartType} ChartType\n * @typedef {import('../components/Types.vue').Chart.Config} ChartConfiguration\n * @typedef {import('../components/Types.vue').Chart.ConfigOptions} ChartConfigOptions\n * @typedef {import('../components/Types.vue').Chart.ConfigPlugins} ChartConfigPlugins\n * @typedef {import('../components/Types.vue').Chart.ConfigData} ChartConfigData\n * @typedef {import('../components/Types.vue').Chart.Dataset} ChartDataset\n * @typedef {import('../components/Types.vue').Chart.Color} Color\n * @typedef {import('../components/Types.vue').Chart.LegendOptions} LegendOptions\n * @typedef {import('../components/Types.vue').Chart.Plugin} Plugin\n * @typedef {import('../components/Types.vue').Chart.ComponentProps} BsChartProps\n */\n\nconst TICK_SIZE = 16\nconst TICK_SIZE_LG = 20\n\n/**\n *\n * @param {ChartType} type\n * @param {BsChartProps} props\n * @returns {Object}\n * @property {Ref<null>} canvasRef - Place this ref on the canvas element.\n * @property {Ref<null>} legendListRef - Place this ref on the ul element.\n *\n */\nexport function useChart(type, props) {\n const canvasRef = ref(null)\n const isDesktop = ref(false)\n const legendListRef = ref(null)\n const BREAKPOINT_QUERY = '(min-width: 1166px)'\n const MOBILE_TICK_SIZES = { tickSize: TICK_SIZE }\n const DESKTOP_TICK_SIZES = { tickSize: TICK_SIZE_LG }\n let chart\n let chartConfig\n\n function createChartConfig(type, props) {\n let chartSpecificMethod\n switch (type) {\n case 'bar':\n chartSpecificMethod = 'setBarChartConfigs'\n break;\n case 'line':\n chartSpecificMethod = 'setLineChartConfigs'\n break;\n // TODO:\n // case 'pie':\n // case 'donut':\n default:\n throw new Error(`Unsupported chart type: ${type}`)\n }\n\n return new BsChartConfigBuilder()\n .setCommonConfigs(props)\n .setCustomOptions(props)\n [chartSpecificMethod](props)\n .setPlugins([getHtmlLegendPlugin(legendListRef), Filler])\n .build()\n }\n\n function handleLegendItemToggle(e) {\n e.preventDefault()\n e.stopImmediatePropagation()\n const li = e.target.closest('li')\n if (li && chart) {\n const { labelIndex, datasetIndex } = li.dataset\n type === 'pie' || type === 'doughnut' ?\n chart.toggleDataVisibility(labelIndex) :\n chart.setDatasetVisibility(datasetIndex, !chart.isDatasetVisible(datasetIndex))\n chart.update()\n e.preventDefault()\n e.stopImmediatePropagation()\n refocusLegendItem(datasetIndex, labelIndex)\n }\n }\n\n function refocusLegendItem(datasetIndex, labelIndex) {\n // must query again bc list items are destroyed/recreated on update\n const sel = `[data-dataset-index=\"${datasetIndex}\"][data-label-index=\"${labelIndex}\"]`\n const item = legendListRef.value.querySelector(sel)\n item?.focus?.()\n }\n\n function registerChart(...chartElements) {\n if (!chartConfig || !canvasRef.value) return\n Chart.register(...chartElements)\n Chart.defaults.font.family = \"'Roobert', sans-serif\"\n chart = new Chart(canvasRef.value, chartConfig)\n }\n\n const updateConfigOpts = debounce(function (props) {\n if (!chartConfig) return\n chartConfig.updateOptions(props)\n chart.options = chartConfig.options\n chart.update()\n }, 100)\n\n const updateConfigData = debounce(function (props) {\n if (!chartConfig) return\n chartConfig.updateData(props)\n chart.data = chartConfig.data\n chart.update()\n }, 100)\n\n useMatchMedia(\n BREAKPOINT_QUERY,\n (e) => isDesktop.value = e?.matches,\n [ isDesktop ]\n )\n\n onMounted(() => {\n try {\n chartConfig = createChartConfig(type, props)\n legendListRef.value?.addEventListener('click', handleLegendItemToggle)\n } catch(err) {\n console.error('Error creating chart config', err)\n chartConfig = null\n }\n })\n\n useKeydown([' ', 'Enter'], handleLegendItemToggle, legendListRef)\n\n onBeforeUnmount(() => {\n legendListRef.value?.removeEventListener('click', handleLegendItemToggle)\n chart?.destroy()\n })\n\n watch([\n () => props.customOptions,\n () => props.showTooltips,\n () => props.showXGrid,\n () => props.showYGrid,\n () => props.stacked,\n () => props.xLabel,\n () => props.yLabel,\n () => props.yMin,\n () => props.yMax\n ], () => updateConfigOpts(props))\n\n watch(\n isDesktop,\n (isDesktopMatched) => updateConfigOpts(_merge(\n {},\n props,\n isDesktopMatched ? DESKTOP_TICK_SIZES : MOBILE_TICK_SIZES\n ))\n )\n\n watch(\n [\n () => props.data,\n () => props.dataIdxLabels,\n ],\n () => updateConfigData(props),\n { deep: true }\n )\n\n return {\n canvasRef,\n legendListRef,\n registerChart,\n }\n}\n\n/**\n * @param {HTMLUListElement} legendList\n * @returns {Plugin}\n */\nconst getHtmlLegendPlugin = (legendListRef) => ({\n id: 'htmlLegend',\n afterUpdate(chart) {\n // Remove old legend items\n legendListRef.value.innerHTML = ''\n legendListRef.value.style.setProperty('--cjs-legend-padding-inline', `${chart.scales.x.left}px`)\n\n // Reuse the built-in legendItems generator\n const legendItems = chart.options.plugins.legend.labels.generateLabels(chart);\n\n legendItems.forEach(it => {\n const li = document.createElement('li');\n li.setAttribute('tabindex', '0')\n li.dataset.datasetIndex = it.datasetIndex\n li.dataset.labelIndex = it.index\n\n // Color box\n const boxSpan = document.createElement('span');\n boxSpan.style.setProperty('--legend-item-box-fill', it.fillStyle)\n boxSpan.style.setProperty('--legend-item-box-stroke', it.strokeStyle)\n\n // Text\n const text = document.createTextNode(it.text);\n const textContainer = document.createElement('p');\n textContainer.style.setProperty('--legend-item-text-color', 'var(--bs-ink-base)')\n textContainer.style.setProperty('--legend-item-text-decoration', it.hidden ? 'line-through' : 'none')\n textContainer.appendChild(text);\n\n li.appendChild(boxSpan);\n li.appendChild(textContainer);\n legendListRef.value.appendChild(li);\n });\n }\n});\n\n\n/**\n * @param {number} i\n * @returns {Color}\n *\n * @description per last design discussion, we do not want to allow custom colors.\n * That was a while back though - if changes, we can add a prop to allow custom colors and handle here.\n */\nfunction getBackgroundColor(i, initialDivider = 1) {\n const DEFAULT_COLORS = [\n [0, 134, 234], // 0086ea\n [227, 28, 121], // e31c79\n [130, 18, 196], // 8212c4\n [153, 207, 247], // 99cfff\n [243, 196, 168], // f3c4a8\n [238, 40, 42], // ee282a\n [22, 47, 180], // 162fb4\n [197, 204, 235], // c5cceb\n [28, 0, 135], // 1c0087\n [251, 85, 14], // fb550e\n [203, 192, 218], // cbc0da\n [29, 30, 72], // 1d1e48\n [248, 169, 170], // f8a9aa\n [164, 153, 207], // a499cf\n [99, 66, 145], // 634291\n [224, 197, 239], // e0c5ef\n [228, 94, 155] , // e45e9b\n [83, 101, 196], // 5365c4\n [246, 203, 224], // f6cbe0\n [161, 84, 208], // a154d0\n [241, 83, 85], // f15355\n [10, 11, 25], // 0a0b19\n [201, 202, 217], // c9cad9\n [85, 87, 117], // 555775\n ]\n\n const color = DEFAULT_COLORS[i % DEFAULT_COLORS.length]\n const divider = Math.floor(i / DEFAULT_COLORS.length) + initialDivider\n return `rgba(${color.toString()}, ${1 / divider})`\n}\n\n/**\n * @param {number} i\n * @returns {Color}\n */\nfunction getBorderColor(i) {\n // So far this is same as bg color across chart type designs. Subject to change.\n return getBackgroundColor(i)\n}\n\nfunction getCommonOptionsPermissive(chartProps) {\n return {\n maintainAspectRatio: false,\n plugins: {\n tooltip: {\n enabled: chartProps.tooltipsEnabled\n }\n },\n }\n}\n\nfunction getCommonOptionsStrict() {\n return {\n plugins: {\n legend: {\n display: false, // we use a custom, non-canvas legend\n },\n },\n responsive: true,\n }\n}\n\n/**\n *\n * @param {Object} propsPlus\n * @param {boolean} propsPlus.showXGrid\n * @param {boolean} propsPlus.showYGrid\n * @param {boolean} propsPlus.stacked\n * @param {string} propsPlus.xAxisType\n * @param {string} propsPlus.xLabel\n * @param {string} propsPlus.yLabel\n * @param {number} propsPlus.yMax\n * @param {number} propsPlus.yMin\n * @param {ChartConfigOptions} propsPlus.customOptions\n * @param {number} propsPlus.tickSize\n *\n * @returns\n */\nfunction getCartesianScaleOptions(propsPlus) {\n const {\n dataIdxLabels,\n showXGrid,\n showYGrid,\n stacked,\n xAxisType,\n xLabel,\n yLabel,\n yMax,\n yMin,\n customOptions,\n tickSize\n } = propsPlus\n const scaleOptions = {\n x: {\n grid: {\n display: showXGrid\n },\n offset: true,\n stacked,\n ticks: {\n font: {\n size: tickSize || TICK_SIZE\n }\n },\n title: {\n display: !!xLabel,\n text: xLabel,\n },\n type: xAxisType || 'category',\n },\n y: {\n beginAtZero: true,\n //grace: \"10%\", //TODO: maybe apply this, or take as prop\n grid: {\n display: showYGrid\n },\n stacked,\n suggestedMax: yMax,\n suggestedMin: yMin,\n ticks: {\n font: {\n size: tickSize || TICK_SIZE\n }\n },\n title: {\n display: !!yLabel,\n text: yLabel,\n },\n }\n }\n\n if (xAxisType === 'time' || customOptions?.scales?.x?.type === 'time') {\n // there's a third option, 'data', but it likely won't be used\n scaleOptions.x.ticks.source = dataIdxLabels?.length ? 'labels' : 'auto'\n scaleOptions.x.time = {\n tooltipFormat: 'dd MMM yyyy : h:mm bbb'\n }\n }\n\n return scaleOptions\n}\n\n\nclass BsChartConfig {\n/**\n * @param {Object} options\n * @param {ChartType} options.type\n * @param {ChartConfigData} options.data - datasets and labels.\n * @param {ChartConfigOptions} options.options\n * @param {ChartConfigPlugins} options.plugins\n */\n constructor({\n type,\n data,\n options,\n plugins\n }) {\n this.type = type\n this.data = {\n ...data,\n datasets: this.fmtDatasets(data.datasets)\n }\n this.options = options\n this.plugins = plugins\n }\n\n updateOptions(props) {\n const { showTooltips } = props\n this.options.plugins.tooltip.enabled = showTooltips\n }\n\n updateData(props) {\n this.data.datasets = this.fmtDatasets(props.data)\n this.data.labels = props.dataIdxLabels\n }\n\n fmtDatasets(datasets) {\n return datasets\n }\n}\n\nclass BsChartBarConfig extends BsChartConfig {\n constructor({ data, options, plugins }) {\n super({ type: 'bar', data, options, plugins })\n }\n\n fmtDatasets(datasets) {\n return datasets.map((dataset, i) => ({\n ...dataset,\n backgroundColor: getBackgroundColor(i),\n categoryPercentage: datasets.length > 1 ? .5 : .33\n }))\n }\n\n updateOptions(props) {\n super.updateOptions(props)\n const scaleOpts = getCartesianScaleOptions(props)\n const tickFontOpts = { x: { ticks: { font: scaleOpts.x.ticks.font }}, y: { ticks: { font: scaleOpts.y.ticks.font }} }\n const updatedOpts = _merge(\n {},\n this.options,\n { scales: scaleOpts },\n props.customOptions,\n getCommonOptionsStrict(),\n { scales: tickFontOpts }\n )\n this.options = updatedOpts\n }\n}\n\nclass BsChartLineConfig extends BsChartConfig {\n constructor({ data, options, plugins }) {\n super({ type: 'line', data, options, plugins })\n }\n\n fmtDatasets(datasets) {\n return datasets.map((dataset, i) => ({\n ...dataset,\n backgroundColor: getBackgroundColor(i, 2),\n borderColor: getBorderColor(i),\n borderWidth: 4\n }))\n }\n\n updateOptions(props) {\n super.updateOptions(props)\n const scaleOpts = getCartesianScaleOptions(props)\n const tickFontOpts = { x: { ticks: { font: scaleOpts.x.ticks.font }}, y: { ticks: { font: scaleOpts.y.ticks.font }} }\n const updatedOpts = _merge(\n {},\n this.options,\n { scales: scaleOpts },\n props.customOptions,\n getCommonOptionsStrict(),\n { scales: tickFontOpts }\n )\n this.options = updatedOpts\n }\n}\n\nexport class BsChartConfigBuilder {\n constructor() {\n return this\n }\n\n /**\n * @param {BsChartProps} chartProps\n * @returns {BsChartConfigBuilder}\n */\n setBarChartConfigs(chartProps) {\n this.type = 'bar'\n this.setCartesianAxesOpts(chartProps)\n return this\n }\n\n /**\n * @param {BsChartProps} chartProps\n * @returns {BsChartConfigBuilder}\n */\n setCommonConfigs(chartProps) {\n const { data } = chartProps\n this.commonOptionsBasic = getCommonOptionsPermissive(chartProps)\n this.commonOptionsStrict = getCommonOptionsStrict()\n this.datasets = data\n return this\n }\n\n setCustomOptions(chartProps) {\n this.customOptions = chartProps.customOptions\n return this\n }\n\n /**\n * @param {BsChartProps} chartProps\n * @returns {BsChartConfigBuilder}\n */\n setLineChartConfigs(chartProps) {\n this.type = 'line'\n this.setCartesianAxesOpts(chartProps)\n return this\n }\n\n /**\n * @param {Plugin[]} plugins\n * @returns {BsChartConfigBuilder}\n */\n setPlugins(plugins = []) {\n this.plugins = plugins\n return this\n }\n\n /**\n * @param {BsChartProps} chartProps\n * @returns {BsChartConfigBuilder}\n */\n setCartesianAxesOpts(chartProps) {\n const { dataIdxLabels } = chartProps\n this.dataIdxLabels = dataIdxLabels\n this.scalesOptions = getCartesianScaleOptions(chartProps)\n\n // always enforced\n this.commonOptionsStrict.scales = {\n x: { ticks: { font: { size: TICK_SIZE } } },\n y: { ticks: { font: { size: TICK_SIZE } } }\n }\n return this\n }\n\n build() {\n const optionsArg = {\n data: {\n datasets: this.datasets,\n labels: this.dataIdxLabels // TODO: || this.pieSliceLabels (or something)\n },\n options: _merge(\n {},\n this.commonOptionsBasic,\n {\n scales: this.scalesOptions\n },\n this.customOptions,\n this.commonOptionsStrict, // enforce a limited, opinionated base set for design system consistency\n ),\n plugins: this.plugins,\n type: this.type\n }\n\n switch (this.type) {\n case 'bar':\n return new BsChartBarConfig(optionsArg)\n case 'line':\n return new BsChartLineConfig(optionsArg)\n default:\n throw new Error(`Unsupported chart type: ${this.type}`)\n }\n }\n}\n","<script setup>\nimport { computed, onMounted } from 'vue'\nimport BsChartTable from '../chart-table/BsChartTable.vue'\nimport {\n BarController,\n BarElement,\n CategoryScale,\n Legend,\n LinearScale,\n TimeScale,\n Tooltip\n} from 'chart.js'\nimport { useChart } from '../../composables/chart.js'\n\n// Props\n/** Provide a title for the accessible text table representation of this chart. */\nconst props = defineProps({\n chartTitle: {\n type: String,\n default: '',\n },\n customOptions: {\n type: Object,\n default: () => ({}),\n },\n /** Array of datasets. */\n data: {\n type: Array,\n required: true,\n },\n /** Array of labels for each point along the X-Axis. */\n dataIdxLabels: {\n type: Array,\n default: () => [],\n },\n /** Pass `true` to show legend. */\n showLegend: {\n type: Boolean,\n default: true,\n },\n /** Pass `true` to show tooltips on hover. */\n showTooltips: {\n type: Boolean,\n default: true,\n },\n /** Pass `true` to show vertical gridlines. */\n showXGrid: {\n type: Boolean,\n default: false,\n },\n /** Pass `true` to show horizontal gridlines. */\n showYGrid: {\n type: Boolean,\n default: false,\n },\n /** Pass `true` to stack each dataset's data at a given index into a single column. */\n stacked: {\n type: Boolean,\n default: false,\n },\n xAxisType: {\n type: String,\n default: 'category',\n validator: (value) => ['category', 'linear'].includes(value),\n },\n /** Label for the X-Axis. */\n xLabel: {\n type: String,\n default: '',\n },\n /** Label for the Y-Axis. */\n yLabel: {\n type: String,\n default: '',\n },\n yMax: {\n type: Number,\n default: 0,\n },\n yMin: {\n type: Number,\n default: 0,\n },\n})\n\nconst { canvasRef, legendListRef, registerChart } = useChart('bar', props)\n\nconst title = computed(() => props.chartTitle || `${props.yLabel} / ${props.xLabel}`)\n\n// Lifecycle Hooks - Init Chart; Watchers\nonMounted(() => registerChart(\n BarController,\n BarElement,\n CategoryScale,\n LinearScale,\n Legend,\n TimeScale,\n Tooltip\n))\n</script>\n\n<template>\n<div class=\"bs-chart bs-chart-bar\" data-component=\"bs-chart-bar\">\n <figure>\n <div>\n <canvas\n :aria-label=\"title\"\n ref=\"canvasRef\"\n role=\"img\"\n ></canvas>\n </div>\n <div>\n <BsChartTable\n chart-type=\"bar\"\n :data=\"data\"\n :data-idx-labels=\"dataIdxLabels\"\n :table-title=\"title\"\n :x-axis-type=\"xAxisType\"\n :x-label=\"xLabel\"\n :y-label=\"yLabel\"\n ></BsChartTable>\n <figcaption\n :data-hidden=\"!showLegend\"\n >\n <ul ref=\"legendListRef\"></ul>\n </figcaption>\n </div>\n </figure>\n</div>\n</template>\n","<script setup>\nimport { computed, onMounted, ref, watch } from 'vue'\nimport { useGenIdAttrs } from '@composables/genId.js'\nimport { filterAttrs, boolAttrs } from '@utils/filterAttrs.js'\nimport BsLabel from '../label/BsLabel.vue'\n\nconst props = defineProps({\n /** Sets the label. */\n /** @ex Task Completed */\n label: {\n type: String,\n },\n /** Sets the checked state. */\n checked: {\n type: Boolean,\n default: false\n },\n /** DEPRECATED - use indeterminate. Sets the indeterminate state; i.e. partially checked. */\n checkedPartially: {\n type: Boolean,\n default: false\n },\n /** Sets the disabled state on the input. */\n disabled: {\n type: Boolean,\n default: false\n },\n /** Applies error styles to the input. */\n error: {\n type: Boolean,\n default: false\n },\n /** Sets the indeterminate state; i.e. partially checked. */\n indeterminate: {\n type: Boolean,\n default: false\n },\n /** Pass id for the input element. Will also be applied to label attribute. */\n inputId: {\n type: String,\n default: ''\n },\n /** List additional attributes by name (comma-separated) to pass through to `<input>`. */\n passAttrs: {\n type: String,\n default: ''\n },\n /** Sets the required state on the input. */\n required: {\n type: Boolean,\n default: false\n },\n /** Sets the size of the input. */\n size: {\n type: String,\n validator: (value) => value === 'sm',\n },\n value: {\n type: [ String, Number, Object ]\n },\n /** Sets the `checked` state - `v-model` directive will use this; do not set explicitly. */\n modelValue: {\n type: [ Boolean, Array ]\n },\n})\nconst emit = defineEmits(['update:modelValue'])\n\n// allocate attributes to root and/or child elements\ndefineOptions({ inheritAttrs: false })\nconst [ inputIdGen ] = useGenIdAttrs()\n\n// Refs & Computed Properties\nconst attrFilter = computed(() => boolAttrs.concat(props.passAttrs.split(',')))\nconst inputEl = ref(null)\nconst inputIdAttr = computed(() => props.inputId || inputIdGen.value)\nconst isChecked = computed(() => props.checked || isModelValueChecked.value)\nconst isIndeterminate = computed(() => props.indeterminate || props.checkedPartially)\nconst isVModelArray = computed(() => Array.isArray(props.modelValue) && props.value)\nconst isModelValueChecked = computed(() => (\n ( isVModelArray.value && props.modelValue.includes(props.value) ) ||\n ( typeof props.modelValue === 'boolean' && props.modelValue )\n))\n\nfunction setIndeterminate() {\n if (inputEl.value) inputEl.value.indeterminate = isIndeterminate.value && !isChecked.value\n}\n\nfunction doVModelSimple(checked) {\n emit('update:modelValue', checked)\n}\n\nfunction doVModelComplex(checked) {\n const newValue = [ ...props.modelValue ]\n checked ? newValue.push(props.value) : newValue.splice(newValue.indexOf(props.value), 1)\n emit('update:modelValue', newValue)\n}\n\nfunction onChange(e) {\n const { checked } = e.target\n isVModelArray.value ? doVModelComplex(checked) : doVModelSimple(checked)\n}\n\nwatch(isChecked, setIndeterminate)\nwatch(isIndeterminate, setIndeterminate)\n\nonMounted(setIndeterminate)\n\n</script>\n<template>\n <div class=\"bs-boolean\"\n data-component=\"bs-checkbox\"\n :data-disabled=\"disabled\"\n :data-error=\"error\"\n :data-size=\"size\"\n v-bind=\"filterAttrs($attrs, attrFilter).remaining\"\n >\n <input\n ref=\"inputEl\"\n :checked=\"isChecked\"\n :data-error=\"error\"\n :disabled=\"disabled\"\n :id=\"$attrs.id || inputIdAttr\"\n :required=\"required\"\n :value=\"value || 'on'\"\n type=\"checkbox\"\n @change=\"onChange\"\n v-bind=\"filterAttrs($attrs, attrFilter).filtered\"\n />\n <BsLabel v-if=\"label || $slots.label\"\n :for=\"$attrs.id || inputIdAttr\"\n :disabled=\"disabled\"\n :required=\"required\"\n >\n <slot name=\"label\">\n {{ label }}\n </slot>\n </BsLabel>\n </div>\n</template>\n","<!-- Internal component for setting a dropdown's container -->\n<script setup>\nimport { ref } from 'vue'\n\nconst props = defineProps({\n breakout: {\n type: Boolean,\n default: false\n },\n breakoutMounted: {\n type: Boolean,\n default: false\n },\n breakoutStub: {\n type: Object,\n default: null\n },\n containerId: {\n type: String,\n default: undefined\n }\n})\n\nconst internalContainerRef = ref(null)\n\ndefineExpose({ internalContainerRef })\n</script>\n\n<template>\n<!-- Teleport when breaking out -->\n<template v-if=\"breakout && breakoutMounted\">\n <Teleport :to=\"breakoutStub\">\n <slot />\n </Teleport>\n</template>\n\n<template v-if=\"!breakout\">\n <!-- External container -->\n <template v-if=\"containerId\">\n <slot />\n </template>\n\n <!-- Internal container -->\n <div\n v-else\n ref=\"internalContainerRef\"\n style=\"position: relative\"\n >\n <slot />\n </div>\n</template>\n</template>\n","<!--\nEnhances the built-in Vue Transition with the option to render the content with\n`v-if` (default) or `v-show` when `preloaded` is `true`.\n-->\n<script setup>\ndefineProps({\n // Transition Name\n name: {\n type: String,\n required: true\n },\n // When true, the content is displayed with v-show\n // When false, the content is displayed with v-if\n preloaded: {\n type: Boolean,\n default: false\n },\n // When true, the content is shown\n shown: {\n type: Boolean,\n default: true\n },\n})\n\n// Just emit all the standard Transition events\nconst emit = defineEmits([\n 'before-enter',\n 'enter',\n 'after-enter',\n 'enter-cancelled',\n 'before-leave',\n 'leave',\n 'after-leave',\n 'leave-cancelled',\n])\n</script>\n\n<template>\n <template v-if=\"preloaded\">\n <Transition\n v-show=\"shown\"\n :name=\"name\"\n @before-enter=\"emit('before-enter')\"\n @enter=\"emit('enter')\"\n @after-enter=\"emit('after-enter')\"\n @enter-cancelled=\"emit('enter-cancelled')\"\n @before-leave=\"emit('before-leave')\"\n @leave=\"emit('leave')\"\n @after-leave=\"emit('after-leave')\"\n @leave-cancelled=\"emit('leave-cancelled')\"\n >\n <slot />\n </Transition>\n </template>\n\n <template v-else>\n <Transition\n :name=\"name\"\n @before-enter=\"emit('before-enter')\"\n @enter=\"emit('enter')\"\n @after-enter=\"emit('after-enter')\"\n @enter-cancelled=\"emit('enter-cancelled')\"\n @before-leave=\"emit('before-leave')\"\n @leave=\"emit('leave')\"\n @after-leave=\"emit('after-leave')\"\n @leave-cancelled=\"emit('leave-cancelled')\"\n >\n <slot v-if=\"shown\" />\n </Transition>\n </template>\n</template>\n","import { onMounted, onUnmounted, ref, useId } from 'vue'\n\nconst useBreakout = (createBreakout, id = undefined, position = 'relative') => {\n const breakoutId = ref(null)\n const breakoutStub = ref(null)\n const breakoutMounted = ref(false)\n let isPreExisting = false\n\n onMounted(() => {\n if (createBreakout) {\n breakoutId.value = id || useId()\n // Don't recreate the breakout if it already exists\n if (document.getElementById(breakoutId.value)) {\n breakoutStub.value = document.getElementById(breakoutId.value)\n isPreExisting = true\n } else {\n breakoutStub.value = document.createElement('div')\n breakoutStub.value.id = breakoutId.value\n breakoutStub.value.style.position = position\n document.body.insertAdjacentElement('afterbegin', breakoutStub.value)\n }\n breakoutMounted.value = true\n }\n })\n\n onUnmounted(() => {\n // Don't remove the breakout if it existed before\n if (createBreakout && !isPreExisting) {\n document.getElementById(breakoutId.value)?.remove()\n }\n })\n\n return { breakoutId, breakoutStub, breakoutMounted }\n}\nexport default useBreakout\n","<script setup>\nimport { ref, computed, provide } from 'vue'\nimport { BsIconClose } from '@wwtdev/bsds-icons-vue3'\nimport BsDropdownContainer from './BsDropdownContainer.vue'\nimport BsEnhancedTransition from '../transition/BsEnhancedTransition.vue'\nimport useBreakout from '../../composables/breakout'\nimport useClickAway from '../../composables/clickAway'\nimport useKeydown from '../../composables/keydown'\n\ndefineOptions({ inheritAttrs: false })\n\n// PROPS\nconst props = defineProps({\n anchorId: {\n type: String,\n required: true\n },\n breakout: {\n type: Boolean,\n default: false\n },\n containerId: {\n type: String,\n default: undefined\n },\n helperDescription: {\n type: String,\n default: undefined\n },\n helperText: {\n type: String,\n default: undefined\n },\n position: {\n type: String,\n default: undefined,\n validator: (value) => {\n return ['', 'top', 'center', 'right'].includes(value)\n },\n },\n preloaded: {\n type: Boolean,\n default: false\n },\n shown: {\n type: Boolean,\n default: true\n },\n useMobileStyle: {\n type: Boolean,\n default: true\n },\n width: {\n type: String,\n default: undefined,\n validator: (value) => {\n return ['', 'sm', 'md', 'lg', 'content', 'anchor'].includes(value)\n },\n }\n})\n\n// EMITS\nconst emit = defineEmits([\n 'close',\n 'enter',\n 'after-enter',\n 'after-leave'\n])\n\n// REFS\nconst dropdownContainerRef = ref(null)\nconst dropdownRef = ref(null)\n\n// STATE\n// Provide these transition states to BsDropdownOptionList.vue for various\n// delayed effects such as focus management.\nconst dropdownEnter = ref(false)\nconst dropdownAfterEnter = ref(false)\nconst anchorEl = ref(null)\n\n// COMPUTED\nconst containerEl = computed(() => {\n if (props.breakout) {\n return breakoutStub.value\n } else if (props.containerId) {\n return document.getElementById(props.containerId)\n } else {\n return dropdownContainerRef.value.internalContainerRef\n }\n})\n\n// Don't set data-width in the special 'anchor' width case\nconst widthActual = computed(() => {\n return props.width === 'anchor' ? undefined : props.width\n})\n\n// COMPOSABLES\nuseClickAway([dropdownRef, anchorEl], () => {\n if (dropdownAfterEnter.value) {\n emit('close')\n }\n})\n\nuseKeydown(['Escape'], () => {\n if (dropdownAfterEnter.value) {\n emit('close')\n }\n})\n\nconst { breakoutStub, breakoutMounted } = useBreakout(props.breakout, props.containerId)\n\n// PROVIDE\n// Currently used by BsDropdownOptionList.vue\nprovide('dropdownEnter', dropdownEnter)\nprovide('dropdownAfterEnter', dropdownAfterEnter)\nprovide('dropdownShown', computed(() => props.shown))\n\n// METHODS\nconst setDropdownProperty = (property, value) => {\n dropdownRef.value.style.setProperty(property, value)\n}\n\n/**\n * Dynamically set position based on anchor element. Doing this rather than\n * relying on CSS since the dropdown's container could live anywhere on the\n * DOM (in the case of teleporting when breakout=true).\n *\n * Use custom properties rather than explicit properties to allow for\n * us to ignore them on mobile.\n */\nfunction setPosition() {\n const containerRect = containerEl.value.getBoundingClientRect()\n const anchorRect = anchorEl.value.getBoundingClientRect()\n const dropdownRect = dropdownRef.value.getBoundingClientRect()\n\n positionTopBottom(containerRect, anchorRect)\n positionLeftRight(containerRect, anchorRect, dropdownRect)\n}\n\nfunction positionTopBottom(containerRect, anchorRect) {\n // Calculate top/bottom position relative to target container\n if (props.position === 'top') {\n const bottom = containerRect.bottom - anchorRect.bottom\n setDropdownProperty('--dropdown-wscreen-top', 'auto')\n setDropdownProperty('--dropdown-wscreen-bottom', `${bottom + anchorRect.height + 8}px`)\n } else {\n const top = anchorRect.top - containerRect.top\n setDropdownProperty('--dropdown-wscreen-top', `${top + anchorRect.height + 8}px`)\n setDropdownProperty('--dropdown-wscreen-bottom', 'auto')\n }\n}\n\nfunction positionLeftRight(containerRect, anchorRect, dropdownRect) {\n // Calculate left position relative to target container\n const left = anchorRect.left - containerRect.left\n if (props.position === 'center') {\n const offset = (anchorRect.width - dropdownRect.width) / 2\n setDropdownProperty('--dropdown-wscreen-left', `${left + offset}px`)\n setDropdownProperty('--dropdown-wscreen-right', 'auto')\n } else if (props.position === 'right') {\n const right = containerRect.right - anchorRect.right\n setDropdownProperty('--dropdown-wscreen-left', `auto`)\n setDropdownProperty('--dropdown-wscreen-right', `${right}px`)\n } else {\n setDropdownProperty('--dropdown-wscreen-left', `${left}px`)\n setDropdownProperty('--dropdown-wscreen-right', 'auto')\n }\n}\n\n/**\n * Special case when width is \"anchor\". Dynamically set width based on anchor\n * element. Doing this rather than relying on CSS since the dropdown's\n * container could live anywhere on the DOM (in the case of teleporting when\n * breakout=true).\n */\nfunction setWidth() {\n if (props.width === 'anchor') {\n const anchorRect = anchorEl.value.getBoundingClientRect()\n setDropdownProperty('--dropdown-wscreen-width', `${anchorRect.width}px`)\n } else {\n setDropdownProperty('--dropdown-wscreen-width', '')\n }\n}\n\nfunction handleEnter() {\n dropdownEnter.value = true\n // Grab the anchor element every time the dropdown enters just in case it\n // has moved (e.g. button appearing/disappearing based on loading state)\n anchorEl.value = document.getElementById(props.anchorId)\n setPosition()\n setWidth()\n emit('enter')\n}\n\nfunction handleAfterEnter() {\n dropdownAfterEnter.value = true\n emit('after-enter')\n}\n\nfunction handleAfterLeave() {\n dropdownEnter.value = false\n dropdownAfterEnter.value = false\n emit('after-leave')\n}\n</script>\n\n<template>\n<div v-if=\"useMobileStyle && shown\" class=\"bs-dropdown-backdrop\" />\n\n<BsDropdownContainer\n ref=\"dropdownContainerRef\"\n :breakout=\"breakout\"\n :breakoutMounted=\"breakoutMounted\"\n :breakoutStub=\"breakoutStub\"\n :containerId=\"containerId\"\n>\n <BsEnhancedTransition\n name=\"bs-dropdown\"\n :preloaded=\"preloaded\"\n :shown=\"shown\"\n @after-enter=\"handleAfterEnter\"\n @enter=\"handleEnter\"\n @after-leave=\"handleAfterLeave\"\n >\n <div\n ref=\"dropdownRef\"\n class=\"bs-dropdown\"\n :data-width=\"widthActual\"\n :data-shown=\"shown\"\n :data-no-mobile=\"!useMobileStyle\"\n v-bind=\"$attrs\"\n >\n <header v-if=\"helperText\">\n <div>\n <h3>{{ helperText }}</h3>\n <p v-if=\"helperDescription\">{{ helperDescription }}</p>\n </div>\n <button type=\"button\" title=\"close\" @click=\"() => emit('close')\">\n <BsIconClose />\n </button>\n </header>\n\n <slot />\n </div>\n </BsEnhancedTransition>\n</BsDropdownContainer>\n</template>\n","<!-- Handles backwards compatibility with deprecated props -->\n<!-- Replace with BsDropdownNew when retiring these props -->\n<script setup>\nimport { computed } from 'vue'\nimport useTransitionHelper from '../../composables/transitionHelper'\nimport BsDropdownNew from './BsDropdownNew.vue'\n\n// PROPS\nconst props = defineProps({\n anchorId: {\n type: String,\n default: undefined\n },\n shown: {\n type: Boolean,\n default: true\n },\n breakout: {\n type: Boolean,\n default: false\n },\n containerId: {\n type: String,\n default: undefined\n },\n helperDescription: {\n type: String,\n default: undefined\n },\n helperText: {\n type: String,\n default: undefined\n },\n position: {\n type: String,\n default: undefined,\n validator: (value) => {\n return ['', 'top', 'center', 'right'].includes(value)\n },\n },\n preloaded: {\n type: Boolean,\n default: false\n },\n useMobileStyle: {\n type: Boolean,\n default: true\n },\n /** @Deprecated - 'toggle' deprecated, use 'anchor' instead */\n width: {\n type: String,\n default: undefined,\n validator: (value) => {\n return ['', 'sm', 'md', 'lg', 'content', 'anchor', 'toggle'].includes(value)\n },\n },\n // DEPRECATED DROPDOWN PROPS\n /** @Deprecated - Use position instead */\n center: {\n type: Boolean,\n default: false\n },\n /** @Deprecated - Use 'preloaded' instead. */\n enterControlled: {\n type: Boolean,\n default: false\n },\n /** @Deprecated - Use 'shown' instead. */\n enterTrigger: {\n type: Boolean,\n default: false\n },\n /** @Deprecated - Not used anymore. Handled via 'shown'. */\n leaveTrigger: {\n type: Boolean,\n default: false\n },\n /** @Deprecated - Use position instead */\n right: {\n type: Boolean,\n default: false\n },\n /** @Deprecated - Use anchorId instead */\n toggleId: {\n type: String,\n default: undefined\n },\n /** @Deprecated - Use position instead */\n top: {\n type: Boolean,\n default: false\n }\n})\n\nconst emit = defineEmits([\n 'close',\n 'enter',\n 'after-enter',\n 'after-leave'\n])\n\n// Handles enterControlled/enterTrigger/leaveTrigger backwards compatibility\nconst { transition: shownActual } = useTransitionHelper(props)\n\n// Handles width backwards compatibility\nconst widthActual = computed(() => {\n return props.width === 'toggle' ? 'anchor' : props.width\n})\n\n// Handles top/center/right backwards compatibility\nconst positionActual = computed(() => {\n if (props.top) {\n return 'top'\n }\n if (props.center) {\n return 'center'\n }\n if (props.right) {\n return 'right'\n }\n return props.position\n})\n\n// Handles toggleId backwards compatibility\nconst anchorIdActual = computed(()=> {\n if (props.toggleId) {\n return props.toggleId\n }\n return props.anchorId\n})\n</script>\n\n<template>\n<BsDropdownNew\n :anchor-id=\"anchorIdActual\"\n :breakout=\"breakout\"\n :container-id=\"containerId\"\n :helper-description=\"helperDescription\"\n :helper-text=\"helperText\"\n :position=\"positionActual\"\n :preloaded=\"preloaded\"\n :shown=\"shownActual\"\n :use-mobile-style=\"useMobileStyle\"\n :width=\"widthActual\"\n @close=\"() => emit('close')\"\n @enter=\"() => emit('enter')\"\n @after-enter=\"() => emit('after-enter')\"\n @after-leave=\"() => emit('after-leave')\"\n>\n <slot />\n</BsDropdownNew>\n</template>\n","<script setup>\nimport { computed, ref } from 'vue'\nimport { BsIconCaretDown, BsIconClose } from '@wwtdev/bsds-icons-vue3'\nimport BsInput from '@components/input/BsInput.vue'\nimport BsInputAddon from '@components/input-addon/BsInputAddon.vue'\nimport { useGenIdAttrs } from '@composables/genId.js'\n\nconst props = defineProps({\n containerId: {\n type: String,\n required: true\n },\n disabled: {\n type: Boolean,\n default: false\n },\n error: {\n type: Boolean,\n default: false\n },\n hintId: {\n type: String\n },\n modelValue: {\n type: String,\n default: ''\n },\n open: {\n type: Boolean,\n default: false\n },\n optionsId: {\n type: String\n },\n placeholder: {\n type: String,\n default: ''\n },\n required: {\n type: Boolean,\n default: false\n },\n})\nconst emit = defineEmits([\n 'clear',\n 'input-focus',\n 'input-mousedown',\n 'input-mouseup',\n 'input-shift-tab',\n 'input-tab',\n 'toggled',\n 'update:modelValue',\n])\n\nconst inputRef = ref(null)\nconst [ toggleId ] = useGenIdAttrs(1)\n\nconst btnProperties = computed(() => ({\n icon: props.modelValue ? 'close' : (props.optionsId ? 'caret-down' : ''),\n show: Boolean(props.modelValue || props.optionsId),\n text: props.modelValue ? 'Clear this field' : (props.optionsId ? 'Toggle options dropdown' : ''),\n}))\n\nconst showCloseButton = computed(() => btnProperties.value.icon === 'close')\n\nfunction handleBtnClick() {\n if (showCloseButton.value) {\n emit('clear')\n } else {\n emit('toggled')\n }\n}\n\ndefineOptions({ inheritAttrs: false })\n</script>\n\n<template>\n<BsInputAddon\n aria-live=\"polite\"\n :disabled=\"disabled\"\n :error=\"error\"\n :id=\"containerId\"\n :multifocus=\"false\"\n variant=\"combobox\"\n>\n <BsInput\n ref=\"inputRef\"\n :aria-controls=\"optionsId\"\n :aria-describedby=\"hintId\"\n :aria-expanded=\"optionsId ? open : undefined\"\n :aria-haspopup=\"optionsId ? 'listbox' : undefined\"\n :aria-invalid=\"error\"\n data-part=\"main\"\n :data-error=\"error\"\n :disabled=\"disabled\"\n :model-value=\"modelValue\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :role=\"optionsId ? 'combobox' : undefined\"\n @focus=\"$emit('input-focus')\"\n @input=\"$emit('update:modelValue', $event.target.value)\"\n @keydown.shift.tab=\"$emit('input-shift-tab')\"\n @keydown.tab.exact=\"$emit('input-tab')\"\n @mousedown=\"$emit('input-mousedown')\"\n @mouseup=\"$emit('input-mouseup')\"\n v-bind=\"$attrs\"\n />\n <button v-show=\"btnProperties.show\"\n :aria-controls=\"!showCloseButton && optionsId ? optionsId : undefined\"\n :aria-expanded=\"!showCloseButton && optionsId ? open : undefined\"\n :data-open=\"showCloseButton ? undefined : open\"\n data-part=\"right\"\n :disabled=\"disabled\"\n :id=\"toggleId\"\n style=\"cursor: pointer;\"\n type=\"button\"\n @click=\"handleBtnClick\"\n >\n <span class=\"visually-hidden\">\n {{ btnProperties.text }}\n </span>\n <BsIconClose\n v-if=\"showCloseButton\"\n role=\"presentation\"\n size=\"md\"\n />\n <BsIconCaretDown\n v-else\n role=\"presentation\"\n size=\"md\"\n />\n </button>\n</BsInputAddon>\n</template>\n","<script setup>\nimport { computed } from 'vue'\nimport BsBadge from '../badge/BsBadge.vue'\nimport { BsIconCaretDown } from '@wwtdev/bsds-icons-vue3'\n\nconst props = defineProps({\n badgeCount: {\n type: Number,\n default: 0\n },\n disabled: {\n type: Boolean,\n default: false\n },\n label: {\n type: String,\n default: 'Filter'\n },\n open: {\n type: Boolean,\n default: false\n },\n optionsId: {\n type: String,\n required: true\n },\n size: {\n type: String,\n validator: val => ['', 'sm', 'xs'].includes(val)\n }\n})\n\nconst showBadge = computed(() => props.badgeCount > 0)\n</script>\n\n<template>\n <button class=\"bs-filter-button\"\n :aria-controls=\"optionsId\"\n :aria-expanded=\"open\"\n aria-haspopup=\"listbox\"\n data-component=\"bs-filter-button\"\n :data-open=\"open\"\n :data-size=\"size\"\n :disabled=\"disabled\"\n type=\"button\"\n >\n <BsBadge v-if=\"showBadge\"\n color=\"blue\"\n :count=\"badgeCount\"\n label=\"active filter\"\n position=\"left\"\n variant=\"notext\"\n />\n <slot name=\"label\">\n {{ label }}\n </slot>\n <BsIconCaretDown />\n </button>\n</template>\n","/**\n * @param {string} listId\n * @param {unknown} optionVal\n * @param {string} valueIdKey\n * @returns {string} id attribute for the option element\n */\nexport const optionIdFromVal = (listId, optionVal, valueIdKey = 'id') => {\n const suffix =\n typeof optionVal == 'object'\n ? optionVal?.[valueIdKey]?.toString().replace(/\\s/g, '-')\n : optionVal?.toString().replace(/\\s/g, '-')\n return `${listId}-option-${suffix}`\n}\n","<script setup>\nimport { inject, ref, computed, onMounted } from 'vue'\nimport { optionIdFromVal } from '../../utils/dropdown.js'\n\n// PROPS\nconst props = defineProps({\n valueIdKey: {\n type: [String, Number],\n default: 'id',\n },\n value: {\n type: [String, Number, Object],\n required: true,\n },\n variant: {\n type: String,\n default: undefined,\n },\n})\n\nconst optionRef = ref(null)\n\n// Provided from BsDropdownOptionList\nconst optionsId = inject('optionsId', ref(''))\nconst handleOptionSelect = inject('handleOptionSelect', () => {})\nconst registerOption = inject('registerOptionById', () => {})\n\nconst idKey = computed(() => {\n if (typeof props.value != 'object') return '' // many wrapper components depend on this type check\n return props.valueIdKey\n})\n\n/** Create an ID. */\nconst id = computed(() => optionIdFromVal(optionsId.value, props.value, idKey.value))\n\nfunction handleOptionClick(ev) {\n handleOptionSelect(optionRef.value)\n ev.stopPropagation()\n}\n\nonMounted(() => {\n registerOption({ id: id.value, val: props.value })\n})\n</script>\n\n<template>\n <li\n ref=\"optionRef\"\n data-component=\"bs-dropdown-option\"\n :data-value=\"idKey ? undefined : props.value\"\n :data-value-id-key=\"idKey\"\n :data-value-type=\"typeof props.value\"\n :data-variant=\"variant || undefined\"\n :id=\"id\"\n role=\"option\"\n @click=\"handleOptionClick\"\n >\n <slot></slot>\n </li>\n</template>\n","<script setup>\nimport { onMounted, ref } from 'vue'\n\nconst props = defineProps({\n src: String,\n size: String,\n initials: {\n type: String,\n required: true\n },\n profileName: {\n type: String,\n required: true\n },\n useAltText: {\n type: Boolean,\n default: true\n }\n})\nconst isMounted = ref(false)\nconst showImage = ref(!!props.src)\n\nonMounted(() => isMounted.value = true)\n</script>\n\n<template>\n<div\n class=\"bs-profile-img\"\n data-component=\"bs-profile-img\"\n :data-img-size=\"size\"\n :data-initials=\"initials\"\n :data-no-img=\"!showImage\"\n>\n <img v-if=\"showImage && isMounted\"\n :src=\"src\"\n :alt=\"useAltText ? profileName : ''\"\n @error=\"showImage = false\"\n />\n</div>\n</template>\n","<script setup>\nimport { onBeforeMount, defineAsyncComponent, watch } from 'vue'\nimport BsDropdownOption from '../dropdown-option/BsDropdownOption.vue'\nimport BsProfileImg from '../profile-img/BsProfileImg.vue'\n\n// PROPS\nconst props = defineProps({\n /** For option values that are objects, pass the key to look for on the option's object value. To be used as the Option El's id attribute. */\n valueIdKey: {\n type: String,\n default: 'id'\n },\n /** Array of objects with the following properties (either label or labelHtml\n * is required):\n * @type{{\n * value: string | number | object,\n * label?: string,\n * labelHtml?: string,\n * description?: string,\n * negative?: boolean,\n * icon?: string,\n * profileImg?: {\n * initials: string,\n * src?: string,\n * profileName?: string\n * }\n * checkbox?: {\n * inputId: string,\n * checked: boolean\n * }\n * }}\n */\n options: {\n type: Array,\n required: true\n },\n showNoOptions: {\n type: Boolean,\n default: true\n }\n})\n\n// VARS\nconst iconCache = {}\n\n// LIFECYCLE\nonBeforeMount(() => {\n // Store icon components\n cacheIconComponents()\n})\n\nwatch(() => props.options, () => {\n // Rebuild icon cache when options change in case icons are added or changed\n cacheIconComponents()\n})\n\n// METHODS\nfunction cacheIconComponents() {\n props.options.forEach((option) => {\n const { icon: iconName } = option\n if (iconName && !iconCache[iconName]) {\n iconCache[iconName] = getIcon(iconName)\n }\n })\n}\n\nfunction getVariant(option) {\n let variant = ''\n\n let columns = 1\n columns += option.checkbox ? 1 : 0\n columns += option.icon ? 1 : 0\n columns += option.profileImg ? 1 : 0\n\n if (columns > 1) {\n variant += ` ${columns}-col`\n }\n\n if (option.checkbox) {\n variant += ' checkbox'\n }\n\n if (option.description) {\n variant += ' description'\n }\n\n if (option.negative) {\n variant += ' negative'\n }\n\n return variant\n}\n\n/** Dynamically load icon. Lighter weight version of useDynamicIcon. */\nfunction getIcon(iconName) {\n return defineAsyncComponent(async () => {\n const { [`BsIcon${iconName}`]: importedIcon } = await import('@wwtdev/bsds-icons-vue3')\n return importedIcon\n })\n}\n\nfunction useAltText(profileName, label) {\n return !!profileName && profileName !== label\n}\n</script>\n\n<template>\n<BsDropdownOption\n v-for=\"option in options\"\n :aria-checked=\"option.checkbox ? option.checkbox.checked : undefined\"\n :key=\"option.value\"\n :value-id-key=\"valueIdKey\"\n :value=\"option.value\"\n :variant=\"getVariant(option)\"\n>\n <!-- Checkbox -->\n <span\n v-if=\"option.checkbox\"\n :id=\"option.checkbox.inputId\"\n aria-hidden=\"true\"\n class=\"bs-checkbox\"\n :data-checked=\"option.checkbox.checked\"\n />\n\n <!-- Icon -->\n <span v-if=\"option.icon\">\n <component :is=\"iconCache[option.icon]\" />\n </span>\n\n <!-- Profile Img -->\n <BsProfileImg\n v-if=\"option.profileImg\"\n :src=\"option.profileImg.src\"\n size=\"xs\"\n :initials=\"option.profileImg.initials\"\n :profile-name=\"option.profileImg.profileName\"\n :use-alt-text=\"useAltText(option.profileImg.profileName, option.label)\"\n />\n\n <!-- Label -->\n <span v-if=\"option.labelHtml\" v-html=\"option.labelHtml\" />\n <span v-else>{{ option.label }}</span>\n\n <!-- Description -->\n <span v-if=\"option.description\">{{ option.description }}</span>\n</BsDropdownOption>\n\n<li role=\"option\" data-no-hover v-if=\"showNoOptions && options.length === 0\">\n <slot name=\"no-options\">No options</slot>\n</li>\n</template>\n","<script setup>\nimport { computed } from 'vue'\nimport BsInput from '../input/BsInput.vue'\nimport BsInputAddon from '../input-addon/BsInputAddon.vue'\nimport { BsIconSearch, BsIconClose } from '@wwtdev/bsds-icons-vue3'\nimport { filterAttrs, textlikeAttrs } from '../../utils/filterAttrs.js'\n\nconst props = defineProps({\n /** Sets the disabled state on input, disabled styles on label. */\n disabled: {\n type: Boolean,\n default: false\n },\n hideClear: {\n type: Boolean,\n default: false\n },\n hideSearchIcon: {\n type: Boolean,\n default: false\n },\n inputId: {\n type: String,\n default: undefined\n },\n modelValue: {\n type: String,\n default: ''\n },\n passAttrs: {\n type: String,\n default: ''\n },\n placeholder: {\n type: String,\n default: 'Search Items'\n },\n /** Sets the input value - do not use if using `v-model`. */\n value: {\n type: String,\n default: ''\n },\n variant: {\n type: String,\n // we may be getting at least one more variant so we'll validate against arr\n validator: val => ['filter', ''].includes(val)\n }\n})\nconst emit = defineEmits(['clear','update:modelValue'])\n\n// allocate attributes to root and/or child elements\ndefineOptions({ inheritAttrs: false })\n\nconst attrFilter = computed(() => textlikeAttrs.concat(props.passAttrs.split(',')))\n\nconst showClear = computed(() => (\n !props.disabled &&\n !props.hideClear &&\n props.variant !== 'filter'\n))\n</script>\n\n<template>\n<BsInputAddon\n class=\"bs-input-search\"\n data-component=\"bs-input-search\"\n :data-variant=\"variant\"\n :disabled=\"disabled\"\n v-bind=\"filterAttrs($attrs, attrFilter).remaining\"\n>\n <BsIconSearch v-if=\"!hideSearchIcon\" />\n <BsInput\n data-autowidth\n :disabled=\"disabled\"\n :input-id=\"$attrs.id || inputId\"\n :placeholder=\"placeholder\"\n :value=\"value || modelValue\"\n v-bind=\"filterAttrs($attrs, attrFilter).filtered\"\n @update:modelValue=\"$event => $emit('update:modelValue', $event)\"\n />\n <button\n v-show=\"showClear\"\n title=\"Clear\"\n type=\"button\"\n @click=\"$emit('clear')\"\n >\n <BsIconClose size=\"sm\" />\n </button>\n</BsInputAddon>\n</template>\n","<script setup>\nimport { ref, onMounted, onUnmounted, provide, watch, computed, inject } from 'vue'\nimport useMutationObserver from '../../composables/mutationObserver'\nimport useKeydown from '../../composables/keydown'\nimport { optionIdFromVal } from '@utils/dropdown'\n\n// PROPS\nconst props = defineProps({\n optionsId: {\n type: String,\n required: true\n },\n label: {\n type: String,\n default: \"Select an option\"\n },\n modelValue: {\n type: [ String, Number, Object ],\n default: undefined\n },\n /* Internal use only - no need to document */\n multiselect: {\n type: Boolean,\n default: false\n },\n preventTab: {\n type: Boolean,\n default: true\n },\n /** @Deprecated - Use modelValue (or v-model) instead */\n selectedValue: {\n type: [ String, Number ],\n default: undefined\n },\n})\n\n\n// EMITS\n/**\n * @Deprecated - optselected will go away in favor of update:modelValue\n * (or v-model)\n */\nconst emit = defineEmits([\n 'close',\n 'options-list-shift-tab',\n 'options-list-tab',\n 'optselected',\n 'update:modelValue',\n])\n\n\n// REFS\nconst optionsRef = ref(null)\n\n\n// STATE\nconst activeDescendantId = ref(null)\nconst activeIndex = ref(-1)\nconst selectedIndex = ref(-1)\nconst optionEls = ref(null)\nconst hasOverflow = ref(false)\nlet registeredOptionsById = {}\n\n// State provided from BsDropdown parent\nconst dropdownEnter = inject('dropdownEnter', ref(false))\nconst dropdownAfterEnter = inject('dropdownAfterEnter', ref(false))\nconst dropdownShown = inject('dropdownShown', ref(false))\n\n\n// PROVIDE (to slotted BsDropdownOptions)\nprovide('optionsId', computed(() => props.optionsId))\nprovide('handleOptionSelect', handleOptionSelect)\nprovide('registerOptionById', ({ id, val }) => {\n registeredOptionsById[id] = val\n})\n\n\n// COMPOSABLES\nuseMutationObserver(optionsRef, refreshOptions, { childList: true })\n\nconst selectKeys = [' ', 'Enter', 'NumpadEnter']\nuseKeydown(selectKeys, handleKeyboardSelect, optionsRef)\n\nconst traverseKeys = ['ArrowDown', 'ArrowUp', 'Home', 'End']\nuseKeydown(traverseKeys, handleKeyDown)\n\nconst typeToFocusKeys = [/^[a-zA-Z0-9]{1}$/]\nconst typeToFocusData = {\n keys: '',\n lastTyped: 0\n}\nuseKeydown(typeToFocusKeys, e => typeToFocus(e, typeToFocusData))\n\n// LIFECYCLE\nonMounted(() => {\n refreshOptions()\n handleShownChange(dropdownShown.value)\n})\n\nonUnmounted(() => {\n registeredOptionsById = null \n})\n\n// Needed for fixing a long-standing firefox bug with scrollbars and content-width\n// https://bugzilla.mozilla.org/show_bug.cgi?id=764076\nwatch(\n [ dropdownEnter, () => optionEls.value?.length ],\n ([ entered, optionsLen ]) => {\n if (entered || optionsLen > 0) {\n hasOverflow.value = optionsRef.value.scrollHeight > optionsRef.value.clientHeight\n }\n }\n)\n\nwatch(dropdownAfterEnter, (newVal) => {\n // Scroll into view once the dropdown is fully done with transitions\n if (newVal) {\n scrollOptionsListIntoView()\n scrollCurrentActiveIntoView()\n }\n})\n\nwatch(dropdownShown, (newVal) => handleShownChange(newVal))\n\n\n// COMPUTED\n/**\n * @Deprecated - Remove when `selectedValue` prop is removed\n */\nconst selectedValueActual = computed(() => {\n return props.modelValue || props.selectedValue\n})\n\n\n// METHODS\nfunction refreshOptions() {\n optionEls.value = Array.from(\n optionsRef.value.querySelectorAll('[data-component=\"bs-dropdown-option\"]')\n )\n}\n\nfunction scrollOptionsListIntoView() {\n if (optionsRef.value.getBoundingClientRect().bottom > window.innerHeight) {\n optionsRef.value.scrollIntoView({ block: 'nearest' })\n }\n}\n\nfunction scrollCurrentActiveIntoView() {\n if (activeIndex.value > -1) {\n // Always make sure the container is fully scrolled into view otherwise\n // the browser may not scroll the active item into view\n scrollOptionsListIntoView()\n optionEls.value[activeIndex.value]?.scrollIntoView({ block: 'nearest' })\n }\n}\n\nfunction setCurrentActive() {\n if (activeIndex.value > -1) {\n optionEls.value[activeIndex.value]?.setAttribute('data-active', '')\n activeDescendantId.value = optionEls.value[activeIndex.value]?.id\n scrollCurrentActiveIntoView()\n }\n}\n\nfunction removeCurrentActive() {\n if (activeIndex.value > -1) {\n optionEls.value[activeIndex.value]?.removeAttribute('data-active')\n }\n}\n\nfunction handleOptionsFocus() {\n if (activeIndex.value < 0) {\n activeIndex.value = 0\n activeDescendantId.value = optionEls.value[0]?.id\n }\n setCurrentActive()\n}\n\nfunction handleShownChange(newVal) {\n if (newVal) {\n handleShown()\n } else {\n handleNotShown()\n }\n}\n\nfunction handleShown() {\n // Note that multiselect handles its own selection state\n if (!props.multiselect) {\n // Find selected index\n selectedIndex.value = optionEls.value.findIndex(\n // valueIdKey will only be present if value is an object\n el => el.dataset.valueIdKey \n ? el.id === optionIdFromVal(props.optionsId, selectedValueActual.value, el.dataset.valueIdKey) \n : el.dataset.value === String(selectedValueActual.value)\n )\n\n // Set selected when applicable\n if (!props.multiselect && selectedIndex.value > -1) {\n optionEls.value[selectedIndex.value]?.setAttribute('data-selected', '')\n optionEls.value[selectedIndex.value]?.setAttribute('aria-selected', 'true')\n }\n\n // Set active index\n activeIndex.value = selectedIndex.value\n }\n}\n\nfunction handleNotShown() {\n // Reset selected option\n optionEls.value.forEach((option) => {\n option.removeAttribute('data-selected')\n // aria-selected should always be either true or false - https://w3c.github.io/aria/#aria-selected\n option.setAttribute('aria-selected', 'false')\n })\n // Reset active option\n removeCurrentActive()\n // Reset state\n selectedIndex.value = -1\n activeIndex.value = -1\n activeDescendantId.value = null\n}\n\nfunction handleOptionSelect(option) {\n // If the option has a link, click it\n option.querySelector('a')?.click()\n\n // Retrieve option value\n let value = option.dataset.valueIdKey \n ? registeredOptionsById[option.id] \n : option.dataset.value \n if (option.dataset.valueType == 'number') {\n value = Number(value)\n }\n // Emit events\n activeDescendantId.value = option.id\n removeCurrentActive()\n emit('optselected', value)\n emit('update:modelValue', value)\n emit('close')\n}\n\nfunction handleKeyboardSelect(ev) {\n handleOptionSelect(optionEls.value[activeIndex.value])\n ev.preventDefault()\n}\n\nfunction handleKeyDown(ev) {\n if (dropdownShown.value) {\n switch (ev.key) {\n case 'ArrowDown':\n traverse('down')\n ev.preventDefault()\n break\n case 'ArrowUp':\n traverse('up')\n ev.preventDefault()\n break\n case 'Home':\n traverse('home')\n ev.preventDefault()\n break\n case 'End':\n traverse('end')\n ev.preventDefault()\n break\n }\n }\n}\n\n/** Traverses the option list via keyboard navigation */\nfunction traverse(direction) {\n let newIndex\n switch (direction) {\n case 'up':\n newIndex = (activeIndex.value - 1 < 0) ?\n optionEls.value.length - 1 :\n activeIndex.value - 1\n break\n case 'down':\n newIndex = (activeIndex.value + 1) % optionEls.value.length\n break\n case 'home':\n newIndex = 0\n break\n case 'end':\n newIndex = optionEls.value.length - 1\n break\n }\n updateCurrentActive(newIndex)\n}\n\nfunction typeToFocus(ev, ttfState) {\n if (!dropdownShown.value) return\n\n ttfState.keys = (ev.timeStamp - ttfState.lastTyped > 500) ? ev.key : ttfState.keys + ev.key\n ttfState.lastTyped = ev.timeStamp\n\n const matchIdx = optionEls.value.findIndex((el) => {\n return el.textContent\n .replaceAll(/[^a-zA-Z0-9]/g, '')\n .toLowerCase()\n .startsWith(ttfState.keys)\n })\n\n if (matchIdx > -1) updateCurrentActive(matchIdx, false)\n}\n\nfunction updateCurrentActive(activeIdx, withFocus = true) {\n removeCurrentActive()\n activeIndex.value = activeIdx\n if (document.activeElement !== optionsRef.value && withFocus) {\n // Focusing the options list actually triggers setCurrentActive\n optionsRef.value.focus()\n } else {\n setCurrentActive()\n }\n}\n\n// We're exposing these refs/vars/funcs to parent component(s) (e.g. BsDropdownMultiselect),\n// so we'll want to treat them as part of the public interface\n// for this component in terms of preserving compatibility.\ndefineExpose({\n activeIndex,\n optionEls,\n optionsRef,\n refreshOptions,\n setCurrentActive\n})\n</script>\n\n<template>\n\n<ul\n ref=\"optionsRef\"\n :aria-activedescendant=\"activeDescendantId || undefined\"\n :aria-label=\"label\"\n aria-live=\"polite\"\n class=\"bs-dropdown-options\"\n data-component=\"bs-dropdown-option-list\"\n :data-overflow=\"hasOverflow\"\n :id=\"optionsId\"\n role=\"listbox\"\n :tabindex=\"dropdownShown ? 0 : undefined\"\n @blur=\"removeCurrentActive\"\n @focus=\"handleOptionsFocus\"\n @keydown.shift.tab=\"emit('options-list-shift-tab')\"\n @keydown.tab.exact=\"emit('options-list-tab')\"\n @mousedown.prevent\n>\n <slot></slot>\n</ul>\n\n</template>\n","<script setup>\nimport { computed, nextTick, ref, watch } from 'vue'\nimport BsDropdownOptionList from '../dropdown-option-list/BsDropdownOptionList.vue'\nimport BsDropdownOptionBuilder from '../dropdown-option-builder/BsDropdownOptionBuilder.vue'\n\nconst props = defineProps({\n focusOnOpen: {\n type: Boolean,\n default: true\n },\n label: {\n type: String,\n default: \"Select an option\"\n },\n options: {\n type: Array,\n default: () => []\n },\n optionsId: {\n type: String,\n required: true\n },\n selectedOptions: {\n type: Array,\n default: () => []\n },\n shown: {\n type: Boolean,\n default: false\n },\n valueIdKey: {\n type: String,\n default: \"id\"\n }\n})\n\nconst emit = defineEmits([\n 'check-option',\n 'options-list-shift-tab',\n 'options-list-tab',\n 'uncheck-option',\n 'update:selectedOptions',\n])\n\nconst optlist = ref(null)\nconst selectedLocalOptions = ref([])\nconst unselectedLocalOptions = ref([])\n\nconst showDivider = computed(() => selectedLocalOptions.value?.length && unselectedLocalOptions.value?.length)\nconst hasSomeOptions = computed(() => selectedLocalOptions.value?.length || unselectedLocalOptions.value?.length)\n\nlet refocusPending = false\n\nwatch(() => props.options, () => {\n sortSelectedUnselected(props.selectedOptions)\n})\n\nwatch(() => props.selectedOptions,\n sortSelectedUnselected,\n { immediate: true }\n)\n\nwatch(() => props.shown, (val) => {\n if (val && props.focusOnOpen) nextTick(focusFirstOption)\n})\n\nfunction focusFirstOption() {\n if (optlist.value) {\n optlist.value.refreshOptions()\n optlist.value.optionsRef.focus()\n }\n}\n\n// When an opt is (un)selected, that opt moves (down) up, so we need to set active\n// on the opt that now takes the position of the previously active opt\nfunction refocusOnOption() {\n if (optlist.value) {\n optlist.value.refreshOptions()\n optlist.value.setCurrentActive()\n }\n}\n\nfunction sortSelectedUnselected(updatedSelectedOptions = []) {\n const byId = updatedSelectedOptions[0]?.[props.valueIdKey] !== undefined\n if (byId) updatedSelectedOptions = updatedSelectedOptions.map(opt => opt[props.valueIdKey])\n const valuesOrIds = new Set(updatedSelectedOptions)\n const selected = []\n const unselected = []\n props.options.forEach((option) => {\n const newOption = { ...option }\n const inputIdMiddle = byId ? option.value[props.valueIdKey] : option.value\n const inputId = `${props.optionsId}-${inputIdMiddle}-cb`\n if (valuesOrIds.has(byId ? option.value[props.valueIdKey] : option.value)) {\n newOption.checkbox = { inputId, checked: true }\n selected.push(newOption)\n } else {\n newOption.checkbox = { inputId, checked: false }\n unselected.push(newOption)\n }\n })\n\n selectedLocalOptions.value = selected\n nextTick(() => {\n unselectedLocalOptions.value = unselected\n nextTick(() => {\n // we need to this additional check to avoid the `immediate` watcher on\n // `props.selectedOptions` from causing a refocus when the dropdown is closed\n if (refocusPending) refocusOnOption()\n refocusPending = false\n })\n })\n}\n\nfunction preorderPayload(unsortedPayload = []) {\n const values = new Set(unsortedPayload)\n const sorted = []\n // Maintain the order of the options as they were passed in\n props.options.forEach(f => {\n if (values.has(f.value)) sorted.push(f.value)\n })\n return sorted\n}\n\nfunction handleOptionSelect(value) {\n let payload = []\n if (props.selectedOptions.includes(value)) {\n payload = props.selectedOptions.filter(f => f !== value)\n emit('uncheck-option', value)\n } else {\n payload = preorderPayload([...props.selectedOptions, value])\n emit('check-option', value)\n }\n refocusPending = true\n emit('update:selectedOptions', payload)\n}\n</script>\n\n<template>\n<BsDropdownOptionList\n ref=\"optlist\"\n aria-multiselectable=\"true\"\n data-component=\"bs-dropdown-multiselect\"\n :label=\"label\"\n multiselect\n :options-id=\"optionsId\"\n :shown=\"shown\"\n @options-list-shift-tab=\"emit('options-list-shift-tab')\"\n @options-list-tab=\"emit('options-list-tab')\"\n @update:modelValue=\"handleOptionSelect\"\n>\n <template v-if=\"hasSomeOptions\">\n <BsDropdownOptionBuilder\n :options=\"selectedLocalOptions\"\n :show-no-options=\"false\"\n :value-id-key=\"valueIdKey\"\n />\n <li role=\"separator\" v-show=\"showDivider\"><hr /></li>\n <BsDropdownOptionBuilder\n :options=\"unselectedLocalOptions\"\n :show-no-options=\"false\"\n :value-id-key=\"valueIdKey\"\n />\n </template>\n\n <li\n v-else\n role=\"option\"\n data-no-hover=\"true\"\n >\n <slot name=\"no-options\">No options</slot>\n </li>\n</BsDropdownOptionList>\n</template>\n","<script setup>\nimport { computed, ref } from 'vue'\nimport { useGenIdAttrs } from '../../composables/genId'\nimport BsFilterButton from '../filter-button/BsFilterButton.vue'\nimport BsDropdown from '../dropdown/BsDropdown.vue'\nimport BsDropdownOptionBuilder from '../dropdown-option-builder/BsDropdownOptionBuilder.vue'\nimport BsInputSearch from '../input-search/BsInputSearch.vue'\nimport BsButton from '@components/button/BsButton.vue'\nimport BsDropdownMultiselect from '../dropdown-multiselect/BsDropdownMultiselect.vue'\nimport BsDropdownOptionList from '../dropdown-option-list/BsDropdownOptionList.vue'\n\n// PROPS\nconst props = defineProps({\n anchorId: {\n type: String,\n default: '',\n },\n breakout: {\n type: Boolean,\n default: false,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n dropdownLabel: {\n type: String,\n default: 'Select an option',\n },\n dropdownPosition: {\n type: String,\n validator: value => {\n return ['', 'top', 'center', 'right'].includes(value)\n },\n default: '',\n },\n dropdownWidth: {\n type: String,\n validator: value => {\n return ['', 'sm', 'md', 'lg', 'content', 'anchor', 'toggle'].includes(value)\n },\n default: 'md',\n },\n filter: {\n type: Boolean,\n default: false,\n },\n filterButtonText: {\n type: String,\n default: 'Select',\n },\n filterLabel: {\n type: String,\n default: '',\n },\n filterPlaceholder: {\n type: String,\n default: 'Search...',\n },\n helperText: {\n type: String,\n default: '',\n },\n helperDescription: {\n type: String,\n default: '',\n },\n multiselect: {\n type: Boolean,\n default: false,\n },\n open: {\n type: Boolean,\n default: true,\n },\n options: {\n type: Array,\n default: () => [],\n },\n optionsId: {\n type: String,\n default: '',\n },\n selectedOption: {\n type: [String, Number, Object],\n default: '',\n },\n selectedOptions: {\n type: Array,\n default: () => [],\n },\n showBadgeCount: {\n type: Boolean,\n default: false,\n },\n toggleId: {\n type: String,\n default: '',\n },\n toggleLabel: {\n type: String,\n default: 'Filter',\n },\n toggleSize: {\n type: String,\n validator: val => ['', 'sm', 'xs'].includes(val),\n default: '',\n },\n useMobileStyle: {\n type: Boolean,\n default: true,\n },\n valueIdKey: {\n type: String,\n default: 'id',\n },\n})\n\n// EMITS\nconst emit = defineEmits([\n 'check-option',\n 'close',\n 'options-list-shift-tab',\n 'options-list-tab',\n 'toggled',\n 'uncheck-option',\n 'update:selectedOption',\n 'update:selectedOptions',\n])\n\n// VARIABLES\nlet toggleEl = null\n\n// COMPOSABLES\nconst [autoToggleId, autoOptionsId] = useGenIdAttrs(2)\n\n// REFS\nconst isShown = ref(false)\nconst filterTerm = ref('')\n\n// COMPUTED\nconst badgeCount = computed(() => {\n return props.selectedOptions.length\n})\n\nconst OptionList = computed(() =>\n props.multiselect ? BsDropdownMultiselect : BsDropdownOptionList,\n)\n\nconst optionsIdActual = computed(() => props.optionsId || autoOptionsId.value)\n\nconst toggleIdActual = computed(() => props.toggleId || autoToggleId.value)\n\nconst filteredOptions = computed(() => {\n if (filterTerm.value) {\n return props.options.filter(option =>\n option.label.toLowerCase().startsWith(filterTerm.value.toLowerCase()),\n )\n }\n return props.options\n})\n\nconst optionsComputed = computed(() => {\n return props.filter ? filteredOptions.value : props.options\n})\n\n// METHODS\nconst getToggleEl = () =>\n toggleEl ? toggleEl : (toggleEl = document.getElementById(toggleIdActual.value))\n\nfunction checkShouldRestoreFocus() {\n const activeEl = document.activeElement\n return !activeEl || activeEl.tagName === 'BODY' || activeEl.id === optionsIdActual.value\n}\n\nfunction closeAndRestoreFocus() {\n isShown.value = false\n emit('close')\n\n if (checkShouldRestoreFocus()) {\n getToggleEl()?.focus?.()\n }\n}\n\nfunction handleClose() {\n if (isShown.value) {\n closeAndRestoreFocus()\n }\n}\n\n/** When enter has started, this means the element is mounted. */\nfunction handleEnterStart() {\n isShown.value = true\n}\n\nfunction handleUncheckOption(value) {\n const newOptionsValue = props.selectedOptions.filter(opt => opt !== value)\n emit('update:selectedOptions', newOptionsValue)\n emit('uncheck-option', value)\n}\n\nfunction handleCheckOption(value) {\n const newOptionsValue = [...props.selectedOptions, value]\n emit('update:selectedOptions', newOptionsValue)\n emit('check-option', value)\n}\n\nfunction handleSingleSelect(val) {\n if (!props.multiselect) {\n emit('update:selectedOption', val)\n closeAndRestoreFocus()\n }\n}\n\nfunction handleSearchClear() {\n filterTerm.value = ''\n}\n\nfunction handleSearchUpdate(val) {\n filterTerm.value = val\n}\n</script>\n\n<template>\n <div class=\"bs-dropdown-with-toggle\" :id=\"$attrs.id\">\n <slot\n name=\"toggle\"\n :anchor-id=\"anchorId\"\n :options-id=\"optionsIdActual\"\n :toggle-id=\"toggleIdActual\"\n >\n <BsFilterButton\n :aria-controls=\"optionsIdActual\"\n :aria-expanded=\"open\"\n :disabled=\"disabled\"\n :id=\"toggleIdActual\"\n :open=\"open\"\n :options-id=\"optionsIdActual\"\n :size=\"toggleSize\"\n :badge-count=\"showBadgeCount && multiselect ? badgeCount : undefined\"\n @click=\"$emit('toggled')\"\n >\n <template #label>\n <slot name=\"toggle-label\">\n {{ toggleLabel }}\n </slot>\n </template>\n </BsFilterButton>\n </slot>\n <BsDropdown\n :anchor-id=\"anchorId || toggleIdActual\"\n :breakout=\"breakout\"\n :helper-text=\"helperText\"\n :helper-description=\"helperDescription\"\n :position=\"dropdownPosition\"\n preloaded\n :shown=\"open\"\n :use-mobile-style=\"useMobileStyle\"\n :width=\"dropdownWidth\"\n @close=\"handleClose\"\n @enter=\"handleEnterStart\"\n @after-leave=\"handleSearchClear\"\n >\n <div v-if=\"filter\" class=\"filter-input-container\">\n <BsInputSearch\n :aria-label=\"filterLabel\"\n :model-value=\"filterTerm\"\n :placeholder=\"filterPlaceholder\"\n @update:modelValue=\"handleSearchUpdate\"\n @clear=\"handleSearchClear\"\n />\n </div>\n\n <!--\n model-value / update:modelValue - for BsDropdownOptionList\n selected-options / check-option / uncheck-option - for BsDropdownMultiselect\n -->\n <OptionList\n :class=\"{ 'filterable-options': filter }\"\n :label=\"dropdownLabel\"\n :model-value=\"selectedOption\"\n :options=\"multiselect ? optionsComputed : undefined\"\n :options-id=\"optionsIdActual\"\n :selected-options=\"selectedOptions\"\n :shown=\"open\"\n :value-id-key=\"valueIdKey\"\n @check-option=\"handleCheckOption\"\n @close=\"multiselect ? undefined : handleClose()\"\n @options-list-shift-tab=\"$emit('options-list-shift-tab')\"\n @options-list-tab=\"$emit('options-list-tab')\"\n @uncheck-option=\"handleUncheckOption\"\n @update:modelValue=\"handleSingleSelect\"\n >\n <template v-if=\"!multiselect\">\n <BsDropdownOptionBuilder :options=\"optionsComputed\" :value-id-key=\"valueIdKey\" />\n </template>\n </OptionList>\n <div v-if=\"multiselect\" class=\"mobile-select-button-container\">\n <BsButton\n :title=\"filterButtonText\"\n class=\"mobile-select-button\"\n @click=\"() => emit('close')\"\n >{{ filterButtonText }}</BsButton\n >\n </div>\n </BsDropdown>\n </div>\n</template>\n\n<style>\ndiv:where(.bs-dropdown-with-toggle) {\n position: relative;\n}\n\n:where(.bs-label + .bs-dropdown-with-toggle) {\n margin-top: 0.25rem;\n}\n\n.filter-input-container {\n padding: 0.75rem;\n}\n\n.filterable-options {\n padding-top: 0;\n}\n</style>\n","<script setup>\nimport { computed, ref } from 'vue'\nimport { useGenIdAttrs } from '@composables/genId.js'\nimport BsInputCombobox from './internal/BsInputCombobox.vue'\nimport BsDropdownWithToggle from '@components/dropdown-with-toggle/BsDropdownWithToggle.vue'\n\n// PROPS\nconst props = defineProps({\n disabled: {\n type: Boolean,\n default: false\n },\n displayValue: {\n type: String,\n default: ''\n },\n dropdownPosition: {\n type: String,\n validator: (value) => {\n return ['', 'top', 'center', 'right'].includes(value)\n },\n },\n dropdownWidth: {\n type: String,\n validator: (value) => {\n return ['', 'sm', 'md', 'lg', 'content', 'anchor'].includes(value)\n },\n },\n error: {\n type: Boolean,\n default: false\n },\n helperText: {\n type: String,\n default: ''\n },\n helperDescription: {\n type: String,\n default: ''\n },\n hintId: {\n type: String,\n },\n inputId: {\n type: String,\n },\n modelValue: {\n type: String,\n default: ''\n },\n options: {\n type: Array,\n default: () => []\n },\n placeholder: {\n type: String,\n },\n required: {\n type: Boolean,\n default: false\n },\n updateOnInput: {\n type: Boolean,\n default: false\n },\n useMobileStyle: {\n type: Boolean,\n default: true\n },\n valueIdKey: {\n type: String,\n default: 'id'\n },\n})\n\n// EMITS\nconst emit = defineEmits(['update:modelValue', 'combobox:change', 'combobox:input'])\n\n// STATE\nconst [ inputIdGen, inputWrapperId, optionsId ] = useGenIdAttrs(3)\nconst open = ref(false)\nconst preventFocusOpen = ref(false)\n\n// REFS\nconst inputComboboxRef = ref(null)\n\n// COMPUTED\nconst inputIdAttr = computed(() => props.inputId || inputIdGen.value)\n\n// VARIABLES\nlet inputEl = null\n\n// METHODS\nfunction getInputEl() {\n if (!inputEl) {\n inputEl = inputComboboxRef.value.$el.querySelector('input')\n }\n return inputEl\n}\n\nfunction handleChange(e) {\n emit('combobox:change', e.target.value)\n emit('update:modelValue', e.target.value)\n}\n\nfunction handleClear() {\n getInputEl().focus()\n emit('combobox:change', '')\n emit('update:modelValue', '')\n}\n\nfunction handleInput(e) {\n emit('combobox:input', e.target.value)\n if (props.updateOnInput) {\n emit('update:modelValue', e.target.value)\n }\n}\n\nfunction handleDropdownClose() {\n open.value = false\n // Input is re-focused after the dropdown closes, so we need to prevent\n // re-opening the dropdown immediately in this case\n if (document.activeElement !== getInputEl()) {\n preventFocusOpen.value = true\n }\n}\n\n// \"focus\" event happens between \"mousedown\" and \"mouseup\", so we need to\n// prevent opening the dropdown on focus if the input was clicked (note that\n// \"click\" event is the same as \"mousedown\" >> \"mouseup\")\nfunction handleInputMousedown() {\n preventFocusOpen.value = true\n}\n\nfunction handleInputMouseup() {\n open.value = true\n preventFocusOpen.value = false\n}\n\nfunction handleFocus() {\n if (preventFocusOpen.value) {\n // Preventing opening the dropdown only once. This is essentially only\n // for the case where the dropdown is closed and the input is focused\n preventFocusOpen.value = false\n } else {\n open.value = true\n }\n}\n\ndefineOptions({ inheritAttrs: false })\n</script>\n\n<template>\n<BsDropdownWithToggle\n :anchor-id=\"inputWrapperId\"\n :disabled=\"disabled\"\n :dropdown-position=\"dropdownPosition\"\n :dropdown-width=\"dropdownWidth\"\n :helper-description=\"helperDescription\"\n :helper-text=\"helperText\"\n :multiselect=\"false\"\n :open=\"open\"\n :options=\"options\"\n :options-id=\"optionsId\"\n :selected-option=\"modelValue\"\n :toggle-id=\"$attrs.id || inputIdAttr\"\n :use-mobile-style=\"useMobileStyle\"\n :value-id-key=\"valueIdKey\"\n @close=\"handleDropdownClose\"\n @options-list-tab=\"open = false\"\n @update:selectedOption=\"$emit('update:modelValue', $event)\"\n>\n <template #toggle>\n <BsInputCombobox\n ref=\"inputComboboxRef\"\n :id=\"$attrs.id || inputIdAttr\"\n :container-id=\"inputWrapperId\"\n :disabled=\"disabled\"\n :error=\"error\"\n :hint-id=\"hintId\"\n :model-value=\"displayValue || modelValue\"\n :open=\"open\"\n :options-id=\"optionsId\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n @change=\"handleChange\"\n @clear=\"handleClear\"\n @input=\"handleInput\"\n @input-focus=\"handleFocus\"\n @input-mousedown=\"handleInputMousedown\"\n @input-mouseup=\"handleInputMouseup\"\n @input-shift-tab=\"open = false\"\n @toggled=\"open = !open\"\n v-bind=\"$attrs\"\n />\n </template>\n</BsDropdownWithToggle>\n</template>\n","<script setup>\nimport { computed, ref } from 'vue'\nimport { useGenIdAttrs } from '@composables/genId.js'\nimport { filterAttrs, textlikeAttrs } from '@utils/filterAttrs.js'\nimport BsDropdownCombobox from '../dropdown-combobox/BsDropdownCombobox.vue'\nimport BsFieldDetails from '../field-details/BsFieldDetails.vue'\nimport BsLabel from '../label/BsLabel.vue'\n\nconst props = defineProps({\n disabled: {\n type: Boolean,\n default: false\n },\n displayValue: {\n type: String,\n default: ''\n },\n dropdownPosition: {\n type: String,\n validator: (value) => {\n return ['', 'top', 'center', 'right'].includes(value)\n },\n },\n dropdownWidth: {\n type: String,\n validator: (value) => {\n return ['', 'sm', 'md', 'lg', 'content', 'anchor'].includes(value)\n },\n },\n error: {\n type: Boolean,\n default: false\n },\n errorMsg: {\n type: String,\n },\n helperText: {\n type: String,\n default: ''\n },\n helperDescription: {\n type: String,\n default: ''\n },\n hint: {\n type: String,\n },\n hintId: {\n type: String,\n },\n inputId: {\n type: String,\n },\n label: {\n type: String,\n },\n modelValue: {\n type: String,\n default: ''\n },\n options: {\n type: Array,\n default: () => []\n },\n placeholder: {\n type: String,\n },\n required: {\n type: Boolean,\n default: false\n },\n updateOnInput: {\n type: Boolean,\n default: false\n },\n useMobileStyle: {\n type: Boolean,\n default: true\n },\n valueIdKey: {\n type: String,\n default: 'id'\n },\n})\nconst emit = defineEmits(['update:modelValue', 'combobox:change', 'combobox:input'])\n\ndefineOptions({ inheritAttrs: false })\nconst [ inputIdGen, hintId ] = useGenIdAttrs(2)\n\n// Computed properties\nconst hintMsg = computed(() => (\n (props.error && props.errorMsg) || props.hint || undefined\n))\nconst inputIdAttr = computed(() => props.inputId || inputIdGen.value)\n\n</script>\n\n<template>\n<div data-component=\"bs-dropdown-combobox-field\" v-bind=\"filterAttrs($attrs, textlikeAttrs).remaining\">\n <BsLabel v-if=\"label || $slots.label\"\n :for=\"$attrs.id || inputIdAttr\"\n :disabled=\"disabled\"\n :required=\"required\"\n >\n <slot name=\"label\">\n {{ label }}\n </slot>\n </BsLabel>\n <BsDropdownCombobox\n :disabled=\"disabled\"\n :display-value=\"displayValue\"\n :dropdown-position=\"dropdownPosition\"\n :dropdown-width=\"dropdownWidth\"\n :error=\"error\"\n :helper-text=\"helperText\"\n :helper-description=\"helperDescription\"\n :hint-id=\"hintId\"\n :input-id=\"$attrs.id || inputIdAttr\"\n :model-value=\"modelValue\"\n :options=\"options\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :update-on-input=\"updateOnInput\"\n :use-mobile-style=\"useMobileStyle\"\n :value-id-key=\"valueIdKey\"\n @combobox:change=\"$event => $emit('combobox:change', $event)\"\n @combobox:input=\"$event => $emit('combobox:input', $event)\"\n @update:modelValue=\"$event => $emit('update:modelValue', $event)\"\n v-bind=\"filterAttrs($attrs, textlikeAttrs).filtered\"\n />\n <BsFieldDetails v-if=\"hintMsg\"\n :error=\"error\"\n :error-msg=\"errorMsg\"\n :hint=\"hint\"\n :hint-id=\"hintId\"\n />\n</div>\n</template>\n","<script setup>\nimport { ref } from 'vue'\nimport BsDropdown from '../dropdown/BsDropdown'\nimport BsDropdownOptionList from '../dropdown-option-list/BsDropdownOptionList'\n\n// PROPS\nconst props = defineProps({\n // DROPDOWN PROPS\n anchorId: {\n type: String,\n default: undefined\n },\n breakout: {\n type: Boolean,\n default: false\n },\n containerId: {\n type: String,\n default: undefined\n },\n helperDescription: {\n type: String,\n default: undefined\n },\n helperText: {\n type: String,\n default: undefined\n },\n position: {\n type: String,\n default: undefined,\n validator: (value) => {\n return ['', 'top', 'center', 'right'].includes(value)\n },\n },\n preloaded: {\n type: Boolean,\n default: false\n },\n shown: {\n type: Boolean,\n default: true\n },\n useMobileStyle: {\n type: Boolean,\n default: true\n },\n width: {\n type: String,\n default: undefined,\n validator: (value) => {\n return ['', 'sm', 'md', 'lg', 'content', 'anchor'].includes(value)\n },\n },\n\n // OPTION LIST PROPS\n label: {\n type: String,\n default: \"Select an option\"\n },\n modelValue: {\n type: [ String, Number ],\n default: undefined\n },\n optionsId: {\n type: String,\n required: true\n },\n preventTab: {\n type: Boolean,\n default: true\n },\n typeToFocus: {\n type: Boolean,\n default: false\n },\n})\n\n// EMITS\nconst emit = defineEmits([\n 'update:modelValue',\n 'close',\n 'after-enter',\n 'after-leave'\n])\n\n// STATE\nconst isShown = ref(false)\n\n// METHODS\n/** When enter has started, this means the element is mounted. */\nfunction handleEnter() {\n isShown.value = true\n}\n\nfunction handleSelect(ev) {\n isShown.value = false\n emit('update:modelValue', ev)\n emit('close')\n}\n\nfunction handleClose() {\n if (isShown.value) {\n isShown.value = false\n emit('close')\n }\n}\n</script>\n\n<template>\n<BsDropdown\n :anchor-id=\"anchorId\"\n :breakout=\"breakout\"\n :container-id=\"containerId\"\n :helper-description=\"helperDescription\"\n :helper-text=\"helperText\"\n :position=\"position\"\n :preloaded=\"preloaded\"\n :shown=\"shown\"\n :use-mobile-style=\"useMobileStyle\"\n :width=\"width\"\n @close=\"handleClose\"\n @after-enter=\"emit('after-enter')\"\n @enter=\"handleEnter\"\n @after-leave=\"emit('after-leave')\"\n>\n <BsDropdownOptionList\n :label=\"label\"\n :model-value=\"modelValue\"\n :options-id=\"optionsId\"\n :prevent-tab=\"preventTab\"\n :type-to-focus=\"typeToFocus\"\n @update:model-value=\"handleSelect\"\n @close=\"handleClose\"\n >\n <slot />\n </BsDropdownOptionList>\n</BsDropdown>\n</template>\n","<!-- Handles backwards compatibility with deprecated props -->\n<!-- Replace with BsDropdownWithOptionsNew when retiring these props -->\n<script setup>\nimport { computed } from 'vue'\nimport BsDropdownWithOptionsNew from './BsDropdownWithOptionsNew.vue'\nimport useTransitionHelper from '../../composables/transitionHelper'\n\n// PROPS\nconst props = defineProps({\n anchorId: {\n type: String,\n default: undefined\n },\n shown: {\n type: Boolean,\n default: true\n },\n breakout: {\n type: Boolean,\n default: false\n },\n containerId: {\n type: String,\n default: undefined\n },\n helperDescription: {\n type: String,\n default: undefined\n },\n helperText: {\n type: String,\n default: undefined\n },\n position: {\n type: String,\n default: undefined,\n validator: (value) => {\n return ['', 'top', 'center', 'right'].includes(value)\n },\n },\n preloaded: {\n type: Boolean,\n default: false\n },\n useMobileStyle: {\n type: Boolean,\n default: true\n },\n /** @Deprecated - 'toggle' deprecated, use 'anchor' instead */\n width: {\n type: String,\n default: undefined,\n validator: (value) => {\n return ['', 'sm', 'md', 'lg', 'content', 'anchor', 'toggle'].includes(value)\n },\n },\n // DEPRECATED DROPDOWN PROPS\n /** @Deprecated - Use position instead */\n center: {\n type: Boolean,\n default: false\n },\n /** @Deprecated - Use 'preloaded' instead. */\n enterControlled: {\n type: Boolean,\n default: false\n },\n /** @Deprecated - Use 'shown' instead. */\n enterTrigger: {\n type: Boolean,\n default: false\n },\n /** @Deprecated - Not used anymore. Handled via 'shown'. */\n leaveTrigger: {\n type: Boolean,\n default: false\n },\n /** @Deprecated - Use position instead */\n right: {\n type: Boolean,\n default: false\n },\n /** @Deprecated - Use anchorId instead */\n toggleId: {\n type: String,\n default: undefined\n },\n /** @Deprecated - Use position instead */\n top: {\n type: Boolean,\n default: false\n },\n\n // OPTION LIST PROPS\n label: {\n type: String,\n default: \"Select an option\"\n },\n modelValue: {\n type: [ String, Number ],\n default: undefined\n },\n optionsId: {\n type: String,\n required: true\n },\n preventTab: {\n type: Boolean,\n default: true\n },\n // DEPRECATED OPTION LIST PROPS\n /** @Deprecated - Use modelValue (or v-model) instead */\n selectedValue: {\n type: [ String, Number ],\n default: undefined\n },\n})\n\n// Hanles optselected backwards compatibility\nconst emit = defineEmits([\n 'optselected',\n 'update:modelValue',\n 'close',\n 'after-enter',\n 'after-leave'\n])\n\n// Handles enterControlled/enterTrigger/leaveTrigger backwards compatibility\nconst { transition: shownActual } = useTransitionHelper(props)\n\n// Handles width backwards compatibility\nconst widthActual = computed(() => {\n return props.width === 'toggle' ? 'anchor' : props.width\n})\n\n// Handles top/center/right backwards compatibility\nconst positionActual = computed(() => {\n if (props.top) {\n return 'top'\n }\n if (props.center) {\n return 'center'\n }\n if (props.right) {\n return 'right'\n }\n return props.position\n})\n\n// Handles toggleId backwards compatibility\nconst anchorIdActual = computed(()=> {\n if (props.toggleId) {\n return props.toggleId\n }\n return props.anchorId\n})\n\n// Handles selectedValue backwards compatibility\nconst modelValueActual = computed(() => {\n return props.selectedValue || props.modelValue\n})\n\nfunction handleSelect(ev) {\n emit('optselected', ev)\n emit('update:modelValue', ev)\n}\n</script>\n\n<template>\n<BsDropdownWithOptionsNew\n :anchor-id=\"anchorIdActual\"\n :breakout=\"breakout\"\n :container-id=\"containerId\"\n :helper-description=\"helperDescription\"\n :helper-text=\"helperText\"\n :label=\"label\"\n :model-value=\"modelValueActual\"\n :options-id=\"optionsId\"\n :position=\"positionActual\"\n :preloaded=\"preloaded\"\n :prevent-tab=\"preventTab\"\n :shown=\"shownActual\"\n :use-mobile-style=\"useMobileStyle\"\n :width=\"widthActual\"\n @close=\"emit('close')\"\n @after-enter=\"emit('after-enter')\"\n @after-leave=\"emit('after-leave')\"\n @update:model-value=\"handleSelect\"\n>\n <slot />\n</BsDropdownWithOptionsNew>\n</template>\n","<script setup>\nimport { computed } from 'vue'\nimport { useDynamicIcon } from '../../composables/dynamicIcon.js'\n\nconst props = defineProps({\n description: {\n type: String,\n default: ''\n },\n iconName: {\n type: String,\n default: ''\n },\n size: {\n type: String,\n validator: (val) => ['xs', 'sm', 'md', 'lg'].includes(val),\n default: 'md'\n },\n title: {\n type: String,\n required: true\n }\n})\n\nconst { icon } = useDynamicIcon(props, 'iconName')\n</script>\n\n<template>\n <div class=\"bs-empty-state\" data-component=\"bs-empty-state\" :data-size=\"size\">\n <div class=\"bs-empty-state-icon\">\n <slot name=\"icon\">\n <component :is=\"icon\" size=\"auto\" />\n </slot>\n </div>\n <div>\n <p class=\"bs-empty-state-title\">{{ title }}</p>\n <p class=\"bs-empty-state-description\" v-if=\"size !== 'xs'\">\n <slot name=\"description\">{{ description }}</slot>\n </p>\n <slot name=\"call-to-action\"></slot>\n </div>\n </div>\n</template>\n","<script setup>\nimport { ref, computed } from 'vue'\nimport useClickAway from '../../composables/clickAway'\nimport useKeydown from '../../composables/keydown'\nimport BsEnhancedTransition from '../transition/BsEnhancedTransition.vue'\nimport { BsIconClose } from '@wwtdev/bsds-icons-vue3'\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = defineProps({\n absolute: {\n type: Boolean,\n default: false\n },\n position: {\n type: String,\n default: undefined,\n validator (value) {\n return ['', 'right',].includes(value)\n }\n },\n preloaded: {\n type: Boolean,\n default: false\n },\n shown: {\n type: Boolean,\n default: true\n },\n size: {\n type: String,\n default: undefined,\n validator (value) {\n return ['', 'lg'].includes(value)\n }\n },\n toggleId: {\n type: String,\n required: true\n }\n})\n\nconst emit = defineEmits([ 'close' ])\n\nconst flyoutRef = ref(null)\n\nconst toggleEl = computed(() => {\n return document.getElementById(props.toggleId)\n})\n\nuseClickAway([ flyoutRef, toggleEl ], closeFlyout)\nuseKeydown([ 'Escape' ], closeFlyout)\n\nfunction closeFlyout() {\n const hasShownChild = flyoutRef.value?.querySelector('[data-shown=\"true\"]') !== null\n if (props.shown && !hasShownChild) {\n emit('close')\n }\n}\n</script>\n\n<template>\n<BsEnhancedTransition\n name=\"bs-flyout\"\n :preloaded=\"preloaded\"\n :shown=\"shown\"\n>\n <div\n ref=\"flyoutRef\"\n class=\"bs-flyout\"\n :data-absolute=\"absolute\"\n data-component=\"bs-flyout\"\n :data-position=\"position\"\n :data-shown=\"shown\"\n :data-size=\"size\"\n v-bind=\"$attrs\"\n >\n <div class=\"bs-flyout-close-container\">\n <button\n type=\"button\"\n title=\"Close\"\n aria-label=\"Close\"\n @click=\"closeFlyout\"\n >\n <BsIconClose />\n </button>\n </div>\n <slot></slot>\n </div>\n</BsEnhancedTransition>\n</template>\n","<script setup>\nimport { ref, onMounted } from 'vue'\nimport { useGenIdAttrs } from '../../composables/_composables.js'\n\ndefineOptions({ inheritAttrs: false })\n\n// REFS\nconst svgWrapperRef = ref(null)\n\n// STATE\nconst viewBox = ref(null)\n\n// VARS\nconst stops = [\n { offset: 0.1326, color: '#EE282A' },\n { offset: 0.5466, color: '#1C0087' },\n { offset: 0.9715, color: '#0086EA' }\n]\nconst [ uniqueId ] = useGenIdAttrs()\n\nonMounted(() => {\n viewBox.value = svgWrapperRef.value\n .querySelector('svg')\n .getAttribute('viewBox')\n || '0 0 0 0'\n})\n</script>\n\n<template>\n <span\n ref=\"svgWrapperRef\"\n class=\"bs-icon-gradient-wrapper\"\n :style=\"`fill: url(#${uniqueId});`\"\n v-bind=\"$attrs\"\n >\n <slot />\n </span>\n\n <!-- Build the fill gradient for the input SVG here -->\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n :view-box=\"viewBox\"\n width=\"0\"\n height=\"0\"\n >\n <linearGradient\n :id=\"uniqueId\"\n x1=\"0\"\n y1=\"0\"\n x2=\"100%\"\n y2=\"100%\"\n gradient-units=\"userSpaceOnUse\"\n >\n <stop\n v-for=\"stop in stops\"\n :key=\"stop.offset\"\n :offset=\"stop.offset\"\n :stop-color=\"stop.color\"\n />\n </linearGradient>\n </svg>\n</template>\n\n<style>\n .bs-icon-gradient-wrapper {\n display: inline-block;\n }\n\n .bs-icon-gradient-wrapper * {\n fill: inherit;\n }\n</style>\n","<script setup>\nimport { computed } from 'vue'\nimport { useGenIdAttrs } from '@composables/genId.js'\nimport { filterAttrs, textlikeAttrs } from '@utils/filterAttrs.js'\nimport BsFieldDetails from '../field-details/BsFieldDetails.vue'\nimport BsInput from '../input/BsInput.vue'\nimport BsLabel from '../label/BsLabel.vue'\n\n// Props\nconst props = defineProps({\n /** Sets the disabled state on input, disabled styles on label. */\n disabled: {\n type: Boolean,\n default: false,\n },\n /** Applies error styles to the input. */\n error: {\n type: Boolean,\n default: false,\n },\n /** Pass error text. */\n errorMsg: String,\n /** Pass helper text. */\n hint: String,\n /** @Deprecated Use `hint` and/or `errorMsg`. */\n hints: [ String, Array ],\n /** Pass id for the input element. Will also be applied to label attribute. */\n inputId: String,\n /** Pass label text. */\n label: { type: String },\n /** List additional attributes by name (comma-separated) to pass through to `<input>`. */\n passAttrs: {\n type: String,\n default: '',\n },\n /** Placeholder attribute for `<input>`. */\n placeholder: String,\n /** Sets the required state on the input, append required* indicator to label. */\n required: {\n type: Boolean,\n default: false,\n },\n /** Sets the native input type attribute. */\n type: {\n type: String,\n default: 'text',\n },\n /** Sets the input value - do not use if using `v-model`. */\n value: [ String, Number ],\n /** Sets the input value - `v-model` directive will use this; do not set explicitly. */\n modelValue: [ String, Number ]\n})\n\nconst emit = defineEmits(['update:modelValue'])\n\n// allocate attributes to root and/or child elements\ndefineOptions({ inheritAttrs: false })\nconst [ inputIdGen, hintId ] = useGenIdAttrs(2)\n\n// Computed Properties\nconst attrFilter = computed(() => textlikeAttrs.concat(props.passAttrs.split(',')).concat('type'))\nconst hintDeprecated = computed(() => props.hints?.join?.(\"\\n\") || props.hints)\nconst hintMsg = computed(() => (\n (props.error && props.errorMsg) || props.hint || hintDeprecated.value || undefined\n))\nconst inputIdAttr = computed(() => props.inputId || inputIdGen.value)\n</script>\n\n<template>\n<div data-component=\"bs-input-field\" v-bind=\"filterAttrs($attrs, attrFilter).remaining\">\n <BsLabel v-if=\"label || $slots.label\"\n :for=\"$attrs.id || inputIdAttr\"\n :disabled=\"disabled\"\n :required=\"required\"\n >\n <slot name=\"label\">\n {{ label }}\n </slot>\n </BsLabel>\n <BsInput\n :disabled=\"disabled\"\n :error=\"error\"\n :hint-id=\"hintId\"\n :id=\"$attrs.id || inputIdAttr\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :type=\"type\"\n :value=\"value || modelValue\"\n @update:modelValue=\"$event => $emit('update:modelValue', $event)\"\n v-bind=\"filterAttrs($attrs, attrFilter).filtered\"\n />\n <BsFieldDetails v-if=\"hintMsg\"\n :error=\"error\"\n :error-msg=\"errorMsg\"\n :hint=\"hint || hintDeprecated\"\n :hint-id=\"hintId\"\n />\n</div>\n</template>\n\n<style>\n:where([data-component=\"bs-input-field\"]) {\n display: block;\n width: 100%;\n}\n</style>\n","import { getSupportedCallingCodes, getRegionCodeForCountryCode } from \"awesome-phonenumber\";\n\n/**\n * @typedef {Object} Country\n * @property {string} label – the country code (aka dial code) w/ '+' prefix\n * @property {string} flag – the country flag emoji\n * @property {string} value – the country code (aka dial code)\n * @property {string} regionCode – the ISO 3166-1 alpha-2 region code (e.g. 'US' for United States)\n *\n */\n\nconst SYMBOLS = {\n 'A': '🇦',\n 'B': '🇧',\n 'C': '🇨',\n 'D': '🇩',\n 'E': '🇪',\n 'F': '🇫',\n 'G': '🇬',\n 'H': '🇭',\n 'I': '🇮',\n 'J': '🇯',\n 'K': '🇰',\n 'L': '🇱',\n 'M': '🇲',\n 'N': '🇳',\n 'O': '🇴',\n 'P': '🇵',\n 'Q': '🇶',\n 'R': '🇷',\n 'S': '🇸',\n 'T': '🇹',\n 'U': '🇺',\n 'V': '🇻',\n 'W': '🇼',\n 'X': '🇽',\n 'Y': '🇾',\n 'Z': '🇿'\n}\n\n/**\n * Call `initSourceData` first to load the country data.\n */\nexport const CountryUtils = {\n data: {\n allCountries: null,\n byCountryCode: null,\n byRegionCode: null,\n },\n\n/**\n * @param {string|number} countryCode the country code (aka dial code) for the country\n * @returns {Country} the country object\n */\n getCountryByCountryCode(countryCode) {\n this.initMap('byCountryCode', 'value')\n return this.data.byCountryCode?.[countryCode]\n },\n\n /**\n * @param {string|number} regionCode the ISO 3166-1 alpha-2 region code\n * @returns {Country} the country object\n */\n getCountryByRegionCode(regionCode) {\n this.initMap('byRegionCode', 'regionCode')\n return this.data.byRegionCode?.[regionCode]\n },\n\n /**\n * @returns {Country[]} an array of country objects\n */\n initSourceData() {\n if (!this.data.allCountries) {\n this.data.allCountries = getSupportedCallingCodes().map((c) => {\n const regionCode = getRegionCodeForCountryCode(c)\n const flag = SYMBOLS[regionCode[0]] + SYMBOLS[regionCode[1]] ||''\n return {\n label: `+${c}`,\n flag,\n value: c,\n regionCode\n }\n }).filter(it => it.regionCode !== '001')\n }\n return this.data.allCountries\n },\n\n initMap(mapName, libKey) {\n if (!this.data[mapName] && this.data.allCountries) {\n this.data[mapName] = {}\n\n this.data.allCountries.forEach(country => {\n this.data[mapName][country[libKey]] = country\n })\n }\n }\n\n}\n\n\n","<script setup>\nimport { computed, onMounted, ref, watch } from 'vue'\nimport { parsePhoneNumber } from \"awesome-phonenumber\";\nimport { BsIconCaretSort } from '@wwtdev/bsds-icons-vue3'\nimport BsDropdownOption from '../dropdown-option/BsDropdownOption.vue'\nimport BsDropdownWithOptions from '../dropdown-with-options/BsDropdownWithOptions.vue'\nimport BsFieldDetails from '../field-details/BsFieldDetails.vue'\nimport BsInput from '../input/BsInput.vue'\nimport BsInputAddon from '../input-addon/BsInputAddon.vue'\nimport BsLabel from '../label/BsLabel.vue'\nimport { useGenIdAttrs } from '../../composables/genId.js'\nimport { filterAttrs, textlikeAttrs } from '@utils/filterAttrs.js'\nimport { CountryUtils } from './countryUtils.js'\n\nconst props = defineProps({\n deferValidation: {\n type: Boolean,\n default: false\n },\n disabled: {\n type: Boolean,\n default: false\n },\n error: {\n type: Boolean,\n default: false\n },\n errorMsg: {\n type: String,\n default: ''\n },\n hideLabel: {\n type: Boolean,\n default: false\n },\n hint: {\n type: String,\n default: ''\n },\n inputId: {\n type: String\n },\n label: {\n type: String,\n default: 'Phone Number'\n },\n /** Auto-set w/ v-model. */\n modelValue: {\n type: String,\n default: ''\n },\n placeholder: {\n type: String,\n default: 'Phone Number'\n },\n required: {\n type: Boolean,\n default: false\n }\n})\n\nconst emit = defineEmits(['update:modelValue', 'input-blur'])\n\ndefineOptions({ inheritAttrs: false })\n\nconst VALID_OTHER_KEYS = [\n 'ArrowDown',\n 'ArrowLeft',\n 'ArrowRight',\n 'ArrowUp',\n 'Backspace',\n 'Delete',\n 'End',\n 'Enter',\n 'Escape',\n 'Home',\n 'Tab',\n]\n\n/* ------- Refs ------- */\nconst countryCodesToggle = ref(null)\nconst countryCode = ref(1)\nconst countryCodes = ref([])\nconst currentCountry = ref(null)\nconst [\n countryToggleId,\n countryCodesId,\n hintId,\n inputIdGen\n] = useGenIdAttrs(4)\nconst isMounted = ref(false)\nconst phoneNumber = ref('')\nconst phoneNumberError = ref('')\nconst phoneNumberHasError = ref(false)\nconst showCountryCodes = ref(false)\nconst showValidationResult = ref(true)\ndefineExpose({\n validationErr: phoneNumberHasError,\n validationErrMsg: phoneNumberError,\n})\n\n/* ------- Computed & Watchers ------- */\nconst computedPhoneNumber = computed(() => phoneNumber.value ? `+${countryCode.value}${phoneNumber.value}` : '')\nconst countryToggleLabel = computed(() => `Country code: ${countryCode.value}. Click to change.`)\nconst errorMsgComputed = computed(() => showValidationResult.value ? props.errorMsg || phoneNumberError.value : '')\nconst hasError = computed(() => props.error || phoneNumberHasError.value)\nconst showDetails = computed(() => props.hint || (hasError.value && errorMsgComputed.value))\nconst showErrorState = computed(() => showValidationResult.value && hasError.value)\n\nwatch(computedPhoneNumber, (newVal) => {\n emit('update:modelValue', newVal)\n validate(newVal)\n})\n\nwatch(() => props.modelValue, clearPhoneNumberIfReset)\n\n/* ------- Client-side init ------- */\ninit()\n\nonMounted(() => isMounted.value = true)\n/* ------- Funcs ------- */\n\nfunction clearPhoneNumberIfReset(newVal, oldVal) {\n if (newVal === '' && newVal !== oldVal) {\n phoneNumber.value = ''\n }\n}\n\nfunction handleCountryCodeClose() {\n if (showCountryCodes.value) {\n showCountryCodes.value = false\n countryCodesToggle.value?.focus()\n }\n}\n\nfunction handleCountryCodeInput(selectedVal) {\n countryCode.value = selectedVal\n showCountryCodes.value = false\n countryCodesToggle.value?.focus()\n updateCurrentCountry(selectedVal)\n}\n\nfunction handlePhoneBlur() {\n if (props.deferValidation) showValidationResult.value = true\n emit('input-blur')\n}\n\nfunction handlePhoneInput(e) {\n phoneNumber.value = e.target.value\n if (props.deferValidation) showValidationResult.value = false\n}\n\nfunction ignoreInvalidChars(e) {\n if (!e.key?.match?.(/[0-9]/) && !VALID_OTHER_KEYS.includes(e.key) && !e.ctrlKey && !e.metaKey) {\n e.preventDefault()\n }\n}\n\nfunction init() {\n CountryUtils.initSourceData()\n initParse()\n updateCurrentCountry(countryCode.value)\n validate(computedPhoneNumber.value)\n}\n\nfunction initParse() {\n // try to parse the phone number value and if it's valid or at least has a parsaable country code,\n // set both the country code and phone number\n // otherwise, just set phoneNumber to value (the previous behavior)\n let parsedNum = parsePhoneNumber(props.modelValue)\n if (parsedNum.valid || (parsedNum.countryCode && props.modelValue?.startsWith?.('+'))) {\n countryCode.value = parsedNum.countryCode\n phoneNumber.value = parsedNum.number.significant\n } else {\n phoneNumber.value = props.modelValue\n }\n // set the country code dropdown value\n countryCodes.value = CountryUtils.data.allCountries.map(c => {\n return {\n ...c,\n isSelected: countryCode.value === c\n }\n })\n}\n\nfunction updateCurrentCountry(code) {\n currentCountry.value = CountryUtils.getCountryByCountryCode(code)\n}\n\nfunction validate(pncc) {\n phoneNumberHasError.value = pncc ? !parsePhoneNumber(pncc).valid : false\n phoneNumberError.value = phoneNumberHasError.value ? 'Invalid phone number' : ''\n}\n</script>\n\n<template>\n <div class=\"bs-input-phone\"\n data-component=\"bs-input-phone\"\n v-bind=\"filterAttrs($attrs, textlikeAttrs).remaining\"\n >\n <BsLabel :for=\"$attrs.id || inputId || inputIdGen\"\n :required=\"required\"\n :disabled=\"disabled\"\n :class=\"{ 'visually-hidden': hideLabel }\"\n >\n {{ label }}\n </BsLabel>\n <BsInputAddon\n :disabled=\"disabled\"\n :error=\"showErrorState\"\n :multifocus=\"true\"\n variant=\"inner-bordered\"\n >\n <button\n :id=\"countryToggleId\"\n ref=\"countryCodesToggle\"\n :aria-controls=\"countryCodesId\"\n :aria-expanded=\"showCountryCodes\"\n aria-haspopup=\"listbox\"\n :aria-label=\"countryToggleLabel\"\n :disabled=\"disabled\"\n type=\"button\"\n @click=\"showCountryCodes = !showCountryCodes\"\n >\n <span>{{ currentCountry?.flag }}</span>\n <span>+{{ countryCode }}</span>\n <BsIconCaretSort v-if=\"!disabled\" size=\"sm\" />\n </button>\n\n <BsInput\n :input-id=\"$attrs.id || inputId || inputIdGen\"\n :disabled=\"disabled\"\n :hint-id=\"hintId\"\n :placeholder=\"placeholder\"\n :value=\"phoneNumber\"\n data-autowidth\n type=\"tel\"\n v-bind=\"filterAttrs($attrs, textlikeAttrs).filtered\"\n @input=\"handlePhoneInput\"\n @focusout=\"handlePhoneBlur\"\n @keydown=\"ignoreInvalidChars\"\n />\n </BsInputAddon>\n <BsFieldDetails\n :error=\"hasError\"\n :error-msg=\"errorMsgComputed\"\n :hint=\"hint\"\n :hint-id=\"hintId\"\n v-show=\"showDetails\"\n />\n <template v-if=\"isMounted\">\n <div>\n <BsDropdownWithOptions\n :anchor-id=\"countryToggleId\"\n helper-text=\"Country Code\"\n label=\"Country Code\"\n :model-value=\"countryCode\"\n :options-id=\"countryCodesId\"\n preloaded\n :shown=\"showCountryCodes\"\n width=\"content\"\n @close=\"handleCountryCodeClose\"\n @update:model-value=\"handleCountryCodeInput\"\n >\n <template v-if=\"isMounted\">\n <BsDropdownOption v-for=\"c of countryCodes\"\n :aria-label=\"c.value\"\n :key=\"c.value\"\n :value=\"`${c.value}`\"\n variant=\"2-col\"\n >\n <span aria-hidden=\"true\" style=\"width: 1.25rem;\">\n {{ c?.flag }}\n </span>\n <span aria-hidden=\"true\">\n {{ c.label }}\n </span>\n </BsDropdownOption>\n </template>\n </BsDropdownWithOptions>\n </div>\n </template>\n </div>\n</template>\n","<script setup>\nimport { ref, watch, computed } from 'vue'\nimport BsInputSearch from '../input-search/BsInputSearch.vue'\nimport BsDropdownOptionList from '../dropdown-option-list/BsDropdownOptionList.vue'\nimport BsDropdownOptionBuilder from '../dropdown-option-builder/BsDropdownOptionBuilder.vue'\nimport BsFieldDetails from '../field-details/BsFieldDetails.vue'\nimport BsLabel from '../label/BsLabel.vue'\nimport BsSpinner from '../spinner/BsSpinner.vue'\nimport BsDropdownMultiselect from '../dropdown-multiselect/BsDropdownMultiselect.vue'\nimport BsDropdown from '../dropdown/BsDropdown.vue'\nimport { useGenIdAttrs } from '../../composables/genId.js'\n\n// PROPS\nconst props = defineProps({\n characterThreshold: {\n type: Number,\n default: 1\n },\n disabled: {\n type: Boolean,\n default: false\n },\n error: {\n type: Boolean,\n default: false\n },\n errorMsg: {\n type: String,\n default: ''\n },\n filterType: {\n type: String,\n default: 'starts-with',\n validator: (value) => ['includes', 'starts-with'].includes(value)\n },\n hideSearchIcon: {\n type: Boolean,\n default: false\n },\n hint: {\n type: String,\n default: ''\n },\n inputValue: {\n type: String,\n default: ''\n },\n internalFiltering: {\n type: Boolean,\n default: true\n },\n label: {\n type: String,\n default: ''\n },\n loading: {\n type: Boolean,\n default: false\n },\n maxOptions: {\n type: Number,\n default: undefined\n },\n multiselect: {\n type: Boolean,\n default: false\n },\n // [{ label: String, value: String, description: String, icon: String }] }\n options: {\n type: Array,\n required: true,\n },\n optionsValue: {\n type: [ String, Number, Array ],\n default: ''\n },\n placeholder: {\n type: String,\n default: ''\n },\n required: {\n type: Boolean,\n default: false\n },\n showDropdownOnFocus: {\n type: Boolean,\n default: false\n },\n typeaheadId: {\n type: String,\n default: undefined\n },\n valueIdKey: {\n type: String,\n default: 'id'\n },\n})\n\n// EMITS\nconst emit = defineEmits(['close', 'open', 'update:inputValue', 'update:optionsValue'])\n\n// REFS\nconst optionsShown = ref(false)\nconst optionSelected = ref(false)\n\n// VARS\nconst [ generatedId, generatedHintId ] = useGenIdAttrs(2)\nlet prevOptions = []\n\n// LIFECYCLE\nwatch(() => props.inputValue, () => {\n // After an option is selected, an input change occurs. This will prevent\n // the dropdown from showing again immediately after an option is selected.\n if (optionSelected.value) {\n optionSelected.value = false\n } else {\n showDropdownIfValue()\n }\n})\n\nwatch(optionsShown, () => {\n optionsShown.value\n ? emit('open')\n : emit('close')\n})\n\n// COMPUTED\nconst typeaheadIdActual = computed(() => props.typeaheadId || generatedId.value)\nconst hintMsg = computed(() => (props.error && props.errorMsg) || props.hint || undefined)\nconst inputContainerId = computed(() => `${typeaheadIdActual.value}-input-container`)\nconst inputId = computed(() => `${typeaheadIdActual.value}-input`)\nconst optionsId = computed(() => `${typeaheadIdActual.value}-options`)\nconst optionsValueActual = computed(() => {\n if (props.multiselect) {\n // Make sure optionsValue is an array for multiselect\n return Array.isArray(props.optionsValue)\n ? props.optionsValue\n : [ props.optionsValue ]\n }\n return props.optionsValue\n})\n\n// Build out / filter / highlight options\nconst modifiedOptions = computed(() => {\n if (optionsShown.value) {\n let newOptions = props.options\n const filterValue = props.inputValue.toLowerCase()\n const filterFunc = props.filterType === 'includes' ? 'includes' : 'startsWith'\n\n if (props.inputValue.length >= props.characterThreshold) {\n // Filter\n newOptions = filterOptions(newOptions, filterValue, filterFunc)\n // Limit max options\n newOptions = newOptions.slice(0, props.maxOptions)\n // Highlight\n newOptions = highlightOptions(newOptions, filterValue, filterFunc)\n\n prevOptions = newOptions\n }\n return newOptions\n } else {\n // Not showing, so return the last filtered options to prevent flicker of\n // different options while the dropdown is closing\n return prevOptions\n }\n})\n\n// METHODS\nfunction filterOptions(options, filterValue, filterFunc) {\n if (props.internalFiltering) {\n return options.filter((option) => (\n option.label.toLowerCase()[filterFunc](filterValue)\n ))\n } else {\n return options\n }\n}\n\nfunction highlightOptions(options, filterValue, filterFunc) {\n return options.map((option) => {\n let labelHtml = option.label\n if (filterValue !== '') {\n const flags = filterFunc === 'includes' ? 'gi' : 'i'\n const regex = new RegExp(`(${filterValue})`, flags)\n labelHtml = option.label.replace(regex, '<span style=\"color: var(--bs-blue-base)\">$1</span>')\n }\n return { ...option, labelHtml }\n })\n}\n\n/** Show the typeahead dropdown with show on focus prop or the character threshold is met. */\nfunction showDropdownIfValue() {\n if (props.showDropdownOnFocus) {\n optionsShown.value = true\n } else if (props.inputValue.length >= props.characterThreshold) {\n optionsShown.value = true\n } else {\n optionsShown.value = false\n }\n}\n\nfunction handleClear() {\n emit('update:inputValue', '')\n if (!props.multiselect) {\n emit('update:optionsValue', '')\n }\n document.getElementById(inputId.value).focus()\n}\n\nfunction handleSelect(ev) {\n optionSelected.value = true\n const selectedOption = modifiedOptions.value.find((option) => option.value === ev)\n emit('update:inputValue', selectedOption.label)\n emit('update:optionsValue', ev)\n}\n\nfunction handleCheck(ev) {\n const newOptionsValue = [ ...optionsValueActual.value, ev ]\n emit('update:optionsValue', newOptionsValue)\n}\n\nfunction handleUncheck(ev) {\n const newOptionsValue = optionsValueActual.value.filter((opt) => opt !== ev)\n emit('update:optionsValue', newOptionsValue)\n}\n</script>\n\n<template>\n<BsLabel\n v-if=\"label || $slots.label\"\n :for=\"inputId\"\n :disabled=\"disabled\"\n :required=\"required\"\n>\n <slot name=\"label\">\n {{ label }}\n </slot>\n</BsLabel>\n<div :id=\"inputContainerId\" class=\"typeahead-search-wrapper\">\n <BsInputSearch\n :aria-controls=\"optionsId\"\n :aria-describedby=\"hintMsg ? generatedHintId : undefined\"\n :aria-expanded=\"optionsShown\"\n aria-haspopup=\"listbox\"\n autocomplete=\"off\"\n :disabled=\"disabled\"\n :error=\"error\"\n :hide-clear=\"inputValue === ''\"\n :hide-search-icon=\"hideSearchIcon\"\n :input-id=\"inputId\"\n pass-attrs=\"aria-controls,aria-describedby,aria-expanded,role\"\n :placeholder=\"placeholder\"\n role=\"combobox\"\n :value=\"inputValue\"\n v-bind=\"$attrs\"\n @clear=\"handleClear\"\n @focusin=\"showDropdownIfValue\"\n @update:model-value=\"(ev) => emit('update:inputValue', ev)\"\n />\n</div>\n<BsDropdown\n :anchor-id=\"inputContainerId\"\n :preloaded=\"true\"\n :shown=\"optionsShown\"\n :use-mobile-style=\"false\"\n width=\"toggle\"\n @close=\"optionsShown = false\"\n>\n <BsDropdownMultiselect\n v-if=\"multiselect\"\n :focus-on-open=\"false\"\n :label=\"label\"\n :options=\"modifiedOptions\"\n :options-id=\"optionsId\"\n :selected-options=\"optionsValueActual\"\n :shown=\"optionsShown\"\n :value-id-key=\"valueIdKey\"\n @check-option=\"handleCheck\"\n @uncheck-option=\"handleUncheck\"\n >\n <template v-if=\"loading\" #no-options>\n <span style=\"display: flex; justify-content: center;\">\n <BsSpinner size=\"sm\" />\n </span>\n </template>\n <template v-else #no-options>No results found</template>\n </BsDropdownMultiselect>\n\n <BsDropdownOptionList\n v-else\n :label=\"label\"\n :model-value=\"optionsValueActual\"\n :options-id=\"optionsId\"\n :shown=\"optionsShown\"\n @update:model-value=\"handleSelect\"\n @close=\"optionsShown = false\"\n >\n <BsDropdownOptionBuilder :options=\"modifiedOptions\" :value-id-key=\"valueIdKey\">\n <template v-if=\"loading\" #no-options>\n <span style=\"display: flex; justify-content: center;\">\n <BsSpinner size=\"sm\" />\n </span>\n </template>\n <template v-else #no-options>No results found</template>\n </BsDropdownOptionBuilder>\n </BsDropdownOptionList>\n</BsDropdown>\n<div aria-live=\"polite\">\n <BsFieldDetails v-if=\"hintMsg\"\n :error=\"error\"\n :error-msg=\"errorMsg\"\n :hint=\"hint\"\n :hint-id=\"generatedHintId\"\n />\n</div>\n</template>\n\n<style>\n:where(.bs-label + .typeahead-search-wrapper) {\n margin-top: 0.25rem;\n}\n</style>\n","<script setup>\nimport { watch, onMounted, onUnmounted } from 'vue'\nimport BsEnhancedTransition from '../transition/BsEnhancedTransition.vue'\nimport useTransitionHelper from '../../composables/transitionHelper'\n\nconst props = defineProps({\n shown: {\n type: Boolean,\n default: true,\n },\n preloaded: {\n type: Boolean,\n default: false,\n },\n /** @Deprecated - Use 'preloaded' instead. */\n enterControlled: {\n type: Boolean,\n default: false,\n },\n /** @Deprecated - Use 'shown' instead. */\n enterTrigger: {\n type: Boolean,\n default: false,\n },\n /** @Deprecated - Not used anymore. Handled via 'shown'. */\n leaveTrigger: {\n type: Boolean,\n default: false,\n },\n})\n\nconst emit = defineEmits(['after-enter', 'after-leave'])\n\nconst { transition } = useTransitionHelper(props)\n\nonMounted(() => {\n setBodyScroll()\n})\n\n// Ensure there's no side effect when the component is unmounted before the transition ends\nonUnmounted(() => {\n document.body.removeAttribute('data-scroll')\n})\n\nwatch(transition, () => {\n setBodyScroll()\n})\n\nfunction setBodyScroll() {\n if (transition.value) {\n document.body.setAttribute('data-scroll', 'false')\n } else {\n document.body.removeAttribute('data-scroll')\n }\n}\n</script>\n\n<template>\n <BsEnhancedTransition\n name=\"bs-overlay\"\n :shown=\"transition\"\n :preloaded=\"preloaded\"\n @after-enter=\"emit('after-enter')\"\n @after-leave=\"emit('after-leave')\"\n >\n <div class=\"bs-overlay\" :data-shown=\"transition\" />\n </BsEnhancedTransition>\n</template>\n","<script setup>\nimport { ref, computed, useSlots } from 'vue'\nimport { BsIconClose } from '@wwtdev/bsds-icons-vue3'\nimport useKeydown from '../../composables/keydown'\nimport BsEnhancedTransition from '../transition/BsEnhancedTransition.vue'\nimport BsOverlay from '../overlay/BsOverlay.vue'\nimport useTransitionHelper from '../../composables/transitionHelper'\nimport { useGenIdAttrs } from '@composables/genId'\nimport useClickAway from '../../composables/clickAway'\n\nconst slots = useSlots()\n\nconst props = defineProps({\n modalId: {\n type: String,\n default: undefined,\n },\n title: {\n type: String,\n required: false,\n },\n shown: {\n type: Boolean,\n default: true,\n },\n preloaded: {\n type: Boolean,\n default: false,\n },\n alert: {\n type: Boolean,\n default: false,\n },\n closeButton: {\n type: Boolean,\n default: true,\n },\n /** @Deprecated - Not used anymore. Handled via 'shown'. */\n enterControlled: {\n type: Boolean,\n default: false,\n },\n /** @Deprecated - Use 'shown' instead. */\n enterTrigger: {\n type: Boolean,\n default: false,\n },\n /** @Deprecated - Not used anymore. Handled via 'shown'. */\n leaveTrigger: {\n type: Boolean,\n default: false,\n },\n fullWidth: {\n type: Boolean,\n default: false,\n },\n fullHeight: {\n type: Boolean,\n default: false,\n },\n})\n\nconst emit = defineEmits(['close', 'after-enter', 'after-leave'])\n\ndefineOptions({ inheritAttrs: false })\n\nconst { transition } = useTransitionHelper(props)\nconst [ titleId ] = useGenIdAttrs()\n\nlet isVisible = false\n\nconst modalRef = ref(null)\n\nuseClickAway([modalRef], closeModal)\nuseKeydown(['Escape'], closeModal)\n\nconst onlyHaveCloseButton = computed(() => {\n return !props.title && !slots.title && props.closeButton\n})\n\nconst haveBothTitleAndCloseButton = computed(() => {\n return (props.title || slots.title) && props.closeButton\n})\n\nfunction closeModal() {\n const hasShownChild = modalRef.value?.querySelector('[data-shown=\"true\"]') !== null\n if (isVisible && !hasShownChild) {\n emit('close', props.modalId)\n }\n}\n</script>\n\n<template>\n <BsOverlay\n :shown=\"transition\"\n :preloaded=\"preloaded\"\n :enter-controlled=\"enterControlled\"\n :enter-trigger=\"enterTrigger\"\n :leave-trigger=\"leaveTrigger\"\n />\n <BsEnhancedTransition\n name=\"bs-modal\"\n :preloaded=\"preloaded\"\n :shown=\"transition\"\n @after-enter=\"emit('after-enter')\"\n @after-leave=\"emit('after-leave')\"\n @enter=\"isVisible = true\"\n >\n <div\n :id=\"modalId\"\n class=\"bs-modal\"\n data-component=\"bs-modal\"\n :role=\"alert ? 'alertdialog' : 'dialog'\"\n :aria-labelledby=\"title && !$attrs['aria-label'] ? titleId : undefined\"\n aria-modal=\"true\"\n v-bind=\"$attrs\"\n ref=\"modalRef\"\n :data-shown=\"transition\"\n :data-full-width=\"fullWidth\"\n :data-full-height=\"fullHeight\"\n >\n <header\n v-if=\"title || $slots.title || closeButton\"\n :class=\"{\n 'only-close-button-modal-header': onlyHaveCloseButton,\n 'modal-header': haveBothTitleAndCloseButton,\n }\"\n >\n <slot name=\"title\">\n <span v-if=\"title\"\n :id=\"titleId\"\n class=\"modal-title\"\n >\n {{ title }}\n </span>\n </slot>\n <button\n v-if=\"closeButton\"\n\n type=\"button\"\n title=\"Close Modal\"\n aria-label=\"Close Modal\"\n :class=\"{ 'full-width-header-close-button': fullWidth || fullHeight }\"\n @click=\"emit('close', modalId)\"\n >\n <BsIconClose class=\"close-button\"></BsIconClose>\n </button>\n </header>\n <div>\n <slot></slot>\n </div>\n <footer\n v-if=\"$slots.footer\"\n class=\"modal-footer\"\n >\n <slot name=\"footer\"></slot>\n </footer>\n </div>\n </BsEnhancedTransition>\n</template>\n","<script setup>\n import { computed, ref, onMounted, watch } from 'vue'\n import {\n BsIconCaretLeftDouble,\n BsIconCaretLeft,\n BsIconCaretRightDouble,\n BsIconCaretRight\n } from '@wwtdev/bsds-icons-vue3'\n\n // PROPS\n const props = defineProps({\n // Used for all\n showFirstLastButtons: {\n type: Boolean,\n default: false\n },\n prevPageText: {\n type: String,\n default: undefined\n },\n firstPageText: {\n type: String,\n default: undefined\n },\n nextPageText: {\n type: String,\n default: undefined\n },\n lastPageText: {\n type: String,\n default: undefined\n },\n fixed: {\n type: Boolean,\n default: false\n },\n variant: {\n type: String,\n default: 'base',\n validator: (value) => {\n return ['base', 'group', 'results'].includes(value)\n }\n },\n /** @Deprecated - Use modelValue (or v-model) instead */\n selection: {\n type: Number,\n default: undefined\n },\n modelValue: {\n type: Number,\n default: undefined\n },\n // Used for variant=\"base\"\n centerDisplay: {\n type: String,\n default: 'numbers',\n validator: (value) => {\n return ['numbers', 'text'].includes(value)\n }\n },\n // Used for variant=\"base\", centerDisplay=\"numbers\"\n breakText: {\n type: String,\n default: '…'\n },\n // Used for variant=\"base\", centerDisplay=\"numbers\"\n pageRange: {\n type: Number,\n default: 3\n },\n // Used for variant=\"base\"\n pageCount: {\n type: Number,\n default: undefined\n },\n // Used for variant=\"base\", centerDisplay=\"text\" and variant=\"group\"\n centerLabel: {\n type: String,\n default: undefined\n },\n // Used for variant=\"group\"\n itemsPerGroup: {\n type: Number,\n default: 25\n },\n // Used for variant=\"group\"\n itemsCount: {\n type: Number,\n default: undefined\n },\n // Used for variant=\"results\"\n resultsIncrements: {\n type: String,\n default: undefined\n }\n })\n\n // EMITS\n /**\n * @Deprecated - selchange will go away in favor of update:modelValue\n * (or v-model)\n */\n const emit = defineEmits(['selchange', 'update:modelValue'])\n\n // STATE\n const valueState = ref(null)\n\n onMounted(() => {\n if (value.value) {\n // Set internal value to the prop value\n valueState.value = value.value\n } else {\n if (props.variant === 'results') {\n valueState.value = resultsNumbers.value[0]\n } else {\n valueState.value = 1\n }\n }\n })\n\n /** @Deprecated - Remove when `selection` prop is removed */\n const value = computed(() => {\n return props.modelValue || props.selection\n })\n\n /** @Deprecated - Remove when `selection` prop is removed */\n watch(() => props.selection, (newVal) => {\n valueState.value = newVal\n })\n\n // Keep internal value in sync with prop\n watch(() => props.modelValue, (newVal) => {\n valueState.value = newVal\n })\n\n // Emit change when internal value changes\n watch(valueState, (newVal, oldVal) => {\n // Don't emit on initial value set\n if (oldVal !== null) {\n emit('selchange', newVal)\n emit('update:modelValue', newVal)\n }\n })\n\n // Actual page count varies based on variant\n const actualPageCount = computed(() => {\n if (props.variant === 'group') {\n return Math.ceil(props.itemsCount / props.itemsPerGroup)\n } else if (props.variant === 'base') {\n return props.pageCount\n }\n })\n\n // Helps with a special case where `variant=\"base\"` + `centerDisplay=\"text\"`\n // uses the same style as `variant=\"group\"`, so just use that variant\n const computedVariant = computed(() => {\n if (props.variant === 'base') {\n if (props.centerDisplay === 'text') {\n return 'group'\n } else {\n return undefined\n }\n }\n return props.variant\n })\n\n function handleFirstNav() {\n valueState.value = 1\n }\n\n function handlePrevNav() {\n // Use Math.max to never go below the first page\n valueState.value = Math.max(valueState.value - 1, 1)\n }\n\n function handleNextNav() {\n // Use Math.min to never go over the pageCount\n valueState.value = Math.min(\n valueState.value + 1,\n actualPageCount.value\n )\n }\n\n function handleLastNav() {\n valueState.value = actualPageCount.value\n }\n\n const pages = computed(() => {\n // Show all pages\n if (props.pageCount <= props.pageRange) {\n return [...Array(props.pageCount + 1).keys()].slice(1)\n }\n\n // Always show first page\n const pages = [1]\n\n const offset = (props.pageRange - 1) / 2\n let left = valueState.value - offset\n let right = valueState.value + offset\n\n // Check if left goes under lower bounds\n if (left < 1) {\n // Move right by the left underflow\n right += 1 - left\n // Set left to lower bounds\n left = 1\n }\n\n // Check if right goes over upper bounds\n if (right > props.pageCount) {\n // Move left by the right overflow\n left -= right - props.pageCount\n // Set right to upper bounds\n right = props.pageCount\n }\n\n // Remove first / last page duplicates\n left = Math.max(left, 2)\n right = Math.min(right, props.pageCount - 1)\n\n // Add left ellipsis\n if (left > 2) {\n pages.push(props.breakText)\n }\n\n // Add page numbers\n for (let i = left; i <= right; i++) {\n pages.push(i)\n }\n\n // Add right ellipsis\n if (right < props.pageCount - 1) {\n pages.push(props.breakText)\n }\n\n // Always show last page\n pages.push(props.pageCount)\n\n return pages\n })\n\n const pageTextDisplay = computed(() => {\n return `${props.centerLabel ?? 'Page'} ${valueState.value} of ${actualPageCount.value}`\n })\n\n const groupTextDisplay = computed(() => {\n // valueState starts at 1 rather than 0\n const first = ((valueState.value - 1) * props.itemsPerGroup) + 1\n // Use Math.min to never go over the totalCounts\n const last = Math.min((first - 1) + props.itemsPerGroup, props.itemsCount)\n return `${props.centerLabel ?? 'Results'} ${first} - ${last} of ${props.itemsCount}`\n })\n\n const resultsNumbers = computed(() => {\n return props.resultsIncrements\n .split(',')\n .map((increment) => parseInt(increment))\n })\n</script>\n\n<template>\n <div\n class=\"bs-pagination\"\n data-component=\"bs-pagination\"\n :data-variant=\"computedVariant\"\n :data-fixed=\"props.fixed\"\n >\n <!-- Left Carets -->\n <div\n v-if=\"variant === 'base' || variant === 'group'\"\n class=\"bs-pagination-carets\"\n >\n <!-- First Button -->\n <button\n v-if=\"showFirstLastButtons\"\n type=\"button\"\n :class=\"firstPageText ? 'bs-pagination-word-caret' : undefined\"\n :aria-label=\"firstPageText ? undefined : 'First Page'\"\n :title=\"firstPageText\"\n :disabled=\"valueState === 1\"\n @click=\"handleFirstNav\"\n >\n <BsIconCaretLeftDouble />\n <span v-if=\"firstPageText\">{{ firstPageText }}</span>\n </button>\n\n <!-- Prev Button -->\n <button\n type=\"button\"\n :class=\"prevPageText ? 'bs-pagination-word-caret' : undefined\"\n :aria-label=\"prevPageText ? undefined : 'Previous Page'\"\n :title=\"prevPageText\"\n :disabled=\"valueState === 1\"\n @click=\"handlePrevNav\"\n >\n <BsIconCaretLeft />\n <span v-if=\"prevPageText\">{{ prevPageText }}</span>\n </button>\n </div>\n\n <!-- Page Numbers Display -->\n <div\n v-if=\"variant === 'base' && centerDisplay === 'numbers'\"\n class=\"bs-pagination-page-numbers\"\n >\n <button\n v-for=\"page in pages\"\n :key=\"`page-${page}-button`\"\n type=\"button\"\n :title=\"`Page ${page}`\"\n :data-selected=\"page === valueState\"\n @click=\"valueState = page\"\n >\n {{ page }}\n </button>\n </div>\n\n <!-- Page Text Display -->\n <span v-if=\"props.variant === 'base' && props.centerDisplay === 'text'\">\n {{ pageTextDisplay }}\n </span>\n\n <!-- Group Text Display -->\n <span v-if=\"props.variant === 'group'\">\n {{ groupTextDisplay }}\n </span>\n\n <!-- Results Display -->\n <template v-if=\"props.variant === 'results'\">\n <span>Results Per Page:</span>\n <div class=\"bs-pagination-results-numbers\">\n <button\n v-for=\"resultsNum in resultsNumbers\"\n type=\"button\"\n :key=\"`results-${resultsNum}`\"\n :data-selected=\"resultsNum === valueState\"\n :disabled=\"valueState === resultsNum\"\n @click=\"valueState = resultsNum\"\n >\n {{ resultsNum }}\n </button>\n </div>\n </template>\n\n <!-- Right Carets -->\n <div\n v-if=\"variant === 'base' || variant === 'group'\"\n class=\"bs-pagination-carets\"\n >\n <!-- Next Button -->\n <button\n type=\"button\"\n :class=\"nextPageText ? 'bs-pagination-word-caret' : undefined\"\n :aria-label=\"nextPageText ? undefined : 'Next Page'\"\n :title=\"nextPageText\"\n :disabled=\"valueState === actualPageCount\"\n @click=\"handleNextNav\"\n >\n <span v-if=\"nextPageText\">{{ nextPageText }}</span>\n <BsIconCaretRight />\n </button>\n\n <!-- Last Button -->\n <button\n v-if=\"showFirstLastButtons\"\n type=\"button\"\n :class=\"lastPageText ? 'bs-pagination-word-caret' : undefined\"\n :aria-label=\"lastPageText ? undefined : 'Last Page'\"\n :title=\"lastPageText\"\n :disabled=\"valueState === actualPageCount\"\n @click=\"handleLastNav\"\n >\n <span v-if=\"lastPageText\">{{ lastPageText }}</span>\n <BsIconCaretRightDouble />\n </button>\n </div>\n </div>\n</template>\n","<template>\n<component\n :is=\"rootTag\"\n class=\"bs-pill\"\n :data-active=\"active\"\n data-component=\"bs-pill\"\n :data-status=\"status || undefined\"\n :data-variant=\"variant || undefined\"\n :disabled=\"disabled\"\n :href.prop=\"hrefUrl\"\n v-bind=\"attrsToBind\"\n @click=\"onLinkClick\"\n>\n <span :data-truncate=\"truncate\">\n <slot />\n </span>\n</component>\n</template>\n\n<script setup>\nimport { computed, useAttrs } from 'vue'\nimport { useButtonOrLink } from '../../composables/buttonOrLink.js'\nimport { useClientRouter } from '../../composables/clientRouter.js'\n\nconst props = defineProps({\n active: { type : Boolean, default: false },\n disabled: { type: Boolean, default: false },\n /** @DEPRECATED in favor of linkTo */\n href: { type: String },\n linkTo: { type: String },\n router: {},\n status: {\n type: String,\n /** option 'inactive' is DEPRECATED */\n validator: val => ['active', 'complete', 'disabled', 'inactive', 'error', 'warning', 'positive'].includes(val)\n },\n truncate: {\n type: Boolean,\n default: true\n },\n variant: {\n type: String,\n validator: val => ['filter','filter-add','filter-remove','inactive','live'].includes(val)\n },\n})\n\ndefineOptions({ inheritAttrs: false })\n\nconst { onLinkClick } = useClientRouter(props)\n\nconst $attrs = useAttrs()\n\nconst { rootTag, attrsToBind, hrefUrl } = useButtonOrLink(props, $attrs, 'span')\n\n</script>\n<style>\n:where([data-component=\"bs-pill\"]) {\n display: inline-block;\n max-width: 100%;\n}\n</style>\n","<script setup>\nimport { useDynamicIcon } from '../../composables/_composables.js'\n\nconst props = defineProps({\n profileName: {\n type: String,\n required: true\n },\n company: String,\n jobTitle: String,\n email: String,\n action: String,\n actionIcon: String,\n miscMeta: String,\n miscMetaIcon: String\n})\nconst emit = defineEmits(['action-toggled'])\nconst { icon: actionIconTag } = useDynamicIcon(props, 'actionIcon')\nconst { icon: metaIconTag } = useDynamicIcon(props, 'miscMetaIcon')\n\nfunction handleActionToggle(e) {\n if (e.target.tagName !== 'BUTTON') return\n e.preventDefault()\n e.stopImmediatePropagation()\n emit('action-toggled')\n}\n</script>\n\n<template>\n<div class=\"bs-profile-details\" data-component=\"bs-profile-details\">\n <!-- optional action button (e.g. follow) -->\n <button v-if=\"action || $slots.action\"\n data-icon=\"true\"\n @click=\"handleActionToggle\"\n >\n <slot name=\"action\">\n <component v-if=\"actionIcon\"\n :is=\"actionIconTag ? actionIconTag : 'span'\"\n class=\"bs-icon\"\n />\n {{ action }}\n </slot>\n </button>\n\n <!-- standard details -->\n <span class=\"bs-profile-name\" data-size=\"sm\" data-weight=\"bold\">\n {{ profileName }}\n </span>\n <span data-weight=\"bold\" v-if=\"company\">{{ company }}</span>\n <span v-if=\"jobTitle\">{{ jobTitle }}</span>\n <span v-if=\"email\">{{ email }}</span>\n\n <!-- optional misc/meta (e.g. event attendee type) -->\n <span data-icon=\"true\" v-if=\"miscMeta || $slots.misc\">\n <slot name=\"misc\">\n <component v-if=\"miscMetaIcon\"\n :is=\"metaIconTag ? metaIconTag : 'span'\"\n class=\"bs-icon\"\n />\n {{ miscMeta }}\n </slot>\n </span>\n</div>\n</template>\n","<script setup>\nimport { computed, useAttrs } from 'vue'\nimport { useButtonOrLink } from '../../composables/buttonOrLink.js'\nimport { useClientRouter } from '../../composables/clientRouter.js'\nimport BsProfileDetails from '../profile-details/BsProfileDetails.vue'\nimport BsProfileImg from '../profile-img/BsProfileImg.vue'\n\nconst props = defineProps({\n layout: {\n type: String,\n default: 'vertical',\n validator: (value) => ['horizontal', 'vertical'].includes(value)\n },\n /** @DEPRECATED in favor of linkTo */\n href: String,\n imageSrc: String,\n imageSize: {\n type: String,\n default: 'lg',\n validator: (value) => ['xs', 'sm', 'md', 'lg', 'xl'].includes(value)\n },\n initials: String,\n linkTo: String,\n profileName: String,\n company: String,\n jobTitle: String,\n email: String,\n action: String,\n actionIcon: String,\n miscMeta: String,\n miscMetaIcon: String,\n router: Object\n})\n\nconst emit = defineEmits(['action-toggled'])\n\ndefineOptions({ inheritAttrs: false })\nconst $attrs = useAttrs()\n\nconst { onLinkClick } = useClientRouter(props)\nconst { rootTag, attrsToBind, hrefUrl } = useButtonOrLink(props, $attrs, 'div')\n// const rootTag = computed(() => linkUrl.value ? 'a' : 'div')\n\n// TODO: Refactor. This is not strictly valid HTML since we're\n// potentially nesting a button inside an anchor tag (in profile details).\n// But fixing it now would require a styles overhaul; keeping as is for now\n// in the interest of a quick conversion to vue.\n</script>\n\n<template>\n<component :is=\"rootTag\"\n class=\"bs-profile\"\n :href.prop=\"hrefUrl\"\n data-component=\"bs-profile\"\n :data-layout=\"layout\"\n v-bind=\"attrsToBind\"\n @click=\"onLinkClick\"\n>\n <BsProfileImg\n :src=\"imageSrc\"\n :size=\"imageSize\"\n :initials=\"initials\"\n :profile-name=\"profileName\"\n :use-alt-text=\"false\"\n />\n <BsProfileDetails\n :profile-name=\"profileName\"\n :company=\"company\"\n :job-title=\"jobTitle\"\n :email=\"email\"\n :action=\"action\"\n :action-icon=\"actionIcon\"\n :misc-meta=\"miscMeta\"\n :misc-meta-icon=\"miscMetaIcon\"\n @action-toggled=\"emit('action-toggled')\"\n >\n <template #action>\n <slot name=\"action\" />\n </template>\n <template #misc>\n <slot name=\"misc\" />\n </template>\n </BsProfileDetails>\n</component>\n</template>\n","import { computed } from 'vue'\n\n// this is shared by timeline, progress bar\n\n/**\n * @typedef {import('../components/Types.vue').Progress.Status} Status\n * @typedef {import('../components/Types.vue').Progress.Step} Step\n */\n// JSDoc why - can import the types from sfc into here but not vice versa\n\n/**\n * @param {Object} props\n * @param {Array<Step|string>} props.steps\n * @param {Number} props.currentStep\n * @param {String} props.currentStatus\n */\nexport function useSteps(props) {\n const progressStep = computed(() => {\n switch(props.currentStatus) {\n case undefined:\n case null:\n case '':\n return props.steps.filter(step => step.status === 'complete')?.length\n case 'complete':\n return props.steps.length\n case 'in-progress':\n return props.currentStep\n default:\n return props.currentStep\n }\n })\n\n const progressText = computed(() => {\n return `${progressStep.value} of ${props.steps.length} completed.`\n })\n\n\n function getStatus(status, idx) {\n if (status) return status\n\n if (props.currentStatus) {\n if (idx < props.currentStep) {\n return 'complete'\n } else if (idx === props.currentStep) {\n return props.currentStatus\n } else {\n return 'not-started'\n }\n }\n\n return 'not-started'\n }\n\n return {\n progressStep,\n progressText,\n getStatus\n }\n}\n","<script setup>\nimport { useSteps } from '@composables/steps'\n\n/**\n * @typedef {import('../Types.vue').Progress.Status} Status\n * @typedef {import('../Types.vue').Progress.Step} Step\n */\n\nconst props = defineProps({\n /** @type {Status} */\n currentStatus: {\n type: String,\n validator: (value) => {\n return [\n 'cancelled',\n 'complete',\n 'error',\n 'in-progress',\n 'not-started',\n 'ongoing',\n 'paused',\n 'warning',\n ].includes(value)\n }\n },\n currentStep: {\n type: Number,\n default: 0\n },\n /** @type {Array<Step|string>} */\n steps: {\n type: Array,\n required: true\n },\n})\n\nconst { progressStep, progressText, getStatus } = useSteps(props)\n\n</script>\n<template>\n<div\n :aria-valuemax=\"steps.length\"\n :aria-valuenow=\"progressStep\"\n :aria-valuetext=\"progressText\"\n class=\"bs-progress-bar\"\n data-component=\"bs-progress-bar\"\n role=\"progressbar\"\n>\n <div v-for=\"(step, idx) in steps\"\n class=\"bs-step-item\"\n :data-status=\"getStatus(step.status, idx)\"\n data-variant=\"progress\"\n :key=\"step.id || step.label\"\n role=\"status\"\n >\n <span>\n {{ step.label || step }} : {{ getStatus(step.status, idx) || 'not started' }}\n </span>\n </div>\n</div>\n</template>\n\n","<script setup>\nimport { computed } from 'vue'\nimport { useGenIdAttrs } from '@composables/genId.js'\nimport { filterAttrs, boolAttrs } from '@utils/filterAttrs.js'\nimport BsLabel from '../label/BsLabel.vue'\n\nconst props = defineProps({\n label: {\n type: String,\n },\n checked: {\n type: Boolean,\n default: false,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n error: {\n type: Boolean,\n default: false,\n },\n inputId: {\n type: String,\n default: '',\n },\n passAttrs: {\n type: String,\n default: '',\n },\n required: {\n type: Boolean,\n default: false,\n },\n size: {\n type: String,\n validator: (value) => value === 'sm',\n },\n value: {\n type: String,\n required: true\n },\n modelValue: {\n type: String\n },\n})\n\nconst emit = defineEmits(['update:modelValue'])\n\n// allocate attributes to root and/or child elements\ndefineOptions({ inheritAttrs: false })\nconst [ inputIdGen ] = useGenIdAttrs()\n\n// Computed Properties\nconst attrFilter = computed(() => boolAttrs.concat(props.passAttrs.split(',')))\nconst inputIdAttr = computed(() => props.inputId || inputIdGen.value)\nconst isChecked = computed(() => props.checked || (props.modelValue && props.modelValue === props.value))\n\n</script>\n\n<template>\n <div class=\"bs-boolean\"\n data-component=\"bs-radio\"\n :data-disabled=\"disabled\"\n :data-error=\"error\"\n :data-size=\"size\"\n v-bind=\"filterAttrs($attrs, attrFilter).remaining\"\n >\n <input\n :checked=\"isChecked\"\n :disabled=\"disabled\"\n :id=\"$attrs.id || inputIdAttr\"\n :required=\"required\"\n type=\"radio\"\n :value=\"value\"\n :data-error=\"error\"\n v-bind=\"filterAttrs($attrs, attrFilter).filtered\"\n @change=\"(e) => $emit('update:modelValue', e.target['value'])\"\n />\n <BsLabel v-if=\"label || $slots.label\"\n :for=\"$attrs.id || inputIdAttr\"\n :disabled=\"disabled\"\n :required=\"required\"\n >\n <slot name=\"label\">\n {{ label }}\n </slot>\n </BsLabel>\n </div>\n</template>\n","<script setup>\nimport { computed } from 'vue'\n\nconst props = defineProps({\n disabled: {type: Boolean, default: false},\n error: { type: Boolean, default: false },\n hintId: { type: String },\n inputId: { type: String },\n modelValue: [ String, Number ],\n required: { type: Boolean, default: false },\n value: [ String, Number ]\n})\nconst emit = defineEmits(['update:modelValue'])\n\nconst aria = computed(() => {\n return {[ props.error ? 'aria-errormessage' : 'aria-describedby'] : props.hintId }\n})\n</script>\n<template>\n <select\n :id=\"$attrs.id || inputId\"\n class=\"bs-select\"\n data-component=\"bs-select\"\n :disabled=\"disabled\"\n :required=\"required\"\n :data-error=\"error\"\n :value=\"value || modelValue\"\n v-bind=\"aria\"\n @change=\"(e) => $emit('update:modelValue', e.target.value)\"\n >\n <slot />\n </select>\n</template>\n","<script setup>\nimport { computed } from 'vue'\nimport { useGenIdAttrs } from '@composables/genId.js'\nimport { filterAttrs, selectAttrs } from '@utils/filterAttrs.js'\nimport BsFieldDetails from '../field-details/BsFieldDetails.vue'\nimport BsLabel from '../label/BsLabel.vue'\nimport BsSelect from '../select/BsSelect.vue'\n\n\n// Props\nconst props = defineProps({\n data: {\n type: Array,\n default: () => [],\n },\n /** Sets the disabled state on input, disabled styles on label. */\n disabled: {\n type: Boolean,\n default: false,\n },\n /** Applies error styles to the input. */\n error: {\n type: Boolean,\n default: false,\n },\n /** Pass error text. */\n errorMsg: String,\n /** Pass helper text. */\n hint: String,\n /** @Deprecated Use `hint` and/or `errorMsg`. */\n hints: [ String, Array ],\n /** Pass id for the input element. Will also be applied to label attribute. */\n inputId: String,\n /** Pass label text. */\n label: { type: String },\n passAttrs: {\n type: String,\n default: '',\n },\n /** Placeholder attribute for `<input>`. */\n placeholder: String,\n /** Sets the required state on the input, append required* indicator to label. */\n required: {\n type: Boolean,\n default: false,\n },\n /** Sets the select value - do not use if using `v-model`. */\n value: [ String, Number ],\n /** Sets the select value - `v-model` directive will use this; do not set explicitly. */\n modelValue: [ String, Number ]\n})\n\n// allocate attributes to root and/or child elements\ndefineOptions({ inheritAttrs: false })\nconst [ inputIdGen, hintId ] = useGenIdAttrs(2)\n\n// Computed Properties\nconst attrFilter = computed(() => selectAttrs.concat(props.passAttrs.split(',')))\nconst hintDeprecated = computed(() => props.hints?.join?.(\"\\n\") || props.hints)\nconst hintMsg = computed(() => (\n (props.error && props.errorMsg) || props.hint || hintDeprecated.value || undefined\n))\nconst inputIdAttr = computed(() => props.inputId || inputIdGen.value)\nconst selectedVal = computed(() => props.value || props.modelValue)\n</script>\n\n<template>\n<div data-component=\"bs-select-field\" v-bind=\"filterAttrs($attrs, attrFilter).remaining\">\n <BsLabel v-if=\"label || $slots.label\"\n :for=\"$attrs.id || inputIdAttr\"\n :disabled=\"disabled\"\n :required=\"required\"\n >\n <slot name=\"label\">\n {{ label }}\n </slot>\n </BsLabel>\n\n <BsSelect\n :disabled=\"disabled\"\n :error=\"error\"\n :hint-id=\"hintId\"\n :input-id=\"$attrs.id || inputIdAttr\"\n :required=\"required\"\n :value=\"selectedVal\"\n @update:modelValue=\"$event => $emit('update:modelValue', $event)\"\n v-bind=\"filterAttrs($attrs, attrFilter).filtered\"\n >\n <option :selected=\"!selectedVal\" value=\"\" :disabled=\"!!selectedVal\">\n {{ disabled ? '' : placeholder }}\n </option>\n <option v-for=\"option in data\"\n :key=\"option.value\"\n :disabled=\"option.disabled\"\n :selected=\"selectedVal === option.value\"\n :value=\"option.value\"\n >\n {{ option.label }}\n </option>\n </BsSelect>\n\n <BsFieldDetails v-if=\"hintMsg\"\n :data-disabled=\"disabled\"\n :error=\"error\"\n :error-msg=\"errorMsg\"\n :hint=\"hint || hintDeprecated\"\n :hint-id=\"hintId\"\n />\n</div>\n</template>\n<style>\n:where([data-component=\"bs-select-field\"]) {\n display: block;\n width: 100%;\n}\n</style>\n","<script setup>\nimport { computed, ref, toValue, useAttrs } from 'vue'\nimport { useGenIdAttrs } from '@composables/genId.js'\nimport BsDropdownWithToggle from '@components/dropdown-with-toggle/BsDropdownWithToggle.vue'\nimport BsLabel from '@components/label/BsLabel.vue'\nimport { BsIconCaretDown } from '@wwtdev/bsds-icons-vue3'\n\nconst props = defineProps({\n breakout: {\n type: Boolean,\n default: false\n },\n disabled: {\n type: Boolean,\n default: false\n },\n dropdownPosition: {\n type: String,\n default: '',\n validator: (value) => {\n return ['', 'top', 'center', 'right'].includes(value)\n },\n },\n dropdownWidth: {\n type: String,\n default: 'anchor',\n validator: (value) => {\n return ['', 'sm', 'md', 'lg', 'content', 'anchor'].includes(value)\n },\n },\n error: {\n type: Boolean,\n default: false\n },\n helperDescription: {\n type: String,\n default: undefined\n },\n helperText: {\n type: String,\n default: undefined\n },\n hintId: {\n type: String,\n default: undefined\n },\n inputId: {\n type: String,\n default: undefined\n },\n inputName: {\n type: String,\n default: undefined\n },\n label: {\n type: String,\n default: undefined\n },\n modelValue: {\n type: String,\n default: ''\n },\n options: {\n type: Array,\n required: true\n },\n optionsId: {\n type: String,\n default: undefined\n },\n placeholder: {\n type: String,\n default: 'Select an option'\n },\n required: {\n type: Boolean,\n default: false\n },\n selectId: {\n type: String,\n default: undefined\n },\n valueIdKey: {\n type: String,\n default: 'id'\n },\n})\nconst emit = defineEmits(['update:model-value'])\n\nconst [ selectIdGen, optionsIdGen ] = useGenIdAttrs(2)\nconst attrs = useAttrs()\n\nconst isOpen = ref(false)\n\nconst selectIdComp = computed(() => {\n return props.selectId || attrs.id || selectIdGen.value\n})\n\nconst optionsIdComp = computed(() => props.optionsId || optionsIdGen.value)\n\nconst buttonText = computed(() => {\n if (props.modelValue) {\n const option = props.options.find((option) => {\n return typeof option.value?.[props.valueIdKey] == 'undefined'\n ? option.value === props.modelValue\n : option.value[props.valueIdKey] === props.modelValue?.[props.valueIdKey]\n })\n return option ? option.label : props.placeholder\n }\n return props.placeholder\n})\n\nconst placeholderShown = computed(() => {\n return buttonText.value === props.placeholder\n})\n\ndefineOptions({ inheritAttrs: false })\n</script>\n\n<template>\n<div>\n <BsLabel\n v-if=\"label || $slots.label\"\n :disabled=\"disabled\"\n :for=\"selectIdComp\"\n :required=\"required\"\n >\n <slot name=\"label\">\n {{ label }}\n </slot>\n </BsLabel>\n\n <input\n v-if=\"inputName || inputId\"\n :id=\"inputId\"\n :name=\"inputName\"\n type=\"hidden\"\n :value=\"modelValue\"\n />\n\n <BsDropdownWithToggle\n :anchor-id=\"selectIdComp\"\n :breakout=\"breakout\"\n :dropdown-position=\"dropdownPosition\"\n :dropdown-width=\"dropdownWidth\"\n :helper-description=\"helperDescription\"\n :helper-text=\"helperText\"\n :multiselect=\"false\"\n :open=\"isOpen\"\n :options-id=\"optionsIdComp\"\n :options=\"options\"\n :selected-option=\"modelValue\"\n :toggle-id=\"selectIdComp\"\n :value-id-key=\"valueIdKey\"\n @close=\"isOpen = false\"\n @update:selected-option=\"(ev) => emit('update:model-value', ev)\"\n >\n <template #toggle>\n <button\n :aria-controls=\"optionsIdComp\"\n :aria-describedby=\"hintId\"\n :aria-expanded=\"isOpen\"\n aria-haspopup=\"listbox\"\n :aria-invalid=\"error\"\n :aria-label=\"`${isOpen ? 'Close' : 'Open'} Combobox`\"\n class=\"bs-select\"\n :data-cy=\"placeholderShown ? 'ignore' : undefined\"\n :data-disabled=\"disabled\"\n :data-error=\"error\"\n :data-open=\"isOpen\"\n :data-placeholder=\"placeholderShown\"\n :data-required=\"required\"\n :disabled=\"disabled\"\n :id=\"selectIdComp\"\n role=\"combobox\"\n v-bind=\"$attrs\"\n @click.prevent=\"isOpen = !isOpen\"\n >\n <span>{{ buttonText }}</span>\n <BsIconCaretDown v-if=\"!disabled\" size=\"md\" />\n </button>\n </template>\n </BsDropdownWithToggle>\n</div>\n</template>\n","<script setup>\nimport { computed } from 'vue'\nimport { useGenIdAttrs } from '../../composables/genId.js'\nimport { filterAttrs, boolAttrs } from '@utils/filterAttrs.js'\nimport BsLabel from '../label/BsLabel.vue'\n\nconst props = defineProps({\n checked: {\n type: Boolean,\n default: false,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n hideLabel: {\n type: Boolean,\n default: false,\n },\n inputId: {\n type: String,\n default: ''\n },\n innerOnLabel: {\n type: String\n },\n innerOffLabel: {\n type: String\n },\n label: {\n type: String\n },\n passAttrs: {\n type: String,\n default: '',\n },\n pending: {\n type: Boolean,\n default: false,\n },\n size: {\n type: String,\n validator: (value) => value === 'sm',\n },\n modelValue: {\n type: Boolean\n },\n})\n\nconst emit = defineEmits(['update:modelValue'])\n\n// allocate attributes to root and/or child elements\ndefineOptions({ inheritAttrs: false })\nconst [ inputIdGen ] = useGenIdAttrs()\n// Computed Properties\nconst attrFilter = computed(() => boolAttrs.concat(props.passAttrs.split(',')))\nconst inputIdAttr = computed(() => props.inputId || inputIdGen.value)\nconst isChecked = computed(() => props.checked || props.modelValue)\n\n</script>\n\n<template>\n<div class=\"bs-boolean\"\n data-component=\"bs-switch\"\n :data-disabled=\"disabled\"\n :data-size=\"size\"\n v-bind=\"filterAttrs($attrs, attrFilter).remaining\"\n>\n <BsLabel v-if=\"label || $slots.label\"\n :for=\"$attrs.id || inputIdAttr\"\n :disabled=\"disabled\"\n :hide=\"hideLabel\"\n >\n <slot name=\"label\">\n {{ label }}\n </slot>\n </BsLabel>\n <div class=\"bs-switch\"\n :data-disabled=\"disabled\"\n :data-pending=\"pending\"\n :data-size=\"size\"\n >\n <input\n :checked=\"isChecked\"\n :disabled=\"disabled\"\n :id=\"$attrs.id || inputIdAttr\"\n type=\"checkbox\"\n v-bind=\"filterAttrs($attrs, attrFilter).filtered\"\n @change=\"(e) => emit('update:modelValue', e.target['checked'])\"\n />\n <span\n aria-hidden=\"true\"\n :data-inner-on-label=\"innerOnLabel\"\n :data-inner-off-label=\"innerOffLabel\"\n ></span>\n </div>\n</div>\n</template>\n","<template>\n <div\n :aria-controls=\"panelIdComputed\"\n :aria-selected=\"isActive ? 'true' : 'false'\"\n :data-hidden=\"hidden || undefined\"\n data-component=\"bs-tab\"\n role=\"tab\"\n tabindex=\"0\"\n ref=\"hostEl\"\n @click=\"handleTabSelection\"\n @keydown=\"handleKeydown\"\n >\n <slot />\n </div>\n</template>\n\n<script setup>\nimport { computed, ref, useAttrs } from \"vue\"\n\nconst props = defineProps({\n activeTabId: {\n type: String,\n required: true,\n },\n hidden: {\n type: Boolean,\n default: false,\n },\n panelId: {\n type: String\n },\n})\nconst emit = defineEmits([\"tabClick\"])\n\nconst attrs = useAttrs()\n\nconst hostEl = ref()\nconst isActive = computed(() => props.activeTabId === attrs.id)\nconst panelIdComputed = computed(() => props.panelId || `${attrs.id}-panel`)\n\nfunction handleKeydown(e) {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault()\n e.stopPropagation()\n handleTabSelection()\n }\n}\nfunction handleTabSelection() {\n if (props.activeTabId !== attrs.id) {\n const ev = new CustomEvent(\"tabClick\", { detail: attrs.id, bubbles: true })\n hostEl.value.dispatchEvent(ev)\n }\n}\n</script>\n","<script setup>\nimport { computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue'\nimport BsDropdownOption from '../dropdown-option/BsDropdownOption.vue'\nimport BsDropdownWithOptions from '../dropdown-with-options/BsDropdownWithOptions.vue'\nimport { BsIconActionEllipsis } from '@wwtdev/bsds-icons-vue3'\nimport { useGenIdAttrs } from '../../composables/_composables.js'\nimport { debounce } from '@utils/debounce.js'\n\nconst props = defineProps({\n activeTabId: { type: String, required: true },\n helperText: {type: String, default: 'Select a tab'},\n helperDescription: { type: String },\n modelValue: { type: String },\n withBsTabs: { type: Boolean, default: true },\n})\nconst emit = defineEmits(['tabChange','update:modelValue'])\n\nconst DEFAULT_TOGGLE_WIDTH = 73\nconst ELLIPSIS_WIDTH = 20\nconst TAB_GAP = 16\n\n// state\nconst adaptedToWidth = ref(false)\nconst dropdownMounted = ref(false)\nconst hiddenTabs = ref([])\nconst showDropdown = ref(false)\nconst showDropdownToggle = ref(false)\nconst hostEl = ref()\n\nconst accumulatedWidths = ref([]) //number[] = []\nconst activeLineInitialized = ref(false)\nconst allTabs = ref([]) //HTMLElement[]\n\nconst dropdownToggle = ref() // HTMLButtonElement\nconst navigableTabs = ref([])\nconst resizeObserver = ref() // ResizeObserver\nconst totalWidth = ref() // number\nconst [ tabListAutoId, dropdownId ] = useGenIdAttrs(2)\nlet adaptToWidthTimeoutId\n\n// computed\nconst activeTabIdx = computed(() => {\n if (props.activeTabId) return allTabs.value.findIndex(t => t.id === props.activeTabId)\n return 0\n})\n\nconst activeTabIsHidden = computed(() => {\n return hiddenTabs.value.some(t => t.id === props.activeTabId)\n})\n\nconst dropdownOptionsId = computed(() => {\n return `${dropdownId.value}-options`\n})\nconst dropdownToggleId = computed(() => {\n return `${dropdownId.value}-toggle`\n})\n\nconst dropdownToggleText = computed(() => {\n return activeTabIsHidden.value ? allTabs.value[activeTabIdx.value]?.textContent : 'More'\n})\n\nconst dropdownToggleWidth = computed(() => {\n if (activeTabIsHidden.value) return (\n accumulatedWidths.value[activeTabIdx.value] -\n accumulatedWidths.value[activeTabIdx.value - 1] +\n ELLIPSIS_WIDTH +\n TAB_GAP\n )\n return DEFAULT_TOGGLE_WIDTH + TAB_GAP\n})\n\nfunction adaptToWidth() {\n let showToggle = false\n let tab // HTMLElement\n let thresholdWidth = 0\n let thresholdReached = false\n let tabsToHide = []\n if (!allTabs.value?.length) return\n\n for (let i = 0; i < allTabs.value.length; i++) {\n tab = allTabs.value[i]\n tab.setAttribute('tabindex', '-1')\n if (thresholdReached && i !== activeTabIdx.value) {\n tab.dataset.hidden = 'true'\n tabsToHide.push(tab)\n continue\n }\n thresholdWidth = i < allTabs.value.length - 1 ? totalWidth.value - dropdownToggleWidth.value : totalWidth.value\n\n if (accumulatedWidths.value[i] > thresholdWidth) {\n tab.dataset.hidden = 'true'\n tabsToHide.push(tab)\n showToggle = true\n thresholdReached = true\n continue\n }\n tab.dataset.hidden = 'false'\n tab.setAttribute('tabindex', '0')\n }\n\n showDropdownToggle.value = showToggle\n hiddenTabs.value = tabsToHide\n if (!adaptedToWidth.value) nextTick(() => adaptedToWidth.value = true)\n adaptToWidthTimeoutId = setTimeout(() => {\n if (!hostEl.value) return\n setNavigableTabs()\n moveActiveLine()\n activeLineInitialized.value = true\n }, activeLineInitialized.value ? 25 : 1000)\n}\n\nfunction adaptToWidthCleanup() {\n clearTimeout(adaptToWidthTimeoutId)\n}\n\nfunction cleanup() {\n adaptToWidthCleanup()\n observerCleanup()\n}\n\nfunction fireTabChange(tabId) {\n emit('tabChange', tabId)\n emit('update:modelValue', tabId)\n}\n\nfunction getTabWidth(tabIdx) {\n const actualWidth = allTabs.value[tabIdx]?.getBoundingClientRect?.()?.width\n if (actualWidth) return actualWidth\n const approxWidth = (tabIdx === 0) ? accumulatedWidths.value[0] : accumulatedWidths.value[tabIdx] - accumulatedWidths.value[tabIdx - 1]\n return approxWidth || 0\n}\n\nfunction handleActiveTabIdChange() {\n allTabs.value[activeTabIdx.value]?.setAttribute('aria-selected', 'true')\n adaptToWidth()\n}\n\nfunction handleDropdownClose() {\n dropdownToggle.value?.focus()\n showDropdown.value = false\n}\n\nfunction handleDropdownToggleClick() {\n showDropdown.value = !showDropdown.value\n if (!dropdownMounted.value) dropdownMounted.value = true\n}\n\nfunction handleDropdownOptionSelect(tabId) {\n showDropdown.value = false\n dropdownToggle.value?.focus()\n fireTabChange(tabId)\n}\n\nfunction handleTabClick(event) {\n if (props.withBsTabs) return\n\n const tab = event.target.closest('[role=\"tab\"]')\n if (!tab || tab.getAttribute('aria-selected') === 'true') return\n const tabId = tab.getAttribute('id')\n fireTabChange(tabId)\n}\n\nfunction handleTabNav(e) {\n if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') {\n const tabIdx = navigableTabs.value.findIndex(t => t.id === e.target.id)\n if (tabIdx === -1) return\n e.preventDefault()\n e.stopPropagation()\n e.key === 'ArrowLeft' ? handleTabPrevious(tabIdx) : handleTabNext(tabIdx)\n }\n}\n\nfunction handleTabNext(tabIdx) {\n const nextIdx = (tabIdx + 1) % navigableTabs.value.length\n navigableTabs.value[nextIdx]?.focus()\n}\n\nfunction handleTabPrevious(tabIdx) {\n const prevIdx = tabIdx === 0 ? navigableTabs.value.length - 1 : tabIdx - 1\n navigableTabs.value[prevIdx]?.focus()\n}\n\n/** This controls the underline (active tab indicator) */\nfunction moveActiveLine() {\n const prevOffset = parseInt(hostEl.value.style.getPropertyValue('--active-line-offset')) || 0\n const max = totalWidth.value\n let duration = 300\n let offsetPx = navigableTabs.value?.[activeTabIdx.value]?.offsetLeft || 0\n let scaleNum = getTabWidth(activeTabIdx.value)\n if (showDropdownToggle.value && activeTabIsHidden.value) {\n offsetPx = dropdownToggle.value?.offsetLeft\n scaleNum = dropdownToggle.value?.offsetWidth\n }\n duration = Math.max(Math.abs((offsetPx - prevOffset) / max * 300), 100)\n hostEl.value.style.setProperty('--active-line-max-width', `${max}px`)\n hostEl.value.style.setProperty('--active-line-scale', `${scaleNum / max}`)\n hostEl.value.style.setProperty('--active-line-offset', `${offsetPx}px`)\n hostEl.value.style.setProperty('--active-line-transition-duration', `${duration}ms`)\n}\n\nfunction observerCleanup() {\n resizeObserver.value?.disconnect?.()\n resizeObserver.value = null\n}\n\nfunction resizeObserverSetup() {\n const cb = debounce(() => {\n totalWidth.value = hostEl?.value?.clientWidth\n adaptToWidth()\n }, 25)\n resizeObserver.value = new ResizeObserver(cb)\n resizeObserver.value.observe(document.body)\n if (hostEl.value) {\n resizeObserver.value.observe(hostEl.value)\n }\n}\n\nfunction setAllTabs() {\n allTabs.value = Array.from(hostEl.value.children).filter(c => c.role === 'tab')\n}\n\nfunction setAccumlulatedWidths() {\n let tabWidth\n let maxTabWidth = 0\n allTabs.value.forEach((t, i) => {\n tabWidth = t.getBoundingClientRect().width + TAB_GAP\n maxTabWidth = Math.max(maxTabWidth, tabWidth)\n accumulatedWidths.value.push(i ? tabWidth + accumulatedWidths.value[i - 1] : tabWidth)\n })\n}\n\nfunction setNavigableTabs() {\n let tabs = []\n if (typeof window === 'undefined') return tabs\n for (let tab of allTabs.value) {\n if (tab.dataset?.hidden === 'true' || tab.dataset?.hidden === '' || tab.getAttribute('tabindex') === '-1') break\n tabs.push(tab)\n }\n if (showDropdownToggle.value) tabs.push(hostEl.value.querySelector('.bs-tab-list-toggle'))\n navigableTabs.value = tabs\n}\n\nwatch(() => props.activeTabId, handleActiveTabIdChange)\n\nonMounted(() => {\n try {\n setAllTabs()\n setAccumlulatedWidths()\n resizeObserverSetup()\n totalWidth.value = hostEl.value.getBoundingClientRect().width\n adaptToWidth()\n if (!props.withBsTabs) {\n allTabs.value[activeTabIdx.value]?.setAttribute('aria-selected', 'true')\n }\n } catch(err) {\n console.log('tab error', err)\n }\n})\n\nonUnmounted(cleanup)\n\n</script>\n\n<template>\n <div\n class=\"bs-tab-list\"\n data-component=\"bs-tab-list\"\n :id=\"$attrs.id || tabListAutoId\"\n ref=\"hostEl\"\n role=\"tablist\"\n :data-resizing=\"!adaptedToWidth || undefined\"\n @click=\"handleTabClick\"\n @tabClick=\"e => fireTabChange(e.detail)\"\n @keydown=\"handleTabNav\"\n >\n <slot />\n\n <button\n :aria-controls=\"dropdownId\"\n :aria-expanded=\"showDropdown\"\n class=\"bs-tab-list-toggle\"\n :data-active=\"activeTabIsHidden || undefined\"\n :data-hidden=\"!showDropdownToggle\"\n :id=\"dropdownToggleId\"\n ref=\"dropdownToggle\"\n @click=\"handleDropdownToggleClick\"\n >\n <BsIconActionEllipsis size=\"sm\" />\n {{ dropdownToggleText }}\n </button>\n <BsDropdownWithOptions\n :anchor-id=\"dropdownToggleId\"\n :container-id=\"$attrs.id || tabListAutoId\"\n :helper-description=\"helperDescription || undefined\"\n :helper-text=\"helperText\"\n :id=\"dropdownId\"\n :options-id=\"dropdownOptionsId\"\n position=\"right\"\n preloaded\n :shown=\"showDropdown\"\n width=\"content\"\n @close=\"handleDropdownClose\"\n @update:model-value=\"handleDropdownOptionSelect\"\n >\n <BsDropdownOption v-for=\"t of hiddenTabs\" :key=\"t.id\"\n :value=\"t.id\"\n :options-id=\"dropdownOptionsId\"\n >\n {{ t.textContent }}\n </BsDropdownOption>\n </BsDropdownWithOptions>\n </div>\n</template>\n","<script setup>\nimport { computed, useAttrs } from 'vue'\n\n// Props\nconst props = defineProps({\n activeTabId: {\n type: String,\n required: true\n },\n tabId: {\n type: String,\n required: true\n },\n})\n\nconst $attrs = useAttrs()\n\n// Computed Properties\nconst isActive = computed(() => props.activeTabId && props.activeTabId === props.tabId)\nconst panelId = computed(() => $attrs.id || `${props.tabId}-panel`)\n</script>\n\n<template>\n <section\n :aria-labelledby=\"tabId\"\n :data-active=\"isActive\"\n data-component=\"bs-tab-panel\"\n :id=\"panelId\"\n role=\"tabpanel\"\n >\n <slot />\n </section>\n</template>\n","<script>\nfunction TableCol() {\n return null\n}\n\nTableCol.props = {\n id: {\n // TODO: Change to \"required\", use as cell loop key, and update all docs after getting resizing working ORCA app okay\n type: String,\n default: undefined\n },\n name: {\n type: [String, Number],\n default: ''\n },\n resize: {\n type: [Boolean, Number, String], // String could be \"left\" or \"right\"\n default: false\n },\n // named as resizeId instead of resizeKey, to help indicate it should ideally be a unique id per column\n resizeId: {\n type: String,\n default: undefined\n },\n resizeMin: {\n type: [String, Number],\n default: undefined // undefined so this can override Table-level setting when defined,\n },\n resizeMax: {\n type: [String, Number],\n default: undefined // undefined so this can override Table-level setting when defined\n },\n rowKey: {\n type: [String, Number],\n default: ''\n },\n sort: {\n type: [Boolean, String, Number],\n default: false\n },\n sortKey: {\n type: String,\n default: ''\n },\n truncate: {\n type: [Boolean, String, Number],\n default: undefined // undefined so this can override Table-level setting when defined\n },\n width: {\n type: String,\n default: '' // default width is set in Table.vue\n }\n}\n\nexport default TableCol\n</script>\n","export const TableHeaderProvider = Symbol('TableHeaderProvider')\nexport const TableBodyProvider = Symbol('TableBodyProvider')\nexport const TableFooterProvider = Symbol('TableFooterProvider')\n","<template>\n <div\n :class=\"`bs-table-${kind}-rowgroup`\"\n role=\"rowgroup\"\n :style=\"`--bs-table-${kind}-row-count: ${rowCount}`\">\n <slot />\n </div>\n</template>\n\n<script setup>\nimport { ref, provide } from 'vue'\nimport { TableHeaderProvider, TableBodyProvider, TableFooterProvider } from './table-provider-keys'\n\n// Why this Provide/Inject approach?\n// For css grid implicit rows subgrid layout reasons, we need to count rows rendered into the header/body/footer respectively\n// Checking the TableRow's parent instance isn't necessarily reliable or efficient\n// Instead we are using provide/inject to figure out if the TableRow is a descendant of the header/body/footer (see TableRow for that part of it)\n// (TODO: tweak to work with nested Tables scenario? low priority, thinking can factor in a table id)\n\nconst props = defineProps({\n kind: {\n type: String,\n required: true,\n validate: val => ['header', 'body', 'footer'].includes(val)\n }\n})\n\nconst providerByKind = {\n header: TableHeaderProvider,\n body: TableBodyProvider,\n footer: TableFooterProvider\n}\n\nconst rowCount = ref(0)\n\nprovide(providerByKind[props.kind], { incrementRowCount, decrementRowCount })\n\nfunction incrementRowCount() {\n rowCount.value++\n}\n\nfunction decrementRowCount() {\n rowCount.value--\n}\n</script>","<script>\nfunction FrozenCols() {\n return null\n}\n\nFrozenCols.props = {\n place: {\n type: String,\n default: 'left',\n validator: val => ['left', 'right'].includes(val)\n }\n}\n\nexport default FrozenCols\n</script>\n","<template>\n <div class=\"bs-table-row\" role=\"row\">\n <slot />\n </div>\n</template>\n\n<script setup>\nimport { onMounted, onUnmounted, inject } from 'vue'\nimport { TableHeaderProvider, TableBodyProvider, TableFooterProvider } from './table-provider-keys'\n\n// Detect if this row is a child of the Table body, header, or footer (body first since it will be the majority)\nconst rowgroup = inject(TableBodyProvider, null) || inject(TableHeaderProvider, null) || inject(TableFooterProvider)\n\n// keeping track of the rendered rows count is unfortunately necessary for the css grid implicit rows subgrid layout\nonMounted(() => rowgroup.incrementRowCount())\nonUnmounted(() => rowgroup.decrementRowCount())\n</script>\n","<script>\nimport { h } from 'vue'\n\nfunction HeadCell(props, { slots }) {\n return h('div', {\n class: 'bs-table-head-cell',\n role: 'columnheader'\n }, slots)\n}\n\n// defined so fall-through attributes work correctly without effort\nHeadCell.props = {}\n\nexport default HeadCell\n</script>\n","<script>\nimport { h } from 'vue'\n\nfunction Cell(props, { slots }) {\n return h('div', {\n class: 'bs-table-cell',\n role: 'cell'\n }, slots)\n}\n\n// defined so fall-through attributes work correctly without effort\nCell.props = {}\n\nexport default Cell\n</script>","<template>\n <div class=\"bs-table-wrap-header\">\n <slot />\n </div>\n</template>\n","<template>\n <div class=\"bs-table-wrap-footer\">\n <slot />\n </div>\n</template>","<!-- uses tiny bit of external blue steel css (.visually-hidden) + local styles (prefixed with \"oui\") -->\n\n<template>\n <button\n class=\"bs-sort-toggle\"\n type=\"button\"\n @click=\"onToggle\">\n <slot>\n <span class=\"visually-hidden\">sort toggle</span>\n </slot>\n <component\n :is=\"iconsByOrder[props.order] || BsIconCaretSort\"\n :size=\"size\"\n aria-hidden=\"true\" />\n </button>\n</template>\n\n<script setup>\nimport { BsIconCaretSort, BsIconCaretSortUp, BsIconCaretSortDown } from '@wwtdev/bsds-icons-vue3'\n\nconst emit = defineEmits(['toggle'])\n\nconst props = defineProps({\n order: {\n type: String,\n default: '',\n validate: val => ['asc', 'desc'].includes(val)\n },\n size: {\n type: String,\n default: 'md',\n // these should be same as values allowed for BsIcons size prop\n validate: val => ['sm', 'md', 'lg', 'xl', '2xl', '3xl', 'auto'].includes(val)\n }\n})\n\nconst iconsByOrder = {\n asc: BsIconCaretSortUp,\n desc: BsIconCaretSortDown\n}\n\nfunction onToggle(event) {\n const nextStates = {\n asc: 'desc',\n desc: 'asc'\n }\n emit('toggle', nextStates[props.order] || 'asc', event)\n}\n</script>\n","<template>\n <div\n v-show=\"isResizerVisible\"\n ref=\"resizer\"\n class=\"bs-table-col-resizer\"\n :class=\"isResizing && 'bs-table-col-resizer-active'\"\n @dragstart.prevent\n @pointerdown.prevent.stop=\"onPointerDown\"\n @dblclick.prevent.stop=\"onDoubleClick\" />\n</template>\n\n<script setup>\nimport { useTemplateRef, shallowRef, ref, onMounted, onUnmounted, nextTick } from 'vue'\n\nconst emit = defineEmits(['resize'])\n\nconst resizerEl = useTemplateRef('resizer')\n\nconst resizerExtraHoverTarget = 5\n\nlet xStart = null\nlet xPos = null\nlet animationFrame = null\n\nconst target = shallowRef({ el: null, rect: null })\nconst isResizerVisible = ref(false)\nconst isResizing = ref(false)\n\nonMounted(() => {\n // had to listen on document instead of table header rowgroup or table, due to issue\n // with resizer staying visible when mouse leaves header vertically, very fast\n document.addEventListener('pointermove', showHideResizer)\n})\n\nonUnmounted(() => {\n document.removeEventListener('pointermove', showHideResizer)\n})\n\n// - - - - - - - - - - - -\n\nfunction showHideResizer(event) {\n if (isResizing.value) return\n\n if (isResizerVisible.value) {\n return (event.target === resizerEl.value) || hideResizer()\n }\n\n setTarget(event.target.closest('[data-bs-table-col-resize-id]'))\n\n if (!target.value.el) return\n\n const isOnLeftBorder = event.clientX <= (target.value.rect.left + resizerExtraHoverTarget)\n const isOnRightBorder = event.clientX >= (target.value.rect.right - resizerExtraHoverTarget)\n\n // TODO: Also handle left-only resize\n if (isOnLeftBorder && event.target.dataset.ouiTableColResize === 'right') return\n\n if (isOnLeftBorder || isOnRightBorder) {\n xPos = isOnLeftBorder ? target.value.rect.left : target.value.rect.right\n if (isOnLeftBorder) setTarget(getTargetsPreviousSibling())\n if (!target.value.el) return\n showResizer()\n }\n}\n\n// TODO: Handle frozen cols right case\nfunction getTargetsPreviousSibling() {\n const prevSibling = target.value.el.previousElementSibling\n\n if (!prevSibling) return\n\n const prevCell = prevSibling.classList.contains('bs-table-cols-frozen-left')\n ? target.value.el.previousElementSibling.lastElementChild\n : target.value.el.previousElementSibling\n\n return prevCell.dataset.ouiTableColResizeId ? prevCell : null\n}\n\nfunction setTarget(el) {\n // TODO: Handle resize max, coming back to do this after getting ORCA app resize working\n target.value = el\n ? { el, rect: el.getBoundingClientRect(), minWidth: getResizeMin(el) }\n : { el: null, rect: null }\n}\n\nfunction getResizeMin(el) {\n const width = el.dataset.ouiTableColResizeMin?.replace('px', '')\n if (!width) return undefined\n return parseInt(width, 10)\n}\n\nfunction showResizer() {\n moveResizerToXpos()\n resizerEl.value.style.setProperty('--bs-table-col-resizer-y', `${target.value.rect.top}px`)\n resizerEl.value.style.setProperty('--bs-table-col-resizer-handle-height', `${target.value.rect.height}px`)\n isResizerVisible.value = true\n}\n\nfunction hideResizer() {\n isResizerVisible.value = false\n}\n\nfunction onPointerDown(event) {\n event.target.setPointerCapture(event.pointerId)\n const scrollWrap = resizerEl.value.closest('.bs-table-scroll-wrap')\n resizerEl.value.style.setProperty('--bs-table-col-resizer-tail-height', `${scrollWrap.offsetHeight}px`)\n isResizing.value = true\n xStart = xPos\n resizerEl.value.addEventListener('pointermove', onPointerMove)\n resizerEl.value.addEventListener('pointerup', onPointerUp, { once: true })\n}\n\nfunction onPointerMove(event) {\n xPos = isMinColWidth(event)\n ? target.value.rect.left + target.value.minWidth\n : event.clientX\n\n if (animationFrame) return\n\n animationFrame = requestAnimationFrame(() => {\n animationFrame = null\n moveResizerToXpos()\n })\n}\n\nfunction isMinColWidth(event) {\n return (event.clientX - target.value.rect.left) <= target.value.minWidth\n}\n\nfunction moveResizerToXpos() {\n resizerEl.value.style.setProperty('--bs-table-col-resizer-x', `${xPos}px`)\n}\n\nfunction onPointerUp() {\n resizerEl.value.removeEventListener('pointermove', onPointerMove)\n // timeout fixes a weird issue in Firefox (as of 11/2024) where dblclick event won't fire when also removing a class\n setTimeout(() => isResizing.value = false)\n const xDiff = xPos - xStart\n if (xDiff === 0) return\n emitResize(Math.round(target.value.rect.width + xDiff))\n}\n\nasync function emitResize(width) {\n emit('resize', {\n el: target.value.el,\n id: target.value.el.dataset.ouiTableColResizeId,\n width\n })\n // handles case where user does not mouse-off/hide resizer before resizing again,\n // by getting latest boundingClientRect() info after the column has been resized\n await nextTick(() => setTarget(target.value.el))\n}\n\n// TODO: Come back to think about this after working in ORCA app. This gets weird if the default col width is not in pixels.\nfunction onDoubleClick() {\n emitResize() // no width given, resets col back to orig width\n hideResizer()\n}\n</script>\n","<!-- uses local css only (no blue steel css, except vars), due to structure differences from Blue Steel table css -->\n\n<!--\n TODO:\n * Resize Cols\n * Finalize loop keys approach, using rowIdKey (not sure if this is needed, no issues so far with our huge, complex table)\n-->\n<script>\nimport { h, readonly, shallowRef, cloneVNode, computed, ref } from 'vue'\nimport TableCol from './TableCol.vue'\nimport TableRowGroup from './TableRowGroup.vue'\nimport FrozenCols from './FrozenCols.vue'\nimport TableRow from './TableRow.vue'\nimport HeadCell from './HeadCell.vue'\nimport Cell from './Cell.vue'\nimport TableHeader from './TableHeader.vue'\nimport TableFooter from './TableFooter.vue'\nimport SortToggle from './SortToggle.vue'\nimport TableColResizer from './TableColResizer.vue'\n\nexport default {\n\n props: {\n rows: {\n type: Array,\n required: true\n },\n ariaDescribedby: {\n type: String,\n default: undefined\n },\n ariaLabel: {\n type: String,\n default: undefined\n },\n borders: {\n type: String,\n default: 'rows',\n validate: val => ['rows', 'cols', 'grid', 'none', 'frozen'].includes(val)\n },\n cellPadding: {\n type: String,\n default: 'md'\n },\n // can also be set or overridden at the individual col level, via TableCol's \"width\" prop\n colWidth: {\n type: String,\n default: '1fr'\n },\n freezeHeader: {\n type: [Boolean, String, Number],\n default: false\n },\n freezeFooter: {\n type: [Boolean, String, Number],\n default: false\n },\n // can also be set or overridden at the individual col level, via TableCol's \"resize-min\" prop\n resizeColsMin: {\n type: [String, Number],\n default: '40px'\n },\n // can also be set or overridden at the individual col level, via TableCol's \"resize-max\" prop\n resizeColsMax: {\n type: [String, Number],\n default: undefined\n },\n role: {\n type: String,\n default: 'table'\n },\n rowHover: {\n type: [Boolean, String, Number],\n default: false\n },\n // NOTE: This prop is not used in the code yet. Waiting to see if any issues arise IRL usage, none so far.\n // The row data's unique id key to be used for the table rows v-for :key\n // rowIdKey: {\n // type: String,\n // default: 'id'\n // },\n sortKey: {\n type: String,\n default: undefined\n },\n sortOrder: {\n type: String,\n default: undefined,\n validator: val => ['asc', 'desc'].includes(val)\n },\n striped: {\n type: [Boolean, String, Number],\n default: false\n },\n // can also be set or overridden at the individual col level, via TableCol's \"truncate\" prop\n truncate: {\n type: [Boolean, String, Number],\n default: false\n }\n },\n\n emits: ['sort', 'resize-col'],\n\n setup(props, { slots: tableSlots, emit }) {\n\n const cols = shallowRef({\n left: [],\n center: [],\n right: []\n })\n\n const resizedColWidthsById = ref({})\n\n const colWidths = computed(() => {\n return Object.values(cols.value).flat().map(col => {\n const resizeId = getResizeId(col)\n return resizedColWidthsById.value[resizeId] ?? getInitialColWidth(col)\n }).join(' ')\n })\n\n // consumer can use a size option or provide any valid css padding value\n const cellPaddingCssVar = computed(() => {\n const value = ['xs', 'sm', 'md', 'lg', 'xl', 'none'].includes(props.cellPadding)\n ? `var(--bs-table-cell-padding-${props.cellPadding})`\n : props.cellPadding\n return `--bs-table-cell-padding: ${value}`\n })\n\n // consumer can use boolean flag, or provide any valid css color value\n const rowHoverCssVar = computed(() => {\n if (typeof props.rowHover !== 'string' || props.rowHover === 'true') return ''\n return `--bs-table-row-hover: ${ props.rowHover }`\n })\n\n const canResizeCols = computed(() => {\n return Object.values(cols.value).flat().some(getResizeId)\n })\n\n\n // ----- WRAPPER -----\n\n function wrapper(content = []) {\n const css = [\n 'bs-table-wrap',\n `bs-table-border-${props.borders}`,\n props.striped && 'bs-table-striped',\n props.rowHover && 'bs-table-row-hover'\n ]\n\n return h('div', {\n class: css,\n style: [cellPaddingCssVar.value, rowHoverCssVar.value]\n }, content)\n }\n\n\n // ----- TABLE -----\n\n function table(content = []) {\n const style = [\n `--bs-table-col-widths: ${colWidths.value}`,\n `--bs-table-frozen-left-count: ${cols.value.left.length}`,\n `--bs-table-frozen-right-count: ${cols.value.right.length}`\n ]\n\n return h('div', {\n class: 'bs-table',\n style,\n role: props.role,\n ariaLabel: props.ariaLabel,\n ariaDescribedby: props.ariaDescribedby\n }, content)\n }\n\n // is needed to ensure cases where a consumer may flex-1 the <Table>, work nicely automatically\n function tableScrollWrapper(content = []) {\n return h('div', { class: 'bs-table-scroll-wrap'}, content)\n }\n\n\n // ----- HEADER ROWGROUP -----\n\n function headerRowgroup(rows = []) {\n return h(TableRowGroup, {\n kind: 'header',\n class: props.freezeHeader && 'bs-table-header-rowgroup-freeze'\n }, () => rows)\n }\n\n function headerRowgroupDefault() {\n return headerRowgroup(\n row(\n cells(headCell)\n )\n )\n }\n\n function headerRowgroupSlot() {\n const slotContent = tableSlots.header({ cols: readonly(cols.value) })\n return headerRowgroup(\n slotRows(slotContent, headCell)\n )\n }\n\n\n // ----- BODY ROWGROUP -----\n\n function bodyRowgroup(rows = []) {\n return h(TableRowGroup, { kind: 'body' }, () => rows)\n }\n\n function bodyRowgroupDefault() {\n const rows = props.rows.map((rowData, rowIndex) => {\n return row(\n cells(bodyCell, { row: rowData, rowIndex })\n )\n })\n return bodyRowgroup(rows)\n }\n\n function bodyRowgroupSlot() {\n const rows = props.rows.map((rowData, rowIndex) => {\n const slotContent = tableSlots.body({ row: rowData, rowIndex })\n return slotRows(slotContent, bodyCell, { row: rowData, rowIndex })\n })\n return bodyRowgroup(rows)\n }\n\n\n // ----- FOOTER ROWGROUP -----\n\n function footerRowgroup(rows = []) {\n return h(TableRowGroup, {\n kind: 'footer',\n class: props.freezeFooter && 'bs-table-footer-rowgroup-freeze'\n }, () => rows)\n }\n\n function footerRowgroupSlot() {\n const slotContent = tableSlots.footer({ cols: readonly(cols.value) })\n return footerRowgroup(\n slotRows(slotContent, headCell)\n )\n }\n\n\n // ----- ROWS -----\n\n function row(cells = []) {\n return h(TableRow, null, () => cells)\n }\n\n function slotRows(slotContent = [], cellFn, slotProps = {}) {\n const rows = findNodesByType(slotContent, [TableRow])\n return rows.map(node => isDefaultRowPlaceholder(node)\n ? h(node, null, () => cells(cellFn, slotProps))\n : h(node)\n )\n }\n\n\n // ----- CELLS -----\n\n function headCell(col = {}) {\n const slotContent = col.slots?.default({}).find(node => node.type === HeadCell)\n const sortKey = getSortKey(col)\n\n const attrs = {\n class: props.truncate && truncateCss(col),\n ['data-bs-table-col-id']: col.props.id, // TODO: only added here for col resize reasons, could be on all cells\n ...getResizeAttrs(col),\n ...(sortKey && (sortKey === props.sortKey) && { 'aria-sort': `${props.sortOrder}ending` })\n }\n\n // if HeadCell contains SortToggle, automatically hook it up\n if (sortKey && slotContent?.children) {\n const newKids = slotContent.children.default().map(node => {\n return node.type === SortToggle\n ? cloneVNode(node, { ...getSortToggleProps(col) })\n : h(node)\n })\n return h(slotContent, attrs, () => newKids)\n }\n\n return slotContent\n ? h(slotContent, attrs)\n : h(HeadCell, attrs, () => sortToggle(col) || col.props?.name)\n }\n\n function getResizeAttrs(col) {\n const resizeId = getResizeId(col)\n\n if (!resizeId) return {}\n\n const colMin = col.props['resize-min'] || col.props.resizeMin\n const colMax = col.props['resize-max'] || col.props.resizeMax\n\n return {\n ['data-bs-table-col-resize-id']: resizeId,\n ['data-bs-table-col-resize']: ['right', 'left'].includes(col.props.resize) ? col.props.resize : undefined,\n ['data-bs-table-col-resize-min']: colMin === undefined ? props.resizeColsMin : colMin,\n ['data-bs-table-col-resize-max']: colMax === undefined ? props.resizeColsMax : colMax\n }\n }\n\n function getResizeId(col) {\n const resizeId = col.props['resize-id'] || col.props.resizeId\n if (resizeId) return resizeId\n\n const resizeKey = col.props['resize-key'] || col.props.resizeKey\n if (resizeKey) {\n throw new Error(`[OUI Table] TableCol does not have a \"resize-key\" prop. Instead, use: resize-id=\"${resizeKey}\".`)\n }\n\n if (!isColPropTruthy(col, 'resize')) return\n if (!col.props.id) throw new Error('[OUI Table] TableCol \"resize\" prop is missing identifier. Must use either approach...single prop: \\'resize-id=\"myUniqueResizeId\"\\', or both props: \\'resize id=\"myTableColId\"\\'')\n return col.props.id\n }\n\n function getSortToggleProps(col = {}) {\n const sortKey = getSortKey(col)\n return {\n order: props.sortKey === sortKey ? props.sortOrder : null,\n onToggle: sortOrder => emit('sort', { sortKey, sortOrder })\n }\n }\n\n function sortToggle(col = {}) {\n const sortKey = getSortKey(col)\n if (!sortKey) return\n return h(SortToggle, { ...getSortToggleProps(col) }, () => col.props?.name)\n }\n\n function getSortKey(col) {\n const sortKey = col.props['sort-key'] || col.props.sortKey\n if (sortKey) return sortKey\n if (!isColPropTruthy(col, 'sort')) return\n if (!col.props.id) throw new Error('[OUI Table] TableCol \"sort\" prop is missing key identifier. Must use either approach...single prop: \\'sort-key=\"mySortKey\"\\', or both props: \\'sort id=\"myTableColId\"\\'')\n return col.props.id\n }\n\n function bodyCell(col = {}, slotProps = {}) {\n const slotContent = col.slots?.default(slotProps).find(node => node.type === Cell)\n const attrs = { class: props.truncate && truncateCss(col) }\n return slotContent\n ? h(slotContent, attrs)\n : h(Cell, attrs, () => getRowKeyProp(slotProps.row, col))\n }\n\n // TODO (HJ): Update this to use isColPropTruthy() approach and fix issue where TableCol only\n // overrides Table setting, instead of being allowed to just set it on a TableCol alone\n function truncateCss(col) {\n // the checks are a little weird here, to allow for a better consumer experience,\n // e.g. can override Table level setting at TableCol level, without a binding for false\n const isTruncate = col.props.truncate === undefined\n ? props.truncate\n : col.props.truncate === '' || col.props.truncate\n\n return col.props.truncate !== 'false' && isTruncate && 'bs-table-truncate'\n }\n\n function frozenCells(side, cellFn, slotProps) {\n if (!cols.value[side].length) return\n const theCells = cols.value[side].map(col => cellFn(col, slotProps))\n return h('div', { class: `bs-table-cols-frozen-${side}`}, theCells)\n }\n\n function cells(cellFn, slotProps = {}) {\n return [\n frozenCells('left', cellFn, slotProps),\n cols.value.center.map(col => cellFn(col, slotProps)),\n frozenCells('right', cellFn, slotProps)\n ]\n }\n\n\n // ----- TABLE COL RESIZER -----\n\n function tableColResizer() {\n return h(TableColResizer, { onResize: onResizeCol })\n }\n\n // TODO: This is disgusting. Clean it up. See if can move into TableColResizer w/TableProvider.\n function onResizeCol({ el, id, width }) {\n const colsToUpdate = Object.values(cols.value).flat().reduce((acc, col) => {\n // TODO: Bullet-proof this id check, after getting resizing up and running in ORCA app\n const key = getResizeId(col) || col.props.id\n if (key === id || resizedColWidthsById.value[key] || getInitialColWidth(col).endsWith('px')) return acc\n acc.push({ id: key, width: null })\n return acc\n }, [])\n\n if (colsToUpdate.length) {\n const row = el.closest('.bs-table-row')\n colsToUpdate.forEach(col => {\n const headCell = row.querySelector(`:where([data-bs-table-col-resize-id=\"${col.id}\"], [data-bs-table-col-id=\"${col.id}\"])`)\n if (!headCell) return\n col.width = `${headCell.offsetWidth}px`\n })\n }\n\n const updates = [{ id, width: width ? `${width}px` : undefined }, ...colsToUpdate]\n updates.forEach(col => resizedColWidthsById.value[col.id] = col.width)\n emit('resize-col', { target: updates[0], updated: [...updates] })\n }\n\n\n // ----- HELPERS -----\n\n // In header/body/footer slots, an empty <TableRow /> should be used to represent where the consumer\n // wants the standard, default row content to appear, in relation to their other custom rows in the slot\n // E.g. a custom conditional group header row, then the default/real row appears below that\n function isDefaultRowPlaceholder(node) {\n return node.type === TableRow && !node.children\n }\n\n // allows for 'a.b.c' paths too, but for anything more complex, consumer should use a <Cell> in the TableCol slot instead\n function getRowKeyProp(row, col) {\n const key = col.props['row-key'] || col.props.rowKey || col.props.id\n const path = (key || '').split('.')\n return path.reduce((obj, key) => obj && obj[key], row)\n }\n\n // making this a bit harder on myself, but it's for DX reasons. Want to allow Boolean, String, Number to be used on some TableCol props\n function isColPropTruthy(col, prop) {\n const val = col.props[prop]\n return val === '' || (val && val !== 'false')\n }\n\n function getInitialColWidth(col) {\n return col.props?.width ?? props.colWidth\n }\n\n\n // ----- VNODE PROCESSING -----\n\n function findNodesByType(nodes, types = []) {\n return nodes.reduce((acc, node) => {\n if (types.includes(node.type)) return [ ...acc, node ]\n if (Array.isArray(node.children)) return [ ...acc, ...findNodesByType(node.children, types) ]\n return acc\n }, [])\n }\n\n function processFrozenTableCols(node) {\n const place = node.props?.place || node.type.props.place.default\n if (!node.type.props.place.validator(place)) {\n // eslint-disable-next-line no-console\n console.warn(`[OUI Table warn] Invalid prop: FrozenCols prop \"place\" must be set to \"left\" or \"right\". Yours: \"${place}\".`)\n }\n return {\n place,\n frozenCols: findNodesByType(node.children.default(), [TableCol])\n }\n }\n\n function processTableCols(nodes = []) {\n const format = col => ({\n props: col.props || { name: '' },\n slots: col.children\n })\n return nodes.reduce((acc, node) => {\n if (node.type === FrozenCols) {\n const { place, frozenCols } = processFrozenTableCols(node)\n acc[place] = acc[place].concat(frozenCols.map(format))\n return acc\n }\n acc.center.push(format(node))\n return acc\n }, { left: [], center: [], right: [] })\n }\n\n function processDefaultSlot(nodes) {\n return nodes.reduce((acc, node) => {\n\n if (node.type === TableHeader) {\n acc.header = node\n return acc\n }\n\n if (node.type === TableFooter) {\n acc.footer = node\n return acc\n }\n\n if ([FrozenCols, TableCol].includes(node.type)) {\n acc.columns.push(node)\n return acc\n }\n\n // covers v-for usage case\n const nested = findNodesByType([node], [FrozenCols, TableCol])\n\n nested?.length\n ? acc.columns = [...acc.columns, ...nested]\n : acc.other.push(node)\n\n return acc\n\n }, { columns: [], header: null, footer: null, other: [] })\n }\n\n\n // ----- RENDER FUNCTION -----\n // Did not use a provide/inject approach to register TableCols on mount/unmount,\n // because we want to render columns in the order TableCols are placed in the DOM (which\n // would fail in a v-if'd TableCol scenario...registered order wouldn't be reliable)\n\n return () => {\n const { columns, header, footer, other } = processDefaultSlot(tableSlots.default())\n\n cols.value = processTableCols(columns)\n\n return wrapper([\n header,\n tableScrollWrapper([\n table([\n tableSlots.header ? headerRowgroupSlot() : headerRowgroupDefault(),\n tableSlots.body ? bodyRowgroupSlot() : bodyRowgroupDefault(),\n tableSlots.footer && footerRowgroupSlot()\n ]),\n other, // non-Table related slot content, e.g. consumers could add a loading spinner or empty state message\n canResizeCols.value && tableColResizer()\n ]),\n footer\n ])\n }\n }\n}\n</script>\n\n\n\n","<script setup>\nimport { computed } from 'vue'\n\nconst props = defineProps({\n error: {\n type: Boolean,\n default: false\n },\n hintId: String,\n /** @Deprecated - Just set `id` since it will fall-through to the inner textarea element. */\n inputId: String,\n value: String,\n modelValue: String\n})\nconst emit = defineEmits(['update:modelValue'])\n\nconst aria = computed(() => (\n { [props.error ? \"aria-errormessage\" : \"aria-describedby\"]: props.hintId }\n))\n\n</script>\n\n<template>\n<textarea\n class=\"bs-textarea\"\n data-component=\"bs-textarea\"\n :data-error=\"error\"\n :id=\"$attrs.id || inputId\"\n :rows=\"$attrs.rows || 6\"\n :value=\"value || modelValue\"\n @input=\"e => $emit('update:modelValue', e.target.value)\"\n v-bind=\"aria\"\n/>\n</template>\n","<script setup>\nimport { computed } from 'vue'\nimport { useGenIdAttrs } from '@composables/genId.js'\nimport { filterAttrs, textareaAttrs } from '@utils/filterAttrs.js'\nimport BsFieldDetails from '../field-details/BsFieldDetails.vue'\nimport BsLabel from '../label/BsLabel.vue'\nimport BsTextarea from '../textarea/BsTextarea.vue'\n\nconst props = defineProps({\n /** Sets the maximum value this textarea will allow. Will also display character count if present. This does not set maxlength, so users are able to enter text that is longer and edit it down. Enforcement of length must be by the developer. */\n charMax: Number,\n /** Sets the disabled state on input, disabled styles on label. */\n disabled: {\n type: Boolean,\n default: false,\n },\n /** Applies error styles to the input. */\n error: {\n type: Boolean,\n default: false,\n },\n /** Pass error text. */\n errorMsg: String,\n /** Pass helper text. */\n hint: String,\n /** @Deprecated Use `hint` and/or `errorMsg`. */\n hints: [ String, Array ],\n /** Pass id for the input element. Will also be applied to label attribute. */\n inputId: String,\n /** Pass label text. */\n label: { type: String },\n /** List additional attributes by name (comma-separated) to pass through to `<textarea>`. */\n passAttrs: {\n type: String,\n default: '',\n },\n /** Placeholder attribute for `<textarea>`. */\n placeholder: String,\n /** Sets the required state on the textarea, append required* indicator to label. */\n required: {\n type: Boolean,\n default: false,\n },\n /** Sets the number of rows for the textarea. Defaults to `6`. */\n rows: {\n type: [Number, String],\n default: 6\n },\n /** Sets the textarea value - do not use if using `v-model`. */\n value: String,\n /** Sets the textarea value - `v-model` directive will use this; do not set explicitly. */\n modelValue: String\n})\nconst emit = defineEmits(['update:modelValue'])\n\n// allocate attributes to root and/or child elements\ndefineOptions({ inheritAttrs: false })\nconst [ inputIdGen, hintId ] = useGenIdAttrs(2)\n\n// Computed Properties\nconst attrFilter = computed(() => textareaAttrs.concat(props.passAttrs.split(',')))\nconst charCount = computed(() => (props.value || props.modelValue)?.length || 0)\nconst hintDeprecated = computed(() => props.hints?.join?.(\"\\n\") || props.hints)\nconst hintMsg = computed(() => (\n (props.error && props.errorMsg) || props.hint || hintDeprecated.value || undefined\n))\nconst inputIdAttr = computed(() => props.inputId || inputIdGen.value)\n\n</script>\n\n<template>\n<div data-component=\"bs-textarea-field\" v-bind=\"filterAttrs($attrs, attrFilter).remaining\">\n <BsLabel v-if=\"label || $slots.label\"\n :for=\"$attrs.id || inputIdAttr\"\n :disabled=\"disabled\"\n :required=\"required\"\n >\n <slot name=\"label\">\n {{ label }}\n </slot>\n </BsLabel>\n <BsTextarea\n :disabled=\"disabled\"\n :error=\"error\"\n :hint-id=\"hintId\"\n :id=\"$attrs.id || inputIdAttr\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :rows=\"rows\"\n :value=\"value || modelValue\"\n @update:modelValue=\"$event => $emit('update:modelValue', $event)\"\n v-bind=\"filterAttrs($attrs, attrFilter).filtered\"\n />\n <BsFieldDetails v-if=\"hintMsg || charMax\"\n :char-count=\"charCount\"\n :char-max=\"charMax\"\n :data-disabled=\"disabled\"\n :error=\"error\"\n :error-msg=\"errorMsg\"\n :hint=\"hint || hintDeprecated\"\n :hint-id=\"hintId\"\n />\n</div>\n</template>\n<style>\n:where([data-component=\"bs-textarea-field\"]) {\n display: block;\n width: 100%;\n}\n</style>\n","/**\n * @typedef {Object} TimeObj\n * @property {number} hours - number of hours\n * @property {number} minutes - number of minutes\n */\n\n/**\n * @param {string} val - potential time string\n * @returns {\"\"|\"uFmt\"|\"uFmtNoColon\"|\"amPm\"|\"amPmNoColon\"} matched pattern or empty string\n * @description Takes a potential time string, `val`, and returns a matched pattern. If the input string does not match any known time patterns, an empty string is returned.\n * @example\n * checkTimePattern('1234') // 'uFmtNoColon'\n * checkTimePattern('12:34') // 'uFmt'\n * checkTimePattern('12:34pm') // 'amPm'\n * checkTimePattern('12:34 pm') // 'amPm'\n * checkTimePattern('12:34 am') // 'amPm'\n * checkTimePattern('12:34am') // 'amPm'\n * checkTimePattern('5') // '' (invalid)\n * checkTimePattern('5 pm') // '' (invalid)\n */\nfunction checkTimePattern(val) {\n const uFmt = /^([01]?[0-9]|2[0-3]):[0-5][0-9]$/.test(val) // 24h fmt\n const uFmtNoColon = /^([01]?[0-9]|2[0-3])[0-5][0-9]$/.test(val) // 24h fmt without colon\n const amPm = /^([0]?[0-9]|1[0-2]):[0-5][0-9] ?(a|p|am|pm)$/i.test(val) // am pm fmt\n const amPmNoColon = /^([0]?[0-9]|1[0-2])[0-5][0-9] ?(a|p|am|pm)$/i.test(val) // am pm fmt without colon\n\n if (uFmt) return 'uFmt'\n if (uFmtNoColon) return 'uFmtNoColon'\n if (amPm) return 'amPm'\n if (amPmNoColon) return 'amPmNoColon'\n return ''\n}\n\nconst parseIntTen = (val) => parseInt(val, 10)\n\n/**\n * @param {string} val - raw string to attempt to parse into hours and minutes\n * @returns {TimeObj} object with `hours` and `minutes` fields\n * @description Takes a raw string, `val`, and attempts to parse it into hours and minutes. If the input string is not a valid time or parsing otherwise fails, the `hours` and `minutes` fields are undefined.\n * @example\n * parseRaw('1234') // { hours: 12, minutes: 34 }\n * parseRaw('12:34') // { hours: 12, minutes: 34 }\n * parseRaw('12:34pm') // { hours: 12, minutes: 34 }\n * parseRaw('12:34 pm') // { hours: 12, minutes: 34 }\n * parseRaw('00:34') // { hours: 0, minutes: 34 }\n * parseRaw('12:34am') // { hours: 0, minutes: 34 }\n * // invalid\n * parseRaw('5pm') // { hours: undefined, minutes: undefined }\n */\nfunction parseRaw(val = '') {\n const STRIP_PATTERN = /[^0-9:apmAPM]/g\n let hours\n let minutes\n val = val.replaceAll(STRIP_PATTERN, '').toLowerCase()\n\n const matchedPattern = checkTimePattern(val)\n switch (matchedPattern) {\n case 'uFmt':\n case 'uFmtNoColon':\n minutes = parseIntTen(val.slice(-2))\n hours = parseIntTen(val.slice(0, -2))\n break\n case 'amPm':\n case 'amPmNoColon':\n const parts = val.split(/(a|p|am|pm)/)\n const pm = val.includes('p')\n minutes = parseIntTen(parts[0].slice(-2))\n hours = parseIntTen(parts[0].slice(0, -2))\n if (hours < 12 && pm) hours += 12\n if (hours === 12 && !pm) hours = 0\n if (hours === 24) hours = 0\n break\n }\n\n return {\n hours,\n minutes,\n }\n}\n\n/**\n *\n * @param {string} val - time string in the format `HH:mm`\n * @returns {string} am/pm formatted time string\n *\n * @description Takes a time string, `val`, in the format `HH:mm` and returns a formatted time string in the format `H:mm AM/PM. This will strip out all characters except for numeric characters and colon.`\n */\nexport function fmtTimeValToDisplay(val = '') {\n const STRIP_PATTERN = /[^0-9:]/g\n val = val.replaceAll(STRIP_PATTERN, '')\n if (!val) return ''\n\n const [ hours, minutes ] = val.split(':')\n const hoursInt = parseIntTen(hours)\n const minutesInt = parseIntTen(minutes)\n const ampm = hoursInt < 12 ? 'AM' : 'PM'\n if (isNaN(hoursInt) || isNaN(minutesInt) || hoursInt > 23 || minutesInt > 59) return ''\n return `${hoursInt % 12 || 12}:${minutes} ${ampm}`\n}\n\n/**\n * @param {string} val - time string with or without colon, am/pm, or spaces\n * @returns {string} formatted time string in the format `HH:mm`\n * @description Takes an unformatted time string, `val`, and returns a formatted time string in the format `HH:mm`. If the input string is not a valid time or parsing otherwise fails, an empty string is returned.\n * @example\n * fmtInputToTimeVal('1234') // '12:34'\n * fmtInputToTimeVal('12:34') // '12:34'\n * fmtInputToTimeVal('12:34pm') // '12:34'\n * fmtInputToTimeVal('12:34 pm') // '12:34'\n * fmtInputToTimeVal('12:34am') // '00:34'\n * fmtInputToTimeVal('12:34 am') // '00:34'\n * fmtInputToTimeVal('500') // '05:00'\n * fmtInputToTimeVal('5:00') // '05:00'\n * fmtInputToTimeVal('500p') // '17:00'\n * fmtInputToTimeVal('5:00pm') // '17:00'\n * fmtInputToTimeVal('5:00 pm') // '17:00'\n * fmtInputToTimeVal('5pm') // '' (invalid)\n */\nexport function fmtInputToTimeVal(val = '') {\n const { hours, minutes } = parseRaw(val)\n if (isNaN(hours) || isNaN(minutes)) return ''\n\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`\n}\n\n\n","<script setup>\nimport { onMounted, ref, watch } from 'vue'\nimport BsDropdownCombobox from '@components/dropdown-combobox/BsDropdownCombobox.vue'\nimport { fmtTimeValToDisplay, fmtInputToTimeVal } from '@utils/fmtTime.js'\n\nconst props = defineProps({\n disabled: {\n type: Boolean,\n default: false\n },\n disabledTimes: {\n type: Array,\n default: () => []\n },\n dropdownPosition: {\n type: String,\n validator: (value) => {\n return ['', 'top', 'center', 'right'].includes(value)\n },\n },\n dropdownWidth: {\n type: String,\n validator: (value) => {\n return ['', 'sm', 'md', 'lg', 'content', 'anchor'].includes(value)\n },\n },\n error: {\n type: Boolean,\n default: false\n },\n helperText: {\n type: String,\n default: ''\n },\n helperDescription: {\n type: String,\n default: ''\n },\n hintId: {\n type: String,\n },\n inputId: {\n type: String,\n },\n maxTime: {\n type: String,\n default: '23:59'\n },\n minTime: {\n type: String,\n default: '00:00'\n },\n modelValue: {\n type: String,\n default: ''\n },\n placeholder: {\n type: String,\n default: 'hh:mm am'\n },\n required: {\n type: Boolean,\n default: false\n },\n step: {\n type: Number,\n default: 30,\n validator: (value) => {\n return [5, 10, 15, 30, 60].includes(value)\n },\n },\n})\nconst emit = defineEmits(['update:modelValue'])\n\nconst EXCLUDED = 'excluded'\nconst OVER = 'over'\nconst SKIP = 'skip'\nconst STOP = 'stop'\nconst UNDER = 'under'\n\nconst displayValue = ref(fmtTimeValToDisplay(props.modelValue))\nconst options = ref([])\nconst timeError = ref('')\nconst timeHasError = ref(false)\n\nfunction createOptions() {\n const options = []\n let stopAll = false\n for (let i = 0; i < 24; i++) {\n if (stopAll) break\n for (let j = 0; j < 60; j += props.step) {\n const timeVal = getTimeString(i, j)\n const skipOrStop = getSkipOrStop(timeVal)\n if (skipOrStop === SKIP) continue\n if (skipOrStop === STOP) {\n stopAll = true\n break\n }\n options.push({\n label: fmtTimeValToDisplay(timeVal),\n value: timeVal,\n })\n }\n }\n return options\n}\n\nfunction checkConstraints(timeVal) {\n if (!timeVal) return ''\n if (props.minTime && timeVal < props.minTime) return UNDER\n if (props.maxTime && timeVal > props.maxTime) return OVER\n if (props.disabledTimes.includes(timeVal)) return EXCLUDED\n return ''\n}\n\nfunction getSkipOrStop(timeVal) {\n switch (checkConstraints(timeVal)) {\n case OVER:\n return STOP\n case UNDER:\n case EXCLUDED:\n return SKIP\n default:\n return ''\n }\n}\n\nfunction getTimeString(hour, minute) {\n hour = hour.toString().padStart(2, '0')\n minute = minute.toString().padStart(2, '0')\n return `${hour}:${minute}`\n}\n\nfunction handleComboboxChange(val) {\n const formattedValue = fmtInputToTimeVal(val)\n if (formattedValue === props.modelValue) {\n displayValue.value = fmtTimeValToDisplay(props.modelValue)\n }\n updateWithValidation(formattedValue)\n}\n\nfunction setOptions() {\n options.value = createOptions()\n}\n\nfunction updateWithValidation(value) {\n validate(value)\n emit('update:modelValue', value)\n}\n\nfunction validate(value) {\n const check = checkConstraints(value)\n switch(check) {\n case OVER:\n timeError.value = `Time must be before ${fmtTimeValToDisplay(props.maxTime)}`\n timeHasError.value = true\n break\n case UNDER:\n timeError.value = `Time must be after ${fmtTimeValToDisplay(props.minTime)}`\n timeHasError.value = true\n break\n case EXCLUDED:\n timeError.value = `The following times are disabled: ${props.disabledTimes.map(t => fmtTimeValToDisplay(t)).join(', ')}`\n timeHasError.value = true\n break\n default:\n timeError.value = ''\n timeHasError.value = false\n }\n}\n\nonMounted(setOptions)\n\nwatch([\n () => props.disabledTimes,\n () => props.maxTime,\n () => props.minTime,\n () => props.step,\n], setOptions)\n\nwatch([\n () => props.disabledTimes,\n () => props.maxTime,\n () => props.minTime,\n () => props.modelValue,\n], () => validate(props.modelValue))\n\nwatch(() => props.modelValue, (val) => {\n displayValue.value = props.modelValue ? fmtTimeValToDisplay(val) : ''\n})\n\ndefineExpose({\n validationErr: timeHasError,\n validationErrMsg: timeError,\n})\ndefineOptions({ inheritAttrs: false })\n</script>\n\n<template>\n <BsDropdownCombobox\n :disabled=\"disabled\"\n :display-value=\"displayValue\"\n :dropdown-position=\"dropdownPosition\"\n :dropdown-width=\"dropdownWidth\"\n :error=\"error || timeHasError\"\n :helper-description=\"helperDescription\"\n :helper-text=\"helperText\"\n :hint-id=\"hintId\"\n :input-id=\"inputId\"\n :model-value=\"modelValue\"\n :options=\"options\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :update-on-input=\"false\"\n @update:modelValue=\"handleComboboxChange\"\n />\n</template>\n","<script setup>\nimport { computed, ref, watch } from 'vue'\nimport { useGenIdAttrs } from '@composables/genId.js'\nimport { filterAttrs, textlikeAttrs } from '@utils/filterAttrs.js'\nimport BsFieldDetails from '../field-details/BsFieldDetails.vue'\nimport BsTimePicker from '../time-picker/BsTimePicker.vue'\nimport BsLabel from '../label/BsLabel.vue'\n\nconst props = defineProps({\n disabled: {\n type: Boolean,\n default: false\n },\n disabledTimes: {\n type: Array,\n default: () => []\n },\n dropdownPosition: {\n type: String,\n validator: (value) => {\n return ['', 'top', 'center', 'right'].includes(value)\n },\n },\n dropdownWidth: {\n type: String,\n validator: (value) => {\n return ['', 'sm', 'md', 'lg', 'content', 'anchor'].includes(value)\n },\n },\n error: {\n type: Boolean,\n default: false\n },\n errorMsg: {\n type: String,\n },\n helperText: {\n type: String,\n default: ''\n },\n helperDescription: {\n type: String,\n default: ''\n },\n hint: {\n type: String,\n },\n inputId: {\n type: String,\n },\n label: {\n type: String,\n },\n maxTime: {\n type: String,\n },\n minTime: {\n type: String,\n },\n modelValue: {\n type: String,\n default: ''\n },\n placeholder: {\n type: String,\n default: 'hh:mm am'\n },\n required: {\n type: Boolean,\n default: false\n },\n step: {\n type: Number,\n default: 30,\n validator: (value) => {\n return [5, 10, 15, 30, 60].includes(value)\n },\n },\n})\n\nconst emit = defineEmits(['update:modelValue'])\n\nconst [ inputIdGen, hintId ] = useGenIdAttrs(2)\nconst timePicker = ref(null)\n\nconst errorMsgComputed = computed(() => props.errorMsg || timeError.value)\nconst hasError = computed(() => props.error || timeHasError.value)\nconst inputIdAttr = computed(() => props.inputId || inputIdGen.value)\nconst showDetails = computed(() => props.hint || (hasError.value && errorMsgComputed.value))\nconst timeError = computed(() => timePicker.value?.validationErrMsg)\nconst timeHasError = computed(() => timePicker.value?.validationErr)\n\ndefineExpose({\n validationErr: timeHasError,\n validationErrMsg: timeError,\n})\ndefineOptions({ inheritAttrs: false })\n</script>\n\n<template>\n<div\n aria-live=\"polite\"\n data-component=\"bs-time-picker-field\"\n v-bind=\"filterAttrs($attrs, textlikeAttrs).remaining\"\n>\n <BsLabel v-if=\"label || $slots.label\"\n :for=\"$attrs.id || inputIdAttr\"\n :disabled=\"disabled\"\n :required=\"required\"\n >\n <slot name=\"label\">\n {{ label }}\n </slot>\n </BsLabel>\n <BsTimePicker\n ref=\"timePicker\"\n :disabled=\"disabled\"\n :disabled-times=\"disabledTimes\"\n :dropdown-position=\"dropdownPosition\"\n :dropdown-width=\"dropdownWidth\"\n :error=\"hasError\"\n :helper-description=\"helperDescription\"\n :helper-text=\"helperText\"\n :hint-id=\"hintId\"\n :input-id=\"$attrs.id || inputIdAttr\"\n :max-time=\"maxTime\"\n :min-time=\"minTime\"\n :model-value=\"modelValue\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :step=\"step\"\n @update:modelValue=\"$event => $emit('update:modelValue', $event)\"\n v-bind=\"filterAttrs($attrs, textlikeAttrs).filtered\"\n />\n <BsFieldDetails v-show=\"showDetails\"\n :error=\"hasError\"\n :error-msg=\"errorMsgComputed\"\n :hint=\"hint\"\n :hint-id=\"hintId\"\n />\n</div>\n</template>\n","<script setup>\nimport {\n BsIconCircleCheck,\n BsIconCircleEllipsis,\n BsIconCircleExclamation,\n BsIconCirclePause,\n BsIconCirclePlay,\n BsIconCircleStop,\n BsIconCircleX,\n BsIconGraphPieEmpty,\n} from '@wwtdev/bsds-icons-vue3'\nimport { useSteps } from '@composables/steps'\n\n/**\n * @typedef {import('../Types.vue').Progress.Status} Status\n * @typedef {import('../Types.vue').Progress.Step} Step\n */\n\nconst props = defineProps({\n /** @type {Status} */\n currentStatus: {\n type: String,\n validator: (value) => {\n return [\n 'cancelled',\n 'complete',\n 'error',\n 'in-progress',\n 'not-started',\n 'ongoing',\n 'paused',\n 'warning'\n ].includes(value)\n }\n },\n currentStep: {\n type: Number,\n default: 0\n },\n /** @type {Array<Step|string>} */\n steps: {\n type: Array,\n required: true\n },\n})\n\nconst STATUSES_ICONS = {\n cancelled: BsIconCircleStop,\n complete: BsIconCircleCheck,\n error: BsIconCircleX,\n \"in-progress\": BsIconCircleEllipsis,\n \"not-started\": BsIconGraphPieEmpty,\n ongoing: BsIconCirclePlay,\n paused: BsIconCirclePause,\n warning: BsIconCircleExclamation,\n}\n\nconst { progressStep, progressText, getStatus } = useSteps(props)\n\nfunction getIcon(status, idx) {\n status = getStatus(status, idx)\n return STATUSES_ICONS[status] || BsIconGraphPieEmpty\n}\n\n</script>\n<template>\n<div\n :aria-valuemax=\"steps.length\"\n :aria-valuenow=\"progressStep\"\n :aria-valuetext=\"progressText\"\n class=\"bs-timeline\"\n data-component=\"bs-timeline\"\n role=\"progressbar\"\n>\n <div v-for=\"(step, idx) in steps\"\n class=\"bs-step-item\"\n :data-status=\"getStatus(step.status, idx)\"\n :key=\"step.id || step.label\"\n role=\"status\"\n >\n <Component :is=\"getIcon(step.status, idx)\"\n class=\"bs-step-icon\"\n role=\"presentation\"\n />\n <p>\n {{ step.label || step }}\n <span class=\"visually-hidden\">\n : {{ getStatus(step.status, idx) || 'not started' }}\n </span>\n </p>\n </div>\n</div>\n</template>\n\n","<script setup>\nimport { provide, inject } from 'vue'\nimport BsEnhancedTransition from '../transition/BsEnhancedTransition.vue'\nimport useTransitionHelper from '../../composables/transitionHelper'\n\nconst props = defineProps({\n shown: {\n type: Boolean,\n default: true\n },\n preloaded: {\n type: Boolean,\n default: false\n },\n toastId: {\n type: String,\n required: true\n },\n variant: {\n type: String,\n default: undefined,\n validator: (value) => {\n return ['warning', 'positive', 'negative'].includes(value)\n }\n },\n stacked: {\n type: Boolean,\n default: false\n },\n duration: {\n type: Number,\n default: 10000\n },\n /** @Deprecated - Use 'preloaded' instead. */\n enterControlled: {\n type: Boolean,\n default: false\n },\n /** @Deprecated - Use 'shown' instead. */\n enterTrigger: {\n type: Boolean,\n default: false\n },\n /** @Deprecated - Not used anymore. Handled via 'shown'. */\n leaveTrigger: {\n type: Boolean,\n default: false\n }\n})\n\nconst emit = defineEmits(['dismiss', 'after-enter', 'after-leave'])\n\ndefineOptions({ inheritAttrs: false })\n\nconst { transition } = useTransitionHelper(props)\n\nlet autoDismissTimer = null\n\n// Send down to slotted children\nprovide('variant', props.variant)\nprovide('handleDismiss', handleDismiss)\n\n// Sent down from BsToaster, or use props\nconst stacked = inject('stacked', props.stacked)\n\nfunction handleDismiss() {\n if (autoDismissTimer) {\n clearTimeout(autoDismissTimer)\n autoDismissTimer = null\n }\n emit('dismiss', props.toastId)\n}\n\nfunction handleEnterEnd() {\n if (props.duration > 0) {\n autoDismissTimer = setTimeout(() => {\n handleDismiss()\n }, props.duration)\n }\n\n emit('after-enter')\n}\n</script>\n\n<template>\n <BsEnhancedTransition\n name=\"bs-toast\"\n :shown=\"transition\"\n :preloaded=\"preloaded\"\n @after-enter=\"handleEnterEnd\"\n @after-leave=\"emit('after-leave')\"\n >\n <div\n class=\"bs-toast\"\n data-component=\"bs-toast\"\n :data-variant=\"variant\"\n :data-shown=\"transition\"\n :data-stacked=\"stacked || undefined\"\n role=\"alert\"\n v-bind=\"$attrs\"\n >\n <slot />\n </div>\n </BsEnhancedTransition>\n</template>\n","<script setup>\n import { ref, useSlots, onMounted, inject } from 'vue'\n import BsButton from '../button/BsButton.vue'\n\n // Provided from BsToast\n const handleDismiss = inject('handleDismiss', () => {})\n\n function isStacked() {\n return useSlots().default?.().length > 2 || undefined\n }\n</script>\n\n<template>\n <div\n class=\"bs-toast-actions\"\n data-component=\"bs-toast-actions\"\n :data-stacked=\"isStacked()\"\n >\n <slot>\n <BsButton\n size=\"sm\"\n text-btn\n @click=\"handleDismiss\"\n >\n Dismiss\n </BsButton>\n </slot>\n </div>\n</template>\n","<template>\n <div class=\"bs-toast-body\" data-component=\"bs-toast-body\">\n <slot></slot>\n </div>\n</template>\n","<script setup>\n import { inject, computed } from 'vue'\n import {\n BsIconWarning,\n BsIconThumbsUpStroke,\n BsIconCircleExclamation\n } from '@wwtdev/bsds-icons-vue3'\n\n // Provided from BsToast\n const variant = inject('variant', undefined)\n\n const icon = computed(() => {\n switch(variant) {\n case 'warning':\n return BsIconWarning\n case 'positive':\n return BsIconThumbsUpStroke\n case 'negative':\n return BsIconWarning\n default:\n return BsIconCircleExclamation\n }\n })\n</script>\n\n<template>\n <div class=\"bs-toast-header\" data-component=\"bs-toast-header\" :data-variant=\"variant\">\n <component :is=\"icon\" class=\"bs-toast-header-icon\" />\n <h5><slot/></h5>\n </div>\n</template>\n","<script setup>\n import { provide } from 'vue'\n\n // Send down to slotted BsToast components\n provide('stacked', true)\n</script>\n\n<template>\n <div class=\"bs-toaster\" data-component=\"bs-toaster\">\n <slot />\n </div>\n</template>\n","<script setup>\nimport { computed, ref } from 'vue'\nimport useKeydown from '../../composables/keydown'\n\n// PROPS\nconst props = defineProps({\n tooltipId: {\n type: String,\n required: true\n },\n content: {\n type: String,\n default: ''\n },\n position: {\n type: String,\n default: 'top',\n validator: (value) => {\n return [\n 'top',\n 'top-left',\n 'top-right',\n 'right',\n 'bottom',\n 'bottom-left',\n 'bottom-right',\n 'left'\n ].includes(value)\n }\n }\n})\n\n// STATE\nconst isHoverOrFocused = ref(false)\nconst isEscaped = ref(false)\n\nconst getTooltipTextClass = computed(() => {\n let cssClass = 'bs-tooltip-text'\n if (isEscaped.value) {\n // Different positions have different translateX/Y style\n if (props.position === 'top' || props.position === 'bottom') {\n cssClass += ' escaped-x'\n } else if (props.position === 'left' || props.position === 'right') {\n cssClass += ' escaped-y'\n } else {\n cssClass += ' escaped'\n }\n }\n return cssClass;\n})\n\n// Handle escape key closing the tooltip\nuseKeydown(['Escape'], () => {\n if (isHoverOrFocused.value) {\n isHoverOrFocused.value = false\n isEscaped.value = true\n }\n})\n\nfunction handleEnterOrFocus() {\n isHoverOrFocused.value = true\n}\n\nfunction handleLeaveOrFocusOut() {\n isHoverOrFocused.value = false\n // Also reset escaped so it shows again on hover/focus\n isEscaped.value = false\n}\n</script>\n\n<template>\n<div\n class=\"bs-tooltip\"\n :data-position=\"position\"\n data-component=\"bs-tooltip\"\n @mouseenter=\"handleEnterOrFocus\"\n @focusin=\"handleEnterOrFocus\"\n @mouseleave=\"handleLeaveOrFocusOut\"\n @focusout=\"handleLeaveOrFocusOut\"\n>\n <slot />\n <div\n :class=\"getTooltipTextClass\"\n :id=\"tooltipId\"\n role=\"tooltip\"\n >\n <slot name=\"content\">\n {{ content }}\n </slot>\n </div>\n</div>\n</template>\n","/* This file is used to share selectors with automated tests.\n* commented out selectors are ones we may or may not want to add in the future\n*/\nconst bsSelectors = {\n accordion:'[data-component=bs-accordion]',\n badge:'[data-component=bs-badge]',\n banner:'[data-component=bs-banner]',\n button:'[data-component=bs-button]',\n calendar:'[data-component=bs-calendar]',\n chartBar:'[data-component=bs-chart-bar]',\n chartLine:'[data-component=bs-chart-line]',\n chartTable:'[data-component=bs-chart-table]',\n checkbox:'[data-component=bs-checkbox]',\n circleButton:'[data-component=bs-circle-button]',\n dropdownComboboxField:'[data-component=bs-dropdown-combobox-field]',\n dropdownMultiselect:'[data-component=bs-dropdown-multiselect]',\n dropdownOption:'[data-component=bs-dropdown-option]',\n dropdownOptionList:'[data-component=bs-dropdown-option-list]',\n emptyState:'[data-component=bs-empty-state]',\n fieldDetails:'[data-component=bs-field-details]',\n filterButton:'[data-component=bs-filter-button]',\n flyout:'[data-component=bs-flyout]',\n input:'[data-component=bs-input]',\n inputAddon:'[data-component=bs-input-addon]',\n inputField:'[data-component=bs-input-field]',\n inputPhone:'[data-component=bs-input-phone]',\n inputSearch:'[data-component=bs-input-search]',\n label:'[data-component=bs-label]',\n modal:'[data-component=bs-modal]',\n pagination: {\n component: '[data-component=bs-pagination]',\n pageNumbers: '.bs-pagination-page-numbers',\n first: '[aria-label=\"First Page\"]',\n previous: '[aria-label=\"Previous Page\"]',\n next: '[aria-label=\"Next Page\"]',\n last: '[aria-label=\"Last Page\"]',\n },\n pill:'[data-component=bs-pill]',\n profile:'[data-component=bs-profile]',\n profileDetails:'[data-component=bs-profile-details]',\n profileImg:'[data-component=bs-profile-img]',\n progressBar:'[data-component=bs-progress-bar]',\n radio:'[data-component=bs-radio]',\n select:'[data-component=bs-select]',\n selectField:'[data-component=bs-select-field]',\n spinner:'[data-component=bs-spinner]',\n switch:'[data-component=bs-switch]',\n tab:'[data-component=bs-tab]',\n tabList:'[data-component=bs-tab-list]',\n tabPanel:'[data-component=bs-tab-panel]',\n textarea:'[data-component=bs-textarea]',\n textareaField:'[data-component=bs-textarea-field]',\n timePickerField:'[data-component=bs-time-picker-field]',\n timeline:'[data-component=bs-timeline]',\n toast:'[data-component=bs-toast]',\n toastActions:'[data-component=bs-toast-actions]',\n toastBody:'[data-component=bs-toast-body]',\n toastHeader:'[data-component=bs-toast-header]',\n toaster:'[data-component=bs-toaster]',\n tooltip:'[data-component=bs-tooltip]',\n}\n\n\nexport default {\n\tbsSelectors\n};"],"names":["TAG_BY_PROP","useButtonOrLink","props","attrs","defaultTag","rootTag","getTag","additionalAttrs","computed","isButton","attrsRet","attrsToBind","toBind","hrefUrl","foundProp","key","getProp","ref","useClickAway","elRefs","onClickAway","handler","ev","elRef","_a","onMounted","onUnmounted","useClientRouter","propUrl","hrefIsRelative","_b","routeTo","onLinkClick","e","kebabToPascal","kebabText","word","useDynamicIcon","iconProps","iconKey","importIcon","iconName","importVar","defineAsyncComponent","importedIcon","icon","shallowRef","watch","newProp","newRefVal","useGenIdAttrs","quantity","ids","i","useId","useKeydown","keys","onKeydown","k","useMutationObserver","targetRef","callback","options","observer","useTransitionHelper","transition","value","__props","emit","__emit","containerRef","isOpen","iconTag","containerId","contentId","headingId","openItemMatch","showContent","handleToggled","$attrs","useAttrs","$slots","useSlots","accessibleLabelAttr","isTextBtn","hoverDirection","iconComputed","defaultCaret","textLeft","textRight","variantPrefixed","buttonVariant","hostRef","countFmt","labelFmt","base","ct","sfx","isDismissed","handleDismiss","hintMsg","aria","handleInput","val","debounce","func","wait","immediate","timeout","context","args","hiddenStart","hiddenEnd","dispatchRangeChange","el","handleRangeChange","start","end","handleRangeChangeDebounced","handleRangeInput","startListener","endListener","useCalendarWorkaround","isNavBtn","isSpaceOrEnter","keydownWorkaround","onBeforeUnmount","useMatchMedia","query","handlerFn","watchList","mediaQuery","onBeforeMount","boolAttrs","selectAttrs","textareaAttrs","textlikeAttrs","filterAttrs","filter","filtered","remaining","MQ","calendar","columns","container","inputIdGen","hintId","steps","toChild","toRoot","disabledDatesComputed","getBlackoutDates","inputIdAttr","modifiers","showFieldDetails","stepRef","variantRef","setNavButtonLabels","visible","nextTick","formatInput","inputValue","exclusiveDates","toDisable","date","handleRangeBlur","prev","next","mounted","formatTimeVal","timeVal","timeStr","dateStr","altLayout","getBasicRows","datasets","ds","rowLabel","dataCells","it","xTickToYValue","acc","d","tickPtLabel","getAltRows","consolidatedIndices","toAdd","uniqueIndices","a","b","idx","row","rowData","cell","dataPt","tableRows","table","tableReady","TICK_SIZE","TICK_SIZE_LG","useChart","type","canvasRef","isDesktop","legendListRef","BREAKPOINT_QUERY","MOBILE_TICK_SIZES","DESKTOP_TICK_SIZES","chart","chartConfig","createChartConfig","chartSpecificMethod","BsChartConfigBuilder","getHtmlLegendPlugin","Filler","handleLegendItemToggle","li","labelIndex","datasetIndex","refocusLegendItem","sel","item","registerChart","chartElements","Chart","updateConfigOpts","updateConfigData","err","isDesktopMatched","_merge","boxSpan","text","textContainer","getBackgroundColor","initialDivider","DEFAULT_COLORS","color","divider","getBorderColor","getCommonOptionsPermissive","chartProps","getCommonOptionsStrict","getCartesianScaleOptions","propsPlus","dataIdxLabels","showXGrid","showYGrid","stacked","xAxisType","xLabel","yLabel","yMax","yMin","customOptions","tickSize","scaleOptions","BsChartConfig","data","plugins","showTooltips","BsChartBarConfig","dataset","scaleOpts","tickFontOpts","updatedOpts","BsChartLineConfig","optionsArg","title","BarController","BarElement","CategoryScale","LinearScale","Legend","TimeScale","Tooltip","attrFilter","inputEl","isChecked","isModelValueChecked","isIndeterminate","isVModelArray","setIndeterminate","doVModelSimple","checked","doVModelComplex","newValue","onChange","internalContainerRef","__expose","useBreakout","createBreakout","id","position","breakoutId","breakoutStub","breakoutMounted","isPreExisting","dropdownContainerRef","dropdownRef","dropdownEnter","dropdownAfterEnter","anchorEl","containerEl","widthActual","provide","setDropdownProperty","property","setPosition","containerRect","anchorRect","dropdownRect","positionTopBottom","positionLeftRight","bottom","top","left","offset","right","setWidth","handleEnter","handleAfterEnter","handleAfterLeave","shownActual","positionActual","anchorIdActual","inputRef","toggleId","btnProperties","showCloseButton","handleBtnClick","showBadge","optionIdFromVal","listId","optionVal","valueIdKey","suffix","optionRef","optionsId","inject","handleOptionSelect","registerOption","idKey","handleOptionClick","isMounted","showImage","iconCache","cacheIconComponents","option","getIcon","getVariant","variant","useAltText","profileName","label","showClear","optionsRef","activeDescendantId","activeIndex","selectedIndex","optionEls","hasOverflow","registeredOptionsById","dropdownShown","refreshOptions","handleKeyboardSelect","handleKeyDown","typeToFocusKeys","typeToFocusData","typeToFocus","handleShownChange","entered","optionsLen","newVal","scrollOptionsListIntoView","scrollCurrentActiveIntoView","selectedValueActual","setCurrentActive","removeCurrentActive","handleOptionsFocus","handleShown","handleNotShown","traverse","direction","newIndex","updateCurrentActive","ttfState","matchIdx","activeIdx","withFocus","optlist","selectedLocalOptions","unselectedLocalOptions","showDivider","hasSomeOptions","refocusPending","sortSelectedUnselected","focusFirstOption","refocusOnOption","updatedSelectedOptions","byId","opt","valuesOrIds","selected","unselected","newOption","inputIdMiddle","inputId","preorderPayload","unsortedPayload","values","sorted","f","payload","toggleEl","autoToggleId","autoOptionsId","isShown","filterTerm","badgeCount","OptionList","BsDropdownMultiselect","BsDropdownOptionList","optionsIdActual","toggleIdActual","filteredOptions","optionsComputed","getToggleEl","checkShouldRestoreFocus","activeEl","closeAndRestoreFocus","handleClose","handleEnterStart","handleUncheckOption","newOptionsValue","handleCheckOption","handleSingleSelect","handleSearchClear","handleSearchUpdate","inputWrapperId","open","preventFocusOpen","inputComboboxRef","getInputEl","handleChange","handleClear","handleDropdownClose","handleInputMousedown","handleInputMouseup","handleFocus","handleSelect","modelValueActual","flyoutRef","closeFlyout","hasShownChild","svgWrapperRef","viewBox","stops","uniqueId","hintDeprecated","SYMBOLS","CountryUtils","countryCode","regionCode","getSupportedCallingCodes","c","getRegionCodeForCountryCode","flag","mapName","libKey","country","VALID_OTHER_KEYS","countryCodesToggle","countryCodes","currentCountry","countryToggleId","countryCodesId","phoneNumber","phoneNumberError","phoneNumberHasError","showCountryCodes","showValidationResult","computedPhoneNumber","countryToggleLabel","errorMsgComputed","hasError","showDetails","showErrorState","validate","clearPhoneNumberIfReset","init","oldVal","handleCountryCodeClose","handleCountryCodeInput","selectedVal","updateCurrentCountry","handlePhoneBlur","handlePhoneInput","ignoreInvalidChars","initParse","parsedNum","parsePhoneNumber","code","pncc","optionsShown","optionSelected","generatedId","generatedHintId","prevOptions","showDropdownIfValue","typeaheadIdActual","inputContainerId","optionsValueActual","modifiedOptions","newOptions","filterValue","filterFunc","filterOptions","highlightOptions","labelHtml","flags","regex","selectedOption","handleCheck","handleUncheck","setBodyScroll","slots","titleId","isVisible","modalRef","closeModal","onlyHaveCloseButton","haveBothTitleAndCloseButton","valueState","resultsNumbers","actualPageCount","computedVariant","handleFirstNav","handlePrevNav","handleNextNav","handleLastNav","pages","pageTextDisplay","groupTextDisplay","first","last","increment","actionIconTag","metaIconTag","handleActionToggle","useSteps","progressStep","step","progressText","getStatus","status","selectIdGen","optionsIdGen","selectIdComp","optionsIdComp","buttonText","placeholderShown","hostEl","isActive","panelIdComputed","handleKeydown","handleTabSelection","DEFAULT_TOGGLE_WIDTH","ELLIPSIS_WIDTH","TAB_GAP","adaptedToWidth","dropdownMounted","hiddenTabs","showDropdown","showDropdownToggle","accumulatedWidths","activeLineInitialized","allTabs","dropdownToggle","navigableTabs","resizeObserver","totalWidth","tabListAutoId","dropdownId","adaptToWidthTimeoutId","activeTabIdx","t","activeTabIsHidden","dropdownOptionsId","dropdownToggleId","dropdownToggleText","dropdownToggleWidth","adaptToWidth","showToggle","tab","thresholdWidth","thresholdReached","tabsToHide","setNavigableTabs","moveActiveLine","adaptToWidthCleanup","cleanup","observerCleanup","fireTabChange","tabId","getTabWidth","tabIdx","actualWidth","_c","handleActiveTabIdChange","handleDropdownToggleClick","handleDropdownOptionSelect","handleTabClick","event","handleTabNav","handleTabPrevious","handleTabNext","nextIdx","prevIdx","prevOffset","max","duration","offsetPx","scaleNum","_d","resizeObserverSetup","cb","setAllTabs","setAccumlulatedWidths","tabWidth","tabs","panelId","TableCol","_sfc_main","TableHeaderProvider","TableBodyProvider","TableFooterProvider","providerByKind","rowCount","incrementRowCount","decrementRowCount","FrozenCols","rowgroup","HeadCell","h","Cell","_sfc_render","_ctx","_cache","_openBlock","_createElementBlock","_hoisted_1","iconsByOrder","BsIconCaretSortUp","BsIconCaretSortDown","onToggle","resizerExtraHoverTarget","resizerEl","useTemplateRef","xStart","xPos","animationFrame","target","isResizerVisible","isResizing","showHideResizer","hideResizer","setTarget","isOnLeftBorder","isOnRightBorder","getTargetsPreviousSibling","showResizer","prevSibling","prevCell","getResizeMin","width","moveResizerToXpos","onPointerDown","scrollWrap","onPointerMove","onPointerUp","isMinColWidth","xDiff","emitResize","onDoubleClick","tableSlots","cols","resizedColWidthsById","colWidths","col","resizeId","getResizeId","getInitialColWidth","cellPaddingCssVar","rowHoverCssVar","canResizeCols","wrapper","content","css","style","tableScrollWrapper","headerRowgroup","rows","TableRowGroup","headerRowgroupDefault","cells","headCell","headerRowgroupSlot","slotContent","readonly","slotRows","bodyRowgroup","bodyRowgroupDefault","rowIndex","bodyCell","bodyRowgroupSlot","footerRowgroup","footerRowgroupSlot","TableRow","cellFn","slotProps","findNodesByType","node","isDefaultRowPlaceholder","sortKey","getSortKey","truncateCss","getResizeAttrs","newKids","SortToggle","cloneVNode","getSortToggleProps","sortToggle","colMin","colMax","resizeKey","isColPropTruthy","sortOrder","getRowKeyProp","isTruncate","frozenCells","side","theCells","tableColResizer","TableColResizer","onResizeCol","colsToUpdate","updates","obj","prop","nodes","types","processFrozenTableCols","place","processTableCols","format","frozenCols","processDefaultSlot","TableHeader","TableFooter","nested","header","footer","other","charCount","checkTimePattern","uFmt","uFmtNoColon","amPm","amPmNoColon","parseIntTen","parseRaw","STRIP_PATTERN","hours","minutes","parts","pm","fmtTimeValToDisplay","hoursInt","minutesInt","ampm","fmtInputToTimeVal","EXCLUDED","OVER","SKIP","STOP","UNDER","displayValue","timeError","timeHasError","createOptions","stopAll","getTimeString","skipOrStop","getSkipOrStop","checkConstraints","hour","minute","handleComboboxChange","formattedValue","updateWithValidation","setOptions","timePicker","STATUSES_ICONS","BsIconCircleStop","BsIconCircleCheck","BsIconCircleX","BsIconCircleEllipsis","BsIconGraphPieEmpty","BsIconCirclePlay","BsIconCirclePause","BsIconCircleExclamation","autoDismissTimer","handleEnterEnd","isStacked","BsIconWarning","BsIconThumbsUpStroke","isHoverOrFocused","isEscaped","getTooltipTextClass","cssClass","handleEnterOrFocus","handleLeaveOrFocusOut","bsSelectors","BsSelectors"],"mappings":"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"}